From 7f479c20860edadab9ad40dedfb35c58952010a1 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Tue, 22 Dec 2020 09:41:27 +0300 Subject: [PATCH 001/463] Fix portal StackOverflow --- .../java/ru/betterend/blocks/EndPortalBlock.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index 27672179..d4899cc2 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -135,6 +135,12 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable } private BlockPos.Mutable findCenter(World world, BlockPos.Mutable pos, Direction.Axis axis) { + return this.findCenter(world, pos, axis, 1); + } + + private BlockPos.Mutable findCenter(World world, BlockPos.Mutable pos, Direction.Axis axis, int step) { + if (step > 21) return pos; + BlockState right, left; Direction rightDir, leftDir; if (axis == Direction.Axis.X) { @@ -150,13 +156,13 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable } BlockState down = world.getBlockState(pos.down()); if (down.isOf(this)) { - return findCenter(world, pos.move(Direction.DOWN), axis); + return findCenter(world, pos.move(Direction.DOWN), axis, ++step); } else if (right.isOf(this) && left.isOf(this)) { return pos; } else if (right.isOf(this)) { - return findCenter(world, pos.move(rightDir), axis); + return findCenter(world, pos.move(rightDir), axis, ++step); } else if (left.isOf(this)) { - return findCenter(world, pos.move(leftDir), axis); + return findCenter(world, pos.move(leftDir), axis, ++step); } return pos; } From 113aab6d24d70e3f8d4a9be145d636cdb49b6cbf Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 23 Dec 2020 13:10:11 +0300 Subject: [PATCH 002/463] Sponge drop fix --- .../blocks/BlockMengerSpongeWet.java | 2 +- .../blocks/complex/StoneMaterial.java | 2 ++ .../blocks/complex/WoodenMaterial.java | 2 ++ .../ru/betterend/recipe/CraftingRecipes.java | 13 +++++++++++ .../ru/betterend/registry/EndFeatures.java | 2 +- .../java/ru/betterend/registry/EndTags.java | 23 +++++++++++++++---- .../features/trees/UmbrellaTreeFeature.java | 15 ++++++------ 7 files changed, 46 insertions(+), 13 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/BlockMengerSpongeWet.java b/src/main/java/ru/betterend/blocks/BlockMengerSpongeWet.java index 9f81c688..c9e32571 100644 --- a/src/main/java/ru/betterend/blocks/BlockMengerSpongeWet.java +++ b/src/main/java/ru/betterend/blocks/BlockMengerSpongeWet.java @@ -81,7 +81,7 @@ public class BlockMengerSpongeWet extends BlockBaseNotFull implements IRenderTyp @Override public void onBreak(World world, BlockPos pos, BlockState state, PlayerEntity player) { - super.onBreak(world, pos, state, player); + world.breakBlock(pos, !player.isCreative()); BlocksHelper.setWithUpdate(world, pos, Blocks.AIR); } diff --git a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java index 77382814..b3d05665 100644 --- a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java @@ -19,6 +19,7 @@ import ru.betterend.recipe.CraftingRecipes; import ru.betterend.recipe.builders.GridRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; +import ru.betterend.registry.EndTags; import ru.betterend.util.TagHelper; public class StoneMaterial { @@ -91,5 +92,6 @@ public class StoneMaterial { TagHelper.addTag(BlockTags.WALLS, wall, brick_wall); TagHelper.addTag(BlockTags.SLABS, slab, brick_slab); TagHelper.addTags(pressure_plate, BlockTags.PRESSURE_PLATES, BlockTags.STONE_PRESSURE_PLATES); + TagHelper.addTag(EndTags.END_STONES, stone); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java index 3d9e8a8c..520b6b1b 100644 --- a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java @@ -125,6 +125,7 @@ public class WoodenMaterial { TagHelper.addTags(slab, ItemTags.WOODEN_SLABS, ItemTags.SLABS); TagHelper.addTags(stairs, ItemTags.WOODEN_STAIRS, ItemTags.STAIRS); TagHelper.addTags(trapdoor, ItemTags.WOODEN_TRAPDOORS, ItemTags.TRAPDOORS); + TagHelper.addTag(EndTags.ITEM_CHEST, chest); // Block Tags // TagHelper.addTag(BlockTags.PLANKS, planks); @@ -139,6 +140,7 @@ public class WoodenMaterial { TagHelper.addTags(stairs, BlockTags.WOODEN_STAIRS, BlockTags.STAIRS); TagHelper.addTags(trapdoor, BlockTags.WOODEN_TRAPDOORS, BlockTags.TRAPDOORS); TagHelper.addTag(EndTags.BOOKSHELVES, shelf); + TagHelper.addTag(EndTags.BLOCK_CHEST, chest); logBlockTag = EndTags.makeBlockTag(name + "_logs"); logItemTag = EndTags.makeItemTag(name + "_logs"); diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index 72e37c7d..b947949d 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -12,6 +12,7 @@ import ru.betterend.item.GuideBook; import ru.betterend.recipe.builders.GridRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; +import ru.betterend.registry.EndTags; public class CraftingRecipes { @@ -166,6 +167,18 @@ public class CraftingRecipes { .addMaterial('S', EndItems.ETERNAL_CRYSTAL) .addMaterial('A', EndBlocks.AMBER_BLOCK) .build(); + + GridRecipe.make("hopper", Blocks.HOPPER) + .setShape("I I", "ICI", " I ") + .addMaterial('I', Items.IRON_INGOT) + .addMaterial('C', EndTags.ITEM_CHEST) + .build();; + + GridRecipe.make("shulker_box", Blocks.SHULKER_BOX) + .setShape("S", "C", "S") + .addMaterial('S', Items.SHULKER_SHELL) + .addMaterial('C', EndTags.ITEM_CHEST) + .build(); } private static void registerLantern(String name, Block lantern, Block slab) { diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index bf0fdfd2..f78e3fd9 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -56,7 +56,7 @@ public class EndFeatures { public static final EndFeature DRAGON_TREE = new EndFeature("dragon_tree", new DragonTreeFeature(), 3); public static final EndFeature TENANEA = new EndFeature("tenanea", new TenaneaFeature(), 3); public static final EndFeature HELIX_TREE = new EndFeature("helix_tree", new HelixTreeFeature(), 2); - public static final EndFeature UMBRELLA_TREE = new EndFeature("umbrella_tree", new UmbrellaTreeFeature(), 2); + public static final EndFeature UMBRELLA_TREE = new EndFeature("umbrella_tree", new UmbrellaTreeFeature(), 4); // Bushes // public static final EndFeature PYTHADENDRON_BUSH = new EndFeature("pythadendron_bush", new BushFeature(EndBlocks.PYTHADENDRON_LEAVES, EndBlocks.PYTHADENDRON.bark), 4); diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index 0e954611..0a3e3d00 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -31,12 +31,15 @@ import ru.betterend.util.TagHelper; public class EndTags { // Block Tags - public static final Tag.Identified END_GROUND = makeBlockTag("end_ground"); + public static final Tag.Identified BOOKSHELVES = makeCommonBlockTag("bookshelves"); public static final Tag.Identified GEN_TERRAIN = makeBlockTag("gen_terrain"); - public static final Tag.Identified BOOKSHELVES = makeCommonTag("bookshelves"); + public static final Tag.Identified END_GROUND = makeBlockTag("end_ground"); public static final Tag.Identified PEDESTALS = makeBlockTag("pedestal"); + public static final Tag.Identified BLOCK_CHEST = makeCommonBlockTag("chest"); + public static final Tag.Identified END_STONES = makeCommonBlockTag("end_stones"); // Item Tags + public static final Tag.Identified ITEM_CHEST = makeCommonItemTag("chest"); public final static Tag HAMMERS = registerFabricItemTag("hammers"); public static Tag.Identified makeBlockTag(String name) { @@ -51,12 +54,18 @@ public class EndTags { return tag == null ? (Identified) TagRegistry.item(id) : (Identified) tag; } - public static Tag.Identified makeCommonTag(String name) { + public static Tag.Identified makeCommonBlockTag(String name) { Identifier id = new Identifier("c", name); Tag tag = BlockTags.getTagGroup().getTag(id); return tag == null ? (Identified) TagRegistry.block(id) : (Identified) tag; } + public static Tag.Identified makeCommonItemTag(String name) { + Identifier id = new Identifier("c", name); + Tag tag = ItemTags.getTagGroup().getTag(id); + return tag == null ? (Identified) TagRegistry.item(id) : (Identified) tag; + } + public static void register() { addSurfaceBlock(Blocks.END_STONE); addSurfaceBlock(EndBlocks.ENDSTONE_DUST); @@ -106,9 +115,15 @@ public class EndTags { biomeRegistry.forEach((biome) -> { if (biome.getCategory() == Category.THEEND) { SurfaceConfig config = biome.getGenerationSettings().getSurfaceConfig(); - TagHelper.addTag(GEN_TERRAIN, config.getTopMaterial().getBlock(), config.getUnderMaterial().getBlock()); + Block under = config.getUnderMaterial().getBlock(); + Block surface = config.getTopMaterial().getBlock(); + TagHelper.addTag(GEN_TERRAIN, under, surface); + TagHelper.addTag(END_GROUND, surface); } }); + END_STONES.values().forEach((block) -> { + addSurfaceBlock(block); + }); } public static boolean validGenBlock(BlockState block) { diff --git a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java index 86b28b28..f50e3a78 100644 --- a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java @@ -10,7 +10,6 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Material; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -31,6 +30,7 @@ import ru.betterend.world.features.DefaultFeature; public class UmbrellaTreeFeature extends DefaultFeature { private static final Function REPLACE; + private static final Function IGNORE; private static final Function POST; private static final List SPLINE; private static final List ROOT; @@ -48,9 +48,6 @@ public class UmbrellaTreeFeature extends DefaultFeature { float var = MHelper.PI2 / (float) (count * 3); float start = MHelper.randRange(0, MHelper.PI2, random); SDF sdf = null; - int x1 = ((pos.getX() >> 4) << 4) - 16; - int z1 = ((pos.getZ() >> 4) << 4) - 16; - Box limits = new Box(x1, pos.getY() - 5, z1, x1 + 47, pos.getY() + size * 2, z1 + 47); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2 + MHelper.randRange(0, var, random) + start; List spline = SplineHelper.copySpline(SPLINE); @@ -61,7 +58,7 @@ public class UmbrellaTreeFeature extends DefaultFeature { SplineHelper.offsetParts(spline, random, 0.5F, 0, 0.5F); if (SplineHelper.canGenerate(spline, pos, world, REPLACE)) { - SDF branch = SplineHelper.buildSDF(spline, 1.3F, 0.8F, (bpos) -> { + SDF branch = SplineHelper.buildSDF(spline, 1.2F, 0.8F, (bpos) -> { return wood; }); @@ -83,8 +80,8 @@ public class UmbrellaTreeFeature extends DefaultFeature { return false; } - makeRoots(world, pos.add(0, 3, 0), size * 0.4F + 5, random, wood); - sdf.setReplaceFunction(REPLACE).setPostProcess(POST).fillArea(world, pos, limits); + sdf.setReplaceFunction(REPLACE).setPostProcess(POST).fillRecursiveIgnore(world, pos, IGNORE); + makeRoots(world, pos.add(0, 2, 0), size * 0.3F + 3, random, wood); return true; } @@ -150,6 +147,10 @@ public class UmbrellaTreeFeature extends DefaultFeature { return state.getMaterial().isReplaceable(); }; + IGNORE = (state) -> { + return EndBlocks.UMBRELLA_TREE.isTreeLog(state); + }; + POST = (info) -> { if (EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateUp()) && EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateDown())) { return EndBlocks.UMBRELLA_TREE.log.getDefaultState(); From 5921317d3eee0fe799b8e21a30f0cf757d66791f Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 24 Dec 2020 12:40:13 +0300 Subject: [PATCH 003/463] Umbrella tree update --- .../blocks/BlockHelixTreeLeaves.java | 7 ++- .../blocks/BlockUmbrellaTreeMembrane.java | 45 ++++++++++++- src/main/java/ru/betterend/util/MHelper.java | 4 ++ .../features/trees/UmbrellaTreeFeature.java | 59 ++++++++++++++---- .../blockstates/umbrella_tree_membrane.json | 12 ++++ .../block/umbrella_tree_membrane_0.json | 6 ++ .../block/umbrella_tree_membrane_1.json | 6 ++ .../block/umbrella_tree_membrane_2.json | 6 ++ .../block/umbrella_tree_membrane_3.json | 6 ++ .../block/umbrella_tree_membrane_4.json | 6 ++ .../block/umbrella_tree_membrane_5.json | 6 ++ .../block/umbrella_tree_membrane_6.json | 6 ++ .../block/umbrella_tree_membrane_7.json | 6 ++ .../block/umbrella_tree_membrane_0.png | Bin 0 -> 1843 bytes .../block/umbrella_tree_membrane_1.png | Bin 0 -> 390 bytes .../block/umbrella_tree_membrane_2.png | Bin 0 -> 382 bytes .../block/umbrella_tree_membrane_3.png | Bin 0 -> 396 bytes .../block/umbrella_tree_membrane_4.png | Bin 0 -> 386 bytes .../block/umbrella_tree_membrane_5.png | Bin 0 -> 386 bytes .../block/umbrella_tree_membrane_6.png | Bin 0 -> 393 bytes .../block/umbrella_tree_membrane_7.png | Bin 0 -> 391 bytes 21 files changed, 159 insertions(+), 16 deletions(-) create mode 100644 src/main/resources/assets/betterend/blockstates/umbrella_tree_membrane.json create mode 100644 src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_0.json create mode 100644 src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_1.json create mode 100644 src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_2.json create mode 100644 src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_3.json create mode 100644 src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_4.json create mode 100644 src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_5.json create mode 100644 src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_6.json create mode 100644 src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_7.json create mode 100644 src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_0.png create mode 100644 src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_1.png create mode 100644 src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_2.png create mode 100644 src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_3.png create mode 100644 src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_4.png create mode 100644 src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_5.png create mode 100644 src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_6.png create mode 100644 src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_7.png diff --git a/src/main/java/ru/betterend/blocks/BlockHelixTreeLeaves.java b/src/main/java/ru/betterend/blocks/BlockHelixTreeLeaves.java index eca5f605..7555ae70 100644 --- a/src/main/java/ru/betterend/blocks/BlockHelixTreeLeaves.java +++ b/src/main/java/ru/betterend/blocks/BlockHelixTreeLeaves.java @@ -25,11 +25,13 @@ import net.minecraft.state.property.IntProperty; import net.minecraft.util.math.MathHelper; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.interfaces.IColorProvider; +import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; public class BlockHelixTreeLeaves extends BlockBase implements IColorProvider { public static final IntProperty COLOR = IntProperty.of("color", 0, 7); + private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); public BlockHelixTreeLeaves() { super(FabricBlockSettings.of(Material.LEAVES) @@ -61,7 +63,10 @@ public class BlockHelixTreeLeaves extends BlockBase implements IColorProvider { @Override public BlockState getPlacementState(ItemPlacementContext ctx) { - return this.getDefaultState().with(COLOR, MHelper.randRange(3, 5, ctx.getWorld().getRandom())); + double px = ctx.getBlockPos().getX() * 0.1; + double py = ctx.getBlockPos().getY() * 0.1; + double pz = ctx.getBlockPos().getZ() * 0.1; + return this.getDefaultState().with(COLOR, MHelper.floor(NOISE.eval(px, py, pz) * 3.5 + 4)); } private int getGreen(int color) { diff --git a/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeMembrane.java b/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeMembrane.java index 97772b79..1f4a4a98 100644 --- a/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeMembrane.java +++ b/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeMembrane.java @@ -5,25 +5,51 @@ import java.util.List; 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.block.AbstractGlassBlock; +import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.item.ItemPlacementContext; import net.minecraft.item.ItemStack; import net.minecraft.loot.context.LootContext; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.IntProperty; import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; import net.minecraft.util.registry.Registry; +import net.minecraft.world.BlockView; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -import ru.betterend.registry.EndItems; +import ru.betterend.util.MHelper; public class BlockUmbrellaTreeMembrane extends AbstractGlassBlock implements IRenderTypeable, BlockPatterned { + public static final IntProperty COLOR = IntProperty.of("color", 0, 7); + private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); + public BlockUmbrellaTreeMembrane() { super(FabricBlockSettings.copyOf(Blocks.SLIME_BLOCK)); } + @Override + public BlockState getPlacementState(ItemPlacementContext ctx) { + double px = ctx.getBlockPos().getX() * 0.1; + double py = ctx.getBlockPos().getY() * 0.1; + double pz = ctx.getBlockPos().getZ() * 0.1; + return this.getDefaultState().with(COLOR, MHelper.floor(NOISE.eval(px, py, pz) * 3.5 + 4)); + } + + @Override + protected void appendProperties(StateManager.Builder stateManager) { + stateManager.add(COLOR); + } + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.TRANSLUCENT; @@ -31,7 +57,7 @@ public class BlockUmbrellaTreeMembrane extends AbstractGlassBlock implements IRe @Override public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - return Lists.newArrayList(new ItemStack(EndItems.CRYSTAL_SHARDS)); + return Lists.newArrayList(new ItemStack(this)); } @Override @@ -50,4 +76,19 @@ public class BlockUmbrellaTreeMembrane extends AbstractGlassBlock implements IRe public Identifier statePatternId() { return Patterns.STATE_SIMPLE; } + + @Override + public boolean isTranslucent(BlockState state, BlockView world, BlockPos pos) { + return state.get(COLOR) > 0; + } + + @Environment(EnvType.CLIENT) + public boolean isSideInvisible(BlockState state, BlockState stateFrom, Direction direction) { + if (state.get(COLOR) > 0) { + return super.isSideInvisible(state, stateFrom, direction); + } + else { + return false; + } + } } diff --git a/src/main/java/ru/betterend/util/MHelper.java b/src/main/java/ru/betterend/util/MHelper.java index 3b6aa1a7..f7f89835 100644 --- a/src/main/java/ru/betterend/util/MHelper.java +++ b/src/main/java/ru/betterend/util/MHelper.java @@ -101,6 +101,10 @@ public class MHelper { return (float) Math.sqrt(lengthSqr(x, y, z)); } + public static double length(double x, double y, double z) { + return Math.sqrt(lengthSqr(x, y, z)); + } + public static float lengthSqr(float x, float y) { return x * x + y * y; } diff --git a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java index f50e3a78..5bcc87d7 100644 --- a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java @@ -10,14 +10,15 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Material; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.blocks.BlockUmbrellaTreeMembrane; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.MHelper; import ru.betterend.util.SplineHelper; -import ru.betterend.util.sdf.PosInfo; import ru.betterend.util.sdf.SDF; import ru.betterend.util.sdf.operator.SDFFlatWave; import ru.betterend.util.sdf.operator.SDFScale3D; @@ -31,7 +32,6 @@ import ru.betterend.world.features.DefaultFeature; public class UmbrellaTreeFeature extends DefaultFeature { private static final Function REPLACE; private static final Function IGNORE; - private static final Function POST; private static final List SPLINE; private static final List ROOT; @@ -40,14 +40,15 @@ public class UmbrellaTreeFeature extends DefaultFeature { if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; BlockState wood = EndBlocks.UMBRELLA_TREE.bark.getDefaultState(); - BlockState membrane = EndBlocks.UMBRELLA_TREE_MEMBRANE.getDefaultState(); - BlockState center = EndBlocks.UMBRELLA_TREE.planks.getDefaultState(); + BlockState membrane = EndBlocks.UMBRELLA_TREE_MEMBRANE.getDefaultState().with(BlockUmbrellaTreeMembrane.COLOR, 1); + BlockState center = EndBlocks.UMBRELLA_TREE_MEMBRANE.getDefaultState().with(BlockUmbrellaTreeMembrane.COLOR, 0); float size = MHelper.randRange(10, 20, random); int count = (int) (size * 0.15F); float var = MHelper.PI2 / (float) (count * 3); float start = MHelper.randRange(0, MHelper.PI2, random); SDF sdf = null; + List
centers = Lists.newArrayList(); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2 + MHelper.randRange(0, var, random) + start; List spline = SplineHelper.copySpline(SPLINE); @@ -73,6 +74,10 @@ public class UmbrellaTreeFeature extends DefaultFeature { float pz = MHelper.floor(vec.getZ()) + 0.5F; mem = new SDFTranslate().setTranslate(px, py, pz).setSource(mem); sdf = new SDFSmoothUnion().setRadius(2).setSourceA(sdf).setSourceB(mem); + centers.add(new Center(pos.getX() + (double) px, pos.getZ() + (double) pz, radius)); + + vec = spline.get(0); + makeRoots(world, pos.add(vec.getX(), vec.getY() + 2, vec.getZ()), size * 0.3F + 3, random, wood); } } @@ -80,8 +85,27 @@ public class UmbrellaTreeFeature extends DefaultFeature { return false; } - sdf.setReplaceFunction(REPLACE).setPostProcess(POST).fillRecursiveIgnore(world, pos, IGNORE); - makeRoots(world, pos.add(0, 2, 0), size * 0.3F + 3, random, wood); + sdf.setReplaceFunction(REPLACE).setPostProcess((info) -> { + if (EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateUp()) && EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateDown())) { + return EndBlocks.UMBRELLA_TREE.log.getDefaultState(); + } + else if (info.getState().equals(membrane)) { + Center min = centers.get(0); + double d = Double.MAX_VALUE; + BlockPos bpos = info.getPos(); + for (Center c: centers) { + double d2 = c.distance(bpos.getX(), bpos.getZ()); + if (d2 < d) { + d = d2; + min = c; + } + } + int color = MHelper.floor(d / min.radius * 7); + color = MathHelper.clamp(color, 1, 7); + return info.getState().with(BlockUmbrellaTreeMembrane.COLOR, color); + } + return info.getState(); + }).fillRecursiveIgnore(world, pos, IGNORE); return true; } @@ -132,7 +156,7 @@ public class UmbrellaTreeFeature extends DefaultFeature { new Vector3f(0.50F, 1.00F, 0.00F) ); - ROOT = Lists.newArrayList(new Vector3f(0F, 1F, 0), + ROOT = Lists.newArrayList( new Vector3f(0.1F, 0.70F, 0), new Vector3f(0.3F, 0.30F, 0), new Vector3f(0.7F, 0.05F, 0), @@ -150,12 +174,21 @@ public class UmbrellaTreeFeature extends DefaultFeature { IGNORE = (state) -> { return EndBlocks.UMBRELLA_TREE.isTreeLog(state); }; + } + + private class Center { + final double px; + final double pz; + final float radius; - POST = (info) -> { - if (EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateUp()) && EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateDown())) { - return EndBlocks.UMBRELLA_TREE.log.getDefaultState(); - } - return info.getState(); - }; + Center(double x, double z, float radius) { + this.px = x; + this.pz = z; + this.radius = radius; + } + + double distance(float x, float z) { + return MHelper.length(px - x, pz - z); + } } } diff --git a/src/main/resources/assets/betterend/blockstates/umbrella_tree_membrane.json b/src/main/resources/assets/betterend/blockstates/umbrella_tree_membrane.json new file mode 100644 index 00000000..67205565 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/umbrella_tree_membrane.json @@ -0,0 +1,12 @@ +{ + "variants": { + "color=0": { "model": "betterend:block/umbrella_tree_membrane_0" }, + "color=1": { "model": "betterend:block/umbrella_tree_membrane_1" }, + "color=2": { "model": "betterend:block/umbrella_tree_membrane_2" }, + "color=3": { "model": "betterend:block/umbrella_tree_membrane_3" }, + "color=4": { "model": "betterend:block/umbrella_tree_membrane_4" }, + "color=5": { "model": "betterend:block/umbrella_tree_membrane_5" }, + "color=6": { "model": "betterend:block/umbrella_tree_membrane_6" }, + "color=7": { "model": "betterend:block/umbrella_tree_membrane_7" } + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_0.json b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_0.json new file mode 100644 index 00000000..c97a7fd7 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_0.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbrella_tree_membrane_0" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_1.json b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_1.json new file mode 100644 index 00000000..d2bf8c26 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_1.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbrella_tree_membrane_1" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_2.json b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_2.json new file mode 100644 index 00000000..e0ef2166 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_2.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbrella_tree_membrane_2" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_3.json b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_3.json new file mode 100644 index 00000000..a2e17b5f --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_3.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbrella_tree_membrane_3" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_4.json b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_4.json new file mode 100644 index 00000000..27bb5dbd --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_4.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbrella_tree_membrane_4" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_5.json b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_5.json new file mode 100644 index 00000000..93e86f87 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_5.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbrella_tree_membrane_5" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_6.json b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_6.json new file mode 100644 index 00000000..02690946 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_6.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbrella_tree_membrane_6" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_7.json b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_7.json new file mode 100644 index 00000000..25254adf --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_7.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbrella_tree_membrane_7" + } +} diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_0.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_0.png new file mode 100644 index 0000000000000000000000000000000000000000..900a7fd279b4f9eb00c92f5cc0a2b45b17a221a2 GIT binary patch literal 1843 zcmbVNZA{!`96yxl$=rhI2eZx4lq_LludjF4R!+b>1m=z*oC4DiJl8(GE8O+z+QJ=t zS>ywO83JbN2Q$qu=rrm%gE1yE!TIt{v!NJgjG2oj_XWjdF*9)*pWd4c*(6@l>(lo4 z{C>axOaGne>F(H7v!}-6@$BmAjP&Ajt$TQH!TofwdPr7K+6Pn=hrVpu#AuJFxg~1?Wdu4z942%lM6RD*CJ9{)k^TNC6E(vy zsdr9Tuy3L}rc8_|l1jEbL^Nk*Opt~SAhPL{VawSNS>ToN+PzJaL;>QAgvd5mkQj*e z5Mg9N!tV=E3M+6#Q1Y<>M&g7A2##TcG!vv*o?=*;3CO%elzt>uvs6v)jXYA)!dD?O z={TlL)0s@hm*IWLO3JHJjmDJ276cBmVhE+m zh3Y9=Cc%uIu2F#l{u8V!vWBcQz%lD-kbtylBuJu?NjZ#C$il+d9ba$}jmlky z?Epi8U6Bxp!}jUAD#wEo2gN{~64hXwQg}h7q#!F&k_0peStYLVT6up2DWh(2-TlQr zSCN7_{!!%xLF5B|mJ$?6qbg=fBP%M3 zq5+lC)L?)TfWT1_2Uv>XW!CPkv@2|v`Xnjp)F*fxa}Sy z6}Qe%B}=#UE%LD~<i?_QY~-~D8HCbBd?{B?D5{#N0!>V;$86F(n$xihz? zW;S$k>Gg$``Zs^?5N9+9R{LtYa@>eO{J8|EtwsPs*;FGH_^&dQ* q`;Drbyz=-T!yV@)S}*2j*LF&$e*Gr#YVer*S?g-=j^rL5n*1BNd1o;I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_1.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_1.png new file mode 100644 index 0000000000000000000000000000000000000000..7a54cb963991ba4a4d9c7be6b5f50b880deead06 GIT binary patch literal 390 zcmV;10eSw3P)(X=g6XcvGZF%xSr) zF7)Yu3tc^Pp{teTG~f+vz|2wsE_9XH-i=5oB;J4;6~wBz167nw2=vpTih7j-JjSV- zsEva4+Quag^i!$ILjjwC`(zhpMp^6kSv@YymBgF-|BcJQCa@RrHlF>s+GxT1aMe|n z%?R6)_bov&(uEFxiC5tIP(7ys7v?{{w0q;)gwl7}0V8XZa~kTJyU>+AFq6*A z3#+bl+7KlAS&-DS^d!7@apML35=O)w*DvM{phSkk^P9F0hvE;x+IzJm!7KCyY zvvMCc10N3;JZht;4{^pS%J#no1H{_@QIykj3j-EAzl(6ZY`(_R?UmqS%*jInY?wyT c&1SVbKZW|;UhI;8tN;K207*qoM6N<$f=Ak>qyPW_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_3.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_3.png new file mode 100644 index 0000000000000000000000000000000000000000..129be486f9b754cd5b8bc3c23f97552047e18c83 GIT binary patch literal 396 zcmV;70dxL|P)Avx5QV=8#lAqmgTYHECZYd-%D?Cj=+Gg!;Kjv*ArL76(Lp&`cG_EvPWRqBy*qE- zKfcZYZ|wts?zSfko}!<)A1X{!0uTm|j1E^z%JJi|3Iw=xTObw&h=Avvj4pjOXPT1D zsrx>M!6y1c;1?ZP zeeZf)dCcI~Fte-f&k=UF{mYYp*@OF`N|$T(FvND(Cgyu%@&Z>&+5siYi^Jg4nj0zO z9;iuO6aN8M3o`N~iKOdgQ}D5UV3fVxU0+*uQ7!i;2Lsr7{&8d%wzyg-`nfn6_c>+f qxI3u>Gx)S5z(T3rT^C;D)Aps*xT(ba)cBK9TF*^8>g_gfH8(>rvaPy-uyj2zJ6}M z0H5DA0Nq1LL!{~_UWXdj1_06!kx|h`@*U5JHzL6OIsqV~l9s0~-(=MMv^&=Zyk(>S zCY{eoBUK-967rpskSj?;#2eX&X#pjji5B*5LNbCjf;XZbYCtyS!VKDmQ1xr8eg+8V z%Q{3YGFY!=yr`-A2`2#$aK6-efP1iO1IN=^MfXr#8?uPE>HoJbBU^%f5^w$P*HuPI z-iKSKs+$#-CGT4T))~AGtC9BE(-3iOc$-V<8&?9fk?a8zE5T`q+2&5d>;oH8w*a&e zWMmN`JI*RJgK0Cb-kbXIBv~Y9EUawjk__O>{U1-leW}8T<=LT%Ut)g>KP*tUEg3D`AwhTTZ#>Lq4OaDQ}ZePdcc@=`sZ$y#uUx!T+~xB5UudTfB? z1z|OeuJUX)C10-nx&?q?l$xYgY^<#JmJDFq{STusZC!K?xC%GThx>G!F;$G;TulNT gDh;C?I%~J{0+aFKgdHJK$^ZZW07*qoM6N<$f)fCz9RL6T literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_6.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_6.png new file mode 100644 index 0000000000000000000000000000000000000000..517133b04d3c817167f4c201e88dbc8e7a2590a8 GIT binary patch literal 393 zcmV;40e1e0P)b>!3`JiBK_av`gV!Pm(7{(IkVExwJwgr%nbu>K zQA5T^p5}L+5^hQu=S$8wUna?Y!YWvSc`3>ZP(%N9!E{)Sv}ezK!nFQLm)bX`E{H*j2eesTocmO4Zk(Te zpd#I`b3qJ(FdIfsxi_1FPv-`s-H)9-k2=k4wLUc%z}ELacEas4PvNTKBHZ_|dEYL> nI)V93#U#Ln>Db9ei~2f$&w1tY6lejt00000NkvXXu0mjfTFI{y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_7.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_7.png new file mode 100644 index 0000000000000000000000000000000000000000..c2a7369525fb2c247260c1eacdecdc4c51bea926 GIT binary patch literal 391 zcmV;20eJq2P)b>!3`JiB+2Rs-@LU)Hy7>qNa)_R_C&(Q#bqF$aG+HAI6$3&Co3iYnTx=2i{N(3< zdHeYK1bBUK0JvS0G(_tA$m7u9+5kWrBBF|lY7WQwA1W*yY0rk*;$YxxYqD_cU-`7>W zihu~m(<-74D}(J?#)F3XKH{o?2RNRZEa1M_wSlf*r?_1d*M{80oBIEq%fLpkC-JuL z{#<30;C;BPs_N#1<;eS$fK`LXVKvg8Jq;1ph9_N0-?*|sMY0F1Sy`Nhm~HN=F#Etn zx?Sc16+xH{W2fAk&A`V~gR|~kFVCY+Gh3-o2?p@x{kvYcp64m*qBslpJ#OCD^SDmn leq%NXuwm+Y*=SK-=MRFR<=}wyf*Jq-002ovPDHLkV1fsAw4?w4 literal 0 HcmV?d00001 From 7ed6902fccdbb87b0ec18633011bc2c83c3c0e59 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Thu, 24 Dec 2020 14:58:54 +0300 Subject: [PATCH 004/463] Update build.gradle --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index 4a6f9a15..f661c6d1 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,7 @@ plugins { id 'fabric-loom' version '0.5-SNAPSHOT' id 'maven-publish' + id 'maven' } sourceCompatibility = JavaVersion.VERSION_1_8 From 54e24d0ce7a41d2bf762cc1a78e9b7bace6948f0 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Thu, 24 Dec 2020 15:10:29 +0300 Subject: [PATCH 005/463] Update build.gradle --- build.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index f661c6d1..7d1e63c3 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,6 @@ plugins { id 'fabric-loom' version '0.5-SNAPSHOT' id 'maven-publish' - id 'maven' } sourceCompatibility = JavaVersion.VERSION_1_8 @@ -20,6 +19,8 @@ repositories { jcenter() } +apply plugin: 'maven' + dependencies { minecraft "com.mojang:minecraft:${project.minecraft_version}" mappings "net.fabricmc:yarn:${project.minecraft_version}+build.${project.yarn_mappings}:v2" From fa0c2b18693f5faf860dd0e08233fd2d6fbadaac Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 24 Dec 2020 16:20:31 +0300 Subject: [PATCH 006/463] Twisted umbrella moss prototype --- .../blocks/BlockTwistedUmbrellaMoss.java | 49 ++++ .../blocks/BlockTwistedUmbrellaMossTall.java | 28 +++ .../java/ru/betterend/registry/EndBlocks.java | 4 + .../ru/betterend/registry/EndFeatures.java | 1 + .../world/biome/BiomeUmbrellaJungle.java | 1 + .../blockstates/twisted_umbrella_moss.json | 25 ++ .../twisted_umbrella_moss_tall.json | 28 +++ .../block/twisted_umbrella_moss.json | 22 ++ .../block/twisted_umbrella_moss_tall.json | 22 ++ .../block/twisted_umbrella_moss_bottom.json | 75 ++++++ .../block/twisted_umbrella_moss_small.json | 238 ++++++++++++++++++ .../block/twisted_umbrella_moss_small_2.json | 200 +++++++++++++++ .../block/twisted_umbrella_moss_small_3.json | 161 ++++++++++++ .../block/twisted_umbrella_moss_small_4.json | 122 +++++++++ .../block/twisted_umbrella_moss_top.json | 193 ++++++++++++++ .../block/twisted_umbrella_moss_top_2.json | 155 ++++++++++++ .../block/twisted_umbrella_moss_top_3.json | 116 +++++++++ .../block/twisted_umbrella_moss_bottom.png | Bin 0 -> 504 bytes .../block/twisted_umbrella_moss_end.png | Bin 0 -> 471 bytes .../block/twisted_umbrella_moss_small.png | Bin 0 -> 356 bytes .../twisted_umbrella_moss_sporophyte.png | Bin 0 -> 321 bytes .../block/twisted_umbrella_moss_up.png | Bin 0 -> 409 bytes 22 files changed, 1440 insertions(+) create mode 100644 src/main/java/ru/betterend/blocks/BlockTwistedUmbrellaMoss.java create mode 100644 src/main/java/ru/betterend/blocks/BlockTwistedUmbrellaMossTall.java create mode 100644 src/main/resources/assets/betterend/blockstates/twisted_umbrella_moss.json create mode 100644 src/main/resources/assets/betterend/blockstates/twisted_umbrella_moss_tall.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/twisted_umbrella_moss.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/twisted_umbrella_moss_tall.json create mode 100644 src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_bottom.json create mode 100644 src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small.json create mode 100644 src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small_2.json create mode 100644 src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small_3.json create mode 100644 src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small_4.json create mode 100644 src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_top.json create mode 100644 src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_top_2.json create mode 100644 src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_top_3.json create mode 100644 src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_bottom.png create mode 100644 src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_end.png create mode 100644 src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_small.png create mode 100644 src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_sporophyte.png create mode 100644 src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_up.png diff --git a/src/main/java/ru/betterend/blocks/BlockTwistedUmbrellaMoss.java b/src/main/java/ru/betterend/blocks/BlockTwistedUmbrellaMoss.java new file mode 100644 index 00000000..5a67a22d --- /dev/null +++ b/src/main/java/ru/betterend/blocks/BlockTwistedUmbrellaMoss.java @@ -0,0 +1,49 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.block.BlockState; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.BlockView; +import net.minecraft.world.World; +import ru.betterend.blocks.basis.BlockDoublePlant; +import ru.betterend.blocks.basis.BlockPlant; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.BlocksHelper; + +public class BlockTwistedUmbrellaMoss extends BlockPlant { + public BlockTwistedUmbrellaMoss() { + super(11); + } + + @Override + protected boolean isTerrain(BlockState state) { + return state.getBlock() == EndBlocks.END_MOSS || state.getBlock() == EndBlocks.END_MYCELIUM; + } + + @Environment(EnvType.CLIENT) + public boolean hasEmissiveLighting(BlockView world, BlockPos pos) { + return true; + } + + @Environment(EnvType.CLIENT) + public float getAmbientOcclusionLightLevel(BlockView world, BlockPos pos) { + return 1F; + } + + @Override + public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { + return world.isAir(pos.up()); + } + + @Override + public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { + int rot = world.random.nextInt(4); + BlockState bs = EndBlocks.TWISTED_UMBRELLA_MOSS_TALL.getDefaultState().with(BlockDoublePlant.ROTATION, rot); + BlocksHelper.setWithoutUpdate(world, pos, bs); + BlocksHelper.setWithoutUpdate(world, pos.up(), bs.with(BlockDoublePlant.TOP, true)); + } +} diff --git a/src/main/java/ru/betterend/blocks/BlockTwistedUmbrellaMossTall.java b/src/main/java/ru/betterend/blocks/BlockTwistedUmbrellaMossTall.java new file mode 100644 index 00000000..ac098c6f --- /dev/null +++ b/src/main/java/ru/betterend/blocks/BlockTwistedUmbrellaMossTall.java @@ -0,0 +1,28 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.minecraft.block.BlockState; +import net.minecraft.entity.ItemEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; +import ru.betterend.blocks.basis.BlockDoublePlant; +import ru.betterend.registry.EndBlocks; + +public class BlockTwistedUmbrellaMossTall extends BlockDoublePlant { + public BlockTwistedUmbrellaMossTall() { + super(12); + } + + @Override + public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { + ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(EndBlocks.TWISTED_UMBRELLA_MOSS)); + world.spawnEntity(item); + } + + @Override + protected boolean isTerrain(BlockState state) { + return state.getBlock() == EndBlocks.END_MOSS || state.getBlock() == EndBlocks.END_MYCELIUM; + } +} diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 12b61fd5..300656b9 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -63,6 +63,8 @@ import ru.betterend.blocks.BlockTenaneaFlowers; import ru.betterend.blocks.BlockTenaneaSapling; import ru.betterend.blocks.BlockTerrain; import ru.betterend.blocks.BlockTerrainPlant; +import ru.betterend.blocks.BlockTwistedUmbrellaMoss; +import ru.betterend.blocks.BlockTwistedUmbrellaMossTall; import ru.betterend.blocks.BlockUmbrellaMoss; import ru.betterend.blocks.BlockUmbrellaMossTall; import ru.betterend.blocks.BlockUmbrellaTreeMembrane; @@ -186,6 +188,8 @@ public class EndBlocks { public static final Block SHADOW_PLANT = registerBlock("shadow_plant", new BlockTerrainPlant(SHADOW_GRASS)); public static final Block BUSHY_GRASS = registerBlock("bushy_grass", new BlockTerrainPlant(PINK_MOSS)); public static final Block AMBER_GRASS = registerBlock("amber_grass", new BlockTerrainPlant(AMBER_MOSS)); + public static final Block TWISTED_UMBRELLA_MOSS = registerBlock("twisted_umbrella_moss", new BlockTwistedUmbrellaMoss()); + public static final Block TWISTED_UMBRELLA_MOSS_TALL = registerBlock("twisted_umbrella_moss_tall", new BlockTwistedUmbrellaMossTall()); public static final Block BLUE_VINE_SEED = registerBlock("blue_vine_seed", new BlockBlueVineSeed()); public static final Block BLUE_VINE = registerBlockNI("blue_vine", new BlockBlueVine()); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index f78e3fd9..6526557d 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -79,6 +79,7 @@ public class EndFeatures { public static final EndFeature AMBER_GRASS = new EndFeature("amber_grass", new SinglePlantFeature(EndBlocks.AMBER_GRASS, 6), 9); public static final EndFeature LANCELEAF = new EndFeature("lanceleaf", new LanceleafFeature(), 3); public static final EndFeature GLOW_PILLAR = new EndFeature("glow_pillar", new GlowPillarFeature(), 1); + public static final EndFeature TWISTED_UMBRELLA_MOSS = new EndFeature("twisted_umbrella_moss", new DoublePlantFeature(EndBlocks.TWISTED_UMBRELLA_MOSS, EndBlocks.TWISTED_UMBRELLA_MOSS_TALL, 9), 6); // Vines // public static final EndFeature DENSE_VINE = new EndFeature("dense_vine", new VineFeature(EndBlocks.DENSE_VINE, 24), 3); diff --git a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java index e63ca8b1..e163b0bf 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java +++ b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java @@ -12,6 +12,7 @@ public class BiomeUmbrellaJungle extends EndBiome { .setFogDensity(2.3F) .setSurface(EndBlocks.END_MOSS) .addFeature(EndFeatures.UMBRELLA_TREE) + .addFeature(EndFeatures.TWISTED_UMBRELLA_MOSS) .addFeature(EndFeatures.UMBRELLA_MOSS) .addFeature(EndFeatures.END_LAKE)); } diff --git a/src/main/resources/assets/betterend/blockstates/twisted_umbrella_moss.json b/src/main/resources/assets/betterend/blockstates/twisted_umbrella_moss.json new file mode 100644 index 00000000..1f058fff --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/twisted_umbrella_moss.json @@ -0,0 +1,25 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/twisted_umbrella_moss_small" }, + { "model": "betterend:block/twisted_umbrella_moss_small", "y": 90 }, + { "model": "betterend:block/twisted_umbrella_moss_small", "y": 180 }, + { "model": "betterend:block/twisted_umbrella_moss_small", "y": 270 }, + + { "model": "betterend:block/twisted_umbrella_moss_small_2" }, + { "model": "betterend:block/twisted_umbrella_moss_small_2", "y": 90 }, + { "model": "betterend:block/twisted_umbrella_moss_small_2", "y": 180 }, + { "model": "betterend:block/twisted_umbrella_moss_small_2", "y": 270 }, + + { "model": "betterend:block/twisted_umbrella_moss_small_3" }, + { "model": "betterend:block/twisted_umbrella_moss_small_3", "y": 90 }, + { "model": "betterend:block/twisted_umbrella_moss_small_3", "y": 180 }, + { "model": "betterend:block/twisted_umbrella_moss_small_3", "y": 270 }, + + { "model": "betterend:block/twisted_umbrella_moss_small_4" }, + { "model": "betterend:block/twisted_umbrella_moss_small_4", "y": 90 }, + { "model": "betterend:block/twisted_umbrella_moss_small_4", "y": 180 }, + { "model": "betterend:block/twisted_umbrella_moss_small_4", "y": 270 } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/twisted_umbrella_moss_tall.json b/src/main/resources/assets/betterend/blockstates/twisted_umbrella_moss_tall.json new file mode 100644 index 00000000..b8c433d6 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/twisted_umbrella_moss_tall.json @@ -0,0 +1,28 @@ +{ + "variants": { + "top=true,rotation=0": [ + { "model": "betterend:block/twisted_umbrella_moss_top" }, + { "model": "betterend:block/twisted_umbrella_moss_top_2" }, + { "model": "betterend:block/twisted_umbrella_moss_top_3" } + ], + "top=false,rotation=0": { "model": "betterend:block/twisted_umbrella_moss_bottom" }, + "top=true,rotation=1": [ + { "model": "betterend:block/twisted_umbrella_moss_top", "y": 90 }, + { "model": "betterend:block/twisted_umbrella_moss_top_2", "y": 90 }, + { "model": "betterend:block/twisted_umbrella_moss_top_3", "y": 90 } + ], + "top=false,rotation=1": { "model": "betterend:block/twisted_umbrella_moss_bottom", "y": 90 }, + "top=true,rotation=2": [ + { "model": "betterend:block/twisted_umbrella_moss_top", "y": 180 }, + { "model": "betterend:block/twisted_umbrella_moss_top_2", "y": 180 }, + { "model": "betterend:block/twisted_umbrella_moss_top_3", "y": 180 } + ], + "top=false,rotation=2": { "model": "betterend:block/twisted_umbrella_moss_bottom", "y": 180 }, + "top=true,rotation=3": [ + { "model": "betterend:block/twisted_umbrella_moss_top", "y": 270 }, + { "model": "betterend:block/twisted_umbrella_moss_top_2", "y": 270 }, + { "model": "betterend:block/twisted_umbrella_moss_top_3", "y": 270 } + ], + "top=false,rotation=3": { "model": "betterend:block/twisted_umbrella_moss_bottom", "y": 270 } + } +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/twisted_umbrella_moss.json b/src/main/resources/assets/betterend/materialmaps/block/twisted_umbrella_moss.json new file mode 100644 index 00000000..40da75b3 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/twisted_umbrella_moss.json @@ -0,0 +1,22 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/twisted_umbrella_moss_sporophyte", + "material": "betterend:wave_glow_all" + }, + { + "sprite": "betterend:block/twisted_umbrella_moss_small", + "material": "betterend:waving_floor" + }, + { + "sprite": "betterend:block/twisted_umbrella_moss_up", + "material": "betterend:waving_floor" + }, + { + "sprite": "betterend:block/twisted_umbrella_moss_end", + "material": "betterend:waving_floor" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/twisted_umbrella_moss_tall.json b/src/main/resources/assets/betterend/materialmaps/block/twisted_umbrella_moss_tall.json new file mode 100644 index 00000000..6bf927c7 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/twisted_umbrella_moss_tall.json @@ -0,0 +1,22 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/twisted_umbrella_moss_sporophyte", + "material": "betterend:wave_glow_all" + }, + { + "sprite": "betterend:block/twisted_umbrella_moss_up", + "material": "betterend:waving" + }, + { + "sprite": "betterend:block/twisted_umbrella_moss_end", + "material": "betterend:waving" + }, + { + "sprite": "betterend:block/twisted_umbrella_moss_bottom", + "material": "betterend:waving_floor" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_bottom.json b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_bottom.json new file mode 100644 index 00000000..ebc647b5 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_bottom.json @@ -0,0 +1,75 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/twisted_umbrella_moss_bottom", + "texture": "betterend:block/twisted_umbrella_moss_bottom" + }, + "elements": [ + { + "__comment": "PlaneX3", + "from": [ -2, 0, -2 ], + "to": [ -1.999, 16, 14 ], + "rotation": { "origin": [ -2, 0, -2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 9.5, 0, -2 ], + "to": [ 9.501, 16, 14 ], + "rotation": { "origin": [ 9.5, 0, -2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 6, 0, 3 ], + "to": [ 6.001, 16, 19 ], + "rotation": { "origin": [ 6, 0, 3 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 17.5, 0, 3 ], + "to": [ 17.501, 16, 19 ], + "rotation": { "origin": [ 17.5, 0, 3 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -1, 0, 6 ], + "to": [ -0.999, 16, 22 ], + "rotation": { "origin": [ -1, 0, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 10.5, 0, 6 ], + "to": [ 10.501, 16, 22 ], + "rotation": { "origin": [ 10.5, 0, 6 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small.json b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small.json new file mode 100644 index 00000000..99a84b70 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small.json @@ -0,0 +1,238 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/twisted_umbrella_moss_up", + "texture": "betterend:block/twisted_umbrella_moss_up", + "spore": "betterend:block/twisted_umbrella_moss_sporophyte", + "small": "betterend:block/twisted_umbrella_moss_small" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 3, 13, 3 ], + "to": [ 5, 16, 5 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 11, 12, 8 ], + "to": [ 13, 15, 10 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 4, 11, 11 ], + "to": [ 6, 14, 13 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 1, 12, 1 ], + "to": [ 7, 14, 7 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -2, 0, -2 ], + "to": [ -1.999, 13, 14 ], + "rotation": { "origin": [ -2, 0, -2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 9.5, 0, -2 ], + "to": [ 9.501, 13, 14 ], + "rotation": { "origin": [ 9.5, 0, -2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 7, 14, 7 ], + "to": [ 1, 12, 1 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "south": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "west": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "east": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 9, 11, 6 ], + "to": [ 15, 13, 12 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 6, 0, 3 ], + "to": [ 6.001, 12, 19 ], + "rotation": { "origin": [ 6, 0, 3 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 17.5, 0, 3 ], + "to": [ 17.501, 12, 19 ], + "rotation": { "origin": [ 17.5, 0, 3 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 15, 13, 12 ], + "to": [ 9, 11, 6 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "south": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "west": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "east": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 10, 9 ], + "to": [ 8, 12, 15 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -1, 0, 6 ], + "to": [ -0.999, 11, 22 ], + "rotation": { "origin": [ -1, 0, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 10.5, 0, 6 ], + "to": [ 10.501, 11, 22 ], + "rotation": { "origin": [ 10.5, 0, 6 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 8, 12, 15 ], + "to": [ 2, 10, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "south": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "west": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "east": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY16", + "from": [ 0, 0, 9 ], + "to": [ 16, 0.001, 25 ], + "rotation": { "origin": [ 0, 0, 9 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 180 } + } + }, + { + "__comment": "PlaneY16", + "from": [ 0, -0.001, -9 ], + "to": [ 16, 0, 7 ], + "rotation": { "origin": [ 0, 0, 7 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small" } + } + }, + { + "__comment": "PlaneY18", + "from": [ 9, 0, 0 ], + "to": [ 25, 0.001, 16 ], + "rotation": { "origin": [ 9, 0, 0 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 90 } + } + }, + { + "__comment": "PlaneY18", + "from": [ -9, -0.001, 0 ], + "to": [ 7, 0, 16 ], + "rotation": { "origin": [ 7, 0, 0 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 270 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 270 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small_2.json b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small_2.json new file mode 100644 index 00000000..d38d3200 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small_2.json @@ -0,0 +1,200 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/twisted_umbrella_moss_up", + "texture": "betterend:block/twisted_umbrella_moss_up", + "spore": "betterend:block/twisted_umbrella_moss_sporophyte", + "small": "betterend:block/twisted_umbrella_moss_small", + "end": "betterend:block/twisted_umbrella_moss_end" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 3, 13, 3 ], + "to": [ 5, 16, 5 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 4, 11, 11 ], + "to": [ 6, 14, 13 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 1, 12, 1 ], + "to": [ 7, 14, 7 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -2, 0, -2 ], + "to": [ -1.999, 13, 14 ], + "rotation": { "origin": [ -2, 0, -2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 9.5, 0, -2 ], + "to": [ 9.501, 13, 14 ], + "rotation": { "origin": [ 9.5, 0, -2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 7, 14, 7 ], + "to": [ 1, 12, 1 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "south": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "west": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "east": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 6, 0, 3 ], + "to": [ 6.001, 13, 19 ], + "rotation": { "origin": [ 6, 0, 3 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 17.5, 0, 3 ], + "to": [ 17.501, 13, 19 ], + "rotation": { "origin": [ 17.5, 0, 3 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 10, 9 ], + "to": [ 8, 12, 15 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -1, 0, 6 ], + "to": [ -0.999, 11, 22 ], + "rotation": { "origin": [ -1, 0, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 10.5, 0, 6 ], + "to": [ 10.501, 11, 22 ], + "rotation": { "origin": [ 10.5, 0, 6 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 8, 12, 15 ], + "to": [ 2, 10, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "south": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "west": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "east": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY16", + "from": [ 0, 0, 9 ], + "to": [ 16, 0.001, 25 ], + "rotation": { "origin": [ 0, 0, 9 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 180 } + } + }, + { + "__comment": "PlaneY16", + "from": [ 0, -0.001, -9 ], + "to": [ 16, 0, 7 ], + "rotation": { "origin": [ 0, 0, 7 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small" } + } + }, + { + "__comment": "PlaneY18", + "from": [ 9, 0, 0 ], + "to": [ 25, 0.001, 16 ], + "rotation": { "origin": [ 9, 0, 0 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 90 } + } + }, + { + "__comment": "PlaneY18", + "from": [ -9, -0.001, 0 ], + "to": [ 7, 0, 16 ], + "rotation": { "origin": [ 7, 0, 0 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 270 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 270 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small_3.json b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small_3.json new file mode 100644 index 00000000..33abf9d6 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small_3.json @@ -0,0 +1,161 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/twisted_umbrella_moss_up", + "texture": "betterend:block/twisted_umbrella_moss_up", + "spore": "betterend:block/twisted_umbrella_moss_sporophyte", + "small": "betterend:block/twisted_umbrella_moss_small", + "end": "betterend:block/twisted_umbrella_moss_end" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 4, 11, 11 ], + "to": [ 6, 14, 13 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -2, 0, -2 ], + "to": [ -1.999, 13, 14 ], + "rotation": { "origin": [ -2, 0, -2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 9.5, 0, -2 ], + "to": [ 9.501, 13, 14 ], + "rotation": { "origin": [ 9.5, 0, -2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 6, 0, 3 ], + "to": [ 6.001, 13, 19 ], + "rotation": { "origin": [ 6, 0, 3 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 17.5, 0, 3 ], + "to": [ 17.501, 13, 19 ], + "rotation": { "origin": [ 17.5, 0, 3 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 10, 9 ], + "to": [ 8, 12, 15 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -1, 0, 6 ], + "to": [ -0.999, 11, 22 ], + "rotation": { "origin": [ -1, 0, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 10.5, 0, 6 ], + "to": [ 10.501, 11, 22 ], + "rotation": { "origin": [ 10.5, 0, 6 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 8, 12, 15 ], + "to": [ 2, 10, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "south": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "west": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "east": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY16", + "from": [ 0, 0, 9 ], + "to": [ 16, 0.001, 25 ], + "rotation": { "origin": [ 0, 0, 9 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 180 } + } + }, + { + "__comment": "PlaneY16", + "from": [ 0, -0.001, -9 ], + "to": [ 16, 0, 7 ], + "rotation": { "origin": [ 0, 0, 7 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small" } + } + }, + { + "__comment": "PlaneY18", + "from": [ 9, 0, 0 ], + "to": [ 25, 0.001, 16 ], + "rotation": { "origin": [ 9, 0, 0 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 90 } + } + }, + { + "__comment": "PlaneY18", + "from": [ -9, -0.001, 0 ], + "to": [ 7, 0, 16 ], + "rotation": { "origin": [ 7, 0, 0 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 270 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 270 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small_4.json b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small_4.json new file mode 100644 index 00000000..40b41112 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_small_4.json @@ -0,0 +1,122 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/twisted_umbrella_moss_up", + "texture": "betterend:block/twisted_umbrella_moss_up", + "spore": "betterend:block/twisted_umbrella_moss_sporophyte", + "small": "betterend:block/twisted_umbrella_moss_small", + "end": "betterend:block/twisted_umbrella_moss_end" + }, + "elements": [ + { + "__comment": "PlaneX3", + "from": [ -2, 0, -2 ], + "to": [ -1.999, 13, 14 ], + "rotation": { "origin": [ -2, 0, -2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 9.5, 0, -2 ], + "to": [ 9.501, 13, 14 ], + "rotation": { "origin": [ 9.5, 0, -2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 6, 0, 3 ], + "to": [ 6.001, 13, 19 ], + "rotation": { "origin": [ 6, 0, 3 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 17.5, 0, 3 ], + "to": [ 17.501, 13, 19 ], + "rotation": { "origin": [ 17.5, 0, 3 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -1, 0, 6 ], + "to": [ -0.999, 11, 22 ], + "rotation": { "origin": [ -1, 0, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 10.5, 0, 6 ], + "to": [ 10.501, 11, 22 ], + "rotation": { "origin": [ 10.5, 0, 6 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneY16", + "from": [ 0, 0, 9 ], + "to": [ 16, 0.001, 25 ], + "rotation": { "origin": [ 0, 0, 9 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 180 } + } + }, + { + "__comment": "PlaneY16", + "from": [ 0, -0.001, -9 ], + "to": [ 16, 0, 7 ], + "rotation": { "origin": [ 0, 0, 7 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small" } + } + }, + { + "__comment": "PlaneY18", + "from": [ 9, 0, 0 ], + "to": [ 25, 0.001, 16 ], + "rotation": { "origin": [ 9, 0, 0 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 90 } + } + }, + { + "__comment": "PlaneY18", + "from": [ -9, -0.001, 0 ], + "to": [ 7, 0, 16 ], + "rotation": { "origin": [ 7, 0, 0 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 270 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 270 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_top.json b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_top.json new file mode 100644 index 00000000..273a61bd --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_top.json @@ -0,0 +1,193 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/twisted_umbrella_moss_up", + "texture": "betterend:block/twisted_umbrella_moss_up", + "spore": "betterend:block/twisted_umbrella_moss_sporophyte" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 3, 13, 3 ], + "to": [ 5, 16, 5 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 11, 12, 8 ], + "to": [ 13, 15, 10 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 4, 11, 11 ], + "to": [ 6, 14, 13 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 1, 12, 1 ], + "to": [ 7, 14, 7 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -2, 0, -2 ], + "to": [ -1.999, 13, 14 ], + "rotation": { "origin": [ -2, 0, -2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 9.5, 0, -2 ], + "to": [ 9.501, 13, 14 ], + "rotation": { "origin": [ 9.5, 0, -2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 7, 14, 7 ], + "to": [ 1, 12, 1 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "south": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "west": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "east": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 9, 11, 6 ], + "to": [ 15, 13, 12 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "south": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "west": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "east": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 6, 0, 3 ], + "to": [ 6.001, 12, 19 ], + "rotation": { "origin": [ 6, 0, 3 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 17.5, 0, 3 ], + "to": [ 17.501, 12, 19 ], + "rotation": { "origin": [ 17.5, 0, 3 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 15, 13, 12 ], + "to": [ 9, 11, 6 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "south": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "west": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "east": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 10, 9 ], + "to": [ 8, 12, 15 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -1, 0, 6 ], + "to": [ -0.999, 11, 22 ], + "rotation": { "origin": [ -1, 0, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 10.5, 0, 6 ], + "to": [ 10.501, 11, 22 ], + "rotation": { "origin": [ 10.5, 0, 6 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 8, 12, 15 ], + "to": [ 2, 10, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "south": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "west": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "east": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_top_2.json b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_top_2.json new file mode 100644 index 00000000..cac3ff94 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_top_2.json @@ -0,0 +1,155 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/twisted_umbrella_moss_up", + "texture": "betterend:block/twisted_umbrella_moss_up", + "spore": "betterend:block/twisted_umbrella_moss_sporophyte", + "end": "betterend:block/twisted_umbrella_moss_end" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 3, 13, 3 ], + "to": [ 5, 16, 5 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 4, 11, 11 ], + "to": [ 6, 14, 13 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 1, 12, 1 ], + "to": [ 7, 14, 7 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -2, 0, -2 ], + "to": [ -1.999, 13, 14 ], + "rotation": { "origin": [ -2, 0, -2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 9.5, 0, -2 ], + "to": [ 9.501, 13, 14 ], + "rotation": { "origin": [ 9.5, 0, -2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 7, 14, 7 ], + "to": [ 1, 12, 1 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "south": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "west": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "east": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 6, 0, 3 ], + "to": [ 6.001, 13, 19 ], + "rotation": { "origin": [ 6, 0, 3 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 4, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 4, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 17.5, 0, 3 ], + "to": [ 17.501, 13, 19 ], + "rotation": { "origin": [ 17.5, 0, 3 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 10, 9 ], + "to": [ 8, 12, 15 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -1, 0, 6 ], + "to": [ -0.999, 11, 22 ], + "rotation": { "origin": [ -1, 0, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 10.5, 0, 6 ], + "to": [ 10.501, 11, 22 ], + "rotation": { "origin": [ 10.5, 0, 6 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 8, 12, 15 ], + "to": [ 2, 10, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "south": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "west": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "east": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_top_3.json b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_top_3.json new file mode 100644 index 00000000..f99c6d8b --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/twisted_umbrella_moss_top_3.json @@ -0,0 +1,116 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/twisted_umbrella_moss_up", + "texture": "betterend:block/twisted_umbrella_moss_up", + "spore": "betterend:block/twisted_umbrella_moss_sporophyte", + "end": "betterend:block/twisted_umbrella_moss_end" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 3, 13, 3 ], + "to": [ 5, 16, 5 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 1, 12, 1 ], + "to": [ 7, 14, 7 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -2, 0, -2 ], + "to": [ -1.999, 13, 14 ], + "rotation": { "origin": [ -2, 0, -2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 9.5, 0, -2 ], + "to": [ 9.501, 13, 14 ], + "rotation": { "origin": [ 9.5, 0, -2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 7, 14, 7 ], + "to": [ 1, 12, 1 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "south": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "west": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" }, + "east": { "uv": [ 6, 8, 0, 6 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 6, 0, 3 ], + "to": [ 6.001, 13, 19 ], + "rotation": { "origin": [ 6, 0, 3 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 4, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 4, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 17.5, 0, 3 ], + "to": [ 17.501, 13, 19 ], + "rotation": { "origin": [ 17.5, 0, 3 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -1, 0, 6 ], + "to": [ -0.999, 11, 22 ], + "rotation": { "origin": [ -1, 0, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#end" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 10.5, 0, 6 ], + "to": [ 10.501, 11, 22 ], + "rotation": { "origin": [ 10.5, 0, 6 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#end" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#end" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_bottom.png b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..4aacbd4652966936997d1cc07839a7033cee1926 GIT binary patch literal 504 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0gXvSK~y+TWBmXB zKZ8bV1H+B#1_rG;z5iK-{xkf3$H;IkrI=BnsOdkulmx@gk~BtiIR+?Tg3@3BlK6V{ zEdxlQ{<@z3zdyVOi-Xu8F_0XxW)MIz00i#Twu21;VHo&$!vYG~rjN&-Fn|nT7WmBY>-igacwmG9NCQYCh>aX8tO9~yd5{=#U}CsH zrMdDyx3(~teKDv6tPqwSKmp3D%#RWiSi=Bh2%Dq`!?$Z+!7%^=AkF+%GGNyrCnl`X z2#T`5A9%r_ZC8&3yU(S6gasf15nZj0TdVP(}yy! z048zX|LmGP|3NfV2n^sZz!qg7S8!=@gPjfnu(*e1J`jMr06EG){)HuBP(XsjVVa@J u;Q%8RYTXo}ECz88H3=9Abo$!8!JOA7O0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0c=S`K~y+TWBmXB zKLfcyqqTv73CboLP~QMXMn(p$IlcdY7|aGa6Cc3p0v6uC48NYg`LEj34CaFjf*SlE zL?Z*N2K@QV%)qHC$nfvmS9l03H&y&+6~YW~tOi_9Enxy$^q);qnBm7;rvD(#+}gqn zzu%$S4gzokK+e-&*YjU|k^)HO-E%gi_j0`Xml1g(WSm4ilPO$A?u3cx~w~_%H4DtfVBCtXr zz?zUiwjpa4@sS2=2DuJdGYp`(!093b!@Y$~|3R96K6}CNpsx4v(89X&4$oK%=#R0RR_vrn&^nO1A(2 N002ovPDHLkV1mT&zq$Yb literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_small.png b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_small.png new file mode 100644 index 0000000000000000000000000000000000000000..82d1c7e6686205153ce8fae66ab26ca6c3e2b874 GIT binary patch literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!JnQkjv*HQ$$$R;w`W#u;Pjfz+t$d~($?gm@*p@YZ%n{ zjRej#FcnC=xtyL*QMhaR3YLRvnoP?as~jZK74EIbYq0+R-P&!11~c>O3-u!528!*B zyVdw3n4ZPV$bG>ODI>$ya$x=Q`~^Bb4BwhAyBbKdt}qGz$8ITp^QXabW$6ucQN!hxw#?p zXY8*YZeOu~|NnfKc0Tvh$8Cdx*Z~$LhgtXQ5)yV)b0-RLG?>)?{>^;qFy8^T29td? zM-M0{96M0JdtzUWU=oLivA8k&j9zYogE=DXS!|Mr_)@sJ8(Jmy)%^CH!|h;J&j1u; zN;-UqktMFCia9lr-ACc*u3tJl+t%qM%y!I?`0?qv@sw8ShS(49uEw+dv;Wm&Fx#<4 z;z8oW)=dQs#lO=3?=Sz;@A&_}zf2m7;1q@p;u?&L*?9Ia^6)T-eJx&^88`Pm(1#43 Lu6{1-oD!MM6j|f)VafucVO$3q+{#D?;CC4`kT%m$s*du+Ze|~%ib-@O1TaS?83{1OQ1X BpYH$w literal 0 HcmV?d00001 From 5599b1b06f039cc85b17a7bc03f626b60957da8d Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 24 Dec 2020 17:31:31 +0300 Subject: [PATCH 007/463] Some tree updates --- .../features/trees/UmbrellaTreeFeature.java | 71 +++++++++++++++--- .../models/item/twisted_umbrella_moss.json | 6 ++ .../item/twisted_umbrella_moss_tall.json | 6 ++ .../item/twisted_umbrella_moss_large.png | Bin 0 -> 439 bytes .../item/twisted_umbrella_moss_small.png | Bin 0 -> 464 bytes 5 files changed, 71 insertions(+), 12 deletions(-) create mode 100644 src/main/resources/assets/betterend/models/item/twisted_umbrella_moss.json create mode 100644 src/main/resources/assets/betterend/models/item/twisted_umbrella_moss_tall.json create mode 100644 src/main/resources/assets/betterend/textures/item/twisted_umbrella_moss_large.png create mode 100644 src/main/resources/assets/betterend/textures/item/twisted_umbrella_moss_small.png diff --git a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java index 5bcc87d7..5c7f5828 100644 --- a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java @@ -10,6 +10,7 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Material; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockPos.Mutable; import net.minecraft.util.math.MathHelper; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; @@ -17,10 +18,12 @@ import net.minecraft.world.gen.feature.DefaultFeatureConfig; import ru.betterend.blocks.BlockUmbrellaTreeMembrane; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; import ru.betterend.util.SplineHelper; import ru.betterend.util.sdf.SDF; import ru.betterend.util.sdf.operator.SDFFlatWave; +import ru.betterend.util.sdf.operator.SDFScale; import ru.betterend.util.sdf.operator.SDFScale3D; import ru.betterend.util.sdf.operator.SDFSmoothUnion; import ru.betterend.util.sdf.operator.SDFSubtraction; @@ -31,7 +34,6 @@ import ru.betterend.world.features.DefaultFeature; public class UmbrellaTreeFeature extends DefaultFeature { private static final Function REPLACE; - private static final Function IGNORE; private static final List SPLINE; private static final List ROOT; @@ -42,6 +44,7 @@ public class UmbrellaTreeFeature extends DefaultFeature { BlockState wood = EndBlocks.UMBRELLA_TREE.bark.getDefaultState(); BlockState membrane = EndBlocks.UMBRELLA_TREE_MEMBRANE.getDefaultState().with(BlockUmbrellaTreeMembrane.COLOR, 1); BlockState center = EndBlocks.UMBRELLA_TREE_MEMBRANE.getDefaultState().with(BlockUmbrellaTreeMembrane.COLOR, 0); + BlockState fruit = EndBlocks.GLOWING_PILLAR_LUMINOPHOR.getDefaultState(); float size = MHelper.randRange(10, 20, random); int count = (int) (size * 0.15F); @@ -49,17 +52,23 @@ public class UmbrellaTreeFeature extends DefaultFeature { float start = MHelper.randRange(0, MHelper.PI2, random); SDF sdf = null; List
centers = Lists.newArrayList(); + + float scale = 1; + if (config != null) { + scale = MHelper.randRange(1F, 2F, random); + } + for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2 + MHelper.randRange(0, var, random) + start; List spline = SplineHelper.copySpline(SPLINE); float sizeXZ = (size + MHelper.randRange(0, size * 0.5F, random)) * 0.7F; SplineHelper.scale(spline, sizeXZ, sizeXZ * MHelper.randRange(1F, 2F, random), sizeXZ); - SplineHelper.offset(spline, new Vector3f((20 - size) * 0.2F, 0, 0)); + //SplineHelper.offset(spline, new Vector3f((20 - size) * 0.2F, 0, 0)); SplineHelper.rotateSpline(spline, angle); SplineHelper.offsetParts(spline, random, 0.5F, 0, 0.5F); if (SplineHelper.canGenerate(spline, pos, world, REPLACE)) { - SDF branch = SplineHelper.buildSDF(spline, 1.2F, 0.8F, (bpos) -> { + SDF branch = SplineHelper.buildSDF(spline, 1.2F * scale, 0.8F * scale, (bpos) -> { return wood; }); @@ -74,10 +83,9 @@ public class UmbrellaTreeFeature extends DefaultFeature { float pz = MHelper.floor(vec.getZ()) + 0.5F; mem = new SDFTranslate().setTranslate(px, py, pz).setSource(mem); sdf = new SDFSmoothUnion().setRadius(2).setSourceA(sdf).setSourceB(mem); - centers.add(new Center(pos.getX() + (double) px, pos.getZ() + (double) pz, radius)); + centers.add(new Center(pos.getX() + (double) (px * scale), pos.getY() + (double) (py * scale), pos.getZ() + (double) (pz * scale), radius * scale)); vec = spline.get(0); - makeRoots(world, pos.add(vec.getX(), vec.getY() + 2, vec.getZ()), size * 0.3F + 3, random, wood); } } @@ -85,6 +93,10 @@ public class UmbrellaTreeFeature extends DefaultFeature { return false; } + if (scale > 1) { + sdf = new SDFScale().setScale(scale).setSource(sdf); + } + sdf.setReplaceFunction(REPLACE).setPostProcess((info) -> { if (EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateUp()) && EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateDown())) { return EndBlocks.UMBRELLA_TREE.log.getDefaultState(); @@ -105,7 +117,23 @@ public class UmbrellaTreeFeature extends DefaultFeature { return info.getState().with(BlockUmbrellaTreeMembrane.COLOR, color); } return info.getState(); - }).fillRecursiveIgnore(world, pos, IGNORE); + }).fillRecursive(world, pos); + + for (Center c: centers) { + if (!world.getBlockState(new BlockPos(c.px, c.py, c.pz)).isAir()) { + count = random.nextInt(4); + float startAngle = random.nextFloat() * MHelper.PI2; + for (int i = 0; i < count; i++) { + float angle = (float) i / count * MHelper.PI2 + startAngle; + float dist = MHelper.randRange(1.8F, 3.4F, random) * scale; + double px = c.px + Math.sin(angle) * dist; + double pz = c.pz + Math.cos(angle) * dist; + makeFruits(world, px, c.py - 1, pz, random, fruit, scale); + } + } + } + + makeRoots(world, pos.add(0, 2, 0), (size * 0.3F + 3) * scale, random, wood); return true; } @@ -146,6 +174,27 @@ public class UmbrellaTreeFeature extends DefaultFeature { return sphere; } + private void makeFruits(StructureWorldAccess world, double px, double py, double pz, Random random, BlockState fruit, float scale) { + Mutable mut = new Mutable(); + int length = MHelper.floor(MHelper.randRange(1F, 3F, random) * scale + 0.5F); + for (int i = 0; i < length; i++) { + mut.setY(MHelper.floor(py - i)); + //mut.setX(MHelper.floor(px)); + //mut.setZ(MHelper.floor(pz)); + /*if (world.isAir(mut)) { + BlocksHelper.setWithoutUpdate(world, mut, fruit); + }*/ + double radius = (1 - (double) i / length) * 0.5; + for (int j = 0; j < 2; j++) { + mut.setX(MHelper.floor(random.nextGaussian() * radius + px + 0.5)); + mut.setZ(MHelper.floor(random.nextGaussian() * radius + pz + 0.5)); + if (world.isAir(mut)) { + BlocksHelper.setWithoutUpdate(world, mut, fruit); + } + } + } + } + static { SPLINE = Lists.newArrayList( new Vector3f(0.00F, 0.00F, 0.00F), @@ -165,24 +214,22 @@ public class UmbrellaTreeFeature extends DefaultFeature { SplineHelper.offset(ROOT, new Vector3f(0, -0.45F, 0)); REPLACE = (state) -> { - if (state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT)) { + if (state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) || state.isOf(EndBlocks.UMBRELLA_TREE_MEMBRANE)) { return true; } return state.getMaterial().isReplaceable(); }; - - IGNORE = (state) -> { - return EndBlocks.UMBRELLA_TREE.isTreeLog(state); - }; } private class Center { final double px; + final double py; final double pz; final float radius; - Center(double x, double z, float radius) { + Center(double x, double y, double z, float radius) { this.px = x; + this.py = y; this.pz = z; this.radius = radius; } diff --git a/src/main/resources/assets/betterend/models/item/twisted_umbrella_moss.json b/src/main/resources/assets/betterend/models/item/twisted_umbrella_moss.json new file mode 100644 index 00000000..2661165f --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/twisted_umbrella_moss.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/twisted_umbrella_moss_small" + } +} diff --git a/src/main/resources/assets/betterend/models/item/twisted_umbrella_moss_tall.json b/src/main/resources/assets/betterend/models/item/twisted_umbrella_moss_tall.json new file mode 100644 index 00000000..2ec22a77 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/twisted_umbrella_moss_tall.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/twisted_umbrella_moss_large" + } +} diff --git a/src/main/resources/assets/betterend/textures/item/twisted_umbrella_moss_large.png b/src/main/resources/assets/betterend/textures/item/twisted_umbrella_moss_large.png new file mode 100644 index 0000000000000000000000000000000000000000..7925bd0bd237ff5cb6ca4d8850a5f8eaf9d51dcb GIT binary patch literal 439 zcmV;o0Z9IdP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0Zd6mK~y+TWBmXB zKLaIz2}(#dmtU~`8Kn8)t9?1S@U=duDes)j*=EI3~;*0 zz;JINMDx#QFBl&5)xk9&JN-sAgpCmk`}Cm0WbcEP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0cA-1Ym3~EpD(P5CFLh6reE8Ad5h1L2L=rVnzU}hocEyX#PI{0000 Date: Thu, 24 Dec 2020 18:55:01 +0300 Subject: [PATCH 008/463] Moss texture update --- .../features/trees/UmbrellaTreeFeature.java | 5 ++--- .../block/twisted_umbrella_moss_bottom.png | Bin 504 -> 502 bytes .../block/twisted_umbrella_moss_end.png | Bin 471 -> 476 bytes .../block/twisted_umbrella_moss_small.png | Bin 356 -> 360 bytes .../textures/block/twisted_umbrella_moss_up.png | Bin 409 -> 406 bytes 5 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java index 5c7f5828..bb6dda94 100644 --- a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java @@ -118,6 +118,7 @@ public class UmbrellaTreeFeature extends DefaultFeature { } return info.getState(); }).fillRecursive(world, pos); + makeRoots(world, pos.add(0, 2, 0), (size * 0.3F + 3) * scale, random, wood); for (Center c: centers) { if (!world.getBlockState(new BlockPos(c.px, c.py, c.pz)).isAir()) { @@ -133,8 +134,6 @@ public class UmbrellaTreeFeature extends DefaultFeature { } } - makeRoots(world, pos.add(0, 2, 0), (size * 0.3F + 3) * scale, random, wood); - return true; } @@ -149,7 +148,7 @@ public class UmbrellaTreeFeature extends DefaultFeature { SplineHelper.scale(branch, scale); Vector3f last = branch.get(branch.size() - 1); if (world.getBlockState(pos.add(last.getX(), last.getY(), last.getZ())).isIn(EndTags.GEN_TERRAIN)) { - SplineHelper.fillSpline(branch, world, wood, pos, REPLACE); + SplineHelper.fillSplineForce(branch, world, wood, pos, REPLACE); } } } diff --git a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_bottom.png b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_bottom.png index 4aacbd4652966936997d1cc07839a7033cee1926..5bf06f2ce4a1fd733066264b87080fc61d9b0e8f 100644 GIT binary patch delta 426 zcmV;b0agC^1NH-uR)330L_t(IPmNPOO9Md=or@kPA?5=kN-UxrNQ^>SYYV|2U}L96 zDhm}mi5!ZpT3A^KqFw%jrP`)2#zN6T(L!U65YQM_-?)41>uhroEQQ9!8}AX5E)RhM01hskpBj%xdq%T*O}IwKHD%Nf?!jLeSy~mb z`~-bGJ=6W}rmr9WDgdY=ec4amt1ATxpt@?5{-?&}1ED}qy!FH6)$2!~2S`97Y+V&I znc_HndNTtIY=5UDVv|E`SLT=bpqd9XwBJtnlnCtsiddNeYSmm;06=nLI?HVIVG5NI zl6BlDCnFInJ!f+=uA~o>kHJiZ=IMd_Ilcc`h5j@Ae#gjgEv1-I zp{VIUyOadO&5|@mbU6knV1m+M0FwB6^(_NPq5is_|Gz)H2aAK)ATf{}vStuKF#rVa z)V6~S0bv;Uc;p+H50Zll!2yN=AOKPrd3Xim(|P@jU#?we0DpPo&wEa&EGhtp0U;or zRQR7qOOxT}vlk2x`sz@^gD3+)0A>h>(kCz<<|PaRK&Hb23fZQQ$DS~N3}6=c%<${^ z8+dqNgaJqcNF#`i94o8>f?#=&7;<1@xIm@3@;|q>FqnNYs06GKmL5O>%B#$e5))X% z0AvW8qzJ>eYkyzCF#rM}&HPp}VAmigCalp2in6~Sc)^-M8bMgZM;fdd88H3=9Ab Wo$!8!JOA7O0000x@ zKj9&)RA2L-RgeYBLjVi|K(TT?wS)<1(SLRseuf`!nf`+`^Jt4R{C@ujstN(%MuMCN zvH_$BXb8xiObSI!|JkJ^82)^D3|4bJy%5#?Kmd2awX_1pFIQhOfDC`pUp)mSaolZa zX8d{U4WoKXJp%|M1B`^E+)xV^`1^^K0c87^Yu6e0E#$!lgIou)2&@nYuqGssZOEEM zJe9$kL9RpA3h~#ALNy9H$H(i zqHBf$j9933Q-rb@7#8a!g2UrxNg9Sm5YT9CU;qFbqNI*jq*N;a0000mgP_7-aHoH^o$=@OFO2Ff z^$Z}43@{RsN^>Px;Lm$burutFffnvg)YA!`=#kp^o9xei$~ z44}Bc=^_Key@gHxL7IO)d%^IauMWjF7`RalVPm*ppFWg<1u%*8{%64v(89X&4$oK%=#R0RR_vrn&^nO1A(2002ovPDHLkV1gAGo`V1Y diff --git a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_small.png b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_small.png index 82d1c7e6686205153ce8fae66ab26ca6c3e2b874..31630fcd2177f0cab2bd37594858e7bbbb2c0bc0 100644 GIT binary patch delta 283 zcmV+$0p$MV0_XyeR)76TL_t(IPhaL0%bt}UKhZe|N9*yRD^+nRp>v8E8qtF`@zbfzpe+x6)@XC za>#&1P!h^QGT_I}cTg4rfHeNN$H(yb+xnP4~YCw8GdYPUroy_>-!9%bBG8?Q42>yNg0;bu7gc(3` hAT=O)2zxRk02HCJbTTBSMm7Kd002ovPDHLkV1gacdI$gj delta 279 zcmV+y0qFkd0^|aaR)6_PL_t(IPhfMI+9CJ!$HFd>HlyMHDRSOVr;m~H3)SsWY& zgut)oZ=ftp0QQ2@MKBu$s5Dpp2RRqn`7oy=8_0w%h%GSX{Mx~$z?=@^gDeGE!UPh0 zd$;F5NDyQj$X1vlFaro+u>_L)di5<>45SC7mr263m=Poh5`eLhT>*0$Of$$}kXjI1 d!nBwX0G8E%>=3%&=o0_{002ovPDHLkV1hDvbAJE; diff --git a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_up.png b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_up.png index 4aaf0e9bd4b005f6a6fda82cda8b991b6745e4cd..1a1dcee84996a52c6efb5a3544045ec7b315205c 100644 GIT binary patch delta 269 zcmV+o0rLKt1C|4jRsk!KS3rM$K6}ByE+qlwVFz#nv}R5CufKZAe-I57A_~9_xRzGH z_~q(L23A2929QBeVK~reZGdBBzz9kZ$UwQF7A)}h6D!#HU#?we;J1(m8~pqIAFxGW zg+Kr@3?mHgHZ(ILYZmcT25Sbn4p}n{pt!*4A_K#{g-!oKnn3~hps#-p#WonYQ4L{Z zxL}_?lz{~>i3^kM$|c;X=gkCrCb6 Date: Thu, 24 Dec 2020 21:02:16 +0300 Subject: [PATCH 009/463] Plants rebalance, umbrella tree clusters --- .../blocks/BlockTwistedUmbrellaMoss.java | 2 +- .../blocks/BlockTwistedUmbrellaMossTall.java | 2 +- .../betterend/blocks/BlockUmbrellaMoss.java | 2 +- .../blocks/BlockUmbrellaMossTall.java | 2 +- .../blocks/BlockUmbrellaTreeCluster.java | 26 ++++++++++++ .../blocks/BlockUmbrellaTreeClusterEmpty.java | 39 ++++++++++++++++++ .../java/ru/betterend/registry/EndBlocks.java | 7 ++++ .../ru/betterend/registry/EndFeatures.java | 2 +- .../world/biome/BiomeUmbrellaJungle.java | 3 +- .../features/trees/UmbrellaTreeFeature.java | 14 ++++--- .../betterend/blockstates/jungle_moss.json | 21 ++++++++++ .../blockstates/jungle_moss_path.json | 10 +++++ .../betterend/models/block/jungle_moss.json | 12 ++++++ .../models/block/jungle_moss_path.json | 7 ++++ .../betterend/models/item/jungle_moss.json | 3 ++ .../models/item/jungle_moss_path.json | 3 ++ .../textures/block/jungle_moss_path_top.png | Bin 0 -> 1793 bytes .../textures/block/jungle_moss_side.png | Bin 0 -> 320 bytes .../textures/block/jungle_moss_top.png | Bin 0 -> 266 bytes .../textures/block/umbrella_tree_cluster.png | Bin 0 -> 281 bytes .../block/umbrella_tree_cluster_empty.png | Bin 0 -> 280 bytes 21 files changed, 142 insertions(+), 13 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/BlockUmbrellaTreeCluster.java create mode 100644 src/main/java/ru/betterend/blocks/BlockUmbrellaTreeClusterEmpty.java create mode 100644 src/main/resources/assets/betterend/blockstates/jungle_moss.json create mode 100644 src/main/resources/assets/betterend/blockstates/jungle_moss_path.json create mode 100644 src/main/resources/assets/betterend/models/block/jungle_moss.json create mode 100644 src/main/resources/assets/betterend/models/block/jungle_moss_path.json create mode 100644 src/main/resources/assets/betterend/models/item/jungle_moss.json create mode 100644 src/main/resources/assets/betterend/models/item/jungle_moss_path.json create mode 100644 src/main/resources/assets/betterend/textures/block/jungle_moss_path_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/jungle_moss_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/jungle_moss_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/umbrella_tree_cluster.png create mode 100644 src/main/resources/assets/betterend/textures/block/umbrella_tree_cluster_empty.png diff --git a/src/main/java/ru/betterend/blocks/BlockTwistedUmbrellaMoss.java b/src/main/java/ru/betterend/blocks/BlockTwistedUmbrellaMoss.java index 5a67a22d..b5e9ce91 100644 --- a/src/main/java/ru/betterend/blocks/BlockTwistedUmbrellaMoss.java +++ b/src/main/java/ru/betterend/blocks/BlockTwistedUmbrellaMoss.java @@ -21,7 +21,7 @@ public class BlockTwistedUmbrellaMoss extends BlockPlant { @Override protected boolean isTerrain(BlockState state) { - return state.getBlock() == EndBlocks.END_MOSS || state.getBlock() == EndBlocks.END_MYCELIUM; + return state.isOf(EndBlocks.END_MOSS) || state.isOf(EndBlocks.END_MYCELIUM) || state.isOf(EndBlocks.JUNGLE_MOSS); } @Environment(EnvType.CLIENT) diff --git a/src/main/java/ru/betterend/blocks/BlockTwistedUmbrellaMossTall.java b/src/main/java/ru/betterend/blocks/BlockTwistedUmbrellaMossTall.java index ac098c6f..c9657bb6 100644 --- a/src/main/java/ru/betterend/blocks/BlockTwistedUmbrellaMossTall.java +++ b/src/main/java/ru/betterend/blocks/BlockTwistedUmbrellaMossTall.java @@ -23,6 +23,6 @@ public class BlockTwistedUmbrellaMossTall extends BlockDoublePlant { @Override protected boolean isTerrain(BlockState state) { - return state.getBlock() == EndBlocks.END_MOSS || state.getBlock() == EndBlocks.END_MYCELIUM; + return state.isOf(EndBlocks.END_MOSS) || state.isOf(EndBlocks.END_MYCELIUM) || state.isOf(EndBlocks.JUNGLE_MOSS); } } diff --git a/src/main/java/ru/betterend/blocks/BlockUmbrellaMoss.java b/src/main/java/ru/betterend/blocks/BlockUmbrellaMoss.java index f70b049c..2edb374a 100644 --- a/src/main/java/ru/betterend/blocks/BlockUmbrellaMoss.java +++ b/src/main/java/ru/betterend/blocks/BlockUmbrellaMoss.java @@ -21,7 +21,7 @@ public class BlockUmbrellaMoss extends BlockPlant { @Override protected boolean isTerrain(BlockState state) { - return state.getBlock() == EndBlocks.END_MOSS || state.getBlock() == EndBlocks.END_MYCELIUM; + return state.isOf(EndBlocks.END_MOSS) || state.isOf(EndBlocks.END_MYCELIUM) || state.isOf(EndBlocks.JUNGLE_MOSS); } @Environment(EnvType.CLIENT) diff --git a/src/main/java/ru/betterend/blocks/BlockUmbrellaMossTall.java b/src/main/java/ru/betterend/blocks/BlockUmbrellaMossTall.java index 1529257a..85333686 100644 --- a/src/main/java/ru/betterend/blocks/BlockUmbrellaMossTall.java +++ b/src/main/java/ru/betterend/blocks/BlockUmbrellaMossTall.java @@ -23,6 +23,6 @@ public class BlockUmbrellaMossTall extends BlockDoublePlant { @Override protected boolean isTerrain(BlockState state) { - return state.getBlock() == EndBlocks.END_MOSS || state.getBlock() == EndBlocks.END_MYCELIUM; + return state.isOf(EndBlocks.END_MOSS) || state.isOf(EndBlocks.END_MYCELIUM) || state.isOf(EndBlocks.JUNGLE_MOSS); } } diff --git a/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeCluster.java b/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeCluster.java new file mode 100644 index 00000000..f2ce5a91 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeCluster.java @@ -0,0 +1,26 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.MaterialColor; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.BooleanProperty; +import ru.betterend.blocks.basis.BlockBase; + +public class BlockUmbrellaTreeCluster extends BlockBase { + public static final BooleanProperty NATURAL = BooleanProperty.of("natural"); + + public BlockUmbrellaTreeCluster() { + super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK) + .materialColor(MaterialColor.PURPLE) + .luminance(15)); + setDefaultState(stateManager.getDefaultState().with(NATURAL, false)); + } + + @Override + protected void appendProperties(StateManager.Builder stateManager) { + stateManager.add(NATURAL); + } +} diff --git a/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeClusterEmpty.java b/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeClusterEmpty.java new file mode 100644 index 00000000..a9bac8c5 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeClusterEmpty.java @@ -0,0 +1,39 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.MaterialColor; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.BooleanProperty; +import net.minecraft.util.math.BlockPos; +import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.BlocksHelper; + +public class BlockUmbrellaTreeClusterEmpty extends BlockBase { + public static final BooleanProperty NATURAL = BooleanProperty.of("natural"); + + public BlockUmbrellaTreeClusterEmpty() { + super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK) + .materialColor(MaterialColor.PURPLE) + .ticksRandomly()); + setDefaultState(stateManager.getDefaultState().with(NATURAL, false)); + } + + @Override + protected void appendProperties(StateManager.Builder stateManager) { + stateManager.add(NATURAL); + } + + @Override + public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + if (state.get(NATURAL) && random.nextInt(16) == 0) { + BlocksHelper.setWithUpdate(world, pos, EndBlocks.UMBRELLA_TREE_CLUSTER.getDefaultState().with(BlockUmbrellaTreeCluster.NATURAL, true)); + } + } +} diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 300656b9..714062d3 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -67,6 +67,8 @@ import ru.betterend.blocks.BlockTwistedUmbrellaMoss; import ru.betterend.blocks.BlockTwistedUmbrellaMossTall; import ru.betterend.blocks.BlockUmbrellaMoss; import ru.betterend.blocks.BlockUmbrellaMossTall; +import ru.betterend.blocks.BlockUmbrellaTreeCluster; +import ru.betterend.blocks.BlockUmbrellaTreeClusterEmpty; import ru.betterend.blocks.BlockUmbrellaTreeMembrane; import ru.betterend.blocks.BlockVentBubbleColumn; import ru.betterend.blocks.EndPortalBlock; @@ -105,6 +107,7 @@ public class EndBlocks { public static final Block SHADOW_GRASS = registerBlock("shadow_grass", new BlockShadowGrass()); public static final Block PINK_MOSS = registerBlock("pink_moss", new BlockTerrain(MaterialColor.PINK)); public static final Block AMBER_MOSS = registerBlock("amber_moss", new BlockTerrain(MaterialColor.ORANGE)); + public static final Block JUNGLE_MOSS = registerBlock("jungle_moss", new BlockTerrain(MaterialColor.ORANGE)); // Roads // public static final Block END_MYCELIUM_PATH = registerBlock("end_mycelium_path", new BlockPath(END_MYCELIUM)); @@ -115,6 +118,7 @@ public class EndBlocks { public static final Block SHADOW_GRASS_PATH = registerBlock("shadow_grass_path", new BlockPath(SHADOW_GRASS)); public static final Block PINK_MOSS_PATH = registerBlock("pink_moss_path", new BlockPath(PINK_MOSS)); public static final Block AMBER_MOSS_PATH = registerBlock("amber_moss_path", new BlockPath(AMBER_MOSS)); + public static final Block JUNGLE_MOSS_PATH = registerBlock("jungle_moss_path", new BlockPath(JUNGLE_MOSS)); // Rocks // public static final StoneMaterial FLAVOLITE = new StoneMaterial("flavolite", MaterialColor.SAND); @@ -238,6 +242,9 @@ public class EndBlocks { // Crops // public static final Block SHADOW_BERRY = registerBlock("shadow_berry", new BlockShadowBerry()); + public static final Block UMBRELLA_TREE_CLUSTER = registerBlock("umbrella_tree_cluster", new BlockUmbrellaTreeCluster()); + public static final Block UMBRELLA_TREE_CLUSTER_EMPTY = registerBlock("umbrella_tree_cluster_empty", new BlockUmbrellaTreeClusterEmpty()); + // Vines // public static final Block DENSE_VINE = registerBlock("dense_vine", new BlockVine(15, true)); public static final Block TWISTED_VINE = registerBlock("twisted_vine", new BlockVine()); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 6526557d..744daf5a 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -79,7 +79,7 @@ public class EndFeatures { public static final EndFeature AMBER_GRASS = new EndFeature("amber_grass", new SinglePlantFeature(EndBlocks.AMBER_GRASS, 6), 9); public static final EndFeature LANCELEAF = new EndFeature("lanceleaf", new LanceleafFeature(), 3); public static final EndFeature GLOW_PILLAR = new EndFeature("glow_pillar", new GlowPillarFeature(), 1); - public static final EndFeature TWISTED_UMBRELLA_MOSS = new EndFeature("twisted_umbrella_moss", new DoublePlantFeature(EndBlocks.TWISTED_UMBRELLA_MOSS, EndBlocks.TWISTED_UMBRELLA_MOSS_TALL, 9), 6); + public static final EndFeature TWISTED_UMBRELLA_MOSS = new EndFeature("twisted_umbrella_moss", new DoublePlantFeature(EndBlocks.TWISTED_UMBRELLA_MOSS, EndBlocks.TWISTED_UMBRELLA_MOSS_TALL, 6), 5); // Vines // public static final EndFeature DENSE_VINE = new EndFeature("dense_vine", new VineFeature(EndBlocks.DENSE_VINE, 24), 3); diff --git a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java index e163b0bf..9e000fc5 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java +++ b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java @@ -10,10 +10,9 @@ public class BiomeUmbrellaJungle extends EndBiome { .setWaterAndFogColor(119, 198, 253) .setFoliageColor(27, 183, 194) .setFogDensity(2.3F) - .setSurface(EndBlocks.END_MOSS) + .setSurface(EndBlocks.JUNGLE_MOSS) .addFeature(EndFeatures.UMBRELLA_TREE) .addFeature(EndFeatures.TWISTED_UMBRELLA_MOSS) - .addFeature(EndFeatures.UMBRELLA_MOSS) .addFeature(EndFeatures.END_LAKE)); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java index bb6dda94..bc137eb7 100644 --- a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java @@ -15,6 +15,7 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.blocks.BlockUmbrellaTreeCluster; import ru.betterend.blocks.BlockUmbrellaTreeMembrane; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -44,7 +45,7 @@ public class UmbrellaTreeFeature extends DefaultFeature { BlockState wood = EndBlocks.UMBRELLA_TREE.bark.getDefaultState(); BlockState membrane = EndBlocks.UMBRELLA_TREE_MEMBRANE.getDefaultState().with(BlockUmbrellaTreeMembrane.COLOR, 1); BlockState center = EndBlocks.UMBRELLA_TREE_MEMBRANE.getDefaultState().with(BlockUmbrellaTreeMembrane.COLOR, 0); - BlockState fruit = EndBlocks.GLOWING_PILLAR_LUMINOPHOR.getDefaultState(); + BlockState fruit = EndBlocks.UMBRELLA_TREE_CLUSTER.getDefaultState().with(BlockUmbrellaTreeCluster.NATURAL, true); float size = MHelper.randRange(10, 20, random); int count = (int) (size * 0.15F); @@ -55,7 +56,7 @@ public class UmbrellaTreeFeature extends DefaultFeature { float scale = 1; if (config != null) { - scale = MHelper.randRange(1F, 2F, random); + scale = MHelper.randRange(1F, 1.7F, random); } for (int i = 0; i < count; i++) { @@ -68,7 +69,8 @@ public class UmbrellaTreeFeature extends DefaultFeature { SplineHelper.offsetParts(spline, random, 0.5F, 0, 0.5F); if (SplineHelper.canGenerate(spline, pos, world, REPLACE)) { - SDF branch = SplineHelper.buildSDF(spline, 1.2F * scale, 0.8F * scale, (bpos) -> { + float rScale = (scale - 1) * 0.4F + 1; + SDF branch = SplineHelper.buildSDF(spline, 1.2F * rScale, 0.8F * rScale, (bpos) -> { return wood; }); @@ -118,11 +120,11 @@ public class UmbrellaTreeFeature extends DefaultFeature { } return info.getState(); }).fillRecursive(world, pos); - makeRoots(world, pos.add(0, 2, 0), (size * 0.3F + 3) * scale, random, wood); + makeRoots(world, pos, (size * 0.5F + 3) * scale, random, wood); for (Center c: centers) { if (!world.getBlockState(new BlockPos(c.px, c.py, c.pz)).isAir()) { - count = random.nextInt(4); + count = MHelper.floor(MHelper.randRange(1F, 5F, random) * scale); float startAngle = random.nextFloat() * MHelper.PI2; for (int i = 0; i < count; i++) { float angle = (float) i / count * MHelper.PI2 + startAngle; @@ -175,7 +177,7 @@ public class UmbrellaTreeFeature extends DefaultFeature { private void makeFruits(StructureWorldAccess world, double px, double py, double pz, Random random, BlockState fruit, float scale) { Mutable mut = new Mutable(); - int length = MHelper.floor(MHelper.randRange(1F, 3F, random) * scale + 0.5F); + int length = MHelper.floor(MHelper.randRange(1F, 5F, random) * scale + 0.5F); for (int i = 0; i < length; i++) { mut.setY(MHelper.floor(py - i)); //mut.setX(MHelper.floor(px)); diff --git a/src/main/resources/assets/betterend/blockstates/jungle_moss.json b/src/main/resources/assets/betterend/blockstates/jungle_moss.json new file mode 100644 index 00000000..f037553e --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/jungle_moss.json @@ -0,0 +1,21 @@ +{ + "variants": { + "": [ + { + "model": "betterend:block/jungle_moss" + }, + { + "model": "betterend:block/jungle_moss", + "y": 90 + }, + { + "model": "betterend:block/jungle_moss", + "y": 180 + }, + { + "model": "betterend:block/jungle_moss", + "y": 270 + } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/jungle_moss_path.json b/src/main/resources/assets/betterend/blockstates/jungle_moss_path.json new file mode 100644 index 00000000..7a5f4580 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/jungle_moss_path.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/jungle_moss_path" }, + { "model": "betterend:block/jungle_moss_path", "y": 90 }, + { "model": "betterend:block/jungle_moss_path", "y": 180 }, + { "model": "betterend:block/jungle_moss_path", "y": 270 } + ] + } +} diff --git a/src/main/resources/assets/betterend/models/block/jungle_moss.json b/src/main/resources/assets/betterend/models/block/jungle_moss.json new file mode 100644 index 00000000..1c9272ba --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_moss.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "block/end_stone", + "east": "betterend:block/jungle_moss_side", + "north": "betterend:block/jungle_moss_side", + "particle": "betterend:block/jungle_moss_side", + "south": "betterend:block/jungle_moss_side", + "up": "betterend:block/jungle_moss_top", + "west": "betterend:block/jungle_moss_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/jungle_moss_path.json b/src/main/resources/assets/betterend/models/block/jungle_moss_path.json new file mode 100644 index 00000000..b9bdda5c --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_moss_path.json @@ -0,0 +1,7 @@ +{ "parent": "betterend:block/path", + "textures": { + "top": "betterend:block/jungle_moss_path_top", + "side": "betterend:block/jungle_moss_side", + "bottom": "block/end_stone" + } +} diff --git a/src/main/resources/assets/betterend/models/item/jungle_moss.json b/src/main/resources/assets/betterend/models/item/jungle_moss.json new file mode 100644 index 00000000..321d91e6 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/jungle_moss.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/jungle_moss" +} diff --git a/src/main/resources/assets/betterend/models/item/jungle_moss_path.json b/src/main/resources/assets/betterend/models/item/jungle_moss_path.json new file mode 100644 index 00000000..a061d63b --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/jungle_moss_path.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/jungle_moss_path" +} diff --git a/src/main/resources/assets/betterend/textures/block/jungle_moss_path_top.png b/src/main/resources/assets/betterend/textures/block/jungle_moss_path_top.png new file mode 100644 index 0000000000000000000000000000000000000000..2eda44229503196b09622385717862f6498cf0df GIT binary patch literal 1793 zcmbVNZD`zN9KRN(-K0bIX-sIdl)r^Oy5I^b4l&MpZAq6cfIESd{D2n}{^JUX1SXaMn`sCj1q?^TqBu|px z^ZWh&FZth7!$bG9Z`!sg6biMc29jxVy*)VETFH58IxmyUMrUBZ7Yc2j4~~}SyEoqv z3T^n*%8dG>`k)4IF>F9=qHv|?5OgTi(_3*2Fot}}L^;cj(Z8OaqbUo<=zS5L)13s$ zTLY6W+B-Rv0h41ug>>&-R8K`C1V!WtGpUn2aj2rszUs+7#$A;sZo8H zN?;dJk+94FUJ@up4f8Um3eql0;CO}Q6qXkmj@LL@6IH7IqluaevsyZNcU_Cz#pt~6 zI~vQD%jIxc3}ZLP@~Wz`oWKeKLlBHNVf#jfvAwPaLlSwwwH)8VHWe@$CNB9gnmDb6 zP;{EKwpULRNf=u(9F`ArK}b~~1WlY%atl>)2v}4=MP&OP!SYS4lgB>x^7sbS&DYln zkksmWQ)5jp#bQ&!^ZUn181;m#iS{xR4r0^D!zCA>{&8ZnD~QI?5-u`)>}D`7GzvA` zuuLTqL1CiQ&V7~*aoM|b)gF{Id=#SvPT&|`U<4_{s~RV165q{<8pqY3I)+wuVoj*3 zMU?BHq-&tz8~+K0K+9scXpoq#qLD+aW9Mk9nMo~y3)m&X#GP1mq3c@8_I$$zD3y%S zBV;$KodX`gQPG~WU7n+I5{fGFe+vF#{MJ*rJ%UM{#u_y3<$?Rs-%$> zMU09}RN(=GL`h`SC}%QUR8~|IMzTCK8f^Eu7WveS!fMvQ6(o!b&jT6BS;iy_MwX>0 zV=7Q2Cl#0g2@>RB(9qQ$(FQD!RBxjGiR?uO>#KrARog-{K+x_n8U%Glkgh+r*2u@Y zl>6>VEv6?(4|`dBe^j zGC^57h=&bkO|3NSzpGY#w`wjm;AGeZ%jT3NH_bVXY(njlDZF*Q=Mgf&zf2|LnVr+6 zbo}T%*CxIYdH11Dt{u4c7X`2M?Ma{8_2lf!XZZ1Ne^_~Nd@$}b+>E~z1cHBQ3{7I$yhmx=FIq=xu0$Eg% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/jungle_moss_side.png b/src/main/resources/assets/betterend/textures/block/jungle_moss_side.png new file mode 100644 index 0000000000000000000000000000000000000000..1bb0d8c130bde222b4f614ccc435e9f0dde84f91 GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF{vJJ9+1UZ;1OBOz`%DHgc*`7%f%%LK6hapczP3a+9`=w0{OPMDyF|P>zDR<)_?|12Uk4|jwDSFnZyF;9f zk8$CY2Q`TuGd6eohj+EhuYLT$^Wu-6-RoX4_+Bb|5~u%BH0XYp*}*Si&Y9k+**|A{dnoo!P(hfddpUEmQhqoz4 zqG((36t2U9YkpWbJ?FM#dBd%9+vAtTn0uz-FGlDm$Me!ke%=^x^wZ=Z^nxmp9ahc znESd))>)=IR=(L>+H11ml_koqGh1h*xy#9S@(RT}$2eXupUlI$&RtkqVeRs;0E3-X tY)gcX2D-iZ{%ILY_|Fr2!WY#C|Kh)BENJzFO?ExV#h$KyF6*2UngDM2Ss(xa literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_cluster_empty.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_cluster_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..958ce8981326c9fa6a3eec2a9ef07d6d98e3c73e GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF~aSV~TEPLi4=Me)Qmx~t@-wU0dU{+?Rr?ArDkVN Date: Thu, 24 Dec 2020 21:30:19 +0300 Subject: [PATCH 010/463] Grass, moss, fixes --- .../integration/byg/OldBulbisTreeFeature.java | 1 - .../java/ru/betterend/registry/EndBlocks.java | 1 + .../java/ru/betterend/registry/EndFeatures.java | 1 + .../world/biome/BiomeUmbrellaJungle.java | 1 + .../world/features/trees/UmbrellaTreeFeature.java | 5 ----- .../betterend/blockstates/jungle_grass.json | 10 ++++++++++ .../betterend/models/block/jungle_grass_01.json | 6 ++++++ .../betterend/models/block/jungle_grass_02.json | 6 ++++++ .../betterend/models/block/jungle_grass_03.json | 6 ++++++ .../betterend/models/block/jungle_grass_04.json | 6 ++++++ .../betterend/models/item/jungle_grass.json | 6 ++++++ .../betterend/textures/block/jungle_grass.png | Bin 0 -> 471 bytes 12 files changed, 43 insertions(+), 6 deletions(-) create mode 100644 src/main/resources/assets/betterend/blockstates/jungle_grass.json create mode 100644 src/main/resources/assets/betterend/models/block/jungle_grass_01.json create mode 100644 src/main/resources/assets/betterend/models/block/jungle_grass_02.json create mode 100644 src/main/resources/assets/betterend/models/block/jungle_grass_03.json create mode 100644 src/main/resources/assets/betterend/models/block/jungle_grass_04.json create mode 100644 src/main/resources/assets/betterend/models/item/jungle_grass.json create mode 100644 src/main/resources/assets/betterend/textures/block/jungle_grass.png diff --git a/src/main/java/ru/betterend/integration/byg/OldBulbisTreeFeature.java b/src/main/java/ru/betterend/integration/byg/OldBulbisTreeFeature.java index 3fb5fc5f..e45c511f 100644 --- a/src/main/java/ru/betterend/integration/byg/OldBulbisTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/OldBulbisTreeFeature.java @@ -115,7 +115,6 @@ public class OldBulbisTreeFeature extends DefaultFeature { sphere = new SDFTranslate().setTranslate(0, offsetY, 0).setSource(sphere); int leafCount = (int) (radius * 0.5F) + 2; - System.out.println("Origin " + pos); for (int i = 0; i < 4; i++) { float angle = (float) i / 4 * MHelper.PI2; List spline = SplineHelper.copySpline(LEAF); diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 714062d3..1c7f1cf6 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -194,6 +194,7 @@ public class EndBlocks { public static final Block AMBER_GRASS = registerBlock("amber_grass", new BlockTerrainPlant(AMBER_MOSS)); public static final Block TWISTED_UMBRELLA_MOSS = registerBlock("twisted_umbrella_moss", new BlockTwistedUmbrellaMoss()); public static final Block TWISTED_UMBRELLA_MOSS_TALL = registerBlock("twisted_umbrella_moss_tall", new BlockTwistedUmbrellaMossTall()); + public static final Block JUNGLE_GRASS = registerBlock("jungle_grass", new BlockTerrainPlant(JUNGLE_MOSS)); public static final Block BLUE_VINE_SEED = registerBlock("blue_vine_seed", new BlockBlueVineSeed()); public static final Block BLUE_VINE = registerBlockNI("blue_vine", new BlockBlueVine()); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 744daf5a..a0ca0513 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -80,6 +80,7 @@ public class EndFeatures { public static final EndFeature LANCELEAF = new EndFeature("lanceleaf", new LanceleafFeature(), 3); public static final EndFeature GLOW_PILLAR = new EndFeature("glow_pillar", new GlowPillarFeature(), 1); public static final EndFeature TWISTED_UMBRELLA_MOSS = new EndFeature("twisted_umbrella_moss", new DoublePlantFeature(EndBlocks.TWISTED_UMBRELLA_MOSS, EndBlocks.TWISTED_UMBRELLA_MOSS_TALL, 6), 5); + public static final EndFeature JUNGLE_GRASS = new EndFeature("jungle_grass", new CavePlantFeature(EndBlocks.JUNGLE_GRASS, 7), 8); // Vines // public static final EndFeature DENSE_VINE = new EndFeature("dense_vine", new VineFeature(EndBlocks.DENSE_VINE, 24), 3); diff --git a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java index 9e000fc5..0c931926 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java +++ b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java @@ -13,6 +13,7 @@ public class BiomeUmbrellaJungle extends EndBiome { .setSurface(EndBlocks.JUNGLE_MOSS) .addFeature(EndFeatures.UMBRELLA_TREE) .addFeature(EndFeatures.TWISTED_UMBRELLA_MOSS) + .addFeature(EndFeatures.JUNGLE_GRASS) .addFeature(EndFeatures.END_LAKE)); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java index bc137eb7..d86d9109 100644 --- a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java @@ -180,11 +180,6 @@ public class UmbrellaTreeFeature extends DefaultFeature { int length = MHelper.floor(MHelper.randRange(1F, 5F, random) * scale + 0.5F); for (int i = 0; i < length; i++) { mut.setY(MHelper.floor(py - i)); - //mut.setX(MHelper.floor(px)); - //mut.setZ(MHelper.floor(pz)); - /*if (world.isAir(mut)) { - BlocksHelper.setWithoutUpdate(world, mut, fruit); - }*/ double radius = (1 - (double) i / length) * 0.5; for (int j = 0; j < 2; j++) { mut.setX(MHelper.floor(random.nextGaussian() * radius + px + 0.5)); diff --git a/src/main/resources/assets/betterend/blockstates/jungle_grass.json b/src/main/resources/assets/betterend/blockstates/jungle_grass.json new file mode 100644 index 00000000..df61d348 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/jungle_grass.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/jungle_grass_01" }, + { "model": "betterend:block/jungle_grass_02" }, + { "model": "betterend:block/jungle_grass_03" }, + { "model": "betterend:block/jungle_grass_04" } + ] + } +} diff --git a/src/main/resources/assets/betterend/models/block/jungle_grass_01.json b/src/main/resources/assets/betterend/models/block/jungle_grass_01.json new file mode 100644 index 00000000..f3dd5f0e --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_grass_01.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/jungle_grass" + } +} diff --git a/src/main/resources/assets/betterend/models/block/jungle_grass_02.json b/src/main/resources/assets/betterend/models/block/jungle_grass_02.json new file mode 100644 index 00000000..4d9754ee --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_grass_02.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/jungle_grass" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_grass_03.json b/src/main/resources/assets/betterend/models/block/jungle_grass_03.json new file mode 100644 index 00000000..23e76255 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_grass_03.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/jungle_grass" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_grass_04.json b/src/main/resources/assets/betterend/models/block/jungle_grass_04.json new file mode 100644 index 00000000..75bdec30 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_grass_04.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/jungle_grass" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/jungle_grass.json b/src/main/resources/assets/betterend/models/item/jungle_grass.json new file mode 100644 index 00000000..0ea9f6c3 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/jungle_grass.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/jungle_grass" + } +} diff --git a/src/main/resources/assets/betterend/textures/block/jungle_grass.png b/src/main/resources/assets/betterend/textures/block/jungle_grass.png new file mode 100644 index 0000000000000000000000000000000000000000..56a394f12c97bfa9ea6541a4e22d277a1d4774fe GIT binary patch literal 471 zcmV;|0Vw{7P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0c=S`K~y+TwNO1v z13?hoy(BhKLIyL+QM1g9ELgc z!a?Or?6(tSCWeQ-U)z$!X6@%oCo95$coI14GkZG<22L6$vFVX1kbxDrKyo!`v;vM) zY}VD{`B93z8gK$w=gk`&k%59(4V(&~TF{ZH^tcM}=Vb2KTHT~zzRk_@wy9{2sDnaX z#QgO%3JHC8BvJ;5uR%aJ81KYd!9G!QwNo{e9${kCfgT9Zp9V% Date: Thu, 24 Dec 2020 21:45:12 +0300 Subject: [PATCH 011/463] Density fixes --- .../ru/betterend/registry/EndFeatures.java | 2 +- .../features/trees/UmbrellaTreeFeature.java | 25 +++++++++--------- .../betterend/blockstates/jungle_grass.json | 10 ++++++- .../models/block/crop_block_inverted.json | 16 +++++------ .../models/block/jungle_grass_05.json | 6 +++++ .../models/block/jungle_grass_06.json | 6 +++++ .../models/block/jungle_grass_07.json | 6 +++++ .../models/block/jungle_grass_08.json | 6 +++++ .../models/block/jungle_grass_09.json | 6 +++++ .../models/block/jungle_grass_10.json | 6 +++++ .../models/block/jungle_grass_11.json | 6 +++++ .../models/block/jungle_grass_12.json | 6 +++++ .../textures/block/jungle_grass_2.png | Bin 0 -> 485 bytes 13 files changed, 78 insertions(+), 23 deletions(-) create mode 100644 src/main/resources/assets/betterend/models/block/jungle_grass_05.json create mode 100644 src/main/resources/assets/betterend/models/block/jungle_grass_06.json create mode 100644 src/main/resources/assets/betterend/models/block/jungle_grass_07.json create mode 100644 src/main/resources/assets/betterend/models/block/jungle_grass_08.json create mode 100644 src/main/resources/assets/betterend/models/block/jungle_grass_09.json create mode 100644 src/main/resources/assets/betterend/models/block/jungle_grass_10.json create mode 100644 src/main/resources/assets/betterend/models/block/jungle_grass_11.json create mode 100644 src/main/resources/assets/betterend/models/block/jungle_grass_12.json create mode 100644 src/main/resources/assets/betterend/textures/block/jungle_grass_2.png diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index a0ca0513..34ba572d 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -80,7 +80,7 @@ public class EndFeatures { public static final EndFeature LANCELEAF = new EndFeature("lanceleaf", new LanceleafFeature(), 3); public static final EndFeature GLOW_PILLAR = new EndFeature("glow_pillar", new GlowPillarFeature(), 1); public static final EndFeature TWISTED_UMBRELLA_MOSS = new EndFeature("twisted_umbrella_moss", new DoublePlantFeature(EndBlocks.TWISTED_UMBRELLA_MOSS, EndBlocks.TWISTED_UMBRELLA_MOSS_TALL, 6), 5); - public static final EndFeature JUNGLE_GRASS = new EndFeature("jungle_grass", new CavePlantFeature(EndBlocks.JUNGLE_GRASS, 7), 8); + public static final EndFeature JUNGLE_GRASS = new EndFeature("jungle_grass", new SinglePlantFeature(EndBlocks.JUNGLE_GRASS, 7, 3), 8); // Vines // public static final EndFeature DENSE_VINE = new EndFeature("dense_vine", new VineFeature(EndBlocks.DENSE_VINE, 24), 3); diff --git a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java index d86d9109..37982ad1 100644 --- a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java @@ -10,6 +10,7 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Material; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; import net.minecraft.util.math.BlockPos.Mutable; import net.minecraft.util.math.MathHelper; import net.minecraft.world.StructureWorldAccess; @@ -124,14 +125,14 @@ public class UmbrellaTreeFeature extends DefaultFeature { for (Center c: centers) { if (!world.getBlockState(new BlockPos(c.px, c.py, c.pz)).isAir()) { - count = MHelper.floor(MHelper.randRange(1F, 5F, random) * scale); + count = MHelper.floor(MHelper.randRange(5F, 10F, random) * scale); float startAngle = random.nextFloat() * MHelper.PI2; for (int i = 0; i < count; i++) { float angle = (float) i / count * MHelper.PI2 + startAngle; - float dist = MHelper.randRange(1.8F, 3.4F, random) * scale; + float dist = MHelper.randRange(1.5F, 2.5F, random) * scale; double px = c.px + Math.sin(angle) * dist; double pz = c.pz + Math.cos(angle) * dist; - makeFruits(world, px, c.py - 1, pz, random, fruit, scale); + makeFruits(world, px, c.py - 1, pz, fruit, scale); } } } @@ -175,18 +176,16 @@ public class UmbrellaTreeFeature extends DefaultFeature { return sphere; } - private void makeFruits(StructureWorldAccess world, double px, double py, double pz, Random random, BlockState fruit, float scale) { - Mutable mut = new Mutable(); - int length = MHelper.floor(MHelper.randRange(1F, 5F, random) * scale + 0.5F); - for (int i = 0; i < length; i++) { - mut.setY(MHelper.floor(py - i)); - double radius = (1 - (double) i / length) * 0.5; - for (int j = 0; j < 2; j++) { - mut.setX(MHelper.floor(random.nextGaussian() * radius + px + 0.5)); - mut.setZ(MHelper.floor(random.nextGaussian() * radius + pz + 0.5)); - if (world.isAir(mut)) { + private void makeFruits(StructureWorldAccess world, double px, double py, double pz, BlockState fruit, float scale) { + Mutable mut = new Mutable().set(px, py, pz); + for (int i = 0; i < 8; i++) { + mut.move(Direction.DOWN); + if (world.isAir(mut)) { + BlockState state = world.getBlockState(mut.up()); + if (state.isOf(EndBlocks.UMBRELLA_TREE_MEMBRANE) && state.get(BlockUmbrellaTreeMembrane.COLOR) < 2) { BlocksHelper.setWithoutUpdate(world, mut, fruit); } + break; } } } diff --git a/src/main/resources/assets/betterend/blockstates/jungle_grass.json b/src/main/resources/assets/betterend/blockstates/jungle_grass.json index df61d348..ef0108d7 100644 --- a/src/main/resources/assets/betterend/blockstates/jungle_grass.json +++ b/src/main/resources/assets/betterend/blockstates/jungle_grass.json @@ -4,7 +4,15 @@ { "model": "betterend:block/jungle_grass_01" }, { "model": "betterend:block/jungle_grass_02" }, { "model": "betterend:block/jungle_grass_03" }, - { "model": "betterend:block/jungle_grass_04" } + { "model": "betterend:block/jungle_grass_04" }, + { "model": "betterend:block/jungle_grass_05" }, + { "model": "betterend:block/jungle_grass_06" }, + { "model": "betterend:block/jungle_grass_07" }, + { "model": "betterend:block/jungle_grass_08" }, + { "model": "betterend:block/jungle_grass_09" }, + { "model": "betterend:block/jungle_grass_10" }, + { "model": "betterend:block/jungle_grass_11" }, + { "model": "betterend:block/jungle_grass_12" } ] } } diff --git a/src/main/resources/assets/betterend/models/block/crop_block_inverted.json b/src/main/resources/assets/betterend/models/block/crop_block_inverted.json index b7794ac1..84d0e038 100644 --- a/src/main/resources/assets/betterend/models/block/crop_block_inverted.json +++ b/src/main/resources/assets/betterend/models/block/crop_block_inverted.json @@ -4,32 +4,32 @@ "particle": "#texture" }, "elements": [ - { "from": [ 4, 0, 0 ], - "to": [ 4, 16, 16 ], + { "from": [ 4.1, 0, 0 ], + "to": [ 4.1, 16, 16 ], "shade": false, "faces": { "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, "east": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" } } }, - { "from": [ 12, 0, 0 ], - "to": [ 12, 16, 16 ], + { "from": [ 11.9, 0, 0 ], + "to": [ 11.9, 16, 16 ], "shade": false, "faces": { "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, "east": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" } } }, - { "from": [ 0, 0, 4 ], - "to": [ 16, 16, 4 ], + { "from": [ 0, 0, 4.1 ], + "to": [ 16, 16, 4.1 ], "shade": false, "faces": { "north": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, "south": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" } } }, - { "from": [ 0, 0, 12 ], - "to": [ 16, 16, 12 ], + { "from": [ 0, 0, 11.9 ], + "to": [ 16, 16, 11.9 ], "shade": false, "faces": { "north": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, diff --git a/src/main/resources/assets/betterend/models/block/jungle_grass_05.json b/src/main/resources/assets/betterend/models/block/jungle_grass_05.json new file mode 100644 index 00000000..b1a6657a --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_grass_05.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/jungle_grass_2" + } +} diff --git a/src/main/resources/assets/betterend/models/block/jungle_grass_06.json b/src/main/resources/assets/betterend/models/block/jungle_grass_06.json new file mode 100644 index 00000000..26278b2a --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_grass_06.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/jungle_grass_2" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_grass_07.json b/src/main/resources/assets/betterend/models/block/jungle_grass_07.json new file mode 100644 index 00000000..cf71ab85 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_grass_07.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/jungle_grass_2" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_grass_08.json b/src/main/resources/assets/betterend/models/block/jungle_grass_08.json new file mode 100644 index 00000000..df08990e --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_grass_08.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/jungle_grass_2" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_grass_09.json b/src/main/resources/assets/betterend/models/block/jungle_grass_09.json new file mode 100644 index 00000000..e1c9fb41 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_grass_09.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/twisted_umbrella_moss_small" + } +} diff --git a/src/main/resources/assets/betterend/models/block/jungle_grass_10.json b/src/main/resources/assets/betterend/models/block/jungle_grass_10.json new file mode 100644 index 00000000..ec90bfa3 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_grass_10.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/twisted_umbrella_moss_small" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_grass_11.json b/src/main/resources/assets/betterend/models/block/jungle_grass_11.json new file mode 100644 index 00000000..4e3e45c4 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_grass_11.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/twisted_umbrella_moss_small" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_grass_12.json b/src/main/resources/assets/betterend/models/block/jungle_grass_12.json new file mode 100644 index 00000000..4ca93a64 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_grass_12.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/twisted_umbrella_moss_small" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/jungle_grass_2.png b/src/main/resources/assets/betterend/textures/block/jungle_grass_2.png new file mode 100644 index 0000000000000000000000000000000000000000..8ee375cd7c79cb6804c1b73817dbd856feadafb3 GIT binary patch literal 485 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0eVS9K~y+Tt&z_z zLqQbA=S<6jD!P)cnh-&xp1}i%gr!vzmQ5roVb>6=5{s^c*je@&JOV|OjkF8hY0;8f z+K%~7?~J;x4Svbw%-r+uJLi&8O8f=s+F$d(1&ByY9qqBj8Qb1eIOhArPTGz9gj{Qx zJlqw9l@zSfmi@SE^DP!w1z4t8Xgrs($)G3l^P;)H=+=gn>IKCv7T0~d1M-uqJF52z zVHBH)(ZKcc8e4-Mp<6bR{bXxDmKliWxDg{wV7E+qKQ?G zc5W;D_JZWL6SPHxBXbEAnV+V Date: Thu, 24 Dec 2020 22:23:42 +0300 Subject: [PATCH 012/463] More biome plants & model console error fix --- .../blocks/BlockVentBubbleColumn.java | 23 ++++++++++++++++++- .../world/biome/BiomeUmbrellaJungle.java | 8 ++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/BlockVentBubbleColumn.java b/src/main/java/ru/betterend/blocks/BlockVentBubbleColumn.java index 7391c96b..f50a6b06 100644 --- a/src/main/java/ru/betterend/blocks/BlockVentBubbleColumn.java +++ b/src/main/java/ru/betterend/blocks/BlockVentBubbleColumn.java @@ -1,5 +1,6 @@ package ru.betterend.blocks; +import java.io.Reader; import java.util.Random; import net.fabricmc.api.EnvType; @@ -21,18 +22,22 @@ import net.minecraft.particle.ParticleTypes; import net.minecraft.server.world.ServerWorld; import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvents; +import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; +import net.minecraft.util.registry.Registry; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; import net.minecraft.world.BlockView; import net.minecraft.world.World; import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; -public class BlockVentBubbleColumn extends Block implements FluidDrainable, FluidFillable { +public class BlockVentBubbleColumn extends Block implements FluidDrainable, FluidFillable, BlockPatterned { public BlockVentBubbleColumn() { super(FabricBlockSettings.of(Material.BUBBLE_COLUMN).nonOpaque().noCollision().dropsNothing()); } @@ -120,4 +125,20 @@ public class BlockVentBubbleColumn extends Block implements FluidDrainable, Flui public FluidState getFluidState(BlockState state) { return Fluids.WATER.getStill(false); } + + @Override + public String getStatesPattern(Reader data) { + String block = Registry.BLOCK.getId(this).getPath(); + return Patterns.createJson(data, block, block); + } + + @Override + public String getModelPattern(String block) { + return Patterns.createJson(Patterns.BLOCK_EMPTY, "stone", "stone"); + } + + @Override + public Identifier statePatternId() { + return Patterns.STATE_SIMPLE; + } } diff --git a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java index 0c931926..9a8cc656 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java +++ b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java @@ -11,9 +11,15 @@ public class BiomeUmbrellaJungle extends EndBiome { .setFoliageColor(27, 183, 194) .setFogDensity(2.3F) .setSurface(EndBlocks.JUNGLE_MOSS) + .addFeature(EndFeatures.END_LAKE) .addFeature(EndFeatures.UMBRELLA_TREE) .addFeature(EndFeatures.TWISTED_UMBRELLA_MOSS) .addFeature(EndFeatures.JUNGLE_GRASS) - .addFeature(EndFeatures.END_LAKE)); + .addFeature(EndFeatures.CYAN_MOSS) + .addFeature(EndFeatures.CYAN_MOSS_WOOD) + .addFeature(EndFeatures.CHARNIA_CYAN) + .addFeature(EndFeatures.CHARNIA_GREEN) + .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) + .addFeature(EndFeatures.CHARNIA_RED_RARE)); } } \ No newline at end of file From f42af8bd67ce1a23c1efb83bc4f578378a76bd2e Mon Sep 17 00:00:00 2001 From: Aleksey Date: Thu, 24 Dec 2020 22:47:22 +0300 Subject: [PATCH 013/463] Portal pos finding optimisation, Overworld island feature for portals --- .../ru/betterend/blocks/EndPortalBlock.java | 5 ++++- .../ru/betterend/registry/EndFeatures.java | 2 ++ .../ru/betterend/rituals/EternalRitual.java | 6 +++++- .../betterend/world/features/EndFeature.java | 5 +++++ .../world/features/OverworldIslandFeature.java | 18 ++++++++++++++---- 5 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index d4899cc2..950014f3 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -17,6 +17,7 @@ import net.minecraft.util.BlockRotation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.util.registry.Registry; +import net.minecraft.world.Heightmap; import net.minecraft.world.World; import net.minecraft.world.WorldAccess; import net.minecraft.world.dimension.DimensionType; @@ -100,7 +101,9 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable for (int step = 1; step < 64; step++) { for (int i = 0; i < step; i++) { checkPos.setY(5); - while(checkPos.getY() < world.getHeight()) { + int ceil = world.getChunk(basePos).sampleHeightmap(Heightmap.Type.WORLD_SURFACE, checkPos.getX(), checkPos.getZ()) + 1; + if (ceil < 5) continue; + while(checkPos.getY() < ceil) { BlockState state = world.getBlockState(checkPos); if(state.isOf(this)) { int offStep; diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index a0ca0513..6605cd69 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -23,6 +23,7 @@ import ru.betterend.world.features.GlowPillarFeature; import ru.betterend.world.features.HydraluxFeature; import ru.betterend.world.features.LanceleafFeature; import ru.betterend.world.features.MengerSpongeFeature; +import ru.betterend.world.features.OverworldIslandFeature; import ru.betterend.world.features.SinglePlantFeature; import ru.betterend.world.features.UnderwaterPlantFeature; import ru.betterend.world.features.VineFeature; @@ -116,6 +117,7 @@ public class EndFeatures { public static final EndFeature CHARNIA_GREEN = new EndFeature("charnia_green", new CharniaFeature(EndBlocks.CHARNIA_GREEN), 10); public static final EndFeature MENGER_SPONGE = new EndFeature("menger_sponge", new MengerSpongeFeature(5), 1); public static final EndFeature CHARNIA_RED_RARE = new EndFeature("charnia_red_rare", new CharniaFeature(EndBlocks.CHARNIA_RED), 2); + public static final EndFeature OVERWORLD_ISLAND = EndFeature.makeOverworldIsland("overworld_island", new OverworldIslandFeature()); // Terrain // public static final EndFeature END_LAKE = EndFeature.makeLakeFeature("end_lake", new EndLakeFeature(), 4); diff --git a/src/main/java/ru/betterend/rituals/EternalRitual.java b/src/main/java/ru/betterend/rituals/EternalRitual.java index b98f404b..d1cda0e6 100644 --- a/src/main/java/ru/betterend/rituals/EternalRitual.java +++ b/src/main/java/ru/betterend/rituals/EternalRitual.java @@ -32,6 +32,7 @@ import ru.betterend.blocks.EndPortalBlock; import ru.betterend.blocks.RunedFlavolite; import ru.betterend.blocks.entities.EternalPedestalEntity; import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndTags; public class EternalRitual { @@ -250,7 +251,9 @@ public class EternalRitual { for (int step = 1; step < 64; step++) { for (int i = 0; i < step; i++) { checkPos.setY(5); - while(checkPos.getY() < world.getHeight()) { + int ceil = targetWorld.getChunk(basePos).sampleHeightmap(Heightmap.Type.WORLD_SURFACE, checkPos.getX(), checkPos.getZ()) + 1; + if (ceil < 5) continue; + while(checkPos.getY() < ceil) { if(checkIsAreaValid(targetWorld, checkPos, portalAxis)) { EternalRitual.generatePortal(targetWorld, checkPos, portalAxis); if (portalAxis.equals(Direction.Axis.X)) { @@ -270,6 +273,7 @@ public class EternalRitual { ConfiguredFeatures.END_ISLAND.generate(targetWorld, targetWorld.getChunkManager().getChunkGenerator(), new Random(basePos.asLong()), basePos.down()); } else { basePos.setY(targetWorld.getChunk(basePos).sampleHeightmap(Heightmap.Type.WORLD_SURFACE, basePos.getX(), basePos.getZ()) + 1); + EndFeatures.OVERWORLD_ISLAND.getFeatureConfigured().generate(targetWorld, targetWorld.getChunkManager().getChunkGenerator(), new Random(basePos.asLong()), basePos.down()); } EternalRitual.generatePortal(targetWorld, basePos, portalAxis); if (portalAxis.equals(Direction.Axis.X)) { diff --git a/src/main/java/ru/betterend/world/features/EndFeature.java b/src/main/java/ru/betterend/world/features/EndFeature.java index 23e81e3d..1e2e9aed 100644 --- a/src/main/java/ru/betterend/world/features/EndFeature.java +++ b/src/main/java/ru/betterend/world/features/EndFeature.java @@ -114,6 +114,11 @@ public class EndFeature { return new EndFeature(name, feature, GenerationStep.Feature.RAW_GENERATION, configured); } + public static EndFeature makeOverworldIsland(String name, Feature feature) { + ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT); + return new EndFeature(name, feature, GenerationStep.Feature.RAW_GENERATION, configured); + } + public Feature getFeature() { return feature; } diff --git a/src/main/java/ru/betterend/world/features/OverworldIslandFeature.java b/src/main/java/ru/betterend/world/features/OverworldIslandFeature.java index c9f65566..16cd78b0 100644 --- a/src/main/java/ru/betterend/world/features/OverworldIslandFeature.java +++ b/src/main/java/ru/betterend/world/features/OverworldIslandFeature.java @@ -17,21 +17,31 @@ import ru.betterend.util.sdf.primitive.SDFCapedCone; public class OverworldIslandFeature extends DefaultFeature { private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(412); private static final Mutable CENTER = new Mutable(); - private static final SDF FUNCTION; + private static final SDF ISLAND; @Override public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { CENTER.set(pos); - FUNCTION.fillRecursive(world, pos.down()); + ISLAND.fillRecursive(world, pos.down()); return true; } static { - SDF cone = new SDFCapedCone().setRadius1(0).setRadius2(4).setHeight(4).setBlock(Blocks.STONE); + SDF cone = new SDFCapedCone().setRadius1(0).setRadius2(6).setHeight(4).setBlock((pos) -> { + if (pos.getY() == CENTER.getY()) return Blocks.GRASS_BLOCK.getDefaultState(); + if (pos.getY() == CENTER.getY() - 1) { + return Blocks.DIRT.getDefaultState(); + } else if (pos.getY() == CENTER.getY() - Math.round(2.0 * Math.random())) { + return Blocks.DIRT.getDefaultState(); + } + return Blocks.STONE.getDefaultState(); + }); cone = new SDFTranslate().setTranslate(0, -3, 0).setSource(cone); cone = new SDFDisplacement().setFunction((pos) -> { return (float) NOISE.eval(CENTER.getX() + pos.getX(), CENTER.getY() + pos.getY(), CENTER.getZ() + pos.getZ()); + }).setSource(cone).setReplaceFunction(state -> { + return state.isOf(Blocks.WATER) || state.getMaterial().isReplaceable(); }); - FUNCTION = cone; + ISLAND = cone; } } From 23a1bbba088ab1b3a4b2f1015e6ef8537b978c55 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 25 Dec 2020 11:09:46 +0300 Subject: [PATCH 014/463] Jellyshroom --- .../blocks/BlockSmallJellyshroom.java | 70 ++++++++ .../java/ru/betterend/registry/EndBlocks.java | 4 + .../blockstates/small_jellyshroom.json | 27 ++++ .../assets/betterend/lang/en_us.json | 12 +- .../assets/betterend/lang/ru_ru.json | 12 +- .../models/block/small_jellyshroom_floor.json | 149 ++++++++++++++++++ .../block/small_jellyshroom_wall_1.json | 96 +++++++++++ .../block/small_jellyshroom_wall_2.json | 109 +++++++++++++ .../textures/block/jellyshroom_cap.png | Bin 0 -> 2172 bytes .../block/jellyshroom_wall_stem_1.png | Bin 0 -> 295 bytes .../block/jellyshroom_wall_stem_2.png | Bin 0 -> 314 bytes .../block/jellyshroom_wall_stem_3.png | Bin 0 -> 274 bytes .../textures/block/small_jellyshroom_stem.png | Bin 0 -> 419 bytes 13 files changed, 477 insertions(+), 2 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/BlockSmallJellyshroom.java create mode 100644 src/main/resources/assets/betterend/blockstates/small_jellyshroom.json create mode 100644 src/main/resources/assets/betterend/models/block/small_jellyshroom_floor.json create mode 100644 src/main/resources/assets/betterend/models/block/small_jellyshroom_wall_1.json create mode 100644 src/main/resources/assets/betterend/models/block/small_jellyshroom_wall_2.json create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_cap.png create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_wall_stem_1.png create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_wall_stem_2.png create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_wall_stem_3.png create mode 100644 src/main/resources/assets/betterend/textures/block/small_jellyshroom_stem.png diff --git a/src/main/java/ru/betterend/blocks/BlockSmallJellyshroom.java b/src/main/java/ru/betterend/blocks/BlockSmallJellyshroom.java new file mode 100644 index 00000000..a28878bd --- /dev/null +++ b/src/main/java/ru/betterend/blocks/BlockSmallJellyshroom.java @@ -0,0 +1,70 @@ +package ru.betterend.blocks; + +import java.util.EnumMap; +import java.util.List; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Material; +import net.minecraft.block.ShapeContext; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.enchantment.Enchantments; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.context.LootContext; +import net.minecraft.loot.context.LootContextParameters; +import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.BlockView; +import ru.betterend.blocks.basis.BlockAttached; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; + +public class BlockSmallJellyshroom extends BlockAttached implements IRenderTypeable { + private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); + + public BlockSmallJellyshroom() { + super(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.SHEARS) + .sounds(BlockSoundGroup.NETHER_WART) + .breakByHand(true) + .noCollision()); + } + + @Override + public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + return BOUNDING_SHAPES.get(state.get(FACING)); + } + + @Override + public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.get(LootContextParameters.TOOL); + if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) || EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { + return Lists.newArrayList(new ItemStack(this)); + } + else { + return Lists.newArrayList(); + } + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + static { + BOUNDING_SHAPES.put(Direction.UP, Block.createCuboidShape(3, 0, 3, 13, 16, 13)); + BOUNDING_SHAPES.put(Direction.DOWN, VoxelShapes.cuboid(0.0, 0.5, 0.0, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.NORTH, VoxelShapes.cuboid(0.0, 0.0, 0.5, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.SOUTH, VoxelShapes.cuboid(0.0, 0.0, 0.0, 1.0, 1.0, 0.5)); + BOUNDING_SHAPES.put(Direction.WEST, VoxelShapes.cuboid(0.5, 0.0, 0.0, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.EAST, VoxelShapes.cuboid(0.0, 0.0, 0.0, 0.5, 1.0, 1.0)); + } +} diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 1c7f1cf6..e389d095 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -58,6 +58,7 @@ import ru.betterend.blocks.BlockRespawnObelisk; import ru.betterend.blocks.BlockShadowBerry; import ru.betterend.blocks.BlockShadowGrass; import ru.betterend.blocks.BlockSilkMothNest; +import ru.betterend.blocks.BlockSmallJellyshroom; import ru.betterend.blocks.BlockSulphurCrystal; import ru.betterend.blocks.BlockTenaneaFlowers; import ru.betterend.blocks.BlockTenaneaSapling; @@ -209,6 +210,9 @@ public class EndBlocks { public static final Block GLOWING_PILLAR_LUMINOPHOR = registerBlock("glowing_pillar_luminophor", new BlockGlowingPillarLuminophor()); public static final Block GLOWING_PILLAR_LEAVES = registerBlock("glowing_pillar_leaves", new BlockFur(GLOWING_PILLAR_SEED, 15, 3)); + public static final Block SMALL_JELLYSHROOM = registerBlock("small_jellyshroom", new BlockSmallJellyshroom()); + + // Water plants public static final Block BUBBLE_CORAL = registerBlock("bubble_coral", new BlockBubbleCoral()); public static final Block MENGER_SPONGE = registerBlock("menger_sponge", new BlockMengerSponge()); public static final Block MENGER_SPONGE_WET = registerBlock("menger_sponge_wet", new BlockMengerSpongeWet()); diff --git a/src/main/resources/assets/betterend/blockstates/small_jellyshroom.json b/src/main/resources/assets/betterend/blockstates/small_jellyshroom.json new file mode 100644 index 00000000..210a9636 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/small_jellyshroom.json @@ -0,0 +1,27 @@ +{ + "variants": { + "facing=north": [ + { "model": "betterend:block/small_jellyshroom_wall_1", "y": 180 }, + { "model": "betterend:block/small_jellyshroom_wall_2", "y": 180 } + ], + "facing=south": [ + { "model": "betterend:block/small_jellyshroom_wall_1" }, + { "model": "betterend:block/small_jellyshroom_wall_2" } + ], + "facing=east": [ + { "model": "betterend:block/small_jellyshroom_wall_1", "y": 270 }, + { "model": "betterend:block/small_jellyshroom_wall_2", "y": 270 } + ], + "facing=west": [ + { "model": "betterend:block/small_jellyshroom_wall_1", "y": 90 }, + { "model": "betterend:block/small_jellyshroom_wall_2", "y": 90 } + ], + "facing=up": [ + { "model": "betterend:block/small_jellyshroom_floor" }, + { "model": "betterend:block/small_jellyshroom_floor", "y": 90 }, + { "model": "betterend:block/small_jellyshroom_floor", "y": 180 }, + { "model": "betterend:block/small_jellyshroom_floor", "y": 270 } + ], + "facing=down": { "model": "betterend:block/glowing_pillar_leaves_up", "x": 180 } + } +} diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 90eaae35..745046de 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -511,5 +511,15 @@ "block.betterend.umbrella_tree_stripped_bark": "Stripped Umbrella Tree Bark", "block.betterend.umbrella_tree_stripped_log": "Stripped Umbrella Tree Log", "block.betterend.umbrella_tree_trapdoor": "Umbrella Tree Trapdoor", - "block.betterend.umbrella_tree_membrane": "Umbrella Tree Membrane" + "block.betterend.umbrella_tree_membrane": "Umbrella Tree Membrane", + + "biome.betterend.umbrella_jungle": "Umbrella Jungle", + "block.betterend.jungle_grass": "Jungle Grass", + "block.betterend.jungle_moss": "Jungle Moss", + "block.betterend.jungle_moss_path": "Jungle Moss Path", + "block.betterend.small_jellyshroom": "Small Jellyshroom", + "block.betterend.twisted_umbrella_moss": "Twisted Umbrella Moss", + "block.betterend.twisted_umbrella_moss_tall": "Twisted Umbrella Moss Tall", + "block.betterend.umbrella_tree_cluster": "Umbrella Tree Cluster", + "block.betterend.umbrella_tree_cluster_empty": "Empty Umbrella Tree Cluster" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 8d96aefc..d56eb055 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -513,5 +513,15 @@ "block.betterend.umbrella_tree_stripped_bark": "Обтёсанная кора зонтичного дерева", "block.betterend.umbrella_tree_stripped_log": "Обтёсанное бревно зонтичного дерева", "block.betterend.umbrella_tree_trapdoor": "Люк из зонтичного дерева", - "block.betterend.umbrella_tree_membrane": "Мембрана зонтичного дерева" + "block.betterend.umbrella_tree_membrane": "Мембрана зонтичного дерева", + + "biome.betterend.umbrella_jungle": "Зонтичные джунгли", + "block.betterend.jungle_grass": "Трава джунглей", + "block.betterend.jungle_moss": "Мох джунглей", + "block.betterend.jungle_moss_path": "Тропа из мха джунглей", + "block.betterend.small_jellyshroom": "Маленький слизнегриб", + "block.betterend.twisted_umbrella_moss": "Закрученный зонтичный мох", + "block.betterend.twisted_umbrella_moss_tall": "Высокий закрученный зонтичный мох", + "block.betterend.umbrella_tree_cluster": "Кластер зонтичного дерева", + "block.betterend.umbrella_tree_cluster_empty": "Пустой кластер хонтичного дерева" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/small_jellyshroom_floor.json b/src/main/resources/assets/betterend/models/block/small_jellyshroom_floor.json new file mode 100644 index 00000000..81135b41 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/small_jellyshroom_floor.json @@ -0,0 +1,149 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/small_jellyshroom_stem", + "texture": "betterend:block/small_jellyshroom_stem", + "cap": "betterend:block/jellyshroom_cap" + }, + "elements": [ + { + "__comment": "PlaneX1", + "from": [ 2.375, 0, 2.375 ], + "to": [ 2.376, 16, 18.375 ], + "rotation": { "origin": [ 2.375, 0, 2.375 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX1", + "from": [ 13.75, 0, 2.25 ], + "to": [ 13.751, 16, 18.25 ], + "rotation": { "origin": [ 13.75, 0, 2.25 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box3", + "from": [ 5.5, 11, 5.5 ], + "to": [ 10.5, 14, 10.5 ], + "faces": { + "down": { "uv": [ 5, 0, 10, 5 ], "texture": "#cap" }, + "up": { "uv": [ 0, 0, 5, 5 ], "texture": "#cap" }, + "north": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" }, + "south": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" }, + "west": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" }, + "east": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" } + } + }, + { + "__comment": "Box3", + "from": [ 2.5, 5, 9.5 ], + "to": [ 6.5, 8, 13.5 ], + "faces": { + "down": { "uv": [ 4, 5, 8, 9 ], "texture": "#cap" }, + "up": { "uv": [ 0, 5, 4, 9 ], "texture": "#cap" }, + "north": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" }, + "south": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" }, + "west": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" }, + "east": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" } + } + }, + { + "__comment": "Box3", + "from": [ 3, 4, 3 ], + "to": [ 6, 6, 6 ], + "faces": { + "down": { "uv": [ 3, 9, 6, 12 ], "texture": "#cap" }, + "up": { "uv": [ 0, 9, 3, 12 ], "texture": "#cap" }, + "north": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "south": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "west": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "east": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" } + } + }, + { + "__comment": "Box3", + "from": [ 9.5, 10, 9.5 ], + "to": [ 12.5, 12, 12.5 ], + "faces": { + "down": { "uv": [ 3, 9, 6, 12 ], "texture": "#cap" }, + "up": { "uv": [ 0, 9, 3, 12 ], "texture": "#cap" }, + "north": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "south": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "west": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "east": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" } + } + }, + { + "__comment": "Box3", + "from": [ 3.5, 10.5, 3.5 ], + "to": [ 6.5, 12.5, 6.5 ], + "faces": { + "down": { "uv": [ 3, 9, 6, 12 ], "texture": "#cap" }, + "up": { "uv": [ 0, 9, 3, 12 ], "texture": "#cap" }, + "north": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "south": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "west": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "east": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" } + } + }, + { + "__comment": "Box3", + "from": [ 10.5, 11, 4 ], + "to": [ 12.5, 12, 6 ], + "faces": { + "down": { "uv": [ 2, 12, 4, 14 ], "texture": "#cap" }, + "up": { "uv": [ 0, 12, 2, 14 ], "texture": "#cap" }, + "north": { "uv": [ 4, 12, 6, 13 ], "texture": "#cap" }, + "south": { "uv": [ 4, 12, 6, 13 ], "texture": "#cap" }, + "west": { "uv": [ 4, 12, 6, 13 ], "texture": "#cap" }, + "east": { "uv": [ 4, 12, 6, 13 ], "texture": "#cap" } + } + }, + { + "__comment": "Box3", + "from": [ 10, 5, 2.5 ], + "to": [ 14, 7, 6.5 ], + "faces": { + "down": { "uv": [ 4, 5, 8, 9 ], "texture": "#cap" }, + "up": { "uv": [ 0, 5, 4, 9 ], "texture": "#cap" }, + "north": { "uv": [ 8, 5, 12, 7 ], "texture": "#cap" }, + "south": { "uv": [ 8, 5, 12, 7 ], "texture": "#cap" }, + "west": { "uv": [ 8, 5, 12, 7 ], "texture": "#cap" }, + "east": { "uv": [ 8, 5, 12, 7 ], "texture": "#cap" } + } + }, + { + "__comment": "Box3", + "from": [ 4, 10, 10 ], + "to": [ 6, 11, 12 ], + "faces": { + "down": { "uv": [ 2, 12, 4, 14 ], "texture": "#cap" }, + "up": { "uv": [ 0, 12, 2, 14 ], "texture": "#cap" }, + "north": { "uv": [ 4, 12, 6, 13 ], "texture": "#cap" }, + "south": { "uv": [ 4, 12, 6, 13 ], "texture": "#cap" }, + "west": { "uv": [ 4, 12, 6, 13 ], "texture": "#cap" }, + "east": { "uv": [ 4, 12, 6, 13 ], "texture": "#cap" } + } + }, + { + "__comment": "Box3", + "from": [ 10, 4, 10 ], + "to": [ 13, 6, 13 ], + "faces": { + "down": { "uv": [ 3, 9, 6, 12 ], "texture": "#cap" }, + "up": { "uv": [ 0, 9, 3, 12 ], "texture": "#cap" }, + "north": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "south": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "west": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "east": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/small_jellyshroom_wall_1.json b/src/main/resources/assets/betterend/models/block/small_jellyshroom_wall_1.json new file mode 100644 index 00000000..53b6893a --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/small_jellyshroom_wall_1.json @@ -0,0 +1,96 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/jellyshroom_wall_stem_1", + "branch_1": "betterend:block/jellyshroom_wall_stem_1", + "branch_2": "betterend:block/jellyshroom_wall_stem_2", + "branch_3": "betterend:block/jellyshroom_wall_stem_3", + "cap": "betterend:block/jellyshroom_cap" + }, + "elements": [ + { + "__comment": "PlaneX1", + "from": [ 8, 0, 0 ], + "to": [ 8.001, 16, 16 ], + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#branch_1" }, + "east": { "uv": [ 16, 0, 0, 16 ], "texture": "#branch_1" } + } + }, + { + "__comment": "PlaneX1", + "from": [ 11, 0, 0 ], + "to": [ 11.001, 16, 16 ], + "rotation": { "origin": [ 11, 0, 0 ], "axis": "y", "angle": 22.5 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#branch_3" }, + "east": { "uv": [ 16, 0, 0, 16 ], "texture": "#branch_3" } + } + }, + { + "__comment": "PlaneX1", + "from": [ 5, 0, 0 ], + "to": [ 5.001, 16, 16 ], + "rotation": { "origin": [ 5, 0, 0 ], "axis": "y", "angle": -22.5 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#branch_3" }, + "east": { "uv": [ 16, 0, 0, 16 ], "texture": "#branch_3" } + } + }, + { + "__comment": "Box4", + "from": [ 5.5, 10, 5.5 ], + "to": [ 10.5, 13, 10.5 ], + "faces": { + "down": { "uv": [ 5, 0, 10, 5 ], "texture": "#cap" }, + "up": { "uv": [ 0, 0, 5, 5 ], "texture": "#cap" }, + "north": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" }, + "south": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" }, + "west": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" }, + "east": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" } + } + }, + { + "__comment": "Box4", + "from": [ 11.5, 7, 4 ], + "to": [ 15.5, 10, 8 ], + "faces": { + "down": { "uv": [ 4, 5, 8, 9 ], "texture": "#cap" }, + "up": { "uv": [ 0, 5, 4, 9 ], "texture": "#cap" }, + "north": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" }, + "south": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" }, + "west": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" }, + "east": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" } + } + }, + { + "__comment": "Box4", + "from": [ 1, 7, 4.5 ], + "to": [ 4, 9, 7.5 ], + "faces": { + "down": { "uv": [ 3, 9, 6, 12 ], "texture": "#cap" }, + "up": { "uv": [ 0, 9, 3, 12 ], "texture": "#cap" }, + "north": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "south": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "west": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "east": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" } + } + }, + { + "__comment": "Box4", + "from": [ 6.5, 9, 2 ], + "to": [ 9.5, 11, 5 ], + "faces": { + "down": { "uv": [ 3, 9, 6, 12 ], "texture": "#cap" }, + "up": { "uv": [ 0, 9, 3, 12 ], "texture": "#cap" }, + "north": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "south": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "west": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "east": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/small_jellyshroom_wall_2.json b/src/main/resources/assets/betterend/models/block/small_jellyshroom_wall_2.json new file mode 100644 index 00000000..2bdc5649 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/small_jellyshroom_wall_2.json @@ -0,0 +1,109 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/jellyshroom_wall_stem_1", + "branch_1": "betterend:block/jellyshroom_wall_stem_1", + "branch_2": "betterend:block/jellyshroom_wall_stem_2", + "branch_3": "betterend:block/jellyshroom_wall_stem_3", + "cap": "betterend:block/jellyshroom_cap" + }, + "elements": [ + { + "__comment": "PlaneX1", + "from": [ 8, 0, 0 ], + "to": [ 8.001, 16, 16 ], + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#branch_3" }, + "east": { "uv": [ 16, 0, 0, 16 ], "texture": "#branch_3" } + } + }, + { + "__comment": "PlaneX1", + "from": [ 11, 0, 0 ], + "to": [ 11.001, 16, 16 ], + "rotation": { "origin": [ 11, 0, 0 ], "axis": "y", "angle": 22.5 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#branch_1" }, + "east": { "uv": [ 16, 0, 0, 16 ], "texture": "#branch_1" } + } + }, + { + "__comment": "PlaneX1", + "from": [ 5, 0, 0 ], + "to": [ 5.001, 16, 16 ], + "rotation": { "origin": [ 5, 0, 0 ], "axis": "y", "angle": -22.5 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#branch_2" }, + "east": { "uv": [ 16, 0, 0, 16 ], "texture": "#branch_2" } + } + }, + { + "__comment": "Box4", + "from": [ 11, 10, 5 ], + "to": [ 16, 13, 10 ], + "faces": { + "down": { "uv": [ 5, 0, 10, 5 ], "texture": "#cap" }, + "up": { "uv": [ 0, 0, 5, 5 ], "texture": "#cap" }, + "north": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" }, + "south": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" }, + "west": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" }, + "east": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" } + } + }, + { + "__comment": "Box4", + "from": [ 10, 9, 1.5 ], + "to": [ 14, 12, 5.5 ], + "faces": { + "down": { "uv": [ 4, 5, 8, 9 ], "texture": "#cap" }, + "up": { "uv": [ 0, 5, 4, 9 ], "texture": "#cap" }, + "north": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" }, + "south": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" }, + "west": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" }, + "east": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" } + } + }, + { + "__comment": "Box4", + "from": [ 0.5, 8, 6.5 ], + "to": [ 3.5, 10, 9.5 ], + "faces": { + "down": { "uv": [ 3, 9, 6, 12 ], "texture": "#cap" }, + "up": { "uv": [ 0, 9, 3, 12 ], "texture": "#cap" }, + "north": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "south": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "west": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "east": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" } + } + }, + { + "__comment": "Box4", + "from": [ 1.5, 10, 2.5 ], + "to": [ 5.5, 13, 6.5 ], + "faces": { + "down": { "uv": [ 4, 5, 8, 9 ], "texture": "#cap" }, + "up": { "uv": [ 0, 5, 4, 9 ], "texture": "#cap" }, + "north": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" }, + "south": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" }, + "west": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" }, + "east": { "uv": [ 8, 5, 12, 8 ], "texture": "#cap" } + } + }, + { + "__comment": "Box4", + "from": [ 6.5, 8, 5 ], + "to": [ 9.5, 10, 8 ], + "faces": { + "down": { "uv": [ 3, 9, 6, 12 ], "texture": "#cap" }, + "up": { "uv": [ 0, 9, 3, 12 ], "texture": "#cap" }, + "north": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "south": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "west": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "east": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_cap.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_cap.png new file mode 100644 index 0000000000000000000000000000000000000000..2799ee637d7f6c97d02174ea3631a9c8533773c8 GIT binary patch literal 2172 zcmb_eYitx%6rNJ31=>=@K#Kyy@WT?Ao!35Q2bNNI(U!1C%97TI+IigFPP#iY%uKt} z*4P%M!K6u7$}50LV=!VwLGT9+rc@znR0!1=Arg5=LLi|KP^2li-r4SM01Fc0CbM(r z&UeoFzH`pKcivgK;>E&AGbSMjQdm_PsD}4q`^wLQ|Fdr-d3c+sRlaN>NYPRI%Go@> z=otjb>ybmXW^HgeC#o?AFR21>STPNv5oA%hrSW0|Fi`Qz%U z>eUCh&c41U08DK#n2j+emsl(t!Z4RMK^f_UjEOcv%^D!8fuT0)B3Rl4Y0kCPXq;aM zys7FTRgGo}wK78)_51C@uxMG0tVn9yn0J>A2=FHGVKhmTI7Q>MGepyz)5B5j`6R=U z>7zT`TqnNZ{vpwowxdlY7< zVKdI_pdtdZ^(Y-hJcz%+H$9v^Pf;T4W(C|ux>(#PIT@U1!eLx=xxG99UN=p$8TI$E zAMHSvbGb4d_?Ya|$rbB)B?91{Nnnq!=h6Cc%xe65Mg6aO2z$32Z8hTlE=;|(PoWC$P|Mr_Vdd|(6 zntNpDD{BjWSiYcO=d-5^&a}M&ZjD@>;y>^mmY3iXGq$x{+a3BC9p`?(6fY?JYvaK7=Du5{i`z!>-MfB{&huXytn2)US~#%%z*dXg*}6YhXx}rz zQ_Fmt_~yBO`tvo*-fHL^oLznxB%Z7htn1fjokWUTe>x?1b)m$y9h1I%_1cxcYdSBl z8Z2=jnR#ULz7x}@ZWOFPhf3Ms`14B$^1SnG?Qk-=uPl1zy$Ri| ziJn8B{Ic#&_fT|C$A+PCb(^Sl1xQX}4qMpX*DFmtdefc!K#NQT1IPN4$#;8*6HN!( u%2)sTep&yP>MnU8nM{_JV*A$P_=YL;M3>p*8Kx(q2xpW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_wall_stem_1.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_wall_stem_1.png new file mode 100644 index 0000000000000000000000000000000000000000..ea4576e2555c515ce369db812509bb55d8f2d574 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!9AWXjv*HQ$$$R;w`W#u;Pjfz+qRf7s<`T) z1dGezpnu+JA&+=dMVK9=7Wgb;yu&bIt&Y~V@ zD}lWt_CwNL&Zd<-hZ!dH*5BKkCh&#l=Xt&5OlgmqeHJBZ7DTt~aeA0DBQ4O}*KLJB z*a4PJfkumkWImm-`IF#VzrQA>!fx^0i4)QU5|}a>9?tK7*I>FY&b0mG-ECJ{Ob;=h zSij&%3xD>xcL%lj4n=G(UOQW9%FzQC_Pn;6(#mUK01Sw$H81U#Mf?YPjlt8^&t;uc GLK6TGfObOw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_wall_stem_3.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_wall_stem_3.png new file mode 100644 index 0000000000000000000000000000000000000000..264636bdfb8f9bfaa1ce7b8e867945254991ff1a GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!R4MVjv*HQ$$$R;w`W#u;Pjfz>(<2>Ra~`D zM~6X#TVajmZuWC(te5qqTn`6z7)c&xaC39pFh8=zWuej!#xU_c5#>!8^@g04t&23o zzVQ4!uebcrhv#>*S8&uF&=8u%W5#gvq{7)nd9!-12X!q}+QGQkrHb_i!-Qq~$&)78&qol`;+0Iv{VQUCw| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/small_jellyshroom_stem.png b/src/main/resources/assets/betterend/textures/block/small_jellyshroom_stem.png new file mode 100644 index 0000000000000000000000000000000000000000..fe3df53b00b114a5311eedd4ebabdee3f92bcb12 GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc4Hlj*jv*HQ$$$R;w`W#u;Pjfz%QlfQs<`T* z1Y64b}zVXNU@UxB|rQMvESY?d)?U_$B%DST>De^TdJZWp@NZZR{7obO%f7uYpfd=MebcHr*-%M14HVIxs}HqZC3yTmci52 K&t;ucLK6Un-kg5` literal 0 HcmV?d00001 From 989dbdb583c85ea925cd4daa7b28d0714f211ac1 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 25 Dec 2020 11:19:26 +0300 Subject: [PATCH 015/463] Ceiling jellyshroom variant --- .../blocks/BlockSmallJellyshroom.java | 2 +- .../blockstates/small_jellyshroom.json | 7 +- .../models/block/small_jellyshroom_ceil.json | 84 ++++++++++++++++++ .../block/jellyshroom_ceiling_stem.png | Bin 0 -> 1541 bytes 4 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/assets/betterend/models/block/small_jellyshroom_ceil.json create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_ceiling_stem.png diff --git a/src/main/java/ru/betterend/blocks/BlockSmallJellyshroom.java b/src/main/java/ru/betterend/blocks/BlockSmallJellyshroom.java index a28878bd..fb688def 100644 --- a/src/main/java/ru/betterend/blocks/BlockSmallJellyshroom.java +++ b/src/main/java/ru/betterend/blocks/BlockSmallJellyshroom.java @@ -61,7 +61,7 @@ public class BlockSmallJellyshroom extends BlockAttached implements IRenderTypea static { BOUNDING_SHAPES.put(Direction.UP, Block.createCuboidShape(3, 0, 3, 13, 16, 13)); - BOUNDING_SHAPES.put(Direction.DOWN, VoxelShapes.cuboid(0.0, 0.5, 0.0, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.DOWN, Block.createCuboidShape(3, 0, 3, 13, 16, 13)); BOUNDING_SHAPES.put(Direction.NORTH, VoxelShapes.cuboid(0.0, 0.0, 0.5, 1.0, 1.0, 1.0)); BOUNDING_SHAPES.put(Direction.SOUTH, VoxelShapes.cuboid(0.0, 0.0, 0.0, 1.0, 1.0, 0.5)); BOUNDING_SHAPES.put(Direction.WEST, VoxelShapes.cuboid(0.5, 0.0, 0.0, 1.0, 1.0, 1.0)); diff --git a/src/main/resources/assets/betterend/blockstates/small_jellyshroom.json b/src/main/resources/assets/betterend/blockstates/small_jellyshroom.json index 210a9636..650cc8c6 100644 --- a/src/main/resources/assets/betterend/blockstates/small_jellyshroom.json +++ b/src/main/resources/assets/betterend/blockstates/small_jellyshroom.json @@ -22,6 +22,11 @@ { "model": "betterend:block/small_jellyshroom_floor", "y": 180 }, { "model": "betterend:block/small_jellyshroom_floor", "y": 270 } ], - "facing=down": { "model": "betterend:block/glowing_pillar_leaves_up", "x": 180 } + "facing=down": [ + { "model": "betterend:block/small_jellyshroom_ceil" }, + { "model": "betterend:block/small_jellyshroom_ceil", "y": 90 }, + { "model": "betterend:block/small_jellyshroom_ceil", "y": 180 }, + { "model": "betterend:block/small_jellyshroom_ceil", "y": 270 } + ] } } diff --git a/src/main/resources/assets/betterend/models/block/small_jellyshroom_ceil.json b/src/main/resources/assets/betterend/models/block/small_jellyshroom_ceil.json new file mode 100644 index 00000000..43db448d --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/small_jellyshroom_ceil.json @@ -0,0 +1,84 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/jellyshroom_ceiling_stem", + "texture": "betterend:block/jellyshroom_ceiling_stem", + "cap": "betterend:block/jellyshroom_cap" + }, + "elements": [ + { + "__comment": "PlaneX1", + "from": [ 2.375, 0, 2.375 ], + "to": [ 2.376, 16, 18.375 ], + "rotation": { "origin": [ 2.375, 0, 2.375 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX1", + "from": [ 13.75, 0, 2.25 ], + "to": [ 13.751, 16, 18.25 ], + "rotation": { "origin": [ 13.75, 0, 2.25 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box3", + "from": [ 2.5, 4.5, 2.5 ], + "to": [ 7.5, 7.5, 7.5 ], + "faces": { + "down": { "uv": [ 5, 0, 10, 5 ], "texture": "#cap" }, + "up": { "uv": [ 0, 0, 5, 5 ], "texture": "#cap" }, + "north": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" }, + "south": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" }, + "west": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" }, + "east": { "uv": [ 10, 0, 15, 3 ], "texture": "#cap" } + } + }, + { + "__comment": "Box3", + "from": [ 9, 12, 4 ], + "to": [ 12, 14, 7 ], + "faces": { + "down": { "uv": [ 3, 9, 6, 12 ], "texture": "#cap" }, + "up": { "uv": [ 0, 9, 3, 12 ], "texture": "#cap" }, + "north": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "south": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "west": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "east": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" } + } + }, + { + "__comment": "Box3", + "from": [ 9.5, 12, 9.5 ], + "to": [ 11.5, 13, 11.5 ], + "faces": { + "down": { "uv": [ 2, 12, 4, 14 ], "texture": "#cap" }, + "up": { "uv": [ 0, 12, 2, 14 ], "texture": "#cap" }, + "north": { "uv": [ 4, 12, 6, 13 ], "texture": "#cap" }, + "south": { "uv": [ 4, 12, 6, 13 ], "texture": "#cap" }, + "west": { "uv": [ 4, 12, 6, 13 ], "texture": "#cap" }, + "east": { "uv": [ 4, 12, 6, 13 ], "texture": "#cap" } + } + }, + { + "__comment": "Box3", + "from": [ 3.5, 5, 9.5 ], + "to": [ 6.5, 7, 12.5 ], + "faces": { + "down": { "uv": [ 3, 9, 6, 12 ], "texture": "#cap" }, + "up": { "uv": [ 0, 9, 3, 12 ], "texture": "#cap" }, + "north": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "south": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "west": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" }, + "east": { "uv": [ 6, 9, 9, 11 ], "texture": "#cap" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_ceiling_stem.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_ceiling_stem.png new file mode 100644 index 0000000000000000000000000000000000000000..59f766339714caab8bc94927b270d1292e293c08 GIT binary patch literal 1541 zcmbVMU5Fb+9N%~nw0HeLrPNb!Z|{^=-OTLfduU8A$+ZdXp64}k*9W1K*-5foc4u#Q zu1QY8>z7zOXtAiJ2tNB#D3nrAX#IE)eCVs#R8B<-w}ON(OO6O1RK;{U>S4~ywZw|v5vr17VN5s|Kbx=)fG-?pmDeAzgL z2(x3@WHlP=*sefJ(!qSk#bkwYxkek7lT)_7xUI;RnNyaM1~l9vZCd4Zj~-v2uafl@ zk~Nk5Yx2Pk5(GBoSnk*@$48x<(&t5D9UKEi?nC%WPMHk^%FD)rTx1@Vld+Uaw1h6F zvoS3NvwGrHS%+F0z%SIy{smb~&ZVxr+d3x7)FHJjT2R z(6ZSqfI851RUlNq>u}sr9e;YnP@+EZESFo%kpo6tV{1I82u%kj*ltMc_(L}dhk*`u zffj>-NqwM6LY%wiwfe$M0%(ic)ZxCsY9Us5$uL6r18HqLMEiX1l+b8s+XK;lwd+!_ zNPV{E5juBDNSq!i<~A8;ev|!!9pQCojf;vN#hiIn##*C5EsR*?VlfCzM&7?gsL&iGLfE1Y9^^C)HESURm&tYDuz^3^-P*jsAp5j zOnUUb#K>9@#L;{6f4+a+vqTZ$)}!-;K|)2=VxGZF;pKRc!u?c2Wy=@w>JE$II9(mC zT9(|;9)wAd;5mf^k)@_GJhmR$GXvUolM2#*3HJczvpR2MkIpuP7au00fY2WV)i^K( z{N2j_-Crtq1Q+cfScZK_Y{E`P9nro#(Wh4B&yR>6cdJsGt!BO_fAo6!v6MXd@o&AY zPcBaU>b*R1w{at`|12GwxD}a>@6L}+ZQPZjd#B!b@3V{dF4@u#?9dWa-X8zvslv_M zKi!<1+nfO#kL`(``?Aox{CpJl&L+-I{JwoJX+<|`krUg$yy@?|uxsp6)Xb0lxH;2} zn9qGTzEFJsX!*luKkA*na{8G&g-zw;;!6jnzIrS2!QpqV)xO?q!>v2t-hZ*d0W4g; j|L%;jIdeX8eNuGuD>ur!SFa!H1&z8gH($C|IC Date: Fri, 25 Dec 2020 11:50:45 +0300 Subject: [PATCH 016/463] Mushrooms generation --- .../blocks/BlockSmallJellyshroom.java | 8 ++++ .../betterend/blocks/basis/BlockAttached.java | 5 ++- .../ru/betterend/registry/EndFeatures.java | 7 ++++ .../world/biome/BiomeUmbrellaJungle.java | 4 ++ .../SingleInvertedScatterFeature.java | 39 +++++++++++++++++++ .../world/features/WallPlantFeature.java | 21 ++++++++-- .../features/trees/UmbrellaTreeFeature.java | 2 +- 7 files changed, 80 insertions(+), 6 deletions(-) create mode 100644 src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java diff --git a/src/main/java/ru/betterend/blocks/BlockSmallJellyshroom.java b/src/main/java/ru/betterend/blocks/BlockSmallJellyshroom.java index fb688def..e0abafdc 100644 --- a/src/main/java/ru/betterend/blocks/BlockSmallJellyshroom.java +++ b/src/main/java/ru/betterend/blocks/BlockSmallJellyshroom.java @@ -23,6 +23,7 @@ import net.minecraft.util.math.Direction; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; import net.minecraft.world.BlockView; +import net.minecraft.world.WorldView; import ru.betterend.blocks.basis.BlockAttached; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; @@ -54,6 +55,13 @@ public class BlockSmallJellyshroom extends BlockAttached implements IRenderTypea } } + @Override + public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + Direction direction = (Direction) state.get(FACING); + BlockPos blockPos = pos.offset(direction.getOpposite()); + return sideCoversSmallSquare(world, blockPos, direction) && world.getBlockState(blockPos).isOpaque(); + } + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; diff --git a/src/main/java/ru/betterend/blocks/basis/BlockAttached.java b/src/main/java/ru/betterend/blocks/basis/BlockAttached.java index 84710157..6a6f8525 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockAttached.java +++ b/src/main/java/ru/betterend/blocks/basis/BlockAttached.java @@ -17,11 +17,12 @@ import net.minecraft.world.WorldView; import ru.betterend.util.BlocksHelper; public abstract class BlockAttached extends BlockBaseNotFull { + public static final DirectionProperty FACING = Properties.FACING; + public BlockAttached(Settings settings) { super(settings); + this.setDefaultState(this.getDefaultState().with(FACING, Direction.UP)); } - - public static final DirectionProperty FACING = Properties.FACING; @Override protected void appendProperties(StateManager.Builder stateManager) { diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 78c611b1..33e5ca03 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -24,6 +24,7 @@ import ru.betterend.world.features.HydraluxFeature; import ru.betterend.world.features.LanceleafFeature; import ru.betterend.world.features.MengerSpongeFeature; import ru.betterend.world.features.OverworldIslandFeature; +import ru.betterend.world.features.SingleInvertedScatterFeature; import ru.betterend.world.features.SinglePlantFeature; import ru.betterend.world.features.UnderwaterPlantFeature; import ru.betterend.world.features.VineFeature; @@ -82,12 +83,16 @@ public class EndFeatures { public static final EndFeature GLOW_PILLAR = new EndFeature("glow_pillar", new GlowPillarFeature(), 1); public static final EndFeature TWISTED_UMBRELLA_MOSS = new EndFeature("twisted_umbrella_moss", new DoublePlantFeature(EndBlocks.TWISTED_UMBRELLA_MOSS, EndBlocks.TWISTED_UMBRELLA_MOSS_TALL, 6), 5); public static final EndFeature JUNGLE_GRASS = new EndFeature("jungle_grass", new SinglePlantFeature(EndBlocks.JUNGLE_GRASS, 7, 3), 8); + public static final EndFeature SMALL_JELLYSHROOM_FLOOR = new EndFeature("small_jellyshroom_floor", new SinglePlantFeature(EndBlocks.SMALL_JELLYSHROOM, 5, 5), 4); // Vines // public static final EndFeature DENSE_VINE = new EndFeature("dense_vine", new VineFeature(EndBlocks.DENSE_VINE, 24), 3); public static final EndFeature TWISTED_VINE = new EndFeature("twisted_vine", new VineFeature(EndBlocks.TWISTED_VINE, 24), 3); public static final EndFeature BULB_VINE = new EndFeature("bulb_vine", new VineFeature(EndBlocks.BULB_VINE, 24), 5); + // Ceil plants + public static final EndFeature SMALL_JELLYSHROOM_CEIL = new EndFeature("small_jellyshroom_ceil", new SingleInvertedScatterFeature(EndBlocks.SMALL_JELLYSHROOM, 8), 8); + // Wall Plants // public static final EndFeature PURPLE_POLYPORE = new EndFeature("purple_polypore", new WallPlantOnLogFeature(EndBlocks.PURPLE_POLYPORE, 3), 5); public static final EndFeature PURPLE_POLYPORE_DENSE = new EndFeature("purple_polypore_dense", new WallPlantOnLogFeature(EndBlocks.PURPLE_POLYPORE, 5), 15); @@ -99,6 +104,8 @@ public class EndFeatures { public static final EndFeature TWISTED_MOSS_WOOD = new EndFeature("twisted_moss_wood", new WallPlantOnLogFeature(EndBlocks.TWISTED_MOSS, 6), 25); public static final EndFeature BULB_MOSS = new EndFeature("bulb_moss", new WallPlantFeature(EndBlocks.BULB_MOSS, 6), 1); public static final EndFeature BULB_MOSS_WOOD = new EndFeature("bulb_moss_wood", new WallPlantOnLogFeature(EndBlocks.BULB_MOSS, 6), 15); + public static final EndFeature SMALL_JELLYSHROOM_WALL = new EndFeature("small_jellyshroom_wall", new WallPlantFeature(EndBlocks.SMALL_JELLYSHROOM, 6), 4); + public static final EndFeature SMALL_JELLYSHROOM_WOOD = new EndFeature("small_jellyshroom_wood", new WallPlantOnLogFeature(EndBlocks.SMALL_JELLYSHROOM, 6), 8); // Water // public static final EndFeature BUBBLE_CORAL = new EndFeature("bubble_coral", new UnderwaterPlantFeature(EndBlocks.BUBBLE_CORAL, 6), 10); diff --git a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java index 9a8cc656..a5ffe6c2 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java +++ b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java @@ -14,9 +14,13 @@ public class BiomeUmbrellaJungle extends EndBiome { .addFeature(EndFeatures.END_LAKE) .addFeature(EndFeatures.UMBRELLA_TREE) .addFeature(EndFeatures.TWISTED_UMBRELLA_MOSS) + .addFeature(EndFeatures.SMALL_JELLYSHROOM_FLOOR) .addFeature(EndFeatures.JUNGLE_GRASS) .addFeature(EndFeatures.CYAN_MOSS) .addFeature(EndFeatures.CYAN_MOSS_WOOD) + .addFeature(EndFeatures.SMALL_JELLYSHROOM_WALL) + .addFeature(EndFeatures.SMALL_JELLYSHROOM_WOOD) + .addFeature(EndFeatures.SMALL_JELLYSHROOM_CEIL) .addFeature(EndFeatures.CHARNIA_CYAN) .addFeature(EndFeatures.CHARNIA_GREEN) .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) diff --git a/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java b/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java new file mode 100644 index 00000000..b3091c7a --- /dev/null +++ b/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java @@ -0,0 +1,39 @@ +package ru.betterend.world.features; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.state.property.Properties; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.StructureWorldAccess; +import ru.betterend.blocks.basis.BlockAttached; +import ru.betterend.util.BlocksHelper; + +public class SingleInvertedScatterFeature extends InvertedScatterFeature { + private final Block block; + + public SingleInvertedScatterFeature(Block block, int radius) { + super(radius); + this.block = block; + } + + @Override + public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { + BlockState state = block.getDefaultState(); + if (block instanceof BlockAttached) { + state = state.with(Properties.FACING, Direction.DOWN); + } + return state.canPlaceAt(world, blockPos); + } + + @Override + public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { + BlockState state = block.getDefaultState(); + if (block instanceof BlockAttached) { + state = state.with(Properties.FACING, Direction.DOWN); + } + BlocksHelper.setWithoutUpdate(world, blockPos, state); + } +} diff --git a/src/main/java/ru/betterend/world/features/WallPlantFeature.java b/src/main/java/ru/betterend/world/features/WallPlantFeature.java index 5c42152e..dc72aeab 100644 --- a/src/main/java/ru/betterend/world/features/WallPlantFeature.java +++ b/src/main/java/ru/betterend/world/features/WallPlantFeature.java @@ -4,9 +4,11 @@ import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.state.property.Properties; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.StructureWorldAccess; +import ru.betterend.blocks.basis.BlockAttached; import ru.betterend.blocks.basis.BlockWallPlant; import ru.betterend.util.BlocksHelper; @@ -20,13 +22,26 @@ public class WallPlantFeature extends WallScatterFeature { @Override public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos pos, Direction dir) { - BlockState state = block.getDefaultState().with(BlockWallPlant.FACING, dir); - return block.canPlaceAt(state, world, pos); + if (block instanceof BlockWallPlant) { + BlockState state = block.getDefaultState().with(BlockWallPlant.FACING, dir); + return block.canPlaceAt(state, world, pos); + } + else if (block instanceof BlockAttached) { + BlockState state = block.getDefaultState().with(Properties.FACING, dir); + return block.canPlaceAt(state, world, pos); + } + return block.canPlaceAt(block.getDefaultState(), world, pos); } @Override public void generate(StructureWorldAccess world, Random random, BlockPos pos, Direction dir) { - BlockState state = block.getDefaultState().with(BlockWallPlant.FACING, dir); + BlockState state = block.getDefaultState(); + if (block instanceof BlockWallPlant) { + state = state.with(BlockWallPlant.FACING, dir); + } + else if (block instanceof BlockAttached) { + state = state.with(Properties.FACING, dir); + } BlocksHelper.setWithoutUpdate(world, pos, state); } } diff --git a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java index 37982ad1..62afa027 100644 --- a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java @@ -10,8 +10,8 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Material; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.util.math.Direction; import net.minecraft.util.math.MathHelper; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; From 1116daeb1f76d59325427374ac4b9e4e052c5623 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 25 Dec 2020 11:52:57 +0300 Subject: [PATCH 017/463] Shader for cluster --- gradle.properties | 2 +- src/main/java/ru/betterend/registry/EndBlocks.java | 5 ++--- .../betterend/materialmaps/block/umbrella_tree_cluster.json | 3 +++ 3 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/assets/betterend/materialmaps/block/umbrella_tree_cluster.json diff --git a/gradle.properties b/gradle.properties index 040e416b..e3d806d1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ loader_version=0.10.8 # Mod Properties - mod_version = 0.8.3-beta + mod_version = 0.8.4-beta maven_group = ru.betterend archives_base_name = better-end diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index e389d095..c20dd69d 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -181,6 +181,8 @@ public class EndBlocks { public static final WoodenMaterial HELIX_TREE = new WoodenMaterial("helix_tree", MaterialColor.GRAY, MaterialColor.ORANGE); public static final Block UMBRELLA_TREE_MEMBRANE = registerBlock("umbrella_tree_membrane", new BlockUmbrellaTreeMembrane()); + public static final Block UMBRELLA_TREE_CLUSTER = registerBlock("umbrella_tree_cluster", new BlockUmbrellaTreeCluster()); + public static final Block UMBRELLA_TREE_CLUSTER_EMPTY = registerBlock("umbrella_tree_cluster_empty", new BlockUmbrellaTreeClusterEmpty()); public static final WoodenMaterial UMBRELLA_TREE = new WoodenMaterial("umbrella_tree", MaterialColor.BLUE, MaterialColor.GREEN); // Small Plants // @@ -247,9 +249,6 @@ public class EndBlocks { // Crops // public static final Block SHADOW_BERRY = registerBlock("shadow_berry", new BlockShadowBerry()); - public static final Block UMBRELLA_TREE_CLUSTER = registerBlock("umbrella_tree_cluster", new BlockUmbrellaTreeCluster()); - public static final Block UMBRELLA_TREE_CLUSTER_EMPTY = registerBlock("umbrella_tree_cluster_empty", new BlockUmbrellaTreeClusterEmpty()); - // Vines // public static final Block DENSE_VINE = registerBlock("dense_vine", new BlockVine(15, true)); public static final Block TWISTED_VINE = registerBlock("twisted_vine", new BlockVine()); diff --git a/src/main/resources/assets/betterend/materialmaps/block/umbrella_tree_cluster.json b/src/main/resources/assets/betterend/materialmaps/block/umbrella_tree_cluster.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/umbrella_tree_cluster.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} From 71a3e88b62b8b9156397cc439f63bcb5778585c7 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 25 Dec 2020 17:29:06 +0300 Subject: [PATCH 018/463] Jungle vine --- .../betterend/blocks/BlockSmallJellyshroom.java | 3 ++- .../java/ru/betterend/registry/EndBlocks.java | 1 + .../java/ru/betterend/registry/EndFeatures.java | 5 +++-- .../world/biome/BiomeUmbrellaJungle.java | 1 + .../betterend/blockstates/jungle_vine.json | 16 ++++++++++++++++ .../resources/assets/betterend/lang/en_us.json | 3 ++- .../resources/assets/betterend/lang/ru_ru.json | 3 ++- .../materialmaps/block/jungle_vine.json | 3 +++ .../materialmaps/item/jungle_vine.json | 1 + .../models/block/jungle_vine_bottom_1.json | 6 ++++++ .../models/block/jungle_vine_bottom_2.json | 6 ++++++ .../models/block/jungle_vine_middle_1.json | 6 ++++++ .../models/block/jungle_vine_middle_2.json | 6 ++++++ .../betterend/models/item/jungle_vine.json | 6 ++++++ .../betterend/textures/block/jungle_vine.png | Bin 0 -> 503 bytes .../textures/block/jungle_vine_bottom.png | Bin 0 -> 1777 bytes 16 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/assets/betterend/blockstates/jungle_vine.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/jungle_vine.json create mode 100644 src/main/resources/assets/betterend/materialmaps/item/jungle_vine.json create mode 100644 src/main/resources/assets/betterend/models/block/jungle_vine_bottom_1.json create mode 100644 src/main/resources/assets/betterend/models/block/jungle_vine_bottom_2.json create mode 100644 src/main/resources/assets/betterend/models/block/jungle_vine_middle_1.json create mode 100644 src/main/resources/assets/betterend/models/block/jungle_vine_middle_2.json create mode 100644 src/main/resources/assets/betterend/models/item/jungle_vine.json create mode 100644 src/main/resources/assets/betterend/textures/block/jungle_vine.png create mode 100644 src/main/resources/assets/betterend/textures/block/jungle_vine_bottom.png diff --git a/src/main/java/ru/betterend/blocks/BlockSmallJellyshroom.java b/src/main/java/ru/betterend/blocks/BlockSmallJellyshroom.java index e0abafdc..c368f1ef 100644 --- a/src/main/java/ru/betterend/blocks/BlockSmallJellyshroom.java +++ b/src/main/java/ru/betterend/blocks/BlockSmallJellyshroom.java @@ -59,7 +59,8 @@ public class BlockSmallJellyshroom extends BlockAttached implements IRenderTypea public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { Direction direction = (Direction) state.get(FACING); BlockPos blockPos = pos.offset(direction.getOpposite()); - return sideCoversSmallSquare(world, blockPos, direction) && world.getBlockState(blockPos).isOpaque(); + BlockState support = world.getBlockState(blockPos); + return sideCoversSmallSquare(world, blockPos, direction) && support.isOpaque() && support.getLuminance() == 0; } @Override diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index c20dd69d..2347774a 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -254,6 +254,7 @@ public class EndBlocks { public static final Block TWISTED_VINE = registerBlock("twisted_vine", new BlockVine()); public static final Block BULB_VINE_SEED = registerBlock("bulb_vine_seed", new BlockBulbVineSeed()); public static final Block BULB_VINE = registerBlock("bulb_vine", new BlockBulbVine()); + public static final Block JUNGLE_VINE = registerBlock("jungle_vine", new BlockVine()); // Mob-Related public static final Block SILK_MOTH_NEST = registerBlock("silk_moth_nest", new BlockSilkMothNest()); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 33e5ca03..35d64f26 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -89,6 +89,7 @@ public class EndFeatures { public static final EndFeature DENSE_VINE = new EndFeature("dense_vine", new VineFeature(EndBlocks.DENSE_VINE, 24), 3); public static final EndFeature TWISTED_VINE = new EndFeature("twisted_vine", new VineFeature(EndBlocks.TWISTED_VINE, 24), 3); public static final EndFeature BULB_VINE = new EndFeature("bulb_vine", new VineFeature(EndBlocks.BULB_VINE, 24), 5); + public static final EndFeature JUNGLE_VINE = new EndFeature("jungle_vine", new VineFeature(EndBlocks.JUNGLE_VINE, 24), 5); // Ceil plants public static final EndFeature SMALL_JELLYSHROOM_CEIL = new EndFeature("small_jellyshroom_ceil", new SingleInvertedScatterFeature(EndBlocks.SMALL_JELLYSHROOM, 8), 8); @@ -104,8 +105,8 @@ public class EndFeatures { public static final EndFeature TWISTED_MOSS_WOOD = new EndFeature("twisted_moss_wood", new WallPlantOnLogFeature(EndBlocks.TWISTED_MOSS, 6), 25); public static final EndFeature BULB_MOSS = new EndFeature("bulb_moss", new WallPlantFeature(EndBlocks.BULB_MOSS, 6), 1); public static final EndFeature BULB_MOSS_WOOD = new EndFeature("bulb_moss_wood", new WallPlantOnLogFeature(EndBlocks.BULB_MOSS, 6), 15); - public static final EndFeature SMALL_JELLYSHROOM_WALL = new EndFeature("small_jellyshroom_wall", new WallPlantFeature(EndBlocks.SMALL_JELLYSHROOM, 6), 4); - public static final EndFeature SMALL_JELLYSHROOM_WOOD = new EndFeature("small_jellyshroom_wood", new WallPlantOnLogFeature(EndBlocks.SMALL_JELLYSHROOM, 6), 8); + public static final EndFeature SMALL_JELLYSHROOM_WALL = new EndFeature("small_jellyshroom_wall", new WallPlantFeature(EndBlocks.SMALL_JELLYSHROOM, 4), 4); + public static final EndFeature SMALL_JELLYSHROOM_WOOD = new EndFeature("small_jellyshroom_wood", new WallPlantOnLogFeature(EndBlocks.SMALL_JELLYSHROOM, 4), 8); // Water // public static final EndFeature BUBBLE_CORAL = new EndFeature("bubble_coral", new UnderwaterPlantFeature(EndBlocks.BUBBLE_CORAL, 6), 10); diff --git a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java index a5ffe6c2..9506418f 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java +++ b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java @@ -21,6 +21,7 @@ public class BiomeUmbrellaJungle extends EndBiome { .addFeature(EndFeatures.SMALL_JELLYSHROOM_WALL) .addFeature(EndFeatures.SMALL_JELLYSHROOM_WOOD) .addFeature(EndFeatures.SMALL_JELLYSHROOM_CEIL) + .addFeature(EndFeatures.JUNGLE_VINE) .addFeature(EndFeatures.CHARNIA_CYAN) .addFeature(EndFeatures.CHARNIA_GREEN) .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) diff --git a/src/main/resources/assets/betterend/blockstates/jungle_vine.json b/src/main/resources/assets/betterend/blockstates/jungle_vine.json new file mode 100644 index 00000000..ed2bf59d --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/jungle_vine.json @@ -0,0 +1,16 @@ +{ + "variants": { + "shape=top": [ + { "model": "betterend:block/jungle_vine_middle_1" }, + { "model": "betterend:block/jungle_vine_middle_2" } + ], + "shape=middle": [ + { "model": "betterend:block/jungle_vine_middle_1" }, + { "model": "betterend:block/jungle_vine_middle_2" } + ], + "shape=bottom": [ + { "model": "betterend:block/jungle_vine_bottom_1" }, + { "model": "betterend:block/jungle_vine_bottom_2" } + ] + } +} diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 745046de..e3165444 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -521,5 +521,6 @@ "block.betterend.twisted_umbrella_moss": "Twisted Umbrella Moss", "block.betterend.twisted_umbrella_moss_tall": "Twisted Umbrella Moss Tall", "block.betterend.umbrella_tree_cluster": "Umbrella Tree Cluster", - "block.betterend.umbrella_tree_cluster_empty": "Empty Umbrella Tree Cluster" + "block.betterend.umbrella_tree_cluster_empty": "Empty Umbrella Tree Cluster", + "block.betterend.jungle_vine": "Jungle Vine" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index d56eb055..0b007db6 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -523,5 +523,6 @@ "block.betterend.twisted_umbrella_moss": "Закрученный зонтичный мох", "block.betterend.twisted_umbrella_moss_tall": "Высокий закрученный зонтичный мох", "block.betterend.umbrella_tree_cluster": "Кластер зонтичного дерева", - "block.betterend.umbrella_tree_cluster_empty": "Пустой кластер хонтичного дерева" + "block.betterend.umbrella_tree_cluster_empty": "Пустой кластер хонтичного дерева", + "block.betterend.jungle_vine": "Лоза джунглей" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/jungle_vine.json b/src/main/resources/assets/betterend/materialmaps/block/jungle_vine.json new file mode 100644 index 00000000..1fc9123d --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/jungle_vine.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving" +} diff --git a/src/main/resources/assets/betterend/materialmaps/item/jungle_vine.json b/src/main/resources/assets/betterend/materialmaps/item/jungle_vine.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/jungle_vine.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/models/block/jungle_vine_bottom_1.json b/src/main/resources/assets/betterend/models/block/jungle_vine_bottom_1.json new file mode 100644 index 00000000..d0a016af --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_vine_bottom_1.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_no_distortion", + "textures": { + "texture": "betterend:block/jungle_vine_bottom" + } +} diff --git a/src/main/resources/assets/betterend/models/block/jungle_vine_bottom_2.json b/src/main/resources/assets/betterend/models/block/jungle_vine_bottom_2.json new file mode 100644 index 00000000..0f6531f6 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_vine_bottom_2.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_no_distortion_inverted", + "textures": { + "texture": "betterend:block/jungle_vine_bottom" + } +} diff --git a/src/main/resources/assets/betterend/models/block/jungle_vine_middle_1.json b/src/main/resources/assets/betterend/models/block/jungle_vine_middle_1.json new file mode 100644 index 00000000..a6761519 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_vine_middle_1.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_no_distortion", + "textures": { + "texture": "betterend:block/jungle_vine" + } +} diff --git a/src/main/resources/assets/betterend/models/block/jungle_vine_middle_2.json b/src/main/resources/assets/betterend/models/block/jungle_vine_middle_2.json new file mode 100644 index 00000000..6c0d14c2 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_vine_middle_2.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_no_distortion_inverted", + "textures": { + "texture": "betterend:block/jungle_vine" + } +} diff --git a/src/main/resources/assets/betterend/models/item/jungle_vine.json b/src/main/resources/assets/betterend/models/item/jungle_vine.json new file mode 100644 index 00000000..24123820 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/jungle_vine.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/jungle_vine_bottom" + } +} diff --git a/src/main/resources/assets/betterend/textures/block/jungle_vine.png b/src/main/resources/assets/betterend/textures/block/jungle_vine.png new file mode 100644 index 0000000000000000000000000000000000000000..8d71387df42d8c78235d42b00f85b7eb17659bf2 GIT binary patch literal 503 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0gOpRK~y+TeUdLo z!%+~&Z!(6(unqY!4Fe}?w3y9`!JXEOy{J2SG5E^sfP5Xlh)RWs4M9pFCM-0tf@6ptP$rm?GZm#Iw ze0wlP74m#`#l7oJAZY)1zHN*h7l~2P=SL$Y@0Sm@4P7b(eB9V^B!LEiV1!bUd=QMy z--UpH7I0vs9L!Hi55BELB0pIZ{-_~&-L(J!002ovPDHLkV1nQk+I9c{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/jungle_vine_bottom.png b/src/main/resources/assets/betterend/textures/block/jungle_vine_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..e584bf10f495bb4da03a289eeb7f4c681d00349a GIT binary patch literal 1777 zcmbVN4Qvxt9KQj=C^Cr|Ue`1~h!Bpb;EG3`D_g3K&6z;A93Djbl?5j2Q&yM10qE4H*35l6UXDd%ySl zfB$bypkl#9Q-KLVkcmF8rxMPSjFCGQzV92j&cbQD;;q#XB(K95IU9=drXk3f0U=nU z*Z3DQoGe;cUJe0EQdA%sLFT%W3d_|49SwnqAUUz04;{u(fp=onc0b`)+#o7=8&y!% zSP|qJ>p7aoT=USmNd^*#KxfgU7?U(6>BQ2!3|t$ZaSTmE^m->&Y6wJY`~lQ0s{plI zip?BpqtFuCLKYJ=Wt)vs1X+R;B{*p{6C^_vGgcbSJQ$Rw@?oaZQ=X9pcTOy->k5P8 ziA2JZuv%m_f|E2&;{=6Mlo=w-T1wK{q*>AmM;JUn<5WS>1zAE3Mm8ij=uQl3I&6Zd zWN9TW<0j}ZJjp6JX(0@g(my^50Nrk8ctH zUF-K}W!zF1QOt_a^s+cKBjb=;qP1X30eB_Q!j?ItM98lKhJe+Ba#6P8txg*FQ!8v(c?MKCn$NyaV5WEBdA+F8?D`2CDe(sWkh zfY0N^pxG8d;F&PzC<)OdYqs0%oSApn2s7<)6q~I)#gSnLZKp%wk^3H*YcPU4a-aX7 z_ZO)GEG{;7+dM|e8Ck)21r5e4l_`oU@MLBc6VP-bFf3;zxD(@y$O0bAd=_ro1H-h5 zD1fB@5bj}^CWrL|tAf%9^wxjLC>-jK8`U^$3jS9s(`PqS?g$*V17n%(LvWMrWI%%L zOND)^sIa*OL2`EZJf%TL^M=a9xO?$E*QBAPXM?9ZF9>T&*SC~=np`W7w;hpQUa!B@ z=LwyvBZ*Dt21l<2g}YkbU$xa0^gS@y^;@d9b`*%haETwUHxcMqOCv~tt&=0AFt zmenIn>fo=XP7pC@9Q*CFW^FO$w{6KNdnW4UGmugLy$GDE2veynhdMx7le0s0L zzH#r#SMu^FEb*n`=LShDZ6=gutKU$*Dj0{_XomSHOjl#lk#n4Pnp+*&Jo zsTt>=*f=ZJar|g^enojxDslzsYiGVP#ak;ow?F>Fi_vJ)=$uj0-}`8xx1n;&~52Rkv;@=oaL#|u}l4c=Wk5c%-I zEe#!;?;myU?WwOi&-b?PoV97q{`v21Yunj%V!PEdr*4{zU=I(fmYGj)*|qM?{@NUt zHF+A3j#CcghNoPL?^$)ZYH3~TH@i)p6Thhb6<>~^&wt(BHqJEJ_$m3yDm?GbuUq*i D{=#jc literal 0 HcmV?d00001 From 1aeeb158fde0a4a30dd9dfe803cec5737c473163 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 25 Dec 2020 18:52:50 +0300 Subject: [PATCH 019/463] Jungle fern --- .../java/ru/betterend/registry/EndBlocks.java | 1 + .../ru/betterend/registry/EndFeatures.java | 1 + .../world/biome/BiomeUmbrellaJungle.java | 1 + .../betterend/blockstates/jungle_fern.json | 8 ++ .../assets/betterend/lang/en_us.json | 3 +- .../assets/betterend/lang/ru_ru.json | 3 +- .../materialmaps/block/jungle_fern.json | 18 +++ .../betterend/models/block/jungle_fern.json | 129 ++++++++++++++++++ .../textures/block/jungle_fern_leaf.png | Bin 0 -> 1681 bytes .../textures/block/jungle_fern_middle.png | Bin 0 -> 1842 bytes .../textures/block/jungle_fern_spore.png | Bin 0 -> 1552 bytes 11 files changed, 162 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/assets/betterend/blockstates/jungle_fern.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/jungle_fern.json create mode 100644 src/main/resources/assets/betterend/models/block/jungle_fern.json create mode 100644 src/main/resources/assets/betterend/textures/block/jungle_fern_leaf.png create mode 100644 src/main/resources/assets/betterend/textures/block/jungle_fern_middle.png create mode 100644 src/main/resources/assets/betterend/textures/block/jungle_fern_spore.png diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 2347774a..7548fd3a 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -245,6 +245,7 @@ public class EndBlocks { public static final Block TWISTED_MOSS = registerBlock("twisted_moss", new BlockWallPlant()); public static final Block TUBE_WORM = registerBlock("tube_worm", new BlockUnderwaterWallPlant()); public static final Block BULB_MOSS = registerBlock("bulb_moss", new BlockWallPlant(12)); + public static final Block JUNGLE_FERN = registerBlock("jungle_fern", new BlockWallPlant()); // Crops // public static final Block SHADOW_BERRY = registerBlock("shadow_berry", new BlockShadowBerry()); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 35d64f26..8bf0f4ec 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -107,6 +107,7 @@ public class EndFeatures { public static final EndFeature BULB_MOSS_WOOD = new EndFeature("bulb_moss_wood", new WallPlantOnLogFeature(EndBlocks.BULB_MOSS, 6), 15); public static final EndFeature SMALL_JELLYSHROOM_WALL = new EndFeature("small_jellyshroom_wall", new WallPlantFeature(EndBlocks.SMALL_JELLYSHROOM, 4), 4); public static final EndFeature SMALL_JELLYSHROOM_WOOD = new EndFeature("small_jellyshroom_wood", new WallPlantOnLogFeature(EndBlocks.SMALL_JELLYSHROOM, 4), 8); + public static final EndFeature JUNGLE_FERN_WOOD = new EndFeature("jungle_fern_wood", new WallPlantOnLogFeature(EndBlocks.JUNGLE_FERN, 4), 8); // Water // public static final EndFeature BUBBLE_CORAL = new EndFeature("bubble_coral", new UnderwaterPlantFeature(EndBlocks.BUBBLE_CORAL, 6), 10); diff --git a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java index 9506418f..f9153373 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java +++ b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java @@ -18,6 +18,7 @@ public class BiomeUmbrellaJungle extends EndBiome { .addFeature(EndFeatures.JUNGLE_GRASS) .addFeature(EndFeatures.CYAN_MOSS) .addFeature(EndFeatures.CYAN_MOSS_WOOD) + .addFeature(EndFeatures.JUNGLE_FERN_WOOD) .addFeature(EndFeatures.SMALL_JELLYSHROOM_WALL) .addFeature(EndFeatures.SMALL_JELLYSHROOM_WOOD) .addFeature(EndFeatures.SMALL_JELLYSHROOM_CEIL) diff --git a/src/main/resources/assets/betterend/blockstates/jungle_fern.json b/src/main/resources/assets/betterend/blockstates/jungle_fern.json new file mode 100644 index 00000000..2abe9492 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/jungle_fern.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "betterend:block/jungle_fern", "y": 180 }, + "facing=south": { "model": "betterend:block/jungle_fern" }, + "facing=east": { "model": "betterend:block/jungle_fern", "y": 270 }, + "facing=west": { "model": "betterend:block/jungle_fern", "y": 90 } + } +} diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index e3165444..2547499b 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -522,5 +522,6 @@ "block.betterend.twisted_umbrella_moss_tall": "Twisted Umbrella Moss Tall", "block.betterend.umbrella_tree_cluster": "Umbrella Tree Cluster", "block.betterend.umbrella_tree_cluster_empty": "Empty Umbrella Tree Cluster", - "block.betterend.jungle_vine": "Jungle Vine" + "block.betterend.jungle_vine": "Jungle Vine", + "block.betterend.jungle_fern": "Jungle Fern" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 0b007db6..3dcb9835 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -524,5 +524,6 @@ "block.betterend.twisted_umbrella_moss_tall": "Высокий закрученный зонтичный мох", "block.betterend.umbrella_tree_cluster": "Кластер зонтичного дерева", "block.betterend.umbrella_tree_cluster_empty": "Пустой кластер хонтичного дерева", - "block.betterend.jungle_vine": "Лоза джунглей" + "block.betterend.jungle_vine": "Лоза джунглей", + "block.betterend.jungle_fern": "Папоротник джунглей" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/jungle_fern.json b/src/main/resources/assets/betterend/materialmaps/block/jungle_fern.json new file mode 100644 index 00000000..6c554732 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/jungle_fern.json @@ -0,0 +1,18 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/jungle_fern_leaf", + "material": "betterend:waving_wall" + }, + { + "sprite": "betterend:block/jungle_fern_middle", + "material": "betterend:waving_wall" + }, + { + "sprite": "betterend:block/jungle_fern_spore", + "material": "betterend:waving_small" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_fern.json b/src/main/resources/assets/betterend/models/block/jungle_fern.json new file mode 100644 index 00000000..5410c746 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_fern.json @@ -0,0 +1,129 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/jungle_fern_leaf", + "texture": "betterend:block/jungle_fern_leaf", + "spore": "betterend:block/jungle_fern_spore", + "texture1": "betterend:block/jungle_fern_middle" + }, + "elements": [ + { + "__comment": "PlaneY3", + "from": [ 0, 8, 0 ], + "to": [ 16, 8.001, 8 ], + "rotation": { "origin": [ 0, 8, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY6", + "from": [ 8, 7.875, -7 ], + "to": [ 16, 7.876, 9 ], + "rotation": { "origin": [ 8, 7.875, -7 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY6", + "from": [ 0, 7.874, -7 ], + "to": [ 8, 7.875, 9 ], + "rotation": { "origin": [ 8, 7.875, -7 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 16, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY8", + "from": [ 0, 11, 7.375 ], + "to": [ 16, 11.001, 15.375 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture" }, + "up": { "uv": [ 16, 8, 0, 0 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 15.25, 10.875, -7 ], + "to": [ 23.25, 10.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -7.25, 10.875, -7 ], + "to": [ 0.75, 10.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -5, 0 ], + "to": [ 8.001, 11, 16 ], + "rotation": { "origin": [ 8, -5, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -5, 0 ], + "to": [ 8.001, 11, 16 ], + "rotation": { "origin": [ 8, -5, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 8.5, 8, -10 ], + "to": [ 24.5, 8.001, 6 ], + "rotation": { "origin": [ 24.5, 8, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -13.0001, 7.625, 1.5 ], + "to": [ 2.9999, 7.626, 17.5 ], + "rotation": { "origin": [ 3, 7.625, 17.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneZ12", + "from": [ 0, 8, 0.5 ], + "to": [ 16, 24, 0.501 ], + "rotation": { "origin": [ 0, 8, 0.5 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture1" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture1" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf.png new file mode 100644 index 0000000000000000000000000000000000000000..52a1e00a992598bf182e4ed438c69116e3866948 GIT binary patch literal 1681 zcmbVNe{2&~9KXqcv23uJ7`74gJaD0b>;353t~ZV`dSmV2#@wnDRI=OMTYIke!@C>p z788xzVpJAl76Kv@O$i!Z9BKlxiHkan$bu$HfeUvUI{8dHdEbU4bC^ zm*r5{3iDeTQB$0Pq_qQQLeU`_LDttMbV2L{7TOLXvdUtqv2hHQB^KN6=1E@ngQy(n zF+giiQ%LOT6nzp_y8&IFU?714ECEd@G1X)eESBbF;M)F7U}zd*b+TBUEf5X!&8S~9 z0P1#naFME_QLoQQc}O2!wGO38%1e-5f^y*`#gHDxVz z&JaXA9(TrFPR)oAl+WiQNSdH&93pVDTeXA)u9~Z|3>+{;L)I->Q&F2yXxF+d7K573 zo1o}9TGhrqW-5tOQ7GN=&q)D8jaoQcCyi66%Q1n{T#gODYl-DG= zqx-MWYKHbOZt4ao%o<6sgntD~BGaK6iU4hv6(Ir$U5#L9&XbH^i)jWF47GEmwcvRs zsG63biXh0b7&O}{%Mw%Va(M+WN#h#*X20qP>qTmL1a2&g|{SL3`X#GkE9pIukESvYJ5_A=Lp;3n6} zfC}4}0sBV}tU8s6spmnTq!M!CzuYJMa|JFo91y!=p-L@)xF?D6}mq(7h z8Av`hm5Mqp6l~bozwzJ%=Q(iTRL>7ZML$*6?0EU){u=Y#q;E_-WF9$vu6}Tkn8uUm z%Lb6Cw)jvgIsHN-?MKk3e;XP3I&~rW^LLB!m3_bJ#>1=kZ$XEW&)?m<{A|+@ch8mb zimRi0U->+o>~EP|eXVlN`|6`l_RY-hd;bHa@;PgidG8zW46!Z354!s=#mf#2Zz(O9 z8C%&ZoSvSYDZDNJonyUA?&#dr_;FF*=%$gf>PriL2|66hj*cUb&%J1b&gOsOrhNS$ zopG05{dD2ZZ+rLbJ$zcbMQ{&H`c<`mUwz*tvVnt+*8G9+LuqcO4xbt({%8Y;L%qug3mq1nZl) J*Eh92@dw#AI&1&{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_middle.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_middle.png new file mode 100644 index 0000000000000000000000000000000000000000..0731ac0012d04df4fd054d0664a78ed17d2fcd2e GIT binary patch literal 1842 zcmbVNTWs4@7TtIb z#M%>bYQP#u?%_pE@jyvSBTrG$F`6JcBSjsGL&zf2C@ZT1_3P}16e&vrwa=eqlX?{8 z1va`rz0tH!+EGl``?r+G|Ta9fcJ*U>Oo;|hLqv^V!Nxp@RLC0 zEKBDZrcfw&3SN(9WEn0T4l^uZ0H85~Hb+$p7HQRNuQ9}sDH^hF$(l;qj4-VYTLOiZ zE`^}zbz0S|rU@sEDMFp$Jggm31t^JioIY&iE6yd6L3yMg)iN=bt7G+?W@%Fr(?Pzp9Y9MH7MoQE2 zwLHLeV?pKTEV>QDjO7o77{4H0+!|g4g4uC$ooUQkL_T+Jj*UYlbR%F zM*j;9@gU4|;2J3I8VOqPf5DQ-XEZ~BIA&RaS;XjSmLlt!dNA5t)`=x zmGql%p$~l{J7&`bF4f* zyKwaUU#AZ@FFpvGPxn2)B>{GgKYFqpeB@Q|>_XhTzj;U7*|nr|=f(2Jmj(@I`_vZ% zxbVx|6Q`ONF26W^@PVHr-;7K_@}pxX|Jk;^vC#4z@dx32+7WN-ZEydo<&yq)@j{cc zBN%bM=G=7R*!(TK-*K=%y}s`D&o`G8^1dr`>Fj*rM@YQqe#3pSq0~kuN{yCta8e)I z==_sgd}elH?<)tp&bhwdGvg>vD{FR4w$4nQA>O?ld0~G1&}~yc+;R3(()qz-k8gCh zmO9rDuAz=Mmdd-%HOQGGx55ee(3VN>)@heRZjdK_8yCi(ntsc%?#Q?2-+%LpVE@$; M-953l?-_jZUt|qh`v3p{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_spore.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_spore.png new file mode 100644 index 0000000000000000000000000000000000000000..114400bd8a43978337ca89b05612ad78bab7193a GIT binary patch literal 1552 zcmbVMTWB0r7@nBY*20#8q$HK#I5FB%XXmoF%pqflJJDUpq#<4G_Q9C5GiP^)%*>h0 zob7HxrKO-$urH!m3o45EQ1DvtrP_cik|J2B54I2?Pud5uN)QSv>zTa_t;Aag&YatK zzW@HeFgx>PY}dYB48z3oIc<*4d&04EJN-Yf*@ASs*UKFZ7-shu;plti;O_ewX4|G! zD3YQ+4GiqWp@~Z<-f%pMW|;Abh6jyBMA#ClSgy+5ytvA-mZ@?_Qo5*nSyZ)hD?U2B zGE*>C77fMZCLUwQ8-Nlxh(NaC*lqwCD%a)(bR8ZG9NUJFMU|Tj1+qnbmd#=xv8i~P zH>9M@W|X*;78N=9C@YInMi4WCl;A}Ph-r{e*zU(sX}(zobJ`PKS#+mzRYE)<2=#hB zUQfiaUlAllQ3O#IWSOT3K3H}MZ18R{(qqt2VEC3tEbOu&BP`(>Q8}t<#{|cVXx*Ue zCh9Pu0X;#Ai=jzvplL)nujbor;ie%V8#%}&0mVuY)~jNIgDUgf6o0o1j+9?95J z7srW21Z3(MHKXg0Ezv+< zV8WCoJ_AvPS4znwuRufMQ>An|Ey+qMku3M#YuKoT!R@^_|L6NdzD0`*+IP(pmRy(> zAZGaG8hQ3BOp2&=JUittw}+jqBBZVyh|LAZ?i5Zy$b47s#@`Ls`MU%D_%dt5WGO%}$! zGJbEhCi+KDE>#EFf!BX~Q_l^4-TL(>zPWnnnZbGcjVq_WWy~|8zIy4|zRlN;7KhGW zzqWLdd3WfYU#?%h{Njz$#QdiV8{b_0(q%q6cVfJ8`a9;i_2*k_=SGj;*9!KpHDlX` zp4uFF`K|Ap=8sV1Z|y0Hi|-Aup9G(1V<&3s10Np0!3|IMFTC`@>ZRuSKJBJ;>*v-V zpFMId#^g^`&)!2~Vn5uwLHa&Ev$k*N!w=c>?19m@cWi82nPztU@cDz6pMG^9?AiIL L8SVYY7f$^Nnd|+0 literal 0 HcmV?d00001 From c42dbfdf87eb92829299dd3c1b60af857133d2b8 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 25 Dec 2020 19:21:06 +0300 Subject: [PATCH 020/463] Fern randomization & jellyshroom item texture --- .../ru/betterend/registry/EndFeatures.java | 2 +- .../betterend/blockstates/jungle_fern.json | 48 ++++++- .../materialmaps/block/jungle_fern.json | 24 ++++ .../{jungle_fern.json => jungle_fern_1.json} | 0 .../betterend/models/block/jungle_fern_2.json | 129 ++++++++++++++++++ .../betterend/models/block/jungle_fern_3.json | 129 ++++++++++++++++++ .../betterend/models/block/jungle_fern_4.json | 129 ++++++++++++++++++ .../betterend/models/block/jungle_fern_5.json | 129 ++++++++++++++++++ .../betterend/models/block/jungle_fern_6.json | 129 ++++++++++++++++++ .../betterend/models/block/jungle_fern_7.json | 129 ++++++++++++++++++ .../betterend/models/block/jungle_fern_8.json | 129 ++++++++++++++++++ .../betterend/models/block/jungle_fern_9.json | 129 ++++++++++++++++++ .../models/item/small_jellyshroom.json | 6 + .../textures/block/jungle_fern_leaf_2.png | Bin 0 -> 1794 bytes .../textures/block/jungle_fern_leaf_3.png | Bin 0 -> 1765 bytes .../textures/block/jungle_fern_middle_2.png | Bin 0 -> 2018 bytes .../textures/block/jungle_fern_middle_3.png | Bin 0 -> 1928 bytes .../textures/block/jungle_fern_spore_2.png | Bin 0 -> 1926 bytes .../textures/block/jungle_fern_spore_3.png | Bin 0 -> 1877 bytes .../textures/item/small_jellyshroom.png | Bin 0 -> 448 bytes 20 files changed, 1107 insertions(+), 5 deletions(-) rename src/main/resources/assets/betterend/models/block/{jungle_fern.json => jungle_fern_1.json} (100%) create mode 100644 src/main/resources/assets/betterend/models/block/jungle_fern_2.json create mode 100644 src/main/resources/assets/betterend/models/block/jungle_fern_3.json create mode 100644 src/main/resources/assets/betterend/models/block/jungle_fern_4.json create mode 100644 src/main/resources/assets/betterend/models/block/jungle_fern_5.json create mode 100644 src/main/resources/assets/betterend/models/block/jungle_fern_6.json create mode 100644 src/main/resources/assets/betterend/models/block/jungle_fern_7.json create mode 100644 src/main/resources/assets/betterend/models/block/jungle_fern_8.json create mode 100644 src/main/resources/assets/betterend/models/block/jungle_fern_9.json create mode 100644 src/main/resources/assets/betterend/models/item/small_jellyshroom.json create mode 100644 src/main/resources/assets/betterend/textures/block/jungle_fern_leaf_2.png create mode 100644 src/main/resources/assets/betterend/textures/block/jungle_fern_leaf_3.png create mode 100644 src/main/resources/assets/betterend/textures/block/jungle_fern_middle_2.png create mode 100644 src/main/resources/assets/betterend/textures/block/jungle_fern_middle_3.png create mode 100644 src/main/resources/assets/betterend/textures/block/jungle_fern_spore_2.png create mode 100644 src/main/resources/assets/betterend/textures/block/jungle_fern_spore_3.png create mode 100644 src/main/resources/assets/betterend/textures/item/small_jellyshroom.png diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 8bf0f4ec..8236c97f 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -107,7 +107,7 @@ public class EndFeatures { public static final EndFeature BULB_MOSS_WOOD = new EndFeature("bulb_moss_wood", new WallPlantOnLogFeature(EndBlocks.BULB_MOSS, 6), 15); public static final EndFeature SMALL_JELLYSHROOM_WALL = new EndFeature("small_jellyshroom_wall", new WallPlantFeature(EndBlocks.SMALL_JELLYSHROOM, 4), 4); public static final EndFeature SMALL_JELLYSHROOM_WOOD = new EndFeature("small_jellyshroom_wood", new WallPlantOnLogFeature(EndBlocks.SMALL_JELLYSHROOM, 4), 8); - public static final EndFeature JUNGLE_FERN_WOOD = new EndFeature("jungle_fern_wood", new WallPlantOnLogFeature(EndBlocks.JUNGLE_FERN, 4), 8); + public static final EndFeature JUNGLE_FERN_WOOD = new EndFeature("jungle_fern_wood", new WallPlantOnLogFeature(EndBlocks.JUNGLE_FERN, 3), 12); // Water // public static final EndFeature BUBBLE_CORAL = new EndFeature("bubble_coral", new UnderwaterPlantFeature(EndBlocks.BUBBLE_CORAL, 6), 10); diff --git a/src/main/resources/assets/betterend/blockstates/jungle_fern.json b/src/main/resources/assets/betterend/blockstates/jungle_fern.json index 2abe9492..d5fd0e42 100644 --- a/src/main/resources/assets/betterend/blockstates/jungle_fern.json +++ b/src/main/resources/assets/betterend/blockstates/jungle_fern.json @@ -1,8 +1,48 @@ { "variants": { - "facing=north": { "model": "betterend:block/jungle_fern", "y": 180 }, - "facing=south": { "model": "betterend:block/jungle_fern" }, - "facing=east": { "model": "betterend:block/jungle_fern", "y": 270 }, - "facing=west": { "model": "betterend:block/jungle_fern", "y": 90 } + "facing=north": [ + { "model": "betterend:block/jungle_fern_1", "y": 180 }, + { "model": "betterend:block/jungle_fern_2", "y": 180 }, + { "model": "betterend:block/jungle_fern_3", "y": 180 }, + { "model": "betterend:block/jungle_fern_4", "y": 180 }, + { "model": "betterend:block/jungle_fern_5", "y": 180 }, + { "model": "betterend:block/jungle_fern_6", "y": 180 }, + { "model": "betterend:block/jungle_fern_7", "y": 180 }, + { "model": "betterend:block/jungle_fern_8", "y": 180 }, + { "model": "betterend:block/jungle_fern_9", "y": 180 } + ], + "facing=south": [ + { "model": "betterend:block/jungle_fern_1" }, + { "model": "betterend:block/jungle_fern_2" }, + { "model": "betterend:block/jungle_fern_3" }, + { "model": "betterend:block/jungle_fern_4" }, + { "model": "betterend:block/jungle_fern_5" }, + { "model": "betterend:block/jungle_fern_6" }, + { "model": "betterend:block/jungle_fern_7" }, + { "model": "betterend:block/jungle_fern_8" }, + { "model": "betterend:block/jungle_fern_9" } + ], + "facing=east": [ + { "model": "betterend:block/jungle_fern_1", "y": 270 }, + { "model": "betterend:block/jungle_fern_2", "y": 270 }, + { "model": "betterend:block/jungle_fern_3", "y": 270 }, + { "model": "betterend:block/jungle_fern_4", "y": 270 }, + { "model": "betterend:block/jungle_fern_5", "y": 270 }, + { "model": "betterend:block/jungle_fern_6", "y": 270 }, + { "model": "betterend:block/jungle_fern_7", "y": 270 }, + { "model": "betterend:block/jungle_fern_8", "y": 270 }, + { "model": "betterend:block/jungle_fern_9", "y": 270 } + ], + "facing=west": [ + { "model": "betterend:block/jungle_fern_1", "y": 90 }, + { "model": "betterend:block/jungle_fern_2", "y": 90 }, + { "model": "betterend:block/jungle_fern_3", "y": 90 }, + { "model": "betterend:block/jungle_fern_4", "y": 90 }, + { "model": "betterend:block/jungle_fern_5", "y": 90 }, + { "model": "betterend:block/jungle_fern_6", "y": 90 }, + { "model": "betterend:block/jungle_fern_7", "y": 90 }, + { "model": "betterend:block/jungle_fern_8", "y": 90 }, + { "model": "betterend:block/jungle_fern_9", "y": 90 } + ] } } diff --git a/src/main/resources/assets/betterend/materialmaps/block/jungle_fern.json b/src/main/resources/assets/betterend/materialmaps/block/jungle_fern.json index 6c554732..11187571 100644 --- a/src/main/resources/assets/betterend/materialmaps/block/jungle_fern.json +++ b/src/main/resources/assets/betterend/materialmaps/block/jungle_fern.json @@ -5,13 +5,37 @@ "sprite": "betterend:block/jungle_fern_leaf", "material": "betterend:waving_wall" }, + { + "sprite": "betterend:block/jungle_fern_leaf_2", + "material": "betterend:waving_wall" + }, + { + "sprite": "betterend:block/jungle_fern_leaf_3", + "material": "betterend:waving_wall" + }, { "sprite": "betterend:block/jungle_fern_middle", "material": "betterend:waving_wall" }, + { + "sprite": "betterend:block/jungle_fern_middle_2", + "material": "betterend:waving_wall" + }, + { + "sprite": "betterend:block/jungle_fern_middle_3", + "material": "betterend:waving_wall" + }, { "sprite": "betterend:block/jungle_fern_spore", "material": "betterend:waving_small" + }, + { + "sprite": "betterend:block/jungle_fern_spore_2", + "material": "betterend:waving_small" + }, + { + "sprite": "betterend:block/jungle_fern_spore_3", + "material": "betterend:waving_small" } ] } diff --git a/src/main/resources/assets/betterend/models/block/jungle_fern.json b/src/main/resources/assets/betterend/models/block/jungle_fern_1.json similarity index 100% rename from src/main/resources/assets/betterend/models/block/jungle_fern.json rename to src/main/resources/assets/betterend/models/block/jungle_fern_1.json diff --git a/src/main/resources/assets/betterend/models/block/jungle_fern_2.json b/src/main/resources/assets/betterend/models/block/jungle_fern_2.json new file mode 100644 index 00000000..ebba05a9 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_fern_2.json @@ -0,0 +1,129 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/jungle_fern_leaf", + "texture": "betterend:block/jungle_fern_leaf", + "spore": "betterend:block/jungle_fern_spore", + "texture1": "betterend:block/jungle_fern_middle" + }, + "elements": [ + { + "__comment": "PlaneY3", + "from": [ 0, 11, 0 ], + "to": [ 16, 11.001, 8 ], + "rotation": { "origin": [ 0, 11, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY6", + "from": [ 8, 10.875, -7 ], + "to": [ 16, 10.876, 9 ], + "rotation": { "origin": [ 8, 10.875, -7 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY6", + "from": [ 0, 10.874, -7 ], + "to": [ 8, 10.875, 9 ], + "rotation": { "origin": [ 8, 10.875, -7 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 16, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY8", + "from": [ 0, 14, 7.375 ], + "to": [ 16, 14.001, 15.375 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture" }, + "up": { "uv": [ 16, 8, 0, 0 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 15.25, 13.875, -7 ], + "to": [ 23.25, 13.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -7.25, 13.875, -7 ], + "to": [ 0.75, 13.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -2, 0 ], + "to": [ 8.001, 14, 16 ], + "rotation": { "origin": [ 8, -2, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -2, 0 ], + "to": [ 8.001, 14, 16 ], + "rotation": { "origin": [ 8, -2, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 8.5, 11, -10 ], + "to": [ 24.5, 11.001, 6 ], + "rotation": { "origin": [ 24.5, 11, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -13.0001, 10.625, 1.5 ], + "to": [ 2.9999, 10.626, 17.5 ], + "rotation": { "origin": [ 3, 10.625, 17.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneZ12", + "from": [ 0, 11, 0.5 ], + "to": [ 16, 27, 0.501 ], + "rotation": { "origin": [ 0, 11, 0.5 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture1" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture1" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_fern_3.json b/src/main/resources/assets/betterend/models/block/jungle_fern_3.json new file mode 100644 index 00000000..6af45852 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_fern_3.json @@ -0,0 +1,129 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/jungle_fern_leaf", + "texture": "betterend:block/jungle_fern_leaf", + "spore": "betterend:block/jungle_fern_spore", + "texture1": "betterend:block/jungle_fern_middle" + }, + "elements": [ + { + "__comment": "PlaneY3", + "from": [ 0, 4, 0 ], + "to": [ 16, 4.001, 8 ], + "rotation": { "origin": [ 0, 4, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY6", + "from": [ 8, 3.875, -7 ], + "to": [ 16, 3.876, 9 ], + "rotation": { "origin": [ 8, 3.875, -7 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY6", + "from": [ 0, 3.874, -7 ], + "to": [ 8, 3.875, 9 ], + "rotation": { "origin": [ 8, 3.875, -7 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 16, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY8", + "from": [ 0, 7, 7.375 ], + "to": [ 16, 7.001, 15.375 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture" }, + "up": { "uv": [ 16, 8, 0, 0 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 15.25, 6.875, -7 ], + "to": [ 23.25, 6.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -7.25, 6.875, -7 ], + "to": [ 0.75, 6.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -9, 0 ], + "to": [ 8.001, 7, 16 ], + "rotation": { "origin": [ 8, -9, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -9, 0 ], + "to": [ 8.001, 7, 16 ], + "rotation": { "origin": [ 8, -9, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 8.5, 4, -10 ], + "to": [ 24.5, 4.001, 6 ], + "rotation": { "origin": [ 24.5, 4, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -13.0001, 3.625, 1.5 ], + "to": [ 2.9999, 3.626, 17.5 ], + "rotation": { "origin": [ 3, 3.625, 17.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneZ12", + "from": [ 0, 4, 0.5 ], + "to": [ 16, 20, 0.501 ], + "rotation": { "origin": [ 0, 4, 0.5 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture1" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture1" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_fern_4.json b/src/main/resources/assets/betterend/models/block/jungle_fern_4.json new file mode 100644 index 00000000..c2f88121 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_fern_4.json @@ -0,0 +1,129 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/jungle_fern_leaf_2", + "texture": "betterend:block/jungle_fern_leaf_2", + "spore": "betterend:block/jungle_fern_spore_2", + "texture1": "betterend:block/jungle_fern_middle_2" + }, + "elements": [ + { + "__comment": "PlaneY3", + "from": [ 0, 8, 0 ], + "to": [ 16, 8.001, 8 ], + "rotation": { "origin": [ 0, 8, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY6", + "from": [ 8, 7.875, -7 ], + "to": [ 16, 7.876, 9 ], + "rotation": { "origin": [ 8, 7.875, -7 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY6", + "from": [ 0, 7.874, -7 ], + "to": [ 8, 7.875, 9 ], + "rotation": { "origin": [ 8, 7.875, -7 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 16, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY8", + "from": [ 0, 11, 7.375 ], + "to": [ 16, 11.001, 15.375 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture" }, + "up": { "uv": [ 16, 8, 0, 0 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 15.25, 10.875, -7 ], + "to": [ 23.25, 10.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -7.25, 10.875, -7 ], + "to": [ 0.75, 10.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -5, 0 ], + "to": [ 8.001, 11, 16 ], + "rotation": { "origin": [ 8, -5, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -5, 0 ], + "to": [ 8.001, 11, 16 ], + "rotation": { "origin": [ 8, -5, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 8.5, 8, -10 ], + "to": [ 24.5, 8.001, 6 ], + "rotation": { "origin": [ 24.5, 8, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -13.0001, 7.625, 1.5 ], + "to": [ 2.9999, 7.626, 17.5 ], + "rotation": { "origin": [ 3, 7.625, 17.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneZ12", + "from": [ 0, 8, 0.5 ], + "to": [ 16, 24, 0.501 ], + "rotation": { "origin": [ 0, 8, 0.5 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture1" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture1" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_fern_5.json b/src/main/resources/assets/betterend/models/block/jungle_fern_5.json new file mode 100644 index 00000000..bb2df430 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_fern_5.json @@ -0,0 +1,129 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/jungle_fern_leaf_2", + "texture": "betterend:block/jungle_fern_leaf_2", + "spore": "betterend:block/jungle_fern_spore_2", + "texture1": "betterend:block/jungle_fern_middle_2" + }, + "elements": [ + { + "__comment": "PlaneY3", + "from": [ 0, 11, 0 ], + "to": [ 16, 11.001, 8 ], + "rotation": { "origin": [ 0, 11, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY6", + "from": [ 8, 10.875, -7 ], + "to": [ 16, 10.876, 9 ], + "rotation": { "origin": [ 8, 10.875, -7 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY6", + "from": [ 0, 10.874, -7 ], + "to": [ 8, 10.875, 9 ], + "rotation": { "origin": [ 8, 10.875, -7 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 16, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY8", + "from": [ 0, 14, 7.375 ], + "to": [ 16, 14.001, 15.375 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture" }, + "up": { "uv": [ 16, 8, 0, 0 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 15.25, 13.875, -7 ], + "to": [ 23.25, 13.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -7.25, 13.875, -7 ], + "to": [ 0.75, 13.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -2, 0 ], + "to": [ 8.001, 14, 16 ], + "rotation": { "origin": [ 8, -2, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -2, 0 ], + "to": [ 8.001, 14, 16 ], + "rotation": { "origin": [ 8, -2, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 8.5, 11, -10 ], + "to": [ 24.5, 11.001, 6 ], + "rotation": { "origin": [ 24.5, 11, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -13.0001, 10.625, 1.5 ], + "to": [ 2.9999, 10.626, 17.5 ], + "rotation": { "origin": [ 3, 10.625, 17.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneZ12", + "from": [ 0, 11, 0.5 ], + "to": [ 16, 27, 0.501 ], + "rotation": { "origin": [ 0, 11, 0.5 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture1" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture1" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_fern_6.json b/src/main/resources/assets/betterend/models/block/jungle_fern_6.json new file mode 100644 index 00000000..aa658bf8 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_fern_6.json @@ -0,0 +1,129 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/jungle_fern_leaf_2", + "texture": "betterend:block/jungle_fern_leaf_2", + "spore": "betterend:block/jungle_fern_spore_2", + "texture1": "betterend:block/jungle_fern_middle_2" + }, + "elements": [ + { + "__comment": "PlaneY3", + "from": [ 0, 4, 0 ], + "to": [ 16, 4.001, 8 ], + "rotation": { "origin": [ 0, 4, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY6", + "from": [ 8, 3.875, -7 ], + "to": [ 16, 3.876, 9 ], + "rotation": { "origin": [ 8, 3.875, -7 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY6", + "from": [ 0, 3.874, -7 ], + "to": [ 8, 3.875, 9 ], + "rotation": { "origin": [ 8, 3.875, -7 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 16, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY8", + "from": [ 0, 7, 7.375 ], + "to": [ 16, 7.001, 15.375 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture" }, + "up": { "uv": [ 16, 8, 0, 0 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 15.25, 6.875, -7 ], + "to": [ 23.25, 6.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -7.25, 6.875, -7 ], + "to": [ 0.75, 6.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -9, 0 ], + "to": [ 8.001, 7, 16 ], + "rotation": { "origin": [ 8, -9, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -9, 0 ], + "to": [ 8.001, 7, 16 ], + "rotation": { "origin": [ 8, -9, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 8.5, 4, -10 ], + "to": [ 24.5, 4.001, 6 ], + "rotation": { "origin": [ 24.5, 4, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -13.0001, 3.625, 1.5 ], + "to": [ 2.9999, 3.626, 17.5 ], + "rotation": { "origin": [ 3, 3.625, 17.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneZ12", + "from": [ 0, 4, 0.5 ], + "to": [ 16, 20, 0.501 ], + "rotation": { "origin": [ 0, 4, 0.5 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture1" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture1" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_fern_7.json b/src/main/resources/assets/betterend/models/block/jungle_fern_7.json new file mode 100644 index 00000000..c6c4c432 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_fern_7.json @@ -0,0 +1,129 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/jungle_fern_leaf_3", + "texture": "betterend:block/jungle_fern_leaf_3", + "spore": "betterend:block/jungle_fern_spore_3", + "texture1": "betterend:block/jungle_fern_middle_3" + }, + "elements": [ + { + "__comment": "PlaneY3", + "from": [ 0, 8, 0 ], + "to": [ 16, 8.001, 8 ], + "rotation": { "origin": [ 0, 8, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY6", + "from": [ 8, 7.875, -7 ], + "to": [ 16, 7.876, 9 ], + "rotation": { "origin": [ 8, 7.875, -7 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY6", + "from": [ 0, 7.874, -7 ], + "to": [ 8, 7.875, 9 ], + "rotation": { "origin": [ 8, 7.875, -7 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 16, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY8", + "from": [ 0, 11, 7.375 ], + "to": [ 16, 11.001, 15.375 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture" }, + "up": { "uv": [ 16, 8, 0, 0 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 15.25, 10.875, -7 ], + "to": [ 23.25, 10.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -7.25, 10.875, -7 ], + "to": [ 0.75, 10.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -5, 0 ], + "to": [ 8.001, 11, 16 ], + "rotation": { "origin": [ 8, -5, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -5, 0 ], + "to": [ 8.001, 11, 16 ], + "rotation": { "origin": [ 8, -5, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 8.5, 8, -10 ], + "to": [ 24.5, 8.001, 6 ], + "rotation": { "origin": [ 24.5, 8, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -13.0001, 7.625, 1.5 ], + "to": [ 2.9999, 7.626, 17.5 ], + "rotation": { "origin": [ 3, 7.625, 17.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneZ12", + "from": [ 0, 8, 0.5 ], + "to": [ 16, 24, 0.501 ], + "rotation": { "origin": [ 0, 8, 0.5 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture1" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture1" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_fern_8.json b/src/main/resources/assets/betterend/models/block/jungle_fern_8.json new file mode 100644 index 00000000..40c88af8 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_fern_8.json @@ -0,0 +1,129 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/jungle_fern_leaf_3", + "texture": "betterend:block/jungle_fern_leaf_3", + "spore": "betterend:block/jungle_fern_spore_3", + "texture1": "betterend:block/jungle_fern_middle_3" + }, + "elements": [ + { + "__comment": "PlaneY3", + "from": [ 0, 11, 0 ], + "to": [ 16, 11.001, 8 ], + "rotation": { "origin": [ 0, 11, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY6", + "from": [ 8, 10.875, -7 ], + "to": [ 16, 10.876, 9 ], + "rotation": { "origin": [ 8, 10.875, -7 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY6", + "from": [ 0, 10.874, -7 ], + "to": [ 8, 10.875, 9 ], + "rotation": { "origin": [ 8, 10.875, -7 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 16, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY8", + "from": [ 0, 14, 7.375 ], + "to": [ 16, 14.001, 15.375 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture" }, + "up": { "uv": [ 16, 8, 0, 0 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 15.25, 13.875, -7 ], + "to": [ 23.25, 13.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -7.25, 13.875, -7 ], + "to": [ 0.75, 13.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -2, 0 ], + "to": [ 8.001, 14, 16 ], + "rotation": { "origin": [ 8, -2, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -2, 0 ], + "to": [ 8.001, 14, 16 ], + "rotation": { "origin": [ 8, -2, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 8.5, 11, -10 ], + "to": [ 24.5, 11.001, 6 ], + "rotation": { "origin": [ 24.5, 11, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -13.0001, 10.625, 1.5 ], + "to": [ 2.9999, 10.626, 17.5 ], + "rotation": { "origin": [ 3, 10.625, 17.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneZ12", + "from": [ 0, 11, 0.5 ], + "to": [ 16, 27, 0.501 ], + "rotation": { "origin": [ 0, 11, 0.5 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture1" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture1" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/jungle_fern_9.json b/src/main/resources/assets/betterend/models/block/jungle_fern_9.json new file mode 100644 index 00000000..26fe4832 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_fern_9.json @@ -0,0 +1,129 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/jungle_fern_leaf_3", + "texture": "betterend:block/jungle_fern_leaf_3", + "spore": "betterend:block/jungle_fern_spore_3", + "texture1": "betterend:block/jungle_fern_middle_3" + }, + "elements": [ + { + "__comment": "PlaneY3", + "from": [ 0, 4, 0 ], + "to": [ 16, 4.001, 8 ], + "rotation": { "origin": [ 0, 4, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY6", + "from": [ 8, 3.875, -7 ], + "to": [ 16, 3.876, 9 ], + "rotation": { "origin": [ 8, 3.875, -7 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY6", + "from": [ 0, 3.874, -7 ], + "to": [ 8, 3.875, 9 ], + "rotation": { "origin": [ 8, 3.875, -7 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 16, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 16, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY8", + "from": [ 0, 7, 7.375 ], + "to": [ 16, 7.001, 15.375 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture" }, + "up": { "uv": [ 16, 8, 0, 0 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 15.25, 6.875, -7 ], + "to": [ 23.25, 6.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -7.25, 6.875, -7 ], + "to": [ 0.75, 6.876, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -9, 0 ], + "to": [ 8.001, 7, 16 ], + "rotation": { "origin": [ 8, -9, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX11", + "from": [ 8, -9, 0 ], + "to": [ 8.001, 7, 16 ], + "rotation": { "origin": [ 8, -9, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY9", + "from": [ 8.5, 4, -10 ], + "to": [ 24.5, 4.001, 6 ], + "rotation": { "origin": [ 24.5, 4, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY9", + "from": [ -13.0001, 3.625, 1.5 ], + "to": [ 2.9999, 3.626, 17.5 ], + "rotation": { "origin": [ 3, 3.625, 17.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneZ12", + "from": [ 0, 4, 0.5 ], + "to": [ 16, 20, 0.501 ], + "rotation": { "origin": [ 0, 4, 0.5 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture1" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture1" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/small_jellyshroom.json b/src/main/resources/assets/betterend/models/item/small_jellyshroom.json new file mode 100644 index 00000000..fb8aa2a9 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/small_jellyshroom.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/small_jellyshroom" + } +} diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf_2.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a41b3c52f714407de362f35e85b9cd7242e6c032 GIT binary patch literal 1794 zcmbVNdrTX396yGe8H*`g5L+@>-T$~ z-{<@Ow!hA|Ju@RO13{3?DzB#=zH^Lw?Hc$jxU$H>SDIG8-HnWlZ~6fWcLZIm3qjr+ zSiiunhVnYa+pHl-)~CjucAz*bA3;`AqQ6ORVrv;*4x2eaZUg3MSb=B+Dcu@XIKBhu zXd4KMk`w!7^el#of)i`BvIMJ?gLcu|rGkbopP%pQ;2i?CwJbBEG|E7RFwi+P8V*Ss z6Ln&7Vg~*;)HsI5A$o@sa~T%VCbkYOmsNmT%{CKHS}4@+Fq1aIL0KL~DT1`)gdHbo z6G1YBjiDWA^1`4w6fISS08{U&Oqzp|6KmIXg~9PiBw~)xW?2p5q{HFB2@0nu6GWJ_ zn51)2lca4eT0348Rn#Y|6%pzJ$Xm6PjMJ2ZoW% z%8F>sA5#Ec4>Y+`D<491)d4W zYM6sDi(xJZa77AYXeyITxg3&JXc&4&$Gu=#rb^OuPU1n8$BDtP&7vqUmJ-5hrv=)? z+pIQ|HDKXQC2dx_iFCAamH-`~Z6FZ^JnxbDPNTR>=Y{`yeupZ;DdR%7%@ZF6V=_wP z&B1s@4VEpIQYTxy0qkC;N-9Gl8t)N?z;B>jg@NWe5X zphq|rxPmZ||EbyVWwDgv#>g&@uM}S?6$#w3QIB&Zv~Z6=37%V8VuqAjgg}DZPlapl z)bS<&*KKo^$K@~CairnP>QCx&4!u?=zCAo_%YXAb_rCmdAOCr9{qzTO?%t=LZ<*Pt z9K*1+(hNP!zWB-%EsWUvFU@t=^u>0MU+{qD%Ej&j&n(_Gwr$J#mUBPfI82^>%Gdhs zq1W&2sqyaGo3<)iBn_)eUE;3ox_Kt!=*bhVoy9|!O*7ZWzW>}-*EtuHEOw0-IAD=w(>&?C4>p8_W!w<|%`X9|>z8>k3km^DCYq zb8@z>6}>vm4jjAlp%0%c>T23Qdhzgi{(}9%j*b2RvTnL3D|gkY)8n?QR|3^^(L(JM zIg*v0u6Wy9v+pU`aM|VlX(OU#75Nq#)id7QSuyXU?ilBNDcrjM-LaWB9)C-I;j1s6 UC^P@)G5(0EDtw+1ck8o%0T!N7A^-pY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf_3.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf_3.png new file mode 100644 index 0000000000000000000000000000000000000000..2feba5de9dd74a8805cfe96fd40fbfff9d3ebf84 GIT binary patch literal 1765 zcmbVNdrTX39KRVbz`{nIMjRM!M`9qXy+_}do~*QN;5dC2{i)CW|K9qH$r&2ZKzrFkRH_5k`nHnVEB9%t8blN`kV?-?gP-3BGp8-Szvu z&+qenfBR~4)28C0wM7Vm6gM^mL-1W<-Uau7Y=z*G9SsFXdQ|QUvM72{%sK ztprIEF52!zvlj-4M=3>G&GmB#U8GHFZNZHgAdNw3$76BJHSR*10b zowC8Dtg>F2A<5DNfzE59YKV%AnzUR*X*U=QdYlPGQght0p3N7`9G>D-oU{>UXlbCp z=WuGfmPmUb@Hj{S3CM;Hv1AUb#uY=+ZrsRBF%bfsP6L45~wv(k)4r2`t^3`GkoN@B5K&5JIhfq+>c4_ehC%7T*AtCySs zLCydSMiCTYB`GWA43lo!LD3{tL)dA8$Us>|5Tl*TLOrz8a|aZ5kH8t+zk&sxjw+hO z!I(vfive7fV;GvtBppx^iUtis@9b$WSe9;-b%T?6&=_Pe7`9Cm1=`^uoNl{dxAHEh z%j%3ec&jJkbX!SpgmXmgQM(IdqJZav3g2!Pck#UNKhJN`L^x$!;;wnp!(dK^FWnq; zgQ&x@b>`IB7T*fCFHvQc2@y^A2+i?k?=u*0799v!RxRFjax%2ZIDn-8&${9~Utm-JnEM68kC?|ls&>bX9)dS>$<>$=D4AG8H$PA?$umQ~yG zM%c*@rX9aHW4(pL!*jct66(SQuh+ij=qJYlJ^Q}Dy%Bro!1Y+gkw5oa<{m)yo_gZi z&B1f$Lbt|mxOz7?ZEVn8Q^>?C1r)pEWuobsf%5T+DbEk%zNarf+so`6z1-e?_Qb9o zT^9#OPL>}(RvY#ttDpa-@F7xr4{!z7CWk`@fBY%_+3KO5Qs?$6B5z`{uIjnIft8l| z^WE!a#)exipZ)gcgjj0%^5fE-vt{1#(KV;+$1MZD&tKW|>ArjNPs|S0IbJOPwZ7wZ z^htlm0)MHp|GNXjZ#_IhS58g$&HIv`(fj9W=kMDvbM_H4IF zE3|bJn>Hk1h+BC<@W2xTQ6wbLCT$=dDk0c3Ar)!mp+efYjEmrbN)*CzZggums)b`sL(liZt{HwI`fp zlXev4jQEs;hNk*c+SHh)=v2>6vb&_>00rbhvQ)^Mu3CyvmAEP%`>z>_tU$c62-WKo zlEcXXGHN-942MKo;{-rTN{AC#1qk<(faN5Hl^BkvSx#j|l~>5xkHTz@o>2#5yK7wd zDMIBu&sG_xSS*H$e8_UL45ugx!vY2X8Y5_T()3`7Hr=jzgcx!)$FM!aGD$xoOk3k# zgu+UzDHQBRSktYQ2^WkhL7U-1te;W^sA~6iz#27`iG+qJ%9Y&@#*Fw5AI@otAY(3u#USGKWB#3)knzEN$Fxu0Ox( zbKTN#jDJ}rSwfJP5iN#MhSs5=&@ioNv;rU(&Y%or1)(185y!ww4dz!y^;PLOBAW&f z$}&fXMa0n=MF6xcB9`VQB57h8@l2VHEy`Ldy};#GKBWkMtOs**g}PxZ}$kL z`F%z@ReNo$QIB;o*X9><2nW4R^Q-KxmGO$uLA_aAyY={sxt4wxPF!C-?iwqH0i*>H z=rrI2k%l7PPP8-xdK$_Shs1jJtJTXYz?KAcKi;7FT5+@-G_wfrpbT~6`K-^KRiUf% zxoUm=ulX?k-dVL8bF~XA-&X9ixSf?(c=Ps$jZ*_ZG|nAl;!-*IRGDzHKjIVVQX^MlWJCcv%( zPo6DHPrLz+F2(tg;I=K_G?Ps`e=dLe>!{Pzb^HqgT>k#l{`0}5zn*{b;G^I5d_8d- zl4ssN`{(AZM;5o8fW%qroHm~6-0eLz{qaqabLRrY#o2ck`**y$-#>*Def_cb9vD6J4@wV_ A?*IS* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_middle_3.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_middle_3.png new file mode 100644 index 0000000000000000000000000000000000000000..db45a362837f5c4ab66efc09c680037715769c5b GIT binary patch literal 1928 zcmb_dO^6&t80|$|G?*a9Qxwwl8vNPRbai!4|CAZm&CJFb$ZVF~k*v3=uCAGBcc!cD z?%kQ$lja}nbP zz3+YB_p0jn-0TxOckJ0ANz%?zu`n<0cc<4K|YL*HuRnq~~Ff_65$b+9EqD5W}&le62Vu`1m(nyjJ zt7^O5&b0LmkLs%CIF1UDiVzS85O;%wbU+YK3>gY6rjZ{eJ`d!Sk+^(0$tgl=N0iO12$>UUHX+VOj3hj&aNZm?YHlc5 z&gav{*z!Y1{lMex_~8w6Sb-!gryz(R&=5e`ie}-gjSV;nbqrx2TIQZ#>u!cRSfDj@ z9aOl+BMJFOut#x?M=c_9_FJUR)G(+k@~DzH&zn3FfrUD~r=ncOr65j7Kv}7fQ$*Ss z-}kU#!kS?lI?zeh0;VTMZVhT6s~a>+nN~9h8O|?ox|}vQo!|Gl$Eo1>J1QftflSQ- zmctOx9RmW_gcfiuk2%OP#lp!B*^WfMSZbuXku_E22}bB5LTp>eFqsBwj)8z}G6-~w z*`8jj=`J!;L-#y_i+(J+*Bva81@_Ef)b!<^Eij>}-E#^}`^-FL@Y>&^9@~mMnBQ(N zL3)ek_oK(Wmb6L4rt6}1+wqrrGyO4HxwU%3)u5e41Q;gr0MZN-5L0X?)FsGsiEU}j z9A>{+y^WEui0j?FSfrUe_THO(r=Hyw{YR}Pn6$x-#@$m*m}v5?j8T;>km(?eXITX w;N+gYhl8r*kKe9LOq}{rdi}~zU%u0!W0KnipH?5BC(^UBG&5Ux>tOZRU%yCgMF0Q* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_spore_2.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_spore_2.png new file mode 100644 index 0000000000000000000000000000000000000000..e64620ef14219f1078c84ecf0d23d012ae549604 GIT binary patch literal 1926 zcmcgtU5MO798Wpu7rpucqSt$9npRNiBs2Nkgp22O_w*Lb^|&td^g*3XCcEJ_nKa4W z?j0>2hgwP>R76ljP&h#l`cNNy=z~xTg$ja#A5`!`-+VdcUMv>Y$$oilul4AI3)##h zzxn-s|BuX^o0)!Yc<+I|9LEipr%JQz{$PIX-pT$CZnQDG?TM#eNI7o*mHgWA?$Q0D z9Jll1pfZ=uInP@z4MptHDiK>@%+MS+Hr|S{J5MscN@_u53+tD@6!^fig_D{Cow!Kq z!PIg>PApGX+~s-K^n~%J`LUM82ttx!z7;m2)N0v6hu31`{IMkP9Y{8B3lq5@Kj+Nw zMVb&^6LsJsRpt#-L^?EO^(kJ4$dI5RAq7BWLETbJzV{QDTH^WEZ0Xsa7Ms~ZJdhP%hFC>kQxaUfwK|&H`DZ`=xHm=i*rgeH3>cQ(<1XyYv zXP~jAmoOYiq}k*m3!|5iEzxOZDJIe^N$Eo3lF3D8^Kc$bY!wrNGn!N=ZS)H@)3?kQ zi+N!R{1YdG$fM2l$xUlW31`F>WGF*`WFTu5WLTPPA>$}iEC{<$hkAj(bSKobkZ#H9 zEl}1q9?tN8f<4#rX%b=aQ(@PkZRMcSYV6K3v|jtj@J%2Ar($R*{HEwHe~ zAn+{3P^*NfI#8HiJTy(dZR|bciO_jZr<*;;O2EEp3r+7Y>|&`DfiYl z>x7ZsqxfC*l=@i{CuE|=a<`rSlJ4d|#f$fLZy@CP1 zKo$3+ztjC~{dk}5d&zO@II0o0gG$2v$Fsfe>>B-liI|aoqqB9mC+SvEpm6n0dpf=VgeDnL-<770{lJ>#FXJ<765b^}?2(~zu`zy-#h@vfD%$FZI4 zCP=920f`Ihg-Z{WDskZe2d*IKfm>De0ym@_kPw_ea6=W#*!$D8P1>mHO5Pcdzj^O_ z?|n1x)0O47W=}nTN|L16)>3m-jL#O&Qzym$*?)#a3{NLZ?`4v7`p4p#`TWA^7bNNA z^{~B>Z@BMZpGOr!xyLGlC=qB$nyU{I;%~BC_E;y3Ys#PB{-DSqttsoK3*Dr_y5Z7Z z%GUOl+y36B?@*=whCDaG!a&4wA`hZooZ&%DDeYo0FP2qBE+P45O_?to${X&A+~6sb z%}N#c$k1fVsh}!!G~;zygUC{$r6L_bgkcryjy(P;!dprMyxM$o>`T1Wly06USXKM| zexQwJnbQ3Vzul|brGamjYtE1gqcWjz+LIL`zYO|eOr=RE83BTP>}-{U}})^(>o z4&@R>Qx{pjxFf)Xo%(EXN6$dSv)2ynVNH^=nxa7s0;B=WY$FSs8b;OysAC96P?ys%*nJS{U?gg6-vbq@ zp(H1d1XCXeJdKEmIgCh$sY%>XfThDI)Aj7*ebo zwqfZW0@U^bU=c$Hwr6+%>LxUes!mMXo9u6Lf4eAdv45m<%6(zuu2;kKbQov^z^ZP7 zz%&>j#LQAcjriI>isG#za6+|MLEkQ zad{WhY1a@h)4s!Ek*ZX5mHiX*--wR%eycg(wr~1(hQs=aS1xV+B>g>m_7oNNN@vYAJo0opxTEB61;mjXbIybI;^2~65|D%QPXXG>A o{rB%@FK>SJ;;-GezqmXjwSQY4tgXHKLDBeHi_6Wg7e2iFKUdXId;kCd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/small_jellyshroom.png b/src/main/resources/assets/betterend/textures/item/small_jellyshroom.png new file mode 100644 index 0000000000000000000000000000000000000000..ac83ee9d6197a86cdf5b1cab3e7e3eccbb25fd3e GIT binary patch literal 448 zcmV;x0YCnUP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!T<$0= zA7-0cAp=+e$RH4nY}n^-9~t&vUka9I0*e3vNVBX3MDyblU%_F($jHd>K#!N2Myp%NH72jNM;^>oMC~}1t3uCrU-Wl qNHbOda{-73Va?e+a5iE5p8)`|q1Ro5>depp0000 Date: Fri, 25 Dec 2020 19:52:42 +0300 Subject: [PATCH 021/463] Bonemeal util --- src/main/java/ru/betterend/BetterEnd.java | 2 + .../mixin/common/BoneMealItemMixin.java | 22 +---- .../java/ru/betterend/util/BonemealUtil.java | 86 +++++++++++++++++++ 3 files changed, 91 insertions(+), 19 deletions(-) create mode 100644 src/main/java/ru/betterend/util/BonemealUtil.java diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index fa86270b..99121e62 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -24,6 +24,7 @@ import ru.betterend.registry.EndItems; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; import ru.betterend.registry.EndTags; +import ru.betterend.util.BonemealUtil; import ru.betterend.util.Logger; import ru.betterend.world.generator.BetterEndBiomeSource; import ru.betterend.world.surface.SurfaceBuilders; @@ -52,6 +53,7 @@ public class BetterEnd implements ModInitializer { InfusionRecipes.register(); EndStructures.register(); Integrations.register(); + BonemealUtil.init(); if (hasGuideBook()) { GuideBook.register(); diff --git a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java index 708b3908..32c28ec1 100644 --- a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java +++ b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java @@ -22,6 +22,7 @@ import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; +import ru.betterend.util.BonemealUtil; import ru.betterend.world.biome.EndBiome; @Mixin(BoneMealItem.class) @@ -122,25 +123,8 @@ public class BoneMealItemMixin { private BlockState beGetGrassState(World world, BlockPos pos) { BlockState state = world.getBlockState(pos); Block block = state.getBlock(); - if (block == EndBlocks.END_MOSS || block == EndBlocks.END_MYCELIUM) { - return world.random.nextBoolean() ? EndBlocks.CREEPING_MOSS.getDefaultState() : EndBlocks.UMBRELLA_MOSS.getDefaultState(); - } - else if (block == EndBlocks.CAVE_MOSS) { - return EndBlocks.CAVE_GRASS.getDefaultState(); - } - else if (block == EndBlocks.CHORUS_NYLIUM) { - return EndBlocks.CHORUS_GRASS.getDefaultState(); - } - else if (block == EndBlocks.CRYSTAL_MOSS) { - return EndBlocks.CRYSTAL_GRASS.getDefaultState(); - } - else if (block == EndBlocks.SHADOW_GRASS) { - return EndBlocks.SHADOW_PLANT.getDefaultState(); - } - else if (block == EndBlocks.PINK_MOSS) { - return EndBlocks.BUSHY_GRASS.getDefaultState(); - } - return null; + block = BonemealUtil.getGrass(block, world.getRandom()); + return block == null ? null : block.getDefaultState(); } private BlockState beGetWaterGrassState(World world, BlockPos pos) { diff --git a/src/main/java/ru/betterend/util/BonemealUtil.java b/src/main/java/ru/betterend/util/BonemealUtil.java new file mode 100644 index 00000000..9fc0d96b --- /dev/null +++ b/src/main/java/ru/betterend/util/BonemealUtil.java @@ -0,0 +1,86 @@ +package ru.betterend.util; + +import java.util.List; +import java.util.Map; +import java.util.Random; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + +import net.minecraft.block.Block; +import ru.betterend.registry.EndBlocks; + +public class BonemealUtil { + private static final Map GRASS_TYPES = Maps.newHashMap(); + + public static void init() { + addBonemealGrass(EndBlocks.END_MOSS, EndBlocks.CREEPING_MOSS); + addBonemealGrass(EndBlocks.END_MOSS, EndBlocks.UMBRELLA_MOSS); + addBonemealGrass(EndBlocks.END_MYCELIUM, EndBlocks.CREEPING_MOSS); + addBonemealGrass(EndBlocks.END_MYCELIUM, EndBlocks.UMBRELLA_MOSS); + addBonemealGrass(EndBlocks.CAVE_MOSS, EndBlocks.CAVE_GRASS); + addBonemealGrass(EndBlocks.CHORUS_NYLIUM, EndBlocks.CHORUS_GRASS); + addBonemealGrass(EndBlocks.CRYSTAL_MOSS, EndBlocks.CRYSTAL_GRASS); + addBonemealGrass(EndBlocks.SHADOW_GRASS, EndBlocks.SHADOW_PLANT); + addBonemealGrass(EndBlocks.PINK_MOSS, EndBlocks.BUSHY_GRASS); + addBonemealGrass(EndBlocks.AMBER_MOSS, EndBlocks.AMBER_GRASS); + addBonemealGrass(EndBlocks.JUNGLE_MOSS, EndBlocks.JUNGLE_GRASS); + } + + public static void addBonemealGrass(Block terrain, Block plant) { + addBonemealGrass(terrain, plant, 1F); + } + + public static void addBonemealGrass(Block terrain, Block plant, float chance) { + GrassList list = GRASS_TYPES.get(terrain); + if (list == null) { + list = new GrassList(); + GRASS_TYPES.put(terrain, list); + } + list.addGrass(plant, chance); + } + + public static Block getGrass(Block terrain, Random random) { + GrassList list = GRASS_TYPES.get(terrain); + return list == null ? null : list.getGrass(random); + } + + private static final class GrassInfo { + final Block grass; + float chance; + + public GrassInfo(Block grass, float chance) { + this.grass = grass; + this.chance = chance; + } + + public float addChance(float chance) { + this.chance += chance; + return this.chance; + } + } + + private static final class GrassList { + final List list = Lists.newArrayList(); + float maxChance = 0; + + public void addGrass(Block grass, float chance) { + GrassInfo info = new GrassInfo(grass, chance); + maxChance = info.addChance(maxChance); + list.add(info); + } + + public Block getGrass(Random random) { + if (maxChance == 0 || list.isEmpty()) { + return null; + } + float chance = random.nextFloat() * maxChance; + for (GrassInfo info: list) { + if (chance <= info.chance) { + return info.grass; + } + } + return null; + } + } +} From c8722470c2161be23b00ecbaf9423c262fe3b3d5 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 25 Dec 2020 19:55:04 +0300 Subject: [PATCH 022/463] More plants --- src/main/java/ru/betterend/util/BonemealUtil.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/ru/betterend/util/BonemealUtil.java b/src/main/java/ru/betterend/util/BonemealUtil.java index 9fc0d96b..c604aaa4 100644 --- a/src/main/java/ru/betterend/util/BonemealUtil.java +++ b/src/main/java/ru/betterend/util/BonemealUtil.java @@ -18,13 +18,17 @@ public class BonemealUtil { addBonemealGrass(EndBlocks.END_MOSS, EndBlocks.UMBRELLA_MOSS); addBonemealGrass(EndBlocks.END_MYCELIUM, EndBlocks.CREEPING_MOSS); addBonemealGrass(EndBlocks.END_MYCELIUM, EndBlocks.UMBRELLA_MOSS); + addBonemealGrass(EndBlocks.CAVE_MOSS, EndBlocks.CAVE_GRASS); addBonemealGrass(EndBlocks.CHORUS_NYLIUM, EndBlocks.CHORUS_GRASS); addBonemealGrass(EndBlocks.CRYSTAL_MOSS, EndBlocks.CRYSTAL_GRASS); addBonemealGrass(EndBlocks.SHADOW_GRASS, EndBlocks.SHADOW_PLANT); addBonemealGrass(EndBlocks.PINK_MOSS, EndBlocks.BUSHY_GRASS); addBonemealGrass(EndBlocks.AMBER_MOSS, EndBlocks.AMBER_GRASS); + addBonemealGrass(EndBlocks.JUNGLE_MOSS, EndBlocks.JUNGLE_GRASS); + addBonemealGrass(EndBlocks.JUNGLE_MOSS, EndBlocks.TWISTED_UMBRELLA_MOSS); + addBonemealGrass(EndBlocks.JUNGLE_MOSS, EndBlocks.SMALL_JELLYSHROOM, 0.1F); } public static void addBonemealGrass(Block terrain, Block plant) { From c21f424aeec9f25921ff4eff7496c70a5e2d5626 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 25 Dec 2020 20:45:46 +0300 Subject: [PATCH 023/463] Fern texture & recipes --- .../java/ru/betterend/recipe/CraftingRecipes.java | 5 ++++- .../assets/betterend/models/item/jungle_fern.json | 6 ++++++ .../betterend/textures/item/jungle_fern.png | Bin 0 -> 451 bytes 3 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/assets/betterend/models/item/jungle_fern.json create mode 100644 src/main/resources/assets/betterend/textures/item/jungle_fern.png diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index b947949d..e630e1e8 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -98,7 +98,7 @@ public class CraftingRecipes { GridRecipe.make("blue_vine_seed_dye", Items.BLUE_DYE).setList("#").addMaterial('#', EndBlocks.BLUE_VINE_SEED).build(); GridRecipe.make("creeping_moss_dye", Items.CYAN_DYE).setList("#").addMaterial('#', EndBlocks.CREEPING_MOSS).build(); GridRecipe.make("umbrella_moss_dye", Items.YELLOW_DYE).setList("#").addMaterial('#', EndBlocks.UMBRELLA_MOSS).build(); - GridRecipe.make("umbrella_moss_tall_dye", Items.YELLOW_DYE).setList("#").addMaterial('#', EndBlocks.UMBRELLA_MOSS_TALL).build(); + GridRecipe.make("umbrella_moss_tall_dye", Items.YELLOW_DYE).setOutputCount(2).setList("#").addMaterial('#', EndBlocks.UMBRELLA_MOSS_TALL).build(); GridRecipe.make("shadow_plant_dye", Items.BLACK_DYE).setList("#").addMaterial('#', EndBlocks.SHADOW_PLANT).build(); GridRecipe.make("paper", Items.PAPER).setShape("###").addMaterial('#', EndItems.END_LILY_LEAF_DRIED).setOutputCount(3).build(); @@ -179,6 +179,9 @@ public class CraftingRecipes { .addMaterial('S', Items.SHULKER_SHELL) .addMaterial('C', EndTags.ITEM_CHEST) .build(); + + GridRecipe.make("twisted_umbrella_moss_dye", Items.PURPLE_DYE).setList("#").addMaterial('#', EndBlocks.TWISTED_UMBRELLA_MOSS).build(); + GridRecipe.make("twisted_umbrella_moss_dye_tall", Items.PURPLE_DYE).setOutputCount(2).setList("#").addMaterial('#', EndBlocks.TWISTED_UMBRELLA_MOSS_TALL).build(); } private static void registerLantern(String name, Block lantern, Block slab) { diff --git a/src/main/resources/assets/betterend/models/item/jungle_fern.json b/src/main/resources/assets/betterend/models/item/jungle_fern.json new file mode 100644 index 00000000..fd4d4a6d --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/jungle_fern.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/jungle_fern" + } +} diff --git a/src/main/resources/assets/betterend/textures/item/jungle_fern.png b/src/main/resources/assets/betterend/textures/item/jungle_fern.png new file mode 100644 index 0000000000000000000000000000000000000000..b142467308ee5e11479b956e40cdb40bfd2c87e6 GIT binary patch literal 451 zcmV;!0X+VRP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0a!^yK~y+TjgrqR zL{SvS&owo|YU7RMKfd?9d#_<;`VSN3W!reOQZY6mKtS90`Vzx*ZfYlVYaPQ}04p3- z+pfD&=hD_L5R(S&62G#aD|5vDld{!)(nd6W@BSV)9C0D~Q_T>Zm zZW=OJWJiWcL^K1_0b#gx{}g9_kzwTRE#QPjM34sXSFN_XVca#!HK7?`0FB95L@^BS zy#o;fUk|<1iW<~EnTs=>L7^x1j`ypk9mIpdaCRuLF>_Ng;UuSLpWbK7FGmAFXcmmJ$TY7wpY& Date: Fri, 25 Dec 2020 20:59:20 +0300 Subject: [PATCH 024/463] Small texture fix --- .../textures/block/jungle_fern_spore_2.png | Bin 1926 -> 1928 bytes .../textures/block/jungle_fern_spore_3.png | Bin 1877 -> 1877 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_spore_2.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_spore_2.png index e64620ef14219f1078c84ecf0d23d012ae549604..2f9699eb9436b8ee4e814b2b74566f0d7ba17a5b 100644 GIT binary patch delta 186 zcmZqU@8I8Xl8M8}z{=FZ%GhY~MJ81Q=O0smilv2#rCFMZv2IF=QJSu$v5C2ElChzY zu91m_QA$dpg{48V#pWXBDkh>-PIh3GM3`^LwobxmvQ01p14FN;i(`nz>Eu8E|JyUG nHWX$|{?1k=t)^L6Aj!Z`)KQb+7Q_|+RL9`y>gTe~DWM4fP!}`M delta 165 zcmeC+Z{y!^l4)`ztH9)&OtN5_joCxR*xV#3HPysS*CffpL^sLABvCifILScQJT=ME z#K<7gz{tdKa}jeD6HzKBJFu2bZexp-h*PP3#K6GN?djqeVsSe8&;S4S%&HBAEt9{q fl}Y-Zn!&)ptWuL9%{bc}sEWbU)z4*}Q$iB}P}DHS diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_spore_3.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_spore_3.png index 5a1a466cd05e896d0710e5d661af19d91ee770c3..d0fb2a51779407ac4d854a75c162b88f8bd1a25e 100644 GIT binary patch delta 245 zcmcc0ca?9$NhWq911nPtE2GI5nAG6xzf6HDrj`~-riLk|x@l>qCc4R{CPuo6DM^O9 z#wLkrsmT_m<_2cwn~RvMn21t2*@0COZoC28`Z7Iv`>6~J3{jpgjv*GOlmGnxZ_ljS zQ20Vh;ouc@B_1)#9vNG zKQOP2|Ns5_)lT~u6~y=a`_-qIy;k;dhS!oNMuw1QeigyNf$>0F7(8A5T-G@yGywon Cl~hIm From 19de1ca6c698c1742c6e1f71e26265ba84159e6b Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 25 Dec 2020 23:16:23 +0300 Subject: [PATCH 025/463] Textures & translations --- .../betterend/blocks/BlockJellyshroomCap.java | 72 ++++++++++++++++++ .../java/ru/betterend/patterns/Patterns.java | 1 + .../java/ru/betterend/registry/EndBlocks.java | 4 + .../assets/betterend/lang/en_gb.json | 19 +++++ .../assets/betterend/lang/en_us.json | 24 +++++- .../assets/betterend/lang/ru_ru.json | 24 +++++- .../models/block/small_jellyshroom_ceil.json | 2 +- .../models/block/small_jellyshroom_floor.json | 2 +- .../block/small_jellyshroom_wall_1.json | 2 +- .../block/small_jellyshroom_wall_2.json | 2 +- .../patterns/block/block_colored.json | 6 ++ .../block/jellyshroom_barrel_bottom.png | Bin 0 -> 754 bytes .../block/jellyshroom_barrel_side.png | Bin 0 -> 720 bytes .../textures/block/jellyshroom_barrel_top.png | Bin 0 -> 721 bytes .../block/jellyshroom_barrel_top_open.png | Bin 0 -> 631 bytes .../textures/block/jellyshroom_bookshelf.png | Bin 0 -> 723 bytes .../textures/block/jellyshroom_cap.png | Bin 2172 -> 398 bytes .../textures/block/jellyshroom_cap_small.png | Bin 0 -> 2172 bytes .../block/jellyshroom_composter_bottom.png | Bin 0 -> 300 bytes .../block/jellyshroom_composter_side.png | Bin 0 -> 335 bytes .../block/jellyshroom_composter_top.png | Bin 0 -> 250 bytes .../jellyshroom_crafting_table_bottom.png | Bin 0 -> 698 bytes .../jellyshroom_crafting_table_front.png | Bin 0 -> 747 bytes .../block/jellyshroom_crafting_table_side.png | Bin 0 -> 731 bytes .../block/jellyshroom_crafting_table_top.png | Bin 0 -> 493 bytes .../textures/block/jellyshroom_ladder.png | Bin 0 -> 613 bytes .../textures/block/jellyshroom_log_side.png | Bin 0 -> 1866 bytes .../textures/block/jellyshroom_log_top.png | Bin 0 -> 2511 bytes .../textures/block/jellyshroom_planks.png | Bin 0 -> 1658 bytes .../block/jellyshroom_stripped_log_side.png | Bin 0 -> 2261 bytes .../block/jellyshroom_stripped_log_top.png | Bin 0 -> 2602 bytes .../entity/chest/jellyshroom_chest.png | Bin 0 -> 3152 bytes .../entity/chest/jellyshroom_chest_left.png | Bin 0 -> 2779 bytes .../entity/chest/jellyshroom_chest_right.png | Bin 0 -> 3007 bytes .../textures/entity/sign/jellyshroom_sign.png | Bin 0 -> 1149 bytes .../textures/item/jellyshroom_sign.png | Bin 0 -> 570 bytes 36 files changed, 152 insertions(+), 6 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/BlockJellyshroomCap.java create mode 100644 src/main/resources/assets/betterend/patterns/block/block_colored.json create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_bottom.png create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_top_open.png create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_bookshelf.png create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_cap_small.png create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_composter_bottom.png create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_composter_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_composter_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_bottom.png create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_front.png create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_ladder.png create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_log_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_log_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_planks.png create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_stripped_log_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_stripped_log_top.png create mode 100644 src/main/resources/assets/betterend/textures/entity/chest/jellyshroom_chest.png create mode 100644 src/main/resources/assets/betterend/textures/entity/chest/jellyshroom_chest_left.png create mode 100644 src/main/resources/assets/betterend/textures/entity/chest/jellyshroom_chest_right.png create mode 100644 src/main/resources/assets/betterend/textures/entity/sign/jellyshroom_sign.png create mode 100644 src/main/resources/assets/betterend/textures/item/jellyshroom_sign.png diff --git a/src/main/java/ru/betterend/blocks/BlockJellyshroomCap.java b/src/main/java/ru/betterend/blocks/BlockJellyshroomCap.java new file mode 100644 index 00000000..1da7ed8b --- /dev/null +++ b/src/main/java/ru/betterend/blocks/BlockJellyshroomCap.java @@ -0,0 +1,72 @@ +package ru.betterend.blocks; + +import java.io.Reader; +import java.util.List; + +import com.google.common.collect.Lists; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.AbstractGlassBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.client.color.block.BlockColorProvider; +import net.minecraft.client.color.item.ItemColorProvider; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.context.LootContext; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IColorProvider; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; +import ru.betterend.util.MHelper; + +public class BlockJellyshroomCap extends AbstractGlassBlock implements IRenderTypeable, BlockPatterned, IColorProvider { + private final int color; + + public BlockJellyshroomCap(int r, int g, int b) { + super(FabricBlockSettings.copyOf(Blocks.SLIME_BLOCK)); + color = MHelper.color(r, g, b); + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.TRANSLUCENT; + } + + @Override + public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + return Lists.newArrayList(new ItemStack(this)); + } + + @Override + public String getStatesPattern(Reader data) { + String block = Registry.BLOCK.getId(this).getPath(); + return Patterns.createJson(data, block, block); + } + + @Override + public String getModelPattern(String block) { + return Patterns.createJson(Patterns.BLOCK_COLORED, "jellyshroom_cap"); + } + + @Override + public Identifier statePatternId() { + return Patterns.STATE_SIMPLE; + } + + @Override + public BlockColorProvider getProvider() { + return (state, world, pos, tintIndex) -> { + return color; + }; + } + + @Override + public ItemColorProvider getItemProvider() { + return (stack, tintIndex) -> { + return color; + }; + } +} diff --git a/src/main/java/ru/betterend/patterns/Patterns.java b/src/main/java/ru/betterend/patterns/Patterns.java index 0da7c155..4ac4ede2 100644 --- a/src/main/java/ru/betterend/patterns/Patterns.java +++ b/src/main/java/ru/betterend/patterns/Patterns.java @@ -83,6 +83,7 @@ public class Patterns { public final static Identifier BLOCK_BULB_LANTERN_COLORED_CEIL = BetterEnd.makeID("models/block/bulb_lantern_colored_ceil.json"); public final static Identifier BLOCK_PETAL_COLORED = BetterEnd.makeID("models/block/block_petal_colored.json"); public final static Identifier BLOCK_COMPOSTER = BetterEnd.makeID("patterns/block/composter.json"); + public final static Identifier BLOCK_COLORED = BetterEnd.makeID("patterns/block/block_colored.json"); //Models Item public final static Identifier ITEM_WALL = BetterEnd.makeID("patterns/item/pattern_wall.json"); diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 7548fd3a..28f3db1f 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -42,6 +42,7 @@ import ru.betterend.blocks.BlockHydraluxPetal; import ru.betterend.blocks.BlockHydraluxPetalColored; import ru.betterend.blocks.BlockHydraluxSapling; import ru.betterend.blocks.BlockHydrothermalVent; +import ru.betterend.blocks.BlockJellyshroomCap; import ru.betterend.blocks.BlockLacugroveSapling; import ru.betterend.blocks.BlockLanceleaf; import ru.betterend.blocks.BlockLanceleafSeed; @@ -185,6 +186,9 @@ public class EndBlocks { public static final Block UMBRELLA_TREE_CLUSTER_EMPTY = registerBlock("umbrella_tree_cluster_empty", new BlockUmbrellaTreeClusterEmpty()); public static final WoodenMaterial UMBRELLA_TREE = new WoodenMaterial("umbrella_tree", MaterialColor.BLUE, MaterialColor.GREEN); + public static final Block JELLYSHROOM_CAP_PURPLE = registerBlock("jellyshroom_cap_purple", new BlockJellyshroomCap(255, 0, 255)); + public static final WoodenMaterial JELLYSHROOM = new WoodenMaterial("jellyshroom", MaterialColor.PURPLE, MaterialColor.LIGHT_BLUE); + // Small Plants // public static final Block UMBRELLA_MOSS = registerBlock("umbrella_moss", new BlockUmbrellaMoss()); public static final Block UMBRELLA_MOSS_TALL = registerBlock("umbrella_moss_tall", new BlockUmbrellaMossTall()); diff --git a/src/main/resources/assets/betterend/lang/en_gb.json b/src/main/resources/assets/betterend/lang/en_gb.json index b52aab43..d001c2ce 100644 --- a/src/main/resources/assets/betterend/lang/en_gb.json +++ b/src/main/resources/assets/betterend/lang/en_gb.json @@ -17,4 +17,23 @@ "block.betterend.sulphur_crystal": "Sulphur Crystal", "item.betterend.crystalline_sulphur": "Sulphur", "biome.betterend.sulphur_springs": "Sulphur Springs", + + "block.betterend.mossy_glowshroom_stripped_bark": "Striped Mossy Glowshroom Bark", + "block.betterend.mossy_glowshroom_stripped_log": "Striped Mossy Glowshroom Log", + "block.betterend.pythadendron_stripped_bark": "Striped Pythadendron Bark", + "block.betterend.pythadendron_stripped_log": "Striped Pythadendron Log", + "block.betterend.end_lotus_stripped_bark": "Striped End Lotus Bark", + "block.betterend.end_lotus_stripped_log": "Striped End Lotus Log", + "block.betterend.lacugrove_stripped_bark": "Striped Lacugrove Bark", + "block.betterend.lacugrove_stripped_log": "Striped Lacugrove Log", + "block.betterend.dragon_tree_stripped_bark": "Striped Dragon Tree Bark", + "block.betterend.dragon_tree_stripped_log": "Striped Dragon Tree Log", + "block.betterend.tenanea_stripped_bark": "Striped Tenanea Bark", + "block.betterend.tenanea_stripped_log": "Striped Tenanea Log", + "block.betterend.helix_tree_stripped_bark": "Striped Helix Tree Bark", + "block.betterend.helix_tree_stripped_log": "Striped Helix Tree Log", + "block.betterend.umbrella_tree_stripped_bark": "Striped Umbrella Tree Bark", + "block.betterend.umbrella_tree_stripped_log": "Striped Umbrella Tree Log", + "block.betterend.jellyshroom_stripped_bark": "Striped Jellyshroom Bark", + "block.betterend.jellyshroom_stripped_log": "Striped Jellyshroom Log" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 2547499b..93702fea 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -523,5 +523,27 @@ "block.betterend.umbrella_tree_cluster": "Umbrella Tree Cluster", "block.betterend.umbrella_tree_cluster_empty": "Empty Umbrella Tree Cluster", "block.betterend.jungle_vine": "Jungle Vine", - "block.betterend.jungle_fern": "Jungle Fern" + "block.betterend.jungle_fern": "Jungle Fern", + + "block.betterend.jellyshroom_bark": "Jellyshroom Bark", + "block.betterend.jellyshroom_barrel": "Jellyshroom Barrel", + "block.betterend.jellyshroom_bookshelf": "Jellyshroom Bookshelf", + "block.betterend.jellyshroom_button": "Jellyshroom Button", + "block.betterend.jellyshroom_cap_purple": "Purple Jellyshroom Cap", + "block.betterend.jellyshroom_chest": "Jellyshroom Chest", + "block.betterend.jellyshroom_composter": "Jellyshroom Composter", + "block.betterend.jellyshroom_crafting_table": "Jellyshroom Crafting Table", + "block.betterend.jellyshroom_door": "Jellyshroom Door", + "block.betterend.jellyshroom_fence": "Jellyshroom Fence", + "block.betterend.jellyshroom_gate": "Jellyshroom Gate", + "block.betterend.jellyshroom_ladder": "Jellyshroom Ladder", + "block.betterend.jellyshroom_log": "Jellyshroom Log", + "block.betterend.jellyshroom_planks": "Jellyshroom Planks", + "block.betterend.jellyshroom_plate": "Jellyshroom Pressure Plate", + "block.betterend.jellyshroom_sign": "Jellyshroom Sign", + "block.betterend.jellyshroom_slab": "Jellyshroom Slab", + "block.betterend.jellyshroom_stairs": "Jellyshroom Stairs", + "block.betterend.jellyshroom_stripped_bark": "Stripped Jellyshroom Bark", + "block.betterend.jellyshroom_stripped_log": "Stripped Jellyshroom Log", + "block.betterend.jellyshroom_trapdoor": "Jellyshroom Trapdoor" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 3dcb9835..13de3f25 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -525,5 +525,27 @@ "block.betterend.umbrella_tree_cluster": "Кластер зонтичного дерева", "block.betterend.umbrella_tree_cluster_empty": "Пустой кластер хонтичного дерева", "block.betterend.jungle_vine": "Лоза джунглей", - "block.betterend.jungle_fern": "Папоротник джунглей" + "block.betterend.jungle_fern": "Папоротник джунглей", + + "block.betterend.jellyshroom_bark": "Кора желейного гриба", + "block.betterend.jellyshroom_barrel": "Бочка из желейного гриба", + "block.betterend.jellyshroom_bookshelf": "Книжные полки из желейного гриба", + "block.betterend.jellyshroom_button": "Кнопка из желейного гриба", + "block.betterend.jellyshroom_cap_purple": "Пурпурная шляпка желейного гриба", + "block.betterend.jellyshroom_chest": "Сундук из желейного гриба", + "block.betterend.jellyshroom_composter": "Компостер из желейного гриба", + "block.betterend.jellyshroom_crafting_table": "Верстак из желейного гриба", + "block.betterend.jellyshroom_door": "Дверь из желейного гриба", + "block.betterend.jellyshroom_fence": "Забор из желейного гриба", + "block.betterend.jellyshroom_gate": "Калитка из желейного гриба", + "block.betterend.jellyshroom_ladder": "Лестница из желейного гриба", + "block.betterend.jellyshroom_log": "Бревно желейного гриба", + "block.betterend.jellyshroom_planks": "Доски из желейного гриба", + "block.betterend.jellyshroom_plate": "Нажимная плита из желейного гриба", + "block.betterend.jellyshroom_sign": "Табличка из желейного гриба", + "block.betterend.jellyshroom_slab": "Плита из желейного гриба", + "block.betterend.jellyshroom_stairs": "Ступени из желейного гриба", + "block.betterend.jellyshroom_stripped_bark": "Обтёсанная кора желейного гриба", + "block.betterend.jellyshroom_stripped_log": "Обтёсанное бревно желейного гриба", + "block.betterend.jellyshroom_trapdoor": "Люк из желейного гриба" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/small_jellyshroom_ceil.json b/src/main/resources/assets/betterend/models/block/small_jellyshroom_ceil.json index 43db448d..e2e4e011 100644 --- a/src/main/resources/assets/betterend/models/block/small_jellyshroom_ceil.json +++ b/src/main/resources/assets/betterend/models/block/small_jellyshroom_ceil.json @@ -3,7 +3,7 @@ "textures": { "particle": "betterend:block/jellyshroom_ceiling_stem", "texture": "betterend:block/jellyshroom_ceiling_stem", - "cap": "betterend:block/jellyshroom_cap" + "cap": "betterend:block/jellyshroom_cap_small" }, "elements": [ { diff --git a/src/main/resources/assets/betterend/models/block/small_jellyshroom_floor.json b/src/main/resources/assets/betterend/models/block/small_jellyshroom_floor.json index 81135b41..11df2715 100644 --- a/src/main/resources/assets/betterend/models/block/small_jellyshroom_floor.json +++ b/src/main/resources/assets/betterend/models/block/small_jellyshroom_floor.json @@ -3,7 +3,7 @@ "textures": { "particle": "betterend:block/small_jellyshroom_stem", "texture": "betterend:block/small_jellyshroom_stem", - "cap": "betterend:block/jellyshroom_cap" + "cap": "betterend:block/jellyshroom_cap_small" }, "elements": [ { diff --git a/src/main/resources/assets/betterend/models/block/small_jellyshroom_wall_1.json b/src/main/resources/assets/betterend/models/block/small_jellyshroom_wall_1.json index 53b6893a..72c363d9 100644 --- a/src/main/resources/assets/betterend/models/block/small_jellyshroom_wall_1.json +++ b/src/main/resources/assets/betterend/models/block/small_jellyshroom_wall_1.json @@ -5,7 +5,7 @@ "branch_1": "betterend:block/jellyshroom_wall_stem_1", "branch_2": "betterend:block/jellyshroom_wall_stem_2", "branch_3": "betterend:block/jellyshroom_wall_stem_3", - "cap": "betterend:block/jellyshroom_cap" + "cap": "betterend:block/jellyshroom_cap_small" }, "elements": [ { diff --git a/src/main/resources/assets/betterend/models/block/small_jellyshroom_wall_2.json b/src/main/resources/assets/betterend/models/block/small_jellyshroom_wall_2.json index 2bdc5649..fc7319f7 100644 --- a/src/main/resources/assets/betterend/models/block/small_jellyshroom_wall_2.json +++ b/src/main/resources/assets/betterend/models/block/small_jellyshroom_wall_2.json @@ -5,7 +5,7 @@ "branch_1": "betterend:block/jellyshroom_wall_stem_1", "branch_2": "betterend:block/jellyshroom_wall_stem_2", "branch_3": "betterend:block/jellyshroom_wall_stem_3", - "cap": "betterend:block/jellyshroom_cap" + "cap": "betterend:block/jellyshroom_cap_small" }, "elements": [ { diff --git a/src/main/resources/assets/betterend/patterns/block/block_colored.json b/src/main/resources/assets/betterend/patterns/block/block_colored.json new file mode 100644 index 00000000..b7569292 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/block_colored.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/tint_cube", + "textures": { + "texture": "betterend:block/%texture%" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_bottom.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..72aa87ee268541bfd033c15a0911e0e069789c24 GIT binary patch literal 754 zcmVz!C8(yb4FoNIU@#0YU;HmM}A!%=q8k z?VsilA*geyR8oBvef!<_!RQ14>pXQguqz9s5I8?kwLN8#a~?Yk3|iASHH-I5&H_9)_~`9D-L!K5;RmGohB%IScR2C-_L~2z>pJSH zVrUz>y2d(>*q<(}z{{I!rWKyrfmKT0ynclb@YoFa0G(gZdCs;h$?_ay40Si4l$12R zCEo_}JR^z|+#E28pePFBL=ypNCh7a0B|z1U^w#o8S)g8&1^b5w?7VQOTDH4u#&JXl zfe?Z;%jw&O5CW_#&W@DWQOm>?H_dE{4Zd&r{q#tlYK%_so#R+lG+l>x4mb38JN}3A<$OVin*Co7 z2q`gnP8`SB@!2Gm!r74|(TrWkJWqsmA%yT8@Wt2P@b9Jfrwd9-UX%qQirAknWT~de kGMx7qonV~@z)utZ0Ap!*m#F;+X#fBK07*qoM6N<$g1iM^BLDyZ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_side.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_side.png new file mode 100644 index 0000000000000000000000000000000000000000..8630bf296bac98bab061e1c5c9f64a1d0d99ce40 GIT binary patch literal 720 zcmV;>0x$iEP)yzg>Rnt(&ge2IaX&O;1c~cgIzKN_wTiL7tCHCfFesic<_CRXFvYTi{D@H=zPjP zPDt~D)ndW7j~)^wl8&MC>hCMgr=KIU{NLno&+P0ziqH{`JH#DN7#@u=ZJRKbly6$R z$uXj5qX1SI)AvRcMD$FPFe|Vem$a-91J_0GbTRt_49i04Sk#KZn;ergw>Y-NxNLAn zN7Sm0q3gJ1#b`VsU2Raaq67uHW(P%4Fbo~#?SGDKVRm$iEJIUO6cyUGMO6g=$0HZ9 z+4v~!fzbDf;si}o*eq`N|KrTv+!T%cUid01Moj^ z@Z}Fbv7FEO^xi3XQDW$V%h%U@;&}`QHdWnlvsf}adq7p!RCU8*wPrRw!|e7DUAs@$ z?$aH(3_KM8D@>Tprj%95HcC)+18;InEK`PtVCnBD(Xcuu;^bt)e7<0EdJ41@WzEq? zAJcOj)Usxv8gzFdJ;$NvIG7!iKVMyQKAW3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_top.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_top.png new file mode 100644 index 0000000000000000000000000000000000000000..24553cf7cdfb3f007b4e66c29c99aa693979e0ac GIT binary patch literal 721 zcmV;?0xtcDP)@x!w%k2qmUAGu0YSh~<|+gWf*WuQR-Ax^vE40oOD(B>Di)3*_nDEA z@lt&K^^ek+8i36QuJgjFcPJ_GAu>*PdS?kSaj-2?2mnec_z=+mfBya(b!%z5j&WXb z?tpC#S}Q2syFz~}qzn~jaW8DMp>4#O4F~<$a*4 z4MJ&}w&ONVEOF=2S^7i8W8WjCWb=U(0!<4s1cX#v=LM;iLMcVtwWzA%^yw4dJ)f|) zBNw<#3u!Ox2)ctsRTWBWOk+6p4teYy!)<0+7D|rPqA*@>Y@4SsHNCS4plc1A5BLx{ zj}y0fK}m^}LeSQlJw|SqGk(5Nv9qVd`*>x#uZ;6TN||Y1D5W5P));(<$d~s4DFoZH z@Vp0xzyD&oUXcC2ZdC@BdcF|R91 zO0M(A@^9yn%?B>yM2wlpBshOsk&2K0nNFnfaXi)-k&Kzv}L1GGloDzk?=O>4% zD(35zdD|#E_;n%sjbXe|iNa;LlDtO>f!=&zTNduq1i;JdnYylda2=HpoX3gARCqEn zc~VY@{Nec@<>7K>^MU@Ur?ZxIyK{N{m)6vnx?)*(rkt7YD=~P&y0YFUN+}-!-~aeC z-!A>~KA@H2*gK>Uyu1%|t-*C2J_H(5v-to(h>`yQt!!(a)-L(d00000NkvXXu0mjf DEO<}- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_top_open.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_top_open.png new file mode 100644 index 0000000000000000000000000000000000000000..8cd5e61a6a50c90f50c7839b2cb3dd719615228e GIT binary patch literal 631 zcmV--0*L*IP)fyX%IE05Ip|Xq^P`_46kzWl~PmHYiIWCqq?X zf(Up7GbYSn^v+Q$AOHE6v@V5Q3T53WrEs|^DJLR=8E0e6Kqq8Vd<+n!j{$HdNI6qV zL31LekjrvT^-1fUEoUMEGsSzyRAC17Xr!0dH`EfSl2YbT8_6e2$*kE})&&t^3@5@# zITPVfg`dBlXfi`pNI4;DY?qDeb)%F_0JU{u!bHfqAgYKemJ%QCH}w7eMr|GUGvbmn ztq+C=$&{rO1jyMK?zjhgZM1f-l2nA83^P5U{Gsn2?8m{JFefY}pG`6mAenKrj=sFU zolpSx;IUU?PRx{?GIO3h+=I)uVrHysK~4Gb>p{9~3myT0nX;CGir^mf(Gd}j)>%sC zxmQdkwKl?o`|V1)T`t(4$nHVgE6EZff{KC&s;7NR$vmIWvtFR}fgY_fhNA*15FSK0 zIT<+_tu@>S3Pd<-$%w#=$-C=znixLtJ{a0raz<2WwbI650zNvCoq8N7lUfhL2P#6U zM`QFsYYl+MbH~gmC7~khwUJD5CKAq!fN)0tOXXU3hCA!JkaA&+&i-_=o#*Xi()Ls9 zaL31B^v0YM`SR`i1o;1@UtZrxX1u@OP!V2U-?(fGx66g2HP)q2k29?Z{0A|^QmZi0 Rr^^5U002ovPDHLkV1hJfB=Z0O literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_bookshelf.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_bookshelf.png new file mode 100644 index 0000000000000000000000000000000000000000..20b2daccee582f016277f878f5d60e0183d9e2a1 GIT binary patch literal 723 zcmV;^0xbQBP)$3MsTri=hEE^PWj_U8KfV&+4A;sxl7AzNqB*!y z3Qf~mZyn&q^=l}aV4ImkLy?3&8VUd@B?=AC^XS=hgxIYzI`Wi(fdTX=PLNU}XSNI! z-ve;1cjL@Z!Oi|bM#mf6ez6^7C%9Fz(n2YPkVcj>rO)(vgY(}-bo%zc z#aZ$Y?DL#14*mVx!3~(wKme_#*|BKtVZ0wx0JxI}z(4z64SE{Skd`K> zc_CW=rCX|6`Ht;40GO7ITl<9&0wDyZW#hXwlu~3e8PGIL%O>zWEIWtZy?Q0)`gJYM zqc}l`rL;Q^X_``>Zji|cva{~gPzsa+w5AU(T)K>g!t*=;a=9FPc77xb>O6n9g(!|` zq%oG$j!@Io{E%!$aQwtcgefHt#=dc;^cg$n(7o*x3zzJoYnhH|>6|NlqN9Bt`Fx&z zJKnQ<^AMd2I*`&}zGI_@QAB*_4pE^%JoXx*|E0S7?E`zeR?)Rgr&5M+{~FTL1k%W& zn^IyN?MJ359Ng7vDm>dt5Ckk<@rK^XcCMDcQl8=Nt=&T*E#QU`;>WMr9PMZ84Dd3U zM=?$3nC;Nl$6OqHjV?sFgc^z#dz}WVQgK7L{_HFsPH3CRje+ z!_RKN>4Pxv0q|Y7+2lAFQZ{o1dbW+g^RRNcIW?wb^Be4!B7dI^6gvO_002ovPDHLk FV1lmdQmOy| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_cap.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_cap.png index 2799ee637d7f6c97d02174ea3631a9c8533773c8..1b8c8fdd94ba1f3434af6d0f9f33d3a4a601379d 100644 GIT binary patch delta 371 zcmV-(0gV3q5RLTjff)H`2Y4wKVWSs);_>S5J3b{?k3#q z<@UUR;BIzjGKuP%rg_L4MNvqWWs;_;mtk-pY?|(#G+qOY~2X$Sm$a$Vp zmZj!Eysk_3eGhxU^?m<{lMtc^a3@5#VHnf_lMtg#+Y&?o3IVw1#&HZSP~D0E6ar!~ zZ6Q{t&^*t&w?hLUNazq_bt{A*xVC~{Z{c6RB;LIR4>bmouzehdBuOI6vS>gUfo}r^ z5OnRju2TmfTWo9b-~d~lcXf!mdg1N@V28#$b1LAy57l59_G2*+__WSE`a**Jg3Lnz zXEB*`Kw)o*B%?Y4)u(CtAp>;%^DnSR0z{&!Dt+=#Md9!rkZ1|Oo#4lb$P?)>8Fcw@ RZIS>0002ovPDHLkV1lQvo)G{5 literal 2172 zcmb_eYitx%6rNJ31=>=@K#Kyy@WT?Ao!35Q2bNNI(U!1C%97TI+IigFPP#iY%uKt} z*4P%M!K6u7$}50LV=!VwLGT9+rc@znR0!1=Arg5=LLi|KP^2li-r4SM01Fc0CbM(r z&UeoFzH`pKcivgK;>E&AGbSMjQdm_PsD}4q`^wLQ|Fdr-d3c+sRlaN>NYPRI%Go@> z=otjb>ybmXW^HgeC#o?AFR21>STPNv5oA%hrSW0|Fi`Qz%U z>eUCh&c41U08DK#n2j+emsl(t!Z4RMK^f_UjEOcv%^D!8fuT0)B3Rl4Y0kCPXq;aM zys7FTRgGo}wK78)_51C@uxMG0tVn9yn0J>A2=FHGVKhmTI7Q>MGepyz)5B5j`6R=U z>7zT`TqnNZ{vpwowxdlY7< zVKdI_pdtdZ^(Y-hJcz%+H$9v^Pf;T4W(C|ux>(#PIT@U1!eLx=xxG99UN=p$8TI$E zAMHSvbGb4d_?Ya|$rbB)B?91{Nnnq!=h6Cc%xe65Mg6aO2z$32Z8hTlE=;|(PoWC$P|Mr_Vdd|(6 zntNpDD{BjWSiYcO=d-5^&a}M&ZjD@>;y>^mmY3iXGq$x{+a3BC9p`?(6fY?JYvaK7=Du5{i`z!>-MfB{&huXytn2)US~#%%z*dXg*}6YhXx}rz zQ_Fmt_~yBO`tvo*-fHL^oLznxB%Z7htn1fjokWUTe>x?1b)m$y9h1I%_1cxcYdSBl z8Z2=jnR#ULz7x}@ZWOFPhf3Ms`14B$^1SnG?Qk-=uPl1zy$Ri| ziJn8B{Ic#&_fT|C$A+PCb(^Sl1xQX}4qMpX*DFmtdefc!K#NQT1IPN4$#;8*6HN!( u%2)sTep&yP>MnU8nM{_JV*A$P_=YL;M3>p*8Kx(q2xpW diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_cap_small.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_cap_small.png new file mode 100644 index 0000000000000000000000000000000000000000..2799ee637d7f6c97d02174ea3631a9c8533773c8 GIT binary patch literal 2172 zcmb_eYitx%6rNJ31=>=@K#Kyy@WT?Ao!35Q2bNNI(U!1C%97TI+IigFPP#iY%uKt} z*4P%M!K6u7$}50LV=!VwLGT9+rc@znR0!1=Arg5=LLi|KP^2li-r4SM01Fc0CbM(r z&UeoFzH`pKcivgK;>E&AGbSMjQdm_PsD}4q`^wLQ|Fdr-d3c+sRlaN>NYPRI%Go@> z=otjb>ybmXW^HgeC#o?AFR21>STPNv5oA%hrSW0|Fi`Qz%U z>eUCh&c41U08DK#n2j+emsl(t!Z4RMK^f_UjEOcv%^D!8fuT0)B3Rl4Y0kCPXq;aM zys7FTRgGo}wK78)_51C@uxMG0tVn9yn0J>A2=FHGVKhmTI7Q>MGepyz)5B5j`6R=U z>7zT`TqnNZ{vpwowxdlY7< zVKdI_pdtdZ^(Y-hJcz%+H$9v^Pf;T4W(C|ux>(#PIT@U1!eLx=xxG99UN=p$8TI$E zAMHSvbGb4d_?Ya|$rbB)B?91{Nnnq!=h6Cc%xe65Mg6aO2z$32Z8hTlE=;|(PoWC$P|Mr_Vdd|(6 zntNpDD{BjWSiYcO=d-5^&a}M&ZjD@>;y>^mmY3iXGq$x{+a3BC9p`?(6fY?JYvaK7=Du5{i`z!>-MfB{&huXytn2)US~#%%z*dXg*}6YhXx}rz zQ_Fmt_~yBO`tvo*-fHL^oLznxB%Z7htn1fjokWUTe>x?1b)m$y9h1I%_1cxcYdSBl z8Z2=jnR#ULz7x}@ZWOFPhf3Ms`14B$^1SnG?Qk-=uPl1zy$Ri| ziJn8B{Ic#&_fT|C$A+PCb(^Sl1xQX}4qMpX*DFmtdefc!K#NQT1IPN4$#;8*6HN!( u%2)sTep&yP>MnU8nM{_JV*A$P_=YL;M3>p*8Kx(q2xpW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_composter_bottom.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_composter_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..568f1d8b35927b64f23b5c1da88ae7dcc0817082 GIT binary patch literal 300 zcmV+{0n`48P)>Up>f{SZ(A!FV8;{}4vsU8fR>~I=?-33q(KNIwBB$7%c*e2)^!EPo1pv7? zVo>nO#R1^ZUws1rtY&!l1|D?_u$_MH98d1J%`=8v91nLqzfOojk&7cOhTA;v6s%@= znWm;7Erwhi5`(s^72Mmbh%qrJgq^u~V?8^4T-e~x>Vczb^Kne7y#B{y(01nseMypw zx0C9iwW?yqf)DPK)i9D+b-Ru`bSk*7+OUO{s~vu09L^0000>1C zJU%^-T|Y3plKATS0U+Qp>-qut_VEcov(qf*$_>Y7%YcB(c-SAZ+%kXJGPx`YGNsr8 zt^R?TQmpl~WEl|fOetiyZ)xf(eCqL>BnfGzIJBCku1JyuW6YGvzD3?W*Kg`BMhA6Ti*43}7mY hU9gIKVD&E=F|zPD4#or++9o)VHU*85pEI@h-hOSq+Z$bP z_W?i~i;@C|HWpwK3v(_mw6Q#%FWRmLAWaSclf7Hd^JS4EloYgG&*glIKCb#fRW}1b z9I7rMO%7;dM}aMD5>QeQYhx!S{fj%Z+5<=Iy0C`*OkCSWCB+UeaDRR&z6)DT^rKeQ z%@7XG+?Q{|rKA`I$|4U&H1q1NXe9GB+8llS4S=&hyPANcvlXDA^cTP({@I&ZpTBtE$;ThOGk@3j^n=57mg;!quV1(Ty&Je)uPN&jbz`|+72I4c zDC-lIX;~E+Zk))oggDZi$IBAoHLx#F=rrdl&+*>V*q&I2#F1tN2p~-&`oSTEV0WzO zjCll}Z?_oRqm!2;X@)t~NGXw0lB5}}IpMu02m%lSDFo&2;Su=m+izH`*9a9}s>n}R z76s!tGR(lj zkU>C}7tHg78wQdzqq8jlrYZ@9xBx;3p4{DWe}BjIW&^;ns!8IAB#r?XrwJ7VZ2$d_ z`%gdOu-`MmH~Kt z;xL7r!kFa&uy&EmaM|VHjRyolKr9vm;L6c`2mrDq;`vQ#rp3oEMK+zh!f@GT;SHBv zcAdXT&9v}*pN8i#YnT8Xzyd^;L{=^9CYQ~y`_e6{Zkwvxrf}*ShV200`AxiL6Q|(= zkN_AN{Q`iZrT}oAI_*}AZ@vV;ir-T>wvGGzcIYa#=Xm6xkRPI_r-y+)oq;}`LVk!9 zD_0_}?n7MNM>Z}(S_};iM1Y3pk;`Uyc5*+Hf6Ca7!;;J*+D4VO zQKe>D{H@Fa@Z`)903b0Qtdw67e{bf6DYO z>qgggHuV4C)dC=`sVwxNT&aO$$v?NNXw$&*Q?wXq^e5({tM)t*PX) z8C=h2rfP&DMUwD*AG7Yl{7r-aL5NW*l>ivGZ2(kFLy~3YW=g~afzhvHxb-?pDupwz d0T6^3{{d6x9AS$lFL3|>002ovPDHLkV1kseVc-A& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_side.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_side.png new file mode 100644 index 0000000000000000000000000000000000000000..3e52cb82da7d460ba203211659786190b2ea5f7c GIT binary patch literal 731 zcmV<10wn#3P)U6a{yJAR>qhaV0KXh%UQz z;X<^cD2mo#E<4fn5 zu2@t%0)XwKCUcF5Gj|>$r9@E_0B&A5i3(sEIwDSJdmTP3EOKz>CUcF5LCrNHj$gY= z+v_0Wn6414xgNjtt~`wyY-V>=E}5TI!qX_^iJ(^LES{%4uViSaD<&-x1bmK_ZG z09_#vae}6)^m>wakNP8Yg`iR{F*|dLAAcLn&YWUXX_VA$k-9C~UWb+D8mW|+hR#SX zhoR?&2^!5dMaO1&y~iOt&+>YYI9boqD1enW5OIR4D7b!zswzW3ZE+FXaoBnGDrXMv zX8!bLK7U>0U$X(g{Ff?HN;FLaMImq5L}4%l96fRvfMeSydGh8XH_o5tY4tnLU%dk0 z!2UhxBO_U&R7#MNm-qXCw%5Tlbe5Kuve)$jQnv*_eYM3{!NT=J#tIglu*;}z4HFDR zdK)KrK}55yqG_2TI948jqGRI)5vD#uU&alj)P?vkW%7%E~=&x{aON`TKh)c zvgt+}GQ~pRjExNeTeoeaQZ8k;u;zN?O@rqY9|dL4k8?*m{v4u)y6zFJ37RX%;G5(NQPp+MOG1E8u3{{h|&GH87i9Do1- N002ovPDHLkV1k~~LD2vJ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_top.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_top.png new file mode 100644 index 0000000000000000000000000000000000000000..cfa025d598cf3c6bcd312400bd5ed0bfbb559214 GIT binary patch literal 493 zcmV{RE}n z(y>qnJS7n5R)PnkSn_j}A+LigA=yeP^h^itz2}|#?!97b)6}#1BLEvO)~V(t^-_^E z49630rW#)bm_`PzH6pjMuHT=1<{^0G@@S84!=g|yQUzRBasK_5SI3{2KLmVu_Zk@n zFOT-P zMqJ-NA**>ww_!yIZM#CJRtBI`E7NN(V!fsnae!{aqMDb;da0PO9dhOQxUPy`4S77T zUMjM-+-JOvFF&U!@7D^CV?`jee{ps9ERRF-pGY`Rp3m90TVT<5oTp7F)j`{?&}&*K z&!^Y4XxkN(=O-qT5EzapiQisEIF;ooxUOP2o**hOvwAxxqD2Z@NfQeZF4E0Zv*xRS z-IH^iKdbyNa0VlG4?ptbZ5L@88C-A1&i*ORV6&-BY%;FY=5YdTl j=fq#n`TG8e`1$_^Cj7#8^9P6400000NkvXXu0mjfxU}Hs literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_ladder.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_ladder.png new file mode 100644 index 0000000000000000000000000000000000000000..b9cd21cb2228d7f854e6a24e0cd970821f0c594e GIT binary patch literal 613 zcmV-r0-F7aP)xcy`@v(KrU_M*S5F=y08d}P z(VR0WC7PxorG$v!y$2wKK-;zes45`@M1(sxZ%701`P)y%al{ydbB1T&k+l_q}XwZ)2^+T1!d^?>%kX5<=i$e_u-}SZk#QXxo;v z>+6IN$T?TkIeUx|V+__>)=rx+63Nc1~ z34a`X`Th%l!^6Yspp-)2_vD-_Nz*j-Z6<91hGCF@Yunk~#ac@U0p}dX7(|3=n)tN0 zry>II*8#xlsZ+!lDWw1qW5im^FbsI_2_djpEa+BNs*f7r>ZJ?1wQ-)NX>iV|s@9J& zM!K#e#)xx{t&Q_@8Tx#7aPaj9$5{2ugER~S&N)<-loHN4Qc9@mUjpZxynp*v0Tzpe zT;ANQZBkW4gb)J87?vMD{yzsfXI9qMu-4Kv4c1y>jO3i@`yPO<>;80Rb+t-8F$X(a zmjM{ZQM<0g7(*$AaUAKoj(Jx$FP@vL)EBdZy)R#Dwv-YfgcAbC@nH)XN)nZYF(-rBOl(qQ)3L?dja?jA9+j_({7?<00000NkvXXu0mjf+9VU$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_log_side.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_log_side.png new file mode 100644 index 0000000000000000000000000000000000000000..7266a40e1bccd0cc93685a7f09524a05363d3018 GIT binary patch literal 1866 zcmbVNe{9rb819BBj?4@}og->3QHQSAA9uadN;k*d$xgjFwp%tsH0#>$?wZ~8>)LL2 zTXaEi5DkN&80Ub?kVFF*3>yC$FlCuW%~*5>#XwB_N5JT!W)edTe!bl_iUSv#wEf!e zd7t;k^Y-n_4fX3wODak*3@Z)S1sl=5%sH17qwCXbf9hlQCqa1K4;wh-$ zfF{5>kDpW+AB*#Xhw;+_>#M?9n&By$rx-6uGa~I5y#k&;2;|LFV`5|Q@w_keBoPVQ zHbja_r_-La*8|Ns#R!5x(JaNXBtno@k8aBuQnywW7=pl3OwF)0sN)W!+zz{Ji9nIg zrI0dQTHVT*2^EaW$OgrDXeXr{P*q%<(Pbuc&Q*m1Nst1%Z6PeXzOcsP{ zD6rsxfFsNrys|~pRhYI`JC5=;ASl~FB3PQGNroj^Cd&AbYNC&Rg!YOwJqL}TR#0VI zz6#7mSw>|2BFp^?3{@@G^S@A45o6Fy$*53TN{$1{(BnC8k%$=9EnC(V5DrQN3e}@& zswk+ekCQo`^zxjSWW7F~l-pxG30PhbIKN-^^1gz75Gq}chy{BU*>fNU6hAMM+?rU7 zMC~e&g1?<6V+u#}e%=fGG1vZSQ$rt-oV;-!S0ph2lhBMn6;;{mv~aGK#5&DFdiCT# ziYCyRUnMm>*FB=FI1MflilZ!0iTrDAp2{pNvpL#y0wB`s$UO(MV9ZX-Ca8_0DlVj> zsB6V<$=%nFeqp-K8~uO#?*^mK7gtHhdK{pcNfAyylrvrCq@k`>Ew}fNNmPKN@#ZYu zxr!d#$qaNvZKApRkY{`r!-~jour^vb)zvuKI8K-Crrwu|Z`trtb*SQrzD-vst$cXJ z*Wm|0eywcheRqHGo4D;Gqknz%&*)hFSvEVs{Lv@R9NRb5c}jVrqtwQc?zM>2L= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_log_top.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_log_top.png new file mode 100644 index 0000000000000000000000000000000000000000..0137949fb6d9bffed85196c3b4a7820746e0d864 GIT binary patch literal 2511 zcmb_e3v3f*9Pi9{2w7k}%v_9|MRek>_vrPmcdQ*_ooqW0BqHvFtoN?{)hSfRIwBy-a}FT{Pp zCzmx~7-0^>qS2@=YPV?-KSr=Di{T_jk|?x5^%~XSt5H=Sn?UdYU5qGUL(x>kMC1jn z(r{TJ(>@8Ia1vJ4<6(jU!>ai(M%ZvuQp`{ilXl_CNHFGH5-|`2A)p#Mv?Y?Z;ecjn zdO*7ebn^8r4q#}#-lUJaatVc!E_9=y3d)EFo^z*o# z!|^^-uO=ySO+QnDL`jE_Bsd4n5%?{puxcdU;Q!ND5;<9mgm|b~3Gse_g;l>5Nk)>( z*MeFEI)?1*F&17gSET9&uZp0^tK1;(HClYAW zA_{CZKG+}CWF4BRKL|RPJIHg`$qygfcY;}%*fQlHOv4N zNi|5UeK=k;w*{9~H2VQa*7&q?m%4eN48_++0|0{Fr%C#}>zZst`3T7K!y0>#KE&?D zU+1gt&z@vh3J5UJb{wZr!9h7tfsk=j5(So)85!`joKWA7z1g>fkDxe;;s_?uw-3oa z9vm^it9}4a8qE6edLFEc`-tAA=gxiTf7KJK(Y{i{Zm+`FyME^pOlNEg9&+X|dAh=f z z?R~<%^8Irs2c@T`k4pEXo^5EIv-9OHS{d>8rNv{u$dJjN&I_G$uMC@TGW(B9D;itR z)ooqVb9nc`&D)J$HPhSX8$V*@{__jlO0FzyTt&RM<9zYnf!|e(U$|&f@!>POv%Yob zxG#T6H(WS%^x}qJ*B(EZI+Kb1&=%dY^=z&?Wq{G#-qx~jTW-g`SzT9OpIdhTZ>}4? zq`9A9P7cW@wTIoCK z*BpgEJE_whOLOwptX#JG z(6M1h)a(V7UiXv1rvhVY^3Gjz`+LTn+E%gd>5BHAZl!ro=-3XbIAg-bsad~Y?{1&4 Xe&i@=TB*bQ%T-iR?AbMG-jaU-d)8eC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_planks.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_planks.png new file mode 100644 index 0000000000000000000000000000000000000000..db04c4706fb5c7c955084e689cc2bb39809d60a5 GIT binary patch literal 1658 zcmbVNZA=?w96xXi1%ooT7^5S(9bYi+dM|zB9=Wm7!sudI!>ZsH=k@Msd!zTl-F0oz z7{v@E@BwweFgmvnDha-9854+Zvdn0r3G>tD2eZXQH;EXhb5kO|JXhL=nfbQMUGKTO z-}C$bfB&}*M%s5&SKV8MVOVvjE!ctXHTLBwN53P_C%x!askc39V%Y5)?W+uX>E(Mc zY~58k+GTZx9|EGLI0Z?IL1$Lc5gNl9o3gqfc0&t~!Gx^x#P{!gK;W{(6P=zg9o7Rd zDYx|+aCdKeRP5~*If-c6hBsybB2b_u;8`W5njp&)d0v3l_G^m3^AM|>C;YZSyek~R z1DXMGkJC$vjGM)MoRjg=9P8eSvozzQXdlJ6NSXn(7q~dQa1h9vA;m#Qu(ePbP6k=N1;tAyG zssu$Z(W+)4OekPfR?sQNN!yb0KuIj&^t6%68<#{1rl0~<%S2eFgw>OprI|_XZ>US3 zZ!myD8xEIj+|(CEDVZ>>mVHP@As{zJo6(#OsSaprX+wl9`;eP;wi+D-3@BKd5!JL* zF;S7C%XlDQC#C_f@03+Z%b54C*#m=u1$ly{S(>DMB+Et_4?w5e^8oDvG`$K9Ymyw# zt${Ku$$FwJ16U4tZiJ$$kpxTlSFj|4xMnB<(kv@N0#dq~An;NoK|o7s1~QDibLG7V zhe1d+EkPAwD995?wo{fRK)ZZCmhr?$){O*k9ydoexEkCfgtX|Q<8c?qvBmvCO-$R# zE$)~8=l)%WjG9YG-7=5ea&}dKHrYh^$`zVoH|!~_QZk+|1R#iZf%AlDXBJ9C;kA6r z5m=?oBq1XGhjg#POf7C@1OxgLC|dueqA27)Wq0GM6zZ=k^WWBVZV`^gfxRrvA@oq1 zWKc!p%RqCgX=h&#hLw?_pg&rFR_Qplx7=TozR&EPdvN`bquC+T*buD#fanqTlrGsx}h<)?i2jV$kW%vWA86cUz_5~!81p`dw6R3&cQYed+Nl6k>PpA@o(D? zISzc2E4!YVIX^bjHTUbshiabfZ}{xsOy~NFp%W7yj+*@y2j6^Azk3oJx$9)byBB7E z_;l)(fV|?q#1I$#n|Ffx(CC4mYUy-zsB&gIh-`do?EH~wvUzyV(y2|gk@@bB|I5jM l{7zNvw0CUym*jYI$5+Pn)AiN$WA?v8sHHvlcJt$Xe*z<1Firpf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_stripped_log_side.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_stripped_log_side.png new file mode 100644 index 0000000000000000000000000000000000000000..6c0465b65b2448e9a5463a284c0c873ee955c63b GIT binary patch literal 2261 zcmb_e4Qvx-815ihwmF1EBFjW9$KOD&cfGq_d&jyl+HI}S0o!B+8Qa&puj{e3*R{8{ z15rdAK@`EC0dqm8k>L`DWc-Cir$hx|s6i371;dXBQIQNqToC4WU00C|B*Z4y`|j@f zp7(j*_xZlNHFFE{N2H{uXf&D;cAK>jokyuh(lGSDeuIZar)0lvK~ST)?*a8l&@?or zX*7vVQn6EUI%e~N?9~BLc0pal>qlsfCNn$Y2SO!Ov@Td7`OMg*_6|%diDsNH9!2r<1Q8C0bzxd32Pz0X$8iKn5fp_Z1RkvQDIkLTf)fTAtS~49B)=lbKCQ|K zTyl+K#*os16uka8tuGiW6Dk-H0e(WSBh{3mKv9U}{5659XmC*=U={R2pAtk^eH@Fb z(j&4E^+Kr=>>6p8C8oYEKT8PqkN zAs;1ao+JmL4rB!pDBu>bp_oD#nm5q@0?VT0uKiD_DDZAM;035qk{47!!tbkyMsqlL zyDz8!p8)MvGlrz3xhWhNpbKXi2I7EYOt_JB14d8MCIf_n^R2Q_qc%~U zKj3Fk77$0gbVxF5GBFIm86Z+P6c`Q%CO5=6m&*uI6cR#ekZn#tLQ4u%-OQ@05)q>T zx}m@t0d6q4-8fnV9L}*W5_by*(#RTV$hsL!`%hepTqOq_vWRLsmi?>NZ)VhvpB!g0fo)g8~*FzCj6 zR3D=kJiu20(GE&r_nyz)x%PJX+_Jj<*L(T;wp5D|ck!tGk%@+&m zCcgV^xpV)=$saL9-N7q=rMGUCX7lT^(v!!(@OJy!w#LTtwv!j%iJY-XYx-Q@v$%y_ zf4;W#xPA01**Q~}_n$u7^vv**7xBdRpLm&BXFC2x_FJiC&Es-sXxc652lizZw$$&> z+{${_ws{+bRh5nA*C$^uoxWF^zta-x(bXS5JACihj(si6mp|{jytvF!`cNr$!4yi% z8`D-HfI~Y@tgdc!pL8Z1O50mjyM^BEDS7F7YAC<3WFdHMmHnq{PdBHyOy^H%HZ96u znRVna$k{lC25BFnxynDp4Qu%*?sld-;XUReekmzqZV!jmf52Z*uRrEZ_Dd# zBJ)C7)#FBP7&*BW+5<;3x)R$9_~W)&X?>5><-B?SfziXdNauq3{Y+C@QGWm7b2E>% zJUQ~(k>`H_2XnWytuBA#T;H#~D?Z8Dw6k-M?7J~7iM!x@FVWhesr=(qbBa^XF&MaT~H$m(VWB>pF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_stripped_log_top.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_stripped_log_top.png new file mode 100644 index 0000000000000000000000000000000000000000..afc7daa60ed2d0abefed58a968ab9ba46694c4fa GIT binary patch literal 2602 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 qb*^)r>s;qL*SXGhu5Hh$IF1J}P6Z>ia00001Y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/entity/chest/jellyshroom_chest_left.png b/src/main/resources/assets/betterend/textures/entity/chest/jellyshroom_chest_left.png new file mode 100644 index 0000000000000000000000000000000000000000..357296291f623fb11b04fd81ac7d97e5114c1206 GIT binary patch literal 2779 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 B_eTH# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/entity/sign/jellyshroom_sign.png b/src/main/resources/assets/betterend/textures/entity/sign/jellyshroom_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..57f3fe3d59037b1f5da32524e18d5b29ac1bcdd2 GIT binary patch literal 1149 zcmV-@1cLjCP)z2 zzR#2AFW<=j;>PFy$-jB{_T&HX)30X5ALIgdrD^~U_V<`23zDqh$~flg-VU>5!92|w z#}Rd-8AU(aLSWktO;dw02r2t-n!1LrL$~@|{1-1zuq+FN zAPA#noNG;0RRBbB3_uV@q>BV8B~nU)Fd|PE7-P=GA1uJpXNLs75BwWrQjXY-W16Nx zw;h%xaaRcrpfiT0?+H|`&c#2zc{G53{jJBpH&g(CS+eNeXMLR~3(~U0bjtyEM;2wPxV769WoBFPGT*FlJ7d)xSf z1^E5JLjWAd#daKofvPMJLf|+qo$2V>7Tb2vt2kd&C64RTwJoQU$+`GRR!|npe50z0 zcz2gtDe^Q0mN6VgBaAVm$sB1}M5CCt)znH6gweV9g9Z5N%VVBAf62lAUa#hKo)Gw6 z-)^+Vwk)3hdBV-ZYm`+*;QRbFn{#ze(&dD$Eq#C(9@t?->B8;YB~(3T|tty2GoO@_38)5U-vrzz-Ds%kRbtr8^>qdUniF*A%A_P)T|eo;X}Ch2~1r10`84bkcAh-89=}cJcL0L zkaOwFbh|h*Itg*>zp7NazWjf6!T*+=70+I-Cg%frW+=)Etu;z1thLN^yI5<~op#P}xW(u9?@+2SS(OF*Uv@BgP8dg!ray5|RyDWptPo@3__Ue zryX?KZC2OT3EtDnGJ^N$%&@<+jjL<&Rx{A*cB!nzJ3kHZ-m|c@gms>nB6siKqp}X? z0{|B~4d7<4&$pu=lW&{=w)PJwex9JTCZ*Ik&>C$FF-DYX(gq)haf~)*8er=RTh|2V zNF+oAtqr0S-r3(rBWTm~>av(#;@q`a=`Zv}8zV|6b zN-_nAG11C1#vvdGB$%C>;M1&07*qo IM6N<$f;1isssI20 literal 0 HcmV?d00001 From e0fe76088a3c2fd3896fc2ff3b210fe91d9527f5 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 25 Dec 2020 23:19:42 +0300 Subject: [PATCH 026/463] Texture compression --- .../textures/block/ancient_emerald_ice.png | Bin 232 -> 232 bytes .../textures/block/blue_vine_lantern.png | Bin 700 -> 700 bytes .../betterend/textures/block/brimstone.png | Bin 223 -> 223 bytes .../textures/block/cave_moss_path_top.png | Bin 586 -> 586 bytes .../textures/block/cave_moss_top.png | Bin 710 -> 710 bytes .../betterend/textures/block/chorus_plant.png | Bin 712 -> 712 bytes .../textures/block/crystal_moss_path_top.png | Bin 617 -> 617 bytes .../textures/block/dense_emerald_ice.png | Bin 235 -> 235 bytes .../textures/block/end_lotus_planks.png | Bin 583 -> 583 bytes .../betterend/textures/block/end_moss_top.png | Bin 720 -> 720 bytes .../textures/block/end_mycelium_path_top.png | Bin 548 -> 548 bytes .../block/flavolite_runed_active_1.png | Bin 719 -> 719 bytes .../betterend/textures/block/ivis_moss.png | Bin 1612 -> 210 bytes .../betterend/textures/block/ivis_vine.png | Bin 1748 -> 307 bytes .../textures/block/ivis_vine_bottom.png | Bin 2082 -> 259 bytes .../textures/block/ivis_vine_roots.png | Bin 2028 -> 506 bytes .../block/jellyshroom_barrel_bottom.png | Bin 754 -> 714 bytes .../block/jellyshroom_barrel_side.png | Bin 720 -> 642 bytes .../textures/block/jellyshroom_barrel_top.png | Bin 721 -> 656 bytes .../block/jellyshroom_barrel_top_open.png | Bin 631 -> 581 bytes .../textures/block/jellyshroom_bookshelf.png | Bin 723 -> 540 bytes .../textures/block/jellyshroom_cap.png | Bin 398 -> 250 bytes .../textures/block/jellyshroom_cap_small.png | Bin 2172 -> 292 bytes .../block/jellyshroom_ceiling_stem.png | Bin 1541 -> 188 bytes .../block/jellyshroom_composter_bottom.png | Bin 300 -> 225 bytes .../block/jellyshroom_composter_side.png | Bin 335 -> 241 bytes .../block/jellyshroom_composter_top.png | Bin 250 -> 172 bytes .../jellyshroom_crafting_table_bottom.png | Bin 698 -> 593 bytes .../jellyshroom_crafting_table_front.png | Bin 747 -> 498 bytes .../block/jellyshroom_crafting_table_side.png | Bin 731 -> 508 bytes .../block/jellyshroom_crafting_table_top.png | Bin 493 -> 288 bytes .../textures/block/jellyshroom_ladder.png | Bin 613 -> 519 bytes .../textures/block/jellyshroom_log_side.png | Bin 1866 -> 263 bytes .../textures/block/jellyshroom_log_top.png | Bin 2511 -> 371 bytes .../textures/block/jellyshroom_planks.png | Bin 1658 -> 253 bytes .../block/jellyshroom_stripped_log_side.png | Bin 2261 -> 483 bytes .../block/jellyshroom_stripped_log_top.png | Bin 2602 -> 373 bytes .../block/jellyshroom_wall_stem_1.png | Bin 295 -> 182 bytes .../block/jellyshroom_wall_stem_2.png | Bin 314 -> 191 bytes .../block/jellyshroom_wall_stem_3.png | Bin 274 -> 172 bytes .../textures/block/jungle_fern_leaf.png | Bin 1681 -> 254 bytes .../textures/block/jungle_fern_leaf_2.png | Bin 1794 -> 274 bytes .../textures/block/jungle_fern_leaf_3.png | Bin 1765 -> 258 bytes .../textures/block/jungle_fern_middle.png | Bin 1842 -> 232 bytes .../textures/block/jungle_fern_middle_2.png | Bin 2018 -> 208 bytes .../textures/block/jungle_fern_middle_3.png | Bin 1928 -> 160 bytes .../textures/block/jungle_fern_spore.png | Bin 1552 -> 193 bytes .../textures/block/jungle_fern_spore_2.png | Bin 1928 -> 159 bytes .../textures/block/jungle_fern_spore_3.png | Bin 1877 -> 127 bytes .../betterend/textures/block/jungle_grass.png | Bin 471 -> 293 bytes .../textures/block/jungle_grass_2.png | Bin 485 -> 306 bytes .../textures/block/jungle_moss_path_top.png | Bin 1793 -> 228 bytes .../textures/block/jungle_moss_side.png | Bin 320 -> 284 bytes .../textures/block/jungle_moss_top.png | Bin 266 -> 228 bytes .../betterend/textures/block/jungle_vine.png | Bin 503 -> 279 bytes .../textures/block/jungle_vine_bottom.png | Bin 1777 -> 324 bytes .../block/mossy_glowshroom_barrel_bottom.png | Bin 577 -> 577 bytes .../mossy_glowshroom_stripped_log_side.png | Bin 635 -> 635 bytes .../block/pythadendron_log_side_2.png | Bin 646 -> 646 bytes .../textures/block/small_jellyshroom_stem.png | Bin 419 -> 243 bytes .../textures/block/tenanea_door_top.png | Bin 564 -> 564 bytes .../block/twisted_umbrella_moss_bottom.png | Bin 502 -> 280 bytes .../block/twisted_umbrella_moss_end.png | Bin 476 -> 262 bytes .../block/twisted_umbrella_moss_small.png | Bin 360 -> 228 bytes .../twisted_umbrella_moss_sporophyte.png | Bin 321 -> 217 bytes .../block/twisted_umbrella_moss_up.png | Bin 406 -> 227 bytes .../block/umbrella_tree_barrel_bottom.png | Bin 585 -> 565 bytes .../block/umbrella_tree_barrel_side.png | Bin 588 -> 542 bytes .../block/umbrella_tree_barrel_top.png | Bin 574 -> 560 bytes .../block/umbrella_tree_barrel_top_open.png | Bin 481 -> 463 bytes .../block/umbrella_tree_bookshelf.png | Bin 682 -> 492 bytes .../textures/block/umbrella_tree_cluster.png | Bin 281 -> 243 bytes .../block/umbrella_tree_cluster_empty.png | Bin 280 -> 243 bytes .../block/umbrella_tree_composter_bottom.png | Bin 297 -> 220 bytes .../block/umbrella_tree_composter_side.png | Bin 319 -> 244 bytes .../block/umbrella_tree_composter_top.png | Bin 232 -> 169 bytes .../umbrella_tree_crafting_table_bottom.png | Bin 558 -> 495 bytes .../umbrella_tree_crafting_table_front.png | Bin 641 -> 450 bytes .../umbrella_tree_crafting_table_side.png | Bin 598 -> 446 bytes .../umbrella_tree_crafting_table_top.png | Bin 483 -> 288 bytes .../block/umbrella_tree_door_bottom.png | Bin 2449 -> 318 bytes .../block/umbrella_tree_door_side.png | Bin 1661 -> 179 bytes .../textures/block/umbrella_tree_door_top.png | Bin 2341 -> 313 bytes .../textures/block/umbrella_tree_ladder.png | Bin 2135 -> 489 bytes .../textures/block/umbrella_tree_log_side.png | Bin 1639 -> 242 bytes .../textures/block/umbrella_tree_log_top.png | Bin 2328 -> 256 bytes .../textures/block/umbrella_tree_membrane.png | Bin 399 -> 269 bytes .../block/umbrella_tree_membrane_0.png | Bin 1843 -> 240 bytes .../block/umbrella_tree_membrane_1.png | Bin 390 -> 254 bytes .../block/umbrella_tree_membrane_2.png | Bin 382 -> 250 bytes .../block/umbrella_tree_membrane_3.png | Bin 396 -> 251 bytes .../block/umbrella_tree_membrane_4.png | Bin 386 -> 255 bytes .../block/umbrella_tree_membrane_5.png | Bin 386 -> 257 bytes .../block/umbrella_tree_membrane_6.png | Bin 393 -> 257 bytes .../block/umbrella_tree_membrane_7.png | Bin 391 -> 257 bytes .../textures/block/umbrella_tree_planks.png | Bin 1649 -> 254 bytes .../block/umbrella_tree_stripped_log_side.png | Bin 2197 -> 238 bytes .../block/umbrella_tree_stripped_log_top.png | Bin 2334 -> 222 bytes .../textures/block/umbrella_tree_trapdoor.png | Bin 1947 -> 272 bytes .../betterend/textures/block/violecite.png | Bin 237 -> 237 bytes .../entity/chest/jellyshroom_chest.png | Bin 3152 -> 2537 bytes .../entity/chest/jellyshroom_chest_left.png | Bin 2779 -> 2272 bytes .../entity/chest/jellyshroom_chest_right.png | Bin 3007 -> 2400 bytes .../entity/chest/umbrella_tree_chest.png | Bin 2621 -> 2211 bytes .../entity/chest/umbrella_tree_chest_left.png | Bin 2325 -> 1949 bytes .../chest/umbrella_tree_chest_right.png | Bin 2506 -> 2050 bytes .../textures/entity/sign/jellyshroom_sign.png | Bin 1149 -> 821 bytes .../entity/sign/umbrella_tree_sign.png | Bin 2709 -> 717 bytes .../textures/item/jellyshroom_sign.png | Bin 570 -> 484 bytes .../betterend/textures/item/jungle_fern.png | Bin 451 -> 277 bytes .../textures/item/small_jellyshroom.png | Bin 448 -> 267 bytes .../item/twisted_umbrella_moss_large.png | Bin 439 -> 257 bytes .../item/twisted_umbrella_moss_small.png | Bin 464 -> 301 bytes .../textures/item/umbrella_tree_door.png | Bin 2032 -> 222 bytes .../textures/item/umbrella_tree_sign.png | Bin 2058 -> 443 bytes 115 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/betterend/textures/block/ancient_emerald_ice.png b/src/main/resources/assets/betterend/textures/block/ancient_emerald_ice.png index 13152ff3ae201271a2fcdc5ceef421ad24582b90..611ad6c07611f30dd6ef26395b2b5de39ae1e569 100644 GIT binary patch delta 28 icmaFC_=0gl8RM;q<%t5>U({6@fWXt$&t;ucLK6U-Zwbl( delta 28 icmaFC_=0gl86)Gw@fWXt$&t;ucLK6Up!3f^~ diff --git a/src/main/resources/assets/betterend/textures/block/blue_vine_lantern.png b/src/main/resources/assets/betterend/textures/block/blue_vine_lantern.png index c269849a7245a67d024a2ee362c3bd221bb1f81d..4b7ca65f4fff2cf86c9161a78abde28084b0b7f4 100644 GIT binary patch delta 29 jcmdnPx`%aw7UQjr+Ko&CtA3P9GXR07tDnm{r-UW|n8pdK delta 29 jcmdnPx`%aw79- diff --git a/src/main/resources/assets/betterend/textures/block/cave_moss_top.png b/src/main/resources/assets/betterend/textures/block/cave_moss_top.png index 1d3698b27d0636d92874efdfda9d20e0492c1a8a..335fa1cb84944ce789cbc22122e5e477f0d5ef56 100644 GIT binary patch delta 29 jcmX@cdW>~~79-gTe~DWM4ffzJqe delta 29 jcmX@cdW>~~7UQjr+TBb76O8%t8Gyjk)z4*}Q$iB}jVlP( diff --git a/src/main/resources/assets/betterend/textures/block/chorus_plant.png b/src/main/resources/assets/betterend/textures/block/chorus_plant.png index 756dae1e12c722629c9b10f6a8b16b57d9c7e699..2bf9e6f223652cd03dfdf7ff91fcef5d9a8bc91c 100644 GIT binary patch delta 29 jcmX@XdV+O=7GvB-?OrAU^}_|97=Xaj)z4*}Q$iB}ko*a4 delta 29 jcmX@XdV+O=7UQjr+PzEyMwBS3j3^P6Ir)Q diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_planks.png b/src/main/resources/assets/betterend/textures/block/end_lotus_planks.png index 0de57261eed331daacfd072ecf59b4bd929c66fe..d0eb1f48b53f00b474cbacc422c845a86f637d34 100644 GIT binary patch delta 552 zcmV+@0@wY=1jhuBDt}%zl3P#IKorM2x3(;6G-9HNi4YSN9(>U^Kce4EpNJ165DCOA zivr88?6%Xn`kNXj*`4PRe5&*u-kxwT z(fa^cD|vc#=R$JML3e(;R0;tB=HmAfCmOGHZRjHmtj_rl`!AQBYm^$SKRnoZa1kN^ zZ+3T<{UFg5vVZ!1IY*&TNs&@@wOZG;A_LjZf8CZkO;x^}-{}&gcZaW@-}e@iIpq*y zZwDxOQ!FWS&fxKeJK1%PEyg%su3>7)YZM(Q=UhR-Ob`b=rZR*!WCu=|F+-$r^dM-I zQXx2*)HniMrbH78P{N0N&IvP2fhkh5wx3S7aq;hvdVgzaEgg&r1t`f-+-H)6tx1Ez zdcC2z9{FvfW!O)F+b>zVV$w^Vqp-!ah67SA!t?d^s>U}b_gD+HC~{*;>% zV(hz~3SSxY7(NvDybsQy_;&Z{%JNV#RxEMLv{uDoirvPxdymW2JGr_8z_}2D(6hxF qB=_pjbmJ>z*0000 zLK7#Uj%Pei&bVTvWbE-huX~4no&DYRrWWk`&*sbJ>9?Ea)A`A4z5npyS$i-~3Uc-9 z?(^B(tHu50tLnOG86m0JK6HoPIcJP3%feYa21?0%)ly0Y7k@Z6W{4rOap90+BmY-X zs6h|T#iEo#2p>HDi*ZRQ8PMLvYEoACmC}b8Q<^A=4H#&l2rMB6d<}0zH8^z+)1~K;h_tqL48T z!KzYl1aR&WilC74B9Koh!VJ0)GB6pV>v{?ok0a8?h=0clvA&H+<1r)mO za2sXr4W)HmXC|4OK_QJ&k=3#{%p1NLhiCO34ed?#90Hq8i#*8jp3Lv}5af)GVg(<6GDO0000dVzI<7UQjr+EbYX8df$NGXR07tDnm{r-UW|nOzB# delta 29 jcmcb>dVzI<7GvB-?Ws%xuT7O)8Gyjk)z4*}Q$iB}iZuwp diff --git a/src/main/resources/assets/betterend/textures/block/end_mycelium_path_top.png b/src/main/resources/assets/betterend/textures/block/end_mycelium_path_top.png index efd16c00ee064df829cf751684098b3172412268..14f7385b8a9bfcc215c36ae151118e2eed60671d 100644 GIT binary patch delta 29 jcmZ3&vV>)V7UQjr+AkRen0IO&VgLe9S3j3^P6)V79-MHFaUw4tDnm{r-UW|i_-~M diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_1.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_1.png index 62d6cbade51805a6b58a801b7f731ad661247617..804be8bb5a10550cf11b14a11e15531fd7ef425f 100644 GIT binary patch delta 689 zcmV;i0#5zU1;2MG!?#Mn-16x@UTanH54B3@i-303R0{At4Ne%MW4V z;A8Oz2;qPLv5a;l9xH?dJxo8UD=Q-_F?t}pYeXn++!L)7N-$ z_XApM#rw$3(_8Xbpo3~2%L(5MsQt}?5n_u(Pjh)i9{-|idxm~MbIz36IPEg!l&L3= z_=v_0-a2{>qQqiVquxy;R4@l{WpT327rF{4+`uQ7ZHR}6! zgwJkqqRgM%p@01ht};y%!edRx6Z0^X(Bc)%#e-;y4quAsH)<{vs!N`-3jj%@c|zk z<%?TnPVn|mk1;QVrXvmkN5wgZIOiyN1`(RBqt*oxp?_!tIAYV%uY0@*>J{w=f}U;H zTG9UiIUV*$dv#vZd1}tocYnhsqitK7wgX`Iu%)PD{mSNi1Lr--Ci=$V1Vb z5^^Hm03i|(AQo#^;<7?Wtc~Z=)7^Ed58oI3;agwE5mm+AskP$nq?B-XYORO}B0>m( zAOazPD*G2dqU*Bo*Dv1@V}>BuG{XuaLe#`OPt;mTDHEFpcYnj(xP1B+FYkUv-JKXS zH&1UVV}%afB35Q%GobdG6(i*q$&u#riZcF7*Y*tkfR<9Ii*eo;>bc^dP&fReJJOf81W}gH z@6djM;7rqm0Dk~Xr!&jG5JXt3u|8IOEtnbOt0V3!R%TBBJg}S!Q5981=Xpl8rERwy z?q`NtiK@iZF@5ly`8YG)pJAHFO$!Umrz4&Bm>H_7M2T#+J8E|(Mnz&Gra=Ar7FlL^ z|5sEM_m$Li!+c0Pc>82q6T{ z#{<${k((Am#7n`S{fSLR+qN`q2f+UEo~nWE8#`1L4KXs?MBfCWfLX!n#CqD(e)BF( z2*`)OQ_OI8DuvYweYjwrXXJD^kaJ7g4lL`QYKAQfg%fKvf+*HF?oKsBHW0!}@D&k3 zhs_2w5PzakWu$)g1LeFRA+UV<6Y=sIYT@+p_l&0p+R&g`kem?_bgdQDfXhOEvtwPH z^?pQ~hSWu3K7e)%`GRnmNL^yH+Ypn|HZAJzTwK4&W_!szSIRPTG29SUsnsAt%7zXt z-ObyGKq(_-I#Ab&j(`8g%NNf{DPd-a2&dzbCn`^_7|$bSMvM_FMnCkJ8Ko2ea?bn@ Xj19KUrgb6G~J8(8dz92Wmj8fA?qQ9+}QNlL1O86h_=v;TKF~o$4ppDHO#^rXPM%pZN zBH;w4pWe1t)fHT^wmX7aZ%`82D8>jt04y)C0?6?}Q3#8Dp@%?F1fU6(NGd4MhPMaC zidv}sCsdKe0yZ^B9HnZoh&V$pHl#_Cn9(g8>N3hCV+>I>psI=(3P!>Ozymff%QBmX zA;3lzsIYu665$IF7KHv#`+XA2Q%(@u@0I`g{xMS}MFh)t&eI8!n80OhN?0LY4mv5^ zNF_0?S|nbzR#EIm`&+BBN;k4cgtC+1F-CSGixj4HtlqI_nzWS?BBcKk?k3E_1-k-G zG*l#Byq%2Vi2j^YjZIUyzgyY3`%C4v;iMfn%T6C6n@%S~I%!`f=~Ij~d5!eAdL}uP z>;Fi;QLo3>Zk^r##q33e^85Ys%J`Mj^`$rf2L^sWcIx`U2cPdcKX||u`Vrq;dE(56 zi`$>})m*s^pWLjU{I%~=@BCHI+v6V>-|7DPm+{ZO^?j9ESQ+hk+;h$Q%?r!#pUNMp z51n}V$#aVnTQ8kE{>odfP;dG0uI!;b>)u=V{zb2RdhF_5EJh}>^Y6l^4nMo|`a0j@8qe|9&#t}DReE^%gNq@impZn7Uza;g YEnoihyL$&0B&XkJQrYC0M<(X}1Y#c)mH+?% diff --git a/src/main/resources/assets/betterend/textures/block/ivis_vine.png b/src/main/resources/assets/betterend/textures/block/ivis_vine.png index 08aae3d947a3993087e68aa4cbd33f43a54771ce..541854b132209e94de38a4a5aab4cda37c61995b 100644 GIT binary patch delta 280 zcmV+z0q6eI4YLA}B!BuzL_t(|+GF_t|33pVw%~L4@5&be#_l|^U<_jS7p(jrDqsB{ zT|EQ305T30OJuO*arqCzFhhwpAb>j^tP$jbAkLiseIc9vce-r)UnMyEKS2YK6@v^2 zM$k`yTfY=}mWD_<3Sux1@Ab$fu7@JzGevi_v`X6gv z_1}~|2*vL(al8hgM;Wqrutg;UzI1@@9c)pFHyyw*C>%hsK~xwZ`x%rDK$=0(NOU?t z_A@LYnX$POpAL}y3`@rP9Jc>SN(Uee(x}Rz3&yz80N!)}@;Au;AlpHP5N!Z*I)E8~ eoVd`{0|0-Ggb|G{P7lWb00004QA-&@6SQUqstDFEI12+C?9DTZ_~RwtT#FepvogG{ZbJShvVTv)TF z$qYe6qftC+#U&*~P)?_lAZdc8Ef8T*+eM9ySwwYriopX^P7!2HkVI5xWCK#G=E9(+ z8zw~LG_9y6-2@#*#8{c2a8frZ0pz(fPHt7g3E@0PfG~&vQBxt7N@JmyyxuhYrnHer z8m($&ZBV16Z8t@$zIGW9wLq0x6%LfOL5aIlipkBACaKNRKiH8zPFo{0ZUwNKr1&H$ zoC;J;iUoDM^}rOOd+P;}m!j(9x}fA8;9)i3!f28vEfj5`NgripXeUEC@<=N~k{eJj zOa-3R*jocjybx^vPbkkZK}m_Q&{0B!4FN(HLkVeKFHM5K^C8k19VZ7RtMNtP1Cud;+O=J(la(aThFiwvw;IZVkaNC~Qpp7;I zNcu0~-hio6P>Zq(C=Ed`-bzLhP=7+N#tl=5zgw9&`%C4f;IJL&({vw#i*zRgB5Yp@ z>{F*2KFmN6!_i7lsjqO7TaCwyjr7QTboKlsY6x1_xXnMr2VbgXYKD6YfD{&v!i2Kl)P5o1gnCR^DYGZ{*l+&pC%8inru75%UN}um(S#y z4EI!*Z!MTV`g8xswd;bJMVupY~+g@Z=A>)IyM#W7@v9X zE%za&{PMXHjX?}~4Hx3l`pHeBnK!C(J{dNgyfU-m3YsRm7Rj^tP$jbAkLiseIc9vce-r)UnMyEKS2YK6@v^2 zM$k`yTfY=}mWD_<3Sux1@AYcPP7@JzGevi_v`X6gv z_1}~|2*vL(al8hgM;Wqrutg;UzH|U`4YGHzMJ3*JfG+_NGyvJ}*b)#y18~JV(FWj( hcarh~F?iq&003M=tIY8v)+zu1002ovPDHLkV1g28Wt#v1 literal 2082 zcmcIlTTC2P7#<|u)Y{s57h82Qh*jI!Idj{c8QEgp1)*^fftK}>$k{n(*$KNdYfJ+bh?fUburbjJ#WTyYtp<=Zagv!i zGxMGA|Nrm*=A6N%#wRvyxMu@JQJWg-W6k8g#Xr{v$o2k93y|DywCkU7De9)%{IiUD zYxr)83cP2uCcH%aNlmx1L5Qp*4(78qK~q$9P2PrjC-&$h?l8;i2zvdXa0P#8_%x*s* zorpKlQOm)!91O8KF9~#54e}wN3erwm0DPDOVU8DBz-u6+i7H(@7!u7vDXlqHSByoT zB23!zY>ne`xm++O1}&$9<5gAVfWQd?OAxHvV|p;pnr`J1LkzpRW7wWynY7OclUA1( zVMwNnC1mXqt?3qJB7$*wXmflJ_$3v9NH5{+E+ZhKa14`>-FVI0wg|ha-#t1ik8L6KCgd$x_Sxy!bp^Pl-z?^M%6r#oBT7&6&(A055EW(gfgNA`L zDU5ho4vTCk#RFDRB%M`c6_XJH67e4pBz0+i%+kC3Ci?Ri{fsP~aFnFectu1h1*)tB zLrGQ?2pfc9$O0VFq7iqyS7DpL_E_g|Ux^MRgqx*fv zh$+4{meFZ#87l3Yo)v#bnxyDqUl=v#jTXT3%gg(UV$JaA(Ui^rYX`5 zNn%x~U=~YyNKjQ2hT&56D`bDwjn|odQCvL@%??afP>#9&de-LJRlD&&)x-H~=c3iP zf4i{o?V5F#w6pMvEZ+XGv}=%u(!PUDB9%jS73JG4If^RV-Voc}s*LG#3kx;n!pL-P z?#vinmJ;Xnb!QibUKaCJ>x6C3?H`2S4BT0Vet+ZV06hR^A2_&u;=X}9X24+o$?lh) zZyYXrrMhC_1z{Xt&<~>vSH{k?PyKpo=CAVd6Q_@H70*t504C*kYrISQhbE7WZszUz zwsx|H>GqCu$wXr02>gC*&s;#-n)!2cOW#kYs{&;=H`d(}*gNuNc;hD(`#v9jb)tXg zZ1<;=qwjoHG1N19K&Is6(UX9h&IPMrAQcQ8+Q8_fvg4m{j{or8qkGr;yLdxwW9*~H+YkH=`e3i! diff --git a/src/main/resources/assets/betterend/textures/block/ivis_vine_roots.png b/src/main/resources/assets/betterend/textures/block/ivis_vine_roots.png index 0859bb4f5557a6004d97ec4c4121f9a3907fe924..133a1387305478d5f6458f8ef4098f0c73b5ebc4 100644 GIT binary patch delta 37 rcmaFE|BHEoG6&;9PZ!6Kid&my+4eIE=<76VG5~?6tDnm{r-UW|?f?sk literal 2028 zcmbVNeQXnD7{57K#$>t$2@K=B972Y2y^mhM&K87r&>6ZFsB9`k-rc=zkF~vWcU!wT zmT5Hm2n2-*Y!W4Ws^Fp!5nKqUkfA_`qJK;hQNi&!zUEM(1K;bq%FIAw)9bx=_j`ZO z?|FXDJ#F$9&(6-8kcDAbc9GjP51n)LBQpd2KHhs9pwp0rYIr#eND&8drDH#VOQM4)HF;=H)Cq%< zyGDWYYl?kBO@&|+iRsgDdz?oEVWaGcab_#&T0}mS!vzZJ`(=Ni#fc=8ZNy`5{m=MfCIYT(gp~(3OJ- zYFd=1s8}p!h#3vC5}+8H%|_8I#j+$qkZN^A1938HU;6=9haHX4*QSq;i} zp-w#>5&)If<4MIBR!caX3ZZI+RVa;QL54-EzUnBX=0R1iR0LR9g=9|Dvx)Lf1p-Z0 ze6k!GG|D?D8FxB$W2|^VsT2|Am^$T-J0;O$`B#{S9=AXi@JKMs_gluf4yf~>)8>Ueb4cCPF(74xNv<%J9e%t zZ@g#xiT%gk0`FC~UvU0Da%c6WkKn|mmOUYEP4b^XPYSD)@#6LY(! zojd?b$1Q%un_1tpd1>W>y4QQPL%s#w^n^CBGG?uA%vhYzxcyiZLHSF`g6TB}o(Y_CVHuC6=l>Tl zi@z;<0*KU)uzhll{MjX3i45UIYo75@+E? z8^&-N??eZ*ryymOY8~^`$}z0v_V6LT11VX6FkP3JPFpo z7E2+xd%zt~yM?PCIJ*6d`p-Y2i(AyhN_lN`%UbxWb$@IK9VQwWJ_X?|RJlO0f6c8^ z+tJetMA{e3mB6G&=&*&=NCuKG$R1Io&j&nr(t!AFHNJv$Np!A|5?YXfvb}3AK;1b@ z2Ut($_@~@Kb$Bz;z#w?C2C*D#K>RKF+C&Sz*e4BCCL2^n3m0c6s%>r_4SAp<_|qha z3UQ{W3V*ft1uf6sF=Gg84aeEqEFzi07SBK~*I>(4@v+iCqS;|h9K|~1+A)&NF8hQq z=1_vaVJA`tGsZP6Se<-8)i*N*p7mxX&*HjsW!S}@6o|892}|Eh3OsqE;rsA-PJ^fO zOL+0#gjdFOz8@5nD;IT`(is`^@bz0fP|e=?fGY~zztS`sn!@<%Qcja1vG2Q+9eO#! YKSvvOEbdV>!~g&Q07*qoM6N<$g2t*!iU0rr delta 730 zcmV<00ww**1@Z-uB!9U{L_t(IjZKryZsbG&gga~?Yk3|iASHH-I5&H_9)_~`9D z-L!K5;RmGohB%IScR2C-_L~2z>pJSHVrUz>y2d(>*q<(}z{{I!rWKyrfmKT0ynclb z@YoFa0G(gZd4JBfEXnd5V+?gSpp=v}y(QlU@;oDo6WkmyiJ&M7;zSbxX(s9Wo+Uul zjr7*?Nm-y?lm+{T2kg9Xs9LtWYsPUz2!RlSG|TDRh7ba*E6$EA-f=mdkwTzE6!F=o zA5-qGNsB8)qS3~%EefV-VqR9H6eMwscaEWLczQfi7k}CFjQi7tei%s$PYReMA&z6J zx}hCM!U}5$Y&RLFrwcI)htq{+v{Y@6%2G|N6y8rbKhd3Qv@u92h@~P@5lTt`wnfI_ z@JJFXtc9}3QAL*V^Dnm`s$A3-&feKWs|4RBpN00)>56% zyxSkq+E8BQ3|-6dT$7rFO`4KKf$DswYdeOvMMM$GI#1m+jDBJ_&1{MdzHj;c^hlm+ zj85>K<5*QRU59rLH}rTr{)h7Ad_jns{a+6VDN`|dP8`SB@!2Gm!r74|(TrWkJWqsm zA%yT8@Wt2P@b9Jfrwd9-UX%qQirAknWT~deGMx7qonV~@z)utZ0Ap!*m#F;+X#fBK M07*qoM6N<$f*zP&>;M1& diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_side.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_side.png index 8630bf296bac98bab061e1c5c9f64a1d0d99ce40..5d75f93027b6c9312147c43f35baca199245748e 100644 GIT binary patch delta 617 zcmV-v0+#*I1%d^TB!5XsL_t(|+NG0SPZLoPhWCef<&`F0cwwSQ5TcaEsFeb0yM>ar zc1!8@V+-we`-Sa>enPR8mO>Q-L`)$5#n+jm+mMZ3c`?~DGiT44nfE!8+8M$b(a^ZK zLhj%M`rsJzS^*!9zrh%uK;0d{mC#W;ze2RVFZQ@MipbKpFn>CO6f$=(vm8dQdw@u_ z34g)Fv>e2m*+Qbx!AiaYM=*xX&L_&ZMEqrJ1BLzwTBi?5*0=D;?M0+ig@4n4CzZiN z*Bkh>tngncaXj^f5HiYeMG{zyX|&%1rEJoH4M>jZN!-787ySL3an3UPUS3OgZr{R9 zvo_n~|1wFb)PFItAd40}$&4uZ!HWgFr;?Y{G<<0t6I3$$oM(IHSD=~=#Ou3|GTkAb zM^a*l$!3R!SjAjOMRu<*1{Nio4Md@}yI3|VP%2G0!*S@nA=Gvcl6m@rWHLy$3zR>f zA@%VP-eQepy&lWPKId7|bZ>-rc@wS6pI`(ed`#lRcI?;RZp?yGjjAp=tFyTG9$lSB`Q_K&+Lsp> zeD~}rQ7mcOmW!8{JpN)vS=A(I&h^z5Prm+&o7**xZE^9}C4Xn1JwO*4B2Oh{Dv7pR z!hK9$R)p&nx1NKc3-)nBE+v6~%OTH+ij2C*(GLw-k|A=LP^6M@>yzg>Rnt(&ge2Ia zX&O;1c~cgIzKN_wTiL z7tCHCfFesicz^JHiDy6l%!}V&@aTNXK2AvUg4JTdw~rnYC6bPz^Xl&_&ZnOvv;5!W zaL?@QK8ny0jyuF1PZ%DJF>RYLmXvQ=yvZ@5XQKdC7}NJg6h!n)lQ1i=9GA4L5Chjm z?{qQy0}RVT=~&c?z?&SCG`Bdm#kg#6Mn}}Dj-l(gWq-wJJRx0eP_v>01-fPjMNu#e z9p&wRj%{Ifbc!rPQ&kid+O|bi1pvn*7qQv+DD8pJ_le>JO;gw`ZusNSFdW!Kbwd&b zBw;`!Q)E@MT`k#+2B^A@P!Bcx-Ima?Sgw7B1DiaF>70z&ZPpZJMH&XouU;dBAeI?v z6ymSf9Dh`S^7!HGU5)Rv@L%V5S-8ss@IP?yFtJZ*oj5 zQ-+3M>F+4fusSB<aZ!E% diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_top.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_top.png index 24553cf7cdfb3f007b4e66c29c99aa693979e0ac..e6a78b794d9f04d4e6281f3a27cc84e709bf5028 100644 GIT binary patch delta 631 zcmV--0*L+51&{@hB!5>)L_t(|+Kp3dPa07Wpk#W881;2|Fl@`Tt|=H0|WNVc6@gFuycF{y-UJzC=N?ZhJPh0!x~HR-WZ6$=nFz` zbKt%HfPr-MpdaRN0xsne?t+SNy@i0O7@E+ zSEY$`Z-i`rjO4c=JXdXgM_N6kz7G*?v^mz`l{PIRB znXge@yzoBLe}6z)fJo{!jQ%j|rIQD9?vctSrf~PiUq!44KxHuDSki~$bfoOQGXPhi zf<*gPfZRhCOqbKub~0tLC|DUSn1uBBUqa}r$^92Zusob0*`IN# z1VpVRx&v4RfGHS%)4(KDJ&h!xC8Bi(-s| z*;#HPbTdF{w&L*->xHO9eSF!Dkw#8ts%avUg~=Rb5(=O`Wudme(dBB0mDG2Zzrt5( zzz~u-hj5)p70^AsyFz~}qzn~ja zW8DMp>4#O4F~<$a*44MJ&}w&ONVEOF=2S^7i8W8WjCWb=U(0!<4s z1cX#v=LM;iLVqbm+qI~w;`Heg-#wqOwj&p~Obcl*>vTF?~CBEs)moF$O2_Z4BD@sbP^T+aU=aJ0^F5^Uunci8n>pF}vsH)Uyu1%|t-*C2J_H(5 fv-to(h>`yQt!!(a)-L(d00000NkvXXu0mjfpeRpD diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_top_open.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_top_open.png index 8cd5e61a6a50c90f50c7839b2cb3dd719615228e..33d8361c403ea42317e4990e24e91db720af7e63 100644 GIT binary patch delta 556 zcmV+{0@MBX1jPi9B!3J^L_t(|+ND$5ZqrZ@^lu>1iV}ij=jKa%ZQ?jr$4$}{z62zm z`UDbc`2Y|vEvQIQsf6e!4m)d1d4`9R%{e|ZyE{9_czbh)58v-~@&D^jU-5qb1DCfy zb^q$)7mepvdtAs_eYgH@@aM2;;>hZt*>iBv>Y&m0(DDP=L4O2$5TPxRd($1jbUZZL zT|90ymB`=^4=g`KKN+HboWakhaI+lFFh@7d(3W#MuD*4mREZ8v>w$o*1QXOBO%N|j zBt?mEzJfEJX&g+Kh!zs_ncgKvTVRixUD$)^0(LrvKU*O!x5zeU7;SdQwr9GJixb2` z;z=UY^;Iw9&41?`?U7|OlP@bfeSv)U5Iwq3JLF0ABt^IS&HV2a{Z{8 zWD!)85J=KQ&Y6UIJQEBjp&C$OvXX%15=cs+rY=lAV}81domyICyR;D~TwOJ}8OQ#~M^;PrDAD*j>F#jQW5C ue?MuCh9&N-pDy>D6veLZ)tGnR?(hpY9`RW=Z~~hE00008MUU+yRn<*PE%;47fDICx*~|y9XUU(v z#giTgx+|5$&Mb%skYrS-wP>xPN| zFz4iGododp^Cv82Qcl!1C`%zHLsemd2zUfDCd^>;&QU8L|9|Gp!GX2g#JB6a>iG81A?Sdu_CKu98%QoD4HP zq5Prm9_+`#oG>RWC7(?)5g?gyw2r>KzMW72_u#QtVouDIoHBEsJluoJwqjz>LYe>vozLKJY#m z+F5c&RA{x*#$W&WwO? zM*mCYT32_5JL|fTa$$_l{&cdP=j~(C_EYO{$H!pw#+(!R^6mQs`2VF}Uf)P&yuaU2 s5nf*3xNHlz%Y~yg)}>I7Gpz{x2QkA^t1!{0%K!iX07*qoM6N<$f`gGHKL7v# diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_bookshelf.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_bookshelf.png index 20b2daccee582f016277f878f5d60e0183d9e2a1..8a368a4bc45e151d7125a7a7f96cc7d7b018030f 100644 GIT binary patch delta 515 zcmV+e0{s2c1)KzsBYy$oNklx!iU`v- zQ7zgOQAA&wM4Gio3QdSML0K)bf|S78^xvj?rskp6Vtg}mXU?5F=ct_(ij=&6CVX?H z&p%e1zbt-K`5FouT|Ly`^0GDghDrAY*he1L;vJx7ub=81Zh!JDWXL%a=W|@F;RgjB z{!zA^uCui(-|in%HbI4(dP*OeRc?$tD~}AIdxt2IFZ@h^hN!!a?W?VgW1DKU4NlTt zMyGPQOzCu*^9Dd>ou9`5XsQK3p;e6!0GZ%l06akeRvae7M9NdEDUS})cE&#{_pmBYccCPcJEuUs-Y9mVX@l!U$q5ULn7gj9f(d_-d6rizZT!FC1UIzN=h`&egY43t7c~_N}b!R|nu2RGJ;#Z16FD zWYxlSS-SdI1JDO*O`XtBDfR{Ko6pc#nc6b_7W7@O>jKD8T(U%-f!+p9fIlo(a8V+002ovPDHLk FV1fud=r;fW delta 700 zcmV;t0z>_r1k(kOBYy&#Nkl$3MsTri=hEE^PWj_U8KfV&+4A< zI}h&pKJCi=M=FXFq>;sxl7AzNqB*!y3Qf~mZyn&q^=l}aV1JvLLqm~-J{k%DDJ2RG z&-3WnbcEQgGCJ~)veH5+ zg^)&;Go{b;d4u$MgY>qw0ni|W(scUvzr|Vd5bX1uE)MkZeY9{KQFwDJ2iazHz4X z89V3Dz3mhWm+YcznT~1coGX2zqkSIve4c$f-m`o25Sdt5Ckk<@rK^X zcCMDcQl8=Nt=&T*E#QU`;>WMr9PMZ84Dd3UM=?$3nC;Nl$6OqHjV?sFgc^z#dz}WVQgK7L{_HFsPH3CRje+!!^%tzv+W8@B#2$x7p-47*aNK1$wrP i!1J(jxj8kaW%C>Cmm+_k4HP>70000?EkQ7FKJm^xn&yv+TW}T5CNT%id@YOkhzYWQ_3wnWi8s zM50165DO-#s5Ui{K@>z7yx<`UieQN71o_!0@XR2h-!^dFLRXeo=k(b^WbHOMKWt4gdfE delta 356 zcmV-q0h|8%0geNZBnkm@Qb$4nuFf3kks%X*32;bRa{vGi!TN7Mr_emly0=3EAV}yC zV|6QpAh@=IUvJ@Gza-wh1rId_lCXUoha^cN%d%)d7=dpC1rT)Yx~@|PAX{tk-~d~l zcXf!mdg1N@V28#$b1LAy57l59_G2+m5csstJo-X{{esLx0B13ob3kEli6o;s0@bH! z`XK{!{qrxdM*>8msw#c*PetMI9gt`Vz@6a7iO3V_Fd20DaBY$R0000ehTD|Z6nL^URIN%tfyyc3J}=@K#Kyy@WT?Ao!35Q2bNNI(U!1C%97TI+IigFPP#iY%uKt} z*4P%M!K6u7$}50LV=!VwLGT9+rc@znR0!1=Arg5=LLi|KP^2li-r4SM01Fc0CbM(r z&UeoFzH`pKcivgK;>E&AGbSMjQdm_PsD}4q`^wLQ|Fdr-d3c+sRlaN>NYPRI%Go@> z=otjb>ybmXW^HgeC#o?AFR21>STPNv5oA%hrSW0|Fi`Qz%U z>eUCh&c41U08DK#n2j+emsl(t!Z4RMK^f_UjEOcv%^D!8fuT0)B3Rl4Y0kCPXq;aM zys7FTRgGo}wK78)_51C@uxMG0tVn9yn0J>A2=FHGVKhmTI7Q>MGepyz)5B5j`6R=U z>7zT`TqnNZ{vpwowxdlY7< zVKdI_pdtdZ^(Y-hJcz%+H$9v^Pf;T4W(C|ux>(#PIT@U1!eLx=xxG99UN=p$8TI$E zAMHSvbGb4d_?Ya|$rbB)B?91{Nnnq!=h6Cc%xe65Mg6aO2z$32Z8hTlE=;|(PoWC$P|Mr_Vdd|(6 zntNpDD{BjWSiYcO=d-5^&a}M&ZjD@>;y>^mmY3iXGq$x{+a3BC9p`?(6fY?JYvaK7=Du5{i`z!>-MfB{&huXytn2)US~#%%z*dXg*}6YhXx}rz zQ_Fmt_~yBO`tvo*-fHL^oLznxB%Z7htn1fjokWUTe>x?1b)m$y9h1I%_1cxcYdSBl z8Z2=jnR#ULz7x}@ZWOFPhf3Ms`14B$^1SnG?Qk-=uPl1zy$Ri| ziJn8B{Ic#&_fT|C$A+PCb(^Sl1xQX}4qMpX*DFmtdefc!K#NQT1IPN4$#;8*6HN!( u%2)sTep&yP>MnU8nM{_JV*A$P_=YL;M3>p*8Kx(q2xpW diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_ceiling_stem.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_ceiling_stem.png index 59f766339714caab8bc94927b270d1292e293c08..6cbf057b35587cdaca2816ada60240654ca7b4f8 100644 GIT binary patch delta 160 zcmV;R0AK%w47>r5B!7cRL_t(|+O3j74uCKS1o?uA2fyT9U*N$n`1@6wk`O{$P!Am1 zbccm40U)pD{lK(tSk4QrH(b;K6v!t4i`m6nKz7zOXtAiJ2tNB#D3nrAX#IE)eCVs#R8B<-w}ON(OO6O1RK;{U>S4~ywZw|v5vr17VN5s|Kbx=)fG-?pmDeAzgL z2(x3@WHlP=*sefJ(!qSk#bkwYxkek7lT)_7xUI;RnNyaM1~l9vZCd4Zj~-v2uafl@ zk~Nk5Yx2Pk5(GBoSnk*@$48x<(&t5D9UKEi?nC%WPMHk^%FD)rTx1@Vld+Uaw1h6F zvoS3NvwGrHS%+F0z%SIy{smb~&ZVxr+d3x7)FHJjT2R z(6ZSqfI851RUlNq>u}sr9e;YnP@+EZESFo%kpo6tV{1I82u%kj*ltMc_(L}dhk*`u zffj>-NqwM6LY%wiwfe$M0%(ic)ZxCsY9Us5$uL6r18HqLMEiX1l+b8s+XK;lwd+!_ zNPV{E5juBDNSq!i<~A8;ev|!!9pQCojf;vN#hiIn##*C5EsR*?VlfCzM&7?gsL&iGLfE1Y9^^C)HESURm&tYDuz^3^-P*jsAp5j zOnUUb#K>9@#L;{6f4+a+vqTZ$)}!-;K|)2=VxGZF;pKRc!u?c2Wy=@w>JE$II9(mC zT9(|;9)wAd;5mf^k)@_GJhmR$GXvUolM2#*3HJczvpR2MkIpuP7au00fY2WV)i^K( z{N2j_-Crtq1Q+cfScZK_Y{E`P9nro#(Wh4B&yR>6cdJsGt!BO_fAo6!v6MXd@o&AY zPcBaU>b*R1w{at`|12GwxD}a>@6L}+ZQPZjd#B!b@3V{dF4@u#?9dWa-X8zvslv_M zKi!<1+nfO#kL`(``?Aox{CpJl&L+-I{JwoJX+<|`krUg$yy@?|uxsp6)Xb0lxH;2} zn9qGTzEFJsX!*luKkA*na{8G&g-zw;;!6jnzIrS2!QpqV)xO?q!>v2t-hZ*d0W4g; j|L%;jIdeX8eNuGuD>ur!SFa!H1&z8gH($C|ICQWvW4#yH-g@u)4JKpAb8rg_ zegHr7he2Z5ej{!EZbN>}b$R)b$FzRN>%AV9K4ba(egGs|20~R#23b@YsODr)Y3Xv! z36yt&1!;ExWE75`7?G87^^p*|Yr%n1r*JQJ09Hh&I;V0A&^`%N`|ZYPr$B&iwCxz( zSpNdBh5FMl$G8=d0Bq|bA{U2CKkKxR-R^sMX$`=yv z5e_BMG_)!rr`Vo&#Vczb^Kne7y#B{y(01nseMypwx0C9iwW?yqf)DPK)i9D+b-Ru`bSk*7+OU XO{s~vu09L^015yANkvXXu0mjfq|JtE diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_composter_side.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_composter_side.png index 46ed0857b5d3091d6addf4033155761d338c6a14..3ee7f1fb7779c1c90f666e123e1d9275b49d4847 100644 GIT binary patch delta 214 zcmV;{04e{^0`UQmBYyz6Nkl}y@s=M3wedyg9H#--R+I$7^R%r;5q>5!{)e7C>iYk5EhUr!UYp*e|y8S>2m_Zj>H zSyrbv-%%eSXMiiAKlX|}+6oWplXv9fXTUdrcQ7q~$bi@9cVSQ8+`*_Bbd4`zDQ!pv Q9smFU07*qoM6N<$f&~<0k^lez delta 309 zcmV-50m}aI0nY-EBYy!FNkl>1CJU%^-T|Y3plKATS0U+Qp>-qut_VEcov(qf* z$_>Y7%YcB(c-SAZ+%kXJGPx`YGNsr8t^R?TQmpl~WEl|fOn)h4w{L0cDtzkkoFoZp zrZ}{krmjem1Y^vU$-YJ2J>)FrirbrOcd;pJfPk%D-_Opu3}Q7q9pquXZ^}BzMy^*c zC(D;e3L*HaN(X$OvFBK`G)3O$xqFiD&)24`-JNd%jy;I~`dnfBMZXJjSrnHW_jHnh zmF)n)q16~;5H147ahmy42DTHw&A1F;DvMpPihE%7FByCTuFA2bZOzON00000NkvXX Hu0mjf>&%xB diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_composter_top.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_composter_top.png index 0c5247009cb2f18eb4c4af4f70a05a0fad86f906..4a41b359b82ccf081c9686f19d044d05c84278c2 100644 GIT binary patch delta 144 zcmV;B0B`^L0jvR#B!6>BL_t(|+GFTkvHm{@H!oiOAI669(Z#T-WdL#VCe8Vu)IJG} zL2PtBjEyc2HULC`IBQOxXCMWm7yvSnR0BYIK&~HH1K@#3Q5e8tfucYp*9Gt}px6M4 y0+A}QFgOAcJ>$SK4Zh3;cLA~48OBEz2LKtOb#?pJRZ0K=00{s|MNUMnLSTY91USq9 delta 222 zcmV<403rXZ0r~-uB!9t4L_t(IjjfZt4uUWgMh~RzAS4dV3`{(Qi=%Jmo4C0#vhX+# z#snDJCOD8b1&xuPGqv~Ler>+n8(nYr0YDpzk^+Y|7GM$!b1p8lu{@qH+O7v6O%4E) zy<5-oWsxJ46trE><$Q`huKGb$Hv>Q%sxBc-4rpUXfh}wjP*+kAYhx!S{fj%Z+5<=I zy0C`*OkCSWCB+UeaDRR&z6)DT^rKeQ%@7XG+?Q{|rKA`I$|4U&H1q1NXe9GB+8llS Y4S}Nj11`dB{Ik7k`%mHR7TK( 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 KMNUMnLSTXy$=`VZ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_ladder.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_ladder.png index b9cd21cb2228d7f854e6a24e0cd970821f0c594e..279a6f0171eae9e927fe740e63ce8aa320a5e37c 100644 GIT binary patch delta 494 zcmVa43`O&IY!G|?0DF{{P1#HAz4sftl(PS; z4^>T$k<&sX%ZU@;4dS-emPI8T{J)ix9_{@4kGg*?RpUB>^CMa3!4^M}N}2bt3)ym(sU;F70av z(z|n}v98VIu;v`rvwfNa@SCo%tzQaSBT^X|bN-<7NzQ{gf7nI#F1W;bFjv|&D8(Hy zDeE2z`Oe?yS|*m@4?hJUk$A`Yp@R7vb=^2NFExWxs#O^9TDg6e?dK2WXB^RD!kK5|F%PC1_Ycw$j|R51F0vQbL7({sY`dw)&fh@CV2=@cobj zfD_y>xTC>d>RY{OK>g_tv@i<**6VPFqxC&J?Vr#S^a0w~nE*h!N;(JNrS+wRJm3BU k`*^7GU(l+ecSLi4082~>t`j*M_5c6?07*qoM6N<$g4~1jkN^Mx delta 589 zcmV-T0xcy`@v(KrU_M*S5F=y08d}P(VR0WC7PxorG$v!y?+NFgh1Q20H`V<1Vn^8 zH*ZJ-@cG+M#&N_LgL95j3ez;M5n~M2TGmdVuJ;-FMtuo?9DMoy3xLDJ!|I@vLf`k~oGVGwH1%yJ zZ2*R0kbi62+1k-rTHhQdLBR5CX;+mLEU>kW?so|~)G z7qf%CFGgQ$wv-YfgcAbC@nH)XN)nZYF(-rBOl(qQ)3L? bdja?jA9+j_({7?<00000NkvXXu0mjfa>NqE diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_log_side.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_log_side.png index 7266a40e1bccd0cc93685a7f09524a05363d3018..13c21ebb58bc6c2eb7c26c56db6e5dacd15ffaa2 100644 GIT binary patch delta 235 zcmV!9P;l}!9PZ#E$OQ)%K@c2VoVq#t z_@4H_Np7wPZD`Vb`L|(z#Iroz*4Nke`Np#wKb!jq3#8Pc)WzWfX?Ovw&JO^P@}Pw( zWCI`=f8#?Qw1A|lBqnc2mJtEv6l2jFdJmxB*qB9cWc&e?s$?V%sHfCJ%s^ucgzN$| zTnCVd;p0qtZ$@z-MH1j6n%8B0XR0TLm=2;;2htUAIn4%Uz^BxoK-xO(|9~`2_BjFR l$l_tj7$<3LB{4mqs=kZ4xlCa16fyt+002ovPDHLkV1l(&YkU9z literal 1866 zcmbVNe{9rb819BBj?4@}og->3QHQSAA9uadN;k*d$xgjFwp%tsH0#>$?wZ~8>)LL2 zTXaEi5DkN&80Ub?kVFF*3>yC$FlCuW%~*5>#XwB_N5JT!W)edTe!bl_iUSv#wEf!e zd7t;k^Y-n_4fX3wODak*3@Z)S1sl=5%sH17qwCXbf9hlQCqa1K4;wh-$ zfF{5>kDpW+AB*#Xhw;+_>#M?9n&By$rx-6uGa~I5y#k&;2;|LFV`5|Q@w_keBoPVQ zHbja_r_-La*8|Ns#R!5x(JaNXBtno@k8aBuQnywW7=pl3OwF)0sN)W!+zz{Ji9nIg zrI0dQTHVT*2^EaW$OgrDXeXr{P*q%<(Pbuc&Q*m1Nst1%Z6PeXzOcsP{ zD6rsxfFsNrys|~pRhYI`JC5=;ASl~FB3PQGNroj^Cd&AbYNC&Rg!YOwJqL}TR#0VI zz6#7mSw>|2BFp^?3{@@G^S@A45o6Fy$*53TN{$1{(BnC8k%$=9EnC(V5DrQN3e}@& zswk+ekCQo`^zxjSWW7F~l-pxG30PhbIKN-^^1gz75Gq}chy{BU*>fNU6hAMM+?rU7 zMC~e&g1?<6V+u#}e%=fGG1vZSQ$rt-oV;-!S0ph2lhBMn6;;{mv~aGK#5&DFdiCT# ziYCyRUnMm>*FB=FI1MflilZ!0iTrDAp2{pNvpL#y0wB`s$UO(MV9ZX-Ca8_0DlVj> zsB6V<$=%nFeqp-K8~uO#?*^mK7gtHhdK{pcNfAyylrvrCq@k`>Ew}fNNmPKN@#ZYu zxr!d#$qaNvZKApRkY{`r!-~jour^vb)zvuKI8K-Crrwu|Z`trtb*SQrzD-vst$cXJ z*Wm|0eywcheRqHGo4D;Gqknz%&*)hFSvEVs{Lv@R9NRb5c}jVrqtwQc?zM>2L= diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_log_top.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_log_top.png index 0137949fb6d9bffed85196c3b4a7820746e0d864..5f4664301ce8231af7a64855cc1abefd7e30cc8d 100644 GIT binary patch delta 345 zcmV-f0jB=X6Y~O)BYy!pNklCv&_)SD2u}a|75dRPZdZf{) zg@~Z2jaGt4ht6$!f zhGD3xCwFjVY<#SD=CJ%R7o8S#rA`^kX-l&wDLinX0&R{rFt-U zuD45CXh*SmgHq*7yRS*-8hE^BXm-gjmCN7KKp|ETS;sB;TPv9F9}64&it2ik2y*r}Tjp_vrPmcdQ*_ooqW0BqHvFtoN?{)hSfRIwBy-a}FT{Pp zCzmx~7-0^>qS2@=YPV?-KSr=Di{T_jk|?x5^%~XSt5H=Sn?UdYU5qGUL(x>kMC1jn z(r{TJ(>@8Ia1vJ4<6(jU!>ai(M%ZvuQp`{ilXl_CNHFGH5-|`2A)p#Mv?Y?Z;ecjn zdO*7ebn^8r4q#}#-lUJaatVc!E_9=y3d)EFo^z*o# z!|^^-uO=ySO+QnDL`jE_Bsd4n5%?{puxcdU;Q!ND5;<9mgm|b~3Gse_g;l>5Nk)>( z*MeFEI)?1*F&17gSET9&uZp0^tK1;(HClYAW zA_{CZKG+}CWF4BRKL|RPJIHg`$qygfcY;}%*fQlHOv4N zNi|5UeK=k;w*{9~H2VQa*7&q?m%4eN48_++0|0{Fr%C#}>zZst`3T7K!y0>#KE&?D zU+1gt&z@vh3J5UJb{wZr!9h7tfsk=j5(So)85!`joKWA7z1g>fkDxe;;s_?uw-3oa z9vm^it9}4a8qE6edLFEc`-tAA=gxiTf7KJK(Y{i{Zm+`FyME^pOlNEg9&+X|dAh=f z z?R~<%^8Irs2c@T`k4pEXo^5EIv-9OHS{d>8rNv{u$dJjN&I_G$uMC@TGW(B9D;itR z)ooqVb9nc`&D)J$HPhSX8$V*@{__jlO0FzyTt&RM<9zYnf!|e(U$|&f@!>POv%Yob zxG#T6H(WS%^x}qJ*B(EZI+Kb1&=%dY^=z&?Wq{G#-qx~jTW-g`SzT9OpIdhTZ>}4? zq`9A9P7cW@wTIoCK z*BpgEJE_whOLOwptX#JG z(6M1h)a(V7UiXv1rvhVY^3Gjz`+LTn+E%gd>5BHAZl!ro=-3XbIAg-bsad~Y?{1&4 Xe&i@=TB*bQ%T-iR?AbMG-jaU-d)8eC diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_planks.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_planks.png index db04c4706fb5c7c955084e689cc2bb39809d60a5..6f3e85dbf4d67a5f76972f274b94ce6ad1e933c3 100644 GIT binary patch delta 225 zcmV<703QGP4E+I+B!9$7L_t(|+HF!X3Iah8%m3`H{eWO6SXn4oDp()b-BsH8J#*xU zAqsPIvzgu5WM*+0pU1~Ue|x>t{vw<675wQ8jqBZg(D}p_GetwC<&~4=nfV5O>%)o0 zK=Eq3rwLSGgdXC`N=Y}DCPt9)my#fPi%G)T0~2*6sW07@gj!^r8WPVG+;11F_NSQn z26r<#WKZp-4b_Kgf8xsx=2~+w=z++fuBQ@Js+o8LeqT#+$oC?H)A^7*hZ44ENR}33 bJvEsRLUpS*3Z&~v00000NkvXXu0mjff>>-E literal 1658 zcmbVNZA=?w96xXi1%ooT7^5S(9bYi+dM|zB9=Wm7!sudI!>ZsH=k@Msd!zTl-F0oz z7{v@E@BwweFgmvnDha-9854+Zvdn0r3G>tD2eZXQH;EXhb5kO|JXhL=nfbQMUGKTO z-}C$bfB&}*M%s5&SKV8MVOVvjE!ctXHTLBwN53P_C%x!askc39V%Y5)?W+uX>E(Mc zY~58k+GTZx9|EGLI0Z?IL1$Lc5gNl9o3gqfc0&t~!Gx^x#P{!gK;W{(6P=zg9o7Rd zDYx|+aCdKeRP5~*If-c6hBsybB2b_u;8`W5njp&)d0v3l_G^m3^AM|>C;YZSyek~R z1DXMGkJC$vjGM)MoRjg=9P8eSvozzQXdlJ6NSXn(7q~dQa1h9vA;m#Qu(ePbP6k=N1;tAyG zssu$Z(W+)4OekPfR?sQNN!yb0KuIj&^t6%68<#{1rl0~<%S2eFgw>OprI|_XZ>US3 zZ!myD8xEIj+|(CEDVZ>>mVHP@As{zJo6(#OsSaprX+wl9`;eP;wi+D-3@BKd5!JL* zF;S7C%XlDQC#C_f@03+Z%b54C*#m=u1$ly{S(>DMB+Et_4?w5e^8oDvG`$K9Ymyw# zt${Ku$$FwJ16U4tZiJ$$kpxTlSFj|4xMnB<(kv@N0#dq~An;NoK|o7s1~QDibLG7V zhe1d+EkPAwD995?wo{fRK)ZZCmhr?$){O*k9ydoexEkCfgtX|Q<8c?qvBmvCO-$R# zE$)~8=l)%WjG9YG-7=5ea&}dKHrYh^$`zVoH|!~_QZk+|1R#iZf%AlDXBJ9C;kA6r z5m=?oBq1XGhjg#POf7C@1OxgLC|dueqA27)Wq0GM6zZ=k^WWBVZV`^gfxRrvA@oq1 zWKc!p%RqCgX=h&#hLw?_pg&rFR_Qplx7=TozR&EPdvN`bquC+T*buD#fanqTlrGsx}h<)?i2jV$kW%vWA86cUz_5~!81p`dw6R3&cQYed+Nl6k>PpA@o(D? zISzc2E4!YVIX^bjHTUbshiabfZ}{xsOy~NFp%W7yj+*@y2j6^Azk3oJx$9)byBB7E z_;l)(fV|?q#1I$#n|Ffx(CC4mYUy-zsB&gIh-`do?EH~wvUzyV(y2|gk@@bB|I5jM l{7zNvw0CUym*jYI$5+Pn)AiN$WA?v8sHHvlcJt$Xe*z<1Firpf diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_stripped_log_side.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_stripped_log_side.png index 6c0465b65b2448e9a5463a284c0c873ee955c63b..5b2b228f790f5c1387209a342cb43e0a9c5d93e6 100644 GIT binary patch delta 458 zcmV;*0X6>B5#s}pBYy#^Nklnk~>qV7WV?vuWjSwy0T| zTa+eAMA852nYl8F_2tZP@B6%GyV621=?KbRwXj>PE1jX*8P+CWiPpfcm*o2=z5jak z{vE&VFGrN+sInAJNsGrPjw5*^TLmE6z}8tUT<;hbfDwQzs(+fmQYhtB@&dqB02l)t zU$>KY0|7)EU1vD$im8%MEuh{nH;Dj|Mt2t2JiW*a#+A2EtviAtkHpbV;fCnbic~oV z5HVJ}!;8rmfLF;$vuaN=^B3S;?~MRR;#Kn!rCX=!s+^_7*&c#d4_1bh4Frtx6hI0< ziT0F83qXuDdw({tu9r-Jk4MhHgl-^pI*l<0R~n(lMI`Hi6!VS-E4{Gy?$k>BkoUDh6hiVgpsn!rWTK z1k5Q305#Q966%$tLH95M5W}HE`sDC`fM-JuHb5n;j6*H0rE?PM!)gnu-2jX`t`Tj3 zL`DWc-Cir$hx|s6i371;dXBQIQNqToC4WU00C|B*Z4y`|j@f zp7(j*_xZlNHFFE{N2H{uXf&D;cAK>jokyuh(lGSDeuIZar)0lvK~ST)?*a8l&@?or zX*7vVQn6EUI%e~N?9~BLc0pal>qlsfCNn$Y2SO!Ov@Td7`OMg*_6|%diDsNH9!2r<1Q8C0bzxd32Pz0X$8iKn5fp_Z1RkvQDIkLTf)fTAtS~49B)=lbKCQ|K zTyl+K#*os16uka8tuGiW6Dk-H0e(WSBh{3mKv9U}{5659XmC*=U={R2pAtk^eH@Fb z(j&4E^+Kr=>>6p8C8oYEKT8PqkN zAs;1ao+JmL4rB!pDBu>bp_oD#nm5q@0?VT0uKiD_DDZAM;035qk{47!!tbkyMsqlL zyDz8!p8)MvGlrz3xhWhNpbKXi2I7EYOt_JB14d8MCIf_n^R2Q_qc%~U zKj3Fk77$0gbVxF5GBFIm86Z+P6c`Q%CO5=6m&*uI6cR#ekZn#tLQ4u%-OQ@05)q>T zx}m@t0d6q4-8fnV9L}*W5_by*(#RTV$hsL!`%hepTqOq_vWRLsmi?>NZ)VhvpB!g0fo)g8~*FzCj6 zR3D=kJiu20(GE&r_nyz)x%PJX+_Jj<*L(T;wp5D|ck!tGk%@+&m zCcgV^xpV)=$saL9-N7q=rMGUCX7lT^(v!!(@OJy!w#LTtwv!j%iJY-XYx-Q@v$%y_ zf4;W#xPA01**Q~}_n$u7^vv**7xBdRpLm&BXFC2x_FJiC&Es-sXxc652lizZw$$&> z+{${_ws{+bRh5nA*C$^uoxWF^zta-x(bXS5JACihj(si6mp|{jytvF!`cNr$!4yi% z8`D-HfI~Y@tgdc!pL8Z1O50mjyM^BEDS7F7YAC<3WFdHMmHnq{PdBHyOy^H%HZ96u znRVna$k{lC25BFnxynDp4Qu%*?sld-;XUReekmzqZV!jmf52Z*uRrEZ_Dd# zBJ)C7)#FBP7&*BW+5<;3x)R$9_~W)&X?>5><-B?SfziXdNauq3{Y+C@QGWm7b2E>% zJUQ~(k>`H_2XnWytuBA#T;H#~D?Z8Dw6k-M?7J~7iM!x@FVWhesr=(qbBa^XF&MaT~H$m(VWB>pF diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_stripped_log_top.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_stripped_log_top.png index afc7daa60ed2d0abefed58a968ab9ba46694c4fa..71c8f8c61ff8fdcf21cd5ecfbfa65ff623eec016 100644 GIT binary patch delta 347 zcmV-h0i^z_6!ij-BYy!rNklc2X`@ZXXebAGh?+@eAw)tro)TTQ&Miyax?w-=@qL+KJL%g z`EvXC`P-c>qjnN?l7r@rk$PK{gY}j-dH?3Q%_r}qn<;O@NSg}fuV~<*{ictvvx@wc6AbT<)3$mqKOa1B tf~=i0K{Qs$a**4PfFYp`5ulG+@gJAUq7v^+8;Sq`002ovPDHLkV1ml6rpEvP literal 2602 zcmb_eeQXp(6u+Wk#h@i17%OBw(Ska+v%9mqw+jcYJ+MWuU^!z&l+NzXwg-2&*WK+G zh$f&Yh|yL7D@6*VC>TfxiXQ}s5Xv7$f*QpVO%VAMKN1uXG~(=iSrw2NFSoa|vu}Ry z_kQoanOiue>YjlEZW`e8`36>2gsbVj$h!*r(cc%^>Lq%+CROo}$9}7sEqNW}(b-0)U(fB~?(E?8i^N*@mfBhbLxz z(Wj8V-gQ$d%QiPR2bzU|W!JHsq9`onS)K>f0ywQn7q@_grQDd6WIRNy zS&eSUPnl*yNTl+xNhd246^w1cDV7UBFQl}gq37*Vjdnck+|XGPCkc{t9cs(vZBzA@ zYdQ7SMWFMq|Kfm38;Rt7T#!p5k$2&^6PjokSwSvn?L=Esgsmoy)oANvLKCHVs~1g5 zEw>4FEjwyi@m!*&MaUudDfuhcd9A^+C zw?1s?jb3uS^_e<1ES+Nf=@mj<)Od^m#1fSQA`>XYq>u&&O{5DZlH?rPWIIM%4afVU zdaMkJsA(oADv}0t1Bw6(NB|m7AW$@dA%fUYkn9!opPq9lWi&pA=F-VF%-y&yJBr7~ zU6`~G)HRvsGytWb2KXQ{KoAoXNTwK+3_+1K%#CHeUZD_~HoPd7C`iE|LKq-y@POz@ z0XS$9N?enPX7Z2_{&KOfq??igc_0{20J?+_2+EoXf<%Xy6QL}i;6Jf)5{kqmx+G&D z22Gj;o-(0=LSX82r6dbPGEtw^>G(2Yv6ohrI-s>w5%W}T&FV3gG~|_G(ygds-P>Y9 ze%=*(6vpbJ6!<@9hCxltU^)DktZ*i~qk%jZ8zPdhD+rIx~787r>2;ivx3)y?iISknH&Os#9q;|=RpH*}U>QS#=3wL_Hdt~UMc zF(W3A>{@LvuCQL}w`hRT@xJ{<&(Zf5^j!VvZC5WE(f#p9jbzEvg>3}`E50lrJmi6Q zOVIxK-p#DF>9>g!%@2I1*R48p{dKLk9g`cz+&}*G!^JNZoH}@3sy#Kew*|troykeX z6{}8_4s_-w?-@F}xBbBNB`a!vpSisA(bp2g_n-KA#*9OF^vypmKYV-D`Lj!o)XM#L mcJ4hK`*q{+TR!anxKHmtqHD0=5B=B!2{FK}|sb0I`n?{9y$E003=CL_t(|+GF_t|33pIm|@faOanA$ z_kb~oEfSjiUn0HYKhXw&G>~loNE5nZvJ4RP41sF^@j-?VZ2+<>Kn9^3NR$CEXA`3t zYyeCVh=yqf(Zpy58-Q#hshZ&ikg5r*7pR()Yg`rJn2-Sg+Y=(ZF9P?67XSbN07*qo IM6N<$f+B`EC;$Ke delta 252 zcmVD0K7>= zK~y+TWBmXBKLaIz2}+X1%}B!2{FK}|sb0I`n?{9y$E004GLL_t(|+GF_t|33pIm|@faOanA$ z_h7{Y4S*>U2~GYlkzVm1-9WMp0P)E(fB^_VVjwoz1_*kF{3qD}kOq(;FwF$L08#)m z09g~VX1oS~6v8k_1I%{xD8=gnm?oG;Y-s|g0qB~rVWI*N864NRD!?%z!vUmKnx1v0 RoQ?nh002ovPDHLkV1hQWJk9_B delta 271 zcmV+q0r3960lET^Bnkm@Qb$4nuFf3kks%X*32;bRa{vGi!vFvd!vV){sAK>D0MAK8 zK~y+TWBmXBKLaIz2}+X#00{s|MNUMnLSTZLur-AM delta 231 zcmVD0H;Yr zK~y+TWBmXBKLaIz2}+XAgnpN2hJu1(=HlC!%~Pc8N&cZMnHb#`Ohw=!tm$aYp4i*z$g-$3^oAS$so<5Zkmiz z*HVh1BDevgM0y3-0Fb7?Up_Lt+qRk!TfE~m4CG|wcm-ilnm|q$_|gd0bWrQ22xT!a hH1E0(Wnlvh3;^+Bh98Y*uSx&_002ovPDHLkV1mhCS%Uxo diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf.png index 52a1e00a992598bf182e4ed438c69116e3866948..dc7e77e1585379c52269a25ca1faaae75246a617 100644 GIT binary patch delta 226 zcmV<803H944gLX;B!9(8L_t(|+KrPj4gxU@1n(U*6eom`_!K<_B^`)@<|sgvJb-5! zHqsyy#m*I0qBy%=Z{oqshA76%(G=O86uf;;B{GsGQ0wM(v-R^~%l*l;_qi?sl>ui; zLIMFrAQh0zCJ=xY7Q4fbBqdl)S5rhP0Q-A?1b~#JIs|y3TwC2rvv+S`?L*y4`T}?m zfm0K`irFSo1s_nMl{0*5df-2eK;!vdTF{>Jt_Kj6r~4An2EeWd-b_?v0~JoADoVZx c7^YTy0Qo1EHUz{2*8l(j07*qoM6N<$f-P@eHUIzs literal 1681 zcmbVNe{2&~9KXqcv23uJ7`74gJaD0b>;353t~ZV`dSmV2#@wnDRI=OMTYIke!@C>p z788xzVpJAl76Kv@O$i!Z9BKlxiHkan$bu$HfeUvUI{8dHdEbU4bC^ zm*r5{3iDeTQB$0Pq_qQQLeU`_LDttMbV2L{7TOLXvdUtqv2hHQB^KN6=1E@ngQy(n zF+giiQ%LOT6nzp_y8&IFU?714ECEd@G1X)eESBbF;M)F7U}zd*b+TBUEf5X!&8S~9 z0P1#naFME_QLoQQc}O2!wGO38%1e-5f^y*`#gHDxVz z&JaXA9(TrFPR)oAl+WiQNSdH&93pVDTeXA)u9~Z|3>+{;L)I->Q&F2yXxF+d7K573 zo1o}9TGhrqW-5tOQ7GN=&q)D8jaoQcCyi66%Q1n{T#gODYl-DG= zqx-MWYKHbOZt4ao%o<6sgntD~BGaK6iU4hv6(Ir$U5#L9&XbH^i)jWF47GEmwcvRs zsG63biXh0b7&O}{%Mw%Va(M+WN#h#*X20qP>qTmL1a2&g|{SL3`X#GkE9pIukESvYJ5_A=Lp;3n6} zfC}4}0sBV}tU8s6spmnTq!M!CzuYJMa|JFo91y!=p-L@)xF?D6}mq(7h z8Av`hm5Mqp6l~bozwzJ%=Q(iTRL>7ZML$*6?0EU){u=Y#q;E_-WF9$vu6}Tkn8uUm z%Lb6Cw)jvgIsHN-?MKk3e;XP3I&~rW^LLB!m3_bJ#>1=kZ$XEW&)?m<{A|+@ch8mb zimRi0U->+o>~EP|eXVlN`|6`l_RY-hd;bHa@;PgidG8zW46!Z354!s=#mf#2Zz(O9 z8C%&ZoSvSYDZDNJonyUA?&#dr_;FF*=%$gf>PriL2|66hj*cUb&%J1b&gOsOrhNS$ zopG05{dD2ZZ+rLbJ$zcbMQ{&H`c<`mUwz*tvVnt+*8G9+LuqcO4xbt({%8Y;L%qug3mq1nZl) J*Eh92@dw#AI&1&{ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf_2.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf_2.png index a41b3c52f714407de362f35e85b9cd7242e6c032..43e53ca64ad70aec20d4f18f749ed5a310ab8370 100644 GIT binary patch delta 246 zcmVY6M#u3js#=N{c#NT zWfTEEJDCZV60c$sfMb*&`%ne=9v~G3dH*`g5L+@>-T$~ z-{<@Ow!hA|Ju@RO13{3?DzB#=zH^Lw?Hc$jxU$H>SDIG8-HnWlZ~6fWcLZIm3qjr+ zSiiunhVnYa+pHl-)~CjucAz*bA3;`AqQ6ORVrv;*4x2eaZUg3MSb=B+Dcu@XIKBhu zXd4KMk`w!7^el#of)i`BvIMJ?gLcu|rGkbopP%pQ;2i?CwJbBEG|E7RFwi+P8V*Ss z6Ln&7Vg~*;)HsI5A$o@sa~T%VCbkYOmsNmT%{CKHS}4@+Fq1aIL0KL~DT1`)gdHbo z6G1YBjiDWA^1`4w6fISS08{U&Oqzp|6KmIXg~9PiBw~)xW?2p5q{HFB2@0nu6GWJ_ zn51)2lca4eT0348Rn#Y|6%pzJ$Xm6PjMJ2ZoW% z%8F>sA5#Ec4>Y+`D<491)d4W zYM6sDi(xJZa77AYXeyITxg3&JXc&4&$Gu=#rb^OuPU1n8$BDtP&7vqUmJ-5hrv=)? z+pIQ|HDKXQC2dx_iFCAamH-`~Z6FZ^JnxbDPNTR>=Y{`yeupZ;DdR%7%@ZF6V=_wP z&B1s@4VEpIQYTxy0qkC;N-9Gl8t)N?z;B>jg@NWe5X zphq|rxPmZ||EbyVWwDgv#>g&@uM}S?6$#w3QIB&Zv~Z6=37%V8VuqAjgg}DZPlapl z)bS<&*KKo^$K@~CairnP>QCx&4!u?=zCAo_%YXAb_rCmdAOCr9{qzTO?%t=LZ<*Pt z9K*1+(hNP!zWB-%EsWUvFU@t=^u>0MU+{qD%Ej&j&n(_Gwr$J#mUBPfI82^>%Gdhs zq1W&2sqyaGo3<)iBn_)eUE;3ox_Kt!=*bhVoy9|!O*7ZWzW>}-*EtuHEOw0-IAD=w(>&?C4>p8_W!w<|%`X9|>z8>k3km^DCYq zb8@z>6}>vm4jjAlp%0%c>T23Qdhzgi{(}9%j*b2RvTnL3D|gkY)8n?QR|3^^(L(JM zIg*v0u6Wy9v+pU`aM|VlX(OU#75Nq#)id7QSuyXU?ilBNDcrjM-LaWB9)C-I;j1s6 UC^P@)G5(0EDtw+1ck8o%0T!N7A^-pY diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf_3.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf_3.png index 2feba5de9dd74a8805cfe96fd40fbfff9d3ebf84..a106d397aacc0a9f0e7117a235c3b3ef5d06fdf0 100644 GIT binary patch delta 230 zcmV+8ju{*ZG${|fMvC4O~M1Yc+h%?JVDLJ-x908K~W zSMU&eLMtF-+H$*lx(cn}tpX8%T(#;7vWlQRo-;sVYM~XhKLC9Ri9;93zXu?-%T&C^ gOvF9_^3uO>2MSOpW~>#CEC2ui07*qoM6N<$f^Q>UsQ>@~ literal 1765 zcmbVNdrTX39KRVbz`{nIMjRM!M`9qXy+_}do~*QN;5dC2{i)CW|K9qH$r&2ZKzrFkRH_5k`nHnVEB9%t8blN`kV?-?gP-3BGp8-Szvu z&+qenfBR~4)28C0wM7Vm6gM^mL-1W<-Uau7Y=z*G9SsFXdQ|QUvM72{%sK ztprIEF52!zvlj-4M=3>G&GmB#U8GHFZNZHgAdNw3$76BJHSR*10b zowC8Dtg>F2A<5DNfzE59YKV%AnzUR*X*U=QdYlPGQght0p3N7`9G>D-oU{>UXlbCp z=WuGfmPmUb@Hj{S3CM;Hv1AUb#uY=+ZrsRBF%bfsP6L45~wv(k)4r2`t^3`GkoN@B5K&5JIhfq+>c4_ehC%7T*AtCySs zLCydSMiCTYB`GWA43lo!LD3{tL)dA8$Us>|5Tl*TLOrz8a|aZ5kH8t+zk&sxjw+hO z!I(vfive7fV;GvtBppx^iUtis@9b$WSe9;-b%T?6&=_Pe7`9Cm1=`^uoNl{dxAHEh z%j%3ec&jJkbX!SpgmXmgQM(IdqJZav3g2!Pck#UNKhJN`L^x$!;;wnp!(dK^FWnq; zgQ&x@b>`IB7T*fCFHvQc2@y^A2+i?k?=u*0799v!RxRFjax%2ZIDn-8&${9~Utm-JnEM68kC?|ls&>bX9)dS>$<>$=D4AG8H$PA?$umQ~yG zM%c*@rX9aHW4(pL!*jct66(SQuh+ij=qJYlJ^Q}Dy%Bro!1Y+gkw5oa<{m)yo_gZi z&B1f$Lbt|mxOz7?ZEVn8Q^>?C1r)pEWuobsf%5T+DbEk%zNarf+so`6z1-e?_Qb9o zT^9#OPL>}(RvY#ttDpa-@F7xr4{!z7CWk`@fBY%_+3KO5Qs?$6B5z`{uIjnIft8l| z^WE!a#)exipZ)gcgjj0%^5fE-vt{1#(KV;+$1MZD&tKW|>ArjNPs|S0IbJOPwZ7wZ z^htlm0)MHp|GNXjZ#_IhS58g$&HIv`(fj9W=kMDvbMV3pxjjPAB4#=Ky!A_fBBsH|5Aws z|3Pe$4bWTL4b}{z$#MZmBgh3%HUrQw(hUGP9i$nAfrf!GRO~;70q6k+QwY+8EC%ux z$Yr`~Acmkg7d^nxZ39^VQU`M#iVI+dAZtK30A>itODHa2P(}L>_anNE$b6_g*kBX` z@HrX8hlLGH9%~>XYk>I=rWsiyddkF_e37E?KQbR%vIYQ;__8TCREAIh0000TtIb z#M%>bYQP#u?%_pE@jyvSBTrG$F`6JcBSjsGL&zf2C@ZT1_3P}16e&vrwa=eqlX?{8 z1va`rz0tH!+EGl``?r+G|Ta9fcJ*U>Oo;|hLqv^V!Nxp@RLC0 zEKBDZrcfw&3SN(9WEn0T4l^uZ0H85~Hb+$p7HQRNuQ9}sDH^hF$(l;qj4-VYTLOiZ zE`^}zbz0S|rU@sEDMFp$Jggm31t^JioIY&iE6yd6L3yMg)iN=bt7G+?W@%Fr(?Pzp9Y9MH7MoQE2 zwLHLeV?pKTEV>QDjO7o77{4H0+!|g4g4uC$ooUQkL_T+Jj*UYlbR%F zM*j;9@gU4|;2J3I8VOqPf5DQ-XEZ~BIA&RaS;XjSmLlt!dNA5t)`=x zmGql%p$~l{J7&`bF4f* zyKwaUU#AZ@FFpvGPxn2)B>{GgKYFqpeB@Q|>_XhTzj;U7*|nr|=f(2Jmj(@I`_vZ% zxbVx|6Q`ONF26W^@PVHr-;7K_@}pxX|Jk;^vC#4z@dx32+7WN-ZEydo<&yq)@j{cc zBN%bM=G=7R*!(TK-*K=%y}s`D&o`G8^1dr`>Fj*rM@YQqe#3pSq0~kuN{yCta8e)I z==_sgd}elH?<)tp&bhwdGvg>vD{FR4w$4nQA>O?ld0~G1&}~yc+;R3(()qz-k8gCh zmO9rDuAz=Mmdd-%HOQGGx55ee(3VN>)@heRZjdK_8yCi(ntsc%?#Q?2-+%LpVE@$; M-953l?-_jZUt|qh`v3p{ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_middle_2.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_middle_2.png index 1a64ac04b145e72247712ec060a65f811824e6a3..a327269d087623dadbff8934137697e1d58897b7 100644 GIT binary patch delta 180 zcmV;l089Vk56}USB!8DlL_t(|+GF_t|33pIm|>V2pxjjPAB4#=Ky!A_fBBsH|5Aws z|3Pe$4bWTL4b}{z$#MZmBgh3%HUrQw(hUGP9i$nAfrf!GRO~-dVE}aniWtaSAeZT` zK{W)cv(Rk=#Ry0<%ylFi05b&SC8AsaRSZ`M@(xHd$Y7ETfGs5^n2U%CL|9CKG$U)o il`?V0FU%E$QX>Er(8j-2(YQhY0000_H4IF zE3|bJn>Hk1h+BC<@W2xTQ6wbLCT$=dDk0c3Ar)!mp+efYjEmrbN)*CzZggums)b`sL(liZt{HwI`fp zlXev4jQEs;hNk*c+SHh)=v2>6vb&_>00rbhvQ)^Mu3CyvmAEP%`>z>_tU$c62-WKo zlEcXXGHN-942MKo;{-rTN{AC#1qk<(faN5Hl^BkvSx#j|l~>5xkHTz@o>2#5yK7wd zDMIBu&sG_xSS*H$e8_UL45ugx!vY2X8Y5_T()3`7Hr=jzgcx!)$FM!aGD$xoOk3k# zgu+UzDHQBRSktYQ2^WkhL7U-1te;W^sA~6iz#27`iG+qJ%9Y&@#*Fw5AI@otAY(3u#USGKWB#3)knzEN$Fxu0Ox( zbKTN#jDJ}rSwfJP5iN#MhSs5=&@ioNv;rU(&Y%or1)(185y!ww4dz!y^;PLOBAW&f z$}&fXMa0n=MF6xcB9`VQB57h8@l2VHEy`Ldy};#GKBWkMtOs**g}PxZ}$kL z`F%z@ReNo$QIB;o*X9><2nW4R^Q-KxmGO$uLA_aAyY={sxt4wxPF!C-?iwqH0i*>H z=rrI2k%l7PPP8-xdK$_Shs1jJtJTXYz?KAcKi;7FT5+@-G_wfrpbT~6`K-^KRiUf% zxoUm=ulX?k-dVL8bF~XA-&X9ixSf?(c=Ps$jZ*_ZG|nAl;!-*IRGDzHKjIVVQX^MlWJCcv%( zPo6DHPrLz+F2(tg;I=K_G?Ps`e=dLe>!{Pzb^HqgT>k#l{`0}5zn*{b;G^I5d_8d- zl4ssN`{(AZM;5o8fW%qroHm~6-0eLz{qaqabLRrY#o2ck`**y$-#>*Def_cb9vD6J4@wV_ A?*IS* diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_middle_3.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_middle_3.png index db45a362837f5c4ab66efc09c680037715769c5b..fe41f344c2b425913ffb644db3c6dc9adf0da254 100644 GIT binary patch delta 131 zcmV-}0DS+551;{%Bz$K{L_t(|+GF_t|33pIm|@g_p#o6V2u=f(n<~JXK`sCpMphVr3;`OzK$Z(YVF1z$vYjjgVBrAr l0=|I6YXC?i$Q$_7007#Q<}a&cTqpnl002ovPDHLkV1i*mH~#nbP zz3+YB_p0jn-0TxOckJ0ANz%?zu`n<0cc<4K|YL*HuRnq~~Ff_65$b+9EqD5W}&le62Vu`1m(nyjJ zt7^O5&b0LmkLs%CIF1UDiVzS85O;%wbU+YK3>gY6rjZ{eJ`d!Sk+^(0$tgl=N0iO12$>UUHX+VOj3hj&aNZm?YHlc5 z&gav{*z!Y1{lMex_~8w6Sb-!gryz(R&=5e`ie}-gjSV;nbqrx2TIQZ#>u!cRSfDj@ z9aOl+BMJFOut#x?M=c_9_FJUR)G(+k@~DzH&zn3FfrUD~r=ncOr65j7Kv}7fQ$*Ss z-}kU#!kS?lI?zeh0;VTMZVhT6s~a>+nN~9h8O|?ox|}vQo!|Gl$Eo1>J1QftflSQ- zmctOx9RmW_gcfiuk2%OP#lp!B*^WfMSZbuXku_E22}bB5LTp>eFqsBwj)8z}G6-~w z*`8jj=`J!;L-#y_i+(J+*Bva81@_Ef)b!<^Eij>}-E#^}`^-FL@Y>&^9@~mMnBQ(N zL3)ek_oK(Wmb6L4rt6}1+wqrrGyO4HxwU%3)u5e41Q;gr0MZN-5L0X?)FsGsiEU}j z9A>{+y^WEui0j?FSfrUe_THO(r=Hyw{YR}Pn6$x-#@$m*m}v5?j8T;>km(?eXITX w;N+gYhl8r*kKe9LOq}{rdi}~zU%u0!W0KnipH?5BC(^UBG&5Ux>tOZRU%yCgMF0Q* diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_spore.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_spore.png index 114400bd8a43978337ca89b05612ad78bab7193a..3b4dd02db2c89179faf10cb01980c39718c48589 100644 GIT binary patch delta 165 zcmV;W09yZ$48Z}AB!7rWL_t(|+GF_t|33pIm|&b4kzhVS%^(_^7|0M1nwJ7=R=}7})@1{;Jr^ z|3MgQAi^YZX#nBf_3v>T0Fp#jfUW^%Aj|@sF2JRMU_!#?1s;-8B6%gb2Cd4Q T*Hi$Y00000NkvXXu0mjfeyc#$ literal 1552 zcmbVMTWB0r7@nBY*20#8q$HK#I5FB%XXmoF%pqflJJDUpq#<4G_Q9C5GiP^)%*>h0 zob7HxrKO-$urH!m3o45EQ1DvtrP_cik|J2B54I2?Pud5uN)QSv>zTa_t;Aag&YatK zzW@HeFgx>PY}dYB48z3oIc<*4d&04EJN-Yf*@ASs*UKFZ7-shu;plti;O_ewX4|G! zD3YQ+4GiqWp@~Z<-f%pMW|;Abh6jyBMA#ClSgy+5ytvA-mZ@?_Qo5*nSyZ)hD?U2B zGE*>C77fMZCLUwQ8-Nlxh(NaC*lqwCD%a)(bR8ZG9NUJFMU|Tj1+qnbmd#=xv8i~P zH>9M@W|X*;78N=9C@YInMi4WCl;A}Ph-r{e*zU(sX}(zobJ`PKS#+mzRYE)<2=#hB zUQfiaUlAllQ3O#IWSOT3K3H}MZ18R{(qqt2VEC3tEbOu&BP`(>Q8}t<#{|cVXx*Ue zCh9Pu0X;#Ai=jzvplL)nujbor;ie%V8#%}&0mVuY)~jNIgDUgf6o0o1j+9?95J z7srW21Z3(MHKXg0Ezv+< zV8WCoJ_AvPS4znwuRufMQ>An|Ey+qMku3M#YuKoT!R@^_|L6NdzD0`*+IP(pmRy(> zAZGaG8hQ3BOp2&=JUittw}+jqBBZVyh|LAZ?i5Zy$b47s#@`Ls`MU%D_%dt5WGO%}$! zGJbEhCi+KDE>#EFf!BX~Q_l^4-TL(>zPWnnnZbGcjVq_WWy~|8zIy4|zRlN;7KhGW zzqWLdd3WfYU#?%h{Njz$#QdiV8{b_0(q%q6cVfJ8`a9;i_2*k_=SGj;*9!KpHDlX` zp4uFF`K|Ap=8sV1Z|y0Hi|-Aup9G(1V<&3s10Np0!3|IMFTC`@>ZRuSKJBJ;>*v-V zpFMId#^g^`&)!2~Vn5uwLHa&Ev$k*N!w=c>?19m@cWi82nPztU@cDz6pMG^9?AiIL L8SVYY7f$^Nnd|+0 diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_spore_2.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_spore_2.png index 2f9699eb9436b8ee4e814b2b74566f0d7ba17a5b..37d96747489d43c945abdb44c1fe782764c20c20 100644 GIT binary patch delta 130 zcmV-|0Db?651#>$BztB_L_t(|+GF_t|33pIm|Zng#eEWp(+pAw(+o3gYS2NDK@3D20MY>CuZq3=AB2exL}U#hyu1EAX$Bx`fEfsL k5z#I{_QEhoiG#}k0NVWH!#JNG!~g&Q07*qoM6N<$f-9jjHUIzs literal 1928 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 diff --git a/src/main/resources/assets/betterend/textures/block/jungle_grass.png b/src/main/resources/assets/betterend/textures/block/jungle_grass.png index 56a394f12c97bfa9ea6541a4e22d277a1d4774fe..93e9235e31af0f48a8607ce85a2ce2ed8cd2c873 100644 GIT binary patch delta 266 zcmV+l0rmdZ1Em6xB!2{FK}|sb0I`n?{9y$E007)cL_t(|+Rc$M4#F@DMFSiH!NP!` zVt|uy0w&lyFtSxbOq2oC1;iELh{)ul{K#=TP_baiifi{j$Bq*b_lvv#1i;4ooxoi% zfW@aUs*T*j6i@LEq?-F^G7K@*&{&Tgg+C& z+eH8h-n#*kER)@vc9Q_Y*&%@9thyusJw~#FI1``D3#a8xMtLE2xyaW5S#=iu<`7!I zaI>vL`^&YkI5}QXd|AL?m5a_%46Q?vL>*Ir9Gh4e;z*)U#}D0c=S` zK~y+TwNO1v13?hoy(BhKLIy? zNZP_#-5iEF^uj^qOYFB3WG04(yoa>h3IXtV;3RBYDO;`vdEyc%!(ugp`WI% z(O38nUc`pTmo}9Dm=pcBYYJMEOC@66OGgBqtk50b$rD3eDF_4IY z;b!X(N#6ocoD}E!2L0tayfF(bV6aN1YVw*Kuf7R<)H?iRk+wM%Vo21!wtZ(L=;Rmx dwg%CD1C7_$G7v%mzQX_j002ovPDHLkV1kz!e9Zs= delta 444 zcmV;t0Ym<>0_6jcBnkm@Qb$4nuFf3kks%X*32;bRa{vGi!vFvd!vV){sAK>D0eVS9 zK~y+Tt&z_zLqQbA=S<6jD!P)cnh-&xp1}i%gr!vzmQ5roVb>6=5{s^c*je@&JOV|O zjkF8hY0;8f+K%~7?~J;x4Svbw%-r+uJLi&8O8f=s+F$d(1&ByY9qqBj8Qb1eIOh9* z#7^3c{DfRE*95) zy94r*synLp3SktRh|$3H@)}!%9idw`lKo_BKb9GY=eQ9gO<=c7kD@OGhgGv#rGPHP zKAB%g5xSdTbODWWFRSnt(aBQBwB2WaX9O)7bBpoJ0SB9Tox8Aj&DZST0XmtR8I@cB zi+MV&<0_(wRgQLUEBy9?2roNd0YCQ_o(?7_LZlX&`RX)j5EMIFi zt0D1HxZ&@}l`NK)`ekJaY_bHZ4E9A;2q1hNY m#gZ+8yB|n^kCoVamOcRQkjZR_81m5o0000v4?+i?YGA*C0jvs?hx^bxDML&Ra`A}XKWqm^p1v~`0GoOP^N@rr zfaQ96IIXSqprqm5C&PN^7%vQ08HhFjqiFiaRj8@m(sWOdnnAaLJ;a)1U+SkWvFS9y ze*(&EvLops8MTrsNy9ortN(?z#Ox@kZaN7#A27cO9)-peR#cn-0000* literal 1793 zcmbVNZD`zN9KRN(-K0bIX-sIdl)r^Oy5I^b4l&MpZAq6cfIESd{D2n}{^JUX1SXaMn`sCj1q?^TqBu|px z^ZWh&FZth7!$bG9Z`!sg6biMc29jxVy*)VETFH58IxmyUMrUBZ7Yc2j4~~}SyEoqv z3T^n*%8dG>`k)4IF>F9=qHv|?5OgTi(_3*2Fot}}L^;cj(Z8OaqbUo<=zS5L)13s$ zTLY6W+B-Rv0h41ug>>&-R8K`C1V!WtGpUn2aj2rszUs+7#$A;sZo8H zN?;dJk+94FUJ@up4f8Um3eql0;CO}Q6qXkmj@LL@6IH7IqluaevsyZNcU_Cz#pt~6 zI~vQD%jIxc3}ZLP@~Wz`oWKeKLlBHNVf#jfvAwPaLlSwwwH)8VHWe@$CNB9gnmDb6 zP;{EKwpULRNf=u(9F`ArK}b~~1WlY%atl>)2v}4=MP&OP!SYS4lgB>x^7sbS&DYln zkksmWQ)5jp#bQ&!^ZUn181;m#iS{xR4r0^D!zCA>{&8ZnD~QI?5-u`)>}D`7GzvA` zuuLTqL1CiQ&V7~*aoM|b)gF{Id=#SvPT&|`U<4_{s~RV165q{<8pqY3I)+wuVoj*3 zMU?BHq-&tz8~+K0K+9scXpoq#qLD+aW9Mk9nMo~y3)m&X#GP1mq3c@8_I$$zD3y%S zBV;$KodX`gQPG~WU7n+I5{fGFe+vF#{MJ*rJ%UM{#u_y3<$?Rs-%$> zMU09}RN(=GL`h`SC}%QUR8~|IMzTCK8f^Eu7WveS!fMvQ6(o!b&jT6BS;iy_MwX>0 zV=7Q2Cl#0g2@>RB(9qQ$(FQD!RBxjGiR?uO>#KrARog-{K+x_n8U%Glkgh+r*2u@Y zl>6>VEv6?(4|`dBe^j zGC^57h=&bkO|3NSzpGY#w`wjm;AGeZ%jT3NH_bVXY(njlDZF*Q=Mgf&zf2|LnVr+6 zbo}T%*CxIYdH11Dt{u4c7X`2M?Ma{8_2lf!XZZ1Ne^_~Nd@$}b+>E~z1cHBQ3{7I$yhmx=FIq=xu0$Eg% diff --git a/src/main/resources/assets/betterend/textures/block/jungle_moss_side.png b/src/main/resources/assets/betterend/textures/block/jungle_moss_side.png index 1bb0d8c130bde222b4f614ccc435e9f0dde84f91..0dbd254af7978831178455145e9a8b54aa05549b 100644 GIT binary patch delta 183 zcmV;o07(D90-OSnB#|*pf0s!_K~#9!1;IfM!9W-W(CL@3YG>x3l31yUy=o;6fY^yU z^dt@@ksbi)h6Rh#wYD>{WOxthELZN#S{ lt5DF{GKy{p8cfB}JpL6LGU|iW^$q|4002ovPDHLkV1i(OPyGM@ delta 217 zcmV;~04D#O0>A>0Bnkm@Qb$4nuFf3kks(ii32;bRa{vGi!vFvd!vV){sAK>D0GUZd zK~xyi1;N1$f-nFD&>u~SbP11JcUN7-P z6;j`dHo^2(LupF|QE4lCX^_e3XVTt6jHH%D{QJ^(a>(r!wwN5u! TRf@Y500000NkvXXu0mjf$qid~ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_moss_top.png b/src/main/resources/assets/betterend/textures/block/jungle_moss_top.png index d25c2e5d49683e20af8a8eb0779053505d9f1e7d..375059290bb71abc77ad4feed1e056126be63c33 100644 GIT binary patch delta 126 zcmV-^0D=FC0^|XZB#|*pbYDqCK~#9!1;GIU#2^p@!Ohh`dKe&J;GzD#{S49Yt-FcF z+}f9RpYjNb-tsVR^SDK{yq#j1y81Qo`l6qpzA$V&jJGcHmVMZ8%02=|;Z&p0ju-9s gnf*evp84MV0pJ!27ZKDs2><{907*qoM6N<$g0b~JvH$=8 delta 163 zcmV;U09^m%0g3{UBnkm@Qb$4nuFf3kks(ii32;bRa{vGi!vFvd!vV){sAK>D0Aoo+ zK~xyi6^+3Sz%U2{ZL)wv76@U1mhQh>$p@XKvq5mFtn$K6X2IpJX$2UZ4T4-4a<+4n z3d0es_&7r63qAzw3oNyK3(3MRlU^k7UT8(Z=-|EFU%J|Nj_nh7dF)y71K<`47Y@xrW002ovPDHLkV1n}ZL0bR- diff --git a/src/main/resources/assets/betterend/textures/block/jungle_vine.png b/src/main/resources/assets/betterend/textures/block/jungle_vine.png index 8d71387df42d8c78235d42b00f85b7eb17659bf2..7bdcee977b5ebbfc3c5f8a9f19ba6322a08e7ce6 100644 GIT binary patch delta 251 zcmVQ4qTvSPqeo6-{uOE0G{~@pl_yp3rhfh3vcoHk7_TA9S#5h002ovPDHLkV1nh& BYPJ9X delta 462 zcmV;<0WtoU0`~)uBnkm@Qb$4nuFf3kks%X*32;bRa{vGi!vFvd!vV){sAK>D0gOpR zK~y+TeUdLo!%+~&Z!(6(unqY!4Fe}?w3y9`!J{u7%W+~1aLFhnG< zk1<>YlgIn^f^#~`O8Mqf8r6!7P8Y15cc2N*W|nOwwgQ65puuFSKfee%T%SByX9BU| z!=YM70BWU*3s!a?ywSfBsV;#Ae(>9W>0v^vU@F$32_=euMbLmVakOU&TWig0>#pz7 z)Pl(uH%)G?=-zyLFh&*fe0IgX>rNnO|9HM_j2#z=QPJl|BPH*b54H_mDg=Do*l{F* z27q9MQjvTRjLqMLfPfZoV5A()j+kWEG2)|e1pY3N{q>?X0fLzb>ibm%d!WHN>;mj8 zj~|Q=fCRfH0YM9hqkHfdu+xgd5@>lk#{Ym1zO6(eKUow0s3CdXwEzGB07*qoM6N<$ Efr2U>N#%5q&TS{n^G4F* zV2-04O=2Md5Cf70G7bzTfFeNo4f|98voN?CMS`p7ei+XNAb%}WaWIS_wfPJ_BZhGX zKo`RYKa(e}!lj--9rN@Ks|-3_rb1vW?} z%N`*BSh??jD}211ssLbuOaLMM>+{>NQV=Lk0L|4Olp|(lK-gFSU>xBGl3fAcfITiw w29^u3OSQ-M^CM^Kt?oKR5ny*ew~7DQ8#Xw0jq2Fe`1~h!Bpb;EG3`D_g3K&6z;A93Djbl?5j2Q&yM10qE4H*35l6UXDd%ySl zfB$bypkl#9Q-KLVkcmF8rxMPSjFCGQzV92j&cbQD;;q#XB(K95IU9=drXk3f0U=nU z*Z3DQoGe;cUJe0EQdA%sLFT%W3d_|49SwnqAUUz04;{u(fp=onc0b`)+#o7=8&y!% zSP|qJ>p7aoT=USmNd^*#KxfgU7?U(6>BQ2!3|t$ZaSTmE^m->&Y6wJY`~lQ0s{plI zip?BpqtFuCLKYJ=Wt)vs1X+R;B{*p{6C^_vGgcbSJQ$Rw@?oaZQ=X9pcTOy->k5P8 ziA2JZuv%m_f|E2&;{=6Mlo=w-T1wK{q*>AmM;JUn<5WS>1zAE3Mm8ij=uQl3I&6Zd zWN9TW<0j}ZJjp6JX(0@g(my^50Nrk8ctH zUF-K}W!zF1QOt_a^s+cKBjb=;qP1X30eB_Q!j?ItM98lKhJe+Ba#6P8txg*FQ!8v(c?MKCn$NyaV5WEBdA+F8?D`2CDe(sWkh zfY0N^pxG8d;F&PzC<)OdYqs0%oSApn2s7<)6q~I)#gSnLZKp%wk^3H*YcPU4a-aX7 z_ZO)GEG{;7+dM|e8Ck)21r5e4l_`oU@MLBc6VP-bFf3;zxD(@y$O0bAd=_ro1H-h5 zD1fB@5bj}^CWrL|tAf%9^wxjLC>-jK8`U^$3jS9s(`PqS?g$*V17n%(LvWMrWI%%L zOND)^sIa*OL2`EZJf%TL^M=a9xO?$E*QBAPXM?9ZF9>T&*SC~=np`W7w;hpQUa!B@ z=LwyvBZ*Dt21l<2g}YkbU$xa0^gS@y^;@d9b`*%haETwUHxcMqOCv~tt&=0AFt zmenIn>fo=XP7pC@9Q*CFW^FO$w{6KNdnW4UGmugLy$GDE2veynhdMx7le0s0L zzH#r#SMu^FEb*n`=LShDZ6=gutKU$*Dj0{_XomSHOjl#lk#n4Pnp+*&Jo zsTt>=*f=ZJar|g^enojxDslzsYiGVP#ak;ow?F>Fi_vJ)=$uj0-}`8xx1n;&~52Rkv;@=oaL#|u}l4c=Wk5c%-I zEe#!;?;myU?WwOi&-b?PoV97q{`v21Yunj%V!PEdr*4{zU=I(fmYGj)*|qM?{@NUt zHF+A3j#CcghNoPL?^$)ZYH3~TH@i)p6Thhb6<>~^&wt(BHqJEJ_$m3yDm?GbuUq*i D{=#jc diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_barrel_bottom.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_barrel_bottom.png index 8df3c4384b7f7537904767fbd0699785e5650f10..7e09714be35baecfbc795eda26ddc5b69189048b 100644 GIT binary patch delta 420 zcmV;V0bBmT1i=K5DgoM&D?V1_?%8|i+%q%h8gv`ztaG(~e*8QByMs5gMxSs1Q#KMI zBpxI64Dm;Z1ThtWGoj#S#1??Ctwp2jub#v8Axw^AdII;xl;6FEo0s4p_3}{xhEHo{ z2a&%MHr@^IHG0X(;f6#|`5QR9FW>ARrHE#8@x4W_c_drim|QY6j+1{GL&-%hj`9m}YZg&oLOrKM^Kmt}h<)VS zjyH#(50iJa#cL==bf2OyCnxwj7veh*fH2L01(yf)PKHk5;u(xx&?}-<_jKmHy6J;9q9G- z1d+c+e^ggqf8Old(5Ya*gu^Wza#}hpSZCc(2S(0{diXZ-Q8<1iA1D%bKZ)MgRWtzK zh(r&tAQsr-2KhR8BAlC4~KS zO-nf3wz}J>&Xb#{GrqUzHLql=8>eb0NM10SMC`Sa5kz?_}r{E}p^I1-&9#e(Q?9gTe~DWM4fi*^Y^ delta 29 jcmZo;ZDXCF#Td6y+nY%sXX6(Z1|aZs^>bP0l+XkKdX1M>lpB!2{FK}|sb0I`n?{9y$E0062AqO6aMvp?6I-CZ; zG$AV_$^cL_q8kEZ!wf)|M==2AKbWE#R|Pm5SsbJp7BhGaK(`TDGsv|teED0XRuS zK~y+TWBmXBKLaIz2}+X<29W_;b9&(z286sq|4U|6f&&Rz92vk3xRz4P@czu3|NmZo zW?*Dw1Y>LfW*`i}4bW(90MlR9> zSTo4AuXkPl5AqIJ0T5ugK+rSfKgbniAX`B$AOzqB2aw^P_S~o?o-(jvm*8G0^8hChMcmW2Qcio4w7#LoxJAtBEy`>&1!@vLl XW$2xG$3Z=)00000NkvXXu0mjfmtU8f diff --git a/src/main/resources/assets/betterend/textures/block/tenanea_door_top.png b/src/main/resources/assets/betterend/textures/block/tenanea_door_top.png index 3ae83134d94dba9887f6f759804f5b8aad449f9c..837015c2948ab2caa6fa1dc7318beae2896d7e1c 100644 GIT binary patch delta 533 zcmV+w0_y#=1hfQ@Dt}&eQfE)XP!#R&GHylG#JIsSEGkAJF0^bR4jee*L<2<-DNk64gGlamU zA93i0gFACE@BE`jhX6;neuTt`2_~id*}H(?NqG~QzK+h^@_#eF7cCc>yhzLjv6C1v zVP&EhZy|^(eT}WRcXP36D}CB4_02+DriIf?c0hdu1O396CexhpOm+8wLh*7KtqhakI{GB z*eU+-^j%694k}MwN=T6stiT1>*VeLM&Pv^suWjTT?Ay1yT3gRG*kWcrl3j>ONHGES zlTiU2e+=Iwq?iE9!QtCg-Rona6$BF6Aatjg5L|*+woW5BOGq&RZ33>o`ReJnB!6-F zMIME-NM=Id=IB~MMG4uW1Px7V359E>S19?gl|QUyC_y)>hP1hTNznNJC_xIGdC_pF zH7s68)N9aRLb&s8=ecbq2k_ka8I_)3zCYc8b zNs*HXbczWFC(bb==mV<2&A{l%ztj5Pc$1hPmZ+L??lL>G00000NkvXXu0mjf*S7Hp diff --git a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_bottom.png b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_bottom.png index 5bf06f2ce4a1fd733066264b87080fc61d9b0e8f..53d299c7be007f4b2983cda66ad6e2b612f8fca4 100644 GIT binary patch delta 252 zcmVP40PXs&z6dp!YXxwQJvD~_LLdT=Br>M}s5@`#sCAGO@Jk+|_4o^*5MPhQ zi&|y<5&?MDdMp6GRqTqkbhQTBMy}C}6ezeVJTD+fK_ku4&lCc@5z2n1nX#R|X5V)o zJx!1SG=2z(S_TN$HGY~Px=6eSdiK>L;0{n(?^PeMz=^xaJ5=oe0000!tBnkm@Qb$4nuFf3kks%X*32;bRa{vGi!vFvd!vV){sAK>D0gFjQ zK~y+TjZ-~K13?g-iykK-<^v;2ETSApj6zy#3&9^?W2Z$b3l%$w9Ez=4SXl_7UH*fm z+NLnZLeWCeLSv2)&=^+VxO?p74)notvokw$Z|BV#LI}$3I8@tkD1W#w%v3M6>t9rV zEv^`&Yg@v~4Aaee(ddqmL_~fW2sE!=2nP%01JQo3vmZ8mi0R3IuK;lCY;zGTg~r7j z?-7$O4}k&z4lbOZ8jnYNMzeZNxJJh{Wz-Mu!Cx3zS{1SU1bsX`)BWzIuOI&^0H`8; z*-zf9D+LOmx@wgEr^e+2p+HZ(^~2S3X7l^(AzQpNtCt7QP00000NkvXXu0mjf DEegZl diff --git a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_end.png b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_end.png index bb3b5240cb3beec9164570b58e50f4f7d98aad0b..b94647474d0cf1380c3c75e8afbedc4b76e00e1b 100644 GIT binary patch delta 234 zcmVSB!2{FK}|sb0I`n?{9y$E006y7L_t(|+GF_t|33q{SiPm5fno3& z00Nq`d;S42m<>`yvH`j)I{zuv*Zf!QX@)3*0?nEIUx;3mgB#G~;yvND`(9CI-^1);;q-vh8?X08>fiiz?9E(5T617|FNoDMStCXUS;cw+(C5Lmzx km6U5-72p^-8gbD0dYx0 zK~y+TWBmXBKLfcyqqTv73CboLP~QMXMn(p$IlcdY7|aGa6Cc3p0v6uC3_qWI_^;a2 z4CaFj0vkMQ!haBr46qvT=QA?{mj*Ax-_JkcA*@ti^Pg3a1=?$eKkwmBE@pu0z%g11K(Vy2!wAZz06rKcBr| zc+gjeVjB$HsD`jHT(D0c%D@7cLvKSZ^>m-81<7P=78iqy? d&}eO7000`Iq>fjlR4V`g002ovPDHLkV1fytvtR%K diff --git a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_small.png b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_small.png index 31630fcd2177f0cab2bd37594858e7bbbb2c0bc0..3ef19a06d94be58b77f4d6da5983299f961fd377 100644 GIT binary patch delta 200 zcmV;(05|{W0^|XZB!2{FK}|sb0I`n?{9y$E005gwL_t(|+GF_t|33pIm?F(1$pGc1 zivMIA0Me|twwrnept}an(45`#pBMws)!{V&rWsid#7A}oT(SD(i5PwbX#|OZD0R2fs zK~y+TWBmXBKLaIz2}+XnV`yC@xgn@xo=s$`p;0FBr!OEb&t_Q^xFxx<6`BKrj zV1r?5KzcxWnVv13%=qKML$Clc8>|W`2>yNg0;bu7gc(3`AT=O)2zxRk0HLyUG9;!( QHUIzs07*qoM6N<$g5YL@`v3p{ diff --git a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_sporophyte.png b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_sporophyte.png index 09e8178a440b8a21c31dfb738c7cabbb18e9e52f..2fc308125659f96ee7edefe03713eb4649784264 100644 GIT binary patch delta 189 zcmV;u07C!40@(qOB!2{FK}|sb0I`n?{9y$E0059lL_t(|+GBX&df`6^A5%L6#xOn* zFf1@$@PD$wG%y<%W`JqlEOzGqVg`gEAW4wsPTfAj27olqVSpF{qd}4&%>-QlvT-qz zW|%8LlC{e1gk6B_d=L%7FfV`%D3q@v>;>e2L=HrdW}*x@r#64~|9i*(aKk`+m;oSH r;57iI8J)(b3B>?n6^D0M5D0)YfBX9b%EJ!827olae8s>ZAjZIO4amNH5n>2PGZ!-ln2ifC!E6)}^$hG~{cEclPjb$G)7Su@NLNj{k6YT|D24M3B z&R76B9cBnj9Gf@r#sab-uz)2hA=S7lz%eoD001fmpAP7$La+b;002ovPDHLkV1o2l BPoe+- delta 364 zcmV-y0h9jY0hR-hBnkm@Qb$4nuFf3kks%X*32;bRa{vGi!vFvd!vV){sAK>D0V_#F zK~y+TWBC97KTbT!YYULVE(gNuE%gjc3={&q20Z5d24&#}v~|Hn@efcIZh+T-2eSVe z6pEVuL%CQ1UITtUd%?giB?0AO2XF(lW=;67zk14l5DgU~3cwAxmR7*{3K diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_barrel_bottom.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_barrel_bottom.png index 3014c9e1356cfad60718993f27b83f0abaca0b4e..9cf78b97d52b49ee2572a2f4c0eda068810952ee 100644 GIT binary patch delta 541 zcmV+&0^Nkl{^cDH1_F$jq(zyfh6OPrMr zOEw4uNZtL1nzE`M5hZ{9HNaGX%Z<`7v*Y&1=6>l#dt{H zf0nwQa*`0YRa$qtBKM8BPMmLI9=TjWf!KoQ2X4E#PCVQZ!QH@s{Sfm(-vjv|b}lys zj8*D_k39-qOLJnXK;XXPIr#y4%n4;{<*_yB5~}H?$UZX}BYO00000NkvXXu0mjfkF5Z1 delta 561 zcmV-10?z%l1jz)DBYy%ANklv;X%5;dIOMNFZ0YeikBDZrKPWB ziFlc$+;Q6#&Uq*PK9q`*!o6?U52TIfqu3v%Z^*Ww$%T8pFdWI5DwXDQF32b%&wI9w zHeV?84Zr`%yL;?tTgE|DNva#39*Y-O*BlOoRf)DM#$D#XwiW($!!%wN zYP)#QH!9MPKmB)gU)T5l7{@bRQ?_(jxoZ3iD})wvU)u5$00000NkvXXu0mjf!)P8| diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_barrel_side.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_barrel_side.png index 2179e95ee379bb1d619c85ec4c0ec2f213997146..e2c387dc49a1fab33e92160c41715e1d84ba7d29 100644 GIT binary patch delta 517 zcmV+g0{Z>T1fB$tBYy$qNklf#j5cQ7#Mo&F8QV)@us!32oLdush6l15x zkc0pQ(q0N_|NqOI9ZVvtz4b8Kot^b~-^Tz|PO74r_{`wz%$1t}Jg zPJ(c^wfx%yq|5xz6J-8~K#~bu?TX19lH`!AfLyXc|Arsm+JCC~f{l8q)i0U|H7{mt z5RKqY&e{0}F6zT|Vz}dvaIFX~9>86-?FU)vU*_`I3(hYcI#_mEa> z5JqEr@>$)UtiDiKe6r8A9%pdZG~TL&z(ZGS7>P=tYJUHkH1);FnXOvWJEs?L8DaM` z1XZ1@9;kYudiEcDpjIXXHyFOymkJ(Ho zlvLFG*|Y(naPj$ZUO&$siY4I`rDK}i(a!v4cIFfB>o?Wkzwq8(pk)VjhyJ)m&R;;c zgSLkxK`x)88w*tj+YEXA0*y-yO$|+rW;vuK_#QFJB+u!5|ps5q~m2gvA{31K9oz3L?aW(DrCp!D4|_z<300fXFhbUz*QCy&xeuu_fZjdD$w;1PM~U`?J?*M zDvRbh#1>T1JVE*+*jNZhP!?#GL03V$Lo16soq`S+x_=h6C6eW6oWU%FVSp?{Z3UGF zMGikluKle8Z%9(4QRMxb%lkDxWZ`b-`z-A90Q^4(;(h+2nx(LuL*2T`uM;<@SqSY8 zvaREw?wp?&aB_?U0frz%!U>Ef5KWzI(Zb6UC|k%Y)U%F*p@f-1ixS!S5Eu-Hb2Lkk z)f2a-x-Em{5=;nVA0h*lb^a#k&9C_F8KpnIvv^NKYro>0000KmceZvb_RA+8ZH} zaRhF{S%@GZXUIorrfa4?uCjSA4nP0W!BT}Khpd?ynsa&&YsrsLP5HoqC zo}@&MEq$Zp^dr<%_5!ro!#YRD?cIM%GF_0iB#lgMVHt;X-RHRRrV6RD>bZ z0+-A~qGaG~9E})+ZPS+v{R9!ht+1ZL4{-eBJ|pX z5AXHomH&2bh2D9{#K_t7mz{LsI^m>F#3WiO_k}p|J~4DON@l4*@07&r##XtnyzP9O zMQbGuIGOL{Onx96v6EFl?qa;xvTrmlFcaDR)v#u;vRI>2nPm}}zES0qq&^jfv>`a;C0@?kr1il22BYy$~NklK$|8qcyim>O&fg0)Qq=GD$lOkxUn1Y{q5DSzAdaQO^|0s06R3A}?KmQi5a z;GzdFP;CwzLxg!jYlRe$mzQt|NT&$Zu3bYqg~tgxMWrD@&Jwq39mq3!59A8oqx;_4 zH#sXo1hk;{3p`Hf>4-Ev1IDAx{eD4rJ>(Tm6KoYa2fepZ&a0JCR>=9h3n?OR-~GS3 oPwSh@{~ukLR~Vv!w+g$+Zz;3?@M@;S;Q#;t07*qoM6N<$f^YQzP5=M^ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_barrel_top_open.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_barrel_top_open.png index 995b4113061c701456411d842437e20e9b94cfc3..b29ae1489904311e17009b5d36ad6428761d5568 100644 GIT binary patch delta 437 zcmV;m0ZRVi1J47HB!8AkL_t(|0R_QJ4jnZR0Kn?DJ;{U(S7U(`E`h|sSaGx{n!NF+ zsfzsjp90SWe*B~l?u&Z>@J!$yoZ^}McIlq!{P!=}XpK{3(vp?{>_Zh%tj#;+_rG-a zpm(l8AEJWZ*qdDdv_^(H8%Y(<)Io3bAtDiEBa*uTr#MB1*ndl{g#$Xo7_7tZ-{_r8 z;9czEN_z5HtSu_k#*d#m)G6`h3!lxe!_}!`G!m!yY%;hyimTIy?wP!cHn;|Y2zs&( zP(^Rd#Xh`?xw$XhuSrW<0xij49o7a45v&75P{loTL44_q1lFMi_rL%EzIN84m&gOU zQ|hxs4z5N|GJkj`YXgPRco&Lys?RIX-4`v{hjo}m1Odn-0_e%-rHYn3Q+i(3CXvB8 zz-VNUNF+{ibuy>|>FdQ@>KwB8))|OGk;o$PzGSH=k+_F$Z4_&&hggS9Mq?i`h(J(B zJs&==np2$8t<5_*hq2XYtj&BmMFuT7#oC<1*{sbobuRZM|M-)8007VA*CcR?`{H@| fda*WZ^X>9K)EVQiewsbF00000NkvXXu0mjf>J`=c delta 455 zcmV;&0XY881K|UZB!8$$L_t(Ija8FLZX7WTMIWi5U7by?mPLT%5&?3sta7vOB z@zriyK%q2|eEcHKfBg;s&JF2|26OB0>NyaNS znPGDfV*pF009Fc&1z+!?@r~YwD5^ttxCV@gg%MMFWq??L-EMGAcwJDl5K98z1lI&N zoe}!yA`xi=QjrcAm?`2ACJ{=r4~f|Z^a)2L^V&Zvo?MZ}lG-RBW>1G^a(Wap26oF( zwu7-C*{*>Pb$4YBb5QdK>#*b*?sSu?{&1oSKu|lLVAqFG@ zfha)})IdNYCV*1dUqfPTY2zQD^S_Pz&N=IeSiHA;vop`m&WxoxT~fDg!WtYt{n3B+ zV82JfL7yx*tT;Qg>g=+@@k18&utRI{0}90xv>e@}*yV_v+<%bI)qPh3^zCq1KT5G) zZJV``JZ43bY5I6uAopdC|6}!c1^}pT+8WS$;DEv2EbB8I=6?i2y^&4h@t9oKWxD|E zQHv1EPe9Nl0FFo>0LfrFKtDkM_3at6ha-Y(k4p@|UhJp?18(tz>K&62oQ_4zb8riS z6HbV47Xa)4EPuB0q^=rd1@aXNoMcIzRXmliNu3r*<;vc_UIW?U&pA}8nbq?5*~~<< zGrjkIJwpQzfR><@=re>p(l0gU%}l_KJ$&uxmNy4F)&fl`k3*@l6wp5t0>vJ_h-HBE z8HJe!zy-KbZ0G=d4L~yR12UNmrBbP1vmpSvkOBTV5KI8tBmlHgvY5=kn*;rk-ZzW; zrq6JMV8a=Fqy`9vA7+T>K>CY$Ff(y}L8?&oR?Nb;U3^$N_6rh&(8zUTq!9oB002ov JPDHLkV1hhM*?#~4 delta 659 zcmV;E0&M;41F8j(BYy&MNkl$vq7emAshc8b zLAtUFQG7wwg)70GBGGMD;(t&mg$jdF?N@^jWtj-g{oG}A;kO#tr9egPnP;1B=;!GkLw$gH$@I6VTv9w?X4 zOcN}Lj$bE{UZ$|S20+}1Fejy_=;Fj@+GEdPEye9rl1Iav4lW#pw2p>P5I2l%7W;;; zQvdZ6fO6q1RDbVpuLGcANpDlCw*Wjf*RB^R<{UTH8S>5p?NRrF?Vw@V%t=Y9-r`%R zhdJp!*jQblm~&Ws86>mP@;+&-E&w3Yd9WRXICEZ6t0F>f^$7-{QU;$6LV!{z)kJ9e zKiz&m*f#k6=wfKVkeSBVAseW*DrW8bcFp0iI^RlSnUPL^|0snxHo}M&F=L$ke%;{)&HBlu&<+ z)1&j8I5JDHf52_7wt%akF*QX!mBPxthx&H4kC)~-7wx5QP^XxK`b69Ev7_Ynfl!-dtg4GG t6b7FLLIc$Tr-`c95TUS_1ArOk4D0CGu0 zK~xyi6^y|R10f6q*HQ{FGWkci0RwjhaM&G?{#%KomG(2E0p(DfP@U^~9YY+8T_1xt z8%mQg)TARtnT42UM;;%E4H92NTtU}&lMDr}M-v+$t*2H{Fu8gLq!YzaM(p?UrUX|V g`N+IiqJLBR579FbI^+f&uK)l507*qoM6N<$f*?vk@c;k- diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_cluster_empty.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_cluster_empty.png index 958ce8981326c9fa6a3eec2a9ef07d6d98e3c73e..04d2ef5ad197a930dba0031c2eaaf16d76dea229 100644 GIT binary patch delta 142 zcmV;90CE4A0`mcoB#|*pe{M-cK~#9!1;N1y!$1rKz}-jw5@B&04u=Y`E08$ERp1JY zar>D8LBN|(n~u+&Sa+^Vzr^Etifx!9RRE!O8oOX@d-MjVx5ici*9>X|Fg=W&fJU*+ w;b_xafDUraaI9;q>0vna-8IUfg0Y={Q41CEaTVin00000NkvXX1g=70f|R5_`v3p{ delta 177 zcmV;i08an&0hj`iBnkm@Qb$4nuFf3kks(ii32;bRa{vGi!vFvd!vV){sAK>D0C7n~ zK~xyi9n8TA#4rp*(a~Y=63dV_b}=p>sX)RQSC9%qaQl&iU@m%mNFJ;U*p>U|a*WHz z$-m<^KPX+%iZg&^OjLRxM{mvw;f%5cA){4csX()uZwFW+nZc0hnE~#ym|>h-EQW&| f-(NBX-=@g}Q41CECx@@j00000NkvXXu0mjf3(iOS diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_bottom.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_bottom.png index 6104403f85fa9edd3e8513e253a22d6a6dff6377..859d7e13a88d522f83293170ec76f836adb713c2 100644 GIT binary patch delta 192 zcmV;x06+h!0^9+RB!8nxL_t(|+ND!55`ZuW!$-O3;^NrV|No>~6pp4r2M6u|Aq_!f zDo0h@OLafyvi#$VI?GmNUe%h9vHAG@2Ds2PFjR|?L2C>Qtj8I2RINBtHBhLLp`qCu z05B3p&lw>r%Y{e8(b)(L6m$~$Vg^7(B&y?9-T^X!;=I`!={Xh3034zF uX)p(IE+QTdj5Uaehl58&Yg~gL=X?U+9gx0YxvjAP0000i`%B)@1=e`X0d9>pYd*5}zmJF4-6NK?j0CxSLXWj+7@SL8iynEJo)7caofhSI3XepgEXxGh*{@fzIcQu UtO3z;00000Ne4wvM6N<$f`Z6>O#lD@ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_side.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_side.png index 122ad18edebf8401ace715a2ba1e8468f65e69d0..ce3be5bc676ae367bde3d1cdaef2dd94711195c0 100644 GIT binary patch delta 217 zcmV;~04D#x0`vipBYyz9Nkl6i^QzbEFmCAyOAi(RU2kGx!R2a0c$v zJ##kfKV?88vA^hbln>d;FVd8E;(y41v(O#jJy^7vJ($QKjvwz)^!RBHewo1oCAy1E TETO?K00000NkvXXu0mjf@j+zr delta 293 zcmV+=0owlb0lxx}BYyz~Nkl+2@ug{%N3ZO zo`LlS^zdjsq-(X8=RV$V>MR36h0_4>c}(7=Ym01HzCP>HyPy;J44BLR9iyI!rn%j$ z%N3YjUTq}r&qKP_-UL!hwBXNg>?r2AdZ?#(*Wo5oWox- r$UE_yX3hZfvL0ALM!g3a|B=B3vwV`o(+Hak00000NkvXXu0mjfvWtnd diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_top.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_top.png index 4b0c5a7c83c1b7731e1f665a9f39e50ccbc35302..7ca47be87fe2c477eb10544157c8de478235986a 100644 GIT binary patch delta 141 zcmV;80CNB60jU9yB!6&8L_t(|+GAjfPW=zY5lR2yY#1M142xO@5Qot>>_4NcF9d_w z=zJI(O&($ZkN|O*t11{s!KelRO(fX>pdOIx2iO33AW{?t&{&`>5Xp4`JPar{fTBR8 vN-PYDK*Y#6uuOv|bHQCebasaEk;DO$P(|=50*CSd0000m*)aspo)7wVCa3atbEM(aXrhMx}iV>h8}yp zn9r+zV{AJIU?-|eP*$KC1U6usfCv`VsY(ALoLTQdfQ?;Pg+={LT-!#GJzfz1{8FSY zY&5Zm>#^bwiFJS8CJ));`QjbM|=VQ&`nD`ekjXwbeEInNS0000rlO6$A6fJefs z9W8sciReLW1Ol)wyz^?HxPIt#KWhK5{G&omY{HyL%_U7Q+9ALL~3R1#i z{!^LzY{tRcl!MPt-2wfV=*m%UtEG2gtBgB{R~bnx?*&daaI0d zhUp^jj-^y%DpV}9f{d*CWID(ou>}TL4=0HSydkA^=L~`^E)m#o<(ZpIn81v600000 LNkvXXu0mjf#w*_c delta 533 zcmV+w0_y$m1Fi&+B!BfuL_t(IjfIoFZWKWfgukAh*}pq;=450EBmyAgIY@Y9QeqNb z0LiI;*SEK`J9E2D&}YtufKEo!ny#*{>XFU5(v)XJps51?3lU)$6J_wID$-P5$1h(I z7oe88faUnYCG!yF@HgtK>-w8uslF5$ZV{A zQw7G`N9Z$bj@`N*jeDf5(Pc&ok4_P3R%qNq&WH$26)=t;-$9p=50|G|0o_eVIzSz8 zO+bf)#0+VKhev=Tz>wg4gM&=p19_kwUojD-_s;JJ0d*%oVyWI&uK7T^iYjhUtvVDcT zZeQr}BI1blXYk``g!=)NVBH(DO0RnuvsEu@y2J!^3H#wC16z&^TG%51Cq~tKaL#g1 zAj@I`|Iy&r6|&jF=C}wkqE3)d!o$63(XJpyW7l^`wtvm^B7$t+z}pMt!T@wgxGKPY zg7(tbI6<%OkoQ}-=^#bqr{IS%fm>i2(Hr1l0O!zk1yhDtfVd;bg5GrIRvZ|{gfD|9 zb~|J`z}d?5NC|Euc=GODeOix{={u?Jh6Twcoz#qFMu5PUf zu*N&B3%))XvpFH~!$JbI?wBr98BhYOt&ZOAkm;fGk3gYKkAEE*l;NvXNR8yB&(!V( z1V^nu;Ol^2yMr3Laz#M3hCJ_ARt@Me0%*b)B8?vIur8p%J13JdZx)wi2Xeo8UX&or zx>Ya1ZSM)FGhj-4GN?fRoFE&LLYisx4MyO}s5j*4bZUrp0DaIT1kGEf>M2vbX&$)R znbdL3W;4Np2Y-NS#129av>p;9-;+RsAJT%bXUAz0)E9rZ9>0!Egf0|t$-s3x@StlM z&|O41P!FOU9G|nx7X(yq*n2<-yif5d1pfjJ{kf0Fa}Rt5!mQv*Mx)pRi!#Xk5h3p; z0oe~@p2>-Kphls=hlcK7;~-@wh7f{{!is5={Hq@)7b5J6rN4gxnaJL24}jTUJc!Hx Tz#%$~00000NkvXXu0mjfx2VNm delta 617 zcmV-v0+#*41AzsQBYy%&Nkl7?go+3X zLZA>A3SB7Gg>H1^Kj7AdTf3`Ev8#eBT?k!d(TKRRw8bp?foT&OWApN+`5YJ1yjQ$% z8RpKpXYM_7M~s~uFuV6>LAi*51OV4R%riBbVs-xjfQv&(@_#!4-)5c?TBpm%{2Va= zlnc6z(QT+VC`{!bzsQM{1R%c?P`LXLD!#?`4CpohGGtV)^+6BP9)&v(*b92>1w9Hk zbD&!mr`yo&LCmJw3N}iIB+9O3jnNI383aJoYM7?xc5x}ZZ|O=lA`p|~n9VBUY&rx8 zpeKdhoI8V5E`O!fudLsD!iCT8VR$%d!T3!`d))f?4zpRsRD4Xi4u7iFJ6%jQ0ITD2t*Mg=mRR~rI!#yrJGrl z-Aps@WoiAF|Ki_Fv&OS;`mmUN_ROq(*4ncZJE?W1w=PqE#L2&@;wYEquj4Ei54IIp zW6$IjKi`brgc3-zk^r@5ru(Kg7y_(q9<|*e(`#pmz`ztWI)A*E-BQp)Q%NmJyU*0> zc?6Z(0yrIzb#zwZD3@1IsjA<0KVDk`Xu=7BMnP04D`@b^$?3%XVN>w;WnOqU(-Acgh z8=0Qm@DGepD8SIXe1wDK`x8S6cGDY9n>XilamP_6yB>H8n2Dvg0HF6D-^sD#4MqXI P00000NkvXXu0mjfQhChQ delta 574 zcmV-E0>S;h1J(qPBYy%NNklaFH$^v@_+Eyo9L~Gm*TCS{0nk0o-L&@pz%l26k=(Uecd0)^DxQoiUY&Ew>$64 ze7`fJmd?$&{fFydN~pOq0Jpa`SzWBMdvpT8^-~oZy@1b8o_~>AGG<}(4MhM<32cnB zF&vL*uC762o3m97K%*DXeDD|!hLSsRU}FGuifBsW^FGvkn)e^k8b!255zV`6U?a)1 zF^nfrl&4a`_wE$LNbFmj9nn%}08odAxX_}EkFz8BX8a65tz5=+2B=H5v>*jcw35r! zi)d5A1rf@|@_#c-G74@OLe1yi``5V6Kw|$G{tU#EF>VlKR4XMoZE_R_BQPG_cnsAn zrWPit&~lGKsSLpNyC~zcceBpUi{~u=>cY3*&=+mo{vt{jGeFOSD9QlztrY;iJY8pb z;}ts_FIjo_78hCJdE*-YnFAWL3a0&Sx7%rS2SecxxPQ(7j3=$Ec#w?6Qw^s4>f0Z| zM%1@Hz^nrxk01ll3jA_TgWa#v*V!Cci_;3)dvZU20jfS&q2xk~Dim{bu&@L*Kivfv zMCfvfiM=B;v3v!z%4TI4qPzlpN-0Q*ZWu~S3mP|H$ut;-QnvBrJlmU80~?7O4{AP~ zBoIV7#Wx+;B+JWLQELUqN0Qgi&3QpX_a_tz@S}%23I5py0Id~&0eBGd6kdOWzyJUM M07*qoM6N<$f|$1mM*si- diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_top.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_top.png index 4bdf384ec3121bf4eb42d84a05551d4c06312ce5..2b5e02af9d6d37806e212cf26edb967371c818db 100644 GIT binary patch delta 261 zcmV+g0s8*q1E2zsBYyzrNklL$IS-DAhx42-~VDu1*{k(Cnd@YRtus* z>KQ;Bro6)cOsP3w1@j_}{;$il!HPk0AT>-m1^=0nv%vwgxVlYF%UO;v>ND`S1vk{~b#)gT*yne#~3LJDvm?lC7gY;q; zfbI=!Y`g}L!lu3f=%J0wCdv!Q0S60t5FcACzzx6^jmVnNV+17{L1`K}Az@2Q=opre zKzbob8JZ7BO3FYz;G_&Pg()TtjET-nQ1xIJfYLK^7A2IO(X&4Q8g}2$r7o<500000 LNkvXXu0mjfeL-zB delta 458 zcmV;*0X6=h0^`r4n!G*gk&qF&@&yl_nvp| zyZ37Qdm{W3tO3}4vqP(*)2Y|U!)&qSdKDtoBf=;Wh9O#ccYi08_9qCQ=wF;N?wVAq zMy`P8DZc-{!F~4;f+xh!FX(Zwe{srWV7*!lP^}tF1{VGEZ%~Lzwf#L2wkkT4fyLS7 zJ<69DC6N>(sFm>i!Jv^hgDmvq?nIsIYCZl!(fKj`F-HT#&&rCSLxNFj? z=;)n#En_?8%72%5o=RSgc{;CCuTj|SGu_7d?F!}JZSgd=1Y-MVm-nyoG<5zG83)Rj zeEoF;M17}u-h^@;46P=1&qVnWyJs@AnkZjpCXx}DEtZ+z-b6f=%_(@EVzyYKHQ$!P zgR+(^Qrt?OSd4g)u2&%isUC6PpMVps^1oo}%yExCAVYq9Mi)jAf;H~pF;i#0Wp&f` z)S2TR9z(E37{%xoG)+rR^q{Q$^_;IBo=Kno3s*9`vP5#?a{vGU07*qoM6N<$g7>-G AJ^%m! diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_bottom.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_bottom.png index 7d82ea5521f35e65cf2c8403405130d3a62afd97..3ca75a7b14a22005779b80e92ee9b67a34ed4383 100644 GIT binary patch delta 292 zcmV+<0o(qO6TSkFBYyz}NklOAdlS42HqEi$`%uTo6JsvN6$xfC5TFID>m{ z;od8__YUs8fSq>Qd5|=r)A_&Yi$vAubX%(1sOD*PXu!a+{_bdOe^Qr0)!q8_1ZASe z5k4d}*9@q3@Pj7abO_8-T2{W)y^Ur`a8Strs+|;$?O;=3Hh(%YkZU@}d8iU13CJ}A zsFpjcL-VsSP*y$=)I$t5z$L+ymVl25fXX04Amw6YL^ebJ`$`Y;s@q@$Ko6VG+iY59 z8a5DZ(=5&aS>YaLCf+@bH7ko>tIKbNgJq4RDXpZ77np)8L=7Q q_bw~&jAaG1WgQ%dkWpNmT>k+&gWWOQIisZj00002B?1wtGK`G~yE|JyFuZn3+{mRc4lLV|B*-n0X|JIl_Leh7(e zq$xoRRY*`Yh5`~)DkOj!5=z8KiX}0Xgc4AjC=p^rX#55d-)y%FD6I`~liB&~dFP&c z@454KQ)x+Y_Nd9Dd_G@xC|Fd6&ttt~#8CXbwYgHnr;&-^a>wV(del3H_}+Lk$LD*f z-HMdE<>7^@ZpU(=VQVP2CYHcxpD%xYO#vMcCvzE6h)zEmSS0e5x}X9yRZhto#}lHMaa>UR>HOHIN>ou&8~9& zBv#s+LM)M?jXUWw;et^$FhMc7w3kvJFdQBj8jEGnj=NwTj*`}UPhuxhn?O_0s*fvGBJCZ6*uf^=Lt_#dJQUqF7lHs&C-Bj0n0=f0e4NMg(qoFrRiR1 z7+b-BF1#0*msEkf3v3&fSvweLIIM=^jtk>D3KjWDEGpNs3{{{NL4byY1!*FnOLtb0AP;FE zL4yaT$#XzskOm~))C_@9B%Q}q9#B1#vF?4UPt)s_FkXT18**iX~+n)#PRaKx%x(zhO-$DNVfzQUg~ag}h@w!fB));Z4rF% zSU;gvtJ$;EFQY#`%~+W z%y3>kl2p!n=476>Vadt~El&3v1EOL6x(M`dn?Kety{6;ACp;?DJ zzTLpK9dAhP?-{*v_e?#1i6;wW^spK$$8I6JiMW<@a^uW zT8Wm6-!0AlROp^_>*I#uS(oOVIJ0BVs=XtcV5DcvRr2(o@oD@L?@v=`K}k_-;R_9a E15{i%dH?_b diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_side.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_side.png index f648b9a686d6c2d391d6258fb43c350696c717e5..4962a1e62f393563a34323ced2046f001d4a73e3 100644 GIT binary patch delta 151 zcmV;I0BHaH46^}{B!7BIL_t(|+MSX+3cw%`L^tMsDT9TLg;pZig`7S*vX(j#EEL{j z_M@EdV_Y=WAJ;uO0~3==ySX?Q1}06dk6hLXz*Go{5<-Fy5+wjrVb#OHv?N9VCcPDE zN?rJ!u+?>3z9n7z?4l&P#FFN+Hn4*tZMfyN zkRDl^uHv;NY!d0vm^j*ooWP?o65C$Wk6_!9y1bB|lh=wQb|LYSC5z)ZlFCiM}uXWJ!%U4xpm6 zTCGe=&#Z z;k(A-c_})ICs(+PenNIdN7dDUDzh|V%OR$dE8OFOL`?vTAw@9@tBf@Vg_;@26N|;9 zFa`18oa+s^uLAIVJ&kU|(W*IjPgYp8QYyr$Uzx7i!)%4T*x~$xj->MY8K>mqcEx@)4?gk z-l<2c?2zo{zuU90>?ZN7_M)PR7rYaME{_Nd4FDZP%wq+iFlw`Y+Ac zgGH%5k?((lS32R$ju-&J-qb<z`}q7H<5! z&bEHMPQE?+!Sj1M*MIn3e`WTasZHs*t+DpiVBbjRjQZG##!CF^jfyIQ9Ld%M&kv+}CR#pIm(4 YllP0~);F$wk^DhaCZ|guO)S3nC)?E}#{d8T diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_top.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_top.png index feb81849e3bb2683c1eba7f1a474424e915d4d42..a8e2472f9001d53a68e87c878f9221b923d6e949 100644 GIT binary patch delta 287 zcmV+)0pR|n61f79BYyz^Nkl50L3{?m(bea1 z_Z^%B5d=5yE6F7l4tnYRf4Q$1JC0(Y3{ez;+5HAdBY!pD#}{h`fUDF8j-XI=*dGu}@C zSzJ-+VnWBd0Um2nxsr4-dZ2EmvS};{dM}$WqUoA_9#R_H@AzpXYu3`}E%`mz{g~{P lkMP*8-`Dx`#27bGw?BP8;{~lCFBbp+002ovPDHLkV1hHEem(#I literal 2341 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 Fe*$1}E=m9Z diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_log_top.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_log_top.png index 7b381839950cde1d608249f8d0f84f161489d5da..e796c83af7d026d18c16a5df37f26bbdd41fe063 100644 GIT binary patch delta 228 zcmVQ#CeR!1n<<=WcMd*e!c1FRR@qDbP&y-t(uU??trUH z${s(Mj8rM-+X7KGj44@PyiE%~W09_L~U>F_$GXX0p04qkM zc67j+PC#xz0UYI(LO~|{4EP-Mjx%D4+(4RiDn=hv-qe7xOMIf=G0XUU4*xc*uxCx&y~3JT`4Hnt7~8fNBgsCFWcP*BP+BjlyMLnL8n5psSgM#tY4~RY@af&LA4{G6u*Z4-)xo#&qR;ge>67_}X8lNTOikbwD%9NJi{;^T%~ve}9Y*K6*^GD-otp|zXru@RL(uGQtJsJR={oaC#q*r%DD+T-WNDTLv$%JJ5<%MZ9C)0G%G-hdr z-cx1Duz+O>rVP&Ub*8v#H0Z(qG}csEx121*nvE<>A<8yWBvFZ^++<}e2Rp{>xB`n< zOl~z@51J}!jYdc;J7^f1%yWV$@}dfuu&x3=#D@VCB?T~yBJ!LTrd2gm-XFEpEorCVy4Suj<)$`~{5oOA=_ z_X>t6w&6{&prGo4M6-a?Xbz|X&x5e2=pc+#8ZseTw=rqt&MG|yTM^Mnq>Z{n7I**rmUS`B{=iMRu zQgGBXG*bxA3W~gQJ-63~MWX-KgI_w;Z<7C2PoYMOrAGa;3JcGwCJIhxVF`~Z|FSY4 z@l9pIA`^$o!Si#;@OL``ff}wg+L)Zu_k7}b{4;vYzT{&&(<=@R3|?OO+qh4b4xOV$ z2FT;fSMFQ8%qarf!Y&&SGVMsesyX1i7kh|A9J~7lzeCNaQN;W zBBmH#)ZQU;fr}ge#&3^povUkVD z&j7T2Tw-+Mb93u2{!YY?KDcws`%iB>`Ru|~=4*ZV6La&2a`v%%{`~981K>#8h%$Z7 zoBIxowhx|p)mr=c;QE&`z2}E#Q|(6+nsczty~nJilg9=j4kc4M!8dOiu0^ zn)cA18e#XY@h7zlr~ZJ4FP?k+b@7^sed|7L&WvtN*LRtRzxj4* z9lN{Zhi#|VZ(W!hS+jrDQ*Z1!(sF*?g0oLfNUp2By8HFL6Z#Kq81nzSv^K}1AIy4j F$=~CJ72*H@ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane.png index fa673aaacc4b2ad11385bb8eead1a61d998ff5cf..6aed04191cd9b797554782682e77bb787eafa00b 100644 GIT binary patch delta 241 zcmVd=#0T;=Y&zLe;ZQR(o_^xr#Co$N3uWCR;)Vng+Bp~L^nm7lo zCZVVN67v;`fu_o97-$B?K-1>%xGJr*WN?(e2KW`Co^oWOZ5()%|Cu;Gb)hYC<0NuyIJ5laNT(WzJ6bQ{m>w>00000NkvXXu0mjfrEGE~ delta 357 zcmV-r0h<1e0*?cbBnkm@Qb$4nuFf3kks%X*32;bRa{vGi!vFvd!vV){sAK>D0VGL8 zK~y+Tg^}S(#6S#$V<=uxuumW&`1<$HxABMg0z&;Ey`zZxrOtLZ6bEwK%VuVi$<@=# z@i`jqrdnhN75`ZXmIlgtVkyS&;God^nxDfdgzjY?GEo?9BLc2+TH9P1E zV0>+cS!h>=In=Jk6WPZ|zmWUBXD`-Jn0meHxj!cJVsG7->CL#S+#dw_Si29#^4zh}<@&D64LV!|Z4P O00001m=z*oC4DiJl8(GE8O+z+QJ=t zS>ywO83JbN2Q$qu=rrm%gE1yE!TIt{v!NJgjG2oj_XWjdF*9)*pWd4c*(6@l>(lo4 z{C>axOaGne>F(H7v!}-6@$BmAjP&Ajt$TQH!TofwdPr7K+6Pn=hrVpu#AuJFxg~1?Wdu4z942%lM6RD*CJ9{)k^TNC6E(vy zsdr9Tuy3L}rc8_|l1jEbL^Nk*Opt~SAhPL{VawSNS>ToN+PzJaL;>QAgvd5mkQj*e z5Mg9N!tV=E3M+6#Q1Y<>M&g7A2##TcG!vv*o?=*;3CO%elzt>uvs6v)jXYA)!dD?O z={TlL)0s@hm*IWLO3JHJjmDJ276cBmVhE+m zh3Y9=Cc%uIu2F#l{u8V!vWBcQz%lD-kbtylBuJu?NjZ#C$il+d9ba$}jmlky z?Epi8U6Bxp!}jUAD#wEo2gN{~64hXwQg}h7q#!F&k_0peStYLVT6up2DWh(2-TlQr zSCN7_{!!%xLF5B|mJ$?6qbg=fBP%M3 zq5+lC)L?)TfWT1_2Uv>XW!CPkv@2|v`Xnjp)F*fxa}Sy z6}Qe%B}=#UE%LD~<i?_QY~-~D8HCbBd?{B?D5{#N0!>V;$86F(n$xihz? zW;S$k>Gg$``Zs^?5N9+9R{LtYa@>eO{J8|EtwsPs*;FGH_^&dQ* q`;Drbyz=-T!yV@)S}*2j*LF&$e*Gr#YVer*S?g-=j^rL5n*1BNd1o;I diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_1.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_1.png index 7a54cb963991ba4a4d9c7be6b5f50b880deead06..91caf5c747152d5e039160f3766ba3332cb631fb 100644 GIT binary patch delta 227 zcmV<90382@1O5S!BYyzJNkl{; dz;jS_=L_qfUlSe72f+XU002ovPDHLkV1j)mXzc(1 delta 364 zcmV-y0h9jz0fqyRBYy!+Nkl(X=g6XcvGZF%xSr)F7)Yu3tc^Pp{teTG=Ja?Y{1M?0WNfv*xrpu zC?wv18WqH!zO;Me z+Jw?~*#RSKlVx)n>YBUIl|3+%&dlUAprQz+6&vM#*$jM)6VBL2Ss#?T&`*brKP?!* zxAPxm<&;V*b_YsZKR4rEH@ERL#d`%Vz0@TsgmocG diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_2.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_2.png index 1b9bae919f946d132a7d481c2da8cb532f0919de..293c6b16f51989cca3a9ba0588e249d813aa7cf8 100644 GIT binary patch delta 223 zcmV<503iSV0{Q`vBYyzFNklCpOl(INsaTFsz^QIL^=c*S>xR_xdk^8|t?hgbx3Si*5h`H~^fR7~ECN zU`|ae6LJR%zS9gqW?gV42AiK9Xo&h&2Adefd|4Ccpw+~*%2=J4pAZZ*RX)Q&GYAHn zHiySuX{RBBUiuo~B}A>#Gtn`&J<##>_CR^pnT{x1=PVy+!WcR6EX-^=r@?r$3%m!} ZbavIXeJ+^pZcP9H002ovPDHLkV1kxpWhVdt delta 356 zcmV-q0h|8%0saDzBYy!!Nkl3#+bl+7KlAS&-VP282ivm^ z63UQhKphqk+rn|EENn`kyEaZ5RSNJ}iKrEW-Lcq-tsgBq7YZ%sleH`cKdv0GpgBz!B;D&jr2BE`$;-VWs01g1>CI)vE zGni8o%Y@v4g6}i~kXaX8iNWS)2O6TjmBA(kF<;iiIcPO8tyyv><|hOLO_k3u&Avx5QV=8#lAqmgTYHECZYd-%D?Cj=+Gg! z;Kjv*ArL76(Lp&`cG_EvPWRqBy*qE-KfcZYZ|wts?zSfko}!<)A1X{!0uTm|j1E^z z%JJi|3Iw=xTObw&h=Avvj4pjOXPT1Dsrx>M!6y$8Vj;T!-?$X40^k=NS$*$%TzSmk*D$lI?#~f+xBbhLfZ2olp-Pu) z^)SSC*CytBV{7sPS4-LfCCiJ$;M1BLDdQffNnI2F0apt$@+66*>t$2$v3+2az1>}3 zTXj(__a_Gf*m?eOWEZx$S}6LtI2rdjW#_m%sRJ|kv?Rbnsoh-{UgXpH1-;MQa_2am QNB{r;07*qoM6N<$f>)Za1ONa4 diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_4.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_4.png index 8f4419077668b688e2456e3107571902449e6ec0..3ff72f88d1411bbdd474afdeadcf524b9eb60dd3 100644 GIT binary patch delta 228 zcmVsq zWaKl~3>JzLI~U(!{d+Braoa1p&#ye@wLD+n`t>!qVOj#$ojQZi;hQ+<1`vP)z`2RR zUBwLM)Wk9&SD@fC)c|Bx1>eMA^Q!_4QQyj76N8u!YvLTVnq8RQ@=wf92nL!euVJ7W z1OrW*!{e&7(vU$beGTvyqTbRn(KgmO(Dt?FKzY}hwkR9tEFWk>8#(bT%&a??f&bFk eEbts;-8lg2W@7j3$45>80000ps*xT(ba)cBK z9TF*^8>g_gfH8(>rvaPy-uyj2zJ6}M0H5DA0Nq1LL!{~_UWXdj1_06!kx|h`@*U5J zHzL6OIsqV~l9s0~-(=MMv^&=Zyk(>SCY{eoBUK-967rpskbf&lL&O`|h-m>OorxCq zZbCAGHi9>z9%?`~<-!cwhEVlut9}Lu=gT@oEizcIWxS}V`Uxii4{*NJd4PMcYXisA zT1EFzTpO~8x9R`4E+boleG+f|?$=dDN#2KBr>dJ3mL>070@fM44y%#&+0zhlZFrkY z=^Ix9w2|xq6JaaCX^7e8PQvU18&bCbv=L-v5g|LyDl~&>Gq2v8`tc-LBxfwFZ0C{; z;LH6VPr`kv!ieSHSKX$~`F@?&3fwc&EkbE{&$M5qZRZa|`sH?u7E@9H0000kY%2uz!_OeuDK*Wy^VU&FM1%jH?i?Y_6KufffaPvE9kEe4^(H*wGnAOHt| za}$HRiW$tQiDg2rK*4940m!ThzKOx+y#ftU-^ySUgP0F%;$IxJnwZ{lCgvvu15K6J zFwhKwfu_yjaaCGr$Y7Md26zZjZyA|r8`~Uc`$lu1yz5L`l#O$i4>X~ToOl*y)}3zP gzjQVWJO^2K{;`ThMVSF$;s5{u07*qoM6N<$f;miQumAu6 delta 360 zcmV-u0hj)P0)hjOBYy!&NklLTz~DP#Eez463YfE8&N~Q zHIV?x3s#9K^x);tE*t0&Ug+XJs!d+N3zzFIVrnYrtZh8$>EeuW4hwL(_Eo?$*aXKg z?p-|Y2@_mRVpaYB)}>@Ea4uqX-t)TJXvya=Rn;XOR@kXHH@zEY&IoduKl_NfMJxHq*iRKtoN1- zVB7rM0vsw0qZ~SGxAOv%@!^CWAyLWz0000y*aM$JutntcDna=zOC`~HMq<2N!;}4%^-C6CJwp*1mFO0 zZenm(F@rfZu}a7lDELemfUK(En;2|T$NUuG8m<=0se%jw~S1*jWGw>zR?^g?>f^KRpVUc15IipCtihFb>}ef gU%HwFo`b48U-t(l+rU*g+5i9m07*qoM6N<$f;VhthX4Qo delta 367 zcmV-#0g(QI0*M2VBYy!b>!3`JiBK_av`gV!Pm(7{(IkVExwJwgr< zphJ+(MjJ1N%nbu>KQA5T^p5}L+5^hQu=YLDiIA12oeZneOfq5y) z3s6J%N{TeZ?FHNkf|KGV3tOR=!tNZTHRYwiphbgL#adX0Y&41zElMo+mnn}Sd02BY1Noji{^ z&1|(kH5kCw_dj;R?J`f{s^TKt_po{2F2g#3`Ax+nz=rAA$wrI%I)Bf31AzjNBYyzMNkl62Fy=BZ5 zg#<95Sk(g&m^NvdQfz+q=D5E1!1UVM>E7G(;4@(WvZ{h_VzBv9frhAWWw41s%!f5`4qsYLOmF!o<|iZrO_kR$ z&r7izjdPU`G^vf8cok;Vox{L? g>1q~u4yx{a0nQW&w7NJuKmY&$07*qoM6N<$f~GrdTBYy!-Nklb>!3`JiB+2Rs-@LU)Hy7>qNa)_R_C&(Q# zbqF$aG+HAI6$3&Co3iYnTx=2i{N(38y^4Sc$I~jJ4l9H0TE>Hh`aa^SfCo69nk?YH z*tLPKU#GZT6xW8_#GCs6oy)*RuqW}h@BUn6l;C~1tg7nfgyqQlm4H=)$6+qfRqh zsZR+8@a6rxUbvp;De9s)3->*4-q-WEPT+oHHVLp{>U!B|QC{Z{f}!Q$fb@bI00000 LNkvXXu0mjfgUhl@ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_planks.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_planks.png index c5e1b5518efbfaa2c1c7c7aebdb521c605a9ac50..fa89c7e5e21071f3a18a797d274596085fb4c192 100644 GIT binary patch delta 226 zcmV<803HAF4E_O-B!9(8L_t(|+HF!X4#O}Ar0(CkRb4$~$#K|p&S>e;kO^`Y3$IBp28c@6>2fgl8~CneUY%)~dy?`ugM_`O(2l=&g~9Evb#V3r|f c>M4`?05a;!VJD)OumAu607*qoM6N<$g0v)R+W-In literal 1649 zcmbVNeQ4Zd98T*8bGF6JwQe$NOs8~qxx7j4a+lcK=O5Qd-60*O*SI=$LQr%TA^aLvneO zJn!@TzHg+n_eDX}48fGv zHf+J};f|OxoK{4Y+OwN%&PkX+hmK6<^o(IkxgeG2mGIhq%}`_>;-rIAiz`URqn%_3 zS&;O31X^Le9O)N5tN=vLyNl!i>t}$UVR;&`5)dR_B#Q@y)hsnBb%pm8weVArN;!@x zF-$g_^<;SuviccT6h#Jb49C$JLEA%yBj;$tZYVK?p{-b&>1fCxT}C;92Am*;EiJg9 zn`K(VE`|vQjLFF+!+L=0QXZ%(Wt=%+W%A;x!oUpFq2bsV%a*Zb3OUG5p?{z*f4)ip zhc+55Yh2S7T`x=6PU|3cqZp8DqV3p_37IZvqXA2St%KOi2G<)?3RzHgkQGBHQ%Y24 z$z(DVauX9E8~1C5in8|3b$eh~c3_a=00(H`r#UXh`XqdMeNBLu04PACNY#=<>!2)0 zb8L+DNhXB&86_APWm)>-fAC(Wn$L zY)3W}7zqa{?6ybKR7p-IK_VdVbV7iD4hUX_7CA0K%WOgcA|LPyepuQcM#_MjTz7w= z&Q+vfj=xl8K}iZC;Amb2Jgo>`FCFkFl5_wnKxTcw&wB$Uwnr=tx0;+;&+1yGUawVd z1G+ULwP`la-cYecy5Yg%Dx;D4vXErOE%zX$xOs*uReY`e?|2kwvnhy4|0Vean2nN7 zR<>YEKaSn?)E9&8XWZT_xWfG1%lx->eO!X$;ovUIQwcwm=NdHdFthN~O81=JOb``y zk#I|_@ngMfw&o0|I{e{7Jr7K_gP+CB4^_LWz&$&J`ELi+BcqdtCSN^t_uH>*X^xNF z^?r7D$a;6{`7x*Rw~uc8?BrLcHrY=RwUcu7x#PmhNaU^fg#(ekV?8g{ynJ?N`^vVH zm)BmKK9D|gb`VW{)4AZAIsQlY_@=7IR$3aI*0$&0X=;ks)*I%%tCdyf>w1aEC`nw> zS3YPQtLJyjzH!6-tM83ow(2kb)LSv-KQxxQw7u`q<(7qm8>Y`t{ws&;V|`0+ZX9sHK*v@d@Es68e8hP~VXFh#>DmAz8?1{PW=f+o`oUXYzlbdg? z`|$;5vNCdX3pKF{zGzx(`TRcWlV27e-~4-J@XE~c(q4YT{Zojvc7%`Zed6gq0ToLr A2LJ#7 diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_stripped_log_side.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_stripped_log_side.png index a4564bf67c8b81b39f64c7f0f28921bdca4a39bb..c0109808ebb09e6daad31f1064dde73b2e21fdde 100644 GIT binary patch delta 210 zcmV;@04@KO5$*wyB!9I@L_t(|UUgEt62l-2GtDn%HM9EX^oDF%?0v z9}|O}?JFC7>GQxoe=FPFL=V#6iM*ce#tQQ^0rv@{ z2sistuL3vS=~+@QOMCl|sh6d_eL{>UTpZ)B?DNyO&WXU;|IymH0dW7((`_2si2wiq M07*qoM6N<$g2zQ<8UO$Q literal 2197 zcmb_ee`wrP9KTs)Kk8~hWn&>2Yu)VXP>;*y zCHcJ1=kxu(?>Fy8+S?vnzi!jIP$;y%wI$v`&eg%O<~H*C!oieCPHUZ(-CihEc~@|( z3LSlAV<@z`-t6r5yAwMU&CZ08ZmT$)%Qyrb3f0x;9HjMOpHgwsv|{w{lc#CQ)MIp4 zBmomn6Hb{egD&1R*w(2H_Gz+C*Keijata~HU>{MrOxp64T#U~1Dr6koW@su8@%v(Q zV<1R%C)%kd+r?BQECP)cI4UZKSrN*d@Bqa@Hp;*#!}0*K3KSJyrive$sJXhKbi}t8 zwa8VBPWis0FibX^4QKhV?IsykmSqNV495Y20N#M*qa3ij+7d$?dzx!HzG+)jz=%}4 z-;dG6X(5D+Q>L}NVwy<8m>hB#HVlK1@<3fHg?!AuAC?0#3n&3lN=+8`Q7X>u|0 zZMW05)1`%KFIlFVnu3LqsLfrbrQ2EW{v~s89Qim#bC81oMghllvJr)R1#t`H6$lH^ zgsq##z!E6S0gerzP*Mc$Iw+|c9r@@V!MdgxwwpmDW;275m~pHmO_ejLG}&p}CBnoV zpLdZ+D6N*~BTK`r@fc0Q4x6T~uv|op7++_N zs2QRRiH;6=poxM2q^N2D32P9s5g6qKsg4PHg-}q1QGu3OSwCOFN{boz87R8gg`X(< zq4GtmAT4Od7_9|Wh;_Pn+gxU~ZYeLt`PmdEq$`wWLEWhB`j0Is@?LzSn`t{U6F-}>^IixYDdBaa`M zc>dT&=U=`!H1z&->d)8D&$P{Zqu+kqJHGqi*OOrUwNJHr@1cbYM{n=hUfaB*irv)z z&D_bg?@haxMyrQ^sIO^mI5XCkXd6jxsJL(Ep|0MAuMUj+>=$o-J{(*9T}8FA=GD;; z8iq$_K77ZhnHK3wC+ht8uZQ4<*27hI-aBPJGONCOc;VpQ7vH!%l{q%me)(Co;g7M| z$HXJwpSb&;ik~a1pW;M1& diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_stripped_log_top.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_stripped_log_top.png index 124910a5fa01c50fe224405f5ff8d306616f5223..5a9c4c75e9772af0848449751af048e2f62b9b0f 100644 GIT binary patch delta 194 zcmV;z06qVn65aujB!8tzL_t(|UUiZ?4gettM2%k4)~%$WGM;`5`3x8n3P1B;KuaT* z*h?a9@sPN*z3P~?e;#AjF&pt&;JE@I%8BbB2qvwON0P%v8mVoi5ZZ}_Eo`P#0-LFjIXv w;_z7aGwYO3-V%~spDJBR1$Pqv98S#Q2aXHhWN5^e)Bpeg07*qoM6N<$f{tQO*8l(j literal 2334 zcmb_eTa46H7#=nxATDTt7(yhJt`7*F>FH@Zy)d)5%q;AxgX=Ppiw|&mdOFkW%(S-M zo!Jd4Xz&(8MtFcACTh5-AtInYhyfw`qy!}R~cOL(Zgmr<~$1A3w=+j+NrqDp{EI z(zM|8jrnxV*yJFYo4(Rf7SPXo$ILsaOt-YKpJp8tgh+7I?015)P&Kp2#7$ zE<3=bU7vDFJOPL(BTm)hVgl+&et<(zR0XICq6DC5z=R>`T=T;-Z@y(4gPE00U+gZ$ z7sAjp1ff!?#4A$V_49(L>$(7ufDm97AQ&x&xC+WaR|_FS1L8Yg=(uGrLd2#!9Hw~2 zv>~D7wPDLaGfXUCLKS<07>ALhx}indcHXdGtUI@eK#R0Q%VEH5#kQ?ia6>mJxHo}r zKfcZZ3vD*r_Aw!sQmO4C2zy7EjAlS4v<`Bk9u)>@;12tQ_Kq-`U6C5kNc$9ruAg(= zVk=PtEy`Rv9VJHN7O!>6mRkw#AGe2Qa7a@;f(Qbr0)%p+Vz95QEQOK*VZ$`*T8=$B z&QwGIiIFMP4Fs<`YKalgd|ff2BYf=q*~N;U;kHu!4QslV=q-nXVLW#y`L# zw`Py2j8ue8py&t#D#{8l3A;5FMO1WILqxG#>c_EfcCpO5-9T!qi*J*CGdQGx%X!M? zj=*H$crx9vzFbor!_6JQ2A^Y zFWMRJW^?>ff2Jq5_-tv%@mbHo&fYnT7S%SrF?;Cm_a8p^^4Uup-s#LNG2cAm{=ECa z1If+);e{v0k_#T+c<{{81>1i=r*F(2{&UXv?iViDcJ;syYfpT0@T2X!IzKr%Klk*P z&n&%oS$(Yb)3H4ZmtFbxLTzjMgAYGj1%I8VcD(ZX$~=Kxou@Y+nmu6c*#Fjxn>+uo z4qe!HWX+Z<&(A%#>d@ZUlBHKa-LlX?T_Znk-M;siZ5>m-L#O7}?!E8g+^_d_?@LV; zVoyCmr>-14cE|3c_t?dr{gsFO^%rWdDK8v7^VO+B=ecRi@W|V_Vlo1Xm#pw#=? diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_trapdoor.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_trapdoor.png index e2acdbdb48fe519cf2c87dc084c7f8656d959cb3..20c4233cf42c2e01655c1a987f88fe73ead3e926 100644 GIT binary patch delta 244 zcmVUhfWpKBRt{$>79HPQI(jJ^N52+JVDixIKr*GOpX7SJw?8 zin6i*MNKilW~`$SM+-2`jauH5hdsl}0yuR|?7&n21p#nsOKsX11t=wSsRa}hr~E99 zu0;!=$vCMVn;)zO0onqNfYuOmRS0AL0novPEkcNph6sUSzy>L^^V*%A9ob^pZEXXCrL6&jMrQ8Z*&Vw(Go6`b zw**4PM8Wtd{Gg-~lKP_lz^Igm5K1($_`}e&QbKB4MFdHFG(m%y81T-%iVBKsGCQyD zeD{3cx#!Hz`ZbSFFMX&K!?5Xfwb2H2p6MM^C!+uMU2z_rO03$a91NQ_%R44uo%`ls z*yOo-(|UKkv|0pa(kH8?0)3gJh0qwbd_~5RK{Ir51;%tEOpKj4Mc}#`Ce{TcTCyTA zuGen1VdLgCO<;2~2&u%1N_=@nL5rTAD4Oh;PhO?-^5QPq~b<5RF1NRtZ#Z0+j z0%e+$khF@lhLg7m8AfGfi(-7VCn*cG;-+glaq|xF;_JTzsh~)1rR+pDV--*^0h7>h z9fW0y3m|JHsR+MqF3DsO?YPyOkc_+`w?#Wmtrnyjpktxor6kf zE2y$7-yPUgb*=S3p+$eih?y{L$y8Au9D%Dq)J!`mBQNx%9D|f)#IjjPl2~Uru518U z7Y!3gwolhpQ4IoyRYD3GV1Y`~&<{yP5d0*k1we?C1tCbQh4`omQeK@3@#_DKf5O&L zbIFN&=0Qy`uDifeg%mlcdQQGYR?4ybRYI@KwWDeRl+4Hy0^smfHNn;T;FI4F4qd_CEUgGOaIgHpBhabG2~@T-i2p_e+zu zp7T99#l6|`=Bi^|ANOwP+-@8mn>v#D=G>~q9c_y7RbN-+`7Fg|Z&ZWiAoZkPz){AYU^S&6MpYxxo-+SY~PCov+d!_8; z`LePX_dnKH`LMfk2U9Z5ClN=wQrH$J}Q}Z#Wxv9UWPK{j#Tf;Mmhc-siKfdQJ5G Il^eJJ36e9HdH?_b diff --git a/src/main/resources/assets/betterend/textures/block/violecite.png b/src/main/resources/assets/betterend/textures/block/violecite.png index 7b3f9b76558aeed726f3c074de97640c7313119a..d919a3a5e468d581b2d44114d9cc94a168d3c156 100644 GIT binary patch delta 28 icmaFM_?B@(86)Gw@-%_S<962=fWXt$&t;ucLK6Uzh6#xP delta 28 icmaFM_?B@(8RM;q=d#Wzp$Pz)Pzja* diff --git a/src/main/resources/assets/betterend/textures/entity/chest/jellyshroom_chest.png b/src/main/resources/assets/betterend/textures/entity/chest/jellyshroom_chest.png index f97aefdf6326c4e82a3a5f9fd175483dc7a7485d..97fb2ebfaa807f73566568bc2f63758fa6538985 100644 GIT binary patch delta 2528 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 m>s;qL*SXGhu5Hh$IF1J}P6Z>ia0000^&ca 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 IM6N<$g1JAYEdT%j delta 3002 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 W!aI?%KUM$$00{s|MNUMnLSTaO;L{EO delta 2315 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 LNkvXXu0mjf@o(96 diff --git a/src/main/resources/assets/betterend/textures/entity/sign/jellyshroom_sign.png b/src/main/resources/assets/betterend/textures/entity/sign/jellyshroom_sign.png index 57f3fe3d59037b1f5da32524e18d5b29ac1bcdd2..f16e9528e442fc93f3c521ef2a9b233e237aa3d0 100644 GIT binary patch delta 799 zcmV+)1K|Aq2(<=~BYy(?Nkl6z)nvLBW-O!-Wesf(R~r5J(@ms90CU zwuwy|&BKyc;{y^+O7mznHc6Avqzz3`tUvEK-!$iP5`^A+U3lB^!pF>+nRAo*=6vVO zog$(s;A3w{K)Th}?MCO2lFc4PciOa8Ytm|YSI=qe^(j(oQGZI!^ZI}7&--xvuw$^a zL*dG<2Ks^GHigxX096=0v`@0tLxw|V?aGmMrIt~SSPfKLdglWrYYr{*Pp#{|d_ zL_bt%P_8?m4}bed+UC$p)VuUvjqzH{XZHH!HGjth;0O3e@Dk`M_O)Z#Xfq1+d=TNR4IN2ih(ieph41lz&&P)M9aXLdBz>3Mb?>e^&%d zmLdRQ7ujy=FoP~R^bn%3Q_WM`YyOT2kj!%uLXC}nX;WNj5y>an=#9Xw#S=gXg}*0^1NuIGR+yiW6(yj9;>!>H*x2PkbL2cXaE?E1Tk01hSA z62eT{g@3^hDkwA(#y)w?-_<=pY6vew2y)GZo%q&Ob$2*cnkL~De^&%d)>714 z*h$4O>|AG{PleY>c+KBc4q$CdJ%`G5t>u+b{m0#3u92|gk2}27tORRY+Rw5DoeTVt zl=Tf@$KUnG(2e;Z0XG+8bbWTw`nWi6a81C~2Y*k^Bmf(~=6gX`?)fbO(DL|&Cjgto zW-Z%ny^OtVlHU=eWZ?pPHth5$Z&8UE;Vax{VfZ1_*% zZv+98+Lz&f9xp_WA9?!dgAh~(z8PM40_5q-ioiERV+r7@U=#r?0eLSl;#**n1fvM} d{}>ql{03nG&;nj!_#yxR002ovPDHLkV1im~k{|#8 delta 1129 zcmV-v1eW`?2K@+-BYy-$NklXP~;h1+cJuGFhE)4W6s4NEWpuchXlS4{2OCZj@XT3nx;Xw9hN0=R|yWFGlr$_2~@4l#Xr7zG=P8o zt;fGNRDS?~S+eNeXMLR~3(~U0bjtyEM;2wPxV769WoBFPGT*FlJ7d)xSf1^E5JLjWAd#daKofvPMJLf|+qo$2V> z7Tb2vt2kd&C64RTwJoQU$+`GRR!|npe50z0cz<`7S}F201(q=!Mk915romX_=5%b>dRxEJb%f-{$8)OBQ{JSymM%uV&bmh3C0_I}AMHFk~D@eWI#VjV&eH#vkkf0GqYI!Tuga zrGJ?GJ!dBhIN0Aq>y}C>lB|FXq_5dGp75&B(#RhIcVP_d5W%leADXcN#%^w|9rY;qa6+nc_N;$x0>EDT`=enPRzjt>mg$>2YCo>C2qhYW zZ=~icYMOs_0%Qte%&CSHq)|LO#ULSMK^;xr~7fR{;E*&NzL1b~M5 zS0+Ge+F*p6j(@T_^n970tKrmIR~t(Cv(ABDWUbRSYucb6llpi{s@u17ZG+C|(*Ct; zfYA}Nt|L&?;})KPH8st@76DtWh}Y19kZzn}uxLH;ET6Uw@~=!lj(L6v5V`(4y3YD7 zU&l36XIFWf?`YEF9X1;)Y3}#-SwKKxz;-LwnH=H|^(o zX~$A)lf^a~;$M$|tzMj3?O|;=vj-8mPoiP|wQ9gd+fvW5)^MCy%V&GBN1~K};Vdt) z(YBnQTz`-{4Xwplprn88pP}y4FFKh1q`kvCdb1za{<-+ykR#w-|A&7B;DZr)CgANs zLcE6gt0w>-DbpVWV2!iE8v;PZ+?e; ch4%#f2GQjrOf0L*)&Kwi07*qoM6N<$g4y6@bpQYW literal 2709 zcmbVO3s4hh9uE&Gq8wl?Xc;92dy2Bz-Mn`tJPc6a49`&D+QV-45ps}hNCJe1#i;nG zCyH}z>5V)FZ>k4g|sAPVFP5L5~yQWzCN2#O;TT!?Y)KOV4Vq!>Ig zJko9p%;dZbv)O>da9&;>KTpVKjT#umFbqZnus{F-1Z2wBn+Xe~H~B9xgwrO{s5O|i zte$IQB-CtB5^MZ$Czt)um3 z6TqU2SVIPDW=$FFuTU>Oe#!s{tx~yYV@WMK-J%JTIU*OhVGqcXXp<`6K*Nc&iOn&R zbVM$Y>2LGKfGdnNVP=ggmd#p7RQ!Tuu0ml;jEuWEMXRUSJX63EYv^#oOv`x!M1Vl3 z07AqnTjIc9v=tHJ2r>^6Fh$}FYt#|IXRVIV z(6B+T;c*uui7VJF)(8v(b;3CnN+lkxH<<}NNk@mvdBAPHR!iZiS}37q3K81B&$so1sFvPqb4w+7(yfx1e`=-h!9Fd5Jr34!^v{+TSi*pRCXh>$y<%!`=FePC z=Tig!GHY|so_Oajz`={$HeB36z+`a`qV<5<2zHn?k?VSx!7)Az1p9b+U>BVOA!R$ASUwmF^Ko^>p>##vkzP1D!xkAB_wlBz?D6RHx$GY%W^xbew_;Pxv?feMt5_EdTLG{D=;o#V?n3|t%H;n3*f6i-6Ke*!Hqi>sY zodl=KYP_RXNjG1y200~vbTzge-YK&59oT5C2_2|?_)%AuU!$+#jh3inm8qlYbpOp& zT#r*%n>3r6k3gN$U}JGl)@pY9Yb~boi-pr>WAMz0E!CYm|0?6xgWeAZ_b1i9llte- zz5{_5suFX3O4u{Iv%8O{O>B)B$>YR^ln(U zRTL57`ERSJF>SOcDha91-@h+lO+QtX7)m|7C;NFu)OvONL_GfT zKg-&`_W4iH2uMgZz zwhlJx(H!6QEzVb}rMvEZT61od$kC~_w{|Sv_};#dx|f1SmYwqN(J0|cpT-S`8ov9a zy|ySnVEnq9tMq#7?)|>5zYFnoNC_48{I&4{JT-gLb>OSfVtL5$;L*t+8}?^@J~kn9 z>1aE<+XrjztN0U}<6RrOw`$jelYjp`3C+tkYXF{hf8M?OFTHwelTzF9L%5^^TDjgqL#S`|>V1 z_T$`}EWj2P`*^Z=XxmV4eY!yz`SEyf*U04Z+B+V{PH!u`#rFwmuE@FKm`qLSJ{gZ$ zmlD@TOw?^@n?4zbCwO<=t1M1RZu+C+mf4g9_U(J6Dy!oCJZS3O-HHi6s`bXoZAr^| zuY0A-9X`-Zp7S5su{H?zT2B=VDt69l&rOC@*AYXOY4-*--_o)PJ7fEBjE;y6KfC?S GJ^uymo9|@+ diff --git a/src/main/resources/assets/betterend/textures/item/jellyshroom_sign.png b/src/main/resources/assets/betterend/textures/item/jellyshroom_sign.png index 01aafd4c18ed884bf043c237932c363fd0be4cf8..8b05048c755304daac7b39d6c45ce1ea579b47ac 100644 GIT binary patch delta 459 zcmV;+0W|))1mpvdBYy#_NklQf)jxTsJ#E@qUEhz!O4dWWTF)l<`wav!`nX_yDk3yB41bI`7g??_!%hF^r z&jK04Y4$NHeB7|{X!a}i{S~HDtNe^QXNbp!2H=fpQHmzO9ph{40YtnA7t1~195hj!hxd;@gX+)$ zuP|iu_Qih%z!I4v8Qwx^e+NK!EDm-T|eo z;X}Ch2~1r10`84bkcAh-89=}cJcL0LkaOwFbh|h*Itg*>zp7NazWjf6!T*+=70+I- zCg%frW+=)Etu;z1thLN^yI5<9!yjgvVQkwZ*kKN&r{?Z~<$K0)_+ku&uDLtEYoa%+CYgSZ?~r%blPoJ*VYN%)5k3=f1m{R3L*)yn`Rf4OxO!!>pxx0SDMo^KD6M()@Bx2o{rS^B4$f1Ii5Q!!i!q-2=AVGk k=z!zzM;jPpnpo%P7hzHGB_;)l>;M1&07*qoM6N<$f`FL|oB#j- diff --git a/src/main/resources/assets/betterend/textures/item/jungle_fern.png b/src/main/resources/assets/betterend/textures/item/jungle_fern.png index b142467308ee5e11479b956e40cdb40bfd2c87e6..862e19e1340d4f07b831530e5cb25dc5e06c2c0a 100644 GIT binary patch delta 249 zcmV9xw$8Z5m0W!@11;}hT0NJFoyc_In1~s5O6eAk|QiH4q zq!y$HEDquz8-k2sn$g8!n!%RB0uE*f3?pmAB?op6dgy~BVR9O`q{=pTEAS|C# z|6ejH2gUgqfrxGZNCQYCIvZvf!Gwga5XMF}jGzJNF2W^;)c|y7B5NYb3%l#z|6dh* z8LSXQ!`R5;cntt4ni_NvLld$%UITC$h6@7#8QguOLjY;g00000NkvXXu0mjf^=4qq delta 410 zcmV;L0cHM`0>cB4Bnkm@Qb$4nuFf3kks%X*32;bRa{vGi!vFvd!vV){sAK>D0a!^y zK~y+TjgrqRL{SvS&owo|YU7RMKfd?9d#_<;`VSN3W!reOQZY6mKtS90`Vzx*ZfYlg zbZZ^MTmUN^Rokw+QRmXuE)bIj?cju^KI{#OwgnU*knVI8|KO;kz z3nf>>FZSgF`feIBSY$_rNklXQ(*a?)b^jD+evx71?JeMhMMRJW@K>$2x?$Wk$~B=G zU;vHDSVS=l@4W*N0$&fk)QTF^KbebvGo3-9C-#o_tEL^qgTZiiD6lbds9{5Go&W|g z2=4Z`tOyXXB%T1kU>rKqa=;Ui9RvIabX-F%r2=P&F*!dG8sZT@8Kg*P*cHr99o z&-Gh+e2Z*6I5uiM(D^Qsr>gB>?wq%ar|mGk&dl@!{YXmACFiy+00000NkvWtM6N<$ Eg45c%OaK4? diff --git a/src/main/resources/assets/betterend/textures/item/small_jellyshroom.png b/src/main/resources/assets/betterend/textures/item/small_jellyshroom.png index ac83ee9d6197a86cdf5b1cab3e7e3eccbb25fd3e..4a149bf95f13484a19a31a0e0cafdc8e602cd03a 100644 GIT binary patch delta 239 zcmVCL_t(|+GF_t|33pI7_a1Zr?>z2 zgna>H5St_eV49DW|Nnop??0HvW)MyT95kZ-S6ePdF$CElf(95$yZ;9n;%k%%#xTRs zU4fzr**0W@&X8_HXupdfEYfAtC002ovPDHLkV1gXdTxb9Q delta 407 zcmV;I0cie<0>A^1Bnkm@Qb$4nuFf3kks%X*32;bRa{vGi!T!~0I{LhU4!b(&;S4c07*qoM6N;tV1j$C Bqn7{x diff --git a/src/main/resources/assets/betterend/textures/item/twisted_umbrella_moss_large.png b/src/main/resources/assets/betterend/textures/item/twisted_umbrella_moss_large.png index 7925bd0bd237ff5cb6ca4d8850a5f8eaf9d51dcb..7bcb17737520adbf37a1717a21ace0d218a266c8 100644 GIT binary patch delta 229 zcmVW2!r@)-828o7dC>~>Miwfj9%9ZAVWYHq!DBQ$OYJ3 zhc^t6HN#v4GL)bf94{a=!<-JoM0)|30oc5OGZsKjhZzDB$L0;Zv4Cs{EMSRBNHwks fa18SfuD}KW7{|OiGVQNf00000NkvXXu0mjfh1OwY delta 397 zcmV;80doF<0=EN@Bnkm@Qb$4nuFf3kks%X*32;bRa{vGi!vFvd!vV){sAK>D0Zd6m zK~y+TWBmXBKLaIz2} z=Jfv8U)S>=L_>wZKsu=qXH1|Na4n^n@$1#M46H)`89)Ys#2(20XJ8c&1j}o*Ho!3q zV2wtV=1Q>OpZA;$>{1d8U#?we;J1a3P5gcVKDp6mZxw-SOmX=#R!H02-LbM rLRkz9i**vg;c>Gh4MigaFfafB5!SpkXBu~400000NkvXXu0mjfQ_7~` diff --git a/src/main/resources/assets/betterend/textures/item/twisted_umbrella_moss_small.png b/src/main/resources/assets/betterend/textures/item/twisted_umbrella_moss_small.png index 401762f6ce6339f9c815f98391af01839ae45a66..67383d2d9ae4894e4e44556de8dd1f6ffc0f0ff6 100644 GIT binary patch delta 274 zcmV+t0qy?K1FZs(B!2{FK}|sb0I`n?{9y$E0087kL_t(|+TD^d3c^4TMfVh1rVs)) zsl?tw3&Gl32q^@y(>7Li8oYpDrDw3R$PqlphB)#k{IFRg1new^nf){W%`U7F5%Wu! zKLg}>ZmhK?4%X5dFv_F~0Pf*KuAMSC)Z4DKCU_QgD^Cpo^M7-kiJM`LE{V9{q9~dH zFuhL0GN%L01h_!t4?sWN>Gc5EPj3p~^#LFdbI4x-sF(Az4$zDqb)2C$0?Cz!EeIg1Dcl5QxjPS@kYZ1_|IX_xZ7EyK>&ZDZ)W`l Y^yGlvfDM~e01E&B07*qoM6N<$f{K)RX8-^I delta 423 zcmV;Y0a*U60?-4HBnkm@Qb$4nuFf3kks%X*32;bRa{vGi!vFvd!vV){sAK>D0cA-< zK~y+TWBmXBKLaIz2}+X<2AKhW{`_J1{rfjVkwP`m0mI~Uk%0k*LEwzerTE8eHyYv}B>`kmsz+x~y2*3l4`V3&(kO4>>1dzosT!0Pydj1A~Oh1r?dmRq28URuVaz4npAm_ut-|zRqG|WH{ zV0yF(62~w>P+)=?NI=f79c&8B=`cP>FB3@c?cJXLAVH9AAX|Svd%^JMJttT(41f#< z$$h>07R(3f0qJFuFfC>T34#P*Y%VQsup$ruxeOGbFwG!~Kx#p33DaUm0IG))qX}JT R{yzW!002ovPDHLkV1g8kwVeO} diff --git a/src/main/resources/assets/betterend/textures/item/umbrella_tree_door.png b/src/main/resources/assets/betterend/textures/item/umbrella_tree_door.png index b502d970a77e4bd5d38369173f8c5f561c29b962..3d877603e385d56cf5f89161beda12f7105dc512 100644 GIT binary patch delta 194 zcmV;z06qWk58eTgB!8tzL_t(|+O1PT3IZ_=B`J2l*-X5?K=;Qkn!?I$yT=S{-@%=IqNW~0R zpn%%k+<{hB0E2fMfoRVy7a4v6kwDFy13R%x=$e5@s35wb`8&2bY^3fY#cv~Zmtpz{ wS{vzx*T%jf78`f3vVNMng);eeBY)q202yL=!)D(AzDQ#Vw}CNHj>2P!QRf! zKJ&cK`@HYY>>tc*Y+HKgQifsLQUl2$dcQfkZdgSBS6`k&^tQwscr0L;Ww%DxbD8cNg1PH7G%ugov${OHN=^6I_kgpyOzo=hzw~+>zjVqJV5J zJ;?UCK4F!Z3a}uHY+R2CD%3@JJu5;X&ciq_NB{~3R1HaI8$XUl^G(YbN^WSxqE88~ z7>1s~^OZ^^R*_<^U*H8@*Lf)Nq6jDg1fx!fs=x`>G#Qd4z`pH;w(GDFBg(tOVS=Md z>nW7I7OfLBY@&woRpjwP3`Qw6f$8+z&~mwj4#NHs8l|CkM&ckl>Jfg31n#hpN&g6O z!ZpocUeOKRpy9mn@f)F{Fq>>4aii+8`X_$%#Em43#6BP-Fs!Tv$7fm3maZ`w^ zGE`(-(?!=OT|69_5v{LxuIXaR(K6H^nxcpVA|OLbX+hZpnk1?~l;V2y$|PF8$@Z{s z(~k$0u4Ro>nUqnAV+G>44n$oS0g+_^Xc%E&5=+RdSXD5QIQDAXKDXrhY1gFg(s>gb zmg|=hZ6Uji3WWEZLe$Wdon|p$2ef*ljZb7V+1VJCY_`^S2EtLhCpa9{nV4K-+MdC^ z`RT0FR*Hm@&Qbh2EO4!`f_&0bpia-Hzxdho2WVt&_4BL!?CPg=8Peb!--y0XnE2#bE8Tc&c{U|51^{$fv81|iiibN zOVLzQ(&Kp~)K!%1|KdU_wp1O8Kr*2Ouqw+yi{~w%5e$)_z_=u9*KpNxt4rkP&ZUOD zW(RH>L$~#4*g8+>L+eB$4mHuI=gsllsVnrX`Zks9$!aH$Y(9D8o(Gp-h#lSY<-!#| zezyJBbCp;B+`BFP+wLXL?0fg(g7%(I$2avZefsc-b)YwyThO-bmdvW>?|tCK{mh}; z*~u$!@yfaNdnf%zyO&&le&xB&#k(G1)^2@#;W~BbySoQB>YE1l9scU?Gtce*_@~d; z{g7KRe&nVP-(K|csW;wSa4a!3(7wEMQ9k>7*TBw$9~^pb;@Q_zeBPM4 diff --git a/src/main/resources/assets/betterend/textures/item/umbrella_tree_sign.png b/src/main/resources/assets/betterend/textures/item/umbrella_tree_sign.png index 08aaedef4ed64503c03ab799d84e651168cdf2e5..e6500e03d050fd8a21ab42397a8d911aef0a7632 100644 GIT binary patch delta 418 zcmV;T0bTxz5W54ABYy#cNkloQxPnqfI7CZ(5ndO52wWJ z9_M(RqaXA`CYP6&-A!^&R8{_B@^1jnc%;6$lUGf?Pic{t0b~D6hJB5WhU&I^8URSV zO*B!tQ@7RASfiuK?oi|HzRF`=-Rz;tQI)ZKexvf-R7qun0Dtl6n1_**OO4js1dHtK zsXR5jqGDNPE2naN!Mu|x1Oa5wQ>WQgd8m1;ro>m1=nTjX4`sZwu7EAr1u0cn2nDi{ z<~Jp;m}N8L5t$DFU`Qx}H2)%s*n6(X??|ns$?81;qPzQRE%dvT{&jd@MiC0o3eFKz z(RO}KfvqKadVl2&%UGSWYmJw0y;dy7Ai)mLp@v$pLr&ciiF}ExLkx?h57-(EIk1O@ zXe?p_6k8+B6u^IinL6fatGfXJ6qyRKU5hc$V>18&qp1)BV$KFg3%!N;d``buEMzvD zaWk9=R+lOK{1#9YO4@(V^>re}nMfb&8bcS5%(U{c*Z+@!)iyh&B8vr)F71(thq zmx{1xsolXX^>RjDl`#XK9%d1NAIbm^`+Wh44VzREUKXvD+oTGQKxD5;WmW|75?cXo z5k!dV)Ov!WwG5taRMUFO$Y`hG3`M7tR60p(2#RJYJ*zR|(T@tLiM)#~w9brbp(~TB zT$Y0@Nrplpbx5NYL^nwrjYg7UNQNO0f{-c$G6)j^Y2pBb6-u1w3CbQJfGdo^DOAWN z6>{1if6p@flP5F}|erGyj#@>~oTtPp(>ah@Zg5Bgz1mJpVXVT0v@EJ)?T z6R2a42MM6m+H5h6A-(whF$qb|UV_4iCS*vo5h0KT z(IE)FfkG7wSjH_Dr7#A3a{UFmk7f zxUkvSynrNw00;A|CKU=>?eXwzI?ysYXygc9&(H+aXwwM;L+em)>J0{$Mgv>`4D7cG zT!m6xWq*I4^8$xB{!w+(TH5KP0O4{{kZ@_VG~v{8fB;TT&o}|p>u6?x?OoA>UNzu* zoKC)>60FWsIZ!kc}D-9j#5jNK&q3TseUy&lXIJ)wA z@JL&*fK%Gtq~er1qn**)o+0w_Ov=&yp>l{wpHlpObxCl^As|At8|Cg<`ip#$e+evk zy8CCVX1}e$?uY2d|LH!O9IhM$+z?GrQl-R0Dzm1)G~~al7J2sATpEC*VW%u(Qx;vs z<}?f-Y7tH0SL#;RV_4kPJgeDZIP-at%{$hdRMpnpeS8BvzbYl+&`5LF_4C_Pv%04J zRV;Q3YZd}?Qk_>${(4JN`dPVGojO zo7Wa5me!s+Xcer@=g1PiH-Hu_gafuTGQv$ez0#t(d>*7mMcx`Yuel{SNoSMDwEpI(ZT)g7t(q= zy6zvuZ*1w{2QJG*v9|> From 75058fdf7b5d9e83c6d786112ec97eac31274a98 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 25 Dec 2020 23:25:05 +0300 Subject: [PATCH 027/463] Blossoming spires structures --- .../biome/blossoming_spires/house.nbt | Bin 0 -> 17539 bytes .../biome/blossoming_spires/ruins_1.nbt | Bin 0 -> 453 bytes .../biome/blossoming_spires/ruins_2.nbt | Bin 0 -> 492 bytes .../biome/blossoming_spires/ruins_3.nbt | Bin 0 -> 686 bytes .../biome/blossoming_spires/ruins_4.nbt | Bin 0 -> 800 bytes .../biome/blossoming_spires/ruins_5.nbt | Bin 0 -> 1926 bytes .../biome/blossoming_spires/ruins_6.nbt | Bin 0 -> 891 bytes .../biome/blossoming_spires/ruins_7.nbt | Bin 0 -> 2992 bytes .../biome/blossoming_spires/ruins_8.nbt | Bin 0 -> 1239 bytes .../biome/blossoming_spires/structures.json | 12 ++++++++++++ 10 files changed, 12 insertions(+) create mode 100644 src/main/resources/data/betterend/structures/biome/blossoming_spires/house.nbt create mode 100644 src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_1.nbt create mode 100644 src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_2.nbt create mode 100644 src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_3.nbt create mode 100644 src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_4.nbt create mode 100644 src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_5.nbt create mode 100644 src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_6.nbt create mode 100644 src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_7.nbt create mode 100644 src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_8.nbt create mode 100644 src/main/resources/data/betterend/structures/biome/blossoming_spires/structures.json diff --git a/src/main/resources/data/betterend/structures/biome/blossoming_spires/house.nbt b/src/main/resources/data/betterend/structures/biome/blossoming_spires/house.nbt new file mode 100644 index 0000000000000000000000000000000000000000..3741013b2b5892ecec597e692da071b35d295007 GIT binary patch literal 17539 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%0Ayn=FN4rjA8{_AV{ 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_3.nbt b/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_3.nbt new file mode 100644 index 0000000000000000000000000000000000000000..788b433498f0c9e241602f86100b899e69a90a26 GIT binary patch literal 686 zcmV;f0#W@RiwFP!000000L4~KkDD+M9gHD_wB3HG-Cp`1+DoOCdfRi=Q?HRpoCGbw z2s=%;zrJRJ5iw&!vnwqU2b||OZ^myXP66gXW&W3k0MNXVeiQx1b4Ylpa+Pxl%`=BM zE5zzfruyUi9KuRSvnhbn6NC^+#T0LMU>MTF1P)Bt!w?HY5FR@gL3r#~A%ej)2NU$z z7%VShVL}IndU%L=dl-uFgcIrrK5=hp$hL$T1!Pf**y)N~FzTyB?^?~a? zr$5-9!*$j$)Vy5Z=wDgM*|Om5x4s3r3BNoEA!UDZ3Bi50^TTjw#_GG#eV>Q>q^k3( z;_GE0ww^@3JxL<*hOP2)3-rjP@~ILBy)Z%&m7-R=OIaehV-?p|SD}>HcPyWVESo|c zb>>bPQir)%MpqHe9$yi1s2*94P>Je-S|qt_eiAiA8&*i3z~ZQzuhyR0@^!n2xi>o$ z*|K1z{w!@$gaWbj)jluzs%9H?v)ZwIz;Y_=gI^t#?E!Y5CtGy^AFOI+@DZsDZ~6oc z?x{%^y%qR8!L8I=EzcADJoWQA^MAo7ocVdx&+@)3GVWP*k4ze5hRcFw`fqG;%M|<7 U3|mp^>(4d(1Ip|~U5yU_0Ev@N!Tq>}AdU`!UkI7!u&)5xkr{C+p}hd@`^0a38E8Qu~G+%SY#kpyvt)) zCmpDvzRbPI98B(E^tp%v7}HPgUR#r%)w*fFE1u%E6ePuMy9-4(2(x z7;H~-%d?9K(MdcEap>d?t(cUodwsnb!}v$b8`gHOw*?gQQla&XLG-17v3f4l1NHg~ ziEKAa&5PtaT{F0zb_y-4=eO!xS~EJS82zQ*kllixpG7dCze@qp!(rtGvXUm?*xCZtba2`!QeMXgR&sd@VhD#u>T z{n>UUpHJ3YI9Df(o?ec4(>zro6)V~>_0Nz?$=3&!o4(4T;#<{4y+$iV_Z4p;UC>If z0?xMT%(kipmTbO%h*f90siu>P*6OzIHQS0-3m}p=sNBJJp*oJ1%awF)2h!i_T$KGh zP6>J3N5LV{FuikjzAkGvYw1GX&Q`Q^)M~$hFYH}DAiac4EK$+vGw1QtZQq^0-Ar`G z+$kS!9}9L!c{k3iF26!f59?+z8r*Yk4$=1pUnaOW_2ZwDe+wQ^_T$9&cc({wLfS{M eLu*dp?2bzMv-|nwwfett4SxZI&8X+H6951Sc95_D literal 0 HcmV?d00001 diff --git a/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_5.nbt b/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_5.nbt new file mode 100644 index 0000000000000000000000000000000000000000..ee206fbf31bf71d475339fdb3b01762adbb22f22 GIT binary patch literal 1926 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 RyZ7w{`whG0!C4{~006>)v0nfH literal 0 HcmV?d00001 diff --git a/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_7.nbt b/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_7.nbt new file mode 100644 index 0000000000000000000000000000000000000000..1f9fd3c27205a2e141dd469da2bf802d461e39f7 GIT binary patch literal 2992 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 BZPx$* literal 0 HcmV?d00001 diff --git a/src/main/resources/data/betterend/structures/biome/blossoming_spires/structures.json b/src/main/resources/data/betterend/structures/biome/blossoming_spires/structures.json new file mode 100644 index 00000000..d2397a7f --- /dev/null +++ b/src/main/resources/data/betterend/structures/biome/blossoming_spires/structures.json @@ -0,0 +1,12 @@ +{ + "structures": [ + { "nbt": "ruins_1", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "ruins_2", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "ruins_3", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "ruins_4", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "ruins_5", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "ruins_6", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "ruins_7", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "ruins_8", "offsetY": 0, "terrainMerge": "surface" } + ] +} From 46450a1bc849e84b53574424f9f1faad83973f21 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 25 Dec 2020 23:28:26 +0300 Subject: [PATCH 028/463] Removed vine mirroring --- .../assets/betterend/blockstates/jungle_vine.json | 15 +++------------ ...vine_bottom_1.json => jungle_vine_bottom.json} | 0 .../models/block/jungle_vine_bottom_2.json | 6 ------ ...vine_middle_1.json => jungle_vine_middle.json} | 0 .../models/block/jungle_vine_middle_2.json | 6 ------ 5 files changed, 3 insertions(+), 24 deletions(-) rename src/main/resources/assets/betterend/models/block/{jungle_vine_bottom_1.json => jungle_vine_bottom.json} (100%) delete mode 100644 src/main/resources/assets/betterend/models/block/jungle_vine_bottom_2.json rename src/main/resources/assets/betterend/models/block/{jungle_vine_middle_1.json => jungle_vine_middle.json} (100%) delete mode 100644 src/main/resources/assets/betterend/models/block/jungle_vine_middle_2.json diff --git a/src/main/resources/assets/betterend/blockstates/jungle_vine.json b/src/main/resources/assets/betterend/blockstates/jungle_vine.json index ed2bf59d..dca9407e 100644 --- a/src/main/resources/assets/betterend/blockstates/jungle_vine.json +++ b/src/main/resources/assets/betterend/blockstates/jungle_vine.json @@ -1,16 +1,7 @@ { "variants": { - "shape=top": [ - { "model": "betterend:block/jungle_vine_middle_1" }, - { "model": "betterend:block/jungle_vine_middle_2" } - ], - "shape=middle": [ - { "model": "betterend:block/jungle_vine_middle_1" }, - { "model": "betterend:block/jungle_vine_middle_2" } - ], - "shape=bottom": [ - { "model": "betterend:block/jungle_vine_bottom_1" }, - { "model": "betterend:block/jungle_vine_bottom_2" } - ] + "shape=top": { "model": "betterend:block/jungle_vine_middle" }, + "shape=middle": { "model": "betterend:block/jungle_vine_middle" }, + "shape=bottom": { "model": "betterend:block/jungle_vine_bottom" } } } diff --git a/src/main/resources/assets/betterend/models/block/jungle_vine_bottom_1.json b/src/main/resources/assets/betterend/models/block/jungle_vine_bottom.json similarity index 100% rename from src/main/resources/assets/betterend/models/block/jungle_vine_bottom_1.json rename to src/main/resources/assets/betterend/models/block/jungle_vine_bottom.json diff --git a/src/main/resources/assets/betterend/models/block/jungle_vine_bottom_2.json b/src/main/resources/assets/betterend/models/block/jungle_vine_bottom_2.json deleted file mode 100644 index 0f6531f6..00000000 --- a/src/main/resources/assets/betterend/models/block/jungle_vine_bottom_2.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "betterend:block/cross_no_distortion_inverted", - "textures": { - "texture": "betterend:block/jungle_vine_bottom" - } -} diff --git a/src/main/resources/assets/betterend/models/block/jungle_vine_middle_1.json b/src/main/resources/assets/betterend/models/block/jungle_vine_middle.json similarity index 100% rename from src/main/resources/assets/betterend/models/block/jungle_vine_middle_1.json rename to src/main/resources/assets/betterend/models/block/jungle_vine_middle.json diff --git a/src/main/resources/assets/betterend/models/block/jungle_vine_middle_2.json b/src/main/resources/assets/betterend/models/block/jungle_vine_middle_2.json deleted file mode 100644 index 6c0d14c2..00000000 --- a/src/main/resources/assets/betterend/models/block/jungle_vine_middle_2.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "betterend:block/cross_no_distortion_inverted", - "textures": { - "texture": "betterend:block/jungle_vine" - } -} From 0fffaad9f0fd5285de2ae20a572d7fd42cf266a5 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 26 Dec 2020 14:08:53 +0300 Subject: [PATCH 029/463] Ether Grove prototype --- .../betterend/integration/Integrations.java | 8 ++++ .../betterend/integration/ModIntegration.java | 2 + .../betterend/integration/byg/BYGBiomes.java | 16 ------- .../integration/byg/BYGIntegration.java | 7 +++ .../integration/byg/biomes/BYGBiomes.java | 18 ++++++++ .../integration/byg/biomes/EterialGrove.java | 46 +++++++++++++++++++ .../byg/{ => biomes}/OldBulbisGardens.java | 3 +- .../byg/{ => features}/BYGFeatures.java | 5 +- .../byg/features/BigEtherTreeFeature.java | 45 ++++++++++++++++++ .../{ => features}/OldBulbisTreeFeature.java | 2 +- .../java/ru/betterend/registry/EndBiomes.java | 39 ++++++++++++++-- .../ru/betterend/world/biome/EndBiome.java | 4 ++ 12 files changed, 173 insertions(+), 22 deletions(-) delete mode 100644 src/main/java/ru/betterend/integration/byg/BYGBiomes.java create mode 100644 src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java create mode 100644 src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java rename src/main/java/ru/betterend/integration/byg/{ => biomes}/OldBulbisGardens.java (93%) rename src/main/java/ru/betterend/integration/byg/{ => features}/BYGFeatures.java (87%) create mode 100644 src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java rename src/main/java/ru/betterend/integration/byg/{ => features}/OldBulbisTreeFeature.java (97%) diff --git a/src/main/java/ru/betterend/integration/Integrations.java b/src/main/java/ru/betterend/integration/Integrations.java index dd27c4e4..bdd07499 100644 --- a/src/main/java/ru/betterend/integration/Integrations.java +++ b/src/main/java/ru/betterend/integration/Integrations.java @@ -18,6 +18,14 @@ public class Integrations { }); } + public static void addBiomes() { + INTEGRATIONS.forEach((integration) -> { + if (integration.modIsInstalled()) { + integration.addBiomes(); + } + }); + } + private static ModIntegration register(ModIntegration integration) { INTEGRATIONS.add(integration); return integration; diff --git a/src/main/java/ru/betterend/integration/ModIntegration.java b/src/main/java/ru/betterend/integration/ModIntegration.java index 4eafb8b9..03377cc3 100644 --- a/src/main/java/ru/betterend/integration/ModIntegration.java +++ b/src/main/java/ru/betterend/integration/ModIntegration.java @@ -18,6 +18,8 @@ public abstract class ModIntegration { public abstract void register(); + public abstract void addBiomes(); + public ModIntegration(String modID) { this.modID = modID; } diff --git a/src/main/java/ru/betterend/integration/byg/BYGBiomes.java b/src/main/java/ru/betterend/integration/byg/BYGBiomes.java deleted file mode 100644 index d3c47b76..00000000 --- a/src/main/java/ru/betterend/integration/byg/BYGBiomes.java +++ /dev/null @@ -1,16 +0,0 @@ -package ru.betterend.integration.byg; - -import ru.betterend.integration.Integrations; -import ru.betterend.registry.EndBiomes; -import ru.betterend.world.biome.EndBiome; -import ru.betterend.world.generator.BiomeType; - -public class BYGBiomes { - // Original Biomes - public static final EndBiome BULBIS_GARDENS = EndBiomes.registerBiome(Integrations.BYG.getKey("bulbis_gardens"), BiomeType.LAND, 1F); - - // New Biomes - public static final EndBiome OLD_BULBIS_GARDENS = EndBiomes.registerSubBiome(new OldBulbisGardens(), BULBIS_GARDENS); - - public static void register() {} -} diff --git a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java index 50696aa5..d6797d65 100644 --- a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java +++ b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java @@ -2,6 +2,8 @@ package ru.betterend.integration.byg; import ru.betterend.integration.Integrations; import ru.betterend.integration.ModIntegration; +import ru.betterend.integration.byg.biomes.BYGBiomes; +import ru.betterend.integration.byg.features.BYGFeatures; import ru.betterend.registry.EndTags; import ru.betterend.util.TagHelper; @@ -17,4 +19,9 @@ public class BYGIntegration extends ModIntegration { BYGFeatures.register(); BYGBiomes.register(); } + + @Override + public void addBiomes() { + BYGBiomes.addBiomes(); + } } diff --git a/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java b/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java new file mode 100644 index 00000000..c165d77f --- /dev/null +++ b/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java @@ -0,0 +1,18 @@ +package ru.betterend.integration.byg.biomes; + +import ru.betterend.integration.Integrations; +import ru.betterend.registry.EndBiomes; +import ru.betterend.world.biome.EndBiome; + +public class BYGBiomes { + // New Biomes + public static final EndBiome OLD_BULBIS_GARDENS = EndBiomes.registerSubBiomeIntegration(new OldBulbisGardens()); + public static final EndBiome ETHERIAL_GROVE = EndBiomes.registerSubBiomeIntegration(new EterialGrove()); + + public static void register() {} + + public static void addBiomes() { + EndBiomes.addSubBiomeIntegration(OLD_BULBIS_GARDENS, Integrations.BYG.getID("bulbis_gardens")); + EndBiomes.addSubBiomeIntegration(ETHERIAL_GROVE, Integrations.BYG.getID("ethereal_islands")); + } +} diff --git a/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java b/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java new file mode 100644 index 00000000..cec4f4c5 --- /dev/null +++ b/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java @@ -0,0 +1,46 @@ +package ru.betterend.integration.byg.biomes; + +import java.util.List; + +import net.minecraft.entity.SpawnGroup; +import net.minecraft.sound.SoundEvent; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.BiomeEffects; +import net.minecraft.world.biome.SpawnSettings.SpawnEntry; +import ru.betterend.BetterEnd; +import ru.betterend.integration.Integrations; +import ru.betterend.integration.byg.features.BYGFeatures; +import ru.betterend.world.biome.BiomeDefinition; +import ru.betterend.world.biome.EndBiome; + +public class EterialGrove extends EndBiome { + public EterialGrove() { + super(makeDef()); + } + + private static BiomeDefinition makeDef() { + Biome biome = Integrations.BYG.getBiome("ethereal_islands"); + BiomeEffects effects = biome.getEffects(); + + BiomeDefinition def = new BiomeDefinition("eterial_grove") + .setSurface(biome.getGenerationSettings().getSurfaceBuilder().get()) + .addFeature(BYGFeatures.BIG_ETHER_TREE); + + if (BetterEnd.isClient()) { + SoundEvent loop = effects.getLoopSound().get(); + SoundEvent music = effects.getMusic().get().getSound(); + SoundEvent additions = effects.getAdditionsSound().get().getSound(); + SoundEvent mood = effects.getMoodSound().get().getSound(); + def.setLoop(loop).setMusic(music).setAdditions(additions).setMood(mood); + } + + for (SpawnGroup group: SpawnGroup.values()) { + List list = biome.getSpawnSettings().getSpawnEntry(group); + list.forEach((entry) -> { + def.addMobSpawn(entry); + }); + } + + return def; + } +} diff --git a/src/main/java/ru/betterend/integration/byg/OldBulbisGardens.java b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java similarity index 93% rename from src/main/java/ru/betterend/integration/byg/OldBulbisGardens.java rename to src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java index 6c2b21c9..739bc7b1 100644 --- a/src/main/java/ru/betterend/integration/byg/OldBulbisGardens.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java @@ -1,4 +1,4 @@ -package ru.betterend.integration.byg; +package ru.betterend.integration.byg.biomes; import java.util.List; @@ -11,6 +11,7 @@ import net.minecraft.world.biome.SpawnSettings.SpawnEntry; import net.minecraft.world.gen.GenerationStep.Feature; import ru.betterend.BetterEnd; import ru.betterend.integration.Integrations; +import ru.betterend.integration.byg.features.BYGFeatures; import ru.betterend.registry.EndFeatures; import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; diff --git a/src/main/java/ru/betterend/integration/byg/BYGFeatures.java b/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java similarity index 87% rename from src/main/java/ru/betterend/integration/byg/BYGFeatures.java rename to src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java index 39d0242b..8388142f 100644 --- a/src/main/java/ru/betterend/integration/byg/BYGFeatures.java +++ b/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java @@ -1,7 +1,8 @@ -package ru.betterend.integration.byg; +package ru.betterend.integration.byg.features; import net.minecraft.world.gen.feature.ConfiguredFeature; import ru.betterend.integration.Integrations; +import ru.betterend.integration.byg.BYGBlocks; import ru.betterend.world.features.EndFeature; import ru.betterend.world.features.SinglePlantFeature; import ru.betterend.world.features.VineFeature; @@ -17,6 +18,8 @@ public class BYGFeatures { public static final EndFeature BULBIS_ODDITY = new EndFeature("bulbis_oddity", new SinglePlantFeature(Integrations.BYG.getBlock("bulbis_oddity"), 4, 4), 5); public static final EndFeature PURPLE_BULBIS_ODDITY = new EndFeature("purple_bulbis_oddity", new SinglePlantFeature(Integrations.BYG.getBlock("purple_bulbis_oddity"), 4, 4), 5); + public static final EndFeature BIG_ETHER_TREE = new EndFeature("big_ether_tree", new BigEtherTreeFeature(), 1); + public static final ConfiguredFeature BULBIS_TREES = Integrations.BYG.getConfiguredFeature("rs_sparse_bulbis_tree"); public static final ConfiguredFeature PURPLE_BULBIS_TREES = Integrations.BYG.getConfiguredFeature("rs_sparse_purple_bulbis_tree"); diff --git a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java new file mode 100644 index 00000000..b235efd5 --- /dev/null +++ b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java @@ -0,0 +1,45 @@ +package ru.betterend.integration.byg.features; + +import java.util.List; +import java.util.Random; + +import com.google.common.base.Function; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Material; +import net.minecraft.client.util.math.Vector3f; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.integration.Integrations; +import ru.betterend.registry.EndTags; +import ru.betterend.util.MHelper; +import ru.betterend.util.SplineHelper; +import ru.betterend.util.sdf.SDF; +import ru.betterend.world.features.DefaultFeature; + +public class BigEtherTreeFeature extends DefaultFeature { + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; + + BlockState log = Integrations.BYG.getDefaultState("ether_log"); + BlockState wood = Integrations.BYG.getDefaultState("ether_wood"); + BlockState leaves = Integrations.BYG.getDefaultState("ether_leaves"); + + int height = MHelper.randRange(20, 30, random); + List trunk = SplineHelper.makeSpline(0, 0, 0, 0, height, 0, height / 2); + SplineHelper.offsetParts(trunk, random, 0.5F, 0, 0.5F); + SDF sdf = SplineHelper.buildSDF(trunk, 2.3F, 0.8F, (bpos) -> { return log;}); + sdf.setReplaceFunction((state) -> { + return state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) || state.getMaterial().isReplaceable(); + }).fillRecursive(world, pos); + + return true; + } + + private void makeLeavesSphere(StructureWorldAccess world, BlockPos pos, BlockState leaves, Function ignore) { + + } +} diff --git a/src/main/java/ru/betterend/integration/byg/OldBulbisTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java similarity index 97% rename from src/main/java/ru/betterend/integration/byg/OldBulbisTreeFeature.java rename to src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java index e45c511f..9f2b4328 100644 --- a/src/main/java/ru/betterend/integration/byg/OldBulbisTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java @@ -1,4 +1,4 @@ -package ru.betterend.integration.byg; +package ru.betterend.integration.byg.features; import java.util.List; import java.util.Random; diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index e9d61013..2ec5e5e7 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -28,6 +28,7 @@ import net.minecraft.world.biome.BiomeKeys; import net.minecraft.world.biome.layer.util.LayerRandomnessSource; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; +import ru.betterend.integration.Integrations; import ru.betterend.util.JsonFactory; import ru.betterend.world.biome.BiomeAmberLand; import ru.betterend.world.biome.BiomeBlossomingSpires; @@ -134,6 +135,7 @@ public class EndBiomes { } } }); + Integrations.addBiomes(); Configs.BIOME_CONFIG.saveChanges(); LAND_BIOMES.rebuild(); @@ -266,7 +268,7 @@ public class EndBiomes { * @return registered {@link EndBiome} */ public static EndBiome registerSubBiome(EndBiome biome, EndBiome parent) { - registerBiomeDirect(biome); + registerBiomeDirectly(biome); if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { parent.addSubBiome(biome); SUBBIOMES.add(biome); @@ -284,7 +286,7 @@ public class EndBiomes { * @return registered {@link EndBiome} */ public static EndBiome registerBiome(EndBiome biome, BiomeType type) { - registerBiomeDirect(biome); + registerBiomeDirectly(biome); if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { addToPicker(biome, type); ID_MAP.put(biome.getID(), biome); @@ -298,6 +300,37 @@ public class EndBiomes { return biome; } + /** + * Put integration sub-biome {@link EndBiome} into subbiomes list and registers it. + * @param biome - {@link EndBiome} instance + * @return registered {@link EndBiome} + */ + public static EndBiome registerSubBiomeIntegration(EndBiome biome) { + registerBiomeDirectly(biome); + if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { + SUBBIOMES.add(biome); + SUBBIOMES_UNMUTABLES.add(biome.getID()); + ID_MAP.put(biome.getID(), biome); + addLandBiomeToFabricApi(biome); + } + return biome; + } + + /** + * Link integration sub-biome with parent. + * @param biome - {@link EndBiome} instance + * @param parent - {@link Identifier} parent id + */ + public static void addSubBiomeIntegration(EndBiome biome, Identifier parent) { + if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { + EndBiome parentBiome = ID_MAP.get(parent); + System.out.println(parentBiome); + if (parentBiome != null && !parentBiome.containsSubBiome(biome)) { + parentBiome.addSubBiome(biome); + } + } + } + public static EndBiome registerBiome(RegistryKey key, BiomeType type, float genChance) { return registerBiome(BuiltinRegistries.BIOME.get(key), type, genChance); } @@ -313,7 +346,7 @@ public class EndBiomes { VOID_BIOMES.addBiome(biome); } - private static void registerBiomeDirect(EndBiome biome) { + private static void registerBiomeDirectly(EndBiome biome) { if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { Registry.register(BuiltinRegistries.BIOME, biome.getID(), biome.getBiome()); } diff --git a/src/main/java/ru/betterend/world/biome/EndBiome.java b/src/main/java/ru/betterend/world/biome/EndBiome.java index 676db37d..1dc07120 100644 --- a/src/main/java/ru/betterend/world/biome/EndBiome.java +++ b/src/main/java/ru/betterend/world/biome/EndBiome.java @@ -77,6 +77,10 @@ public class EndBiome { biome.biomeParent = this; subbiomes.add(biome); } + + public boolean containsSubBiome(EndBiome biome) { + return subbiomes.contains(biome); + } public EndBiome getSubBiome(Random random) { float chance = random.nextFloat() * maxSubBiomeChance; From e103e551e37dd9c69006b6b41e7132aa651ea3d1 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 26 Dec 2020 18:31:41 +0300 Subject: [PATCH 030/463] Jellyshroom prototype --- .../byg/features/BigEtherTreeFeature.java | 2 +- .../ru/betterend/registry/EndFeatures.java | 2 + .../world/biome/BiomeUmbrellaJungle.java | 1 + .../features/trees/JellyshroomFeature.java | 119 ++++++++++++++++++ .../textures/block/umbrella_tree_log_top.png | Bin 256 -> 1770 bytes 5 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java diff --git a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java index b235efd5..627950cf 100644 --- a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java @@ -30,7 +30,7 @@ public class BigEtherTreeFeature extends DefaultFeature { int height = MHelper.randRange(20, 30, random); List trunk = SplineHelper.makeSpline(0, 0, 0, 0, height, 0, height / 2); - SplineHelper.offsetParts(trunk, random, 0.5F, 0, 0.5F); + SplineHelper.offsetParts(trunk, random, 2F, 0, 2F); SDF sdf = SplineHelper.buildSDF(trunk, 2.3F, 0.8F, (bpos) -> { return log;}); sdf.setReplaceFunction((state) -> { return state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) || state.getMaterial().isReplaceable(); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 8236c97f..a3da81d9 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -44,6 +44,7 @@ import ru.betterend.world.features.terrain.SulphuricLakeFeature; import ru.betterend.world.features.terrain.SurfaceVentFeature; import ru.betterend.world.features.trees.DragonTreeFeature; import ru.betterend.world.features.trees.HelixTreeFeature; +import ru.betterend.world.features.trees.JellyshroomFeature; import ru.betterend.world.features.trees.LacugroveFeature; import ru.betterend.world.features.trees.MossyGlowshroomFeature; import ru.betterend.world.features.trees.PythadendronTreeFeature; @@ -59,6 +60,7 @@ public class EndFeatures { public static final EndFeature TENANEA = new EndFeature("tenanea", new TenaneaFeature(), 3); public static final EndFeature HELIX_TREE = new EndFeature("helix_tree", new HelixTreeFeature(), 2); public static final EndFeature UMBRELLA_TREE = new EndFeature("umbrella_tree", new UmbrellaTreeFeature(), 4); + public static final EndFeature JELLYSHROOM = new EndFeature("jellyshroom", new JellyshroomFeature(), 2); // Bushes // public static final EndFeature PYTHADENDRON_BUSH = new EndFeature("pythadendron_bush", new BushFeature(EndBlocks.PYTHADENDRON_LEAVES, EndBlocks.PYTHADENDRON.bark), 4); diff --git a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java index f9153373..1c62dd40 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java +++ b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java @@ -13,6 +13,7 @@ public class BiomeUmbrellaJungle extends EndBiome { .setSurface(EndBlocks.JUNGLE_MOSS) .addFeature(EndFeatures.END_LAKE) .addFeature(EndFeatures.UMBRELLA_TREE) + .addFeature(EndFeatures.JELLYSHROOM) .addFeature(EndFeatures.TWISTED_UMBRELLA_MOSS) .addFeature(EndFeatures.SMALL_JELLYSHROOM_FLOOR) .addFeature(EndFeatures.JUNGLE_GRASS) diff --git a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java new file mode 100644 index 00000000..00dce3bc --- /dev/null +++ b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java @@ -0,0 +1,119 @@ +package ru.betterend.world.features.trees; + +import java.util.List; +import java.util.Random; +import java.util.function.Function; + +import com.google.common.collect.Lists; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Material; +import net.minecraft.client.util.math.Vector3f; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.MHelper; +import ru.betterend.util.SplineHelper; +import ru.betterend.util.sdf.PosInfo; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFFlatWave; +import ru.betterend.util.sdf.operator.SDFScale3D; +import ru.betterend.util.sdf.operator.SDFSmoothUnion; +import ru.betterend.util.sdf.operator.SDFSubtraction; +import ru.betterend.util.sdf.operator.SDFTranslate; +import ru.betterend.util.sdf.primitive.SDFSphere; +import ru.betterend.world.features.DefaultFeature; + +public class JellyshroomFeature extends DefaultFeature { + private static final Function REPLACE; + private static final Function POST; + private static final List ROOT; + + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; + + BlockState log = EndBlocks.JELLYSHROOM.log.getDefaultState(); + BlockState bark = EndBlocks.JELLYSHROOM.bark.getDefaultState(); + BlockState membrane = EndBlocks.JELLYSHROOM_CAP_PURPLE.getDefaultState(); + + int height = MHelper.randRange(5, 8, random); + float radius = height * MHelper.randRange(0.1F, 0.2F, random); + List spline = SplineHelper.makeSpline(0, 0, 0, 0, height, 0, 5); + SplineHelper.offsetParts(spline, random, 0.5F, 0, 0.5F); + SDF sdf = SplineHelper.buildSDF(spline, radius, 0.8F, (bpos) -> { + return bark; + }); + + radius = height * MHelper.randRange(0.8F, 1.2F, random); + SDF cap = makeCap(radius, random, membrane); + Vector3f last = spline.get(spline.size() - 1); + cap = new SDFTranslate().setTranslate(last.getX(), last.getY(), last.getZ()).setSource(cap); + sdf = new SDFSmoothUnion().setRadius(3F).setSourceA(sdf).setSourceB(cap); + sdf.setReplaceFunction(REPLACE).setPostProcess(POST).fillRecursive(world, pos); + radius = height * 0.3F; + makeRoots(world, pos, radius, random, bark); + + return true; + } + + private void makeRoots(StructureWorldAccess world, BlockPos pos, float radius, Random random, BlockState wood) { + int count = (int) (radius * 1.5F); + for (int i = 0; i < count; i++) { + float angle = (float) i / (float) count * MHelper.PI2; + float scale = radius * MHelper.randRange(0.85F, 1.15F, random); + + List branch = SplineHelper.copySpline(ROOT); + SplineHelper.rotateSpline(branch, angle); + SplineHelper.scale(branch, scale); + Vector3f last = branch.get(branch.size() - 1); + if (world.getBlockState(pos.add(last.getX(), last.getY(), last.getZ())).isIn(EndTags.GEN_TERRAIN)) { + SplineHelper.fillSplineForce(branch, world, wood, pos, REPLACE); + } + } + } + + private SDF makeCap(float radius, Random random, BlockState cap) { + SDF sphere = new SDFSphere().setRadius(radius).setBlock(cap); + SDF sub = new SDFTranslate().setTranslate(0, -4, 0).setSource(sphere); + sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sub); + sphere = new SDFScale3D().setScale(1, 0.5F, 1).setSource(sphere); + sphere = new SDFTranslate().setTranslate(0, 1 - radius * 0.5F, 0).setSource(sphere); + + float angle = random.nextFloat() * MHelper.PI2; + int count = (int) MHelper.randRange(radius * 0.5F, radius, random); + if (count < 3) { + count = 3; + } + sphere = new SDFFlatWave().setAngle(angle).setRaysCount(count).setIntensity(0.2F).setSource(sphere); + + return sphere; + } + + static { + ROOT = Lists.newArrayList( + new Vector3f(0.1F, 0.70F, 0), + new Vector3f(0.3F, 0.30F, 0), + new Vector3f(0.7F, 0.05F, 0), + new Vector3f(0.8F, -0.20F, 0) + ); + SplineHelper.offset(ROOT, new Vector3f(0, -0.45F, 0)); + + POST = (info) -> { + if (EndBlocks.JELLYSHROOM.isTreeLog(info.getStateUp()) && EndBlocks.JELLYSHROOM.isTreeLog(info.getStateDown())) { + return EndBlocks.JELLYSHROOM.log.getDefaultState(); + } + return info.getState(); + }; + + REPLACE = (state) -> { + if (state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) || state.isOf(EndBlocks.UMBRELLA_TREE_MEMBRANE)) { + return true; + } + return state.getMaterial().isReplaceable(); + }; + } +} diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_log_top.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_log_top.png index e796c83af7d026d18c16a5df37f26bbdd41fe063..7455992aac56fc9d7a917cb62bb5c740bdd8aecf 100644 GIT binary patch literal 1770 zcmbVNe^3-v9A8Zx5N(iTGXAJ_Rl;;{f823DcDMxYC_oPBxD;?umfZ)pa<{weF5DgJ z6sePlyX$B`yIYp2)K@w4&ku8^MG&=@0 zoif2MM`=Yh;wI=YBFM@FWgvBv!a$yj;^Z2|7Z%QQ1n>br5H%HIsVG+VN}8m4rN5z$ z9zP%ey4K~2%6OzMet%Sis%6zeGa?RoBwF=^WI(uqD%B_)$f|{EF43)#8HWN`O;S9P zHXQ9o4pRELhELLJ@)RT-u@<|F547D?c zwQ#wZ98uL+kpnqSI|j`*2m;So0B@mfW+QGgS}B~en5?*!G}3s5nJnk6W|}VN&C~at z5?7-Kcltj6Kku(m1Xx_G@3DFGlGC$-$re-?uTZ2Y3PE*b z+K1pK+R13`jtn2XNdT5!%>zdq%eD;r8rCMJgV_pV(q(6aYV*IwGEocQyI zr?&b`hV9yxq{C?qwxqO@_m9?fABnj;klu7Lt@P9DDd%hN`C=FERK8s77@f27LfL`7 zO}*4W(UZ64yw^Ip!$aQLoOgLQF=R`KYu}dO#YP4;e&3@a;N;-;rPaGqGSgeWIWzXv z{KnO1ckNocOfHJ?7j8VaFyU&);o{$Zm~kn2*+8auUuSN6&mY!9X{O%0uBN`j_s09p zLyf@HQP*qPy4h7e=pD&?p>eWoqU}`Gd2j!Mo}X_&XFNXg!G*RZ&+C7qoUDB3q0F*3 F{sL7HYZ?Fm delta 228 zcmVQ#CeR!1n<<=WcMd*e!c1FRR@qDbP&y-t(uU??trUH z${s(Mj8rM-+X7KGj44@PyiE%~W09_L~U>F_$GXX0p04qkM zc67j+PC#xz0UYI(LO~|{4EP-Mjx%D4+(4RiDn=hv-qe7xOMIf=G0XUU4*xc Date: Sat, 26 Dec 2020 19:10:54 +0300 Subject: [PATCH 031/463] Sapling, fixes --- .../blocks/BlockUmbrellaTreeMembrane.java | 9 ++++- .../blocks/BlockUmbrellaTreeSapling.java | 31 ++++++++++++++++++ .../java/ru/betterend/registry/EndBlocks.java | 2 ++ .../SingleInvertedScatterFeature.java | 3 ++ .../features/trees/JellyshroomFeature.java | 1 - .../textures/block/umbrella_tree_sapling.png | Bin 0 -> 416 bytes 6 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/BlockUmbrellaTreeSapling.java create mode 100644 src/main/resources/assets/betterend/textures/block/umbrella_tree_sapling.png diff --git a/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeMembrane.java b/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeMembrane.java index 1f4a4a98..8b3b5544 100644 --- a/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeMembrane.java +++ b/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeMembrane.java @@ -1,6 +1,7 @@ package ru.betterend.blocks; import java.io.Reader; +import java.util.Collections; import java.util.List; import com.google.common.collect.Lists; @@ -27,6 +28,7 @@ import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; +import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; public class BlockUmbrellaTreeMembrane extends AbstractGlassBlock implements IRenderTypeable, BlockPatterned { @@ -57,7 +59,12 @@ public class BlockUmbrellaTreeMembrane extends AbstractGlassBlock implements IRe @Override public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - return Lists.newArrayList(new ItemStack(this)); + if (state.get(COLOR) > 0) { + return Lists.newArrayList(new ItemStack(this)); + } + else { + return MHelper.RANDOM.nextInt(4) == 0 ? Lists.newArrayList(new ItemStack(EndBlocks.UMBRELLA_TREE_SAPLING)) : Collections.emptyList(); + } } @Override diff --git a/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeSapling.java b/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeSapling.java new file mode 100644 index 00000000..485008e1 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeSapling.java @@ -0,0 +1,31 @@ +package ru.betterend.blocks; + +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.WorldView; +import net.minecraft.world.gen.feature.Feature; +import ru.betterend.blocks.basis.BlockFeatureSapling; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; + +public class BlockUmbrellaTreeSapling extends BlockFeatureSapling { + public BlockUmbrellaTreeSapling() { + super(); + } + + @Override + protected Feature getFeature() { + return EndFeatures.UMBRELLA_TREE.getFeature(); + } + + @Override + public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + return world.getBlockState(pos.down()).isOf(EndBlocks.JUNGLE_MOSS); + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.TRANSLUCENT; + } +} diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 28f3db1f..895820b1 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -72,6 +72,7 @@ import ru.betterend.blocks.BlockUmbrellaMossTall; import ru.betterend.blocks.BlockUmbrellaTreeCluster; import ru.betterend.blocks.BlockUmbrellaTreeClusterEmpty; import ru.betterend.blocks.BlockUmbrellaTreeMembrane; +import ru.betterend.blocks.BlockUmbrellaTreeSapling; import ru.betterend.blocks.BlockVentBubbleColumn; import ru.betterend.blocks.EndPortalBlock; import ru.betterend.blocks.EndStoneSmelter; @@ -181,6 +182,7 @@ public class EndBlocks { public static final Block HELIX_TREE_LEAVES = registerBlock("helix_tree_leaves", new BlockHelixTreeLeaves()); public static final WoodenMaterial HELIX_TREE = new WoodenMaterial("helix_tree", MaterialColor.GRAY, MaterialColor.ORANGE); + public static final Block UMBRELLA_TREE_SAPLING = registerBlock("umbrella_tree_sapling", new BlockUmbrellaTreeSapling()); public static final Block UMBRELLA_TREE_MEMBRANE = registerBlock("umbrella_tree_membrane", new BlockUmbrellaTreeMembrane()); public static final Block UMBRELLA_TREE_CLUSTER = registerBlock("umbrella_tree_cluster", new BlockUmbrellaTreeCluster()); public static final Block UMBRELLA_TREE_CLUSTER_EMPTY = registerBlock("umbrella_tree_cluster_empty", new BlockUmbrellaTreeClusterEmpty()); diff --git a/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java b/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java index b3091c7a..18e7c812 100644 --- a/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java @@ -21,6 +21,9 @@ public class SingleInvertedScatterFeature extends InvertedScatterFeature { @Override public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { + if (!world.isAir(blockPos)) { + return false; + } BlockState state = block.getDefaultState(); if (block instanceof BlockAttached) { state = state.with(Properties.FACING, Direction.DOWN); diff --git a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java index 00dce3bc..df53b4a7 100644 --- a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java @@ -36,7 +36,6 @@ public class JellyshroomFeature extends DefaultFeature { public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; - BlockState log = EndBlocks.JELLYSHROOM.log.getDefaultState(); BlockState bark = EndBlocks.JELLYSHROOM.bark.getDefaultState(); BlockState membrane = EndBlocks.JELLYSHROOM_CAP_PURPLE.getDefaultState(); diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_sapling.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_sapling.png new file mode 100644 index 0000000000000000000000000000000000000000..220d8de0b28e5b0134c2825dbf2e438f980203a8 GIT binary patch literal 416 zcmV;R0bl-!P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0X0cPK~y+TWBmXB zKLaIz2}+X=^pZkdNLf(5Yv3-}#GjGuv;L7M*YKrm1M^_yOd6VqjqY&c*;{12ISw z$W~;{U;y$0Htbiq{l7!{JRlRhJPhMZ2hZBO=0&W2@C<{9vXaES{^9Ei6KD~Pm4oG~iz-a)wt=L_`zyJUm`j@JXB3<_Y0000< KMNUMnLSTY`x2JCa literal 0 HcmV?d00001 From 6ef6090123306743344ebe9704b827794930e843 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 26 Dec 2020 19:18:21 +0300 Subject: [PATCH 032/463] Fixes --- .../blocks/BlockSmallJellyshroom.java | 25 +++++++++++++++++-- .../ru/betterend/registry/EndFeatures.java | 2 +- .../features/trees/JellyshroomFeature.java | 8 +++--- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/BlockSmallJellyshroom.java b/src/main/java/ru/betterend/blocks/BlockSmallJellyshroom.java index c368f1ef..405fe29e 100644 --- a/src/main/java/ru/betterend/blocks/BlockSmallJellyshroom.java +++ b/src/main/java/ru/betterend/blocks/BlockSmallJellyshroom.java @@ -2,6 +2,7 @@ package ru.betterend.blocks; import java.util.EnumMap; import java.util.List; +import java.util.Random; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -10,6 +11,7 @@ import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.block.Fertilizable; import net.minecraft.block.Material; import net.minecraft.block.ShapeContext; import net.minecraft.enchantment.EnchantmentHelper; @@ -17,18 +19,22 @@ import net.minecraft.enchantment.Enchantments; import net.minecraft.item.ItemStack; import net.minecraft.loot.context.LootContext; import net.minecraft.loot.context.LootContextParameters; +import net.minecraft.server.world.ServerWorld; import net.minecraft.sound.BlockSoundGroup; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; import net.minecraft.world.BlockView; +import net.minecraft.world.World; import net.minecraft.world.WorldView; import ru.betterend.blocks.basis.BlockAttached; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndTags; -public class BlockSmallJellyshroom extends BlockAttached implements IRenderTypeable { +public class BlockSmallJellyshroom extends BlockAttached implements IRenderTypeable, Fertilizable { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); public BlockSmallJellyshroom() { @@ -57,7 +63,7 @@ public class BlockSmallJellyshroom extends BlockAttached implements IRenderTypea @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - Direction direction = (Direction) state.get(FACING); + Direction direction = state.get(FACING); BlockPos blockPos = pos.offset(direction.getOpposite()); BlockState support = world.getBlockState(blockPos); return sideCoversSmallSquare(world, blockPos, direction) && support.isOpaque() && support.getLuminance() == 0; @@ -76,4 +82,19 @@ public class BlockSmallJellyshroom extends BlockAttached implements IRenderTypea BOUNDING_SHAPES.put(Direction.WEST, VoxelShapes.cuboid(0.5, 0.0, 0.0, 1.0, 1.0, 1.0)); BOUNDING_SHAPES.put(Direction.EAST, VoxelShapes.cuboid(0.0, 0.0, 0.0, 0.5, 1.0, 1.0)); } + + @Override + public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { + return state.get(FACING) == Direction.UP && world.getBlockState(pos.down()).isIn(EndTags.END_GROUND); + } + + @Override + public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { + return random.nextInt(16) == 0; + } + + @Override + public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { + EndFeatures.JELLYSHROOM.getFeature().generate(world, null, random, pos, null); + } } diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index a3da81d9..c49eb39f 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -60,7 +60,7 @@ public class EndFeatures { public static final EndFeature TENANEA = new EndFeature("tenanea", new TenaneaFeature(), 3); public static final EndFeature HELIX_TREE = new EndFeature("helix_tree", new HelixTreeFeature(), 2); public static final EndFeature UMBRELLA_TREE = new EndFeature("umbrella_tree", new UmbrellaTreeFeature(), 4); - public static final EndFeature JELLYSHROOM = new EndFeature("jellyshroom", new JellyshroomFeature(), 2); + public static final EndFeature JELLYSHROOM = new EndFeature("jellyshroom", new JellyshroomFeature(), 3); // Bushes // public static final EndFeature PYTHADENDRON_BUSH = new EndFeature("pythadendron_bush", new BushFeature(EndBlocks.PYTHADENDRON_LEAVES, EndBlocks.PYTHADENDRON.bark), 4); diff --git a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java index df53b4a7..dbdcc9cc 100644 --- a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java @@ -47,14 +47,14 @@ public class JellyshroomFeature extends DefaultFeature { return bark; }); - radius = height * MHelper.randRange(0.8F, 1.2F, random); + radius = height * MHelper.randRange(0.7F, 0.9F, random); SDF cap = makeCap(radius, random, membrane); Vector3f last = spline.get(spline.size() - 1); cap = new SDFTranslate().setTranslate(last.getX(), last.getY(), last.getZ()).setSource(cap); sdf = new SDFSmoothUnion().setRadius(3F).setSourceA(sdf).setSourceB(cap); sdf.setReplaceFunction(REPLACE).setPostProcess(POST).fillRecursive(world, pos); - radius = height * 0.3F; - makeRoots(world, pos, radius, random, bark); + radius = height * 0.5F; + makeRoots(world, pos.add(0, 1, 0), radius, random, bark); return true; } @@ -70,7 +70,7 @@ public class JellyshroomFeature extends DefaultFeature { SplineHelper.scale(branch, scale); Vector3f last = branch.get(branch.size() - 1); if (world.getBlockState(pos.add(last.getX(), last.getY(), last.getZ())).isIn(EndTags.GEN_TERRAIN)) { - SplineHelper.fillSplineForce(branch, world, wood, pos, REPLACE); + SplineHelper.fillSpline(branch, world, wood, pos, REPLACE); } } } From 18b2c691a21092ed520e93e57dcf7cf8f0734c51 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 26 Dec 2020 19:39:32 +0300 Subject: [PATCH 033/463] Lang --- src/main/resources/assets/betterend/lang/en_us.json | 5 ++++- src/main/resources/assets/betterend/lang/ru_ru.json | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 93702fea..3a88770a 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -545,5 +545,8 @@ "block.betterend.jellyshroom_stairs": "Jellyshroom Stairs", "block.betterend.jellyshroom_stripped_bark": "Stripped Jellyshroom Bark", "block.betterend.jellyshroom_stripped_log": "Stripped Jellyshroom Log", - "block.betterend.jellyshroom_trapdoor": "Jellyshroom Trapdoor" + "block.betterend.jellyshroom_trapdoor": "Jellyshroom Trapdoor", + + "biome.betterend.eterial_grove": "Eterial Grove", + "block.betterend.umbrella_tree_sapling": "Umbrella Tree Sapling" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 13de3f25..75ee17aa 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -547,5 +547,8 @@ "block.betterend.jellyshroom_stairs": "Ступени из желейного гриба", "block.betterend.jellyshroom_stripped_bark": "Обтёсанная кора желейного гриба", "block.betterend.jellyshroom_stripped_log": "Обтёсанное бревно желейного гриба", - "block.betterend.jellyshroom_trapdoor": "Люк из желейного гриба" + "block.betterend.jellyshroom_trapdoor": "Люк из желейного гриба", + + "biome.betterend.eterial_grove": "Эфирная роща", + "block.betterend.umbrella_tree_sapling": "Саженец зонтичного дерева" } \ No newline at end of file From 718b3a6fc42f292eb63059e3efa46645274b126a Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 26 Dec 2020 19:59:10 +0300 Subject: [PATCH 034/463] Mushroom fixes --- .../ru/betterend/blocks/BlockSmallJellyshroom.java | 3 +++ .../world/features/trees/JellyshroomFeature.java | 10 +++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/BlockSmallJellyshroom.java b/src/main/java/ru/betterend/blocks/BlockSmallJellyshroom.java index 405fe29e..f3f15238 100644 --- a/src/main/java/ru/betterend/blocks/BlockSmallJellyshroom.java +++ b/src/main/java/ru/betterend/blocks/BlockSmallJellyshroom.java @@ -11,6 +11,7 @@ import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.block.Fertilizable; import net.minecraft.block.Material; import net.minecraft.block.ShapeContext; @@ -33,6 +34,7 @@ import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; public class BlockSmallJellyshroom extends BlockAttached implements IRenderTypeable, Fertilizable { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); @@ -95,6 +97,7 @@ public class BlockSmallJellyshroom extends BlockAttached implements IRenderTypea @Override public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { + BlocksHelper.setWithUpdate(world, pos, Blocks.AIR); EndFeatures.JELLYSHROOM.getFeature().generate(world, null, random, pos, null); } } diff --git a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java index dbdcc9cc..806a8509 100644 --- a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java @@ -40,8 +40,8 @@ public class JellyshroomFeature extends DefaultFeature { BlockState membrane = EndBlocks.JELLYSHROOM_CAP_PURPLE.getDefaultState(); int height = MHelper.randRange(5, 8, random); - float radius = height * MHelper.randRange(0.1F, 0.2F, random); - List spline = SplineHelper.makeSpline(0, 0, 0, 0, height, 0, 5); + float radius = height * MHelper.randRange(0.15F, 0.25F, random); + List spline = SplineHelper.makeSpline(0, -1, 0, 0, height, 0, 3); SplineHelper.offsetParts(spline, random, 0.5F, 0, 0.5F); SDF sdf = SplineHelper.buildSDF(spline, radius, 0.8F, (bpos) -> { return bark; @@ -54,13 +54,13 @@ public class JellyshroomFeature extends DefaultFeature { sdf = new SDFSmoothUnion().setRadius(3F).setSourceA(sdf).setSourceB(cap); sdf.setReplaceFunction(REPLACE).setPostProcess(POST).fillRecursive(world, pos); radius = height * 0.5F; - makeRoots(world, pos.add(0, 1, 0), radius, random, bark); + makeRoots(world, pos.add(0, 2, 0), radius, random, bark); return true; } private void makeRoots(StructureWorldAccess world, BlockPos pos, float radius, Random random, BlockState wood) { - int count = (int) (radius * 1.5F); + int count = (int) (radius * 3.5F); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2; float scale = radius * MHelper.randRange(0.85F, 1.15F, random); @@ -109,7 +109,7 @@ public class JellyshroomFeature extends DefaultFeature { }; REPLACE = (state) -> { - if (state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) || state.isOf(EndBlocks.UMBRELLA_TREE_MEMBRANE)) { + if (state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT)) { return true; } return state.getMaterial().isReplaceable(); From 52e5600bb85e0f6f8e85bf16b294d7fd6648757e Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 26 Dec 2020 20:15:16 +0300 Subject: [PATCH 035/463] More fixes --- .../ru/betterend/world/features/trees/JellyshroomFeature.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java index 806a8509..27d8be7b 100644 --- a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java @@ -48,6 +48,9 @@ public class JellyshroomFeature extends DefaultFeature { }); radius = height * MHelper.randRange(0.7F, 0.9F, random); + if (radius < 1.5F) { + radius = 1.5F; + } SDF cap = makeCap(radius, random, membrane); Vector3f last = spline.get(spline.size() - 1); cap = new SDFTranslate().setTranslate(last.getX(), last.getY(), last.getZ()).setSource(cap); From 8b53764e92173704ab6ddc7b17e468837e61d58f Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 26 Dec 2020 20:50:39 +0300 Subject: [PATCH 036/463] Spawn restriction changes --- .../ru/betterend/entity/EntityDragonfly.java | 9 ++++ .../ru/betterend/registry/EndEntities.java | 1 + .../java/ru/betterend/util/SpawnHelper.java | 41 +++---------------- 3 files changed, 15 insertions(+), 36 deletions(-) diff --git a/src/main/java/ru/betterend/entity/EntityDragonfly.java b/src/main/java/ru/betterend/entity/EntityDragonfly.java index 7ab75ce0..f808e0d1 100644 --- a/src/main/java/ru/betterend/entity/EntityDragonfly.java +++ b/src/main/java/ru/betterend/entity/EntityDragonfly.java @@ -1,11 +1,13 @@ package ru.betterend.entity; import java.util.EnumSet; +import java.util.Random; import net.minecraft.block.BlockState; import net.minecraft.entity.EntityType; import net.minecraft.entity.Flutterer; import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.SpawnReason; import net.minecraft.entity.ai.TargetFinder; import net.minecraft.entity.ai.control.FlightMoveControl; import net.minecraft.entity.ai.control.LookControl; @@ -26,6 +28,8 @@ import net.minecraft.server.world.ServerWorld; import net.minecraft.sound.SoundEvent; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; +import net.minecraft.world.Heightmap.Type; +import net.minecraft.world.ServerWorldAccess; import net.minecraft.world.World; import net.minecraft.world.WorldView; import ru.betterend.registry.EndEntities; @@ -187,4 +191,9 @@ public class EntityDragonfly extends AnimalEntity implements Flutterer { public PassiveEntity createChild(ServerWorld world, PassiveEntity entity) { return EndEntities.DRAGONFLY.create(world); } + + public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { + int y = world.getChunk(pos).sampleHeightmap(Type.WORLD_SURFACE, pos.getX() & 15, pos.getY() & 15); + return y > 0 && pos.getY() >= y; + } } diff --git a/src/main/java/ru/betterend/registry/EndEntities.java b/src/main/java/ru/betterend/registry/EndEntities.java index 1f685f43..16924e6d 100644 --- a/src/main/java/ru/betterend/registry/EndEntities.java +++ b/src/main/java/ru/betterend/registry/EndEntities.java @@ -27,6 +27,7 @@ public class EndEntities { public static final EntityType CUBOZOA = register("cubozoa", SpawnGroup.WATER_AMBIENT, 0.6F, 1F, EntityCubozoa::new, EntityCubozoa.createMobAttributes(), true, MHelper.color(151, 77, 181), MHelper.color(93, 176, 238)); public static void register() { + SpawnHelper.restrictionAir(DRAGONFLY, EntityDragonfly::canSpawn); SpawnHelper.restrictionLand(END_SLIME, EntityEndSlime::canSpawn); SpawnHelper.restrictionWater(END_FISH, EntityEndFish::canSpawn); SpawnHelper.restrictionLand(SHADOW_WALKER, EntityShadowWalker::canSpawn); diff --git a/src/main/java/ru/betterend/util/SpawnHelper.java b/src/main/java/ru/betterend/util/SpawnHelper.java index 71356f7f..a3d9ba15 100644 --- a/src/main/java/ru/betterend/util/SpawnHelper.java +++ b/src/main/java/ru/betterend/util/SpawnHelper.java @@ -1,53 +1,22 @@ package ru.betterend.util; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - +import net.fabricmc.fabric.mixin.object.builder.SpawnRestrictionAccessor; import net.minecraft.entity.EntityType; -import net.minecraft.entity.SpawnRestriction; import net.minecraft.entity.SpawnRestriction.Location; import net.minecraft.entity.SpawnRestriction.SpawnPredicate; import net.minecraft.entity.mob.MobEntity; import net.minecraft.world.Heightmap.Type; -import ru.betterend.BetterEnd; public class SpawnHelper { - private static Method regRestriction; - - public static void restriction(EntityType entity, Location location, Type heughtmapType, SpawnPredicate predicate) { - if (regRestriction != null) { - try { - regRestriction.invoke(null, entity, location, heughtmapType, predicate); - } - catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { - BetterEnd.LOGGER.error(e.getMessage()); - } - } - else { - BetterEnd.LOGGER.error("Unable to register spawn restriction, variable is not handled"); - } + public static void restrictionAir(EntityType entity, SpawnPredicate predicate) { + SpawnRestrictionAccessor.callRegister(entity, Location.NO_RESTRICTIONS, Type.MOTION_BLOCKING, predicate); } public static void restrictionLand(EntityType entity, SpawnPredicate predicate) { - restriction(entity, Location.ON_GROUND, Type.MOTION_BLOCKING, predicate); + SpawnRestrictionAccessor.callRegister(entity, Location.ON_GROUND, Type.MOTION_BLOCKING, predicate); } public static void restrictionWater(EntityType entity, SpawnPredicate predicate) { - restriction(entity, Location.IN_WATER, Type.MOTION_BLOCKING, predicate); - } - - static { - try { - for (Method method: SpawnRestriction.class.getDeclaredMethods()) { - if (method.getParameterCount() == 4) { - regRestriction = method; - regRestriction.setAccessible(true); - break; - } - } - } - catch (SecurityException e) { - BetterEnd.LOGGER.error(e.getMessage()); - } + SpawnRestrictionAccessor.callRegister(entity, Location.IN_WATER, Type.MOTION_BLOCKING, predicate); } } From 3c1f518f22604ede627806a3aaff11c0f693b654 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 26 Dec 2020 22:27:28 +0300 Subject: [PATCH 037/463] Small fix --- .../java/ru/betterend/mixin/common/BoneMealItemMixin.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java index 32c28ec1..59b73272 100644 --- a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java +++ b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java @@ -48,7 +48,10 @@ public class BoneMealItemMixin { } } else { - if (!world.getFluidState(offseted).isEmpty() && endBiome) { + if (!world.getBlockState(offseted).equals(Blocks.WATER)) { + info.cancel(); + } + else if (!world.getFluidState(offseted).isEmpty() && endBiome) { consume = beGrowWaterGrass(world, blockPos); } else { @@ -63,6 +66,9 @@ public class BoneMealItemMixin { info.cancel(); } } + else if (!world.getBlockState(offseted).equals(Blocks.WATER)) { + info.cancel(); + } else if (!world.getFluidState(offseted).isEmpty() && endBiome) { info.setReturnValue(ActionResult.FAIL); info.cancel(); From ef0cb759d4298d1441ecc943e55ddcb7208601fb Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sat, 26 Dec 2020 23:47:51 +0300 Subject: [PATCH 038/463] Small fix --- .../blocks/BlockVentBubbleColumn.java | 24 ++--------------- .../client/NamespaceResourceManagerMixin.java | 26 ++++++++++++++----- .../ru/betterend/registry/EndFeatures.java | 2 +- .../betterend/world/features/EndFeature.java | 2 +- .../blockstates/vent_bubble_column.json | 7 +++++ 5 files changed, 31 insertions(+), 30 deletions(-) create mode 100644 src/main/resources/assets/betterend/blockstates/vent_bubble_column.json diff --git a/src/main/java/ru/betterend/blocks/BlockVentBubbleColumn.java b/src/main/java/ru/betterend/blocks/BlockVentBubbleColumn.java index f50a6b06..0d483bee 100644 --- a/src/main/java/ru/betterend/blocks/BlockVentBubbleColumn.java +++ b/src/main/java/ru/betterend/blocks/BlockVentBubbleColumn.java @@ -1,6 +1,5 @@ package ru.betterend.blocks; -import java.io.Reader; import java.util.Random; import net.fabricmc.api.EnvType; @@ -22,22 +21,19 @@ import net.minecraft.particle.ParticleTypes; import net.minecraft.server.world.ServerWorld; import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvents; -import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; -import net.minecraft.util.registry.Registry; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; import net.minecraft.world.BlockView; import net.minecraft.world.World; import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; -import ru.betterend.patterns.BlockPatterned; -import ru.betterend.patterns.Patterns; + import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; -public class BlockVentBubbleColumn extends Block implements FluidDrainable, FluidFillable, BlockPatterned { +public class BlockVentBubbleColumn extends Block implements FluidDrainable, FluidFillable { public BlockVentBubbleColumn() { super(FabricBlockSettings.of(Material.BUBBLE_COLUMN).nonOpaque().noCollision().dropsNothing()); } @@ -125,20 +121,4 @@ public class BlockVentBubbleColumn extends Block implements FluidDrainable, Flui public FluidState getFluidState(BlockState state) { return Fluids.WATER.getStill(false); } - - @Override - public String getStatesPattern(Reader data) { - String block = Registry.BLOCK.getId(this).getPath(); - return Patterns.createJson(data, block, block); - } - - @Override - public String getModelPattern(String block) { - return Patterns.createJson(Patterns.BLOCK_EMPTY, "stone", "stone"); - } - - @Override - public Identifier statePatternId() { - return Patterns.STATE_SIMPLE; - } } diff --git a/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java b/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java index 84805062..b23538f5 100644 --- a/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java @@ -2,44 +2,58 @@ package ru.betterend.mixin.client; import java.util.List; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At.Shift; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import com.google.common.collect.Lists; import net.minecraft.block.Block; import net.minecraft.resource.NamespaceResourceManager; import net.minecraft.resource.Resource; +import net.minecraft.resource.ResourcePack; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; + import ru.betterend.BetterEnd; import ru.betterend.patterns.BlockPatterned; @Mixin(NamespaceResourceManager.class) public abstract class NamespaceResourceManagerMixin { + @Final + @Shadow + protected List packList; + @Shadow public abstract Resource getResource(Identifier id); + @Shadow + public abstract List getAllResources(Identifier id); @Inject(method = "getAllResources", cancellable = true, at = @At( value = "NEW", target = "java/io/FileNotFoundException", shift = Shift.BEFORE)) public void getStatesPattern(Identifier id, CallbackInfoReturnable> info) { - if (id.getNamespace().contains(BetterEnd.MOD_ID)) { + if (id.getNamespace().equals(BetterEnd.MOD_ID)) { String[] data = id.getPath().split("/"); if (data.length > 1) { Identifier blockId = BetterEnd.makeID(data[1].replace(".json", "")); Block block = Registry.BLOCK.get(blockId); if (block instanceof BlockPatterned) { - List resources = Lists.newArrayList(); - resources.add(this.getResource(((BlockPatterned) block).statePatternId())); - info.setReturnValue(resources); - info.cancel(); + Identifier stateId = ((BlockPatterned) block).statePatternId(); + try { + List resources = Lists.newArrayList(); + Resource stateRes = this.getResource(stateId); + resources.add(stateRes); + info.setReturnValue(resources); + info.cancel(); + } catch (Exception ex) { + BetterEnd.LOGGER.catching(ex); + } } } } diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index c49eb39f..0f875e3d 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -128,7 +128,7 @@ public class EndFeatures { public static final EndFeature CHARNIA_GREEN = new EndFeature("charnia_green", new CharniaFeature(EndBlocks.CHARNIA_GREEN), 10); public static final EndFeature MENGER_SPONGE = new EndFeature("menger_sponge", new MengerSpongeFeature(5), 1); public static final EndFeature CHARNIA_RED_RARE = new EndFeature("charnia_red_rare", new CharniaFeature(EndBlocks.CHARNIA_RED), 2); - public static final EndFeature OVERWORLD_ISLAND = EndFeature.makeOverworldIsland("overworld_island", new OverworldIslandFeature()); + public static final EndFeature OVERWORLD_ISLAND = EndFeature.makeFetureConfigured("overworld_island", new OverworldIslandFeature()); // Terrain // public static final EndFeature END_LAKE = EndFeature.makeLakeFeature("end_lake", new EndLakeFeature(), 4); diff --git a/src/main/java/ru/betterend/world/features/EndFeature.java b/src/main/java/ru/betterend/world/features/EndFeature.java index 1e2e9aed..09a9484b 100644 --- a/src/main/java/ru/betterend/world/features/EndFeature.java +++ b/src/main/java/ru/betterend/world/features/EndFeature.java @@ -114,7 +114,7 @@ public class EndFeature { return new EndFeature(name, feature, GenerationStep.Feature.RAW_GENERATION, configured); } - public static EndFeature makeOverworldIsland(String name, Feature feature) { + public static EndFeature makeFetureConfigured(String name, Feature feature) { ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT); return new EndFeature(name, feature, GenerationStep.Feature.RAW_GENERATION, configured); } diff --git a/src/main/resources/assets/betterend/blockstates/vent_bubble_column.json b/src/main/resources/assets/betterend/blockstates/vent_bubble_column.json new file mode 100644 index 00000000..442f38d9 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/vent_bubble_column.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/water" + } + } +} \ No newline at end of file From 824b683c447d0916cc1707301470349a054d2b9a Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 27 Dec 2020 11:31:18 +0300 Subject: [PATCH 039/463] Juice prototype --- src/main/java/ru/betterend/item/ItemDrink.java | 16 ++++++++++++++++ .../java/ru/betterend/registry/EndItems.java | 8 ++++++++ .../textures/item/umbrella_cluster_juice.png | Bin 0 -> 389 bytes 3 files changed, 24 insertions(+) create mode 100644 src/main/java/ru/betterend/item/ItemDrink.java create mode 100644 src/main/resources/assets/betterend/textures/item/umbrella_cluster_juice.png diff --git a/src/main/java/ru/betterend/item/ItemDrink.java b/src/main/java/ru/betterend/item/ItemDrink.java new file mode 100644 index 00000000..e113e0b5 --- /dev/null +++ b/src/main/java/ru/betterend/item/ItemDrink.java @@ -0,0 +1,16 @@ +package ru.betterend.item; + +import net.minecraft.item.PotionItem; +import ru.betterend.patterns.Patterned; +import ru.betterend.patterns.Patterns; + +public class ItemDrink extends PotionItem implements Patterned { + public ItemDrink(Settings settings) { + super(settings); + } + + @Override + public String getModelPattern(String name) { + return Patterns.createJson(Patterns.ITEM_GENERATED, name); + } +} diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index bb426036..7e51f182 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -40,6 +40,7 @@ import ru.betterend.item.EndHoe; import ru.betterend.item.EndPickaxe; import ru.betterend.item.EndToolMaterial; import ru.betterend.item.EternalCrystal; +import ru.betterend.item.ItemDrink; import ru.betterend.item.ItemSpawnEgg; import ru.betterend.item.PatternedItem; import ru.betterend.tab.CreativeTabs; @@ -105,6 +106,9 @@ public class EndItems { public final static Item SWEET_BERRY_JELLY = registerFood("sweet_berry_jelly", 3, 0.75F); public final static Item SHADOW_BERRY_JELLY = registerFood("shadow_berry_jelly", 4, 0.75F, new StatusEffectInstance(StatusEffects.NIGHT_VISION, 400)); + // Drinks + public final static Item UMBRELLA_CLUSTER_JUICE = registerDrink("umbrella_cluster_juice"); + // Other // public static final Item ETERNAL_CRYSTAL = registerItem("eternal_crystal", new EternalCrystal()); @@ -197,6 +201,10 @@ public class EndItems { public static Item registerFood(String name, FoodComponent foodComponent) { return registerItem(name, new PatternedItem(makeItemSettings().food(foodComponent))); } + + public static Item registerDrink(String name) { + return registerItem(name, new ItemDrink(makeItemSettings().maxCount(1))); + } public static Settings makeItemSettings() { return new Item.Settings().group(CreativeTabs.TAB_ITEMS); diff --git a/src/main/resources/assets/betterend/textures/item/umbrella_cluster_juice.png b/src/main/resources/assets/betterend/textures/item/umbrella_cluster_juice.png new file mode 100644 index 0000000000000000000000000000000000000000..75f21ec8d813283dd8356c0198996c01143f1161 GIT binary patch literal 389 zcmV;00eb$4P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!Ta9BrVLNUyf(6k4P6Mt!`|f?U>X~yT_A$OfUyf={_Cd< z40EkdGAt^v#qa`F7r->%OZdznD#gGcD$T%28IV8zd_hQZ@|Qn0fqthUwsABAlpHj-v9W@AjrYZa60lj z*gNO|!+=!>u7NdzY(M| literal 0 HcmV?d00001 From f18cf5c07357a97c891bf4277ecad732becdff16 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 27 Dec 2020 12:16:32 +0300 Subject: [PATCH 040/463] Juice functionality & translation --- .../java/ru/betterend/item/ItemDrink.java | 28 ++++++++++++++----- .../assets/betterend/lang/en_us.json | 3 +- .../assets/betterend/lang/ru_ru.json | 3 +- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/main/java/ru/betterend/item/ItemDrink.java b/src/main/java/ru/betterend/item/ItemDrink.java index e113e0b5..21abce1a 100644 --- a/src/main/java/ru/betterend/item/ItemDrink.java +++ b/src/main/java/ru/betterend/item/ItemDrink.java @@ -1,16 +1,30 @@ package ru.betterend.item; -import net.minecraft.item.PotionItem; -import ru.betterend.patterns.Patterned; -import ru.betterend.patterns.Patterns; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUsage; +import net.minecraft.util.Hand; +import net.minecraft.util.TypedActionResult; +import net.minecraft.util.UseAction; +import net.minecraft.world.World; -public class ItemDrink extends PotionItem implements Patterned { +public class ItemDrink extends PatternedItem { public ItemDrink(Settings settings) { super(settings); } - + @Override - public String getModelPattern(String name) { - return Patterns.createJson(Patterns.ITEM_GENERATED, name); + public int getMaxUseTime(ItemStack stack) { + return 32; + } + + @Override + public UseAction getUseAction(ItemStack stack) { + return UseAction.DRINK; + } + + @Override + public TypedActionResult use(World world, PlayerEntity user, Hand hand) { + return ItemUsage.consumeHeldItem(world, user, hand); } } diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 3a88770a..23c130b3 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -548,5 +548,6 @@ "block.betterend.jellyshroom_trapdoor": "Jellyshroom Trapdoor", "biome.betterend.eterial_grove": "Eterial Grove", - "block.betterend.umbrella_tree_sapling": "Umbrella Tree Sapling" + "block.betterend.umbrella_tree_sapling": "Umbrella Tree Sapling", + "item.betterend.umbrella_cluster_juice": "Umbrella Cluster Juice" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 75ee17aa..b45499a0 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -550,5 +550,6 @@ "block.betterend.jellyshroom_trapdoor": "Люк из желейного гриба", "biome.betterend.eterial_grove": "Эфирная роща", - "block.betterend.umbrella_tree_sapling": "Саженец зонтичного дерева" + "block.betterend.umbrella_tree_sapling": "Саженец зонтичного дерева", + "item.betterend.umbrella_cluster_juice": "Сок зонтичного кластера" } \ No newline at end of file From 58124139d5e180057b043bb279dadad4ee13afa8 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 27 Dec 2020 14:03:11 +0300 Subject: [PATCH 041/463] Fixes, tree WIP --- .../blocks/BlockBlueVineLantern.java | 2 +- .../ru/betterend/blocks/BlockProperties.java | 1 + .../blocks/BlockUmbrellaTreeCluster.java | 31 ++++++++++- .../blocks/BlockUmbrellaTreeClusterEmpty.java | 2 +- .../entities/EndStoneSmelterBlockEntity.java | 14 ++--- .../byg/features/BigEtherTreeFeature.java | 53 ++++++++++++++++--- .../java/ru/betterend/util/SplineHelper.java | 4 ++ 7 files changed, 90 insertions(+), 17 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/BlockBlueVineLantern.java b/src/main/java/ru/betterend/blocks/BlockBlueVineLantern.java index fc183bf0..00be15ff 100644 --- a/src/main/java/ru/betterend/blocks/BlockBlueVineLantern.java +++ b/src/main/java/ru/betterend/blocks/BlockBlueVineLantern.java @@ -17,7 +17,7 @@ import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; public class BlockBlueVineLantern extends BlockBase { - public static final BooleanProperty NATURAL = BooleanProperty.of("natural"); + public static final BooleanProperty NATURAL = BlockProperties.NATURAL; public BlockBlueVineLantern() { super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sounds(BlockSoundGroup.WART_BLOCK).luminance(15)); diff --git a/src/main/java/ru/betterend/blocks/BlockProperties.java b/src/main/java/ru/betterend/blocks/BlockProperties.java index bc10e067..f1c2f10a 100644 --- a/src/main/java/ru/betterend/blocks/BlockProperties.java +++ b/src/main/java/ru/betterend/blocks/BlockProperties.java @@ -14,6 +14,7 @@ public class BlockProperties { public static final BooleanProperty HAS_LIGHT = BooleanProperty.of("has_light"); public static final BooleanProperty ACTIVE = BooleanProperty.of("active"); public static final IntProperty ROTATION = IntProperty.of("rotation", 0, 3); + public static final BooleanProperty NATURAL = BooleanProperty.of("natural"); public static enum TripleShape implements StringIdentifiable { TOP("top"), diff --git a/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeCluster.java b/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeCluster.java index f2ce5a91..8f013990 100644 --- a/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeCluster.java +++ b/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeCluster.java @@ -5,12 +5,25 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.MaterialColor; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvents; import net.minecraft.state.StateManager; import net.minecraft.state.property.BooleanProperty; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndItems; +import ru.betterend.util.BlocksHelper; public class BlockUmbrellaTreeCluster extends BlockBase { - public static final BooleanProperty NATURAL = BooleanProperty.of("natural"); + public static final BooleanProperty NATURAL = BlockProperties.NATURAL; public BlockUmbrellaTreeCluster() { super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK) @@ -23,4 +36,20 @@ public class BlockUmbrellaTreeCluster extends BlockBase { protected void appendProperties(StateManager.Builder stateManager) { stateManager.add(NATURAL); } + + @Override + public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + ItemStack stack = player.getMainHandStack(); + if (stack.getItem() == Items.GLASS_BOTTLE) { + if (!player.isCreative()) { + stack.decrement(1); + } + stack = new ItemStack(EndItems.UMBRELLA_CLUSTER_JUICE); + player.giveItemStack(stack); + world.playSound(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, SoundEvents.ITEM_BOTTLE_FILL, SoundCategory.BLOCKS, 1, 1, false); + BlocksHelper.setWithUpdate(world, pos, EndBlocks.UMBRELLA_TREE_CLUSTER_EMPTY.getDefaultState().with(NATURAL, state.get(NATURAL))); + return ActionResult.SUCCESS; + } + return ActionResult.FAIL; + } } diff --git a/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeClusterEmpty.java b/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeClusterEmpty.java index a9bac8c5..decab1f9 100644 --- a/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeClusterEmpty.java +++ b/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeClusterEmpty.java @@ -16,7 +16,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; public class BlockUmbrellaTreeClusterEmpty extends BlockBase { - public static final BooleanProperty NATURAL = BooleanProperty.of("natural"); + public static final BooleanProperty NATURAL = BlockProperties.NATURAL; public BlockUmbrellaTreeClusterEmpty() { super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK) diff --git a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java index e953933f..ae764e76 100644 --- a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java @@ -52,7 +52,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp private static final int[] TOP_SLOTS = new int[] { 0, 1 }; private static final int[] BOTTOM_SLOTS = new int[] { 2, 3 }; private static final int[] SIDE_SLOTS = new int[] { 3 }; - private static final Map availableFuels = Maps.newHashMap(); + private static final Map AVAILABLE_FUELS = Maps.newHashMap(); private final Object2IntOpenHashMap recipesUsed; protected DefaultedList inventory; @@ -404,7 +404,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp return 0; } else { Item item = fuel.getItem(); - return availableFuels.getOrDefault(item, 0); + return AVAILABLE_FUELS.getOrDefault(item, 0); } } @@ -454,14 +454,14 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp } public static boolean canUseAsFuel(ItemStack stack) { - return availableFuels.containsKey(stack.getItem()); + return AVAILABLE_FUELS.containsKey(stack.getItem()); } public static void registerFuel(ItemConvertible fuel, int time) { - if (availableFuels.containsKey(fuel)) { - availableFuels.replace(fuel.asItem(), time); + if (AVAILABLE_FUELS.containsKey(fuel)) { + AVAILABLE_FUELS.replace(fuel.asItem(), time); } else { - availableFuels.put(fuel.asItem(), time); + AVAILABLE_FUELS.put(fuel.asItem(), time); } } @@ -471,6 +471,6 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp } public static Map availableFuels() { - return availableFuels; + return AVAILABLE_FUELS; } } diff --git a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java index 627950cf..8219e4f4 100644 --- a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java @@ -9,6 +9,7 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Material; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -17,6 +18,9 @@ import ru.betterend.registry.EndTags; import ru.betterend.util.MHelper; import ru.betterend.util.SplineHelper; import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFSmoothUnion; +import ru.betterend.util.sdf.operator.SDFTranslate; +import ru.betterend.util.sdf.operator.SDFUnion; import ru.betterend.world.features.DefaultFeature; public class BigEtherTreeFeature extends DefaultFeature { @@ -26,20 +30,55 @@ public class BigEtherTreeFeature extends DefaultFeature { BlockState log = Integrations.BYG.getDefaultState("ether_log"); BlockState wood = Integrations.BYG.getDefaultState("ether_wood"); - BlockState leaves = Integrations.BYG.getDefaultState("ether_leaves"); + //BlockState leaves = Integrations.BYG.getDefaultState("ether_leaves"); + Function splinePlacer = (bpos) -> { return log; }; + Function replace = (state) -> { + return state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) || state.getMaterial().isReplaceable(); + }; - int height = MHelper.randRange(20, 30, random); - List trunk = SplineHelper.makeSpline(0, 0, 0, 0, height, 0, height / 2); + int height = MHelper.randRange(40, 60, random); + List trunk = SplineHelper.makeSpline(0, 0, 0, 0, height, 0, height / 4); SplineHelper.offsetParts(trunk, random, 2F, 0, 2F); - SDF sdf = SplineHelper.buildSDF(trunk, 2.3F, 0.8F, (bpos) -> { return log;}); + SDF sdf = SplineHelper.buildSDF(trunk, 2.3F, 0.8F, splinePlacer); + + int count = height / 10; + for (int i = 1; i < count; i++) { + float splinePos = (float) i / count; + float startAngle = random.nextFloat() * MHelper.PI2; + float length = (1 - splinePos) * height * 0.4F; + int points = (int) (length / 3); + List branch = SplineHelper.makeSpline(0, 0, 0, length, 0, 0, points < 2 ? 2 : points); + SplineHelper.powerOffset(branch, length * 0.5F, 1.5F); + int rotCount = MHelper.randRange(5, 7, random); + float startRad = MathHelper.lerp(splinePos, 2.3F, 0.8F) * 0.8F; + Vector3f start = SplineHelper.getPos(trunk, splinePos * (trunk.size() - 1)); + System.out.println(start + " " + startRad + " " + branch.size()); + for (int j = 0; j < rotCount; j++) { + float angle = startAngle + (float) j / rotCount * MHelper.PI2; + List br = SplineHelper.copySpline(branch); + SplineHelper.offsetParts(br, random, 0, 1, 1); + SplineHelper.rotateSpline(br, angle); + //SDF branchSDF = SplineHelper.buildSDF(br, startRad, 0.5F, splinePlacer); + //branchSDF = new SDFTranslate().setTranslate(start.getX(), start.getY(), start.getZ()).setSource(branchSDF); + //sdf = new SDFSmoothUnion().setRadius(2).setSourceA(sdf).setSourceB(branchSDF); + //sdf = new SDFUnion().setSourceA(sdf).setSourceB(branchSDF); + SplineHelper.fillSpline(br, world, wood, pos, replace); + } + } + sdf.setReplaceFunction((state) -> { return state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) || state.getMaterial().isReplaceable(); + }).setPostProcess((info) -> { + if (info.getState().equals(log) && (!info.getStateUp().equals(log) || !info.getStateDown().equals(log))) { + return wood; + } + return info.getState(); }).fillRecursive(world, pos); return true; } - private void makeLeavesSphere(StructureWorldAccess world, BlockPos pos, BlockState leaves, Function ignore) { - - } + //private void makeLeavesSphere(StructureWorldAccess world, BlockPos pos, BlockState leaves, Function ignore) { + // + //} } diff --git a/src/main/java/ru/betterend/util/SplineHelper.java b/src/main/java/ru/betterend/util/SplineHelper.java index 0a3bd2aa..a5092018 100644 --- a/src/main/java/ru/betterend/util/SplineHelper.java +++ b/src/main/java/ru/betterend/util/SplineHelper.java @@ -253,6 +253,10 @@ public class SplineHelper { public static Vector3f getPos(List spline, float index) { int i = (int) index; + int last = spline.size() - 1; + if (i >= last) { + return spline.get(last); + } float delta = index - i; Vector3f p1 = spline.get(i); Vector3f p2 = spline.get(i + 1); From 0a82a8c4be49db7afbca5e20ed374191ecd8fa8a Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sun, 27 Dec 2020 15:46:42 +0300 Subject: [PATCH 042/463] Fixes of recipes deserialization from JSON --- .../ru/betterend/blocks/EndPortalBlock.java | 2 +- .../recipe/builders/AlloyingRecipe.java | 14 +++-- .../recipe/builders/AnvilSmithingRecipe.java | 15 ++--- .../recipe/builders/InfusionRecipe.java | 38 +++++++++---- src/main/java/ru/betterend/util/ItemUtil.java | 56 +++++++++++++++++++ 5 files changed, 99 insertions(+), 26 deletions(-) create mode 100644 src/main/java/ru/betterend/util/ItemUtil.java diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index 950014f3..806e8165 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -114,7 +114,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable float rotation = entity.applyRotation(BlockRotation.CLOCKWISE_90); entity.yaw = rotation; } else { - offStep = entity.getMovementDirection() == Direction.NORTH ? 1 : -1; + offStep = entity.getMovementDirection() == Direction.NORTH ? -1 : 1; } return checkPos.add(0, 0, offStep); } else { diff --git a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java index 4441c93f..0e3dfc5f 100644 --- a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java @@ -5,6 +5,7 @@ import com.google.gson.JsonObject; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; + import net.minecraft.inventory.Inventory; import net.minecraft.item.Item; import net.minecraft.item.ItemConvertible; @@ -18,11 +19,12 @@ import net.minecraft.tag.Tag; import net.minecraft.util.Identifier; import net.minecraft.util.JsonHelper; import net.minecraft.util.collection.DefaultedList; -import net.minecraft.util.registry.Registry; import net.minecraft.world.World; + import ru.betterend.BetterEnd; import ru.betterend.recipe.EndRecipeManager; import ru.betterend.registry.EndBlocks; +import ru.betterend.util.ItemUtil; import ru.betterend.util.RecipeHelper; public class AlloyingRecipe implements Recipe { @@ -236,12 +238,12 @@ public class AlloyingRecipe implements Recipe { JsonArray ingredients = JsonHelper.getArray(json, "ingredients"); Ingredient primaryInput = Ingredient.fromJson(ingredients.get(0)); Ingredient secondaryInput = Ingredient.fromJson(ingredients.get(1)); - String resultStr = JsonHelper.getString(json, "result"); + JsonObject result = JsonHelper.getObject(json, "result"); String group = JsonHelper.getString(json, "group", ""); - Identifier resultId = new Identifier(resultStr); - ItemStack output = new ItemStack(Registry.ITEM.getOrEmpty(resultId).orElseThrow(() -> { - return new IllegalStateException("Item: " + resultStr + " does not exists!"); - })); + ItemStack output = ItemUtil.fromJsonRecipe(result); + if (output == null) { + throw new IllegalStateException("Output item does not exists!"); + } float experience = JsonHelper.getFloat(json, "experience", 0.0F); int smeltTime = JsonHelper.getInt(json, "smelttime", 350); diff --git a/src/main/java/ru/betterend/recipe/builders/AnvilSmithingRecipe.java b/src/main/java/ru/betterend/recipe/builders/AnvilSmithingRecipe.java index 6620d5bd..82a5e273 100644 --- a/src/main/java/ru/betterend/recipe/builders/AnvilSmithingRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AnvilSmithingRecipe.java @@ -19,11 +19,12 @@ import net.minecraft.tag.Tag; import net.minecraft.util.Identifier; import net.minecraft.util.JsonHelper; import net.minecraft.util.collection.DefaultedList; -import net.minecraft.util.registry.Registry; import net.minecraft.world.World; + import ru.betterend.BetterEnd; import ru.betterend.recipe.EndRecipeManager; import ru.betterend.registry.EndTags; +import ru.betterend.util.ItemUtil; import ru.betterend.util.RecipeHelper; public class AnvilSmithingRecipe implements Recipe { @@ -208,12 +209,12 @@ public class AnvilSmithingRecipe implements Recipe { public static class Serializer implements RecipeSerializer { @Override public AnvilSmithingRecipe read(Identifier id, JsonObject json) { - Ingredient input = Ingredient.fromJson(JsonHelper.getObject(json, "input")); - String resultStr = JsonHelper.getString(json, "result"); - Identifier resultId = new Identifier(resultStr); - ItemStack output = new ItemStack(Registry.ITEM.getOrEmpty(resultId).orElseThrow(() -> { - return new IllegalStateException("Item: " + resultStr + " does not exists!"); - })); + Ingredient input = Ingredient.fromJson(json.get("input")); + JsonObject result = JsonHelper.getObject(json, "result"); + ItemStack output = ItemUtil.fromJsonRecipe(result); + if (output == null) { + throw new IllegalStateException("Output item does not exists!"); + } int level = JsonHelper.getInt(json, "level", 1); int damage = JsonHelper.getInt(json, "damage", 1); diff --git a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java index 324e6072..a1cdb87d 100644 --- a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java @@ -2,7 +2,6 @@ package ru.betterend.recipe.builders; import java.util.Arrays; -import com.google.gson.JsonArray; import com.google.gson.JsonObject; import net.minecraft.item.ItemConvertible; @@ -15,11 +14,12 @@ import net.minecraft.recipe.RecipeType; import net.minecraft.util.Identifier; import net.minecraft.util.JsonHelper; import net.minecraft.util.collection.DefaultedList; -import net.minecraft.util.registry.Registry; import net.minecraft.world.World; + import ru.betterend.BetterEnd; import ru.betterend.recipe.EndRecipeManager; import ru.betterend.rituals.InfusionRitual; +import ru.betterend.util.ItemUtil; public class InfusionRecipe implements Recipe { @@ -178,17 +178,31 @@ public class InfusionRecipe implements Recipe { public InfusionRecipe read(Identifier id, JsonObject json) { InfusionRecipe recipe = new InfusionRecipe(id); recipe.input = Ingredient.fromJson(json.get("input")); - Identifier outId = new Identifier(JsonHelper.getString(json, "output")); - recipe.output = new ItemStack(Registry.ITEM.getOrEmpty(outId).orElseThrow(() -> { - return new IllegalStateException("Item: " + outId + " does not exists!"); - })); - recipe.time = JsonHelper.getInt(json, "time", 1); - JsonArray catalysts = JsonHelper.asArray(json, "catalysts"); - for (int i = 0; i < catalysts.size(); i++) { - ItemStack stack = new ItemStack(Registry.ITEM.getOrEmpty(outId).orElse(null)); - recipe.catalysts[i] = Ingredient.ofStacks( - Arrays.stream(new ItemStack[] { stack })); + JsonObject result = JsonHelper.getObject(json, "result"); + recipe.output = ItemUtil.fromJsonRecipe(result); + if (recipe.output == null) { + throw new IllegalStateException("Output item does not exists!"); } + recipe.time = JsonHelper.getInt(json, "time", 1); + + JsonObject catalysts = JsonHelper.asObject(json, "catalysts"); + ItemStack catalyst = ItemUtil.fromStackString(JsonHelper.getString(catalysts, "north", "")); + recipe.catalysts[0] = Ingredient.ofStacks(Arrays.stream(new ItemStack[] { catalyst })); + catalyst = ItemUtil.fromStackString(JsonHelper.getString(catalysts, "north_east", "")); + recipe.catalysts[1] = Ingredient.ofStacks(Arrays.stream(new ItemStack[] { catalyst })); + catalyst = ItemUtil.fromStackString(JsonHelper.getString(catalysts, "east", "")); + recipe.catalysts[2] = Ingredient.ofStacks(Arrays.stream(new ItemStack[] { catalyst })); + catalyst = ItemUtil.fromStackString(JsonHelper.getString(catalysts, "south_east", "")); + recipe.catalysts[3] = Ingredient.ofStacks(Arrays.stream(new ItemStack[] { catalyst })); + catalyst = ItemUtil.fromStackString(JsonHelper.getString(catalysts, "south", "")); + recipe.catalysts[4] = Ingredient.ofStacks(Arrays.stream(new ItemStack[] { catalyst })); + catalyst = ItemUtil.fromStackString(JsonHelper.getString(catalysts, "south_west", "")); + recipe.catalysts[5] = Ingredient.ofStacks(Arrays.stream(new ItemStack[] { catalyst })); + catalyst = ItemUtil.fromStackString(JsonHelper.getString(catalysts, "west", "")); + recipe.catalysts[6] = Ingredient.ofStacks(Arrays.stream(new ItemStack[] { catalyst })); + catalyst = ItemUtil.fromStackString(JsonHelper.getString(catalysts, "north_west", "")); + recipe.catalysts[7] = Ingredient.ofStacks(Arrays.stream(new ItemStack[] { catalyst })); + return recipe; } diff --git a/src/main/java/ru/betterend/util/ItemUtil.java b/src/main/java/ru/betterend/util/ItemUtil.java new file mode 100644 index 00000000..984967db --- /dev/null +++ b/src/main/java/ru/betterend/util/ItemUtil.java @@ -0,0 +1,56 @@ +package ru.betterend.util; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import com.google.gson.JsonObject; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Identifier; +import net.minecraft.util.JsonHelper; +import net.minecraft.util.registry.Registry; +import ru.betterend.BetterEnd; + +public class ItemUtil { + + public static String toStackString(@NotNull ItemStack stack) { + try { + if (stack == null) { + throw new IllegalStateException("Stack can't be null!"); + } + Item item = stack.getItem(); + return Registry.ITEM.getId(item) + ":" + stack.getCount(); + } catch (Exception ex) { + BetterEnd.LOGGER.catching(ex); + } + return ""; + } + + @Nullable + public static ItemStack fromStackString(String stackString) { + String[] parts = stackString.split(":"); + Identifier itemId = new Identifier(parts[0], parts[1]); + Item item = Registry.ITEM.getOrEmpty(itemId).orElse(null); + if (item == null) return null; + if (parts.length > 2) { + return new ItemStack(item, Integer.valueOf(parts[2])); + } + return new ItemStack(item); + } + + @Nullable + public static ItemStack fromJsonRecipe(JsonObject recipe) { + if (!recipe.has("item")) return null; + try { + Identifier itemId = new Identifier(JsonHelper.getString(recipe, "item")); + Item item = Registry.ITEM.getOrEmpty(itemId).orElse(null); + if (item == null) return null; + int count = JsonHelper.getInt(recipe, "count", 1); + return new ItemStack(item, count); + } catch (Exception ex) { + BetterEnd.LOGGER.catching(ex); + } + return null; + } +} From 9e067499eb7203dc335ddd3df8f7c4174d65b1f0 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sun, 27 Dec 2020 15:57:21 +0300 Subject: [PATCH 043/463] Update ItemUtil.java --- src/main/java/ru/betterend/util/ItemUtil.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/ru/betterend/util/ItemUtil.java b/src/main/java/ru/betterend/util/ItemUtil.java index 984967db..65f15237 100644 --- a/src/main/java/ru/betterend/util/ItemUtil.java +++ b/src/main/java/ru/betterend/util/ItemUtil.java @@ -29,6 +29,7 @@ public class ItemUtil { @Nullable public static ItemStack fromStackString(String stackString) { + if (stackString == null || stackString.equals("")) return null; String[] parts = stackString.split(":"); Identifier itemId = new Identifier(parts[0], parts[1]); Item item = Registry.ITEM.getOrEmpty(itemId).orElse(null); From 67340033bc53a6bd0df6426b929b362e04a328b0 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sun, 27 Dec 2020 16:01:09 +0300 Subject: [PATCH 044/463] Small fix --- .../ru/betterend/recipe/builders/AlloyingRecipe.java | 2 +- src/main/java/ru/betterend/util/ItemUtil.java | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java index 0e3dfc5f..7ea3597c 100644 --- a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java @@ -238,8 +238,8 @@ public class AlloyingRecipe implements Recipe { JsonArray ingredients = JsonHelper.getArray(json, "ingredients"); Ingredient primaryInput = Ingredient.fromJson(ingredients.get(0)); Ingredient secondaryInput = Ingredient.fromJson(ingredients.get(1)); - JsonObject result = JsonHelper.getObject(json, "result"); String group = JsonHelper.getString(json, "group", ""); + JsonObject result = JsonHelper.getObject(json, "result"); ItemStack output = ItemUtil.fromJsonRecipe(result); if (output == null) { throw new IllegalStateException("Output item does not exists!"); diff --git a/src/main/java/ru/betterend/util/ItemUtil.java b/src/main/java/ru/betterend/util/ItemUtil.java index 65f15237..8d8f6835 100644 --- a/src/main/java/ru/betterend/util/ItemUtil.java +++ b/src/main/java/ru/betterend/util/ItemUtil.java @@ -31,13 +31,17 @@ public class ItemUtil { public static ItemStack fromStackString(String stackString) { if (stackString == null || stackString.equals("")) return null; String[] parts = stackString.split(":"); + if (parts.length < 2) return null; + if (parts.length == 2) { + Identifier itemId = new Identifier(stackString); + Item item = Registry.ITEM.getOrEmpty(itemId).orElse(null); + if (item == null) return null; + return new ItemStack(item); + } Identifier itemId = new Identifier(parts[0], parts[1]); Item item = Registry.ITEM.getOrEmpty(itemId).orElse(null); if (item == null) return null; - if (parts.length > 2) { - return new ItemStack(item, Integer.valueOf(parts[2])); - } - return new ItemStack(item); + return new ItemStack(item, Integer.valueOf(parts[2])); } @Nullable From a0f7a2878da974f344beedfbab4899f1ff212816 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sun, 27 Dec 2020 16:04:36 +0300 Subject: [PATCH 045/463] Update ItemUtil.java --- src/main/java/ru/betterend/util/ItemUtil.java | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/main/java/ru/betterend/util/ItemUtil.java b/src/main/java/ru/betterend/util/ItemUtil.java index 8d8f6835..fe5de8f3 100644 --- a/src/main/java/ru/betterend/util/ItemUtil.java +++ b/src/main/java/ru/betterend/util/ItemUtil.java @@ -29,19 +29,26 @@ public class ItemUtil { @Nullable public static ItemStack fromStackString(String stackString) { - if (stackString == null || stackString.equals("")) return null; - String[] parts = stackString.split(":"); - if (parts.length < 2) return null; - if (parts.length == 2) { - Identifier itemId = new Identifier(stackString); + if (stackString == null || stackString.equals("")) { + return null; + } + try { + String[] parts = stackString.split(":"); + if (parts.length < 2) return null; + if (parts.length == 2) { + Identifier itemId = new Identifier(stackString); + Item item = Registry.ITEM.getOrEmpty(itemId).orElse(null); + if (item == null) return null; + return new ItemStack(item); + } + Identifier itemId = new Identifier(parts[0], parts[1]); Item item = Registry.ITEM.getOrEmpty(itemId).orElse(null); if (item == null) return null; - return new ItemStack(item); + return new ItemStack(item, Integer.valueOf(parts[2])); + } catch (Exception ex) { + BetterEnd.LOGGER.catching(ex); } - Identifier itemId = new Identifier(parts[0], parts[1]); - Item item = Registry.ITEM.getOrEmpty(itemId).orElse(null); - if (item == null) return null; - return new ItemStack(item, Integer.valueOf(parts[2])); + return null; } @Nullable From 220b16fa42ae84cee76c317eb957bd167c8f1ec3 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sun, 27 Dec 2020 16:13:51 +0300 Subject: [PATCH 046/463] Update ItemUtil.java --- src/main/java/ru/betterend/util/ItemUtil.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/main/java/ru/betterend/util/ItemUtil.java b/src/main/java/ru/betterend/util/ItemUtil.java index fe5de8f3..9d41b293 100644 --- a/src/main/java/ru/betterend/util/ItemUtil.java +++ b/src/main/java/ru/betterend/util/ItemUtil.java @@ -22,7 +22,7 @@ public class ItemUtil { Item item = stack.getItem(); return Registry.ITEM.getId(item) + ":" + stack.getCount(); } catch (Exception ex) { - BetterEnd.LOGGER.catching(ex); + BetterEnd.LOGGER.error("ItemStack serialization error!", ex); } return ""; } @@ -37,16 +37,18 @@ public class ItemUtil { if (parts.length < 2) return null; if (parts.length == 2) { Identifier itemId = new Identifier(stackString); - Item item = Registry.ITEM.getOrEmpty(itemId).orElse(null); - if (item == null) return null; + Item item = Registry.ITEM.getOrEmpty(itemId).orElseThrow(() -> { + return new IllegalStateException("Output item " + itemId + " does not exists!"); + }); return new ItemStack(item); } Identifier itemId = new Identifier(parts[0], parts[1]); - Item item = Registry.ITEM.getOrEmpty(itemId).orElse(null); - if (item == null) return null; + Item item = Registry.ITEM.getOrEmpty(itemId).orElseThrow(() -> { + return new IllegalStateException("Output item " + itemId + " does not exists!"); + }); return new ItemStack(item, Integer.valueOf(parts[2])); } catch (Exception ex) { - BetterEnd.LOGGER.catching(ex); + BetterEnd.LOGGER.error("ItemStack deserialization error!", ex); } return null; } @@ -56,12 +58,14 @@ public class ItemUtil { if (!recipe.has("item")) return null; try { Identifier itemId = new Identifier(JsonHelper.getString(recipe, "item")); - Item item = Registry.ITEM.getOrEmpty(itemId).orElse(null); + Item item = Registry.ITEM.getOrEmpty(itemId).orElseThrow(() -> { + return new IllegalStateException("Output item " + itemId + " does not exists!"); + }); if (item == null) return null; int count = JsonHelper.getInt(recipe, "count", 1); return new ItemStack(item, count); } catch (Exception ex) { - BetterEnd.LOGGER.catching(ex); + BetterEnd.LOGGER.error("ItemStack deserialization error!", ex); } return null; } From 66c2506fa30293eacec5a815f82f8cc19e901fb6 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sun, 27 Dec 2020 16:19:15 +0300 Subject: [PATCH 047/463] Update ItemUtil.java --- src/main/java/ru/betterend/util/ItemUtil.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/util/ItemUtil.java b/src/main/java/ru/betterend/util/ItemUtil.java index 9d41b293..16ab37c8 100644 --- a/src/main/java/ru/betterend/util/ItemUtil.java +++ b/src/main/java/ru/betterend/util/ItemUtil.java @@ -55,13 +55,14 @@ public class ItemUtil { @Nullable public static ItemStack fromJsonRecipe(JsonObject recipe) { - if (!recipe.has("item")) return null; try { + if (!recipe.has("item")) { + throw new IllegalStateException("Invalid JsonObject. Entry 'item' does not exists!"); + } Identifier itemId = new Identifier(JsonHelper.getString(recipe, "item")); Item item = Registry.ITEM.getOrEmpty(itemId).orElseThrow(() -> { return new IllegalStateException("Output item " + itemId + " does not exists!"); }); - if (item == null) return null; int count = JsonHelper.getInt(recipe, "count", 1); return new ItemStack(item, count); } catch (Exception ex) { From 47ba04c17776e22320682028ea5408aefcecaaa6 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 27 Dec 2020 18:52:29 +0300 Subject: [PATCH 048/463] Bonemeal mixin fix --- .../mixin/common/BoneMealItemMixin.java | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java index 59b73272..708d3593 100644 --- a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java +++ b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java @@ -37,6 +37,7 @@ public class BoneMealItemMixin { if (!world.isClient) { BlockPos offseted = blockPos.offset(context.getSide()); boolean endBiome = world.getBiome(offseted).getCategory() == Category.THEEND; + //boolean skip = false; if (world.getBlockState(blockPos).isIn(EndTags.END_GROUND)) { boolean consume = false; @@ -48,30 +49,32 @@ public class BoneMealItemMixin { } } else { - if (!world.getBlockState(offseted).equals(Blocks.WATER)) { - info.cancel(); - } - else if (!world.getFluidState(offseted).isEmpty() && endBiome) { - consume = beGrowWaterGrass(world, blockPos); + if (!world.getFluidState(offseted).isEmpty() && endBiome) { + if (world.getBlockState(offseted).equals(Blocks.WATER)) { + consume = beGrowWaterGrass(world, blockPos); + } + /*else { + skip = true; + }*/ } else { consume = beGrowGrass(world, blockPos); } } if (consume) { - if (!context.getPlayer().isCreative()) + if (!context.getPlayer().isCreative()) { context.getStack().decrement(1); + } world.syncWorldEvent(2005, blockPos, 0); info.setReturnValue(ActionResult.SUCCESS); info.cancel(); } } - else if (!world.getBlockState(offseted).equals(Blocks.WATER)) { - info.cancel(); - } else if (!world.getFluidState(offseted).isEmpty() && endBiome) { - info.setReturnValue(ActionResult.FAIL); - info.cancel(); + if (world.getBlockState(offseted).equals(Blocks.WATER)) { + info.setReturnValue(ActionResult.FAIL); + info.cancel(); + } } } } From d97d4e39532fe97f318c10b58df23fd97c39b136 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 27 Dec 2020 19:20:31 +0300 Subject: [PATCH 049/463] Some fixes --- .../integration/byg/biomes/BYGBiomes.java | 4 ++-- .../byg/features/BigEtherTreeFeature.java | 15 +++++---------- .../betterend/mixin/common/BoneMealItemMixin.java | 4 ---- 3 files changed, 7 insertions(+), 16 deletions(-) diff --git a/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java b/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java index c165d77f..8d426eb2 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java @@ -7,12 +7,12 @@ import ru.betterend.world.biome.EndBiome; public class BYGBiomes { // New Biomes public static final EndBiome OLD_BULBIS_GARDENS = EndBiomes.registerSubBiomeIntegration(new OldBulbisGardens()); - public static final EndBiome ETHERIAL_GROVE = EndBiomes.registerSubBiomeIntegration(new EterialGrove()); + //public static final EndBiome ETHERIAL_GROVE = EndBiomes.registerSubBiomeIntegration(new EterialGrove()); public static void register() {} public static void addBiomes() { EndBiomes.addSubBiomeIntegration(OLD_BULBIS_GARDENS, Integrations.BYG.getID("bulbis_gardens")); - EndBiomes.addSubBiomeIntegration(ETHERIAL_GROVE, Integrations.BYG.getID("ethereal_islands")); + //EndBiomes.addSubBiomeIntegration(ETHERIAL_GROVE, Integrations.BYG.getID("ethereal_islands")); } } diff --git a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java index 8219e4f4..3be4934a 100644 --- a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java @@ -18,9 +18,6 @@ import ru.betterend.registry.EndTags; import ru.betterend.util.MHelper; import ru.betterend.util.SplineHelper; import ru.betterend.util.sdf.SDF; -import ru.betterend.util.sdf.operator.SDFSmoothUnion; -import ru.betterend.util.sdf.operator.SDFTranslate; -import ru.betterend.util.sdf.operator.SDFUnion; import ru.betterend.world.features.DefaultFeature; public class BigEtherTreeFeature extends DefaultFeature { @@ -41,14 +38,14 @@ public class BigEtherTreeFeature extends DefaultFeature { SplineHelper.offsetParts(trunk, random, 2F, 0, 2F); SDF sdf = SplineHelper.buildSDF(trunk, 2.3F, 0.8F, splinePlacer); - int count = height / 10; + int count = height / 15; for (int i = 1; i < count; i++) { - float splinePos = (float) i / count; + float splinePos = (float) i / (float) count; float startAngle = random.nextFloat() * MHelper.PI2; float length = (1 - splinePos) * height * 0.4F; int points = (int) (length / 3); List branch = SplineHelper.makeSpline(0, 0, 0, length, 0, 0, points < 2 ? 2 : points); - SplineHelper.powerOffset(branch, length * 0.5F, 1.5F); + SplineHelper.powerOffset(branch, length, 2F); int rotCount = MHelper.randRange(5, 7, random); float startRad = MathHelper.lerp(splinePos, 2.3F, 0.8F) * 0.8F; Vector3f start = SplineHelper.getPos(trunk, splinePos * (trunk.size() - 1)); @@ -58,10 +55,8 @@ public class BigEtherTreeFeature extends DefaultFeature { List br = SplineHelper.copySpline(branch); SplineHelper.offsetParts(br, random, 0, 1, 1); SplineHelper.rotateSpline(br, angle); - //SDF branchSDF = SplineHelper.buildSDF(br, startRad, 0.5F, splinePlacer); - //branchSDF = new SDFTranslate().setTranslate(start.getX(), start.getY(), start.getZ()).setSource(branchSDF); - //sdf = new SDFSmoothUnion().setRadius(2).setSourceA(sdf).setSourceB(branchSDF); - //sdf = new SDFUnion().setSourceA(sdf).setSourceB(branchSDF); + + SplineHelper.offset(br, start); SplineHelper.fillSpline(br, world, wood, pos, replace); } } diff --git a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java index 708d3593..490ce1cd 100644 --- a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java +++ b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java @@ -37,7 +37,6 @@ public class BoneMealItemMixin { if (!world.isClient) { BlockPos offseted = blockPos.offset(context.getSide()); boolean endBiome = world.getBiome(offseted).getCategory() == Category.THEEND; - //boolean skip = false; if (world.getBlockState(blockPos).isIn(EndTags.END_GROUND)) { boolean consume = false; @@ -53,9 +52,6 @@ public class BoneMealItemMixin { if (world.getBlockState(offseted).equals(Blocks.WATER)) { consume = beGrowWaterGrass(world, blockPos); } - /*else { - skip = true; - }*/ } else { consume = beGrowGrass(world, blockPos); From aec4749e8c175d9218d04daa48e2c84969d72faf Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 27 Dec 2020 19:35:12 +0300 Subject: [PATCH 050/463] Music reorganization --- .../java/ru/betterend/registry/EndSounds.java | 13 +- .../betterend/world/biome/BiomeAmberLand.java | 2 +- .../world/biome/BiomeBlossomingSpires.java | 2 +- .../world/biome/BiomeChorusForest.java | 2 +- .../world/biome/BiomeCrystalMountains.java | 2 +- .../world/biome/BiomeDustWastelands.java | 2 +- .../world/biome/BiomeFoggyMushroomland.java | 2 +- .../betterend/world/biome/BiomeMegalake.java | 2 +- .../world/biome/BiomeMegalakeGrove.java | 2 +- .../world/biome/BiomePaintedMountains.java | 2 +- .../world/biome/BiomeShadowForest.java | 2 +- .../world/biome/BiomeSulphurSprings.java | 2 +- .../world/biome/BiomeUmbrellaJungle.java | 2 + .../resources/assets/betterend/sounds.json | 161 +++++++----------- .../sounds/music/jesse_gallagher-obelisks.ogg | Bin 1603235 -> 0 bytes .../music/jesse_gallagher-spenta_mainyu.ogg | Bin 1663465 -> 0 bytes 16 files changed, 80 insertions(+), 118 deletions(-) delete mode 100644 src/main/resources/assets/betterend/sounds/music/jesse_gallagher-obelisks.ogg delete mode 100644 src/main/resources/assets/betterend/sounds/music/jesse_gallagher-spenta_mainyu.ogg diff --git a/src/main/java/ru/betterend/registry/EndSounds.java b/src/main/java/ru/betterend/registry/EndSounds.java index 6107ecf8..3369d28f 100644 --- a/src/main/java/ru/betterend/registry/EndSounds.java +++ b/src/main/java/ru/betterend/registry/EndSounds.java @@ -6,15 +6,10 @@ import ru.betterend.BetterEnd; public class EndSounds { // Music - public static final SoundEvent MUSIC_FOGGY_MUSHROOMLAND = register("music", "foggy_mushroomland"); - public static final SoundEvent MUSIC_CHORUS_FOREST = register("music", "chorus_forest"); - public static final SoundEvent MUSIC_CRYSTAL_MOUNTAINS = register("music", "crystal_mountains"); - public static final SoundEvent MUSIC_MEGALAKE = register("music", "megalake"); - public static final SoundEvent MUSIC_DUST_WASTELANDS = register("music", "dust_wastelands"); - public static final SoundEvent MUSIC_SHADOW_FOREST = register("music", "shadow_forest"); - public static final SoundEvent MUSIC_BLOSSOMING_SPIRES = register("music", "blossoming_spires"); - public static final SoundEvent MUSIC_AMBER_LAND = register("music", "amber_land"); - public static final SoundEvent MUSIC_SULPHUR_SPRINGS = register("music", "sulphur_springs"); + public static final SoundEvent MUSIC_FOREST = register("music", "forest"); + public static final SoundEvent MUSIC_WATER = register("music", "water"); + public static final SoundEvent MUSIC_DARK = register("music", "dark"); + public static final SoundEvent MUSIC_OPENSPACE = register("music", "openspace"); // Ambient public static final SoundEvent AMBIENT_FOGGY_MUSHROOMLAND = register("ambient", "foggy_mushroomland"); diff --git a/src/main/java/ru/betterend/world/biome/BiomeAmberLand.java b/src/main/java/ru/betterend/world/biome/BiomeAmberLand.java index c8aed8fd..6ee4cb36 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeAmberLand.java +++ b/src/main/java/ru/betterend/world/biome/BiomeAmberLand.java @@ -14,7 +14,7 @@ public class BiomeAmberLand extends EndBiome { .setFogDensity(2.0F) .setPlantsColor(219, 115, 38) .setWaterAndFogColor(145, 108, 72) - .setMusic(EndSounds.MUSIC_AMBER_LAND) + .setMusic(EndSounds.MUSIC_FOREST) .setParticles(EndParticles.AMBER_SPHERE, 0.001F) .setSurface(EndBlocks.AMBER_MOSS) .addFeature(EndFeatures.AMBER_ORE) diff --git a/src/main/java/ru/betterend/world/biome/BiomeBlossomingSpires.java b/src/main/java/ru/betterend/world/biome/BiomeBlossomingSpires.java index dc615281..dbecf76a 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeBlossomingSpires.java +++ b/src/main/java/ru/betterend/world/biome/BiomeBlossomingSpires.java @@ -13,7 +13,7 @@ public class BiomeBlossomingSpires extends EndBiome { .setPlantsColor(122, 45, 122) .setCaves(false) .setSurface(EndBlocks.PINK_MOSS) - .setMusic(EndSounds.MUSIC_BLOSSOMING_SPIRES) + .setMusic(EndSounds.MUSIC_FOREST) .setLoop(EndSounds.AMBIENT_BLOSSOMING_SPIRES) .addFeature(EndFeatures.SPIRE) .addFeature(EndFeatures.FLOATING_SPIRE) diff --git a/src/main/java/ru/betterend/world/biome/BiomeChorusForest.java b/src/main/java/ru/betterend/world/biome/BiomeChorusForest.java index 92db643e..86ce96cd 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeChorusForest.java +++ b/src/main/java/ru/betterend/world/biome/BiomeChorusForest.java @@ -20,7 +20,7 @@ public class BiomeChorusForest extends EndBiome { .setSurface(EndBlocks.CHORUS_NYLIUM) .setParticles(ParticleTypes.PORTAL, 0.01F) .setLoop(EndSounds.AMBIENT_CHORUS_FOREST) - .setMusic(EndSounds.MUSIC_CHORUS_FOREST) + .setMusic(EndSounds.MUSIC_DARK) .addFeature(EndFeatures.VIOLECITE_LAYER) .addFeature(EndFeatures.END_LAKE_RARE) .addFeature(EndFeatures.PYTHADENDRON_TREE) diff --git a/src/main/java/ru/betterend/world/biome/BiomeCrystalMountains.java b/src/main/java/ru/betterend/world/biome/BiomeCrystalMountains.java index aead7440..cd6c80f5 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeCrystalMountains.java +++ b/src/main/java/ru/betterend/world/biome/BiomeCrystalMountains.java @@ -11,7 +11,7 @@ public class BiomeCrystalMountains extends EndBiome { super(new BiomeDefinition("crystal_mountains") .setPlantsColor(255, 133, 211) .setSurface(EndBlocks.CRYSTAL_MOSS) - .setMusic(EndSounds.MUSIC_CRYSTAL_MOUNTAINS) + .setMusic(EndSounds.MUSIC_OPENSPACE) .addStructureFeature(EndStructures.MOUNTAIN) .addFeature(EndFeatures.ROUND_CAVE) .addFeature(EndFeatures.CRYSTAL_GRASS) diff --git a/src/main/java/ru/betterend/world/biome/BiomeDustWastelands.java b/src/main/java/ru/betterend/world/biome/BiomeDustWastelands.java index 4bd14725..c663cf09 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeDustWastelands.java +++ b/src/main/java/ru/betterend/world/biome/BiomeDustWastelands.java @@ -16,7 +16,7 @@ public class BiomeDustWastelands extends EndBiome { .setSurface(EndBlocks.ENDSTONE_DUST) .setParticles(ParticleTypes.WHITE_ASH, 0.01F) .setLoop(EndSounds.AMBIENT_DUST_WASTELANDS) - .setMusic(EndSounds.MUSIC_DUST_WASTELANDS) + .setMusic(EndSounds.MUSIC_OPENSPACE) .addStructureFeature(ConfiguredStructureFeatures.END_CITY) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); } diff --git a/src/main/java/ru/betterend/world/biome/BiomeFoggyMushroomland.java b/src/main/java/ru/betterend/world/biome/BiomeFoggyMushroomland.java index ec9adfa0..4158875e 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeFoggyMushroomland.java +++ b/src/main/java/ru/betterend/world/biome/BiomeFoggyMushroomland.java @@ -19,7 +19,7 @@ public class BiomeFoggyMushroomland extends EndBiome { .setSurface(EndBlocks.END_MOSS, EndBlocks.END_MYCELIUM) .setParticles(EndParticles.GLOWING_SPHERE, 0.001F) .setLoop(EndSounds.AMBIENT_FOGGY_MUSHROOMLAND) - .setMusic(EndSounds.MUSIC_FOGGY_MUSHROOMLAND) + .setMusic(EndSounds.MUSIC_FOREST) .addStructureFeature(EndStructures.GIANT_MOSSY_GLOWSHROOM) .addFeature(EndFeatures.END_LAKE) .addFeature(EndFeatures.MOSSY_GLOWSHROOM) diff --git a/src/main/java/ru/betterend/world/biome/BiomeMegalake.java b/src/main/java/ru/betterend/world/biome/BiomeMegalake.java index 24c77326..86ed7887 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeMegalake.java +++ b/src/main/java/ru/betterend/world/biome/BiomeMegalake.java @@ -14,7 +14,7 @@ public class BiomeMegalake extends EndBiome { .setFogColor(178, 209, 248) .setWaterAndFogColor(96, 163, 255) .setFogDensity(1.75F) - .setMusic(EndSounds.MUSIC_MEGALAKE) + .setMusic(EndSounds.MUSIC_WATER) .setLoop(EndSounds.AMBIENT_MEGALAKE) .setSurface(EndBlocks.END_MOSS, EndBlocks.ENDSTONE_DUST) .addStructureFeature(EndStructures.MEGALAKE) diff --git a/src/main/java/ru/betterend/world/biome/BiomeMegalakeGrove.java b/src/main/java/ru/betterend/world/biome/BiomeMegalakeGrove.java index 2f02fbad..2404e851 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeMegalakeGrove.java +++ b/src/main/java/ru/betterend/world/biome/BiomeMegalakeGrove.java @@ -16,7 +16,7 @@ public class BiomeMegalakeGrove extends EndBiome { .setWaterAndFogColor(96, 163, 255) .setFogDensity(2.0F) .setParticles(EndParticles.GLOWING_SPHERE, 0.001F) - .setMusic(EndSounds.MUSIC_MEGALAKE) + .setMusic(EndSounds.MUSIC_WATER) .setLoop(EndSounds.AMBIENT_MEGALAKE_GROVE) .setSurface(EndBlocks.END_MOSS) .addStructureFeature(EndStructures.MEGALAKE) diff --git a/src/main/java/ru/betterend/world/biome/BiomePaintedMountains.java b/src/main/java/ru/betterend/world/biome/BiomePaintedMountains.java index 1aa00072..49aa5c47 100644 --- a/src/main/java/ru/betterend/world/biome/BiomePaintedMountains.java +++ b/src/main/java/ru/betterend/world/biome/BiomePaintedMountains.java @@ -13,7 +13,7 @@ public class BiomePaintedMountains extends EndBiome { .setFogDensity(2) .setCaves(false) .setWaterAndFogColor(192, 180, 131) - .setMusic(EndSounds.MUSIC_DUST_WASTELANDS) + .setMusic(EndSounds.MUSIC_OPENSPACE) .setLoop(EndSounds.AMBIENT_DUST_WASTELANDS) .setSurface(EndBlocks.ENDSTONE_DUST) .setParticles(ParticleTypes.WHITE_ASH, 0.01F) diff --git a/src/main/java/ru/betterend/world/biome/BiomeShadowForest.java b/src/main/java/ru/betterend/world/biome/BiomeShadowForest.java index 5681fc6e..a2d917a0 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeShadowForest.java +++ b/src/main/java/ru/betterend/world/biome/BiomeShadowForest.java @@ -18,7 +18,7 @@ public class BiomeShadowForest extends EndBiome { .setSurface(EndBlocks.SHADOW_GRASS) .setParticles(ParticleTypes.MYCELIUM, 0.01F) .setLoop(EndSounds.AMBIENT_CHORUS_FOREST) - .setMusic(EndSounds.MUSIC_SHADOW_FOREST) + .setMusic(EndSounds.MUSIC_DARK) .addFeature(EndFeatures.VIOLECITE_LAYER) .addFeature(EndFeatures.END_LAKE_RARE) .addFeature(EndFeatures.DRAGON_TREE) diff --git a/src/main/java/ru/betterend/world/biome/BiomeSulphurSprings.java b/src/main/java/ru/betterend/world/biome/BiomeSulphurSprings.java index 5ade846c..c2df018e 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeSulphurSprings.java +++ b/src/main/java/ru/betterend/world/biome/BiomeSulphurSprings.java @@ -11,7 +11,7 @@ public class BiomeSulphurSprings extends EndBiome { public BiomeSulphurSprings() { super(new BiomeDefinition("sulphur_springs") .setSurface(SurfaceBuilders.SULPHURIC_SURFACE) - .setMusic(EndSounds.MUSIC_SULPHUR_SPRINGS) + .setMusic(EndSounds.MUSIC_OPENSPACE) .setLoop(EndSounds.AMBIENT_SULPHUR_SPRINGS) .setWaterColor(25, 90, 157) .setWaterFogColor(30, 65, 61) diff --git a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java index 1c62dd40..7017a173 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java +++ b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java @@ -2,6 +2,7 @@ package ru.betterend.world.biome; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndSounds; public class BiomeUmbrellaJungle extends EndBiome { public BiomeUmbrellaJungle() { @@ -10,6 +11,7 @@ public class BiomeUmbrellaJungle extends EndBiome { .setWaterAndFogColor(119, 198, 253) .setFoliageColor(27, 183, 194) .setFogDensity(2.3F) + .setMusic(EndSounds.MUSIC_FOREST) .setSurface(EndBlocks.JUNGLE_MOSS) .addFeature(EndFeatures.END_LAKE) .addFeature(EndFeatures.UMBRELLA_TREE) diff --git a/src/main/resources/assets/betterend/sounds.json b/src/main/resources/assets/betterend/sounds.json index 9c0ccf60..9ff2a241 100644 --- a/src/main/resources/assets/betterend/sounds.json +++ b/src/main/resources/assets/betterend/sounds.json @@ -1,5 +1,5 @@ { - "betterend.music.foggy_mushroomland": { + "betterend.music.forest": { "category": "music", "sounds": [ { @@ -11,102 +11,7 @@ "name": "betterend:music/dan_henig-nebular_focus", "volume": 0.2, "stream": false - } - ] - }, - "betterend.music.chorus_forest": { - "category": "music", - "sounds": [ - { - "name": "betterend:music/emmit_fenn-creep", - "volume": 0.2, - "stream": false }, - { - "name": "betterend:music/jesse_gallagher-the_anunnaki_return", - "volume": 0.2, - "stream": false - } - ] - }, - "betterend.music.crystal_mountains": { - "category": "music", - "sounds": [ - { - "name": "betterend:music/jesse_gallagher-spenta_mainyu", - "volume": 0.2, - "stream": false - }, - { - "name": "betterend:music/jesse_gallagher-obelisks", - "volume": 0.2, - "stream": false - } - ] - }, - "betterend.music.megalake": { - "category": "music", - "sounds": [ - { - "name": "betterend:music/jesse_gallagher-the_blue_pearl", - "volume": 0.2, - "stream": false - }, - { - "name": "betterend:music/jesse_gallagher-venkatesananda", - "volume": 0.2, - "stream": false - } - ] - }, - "betterend.music.dust_wastelands": { - "category": "music", - "sounds": [ - { - "name": "betterend:music/the-tides-ammil", - "volume": 0.2, - "stream": false - }, - { - "name": "betterend:music/vyen-amber", - "volume": 0.2, - "stream": false - } - ] - }, - "betterend.music.shadow_forest": { - "category": "music", - "sounds": [ - { - "name": "betterend:music/i_think_i_can_help_you-the_six_realms", - "volume": 0.2, - "stream": false - }, - { - "name": "betterend:music/jesse_gallagher-maestro_tlakaelel", - "volume": 0.2, - "stream": false - } - ] - }, - "betterend.music.blossoming_spires": { - "category": "music", - "sounds": [ - { - "name": "betterend:music/benjamin_martins-verve", - "volume": 0.2, - "stream": false - }, - { - "name": "betterend:music/the_tides-somnolent", - "volume": 0.2, - "stream": false - } - ] - }, - "betterend.music.amber_land": { - "category": "music", - "sounds": [ { "name": "betterend:music/bobby_richards-two_moons", "volume": 0.2, @@ -119,7 +24,57 @@ } ] }, - "betterend.music.sulphur_springs": { + "betterend.music.water": { + "category": "music", + "sounds": [ + { + "name": "betterend:music/jesse_gallagher-the_blue_pearl", + "volume": 0.2, + "stream": false + }, + { + "name": "betterend:music/jesse_gallagher-venkatesananda", + "volume": 0.2, + "stream": false + }, + { + "name": "betterend:music/the_tides-somnolent", + "volume": 0.2, + "stream": false + }, + { + "name": "betterend:music/benjamin_martins-verve", + "volume": 0.2, + "stream": false + } + ] + }, + "betterend.music.dark": { + "category": "music", + "sounds": [ + { + "name": "betterend:music/emmit_fenn-creep", + "volume": 0.2, + "stream": false + }, + { + "name": "betterend:music/jesse_gallagher-the_anunnaki_return", + "volume": 0.2, + "stream": false + }, + { + "name": "betterend:music/i_think_i_can_help_you-the_six_realms", + "volume": 0.2, + "stream": false + }, + { + "name": "betterend:music/jesse_gallagher-maestro_tlakaelel", + "volume": 0.2, + "stream": false + } + ] + }, + "betterend.music.openspace": { "category": "music", "sounds": [ { @@ -131,9 +86,19 @@ "name": "betterend:music/asher_fulero-elegy", "volume": 0.2, "stream": false + }, + { + "name": "betterend:music/the-tides-ammil", + "volume": 0.2, + "stream": false + }, + { + "name": "betterend:music/vyen-amber", + "volume": 0.2, + "stream": false } ] - }, + } "betterend.ambient.foggy_mushroomland": { "category": "ambient", diff --git a/src/main/resources/assets/betterend/sounds/music/jesse_gallagher-obelisks.ogg b/src/main/resources/assets/betterend/sounds/music/jesse_gallagher-obelisks.ogg deleted file mode 100644 index 13a48c1c4191f0db47f46fdeda49884f590b632e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1603235 zcmeFZXH*nTw?A4F8S;=b3`!V+2#5lbh9p69MuLE3L53utB11+%M3M+7pkx6_l0+EE zIjSI8L4t~+VnBtt4bS_Y_niCXzwSEs(_Ob#Pg7l8Vb^b0?Y(PPHO3wu<^T@<6?%t;mK(|XlVh7bRLO*jq_n;8x z05=sKKR*v2HyG-l+JrSUtzduvfKVW(_?hBB_82U;h6&dSug2)bk6aoCOi{eD26jWj zfvJK;1sVx<_{i~8OK?yiUOkjGCQ%(D7$dA=lNK$i0>u&(p){|9G_1zIZ`z8U&|7s3 zU(AZM0$ubwgG}m6J4nYWfnTAYZ8rC+~AGrl*A`SbxSw1#~@GQ zlcQFp`(H%UY9!=D>z(|?9pj-M%KlFqLh8Dy(P;I4&X_am5Cv$(X4aS?^)l`laYc+k z3{K9K4Wt54@Bp9q08fMEuA>3{0ALBGtbP8x1GjkxYI$if^tPx2$T3hp-NYi@lvUj{ zA=@#e}Kmq^> zH6y2KuB?-xHD+Ns-RL{_-!8i>H?G6t5Qf-EFZXhEf;55)eaHuh3=&hKbT{eWAd@)t z86HqqDK6!$6xcH4=+`Rp<>@{NOUq4cQC!ap935E8lNp6#5Atm3a-e+cdEEuJH2=gz zYs1EK#1GQ^M>n1Fn0ld@NL5&B&dn!K3{~Zol5@5eis`n5ndP26NDDlu>hSiyXOlON z<>0aGSxZ*#cn=ga?%iC>!~R#6!+eJzL;WRS<8C_7i(w|$J#lB4T)1U7)qieCQ*%e> zX}q7<@GQzWjSb;om%QPpi`?tAi;&BafO>p9U4R_88OJu%Z4E6y;ZIm8bKVXuMaa!oZo zsM#e!tTZoxM!f7FIB^H80l@ex?*tRyf37dQV@$%P%+PggO7`TGxwd7n+jLg2ZBw}2 zOsvDt@CE4l73^%2STASbu;PYL2KL|Ggcu5ltU8C|O|MSq z?4;1hq@?jTIb#+TQ&#OMIm-z)2UB@p(^GC!CmqaBIapfxT4(v%H3rY!ahv-YzVzQN z2dcv^G6Qfr?WkDV5wWxtg%lw@f@i-tAfOLsWa3+V%8EjokY1XwSDHsyR@vR0&Aa!- zD-N>&>_L`;kXRC$SRR^K7Mik=kmh+etE@anVzA_6YxRf!(?xqYz=Z$^64D6}(lHa# zHiIIE=#uCT(BR#{3Wig1hAa@U)F2fG3b1x(t9s_Cy?I?G1BQiyj9jo4wU{G1Pnrg0ig|nP zb0=h&GGDF0Ur5v&mT4Fl6Rmn>b~=`|DBGNd&5Yq3#JpI5&4Dcwc?orrggUuHWB^E& zqaRmhtWiFYm*T0@6#}LXB2xU`9 zdi<{gdE$Sz1@-8lE#-f=1@#DO=>MIz{@29*{}udy9RVz)>XxCOlOQX1-4T$$0;Clf z?*g6%)Aj9Cj?O&prV$tSd%#qHTDX#ex-zsDfS%t?e4xO5@iziA>WB)Y)> zX$2w)fRq&*cF54m5>5ob$ut#FpH6;FWWb{Gs!k)`XlPB&%NrzX^NbnFG}T zsST{QDO3-XGuQ!_2oYEDzO{}H$_Pnx2kWdzd`?LPRCZ8S`Y=0VF|>??LO}^Q2@e37 zvxL=rP+CN=2+Q3o6vM0`BAl6_Ux6z!GZSNru`m-Cewb$FEoO-|6BEm%(GV}rv;bfx z5&`{UO+5Sc0ge%naAzQ;eSuE4g!RIxB2}hYqRe_;da_J!cHpR<7}tei#r2|$dbG!iR5w0knl^r18(eKFyfQAN?>j7ca93jh{}Xg};gxd@T!F|CN;uwT@ zmXKG@I)rdeiMw9TS{Rg4GVtwR=w}|hIDlS!nhmlG3?b<1B>#owKd=S6WtSYVpjFCe z&H}>UjjORLr$YQ`9i6>3WU(|xLhAeDY$E{MNGebO=dsdJ5aXtmlyen6(3b?x=w!$w zkHu=x2*zZXVW|Jd@Mi|P(2!59eRW_^y&~uwSXBDu#N>Z$t3w0p;HLjyvH#nP|A&t# zAZ4ilHdJS7PIu}}*f>EPg^?iUkU5L91B^7p*ff$AMFfl4C1N-sjP+&M#}ugwGhUsO zydTJ*Ay(C6WAQ#OBja3RRT-E7i=f=c(M2iE=Ih(JL}vh`aN9RnCbWZlNMuQ_WqxIF<5=^dx!aA%=Gn&56i}w zXy^$Szc^UnU^O6GGY-~8%o=!M2;svtd|?q}y$Z&dX<&*oAk@WTvHDOf%}h_Mm|341 zdT|hA)xZctFU1d-KwSt`FIEf{(-+Jz(GY_;$EyGtzMSf!T$b$452-o$|B)E30A$pe z>Eo*`2}g=Ki)J-+?nbi)-jEEWJ2z77!XSpOii3OM@6{LXBlIhY?(&G^Buq zjeU`WJ>d>aYU6D+LJ%p4QI}*WAR&44h+Qmxp`G+b<6`2$IH+F83IyBGn6n2=OcTS- zuAV-`pwMfin1tk1Nccg46I_GrFJXd~mRukw7dHI``r;qO9~Rmf`^SdIH15Ux);2oRET>`$lLKy zS`1*V>{Nvi%uJzAP zp7P!Ns*9VgnOmFIGn(DX#bZoQUEc?%d?-Gys(LLqR@Gs-p?tGs8sAz zDkRZ&>rp;#rHDHrq_~$EoM;Pa)U`I$Igwq`5S>oMZ)Kmr!xvcb`fq^+3MMJOuFo1Y z+)YC@-r1dLmZ@zzZZLVB=lP2gw&3sngK_z&?hfCOBng4B{y)lRt6LuFr3+u$e)1z{ z;r`zCj~jm-e{>M@=j8fijI~6aJ~&@}edW;^?t*Z^>bp0(=pP`4Hd=ecIxDS=T^0 z9WnRvleu|n#bvq<(Ybe5CfeLtghHD?g`kpNof2JZ7J7Z$4!y7w3lMuY2H`S(mL1jXWYS5Z21XX?kLagF%2v0UPA z`@O8y#a%*cc({A9OyNgL^(pV+`)3D*??#k>_6olk}N2FwBLNXdD0mj~p+2 zIH|37w#7v2bVP2PkH%>l#8UyY_QqyunX6;J|Lz*NzYF_(9d#xAqldXo(nZsjR%B6= z{PeTQru@q}4_vZKuEeV34qg6y=hgEU{ca3O7k}@Lj8t|6`+GUNPwMS_9nKi7?+ANU zrf0;0zm)fT_S5&Wb6@E0z9c3y|4JUX+1DfY?gb~@s407g`n2{&_O%#>py%g0uRIiB z8Cb)-&my@HV5nsrfaJ=Gotnn$Lw?x)w97>B5Nk=QWl=&!s0oM>bl@xYcT2kL9anbJ zC)%g7F9IYA*2BZ-ULXG%5znmBDUvQQ-gwKL_gss@lRMWMdox?6Ug>46E)-hdJQr&vm@#M;GFmYE+~T9xher+ian`-o z+)-c7YTm0Sf9Dp7zWAQD`AlHSIYc-n?@8|HEfH*wy^vpIG#ZT|prs+=7v^7Nh$Bvo zi|ipj>{7p6s)2EA!K|YOtYWcIduj)ghTyF#s(Wf0N&59P!fSa|ScvC#Ws9G+zkSq^ zDf#JmU{DK<3GP(*-P$SlzlQT{G-*Gx#x50 z$xi`i7J>~fW(KQ7(F!)8yIXJx_0tb@LBuR6VWY#O2$)jS(n%Lqi_E>Y5KvrYePYhk6HZD(S9QwZ!G@xM5tWFkW^Px{#+0UeywU4RRIEE}>}-N9k1Sp) zJJ_6`sxSBZeAb*SqWbhoxI~z4D^kjxUU%z+Fr`Dj+>c-xOlcG)Mo;u1sp>A1JVl*+=WMyftd>zN695l=> z_l_M`cn|Kzd}qp_;Uv+?6OF*|0vf0v(@o71W0406_w8v_>vm{p!F*66Em#fg4a$LD zkQTFCeqvDn(V0Q}ow#ceLQgomwDkIgE&Fe;)L0SZpX8ocq8B|A-wg%d?2z^E-j_n2 zbt1&4n?!gz7G)O%Jl!KC)8wS7|z8eNIqk`~lm3AS~{OdXW*pqeYpH65a8W2Jccf6g8JLajp zJ(1u4NEBmOQSdK?#^fT z^L@(qy`}6IT2NALjU(AAS=Ox;mpZ*aDLr-}_t>$QKG&0_uZHq5HyW#qd&=EW_ar?4 z48Re;w^S<{6X1jhn~bo1WS%MNLq^DerH~C!f}PaBJUE;l3f?bt#>*=QqXzYR{K__u z2`}~dQ#1vSgv;BZI>Tq%QFHKuDANJtj;dTEm!b2DCDujdc-lEVt54yJ_Lf&mLbFZ# zkCdb$GR?k7V)Y*VNWlN_d&u8!|7@m^S5JK7WNeBAb;^|6QJLq$j@|3CMrjY7f`?nJ zj<`OUeokw9L(bULWmfQ`MS#QDwVWI8B0tJf;UU|fwH?C0i9e=J^i-xbn7F&qd{9~O~*f`IZrP>GNl{6#!r4tg|dnw zy>xA)-TkPTrNw%uS4JSv?j|(~5!g-@ekwt%oNtP@FYMC^|0Qi--f0rz4r}1Jyz50D zCaQW9Q`*jUiAztOB(K}2e$Oe~Xe5X(jbAvoel&X9OJwzXyn)*wTDfPHt*RK#WcB^m zGJ`Po*_4Ms7L%ydYU@C%7Yz-O41+jOn$N7Epk8O$b$>@~!rT0%igPJoY_P$7+JH%0 zHk#-Oy`@A$dRyp}L($dM01V~@Bh^-g#!RUPy}!+mv!KhoL+#<799(H8u@t|ihF8KW zwr<^Lp3N1~UwbsrWuccXIoT#D`#6cYjfdGiwu38j{c>$dEDO&B?aXvMHD4;@HvvPu zF#guVV_Z9xt9JjO?Ej#!cD-rxQU~doZM03in2DPcii*^PzoAQLQq*1~3UGF>5 zr;u@m^LFM#bE|O!u+%^PFuvD>DU+e90NIf1h3xmbuBrA>EBnBlLUAlX*wc&db$p`d zq@IW0Ta!$>H~!F8G;{R(X2X%El0B>5h&CoO=P+K^#UQQP=%L&f$FKB$IH748CL_Y3 z5x;o*p5T(Ol>+yJN567jH3)Pz-a}2M%b#m_7UlNIH!~jN0gpd$5G_KJqLg1JjLL`Y zSNgt0pPco=39m+)P$#P8?Ux^cd6|Z=|62+UT5XogO3T+zO|Hn{Cg08rRG}8XX1r7Q zkrgKC(PZvPXuj3OPFZ>%HF4Dbw@XdHfZ-<#XpQv>#}~jYN^?RK@lpD$JEL)-!y$ z{9w_O5s5M?78EL_7P{8RwMSY}>NV8o*fjnMAYmYh(Bq+*OBVte^@y$&s<&Js}?n`%87Y=Z-dTg@b@ zD*>cwZcviSF0PZX6Tyjwk+R>TZ;gTD%%7`)58#acHd!yv!P{>FB_4lXIyBB`)Kx6szd-R4-*}CaykVHZ~$z zDcw`!?;twQPgasFlHay*Z{A1<={3!BZi(5uX*N`}M3u53%X?0(SbYdB z3p3#c|8guq&b5PZ;8;LFe;?H7_p^5ow{|`wcl8eqjr6v*HP_WwH?=<}w?o{zbyhCp z=|E$>WrD^gh5dqg!amhy8b~1yJe|@amDd&*qk8uRkdQ{y9k?41-rn4=3OBy;%>9gN z%!P*AmCw%a2FZyb0*SMmLx@Rw6BE<#SL*AZR@l^W?C45Vz7ad)&1Z9r-Na=&vrd_v zblfg3lP^)X7M4HnipO5V)1w?uxT8eHPH&w%t$Th+D4O1KA&9$qd|;xZdc!9*rIyB% zp-nZgMd;nB=;rGjFYTXJ)Mk8e!7bHFc)2Id9% z3qwb?36e0!d>(4)f!C87sofMD9RiS8esHa{=G?rlZu#raEa6XQXN8p2yJNjs97b@V zzL%f2TWK|7Yn2x%KgX*l8IRvh+B-hFb=qjhHjX{x z)sttQBMsjw>iP?3oJ;EL3p9&Ulr#dDxp^_b5#q<4axZ)ctB>C&+8dLUs&xacpD}lN z>G=C$+mSN5<474hwp5Bh48#xevB?L|Jzu1h6r2*1wZ9WkPJVtNv;Nc8h3^q)QrBq} zRdOw}P@=*SuF7*Q3#|7x?!*%?Y>LLNua9nTIX#MMZ^Sxj163uM2}=Duj;fcbnc!(f z7ia&}ohrF;P%Qt&i^PoQ$Ltg$#BGl{eDR}?uu77sZqaXa747z$I!i6}?ZqqgJZdRT z+HCYPkiC95?_TRWgg{f6FFv1WxxK~(>qorS z44}$3aE}3@qXN*PdK5OrL=N#Hi163>xK>$>$;(HP2N<3xHG?uI^ zDcBH-c8pLmRrkJIgQAXwW>wyng}b5fd6oj{lYT)*q)$0J za2tgun!cF5_sq&w@aN_byKE)$0Zu11XnNrj4CM8y(SwasHIAeseChVfCx>3Z$B!hD z!h`@0@O4_3nj^=F&t}gA!Q2&TF+!`32yx#B+w=s%@bW8GRcMCcODLo!gN-gz=j9>U zjRN{CmG&)n7sIaAZZ`|qEE9kxa)_g-rN`8*xsKX=xMBi-amV+@`QrDBmOgWtyv?5U z0}hep8pZTJ>8!sGgfH$?ge9Ma<@Ftmfltu7o_wMtA$##!w=#S5z>xHYOJrBsV`H02 z7|z9Wr`v-Aer%Tynme2%VwBcB1P0QeByH{^Wsru1{d{RL^@dNT;j^h(@TtIn?!DuuUjm(_(#i7-By z+)h2ZCcvt!9C_W$();#qjrG@|@DfJ*GuNrIBIc&8=cH8smUf?;PqLZdyS+T!RLus2 z?;5$;#f+W^vaDQgye39cral!3CvVQ%sVxA4qWT0I;6SFv5sAPgd~a{@A_k1ASF^kl zAtjpfoQpm}H}k3(fAjh~?t8O88&NFx*gLtob>1o0z_5^ua$jt($#+gHIeq8CpFU^R z%hd)CcNkR??JOyV6OS+a^pLvsO1dA$OMlLn)dDG=7c%V8YoJhtDoq zh83;zfO%;x0;GlkX|8JQ@vVVjY-dGlp^PgpS?L$I4RVh=yv24s?|ZJHL-6ZI=c=0G^CK-X*kZwcbrW_)`WD8p13y@a{Z&r zvH}9ENv?h4@A!Kh*s#uwpA!In;KK4>vb82;{K>IkhNIAT&@sz*)$e`uvJ}o6q^Z}> z^UBKcU>m%~jXo{C%R@rK0lzpjs(g>mm~!0T|MMi;ELCi;bSV?n8T1*yH}d=&eYmnT zowTC_rUn^_ChLU*(p0)=y1;gAG-PcFU6L;9t9q$0OSOCMWIyxAqqlcrVF2`guem_R zg5^86sev@<&GH&c@>Z@Ri{>0mf-wj2N)wRFXsn7z{jFUUz-Za+DPrdb43HP5AG<^I zM~WH{*|7?qRKP^}Hm5X!Srwi1Sk9AW>dYkBW46=aQC8)AJzZFZ7W~~`N3rx(r833( zC^|WXWio)IQ~s&OA)(Uu>vL);yB|~Wiy8Y*uXn1p_ zW8E>)A6-zk#d4?AGaU`4PpnLZzz80$AOs9KF9-G0xqm&L0md(Vd72BuF>W~1SoE8b zN<8DnkRYw?%UUjq)XoAYuChStyM*4v?B;!6e!*q63+~rS{c2|uhn+gQnUDy27#l#T zp5F6#JvXNi!aTG!^dZV%Q*EWXjgTB7mp`}OR~K6F4E#a6#tRqZy(kApJy^*6fRGP4 zS{o!=$quwJH<3R>Tqt%fO#LwMHL3si?zxXXB?67T@tdcjE;3$Z3(CZz7UCW}YS1~k z?DZQ*N^IHWb#YgTR6^{qk;kY2XnJ|V7-vG@AWWhZ2$AP&rfI;7o97=L_hNGzB+{_e z6GxT_W6F27#%FD}ANVedjqu2QHTM)&3Qcl(Rr0gk3w;jFOF*dV@2Lg*PCMoK`2VH4 z=&DcY`|RylFlcPmKKE_uia(R&eVB-Zv+V#i({IKoXgR2Rg8sh2x7SsOtW1YXYp0Ws zGX~VAtGu>Rm#Q5mNBY;{ZU^37NncYD%a){Y{Co%>a%A zjOQ|k9D#&#iba7D7}BJK(bl>5R>ByHP`imA#^^R1?M5L#mk4XP9%{Y4n@y^~Q*pqVYFJZ0()L zk;l&l!-OLJe;w-UJ92GWd#<9{btM;$A5Ck&8fW=pVpAG&{hYfbWfj-*^0JqIJ$Xoy zTGtw$5kPn2rd0-<{I%)oWl-Ur-&teoV~1`7x?Ci<(aT{q0XU)17UK#$XjlQ#mV@9# znKh?EB54W4Dh+8o9~@{fFvQ9_1Ko47MTt>om*>0a;Ezg z)!E}`+Pf0)?-daN0DR+WTCo?dr@B-V(0Ue}RZj}_9WrX7PcozdDQZ$M{DZD;*X*;> zm%w?12^=hwI#5`$TzM{7MPiVk6$#3p{9y&s-U^YDa*`|~K96C%r%mvY7jSQe`C2V| z{79)VszQIT1|YgShGybM*Kisl(H29hu<=0p-4TX!w%1*~A=i#BTx6%{Kl z@xCHhQr9$yyL^J-{qplu12_R%iaM~7FMur`Q2e6$xq_{A3Ps)NdFc-2oya?2KE$Hd zL?PjN)i2T;X3O5a_4pFBZO`iViSb~6kbFh_*i_w>Y+(;*$`+h`qb<+%^5bm*o3y9? z!FJ3gcWy>`6{SkDX?fi}A@@G7)QJIPsqImLR2Feq9%zTBQUL;TG))9Mivm=HH{8+X zw_)NhPpmW%RJ35hG$O17i2<06W4%e)xhnApY{?(n;fOhkLXH0fBZ8Xyk=AVJDWJiXM1foh(8P3;ew3(0 zuA6*sSbbZ?2ejpzK*ZZ;3IA>V8>BPB)ACt^MVf@1dHY%UYAX*|-Q6pN4&IQ{*fU`9 zpK}q{kxngb>|i{m3X!8p7++@5iu|(q#k2xe1ZR7tpD`HSWd$(0h#qX&>5N$J|}$Q7~!=sdd58Wic)$fk1ZC z*ScPP;i3&0sJ8B*B!HXYJszY!HA}VqQ=UvJP@Wnz65vN5qJa~WPeAEAqz3|| zIU4z39i&+f5$SPS<^`?=I{pY8LBxZ{lSDv3Aos1zR?|+Y4XpqAIefaTNT1S_-yKKb zemYAjHI6{YpW@g~BK#?Skwmj7q_zgUPj>t$09C(B_%|u)q8y6kanT zlAfjjpvafuNV{wiS%8n*QG$bAPoNTsXE6KQ^=6sKpluTZH>wAQ*-eCjhAZpPLuzO~fK5!9S5n96>X8_O*IWC%qdEn`L0 zPC-jYfcqxLEx-2DRtEMcdTNBvJUH*dICb<^%+RSf81jiJ=-fB}S{BxxbbXhk$0gxP zT5oxsK4DPcRX9H!m<&_(!=A1qNPpC+ciYHl7%we3vVn$9oBNZ3oY2NviTzeQJg4l3 z3K+)*c;eChgp~rXvpR2fh@FaFY%P%=V4U2?5YSo;s3z@sD9>ImpSP56jCkz!Va?)q zM~{;!AI+n#=U6S1t&%ZmLcDF&~$pX(+^y0PHI*-W=u1Re0Ue)uVP-?eltt89`LAy0|#k-7iEe8al7_`+bhs z!`r7*FAQG9J*q24lEUfL=)mQ9=-d`?ll5|yymR7tm;Gx4RINV4Z%#RYb7xe7krKbe zWDpP=e}4iakhh#GM+BoysAWDFBq}PlkJ5Vva-ndM^4CqGh2>DPG^4b}8cLd{yN=*m zECfj<&o#OV<#?9?5jbAm>)Wevhl!V3f1Xow&y;#msZTNfnDgUe^6yt)Zpoe7=zB>! zb6Zrb&b51iRFrY^Txvaplk1Ad+2zr!HK#VOeh( zK04`}ePvJPM=zev;bbkRbG>3ANbOp3gwA}p9J66pM-zYT(33Hwn5XL;+}j zw0Hd8NUPap*3loIDaWFECB8@8v3*DXitFCDkgE$}w5NNt8+2HiU({smYXSNU$_Ez z6Ji}7YUW4xCN@M1SABtb@nbQG0WoOkgAlOay4Uxvq7h`IzgYiqYj>0ORPjs7*<|k@ zf}8`4F~8@x_0=Tye&WXZhBfrgZ-3`HCcUSQY(-OS$Kzx2z49#kNR zON1nKVXc53{2DuZk0rkmHBQn$OYTD9TnR)jBcM=r3y#6lA@Fhp*!8D-ee)G1FjJ$n z#XhyfJ1E}AFDb&u#Q)$f=&XPK@mWb@d>hS>*isNjF5uY?q{RtIa(<|XVN$=CbN&N2 zM)VKuh8Q7LTuP>ALJqJ#zY4(pa8AlQh!dEWqHjIQE((mp6365cMC}4ZY(!unD~Yns z4{8|syjVc~eMGnI@{eUdGW&SL8*m&3`12V-r2C_K{Q_7OT;pMo212Wx7enSFQ2{x; z2AbpsRSyxpQ{6}s8zW!6nhB|~lo#(Q!XBBymK_iGB7Wwkg5t`f`IxMin&8I9Or?@kc|cFCPbWw?;P1iT5|F z=PX853uA(W09CW>P8jL}w4&l?>XS?omCnRE)%jtSs(7Q$4!lS+#%5 zF+=gi_otzhj%UBKM1T1g2xy2q;@oW^%Kfci1i+Kz8g%;L6dTFVEl!-*x_t$SPI_sa zK}(v-JUD@`Gcr;_f#fC5YEXP)*go+1pYY+F+sU$G$l*j}giR{BY36U}-k&OAgG@LLQSH>L3y29nJbv=Kx z;tB53L9|;}i^GdHjhXf@Q5=^7c08Z#Kduu$S!uiWb!St+R`6AG3s#K$fG0H{#Avyf z(?hi9W+M8aT`B;UJztsW<-9cOHQ;>AhFV zY5Bu>UUn+JZ;X8}{{DM%x9r>JXpI3qmCFcR6vnvas1LOJ4?x@ruB0_6#)9JjPjD@!5b^qh~UDXZ1P&oA9w@LRmz{XSxR#YLW@Pnz?K z2-4Zs`@1L!bEH!8=&yqvPEfX&UNJP4%^AlS?uNk&BS-=J+YTVr&)V-d1b&)GNp;+9 znPFPCs086BW22{^z;`y@{sw@(RB;fdkJwmTA}xaL8@`BDq!vwq&N-mkj06c5=YN5) z;};M>Q2!lRzNiag4XE0O7V`MS5zV$nCf8FUmP8rUYF|Yd z80b@350(F*Y>xaG2%P6NkjP>(k0A}VK5GwwJgrffq~_&c2bKZIx}yK+Z((9IAa~_` z2IRj|M*$cgzwfAJkSE9HCRACR^~{vaqE*)I`a(ESoM(1K9vbWAg0_XG@PfWwrtUr% z5l2mg+p})8gu~&H&vVdb`HnPTN01LOzLTKFft3s=}RP=$8f3{k%^o+KqHung!5 zC$bD zRn~D2dj$jiZ-#E6)FI+Qf|atNlnQ5k+*SH41yck_`|dssoKDI>C+QPvl&@N*+34!j z*cU(WK06EJ^S;C&c3 z6WDTr25FdCt%a23O}LbJ8Ac=f$p&7D0Q(;xx+~Dw+B^}}rU;5L1HSe(1!W+9Ey33K z6h(mIc$S%{(C?^wRF&jZjxMXUgk$|}BxzI+Bn_{kQ#S~Jilo91q-3&@>_CX5s0az~J1+hU+V z8jSeE;ZB|;{0`!)S7dKrq8A~c5KVmzLl3VJ;w-yB9M>fhNm>IW!e!7-yI2|es5i1~ zpY{G+$7l8EzRDj0+g9523E%H7MD%sU7e~fLXXnX1P{QP)q9R&Af`ansguubb+ ziTx&3EX_r*tdB{3Ln6v4%y_Q>W(LqMv5yEjNuOXFV!59ZG3+i+YI(OmTC#Def1MBIASwPs@^Ejux56>S%(K1nsiwk! z^zlbPD`%`#iiiR*2_pP2xk7<`)z!$oq4gn^!Q58821 zWcQbSWAo-XE={@+kl(!-bC8xxxSEA360_)^=2htj0z3p90YO(_pA3Ux&|qI_Q8LsT z-rRCo4jRGPuJTu2T&BRJ^y#xd>iJ#?C}OrEyuwxH)s& zc|wXA?0mSY19(qkb3rIdA^dUySk@uKt|JT*=m#R_0r zg<=3NN`gTir~R}0(U*%!kAlyvK#M)$8WJEpIYZRi|>u26S> z?axA>b8%Coi#qfe0P^)$c|qrMLSBJ_^iaPUZlE+>YOcuz?IV~DtKKai;XEJDzBya` z?!f>jdxXPnGqx(><9f-0aPV!9X9*5mX(~{>*tUE=bKv>yFGK0IdG$OR6m8rP0Mrqp zZQd9^YCXmI@7Qs4ynhkM1koitw}N zlY`bgXwKwc=rW`+n2SnSS+VDgQ$IAOK>zuozUO)`=9&d$gsbSI@@`uLvL_{b6bn@K zjzHjRrHADlQ?sgH$W9$HD-axZ?V+L}h=k?dJEcnvsZ--p(tcY={o{60CNz<;pZlIh z!mlLCRbt6!pBR#;uQ8fXZM9Q4FsqlB^v(e)R-_3D!OgG@Fpzw{xHwFF{I<3E^2GiY zi4vZ_rSJDkV7c-^^r^j1i`TF12CdL1Yks=0$*aqf{0rXsw*T7i05~8Z*za^j;~>%? zA)FPuZefAI*SqXWnymX`LCx>oHhDUbhPH&Lan5@Z)iv~t`brCoevZVLK82tGZ+q&S zCXYe(tNJX#g#2mu+cmlI!2Wo@VRc~QfXLo-Qe&XEP{e%bgR7>lFa55JdixME0Pz^W z0LSB&0jdn40NSrE4$t#fCw-S1>{uzy-$!TLeNiJO4Fch;g^0hQd=#ovjs#cCsQwvV znu-|IiZYx)ii#m}#i?_~KvEbAcYi89WcmPede|=sNTSWVgl@=*m*mFXXIwS;&BMz^ ztIBRlH<`+Q^dX8_Q}EkIkw3P8sC3zf5 zUtd?d4qs-F(;|FJt1lpvPe9yk7|SmL2_O2ZoB%l$hN2?FT>o{x!uubv4qO)~h>!&G zWI20fecjXQhNlhn&wKiN2d4)6Uk;9r^r|NBqkbk_e0$pP*WA7eiq~wD&yRtlIGSz9 zzT?BM$8qt|Hj@dT)ia4^RABIk2z18Y9d@vk09rNNzw080o%z7&+;725Xi{i;`RMGy z_bl%ESHAsGwzaCV!`CVwKVx=xWx38mxZnbz<|ZIXjyj@&G$Zu&LH{SeTfP86xA7?+ zj;9(8CUMIW*PFO{ow!H~}JSSd*nVixJNPSZNc{YQG^w*r9{IFHzt0`Mec z#vtp41&XBF9zp^p@A_y>mKnT33ImFo9HI&mw7&j%d50B{zyCbXssLo6??7PVBy|Ez zHE+?t$$ARbBU|@{@+%~t$tPeS7qyib{U|u7N&!&(DV+TQh z6^lsf5k@d1cuqjX(%GXt!TsF*;!1CBl8s&X?=PRZBxY9AiSY)fo^7}o6r3$-cwr)rLf!gMBb%7S`xE7KrDPy2k;jP?Kxu<{}~<9`F?dW z46pLI!L?0KddLOx_3sg?2IlV!qPcW1K)USPeU`6tXEs>>4%2IPt)M6;TiP=Hd7`^i z00-c_(*Z5$$eD8B+9)OK7$8Op0V6yJm4&x3#it9w3j{uxLz3huuwW%%xEMe`3ko{S zpSR!hIo2`J&0|Yt&*FZE;32sdmNjdqhvaWXoNut#N{V*qOyCF=;c9gYqyktROW%$& zXAEQ%9E9}g5JxrdvTq9r!g1dzOBi8>zZ}x|n?AGOAEmC!%E%pIzx!IrJFXV_2{MU_ zlFr_k-)KaU#&YXHf%Web%8q{fXeov` z`lAep!c}{2PBzeDWM-hl86)%0*I%w*A5(%S_g2ba8$T}g!hqA$@TFsrwfgaR$?Rtt z=rroRb3fbKE(pupmbu;WSDnl3T1dzJNoUrGvV8LC6$6~~$Ct9xLc)FJoxuYdB#DY! zRfU$^msJx+9WvKvN+2&(!8qa4?Y`xNCe`+fkzJ(ccoLjA4pK`=u*F;mZfA*CQ_1T; zzR~XKm|YpjH5}!p>1`W*yGsdO*lTh+=1975xwt+`xImIq42C35a!OH=57%OlL&|+% zEv$v>>DBd{m0AEut7OHg2?pL1W0Sdca{W9V!${Uc8B+ad?prUItvdntBsK3tL+%=0 zc||7k4q)n(G*?57M>wleZFG?l`FrUcfC>)O!nl_?U(f&?Vs@Ir&?}?t=Pfw=E?ra? zN$@C`w}%}Fyy8#q+APq2TK0I3YMHqYP@F=F(RZ)^Pz(MmPjl%D0;Jj`hhmUpQT|`y zsr7m?e9{;+*=`3D8tCIONsrE*Y~6#8?0>jvH)d7T&!{qG7AObGCTu(7`L znQ#JnF=^4@$Ahn+!p&k`b)P<7lecztgx5fP9alg4PR%ePxr1~oH_0_US6!ZboDU~A z8p_5E{3S&hdz}vj2^oI(UPRzEQ>wtyykBu#NI@lGfR`yc0_^Aa=IZ02k+k9BD^h>z z1o4BJkjbKt>C}2X2?eYoZq26yJi~|U#x3dW94fHBo9FK@W_N{yZ3heyj_$ACUA@`) zTn+{vbZE1tUAz?HcSI9I#rpdHBI>*2ss5w?Uw7H#D%sO_CCa+j z2qn3q%(z0N5|NR0QARe|S=pQHdB5*Izwhtyz5m=l?mzdu-{*D4^E}VHrE0oe_y8y#b{5W70|2KjG*bxs(>O0?m7QSg;KI;;uTF154GPV0JgSbda$4vfI zzCN+#aX>z%`~JyQHB)WMYpzsw*vbjkHMvz)$peYMF)A)%IS$51(lFpafL!r9%RHz>xNk=V#?J zm;NU7ZurT#G2nJRbRE0mPz7Sc>OnGgI+n!!$`@Q27o&2^cHs&;Nq22zHpOIX?U4EKlZCY)E!8 z8%O`>@y^I++atOy!6lS%q;!Lu_#eu;9>&6p%{ft8R~rT~kSV0u8kaP?)iC&%{kl{L zV{^?Zz5xw|Z=ZKa#vMLTl(1bCj+9ZmbT&nRUH7X`rO2|tcQ=U`6-)gaXW(A^Gr1^i zn%9vFHQKQ%{_^KBrS-%q6ks>%ck=y=nrA-KHNAU0O-BfS&P@TNfN)c^M0SIvxe!eV zBUM)h!aNH5fQp8?pufD9`HJ%cN+V(t5=bJ!SiqQ`@2x4D`Y!>yoddPerUg_oAEw4D z^4>D4T-o`Y5qxC#Dn|M?YeTpZyC|Qn?n)(qG6Uah71n>X4xK~6iY-xR|1_6hXA5ga zh*x9%i;+*M0*ou-0AE^hskKJ{wr;p~v;?0Q|BX>C$t@LBnQb=#UbO+U4LAi9@UaSi zD`hmjoeQjDiNAjCtja)&S72|lGB-s0HWJ&DaqULCoN?dLR}}pzW1<;`k;{*sHAkmY zieY|qRpHNA1`EIoZy>M{fbt~Zq)5<|lD!}~X0ErkXcj%?bM#6~hfd|nJ96L3*M-{k z2Z7vN3H5(oxn)rR`zwNx4Kx4V3ij3->u%-JRLL0E$373q+G9P%`%$+E2iz^r)YX zM1#Wt6sCOD>yVcbo`b2qcXXXja9=+RI5%1dYWLvnPrXa0k>f}atz%?p3~>u)t8$Gx zMUs;Q_FkaIbxbc=TNA-l!2Tv&&YcDv?*eK42?e9Z(rQp~0O@eiQmq_wI-B zZ5dG79YTR^o8>HT3jJpd`o-XfH5{9Qw)9Ji^xK}FK6i?{UXh{75eI;exn@UyyB+|& zTX!$AFvJLp2b|z;Qj;uozy9oX81;*l-?YyGPABbS%icvDU|Co~Ws8*Sh=n?Y<1|jJ zY8HO4>viat@e=`w~Y;m-52iAo^&3 z(2#hB@WR6&qn_Jbr$^hqsoCC%)wpD7^YBPsT$t8PvNAk4V5KU=YMa8pAV47y2)lnV zL73;?2j4ZmZ;L{I9Wv^fV3}c1?A-*Bmyxn+sLKmCC@xUS2F*7@8dh?bDRa*RT!s_U z9`;v6;{7dHoTL_<)ca2<(o9I6OxDA&*>+aPX83%nFG+=2>4eXK)ERpkBjkhcM|rOk zf^%V0gAkXIDK1zarmhz6Z5B!c6V|%t)U|AdRH0$GGm0g`TF#>OE0@2pkpL0_f?b2> ze9v${Dv$82IS%-FZCQxBmg1^(kk%bPvI@?>__&PlCA!{~PyY*2?78C-B8oaLg_rYR z%^I~rCbVveoUnx}JlPrj6#BLWPav1dD_ubXe5UwAk^1}hjz59u2D@<{l9C0p&*zDB zd$0bEP-gu0_?*QNl-}*`rtSzbV|MA&@anq;j}BOY(8)I9mpbv5v4FB>kbr7E=0+UA zrUf2&YQu>aYlAfrB6JMbm{r9ezv>V@r}+V^i=fa-$9Bue4B9lq@zfyQe5_OkYcQRa8r&FoAFP1PDjm`#q$h1|vZ@0lXDdrh=~N{I9+YMtx}pAq{@+Hs@> z_k~10l7)BY%J*z)Q2nqe>{hH-&E)~G9vFBQWK*!sOYWO+W-rEDJTIb~mWgTD9k9C) z?rNFUPmiaoprqWmnDueQrkmz@KmM0On6P4)6hhhjq*+XaBdSDZxV8+} zFk%#avx#?KTOW~H@Gm@b9(Q7M@93x|X)Ow4lezP8SN@Sk+WI&%-u=TcISzjxCdS=U zlxe%@81qKH6!%kVGgDaAr%^(I;Rdi%`4mhgeq=AA<9&sx?)d$o9o*nTtWOy$miXf- zl^WCcEPUUwJxFWnoH7SMy#pi&HTBltnclrN8Z!>t_*=G`i~63<${z}5h~fO0>?>Sc z`a=gJk29qzZBY~GwUtV$P}gSJ$&>zuYQ%^Pr>maH8w-HKAFzr*o@_8TwT{41@#vUSoEKa&}W3^(QBMS%|x@eK(R8{LRgoX6kZZ46-1K*vp_)oK)UWp zhh9F7$fvNK-R)SaQ}#FOtP%RvjPwKRpH}wQGL*kHj}zhr-aDNV(Um5#UxVR$_)UVJ zBWxi&jV^V{!yiGWRvF*G>H#w8^&!3;l$A-gr>ak&?0z0e0K9}#Je87js!X$$9sz~4-(VPiR4&ZFjO z5iDmdQfs92&u1dcx4<4bR}KyB&f6=?|514&Z4$=P^Ug1w1xdvQ9Kngs2^*Iwa(;_# zCF?V87fY)ru294H!etm!)^VgVZZ&Xnr+LpG(LErYm=cyGl>|*5&&Yy%#uf}2w4sna z8q2Hwh0+(NmF`E>!LSVpn9*^ktY!d?eWae=2k|5A8404BET%R8YrWT652I~*YYSq-yE-M?vi3(-%SnaVP zOzlqG(HV`paEc3D`6bMfA`S-|=UdO9oif?UQlfn#aAY$TLnsUj8`BA9xRg(?ap#&Z znS78zoA_(vf^7aW@wfC6?%@&V7>k_DZPsUkNI|n{8Y^wBJ5n=E4N%en_&-^%mR=p) z^8BOOVCT&si+$Ld;+5#a&EeiCNn>F#N4`k=>nyf}!QRZFu>@cP{OLiukCB#eH}HRq z@;#=wzZSlahz#DSfrC=8{&)z5X}+Jo^ir}9jvC!bVGBPLa^C8V8Epg|tb9x5(^>D8HYTE~1&l>(~)QHW!+nsuil5AsK zi|1E`9y*wbTyes1%(^xuLIu$i)2HIxuK2$rl0m+g2}?@wF0a*heR*!LK7)zg7MJZk z1a^LG5En{%UyU>zg@5(}q}6qI5;3vHc4L$J!1b%~!*Fpd9^3VqMJ;9LyG*d4#@Pwx zw^s=D{WIRr*b=TGi3q9kXQi^Z_dxnU9?&T()OeJCm?t*$e3>Jc;nV{%-oTAHJ7f9M{E&Le3|@Pm@c(9Tpf5xJtJjR-;CW^ z%Yyc}#eg0{O@B^)UYoCC$O?*PQqJ#aHLN!ysI0^S(qi1^!J{lIt{$YW{QfQtL`4L zQ9(!947Pl-Jyk7?mSZAKI1%cAl|l{Oc%NdSkM`_%Z!Po3KfN1DwRr~Os}gqnDkrkb z%|(w9?ptpb1U}lnWQs(nuJdB;LnMVw$S?n`YCt{DgU~aCcYg}irr8!L%2(!98;h?%=0?4rmC%*VRG!dznu^oLA>8?G zK^1WSbFWXe`T>n8#ViaKAO2jZyO_EFv+%J%85{C?f+KT3zSbfh zgOTH62V8J0qDEL*R^h!cX2v-E=-@L_kKx>Sq`nR!nWw?C_W1mnqkapUrx&PRi%eRO z%3($+%!v&`QvVI%1Wapl)3QPWalR&FDt2b-mto)x9;OxREx#}NRT>I+cJ5tQ z9ZpfD?Jf?D!^=lRzG*Tny4f!c*O_vvg2c6V*T@t6#5V23N_z$&6RuDFyd7mHtob@| zh}#2>vI9Goa$=gAYUkz`sp}j$DBC-4so=yC7E=ua=)GuO(6JZ@6Z@(Jv0X=qOMS4c z8#utRvEh2L2W}yYrUSvkR&wu3zk_u$%mZQxss^w>ShG&D?u!DsJkPiG2V+a56?Mx91L-~ z&U5f4+}}U0TE6u3@g3f3PqhSHN3EKlt~4=5A_qm$d~npYC(B-GFS*g0JR#WDP$4dE zDy89a7B!$_0T`M=FuRqEt?3A!B5ZSaYn(+` zeg3vfFHf-(2M1`U;WQ+2OqmjmcoSEpbFj>frMf$$1Tf zuxAE5(A$|Yx*URfd+c}kSyMlEw_-9+&**Bir#|lyrNwepNJ2GtrR}-!I%ECPUz|YV zsdX?OewuzJ@;9D`#*)q%$HZ~LOEn7wfN598n3w9o*5o!$IX_n<>0shHAwES}QB z`YR2`YlL3k?>nG*JUCtK)_D-BnzhTW$mbP0>X9*LM;k2-9_gR3Y>1K?B9hdlWO0!rm5Z$uFs#2#!4$}um!Wye+_TMqv+AYD#c zLqbCk2w=r-B|B+kikakS*~cATOG91A`7^g}`Y@F4>dBj?0nd=Q#d_cQ(89Xr4a&OW z+pkjrziNVT?A?D>fqaL;kk;5?Tj1d9c=*|aWzW$?@GM=R=kF^S2-57F%)CokVO)GX|8-@|=bFIYqVs;v|5lvn$Jb+~V+}oSIvyl`Bb$$k@MOPFMc*6?tZ5+{|9}5&n+5 z(ib;_wh$)zym0wYzh&r9IVUU1{(}>n=XVRNWBT9C&CxFvtkEgHx3DyA#~U0hHUo9V z>Tm3GZjcx9T{9|jpbnnBH`aCMxiVjJdj=Qv`T3c%JUXxt!ro03}N`t4SmR-3KQ0rI72?(^qe{*o=t*!7k|zvWC^IuS5s zKbDCYm$OX?)yIDX6Lf$_K3&%NmIAs=r)PITMaah|!jm)k*DmbZadH#RsH?l<-n;*JKlsN0ZQ$ebCwG|CM^&s6=wqcmyyiqd|{q3NO0*nUlU&p^g z=TfAd=6_Z(god4*6u`8xi;6^nhQ)YhASc>l<5d6?ie*x*%PfWy8T)b;dfzrQ7z00dGbL zU#g}0&*Of+f3oBMd52Tu^EGb2!{^kmtYD$*9yt$fu@YZC_YVCVOB3|!-$qIj0z|Oh zW_~pEb0jR7J}e&kyDr9nv0>>M%e*g){mK1jM~>1ae*&zWR~|YN9@SLub3y1bR;!f8 zGV|qR^@(NeqB0G-o#43)SwADQnNe>|?)W}Rs_egGzH>9}Veqanj1htC`ie5PMzsJd zgb@gquW_q?I~wxj!#1?4LDmSvf^HZ`nge=7lQ2_gN;j8Em8*8lW33-FpkvTfx;w@z8 z>ReqiYDfpz9D2x-g)f71Vi|u|4h68q+c%g+*WUDY&e0IzeosVbM#U?~GCJp;=kYK6 zcyVc2q9HD1Iu~EiR3x&&fR1_zjhFxh1&>)cmy=YOEy>U!4u$2zQZVp9RnLBx2*_nV zJlx4(p5J4xjSw5QBYg^dbeI^*$T)Z`-&{q1n?lr7O~5n=L1hzN9(d_LyfJ=DFGk>< zA0Ls|9*7WfJAVE!=Jp#!pD#Qf69nrCUNsr?1h?hi&H|AdCT04cc{X&y1Y5UPFUv>k zseD?C0GK7d1DIMXU6c)}?yG}3{rwMb0fA*LB&0u1j(czqFhJ@=>B3_k_1V<`u6kH= z{2`=mdhd6+rE?h9$=@9@q!JHWxOdZs)8zDP9W$*y7^sk{6y%NY`ZxF^D)~2i7>y@7 zr%tbpu9XSpX{*L<{IEMK46U6;IjD;&$Y&wVhSJY;9RwBh@q3jNpIf-|2|@kJRVi% zV+hVAg~Q80+sHkKosBrAZxr9i1SF~c|6&IX6qcaRKXwEq^gZw;qMx~~tGTdcK6pbU2Z@tE9qBiu-~;8^J+K8LXqCyw8`@wOOS54$v+AIpvjMua{xu6_ z?SO=$2yA+a66G$#p?%*kg@?76>jFF8Ie&#qxK3<@tNW@K|25+7tIJi*nw{ug(&0&*q7~!rSa;(tw}ey`fhFohy9)y}m~4 zSsPa$3f}gxF8M`1ZOfes$?%X}MM^N`Q%V6z5f9J1zsZ8&xTt=edP#mk*GHR<@9X-% zJoM>Eb7;99A_X@~biK{*c7}>`p596fT*mBCB-s4WWPkb%2UF!>jb z{O#S9RaHfZY@zjj?uXFrat+#ZzC4)0o)hBZJr(kk8tnvhc3^OzEIcOb-A#kXisNcd zP%47eBQYJ%81HA}q>h_t6jWIMAX4;GpXVXe>R;a(N8y=@)GOAV{uSSd)cFm6ANhHi zz{}4Vjk8j9RSzUA>B6IYWzq>SDf1OW-m4SIp~8?44!Gq4ob&QyaN9d|3z_ z$(*!~@MEdUi;ElzSW?QVeKTxnt>$c?_>O(;$@u2r>|;Jo#k9^hW=GPED*GQ5!VueH z9N{eUr?K1*gt@SDcOtAn9s8;e^$P=vd9vFvAi}&RxQLM6iL$KiuS@uI^{Lk6>of{= z)4RXTZr$}F;T|73QlHE}$Bj9^JSUKbBnbYPfz~XL5UnAY9BCQS^C?2r>&jQ5Ef-8LUbz1@`THCn8h>21w`J=LLKpkn1|Evw<5|ZH zX$gmcp4M-aaZ2EqZmFh_MM#Z@hjvw8SLvzKdjgcFl#_Sn9D$H~>bC$KBi>(?D4!Mx zYljq%%+jz(%D7TJ6ivIOa&sg2L<;RZS+Kg$zDmqruL@}jjzW{-Eh=>ePu4UksC>9V#rxrl`2jL+oIA3BOn1N45=W7!B-Zo z%e}YpEr~OkE8eG*PYXQ}eC~nQBBb1ZbcL=S3ile*<T+aZspFVF9i31CM-?6|9{BrFmhj26{#tQH8Udap`2z|Y z+E&D)TfBJiK1@gRW5uG0arsy2a4@lX<`V_dqt7N15jZz{42+MKjy$a5H{?a=-zjh*L=W+5AjQphcU@yiO4S@9qRR#!zN-g8M+WD~*oNGY6La#%xU3>jYie2u16L)Jbal#h!iX}kJAv)n5PgAj! ze7ItKX0p~hUf!VE99TVeQx#(a`5X_Fa%jW}SI8}tt7#*Tl$53%s$r`4K0*N8xNL5`u<$Esl^8S*4-__Z5V zaPY==ZnF0^qz{wj?Yq!+-#9KO(>*_*myd-(_8S1zqr8kfVj=un^>21w`W;eHnSosS zG}0;s9FPQf@8vp8FI;fHoW5UIR_gZ71dYX>{`+?~!x(?E&B}Z(pHw#?iC5o@Q<=D< z)vW6!gpHr>utov*4{jn<^w$u0Iz}!MOd0C+yiJ&$Fe%WMxi<;*wWrc^@D)6M-P*mA zjCIs!?DDQpkC5(mq!hhh@Af_yph>gpGhUMG|MpQ{=iMw9Sz6k#LRrq_0zHVhU^HA`R< zqz>*}=sw}x5*$a3KJj;=9L07ff_#m_->1OPveEGrL|25w&3&bECWqTHcQJ^^Du0$s zDY!~^kW@Bn5GQhoQA#Go9dc9ues<)X@a;BEDnHY!n{FO$7b5W#Z4HfQr>XPIkPi;w z$+~Vv@2`chV)4uIH;g9I6Mv|cT$ofle^#-CE~j_<$Zz#6I$; zS3G>gOj%MmM85UnW9js1=j&(B^S3u0-heYUUjc{)eS{NCz>=Z4H$%Ui5p*aH>?| z@fg?lx0gS(_=tA(Dg;Qv=E`DAZVGH3-@F{T7Mv;v2lJx0Yph{jJ>0ai*gpy4))e@K zYyO7^hk6Im3jn;UD&=bH`up=M`oaYp8aHX2(Ub2iw<+jc5TT8!n74c%3|Gfka$rv> zyvn-(<;yaLXbb1GatGHM9en@sl}~h;AxLc8cR+y#R{L*c3S1u$S6*HrllQh{yUx)k zj;&nHzshN{Ugm(G!>xbpr9_{7HH)@nd6_g+C`El<`V9hOZol~G%D?sx|5CFy$h+y} z`bbaF>zI@D%fCNufBlSW1K>_;TXFt{*YUJ_b1QQyj1wMj&V1w;<#Uy^R+9r@|H|&k z3Jk6FXtN@Remhlf3r3QIag3N_CERX*@Bf(JLXoLFrxEtDV=FNRfiKfPT)stb!okG< z7MFy5LM0?Q2xrjRp-ID;=LB+cTvSItmHF#zin>Ehq@be#P`@O5&zQ^p?v=eQPd)F; z>@{wIro&zM@vq0aEUYT5ZSSg*>^11&j=H9|!2MFHK9zr4J9yOvaUIV$Cx(5cG7Dpb z5=W1aknzVYqzSnBWso&z9jH{p0RYq8zL!yh8Mj~WI;WB(DP!GJ{xsM}KL~8ROb?Ru z9!2`Fa;rrN)f)gSK19vQ&aS2p<+~8$OV4)eDK!GA1f1JTmMkyW*c)eD3JHY($jA>~ z_y%&C4J}HJ#Ky^+srEpcssti|49CX0%1a>5aD0TF{txwD?V2Uk=R7(IIAko;l58rA zF|lN@;yJpdl1@e`Ej=v0Tve&INptp;$*YSGe*!d38 zccggmrh@?_9ssu5_hnAoiNq@~4s z*&H|Cchm0$!vRM5_=2tfd#=UGH#Ww#bs^}VDKAv)6=-xmSO?db8&hE_PG-jL85zji zR#T)Y&Va0#w1`**-(OvMwiI?33CkYPOy@lvq~4V->oMSh?Y(z2(@U8#d4GS@;bw zt-~yJ{%Ns58F7H`{E(So@@;{M*{0j#Sr^y)(5O%MHnWs-v2p?`eUV)FAEC@N_L%=%u2cyAX!4}JOg7TGt9jZ=_W7`#SLHPB zVB^S~Z%CmUc2!wFtsuhdysp-uF(kcW!WY{T8=(qKS_EufGAicd9p)G*elM^s&W-W+ zyr7pK&4&u}o(EG;zxp@pD_Ahix>FY|oRcW4n3Z z>8W6%!T9druk?77jYDz|1uJ9cyZ5p;yUu*|)!uu!@<9Y2+|w?IS_deG1S#X_O=}VIY1Lrm}J0~Ws1q{6z}?)U5ziiFRNhb0)YLl^OY<{AolF%IkfF~%@ZleggvIdZALfz4_Kw!x?vCMsj=sUk z!O77-!z2I3X2IP;#HWW1WwAUe8|U|ws}|i53zonx9i#TTcl>3$p1$M-qbiz^O<;iLGE-f6mZwh_HLDEOhpkZA%d z026LKFPHF9-KwXDe%>x)X|UiH-u?`!9wO>Bjna} zoYbZ|wbs~6BQ4`r1F;#r71kxty~~4NGWhMqJk?SvqT8Sz5pRB|`Psi^qVP zeYNl}u#${MVY;yYH6ymhFv6Bd_wm|NuPotyOSQX{OCRB{OK|7ZKE2uRO0N+#XRzq2 zx$GCG@IA}rNAnmeKo#=)@7Mt0n=QKP+P(3;cG3v1`1JlqQI$1lMT|*r_?FafDxr+{ z$l4+>mKbT6kKQ6QV+B{TnMozbLGnijiJ_%;0w{f#Q&}Gs9v7j^zmQXYmjoSs0>Au2 zuWR>k>!lh7jkjY2|Cm!fpy$KU{r#j7E~TzTK7~!;G9?~7bz-0kwMjR8hUICLCh^ff zE&U$m8u=#WJc1(J3roR41;(Hz>)ZK)^QDJ#3+;i31fA82xOXM0Pxr{dRf^Wp&jLL0 zqp??~&TJ(96K_c&*iT8wU-?hCg(k)P<;K^2(<$$w$&u4Cy@T=8;O1;q%oA|&g2e4l z8vV>mUQ9y#w04804bpww_?n|(L*R=o8g@BMMZijKP9Ti3-t%rKo|HWXBrxUYuS$bt zTuy%wcPmfOD`swLojdIJtuUZ-`Ngr5P8#oBzQe%B(F=DE2zMh?f4MwVddJlgOnmxt zl$h+s`3Ghr=_LnFsFh{Dh`_#ypY--7%I>u+k42oL=Y3~!VzX1MG@bh@Iic)hw?O zeE$XNw;_^czHE0ET?=}#6`YYpBnGsrq<#Fe%utEh954BY5okq;byV9#2V&9ZnXe>F z&cX<^b>k^`XvRG3yPYtt=c@L%X1>2@U9~%_*$`R6TD#e_Ij;66wCctf-Bl@AY0GOY zvI0A!LIt(B;H0^))A7k%gumX1{oa1IV@~CQ+-qC2M>F*g&SI#tULUO*oxSMNWWmIzKi+VBu!;*Xaw8=2}(`m6Mm@dcCSWplWR2B92!2I}y4Iu~&Oo~`}lXzw3s z}+sMOvD(aG^PF>N@@wbt7wlM^Vns>7GLk@%%esXmdc zcS^a=7Z06N`SXD%&LIW|2*@VeI3-0ivbcqs(MTLeNz*G!6xJvTAow@)2Yuv{2_c~= zX0}|obuiOMDB?QP%a5FR8>u>5I&BZqOW{`%`O|7xTh2SZ=Ht2;`k09?x~d7MF9C@9 zN)3TvCR}E{vxdP+J4f56eg-kb4By3A9Az!+TTd*{(c2f;xn<NTlNI0v<@ee=%%wN8#kBt(uH`c(>7I%-)_rKNdL^@SF zN2|&+Wzn|ya#9fZfwjE$U~S3ug7o8S0Ck_&>u(@6C^rjH+pG~T@^qu$r;>WsJe2W` zf=WgA@kOMQ^2>G?;3ddhaE{UhZb;&)yN0<*!Gz7krX*jvr7`GC!=_AtDWV7=h?;#R znWSH+C?DZfoS|pG=lWyWij0Q05e(XiGv%K8lpKFh1Oo)^ zR!Gsyi9at-dujXRt=i#{$eCs^*jT)0I0 zdBugn7nQWSVQr|6HM#xHrzlyiPSy(pPD)2tYce@P(_57ut4&=&{4%bIgd(t44&6tY z$BEb?3jYPP5e@OZ_j8#9rO?h0IIAFgdfEL@we|&OY3S)-2y%O9Z$O_8S@Y!rc%XAX z*hA$K`SQf?nBR7GS%1Rn6^{GXuY_D$wH!=47*(Xdip=}&_P(7S`+YVsmlui#wt4xA zxWJDL@EcCWJF5+=2hGew8LXGEk9^{r&ceL*OH+f|pvFA>#h>8P#bZJCJrlnt*+tt9 z43i#`Z7MTa-{1S}{%wU7f~wo+-ylh@0*YV|3~tm{>;uL0-&V9tJ1nwQr3nJe$!njB_Y;3#QoeH!px>Ctd_y-7{=I>-J-zdUX0wK3TvFz(U_3l!)PWZ^AW+D_~(hyFZV$8$wo_cJbw?xe1wvWhz{+gMJw@j$d_^n{5qpGMk|$d^@j}xwZ{Y^ zAx)D7C0Sn~hBo1r@!FN9D`eQFm5X)5`9A7?%gKY}ACx#m$2cX`-7E3|Z!Le_^3t`T zHf2+}aSqQ0F@`pv_QT|~@_7gDvz9fu5lJ1LgW`zT*o;GcD4fT!jm%wq(GY!M3SaIY zxq*uY?krjYv`L|i?MI`-V8ZK&9Owsj?IHy6Xge?`%;6);tzWAqMRXFqWycd7Wjb|DtmjWDP*uPsW1O~O_`9O9p)_eHH zrzE7y@Vsb5uL#Sz4TWp@PZfBrh1j0=$o%D|q4G17qXw^_lf} z?#7hGgn|BjyYII2NL!iKFn91v_-*XJXh>8KvOcK!^o#P!)p3cNI08eq@>+v9vRb}o z0EX{6yxG`519{_JR?l~J3ogsBzJ2x6eRL%vI~TnzN?lRw7G5=?R3TGaI$4_rKuC2F zbp`9HqJ*Fcj9_Nwc=YF4x_-8ng4%ME>O}JU0VIj+a=Gt`YJ$L=Ld2EpZaC9y-)}nc z+-{!`e%BsABZGX6ZFWKHvv$lv_~m9a31$VwjE}A?6EH)i>Y|#uwd%GSnVw&VT{e47 z@z)Mny&C-y!Xr!@`_EMp71=kasY1!%1@;3RI5SQ01VEj>#&B}`mkvG6wV02C^>mxR z_e4V2+i>@XkXQ%A843WTYP{{zUqhW)R^|Bk;OtI#JIT!FC1?vb&n*Kpqd{|LXxP)w)-c7!ussK zr-E9TZ@66mgz=?dR$9mhR^Gb9ylIHH*Uz}?g6roW=t_>ToXd~NWOm+kFE2g)-Dh1N zd$`Ho#mC=%4-`f@9#1^KK!N9aHrUQ2DDsDLODzzdQifx~OIS2=rJ>}7A)NvUwps}C z=;{;7EBrY|enE~Q?u!(~(nq^+rtv)3uRZViEB47(1xE4H!|L{wYc!&n_M9U(V9i4U z&sygpl_b3CPwLMxH)B@?ThF&x=ibW|;BAllrf`t*CJqL==6)Q}xBK~Rrel%Eh>Uz% zQiT%6ti}AHq;0wb9N%a8H)aGbl+qf>w|m;YsL#{O6IyZ&BfvZh5(AZMfm7Pl`}q!A zsrb%v(4FEzsA*M2T#4A>ggHsgFkrc9kz<}a{a#|3ho(L?Nr*v+-H}z1(#{RBKq~9mDKLvlvC}Vf5qowFu;OT@F5}2fcZ`Q^PxsfzD_uBlopX1p;B|(Jy%fU-(0NbL-pFbiAsI7V#p( z0w)P@z3P183M>ZuE=*%g=Vkh6KGBSN9+&D_dyfEfJSJF;x~KC)#uN59`~O?&gH z6^bR{j|MB<{q|jZ9ZKldg7`PXiQ|^hUp^aX>Mx((q(&0R)?)>*LG3N;_64MuJfvRy z#y{N?&fm2xT-0NszoT8IC+2ehBsi}xxsdmW&l`LF@7{(Zuc@*zKq?by1@zxLyD%e_ zo-u!nyLtAs{MZxUs!Ge7-OBf2dnDD%Hb52jznDk<|6v}~P*Serl>flo*E`zZ*WcaI z|EGUsV5GmRukZJG`r>g%=i(`+a^IqiGHazHI%Ub?&oR$+DA`LUjxJbnzOFU3l9(5wsoMTUok?YdUTGnAw850*j7%mLrm0WR36h)87Wrk=YtEhv|tN`-;%9= z6)BRyS@49D-mBYKO^k5x(1ixGGPTwhiCIfLLybqUp5jWdQIf)>HrR&V)FD!{?UkS6 zjgG+oxl>(~vmu4)h2x=wam=>p!u;r){cdOPTrF%$^0278;4KN+0EL})SH6o&p;Zq) zlu4Y?6_S4qNjk#vn-dz;DIxX+P+uqwNG=#92b~%pEcQKcS$`YXAYKyO&~%Omn(1>K ztG`ZpvW$(w1^RT(@8UNeq@sk{A_qk+DjZ(G_jY%p<0y&y#}C{#OWmWu9K@R8HN&aQ zGD~UTrI}?Rk;1kNSx5(cGwHZROFSaF!;dQD%K`q>lXq!nsci0ZOAZP(GSY`Me)=5v zQPng7v~=KM78pf31}Dg4kAHsVU}#gix_(?)4M}Wqy&1}&|8|peS_=2!Q3)BLe8gk) z{DHH7p_SlYeNt3Im`+msusj?qfc#N@Bk3@m>AQ;@u1r@oT|rA1?Pk43Np8OUq>xM1cAJseKGJ_OcD_ zge(Y^&alLXvJ3T$lq47o!d7%|biuDavclNkl*$l<6J-35#Po<~HTa2%v`TC>tks|f ziI_CVMD;CMr`{7XDi*MBhUsCvfjuO@3mMm`gBNG~u{pleJ&yM?bWo8M%9jwj5+S=k zackbq{Zg~+58YembSJo4eW~$o#umH=8x1gkj@v5tlPdNxP``KBDXDU+w&kQaTBNP5 zoBp~fltZ@8)r#mYxETEvJO1Q~u*n$^gxMZyAEkUw7W6c&5c9J>hgWl5(t+Kl043)W zb$^ZXwqYa=3Dsg3M&#}uE*EzRn6g`qB^vrtM{_Uix|(A-nRr*+X)|BE?1S^(jdGC3 zzR(4VcfmYU%4}A{b_$Z7AcQ4gNigI@GvEqdJeD?+=1K}^b2?HviTMg&tZb`^c=?6m z)z>ZZyH<7W;|c^H@9$1L@5Ve&KQvc z@q2H!*XU}Fu8q$Ra%QIot&LW_tT!(*p*CM+#9Kt^2~Vm9p~GQ7AXi}gM0&ZTD64+dmtqE5pm02o^_g@MrP-`(EbMd9mM;so%IgXto=n#YOM_*2!N4y>e5>dFbv zkX?!fzbWsS!@TfLP9uzK^z>L?ucQV7A4-l2jeicaf=*P&Pxxyqg|*sTPnEE14m*xQ z`Jd|+>YC!`PW$xF!fG}mizrZmqqgrwQgcukk^Fs zS1WdfS1g@;MpV)T8YuJmlxK4iaq;+)mv)aKrM>pVnI`ClYDnTby0~W8YiF+OIPlGv z&9)a;CUri9;$+M#_c|E?iUoI1)b%;km`(~2t|E%Iz&WBy8cBt4NiH#WB`;vStZSu=+ zeO+i2XLXdlHBRz0Wn|OUGv=A#EDUd~z*iOmWS&5Ng7v@47x2$i)nfhYKCMJO?3uR5 zxMV}{DJkc{-rt4IB52CcW9g>cvwJ=Ee~9`DwnHC(xp>6nNWlD6PBhEAGa3z_g_CRT%w=|kKh$+m+1Y&{Z_hp6b3%6v zE;apAmW?R4*2&>(xD1l6&wBbC|Mwws1V5OVx;EGR-08LL!ReCjdVJ%QqNvy#v@2Xw z;Hxzbkll-ObKezm@z32S*Lxg;mvSrmUHwNhGLvKFAV6Ra`pN*8(%;!#0O$Zj2AIIW zQVDC68*hv8RN*qYvI&ChwyF^FKY~C11rv++LSm5*F7fVH+hsH)FxKkL~TD=ILNOTW?0R zbSc*2Z(o8Uixi%wSY3)yMLMr40rw6n{?fO;WoE)vvbIuu4-aH{LAu&m;dcdfNzLu zK!fS)mDnaGlOF=zf>?W4CCSg<_BkdGvjnZv(G{BZ-w>(ODpK@__uo?n+EP6Y64ccf zLw_%deSdsY=eq7){#D&B|FpgZTGYRC*i$hs1wz8IRDu5{G|ovghACFUOE8-%`y+5< zFBKZ|S_`9mH@_T(r}zFv(nLu5ZH88}oqIp^PCmyvOx^<(v`58)N!0mkO05m>GEs`I zoga>%#4g_7BC8G%zL$5uzKa!SI3H?BtqYR|epmksguA3TzqOOACt3OVcQrd*JL*0d z(gITDu?c>WyTYRACEvRlZTyd!20Bpv>-+p7!%)^njTon>*5&&ogVUCmk9Vko5zb22 zf&|lqradq`=o}^u@S;R20%zk~?0QPQ35&sk&`=y;z_WwNe-o~LgEG@|e9gyu+qu+) zmgGlv6vw(~WwD!n2j$%Eldatgo-^@Ur~0nS-oiN38i*Bd!kR`+a8DA(nU=C!udD0u z#)9lsmU|XGHP(YT|D}8UhB^P3&y!(+YOec}#`7$L=)47|*=(nPRe12^-0(R5b#Ngq z=`DIvwvWmuc#-^EbK||kcU>?Iuu#zufbBb@#VCdm&^nlUSVdEUL&=KWy@~^A2v%p#KOR@6plt*6w!TmD>j z)BRtb4oU?W)tHb9(oPeeGz~5?J~}6HQSyy(S~%-H8u58>$}CM8!nQPZG-Kdeqe}i? z45ifl{^Nt8LBoKtYOOk!TS)7MQP|@Xu7ZIrr=On@j6sgwRNneI-9A;QVHz6#DQqpO z^`Hm~`2;v`Gq9jy6#D|kr97T)mnnH^?!a9C!^&$kXczy@Pgk8^f0lywZSdV#x*6%I z{;O7Wax~NAAU0yK4a7Hjv}Q7D_51$nUMsf=E)9~ zT(pw!8BMb6D8h^y8Ijq}JD}}Ryx;7l3@%FqR|IL*BvzRNG_wNFe@@HrSNJ1NMiT$k z_)~+a`!WTeYFI+CF?h^W`uKE^-};As_ejMrH8dM=uZun%|TKF+;&qJ$5kGP$#9SZW)o9K`xzp zzf2yEo+w%J{2a8}Rf5JJRqs0j@O6fHHEiJI2pdO2xe)Lyd6eN zxk&HU@Yofb_ae(>b#e;%jpZU$%N+ztUWaU$c&JS1E>ezi8G!T;A*-o4D%)5z0@g(gaN zhh7{n#wrtZ>OaDw#JK1A3RmTyU8gUM#_Elh7oi0vwA^*JI__@ph>T}Hq2u!ZAksPFTJW$=lT!&UY4}IXli9&GVt#x(T3ger2b$)8EAf#@o^cTu1|Slf3Up$Hj_m1Mk^jp{ilp|*P+2R?ru z=iqgN#Rxu8)}}I7(CR3TPooh3r?JX_Uc|n)Svug$$yB-G$YBVd-z4!?A0C;E3r%H0~ zaBU1scpN-8)*L0hagm{`{%UiEqD3m)cVEsY^mii5H5;oQ51EQVso@vKTmnRVEl*WSyqNMI1sXtk0EDQ6SD2 zf=?{82;RYDQDL9g|6(@TBxg2A2y!q+PIF@iKwwW#mD;rdR)m2Ol6vxT-9OXop(6Z% zK@32d?WFth|CmHe6SvkD3tB13QTiEuS}9i<*Igz$rY4VN*W9(KCFU6~Rm$aTqm6Gp z^tpsda;5id)3;=b7lbD_D82lNn^oDenK!vUhn~#Yt?5Rw1n%5g`8(>2VqqX$KDecb z6XL+T%zkEr$4XMz!2)JjbYbo7Qg%8M?KCUgJU=fdEh(s-aQFqwJx(7@_W4V}gmT0c zuO3zH{%=lh`B!;lKycupI1P4_oEmTBat`)iGWXzlki)&uoFcHGT;xQ3!?U1BrY(~5 zHGq&X$H1Nn_J#{Ah9_*s!Sco_fpHXbpZeZK%BQgQvsEKQYqI1QKt{*asxJ7CYV=Nj z;!+{*p)|BAYE|d~sW9S!OK{d^2h2Cc7aK7>&R_djyurbw(sO(2^;w$?`IYH+jkTrW z5N?!S&5ZwllGsYk!Kj)~*Khc}IEO2_?Kju4tXcOXZGU>}E`=2foRV2}g2$l*@A_76 zfKOy9YO(>2YwytLiBn}dD){UM;jl;=%_kdbvBs`I)}xd)QYxN}C`f12HHw-A3A;CA zjibB;RE6*yH3+P9`z;!wtjsi0evC1a=KI6RR#Q8Q?BIEI(iGj*_ry!2TFn4IZi?Kd z2>GU7$(T}c$*x2MA5EoeQ4kXQ?xmDfy93snl z-_sCO2$9|b@B?D!Pp9z(O3$c6B(-(tdQ|+_vU>OTFKX3Y(>4=9E+^cOprJ|Ir=?XI z;tRHUIq5RSF)i<-{|ewlkEb!e@X@mI3|OkbXwqpoxRj)67>_$&dOyAV(P4v>jvBJV zj`F&B2u>Uicc?5@7e%ycJv2zS;g&lDX&q_g8r?DT9)`QIEt@ywro!_n3yJ4Rua)j) z&;cbB`0%By%qb{HPWbai|E((vnbh?MQu1;i*`LK#j?6Bm_}{ys2Py)|V+f;2_GaD2 zKdy=HkJ2Oo@Zl_8rLn5GlpI@DaEVUy!*Yu6uZO+M72U=3FR^V?4QM`xh`t612!&_h z)t#o1Vs&71W&*d3FC-RtP@758Q5h+CWEh(&nrj�TbDV6o1kfk_g=$Czlxo3k;Yo zQf9L6346+V9cXr%W*pl0g!XPzMLh|83rZFkC+!(kyde*~M z4KL&dcPtN0al0KdaAa>&gT``!dOmoaUEsM;bwf8q5v)FPzl$E8f zn9^)OM|LVK~Z)7p|yE((a;iwg@tEGsov2c zc5exqB)|Pr3(c^3Ydj)ZbKkn_a3XPNgc1@LTX||OzASzn*PIPCy`+8M4qocnwx2k} zFkrh6h2v{Fys3^C))&fl>*DsOWi419jNLyp)$y~AF>N+$9T@Lg5k&wN`Jd{f4*KB5 z4~XH9mCJ@@zTIALc)cS7?MsstG6?&c4L-XwpL zpYEUlgr54sk>u*Td`to(xB|7wuucH<|Uu2ryTF)wdZ+5_+3 zF+A3ow#cPv#TR>;MPgu4Zo@y!O#ojNctwa1I2EW>Rk@TXz}fXv{A$d+Q{?c^@Dy*Ix4e3^@;R&V_^T}6UCG=d6$(0f{ZDK`7%cdKLU@_ zo6CiQ=A07en?Aj(U6T7});XgmzY6X18r*5GL#@6qzP8)zE58s_&w zgYQa@!g=opd?2rn8gOLdGKwPAi01>%fy_KEM^{@+gL0~x5MMi`-y4@r#REKO0QG*w zQY0OekGEU>lNO(ZSUrJ1q0|;m_end3m4Bu3d=^tr79I-bOL?)%ayssh0Y6@o;xTEw%yRM?CzGAkgS z|3SnBwDkOW_pI^_VBn;2QBSQOrU1dS;sh4b*rxv**bo zDH1uz!Z47pO{+$2M6C>}dYLbT-$Zs%N8h2QtxgbLa=DXq73phCwGLpn;cI7%!Tl$S zfpPYFJ8QzfE-wbjSUx2dkW1YewPq+c*4qZYwz+0ot-lhFU_vIpI^jbFAOYGLbs>s8 zNRYZmSdeb}^}IG?%R=DG^UC`fYH%Rrvu%#yt- z`SQ({Z)*~3b?urbj40QSH1UCvtZ!t*Ut8EC$nBROABJR?l%Xp^>9y3bZMUp)360pUjMX#y!@<<7CvRxf#ujtGE~Z1Gzl~AexQnUY zhSYkYKq}G^wc>Yt6o)f!)PPOwrOcul6UTDX>}5AcSugp2S@h%KUs7R~|9!+JMw>iJ z4?IPFZ%UDGVXS55>v0+P<<5ec)NV38FbMw4SO`Ow^7%1_KCP#@t84a69e*}Zw14(B zeq;Rh{@YCA#@_V3O~t9nivUk(ZFoRM6RPI?8~q~KZ5LIWF`eeKzXwPX=)qN-*- zKhevsiQN@wz%B-)CXGpwFOtBE`bEZMa$=H<DX*F9dy!76QFu ztHtB3s{%5Zq%Z+&Ip&%1(`C4`FOikyUx^-3? zJ~JG%7t(3f{xSO7-FK+N;k10qba$(+Rcj!xHF*GtKR>O?1zh;JJYVlVlqJ-#Kp)USx}qIg0|g&7%o` z{mP_U#Oc8daQyGEep9Bfm0dl~^erc*>%(_UmPoQ0#GtypMwjLCogsVWoR});(9IH$ zPN2VA#EuO$R?@3If%1UF=+e|}mv>K|5_hQ;IZMZPQUOt~PO`^a3h155g=aZ?r+zhh zk&?*v>1HF;oL(e*L5kf|mcET0V%!_^st%~5;YPIp^Z+IqzUBdlI~u3N)5#csk>pn= z|GC!L>UAgcb2GA4++FnNX*gIB+c~@GpVOW*a2S-zWiZm__vH;AR>% zPt(7V&x=wh0e~&UZ!!b?A^KW0?H*F^AI_JmDyuA@077&8nA;lB}zl;mG4Eyi*-j_C3u;3uUe(mb)Fk0Y1yr)i5R8TS-171=a%(;{tt=qh|*Okp;?(xu(O&@jIpe_)2laM{8R zFdkakP#@>Jy$=hs)Irt2O!5F8DvW@_#{<$*vE7ua*YGX>SVXzkmx1!2>6)@`$m1hr zBZvUS;-`ru^QC%^t~prkoN!+2C!~YVeZ_K8^mx_RE6i}E$+b$g; z*HZjMD`qV9NN(gnhe1>e;lhXjRdRLTvMK~pfAk} z)S@Txiv*MQ*RaRywClfgf9SEOVz5-8UWQ~(TZD@IVQr#r_qT|k&7NvZ5soafMs|`8 zKA1KP&IIYTI$Bj9(8ug+i~qc^VhgaJA}`Xy2iB&-mwqSlYS+S_4-s>fNbH@uwFY`1 zyqY>&C=Rm`Z_B*xRy}=kufuLE=;6N7@H?#_0l_u{Xn3_t^5{+wVZOtEUQ>7#>_d6)qDOIP*UDcg}-B9s~v%a zoM>>#e7FJN;_IF5XQih~uc9O30broS|%1; z7fVLpdwp=Dwfpn~eSy|aBq^Bn+^N&=$yFkprxSd-pxUhV*1z)60W84i(M!9P0TnfA ztc4AwB&*qI0sN_Fkxc#XQscjOKY_cO+gu#>1PcZ!1p5K^Nug_BUqAFd_A~ydZ}8aiu;GPS ztah27-P+^h+Z&X_oX2N^a?;yp`BSFvQp>Yo^lZtn3?2Q~5;yM;r+WigELRKNSIif_ z23_NT<47{?Zk@x;Y1pc0Xvj?W%ofaR*(SUPZSS7m%Ul^-=(`LN{nnPHhaZ&1t5I>rraK)e zy&j;i%QNnDlBvJPik90&N=bZb!$Pt-^mMgyW1spREDE6DH$Ye*8C@yWxZgl>P{`?_ zhs!TYY#3X?NJp-zR)F7gp}2BtuI+*s0nZ4Hzs1v0cM^YFkRu=#PsdEJw+i__5ttjY zAMpQN+!zlU*9gk}F?HT@#MN8Z6GK*~Tv5BZTZ3$;+_^IAUFo5=?t+`t@+XJ=PNEUt znL$jy_R`b5F=kT;zXkhIhRUZGDoS#6yk}=CQhAjrCx*<@~wCe+633il>;8v zua#!Ve`JsIcmGm0=r31YFCYS@~WUl*`Dv+3|4g(YdYocH#sXq>UL21EM6 z$lGVYsQ}gWB^tqZ+cD1&kcgU3F*bG8;@SO(3Qi_NslmwieBQ5S9^r^lQawP(n8Yk` z7jfFag90Cz)2sCwm3+z#9!|#EQm=y>ox-zIEc6Y`X8a}fHZM|H1H=M(D}0azVNy}; zoAHcIFy=q7qI{42_VtmgyN(Wyk#BBnm^3(^eXylOEo<27F3h=I)Wmf8+HCiE<@hj<3K&c@CfPfi z^F?MoB!3E8yXK&5U${+qYxA(D`UmL<< z5K)SGRdS^D#fnMeSZv81`deE3CGa%BbQ2BqQWVGGT`6Mb#PoxvHGKw2AB%77_$L=- zJvRqhghbFDdu>Oc@ReTxe~%Re$y3J?sNJrFG$PWqheHOYll813BTU;~Q(^Oh{7y)N z-v{PZ>TeSgM51+&$Y7?64Tl*aQrW%M?444br`zouFc6Z;S2_gJxE2bt$>F*}Rfb9S zmG+VM@qop({o0H^3iqJQJW*D5kx#l3(xcPQ!qu9sI^J=dAe|FP?qF9_i z3A^j@plRq-H>Fi&L9nWaQDPx-Hs4oTgrBqqd)4|eVCG9Olruw zCZH$(a?AZ_&-WK3y!&>WLSG~*b5Ju`Pa5Ol5$%hsMSiT8#XaHEL z`<(;Fkvs@FoA|eQ(=Y7Tfz|P+L6^#*Ai@V9osC#6YXD<3O)d-0epr4jvlzKI;lbMW@v+k@8mhv0(kNi{MOq5H$*ocQUgM>Yp za^>#I3u5p{4v=X>YPfDCK;*sR3mYAm%MciL^0$K=$}I2&e+dLNlEVO>$f*aX!U?r9 zK`+E3)rzQPfaoWffVLO`fm({WcaB+|#IVVeYVVCyhjUwN9+T&fU)w*17ma8AW@jmz zHp6WT>%7?Gt@2#f={*~SQR4FMJBN>tf*W>bH1Sx~w?shP#|tL3iUWe+wB>S7%E*a7 zEHC&Qzp;je++W#M!xblNxVzB*iW}|NGi!qKtMQEjukU^-GrcaA^t}%S0%!f64m!+`RVHK-mrU6-hzH=d8j2?OtW59yQQT@3aMzo z3g6>CA4tcoWiWv8>9Q7vXfR?@R!o#;fPd87H`Hq$_z-2-kV$68X#6yd;laix>Y zW_S=a4-%~JJLGm69*Y{pb}+X;WW?kMm!v+;Z=wRb^Q&te2+YSg`nF3%K9J>(6h9WJ z@{ayi1ssz?MSG}%OU(S&X;y~Jvu?|9YSOac=^%kFoYegHC?*M;34bE5e;Mi1c$}N+ zj;CO2DE*%pJ=*NJs1v$)o}*a^T!U}Q8sy>Ee?erM~51B)R70bTmMb@ zJe<#pRmy=b&&K4SMvgswmT$qZ%TwP6>NZc?TbMyo@R1OhzFh7Q0+Wh2yk7<>|GlqD zUhnR`IoH}*Kq)tv7rv1td>X{wkIwnJLS^T5tl%fmFIWGV5(kM9v@Jqo5baV*(dri_+X8i zK3=W`@v4%kcRqwreIeJ}kfF*ZF)R*=Bqg$5YyC!b=7CR$)5bjSrOLqt3Ap z=VC>?xzAzcRi+I z_zr&l%Bs77)~IJVeMjtG@O5mguVxxOGqOz+K=sn3pb!Jd%EK3ay=r4U#*eu2gAy$H z3V)Xd9j$jKuQ&y7cx}+SV~$k?z#mn~oob*Lrg#0n;_!9Ar1AOE`kEPKOd;88?HMkS zjnlg1`c3IRlb15kpcAK0yDVHQ23G%Q7ue?$I4|=qGCrQ>lDm^Dgm>YE3qur`&ZGx9 z{=-Sv#*5YH5RpPRP8hSzWY&)ha44lwj7ttKrtzJFWr)m_7&1M>5kIqD&~#xff3|w~ zf3LP~V+ldAFlMKv{Ay-2`hEKugOrC7EQLf$l{ZEXF1L{Pw%49s2{tiFB6sj7Gip?q zPievotspe*L$3`%?@mDuwRE%(ZEGbRK!inJe7da7147@oX81lWyFj`;Em2(W7t%i} z?h*0$OFu3kdO*Iu@=crt%uB!?5zbPuKi&D_NoYs1!GfHyaBD}5y6Sx>_Jf36Gmb+ovMQ~q%N^_sqyKu zKILD=FBNpfNz)f7ZIfeOL$$(t63xFcbRHggS$DCph9^luJp+@2gFU0Y!*=k6%!UP$ak3f(LH1nM_dNLFb(G+%a;yc zaRQ9L(Ti)nX6pM;j3avd&kRcfekRQ}>x{mBJ((KC%lFh6(t%w*hCRD?sVrRv#h9}e zm9PcQQjs6C%H%NN)DFKd(f=N-7lwD95OoZ=HdsoDB)Jm}_Gy~dlV2nE;Z`p;-0x`{3y_3#gak#0-1*oniw zOJ`lqZ2PB+RLyU__GDha#&C<%xyoPao;H#rP>K{9&4xEw%J)0kyIZnuE1XY3rd!}b z`YBho*pDf4uE(_^8vKuz3Ql`$&6**vh@RAb9p4cj!~*WMe(9o|8<2BM^$7jYViIr~ z!)z+rxtJ_>p+NwNsXesvR>ZIa%y*~0OCNkCE$DEU1Euh{yE>k!ZHZ6wRiLL&vln!K zO^@zm2d{=n08zb!gXE#OVCR{uYKM&?`$ZH^7ClBA0##Mf2@xvJL4oU9*m8rd0RqO^ zlZvDY6_Tl7yD(ioS}H`NR;IaX7a}`Y3D`-I^u_YAs$P#NZvvIegPw0n7*j6z<};(V zw%j?VD0?m4{Hh~=te>Cu_!Xz0GOcFB!WwnyV1pS6%u`=f6T%EXx}Gh6$vnN}f?TiM zhZRtm6r7gkX=&V#YPlEWA>swDS9jdhSi#_tFVg51Inr$q4d$=~K4B=>Dn@vjdAi82 zneDcCV~j77PXETMdz_%6%cm#_IDheH#v&hbl+7E3QB5~7Vrx`eN2($`n0n^wSfsRr z-L7J|RR{elSX3X4V9$g!LvSRzJ|EeAZW;Sj#G95c9^zywn!r}v5t6nkse$0OC-5^5aS_inkmTNH`$(Idm?R%*Gxa+ z!dF;Fv(d|&_(YH{ONLjU%THI1ah<$i4e*xP7cre&9*AM#C%IbZ-1`uKVVoq7%(X{k-P)CJN!q5=N*&Zk7Gql0fOGXwNmA7cT65%1D>(dlgsoV6q;nK4-CJdNrZ z>531Ir^T=MVr?=@HAOIbhvkwWVNXdx3Xe3TN)r*5ayh=!dI)@sR2hOOh`et_iblre zycUf;rX4aR*ul4YXb2#Mq(~Ca-y+zS?fgtB$9(qB8F#X_Pp2js_phyLDQi8Yls}8@ zYVjDNli`Lp>&&=l9@zk~B97GV8Tf@Bdw0gE`i4sSw(|SAy(jf0d3Cjt5p;!*Wu#g8s+$AqS1E&RDj%0dR?tSw?;Ldt~aUh)N-aLv1F5@vlou+Ro z75L`)9LY~teNNH|+{1Xt>~zxMbTGD*|1eRGp9aN}d#kS#2JZ>FJp8FFXs0>u@JmSV z_@Z>*ua#(R#|3|QCzJUC0Su{6$oK(WM?^-nIZ1kE?+Y}pQ6`-I4BGu{GSOiq9XI@Z8v&mGkPF$(5Q9ASX-9k2bSvfRWEfrQ0;6N!JEg5f3JRKS(L zc;YOm&1s-C{7TNAuTb93FS`^W?v?w*5sWvG1@ST?r7+910s>B5wZ!;3Ep{-ieJGko zL-WZ~5mFUo4mR$aO?0|c;MuRz+0Bl*UeFhRHjA+>jLA5P&66KB_{vm&UzQ$2dYC4v z6)UQ8jA}OgP{4iRv-4M$C_pWv1iWefOL@(l`5@!m{k0Y050w?xL)b<4uZ6alSa-_R zt^3gwn^R<4RFI6TFTH>rkv--5*#cwW86qm(_?{VollbIzQ~=+zgmD`h|D%<4)qw&Ghfh|~Z6_>}FNs}jyON(WMU$|4Q{%NLVA>D`Tp zE-i>>ky&9X4t|8*xkT(n2`Z;?o~i%qk##evrwK^~kGtxnNZk4@P-wr))CwVX|AxQn zxb7llE$b2dS6?7%6&w3y0!5u zx=c4LvH5z!U)SA(p!u=CsIkjfjnBpIZ;<`Nyswr=PN)SXe+}?vL=ja2%mBwB>x)^a zifNh__rd4r9I4rR7H+biNhSIsm+gwR=PS6J$N9cuOhu}N7+%z(qOEK%diqfe!p#?VAny)?>;q>l^W0b$+~ z7pL%_2>LVg6#tr_F=gxfe2xkS;re+-%_xu+{F4(9EwJXLgn3zc2HqCg?{!@m$6N`D}?5R`Sn1!&6GM^ zPOGcf1uwc6l{f!pxhrH5W2_8~KYtqqJjW}900b7j@YFW$(wJd-=sh}o*CgzA|0>>_ zv65xmV_FqieQUjFO8vYA0)UVciL_x5dxEVkM+7!I7S!{pB1C`9?gueO%g-4 zgYz^(pz-Y!eS-vnY?F>2&dd0eT-8c?y((5;>?~w6N`~3|9B4QuT`O_CxFUSB2v_#q zU6wCUZ0s(3&tI>jaF;)j(mD~iZ0q07Z>VzG;1Of(_xH;ZKu?F}>gs$is?{Er_dZlmy5)$`Er@&4zN87vtmIwXl<);7CuC5P?i z-2leEVGM!49yBq>2XFugvn&+71Is=l9^j6Cfs7)vj!Z}xM$Y$pwjTT~bsDl)u=qZ| z1#FfXQW?+Ia}P9{16kcup7)gpdaj=F=*8 z`~{z<`nyvoAJyHnwh4Mxx$jceHalk|KMUWeaK0(fbn_%-y_9#u+U&~Nj(bpy<%xs; zbb9{%yh%{iSh?JZ{#=w%vd!G&&wK|Dco^*r0Dk-RkT0tEJOGqiXQ;y&%a{E8zOF?*O?i>T&?nD0*WO`mG%D5TV05Bj>2~ep{B_Fxr_MZ zCBi3NIu9zg!(VxiLQX_b;mo+`I`h;=`BduFmS-11lJVKNo?`qM_ym9|spM4(3rN+&h0D&^M z4LoiJSu%FZ;Y$Wz_ylD)d zRs5sq5cxTo+RygNRW*+apq2RqfZrG zg{y-l_8y~vc||1lJHX&rb9&@?bW1GTEU`=6hVtNfOS<--95kSR&Z*SkW^ zmvZyt{KnQr%13KNJ{%8iLh+IG?$r8oll{bJ+cgW{O_jwNPr%FNBNmoO%x!w6L}9_O zTi{jXn}3Ayshf;>tkPUhmz>|Sf0(duRR{7sst|Z0%DV=4s(80=%@5+6zea^Z`xyWe zlX$V{-ku<^9zQ~X^qWaF%UCsjDNMu>C@!%2bLlnq!?t+oIdkBP5swDukFKA?ukew= z&i44*jB-S(7P2sL`>wyzJ%dXddPF0khpb5~IiI`y_6_aJ-7(A4o{=5buhB5!{NT+& zJ4w>}L<>yvhzrbyd;Yof?_?r*UH>lf)|UqIjTYwh;~S@*FbN69#Y+1m%S%P_{28ZU zK+Qjijy=kH_XK$cp+#!``XK$y%`ghT;+X53cfQ;?8LITe$GcN=4G5AN+!!uITd;tX zepVn=5F!dH5YuUQSDGpPQ`CT%HIEjUUX8!rkr(H5XbM^7$W%T2b~FTjaWrp zc4#ZCJYCut@1B)YRuC+$m9r7dvE^5mwhq>#EF%>Re`A}(6BFcQF6%zO#z&V2$pcL| zpkg*mx@D)|(T}m9=Q*Z_r{}LIUF(=ydUJPO*D{F9Yuh$`@NDOY+K@C>?u3h~DM!*k zjdf|$f%+B;Ui6ySo#rXZ1bHR)jBi=pF#V9|?eZP%RwRDn;3B}R?2uobhZEsXYO2M* z1vO8)p?!ww7p3t${H_S#t3`tq@l0wl$0{OF(-2x@OU<$;)b5$2Ne6(GXL7Y|jvq|B z^E}q-P?HHXA_MEU4{I_TFM6Y|IzttcjsX`F3Zi_4xBamxRXEF?n2dwD(O!g;0}?`b z;1U0eYRvtARD%&NN}u?6J>}>d?dk34>FFQtY?TT`n?EMueNt%iNjSYF7JionV zNa&R`JtW+=vMMCc9~SOE>m_{G??&#e$wivlq6Jbtq(Jr$w#di}cMmwIBW|&P;+aEv zz1@+U_hW-RyONvvK4c9I7U{dLjGPE1*Zu?3@0f#_Jv1S_pQhsL%66u&T!2Km@CiU^ zL{>z_ts}srNZzcC`2fFeaTO zg!OZc#UOtR$3pT{#60DX;k5>?_W9r2LreR$`wyLgTDRkMM-WLPaeI80ITRFDBoox_ zR#!&fD-K_3Zh2xTI2=IuXg7BAe)nEkv8-v+LuS?bQDN8r_SypX=Npjq&%oF5hPQT0 z>0HkR!G6pe06w4j3Gb$ZF{){*thR#hDUX}Q@$4xGt2mQnGpSQQr`2vbtJ6m#nEAx8 zns12{`BLUTB7fZD>(ej_bJW$yI+T@BCqbIF}J+9Y48T| zhwobgP9Pj$`B6@0kt%ock#FB8jGp=9i~pOirhface`GGGL~pg0Z3s3IP)+Y}fN z?WA#ELuUzU!7Q$CWg|C}vmzxP&hA-=!)&lS84)qDj%gqMKpnMp~~MX`M3K34_=4YTSL zyh?8ECYDXp@S4cYXh};=0JvVH`Ou5Zc!YE0$$d?Jv4EY>_&!=q}^F6)iWu z<@T`F%akpCbyeTwhp3-HUwndS7ifTcYOd(g9eX2QsZR1^YBT2yn=c3q_$o)7`HLv< z{It0R$J|02%PpF9_2k=AI@--erLA$1fu9ZJ!LYmMGz~X9NaP7z$3AH4+-)d5gBQqm$ZQ=a63yTjlpXz=bX+4(rGw0~S z*_RTP>Sr36$B*z#`SY~+72k*S0+NnG0s(BE%HFHc7N#?f*{pprlQ zk|Sn7S?#@P37@X(1otiQ4Q4H+H$u*5?*J5hMDa#4-qY<~SEiazrysOT`oRg}G3SHQ zplkD|56nlpS=RbHtLN(^X-ZSfXw&YB0alU5SLb%+fm!?2i+N2Z1LGct%er-Nm875d zVl2X)`=R^#LEUF2`_4(9d-aJ8T1?Xp1Up6#2B`AHko0Wn-NRZ@*vhQoDN<^kiow~g zkqO5SwM`!CiTSIWsRYSfkPN9*xyV=5hx^&f7uhVL*lckzyyN!2z@cx=g+*zk>pDU^~%RAywAYQL4s%YLkb&;QtWy9sX4Q@!Ov>>~+W{jxE`H zJ7&o0YeZQgE7`M*V@qbp-cpGoLWE;vZxPv)kv&4@bN9TS-}5{FzdGRNbKwidU zU64ziHJ|Ts;)b}y1AK20f4Yl9wMecAcJ*T>W@rIvA(-EGp2x#Sip5V3d%|~2Y0aA8 z@k8v-jLisdO{Ntb&_7{shlH2(fKZ=8KKo=(!fUlnuR?IbjDBF<`H_a+)FzJTSsg|^ zVpQ0%A~w00P`aPsWpM)7emq%VKD#VhROoL1&>^anm$B_d>gc;SS?&~sAfEJJT!<_a zg{3~F96b8nx%kO@PHtVOh!6IkkAw78RKENv!_ex|YUxakDV*=x8XxG!OCKG9R;x0; z{yNot#Z@P}iSrlq3;umO%7Spy-J_Bdnz_s~=D2=nS`6OIw1SLh6yDIb{-#TrfRq#MdV2^+;48g`=fzEFG}l+wQN^R@Zo! zIPmxQBf7ac!BJ>;3P%D(-))8dg}Rv=XtU|4o3(Ah;aa7S4VUCeuaqY7Lnr*QSEc$uCUQ7K_ih_l$@{ z@W;KSo4RAN2{ry!dXv^)2<5pSz5XnqvO`5PdCK-$6C;X@lMYYx!Q_g01IWUJ_u}=s zHiEB)pz-h5rIyy!ij>Pfx-`7lfaA`qMTIM5*7vXN1`6*u!f%M{IS0W|9_KSRPN2v@ zUcn^zRw1YM1Nk$T{-DOEYXK3vw_1i*YY1Y?k#fZmyct^E5W?wim7M+olm9E&}MFcwaWMbSA!RVaoyYXNE@^89?VgonV zw}9iNgOkES{dXQb7d+|Iej^G^GG8Pw@q#}*509n$6VXaVm9X#*i6UaBetL)|#5yVO z8ZRFQubw zM)+pAcpypH8dgKf1q>80kJZ1pbL&*aVU7b|$LVO3;mzU7!s)HaY`%MYJ7Bq}ur|Bb zl9&@)?e40JeY+>i`PKDTgp2xgNvo*UApxvtSfoO$3ystiC&r+V)IgE+#t+$|3&d3N~cue8lLC)MmC8LOl=WfcMKQTQ|GtI�^a&m)h_aI2-R}A(tT)m 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

kaJsESHG_q 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%0DQFR7cn^% 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

wt4{ZPYT=Wub$>oB@;hM=*Ow?WCb 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 PDiUXcu%lpMX+jTXIe0 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 z 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

EH@68nx^ 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

>*M*H{k1!1&$mfT2t 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

c5z#&xU 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 E6eygR9T4 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≦>ZSX!YfD5A;mf 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

f1rwGr;J)>3E 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%0A#T!HHP+gO~!dHC3M_hNu5 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�dwv`$ z=>l0@X4Py@R^U#&?$C(#;eXNL*3UrB}RK$6vvS1Q0WRy?>N)K zOeS{=R{b!s$KDFs$xR9@2nYo71R()HTd$+2168Nw9pnXjBJGLdH>A!-7SUmow7zTR z=$Bt1z!+ZO*&zyAt_8*aSqbjj*=z!W|2b^n8+I!npr!XEI`APX z3EZ{vVlV)Xr)h?Pz!P|ehEDjDKIq53hyJf1F`H$=Dls@00CXRtiTuP4a{T?oul69N zt@5ri1Z%AS*|Ll=P{$!1F*1{Ec7SirV&r9SA@u@_CyGv9wv3jPIt2{_Dj5q2L`(pp zqCo5HVMp1HRxhE`>#+&fSLq*HdKdLMt-z14)+0^|z(rh7mzN=MZt54|?}k}!%?V-u z?On4YQ}Oq!>+NDG=qolQvT$TeCs?zj1O^LiU?&(CUzvM4KL1tZlYXVPWIznZptz50 z0r>m@MB?=_hZ%W>?N0#v*K(_^?2A3Q-S~Zy6yxm4kNVve20bmepsh&d;iriY+%3sc zU$@dG8j-0*Do97q72V?bzg^?`@7y*Bumo-MVVGzuAP*cjeK*a0xq#T9>km4FYt3B} zzxi&7R6cDU+`#GJy6^AdO-7SRV1_eTU;vOPVMk4<@$Y|}OaHq*17U4=HO_2ilU zxH?5Gm0-AQhE@k^;T{dY%SwdLGqel>Y|x+d5K({xkiw=tqq8@*A9zz+-x5)e8xxk% z5LxqGOOrJ`@}%3a!s{ad2Gzj8GZ93$A2ePq-jd`2%y7Y(0bEPSLLwT@^%UMEY9P^+ zHT0+6;ZGp8nF_=?JWnKs$uT#GmW7M3fU0~K*b?pb7%NDeNGKt?p4fRL1n!S!SNbnz z<+Kj(g$kBm;%H~GPrBoyXQDozMyhiIy2!OIQ|VMR**m8+Z28XvveG;M=y)g@_T*k` zHD`xMA2gybW6OmLdQ#FGB#s)010DutqGmMsufNc2p`20%GNN-I| zX+>jo@9*DJV0wZoipM=3pO%he-Jd5Vj4OLJ)Fz&_bJ)`iqRh5_1LVRwn{<1W95H zI&j(S2P2F@83NJUcg8^b;;fiTKjx`uPoUe9$g{f2`6c^K^s_+g;I%9NH2L4(oCmyg zJX`7Btm+t&jUB}&ydnN@IOlrCYZ%^vu^SSv(tMjz^|voG9fr*Ss}Pv&Eg_^Lw8WzP z&ypNK?p)lMs+x9ER&q;`#kpfU-;^yVN9kyRCE9k9P>EJB5fj>>yJgEVhAj z`BnL_{gg&IckTxC8#E!n>Tm3&2Y?&4N4TXfT`3-*cHTyEUnCTFW0RH?zBP{qmqc;` zRH!CwKnfWH;h37DDZl#05YlAUI~WjEc0-&2+I8xSle*>hdyZ-{@`vwMekAK+Z4~&n z@`k1HmNE#3>3PW)skVFSP_qe!hZNr|<~XUU&%{bP07E?hO4)#^gB=_&Nm5NZF5azv zXShIHz#KY^u{^vOFU(z=8~K?vnvezxhPc~xmtYK_#t|kDBT5+~0GXkHS>pYlmn!Cy zrh=770(kRRjo9Q11qeC-@L-~w;d5TU`Q5s-9~5H#ek8hYJ6wHROa{?!lMP57{Nn?T zO#yo39T4ZJT@n7=#jmZR?lgYRbzdVSSg;FV14QUy8W7xK0Jk+UUbZdS>r1U$ zQZgT|lkdfEs^M6~rTeE3WyQTkJkl!!Y}@dP|q z1CAw&msI;R0^Im6l%XTT7_g-P1t`^5aNd22W~*brEJ>`%ry>%U`@9dKbqlTwG{{?_ z!+w`UPRB~WSSBuBS47p~cZ*v*Q!wo%6);iX8q%@>B^8K!{+K)B*U= ziUQ4YF`56|pul~VMm~SxWk=B3=wRB<;))IblarAI;X@dYQihd_Sdijh-bwI9Ut5Gw z)({~>jr~!Mc))`j?GRLQ5fgEL2LVD*Mev$)qtPPO=#hUqTf^Z5)0t=gVr0zwaL!5o z@$Ycmn+<$O6%2U#xZa{C0EcJ7T1t`XhuC?<+6g?Xd?;c-LDc}*0mU1@6IYZ9NN1-N zx#se>-FmI+hDuc060r%kl~TGTa`JiprM=67N>uX4Nm(26@UsZ)ZyBWeUAZ;=D-t)5 z%n8orr;gTmSkOzZyB|J0H$g(-^~gXXgfCk-3@~qxUUQk#_`n%Sq9>LDw10Cbs~|lI zW<=bgWPz1s)Y}f4IOB0?zef#4M&yqI1CX{wXE*o41ob~$rjFf~()`{o7i3;L6-wkk zA9wKZSM*tbG(EjJ)QFXK%XJ}E;xwn3EA$1IsPP#zP_W1i_&-E_by$>N)a{v}K{}NV z>F#Dg5L6JPr8}ghdniGW5JgHtR8mU12apgX1f;v9yYs&OzVF`4Kl41yKXcxF-gEX^ zd+oKcQZZ!_A(-=kPLeKC_HrU3u%c#7l8BQ|NUr0#!sPdY=ihRq0Fn@Og9&za7?4)$ zWQvYM5PtoS#SovLb_C}1&Bcny{E^NJj41Mj!J=s$ z`4#(dj;=-l)XMElIC1SqY@~}U4BW0?(4v#og9v4p)w&daXI=;KgSHPEUvsWFY-L{DPA+Gh=Bf>sZT3DU5wht_$RrWwT~VdM_H?(xdKHH7qCw09?Ahne z?Q)wEZPHsje)LvxUFKO5TI>&8UVP|XBLMUGgUzr(tZsC(buveJJ1Qt2{TB<+jlQ1< z6hm4xKsfotstu@4Bz5LxhQ6>kTi@clIPfdTszn)JgxM|XA8nGq&2yaJi*!Ast|2nB zWCFUu_@LR}1%$t2s?DC>xhr-hFYkQc?)a}>;@$UL3I19i>Dz7ud?(VeFQQCG;^KOP zD%zO-vUcU+C`h5?0htCMo3-C*pF37H7v5p6$8(IcywRI+`Q-GQO!pz=;YI0O=EP9# zk*MOB)6Q@w^gn(Bf&AG(3s6y%%K&_U{5!Gr7%2D*#zKUa-pA+Fo&3He6Ws8B0!s_9 z80a-6Wrv-9d=5iR(GC0#y^;kqH)BEol@&+_*p!U$*f5^jOpghwg^*E74H(LxJ`A=! zHkl%hP>ASGBfMFpY$n#@E=^8r_rt{lrmmN!eoIY*1C2ADC zG*~*_pb=+>TeSF^hXDqBP#9&>d@zQ)^05S>uT`Y)v@!g9)F9<{x3^)8nmEW$_wOdr z{C64vp4RXQ0AzJnFK~oj@_q?K=<-7TCb|dX+}~g5bw*EM42Q`fzz8dQ?)ngh_~p(+ zx21&mlz*u`5B4cSn0)DS0Bm0d`AH+clCvll;G^> z(=7(_szHtez1WE5aD>fEgOC(;r?sF|wD78%TGBmli_W~OAdsT$65(&rM3q|<(Pdt# zeBGUbiF^PfpaHPiM|6=bn~rVc8}6G|B(c42)AMX|yl;5Y6&(KC$$KYkz!+>0KpK2J zCX!S0|3%{@%MiV={1wXXxzCv1fUspPbSf|kou@v-BH)B3@1VYY&v{Ysymc=(L*c-TF=t&5m_AMp2tAmKzv5QOuz zJ?N|RCmEgLB{}U0n&d0>QS+go0a;VlJ8G0m})G3%QRw!{EzZW$zT9YNl(P-xPgr#j@z5f0N zvZ3$r$%vT2JL3m)hbTmjuH>JeMxnl>7u;PT`>?w}6%EM#6hRBlolH6*cl4&MQoTPx zc&T$0Z)OJ1L>5Cc0QMvXF&IdZ&LBV>S&Yl%y!F3ugW{g7_`PN?CegoYeJBigw;tr0 z)=v(Q`7xp|;2#uT{D&1mr5yZBOUWhHPZ=e*w-Ihg5>VF^3L9^@3$BnK_VVA6MAQDc zD&D?Qo(S$+RnECi8&Mj+EqEEYsC<2WWa{-hVC5d_qM3UNk^+TM8iO%8YdW&@I z{5gaxX1?-BaT3~{{Gl_ddkhEwn!82XgZo}^TyjiG%8-ysjJ5|S?ecti%^~cw7!@lD zr3WZ6b?|~=iw5TS30DD%2ejis{$)Y6Y2x~E{4tw&wj2RKk2Zo5)!r$}Ft}q^Z3YxF zBLV>y@=OMa9NEC5lh~rY4RXj^2+A$4+VyTZ0K;u7Vdcw4xs2ILRWF|53s>`{jcXb) zO5|b%9{u}^fnSuYAIY9|aPe!sjvL^8-**&{I|_gW_SE zZWOFUeih+{4(NWWJ&>zNdwfakbSnFliM7M#tn{QQ$;--cSa*LbzlRe!BZGuZxeMwG((|U zz8brL(IKhh90*J#6tTI^__JT$P--ca z9QxVD46U~3{w~TG@y%$Cwlm~-MJJi)eCqdQ5N%(Lj8<`Kz>`Ik*+ZC}F>6SnUh@$K zoI%`0)FR58zt zlz0W2wGJV3&!$5}b!_cs%%*GvJ~YXJ%5{k|0w8`_^{e4&$Dw>X|2uIJ?X<}E&zKo; zv(3!XlilYvY+z?+0)R%2b6oHyiT~zgQGUO?!DKY!`$~n3!&F*CrD3w4Y=>Q8Se~CK z`3?G`H^~w0`a?hTg*pv&AAMfSBRP4c+jLP9O*OO6bD(hCb)+P^spl&68+5{ z_gm3~@o9*A2Vf*Gs8g}K>XByg95b@^DL@q%LWJ}ZwGDb1b!SQP|8TeQZ`@!Wm|?pg zeU+nX_*j0saABA2_i=%sYHXxYfPS{UvDf6$vn74DsTV27Vs-ryXMDb~FE0lJonhOu zzIlOdimXdSeU+C8c^+%iM>8fDp28d()Qqy}f}S|~cyCMc35c?s{Hp~DL=_3cH4fiB zLy{rGXhLE4po;{and&rQx^MYQta{DQg09JV-u4DE!kT#T#m9&4?vpq^)TL}=DBc_z zzREN`kh6mN)&9Xg#K~-+crnYh@fp^U?@Rhvm6vEBf`7(XnDGwySzq%Z{FA>Ic0@DqF>W)38V%7A6x{tR{ROdwRO_vsy?+l+?JDE%#1agMIa0zUP*iXi!BFl=> z<9R-1R)2~3E$L~?Qkx6=QjDfRs`3BKDboHwIUx##MXY7=2kGCP^`-ggv6-c{^@WK) z6Mts^&St(YUN{{|77)wK@&3YXF;SLv?k}~ieoQupQET$1oNs0i^XvqaWx>s3c)}Sj zpkV_5G{|~?C?UoXm`P}=v+3X2byvygKDNh2vZ}~114L2#C)+1ns+Z=ETEVxB1SntE zOJ?8OX9k4Ve|f;!-7w*(Hm<|Ny7x!O$Je@&fpdN2f-@qJl^ew&q1cQDZ<@)XXOr(2 z|B~T57b{(#sXI7wA2C))?bjbGNRz%!*30|)#Qv5EFZkKT8BnnJ#m+aGTXYz5LN z+xFnT^ONzwemC(vh~3Uo(AaIk-&Go>kBj)Ji(z;L8FE0v8?(E7{O?z_*&LK+?Taa) z39b6eWGv)cGF*_WX3O7v%IvXcDK7}1P2$4@&aBapEkS5e*1W?)Kz{()^+An%;Cz@q zVQ_}eRIrco-9^eWUuDTi1()8TZnwiOIXqcS=SJJc2osgZdXK(=^ZruN*}mCL3=|G zMkSALxH2()3tb3hEtJ;=*aw5U4o$n7y849JT|F37N-s$42N=LS9mu4Ga5XwW1@WT+ zvwU%yq}|BS5UpRV5M8YdM&)qdy9_W-%~A5!1N^w&V9t_KZDI*4TiF)e5va()y0jSv zEFGkO8L$89# zaq^%?UpuJYDJ<1|Ty=ESig5!f^aRMiao}p;i7XE|qBm=zH8OoU@PNd1BEZXE&^T}F zAni1ri&5`zM`kYaf%o-$#CEK2`U?_~4yoj#sN{ZG)%~3Y(ZH6=V4=p-gO(b+q)%CW z_fIyi+SA`(HW!_|s}mBj@;Q5A+#IS@>3FGUJ9v@zG$nN3KiLf_$_Q{x>eSBXh8uOf z>1m#+M0AzX-3T>xu^ZAUJ6bbIBe#@S-AeZ^^>(G`_Ha-u6)v#shdv+Hv?I(cv7re* zP^{R39bixRG5%WDs%c1((N!$KKTJQuAT4&JT~DgzsFsPZ)1g2JzI@4izwz zj!{|7WEdFD%ql@sOd5vN2CQ?I+|XKmm}EytxgMY7y|5A-!n7$8|AmOl~ z&zU}+gL4#)RWl*TY`_>i_a|E(4k)BtrXXs4ejqT1;Y%1Wylm=Wtl>tKSM%oQhi&A` zxmsr1zDMuVX8&>>%UU}1SDIMi9ySa7ZhS+iMq-a9gWsXd$6eLlztPK`KNYz)Sz^S8 z2t(lO>~&G%(%^%jIw!QbzUibuD`gMb{N=Ri-HB$dC60!UKkf4iDc|1G#jyFDme&11 z!<=8=CWK)dI_h8#{YQt0S429wTm8@(i~W-KV3vqQzaC~T)1KxY1_QQN#&`^_Vz;D3Yg`-OsAy~)k8yV7eJgz9$9LpyfHU@KK4Q4TcD1%?yh3r*a&D`hn(pKR;aO*V@*Y*xt->=~sW5T+UzCEe(~!)D4ee5e9-e4Eh{(+< zkgR6OEsR$m=YU3Ig0+R%4_j3 zL!Ah?LWQpfvCUZLAPj~3Eu#`3XId~2##89|l+Lqo--8eL2; zqkOL1x-0K5*fwZBG=D+uuX^~wyPaS?jeLFyvyPXW3E+;tM|C$`V|-Ec?8 zL7I7R0)@k>QQc7*L!?YFDRM8VtuJN(Vk{1;ijXC-q%4tn3Shn~7*ok|mmKJ2aT1|A zYZ~ww)5Uxbo5?#quva5~b~w}0>g7YAb3---9l#Z_Q7$GxY(r$bv42>(1IZwG{Lx>&2L-(nN;6F<6LyqDI(z5ttpf4HU}GefIVQAmioiG(hEZ1qWXJS`)| zOs+yR?+;cbdC2K?G?Ylb!Dk5det8BPLPrx=A0z=m9}U2`|5xNWTXQ)f>d_PG^y^&% z$9-PCCXZnU(XrS>>!pf~)#MZ>M>Xq44-CwOA3LCGK_>P@uq?`OKisAI3~c-EqU9Zme#*60Dh`&WYTJ^Rd2M3DN? zWF0z4)zW(!$qnBS62CPPILniW7rb?iAqr?6gQ@D?1t1fZ2gxg{Ral^rLWH4ETo^DE z<+rnK+OVnI!LK%(nrAqm7DkkB>}$9!74+L@iC#z<4e`t-LMaBkm2`datCkBi?#00n z7wAa2=A&|C783=`FOYA`S3BA-ZuIhUFSvT5_C~9LR?B(=FO^S-JdcBui}G1!ioiOX zi{$RJv_7rvPJ+o@59e0Sb78*3Z#6E9q*4Y?pKUh@Zx)HNq$U*el*lXJleH^913Lzo z1{5$jpgZSjZxKo!a&D!FkGB%76S$iBX!(o&C(ni4-XM8yS?!GvEO^dS&FG9mx&@d+ zBjhzP(y!(IAw%_$oEJa8EQ+n8N89r?g}x{&#X(lZx_yR{86@w$I(f`#H~^}6^XUA6 z3Gn%gB@*PmZMLb8f5j@t+ZmhFQHhB@J}>T5ge~rL!G!8Yta?5 z67?|MpQb*dVu}Xcn}uIC_#6W_)AXtgjRfya&Q2L<_I>iIkRL9(KUgX6Y@7W8D7Pb9 z%LyMl0AY}clZn|pl*=!gTWi3*NV3_Ub+Fa%gXiq#iB2awqIzF%lin-lc2g{#mhg-$ z`*!J`K9eIc4hhcXzd^WQ&FTE%?CbFT{-&d?+=`B;@m(B+@N8E$!3)PX5D&6a1lJO+ zBz2r+!9`N%qS=^T-32W-NkVw$>1+n|0~T@=jwO#%O0!eoGdObF%1?t^NZ(H7 zrDPla9n`b3f~lZI{TbElGfK>L=4_O8zfe^#&``zHpt1`T6vG5%(Z?SE zRxNz29|JTtd`C*CWWm<(HcjXm8q8;No|l>M_5JyCT%sqvztb|sQ{HEKSu?fU__q3V zpkhDiap;~9hkvcbl*?P~ZZ;fDr*}C?m1D&u&N4#F+?S+0k<@n#9@$=y=XA1444`4+ zs+t_j=4$%`mo2Xv-a6MW#b4>JZ5zlgJ zKB!X#0D9!QGWaGYi-t;KsU}jqg;Gn+^hcH8HYG2NA{ zoU+r?vG2DSB?ZABx;>0+xnL}$K1VoFXw1z&p8NB&_N#N;!F#jg1jdnE^8`pyyR&IG zB^c0%^ykv(VQYyJRUhC&;B`uVPevr-{<;Z)2YlysY(3&Z?op;bLx>p#CfGW0N3>}U+ocB;;UEI z9wO>kr+iISmzeH3X{}1!GFdZKuQQ5gLnFtMtp>_@IeQ=4-T$Z+fNO*ae}Wb1w)_xN zqq&x+T{hjWb5?wDgIL=j@T5VaD^>lDnp;b%L4P0=e3u9fy+lbaH+06V1^;`d0-e0#tS@vEIPCJWiQ00HsjKu znxFt)2f=_e@3OWo$>k$aJVEtp1A44>btOO2h@Pa(v8&6Fk+@0q*{?ULFis*y(=v~# zo(Fir%_}`De~L%?>sq#-%B>#W{B0E1y>TxXd?m`YK2<9;kj8-ixysH``_l)r;kdNn zDiS#Q(hfQjC_qQu|BL`x{r{AP7_|Gwyj^if=ho&2#-|5REkAyBjV>*3ZSO7I#9 z8!QM?40f8jwuEEb+V3B**$8;QQp#Zmb_p3!>NETOR(tReba?23`O{jA`B_ug837>} zA06+zFVJ@V$gec@r*&bYg5!?=N}7pKjnC{eq*G{ZEm>CBnBO zD*k6QJwgx(nrlVcgG2&3E~%<(gI}qXQlHuP6L)qJ>&2r;pPTiv0VGxcx(|CWI)h`m zZ>!C164(7|E!*oTXA6h z7Rlvf_pqOyHkoSnk{|fS)rRRlR@U9vB+b~1xpe0;e63?*Y{~fbl)B)CxRFrgq^sTVVBA8kHw8;gucsoc4 zDA7Yz{qj-%xt<$8G3EL_R2>^Iv)BDr;{Xmw&G<(LbbFJDFcN^i*u?2qqX6e@_9DttV6FiVK=#~pI$3U9>oX6 z>wd_xGT%Hdc5%6j<2xx+ZQS*}uNkYcnY=3uX=sBk8-ivX`OH=Xf4qev{HejVqD~6xUJ09fG~g(j*vXrvX5M17>L~f-#oteE3=T~$ zErpRqwxbuC;h8FzG4E~?sYGI#{^Ce2t-%N)MQw+AKsM&x#a3_^pwX@W2@Br1VLvRM z*ty^)PBxd@YdCX$+w(!SoKYZCT+|49`h?=dsFlcIV8#Js##T`<+ky)~%$zCFeYbZ<)kkrxH622TIN39LSon7PU4Y$nFbf888QUj^`wRK25M zZ<>+b?S9U}caCA1bi-uFmf?uh_{}V`WeazAoW7afm89b0uWgZdouF$!MBotrw79&pPnhx3gQQJGX@~|h4}$K5)#$K zwg>;Y#9o4So#zkjSAi#b{h!~*@<25uMT}fdXj{Rd)n!u{Vzm=}U zRCHHb$CdCv6u9EE+CnR0MOhUS8Y{rJFRJGE0sudm-=zfxAPRdu@fnD_kO3n@kYIER z$g*pMAD(WASa$xMZ@OvinC*JmAOBN$;YB~)>T!1_S)$!4C6i#%gxU9`10P|Hw?SWi z^xyP_705NqJK4FH7p+r8`w631B#8VKEbEj9C{tLz(V}R{82~l|5=L`_?bRN1e2skw zP5)jQq!Mj!KHLt4M8oW6h14yR@q>Hxg|tvdHE)AvX5xM;1;F;%Ur{U=`aL>lk_TWsxCI2f2Ya%YLcdz|*uxbA8(W(g zd%`y|c8$*m=6aoN#3FUxuGa;WZ+Rul3^T7{Gi>D*vt~!P%soxah!aSk%2K%&sq0&h zcwdlMJqF~GH9hS((cll_=3Vb1kYSKO@@ac;r#GG@SMC~_K3V#L=|p_OE4vtx5BuS1 zHIT$fIvbNpEQkT9d@#df8iMQs|KR{sOpccWxQoBgfHrO>NC;N3t)c&tbh460A!LJ3 z*&>+sx9i=RyDv!E0Sb>0K0hI>aW=dZx*Z~6Z`M-#<%d)AEbk+(jR)@0tvs0IN~Kzt zhSpOKlcojg=TUOyas-sJRRWAE&58;Ilz5p$P3uf|iIR4%{1m{~yKfu-j9)nn*#-om zPI?@ZS559>=51u?@fLDdMFH_IzH(F(?fr;tDEueSqP&IliICI;9be&oc^%}w3jNIa zm5sn3zvfqBZI_6lrVa3`vVxN+WKRvMj}ZYgkr48aCB3mVx<7O(GcN<;#G@E*2x@Cz z5@ySORNAJtg5e3io43pfu1Bg2_5ImwHo?9$Do}oES=!OGJ;2RFbORKQ-{Ng*e2pR$ zA(=P|u|*hpJTc=x)?9Af=P;;XtF zuN|yDS0`+}oR$1~X{p1VoV-C*sX8`Mb=zWB-L3l{{WXm=0z+d+^b#i>jqhlw+eVa8 z7EOJDE6$Rs<4$S?Zk1s8kWF(UKN0uCc%e=asKW@yxxHm$CPIQg0>vzjfB9mkpt4{* zZFOG0U6ie}eOTt>t;zl0_>-4&!7zq1j51foDD3P16x`sEL!f|Zgt8-r_+_F0M{-tn zz7k{kh3AK#QJAvZ$N%CcnQ`rghMe~}e0Rw(e<+MxJMm`dE2Bk$_5*!PZ0im;dLFXV4t1Ubwyez;=u+RE3>qp6wnp`ku? zGjw0uN@x58keIS}vJq(A0QY7MO6NLi!bQuJ{LO}@FlE#8IKIA)GZ9B4q~n|<*}lQ1 z$V_Lg4~blNfnlql+O#2qm45^PqGD&`#)*!y7X^A)sU!%FJW9l*`x3`^+o6b4BFFLQbZr@O~pp+l_nVu{AoxiXgGVDU?>qV+Z`J=*EgHA|AXQ)F3Zd7y@Az?$LX~lJ5hTWkZVkU z_x2b7^{od7e5Gha2}sQ{jMp+3{|SR17cggw6inkFwGhud;<@mUa9U;PRodEqjDh7$ zrr9hdvIvO7Smchbt&!RMa)D@jnGab8Z>1vAX zl70>D5nCfOs@AXl5Hvv9$yU~ZC9mca+8te<%kftt%wi<^JZhQx?Vt)QpC9;y) zVvY`!4tj|sf6qPfq)O@xJ=D+m$~X}0p0aHzjc`9#D-C{-8RdCiI^o!P6YacTfO4%B zp$-r+)tjW4w(v$jQ)n1NC#)H*g%WQ3$>S_6h}%$62@NOS`loE%3nRbB-qLjpsJJvD zyodAvRG*=y4R%3!+!UeBjf8IWWa@On2#mj-t+*RBIx#27aON+^D3~b z->=GY=vGZqRch$ZfP3n)9=%w6mZ?79M{=uP{ zyJqnj=6><+@TB`d*poH({)ICpx=AdrmZ?{9?7nghv(eX%ZwEj1olbg+qg9XmgnYZU zlP}iQ>U_9|9rSdD^>|BT#nGy=5oD|YLpD_;wPm}8`mk8Mevsjbt36NZz{&IeYv#$t z8-MseoJlT5*D|4T>$OcKk%`{+P$OKw?2*M$q&yL%dY&onM+961yzs;|xTMw2)Ncxv zzwv+Y7y*%B*ERX?eXfHbkPlORMl0x7cw~)G!oxa%p|29wQSY?y1pY* zr*%(&Ua4{%h;9g?$*8@#la-& zfX(J7wFgbL8B1W*G{iBPXEQ0~1nQ^Wb|mFS=)XAN;z%^I|0rahecetnN3|y@y@iC$le_4b zJSp`F^IUs=i_R$!naC`Q(e`jJ4DZwT+kY`dgiz|BTfIdq(dtG!Ab6R5sC^FDAwGP6 zB@~`3xuW0y2bavIsTtjId9LnYm{f-&^Sj!QV*xm_yoC=oen&iPi9wSXrQEEY5}x*! zHNL3ti?yCC?@?9i7TH^uDZV4o7LwucuA3a$qk}x_G}2A=nv)LYi-6u9w$*dDX60$I z2Ay&n`!~96cr$N5zKbPjzT&8pz5j8}SRO;uZi&mu48I_<$dF1Y?Zxt(}#_1|6FHbt-IrM6WZQ}z)_~V=k%yi9x}J*(~aIZLS!bC^%^>< z;eNe3lYAZ9iBFC_vFgMWq9l5SQypO_(UyFN9T76)6ZK`H0NrT=;|>4rmTu}bg!8YS zLg{$&HT4g-H}NiabmM|j-^tlyzo=&3ROmq8=#aci7uq;8KXa>L2ui^2O>X0)tD~ipoHvm<-C?Ud?SlX zvM9*wq(%Q_QaSwLQ=3}=Xf0D-!@xr>EEp2k(@uWSG=b*U9?SR7?sv_^X<>jka^tvd z`21nH-pAo!%x&R{b`zMkheQ|#-%;^cwTvj;~aKypr(qEDFdbgPb%%D z?9jU}6%tcLcWr-0IbBbBd0{1I$rtqTKC#WUU9pCRQeX4ZX;jYE2%g#T7 z7V-A$jd})Mwr=01ZBsGFX9I@@GKTLtYfP>-06Xd|vP%zGLln?dkf#8WYKv7Fwr6;N z3v=u@EA@zzTl=HLjkqPB9wayIGC@_FEq&kh)!D^9*r+zK4&p#3_Ls8`U9ArmMowku zny}0kKYpXJRk=@p+_&?tjFzr2eLL^&v4tYur)PVX81KBEXhwxN{2fTR>%5`bdl$

11KvEIm*si-wrldRQqf2%n(`vM|aYEKC>l5KuF_ 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

6H9cH2-cS61Vd5GnQ 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 z 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°LET|$vr^s7K)EMrXS4yq4A8rDd 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

iV4ahzjJ3*=*gvNg9#O3OW(p& z1_0-aIYuB%hnJrh$IGn=Cur(vBk!C2M1yG`(dk$hSk&sAU&Z^EgZ*4pL)$FO>xb@P zD!d7mSz}x0siTiAaYQ9KT3LI$v6*%*bmGoj`1>m#PrOnk-1AIS&n)qz8GXhUD)`8q zi~YSwHg*qy_Y5qSY0z5q8w+6-g|!l$1~TkkQIMF~P8Y#}9||~$!bHxAh+%|W$AO9DkiMw327w9DxUYS0t#=Qsa0}OyVmQ0Wz&*Lwo z;GQsY0H_59)MI&psi#=Lpl7NvIX`Ud4~f9idflOt)~WTKNBz+H;d@%v+QtcPa>8Tp zr2Gp1TUbA(C-a?iNy>ly57l+%>mP*%V9^g8P^eV%keV@Tu{xtE=0N9l)Ps97Ad-}ftzi(d+t$(jJ9d}G) zwXTNX5d#PV4EvQ}SqjO>k^l7yn(OY1(k?j6J$aVh(Qgg&?t9m1BbrlUaJsYrn?M>F z2mp;e*~FBA+8X@8oHiL9K4`$G^iNpCh@hi<_A@ZwrTUgdq-fB$zGploHUqLg=B-gs zZ^iF{s{W&XcG`UihQC<#qb*Sppt&QcH2^`@p%`%$xQyPBH#=l&I zIE!PHhtbqRKmV&lO`rb*$N-bmje?yIox1~}Wr&TXU)YR;fs>dv-u1u<_&WnL#%XG> zIk@}cuYi7@DDC+X55fg}`@MpZ0@<;buFNrEz8>Nz33K04e7GK?{!m4_ZhCA2f}a!jgP-W@UM8rmugwf2C(`dTx7Ww->$Z@0@jz)?PGi z25;ZKWPxnWjyIS_)wG33Yo2%XXY&2NIQ~o1eHev}`yAh+&V-Z&6#aro{%a>>v@V-x zUMwPx5_>CXF7*R38w>aIsi!v=|FL8`TWO_;6xIQmHbV@V`_LK#XO6H*MPBcE@?VR_ z2ARHOVau!0IaFLR%?^>nlGdxPN=GnXpK8q#PL}WX zcNlv;24Lb5$n=2T)N^2U{@9`Y_b+Y{N~;84vP1T?ckjDiV>xxbvQ#aplha&AIPnId4 zS~$Pf9_N%@TM;Lb`OXTp)r<>e90V&5aCx=n?Bc*@h|Ad)RTT65<`Lx+d#7~RmWJ9& zYW*bu-2fZh!#pSixEeOj*3{$ES;fv)&q|SJDH=vftgYr|to47-J|w@cBbQw%I~(fl zw^_xUT|5p)koR$EY`COQ1Q@?8<0*p$D+RQ@)QVi++zS86O%xM28+?D!r-Fa3#?f_- z3=0W6y4Y)cJel= z`La4hg1oD&l#Z2YO57WL)C_!sQ8V5R(BePBXoUx2y?mJDZoOOnf;}L$2hZeUht$WP z>OJ(drQ1>8qh0?0BkC)|qH3eH_YB?LjfB!AoeH9~(%qfXISeJGq)15!NJ@7P2!b@y z4bqKt&G3!B=X{4h{F`g`HG8dRJ@>jpW!_dTFY0qU%M@pmFtc=ZqBalPny*_66%}R-1PHR!YIfZ2!CMl&#sM^WP6Wn#YAJF;w=tmllzy51=aJ zBCHEf^miTtTsE-5P@-5Pw0-mfBzJQm=*y^$tCC?=uRZyT_DJ~C%EAK^BpLGebNL^j z+mW>NXdCEPrmPVOnAsR|?{L8IcTQR5+NIOH38;kp(uFcRdQ2VZ?;B;gVggPx-hLl; zGsR`X@hP}x;dIOba%Qjn8436V+Y}q2hwj~bC}0hlvDFq!CKUne+b++K_bcwrzZR4n z8@DS5w`z_tSqaju_BQu>$Q+qofi7}Yyp&#rl`$(x7krUpGVQp*pVpYdoRD#FQsrPB zujVFj&=)z|-Z7!p4?zt>FQ*eV^60ZhV+=#i`t)}}2|0%c0~NCtU)CmD-B->GuxF8p z=JeCg^HlSfpTPEmTG9c=mwag)(cDe{QICS7=Z{J4;fn!SVPAX@BP0D%oTt+Wwd^Gqvc(hhtrV^f`$Sfw4t0LX4vbomAc zOj-g^@|`*%ISZ28wZGmC0081E;a!;lJ*G^QIa=~)6a@p-Q9gJZOZuQHqSf_~iu!_T>vq5h9h?;%K_SgGT4oP*jkKWRg%Q_R&N4dO*f!Q;LPaVsbbq(<##LUVObRq+N z53IZf-6a}&gzLv3vhEBM3^VTZ?^J^zbP$rz0e@CG^v33gPUx>c=0UU;Sc1ic4o|XA zo}mG&Qa*fzbO1{+2QO;o&VMTaSrHR<_s3L;q3DWHsVyk*EqR2lR*)Zp^ZXzxsiAP5)}$J_<(4NkDC zf(_j=*t82I7Gz8{R;xIi6OMm^zL`fV)dt6NddV_SnD*-+ezmM{R@9{Ts7E=s+N2zL zrx{hsaJL&>q!WT_O2RbAmjalKd{lh=YCngS&~tx?9%X&2>r|n9@ACcUwylQ2-YA#E z#iF!L0~Ja1!4Ip83;$wXRw0ZPr--|A!<)a~* zs`9>q-of$%PyL@0tX@EZWWE8#h2h*U zG8X_E_!c~@cU2ENkUoN<^MQYJ|M}Sm(r&?N!Mkm`dv>i|pb2ijO16O1>B}Ld$&Dif z$r~NRF_XPEY03wkDm&SG0~4wX&DfeYyelPJ0b-X3ZpR7Fvsdu4m_-VG>qE+X?dK_R z_Ce3X=;`A;H~S-Ag9Ku*m6e&CHR^Ih`N4{(l7ZC zo7dDAh=m($&A$8v74v>u0!mFNkJZokXHNIK8jqo_8?xziP(gqqqeo? znofCG0m8I&?d{kuZDg=e0WT7@c-?aGRF!8n>~Z3(YtKvVpPU($*1hj1xMlL6Kde}U zYYVw&J-K`GwnlJY&3@ZoI?lvLk)Otjp!=yF$jc2tAkSZh38$D)yl`)d3&%aBi_U#$z-v1@>q)9T4T3Ulq-O9= zuK!3>@Rs+ z?T;b#7WZzSmN*%Xg;t8dN>akJpG_ED7=HcSOY1pi=-NCF+!mv;RU57t>LX+O#gK2*FK9)9uOR7G_}YlRnlG5w~qTRSU}g?4d96}+!Mk0*IyDjSu`oCn7eu=K;D_& zfmVH##yeLapE!Wfiq!7Hnn-lM(9Jiie{3Y2 zuJW3n6fZM&_iDEp7?vJw&>bF1yX#N&hj(r%P$ISH?vSOm|W_!|7B$ZfKIUPj?UkY*?s^=h;S7IbOgRnwI7!TBgPU0TLi!91k|I z5n42KxU!f`C$$cvLmt8 zD_uXCR>2$f&T~sfy}tM{Q&(vRT6o~hCK(!y-egG?rmgUedZcCF?zH76DM^uKnl@h_ z*d*@loSKg0T@`+x@P@N}kumOpcc+HSN0*%Yn9O~xp_mK08?IbFNlGm-jv6V|j~o@F zp^J|AWfg&&RJA8-gBHV}!T0yo?7EuFsK$u{KfW-T9L*#jV4Q`^V7GJe8Qa{S>>SDiz) zttx;m92ujnFJ`q13R)Y(8_#>MdcjPmFAih^Y^UwZl#}9Z2DSK0d^&F%lHuS+2CD}- zr8EE5cHG_PLx#;tf5uc5c0QC8&X&ZSPKpP2?mE?fvnER;7`t;l&bA; zx--5J|Is&(F)*IskDhR5{U$;DwJgAggx~W<8zT5j(m32&mZmDbRZ(bRnUw7^ukr?i zjbN0oK?}sCX0=5!n4thb*m>a`*q9sZdx$ZT8mV8Vt?l88N%NMr(986wKB_4{i!Hvx zcl|+SH)Xy+SWUeq0isw}wtXv=O5DVRO`v`q_CQ_%1Hnyi_=L z$SUs2@>uAUCuIl z!;nU@f-{Kp=4~S?1FBE@BZ&SVjkP)tXAjn5Dc+B&$2G(CJLiL+a7|I=bfOH6Kh}<` zZNbCKt!>_Xgl_}IqgKz}?l9uA$(jo}b)AbEy}MDZyo=#((Z86H^r#<+YB4JLu<&(r zuXZkecBg`7wVaNjIIAftmANbZ8|zn;MqEkD5bVf_d<;febXhV0?SJeSI{pt($UuHo z)ndvDQrJZASZCkZ^vKMwgddaq&aC;|y;fq6P+g#AwbAds^Zk>w0)Y6^$_JxMi!Ge3^#pI4 zN{q+Mq<2T{Q)UM;Xi!WTsaado4G{pO*G6MWR)e50Laaj9OS*?LaIOQrt2H}RZWgc} zJbJl#;2E!y>L9_I>CyU&rnB+3$7hR(q4hR7Fc;{^R%ou)RCWEq%34Zli7R}^JlMRL`54r>p_qt^*y|_n_M$bU10vg_aW+?a^mjxzRztM=F`kg@)>u40p66xHw8jnMX^Pi z@8yC_3?Y%D?p`)N{)YTS=YGvpe_~w3h zvKiZmYTclCvy8fE$!{Jv?9gB6jk5ZO1n{#8+;kd1`#pZ`G5 zDI8ZsX<92tgEqDSfbsQ;zq=HFjamclK}%So==k>cSAcoj5%q^q8R8>M`a^^mWk3iQ zYG_5WHrC0#!~v9QRb}x*YF}`*P_<&A@}&@`^&Iz$8B#QLhk0KPpR&%)-#M`+MolBq zGmb(e+FBU_Y4VC^ZUR59p9lGNu`$G?;S$1DVLw2!&p~cTDxM?cY&1`G`q;#kGa-pu z`mnO*lW*OgfN`4^6~T?}m`&&1#i&`tRDe^3eohAxAttjj1ZYtS*|3=N2#}@n_qFNK z^=iFY|5~dwHGZRrV`+@^Z!4`nZhHP+oZf~^hzMqdI{VqfmU1HLc=y#tSXOyS4e4OV(#i1=0&{PZg3(&g+FNpF zD_{u+v*BGOpUu1#1rTUE*Tf<4?Z8oc2hcP(8G>xaAf=e@jD`SEn=;{X_Hh65EsaT)r_J7=%V)?4qKi z)CnL_WS54N#qU_`m-x3vNOv)-bw`hDJCJ!2BlGz`RVEU5av%I@->6!Hccnu!QIkPr7A9HtvRTdftreJ95c@T# z`}4+!3mgDo6bLo2pJ6)40+Ge=;dUcu_n$%8cu+^xfb(_H5gl()rdyH7X0i z6l$jc?w+f#dUA;s-ys-A?B&K0_N=>-Ao=`3*iW_JZ z=%)neB_JG?dE|!bQ*&_%QPU?naE_oDFRq#rt{)@_Y7}5~FqdXp<|Y{VMkR$&VB**l zU;VdUh4y)%<~p?dys%e6u7jd`Wv2o{0Kre17h&HU@#H}znugd3 z3FeH!j*Ul$h%t!h=q`FqiWV_{sDc@D0hiLf7jO*{9LKkb=G9 z$UHy!&wb=Ghwa1nmQ4exf;lOaJVFB8HYX@<{|z9sgqfft-3yo*wsxLTMm$=P`z#8M zkugR>qkKkQ^uNi}A{Ci24Ywl(OpV0^bW3;V=@{-zZN268kGLCFAhZ12BZ18$v%KOM zflmW&#4zyRtp z2gG1>M=M_Q;?g}Ft%E_e4y#HGYq6_1g<&EtT>^I>X7bJ zEP5X1p6f9!a>+t7H=>1u9rq9rw}d~Q<`e#oC$e;~A^*&9SGrO&c>JvF&!hWO3$(Xi zkl?nplCZD$s@1-jh)dipX3mmtb~N7iNHb&hDcmnXb*!k17>ss5(m;k#6k1snfmHxO z4RJr_$k4NGNK>nd(mDDW^wgqcQ)}vwU5}|1j7M{ySf3z9hQ>aRbjex4tKlyzqmF0K*h7YPenHa0COo<80zo{M|~OH&L)##ao|z;=Lv=8OP9f|dkKzE zZP4!!0R=BI4h?BTkJu={hT#n5BZdVWMix zz@A_vpeq2N{(qn>!?>|g(S(=)ab0NRo~~!f{+uOe7(r0a<|u0BctvDpCxi&tO{RR$ z`v3xLz14&QpO&yRpQ1x&BWYuX1eVo>Sw-7^L*o&GLDywVe zwa*<+)SL;D6#xMDQVCqlv|D2+IhQVe`+}Lyvv9nnU+yB!*#1*TwXx@cY=GF1LFX!S z8_m0u*B^^I`-V$Th1o)08C-S53Q=#(u%P7BKU(MMv)s*m#k_varKcQeWV$`1Ir`X5 z{sf0Z)lF9sKm(R<+dXo=w&?k=sVabmIIol-qh+E{D9*{Wa11OP+Q384aQ$St%tuX)+Mq9m;3T7N)3OLyCDLPAvy~~J@ zdg6h0*n2rLqamjIB1rdVX@7P~t65a#;4w`$X0gzp_>7F$tN3;R^7%ZD<%{>_W4SF~Dmq?1gUGiE z2F#VCO7|nyF<#Z>AI?~|LrN=wccT~Nvz<4#A^6b2&U03C3Rb8{g0CF&f3{2smsdR4 z@vg_nK#@TVK!qc^(#esB9RMjrPof?I*Tt}yl_!ka!s~f%4jl#y#By0>naL?zImQaf@ve3U~ofO_f zB$?>7L>$^2T+bgxta2};e!FQjMVe7M&qL7h-4y!K2Y4J*-5gwAso>@zHnd7KHqj3)~M`20x0$`=Vj>ytFxR^^mJ0r{9gdpj<=lx359IDCTl+6mI_s zg~*I0gO5wUZ-jlwUxV$AxI5cJ-DBd%6GQHoH0;9{=mDU?JIVYbdN>!rLIMC{>-4KA zq-HBKXhX5(R%`j7u0Y|;i1oIGgU{hOu*`$A`xiNb+RBz3@5)z(DrPr+)T4RaEHY5A z#TSDOQs-q}FP)doq8*>*Q2m*fUT&h+gu7lf6?i80O;}m+FE7SH;uSNdm$(;Eh;-{nZ zx~0pngyRS!EuI7S^2_Uz0`*{)74F>`mUH(nDQAV(t!4x-oUBDj>gF9v?Rz*9t`Lfe3%3?q1bWR+sm~w`Q7Fp) zfEn0ae|tT!#0CJF$p5P^EYC=0rx%xY))x<#rxqqxf3FP<{}@Js-|h@08rZZ{!ae>B zi;5qJ%hbHepak49kUef4$&Wesrre+tNGw^7DirLC=|V&v8a4L7i2Ot$Jc%Lp&yVT$ zW1e)P0{2p%zfO#mYoLC*Zvm7+LXxJU4L~A@wEYNR)o1h zX0cpx0o8CSy8BH`gRT2>({hs{(wP0MwKDBS+C+ojXd#aD&kPo?S7(N9Fhr*lqN8J5 zV7%85dF8+$h|yKTUKm>~HTA;>I$2S)Z`OH7UEW_4$Ru-?d!A<8KN6aTT02F7kJHm{l8}S#YsG@Dg zOOLJEmE>H?ygJQb0IqdC#Ore7z;BPijKWaZU|khKR8urKEuE}dk9~s*zznRzez$>t zOyS1EdPdvT_R68wbZA`NIVtT|z;t|pYDrd+zk=Xs(7}Dnh1D(V zpYt$6x%sPkPt{BsnWcpY@)e_k57Kh|oayPx9B{0d1Su)Ky}joHvW}u?_;KiNf5mNE zrX_C-J~~sFu&qwrX~;|%6IEFofdh9g;p%htVI5Z+yFm;f+<0R4XAFRm%ziHUD@?fo z_`jigZ=UryXNUjGnz-;Zh|o@OolO0Ax$g}I)00E{O zI2TD#LZLZz&i(^h$~1)H^gJ?GO}Wolx5 z89Ho?;QK343?4SRiVS*?GBNo^NRf-3ls!jIP7`>EU-!O~4ZRhZzCd`9Zr|UDR&qJu zgMVjnF`@FU$Ua#5_D#wV{qYRl|I*KtJb8Hf@|fq`w8Mq(Q+e|4I!Ed!H@I>yfsCD` zUFFh2nAM_8LwlRy&yU<`3hI9(ygDivY#Xo6KZ+xDj4qXg@*`jEmW*~S> z3P0X84~0>hH3|7_1&F^brwP?=kh+Wo1R7hr=tsA`D_wi>=slo?43DHF;Y;EYPELx_ zynDIc2}YXNcdnQUpDn2svwA^dD8YD}qxnWS!?pt{Mxss!uC_*}6sAs69|Yp(z8TdT z7s5G^NI02w-@S0BTl2Qr#ZM9JD=Qk>H)2!+OHOB2If-u4^!lMF! z0TaMOcFebxTE*7FbBEzQLlBvp?HwL^@wvoD;eXHxg2Pz1&d=ODdD3iV)2^5AhmbWrR3fL}R`WtmuO<=C!_nTlJw{ZwQW_O%Ypgyv_V=>ri2;3ss}QDw)oQ zfP61i36-4HQR0RgVptN11l;!5n$5S%g8U{Nd?q-%qq=G=q!mKAu^JSbZ%*kcEvF4| zfTNyn5`WP=LI8sjAnhm(GN`np5?qhcHk-N|lGZH!$ThzgM$n)xBe!yX!8ZZ1^->uV zXGQNOenwc^{Ezezo{)4=m`hV~f8!Lrg1}e}u)JONf4)ykmb>Qrmb+Yk^7HY-1PNMo z@N3#H=J<8GVSd*W!?jiRGt9@LIhi*TDJ>thyrr!n!HS7OwRfT3I2k+{aOH%gH2T}y zb$H;lF-eYM1p~zxFM9r0^U>`yh7wqJ1StGz9L z_)=4jjCK@wv3XwLYk0Xx^HEKJuMsA|YA2Mn)*=~JOuNzv@?b?h`JpcLrrCi^tO=po z8fdoSgz@WHVL|(*rTVZFG*aUZbVe>YZKq+6V%W!w27tOyPJsF` zusq+skQ2>z5YDZGQ@(7tl_mV)lUo@9eW0@$9q(DpBBd4k`TsXWI_RAVXgEd@ z-AxagW&6qh8I-%4g(t_a4X%oT_X!4cR&RD9P(+`?E@VO-8Ji4G!NEaaCTYKRAG?-i zJKSjo-?Z|+s7)whKA5f8{i;4NaZWFiwWzsf+we4HYi%dr=<+%G4tR=lj%S~EB%Qh$1*1K z_l(fUYE1QKBW<8NldOzt;1`-@t^N6(q2>wz(~LT~BzORB4{%~M=}tzAGqegp+IJ>_ z%FYh-(RnTpW*{OtUKbgrUgt(jONN4lfciOXZApa&>T}DhHyhdf$CdlE70+5Fr0xt$ zlWvq?c#=OSvH8yFR3aElht9cpGTW*uN^dwP@Rzbug1LHb7AB)tgp_p*y=Y##s7z|3 zJPTuZKRAabDhooc4fPrR5PEAl!_&yCZrg2_OEe6SXQA{&CI=K;3Kvfh zMc6AY)abF`zq}skBvp3JZZ~9T{C#45_O1r5Ethw|=kpdy(x3O}vaHavW)nteWvU>D z`wG~f?6*tgc;!=BPkiG#{G5jf3q8ox<|nZk7wjb5v}1=KGOT|MV*>^H;RmTE zi=hY4v=<9woF5T#$tb2zUcCQvkY=}Vd~L~>59ft&P9gmmq;ld%0+`kuGpBj?``y^p z1?zBS@fmqA*#J!0zZDiSD*t4(*rN=)WX1N9$j2InE_sbzb`alr$QFqzsf1?xn-6HZ zFVs{usY3f}I)I$Oz7I_;^plE}r0%rO(0(^oGE&Xm1)Ttcax&njx_}+YWg{y4Tc|a`hsyk?2$C(8Td*j%$zj6w4cr7WhUmc7JoqG&E3PB~)vXWC{lvsaj@u zUF@#iTX52sG;iPp>5WgP+WP(JNHTwIekje))oLonZtunAso8kz4{rh*-ijc^H&18A zC7ZO&$ znV$=nlG8XIysP*nU1p^dFtc~f;DjY*&{L-U87#_J{sWYb%Qz+qEK@_!M)NZC9`fv3 zj5%H<>;>7F+CQTrGt|MQuPDQGHjzTKH{*q4ppj*RflkM#v1u%*UyvCIe=i86Chcu| zuF=XwVtzB)m3L2^dW|2aeIt9M(=~Gmpua7V(TS z6#1fV{?vx3>5r|Q!Ci-w_n&FU9(Sw%e3}>=U*vPBs@KqZ@FD&X&%?=>4VJwRZNTf% zQt5VGpLRdPG47bpL`W+C+PpT%`Pt#MXLw7ot4`0|GuxvPB?->0-uQu0{Fe)Xy)=uZ6p5#=|Ag;1-C}A~bSg{xNBl zii}`}6E;xzrM5>ecby}QEO$e3`TPF_Nx{<;LmuyjNhbh~a-#GC^R)Pw05`0gkun5b@q$SOxJsnM?HQ=2;Y zw2^A|Y`?-*ejZw?%2ljBY5S_-x1J&fc42j}KAcl^O1EsrUO*oynu&-dLZEI?&7i>Rz@#w#+QRG9yZf zb#&})Q}z6rf2iZ$8zX3#3fL?clpqLDAx&iv1_(^opr>B&ge!El=7rU)r%S&$vVZqb z1lsi?>=gRazR4gi*ptgZ+!QXT*L9>B@|eOBNI$6mSg0pg$#-;JfvS3)1_AA?JZR#Y zXgtm)o+22z&5^Phm`#2>m4HrEbY>_cg>4KOYK&Q;tKsI)18}|eA^kw)o(e?PQ5toe zilR|D=CH%8CGgf6K9o5xLN8PoG#f0zzg@F>-0oj4%aGGZ_>ygq4Y5`K$G<}i?t-`% zmq2~ejv}4$!05JsE*gQ<%|pZf7g;d*KV;!EvdkUKhV;l5Cj0t_CT2zlI{Lr2!+s9+ z{hXOwkXGv0KK4>=Se7@80+%f+o|KjkiTf}9<_zWS?~g|@003WD{x}QXINI9A5CH3gYU0eky!h5fsN%4>39)i4jWW(h$Z3jPcmp9C}Hsq8ue|hR- zxGXbz^u2NTm*Evhppphdy;qSy%4H0VvuCz;Fh2{tvB_ViT}|Ur8S`#3;8b7r5eOg5 z2D{8A92f_1@JJD6^FpAXcwtQ5M6;@G+r&1U-HeEoV)1r`_9_p9iHAY1mBENf(C^k zKo&MjN);n}zHCk}E7-F&8HAW{V0jD5Me-gD)HKhTz80>+>DeANZdFM?|4r6GqkeVx`}9%9 zGRg7Trp*NEi0jK%I=nyyU1N^)7ls({nXDIiOl32ohW(Bo%R!i5KyE?+cnk(04gE|E zI<{SU5AuS$$uZwFSFY+5w>oXOIE-r?E02yFPsVXC^ZTp}rt|HvPDPQEtM z##2=66;4>kpelUXV5o_1e8hG@k%1cbVMDGEJqyon4t-4Ofz!$Nh*d%;jV?@TJz5Q7 zyMwi`)Ij#3jeP5nAXeJWfVMNcT<(wotMi_YLW_(*#$#PvN~Bhb1oK|}Vv}6Pgpu7R z4Q*itbH`^=9e)h9N&P3WhtGC=MMPn-Mb?zz4DoAhtaDDgJ@gA{qnj z5u@QWg6qX-1aVLOOqT+$*CKQ5&@-!Xt{aG1y3vJ+?z-ImZ5YjNR>WEc>x>utBF$Cz z&$&u7P(#&%NnxbG)ZC+eDehn2{G>l2U0A`_<~&A>>4oYYiy4XhMFuSH!~31QwK2xY zZMWyk&SLd-J3sEsygz$sP9mP2jyvs1DSW9`x{jAAnwV1Odi&v{KP1Ozo~dyET-c~M zQmB1HO|e@yu-(4gnX{fLTzt-4)*b*63P3|q7?VL5%Swo$#TSkTw_$h%F2`#Un@Ckb zsrY)AEo|z1IP&44>Jf4H9~4o3Vf8fbVIAaTi`*IlK%TB^PUj*XH*+sWai;sFfFt`y zgFZ`PR4w$KfDtM9Th@_4&zEdMCMZT7j75_b@HW#%H$nrRS)Go`W)o6%=bl5;hh3~V zCYYJ4_*}zrj>y4t6?L7BBj*RbAqmq19{0w@<-)~Y%{5%rJLVp(7L?@kayBbO$j|3W zzl4oN!|L9okk3%B4!(Hx>?}i=5(op*?a(mgy2hZ4W&lDQf$h?6RBrmd9JhQS75=`Z zR?ww>)!fBRyQAab0TLNr|8#nlm8DI{FzP>?12CYcJKt1nbZp}EB$t90SQEHt$frgN z!CBVL!lr|X@j=JR=(cQYIbtE>8LMlW^{*gy(nhA~Jw&V6T)6aLV=F&!s z?3bnO52yl~Th1TrEBd7~*ZDU1V{cbb2Z7ut^$5q(S`!_zPGJ+S=AMJyKi1sGABzrR zBZF6sqqxgSs&9>PB(u|;yq6j>jvel=GL#&R&2$_pUlDBLXo_UT?s(CjI(sH)zKKN= z?-Dr>yX-p6=5sxY+@jHhcmoV(?m$A=3m_cDVAT#tKqiqxaE)Tge&2qdMcS42%8M&?FmT)uu5pKjIWKHm{hN<##)of8 zZb0US#uXWO*0=5Rp*E3h!2;&L-^j|C7pBrvZtR;W)>?|hUhmwGsW(q}O?ur^Q%RbS zi-*NHmA*2kCenV!C-yxA!!1`9MfNo#3bGw+R(J{jxqiMN>v;K9GL+gD8CdB{_Ezc% z{e!JC=viY924H#Ui5-p1b42=G{@q*yDSp1UBIn4OG~QKFb1v+#$A_Jr#^%+4HcC`_ z`;%XrEE*$I&`yZPJU!RWJ4xz!HMG*3haMhwRp!u%IH_39TUFTM6#SD%nmNw)cbD%MYCl1D#Tf<2c^AYe1o3aw~) z%=cqR(@x|C7kQ0nZc}dM?wrJD}Aq08LY#K}-9pTLIY}v~ITq_`b ztbUtp-ch5FpKKJv7}iH+QRusJKGMX4Df_)n(z9t1v(Oveu+`+WVclVb%uf@xIT?>F z?WED+@Q=P$o~xy=QPq=G|A>8xeuakhZH~3ousHg8D0>rn;i?=6*~CC-vQS{z0fI5J zT&UN{7czeEH1Nk)4-DG+RV<(9Sb%KfOb%#Fx@$TL?Z=ih=6A-wUmj+>l5cAlU~!`X zi}DTxL2ndRF=3pMA+`v3s*IQMpMng6_X&<%ikyi##xgKT2*c_PNOP(r2h4NCuluAY zq6X6+9#_6+NwJ1z8FQ>&iL(vUG`Hso-co;=HL;njE=+7F(oME+m1i$ZV?puwzIhmK!mZ-^!_-~A78eyQw2m>Enn~vGbJh^P!#w3-)Dh3FD8p=G!kU=ji{$R{b6dN zuaxpgn2`obN}xk!8cZOgJ39m@s43`DipWvqba_`W<>*%5RS{~vedRU@kH@y**Q}rG z9J;n55n75>ZoFOCc%Lf0mZcfo&(tqkgbY#?rMlR4yHw|`VrmQ4;SB3bb>|;_t?zN`_)I9Ri~I=iA~!; zjJn~g5rm6KcBlEjnyxCziE>_qb8-7mhxkV7RWuBbgB1x9T;wlFQAl|YORF4FeH-Ng z5fzm(^n;y0g0V+k$K2HN%Z{Y0WCAIha32gq3kc|zNFa|SwbXfK&eXdx_~+13SWs|I z==B)6MOfx6;KLd~D0dGX4iT9R?uSIK^Ndk)8Ka-FP}YEjXc+;*eq<^*#HKRe>+&`P z@4buq{*qnu;KT{4491G%Gp>%iEdnxRZ5`bo_cA z!VPr!49V0BZb4??TkBS@!Ay|*ch!`CTm#0hZIQxHPJr?_yd&4fj=6CE_(es!@vP{u z_tte z%fnZ6ShQ^|m%OE<8AlJYBNp8Q@e=|9v;Y`P2*q7CfM7JzYnHEc&BE-x2iqmAd0c5p zd~?Gg#t_I^E&nv&dAEhBZ1%mZjnL_r93?F(2>A-xSsyfS?{*d?#uAO?RDYN{@Q;zj zph-9bP3m+6EjO9N9w4~FMWDjo@at1hL+0N9$&klGJh0w0PZ)si*Rgm=xb-WH+P$kb-oKrO6hjfIMhH*) z&QTCwOP!DQN3^kDuZOv@XLAlz!n5#g9~;iGXZeJrt?ax~!EbZA-TakG$0O9W#b(rS z%~GU^F?cqpf()@^_`0LKezRd7`E2A%zl)wT>8cg+4@-X!+~%YDB%M`siJ|CetjA)p zwA?Q>U~({M7Zy2yF8~pTSRa3s|gj~~&^@)%tM zCX}N%_QGHO!H2-uPME+?!Fn$xC;*;~z>@ zIw_V)ZWD(%^2nw;M)QhlqV<~pOuul9?oj!d>xu56cZdH&){V%FW-=ld9rxYgTgpwK zpK%pQ+d^V8d#n{cFde-7`PkDKjYjIG6xh>v{cgy@n{Y!M+jR-x73&br|2~Dr#;$Wv zi&{V_&#u;B$c6gV@nlf#Z_>xhDn?s}7VH4b#SUqs3mgeFtQrKg1R1>of@?4+t z#f=tg;XZ;nL#e*Cq2{F|lbQ2Z6#9dv78t1={Jeak6A~W@`RT_DGvCw8e;xmbO+}3- z8^TQqNK<#%WGkq6wbNW`kv*%YxG=%?nxRiB!uCB$V>LRaf#t7>m;<4=deH&2ZZZIOt{4?UPDn(mi-JwTG`19mWTI$_t9}#c&8;CW1iNI2*VJ zAUhXm8J6&-U^%|GvuPK;J4M5d2i}%@-HaV?O_OKGA&-}dSma?ceC~nebLVAQ<=%zI zq3J+I7B+G%6Z`{kc$1_$+o zQg9IM5@7tDq{lASa7UrBJcTot%NMnjOhq0YWSMS^-TcZ?$eyooU)qZ?DtN&Dxv3xzIGM!| zL?16G(`JmGNMbzEby~yXus>`0^l8ffe);QUDWp4>mHY6www_PDU5Jxa7g-ex8H*Vz zW*-^`<7y%vC4ivn*vPh5mCQ!*&()5BuJf`N?m^$G}Cf-k)-)=BQe#8;90^rM#gsrTp6>Wr(-+W(9~0svYzk zWi3s@$EEdMmLt}JxqaX968FlD zriER&XBeNIO?~t`y|+g29cI_46Qt_P&U1c{XjY-1h*R?FV%)|n757$2rO=;x6!w8i zsHSt)YTu`Q`klQWUB!%A1eV-KQjl1G1xm98<4Y7f0K(C+wW4}#LC2>Z@%kw3ZYuk0 z9gEm)+iKTnIL4!#^onFuE)!;MRKxdDxF~6n;UDLd|>r)MP#T z!{Z-${Z?CR(>En<{ahKvq3aT^sKcE-ml!0!{932_`b=Z-z>bwqN&ZZQwtZ>1p>x|D zPv))Y8{FiwZR9b}>E9~*s8%AlG4XWFPdQ_>dd9gyWNygoZAi|m2$|1CU68Db+_kPN zkiF2)XxC4wGL668aqqE@$jDp>UnPISF;_^GZ)@}y+epa=PzlR7EaAlazd7Q7hO@!d-K=CX#B!Vu0zW-U z4SJw+M45jwbhkF%?-9q}%oKP;HH5+z9Ef?p$^iS?gxY%L=N4S^B-rn`j9!lFz`OKJ zuce7Wmpn^xi(&cvfhpR4r#T zO5cSoY1efexb>sniAJXXN7Pq^MfrVgKf}=7NS7iZA>E~jG>S-vfOL0vwKdMwPT0lFiA}ZW9~b}4>H8BAODq$z>68n z^BxG3UQ%(Jd#|x6_*4tReoS>;V{>keJzXvMOPB)+wPai|6lke*YkXv;S=))$klfJup7|5XRz9 z5*t^jAjTl{%p!z@5akJAc+>LPsEYOcDjm9(h?Wm$zRRgAyh+Dh&;gi7Qn9&`pQ{AM zy#Iln#Bl!~<@NYt)-mx8c3MYE!ZW}0%o|GJhkzdMz*c+Twi8P$yfbd{TAh2m(tIuH zERuTUg*)~rF8Q;3h68%0@s1i2jEe7PS=>k@L#I|y+86rNy_a5UMkiTGqkdp{jVNzxzNz4sXzBeybxT(5L->l1-l!PZ2iS$~49Yk> z>0w?S!))l#Maei7@C3=Lw*xuY{ul`jDfRwIqaTB(5ug0%Z$9{OL?3<#8u~I|dJ-_E zuY5)w=& z#D$38Oq3;{-`U?`iB^z@^&CcnmkGUghx4TdL(((?(+E5oyM7NIecj1gJ=$3zFMrxHp_DzQe^xsGrVLM((UVfLPBw}O)6s; zz_iaWI_xWlS+YuM{a%PX5tK3h0Ura?5opCmPW=jHUq~suq-92`bGt6Z^<6pFkm#eD z+~3x*7T;MqWiew^@`~4*BE%E_-RHouBW0tf%39hIW~i+V_(m?b)q@A;*%&rz-m;T83 zFcx(BOka_3h3Tnmc~8K9fbfd-yKFQ&v?SUs0wMD@$omAXrRtbt)Rpg+?qVFwNbMn2 ze0UXlIjVFN$8krW8kZ12rTX_o#<)y(tZ4mI6!sqR>?*CSG)18jL?M^i_h{Fc z>_|g^CR-qj`2$K2j4T#_wMAwz*cjD*(HYe?$E3Pbsd$Q&C^$15<3BPM<9pFAAL+mphEo9pv>EI z`@=Dq!4LWw*AHkE$s@Pa8SYrA*f_#!nlPmGZ@_=UGU-aX5wLF1s=F|xA;5iew80=? z!K}$Nm*~|&`Y`@ynGWfyhD$IHfia)Z0ZREj_)7m13webEj$Xr#eY_VW$HBQ|D``8Y zHrnxk#iz;_RECWK(P^_2d$yGO<;CIeK{dIG9}usfx7_VW{*O+-(%!X9wmHcu4tX9o z_mV}t>!qOzJ}C5M1UI^ivw5{K1KXt*R18RRjl=H zYZ%X-KjkKdO`mnnErQdH!_;p<_|jXo=#WjsB$Z>NFDvSgW+%FV|}1fuC2@QCvFrko?Ak* zpriMEE!__n2saXqwCFLW(ij`bwZl=3aSw&SYKt^5 zs!F`GN_zb}XIkTi<2_MAmNi6IkUmsf|A}Q;OL9=HpxZI8YuOIyefDVg$Yd!jebSvj<2HJ=4Xo`pCfjU|8r>KuQci#H-*wLG4;M$7ty*Epe)7XmBP@nez| zV87ci72Q0|9yt@b?W-u-s?7%5IcR`JKpy{cv8veuIuQ@`m3SuHZtG`;q`!3z=CyUF zT>dxxjq~Y27s#`K0OOB3XB;Yt8(VsOEJkStQKdr^bJ4Hg7V|Hn-}j1CeWVFxb)=Mc z4@Ocnk%J{F|Ijikgh|V%!A-P6_^W%-KY2Gqhn3m$rS;8dYwXh_`DC#IS6`HqjB!qo zIMhF=BjRu+#I5t{Rd4p_#5DEk&-M30MXx$!McQ3YA3(S{!oAP1g ztv}^m;CE#IyMgxmn{V}(um$}F&E!%iJ^1~y3bn2-qTr=O-Jao8CBsawvx)|+4$zHVV#J()N zi)CWTLkA6!B)J!t4eY zrDFZ>`Rgx7ao)ZRQ7e;LG`>mLMfI6B_wbox)NZCW_Z~hcfh1NFW?wdT`8zpv)S0+n zzqc}AFl4~#to=Uuko&YMFDC-vDxG>E73-1EKtA{hQ{-e!&3v47X&6_n5U-5n&}X1m zf8LL(Voj$3BUIxhzxo2`>NOXDkNOWfh#2#7agt!(V#WA=?xP`Pk^e!8QgEeXC^X^a z#opfs_NPyRs0SEA36V;}f5PK-uk>kya4Q$rtdbNDEVy-F_n&HWN=pI6^$R>kr4h<81InUk8YGLv_i$ws7#?_&oY`IP&Gt-VJLKm1m` zOjBf9zW~fABOr}R%ud;l?#M(ahtB|(#Fnh0uM+8Tv&@s^&T=Q%beYZ9W$7Z%48-6j zIWpZ_uIuvv;nQF-B7qR%%m0LUfIFArjfS1B^7~qMF@b57mqkpGKOCVV2i+wP>E*|M zP-JFi#}b+(*j)VVbAVuu%8n4tqep@Brb83Y0^0M7$vY_5>7B>rURT@nU0gSI=Jho1 znA6fzDXVRLb~jZPiI-BXUTNFdcaU$({2HiO&l-8O)2&)8v65NVO5eWdDg71kgX1rX zA?EqA0~1@S;5CX!XwVt!%-9wK}zAO(y#Ur+)c1LY@jMqw7rcwr23L+K4>X_H!+tX2wCxsR;As=fA2} z_FTU#^?vevlIF#;;4Q$AMn}VK#ctJxXsFZ-e@eS~VtFoksKuwri6OX>k$FPSs|IF1 zW-}y{B_z5*PTY_`kNa%oQQ9WIxx%fTx$}X0+hNZ0X#@y*wq#I2Bun?BVl+V#egirll#C{^#`z4sTbDSr1}g*VIhHb^^}1|=q0^Ugi|zxRSV!s1kW71n6ZE^Z4%O#LP-d{LpYQu| zE*t&Z%!<)KHjLG?+y3VKaP8;H?Og#BD&Ak! z==7yjL0p9|12Kq^S2y8J*MI7ST%?vGwfg%+p>41l5h%; zN^c)t>xB@svQ-`)NHt&ST*40TcRM-Re!!fF7PdcKe#bZF+#1znx$e0Q>r=h3t2!Ul zE2usx8l4_B(5TleS11^;0mDGgF#g2DwIi-kycO?)&_L^on8r&7CY0jvB{OMP#tW-)!1XrA2q`8)#XgLPG1D+%Q zdF+uq2gtq!xj|Qww`xnB0KyRgmyC5ic zCxnKARofhkmvEIvOcqvUczgUC*|MrQHu|W~UE^dM{-f z{i2xXDlkljm1xxNe>-@A62{P?x;Upvkx&97qIAc2$DF}%lDrqc@5hV;arQ=h8s8@m zVTB92gtC5r75<8l*AXxaJU}{mnHf^Gq9VK?CNMM&E~aY#vRSRBMx?e`MY99^Y@}w0 zE}>V58Hi{n6ovhB^8TN-L0$gHsd0TAuTiCzMZ_<1!Ly`Xl%$Nc4O}Nv-o^<|)GH2+ zHiF}%`TjfQsR~;wSjcsVJlglTV|WkFNMXvhAVQzz(%Y%$ayb7kt?Wy$W}ecPoKI{P zH~A_2^ipjBz2S3_XqQ+jVW!$N6<46G5p2uiEJLd4oPS1%RxH$k`ZrDUH<>5UD%umh zF@@{^NeZSH)D1H)X?l$v@p<#b*#ZH625_sW;Q?Zc#;s;+dEv_nX)~(Sq3GUAsNhOa z_}yk)57TGYcFe`M?A*9dkC48-|BdSwOL{qW@hcAAFi~vpl@!dkg@<7q9hNgB;k+mv z)2s5W!mV0vyKlaXf3e{NN5RXA;iQby&$ttG9ox@Kk1+O|}%>m_w*o%5KqiSngX zv`!^(^ODg(nVrAQnMF7zocJG zVsUjCO^(ud<5Vd0YpgUVzfF|BwF4p+^=0+2_Me9M2Y8ETnRCvQ-aqMjpE{C$?9|1u zB8-;w~IX|H@WB1jX(;>s!F^NDdoP;KjOR!}po{z5UYOoZk7x_gmZhDT5E z*bXOdXbimrdtzqvTXlgVMa-eCet9ou=m-Dm&)!@&DoIvp?^kMbQQv;$!_Q5}#YU1? z{LvEJlN$xsk>h<|R;iKnHL6!H4REQ%uat(o-Jp=N{h2O6f9Mr!F!d*}!jn*8am-Ez zaMs~OCchgQD-wfzjzsL-X6%UVts8Lm@C5j%G<1B%4#I8J+q%C(w6a0t{Mdy)`5 z>tc>nhzhq$TPCpAlpOoJd6}(z7fqiy0B~w}Rs%0i@uu{mGpqS!|~Rq#5P4@re|4Y`Qa^ zSLXLZ%$T(r=_UUr(D|plQBczS)|I2_BJP>w6fOMq$mtf9kfKnkd6T9DIxA*qzwAI# zTDg6ZGd;F$4bZ6e=jjSDHvL)P&=X7sJWHhY4GMrsCu+!tfZ6V4bk$#qciCM1@D;Qv z`YrI&R&E6(n6@Z>H}B--#Hp1eB>VRmF9l1OsUBNBY+Qku0RO*#J;3?6hw#aH($)0j zlS8VFQN;l!LD287yK})3=~*aGQ2a(-w8x z>ZKpbHBxKoViqAP(Km})qGYFK^1~=fF89nnLQE=EYtKu$FQ7K64bZ8|hoUl$`CoR9 zw`CU#2ZluNA*zq@K{A-@I_xa2;bMV5K?O+n85AU^2#G?Q8BVde#pT77gb7zswQ3t3 zW|(N=k{qw-FlfUUEG}{e7^jr{*I(U3i#)V?tFGM4EKpTM_R#iO}p}KW%C3a%oYh(u5 ziu$;n*jT?5MCd59SFv-{->CxjP=EF%2D*b$)m>W^oxxFV#6IkPD}hM8lCIG#Ec}2` zn6vAAqvH{q9?h)&LURfCjnxY6VgrEearM#r|BWXNLm*prCUzs~Q)s1$*pgR>S`Vl6 z+TC1q0~)RR;lv0Fs**I z7-@|#Qa{zIK$=$aKvwCebp#CLk{OOzJl$&^N(XFJoLR(FP5T$4O_IJ{Tw1fu)*}>A zdwOQqW}QErz!D1j+$I-8Bp-l`JF{SAEL#x$^q=%kr`HE!qVEsV685vU4-S#00JSG= zQ1rv6!kQ#5li$cg$X>h}=Z_B=29Jlv1|dCY3~vl(AQ#F`l<~XM;X21DccY6vq7hbN z`_Vh!t@4|05%82t48C0rwp&8MTYkD#WXao$mQpubMpt^DtHpZ3J3g zIuxAs&x)-zj)>)WwdND6klA`KajF_b5U0hrrgmf&Obj)ydi>9zt=aRjunnWi)Iw!&X5YGlJq#UP8eMDhij0qs z8VCnH9+rH5^`)(O8OSz0IZo-UxvHNaRQFPU* zNoG@6wSXS4JMTE}_BF~{-NFm^_Y+JVqI1K2ts?0vlw>}>+fykeZDOXq6lL}T<`fFI z!Hl^QtICp?7^pPTOh71quBv4qBY>H6)4~o>aj8v9vf}(q=KD-icVb!qeM=qW=}3kb z-*!C>ano(b5IOYSdy4|xKhH%^;z^YB{qM*bQx=}KZFyb|F2xhAHN81Clz;YxtoC|P zf{RCB1eXEjLqbLH%6$yzN&ncgJDFxKn%FJ9h|>2*ccBArZHm(DV7oWwH{GubUUN&? ztzFIb_F#fTJ_2vUv`nB9iFyF_>{FRZrPTVgUzrJT`dzxv*j<~lkE1~oo#(l3I98}^ z1f&=|AQ})RlGe72WylMuGPI`E$Xw8Q#eSvUn!jg~U1tiW(?@godsb>B#Pu;ys1k!7 z!&yn4*_QArIO?|JKV!4RIs|jJ18z=s;m#kAD*p7Bf||T!!`Z8GB*Ut^TmV3ICkA>K znhXJ}FFwu%(z=rKeK+56$m3w0%e?jWv-2}ysd(8ZwWfQ_Y-ON=l42yqnATMML|Ggq zY>1*?%xOTbAAUjX%Z2fDJknmsV5ixuWHkhB>gxuM0eHcosJsb}n>iM<*^|53Hk3^}>)eOgzNszFZ zo#^}jigbHx-lQs<>7K9oOCk81z3l^h^Ae3ol-Hdj6IK+M+}pcAD99Sz#QB<1^4<*# z2)HemLp8BCB}_HkzS!Tb$Smf2bdK*-b;q8+Y0;*6FiQ3cRErGH^}iU>2dO(z z2I!D{h-N*KzI30~u}fzUUi>5UZmj1jrNeqEd}Bb^kwqGv z3R7}VqHC-+S@&|>HXr?c8_s31l}5?!ArzldT>Z<<{{E&CEFModoGKJgc1Gd#&VOSJ zX-`+zk8qcc>u0-HLURSHaSBa4e+XMY>Z)3oPb zxAmLX`t2$x{cllWm|*z;ntyEco076!|wGAn!GQ zTAz6u+vZqGY3+c!MdKt+YMf(f{FuNajnbND;lI2H8JiPO_;p*kfc$ zJ&7^P#^<7KDodL?u)0Pb{l+h^@5+9MBu5DHu9;Xvoivo}7W(VlY6`-lzbK!PFuYYp~z`e_>I9F}gVHDu_v*ey_r-?0yQHjCs;;-k=XdaT&R z07=#SQTI~+%pbQAk6+l_dN)s$!n78gOdqvt--efB8nFCu$PT_>64%ao&x0NE2kq|E zrH5;L&S7cxl`?14lFRjOFgo_s>xH&VA%%(aOD`VxM#R%JENJ$;<-r#6yN)f2wNq+D z-x{abCAfz?yk62wSx@=vU#Kr&FiB$n&N3VQ&dXX7>$+VPF#iLp=-@JUSADgDxc8J} z97hRwwd=UriZs?pZjmUG1Go5}cl~&)@o{vmRyv<`w&b1ttR$Du{kDD;d0FoFMYH$F zI0UA7b9$5}Kirr1?Zk->{&!f%6*YmV5330vyx~w3v*l%x>vJ{wT1cJOfpy)Ka?rhO zt@sV%5GB#Vod`2qeDD?#8<*xLNnpT^#$m9ntK5X}4j{QI84*z2kM~36L`^;8{=tak z;CRy0_0JVVTU$!t_1M1h47pOlr4V5Gdg*{y!npq8o5!$BLPu!s4+H+2Ux7l1YUq50jB^_$CaR<68>MHgkfC<}6I}!6c@O^XEK|SY z<#;){jI?yrgji`smtmF*y;BXC^v7|awMJ5WDIB0J0L>M&^O276jb(a7zolB_-{$Mo z_CheJoWV|SzAr>D7c8#JHGFslL+1`1@k(1_-06*2`pAP5v`?Yv1TK{%%+RXQso-Xa zG-CQ>JyrCv51C`P;GGymzqxH4WRf^SS-XZwoJ*8D35*1;0mzlW41&w@I8P=?`(V-* zwMB4^Fg;wK#rhLq?Fjj#LbR5F@K*ul5O&wfe|)A8WVNqJj;lGoY3Vx>+PrhpnHTk` zjv~=U*L^?OWQ{H$DQfafHE{hN&Oaf*N=PAI`y@(%C0P3BepWfi~q;X9g36H{-{7}j!sYH z7SBt~sS$@+_=EebSTxShQxkTL_<@n8_V?^KUrf84xe|$WWJZ*q?u(Xp`(c)&%LD() zV*%W5-z2?Da7OldEflVyQWtCP!ye*9e|f^y9>m47Ln@o`dgothTrqJwao2Y^K9NDu z&BpdUT{eFnfM3BUL+{sCy3i+Ka5{2&z7}H&zM!aeKsi2(0B)Vx0N-Rj<2Q+~DKHAT zAG>B!e(^Q<7Lg2AJiCcaALs}xo~zRIsw5b8Hl|1x z#aiDwzo&SJ!dG!~s8QnsWH~BD*&;&xLm~Sf$KF$jQ`y^0=v6#(hMFkX=Fabzq9FX! zC-vZde!w4@5K&gkSrKnK&tBfR)L^vvqQ+S4&C1Q#N#*BlKx~%=S2Ro&9JLeh4~$JY zo%0&@AASjwKpLCX+pnzO8RyxxTR#1>|3~}w7Cp8F{6KM9#ZeE(2`uIg^g){B-73fh zeP3%nbKM;4LDLdYgCs2DVb)eR4JD)q4rZ@M%`v*Gx8eoJA?=U)K<-8PKKUt~{={bk zR{d-0aJIQ~anIzU1pVs8@|zcmvt?%8Thp|#)K5M~#j}|ix?PUDE-%b7r>T@jWXO!K zO7ntbArWGLa63qHumv5Fr{9d;15&MvxSuIiZ^x^TA1H^MEfeD>YY?J;-y=n)HX+wE zj@Vx?baE^j^Y}B@)JQ9Akaf#b%K$Acy&!vSn-iOu|+5kbt(S__X>F+LuUPz!5N85W91Dq=|o47Dp_ z2o#MgZ;Q(mn?9d9Fc*FZ{RXr9&L?)7)Q9iwG*Ij$G~H%&PZ3q3h)Ck%W*w=c@XdL) za6da-RrJOcTV6Ea)HnyPBAHJxu%=?J~fjzsjY-}W(!rR&UG#Nno zwHPPx6)U5yQXtP0WF173(4U{2 ztq^%nPj3H{Cr%w2E5h#Bz#}wQ3Unf4m8q1sR(;YUv|U)X;V39sXQ}^Hnij+xm3K{|C56pkK?-OBl7ma(h)SVTs8D=S zd7%NaMlOoC<9Q0RC(bp-+%K=YE`c2}$wFnGxDr=9Mj)S#JV$Ez7ED%6W)7>Mlam>L z_w+y%?<`Xkp>NV|-SnT*+_=v!h^0$CPpS-nhcEQAaOi891LKf}cLcYipWW|^cqMvN z{gqzhN=-!y+dJD3BpAmJajg*$KqH%Vq8ip03u)?-3162ITm4>{_Z?If^>~!L@AzsTmmmFQ8(vj*l}rs!eF+9b$zbDh0>pVP7{IYHwx zWK5foI`agVkbwh*5HKu~xGF1Dt9eqpP#8RMNaZWoGW^-nJ|8PKU+Q7uMLQ#7SP%s| z6VrhdGIGn&)A8GcWq(%u>ymc%Dm{Om#184EEJtay)dNzu!HaYCzM|$}rB!m(BCv@@+~-O_TJ# zJ{f@>kj7^~Dl)U*c7&BCcRinAKP)zf zeq>*eqhDjXWg8eX&WUs=yWIUyV6IB0Mh*VdEGQtfd4NH)^BH3WSWcJVrB@+1hhoX& zcUoRnOAa}ok0S$~Fa{0!nj4oP1{Z$tj!DeBP*uYnGm_|sPsr`wYwD8^>7U9+$MR-hNttX?gUTN>VX{mtSBq;mMkvr156uRD(X@Zu zz%Epd>_>@;>hmRj!%B;6$@H%6gclQVr-}GFjmBKCWPfJX+nmMFeNPRE^khHqEqvbf z4!&0LN_O&W(|qoGMmB`TNT78u);{hcAl7CMF;8WXenX5EdO-bw=@%2fgWol^qx_I` zcrWOop(VU5FTzV%c<)u=Wwq3lqPThImk?v|2@gmPMyeyKbu_Lh77MZ^FbNPwdQC;P zO~e@X4(r_D1FHt%wE0Ws+n}_Ex!)k%6rhY7v2q46T~c9oQ|HfqWOdW z@*lEYE4FE?oeuYE9m0dd8z z1HUUUt37}tcH5jw0k6fAiXgj79>ni#+Nl)rNrO9sU%O`H4%1qXtucQCX5`Knz5XuH z82d{`90c?TYUo{CKRmKsm^eR~USi44Dtp{8V5(@D&3WW(+3_hj8jHG6LaWgn$Z4^N zpnf}e^d^$u^VQNQS!s~bam~y;fDwp-m-BCZmHK};S6REPJhWPeX1j~h-IwB zskDo#Uzfu|wbkg6WO<%@-FuNsKg2FADmvn_`TnoeNFE7?&}n~RX~y8$MnV9`?m8?? zY%%*9^hONj&rHMLdJ^z9~P1H|FMW% zR5^!-6*%WrT}-dDko9KjbGwC zoy-8uA^>xFl$CqAc7cF)0U>+1F8Dkw-{0N#{%6V%DW<)PSDT;GbG^YCD?^{nk{!4Y zr|m7qfz7hd48JXPRC_fvFKV|^6erjL z`HSzg*k6AB!&iQjWL)<*(?%`32hWLV4X$#?8cgieBlgE(sR=q;S!Q!03Dl$0-@+kC zuSUs1KeWr*VqGCyq^h7sYLI--8YwD6BwVfMUD>9tJEJv=!a~%5??~f|$j5&ObefSD zo~ytN%U_$8GZx-k|5bWI!MfvEj5na0_*2xre0VUF6Lc3qT5l(P5plYX<9`%_>C|A~ zq-nEG+orb~<$;*VWw75~j=Eq{v#zo`JS#@ZKzP->Ja*4yk7pIXMmI>oSa?1cQ_MhB zI^k3<1Jp(BlKHJOELaAsI!cFg`bK**hF;w7>$ZD){oG&uZcbIVUNhaRMszpahmDmx zU7v}CPU_`#ST?Kj!=8)l$tkLb$K|*#0R($(wbZrksl; z`nv8Y=$>`wGC`)lyVU2x&}i1F)5|{T?$8}JSgcny13}fQJ*tLxy-;AUoehXq&Fb0M zzQ4b7|1McNc+kH|fy?XETDoM4e>xrW9OQ4x#q`ObX`gemm;Z^^x!q!Ltn@AOmvWf< zoM47SXyVMmJ}I}ba-7>ywe~Ni*uS{ip9yj;FsGw!BEUSo04vbC=Qm%r#Z|E^SDyXC z)_-jAr^qL|5|d&yf}G~kTc`c++NZpMGm%tKbYwCLR0=cv-)2Up$cGej_#Nl{Xc?$= zxjUSsmUdIoifsqp63ab&Vq9=3-XHRqkdKgf_h7VZ*wWgbgHRKkk{h;Qbj|x_jFty> zmG?##?OzI`V{Q8MdyTaU+zD7;(>jb~Vg7sqUzf64Yao+P&?@XVOZXys*rGq4FI^}% zQ#pG?eyV!EmSEJ!(bDHEbohIJCH3yl`#|P>zaMN}o2Dj|k!!gXDBn^*ynx}JA9DCx zR4-_|LgI@@zv+B#Sq>tQ$1T?Lcck$Kic?cW{(wb^xkHV=KKwUL$hmrCTsF8+>wzR_ zD{%W<230(;F(heB{jGJTlP;K}B|e4if+DHW?asPfugf^iwl5p7-95HT5&_Fv8 z?us-Bxi)B-4o=Nza0$6=hsE*4DDm8jv_WHAsXeuF3c;XIPE`5s2LfaR3|Nev8)P3S zw@?DO`y-Q67;k9!K?cV_WvGrR zA4N%z!Ry43cmW8_cgZH6=a#PMRZX{up2C@Zf%AtH57kyRLLGdYFSKS6H2eS!Eg-BO zh~B!_asrvMU7PPJ&nAlv_Sknps$b;CZMTJXJ}yJAZDdiFtWb@M#iK^P_zVBj*8wFl z`tviWq#pwUe%e>5N8EBVv<4Or%llqpgmmi=?5eaFGWlm??j{hy0(VhM+j^46EFgmy zSvbaqFqhTzE<=(-I)gJ8|E6q*>!4XCk7=XdbK3Bs=6SctAs?YzS<}g6kGB5+?Ng;d$QFgC&_*kqnjDoJp01j9ADC9x1aKRn0wiJBI8V z0Ni@hQe-r;3=_>a&sZf9hry>Ldca-owH=;&`#3K?5sK^Gh5Tm+XFCa{aXF;XNWGXx z|7FyqdHFDQUbb~Xv=2oZS{2vV=U5EbK2Rq~v)8xc^`gj*-VqU=n+{Lza^LtVcO7;Md^Y1CRF74jtp5@XF@1MA}cZXb|b8ahU| z5<#0AX57p9vFK-P%XP|}-Ulm&TO95*&o%?PT zv`Yu7n|d2cD;>(U?i?jNk}${VlTmA0AQE&BlS%u%hu$iSmV&j(V~f!BN)^?i)^&3t z_(qY8L0!4vQf@Oochd{X>4>SqmlINpDQp-aWi^&=v+9cIXZl^A+kd05N#g;O$e?W` zoEbc}>sqngWu-?C{tjPyuvOEr!3jV7)6tcM>Ave1L6C5Rs!dCri2JmbF!X;V!fJO8 z+_rMD?qIx*==L+BSi?XwIh&gmjQQ*ft~hwKT{S|_deC@vQAUgcTjt7F)Zox3ET&yaqC^W=qdbWI?Nj*MmE%W)e36)CSmPPa-B zusxH82oq82w`fM+#>}~E1T!RB(FrcU)|BQ)Y{QyRkp~Z{n)vVa0qiW&&9>Az&M!)R z-zxR;8u_Tq^kM!{X~_(ZlQIVVYCCoX1hms=4fV0KR|E^QptN^ag?~_|oo=4fX^A{* z@zz&?x}SVX(eF;#f7gGoHQH=r(iW+JpO7K7j(oN!5A`hDUKkWof2WsGcelOU4ZAm( z*tlrhIk@0VyDQ5@L!9TLxGKJ39^;q0{4tT*G>CWH%sCjy`T<|v@kxNBoRcv?l{46) z2N`)$a}dah@rlg03cjgj0z-y7h1ffl1k{@2270Wa1MH4ZU9lNaH~w>L1)xUObd#Q= z@2+$yCX0^qWs^Jt0Me2d{km1T0Vj|5)e*_>nx{1M?@VQ~VFK0@*qB*T>|5qxcCD@X zv%^hrqr>!CEwe|*b1fb#M7dIDbtS3~mybV~>my=XKkw-Lt>1-&UV|no|Gn$ON)j>y z*YutXvUH#Vg?~iOYNcLDEw@f&*FjzNpX)wbLuWh!GiqMfQVjEcp7O<%BO@ck{9}b| zVE^4sp=C&7(or~GR=Ck>)#9i9aJ(mD5_?tbPl9A+o*+rVM-g4f&@4dR=4`uhCKCZi zB?-Ts#=s@u2u!~a`n$l^V&`e0Cb9Oi^tQJO7sf?ky-p|4l!BrZsEx+Dcne+3)iX9X zWu~aL5z|R;ezr{d`6A71`2zarWZ(YH{&vv@pQ%U0&~PduBqjRS*DIjN$2HI3R$ACK-Q8BZ^xE;yxjA0+KHU}9JVBiM1{JVAGy-{BPa4GKYAX%WuPzBfD4U4N_JD!JQUI>e zz4cjeh{>LoUu8;Vm$vJNu+&?kV+(*Ih^M%A4dti3d^tn=TOJQATL+)8lYr7xmgphD ze4$~#0tvfmJSoLscXzVu`vC#XREK`=B6!Kg(zDa^IyKeHF_M$vTMps+V?W#5^USGX z+WlFpdE?WI8>!|z$x@4^<{4nfFOOmwUQ~PPr|v1Yui?v`p@cx9w;z`9gK*|q6$voZ zu~q;+G~6LDP42(VVjt7da>|Y^EE;CJqHCUSiTeChxuQIGp|8H;;y#fi@MVVzCL<~l zQY+SpT$+n#AAX28ac+1qe>)TdN{e84xXZ1n()c=k< z4(WA;q6=&u^peyZaAy&llgoaM&wsfq_4~V$N}l)3{!ZKfyup_uLnRLT;!6UzQ93BnBo_0#Q1B#(L7>@~(%iAj}X`xlh`4b?U8{D@cD8Rn@* zvzO$AiH7-~KKMUJ1?hkU7Rkn)-Nsjf0>)Bb1+Zm6fdw zreLms22+&#P=ma69g8aVN1 zPk@72`ymyLub&*ID&Q#&>`^!b+Q(91-)<<t!j`b;2k+)G1M=9QR~38NZc(dMZrdA+a^%g3zO*N&!Ba`w zOV6}-_p49q$y8}6#~6079Rmk)g>eBHNS4+2Y2is2FWT&XcOEXto93!^>V zcZIOwyMr4&_W89QnoKTmqXyD2t;3m?M-t_`EG2} z+|uHKji&CY2wJ{sR^?K$KU!d@1uZOt4jfrCIP)zn;YWPO)X7o!!gyg z8lxW=B`Wjki{F58OBCZkWiT3wKX$7g!kqi!NqKf7;f-H-T^>$FFnH%8UF=eAzpE9i z{6jLuq%BgS^Uo-W@C%$9Pk~G(nd0H3GfpVBt=y}1=-orvT{DmO2I1p9*t?0k#OOdr z);GBlxSx~u`PlV(Yv642oY#uqeR3=lF(vV(OoC#{DP3&L*^W=Dw(j)vHgwC+-zjrH zRPDJp(T+sGq6@L*gTiR$=`WqveR635EZKu|`tEnp&pb}!6s+DZ#?=yii8io_q<65b z{oL>?73tZ!;KADe2M@j@YXfuj9$<2{HVPm~H`rc%Ek5P&IX6}WMhG9?Mk^|!Mbv*xHaG#9wk>Z}L zdb^N%NrCsJS$$)#d5^ifnH3(#+A-NGnx^oD55K!6T|J-&+GzZ-2ut z=YO9HvAqA_(~^@6S^9HnkNMOFkw95d%b%}*IFs7&uLPGmP&sOhunn) zKKqcYC4&En9{=Ahp#A2MS=~}1c6*$4PRiztb4TRL$HsKrdg-Zh#y0`qb)V_24em4p zx^TO#Ji;rcqWwb9CugW_NPkxKLc<6H4f=XsfoTJI(1CvUEShgM#a^FY z4MR*AYR){VmWlOeQA1AW;uQsImJ9a#*a1`bsgsRRJ~|i&QCsjw)?T}|qp4OQ=c}oH z?&5=5j%7QRuZVLY22w}v*A2IJhtDsaAL6Z?L)=VsFM;nkn?`N`gl zkscujvWCG`d#B8g4tD z@Ee=Px)fAo2pf7>`1|JoC369CuaHV;XhN-$8*MD|Y2~n5yrg7>rRR5?``VD+uo-S< zKwyWHsZk^@V^VCJ9ehvlZ>Iorf;M@PiEk=DhUbzw+{ca%wc2;2&gdzuX>0+JLwFND zEp>=NuiW#}pN;ib%9?4Ll@dcz?1^^yYKO2hUpa&EL*_hRXA9!~Q~u?4(mdNRf$oa7 z&dpu~0A`BaR%0VgE*oZ0(&L@!1vlsyxt&K-<{S*`lxUS<(Np%~EAjoA8jFs!rg#7C z1VeN`XN>2E+c*}+Gny=kQ1(qCM?!{{AVoCig$gzuTDrN!+$owl6jo)S-%VtmVjs9! z;Y)9x$pS@nL}yjU3s-JW1To|SbbBqjV>+)&p1-WK)>7=yI)|N=ek7rG6anu`oT56Q zMF6szVeG=Ve*d-l#vkV7-%^_8C2zGgMT@%?rE+u`I79b{^HgmdA8_9Oq*#hoeHkj@ z(R58(@c)Q<%dn{4uWfh_-60(Uf`A~6bc(2SNU3xP(%msb3kXP;G>Cw74Ba7(Gz^X8 z(48~y`1`;2@ywU`I&Q*%j`tRp z;`r^0UX#|S;eO(DxSh^*zK7*7O|skT)~X=QBa9d zZ=B2p9rs>WJWt;lK3ZbtJnh8{n3ehS=d|ckH)TbYl7K;>j2@hI9mW~7av z4R?+0Z9H?)MJ*-0#NsTJdq1=yp1&A`xVX$A`BD};m?>| z^83q9w|Y~umbvT$u9I}K$s0n3EcKp;`P;UD#)G+U-(7f_+)5^}9{v5FDp9WDk|%#= zwrE$p_r2JRbaoOM@v@|VL)NX3+EF0iG`msXDk*elY1zYmKa{%#Hu#2g=YCCs+H9Qg zY;B^`a&S+^psEzJucXlp?Zy{g7TRHyqpcD*5j{o@GKq@F2gj^tYJkK z^uCu^3{8eN*&dxQ>I>!dUMOZw;Xr2LvXyGgsOW(BK{`tczt$(|y@OayY& zU*^pJ!>gka3$O=WFl*_TPepBGP^6)4;ppRl3156INWtl}XcO`ab=z_+NlDGwAzLcdktI@!joy3gL)kM&Rpu@9ggV3UF2P3lj9D zV-}`V0oTsu<|Rq)GKcv0HP)}5H;;tf_*(wW!`!Hjb1N>>`)KT*^wj#@ZaiD@SLauI zT9KF$jQMh(OOj5s_XCrKs!l`$lJ8%Gv8}KEK#txR4d({XXGej2iEr&#O}bDvZi#pWKznvQLgY$AOkbC6JP_!>54IQguLu z%nlg~wbYyA{DY9)Gh0gE)kq1d&j=tHwa=*MdS$~{gBNAwyR>xR@6566>d$>TDUh=0bY zE#14tMz;#Oj_|adYcw2&*Ao+>O`UKtLw<{xt*cX=(dN82-X#FJHR6$MDSD3*e$Gb5 zZkITjcGeZNS-z&2?CFkVM@*2e{(wf;PaURwsUTYyr>iYfWX*Oh81Sd`jNL+1s=&}ZpPv^uF7M+BcZFfw>^{&#{p zUwFL+dqv(e4?#q# z(u`?A8M+;emK-Vn*3iizfy?@_d;BZ+6Tg9@#+vwsdG-RI0ho)Wqu_$0f3E}d$WU;| z?R{a(d>-Z(@!)~tH>=IepUWp{zJcl?AU+5nZ6h`9>1)e}fADipsRR|``J$+Jx(r&@ z*&Th-kJy_#@bVj>tPF{!lC9L~jClxV0)XF{&Z7vsb#tqCjihx2BYJ&EJK+0e znQ*mLwZ^b8wgV5?&(Prc|{4J{~`o2j`N`a#E-4VN0y=0 zP#bY0zsw~mKM}{&@SuFkuX-O4n4%aYSi#>Y3;yXY{;mi_TRm8v!=v=U|dq^o>jaww^Sf2Hnm^ z$ufMp1EUT9m>7CD159y%KDPNZe@tZRim6D`uACOSq#Fj`)l+7=cF|v#NO7{Z-J1Kl zLNnV(udH;w+)&(rqh=n}pco$(9LoacWpEK%^7$(Ml%kAUIabao7^fUtI)6i-sjMir zEF_pf`eQ5Smy7$?jI!Y zT^F#cn6HQ3FCcjxaD5_TTpxS&B8r|oAiBdcHQBafi5rQ`|5C=}v62dx>!G09nMnI! z{kL?Dt&ID3ck)O6$%4d!4!h5w-%?2~fwfNp%&IcIwT55v_zm0DHSUd#25Gx2w7()2J}p()`NFX?=Cz~u|5F;*G+Ksx$=vu z3{gXe>EfE8fcbxG6g!LMBs$UN^O)zb{PqFwos#~MxrRajX7eHgNsrX zN|I6`JbJD3Wt(Z8s~QcLXDJg3tX{R#HJJ$Fc#j#s*gZe25x~({+YQ9{8Gu;&CYjJ+ zj7ARoVMO;B&x+;29Gfsnsyj_x<?^4#0fF>J zFL-gQj0}q~k7d_$a8v9{JM^Il!Pda+dEq}rW<1>mj=V`-tN}0(`TgQcG>$f;%V@IU zqp)g^UU-py$4jnM136tPg)*(UJF~F_4nc{6fO5b*8Tp*GnQpFhy`}+&1AJI*n>}5> z)n@B$OF`xSXYR1QDa(!0@8aVN=3UKR6EiHUx2z=j-g!U5K;aD5e1ItW{~;edD4h@L z^Dm+^5B0r3i&jmxvb4Ouy0$evwYV@dJvueFwse@4-s+OQNml}Xv*<#t1TDICU@+xL zbN-tnSgswY)(Q>N#~X*R=ceeoqe#8y;i!&N;j)Ma4#yvxpyi4UC>VXUF9n{ncKd`+ zZm*xPo`S{rfobKP2Po5x?+fqqQ{YpNXFENH%JJq(IRt_un0mT#^%%{LKbOb+YFfum z=P8Ld$Ct?qQ_9ac4xEBbJMZw;b6JPX!+ti!aQ8@%>YdY{Y24p^op4hYJY}WP-mCj9 zGnrC1!0Rtw-;AH+F-dO0l1dGiD`{+Jx6BW>O>^Q->MD+VpbYC2?Lg;8*`hWrl~rs# zulxQ~l;^TEas0rc6-Eb@^ZiK3S6&pfd6tX;@dL&fleA1jCt7Nt z`iea|9XOe8mmmb8uNqQt_;u=gZnM<(~_& zJsuegzyD0-efBVp!paUDC_OWRN-pPW-GWJ&od>E*0#g~{sA&*hY0JfE_8^yva@rUQ zJZutCKzgASi*fU4Pn<%ZJJDhG*wtr;1Vz&(yD;t=4l~ zo=VsQ+a9kV--w^n;;aX@htuE)MYVGt7f`h$LZ7+m`)WH*{efp=olOu$ekzsitt>s0 z>LsKoxw|UcXAk=z8JwxG?~z#R2!8-G&iS|R>X3$=BF!Fiz<$DmbJk z>=anW^ca!J8DkB=H+~?;XkqCi<0fp{C&AwTpV?NykVT^MAe6hrTZd2#8Z47KvH zIURwx&Z9r%5C5vrgE~rQ8_%gUVcP1S?7dhut>%j`E#j-RufuzB8&E?%$e{{vJL};<3gGcm? zN@yf(3NAF+h2OIW{?16AO9&KLRns@-9Yzswqjv-X%LAF+N0*sqQmQWJuPK-lC9sVr zOD!K4IK$!aNQWvTvAShPllOMPYS!p+*QkXQ04T4hEsb0QTP7EMcc=?dSXgh^mH+m% zeI?pzb|pd(jKg&%^R>GI1f^0>R2CU~I%|+os1yZ7PQRAbs3%(I#9JHJEe=o-Jh1xb5F0+66EI5g+i$lKoh^k- z_ry$%ys)f(#IGxxt!50|&;T=xTX&WOKuDJYm0NKp1XGxr(P5$`igv@MkkrCLlXF0Wm^?4vhmi=DHOOFmg{t| zd9Wd)DMQrM=QHk>Ck+>;P0-ZIc-#>*ZTm$BJ5CAkSe}Jd*CS%X5>Qcydj(0)w(;+A zl`(*~!32*@XygE_5aAkVf=*%&=)HjU276Jki+0J?mZ@xzUV z`psWFxGi^;w$HdMpCmK=#w_u2N&dg<+OudFN*+ zK^b4)ya(ue7h1hjcMffVV!?k2d$OlU@2fj_uP#59j|;Ad@#A{5NIal}yaVV-KcTy< zcpBdKSJdN(kNfe#2rEg2CZw1+peYsGNktqId(PXad3uNy{pp3Mi4aDyMzl}%h{so>Azq}ndFhoxdA zXY63@EuF< zSwgyFQ>@Pcofjg5y18b-D@Hkg+aC`(SiVZmw#X=FV$Fwd??eAuR3$c*#FMM}Hyt(} zm%34z+k8Y6BlpuEBIsm?t?7h`*-Y-|UqF6av!Is+qVhKJ<@7VyF?9rI=FEl7<6l4D6q0KCxN>m{GWHNNsU;W6!fh9Z5U|V*lNAN<`t3l z?*s@(3)Z+n5CCza0>UmRn1C-!Um6g+G00RRlq-s8O{N>`Wn0dCfcD{oBbulf+M{QT zL}#&Y=vbLLlCx@WttIc~lf{_3{&28~eBh50EygdLsQPBWd7GeMnk7q}LXwOU902;AkrsXyC+5Jj1$UcC2br|*x4~{O4 z_I%h!W?U&kJoMnDlI7)@PxU`gZ%orCIt}7ilJe|m>sUX!`zK>DsXf!ojx&Uf5~wl> z!!}n$Lpt-}V?`9Ofq1PnV^J9N+9tmhZ!A{5^NlgzY^BVy;jh0S{x zkJIyR^uOLK+y}Y^G0oKgOZ*H4paCgY^?Nwx7|X5^9d5D@zY_fNDtk|IjsWc&k~jxF z+uc_?`Sh}Qodbd&;Ae?1vDK!$Os{#)4zA*MKRq;Tw>I2lZGJZATLli`am?dgnkQQu z`H9jDTe`d3Anfi5K zP8c6&Telh7K1zk>%{pS(_u849I~RE*8EY|8eV|iP!fIB<%`i^z`B9Y*()MyOA-qNp zoS{`f$G`~-`?uYY+8;a3+&lRme{dL&R|E@14yIYQM(ylQVa+B{*ioP*cjnk|l3xB# z>x|fSe3vaaWS4o&L+6k1Y1a2>%ZN9HA$_*PeOFp%u@R(FefS)g%YH8#B$n`G5$&8) zyujSH7Awd^49^G`GPJ#-ZV%eTswWJBv(6cYSXEtDXxgtPNaJ!CdbwfQl?!u9cT`>P zQjCr?j7ml`NptVovE6)lM^HQFtKRJBdoSeddfy1a>t*1W21Nd7(KFxRhVTOP_R}=0 zvM9*mwsnqi6WRlps_aeE!#Nn8QEzPW`Ob{muQ%X*==3OAL8Dhvr?xYIyhO#P%1HiG z&9KEXMha>lV`z;=<+UNX<7t-Pz_*y8zDjhhqWL9UKP!CVTEm_>Uq`lPl`~ z?6;~X*UYD
#rE+LaL#waNt>)Hd&R@ne5( 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

  • Yl+jqS8Rb?=1{u82=O}>H=9OLPoGt>x9!nrq>6wcO2&5362rw1V|9X`IGm+$q$cL(mnz6xYGlj17Du4JDHFjfGzXujDjvi zGuAgR!a%aPDrfj0ics_}l{!9SbK%-!}Te|%8wy6UOY^bI0N zZu`6?ZxW{QoBSJpoPM!mt!Q#LGsKfgC+qH)Ug)rwpiI0BW~VuTgm$>iHh)atJ~!Dn zCD&j_>dvRReA7&PlhN}MW@&iZgia^QOb|vcS3MC#fE*KOc;I}@j!Sss2AXj@r3sC$vn;o)CW6I95F*XHsxn$gfO`8q@@AC&dVg6nVbL=$NssLg#P z#dQ1b%j5cOn+x5GJ=BxR7w&eAk1!^5X|G=vUl-1IzOkCCvGD){N<}xqhn1XKJ}(L` z*$0r7KJJcJ+8Ri-eKjyFCmfMdj5;^#`?xvk?TE(no%PvN@dEG4AH*;85`&l}}t~qb--oHcmboSI$vaFTEfoC_{FQ zzx7x~x;z03epK7_B5gy9%nSWFYMhOzqf2ikJQ07b`y)Cwugu(Ub{Ec8B`6;x(8Hp< zT4Ez2jE(k=W@cK*=X1E&`djsRUR8$+M*qTz%YkL=`f%dfB z4)fH)+iRGcHTi*3N!W*MJOL}iKPgRLx5WQv6SW<0cj6XLnynSx z@3peaI~GsI;=VkZ?%th-(Vx;L^eLObz|U)EWq#wZJ3mxI9T*J$I%LjT!{HDgh zO(v4$#Ey0~I%LTux8q?R3!-P!s&|je=1i-%<|tqMflpcA>h89?Gf2-%Gn-z^=(5IS z4$>%NWu`b4OY^RTFdA5FO5KlAj}5>a{I6VK@jtns5xI|&F;&eF9b6+jC@zoB_fOCF z?{*IlFHdP(+H6dw_mIRT`=2@ib+mr7ldk2VSZ5=)&>^843{EC$6?W{dWbB&ef9H1s z(YrRvfz^@uGEZ`A_mz2}ihvD+{j<9Ls-S8>I9Vd~ss<$5ShJTFYg%{xuq*(yb30XG zH^^bsz3XodncPklOm943pbuFFJ_-V_rA(W=H$;0EJvKHbc8*PoN3K1FXxQAS9>j}4 zdyb^s-eRPF>{msUpM&FfIBU3$8sW9`SzhSS_m4YmD};;bQ#-*REP*AP4vP;ws`v}= zGHAJgOJY*ZT3XHXWxWoYvVF&2t|YOvGHBHQT8M+t6L-BDKoLN$dgPF78a0Y(qm+YU z4P9yAjmCE!2K1OM_kUuMo{#@6iL~`YJFVlw!9()-H&b$o&Xe$i-JXE`zn>F>hWCB1 z|MvSnu~WNTc|HG9-_v#%CR`LdZ3$r+K%ZA^A@)_2!YGDZzu)mU39A3>v1P3H*>7UL zXx?b$r+}Do(fn4{0G-jvGBVgPD|wMw;0$`}6FsXUt^KHPKm7cnM41w7NHWVtbCRv2 z!d%h+M=y0(eRvO9K6<6Qov80jlel#Xz+}fUC?(fje<1~5& z-cF)aJ3bY9$f6H>I!x9qE2ufP&G@)py!!lpH3v=D){KH&|1AM+4T zT>;%b9oBe%P{zDp%TfH4ej3Ln;a!nedIyky;w~MxM>njHCHr@SvB?MhO_+0aVEowE zeiz`3_lA0Qo!_|%d~PQ>Rn$#rPaua4qKE&R@^Thycip?WgR`ZXmHC~o7+TgIn$^NX z$e<;h-C#-#OZL+O8$jHi9(yP?o|Vg&((O$H_aRVb9&>Rz?%;8V$VbL>9k(&lyU%M* zLdlS^lW!-ZM@wxDPwsvUQlNc#7aL810j_R`O*S0wTp!;nl?P?~PwwVsVM^KE=`hom zwH+U4z(1E1OAtOhZGyn1@dc7`o-6D<&C1I4 z*`fW+Z7fGy=93I&aHg?4U7C)~;#jqA#HT)~L0h+UfoFLfKY$;kBai2ts%U$N!kB&I zbDw(X0f1BTrJKrwiDand{kpZ)y}#T=>G;Ck-0>_uDA;+bp!4-eo}x}-GO}LZa9!Qb zW&>s<#Aw!*XM;W7LBMJhEIF;q-I6W6NSZ5P>^l?=l^Ej@_o)YEn>?ym* z`-Pcww~cLA72j5fcA>+eULs?|+K|~}d&TMOJf;1$18IG9`0jtyUJvNw&opQPa7gvl zjkEMcGas5W#(H-GS5PdE8vA*7k#ZQ<0wUZT5DM>v!W}O??Y-W>A-_C@c=EaX8~Q$l z*t&%51od>^7Z(@HI;Ycek2@W%3G8;)w2|oxd{mM>?!BnNCcQkmHP-cxbX|e$YE)JQ zOgn%yBm^hy@dAYdiPEVagc`r8Hv3ogcoOdZYy`V<+sPlfo+$m!Slngn#AgWhd!|V? z5)2Rc!2GmQ6jIjuy3M$37;&QCF{NM2CkI>Ff0!4@`o&RZ*B_v6^|ZD&vCboC!!!QG z85a=uKK*Yv8fd(T)fgqxYD3oxK}{1N{))W5)%jdE9cJrp zYdo_v!4`V;FXJuac^~|JKV)a7|K_;OWyHvD@-oQs(Z}a;c4wzVoWZmmmTmmSMB-@6 zzL-k2){bp=W+3Z>>>y=7W2e{md%b*Z*JSTG9DSJKW8;eXe3SB=!wig1xA7Nn8du-q zjOuPXPJgxjdrQnzI_6lbx~EsNwvJ8u9x`9)c$*p(1)8Hn%+bJ~nxhO0Z~C58K<_8} zsK&Ewwpy>``N7gt2`md6115DzYA$U%!BWYGTki)g){ zHRgo@aSZEtPBrs+`;j0YOwUVKc?wI25_b;~W*08eEwZ3CbV-$=aKol!M~acQ^=b5S zZTpg{WaaEl;7_pcPeG+W2=%s=GzhtL9+R`TDvRnb6Orh_saiKu7MqKujC`LzNxqHi zuMe_H>zJjjO-jmq7}7_)T22qyNBLc{{K_6jr;&RV|CU&CiFQt+U2;$!<>kcD?Lt1? zd*iClYjGAASXHP!Re8`gCz{w`&Wn*#&o&kWdqBtc!7rEiWi|bW%oFc`x=UsAs|7Yr zkz}PZM#oxAN4N|YB`?PVsEiI}lnVeN^k`3|ZB}`TBd>**JIiilr7j}skUeKVvW3T- zwtEx|PXs|MI=V^d5C5#(Kd7b=pkZBK@RDp!0|#VBSP^lMFj_AhH=7Q>o9*)qj&K~< zxwR4W7sjy`rh>1oh~p&y)~bPY?fJ#TEg8RoQ~>9iwOK2@tlKT5 zi;6k0#w>e44}Uxm{o2Asce)8`<>MROtf*5`V$5X)IqBC{q#^S;9s1$NG)uHQ&2m%{h6<#aK!Rj;I7zwHG1*Br7IoM;s6 zZ(fNt)3WtM53HQ5!4l>55o6Pjng@{J{VEqeI;o-;U?;kjxQA{;_jAg8GvOsWf^4YA zj)Ommk@V2UPe<~sr{D!pX+V`=WWFRz8=`Wm!~R3*(M{Rz_}2WjxmL3Ao|d^vd0QQB z=_2+Ev1u|AlE*Qiy0(jlrxPrVh1-9US$T}hN&8^cd!aI2=~!XHdC1hrF0YhuM1Zqf zQ_vZbeAnpn)ZvMfai%`?{I@k)ZfMeHSESD<$of=Ivo0qdh@sb@?pZZ3X1|5AUwpsy z?t$@j{`QM#R2?}|xg`2TIC4S(kW3VeS!)+=IEayZ;FaqlIQ{Js^Z0ntG+qeZZPkmm zy=jk9j}hus_J@0UEq4EGxI6|fp9BW6xJ-%SCvLmJhbnFC3K!BAPUexmi{`X!)0NxD z3?tkbPsc;?f!6DS`(_<4p-VQ%tH8kQ19X!dwe{-y$X+dCvMut69&$Mg3#tY#&dZ_+lf_SIg-DKghWF-uNs}QAm@o z{xb@;D^g(!!tlY>syqJC(g(8AYgFISgu1GASD?1MYEOsx({1LBlgME+65UE;BR8pq zk!3EtM>wD2)z7*-+HJbvRSUly{1(x()4M&@wvfcNrzt4(@7lTo3 z$Ij021T*7IKeyVq_@%^SSDxZ;%i6WMF`XLA7Y~sSJgZ|6Y0>Y@bzF_``u2V@$IB9) z6R(q^a*w)QFMg_f1Cx9GwI!3u`8k_v4QOru_q-!v`#lOAQYDX6 z6MOH3b1y@>VxdlVYx(Ha>MSx2=S)WNcRkjfD9Cjh_;5D21h3=#abA0DJGDPfpgLQh zprS>1M#2Aj04ol(K2yqQMRK4&EaQjs0zzr~q1R93`PKpM*yXAHt7T6&!lf_ZLe$nn z-xTjFJt~69XH1Ov>mzLuv7g%SKT|MXbX}Jz#A2l{CJguR9B~-&q zMnYah23Ss_aECd%m%+7}%h?DRISe-cQk|HfD2dj5e)BsLsU}h1c4t6mXEZPZ+!K?% zq;zd#;M66IJnqCKp|zevmL${XOmiWB_RZjoUP9c*L{n6(Ht7C=1srfZ^P`E|E*5V$A$tTfy{@dSJ%;B%et(9Bc(Fhtp!me=7cYiL zJ;)nvQ(S&5eYIdaJ(qJMg@?Hv7N@rqMUMZw72UKg!{6L_MRe_4qvF~Ie$B{aBIB*< zsI73ya5)l8E)~ilFKKyarzssBdASa9ty!1mHyylc$!LI|n$9Bxq}($Ud4;R7T){_v(xS|GA^ z13=p()jhiA`%#~>KRFk5RYg~qVc{*`)juI_T}ny?c)t?p+Dn3O25l~y4;|%^t{^cA ztdM!XEe;o`n5Jqn!T^mgYkz9Qbu_ku*n=L-Y-%j|gm2R>t1R-1v51dYGt&_enk$=^ z)>#jnea5#&bZu{%ofl`V3chkpv|3k+TafdPkQ#ZJnyWOAzA~LLrUs6>J2~oP)BOGt z-&`4@kbccpDAhHb%dYBNrn$Km_{~L;mAQ?&vZ0SqTjn$y2b?OgbX4C6f_*UN5OgB1 zF(7N8H2N}8jFtl+;QhDcC71WFcdV#&H#`Hh^9(jdBdGqWUIRC__HTxzM07N8XXzu% z)c->j;)hUdM~V#;?k{{4+sQe$S$=mM7PBO+Dx6n6OK9G+&*Y1c{@VY z0d{i7`KmZ)vfe)WYZ`O@-i1SRu`xPHMJwHsSnaZ&%EP%70lvO=d>bX@e2z$Z)gT_+ z{Wox$waU)+c}pV0#szB+;h={cT7c>h=8DEptp(S(#Z z3hox0h_-eQ&rYGcrw6CI*L#Q1)uXdjq894|Gk{ci9?MUj!gcmSxZ3Ex#mM z_>}5<2wkrU11=4;Mvn<4L1r8Qr`dnc#_N7`EJu5MJWev@C~NsVnF`mGUoC1{NHz&^!u_c@nf@ACYck54m7 z#A{HSAnCeQ0SPHxt&z($xM0=W`?eb)&MU1Oe=&Mna*PrgOf(SyC2e-lxeM;IE$5~_ zEqdLDby@@S(Jw&3{oQGYBBku`9qmS6U1CR~N#wteD$_pqUL{2y5nxTTO7$=^uojYk z-Rvs1UCVdp0&;vlv)bY35C@J9o)UeX-uLzGuV380-yC-L#W^;(+=56iV;BMvw|K_H({xyhv%~(${RxqVL%6|QtRbc#2qG?-67!DS zWLz4Xbfp$i08sy%tJ~7{Q91k7HRUcLwad$@WBdBh0uJBxn$(?ZV0ektu~DCWsT?sg z*AB;F^S?TL6`wZh(=L_Z({U*(g)0Ti7I2Q~LfqnDrxBaQjT^V} z8JX7|OpJKlZ{P1&xCC25y~z0oj-6ldaLZgVk_F4e{CU=1T>r}C=6b?yBHp#dKfQH7V3-7<1j8yKH)-Q$Q18`B15KN>6&z5edr2jLJH^rIf5xgKz z=vt1k^0>Q+ohbU}{b?g1mhA81e-^`kf9UMib%KqX8u@$i0FA-)7l8FMw3m(HE>azP zMJ_kHhmGDln<4GHcQEeV`)PbWX6z4+b8$&_?F+2FxXKp6cOAJsYL0Z<)o`0UnO=$C z9RWRZpjzJi?;Yyyx?uE%F)u8xeEzth9J|$Ow^EZ!H-~``4z+MQaGWz^;KF+s#@Arl z!T^*0O3tc|vegPhep+3Zi>d+r(k7!N9v5io!nS08qqd*}#N8Vdjv9GK)>8}`btpjLh#;-0;2WtEcu{g!4Iq12N zD&6Eh7V`UKwi1pH!M6=u<*K7g4)hKRClfz;UHkNMm~k;Ofe}ande#07yFl8s%FHBu zWQi-&0R&?I{VTBLPWRRM*K1-YHV>Hxk(Q6Hg86HPH@LNbq;Y11f|78|v&z(^(b zk<1^29nY&zSNY`$C0mFEwo=L7)x(*xW?LPk0*X?kixOo=n=>ECtymUU2YY^gfEN8e z>{HQf^tt#mBAx_1x~MgvcYe(A$iwWJhHV;O+RA-0`jkmVPsjeOALS_%*`L3&H|()b z&6KHis_I8JGS-6STw`(;3MtPGw0%vdWU4}||Nfl=GXr|;6Y>M~Tajw9p(A{h4$sFB z><3=rD_J_4so`CYz8g6iSa8l)O9q zoW?s*?l8kQ4VTwnn@LA==OuD&3V?|x-(4~-P-mTevp?9Mu?>DzEaFLXm|~o2X=fqN z;!>B%zK+%7bb1n0WTeH7m}IQVxI7vW2Au?Nv66*okrTUrGhsJ4QnF$qt$P|7S#8cU z9^@wp|FY)INjd2Jpw_wGgG}LD0ajy!N~<<;EY;dd>_v7~XZ71w{&=jjhhyD(vr?}P zU6q;=%$=`mS;W30m?|T9d;IVGVFpcZI}To3!h-GPJLP+C31>`i`Nk3w$~&faBB+L5 zy#0g)DEyX|DKj1Nc|oQa7$|LKhb*5d)EMUDrZ7_D&reUwb~sIJLAlH4?0h?2E+6s- zRan;xM5ip@(FQmkISRH_wyxPc33{8;9mItS95K!jzgN*!4_2-c_ z63g%3l&&83{t+;w?nI+q-`l!%I<@oIdG-2dnH&M3@sk;HbL!qgmYjwpz; zTDGyW0dzK{#Rc4b~SXxkjcd{G#}xySHdC6Y09{ z*PELX6i)JLh=YH2%<8)&( zGRBxnZ2NU^p}qG00uTX0O+nIjVuKcqTXV!F%U?Xf9^7Dl=Q>BJ1Bnkrv)XDBW-@c3(?+31T;Mw0sEYd~ zUJ&bJ%WPOeWbo$@=Q}Z5Mf|j98xnlnX8KssM-w>6GVj35^NaUv`=Hpn^D%+l z7|U85@#Ni!Ob^hxW)Cn9J}&mOo-=kf&cD+{4Z{2|!y98>FpSn)KlZ!9IeSi3?Gc9NA!($L#_yC+f0 z*!;S>62r12mt2pu2zyT5Kj@AKRVvE&h9u{e(Kde3C;H4t8JZ?{i>qPlV{F8+<(UKby2uR;y*==9567M3rs;EzKcW&z{ZI| zvSi`1Sht77jCV_LA@gmqk;8nKUu>d!{2CD)(?A$o&fPNQ4N4A57QhNQC_wrT)Aom7 zHT6w(v)`6Ucz_LkdMci`Sl88_0)Mzo=C*~0kS7n zgVi&YZ00-9FMBs~WFXiuipQ@nW zkr*`$aXfwY@JDB9ahq*tRw$+x?u#&$JNi@B-e`SY_QVsEU-Le(q}ntgtv=;(h*{;! z_h{M4@eDdkm0^^{KSeVxQ6A16bRSp0%~|)LVE<=2GJVwVVMt9}@7|H>P(x)+5(i{@ zL7R7Wd6n(Ix5$X#54<&B)~nIjQG8i}9|-D($mAm7uUwl`z~uck+D@ia6BTRVkt zb~jbWUGEdf!7yActy()GVPzSL|zS&4?1P<6M- zN5iMf#~wpyGq_HN9~xV(FPYx;aa6T6ziHETqI2nQeg2oH-h+4-f((JW!qFoG!a{_> zaaJ2GMctJi;xrxhQGeqaLPn?Nf)nk3uUKnlYu&yWiW%wk{1!pIk|!>F@$^Irf)YSOW8e4Ayo3yBwq4Mqy(uFk` za8W#tT^~zV0I>S>j~8Hj>Q~sDhoN3$MX{5&t+dJ;7ml{SdrhZpBylrGNd4>%XI3W$ z{b!Bzb2I?G?B?V1^OJ8KbmE)UL)bsxt-VonK-43;Tvi@$$^EGYh8x3p50OZ{R-eL z7mqJEKQOm)ZK}H-ZLk9TYIAX@vfb7ldg0*_#OAD^ zG2B*u3j-TK&CWeP{Ky`nyPRwh{&~BR0x(&+!Jt@h)H+3io&g$bs@Bx8!`BGosTm3J zfMhjseo0A|LSxiWdaQV%AkQ0Ve5spp7wTvin%f1Yi~CZgPr{y`@j<+9t$riFvPQQg z0&pESVBPiSF0-I~nj|E*OkJ*^D{B9-L|S}M!VX&OzTr|FP*#;18H>Yp69J=0sZ2GV zQfF8*)xm$KZO3;yVz5@ESMW;JwLIRq*1zKE(^-*Ij9*otmvGHA%L%5!y~FZQIu90i zzSTuM@jN}R>&Yy=&R``Pd(wZKGjINHpFn`-W5uP3urfWvbAr< zHUBG{3LV9Ki$V{Gf6-Ab>V5Hr=XK%`9mP(5V4E@RY)CpShltjj<7~k<-eF!YXlYJR zSJH3kcJL)6-zBu;gBj$3Sp4Jhc1`kHHvNNDnXhy3$qn_aQ*18D{0VG;G((cXU{u

    9kXWR2{#1v~*C77w1zM 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%0AT#zE(V++>~H^Xx?>dfd+yxhj5oVEH$OGCvc9^o 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%0A#(d)MA_Ie};E3I&7qa7<$|UrKttGR$%n#QQ)V# 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%0D=JGdXmdyTumHNp9|1;f+`{p&KsC~c|6Dlq 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

    #fsv%C37&)76&kCT4#0 z`Lk#Uw}5OLUQ>yye*N0na(e4~Z|*T2V&k?*+9%F`Zm8F}R7nSIA&T<3@`WIzz45k; zw?b0Qo024?Ri8zGy1dIG%ZHepuAdj*9IP-Hin3+9*6C~xy8v}V$|ynx@V}-SKt9`< zV&38dSTFN)&G#gq#a8r@MB>NCa4`$ur8jWJH}@blMdPxK zV+KlXU9i3VUAFs3n!0m4a|7#1oY=XS`PltUL-)35zWI8pBH;IjkL8_hvJ&)rlz(;J zM>k53Vm|J%i6N=-H$P>cBh*G)uk#Uz{qdGH)(&h+MaJ1@VI*i%ygS%L00=E3 z92FNS&%766Z@$ZyJ6~%Si?>>r6QE8gV2JKc`PDQ#;*ONVKXiZLoT>Q{Ev({TVvMh0+^V>mPiAYS`~0!1VA$UKbdl5E5x6paUUkrC}` zE%M(|{XMk!T$wm_l@}3~xJQ73kox8Dni!usIuntF>ho-;{jR%+N1kHqC`@1~DPj3iQ-uXa##uFqqgn0lZYI+GHt~2Q zxS-OFS(&f4SjemBqHBG=Grf7((&WX%_Vs-#Th#uNp>?LWJxW|&g7b|>Qg{*w^#}m1 z+=eVxDPf`%x=_6Ao;^^x)VU4E^Z(&@KCyvm0v0xhOYJD1ZlGG0x@4i8KFa@#WN#%(&PV5Gu z_xT?5_WmLa&1nr+%OFAeUc#3MvPKAbPzQ2lO@EM`4-w|W*4Om{>1~H_Mb$uUXFnr=7JWASkMY5k6AyzIFVgCagn{z8f0ygN{atn@#QH~OS%tE-tfU%e%i zJpakvcJd*#{^g6uyEwDi-sz8swOySWyewRDVrhM%#qOy$7%x0e0Bnc^fc|hBVgf%W zR?Up@v?oH0UP z{4}R+?lj9}vz!!yLp|`erY+xPFMN+X&6|gsdG{1&b^cT|zWHF^NwHa-xx&j+$w(I( zmA5J~-xY*sf40}@zva*8b2s?o`rCTz=;Irqy(U@o`R^K|Z)^rpT3ygyb$?2SdO*Vg zdSnh|?=r=v)r!!2ddm=cb>7^S$%rLQ|^u4?Fz&;-(K++H;aqWKsO(+h5-~nG=8$f3xg$@ z-P9-5aYwXSuD>W?3)bk*`F?;R!5+R{DPUPSn-eOvvz!E-+FwQY5a~*yS!gC4UVh^K zy9Lx`;9&o3(XRe==9{L0mAzMCqu?hpC;b;7jix`ISTL&#RKNpO!q5@bq*|61 zAK3&4j$?f0ewF!&ukUf$MwLG91o<4G4_1f>+hE2b1XA8g+;a(hDZWMXglu(3J}T1l zRUi6D<3(3_Jd3BhW+7}l`L?3*X0|qDTQ{L-C;{&TL^+CQ6V1(nU&z@KqA1|}%kQY4 zqA=+ygYdPEz3vuIi0L+zb)eEJ?eg*N^NSlB3MF;(UB>tA{dQMvj`~+;(i{%s9DegK zaffmmVWhML1_tH-VhQ8_hb259KO7ScEuZ8UYz?-!GBvlnur@clxbO=$wm`p#Fv#i0 zPD#aYYsD>rsXSy6M?_=!LmOXZ4p3@92He|!&feO3oL~tA7#0y8JPH7)NIBX$$=^=! zIU07w8u9JK-B@hx+$t*;CFibuz(btRTvh;eq|6d6>j4hp!4|j*vZ|q*x5;8BG-l!0 zWjARgpKA%3WwstCQ}tbW{-Ert!md+vl!!={G&mI2JC)DZdo+Ly3Q@FWEd&!f-N}hy zKiwJoy;|uQyl`Mimaccuai@BfN3O9SX!S77MHlf#5M~6T&5i`qkw7Aom}~%nhlP+u zc)gCT3#$V{rpK>Jk8~dYmjq04j`GJJ2bo`n&)5(6? z9BdymT%9wp+fVWNBYYN?ZZQ)wvCEfu=vPQkI7&Ew|B^p%Hp?zY zOhV)>cN@-I2#UjBJKIg^syAdlI!YF}We)rUzgq`JKc@e-ymdSD8lWnl+!07W{@hE5 zhq4D?Ck3K<02rNn9T*IbW;*DLDQ2n{D}rz(PHIsYs>H^|GR?wf5MAupjJCNf0$MrH zN1X#ia;Zj)J@i^3`~E;@DEZq9q3`Esfqb!(TASkwkDIT@wE=301x9oO1RVZ(gC;0V27z)a!TP->+S55}#Zjj>8fkHhZ4=E%>bL z8--l9ym3D0juy^hv$*o5Ye^T9p-35iXTMmQ)Rgf)l&nm>fVPkl+hE9+#~29Tx*MQHx-KDWkkyWR%j56p4-p>7GL6)UdKS38o7y{epG{fkrI(K`b>Wt(HBg}T=2lj3H`K^I

    Z|xiF-89&@s1farl$zhkW{BoalU;IrO6kgQX_dY9fw3 zvzec^;7aOSN3%GD1yXri6?KgET+R~fnt;PL6`qqG6C7T|}#FJGUlTGM9a@6-@UE15pYm>&(00-&y`!H^}B_dF(H{%TjWl)CuYRc+K3r zfT*{qKU*p$eNchE1o3bglO5oGLmHwem$r6iSe2S9;0}v8@yhhs{ks{X4$|kJzCrp( zs!Msx{tk@}s{Z~ zGqpR0xe*$-+OxWr_GRoW>kCa89;GKS$t5WK2Nyr8aj7bsQL0n~|V|cx8oK z7qxnH^yw9V*QLVcl4~vSI8+Cci{ZBxf_Yt}a9nSr!6@a-x)sIo&xBuOTD9bc?^Czv zi!^U91xVY5Bsq4vWNIvw&9|kL&=&^L+%+kstxK%_*2s`d_dQu`*BkhGk+Gjqc(I}n zQ|`A|u91gxtvx!d)!9s!e7#gN@m2piuI6%wpvo)WvSo6ToEbZv$@sM7VHXjtTNG=J zM*3D5c)K#(vB*$jHz+PB_A4T1*uI^cxbXvZyD@%#=vPV_7+RIKyO#Ua`5Y*6_~ks; z_y2GGJi;e@aYgzxFkt8pNZ1(vWHvK@HiY#74-oMbCiNCScXJBGc~~X4M2ZF4Jv7S} zeE%X49&i(Kj{2)d#xYe7oIERMx+>_mEwNuv@1?4ZMX{CMsbz_`V-u*dp0N zg_>_a4(^V<*nC#>!0R!km=2$(pMTUKLDv?sw*0)4WtvbSYt$vHHNL+%MTFvnwSce( zfJY0g{Ch6%A`NukFuy{V6|C~dwA4VOH-E@qZMQ;k(I7CFJ)W))=qWM1W zG5e*&qWoa?5;j$qg3py-K?84Fdg`hM26}FPWJHdMq^_fdK62)Uc)rVkU09_nGu1Yj zp11ED&b)K2{4J(ZyDy^~I99$3Cs?~>`_j=c=}KO4)!J6hEuxjc8RX{T&EzpFl3;+7 z;LS_?Nz3<8iXmxN;_K{7MR()i4~Q`b(}CLHWtyfc9zy4L8A|pd;>=?rJ4wYk1rgT5 zs324@QY{(s4>YS^*)`LxdE>@`Zh?U;G>NL;I2|Y5&uzT)Vf4RdG`}LaH4_X@BCGBv z|6cQsk@&F}xg~eZLX_)d|IB=_dO=;0EkoLzZa+c&yiRBl1@HnMz#zHS%syASTm3wH zfcozP!&Vtn9xUM-PQ}&oTQ=pk0C|nB;VG$Zp{qHG%q`Or*SaC0J&K0(t$H^%{l1Io zkj1pke%7aV)@c@OUBe88cSDJxlW}nd*H6og&d2zl_%1s1=8xl_F!{pWvjih1Vhl2T zXv}6%3R69m7%?E=zu0&>z&kL2gga}^IVsM?lfPfw;hJ+A*}70+NiE%XA2pqWlJA15 z!pvLW24u!#Ky$H~&_ogc@rfXL-0mz>bw%ZvS7Quz?u_@w58tks4CH4(kPHSL@42*K zBgDj+Bc(!Kc9G2#=rkG z4d6~$wkNA;Vo8#9G*cLSz@03Q1JTaEfg!akT0>&03^*ic)6r{I{jN1}l>1(S+%M6X zbL2G*j_D4iNRR5f%J_p4IQdXI;P?e{p!AKVAqu(+LAJJly@_oj5iS{ zea!PmJIiGui?=SdDz~*^)Xf~$i-9F`(h5s@1qRx^ficsA_&@O(Nk2B;ofO8A>gG($ zIZNi{oPT^@{En#3Jtc$9u~nweugz6^1JAaH%H|{m8@Ps{cU#fQ0Vwn%h$~mk-uhu6dbcxY}Od3*p=d3r1_@;o9$}$Vx23Q zTvM}8W~_pj@5~L}H|AV0y3HH&1+#el4l)0s5u&q8ihqiCjaFNlSBQmg3cb%Uiy{UdpX9o<1kVV6z}e=Aag(U8HZMcg6%5dkD;A;=2% zNBYBSEWe=YEz7Yx|xG(!Y82fTN zBsXg>UY918yi_l>3F=grC|mNI^&RiEuj;b>X>^&-o!T0k>znmQ914x0#DtK!Fm6!j zK-d78eT1I*iO%_)AdOzf#1eNwL=-2HKXlPvsiOmUHG7Bw086;-rPza5|3jc*=GHA* z{NVf6_Z8tuqm}HPTzFx|Hfsj~k6g)D48Zbyp0E&E9&M*g!iLTMqNas2&;x_$Ni7y?2MG+8GO9B zGXZgdU;qXMQU2SBD_CUbrMvQIuMnYs;k%`=X~g0CeeHNJ!t2`2H}uY~wC1a@kewew zmm}olGtw*%ko{3YK6N=TT#O>-MtRS0Kn2a7W0@mo-@JFmfXJu*sK&aK^2s8 zMESZad9kis$+seSh5J%pXaYIq{Hbgt7=8C3ZL~F0*{BgwJ1Gz=ufdlm*f#lgao#vN zE012ZK$cdfbFPf3k;h2UdKr?&C%l`e^;?52XZ~yBp1r;PV(WoLMa$ zyFNVabQhE|2f!(=mUZ)U1Tj{~=o~gUY_VK9&qtrrq~BnF?mhmx<#$K_`ld|B58aY} zXk!70_mgoUhvn#Dq9t1H@w8oGoCa%Y413pK(jKkrYGxYOGSCWN3VYw&)oEG9V9pYR zdSq=~d>^MkH+W&;2FlZ%Ln@8fF)`xU-5D_3Hcb``noT{Axl5Q;^Luvc)SGUsFPwME zQu0$_V5O1?Fl7cXp>}ePXoG<8e-+~w>{8*6XGY0}$C78N&CE6<#oee6EPMNbQ^pIF zz57iRKle#OThMUZbqtvv1aKo60YKmp5!sr>MMYyx>qU!2J8Gd49W>pg4MvBgFMr2` zEzAdf!+wB^K(vUykuSy58>I_=Z_kK-2%~czV7YbqRmp(-@(4 zEN8d;sOlGg!~DH)cg4<#X%u87ammpd**4!_l&ZNhve{9n)8O#skA+GN`OWE{$t?P| zE0MFqWy@XlGj?g#AwB3>Uo&l*K+PP)fz3h@3KE9qBKgZ5=nT&krl?#;ti-BdMwcnO z*mGW#rbgE_x;?!eot+M5c%erSc``6^4uRl5wZgsxT0;)OHbHRo6wTSuQ?_o8srq!# zUErdx?spUc_A*h+&CfG-Pzwr6lTv|}_|&9Fb<7(O$=OG7k@=4D;pb2l`PEPw5suVT zUMK+w-exsRg}?_en-T_ z%O;&w-U5*+vrUnikru=P#iilAv7wZ>5y;I~ypgr4oOO(st}q`^wS)oa5pmaZT9~A| zVgW4svtXaL@yau*>+=|tKZQzKIj(#1;$0moLdpBTD(GpvGhQREzty6H1k*Ruw`;He z*fmhcZZF1Tc9>pg6p|Qq=$+|wlKb^JKCxaqEpR|_Z`L&F_NGtSXJ1$XvwLbUpWGjQ zkkKq_t7=Mpdr;fRL9xSbc=I>c^Cx=cF7eA-ONSe3LOEQ<|HT%V)sP?jKSLD%fbAW6 zhE=lRKSKkPQv)5N1EW3tJ-q`z2ZsB5WcCo0?FFpzRSUI*^$|HOMs_4n0}#Uk{(Kmr z_0EA^ zOW%IaZ8-<}j37wmUdbM4>F>>4$1`J7O^*Dt{&3hCaKZAqZc}j83Y^}B#LZr2b6U7jB1 zM{0~*&~29+=k!4BX!6zmvt$GS)!aAP--N^K25JJo6x^46BiW*9at<2Een*=ds8941 za=vi8g6t3w!vafAJ>krr0?YX>L2WXnDOr#wYss7nND%5YZkaCCH6d%U1SNP?(~O3-w8t^*-}9t z<-kZ@6G5j}6tiCAhN>4=D6Wj4#?xvLfj>>T-z9DJ^D=EIS<`svW(?#76Rw0>RH!&o zEE1W2Qa6Jp9YaWt5M~DDP*eE(Rqd@k<=ew|4Zhwww@x_UpLDJBZl79g z-v+ZS@daxlHK{8)SDhtZ6zPB01S+q|fK4+x2y>cCpVKr+~~U zvHsm&p(cZG+wdb-Y8?-=zQvGtn{ElDs07CFiu?D*Q%}A(n9#4zT9V%iL9(W(f&d64 z_-|SMS~#i^6|`hQQh%L<9H;9?l%#RN6yXb^R}Uz)S%1tTr76p{R~M;f>JN}uRlS{# z+5r+A|F=5lT#rT4N(Og#i=*eH@(VbQwA&BnJ|h@_9Xz#GZZx?WwX+nIc}jvb5goi= z;)_Y_;KFG0Ek0)V_BOSkKI5xw>uiaFMx=$th$#%hCsC|JM?FqLD#NkQnOypVI$n_? zI>Qf@QJB8Gj9q=XkY#VPpdIC?d3jduN3g8t@Ef=Qh_zOlM-^y3>;?n916tMhl?>{RMpxp(tCMXE3ILsek zej|2M9cqz7hR8%=-2e6UyI_x9ajxTW-7d|G_>)7)kSEM^o%vfXB83>7s7EaNhy&LA9}t57#!kq04fIZhC&V(Ff^3C>i)`_ zBq4K_2gk5N@F^^el`nRIt79vwb;{9JF zzX$0(2{2|qy4f`@d{0bB>>>L4_RkkIE*Brynjk4o9Be@8h2Vl9L;%_>CCRPpKkj@? z-yTW^JtfuYKa_z_-Sgz8p_(_D=`>M=6usvZ13m*$aMIBiU59ZR%b3L)?>zFCW_#b4 zKkv+$mF4p7M>$Mz`)TX*{MYnryD*c9KY33-wYHYH_Tx1!6Qrey;Gqj(#yEnI>m z_D!}iA7gzaTFwUR<0q%}@05j3#}JAMwgw_zh>y&?C!1zg50w012`2v!g@BbBrT$tl z8uu=hibr+DT0{Ds>dRXl90-ZWErKSRlZE(1Vf8O@@ zr|gU&&tTeLbin98rJw&urmMV$mN0HHMtb1qPC-y1VC;vz5Og>X8R1V+?j(uMtrbpt zVa*HqrukX&4eYt{<$eC4->^E+4xWUo59&0_bc{SD8VH%;M^y-XJhX!@#qQ8Lb0WZM zb6^$(#8b|ZV3@O8U%Do?lX@a~7*7l!V`Ca2*qtj&D0i^<6Zn~EFZk^ehqK-RbSqUu znDn$S@%gJFfAKE(A^KcL_@}&SNu{SATWE~PCxvrhxYp3aa%>~-dj%_2RwJs(gV(!( zo4JiG@~%nBLrlMow|fFbE$$Povoy3r_%c8_m`mR zU01E4)wI{usDI2j(QCK2CE*aB=gu>=PSc%Nj(?n*yt~g zi-Z%9?&XNi8X{NOO+`fuw$L^#lt=eJ;wwG7s)>NW?uRxq*w|68Bf<4+fDfeV2}=YK zS}C^b)tNSHKH_^n%~$1ioa*t6a|RJk3+!AS;(Mkv>&OH>M)>HG)D6~$8ORqFw_>Qd z8=FRry#46F`YhD$aM-f^kM5J*!JJ(|Y>HYHH_BeDTt*;@(Gn>dhYZ1f#Zf`+ON~}? zeKLP~;yIzFt2R5BAjSq~Yp0SEiptks$+vs$4;Y{>K39>;=$rZ<<{oefXK*8HsCo?P z^Khxy`p8jhAX4#EDsm?U1jI!*k%IvNz79{|^s%Io=J<*qatYSC-njz^uNx^orrQoA7jszQDx6S-YSsm_%!a{lzHuu5yP%YZWJCo)`yB3kBGeO#^Et{!p5cx})+xbuvVuiLMWrpMRz6n7H-~y3MkdV@)GoKOWXwC_%ci3u z(?ZiYyzKAv4blBQ#vHJdZFh!)){rJEo${DvQ*`Xke=WFCYDprx@*t!fJ~~b4a|sSwzoMTB`aybOwpu}cVSvfq7{uNV?Voh^K9w0&dGbdXI`j& zwz;4*u%#e2HWkvrVXwnZW_Z_0nQDewePFTM=qnfXRXrIj0v5~;Ejcz;rI`aufAaUI zM51fR9<8MMO;Vd{f|6~m+Rv%sP%beW`{`-Kz*8fliML3|QVCG1k}ZQQhv6>2fE_b< zq*e#rUtdMZ%V3|B9j3THnFEvI?riPV5XLKZ$%)wI9)o^o@l$*im~BbWa@>QLtrm5K zEj8Q^F^nyp2R^;gzuJs1wC6gsdyL)u!GC9`v|5}Q;FrR5(C4WnCj~iJjL?SwAD;k7 zjQ2JK4PF})@vD*Q^+3}B_Xv7^2d{#^zu=ne%J?9fzyW)K`*&&s6N=o=eWA!;kVg~1 zyol2>=%!f)8Y1x9(YiSCP2m|~e~px^a7IIgz~@<`p>njNp(IfL%%)ll1n3+yH>&eE zt(g`I8QY%z_N#5mWjkk*E@cpZ&aa;yj-%|d-m5Z!jyWhxqa1SLIiIqZlufbewqoa8wUWBrhVw7=B)u zyU?icaDd6~b182PV#r!<~ z04`_#BPAoa6x&j4A~*ta$a{WG0jWqbqrw;-iFVBxtEP*{n?SRx8#g^a)hs-ZS7)aF z(N@l4*G$!QvriOt-dC<@+#)7k|D700mrDx)k>Ua?!y#Z~vz(C5`4!n}UDbavNLf-p zN_3W_rARRSC#+kkN|2AjXs9WBL-+Rz8Pe%ebnXHY8$2q*ut%(>a{q5 z%cv#vA!jfB?Y};Fy z%VCuib1R__y!|A_7L9}-+lHoqVGPmvxtjTh3lFC1vHsvTMib%w_BSQ#63Pkch6+>0 zoIjrAF@NIU^|(@0bG02=-S>K*_)RUgLOulo0`LGdAFM+U!u&S?HPW9w8tGEW?8fQA z)oEw$X@vXMg~A7&K%epE=I7n4D$u)M6TibBOqdKkCbPjHx$n1TSK0Y_ks4Mx!b_oNU++z0@^)r|>3w22z1z0!6~yf+ zy;Qbz5I;3`e=XEAm^goBXkcDuNh@Xbz#3V8M*PwIv#X}$W+J478dqXIs`@`$E5;@IhfA@@EW==d z7gt>q0n+HoN|?*^QA5gaSHKYIPe)in9w(27hOn!zr`UesU(N#eM9Pm!(L?;$PHz78 zKlc@}d1mQt^8y_xmQMgvJTzK43Y$cAL}_M&+RO0%((-A-Qh< z?18b2pfAx1)-;Ztgh`d%7Uv-Z*5zJwbfKa5`h_$axj`Z78>QaYXghc=kz7iDdNKZ; zd-?sOYTKQKeU7KjZv}qg5j{A>7(Y^0^8+l;Jy97y<}?!=Z@nG-;q?=)DBMbk%kgpf zARx^wWW{1+b!VP>kc}&qOATZWq=OH~bK5d z|1~W3jh%$Hv9;R-Pfo>cGV~rZ^1H0EA%KV%R4wIBj{gz_^h)=hvgS;Z^I8IEzX zro!iuSWDfWAaUqFZwK@Ve=6o|LG%|LsmD+Fz6esz@I+ylDxXzIrbe>9)@YYGFx{wg zmNP6UFciJ}Z(0Vr>4unMrjl(>&~>#Z47#%oE2x{eL7ck@v*-i1qS>ZK&`re&9!M%& zhZ0)|Wn%TNRyjOp^trE76T?F(!E2N3FRu3;#5tinoD*ogw>%ZUExLX8YZ^k1@WumX zF#>nrgq@+*8$alON=Xr#4K|EeroWe&n8APIT&QFn-Dt6^UCjE#D?~Pb7RRcOy}`{b z{?o4Nu45S8*$EE0Ts116>NKz|?y#;y3m^}}cN1T@1RGg6E>?slFgaPK#eWd_A9uf- zE%F{os89}qlP!w-AbSYI}!O_~Go$zOa{_!!>U-xfqzg=-d_ zMDk&<&~i%GMPid$pwa>sUTGS^YkZm;3_i-aYO+RYs7SYn4ipBgv>@HKXG}k#H*Lt3 zT;a-+6mUfB-eazTbkk#6(nG@w$X^!eN?;n2fsF~NL&X09P+3>Z;!E@mia}(k{6Un5 zo>(yqxu3I&J8O(jZUDeEN4NmCSFRyx=?^-^)Dt@X)&N!TaEsrvdGM^nnhENyoN07r zMifU(nA^#=W$u2^LUnl41#3Myx%V)qH%V){DTbRXW&Fkd6q3kDkRF=gcEqc4t9jq^ z>Ki|&*`VjsPO)1r_a_1zi;>#y9e0_$zrearb1$S{KM#0jN9D%`bYf~gPXc4$0}m}7 z_HZmQr6oau51~l5mnj#vH!3~ax4^WK_aJcVtTz>VBmt_Zom`;N$CFed&9~ z+>P<^s*=&BJBlfe$xuIWEc{(qQuGCpn&T7oAI# zNweUDlmFutotRp1~&&;N<6 z0&)A1ej`EI!f_$$E>P52M$dNTn~YxByXS*T7*K&il@HZO!<`EOIxy^%uId2t?Y)9# z+q#I~#*4DTy1%pbpNg{f>-c*muUjNP9rlzZBLQ=5(Fl*0bw6lvxE`yc%$CI7$Ch);rTsX8{eTsB5^Fm|M|T=~L+NJsbV|k~+yTb%VFF@+ zlH`c57|mBJQ4GRhMCMyeVicF)#}8;(FxSg@|6;@GdArH6`o_wvKTyFA8QYyQ0xuvx zrIb?@85^=C0(*&D^dzfEVG-Vcbv4n-j~q&sUAeRkeQugsLwtGPuQ6)PKnM9d@m23w ziu^jg2T4rZO#9<)6tVHaYZ#80ix>}`kLNX{Uv-&}xGg(cb`1o1OVFU1H8bH{Y#5KM z23K&(q{k)rUYhC-(mrq8T3)*1}@0EZ9+DWi-Vlzc#?>= z^&`3|XfE;6VmH(BtW;Pn7HNZnJWF6ZKO2~Y&KNqs>{@SS1pFQ{aWQNdpT&CnSVJm+ zEyrMEM|6DI>5X?DjQS1p^t{Dr?s6doCnxjBLt9$fYp7A__n!maF`Kd^1iWSP*+S8b zK}wnSiu#bYB+jGwDYi~)mq)i!T6(fdL&CL7A08fyqXk^l%hm^W<`-BFj$Aujt_Yj0 zGx4@*WKt^lM$^0ObCeF#AHaRl5rYv1WP*j|K*%y=%be5D0Ld15(LD<@tFPoEG7;Ii zJn&E~QnqXmQ_oR&O;(DeLj8lapjRZ)r$V;p%5Zt_PbGAh6GWD@*W3F-FPXb&__pFV zTXs)pet$zhpS9HyF9$i>+RUC^)%tsVbfLS#@PcpHm*K}9kYtGl5oQr}HA`MtE{Yiz za8Yc&x<4>U%c_)SS~LvIy2%p05TiB3|Ka%S9zPR?IIT3QPd0^kcuet7Sk{SB#sr zDss(J_KVB93{2pMdgRvm>4!*?f3?``EqN&?u0l1^ZUcEbs+pU9i$)Eiw6ZBy8<-7X z&{B}3opwOrL=yl|+n@>80;vC|c~B7$C{+wOMJU%-4}Bx)Bc=}!waa{X?s^`mySPT2 zGsfA-kT5utPPmFA!McK0vTEbEyLw0xboGn`GaD<-#%7*%Z)W+7Gu6LGbm}MW>b^if zOKr#sHe>pYX)OF@uhe*aicW~W*^{1Mfzp_@Nke}D>~w&G_Wu#}6L-QA4> z0us_)(o#xEcXu}ojUXWkNP`GSch}HeBHc(z4BhdLKEHSU`2egr>po|neXiQrYES?h zo){HqMPq|XUx1i!D>_&qUBvqCVEqh%8oAYrf9L&VXW;Q|;~$u@2)H;{K5dloVg2vA zAVuqK$bU2d0x;YTr8+zVlUGg*bZTZiw)_N+z2ybez@EN8GG58?sQ{FsIE#6{AaR z9I`jm70s7wcWC(1<9ToOB6%h5xS@WGvbK-&c4ln&u%?rUyf0)k0>8vwt$jG@Si zowFl$X}ORxa{u?TM)Nrx-Y&e{wX~JK4I#H=2I;Fpm~j20~*GOl(ABx7#rR$epCOaGKGhsiO+}sf^cXo@Z@PIYU935g!3V zjAXvlMhaDdnEhu}%UQMyV_&hfWg?EoTThuXA9>kj&t+yfsupaIy;!0SVa6Hv4e0-Vhe4g;Q3dBPlP{q(eyrjg?15#+w!{4*{K3!u|;u072;&OzkEDy zxvm|a<4RF@CV;Y&Zgk-r-0db&h$Jy5di*N3lO4=`N>9DTKiRaky%>{%Tt@hNQ$wOy7Y_zyE{C2iD-RZC; zn*Y2*i;EH2L^RHcd{wN-&>o9GSHVESO_vsti_Q%=MJ~G?uSC$=asxp0V zk(aZy<(3fAFS^b;K3c?g<{}g`htXE`2a>|`+XOoQ_;pJnPy6ZHJh{C+(gYGzAE(H) zjS3^RsaHMg$IpG!$pDgJj_n!=oZy$qE{MS1{?4nM8sj)3lI1-_cYxv38xy&}im=+V zo)p^##~me`)ln?F1&r@*9E=SZl{;gda{f?;j<#$vD3RAU`K?m^!auLH_5=8$i|5qz z&Z#iBGHt=s8q*(A^`lCQ^}rE1!Mb9vDSo)nD`g+BBM{B#_n`t<D>&#WYT4g45(dV

    %zm0_OA!Y)~hH%se=DYaqWtxGxQ#Wa<=S-rUgnsoYj8DQl3!Rtm&3 zEo18|J<>KW?3#(yn6m8rG52JSAS}Lg_CW}Itx|P7zE(-;T}zIUse&Gb3Sgd_&FfDT zy&cUDZPriPi$11t`Z3G0d5?zFn6*x&LBHtR602Isr1JeF`Z_N^3*?Ydu5tbChOtCy zq(CUB7v-ri5#>+3df6l*OEPmiW_*0Qf^#WZ9Zj5lVZ6X}4!UGd*4^J~+0zgoiqcz} ziR(hk;`5X^+3%O%#a@iR>a>G!Y&%m%*uM0bnhhdhG6(ILlT;?Hd&!t#oc($He6$#` zlR%1DkdU25=~eBkbd2oQkpp!x-#RByqKLQAM)hUYZhm?U+gavj*L_)~=D``E z%rB8C@dIif1#OqXU&~`JX)<6LO*U;uM=(3W-~5zVGBHm?HShIpyL~UHY`Q;LRQRdA z^NMNUTrp4OIHNPGK7^EIghmWf5|{&UNW{|c&?R5Q8KQb5ay)&cF6olqiF96w5~%(| z%K7=XslW19$VS@?XC^T`T)wR{IMca1Bho<5l<9y%hDH9A@J7bPoA9)f%fN|Jr&lef>sQe$P27VXQsEBaP`_^H8b?WiOv-EmR0jjGd z*!&sVSIYt7R+z_^?$G;E>035C&v}Mbco2-347s{raaDQxU z=K7_0k4BYzmHASezg@ds&*L_u zVPMNJPG9+a)nkV3%YVjsA){SG6`l9YtOTN&+dHnBsWSRHva zFt+eL+`6Xx|L~>Zz+^vQY$!ocUSLzg{o7bbO5ST+=0H37%5?VLQpgyeLvEc2t5MAj zdPIu@3dc1FsD&(`w!W-aQ+R#}ml6E86adm{IaY{@Z27yq%)JFqlM#TZMbP5pF_RAZ z(r2=@EZ@D?_v*go)gM`YSZ{zWgM-W4UjgquI*A~oJv)x?Uv(D^^fnrhIf-mhUTz*qXRtMd&+@tDfGgleMn!vjw#q|xD|SZ{LoX(GR&)`ShUnw zGmFAYsaZH00}?wkLy5=`IRRQ~a_SoKserI~JF|$==oh^4sTDTuA1xQLAJu^sdAjXo#B|haBV{sW#6cGH=6{n-XCuZ9H(o+q|slEzSu2Ov_=Q|sbBC0={j$$d#28;7 z?mJ8Gup$|?t?aU(fYQJ+5d zl<5HxB^LTRcQc$Ns_}nvaKIYJ?wKnuQNWp)Ar*{bpmcg=c{x^B2Mml{Tn*DKe8zDf z_gn9{u>uCpUjn4d8i;^?1nU8?y7N}?WA76?+Em0F85TA!pk zycAFApK+#>lTDN}JoOtrz(RGy4~#H_@?6WnK;?wt6RO~$K_VrewLpfNk#Q*yqRRmc zG_Ikq5xzo2^soBBulb-M6nd?7zH`_0%^lATr$BU$a3xUh=;s(Sm(jibw>^>B$oo4> zep;;N<^!Z?kK)KfpMsCK2Hqs^=qh+)Tu@&80(F5VZ~-xN!!x79mGEj(x3q9H-jtE? zdw=`P-g<}5^iR^bjgPJkK;|;J+!Vm3m?dAxlP*dLFH7*24Q{1#;8@jc&$-%j!s$Z+ z=S?$R!S2guO=EMnf}-|8C8nAHf}v9RDWvJvNR_d!F@j;P!Ai-`lVOmBR`7g z0zoH498d!Y6F{8C))D|9M!r&GbhsQ|EnnbCt~*+CA$Zu}oVc?jiE%ygCKG=LX;x z<_{H0vjBVvrJD*>bP%-3<^?p7{vhPx(2m$GGi$>Y%Z=BOF*Qgu$}sSOYYuONr=(i$ z=Mx3zq~NPNWIt(rkMF*rxRp;Y%~voOOTiB6T(Wk=pHz%Y|8z<|g9|SZ@*n`u0Gv0> zLT|Set8V$my*(4hKq`85Y^Iy-ZGS1ELg7!UN2}F(Z!2wrlzgha{&qti0XRe}klxjp zKY$n3F3!JuiMHS}SN^D}y_o@IzfPBD@6S(T^>9EaO?gV5HmR7x zmUA^MCl}#!Rt5n%5vr7+P(N8|n{1iF8#EPO|jw=MC z_f9oK7j6`)qiS)F)BdD224+wJ z5`fbgAcF$!HwN%U$PtxH)a!hG>xR+3vtz*;ad?kRv#GdEtJx87P=ur#n8Z$~1bVM% zn%F6^AqGDUe>W18o~5O&xMKNtdoe!(Z3RDnN=dD@2B8rv^a=BUnFW9{rpIB?_B<2= z#6hD)iYH(0zr0$da~a1t&pqPN=N?7ZDaih^JX;YAHUYOa`M8nrJyR1gw&V`An-=@V zJ3S^U$x_GP;i*4AOkm5H_%VN-1$|5)LAzGTj6ML13l)mSg9yS5yg3Xts@aMjnK#ip z@BNb2^1xfBT^b=;FQ)jh!DEz~%kB64q0+Tcp>!u9PyU3Ban0Wl@V}Bv0Q+0p5kGPOT$pG=8izK0A@%to8tQ0qU; z$acB$^puaP4qB^xNOL+2`z`bV91P%sB#6{36I?u59)XVyQOxa6cuIKk;h{8ihNC`XYk0OR2 z+dIF}AR$~JlX8MM;X@2CQ6LD0&CA>3Zr^i1_g5i){dr;?Q0G=OeYm1dL!mDhcJzSm zKczs}njgmb$&kTR90lbckmgMKBi5IPhBI)d6ejH0`YM|C)Z6{8t=;G66!NiJh{b(_ zxCJ3V?Y;Rr6m5>_e$g1{O}WSp`?Q-ymsn<b8dPso0>J)5Wz@w!h!^F^TF zKEvjRkZQmr{`Y8{EjwZZ4Rz9*U4FK%Zj1##X&7{Syg={U8W}W(X=G1h-u~$ClM$#? zk=^Cd^cxz9IKe29@1Sw5Jvg1VZ#f(EOO2;~95^)PJkW!G^Rkb>MRInKQexhpecke5>W zu3m^M{@;s4;l#oI@Q&}3C1dlRN7Z0#!t0=5+pQU-HgvsuA!31WcCED($Ro5812Of?Hj{XY*Jgq zy)*ne25aZ@tJ_Fs>lI$S=FT&zrqy-t(x9;Bn_KCWl;wf|B%CjRO=Ji-D{WafTW9ON zf?Re9XVJR)jYtn6k5Zv5DUEC?+6TSQC5`z=)Bb zbKZ^U7QJj~xF;agS60lLx6bW7uGkwQ zP~ZN8UOyasE|i?(IR+uYFUkq2nZ)=ZWeg9if&WEbtjdaPwNFfN`PQ`{T%kuJ-EVTF zV5NAi^Ln*+rOS>Di$RDJYPbmyHa*i_=m1XIvvvdGAax$+y&U~n-_7P-vfn&0el$nx{Sh%|r;qThgxcMJ?Tc~jLUyXR{ zhf{vX6H2(BEd&6M?E75H%eQ-+iI#$i?T3t202A~bH}fnE$?wOg9tz@GyY$U%gij6I z2d0TvCo>+iuW1qOtAs_%dC~-bAq~-?-vYMkuavKmIy3CY%MW!2_>>oGO4Rviu83Lv zbiFMNb*#E-49shB*cD5mF4wsEv*5vx0v~Bn(EAdCWf6cCn>H&NW|Q}95n&8%dCSl4 zZArjip2;=3`0%Ws4@Qs6GaWZEW$j=hOTM`JJ6wp?@7^!ZX}D1K`ewqypuhfWyY~|* zTRZVAM_p9;$7qr%>BhO8vjOZi67ens6Qm-tRD&gA;!5GCwzpRCqA^B%$1-#r z^Wi0sfNs=wO^^Npyb=2TabW3#al0hKV_I`gOEv#=<2>*q{S$djYivjQ^6cu3-P)4| z220~n(B#Z*o?+4aVe0O6_8Ub$R+9@#Ir+C=RJ-E(r8lY@zM~0lbTw-^4h55gQC|Ro zx&gXZ?(2=`1t`R9n=4C4H&&v32K2wRTzc?09zz7RFGKjHAH1=122J78H&IhD_D_4ZLoBz@g@1 zGo~2MSlBu&hu*aHuAa)m2WjtB*vFPZIu2h)V!EJKVHbjj)J;!Do@)w0lq9 zp43R3M_^`mKQLs9X}WkGB}x?#mq zsppuY&#fR!{&>|>tV~kld&(;^%GhL38VFcXShmdGv)%P5AV6!?%7>c(&I6Mj*48_V%AUw~s0GQ}%~%7yhe;tS9G1sH$6YFm~d-@3dg! zJPn#qi1FjHumEOU}VI{F&)h?A(Z~<5DZ}{RL6avxm?;3dQQ%cPxOJU zxyrd*%y`@<-F2qys2LL$6yl=lp@KO#j#s)hrHbSSQ<@ha45sfd`+2o>zDCIPlik*f zH@P>l_oeW*wDvpGHYZ_M3cglfE>WoH(4?UCTuHOOa;kX+rk4; z;VO7kAh2l}TeQI7g_eOJ7d0wUMe6v?VMyPS3OzJk)cxI1Mrwz|svQbKHbXM2;co4u zCV)JElqvkrKMovpW?HqY_igZKZ*!W9=6#-j_`C73ESDMD0%*g&QTU4g*N+4g)kfoiS1f8Q*|W5WLwSTftt& zX~FOv!UW~-h~8x^=ac?yD+{3kBoGC9s0HM|;%g==9N={SQ$E3;7>4&RuP9!vCvIr9 z*j()}Q#R0uh(m{0ITa3H%W;l=u^qZ@@|k`E>A0|aMvIub13>$KCz`Q-GW@0S3daFg z+(5ngZYlFLh@=O(j2hSS4l&qGuT9P7=@tWmG=<^Rnu7;((&1X1=4w(P*a}qk4B8=K z`4!Q-U2H$)f{Faw9MDAtUI;)iUm(MyXi%x)%H!-QG)a!M`UGFG?j3)p=tB2;O*;5& zJ#^4dg`%2g3>6KNU?GJiN!+mikDOP`m_=&bye)6Hmd<=OQLtPZpGyaGR z$cGH=A*vVYZfu(uX12W;dFqJblzZ2f0Rr?VM#!o#O#f_da8qx0JRWl3!qOu{$kJAs zkI%68{w$jW_Sv6F3u;AHm>Imj36a2eVY>UQ;F?RZL~{CJl&{F*t(g~DF%>DU8aXmb z4j51YaRMu3?bu7(Ef_)z$Wr5Pj(9uL*NC%(?}@d-;2%I(LWqcZiYiSSZmqb7tN8yt zr~rUx$4Ql<3jegHo`rrtvqh6)sfm_G-}wF^betqlXFVb0t#yy;(IQ2+KM2SF4i96l zok0*o#`w_EO2+;&b7WgPRJe|;KR(km4(XT&a2j+pOTXD%mDNBH@R%n^p`qw8K(wAT z?&{aV^54!BccE%;>@zR4O5hH(4S1IF0Y<;aiwOWc8ybEBDZPy-%sq@pbN&-Z)umQ4N@0V{S8u-Co!o39| zA@?bEK9+rZ$To%&lvt0$%yVHs4_ewdDA?2Y+kzm;xUDi@iPO4R9)Uv{sdrH5T45bYg}6XIF#&^f`hjS66~8<)nS$@6RvW{XBh{+ff^e*>oakiN|qCllxLE^)v!A;;0M4`kmNNuF>=w>Q*R+Ja2oK7Fr~|eqHNd3Jd?b;Wze@{ru>Um4!kQ&O?$58neM(X2Y>pQ$c-xjs6pX=uiF5f z_`Sw&{aC!`2iZ|JeuvZZ?5!L-6y@^_%!-+fB{& z+hZfzUP9{6pYu08)~HJxdTiO9vIJ@B9q#iG5F&t4fK+5C6+rnvY{B;bumuD-wt$9P zK}giwUtQllFxELWJUKGkH8lNedTR1l;BDJH&EXWHCN~3O_Ks+4N?{C6ZNLb=w~45y zF9yeB?PqW1;vOm9$|iR>@$`>3z+FEXzou;Fz1N@jSt<}b0Z+@cj?*+l`N#DYPtVK@ zgZxfDpP00xYdy>(08)lH*1(aA1t$*-&zj+Y$+4C@pV3jAV9Y!NKUF>9~P!b|2=?;%n1_AH38FO;p} z>=}F(5g0WGFmERls~OkfsNzXP3(IPlUpxqVk37b%i?PlMK=d|Hj+tYbib9m{Y5!AL z0hK_GgKcrMaiX>FFKDlZUGa;VF*5y{#vI zfI;wb@{y4m5aaj3!wP)QtCQHk*h;IdA@xwU@yBFxcX7pqz(1CBU z49ZaKeGr5#yYc5hzyq{?%Fr2Ejn4P*euF`G$D)4m(kAa=@5YFaWHG@Zs|hkJU)fpa*O$ms>H`;Xpjlkr#KOWubInz= z_-cFyTlPcA*Lz32sWCU$pKX6Jb!1Bxf2G*&u4V3%Uj_-ufu&!Xs`r{kbrUm}cZFZm zeOo~j5D57x0T2p=A%o!|q1Yg2IN=m%el*2SsI#C4MitE-3Ycm34eOhKUD5?#1SN5f zr?M9>U<|QZ9U7B2{-rlf1JTn$kavwzHgos<& zLxYEIp6^+ge%3vwheis;AR䢞TTu;fByPZ$fUg)&>#q8=|zN4%(dBnqW8)J3U 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℞Bf9nf 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

    1zuScbNfz0Vu!hm11E_(yNI4Kh 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%0A`S^{K@0W{!QM! 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%0D0vthh$wEy)m*D%0D*{{ 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

    6qI2M4g?u))xT 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

    Z<>C$jX+igNlck1i92aGPcsGerT* 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 Date: Sun, 27 Dec 2020 20:27:45 +0300 Subject: [PATCH 051/463] Slime caps --- src/main/java/ru/betterend/blocks/BlockJellyshroomCap.java | 4 ++-- .../java/ru/betterend/blocks/BlockUmbrellaTreeMembrane.java | 4 ++-- src/main/resources/assets/betterend/sounds.json | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/BlockJellyshroomCap.java b/src/main/java/ru/betterend/blocks/BlockJellyshroomCap.java index 1da7ed8b..5bd613a8 100644 --- a/src/main/java/ru/betterend/blocks/BlockJellyshroomCap.java +++ b/src/main/java/ru/betterend/blocks/BlockJellyshroomCap.java @@ -6,9 +6,9 @@ import java.util.List; import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.AbstractGlassBlock; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.block.SlimeBlock; import net.minecraft.client.color.block.BlockColorProvider; import net.minecraft.client.color.item.ItemColorProvider; import net.minecraft.item.ItemStack; @@ -22,7 +22,7 @@ import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; import ru.betterend.util.MHelper; -public class BlockJellyshroomCap extends AbstractGlassBlock implements IRenderTypeable, BlockPatterned, IColorProvider { +public class BlockJellyshroomCap extends SlimeBlock implements IRenderTypeable, BlockPatterned, IColorProvider { private final int color; public BlockJellyshroomCap(int r, int g, int b) { diff --git a/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeMembrane.java b/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeMembrane.java index 8b3b5544..61042adf 100644 --- a/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeMembrane.java +++ b/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeMembrane.java @@ -9,10 +9,10 @@ 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.block.AbstractGlassBlock; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.block.SlimeBlock; import net.minecraft.item.ItemPlacementContext; import net.minecraft.item.ItemStack; import net.minecraft.loot.context.LootContext; @@ -31,7 +31,7 @@ import ru.betterend.patterns.Patterns; import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; -public class BlockUmbrellaTreeMembrane extends AbstractGlassBlock implements IRenderTypeable, BlockPatterned { +public class BlockUmbrellaTreeMembrane extends SlimeBlock implements IRenderTypeable, BlockPatterned { public static final IntProperty COLOR = IntProperty.of("color", 0, 7); private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); diff --git a/src/main/resources/assets/betterend/sounds.json b/src/main/resources/assets/betterend/sounds.json index 9ff2a241..39cc2f4f 100644 --- a/src/main/resources/assets/betterend/sounds.json +++ b/src/main/resources/assets/betterend/sounds.json @@ -98,7 +98,7 @@ "stream": false } ] - } + }, "betterend.ambient.foggy_mushroomland": { "category": "ambient", From e741edd739a8140d3015057c633c3ac92ff1c36a Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sun, 27 Dec 2020 22:06:16 +0300 Subject: [PATCH 052/463] Entity config --- src/main/java/ru/betterend/config/Configs.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/ru/betterend/config/Configs.java b/src/main/java/ru/betterend/config/Configs.java index 09fcca40..37019a83 100644 --- a/src/main/java/ru/betterend/config/Configs.java +++ b/src/main/java/ru/betterend/config/Configs.java @@ -1,19 +1,23 @@ package ru.betterend.config; public class Configs { - public static final IdConfig ITEM_CONFIG = new IdConfig("items", (item, category) -> { - return new ConfigKey(item.getNamespace(), category, item.getPath()); + public static final IdConfig ITEM_CONFIG = new IdConfig("items", (itemId, category) -> { + return new ConfigKey(itemId.getNamespace(), category, itemId.getPath()); }); - public static final IdConfig BLOCK_CONFIG = new IdConfig("blocks", (block, category) -> { - return new ConfigKey(block.getNamespace(), category, block.getPath()); + public static final IdConfig BLOCK_CONFIG = new IdConfig("blocks", (blockId, category) -> { + return new ConfigKey(blockId.getNamespace(), category, blockId.getPath()); }); - public static final IdConfig BIOME_CONFIG = new IdConfig("biomes", (biome, entry) -> { - return new ConfigKey(biome.getNamespace(), biome.getPath(), entry); + public static final IdConfig BIOME_CONFIG = new IdConfig("biomes", (biomeId, entry) -> { + return new ConfigKey(biomeId.getNamespace(), biomeId.getPath(), entry); + }); + public static final IdConfig ENTITY_CONFIG = new IdConfig("entities", (entityId, category) -> { + return new ConfigKey(entityId.getNamespace(), category, entityId.getPath()); }); public static void saveConfigs() { ITEM_CONFIG.saveChanges(); BLOCK_CONFIG.saveChanges(); BIOME_CONFIG.saveChanges(); + ENTITY_CONFIG.saveChanges(); } } From b76a6ab99e872eb6f12206359581f4bdf50ddd10 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sun, 27 Dec 2020 22:16:01 +0300 Subject: [PATCH 053/463] Config for entities --- .../ru/betterend/registry/EndEntities.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/ru/betterend/registry/EndEntities.java b/src/main/java/ru/betterend/registry/EndEntities.java index 16924e6d..1201df47 100644 --- a/src/main/java/ru/betterend/registry/EndEntities.java +++ b/src/main/java/ru/betterend/registry/EndEntities.java @@ -9,8 +9,10 @@ import net.minecraft.entity.EntityType.EntityFactory; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.SpawnGroup; import net.minecraft.entity.attribute.DefaultAttributeContainer.Builder; +import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; import ru.betterend.BetterEnd; +import ru.betterend.config.Configs; import ru.betterend.entity.EntityCubozoa; import ru.betterend.entity.EntityDragonfly; import ru.betterend.entity.EntityEndFish; @@ -35,14 +37,22 @@ public class EndEntities { } protected static EntityType register(String name, SpawnGroup group, float width, float height, EntityFactory entity) { - EntityType type = Registry.register(Registry.ENTITY_TYPE, BetterEnd.makeID(name), FabricEntityTypeBuilder.create(group, entity).dimensions(EntityDimensions.fixed(width, height)).build()); + Identifier id = BetterEnd.makeID(name); + EntityType type = FabricEntityTypeBuilder.create(group, entity).dimensions(EntityDimensions.fixed(width, height)).build(); + if (Configs.ENTITY_CONFIG.getBoolean(id, "entities", true)) { + return Registry.register(Registry.ENTITY_TYPE, id, type); + } return type; } private static EntityType register(String name, SpawnGroup group, float width, float height, EntityFactory entity, Builder attributes, boolean fixedSize, int eggColor, int dotsColor) { - EntityType type = Registry.register(Registry.ENTITY_TYPE, BetterEnd.makeID(name), FabricEntityTypeBuilder.create(group, entity).dimensions(fixedSize ? EntityDimensions.fixed(width, height) : EntityDimensions.changing(width, height)).build()); - FabricDefaultAttributeRegistry.register(type, attributes); - EndItems.registerEgg("spawn_egg_" + name, type, eggColor, dotsColor); + Identifier id = BetterEnd.makeID(name); + EntityType type = FabricEntityTypeBuilder.create(group, entity).dimensions(fixedSize ? EntityDimensions.fixed(width, height) : EntityDimensions.changing(width, height)).build(); + if (Configs.ENTITY_CONFIG.getBoolean(id, "entities", true)) { + FabricDefaultAttributeRegistry.register(type, attributes); + EndItems.registerEgg("spawn_egg_" + name, type, eggColor, dotsColor); + return Registry.register(Registry.ENTITY_TYPE, BetterEnd.makeID(name), type); + } return type; } } From b1a0445b19da671ad0d1537f035f51fc11da7ec7 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 27 Dec 2020 22:45:01 +0300 Subject: [PATCH 054/463] Generator changes --- .../common/NoiseChunkGeneratorMixin.java | 61 +++++++++++++++++++ .../resources/betterend.mixins.common.json | 1 + 2 files changed, 62 insertions(+) create mode 100644 src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java diff --git a/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java b/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java new file mode 100644 index 00000000..2397aa91 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java @@ -0,0 +1,61 @@ +package ru.betterend.mixin.common; + +import java.util.Arrays; +import java.util.function.Supplier; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; +import net.minecraft.world.gen.chunk.NoiseChunkGenerator; + +@Mixin(NoiseChunkGenerator.class) +public abstract class NoiseChunkGeneratorMixin { + @Final + @Shadow + protected Supplier settings; + + @Final + @Shadow + private int noiseSizeY; + + /*@Inject(method = "sampleNoise", at = @At("HEAD"), cancellable = true) + private void beSampleEndNoise(int x, int y, int z, double horizontalScale, double verticalScale, double horizontalStretch, double verticalStretch, CallbackInfoReturnable info) { + if (settings.get().equals(ChunkGeneratorSettings.END)) { + double value = ((x + y + z) & 1) == 0 ? 1 : -1; + info.setReturnValue(value); + info.cancel(); + } + }*/ + + @Inject(method = "sampleNoiseColumn([DII)V", at = @At("HEAD"), cancellable = true, allow = 2) + private void beSampleNoiseColumn(double[] buffer, int x, int z, CallbackInfo info) { + if (settings.get().equals(ChunkGeneratorSettings.END)) { + //System.out.println("Replace!"); + //Arrays.fill(buffer, -100); + //Arrays.fill(buffer, 0, buffer.length >> 1, 100); + //info.cancel(); + + float center = buffer.length * 0.5F; + /*float sin = (float) (Math.sin(x * 0.1) * Math.sin(z * 0.1)) * center * 0.5F; + int min = (int) (center - sin); + int max = (int) (center + sin); + if (max > min) { + Arrays.fill(buffer, min, max, 1); + }*/ + + float sin = (float) (Math.sin(x * 0.5) * Math.sin(z * 0.5)) * center * 0.5F; + for (int y = 0; y < buffer.length; y++) { + float value = (y - center); + buffer[y] = sin * 0.01F - Math.abs(value) * 0.01F; + } + + info.cancel(); + } + } +} diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index d8587888..5c843b01 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -8,6 +8,7 @@ "EnchantmentScreenHandlerMixin", "CraftingScreenHandlerMixin", "GenerationSettingsAccessor", + "NoiseChunkGeneratorMixin", "AnvilScreenHandlerMixin", "ServerPlayerEntityMixin", "ChorusPlantFeatureMixin", From 559a1b8d81aa2793655da2a402c9a56709432aa9 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 28 Dec 2020 11:21:32 +0300 Subject: [PATCH 055/463] SDF islands --- .../common/NoiseChunkGeneratorMixin.java | 40 ++----- .../java/ru/betterend/noise/VoronoiNoise.java | 106 ++++++++++++------ .../world/generator/IslandLayer.java | 93 +++++++++++++++ .../world/generator/TerrainGenerator.java | 25 +++++ 4 files changed, 197 insertions(+), 67 deletions(-) create mode 100644 src/main/java/ru/betterend/world/generator/IslandLayer.java create mode 100644 src/main/java/ru/betterend/world/generator/TerrainGenerator.java diff --git a/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java b/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java index 2397aa91..15c45d0e 100644 --- a/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java +++ b/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java @@ -1,6 +1,5 @@ package ru.betterend.mixin.common; -import java.util.Arrays; import java.util.function.Supplier; import org.spongepowered.asm.mixin.Final; @@ -9,10 +8,11 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import net.minecraft.world.biome.source.BiomeSource; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraft.world.gen.chunk.NoiseChunkGenerator; +import ru.betterend.world.generator.TerrainGenerator; @Mixin(NoiseChunkGenerator.class) public abstract class NoiseChunkGeneratorMixin { @@ -20,41 +20,15 @@ public abstract class NoiseChunkGeneratorMixin { @Shadow protected Supplier settings; - @Final - @Shadow - private int noiseSizeY; - - /*@Inject(method = "sampleNoise", at = @At("HEAD"), cancellable = true) - private void beSampleEndNoise(int x, int y, int z, double horizontalScale, double verticalScale, double horizontalStretch, double verticalStretch, CallbackInfoReturnable info) { - if (settings.get().equals(ChunkGeneratorSettings.END)) { - double value = ((x + y + z) & 1) == 0 ? 1 : -1; - info.setReturnValue(value); - info.cancel(); - } - }*/ + @Inject(method = "(Lnet/minecraft/world/biome/source/BiomeSource;Lnet/minecraft/world/biome/source/BiomeSource;JLjava/util/function/Supplier;)V", at = @At("TAIL")) + private void beOnInit(BiomeSource populationSource, BiomeSource biomeSource, long seed, Supplier settings, CallbackInfo info) { + TerrainGenerator.initNoise(seed); + } @Inject(method = "sampleNoiseColumn([DII)V", at = @At("HEAD"), cancellable = true, allow = 2) private void beSampleNoiseColumn(double[] buffer, int x, int z, CallbackInfo info) { if (settings.get().equals(ChunkGeneratorSettings.END)) { - //System.out.println("Replace!"); - //Arrays.fill(buffer, -100); - //Arrays.fill(buffer, 0, buffer.length >> 1, 100); - //info.cancel(); - - float center = buffer.length * 0.5F; - /*float sin = (float) (Math.sin(x * 0.1) * Math.sin(z * 0.1)) * center * 0.5F; - int min = (int) (center - sin); - int max = (int) (center + sin); - if (max > min) { - Arrays.fill(buffer, min, max, 1); - }*/ - - float sin = (float) (Math.sin(x * 0.5) * Math.sin(z * 0.5)) * center * 0.5F; - for (int y = 0; y < buffer.length; y++) { - float value = (y - center); - buffer[y] = sin * 0.01F - Math.abs(value) * 0.01F; - } - + TerrainGenerator.fillTerrainDensity(buffer, x, z); info.cancel(); } } diff --git a/src/main/java/ru/betterend/noise/VoronoiNoise.java b/src/main/java/ru/betterend/noise/VoronoiNoise.java index 9a601f44..cddc7b4d 100644 --- a/src/main/java/ru/betterend/noise/VoronoiNoise.java +++ b/src/main/java/ru/betterend/noise/VoronoiNoise.java @@ -2,19 +2,19 @@ package ru.betterend.noise; import java.util.Random; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.BlockPos; import ru.betterend.util.MHelper; public class VoronoiNoise { private static final Random RANDOM = new Random(); final int seed; - final double scale; - final double separation; + + public VoronoiNoise() { + this(0); + } - public VoronoiNoise(int seed, double side, double separation) { + public VoronoiNoise(int seed) { this.seed = seed; - this.scale = 1.0 / side; - this.separation = MathHelper.clamp(separation, 0, 1); } private int getSeed(int x, int y, int z) { @@ -22,38 +22,76 @@ public class VoronoiNoise { h = (h ^ (h >> 13)) * 1274126177; return h ^ (h >> 16); } - - public double sample(float x, float y, float z) { - return sample(MHelper.floor(x), MHelper.floor(y), MHelper.floor(z)); - } - public double sample(int x, int y, int z) { - double posX = x * scale; - double posY = y * scale; - double posZ = z * scale; - int posXI = MHelper.floor(posX); - int posYI = MHelper.floor(posY); - int posZI = MHelper.floor(posZ); - double distance = Double.MAX_VALUE; - for (int px = -1; px < 2; px++) { - double pointX = posXI + px; - for (int py = -1; py < 2; py++) { - double pointY = posYI + py; - for (int pz = -1; pz < 2; pz++) { - double pointZ = posZI + pz; - RANDOM.setSeed(getSeed(posXI + px, posYI + py, posZI + pz)); - - double posXN = pointX + RANDOM.nextDouble() * separation; - double posYN = pointY + RANDOM.nextDouble() * separation; - double posZN = pointZ + RANDOM.nextDouble() * separation; - - double dist2 = MHelper.lengthSqr(posXN - posX, posYN - posY, posZN - posZ); - if (dist2 < distance) { - distance = dist2; + public double sample(double x, double y, double z) { + int ix = MHelper.floor(x); + int iy = MHelper.floor(y); + int iz = MHelper.floor(z); + + float px = (float) (x - ix); + float py = (float) (y - iy); + float pz = (float) (z - iz); + + float d = 10; + + for (int pox = -1; pox < 2; pox++) { + for (int poy = -1; poy < 2; poy++) { + for (int poz = -1; poz < 2; poz++) { + RANDOM.setSeed(getSeed(pox + ix, poy + iy, poz + iz)); + float pointX = pox + RANDOM.nextFloat(); + float pointY = poy + RANDOM.nextFloat(); + float pointZ = poz + RANDOM.nextFloat(); + float d2 = MHelper.lengthSqr(pointX - px, pointY - py, pointZ - pz); + if (d2 < d) { + d = d2; } } } } - return distance; + + return Math.sqrt(d); + } + + public BlockPos[] getPos(double x, double y, double z, double scale) { + int ix = MHelper.floor(x); + int iy = MHelper.floor(y); + int iz = MHelper.floor(z); + + float px = (float) (x - ix); + float py = (float) (y - iy); + float pz = (float) (z - iz); + + float d = 10; + float selX = 0; + float selY = 0; + float selZ = 0; + float selXPre = 0; + float selYPre = 0; + float selZPre = 0; + + for (int pox = -1; pox < 2; pox++) { + for (int poy = -1; poy < 2; poy++) { + for (int poz = -1; poz < 2; poz++) { + RANDOM.setSeed(getSeed(pox + ix, poy + iy, poz + iz)); + float pointX = pox + RANDOM.nextFloat(); + float pointY = poy + RANDOM.nextFloat(); + float pointZ = poz + RANDOM.nextFloat(); + float d2 = MHelper.lengthSqr(pointX - px, pointY - py, pointZ - pz); + if (d2 < d) { + d = d2; + selXPre = selX; + selYPre = selY; + selZPre = selZ; + selX = pointX; + selY = pointY; + selZ = pointZ; + } + } + } + } + + BlockPos p1 = new BlockPos((ix + (double) selX) * scale, (iy + (double) selY) * scale, (iz + (double) selZ) * scale); + BlockPos p2 = new BlockPos((ix + (double) selXPre) * scale, (iy + (double) selYPre) * scale, (iz + (double) selZPre) * scale); + return new BlockPos[] {p1, p2}; } } diff --git a/src/main/java/ru/betterend/world/generator/IslandLayer.java b/src/main/java/ru/betterend/world/generator/IslandLayer.java new file mode 100644 index 00000000..426c50ca --- /dev/null +++ b/src/main/java/ru/betterend/world/generator/IslandLayer.java @@ -0,0 +1,93 @@ +package ru.betterend.world.generator; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Random; + +import com.google.common.collect.Maps; + +import net.minecraft.util.math.BlockPos; +import ru.betterend.util.MHelper; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.primitive.SDFCapedCone; + +public class IslandLayer { + private static final List POSITIONS = new ArrayList(9); + private static final Random RANDOM = new Random(); + + private final Map islands = Maps.newHashMap(); + private final double distance; + private final int seed; + private final int minY; + private final int maxY; + + public IslandLayer(int seed, double distance, int minY, int maxY) { + this.distance = distance; + this.seed = seed; + this.minY = minY; + this.maxY = maxY; + } + + private int getSeed(int x, int y, int z) { + int h = seed + x * 374761393 + y * 668265263 + z; + h = (h ^ (h >> 13)) * 1274126177; + return h ^ (h >> 16); + } + + private void updatePositions(double x, double y, double z) { + POSITIONS.clear(); + + int ix = MHelper.floor(x / distance); + int iy = MHelper.floor(y / distance); + int iz = MHelper.floor(z / distance); + + for (int pox = -1; pox < 2; pox++) { + int px = pox + ix; + for (int poy = -1; poy < 2; poy++) { + int py = poy + iy; + for (int poz = -1; poz < 2; poz++) { + int pz = poz + iz; + RANDOM.setSeed(getSeed(px, py, pz)); + double posX = (px + RANDOM.nextFloat()) * distance; + double posY = (py + RANDOM.nextFloat()) * distance; + double posZ = (pz + RANDOM.nextFloat()) * distance; + POSITIONS.add(new BlockPos(posX, posY, posZ)); + } + } + } + } + + private SDF getIsland(BlockPos pos) { + SDF island = islands.get(pos); + if (island == null) { + island = new SDFCapedCone().setHeight(10).setRadius1(0).setRadius2(30); + islands.put(pos, island); + } + return island; + } + + private float getRelativeDistance(SDF sdf, BlockPos center, double px, double py, double pz) { + float x = (float) (px - center.getX()); + float y = (float) (py - center.getY()); + float z = (float) (pz - center.getZ()); + return sdf.getDistance(x, y, z); + } + + private float calculateSDF(double x, double y, double z) { + float distance = 10; + for (BlockPos pos: POSITIONS) { + if (pos.getY() > minY && pos.getY() < maxY) { + SDF island = getIsland(pos); + float dist = getRelativeDistance(island, pos, x, y, z); + distance = MHelper.min(distance, dist); + } + } + return distance; + } + + public float getDensity(double x, double y, double z) { + updatePositions(x, y, z); + return -calculateSDF(x, y, z); + } +} diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java new file mode 100644 index 00000000..d5553a45 --- /dev/null +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -0,0 +1,25 @@ +package ru.betterend.world.generator; + +import java.util.Random; + +public class TerrainGenerator { + private static final double SCALE_XZ = 8.0; + private static final double SCALE_Y = 4.0; + + private static IslandLayer layer; + + public static void initNoise(long seed) { + Random random = new Random(seed); + layer = new IslandLayer(random.nextInt(), 100, 40, 90); + } + + public static void fillTerrainDensity(double[] buffer, int x, int z) { + double px = (double) x * SCALE_XZ; + double pz = (double) z * SCALE_XZ; + for (int y = 0; y < buffer.length; y++) { + double py = (double) y * SCALE_Y; + float dist = layer.getDensity(px, py, pz); + buffer[y] = dist; + } + } +} From fe414c1003470c6a37959a2e84cf9601c837cf69 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 28 Dec 2020 16:24:53 +0300 Subject: [PATCH 056/463] Another island shape --- .../world/generator/IslandLayer.java | 86 +++++++++++++------ .../world/generator/TerrainGenerator.java | 46 +++++++++- 2 files changed, 101 insertions(+), 31 deletions(-) diff --git a/src/main/java/ru/betterend/world/generator/IslandLayer.java b/src/main/java/ru/betterend/world/generator/IslandLayer.java index 426c50ca..b840389c 100644 --- a/src/main/java/ru/betterend/world/generator/IslandLayer.java +++ b/src/main/java/ru/betterend/world/generator/IslandLayer.java @@ -8,52 +8,60 @@ import java.util.Random; import com.google.common.collect.Maps; import net.minecraft.util.math.BlockPos; +import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFScale; +import ru.betterend.util.sdf.operator.SDFSmoothUnion; +import ru.betterend.util.sdf.operator.SDFTranslate; +import ru.betterend.util.sdf.operator.SDFUnion; import ru.betterend.util.sdf.primitive.SDFCapedCone; public class IslandLayer { - private static final List POSITIONS = new ArrayList(9); private static final Random RANDOM = new Random(); + private static final SDF ISLAND; + private final List positions = new ArrayList(9); private final Map islands = Maps.newHashMap(); + private final OpenSimplexNoise density; private final double distance; + private final float scale; private final int seed; private final int minY; private final int maxY; - public IslandLayer(int seed, double distance, int minY, int maxY) { + public IslandLayer(int seed, double distance, float scale, int center, int heightVariation) { this.distance = distance; + this.density = new OpenSimplexNoise(seed); + this.scale = scale; this.seed = seed; - this.minY = minY; - this.maxY = maxY; + this.minY = center - heightVariation; + this.maxY = center + heightVariation; } - private int getSeed(int x, int y, int z) { - int h = seed + x * 374761393 + y * 668265263 + z; + private int getSeed(int x, int z) { + int h = seed + x * 374761393 + z * 668265263; h = (h ^ (h >> 13)) * 1274126177; return h ^ (h >> 16); } - private void updatePositions(double x, double y, double z) { - POSITIONS.clear(); + public void updatePositions(double x, double z) { + positions.clear(); int ix = MHelper.floor(x / distance); - int iy = MHelper.floor(y / distance); int iz = MHelper.floor(z / distance); for (int pox = -1; pox < 2; pox++) { int px = pox + ix; - for (int poy = -1; poy < 2; poy++) { - int py = poy + iy; - for (int poz = -1; poz < 2; poz++) { - int pz = poz + iz; - RANDOM.setSeed(getSeed(px, py, pz)); + for (int poz = -1; poz < 2; poz++) { + int pz = poz + iz; + //if (density.eval(px * distance * 0.002, pz * distance * 0.002) > 0) { + RANDOM.setSeed(getSeed(px, pz)); double posX = (px + RANDOM.nextFloat()) * distance; - double posY = (py + RANDOM.nextFloat()) * distance; + double posY = MHelper.randRange(minY, maxY, RANDOM); double posZ = (pz + RANDOM.nextFloat()) * distance; - POSITIONS.add(new BlockPos(posX, posY, posZ)); - } + positions.add(new BlockPos(posX, posY, posZ)); + //} } } } @@ -61,33 +69,55 @@ public class IslandLayer { private SDF getIsland(BlockPos pos) { SDF island = islands.get(pos); if (island == null) { - island = new SDFCapedCone().setHeight(10).setRadius1(0).setRadius2(30); + RANDOM.setSeed(getSeed(pos.getX(), pos.getZ())); + island = new SDFScale().setScale(RANDOM.nextFloat() + 0.5F).setSource(ISLAND); islands.put(pos, island); } return island; } private float getRelativeDistance(SDF sdf, BlockPos center, double px, double py, double pz) { - float x = (float) (px - center.getX()); - float y = (float) (py - center.getY()); - float z = (float) (pz - center.getZ()); + float x = (float) (px - center.getX()) / scale; + float y = (float) (py - center.getY()) / scale; + float z = (float) (pz - center.getZ()) / scale; return sdf.getDistance(x, y, z); } private float calculateSDF(double x, double y, double z) { float distance = 10; - for (BlockPos pos: POSITIONS) { - if (pos.getY() > minY && pos.getY() < maxY) { - SDF island = getIsland(pos); - float dist = getRelativeDistance(island, pos, x, y, z); - distance = MHelper.min(distance, dist); - } + for (BlockPos pos: positions) { + SDF island = getIsland(pos); + float dist = getRelativeDistance(island, pos, x, y, z); + distance = MHelper.min(distance, dist); } return distance; } public float getDensity(double x, double y, double z) { - updatePositions(x, y, z); return -calculateSDF(x, y, z); } + + public void clearCache() { + if (islands.size() > 32) { + islands.clear(); + } + } + + private static SDF makeCone(float radiusBottom, float radiusTop, float height, float minY) { + float hh = height * 0.5F; + SDF sdf = new SDFCapedCone().setHeight(hh).setRadius1(radiusBottom).setRadius2(radiusTop); + return new SDFTranslate().setTranslate(0, minY + hh, 0).setSource(sdf); + } + + static { + SDF cone1 = makeCone(0, 0.4F, 0.2F, -0.3F); + SDF cone2 = makeCone(0.4F, 0.5F, 0.1F, -0.1F); + SDF cone3 = makeCone(0.5F, 0.45F, 0.03F, 0.0F); + SDF cone4 = makeCone(0.45F, 0, 0.02F, 0.03F); + + SDF coneBottom = new SDFUnion().setSourceA(cone1).setSourceB(cone2); + SDF coneTop = new SDFUnion().setSourceA(cone3).setSourceB(cone4); + + ISLAND = new SDFSmoothUnion().setRadius(0.01F).setSourceA(coneTop).setSourceB(coneBottom); + } } diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index d5553a45..873da035 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -2,24 +2,64 @@ package ru.betterend.world.generator; import java.util.Random; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.util.MHelper; + public class TerrainGenerator { private static final double SCALE_XZ = 8.0; private static final double SCALE_Y = 4.0; - private static IslandLayer layer; + private static IslandLayer largeIslands; + private static IslandLayer mediumIslands; + private static IslandLayer smallIslands; + private static OpenSimplexNoise noise1; + private static OpenSimplexNoise noise2; + + private static OpenSimplexNoise continentalTop; + private static OpenSimplexNoise continentalBottom; + private static OpenSimplexNoise continentalSeparator; public static void initNoise(long seed) { Random random = new Random(seed); - layer = new IslandLayer(random.nextInt(), 100, 40, 90); + largeIslands = new IslandLayer(random.nextInt(), 300, 200, 63, 0); + mediumIslands = new IslandLayer(random.nextInt(), 150, 100, 63, 16); + smallIslands = new IslandLayer(random.nextInt(), 60, 50, 63, 32); + noise1 = new OpenSimplexNoise(random.nextInt()); + noise2 = new OpenSimplexNoise(random.nextInt()); + continentalTop = new OpenSimplexNoise(random.nextInt()); + continentalBottom = new OpenSimplexNoise(random.nextInt()); + continentalSeparator = new OpenSimplexNoise(random.nextInt()); } public static void fillTerrainDensity(double[] buffer, int x, int z) { + largeIslands.clearCache(); + double px = (double) x * SCALE_XZ; double pz = (double) z * SCALE_XZ; + + largeIslands.updatePositions(px, pz); + for (int y = 0; y < buffer.length; y++) { double py = (double) y * SCALE_Y; - float dist = layer.getDensity(px, py, pz); + //float dist = getContinental(px, py, pz); + //dist = dist > 1 ? dist : MHelper.max(dist, largeIslands.getDensity(px, py, pz)); + float dist = largeIslands.getDensity(px, py, pz); + dist = dist > 1 ? dist : MHelper.max(dist, mediumIslands.getDensity(px, py, pz)); + dist = dist > 1 ? dist : MHelper.max(dist, smallIslands.getDensity(px, py, pz)); + if (dist > -0.5F) { + dist += noise1.eval(px * 0.01, py * 0.01, pz * 0.01) * 0.04; + dist += noise2.eval(px * 0.05, py * 0.05, pz * 0.05) * 0.02; + dist += noise1.eval(px * 0.1, py * 0.1, pz * 0.1) * 0.01; + } buffer[y] = dist; } } + + private static float getContinental(double px, double py, double pz) { + float gradient = ((float) py - 50F) * 0.01F; + float top = (float) continentalTop.eval(px * 0.04, py * 0.04, pz * 0.04) * 0.1F - gradient; + float bottom = (float) continentalBottom.eval(px * 0.01, py * 0.01, pz * 0.01) * 0.5F + gradient; + float separate = (float) Math.abs(continentalSeparator.eval(px * 0.002, py * 0.002, pz * 0.002)); + return MHelper.min(top, bottom) * (separate * separate) + (float) noise2.eval(px * 0.1, py * 0.1, pz * 0.1) * 0.06F; + } } From 9a41dc8670a1bdd84c9968673f21df67638612ad Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 28 Dec 2020 17:35:03 +0300 Subject: [PATCH 057/463] New generator fixes & biome gen --- .../blocks/BlockVentBubbleColumn.java | 1 - .../client/NamespaceResourceManagerMixin.java | 2 +- .../common/NoiseChunkGeneratorMixin.java | 6 +- .../recipe/builders/AlloyingRecipe.java | 2 - .../recipe/builders/AnvilSmithingRecipe.java | 1 - .../recipe/builders/InfusionRecipe.java | 1 - .../world/generator/BetterEndBiomeSource.java | 19 ++++- .../world/generator/IslandLayer.java | 10 ++- .../world/generator/TerrainGenerator.java | 76 ++++++++++++++----- 9 files changed, 86 insertions(+), 32 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/BlockVentBubbleColumn.java b/src/main/java/ru/betterend/blocks/BlockVentBubbleColumn.java index 0d483bee..7391c96b 100644 --- a/src/main/java/ru/betterend/blocks/BlockVentBubbleColumn.java +++ b/src/main/java/ru/betterend/blocks/BlockVentBubbleColumn.java @@ -29,7 +29,6 @@ import net.minecraft.world.BlockView; import net.minecraft.world.World; import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; - import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; diff --git a/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java b/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java index b23538f5..0bb4451a 100644 --- a/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java @@ -9,6 +9,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At.Shift; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + import com.google.common.collect.Lists; import net.minecraft.block.Block; @@ -17,7 +18,6 @@ import net.minecraft.resource.Resource; import net.minecraft.resource.ResourcePack; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; - import ru.betterend.BetterEnd; import ru.betterend.patterns.BlockPatterned; diff --git a/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java b/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java index 15c45d0e..c0c9ea7e 100644 --- a/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java +++ b/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java @@ -28,8 +28,10 @@ public abstract class NoiseChunkGeneratorMixin { @Inject(method = "sampleNoiseColumn([DII)V", at = @At("HEAD"), cancellable = true, allow = 2) private void beSampleNoiseColumn(double[] buffer, int x, int z, CallbackInfo info) { if (settings.get().equals(ChunkGeneratorSettings.END)) { - TerrainGenerator.fillTerrainDensity(buffer, x, z); - info.cancel(); + if (TerrainGenerator.canGenerate(x, z)) { + TerrainGenerator.fillTerrainDensity(buffer, x, z); + info.cancel(); + } } } } diff --git a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java index 7ea3597c..e139ac16 100644 --- a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java @@ -5,7 +5,6 @@ import com.google.gson.JsonObject; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; - import net.minecraft.inventory.Inventory; import net.minecraft.item.Item; import net.minecraft.item.ItemConvertible; @@ -20,7 +19,6 @@ import net.minecraft.util.Identifier; import net.minecraft.util.JsonHelper; import net.minecraft.util.collection.DefaultedList; import net.minecraft.world.World; - import ru.betterend.BetterEnd; import ru.betterend.recipe.EndRecipeManager; import ru.betterend.registry.EndBlocks; diff --git a/src/main/java/ru/betterend/recipe/builders/AnvilSmithingRecipe.java b/src/main/java/ru/betterend/recipe/builders/AnvilSmithingRecipe.java index 82a5e273..fb07983d 100644 --- a/src/main/java/ru/betterend/recipe/builders/AnvilSmithingRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AnvilSmithingRecipe.java @@ -20,7 +20,6 @@ import net.minecraft.util.Identifier; import net.minecraft.util.JsonHelper; import net.minecraft.util.collection.DefaultedList; import net.minecraft.world.World; - import ru.betterend.BetterEnd; import ru.betterend.recipe.EndRecipeManager; import ru.betterend.registry.EndTags; diff --git a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java index a1cdb87d..20574831 100644 --- a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java @@ -15,7 +15,6 @@ import net.minecraft.util.Identifier; import net.minecraft.util.JsonHelper; import net.minecraft.util.collection.DefaultedList; import net.minecraft.world.World; - import ru.betterend.BetterEnd; import ru.betterend.recipe.EndRecipeManager; import ru.betterend.rituals.InfusionRitual; diff --git a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java index 6d626395..7d9b253b 100644 --- a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java +++ b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java @@ -13,14 +13,12 @@ import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome.Category; import net.minecraft.world.biome.BiomeKeys; import net.minecraft.world.biome.source.BiomeSource; -import net.minecraft.world.biome.source.TheEndBiomeSource; import net.minecraft.world.gen.ChunkRandom; import ru.betterend.BetterEnd; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndTags; import ru.betterend.util.FeaturesHelper; -import ru.betterend.world.biome.EndBiome; public class BetterEndBiomeSource extends BiomeSource { public static final Codec CODEC = RecordCodecBuilder.create((instance) -> { @@ -38,6 +36,8 @@ public class BetterEndBiomeSource extends BiomeSource { private BiomeMap mapLand; private BiomeMap mapVoid; private final long seed; + private int preY = -1; + boolean preLand = false; public BetterEndBiomeSource(Registry biomeRegistry, long seed) { super(getBiomes(biomeRegistry)); @@ -74,6 +74,19 @@ public class BetterEndBiomeSource extends BiomeSource { long j = (long) biomeZ * (long) biomeZ; if (i + j <= 65536L) return this.centerBiome; + if (biomeX == 0 && biomeZ == 0) { + mapLand.clearCache(); + mapVoid.clearCache(); + } + + if (TerrainGenerator.isLand(biomeX, biomeZ)) { + return mapLand.getBiome(biomeX << 2, biomeZ << 2).getActualBiome(); + } + else { + return mapVoid.getBiome(biomeX << 2, biomeZ << 2).getActualBiome(); + } + + /* float height = TheEndBiomeSource.getNoiseAt(noise, (biomeX >> 1) + 1, (biomeZ >> 1) + 1) + (float) SMALL_NOISE.eval(biomeX, biomeZ) * 5; if (height > -20F && height < -5F) { @@ -85,7 +98,7 @@ public class BetterEndBiomeSource extends BiomeSource { mapLand.clearCache(); mapVoid.clearCache(); } - return endBiome.getActualBiome(); + return endBiome.getActualBiome();*/ } @Override diff --git a/src/main/java/ru/betterend/world/generator/IslandLayer.java b/src/main/java/ru/betterend/world/generator/IslandLayer.java index b840389c..e2d51d8b 100644 --- a/src/main/java/ru/betterend/world/generator/IslandLayer.java +++ b/src/main/java/ru/betterend/world/generator/IslandLayer.java @@ -29,6 +29,7 @@ public class IslandLayer { private final int seed; private final int minY; private final int maxY; + private final long center; public IslandLayer(int seed, double distance, float scale, int center, int heightVariation) { this.distance = distance; @@ -37,6 +38,7 @@ public class IslandLayer { this.seed = seed; this.minY = center - heightVariation; this.maxY = center + heightVariation; + this.center = MHelper.floor(1000 / distance); } private int getSeed(int x, int z) { @@ -55,13 +57,15 @@ public class IslandLayer { int px = pox + ix; for (int poz = -1; poz < 2; poz++) { int pz = poz + iz; - //if (density.eval(px * distance * 0.002, pz * distance * 0.002) > 0) { + if ((long) px + (long) pz > center) { RANDOM.setSeed(getSeed(px, pz)); double posX = (px + RANDOM.nextFloat()) * distance; double posY = MHelper.randRange(minY, maxY, RANDOM); double posZ = (pz + RANDOM.nextFloat()) * distance; - positions.add(new BlockPos(posX, posY, posZ)); - //} + if (density.eval(posX * 0.01, posZ * 0.01) > 0) { + positions.add(new BlockPos(posX, posY, posZ)); + } + } } } } diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index 873da035..56d94743 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -1,13 +1,16 @@ package ru.betterend.world.generator; import java.util.Random; +import java.util.concurrent.locks.ReentrantLock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; public class TerrainGenerator { + private static final ReentrantLock LOCKER = new ReentrantLock(); private static final double SCALE_XZ = 8.0; private static final double SCALE_Y = 4.0; + private static final int CENTER = MHelper.floor(500 / SCALE_XZ); private static IslandLayer largeIslands; private static IslandLayer mediumIslands; @@ -15,10 +18,6 @@ public class TerrainGenerator { private static OpenSimplexNoise noise1; private static OpenSimplexNoise noise2; - private static OpenSimplexNoise continentalTop; - private static OpenSimplexNoise continentalBottom; - private static OpenSimplexNoise continentalSeparator; - public static void initNoise(long seed) { Random random = new Random(seed); largeIslands = new IslandLayer(random.nextInt(), 300, 200, 63, 0); @@ -26,23 +25,30 @@ public class TerrainGenerator { smallIslands = new IslandLayer(random.nextInt(), 60, 50, 63, 32); noise1 = new OpenSimplexNoise(random.nextInt()); noise2 = new OpenSimplexNoise(random.nextInt()); - continentalTop = new OpenSimplexNoise(random.nextInt()); - continentalBottom = new OpenSimplexNoise(random.nextInt()); - continentalSeparator = new OpenSimplexNoise(random.nextInt()); + } + + public static boolean canGenerate(int x, int z) { + return (long) x + (long) z > CENTER; } public static void fillTerrainDensity(double[] buffer, int x, int z) { - largeIslands.clearCache(); + LOCKER.lock(); - double px = (double) x * SCALE_XZ; - double pz = (double) z * SCALE_XZ; + largeIslands.clearCache(); + mediumIslands.clearCache(); + smallIslands.clearCache(); + + double distortion1 = noise1.eval(x * 0.1, z * 0.1) * 20 + noise2.eval(x * 0.2, z * 0.2) * 10 + noise1.eval(x * 0.4, z * 0.4) * 5; + double distortion2 = noise2.eval(x * 0.1, z * 0.1) * 20 + noise1.eval(x * 0.2, z * 0.2) * 10 + noise2.eval(x * 0.4, z * 0.4) * 5; + double px = (double) x * SCALE_XZ + distortion1; + double pz = (double) z * SCALE_XZ + distortion2; largeIslands.updatePositions(px, pz); + mediumIslands.updatePositions(px, pz); + smallIslands.updatePositions(px, pz); for (int y = 0; y < buffer.length; y++) { double py = (double) y * SCALE_Y; - //float dist = getContinental(px, py, pz); - //dist = dist > 1 ? dist : MHelper.max(dist, largeIslands.getDensity(px, py, pz)); float dist = largeIslands.getDensity(px, py, pz); dist = dist > 1 ? dist : MHelper.max(dist, mediumIslands.getDensity(px, py, pz)); dist = dist > 1 ? dist : MHelper.max(dist, smallIslands.getDensity(px, py, pz)); @@ -53,13 +59,47 @@ public class TerrainGenerator { } buffer[y] = dist; } + + LOCKER.unlock(); } - private static float getContinental(double px, double py, double pz) { - float gradient = ((float) py - 50F) * 0.01F; - float top = (float) continentalTop.eval(px * 0.04, py * 0.04, pz * 0.04) * 0.1F - gradient; - float bottom = (float) continentalBottom.eval(px * 0.01, py * 0.01, pz * 0.01) * 0.5F + gradient; - float separate = (float) Math.abs(continentalSeparator.eval(px * 0.002, py * 0.002, pz * 0.002)); - return MHelper.min(top, bottom) * (separate * separate) + (float) noise2.eval(px * 0.1, py * 0.1, pz * 0.1) * 0.06F; + /** + * Check if this is land + * @param x - biome pos x + * @param z - biome pos z + */ + public static boolean isLand(int x, int z) { + LOCKER.lock(); + + x >>= 1; + z >>= 1; + + double distortion1 = noise1.eval(x * 0.1, z * 0.1) * 20 + noise2.eval(x * 0.2, z * 0.2) * 10 + noise1.eval(x * 0.4, z * 0.4) * 5; + double distortion2 = noise2.eval(x * 0.1, z * 0.1) * 20 + noise1.eval(x * 0.2, z * 0.2) * 10 + noise2.eval(x * 0.4, z * 0.4) * 5; + double px = (double) x * SCALE_XZ + distortion1; + double pz = (double) z * SCALE_XZ + distortion2; + + largeIslands.updatePositions(px, pz); + mediumIslands.updatePositions(px, pz); + smallIslands.updatePositions(px, pz); + + for (int y = 0; y < 32; y++) { + double py = (double) y * SCALE_Y; + float dist = largeIslands.getDensity(px, py, pz); + dist = dist > 1 ? dist : MHelper.max(dist, mediumIslands.getDensity(px, py, pz)); + dist = dist > 1 ? dist : MHelper.max(dist, smallIslands.getDensity(px, py, pz)); + if (dist > -0.5F) { + dist += noise1.eval(px * 0.01, py * 0.01, pz * 0.01) * 0.04; + dist += noise2.eval(px * 0.05, py * 0.05, pz * 0.05) * 0.02; + dist += noise1.eval(px * 0.1, py * 0.1, pz * 0.1) * 0.01; + } + if (dist > 0) { + LOCKER.unlock(); + return true; + } + } + + LOCKER.unlock(); + return false; } } From 078139a26f5bec3e699a7605b74ab0abd84ede8b Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 28 Dec 2020 17:59:00 +0300 Subject: [PATCH 058/463] Generator config --- src/main/java/ru/betterend/BetterEnd.java | 2 + .../java/ru/betterend/config/Configs.java | 4 ++ .../common/NoiseChunkGeneratorMixin.java | 2 +- .../world/generator/BetterEndBiomeSource.java | 39 +++++++++---------- .../world/generator/TerrainGenerator.java | 19 ++++++++- 5 files changed, 44 insertions(+), 22 deletions(-) diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index 99121e62..9d0ffa19 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -27,6 +27,7 @@ import ru.betterend.registry.EndTags; import ru.betterend.util.BonemealUtil; import ru.betterend.util.Logger; import ru.betterend.world.generator.BetterEndBiomeSource; +import ru.betterend.world.generator.TerrainGenerator; import ru.betterend.world.surface.SurfaceBuilders; public class BetterEnd implements ModInitializer { @@ -54,6 +55,7 @@ public class BetterEnd implements ModInitializer { EndStructures.register(); Integrations.register(); BonemealUtil.init(); + TerrainGenerator.init(); if (hasGuideBook()) { GuideBook.register(); diff --git a/src/main/java/ru/betterend/config/Configs.java b/src/main/java/ru/betterend/config/Configs.java index 37019a83..6968cb1c 100644 --- a/src/main/java/ru/betterend/config/Configs.java +++ b/src/main/java/ru/betterend/config/Configs.java @@ -13,11 +13,15 @@ public class Configs { public static final IdConfig ENTITY_CONFIG = new IdConfig("entities", (entityId, category) -> { return new ConfigKey(entityId.getNamespace(), category, entityId.getPath()); }); + public static final IdConfig GENERATOR_CONFIG = new IdConfig("generator", (entityId, category) -> { + return new ConfigKey(entityId.getNamespace(), category, entityId.getPath()); + }); public static void saveConfigs() { ITEM_CONFIG.saveChanges(); BLOCK_CONFIG.saveChanges(); BIOME_CONFIG.saveChanges(); ENTITY_CONFIG.saveChanges(); + GENERATOR_CONFIG.saveChanges(); } } diff --git a/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java b/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java index c0c9ea7e..695603f5 100644 --- a/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java +++ b/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java @@ -27,7 +27,7 @@ public abstract class NoiseChunkGeneratorMixin { @Inject(method = "sampleNoiseColumn([DII)V", at = @At("HEAD"), cancellable = true, allow = 2) private void beSampleNoiseColumn(double[] buffer, int x, int z, CallbackInfo info) { - if (settings.get().equals(ChunkGeneratorSettings.END)) { + if (TerrainGenerator.useNewGenerator() && settings.get().equals(ChunkGeneratorSettings.END)) { if (TerrainGenerator.canGenerate(x, z)) { TerrainGenerator.fillTerrainDensity(buffer, x, z); info.cancel(); diff --git a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java index 7d9b253b..a99d4c03 100644 --- a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java +++ b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java @@ -13,12 +13,14 @@ import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome.Category; import net.minecraft.world.biome.BiomeKeys; import net.minecraft.world.biome.source.BiomeSource; +import net.minecraft.world.biome.source.TheEndBiomeSource; import net.minecraft.world.gen.ChunkRandom; import ru.betterend.BetterEnd; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndTags; import ru.betterend.util.FeaturesHelper; +import ru.betterend.world.biome.EndBiome; public class BetterEndBiomeSource extends BiomeSource { public static final Codec CODEC = RecordCodecBuilder.create((instance) -> { @@ -36,8 +38,6 @@ public class BetterEndBiomeSource extends BiomeSource { private BiomeMap mapLand; private BiomeMap mapVoid; private final long seed; - private int preY = -1; - boolean preLand = false; public BetterEndBiomeSource(Registry biomeRegistry, long seed) { super(getBiomes(biomeRegistry)); @@ -70,35 +70,34 @@ public class BetterEndBiomeSource extends BiomeSource { @Override public Biome getBiomeForNoiseGen(int biomeX, int biomeY, int biomeZ) { + boolean hasVoid = !TerrainGenerator.useNewGenerator() || !TerrainGenerator.noRingVoid(); long i = (long) biomeX * (long) biomeX; long j = (long) biomeZ * (long) biomeZ; - if (i + j <= 65536L) return this.centerBiome; + if (hasVoid && i + j <= 65536L) return this.centerBiome; if (biomeX == 0 && biomeZ == 0) { mapLand.clearCache(); mapVoid.clearCache(); } - if (TerrainGenerator.isLand(biomeX, biomeZ)) { - return mapLand.getBiome(biomeX << 2, biomeZ << 2).getActualBiome(); + if (TerrainGenerator.useNewGenerator()) { + if (TerrainGenerator.isLand(biomeX, biomeZ)) { + return mapLand.getBiome(biomeX << 2, biomeZ << 2).getActualBiome(); + } + else { + return mapVoid.getBiome(biomeX << 2, biomeZ << 2).getActualBiome(); + } } else { - return mapVoid.getBiome(biomeX << 2, biomeZ << 2).getActualBiome(); + float height = TheEndBiomeSource.getNoiseAt(noise, (biomeX >> 1) + 1, (biomeZ >> 1) + 1) + (float) SMALL_NOISE.eval(biomeX, biomeZ) * 5; + + if (height > -20F && height < -5F) { + return barrens; + } + + EndBiome endBiome = height < -10F ? mapVoid.getBiome(biomeX << 2, biomeZ << 2) : mapLand.getBiome(biomeX << 2, biomeZ << 2); + return endBiome.getActualBiome(); } - - /* - float height = TheEndBiomeSource.getNoiseAt(noise, (biomeX >> 1) + 1, (biomeZ >> 1) + 1) + (float) SMALL_NOISE.eval(biomeX, biomeZ) * 5; - - if (height > -20F && height < -5F) { - return barrens; - } - - EndBiome endBiome = height < -10F ? mapVoid.getBiome(biomeX << 2, biomeZ << 2) : mapLand.getBiome(biomeX << 2, biomeZ << 2); - if (biomeX == 0 && biomeZ == 0) { - mapLand.clearCache(); - mapVoid.clearCache(); - } - return endBiome.getActualBiome();*/ } @Override diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index 56d94743..0deec947 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -3,6 +3,8 @@ package ru.betterend.world.generator; import java.util.Random; import java.util.concurrent.locks.ReentrantLock; +import net.minecraft.util.Identifier; +import ru.betterend.config.Configs; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; @@ -17,6 +19,13 @@ public class TerrainGenerator { private static IslandLayer smallIslands; private static OpenSimplexNoise noise1; private static OpenSimplexNoise noise2; + private static boolean newGenerator; + private static boolean noRingVoid; + + public static void init() { + newGenerator = Configs.GENERATOR_CONFIG.getBoolean(new Identifier("generator", "enabled"), "useNewGenerator", true); + noRingVoid = Configs.GENERATOR_CONFIG.getBoolean(new Identifier("generator", "enabled"), "noRingVoid", false); + } public static void initNoise(long seed) { Random random = new Random(seed); @@ -28,7 +37,15 @@ public class TerrainGenerator { } public static boolean canGenerate(int x, int z) { - return (long) x + (long) z > CENTER; + return noRingVoid || (long) x + (long) z > CENTER; + } + + public static boolean noRingVoid() { + return noRingVoid; + } + + public static boolean useNewGenerator() { + return newGenerator; } public static void fillTerrainDensity(double[] buffer, int x, int z) { From a794498891ea547819420061aa428f898a4f7dd0 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 28 Dec 2020 18:06:39 +0300 Subject: [PATCH 059/463] Generator config --- .../java/ru/betterend/config/Configs.java | 6 +- .../ru/betterend/config/SimpleConfig.java | 256 ++++++++++++++++++ .../world/generator/TerrainGenerator.java | 5 +- 3 files changed, 260 insertions(+), 7 deletions(-) create mode 100644 src/main/java/ru/betterend/config/SimpleConfig.java diff --git a/src/main/java/ru/betterend/config/Configs.java b/src/main/java/ru/betterend/config/Configs.java index 6968cb1c..28b46600 100644 --- a/src/main/java/ru/betterend/config/Configs.java +++ b/src/main/java/ru/betterend/config/Configs.java @@ -13,15 +13,13 @@ public class Configs { public static final IdConfig ENTITY_CONFIG = new IdConfig("entities", (entityId, category) -> { return new ConfigKey(entityId.getNamespace(), category, entityId.getPath()); }); - public static final IdConfig GENERATOR_CONFIG = new IdConfig("generator", (entityId, category) -> { - return new ConfigKey(entityId.getNamespace(), category, entityId.getPath()); - }); + public static final SimpleConfig GENERATOR_CONFIG = new SimpleConfig("generator"); public static void saveConfigs() { ITEM_CONFIG.saveChanges(); BLOCK_CONFIG.saveChanges(); BIOME_CONFIG.saveChanges(); ENTITY_CONFIG.saveChanges(); - GENERATOR_CONFIG.saveChanges(); + GENERATOR_CONFIG.save(); } } diff --git a/src/main/java/ru/betterend/config/SimpleConfig.java b/src/main/java/ru/betterend/config/SimpleConfig.java new file mode 100644 index 00000000..47974e0b --- /dev/null +++ b/src/main/java/ru/betterend/config/SimpleConfig.java @@ -0,0 +1,256 @@ +package ru.betterend.config; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.Reader; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map.Entry; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; + +import ru.betterend.BetterEnd; + +public final class SimpleConfig { + private boolean rewrite = false; + private final String name; + private JsonObject config; + + public SimpleConfig(String name) { + this.name = name; + } + + private void load() { + if (config == null) { + File file = getFolder(); + if (!file.exists()) + file.mkdirs(); + file = getFile(); + if (file.exists()) { + Gson gson = new Gson(); + try { + Reader reader = new FileReader(file); + config = gson.fromJson(reader, JsonObject.class); + if (config == null) { + config = new JsonObject(); + rewrite = true; + } + else { + rewrite = false; + } + } + catch (FileNotFoundException e) { + e.printStackTrace(); + config = new JsonObject(); + rewrite = true; + } + } + else { + config = new JsonObject(); + rewrite = true; + } + } + } + + public void save() { + if (rewrite) { + File file = getFolder(); + if (!file.exists()) + file.mkdirs(); + file = getFile(); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + try { + FileWriter writer = new FileWriter(file); + String gstring = gson.toJson(config); + writer.write(gstring); + writer.flush(); + writer.close(); + rewrite = false; + } + catch (IOException e) { + e.printStackTrace(); + } + } + } + + private File getFile() { + return new File(String.format("./config/%s/%s.json", BetterEnd.MOD_ID, name)); + } + + private File getFolder() { + return new File("./config/" + BetterEnd.MOD_ID + "/"); + } + + public boolean getBoolean(String groups, String name, boolean def) { + load(); + name += "[def: " + def + "]"; + + JsonObject group = getGroup(groups); + JsonElement element = group.get(name); + + if (element != null) { + return element.getAsBoolean(); + } + else { + group.addProperty(name, def); + rewrite = true; + return def; + } + } + + public void setBoolean(String groups, String name, boolean def, boolean value) { + name += "[def: " + def + "]"; + + JsonObject group = getGroup(groups); + group.addProperty(name, value); + + rewrite = true; + } + + public float getFloat(String groups, String name, float def) { + load(); + name += "[def: " + def + "]"; + + JsonObject group = getGroup(groups); + JsonElement element = group.get(name); + + if (element != null) { + return element.getAsFloat(); + } + else { + group.addProperty(name, def); + rewrite = true; + return def; + } + } + + public void setFloat(String groups, String name, float def, float value) { + name += "[def: " + def + "]"; + + JsonObject group = getGroup(groups); + group.addProperty(name, value); + + rewrite = true; + } + + public int getInt(String groups, String name, int def) { + load(); + name += "[def: " + def + "]"; + + JsonObject group = getGroup(groups); + JsonElement element = group.get(name); + + if (element != null) { + return element.getAsInt(); + } + else { + group.addProperty(name, def); + rewrite = true; + return def; + } + } + + public String getString(String groups, String name, String def) { + load(); + name += "[def: " + def + "]"; + + JsonObject group = getGroup(groups); + JsonElement element = group.get(name); + + if (element != null) { + return element.getAsString(); + } + else { + group.addProperty(name, def); + rewrite = true; + return def; + } + } + + public void setInt(String groups, String name, int def, int value) { + name += "[def: " + def + "]"; + + JsonObject group = getGroup(groups); + group.addProperty(name, value); + + rewrite = true; + } + + public void setStringLoad(String groups, String name, String value) { + JsonObject group = getGroup(groups); + group.addProperty(name, value); + } + + public String[] getStringArray(String groups, String name, String[] def) { + load(); + + JsonObject group = getGroup(groups); + JsonElement element = group.get(name); + + if (element != null) { + return toStringArray(element.getAsJsonArray()); + } + else { + group.add(name, toJsonArray(def)); + rewrite = true; + return def; + } + } + + private String[] toStringArray(JsonArray array) { + load(); + String[] result = new String[array.size()]; + for (int i = 0; i < array.size(); i++) + result[i] = array.get(i).getAsString(); + return result; + } + + private JsonArray toJsonArray(String[] array) { + load(); + JsonArray result = new JsonArray(); + for (String s : array) + result.add(s); + return result; + } + + public JsonObject getGroup(String groups) { + JsonObject obj = config; + String[] groupsArr = groups.split("\\."); + for (String group : groupsArr) { + JsonObject jGroup = obj.getAsJsonObject(group); + if (jGroup == null) { + jGroup = new JsonObject(); + obj.add(group, jGroup); + } + obj = jGroup; + } + return obj; + } + + public List getBaseGroups() { + List groups = new ArrayList(); + Iterator> iterator = config.entrySet().iterator(); + iterator.forEachRemaining((element) -> { + groups.add(element.getKey()); + }); + return groups; + } + + public List> getGroupMembers(JsonObject group) { + List> result = new ArrayList>(); + result.addAll(group.entrySet()); + return result; + } + + public void markToSave() { + rewrite = true; + } +} diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index 0deec947..35a09509 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -3,7 +3,6 @@ package ru.betterend.world.generator; import java.util.Random; import java.util.concurrent.locks.ReentrantLock; -import net.minecraft.util.Identifier; import ru.betterend.config.Configs; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; @@ -23,8 +22,8 @@ public class TerrainGenerator { private static boolean noRingVoid; public static void init() { - newGenerator = Configs.GENERATOR_CONFIG.getBoolean(new Identifier("generator", "enabled"), "useNewGenerator", true); - noRingVoid = Configs.GENERATOR_CONFIG.getBoolean(new Identifier("generator", "enabled"), "noRingVoid", false); + newGenerator = Configs.GENERATOR_CONFIG.getBoolean("generator", "useNewGenerator", true); + noRingVoid = Configs.GENERATOR_CONFIG.getBoolean("generator", "noRingVoid", false); } public static void initNoise(long seed) { From fedabca931bb40954694db8027d5af3b88fa8fba Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 28 Dec 2020 18:36:08 +0300 Subject: [PATCH 060/463] Generator config --- .../java/ru/betterend/world/generator/TerrainGenerator.java | 2 +- .../java/ru/betterend/world/structures/piece/LakePiece.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index 35a09509..abe22eca 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -22,7 +22,7 @@ public class TerrainGenerator { private static boolean noRingVoid; public static void init() { - newGenerator = Configs.GENERATOR_CONFIG.getBoolean("generator", "useNewGenerator", true); + newGenerator = Configs.GENERATOR_CONFIG.getBoolean("generator", "useNewGenerator", false); noRingVoid = Configs.GENERATOR_CONFIG.getBoolean("generator", "noRingVoid", false); } diff --git a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java index 0079914e..99bc37df 100644 --- a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java @@ -196,7 +196,7 @@ public class LakePiece extends BasePiece { return -20; } h = world.getTopY(Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); - if (h < 57) { + if (h < 57 || h > 64) { heightmap.put(p, -20); return -20; } From 5fdc1d8b93bba97d4cf22bcbee88d30ca129e87c Mon Sep 17 00:00:00 2001 From: Aleksey Date: Mon, 28 Dec 2020 21:54:03 +0300 Subject: [PATCH 061/463] Configs --- .../java/ru/betterend/config/CategoryConfig.java | 10 ++++++++++ src/main/java/ru/betterend/config/Configs.java | 16 ++++------------ .../java/ru/betterend/config/EntryConfig.java | 10 ++++++++++ src/main/java/ru/betterend/config/IdConfig.java | 4 ++-- 4 files changed, 26 insertions(+), 14 deletions(-) create mode 100644 src/main/java/ru/betterend/config/CategoryConfig.java create mode 100644 src/main/java/ru/betterend/config/EntryConfig.java diff --git a/src/main/java/ru/betterend/config/CategoryConfig.java b/src/main/java/ru/betterend/config/CategoryConfig.java new file mode 100644 index 00000000..b341b2eb --- /dev/null +++ b/src/main/java/ru/betterend/config/CategoryConfig.java @@ -0,0 +1,10 @@ +package ru.betterend.config; + +public class CategoryConfig extends IdConfig { + + public CategoryConfig(String group) { + super(group, (id, category) -> { + return new ConfigKey(id.getNamespace(), category, id.getPath()); + }); + } +} diff --git a/src/main/java/ru/betterend/config/Configs.java b/src/main/java/ru/betterend/config/Configs.java index 28b46600..6bef1de2 100644 --- a/src/main/java/ru/betterend/config/Configs.java +++ b/src/main/java/ru/betterend/config/Configs.java @@ -1,18 +1,10 @@ package ru.betterend.config; public class Configs { - public static final IdConfig ITEM_CONFIG = new IdConfig("items", (itemId, category) -> { - return new ConfigKey(itemId.getNamespace(), category, itemId.getPath()); - }); - public static final IdConfig BLOCK_CONFIG = new IdConfig("blocks", (blockId, category) -> { - return new ConfigKey(blockId.getNamespace(), category, blockId.getPath()); - }); - public static final IdConfig BIOME_CONFIG = new IdConfig("biomes", (biomeId, entry) -> { - return new ConfigKey(biomeId.getNamespace(), biomeId.getPath(), entry); - }); - public static final IdConfig ENTITY_CONFIG = new IdConfig("entities", (entityId, category) -> { - return new ConfigKey(entityId.getNamespace(), category, entityId.getPath()); - }); + public static final IdConfig ITEM_CONFIG = new CategoryConfig("items"); + public static final IdConfig BLOCK_CONFIG = new CategoryConfig("blocks"); + public static final IdConfig ENTITY_CONFIG = new CategoryConfig("entities"); + public static final IdConfig BIOME_CONFIG = new EntryConfig("biomes"); public static final SimpleConfig GENERATOR_CONFIG = new SimpleConfig("generator"); public static void saveConfigs() { diff --git a/src/main/java/ru/betterend/config/EntryConfig.java b/src/main/java/ru/betterend/config/EntryConfig.java new file mode 100644 index 00000000..88ef5f5a --- /dev/null +++ b/src/main/java/ru/betterend/config/EntryConfig.java @@ -0,0 +1,10 @@ +package ru.betterend.config; + +public class EntryConfig extends IdConfig { + + public EntryConfig(String group) { + super(group, (id, entry) -> { + return new ConfigKey(id.getNamespace(), id.getPath(), entry); + }); + } +} diff --git a/src/main/java/ru/betterend/config/IdConfig.java b/src/main/java/ru/betterend/config/IdConfig.java index 1248b5f8..6fdd03ad 100644 --- a/src/main/java/ru/betterend/config/IdConfig.java +++ b/src/main/java/ru/betterend/config/IdConfig.java @@ -11,7 +11,7 @@ import ru.betterend.config.ConfigKeeper.IntegerRange; public class IdConfig extends Config { - private final BiFunction keyFactory; + protected final BiFunction keyFactory; public IdConfig(String group, BiFunction keyFactory) { super(group); @@ -21,7 +21,7 @@ public class IdConfig extends Config { @Override protected void registerEntries() {} - private ConfigKey createKey(Identifier id, String key) { + protected ConfigKey createKey(Identifier id, String key) { return this.keyFactory.apply(id, key); } From 2f4caeb6732b84354783b2c2dffdb69ab7fb5a96 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 29 Dec 2020 17:28:54 +0300 Subject: [PATCH 062/463] Jellyshroom cap colors --- .../betterend/blocks/BlockJellyshroomCap.java | 40 +++++++++++++++--- .../java/ru/betterend/registry/EndBlocks.java | 2 +- src/main/java/ru/betterend/util/MHelper.java | 38 +++++++++++++++++ .../features/trees/JellyshroomFeature.java | 32 ++++++++------ .../world/generator/IslandLayer.java | 2 +- .../textures/block/jellyshroom_cap.png | Bin 250 -> 1618 bytes 6 files changed, 95 insertions(+), 19 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/BlockJellyshroomCap.java b/src/main/java/ru/betterend/blocks/BlockJellyshroomCap.java index 5bd613a8..506ed546 100644 --- a/src/main/java/ru/betterend/blocks/BlockJellyshroomCap.java +++ b/src/main/java/ru/betterend/blocks/BlockJellyshroomCap.java @@ -6,28 +6,54 @@ import java.util.List; import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.SlimeBlock; import net.minecraft.client.color.block.BlockColorProvider; import net.minecraft.client.color.item.ItemColorProvider; +import net.minecraft.item.ItemPlacementContext; import net.minecraft.item.ItemStack; import net.minecraft.loot.context.LootContext; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.IntProperty; import net.minecraft.util.Identifier; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3i; import net.minecraft.util.registry.Registry; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IColorProvider; import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; import ru.betterend.util.MHelper; public class BlockJellyshroomCap extends SlimeBlock implements IRenderTypeable, BlockPatterned, IColorProvider { - private final int color; + public static final IntProperty COLOR = IntProperty.of("color", 0, 7); + private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); + private final Vec3i colorStart; + private final Vec3i colorEnd; + private final int coloritem; - public BlockJellyshroomCap(int r, int g, int b) { + public BlockJellyshroomCap(int r1, int g1, int b1, int r2, int g2, int b2) { super(FabricBlockSettings.copyOf(Blocks.SLIME_BLOCK)); - color = MHelper.color(r, g, b); + colorStart = new Vec3i(r1, g1, b1); + colorEnd = new Vec3i(r2, g2, b2); + coloritem = MHelper.color((r1 + r2) >> 1, (g1 + g2) >> 1, (b1 + b2) >> 1); + } + + @Override + public BlockState getPlacementState(ItemPlacementContext ctx) { + double px = ctx.getBlockPos().getX() * 0.1; + double py = ctx.getBlockPos().getY() * 0.1; + double pz = ctx.getBlockPos().getZ() * 0.1; + return this.getDefaultState().with(COLOR, MHelper.floor(NOISE.eval(px, py, pz) * 3.5 + 4)); + } + + @Override + protected void appendProperties(StateManager.Builder stateManager) { + stateManager.add(COLOR); } @Override @@ -59,14 +85,18 @@ public class BlockJellyshroomCap extends SlimeBlock implements IRenderTypeable, @Override public BlockColorProvider getProvider() { return (state, world, pos, tintIndex) -> { - return color; + float delta = (float) state.get(COLOR) / 7F; + int r = MathHelper.floor(MathHelper.lerp(delta, colorStart.getX() / 255F, colorEnd.getX() / 255F) * 255F); + int g = MathHelper.floor(MathHelper.lerp(delta, colorStart.getY() / 255F, colorEnd.getY() / 255F) * 255F); + int b = MathHelper.floor(MathHelper.lerp(delta, colorStart.getZ() / 255F, colorEnd.getZ() / 255F) * 255F); + return MHelper.color(r, g, b); }; } @Override public ItemColorProvider getItemProvider() { return (stack, tintIndex) -> { - return color; + return coloritem; }; } } diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 895820b1..e2e2fcdd 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -188,7 +188,7 @@ public class EndBlocks { public static final Block UMBRELLA_TREE_CLUSTER_EMPTY = registerBlock("umbrella_tree_cluster_empty", new BlockUmbrellaTreeClusterEmpty()); public static final WoodenMaterial UMBRELLA_TREE = new WoodenMaterial("umbrella_tree", MaterialColor.BLUE, MaterialColor.GREEN); - public static final Block JELLYSHROOM_CAP_PURPLE = registerBlock("jellyshroom_cap_purple", new BlockJellyshroomCap(255, 0, 255)); + public static final Block JELLYSHROOM_CAP_PURPLE = registerBlock("jellyshroom_cap_purple", new BlockJellyshroomCap(217, 142, 255, 164, 0, 255)); public static final WoodenMaterial JELLYSHROOM = new WoodenMaterial("jellyshroom", MaterialColor.PURPLE, MaterialColor.LIGHT_BLUE); // Small Plants // diff --git a/src/main/java/ru/betterend/util/MHelper.java b/src/main/java/ru/betterend/util/MHelper.java index f7f89835..6e7fa735 100644 --- a/src/main/java/ru/betterend/util/MHelper.java +++ b/src/main/java/ru/betterend/util/MHelper.java @@ -3,6 +3,7 @@ package ru.betterend.util; import java.util.Random; import net.minecraft.client.util.math.Vector3f; +import net.minecraft.util.math.Vec3d; public class MHelper { public static final float PI2 = (float) (Math.PI * 2); @@ -251,6 +252,43 @@ public class MHelper { return values; } + public static Vec3d fromRGBtoHSBV(int r, int g, int b) { + int max = max(r, g, b); + int min = min(r, g, b); + + float brightness = (float) max / 255.0F; + float saturation; + if (max != 0) { + saturation = (float) (max - min) / (float) max; + } else { + saturation = 0.0F; + } + + float hue; + if (saturation == 0.0F) { + hue = 0.0F; + } + else { + float var9 = (float) (max - r) / (float) (max - min); + float var10 = (float) (max - g) / (float) (max - min); + float var11 = (float) (max - b) / (float) (max - min); + if (r == max) { + hue = var11 - var10; + } else if (g == max) { + hue = 2.0F + var9 - var11; + } else { + hue = 4.0F + var10 - var9; + } + + hue /= 6.0F; + if (hue < 0.0F) { + ++hue; + } + } + + return new Vec3d(hue, saturation, brightness); + } + public static final float radiandToDegrees(float value) { return value * RAD_TO_DEG; } diff --git a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java index 27d8be7b..ffd6ee32 100644 --- a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java @@ -10,14 +10,15 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Material; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.blocks.BlockJellyshroomCap; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.MHelper; import ru.betterend.util.SplineHelper; -import ru.betterend.util.sdf.PosInfo; import ru.betterend.util.sdf.SDF; import ru.betterend.util.sdf.operator.SDFFlatWave; import ru.betterend.util.sdf.operator.SDFScale3D; @@ -29,7 +30,6 @@ import ru.betterend.world.features.DefaultFeature; public class JellyshroomFeature extends DefaultFeature { private static final Function REPLACE; - private static final Function POST; private static final List ROOT; @Override @@ -51,11 +51,26 @@ public class JellyshroomFeature extends DefaultFeature { if (radius < 1.5F) { radius = 1.5F; } - SDF cap = makeCap(radius, random, membrane); - Vector3f last = spline.get(spline.size() - 1); + final float membraneRadius = radius; + SDF cap = makeCap(membraneRadius, random, membrane); + final Vector3f last = spline.get(spline.size() - 1); cap = new SDFTranslate().setTranslate(last.getX(), last.getY(), last.getZ()).setSource(cap); sdf = new SDFSmoothUnion().setRadius(3F).setSourceA(sdf).setSourceB(cap); - sdf.setReplaceFunction(REPLACE).setPostProcess(POST).fillRecursive(world, pos); + sdf.setReplaceFunction(REPLACE).setPostProcess((info) -> { + if (EndBlocks.JELLYSHROOM.isTreeLog(info.getState())) { + if (EndBlocks.JELLYSHROOM.isTreeLog(info.getStateUp()) && EndBlocks.JELLYSHROOM.isTreeLog(info.getStateDown())) { + return EndBlocks.JELLYSHROOM.log.getDefaultState(); + } + } + else if (info.getState().isOf(EndBlocks.JELLYSHROOM_CAP_PURPLE)) { + float dx = info.getPos().getX() - pos.getX() - last.getX(); + float dz = info.getPos().getZ() - pos.getZ() - last.getZ(); + float distance = MHelper.length(dx, dz) / membraneRadius * 7F; + int color = MathHelper.clamp(MHelper.floor(distance), 0, 7); + return info.getState().with(BlockJellyshroomCap.COLOR, color); + } + return info.getState(); + }).fillRecursive(world, pos); radius = height * 0.5F; makeRoots(world, pos.add(0, 2, 0), radius, random, bark); @@ -104,13 +119,6 @@ public class JellyshroomFeature extends DefaultFeature { ); SplineHelper.offset(ROOT, new Vector3f(0, -0.45F, 0)); - POST = (info) -> { - if (EndBlocks.JELLYSHROOM.isTreeLog(info.getStateUp()) && EndBlocks.JELLYSHROOM.isTreeLog(info.getStateDown())) { - return EndBlocks.JELLYSHROOM.log.getDefaultState(); - } - return info.getState(); - }; - REPLACE = (state) -> { if (state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT)) { return true; diff --git a/src/main/java/ru/betterend/world/generator/IslandLayer.java b/src/main/java/ru/betterend/world/generator/IslandLayer.java index e2d51d8b..ac5e4f1d 100644 --- a/src/main/java/ru/betterend/world/generator/IslandLayer.java +++ b/src/main/java/ru/betterend/world/generator/IslandLayer.java @@ -57,7 +57,7 @@ public class IslandLayer { int px = pox + ix; for (int poz = -1; poz < 2; poz++) { int pz = poz + iz; - if ((long) px + (long) pz > center) { + if (TerrainGenerator.noRingVoid() || (long) px + (long) pz > center) { RANDOM.setSeed(getSeed(px, pz)); double posX = (px + RANDOM.nextFloat()) * distance; double posY = MHelper.randRange(minY, maxY, RANDOM); diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_cap.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_cap.png index 07117df8b3f7dea43ff91a27cb93b2b80caf1c7c..7c3714e70cbf23c4d1772493a93cfc6a92fe4cc4 100644 GIT binary patch literal 1618 zcmbVMX>1f#9G{H{YrB;SUn*+)7@{I}c8WRkvXwN>+FwUc1LM2`Uh0I7)WA0>O~b4`POeK*%4a zBsR!_2=8aZ49^8S0LQQqnu*YCfMQt4gkgXOwU5NoEIADa;u~tR@GeSb9mj+;ozLg} z`GDWBGBnHcJk4-4$59wT*+tzE3zTlJsWZfpEm?}`D25JPMlogNoG6Jkt(u^j4O-o< zxd}UrE{G=0`We@x3Q(3BI5TId72&c(BNb^#cWjJh8(1@IIEI}y{)W17eT@L@T0v;Y zxS=kZ)(~MkJtNqRnnP}gwv$B@(F4dfa+ZX8MzES|Tx(1ivykW*R?;xkdZ7C2DuYJ5sE4vLZ-!!Z=gQCuj=v5@0&>>gwSkYTD&!H|`7@j57&#%0`@94j#sf(6kE`a+DcVGB@v(~xd|R6B{#B2CTqvaO?#k9o6jOl`VZl* z!fYe$aOGeRHf7-3aswwpKR#xt=s@yspw*zH&GrZv9u^g!!JM`p^G=6}EAxv|6ELz7@=m-lSP#~VL9bHejw z{QKhvRJC;U+_PKvAO5WTjl3=W`k~3=J1;DxE*7^B-dUQywB!^$F|~Rww|(mUb?o`e z+MaL6S3-y{6?WYe3%%yK7t z<(wBJR{UD(`r?EkQ7FKJm^xn&yv+TW}T5CNT%id@YOkhzYWQ_3wnWi8s zM50165DO-#s5Ui{K@>z7yx<`UieQN71o_!0@XR2h-!^dFLRXeo=k(b^WbHOMKWtTL1t6 From 3de7d611df99cfdfdadc2d52b1580adefc890375 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 29 Dec 2020 20:20:09 +0300 Subject: [PATCH 063/463] Jungle Spore particles --- .../particle/ParticleJungleSpore.java | 64 ++++++++++++++++++ .../ru/betterend/recipe/FurnaceRecipes.java | 2 + .../ru/betterend/registry/EndParticles.java | 3 + .../world/biome/BiomeUmbrellaJungle.java | 6 +- .../materialmaps/particle/jungle_spore.json | 3 + .../betterend/particles/jungle_spore.json | 19 ++++++ .../textures/particle/jungle_spore_0.png | Bin 0 -> 217 bytes .../textures/particle/jungle_spore_1.png | Bin 0 -> 236 bytes .../textures/particle/jungle_spore_2.png | Bin 0 -> 237 bytes 9 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 src/main/java/ru/betterend/particle/ParticleJungleSpore.java create mode 100644 src/main/resources/assets/betterend/materialmaps/particle/jungle_spore.json create mode 100644 src/main/resources/assets/betterend/particles/jungle_spore.json create mode 100644 src/main/resources/assets/betterend/textures/particle/jungle_spore_0.png create mode 100644 src/main/resources/assets/betterend/textures/particle/jungle_spore_1.png create mode 100644 src/main/resources/assets/betterend/textures/particle/jungle_spore_2.png diff --git a/src/main/java/ru/betterend/particle/ParticleJungleSpore.java b/src/main/java/ru/betterend/particle/ParticleJungleSpore.java new file mode 100644 index 00000000..1a6494a3 --- /dev/null +++ b/src/main/java/ru/betterend/particle/ParticleJungleSpore.java @@ -0,0 +1,64 @@ +package ru.betterend.particle; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.particle.AnimatedParticle; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleFactory; +import net.minecraft.client.particle.SpriteProvider; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.particle.DefaultParticleType; +import ru.betterend.util.MHelper; + +@Environment(EnvType.CLIENT) +public class ParticleJungleSpore extends AnimatedParticle { + + protected ParticleJungleSpore(ClientWorld world, double x, double y, double z, SpriteProvider sprites, double r, double g, double b) { + super(world, x, y, z, sprites, 0); + setSprite(sprites.getSprite(random)); + this.maxAge = MHelper.randRange(150, 300, random); + this.scale = MHelper.randRange(0.05F, 0.1F, random); + this.setTargetColor(15916745); + this.setSpriteForAge(spriteProvider); + this.setColorAlpha(0); + } + + @Override + public void tick() { + int ticks = this.age % 30; + if (ticks == 0) { + this.velocityX = random.nextGaussian() * 0.02; + this.velocityY = random.nextFloat() * 0.02 + 0.02; + this.velocityZ = random.nextGaussian() * 0.02; + ticks = 0; + } + if (this.age < 30) { + float delta = ticks / 30F; + this.setColorAlpha(delta); + } + else if (this.age > this.maxAge - 30) { + float delta = ticks / 30F; + this.setColorAlpha(1 - delta); + } + + this.velocityY -= 0.001F; + this.velocityX *= 0.99F; + this.velocityZ *= 0.99F; + + super.tick(); + } + + @Environment(EnvType.CLIENT) + public static class FactoryJungleSpore implements ParticleFactory { + private final SpriteProvider sprites; + + public FactoryJungleSpore(SpriteProvider sprites) { + this.sprites = sprites; + } + + @Override + public Particle createParticle(DefaultParticleType type, ClientWorld world, double x, double y, double z, double vX, double vY, double vZ) { + return new ParticleJungleSpore(world, x, y, z, sprites, 1, 1, 1); + } + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/recipe/FurnaceRecipes.java b/src/main/java/ru/betterend/recipe/FurnaceRecipes.java index 91bac180..3c664ec5 100644 --- a/src/main/java/ru/betterend/recipe/FurnaceRecipes.java +++ b/src/main/java/ru/betterend/recipe/FurnaceRecipes.java @@ -1,6 +1,7 @@ package ru.betterend.recipe; import net.minecraft.block.Blocks; +import net.minecraft.item.Items; import ru.betterend.recipe.builders.FurnaceRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; @@ -11,5 +12,6 @@ public class FurnaceRecipes { FurnaceRecipe.make("end_glass", EndBlocks.ENDSTONE_DUST, Blocks.GLASS).build(); FurnaceRecipe.make("end_berry", EndItems.SHADOW_BERRY_RAW, EndItems.SHADOW_BERRY_COOKED).build(); FurnaceRecipe.make("end_fish", EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED).build(); + FurnaceRecipe.make("slime_ball", EndBlocks.JELLYSHROOM_CAP_PURPLE, Items.SLIME_BALL).build(); } } diff --git a/src/main/java/ru/betterend/registry/EndParticles.java b/src/main/java/ru/betterend/registry/EndParticles.java index 50b08fe7..d273cb29 100644 --- a/src/main/java/ru/betterend/registry/EndParticles.java +++ b/src/main/java/ru/betterend/registry/EndParticles.java @@ -12,6 +12,7 @@ import ru.betterend.particle.InfusionParticleType; import ru.betterend.particle.ParticleBlackSpore; import ru.betterend.particle.ParticleGeyser; import ru.betterend.particle.ParticleGlowingSphere; +import ru.betterend.particle.ParticleJungleSpore; import ru.betterend.particle.ParticleSnowflake; import ru.betterend.particle.ParticleSulphur; import ru.betterend.particle.ParticleTenaneaPetal; @@ -27,6 +28,7 @@ public class EndParticles { public static final DefaultParticleType AMBER_SPHERE = register("amber_sphere"); public static final DefaultParticleType BLACK_SPORE = register("black_spore"); public static final DefaultParticleType TENANEA_PETAL = register("tenanea_petal"); + public static final DefaultParticleType JUNGLE_SPORE = register("jungle_spore"); public static void register() { ParticleFactoryRegistry.getInstance().register(GLOWING_SPHERE, ParticleGlowingSphere.FactoryGlowingSphere::new); @@ -38,6 +40,7 @@ public class EndParticles { ParticleFactoryRegistry.getInstance().register(AMBER_SPHERE, ParticleGlowingSphere.FactoryGlowingSphere::new); ParticleFactoryRegistry.getInstance().register(BLACK_SPORE, ParticleBlackSpore.FactoryBlackSpore::new); ParticleFactoryRegistry.getInstance().register(TENANEA_PETAL, ParticleTenaneaPetal.FactoryTenaneaPetal::new); + ParticleFactoryRegistry.getInstance().register(JUNGLE_SPORE, ParticleJungleSpore.FactoryJungleSpore::new); } private static DefaultParticleType register(String name) { diff --git a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java index 7017a173..5fc430e3 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java +++ b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java @@ -1,7 +1,9 @@ package ru.betterend.world.biome; +import net.minecraft.entity.EntityType; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; public class BiomeUmbrellaJungle extends EndBiome { @@ -11,6 +13,7 @@ public class BiomeUmbrellaJungle extends EndBiome { .setWaterAndFogColor(119, 198, 253) .setFoliageColor(27, 183, 194) .setFogDensity(2.3F) + .setParticles(EndParticles.JUNGLE_SPORE, 0.0001F) .setMusic(EndSounds.MUSIC_FOREST) .setSurface(EndBlocks.JUNGLE_MOSS) .addFeature(EndFeatures.END_LAKE) @@ -29,6 +32,7 @@ public class BiomeUmbrellaJungle extends EndBiome { .addFeature(EndFeatures.CHARNIA_CYAN) .addFeature(EndFeatures.CHARNIA_GREEN) .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) - .addFeature(EndFeatures.CHARNIA_RED_RARE)); + .addFeature(EndFeatures.CHARNIA_RED_RARE) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); } } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/particle/jungle_spore.json b/src/main/resources/assets/betterend/materialmaps/particle/jungle_spore.json new file mode 100644 index 00000000..ab909d8e --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/particle/jungle_spore.json @@ -0,0 +1,3 @@ +{ + "material": "canvas:emissive_no_diffuse" +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/particles/jungle_spore.json b/src/main/resources/assets/betterend/particles/jungle_spore.json new file mode 100644 index 00000000..6a26e388 --- /dev/null +++ b/src/main/resources/assets/betterend/particles/jungle_spore.json @@ -0,0 +1,19 @@ +{ + "textures": [ + "betterend:jungle_spore_0", + "betterend:jungle_spore_1", + "betterend:jungle_spore_2", + "betterend:jungle_spore_0", + "betterend:jungle_spore_1", + "betterend:jungle_spore_2", + "betterend:jungle_spore_0", + "betterend:jungle_spore_1", + "betterend:jungle_spore_2", + "betterend:jungle_spore_0", + "betterend:jungle_spore_1", + "betterend:jungle_spore_2", + "betterend:jungle_spore_0", + "betterend:jungle_spore_1", + "betterend:jungle_spore_2" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/particle/jungle_spore_0.png b/src/main/resources/assets/betterend/textures/particle/jungle_spore_0.png new file mode 100644 index 0000000000000000000000000000000000000000..4b2e062e800f7b85a2a9b59a7ae4bcffe06cad64 GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFq3p`yMLnNjy?X~A>3XnN&@89FV z$<8dUILU89@aE#Xi>EDHu#lO>Pj)dg%iRUhdj#YTG8cObw8tMV&UkNK`}1FG{X!R( zhU0>r!s`3hehz!CSfDQ@>3f{zvp~bQp9|MpGdyJukvsFMuWZKK*L|mo@38MMRqwg# zvVMlAK;jxTU!(7vbP0l+XkK9d}V% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/particle/jungle_spore_1.png b/src/main/resources/assets/betterend/textures/particle/jungle_spore_1.png new file mode 100644 index 0000000000000000000000000000000000000000..584e97de1a4746fb8fabc24155c87ccbd738feb0 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqn>}3|LnNlQ_SNBZ zlHrMIIk5KX#;sxD?Ro-o3LP()dUNM4kY?e1H+SJt0TqEOCs_)Am_-Bz=U44vf6xD? zkx4*MFZ;+Q>y0O@@^=NlV0a#>xi?T=f+^s>+?Gn^hD(e>yvHh?|90hmZgY9P kpZ?4?)rO*+?~832?aVFsmoLh_0CYZsr>mdKI;Vst0Pql8JOBUy literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/particle/jungle_spore_2.png b/src/main/resources/assets/betterend/textures/particle/jungle_spore_2.png new file mode 100644 index 0000000000000000000000000000000000000000..c545a2009f6ce869304caa24325adc24d1f5574c GIT binary patch literal 237 zcmV4oRClx^vAqrVC1y7)xYnLo~0B@j+t9S!(*Bf{MU0gCd>F(q#w3<>3)KvZs zZHdqLzVJK&DJ9RB(rylnKR_H^hXFhdKhyf&2DU)^{;eC$5@G;NkhOE&*AMt@=bBj9 zVwLDEbfcN7&LW~uxOzKPG^J@fF`14T-h(x$>P(TBF7|I?dviyTm#RAJ6UPT Date: Tue, 29 Dec 2020 20:28:33 +0300 Subject: [PATCH 064/463] Particle fixes --- .../java/ru/betterend/particle/ParticleJungleSpore.java | 8 ++++---- .../ru/betterend/world/biome/BiomeUmbrellaJungle.java | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/ru/betterend/particle/ParticleJungleSpore.java b/src/main/java/ru/betterend/particle/ParticleJungleSpore.java index 1a6494a3..179b9c4d 100644 --- a/src/main/java/ru/betterend/particle/ParticleJungleSpore.java +++ b/src/main/java/ru/betterend/particle/ParticleJungleSpore.java @@ -17,7 +17,7 @@ public class ParticleJungleSpore extends AnimatedParticle { super(world, x, y, z, sprites, 0); setSprite(sprites.getSprite(random)); this.maxAge = MHelper.randRange(150, 300, random); - this.scale = MHelper.randRange(0.05F, 0.1F, random); + this.scale = MHelper.randRange(0.05F, 0.15F, random); this.setTargetColor(15916745); this.setSpriteForAge(spriteProvider); this.setColorAlpha(0); @@ -32,13 +32,13 @@ public class ParticleJungleSpore extends AnimatedParticle { this.velocityZ = random.nextGaussian() * 0.02; ticks = 0; } + if (this.age < 30) { float delta = ticks / 30F; this.setColorAlpha(delta); } - else if (this.age > this.maxAge - 30) { - float delta = ticks / 30F; - this.setColorAlpha(1 - delta); + else if (this.age >= this.maxAge - 30) { + this.setColorAlpha((this.maxAge - this.age) / 30F); } this.velocityY -= 0.001F; diff --git a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java index 5fc430e3..757386f4 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java +++ b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java @@ -13,7 +13,7 @@ public class BiomeUmbrellaJungle extends EndBiome { .setWaterAndFogColor(119, 198, 253) .setFoliageColor(27, 183, 194) .setFogDensity(2.3F) - .setParticles(EndParticles.JUNGLE_SPORE, 0.0001F) + .setParticles(EndParticles.JUNGLE_SPORE, 0.0005F) .setMusic(EndSounds.MUSIC_FOREST) .setSurface(EndBlocks.JUNGLE_MOSS) .addFeature(EndFeatures.END_LAKE) From b8229d8c9186d660b349ade89dcbed57ad7a70fd Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 29 Dec 2020 20:30:14 +0300 Subject: [PATCH 065/463] Alpha fix --- src/main/java/ru/betterend/particle/ParticleJungleSpore.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/particle/ParticleJungleSpore.java b/src/main/java/ru/betterend/particle/ParticleJungleSpore.java index 179b9c4d..c6d0b42c 100644 --- a/src/main/java/ru/betterend/particle/ParticleJungleSpore.java +++ b/src/main/java/ru/betterend/particle/ParticleJungleSpore.java @@ -33,7 +33,7 @@ public class ParticleJungleSpore extends AnimatedParticle { ticks = 0; } - if (this.age < 30) { + if (this.age <= 30) { float delta = ticks / 30F; this.setColorAlpha(delta); } From 6fea8084df5c54fb501e2fea4ca11f733a1b486b Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 29 Dec 2020 20:45:39 +0300 Subject: [PATCH 066/463] Particle fixes --- .../java/ru/betterend/particle/ParticleJungleSpore.java | 6 ++++++ .../java/ru/betterend/world/biome/BiomeUmbrellaJungle.java | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/particle/ParticleJungleSpore.java b/src/main/java/ru/betterend/particle/ParticleJungleSpore.java index c6d0b42c..b389ee13 100644 --- a/src/main/java/ru/betterend/particle/ParticleJungleSpore.java +++ b/src/main/java/ru/betterend/particle/ParticleJungleSpore.java @@ -37,9 +37,15 @@ public class ParticleJungleSpore extends AnimatedParticle { float delta = ticks / 30F; this.setColorAlpha(delta); } + else if (this.age >= this.maxAge) { + this.setColorAlpha(0); + } else if (this.age >= this.maxAge - 30) { this.setColorAlpha((this.maxAge - this.age) / 30F); } + else { + this.setColorAlpha(1); + } this.velocityY -= 0.001F; this.velocityX *= 0.99F; diff --git a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java index 757386f4..6ea3c1ce 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java +++ b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java @@ -13,7 +13,7 @@ public class BiomeUmbrellaJungle extends EndBiome { .setWaterAndFogColor(119, 198, 253) .setFoliageColor(27, 183, 194) .setFogDensity(2.3F) - .setParticles(EndParticles.JUNGLE_SPORE, 0.0005F) + .setParticles(EndParticles.JUNGLE_SPORE, 0.001F) .setMusic(EndSounds.MUSIC_FOREST) .setSurface(EndBlocks.JUNGLE_MOSS) .addFeature(EndFeatures.END_LAKE) From c5b06e74f068680db10d5caab63edaf560c10cd2 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 29 Dec 2020 20:46:06 +0300 Subject: [PATCH 067/463] Super move --- src/main/java/ru/betterend/particle/ParticleJungleSpore.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/particle/ParticleJungleSpore.java b/src/main/java/ru/betterend/particle/ParticleJungleSpore.java index b389ee13..6028b09e 100644 --- a/src/main/java/ru/betterend/particle/ParticleJungleSpore.java +++ b/src/main/java/ru/betterend/particle/ParticleJungleSpore.java @@ -25,6 +25,8 @@ public class ParticleJungleSpore extends AnimatedParticle { @Override public void tick() { + super.tick(); + int ticks = this.age % 30; if (ticks == 0) { this.velocityX = random.nextGaussian() * 0.02; @@ -50,8 +52,6 @@ public class ParticleJungleSpore extends AnimatedParticle { this.velocityY -= 0.001F; this.velocityX *= 0.99F; this.velocityZ *= 0.99F; - - super.tick(); } @Environment(EnvType.CLIENT) From bb0e54ad258111c576b515a3775c1066bef8bc2e Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 29 Dec 2020 22:02:06 +0300 Subject: [PATCH 068/463] New spore textures --- .../betterend/particles/jungle_spore.json | 3 +++ .../textures/particle/jungle_spore_0.png | Bin 217 -> 254 bytes .../textures/particle/jungle_spore_1.png | Bin 236 -> 259 bytes .../textures/particle/jungle_spore_2.png | Bin 237 -> 263 bytes 4 files changed, 3 insertions(+) diff --git a/src/main/resources/assets/betterend/particles/jungle_spore.json b/src/main/resources/assets/betterend/particles/jungle_spore.json index 6a26e388..00b88f5f 100644 --- a/src/main/resources/assets/betterend/particles/jungle_spore.json +++ b/src/main/resources/assets/betterend/particles/jungle_spore.json @@ -14,6 +14,9 @@ "betterend:jungle_spore_2", "betterend:jungle_spore_0", "betterend:jungle_spore_1", + "betterend:jungle_spore_2", + "betterend:jungle_spore_0", + "betterend:jungle_spore_1", "betterend:jungle_spore_2" ] } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/particle/jungle_spore_0.png b/src/main/resources/assets/betterend/textures/particle/jungle_spore_0.png index 4b2e062e800f7b85a2a9b59a7ae4bcffe06cad64..88c68e2ee15cd31f769e6866466197b14be26504 100644 GIT binary patch delta 226 zcmV<803H9?0saAyB!2;OQb$4nuFf3k00004XF*Lt006O%3;baP00009a7bBm000id z000id0mpBsWB>pFlSxEDR47wp{Qv(y13th6rEvnd3CAlK{tJsUFuZ*U<}z4zFff8> zu!6neU;oQma5LQ7@(wJ?D#Fh2`^`@VkG(>SU@JhJ$0xpmC0juF&byxs522RBt#H(g z{?E(B&+z2sJqCVWVTS$Jmx8STtAj~?{`L_p`SJ5xuoy^=!BE;AXvlvCU!zPg4Z<)n cLuvQ_08P9{esrthwg3PC07*qoM6N<$f?0=R;Q#;t delta 189 zcmV;u07C!%0oehNB!8euL_t&-m8Fe83W87^$3IVuKnVu}7a@{PkW;gB-J_PKprHc< zP938I1l^!pybvD219M9dhhM{UXzx3H`Tm7}p+p3L#}SDWC%&!oR_7sbFB%z5#{}~b zfcE*JuR8$c15_T&>W+4p?dy)pbKD2GH7AVKM6Z}h5Mit)O*S(3vtDimP(xYvi&6m; r*N{!V6aUA=SgkG`#8|D;JOfZ)1yeIZ7euM100000NkvXXu0mjfo-$8{ diff --git a/src/main/resources/assets/betterend/textures/particle/jungle_spore_1.png b/src/main/resources/assets/betterend/textures/particle/jungle_spore_1.png index 584e97de1a4746fb8fabc24155c87ccbd738feb0..51a0c5bee4d7cd9b41e29e792d8db2bcbd852606 100644 GIT binary patch delta 231 zcmVpFm`OxIR47wp{Qv(y13my(aJ+)yzpyw1!`qi&E`wzU10#qAE7%+U z^}nnIH^aRx@4%9*BJ2#m-~43o*ek@y1QGyo9-sIMmH^>9?_hp1JOs-CO(05AW80_*{hB!9C>L_t&-m4%N#3W9JP#XmnWfi!SBEYT9w3P5 z0*!5*pc@1Y?wz5<5F`-P$pmruHds+pZ+g53?+^Te0uT`{Ys9iUvB)}ax>M)?=UFMe zQ6CrrP~RT3c_V<*0TK$v`|+FTc6-YtxQNlBW;EGI|x8RC1P9OebS z7fKXVL_vk`h4PbdDz~IrtoE!V&0^))t^&}$FPVlVfO2g2qdfsWH#iTcqHWLs0000< KMNUMnLSTaa_*xSH diff --git a/src/main/resources/assets/betterend/textures/particle/jungle_spore_2.png b/src/main/resources/assets/betterend/textures/particle/jungle_spore_2.png index c545a2009f6ce869304caa24325adc24d1f5574c..617a5536ee90241bccb392792be6a9cd69f1a074 100644 GIT binary patch delta 235 zcmVpFoJmAMR47wpWB`Ky|Nk=_uVDBuEDqu^FuZ-qz+l30l|PkaSS!oWkY3}n;YdP+N0G^J@fF`14T-h(x$ z>P(TBF7|I?dviyTm#RAJ6UPT Date: Tue, 29 Dec 2020 22:42:06 +0300 Subject: [PATCH 069/463] One more config --- src/main/java/ru/betterend/config/Config.java | 10 +- .../ru/betterend/config/ConfigKeeper.java | 62 +++- .../java/ru/betterend/config/Configs.java | 12 +- .../ru/betterend/config/DeprecatedConfig.java | 257 +++++++++++++ .../ru/betterend/config/SimpleConfig.java | 344 +++++------------- .../world/generator/TerrainGenerator.java | 4 +- 6 files changed, 399 insertions(+), 290 deletions(-) create mode 100644 src/main/java/ru/betterend/config/DeprecatedConfig.java diff --git a/src/main/java/ru/betterend/config/Config.java b/src/main/java/ru/betterend/config/Config.java index 42a37be1..89fb3147 100644 --- a/src/main/java/ru/betterend/config/Config.java +++ b/src/main/java/ru/betterend/config/Config.java @@ -2,8 +2,6 @@ package ru.betterend.config; import org.jetbrains.annotations.Nullable; -import com.google.gson.JsonObject; - import ru.betterend.BetterEnd; import ru.betterend.config.ConfigKeeper.BooleanEntry; import ru.betterend.config.ConfigKeeper.Entry; @@ -15,20 +13,16 @@ import ru.betterend.config.ConfigKeeper.StringEntry; public abstract class Config { protected final ConfigKeeper keeper; - protected final ConfigWriter writer; protected abstract void registerEntries(); public Config(String group) { - this.writer = new ConfigWriter(group); - JsonObject settings = writer.load(); - this.keeper = new ConfigKeeper(settings); + this.keeper = new ConfigKeeper(group); this.registerEntries(); - this.writer.save(); } public void saveChanges() { - this.writer.save(); + this.keeper.save(); } @Nullable diff --git a/src/main/java/ru/betterend/config/ConfigKeeper.java b/src/main/java/ru/betterend/config/ConfigKeeper.java index 20b110c4..8db36380 100644 --- a/src/main/java/ru/betterend/config/ConfigKeeper.java +++ b/src/main/java/ru/betterend/config/ConfigKeeper.java @@ -18,14 +18,50 @@ import ru.betterend.util.JsonFactory; public final class ConfigKeeper { private Map> configEntries = Maps.newHashMap(); - private final JsonObject configObject; - public ConfigKeeper(JsonObject config) { - this.configObject = config; + private final JsonObject configObject; + private final ConfigWriter writer; + + private boolean changed = false; + + public ConfigKeeper(String group) { + this.writer = new ConfigWriter(group); + this.configObject = writer.load(); + } + + public void save() { + if (!changed) return; + this.writer.save(); + this.changed = false; + } + + private > boolean has(ConfigKey key, E entry) { + if (configObject == null) { + return false; + } + String group = key.getOwner(); + if (!configObject.has(group)) { + return false; + } + JsonObject jsonGroup = JsonHelper.getObject(configObject, group); + String category = key.getCategory(); + if (!jsonGroup.has(category)) { + return false; + } + JsonObject jsonCategory = JsonHelper.getObject(jsonGroup, category); + String paramKey = key.getEntry(); + paramKey += " [default: " + entry.getDefault() + "]"; + return jsonCategory.has(paramKey); } private > void storeValue(ConfigKey key, E entry, T value) { - if (configObject == null) return; + if (configObject == null) { + return; + } + if (has(key, entry)) { + T val = entry.getValue(); + if (value.equals(val)) return; + } String group = key.getOwner(); JsonObject jsonGroup; @@ -46,30 +82,20 @@ public final class ConfigKeeper { String paramKey = key.getEntry(); paramKey += " [default: " + entry.getDefault() + "]"; entry.toJson(jsonCategory, paramKey, value); + this.changed = true; } private > T getValue(ConfigKey key, E entry) { - if (configObject == null) { + if (!has(key, entry)) { return entry.getDefault(); } - String group = key.getOwner(); - if (!configObject.has(group)) { - return entry.getDefault(); - } - - JsonObject jsonGroup = JsonHelper.getObject(configObject, group); String category = key.getCategory(); - if (!jsonGroup.has(category)) { - return entry.getDefault(); - } - + JsonObject jsonGroup = JsonHelper.getObject(configObject, group); JsonObject jsonCategory = JsonHelper.getObject(jsonGroup, category); + String paramKey = key.getEntry(); paramKey += " [default: " + entry.getDefault() + "]"; - if (!jsonCategory.has(paramKey)) { - return entry.getDefault(); - } return entry.fromJson(jsonCategory.get(paramKey)); } diff --git a/src/main/java/ru/betterend/config/Configs.java b/src/main/java/ru/betterend/config/Configs.java index 6bef1de2..ddee0536 100644 --- a/src/main/java/ru/betterend/config/Configs.java +++ b/src/main/java/ru/betterend/config/Configs.java @@ -1,17 +1,17 @@ package ru.betterend.config; public class Configs { - public static final IdConfig ITEM_CONFIG = new CategoryConfig("items"); - public static final IdConfig BLOCK_CONFIG = new CategoryConfig("blocks"); public static final IdConfig ENTITY_CONFIG = new CategoryConfig("entities"); + public static final IdConfig BLOCK_CONFIG = new CategoryConfig("blocks"); + public static final SimpleConfig GENERAL = new SimpleConfig("settings"); + public static final IdConfig ITEM_CONFIG = new CategoryConfig("items"); public static final IdConfig BIOME_CONFIG = new EntryConfig("biomes"); - public static final SimpleConfig GENERATOR_CONFIG = new SimpleConfig("generator"); public static void saveConfigs() { - ITEM_CONFIG.saveChanges(); + ENTITY_CONFIG.saveChanges(); BLOCK_CONFIG.saveChanges(); BIOME_CONFIG.saveChanges(); - ENTITY_CONFIG.saveChanges(); - GENERATOR_CONFIG.save(); + ITEM_CONFIG.saveChanges(); + GENERAL.saveChanges(); } } diff --git a/src/main/java/ru/betterend/config/DeprecatedConfig.java b/src/main/java/ru/betterend/config/DeprecatedConfig.java new file mode 100644 index 00000000..f1f109e4 --- /dev/null +++ b/src/main/java/ru/betterend/config/DeprecatedConfig.java @@ -0,0 +1,257 @@ +package ru.betterend.config; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.Reader; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map.Entry; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; + +import ru.betterend.BetterEnd; + +@Deprecated +public final class DeprecatedConfig { + private boolean rewrite = false; + private final String name; + private JsonObject config; + + public DeprecatedConfig(String name) { + this.name = name; + } + + private void load() { + if (config == null) { + File file = getFolder(); + if (!file.exists()) + file.mkdirs(); + file = getFile(); + if (file.exists()) { + Gson gson = new Gson(); + try { + Reader reader = new FileReader(file); + config = gson.fromJson(reader, JsonObject.class); + if (config == null) { + config = new JsonObject(); + rewrite = true; + } + else { + rewrite = false; + } + } + catch (FileNotFoundException e) { + e.printStackTrace(); + config = new JsonObject(); + rewrite = true; + } + } + else { + config = new JsonObject(); + rewrite = true; + } + } + } + + public void save() { + if (rewrite) { + File file = getFolder(); + if (!file.exists()) + file.mkdirs(); + file = getFile(); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + try { + FileWriter writer = new FileWriter(file); + String gstring = gson.toJson(config); + writer.write(gstring); + writer.flush(); + writer.close(); + rewrite = false; + } + catch (IOException e) { + e.printStackTrace(); + } + } + } + + private File getFile() { + return new File(String.format("./config/%s/%s.json", BetterEnd.MOD_ID, name)); + } + + private File getFolder() { + return new File("./config/" + BetterEnd.MOD_ID + "/"); + } + + public boolean getBoolean(String groups, String name, boolean def) { + load(); + name += "[def: " + def + "]"; + + JsonObject group = getGroup(groups); + JsonElement element = group.get(name); + + if (element != null) { + return element.getAsBoolean(); + } + else { + group.addProperty(name, def); + rewrite = true; + return def; + } + } + + public void setBoolean(String groups, String name, boolean def, boolean value) { + name += "[def: " + def + "]"; + + JsonObject group = getGroup(groups); + group.addProperty(name, value); + + rewrite = true; + } + + public float getFloat(String groups, String name, float def) { + load(); + name += "[def: " + def + "]"; + + JsonObject group = getGroup(groups); + JsonElement element = group.get(name); + + if (element != null) { + return element.getAsFloat(); + } + else { + group.addProperty(name, def); + rewrite = true; + return def; + } + } + + public void setFloat(String groups, String name, float def, float value) { + name += "[def: " + def + "]"; + + JsonObject group = getGroup(groups); + group.addProperty(name, value); + + rewrite = true; + } + + public int getInt(String groups, String name, int def) { + load(); + name += "[def: " + def + "]"; + + JsonObject group = getGroup(groups); + JsonElement element = group.get(name); + + if (element != null) { + return element.getAsInt(); + } + else { + group.addProperty(name, def); + rewrite = true; + return def; + } + } + + public String getString(String groups, String name, String def) { + load(); + name += "[def: " + def + "]"; + + JsonObject group = getGroup(groups); + JsonElement element = group.get(name); + + if (element != null) { + return element.getAsString(); + } + else { + group.addProperty(name, def); + rewrite = true; + return def; + } + } + + public void setInt(String groups, String name, int def, int value) { + name += "[def: " + def + "]"; + + JsonObject group = getGroup(groups); + group.addProperty(name, value); + + rewrite = true; + } + + public void setStringLoad(String groups, String name, String value) { + JsonObject group = getGroup(groups); + group.addProperty(name, value); + } + + public String[] getStringArray(String groups, String name, String[] def) { + load(); + + JsonObject group = getGroup(groups); + JsonElement element = group.get(name); + + if (element != null) { + return toStringArray(element.getAsJsonArray()); + } + else { + group.add(name, toJsonArray(def)); + rewrite = true; + return def; + } + } + + private String[] toStringArray(JsonArray array) { + load(); + String[] result = new String[array.size()]; + for (int i = 0; i < array.size(); i++) + result[i] = array.get(i).getAsString(); + return result; + } + + private JsonArray toJsonArray(String[] array) { + load(); + JsonArray result = new JsonArray(); + for (String s : array) + result.add(s); + return result; + } + + public JsonObject getGroup(String groups) { + JsonObject obj = config; + String[] groupsArr = groups.split("\\."); + for (String group : groupsArr) { + JsonObject jGroup = obj.getAsJsonObject(group); + if (jGroup == null) { + jGroup = new JsonObject(); + obj.add(group, jGroup); + } + obj = jGroup; + } + return obj; + } + + public List getBaseGroups() { + List groups = new ArrayList(); + Iterator> iterator = config.entrySet().iterator(); + iterator.forEachRemaining((element) -> { + groups.add(element.getKey()); + }); + return groups; + } + + public List> getGroupMembers(JsonObject group) { + List> result = new ArrayList>(); + result.addAll(group.entrySet()); + return result; + } + + public void markToSave() { + rewrite = true; + } +} diff --git a/src/main/java/ru/betterend/config/SimpleConfig.java b/src/main/java/ru/betterend/config/SimpleConfig.java index 47974e0b..463857a6 100644 --- a/src/main/java/ru/betterend/config/SimpleConfig.java +++ b/src/main/java/ru/betterend/config/SimpleConfig.java @@ -1,256 +1,88 @@ -package ru.betterend.config; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.io.Reader; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map.Entry; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; - -import ru.betterend.BetterEnd; - -public final class SimpleConfig { - private boolean rewrite = false; - private final String name; - private JsonObject config; - - public SimpleConfig(String name) { - this.name = name; - } - - private void load() { - if (config == null) { - File file = getFolder(); - if (!file.exists()) - file.mkdirs(); - file = getFile(); - if (file.exists()) { - Gson gson = new Gson(); - try { - Reader reader = new FileReader(file); - config = gson.fromJson(reader, JsonObject.class); - if (config == null) { - config = new JsonObject(); - rewrite = true; - } - else { - rewrite = false; - } - } - catch (FileNotFoundException e) { - e.printStackTrace(); - config = new JsonObject(); - rewrite = true; - } - } - else { - config = new JsonObject(); - rewrite = true; - } - } - } - - public void save() { - if (rewrite) { - File file = getFolder(); - if (!file.exists()) - file.mkdirs(); - file = getFile(); - Gson gson = new GsonBuilder().setPrettyPrinting().create(); - try { - FileWriter writer = new FileWriter(file); - String gstring = gson.toJson(config); - writer.write(gstring); - writer.flush(); - writer.close(); - rewrite = false; - } - catch (IOException e) { - e.printStackTrace(); - } - } - } - - private File getFile() { - return new File(String.format("./config/%s/%s.json", BetterEnd.MOD_ID, name)); - } - - private File getFolder() { - return new File("./config/" + BetterEnd.MOD_ID + "/"); - } - - public boolean getBoolean(String groups, String name, boolean def) { - load(); - name += "[def: " + def + "]"; - - JsonObject group = getGroup(groups); - JsonElement element = group.get(name); - - if (element != null) { - return element.getAsBoolean(); - } - else { - group.addProperty(name, def); - rewrite = true; - return def; - } - } - - public void setBoolean(String groups, String name, boolean def, boolean value) { - name += "[def: " + def + "]"; - - JsonObject group = getGroup(groups); - group.addProperty(name, value); - - rewrite = true; - } - - public float getFloat(String groups, String name, float def) { - load(); - name += "[def: " + def + "]"; - - JsonObject group = getGroup(groups); - JsonElement element = group.get(name); - - if (element != null) { - return element.getAsFloat(); - } - else { - group.addProperty(name, def); - rewrite = true; - return def; - } - } - - public void setFloat(String groups, String name, float def, float value) { - name += "[def: " + def + "]"; - - JsonObject group = getGroup(groups); - group.addProperty(name, value); - - rewrite = true; - } - - public int getInt(String groups, String name, int def) { - load(); - name += "[def: " + def + "]"; - - JsonObject group = getGroup(groups); - JsonElement element = group.get(name); - - if (element != null) { - return element.getAsInt(); - } - else { - group.addProperty(name, def); - rewrite = true; - return def; - } - } - - public String getString(String groups, String name, String def) { - load(); - name += "[def: " + def + "]"; - - JsonObject group = getGroup(groups); - JsonElement element = group.get(name); - - if (element != null) { - return element.getAsString(); - } - else { - group.addProperty(name, def); - rewrite = true; - return def; - } - } - - public void setInt(String groups, String name, int def, int value) { - name += "[def: " + def + "]"; - - JsonObject group = getGroup(groups); - group.addProperty(name, value); - - rewrite = true; - } - - public void setStringLoad(String groups, String name, String value) { - JsonObject group = getGroup(groups); - group.addProperty(name, value); - } - - public String[] getStringArray(String groups, String name, String[] def) { - load(); - - JsonObject group = getGroup(groups); - JsonElement element = group.get(name); - - if (element != null) { - return toStringArray(element.getAsJsonArray()); - } - else { - group.add(name, toJsonArray(def)); - rewrite = true; - return def; - } - } - - private String[] toStringArray(JsonArray array) { - load(); - String[] result = new String[array.size()]; - for (int i = 0; i < array.size(); i++) - result[i] = array.get(i).getAsString(); - return result; - } - - private JsonArray toJsonArray(String[] array) { - load(); - JsonArray result = new JsonArray(); - for (String s : array) - result.add(s); - return result; - } - - public JsonObject getGroup(String groups) { - JsonObject obj = config; - String[] groupsArr = groups.split("\\."); - for (String group : groupsArr) { - JsonObject jGroup = obj.getAsJsonObject(group); - if (jGroup == null) { - jGroup = new JsonObject(); - obj.add(group, jGroup); - } - obj = jGroup; - } - return obj; - } - - public List getBaseGroups() { - List groups = new ArrayList(); - Iterator> iterator = config.entrySet().iterator(); - iterator.forEachRemaining((element) -> { - groups.add(element.getKey()); - }); - return groups; - } - - public List> getGroupMembers(JsonObject group) { - List> result = new ArrayList>(); - result.addAll(group.entrySet()); - return result; - } - - public void markToSave() { - rewrite = true; - } -} +package ru.betterend.config; + +import org.jetbrains.annotations.Nullable; + +import ru.betterend.BetterEnd; +import ru.betterend.config.ConfigKeeper.Entry; +import ru.betterend.config.ConfigKeeper.FloatRange; +import ru.betterend.config.ConfigKeeper.IntegerRange; + +public class SimpleConfig extends Config { + + public SimpleConfig(String group) { + super(group); + } + + @Override + protected void registerEntries() {} + + protected ConfigKey createKey(String category, String key) { + return new ConfigKey(BetterEnd.MOD_ID, category, key); + } + + @Nullable + public > E getEntry(String category, String key, Class type) { + return this.getEntry(createKey(category, key), type); + } + + @Nullable + public > T getDefault(String category, String key, Class type) { + return this.getDefault(createKey(category, key), type); + } + + public String getString(String category, String key, String defaultValue) { + return this.getString(createKey(category, key), defaultValue); + } + + public String getString(String category, String key) { + return this.getString(createKey(category, key)); + } + + public boolean setString(String category, String key, String value) { + return this.setString(createKey(category, key), value); + } + + public int getInt(String category, String key, int defaultValue) { + return this.getInt(createKey(category, key), defaultValue); + } + + public int getInt(String category, String key) { + return this.getInt(createKey(category, key)); + } + + public boolean setInt(String category, String key, int value) { + return this.setInt(createKey(category, key), value); + } + + public boolean setRangedInt(String category, String key, int value) { + return this.setRanged(createKey(category, key), value, IntegerRange.class); + } + + public boolean setRangedFloat(String category, String key, float value) { + return this.setRanged(createKey(category, key), value, FloatRange.class); + } + + public float getFloat(String category, String key, float defaultValue) { + return this.getFloat(createKey(category, key), defaultValue); + } + + public float getFloat(String category, String key) { + return this.getFloat(createKey(category, key)); + } + + public boolean setFloat(String category, String key, float value) { + return this.setFloat(createKey(category, key), value); + } + + public boolean getBoolean(String category, String key, boolean defaultValue) { + return this.getBoolean(createKey(category, key), defaultValue); + } + + public boolean getBoolean(String category, String key) { + return this.getBoolean(createKey(category, key)); + } + + public boolean setBoolean(String category, String key, boolean value) { + return this.setBoolean(createKey(category, key), value); + } +} diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index abe22eca..6ce5b425 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -22,8 +22,8 @@ public class TerrainGenerator { private static boolean noRingVoid; public static void init() { - newGenerator = Configs.GENERATOR_CONFIG.getBoolean("generator", "useNewGenerator", false); - noRingVoid = Configs.GENERATOR_CONFIG.getBoolean("generator", "noRingVoid", false); + newGenerator = Configs.GENERAL.getBoolean("generator", "useNewGenerator", false); + noRingVoid = Configs.GENERAL.getBoolean("generator", "noRingVoid", false); } public static void initNoise(long seed) { From ed777b59551e2fd5d406e0c2ae6393f2e99d846a Mon Sep 17 00:00:00 2001 From: Aleksey Date: Wed, 30 Dec 2020 21:58:05 +0300 Subject: [PATCH 070/463] Config optimization --- .../ru/betterend/config/ConfigKeeper.java | 135 +++++---- .../ru/betterend/config/DeprecatedConfig.java | 257 ------------------ 2 files changed, 64 insertions(+), 328 deletions(-) delete mode 100644 src/main/java/ru/betterend/config/DeprecatedConfig.java diff --git a/src/main/java/ru/betterend/config/ConfigKeeper.java b/src/main/java/ru/betterend/config/ConfigKeeper.java index 8db36380..f35babc1 100644 --- a/src/main/java/ru/betterend/config/ConfigKeeper.java +++ b/src/main/java/ru/betterend/config/ConfigKeeper.java @@ -9,7 +9,6 @@ import org.jetbrains.annotations.Nullable; import com.google.common.collect.Maps; import com.google.common.reflect.TypeToken; -import com.google.gson.JsonElement; import com.google.gson.JsonObject; import net.minecraft.util.JsonHelper; @@ -35,34 +34,10 @@ public final class ConfigKeeper { this.changed = false; } - private > boolean has(ConfigKey key, E entry) { - if (configObject == null) { - return false; - } - String group = key.getOwner(); - if (!configObject.has(group)) { - return false; - } - JsonObject jsonGroup = JsonHelper.getObject(configObject, group); - String category = key.getCategory(); - if (!jsonGroup.has(category)) { - return false; - } - JsonObject jsonCategory = JsonHelper.getObject(jsonGroup, category); - String paramKey = key.getEntry(); - paramKey += " [default: " + entry.getDefault() + "]"; - return jsonCategory.has(paramKey); - } - - private > void storeValue(ConfigKey key, E entry, T value) { + private > void initializeEntry(ConfigKey key, E entry) { if (configObject == null) { return; } - if (has(key, entry)) { - T val = entry.getValue(); - if (value.equals(val)) return; - } - String group = key.getOwner(); JsonObject jsonGroup; if (configObject.has(group)) { @@ -81,23 +56,24 @@ public final class ConfigKeeper { } String paramKey = key.getEntry(); paramKey += " [default: " + entry.getDefault() + "]"; - entry.toJson(jsonCategory, paramKey, value); + this.changed = entry.setLocation(jsonCategory, paramKey); + } + + private > void storeValue(E entry, T value) { + if (configObject == null) { + return; + } + T val = entry.getValue(); + if (value.equals(val)) return; + entry.toJson(value); this.changed = true; } - private > T getValue(ConfigKey key, E entry) { - if (!has(key, entry)) { + private > T getValue(E entry) { + if (!entry.hasLocation()) { return entry.getDefault(); } - String group = key.getOwner(); - String category = key.getCategory(); - JsonObject jsonGroup = JsonHelper.getObject(configObject, group); - JsonObject jsonCategory = JsonHelper.getObject(jsonGroup, category); - - String paramKey = key.getEntry(); - paramKey += " [default: " + entry.getDefault() + "]"; - - return entry.fromJson(jsonCategory.get(paramKey)); + return entry.fromJson(); } @Nullable @@ -119,9 +95,9 @@ public final class ConfigKeeper { } public > E registerEntry(ConfigKey key, E entry) { - entry.setWriter(value -> this.storeValue(key, entry, value)); - entry.setReader(() -> { return this.getValue(key, entry); }); - this.storeValue(key, entry, entry.getValue()); + entry.setWriter(value -> this.storeValue(entry, value)); + entry.setReader(() -> { return this.getValue(entry); }); + this.initializeEntry(key, entry); this.configEntries.put(key, entry); return entry; } @@ -133,13 +109,13 @@ public final class ConfigKeeper { } @Override - public Boolean fromJson(JsonElement json) { - return json.getAsBoolean(); + public Boolean fromJson() { + return JsonHelper.getBoolean(location, key, defaultValue); } @Override - public void toJson(JsonObject json, String key, Boolean value) { - json.addProperty(key, value); + public void toJson(Boolean value) { + this.location.addProperty(key, value); } } @@ -150,13 +126,13 @@ public final class ConfigKeeper { } @Override - public Float fromJson(JsonElement json) { - return json.getAsFloat(); + public Float fromJson() { + return JsonHelper.getFloat(location, key, defaultValue); } @Override - public void toJson(JsonObject json, String key, Float value) { - json.addProperty(key, value); + public void toJson(Float value) { + this.location.addProperty(key, value); } } @@ -167,13 +143,13 @@ public final class ConfigKeeper { } @Override - public Float fromJson(JsonElement json) { - return json.getAsFloat(); + public Float fromJson() { + return JsonHelper.getFloat(location, key, defaultValue); } @Override - public void toJson(JsonObject json, String key, Float value) { - json.addProperty(key, value); + public void toJson(Float value) { + this.location.addProperty(key, value); } } @@ -189,13 +165,13 @@ public final class ConfigKeeper { } @Override - public Integer fromJson(JsonElement json) { - return json.getAsInt(); + public Integer fromJson() { + return JsonHelper.getInt(location, key, defaultValue); } @Override - public void toJson(JsonObject json, String key, Integer value) { - json.addProperty(key, value); + public void toJson(Integer value) { + this.location.addProperty(key, value); } } @@ -206,13 +182,13 @@ public final class ConfigKeeper { } @Override - public Integer fromJson(JsonElement json) { - return json.getAsInt(); + public Integer fromJson() { + return JsonHelper.getInt(location, key, defaultValue); } @Override - public void toJson(JsonObject json, String key, Integer value) { - json.addProperty(key, value); + public void toJson(Integer value) { + this.location.addProperty(key, value); } } @@ -223,13 +199,13 @@ public final class ConfigKeeper { } @Override - public String fromJson(JsonElement json) { - return json.getAsString(); + public String fromJson() { + return JsonHelper.getString(location, key, defaultValue); } @Override - public void toJson(JsonObject json, String key, String value) { - json.addProperty(key, value); + public void toJson(String value) { + this.location.addProperty(key, value); } } @@ -252,13 +228,13 @@ public final class ConfigKeeper { } @Override - public T fromJson(JsonElement json) { - return JsonFactory.GSON.fromJson(json, type); + public T fromJson() { + return JsonFactory.GSON.fromJson(location.get(key), type); } @Override - public void toJson(JsonObject json, String key, T value) { - json.addProperty(key, JsonFactory.GSON.toJson(json, type)); + public void toJson(T value) { + location.addProperty(key, JsonFactory.GSON.toJson(value, type)); } } @@ -291,9 +267,11 @@ public final class ConfigKeeper { protected final T defaultValue; protected Consumer writer; protected Supplier reader; + protected JsonObject location; + protected String key; - public abstract T fromJson(JsonElement json); - public abstract void toJson(JsonObject json, String key, T value); + public abstract T fromJson(); + public abstract void toJson(T value); public Entry (T defaultValue) { this.defaultValue = defaultValue; @@ -307,6 +285,21 @@ public final class ConfigKeeper { this.reader = reader; } + protected boolean setLocation(JsonObject location, String key) { + this.location = location; + this.key = key; + if (!location.has(key)) { + this.toJson(defaultValue); + return true; + } + return false; + } + + protected boolean hasLocation() { + return this.location != null && + this.key != null; + } + public T getValue() { return this.reader.get(); } diff --git a/src/main/java/ru/betterend/config/DeprecatedConfig.java b/src/main/java/ru/betterend/config/DeprecatedConfig.java deleted file mode 100644 index f1f109e4..00000000 --- a/src/main/java/ru/betterend/config/DeprecatedConfig.java +++ /dev/null @@ -1,257 +0,0 @@ -package ru.betterend.config; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.io.Reader; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map.Entry; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; - -import ru.betterend.BetterEnd; - -@Deprecated -public final class DeprecatedConfig { - private boolean rewrite = false; - private final String name; - private JsonObject config; - - public DeprecatedConfig(String name) { - this.name = name; - } - - private void load() { - if (config == null) { - File file = getFolder(); - if (!file.exists()) - file.mkdirs(); - file = getFile(); - if (file.exists()) { - Gson gson = new Gson(); - try { - Reader reader = new FileReader(file); - config = gson.fromJson(reader, JsonObject.class); - if (config == null) { - config = new JsonObject(); - rewrite = true; - } - else { - rewrite = false; - } - } - catch (FileNotFoundException e) { - e.printStackTrace(); - config = new JsonObject(); - rewrite = true; - } - } - else { - config = new JsonObject(); - rewrite = true; - } - } - } - - public void save() { - if (rewrite) { - File file = getFolder(); - if (!file.exists()) - file.mkdirs(); - file = getFile(); - Gson gson = new GsonBuilder().setPrettyPrinting().create(); - try { - FileWriter writer = new FileWriter(file); - String gstring = gson.toJson(config); - writer.write(gstring); - writer.flush(); - writer.close(); - rewrite = false; - } - catch (IOException e) { - e.printStackTrace(); - } - } - } - - private File getFile() { - return new File(String.format("./config/%s/%s.json", BetterEnd.MOD_ID, name)); - } - - private File getFolder() { - return new File("./config/" + BetterEnd.MOD_ID + "/"); - } - - public boolean getBoolean(String groups, String name, boolean def) { - load(); - name += "[def: " + def + "]"; - - JsonObject group = getGroup(groups); - JsonElement element = group.get(name); - - if (element != null) { - return element.getAsBoolean(); - } - else { - group.addProperty(name, def); - rewrite = true; - return def; - } - } - - public void setBoolean(String groups, String name, boolean def, boolean value) { - name += "[def: " + def + "]"; - - JsonObject group = getGroup(groups); - group.addProperty(name, value); - - rewrite = true; - } - - public float getFloat(String groups, String name, float def) { - load(); - name += "[def: " + def + "]"; - - JsonObject group = getGroup(groups); - JsonElement element = group.get(name); - - if (element != null) { - return element.getAsFloat(); - } - else { - group.addProperty(name, def); - rewrite = true; - return def; - } - } - - public void setFloat(String groups, String name, float def, float value) { - name += "[def: " + def + "]"; - - JsonObject group = getGroup(groups); - group.addProperty(name, value); - - rewrite = true; - } - - public int getInt(String groups, String name, int def) { - load(); - name += "[def: " + def + "]"; - - JsonObject group = getGroup(groups); - JsonElement element = group.get(name); - - if (element != null) { - return element.getAsInt(); - } - else { - group.addProperty(name, def); - rewrite = true; - return def; - } - } - - public String getString(String groups, String name, String def) { - load(); - name += "[def: " + def + "]"; - - JsonObject group = getGroup(groups); - JsonElement element = group.get(name); - - if (element != null) { - return element.getAsString(); - } - else { - group.addProperty(name, def); - rewrite = true; - return def; - } - } - - public void setInt(String groups, String name, int def, int value) { - name += "[def: " + def + "]"; - - JsonObject group = getGroup(groups); - group.addProperty(name, value); - - rewrite = true; - } - - public void setStringLoad(String groups, String name, String value) { - JsonObject group = getGroup(groups); - group.addProperty(name, value); - } - - public String[] getStringArray(String groups, String name, String[] def) { - load(); - - JsonObject group = getGroup(groups); - JsonElement element = group.get(name); - - if (element != null) { - return toStringArray(element.getAsJsonArray()); - } - else { - group.add(name, toJsonArray(def)); - rewrite = true; - return def; - } - } - - private String[] toStringArray(JsonArray array) { - load(); - String[] result = new String[array.size()]; - for (int i = 0; i < array.size(); i++) - result[i] = array.get(i).getAsString(); - return result; - } - - private JsonArray toJsonArray(String[] array) { - load(); - JsonArray result = new JsonArray(); - for (String s : array) - result.add(s); - return result; - } - - public JsonObject getGroup(String groups) { - JsonObject obj = config; - String[] groupsArr = groups.split("\\."); - for (String group : groupsArr) { - JsonObject jGroup = obj.getAsJsonObject(group); - if (jGroup == null) { - jGroup = new JsonObject(); - obj.add(group, jGroup); - } - obj = jGroup; - } - return obj; - } - - public List getBaseGroups() { - List groups = new ArrayList(); - Iterator> iterator = config.entrySet().iterator(); - iterator.forEachRemaining((element) -> { - groups.add(element.getKey()); - }); - return groups; - } - - public List> getGroupMembers(JsonObject group) { - List> result = new ArrayList>(); - result.addAll(group.entrySet()); - return result; - } - - public void markToSave() { - rewrite = true; - } -} From 42f04b9614501f7a85313b5ca9152f1762fdad70 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Wed, 30 Dec 2020 23:13:39 +0300 Subject: [PATCH 071/463] A little bit refactoring --- .../{compat => integration}/rei/REIAlloyingCategory.java | 2 +- .../{compat => integration}/rei/REIAlloyingDisplay.java | 2 +- .../{compat => integration}/rei/REIAnvilCategory.java | 2 +- .../{compat => integration}/rei/REIAnvilDisplay.java | 2 +- .../betterend/{compat => integration}/rei/REIContainer.java | 2 +- .../{compat => integration}/rei/REIInfusionCategory.java | 2 +- .../{compat => integration}/rei/REIInfusionDisplay.java | 2 +- .../ru/betterend/{compat => integration}/rei/REIPlugin.java | 2 +- src/main/resources/fabric.mod.json | 4 ++-- 9 files changed, 10 insertions(+), 10 deletions(-) rename src/main/java/ru/betterend/{compat => integration}/rei/REIAlloyingCategory.java (98%) rename src/main/java/ru/betterend/{compat => integration}/rei/REIAlloyingDisplay.java (98%) rename src/main/java/ru/betterend/{compat => integration}/rei/REIAnvilCategory.java (98%) rename src/main/java/ru/betterend/{compat => integration}/rei/REIAnvilDisplay.java (97%) rename src/main/java/ru/betterend/{compat => integration}/rei/REIContainer.java (92%) rename src/main/java/ru/betterend/{compat => integration}/rei/REIInfusionCategory.java (99%) rename src/main/java/ru/betterend/{compat => integration}/rei/REIInfusionDisplay.java (98%) rename src/main/java/ru/betterend/{compat => integration}/rei/REIPlugin.java (98%) diff --git a/src/main/java/ru/betterend/compat/rei/REIAlloyingCategory.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java similarity index 98% rename from src/main/java/ru/betterend/compat/rei/REIAlloyingCategory.java rename to src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java index f3ea48b9..67ddf9ba 100644 --- a/src/main/java/ru/betterend/compat/rei/REIAlloyingCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java @@ -1,4 +1,4 @@ -package ru.betterend.compat.rei; +package ru.betterend.integration.rei; import java.text.DecimalFormat; import java.util.List; diff --git a/src/main/java/ru/betterend/compat/rei/REIAlloyingDisplay.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingDisplay.java similarity index 98% rename from src/main/java/ru/betterend/compat/rei/REIAlloyingDisplay.java rename to src/main/java/ru/betterend/integration/rei/REIAlloyingDisplay.java index b5a91a95..cecd66b0 100644 --- a/src/main/java/ru/betterend/compat/rei/REIAlloyingDisplay.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingDisplay.java @@ -1,4 +1,4 @@ -package ru.betterend.compat.rei; +package ru.betterend.integration.rei; import java.util.Collections; import java.util.List; diff --git a/src/main/java/ru/betterend/compat/rei/REIAnvilCategory.java b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java similarity index 98% rename from src/main/java/ru/betterend/compat/rei/REIAnvilCategory.java rename to src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java index 82172fc7..88c9363b 100644 --- a/src/main/java/ru/betterend/compat/rei/REIAnvilCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java @@ -1,4 +1,4 @@ -package ru.betterend.compat.rei; +package ru.betterend.integration.rei; import java.util.Collections; import java.util.List; diff --git a/src/main/java/ru/betterend/compat/rei/REIAnvilDisplay.java b/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java similarity index 97% rename from src/main/java/ru/betterend/compat/rei/REIAnvilDisplay.java rename to src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java index 2de2d777..df870fc7 100644 --- a/src/main/java/ru/betterend/compat/rei/REIAnvilDisplay.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java @@ -1,4 +1,4 @@ -package ru.betterend.compat.rei; +package ru.betterend.integration.rei; import java.util.Collections; import java.util.List; diff --git a/src/main/java/ru/betterend/compat/rei/REIContainer.java b/src/main/java/ru/betterend/integration/rei/REIContainer.java similarity index 92% rename from src/main/java/ru/betterend/compat/rei/REIContainer.java rename to src/main/java/ru/betterend/integration/rei/REIContainer.java index dae79d5f..9d6a0118 100644 --- a/src/main/java/ru/betterend/compat/rei/REIContainer.java +++ b/src/main/java/ru/betterend/integration/rei/REIContainer.java @@ -1,4 +1,4 @@ -package ru.betterend.compat.rei; +package ru.betterend.integration.rei; import me.shedaniel.rei.plugin.containers.CraftingContainerInfoWrapper; import me.shedaniel.rei.server.ContainerInfoHandler; diff --git a/src/main/java/ru/betterend/compat/rei/REIInfusionCategory.java b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java similarity index 99% rename from src/main/java/ru/betterend/compat/rei/REIInfusionCategory.java rename to src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java index c304659b..6821a790 100644 --- a/src/main/java/ru/betterend/compat/rei/REIInfusionCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java @@ -1,4 +1,4 @@ -package ru.betterend.compat.rei; +package ru.betterend.integration.rei; import java.util.List; diff --git a/src/main/java/ru/betterend/compat/rei/REIInfusionDisplay.java b/src/main/java/ru/betterend/integration/rei/REIInfusionDisplay.java similarity index 98% rename from src/main/java/ru/betterend/compat/rei/REIInfusionDisplay.java rename to src/main/java/ru/betterend/integration/rei/REIInfusionDisplay.java index 644b0d3c..9e77e114 100644 --- a/src/main/java/ru/betterend/compat/rei/REIInfusionDisplay.java +++ b/src/main/java/ru/betterend/integration/rei/REIInfusionDisplay.java @@ -1,4 +1,4 @@ -package ru.betterend.compat.rei; +package ru.betterend.integration.rei; import java.util.Collections; import java.util.List; diff --git a/src/main/java/ru/betterend/compat/rei/REIPlugin.java b/src/main/java/ru/betterend/integration/rei/REIPlugin.java similarity index 98% rename from src/main/java/ru/betterend/compat/rei/REIPlugin.java rename to src/main/java/ru/betterend/integration/rei/REIPlugin.java index d4b2365d..ee84dea5 100644 --- a/src/main/java/ru/betterend/compat/rei/REIPlugin.java +++ b/src/main/java/ru/betterend/integration/rei/REIPlugin.java @@ -1,4 +1,4 @@ -package ru.betterend.compat.rei; +package ru.betterend.integration.rei; import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.RecipeHelper; diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 91334346..f7500c1d 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -26,10 +26,10 @@ "ru.betterend.client.BetterEndClient" ], "rei_plugins": [ - "ru.betterend.compat.rei.REIPlugin" + "ru.betterend.integration.rei.REIPlugin" ], "rei_containers": [ - "ru.betterend.compat.rei.REIContainer" + "ru.betterend.integration.rei.REIContainer" ] }, "mixins": [ From 5129403d89bcb1c2eb88b16c331bfc55aaff71d0 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 31 Dec 2020 05:56:37 +0300 Subject: [PATCH 072/463] Structure fix --- .../java/ru/betterend/world/biome/EndBiome.java | 3 +-- .../ru/betterend/world/features/ListFeature.java | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/java/ru/betterend/world/biome/EndBiome.java b/src/main/java/ru/betterend/world/biome/EndBiome.java index 1dc07120..7ab7a540 100644 --- a/src/main/java/ru/betterend/world/biome/EndBiome.java +++ b/src/main/java/ru/betterend/world/biome/EndBiome.java @@ -8,7 +8,6 @@ import com.google.common.collect.Lists; import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import net.minecraft.structure.Structure; import net.minecraft.util.Identifier; import net.minecraft.world.biome.Biome; import ru.betterend.config.Configs; @@ -146,7 +145,7 @@ public class EndBiome { List list = Lists.newArrayList(); enties.forEach((entry) -> { JsonObject e = entry.getAsJsonObject(); - Structure structure = StructureHelper.readStructure(path + e.get("nbt").getAsString() + ".nbt"); + String structure = path + e.get("nbt").getAsString() + ".nbt"; TerrainMerge terrainMerge = TerrainMerge.getFromString(e.get("terrainMerge").getAsString()); int offsetY = e.get("offsetY").getAsInt(); list.add(new StructureInfo(structure, offsetY, terrainMerge)); diff --git a/src/main/java/ru/betterend/world/features/ListFeature.java b/src/main/java/ru/betterend/world/features/ListFeature.java index a2fd9143..5872d0d2 100644 --- a/src/main/java/ru/betterend/world/features/ListFeature.java +++ b/src/main/java/ru/betterend/world/features/ListFeature.java @@ -10,6 +10,7 @@ import net.minecraft.util.BlockRotation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; import ru.betterend.registry.EndTags; +import ru.betterend.util.StructureHelper; public class ListFeature extends NBTStructureFeature { private final List list; @@ -57,13 +58,22 @@ public class ListFeature extends NBTStructureFeature { public static final class StructureInfo { public final TerrainMerge terrainMerge; - public final Structure structure; + public final String structurePath; public final int offsetY; - public StructureInfo(Structure structure, int offsetY, TerrainMerge terrainMerge) { + private Structure structure; + + public StructureInfo(String structurePath, int offsetY, TerrainMerge terrainMerge) { this.terrainMerge = terrainMerge; - this.structure = structure; + this.structurePath = structurePath; this.offsetY = offsetY; } + + public Structure getStructure() { + if (structure == null) { + structure = StructureHelper.readStructure(structurePath); + } + return structure; + } } } From 640671bfce4f094a05f1389af635de5941abe85b Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 31 Dec 2020 06:15:00 +0300 Subject: [PATCH 073/463] Fixed class name --- .../{SDFCapedCone.java => SDFCappedCone.java} | 8 ++++---- .../world/features/OverworldIslandFeature.java | 4 ++-- .../world/features/terrain/GeyserFeature.java | 12 ++++++------ .../world/features/terrain/IceStarFeature.java | 4 ++-- .../world/features/trees/MossyGlowshroomFeature.java | 8 ++++---- .../ru/betterend/world/generator/IslandLayer.java | 4 ++-- .../structures/features/StructureGiantIceStar.java | 4 ++-- .../features/StructureGiantMossyGlowshroom.java | 8 ++++---- 8 files changed, 26 insertions(+), 26 deletions(-) rename src/main/java/ru/betterend/util/sdf/primitive/{SDFCapedCone.java => SDFCappedCone.java} (80%) diff --git a/src/main/java/ru/betterend/util/sdf/primitive/SDFCapedCone.java b/src/main/java/ru/betterend/util/sdf/primitive/SDFCappedCone.java similarity index 80% rename from src/main/java/ru/betterend/util/sdf/primitive/SDFCapedCone.java rename to src/main/java/ru/betterend/util/sdf/primitive/SDFCappedCone.java index c60506a8..206a54de 100644 --- a/src/main/java/ru/betterend/util/sdf/primitive/SDFCapedCone.java +++ b/src/main/java/ru/betterend/util/sdf/primitive/SDFCappedCone.java @@ -3,22 +3,22 @@ package ru.betterend.util.sdf.primitive; import net.minecraft.util.math.MathHelper; import ru.betterend.util.MHelper; -public class SDFCapedCone extends SDFPrimitive { +public class SDFCappedCone extends SDFPrimitive { private float radius1; private float radius2; private float height; - public SDFCapedCone setRadius1(float radius) { + public SDFCappedCone setRadius1(float radius) { this.radius1 = radius; return this; } - public SDFCapedCone setRadius2(float radius) { + public SDFCappedCone setRadius2(float radius) { this.radius2 = radius; return this; } - public SDFCapedCone setHeight(float height) { + public SDFCappedCone setHeight(float height) { this.height = height; return this; } diff --git a/src/main/java/ru/betterend/world/features/OverworldIslandFeature.java b/src/main/java/ru/betterend/world/features/OverworldIslandFeature.java index 16cd78b0..a9a2ac41 100644 --- a/src/main/java/ru/betterend/world/features/OverworldIslandFeature.java +++ b/src/main/java/ru/betterend/world/features/OverworldIslandFeature.java @@ -12,7 +12,7 @@ import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.sdf.SDF; import ru.betterend.util.sdf.operator.SDFDisplacement; import ru.betterend.util.sdf.operator.SDFTranslate; -import ru.betterend.util.sdf.primitive.SDFCapedCone; +import ru.betterend.util.sdf.primitive.SDFCappedCone; public class OverworldIslandFeature extends DefaultFeature { private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(412); @@ -27,7 +27,7 @@ public class OverworldIslandFeature extends DefaultFeature { } static { - SDF cone = new SDFCapedCone().setRadius1(0).setRadius2(6).setHeight(4).setBlock((pos) -> { + SDF cone = new SDFCappedCone().setRadius1(0).setRadius2(6).setHeight(4).setBlock((pos) -> { if (pos.getY() == CENTER.getY()) return Blocks.GRASS_BLOCK.getDefaultState(); if (pos.getY() == CENTER.getY() - 1) { return Blocks.DIRT.getDefaultState(); diff --git a/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java b/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java index fdc0fcae..1b5ac0b2 100644 --- a/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java @@ -32,7 +32,7 @@ import ru.betterend.util.sdf.operator.SDFSmoothUnion; import ru.betterend.util.sdf.operator.SDFSubtraction; import ru.betterend.util.sdf.operator.SDFTranslate; import ru.betterend.util.sdf.operator.SDFUnion; -import ru.betterend.util.sdf.primitive.SDFCapedCone; +import ru.betterend.util.sdf.primitive.SDFCappedCone; import ru.betterend.util.sdf.primitive.SDFFlatland; import ru.betterend.util.sdf.primitive.SDFPrimitive; import ru.betterend.util.sdf.primitive.SDFSphere; @@ -52,7 +52,7 @@ public class GeyserFeature extends DefaultFeature { int halfHeight = MHelper.randRange(10, 20, random); float radius1 = halfHeight * 0.5F; float radius2 = halfHeight * 0.1F + 0.5F; - SDF sdf = new SDFCapedCone().setHeight(halfHeight).setRadius1(radius1).setRadius2(radius2).setBlock(EndBlocks.SULPHURIC_ROCK.stone); + SDF sdf = new SDFCappedCone().setHeight(halfHeight).setRadius1(radius1).setRadius2(radius2).setBlock(EndBlocks.SULPHURIC_ROCK.stone); sdf = new SDFTranslate().setTranslate(0, halfHeight - 3, 0).setSource(sdf); int count = halfHeight; @@ -61,14 +61,14 @@ public class GeyserFeature extends DefaultFeature { float delta = (float) i / (float) (count - 1); float radius = MathHelper.lerp(delta, radius1, radius2) * 1.3F; - SDF bowl = new SDFCapedCone().setHeight(radius).setRadius1(0).setRadius2(radius).setBlock(EndBlocks.SULPHURIC_ROCK.stone); + SDF bowl = new SDFCappedCone().setHeight(radius).setRadius1(0).setRadius2(radius).setBlock(EndBlocks.SULPHURIC_ROCK.stone); - SDF brimstone = new SDFCapedCone().setHeight(radius).setRadius1(0).setRadius2(radius).setBlock(EndBlocks.BRIMSTONE); + SDF brimstone = new SDFCappedCone().setHeight(radius).setRadius1(0).setRadius2(radius).setBlock(EndBlocks.BRIMSTONE); brimstone = new SDFTranslate().setTranslate(0, 2F, 0).setSource(brimstone); bowl = new SDFSubtraction().setSourceA(bowl).setSourceB(brimstone); bowl = new SDFUnion().setSourceA(brimstone).setSourceB(bowl); - SDF water = new SDFCapedCone().setHeight(radius).setRadius1(0).setRadius2(radius).setBlock(Blocks.WATER); + SDF water = new SDFCappedCone().setHeight(radius).setRadius1(0).setRadius2(radius).setBlock(Blocks.WATER); water = new SDFTranslate().setTranslate(0, 4, 0).setSource(water); bowl = new SDFSubtraction().setSourceA(bowl).setSourceB(water); bowl = new SDFUnion().setSourceA(water).setSourceB(bowl); @@ -102,7 +102,7 @@ public class GeyserFeature extends DefaultFeature { SDFPrimitive obj1; SDFPrimitive obj2; - obj1 = new SDFCapedCone().setHeight(halfHeight + 5).setRadius1(radius1 * 0.5F).setRadius2(radius2); + obj1 = new SDFCappedCone().setHeight(halfHeight + 5).setRadius1(radius1 * 0.5F).setRadius2(radius2); sdf = new SDFTranslate().setTranslate(0, halfHeight - 13, 0).setSource(obj1); sdf = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.3F, vec.getY() * 0.3F, vec.getZ() * 0.3F) * 0.5F; diff --git a/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java b/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java index c0712716..89513130 100644 --- a/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java @@ -16,7 +16,7 @@ import ru.betterend.util.sdf.SDF; import ru.betterend.util.sdf.operator.SDFRotation; import ru.betterend.util.sdf.operator.SDFTranslate; import ru.betterend.util.sdf.operator.SDFUnion; -import ru.betterend.util.sdf.primitive.SDFCapedCone; +import ru.betterend.util.sdf.primitive.SDFCappedCone; import ru.betterend.world.features.DefaultFeature; public class IceStarFeature extends DefaultFeature { @@ -38,7 +38,7 @@ public class IceStarFeature extends DefaultFeature { int count = MHelper.randRange(minCount, maxCount, random); List points = getFibonacciPoints(count); SDF sdf = null; - SDF spike = new SDFCapedCone().setRadius1(3 + (size - 5) * 0.2F).setRadius2(0).setHeight(size).setBlock(EndBlocks.DENSE_SNOW); + SDF spike = new SDFCappedCone().setRadius1(3 + (size - 5) * 0.2F).setRadius2(0).setHeight(size).setBlock(EndBlocks.DENSE_SNOW); spike = new SDFTranslate().setTranslate(0, size - 0.5F, 0).setSource(spike); for (Vector3f point: points) { SDF rotated = spike; diff --git a/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java index 040d73f7..180ecf2e 100644 --- a/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java @@ -30,7 +30,7 @@ import ru.betterend.util.sdf.operator.SDFSmoothUnion; import ru.betterend.util.sdf.operator.SDFSubtraction; import ru.betterend.util.sdf.operator.SDFTranslate; import ru.betterend.util.sdf.operator.SDFUnion; -import ru.betterend.util.sdf.primitive.SDFCapedCone; +import ru.betterend.util.sdf.primitive.SDFCappedCone; import ru.betterend.util.sdf.primitive.SDFPrimitive; import ru.betterend.util.sdf.primitive.SDFSphere; import ru.betterend.world.features.DefaultFeature; @@ -119,8 +119,8 @@ public class MossyGlowshroomFeature extends DefaultFeature { } static { - SDFCapedCone cone1 = new SDFCapedCone().setHeight(2.5F).setRadius1(1.5F).setRadius2(2.5F); - SDFCapedCone cone2 = new SDFCapedCone().setHeight(3F).setRadius1(2.5F).setRadius2(13F); + SDFCappedCone cone1 = new SDFCappedCone().setHeight(2.5F).setRadius1(1.5F).setRadius2(2.5F); + SDFCappedCone cone2 = new SDFCappedCone().setHeight(3F).setRadius1(2.5F).setRadius2(13F); SDF posedCone2 = new SDFTranslate().setTranslate(0, 5, 0).setSource(cone2); SDF posedCone3 = new SDFTranslate().setTranslate(0, 12F, 0).setSource(new SDFScale().setScale(2).setSource(cone2)); SDF upCone = new SDFSubtraction().setSourceA(posedCone2).setSourceB(posedCone3); @@ -134,7 +134,7 @@ public class MossyGlowshroomFeature extends DefaultFeature { innerCone = new SDFScale3D().setScale(1.2F, 1F, 1.2F).setSource(innerCone); cones = new SDFUnion().setSourceA(cones).setSourceB(innerCone); - SDF glowCone = new SDFCapedCone().setHeight(3F).setRadius1(2F).setRadius2(12.5F); + SDF glowCone = new SDFCappedCone().setHeight(3F).setRadius1(2F).setRadius2(12.5F); CONE_GLOW = (SDFPrimitive) glowCone; glowCone = new SDFTranslate().setTranslate(0, 4.25F, 0).setSource(glowCone); glowCone = new SDFSubtraction().setSourceA(glowCone).setSourceB(posedCone3); diff --git a/src/main/java/ru/betterend/world/generator/IslandLayer.java b/src/main/java/ru/betterend/world/generator/IslandLayer.java index ac5e4f1d..beef77a8 100644 --- a/src/main/java/ru/betterend/world/generator/IslandLayer.java +++ b/src/main/java/ru/betterend/world/generator/IslandLayer.java @@ -15,7 +15,7 @@ import ru.betterend.util.sdf.operator.SDFScale; import ru.betterend.util.sdf.operator.SDFSmoothUnion; import ru.betterend.util.sdf.operator.SDFTranslate; import ru.betterend.util.sdf.operator.SDFUnion; -import ru.betterend.util.sdf.primitive.SDFCapedCone; +import ru.betterend.util.sdf.primitive.SDFCappedCone; public class IslandLayer { private static final Random RANDOM = new Random(); @@ -109,7 +109,7 @@ public class IslandLayer { private static SDF makeCone(float radiusBottom, float radiusTop, float height, float minY) { float hh = height * 0.5F; - SDF sdf = new SDFCapedCone().setHeight(hh).setRadius1(radiusBottom).setRadius2(radiusTop); + SDF sdf = new SDFCappedCone().setHeight(hh).setRadius1(radiusBottom).setRadius2(radiusTop); return new SDFTranslate().setTranslate(0, minY + hh, 0).setSource(sdf); } diff --git a/src/main/java/ru/betterend/world/structures/features/StructureGiantIceStar.java b/src/main/java/ru/betterend/world/structures/features/StructureGiantIceStar.java index 89e29468..f1d157d3 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructureGiantIceStar.java +++ b/src/main/java/ru/betterend/world/structures/features/StructureGiantIceStar.java @@ -21,7 +21,7 @@ import ru.betterend.util.sdf.SDF; import ru.betterend.util.sdf.operator.SDFRotation; import ru.betterend.util.sdf.operator.SDFTranslate; import ru.betterend.util.sdf.operator.SDFUnion; -import ru.betterend.util.sdf.primitive.SDFCapedCone; +import ru.betterend.util.sdf.primitive.SDFCappedCone; import ru.betterend.world.structures.piece.VoxelPiece; public class StructureGiantIceStar extends SDFStructureFeature { @@ -36,7 +36,7 @@ public class StructureGiantIceStar extends SDFStructureFeature { int count = MHelper.randRange(minCount, maxCount, random); List points = getFibonacciPoints(count); SDF sdf = null; - SDF spike = new SDFCapedCone().setRadius1(3 + (size - 5) * 0.2F).setRadius2(0).setHeight(size).setBlock(EndBlocks.DENSE_SNOW); + SDF spike = new SDFCappedCone().setRadius1(3 + (size - 5) * 0.2F).setRadius2(0).setHeight(size).setBlock(EndBlocks.DENSE_SNOW); spike = new SDFTranslate().setTranslate(0, size - 0.5F, 0).setSource(spike); for (Vector3f point: points) { SDF rotated = spike; diff --git a/src/main/java/ru/betterend/world/structures/features/StructureGiantMossyGlowshroom.java b/src/main/java/ru/betterend/world/structures/features/StructureGiantMossyGlowshroom.java index b4ca3c4b..5c90977f 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructureGiantMossyGlowshroom.java +++ b/src/main/java/ru/betterend/world/structures/features/StructureGiantMossyGlowshroom.java @@ -24,15 +24,15 @@ import ru.betterend.util.sdf.operator.SDFSmoothUnion; import ru.betterend.util.sdf.operator.SDFSubtraction; import ru.betterend.util.sdf.operator.SDFTranslate; import ru.betterend.util.sdf.operator.SDFUnion; -import ru.betterend.util.sdf.primitive.SDFCapedCone; +import ru.betterend.util.sdf.primitive.SDFCappedCone; import ru.betterend.util.sdf.primitive.SDFPrimitive; import ru.betterend.util.sdf.primitive.SDFSphere; public class StructureGiantMossyGlowshroom extends SDFStructureFeature { @Override protected SDF getSDF(BlockPos center, Random random) { - SDFCapedCone cone1 = new SDFCapedCone().setHeight(2.5F).setRadius1(1.5F).setRadius2(2.5F); - SDFCapedCone cone2 = new SDFCapedCone().setHeight(3F).setRadius1(2.5F).setRadius2(13F); + SDFCappedCone cone1 = new SDFCappedCone().setHeight(2.5F).setRadius1(1.5F).setRadius2(2.5F); + SDFCappedCone cone2 = new SDFCappedCone().setHeight(3F).setRadius1(2.5F).setRadius2(13F); SDF posedCone2 = new SDFTranslate().setTranslate(0, 5, 0).setSource(cone2); SDF posedCone3 = new SDFTranslate().setTranslate(0, 12F, 0).setSource(new SDFScale().setScale(2).setSource(cone2)); SDF upCone = new SDFSubtraction().setSourceA(posedCone2).setSourceB(posedCone3); @@ -43,7 +43,7 @@ public class StructureGiantMossyGlowshroom extends SDFStructureFeature { innerCone = new SDFScale3D().setScale(1.2F, 1F, 1.2F).setSource(innerCone); cones = new SDFUnion().setSourceA(cones).setSourceB(innerCone); - SDF glowCone = new SDFCapedCone().setHeight(3F).setRadius1(2F).setRadius2(12.5F); + SDF glowCone = new SDFCappedCone().setHeight(3F).setRadius1(2F).setRadius2(12.5F); SDFPrimitive priGlowCone = (SDFPrimitive) glowCone; glowCone = new SDFTranslate().setTranslate(0, 4.25F, 0).setSource(glowCone); glowCone = new SDFSubtraction().setSourceA(glowCone).setSourceB(posedCone3); From fc71ea4eba32d8282fdba085d4803e535d5366ec Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 31 Dec 2020 07:15:46 +0300 Subject: [PATCH 074/463] Arbitrary hierarchy --- .../ru/betterend/config/CategoryConfig.java | 2 +- .../ru/betterend/config/ConfigKeeper.java | 37 +++++---- .../java/ru/betterend/config/ConfigKey.java | 75 +++++++++---------- .../java/ru/betterend/config/Configs.java | 10 +-- .../java/ru/betterend/config/EntryConfig.java | 2 +- .../{SimpleConfig.java => PathConfig.java} | 65 +++++++++++++++- .../java/ru/betterend/registry/EndBlocks.java | 2 +- .../ru/betterend/registry/EndEntities.java | 4 +- .../java/ru/betterend/registry/EndItems.java | 6 +- .../world/generator/TerrainGenerator.java | 4 +- 10 files changed, 133 insertions(+), 74 deletions(-) rename src/main/java/ru/betterend/config/{SimpleConfig.java => PathConfig.java} (59%) diff --git a/src/main/java/ru/betterend/config/CategoryConfig.java b/src/main/java/ru/betterend/config/CategoryConfig.java index b341b2eb..97833379 100644 --- a/src/main/java/ru/betterend/config/CategoryConfig.java +++ b/src/main/java/ru/betterend/config/CategoryConfig.java @@ -4,7 +4,7 @@ public class CategoryConfig extends IdConfig { public CategoryConfig(String group) { super(group, (id, category) -> { - return new ConfigKey(id.getNamespace(), category, id.getPath()); + return new ConfigKey(id.getPath(), id.getNamespace(), category); }); } } diff --git a/src/main/java/ru/betterend/config/ConfigKeeper.java b/src/main/java/ru/betterend/config/ConfigKeeper.java index f35babc1..6cfba622 100644 --- a/src/main/java/ru/betterend/config/ConfigKeeper.java +++ b/src/main/java/ru/betterend/config/ConfigKeeper.java @@ -9,6 +9,7 @@ import org.jetbrains.annotations.Nullable; import com.google.common.collect.Maps; import com.google.common.reflect.TypeToken; +import com.google.gson.JsonElement; import com.google.gson.JsonObject; import net.minecraft.util.JsonHelper; @@ -38,25 +39,29 @@ public final class ConfigKeeper { if (configObject == null) { return; } - String group = key.getOwner(); - JsonObject jsonGroup; - if (configObject.has(group)) { - jsonGroup = JsonHelper.getObject(configObject, group); - } else { - jsonGroup = new JsonObject(); - configObject.add(group, jsonGroup); - } - String category = key.getCategory(); - JsonObject jsonCategory; - if (jsonGroup.has(category)) { - jsonCategory = JsonHelper.getObject(jsonGroup, category); - } else { - jsonCategory = new JsonObject(); - jsonGroup.add(category, jsonCategory); + String[] path = key.getPath(); + JsonObject obj = null; + + if (!key.isRoot()) { + for (String group: path) { + JsonElement element = configObject.get(group); + if (element == null || !element.isJsonObject()) { + element = new JsonObject(); + if (obj == null) { + obj = element.getAsJsonObject(); + configObject.add(group, obj); + } + else { + obj.add(group, element); + } + } + obj = element.getAsJsonObject(); + } } + String paramKey = key.getEntry(); paramKey += " [default: " + entry.getDefault() + "]"; - this.changed = entry.setLocation(jsonCategory, paramKey); + this.changed = entry.setLocation(obj == null ? configObject : obj, paramKey); } private > void storeValue(E entry, T value) { diff --git a/src/main/java/ru/betterend/config/ConfigKey.java b/src/main/java/ru/betterend/config/ConfigKey.java index 5c7ed7bc..02606ca4 100644 --- a/src/main/java/ru/betterend/config/ConfigKey.java +++ b/src/main/java/ru/betterend/config/ConfigKey.java @@ -1,38 +1,41 @@ package ru.betterend.config; -import org.jetbrains.annotations.NotNull; +import net.minecraft.util.Identifier; public class ConfigKey { - private final String owner; - private final String category; + private final String path[]; private final String entry; + private final boolean root; - public ConfigKey(@NotNull String owner, @NotNull String category, @NotNull String entry) { - this.validate(owner, category, entry); - this.owner = owner; - this.category = category; + public ConfigKey(String entry, String... path) { + validate(entry, path); + this.path = path; this.entry = entry; + this.root = path.length == 0 || (path.length == 1 && path[0].isEmpty()); + } + + public ConfigKey(String entry, Identifier path) { + this(entry, path.getNamespace(), path.getPath()); } - public String getOwner() { - return owner; - } - - public String getCategory() { - return category; + public String[] getPath() { + return path; } public String getEntry() { return entry; } + + public boolean isRoot() { + return root; + } @Override public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + category.hashCode(); + result = prime * result + path.hashCode(); result = prime * result + entry.hashCode(); - result = prime * result + owner.hashCode(); return result; } @@ -45,25 +48,15 @@ public class ConfigKey { return false; } ConfigKey other = (ConfigKey) obj; - if (category == null) { - if (other.category != null) { - return false; - } - } else if (!category.equals(other.category)) { + if (other.path.length != path.length) { return false; } - if (entry == null) { - if (other.entry != null) { + for (int i = 0; i < path.length; i++) { + if (!path[i].equals(other.path[i])) { return false; } - } else if (!entry.equals(other.entry)) { - return false; } - if (owner == null) { - if (other.owner != null) { - return false; - } - } else if (!owner.equals(other.owner)) { + if (!entry.equals(other.entry)) { return false; } return true; @@ -71,18 +64,22 @@ public class ConfigKey { @Override public String toString() { - return String.format("%s:%s:%s", owner, category, entry); + if (root) { + return String.format("ROOT:%s", entry); + } + String p = path[0]; + for (int i = 1; i < path.length; i++) { + p += "." + path[i]; + } + return String.format("%s:%s", p, entry); } - - private void validate(String owner, String category, String entry) { - if (owner == null) { - throw new NullPointerException("Failed to create ConfigKey: 'owner' can't be null."); - } - if (category == null) { - throw new NullPointerException("Failed to create ConfigKey: 'category' can't be null."); - } + + private void validate(String entry, String... path) { if (entry == null) { - throw new NullPointerException("Failed to create ConfigKey: 'entry' can't be null."); + throw new NullPointerException("Config key must be not null!"); + } + if (entry.isEmpty()) { + throw new IndexOutOfBoundsException("Config key must be not empty!"); } } } diff --git a/src/main/java/ru/betterend/config/Configs.java b/src/main/java/ru/betterend/config/Configs.java index ddee0536..20028f10 100644 --- a/src/main/java/ru/betterend/config/Configs.java +++ b/src/main/java/ru/betterend/config/Configs.java @@ -1,17 +1,17 @@ package ru.betterend.config; public class Configs { - public static final IdConfig ENTITY_CONFIG = new CategoryConfig("entities"); - public static final IdConfig BLOCK_CONFIG = new CategoryConfig("blocks"); - public static final SimpleConfig GENERAL = new SimpleConfig("settings"); - public static final IdConfig ITEM_CONFIG = new CategoryConfig("items"); + public static final PathConfig ENTITY_CONFIG = new PathConfig("entities"); + public static final PathConfig BLOCK_CONFIG = new PathConfig("blocks"); + public static final PathConfig ITEM_CONFIG = new PathConfig("items"); public static final IdConfig BIOME_CONFIG = new EntryConfig("biomes"); + public static final PathConfig GENERATOR_CONFIG = new PathConfig("generator"); public static void saveConfigs() { ENTITY_CONFIG.saveChanges(); BLOCK_CONFIG.saveChanges(); BIOME_CONFIG.saveChanges(); ITEM_CONFIG.saveChanges(); - GENERAL.saveChanges(); + GENERATOR_CONFIG.saveChanges(); } } diff --git a/src/main/java/ru/betterend/config/EntryConfig.java b/src/main/java/ru/betterend/config/EntryConfig.java index 88ef5f5a..44ed19a2 100644 --- a/src/main/java/ru/betterend/config/EntryConfig.java +++ b/src/main/java/ru/betterend/config/EntryConfig.java @@ -4,7 +4,7 @@ public class EntryConfig extends IdConfig { public EntryConfig(String group) { super(group, (id, entry) -> { - return new ConfigKey(id.getNamespace(), id.getPath(), entry); + return new ConfigKey(entry, id); }); } } diff --git a/src/main/java/ru/betterend/config/SimpleConfig.java b/src/main/java/ru/betterend/config/PathConfig.java similarity index 59% rename from src/main/java/ru/betterend/config/SimpleConfig.java rename to src/main/java/ru/betterend/config/PathConfig.java index 463857a6..85b99a72 100644 --- a/src/main/java/ru/betterend/config/SimpleConfig.java +++ b/src/main/java/ru/betterend/config/PathConfig.java @@ -2,14 +2,13 @@ package ru.betterend.config; import org.jetbrains.annotations.Nullable; -import ru.betterend.BetterEnd; import ru.betterend.config.ConfigKeeper.Entry; import ru.betterend.config.ConfigKeeper.FloatRange; import ru.betterend.config.ConfigKeeper.IntegerRange; -public class SimpleConfig extends Config { +public class PathConfig extends Config { - public SimpleConfig(String group) { + public PathConfig(String group) { super(group); } @@ -17,7 +16,7 @@ public class SimpleConfig extends Config { protected void registerEntries() {} protected ConfigKey createKey(String category, String key) { - return new ConfigKey(BetterEnd.MOD_ID, category, key); + return new ConfigKey(key, category.split("\\.")); } @Nullable @@ -85,4 +84,62 @@ public class SimpleConfig extends Config { public boolean setBoolean(String category, String key, boolean value) { return this.setBoolean(createKey(category, key), value); } + + // From Root + + public String getStringRoot(String key, String defaultValue) { + return this.getString(createKey("", key), defaultValue); + } + + public String getStringRoot(String key) { + return this.getString(createKey("", key)); + } + + public boolean setStringRoot(String key, String value) { + return this.setString(createKey("", key), value); + } + + public int getIntRoot(String key, int defaultValue) { + return this.getInt(createKey("", key), defaultValue); + } + + public int getIntRoot(String key) { + return this.getInt(createKey("", key)); + } + + public boolean setIntRoot(String key, int value) { + return this.setInt(createKey("", key), value); + } + + public boolean setRangedIntRoot(String key, int value) { + return this.setRanged(createKey("", key), value, IntegerRange.class); + } + + public boolean setRangedFloatRoot(String key, float value) { + return this.setRanged(createKey("", key), value, FloatRange.class); + } + + public float getFloatRoot(String key, float defaultValue) { + return this.getFloat(createKey("", key), defaultValue); + } + + public float getFloatRoot(String key) { + return this.getFloat(createKey("", key)); + } + + public boolean setFloatRoot(String key, float value) { + return this.setFloat(createKey("", key), value); + } + + public boolean getBooleanRoot(String key, boolean defaultValue) { + return this.getBoolean(createKey("", key), defaultValue); + } + + public boolean getBooleanRoot(String key) { + return this.getBoolean(createKey("", key)); + } + + public boolean setBooleanRoot(String key, boolean value) { + return this.setBoolean(createKey("", key), value); + } } diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index e2e2fcdd..68e0a8cb 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -302,7 +302,7 @@ public class EndBlocks { public static void register() {} public static Block registerBlock(Identifier id, Block block) { - if (!Configs.BLOCK_CONFIG.getBoolean(id, "blocks", true)) { + if (!Configs.BLOCK_CONFIG.getBooleanRoot(id.getPath(), true)) { return block; } Registry.register(Registry.BLOCK, id, block); diff --git a/src/main/java/ru/betterend/registry/EndEntities.java b/src/main/java/ru/betterend/registry/EndEntities.java index 1201df47..7e4b812e 100644 --- a/src/main/java/ru/betterend/registry/EndEntities.java +++ b/src/main/java/ru/betterend/registry/EndEntities.java @@ -39,7 +39,7 @@ public class EndEntities { protected static EntityType register(String name, SpawnGroup group, float width, float height, EntityFactory entity) { Identifier id = BetterEnd.makeID(name); EntityType type = FabricEntityTypeBuilder.create(group, entity).dimensions(EntityDimensions.fixed(width, height)).build(); - if (Configs.ENTITY_CONFIG.getBoolean(id, "entities", true)) { + if (Configs.ENTITY_CONFIG.getBooleanRoot(id.getPath(), true)) { return Registry.register(Registry.ENTITY_TYPE, id, type); } return type; @@ -48,7 +48,7 @@ public class EndEntities { private static EntityType register(String name, SpawnGroup group, float width, float height, EntityFactory entity, Builder attributes, boolean fixedSize, int eggColor, int dotsColor) { Identifier id = BetterEnd.makeID(name); EntityType type = FabricEntityTypeBuilder.create(group, entity).dimensions(fixedSize ? EntityDimensions.fixed(width, height) : EntityDimensions.changing(width, height)).build(); - if (Configs.ENTITY_CONFIG.getBoolean(id, "entities", true)) { + if (Configs.ENTITY_CONFIG.getBooleanRoot(id.getPath(), true)) { FabricDefaultAttributeRegistry.register(type, attributes); EndItems.registerEgg("spawn_egg_" + name, type, eggColor, dotsColor); return Registry.register(Registry.ENTITY_TYPE, BetterEnd.makeID(name), type); diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index 7e51f182..03076eb2 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -124,7 +124,7 @@ public class EndItems { if (item instanceof ArmorItem) { return registerArmor(id, item); } - if (!Configs.ITEM_CONFIG.getBoolean(id, "items", true)) { + if (!Configs.ITEM_CONFIG.getBoolean("items", id.getPath(), true)) { return item; } registerItem(id, item, MOD_ITEMS); @@ -144,7 +144,7 @@ public class EndItems { } private static Item registerArmor(Identifier id, Item item) { - if (!Configs.ITEM_CONFIG.getBoolean(id, "armor", true)) { + if (!Configs.ITEM_CONFIG.getBoolean("armor", id.getPath(), true)) { return item; } registerItem(id, item, MOD_ITEMS); @@ -153,7 +153,7 @@ public class EndItems { private static ToolItem registerTool(String name, ToolItem item) { Identifier id = BetterEnd.makeID(name); - if (!Configs.ITEM_CONFIG.getBoolean(id, "tools", true)) { + if (!Configs.ITEM_CONFIG.getBoolean("tools", id.getPath(), true)) { return item; } registerItem(id, item, MOD_ITEMS); diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index 6ce5b425..abe22eca 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -22,8 +22,8 @@ public class TerrainGenerator { private static boolean noRingVoid; public static void init() { - newGenerator = Configs.GENERAL.getBoolean("generator", "useNewGenerator", false); - noRingVoid = Configs.GENERAL.getBoolean("generator", "noRingVoid", false); + newGenerator = Configs.GENERATOR_CONFIG.getBoolean("generator", "useNewGenerator", false); + noRingVoid = Configs.GENERATOR_CONFIG.getBoolean("generator", "noRingVoid", false); } public static void initNoise(long seed) { From 2549ab810fa3b2287e83f6b7ac91d69d6b1f2707 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 31 Dec 2020 07:24:50 +0300 Subject: [PATCH 075/463] Client sky option --- .../ru/betterend/client/BetterEndClient.java | 1 + .../ru/betterend/client/ClientOptions.java | 20 +++++++++++++++++++ .../java/ru/betterend/config/Configs.java | 2 ++ .../mixin/client/WorldRendererMixin.java | 6 +++--- 4 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 src/main/java/ru/betterend/client/ClientOptions.java diff --git a/src/main/java/ru/betterend/client/BetterEndClient.java b/src/main/java/ru/betterend/client/BetterEndClient.java index a7956ef6..e9e2881f 100644 --- a/src/main/java/ru/betterend/client/BetterEndClient.java +++ b/src/main/java/ru/betterend/client/BetterEndClient.java @@ -23,6 +23,7 @@ public class BetterEndClient implements ClientModInitializer { EndParticles.register(); EndEntitiesRenders.register(); EndModelProviders.register(); + ClientOptions.init(); if (BetterEnd.isDevEnvironment()) { TranslationHelper.printMissingNames(); diff --git a/src/main/java/ru/betterend/client/ClientOptions.java b/src/main/java/ru/betterend/client/ClientOptions.java new file mode 100644 index 00000000..29bcd595 --- /dev/null +++ b/src/main/java/ru/betterend/client/ClientOptions.java @@ -0,0 +1,20 @@ +package ru.betterend.client; + +import ru.betterend.config.Configs; + +public class ClientOptions { + private static boolean customSky; + + public static void init() { + setCustomSky(Configs.CLENT_CONFIG.getBooleanRoot("customSky", true)); + Configs.CLENT_CONFIG.saveChanges(); + } + + public static boolean isCustomSky() { + return customSky; + } + + public static void setCustomSky(boolean customSky) { + ClientOptions.customSky = customSky; + } +} diff --git a/src/main/java/ru/betterend/config/Configs.java b/src/main/java/ru/betterend/config/Configs.java index 20028f10..7274b0c5 100644 --- a/src/main/java/ru/betterend/config/Configs.java +++ b/src/main/java/ru/betterend/config/Configs.java @@ -6,6 +6,7 @@ public class Configs { public static final PathConfig ITEM_CONFIG = new PathConfig("items"); public static final IdConfig BIOME_CONFIG = new EntryConfig("biomes"); public static final PathConfig GENERATOR_CONFIG = new PathConfig("generator"); + public static final PathConfig CLENT_CONFIG = new PathConfig("client"); public static void saveConfigs() { ENTITY_CONFIG.saveChanges(); @@ -13,5 +14,6 @@ public class Configs { BIOME_CONFIG.saveChanges(); ITEM_CONFIG.saveChanges(); GENERATOR_CONFIG.saveChanges(); + CLENT_CONFIG.saveChanges(); } } diff --git a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java index ea68a311..abbed813 100644 --- a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java @@ -30,6 +30,7 @@ import net.minecraft.client.world.ClientWorld; import net.minecraft.util.Identifier; import net.minecraft.util.math.Quaternion; import ru.betterend.BetterEnd; +import ru.betterend.client.ClientOptions; import ru.betterend.util.BackgroundInfo; import ru.betterend.util.MHelper; @@ -83,7 +84,7 @@ public class WorldRendererMixin { @Inject(method = "renderSky", at = @At("HEAD"), cancellable = true) private void renderBetterEndSky(MatrixStack matrices, float tickDelta, CallbackInfo info) { - if (client.world.getSkyProperties().getSkyType() == SkyProperties.SkyType.END) { + if (ClientOptions.isCustomSky() && client.world.getSkyProperties().getSkyType() == SkyProperties.SkyType.END) { time = (ticks % 360000) * 0.001F; BackgroundRenderer.setFogBlack(); @@ -324,8 +325,7 @@ public class WorldRendererMixin { private void makeCylinder(BufferBuilder buffer, int segments, double height, double radius) { buffer.begin(7, VertexFormats.POSITION_TEXTURE); - for (int i = 0; i < segments; i ++) - { + for (int i = 0; i < segments; i ++) { double a1 = (double) i * Math.PI * 2.0 / (double) segments; double a2 = (double) (i + 1) * Math.PI * 2.0 / (double) segments; double px1 = Math.sin(a1) * radius; From 56771daea9f259dd71c9dda31992ce703a39b6cf Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 31 Dec 2020 07:27:27 +0300 Subject: [PATCH 076/463] Use fog density config --- src/main/java/ru/betterend/client/ClientOptions.java | 10 ++++++++++ .../mixin/client/BackgroundRendererMixin.java | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/client/ClientOptions.java b/src/main/java/ru/betterend/client/ClientOptions.java index 29bcd595..cc4cac0f 100644 --- a/src/main/java/ru/betterend/client/ClientOptions.java +++ b/src/main/java/ru/betterend/client/ClientOptions.java @@ -4,9 +4,11 @@ import ru.betterend.config.Configs; public class ClientOptions { private static boolean customSky; + private static boolean useFogDensity; public static void init() { setCustomSky(Configs.CLENT_CONFIG.getBooleanRoot("customSky", true)); + setUseFogDensity(Configs.CLENT_CONFIG.getBooleanRoot("useFogDensity", true)); Configs.CLENT_CONFIG.saveChanges(); } @@ -17,4 +19,12 @@ public class ClientOptions { public static void setCustomSky(boolean customSky) { ClientOptions.customSky = customSky; } + + public static boolean useFogDensity() { + return useFogDensity; + } + + public static void setUseFogDensity(boolean useFogDensity) { + ClientOptions.useFogDensity = useFogDensity; + } } diff --git a/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java b/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java index 0d88add2..9b53ff68 100644 --- a/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java @@ -22,6 +22,7 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome.Category; +import ru.betterend.client.ClientOptions; import ru.betterend.registry.EndBiomes; import ru.betterend.util.BackgroundInfo; import ru.betterend.world.biome.EndBiome; @@ -72,7 +73,7 @@ public class BackgroundRendererMixin { Entity entity = camera.getFocusedEntity(); Biome biome = entity.world.getBiome(entity.getBlockPos()); FluidState fluidState = camera.getSubmergedFluidState(); - if (biome.getCategory() == Category.THEEND && fluidState.isEmpty()) { + if (ClientOptions.useFogDensity() && biome.getCategory() == Category.THEEND && fluidState.isEmpty()) { EndBiome endBiome = EndBiomes.getRenderBiome(biome); if (fogDensity == 0) { From 35ed6a05b13c63ddcda29f2792dd83f5360ae778 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 31 Dec 2020 07:50:29 +0300 Subject: [PATCH 077/463] Small fix --- .../java/ru/betterend/config/ConfigKeeper.java | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/main/java/ru/betterend/config/ConfigKeeper.java b/src/main/java/ru/betterend/config/ConfigKeeper.java index 6cfba622..9a6c073f 100644 --- a/src/main/java/ru/betterend/config/ConfigKeeper.java +++ b/src/main/java/ru/betterend/config/ConfigKeeper.java @@ -40,20 +40,15 @@ public final class ConfigKeeper { return; } String[] path = key.getPath(); - JsonObject obj = null; + JsonObject obj = configObject; if (!key.isRoot()) { for (String group: path) { - JsonElement element = configObject.get(group); + JsonElement element = obj.get(group); if (element == null || !element.isJsonObject()) { + changed = true; element = new JsonObject(); - if (obj == null) { - obj = element.getAsJsonObject(); - configObject.add(group, obj); - } - else { - obj.add(group, element); - } + obj.add(group, element); } obj = element.getAsJsonObject(); } @@ -61,7 +56,8 @@ public final class ConfigKeeper { String paramKey = key.getEntry(); paramKey += " [default: " + entry.getDefault() + "]"; - this.changed = entry.setLocation(obj == null ? configObject : obj, paramKey); + + changed = entry.setLocation(obj, paramKey) || changed; } private > void storeValue(E entry, T value) { From 1d95a4c7710fd35929c03df6babacf3e2894aad0 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 31 Dec 2020 07:55:56 +0300 Subject: [PATCH 078/463] Music option --- .../ru/betterend/client/ClientOptions.java | 10 +++ .../mixin/client/MusicTrackerMixin.java | 63 ++++++++++--------- 2 files changed, 43 insertions(+), 30 deletions(-) diff --git a/src/main/java/ru/betterend/client/ClientOptions.java b/src/main/java/ru/betterend/client/ClientOptions.java index cc4cac0f..de13c4ec 100644 --- a/src/main/java/ru/betterend/client/ClientOptions.java +++ b/src/main/java/ru/betterend/client/ClientOptions.java @@ -5,10 +5,12 @@ import ru.betterend.config.Configs; public class ClientOptions { private static boolean customSky; private static boolean useFogDensity; + private static boolean blendBiomeMusic; public static void init() { setCustomSky(Configs.CLENT_CONFIG.getBooleanRoot("customSky", true)); setUseFogDensity(Configs.CLENT_CONFIG.getBooleanRoot("useFogDensity", true)); + setBlendBiomeMusic(Configs.CLENT_CONFIG.getBooleanRoot("blendBiomeMusic", true)); Configs.CLENT_CONFIG.saveChanges(); } @@ -27,4 +29,12 @@ public class ClientOptions { public static void setUseFogDensity(boolean useFogDensity) { ClientOptions.useFogDensity = useFogDensity; } + + public static boolean blendBiomeMusic() { + return blendBiomeMusic; + } + + public static void setBlendBiomeMusic(boolean blendBiomeMusic) { + ClientOptions.blendBiomeMusic = blendBiomeMusic; + } } diff --git a/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java b/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java index 5e0f531e..0e93e7c9 100644 --- a/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java @@ -16,6 +16,7 @@ import net.minecraft.client.sound.SoundInstance; import net.minecraft.sound.MusicSound; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; +import ru.betterend.client.ClientOptions; @Mixin(MusicTracker.class) public class MusicTrackerMixin { @@ -39,42 +40,44 @@ public class MusicTrackerMixin { @Inject(method = "tick", at = @At("HEAD"), cancellable = true) public void beOnTick(CallbackInfo info) { - MusicSound musicSound = client.getMusicType(); - if (volume > 0 && beIsInEnd() && beShouldChangeSound(musicSound)) { - if (volume > 0) { - if (srcVolume < 0) { - srcVolume = current.getVolume(); - } - if (current instanceof AbstractSoundInstance) { - ((AbstractSoundInstanceAccessor) current).setVolume(volume); - } - client.getSoundManager().updateSoundVolume(current.getCategory(), current.getVolume() * volume); - long t = System.currentTimeMillis(); - if (volume == 1 && time == 0) { + if (ClientOptions.blendBiomeMusic()) { + MusicSound musicSound = client.getMusicType(); + if (volume > 0 && beIsInEnd() && beShouldChangeSound(musicSound)) { + if (volume > 0) { + if (srcVolume < 0) { + srcVolume = current.getVolume(); + } + if (current instanceof AbstractSoundInstance) { + ((AbstractSoundInstanceAccessor) current).setVolume(volume); + } + client.getSoundManager().updateSoundVolume(current.getCategory(), current.getVolume() * volume); + long t = System.currentTimeMillis(); + if (volume == 1 && time == 0) { + time = t; + } + float delta = (t - time) * 0.0005F; time = t; + volume -= delta; + if (volume < 0) { + volume = 0; + } } - float delta = (t - time) * 0.0005F; - time = t; - volume -= delta; - if (volume < 0) { - volume = 0; + if (volume == 0) { + volume = 1; + time = 0; + srcVolume = -1; + this.client.getSoundManager().stop(this.current); + this.timeUntilNextSong = MathHelper.nextInt(this.random, 0, musicSound.getMinDelay() / 2); + this.current = null; } + if (this.current == null && this.timeUntilNextSong-- <= 0) { + this.play(musicSound); + } + info.cancel(); } - if (volume == 0) { + else { volume = 1; - time = 0; - srcVolume = -1; - this.client.getSoundManager().stop(this.current); - this.timeUntilNextSong = MathHelper.nextInt(this.random, 0, musicSound.getMinDelay() / 2); - this.current = null; } - if (this.current == null && this.timeUntilNextSong-- <= 0) { - this.play(musicSound); - } - info.cancel(); - } - else { - volume = 1; } } From b76b122784ebef4eb40e3ee199069dc100013ba8 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 31 Dec 2020 08:05:18 +0300 Subject: [PATCH 079/463] Biome size config value --- .../java/ru/betterend/config/Configs.java | 11 +++++- .../world/generator/BetterEndBiomeSource.java | 4 +-- .../betterend/world/generator/BiomeMap.java | 36 ++++++++----------- .../world/generator/GeneratorOptions.java | 21 +++++++++++ .../world/generator/TerrainGenerator.java | 4 +-- 5 files changed, 50 insertions(+), 26 deletions(-) create mode 100644 src/main/java/ru/betterend/world/generator/GeneratorOptions.java diff --git a/src/main/java/ru/betterend/config/Configs.java b/src/main/java/ru/betterend/config/Configs.java index 7274b0c5..d6a32724 100644 --- a/src/main/java/ru/betterend/config/Configs.java +++ b/src/main/java/ru/betterend/config/Configs.java @@ -1,11 +1,17 @@ package ru.betterend.config; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import ru.betterend.BetterEnd; + public class Configs { public static final PathConfig ENTITY_CONFIG = new PathConfig("entities"); public static final PathConfig BLOCK_CONFIG = new PathConfig("blocks"); public static final PathConfig ITEM_CONFIG = new PathConfig("items"); public static final IdConfig BIOME_CONFIG = new EntryConfig("biomes"); public static final PathConfig GENERATOR_CONFIG = new PathConfig("generator"); + + @Environment(value = EnvType.CLIENT) public static final PathConfig CLENT_CONFIG = new PathConfig("client"); public static void saveConfigs() { @@ -14,6 +20,9 @@ public class Configs { BIOME_CONFIG.saveChanges(); ITEM_CONFIG.saveChanges(); GENERATOR_CONFIG.saveChanges(); - CLENT_CONFIG.saveChanges(); + + if (BetterEnd.isClient()) { + CLENT_CONFIG.saveChanges(); + } } } diff --git a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java index a99d4c03..441d8ce2 100644 --- a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java +++ b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java @@ -42,8 +42,8 @@ public class BetterEndBiomeSource extends BiomeSource { public BetterEndBiomeSource(Registry biomeRegistry, long seed) { super(getBiomes(biomeRegistry)); - this.mapLand = new BiomeMap(seed, 256, EndBiomes.LAND_BIOMES); - this.mapVoid = new BiomeMap(seed, 256, EndBiomes.VOID_BIOMES); + this.mapLand = new BiomeMap(seed, GeneratorOptions.getBiomeSizeLand(), EndBiomes.LAND_BIOMES); + this.mapVoid = new BiomeMap(seed, GeneratorOptions.getBiomeSizeVoid(), EndBiomes.VOID_BIOMES); this.centerBiome = biomeRegistry.getOrThrow(BiomeKeys.THE_END); this.barrens = biomeRegistry.getOrThrow(BiomeKeys.END_BARRENS); this.biomeRegistry = biomeRegistry; diff --git a/src/main/java/ru/betterend/world/generator/BiomeMap.java b/src/main/java/ru/betterend/world/generator/BiomeMap.java index 450b162e..bcc73d85 100644 --- a/src/main/java/ru/betterend/world/generator/BiomeMap.java +++ b/src/main/java/ru/betterend/world/generator/BiomeMap.java @@ -1,6 +1,8 @@ package ru.betterend.world.generator; -import java.util.HashMap; +import java.util.Map; + +import com.google.common.collect.Maps; import net.minecraft.util.math.ChunkPos; import net.minecraft.world.gen.ChunkRandom; @@ -8,11 +10,10 @@ import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; import ru.betterend.world.biome.EndBiome; -public class BiomeMap -{ +public class BiomeMap { private static final ChunkRandom RANDOM = new ChunkRandom(); - private final HashMap maps = new HashMap(); + private final Map maps = Maps.newHashMap(); private final int size; private final int sizeXZ; private final int depth; @@ -20,8 +21,7 @@ public class BiomeMap private final OpenSimplexNoise noiseZ; private final BiomePicker picker; - public BiomeMap(long seed, int size, BiomePicker picker) - { + public BiomeMap(long seed, int size, BiomePicker picker) { maps.clear(); RANDOM.setSeed(seed); noiseX = new OpenSimplexNoise(RANDOM.nextLong()); @@ -32,15 +32,13 @@ public class BiomeMap this.picker = picker; } - public void clearCache() - { + public void clearCache() { if (maps.size() > 32) { maps.clear(); } } - private EndBiome getRawBiome(int bx, int bz) - { + private EndBiome getRawBiome(int bx, int bz) { double x = (double) bx * size / sizeXZ; double z = (double) bz * size / sizeXZ; double nx = x; @@ -49,8 +47,7 @@ public class BiomeMap double px = bx * 0.2; double pz = bz * 0.2; - for (int i = 0; i < depth; i++) - { + for (int i = 0; i < depth; i++) { nx = (x + noiseX.eval(px, pz)) / 2F; nz = (z + noiseZ.eval(px, pz)) / 2F; @@ -72,8 +69,7 @@ public class BiomeMap ChunkPos cpos = new ChunkPos(MHelper.floor(x / BiomeChunk.WIDTH), MHelper.floor(z / BiomeChunk.WIDTH)); BiomeChunk chunk = maps.get(cpos); - if (chunk == null) - { + if (chunk == null) { RANDOM.setTerrainSeed(cpos.x, cpos.z); chunk = new BiomeChunk(this, RANDOM, picker); maps.put(cpos, chunk); @@ -82,15 +78,14 @@ public class BiomeMap return chunk.getBiome(MHelper.floor(x), MHelper.floor(z)); } - public EndBiome getBiome(int x, int z) - { + public EndBiome getBiome(int x, int z) { EndBiome biome = getRawBiome(x, z); - if (biome.hasEdge() || (biome.hasParentBiome() && biome.getParentBiome().hasEdge())) - { + if (biome.hasEdge() || (biome.hasParentBiome() && biome.getParentBiome().hasEdge())) { EndBiome search = biome; - if (biome.hasParentBiome()) + if (biome.hasParentBiome()) { search = biome.getParentBiome(); + } int d = (int) Math.ceil(search.getEdgeSize() / 4F) << 2; boolean edge = !search.isSame(getRawBiome(x + d, z)); @@ -102,8 +97,7 @@ public class BiomeMap edge = edge || !search.isSame(getRawBiome(x + 1, z - 1)); edge = edge || !search.isSame(getRawBiome(x + 1, z + 1)); - if (edge) - { + if (edge) { biome = search.getEdge(); } } diff --git a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java new file mode 100644 index 00000000..fd6b1a8f --- /dev/null +++ b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java @@ -0,0 +1,21 @@ +package ru.betterend.world.generator; + +import ru.betterend.config.Configs; + +public class GeneratorOptions { + private static int biomeSizeLand; + private static int biomeSizeVoid; + + public static void init() { + biomeSizeLand = Configs.GENERATOR_CONFIG.getIntRoot("biomeSizeLand", 256); + biomeSizeVoid = Configs.GENERATOR_CONFIG.getIntRoot("biomeSizeVoid", 256); + } + + public static int getBiomeSizeLand() { + return biomeSizeLand; + } + + public static int getBiomeSizeVoid() { + return biomeSizeVoid; + } +} diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index abe22eca..4f8c8e9a 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -22,8 +22,8 @@ public class TerrainGenerator { private static boolean noRingVoid; public static void init() { - newGenerator = Configs.GENERATOR_CONFIG.getBoolean("generator", "useNewGenerator", false); - noRingVoid = Configs.GENERATOR_CONFIG.getBoolean("generator", "noRingVoid", false); + newGenerator = Configs.GENERATOR_CONFIG.getBooleanRoot("useNewGenerator", false); + noRingVoid = Configs.GENERATOR_CONFIG.getBooleanRoot("noRingVoid", false); } public static void initNoise(long seed) { From 5133628dbad5f3514a7b7f224b41837c14056753 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 31 Dec 2020 08:08:51 +0300 Subject: [PATCH 080/463] Fixes --- src/main/java/ru/betterend/BetterEnd.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index 9d0ffa19..80e43284 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -27,6 +27,7 @@ import ru.betterend.registry.EndTags; import ru.betterend.util.BonemealUtil; import ru.betterend.util.Logger; import ru.betterend.world.generator.BetterEndBiomeSource; +import ru.betterend.world.generator.GeneratorOptions; import ru.betterend.world.generator.TerrainGenerator; import ru.betterend.world.surface.SurfaceBuilders; @@ -56,6 +57,7 @@ public class BetterEnd implements ModInitializer { Integrations.register(); BonemealUtil.init(); TerrainGenerator.init(); + GeneratorOptions.init(); if (hasGuideBook()) { GuideBook.register(); From cef6cf0fd29c3c281adb8d593553605f59881534 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Thu, 31 Dec 2020 12:51:25 +0300 Subject: [PATCH 081/463] A little bit refactor --- .../ru/betterend/config/ConfigKeeper.java | 3 +- .../java/ru/betterend/config/ConfigKey.java | 4 +-- .../java/ru/betterend/config/PathConfig.java | 32 +++++++++++-------- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/main/java/ru/betterend/config/ConfigKeeper.java b/src/main/java/ru/betterend/config/ConfigKeeper.java index 9a6c073f..cdc10b84 100644 --- a/src/main/java/ru/betterend/config/ConfigKeeper.java +++ b/src/main/java/ru/betterend/config/ConfigKeeper.java @@ -46,7 +46,6 @@ public final class ConfigKeeper { for (String group: path) { JsonElement element = obj.get(group); if (element == null || !element.isJsonObject()) { - changed = true; element = new JsonObject(); obj.add(group, element); } @@ -57,7 +56,7 @@ public final class ConfigKeeper { String paramKey = key.getEntry(); paramKey += " [default: " + entry.getDefault() + "]"; - changed = entry.setLocation(obj, paramKey) || changed; + this.changed = entry.setLocation(obj, paramKey); } private > void storeValue(E entry, T value) { diff --git a/src/main/java/ru/betterend/config/ConfigKey.java b/src/main/java/ru/betterend/config/ConfigKey.java index 02606ca4..ad977fdb 100644 --- a/src/main/java/ru/betterend/config/ConfigKey.java +++ b/src/main/java/ru/betterend/config/ConfigKey.java @@ -8,7 +8,7 @@ public class ConfigKey { private final boolean root; public ConfigKey(String entry, String... path) { - validate(entry, path); + this.validate(entry); this.path = path; this.entry = entry; this.root = path.length == 0 || (path.length == 1 && path[0].isEmpty()); @@ -74,7 +74,7 @@ public class ConfigKey { return String.format("%s:%s", p, entry); } - private void validate(String entry, String... path) { + private void validate(String entry) { if (entry == null) { throw new NullPointerException("Config key must be not null!"); } diff --git a/src/main/java/ru/betterend/config/PathConfig.java b/src/main/java/ru/betterend/config/PathConfig.java index 85b99a72..06b98be0 100644 --- a/src/main/java/ru/betterend/config/PathConfig.java +++ b/src/main/java/ru/betterend/config/PathConfig.java @@ -19,6 +19,10 @@ public class PathConfig extends Config { return new ConfigKey(key, category.split("\\.")); } + protected ConfigKey createKey(String key) { + return new ConfigKey(key, ""); + } + @Nullable public > E getEntry(String category, String key, Class type) { return this.getEntry(createKey(category, key), type); @@ -88,58 +92,58 @@ public class PathConfig extends Config { // From Root public String getStringRoot(String key, String defaultValue) { - return this.getString(createKey("", key), defaultValue); + return this.getString(createKey(key), defaultValue); } public String getStringRoot(String key) { - return this.getString(createKey("", key)); + return this.getString(createKey(key)); } public boolean setStringRoot(String key, String value) { - return this.setString(createKey("", key), value); + return this.setString(createKey(key), value); } public int getIntRoot(String key, int defaultValue) { - return this.getInt(createKey("", key), defaultValue); + return this.getInt(createKey(key), defaultValue); } public int getIntRoot(String key) { - return this.getInt(createKey("", key)); + return this.getInt(createKey(key)); } public boolean setIntRoot(String key, int value) { - return this.setInt(createKey("", key), value); + return this.setInt(createKey(key), value); } public boolean setRangedIntRoot(String key, int value) { - return this.setRanged(createKey("", key), value, IntegerRange.class); + return this.setRanged(createKey(key), value, IntegerRange.class); } public boolean setRangedFloatRoot(String key, float value) { - return this.setRanged(createKey("", key), value, FloatRange.class); + return this.setRanged(createKey(key), value, FloatRange.class); } public float getFloatRoot(String key, float defaultValue) { - return this.getFloat(createKey("", key), defaultValue); + return this.getFloat(createKey(key), defaultValue); } public float getFloatRoot(String key) { - return this.getFloat(createKey("", key)); + return this.getFloat(createKey(key)); } public boolean setFloatRoot(String key, float value) { - return this.setFloat(createKey("", key), value); + return this.setFloat(createKey(key), value); } public boolean getBooleanRoot(String key, boolean defaultValue) { - return this.getBoolean(createKey("", key), defaultValue); + return this.getBoolean(createKey(key), defaultValue); } public boolean getBooleanRoot(String key) { - return this.getBoolean(createKey("", key)); + return this.getBoolean(createKey(key)); } public boolean setBooleanRoot(String key, boolean value) { - return this.setBoolean(createKey("", key), value); + return this.setBoolean(createKey(key), value); } } From 6db514f39fb2a9e4647dc833e758d6367ddc556b Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 31 Dec 2020 20:05:40 +0300 Subject: [PATCH 082/463] Textures for door & trapdoor, removed old prints --- .../client/gui/BlockSignEditScreen.java | 1 - .../ru/betterend/integration/ModIntegration.java | 1 - .../byg/features/BigEtherTreeFeature.java | 1 - .../textures/block/jellyshroom_door_bottom.png | Bin 0 -> 2159 bytes .../textures/block/jellyshroom_door_side.png | Bin 0 -> 1546 bytes .../textures/block/jellyshroom_door_top.png | Bin 0 -> 1928 bytes .../textures/block/jellyshroom_trapdoor.png | Bin 0 -> 2189 bytes .../betterend/textures/item/jellyshroom_door.png | Bin 0 -> 1728 bytes 8 files changed, 3 deletions(-) create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_door_bottom.png create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_door_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_door_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/jellyshroom_trapdoor.png create mode 100644 src/main/resources/assets/betterend/textures/item/jellyshroom_door.png diff --git a/src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java b/src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java index ff5b36d9..46eddd32 100644 --- a/src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java +++ b/src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java @@ -82,7 +82,6 @@ public class BlockSignEditScreen extends Screen { ++this.ticksSinceOpened; if (!this.sign.getType().supports(this.sign.getCachedState().getBlock())) { this.finishEditing(); - System.out.println(this.sign.getType()); } } diff --git a/src/main/java/ru/betterend/integration/ModIntegration.java b/src/main/java/ru/betterend/integration/ModIntegration.java index 03377cc3..cd02bb65 100644 --- a/src/main/java/ru/betterend/integration/ModIntegration.java +++ b/src/main/java/ru/betterend/integration/ModIntegration.java @@ -47,7 +47,6 @@ public abstract class ModIntegration { public EndFeature getFeature(String featureID, String configuredFeatureID, GenerationStep.Feature featureStep) { Feature feature = Registry.FEATURE.get(getID(featureID)); ConfiguredFeature featureConfigured = BuiltinRegistries.CONFIGURED_FEATURE.get(getID(configuredFeatureID)); - System.out.println(feature + " " + featureConfigured); return new EndFeature(feature, featureConfigured, featureStep); } diff --git a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java index 3be4934a..4c3d498b 100644 --- a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java @@ -49,7 +49,6 @@ public class BigEtherTreeFeature extends DefaultFeature { int rotCount = MHelper.randRange(5, 7, random); float startRad = MathHelper.lerp(splinePos, 2.3F, 0.8F) * 0.8F; Vector3f start = SplineHelper.getPos(trunk, splinePos * (trunk.size() - 1)); - System.out.println(start + " " + startRad + " " + branch.size()); for (int j = 0; j < rotCount; j++) { float angle = startAngle + (float) j / rotCount * MHelper.PI2; List br = SplineHelper.copySpline(branch); diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_door_bottom.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_door_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..683f0c5dad678e0322edcd994ec1e84856d41148 GIT binary patch literal 2159 zcmbVO4N%i&7%ogu@#jRRV~Uamyos9Tr!8%w1(B*0S5)NA-yv!8rOjxY(gaFTQ8^Gq zR7BBJQBQWd`Ny2w*liA-I(6rC>ZWtf&7JNxb=-cG`Ln6VzCh{RPC0MAOYtGSl`7!%1!}%S(2kEpmGyTB8}8Qsia1JfI+U;1E4#^tS_tP(z9%r5!1_y&+nU9JC1;9YV{>ghCi4sP~D)a(2KA@GKxp z1wIZ;C)WVpM5i>*&FZty}Ra9^fu&@d+qZC0A7)fC|GMl6sy@?^|QG|{m zhz_U?wgS&8>=VH>L+btomUvMJJPXujW2_!oVLcqMTFfXEr4>b(qvZ>@bUTQHIqE1YeQqAV0Wr ziAa0jF)XLHyBX!wIs+aJ-WH$W-m~fKp!GWeB<-U39WYrE6hG?&sSfD$v-B7KH2pGL z*tPm+t9=*hAMeKhsXk~f=VUz&04FGps`=pRtm!BX{@<##KYMI0b;9AWQ>QoiuXdWN*PMgzER35!@1yt3$HcqBl}-1A^*POL zL_u?cwY%~4!j{Z>;ZWnEt>32P+%MU<($cuHz?SZ- zV^w;^I+wf^+z zm>aj}zCVB8q2A$V7yPxL(0{#Y`p)pCNJl{1twOka>vZ1NoTWPY^P0Zy4N+k5AWfy+ z(tqOH;rhWVTKy7zu`YRW<-XxlkC=~t*ekBN^;m67@BP#4sr`Ca9KFfkzH#;Dsn(D4 z3roaHcdz_vu8fS*O>T;4%=n-ZZ@Ks2!IZ5(M4msNaBfCeVy>YK8D6*7xbjx6<7GVO zTH(sRV<;;T{YO#6h1m-W^8YNZD3$#$YL?a)d~;yV_G`0^pYAJ2^X}Q7JEHgv{;fTE z;PP5(V%@eKTgJsS;xU08v1?`#;)GQ-C;gh9PT|qki{E7qX*qFq*S+SP-D{g-t4|v4 zgcIHOtl3b}ZTaybhm(zA$)?spCCkoNy)bzZwK+Q8btG}1bi9oi*4FmiSLOL2?9Rwf Q)K3EIgiK50_}tRJ0iezHV*mgE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_door_side.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_door_side.png new file mode 100644 index 0000000000000000000000000000000000000000..a22b13211cb935cb119bff2be6f8287f104ad51b GIT binary patch literal 1546 zcmbVMU1%Id9N(l7ZAxlDg?JL&ZWVgf{myN&)2t!AjoxWDhV-yeP&&6ecemtrXS+L> zy^A0y1SwTCc`B_!!BVhlK`m8U)R!Xopn}CyeDOi7C{@9LKKP)s_pyjntzDR%uiyOs z-~Yo4^AC&+XNDPu87UUbMLLfr|ZMP(2fI0Tk7{d&0x}_zu zWbFes_5|qQG7_3zK+y~{J<|-Jy^IK3Mpf50xSub4z_G4la0hahWCeLta|^2>+P^wq zvR9XF-Qi~LW2c*d5_pI}w&~UV2s90@!wcv-ITks#10l->H=77#m#hUgk3+=f1dX@l z35A{11zD4HW#V2|k>p8HniOS~mt-JmK-Jma$5CmaQvr+S{XJQ9XK*z_0w9WU91F23 z;IJynx~_|oA}R_`5q#A032gFyw6o7(qR0;2fVkLa6Gm9Z4PtOq)2<0#kka~5&rQ@} zViN|UEJ%q-9iU^UxS$c%JHj1XM0MmLpF|WZr&#JG%Sz!_rS-fN9g(>es!`9jtD>V) zD?s8Rif|*e(cB7^xU;WVP{RaAHT(~Dq}Qo60mz345*(H=uJ;4A&}U)u`6Mt??5+c@ z@8CGfCW3lzkO>JgI7Lz*q;>1oF6!Lkm09%W9Isom2t^H=^-s^@?IY zI@DX$UAB`w0NP1{8=Rd)7CBt+*u8GgbZO%nqNM*4?k+6C6%xY`%~q)wuO*{Is=t_2 zW7ib%?^bs1{!+PpIBf^XGVMcjlXf!X)Akk8J{8O!nWsJOy`ni=+V$!48xL(C+%ak% zx%@>m{>pEgy9MJ?bLg9k?~ab0Iy7)TI{C&96TiUppFp^6@*Dr#D6~J$PH; z)u#rZyz$o6XPFb*9{1Yd*wF!U`)SL}oPA{M>GsLYmh}t_+GmHd`K@o<&76xfGaK#C zwDw|lZSTG-FXztve&?^-hktzR!tpcO`Y!|D-?21)K6`ve(yfbg^X8eo2cP*9P8RV< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_door_top.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_door_top.png new file mode 100644 index 0000000000000000000000000000000000000000..6057397af3762e3c19492b5302757a00b3746489 GIT binary patch literal 1928 zcmbVN4Nw$S96!hy1y3m%LHuYv!NKru_wKl_l@mD*Jtme2kIy7scK7a9?{4>Y7w%9| zBPmE^`~VflC?mBIgA{UdOj8;{r~#=)Ob3KADQ5^!`xq^1_c(5v#>(88x9`1uzxVrp z|F*4Q!XnKh0GF0fau_%2$5*YUDBMx z)K)p@7F>ce1cYFY)ri{95=7N&qi}+n|>u3Ic%~Bppbi z7y?kq)KW|yrvNlMnOqI&6md%d1tiyikOq`1rH~wk)UZ+q_#O!_jlnH&hH<4&7QfR= zY#c|!An10xWp1U6VyvKCr_+Iu0#qoZJVMGAJ2})Nb+U^l8H@yrF(l2AloJpb(E_TF z(@S_wCrohAep)B%a})0{(1X&TTm}gyd4V|Q$I*q1-76f&K*CNq2q(w#Sh*j|dkI1O z@Q2bm9DX#*B^U7;`D}YAnl%^G1eigvR3U>A$wj=xMU#rrHj1NI8}$!%_>cY8&~Oq% zpd7`RDat+>sPst|ASp=*j24K=CY?CtW|s(pe0K;V$`N{r0#ZOyxk9Rxo8>w2%O?%In;>}DMr17 zS5-!mIILF2VH&lrK&n#caH%>ju0X0)S(H+hR;Pj#gifQ?sweLoDXdTk;^ck&f8Kwd zA^9Rg?T^pn4-%Y2*(nC0aNf&GA%(rE1e-{fk5{p;C{`0L-^xw`-t2)YCd=)_d)iW9iB(>*JR#8#z}i z?_aR_#QHsWE;RG(a8_;>xewg;*_EFf=+rJtV#KPR@pbOo4>B`dT{$hK(cwFekU{%3 z^Ao0*Y~9kv4h`)_ca7n z1(!4PpLqEzaa6^(5gnDTgHav00)7K)$9&9SPl$@}ouCBPw8glWq zPX=Gv-*oY%=Ejcb?AV~lZ5JZDBaeSbgvD!1?%YPK4GyNSaqRP<%JAU8>0QY6o7>8o zssk;rhLr#KOA)~Jy?E`sOB@pc{nkAAX5SX7=4dFrnR#~pvFl%#-e~#2^u_d)%b~J@ zu$4O&My4J-X|U#JSA|{ZNnNu<^M*J^SsoxZTy5~2=^a7qM+d%d@A!GRYoNa`9=yEf z^@8v6=7f${Eq-ffp)D`B5qVE+oGs6at1oMP=ib$T-gAYs?zV>ZxXwLU9XQ*CFD9$z z?Hn*on`uBB!t(AwQ|l5+!nQB${Nuj9#XdGVF4DJE1q?njqb9p^Y*SN|@UKisPBS(d H)|LJVbcC`A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_trapdoor.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_trapdoor.png new file mode 100644 index 0000000000000000000000000000000000000000..eb576531e1612351bf466e1aa1e92f5c23497645 GIT binary patch literal 2189 zcmbVO3vknP7%yr^h+O-LkG1`q)SD4#yAPh;9w2f<%E=gHC-ebtY z@m6pG@)!@1DNhAtYzTsS0xR1N@NV)r6hUqX_y9#Y{AZ5}9&ntwOY%?tzwh_`zDK^x zf~+y4qdNEQtkdbD>>0LfaF5o`j%~qp*>X=ZxOMVpOi*;XF5R`Wjc)bYo;qFoS|NA5 zI^K~`-BP?zpAQPp>lQD`g421{`H=&pb#YqIiX)Kv0DX8Uufj60R(b=~27GL1W0((@| zPorp2QIWog)Jw7(#VLwHF#;tB1RxM4B&tjh5taB>1{<%ivfx(*NrW^;#wi6<3k;Mt zhv4%^Xho$ZO(0=tkny9q9@9c<1v(s0hx&XGw4$a>1zuY8K9*R?4f%OAn^&ZO%<^ed zc~OmTb;hv~TYo_IHbu&@DDUNc0Hy$8c*K?8BdL<&k)9AoWIGa#pSH?8qe^nFBzap4 zmDS1uS*==O%ur&UAaYWXGDH*AV#C`QmAAkIMqmg|AS9lPQ?!AiaWV-bX$)(IIzTIM zjLJL?Yy|j6!4fC9LeBzqIB2`5sEo++cAEtTqV$5m(In0iX2N7dSRf0*8G`|Fa*Pqd zNCVH4$u0upxF%h|-X^gDErXhUbLVmr3pgT4q8YQ3H=0NcF(o^lh|y&*A(YExM%ZLC z%etH-OX6fJ+gMou9}nYwm{n870Y)>&6BzI05Xx+DAruRE7?K2yZej@1Y;bZUZh|3> zrCpNjV?e72KE}|EjS{UP*RH9LPDTH8fxcQDg`Ts9vb$6UpHVTUK5HYU(?h zVYPO*z^qnh9z@^#T6j$Mo=s=7eUXO;q)#b+Gfa_OY7ryzscw+zXX!8WN%|FL>eJOf zTkW5${*i9{pXytZ%X%2m&4USw!dg72Hfx$ogZ{T_O?wZ`rB*l?cG@yBWx+#aPV*w5 zmcbOxAK&q~PS@6Hx25JLh6iQ)#@1)WR##QsxN&yL?$72C?Rs^Owx0HsPKmx){vbT- zvgt5$d05GYfeF3mM1>ab+2NgWxM0|Naj--A*>ZK=RVqx?oygl+-=D^9fzI`(+g`9h~&~p)2zTlx-Fc?ybzzzuV_`VV85mqNB5q zrS@L+K$-qa#$BP`{DD8~_FUe$@s(ROR|2KP`Ladju^o=Zrq2lH zm#v?7A#v{K;Wz$z`$yZB>?3$gNz%#N*3&gVST}v(?h#)9(WVpLgtfE&I544alEHO7 zz80?CKW(zOjd{y2%f&ZqV#+eC$M+qcnM3V7lP~}^lx7_-S-y3_x^tK6FLpTf>6thW ze4lk;J#kp6W*{ZXGwo<^N{=Q{Pr7XcP-64ySyZnzw@=EkH6n* uwwGrFXPy=tZoMjQPcEE#y9bojnDX+LH&Yu6+6~rz80=|dY&%9xDftIS$`PFa literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/jellyshroom_door.png b/src/main/resources/assets/betterend/textures/item/jellyshroom_door.png new file mode 100644 index 0000000000000000000000000000000000000000..2ac87812b2aba3ef92f62396d6267f8b878748bc GIT binary patch literal 1728 zcmbVNe@q)y9KRU_hQl-y9V5=&4im+By&r99dr%NsCM7K+ZIv2-?YMhwFSK{Z-IW$F zfk2|doJ>a?+X$K%{6{jEp%N!Q%+#>NUo$iChf(4ZAqEx`iPq_o`mVH%F;nL*dH3GC z_j#Z1@9zz@wmec&TwaVINQt}2<%6?9A4LW5y>~Os!fCtQ^tg&3x8JFcZOF;-G6cDG zQwRjLpx482Qq0KmQadmvV=_b|NKIW*X1NZaq3s|nhz{(h4;C;~;2l_-#Y=i+Cx{45 zJqqymv;?@G4$jVFb+u?sl7R#A*6)3|#A<2@K6Zv9}G%U_z>fB9mvXpI|mlg zG?^iYL?U5Kn2eGVCMdhzPLMP~(>O%nYPYDdNnBJbattn@a*7~pf+V6kBik;;H3tSY z-7+C2=V?VX>n7+hBFV}GWh8ZzGC-co;5$j3#Lkr)bdXu`(3BpENNfxdrvY zRNz^Sy)m%F3!(1+gz_8{l9U(=9VNurFd$?xoRQ}BGHy}TSdjy6mji>U8U=x8OlFIP zB6$ku?Ys%6tY#Z-x7f_MnF6%U%!lYIvo&|$C2?^*h`Iax|Ga-t5nvIq(VOSV2Z?b? zQAzPiJoK_jPvJ}|F-?LB=R07@nC=ezBUu z-LLfbe>L*4A&Bq)ZegzUSV2Sc)Vsls-HR_fSNyNu7Qf^fdHu-uYcp>jZGP~Lp?zn` zlb*_@_0MPbM3)wtE{!6=brQH&QX8kb%Fj&gSlcBXy=8XOw$^&0y=^(dt?nMf7JElh z6Ih$})MD4N-1TenUi8HZU-P&cI6QnsOfR1vFMQ$QZ}wdHdVAwU=k&MJ%+j;zYn{K} zfsFcsy{@{N$yhbg@>;F4ricFW!$QN*eg5IM)=SP^s2p`2ziK|T^3Jv2ejfVd?B$E8 zdkPO%-Q}z^G>nDiCuVAb`1|MP>(_Ty`e*m9IsD7-jW6_+P`;T$54hO)oZ)iIVD<4J rf4|v#Bysn?om1+L!5<=5`sVtOzQYrB-j^nO^?!`JvBh<|;n2XJEDBCV literal 0 HcmV?d00001 From 0123f3021e11d331dcf16dcfdcf9d151e7104d6e Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 31 Dec 2020 20:08:12 +0300 Subject: [PATCH 083/463] Texture compression --- .../byg/features/BigEtherTreeFeature.java | 3 +-- .../textures/block/blue_vine_lantern.png | Bin 700 -> 700 bytes .../textures/block/cave_moss_path_top.png | Bin 586 -> 586 bytes .../betterend/textures/block/dense_snow.png | Bin 215 -> 215 bytes .../textures/block/end_lotus_planks.png | Bin 583 -> 583 bytes .../textures/block/end_mycelium_path_top.png | Bin 548 -> 548 bytes .../textures/block/jellyshroom_cap.png | Bin 1618 -> 235 bytes .../textures/block/jellyshroom_door_bottom.png | Bin 2159 -> 622 bytes .../textures/block/jellyshroom_door_side.png | Bin 1546 -> 244 bytes .../textures/block/jellyshroom_door_top.png | Bin 1928 -> 628 bytes .../textures/block/jellyshroom_trapdoor.png | Bin 2189 -> 626 bytes .../mossy_glowshroom_stripped_log_side_2.png | Bin 682 -> 682 bytes .../mossy_glowshroom_stripped_log_top.png | Bin 726 -> 726 bytes .../textures/block/tenanea_door_top.png | Bin 564 -> 564 bytes .../textures/block/umbrella_tree_log_top.png | Bin 1770 -> 343 bytes .../textures/block/umbrella_tree_sapling.png | Bin 416 -> 269 bytes .../betterend/textures/block/violecite.png | Bin 237 -> 237 bytes .../textures/item/jellyshroom_door.png | Bin 1728 -> 410 bytes .../textures/item/umbrella_cluster_juice.png | Bin 389 -> 237 bytes .../textures/particle/jungle_spore_0.png | Bin 254 -> 166 bytes .../textures/particle/jungle_spore_1.png | Bin 259 -> 171 bytes .../textures/particle/jungle_spore_2.png | Bin 263 -> 172 bytes 22 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java index 4c3d498b..23a55875 100644 --- a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java @@ -9,7 +9,6 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Material; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -47,7 +46,7 @@ public class BigEtherTreeFeature extends DefaultFeature { List branch = SplineHelper.makeSpline(0, 0, 0, length, 0, 0, points < 2 ? 2 : points); SplineHelper.powerOffset(branch, length, 2F); int rotCount = MHelper.randRange(5, 7, random); - float startRad = MathHelper.lerp(splinePos, 2.3F, 0.8F) * 0.8F; + //float startRad = MathHelper.lerp(splinePos, 2.3F, 0.8F) * 0.8F; Vector3f start = SplineHelper.getPos(trunk, splinePos * (trunk.size() - 1)); for (int j = 0; j < rotCount; j++) { float angle = startAngle + (float) j / rotCount * MHelper.PI2; diff --git a/src/main/resources/assets/betterend/textures/block/blue_vine_lantern.png b/src/main/resources/assets/betterend/textures/block/blue_vine_lantern.png index 4b7ca65f4fff2cf86c9161a78abde28084b0b7f4..c269849a7245a67d024a2ee362c3bd221bb1f81d 100644 GIT binary patch delta 29 jcmdnPx`%aw79- delta 29 jcmX@ba*Abw7UQjr+WbrcualBqGXR07tDnm{r-UW|m-Y#} diff --git a/src/main/resources/assets/betterend/textures/block/dense_snow.png b/src/main/resources/assets/betterend/textures/block/dense_snow.png index efbdb3695b034bd6baf7fe3fab639a787d3fb42c..6ea9931268bf8c5493c81c0d8821961b54f4c595 100644 GIT binary patch delta 28 icmcc4c%5-V86)Gw@&JK*mvajkfWXt$&t;ucLK6Uzz6qfK delta 28 icmcc4c%5-V8RM;q zLK7#Uj%Pei&bVTvWbE-huX~4no&DYRrWWk`&*sbJ>9?Ea)A`A4z5npyS$i-~3Uc-9 z?(^B(tHu50tLnOG86m0JK6HoPIcJP3%feYa21?0%)ly0Y7k@Z6W{4rOap90+BmY-X zs6h|T#iEo#2p>HDi*ZRQ8PMLvYEoACmC}b8Q<^A=4H#&l2rMB6d<}0zH8^z+)1~K;h_tqL48T z!KzYl1aR&WilC74B9Koh!VJ0)GB6pV>v{?ok0a8?h=0clvA&H+<1r)mO za2sXr4W)HmXC|4OK_QJ&k=3#{%p1NLhiCO34ed?#90Hq8i#*8jp3Lv}5af)GVg(<6GDO0000U^Kce4EpNJ165DCOA zivr88?6%Xn`kNXj*`4PRe5&*u-kxwT z(fa^cD|vc#=R$JML3e(;R0;tB=HmAfCmOGHZRjHmtj_rl`!AQBYm^$SKRnoZa1kN^ zZ+3T<{UFg5vVZ!1IY*&TNs&@@wOZG;A_LjZf8CZkO;x^}-{}&gcZaW@-}e@iIpq*y zZwDxOQ!FWS&fxKeJK1%PEyg%su3>7)YZM(Q=UhR-Ob`b=rZR*!WCu=|F+-$r^dM-I zQXx2*)HniMrbH78P{N0N&IvP2fhkh5wx3S7aq;hvdVgzaEgg&r1t`f-+-H)6tx1Ez zdcC2z9{FvfW!O)F+b>zVV$w^Vqp-!ah67SA!t?d^s>U}b_gD+HC~{*;>% zV(hz~3SSxY7(NvDybsQy_;&Z{%JNV#RxEMLv{uDoirvPxdymW2JGr_8z_}2D(6hxF qB=_pjbmJ>z*0000)V79-MHFaUw4tDnm{r-UW|i_-~M delta 29 jcmZ3&vV>)V7UQjr+AkRen0IO&VgLe9S3j3^P6=1AwmkMU1q)_e{r%kJ~DSzRL=&g}}-$q#jDEdBDIpDq9Z002ov JPDHLkV1j~&TRZ>& literal 1618 zcmbVMX>1f#9G{H{YrB;SUn*+)7@{I}c8WRkvXwN>+FwUc1LM2`Uh0I7)WA0>O~b4`POeK*%4a zBsR!_2=8aZ49^8S0LQQqnu*YCfMQt4gkgXOwU5NoEIADa;u~tR@GeSb9mj+;ozLg} z`GDWBGBnHcJk4-4$59wT*+tzE3zTlJsWZfpEm?}`D25JPMlogNoG6Jkt(u^j4O-o< zxd}UrE{G=0`We@x3Q(3BI5TId72&c(BNb^#cWjJh8(1@IIEI}y{)W17eT@L@T0v;Y zxS=kZ)(~MkJtNqRnnP}gwv$B@(F4dfa+ZX8MzES|Tx(1ivykW*R?;xkdZ7C2DuYJ5sE4vLZ-!!Z=gQCuj=v5@0&>>gwSkYTD&!H|`7@j57&#%0`@94j#sf(6kE`a+DcVGB@v(~xd|R6B{#B2CTqvaO?#k9o6jOl`VZl* z!fYe$aOGeRHf7-3aswwpKR#xt=s@yspw*zH&GrZv9u^g!!JM`p^G=6}EAxv|6ELz7@=m-lSP#~VL9bHejw z{QKhvRJC;U+_PKvAO5WTjl3=W`k~3=J1;DxE*7^B-dUQywB!^$F|~Rww|(mUb?o`e z+MaL6S3-y{6?WYe3%%yK7t z<(wBJR{UD(`r1O(yc&|hl4iWfr7;aR$vn{AoSOn=r-K7}2L!f8f#XLU!i zfb3Yz3Z?CRX1t2DMkgs%Y>yGB>)XU&o*XU^97i%QrJF>5CUz$LzeyGiL3*_05~p0^ z>&g_1tDnF`yAyaA!Zp9xGvn3jhCtukk%3W=&e96@>G2Bthn_DsQ3eujMkB4UPjA>` zc|qUaL*i9ysDEKa0KGijJU9=)9d3?5DlGP3WBMNn4{IQbn7G(K_66Np&0lUE+RM*( zoX2`oC|MU%&Q;j-ADES*k2S$Uw*UYD07*qoM6N<$g86?amjD0& literal 2159 zcmbVO4N%i&7%ogu@#jRRV~Uamyos9Tr!8%w1(B*0S5)NA-yv!8rOjxY(gaFTQ8^Gq zR7BBJQBQWd`Ny2w*liA-I(6rC>ZWtf&7JNxb=-cG`Ln6VzCh{RPC0MAOYtGSl`7!%1!}%S(2kEpmGyTB8}8Qsia1JfI+U;1E4#^tS_tP(z9%r5!1_y&+nU9JC1;9YV{>ghCi4sP~D)a(2KA@GKxp z1wIZ;C)WVpM5i>*&FZty}Ra9^fu&@d+qZC0A7)fC|GMl6sy@?^|QG|{m zhz_U?wgS&8>=VH>L+btomUvMJJPXujW2_!oVLcqMTFfXEr4>b(qvZ>@bUTQHIqE1YeQqAV0Wr ziAa0jF)XLHyBX!wIs+aJ-WH$W-m~fKp!GWeB<-U39WYrE6hG?&sSfD$v-B7KH2pGL z*tPm+t9=*hAMeKhsXk~f=VUz&04FGps`=pRtm!BX{@<##KYMI0b;9AWQ>QoiuXdWN*PMgzER35!@1yt3$HcqBl}-1A^*POL zL_u?cwY%~4!j{Z>;ZWnEt>32P+%MU<($cuHz?SZ- zV^w;^I+wf^+z zm>aj}zCVB8q2A$V7yPxL(0{#Y`p)pCNJl{1twOka>vZ1NoTWPY^P0Zy4N+k5AWfy+ z(tqOH;rhWVTKy7zu`YRW<-XxlkC=~t*ekBN^;m67@BP#4sr`Ca9KFfkzH#;Dsn(D4 z3roaHcdz_vu8fS*O>T;4%=n-ZZ@Ks2!IZ5(M4msNaBfCeVy>YK8D6*7xbjx6<7GVO zTH(sRV<;;T{YO#6h1m-W^8YNZD3$#$YL?a)d~;yV_G`0^pYAJ2^X}Q7JEHgv{;fTE z;PP5(V%@eKTgJsS;xU08v1?`#;)GQ-C;gh9PT|qki{E7qX*qFq*S+SP-D{g-t4|v4 zgcIHOtl3b}ZTaybhm(zA$)?spCCkoNy)bzZwK+Q8btG}1bi9oi*4FmiSLOL2?9Rwf Q)K3EIgiK50_}tRJ0iezHV*mgE diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_door_side.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_door_side.png index a22b13211cb935cb119bff2be6f8287f104ad51b..281e5b9b39e6b002669ab95de740ba7b151f54e7 100644 GIT binary patch delta 216 zcmV;}04M*74D1v1a#VJHys$rX0FY9IYN;%zjK{v0rj$}2P#H! zy^A0y1SwTCc`B_!!BVhlK`m8U)R!Xopn}CyeDOi7C{@9LKKP)s_pyjntzDR%uiyOs z-~Yo4^AC&+XNDPu87UUbMLLfr|ZMP(2fI0Tk7{d&0x}_zu zWbFes_5|qQG7_3zK+y~{J<|-Jy^IK3Mpf50xSub4z_G4la0hahWCeLta|^2>+P^wq zvR9XF-Qi~LW2c*d5_pI}w&~UV2s90@!wcv-ITks#10l->H=77#m#hUgk3+=f1dX@l z35A{11zD4HW#V2|k>p8HniOS~mt-JmK-Jma$5CmaQvr+S{XJQ9XK*z_0w9WU91F23 z;IJynx~_|oA}R_`5q#A032gFyw6o7(qR0;2fVkLa6Gm9Z4PtOq)2<0#kka~5&rQ@} zViN|UEJ%q-9iU^UxS$c%JHj1XM0MmLpF|WZr&#JG%Sz!_rS-fN9g(>es!`9jtD>V) zD?s8Rif|*e(cB7^xU;WVP{RaAHT(~Dq}Qo60mz345*(H=uJ;4A&}U)u`6Mt??5+c@ z@8CGfCW3lzkO>JgI7Lz*q;>1oF6!Lkm09%W9Isom2t^H=^-s^@?IY zI@DX$UAB`w0NP1{8=Rd)7CBt+*u8GgbZO%nqNM*4?k+6C6%xY`%~q)wuO*{Is=t_2 zW7ib%?^bs1{!+PpIBf^XGVMcjlXf!X)Akk8J{8O!nWsJOy`ni=+V$!48xL(C+%ak% zx%@>m{>pEgy9MJ?bLg9k?~ab0Iy7)TI{C&96TiUppFp^6@*Dr#D6~J$PH; z)u#rZyz$o6XPFb*9{1Yd*wF!U`)SL}oPA{M>GsLYmh}t_+GmHd`K@o<&76xfGaK#C zwDw|lZSTG-FXztve&?^-hktzR!tpcO`Y!|D-?21)K6`ve(yfbg^X8eo2cP*9P8RV< diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_door_top.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_door_top.png index 6057397af3762e3c19492b5302757a00b3746489..e583dfe82ff2da1bb7d1a3693093ea857480b0e8 100644 GIT binary patch delta 37 rcmeC+|H3jsnS;sN)5S5Q;?`z+R!b&<7jNGvG5~?6tDnm{r-UW|fgM7!K1ehyzGmI7S&lLnCoM`W3She(__ zaz>o^0U*vC_zC<2?wk;UAAsGY(SRW)EJcd#=Y8If=k@zz`Nh?jE4g+#*?yd9+Li0- zyQIB(eM8fhzq8(`%p(gC-lx_qN;I|BH)aXKM^xy2I%IKReEsmz&>0DggL-I( zNt=$?_GwD@Pj`Cw^a%UJ*tn;!&!8lTs6hHG8pj!&1%~3yDU=&^4h(&c5l4ZssXXe3 z;jZ51Db?#%!^BR_)tkQMG;H6k-O*j!X#%?m9M7~JXg8qe>*X?}yOa#zUgtsSOzr|> zBt!xMm`@1x1HuIAw`oJk}K@>hp;R3>j*X zM3hv#aaI;emJG~L0vyX$In99tSGZ)7j_2M926UX$h{ht5V5b7hLWN<4KbJR(Ds(2c zj%7$?cITqA-bq5i9?ke9#dPafdR!?Z%V9F&f@dTCmrSbbDxUC+X)OAti>3C4X=iq4Zm;JU7whZ zTCH!k>I2WLxBR;8Qoq@1HRj<;`wqtwrQ^b$T-ZLJiwz&8Oui*F{(quMC)nm=o`#&r zLVK!@3lG~Ylaig3Ph+1xE&g&iX8OE^Ai}E60|P5{DKW}p_TRNBXs078NzX|Bi-@_D zyuf9AAf_m#n?qU1i?kJx836Sti)6s>dCu?7Jm3Xfjs^8w45VAK)#R?4X*8CDER_@M m^U|9ynznSe+u7``etN&=FJ1fg?A=W@0lQl}owxU&JpT!q4^tr;9YmDC|}Eb>G8Ik)H;W>B!AfMMbk*Pj0j0X^yYp9 z7@mMo=#N>`Ibv>ey2aaGQq%EWo-EQW^B^y@9)1eW6i~okrgB7mzQv*ZH~Umj@fHRi z-fwQoAe?dvw2RiHG@Rjimbi?NOmKlQhX6s9vnCQ(Nd~upgI&o$RodKxv56?q@dse?&^;|OJOBUy literal 2189 zcmbVO3vknP7%yr^h+O-LkG1`q)SD4#yAPh;9w2f<%E=gHC-ebtY z@m6pG@)!@1DNhAtYzTsS0xR1N@NV)r6hUqX_y9#Y{AZ5}9&ntwOY%?tzwh_`zDK^x zf~+y4qdNEQtkdbD>>0LfaF5o`j%~qp*>X=ZxOMVpOi*;XF5R`Wjc)bYo;qFoS|NA5 zI^K~`-BP?zpAQPp>lQD`g421{`H=&pb#YqIiX)Kv0DX8Uufj60R(b=~27GL1W0((@| zPorp2QIWog)Jw7(#VLwHF#;tB1RxM4B&tjh5taB>1{<%ivfx(*NrW^;#wi6<3k;Mt zhv4%^Xho$ZO(0=tkny9q9@9c<1v(s0hx&XGw4$a>1zuY8K9*R?4f%OAn^&ZO%<^ed zc~OmTb;hv~TYo_IHbu&@DDUNc0Hy$8c*K?8BdL<&k)9AoWIGa#pSH?8qe^nFBzap4 zmDS1uS*==O%ur&UAaYWXGDH*AV#C`QmAAkIMqmg|AS9lPQ?!AiaWV-bX$)(IIzTIM zjLJL?Yy|j6!4fC9LeBzqIB2`5sEo++cAEtTqV$5m(In0iX2N7dSRf0*8G`|Fa*Pqd zNCVH4$u0upxF%h|-X^gDErXhUbLVmr3pgT4q8YQ3H=0NcF(o^lh|y&*A(YExM%ZLC z%etH-OX6fJ+gMou9}nYwm{n870Y)>&6BzI05Xx+DAruRE7?K2yZej@1Y;bZUZh|3> zrCpNjV?e72KE}|EjS{UP*RH9LPDTH8fxcQDg`Ts9vb$6UpHVTUK5HYU(?h zVYPO*z^qnh9z@^#T6j$Mo=s=7eUXO;q)#b+Gfa_OY7ryzscw+zXX!8WN%|FL>eJOf zTkW5${*i9{pXytZ%X%2m&4USw!dg72Hfx$ogZ{T_O?wZ`rB*l?cG@yBWx+#aPV*w5 zmcbOxAK&q~PS@6Hx25JLh6iQ)#@1)WR##QsxN&yL?$72C?Rs^Owx0HsPKmx){vbT- zvgt5$d05GYfeF3mM1>ab+2NgWxM0|Naj--A*>ZK=RVqx?oygl+-=D^9fzI`(+g`9h~&~p)2zTlx-Fc?ybzzzuV_`VV85mqNB5q zrS@L+K$-qa#$BP`{DD8~_FUe$@s(ROR|2KP`Ladju^o=Zrq2lH zm#v?7A#v{K;Wz$z`$yZB>?3$gNz%#N*3&gVST}v(?h#)9(WVpLgtfE&I544alEHO7 zz80?CKW(zOjd{y2%f&ZqV#+eC$M+qcnM3V7lP~}^lx7_-S-y3_x^tK6FLpTf>6thW ze4lk;J#kp6W*{ZXGwo<^N{=Q{Pr7XcP-64ySyZnzw@=EkH6n* uwwGrFXPy=tZoMjQPcEE#y9bojnDX+LH&Yu6+6~rz80=|dY&%9xDftIS$`PFa diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_side_2.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_side_2.png index 13b2fd818692e23cf962af9d8c01c7e2dc8292a0..518cee46a7a5fd09a300e4e71690af72baae4e8c 100644 GIT binary patch delta 29 jcmZ3*x{7sz79-gTe~DWM4fe8>n_ delta 29 jcmZ3*x{7sz7UQjr+WAZZA}k&r3_#%N>gTe~DWM4fd#4BM diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_top.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_top.png index 5809e4e4c0e90ba9e5358d65bcb99c5f8e749fa1..683ed129fc2e21096ac0f546f7b55d6a8e782958 100644 GIT binary patch delta 29 jcmcb{dX0607GvB-?b%EM^JnZ~X8;0ES3j3^P6k64gGlamU zA93i0gFACE@BE`jhX6;neuTt`2_~id*}H(?NqG~QzK+h^@_#eF7cCc>yhzLjv6C1v zVP&EhZy|^(eT}WRcXP36D}CB4_02+DriIf?c0hdu1O396CexhpOm+8wLh*7KtqhakI{GB z*eU+-^j%694k}MwN=T6stiT1>*VeLM&Pv^suWjTT?Ay1yT3gRG*kWcrl3j>ONHGES zlTiU2e+=Iwq?iE9!QtCg-Rona6$BF6Aatjg5L|*+woW5BOGq&RZ33>o`ReJnB!6-F zMIME-NM=Id=IB~MMG4uW1Px7V359E>S19?gl|QUyC_y)>hP1hTNznNJC_xIGdC_pF zH7s68)N9aRLb&s8=ecbq2k_ka8I_)3zCYc8b zNs*HXbczWFC(bb==mV<2&A{l%ztj5Pc$1hPmZ+L??lL>G00000NkvXXu0mjf*S7Hp delta 533 zcmV+w0_y#=1hfQ@Dt}&eQfE)XP!#R&GHylG#JIsSEGkAJF0^bR4jee*L<2<-DN3-r5QPWtrx@W7EJ8p$45FBTWxzs<6H_Dy z5d}#aNs%H|x)fIFQl!eS%(u?o-t0ygmYLmov+vD}T;9Fqlc)Azc{P8Z?SDrPU%lB2 zA(zw5H<$Ui>fY>d2#eLH5VXoFvd1l!?Vi=KPgD^Kgglb6*MCE52FcF?0h^taboVEW zgOyc(@ga~)vn?fq!MWZ32vYQ_c@D&445t%~4j(7POktkXccL$f(kImb4^yZ9SpiNo za|i%W#-#eN2GAivM+ArkSO6iDmErx-()F0&#{gP-nuC4Q8EJ`F01krvq$4u6p{A#P zHJV-07X2Ty88$y1a$P#Rc}c1oQ+AW)BgpX;t3n@eI@fCo={{?SR1{->qio_YcWRuN P00000NkvXXu0mjfRcesv literal 1770 zcmbVNe^3-v9A8Zx5N(iTGXAJ_Rl;;{f823DcDMxYC_oPBxD;?umfZ)pa<{weF5DgJ z6sePlyX$B`yIYp2)K@w4&ku8^MG&=@0 zoif2MM`=Yh;wI=YBFM@FWgvBv!a$yj;^Z2|7Z%QQ1n>br5H%HIsVG+VN}8m4rN5z$ z9zP%ey4K~2%6OzMet%Sis%6zeGa?RoBwF=^WI(uqD%B_)$f|{EF43)#8HWN`O;S9P zHXQ9o4pRELhELLJ@)RT-u@<|F547D?c zwQ#wZ98uL+kpnqSI|j`*2m;So0B@mfW+QGgS}B~en5?*!G}3s5nJnk6W|}VN&C~at z5?7-Kcltj6Kku(m1Xx_G@3DFGlGC$-$re-?uTZ2Y3PE*b z+K1pK+R13`jtn2XNdT5!%>zdq%eD;r8rCMJgV_pV(q(6aYV*IwGEocQyI zr?&b`hV9yxq{C?qwxqO@_m9?fABnj;klu7Lt@P9DDd%hN`C=FERK8s77@f27LfL`7 zO}*4W(UZ64yw^Ip!$aQLoOgLQF=R`KYu}dO#YP4;e&3@a;N;-;rPaGqGSgeWIWzXv z{KnO1ckNocOfHJ?7j8VaFyU&);o{$Zm~kn2*+8auUuSN6&mY!9X{O%0uBN`j_s09p zLyf@HQP*qPy4h7e=pD&?p>eWoqU}`Gd2j!Mo}X_&XFNXg!G*RZ&+C7qoUDB3q0F*3 F{sL7HYZ?Fm diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_sapling.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_sapling.png index 220d8de0b28e5b0134c2825dbf2e438f980203a8..5a269b7079e3d867fb3fe9a47ccd9660aa0b3adb 100644 GIT binary patch delta 241 zcmVY+nmj4ZCU6`~fy02B;VWNNtj=zowQAT~@B41?5Q zH304%Alq>6(f_(L_WegT7@Jz0q3c(<{l7!{y#HiJqiJ}@e~=**8vvroPKi`8fKWIP rWdJ@`;57iGnUE{+1|qTnxLg4M3|`P>ljVl800000NkvXXu0mjfiCb-e delta 374 zcmV-+0g3*N0-ytsBnkm@Qb$4nuFf3kks%X*32;bRa{vGi!vFvd!vV){sAK>D0X0cP zK~y+TWBmXBKLaIz2}+X=^pZkdNLf(5Yv3AY&g8X7~Z*d}3f= z{?5h#W&<%u6UbI%&0qlX0ygYdx&6OkL;5@*6T3VN<4gz7?_Ffz6Ox4Ta07w~$t*tAm{>a0Wl~GJ0NHP2;lPuUIRY8dkzjre6GN00J^Q%UBSQr02=z2 Us*WOE_W%F@07*qoM6N<$f*=^89{>OV diff --git a/src/main/resources/assets/betterend/textures/block/violecite.png b/src/main/resources/assets/betterend/textures/block/violecite.png index d919a3a5e468d581b2d44114d9cc94a168d3c156..7b3f9b76558aeed726f3c074de97640c7313119a 100644 GIT binary patch delta 28 icmaFM_?B@(8RM;q=d#Wzp$Pz)Pzja* delta 28 icmaFM_?B@(86)Gw@-%_S<962=fWXt$&t;ucLK6Uzh6#xP diff --git a/src/main/resources/assets/betterend/textures/item/jellyshroom_door.png b/src/main/resources/assets/betterend/textures/item/jellyshroom_door.png index 2ac87812b2aba3ef92f62396d6267f8b878748bc..d4d1f4149bbed385859d99bee70ea5a634fc4dca 100644 GIT binary patch delta 384 zcmV-`0e}9$4VnXxBYy#5Nkl74 zu8oIa4lbaz`iAgoBK2k=qdQ2pHB^RUWHoy?a9FA1To562hkuZr3B=wIlHsBHzQn0q z=L7a5M@Z`)$^^K6F;EQ_C=CM8+wBD6%`Q8b>wA#Q0CZ0?xoY=7aW0@fT_a6Gqv54g z6SvNo9nKm7AE1nu>;^PQ*`?3W8BiU6@BxnmNVaw4$OLNB6+4{B6%jtW-~(EV4WhLU z?)(`_R=|LgJ9#5$pAV?bHi$L0Swxj*vO4Vgv|La?+X$K%{6{jEp%N!Q%+#>NUo$iChf(4ZAqEx`iPq_o`mVH%F;nL*dH3GC z_j#Z1@9zz@wmec&TwaVINQt}2<%6?9A4LW5y>~Os!fCtQ^tg&3x8JFcZOF;-G6cDG zQwRjLpx482Qq0KmQadmvV=_b|NKIW*X1NZaq3s|nhz{(h4;C;~;2l_-#Y=i+Cx{45 zJqqymv;?@G4$jVFb+u?sl7R#A*6)3|#A<2@K6Zv9}G%U_z>fB9mvXpI|mlg zG?^iYL?U5Kn2eGVCMdhzPLMP~(>O%nYPYDdNnBJbattn@a*7~pf+V6kBik;;H3tSY z-7+C2=V?VX>n7+hBFV}GWh8ZzGC-co;5$j3#Lkr)bdXu`(3BpENNfxdrvY zRNz^Sy)m%F3!(1+gz_8{l9U(=9VNurFd$?xoRQ}BGHy}TSdjy6mji>U8U=x8OlFIP zB6$ku?Ys%6tY#Z-x7f_MnF6%U%!lYIvo&|$C2?^*h`Iax|Ga-t5nvIq(VOSV2Z?b? zQAzPiJoK_jPvJ}|F-?LB=R07@nC=ezBUu z-LLfbe>L*4A&Bq)ZegzUSV2Sc)Vsls-HR_fSNyNu7Qf^fdHu-uYcp>jZGP~Lp?zn` zlb*_@_0MPbM3)wtE{!6=brQH&QX8kb%Fj&gSlcBXy=8XOw$^&0y=^(dt?nMf7JElh z6Ih$})MD4N-1TenUi8HZU-P&cI6QnsOfR1vFMQ$QZ}wdHdVAwU=k&MJ%+j;zYn{K} zfsFcsy{@{N$yhbg@>;F4ricFW!$QN*eg5IM)=SP^s2p`2ziK|T^3Jv2ejfVd?B$E8 zdkPO%-Q}z^G>nDiCuVAb`1|MP>(_Ty`e*m9IsD7-jW6_+P`;T$54hO)oZ)iIVD<4J rf4|v#Bysn?om1+L!5<=5`sVtOzQYrB-j^nO^?!`JvBh<|;n2XJEDBCV diff --git a/src/main/resources/assets/betterend/textures/item/umbrella_cluster_juice.png b/src/main/resources/assets/betterend/textures/item/umbrella_cluster_juice.png index 75f21ec8d813283dd8356c0198996c01143f1161..0a0287e87d865f6fa096cca9448b3ebc90db19fb 100644 GIT binary patch delta 209 zcmV;?051Q91MLBjB!2{FK}|sb0I`n?{9y$E005*(L_t(|+GF_t|33pIn1QAST*>wP z55gkp}F-$Xv-EaE@ry+Q42TIWkT;GEY0BHvC2^s*? zh-^E^knXh?z+waq04adk2Ga~;6Kw#pAuxk*X~r9kAjRmICba9BrVLNUyf(6k4P6Mt!`|f?U>X~yT_A#g z!ho?0V*cx=3=DIvPckeju*L8KRu{lD-%I$+AS%VcAS%tkkbKmfA#TE94BIda0BL@c z57BJCipb_=o*C_M9p|tyd5F5n` sm?Ve>VPr)NAP$HDQUKEh69drz93QS|JV!Iu00000NkvXXt^-0~f`V*0W&i*H delta 211 zcmV;^04)Ee0saAyBnkm@Qb$4nuFf3kks%X*32;bRa{vGi!vFvd!vV){sAK>D0Fy~X zK~yMHWBmXBKLb9%1f_8TxCzHA82$^3Gcde;3Fb0bb}%r4Xt094;a~sDT5vPm+wu-9 z$tuFm@cYeA29Lc$j9@E3oX01=f+axs&byxs522RBt#H(g{?E(B&+z2sJqCVWVTS!a z*O!8=0IP#Ze*X3mEcx;CTd){Nj=@mc9cajZ24AC0Fb%>mF+*wh{{T(AM}Bmx;kEz( N002ovPDHLkV1iY=UwHrk diff --git a/src/main/resources/assets/betterend/textures/particle/jungle_spore_1.png b/src/main/resources/assets/betterend/textures/particle/jungle_spore_1.png index 51a0c5bee4d7cd9b41e29e792d8db2bcbd852606..fd77dd5a1017f975d358b7f83a727ca0eae4742f 100644 GIT binary patch delta 143 zcmV;A0C4|<0;>U#B!2{FK}|sb0I`n?{9y$E003f1L_t(|+GF_t|33ph3}+lG|NsAH z-~az08iY|4>N+TP}&_V x36jH50FuN|026>I0I@+diUJS~Q-CZ60Nq@h;v=ztaR2}S00>D%PDHLkV1gS>H?aT! delta 216 zcmV;}04M*e0fPdNBnkm@Qb$4nuFf3kks%X*32;bRa{vGi!vFvd!vV){sAK>D0GLTc zK~yMHWBmXBKLb7hS8%+7;lHpr1H;>wU@n7Y2LmIB1}oSb{`J4C1vkUJE$_gRtRn0T zzu)|1@YpNF$OIAqaUP%e3YGxjJMVrnJOs-CO(y~$qvS1pe0as2mq2q24Dq7G9Lf;UtbD#6bOKHgTz2=xCtQRU;x2pU;qGTpE_k> SjGaM`b|Nmwm z1cTThF%Sj=nB;b+w_v;{>6v1hm-DF87*f-nq|L{Z?N5%u5KDDyvv24M^Z yhSKhE1t2y~1t1!PVd8KFFl&%?7cu;2006-Zk_cbVCyxLC00{s|MNUMnLSTY+{xwYi delta 220 zcmV<203-jb0fz#RBnkm@Qb$4nuFf3kks%X*32;bRa{vGi!vFvd!vV){sAK>D0Gvrg zK~yMHV`Kn=|Ns9p9Is&bFDwq?F)+M+$-rRQ!2p&66UWN`gC*~6c?aS$u!^uV{C@M3 z!DFuwBNIsA;%QFyldNkhR5(3=9A+ WIzPq5(YtW~0000 Date: Thu, 31 Dec 2020 21:57:47 +0300 Subject: [PATCH 084/463] Umbrella jungle ambient --- .../java/ru/betterend/registry/EndSounds.java | 1 + .../world/biome/BiomeUmbrellaJungle.java | 1 + .../resources/assets/betterend/sounds.json | 10 ++++++++++ .../sounds/ambient/umbrella_jungle.ogg | Bin 0 -> 3028529 bytes 4 files changed, 12 insertions(+) create mode 100644 src/main/resources/assets/betterend/sounds/ambient/umbrella_jungle.ogg diff --git a/src/main/java/ru/betterend/registry/EndSounds.java b/src/main/java/ru/betterend/registry/EndSounds.java index 3369d28f..2d746ec2 100644 --- a/src/main/java/ru/betterend/registry/EndSounds.java +++ b/src/main/java/ru/betterend/registry/EndSounds.java @@ -19,6 +19,7 @@ public class EndSounds { public static final SoundEvent AMBIENT_MEGALAKE_GROVE = register("ambient", "megalake_grove"); public static final SoundEvent AMBIENT_BLOSSOMING_SPIRES = register("ambient", "blossoming_spires"); public static final SoundEvent AMBIENT_SULPHUR_SPRINGS = register("ambient", "sulphur_springs"); + public static final SoundEvent AMBIENT_UMBRELLA_JUNGLE = register("ambient", "umbrella_jungle"); // Entity public static final SoundEvent ENTITY_DRAGONFLY = register("entity", "dragonfly"); diff --git a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java index 6ea3c1ce..87509059 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java +++ b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java @@ -15,6 +15,7 @@ public class BiomeUmbrellaJungle extends EndBiome { .setFogDensity(2.3F) .setParticles(EndParticles.JUNGLE_SPORE, 0.001F) .setMusic(EndSounds.MUSIC_FOREST) + .setLoop(EndSounds.AMBIENT_UMBRELLA_JUNGLE) .setSurface(EndBlocks.JUNGLE_MOSS) .addFeature(EndFeatures.END_LAKE) .addFeature(EndFeatures.UMBRELLA_TREE) diff --git a/src/main/resources/assets/betterend/sounds.json b/src/main/resources/assets/betterend/sounds.json index 39cc2f4f..78aa8e92 100644 --- a/src/main/resources/assets/betterend/sounds.json +++ b/src/main/resources/assets/betterend/sounds.json @@ -164,6 +164,16 @@ } ] }, + "betterend.ambient.umbrella_jungle": { + "category": "ambient", + "sounds": [ + { + "name": "betterend:ambient/umbrella_jungle", + "volume": 1.0, + "stream": false + } + ] + }, "betterend.entity.dragonfly": { "category": "entity", diff --git a/src/main/resources/assets/betterend/sounds/ambient/umbrella_jungle.ogg b/src/main/resources/assets/betterend/sounds/ambient/umbrella_jungle.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5529381a207d77894a55236fb4b2ac371e95b359 GIT binary patch literal 3028529 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 i&K{y@a| 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

    )fLAfk{jzy!CClH9L>k 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%0Do1CBU}`>TR-f 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 <` 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 IB9 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�V2aY>wbdbEWO?p!(Nnua>Th9M#~*WAiU{@ziCY~eO19~k^&e-hH3Nbz0Cx4u zJa@?tuW8fW>-_ERdl3HGgO{gSrH!3g>Cn+kuRr^uT#ujrS)Pt0${V~_OvC{w7yvwb zSERdn?HU^w2mMXC2B3r2R-EyKKiD$yui$dBBLXRRC%sK2R-^nTDCiR$qCgo1?A})u zPEZdmWLic0Ug(=T=a?gOLY!8EO8#(Hy&D`MJ~!BOeuBlvZ|!H$nTuPk{axw^K?Z_f zz^g`u+9Vo&-_5BjA4Z#=ojc^5y|d;?wapIyHP~P^gPMhgJZCatN0n0*b@sqA6)TL~ z@dGtJ5bMW6JYNu|ri!>HAh7h?+bO8FY9Ij58 zZZOF7Mp&8hAHD0X1czP7xPL;|r8f+RpULN`x_!F1(ZL<$ORdRY;cRljx(1SD`Rx$) zCA`#A4Mn|~CgKG1WEDB~n4io}Kq_Fnz$?Vg-A!d{v*Quw^B9We%f-58;l_f%M!NF@F(&U zZ|8GtJtsB#A>jP;lMly=^h2SF&PPq}UE#BnrJ{_8ZjrRZ$L{f*Pcks*M@h@J$xl!9 z)ttq*(I@S4M%P7euF+WFYyIZE%zKY8UAYG}%B?JeL_XI-4m7z@P$E+u^0a!LDdp}c z9-X@@hF2`C#Vc)fsZOHb(s}aO=#o6w17N{uK> zXKHJ4c41*_eRUDDz5x_!HMRYD>0tF`in#7eoZ>nv8(JuKFG5)$EQPb&cA<5`TS}Ld z@~Q->VcG@HKYG;MiVJzPNe^qEp=a&O>_Qm&d6q=m8IF5}pY$}3EoSz*-VCgF&s1We zXRR6vkE-&FD;jt+-r;UxL4NFZkYd}0n()`aeLe7YKon>IGvAd zNF^0omHk6#`?Ds)Nv()T@+cM@leYTIuc5C2yR$fnO9vzbZDC2kc$F&V;^R_Z<-=2QULA)$U&-5yEMTM~_Q<&qA68PfAd7O4jY4eU%UqZMi{LvQhPI zWYcX1PN{97H3*Z3BYaxrPk$0zsY0F-KwKwBgLI%!451=egN53L)zn2ruk&zk`mteL zz=eh8i(&ZsghVyX;rsi~+O6eyNC0GwUM(_;R`{|Gy)Cj_@0o?Xs1pVBi-_b}G@)E1Td_V4d z3klN{Q;dDdET*{5DSBHe`4QZIZ{L%3b6db9tWjAAuNo$*-*gAFeKD<%=V)pKS#3BY zP}Qg`Fe-fL)av#5VEb=YpZ72quR)@&m=zr8-r}w=&b4faa|y~^Uy-Rc`F<}d6hyNk zObNQq;N$TmsVXDF|8?cntH!t6tw~+)ajZGYlaa1Qnt)g%-(CVRI~6yujog;)1ZgQ| zASFsKYscHxvSqFSaB-FF{`$t+m6@rDnV8gYaLr7eGWCB?BdVb7U1-Y3t&YL5=9AWw z50Hz*sXD6FicU^3sT>5ultfnn*Y)$^rh@c*galM#GONF;>BE=|5)5r}lfcs8_7t?& z(dax;gfedb>?!NjL7QJBnl(}zRvuQenKtt_TMs3qTLTD_h)%A2w9WW@m8y@=EfntQ z9hB__|0C>H`CuX6C6-bHM*Q%cDgRHJw*mIwCp1@!0Bdq%{!+xKN7pG(_= zet_sDZ(IT~7v=jG++ zg1V%*M3`OJwhZ@PR045N35LK2&;MMXH2s{5=!CYjXGkE!NG(oD#DLjDEZwDe@|3~Z z#*@uYT%E@$QY{cf&RhW4wi1LoIYn4^_pd~wpm!AR1PkLIXVQ9oa5I9HGb8K#oHMlY zl*jugFFctF>SX2OT^vs+{>g1mN@@=m$B|o|jkmU-i3=nCL#oE@x_tx5gwr!GYlP2n zSE2l?ABW!qaX1JLOy$Lb^2=WjZ_Z8_Qg$NZ7OaSM&DySQZqwpsLJuwTvAo}}_l|lz zqvcfzGw6aFSS%N!>_#gt&?|FrY=q5+sV%I(^DS}4+u?Fvp?^=-CEV?*t#1Z|E0uvf zT0E@83?4d21x)EKG0WJP{@#{G74}_e^%e;NEzp;c1L_$zwadd;Q#+&VhA@U0`Qt7X zUrC)a;e{&H$?G3qZOfhw^t{QiKj831dHF{I5sI)Jw}1c;9_SV zILV(aLd~?i@#omDgEzRnz=ZwglYAICt25rSv%O&?gmX>>!K(DSCl}fP(_j0G!$HZi zjlvdAu8Ma;U(R5wf1V8-)UMt&0f+XdRoJ1dWqyg0+Z!ezN{G(f9?oy1U|r83sY%LU z?&oLD)0!Jv9oWFU;}7M?KpnsLfNA@_pmfVKN8d8D#OcpeUD6LUAV-bQajwDi#sU3F zcJJSjQ3@9j6ET7=vpgm4;NaF%;x*Ht%T&Pw)6{NBa5gqLd2Efe(ogrwq+%c`Z*aOM zU$pn>f1c4fvqSr%gqjzP8{d9C8ZZ6Sb78uM{-P)<9IIys+3vmA(BeLusMm1G3weGg zt?g*D*3l+Qpk07F^oT!cW5>75Y9vd26CNy&`7ZFJ!mx_XL=I&`80@sOaev>QVEd+4i z57wm_eo3n^g&QFOVhKLD+}s90Um^h5rV|?09+K;Ra{TIdI)$591Y2HbMjT&%w+EOo z&^MQ^>XfGv_-4IE_E0%s1NV62UKe(0eNL6VT6`ezw@Q3k=6*LRxLkBEWk6ywCO;@t zu4}d>mSEGANY#-mhWK+}Ot2t5!c`!X$qCK_)@2#(6Mp zRFn8saOv5c+Z*bTT|O!4vTVi8n=cAK#f86d2LUE)Z1!(SC@;<5Ijd*3ouK|*%Z7*N zr8P#UPf&uY-`FhkjkU0$F6$1QUm^TTUMxJMhAHnR|9q4DSCOlxOviA%bihaqe#G^u zBo{l-zWd?3h!pJbE|#ZQF2lrz(l7;Hu_;(DuJWIp`jj`#TiulHpDle$FX*qodB+-t z7&*6XE1rT2PruD#$o!#4teO00;=+H9n z`{nqMOz2NzbNhrZ94uJzI~ktez9h~&LjlwN9C4f(D*otAyDcmMAClHJmT8b1^-Fyp$WkPQCHDdYVHS^#Dt-JFGWq&2;^RW8|TO@ya%!Y|x$>B?EqCf0(S}JKlq!n~bXK~wQ zsaF>MGD(8yj6g)h@JsjLw0Sn}ggu;{0xg{`_gU6hszd zp*{V9&77PqTTeZmC#&d=g&%(ZH`IsB7_Hqu+B;D-Q&k#i`|JT#@~CQR+CM`c*uo7f zbNG>+2F&GaHDt3}vow}`QUvuFacM;O+PPfwCsWmAU5BJf>~2R>;00V6Vv7x#YpzBL*>2 zY_eXHoUJNb4u~(xo-4^%GN+zad*$jcMNz^VsZLTr6d?@Bzk}|?{zgTmT=GlXda2OG z2(u6fgE4#YX23xd7~{lRU}qZ~3Ie4+rcAM4zJ4kR>?P>%;4^0Z)BTr^zFwoT-(OpX zW_$mcn@zIP*#ZUTM-(I_ce*Wf<8~M`o+R`J);@v1al;%iXT{9a?fV~o zJbVg2WRzg>?#)QR4Q;+P*|q>{l?~V9;I=RPRI@wU%0r2`vEM7uGt!L#1PzGWoDp$m z_GBP}ZyGCMDwNJXf1gD1Nkp3HQ}yfGDGeSIFO=JT->LbqY0>>i%6myWNu1+V`^ zTpw&_!495(z0>Yekq3iP$LPvpS&?gX$MdpSW3A;N?MNZfxEGXIPXk7{Qe~#Gd|A+g z5)%gJlx~~5(J#m(7b0ot)Gmb>+pa(JWx=6~N5E&hrXvCIh?RINy9LfGHYIUEpCN5A za8kaT-KFGKW$b$&7<>3%jxhYg0wh=3s-A}|Hrz(tU+|RMv1xbs3>j|ff4Xv;EqAK~ z3ND&$dLq;>KaNRF2yq>##U)8^d>r8T!)_&NXp-=v1YO=W!EFFWi&!T0tX*wTHIz$@ zMMJILGhPhY0ax-t>2DZP6Fp8v`b2tr(?1HD-~q8u$W zauvNc@SGi;!cnbl-zM84SL_SouxGn2MNGl?15mT)33U!uT+er+TRO6PLQBx`Iw%qR zW;!7(F@NukORnD!+pp4JgjDgL$Vhc4^IX1f?EPz$XH+_Zw_&~2YcSCeGZpRa-&(3x zil^fkOjJ8;A|xJ&D_axh8@yOQ|GSH=AF%1pzvh@NP_kLq zJ63C#7tQmM{+VHTaHS>}*6iCn@~pnQ=ePS@#_nw<=r}=?vFczC8y@y(Bl*-7F0NbC z*qHuZBYR~DA6kUcW)p*_lSqoyw9N;$hZgZ~yc-ZC6w7m(`m}Zt;SPbF zt4bi!tB|S4nPf8vI5ex{=UYA27I)V&x7NK5YLv_jtI5pUe8~j2AnqzmvFCKN`0MU< zvi6Jo(M_^=F;-L&dR+zD9R; zEu=%+^-*p!DVZSy2p}?gXkPLHg}^1bwzNrbb>?~-)2R#%CF<}Zs-v$dV>nO1=)rdf z650)hEJi&!$9Me=1<7Mt_9kMg+~K$9l?B{8uYEUc&-f4sk*{>k8xS>gn1V=om6blx z_me*(thOPCr;+#9LaG6zZQ!d%tb7VV`0%jLutPuA){{x`jojTFPq#_(8dkRa5$^uH zih$hbi$ZjbI^vlgVYhTf^LD3paUrJ0&IW&rQ!SWbV$!n_^*#=9t&@8M(^<3p94e67 zzUOMnMGTKkp5txDNDgx?@zg2Sg54VCXB%cWbBn7DlV~ZoR)x^iKu|pey;K26;qovW z)I31$Z?bVSt30_rl{#0Zg7sP5?D=j&9SohfMI`|JA(Oyp+z9?I0o)|Br9_9F{wsQR89$qPU~1Z(zoc~#VSvm z9=`$lNB8;!*TCF;8=-PoDf2};q4UB9`hn|9(8YkScd7l&mBJq#A?{GVUeD1XVG0VbBbT$!7CXM`! zc~0KT1EO{XF#;#pE<7wG+d{|=C~?_=PVBh2pF4;v>$_i?Xz-9eH^t*Pv)#Nxn`0z& zG7MD7=$PK&iy_Qt+9TzpLk~tMbx7FRYzIR?*3(G{^|5#CH#UTN#L%AA2#Jw` z5*ycw`np^mCWAD#ycv*FTpLX)$oa(A-SHux`eZ?^aKcm45ID8TmXe zklL4+1v2*TjsNkghRzf4;@#dQSzm$z8=Ck8be;QRZC@xZ;~23f;W#allCz0Uin^y$ zu_VzD*L;xach=2S(rUXq-(z`j^gZvVc+*NWx*>b~At&#Vkz~kvf-7#Dkk?|Ii>>g1 zg{@bGASm&-PN8M?Qg)QB#?^C0^64J?yF`m#>V9^ni?8wvrV*Uhh4nky#KEZw_n(i< zkVeO1ugyIunzy^v&BqJdB1PT5c|vJKLHn$i6GTA-lnuKz{dtYtjek?`hEqkwjUBgD z>PXI5j6#(&8(50!!fK@bPi%heabWf{VY>kN!~5VBW%qw%B#1}FqgcK$iUdKSGqn>I z+zgpUF1+#UtYgs`KD&5~eA9l5w-2xh%(sA!P3J_w|6qcatR?33ptjhLF3a(02D6IP zSARs?Ik5cw5i!j3WFr~U{$uXpDWoYGG9Ms6UZqkSc8#HC`ihHl&Om7=-d2Hstvyr2 zKTA5NqvC#3%Or<$4TCD0W`r)Ed(_AsbMISzV03>8Yu1dF;*+o6z;~bX^nu8GctG@* z5W85d4pI~WD5w(hdKU^0J8v5hVyx0ozyMVn1Nm!c%fgN47r5mk5G8LkBZn?U_rIt0 zHrsSNTb^L|!+<(J>{552t;xlB;J)KHntGLT>v(MKw}41A^81?3Io^Z8iY-4A7B(-6 zd6Y>|Q6fI;mSAN{yjA!zUtb3-;f|OaNXDcGIEv;!Z;*mUku)*4pS;Sl^^JGS0=FNp zJ8sE)qZ^g5ilKiU^8NmL7=Ngd_Wec@R%x_QRDC|6dn0+dT?johwv3+)P$2Tv$aPHz zy#oCBK_oI{ml_p`8uW}CxF{HJn3O^T_~v|XlR>lgW%nM5Wy6GipCwck|G7KO@<>ho zvd%4}HhV|y;t^ya{jF0?tJmuguAhX!_$W$*5Y{+zt7R$_qEWQ zA9mx1!!}){Af}zJYqPcsmRBMWnnqC9Z+ywE^7z-y%~b~;9cqm@{yJZWCA^-{F)>-I zObJ9yZz}A;(5vNPRVn`vC0MPb`m&NiHj4q-Teo*a-hj$)0TcmDyE(e<1lX;hpsun} zVPn%WhWk{@o2#qU(swG4-IC)#{#Vcr&1_9Gc50Nayrk^BJCc;IfJZh`uj+{tyR_fhI`{j58kB-9k;7(%?4pF(dsMXdO)lm!EZ*uKcSNKJUix8^Vdqw)0alxKOFkI?pDQ<9+`Mt!&Qe|{ee3SR3<;yc?CkaWfG>j-&(AAn#&*SF zff(ak(AkU$Y{hT?!6*$B6@MO|BElG z>5aw$D&?AUGZ6!bv%p*#XGS!Z2JF>!PM11Bdv&m9B$mI3!kBD(2uH`;_+6oPO6w6V zt4HU3GBrtiNqebC5XZ>n-BK<1F#!BqOXT`?Di|x0qtd`y2xTxn`V@)}f4?O;G7XnU zHr&SVZY5LQHUplAbxHlN0JHp$Ko@Lu^WtSb!^>x;qKK@j1L=5&{)7duUnwhn? z*jwR}b-iCUlJT#Oie=Oq^$}Dx4D;+vEp6!4fLhUm1I5peVJ5W)vUj}2G}22jY#3wH zm;9>l=}C&b$rGEI-#v;JPI*aHN5cG-h#puRtZWpLsEyiNGCCZX1m1<^583`H+AJB( zgBfP9f&7U8U2QklBaTk|nJ*`i&X*WQW!~3}6!iZMgZ-)d4mmt-RkC7i3*YjsqSmo} zO*s2me{tZa%HBCM@bx%i)yD@uZF@TvIql|77#_&%>m6QoRL#!!5Z%USzj(NKko(h$ zW2yR!`^Lmh*r-PO>q=s_wBk)55f%hDtE2GiT>jzg>h zmet(vD&dYit{*|?)M3mX1=VEp!jz`38$J?IGD00buZ`3Mpa@Mwt!UwG(( z={HwMwr%bx-F4Qp+z#WzEH`=}3NAxJZumzl2yNcAnki!Tt^ zk5=cWiz9Z{Ex)t?UvBlet&*0GmkHaDlD%skw9j3F4h=O@pI_L$Phu`@QgRX})|Ul> zwSprVdFUejK>v`{VSx?1YC{i(7wrH?1>thbx>%%KS{CzIC<*O+{r+B+)AjB1xR>@- z{8V=eH~zP0Y}K~SfnH^4kb_}cFGAaaf@jiA1Jh@g)-89i2@*T)Ow-9tDD!Rlnh@;3 zth}(!{ppoSD|hf*NhY#khZf?)wk+1ppv1b6pqB6-zC^;C>!6C@5BsA4L**MNUZ6He;;U^A(X zo>GQ~k%q$C9z+I|%(AR`M`_bQk3f5*lfNai8Z-&}Y?p6LH(ZBOoqIAL8Ay5D^zk;0 zmT41!v|Wu=rHr~9k!93fD=#szEp&1F6&tk~80N)Y^rJse3Hw5Ix11SOlk2SE#k!09 zlHV98SM7c_IIIh2Fw>2BHb-%fYwF1?%1Vp50Pk>-h}_1WwGv2E%}dVC5?ZqFpq+P2 z?id|N@Zf{n80%dZPjfcEtuoi3>bA<^lN#4Gc>lrC zy9v4YnLum_l(h}zX0pI%GX8KJY`1=aDkYF||7h%;c58Or)T%Mnm$6__&-zAxU~{E* z+H$yNkOi2(thHV9ei);88;{;pk2s1v{XoLw!uk4DOWBR*vfQrIE{BiQpOHzvxn~-W z%^>jZkoiJ!DHD8VFUqLkwgbnE(g|YhS!Tuf_1sk@mveI$Y22pkb9Fo zQ>p@OE%?8yCbhZtMn$LalvnBzcHE=ljV2`MD*fJHR|*_fqg%(Yx4u(6&<)XmzqvRP zv$2y^aS%v=U$Hzsu~Mn>*zc)eh)BI2X4f&jc9LXmbN;hbdbX!`&=OS<=!x2C!nSif zJD=rjS%BOR-@W2hbVj4Se6)IP-6!U$pSbO#E2Y2Qpp!wLUYCT%N}AxW{SFt4e(`RC zlam)jlug222BrswE=VI|i7q1{0fea^K#P65g~t09@@UC*^S6FE+fC^${LRqfl7(5+ z?XpZTkJ2LxJPy)9fTgq8Yu@jSLH}L}kUgb{YzhwUi1e5##Jkw}9Q0SZ;Fem>*W+C9 z^DC>nZxYv06MY8+UAL((-=li?tE`>()q-_#-+aN5?33uuVd@}6txvj8um~vsfY&{*BE1}AXBl$NG-nLV2#e`u&A;Rk z_v(N88}Ck)m#Fwk49XtOs404fU45J9pYR)WjGpkX_j{rDCC=(%TB+&@G<)z6X>nIk zNy5VXa}Ye_b)wd8!!^PAsyS6b3~W50-KEs3`CSyHobo0Q5Rk1vLzIGl8FB6((fm^} zz>2#Jx9_XDBED~m=e!7kLUi&$!)Fkm)MiwxNLG4(?zy5xh>iJPpVfZZyi;>vpUcz; zPMUOSrBX9|=24nSi$1-H)0cC&AzR&QPIxRgyw_pHc(p`7WW;FLs7@{JX5k7o%Mx z*{3T9e6mnm(E|n}1`I~MH_!9@-v7Sr>#kk*ea3Mf=Wzsk546pxG_-+>b+$Wgha=j_E8*1j z7E$IQavwt=y3(T(X*&?~VJP`*XM>~zJcWkxjE z)@?Dyo}O76YW1yjueu-=^{XXMm7J)IAO7+5Q?O3qr{l(5Ja_$M^#M;JRCjoG_Puj? zZ%4fVEl$MY(e8&^Xn4=e_46J*yB~p{V2SeGKxbb*N#Bg{dv9!Sx{{b6aN?DiCr;Kj@Qln%LZJ=B|hScz$Y6nDufeMcVX^ZA!BHVI!eq8hse;qg{Er z$k>H{P1Fvnn@Rrq3~UJ7fcxVcKG#-m2LnT8&_?ouxCgQv)d}n-LtM$aIH%0p1vZ&N z_c6&)%-R7UA@JhN_6$V3w&lf|b4C+FEQJS#d2Rm7@cp2IIZks7H^TnAgT^n0?Dx+3 zH&lw5AHm7l1Ni{!`SdZW6|bEfg_gQ-2v0wi@|UOYy^4}`%+$j3irBgeFY4V^<9m5& z`6kSb>6bo ze36-N89@^B9fO|`P?CsIGag){UXWo4CAbN^dyoQFTy?_>MiqGXZ^aFZwDd(XgZ*U% zjo8h@4$cY9Ce0=U+Wy(}`&34jWG?`j0Y3h3kPH}_<5F~NsMXONe0w#FC3Evo{G! z(e_axGQO50lhmb}J2X$*d0XTu5$g_h)eA4TQaUnxSC`F?Sye^vw<5c(z^G8{&2@5s zP77S1nTE$Nn9)GdM7W@@>5FTm$dN|*D| zI{Wp1G%-Xj9@OQTU@=Z=qB(mQmxcyWoiA>9pka&I2)RVG2xWx`b*YM)SH+(=EvCrb z7WPgadKy$V>~$F4U*d#&YtNXCU3-x@+{@vbNhmw z)J>aO)EEP;fLyN>`hW-{P}aLs4P|e>h!Khn*7a9Nb`N|{fi`B&@ozcpKxmh6RuwB> zBjE^NxW=&s^b}Y9ZJNY7N0f&@_;*VwYgviQIo416o8W zY)wa(-I-YEB=5X)gRN3we<93`TLtYo`~|?(&bb4hqunimQbNQrq&;NPdjiePcU4a7#@#IojoyEu1Lbpi4UaGpEmC z?5O4WS>S|zJ{&Y{6btgZOLZNjpu9jR!%mb1B=@q$nu($h@XH_lYCvJOqo09Pk2)0e zXBb37R+5Gio;rXFXdR_Qb*?XYEdIkbd0{?fR1=&DDkv>A0+)i zQ`u9|bG#f@q}1}2+oPxZ=w11C=OsL7zGmqs6giDF6=FORycbFPw4%3mBUhf;S6JfM z8wUVKqJy37#+gsjXoZ$CJD3{u>gU&<4j;~W?H$RsyvFlR%Y>S>jfd24%}fi?CL|n` zBoF4GOQD{BWhY|1m~K7_xJDMr&r1vXC;_?#SW5xrG_-&v%ga0ygKc?nRkP^oCmy*H zFYbMtN!;=tzaeZ6MRl*xnIzw!Ib}x^>rA)?eC*tA?r7}cs zOM=Dt$1zi34f~EA`8%Gr3LhWHQg^p_z|Bg$g*)|;*^5!EU&-DB1JzbCAk5@dM5+6))qBh_u7z zA}*4IdH)^6CKbSA@7~nPeCKhG+^6R&E@b|pYik+VNrXK!p`0Kl%B!fNUH02X0XlN< zqvp;BzY)!hU*{u#{~Q*-l;8XgzuzkU=6pL{l#?U;A-6!C(LbB$pzN;?3_{ireiO;x zOZr-(HU-jW51S~N_gxepWMVFpXTQg&C@MXA__>lh{ce;(`3}13?>VZz$P~*$-&P_p z`Qofsa`m3I{`VD>t=EZ_t00Yo32l887KVg8h!RXVr*36935aO}VK?PT+;;j$C<{tb z*J7B%)4=@S|8ACa5CYO^U}0&N2RwJUI860lUpEDPQFfmB#F+=W7D0KN^a}xC_X6k( z_rmL;WoF;s+Uoi%`Pb>b(kQ%}?OqQ&F#pVtO(Gs8>U*;#m7Ke)F4y@OGo_b`ok*ezng# z?QW3-HY4r)QY(AhxmZm}=sCba5iA?2I!T=lntxBR%j^|K7!H_Xe~Pd=`P!f~c|09l z-%bvDKfT*6^z{jOenKW)p6iAOz2UP^JJF4VO#%OpT!gM51^kd8;fqkME|5ehdnl-x z?|fdrV%$^T_uQjP6R_z)HU3cyW0#+w;d#-YjGHAECXQwd{|k)qfJg8P&iQWckmbTX z$l&Ktg(hd;oeXr-$;|Q1_`vzFVOzIi8;okmY+`O?1LM2$q<;LF4n)-?xxJ*JzW|Wx znfIZ%<~{u+QD<|sg4Wi-9=mtou_&EsH;7OU@))k=yS1d2-9k@S73w09QrbBx=cEXS z+l=blOQq2rRFXX4dNRdKLf{$*(G*}Ve11LXZg-p?N%W@_@$nsGnC^QVj z@;?Ga_W$7$mB5cbTNl1VKRS(ET0zZjAs7D6&ml*a))p4o_|Jp$>>4MZ082wblnNRx zWomLP(kh30W2y_Oig8=bMHWPW#yK5*j_tqf%hr4)G~4N<-2JZcu~m!O{FrgvCe&}& zY^>I*Yd5&7GN5-=*6zrMMq6eu1d5EZ?i6CIH9d@5W|vFc8ccIrYd3H-;+R@1($dko zelV+gx#qrDfA`GUJk?~PCH>~D)vU5(cwHXioJNehD+_co7iPOvgzQuY~g!vTKkD zxm?p=SQAk8D4Tvd|666mh8y(3_P)NGp^>|&$9YyFwK`R6*j>=RzV4YNh>)D%8Ze=i zFylK9?%A*x1m6LFyVG$aAA-7pB{58Z79Kv5O1~t_3OgLU{QTCD_PyZ8Yf&oyj=$bS zR1Q;ohWcPoDPmrE><=RLoL$<7;ysuB0#EOT_{eF9*$9U;4elsC&qVEg>>sa=b=qid zKINA5i!@tztc4wgZBrmpwZhhSf{;9eB^9Q9<|OmZ_=&_|Kthb0Cly8PuEpNZcm`#; zUsv6~rV!7o8^R{;oGLl$DVqUKE~x(k`(wsej-2hNbXM)m}eA zWb(lQKur5R-N+t3^6zSe$YW+}!!O-(@(bjob0PO}u`j_Gl<;wB?+;V&FK_CO9l3W0 zf4zPfUTbP(xrb;F&@$c>D_r}o72iLSyu0G{mIB(OJ~;khHYoE;tY=@^pmU4K1F(h4 z)DGO5>}SkC%qJxalz}s%YVd`ecT`~WI_hk0rqmfLDfZCC)7u-rml;pPTS#?H5wxM` z(B=7iv}9(<*Z&9ig|_D7Yb@;dn_o+S>e!eFR)OY-_6ot?Dbqf^V`yje0I)XGt3dwhv)S_ z;#g(j&JsZ`07))nf9LYlv$>}+(Eq|u9aVVlfsFH?Yd{3Uv`~!>Gcv3-&b23u#aNXd z;&JZTWcZv*>Wg4mCoz{YV@w3^;q3iMNU=!gPG!Jg*6mJHxm3`zkQNXlamZRsXEnH} z)=N;l9T{H}JpZ1)>|9HWsMYa?&}?7x*Td?LeB8Get3^F7FMonW77L%*^b9_vQ4UqU z+O`bRDd@pSPCNqx1}0Zzf|xDMXVBVj%0`D5=8P^lDT7ziGHsDCvC z3zBUjcAbabZktEW=2V(|2E*k%8Ptc3MQ0xbY34WD=(4VxXhH=$P&0N#4g6x)jR`*t zjdjY!#0DY7UwSSH=9D75r;i$2=I}Ks%1ZHb{3-8Jw#*WER7sw;7zgtH^{=awC|w&3 zPUW4{{Ia8EO4|aZUy{0Ckj3r6qx__bipAgX_5wMsmfc_Vn}NE95on4;v1&5atRga! z=r?5*r6mZ^eLPpx7B8DHFuAObp~fq0c(BEsg@?_x+%9r1gzJGk>RyLsK3e_=P}c7; zw;%kI8~G?YIoa*koqbqy zoE(H1++gmckMJ6HIuF9a0xfaBXSI8^8*pMa`!m8(mXh1k;zgPqfio7Lo>c35wy(}V zJI|)t?_9a{1#!!;S$`D<2~j$zu&RINHSZ_nd{$%8vgW^f?hveEQCI+8`l??rzg~Xt zbYWmfYw|AZ=#9tK{WRoG(B&7K}exDE> z%x*y+)>zy@aa(5ydqD2$Mi%Xp^8ftZJ&-%$$%8%bVEgav4v{IFFKT>c0xsX!yI6Ki z=$1F7Jg7ZK&+5i4*+2N%qe^3(j#|Q*SWH@`J9AE+ajq+!A1dJ<)F?yNQ>=01PRLAtfZSF%0F?bG?@ z)HfdW9+%WYdFVg`E82jd{a|gGBxJTk4+97PuB_WU@nZ`!(^L%Taqat|WL5o?k)nB8 zv1}mChDPKu>dg@H=Q=UN`h&;UKt{P7FzC0ly|;(S=z%)=2iG$|L~r_oA4%N$uJ~K3 zDtm#jmB97y6*wPPAYrqu(sUh|-Fle6kYrn8#MuWT1r;1oPYIn9m@BQO1`$9UAU(bKlEnvqF04 zr^DKaGYXvX9acVVkK*q`_ZbRLek|?2`kNtB9Wtn+7a@75CpLKS-oxQ%4Cyar=$Fl) z(%@6rNbjt9OzATb{pn09@z>>QHeOf;BZ8`)wW6xq26KJL=op3aOGh0Li|EJ5<0qhe z(CuXqG2vC|;$j*Z@SItRPY@8D2Y1h`j2g)%qZ00XC*pnB#&GiZ)+1VqN5?=ndj%&c z?-Zn{Ee{9U$;|{U85i2ZWj&5ETQK9YdRWBJn#JYupbzpQApTR(#gyo zQU8}kr+BvAqJ|0bPqHB(&N)-O0Uphr*Bp@Jv1d4~kz33Xc9e5d!SXXE zSuw_IAY-v6wH>&N(hQaXFpX!TUHj+b>X?;F{TyChxd~9|NP*{omBzT&+yX9jG3WVm z5-XLDGQH4bGf0Ne5+ovVMW54dzKOe2kI&`;yaQa&^X^f(jAgYG0HQR{+*>m(Bs^Ww z$5}!9=qFQn$Ui_levTj$`o!XoBJzQ8$$BOBXsfqjz`HMtBOxYa4tF^p9C%l@@s8(7 zS+LUbs>N3MT)Am_?XLJeyO2$5zppHY`tKDzYBup`m-$Ao^jU)-c6Eoe+&}pc4SWV{ zANRhg{fJYjY0Vj1Jh{DxfEw>l9mXojF;djtLa~h!h2g$~7Uc;Ee+wxj?{x=$`dh+3 zdf$orr^W2YA8v1hR7F7S3)y7Epg*8DS7(cBUNpLkDu~G)W4iZkKDnAMME3o$zwxuC z;O*I%s^O&^D&x4K&^HuGzu6ZHJN|jks%97x1`5+ltyjkb-yP=6oSeqmCLMj4@Hy$- zYpYeLzc^mHhxp6}LD?#1SevbVWYeT>uwwuhj0Uwkr*s~ba`#tF+mAHlaw?Iwdmq;sTeM0_9} zNhS5jlJM%TEJ;&!us9^*r!YH{%u`AO2XaywnIBY}AQ@5+xg~JC1ExIz3Hj?JH2Ki& z^fTg$MtSadE1x(BXz`lyMKot4?W3n3mH)H>#=&oaM{{B2Y)N{#>hrT##m;HJm|9o{ zeKNdo+FpJ3J==U6aq&h9m%8(x95F)U9p}>zVqHG<+hvMvFE(1hw6kZ6KMHyuYY$4L zbVUR<)!>(>mf)BajBW)~DF{#uYF#fpue)~gw~7fOS^*>p9TD)d=q$|z~l z4?Q%m=V)cjvUgfwxkR>zXjw!-G{!d}Pvm%RhJ)<}=rswcE8kV8&MMT=u>M*J&>j0Q zGWnpkgMNLb+nD^9p;OcMnKs)7uSylNkw>=xF#(?Sf8A$SHZu?}ANy3UZMw%G5NNa{ zh6??9u~eWi;IbTc0Sm#1E~~*^5-A-Ts9wgr5Qh|$J5VmSOa_3LYb;MA(|A%8csa+D zH3bKR&DLUsg!W^stQ0$Ll$bpAEr|8ES(#KErLZE(97yyTdS`}@a6n!JyI~r2FwB#F z&h8KWT5J=07^f0yN2u6yZZpdyWkE z=J4E-RO!hJ1br!-#P^*@CAeb&fB34fEio%H|)jk2sNLf!S%iq z2g|-^>ra;CW!kGDtgRRxqSWWf@0Vz3%^dso@Rf?0COb^g5Kl$*Q0w4}dR!D7l zKh^`oE!p<)tG`fpi2ii+G1#z@X9)_1vxhIwi7)U;fnroxGWf@rmxnAKm{PMT-1$h0Q1!1`}Z znZLF$ckuFXKl8Kqzi2*Xpt;x5`VTF#GWMlS>EyG&H8BJ(`1>Ja)OSbyCa6GGSdtUu zO_dZSKPuXLd!`(*21Bf5Z2@)Z6J&oL0SzVn69_sp39woE@Op#9#h($Ztr`{~;7lHPZ z>U26s{e=BPA-3hAw7=NNDEr$M|JkQJCfh>(p1e?a5I?u5jYO9uq13R5@tv4Vu)@}> zl~rWdJorL&f6@|N9iVhxPgOY1`{Wv^XSGmD5?4 zt8D4Ks0nmC_ky9tI#tq?`jXL|er8fl7hcO`B5tE@L17T9nzW&FH?K5{`8gOmnoOEz zL(Z}bZv8V%mxCabQ$ekw$|=Fh)_~dftHEe^l;TlbsBqxN32JI~BG=GZsnviy`H$V z^UN9k`@q?2cD&i6WyEc7IC%76`;te=XZ$~X=_aF+TBM4eDH$TBIy{D$} zpo}l2_>hOaDqqJGt8!NoFlxv2|+ zCK36M6kb1Ja*0OIs!@A$XB zsoIb&cU*E|W!D+Xf5iu7pOLCHmBkE4!s7(N0R$D76zu22hSr)Prok7@xZ5^I1;(br zy$2$L^x{=T@Z{nPBT~~8yisDpQ-ai?=LPmu&J%+#9#wr_R7rTe(>Opd2=Q4Uz2Qn& zN0QABq5^VcmgsbY$>u{quIzj!#d1_~3{A%LV0irIZ!2nk<=59AzT)OMaQ#OoKfMr| zc~CgvxNu;YMNNlxtUOIjxvaD?vZ;89zBD$13*(E;m4dunc9xqLXW031rm9Ec^Qo61 zcirClW!0)+4>FAY4nf|?t~$HZ-$2xv2&InH%9>krdxzzel_KMD_j8WJaj&fva3+Zw z$gQ#5z%7yw%Wk;0xV||-RLJ7;wjaTb=B)}-*4s6D*Stu6f>@fOPIv9=>aFn>8wW2C z5C;bX>M*SpJzJ8%>%cgI>CSZ!70W+7Ud1&5U_)Ti`|qVX1k2JuDu&hNA z$_~TT@WJF_e>I28h-NY-nnqJ-Z39wi`(14CX!eXM!*Nl+Ogl}uK)o@=(ta)4K}@0G z-V#X<*!pRqneNuIa9Ko;tTr3+5H}OUG8*A``9VbcdWESZ1Py=jMPe;rl6vG@=tJ;h zFTX9Hs@VfUK_PJN?q}`im9(x4Gx68Y9+=!E1<|swUqxF}lK_~orh(FhrkCSyU4JCb zJ&+|FUihNz^gdYJ#J1C(-t+K7rd=QBqw7-T?C(YH0IGpkAY$aen~yZ{LGZDF-VoHr zuUSM~1NwD+hgJWl{#;A%KdKy$jSjTUhR#RE$vp-xb--Xn^UnEemSV5+$6npe>W6}s9U$UQkTW|#;Tc4GGn5i|KH-YfmDiU5 z30X=84W(qWzQlAbT+-(?`K7SdI5_vCpYORoy5j%6HX-D8&~9f%$4}{Ybpr!!#+b}5 zWX6*JAeSMj+s;=p1d^31ems(nW;_pe+4lv+y;;Yq?= zndz8?Rbk8&FKlK(4VFGi?MI1m8#z6Ezdyb97lx2rb$?49;FQvTE(%FRC&Agq{cxZm zB!92l%QHSLU(*MpB(HatnTojb$l`)u7&ZP zZSv#MO3oozX|wPIn%jRmF{wwh3P0khgqp1Fr{pRGtZj5{@6;U0IVmV*NGQ2C=q$Ue zu%3NmnA5#+javn4m6dHnKimcIreI*Jqif2BF0VVJ=m!A(qKX!&nGyJ|%1xGwn{WC})#(0_rgjCk z9Nz=yYgKuSVFhFz2f2?p8z(f@ON11>Y%a5EohrRvTfxm`YEUJ0ClMW^8IXBXIk)K} ziw&Gl!;xNp?Sq|nd;V@&uh)_EIF_jun;l|%d=uQnPS~2?NE83@_sQM-_@aW$qN8TH zedCPXKhGvIZsHq={K{*g^C2z!hOn&hevfn!WW8y|Nx*s6>TCP+;Dddyb)!_fZsi~8 z;VU7T)+-H`ZrtiE+d&l!Cl>5->64GDns?YkY1lzBu2;&BK|_k~%yn7&LwYp+W?D@QZ1uqaPHg z(Y|D@Cdawg@GOey4KvI1gv)U;Q+jRp^QIZ=@)WO4skB^~?;4XHUS(<1?;=K`_cJTG;YmaN1 znj3hs^$;)tTF0R|1XmR8rc%Lu{x9H=zn4*#Lxv!9%o1I7%PJ#bKIQa&rMzGkn2|@= zX9~9&tjj%Rz}du|HAz!j%NQ~Pai0I~V=}*n3TX22Y_4|& z3bkPBrDgT-&jFcypoaLDmd_&IVBcSV?*H#H%YyKVL&va~Umb-S&o9|rbbW<2+K|XD zrB9f%V=1f-6FDk;Ifbac43=MRw=qNr@1QDvbK`FxRDREpbU_~Nk<379<1-f%Yd?xe>L(iK$OP-YLMIQ!|* z4H$!t93!ifcKDX^aq7?`=e^UEW7RDq@%q0a{GX9u!b-yCKtE(a#McOvugIYTf=fc$ zHD~fZ0R@1f1FC&q;pL39oFZW{-~T-K0-8 zeflr`PXyhz@YFllhDBh->SDL%SU1Y&e);od=7tSz{c^Mu;9|_;ec`Pj&@rO3bLMxC zQ9m%@@Kk>#JY$+N*Uv7i_k&w3i9 zhd-*EO_1|D`jYxAb>J0gv*B@`#8_}akl!qJoOY!3HW`JBVotR2&HB!Vw*98;#n!uF zp#V3O_Ud?o7HNYbTzlBk*sr*}$ql~k?eu#>x=zfEil^*u+XVgNGgNR=O`Ot>s3ipl zafT&3QxXkuVnX1=%WMu6p&l!ks^UuSK>ZmFn(=a|lAG5hL@{`KyI1O+MDv`GiO(d& zJcT;Q)?*TV-znhXQ6cS?b~2nrKhfv%dV;{i*BkEntC+7!gdqTDB!umKFRp1yaf6FR zn5wAN+}vP(NCIi&b5eV}cmA%-Fr&M*ix0YIKsK$M5g(1!bx^#NXbP^=)rB za$_Q@(hTD3;}m%KF4333ua64w-@3X^e(Dx&!R(#DH9D|E4P!mioD`$J4KAyH6%#Rf ziR+iV#AY^}_2Z;vA2~W^1hcWmeKopxjyzN;C_OkcQ5+mAnO>#m2~wSi%+xvG>bLTA!f&jumDE0kPaib|7-->`s8VxN6^|#DK;h^J{jJ9#(6Jp zhnd((K5A4qMdKPAYghc$dbZ*afk+@Tc{C-QlNdipw7)kw(^7WRZ!_6yS>D_5v{(FG zKuMaxIW53^A>D2@2>OJOJxUmD)b#v!3a!iJI&1W=8mHh6T4}i~DGV1hl~}A?*^)`o ztMCShmfbR&0B8!!9E$GG-QQStVrGFQIu|-^i9Xqrow27IdPuX>t8-uZE?JGp8yLV6 zea{Y*0UZ}E630Fbql!(xO3l&i>Ww;oFX#Gx8hWd-Rm#i@LN4JJxaKrAHdYOV+MT;D z-mn1gxtC*$j|`2zdw=?wMMs=j79C?&=rOOTC}-Jr3u-1kP$h-v6i_-1r#YE&d@bS%iXtHVLXZWB&;}$HFf(E&nWqxXCY|i!_!-%F z{Rnn8bD189YJ@H3zy3o(VF#rK^VV>V-tYZ*A{C5A$y!x|Kt!bXlEio66$k z^Ysuce!OXZ->_nqesdo1joGwna?RQ1g-y`?@m60+>i&k0F2YSK!afqEElI&-kuZ}q zx6XWxES zxhML;_8tNSpNis&R^3Rj{8nQZbf&s$2hz7^Xcf+7-zK^)nK_2 z*;`(>Q-W?6QEh%>E|w~TSeDET8CPyy~7(-O_hsP~b zftS-evm99#mK-R6|BfWY>$s;GA3mXf*ni>Hdvn^`qzwsX-X#!qLPD{AbSGPb-ZMf6 zF0)6Y9R`-qYxKye6vQ@{q;YwhybmRx>aFX}%rw(BZXDW6c(>U~2qb)x67_RLbGP2U z26_ns$^^iQ4FK%_Vh(CgPE7PVG7rQ|-MzFnGWKOPe|3e9%6}v*0JfD0=y>Db(EcOH z_hwAJU|tVFF3054T(<0@*womgTgO>Pk`juO1kXD@7v)p40@5;I0+y*kuJAa6I7{ zZBVC}N|(zMX=2j~)S1;H=Vmlg-sFy=B|J4=xQ|nuw2rUb*<^$VAG#khOD)YLOpa6{ zy|+tR7C22#Y_NPX@L8mglQ7%>d{^_n%d9UE2offt$y z{rUz*|1jAU{zqRzGt@W8vX|!#oH-`Qd#21OG3jopYL*XYd&GnnqgiTAkPkGae^^&q zFLf(np}RBRJWv$(9xf4i11vNNM@BG=T|;gi{T%cz_cFsbtDuaHBTP&fZr(r^c@B?F zg&XMFd1>j3@_dHhm{~#2Yl}wjswWRCh8RrjF)Ng#oyDWST4Ycgxw2y9HMVf~|)XH`qoy>Q16~l?k8H`hps@@_GP!b0VJ=$d#RUd=`Ws;YZr)|77xrfhmX-(vTN1A^r zTD7c><;^fc%Bc2$D{3&PDY&2~?<{!B1(c06arJwHjj=`stMgx%#km~Gos5og*IOsw zgP^K}<#=CiE|G|5>i4=7 z0L6eS7;;6*%n$n_FaIu$GG4CNS^HLS2o|Yuc9_R#emR`m-vot7X!fk)2EMI6Qo8=i z8G9P_wT{5!3+Y;nSjf-6a`t$d8neyE9gNnMQ|DnGjBXf{mg_=i$pEp!ru3^=(oKgDg&k-Rap71vz z!5#MOs}>S$O!Okjq^g?%viQJS*B=6fk#p!yJm?-&a&3?VH4_<6Jp^=w)h%YC{$<%v z&ohUxGzECKOz3tSb_^l<|2EeSn?deQmL-Lk{V*+Yoh&UMujeNv$MM2{-~BVZW`92@ z&JHn;`BGz?;lC9COXt4bJhE6_S%qGqoIcc>|3pyW#=KbP1$JUSkiJ1aii ziM?#^a&TJpZ)#LQA$VNQ*QX=6dHr|3^?xtIMyR5f*6+}wJsU^}xA`+ZiwjLkVlNhK znh)yxxtILw>+4M3)ob~2ovED`<(=KL7CN$quhdje3$Z;3%!-Cv^M*EOHi>)ltd%lM zavUX%%aZCjU_P7EU!Q4g{-o|Sc+cr0llEN#YF7~HRk(Dn3AOiTTSKpF0o0)lixz1^ z?JY^WbCY+wca{%Rn!!-zGIfWA2--*7sr~}jKLAf8=$Xx4(oLtGn|HV8@wG0B$D4B@ z=R+=^5sl?ctak=dL<8PH(1r4StAA%gH}vAsyL5|RReuGJxi)65k+M@bnt6-bxR*9{ z#vS-%$V$dAyPv0l*EDnN*ek6AOud$g%xw>OH&kkrc$&hs#H7s)3mQI^G@p6hu2_fp zy5QtUlRl9s3%Pui_`2S`$D96noaXD&^=F1Z|NaOm$&y7n&56D9|FBPDJ1z;J#_XKV)GwygPg>m6p>n>ZgxDeSmgjHPKHEeiO%(_cOkTI>3i6J2b#3{}lQ9E45_f zH=9p2aX3>VHOP#*K+?6*Q|URWQa<#audmM+0_r=ofD{>Um6+N68_4btY{aY3k2yo^G@?goN z$+z3*<&yzpFeqKX$f>_z)Qx0;L;a}g&jf{dmpA=v6Ce7>+8B($0CVvQ_FoHh?>jZN z8KHyy8lM-uA)dR_a8Q`pw@_>M!Qs-S`K)6{u{n0SX&zpMDZ1o=6r$$*1RMIwM4JVq zQP?xi`fUV#^Mu4XQi*={bsHg;13APP{Nh&4AFulhC=XKcsmEqQ8U4a#X74XN45A=G z`weDU9xjT=zUGbj{^8OF>4;^%H7Os-cIoKkyY{WU2cJN3E;kz(_aZirkJD{cgeg@P z-iHz0B)yt#H0{_3MWi7_p~iR-VDTcwI@NxS9~#iN>D%6`7M6>$-Bt){lg<7L5c^bh z|LZ2$SF~Jn%_)q%!0gYE=aarC*( z7%Ar|{>YkHEuHfP*9DL=$c(q?(8J_$w3@Gz5zS3tzM;9VXa5F~TSHfu1b!ts<$hE0 zidHMpa}4Y`0XNs$JNvR=2GPclPc?3DP~4B3#|)XBig}t<{gO#Z!Y%KwSq_n|d!CsD zSoXMWwmk?5fNkCIFcH;|tO6lEhER+bW2?FCJ1btQySBz7-M zoi38(R*5e{iA}IwowEbyZl_z;Z!a@qE*{TS9Q*vxs>06dH`R6x3h`Sqt|d@^OCiEW zC@tTs_dI>U#N`zw8cG;S=njB4X1oXtBhiys47w4+T|XuoGJ-yuH}U4Cwn6~R&|Awd z&)Rr69369tNwNkR-jfdhC#)NaG~Ea&w*Ln9dE)I>e_RS7GgncKoW{1FWjI`J&xJSO z;+v69X5VX<>jT^Ou|Yd)aw}D%F{q2ttUxF&y3>3#t7*~T?j5FrzYS_X)o@BlZC&n#7w3To=zXX-B9 zr7!~xgmrDo!3Qpk9hJ-v{#FJ^AfArQ_~}RDC&&L`RITP7*r9{0!G?xq`!S=ln4yc4 zw*?o5uP@eL*bv-8rRx}HDmEBU^CYhBU*cNc1kcU)*1yJz4K8;GuzZz{-(Bwv3+l^q z=Co)ykV-yrKQ}qt{yN>*RtC*IFBEC?#157m?0I=@G;Y zochic8fU0c{YQ_;U7{O<6({%ZBbCBE^e2|~%Ze!(q^GCNJ#ij;zKRAd$oi}l`Sv(< z`j5^#lE0%yupZGV@BAIFuix>=)1q?p??hW=-AX`jeL@L?;M!+X-;{QQd@wNqx^ss( zeYfFnI*Ooh9#*0I>3M_k2JTg}M9s;L>r(9CQ3K1@-RmQT(A_KpN@Z3)(03xS|3Mky z{|9B%0IyZ{fMXH;#KPhXauvBcH#xsCKQ}+Uie3x`9KB|P^Ho`AP)&c{L;@S7^*0&w z3%C?(Zn{!Lzawa2b#(K3PYaZCPu|^({AaWSVr!1NKp&j+{F+|^iy|q6E6sx(27Q$; zVJ4IoCpBWDz8&)+Z>J9Y;{AF~8u;r)>MqoOs~9OBHKmL^=@?Hy)SNtgv9#AvRP-+4 zCmO;jfl(ILjcU*}#NQPcY)W^7t?#@P%8peR@VQueYh~tDE@ku^CP85>1sa^q8~JG; zU!Z;Q>jTeC2jg25mQ(p-Z0%)HpYKdljF2Z^Ql=8#6afJY+a|V@wfgk0@kjM4DPC=m zgWx%j;qZL*{_nG&1VD2on|J@d<#rr?c*sfj=z5qa;Cn#}{7E2^OzRH2UZsx85zIE` zR7n<#z3C%%7F2F$OR3f?g5B9KVAPnU{|O0XK)Tdkd=E)*vWLw&;42SetJhnHa*X3!>D` zm?L2A1W&j-aupDl$@0nD7QX7)o#!~o0yxR7jC|4aG-<|K>1J}Y*f9Ihn+}3H%B!RS zRx5+)XPo$d5*inc7>VD`hdF9E^;M{(*i-t3Fh;S4R%?E;VR#$U{tz(7<&rA6YMlT9 z7toVsJOAtDV?SHM>qf?A)qi2$HH%Zz2$RQbQ97;J)S2Eyln{@}njlR*cM^~oEYI}h zgFx*0@vc;KGD>@XDphORc)qBn2}o)2Z3&KHSfZxJZi8$`?IF zv1F!l@{XhNFS!GnAa>`I0VM7qz7BOY)~eXXS|=`8Gc^_e8|&oOWq*Yp+VMjzks<=4 z7VV>+zpbqVB>!kS?%0$Sy=8{rZYta&%!gxV%)H0B%1UDumV)lDgj!L!C4*|7#w<)f z+GSE=1AvRG>zm@>?Hk5gKl5C$)4mPue-S($9Ud*9X1`aC)>I9vUTnWU+JUG|NNeeq zUNgT@cV@3-=-n`Tv`CkjsR|tutY5%(HaKmKo+rh#8o4{YSOGf|9>|&pLk~1eSE2R| z$4!Ccbm8dn=kBmTx#{w92cZhNkl=5>Y-1-v*Iyk>ko#BJsd1_a-fWttwJTXSIx=`J z+8^A^%@?6DqrNM59gx4Uy~>9Ij15=Y3QeCDicz;>BT8z@GZXMcm*X#e5@<)wBVJPZ7qi zw*L5Q8HCl}vCJ11&|KNUPF|P^fp-E^i?-H=iqixG($Hq3^6~aud<|xo+Fz25eV*^9 z4Ahy`!|{aATziqYP0laBM|D?)DN*3%@`s*pngeA1h_+o9*?*88=QR2m%2G8$eVP(p z#f17y^$k&;6-U!LfG_8L;)Sbscctt>p_Mcx z&A?N!F@*jS=lAvyQf9sO&9TwsZ2jGUyXVSQhEwhB>OqGcXQ(h{AF_oj;jdMBeV$SR z3#jIOqbKXKypCJ0IJroI!0-F?>#AV4tdVFo+$q7zQbBcLttQWlA!nJSs^Z_V~Jy`D~Bob~tZO$Vtlv6#lNU(H5!Va?e0`?^f`@%`{! zZt&Ps=bJ{00D)5iL~;Q(b;dsLwfVM%=WdGKei1c4R0@Z`|YfJj)#gZ`La@J zz8(9;4d8hv(t20CV}J0^dBQ+b4&BQL7lZ>g=f0{#>>}+1rTTnoUx^fFzoVwuNRJJ6 z=2creHu$^|VehK?!i7NAab&OC8kJ-yF_GPi?oIImgD1aG!dZ&);g;f-gR9I76_O%aP6KuFine^S8iU;$_o-9(L&H zhYF?~_&JI6{Ze{1U+G=D(flh{Cj8h0ZRD!I&{b8;B?gT%1{zLvaQRoeUlD%&2S34j z!%Eei=cIZAm-?@yq?IgV`cT!p;Vx9vYEN5z7i{*6#_ejiZ4YQ4=} zr(v<47oO*dgXIJ#C}ASs0jeToD5uWzHjEu}UKhT^>)KDX_>w9 zX$Oh-mREGwSIVlYr03uJFG>L3CrLo(8n%(|*YzT)xoj3g0|B0yi8R%vjz+*rz z5L(*wY^XZWA1DD@(o^xJQN@q=YxG&n68W25yL@GL4!UWAsD|YO*8dxwHm{_~3@(}m ze+ksG~bjw2{BYpsZIQ}C#T_6!Z*x)g}Emf83!81~Y zyr>Z|pOt1i-=@?`w&UDo#(AT=MI~PKf6<)r6Ijvi@Hbt~YAQw?6OpM-baT}fb6Fv` zGmllQ%JbMJI*z_p+L#~I zq6ru6!{6}T+VG!Ku_hSbCmzpYi^(Ne3REJzURt+};8PkC(#hl6ZZmHD?^I*0GuydE zo*$f`9uoLW72gVd-e81=OjA<>WE1TtAzAHvWRj3L;9cYRi@58Dys8fr7@)e1*Yo9W*34&LQa@F!5`FJGPf??Z}0q8`7>bhosfi*%arXle4Mi% zP%=)xnnd{bS&J!kw=JsDGHk5dwyItE(a7wh$h@GeDgSV}j@n}=whWN{|3nmwCL(4`s z)P)^we^88JjUW1*6^(f1KLYz_nZd%#@1ZR@$Nr19k#;qk(jIWF(RiIV}1@ z>0{Fq9rAl7k6@DvLFF&$c~TNy&HyvhtI@X{Ds(=@BSO`xe&4gqSNq7{pAl6EgD^wh zbE(pZw}gy%AzG)8Rnrlyv0;RP`^Ee#N)7!>w@$U0UNzFbYS5$J;%gv}#J8WsZ#JI) zsqRgCycOrYZvQ#}y%pZm8{2=~{&LGmvJghK_tJMFPds_Yi~V#QCS~l0HHp#KM@hq#Cz1C@uO(p zk-6}}Iw!cooM**+FmeQ*ihWs6*%}%tE>`awaS+S;qt9&6;10QZz&n+QH7(aV_w_1) zzN%tewMk{;ldMUItOnD$;2QcIN-@Wz(HpK-3n{L*8{x=tv=6ts zTpK6y@>s0D3$ytEHF@mzJa@CNjBTEXHSxhf7&^xW@?nISk6Ddj)C)wwMwI<2jHnUl z39YL;RG-y3u5q_7DU|>k^?X8ZzqJfL8us6E4KyW}T*+WH0W1z*EiIZ+1w8|*vUkUV z=rM#v&XJjnj=jBKmF*TdKRDB2A@rLkvOI3y{X$>T;8TlHXMg*=2Hf0p&Be;;;I9Y? z-vQ@1z_K-;RFixS1Hi=&vgW(w zF^|+)yWirxB{8))eT^Kl^!}uo4`;9JRrlT~)2ZJ|*_0&z!vNwXmtkp#Y8rTJ3=(75 zHzgH_N-YTFn1Kg~7*u2xdM@MCE$lzs3F#mI@+)M+D3|r_M|IbS5)HX|rR{gUr~yeU zobus;OC;N5ccYax3E-_;v6 zOo(D26eWy}b9M?KNY4OKm;lZr)-GYmeTOD+wTP2gnQ^;4&G_cJ1Z`UC?Nqs2*X^BC z19^xIU(xbfT^;Kxvg9{1q$&COK%N-ca3N94imp4zM{!9f@V%$?Ra@O5ANC|X*-2%g zaF$Rv<`N;%gh7A&WWww=g-7*pXF{WZ%%k~4>TGpi9XIqAS5v*4c~7PH(ch%IST{8v z199+rl13C7kJyW#1LIEep&qA+TnT4sZ=%mKYP!x(qn101us51qA5CKkAGX|xiGb3m z8M0)#zRCx^(wa*qG&SrdWA`~7x%PnSdrJ`Y94MW@`s(W)s+2|BE@em$-0in}!$F! z%wVtiyFef3_d_k>J^f5x>2mqQFqsHrPb4N`4CXyz3NR_LQw#MM21&*rrvT+*@6(Y1 z8`j=BzROu>!gH=CoV~Sb`br#m~MOa?114>^B8|QGP%>Q>{y!e zWZt}jI-v~d?a5HBz8K5HNhmiF=jHBHpddm{?Z*~isUZ&1s{+e1Eap}|bl8?RAx$SG z1(5>wREVPrr zXYFtWoxo6z7-G6tldP|b##e!T>bnhS1O^Ko6Gz56_pwg`^(3wTF2LIR5BIm#j2>S$ z{<>Y$-|Z?oQ7w&itDLYb9I4T{LqC8qVH5um>>Xp@uGsV9RYYR!t4(I*R;MOWy=SVj zkxduV1af_;Mm}2#;j<~M)F{!9C;ELUlc7YF5;50zf4!l8(=i;+PJX@XmYtSY?aGo@ zXxB`^0bD6-IP;Be%>6ly^sCzJKj+oI{|{lnfm3MidlS*3k)z`)Q)APksBsKxc3})T zyD$sPGOWR)-#U*Q^rHY=?#QJ+NJ>Aqopw9R4#Y4yG*;W$YQdAz&khL!THq^;Q5>Nz zubz<6`l@6q!YTH#A@u1j_(jfHkG77t_zLO!9vuKiX@@ZK` zx>9O%SI*%nXC<)pmxJ=)#v9F`zYXu-J1FPP#%@=#HRb^*w zln-^l3>Sm1X=?&-;q434-uL&0x<`{m#6KHxK}3Pp}+6aGp0m}9SfzisHv!dpS-XTr}NSEZJGWlj*VOCuezqdzw06h+x6*4ZF7oye7lfF^+SaTQ(Bx0pxYX4&{~|8t+HOkS z#=f??%(Y#oIp?fuH-Y?o_@y<$CT(ADX04+O?t2~d)T3)SLjfF)m*Qg4W4Bi3Yboq8 z2_W@xpV{S6X;#T((D+Fv7jTs$BNNQ&Z0$NQ(F=jV@DO25YyPUoLiyG#w11WIi2?sq zM^8ARAllp7c`Nl<`hf!v53R<1ZRGlEyAhTZuglk2Nd_GUck=8OrbN~L9> z!ZH2&pW8ftYBB&E_$ub)HhqrR;#1mcGRD#Z7=QJW>3Jvcqbm5dE`@m32=B!k1fV`cgl!jXHLsZ z9TYVtH}9uxUuSjVeg5)m{{HeMp!7sfyFE4b#V-+h@-q~^1E*}<8f@p_+*2fCUV&O5VnI2OFc2a)tzY&P z_aE2fj#AJmH?25Gl2v6m+Khm5eVco4V_pLz-XOV<;Aj6R$p%otU2j6^oMU_AP;ueT zp5`2_!MW3U1K&MeoOc)6QisHw9-p41pOED&zU}BXg;s;_d-2y_-kq(R)Ew(IM%3xT zPzo#AwQ~YYE3XjVM>ge`o#&FA`!DB*Uz@?EV?R0wJTZKDL~ncQsl%jEAY|(J?MXQ` zY%Qhk3~m*8KmgkQ_WE9e4mRA4%)k?r2ex66Ap0o!J9a8@{O+fXPk;mGT)EBrBLy*Jn0*19B@NtX9W4QpuNc4s(Fz0Rx{aVhmfN(8To7g>p?u z*wZ@XY~uh}7U>0vZ+u=q&8E}-IP#n z9OvK{;)3XDu%m>%lsF2D_n8t+5s@KzJYmB244NClY*lOoVNG~AN8`O&{6I{$zNR1l zhZ*aChI|VMNl70$lYlOmKEL|qZTkwfz&ihth>wC!PW2BK>v33TP);5lNcc`C_}cpb zB8oIX#>BTwEr+~iaa=4x6ObQpY9A-bwp1p-PGALm>Vr{Lg`6uSgYOP5N+I=>0Sxxf zescx8{s+U%-Tc)Aslww^y-mtgy}z=aw2ee5d6=KoZ|2;4q{I7=p{D-ik_#i|)V5`j z3vPuv{d6Knw#$DP^l!6z&CO6P_(YKQO#}KyDnA|1?0^IPb1}#wA*4TM&6B_bv8TH? zi4Pvj4BjGjNU~SN-lAJ1s&4-Vtx&aBHz00)D}>C+rZD^_n{L6)P(W(kX8JJb+ATV{ ze;|3&>i)Plb?=Q73p5`3v%+1-GFV%lCRA$9klp}1H>Ft(pcr zt$&)_vs73~xFaFXeYbr7V|WtQ2X8%Q+T?YkUba`z@&UBP*Ul+7I&vmWLCX8sr{uF5 zux*$~bekf^Gis6x{>d(NBCZ&;l7EC8(8G&=9&!aCU*PM#C=;b z{%FZN_wmlYA?%T&Rb7e4iT&Q9V(ZWLv0&ML1p%)8;Fno+JB$X$Np^2t^U9HB0cF64}Sgxrzo4b%E;dlAN<&CjS zmwr-E@1L;iL91en2HD@1Sk+vjqPQT%3}0``NDwxEA^>x8flDZ9rLzDm$G*nvlF z0)w$ew!1RLkKN)Dr|Jy2S*34DL?Ohy)57n%8X!KyD1PtX#vKGseIdVweV3-KiCK;X z7n_VE`qbN+(m6AVH+V7IzZW@UrXKcQA9o5h5#%ebleVUATXS@NyJ`WSe)(*S(|~k- z;gO%c5sG+aG2#N;qn+RZouuoCZNRCSTY1a}_O@T9o?HhRz>w(r2X5%TLFab8oa{vL zFQC7;DBajt#ec@QUbioV?B;V5I8`xcY`*WL@-2*2)bN z&9-x;lKrecW&74V+DM69anVxOhQ?s7N%=gg?yP@>fz29o#2E_YxWmggni*~;7JNKYBTsq(R113q5#RWG&(o%Ybi&CFh z+4yqcx(AloDXUSIA#J%rFC2M*7Iqe~_qVArWb+XT#IM!_d?AJqs;BBPUav^4Pv5cj zr7i{N{-m1$Q5?{?V+59cNMtYPPGxux$mrsJ|KC1gdYEgqjP7sT{R0JEkZ{zKtJ>He zekjjan>fM$D^G3{a54}}(RhyPjJFkD^cWzNxE-mkXb>BTu+oyQ%iz-*#ZECEc6Q*@lQ) z@B~W=OA301VF$|HzpR-R0mv1F2T-)S)Aj-P_uGmU#)*C|hmI$f)79shvEBF?X2Z=3 zf)&-h{l1BFL#m&$UqT}jH(fh|^~bnDL2c()95sK%*qslBj+g+V`*$LgUm4&XgJ@{! zBj(@T6TBw^(jdM1erm`EO20yfJM}fyxK6Vt7Ip3AQOToDN^_NtFUKsOIOsopDux!JDOwibjVfORCd`0h)|1qE@vHNWABK6YD8T(R0Og^B(G`-di?O zX4q2vC?ILNN^OR`@ke^XXUA9?l9Dct*kyS`cu=1*bbr%mq|_6=M{NXF6i7Jzb9mzi z^v6K4U`CzO<=eOCX@%lGjlTO&7`ABxH!81zs$0z~7+hx1@Y(KNMNL#9%K*U4v%w!a$$YIBCMvJeA{ zKy1PLoutywlsyb{GDkiBxLyacclJo=d_bIn zxz#q~^6%mqX!4_ad1U{`ATzk##k>qs(BNJe@8w$IP&cgUl$4?Pa(R%IrT$QzmH9Hp z1nJ+7{qk8-<`Tw>w5*NbMOiR-opg0f5tES z3@yRrDvSd*1||*%C}^|UhR~jp_hGV-E=o@a$b4@3QONY+^>i|ab#A3SZlUTTt3gn$ z2B#cb+yz3FUN67pOk;N>;YRj3?Pv=Fq;@Sm}x0=8ZzG{5>}{Z6@av|-jf zpOKP<@>129DhPTn_wY&*9e8J;yYI8kenx~`pIwN}nj6!@w&_kR=_lRVG#$LmDFVxW zGZ{D$6Rct6wl#(N%VLc@A?{ushI+l#F)$flmiLBYX?832^e;vMgpGLxa!l4CHp<{cG8K$C;NZP3)TQI%sf~T%+PlYWPB&dJ?R3Gk$sFx`J0K=pj zdP;!46+V`!C``QpV(S$ko(9_RfXK1sGrIgAZ=ZNF65l1JBLtED2R+;sx%%h-F*>aQ z{#rZ8xzf(fAtx75$jQlR)Y$0Y_{iWQ61d2NzSsIn!#j(t($!Dz!a4K4o3VFz=Xu>q zl&6q}xG*yEDbNKCS_TiE!Be|JTE1?Tx1{BV6S z&?Fia*J~M_WB2Z9v93Q`+Yn#e_fh6nu!XqNf(SFh#)e#DzQ<@3UBVgEA>Hu zKMKU*Wk&Ubsp$wZ?6FVSd-AV`X20|Z3>%It03JmPPubI3pZ~3FL=l$@NEMHc6^PH7 zCvKG@NB4rYc-wUIr@;2@{nVa8N88l5!u+4_H$n6iB~34ieI`)x$t*QkZTIoh)VxsL z8f)w()eLRDl`a(O!hd!)!+E`nsKm%Ts|i^}+yk=^VeEP==!JDz+{POe!?o+shOZO2 z5iZo_y^m@iyq)vncia`oNETaoLl8i#POaMEFySC(N&Lvc(OqEoQSB{B&@zZfjtD5U zH+`$esg@!Qr`?{z4$6!|?+1Y&Zu}ha{B-t;P(g>TLeO)3~*89vAv2nTbDxEA`BxBilFCi;*|~*nj0pDBMbDB1e;}7rXkNY>EDT zT~plU`GIOi@Egf3z45MWAXim8`hz9Q8=kQkA3!c zGM=%VRjVaUwDpVB=@ z=-QXb?wrZ$!*X|zDUj5&SwW`ytzeZmp3*nKCHVSzC?>z;A@K)Oq!hKcj^^-z_PpQA z^r`@Y#+W&sqJ0!vHA+TRfQaBOh~l3VGJt$w#x>pPKu%Ar%!-lD2{Oob9N;6F;U!R- zxV~9(^u~$$8BJjJ!k!TzD|7`wyuGnKTf(P_TsbkUHt@bvce?KxRh?OQbo$%V3IJ5t zw@jdv9tf;`en@SfuOxINv9tOw zaji2hF?t`YG=+8_?Vl~=f$b|6Y&np{^2gu4%8X18`Ll*;FQU3F}d0%84FX z>5H8p4W?+n)RzjJFF|SIri7|8e3PpY{NZmOO>FXg013+xeN3miTKyRGjd4HaI2?T9 zpbeBYM|NbQ)Z-2&yLHD>k3nuZ%6+#vhy)bL04m7Ws~L;=))z*KJ9}Z574-wV7ub|Z zlV1PoQmTp5rER3+x@p7d%>2i}6L5U$*=uxS=XRYK+FcQIgXU+L`cdDC16JAE3j09P zIicsLk+)j1V0&lcPRemZjybN^DMsD+;*)oy^_}H!gnfjkYmwNT$<;AkPa*X22V|+g z0N6YY1Ud$}|4sN{aSWrNCl?EpdshOXDjuQ-nMS`wyzI^#;_C;5^qT+Gx>EHObhIc@ z2U1*Ov1N{VkG$-!Yb8*;1fz%Pw9+&+?4Dfdl>93Nsh7Y^r3Lt60r+9)>fzv{+bdgl zpXY_6bG8fNO@#9<`&s+#!COSR+zd0Ax`}1X`ij(B-f-bR!gQ@GLc6F zm7`v=bGDfqrPX#JzJ(vhU|!yKH<{|Qv0YKCt=TLNI5C9UfKLe@dr3{4Ui^#}r|1sZ zSilvV(xo`liP}aeA!yJ%v()izoe!688h@$2RiwUyRW3eBHMpbL3z*-6$N~relAyn; zV$`+i&RaK?Wd|IR>H`lZ`@HbWAMeDo@RyDy%7_5c={4uT&Mt5w(A>B~oN>1lM|tYz zSVEQmgccG#UlX?}{V`?Jm!BdWZE1WdDZAa*cjCV^)X2?i8OO6Oqtw_PbdlxM0AbWT zh`1T3ul@*UoQ@OEl=!us4*q!;l!r>_luFFqSw*nOL4*7==QekZUL zV6RdAqxS&%=FsUfZ5=UARpgDD|5JbYs>2bR8yl^wZL#+XH(y`2N`QRO^4QlE9vZpn z*y@*p;Ts6C436aM+{mRHdF|LGRW*7Z60SPojSNhBiE+ocmhM<9UjK9hwz+$8qQNYbRb64^Q_(Y8GW5?XCLnBSfQKb^RfirCTir;CU=aFkn zL`Cl^NX%?#Qm;^?s~d^b+<(c>(`3UN@AgJ0HgiFH zD>IS4AQ>m@CSXus+PyV4$BPV3{_K5vVyeI5&6}K|{#5*hu$aSSL0B%qUabK>?}j^D zs4l_todT)+r`Df|NCcZnu8`+qJ0WG#`NQWuX$L~4!g+}?AJv-A)VF#&IoYb;JZTK) zM!qj(O>5I7VSaEb_>U$a=r4FY-c(6)TpyjK`!keic=%|hXDVIUlxD#C;#7Xn7W@6# zQj7;(e5;=j!^wtCcfPmjCX*|8#ngjANM}V)={^^FP^4S?dqlK!=f>%n9_kk`aQ0qT z+&EPUbTR&Z+DWfZz{#~XC|>IaAD9ArA1yiUhp)kJ$OT3ya^yc%EJqDc6?+n$Ia?J{ zy_`@|H}3B;Yku+ z+_y?&8Lm`J7be%=;blieP%b8Bxt1$XSBST-FpcCW5D?}}nTkKJ5&Z${6?eihGbBD< zywS+egK4d1Qs-ZABJt$|8=j4@U76AAz`=5?E&th{E@#{Gy|UEI`>4!#LPW62X8|x&c&_1_PQ?8 zKYGn2SSWX8#V;%rmvG5ZxMMoS@c zc_~iz8YDZrQRlen&c>0{jvoVQ9)(tx)}_5^uS_5GsMFYt*t(O_ur5|IGN8m*-=FA@ z>W-!;DSz<~E}{YvN`RPVxe=yED^CZkwTp9CLtmyJ_;^=OBulV9Gt5~ne@2dZ*8&xp zlBaL8|C#ylzvasV(ZTG^mY1nJ3+-pi*u|6OPYQ(;2h(V-#H!q_B$k}oRNH~Lw|)JL zomRC`jFE*_koD;g`myt1Po7C?G55b5%Cgp+%IT5WPVjg{YsQlXJ;dp@j6GTS!W`!>xpW?06j{vi+BN-P;l+ZT?BPY5-D(!)BT*8aKibr)kU*d`Rcd{1f`cew3zkAdF{Y z?BKfu;P4@FlNj`|ksEanSiyHaqYj&J&2t^2dWc{-+AApZ7qvubxlNIm=#LRU9ZIOS zXVw10^+2~Qma^raO+BMwQX^_deN*+{)B~#UEr*Z&eG(i;39P45J_i>oRYSqxucKpi z2>r*ZGU0vvuPmFS!1^?mWpPtX(bXt-^V~Y<-W^%N5ye?%ZQV9?{0IvDrUUE5e~H_a zJgINLAk&+jmPSj+9_>Fl>s&Z=Jf1);AaUaRDK)aPoAQFhtG|V-r$~8#neLnD3`^@t7%YGZg+!`1gZ{57i>>4P*zDT~HOtPjZ8ZY#Oo zEc;+U7O$;sqFEk3Nw>YeBy*wtrI#e_faiTZa3~6iW`cf#|L}wl|Bols0zvL6r@$fY z+|XkG%FO)y3UXm$VR2~|v$g=}i9Jm)(h`sV&8I$OsXz0KqJeC{l(oy5>LshQtZ@>A;;NIwp(XdI` zES`A2Hy>yJ+#?FA=X%k9o7NLHcXV-b62D=&`<4%#GuEU}#q!2hi6kXaN0@1vdv?T0 zCH5)DGa<8z3ISP&JiojLe1T{2vLK6f;2}stP>!ezND1IVg3UiVZ5xO-HUDSdW!DaC z3<+%tiVO{^YvAfZBP?@wh}&hj1Dd}naoB`i5&N$?01$Wf(bBB?V;d*lT(*)Ha@$}Q zW7^fh@~{i9*)5e7sHamR^~#A^_Fc2}+5ww%h4%~DYvaq=Tk)tVqK(|Qx$@BY-gwM&>{6Yl(Q~iAX6r}uz@=l+(n>Z3+L~O_$^ZJ+J~IU!S-@4S`JGF^Cl2n}sC}+989R%ybJaKh zo$9CNU>IijT2n4M^MPceodPHMv$yYNf}j1<&#Z^!CJaS~7ajeDZDxNZ6__YFJv!_C zG;}fh;=7h&woTQb-U_ro$bRDK(qFTR-x(Rte3W&OV_&ar8`U;Wl(j!J^<-Z6|1p&n zQ7HC4#WJw+U}2&AsUEls>)1I?<9pKcJMmYE!?&TCuUbKRP|rG_9L$kte(k;#6wB>d zFswPpRQtdoI3hzPPUOua+3@U{6Xh@qm8Qa6=(iJ#)C=pr*MIr$H2;{Hbis`f z2&PZ3MR1r5x@&XXJ-OoD7W0cHuu0>d`Y<(wz!cS61MH_VU^{{Q{KQvEApgXlsLolz zq48u6k*K%_2LZhVpAMdWFLatcYdenhjoi21T+safwOB8c?Pd(6#e_cnbo?E6j@aSh z&ulN>B5wopd;I>y-vdrtR)jmX4`(=E877!>-*dlhq)DgO{ihaWg+F#EECPj zYM*m}@nO}Q*V#`$(C%*We0>D9yC%c?A*-yX-P0Ulr8i6=_bY<%`W$c=e@6zxx&AGg zd>FR&Y;lU#eHiIiM))H!lCRj+UtL=8S_4elm?@g?bJYvU|~N|taRiv7jVIaRnY^gg#cok)(`#i;Y9k~K|n!zO&f zG5oe#_xki`zN?{LkV7)m;z^d94+ZU^r0FxYKSntpST{Dm`Vu9bkO?8hEle*DY6?L1 z+&cbMUv6dx&AB_;gL93ORg)ElRi?!k=VMuGK0+?*5fUezm=Y!-+l%nGM<)UwL%z4j z^=6tI@o|4rn@njOj=pK5v!UawDq1@mI(dVup;%UJ3*95KMlH&2$!)4rR12N@bb}T~ zs@ItDLw8!`&47vkxEoxeSGM{fM{&ptHc{$(Y9n0jZ4m-}!T98TVvlc0<%)JT!Y(hq zzqckDp&B^?&b=0)bK&rjf_Sc(0Jx4O6ozcQTb9ZtZ~&^}#$}%!_bq3A{bK?5z!XT& zyYGc(zsO;+xe=Qu&q*#8pYq?Nu47g!4x>J++S=rUs(-Q6opfZapz^8>;R}h~L*)9^OM$X-l~ zWKttMO<$2}@rb*Mi+_OZ6PPLAGMOmC0-( zT_Y=Z{ojA~8;EWz4)mT4ZAt|hhz=9vjmQPu1X2dYy@!Z2#bVj{6S9_0-_*x{7}sJ= z;uT%pLx*1MiYg8*GqXEl0ROAa)l*_J6U!UVGDR}~YjM<=p5)sGlo|SZ$Jb&$>QFq4 z5i6{DT5rsv@1-9!fp$V;{ja6>pD)x08(O+YcWkdEyH>GGSZ21Qe5ususcQdfegQ1L zd3dzfk|4%d4apMbQj0T9>+P^?qsvE{gOTg8d9P75LPCcvHxIGN=jra@{>fP_&p?UF zPn2@`9B2zBU?VKP!vb5gkgoLLp^(qRx9zm{$J|DUdta<_1rd-LlBI(fftYE06iQHI z>`T0MNQW1b*atX!>fFto9TqAZMhiJIJB^p?)^!0!xZc-k)b>IIHh|fO&4Ll|{{DfM z-?}qUN{{EPh2aG3_WiZ0KKsCVZiSYHg&9t7#k)S|rX}#B*+{lt5iSn>a`Llu|8K0% zsk-O=Na2AV-#C9U6-AKEvle`KYGKyX`U*O$lt$?_F~$Av(TPKTef^@!Ce-sYB+fbyJ=(K7r20(h!2Y4L zMHWS8RS^Nj{fD6UY24EBj~VJKtmgL-&sn{#G<@!rSnU`1&s!L#?m~D>26cnw&aX$5 zE?SW5kll}Ve%e9uFU{?D1EA~`vjXkGy96v@rx7(5`F0cOT3@!t4yy*O2al9Lz$x9S zr)vRU52{=3E~jHPnzzZ7f2RTrl;wA02sQ^PD0^n#E%lZqB2`VT8L$@TgX4yDiXzWegTZM`5Vl0zN z1%U!Nf;5yA|FJCr7H0^)Ql6n@5vNX+=X<&5+pVHViBd!8X^QVPWZdOJ<)w$6B5HHi zWVElB1pDJQ2QjDSZ0VXu0POmIK!BAj^Jh#O|72P&{s%FD`1@ zIFQHWSO`k-nSC)WZ$E*9TQB=l*YfObVC>OH+6AIe07!hOv|y5EXY15GjA1Vo{{|nfDEdJbDSP1=G6GV{n1hPZqDL>%Nk1PW zPCjuZpWk}HYrL^tnDXP3Vv&Dgi=*)jA+byxXlGcJ2{2CAxMJ}MRFKTw#PBS1dVY`D zx#FsXsZ=E|b>7DFc%9(#A|t~8xE6sIr!diS-M0e;na=)yj(W7cxoF1FY z*G;)nSL8n&TrymbsWMUU_Em|Xl=fc#TkV9$C}P!|k87k}w6%Dq!ChVqE(=*BHx`x^ z#Ixw123n~a>#w%EW;h5W%P*Qw`KcUQ_F$@(NgqXHJg2G2axVId8K4vU$2xIkX7wrG z>p4Tcnm%zf{)|^II9XBIn06)tjn-$r`8z?y=#{$nYOz&&Qd4#A+Mks(yYGS{Nas|a z?dNY_g{sLB-<1O~5eHl|d5E9#P+_CzdvS3XH=^@JZmrNbHa>mCU$wgd#53n>#}i= zuJap6y(rX?L>N5yN^lZyE7>f3Oxzdk7T9_WA_qOZ%Xp=$TvHM+ms>$xd_;%WydQQB z?64tFcg@0EFm!nPn>Cb;)}JyT{uv*_S3M&$f0h{DTXB`PqmCFy0{>CFd4#&-TbRjPSAzQdUF*MN#I-Mt&t?w8j}KK@l?CV55kXe2 zyF1}_UP5pUbi%R6o4)?gfnuifyjcxeE&DUrj^w*u&}7)){_#nP2O;V+hj-<2qcN(kk5ASr~#UFcIF5_)#5Yzo8NSrNl%u6#v1tT?RypMOQ z=Ue;%aS4~!BElA++4CO@lYq+#LK-VVX8p(ClRHLOK{sR>##u&PUlh-IrS1P*%s0mG z?VmWiPs5v)%%Do&r{&pSGQTcEq=ptmWA^x&2;8NC&jAochP8$NyLiI4`S{2+kjFArW9t zIoz0SXpt>I_BM~;7^M6sX}o(E_4qMN!ye_h*$>}xj_5~E+$OB=kw`GbpZxaKN`pn) zW3u{}Zf|hn&izXmDopn`lC~vePAYemtaGL(Bl4H(2r4Gi3i`$M4W619E1ZjVxuJ-A zUHLb)YUU7)Sz*}y{W3MF$-4LV@eOv~GSwGDPx{(E?KIh}V%g`_ghj$^eCuy!TJ}|9 zBgeidERq?T^Qy%V#tf zWTI}mBptHNDO$sl@*v_EM&fm?V;$Fh3Ia+unm_n|wN3(FYAr^x-rhIk%vH~KN!%*F zy@vkWG*L9${LE`tdl_}^om%p6{VQ6w)~~)LWA_qLf;vo6o3Bu-P~YCDy2a459-D3O zWo6F`|6{7qso9%PgSA3#PhUfo8DjG$iZuMh%2&7^6;|3E{AUks-H1Lj<5 zM=|Pv(4vpfn5NlYURs}DTUkLbt*m2LQRwAO;OB72U71enVBa~3BRc_RMkULKfUH|v zr{m&*^uq6C_Ow6ijf4ISzLrYt)(}?oA^UyvHgcz=7vhISvuE4w6yMy z{91Vut72q@-@qRw84FO8$llgVY)S;rp{k3jVfvXyG^uPM=#DXTWeN^Gn1&WqKI*Q9 z`uXsT{ncjTBFbP)9$z+9iJ^P5rxrsOO~>7&(Ef^-#OG$Qg=p2SnFAm~4ip!EBccNs zBWc`-0j*-3NC{u#>~y&GiN@({iF-xi?uVAn@oMS0G^_@Bh?bP@&Rx_b>)V7#IePnN z3&by70Vn|Y1t)zQPS4pKo9HdJ;^3=`?@ubraFbE(dl~L8mCV!Dz*{xfKasFCozI@- zyz^Y#%EZV{u!^JILfBL3w0M%RNlRGGD(FM}h>L8dpM55}$xBO0M8GIu18iu7FK!Ex zSZgZ6niGnjjBRXM7hY&RNN%NOTlFzvQeXNo{Q+7cqVdA;iMjNTyBq9B%kc_oS|6U1 zFKjVax7^5hU*0{CVUteKH6L)3>so?5q{R>p5>ik3jv4z0N<}n z8pr!&gJ!Hy?=xJK0bqf`;WJ$JF9_gwen^pNO8vxbKx>?WVX>3;hClpxu`0ZcDz z`Z}5sB(x3ypEAVa6DTU)nabd$|g?=!AJdTL78xO2s!-%XKRoL1XGPv>*QL z-Vey8b-i(cyZ-s)f*ECl4D`&4UL`;)MvijjVMPcVF&wMRj!f$BSLl^hY9bAO^ef7mVvm-*K1QAu=Z#5*S z^bS^+cue=&MLxhkA8k_1-d_$~J@+d{RLT>07p68DkLI5f%Pn0K{MIEq%ZNa)AFiX2 zW8;Bt(2!@hhA!>B9_y_=qR$NeUi9}~X3U4&{w@^R{ivG2*8BX!*!((Arv&y!Itfp6 z5OMmQn{q@KfF+8GYwfU6F3!g=is;wTuC8M|lO2^T4sf(H(W8=T-TTv8bt&~*j_m$7 z%fMe(+SzSsiCPtmZF6^Y&ZNfQODXW^Ai&@W9`ao=i?fAOj zNy|)VKXke;*W+@LczG#`cZK|ELOIN${333TXQOt1uiX2z`+YuA$Af(64VL)6;Oa-; z&;Aq470AQkyxfT*78)H;umfw;f z9VAM-&)Cj7fg*fHW8X5oIU{oSpLu-M!8|0{Cw=x#)=6Wv>kn>$AD6Bf_n^$a+qfg> zpRJnZH&Xs^2c5w|jMJ|4H=`!Q{v>}uc#=5<-#=NWu-1^-kG^<4l~y?7u{*gpVN{*u zkTZhYr+TU;ZbMM*a%kG?f=v^A$kMhfC-BA5{wd4F;YEwz(b*360gV31Ck>`VvE8#SYk-mwA@C(j{*S2h z4y5{v|G$-)QHsizRk-#F*GjUBqRgyh?`w}jLQ;s#TUnVmdtBEgvaahE>EhaZ-D_Oy z;=13f&-eHH{^bvUoqJyA^*-nIdcK|yCzWZp!?;vPfBGFVoCxDTl5qk3x3P0gmh-#n z?>rQ(08L_1`jPy_|Abi~D4z|xzrx05c;t_kX4ZiHqa8Sq?2Jb$d%7BI+Iy(cd^Q&E zO2oTJ$#H}(BX-A+zTp2Bj9)N=kC0jF~$|`<&_u+j8<7O;6qqG2GA( zBQrOoymH*_ABJt-Y8|__ef(V3t;)g+dfA~@l=3lsfsiCy%5U-*D>-CkcU(y|jbO_h zCUnTo;aVL$d;C6EP*fZ4tYYSDrZ+%7sBOE}uez!40D;OnUKM=U5Y7ccps|u}pQ`85 z?+F=@87NaW7?>YDfYYxgs4!a%K-E7v7`^D=-;kKLNK(*ppxpI&$mMO0YYVtaY+rq+ z%c;ZZ?2kXsNCY&;0%4n=N`{H5CD!E=lTg0#_+GTXauj=dZ>u6>hJdDejJwRcXoIK7(2T zW+mPwUMN1&lx_9MDFfWuq^t1Pgjp@$u;?T0*Jqa%I;XCG!Vy3@?pC03^yP@e#{2T4 z<0+}1-lnme)7^NcIZFmf^NK|xVQrgbqmDK+8LJfqiyCVI(1r_7$otrKz`Yq}qZi5i_( z%+OoD)DCBgAsC^rR7Rg{knMLMKX{0q`2DO^S6Zrw?t9!3N|>8v_pKa)ZNEzHaD0u+ zaOY746=lg?YVvNM+3CF7*q^u0M2xFkq>E;jW$W|ppwOfw2Wo*~^`SJMad>0{xltF1 z%UV8u;O?C&VDMW~&EM;%KX1X#1@;F%2ds$ww;Xs^d!?qAF6j-DGaN@R&XF$`_>Z{{h z>GqtL%Ysp(fv~%P7{tD@1D{SiG#aI4*6-8LO+kS~HYSfvG-9VJO7-jki-)@eHoB&I z0xd%a%dvlDm~c^5eeuI4lkj_70xkxVxF@cs8?>n$5T(W*zFb9Q828?vrHjh%Daih) zEaXP`lnKn+qUPesPGQ_%vWN!bzd9hEh_?G`h-gLyFohg_xe(&*hQuDqo@2r3>+}m* z&pZ1a#3d4Qsb!NY^5?)bV#p+1H2ev&T^$!4yd0dV`zhjkftcH$S{iTL#~jILVEcgZ zU871l1iwFoxyb%2{&`TSxJF%NA?YY+o(se}Rj!Fxb(OUPi`tLK9W1pT>zz?l*izfK7GX;HoLW zuKo~0Bmin{*HkkFTLYPTy{BN(_BND*)tnkTfSD`sE*KoxHXC(ItOI5Ml(}?ej4q`64grJrXOd4Y#@(x{K&yy-HlWw!@TEAP zE0;8ft#?|*p|;Y1(;i4!&gNNQY;gA9 zK((gK8S%IkXloipvh<9476EKUqxR-Hw+-7f5G=Q$h@);R`#7%%hpzt!Mj`p~JJ+G%>l= z>HA4UMAXU$1_8;Giqc0>3k-kYRL*9Xisly9z`jdWRv)=yfDa!h^ z3!eh(Dbbz$wqCB@Sj4<+( zPAlLJ6B3HLc{&>*S+xCk!sGgOS$r&Q5jEp=Hv02+9r;R-CogAb|C^nhWSu56310Uk zVy#1FJw>($r~RE9XZFaPLVCxmU8`gVYVzW?X>TM>H?b#uZ(tAg-q7|_ zJkm|amF2v%dY6OoeWS6_38vM{-|r6vAl{|kVkUkYW=K0KH0RzEFnd0=%%GbyYTX|C z-k)Sr;^DBowy-~(G_+}HU?aL_z_Bs~TnzOigeo-U!fj6vH*z0iL-^D0yAK)k<;EGj zj#+Ut&ez4RQ_k`Yf_b3N=9cN zJvD=792Q})>Xy*j%fLow-*VSVssaaN*wJ#$1sZF5yBnxCzyI?WljQ{M1db9BAya(s zxUHZ6?Mb*cL21$alq`k#A?mR|kz$E#!{QO!xbSx_CGDCHweHI>eqGF<~*R*#L%+n^hXsR2@b^InmpGSE;Lg;+XhWIMD$@n;&c>wDiy zIZHvKtVuadCc{)sR@Qs4^F~jkFi{orjih1yICl5*Mh@SOKn#_`hU}`c&|m;>OgV#= zBmU|O<%_S#Stmx0cQWKgLvHf&T4Sw0y#0G$!zAkV1^44rRyCEqBOdfwTPH3=q5WlY zd>gi64zWnJL!P;yApsEt0pyg0wQ zxiq;rzqqopy*@p^yt+^BJp66B241{90D*wGLQTVLn~?jxA@aZ>|HtntDU?&yZd@&J zYAQ&Ayt}&nN_2kQ^ER1SeO?u8uw02f*^-)wzWdyyaTN^zcvFz^N6&%(cW!8Or_b5s zmvQJwmmt(HVhdk`>@A#Uzr5yLmt&nWf^?uu(q_e*7~#rm`+G08V|1kzK#?|m2Pn{x z;`X;Ny|ae0&&d2>&ki_oUX`GnR!3B|aKn z^xmXt5IJdQ?0kIdGz!)5=PzTK7=%CoeP&#wmDi*^chH+c-|Dh{&O5MR3f107uRbw0 zX31~YPc1bm+qhnezfb_GE~k}>lh+qbi2ASOnLdQu8c$Ra{eazd$Vyh_+Ish{q`F`u zyrz)**p+nL6Qt1=+O9Ld59LwNiXspr%*g+QPQ6V0d~ntX6yr}yL|v`E^@h*+4&Ylq z$RTR1nPz*W5P@JbIoVsOj z3;L$|S<$*SHoX8}H5t`Y8$UBN{5J+YhipA`(Zfuzs&&;iq^3ttOa2E{iAa?w|A?7M$QtN1`*G0>b-0PnG(C2w*2-US5T|O4D$V zAQT(4Ka9KdebAiYhTpxN&|SE=jZ1(o&TvEBptkN!USTp1$y=*~*`C%s=4w?J=}aJyx|wwD8- zZ>Yur#n}u#&pT8=0eKD>1|=#Tnpz zC)KSaSWGj#Z=8;1_(ffmd%KvG8J|P)6hM-Y2>BF(yIkD%rL%9T_S;J429k$@irJS% zmMw<%JTFUP(wD zFa@y~Zbq^X63aB%GPj}SXrj4fmtgAJuJ$5y7||vP2$n+&XbibSDG>plGC)Za2`%~p zV@Ibq!~b0!l$S2Fi{KAm4(M%UALB+iy@A&~z-NK`d`hk%J6jg5s5*p%)al013v@a8 z*+bkR_(~hA9p#S6JWa%V+a~8Lo3$9Jx)}iy$Jw)2N0-%|(!Jqh;U7wIYZva=7W9wG z*uzvx;yrRlkKch8>B>w?&Oig)QIP7h=eLW0Y1|Jjd2RXVc5%Gcs@rq0^&M@wc#wUp z!r)xD8E+DeSG(7A>QL6}Jb^+AgDy(u^Fn+OsnR(iS82l`BD2NrG*-9CA2> zQ$KApmYF2&q*jrP{Gnsy+5HJFz?-70SqU&-sPe({I_%H%2LtuNCvGPd7hHLB;`)S6F$=vI5zz&qw7U{oP0RHp8B7<$FX;q1TC&oZ5rZZ$H zYZg<1aMT26$4o?q*D+sISVeDFDg-H7`#l^gP0B)TbaQ`K@8Uh!aBJe@EFlbMw7OYj z8P?u9g^HL4HZ}#rV9g`y(Z_$h3&!L-7G_3p2;I{d!)(Q7#W$qRud4k@AdPIM(7ISj z!tcakwk)K?(_b|&I`z=}4-Kr-_}h`gSFXSB*=9?Ki&V(4SYj%y$~NKz=ODzNU0^2r zAyHD$osrkrFbQ;#Fh4pSseVXTyhRjKgkH}%ZIz+TtMU*V8%G5u+&x!F3X}f1vnZ>2 z`>1!>$}!UH9~$R{sQ6AricD0porcV%66mIPjZpk3&zFoN>@vFkF6)97q!*`RMMo-$AXopdaS6g zi8@n9z%M?C2GoF`M(WLDGnG3R|E1OWYcud!hP?*Vwr$EtaJNp+memFxYRPqZ)*Tv7jqZXr4T?RjOTJ9UxfZk` zx_Dc$c->xQKp5ybLG=QjpX|{V2@jF5ZGvHdO~DnYuCp~z!?S`HcF(In$_MY?AM~R7 zee!5Gur{pZ8jD`p}Vuoj(ptvuf)PV|aKg=g6#1&&xgP^#7jLY!O@VoTQl<(OP<> zzU!Zfih0Cx2yT`3)nBFdRMKA07nCVHjPN@M7^#7^^9MAhCT{|~Qj-t=6xoH_yeNo1 zFh%9BHePi{^TFQOb**e!W=H+JQqwXV^zg1%HQ&*yBGhVAz@$Ow)!t>S3l5S>z}UCD zN5fL0fz@Zk-O7>T!Wrxh`xehh?e-_$;spg*IKRS2IyD0y3uf5g#TO|wjn002 zq#fsSbIkp&lJqY?^ApoczMo?#&;6kyvF&YYUe!9Mr%HNRN#rl(TaVm!=>Rs3g2F!q z&XE259|q4{QQH@Pn@3pUm~H75t?4E7H2$5{uHAcCkYxX=4a8}rnd)HyKb){)Ka5FO zQ)&+-1LDS)=gmu-(1Y%0#K;O&`Ij@B$3?PY$7f!$B!-iWUBc45B|$%g-E(9x zLf=2@i9q-7W>-)4;kvn}CqlMK1ATgTo9mfZ@>786S{iIxBqf)_)CO0k5QyU+y!2z0 zT!5z{FVPa3@)J_^ZbE$--5%{Ko~CWzHF;Hc@vZAqAh)GDl+f0H7TI#0=@OS*DK_Gu zvj*YB(XUNI2QaV6GfS+vbLEodPII(^y&_x0l`I${h+{KLuYIKcrzcfSq>zT>_CtfF z+PE=((4&Q2#PULfDX~cnpkQC0>2gEIqJqhGO|a)B$HIpqc|rD|kF2g*qm2ja@~b7K zST4KKB#Nr5)BYEF{HT=a$S*VUjX>(w_(;zy6iKqBDlUgSR-xAtI{BpZbjLR4j&w%cRa3Jt&;&dr7y|;N{;LcdvpKVU~h-KuW7XVNV)sfY-Wmolpk-@ z8xhF+6*5yfD_NL}3hh56vY>!g4YmSHv-94#j+Nf(a*uJK`N9v!ptFEEhXj@E)mq(J zT%GnycYMe^>yxb(vpG5k#1a&ay=up1GbTie8-Km(UT{|3(gfe~2J?-$ zq&;NgQR+)3@Gc&zlhyK z8}b-a&J$6Yc{Va3nH;rIc^c{me?)g+BOh+|de41%^}@9 zVKphXldU7MN;b2t*o0&h;q>PzUKVgB3r<!qrKR;X+%h>5sueJ$4GQ#N(xRs}B7Hiu;aaesl)b4J z85eatP_y^_`rl4(>?ED_gZSGtxm_;gpXR)c-(j%Q`_L-ghJVjDf)|V}(Xe30UK4Ba zt=U?0JB2IF6qvkqZD5xDvqTuxEF91G7U+v>1KXAv8bbCXUhYUbV>IH+ii49jEzUFm zO3lx$%_1g33;kfKn6cjnUoHi7D5^tC#*+?C+eXX)Tar*(aAK8xi}s%clbD8|Y>Q9I zV?;*n7`^bzv2q0?igO8R-=cuV_Cj|(TK2>2pk9f4iMZCvtb;aNk@gc=@#Lv{P zqf94=jZi<{I}n%A$n3RR9}Z0Kj5vCREBn5Uu~Cl1Eg*K^ApOKDQv0{yKmgI(?|m}w zhVeX~YUJ0{Z`s#}CY4(%Q$2=Cw5Z%qYz@=iw>z#OpDJ9CTpy3xH`cH;8h6TpB#HOr zYVyA|$qZoeeFxH{;6Kk^;Ifuh%n>l@4;P5GHwx06n<*hL03v@XFgX ztUA1f@Txs=!#d;c{xKoUmc71qbYi}WKkga3h5nm+|2^EUE!_!LVgVog(5WJ(mUh|Q zgkTb$^yqmU0J(Y$xA5;qJ{X~LQ93myY=@nbV=hSIS)jJvF=}UpJYYDGA z&rjwv>k1ERwZyYbbLOho__IM|DM|cl&-%&9MGe1pLl+_gkYEVE%XGCqg*<5J@2p;;_P}0~S zBR0b5hMOZQIqPehhd}zXO+iaZX}AHct)HIWtf9`iB~?PEa@-RF0^i)}D$rBTq7RIk zs-!+YtW zhT6MZuftX4^7-R#kG)bSkSAuz;o5Dfu!#>uS2I(09ZYTQ;zzU4=Jou>fTPQZ$f%vJ zu&L?9`CXxG_AJhXDZ(wI`t(Y!ku=HU#g#2l!chD##avZ1KNu~-DH{O$c0Y1layOtF zwk)+(CsZUpxtYtf5p>2Ro4b4%7S9l7zGH%hy>aA{>j5TgV2l_kAA0LG0zZIq(g@mR zVhW~OV$1dNh~Uho#Ah)ZRGC8kiWTC{t;{rJ|Usc z(d+YRaw#~|W1D4Az>k*8Q|1|WLBK>RHLo4l6t>$Ro-ug`{#WEQrR(YftJ#QLO5Utg zjg_pM`q)P>c60O5edT#PK7ts>NU=apTBvRJEJd*UW;wk&&@^!y?fqS zP6ab(-s~4AgiD!h3~EE0?6^!QDHznsF3v9-z=qWUcmJlDv=Hxf)6w6>(j>E@tqhsn zdoBr6$5Lg)Q2bLac$o+6*Vh%j&gxc%J~Iu=U1<${rBKs`E_(>GSF0>!Ewp`lI5A)T zOmE~h|IVu?-(?1v6V5$~JBkmUR9J2Od1X6|`H5H_wnY1aUBi=OO%7aSZeX8=x#BzB zw63-9{qTyO*sFPBm3I;$lx6@n%pKSn4`j%4JAG2XCGY3cjA$IkVz}}1jzgZ&J9nB! z2p=D5r0se@Ji{GHoA{>NSHc~8sfJMD0SHoZ(48`q_e`EQ{5j4mE|i;Z@g$v*3@e@D+2!|_6sp3?U`%WMU@07X8w9Y3{i5qWmw~o4qU(f~FZnXPikJozbm7@VAa6;>(X~AwB z?)TFXx3LdX(=2Juca-GUGB$6DFvwdu7=O^BrhTGzA(~0bicPk@b8(6g`+ zgCu1Z-2C0!gpMy~F6v8-r0uY{J4G7K)UC_&2GKxYv5*A|7xdY56aHyfJ2b%lEY;d1 zIPAlc;zWcsE)w}R_<+u52qdo%#}@^~K}nHEDfVMShk8XdM{TRE3sbo(1YNM__-;j? zdGuP7XCsyvNcn64pIkOE>;Ew#u4u`1Wq{RBIeNT3#RVuHXv~My9s7Y>h#@3ix16%q zHR^zPl-Tj0OT41x=1M}=Cv07B>MWmDW`zmTw6?;szD%jxS8>;Cl1K)YopkvwbQAVp zIxf+lg;U7Vuq;uq^qn^!a1Vo+vTSYuZ-oJA4~q`n`kSEweW^|Llnh&^B6xxEx19r} z24lA#T@7&)crz{}&lvk3=)KmAt3dwYG`ouU+*wLjCj?O#U#B+J=yk%xO7~my1X3-@ zFQLXl#H$3vNUZ?C{So;ZKF(*d5Hc?`$Sw~Kp8>Q?ais93YF4&3x=Oyt=9V;OX)vr6(6x*=VZS0 z7G;#t%lrB==C}X1-_w#f`ue?wU$t((C}?QNn^;{913}6Z)V|qv%#u6$yePCv5_9pDM_3l@^ z9q&n(7`u`@Tyf4;YqFQuo&0F4c!xp;%6{~Tsd7HCwLJ>RNj z1CkIZoz>%_rT{>%6f&qBfkB?ct?!@gi&{6yz7|&Hc=Y(akf)*|i0z+p{)TF&a&N;E zkKVcUZ0nJnLcIfjkcAy2I((*-nc zPKuc^!P98_^=Sy1?Pr&sRvG1mKi3(4d|TJ9r@AlxeiYM7iqy%`ik zZ*=}sFiPunJ?jtm3Hv#_bt^43XY671-qlC3bImmpSt=UvPz{*(<_~dI!;_yLC(c`- zt#GN~@_?+aB_|Gu!CI5E?1*qW;hz6eOHpuz2+$gWmKwYPF}jQ=A2}*OqwVRm*7K6e z?P|uYqNj&YtC5x8sv;veVHbQ1>hJh;Rq94jOo^d_4n^CKtnQF+tzeLhpb!3ZQ*k6Aa` zy8N4677?rS{U<#Z*Vui2?MdVRLgq}81NIr@x}4nOCRF%K3+K_PH>cj~fj!}$=W8~m ziR17iRMv^oYg>_Igb&9`K~&XBgHC8m-Qkawj~?~xaw2C$y8}bO)+3Srq4qZ#(+ksU z_xxYGGGbhI#a}rqRofpm?`$LZ;ONb-9i*#!8GnmrY}=#1t;v+yxJs%bvcx?@Z;iMq zt9Tk*;g3WuIfchX-bx?(@)(Qc@DnH!H_pu|07$rMiI9AqzSX+0Z>;}5t` zxd^b`rHD<81RwL`XUBxc#A$N|$wt|4t@TGcqFy_(M@VBP6}h5jF3q9Eiv$Ylm`=(9 zvOKK%T0z4}B%d2z$ z6XSNV5ocz`yl4Ju@NKEL2eSf>Pt{IQCJk<&v+{xIz1zEs`M#@TsCfGm7bM*t%>McF z*RJm^Jw8K2S?u>WZV3V>DjM$~ePmtyf1(~SB-YJ&o%r0S=ij*^`Q z)olxgZkYoR4|W$U=-V^7kghWG3we3fmfYAwI?x;3; z8IIf@%_@HBmx{8VuQgxvq@@1e@rbwoS7v~bH?95yx|)4)c5!KOZGLuUd1iWk5rdhY zS|A_l!PaX9LCO1{{{WaT81Uiko~M%iU!q}IAZBk;uI_^eFBrGE8%-gHz070USB13h zYpqGEolCIWLO>z=Vb#vi^x(Yo`negxy)BI!-wV3}g4b`m+!qgL)dAeS>n3ruT5O+* zafnuM&0NbjMrWU3z;5+L+ndjF6cH}DgH+(bA!GY_el#%sH0#3S6SQcxrE0SyJktBv zafT9|l$7k(AZ5uZ0({{E(`*`|l0C^S?7msGO!dlU#`>05n0aM7>^t)2wy3GSiMgB2 z{X_5q`&TLfN*DhaCT@P^&*ZBhdEehwmqw-(9Pij$Q^tl5BU)DGgZ_$;!VuY#9s6t@ z;TJZQVYdb2_%AVOCnY%io9uOlvkWw(BkE4zuXfF zUX!F4sWGZOj5o&^8&8GWAnB0f1ixdmgRz5hX--6t{0ej;mX zPsyN#@d&?wL|*w7?vVO&pgJ08f9f9|KxhkT8I%vp9$89lu~P4d^ony?*DQV;%DTi8 z1XzXocO(5Pv(HeOLm!RNBMQ1-pDCTsTl+ADnL1eiOEf8{+>pG!URlMp zxE5N!$k_FQM>-CtdfO3+iyKZ&bTs%Zn z3{x2R?$!Ca*|Polx8-5vg?%IrFCbxg)$jDM+bt&`ba5b*^G|Hl>o0jW&VTI=5L*fF z?V8(x*+6WS?EYG9_`txyBfQF2Eba z@iBV&iFSaHqWoX}7~3gae`-H2SCRP9ALjf~l@&7FUhGDAhL)seWTdm9rXf##oS)qi zZd8t$x>!(8-vct_(CE6!uSzO}IHRP?*IGj9#%cULE3r6nYAKLH`K;&o@Hoe>Dl zZn!n0d&Nj^RA&vzglYQGs2Uw8ePB4!JG105qQpqa^=sF6 zq4p}LE4#PqsArt5)UH78mDALa3?YGMQeWy`7qQlt?H;L&^VF|q?dE8`QvC!-b8(}8 z%&76rD~aNoEbZMsaf?#;gvH7A3%aHKv06ja z2=KBb-zOo$hx%2et3bN7Y18lDrH&j7DOhMJuDzswNli{TI3UO;^LEr()?1)S*ie9? z=z~@A5~p0vU$*-9U9g@$pym&0eEEdUVeMZV=5x~rFOAHlGS>>6^Y4a~kMMkaeSP)_ zt(=uh1IG*t#>ZakFbZm0Z&j*tJcRa$9MUia%?8INaPq1DY#(s1%A!xK3BbIHMa*Ry@xaKrKtb8`!b zRv3@2?j>T8h4MP)!%q`f-`#ufGC2>Ed(v#BENLZA3K}JkJqIsyxZ%qks1jk*< z0e}Vl4T5oXD4%F=!K{@AKi#3dfiIy?=)T*=Ynx|V;qvROg;VXbV2SYK01N7eMY?nA zHOu0SYYchL?=Dhl4$)IwpC)$?tFIjt_x46VysQ&2ydm#m^OE1z^wy7Be2DP(h0j#l zWZZAuck*2GkMn5NAw4YrQYTwJ3VISb{!qClV<;&ZodS_u4D%c2;|+^C6zBy6{n^ZEVnBkALmP<~_8AU(g9CCz6hfhx@9C3? zna7)CGj}#E9k1^{P6KKN(+gKlD$NHVmXIppbcWsFX9iX%^e%_vkj{ot^&2548ceKj>6l|2_r%NP=U6r$YL!-7+ea$I9$&=N~ zcy~jkIB9d=5*)VW2{Vqhtvb;ZzO2^Y(Ib8Q-_uit&PBQVXvR>u+=@#TbRdZNKAGdd zYHN3b>+zmZIN_aue+X?&LKWI=MmB>&&pe@h@1!6t50MTwbt@0`Kl|IChIP#`B{T^V z682K##6C(AWOAic0o7S!P3mySlUVC*>{`wa zLS}SEh~WaEZ}j2~vO-G&!yt9*TRjIB*K_h1q81&PdtOp7DpN>Ty`-i9io&j@pW4NR zJ#@c_)%U?)2^USQZ!7+M$5O8&fTv|kW6*=4lf%cnt9j2v9)}=yTb$HLq`#kZb0Sd)dHjkR zm=O-F^g&l0enq}fCDXyGt33qLpb+`PYheltv`!}3+r$ROs;vL`c{)G;ZUr*4%;!L! zWNiL)AA$xaVYe_t)2pvG^)+5zS&XuuD0$-}USW2;Bmd|_eOVEtynN37-m?j9F^kuV z4ipI&=-DWwsmNDc;-^5F>L9ZGhqUqM+CX|#eOhH{)p~VP{WshSWt7dcEMPdfgjxPz zJfQ18OQdg5Hy6yXf4%R)okqFO(^k6;>Bu)6Q0!Wto7`NaOFPWJ@Oju=qkb51660TY zw6kZ08rwrxoJvkIPP`jOG-+o$nSbln13f8F z=^z*%BAPdb&C^Y5K6CEBBCY4~X~$5r8|VFS3_%?xVk=sj!Cbzygz>2+nXw+U!g*%Y z^RuVD3N~6i?T4bT%faos7h+)n#z#r}$F;vp@sBf(>oXHg589quM`|@<537@H{FooQ zwZ1QJVk+Vwab68uVaj+I{(gHzZ8alB2oHdBr}swpWqtdzSm^WX7_%1f)wQqFs{{ra zsw8xuW(pWv&-B9^h4UYtvR$=bQd^^q5P|2Ws-$z9o$fzaFcQM<1A>Bx@S$V#H!912 zw)R<9LeVN~`$g4NEzPgHkoR*TQsp9ovwJ{mK`@O;Q^@XyWhfu+_@nUTpx zD$XL8R74lG4OP~gW>SY<^jxK`C)~OqJaMs9@$-0MOo|&9$Ab@*9h5Xf6yQ8cVRCpz zrhe^5=ls!jlc_X4w(12ze`NmIm%Ki@VG4}$>`w`l0jMiwk_k~WjTF}8bZT>(HTIvN zkACF%hrI6CTl8=Xi93o_9q@Q>V)v+{E^;_ZuwZZ`@-KI&1QfZT0t*Qk14=dS&2Jr- zBK5AA+*53}Ik?}oIfFf0beu_@RZuyw3G*Zrt2&m0TeIE#Zh3xM&jPwWtCjrXyR_ls z2aK-rCQa^^>D_K@&2hp-Rjs4c4o7-*Bd^FG#wK4pfKR^PW6;7hLA8lD^#vRhMcLZK zS5-cf-p6vpyroQ_kUziHfSyXDOZ|*azOaNbs+!j{?PopWbo%1^JIjz zFD!;BKn3+PV(u#(qGE(E+d1r%q`DBV0-+5S7hSa(JC&lauoa_G;IViCl^42F);T4l zQ!lTVO(Q1V%vboDjf@7gq2Q;!M&7`U4^5_fK$m+@5dd zRz%y_r>APo6Zr)dOQ#AeG94q;1QX5=N~SHtqe0^}=-(S&>BuvV>H!^8J|@c7def@e zMna_i{r5T6EblC4r7L=6dlu%Y7?4u1-`Qb6=_Y$UdTOMdpMBPoO9aVTes_QdggU7= zBe7|IN-lJR%JYa{5fPY}%rbq)!q5u|7Vpz;*%$+&r3E=s9}^s&?t;QjmvHQJ^2!4i`YV zcs_Xcbtw(v=^+cMPvu~9W(L$cZ5xhi`xIcjo!Hh2u{U_g9x*Af-`ZhgBQA;I+mEC_ z%>d3ds3eGNTgvy>p=vT!X1^Y~Ym;xXVM&tofjWl8kkX5`~$z4sHb*rmz}x z{sQkc>5yngH!R>+uGO~$Z@8>RNr=*kc1Uw`)uV z$BK_b>Kb>()~S)!Ev+r?!x0RY>Y_<5{{0T9jPFPrbj9E!8NCy^RLPMn3{5jl@YC9+ z6C$XkqoHLMfpsWI4QP>eliUOULA!PrmXMdgc=kpRcNgz6Dlrwenc`UBAL6S&t2?&i-MLh ztxn<|#>2&nr$J{2XS})+u{4)71^-M zLs~5FJ6}>Uo|{ky4L?l@d+_ffcT%te5}I4M6?P*J$48+W5l7x?$wieLWLK#3C}y!g z10GT%sH|Kb&f9p(xtO^BCdJ7ws(S3-bPiqkHM3QqhTZVstMY!)8qNm@>6|q4) z>@;eAc+^#d9@F69p^6BGTySqA4>XZF6}&ct%0!zlEr^?6&uK?UgN$-i-2|h1iWxH~ zyz3VDKT`J7yu3(3OT|r|&xpj941yKDaTY(5CY!eO3c_On_z;MB;hj+@O6y5iZTe0T z2F05^wErnX+R~F#?TjToa+%jE4|elOj*e2x?SAmbH%5=w5K>ZbuY)~n`)I+bT%Z!B zY2#gf(A&(cCx(jSaw5&zIEI|w3wP_cmYSeU)&k+!@n8+?Xz|9O`&Y0XwuGmd@$_o7 zdvBx@$l_sJbzgw(SyUCutwprujR!>I(>u3TqXQ4${Ps^}y{le1{ z2D3eVT~h~4E~0h0`uOwZ7jcplk~5Ta&eG&c^ArdB4&aZj^rlIeb%`LHx_e(zShVsE z3Vy5eVH=+suRzTO>uqi%Gb=SYCN+C7TC+j> *)+S93elTMQ>1gpx9PjapS@i9+ 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

    ;Oi>yz7eG$s>%wJTaDlHv$ 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

    oNGmPqJ1gAn=8q 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 z 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%0DgExaU&Wpeno@(em7^K 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

    #QsFPekK^T;8E*UX9_XlBk3|5!~yP%e8DB7GD)d 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

    }nsNzOSmHY(5|#Q!S2qUf_c3cxovk(N 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

    yo8L_N4t{_H1R2b&m~%+vq+R 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

    78kvr%hYupc&N8O`HNuQ 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

    c$oY987&&2BG;>pSlI!tibxpC3C#$um#b4*hq zU$&l4>%(L#`GEEK4~H6(S4EZbB+NG{1PfSzeac_7 zVNho~MmE7~JKBF0i0C3kq@bOI^`}Lh1{*I1sMtE`_TNK&(dXZ7TC*|kfhBdMOgmyO zdXn&O+|Nc)qvr<}b`>rwg-U--D0`fSwCfo4*(yP3n@`yLDwowev&WHB%|; zYxEZ7Qo6S^Af(LX4%a}lS0h#EuJCq{01jo8PyPc75P&_9RL#6I;AC;5C9u*J5%FDiXB;;qwX(`%LreV|kjeoKFzC_Z3&4VIQqjzBKLWhxd;d60f z3hkf>Ie990P0VzOw#IwsujYe4{ubaEGxo`$DOmm5q>)#Xpi_2(51(XUivNjJITycJ z!OtiCWp~^PLf6K>r?3^Isgjg9X^>nW`^W@(^KeFh>;%Nkz5(k0hfw!@RqF_9(X`a` zeBpLz;4a$e1esf;I@Q#1no$(wcvA1k@JeKsQs%8X+yCov83IxTT)7_jBM~zZs9zQo z^^lr)){s3?Hs$>cADbk(gYRINZy@@w%}ctpQ|>@cw-mTi8m*pe&%WUK*YNa=xqxQQ zzTj3LnV$5e9qngqU%%?o%yi8C4b3(zZ)cEJ+3aom{O zrY+ag;`?;#+AF8!zuhCmGMI_-&c%Cvh+LCVa&Bz;Ls)XrV|i%EW|)4xbW(>Bs&TbIZ}N|}%q=nQ z1Qa9nV1YKg{-K1|a8JH!i#@{Y$`yCl1P?HBz^xhEp1pG7e%m2}D0=c&XYxs08A;?9 zSM({9VeAlyk11l^2`qY+i27XXQ&S~2>Ciic{(hweG4+(OydkP|*tW0mS49~^M{b23 zdki1h1*o8dOO=wu7l1G+GO{af+NkiA1zVmK3Rydyt6XkO$JY1t^M*$2|+mN%ix;d z6X&f-{zcp1ex}7;n7$_Y+G8-Bl%hX!BS&Vu>bXsmaLlXi7DvKh=dWwF=d06&`LE@h zB0Xo9A6qs3O`w6^yVes)29Ft3@jfAJy`C+(m1$h@Q<=`o=?#xnwRru{z^eh8vPlo! zMoHPnvJj+fzP>6FFF|ZE8!>bp4}rCUGe%uH?d|-tl07+&inNJ6Ycg-8cbA42Y=O0T zAjJSYqo--lYgM&)Hz3s!VEGk5i=?9>3+6MKZeD|Gw@z>FZIb0B*fIg@$zRE)u;`G3 zliu*YV`B6{bSDCpF&MXp`ut`c^WD{Lw<{s6+@N{HpzW#Om2KQY(#6@rS46m{W>T}4 z68E1V^`$(RJp4T3d9v53ja{g{-$3p3$%h+PA|oDeiW2EP z>Z|Qx2Y9Zn$ny(_8Aya(_NpR$4tDwCa}@I{1hlP7VUD*bGNo=V;;V6iE?6`6S=*DR zIzDnij#tt7A`gr1bXNZjk zjom*dBKNATp2c0KmNIl3FA~46@lEwtfH(U_!jl?ql=B$qqDGNZp|Po%B3lFx64m4|FRjp4F}Sa#{^0>P_)tmFWFHUJF#$eEoE zNin}+zU*B?>#%uzl7S~j&PPGS zSQa#b2dziv;?VIBTJ&$Ecie+Gl!T^&ww6qt1BWLrn^AbMz3n;Yg=^yvCQ(_qL#%PZ ztG%>WHYG_&m#g9=d7nHp@<(-!;rvI;QU{S#7_rGKe9SG$ha6nJ4Z{!pJA^ zZEz;GXkSh&@)F}S^Jb2P_$SoT>u{YLz z3!CC-&+p13cnEvZg#mYUVgOd_(&cHErDxXVzCAs>r7P~EwazVUX;uBL8&5AP_L5vn zgp&OEmj>kfn=1i2W<2d!KPXb|g%jEPYjhyee|5e22Qjd_;^W7g95RCGjoA*(Ki)(5 z#ZE_Tg0M;P`G4_8`G`GA=%MRbOT)@2gGZ2|9bD|Nf`|EbudKxO) z&maMb0IpT2zf`0s(si+}2eIQCszQML^k4fpP{i8gJ2V+} zqLce~REb;(@m@rfls-VchGs0ckBj**sNIWfcTc(pAS>N<5^v`*-z%SYl#5f~z z&?Wx$#fgR$Vz4aWW%!TfV@H_x1K73?_e-5qX-5rarU;s0OU^eRS9sY-*;GI2F#+c% z$;~CfAdIy}_2k&}t@0H5b?srlr*Rg316W)C>|p7w)>>f%!H4bO&D0@ z0m$mCRizo&W2Z`F!?G%JaEUAVS-7F;%h3V#Mpz_aT36|?tP~rSAD z;_pl}(f+t`O!8^;hMqa3+D?oyM)|~kKWXBi+v+71=;}iH^}w;Q8=xv$wuPf-T(6t% z(p+^GV=1_nRYXc+1iA`%Hp+wk&B#F+8YOFPmf00X{u^>^4S)|ucH;Zs9rb;JIqk_v ztSf25;T}`+4|m?56x~|!{|p3x@)w+%jZ#h7TPyk1Fy233?2`NTaaTn|kaJ+u*S$XC zg*v>Kc(!|l;^3|^nahbjKJBY&0K>%^+V-1zf+L_!gf}X_x&mcwG~5!hw`+o$ONLl| zJH?)uHN-x2yxCU?kHVBAhG*7ucf|yPzUEWHg_C=8XXmol{()_ltR{`?XiT z0?Rn>whG11HB?6lbPo@t7CXMM+fT<_x#~yroSW_+vuSimW;3{V@Asd@kRY~qh+$Xc zmow)dn|s5<&9PD3)h*efizmclFs@rHNX7r2S|hS~AN}28;h;qkxgCHIJIKthQQ2I1 zSw)+2Yc%%-QsEih23!%)z>53s?1n@arp{VaLswiA1Sp2&|MMgG@)gQ-e=+qCdm;4H^&pJ1CGNJ$R zL5_g|3!wF5D)EP5(nuB0mT$KOLsn<3U%XZPrARMAI1fLKJcvXCYw>pM{+~KKScGjP zmgdN3Dd%j!EutFgB?gHt8?9>Z7Y*88m#V|-e1_Yq3K=nseth8)+RHc83p&Qno zJDM^wSarMst(m!MK3wk3EPm&8oX&O9wC4Ye>pJu>t@}Yut0tEimb4K}Y=S5phScWC zL*y-Z7uVU3Xj-%hSuGu6-ZBXtD``s-F=s1jRFP-t>8Z~%3Nb1Ro77kqIsM!ZtZ2uj zjN-aHUvNXRz|-O%Sk;f6UokBsKCJr}gV~!KMNHJYK~?-VDx7!RP%~I>)3O1Ikg(P> zUwuXkS(UN+_n`Q^U_FP}MsoE#Z7 zXS854>btiedv&jYksgQ=SsWU6S13;757>zA(dId;+ziqD8$X{2ITfGge*v+eg1TR0 z2l6n;j?m9Ncnk#x#RQ?{Yu*;!ynHC(ey8=>}= zIv*FxT!C=Z7Z#l(GNGX=qo4+KW3cygWCO8PT0blYN+)iSO`%V9UHD zFYm#w-4GYy$!H9$d|lY2K5%71&QA zB6Rxjvxk>%zKLD>UqO0MZngVUQB~Rwk}Z(h6F$%wFBuipKfHDDYoRYYO4C>{_ZD?I z(902;zHvP7J>@07-3T62v=-{Pu4b&QX2%%^{#QbVz^{ADQIh4XjVy!fhbxYwKq`C- zr^m$6PjyFuKI|FT*Ji{};@wz%qVM{kr=wNo*@)z5nNf8$*qCJU#00G{H`IaFO>!Df zqJYYVTC~SU>H6bTYh-mr1{nr(WLekx0Y;8)I;y1F{pVaYLFGLys3MT?4C7&)Ht!9! zNL7=j>3_I2yP;L??sSDwlq;_hx|!b}Taiv3c_8Hb+R(%In>qt0qXg&+r5#A(|1l$E z5`d%g|Jpq)0u|y1R4L^8^4iK4a(`nTHMhRMwz9Xny9LZ7o8`Zk>us}Y?`Qr5B*|c( z>Dc+uw(g5m#)6O?0})PhHR|*?Ri#$v|LrNy6T48csET)%I%g18sF`hBEhheLgsqHR zp2SsIM@N6}+8W51imX^BJ>19?ay=Ed zO-Hpco!V3*(%X2youFJI_Q_6STb zPoAHRbwz9qu8cC=Z;WV>=WAn`q#6vrtGUn0AV&Mpq|uB6h(K-_z7I*xa+k#`oxiE{ zn`C@|9iwV9@LW4Iv>IC4Zm)ri)tMD zq>7NXKa3Z_q#TK2n$lD29EvXO19k;zUlYSm2+X2BcB%hOLG+w@Y z273PT6={b&$d?ktz66j;rRVDQZKH5079T3Vs<{H=m3 zHd*{~;y~V;JpesBTGseLnIt`!xaLmG`dl+3JW#oF&N-SfsA%H&Ff=KD2{Rsn`Aeo- zxzznDKcar8wedtZ#A^&2F>p4DjT-{{NNV<^Xormz5Zr>dEMdWEHN_ z?UJtsxc;cK!5^?81RoG3VWuFko3~anVXMe&s#;1rm6Q+eOo;jHa0q#dd0{VV^x1vJ zyl;NsF`o=5>;&1M{@7@Y*_VV-+=&{*b`^Mt0H=w+X~Y#NYMfB>AQXr*F`YJQhKTs% z$HPEdISe=M&hLpHcJt@*^Eob@hy%?#$WsFD($!C0`SFMIj@O-(q?;kL1A!=`M^E6{ zi{K&oueOh4w>%r`4120mm#m-54IQXR8wMh+pZP?DAd2|WUH01vne{%^H7a1CmtFbz zhT8$@0m0WoI9)>wt?L!JH^JgV*`L)+gUO(3@zLli6S7}KBni(&8O&-bqV;_{vBp&lhHC~krM6vXb zSUJ6{z@w{fnENqU<`cko|K;M-0(!NM1Y_3d7ZhW zh_j4QF+Ga7A>G=Qysz4{uKLLpe=_YIi5sa=c>35?KQ7HSV?o)i%YH^ z6Cycx-rqzWsF8JS&vlKO%FJ&(bZpcw$nEE{c-+mfJ6M2wq;C-_W0}vh+P->&gHA1m z6VOF{BL|U7bO7j8GQ5bBcp7;>ka*`0FQ6Hk^qVJVMisr!sGK;P$F={-PUk%PeLN8%T-1E5{z!cjL4xDzh^^u=956S zNKx)YsPP3>-YSnqLNe&cO|kl6fhBIVO-oE^yzRKx&?XbqIsVp#L5wT1s%gZZGJldv^(Eidsd|fCD6#3q1YHjLc zH__Qznca?>D*jU~IqmPPvh<-1qFmK}I$`)t;T?5VTuMp8A^ z7YgOA3sR3oR?SLqOv7M>O(;W5?pzFGMdFp0>p)ll5CzLC0dDe_cb7L4cK(^p^dKbI zDSKGVo3HK7p$5_t+ZQB3n zICkmvnFK@IX{q1HLq%KJ%y#7iLnc;Mb8oTPi+LP&qIYt;OGe{PrQPIQ3FOMUnu=LL z4F5&kAfNsp7oQA6GIouXB!_nb9`o!~-(`bCawgCD`AqjLDG&5Xeq2<9JfeRdLwc3! zE+@4rSqH_xO$kDJPI6CE^!jk+KiI&wF)nh@%ItUk)_~f;A2m#D$MyE~i9Iu?r)`oNj+=#dxrTU+*95ASvrg5Gk`92m9c1Fg)6ZDk*-`I{wX zJM1DrEm;i~0-eXK(Te>V93=-ytSpog#6@m247%orkMK`SF#C$w8nRe(@-zJ~)Kwcv zaht8v_o7~4x?P+35Zy-!(xkjf9RqR#pdaUq%AI(#2>uqLaUj;^6F}XMZew0G+t=*Q zm$TUeOdozRHt1C{*f`U^<4^Wm08(dwBPi!H;sDo${_p_&Zr=*LpQ4~RHGFzp)_$9@ z>`L~w#6A%n&?OZ%LL+rEqi1syC)R~FSnb_)&vx=3xeVZ$6$uq|TFRfUOSfLXSTYtY z7UyX}kbf91-~0(X$i@d=A_&onUTMtuLBoN1lE)jVU*aO3-GI~GwR*Enm`vgV)86N{ zTq&U4q3AY2e7f&7pdT#UH?Ga;>!7umm9>5yO`{D-=SsjrVArxl-v0Tl1M}KSNW|0Vw@x3#4JE?P zlKZLF`=>`!k>B9$Q;WCU-^V)^OO-DsH#|9)>mM)mx{V9doFYqGqIo}EaPv(Ki4^%& z&ao%|s1hZZB==hBXZpfHiKf^2y7r4*VCA5}R+i(`t+d;@5e1~&Rn)smm9H5m6!=&@ z^){9nVuAi?DT$}-l7l ztm|_$3y;!SOvL_-fkna`=W2k7n@VV5i!}RvyCVmv{{9C`UA^X{_0v(Q4xN2)6f63nvG7w~`JQ@LU3TYha^V6>RqbqRWnP1bk z8tj(W66ntlDU5?Z5;0A(qGnh`LZ63UM0!GQh@@1ce`s_;I_d8P$hU+t*+$u@t?1OB@_+gSC>Iv-GBeNSAH>;O zRS%`08HTR7)afZL6-)BY9o7D^4Cwdc(~5+vnW}_OqkD2x7V2IoQEeL4!Mx_1Y(hNw ze&0wNNy`tdhP9y9S;QY+gCTE@8rHllIw5$>vd6t@I3C04>Dqf{`|lHDb%}(-sSO@+ zJGSO#>$kC&Bv14hW8RZ2cTnHt1ZI`wJ|nbGa%BVRUeKcnxHi6J`u&fEnz&0UAfZm% z2hyCyDfv?8x`H;pOd<2XIs)7$n>Yp;V&MGPwxNtb(|+XFtH|Uh!`NMwmy3R4jO=1s{2x|T{sV=|Mm1^{l0p>3JlKOCcPkP! z@zW*5)Q@b-W0+v$_OqEwo4}t~Cv;uny5;659NF}Mfw2{f_}e87E0NUAqGknRetJ0n z-j2ZsG=ER$KZ|M{Y!vhJ&X7e=Y^3MgR)0LaUA&vmF{n);j(--g?UX5ymjCz0rz>DQ zRG?YME2I(EGQ|`l6Y~xUn>82zl=$bMf_h%6QpOGOfY#pP6QvyoddD?}iEiTxO@UO$ zOF8ELn6(l)LA!=mN7+7AXx+0DH{3~0a{pTkzrP0d($zi)q@39|`V4G=?p%BO zDVFL#l8Cm~>F?av##@2TWm!v&H=;x8@Q~3Q3o+J~53-M0Z46vpY#L=olIimvvz+7Q zQn{UBiYI(|7~C@Mg=lf^gj-am(*coKTnJO(Zn?+^xccbJ;M_{p?yFeL}1_06#Y@?%<-l)BcJ$fFg0p41LF)Sku+t>EF?tc@cz; zxznv9OH9Hxa0bw2Y*=E%kX+NGtEWa8O`<#j*t(pv{$xR8Q)J{=@`u<&>2Obi_t6~Y zUIcb|df->Ww{Oi{)qR(>wx^H}KXG+;f6Q79I2wq7&!Kq%jiU{&>WBd-ksw@%Z#CvW zU==nlc6-44T2%mI!9w=-Q~vp@W*Jj910B6Rf+`6;@^1!N=XvnWLnybNor`4X~_(vxF8Y-AozA_Fc1 z+X9d03zIhjPmf0Y%JLj(!m}^=WX7W0mQt&OO`bWYe5TGoyE1SQ7BCW!f|C3gZOMB- zns5Cg_ULl?Is8n&f)RAiE=@|J(6POqTzdBfZ~7TypmQI^4V?B14Ta}U)|K#DvW~Up zBqm8vmotLoDM%`o*4GI{S-|`MZ6APKq<>d+Fi;hN?mVTk40L^EZFg^HZTom<5BRe; zzl+*y|L5EsSL`P0Vft3oNFq=$c~hf@@-z1N7Nqo3e?2%dWg!S+X8uWZiE* zOk{hegZ}Q}pv(vN+$+lMOfax$2x1<&=yUvr^aoravnGO=z{ITiq=WZ{vg4DiU+zW8Cp`Qbx`bQzA=SAZ zInfXFNQ=oyAJDIYKGBiIsDgNb#{LEnFKmcwQD7M!Z)M*H0PKx$vxc1gAXAjt$<(L9 zjllOYZ5_=qjGk^EmnXzS{^PMl%f=Jt`=x)a4n%%VLc$FM3pv!ic3%o$iJ>Q>w$UqJ zBVx}l8{W8TxOv-#_dm#+LC?u3Z_j^!pk$g~K3p$mE4{lban$Ei ziZ%ZD=^8+f!}g#*u`aarzLh9tg)WKcVtVEfSj^qiOO74UY58OTB*3#Asr z4s%(y&36S^?s13~L84r~=6>j+fbuN$#gA^BPm+<^b#36Db5DNz1$9Hz$$!FcJ<51? zXO-(@(_*haLc-W-M7KLAPtp407A6$uypP4|M~Co*qVvQCM-*+(J;1v4g|p&LS@HO` zRrZM^w8!1y=iUj6t%NKoqclT(jWov2eU0z89+`PPOxuZ?f|fBE?cxt)Utv%ETBS-# zilfO3NN;R%If2F~|FseDDhc0+_E$mJvc;6wL19KwttRP{QC0558TZ@v({t+fbIOEj zjzcvq$5+&4oR|Me8sBlyUe3fRnq2!+pIH@91?&7JJ~;h-@8fGlTNmMk=>3go?CB&% zrUqdX@L`{=ihyMCX;GgMSuIJx*V)3`Sgfq3JtT@Idt82R3fX>fiF}@#Dw3-GNNYF| zOE(>t>s);ih1`d0WGs2Hfvg&68(Y@_XDRC%dG%&q=lDzAv#R^+vfpv0x4@c*yo|FF;h%Zp11W|C>N&GX%*TbHSs6eX!Q9yad-FubjF_i&d;FpCC=(I9Q2eX?<*@ft(%Q!pTEJ=A@P?0 z^4{_DlgT(U0kKII>Jn$Cwa#znRGVuK$V(L z|L^Qg@PAUMDFdUnNwDLP%s$UGh!aD_jBi`vMfx>)6xt#|ISN(M%h>x| zxC0?>Yvgs9uo6Na)nxFTi+#GJu$zo*sj~^eFBmB61#oU3&g!mw;Tky8XWXxbHEkde zyS2q6;TPuf-*`uV=_H@7Ja_1)=_7F>Ri(56bSC<=dNvuSN9psy%LR+ts52WU$d?+^ zz5K$#&-Y(>&S68Fx*k%?Wb>1&F{}I+V4+%kNej32t_9$e%SxIfnCrsUFj2{(*|J(D z+E3g?aU<^DKCaEU*ZQ3@PliL!E3vZ-oF(2#Vc+J5cAj#6GmTaulHcq!t{WcVsVtbH z%@1sde2DKp?QE})&L{_6wzg+1!1djXS@IYw4F$87`g_(dGGO2alr8SuG&~PtN>jXN z8f#dlu_oRqtFxzx_|myA+tekm{Z4SL_e&@yC+V1Ab>@0K~be zFWnU=T0L5mlT80;7@*f`PHdhzj*B%0(;H;a9JX=*X=h3@yrFM(jGB)D`UNn6gTx3v zIn_Nwy1P>WS%K{GRT(xrOZdv77fg> zP}?>n^kU`916zUI((h(>pCu4Uo{Jvsd`4vt;c=er3X46gMZ;S!>YEXG^Yw)UM61ac zcEXG3KT<3)Bg3cp@YBC&6l*h<7^k$+mP(v4qYCPcZR)vTd%HQ`mLZC$E;A>R$+;rStcGqXnKfd}Ijm^a3m9;(Hv$XeY7RNlB_}Z&Pow z$B!b&ym^RD`AIfI+U*lQWk}fIsUqR{d_l>2o94^6v*z6_Wb#AH{8T|~828)-o&qEs zS;Y|IC|)e)i^H?oAS$%GW1rwQe+-EkB1POqZkx>B? z0K%g#Y+_NYrO&c#>H*_+ZoOB&w4yioSzFmtvL##g^3;YnPSl@I%f7wBo#*PgJ zdVq=Ozeju>iJ5`fXHI?bm~3N)cjnini11v#Ny=@TTg)ta+^W(2=EaN0Lx(HXWLDQV zTeCAT#tY|KqDxlj?uWbAUb!mxiaV-!cNUstUbYh0cdajJ=HObD8&V=C8Qc+rRp8|cNxNg+vDh^8aek;uLDEJ z+tmB&h;or=pRk*wgCPdP>!X;e%@0`aq#(+x1tdU0%}ABN?_+mD zmF{G_6&PAH@@VHb^He%3&r|j_od3Jcs0I z9f-Ga<;A1c1`K4r>?GE4Z|Hy9gM38P;3eD8SVc29W-W5F&_L%P>*@RS9&nSM&3Tf@ z&cN3WRjX*M!%0*72N3fl8q21DN-?CIPvl>`qc&7nK_B7ng1_d6ga+G_(`{cokJxUi z@<_iAkWyaKjRBp5$fn|U@PTFxEbkunLFc185fhe#&tHGQq!oH*^CrA?3g7prxy|CupwufeRS6K=KR6<&vE~+WDAWlR zH0q_Utg&XmK3bDUbh)3~%Kd-_00vuI##0FB3wl*H{#X3^M$J_JkZllX{|+qd{ybwk z?7$f9p{-Ho&O$nRHSo|S&%wcdOgP&w7ulzvni>h zW(`Fecf=zpF+;48sDSbpyC<*O1XEkM1dkUaPfTzy3%%mOq@-@w#c=eG3wcEw&^68iqaYWa;}+?ffVa zvcU#q_iH_MQj!=|N`S8k=s5<>k0})8NS)Ze>46nB}8K>#t!j`)2 zi9V^Cg;v@lAd}_4uXTCDgQGoUn8`Y+`2gG6AaibC}y)&86%9*DT`gUq?IP=-cMsIJ z?-)x09{pA=V;>oi;U?p?fEy#ApQmgGWE{3}=fhZDn?57|H&fcH7v@ei&2S+xO@vXe z|Ly}JYBy8H@-O!R9>af+?>P4t$KyJrU|+jz0^JI$;nA?6wB_5SWa#;c1~F>%=oD&Z zX6A$QJ3Eez_I4D%uEEx75efEHBg$`Yjy}s2tJ4w7SN=owaWps?<;@L$@H7}=Ynh8w z&ZTM$tr@YMoPMTVW1nA&%&+~lUuPjSK-o=wQiHgWitnD3*}PaEEcJo3l^Qn`!$`hF z-Xw{C@FDWpSe=KfqP{Io-9qbHNKuULT&3P#uw>|{?z-@LJ+bdMG>wiEVB!FMpfqk& zOVhk|f4=2p_Cdr%J0w_nM~S<-HMv$xu9`BG+bwg|%7&mqQ>kq*CxSn|aMtE^o8WC9>@E1w!L!|Cm2E+4*4qX1k z4~dHMs3@^wf-m5B7dJ7UuN#3Mu%RB0ujdVh*%B%~x?oWU55ik;wVB|zgO}q^Gw|Op zSwIo7v`W>v_z7hOJZ4k!=cb7s`Idm8D!cZ_*81W1Kg$xePM}EbS33j)!WqdW53)gt zNfuheuYHvOgGD~oi@iaz9P@9%CbFrSxwjGRG}u?Q$o5{rZ5|SD?NBWorXyVxlTDSn ze1%2{aB6~`v-7?-viL^6%JYxM0bIR)t)pqV&w54*WuaE`oOY{wDDQ(l$x|R6w9r1j zHseZC%gb4vrAwSNET?fZBJ3OybukFls?(njMtt55FE2i8*Gt5aUab6_LPp#p?-3RhLie#Bpto~3rZjX zP{RI`ec|<8)X~y5a%FAl@A}f}+ScLnel)N_4(arsclE(H{o3j8&aJOTDsz2ksetIY zaXE%9-Ns!EhDZG(t$0H7k+(P+pkD(&%JSwMTx3JYxP|3rPDI&NLeaiULl?K%1sKMy z;M+NP-j=Xw=AAFeJTcR^xp^)ugs|;N)NCPEHR97x!Y9Ji<{$5$%UQd-lGQ16|HkIs zA8F(%8&;Qt3$UV9~qr;)Sl%ag&A9UVaTCx3; zu7C=DHOVc`?k)Q?Ts5d0*(0q?4Q`>TCt+9sLLc&x5n-5)-TfgSD^|q*XxD2cesp_oDAE7-lG&A^t@5%kQ7@1i;;oGY+$>=ukylu(Wz~&b znf(aOF=h?AX$cI+)3j&tIuj@u*<1hvC{&ZHzARwKor(`~ML2CH_!<|Mz28Dk`NymMm>Z zgzPEFUY3-7N%lQsH{L~ALWr@%r0lXU!;C@MvyAKv#x^F#82cEr{l@$K{XBku!hPM> zz4!S%=RD6LHTxjWA*@$NRr##emqh0>6$kh;efaE_>T@C3ARAQ;!o|rKM;PMZ#odHm zojm+f>m4uO7=3X{%%#!0<+rS>c8-J~^gKuiO_k0aWsTtWcX?2lvU2r%klP=nf*&67 zqxp~WgVOji8Wbosk)gAhd-VJYjjJXXQrNG5WjO3J7EHG2^g3wxTPY{mEAmXzYZvY^ zY5<;3VKy4$Qq{4>aJTv2Z#d4lzWZtA10(y5v9nQ*+p~Cl=vi;n2&&JjIJ${;VPEV! zfKLA7NSW^rlUAeba?4`0>{BDryiWfu448-pU6#SC^(jW0cl{n#Zzewn=%+Ba!Y`+oI5e>2|Sow=@xZarIQ$~kYncI_pSFnO=I*qTWs z_*{`={D%ks4wpq4jv`=}49A9Y65Mhvn-0*ZtOmZ0iH|dXq>}SI1Ku8PuJFbJKT_S{ zO|!Cwg!Q@SCuZTKKZ;-%z3lT5-&0BAejpQOpy&GHXdOr;8EMys-&|5ntmjIPp+EOK zR}lM(*5LP&Wmh~AIg;=pDD1sVU}OX4NRJ7qop~~)U~PD%;m<1{0U*O2k?qi`Y>VnqU1+M$C!yY#CJ#HNy?#B&iZ~I>&~~!b>D>U=K_M=48>14CKfqdigq}DP#pI$e@jn4zu%Ge zgX8r5&-m9vVulLS$}Oa|jqz7lncHf@@~&nQ zu-xtj{`nVY)REepo=kxi4F%hx0l2#Z^7w*YR%fHs<8Sb`*(rdWzv*k1zMwWFcQ$(Y z+wHxh$g*6qW!UIs?^QNmoq6Ki46C|-+U=g`9VR1rA$j(|95K7u)Wl~WOg(0%*rI%R z1&-ap82S~IT@1q9s%~pWS^USN*je4>?ed%(2kE7zZ{p4yO}g7Zjgff5?nrXD#CrT( z+EZ6Y7eb`&z9pr>X$(|B!Dzo3N^&|ihv_;~A+M4Qj*9Bmv`aM)|0aHUq~xA~E>P%#Z!TphW_G&C z;$G`HT5|K)IfJhoQ7lpK8INQI&Sj^x$dxo@dF$Laqbrk;!TDd=71S}Hi@?^=wD#Wz zLXDg%yX?^mY*xauCp-SN>jQMu>mWbuLyF#zhvIL)*{V%>oF~>NuZ-+|P_^mZ;_tfg z)1x??CkyKx*5zQ7rChW z(iP2Om^Jk5KUd$m1a<74I5ko#yNZ?TxbZZGVU>ECrIkUfLQX-0ZFBdX+zlIVy*etO z?xg=13wZ^T%C3^zoIE#1X*c>XAH(xY^IR;2F~9onFRE}?J<&?{GP| zc@H--@ooOc^ofHj1J!#-*nQ3yZyX}SF*7JS><5p}p7VMTx_-3F4jUH%-8X5mmXi^5 z&<>oe@~aA7zp0KcMZAH&DyktT{~Rr!1JbH8|%+VIcOTK6&*R> zOzaWsX)ZRYFd5XbDVC&OfQbY-GNN;hdf{iaLm9} z>`s0%HO$@j8)^I})z8t`@_?Y_)3EQ}HYmZPWaHi5I2**zDRS2HpWS04&11yq`%D7= zK}V;bGs5)f8Xcd`|4Zl}()Km3f6h~JJold- z(k<>xpl^ZAs*;B$pM65n z4#!rvhc{bg@=^&TZjsir8apua;N>(Sn9RHK(R&aYc%LL-ud^g&6s7VxnRC-}?&Ur>3A z&A=c;F}AQ%=quX~|14(uh&4@pa&6bP&gLd&elRynU5_QIhk*NJMz9q%+=CJGW4=bM z@Y$<4o-^in{McL3{p=*GB!KmlFd&|>fq__KL--Ys;i{aE=YmW?lq<9G+E8z=CC*~S zsEUwAP4jyUpQ{f-?Efkolwcxz_SiuEoLj$NYopw*R{VfIXU;Mi_xvCTQtSe2&{khM z{W^q`)Pg>~e66u7)W0#Wm2T%$bdz4PqCBdqN(Pi!P@o;?F8%4YNiE`hz)@%}7)`Y*LDq*anP`x-LbrE_1g!zY zuXHpn==VMRtH`mt3a{r{1Rr@0L{3He8u?5LxE}0abIJ|^NUPr{?d%USgi#j^&PPfd zaM2pQ$cn~&cpsh;6I~LwW{Mc$p4rT!z8mCmdl#2zgRoWH%g|d7QdZK#N9KLYv=Ls8 zCoXlG0F-!60oWN6l0Afai{|Ilz!hx4Ilm&K^#gRw{UuwK2BT6z-*p*d>y0GBL-FW4 zmtxIQPyNTZ0IHF77JnwMPvC*l5YgP&TF~4C4%zY76ZyD%ZGO22eT1+eE;(flwrq}V z)`o5LbYQWRcRL63hn^5p=(bO#(C9@e4fRaxZI;6TS>raqoc%-j0Y!D>crGa*6YP;0 zhU;EdUELn_c8z@b>#==k`XS8W@EL{B=8c85Y+;rsk;&lo4DO1=SVi~+=9rr}`>oc{ zxHHR5dLy@idtatdo@CX#$m>o^m5(h$(>-jX|A@J;Ug2R(nbRaIpj9SUcd0LKCx?v* zWIgj|#4;1IZTDNGlbt3*Po?5?Z^Rx*`^s)uzA-^6op&&;6?MKqYcO-D7j^;4g1#Go(ra zJ(PF2BFZz?QDsA1NIsY_58~~_5agQuVcoAbS1g;Y+W?g8j_9)$27bGekb(OOgZpSw zpkXaF`y!hw`&VZ@yT-5zO68fpw4Jy4(BKmv9(|Kv_RvTzaW#$grH{F>{XEZhm({hM zf#Vutjemak&OK6k&3_?FxfBJGA;mk?jFoy}GJRV~JoZ6j1e0r1=iE{s-(ge%(Z^N5 zLXbOcE64S0cPupfeidRoIWtstcuV%Sy!@@8dT4GnTQ4|3nT8ObkPZiW%7XmDQ#7 z4cy-a^z`EL(ky2A@8T+>0>lM5mpP2v>2SSbIop?Zv~Q89bDF!~!vgB=n{Aw2op)j> zaetqq|Fjn8gU<6ys|+OVc;}BSTtat2&Xb+4pGVBWpGT%UG;|jJ=1k&sB^BJ%=Yeq2 z4PsE1tr+EWxo)JH-Q>K&J7f=UjmvvC-4!9P862j#=)D)p+UKt{bpUGX4uMTjZI1>f zsMwIrnaRQ@5x-eZKK-qHL(ZqBQ@a!6AF%_DCf!A-M_-=`^bBj~$ve0&s*Cb-UH@}E z`UO2)VwvJLTW3%f{OsslTVkf(?*prU9GLFPN3q-iTyAB=@IV}2tXq#S*Vv5ri3TuG zLk(?Mm+h^&&lR@D8d*P7@^wnfN8*e|YDd?& zOOl6yq_(q@1(WvXdx3a$3EmxlajBU6UJmGz&Rx0A+czaWiqk&pfFk+BWiIkWo%+fE z@x6MgL{%JZ!I*$EGuk&^?-Z=<2-bbBEJl6PS$M-f^=$IqTd&$UR$bLo|N0ODW;I5I z1e}9zir%fU+sdbVt3AuK1`KK%AgYsFk9;wG#IkKF znP?lqkBE<=rNey7t>{$Q>1kn4Yi$}?tkI{rDWZVV7k~H?&9z=DwCO>K4R40TUxSIq z^x=%%K)!3lI*L9Bq)tT}Su@=%OFsul`JH-3KlSmW8O!%M%j~Kz*nLy-*H0Fm#TBaU z4A$4cnjXI!;O6+mP-e|b;!(-&L2^}K%%qxjO47&Pv~FCLsGwif-(oXx(}&k@nfZdx zP_aEZV1W5OPEi(-eTRQFD**d-m$Oud!-I$7;*i(IwIcd zqXAb)zu4b)ormi(`u^8D1=2vfUcY%Q zM0iXtadkxlBjze*qGJ{ke&*t{n4QHWjZ> z75(G&9BA_|f2R9`Mm^1Ql?W}c4reFhUGSCnFF%t{JtpivQ}{q57tHP8MvDfMQ%9~f z=bh_sCicHHXdpr!flpKkQMI$oW%-j~`Gf4{EH1_Bsq%|K1G-9FCM-2NMEeOCd0 z^Jnnnm+W%Ae;%Z9zsSmRV5#uZe}>ToT_l|5<;j+K`V8QDnju=L=)vC69}L{zo~c#7 ztg~L=M!KxJ1T5_z1L`H6?U%Ee>`soj67`#ZN{h#Uk<548$p8*fli&9i^(}_J_)lnn zR9w9I5`N<5f{2vE8V+L*>F}dMzNR%h0{fr=HWY`);PR~Zj!0UVxe6)}^B(sa1wGv9 zQa&-TV)uQx{G%nQB^;CMO_-;gM;7B+YUI*|{A#w>)Tk9QN64Nt&eG{PPF^?>bwh1e(AW+2btW+XWPZxCJ63UTVR%bgxkDqLhq}I4 z>^qhygJW?HHYi1^fjqx6HS_dhoU&UsDC6Z@*O$e>Yad6o)9s0G76u++*sQk1NdNf_ z0fcw%sDXORx~ASe9;DBu*F$ksewNFSt5;5h!tN`eRWL%!AC|d0e)J$7Hm)`7s#8;@ zx-c$W*a5Hmw9I~&Y$C)d+pF>0RfCmnI~l#Wu2JhU?FYowV*2{J;jJqWyc5AY*{;2E zDqODFR>saQ%S$fuX*+QLC=7};?g)SI&sI89nJYw|;AG*Hoir|y?kZu|W*^;>XXf3k z_txBIsaN{w^4j;GD|Z(FqsJE!v}(l=UuZEYH7@$_wXyQ1UAlxsrRw>?`{G}&Gg+x# z8jjX0Fy-n0U$4gTf!H`(B!S*1=_pT&N!cM3N`Ri%bP<;tVR<}tiKg$ z{Q8dyScf|)?h#w8*L;N#1aN&O!yXYT+R^x}9QC8xaxw6v1XI*U07J+ig(74>ozR~2xhuI|;6=ZrF!rWz&dB@W zuVBPf#FPjB_j~rmAJ5zKsB(oWFnXGQJ8pn40x~e_6mrt)V#g?$-ZH#KSgYn!NFDqD z3Vhi8JCImdsHjmE>uw)0}=r`i8D= zWn_HdO~NO*CLwL_#=0u!u@KeymI2g25KGdDN$(R!UI=pUR*=LE`l;JdVvi$C*EGZR z%To7C3^niUXQ}V}adV_^X~6G5aXOCs|Jbs#eq|CkR>(2-?bo+%*oe=Xi_wZMj%4#h zWM-r<@b&toFVB_>)T^~^9*Cb{YX0X%B%=yE?nHY(&Jg?}N@HtSjP$#&*QX&(_Xw3o)L^%7dk4D~Ft$JAJsf8WtD&5xZ^o!6N=LT%KcaY)DxShVTF!Q&9 zWm38W6!AMa~p-6 zP4*l9k}JI4tQad-*s;Z08Rw1nd4F+}eACO--IdJ2$8@UfrbsEPQ~QViv7MAruW0+)fd;a0s zn{{2& zMgJ+~W(*e|ccPL=`GI0-iEqtezFSne2DAp9H&W=#4_g{}jNN{Z7`zNKE`KkjTfZ2( zxt`M>10pIqs1zi&7N~C5G=iq%hwsbsZxFA4A+x}7U~|`q&oUM|ANMx_cGOR_tQR!-iNVTLO6r#r6U>?!t z_e+h=A^`Fg$PIbSm|lvNKey}ff25b5-RX+`)to_JkKS*G&|PyR!EV+IG+U!@75}$? zqdT42vE`TjHdt?73MmQYPeTePM6crpZ^Tr@CoIyPVz1 zLj%*=oDtwPSeSB{P(VodN<5xX7pz``>iEXEPf4udH0<)ShzIAT^<+83Z%0j>tuXH% z$%4brh)8j+Fm37nGJYE15J(fS)B1oOO0n@c$5dytas zV5Q#o>vzkC1gpv9xgDYm(t2xa&j^mBBvY4nK1q?En`x9dwgSO=ED{VY4JKiunvUt8 zB}`5G+!)AX=CW5KFoMwfJl$K!0`gzuOBB$rnV+r4DF@XY9r9Ad_j{jx;;(1-jbdid z*U3m_>4)ZEE2~o0&n0OY`|xZY)8re06S1RGOg#a}n_~>qFVXZ*3ViJU-ZFq%vIZQH zf_$u0Hr=Q5LP@D1*}I4^n5TJOE% z2?csgyvP$^dF1?&ZJvgwM`x#*|Ff&apVd#t=Qp`@P4&VQKXZPazOTuDJ;{7n%&qLO zUG5*eR_ND@?@yi7lwgPv0?8JOJ<;ihP3Lc)+|VV{#xcBBKFviq=$EY{`I*HVn$C>-A8^#4hX6iG`Q5Cxzd{(=wfj3Z)qn*48 z+g*wM0uAs+5X)?nJi*#peibe3$r?EJid&rs{4}FJk5mD{)#&cjdpUgy&jbLAtv!+> zjfPLm3h$4wW)f{!0*w)0cJMs9gG~6YsjYQseta8I7Yb<8OVcF&9)_XZ0$&p`>Z|qqY)$ryGaF zsoYqr3Je|j9^O-cteYu&Y1Fm32<5P)P>Pbz`q#PJwQ|t6fH5Jyv@sF_!i@f*+V4*`R<=#1Ls_vm@#D=Zm~=&Vi3M5R`$r?GQ7) z*R4nX&nvZ}SXg*C|2Ozy`TsGIMFu7k;wOFU+{(fRerah1HMcguvbMT8zc#~wM8L^! zoo2@Ss>0f314ly08z__88G-szAD=mZcs-}rPdyD0iGI(ZrT?QdX{0cELWlcT4X+Rw zSan|fJ4qUoutIfkc7eW}hRpXF_g8t({>qwtM=4G`WcnXBQt^i*Ul|I%jPQyRV6g9_F2u^l4>0cvW+PLkJf{dlq2#bmz|ZGwR^p|M z8ur*c1dwy}D!jHXAWT-_eb~Ecod_z8+$c`5_@f-T%0iT(1-zzAZ+=v7C5@E;)rlnM zbk88i=@A8?L?Peq53&aF!_Cd==XB1X|0cWv&yk<|^-HV~caA)?DyNg&S}75ddK-Md zABx6lBo}DDd;8<*jiFt_Z$}mGwn$Ga-Kd>MEIcU=12x`aZaGiftw*1u0Jc7-v-a}Z z6OVq70(}P9$d_x*+Bm9kTnAiIVm>~%Se-#&z^l3C4A`q1C25Tq52q8#{Z4v*AIVpX zIh7_}Uf7T>cIPzb6ipX@kzEhXwsl6jz<3l@xf68B}Z@{k+FZQb8(TzTx&u#O@KgWF`PekD+a2e8k zNydTPU_6m{YefGy8=vVu!IF9+wlA>Npr__hOq-5#E7~h8KVq{@l|BqS`t363kXAao zS@Sin=;dfV_NigP2`7wnI`jE=N2f2i_zk)u9}hoQ5))f%+z=7LJd9=Lvl9&69s6wz7_M`X=eCrG4?Ww2b?3W z1DA?_R-1Mu*LsN0J^L1P`s6bU|GB(k2=YkI0xATmL@06Fz+k~Gz9Kfb9k=Lfc9rd$ zF@Bri-J5ifN)Bo;IeKGQN>+p3du@)svpe33Y8ASOioh*p%j3`~vl^3-qqbr`z9M~T z!oi~Qb3r$@(k&v2ghgKMdqc8OkI(^!wgF&&Fpd9=?C~_y-@W`)KVQ$>-X(93lGC^S z;lUlp%2U_9-?RB+EQ?D4@cz_kO@?s95QR*g8xSw6;s=lE;*K_Jb0&0huibmmNcoV? z^Oo_IGOByJ_y_&R@EbUrix!l{=lg9 ztlb=(9@mS5G&WNTk~TDaK$Sru#T46ek~^k&Y4*{*)X?8Luo5Hf?5WIoP*Fu^IMlun zQnP^s2Y}|^fVE>1F0XuVD||JO8TB2~_V*X1*e01~les~6*8ow?yqSVO@Br|WDqgXF zu_e-|;PU(SU$shm)_TM&UkT)2x&NqyRbnKg_8b$(NdOZkV-^C1bWgrqy9aAn{luvK zg!;f&$~@*w1Qw$Kc{TD`8^vTFa0FX^*-c%ZQ;7^$)Z@e1?iscZ3b_TUg<7gesWvvQ zs?X*N*i|O0t%c*;=E7Asr?=pYmhxjyQ0x648B)-XQ&AlhXH=EJoZ0Q1j@i~Eh z->&nE6#Rmw+4qF%1}aE|ghlI&Br7k83MH#%$GXy0uSDw#ax_}{@7Itks7t7b{tE*1 zjUMkXdYP0~k<%#vo)kd^@l!x%@1jU8SJ;`alR~SUBFnAsie?%In;X7wV7BK49KSiZ zx@?ShE+tqGm#XSEr*R9OU6Sm@US&)kocTwX;PvvfnMm~06Gi?U5B@E0qx=dT*|cwf zuokh6o#Y>RguaZ$kmvf22Ym=*X@Pl44@Z@a&G>7u0E#HLpY5y=6`i{GTSMD z1RcDfaP<111IebPITa>`nrH}H4(fa3HaqVeyyJK9#Z+z-Xa|!soutByC5z&Cf@C1V zcOq<7IC8L1afUfT9zi-gA)(f-b*kw3OO~jM_v9oD3)M1|KAr{u{`A_Nho!avLmPV6zxwOsCUWuyr0$uA76M67TD9s(jw(`zZ zpn~tYae{o^o48JJlA#|fuP@-F5(8*PB@Y|C!x>456&cTX+oj|m%;*Bwe_V@3furc1 zOz{1C!e&3$R^qy>8D#u%7k%lH_eO!t+}{Er>}OxIE>~P7@@h+=i=9mAkL6Pgv(4eT zH%+xD_KUwLKsU5v#uLpPN^G4i%_ew2@j zH=|6x_#PE&PVFeDRU3-L${Qdtzy2Mc1GMA(;B^;( zPj?i0P7MwutR2KWLmMa~Qp$0J10R?wh={I_{Grj3;r-sN;3>)2>wQ)o2<@3hkpiyv zc4$YSh{PFkw;igzYom-;$IrKt*;_emU~pBFkI%Ib;52ra_0JmNu-6xfDC?#T?E zLv78<)o`z78RWggo?oKzB>-Vr_mArJe}V;B6Yrmk;;f$FRldxFo8$roaR~1dC!HV9hEoYW5SZ%bb4RmY3BAk$yUGTZIDk2bu15<*= zM;R&hffm*vYJMYCt9a*eDrP%c@ejj7#-BW{#W@w`)a>k+q~SaP#Qn{>E9D!8T*vF6 zTM&qS$+NAihQY0ROvA~OC`=91Gs7bt5fWJIfBKI)0&*Z&8H*J9$ZP5EF?x)@! zK-FAE3qGH7FCUsE{BC)r$@G+ATElkrx}Xo?u~87NtH<>BTNStINWPh|N9#}#Ux6P{ zbJUElCx2cXX`(Qi=wrbADVIVvLIbTk;K)dky=bMlMf6Worms`9W!{c%EdH=dlnAFC z&GgXqXdg$XE2-Ly+N>%5Q&&|Rp;Y>+(4@M?fFi`G!WKc9Y2;4sUtMCj%YAzz z^JfL!wxO|xbOxH|ofZ-7{W{e7bZu+1_?wgE%M5eC6!3kGqhC30SrRx28KN@luVQ;!aMD5;7B9rR8h9{9IO!dPfh!?`Hh(66gLofG!G{ui{Sg701aD_yU@;3i@->Z@0W6yAy{(cJ-qP=#bm?ZbbkHACw;Q)rl^ zb`<>FsNlIk04EbGqgZ8>Ik;N~N`KWM6Hg^8`YnnRN=?Bx_L-qi-^LT!RgeK+Pl^Oz z@IRJT9&=d>enlxW_)*9pSAXBEn(?4UJrXR}xw#VdGqu4vws-gaqUw6&AiH z!6)sF{$Q4!BSjrWVp?X&UE$!enPiW$H|5=`WU9<(Z)M~C@FklY^HleXQ?2}ApNZS# z=8eSubZ#DusPQv<{f3v}pp5d|7Lxxkln^kr+1&j{pP7S38mVQsWos(aG&zeuE}aHWh6%HnYZaV)U{K6Z&HVcvGO5t| z$;CVMVt2bOeaxF>iMH1i5%iXb;ci&f2fleP3S@M#7>?f;Tt!~@DOmwMCSy@K8cxeK z(Ih+qTe_Qz(6u^^-SDT5g|k&wl6!P=2Uyi7NyYwyZF1g15#QD6H)m8VLZl_qnt51- z-ZJkV6wBJ}BAWD+F=h0&N{W$KVPRJ^n^lEEpEAZ=wZ2nET#R$gyNL)Qj4G?a!JF^!CTkjwfdXJuKqi)M4K*T z@I|m1TFM22>qCZks#7B753cRL_x?FwFxNAmrFnw>d~(h)=t0-x5T%JvuXdYSEwX~( zPP<$ase|5dBTKuYn?ia_GN6sS4o(oXg7FBUiuLu=q0|`G`>0})M^)9?^!)k)&$ffM z^ltOZJ?@sZ$zdC^Bcv1fjl(wc(|`|*&})Vzw^x7p;~=|)qhLKQ1_l3N8P?x$h-Q*V#m3IRXxgEm1gZtrs9N5PjJIQpT^v`IQY9%zuV^1JWv zwqHtET??G%>ND~V?~sK}X3;#r>pH>LBT(wHu;maN+!)gvm!=MP%arYgsNJ=Cw_YXr!WKdk-~l7 zQu73FZckWh4d|kF&glQKnv^1Uu?+<&x^BE_VbPi~iILCK|3A#9eL11eZ~IlyyrOSn;^}mwzDUvd;lQ5T{p}zn7Fc3MHm?*tk3ibKWYO|Is1Ga8UyN@>p z1t311n6$Q0$Hy#DpO#P(LwZzXei0CE3S9gZg^Ow2#XhqhQ&Zkyzg3tS41B1!^UrUj z8y2vvN0L;ju=6F}b5(65kLZNRu*lYh=HT0n^Aj5W=kM%)vFIFj_+bp&A$P<+xG?hg z#_jA&Oe=k*<9Q4AJ2h8NUic1ReaevjFo0@9umyDP9v9BEjKMcd^y?Uue79K7IQNh5 zXT!u1AXg8^7(@7@`_?}Ge{kLtzwe5BVZLR8x)*VIp!fS|ez0+b>3p%7$Ype<&6mT& zT{3vt#n>Bk(EY$iD8M##fZpAP`eFl-tE{~sur-tn&bU1PZvrNUTZMGxXtbLq)REBz^! zK$Et}@tMKc6-@mK+ZUYh^(*os1u^ZV;r~T(0IK=<+d^x%`hFGE&!A}Uj9Zn%UD1>( zoWRWCF1kx`XL}f77wJTtoFpT&B5FTrC~Jt`9_=7NWQ6kWt@_n)ddghfkddyD$~nDj z4A`BZ4Z_Eyf0TWeCv{;kWLq*BbBAy%g)LIu#jj|7n}Gx zS99y}FM&4S_T2*?c!5^lOXh2Qb9&e(esIX1wR}Mu^9u5b)2CDAi%KgEE?6Y-ZbKlN?jn$8>t_^8 z*^#jO{JK6}>UZJ&K8O<4jt08r)vmnJ7Cu$za?Cie}Bkp^rpc=yw|uFH8lW z;g-3>rduNRU}^XgL)vq^&H>4t4=wQ}t7BRq$&j|(t45Q86K#>st-kLG+%ggd5zkj( z3=jB0sI5$1hjy)+22!t#nn5hp*=~cE#JAdN^0n!lDTXm$|tXh{pkxh-MaMSVV`%m;j5{Dm{rS9wM zU2t$d^`@*R;?k+pQLA>=%rWf=Rbn(o$9Uy38_%iZ^$8L^h!^A2H*=pl@G)*wTKw&Y zg(|5(??1TSKJmqV6Butwh-ma|<-wQ;3-vB14 zlUL)tWx~n+HGgA%c8$^oky4L)WcYi;d#;f(=PD)T`)ZTu zYr=Pupw7j^#U;_{603s<;`GB(FLWO6oz@!-Y|hNz)pg{(Toxaj%@#0z-L4V;4bpgC z?*R#R_T>Yct;|}V&BGYbu9rmu?0^C|ub^FawQOw{deJL%{ifhdirniDUcYuX!i#UQ zuxxf+Cx@2z5XiNk9;ZS}879pF!cj~dfYXdS6^96zt@cF}0)OV#%MhfKF4wjQl)g1> zy|YnrYs=Hz-t(hM%;LZQ>zfhVN-0|bOlQL3QrkgoogWPL;yGa%jj>2L!-r6P5q7PI zXmwv>@9Cq6m;2j(ezI+vNpZoVgPqtN>{RFMeWm{}l74FQJO~u@csK(NC#%ek zj}r7WbO_}Af0A==n%u9c`!kAO3M-CSdK?Lim~X;^{OZypkyQaNZ3HhSBU<+0d1UO4 z@A%IAmov^^nyrg3*BM;Nk=!?>QeKe4i)|@wb%T%|`Jj}CFOMQYs#kMY6Ad(SS2bdA zm6S1Fm?A+TS0f=xS|n=RsrAjRy9GW0Crx%_0H`?(5J3vdfBgOrv$1qHxpFxb_?s;M zD3u3r$KExH<;tc>2n!PB-tmBx9qvh#cOJI7-Kce zjN1okX4LIC9Wqt(J2SJ2ukU5wlm>8lvF|<)W*ZuY66%qrApWRZxUBl)`TOVl?%0IN z{#Zg#3MkWU@h$y-wS#_;1g*xnAyQBG$M)ANF0XPt2V-vqK+vA)b~?ptnd;Lh2P@Jq zS_tuZj8LVP0`SV3)~f`4A|8emBE=q3ARyCknoOn9FmH~&;e2tsz)+B)K;ok(F~rw5 z)d!tkwVYjrwta4X;-th;XSpl2ZLD5sKj>b4uMI zFW9DTswU`g+KPT1>1=Lh#NQo1lh~@E8pA#@7?@iJ0mHCj2 zAAA+b7^k*X#T|>?m!3m!_O{ZNVPavmX4O9H5H3I#T;+AhBid#_D?M`iBMODI@|??v zvTW}Q!KzgBSH6Eh6RU$$jP8H^o;3p*$k4+4XqAx7USZg`Nr|vCH!? zs@U;KZtY*bFz_2h?z!YK-MMYKz2`eJ4XDt+QcV@-+ntocfik}qxfj@E68$<~7XSBr zQXe%{iH}cR~Yn$6Z09~l8 zARtwrPO+imcTCjJ|I_%9to2-s@LnRJKy3DITLDku(QRq@QPFF+`b|o#USsIy?m)SM zqh3#rukQfDNdN%HC0E7`yN@asm4)SRF6WGRhuIsiH=?zv6X%~=d%LJN4eCaXv=2Qy zEfUTcntn#7Rpl-=KzPaDvX)}w`s*_8rYMb`m`@a8e)7zz#nzctw=Q|tP z$m&dg4tZzlTKut1S#bHXWA?*{8T(J#`Ee70<^Sl_(7xnv{CeAyQ$|w_malyvG(r%% zbmJ-u>m#*qaJmIpJ=j01nh=rdL8iP>yyiS{c_MFIQarJdJx}+aR=L&6>(Bw?k4>5t zJqa48xKAaF-YA!H>a&c#Y9D*09nk*3JBsnIj*~yY9xAFG23uMCGWODL8@;9fGU@Vd z@^@;Wrt|JwvFg2d!i?V(KtXu9)a6s~x|L+bY(?B@1qs5ZGMTIIEMz_VQ>S z*??qqUx-pAbT1`C(12KOJ7DTB^HM4!LhF;!mHWx>EpHmy%#C;mOs2ica!*^M;J!uv5oErsEO`T2L=k^OR|Sho5uDVwiaemtQw7MT7D&hn2lHF|odD|>-J)@~ zy~~cypJhiV$LQF`R-)z%S&HZNxx?NtXx}JCgQ& z8-$vCOU2*_d3KA{dC@%?w4s3;pxh9#KRCGCH?l9B=2b^{Gghe$ehEt8K3 zkXGt@#D~XxSJf+$lv=_fGq7RL!?;7Y1u|48EHdGB2H?6H4?JMAN)+dwMfvmE}~|0eu5a4_S+p%T25!TRUPTw!fWIC_eX0yS$ycqtzI z$~P{qP|QQ4kSV+4ePdN1B@TFQsJ6w+;e`55u=NjVsaNd(G)wD$Z5E_?lHd`fP4YoS zhl`CmkxzX&q$Ywgj^Ex|b(G_35u-oU`xNKli)aN++7huxnPZ*PD2{zz#qHRmrT<6N zdw9dye&55R6M`Uw5E3m7(R+zRM2mzVq70%&8ND-FNFoTLw?yxvcSH1OQ3r$32V)FI zH{~7A=l!nVKX9*gt#e)XIcJ}J_Ab?svvvLYHU?)>XMO~PJMEP*L0DY`ryml@GlrW_;7@os1n_Ji6%HkDKWCxN z?4tg>W7XqH9ii8HpENddQ9Fc=U7gfbg^c*;>F0M7yfe{%JKsysC$NYR$#CgL_rvXi zfqb_GOeN7p%Vff{_rD4^;ts)k3v1O^{D2k3yocnb$~Lz~Yh-RZ9(-i+fuCeeLQmwj zT6*W}i#~AEuKNY>0uxYP)j@6N9WU20-fmrc{@Vwcr!*#MVk>{x8k`I6);W#TAr{5$ zkPOimekXD+BJ^D|{O>Zfc6#re3}qY7JRoiy;)*b>W~b2IcKRhwV=)>p6SfFS05<~v zyinl1Cs)DobH^h7>Dc_0%Cp%Yd0BgJrhs}~HS&?*_7rG5Ig48t$*t=ufKGr+HZhFt z`^+xHY9UmiL|MrZys%&LSl3ykX)=(&z_CW}S+vv&~u zWNg^GnFh4_6_+|#_Zc>-7BQ`L8Dnx>1H=p09MdsCAf}lnFB_?IRAtNIAw0o2e5BAR z9Nhto%^m122RxYoGB}h?SMt-WnJ^U>ez0-`8EjLKRvw9dm^n4$GG?xi{i>ib&&0%V zoqQ7T>Ap+|8BwYtn7DD_ykEF|w{2-g__^0aQ=m6^_(W?bPO6fobM8KAxCKV__a}cR zq6rNEAXCN;AzPez*)8lfgZJ&Mt%r*2b-V=0pqXo*m4L8~MDgW)Xl&Kxryg6T!hb>8 zhamhMXW?N0d~uzn0%l%IhNT#@U36-)9^OBOU&>jnt?X2`FJ>e0Lx^XW0?PMH+nSoD z99T(iDhmgu0YU%$V&fHAQKz4GlLliXqO`R6Sjf!ZhVZGR&F36Go_QnK4gF(d=z_>8MRPfcij`L$s> zsP@i0t1FcBx-f3a)u%Y&vZC}{Ph9RZ_fq0l8W}~F1twAeskQ4>CW*5fyuDNv)ztP$ zPs?W~fA7rTtZcM@$TW6qHN9=kv)qlv`-Vy}C7H(iZ%?i+$^g6m}nO zI8nIsKAb%!|L5mtZe6TkWz6E_^e5%O4#mZsJHmp246UCYJ|_??={_9;b4h`#^Q%`nEa$PI;Jdu; zPZ0>P5^R32p|Vw0O`GxJ!7mS@S+Gv}-8V-3*tTFGXE+IIC^u)A(BFlz`I=-YwJw8Z z`8*O1&n=RlDh%On09WFJysTjKX%Z?2y1(qv7&(mhlE;Bw1i$}y7VGg-PSyFNDlvpj znSY<$BENc*lcyPp2PE>X=dNeH>Ta`}*#zvO-8LcX_tJLI;fEorlr@I2#k9sdnYu6c z44oB(y}zF~cVj2NiztEM-$e+JH}v2au$kI?Bm4r!TJsmPF!L|y*f(Ui(%|kz%ju4v zsTL>%uh@vE9tb{O%ewaV#^(#5ICdI7#Dg1UBG-Sxorc@CDj{KYDZFKd!A* z0eJoL=S?5JQ0Ec0?EDuii7(5JS*WN=RLJNk$?fT{koL8p9_DP;m5Y*M3e9YZ81A5; z&HiZoj4JdGS0k{i{`x;L9VSrcENP;?-+%cMFy;?!y>;w8N53{rXz9F+$T1^CR1bd% zn$~Hy>sh+(G720z*xNqYYx3}AJhMqz?C-6J2~7D;pppd6X1DJ8755z6>5#Ly&^YDm z?5TX~GnNd|$&SLA2Nz)API2>0+#E>|g+kP`KXzo)rVU@v+&`TQU6de`MbMckXB5pn z?xuXPc&@?Evu{-1C*+<&hDhsVTq!<3dEdMI{q;A2UmIho0x=OYbW8Mxdg$vMZQVpA5@V~g0N54*ay z*aI8{gE(6Ht{;S;at}<4FIJ9YS65G7YKLHF!gGG!vodv2Zq}vPY5BJEg0(Sd4WWR2 zuL$!Nxz=kp`d3ucL8$;{O2he@3X##P_jplP;O6Gs^U90M^gH{AnwI$+uOpg0daJxH z5UT{fR5 z1H_`bNhCT+mWhpu&ZILNFdZW7hZ~=-C&~+&_|X$_P-No8kGIdLUUc52>~aX>dyZQn zDx4CJg=C}g5-Ot?@M=g%=Iodfl%CmB!kv$B$2NwqEX8F9?^vS_4mZ?UdS{P%;v&AX z=WWGHe%U;;M8i99yjHR|Q*bq1JKu$Zwx(+;19Z=ueNEv?qaqy`-zAx<^EJE1K+Ijs zmK;dwLjk51aE&_d9Nao}obHxQ@a*u;zQ#uStIZa+xO=mOv3jB|L5|A#psa}j#&q+m z+`ZsVHN_QS2c9}F$Uh(fhW1kl6J!` z>4Rs2)BFps)F#KCl>&C&!(#u_v8kUEzm8Qp@u!JpZR(44ueprw6^1ewghjq#Tm}#+ zGr@u}xL?^_u5XcRWuHbxJp^MW`v-zgP2CioyM*qL-ch^J$D(?Z@740re}}cOIGw9% zP4)fNzTq3_x((Wl_fgx7u_KS4GkWV7=C9NI*Lxj$>i&sX(`Gz= zDA~TequYp#yVDvhCRqJ!&!RRju*vY!^`&0SUkgpCii9%yhoYeyJTDW9vUk-2;Jl|` zHHWgac()o-o-#LMu@FqxjS#vJrYmaKW&172zG*G;;;V2e1(ASIXu`GkB;^&P&CB3Zb;jZKHV3z zbNuS7ef_4JqYd7F;e7{_vPq@4P)0k{anJUHeA$`LjXA<}F$TEg@zij1;~ravQjD+1 zXumM9!M*a~0YuIK*REUOq9iOgH?Uzd>(RVWSOHBJP`oJNtDx$77v>bf)t2F{DL(O$ z+-EAQP-A7v{#g?1S!d?n%Q|rSb?!lcL`fT|F^TUoN0)^dfSrdJNglei9e;2$ zX!LHe&xF6y*AYZtm0Dwm8qg~g)AYx(bLKIlYBAqEJvqhy-Y05EPzn4UWjwZE1F{z& z1XeFCKiBMjn6>>Y<5Y=&`(=D#`h2)nCYi1-Wy7^cX|WN4WXZwtFPskw#|bri>Zw*j zzz>BRj)d&9nKRNv6c*x|Pq$~~$uJo?f$#?U04N0a&=ct1$^JQky+f&uV14nX_Jrdx zp>_VF7g(V8ot7qd!>iv-P`bySxqh~sAI$iU|48|2mfVQvAX%fd3t=O=?!E?y zNj&*K96{_0F+l&*aaboN!&;sNLng!qVhOc+wtKRR+TYnG!U!lL{x=j9<1=eiNVH0{ zjxSD}*_f7&OLMGhjUA;8v9X}FWX$YrS|KXo6TfASZr@hUz)4wResx*-V7B(F+)#s` zhR#=U6vF7!{WB>{3t219Y)}StxKo~%_m*#pQ*jsBY77gkuY?#iR0=!!RS{X)czMiJ zj~t3dc%Xw&0uoaW`0?9}S8>xL%E%jtXuPZNtNI4h`E#XhiaP*mZLy%hCSMV`OUoAR z$sfhq*KCTCkS=qdhwoBNyIdD?*1zXiH}v`;&1ZPp$w6xwN9}toMCgZ%efOiBqUE7$ z+LTm`KS@GJi2bJs%v8ytqb4q{YSig9I^VhD7)3})G2(;Ib@Lb?q?br0o;Eb z_gTyPc9~iMz{Z6m79kqsfj>mjR<;Fl3cZ3lizR<(@NPuE?VngF7LB%e6BWI_j+1Y{jiisVe^XRE1C7;`K{hJ*jv6^`;f4|RUC5Z_B74q&4iu?TX zXd>>??lO58sY)EZ{}Of)7>*ha zr=~K|neXU0`fm8#ecQ0t6DSUys}Nq*=j~=TcMYGA?cwW;V4z@p5)rBT8W2iGkxiV; zYq=d1dfd39Y^Crgt8VzTBk0e&e?di9X7`9Z5=UBR;*uOO^Ne-<4;)g}56>R0nXFUu zwT6X1@<3S|kxjX5}!D25xWo4t2Pc<(te7u-s(y!ej*Z3n~%lxP5KVRP6 zAUM_lRllibXy9_Nqm*)4&xVe@9bgp?zvPBUL*5gDb`_g^@G~~KrhB#FB7oO~E9(p#NPIhwbi&zFn0e*;a>C;Ru=(KnpsX=sA3v zSiqVDREZZqZlrrFsvKmX!#Q%}Er}w}H6nS2EF`>-B%7E>y*I$)YD4`wTgILN6D z-mMbL7OxF{>ANbtAc~gq5UanvouUdC*59{&yL@y_!!+sQm)gf87jx3q zebMvb-5LJUBhCK7_1$(8(x9Dy?4=g-Ov2;gXZP4rEIY0hv|^$WhVX14_Ra5uk+J$~ zY>=21)0bFtA5-cRk-4_Z1@r8~VN7k8g&~bBaR=iq__f8%o{4j!IuLGD#`8wol@FC32k(Ts&O$6SQD+5uS!9$ zA)5^!cJ4I1ZfRN=D>1rd^sO02eC=wwVqf1iP>3@bO!G0)gx)XsUtn`2IW)hvMC3hS3Ilwl$=`$l0Z;6@`O*8kXe1+M8{HO%^%3`d+@9 zzwmiPb#4a*B1VGk08j;{2XMQ06RhLRF`P!9U*m`1r|}WOETrd(b3{e)o}2JaCd9-j)dCPjn_K znSdKIK|%ad(hU9Bh|j3L%X#Y#u5DMT*6!Xa`3CR~Eoihk>+@}c;`~st_LR%jBHgZ% zpvJA*8$a#iR1CTr)20E z#Qt&8uZt0%?D3@GVy9H=z_G69jrZA8Rp=zJ3#4?m-D~#Rf{eqjhSzDT1{7bIWwP!> zUiGE%=u2?xYWw?Yiuf$lN%wovq*d1NEljyPCGGWfx zxWBBY~~>0p6fM;Dt=X9yOK@2v|7H+SxpU|y(1 zu&ZsaYBJr%C1L>sJOztE61QeKQ%5ilbGVzjHyDiWLT8=p5xVs`eZWo$Yy9~TO4Y>= zay(v+1`3!6tj1OSpx8e>((^N@n<71A|HdhP>rz#+Bw}83dwqO@Jk9o*IL*!niMML; zyF-q7&j$e()IS02A#_&_o%!VC-}EMYv~aYyp!1ru4M-+#$F03y;EC85STck`b&^~( zBgXB&-!ecq@yrpw2D0A>i{88Uou6}VYp7h8I1Lk??@mGhGjSDB&YMx)BgoiBQO>b7 zniyQmQnQnK@Hey`csyZMY-|@7?r~5wEuz5(bn-#4&2HG7p0Tgnz!e&U6gFWP@2(Gx zxLxdqM<(I7#L{a?MQ&KcU;{-I(;o`q2GCUVrjIvn3L5;zR9WDN0rd$Bf0j?9ffXN9AD69Uhx&v1o zQGx~iD4^Td=AvqABDUJ;`~@X>)sMcHdglFSj=6*nD8hSW{v?(FPe>du91n<`k7G_H+)3Jdf3xkfu)0}G0 zqskt@u6He{3WHtPScBq`r9Nz}O8y<#HaF->Ylic;h319!X4k!gGuQDU)T?MO(_;pS zygB-s1GBPgHoBAZkK)a6eA`0pfFz>{fxAl62DiD=Q#O7{K#<|2GCx}+!=%36KYz-T zFkf%fKl6tPAQnl?x$nt{h)V^g)GZXHkbqw!@CY3e_XJWz6&yN#w-tEt$?MR}PT(-L zJfHcUm@*h&_5JTJ-TT7zqM-ReLsq6M_p)xL6M5}Z&MBf%4>((GhCP_Iet3E6KZ3q<`!>c; zAE4W2sV0%{+HfmgZYk9@}?TYtQa;6`J2burQL63{dkB2NT4|V#fO+&hf`NQ?b+X z4mlv)Dm~`?6ke$Q!vaGNVCsoC-u*VYh80is+^qtJ@GHB%eS-UFjAN~yrU1+p)5R>R zlMw6>Y~&Cys9s`nyHO~Rb#>E5R?Ld(3) zrq$-IAE+dztlR1?W%x*|{BgVDt1KUn{q^p?gF2M7a0q+(GQ-1cV5IWwpOWW)3DYW6f1(d%<7;?M zof+^y0^qjDW(U^ll2?y=B*{?WYfnX2?|mH6BU@CgqqX^b936aKF)TiTb@2ZH=R!Q@ zi1R4O(hcJ8pX55MhMCZOpHY_%yM8Aj=_F43br1%<1^K6sO1Z&ur%5&fx*Yu( zkt?3SXq)pL)3Dvmr~g&}4^6aHZ?^Hoe|~cQMCPh%_tZ@nF?5EpFidM4;*NgIm#vny z_C8w@b@VBcSob_#SxJ2jvS)C_Z1Gp5N+BN7HZ+!s7TF(drusb3`e9X)Imgy3AaYodM#~Xg72Y+S%5NaN3R~t}2 zhFl-A{3;Q_U;Xzr*j@LIC#xR|>Fe zrRm)b@~cP))-J+dPzR$ElwSw^Sqb9mxLG1f&f;uLbJtg@+G6d9>IzE>Pt>awl5=*P z+~Y2ve*|0FKk)G$y-xWgiC{JHHrSl7|2n`8eKM6Y?JxuwDB7K{m)YSl*Pn2n|xR4qljuf2Wv4WE*FJ4yN9;z>)QBf{^d zu%k3dp+qBTD(}xUPBx6jpo=qi+l%?Ox?kgZmIn8R3chNVe8kaZq~><od>f{`Yh;Q0x=A|ZB1GLqYsGY1 z_kU`k-EZtd)(_?`BHxUZfB2w$+P_BdJBye_DYm(-h?*%I4mJ5~R*AUD<^;<&0b;CcaN*$&WbUZxYnH=Q9=kCfW^Q&WxLuqJ(o9&$vV~3 zi9FqWO8QPFYsyRCw-C;*_fl-1UKBiJq4t&kkVJc*6L6hqbw#Q2f8d1w{{tsBh!xRP zxj!Y-?$-YL#^%oU7K-RAvx7d^B|2$VtW{=rOI_v%;Hvh1NVsR$Rj^HKY1Zl{9}5v= zh4cILu3I{es8Ywoxbb04iQ7%Y3!tumol=uqd_`5HuZa3Rp#j&BELu}@PhIaDs|YTs zCCpD2#PpS6Uob6VwUIM6QrDwU;oIY_(7*o8)CR|d6HZ}R{+zsEbfMABwq9~Sm)EjxI&etWbh;lLuZjn^34?6#&Qx)MHm8WK(%t8x`N ztfS?!-aqgUYY;S>scrJ@_A{vJH!7p_Vf{&F;e$+l?Wgm7_PI4cb$57Xk5`c`p?`4i2T_hLtpxe?#%@4u%F(`zr_QD%;pt}C5}&Y9 znYK}DAM=rvNIzZLp27FpLHo#enDP^QZ*)0 z09^~@28BpO-Rm!m|AS+i6rHVor5ALXe34R6so9sgCGf8KQ?DEs4fBYMwUn;$K;W?` zs4Q|;+_+E?(YkT!6KdD)TNJc7`kdPX;W)A&Tvtzwqpn|?pEeI{`&4vt`+~;fhF&!| zH6R0eV)X`b-tki!;~_f+a#JZt3WQ<9T!l`}6oVK&cI;um}Vw{vlkXYGVOJu+U7EPD(5V7v*bm?n@p0-c0kgQYvI(_ne9n9I?0zwi092JG#<2s zX-z5P9bm?k$FJu5wYcD($;IZNZC?4?Awr)DuSBfFdT#vUroZ}wJ@VLFaDlz0Isff- z7|*hjRUaO0jv^pL^Z>divB3n9oJ(+cdC}bA1s3$j`rSwD@MTl;cwL-_ma{1W!sb2K z@|$-T6TPPjlWZ-8`@jP`KI+C9tIf^{>3g@Qux&mvj}s3NnTI3*DKfP}o6I5d_zXI* zof)(JZW`y-W45YNprLBJ7EhfY75g5hg~GzK5gc5_1xnM@i1pH!=y=a+@jU zZ)9YybO-4A9+5#raub`Tq}mj=P!gEAD&)3~LSiI2y{#tPq(|@UweEr;fr6 zWiV%|Ym>LXQ$GyM%g_=TUJlqv)Kc00M&lc6J!btCnq3&nkMgf`R{qkkz84)bs0&8+ z(6z+fWVB{-Q2Tn%^XxI(Gs*#Vb21Wo((g}0DT#;N6kTf{W%~H5&fagL19W-D7Z!PQ zqbV?^ZG*>7n~G3OWzL|ppNFp@IEybvCHhe?V7cVXx!Us7)J7!ttgoEHw6qa6xB6`2 z`#%}at#|3`JRg|M^nNmWJo&2qWz|F0&WC%!*Zy9S^O1Q`N?0+#dQirdoF|;jm7Lhi zIuE_YfE9rse_fS`+cMli7(TN%tySKic8<%cPgE>SBDoL-)I>>gA;yh~|0FeCZ{;3a z-MYER$<^Ck5bzEyE5f$%)n0LGd`Z0(zw)8)$osI5;4zemKN-gC51&&g+!TbO!D?=9P^|*H5if{-itv zY#r9X0~C~%mE=Qgwas01kaUbkpJ!uBU&8$9&wAx-Hogx_xzIn-(eP)f0pEl-ZHtCP z>q`B68emq7Sz-myKig!a=j5a(URvj&%w03Iq*Miq+00WPVpI3V8Z4`oONdvJLp&o1 ztlk*i`NCMLd5`AB#eY5QeTe|~8-nvObuiSKgR0sbUC1oK0tH+`*btN~&)Q?BXx+k2Tpu*QEn z2ZWCsYLkyf&3p8eI);&d6l4jXrMnw2a0a6j(udy%cCB;vK5uh*fEI&RnSMP>IO%98 zS()~Ku8%uz4?>fh2tT~>9p6CR`PYVWawwKb``N(1^zau%&1M;5(~5E?CS0B7p}(56 zayy9pik$h!+Nd1`b70m)%;paWg}hFRAh`$~-&4&87gvqkzrT3XT_Yc~W&$m(ZecJ2 zC_ok$Ej_j|nLY39Vw9sDbncHCdeCql5OS&#DYHG_iC3Bm_4p$!L*(c}#R`2|SNB$(NJ8xzOOt zO+&8nTf<3jkLdbDWMl3lstqAx?R-|n^#Q(`Nx-^GbC=))0L8rINRD6kEL8fUApj|o zBhNM*?7Ii%p7_XZMh&*A#RBRF&_E&?+;)uM@GL)DO<5o!unuz2O2%h^8G9x4)m=b!&v@zBMtH&XdLQ-IB#r1wY3UV~5_%3UVppj7X`b zKdadU1X}bsTn|ez6z%HU=Dy+zwv{y;=nXxi4Zv({Pc`D`loDqY&E*MpjSVl)U}I(k zE-Go|I-QifVZ|VBzs~G95E`Q~g%uh_PCK_~HoX<8!r6gBw~i;r*q|0my)HHZ4urjU zv(ZT|OmzRo0c6?ZS@1c(*y-Q}WB-TR(8cn>YJH{Prp*?9wo|%cfXeP3hFaW>jl*~+ zB;0&UfIXcryMyytlVxB9=e6#?*X75tiLo!Nf8>fLd5__b9;t)?LU>yN5=6gHV(Ev- zcc+CKe{5wdc#$H=mD0WmOmoa7+!%QzhxiDPN3(Mj^XV`1(G!SnGsGMFuQ@Lk8c$0VI>8Dz;8UcuWAZj0}pPcjwA!3q~gFm)HaKhp|5BRcp zO&c5_XH=T$qW*gIww?GcWqGi3HQCy(J znPt8%|4CU)X@v7EBqmk9<_OX%^9?H*IdaR73H@F;{UD~WPy6SjRt@$h=tG?nA3l}- zqmhF94_Nx*ihyfaSR7?+I9)#paT14`ET*qSPd5fI(k*IS))|ahe575x;Ci0&Q?57e zx0<}bU2>ECFlzPxb#*E7Mcmw|ee9hd;J7MSR^r|y5{mYSf`n5r)JVHDO82a77o49g zZLRWt>)0Jld)AmnVIrB{8h8Z4`=9XDUN|*=Zf`wdn!7`t+5qc0X=(Nyhh&I0Vl@p? ztQ&#J2z0V{!sOe&c$KJ--JJeo_{WG`0V>%myZ78mfNk7Y^qLeJ>G8AWKS&I`BhkCIf%d#u{0X3 zwnbkAd)B}HOU$HZn+4_y1?5M_>OVXuWZxLM9??QV~#vB ze>HoQa?i~6gk8F6Q1R=ys7-3BIo9r6a}hm*b!F*WKr}(e3Y5 zpQnZg&MG^0^}o|0WPYo~8|0Z>RvVe~u?MY!LDgIV>1p8XvLSwg*~81jQg_Rv zvskLF4{+1J_3BUH^+lR_4S{2Ju%1VWjI+bY`^-9_bjH$zcMfugYWn}!Ra5bH&c=zw z@eecelF|wsn=P?58b_{*lxdG$0mc9ohyQ~o{`^09Vv~3%^F*K&)8^s+{u=ray^Y%6 zUR_#VM=o^`yYzIdS?idYh`?uIq6=Dhz=WHk<4Hj+d2$ttM3F{k@(0f=Cqf#B$GHFG zgiSm4MqlyEEuz?ae?tQDG4Q}bpodicEA^hXM>QS?Sq$|lRJZuF|DJV>T?8yuPI_r_ zHh@!g;OFTIfvMBe(?*uCCE3~>BqG51Yj3@qZV7xbm|HpCrqqeI4wyB4{2oEH(IU~m zV+1Imbg6ECVph2m#a^2qfN0S7kAXF+ynL&h;o!i??{MrqQ7m5Jv3ycCFv(>|rXPW1 zp_KSK26dlu@^et_Op#3yuqOK+O6q#0eVx^4*83T0{tOeH{`A)0#L<4e{`ReL+~+%a z9`Zky)qc4i9erC2K%cIm8psW9I$3q~O>$rHFPA37jQW=J+ZS$!HgpkC|HQo+0tuF< zU}uO6&;GGGb78Ng!Q77E6I&D7EFh*R|A2|a;uOsp&hH8t+Fjl{$$G(R^&8cYD3qACQILlYtzp

    Ltb=CLZXW#8D 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/AJOj39x}TYuiZ_c}&X-kp8G(cV@w zqsEj3C^?;zOhN74>qq0!S(!K#&rQD_4#|vKQjuK=tX3<}SZOeUAbB)7eCxDxc?&&s z9Y5Y2zZRTrJ|-OGC`0P`o*B2Cx_eVO!>rgq^oN|eYwQ!>UM-;?uFet|DZF=M_*PsT zJ4QSYW|%Tm9G}lVvoJ01An1wizI4;i`9SyJ4(A5Ha&HiIbD(R{7Nv5-k3EL=qKKZ8 zYkQutW)Ha@%3souSNSeZ{WUfowC?cusym1YK!u6?U?Gh(AIR4V{%aT7vk#?na@nW} zs!`)1s-tlqxWc(E)BSh>q{)BC4cE0z#ll;c^`C8<2vKz?mL%JGW517^#v*(VYN~A- z2Z;#Hdlwe3PH)iiMCF6Rp`P}*?|DckQI+UCu^wM1*V;tRKm-&*y|A)$d zY|E3Tpsnfaa*)E+N?-veKjDQWz=Amc4P}eKjEWN4vUt>hvSOgs+Q?zh*>Xolrbh=q zDlhh-?jGW#*3$Ws>ol_RvbnVA!3RY%w}GxDyyu=0EJ->y#Y{tQpzcRns`EI6ug(~@qA>-nKfAA}X_#`Lr6P|~Pd)#@EHUEyY0VdiK|2rq0@brpt z{n5ZAl`o3zM)#rX7v%#zRn}lrpQ^Lv)4-ahiX^8WXZQ?d13pf7nUAxq^9@&bPcqa| zfYHRYwEKGo@<)}C{3-V~^zOl)LiciyCki^Ihmj3Hh2ut z!=*UImNecGN0nJ<}@FAE8@kCLizts!EoqGw>EY+atj0OI0{A%l2m)6sZtj&i(( zNRp`IPO0=pof~WUwK|b6tL(E6&^j>ALhHbCWskKYO>@y^o%wXMbF=8PmQNp|)3*2i zm`rxD!QT0UVYkj2Q7dyPxXD3ob9JujgCnX)P9_==O^Qk&7uM>tgMkkl}{P^4cvIF;7HxiE`_VdcBK`{2a#t&;%EDWw>T4NxaesEp*71K ze`vz&realQZYjT*R}8t09Bs2zjFhh5Xwpgh4Hf2q@ul1v5C5qv*DZ~iAGV?SmU`^g z#D_`h4Wi$hIUHj>{HQB4=m{ktMHP<}e3f-_g}DrvuV500ah*38!#+jj^+H@b_&US+1ciRIzpHsgBk%7U zs^um*D7deKRdIX9ibRsa}sxO(VVfLA_8!8eS-$_fyzhyB@be{13qoPL}T5a zJU1)e8mQwF?+QZshf7?h5F1uPq)-I}69aWccGK6^f~J)}Z}_42#tELVfZ$`oeTQ}* z?>6KU(#$Tc*TSr?Z{__3a|&-~)on^0V&_ZB9(dCxrM+=_3+YoF{m%4pVpSj2Zup}t zFZowENg)BFU%zh>!)e6wRmJbBkY6wZw%-E3Ff8v=EaxNkKEHZc5qRrbrI5qz&mW)a z2Lq<|zyYxgXw)_amhVhe({<9v-)-=T5%w3sQnMq~O*%;nhWTU4l1L58$HQ*gEylYE zLKX6FhJ0L{g@nge;XxRY^zL=;)7@xu-xB6CwEaYMV}czZ zjb!BXAE%+lZOkRqS@Q{0(?evlx`?1)84mnWKbSNbBLkOlA^6L}-Yhq#%@hf?9LhX> z16JCaF25b9>xNBp8xt>+4oRT4{H?b+PK+?v%0D928zsHExe^VEBagT+VnM$M3cq-M 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

    OXB&mI(<6$$pcg^v;f091@bgn-tzUJn&;-<94WT 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

    {ip^7*Kf8Uk|Cm9~| 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�tTc)5I)Z6{1OBc4p%qD;B%(IxG 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

    -+TK3Jw;pNw@|~=7&50 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

    Zj8u8>7x_8AdP;D@{sXzEF4or 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 R0hs1F0W#o#pa2kn3}j2(v6lb< literal 0 HcmV?d00001 From 64167386f99115b033ef21d7cc008e10356cc80d Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 31 Dec 2020 22:31:06 +0300 Subject: [PATCH 085/463] Hotfix --- gradle.properties | 2 +- src/main/java/ru/betterend/world/features/ListFeature.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index e3d806d1..86a40e31 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ loader_version=0.10.8 # Mod Properties - mod_version = 0.8.4-beta + mod_version = 0.8.5-beta maven_group = ru.betterend archives_base_name = better-end diff --git a/src/main/java/ru/betterend/world/features/ListFeature.java b/src/main/java/ru/betterend/world/features/ListFeature.java index 5872d0d2..42dc6367 100644 --- a/src/main/java/ru/betterend/world/features/ListFeature.java +++ b/src/main/java/ru/betterend/world/features/ListFeature.java @@ -23,7 +23,7 @@ public class ListFeature extends NBTStructureFeature { @Override protected Structure getStructure(StructureWorldAccess world, BlockPos pos, Random random) { selected = list.get(random.nextInt(list.size())); - return selected.structure; + return selected.getStructure(); } @Override From 8833906cc960d0156ed24ff3efc94bdc47196683 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 2 Jan 2021 02:21:32 +0300 Subject: [PATCH 086/463] Adorn integration (WIP) --- gradle.properties | 2 +- .../integration/AdornIntegration.java | 27 +++++ .../betterend/integration/Integrations.java | 1 + .../betterend/integration/ModIntegration.java | 107 ++++++++++++++++++ 4 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 src/main/java/ru/betterend/integration/AdornIntegration.java diff --git a/gradle.properties b/gradle.properties index 86a40e31..c01b64ec 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ loader_version=0.10.8 # Mod Properties - mod_version = 0.8.5-beta + mod_version = 0.8.6-beta maven_group = ru.betterend archives_base_name = better-end diff --git a/src/main/java/ru/betterend/integration/AdornIntegration.java b/src/main/java/ru/betterend/integration/AdornIntegration.java new file mode 100644 index 00000000..f87fc0c0 --- /dev/null +++ b/src/main/java/ru/betterend/integration/AdornIntegration.java @@ -0,0 +1,27 @@ +package ru.betterend.integration; + +import java.lang.reflect.Method; + +import ru.betterend.BetterEnd; + +public class AdornIntegration extends ModIntegration { + public AdornIntegration() { + super("adorn"); + } + + @Override + public void register() { + Class adornBlockBuilder = getClass("juuxel.adorn.api.block.AdornBlockBuilder"); + Class blockVariantWood = getClass("juuxel.adorn.api.block.BlockVariant$Wood"); + Class blockVariant = getClass("juuxel.adorn.api.block.BlockVariant"); + + Object testVariant = newInstance(blockVariantWood, BetterEnd.MOD_ID + "/mossy_glowshroom"); + Method create = getMethod(adornBlockBuilder, "create", blockVariant); + Object builder = executeMethod(adornBlockBuilder, create, testVariant); + getAndExecuteRuntime(builder, "withEverything"); + getAndExecuteRuntime(builder, "registerIn", "adorn"); + } + + @Override + public void addBiomes() {} +} diff --git a/src/main/java/ru/betterend/integration/Integrations.java b/src/main/java/ru/betterend/integration/Integrations.java index bdd07499..063f9687 100644 --- a/src/main/java/ru/betterend/integration/Integrations.java +++ b/src/main/java/ru/betterend/integration/Integrations.java @@ -9,6 +9,7 @@ import ru.betterend.integration.byg.BYGIntegration; public class Integrations { public static final List INTEGRATIONS = Lists.newArrayList(); public static final ModIntegration BYG = register(new BYGIntegration()); + public static final ModIntegration ADORN = register(new AdornIntegration()); public static void register() { INTEGRATIONS.forEach((integration) -> { diff --git a/src/main/java/ru/betterend/integration/ModIntegration.java b/src/main/java/ru/betterend/integration/ModIntegration.java index cd02bb65..0e560852 100644 --- a/src/main/java/ru/betterend/integration/ModIntegration.java +++ b/src/main/java/ru/betterend/integration/ModIntegration.java @@ -1,5 +1,9 @@ package ru.betterend.integration; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + import net.fabricmc.loader.api.FabricLoader; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -11,6 +15,7 @@ import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.GenerationStep; import net.minecraft.world.gen.feature.ConfiguredFeature; import net.minecraft.world.gen.feature.Feature; +import ru.betterend.BetterEnd; import ru.betterend.world.features.EndFeature; public abstract class ModIntegration { @@ -61,4 +66,106 @@ public abstract class ModIntegration { public Biome getBiome(String name) { return BuiltinRegistries.BIOME.get(getID(name)); } + + public Class getClass(String path) { + Class cl = null; + try { + cl = Class.forName(path); + } + catch (ClassNotFoundException e) { + BetterEnd.LOGGER.error(e.getMessage()); + if (BetterEnd.isDevEnvironment()) { + e.printStackTrace(); + } + } + return cl; + } + + public Method getMethod(Class cl, String functionName, Class... args) { + if (cl != null) { + try { + return cl.getMethod(functionName, args); + } + catch (NoSuchMethodException | SecurityException e) { + BetterEnd.LOGGER.error(e.getMessage()); + if (BetterEnd.isDevEnvironment()) { + e.printStackTrace(); + } + } + } + return null; + } + + public Method getInstanceMethod(Object instance, String functionName, Class... args) { + if (instance != null) { + try { + return instance.getClass().getDeclaredMethod(functionName, args); + } + catch (NoSuchMethodException | SecurityException e) { + BetterEnd.LOGGER.error(e.getMessage()); + if (BetterEnd.isDevEnvironment()) { + e.printStackTrace(); + } + } + } + return null; + } + + public Object executeMethod(Object instance, Method method, Object... args) { + if (method != null) { + try { + return method.invoke(instance, args); + } + catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + BetterEnd.LOGGER.error(e.getMessage()); + if (BetterEnd.isDevEnvironment()) { + e.printStackTrace(); + } + } + } + return null; + } + + public Object getAndExecuteStatic(Class cl, String functionName, Object... args) { + if (cl != null) { + Class[] classes = new Class[args.length]; + for (int i = 0; i < args.length; i++) { + classes[i] = args[i].getClass(); + } + Method method = getMethod(cl, functionName, classes); + return executeMethod(null, method, args); + } + return null; + } + + public Object getAndExecuteRuntime(Object instance, String functionName, Object... args) { + if (instance != null) { + Class[] classes = new Class[args.length]; + for (int i = 0; i < args.length; i++) { + classes[i] = args[i].getClass(); + } + Method method = getInstanceMethod(instance, functionName, classes); + return executeMethod(instance, method, args); + } + return null; + } + + public Object newInstance(Class cl, Object... args) { + if (cl != null) { + for (Constructor constructor: cl.getConstructors()) { + if (constructor.getParameterCount() == args.length) { + try { + return constructor.newInstance(args); + } + catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + BetterEnd.LOGGER.error(e.getMessage()); + if (BetterEnd.isDevEnvironment()) { + e.printStackTrace(); + } + } + } + } + } + return null; + } } From 4df9141d3d2d9b4b013121c72d63f7cd3e2437a7 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sat, 2 Jan 2021 20:56:25 +0300 Subject: [PATCH 087/463] Updated APIs --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index c01b64ec..569f2fa1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,6 +15,6 @@ # Dependencies # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api patchouli_version = 48-FABRIC - fabric_version = 0.27.1+1.16 + fabric_version = 0.29.1+1.16 canvas_version = 1.0.+ - rei_version = 5.8.7 \ No newline at end of file + rei_version = 5.8.10 \ No newline at end of file From acfe5eade7b6cccfc62c56c15fcce4c25f181907 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sat, 2 Jan 2021 20:56:33 +0300 Subject: [PATCH 088/463] Update BoneMealItemMixin.java --- .../java/ru/betterend/mixin/common/BoneMealItemMixin.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java index 490ce1cd..c133c80a 100644 --- a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java +++ b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java @@ -49,7 +49,7 @@ public class BoneMealItemMixin { } else { if (!world.getFluidState(offseted).isEmpty() && endBiome) { - if (world.getBlockState(offseted).equals(Blocks.WATER)) { + if (world.getBlockState(offseted).getBlock().equals(Blocks.WATER)) { consume = beGrowWaterGrass(world, blockPos); } } @@ -67,7 +67,7 @@ public class BoneMealItemMixin { } } else if (!world.getFluidState(offseted).isEmpty() && endBiome) { - if (world.getBlockState(offseted).equals(Blocks.WATER)) { + if (world.getBlockState(offseted).getBlock().equals(Blocks.WATER)) { info.setReturnValue(ActionResult.FAIL); info.cancel(); } From 382ea7ea11d026ece8fcc3ecd3f2cd3fbf93f5c5 Mon Sep 17 00:00:00 2001 From: Pyrofab Date: Sat, 2 Jan 2021 19:35:37 +0100 Subject: [PATCH 089/463] Avoid early return in CraftingScreenHandlerMixin --- .../betterend/mixin/common/CraftingScreenHandlerMixin.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/common/CraftingScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/CraftingScreenHandlerMixin.java index ac54037a..ded3676d 100644 --- a/src/main/java/ru/betterend/mixin/common/CraftingScreenHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/CraftingScreenHandlerMixin.java @@ -21,9 +21,10 @@ public abstract class CraftingScreenHandlerMixin @Inject(method = "canUse", at = @At("HEAD"), cancellable = true) private void canUse(PlayerEntity player, CallbackInfoReturnable info) { - info.setReturnValue(context.run((world, pos) -> { + if (context.run((world, pos) -> { return world.getBlockState(pos).getBlock() instanceof CraftingTableBlock; - }, true)); - info.cancel(); + }, true)) { + info.setReturnValue(true); + } } } From 72a402365d397fcbc2e49d4a7208ab0c3017954d Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 2 Jan 2021 22:28:44 +0300 Subject: [PATCH 090/463] Small namespace change --- src/main/java/ru/betterend/integration/AdornIntegration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/integration/AdornIntegration.java b/src/main/java/ru/betterend/integration/AdornIntegration.java index f87fc0c0..707daefe 100644 --- a/src/main/java/ru/betterend/integration/AdornIntegration.java +++ b/src/main/java/ru/betterend/integration/AdornIntegration.java @@ -19,7 +19,7 @@ public class AdornIntegration extends ModIntegration { Method create = getMethod(adornBlockBuilder, "create", blockVariant); Object builder = executeMethod(adornBlockBuilder, create, testVariant); getAndExecuteRuntime(builder, "withEverything"); - getAndExecuteRuntime(builder, "registerIn", "adorn"); + getAndExecuteRuntime(builder, "registerIn", BetterEnd.MOD_ID); } @Override From 2e56feec93b203603553c6bedf172eafc3f85f14 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 3 Jan 2021 00:49:16 +0300 Subject: [PATCH 091/463] Star textures --- .../mixin/client/WorldRendererMixin.java | 92 ++++++++++++++++-- .../assets/betterend/textures/sky/stars.png | Bin 0 -> 355 bytes 2 files changed, 83 insertions(+), 9 deletions(-) create mode 100644 src/main/resources/assets/betterend/textures/sky/stars.png diff --git a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java index abbed813..65e3d800 100644 --- a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java @@ -39,11 +39,13 @@ public class WorldRendererMixin { private static final Identifier NEBULA_1 = BetterEnd.makeID("textures/sky/nebula_2.png"); private static final Identifier NEBULA_2 = BetterEnd.makeID("textures/sky/nebula_3.png"); private static final Identifier HORIZON = BetterEnd.makeID("textures/sky/nebula_1.png"); + private static final Identifier STARS = BetterEnd.makeID("textures/sky/stars.png"); private static final Identifier FOG = BetterEnd.makeID("textures/sky/fog.png"); private static VertexBuffer stars1; private static VertexBuffer stars2; private static VertexBuffer stars3; + private static VertexBuffer stars4; private static VertexBuffer nebulas1; private static VertexBuffer nebulas2; private static VertexBuffer horizon; @@ -51,6 +53,7 @@ public class WorldRendererMixin { private static Vector3f axis1; private static Vector3f axis2; private static Vector3f axis3; + private static Vector3f axis4; private static float time; private static boolean directOpenGL = false; @@ -75,9 +78,11 @@ public class WorldRendererMixin { axis1 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); axis2 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); axis3 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); + axis4 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); axis1.normalize(); axis2.normalize(); axis3.normalize(); + axis4.normalize(); directOpenGL = FabricLoader.getInstance().isModLoaded("optifabric") || FabricLoader.getInstance().isModLoaded("immersive_portals"); } @@ -122,6 +127,18 @@ public class WorldRendererMixin { textureManager.bindTexture(NEBULA_2); renderBuffer(matrices, nebulas2, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, 0.2F * blindA); matrices.pop(); + + textureManager.bindTexture(STARS); + + matrices.push(); + matrices.multiply(axis3.getDegreesQuaternion(time)); + renderBuffer(matrices, stars3, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, 0.6F * blindA); + matrices.pop(); + + matrices.push(); + matrices.multiply(axis4.getDegreesQuaternion(time * 2)); + renderBuffer(matrices, stars4, VertexFormats.POSITION_TEXTURE, 1F, 1F, 1F, 0.6F * blindA); + matrices.pop(); } float a = (BackgroundInfo.fog - 1F); @@ -143,11 +160,6 @@ public class WorldRendererMixin { matrices.multiply(new Quaternion(axis2, time * 2, true)); renderBuffer(matrices, stars2, VertexFormats.POSITION, 0.95F, 0.64F, 0.93F, 0.6F * blindA); matrices.pop(); - - matrices.push(); - matrices.multiply(new Quaternion(axis3, time, true)); - renderBuffer(matrices, stars3, VertexFormats.POSITION, 0.77F, 0.31F, 0.73F, 0.6F * blindA); - matrices.pop(); } RenderSystem.enableTexture(); @@ -168,16 +180,17 @@ public class WorldRendererMixin { private void initStars() { BufferBuilder buffer = Tessellator.getInstance().getBuffer(); - stars1 = buildBuffer(buffer, stars1, 0.1, 0.30, 3500, 41315); - stars2 = buildBuffer(buffer, stars2, 0.1, 0.35, 2000, 35151); - stars3 = buildBuffer(buffer, stars3, 0.1, 0.40, 1500, 61354); + stars1 = buildBufferStars(buffer, stars1, 0.1, 0.30, 3500, 41315); + stars2 = buildBufferStars(buffer, stars2, 0.1, 0.35, 2000, 35151); + stars3 = buildBufferUVStars(buffer, stars3, 0.4, 1.2, 1000, 61354); + stars4 = buildBufferUVStars(buffer, stars4, 0.4, 1.2, 1000, 61355); nebulas1 = buildBufferFarFog(buffer, nebulas1, 40, 60, 30, 11515); nebulas2 = buildBufferFarFog(buffer, nebulas2, 40, 60, 10, 14151); horizon = buildBufferHorizon(buffer, horizon); fog = buildBufferFog(buffer, fog); } - private VertexBuffer buildBuffer(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { + private VertexBuffer buildBufferStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { if (buffer != null) { buffer.close(); } @@ -190,6 +203,19 @@ public class WorldRendererMixin { return buffer; } + private VertexBuffer buildBufferUVStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { + if (buffer != null) { + buffer.close(); + } + + buffer = new VertexBuffer(VertexFormats.POSITION_TEXTURE); + makeUVStars(bufferBuilder, minSize, maxSize, count, seed); + bufferBuilder.end(); + buffer.upload(bufferBuilder); + + return buffer; + } + private VertexBuffer buildBufferFarFog(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { if (buffer != null) { buffer.close(); @@ -272,6 +298,54 @@ public class WorldRendererMixin { } } + private void makeUVStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { + Random random = new Random(seed); + buffer.begin(7, VertexFormats.POSITION_TEXTURE); + + for (int i = 0; i < count; ++i) { + double posX = random.nextDouble() * 2.0 - 1.0; + double posY = random.nextDouble() * 2.0 - 1.0; + double posZ = random.nextDouble() * 2.0 - 1.0; + double size = MHelper.randRange(minSize, maxSize, random); + double length = posX * posX + posY * posY + posZ * posZ; + if (length < 1.0 && length > 0.001) { + length = 1.0 / Math.sqrt(length); + posX *= length; + posY *= length; + posZ *= length; + double j = posX * 100.0; + double k = posY * 100.0; + double l = posZ * 100.0; + double m = Math.atan2(posX, posZ); + double n = Math.sin(m); + double o = Math.cos(m); + double p = Math.atan2(Math.sqrt(posX * posX + posZ * posZ), posY); + double q = Math.sin(p); + double r = Math.cos(p); + double s = random.nextDouble() * Math.PI * 2.0; + double t = Math.sin(s); + double u = Math.cos(s); + + int pos = 0; + float minV = random.nextInt(4) / 4F; + for (int v = 0; v < 4; ++v) { + double x = (double) ((v & 2) - 1) * size; + double y = (double) ((v + 1 & 2) - 1) * size; + double aa = x * u - y * t; + double ab = y * u + x * t; + double ad = aa * q + 0.0 * r; + double ae = 0.0 * q - aa * r; + double af = ae * n - ab * o; + double ah = ab * n + ae * o; + float texU = (pos >> 1) & 1; + float texV = (((pos + 1) >> 1) & 1) / 4F + minV; + pos ++; + buffer.vertex(j + af, k + ad, l + ah).texture(texU, texV).next(); + } + } + } + } + private void makeFarFog(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { Random random = new Random(seed); buffer.begin(7, VertexFormats.POSITION_TEXTURE); diff --git a/src/main/resources/assets/betterend/textures/sky/stars.png b/src/main/resources/assets/betterend/textures/sky/stars.png new file mode 100644 index 0000000000000000000000000000000000000000..c011e8c76e3431a5684fdaa59eea1951598aefe4 GIT binary patch literal 355 zcmV-p0i6DcP)3f-YK@Ep$d_|f2A}r>mce(lHXi&F)%XVlM%aH{ z2PKBGDxwl44gikseFrk;#7bnd!jl&OyuF8>ko1BQKNw2xKq}{~nUt2Z*cbM4-U&(w z#0jP8psAxZ^AqWQn8K>Cas*ZFz4@>$+WL++;11Z(v22r6l&1gy002ovPDHLkV1j Date: Sun, 3 Jan 2021 16:04:58 +0300 Subject: [PATCH 092/463] Infusion enchantment books --- .../java/ru/betterend/config/ConfigKey.java | 2 +- .../java/ru/betterend/config/PathConfig.java | 2 +- .../ru/betterend/item/EnchantedPetal.java | 23 + .../ru/betterend/item/EternalCrystal.java | 3 +- .../ru/betterend/recipe/InfusionRecipes.java | 521 ++++++++++++++++++ .../recipe/builders/InfusionRecipe.java | 30 +- .../java/ru/betterend/registry/EndItems.java | 15 +- .../assets/betterend/lang/en_us.json | 1 + .../assets/betterend/lang/ru_ru.json | 1 + 9 files changed, 586 insertions(+), 12 deletions(-) create mode 100644 src/main/java/ru/betterend/item/EnchantedPetal.java diff --git a/src/main/java/ru/betterend/config/ConfigKey.java b/src/main/java/ru/betterend/config/ConfigKey.java index ad977fdb..89a8561b 100644 --- a/src/main/java/ru/betterend/config/ConfigKey.java +++ b/src/main/java/ru/betterend/config/ConfigKey.java @@ -65,7 +65,7 @@ public class ConfigKey { @Override public String toString() { if (root) { - return String.format("ROOT:%s", entry); + return String.format("[root]:%s", entry); } String p = path[0]; for (int i = 1; i < path.length; i++) { diff --git a/src/main/java/ru/betterend/config/PathConfig.java b/src/main/java/ru/betterend/config/PathConfig.java index 06b98be0..dc3db652 100644 --- a/src/main/java/ru/betterend/config/PathConfig.java +++ b/src/main/java/ru/betterend/config/PathConfig.java @@ -20,7 +20,7 @@ public class PathConfig extends Config { } protected ConfigKey createKey(String key) { - return new ConfigKey(key, ""); + return createKey("", key); } @Nullable diff --git a/src/main/java/ru/betterend/item/EnchantedPetal.java b/src/main/java/ru/betterend/item/EnchantedPetal.java new file mode 100644 index 00000000..8a6146a6 --- /dev/null +++ b/src/main/java/ru/betterend/item/EnchantedPetal.java @@ -0,0 +1,23 @@ +package ru.betterend.item; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.Rarity; +import ru.betterend.patterns.Patterns; +import ru.betterend.registry.EndItems; + +public class EnchantedPetal extends PatternedItem { + + public EnchantedPetal() { + super(EndItems.makeItemSettings().rarity(Rarity.RARE).maxCount(16)); + } + + @Override + public boolean hasGlint(ItemStack stack) { + return true; + } + + @Override + public String getModelPattern(String name) { + return Patterns.createJson(Patterns.ITEM_GENERATED, "item/hydralux_petal"); + } +} diff --git a/src/main/java/ru/betterend/item/EternalCrystal.java b/src/main/java/ru/betterend/item/EternalCrystal.java index 656c4b32..eded04d0 100644 --- a/src/main/java/ru/betterend/item/EternalCrystal.java +++ b/src/main/java/ru/betterend/item/EternalCrystal.java @@ -1,10 +1,11 @@ package ru.betterend.item; +import net.minecraft.util.Rarity; import ru.betterend.registry.EndItems; public class EternalCrystal extends PatternedItem { public EternalCrystal() { - super(EndItems.makeItemSettings().maxCount(16)); + super(EndItems.makeItemSettings().maxCount(16).rarity(Rarity.EPIC)); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/recipe/InfusionRecipes.java b/src/main/java/ru/betterend/recipe/InfusionRecipes.java index f365e231..b4d3b97e 100644 --- a/src/main/java/ru/betterend/recipe/InfusionRecipes.java +++ b/src/main/java/ru/betterend/recipe/InfusionRecipes.java @@ -1,5 +1,11 @@ package ru.betterend.recipe; +import net.minecraft.block.Blocks; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentLevelEntry; +import net.minecraft.enchantment.Enchantments; +import net.minecraft.item.EnchantedBookItem; +import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import ru.betterend.recipe.builders.InfusionRecipe; import ru.betterend.registry.EndBlocks; @@ -66,5 +72,520 @@ public class InfusionRecipes { .addCatalyst(6, EndItems.CRYSTAL_SHARDS) .setTime(150) .build(); + + InfusionRecipe.Builder.create("enchanted_petal") + .setInput(EndItems.HYDRALUX_PETAL) + .setOutput(EndItems.ENCHANTED_PETAL) + .addCatalyst(0, EndItems.CRYSTAL_SHARDS) + .addCatalyst(2, EndItems.CRYSTAL_SHARDS) + .addCatalyst(4, EndItems.CRYSTAL_SHARDS) + .addCatalyst(6, EndItems.CRYSTAL_SHARDS) + .setTime(75) + .build(); + + InfusionRecipe.Builder.create("protection_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.PROTECTION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(4, Items.TURTLE_HELMET) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("fire_protection_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FIRE_PROTECTION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.BLAZE_ROD) + .addCatalyst(4, Items.BLAZE_ROD) + .addCatalyst(6, Items.BLAZE_ROD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("feather_falling_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FEATHER_FALLING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.FEATHER) + .addCatalyst(4, Items.FEATHER) + .addCatalyst(6, Items.FEATHER) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("blast_protection_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.BLAST_PROTECTION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.OBSIDIAN) + .addCatalyst(4, Blocks.OBSIDIAN) + .addCatalyst(6, Blocks.OBSIDIAN) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("projectile_protection_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.PROJECTILE_PROTECTION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.SCUTE) + .addCatalyst(4, Items.SHIELD) + .addCatalyst(6, Items.SCUTE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("respiration_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.RESPIRATION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.NAUTILUS_SHELL) + .addCatalyst(4, Items.NAUTILUS_SHELL) + .addCatalyst(6, Items.NAUTILUS_SHELL) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("aqua_affinity_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.AQUA_AFFINITY, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.PRISMARINE_CRYSTALS) + .addCatalyst(4, Items.PRISMARINE_CRYSTALS) + .addCatalyst(6, Items.PRISMARINE_CRYSTALS) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("thorns_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.THORNS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.CACTUS) + .addCatalyst(4, Blocks.CACTUS) + .addCatalyst(6, Blocks.CACTUS) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("depth_strider_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.DEPTH_STRIDER, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.LILY_PAD) + .addCatalyst(4, EndBlocks.END_LILY_SEED) + .addCatalyst(6, Blocks.LILY_PAD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("frost_walker_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FROST_WALKER, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(4, EndBlocks.ANCIENT_EMERALD_ICE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("soul_speed_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SOUL_SPEED, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.SOUL_SAND, Blocks.SOUL_SOIL) + .addCatalyst(4, Blocks.SOUL_SAND, Blocks.SOUL_SOIL) + .addCatalyst(6, Blocks.SOUL_SAND, Blocks.SOUL_SOIL) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("sharpness_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SHARPNESS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(4, Items.NETHERITE_SCRAP) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("smite_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SMITE, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.SUNFLOWER) + .addCatalyst(4, Items.GOLD_INGOT) + .addCatalyst(6, Blocks.SUNFLOWER) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("bane_of_arthropods_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.BANE_OF_ARTHROPODS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.FERMENTED_SPIDER_EYE) + .addCatalyst(4, Items.IRON_INGOT) + .addCatalyst(6, Items.FERMENTED_SPIDER_EYE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("knockback_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.KNOCKBACK, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.REDSTONE) + .addCatalyst(4, Blocks.PISTON) + .addCatalyst(6, Items.REDSTONE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("fire_aspect_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FIRE_ASPECT, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.BLAZE_POWDER) + .addCatalyst(4, Items.MAGMA_CREAM) + .addCatalyst(6, Items.BLAZE_POWDER) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("looting_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.LOOTING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.EMERALD) + .addCatalyst(4, Items.GOLD_INGOT) + .addCatalyst(6, Items.EMERALD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("sweeping_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SWEEPING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.GOLDEN_SWORD) + .addCatalyst(4, Items.IRON_SWORD) + .addCatalyst(6, Items.GOLDEN_SWORD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("efficiency_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.EFFICIENCY, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, EndItems.AMBER_GEM) + .addCatalyst(4, EndItems.AMBER_GEM) + .addCatalyst(6, EndItems.AMBER_GEM) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("silk_touch_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SILK_TOUCH, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.COBWEB) + .addCatalyst(4, Blocks.COBWEB) + .addCatalyst(6, Blocks.COBWEB) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); + InfusionRecipe.Builder.create("unbreaking_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.UNBREAKING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.DIAMOND) + .addCatalyst(4, Items.DIAMOND) + .addCatalyst(6, Items.DIAMOND) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("fortune_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FORTUNE, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.EMERALD) + .addCatalyst(4, Items.RABBIT_FOOT) + .addCatalyst(6, Items.EMERALD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("power_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.POWER, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, EndItems.AMBER_GEM) + .addCatalyst(4, Items.DIAMOND_SWORD) + .addCatalyst(6, EndItems.AMBER_GEM) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("punch_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.PUNCH, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.POPPED_CHORUS_FRUIT) + .addCatalyst(4, Items.SPECTRAL_ARROW) + .addCatalyst(6, Items.POPPED_CHORUS_FRUIT) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("flame_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FLAME, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.BLAZE_POWDER) + .addCatalyst(4, Items.SPECTRAL_ARROW) + .addCatalyst(6, Items.BLAZE_POWDER) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("infinity_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.INFINITY, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.SPECTRAL_ARROW) + .addCatalyst(4, EndItems.ETERNAL_CRYSTAL) + .addCatalyst(6, Items.SPECTRAL_ARROW) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); + InfusionRecipe.Builder.create("luck_of_sea_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.LUCK_OF_THE_SEA, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.EMERALD) + .addCatalyst(4, Items.FISHING_ROD) + .addCatalyst(6, Items.EMERALD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("lure_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.LURE, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.GOLD_NUGGET) + .addCatalyst(4, Items.FISHING_ROD) + .addCatalyst(6, Items.GOLD_NUGGET) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("loyalty_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.LOYALTY, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.ENDER_EYE) + .addCatalyst(4, Items.HEART_OF_THE_SEA) + .addCatalyst(6, Items.ENDER_EYE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); + InfusionRecipe.Builder.create("impaling_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.IMPALING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.PRISMARINE_SHARD) + .addCatalyst(4, Items.IRON_SWORD) + .addCatalyst(6, Items.PRISMARINE_SHARD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("riptide_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.RIPTIDE, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.LEAD) + .addCatalyst(4, Items.HEART_OF_THE_SEA) + .addCatalyst(6, Items.LEAD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); + InfusionRecipe.Builder.create("channeling_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.CHANNELING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.CHAIN) + .addCatalyst(4, Items.HEART_OF_THE_SEA) + .addCatalyst(6, Items.CHAIN) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); + InfusionRecipe.Builder.create("multishot_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.MULTISHOT, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.ARROW) + .addCatalyst(4, Items.SPECTRAL_ARROW) + .addCatalyst(6, Items.ARROW) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("quick_charge_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.QUICK_CHARGE, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.QUARTZ) + .addCatalyst(4, Items.GLOWSTONE_DUST) + .addCatalyst(6, Items.QUARTZ) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("piercing_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.PIERCING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.GLOWSTONE_DUST) + .addCatalyst(4, Items.SPECTRAL_ARROW) + .addCatalyst(6, Items.GLOWSTONE_DUST) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("mending_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.MENDING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.EXPERIENCE_BOTTLE) + .addCatalyst(4, Blocks.ANVIL) + .addCatalyst(6, Items.EXPERIENCE_BOTTLE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); + } + + private static ItemStack createEnchantedBook(Enchantment enchantment, int level) { + ItemStack book = new ItemStack(Items.ENCHANTED_BOOK); + EnchantedBookItem.addEnchantment(book, new EnchantmentLevelEntry(enchantment, level)); + return book; } } diff --git a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java index 20574831..9e9db019 100644 --- a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java @@ -4,6 +4,8 @@ import java.util.Arrays; import com.google.gson.JsonObject; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; import net.minecraft.network.PacketByteBuf; @@ -15,6 +17,7 @@ import net.minecraft.util.Identifier; import net.minecraft.util.JsonHelper; import net.minecraft.util.collection.DefaultedList; import net.minecraft.world.World; + import ru.betterend.BetterEnd; import ru.betterend.recipe.EndRecipeManager; import ru.betterend.rituals.InfusionRitual; @@ -32,6 +35,7 @@ public class InfusionRecipe implements Recipe { private ItemStack output; private int time = 1; private Ingredient[] catalysts = new Ingredient[8]; + private String group; private InfusionRecipe(Identifier id) { this(id, null, null); @@ -87,6 +91,12 @@ public class InfusionRecipe implements Recipe { public Identifier getId() { return this.id; } + + @Override + @Environment(EnvType.CLIENT) + public String getGroup() { + return this.group; + } @Override public RecipeSerializer getSerializer() { @@ -119,6 +129,7 @@ public class InfusionRecipe implements Recipe { private Identifier id; private Ingredient input; private ItemStack output; + private String group; private int time = 1; private Ingredient[] catalysts = new Ingredient[8]; @@ -126,6 +137,11 @@ public class InfusionRecipe implements Recipe { Arrays.fill(catalysts, Ingredient.EMPTY); } + public Builder setGroup(String group) { + this.group = group; + return this; + } + public Builder setInput(ItemConvertible input) { this.input = Ingredient.ofItems(input); return this; @@ -137,14 +153,20 @@ public class InfusionRecipe implements Recipe { return this; } + public Builder setOutput(ItemStack output) { + this.output = output; + this.output.setCount(1); + return this; + } + public Builder setTime(int time) { this.time = time; return this; } - public Builder addCatalyst(int slot, ItemConvertible item) { + public Builder addCatalyst(int slot, ItemConvertible... items) { if (slot > 7) return this; - this.catalysts[slot] = Ingredient.ofItems(item); + this.catalysts[slot] = Ingredient.ofItems(items); return this; } @@ -158,6 +180,7 @@ public class InfusionRecipe implements Recipe { return; } InfusionRecipe recipe = new InfusionRecipe(id, input, output); + recipe.group = group != null ? group : GROUP; recipe.time = time; int empty = 0; for (int i = 0; i < catalysts.length; i++) { @@ -182,6 +205,7 @@ public class InfusionRecipe implements Recipe { if (recipe.output == null) { throw new IllegalStateException("Output item does not exists!"); } + recipe.group = JsonHelper.getString(json, "group", GROUP); recipe.time = JsonHelper.getInt(json, "time", 1); JsonObject catalysts = JsonHelper.asObject(json, "catalysts"); @@ -210,6 +234,7 @@ public class InfusionRecipe implements Recipe { InfusionRecipe recipe = new InfusionRecipe(id); recipe.input = Ingredient.fromPacket(buffer); recipe.output = buffer.readItemStack(); + recipe.group = buffer.readString(); recipe.time = buffer.readVarInt(); for (int i = 0; i < 8; i++) { recipe.catalysts[i] = Ingredient.fromPacket(buffer); @@ -221,6 +246,7 @@ public class InfusionRecipe implements Recipe { public void write(PacketByteBuf buffer, InfusionRecipe recipe) { recipe.input.write(buffer); buffer.writeItemStack(recipe.output); + buffer.writeString(recipe.group); buffer.writeVarInt(recipe.time); for (int i = 0; i < 8; i++) { recipe.catalysts[i].write(buffer); diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index 03076eb2..bc3108e1 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -28,11 +28,13 @@ import net.minecraft.item.ToolItem; import net.minecraft.item.ToolMaterials; import net.minecraft.tag.Tag; import net.minecraft.util.Identifier; +import net.minecraft.util.Rarity; import net.minecraft.util.math.BlockPointer; import net.minecraft.util.math.Direction; import net.minecraft.util.registry.Registry; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; +import ru.betterend.item.EnchantedPetal; import ru.betterend.item.EndArmorMaterial; import ru.betterend.item.EndAxe; import ru.betterend.item.EndHammer; @@ -64,6 +66,8 @@ public class EndItems { public final static Item CRYSTALLINE_SULPHUR = registerItem("crystalline_sulphur"); public final static Item HYDRALUX_PETAL = registerItem("hydralux_petal"); public final static Item GELATINE = registerItem("gelatine"); + public static final Item ETERNAL_CRYSTAL = registerItem("eternal_crystal", new EternalCrystal()); + public final static Item ENCHANTED_PETAL = registerItem("enchanted_petal", new EnchantedPetal()); // Armor // public static final Item TERMINITE_HELMET = registerItem("terminite_helmet", new ArmorItem(EndArmorMaterial.TERMINITE, EquipmentSlot.HEAD, makeItemSettings())); @@ -74,10 +78,10 @@ public class EndItems { public static final Item AETERNIUM_CHESTPLATE = registerItem("aeternium_chestplate", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.CHEST, makeItemSettings())); public static final Item AETERNIUM_LEGGINGS = registerItem("aeternium_leggings", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.LEGS, makeItemSettings())); public static final Item AETERNIUM_BOOTS = registerItem("aeternium_boots", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.FEET, makeItemSettings())); - public static final Item CRYSTALITE_HELMET = registerItem("crystalite_helmet", new ArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.HEAD, makeItemSettings())); - public static final Item CRYSTALITE_CHESTPLATE = registerItem("crystalite_chestplate", new ArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.CHEST, makeItemSettings())); - public static final Item CRYSTALITE_LEGGINGS = registerItem("crystalite_leggings", new ArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.LEGS, makeItemSettings())); - public static final Item CRYSTALITE_BOOTS = registerItem("crystalite_boots", new ArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.FEET, makeItemSettings())); + public static final Item CRYSTALITE_HELMET = registerItem("crystalite_helmet", new ArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.HEAD, makeItemSettings().rarity(Rarity.UNCOMMON))); + public static final Item CRYSTALITE_CHESTPLATE = registerItem("crystalite_chestplate", new ArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.CHEST, makeItemSettings().rarity(Rarity.UNCOMMON))); + public static final Item CRYSTALITE_LEGGINGS = registerItem("crystalite_leggings", new ArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.LEGS, makeItemSettings().rarity(Rarity.UNCOMMON))); + public static final Item CRYSTALITE_BOOTS = registerItem("crystalite_boots", new ArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.FEET, makeItemSettings().rarity(Rarity.UNCOMMON))); // Tools // public static final ToolItem TERMINITE_SHOVEL = registerTool("terminite_shovel", new ShovelItem(EndToolMaterial.TERMINITE, 1.5F, -3.0F, makeItemSettings())); @@ -109,9 +113,6 @@ public class EndItems { // Drinks public final static Item UMBRELLA_CLUSTER_JUICE = registerDrink("umbrella_cluster_juice"); - // Other // - public static final Item ETERNAL_CRYSTAL = registerItem("eternal_crystal", new EternalCrystal()); - protected static Item registerItem(String name) { return registerItem(BetterEnd.makeID(name), new PatternedItem(makeItemSettings())); } diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 23c130b3..b97b5efa 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -412,6 +412,7 @@ "block.betterend.hydralux_sapling": "Hydralux Sapling", "block.betterend.hydrothermal_vent": "Hydrothermal Vent", "item.betterend.hydralux_petal": "Hydralux Petal", + "item.betterend.enchanted_petal": "Enchanted Petal", "block.betterend.menger_sponge": "Menger Sponge", "block.betterend.menger_sponge_wet": "Wet Menger Sponge", diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index b45499a0..f443c880 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -414,6 +414,7 @@ "block.betterend.hydralux_sapling": "Саженец гидралюкса", "block.betterend.hydrothermal_vent": "Гидротермальный источник", "item.betterend.hydralux_petal": "Лепесток гидралюкса", + "item.betterend.enchanted_petal": "Зачарованный лепесток", "block.betterend.menger_sponge": "Губка Менгера", "block.betterend.menger_sponge_wet": "Мокрая губка Менгера", From 08d104b49bf891b4e35704f65e1d347838a3df22 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sun, 3 Jan 2021 22:55:29 +0300 Subject: [PATCH 093/463] Fabric Entity Events API compatibility --- gradle.properties | 2 +- src/main/java/ru/betterend/mixin/common/EntityMixin.java | 4 +++- src/main/java/ru/betterend/recipe/InfusionRecipes.java | 2 +- src/main/resources/fabric.mod.json | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/gradle.properties b/gradle.properties index 569f2fa1..362d8c53 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,6 +15,6 @@ # Dependencies # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api patchouli_version = 48-FABRIC - fabric_version = 0.29.1+1.16 + fabric_version = 0.29.2+1.16 canvas_version = 1.0.+ rei_version = 5.8.10 \ No newline at end of file diff --git a/src/main/java/ru/betterend/mixin/common/EntityMixin.java b/src/main/java/ru/betterend/mixin/common/EntityMixin.java index 3710312a..f398271c 100644 --- a/src/main/java/ru/betterend/mixin/common/EntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EntityMixin.java @@ -8,6 +8,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import net.fabricmc.fabric.api.entity.event.v1.ServerEntityWorldChangeEvents; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.server.world.ServerWorld; @@ -69,10 +70,11 @@ public abstract class EntityMixin implements TeleportingEntity { } this.removed = true; this.world.getProfiler().pop(); - ((ServerWorld) this.world).resetIdleTimeout(); + ((ServerWorld) world).resetIdleTimeout(); destination.resetIdleTimeout(); this.world.getProfiler().pop(); this.beExitPos = null; + ServerEntityWorldChangeEvents.AFTER_ENTITY_CHANGE_WORLD.invoker().afterChangeWorld(Entity.class.cast(this), entity, (ServerWorld) world, (ServerWorld) entity.world); info.setReturnValue(entity); info.cancel(); } diff --git a/src/main/java/ru/betterend/recipe/InfusionRecipes.java b/src/main/java/ru/betterend/recipe/InfusionRecipes.java index b4d3b97e..d7120fec 100644 --- a/src/main/java/ru/betterend/recipe/InfusionRecipes.java +++ b/src/main/java/ru/betterend/recipe/InfusionRecipes.java @@ -348,7 +348,7 @@ public class InfusionRecipes { .setOutput(createEnchantedBook(Enchantments.SILK_TOUCH, 1)) .addCatalyst(0, EndItems.ENCHANTED_PETAL) .addCatalyst(2, Blocks.COBWEB) - .addCatalyst(4, Blocks.COBWEB) + .addCatalyst(4, EndItems.ETERNAL_CRYSTAL) .addCatalyst(6, Blocks.COBWEB) .addCatalyst(1, Items.LAPIS_LAZULI) .addCatalyst(3, Items.LAPIS_LAZULI) diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index f7500c1d..d1cd1e96 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -39,7 +39,7 @@ "depends": { "fabricloader": ">=0.10.0", - "fabric": ">=0.26.0", + "fabric": ">=0.29.0", "minecraft": ">=1.16.3" } } From 07b2143d409a4cc15e880f1919e3e50da7c49698 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 5 Jan 2021 01:46:54 +0300 Subject: [PATCH 094/463] Search fix --- src/main/java/ru/betterend/blocks/EndPortalBlock.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index 806e8165..81470d25 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -99,7 +99,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable Direction direction = Direction.EAST; BlockPos.Mutable checkPos = basePos.mutableCopy(); for (int step = 1; step < 64; step++) { - for (int i = 0; i < step; i++) { + for (int i = 0; i < (step >> 1); i++) { checkPos.setY(5); int ceil = world.getChunk(basePos).sampleHeightmap(Heightmap.Type.WORLD_SURFACE, checkPos.getX(), checkPos.getZ()) + 1; if (ceil < 5) continue; From 3283f9763b4b31c2206295947e00a46b1864dd00 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 5 Jan 2021 01:57:47 +0300 Subject: [PATCH 095/463] Find center fix --- .../java/ru/betterend/blocks/EndPortalBlock.java | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index 81470d25..a6d4ba60 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -16,6 +16,7 @@ import net.minecraft.sound.SoundEvents; import net.minecraft.util.BlockRotation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Direction.AxisDirection; import net.minecraft.util.registry.Registry; import net.minecraft.world.Heightmap; import net.minecraft.world.World; @@ -146,17 +147,10 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable BlockState right, left; Direction rightDir, leftDir; - if (axis == Direction.Axis.X) { - right = world.getBlockState(pos.east()); - left = world.getBlockState(pos.west()); - rightDir = Direction.EAST; - leftDir = Direction.WEST; - } else { - right = world.getBlockState(pos.south()); - left = world.getBlockState(pos.north()); - rightDir = Direction.SOUTH; - leftDir = Direction.NORTH; - } + rightDir = Direction.from(axis, AxisDirection.POSITIVE); + leftDir = rightDir.getOpposite(); + right = world.getBlockState(pos.offset(rightDir)); + left = world.getBlockState(pos.offset(leftDir)); BlockState down = world.getBlockState(pos.down()); if (down.isOf(this)) { return findCenter(world, pos.move(Direction.DOWN), axis, ++step); From c4384c7419c850946f29056987cf0bbce85250a5 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 5 Jan 2021 01:59:28 +0300 Subject: [PATCH 096/463] Less steps --- src/main/java/ru/betterend/blocks/EndPortalBlock.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index a6d4ba60..b934b1f8 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -143,8 +143,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable } private BlockPos.Mutable findCenter(World world, BlockPos.Mutable pos, Direction.Axis axis, int step) { - if (step > 21) return pos; - + if (step > 4) return pos; BlockState right, left; Direction rightDir, leftDir; rightDir = Direction.from(axis, AxisDirection.POSITIVE); From 2fc9418e96d95212c681b6c6e34ae47173eb8aac Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 5 Jan 2021 02:02:10 +0300 Subject: [PATCH 097/463] Corrected steps --- src/main/java/ru/betterend/blocks/EndPortalBlock.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index b934b1f8..76e081c7 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -143,7 +143,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable } private BlockPos.Mutable findCenter(World world, BlockPos.Mutable pos, Direction.Axis axis, int step) { - if (step > 4) return pos; + if (step > 8) return pos; BlockState right, left; Direction rightDir, leftDir; rightDir = Direction.from(axis, AxisDirection.POSITIVE); @@ -152,7 +152,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable left = world.getBlockState(pos.offset(leftDir)); BlockState down = world.getBlockState(pos.down()); if (down.isOf(this)) { - return findCenter(world, pos.move(Direction.DOWN), axis, ++step); + return findCenter(world, pos.move(Direction.DOWN), axis, step); } else if (right.isOf(this) && left.isOf(this)) { return pos; } else if (right.isOf(this)) { From cd6fc93488980cbca5746fc3e5e99dd05794c876 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Tue, 5 Jan 2021 02:07:44 +0300 Subject: [PATCH 098/463] Aeternium tools parts, multiple Anvil crafts with same input --- psd/tool_items.psd | Bin 43494 -> 49358 bytes .../AnvilScreenHandlerExtended.java | 11 ++ .../mixin/client/AnvilScreenMixin.java | 102 ++++++++++++++++++ .../mixin/common/AnvilScreenHandlerMixin.java | 52 ++++++--- .../ru/betterend/recipe/CraftingRecipes.java | 34 ++++-- .../ru/betterend/recipe/SmithingRecipes.java | 25 +++++ .../java/ru/betterend/registry/EndItems.java | 11 ++ .../betterend/textures/item/aeternium_axe.png | Bin 372 -> 462 bytes .../textures/item/aeternium_axe_head.png | Bin 0 -> 355 bytes .../textures/item/aeternium_hammer.png | Bin 395 -> 530 bytes .../textures/item/aeternium_hammer_head.png | Bin 0 -> 435 bytes .../betterend/textures/item/aeternium_hoe.png | Bin 312 -> 446 bytes .../textures/item/aeternium_hoe_head.png | Bin 0 -> 300 bytes .../textures/item/aeternium_pickaxe.png | Bin 420 -> 557 bytes .../textures/item/aeternium_pickaxe_head.png | Bin 0 -> 423 bytes .../textures/item/aeternium_shovel.png | Bin 282 -> 376 bytes .../textures/item/aeternium_shovel_head.png | Bin 0 -> 262 bytes .../textures/item/aeternium_sword.png | Bin 542 -> 629 bytes .../textures/item/aeternium_sword_blade.png | Bin 0 -> 359 bytes .../textures/item/aeternium_sword_handle.png | Bin 0 -> 439 bytes .../textures/item/leather_stripe.png | Bin 0 -> 332 bytes .../textures/item/leather_wrapped_stick.png | Bin 0 -> 316 bytes .../resources/betterend.mixins.client.json | 5 +- .../resources/betterend.mixins.common.json | 2 +- 24 files changed, 216 insertions(+), 26 deletions(-) create mode 100644 src/main/java/ru/betterend/interfaces/AnvilScreenHandlerExtended.java create mode 100644 src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java create mode 100644 src/main/resources/assets/betterend/textures/item/aeternium_axe_head.png create mode 100644 src/main/resources/assets/betterend/textures/item/aeternium_hammer_head.png create mode 100644 src/main/resources/assets/betterend/textures/item/aeternium_hoe_head.png create mode 100644 src/main/resources/assets/betterend/textures/item/aeternium_pickaxe_head.png create mode 100644 src/main/resources/assets/betterend/textures/item/aeternium_shovel_head.png create mode 100644 src/main/resources/assets/betterend/textures/item/aeternium_sword_blade.png create mode 100644 src/main/resources/assets/betterend/textures/item/aeternium_sword_handle.png create mode 100644 src/main/resources/assets/betterend/textures/item/leather_stripe.png create mode 100644 src/main/resources/assets/betterend/textures/item/leather_wrapped_stick.png diff --git a/psd/tool_items.psd b/psd/tool_items.psd index 036b30d2943647c3b984872236dc1090b94a6350..e3fa9647a6ad30d3f8073faee0670d285e392b0b 100644 GIT binary patch delta 4834 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 RjI@SOT2IT#;2pmX{To1VMq~g0 delta 1213 zcma))ZD>*~|4H&)ufdEFAq0HscRKKPv zPQS-n;q?36Tb*4#uiL5hcq;s^Zmp}^=YoR#WZwVkL=jV!>0kTCO)V(hB%u*;De9bK zLJOoII*^wS^DTQ;@r%*1>gkVc!XiNtLS$779wAJs2v;i93ofc^gdia`f+|GdK#`ZZdxzcIQ>^bmW7Pcn|*X#gRq*^wPfTv)ERQa+0YW+@*#~F zXvB?DwQf`zmUuf-!*~C{cjEfxi#+CfzPop)?cA->PsYTLHNtTtYJaDY5WA1g`h4J-mOg}-}`pTdn z+L+Zv1-g&YwN`l6;$>_(VQK|p@{x(p?@ zxL~})#Cjg<3=&(`WVI|Jb+8zBUkH>rSB)w>r9QXYqswp zyafC^-w5!-uCw`2KYreTh7L}kWPB1GKeR0O56O6=5u6iA9&AVM8=?AGIuA~r)QT&c z`eZ2(+$Z9{a6!|48JjBinlXNd4aCS`EN1X~Qty}lz!}QkVoWs(CORs;&9b#I8kh92 zw^zp2hPai6i9y098YTt}6Gp>Cqq~U?zpX^JHZ&ikVcRl2d>|VpMh5dzHccFwCXl9y JMzL$%e*;|Xy4e5# diff --git a/src/main/java/ru/betterend/interfaces/AnvilScreenHandlerExtended.java b/src/main/java/ru/betterend/interfaces/AnvilScreenHandlerExtended.java new file mode 100644 index 00000000..2c6fbc71 --- /dev/null +++ b/src/main/java/ru/betterend/interfaces/AnvilScreenHandlerExtended.java @@ -0,0 +1,11 @@ +package ru.betterend.interfaces; + +import java.util.List; + +import ru.betterend.recipe.builders.AnvilSmithingRecipe; + +public interface AnvilScreenHandlerExtended { + public void be_updateCurrentRecipe(AnvilSmithingRecipe recipe); + public AnvilSmithingRecipe be_getCurrentRecipe(); + public List be_getRecipes(); +} diff --git a/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java new file mode 100644 index 00000000..6716f669 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java @@ -0,0 +1,102 @@ +package ru.betterend.mixin.client; + +import java.util.List; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.google.common.collect.Lists; + +import net.minecraft.client.gui.screen.ingame.AnvilScreen; +import net.minecraft.client.gui.screen.ingame.ForgingScreen; +import net.minecraft.client.gui.widget.AbstractButtonWidget; +import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.client.gui.widget.TextFieldWidget; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.AnvilScreenHandler; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.text.LiteralText; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +import ru.betterend.interfaces.AnvilScreenHandlerExtended; +import ru.betterend.recipe.builders.AnvilSmithingRecipe; + +@Mixin(AnvilScreen.class) +public class AnvilScreenMixin extends ForgingScreen { + + @Shadow + private TextFieldWidget nameField; + + private List be_buttons = Lists.newArrayList(); + + public AnvilScreenMixin(AnvilScreenHandler handler, PlayerInventory playerInventory, Text title, + Identifier texture) { + super(handler, playerInventory, title, texture); + } + + @Inject(method = "setup", at = @At("TAIL")) + protected void setup(CallbackInfo info) { + this.be_buttons.clear(); + int x = (this.width - this.backgroundWidth) / 2; + int y = (this.height - this.backgroundHeight) / 2; + this.be_buttons.add(new ButtonWidget(x + 8, y + 45, 15, 20, new LiteralText("<"), (b) -> be_previousRecipe())); + this.be_buttons.add(new ButtonWidget(x + 154, y + 45, 15, 20, new LiteralText(">"), (b) -> be_nextRecipe())); + } + + @Inject(method = "renderForeground", at = @At("TAIL")) + protected void renderForeground(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo info) { + AnvilScreenHandlerExtended handler = AnvilScreenHandlerExtended.class.cast(this.handler); + if (handler.be_getRecipes().size() > 1) { + this.be_buttons.forEach(button -> button.render(matrices, mouseX, mouseY, delta)); + } + } + + @Inject(method = "onSlotUpdate", at = @At("HEAD"), cancellable = true) + public void onSlotUpdate(ScreenHandler handler, int slotId, ItemStack stack, CallbackInfo info) { + AnvilScreenHandlerExtended anvilHandler = AnvilScreenHandlerExtended.class.cast(this.handler); + if (anvilHandler.be_getCurrentRecipe() != null) { + this.nameField.setText(""); + this.nameField.setEditable(false); + this.setFocused(null); + info.cancel(); + } + } + + private void be_nextRecipe() { + AnvilScreenHandlerExtended handler = AnvilScreenHandlerExtended.class.cast(this.handler); + List recipes = handler.be_getRecipes(); + AnvilSmithingRecipe current = handler.be_getCurrentRecipe(); + int i = recipes.indexOf(current) + 1; + if (i == recipes.size()) { + i = 0; + } + handler.be_updateCurrentRecipe(recipes.get(i)); + } + + private void be_previousRecipe() { + AnvilScreenHandlerExtended handler = AnvilScreenHandlerExtended.class.cast(this.handler); + List recipes = handler.be_getRecipes(); + AnvilSmithingRecipe current = handler.be_getCurrentRecipe(); + int i = recipes.indexOf(current) - 1; + if (i == 0) { + i = recipes.size() - 1; + } + handler.be_updateCurrentRecipe(recipes.get(i)); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + for (AbstractButtonWidget elem : be_buttons) { + if (elem.mouseClicked(mouseX, mouseY, button)) { + return true; + } + } + return super.mouseClicked(mouseX, mouseY, button); + } +} diff --git a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java index c8a4aa23..9c1f528b 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java @@ -1,5 +1,8 @@ package ru.betterend.mixin.common; +import java.util.Collections; +import java.util.List; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -18,15 +21,14 @@ import net.minecraft.screen.ForgingScreenHandler; import net.minecraft.screen.ScreenHandlerContext; import net.minecraft.screen.ScreenHandlerType; import net.minecraft.tag.BlockTags; -import net.minecraft.world.World; +import ru.betterend.interfaces.AnvilScreenHandlerExtended; import ru.betterend.recipe.builders.AnvilSmithingRecipe; @Mixin(AnvilScreenHandler.class) -public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler { +public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler implements AnvilScreenHandlerExtended { - private final World world = this.player.world; - private final RecipeManager recipeManager = this.world.getRecipeManager(); - private AnvilSmithingRecipe currentRecipe; + private List be_recipes = Collections.emptyList(); + private AnvilSmithingRecipe be_currentRecipe; public AnvilScreenHandlerMixin(ScreenHandlerType type, int syncId, PlayerInventory playerInventory, ScreenHandlerContext context) { @@ -38,8 +40,8 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler { @Inject(method = "canTakeOutput", at = @At("HEAD"), cancellable = true) protected void canTakeOutput(PlayerEntity player, boolean present, CallbackInfoReturnable info) { - if (currentRecipe != null) { - ItemStack output = this.currentRecipe.craft(input, player); + if (be_currentRecipe != null) { + ItemStack output = this.be_currentRecipe.craft(input, player); if (!output.isEmpty()) { info.setReturnValue(true); info.cancel(); @@ -49,7 +51,7 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler { @Inject(method = "onTakeOutput", at = @At("HEAD"), cancellable = true) protected void onTakeOutput(PlayerEntity player, ItemStack stack, CallbackInfoReturnable info) { - if (currentRecipe != null) { + if (be_currentRecipe != null) { this.input.getStack(1).decrement(1); this.updateResult(); this.context.run((world, blockPos) -> { @@ -66,7 +68,6 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler { } else { world.syncWorldEvent(1030, blockPos, 0); } - }); info.setReturnValue(stack); info.cancel(); @@ -75,18 +76,41 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler { @Inject(method = "updateResult", at = @At("HEAD"), cancellable = true) public void updateOutput(CallbackInfo info) { - this.currentRecipe = this.recipeManager.getFirstMatch(AnvilSmithingRecipe.TYPE, input, world).orElse(null); - if (currentRecipe != null) { - this.output.setStack(0, currentRecipe.craft(input)); - this.sendContentUpdates(); + RecipeManager recipeManager = this.player.world.getRecipeManager(); + this.be_recipes = recipeManager.getAllMatches(AnvilSmithingRecipe.TYPE, input, player.world); + if (be_recipes.size() > 0) { + this.be_currentRecipe = recipeManager.getFirstMatch(AnvilSmithingRecipe.TYPE, input, player.world).get(); + this.be_updateResult(); info.cancel(); } } @Inject(method = "setNewItemName", at = @At("HEAD"), cancellable = true) public void setNewItemName(String string, CallbackInfo info) { - if (currentRecipe != null) { + if (be_currentRecipe != null) { info.cancel(); } } + + private void be_updateResult() { + if (be_currentRecipe == null) return; + this.output.setStack(0, be_currentRecipe.craft(input)); + this.sendContentUpdates(); + } + + @Override + public void be_updateCurrentRecipe(AnvilSmithingRecipe recipe) { + this.be_currentRecipe = recipe; + this.be_updateResult(); + } + + @Override + public AnvilSmithingRecipe be_getCurrentRecipe() { + return this.be_currentRecipe; + } + + @Override + public List be_getRecipes() { + return this.be_recipes; + } } diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index e630e1e8..dc5704a5 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -134,7 +134,8 @@ public class CraftingRecipes { .build(); GridRecipe.make("shadow_berry_jelly", EndItems.SHADOW_BERRY_JELLY) - .setList("JWSB").addMaterial('J', EndItems.GELATINE) + .setList("JWSB") + .addMaterial('J', EndItems.GELATINE) .addMaterial('W', PotionUtil.setPotion(new ItemStack(Items.POTION), Potions.WATER)) .addMaterial('S', Items.SUGAR) .addMaterial('B', EndItems.SHADOW_BERRY_COOKED) @@ -169,19 +170,34 @@ public class CraftingRecipes { .build(); GridRecipe.make("hopper", Blocks.HOPPER) - .setShape("I I", "ICI", " I ") - .addMaterial('I', Items.IRON_INGOT) - .addMaterial('C', EndTags.ITEM_CHEST) - .build();; + .setShape("I I", "ICI", " I ") + .addMaterial('I', Items.IRON_INGOT) + .addMaterial('C', EndTags.ITEM_CHEST) + .build(); GridRecipe.make("shulker_box", Blocks.SHULKER_BOX) - .setShape("S", "C", "S") - .addMaterial('S', Items.SHULKER_SHELL) - .addMaterial('C', EndTags.ITEM_CHEST) - .build(); + .setShape("S", "C", "S") + .addMaterial('S', Items.SHULKER_SHELL) + .addMaterial('C', EndTags.ITEM_CHEST) + .build(); GridRecipe.make("twisted_umbrella_moss_dye", Items.PURPLE_DYE).setList("#").addMaterial('#', EndBlocks.TWISTED_UMBRELLA_MOSS).build(); GridRecipe.make("twisted_umbrella_moss_dye_tall", Items.PURPLE_DYE).setOutputCount(2).setList("#").addMaterial('#', EndBlocks.TWISTED_UMBRELLA_MOSS_TALL).build(); + + GridRecipe.make("leather_to_stripes", EndItems.LEATHER_STRIPE) + .setList("L") + .addMaterial('L', Items.LEATHER) + .setOutputCount(3) + .build(); + GridRecipe.make("stripes_to_leather", Items.LEATHER) + .setList("SSS") + .addMaterial('S', EndItems.LEATHER_STRIPE) + .build(); + GridRecipe.make("leather_wrapped_stick", EndItems.LEATHER_WRAPPED_STICK) + .setList("SL") + .addMaterial('S', Items.STICK) + .addMaterial('L', EndItems.LEATHER_STRIPE) + .build(); } private static void registerLantern(String name, Block lantern, Block slab) { diff --git a/src/main/java/ru/betterend/recipe/SmithingRecipes.java b/src/main/java/ru/betterend/recipe/SmithingRecipes.java index 369236f2..c5ab7711 100644 --- a/src/main/java/ru/betterend/recipe/SmithingRecipes.java +++ b/src/main/java/ru/betterend/recipe/SmithingRecipes.java @@ -18,5 +18,30 @@ public class SmithingRecipes { .setLevel(2) .setDamage(3) .build(); + + AnvilSmithingRecipe.Builder.create("aeternium_axe_head") + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_AXE_HEAD, 1) + .setLevel(4) + .setDamage(6) + .build(); + AnvilSmithingRecipe.Builder.create("aeternium_pickaxe_head") + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_PICKAXE_HEAD, 1) + .setLevel(4) + .setDamage(6) + .build(); + AnvilSmithingRecipe.Builder.create("aeternium_shovel_head") + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_SHOVEL_HEAD, 1) + .setLevel(4) + .setDamage(6) + .build(); + AnvilSmithingRecipe.Builder.create("aeternium_hoe_head") + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_HOE_HEAD, 1) + .setLevel(4) + .setDamage(6) + .build(); } } diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index bc3108e1..9492d3d4 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -68,6 +68,8 @@ public class EndItems { public final static Item GELATINE = registerItem("gelatine"); public static final Item ETERNAL_CRYSTAL = registerItem("eternal_crystal", new EternalCrystal()); public final static Item ENCHANTED_PETAL = registerItem("enchanted_petal", new EnchantedPetal()); + public final static Item LEATHER_STRIPE = registerItem("leather_stripe"); + public final static Item LEATHER_WRAPPED_STICK = registerItem("leather_wrapped_stick"); // Armor // public static final Item TERMINITE_HELMET = registerItem("terminite_helmet", new ArmorItem(EndArmorMaterial.TERMINITE, EquipmentSlot.HEAD, makeItemSettings())); @@ -110,6 +112,15 @@ public class EndItems { public final static Item SWEET_BERRY_JELLY = registerFood("sweet_berry_jelly", 3, 0.75F); public final static Item SHADOW_BERRY_JELLY = registerFood("shadow_berry_jelly", 4, 0.75F, new StatusEffectInstance(StatusEffects.NIGHT_VISION, 400)); + // Toolparts // + public final static Item AETERNIUM_SHOVEL_HEAD = registerItem("aeternium_shovel_head"); + public final static Item AETERNIUM_PICKAXE_HEAD = registerItem("aeternium_pickaxe_head"); + public final static Item AETERNIUM_AXE_HEAD = registerItem("aeternium_axe_head"); + public final static Item AETERNIUM_HOE_HEAD = registerItem("aeternium_hoe_head"); + public final static Item AETERNIUM_HAMMER_HEAD = registerItem("aeternium_hammer_head"); + public final static Item AETERNIUM_SWORD_BLADE = registerItem("aeternium_sword_blade"); + public final static Item AETERNIUM_SWORD_HANDLE = registerItem("aeternium_sword_handle"); + // Drinks public final static Item UMBRELLA_CLUSTER_JUICE = registerDrink("umbrella_cluster_juice"); diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_axe.png b/src/main/resources/assets/betterend/textures/item/aeternium_axe.png index d7101869f8f53e498c909e0587f0039f8cd30709..71931e6a1a85ffff3c3178838a46c47d01e2f222 100644 GIT binary patch delta 436 zcmV;l0Zab$0?q@FB!87jL_t(IjkS?WC`3^h$N%@{F=ytwhK7{Ph|HPsriQXsGd3(x zNH!KIu@tFUTiPfqWr<{{S+JQD8}e9rjJF!&RcNasJGEhaRY4JNvnY+D9QuEr>E#@?|`SG3X#Y) zTn&8)?cB$o;N>a`Q4kQmyg*-fH^wI?gwT{9B~Fg5?OoKj^}`~|#$|jdzr+nG!%C7h zou=nz&`^`5jeqU3TWDZpnCiSDd_!)jDXbhimYle-uoTG&t68 ze3Mz0HF&+#LoGa8cdMXUk}T_X!9W8V%rh+rp4?&X;70eD%oa5UBno(adNy!6{Ijzj zz?fDdGsT|Zx6bjDq#ijgPASRB$gF%rF!Xm=m(AgzYAv6S%<7gU^_>YS)t*ZtV`O5C eQW^U@4d4S-NTSqIqdn;W0000bhiUF4zN{bFLt){_65dVZ01l#{Y z8gX(`{6P!4cM=6byNaf|>MV4y>Qp-<@n3n~UCAJt#0)-o%W_5WG6@QFrrX9&w*$LGlLMHhVG@S8dho#V8ZNyXBASnS zJ*+odaQF5>`JLE+IlD^eOkTp*gIf}fEt-| zWMsJW-~m|kjUM|D$ zKYth)85kK@SXlo5|M#Ea``0gwAXkn8Y5@iY1^~poZvg~=6RiLM002ovPDHLkV1h^i Bq&WZp literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_hammer.png b/src/main/resources/assets/betterend/textures/item/aeternium_hammer.png index ef7ff4f18a2d8047fb0aa24162454cdf438efd61..a594cfd5e620d6bc9553e61c467912ef64577ac4 100644 GIT binary patch delta 504 zcmVnR{pM;J#uRo``g#YV3Am1soTQkOtVrw;vjh8h>!xvenyZ_U$4qynjaz z8yiUMNp-bZFViID1lB%oq@m|SNS>ykkb(yl5;o?%uvsmbUyZ7)Za}pxlV|t^zVAkm zIzK}=6aqIGG5F*fGplEa#bS&VSzyqR|5U&Y_^|a+g%5Uq;>7n1$IVrk4;e8U2*6TO zLMAZc8Zy%Y=YQaCNIj9j8px?IZ zAVo|YVK^|(u1P^~Y(firTW$1tpqct)Nq;nR2JgQXGAB=eiDEgD(4CQ7WdpifDyYn1 uR?E&87Rnl}R;yZaJRZ*rzU%YlF90`Qx6v*DRga7S0000J&(59y+=1!lG^}l!q3}Lx=v#rx{_P$k8ntcwv~~`91IR&Jg|A0wAq;A^|;{ z2IW$szTHg)#FFc9-v)SoA7YV1#2H&#{RtS?(NZph_TUBg?SCdJEeD<9D@xllC>Q53 z6)?x!ZVfz~RVz5Uxx#EFi3JXPx?X{<>mvX$CI>91li0sF8HqE60_ej8T^fj`Q|Ngf z6jkL}n7oDfMwZk_7%Ut{C>jM-&p`*fV48+I+s0$R4`mX74~+Isk4a<}Z3_?!g^)K4 z?379{U3W6zwrNo(e_$fB0OSvaxQIr#H;V9JS@Ie9&O*GIi;%(rTio63cA)aT(n;xX(37K3S&O`8irxUZS%4S~7e7>Pl;F3H>JEt0<>nUoRe26>gUcCB;5yn#LkZ1lMP0 zSq>aO1^lv1!B7xu@ogZj1}=_Ha3AWy zWuOR71`H1kl9-=Q^eux;fOF2amsha6vWmN#B=oHV(5;GxWD3bt3KOxJtbJPq!6Bfo zrJ3p48xk9vVj53GH7mxxj{C>Qs9gF0$8pHWGW)TXYM?Duy%P?)O@H50{PKeKj-oU?=_DQ0 zOcv)TB~y3A3ufx-7D(FOqW$A24LBXNJljK|)xMfp!?xPZCNdC^NG4eBC69Hlmps7$ z9D{bWrA}~oT0l0Nt+Jes24Daf$H3G$i!K*JJ7K0IVn{#8D2;4j$>&3d(bzl^F9_hf z1@MBoy4TtkMSqd}l0-(6i2{;@rX3U&1;xCAqEf)_oQ)QyEQnvfV}8ZM&SEiyBN0}v zRCHXO+-`Rjz6#Ee-)_~ltG!mkA*%57>m%7MMw~z85R;#E_f!M*zvv=p@Y;~IDg0eJ z1FdrOCesquMNp@06FZTU-&(?2ggW?O(_Ve5R#i2FIv%OuZ{dape-eOC-oC2M>8}0h P00000NkvXXu0mjf-K54f delta 286 zcmV+(0pb3>1GoZ^BYyz@Nkldw{qi#Z*H51Ke`>n)e}6$iLHq^)H8U^+@rCQx z!2JC7HU^N*L0OsqYbW&m56{f}&&bS-+Yn}Ub_OO+b|B3L=EIx~ve`Ew;Xf15bwLRU z#03XPGtAlkDaj0sEG+-4y1E#Al>)t(v z?CdNC2S>;MT)e!vogpMD%D^iqz`(`F2j+vE%*w&ez{KRi9{KPL~*|InmF41HJu y%+D+!12{MsK$KXjQ!?7tJ1!MyT1_l80XHtlkd88iz0000msE-X-q^+%ehfmqj7q{JGnSHs14 z@n_Ee_+OD1ez$O^_boC$qCVT^K%LvZkuIFlKchi8m}|6QJk; zWV0DUr@Od68s*si+Z+ssIT#N0V}DCip=c_|ukDnegn}$vqse~(pmwYEZxbm1KLP&R Wz+iG58VxJ}0000e!g$sn<4s-a7Dui z#yI?X2)=fyU`E^3{F#1ZYkGZRr7Vj(=+)U4uN~#7ce>%Ud}V z>IazO5oF?Sl+(TuFkPc|=Z#vA4|I5bMlO#BirbCFTo%Q84M)XUc)i{c0Ck=w!x{x5 z8cjzzB}+TBzPC%Jb7C!vLahqf=^TBX8LpE*#=rKxvQ6jsY7*O(3M56b*Ar9RD?5=+ z5fj3tOa{yjpnu=F+guTn!+}I9jg3+XOp;*B`S+B}9yFTG;edYUfn!!=T-@J)1_6dS z{{RSK>-9wd7;HQDLX`apVK}+Ew370I3J=$9JQDM;WQytb$)G#KuyRTu0BV-Ivy~M2 o@7Xf;y)3HSZ3wg0SU>jzvNxrPT#y3700000NkvXXt^-0~f+4K9QUCw| diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_pickaxe_head.png b/src/main/resources/assets/betterend/textures/item/aeternium_pickaxe_head.png new file mode 100644 index 0000000000000000000000000000000000000000..5a0ba485877a00ef30816710660a4528f5c8a46a GIT binary patch literal 423 zcmV;Y0a*TtP)s)qxA|-gnQB^B(?PtTBKvGDJ=duo2*73_KCbUS)pFXaGD) zfYRv{UY-g#&EDcVpU3&(5jY!%n~O_ka()L85jqAGQk^{B?;kK0jY4jBV>A>-YCDO{ z$ys%mv1XRNe((nr>}@64<8uMI+#M3@YXru@!8GivO%!T>nAhOc*M$08JC4|I?>TW;lH6B*VNlD;V6|T;Ylc8UWHf zd-_aK!=&T>iglAEGYy-zLD9 zfs=>le_3NA!?rzp;7W0N0i;=7h?`;Cy*CVNZoUGm+p=pH0}~S?gO`gdhI$OmFq<(X z(Ex@Eu-S|cuvft31a-Ckb1^V72pRlg*mi(8%^(0bfR}-ZK~+PIp?<|42FCxyCvmvK w|Ns9paP#v1XJ7y$#&2K05^DwpfPsMl0A-tQ!meg+hX4Qo07*qoM6N<$f@6%JIRF3v delta 255 zcmVCdkZ!A`vLV2?4ve3*2*v z{%8#1TwWwoEMR{PF=Ro1`fV253k#4m??%`5J1!Qrx0yDPYo{EReHlhNDl7S;xG8!+X&ZP;Hx<+=l#i9 zuB;q%aV%du$E-Zc%?3zBq#1_#odX~yw#;-6#`*6a>;XYdao{YLp4aW_EA6$z`(!&03zc}RKgqepa1{> M07*qoM6N<$f{s6bO8@`> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_sword.png b/src/main/resources/assets/betterend/textures/item/aeternium_sword.png index af121d60b23aa6b36aca09341f3ce0f85779c9bc..7ed4b9e7800aa8d81cc45f660b603443bdaffba9 100644 GIT binary patch delta 605 zcmV-j0;2t%1oZ@vBYy%sNklJxo(k6vzMf)wZwiRr`R_(AXl-VkxC2YOQer zOmty!PzEP)chD{l$UrnsxRsGa2A28(389m5F(!yHB#P;WfPe+1Vs#)s?8iOkJ(J2y z8>61_=KRk6o&UWI|544s0Lf*JGSR=o^097uoy}4zl_p7+Nq?y6_(OGsLp1+*29J_+ zC=*AqQu%whJshI+@-mH$$0?o8kXe%G<=Z6~44i%+9qI|zz`@7~N={E>?&%YpiAE7Q z6~T>>TMYXn@OJoU@ahmb14qfz{c8vj>G0~tI*m`>r)MwbNp?7BEFQ<3R7&ruzJkl^ zp*Ft{pEo~3uzy+@35>uwCMPDal+EH~D2)EzUJQ?pvf)^)dU16Hrq5!?Z-2seE(Zzt>8g^V zu&;$LC{};pXW?#bCGWi$iFUhTL5n2efK7y16rs3V(BN)?>}m!RtwsZz-A+G<1DwEB r)sTtatc6!BL9m$hGhQtHZUFET+1fB$tBYy$qNklKJV zkc}U>a6>`@xPT~&26W-V#6%=o7C_Na(Ulth2)MA~q6vYvHr?nCdAaApq6MnrNls?& z%z2;poSS=z{wKQQu%l7g_%u4yRMtSI*gw8~FNT2d2k^%&V7_->U&woneek zPl4hwoa;G+0MO#_@fN6AKqhIwawpOtmhhU61N-Z=|bYh z2m>&_kinAs2KVM3LN<9BK!#~H2E+%`iY(}}7EP&6l&~nK}YrC!2CmTdYIfmBp5j{nbko#t4aXt^$mo50g1NNOZ?s`4&aT9xP zTks1^)M_-hvV@JT&1@=e?|tZ;qE+T6xc1}G= z6$LtDLy^w8;4MVaRAeRFo=cK4LaMIk(ir<)!9RqEz5v^qed6;iXs-YO002ovPDHLk FV1i%{oE-oF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_sword_handle.png b/src/main/resources/assets/betterend/textures/item/aeternium_sword_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..ee18d7b9b768df1dd33cd0adfe885e09f244fd7c GIT binary patch literal 439 zcmV;o0Z9IdP))E%=ne;A~FyGFam-Wi{R|| zI*gCb2Q<_4YLrsFCIjp~c9y1iCZ%EP)WYoIBBYYIy}a_K3L>yl^lsbX3S9DfK7;*> zdt^4&sCszp{s6?2DNmXc6=>97*xTYK(JU2MCxN{Q#!2lJN7cHQAJz5VDV6f>*#Sc( zOu|z=_zw&SINKF$o;~>Fud96dmPjNinobhJJkaBDc3k%uXf+yvoTlrLN}=6sf<|Jl h8gQrkn}vS`0H2x0pxj`S)H478002ovPDHLkV1lwz#YzAG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/leather_stripe.png b/src/main/resources/assets/betterend/textures/item/leather_stripe.png new file mode 100644 index 0000000000000000000000000000000000000000..37007bfa5ebe46f0b0f39ba5fdd52e9c48fe7459 GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!H1qMjv*HQ$qPgb{{8 z;%II&FrUHCbb@PQqky{h9o7Wq38u=wB_$8+VPaBve`fz5o~sNg_J{vyA3MsnEb+nB z?ePgx%OsDqNi%R2PB@nP{a(XjF18~(1=|iBNu1@#Ajej=sVRYNlZqij9>dOr1)rIi anHku3w;dI)_I3h#mci52&t;ucLK6TK5_?Dh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/leather_wrapped_stick.png b/src/main/resources/assets/betterend/textures/item/leather_wrapped_stick.png new file mode 100644 index 0000000000000000000000000000000000000000..63021506ffbfec012c506299361c64ce703d40bc GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!Hb?Qjv*HQ$r1t&9z9|@rf`5o&67c)cg=jg zfAvMLf7A=iS7A<=CCk&gK#7N^Ct#L>!!?`w-@N5GF2=Y|LZeoN4jFMELJ{#e;`7e7_XUw)_v Date: Tue, 5 Jan 2021 02:17:09 +0300 Subject: [PATCH 099/463] Entity exit fixes --- .../ru/betterend/blocks/EndPortalBlock.java | 39 +++++++++---------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index 76e081c7..53423b97 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -16,6 +16,7 @@ import net.minecraft.sound.SoundEvents; import net.minecraft.util.BlockRotation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Direction.Axis; import net.minecraft.util.math.Direction.AxisDirection; import net.minecraft.util.registry.Registry; import net.minecraft.world.Heightmap; @@ -99,7 +100,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable } Direction direction = Direction.EAST; BlockPos.Mutable checkPos = basePos.mutableCopy(); - for (int step = 1; step < 64; step++) { + for (int step = 1; step < 128; step++) { for (int i = 0; i < (step >> 1); i++) { checkPos.setY(5); int ceil = world.getChunk(basePos).sampleHeightmap(Heightmap.Type.WORLD_SURFACE, checkPos.getX(), checkPos.getZ()) + 1; @@ -107,26 +108,22 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable while(checkPos.getY() < ceil) { BlockState state = world.getBlockState(checkPos); if(state.isOf(this)) { - int offStep; - checkPos = this.findCenter(world, checkPos, state.get(AXIS)); - if (state.get(AXIS).equals(Direction.Axis.X)) { - if (entity.getMovementDirection().getAxis() == Direction.Axis.X) { - offStep = entity.getMovementDirection() == Direction.EAST ? 1 : -1; - float rotation = entity.applyRotation(BlockRotation.CLOCKWISE_90); - entity.yaw = rotation; - } else { - offStep = entity.getMovementDirection() == Direction.NORTH ? -1 : 1; - } - return checkPos.add(0, 0, offStep); - } else { - if (entity.getMovementDirection().getAxis() == Direction.Axis.Z) { - offStep = entity.getMovementDirection() == Direction.SOUTH ? -1 : 1; - float rotation = entity.applyRotation(BlockRotation.CLOCKWISE_90); - entity.yaw = rotation; - } else { - offStep = entity.getMovementDirection() == Direction.EAST ? 1 : -1; - } - return checkPos.add(offStep, 0, 0); + Axis axis = state.get(AXIS); + checkPos = this.findCenter(world, checkPos, axis); + + Direction frontDir = Direction.from(axis, AxisDirection.POSITIVE).rotateYClockwise(); + Direction entityDir = entity.getMovementDirection(); + if (entityDir.getAxis().isVertical()) { + entityDir = frontDir; + } + + if (frontDir == entityDir || frontDir.getOpposite() == entityDir) { + return checkPos.offset(entityDir); + } + else { + entity.applyRotation(BlockRotation.CLOCKWISE_90); + entityDir = entityDir.rotateYClockwise(); + return checkPos.offset(entityDir); } } checkPos.move(Direction.UP); From c394f5a5f0a31c4f64fbb064373cc21837093d27 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 5 Jan 2021 02:39:55 +0300 Subject: [PATCH 100/463] Portal search function fix. Portals now work as intended --- .../ru/betterend/blocks/EndPortalBlock.java | 53 +++++++++++-------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index 53423b97..63b1e8a1 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -22,6 +22,7 @@ import net.minecraft.util.registry.Registry; import net.minecraft.world.Heightmap; import net.minecraft.world.World; import net.minecraft.world.WorldAccess; +import net.minecraft.world.chunk.Chunk; import net.minecraft.world.dimension.DimensionType; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; @@ -102,31 +103,37 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable BlockPos.Mutable checkPos = basePos.mutableCopy(); for (int step = 1; step < 128; step++) { for (int i = 0; i < (step >> 1); i++) { - checkPos.setY(5); - int ceil = world.getChunk(basePos).sampleHeightmap(Heightmap.Type.WORLD_SURFACE, checkPos.getX(), checkPos.getZ()) + 1; - if (ceil < 5) continue; - while(checkPos.getY() < ceil) { - BlockState state = world.getBlockState(checkPos); - if(state.isOf(this)) { - Axis axis = state.get(AXIS); - checkPos = this.findCenter(world, checkPos, axis); - - Direction frontDir = Direction.from(axis, AxisDirection.POSITIVE).rotateYClockwise(); - Direction entityDir = entity.getMovementDirection(); - if (entityDir.getAxis().isVertical()) { - entityDir = frontDir; - } - - if (frontDir == entityDir || frontDir.getOpposite() == entityDir) { - return checkPos.offset(entityDir); - } - else { - entity.applyRotation(BlockRotation.CLOCKWISE_90); - entityDir = entityDir.rotateYClockwise(); - return checkPos.offset(entityDir); + Chunk chunk = world.getChunk(checkPos); + if (chunk != null) { + int ceil = chunk.sampleHeightmap(Heightmap.Type.WORLD_SURFACE, checkPos.getX() & 15, checkPos.getZ() & 15); + if (ceil > 5) { + checkPos.setY(ceil); + while (checkPos.getY() > 5) { + BlockState state = world.getBlockState(checkPos); + if (state.isOf(this)) { + System.out.println("Out: " + checkPos); + + Axis axis = state.get(AXIS); + checkPos = this.findCenter(world, checkPos, axis); + + Direction frontDir = Direction.from(axis, AxisDirection.POSITIVE).rotateYClockwise(); + Direction entityDir = entity.getMovementDirection(); + if (entityDir.getAxis().isVertical()) { + entityDir = frontDir; + } + + if (frontDir == entityDir || frontDir.getOpposite() == entityDir) { + return checkPos.offset(entityDir); + } + else { + entity.applyRotation(BlockRotation.CLOCKWISE_90); + entityDir = entityDir.rotateYClockwise(); + return checkPos.offset(entityDir); + } + } + checkPos.move(Direction.DOWN); } } - checkPos.move(Direction.UP); } checkPos.move(direction); } From d6f81232494630c53e6dd4f1a8164df4427145b6 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 5 Jan 2021 03:00:13 +0300 Subject: [PATCH 101/463] Mixin function rename (fixing #45) --- .../mixin/common/GenerationSettingsAccessor.java | 8 ++++---- src/main/java/ru/betterend/util/FeaturesHelper.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/common/GenerationSettingsAccessor.java b/src/main/java/ru/betterend/mixin/common/GenerationSettingsAccessor.java index f7b16376..07ba1b66 100644 --- a/src/main/java/ru/betterend/mixin/common/GenerationSettingsAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/GenerationSettingsAccessor.java @@ -13,14 +13,14 @@ import net.minecraft.world.gen.feature.ConfiguredStructureFeature; @Mixin(GenerationSettings.class) public interface GenerationSettingsAccessor { @Accessor("features") - List>>> getFeatures(); + List>>> beGetFeatures(); @Accessor("features") - void setFeatures(List>>> features); + void beSetFeatures(List>>> features); @Accessor("structureFeatures") - List>> getStructures(); + List>> beGetStructures(); @Accessor("structureFeatures") - void setStructures(List>> structures); + void beSetStructures(List>> structures); } diff --git a/src/main/java/ru/betterend/util/FeaturesHelper.java b/src/main/java/ru/betterend/util/FeaturesHelper.java index f856e90a..c43e0d9c 100644 --- a/src/main/java/ru/betterend/util/FeaturesHelper.java +++ b/src/main/java/ru/betterend/util/FeaturesHelper.java @@ -23,8 +23,8 @@ public class FeaturesHelper { biomeRegistry.forEach((biome) -> { if (biome.getCategory() == Biome.Category.THEEND && !INJECTED.contains(biome)) { GenerationSettingsAccessor accessor = (GenerationSettingsAccessor) biome.getGenerationSettings(); - List>> structures = Lists.newArrayList(accessor.getStructures()); - List>>> preFeatures = accessor.getFeatures(); + List>> structures = Lists.newArrayList(accessor.beGetStructures()); + List>>> preFeatures = accessor.beGetFeatures(); List>>> features = new ArrayList>>>(preFeatures.size()); preFeatures.forEach((list) -> { features.add(Lists.newArrayList(list)); @@ -33,8 +33,8 @@ public class FeaturesHelper { EndFeatures.registerBiomeFeatures(biomeRegistry.getId(biome), biome, features); EndStructures.registerBiomeStructures(biomeRegistry.getId(biome), biome, structures); - accessor.setFeatures(features); - accessor.setStructures(structures); + accessor.beSetFeatures(features); + accessor.beSetStructures(structures); INJECTED.add(biome); } }); From fe282bddc6a652a3e9cbb92a8d4790f89ce60972 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 5 Jan 2021 03:18:32 +0300 Subject: [PATCH 102/463] Blockus texture compat --- .../blockus/textures/block/chiseled_purpur.png | Bin 0 -> 1629 bytes .../blockus/textures/block/purpur_bricks.png | Bin 0 -> 1591 bytes .../blockus/textures/block/purpur_lines.png | Bin 0 -> 1627 bytes .../textures/block/purpur_little_bricks.png | Bin 0 -> 1573 bytes .../blockus/textures/block/purpur_squares.png | Bin 0 -> 1436 bytes .../blockus/textures/block/smooth_purpur.png | Bin 0 -> 1609 bytes src/main/resources/fabric.mod.json | 4 ++++ 7 files changed, 4 insertions(+) create mode 100644 src/main/resources/assets/blockus/textures/block/chiseled_purpur.png create mode 100644 src/main/resources/assets/blockus/textures/block/purpur_bricks.png create mode 100644 src/main/resources/assets/blockus/textures/block/purpur_lines.png create mode 100644 src/main/resources/assets/blockus/textures/block/purpur_little_bricks.png create mode 100644 src/main/resources/assets/blockus/textures/block/purpur_squares.png create mode 100644 src/main/resources/assets/blockus/textures/block/smooth_purpur.png diff --git a/src/main/resources/assets/blockus/textures/block/chiseled_purpur.png b/src/main/resources/assets/blockus/textures/block/chiseled_purpur.png new file mode 100644 index 0000000000000000000000000000000000000000..b029caee12390bb3d33dbb62a8f2db257e33f3e8 GIT binary patch literal 1629 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/blockus/textures/block/purpur_squares.png b/src/main/resources/assets/blockus/textures/block/purpur_squares.png new file mode 100644 index 0000000000000000000000000000000000000000..0a34716dd5a66f6948f65c712a2aa122ae8adde3 GIT binary patch literal 1436 zcmbVMJ4_To7+#2pfRI3J(8kTuV03RE_u|G|5%18u#07*)z($?hox9s`yR+^N+#NP* zqb3-nGBG43R8|&R7-K&b48GXxV|M2IzyJN;pBTH?({;Ry zl}}kuZhfvwX4& zD1nU#b!ui*|sF`bqJZ&gb}8YpV24y6!s7w4aG!5iKu)$5mI7uLXDi} zRauEka$HivqO1Tp2Eqxxc?ndTXBNO@`a)9|{nLaJAuf=lN~IF2ghSXXN=hP;kYrU- zRgoe@zvd8F6&-(|#gIn6;aM)Ru){M(n8$NO6R4#P7i>46b^K z(+F_xoL8+qT-4Z6)FX7)%2giF9(9r67pkrTKY&%fllhJwVMl&G$ zqWxUWMbael@tkL%(Rpg-0Q1HLDGxz{y&T5nR-z_aCiAHjOUw{IIBhv5uJ|W+$)GeO zNE1|9RcOjYIhvEhpnjiXZ@B^0v1t`*`#}{2gyValv}#O9;9tR}0Sef&A@$j^VG&8L zQxy0hk|2f4*rST6b>X@dx(>3APoQI{4AB)JM z5{?d;Q8_B-Be9lz8XI#gxh;9~Kjp_gi#8W5ADD-=9IFbDv3#1ZTC*vp(2eG*Z1MF% z0MK9st_cRqEHZ`WwsqhLG-xX&L`naU?gq@q1yX??8Y$9f{Yynj)P9L|W5X5cS1;>l zyE?Z8r{jPvgE>Thf=PxPI=(zQr!t-A*6EBJ&!$ImgUd#8W$l4}Yis@Pc>KiGsYmO= z+d}*Eot>}Wwm06ry!O8DO`*2E*?0KN#?q4y$NKy4!57J!Kf0eTwRO{F@5j%VhZn!! a?uc=#0 z+fZU|xI}|dOpFN_G2`JAM6wYh3nRmXXqXruA@L72h$b4HQNTn+&pk|c)Z8J?#xf_8>X7ZhpJX{|BDprhEDFAG-{2I|m&rt4rV=VPrLa*>lme?#qmzDfXg zZ8GW0m{S+S@I^Ro=O8wt>X13nPHM=4Ob>KW-d14eAXc;0v&NF6HUuuRQwZs`Ky}wt zCZka=FssPGM$J@F!C7&|85jdDj8Htwb2wx)+m>Pl*}KJ+-kYsJlStJvLvukn9A@Dv zD9#!cxZq#Gsv>8QZ2)YuW`HbYEHg`yz9;1<(vgh?W9@{p7RjWXFdY||3QWWz6gE4k zX{wwNAt&&xNQWg=r6n=M(;yTEv=ZV~Q4vB=39qW1k0B-R1-Euy{h#OWwKZH^K)+@l zujIU}kmH(z<26(*iVbi}b*5`%IT2)_cnKb%6fd$+rK;Q7HG7~!TgX97`VZl*z#Nou z3&4gQS?sO^!9lx$i}e;-sesodGwa)neV@QQ#iI` zaQDHpuits*_rOo}OM{jFR6pMRqk69}l zW^SB)W9zn;TNB%V4zVv}8lHOXt4}xg#V3zm=-*ZMo|%8})Og>)?k7f$9N2o%I={ZN z?dI{#=N{Vk?A!Fx`LA@{w0!4BU!H{hd++<^!(X;d7?=0.10.0", "fabric": ">=0.29.0", "minecraft": ">=1.16.3" + }, + "suggests": { + "byg": ">=1.1.3", + "blockus": ">=2.0.2" } } From 4b55bf30a83134402f60f8b709754d7b7c0c008e Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 5 Jan 2021 03:38:28 +0300 Subject: [PATCH 103/463] Recipe config --- .../java/ru/betterend/config/Configs.java | 2 + .../recipe/builders/AlloyingRecipe.java | 45 ++++++++++--------- .../recipe/builders/AnvilSmithingRecipe.java | 37 ++++++++------- .../recipe/builders/FurnaceRecipe.java | 5 ++- .../betterend/recipe/builders/GridRecipe.java | 3 +- .../recipe/builders/InfusionRecipe.java | 45 ++++++++++--------- 6 files changed, 78 insertions(+), 59 deletions(-) diff --git a/src/main/java/ru/betterend/config/Configs.java b/src/main/java/ru/betterend/config/Configs.java index d6a32724..0e0590ad 100644 --- a/src/main/java/ru/betterend/config/Configs.java +++ b/src/main/java/ru/betterend/config/Configs.java @@ -10,6 +10,7 @@ public class Configs { public static final PathConfig ITEM_CONFIG = new PathConfig("items"); public static final IdConfig BIOME_CONFIG = new EntryConfig("biomes"); public static final PathConfig GENERATOR_CONFIG = new PathConfig("generator"); + public static final PathConfig RECIPE_CONFIG = new PathConfig("recipes"); @Environment(value = EnvType.CLIENT) public static final PathConfig CLENT_CONFIG = new PathConfig("client"); @@ -20,6 +21,7 @@ public class Configs { BIOME_CONFIG.saveChanges(); ITEM_CONFIG.saveChanges(); GENERATOR_CONFIG.saveChanges(); + RECIPE_CONFIG.saveChanges(); if (BetterEnd.isClient()) { CLENT_CONFIG.saveChanges(); diff --git a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java index e139ac16..6a18f458 100644 --- a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java @@ -20,6 +20,7 @@ import net.minecraft.util.JsonHelper; import net.minecraft.util.collection.DefaultedList; import net.minecraft.world.World; import ru.betterend.BetterEnd; +import ru.betterend.config.Configs; import ru.betterend.recipe.EndRecipeManager; import ru.betterend.registry.EndBlocks; import ru.betterend.util.ItemUtil; @@ -118,6 +119,7 @@ public class AlloyingRecipe implements Recipe { public static class Builder { private final static Builder INSTANCE = new Builder(); + private static boolean exist; public static Builder create(Identifier id) { INSTANCE.id = id; @@ -127,6 +129,7 @@ public class AlloyingRecipe implements Recipe { INSTANCE.output = null; INSTANCE.experience = 0.0F; INSTANCE.smeltTime = 350; + exist = Configs.RECIPE_CONFIG.getBoolean("alloying", id.getPath(), true); return INSTANCE; } @@ -206,27 +209,29 @@ public class AlloyingRecipe implements Recipe { } public void build() { - if (primaryInput == null) { - BetterEnd.LOGGER.warning("Primary input for Alloying recipe can't be 'null', recipe {} will be ignored!", id); - return; + if (exist) { + if (primaryInput == null) { + BetterEnd.LOGGER.warning("Primary input for Alloying recipe can't be 'null', recipe {} will be ignored!", id); + return; + } + if(secondaryInput == null) { + BetterEnd.LOGGER.warning("Secondary input for Alloying can't be 'null', recipe {} will be ignored!", id); + return; + } + if(output == null) { + BetterEnd.LOGGER.warning("Output for Alloying can't be 'null', recipe {} will be ignored!", id); + return; + } + if (EndRecipeManager.getRecipe(TYPE, id) != null) { + BetterEnd.LOGGER.warning("Can't add Alloying recipe! Id {} already exists!", id); + return; + } + if (!alright) { + BetterEnd.LOGGER.debug("Can't add Alloying recipe {}! Ingeredient or output not exists.", id); + return; + } + EndRecipeManager.addRecipe(TYPE, new AlloyingRecipe(id, group, primaryInput, secondaryInput, output, experience, smeltTime)); } - if(secondaryInput == null) { - BetterEnd.LOGGER.warning("Secondary input for Alloying can't be 'null', recipe {} will be ignored!", id); - return; - } - if(output == null) { - BetterEnd.LOGGER.warning("Output for Alloying can't be 'null', recipe {} will be ignored!", id); - return; - } - if (EndRecipeManager.getRecipe(TYPE, id) != null) { - BetterEnd.LOGGER.warning("Can't add Alloying recipe! Id {} already exists!", id); - return; - } - if (!alright) { - BetterEnd.LOGGER.debug("Can't add Alloying recipe {}! Ingeredient or output not exists.", id); - return; - } - EndRecipeManager.addRecipe(TYPE, new AlloyingRecipe(id, group, primaryInput, secondaryInput, output, experience, smeltTime)); } } diff --git a/src/main/java/ru/betterend/recipe/builders/AnvilSmithingRecipe.java b/src/main/java/ru/betterend/recipe/builders/AnvilSmithingRecipe.java index fb07983d..fc32a204 100644 --- a/src/main/java/ru/betterend/recipe/builders/AnvilSmithingRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AnvilSmithingRecipe.java @@ -21,6 +21,7 @@ import net.minecraft.util.JsonHelper; import net.minecraft.util.collection.DefaultedList; import net.minecraft.world.World; import ru.betterend.BetterEnd; +import ru.betterend.config.Configs; import ru.betterend.recipe.EndRecipeManager; import ru.betterend.registry.EndTags; import ru.betterend.util.ItemUtil; @@ -126,6 +127,7 @@ public class AnvilSmithingRecipe implements Recipe { public static class Builder { private final static Builder INSTANCE = new Builder(); + private static boolean exist; public static Builder create(String id) { return create(BetterEnd.makeID(id)); @@ -137,6 +139,7 @@ public class AnvilSmithingRecipe implements Recipe { INSTANCE.output = null; INSTANCE.level = 1; INSTANCE.damage = 1; + exist = Configs.RECIPE_CONFIG.getBoolean("anvil", id.getPath(), true); return INSTANCE; } @@ -185,23 +188,25 @@ public class AnvilSmithingRecipe implements Recipe { } public void build() { - if (input == null) { - BetterEnd.LOGGER.warning("Input for Smithing recipe can't be 'null', recipe {} will be ignored!", id); - return; + if (exist) { + if (input == null) { + BetterEnd.LOGGER.warning("Input for Smithing recipe can't be 'null', recipe {} will be ignored!", id); + return; + } + if(output == null) { + BetterEnd.LOGGER.warning("Output for Smithing recipe can't be 'null', recipe {} will be ignored!", id); + return; + } + if (EndRecipeManager.getRecipe(TYPE, id) != null) { + BetterEnd.LOGGER.warning("Can't add Smithing recipe! Id {} already exists!", id); + return; + } + if (!alright) { + BetterEnd.LOGGER.debug("Can't add Smithing recipe {}! Ingeredient or output not exists.", id); + return; + } + EndRecipeManager.addRecipe(TYPE, new AnvilSmithingRecipe(id, input, output, level, damage)); } - if(output == null) { - BetterEnd.LOGGER.warning("Output for Smithing recipe can't be 'null', recipe {} will be ignored!", id); - return; - } - if (EndRecipeManager.getRecipe(TYPE, id) != null) { - BetterEnd.LOGGER.warning("Can't add Smithing recipe! Id {} already exists!", id); - return; - } - if (!alright) { - BetterEnd.LOGGER.debug("Can't add Smithing recipe {}! Ingeredient or output not exists.", id); - return; - } - EndRecipeManager.addRecipe(TYPE, new AnvilSmithingRecipe(id, input, output, level, damage)); } } diff --git a/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java b/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java index 455cbb64..474466f6 100644 --- a/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java @@ -7,6 +7,7 @@ import net.minecraft.recipe.RecipeType; import net.minecraft.recipe.SmeltingRecipe; import net.minecraft.util.Identifier; import ru.betterend.BetterEnd; +import ru.betterend.config.Configs; import ru.betterend.recipe.EndRecipeManager; import ru.betterend.util.RecipeHelper; @@ -15,7 +16,7 @@ public class FurnaceRecipe { private ItemConvertible input; private ItemConvertible output; - private boolean exist = true; + private boolean exist; private String group; private String name; private int count; @@ -32,7 +33,7 @@ public class FurnaceRecipe { INSTANCE.count = 1; INSTANCE.time = 200; INSTANCE.xp = 0; - INSTANCE.exist = RecipeHelper.exists(output) && RecipeHelper.exists(input); + INSTANCE.exist = Configs.RECIPE_CONFIG.getBoolean("furnace", name, true) && RecipeHelper.exists(output) && RecipeHelper.exists(input); return INSTANCE; } diff --git a/src/main/java/ru/betterend/recipe/builders/GridRecipe.java b/src/main/java/ru/betterend/recipe/builders/GridRecipe.java index e449d596..3aa19988 100644 --- a/src/main/java/ru/betterend/recipe/builders/GridRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/GridRecipe.java @@ -17,6 +17,7 @@ import net.minecraft.tag.Tag; import net.minecraft.util.Identifier; import net.minecraft.util.collection.DefaultedList; import ru.betterend.BetterEnd; +import ru.betterend.config.Configs; import ru.betterend.recipe.EndRecipeManager; import ru.betterend.util.RecipeHelper; @@ -47,7 +48,7 @@ public class GridRecipe { INSTANCE.materialKeys.clear(); INSTANCE.count = 1; - INSTANCE.exist = RecipeHelper.exists(output); + INSTANCE.exist = Configs.RECIPE_CONFIG.getBoolean("grid", name, true) && RecipeHelper.exists(output); return INSTANCE; } diff --git a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java index 9e9db019..7504abc9 100644 --- a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java @@ -19,6 +19,7 @@ import net.minecraft.util.collection.DefaultedList; import net.minecraft.world.World; import ru.betterend.BetterEnd; +import ru.betterend.config.Configs; import ru.betterend.recipe.EndRecipeManager; import ru.betterend.rituals.InfusionRitual; import ru.betterend.util.ItemUtil; @@ -110,6 +111,7 @@ public class InfusionRecipe implements Recipe { public static class Builder { private final static Builder INSTANCE = new Builder(); + private static boolean exist; public static Builder create(String id) { return create(BetterEnd.makeID(id)); @@ -120,6 +122,7 @@ public class InfusionRecipe implements Recipe { INSTANCE.input = null; INSTANCE.output = null; INSTANCE.time = 1; + exist = Configs.RECIPE_CONFIG.getBoolean("infusion", id.getPath(), true); Arrays.fill(INSTANCE.catalysts, Ingredient.EMPTY); @@ -171,27 +174,29 @@ public class InfusionRecipe implements Recipe { } public void build() { - if (input == null) { - BetterEnd.LOGGER.warning("Input for Infusion recipe can't be 'null', recipe {} will be ignored!", id); - return; + if (exist) { + if (input == null) { + BetterEnd.LOGGER.warning("Input for Infusion recipe can't be 'null', recipe {} will be ignored!", id); + return; + } + if (output == null) { + BetterEnd.LOGGER.warning("Output for Infusion recipe can't be 'null', recipe {} will be ignored!", id); + return; + } + InfusionRecipe recipe = new InfusionRecipe(id, input, output); + recipe.group = group != null ? group : GROUP; + recipe.time = time; + int empty = 0; + for (int i = 0; i < catalysts.length; i++) { + if (catalysts[i].isEmpty()) empty++; + else recipe.catalysts[i] = catalysts[i]; + } + if (empty == catalysts.length) { + BetterEnd.LOGGER.warning("At least one catalyst must be non empty, recipe {} will be ignored!", id); + return; + } + EndRecipeManager.addRecipe(TYPE, recipe); } - if (output == null) { - BetterEnd.LOGGER.warning("Output for Infusion recipe can't be 'null', recipe {} will be ignored!", id); - return; - } - InfusionRecipe recipe = new InfusionRecipe(id, input, output); - recipe.group = group != null ? group : GROUP; - recipe.time = time; - int empty = 0; - for (int i = 0; i < catalysts.length; i++) { - if (catalysts[i].isEmpty()) empty++; - else recipe.catalysts[i] = catalysts[i]; - } - if (empty == catalysts.length) { - BetterEnd.LOGGER.warning("At least one catalyst must be non empty, recipe {} will be ignored!", id); - return; - } - EndRecipeManager.addRecipe(TYPE, recipe); } } From 5f3547de8e15f271e7958acb4a3afb680de8de20 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 5 Jan 2021 04:02:08 +0300 Subject: [PATCH 104/463] Block class rename --- .../ru/betterend/blocks/AeterniumBlock.java | 4 +- .../{BlockAmber.java => AmberBlock.java} | 6 +- ...ldIce.java => AncientEmeraldIceBlock.java} | 6 +- ...{BlockBlueVine.java => BlueVineBlock.java} | 4 +- ...Lantern.java => BlueVineLanternBlock.java} | 6 +- ...ueVineSeed.java => BlueVineSeedBlock.java} | 12 +- ...lockBrimstone.java => BrimstoneBlock.java} | 20 +- ...BubbleCoral.java => BubbleCoralBlock.java} | 6 +- ...{BlockBulbVine.java => BulbVineBlock.java} | 6 +- ...Lantern.java => BulbVineLanternBlock.java} | 9 +- ....java => BulbVineLanternColoredBlock.java} | 6 +- ...lbVineSeed.java => BulbVineSeedBlock.java} | 4 +- .../{BlockCharnia.java => CharniaBlock.java} | 4 +- ...ChorusGrass.java => ChorusGrassBlock.java} | 6 +- ...raldIce.java => DenseEmeraldIceBlock.java} | 6 +- ...lockDenseSnow.java => DenseSnowBlock.java} | 6 +- ...pling.java => DragonTreeSaplingBlock.java} | 6 +- ...ckEmeraldIce.java => EmeraldIceBlock.java} | 4 +- .../{BlockEndLily.java => EndLilyBlock.java} | 6 +- ...EndLilySeed.java => EndLilySeedBlock.java} | 10 +- ...usFlower.java => EndLotusFlowerBlock.java} | 6 +- ...dLotusLeaf.java => EndLotusLeafBlock.java} | 6 +- ...dLotusSeed.java => EndLotusSeedBlock.java} | 28 +- ...dLotusStem.java => EndLotusStemBlock.java} | 6 +- .../{BlockPath.java => EndPathBlock.java} | 10 +- .../java/ru/betterend/blocks/EndPedestal.java | 4 +- .../{BlockStone.java => EndStoneBlock.java} | 7 +- ...BlockTerrain.java => EndTerrainBlock.java} | 6 +- .../java/ru/betterend/blocks/EnderBlock.java | 4 +- ...dstoneDust.java => EndstoneDustBlock.java} | 4 +- .../ru/betterend/blocks/EternalPedestal.java | 4 +- ...GlowingMoss.java => GlowingMossBlock.java} | 6 +- ...java => GlowingPillarLuminophorBlock.java} | 6 +- ...oots.java => GlowingPillarRootsBlock.java} | 4 +- ...rSeed.java => GlowingPillarSeedBlock.java} | 8 +- ...eLeaves.java => HelixTreeLeavesBlock.java} | 6 +- ...apling.java => HelixTreeSaplingBlock.java} | 4 +- ...{BlockHydralux.java => HydraluxBlock.java} | 6 +- ...aluxPetal.java => HydraluxPetalBlock.java} | 8 +- ...ed.java => HydraluxPetalColoredBlock.java} | 4 +- ...Sapling.java => HydraluxSaplingBlock.java} | 4 +- ...alVent.java => HydrothermalVentBlock.java} | 6 +- .../ru/betterend/blocks/InfusionPedestal.java | 4 +- ...hroomCap.java => JellyshroomCapBlock.java} | 4 +- ...apling.java => LacugroveSaplingBlock.java} | 6 +- ...lockLanceleaf.java => LanceleafBlock.java} | 6 +- ...eleafSeed.java => LanceleafSeedBlock.java} | 4 +- ...ngerSponge.java => MengerSpongeBlock.java} | 6 +- ...ongeWet.java => MengerSpongeWetBlock.java} | 6 +- ...mCap.java => MossyGlowshroomCapBlock.java} | 6 +- ...a => MossyGlowshroomHymenophoreBlock.java} | 6 +- ....java => MossyGlowshroomSaplingBlock.java} | 6 +- ...{BlockMurkweed.java => MurkweedBlock.java} | 4 +- ...Needlegrass.java => NeedlegrassBlock.java} | 4 +- .../ru/betterend/blocks/PedestalVanilla.java | 4 +- ...ing.java => PythadendronSaplingBlock.java} | 6 +- ...nObelisk.java => RespawnObeliskBlock.java} | 6 +- .../ru/betterend/blocks/RunedFlavolite.java | 4 +- ...ShadowBerry.java => ShadowBerryBlock.java} | 4 +- ...ShadowGrass.java => ShadowGrassBlock.java} | 4 +- ...lkMothNest.java => SilkMothNestBlock.java} | 6 +- ...shroom.java => SmallJellyshroomBlock.java} | 6 +- ...rCrystal.java => SulphurCrystalBlock.java} | 6 +- ...aFlowers.java => TenaneaFlowersBlock.java} | 6 +- ...aSapling.java => TenaneaSaplingBlock.java} | 6 +- .../ru/betterend/blocks/TerminiteBlock.java | 4 +- ...rrainPlant.java => TerrainPlantBlock.java} | 6 +- ...oss.java => TwistedUmbrellaMossBlock.java} | 12 +- ...java => TwistedUmbrellaMossTallBlock.java} | 6 +- ...brellaMoss.java => UmbrellaMossBlock.java} | 12 +- ...ssTall.java => UmbrellaMossTallBlock.java} | 6 +- ...ter.java => UmbrellaTreeClusterBlock.java} | 6 +- ...ava => UmbrellaTreeClusterEmptyBlock.java} | 8 +- ...ne.java => UmbrellaTreeMembraneBlock.java} | 4 +- ...ing.java => UmbrellaTreeSaplingBlock.java} | 6 +- ...Column.java => VentBubbleColumnBlock.java} | 4 +- ...{BlockAttached.java => AttachedBlock.java} | 4 +- .../basis/{BlockBark.java => BarkBlock.java} | 4 +- .../basis/{BlockBase.java => BaseBlock.java} | 4 +- ...BaseNotFull.java => BaseBlockNotFull.java} | 4 +- .../blocks/basis/BaseBlockWithEntity.java | 1 - ...DoublePlant.java => DoublePlantBlock.java} | 6 +- .../{BlockBarrel.java => EndBarrelBlock.java} | 4 +- ...able.java => EndBlockStripableLogLog.java} | 4 +- ...kBookshelf.java => EndBookshelfBlock.java} | 4 +- .../{BlockChest.java => EndChestBlock.java} | 5 +- ...kComposter.java => EndComposterBlock.java} | 4 +- ...gTable.java => EndCraftingTableBlock.java} | 4 +- .../{BlockDoor.java => EndDoorBlock.java} | 4 +- .../{BlockFence.java => EndFenceBlock.java} | 5 +- .../{BlockGate.java => EndGateBlock.java} | 5 +- .../{BlockLadder.java => EndLadderBlock.java} | 4 +- ...BlockLantern.java => EndLanternBlock.java} | 6 +- .../{BlockLeaves.java => EndLeavesBlock.java} | 6 +- .../basis/{BlockOre.java => EndOreBlock.java} | 4 +- .../{BlockPillar.java => EndPillarBlock.java} | 4 +- .../{BlockPlant.java => EndPlantBlock.java} | 12 +- ...kPressurePlate.java => EndPlateBlock.java} | 5 +- .../{BlockSign.java => EndSignBlock.java} | 4 +- .../{BlockSlab.java => EndSlabBlock.java} | 5 +- .../{BlockStairs.java => EndStairsBlock.java} | 4 +- ...neButton.java => EndStoneButtonBlock.java} | 5 +- ...ssurePlate.java => EndStonelateBlock.java} | 5 +- ...ockTrapdoor.java => EndTrapdoorBlock.java} | 4 +- ....java => EndUnderwaterWallPlantBlock.java} | 8 +- .../{BlockWall.java => EndWallBlock.java} | 4 +- ...kWallPlant.java => EndWallPlantBlock.java} | 8 +- ...nButton.java => EndWoodenButtonBlock.java} | 4 +- ...eSapling.java => FeatureSaplingBlock.java} | 6 +- .../basis/{BlockFur.java => FurBlock.java} | 6 +- ...{BlockPedestal.java => PedestalBlock.java} | 24 +- ...antWithAge.java => PlantWithAgeBlock.java} | 6 +- ...mpleLeaves.java => SimpleLeavesBlock.java} | 6 +- ...oneLantern.java => StoneLanternBlock.java} | 4 +- ...tripable.java => StrippableBarkBlock.java} | 4 +- ...erPlant.java => UnderwaterPlantBlock.java} | 8 +- ....java => UnderwaterPlantWithAgeBlock.java} | 4 +- ...UpDownPlant.java => UpDownPlantBlock.java} | 4 +- .../basis/{BlockVine.java => VineBlock.java} | 8 +- ...llMushroom.java => WallMushroomBlock.java} | 4 +- .../blocks/complex/StoneMaterial.java | 44 +- .../blocks/complex/WoodenMaterial.java | 80 ++-- .../entities/BlockEntityHydrothermalVent.java | 6 +- .../blocks/entities/EBarrelBlockEntity.java | 4 +- .../blocks/entities/PedestalBlockEntity.java | 14 +- .../render/EndChestBlockEntityRenderer.java | 4 +- .../render/EndSignBlockEntityRenderer.java | 6 +- .../entities/render/PedestalItemRenderer.java | 6 +- .../client/gui/BlockSignEditScreen.java | 4 +- .../betterend/integration/byg/BYGBlocks.java | 8 +- .../betterend/registry/EndBlockEntities.java | 16 +- .../java/ru/betterend/registry/EndBlocks.java | 392 +++++++++--------- .../java/ru/betterend/registry/EndTags.java | 16 +- .../java/ru/betterend/util/BlocksHelper.java | 18 +- .../world/features/BlueVineFeature.java | 6 +- .../world/features/DoublePlantFeature.java | 8 +- .../world/features/EndLilyFeature.java | 4 +- .../world/features/EndLotusFeature.java | 4 +- .../world/features/EndLotusLeafFeature.java | 8 +- .../world/features/GlowPillarFeature.java | 4 +- .../world/features/HydraluxFeature.java | 4 +- .../world/features/LanceleafFeature.java | 4 +- .../SingleInvertedScatterFeature.java | 6 +- .../world/features/SinglePlantFeature.java | 14 +- .../features/UnderwaterPlantFeature.java | 8 +- .../world/features/WallPlantFeature.java | 16 +- .../features/bushes/TenaneaBushFeature.java | 4 +- .../world/features/terrain/GeyserFeature.java | 6 +- .../terrain/SulphuricCaveFeature.java | 8 +- .../terrain/SulphuricLakeFeature.java | 8 +- .../features/terrain/SurfaceVentFeature.java | 4 +- .../features/trees/HelixTreeFeature.java | 8 +- .../features/trees/JellyshroomFeature.java | 4 +- .../trees/MossyGlowshroomFeature.java | 12 +- .../world/features/trees/TenaneaFeature.java | 4 +- .../features/trees/UmbrellaTreeFeature.java | 14 +- .../StructureGiantMossyGlowshroom.java | 12 +- 157 files changed, 748 insertions(+), 756 deletions(-) rename src/main/java/ru/betterend/blocks/{BlockAmber.java => AmberBlock.java} (69%) rename src/main/java/ru/betterend/blocks/{BlockAncientEmeraldIce.java => AncientEmeraldIceBlock.java} (90%) rename src/main/java/ru/betterend/blocks/{BlockBlueVine.java => BlueVineBlock.java} (83%) rename src/main/java/ru/betterend/blocks/{BlockBlueVineLantern.java => BlueVineLanternBlock.java} (89%) rename src/main/java/ru/betterend/blocks/{BlockBlueVineSeed.java => BlueVineSeedBlock.java} (81%) rename src/main/java/ru/betterend/blocks/{BlockBrimstone.java => BrimstoneBlock.java} (75%) rename src/main/java/ru/betterend/blocks/{BlockBubbleCoral.java => BubbleCoralBlock.java} (89%) rename src/main/java/ru/betterend/blocks/{BlockBulbVine.java => BulbVineBlock.java} (89%) rename src/main/java/ru/betterend/blocks/{basis/BlockBulbVineLantern.java => BulbVineLanternBlock.java} (81%) rename src/main/java/ru/betterend/blocks/{basis/BlockBulbVineLanternColored.java => BulbVineLanternColoredBlock.java} (83%) rename src/main/java/ru/betterend/blocks/{BlockBulbVineSeed.java => BulbVineSeedBlock.java} (90%) rename src/main/java/ru/betterend/blocks/{BlockCharnia.java => CharniaBlock.java} (77%) rename src/main/java/ru/betterend/blocks/{BlockChorusGrass.java => ChorusGrassBlock.java} (62%) rename src/main/java/ru/betterend/blocks/{BlockDenseEmeraldIce.java => DenseEmeraldIceBlock.java} (71%) rename src/main/java/ru/betterend/blocks/{BlockDenseSnow.java => DenseSnowBlock.java} (68%) rename src/main/java/ru/betterend/blocks/{BlockDragonTreeSapling.java => DragonTreeSaplingBlock.java} (75%) rename src/main/java/ru/betterend/blocks/{BlockEmeraldIce.java => EmeraldIceBlock.java} (94%) rename src/main/java/ru/betterend/blocks/{BlockEndLily.java => EndLilyBlock.java} (94%) rename src/main/java/ru/betterend/blocks/{BlockEndLilySeed.java => EndLilySeedBlock.java} (73%) rename src/main/java/ru/betterend/blocks/{BlockEndLotusFlower.java => EndLotusFlowerBlock.java} (90%) rename src/main/java/ru/betterend/blocks/{BlockEndLotusLeaf.java => EndLotusLeafBlock.java} (92%) rename src/main/java/ru/betterend/blocks/{BlockEndLotusSeed.java => EndLotusSeedBlock.java} (71%) rename src/main/java/ru/betterend/blocks/{BlockEndLotusStem.java => EndLotusStemBlock.java} (93%) rename src/main/java/ru/betterend/blocks/{BlockPath.java => EndPathBlock.java} (84%) rename src/main/java/ru/betterend/blocks/{BlockStone.java => EndStoneBlock.java} (69%) rename src/main/java/ru/betterend/blocks/{BlockTerrain.java => EndTerrainBlock.java} (93%) rename src/main/java/ru/betterend/blocks/{BlockEndstoneDust.java => EndstoneDustBlock.java} (89%) rename src/main/java/ru/betterend/blocks/{BlockGlowingMoss.java => GlowingMossBlock.java} (80%) rename src/main/java/ru/betterend/blocks/{BlockGlowingPillarLuminophor.java => GlowingPillarLuminophorBlock.java} (89%) rename src/main/java/ru/betterend/blocks/{BlockGlowingPillarRoots.java => GlowingPillarRootsBlock.java} (81%) rename src/main/java/ru/betterend/blocks/{BlockGlowingPillarSeed.java => GlowingPillarSeedBlock.java} (89%) rename src/main/java/ru/betterend/blocks/{BlockHelixTreeLeaves.java => HelixTreeLeavesBlock.java} (93%) rename src/main/java/ru/betterend/blocks/{BlockHelixTreeSapling.java => HelixTreeSaplingBlock.java} (62%) rename src/main/java/ru/betterend/blocks/{BlockHydralux.java => HydraluxBlock.java} (92%) rename src/main/java/ru/betterend/blocks/{BlockHydraluxPetal.java => HydraluxPetalBlock.java} (77%) rename src/main/java/ru/betterend/blocks/{BlockHydraluxPetalColored.java => HydraluxPetalColoredBlock.java} (84%) rename src/main/java/ru/betterend/blocks/{BlockHydraluxSapling.java => HydraluxSaplingBlock.java} (90%) rename src/main/java/ru/betterend/blocks/{BlockHydrothermalVent.java => HydrothermalVentBlock.java} (94%) rename src/main/java/ru/betterend/blocks/{BlockJellyshroomCap.java => JellyshroomCapBlock.java} (93%) rename src/main/java/ru/betterend/blocks/{BlockLacugroveSapling.java => LacugroveSaplingBlock.java} (77%) rename src/main/java/ru/betterend/blocks/{BlockLanceleaf.java => LanceleafBlock.java} (90%) rename src/main/java/ru/betterend/blocks/{BlockLanceleafSeed.java => LanceleafSeedBlock.java} (91%) rename src/main/java/ru/betterend/blocks/{BlockMengerSponge.java => MengerSpongeBlock.java} (93%) rename src/main/java/ru/betterend/blocks/{BlockMengerSpongeWet.java => MengerSpongeWetBlock.java} (92%) rename src/main/java/ru/betterend/blocks/{BlockMossyGlowshroomCap.java => MossyGlowshroomCapBlock.java} (87%) rename src/main/java/ru/betterend/blocks/{BlockMossyGlowshroomHymenophore.java => MossyGlowshroomHymenophoreBlock.java} (70%) rename src/main/java/ru/betterend/blocks/{BlockMossyGlowshroomSapling.java => MossyGlowshroomSaplingBlock.java} (76%) rename src/main/java/ru/betterend/blocks/{BlockMurkweed.java => MurkweedBlock.java} (90%) rename src/main/java/ru/betterend/blocks/{BlockNeedlegrass.java => NeedlegrassBlock.java} (91%) rename src/main/java/ru/betterend/blocks/{BlockPythadendronSapling.java => PythadendronSaplingBlock.java} (75%) rename src/main/java/ru/betterend/blocks/{BlockRespawnObelisk.java => RespawnObeliskBlock.java} (95%) rename src/main/java/ru/betterend/blocks/{BlockShadowBerry.java => ShadowBerryBlock.java} (91%) rename src/main/java/ru/betterend/blocks/{BlockShadowGrass.java => ShadowGrassBlock.java} (87%) rename src/main/java/ru/betterend/blocks/{BlockSilkMothNest.java => SilkMothNestBlock.java} (93%) rename src/main/java/ru/betterend/blocks/{BlockSmallJellyshroom.java => SmallJellyshroomBlock.java} (93%) rename src/main/java/ru/betterend/blocks/{BlockSulphurCrystal.java => SulphurCrystalBlock.java} (94%) rename src/main/java/ru/betterend/blocks/{BlockTenaneaFlowers.java => TenaneaFlowersBlock.java} (91%) rename src/main/java/ru/betterend/blocks/{BlockTenaneaSapling.java => TenaneaSaplingBlock.java} (76%) rename src/main/java/ru/betterend/blocks/{BlockTerrainPlant.java => TerrainPlantBlock.java} (62%) rename src/main/java/ru/betterend/blocks/{BlockTwistedUmbrellaMoss.java => TwistedUmbrellaMossBlock.java} (76%) rename src/main/java/ru/betterend/blocks/{BlockTwistedUmbrellaMossTall.java => TwistedUmbrellaMossTallBlock.java} (80%) rename src/main/java/ru/betterend/blocks/{BlockUmbrellaMoss.java => UmbrellaMossBlock.java} (78%) rename src/main/java/ru/betterend/blocks/{BlockUmbrellaMossTall.java => UmbrellaMossTallBlock.java} (81%) rename src/main/java/ru/betterend/blocks/{BlockUmbrellaTreeCluster.java => UmbrellaTreeClusterBlock.java} (91%) rename src/main/java/ru/betterend/blocks/{BlockUmbrellaTreeClusterEmpty.java => UmbrellaTreeClusterEmptyBlock.java} (82%) rename src/main/java/ru/betterend/blocks/{BlockUmbrellaTreeMembrane.java => UmbrellaTreeMembraneBlock.java} (93%) rename src/main/java/ru/betterend/blocks/{BlockUmbrellaTreeSapling.java => UmbrellaTreeSaplingBlock.java} (78%) rename src/main/java/ru/betterend/blocks/{BlockVentBubbleColumn.java => VentBubbleColumnBlock.java} (95%) rename src/main/java/ru/betterend/blocks/basis/{BlockAttached.java => AttachedBlock.java} (93%) rename src/main/java/ru/betterend/blocks/basis/{BlockBark.java => BarkBlock.java} (86%) rename src/main/java/ru/betterend/blocks/basis/{BlockBase.java => BaseBlock.java} (88%) rename src/main/java/ru/betterend/blocks/basis/{BlockBaseNotFull.java => BaseBlockNotFull.java} (81%) rename src/main/java/ru/betterend/blocks/basis/{BlockDoublePlant.java => DoublePlantBlock.java} (94%) rename src/main/java/ru/betterend/blocks/basis/{BlockBarrel.java => EndBarrelBlock.java} (93%) rename src/main/java/ru/betterend/blocks/basis/{BlockBarkStripable.java => EndBlockStripableLogLog.java} (89%) rename src/main/java/ru/betterend/blocks/basis/{BlockBookshelf.java => EndBookshelfBlock.java} (92%) rename src/main/java/ru/betterend/blocks/basis/{BlockChest.java => EndChestBlock.java} (91%) rename src/main/java/ru/betterend/blocks/basis/{BlockComposter.java => EndComposterBlock.java} (88%) rename src/main/java/ru/betterend/blocks/basis/{BlockCraftingTable.java => EndCraftingTableBlock.java} (89%) rename src/main/java/ru/betterend/blocks/basis/{BlockDoor.java => EndDoorBlock.java} (93%) rename src/main/java/ru/betterend/blocks/basis/{BlockFence.java => EndFenceBlock.java} (90%) rename src/main/java/ru/betterend/blocks/basis/{BlockGate.java => EndGateBlock.java} (91%) rename src/main/java/ru/betterend/blocks/basis/{BlockLadder.java => EndLadderBlock.java} (94%) rename src/main/java/ru/betterend/blocks/basis/{BlockLantern.java => EndLanternBlock.java} (92%) rename src/main/java/ru/betterend/blocks/basis/{BlockLeaves.java => EndLeavesBlock.java} (90%) rename src/main/java/ru/betterend/blocks/basis/{BlockOre.java => EndOreBlock.java} (92%) rename src/main/java/ru/betterend/blocks/basis/{BlockPillar.java => EndPillarBlock.java} (86%) rename src/main/java/ru/betterend/blocks/basis/{BlockPlant.java => EndPlantBlock.java} (89%) rename src/main/java/ru/betterend/blocks/basis/{BlockPressurePlate.java => EndPlateBlock.java} (89%) rename src/main/java/ru/betterend/blocks/basis/{BlockSign.java => EndSignBlock.java} (95%) rename src/main/java/ru/betterend/blocks/basis/{BlockSlab.java => EndSlabBlock.java} (89%) rename src/main/java/ru/betterend/blocks/basis/{BlockStairs.java => EndStairsBlock.java} (90%) rename src/main/java/ru/betterend/blocks/basis/{BlockStoneButton.java => EndStoneButtonBlock.java} (90%) rename src/main/java/ru/betterend/blocks/basis/{BlockStonePressurePlate.java => EndStonelateBlock.java} (89%) rename src/main/java/ru/betterend/blocks/basis/{BlockTrapdoor.java => EndTrapdoorBlock.java} (89%) rename src/main/java/ru/betterend/blocks/basis/{BlockUnderwaterWallPlant.java => EndUnderwaterWallPlantBlock.java} (84%) rename src/main/java/ru/betterend/blocks/basis/{BlockWall.java => EndWallBlock.java} (91%) rename src/main/java/ru/betterend/blocks/basis/{BlockWallPlant.java => EndWallPlantBlock.java} (93%) rename src/main/java/ru/betterend/blocks/basis/{BlockWoodenButton.java => EndWoodenButtonBlock.java} (89%) rename src/main/java/ru/betterend/blocks/basis/{BlockFeatureSapling.java => FeatureSaplingBlock.java} (93%) rename src/main/java/ru/betterend/blocks/basis/{BlockFur.java => FurBlock.java} (91%) rename src/main/java/ru/betterend/blocks/basis/{BlockPedestal.java => PedestalBlock.java} (92%) rename src/main/java/ru/betterend/blocks/basis/{BlockPlantWithAge.java => PlantWithAgeBlock.java} (88%) rename src/main/java/ru/betterend/blocks/basis/{BlockSimpleLeaves.java => SimpleLeavesBlock.java} (88%) rename src/main/java/ru/betterend/blocks/basis/{BlockStoneLantern.java => StoneLanternBlock.java} (92%) rename src/main/java/ru/betterend/blocks/basis/{BlockLogStripable.java => StrippableBarkBlock.java} (90%) rename src/main/java/ru/betterend/blocks/basis/{BlockUnderwaterPlant.java => UnderwaterPlantBlock.java} (93%) rename src/main/java/ru/betterend/blocks/basis/{BlockUnderwaterPlantWithAge.java => UnderwaterPlantWithAgeBlock.java} (90%) rename src/main/java/ru/betterend/blocks/basis/{BlockUpDownPlant.java => UpDownPlantBlock.java} (94%) rename src/main/java/ru/betterend/blocks/basis/{BlockVine.java => VineBlock.java} (93%) rename src/main/java/ru/betterend/blocks/basis/{BlockWallMushroom.java => WallMushroomBlock.java} (89%) diff --git a/src/main/java/ru/betterend/blocks/AeterniumBlock.java b/src/main/java/ru/betterend/blocks/AeterniumBlock.java index e5e11578..580971f0 100644 --- a/src/main/java/ru/betterend/blocks/AeterniumBlock.java +++ b/src/main/java/ru/betterend/blocks/AeterniumBlock.java @@ -9,9 +9,9 @@ import net.minecraft.block.MaterialColor; import net.minecraft.sound.BlockSoundGroup; import net.minecraft.util.math.BlockPos; import net.minecraft.world.BlockView; -import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.BaseBlock; -public class AeterniumBlock extends BlockBase { +public class AeterniumBlock extends BaseBlock { public AeterniumBlock() { super(FabricBlockSettings.of(Material.METAL, MaterialColor.GRAY) diff --git a/src/main/java/ru/betterend/blocks/BlockAmber.java b/src/main/java/ru/betterend/blocks/AmberBlock.java similarity index 69% rename from src/main/java/ru/betterend/blocks/BlockAmber.java rename to src/main/java/ru/betterend/blocks/AmberBlock.java index a55fadb3..ccb5c7e1 100644 --- a/src/main/java/ru/betterend/blocks/BlockAmber.java +++ b/src/main/java/ru/betterend/blocks/AmberBlock.java @@ -3,10 +3,10 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.Blocks; import net.minecraft.block.MaterialColor; -import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.BaseBlock; -public class BlockAmber extends BlockBase { - public BlockAmber() { +public class AmberBlock extends BaseBlock { + public AmberBlock() { super(FabricBlockSettings.copyOf(Blocks.DIAMOND_BLOCK).materialColor(MaterialColor.YELLOW)); } } diff --git a/src/main/java/ru/betterend/blocks/BlockAncientEmeraldIce.java b/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java similarity index 90% rename from src/main/java/ru/betterend/blocks/BlockAncientEmeraldIce.java rename to src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java index 4cf5d63b..cf79803a 100644 --- a/src/main/java/ru/betterend/blocks/BlockAncientEmeraldIce.java +++ b/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java @@ -8,14 +8,14 @@ import net.minecraft.block.Blocks; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; -import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.BaseBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndParticles; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; -public class BlockAncientEmeraldIce extends BlockBase { - public BlockAncientEmeraldIce() { +public class AncientEmeraldIceBlock extends BaseBlock { + public AncientEmeraldIceBlock() { super(FabricBlockSettings.copyOf(Blocks.BLUE_ICE).ticksRandomly()); } diff --git a/src/main/java/ru/betterend/blocks/BlockBlueVine.java b/src/main/java/ru/betterend/blocks/BlueVineBlock.java similarity index 83% rename from src/main/java/ru/betterend/blocks/BlockBlueVine.java rename to src/main/java/ru/betterend/blocks/BlueVineBlock.java index 18512735..122225ae 100644 --- a/src/main/java/ru/betterend/blocks/BlockBlueVine.java +++ b/src/main/java/ru/betterend/blocks/BlueVineBlock.java @@ -5,10 +5,10 @@ import net.minecraft.block.BlockState; import net.minecraft.state.StateManager; import net.minecraft.state.property.EnumProperty; import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockUpDownPlant; +import ru.betterend.blocks.basis.UpDownPlantBlock; import ru.betterend.registry.EndBlocks; -public class BlockBlueVine extends BlockUpDownPlant { +public class BlueVineBlock extends UpDownPlantBlock { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; @Override diff --git a/src/main/java/ru/betterend/blocks/BlockBlueVineLantern.java b/src/main/java/ru/betterend/blocks/BlueVineLanternBlock.java similarity index 89% rename from src/main/java/ru/betterend/blocks/BlockBlueVineLantern.java rename to src/main/java/ru/betterend/blocks/BlueVineLanternBlock.java index 00be15ff..d89b2cda 100644 --- a/src/main/java/ru/betterend/blocks/BlockBlueVineLantern.java +++ b/src/main/java/ru/betterend/blocks/BlueVineLanternBlock.java @@ -13,13 +13,13 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; -import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.BaseBlock; import ru.betterend.registry.EndBlocks; -public class BlockBlueVineLantern extends BlockBase { +public class BlueVineLanternBlock extends BaseBlock { public static final BooleanProperty NATURAL = BlockProperties.NATURAL; - public BlockBlueVineLantern() { + public BlueVineLanternBlock() { super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sounds(BlockSoundGroup.WART_BLOCK).luminance(15)); this.setDefaultState(this.stateManager.getDefaultState().with(NATURAL, false)); } diff --git a/src/main/java/ru/betterend/blocks/BlockBlueVineSeed.java b/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java similarity index 81% rename from src/main/java/ru/betterend/blocks/BlockBlueVineSeed.java rename to src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java index 6b99ee18..de67fdac 100644 --- a/src/main/java/ru/betterend/blocks/BlockBlueVineSeed.java +++ b/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java @@ -7,13 +7,13 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockFur; -import ru.betterend.blocks.basis.BlockPlantWithAge; +import ru.betterend.blocks.basis.FurBlock; +import ru.betterend.blocks.basis.PlantWithAgeBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; -public class BlockBlueVineSeed extends BlockPlantWithAge { +public class BlueVineSeedBlock extends PlantWithAgeBlock { @Override public void growAdult(StructureWorldAccess world, Random random, BlockPos pos) { int height = MHelper.randRange(2, 5, random); @@ -30,15 +30,15 @@ public class BlockBlueVineSeed extends BlockPlantWithAge { } private void placeLantern(StructureWorldAccess world, BlockPos pos) { - BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.BLUE_VINE_LANTERN.getDefaultState().with(BlockBlueVineLantern.NATURAL, true)); + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.BLUE_VINE_LANTERN.getDefaultState().with(BlueVineLanternBlock.NATURAL, true)); for (Direction dir: BlocksHelper.HORIZONTAL) { BlockPos p = pos.offset(dir); if (world.isAir(p)) { - BlocksHelper.setWithoutUpdate(world, p, EndBlocks.BLUE_VINE_FUR.getDefaultState().with(BlockFur.FACING, dir)); + BlocksHelper.setWithoutUpdate(world, p, EndBlocks.BLUE_VINE_FUR.getDefaultState().with(FurBlock.FACING, dir)); } } if (world.isAir(pos.up())) { - BlocksHelper.setWithoutUpdate(world, pos.up(), EndBlocks.BLUE_VINE_FUR.getDefaultState().with(BlockFur.FACING, Direction.UP)); + BlocksHelper.setWithoutUpdate(world, pos.up(), EndBlocks.BLUE_VINE_FUR.getDefaultState().with(FurBlock.FACING, Direction.UP)); } } diff --git a/src/main/java/ru/betterend/blocks/BlockBrimstone.java b/src/main/java/ru/betterend/blocks/BrimstoneBlock.java similarity index 75% rename from src/main/java/ru/betterend/blocks/BlockBrimstone.java rename to src/main/java/ru/betterend/blocks/BrimstoneBlock.java index 7cbc9008..8d213b02 100644 --- a/src/main/java/ru/betterend/blocks/BlockBrimstone.java +++ b/src/main/java/ru/betterend/blocks/BrimstoneBlock.java @@ -13,14 +13,14 @@ import net.minecraft.state.StateManager; import net.minecraft.state.property.BooleanProperty; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; -import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.BaseBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; -public class BlockBrimstone extends BlockBase { +public class BrimstoneBlock extends BaseBlock { public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; - public BlockBrimstone() { + public BrimstoneBlock() { super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(MaterialColor.BROWN).ticksRandomly()); setDefaultState(stateManager.getDefaultState().with(ACTIVATED, false)); } @@ -47,17 +47,17 @@ public class BlockBrimstone extends BlockBase { Direction dir = BlocksHelper.randomDirection(random); BlockPos side = pos.offset(dir); BlockState sideState = world.getBlockState(side); - if (sideState.getBlock() instanceof BlockSulphurCrystal) { - if (sideState.get(BlockSulphurCrystal.AGE) < 2 && sideState.get(BlockSulphurCrystal.WATERLOGGED)) { - int age = sideState.get(BlockSulphurCrystal.AGE) + 1; - world.setBlockState(side, sideState.with(BlockSulphurCrystal.AGE, age)); + if (sideState.getBlock() instanceof SulphurCrystalBlock) { + if (sideState.get(SulphurCrystalBlock.AGE) < 2 && sideState.get(SulphurCrystalBlock.WATERLOGGED)) { + int age = sideState.get(SulphurCrystalBlock.AGE) + 1; + world.setBlockState(side, sideState.with(SulphurCrystalBlock.AGE, age)); } } else if (sideState.getFluidState().getFluid() == Fluids.WATER) { BlockState crystal = EndBlocks.SULPHUR_CRYSTAL.getDefaultState() - .with(BlockSulphurCrystal.FACING, dir) - .with(BlockSulphurCrystal.WATERLOGGED, true) - .with(BlockSulphurCrystal.AGE, 0); + .with(SulphurCrystalBlock.FACING, dir) + .with(SulphurCrystalBlock.WATERLOGGED, true) + .with(SulphurCrystalBlock.AGE, 0); world.setBlockState(side, crystal); } } diff --git a/src/main/java/ru/betterend/blocks/BlockBubbleCoral.java b/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java similarity index 89% rename from src/main/java/ru/betterend/blocks/BlockBubbleCoral.java rename to src/main/java/ru/betterend/blocks/BubbleCoralBlock.java index f2bff154..0cab0586 100644 --- a/src/main/java/ru/betterend/blocks/BlockBubbleCoral.java +++ b/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java @@ -17,12 +17,12 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.BlockView; import net.minecraft.world.World; -import ru.betterend.blocks.basis.BlockUnderwaterPlant; +import ru.betterend.blocks.basis.UnderwaterPlantBlock; -public class BlockBubbleCoral extends BlockUnderwaterPlant { +public class BubbleCoralBlock extends UnderwaterPlantBlock { private static final VoxelShape SHAPE = Block.createCuboidShape(0, 0, 0, 16, 14, 16); - public BlockBubbleCoral() { + public BubbleCoralBlock() { super(FabricBlockSettings.of(Material.UNDERWATER_PLANT) .breakByTool(FabricToolTags.SHEARS) .sounds(BlockSoundGroup.CORAL) diff --git a/src/main/java/ru/betterend/blocks/BlockBulbVine.java b/src/main/java/ru/betterend/blocks/BulbVineBlock.java similarity index 89% rename from src/main/java/ru/betterend/blocks/BlockBulbVine.java rename to src/main/java/ru/betterend/blocks/BulbVineBlock.java index 5f17366f..d88e55aa 100644 --- a/src/main/java/ru/betterend/blocks/BlockBulbVine.java +++ b/src/main/java/ru/betterend/blocks/BulbVineBlock.java @@ -11,13 +11,13 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.BlockView; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockVine; +import ru.betterend.blocks.basis.VineBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; import ru.betterend.util.MHelper; -public class BlockBulbVine extends BlockVine { - public BlockBulbVine() { +public class BulbVineBlock extends VineBlock { + public BulbVineBlock() { super(15, true); } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockBulbVineLantern.java b/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java similarity index 81% rename from src/main/java/ru/betterend/blocks/basis/BlockBulbVineLantern.java rename to src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java index a02c7b44..1a6f715c 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockBulbVineLantern.java +++ b/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java @@ -1,4 +1,4 @@ -package ru.betterend.blocks.basis; +package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; @@ -11,14 +11,15 @@ import net.minecraft.sound.BlockSoundGroup; import net.minecraft.util.math.BlockPos; import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.BlockView; +import ru.betterend.blocks.basis.EndLanternBlock; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; -public class BlockBulbVineLantern extends BlockLantern implements IRenderTypeable { +public class BulbVineLanternBlock extends EndLanternBlock implements IRenderTypeable { private static final VoxelShape SHAPE_CEIL = Block.createCuboidShape(4, 4, 4, 12, 16, 12); private static final VoxelShape SHAPE_FLOOR = Block.createCuboidShape(4, 0, 4, 12, 12, 12); - public BlockBulbVineLantern() { + public BulbVineLanternBlock() { this(FabricBlockSettings.of(Material.METAL) .sounds(BlockSoundGroup.LANTERN) .hardness(1) @@ -29,7 +30,7 @@ public class BlockBulbVineLantern extends BlockLantern implements IRenderTypeabl .luminance(15)); } - public BlockBulbVineLantern(FabricBlockSettings settings) { + public BulbVineLanternBlock(FabricBlockSettings settings) { super(settings); } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockBulbVineLanternColored.java b/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java similarity index 83% rename from src/main/java/ru/betterend/blocks/basis/BlockBulbVineLanternColored.java rename to src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java index b567a990..edcbbbb3 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockBulbVineLanternColored.java +++ b/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java @@ -1,4 +1,4 @@ -package ru.betterend.blocks.basis; +package ru.betterend.blocks; import java.io.Reader; @@ -10,8 +10,8 @@ import ru.betterend.interfaces.IColorProvider; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class BlockBulbVineLanternColored extends BlockBulbVineLantern implements IColorProvider, BlockPatterned { - public BlockBulbVineLanternColored(FabricBlockSettings settings) { +public class BulbVineLanternColoredBlock extends BulbVineLanternBlock implements IColorProvider, BlockPatterned { + public BulbVineLanternColoredBlock(FabricBlockSettings settings) { super(settings); } diff --git a/src/main/java/ru/betterend/blocks/BlockBulbVineSeed.java b/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java similarity index 90% rename from src/main/java/ru/betterend/blocks/BlockBulbVineSeed.java rename to src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java index c1b265e5..f22f46f0 100644 --- a/src/main/java/ru/betterend/blocks/BlockBulbVineSeed.java +++ b/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java @@ -8,12 +8,12 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockPlantWithAge; +import ru.betterend.blocks.basis.PlantWithAgeBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; -public class BlockBulbVineSeed extends BlockPlantWithAge { +public class BulbVineSeedBlock extends PlantWithAgeBlock { @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { BlockState up = world.getBlockState(pos.up()); diff --git a/src/main/java/ru/betterend/blocks/BlockCharnia.java b/src/main/java/ru/betterend/blocks/CharniaBlock.java similarity index 77% rename from src/main/java/ru/betterend/blocks/BlockCharnia.java rename to src/main/java/ru/betterend/blocks/CharniaBlock.java index 044a506e..e1162d4b 100644 --- a/src/main/java/ru/betterend/blocks/BlockCharnia.java +++ b/src/main/java/ru/betterend/blocks/CharniaBlock.java @@ -5,9 +5,9 @@ import net.minecraft.fluid.Fluids; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.WorldView; -import ru.betterend.blocks.basis.BlockUnderwaterPlant; +import ru.betterend.blocks.basis.UnderwaterPlantBlock; -public class BlockCharnia extends BlockUnderwaterPlant { +public class CharniaBlock extends UnderwaterPlantBlock { @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { return sideCoversSmallSquare(world, pos.down(), Direction.UP) && world.getFluidState(pos).getFluid() == Fluids.WATER; diff --git a/src/main/java/ru/betterend/blocks/BlockChorusGrass.java b/src/main/java/ru/betterend/blocks/ChorusGrassBlock.java similarity index 62% rename from src/main/java/ru/betterend/blocks/BlockChorusGrass.java rename to src/main/java/ru/betterend/blocks/ChorusGrassBlock.java index c9cfefc3..2b603a45 100644 --- a/src/main/java/ru/betterend/blocks/BlockChorusGrass.java +++ b/src/main/java/ru/betterend/blocks/ChorusGrassBlock.java @@ -1,11 +1,11 @@ package ru.betterend.blocks; import net.minecraft.block.BlockState; -import ru.betterend.blocks.basis.BlockPlant; +import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; -public class BlockChorusGrass extends BlockPlant { - public BlockChorusGrass() { +public class ChorusGrassBlock extends EndPlantBlock { + public ChorusGrassBlock() { super(true); } diff --git a/src/main/java/ru/betterend/blocks/BlockDenseEmeraldIce.java b/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java similarity index 71% rename from src/main/java/ru/betterend/blocks/BlockDenseEmeraldIce.java rename to src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java index f2232a99..e94b0a6f 100644 --- a/src/main/java/ru/betterend/blocks/BlockDenseEmeraldIce.java +++ b/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java @@ -2,12 +2,12 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.Blocks; -import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.BaseBlock; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; -public class BlockDenseEmeraldIce extends BlockBase implements IRenderTypeable { - public BlockDenseEmeraldIce() { +public class DenseEmeraldIceBlock extends BaseBlock implements IRenderTypeable { + public DenseEmeraldIceBlock() { super(FabricBlockSettings.copyOf(Blocks.PACKED_ICE)); } diff --git a/src/main/java/ru/betterend/blocks/BlockDenseSnow.java b/src/main/java/ru/betterend/blocks/DenseSnowBlock.java similarity index 68% rename from src/main/java/ru/betterend/blocks/BlockDenseSnow.java rename to src/main/java/ru/betterend/blocks/DenseSnowBlock.java index 5ea8e7a0..a408291f 100644 --- a/src/main/java/ru/betterend/blocks/BlockDenseSnow.java +++ b/src/main/java/ru/betterend/blocks/DenseSnowBlock.java @@ -3,10 +3,10 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.Material; import net.minecraft.sound.BlockSoundGroup; -import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.BaseBlock; -public class BlockDenseSnow extends BlockBase { - public BlockDenseSnow() { +public class DenseSnowBlock extends BaseBlock { + public DenseSnowBlock() { super(FabricBlockSettings.of(Material.SNOW_BLOCK).strength(0.2F).sounds(BlockSoundGroup.SNOW)); } } diff --git a/src/main/java/ru/betterend/blocks/BlockDragonTreeSapling.java b/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java similarity index 75% rename from src/main/java/ru/betterend/blocks/BlockDragonTreeSapling.java rename to src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java index fe2d405c..5fdd924e 100644 --- a/src/main/java/ru/betterend/blocks/BlockDragonTreeSapling.java +++ b/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java @@ -4,12 +4,12 @@ import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldView; import net.minecraft.world.gen.feature.Feature; -import ru.betterend.blocks.basis.BlockFeatureSapling; +import ru.betterend.blocks.basis.FeatureSaplingBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; -public class BlockDragonTreeSapling extends BlockFeatureSapling { - public BlockDragonTreeSapling() { +public class DragonTreeSaplingBlock extends FeatureSaplingBlock { + public DragonTreeSaplingBlock() { super(); } diff --git a/src/main/java/ru/betterend/blocks/BlockEmeraldIce.java b/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java similarity index 94% rename from src/main/java/ru/betterend/blocks/BlockEmeraldIce.java rename to src/main/java/ru/betterend/blocks/EmeraldIceBlock.java index 3e67efbd..ee96f6a1 100644 --- a/src/main/java/ru/betterend/blocks/BlockEmeraldIce.java +++ b/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java @@ -29,8 +29,8 @@ import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class BlockEmeraldIce extends TransparentBlock implements IRenderTypeable, BlockPatterned { - public BlockEmeraldIce() { +public class EmeraldIceBlock extends TransparentBlock implements IRenderTypeable, BlockPatterned { + public EmeraldIceBlock() { super(FabricBlockSettings.copyOf(Blocks.ICE)); } diff --git a/src/main/java/ru/betterend/blocks/BlockEndLily.java b/src/main/java/ru/betterend/blocks/EndLilyBlock.java similarity index 94% rename from src/main/java/ru/betterend/blocks/BlockEndLily.java rename to src/main/java/ru/betterend/blocks/EndLilyBlock.java index 5b78d7ef..6d43dd97 100644 --- a/src/main/java/ru/betterend/blocks/BlockEndLily.java +++ b/src/main/java/ru/betterend/blocks/EndLilyBlock.java @@ -31,17 +31,17 @@ import net.minecraft.world.World; import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockUnderwaterPlant; +import ru.betterend.blocks.basis.UnderwaterPlantBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; import ru.betterend.util.MHelper; -public class BlockEndLily extends BlockUnderwaterPlant { +public class EndLilyBlock extends UnderwaterPlantBlock { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; private static final VoxelShape SHAPE_BOTTOM = Block.createCuboidShape(4, 0, 4, 12, 16, 12); private static final VoxelShape SHAPE_TOP = Block.createCuboidShape(2, 0, 2, 14, 6, 14); - public BlockEndLily() { + public EndLilyBlock() { super(FabricBlockSettings.of(Material.UNDERWATER_PLANT) .breakByTool(FabricToolTags.SHEARS) .sounds(BlockSoundGroup.WET_GRASS) diff --git a/src/main/java/ru/betterend/blocks/BlockEndLilySeed.java b/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java similarity index 73% rename from src/main/java/ru/betterend/blocks/BlockEndLilySeed.java rename to src/main/java/ru/betterend/blocks/EndLilySeedBlock.java index 6eb44873..05226df8 100644 --- a/src/main/java/ru/betterend/blocks/BlockEndLilySeed.java +++ b/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java @@ -6,21 +6,21 @@ import net.minecraft.fluid.Fluids; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockUnderwaterPlantWithAge; +import ru.betterend.blocks.basis.UnderwaterPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; -public class BlockEndLilySeed extends BlockUnderwaterPlantWithAge { +public class EndLilySeedBlock extends UnderwaterPlantWithAgeBlock { @Override public void grow(StructureWorldAccess world, Random random, BlockPos pos) { if (canGrow(world, pos)) { - BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.END_LILY.getDefaultState().with(BlockEndLily.SHAPE, TripleShape.BOTTOM)); + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.END_LILY.getDefaultState().with(EndLilyBlock.SHAPE, TripleShape.BOTTOM)); BlockPos up = pos.up(); while (world.getFluidState(up).isStill()) { - BlocksHelper.setWithoutUpdate(world, up, EndBlocks.END_LILY.getDefaultState().with(BlockEndLily.SHAPE, TripleShape.MIDDLE)); + BlocksHelper.setWithoutUpdate(world, up, EndBlocks.END_LILY.getDefaultState().with(EndLilyBlock.SHAPE, TripleShape.MIDDLE)); up = up.up(); } - BlocksHelper.setWithoutUpdate(world, up, EndBlocks.END_LILY.getDefaultState().with(BlockEndLily.SHAPE, TripleShape.TOP)); + BlocksHelper.setWithoutUpdate(world, up, EndBlocks.END_LILY.getDefaultState().with(EndLilyBlock.SHAPE, TripleShape.TOP)); } } diff --git a/src/main/java/ru/betterend/blocks/BlockEndLotusFlower.java b/src/main/java/ru/betterend/blocks/EndLotusFlowerBlock.java similarity index 90% rename from src/main/java/ru/betterend/blocks/BlockEndLotusFlower.java rename to src/main/java/ru/betterend/blocks/EndLotusFlowerBlock.java index b2680baf..8222111e 100644 --- a/src/main/java/ru/betterend/blocks/BlockEndLotusFlower.java +++ b/src/main/java/ru/betterend/blocks/EndLotusFlowerBlock.java @@ -17,15 +17,15 @@ import net.minecraft.loot.context.LootContext; import net.minecraft.util.math.BlockPos; import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.BlockView; -import ru.betterend.blocks.basis.BlockPlant; +import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; -public class BlockEndLotusFlower extends BlockPlant { +public class EndLotusFlowerBlock extends EndPlantBlock { private static final VoxelShape SHAPE_OUTLINE = Block.createCuboidShape(2, 0, 2, 14, 14, 14); private static final VoxelShape SHAPE_COLLISION = Block.createCuboidShape(0, 0, 0, 16, 2, 16); - public BlockEndLotusFlower() { + public EndLotusFlowerBlock() { super(FabricBlockSettings.of(Material.PLANT).nonOpaque().luminance(15)); } diff --git a/src/main/java/ru/betterend/blocks/BlockEndLotusLeaf.java b/src/main/java/ru/betterend/blocks/EndLotusLeafBlock.java similarity index 92% rename from src/main/java/ru/betterend/blocks/BlockEndLotusLeaf.java rename to src/main/java/ru/betterend/blocks/EndLotusLeafBlock.java index 3ec3bcef..2281bb7e 100644 --- a/src/main/java/ru/betterend/blocks/BlockEndLotusLeaf.java +++ b/src/main/java/ru/betterend/blocks/EndLotusLeafBlock.java @@ -21,18 +21,18 @@ import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.BlockView; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockBaseNotFull; +import ru.betterend.blocks.basis.BaseBlockNotFull; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; -public class BlockEndLotusLeaf extends BlockBaseNotFull implements IRenderTypeable { +public class EndLotusLeafBlock extends BaseBlockNotFull implements IRenderTypeable { public static final EnumProperty HORIZONTAL_FACING = Properties.HORIZONTAL_FACING; public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; private static final VoxelShape VSHAPE = Block.createCuboidShape(0, 0, 0, 16, 1, 16); - public BlockEndLotusLeaf() { + public EndLotusLeafBlock() { super(FabricBlockSettings.of(Material.PLANT).nonOpaque().sounds(BlockSoundGroup.WET_GRASS)); } diff --git a/src/main/java/ru/betterend/blocks/BlockEndLotusSeed.java b/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java similarity index 71% rename from src/main/java/ru/betterend/blocks/BlockEndLotusSeed.java rename to src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java index 31fe5b20..ce8fc56a 100644 --- a/src/main/java/ru/betterend/blocks/BlockEndLotusSeed.java +++ b/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java @@ -9,16 +9,16 @@ import net.minecraft.util.math.BlockPos.Mutable; import net.minecraft.util.math.Direction; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockUnderwaterPlantWithAge; +import ru.betterend.blocks.basis.UnderwaterPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; -public class BlockEndLotusSeed extends BlockUnderwaterPlantWithAge { +public class EndLotusSeedBlock extends UnderwaterPlantWithAgeBlock { @Override public void grow(StructureWorldAccess world, Random random, BlockPos pos) { if (canGrow(world, pos)) { - BlockState startLeaf = EndBlocks.END_LOTUS_STEM.getDefaultState().with(BlockEndLotusStem.LEAF, true); - BlockState roots = EndBlocks.END_LOTUS_STEM.getDefaultState().with(BlockEndLotusStem.SHAPE, TripleShape.BOTTOM).with(BlockEndLotusStem.WATERLOGGED, true); + BlockState startLeaf = EndBlocks.END_LOTUS_STEM.getDefaultState().with(EndLotusStemBlock.LEAF, true); + BlockState roots = EndBlocks.END_LOTUS_STEM.getDefaultState().with(EndLotusStemBlock.SHAPE, TripleShape.BOTTOM).with(EndLotusStemBlock.WATERLOGGED, true); BlockState stem = EndBlocks.END_LOTUS_STEM.getDefaultState(); BlockState flower = EndBlocks.END_LOTUS_FLOWER.getDefaultState(); @@ -26,7 +26,7 @@ public class BlockEndLotusSeed extends BlockUnderwaterPlantWithAge { Mutable bpos = new Mutable().set(pos); bpos.setY(bpos.getY() + 1); while (world.getFluidState(bpos).isStill()) { - BlocksHelper.setWithoutUpdate(world, bpos, stem.with(BlockEndLotusStem.WATERLOGGED, true)); + BlocksHelper.setWithoutUpdate(world, bpos, stem.with(EndLotusStemBlock.WATERLOGGED, true)); bpos.setY(bpos.getY() + 1); } @@ -36,10 +36,10 @@ public class BlockEndLotusSeed extends BlockUnderwaterPlantWithAge { BlockPos leafCenter = bpos.toImmutable().offset(dir); if (hasLeaf(world, leafCenter)) { generateLeaf(world, leafCenter); - BlocksHelper.setWithoutUpdate(world, bpos, startLeaf.with(BlockEndLotusStem.SHAPE, shape).with(BlockEndLotusStem.FACING, dir)); + BlocksHelper.setWithoutUpdate(world, bpos, startLeaf.with(EndLotusStemBlock.SHAPE, shape).with(EndLotusStemBlock.FACING, dir)); } else { - BlocksHelper.setWithoutUpdate(world, bpos, stem.with(BlockEndLotusStem.SHAPE, shape)); + BlocksHelper.setWithoutUpdate(world, bpos, stem.with(EndLotusStemBlock.SHAPE, shape)); } bpos.setY(bpos.getY() + 1); @@ -49,7 +49,7 @@ public class BlockEndLotusSeed extends BlockUnderwaterPlantWithAge { BlocksHelper.setWithoutUpdate(world, bpos, flower); bpos.setY(bpos.getY() - 1); stem = world.getBlockState(bpos); - BlocksHelper.setWithoutUpdate(world, bpos, stem.with(BlockEndLotusStem.SHAPE, TripleShape.TOP)); + BlocksHelper.setWithoutUpdate(world, bpos, stem.with(EndLotusStemBlock.SHAPE, TripleShape.TOP)); return; } BlocksHelper.setWithoutUpdate(world, bpos, stem); @@ -66,15 +66,15 @@ public class BlockEndLotusSeed extends BlockUnderwaterPlantWithAge { if (!stem.isOf(EndBlocks.END_LOTUS_STEM)) { stem = EndBlocks.END_LOTUS_STEM.getDefaultState(); if (!world.getBlockState(bpos.north()).getFluidState().isEmpty()) { - stem = stem.with(BlockEndLotusStem.WATERLOGGED, true); + stem = stem.with(EndLotusStemBlock.WATERLOGGED, true); } } if (world.getBlockState(bpos.offset(dir)).isOf(EndBlocks.END_LOTUS_LEAF)) { - stem = stem.with(BlockEndLotusStem.LEAF, true).with(BlockEndLotusStem.FACING, dir); + stem = stem.with(EndLotusStemBlock.LEAF, true).with(EndLotusStemBlock.FACING, dir); } - BlocksHelper.setWithoutUpdate(world, bpos, stem.with(BlockEndLotusStem.SHAPE, TripleShape.TOP)); + BlocksHelper.setWithoutUpdate(world, bpos, stem.with(EndLotusStemBlock.SHAPE, TripleShape.TOP)); } } @@ -90,14 +90,14 @@ public class BlockEndLotusSeed extends BlockUnderwaterPlantWithAge { private void generateLeaf(StructureWorldAccess world, BlockPos pos) { Mutable p = new Mutable(); BlockState leaf = EndBlocks.END_LOTUS_LEAF.getDefaultState(); - BlocksHelper.setWithoutUpdate(world, pos, leaf.with(BlockEndLotusLeaf.SHAPE, TripleShape.BOTTOM)); + BlocksHelper.setWithoutUpdate(world, pos, leaf.with(EndLotusLeafBlock.SHAPE, TripleShape.BOTTOM)); for (Direction move: BlocksHelper.HORIZONTAL) { - BlocksHelper.setWithoutUpdate(world, p.set(pos).move(move), leaf.with(BlockEndLotusLeaf.HORIZONTAL_FACING, move).with(BlockEndLotusLeaf.SHAPE, TripleShape.MIDDLE)); + BlocksHelper.setWithoutUpdate(world, p.set(pos).move(move), leaf.with(EndLotusLeafBlock.HORIZONTAL_FACING, move).with(EndLotusLeafBlock.SHAPE, TripleShape.MIDDLE)); } for (int i = 0; i < 4; i ++) { Direction d1 = BlocksHelper.HORIZONTAL[i]; Direction d2 = BlocksHelper.HORIZONTAL[(i + 1) & 3]; - BlocksHelper.setWithoutUpdate(world, p.set(pos).move(d1).move(d2), leaf.with(BlockEndLotusLeaf.HORIZONTAL_FACING, d1).with(BlockEndLotusLeaf.SHAPE, TripleShape.TOP)); + BlocksHelper.setWithoutUpdate(world, p.set(pos).move(d1).move(d2), leaf.with(EndLotusLeafBlock.HORIZONTAL_FACING, d1).with(EndLotusLeafBlock.SHAPE, TripleShape.TOP)); } } diff --git a/src/main/java/ru/betterend/blocks/BlockEndLotusStem.java b/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java similarity index 93% rename from src/main/java/ru/betterend/blocks/BlockEndLotusStem.java rename to src/main/java/ru/betterend/blocks/EndLotusStemBlock.java index ec17e2f0..62acf529 100644 --- a/src/main/java/ru/betterend/blocks/BlockEndLotusStem.java +++ b/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java @@ -26,19 +26,19 @@ import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.BlockView; import net.minecraft.world.WorldAccess; import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.BaseBlock; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.util.BlocksHelper; -public class BlockEndLotusStem extends BlockBase implements Waterloggable, IRenderTypeable { +public class EndLotusStemBlock extends BaseBlock implements Waterloggable, IRenderTypeable { public static final EnumProperty FACING = Properties.FACING; public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; public static final BooleanProperty LEAF = BooleanProperty.of("leaf"); public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; private static final Map SHAPES = Maps.newEnumMap(Axis.class); - public BlockEndLotusStem() { + public EndLotusStemBlock() { super(FabricBlockSettings.copyOf(Blocks.OAK_PLANKS)); this.setDefaultState(getDefaultState().with(WATERLOGGED, false).with(SHAPE, TripleShape.MIDDLE).with(LEAF, false).with(FACING, Direction.UP)); } diff --git a/src/main/java/ru/betterend/blocks/BlockPath.java b/src/main/java/ru/betterend/blocks/EndPathBlock.java similarity index 84% rename from src/main/java/ru/betterend/blocks/BlockPath.java rename to src/main/java/ru/betterend/blocks/EndPathBlock.java index f6f99453..4b3a28bf 100644 --- a/src/main/java/ru/betterend/blocks/BlockPath.java +++ b/src/main/java/ru/betterend/blocks/EndPathBlock.java @@ -16,15 +16,15 @@ import net.minecraft.loot.context.LootContextParameters; import net.minecraft.util.math.BlockPos; import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.BlockView; -import ru.betterend.blocks.basis.BlockBaseNotFull; +import ru.betterend.blocks.basis.BaseBlockNotFull; -public class BlockPath extends BlockBaseNotFull { +public class EndPathBlock extends BaseBlockNotFull { private static final VoxelShape SHAPE = Block.createCuboidShape(0, 0, 0, 16, 15, 16); - public BlockPath(Block source) { + public EndPathBlock(Block source) { super(FabricBlockSettings.copyOf(source).allowsSpawning((state, world, pos, type) -> { return false; })); - if (source instanceof BlockTerrain) { - BlockTerrain terrain = (BlockTerrain) source; + if (source instanceof EndTerrainBlock) { + EndTerrainBlock terrain = (EndTerrainBlock) source; terrain.setPathBlock(this); } } diff --git a/src/main/java/ru/betterend/blocks/EndPedestal.java b/src/main/java/ru/betterend/blocks/EndPedestal.java index 54517efa..e46e154f 100644 --- a/src/main/java/ru/betterend/blocks/EndPedestal.java +++ b/src/main/java/ru/betterend/blocks/EndPedestal.java @@ -7,10 +7,10 @@ import net.minecraft.block.Block; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; import ru.betterend.BetterEnd; -import ru.betterend.blocks.basis.BlockPedestal; +import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.patterns.Patterns; -public class EndPedestal extends BlockPedestal { +public class EndPedestal extends PedestalBlock { public EndPedestal(Block parent) { super(parent); diff --git a/src/main/java/ru/betterend/blocks/BlockStone.java b/src/main/java/ru/betterend/blocks/EndStoneBlock.java similarity index 69% rename from src/main/java/ru/betterend/blocks/BlockStone.java rename to src/main/java/ru/betterend/blocks/EndStoneBlock.java index d8b9dd53..399333c1 100644 --- a/src/main/java/ru/betterend/blocks/BlockStone.java +++ b/src/main/java/ru/betterend/blocks/EndStoneBlock.java @@ -4,11 +4,10 @@ import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.Blocks; import net.minecraft.block.MaterialColor; import net.minecraft.sound.BlockSoundGroup; -import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.BaseBlock; -public class BlockStone extends BlockBase { - - public BlockStone(MaterialColor color) { +public class EndStoneBlock extends BaseBlock { + public EndStoneBlock(MaterialColor color) { super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color).sounds(BlockSoundGroup.STONE)); } } diff --git a/src/main/java/ru/betterend/blocks/BlockTerrain.java b/src/main/java/ru/betterend/blocks/EndTerrainBlock.java similarity index 93% rename from src/main/java/ru/betterend/blocks/BlockTerrain.java rename to src/main/java/ru/betterend/blocks/EndTerrainBlock.java index e47e1905..489fbdd8 100644 --- a/src/main/java/ru/betterend/blocks/BlockTerrain.java +++ b/src/main/java/ru/betterend/blocks/EndTerrainBlock.java @@ -29,12 +29,12 @@ import net.minecraft.util.math.Direction; import net.minecraft.world.World; import net.minecraft.world.WorldView; import net.minecraft.world.chunk.light.ChunkLightProvider; -import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.BaseBlock; -public class BlockTerrain extends BlockBase { +public class EndTerrainBlock extends BaseBlock { private Block pathBlock; - public BlockTerrain(MaterialColor color) { + public EndTerrainBlock(MaterialColor color) { super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color).sounds(BlockSounds.TERRAIN_SOUND).ticksRandomly()); } diff --git a/src/main/java/ru/betterend/blocks/EnderBlock.java b/src/main/java/ru/betterend/blocks/EnderBlock.java index 1b80fabd..e1d1552f 100644 --- a/src/main/java/ru/betterend/blocks/EnderBlock.java +++ b/src/main/java/ru/betterend/blocks/EnderBlock.java @@ -9,9 +9,9 @@ import net.minecraft.block.MaterialColor; import net.minecraft.sound.BlockSoundGroup; import net.minecraft.util.math.BlockPos; import net.minecraft.world.BlockView; -import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.BaseBlock; -public class EnderBlock extends BlockBase { +public class EnderBlock extends BaseBlock { public EnderBlock() { super(FabricBlockSettings.of(Material.STONE, MaterialColor.field_25708) diff --git a/src/main/java/ru/betterend/blocks/BlockEndstoneDust.java b/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java similarity index 89% rename from src/main/java/ru/betterend/blocks/BlockEndstoneDust.java rename to src/main/java/ru/betterend/blocks/EndstoneDustBlock.java index 77843c7f..81504106 100644 --- a/src/main/java/ru/betterend/blocks/BlockEndstoneDust.java +++ b/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java @@ -15,11 +15,11 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.BlockView; import ru.betterend.util.MHelper; -public class BlockEndstoneDust extends FallingBlock { +public class EndstoneDustBlock extends FallingBlock { @Environment(EnvType.CLIENT) private static final int COLOR = MHelper.color(226, 239, 168); - public BlockEndstoneDust() { + public EndstoneDustBlock() { super(FabricBlockSettings.copyOf(Blocks.SAND).materialColor(Blocks.END_STONE.getDefaultMaterialColor())); } diff --git a/src/main/java/ru/betterend/blocks/EternalPedestal.java b/src/main/java/ru/betterend/blocks/EternalPedestal.java index 12333694..deef385c 100644 --- a/src/main/java/ru/betterend/blocks/EternalPedestal.java +++ b/src/main/java/ru/betterend/blocks/EternalPedestal.java @@ -23,13 +23,13 @@ import net.minecraft.world.BlockView; import net.minecraft.world.World; import net.minecraft.world.WorldAccess; import net.minecraft.world.explosion.Explosion; -import ru.betterend.blocks.basis.BlockPedestal; +import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.entities.EternalPedestalEntity; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; import ru.betterend.rituals.EternalRitual; -public class EternalPedestal extends BlockPedestal { +public class EternalPedestal extends PedestalBlock { public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; public EternalPedestal() { diff --git a/src/main/java/ru/betterend/blocks/BlockGlowingMoss.java b/src/main/java/ru/betterend/blocks/GlowingMossBlock.java similarity index 80% rename from src/main/java/ru/betterend/blocks/BlockGlowingMoss.java rename to src/main/java/ru/betterend/blocks/GlowingMossBlock.java index f87780be..6b8aee7c 100644 --- a/src/main/java/ru/betterend/blocks/BlockGlowingMoss.java +++ b/src/main/java/ru/betterend/blocks/GlowingMossBlock.java @@ -5,11 +5,11 @@ import net.fabricmc.api.Environment; import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.BlockView; -import ru.betterend.blocks.basis.BlockPlant; +import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; -public class BlockGlowingMoss extends BlockPlant { - public BlockGlowingMoss(int light) { +public class GlowingMossBlock extends EndPlantBlock { + public GlowingMossBlock(int light) { super(light); } diff --git a/src/main/java/ru/betterend/blocks/BlockGlowingPillarLuminophor.java b/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java similarity index 89% rename from src/main/java/ru/betterend/blocks/BlockGlowingPillarLuminophor.java rename to src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java index 1ad2970f..15f2f295 100644 --- a/src/main/java/ru/betterend/blocks/BlockGlowingPillarLuminophor.java +++ b/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java @@ -14,13 +14,13 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; -import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.BaseBlock; import ru.betterend.registry.EndBlocks; -public class BlockGlowingPillarLuminophor extends BlockBase { +public class GlowingPillarLuminophorBlock extends BaseBlock { public static final BooleanProperty NATURAL = BooleanProperty.of("natural"); - public BlockGlowingPillarLuminophor() { + public GlowingPillarLuminophorBlock() { super(FabricBlockSettings.of(Material.LEAVES) .materialColor(MaterialColor.ORANGE) .breakByTool(FabricToolTags.SHEARS) diff --git a/src/main/java/ru/betterend/blocks/BlockGlowingPillarRoots.java b/src/main/java/ru/betterend/blocks/GlowingPillarRootsBlock.java similarity index 81% rename from src/main/java/ru/betterend/blocks/BlockGlowingPillarRoots.java rename to src/main/java/ru/betterend/blocks/GlowingPillarRootsBlock.java index e393ee96..bd7264eb 100644 --- a/src/main/java/ru/betterend/blocks/BlockGlowingPillarRoots.java +++ b/src/main/java/ru/betterend/blocks/GlowingPillarRootsBlock.java @@ -5,10 +5,10 @@ import net.minecraft.block.BlockState; import net.minecraft.state.StateManager; import net.minecraft.state.property.EnumProperty; import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockUpDownPlant; +import ru.betterend.blocks.basis.UpDownPlantBlock; import ru.betterend.registry.EndBlocks; -public class BlockGlowingPillarRoots extends BlockUpDownPlant { +public class GlowingPillarRootsBlock extends UpDownPlantBlock { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; @Override diff --git a/src/main/java/ru/betterend/blocks/BlockGlowingPillarSeed.java b/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java similarity index 89% rename from src/main/java/ru/betterend/blocks/BlockGlowingPillarSeed.java rename to src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java index 7bb20c66..97ea66f5 100644 --- a/src/main/java/ru/betterend/blocks/BlockGlowingPillarSeed.java +++ b/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java @@ -13,13 +13,13 @@ import net.minecraft.util.math.BlockPos.Mutable; import net.minecraft.util.math.Direction; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockPlantWithAge; +import ru.betterend.blocks.basis.PlantWithAgeBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; -public class BlockGlowingPillarSeed extends BlockPlantWithAge { - public BlockGlowingPillarSeed() { +public class GlowingPillarSeedBlock extends PlantWithAgeBlock { + public GlowingPillarSeedBlock() { super(FabricBlockSettings.of(Material.PLANT) .luminance((state) -> { return state.get(AGE) * 3 + 3; }) .breakByTool(FabricToolTags.SHEARS) @@ -49,7 +49,7 @@ public class BlockGlowingPillarSeed extends BlockPlantWithAge { BlocksHelper.setWithUpdate(world, mut, roots.with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); mut.move(Direction.UP); } - BlocksHelper.setWithUpdate(world, mut, EndBlocks.GLOWING_PILLAR_LUMINOPHOR.getDefaultState().with(BlockBlueVineLantern.NATURAL, true)); + BlocksHelper.setWithUpdate(world, mut, EndBlocks.GLOWING_PILLAR_LUMINOPHOR.getDefaultState().with(BlueVineLanternBlock.NATURAL, true)); for (Direction dir: BlocksHelper.DIRECTIONS) { pos = mut.offset(dir); if (world.isAir(pos)) { diff --git a/src/main/java/ru/betterend/blocks/BlockHelixTreeLeaves.java b/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java similarity index 93% rename from src/main/java/ru/betterend/blocks/BlockHelixTreeLeaves.java rename to src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java index 7555ae70..fb299993 100644 --- a/src/main/java/ru/betterend/blocks/BlockHelixTreeLeaves.java +++ b/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java @@ -23,17 +23,17 @@ import net.minecraft.sound.BlockSoundGroup; import net.minecraft.state.StateManager; import net.minecraft.state.property.IntProperty; import net.minecraft.util.math.MathHelper; -import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.BaseBlock; import ru.betterend.interfaces.IColorProvider; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; -public class BlockHelixTreeLeaves extends BlockBase implements IColorProvider { +public class HelixTreeLeavesBlock extends BaseBlock implements IColorProvider { public static final IntProperty COLOR = IntProperty.of("color", 0, 7); private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); - public BlockHelixTreeLeaves() { + public HelixTreeLeavesBlock() { super(FabricBlockSettings.of(Material.LEAVES) .materialColor(MaterialColor.ORANGE) .breakByTool(FabricToolTags.SHEARS) diff --git a/src/main/java/ru/betterend/blocks/BlockHelixTreeSapling.java b/src/main/java/ru/betterend/blocks/HelixTreeSaplingBlock.java similarity index 62% rename from src/main/java/ru/betterend/blocks/BlockHelixTreeSapling.java rename to src/main/java/ru/betterend/blocks/HelixTreeSaplingBlock.java index 754e7316..0bce2c4c 100644 --- a/src/main/java/ru/betterend/blocks/BlockHelixTreeSapling.java +++ b/src/main/java/ru/betterend/blocks/HelixTreeSaplingBlock.java @@ -1,10 +1,10 @@ package ru.betterend.blocks; import net.minecraft.world.gen.feature.Feature; -import ru.betterend.blocks.basis.BlockFeatureSapling; +import ru.betterend.blocks.basis.FeatureSaplingBlock; import ru.betterend.registry.EndFeatures; -public class BlockHelixTreeSapling extends BlockFeatureSapling { +public class HelixTreeSaplingBlock extends FeatureSaplingBlock { @Override protected Feature getFeature() { return EndFeatures.HELIX_TREE.getFeature(); diff --git a/src/main/java/ru/betterend/blocks/BlockHydralux.java b/src/main/java/ru/betterend/blocks/HydraluxBlock.java similarity index 92% rename from src/main/java/ru/betterend/blocks/BlockHydralux.java rename to src/main/java/ru/betterend/blocks/HydraluxBlock.java index cbba5ddb..53fc0eb2 100644 --- a/src/main/java/ru/betterend/blocks/BlockHydralux.java +++ b/src/main/java/ru/betterend/blocks/HydraluxBlock.java @@ -23,15 +23,15 @@ import net.minecraft.world.BlockView; import net.minecraft.world.World; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties.HydraluxShape; -import ru.betterend.blocks.basis.BlockUnderwaterPlant; +import ru.betterend.blocks.basis.UnderwaterPlantBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; import ru.betterend.util.MHelper; -public class BlockHydralux extends BlockUnderwaterPlant { +public class HydraluxBlock extends UnderwaterPlantBlock { public static final EnumProperty SHAPE = BlockProperties.HYDRALUX_SHAPE; - public BlockHydralux() { + public HydraluxBlock() { super(FabricBlockSettings.of(Material.UNDERWATER_PLANT) .breakByTool(FabricToolTags.SHEARS) .sounds(BlockSoundGroup.WET_GRASS) diff --git a/src/main/java/ru/betterend/blocks/BlockHydraluxPetal.java b/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java similarity index 77% rename from src/main/java/ru/betterend/blocks/BlockHydraluxPetal.java rename to src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java index 9fa569a2..81722164 100644 --- a/src/main/java/ru/betterend/blocks/BlockHydraluxPetal.java +++ b/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java @@ -8,10 +8,10 @@ import net.minecraft.entity.Entity; import net.minecraft.sound.BlockSoundGroup; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.BaseBlock; -public class BlockHydraluxPetal extends BlockBase { - public BlockHydraluxPetal() { +public class HydraluxPetalBlock extends BaseBlock { + public HydraluxPetalBlock() { this(FabricBlockSettings.of(Material.PLANT) .materialColor(MaterialColor.SPRUCE) .sounds(BlockSoundGroup.WART_BLOCK) @@ -21,7 +21,7 @@ public class BlockHydraluxPetal extends BlockBase { .breakByHand(true)); } - public BlockHydraluxPetal(FabricBlockSettings settings) { + public HydraluxPetalBlock(FabricBlockSettings settings) { super(settings); } diff --git a/src/main/java/ru/betterend/blocks/BlockHydraluxPetalColored.java b/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java similarity index 84% rename from src/main/java/ru/betterend/blocks/BlockHydraluxPetalColored.java rename to src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java index a0ab719a..4cd1adb1 100644 --- a/src/main/java/ru/betterend/blocks/BlockHydraluxPetalColored.java +++ b/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java @@ -9,8 +9,8 @@ import net.minecraft.util.Identifier; import ru.betterend.interfaces.IColorProvider; import ru.betterend.patterns.Patterns; -public class BlockHydraluxPetalColored extends BlockHydraluxPetal implements IColorProvider { - public BlockHydraluxPetalColored(FabricBlockSettings settings) { +public class HydraluxPetalColoredBlock extends HydraluxPetalBlock implements IColorProvider { + public HydraluxPetalColoredBlock(FabricBlockSettings settings) { super(settings); } diff --git a/src/main/java/ru/betterend/blocks/BlockHydraluxSapling.java b/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java similarity index 90% rename from src/main/java/ru/betterend/blocks/BlockHydraluxSapling.java rename to src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java index b3615fe3..ae1544c0 100644 --- a/src/main/java/ru/betterend/blocks/BlockHydraluxSapling.java +++ b/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java @@ -8,12 +8,12 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos.Mutable; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.BlockProperties.HydraluxShape; -import ru.betterend.blocks.basis.BlockUnderwaterPlantWithAge; +import ru.betterend.blocks.basis.UnderwaterPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; -public class BlockHydraluxSapling extends BlockUnderwaterPlantWithAge { +public class HydraluxSaplingBlock extends UnderwaterPlantWithAgeBlock { @Override public void grow(StructureWorldAccess world, Random random, BlockPos pos) { int h = MHelper.randRange(4, 8, random); diff --git a/src/main/java/ru/betterend/blocks/BlockHydrothermalVent.java b/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java similarity index 94% rename from src/main/java/ru/betterend/blocks/BlockHydrothermalVent.java rename to src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java index b433ebcd..0b2807c6 100644 --- a/src/main/java/ru/betterend/blocks/BlockHydrothermalVent.java +++ b/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java @@ -36,18 +36,18 @@ import net.minecraft.world.BlockView; import net.minecraft.world.World; import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; -import ru.betterend.blocks.basis.BlockBaseNotFull; +import ru.betterend.blocks.basis.BaseBlockNotFull; import ru.betterend.blocks.entities.BlockEntityHydrothermalVent; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndParticles; import ru.betterend.util.BlocksHelper; -public class BlockHydrothermalVent extends BlockBaseNotFull implements BlockEntityProvider, FluidFillable, Waterloggable { +public class HydrothermalVentBlock extends BaseBlockNotFull implements BlockEntityProvider, FluidFillable, Waterloggable { public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; private static final VoxelShape SHAPE = Block.createCuboidShape(1, 1, 1, 15, 16, 15); - public BlockHydrothermalVent() { + public HydrothermalVentBlock() { super(FabricBlockSettings.of(Material.STONE) .breakByTool(FabricToolTags.PICKAXES) .sounds(BlockSoundGroup.STONE) diff --git a/src/main/java/ru/betterend/blocks/InfusionPedestal.java b/src/main/java/ru/betterend/blocks/InfusionPedestal.java index ff59fbbb..b10bbf5c 100644 --- a/src/main/java/ru/betterend/blocks/InfusionPedestal.java +++ b/src/main/java/ru/betterend/blocks/InfusionPedestal.java @@ -14,11 +14,11 @@ import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; import net.minecraft.world.BlockView; import net.minecraft.world.World; -import ru.betterend.blocks.basis.BlockPedestal; +import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.entities.InfusionPedestalEntity; import ru.betterend.rituals.InfusionRitual; -public class InfusionPedestal extends BlockPedestal { +public class InfusionPedestal extends PedestalBlock { private static final VoxelShape SHAPE_DEFAULT; private static final VoxelShape SHAPE_PEDESTAL_TOP; diff --git a/src/main/java/ru/betterend/blocks/BlockJellyshroomCap.java b/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java similarity index 93% rename from src/main/java/ru/betterend/blocks/BlockJellyshroomCap.java rename to src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java index 506ed546..482966fb 100644 --- a/src/main/java/ru/betterend/blocks/BlockJellyshroomCap.java +++ b/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java @@ -29,14 +29,14 @@ import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; import ru.betterend.util.MHelper; -public class BlockJellyshroomCap extends SlimeBlock implements IRenderTypeable, BlockPatterned, IColorProvider { +public class JellyshroomCapBlock extends SlimeBlock implements IRenderTypeable, BlockPatterned, IColorProvider { public static final IntProperty COLOR = IntProperty.of("color", 0, 7); private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); private final Vec3i colorStart; private final Vec3i colorEnd; private final int coloritem; - public BlockJellyshroomCap(int r1, int g1, int b1, int r2, int g2, int b2) { + public JellyshroomCapBlock(int r1, int g1, int b1, int r2, int g2, int b2) { super(FabricBlockSettings.copyOf(Blocks.SLIME_BLOCK)); colorStart = new Vec3i(r1, g1, b1); colorEnd = new Vec3i(r2, g2, b2); diff --git a/src/main/java/ru/betterend/blocks/BlockLacugroveSapling.java b/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java similarity index 77% rename from src/main/java/ru/betterend/blocks/BlockLacugroveSapling.java rename to src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java index 95fb5e9f..7302e964 100644 --- a/src/main/java/ru/betterend/blocks/BlockLacugroveSapling.java +++ b/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java @@ -4,12 +4,12 @@ import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldView; import net.minecraft.world.gen.feature.Feature; -import ru.betterend.blocks.basis.BlockFeatureSapling; +import ru.betterend.blocks.basis.FeatureSaplingBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; -public class BlockLacugroveSapling extends BlockFeatureSapling { - public BlockLacugroveSapling() { +public class LacugroveSaplingBlock extends FeatureSaplingBlock { + public LacugroveSaplingBlock() { super(); } diff --git a/src/main/java/ru/betterend/blocks/BlockLanceleaf.java b/src/main/java/ru/betterend/blocks/LanceleafBlock.java similarity index 90% rename from src/main/java/ru/betterend/blocks/BlockLanceleaf.java rename to src/main/java/ru/betterend/blocks/LanceleafBlock.java index 50005609..1a940095 100644 --- a/src/main/java/ru/betterend/blocks/BlockLanceleaf.java +++ b/src/main/java/ru/betterend/blocks/LanceleafBlock.java @@ -11,14 +11,14 @@ import net.minecraft.util.math.Direction; import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties.PentaShape; -import ru.betterend.blocks.basis.BlockPlant; +import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; -public class BlockLanceleaf extends BlockPlant { +public class LanceleafBlock extends EndPlantBlock { public static final EnumProperty SHAPE = BlockProperties.PENTA_SHAPE; public static final IntProperty ROTATION = BlockProperties.ROTATION; - public BlockLanceleaf() { + public LanceleafBlock() { super(); } diff --git a/src/main/java/ru/betterend/blocks/BlockLanceleafSeed.java b/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java similarity index 91% rename from src/main/java/ru/betterend/blocks/BlockLanceleafSeed.java rename to src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java index 2744a0b8..b7e944c0 100644 --- a/src/main/java/ru/betterend/blocks/BlockLanceleafSeed.java +++ b/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java @@ -8,12 +8,12 @@ import net.minecraft.util.math.BlockPos.Mutable; import net.minecraft.util.math.Direction; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.BlockProperties.PentaShape; -import ru.betterend.blocks.basis.BlockPlantWithAge; +import ru.betterend.blocks.basis.PlantWithAgeBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; -public class BlockLanceleafSeed extends BlockPlantWithAge { +public class LanceleafSeedBlock extends PlantWithAgeBlock { @Override public void growAdult(StructureWorldAccess world, Random random, BlockPos pos) { int height = MHelper.randRange(4, 6, random); diff --git a/src/main/java/ru/betterend/blocks/BlockMengerSponge.java b/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java similarity index 93% rename from src/main/java/ru/betterend/blocks/BlockMengerSponge.java rename to src/main/java/ru/betterend/blocks/MengerSpongeBlock.java index 1b8c26e3..d7cffe8f 100644 --- a/src/main/java/ru/betterend/blocks/BlockMengerSponge.java +++ b/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java @@ -19,13 +19,13 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.World; import net.minecraft.world.WorldAccess; -import ru.betterend.blocks.basis.BlockBaseNotFull; +import ru.betterend.blocks.basis.BaseBlockNotFull; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndBlocks; -public class BlockMengerSponge extends BlockBaseNotFull implements IRenderTypeable { - public BlockMengerSponge() { +public class MengerSpongeBlock extends BaseBlockNotFull implements IRenderTypeable { + public MengerSpongeBlock() { super(FabricBlockSettings.copyOf(Blocks.SPONGE).nonOpaque()); } diff --git a/src/main/java/ru/betterend/blocks/BlockMengerSpongeWet.java b/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java similarity index 92% rename from src/main/java/ru/betterend/blocks/BlockMengerSpongeWet.java rename to src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java index c9e32571..8439dfd3 100644 --- a/src/main/java/ru/betterend/blocks/BlockMengerSpongeWet.java +++ b/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java @@ -16,14 +16,14 @@ import net.minecraft.sound.SoundEvents; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.World; -import ru.betterend.blocks.basis.BlockBaseNotFull; +import ru.betterend.blocks.basis.BaseBlockNotFull; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; -public class BlockMengerSpongeWet extends BlockBaseNotFull implements IRenderTypeable { - public BlockMengerSpongeWet() { +public class MengerSpongeWetBlock extends BaseBlockNotFull implements IRenderTypeable { + public MengerSpongeWetBlock() { super(FabricBlockSettings.copyOf(Blocks.WET_SPONGE).nonOpaque()); } diff --git a/src/main/java/ru/betterend/blocks/BlockMossyGlowshroomCap.java b/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java similarity index 87% rename from src/main/java/ru/betterend/blocks/BlockMossyGlowshroomCap.java rename to src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java index 8fea3727..9aabe27f 100644 --- a/src/main/java/ru/betterend/blocks/BlockMossyGlowshroomCap.java +++ b/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java @@ -9,13 +9,13 @@ import net.minecraft.item.ItemPlacementContext; import net.minecraft.sound.BlockSoundGroup; import net.minecraft.state.StateManager; import net.minecraft.state.property.BooleanProperty; -import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.BaseBlock; import ru.betterend.registry.EndBlocks; -public class BlockMossyGlowshroomCap extends BlockBase { +public class MossyGlowshroomCapBlock extends BaseBlock { public static final BooleanProperty TRANSITION = BooleanProperty.of("transition"); - public BlockMossyGlowshroomCap() { + public MossyGlowshroomCapBlock() { super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sounds(BlockSoundGroup.WOOD)); this.setDefaultState(this.stateManager.getDefaultState().with(TRANSITION, false)); } diff --git a/src/main/java/ru/betterend/blocks/BlockMossyGlowshroomHymenophore.java b/src/main/java/ru/betterend/blocks/MossyGlowshroomHymenophoreBlock.java similarity index 70% rename from src/main/java/ru/betterend/blocks/BlockMossyGlowshroomHymenophore.java rename to src/main/java/ru/betterend/blocks/MossyGlowshroomHymenophoreBlock.java index 16a209df..a74c85bf 100644 --- a/src/main/java/ru/betterend/blocks/BlockMossyGlowshroomHymenophore.java +++ b/src/main/java/ru/betterend/blocks/MossyGlowshroomHymenophoreBlock.java @@ -4,10 +4,10 @@ import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.block.Material; import net.minecraft.sound.BlockSoundGroup; -import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.BaseBlock; -public class BlockMossyGlowshroomHymenophore extends BlockBase { - public BlockMossyGlowshroomHymenophore() { +public class MossyGlowshroomHymenophoreBlock extends BaseBlock { + public MossyGlowshroomHymenophoreBlock() { super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sounds(BlockSoundGroup.WART_BLOCK).luminance(15)); } } diff --git a/src/main/java/ru/betterend/blocks/BlockMossyGlowshroomSapling.java b/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java similarity index 76% rename from src/main/java/ru/betterend/blocks/BlockMossyGlowshroomSapling.java rename to src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java index 0a287ab4..24c1ffff 100644 --- a/src/main/java/ru/betterend/blocks/BlockMossyGlowshroomSapling.java +++ b/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java @@ -4,12 +4,12 @@ import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldView; import net.minecraft.world.gen.feature.Feature; -import ru.betterend.blocks.basis.BlockFeatureSapling; +import ru.betterend.blocks.basis.FeatureSaplingBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; -public class BlockMossyGlowshroomSapling extends BlockFeatureSapling { - public BlockMossyGlowshroomSapling() { +public class MossyGlowshroomSaplingBlock extends FeatureSaplingBlock { + public MossyGlowshroomSaplingBlock() { super(7); } diff --git a/src/main/java/ru/betterend/blocks/BlockMurkweed.java b/src/main/java/ru/betterend/blocks/MurkweedBlock.java similarity index 90% rename from src/main/java/ru/betterend/blocks/BlockMurkweed.java rename to src/main/java/ru/betterend/blocks/MurkweedBlock.java index 8b47efbe..14fd6e19 100644 --- a/src/main/java/ru/betterend/blocks/BlockMurkweed.java +++ b/src/main/java/ru/betterend/blocks/MurkweedBlock.java @@ -12,10 +12,10 @@ import net.minecraft.entity.effect.StatusEffects; import net.minecraft.particle.ParticleTypes; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import ru.betterend.blocks.basis.BlockPlant; +import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; -public class BlockMurkweed extends BlockPlant { +public class MurkweedBlock extends EndPlantBlock { @Override @Environment(EnvType.CLIENT) public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { diff --git a/src/main/java/ru/betterend/blocks/BlockNeedlegrass.java b/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java similarity index 91% rename from src/main/java/ru/betterend/blocks/BlockNeedlegrass.java rename to src/main/java/ru/betterend/blocks/NeedlegrassBlock.java index 6d9aaa9f..fe6bd91e 100644 --- a/src/main/java/ru/betterend/blocks/BlockNeedlegrass.java +++ b/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java @@ -17,11 +17,11 @@ import net.minecraft.loot.context.LootContext; import net.minecraft.loot.context.LootContextParameters; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import ru.betterend.blocks.basis.BlockPlant; +import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; -public class BlockNeedlegrass extends BlockPlant { +public class NeedlegrassBlock extends EndPlantBlock { @Override public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) { if (entity instanceof LivingEntity) { diff --git a/src/main/java/ru/betterend/blocks/PedestalVanilla.java b/src/main/java/ru/betterend/blocks/PedestalVanilla.java index 29f8039a..b7848ce1 100644 --- a/src/main/java/ru/betterend/blocks/PedestalVanilla.java +++ b/src/main/java/ru/betterend/blocks/PedestalVanilla.java @@ -6,10 +6,10 @@ import java.util.Map; import net.minecraft.block.Block; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; -import ru.betterend.blocks.basis.BlockPedestal; +import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.patterns.Patterns; -public class PedestalVanilla extends BlockPedestal { +public class PedestalVanilla extends PedestalBlock { public PedestalVanilla(Block parent) { super(parent); diff --git a/src/main/java/ru/betterend/blocks/BlockPythadendronSapling.java b/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java similarity index 75% rename from src/main/java/ru/betterend/blocks/BlockPythadendronSapling.java rename to src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java index cdb301ad..40926215 100644 --- a/src/main/java/ru/betterend/blocks/BlockPythadendronSapling.java +++ b/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java @@ -4,12 +4,12 @@ import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldView; import net.minecraft.world.gen.feature.Feature; -import ru.betterend.blocks.basis.BlockFeatureSapling; +import ru.betterend.blocks.basis.FeatureSaplingBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; -public class BlockPythadendronSapling extends BlockFeatureSapling { - public BlockPythadendronSapling() { +public class PythadendronSaplingBlock extends FeatureSaplingBlock { + public PythadendronSaplingBlock() { super(); } diff --git a/src/main/java/ru/betterend/blocks/BlockRespawnObelisk.java b/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java similarity index 95% rename from src/main/java/ru/betterend/blocks/BlockRespawnObelisk.java rename to src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java index 77e9192f..8443c9f3 100644 --- a/src/main/java/ru/betterend/blocks/BlockRespawnObelisk.java +++ b/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java @@ -36,7 +36,7 @@ import net.minecraft.world.World; import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.BaseBlock; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IColorProvider; import ru.betterend.interfaces.IRenderTypeable; @@ -46,13 +46,13 @@ import ru.betterend.registry.EndItems; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; -public class BlockRespawnObelisk extends BlockBase implements IColorProvider, IRenderTypeable { +public class RespawnObeliskBlock extends BaseBlock implements IColorProvider, IRenderTypeable { private static final VoxelShape VOXEL_SHAPE_BOTTOM = Block.createCuboidShape(1, 0, 1, 15, 16, 15); private static final VoxelShape VOXEL_SHAPE_MIDDLE_TOP = Block.createCuboidShape(2, 0, 2, 14, 16, 14); public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; - public BlockRespawnObelisk() { + public RespawnObeliskBlock() { super(FabricBlockSettings.copyOf(Blocks.END_STONE).luminance((state) -> { return (state.get(SHAPE) == TripleShape.BOTTOM) ? 0 : 15; })); diff --git a/src/main/java/ru/betterend/blocks/RunedFlavolite.java b/src/main/java/ru/betterend/blocks/RunedFlavolite.java index 9e4b18d4..4ce7a552 100644 --- a/src/main/java/ru/betterend/blocks/RunedFlavolite.java +++ b/src/main/java/ru/betterend/blocks/RunedFlavolite.java @@ -6,10 +6,10 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.state.StateManager; import net.minecraft.state.property.BooleanProperty; -import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.BaseBlock; import ru.betterend.registry.EndBlocks; -public class RunedFlavolite extends BlockBase { +public class RunedFlavolite extends BaseBlock { public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; public RunedFlavolite() { diff --git a/src/main/java/ru/betterend/blocks/BlockShadowBerry.java b/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java similarity index 91% rename from src/main/java/ru/betterend/blocks/BlockShadowBerry.java rename to src/main/java/ru/betterend/blocks/ShadowBerryBlock.java index 2e192fc1..2cca0ec5 100644 --- a/src/main/java/ru/betterend/blocks/BlockShadowBerry.java +++ b/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java @@ -16,12 +16,12 @@ import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.BlockView; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.World; -import ru.betterend.blocks.basis.BlockPlantWithAge; +import ru.betterend.blocks.basis.PlantWithAgeBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; import ru.betterend.util.MHelper; -public class BlockShadowBerry extends BlockPlantWithAge { +public class ShadowBerryBlock extends PlantWithAgeBlock { private static final VoxelShape SHAPE = Block.createCuboidShape(1, 0, 1, 15, 8, 15); @Override diff --git a/src/main/java/ru/betterend/blocks/BlockShadowGrass.java b/src/main/java/ru/betterend/blocks/ShadowGrassBlock.java similarity index 87% rename from src/main/java/ru/betterend/blocks/BlockShadowGrass.java rename to src/main/java/ru/betterend/blocks/ShadowGrassBlock.java index 9fd872b9..20ca5978 100644 --- a/src/main/java/ru/betterend/blocks/BlockShadowGrass.java +++ b/src/main/java/ru/betterend/blocks/ShadowGrassBlock.java @@ -10,8 +10,8 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import ru.betterend.registry.EndParticles; -public class BlockShadowGrass extends BlockTerrain { - public BlockShadowGrass() { +public class ShadowGrassBlock extends EndTerrainBlock { + public ShadowGrassBlock() { super(MaterialColor.BLACK); } diff --git a/src/main/java/ru/betterend/blocks/BlockSilkMothNest.java b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java similarity index 93% rename from src/main/java/ru/betterend/blocks/BlockSilkMothNest.java rename to src/main/java/ru/betterend/blocks/SilkMothNestBlock.java index 1c99e9cb..deacc08a 100644 --- a/src/main/java/ru/betterend/blocks/BlockSilkMothNest.java +++ b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java @@ -27,18 +27,18 @@ import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.BlockView; import net.minecraft.world.World; import net.minecraft.world.WorldAccess; -import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.BaseBlock; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.util.BlocksHelper; -public class BlockSilkMothNest extends BlockBase implements IRenderTypeable { +public class SilkMothNestBlock extends BaseBlock implements IRenderTypeable { public static final BooleanProperty ACTIVE = BlockProperties.ACTIVE; public static final DirectionProperty FACING = Properties.HORIZONTAL_FACING; private static final VoxelShape TOP = createCuboidShape(6, 0, 6, 10, 16, 10); private static final VoxelShape BOTTOM = createCuboidShape(0, 0, 0, 16, 16, 16); - public BlockSilkMothNest() { + public SilkMothNestBlock() { super(FabricBlockSettings.of(Material.WOOL).hardness(0.5F).resistance(0.1F).sounds(BlockSoundGroup.WOOL).nonOpaque()); this.setDefaultState(getDefaultState().with(ACTIVE, true)); } diff --git a/src/main/java/ru/betterend/blocks/BlockSmallJellyshroom.java b/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java similarity index 93% rename from src/main/java/ru/betterend/blocks/BlockSmallJellyshroom.java rename to src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java index f3f15238..01b16b4c 100644 --- a/src/main/java/ru/betterend/blocks/BlockSmallJellyshroom.java +++ b/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java @@ -29,17 +29,17 @@ import net.minecraft.util.shape.VoxelShapes; import net.minecraft.world.BlockView; import net.minecraft.world.World; import net.minecraft.world.WorldView; -import ru.betterend.blocks.basis.BlockAttached; +import ru.betterend.blocks.basis.AttachedBlock; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; -public class BlockSmallJellyshroom extends BlockAttached implements IRenderTypeable, Fertilizable { +public class SmallJellyshroomBlock extends AttachedBlock implements IRenderTypeable, Fertilizable { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); - public BlockSmallJellyshroom() { + public SmallJellyshroomBlock() { super(FabricBlockSettings.of(Material.PLANT) .breakByTool(FabricToolTags.SHEARS) .sounds(BlockSoundGroup.NETHER_WART) diff --git a/src/main/java/ru/betterend/blocks/BlockSulphurCrystal.java b/src/main/java/ru/betterend/blocks/SulphurCrystalBlock.java similarity index 94% rename from src/main/java/ru/betterend/blocks/BlockSulphurCrystal.java rename to src/main/java/ru/betterend/blocks/SulphurCrystalBlock.java index bfa5f4d8..17ba297c 100644 --- a/src/main/java/ru/betterend/blocks/BlockSulphurCrystal.java +++ b/src/main/java/ru/betterend/blocks/SulphurCrystalBlock.java @@ -34,19 +34,19 @@ import net.minecraft.util.shape.VoxelShapes; import net.minecraft.world.BlockView; import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; -import ru.betterend.blocks.basis.BlockAttached; +import ru.betterend.blocks.basis.AttachedBlock; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; import ru.betterend.util.MHelper; -public class BlockSulphurCrystal extends BlockAttached implements IRenderTypeable, Waterloggable, FluidFillable { +public class SulphurCrystalBlock extends AttachedBlock implements IRenderTypeable, Waterloggable, FluidFillable { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); public static final IntProperty AGE = IntProperty.of("age", 0, 2); public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; - public BlockSulphurCrystal() { + public SulphurCrystalBlock() { super(FabricBlockSettings.of(Material.STONE) .materialColor(MaterialColor.YELLOW) .breakByTool(FabricToolTags.PICKAXES) diff --git a/src/main/java/ru/betterend/blocks/BlockTenaneaFlowers.java b/src/main/java/ru/betterend/blocks/TenaneaFlowersBlock.java similarity index 91% rename from src/main/java/ru/betterend/blocks/BlockTenaneaFlowers.java rename to src/main/java/ru/betterend/blocks/TenaneaFlowersBlock.java index fbd09f88..447f2635 100644 --- a/src/main/java/ru/betterend/blocks/BlockTenaneaFlowers.java +++ b/src/main/java/ru/betterend/blocks/TenaneaFlowersBlock.java @@ -12,15 +12,15 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3i; import net.minecraft.world.BlockView; import net.minecraft.world.World; -import ru.betterend.blocks.basis.BlockVine; +import ru.betterend.blocks.basis.VineBlock; import ru.betterend.interfaces.IColorProvider; import ru.betterend.registry.EndParticles; import ru.betterend.util.MHelper; -public class BlockTenaneaFlowers extends BlockVine implements IColorProvider { +public class TenaneaFlowersBlock extends VineBlock implements IColorProvider { public static final Vec3i[] COLORS; - public BlockTenaneaFlowers() { + public TenaneaFlowersBlock() { super(15); } diff --git a/src/main/java/ru/betterend/blocks/BlockTenaneaSapling.java b/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java similarity index 76% rename from src/main/java/ru/betterend/blocks/BlockTenaneaSapling.java rename to src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java index b8140315..85775e93 100644 --- a/src/main/java/ru/betterend/blocks/BlockTenaneaSapling.java +++ b/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java @@ -4,12 +4,12 @@ import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldView; import net.minecraft.world.gen.feature.Feature; -import ru.betterend.blocks.basis.BlockFeatureSapling; +import ru.betterend.blocks.basis.FeatureSaplingBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; -public class BlockTenaneaSapling extends BlockFeatureSapling { - public BlockTenaneaSapling() { +public class TenaneaSaplingBlock extends FeatureSaplingBlock { + public TenaneaSaplingBlock() { super(); } diff --git a/src/main/java/ru/betterend/blocks/TerminiteBlock.java b/src/main/java/ru/betterend/blocks/TerminiteBlock.java index 204a2e55..627fe65f 100644 --- a/src/main/java/ru/betterend/blocks/TerminiteBlock.java +++ b/src/main/java/ru/betterend/blocks/TerminiteBlock.java @@ -4,9 +4,9 @@ import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.Material; import net.minecraft.block.MaterialColor; import net.minecraft.sound.BlockSoundGroup; -import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.BaseBlock; -public class TerminiteBlock extends BlockBase { +public class TerminiteBlock extends BaseBlock { public TerminiteBlock() { super(FabricBlockSettings.of(Material.METAL, MaterialColor.field_25708) .hardness(7F) diff --git a/src/main/java/ru/betterend/blocks/BlockTerrainPlant.java b/src/main/java/ru/betterend/blocks/TerrainPlantBlock.java similarity index 62% rename from src/main/java/ru/betterend/blocks/BlockTerrainPlant.java rename to src/main/java/ru/betterend/blocks/TerrainPlantBlock.java index d3587c9b..53e3b007 100644 --- a/src/main/java/ru/betterend/blocks/BlockTerrainPlant.java +++ b/src/main/java/ru/betterend/blocks/TerrainPlantBlock.java @@ -2,12 +2,12 @@ package ru.betterend.blocks; import net.minecraft.block.Block; import net.minecraft.block.BlockState; -import ru.betterend.blocks.basis.BlockPlant; +import ru.betterend.blocks.basis.EndPlantBlock; -public class BlockTerrainPlant extends BlockPlant { +public class TerrainPlantBlock extends EndPlantBlock { private final Block ground; - public BlockTerrainPlant(Block ground) { + public TerrainPlantBlock(Block ground) { super(true); this.ground = ground; } diff --git a/src/main/java/ru/betterend/blocks/BlockTwistedUmbrellaMoss.java b/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossBlock.java similarity index 76% rename from src/main/java/ru/betterend/blocks/BlockTwistedUmbrellaMoss.java rename to src/main/java/ru/betterend/blocks/TwistedUmbrellaMossBlock.java index b5e9ce91..af0257a6 100644 --- a/src/main/java/ru/betterend/blocks/BlockTwistedUmbrellaMoss.java +++ b/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossBlock.java @@ -9,13 +9,13 @@ import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; import net.minecraft.world.BlockView; import net.minecraft.world.World; -import ru.betterend.blocks.basis.BlockDoublePlant; -import ru.betterend.blocks.basis.BlockPlant; +import ru.betterend.blocks.basis.DoublePlantBlock; +import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; -public class BlockTwistedUmbrellaMoss extends BlockPlant { - public BlockTwistedUmbrellaMoss() { +public class TwistedUmbrellaMossBlock extends EndPlantBlock { + public TwistedUmbrellaMossBlock() { super(11); } @@ -42,8 +42,8 @@ public class BlockTwistedUmbrellaMoss extends BlockPlant { @Override public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { int rot = world.random.nextInt(4); - BlockState bs = EndBlocks.TWISTED_UMBRELLA_MOSS_TALL.getDefaultState().with(BlockDoublePlant.ROTATION, rot); + BlockState bs = EndBlocks.TWISTED_UMBRELLA_MOSS_TALL.getDefaultState().with(DoublePlantBlock.ROTATION, rot); BlocksHelper.setWithoutUpdate(world, pos, bs); - BlocksHelper.setWithoutUpdate(world, pos.up(), bs.with(BlockDoublePlant.TOP, true)); + BlocksHelper.setWithoutUpdate(world, pos.up(), bs.with(DoublePlantBlock.TOP, true)); } } diff --git a/src/main/java/ru/betterend/blocks/BlockTwistedUmbrellaMossTall.java b/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossTallBlock.java similarity index 80% rename from src/main/java/ru/betterend/blocks/BlockTwistedUmbrellaMossTall.java rename to src/main/java/ru/betterend/blocks/TwistedUmbrellaMossTallBlock.java index c9657bb6..fbad6c9c 100644 --- a/src/main/java/ru/betterend/blocks/BlockTwistedUmbrellaMossTall.java +++ b/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossTallBlock.java @@ -7,11 +7,11 @@ import net.minecraft.entity.ItemEntity; import net.minecraft.item.ItemStack; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; -import ru.betterend.blocks.basis.BlockDoublePlant; +import ru.betterend.blocks.basis.DoublePlantBlock; import ru.betterend.registry.EndBlocks; -public class BlockTwistedUmbrellaMossTall extends BlockDoublePlant { - public BlockTwistedUmbrellaMossTall() { +public class TwistedUmbrellaMossTallBlock extends DoublePlantBlock { + public TwistedUmbrellaMossTallBlock() { super(12); } diff --git a/src/main/java/ru/betterend/blocks/BlockUmbrellaMoss.java b/src/main/java/ru/betterend/blocks/UmbrellaMossBlock.java similarity index 78% rename from src/main/java/ru/betterend/blocks/BlockUmbrellaMoss.java rename to src/main/java/ru/betterend/blocks/UmbrellaMossBlock.java index 2edb374a..90173d0d 100644 --- a/src/main/java/ru/betterend/blocks/BlockUmbrellaMoss.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaMossBlock.java @@ -9,13 +9,13 @@ import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; import net.minecraft.world.BlockView; import net.minecraft.world.World; -import ru.betterend.blocks.basis.BlockDoublePlant; -import ru.betterend.blocks.basis.BlockPlant; +import ru.betterend.blocks.basis.DoublePlantBlock; +import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; -public class BlockUmbrellaMoss extends BlockPlant { - public BlockUmbrellaMoss() { +public class UmbrellaMossBlock extends EndPlantBlock { + public UmbrellaMossBlock() { super(11); } @@ -42,8 +42,8 @@ public class BlockUmbrellaMoss extends BlockPlant { @Override public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { int rot = world.random.nextInt(4); - BlockState bs = EndBlocks.UMBRELLA_MOSS_TALL.getDefaultState().with(BlockDoublePlant.ROTATION, rot); + BlockState bs = EndBlocks.UMBRELLA_MOSS_TALL.getDefaultState().with(DoublePlantBlock.ROTATION, rot); BlocksHelper.setWithoutUpdate(world, pos, bs); - BlocksHelper.setWithoutUpdate(world, pos.up(), bs.with(BlockDoublePlant.TOP, true)); + BlocksHelper.setWithoutUpdate(world, pos.up(), bs.with(DoublePlantBlock.TOP, true)); } } diff --git a/src/main/java/ru/betterend/blocks/BlockUmbrellaMossTall.java b/src/main/java/ru/betterend/blocks/UmbrellaMossTallBlock.java similarity index 81% rename from src/main/java/ru/betterend/blocks/BlockUmbrellaMossTall.java rename to src/main/java/ru/betterend/blocks/UmbrellaMossTallBlock.java index 85333686..c3a90063 100644 --- a/src/main/java/ru/betterend/blocks/BlockUmbrellaMossTall.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaMossTallBlock.java @@ -7,11 +7,11 @@ import net.minecraft.entity.ItemEntity; import net.minecraft.item.ItemStack; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; -import ru.betterend.blocks.basis.BlockDoublePlant; +import ru.betterend.blocks.basis.DoublePlantBlock; import ru.betterend.registry.EndBlocks; -public class BlockUmbrellaMossTall extends BlockDoublePlant { - public BlockUmbrellaMossTall() { +public class UmbrellaMossTallBlock extends DoublePlantBlock { + public UmbrellaMossTallBlock() { super(12); } diff --git a/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeCluster.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java similarity index 91% rename from src/main/java/ru/betterend/blocks/BlockUmbrellaTreeCluster.java rename to src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java index 8f013990..55c2d478 100644 --- a/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeCluster.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java @@ -17,15 +17,15 @@ import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.BaseBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; import ru.betterend.util.BlocksHelper; -public class BlockUmbrellaTreeCluster extends BlockBase { +public class UmbrellaTreeClusterBlock extends BaseBlock { public static final BooleanProperty NATURAL = BlockProperties.NATURAL; - public BlockUmbrellaTreeCluster() { + public UmbrellaTreeClusterBlock() { super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK) .materialColor(MaterialColor.PURPLE) .luminance(15)); diff --git a/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeClusterEmpty.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java similarity index 82% rename from src/main/java/ru/betterend/blocks/BlockUmbrellaTreeClusterEmpty.java rename to src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java index decab1f9..6cb335b5 100644 --- a/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeClusterEmpty.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java @@ -11,14 +11,14 @@ import net.minecraft.server.world.ServerWorld; import net.minecraft.state.StateManager; import net.minecraft.state.property.BooleanProperty; import net.minecraft.util.math.BlockPos; -import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.BaseBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; -public class BlockUmbrellaTreeClusterEmpty extends BlockBase { +public class UmbrellaTreeClusterEmptyBlock extends BaseBlock { public static final BooleanProperty NATURAL = BlockProperties.NATURAL; - public BlockUmbrellaTreeClusterEmpty() { + public UmbrellaTreeClusterEmptyBlock() { super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK) .materialColor(MaterialColor.PURPLE) .ticksRandomly()); @@ -33,7 +33,7 @@ public class BlockUmbrellaTreeClusterEmpty extends BlockBase { @Override public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { if (state.get(NATURAL) && random.nextInt(16) == 0) { - BlocksHelper.setWithUpdate(world, pos, EndBlocks.UMBRELLA_TREE_CLUSTER.getDefaultState().with(BlockUmbrellaTreeCluster.NATURAL, true)); + BlocksHelper.setWithUpdate(world, pos, EndBlocks.UMBRELLA_TREE_CLUSTER.getDefaultState().with(UmbrellaTreeClusterBlock.NATURAL, true)); } } } diff --git a/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeMembrane.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java similarity index 93% rename from src/main/java/ru/betterend/blocks/BlockUmbrellaTreeMembrane.java rename to src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java index 61042adf..75075069 100644 --- a/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeMembrane.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java @@ -31,11 +31,11 @@ import ru.betterend.patterns.Patterns; import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; -public class BlockUmbrellaTreeMembrane extends SlimeBlock implements IRenderTypeable, BlockPatterned { +public class UmbrellaTreeMembraneBlock extends SlimeBlock implements IRenderTypeable, BlockPatterned { public static final IntProperty COLOR = IntProperty.of("color", 0, 7); private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); - public BlockUmbrellaTreeMembrane() { + public UmbrellaTreeMembraneBlock() { super(FabricBlockSettings.copyOf(Blocks.SLIME_BLOCK)); } diff --git a/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeSapling.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java similarity index 78% rename from src/main/java/ru/betterend/blocks/BlockUmbrellaTreeSapling.java rename to src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java index 485008e1..eba60eff 100644 --- a/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeSapling.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java @@ -4,13 +4,13 @@ import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldView; import net.minecraft.world.gen.feature.Feature; -import ru.betterend.blocks.basis.BlockFeatureSapling; +import ru.betterend.blocks.basis.FeatureSaplingBlock; import ru.betterend.client.render.ERenderLayer; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; -public class BlockUmbrellaTreeSapling extends BlockFeatureSapling { - public BlockUmbrellaTreeSapling() { +public class UmbrellaTreeSaplingBlock extends FeatureSaplingBlock { + public UmbrellaTreeSaplingBlock() { super(); } diff --git a/src/main/java/ru/betterend/blocks/BlockVentBubbleColumn.java b/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java similarity index 95% rename from src/main/java/ru/betterend/blocks/BlockVentBubbleColumn.java rename to src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java index 7391c96b..970d866a 100644 --- a/src/main/java/ru/betterend/blocks/BlockVentBubbleColumn.java +++ b/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java @@ -32,8 +32,8 @@ import net.minecraft.world.WorldView; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; -public class BlockVentBubbleColumn extends Block implements FluidDrainable, FluidFillable { - public BlockVentBubbleColumn() { +public class VentBubbleColumnBlock extends Block implements FluidDrainable, FluidFillable { + public VentBubbleColumnBlock() { super(FabricBlockSettings.of(Material.BUBBLE_COLUMN).nonOpaque().noCollision().dropsNothing()); } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockAttached.java b/src/main/java/ru/betterend/blocks/basis/AttachedBlock.java similarity index 93% rename from src/main/java/ru/betterend/blocks/basis/BlockAttached.java rename to src/main/java/ru/betterend/blocks/basis/AttachedBlock.java index 6a6f8525..e5a58779 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockAttached.java +++ b/src/main/java/ru/betterend/blocks/basis/AttachedBlock.java @@ -16,10 +16,10 @@ import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; import ru.betterend.util.BlocksHelper; -public abstract class BlockAttached extends BlockBaseNotFull { +public abstract class AttachedBlock extends BaseBlockNotFull { public static final DirectionProperty FACING = Properties.FACING; - public BlockAttached(Settings settings) { + public AttachedBlock(Settings settings) { super(settings); this.setDefaultState(this.getDefaultState().with(FACING, Direction.UP)); } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockBark.java b/src/main/java/ru/betterend/blocks/basis/BarkBlock.java similarity index 86% rename from src/main/java/ru/betterend/blocks/basis/BlockBark.java rename to src/main/java/ru/betterend/blocks/basis/BarkBlock.java index 94847b94..f6c3587b 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockBark.java +++ b/src/main/java/ru/betterend/blocks/basis/BarkBlock.java @@ -6,8 +6,8 @@ import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; import ru.betterend.patterns.Patterns; -public class BlockBark extends BlockPillar { - public BlockBark(Settings settings) { +public class BarkBlock extends EndPillarBlock { + public BarkBlock(Settings settings) { super(settings); } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockBase.java b/src/main/java/ru/betterend/blocks/basis/BaseBlock.java similarity index 88% rename from src/main/java/ru/betterend/blocks/basis/BlockBase.java rename to src/main/java/ru/betterend/blocks/basis/BaseBlock.java index cdebbf74..a58755b9 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockBase.java +++ b/src/main/java/ru/betterend/blocks/basis/BaseBlock.java @@ -13,8 +13,8 @@ import net.minecraft.util.registry.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class BlockBase extends Block implements BlockPatterned { - public BlockBase(Settings settings) { +public class BaseBlock extends Block implements BlockPatterned { + public BaseBlock(Settings settings) { super(settings); } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockBaseNotFull.java b/src/main/java/ru/betterend/blocks/basis/BaseBlockNotFull.java similarity index 81% rename from src/main/java/ru/betterend/blocks/basis/BlockBaseNotFull.java rename to src/main/java/ru/betterend/blocks/basis/BaseBlockNotFull.java index dbf23923..fb967f7e 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockBaseNotFull.java +++ b/src/main/java/ru/betterend/blocks/basis/BaseBlockNotFull.java @@ -5,9 +5,9 @@ import net.minecraft.entity.EntityType; import net.minecraft.util.math.BlockPos; import net.minecraft.world.BlockView; -public class BlockBaseNotFull extends BlockBase { +public class BaseBlockNotFull extends BaseBlock { - public BlockBaseNotFull(Settings settings) { + public BaseBlockNotFull(Settings settings) { super(settings); } diff --git a/src/main/java/ru/betterend/blocks/basis/BaseBlockWithEntity.java b/src/main/java/ru/betterend/blocks/basis/BaseBlockWithEntity.java index 4442e05d..b0f49174 100644 --- a/src/main/java/ru/betterend/blocks/basis/BaseBlockWithEntity.java +++ b/src/main/java/ru/betterend/blocks/basis/BaseBlockWithEntity.java @@ -11,7 +11,6 @@ import net.minecraft.loot.context.LootContext; import net.minecraft.world.BlockView; public class BaseBlockWithEntity extends BlockWithEntity { - public BaseBlockWithEntity(Settings settings) { super(settings); } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockDoublePlant.java b/src/main/java/ru/betterend/blocks/basis/DoublePlantBlock.java similarity index 94% rename from src/main/java/ru/betterend/blocks/basis/BlockDoublePlant.java rename to src/main/java/ru/betterend/blocks/basis/DoublePlantBlock.java index c1290b9e..e21e6d92 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockDoublePlant.java +++ b/src/main/java/ru/betterend/blocks/basis/DoublePlantBlock.java @@ -40,12 +40,12 @@ import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; -public class BlockDoublePlant extends BlockBaseNotFull implements IRenderTypeable, Fertilizable { +public class DoublePlantBlock extends BaseBlockNotFull implements IRenderTypeable, Fertilizable { private static final VoxelShape SHAPE = Block.createCuboidShape(4, 2, 4, 12, 16, 12); public static final IntProperty ROTATION = BlockProperties.ROTATION; public static final BooleanProperty TOP = BooleanProperty.of("top"); - public BlockDoublePlant() { + public DoublePlantBlock() { super(FabricBlockSettings.of(Material.PLANT) .breakByTool(FabricToolTags.SHEARS) .sounds(BlockSoundGroup.WET_GRASS) @@ -54,7 +54,7 @@ public class BlockDoublePlant extends BlockBaseNotFull implements IRenderTypeabl this.setDefaultState(this.stateManager.getDefaultState().with(TOP, false)); } - public BlockDoublePlant(int light) { + public DoublePlantBlock(int light) { super(FabricBlockSettings.of(Material.PLANT) .breakByTool(FabricToolTags.SHEARS) .sounds(BlockSoundGroup.WET_GRASS) diff --git a/src/main/java/ru/betterend/blocks/basis/BlockBarrel.java b/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java similarity index 93% rename from src/main/java/ru/betterend/blocks/basis/BlockBarrel.java rename to src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java index 8cf0e69c..7098b82b 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockBarrel.java +++ b/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java @@ -30,8 +30,8 @@ import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; import ru.betterend.registry.EndBlockEntities; -public class BlockBarrel extends BarrelBlock implements BlockPatterned { - public BlockBarrel(Block source) { +public class EndBarrelBlock extends BarrelBlock implements BlockPatterned { + public EndBarrelBlock(Block source) { super(FabricBlockSettings.copyOf(source).nonOpaque()); } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockBarkStripable.java b/src/main/java/ru/betterend/blocks/basis/EndBlockStripableLogLog.java similarity index 89% rename from src/main/java/ru/betterend/blocks/basis/BlockBarkStripable.java rename to src/main/java/ru/betterend/blocks/basis/EndBlockStripableLogLog.java index 5adef8f5..8813267a 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockBarkStripable.java +++ b/src/main/java/ru/betterend/blocks/basis/EndBlockStripableLogLog.java @@ -16,10 +16,10 @@ import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -public class BlockBarkStripable extends BlockBark { +public class EndBlockStripableLogLog extends EndPillarBlock { private final Block striped; - public BlockBarkStripable(MaterialColor color, Block striped) { + public EndBlockStripableLogLog(MaterialColor color, Block striped) { super(FabricBlockSettings.copyOf(striped).materialColor(color)); this.striped = striped; } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockBookshelf.java b/src/main/java/ru/betterend/blocks/basis/EndBookshelfBlock.java similarity index 92% rename from src/main/java/ru/betterend/blocks/basis/BlockBookshelf.java rename to src/main/java/ru/betterend/blocks/basis/EndBookshelfBlock.java index a2b7cce5..b275fd37 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockBookshelf.java +++ b/src/main/java/ru/betterend/blocks/basis/EndBookshelfBlock.java @@ -17,8 +17,8 @@ import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; import ru.betterend.patterns.Patterns; -public class BlockBookshelf extends BlockBase { - public BlockBookshelf(Block source) { +public class EndBookshelfBlock extends BaseBlock { + public EndBookshelfBlock(Block source) { super(FabricBlockSettings.copyOf(source)); } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockChest.java b/src/main/java/ru/betterend/blocks/basis/EndChestBlock.java similarity index 91% rename from src/main/java/ru/betterend/blocks/basis/BlockChest.java rename to src/main/java/ru/betterend/blocks/basis/EndChestBlock.java index 580f3ca8..1d4d5582 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockChest.java +++ b/src/main/java/ru/betterend/blocks/basis/EndChestBlock.java @@ -17,11 +17,10 @@ import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; import ru.betterend.registry.EndBlockEntities; -public class BlockChest extends ChestBlock implements BlockPatterned { - +public class EndChestBlock extends ChestBlock implements BlockPatterned { private final Block parent; - public BlockChest(Block source) { + public EndChestBlock(Block source) { super(FabricBlockSettings.copyOf(source).nonOpaque(), () -> { return EndBlockEntities.CHEST; }); diff --git a/src/main/java/ru/betterend/blocks/basis/BlockComposter.java b/src/main/java/ru/betterend/blocks/basis/EndComposterBlock.java similarity index 88% rename from src/main/java/ru/betterend/blocks/basis/BlockComposter.java rename to src/main/java/ru/betterend/blocks/basis/EndComposterBlock.java index 2c4cc28c..8d8a77f2 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockComposter.java +++ b/src/main/java/ru/betterend/blocks/basis/EndComposterBlock.java @@ -15,8 +15,8 @@ import net.minecraft.util.registry.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class BlockComposter extends ComposterBlock implements BlockPatterned { - public BlockComposter(Block source) { +public class EndComposterBlock extends ComposterBlock implements BlockPatterned { + public EndComposterBlock(Block source) { super(FabricBlockSettings.copyOf(source)); } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockCraftingTable.java b/src/main/java/ru/betterend/blocks/basis/EndCraftingTableBlock.java similarity index 89% rename from src/main/java/ru/betterend/blocks/basis/BlockCraftingTable.java rename to src/main/java/ru/betterend/blocks/basis/EndCraftingTableBlock.java index 7840de90..a918ac34 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockCraftingTable.java +++ b/src/main/java/ru/betterend/blocks/basis/EndCraftingTableBlock.java @@ -16,8 +16,8 @@ import net.minecraft.util.registry.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class BlockCraftingTable extends CraftingTableBlock implements BlockPatterned { - public BlockCraftingTable(Block source) { +public class EndCraftingTableBlock extends CraftingTableBlock implements BlockPatterned { + public EndCraftingTableBlock(Block source) { super(FabricBlockSettings.copyOf(source)); } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockDoor.java b/src/main/java/ru/betterend/blocks/basis/EndDoorBlock.java similarity index 93% rename from src/main/java/ru/betterend/blocks/basis/BlockDoor.java rename to src/main/java/ru/betterend/blocks/basis/EndDoorBlock.java index f41ae172..c8dbe648 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockDoor.java +++ b/src/main/java/ru/betterend/blocks/basis/EndDoorBlock.java @@ -18,8 +18,8 @@ import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class BlockDoor extends DoorBlock implements IRenderTypeable, BlockPatterned { - public BlockDoor(Block block) { +public class EndDoorBlock extends DoorBlock implements IRenderTypeable, BlockPatterned { + public EndDoorBlock(Block block) { super(FabricBlockSettings.copy(block).nonOpaque()); } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockFence.java b/src/main/java/ru/betterend/blocks/basis/EndFenceBlock.java similarity index 90% rename from src/main/java/ru/betterend/blocks/basis/BlockFence.java rename to src/main/java/ru/betterend/blocks/basis/EndFenceBlock.java index 17b7d007..e2c87c5e 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockFence.java +++ b/src/main/java/ru/betterend/blocks/basis/EndFenceBlock.java @@ -15,11 +15,10 @@ import net.minecraft.util.registry.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class BlockFence extends FenceBlock implements BlockPatterned { - +public class EndFenceBlock extends FenceBlock implements BlockPatterned { private final Block parent; - public BlockFence(Block source) { + public EndFenceBlock(Block source) { super(FabricBlockSettings.copyOf(source).nonOpaque()); this.parent = source; } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockGate.java b/src/main/java/ru/betterend/blocks/basis/EndGateBlock.java similarity index 91% rename from src/main/java/ru/betterend/blocks/basis/BlockGate.java rename to src/main/java/ru/betterend/blocks/basis/EndGateBlock.java index 37cc1ecd..f7c8c240 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockGate.java +++ b/src/main/java/ru/betterend/blocks/basis/EndGateBlock.java @@ -15,11 +15,10 @@ import net.minecraft.util.registry.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class BlockGate extends FenceGateBlock implements BlockPatterned { - +public class EndGateBlock extends FenceGateBlock implements BlockPatterned { private final Block parent; - public BlockGate(Block source) { + public EndGateBlock(Block source) { super(FabricBlockSettings.copyOf(source).nonOpaque()); this.parent = source; } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockLadder.java b/src/main/java/ru/betterend/blocks/basis/EndLadderBlock.java similarity index 94% rename from src/main/java/ru/betterend/blocks/basis/BlockLadder.java rename to src/main/java/ru/betterend/blocks/basis/EndLadderBlock.java index d5d5cba9..a7343275 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockLadder.java +++ b/src/main/java/ru/betterend/blocks/basis/EndLadderBlock.java @@ -31,7 +31,7 @@ import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; import ru.betterend.util.BlocksHelper; -public class BlockLadder extends BlockBaseNotFull implements IRenderTypeable, BlockPatterned { +public class EndLadderBlock extends BaseBlockNotFull implements IRenderTypeable, BlockPatterned { public static final DirectionProperty FACING = HorizontalFacingBlock.FACING; public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; protected static final VoxelShape EAST_SHAPE = Block.createCuboidShape(0.0D, 0.0D, 0.0D, 3.0D, 16.0D, 16.0D); @@ -39,7 +39,7 @@ public class BlockLadder extends BlockBaseNotFull implements IRenderTypeable, Bl protected static final VoxelShape SOUTH_SHAPE = Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 16.0D, 3.0D); protected static final VoxelShape NORTH_SHAPE = Block.createCuboidShape(0.0D, 0.0D, 13.0D, 16.0D, 16.0D, 16.0D); - public BlockLadder(Block block) { + public EndLadderBlock(Block block) { super(FabricBlockSettings.copyOf(block).nonOpaque()); } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockLantern.java b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java similarity index 92% rename from src/main/java/ru/betterend/blocks/basis/BlockLantern.java rename to src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java index 0448bfbc..cb72f15c 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockLantern.java +++ b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java @@ -19,15 +19,15 @@ import net.minecraft.world.BlockView; import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; -public class BlockLantern extends BlockBaseNotFull implements Waterloggable, FluidFillable { +public class EndLanternBlock extends BaseBlockNotFull implements Waterloggable, FluidFillable { public static final BooleanProperty IS_FLOOR = BooleanProperty.of("is_floor"); public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; - public BlockLantern(Block source) { + public EndLanternBlock(Block source) { this(FabricBlockSettings.copyOf(source).luminance(15).nonOpaque()); } - public BlockLantern(FabricBlockSettings settings) { + public EndLanternBlock(FabricBlockSettings settings) { super(settings.nonOpaque()); } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockLeaves.java b/src/main/java/ru/betterend/blocks/basis/EndLeavesBlock.java similarity index 90% rename from src/main/java/ru/betterend/blocks/basis/BlockLeaves.java rename to src/main/java/ru/betterend/blocks/basis/EndLeavesBlock.java index a00e8f35..483b877c 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockLeaves.java +++ b/src/main/java/ru/betterend/blocks/basis/EndLeavesBlock.java @@ -26,10 +26,10 @@ import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; import ru.betterend.util.MHelper; -public class BlockLeaves extends LeavesBlock implements BlockPatterned, IRenderTypeable { +public class EndLeavesBlock extends LeavesBlock implements BlockPatterned, IRenderTypeable { private final Block sapling; - public BlockLeaves(Block sapling, MaterialColor color) { + public EndLeavesBlock(Block sapling, MaterialColor color) { super(FabricBlockSettings.copyOf(Blocks.OAK_LEAVES) .allowsSpawning((state, world, pos, type) -> { return false; }) .suffocates((state, world, pos) -> { return false; }) @@ -39,7 +39,7 @@ public class BlockLeaves extends LeavesBlock implements BlockPatterned, IRenderT this.sapling = sapling; } - public BlockLeaves(Block sapling, MaterialColor color, int light) { + public EndLeavesBlock(Block sapling, MaterialColor color, int light) { super(FabricBlockSettings.copyOf(Blocks.OAK_LEAVES) .allowsSpawning((state, world, pos, type) -> { return false; }) .suffocates((state, world, pos) -> { return false; }) diff --git a/src/main/java/ru/betterend/blocks/basis/BlockOre.java b/src/main/java/ru/betterend/blocks/basis/EndOreBlock.java similarity index 92% rename from src/main/java/ru/betterend/blocks/basis/BlockOre.java rename to src/main/java/ru/betterend/blocks/basis/EndOreBlock.java index 0fc93d69..7ccab8b4 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockOre.java +++ b/src/main/java/ru/betterend/blocks/basis/EndOreBlock.java @@ -24,13 +24,13 @@ import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; import ru.betterend.util.MHelper; -public class BlockOre extends OreBlock implements BlockPatterned { +public class EndOreBlock extends OreBlock implements BlockPatterned { private final Item dropItem; private final int minCount; private final int maxCount; private final int expirience; - public BlockOre(Item drop, int minCount, int maxCount, int expirience) { + public EndOreBlock(Item drop, int minCount, int maxCount, int expirience) { super(FabricBlockSettings.of(Material.STONE, MaterialColor.SAND) .hardness(3F) .resistance(9F) diff --git a/src/main/java/ru/betterend/blocks/basis/BlockPillar.java b/src/main/java/ru/betterend/blocks/basis/EndPillarBlock.java similarity index 86% rename from src/main/java/ru/betterend/blocks/basis/BlockPillar.java rename to src/main/java/ru/betterend/blocks/basis/EndPillarBlock.java index 6f64faf9..04f9ff4d 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockPillar.java +++ b/src/main/java/ru/betterend/blocks/basis/EndPillarBlock.java @@ -13,8 +13,8 @@ import net.minecraft.util.registry.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class BlockPillar extends PillarBlock implements BlockPatterned { - public BlockPillar(Settings settings) { +public class EndPillarBlock extends PillarBlock implements BlockPatterned { + public EndPillarBlock(Settings settings) { super(settings); } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockPlant.java b/src/main/java/ru/betterend/blocks/basis/EndPlantBlock.java similarity index 89% rename from src/main/java/ru/betterend/blocks/basis/BlockPlant.java rename to src/main/java/ru/betterend/blocks/basis/EndPlantBlock.java index 3cc74c74..136b7346 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockPlant.java +++ b/src/main/java/ru/betterend/blocks/basis/EndPlantBlock.java @@ -34,18 +34,18 @@ import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndTags; -public class BlockPlant extends BlockBaseNotFull implements IRenderTypeable, Fertilizable { +public class EndPlantBlock extends BaseBlockNotFull implements IRenderTypeable, Fertilizable { private static final VoxelShape SHAPE = Block.createCuboidShape(4, 0, 4, 12, 14, 12); - public BlockPlant() { + public EndPlantBlock() { this(false); } - public BlockPlant(int light) { + public EndPlantBlock(int light) { this(false, light); } - public BlockPlant(boolean replaceable) { + public EndPlantBlock(boolean replaceable) { super(FabricBlockSettings.of(replaceable ? Material.REPLACEABLE_PLANT : Material.PLANT) .breakByTool(FabricToolTags.SHEARS) .sounds(BlockSoundGroup.GRASS) @@ -53,7 +53,7 @@ public class BlockPlant extends BlockBaseNotFull implements IRenderTypeable, Fer .noCollision()); } - public BlockPlant(boolean replaceable, int light) { + public EndPlantBlock(boolean replaceable, int light) { super(FabricBlockSettings.of(replaceable ? Material.REPLACEABLE_PLANT : Material.PLANT) .breakByTool(FabricToolTags.SHEARS) .sounds(BlockSoundGroup.GRASS) @@ -62,7 +62,7 @@ public class BlockPlant extends BlockBaseNotFull implements IRenderTypeable, Fer .noCollision()); } - public BlockPlant(Settings settings) { + public EndPlantBlock(Settings settings) { super(settings); } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockPressurePlate.java b/src/main/java/ru/betterend/blocks/basis/EndPlateBlock.java similarity index 89% rename from src/main/java/ru/betterend/blocks/basis/BlockPressurePlate.java rename to src/main/java/ru/betterend/blocks/basis/EndPlateBlock.java index 0bd66e41..955024b5 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockPressurePlate.java +++ b/src/main/java/ru/betterend/blocks/basis/EndPlateBlock.java @@ -15,11 +15,10 @@ import net.minecraft.util.registry.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class BlockPressurePlate extends PressurePlateBlock implements BlockPatterned { - +public class EndPlateBlock extends PressurePlateBlock implements BlockPatterned { private final Block parent; - public BlockPressurePlate(Block source) { + public EndPlateBlock(Block source) { super(ActivationRule.EVERYTHING, FabricBlockSettings.copyOf(source).nonOpaque()); this.parent = source; } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockSign.java b/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java similarity index 95% rename from src/main/java/ru/betterend/blocks/basis/BlockSign.java rename to src/main/java/ru/betterend/blocks/basis/EndSignBlock.java index 659b94ac..f0f9b0f2 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockSign.java +++ b/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java @@ -41,7 +41,7 @@ import ru.betterend.blocks.entities.ESignBlockEntity; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class BlockSign extends AbstractSignBlock implements BlockPatterned { +public class EndSignBlock extends AbstractSignBlock implements BlockPatterned { public static final IntProperty ROTATION = Properties.ROTATION; public static final BooleanProperty FLOOR = BooleanProperty.of("floor"); private static final VoxelShape[] WALL_SHAPES = new VoxelShape[] { @@ -52,7 +52,7 @@ public class BlockSign extends AbstractSignBlock implements BlockPatterned { private final Block parent; - public BlockSign(Block source) { + public EndSignBlock(Block source) { super(FabricBlockSettings.copyOf(source).noCollision().nonOpaque(), SignType.OAK); this.setDefaultState(this.stateManager.getDefaultState().with(ROTATION, 0).with(FLOOR, true).with(WATERLOGGED, false)); this.parent = source; diff --git a/src/main/java/ru/betterend/blocks/basis/BlockSlab.java b/src/main/java/ru/betterend/blocks/basis/EndSlabBlock.java similarity index 89% rename from src/main/java/ru/betterend/blocks/basis/BlockSlab.java rename to src/main/java/ru/betterend/blocks/basis/EndSlabBlock.java index d08a9c5e..102d6966 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockSlab.java +++ b/src/main/java/ru/betterend/blocks/basis/EndSlabBlock.java @@ -15,11 +15,10 @@ import net.minecraft.util.registry.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class BlockSlab extends SlabBlock implements BlockPatterned { - +public class EndSlabBlock extends SlabBlock implements BlockPatterned { private final Block parent; - public BlockSlab(Block source) { + public EndSlabBlock(Block source) { super(FabricBlockSettings.copyOf(source)); this.parent = source; } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockStairs.java b/src/main/java/ru/betterend/blocks/basis/EndStairsBlock.java similarity index 90% rename from src/main/java/ru/betterend/blocks/basis/BlockStairs.java rename to src/main/java/ru/betterend/blocks/basis/EndStairsBlock.java index 3dc261fa..cbbaf6b0 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockStairs.java +++ b/src/main/java/ru/betterend/blocks/basis/EndStairsBlock.java @@ -15,11 +15,11 @@ import net.minecraft.util.registry.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class BlockStairs extends StairsBlock implements BlockPatterned { +public class EndStairsBlock extends StairsBlock implements BlockPatterned { private final Block parent; - public BlockStairs(Block source) { + public EndStairsBlock(Block source) { super(source.getDefaultState(), FabricBlockSettings.copyOf(source)); this.parent = source; } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockStoneButton.java b/src/main/java/ru/betterend/blocks/basis/EndStoneButtonBlock.java similarity index 90% rename from src/main/java/ru/betterend/blocks/basis/BlockStoneButton.java rename to src/main/java/ru/betterend/blocks/basis/EndStoneButtonBlock.java index a7dd86e5..2476bd80 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockStoneButton.java +++ b/src/main/java/ru/betterend/blocks/basis/EndStoneButtonBlock.java @@ -15,11 +15,10 @@ import net.minecraft.util.registry.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class BlockStoneButton extends StoneButtonBlock implements BlockPatterned { - +public class EndStoneButtonBlock extends StoneButtonBlock implements BlockPatterned { private final Block parent; - public BlockStoneButton(Block source) { + public EndStoneButtonBlock(Block source) { super(FabricBlockSettings.copyOf(source).nonOpaque()); this.parent = source; } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockStonePressurePlate.java b/src/main/java/ru/betterend/blocks/basis/EndStonelateBlock.java similarity index 89% rename from src/main/java/ru/betterend/blocks/basis/BlockStonePressurePlate.java rename to src/main/java/ru/betterend/blocks/basis/EndStonelateBlock.java index 8dce5c00..1ce22d37 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockStonePressurePlate.java +++ b/src/main/java/ru/betterend/blocks/basis/EndStonelateBlock.java @@ -15,11 +15,10 @@ import net.minecraft.util.registry.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class BlockStonePressurePlate extends PressurePlateBlock implements BlockPatterned { - +public class EndStonelateBlock extends PressurePlateBlock implements BlockPatterned { private final Block parent; - public BlockStonePressurePlate(Block source) { + public EndStonelateBlock(Block source) { super(ActivationRule.MOBS, FabricBlockSettings.copyOf(source).nonOpaque()); this.parent = source; } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockTrapdoor.java b/src/main/java/ru/betterend/blocks/basis/EndTrapdoorBlock.java similarity index 89% rename from src/main/java/ru/betterend/blocks/basis/BlockTrapdoor.java rename to src/main/java/ru/betterend/blocks/basis/EndTrapdoorBlock.java index 08777a7c..0351e4de 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockTrapdoor.java +++ b/src/main/java/ru/betterend/blocks/basis/EndTrapdoorBlock.java @@ -18,8 +18,8 @@ import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class BlockTrapdoor extends TrapdoorBlock implements IRenderTypeable, BlockPatterned { - public BlockTrapdoor(Block source) { +public class EndTrapdoorBlock extends TrapdoorBlock implements IRenderTypeable, BlockPatterned { + public EndTrapdoorBlock(Block source) { super(FabricBlockSettings.copyOf(source).nonOpaque()); } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockUnderwaterWallPlant.java b/src/main/java/ru/betterend/blocks/basis/EndUnderwaterWallPlantBlock.java similarity index 84% rename from src/main/java/ru/betterend/blocks/basis/BlockUnderwaterWallPlant.java rename to src/main/java/ru/betterend/blocks/basis/EndUnderwaterWallPlantBlock.java index 2ea2bb31..3216584d 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockUnderwaterWallPlant.java +++ b/src/main/java/ru/betterend/blocks/basis/EndUnderwaterWallPlantBlock.java @@ -14,9 +14,9 @@ import net.minecraft.world.BlockView; import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; -public class BlockUnderwaterWallPlant extends BlockWallPlant implements FluidFillable { +public class EndUnderwaterWallPlantBlock extends EndWallPlantBlock implements FluidFillable { - public BlockUnderwaterWallPlant() { + public EndUnderwaterWallPlantBlock() { super(FabricBlockSettings.of(Material.UNDERWATER_PLANT) .breakByTool(FabricToolTags.SHEARS) .sounds(BlockSoundGroup.WET_GRASS) @@ -24,7 +24,7 @@ public class BlockUnderwaterWallPlant extends BlockWallPlant implements FluidFil .noCollision()); } - public BlockUnderwaterWallPlant(int light) { + public EndUnderwaterWallPlantBlock(int light) { super(FabricBlockSettings.of(Material.UNDERWATER_PLANT) .breakByTool(FabricToolTags.SHEARS) .sounds(BlockSoundGroup.WET_GRASS) @@ -33,7 +33,7 @@ public class BlockUnderwaterWallPlant extends BlockWallPlant implements FluidFil .noCollision()); } - public BlockUnderwaterWallPlant(Settings settings) { + public EndUnderwaterWallPlantBlock(Settings settings) { super(settings); } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockWall.java b/src/main/java/ru/betterend/blocks/basis/EndWallBlock.java similarity index 91% rename from src/main/java/ru/betterend/blocks/basis/BlockWall.java rename to src/main/java/ru/betterend/blocks/basis/EndWallBlock.java index 2010a583..3ce75cd6 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockWall.java +++ b/src/main/java/ru/betterend/blocks/basis/EndWallBlock.java @@ -15,11 +15,11 @@ import net.minecraft.util.registry.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class BlockWall extends WallBlock implements BlockPatterned { +public class EndWallBlock extends WallBlock implements BlockPatterned { private final Block parent; - public BlockWall(Block source) { + public EndWallBlock(Block source) { super(FabricBlockSettings.copyOf(source).nonOpaque()); this.parent = source; } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockWallPlant.java b/src/main/java/ru/betterend/blocks/basis/EndWallPlantBlock.java similarity index 93% rename from src/main/java/ru/betterend/blocks/basis/BlockWallPlant.java rename to src/main/java/ru/betterend/blocks/basis/EndWallPlantBlock.java index f2e1d94a..6de67ec3 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockWallPlant.java +++ b/src/main/java/ru/betterend/blocks/basis/EndWallPlantBlock.java @@ -28,7 +28,7 @@ import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; import ru.betterend.util.BlocksHelper; -public class BlockWallPlant extends BlockPlant { +public class EndWallPlantBlock extends EndPlantBlock { private static final EnumMap SHAPES = Maps.newEnumMap(ImmutableMap.of( Direction.NORTH, Block.createCuboidShape(1, 1, 8, 15, 15, 16), Direction.SOUTH, Block.createCuboidShape(1, 1, 0, 15, 15, 8), @@ -36,7 +36,7 @@ public class BlockWallPlant extends BlockPlant { Direction.EAST, Block.createCuboidShape(0, 1, 1, 8, 15, 15))); public static final DirectionProperty FACING = HorizontalFacingBlock.FACING; - public BlockWallPlant() { + public EndWallPlantBlock() { this(FabricBlockSettings.of(Material.PLANT) .breakByTool(FabricToolTags.SHEARS) .sounds(BlockSoundGroup.GRASS) @@ -44,7 +44,7 @@ public class BlockWallPlant extends BlockPlant { .noCollision()); } - public BlockWallPlant(int light) { + public EndWallPlantBlock(int light) { this(FabricBlockSettings.of(Material.PLANT) .breakByTool(FabricToolTags.SHEARS) .sounds(BlockSoundGroup.GRASS) @@ -53,7 +53,7 @@ public class BlockWallPlant extends BlockPlant { .noCollision()); } - public BlockWallPlant(Settings settings) { + public EndWallPlantBlock(Settings settings) { super(settings); } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockWoodenButton.java b/src/main/java/ru/betterend/blocks/basis/EndWoodenButtonBlock.java similarity index 89% rename from src/main/java/ru/betterend/blocks/basis/BlockWoodenButton.java rename to src/main/java/ru/betterend/blocks/basis/EndWoodenButtonBlock.java index 025569b3..97369b6c 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockWoodenButton.java +++ b/src/main/java/ru/betterend/blocks/basis/EndWoodenButtonBlock.java @@ -15,11 +15,11 @@ import net.minecraft.util.registry.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class BlockWoodenButton extends WoodenButtonBlock implements BlockPatterned { +public class EndWoodenButtonBlock extends WoodenButtonBlock implements BlockPatterned { private final Block parent; - public BlockWoodenButton(Block source) { + public EndWoodenButtonBlock(Block source) { super(FabricBlockSettings.copyOf(source).nonOpaque()); this.parent = source; } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockFeatureSapling.java b/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java similarity index 93% rename from src/main/java/ru/betterend/blocks/basis/BlockFeatureSapling.java rename to src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java index 1adad8e6..fd0b6ab5 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockFeatureSapling.java +++ b/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java @@ -27,10 +27,10 @@ import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.Patterns; import ru.betterend.registry.EndTags; -public abstract class BlockFeatureSapling extends BlockBaseNotFull implements Fertilizable, IRenderTypeable { +public abstract class FeatureSaplingBlock extends BaseBlockNotFull implements Fertilizable, IRenderTypeable { private static final VoxelShape SHAPE = Block.createCuboidShape(4, 0, 4, 12, 14, 12); - public BlockFeatureSapling() { + public FeatureSaplingBlock() { super(FabricBlockSettings.of(Material.PLANT) .breakByHand(true) .collidable(false) @@ -39,7 +39,7 @@ public abstract class BlockFeatureSapling extends BlockBaseNotFull implements Fe .ticksRandomly()); } - public BlockFeatureSapling(int light) { + public FeatureSaplingBlock(int light) { super(FabricBlockSettings.of(Material.PLANT) .breakByHand(true) .collidable(false) diff --git a/src/main/java/ru/betterend/blocks/basis/BlockFur.java b/src/main/java/ru/betterend/blocks/basis/FurBlock.java similarity index 91% rename from src/main/java/ru/betterend/blocks/basis/BlockFur.java rename to src/main/java/ru/betterend/blocks/basis/FurBlock.java index 232b749f..4ccd3462 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockFur.java +++ b/src/main/java/ru/betterend/blocks/basis/FurBlock.java @@ -27,12 +27,12 @@ import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.util.MHelper; -public class BlockFur extends BlockAttached implements IRenderTypeable { +public class FurBlock extends AttachedBlock implements IRenderTypeable { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); private final ItemConvertible drop; private final int dropChance; - public BlockFur(ItemConvertible drop, int light, int dropChance) { + public FurBlock(ItemConvertible drop, int light, int dropChance) { super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT) .breakByTool(FabricToolTags.SHEARS) .sounds(BlockSoundGroup.WET_GRASS) @@ -43,7 +43,7 @@ public class BlockFur extends BlockAttached implements IRenderTypeable { this.dropChance = dropChance; } - public BlockFur(ItemConvertible drop, int dropChance) { + public FurBlock(ItemConvertible drop, int dropChance) { super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT) .breakByTool(FabricToolTags.SHEARS) .sounds(BlockSoundGroup.WET_GRASS) diff --git a/src/main/java/ru/betterend/blocks/basis/BlockPedestal.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java similarity index 92% rename from src/main/java/ru/betterend/blocks/basis/BlockPedestal.java rename to src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index ad05a8f6..2214bf40 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockPedestal.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -43,7 +43,7 @@ import ru.betterend.patterns.Patterns; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; -public class BlockPedestal extends BlockBaseNotFull implements BlockEntityProvider { +public class PedestalBlock extends BaseBlockNotFull implements BlockEntityProvider { public final static EnumProperty STATE = BlockProperties.PEDESTAL_STATE; public static final BooleanProperty HAS_ITEM = BlockProperties.HAS_ITEM; public static final BooleanProperty HAS_LIGHT = BlockProperties.HAS_LIGHT; @@ -64,7 +64,7 @@ public class BlockPedestal extends BlockBaseNotFull implements BlockEntityProvid * @return new Pedestal block with Better End id. */ public static Block registerPedestal(String name, Block source) { - return EndBlocks.registerBlock(name, new BlockPedestal(source)); + return EndBlocks.registerBlock(name, new PedestalBlock(source)); } /** @@ -76,13 +76,13 @@ public class BlockPedestal extends BlockBaseNotFull implements BlockEntityProvid * @return new Pedestal block with specified id. */ public static Block registerPedestal(Identifier id, Block source) { - return EndBlocks.registerBlock(id, new BlockPedestal(source)); + return EndBlocks.registerBlock(id, new PedestalBlock(source)); } protected final Block parent; protected float height = 1.0F; - public BlockPedestal(Block parent) { + public PedestalBlock(Block parent) { super(FabricBlockSettings.copyOf(parent).luminance(state -> { return state.get(HAS_LIGHT) ? 12 : 0; })); @@ -91,7 +91,7 @@ public class BlockPedestal extends BlockBaseNotFull implements BlockEntityProvid } public float getHeight(BlockState state) { - if (state.getBlock() instanceof BlockPedestal && state.get(STATE) == PedestalState.PEDESTAL_TOP) { + if (state.getBlock() instanceof PedestalBlock && state.get(STATE) == PedestalState.PEDESTAL_TOP) { return this.height - 0.2F; } return this.height; @@ -131,8 +131,8 @@ public class BlockPedestal extends BlockBaseNotFull implements BlockEntityProvid BlockState upState = world.getBlockState(pos.up()); BlockState downState = world.getBlockState(pos.down()); boolean upSideSolid = upState.isSideSolidFullSquare(world, pos.up(), Direction.DOWN) || upState.isIn(BlockTags.WALLS); - boolean hasPedestalOver = upState.getBlock() instanceof BlockPedestal; - boolean hasPedestalUnder = downState.getBlock() instanceof BlockPedestal; + boolean hasPedestalOver = upState.getBlock() instanceof PedestalBlock; + boolean hasPedestalUnder = downState.getBlock() instanceof PedestalBlock; if (!hasPedestalOver && hasPedestalUnder && upSideSolid) { return this.getDefaultState().with(STATE, PedestalState.COLUMN_TOP); } else if (!hasPedestalOver && !hasPedestalUnder && upSideSolid) { @@ -163,13 +163,13 @@ public class BlockPedestal extends BlockBaseNotFull implements BlockEntityProvid BlockState upState = world.getBlockState(pos.up()); BlockState downState = world.getBlockState(pos.down()); boolean upSideSolid = upState.isSideSolidFullSquare(world, pos.up(), Direction.DOWN) || upState.isIn(BlockTags.WALLS); - boolean hasPedestalOver = upState.getBlock() instanceof BlockPedestal; - boolean hasPedestalUnder = downState.getBlock() instanceof BlockPedestal; + boolean hasPedestalOver = upState.getBlock() instanceof PedestalBlock; + boolean hasPedestalUnder = downState.getBlock() instanceof PedestalBlock; if (direction == Direction.UP) { upSideSolid = newState.isSideSolidFullSquare(world, posFrom, Direction.DOWN) || newState.isIn(BlockTags.WALLS); - hasPedestalOver = newState.getBlock() instanceof BlockPedestal; + hasPedestalOver = newState.getBlock() instanceof PedestalBlock; } else if (direction == Direction.DOWN) { - hasPedestalUnder = newState.getBlock() instanceof BlockPedestal; + hasPedestalUnder = newState.getBlock() instanceof PedestalBlock; } if (!hasPedestalOver && hasPedestalUnder && upSideSolid) { return state.with(STATE, PedestalState.COLUMN_TOP); @@ -309,7 +309,7 @@ public class BlockPedestal extends BlockBaseNotFull implements BlockEntityProvid @Override public boolean hasComparatorOutput(BlockState state) { - return state.getBlock() instanceof BlockPedestal; + return state.getBlock() instanceof PedestalBlock; } @Override diff --git a/src/main/java/ru/betterend/blocks/basis/BlockPlantWithAge.java b/src/main/java/ru/betterend/blocks/basis/PlantWithAgeBlock.java similarity index 88% rename from src/main/java/ru/betterend/blocks/basis/BlockPlantWithAge.java rename to src/main/java/ru/betterend/blocks/basis/PlantWithAgeBlock.java index 2d13df0d..06047606 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockPlantWithAge.java +++ b/src/main/java/ru/betterend/blocks/basis/PlantWithAgeBlock.java @@ -14,10 +14,10 @@ import net.minecraft.state.property.IntProperty; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; -public abstract class BlockPlantWithAge extends BlockPlant { +public abstract class PlantWithAgeBlock extends EndPlantBlock { public static final IntProperty AGE = IntProperty.of("age", 0, 3); - public BlockPlantWithAge() { + public PlantWithAgeBlock() { this(FabricBlockSettings.of(Material.PLANT) .breakByTool(FabricToolTags.SHEARS) .sounds(BlockSoundGroup.GRASS) @@ -26,7 +26,7 @@ public abstract class BlockPlantWithAge extends BlockPlant { .noCollision()); } - public BlockPlantWithAge(FabricBlockSettings settings) { + public PlantWithAgeBlock(FabricBlockSettings settings) { super(settings); } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockSimpleLeaves.java b/src/main/java/ru/betterend/blocks/basis/SimpleLeavesBlock.java similarity index 88% rename from src/main/java/ru/betterend/blocks/basis/BlockSimpleLeaves.java rename to src/main/java/ru/betterend/blocks/basis/SimpleLeavesBlock.java index fa5bd33f..4161584a 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockSimpleLeaves.java +++ b/src/main/java/ru/betterend/blocks/basis/SimpleLeavesBlock.java @@ -12,8 +12,8 @@ import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.Patterns; -public class BlockSimpleLeaves extends BlockBaseNotFull implements IRenderTypeable { - public BlockSimpleLeaves(MaterialColor color) { +public class SimpleLeavesBlock extends BaseBlockNotFull implements IRenderTypeable { + public SimpleLeavesBlock(MaterialColor color) { super(FabricBlockSettings.of(Material.LEAVES) .strength(0.2F) .sounds(BlockSoundGroup.GRASS) @@ -24,7 +24,7 @@ public class BlockSimpleLeaves extends BlockBaseNotFull implements IRenderTypeab .materialColor(color)); } - public BlockSimpleLeaves(MaterialColor color, int light) { + public SimpleLeavesBlock(MaterialColor color, int light) { super(FabricBlockSettings.of(Material.LEAVES) .strength(0.2F) .sounds(BlockSoundGroup.GRASS) diff --git a/src/main/java/ru/betterend/blocks/basis/BlockStoneLantern.java b/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java similarity index 92% rename from src/main/java/ru/betterend/blocks/basis/BlockStoneLantern.java rename to src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java index f5c61f1c..4eb82d08 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockStoneLantern.java +++ b/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java @@ -20,12 +20,12 @@ import ru.betterend.interfaces.IColorProvider; import ru.betterend.patterns.Patterns; import ru.betterend.util.MHelper; -public class BlockStoneLantern extends BlockLantern implements IColorProvider { +public class StoneLanternBlock extends EndLanternBlock implements IColorProvider { private static final VoxelShape SHAPE_CEIL = Block.createCuboidShape(3, 1, 3, 13, 16, 13); private static final VoxelShape SHAPE_FLOOR = Block.createCuboidShape(3, 0, 3, 13, 15, 13); private static final Vec3i[] COLORS = AuroraCrystalBlock.COLORS; - public BlockStoneLantern(Block source) { + public StoneLanternBlock(Block source) { super(FabricBlockSettings.copyOf(source).luminance(15)); } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockLogStripable.java b/src/main/java/ru/betterend/blocks/basis/StrippableBarkBlock.java similarity index 90% rename from src/main/java/ru/betterend/blocks/basis/BlockLogStripable.java rename to src/main/java/ru/betterend/blocks/basis/StrippableBarkBlock.java index 11f90960..32d651a4 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockLogStripable.java +++ b/src/main/java/ru/betterend/blocks/basis/StrippableBarkBlock.java @@ -16,10 +16,10 @@ import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -public class BlockLogStripable extends BlockPillar { +public class StrippableBarkBlock extends BarkBlock { private final Block striped; - public BlockLogStripable(MaterialColor color, Block striped) { + public StrippableBarkBlock(MaterialColor color, Block striped) { super(FabricBlockSettings.copyOf(striped).materialColor(color)); this.striped = striped; } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockUnderwaterPlant.java b/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantBlock.java similarity index 93% rename from src/main/java/ru/betterend/blocks/basis/BlockUnderwaterPlant.java rename to src/main/java/ru/betterend/blocks/basis/UnderwaterPlantBlock.java index 4c549a74..085118e7 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockUnderwaterPlant.java +++ b/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantBlock.java @@ -39,10 +39,10 @@ import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; -public class BlockUnderwaterPlant extends BlockBaseNotFull implements IRenderTypeable, Fertilizable, FluidFillable { +public class UnderwaterPlantBlock extends BaseBlockNotFull implements IRenderTypeable, Fertilizable, FluidFillable { private static final VoxelShape SHAPE = Block.createCuboidShape(4, 0, 4, 12, 14, 12); - public BlockUnderwaterPlant() { + public UnderwaterPlantBlock() { super(FabricBlockSettings.of(Material.UNDERWATER_PLANT) .breakByTool(FabricToolTags.SHEARS) .sounds(BlockSoundGroup.WET_GRASS) @@ -50,7 +50,7 @@ public class BlockUnderwaterPlant extends BlockBaseNotFull implements IRenderTyp .noCollision()); } - public BlockUnderwaterPlant(int light) { + public UnderwaterPlantBlock(int light) { super(FabricBlockSettings.of(Material.UNDERWATER_PLANT) .breakByTool(FabricToolTags.SHEARS) .sounds(BlockSoundGroup.WET_GRASS) @@ -59,7 +59,7 @@ public class BlockUnderwaterPlant extends BlockBaseNotFull implements IRenderTyp .noCollision()); } - public BlockUnderwaterPlant(Settings settings) { + public UnderwaterPlantBlock(Settings settings) { super(settings); } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockUnderwaterPlantWithAge.java b/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantWithAgeBlock.java similarity index 90% rename from src/main/java/ru/betterend/blocks/basis/BlockUnderwaterPlantWithAge.java rename to src/main/java/ru/betterend/blocks/basis/UnderwaterPlantWithAgeBlock.java index df166e16..363bad5e 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockUnderwaterPlantWithAge.java +++ b/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantWithAgeBlock.java @@ -14,10 +14,10 @@ import net.minecraft.state.property.IntProperty; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; -public abstract class BlockUnderwaterPlantWithAge extends BlockUnderwaterPlant { +public abstract class UnderwaterPlantWithAgeBlock extends UnderwaterPlantBlock { public static final IntProperty AGE = IntProperty.of("age", 0, 3); - public BlockUnderwaterPlantWithAge() { + public UnderwaterPlantWithAgeBlock() { super(FabricBlockSettings.of(Material.UNDERWATER_PLANT) .breakByTool(FabricToolTags.SHEARS) .sounds(BlockSoundGroup.WET_GRASS) diff --git a/src/main/java/ru/betterend/blocks/basis/BlockUpDownPlant.java b/src/main/java/ru/betterend/blocks/basis/UpDownPlantBlock.java similarity index 94% rename from src/main/java/ru/betterend/blocks/basis/BlockUpDownPlant.java rename to src/main/java/ru/betterend/blocks/basis/UpDownPlantBlock.java index b66f805d..d7778163 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockUpDownPlant.java +++ b/src/main/java/ru/betterend/blocks/basis/UpDownPlantBlock.java @@ -30,10 +30,10 @@ import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndTags; -public class BlockUpDownPlant extends BlockBaseNotFull implements IRenderTypeable { +public class UpDownPlantBlock extends BaseBlockNotFull implements IRenderTypeable { private static final VoxelShape SHAPE = Block.createCuboidShape(4, 0, 4, 12, 16, 12); - public BlockUpDownPlant() { + public UpDownPlantBlock() { super(FabricBlockSettings.of(Material.PLANT) .breakByTool(FabricToolTags.SHEARS) .sounds(BlockSoundGroup.GRASS) diff --git a/src/main/java/ru/betterend/blocks/basis/BlockVine.java b/src/main/java/ru/betterend/blocks/basis/VineBlock.java similarity index 93% rename from src/main/java/ru/betterend/blocks/basis/BlockVine.java rename to src/main/java/ru/betterend/blocks/basis/VineBlock.java index 5ff39c4b..e6360b4d 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockVine.java +++ b/src/main/java/ru/betterend/blocks/basis/VineBlock.java @@ -38,19 +38,19 @@ import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.util.BlocksHelper; -public class BlockVine extends BlockBaseNotFull implements IRenderTypeable, Fertilizable { +public class VineBlock extends BaseBlockNotFull implements IRenderTypeable, Fertilizable { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; private static final VoxelShape VOXEL_SHAPE = Block.createCuboidShape(2, 0, 2, 14, 16, 14); - public BlockVine() { + public VineBlock() { this(0, false); } - public BlockVine(int light) { + public VineBlock(int light) { this(light, false); } - public BlockVine(int light, boolean bottomOnly) { + public VineBlock(int light, boolean bottomOnly) { super(FabricBlockSettings.of(Material.PLANT) .breakByTool(FabricToolTags.SHEARS) .sounds(BlockSoundGroup.GRASS) diff --git a/src/main/java/ru/betterend/blocks/basis/BlockWallMushroom.java b/src/main/java/ru/betterend/blocks/basis/WallMushroomBlock.java similarity index 89% rename from src/main/java/ru/betterend/blocks/basis/BlockWallMushroom.java rename to src/main/java/ru/betterend/blocks/basis/WallMushroomBlock.java index b2580ad7..8a3f7c87 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockWallMushroom.java +++ b/src/main/java/ru/betterend/blocks/basis/WallMushroomBlock.java @@ -15,8 +15,8 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.WorldView; -public class BlockWallMushroom extends BlockWallPlant { - public BlockWallMushroom(int light) { +public class WallMushroomBlock extends EndWallPlantBlock { + public WallMushroomBlock(int light) { super(FabricBlockSettings.of(Material.PLANT) .breakByTool(FabricToolTags.AXES) .sounds(BlockSoundGroup.GRASS) diff --git a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java index b3d05665..ffb43ed3 100644 --- a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java @@ -7,14 +7,14 @@ import net.minecraft.block.MaterialColor; import net.minecraft.tag.BlockTags; import net.minecraft.tag.ItemTags; import ru.betterend.blocks.EndPedestal; -import ru.betterend.blocks.basis.BlockBase; -import ru.betterend.blocks.basis.BlockPillar; -import ru.betterend.blocks.basis.BlockSlab; -import ru.betterend.blocks.basis.BlockStairs; -import ru.betterend.blocks.basis.BlockStoneButton; -import ru.betterend.blocks.basis.BlockStoneLantern; -import ru.betterend.blocks.basis.BlockStonePressurePlate; -import ru.betterend.blocks.basis.BlockWall; +import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.EndPillarBlock; +import ru.betterend.blocks.basis.EndSlabBlock; +import ru.betterend.blocks.basis.EndStairsBlock; +import ru.betterend.blocks.basis.EndStoneButtonBlock; +import ru.betterend.blocks.basis.StoneLanternBlock; +import ru.betterend.blocks.basis.EndStonelateBlock; +import ru.betterend.blocks.basis.EndWallBlock; import ru.betterend.recipe.CraftingRecipes; import ru.betterend.recipe.builders.GridRecipe; import ru.betterend.registry.EndBlocks; @@ -44,22 +44,22 @@ public class StoneMaterial { public StoneMaterial(String name, MaterialColor color) { FabricBlockSettings material = FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color); - stone = EndBlocks.registerBlock(name, new BlockBase(material)); - polished = EndBlocks.registerBlock(name + "_polished", new BlockBase(material)); - tiles = EndBlocks.registerBlock(name + "_tiles", new BlockBase(material)); - pillar = EndBlocks.registerBlock(name + "_pillar", new BlockPillar(material)); - stairs = EndBlocks.registerBlock(name + "_stairs", new BlockStairs(stone)); - slab = EndBlocks.registerBlock(name + "_slab", new BlockSlab(stone)); - wall = EndBlocks.registerBlock(name + "_wall", new BlockWall(stone)); - button = EndBlocks.registerBlock(name + "_button", new BlockStoneButton(stone)); - pressure_plate = EndBlocks.registerBlock(name + "_plate", new BlockStonePressurePlate(stone)); + stone = EndBlocks.registerBlock(name, new BaseBlock(material)); + polished = EndBlocks.registerBlock(name + "_polished", new BaseBlock(material)); + tiles = EndBlocks.registerBlock(name + "_tiles", new BaseBlock(material)); + pillar = EndBlocks.registerBlock(name + "_pillar", new EndPillarBlock(material)); + stairs = EndBlocks.registerBlock(name + "_stairs", new EndStairsBlock(stone)); + slab = EndBlocks.registerBlock(name + "_slab", new EndSlabBlock(stone)); + wall = EndBlocks.registerBlock(name + "_wall", new EndWallBlock(stone)); + button = EndBlocks.registerBlock(name + "_button", new EndStoneButtonBlock(stone)); + pressure_plate = EndBlocks.registerBlock(name + "_plate", new EndStonelateBlock(stone)); pedestal = EndBlocks.registerBlock(name + "_pedestal", new EndPedestal(stone)); - lantern = EndBlocks.registerBlock(name + "_lantern", new BlockStoneLantern(stone)); + lantern = EndBlocks.registerBlock(name + "_lantern", new StoneLanternBlock(stone)); - bricks = EndBlocks.registerBlock(name + "_bricks", new BlockBase(material)); - brick_stairs = EndBlocks.registerBlock(name + "_bricks_stairs", new BlockStairs(bricks)); - brick_slab = EndBlocks.registerBlock(name + "_bricks_slab", new BlockSlab(bricks)); - brick_wall = EndBlocks.registerBlock(name + "_bricks_wall", new BlockWall(bricks)); + bricks = EndBlocks.registerBlock(name + "_bricks", new BaseBlock(material)); + brick_stairs = EndBlocks.registerBlock(name + "_bricks_stairs", new EndStairsBlock(bricks)); + brick_slab = EndBlocks.registerBlock(name + "_bricks_slab", new EndSlabBlock(bricks)); + brick_wall = EndBlocks.registerBlock(name + "_bricks_wall", new EndWallBlock(bricks)); // Recipes // GridRecipe.make(name + "_bricks", bricks).setOutputCount(4).setShape("##", "##").addMaterial('#', stone).setGroup("end_bricks").build(); diff --git a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java index 520b6b1b..28c2c031 100644 --- a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java @@ -10,26 +10,26 @@ import net.minecraft.item.Items; import net.minecraft.tag.BlockTags; import net.minecraft.tag.ItemTags; import net.minecraft.tag.Tag; -import ru.betterend.blocks.basis.BlockBark; -import ru.betterend.blocks.basis.BlockBarkStripable; -import ru.betterend.blocks.basis.BlockBarrel; -import ru.betterend.blocks.basis.BlockBase; -import ru.betterend.blocks.basis.BlockBookshelf; -import ru.betterend.blocks.basis.BlockChest; -import ru.betterend.blocks.basis.BlockComposter; -import ru.betterend.blocks.basis.BlockCraftingTable; -import ru.betterend.blocks.basis.BlockDoor; -import ru.betterend.blocks.basis.BlockFence; -import ru.betterend.blocks.basis.BlockGate; -import ru.betterend.blocks.basis.BlockLadder; -import ru.betterend.blocks.basis.BlockLogStripable; -import ru.betterend.blocks.basis.BlockPillar; -import ru.betterend.blocks.basis.BlockPressurePlate; -import ru.betterend.blocks.basis.BlockSign; -import ru.betterend.blocks.basis.BlockSlab; -import ru.betterend.blocks.basis.BlockStairs; -import ru.betterend.blocks.basis.BlockTrapdoor; -import ru.betterend.blocks.basis.BlockWoodenButton; +import ru.betterend.blocks.basis.BarkBlock; +import ru.betterend.blocks.basis.StrippableBarkBlock; +import ru.betterend.blocks.basis.EndBarrelBlock; +import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.EndBookshelfBlock; +import ru.betterend.blocks.basis.EndChestBlock; +import ru.betterend.blocks.basis.EndComposterBlock; +import ru.betterend.blocks.basis.EndCraftingTableBlock; +import ru.betterend.blocks.basis.EndDoorBlock; +import ru.betterend.blocks.basis.EndFenceBlock; +import ru.betterend.blocks.basis.EndGateBlock; +import ru.betterend.blocks.basis.EndLadderBlock; +import ru.betterend.blocks.basis.EndBlockStripableLogLog; +import ru.betterend.blocks.basis.EndPillarBlock; +import ru.betterend.blocks.basis.EndPlateBlock; +import ru.betterend.blocks.basis.EndSignBlock; +import ru.betterend.blocks.basis.EndSlabBlock; +import ru.betterend.blocks.basis.EndStairsBlock; +import ru.betterend.blocks.basis.EndTrapdoorBlock; +import ru.betterend.blocks.basis.EndWoodenButtonBlock; import ru.betterend.recipe.builders.GridRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -68,30 +68,30 @@ public class WoodenMaterial { public WoodenMaterial(String name, MaterialColor woodColor, MaterialColor planksColor) { FabricBlockSettings materialPlanks = FabricBlockSettings.copyOf(Blocks.OAK_PLANKS).materialColor(planksColor); - log_stripped = EndBlocks.registerBlock(name + "_stripped_log", new BlockPillar(materialPlanks)); - bark_stripped = EndBlocks.registerBlock(name + "_stripped_bark", new BlockBark(materialPlanks)); + log_stripped = EndBlocks.registerBlock(name + "_stripped_log", new EndPillarBlock(materialPlanks)); + bark_stripped = EndBlocks.registerBlock(name + "_stripped_bark", new BarkBlock(materialPlanks)); - log = EndBlocks.registerBlock(name + "_log", new BlockLogStripable(woodColor, log_stripped)); - bark = EndBlocks.registerBlock(name + "_bark", new BlockBarkStripable(woodColor, bark_stripped)); + log = EndBlocks.registerBlock(name + "_log", new EndBlockStripableLogLog(woodColor, log_stripped)); + bark = EndBlocks.registerBlock(name + "_bark", new StrippableBarkBlock(woodColor, bark_stripped)); - planks = EndBlocks.registerBlock(name + "_planks", new BlockBase(materialPlanks)); - stairs = EndBlocks.registerBlock(name + "_stairs", new BlockStairs(planks)); - slab = EndBlocks.registerBlock(name + "_slab", new BlockSlab(planks)); - fence = EndBlocks.registerBlock(name + "_fence", new BlockFence(planks)); - gate = EndBlocks.registerBlock(name + "_gate", new BlockGate(planks)); - button = EndBlocks.registerBlock(name + "_button", new BlockWoodenButton(planks)); - pressurePlate = EndBlocks.registerBlock(name + "_plate", new BlockPressurePlate(planks)); - trapdoor = EndBlocks.registerBlock(name + "_trapdoor", new BlockTrapdoor(planks)); - door = EndBlocks.registerBlock(name + "_door", new BlockDoor(planks)); + planks = EndBlocks.registerBlock(name + "_planks", new BaseBlock(materialPlanks)); + stairs = EndBlocks.registerBlock(name + "_stairs", new EndStairsBlock(planks)); + slab = EndBlocks.registerBlock(name + "_slab", new EndSlabBlock(planks)); + fence = EndBlocks.registerBlock(name + "_fence", new EndFenceBlock(planks)); + gate = EndBlocks.registerBlock(name + "_gate", new EndGateBlock(planks)); + button = EndBlocks.registerBlock(name + "_button", new EndWoodenButtonBlock(planks)); + pressurePlate = EndBlocks.registerBlock(name + "_plate", new EndPlateBlock(planks)); + trapdoor = EndBlocks.registerBlock(name + "_trapdoor", new EndTrapdoorBlock(planks)); + door = EndBlocks.registerBlock(name + "_door", new EndDoorBlock(planks)); - craftingTable = EndBlocks.registerBlock(name + "_crafting_table", new BlockCraftingTable(planks)); - ladder = EndBlocks.registerBlock(name + "_ladder", new BlockLadder(planks)); - sign = EndBlocks.registerBlock(name + "_sign", new BlockSign(planks)); + craftingTable = EndBlocks.registerBlock(name + "_crafting_table", new EndCraftingTableBlock(planks)); + ladder = EndBlocks.registerBlock(name + "_ladder", new EndLadderBlock(planks)); + sign = EndBlocks.registerBlock(name + "_sign", new EndSignBlock(planks)); - chest = EndBlocks.registerBlock(name + "_chest", new BlockChest(planks)); - barrel = EndBlocks.registerBlock(name + "_barrel", new BlockBarrel(planks)); - shelf = EndBlocks.registerBlock(name + "_bookshelf", new BlockBookshelf(planks)); - composter = EndBlocks.registerBlock(name + "_composter", new BlockComposter(planks)); + chest = EndBlocks.registerBlock(name + "_chest", new EndChestBlock(planks)); + barrel = EndBlocks.registerBlock(name + "_barrel", new EndBarrelBlock(planks)); + shelf = EndBlocks.registerBlock(name + "_bookshelf", new EndBookshelfBlock(planks)); + composter = EndBlocks.registerBlock(name + "_composter", new EndComposterBlock(planks)); // Recipes // GridRecipe.make(name + "_planks", planks).setOutputCount(4).setList("#").addMaterial('#', log, bark, log_stripped, bark_stripped).setGroup("end_planks").build(); diff --git a/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java b/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java index 6508ad28..f8a2eb68 100644 --- a/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java +++ b/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java @@ -4,7 +4,7 @@ import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.particle.ParticleTypes; import net.minecraft.util.Tickable; -import ru.betterend.blocks.BlockHydrothermalVent; +import ru.betterend.blocks.HydrothermalVentBlock; import ru.betterend.registry.EndBlockEntities; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndParticles; @@ -21,8 +21,8 @@ public class BlockEntityHydrothermalVent extends BlockEntity implements Tickable double y = pos.getY() + 0.9 + world.random.nextDouble() * 0.3; double z = pos.getZ() + world.random.nextDouble(); BlockState state = getCachedState(); - if (state.isOf(EndBlocks.HYDROTHERMAL_VENT) && state.get(BlockHydrothermalVent.ACTIVATED)) { - if (state.get(BlockHydrothermalVent.WATERLOGGED)) { + if (state.isOf(EndBlocks.HYDROTHERMAL_VENT) && state.get(HydrothermalVentBlock.ACTIVATED)) { + if (state.get(HydrothermalVentBlock.WATERLOGGED)) { world.addParticle(EndParticles.GEYSER_PARTICLE, x, y, z, 0, 0, 0); } else { diff --git a/src/main/java/ru/betterend/blocks/entities/EBarrelBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EBarrelBlockEntity.java index 6963f28c..ac9a35c2 100644 --- a/src/main/java/ru/betterend/blocks/entities/EBarrelBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EBarrelBlockEntity.java @@ -20,7 +20,7 @@ import net.minecraft.text.TranslatableText; import net.minecraft.util.collection.DefaultedList; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Vec3i; -import ru.betterend.blocks.basis.BlockBarrel; +import ru.betterend.blocks.basis.EndBarrelBlock; import ru.betterend.registry.EndBlockEntities; public class EBarrelBlockEntity extends LootableContainerBlockEntity { @@ -104,7 +104,7 @@ public class EBarrelBlockEntity extends LootableContainerBlockEntity { this.scheduleUpdate(); } else { BlockState blockState = this.getCachedState(); - if (!(blockState.getBlock() instanceof BlockBarrel)) { + if (!(blockState.getBlock() instanceof EndBarrelBlock)) { this.markRemoved(); return; } diff --git a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java index ead5d5b3..a731227a 100644 --- a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java @@ -10,7 +10,7 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket; import net.minecraft.util.Tickable; import net.minecraft.world.World; -import ru.betterend.blocks.basis.BlockPedestal; +import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.registry.EndBlockEntities; import ru.betterend.registry.EndItems; @@ -76,8 +76,8 @@ public class PedestalBlockEntity extends BlockEntity implements Inventory, Ticka } public void removeStack(World world, BlockState state) { - world.setBlockState(pos, state.with(BlockPedestal.HAS_ITEM, false) - .with(BlockPedestal.HAS_LIGHT, false)); + world.setBlockState(pos, state.with(PedestalBlock.HAS_ITEM, false) + .with(PedestalBlock.HAS_LIGHT, false)); this.removeStack(0); } @@ -91,12 +91,12 @@ public class PedestalBlockEntity extends BlockEntity implements Inventory, Ticka public void markDirty() { if (world != null && !world.isClient) { BlockState state = world.getBlockState(pos); - if (state.getBlock() instanceof BlockPedestal) { - state = state.with(BlockPedestal.HAS_ITEM, !isEmpty()); + if (state.getBlock() instanceof PedestalBlock) { + state = state.with(PedestalBlock.HAS_ITEM, !isEmpty()); if (activeItem.getItem() == EndItems.ETERNAL_CRYSTAL) { - state = state.with(BlockPedestal.HAS_LIGHT, true); + state = state.with(PedestalBlock.HAS_LIGHT, true); } else { - state = state.with(BlockPedestal.HAS_LIGHT, false); + state = state.with(PedestalBlock.HAS_LIGHT, false); } world.setBlockState(pos, state); } diff --git a/src/main/java/ru/betterend/blocks/entities/render/EndChestBlockEntityRenderer.java b/src/main/java/ru/betterend/blocks/entities/render/EndChestBlockEntityRenderer.java index 3b230002..2fdfed01 100644 --- a/src/main/java/ru/betterend/blocks/entities/render/EndChestBlockEntityRenderer.java +++ b/src/main/java/ru/betterend/blocks/entities/render/EndChestBlockEntityRenderer.java @@ -31,7 +31,7 @@ import net.minecraft.util.math.Direction; import net.minecraft.util.registry.Registry; import net.minecraft.world.World; import ru.betterend.BetterEnd; -import ru.betterend.blocks.basis.BlockChest; +import ru.betterend.blocks.basis.EndChestBlock; import ru.betterend.blocks.entities.EChestBlockEntity; import ru.betterend.registry.EndItems; @@ -165,7 +165,7 @@ public class EndChestBlockEntityRenderer extends BlockEntityRenderer { if (item instanceof BlockItem) { Block block = ((BlockItem) item).getBlock(); - if (block instanceof BlockChest) { + if (block instanceof EndChestBlock) { String name = Registry.BLOCK.getId(block).getPath(); LAYERS.put(block, new RenderLayer[] { RenderLayer.getEntityCutout(BetterEnd.makeID("textures/entity/chest/" + name + ".png")), diff --git a/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java b/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java index 00b96787..10507336 100644 --- a/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java +++ b/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java @@ -28,7 +28,7 @@ import net.minecraft.util.Identifier; import net.minecraft.util.SignType; import net.minecraft.util.registry.Registry; import ru.betterend.BetterEnd; -import ru.betterend.blocks.basis.BlockSign; +import ru.betterend.blocks.basis.EndSignBlock; import ru.betterend.blocks.entities.ESignBlockEntity; import ru.betterend.registry.EndItems; @@ -50,7 +50,7 @@ public class EndSignBlockEntityRenderer extends BlockEntityRenderer { if (item instanceof BlockItem) { Block block = ((BlockItem) item).getBlock(); - if (block instanceof BlockSign) { + if (block instanceof EndSignBlock) { String name = Registry.BLOCK.getId(block).getPath(); RenderLayer layer = RenderLayer.getEntitySolid(BetterEnd.makeID("textures/entity/sign/" + name + ".png")); LAYERS.put(block, layer); diff --git a/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java b/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java index e65761ca..19ca2f88 100644 --- a/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java +++ b/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java @@ -16,7 +16,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.util.math.MathHelper; import ru.betterend.blocks.EternalPedestal; -import ru.betterend.blocks.basis.BlockPedestal; +import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.entities.PedestalBlockEntity; import ru.betterend.client.render.BeamRenderer; import ru.betterend.client.render.EndCrystalRenderer; @@ -38,14 +38,14 @@ public class PedestalItemRenderer extends BlockEn if (blockEntity.isEmpty()) return; BlockState state = blockEntity.getWorld().getBlockState(blockEntity.getPos()); - if (!(state.getBlock() instanceof BlockPedestal)) return; + if (!(state.getBlock() instanceof PedestalBlock)) return; ItemStack activeItem = blockEntity.getStack(0); matrices.push(); MinecraftClient minecraft = MinecraftClient.getInstance(); BakedModel model = minecraft.getItemRenderer().getHeldItemModel(activeItem, blockEntity.getWorld(), null); Vector3f translate = model.getTransformation().ground.translation; - BlockPedestal pedestal = (BlockPedestal) state.getBlock(); + PedestalBlock pedestal = (PedestalBlock) state.getBlock(); matrices.translate(translate.getX(), translate.getY(), translate.getZ()); matrices.translate(0.5, pedestal.getHeight(state), 0.5); if (activeItem.getItem() instanceof BlockItem) { diff --git a/src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java b/src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java index 46eddd32..bc394dba 100644 --- a/src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java +++ b/src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java @@ -29,7 +29,7 @@ import net.minecraft.text.LiteralText; import net.minecraft.text.TranslatableText; import net.minecraft.util.Util; import net.minecraft.util.math.Matrix4f; -import ru.betterend.blocks.basis.BlockSign; +import ru.betterend.blocks.basis.EndSignBlock; import ru.betterend.blocks.entities.ESignBlockEntity; import ru.betterend.blocks.entities.render.EndSignBlockEntityRenderer; @@ -124,7 +124,7 @@ public class BlockSignEditScreen extends Screen { matrices.scale(93.75F, -93.75F, 93.75F); matrices.translate(0.0D, -1.3125D, 0.0D); BlockState blockState = this.sign.getCachedState(); - boolean bl = blockState.get(BlockSign.FLOOR); + boolean bl = blockState.get(EndSignBlock.FLOOR); if (!bl) { matrices.translate(0.0D, -0.3125D, 0.0D); diff --git a/src/main/java/ru/betterend/integration/byg/BYGBlocks.java b/src/main/java/ru/betterend/integration/byg/BYGBlocks.java index bb811560..93e16e8c 100644 --- a/src/main/java/ru/betterend/integration/byg/BYGBlocks.java +++ b/src/main/java/ru/betterend/integration/byg/BYGBlocks.java @@ -1,13 +1,13 @@ package ru.betterend.integration.byg; import net.minecraft.block.Block; -import ru.betterend.blocks.basis.BlockVine; -import ru.betterend.blocks.basis.BlockWallPlant; +import ru.betterend.blocks.basis.VineBlock; +import ru.betterend.blocks.basis.EndWallPlantBlock; import ru.betterend.registry.EndBlocks; public class BYGBlocks { - public static final Block IVIS_MOSS = EndBlocks.registerBlock("ivis_moss", new BlockWallPlant()); - public static final Block IVIS_VINE = EndBlocks.registerBlock("ivis_vine", new BlockVine()); + public static final Block IVIS_MOSS = EndBlocks.registerBlock("ivis_moss", new EndWallPlantBlock()); + public static final Block IVIS_VINE = EndBlocks.registerBlock("ivis_vine", new VineBlock()); public static void register() {} } diff --git a/src/main/java/ru/betterend/registry/EndBlockEntities.java b/src/main/java/ru/betterend/registry/EndBlockEntities.java index 38e9f40c..47fb5a14 100644 --- a/src/main/java/ru/betterend/registry/EndBlockEntities.java +++ b/src/main/java/ru/betterend/registry/EndBlockEntities.java @@ -13,10 +13,10 @@ import ru.betterend.BetterEnd; import ru.betterend.blocks.EndStoneSmelter; import ru.betterend.blocks.EternalPedestal; import ru.betterend.blocks.InfusionPedestal; -import ru.betterend.blocks.basis.BlockBarrel; -import ru.betterend.blocks.basis.BlockChest; -import ru.betterend.blocks.basis.BlockPedestal; -import ru.betterend.blocks.basis.BlockSign; +import ru.betterend.blocks.basis.EndBarrelBlock; +import ru.betterend.blocks.basis.EndChestBlock; +import ru.betterend.blocks.basis.PedestalBlock; +import ru.betterend.blocks.basis.EndSignBlock; import ru.betterend.blocks.entities.BlockEntityHydrothermalVent; import ru.betterend.blocks.entities.EBarrelBlockEntity; import ru.betterend.blocks.entities.EChestBlockEntity; @@ -55,7 +55,7 @@ public class EndBlockEntities { EndItems.getModBlocks().forEach((item) -> { if (item instanceof BlockItem) { Block block = ((BlockItem) item).getBlock(); - if (block instanceof BlockChest) { + if (block instanceof EndChestBlock) { result.add(block); } } @@ -68,7 +68,7 @@ public class EndBlockEntities { EndItems.getModBlocks().forEach((item) -> { if (item instanceof BlockItem) { Block block = ((BlockItem) item).getBlock(); - if (block instanceof BlockBarrel) { + if (block instanceof EndBarrelBlock) { result.add(block); } } @@ -81,7 +81,7 @@ public class EndBlockEntities { EndItems.getModBlocks().forEach((item) -> { if (item instanceof BlockItem) { Block block = ((BlockItem) item).getBlock(); - if (block instanceof BlockSign) { + if (block instanceof EndSignBlock) { result.add(block); } } @@ -96,7 +96,7 @@ public class EndBlockEntities { Block block = ((BlockItem) item).getBlock(); if (block instanceof EternalPedestal || block instanceof InfusionPedestal) return; - if (block instanceof BlockPedestal) { + if (block instanceof PedestalBlock) { result.add(block); } } diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 68e0a8cb..49c79e41 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -9,71 +9,73 @@ import net.minecraft.util.registry.Registry; import ru.betterend.BetterEnd; import ru.betterend.blocks.AeterniumBlock; import ru.betterend.blocks.AuroraCrystalBlock; -import ru.betterend.blocks.BlockAmber; -import ru.betterend.blocks.BlockAncientEmeraldIce; -import ru.betterend.blocks.BlockBlueVine; -import ru.betterend.blocks.BlockBlueVineLantern; -import ru.betterend.blocks.BlockBlueVineSeed; -import ru.betterend.blocks.BlockBrimstone; -import ru.betterend.blocks.BlockBubbleCoral; -import ru.betterend.blocks.BlockBulbVine; -import ru.betterend.blocks.BlockBulbVineSeed; -import ru.betterend.blocks.BlockCharnia; -import ru.betterend.blocks.BlockChorusGrass; -import ru.betterend.blocks.BlockDenseEmeraldIce; -import ru.betterend.blocks.BlockDenseSnow; -import ru.betterend.blocks.BlockDragonTreeSapling; -import ru.betterend.blocks.BlockEmeraldIce; -import ru.betterend.blocks.BlockEndLily; -import ru.betterend.blocks.BlockEndLilySeed; -import ru.betterend.blocks.BlockEndLotusFlower; -import ru.betterend.blocks.BlockEndLotusLeaf; -import ru.betterend.blocks.BlockEndLotusSeed; -import ru.betterend.blocks.BlockEndLotusStem; -import ru.betterend.blocks.BlockEndstoneDust; -import ru.betterend.blocks.BlockGlowingMoss; -import ru.betterend.blocks.BlockGlowingPillarLuminophor; -import ru.betterend.blocks.BlockGlowingPillarRoots; -import ru.betterend.blocks.BlockGlowingPillarSeed; -import ru.betterend.blocks.BlockHelixTreeLeaves; -import ru.betterend.blocks.BlockHelixTreeSapling; -import ru.betterend.blocks.BlockHydralux; -import ru.betterend.blocks.BlockHydraluxPetal; -import ru.betterend.blocks.BlockHydraluxPetalColored; -import ru.betterend.blocks.BlockHydraluxSapling; -import ru.betterend.blocks.BlockHydrothermalVent; -import ru.betterend.blocks.BlockJellyshroomCap; -import ru.betterend.blocks.BlockLacugroveSapling; -import ru.betterend.blocks.BlockLanceleaf; -import ru.betterend.blocks.BlockLanceleafSeed; -import ru.betterend.blocks.BlockMengerSponge; -import ru.betterend.blocks.BlockMengerSpongeWet; -import ru.betterend.blocks.BlockMossyGlowshroomCap; -import ru.betterend.blocks.BlockMossyGlowshroomHymenophore; -import ru.betterend.blocks.BlockMossyGlowshroomSapling; -import ru.betterend.blocks.BlockMurkweed; -import ru.betterend.blocks.BlockNeedlegrass; -import ru.betterend.blocks.BlockPath; -import ru.betterend.blocks.BlockPythadendronSapling; -import ru.betterend.blocks.BlockRespawnObelisk; -import ru.betterend.blocks.BlockShadowBerry; -import ru.betterend.blocks.BlockShadowGrass; -import ru.betterend.blocks.BlockSilkMothNest; -import ru.betterend.blocks.BlockSmallJellyshroom; -import ru.betterend.blocks.BlockSulphurCrystal; -import ru.betterend.blocks.BlockTenaneaFlowers; -import ru.betterend.blocks.BlockTenaneaSapling; -import ru.betterend.blocks.BlockTerrain; -import ru.betterend.blocks.BlockTerrainPlant; -import ru.betterend.blocks.BlockTwistedUmbrellaMoss; -import ru.betterend.blocks.BlockTwistedUmbrellaMossTall; -import ru.betterend.blocks.BlockUmbrellaMoss; -import ru.betterend.blocks.BlockUmbrellaMossTall; -import ru.betterend.blocks.BlockUmbrellaTreeCluster; -import ru.betterend.blocks.BlockUmbrellaTreeClusterEmpty; -import ru.betterend.blocks.BlockUmbrellaTreeMembrane; -import ru.betterend.blocks.BlockUmbrellaTreeSapling; -import ru.betterend.blocks.BlockVentBubbleColumn; +import ru.betterend.blocks.AmberBlock; +import ru.betterend.blocks.AncientEmeraldIceBlock; +import ru.betterend.blocks.BlueVineBlock; +import ru.betterend.blocks.BlueVineLanternBlock; +import ru.betterend.blocks.BlueVineSeedBlock; +import ru.betterend.blocks.BrimstoneBlock; +import ru.betterend.blocks.BubbleCoralBlock; +import ru.betterend.blocks.BulbVineBlock; +import ru.betterend.blocks.BulbVineLanternBlock; +import ru.betterend.blocks.BulbVineLanternColoredBlock; +import ru.betterend.blocks.BulbVineSeedBlock; +import ru.betterend.blocks.CharniaBlock; +import ru.betterend.blocks.ChorusGrassBlock; +import ru.betterend.blocks.DenseEmeraldIceBlock; +import ru.betterend.blocks.DenseSnowBlock; +import ru.betterend.blocks.DragonTreeSaplingBlock; +import ru.betterend.blocks.EmeraldIceBlock; +import ru.betterend.blocks.EndLilyBlock; +import ru.betterend.blocks.EndLilySeedBlock; +import ru.betterend.blocks.EndLotusFlowerBlock; +import ru.betterend.blocks.EndLotusLeafBlock; +import ru.betterend.blocks.EndLotusSeedBlock; +import ru.betterend.blocks.EndLotusStemBlock; +import ru.betterend.blocks.EndstoneDustBlock; +import ru.betterend.blocks.GlowingMossBlock; +import ru.betterend.blocks.GlowingPillarLuminophorBlock; +import ru.betterend.blocks.GlowingPillarRootsBlock; +import ru.betterend.blocks.GlowingPillarSeedBlock; +import ru.betterend.blocks.HelixTreeLeavesBlock; +import ru.betterend.blocks.HelixTreeSaplingBlock; +import ru.betterend.blocks.HydraluxBlock; +import ru.betterend.blocks.HydraluxPetalBlock; +import ru.betterend.blocks.HydraluxPetalColoredBlock; +import ru.betterend.blocks.HydraluxSaplingBlock; +import ru.betterend.blocks.HydrothermalVentBlock; +import ru.betterend.blocks.JellyshroomCapBlock; +import ru.betterend.blocks.LacugroveSaplingBlock; +import ru.betterend.blocks.LanceleafBlock; +import ru.betterend.blocks.LanceleafSeedBlock; +import ru.betterend.blocks.MengerSpongeBlock; +import ru.betterend.blocks.MengerSpongeWetBlock; +import ru.betterend.blocks.MossyGlowshroomCapBlock; +import ru.betterend.blocks.MossyGlowshroomHymenophoreBlock; +import ru.betterend.blocks.MossyGlowshroomSaplingBlock; +import ru.betterend.blocks.MurkweedBlock; +import ru.betterend.blocks.NeedlegrassBlock; +import ru.betterend.blocks.EndPathBlock; +import ru.betterend.blocks.PythadendronSaplingBlock; +import ru.betterend.blocks.RespawnObeliskBlock; +import ru.betterend.blocks.ShadowBerryBlock; +import ru.betterend.blocks.ShadowGrassBlock; +import ru.betterend.blocks.SilkMothNestBlock; +import ru.betterend.blocks.SmallJellyshroomBlock; +import ru.betterend.blocks.SulphurCrystalBlock; +import ru.betterend.blocks.TenaneaFlowersBlock; +import ru.betterend.blocks.TenaneaSaplingBlock; +import ru.betterend.blocks.EndTerrainBlock; +import ru.betterend.blocks.TerrainPlantBlock; +import ru.betterend.blocks.TwistedUmbrellaMossBlock; +import ru.betterend.blocks.TwistedUmbrellaMossTallBlock; +import ru.betterend.blocks.UmbrellaMossBlock; +import ru.betterend.blocks.UmbrellaMossTallBlock; +import ru.betterend.blocks.UmbrellaTreeClusterBlock; +import ru.betterend.blocks.UmbrellaTreeClusterEmptyBlock; +import ru.betterend.blocks.UmbrellaTreeMembraneBlock; +import ru.betterend.blocks.UmbrellaTreeSaplingBlock; +import ru.betterend.blocks.VentBubbleColumnBlock; import ru.betterend.blocks.EndPortalBlock; import ru.betterend.blocks.EndStoneSmelter; import ru.betterend.blocks.EnderBlock; @@ -83,17 +85,15 @@ import ru.betterend.blocks.InfusionPedestal; import ru.betterend.blocks.PedestalVanilla; import ru.betterend.blocks.RunedFlavolite; import ru.betterend.blocks.TerminiteBlock; -import ru.betterend.blocks.basis.BlockBulbVineLantern; -import ru.betterend.blocks.basis.BlockBulbVineLanternColored; -import ru.betterend.blocks.basis.BlockFur; -import ru.betterend.blocks.basis.BlockLeaves; -import ru.betterend.blocks.basis.BlockOre; -import ru.betterend.blocks.basis.BlockSimpleLeaves; -import ru.betterend.blocks.basis.BlockStoneLantern; -import ru.betterend.blocks.basis.BlockUnderwaterWallPlant; -import ru.betterend.blocks.basis.BlockVine; -import ru.betterend.blocks.basis.BlockWallMushroom; -import ru.betterend.blocks.basis.BlockWallPlant; +import ru.betterend.blocks.basis.FurBlock; +import ru.betterend.blocks.basis.EndLeavesBlock; +import ru.betterend.blocks.basis.EndOreBlock; +import ru.betterend.blocks.basis.SimpleLeavesBlock; +import ru.betterend.blocks.basis.StoneLanternBlock; +import ru.betterend.blocks.basis.EndUnderwaterWallPlantBlock; +import ru.betterend.blocks.basis.VineBlock; +import ru.betterend.blocks.basis.WallMushroomBlock; +import ru.betterend.blocks.basis.EndWallPlantBlock; import ru.betterend.blocks.complex.ColoredMaterial; import ru.betterend.blocks.complex.StoneMaterial; import ru.betterend.blocks.complex.WoodenMaterial; @@ -101,34 +101,34 @@ import ru.betterend.config.Configs; public class EndBlocks { // Terrain // - public static final Block ENDSTONE_DUST = registerBlock("endstone_dust", new BlockEndstoneDust()); - public static final Block END_MYCELIUM = registerBlock("end_mycelium", new BlockTerrain(MaterialColor.LIGHT_BLUE)); - public static final Block END_MOSS = registerBlock("end_moss", new BlockTerrain(MaterialColor.CYAN)); - public static final Block CHORUS_NYLIUM = registerBlock("chorus_nylium", new BlockTerrain(MaterialColor.MAGENTA)); - public static final Block CAVE_MOSS = registerBlock("cave_moss", new BlockTerrain(MaterialColor.PURPLE)); - public static final Block CRYSTAL_MOSS = registerBlock("crystal_moss", new BlockTerrain(MaterialColor.PINK)); - public static final Block SHADOW_GRASS = registerBlock("shadow_grass", new BlockShadowGrass()); - public static final Block PINK_MOSS = registerBlock("pink_moss", new BlockTerrain(MaterialColor.PINK)); - public static final Block AMBER_MOSS = registerBlock("amber_moss", new BlockTerrain(MaterialColor.ORANGE)); - public static final Block JUNGLE_MOSS = registerBlock("jungle_moss", new BlockTerrain(MaterialColor.ORANGE)); + public static final Block ENDSTONE_DUST = registerBlock("endstone_dust", new EndstoneDustBlock()); + public static final Block END_MYCELIUM = registerBlock("end_mycelium", new EndTerrainBlock(MaterialColor.LIGHT_BLUE)); + public static final Block END_MOSS = registerBlock("end_moss", new EndTerrainBlock(MaterialColor.CYAN)); + public static final Block CHORUS_NYLIUM = registerBlock("chorus_nylium", new EndTerrainBlock(MaterialColor.MAGENTA)); + public static final Block CAVE_MOSS = registerBlock("cave_moss", new EndTerrainBlock(MaterialColor.PURPLE)); + public static final Block CRYSTAL_MOSS = registerBlock("crystal_moss", new EndTerrainBlock(MaterialColor.PINK)); + public static final Block SHADOW_GRASS = registerBlock("shadow_grass", new ShadowGrassBlock()); + public static final Block PINK_MOSS = registerBlock("pink_moss", new EndTerrainBlock(MaterialColor.PINK)); + public static final Block AMBER_MOSS = registerBlock("amber_moss", new EndTerrainBlock(MaterialColor.ORANGE)); + public static final Block JUNGLE_MOSS = registerBlock("jungle_moss", new EndTerrainBlock(MaterialColor.ORANGE)); // Roads // - public static final Block END_MYCELIUM_PATH = registerBlock("end_mycelium_path", new BlockPath(END_MYCELIUM)); - public static final Block END_MOSS_PATH = registerBlock("end_moss_path", new BlockPath(END_MOSS)); - public static final Block CHORUS_NYLIUM_PATH = registerBlock("chorus_nylium_path", new BlockPath(CHORUS_NYLIUM)); - public static final Block CAVE_MOSS_PATH = registerBlock("cave_moss_path", new BlockPath(CAVE_MOSS)); - public static final Block CRYSTAL_MOSS_PATH = registerBlock("crystal_moss_path", new BlockPath(CRYSTAL_MOSS)); - public static final Block SHADOW_GRASS_PATH = registerBlock("shadow_grass_path", new BlockPath(SHADOW_GRASS)); - public static final Block PINK_MOSS_PATH = registerBlock("pink_moss_path", new BlockPath(PINK_MOSS)); - public static final Block AMBER_MOSS_PATH = registerBlock("amber_moss_path", new BlockPath(AMBER_MOSS)); - public static final Block JUNGLE_MOSS_PATH = registerBlock("jungle_moss_path", new BlockPath(JUNGLE_MOSS)); + public static final Block END_MYCELIUM_PATH = registerBlock("end_mycelium_path", new EndPathBlock(END_MYCELIUM)); + public static final Block END_MOSS_PATH = registerBlock("end_moss_path", new EndPathBlock(END_MOSS)); + public static final Block CHORUS_NYLIUM_PATH = registerBlock("chorus_nylium_path", new EndPathBlock(CHORUS_NYLIUM)); + public static final Block CAVE_MOSS_PATH = registerBlock("cave_moss_path", new EndPathBlock(CAVE_MOSS)); + public static final Block CRYSTAL_MOSS_PATH = registerBlock("crystal_moss_path", new EndPathBlock(CRYSTAL_MOSS)); + public static final Block SHADOW_GRASS_PATH = registerBlock("shadow_grass_path", new EndPathBlock(SHADOW_GRASS)); + public static final Block PINK_MOSS_PATH = registerBlock("pink_moss_path", new EndPathBlock(PINK_MOSS)); + public static final Block AMBER_MOSS_PATH = registerBlock("amber_moss_path", new EndPathBlock(AMBER_MOSS)); + public static final Block JUNGLE_MOSS_PATH = registerBlock("jungle_moss_path", new EndPathBlock(JUNGLE_MOSS)); // Rocks // public static final StoneMaterial FLAVOLITE = new StoneMaterial("flavolite", MaterialColor.SAND); public static final StoneMaterial VIOLECITE = new StoneMaterial("violecite", MaterialColor.PURPLE); public static final StoneMaterial SULPHURIC_ROCK = new StoneMaterial("sulphuric_rock", MaterialColor.BROWN); - public static final Block BRIMSTONE = registerBlock("brimstone", new BlockBrimstone()); - public static final Block SULPHUR_CRYSTAL = registerBlock("sulphur_crystal", new BlockSulphurCrystal()); + public static final Block BRIMSTONE = registerBlock("brimstone", new BrimstoneBlock()); + public static final Block SULPHUR_CRYSTAL = registerBlock("sulphur_crystal", new SulphurCrystalBlock()); public static final Block FLAVOLITE_RUNED = registerBlock("flavolite_runed", new RunedFlavolite()); public static final Block FLAVOLITE_RUNED_ETERNAL = registerBlock("flavolite_runed_eternal", new EternalRunedFlavolite()); @@ -139,157 +139,157 @@ public class EndBlocks { public static final Block QUARTZ_PEDESTAL = registerBlock("quartz_pedestal", new PedestalVanilla(Blocks.QUARTZ_BLOCK)); public static final Block PURPUR_PEDESTAL = registerBlock("purpur_pedestal", new PedestalVanilla(Blocks.PURPUR_BLOCK)); - public static final Block HYDROTHERMAL_VENT = registerBlock("hydrothermal_vent", new BlockHydrothermalVent()); - public static final Block VENT_BUBBLE_COLUMN = registerBlockNI("vent_bubble_column", new BlockVentBubbleColumn()); + public static final Block HYDROTHERMAL_VENT = registerBlock("hydrothermal_vent", new HydrothermalVentBlock()); + public static final Block VENT_BUBBLE_COLUMN = registerBlockNI("vent_bubble_column", new VentBubbleColumnBlock()); - public static final Block DENSE_SNOW = registerBlock("dense_snow", new BlockDenseSnow()); - public static final Block EMERALD_ICE = registerBlock("emerald_ice", new BlockEmeraldIce()); - public static final Block DENSE_EMERALD_ICE = registerBlock("dense_emerald_ice", new BlockDenseEmeraldIce()); - public static final Block ANCIENT_EMERALD_ICE = registerBlock("ancient_emerald_ice", new BlockAncientEmeraldIce()); + public static final Block DENSE_SNOW = registerBlock("dense_snow", new DenseSnowBlock()); + public static final Block EMERALD_ICE = registerBlock("emerald_ice", new EmeraldIceBlock()); + public static final Block DENSE_EMERALD_ICE = registerBlock("dense_emerald_ice", new DenseEmeraldIceBlock()); + public static final Block ANCIENT_EMERALD_ICE = registerBlock("ancient_emerald_ice", new AncientEmeraldIceBlock()); // Wooden Materials And Trees // - public static final Block MOSSY_GLOWSHROOM_SAPLING = registerBlock("mossy_glowshroom_sapling", new BlockMossyGlowshroomSapling()); - public static final Block MOSSY_GLOWSHROOM_CAP = registerBlock("mossy_glowshroom_cap", new BlockMossyGlowshroomCap()); - public static final Block MOSSY_GLOWSHROOM_HYMENOPHORE = registerBlock("mossy_glowshroom_hymenophore", new BlockMossyGlowshroomHymenophore()); - public static final Block MOSSY_GLOWSHROOM_FUR = registerBlock("mossy_glowshroom_fur", new BlockFur(MOSSY_GLOWSHROOM_SAPLING, 15, 16)); + public static final Block MOSSY_GLOWSHROOM_SAPLING = registerBlock("mossy_glowshroom_sapling", new MossyGlowshroomSaplingBlock()); + public static final Block MOSSY_GLOWSHROOM_CAP = registerBlock("mossy_glowshroom_cap", new MossyGlowshroomCapBlock()); + public static final Block MOSSY_GLOWSHROOM_HYMENOPHORE = registerBlock("mossy_glowshroom_hymenophore", new MossyGlowshroomHymenophoreBlock()); + public static final Block MOSSY_GLOWSHROOM_FUR = registerBlock("mossy_glowshroom_fur", new FurBlock(MOSSY_GLOWSHROOM_SAPLING, 15, 16)); public static final WoodenMaterial MOSSY_GLOWSHROOM = new WoodenMaterial("mossy_glowshroom", MaterialColor.GRAY, MaterialColor.WOOD); - public static final Block PYTHADENDRON_SAPLING = registerBlock("pythadendron_sapling", new BlockPythadendronSapling()); - public static final Block PYTHADENDRON_LEAVES = registerBlock("pythadendron_leaves", new BlockLeaves(PYTHADENDRON_SAPLING, MaterialColor.MAGENTA)); + public static final Block PYTHADENDRON_SAPLING = registerBlock("pythadendron_sapling", new PythadendronSaplingBlock()); + public static final Block PYTHADENDRON_LEAVES = registerBlock("pythadendron_leaves", new EndLeavesBlock(PYTHADENDRON_SAPLING, MaterialColor.MAGENTA)); public static final WoodenMaterial PYTHADENDRON = new WoodenMaterial("pythadendron", MaterialColor.MAGENTA, MaterialColor.PURPLE); - public static final Block END_LOTUS_SEED = registerBlock("end_lotus_seed", new BlockEndLotusSeed()); - public static final Block END_LOTUS_STEM = registerBlock("end_lotus_stem", new BlockEndLotusStem()); - public static final Block END_LOTUS_LEAF = registerBlockNI("end_lotus_leaf", new BlockEndLotusLeaf()); - public static final Block END_LOTUS_FLOWER = registerBlockNI("end_lotus_flower", new BlockEndLotusFlower()); + public static final Block END_LOTUS_SEED = registerBlock("end_lotus_seed", new EndLotusSeedBlock()); + public static final Block END_LOTUS_STEM = registerBlock("end_lotus_stem", new EndLotusStemBlock()); + public static final Block END_LOTUS_LEAF = registerBlockNI("end_lotus_leaf", new EndLotusLeafBlock()); + public static final Block END_LOTUS_FLOWER = registerBlockNI("end_lotus_flower", new EndLotusFlowerBlock()); public static final WoodenMaterial END_LOTUS = new WoodenMaterial("end_lotus", MaterialColor.LIGHT_BLUE, MaterialColor.CYAN); - public static final Block LACUGROVE_SAPLING = registerBlock("lacugrove_sapling", new BlockLacugroveSapling()); - public static final Block LACUGROVE_LEAVES = registerBlock("lacugrove_leaves", new BlockLeaves(LACUGROVE_SAPLING, MaterialColor.CYAN)); + public static final Block LACUGROVE_SAPLING = registerBlock("lacugrove_sapling", new LacugroveSaplingBlock()); + public static final Block LACUGROVE_LEAVES = registerBlock("lacugrove_leaves", new EndLeavesBlock(LACUGROVE_SAPLING, MaterialColor.CYAN)); public static final WoodenMaterial LACUGROVE = new WoodenMaterial("lacugrove", MaterialColor.BROWN, MaterialColor.YELLOW); - public static final Block DRAGON_TREE_SAPLING = registerBlock("dragon_tree_sapling", new BlockDragonTreeSapling()); - public static final Block DRAGON_TREE_LEAVES = registerBlock("dragon_tree_leaves", new BlockLeaves(DRAGON_TREE_SAPLING, MaterialColor.MAGENTA)); + public static final Block DRAGON_TREE_SAPLING = registerBlock("dragon_tree_sapling", new DragonTreeSaplingBlock()); + public static final Block DRAGON_TREE_LEAVES = registerBlock("dragon_tree_leaves", new EndLeavesBlock(DRAGON_TREE_SAPLING, MaterialColor.MAGENTA)); public static final WoodenMaterial DRAGON_TREE = new WoodenMaterial("dragon_tree", MaterialColor.BLACK, MaterialColor.MAGENTA); - public static final Block TENANEA_SAPLING = registerBlock("tenanea_sapling", new BlockTenaneaSapling()); - public static final Block TENANEA_LEAVES = registerBlock("tenanea_leaves", new BlockLeaves(TENANEA_SAPLING, MaterialColor.PINK)); - public static final Block TENANEA_FLOWERS = registerBlock("tenanea_flowers", new BlockTenaneaFlowers()); - public static final Block TENANEA_OUTER_LEAVES = registerBlock("tenanea_outer_leaves", new BlockFur(TENANEA_SAPLING, 32)); + public static final Block TENANEA_SAPLING = registerBlock("tenanea_sapling", new TenaneaSaplingBlock()); + public static final Block TENANEA_LEAVES = registerBlock("tenanea_leaves", new EndLeavesBlock(TENANEA_SAPLING, MaterialColor.PINK)); + public static final Block TENANEA_FLOWERS = registerBlock("tenanea_flowers", new TenaneaFlowersBlock()); + public static final Block TENANEA_OUTER_LEAVES = registerBlock("tenanea_outer_leaves", new FurBlock(TENANEA_SAPLING, 32)); public static final WoodenMaterial TENANEA = new WoodenMaterial("tenanea", MaterialColor.BROWN, MaterialColor.PINK); - public static final Block HELIX_TREE_SAPLING = registerBlock("helix_tree_sapling", new BlockHelixTreeSapling()); - public static final Block HELIX_TREE_LEAVES = registerBlock("helix_tree_leaves", new BlockHelixTreeLeaves()); + public static final Block HELIX_TREE_SAPLING = registerBlock("helix_tree_sapling", new HelixTreeSaplingBlock()); + public static final Block HELIX_TREE_LEAVES = registerBlock("helix_tree_leaves", new HelixTreeLeavesBlock()); public static final WoodenMaterial HELIX_TREE = new WoodenMaterial("helix_tree", MaterialColor.GRAY, MaterialColor.ORANGE); - public static final Block UMBRELLA_TREE_SAPLING = registerBlock("umbrella_tree_sapling", new BlockUmbrellaTreeSapling()); - public static final Block UMBRELLA_TREE_MEMBRANE = registerBlock("umbrella_tree_membrane", new BlockUmbrellaTreeMembrane()); - public static final Block UMBRELLA_TREE_CLUSTER = registerBlock("umbrella_tree_cluster", new BlockUmbrellaTreeCluster()); - public static final Block UMBRELLA_TREE_CLUSTER_EMPTY = registerBlock("umbrella_tree_cluster_empty", new BlockUmbrellaTreeClusterEmpty()); + public static final Block UMBRELLA_TREE_SAPLING = registerBlock("umbrella_tree_sapling", new UmbrellaTreeSaplingBlock()); + public static final Block UMBRELLA_TREE_MEMBRANE = registerBlock("umbrella_tree_membrane", new UmbrellaTreeMembraneBlock()); + public static final Block UMBRELLA_TREE_CLUSTER = registerBlock("umbrella_tree_cluster", new UmbrellaTreeClusterBlock()); + public static final Block UMBRELLA_TREE_CLUSTER_EMPTY = registerBlock("umbrella_tree_cluster_empty", new UmbrellaTreeClusterEmptyBlock()); public static final WoodenMaterial UMBRELLA_TREE = new WoodenMaterial("umbrella_tree", MaterialColor.BLUE, MaterialColor.GREEN); - public static final Block JELLYSHROOM_CAP_PURPLE = registerBlock("jellyshroom_cap_purple", new BlockJellyshroomCap(217, 142, 255, 164, 0, 255)); + public static final Block JELLYSHROOM_CAP_PURPLE = registerBlock("jellyshroom_cap_purple", new JellyshroomCapBlock(217, 142, 255, 164, 0, 255)); public static final WoodenMaterial JELLYSHROOM = new WoodenMaterial("jellyshroom", MaterialColor.PURPLE, MaterialColor.LIGHT_BLUE); // Small Plants // - public static final Block UMBRELLA_MOSS = registerBlock("umbrella_moss", new BlockUmbrellaMoss()); - public static final Block UMBRELLA_MOSS_TALL = registerBlock("umbrella_moss_tall", new BlockUmbrellaMossTall()); - public static final Block CREEPING_MOSS = registerBlock("creeping_moss", new BlockGlowingMoss(11)); - public static final Block CHORUS_GRASS = registerBlock("chorus_grass", new BlockChorusGrass()); - public static final Block CAVE_GRASS = registerBlock("cave_grass", new BlockTerrainPlant(CAVE_MOSS)); - public static final Block CRYSTAL_GRASS = registerBlock("crystal_grass", new BlockTerrainPlant(CRYSTAL_MOSS)); - public static final Block SHADOW_PLANT = registerBlock("shadow_plant", new BlockTerrainPlant(SHADOW_GRASS)); - public static final Block BUSHY_GRASS = registerBlock("bushy_grass", new BlockTerrainPlant(PINK_MOSS)); - public static final Block AMBER_GRASS = registerBlock("amber_grass", new BlockTerrainPlant(AMBER_MOSS)); - public static final Block TWISTED_UMBRELLA_MOSS = registerBlock("twisted_umbrella_moss", new BlockTwistedUmbrellaMoss()); - public static final Block TWISTED_UMBRELLA_MOSS_TALL = registerBlock("twisted_umbrella_moss_tall", new BlockTwistedUmbrellaMossTall()); - public static final Block JUNGLE_GRASS = registerBlock("jungle_grass", new BlockTerrainPlant(JUNGLE_MOSS)); + public static final Block UMBRELLA_MOSS = registerBlock("umbrella_moss", new UmbrellaMossBlock()); + public static final Block UMBRELLA_MOSS_TALL = registerBlock("umbrella_moss_tall", new UmbrellaMossTallBlock()); + public static final Block CREEPING_MOSS = registerBlock("creeping_moss", new GlowingMossBlock(11)); + public static final Block CHORUS_GRASS = registerBlock("chorus_grass", new ChorusGrassBlock()); + public static final Block CAVE_GRASS = registerBlock("cave_grass", new TerrainPlantBlock(CAVE_MOSS)); + public static final Block CRYSTAL_GRASS = registerBlock("crystal_grass", new TerrainPlantBlock(CRYSTAL_MOSS)); + public static final Block SHADOW_PLANT = registerBlock("shadow_plant", new TerrainPlantBlock(SHADOW_GRASS)); + public static final Block BUSHY_GRASS = registerBlock("bushy_grass", new TerrainPlantBlock(PINK_MOSS)); + public static final Block AMBER_GRASS = registerBlock("amber_grass", new TerrainPlantBlock(AMBER_MOSS)); + public static final Block TWISTED_UMBRELLA_MOSS = registerBlock("twisted_umbrella_moss", new TwistedUmbrellaMossBlock()); + public static final Block TWISTED_UMBRELLA_MOSS_TALL = registerBlock("twisted_umbrella_moss_tall", new TwistedUmbrellaMossTallBlock()); + public static final Block JUNGLE_GRASS = registerBlock("jungle_grass", new TerrainPlantBlock(JUNGLE_MOSS)); - public static final Block BLUE_VINE_SEED = registerBlock("blue_vine_seed", new BlockBlueVineSeed()); - public static final Block BLUE_VINE = registerBlockNI("blue_vine", new BlockBlueVine()); - public static final Block BLUE_VINE_LANTERN = registerBlock("blue_vine_lantern", new BlockBlueVineLantern()); - public static final Block BLUE_VINE_FUR = registerBlock("blue_vine_fur", new BlockFur(BLUE_VINE_SEED, 15, 3)); + public static final Block BLUE_VINE_SEED = registerBlock("blue_vine_seed", new BlueVineSeedBlock()); + public static final Block BLUE_VINE = registerBlockNI("blue_vine", new BlueVineBlock()); + public static final Block BLUE_VINE_LANTERN = registerBlock("blue_vine_lantern", new BlueVineLanternBlock()); + public static final Block BLUE_VINE_FUR = registerBlock("blue_vine_fur", new FurBlock(BLUE_VINE_SEED, 15, 3)); - public static final Block LANCELEAF_SEED = registerBlock("lanceleaf_seed", new BlockLanceleafSeed()); - public static final Block LANCELEAF = registerBlockNI("lanceleaf", new BlockLanceleaf()); + public static final Block LANCELEAF_SEED = registerBlock("lanceleaf_seed", new LanceleafSeedBlock()); + public static final Block LANCELEAF = registerBlockNI("lanceleaf", new LanceleafBlock()); - public static final Block GLOWING_PILLAR_SEED = registerBlock("glowing_pillar_seed", new BlockGlowingPillarSeed()); - public static final Block GLOWING_PILLAR_ROOTS = registerBlockNI("glowing_pillar_roots", new BlockGlowingPillarRoots()); - public static final Block GLOWING_PILLAR_LUMINOPHOR = registerBlock("glowing_pillar_luminophor", new BlockGlowingPillarLuminophor()); - public static final Block GLOWING_PILLAR_LEAVES = registerBlock("glowing_pillar_leaves", new BlockFur(GLOWING_PILLAR_SEED, 15, 3)); + public static final Block GLOWING_PILLAR_SEED = registerBlock("glowing_pillar_seed", new GlowingPillarSeedBlock()); + public static final Block GLOWING_PILLAR_ROOTS = registerBlockNI("glowing_pillar_roots", new GlowingPillarRootsBlock()); + public static final Block GLOWING_PILLAR_LUMINOPHOR = registerBlock("glowing_pillar_luminophor", new GlowingPillarLuminophorBlock()); + public static final Block GLOWING_PILLAR_LEAVES = registerBlock("glowing_pillar_leaves", new FurBlock(GLOWING_PILLAR_SEED, 15, 3)); - public static final Block SMALL_JELLYSHROOM = registerBlock("small_jellyshroom", new BlockSmallJellyshroom()); + public static final Block SMALL_JELLYSHROOM = registerBlock("small_jellyshroom", new SmallJellyshroomBlock()); // Water plants - public static final Block BUBBLE_CORAL = registerBlock("bubble_coral", new BlockBubbleCoral()); - public static final Block MENGER_SPONGE = registerBlock("menger_sponge", new BlockMengerSponge()); - public static final Block MENGER_SPONGE_WET = registerBlock("menger_sponge_wet", new BlockMengerSpongeWet()); - public static final Block CHARNIA_RED = registerBlock("charnia_red", new BlockCharnia()); - public static final Block CHARNIA_PURPLE = registerBlock("charnia_purple", new BlockCharnia()); - public static final Block CHARNIA_ORANGE = registerBlock("charnia_orange", new BlockCharnia()); - public static final Block CHARNIA_LIGHT_BLUE = registerBlock("charnia_light_blue", new BlockCharnia()); - public static final Block CHARNIA_CYAN = registerBlock("charnia_cyan", new BlockCharnia()); - public static final Block CHARNIA_GREEN = registerBlock("charnia_green", new BlockCharnia()); + public static final Block BUBBLE_CORAL = registerBlock("bubble_coral", new BubbleCoralBlock()); + public static final Block MENGER_SPONGE = registerBlock("menger_sponge", new MengerSpongeBlock()); + public static final Block MENGER_SPONGE_WET = registerBlock("menger_sponge_wet", new MengerSpongeWetBlock()); + public static final Block CHARNIA_RED = registerBlock("charnia_red", new CharniaBlock()); + public static final Block CHARNIA_PURPLE = registerBlock("charnia_purple", new CharniaBlock()); + public static final Block CHARNIA_ORANGE = registerBlock("charnia_orange", new CharniaBlock()); + public static final Block CHARNIA_LIGHT_BLUE = registerBlock("charnia_light_blue", new CharniaBlock()); + public static final Block CHARNIA_CYAN = registerBlock("charnia_cyan", new CharniaBlock()); + public static final Block CHARNIA_GREEN = registerBlock("charnia_green", new CharniaBlock()); - public static final Block END_LILY = registerBlockNI("end_lily", new BlockEndLily()); - public static final Block END_LILY_SEED = registerBlock("end_lily_seed", new BlockEndLilySeed()); + public static final Block END_LILY = registerBlockNI("end_lily", new EndLilyBlock()); + public static final Block END_LILY_SEED = registerBlock("end_lily_seed", new EndLilySeedBlock()); - public static final Block HYDRALUX_SAPLING = registerBlock("hydralux_sapling", new BlockHydraluxSapling()); - public static final Block HYDRALUX = registerBlockNI("hydralux", new BlockHydralux()); - public static final Block HYDRALUX_PETAL_BLOCK = registerBlock("hydralux_petal_block", new BlockHydraluxPetal()); - public static final ColoredMaterial HYDRALUX_PETAL_BLOCK_COLORED = new ColoredMaterial(BlockHydraluxPetalColored::new, HYDRALUX_PETAL_BLOCK, true); + public static final Block HYDRALUX_SAPLING = registerBlock("hydralux_sapling", new HydraluxSaplingBlock()); + public static final Block HYDRALUX = registerBlockNI("hydralux", new HydraluxBlock()); + public static final Block HYDRALUX_PETAL_BLOCK = registerBlock("hydralux_petal_block", new HydraluxPetalBlock()); + public static final ColoredMaterial HYDRALUX_PETAL_BLOCK_COLORED = new ColoredMaterial(HydraluxPetalColoredBlock::new, HYDRALUX_PETAL_BLOCK, true); - public static final Block CAVE_BUSH = registerBlock("cave_bush", new BlockSimpleLeaves(MaterialColor.MAGENTA)); + public static final Block CAVE_BUSH = registerBlock("cave_bush", new SimpleLeavesBlock(MaterialColor.MAGENTA)); - public static final Block MURKWEED = registerBlock("murkweed", new BlockMurkweed()); - public static final Block NEEDLEGRASS = registerBlock("needlegrass", new BlockNeedlegrass()); + public static final Block MURKWEED = registerBlock("murkweed", new MurkweedBlock()); + public static final Block NEEDLEGRASS = registerBlock("needlegrass", new NeedlegrassBlock()); // Wall Plants // - public static final Block PURPLE_POLYPORE = registerBlock("purple_polypore", new BlockWallMushroom(13)); - public static final Block TAIL_MOSS = registerBlock("tail_moss", new BlockWallPlant()); - public static final Block CYAN_MOSS = registerBlock("cyan_moss", new BlockWallPlant()); - public static final Block TWISTED_MOSS = registerBlock("twisted_moss", new BlockWallPlant()); - public static final Block TUBE_WORM = registerBlock("tube_worm", new BlockUnderwaterWallPlant()); - public static final Block BULB_MOSS = registerBlock("bulb_moss", new BlockWallPlant(12)); - public static final Block JUNGLE_FERN = registerBlock("jungle_fern", new BlockWallPlant()); + public static final Block PURPLE_POLYPORE = registerBlock("purple_polypore", new WallMushroomBlock(13)); + public static final Block TAIL_MOSS = registerBlock("tail_moss", new EndWallPlantBlock()); + public static final Block CYAN_MOSS = registerBlock("cyan_moss", new EndWallPlantBlock()); + public static final Block TWISTED_MOSS = registerBlock("twisted_moss", new EndWallPlantBlock()); + public static final Block TUBE_WORM = registerBlock("tube_worm", new EndUnderwaterWallPlantBlock()); + public static final Block BULB_MOSS = registerBlock("bulb_moss", new EndWallPlantBlock(12)); + public static final Block JUNGLE_FERN = registerBlock("jungle_fern", new EndWallPlantBlock()); // Crops // - public static final Block SHADOW_BERRY = registerBlock("shadow_berry", new BlockShadowBerry()); + public static final Block SHADOW_BERRY = registerBlock("shadow_berry", new ShadowBerryBlock()); // Vines // - public static final Block DENSE_VINE = registerBlock("dense_vine", new BlockVine(15, true)); - public static final Block TWISTED_VINE = registerBlock("twisted_vine", new BlockVine()); - public static final Block BULB_VINE_SEED = registerBlock("bulb_vine_seed", new BlockBulbVineSeed()); - public static final Block BULB_VINE = registerBlock("bulb_vine", new BlockBulbVine()); - public static final Block JUNGLE_VINE = registerBlock("jungle_vine", new BlockVine()); + public static final Block DENSE_VINE = registerBlock("dense_vine", new VineBlock(15, true)); + public static final Block TWISTED_VINE = registerBlock("twisted_vine", new VineBlock()); + public static final Block BULB_VINE_SEED = registerBlock("bulb_vine_seed", new BulbVineSeedBlock()); + public static final Block BULB_VINE = registerBlock("bulb_vine", new BulbVineBlock()); + public static final Block JUNGLE_VINE = registerBlock("jungle_vine", new VineBlock()); // Mob-Related - public static final Block SILK_MOTH_NEST = registerBlock("silk_moth_nest", new BlockSilkMothNest()); + public static final Block SILK_MOTH_NEST = registerBlock("silk_moth_nest", new SilkMothNestBlock()); // Ores // - public static final Block ENDER_ORE = registerBlock("ender_ore", new BlockOre(EndItems.ENDER_SHARD, 1, 3, 5)); - public static final Block AMBER_ORE = registerBlock("amber_ore", new BlockOre(EndItems.RAW_AMBER, 1, 2, 4)); + public static final Block ENDER_ORE = registerBlock("ender_ore", new EndOreBlock(EndItems.ENDER_SHARD, 1, 3, 5)); + public static final Block AMBER_ORE = registerBlock("amber_ore", new EndOreBlock(EndItems.RAW_AMBER, 1, 2, 4)); // Materials // public static final Block TERMINITE_BLOCK = registerBlock("terminite_block", new TerminiteBlock()); public static final Block AETERNIUM_BLOCK = registerBlock("aeternium_block", new AeterniumBlock()); public static final Block ENDER_BLOCK = registerBlock("ender_block", new EnderBlock()); public static final Block AURORA_CRYSTAL = registerBlock("aurora_crystal", new AuroraCrystalBlock()); - public static final Block AMBER_BLOCK = registerBlock("amber_block", new BlockAmber()); + public static final Block AMBER_BLOCK = registerBlock("amber_block", new AmberBlock()); - public static final Block RESPAWN_OBELISK = registerBlock("respawn_obelisk", new BlockRespawnObelisk()); + public static final Block RESPAWN_OBELISK = registerBlock("respawn_obelisk", new RespawnObeliskBlock()); // Lanterns - public static final Block ANDESITE_LANTERN = registerBlock("andesite_lantern", new BlockStoneLantern(Blocks.ANDESITE)); - public static final Block DIORITE_LANTERN = registerBlock("diorite_lantern", new BlockStoneLantern(Blocks.DIORITE)); - public static final Block GRANITE_LANTERN = registerBlock("granite_lantern", new BlockStoneLantern(Blocks.GRANITE)); - public static final Block QUARTZ_LANTERN = registerBlock("quartz_lantern", new BlockStoneLantern(Blocks.QUARTZ_BLOCK)); - public static final Block PURPUR_LANTERN = registerBlock("purpur_lantern", new BlockStoneLantern(Blocks.PURPUR_BLOCK)); - public static final Block END_STONE_LANTERN = registerBlock("end_stone_lantern", new BlockStoneLantern(Blocks.END_STONE)); - public static final Block BLACKSTONE_LANTERN = registerBlock("blackstone_lantern", new BlockStoneLantern(Blocks.BLACKSTONE)); + public static final Block ANDESITE_LANTERN = registerBlock("andesite_lantern", new StoneLanternBlock(Blocks.ANDESITE)); + public static final Block DIORITE_LANTERN = registerBlock("diorite_lantern", new StoneLanternBlock(Blocks.DIORITE)); + public static final Block GRANITE_LANTERN = registerBlock("granite_lantern", new StoneLanternBlock(Blocks.GRANITE)); + public static final Block QUARTZ_LANTERN = registerBlock("quartz_lantern", new StoneLanternBlock(Blocks.QUARTZ_BLOCK)); + public static final Block PURPUR_LANTERN = registerBlock("purpur_lantern", new StoneLanternBlock(Blocks.PURPUR_BLOCK)); + public static final Block END_STONE_LANTERN = registerBlock("end_stone_lantern", new StoneLanternBlock(Blocks.END_STONE)); + public static final Block BLACKSTONE_LANTERN = registerBlock("blackstone_lantern", new StoneLanternBlock(Blocks.BLACKSTONE)); - public static final Block BULB_LANTERN = registerBlock("bulb_lantern", new BlockBulbVineLantern()); - public static final ColoredMaterial BULB_LANTERN_COLORED = new ColoredMaterial(BlockBulbVineLanternColored::new, BULB_LANTERN, false); + public static final Block BULB_LANTERN = registerBlock("bulb_lantern", new BulbVineLanternBlock()); + public static final ColoredMaterial BULB_LANTERN_COLORED = new ColoredMaterial(BulbVineLanternColoredBlock::new, BULB_LANTERN, false); // Blocks With Entity // public static final Block END_STONE_SMELTER = registerBlock("end_stone_smelter", new EndStoneSmelter()); diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index 0a3e3d00..30b0650e 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -22,10 +22,10 @@ import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome.Category; import net.minecraft.world.gen.surfacebuilder.SurfaceConfig; import ru.betterend.BetterEnd; -import ru.betterend.blocks.BlockTerrain; -import ru.betterend.blocks.basis.BlockPedestal; -import ru.betterend.blocks.basis.BlockSimpleLeaves; -import ru.betterend.blocks.basis.BlockVine; +import ru.betterend.blocks.EndTerrainBlock; +import ru.betterend.blocks.basis.PedestalBlock; +import ru.betterend.blocks.basis.SimpleLeavesBlock; +import ru.betterend.blocks.basis.VineBlock; import ru.betterend.mixin.common.ComposterBlockAccessor; import ru.betterend.util.TagHelper; @@ -72,18 +72,18 @@ public class EndTags { EndItems.getModBlocks().forEach((item) -> { Block block = ((BlockItem) item).getBlock(); - if (block instanceof BlockTerrain) { + if (block instanceof EndTerrainBlock) { addSurfaceBlock(block); TagHelper.addTag(BlockTags.NYLIUM, block); } - else if (block instanceof LeavesBlock || block instanceof BlockSimpleLeaves) { + else if (block instanceof LeavesBlock || block instanceof SimpleLeavesBlock) { TagHelper.addTag(BlockTags.LEAVES, block); ComposterBlockAccessor.callRegisterCompostableItem(0.3F, block); } - else if (block instanceof BlockVine) { + else if (block instanceof VineBlock) { TagHelper.addTag(BlockTags.CLIMBABLE, block); } - else if (block instanceof BlockPedestal) { + else if (block instanceof PedestalBlock) { TagHelper.addTag(PEDESTALS, block); } if (block.getDefaultState().getMaterial().equals(Material.PLANT)) { diff --git a/src/main/java/ru/betterend/util/BlocksHelper.java b/src/main/java/ru/betterend/util/BlocksHelper.java index f49c5c21..89006734 100644 --- a/src/main/java/ru/betterend/util/BlocksHelper.java +++ b/src/main/java/ru/betterend/util/BlocksHelper.java @@ -21,10 +21,10 @@ import net.minecraft.util.math.BlockPos.Mutable; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Vec3i; import net.minecraft.world.WorldAccess; -import ru.betterend.blocks.BlockBlueVine; -import ru.betterend.blocks.basis.BlockDoublePlant; -import ru.betterend.blocks.basis.BlockFur; -import ru.betterend.blocks.basis.BlockVine; +import ru.betterend.blocks.BlueVineBlock; +import ru.betterend.blocks.basis.DoublePlantBlock; +import ru.betterend.blocks.basis.FurBlock; +import ru.betterend.blocks.basis.VineBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -164,7 +164,7 @@ public class BlocksHelper { POS.setY(y); state = world.getBlockState(POS); - if (state.getBlock() instanceof BlockFur) { + if (state.getBlock() instanceof FurBlock) { doubleCheck.add(POS.toImmutable()); } // Liquids @@ -225,8 +225,8 @@ public class BlocksHelper { } } // Vines - else if (state.getBlock() instanceof BlockVine) { - while (world.getBlockState(POS).getBlock() instanceof BlockVine) { + else if (state.getBlock() instanceof VineBlock) { + while (world.getBlockState(POS).getBlock() instanceof VineBlock) { setWithoutUpdate(world, POS, AIR); POS.setY(POS.getY() - 1); } @@ -265,7 +265,7 @@ public class BlocksHelper { // Blocks without support else { // Blue Vine - if (state.getBlock() instanceof BlockBlueVine) { + if (state.getBlock() instanceof BlueVineBlock) { while (state.isOf(EndBlocks.BLUE_VINE) || state.isOf(EndBlocks.BLUE_VINE_LANTERN) || state.isOf(EndBlocks.BLUE_VINE_FUR)) { BlocksHelper.setWithoutUpdate(world, POS, AIR); POS.setY(POS.getY() + 1); @@ -273,7 +273,7 @@ public class BlocksHelper { } } // Double plants - if (state.getBlock() instanceof BlockDoublePlant) { + if (state.getBlock() instanceof DoublePlantBlock) { BlocksHelper.setWithoutUpdate(world, POS, AIR); POS.setY(POS.getY() + 1); BlocksHelper.setWithoutUpdate(world, POS, AIR); diff --git a/src/main/java/ru/betterend/world/features/BlueVineFeature.java b/src/main/java/ru/betterend/world/features/BlueVineFeature.java index 79aa63ca..d5c6b019 100644 --- a/src/main/java/ru/betterend/world/features/BlueVineFeature.java +++ b/src/main/java/ru/betterend/world/features/BlueVineFeature.java @@ -4,7 +4,7 @@ import java.util.Random; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.basis.BlockPlantWithAge; +import ru.betterend.blocks.basis.PlantWithAgeBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; @@ -26,10 +26,10 @@ public class BlueVineFeature extends ScatterFeature { @Override public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { if (small) { - BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.BLUE_VINE_SEED.getDefaultState().with(BlockPlantWithAge.AGE, random.nextInt(4))); + BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.BLUE_VINE_SEED.getDefaultState().with(PlantWithAgeBlock.AGE, random.nextInt(4))); } else { - BlockPlantWithAge seed = ((BlockPlantWithAge) EndBlocks.BLUE_VINE_SEED); + PlantWithAgeBlock seed = ((PlantWithAgeBlock) EndBlocks.BLUE_VINE_SEED); seed.growAdult(world, random, blockPos); } } diff --git a/src/main/java/ru/betterend/world/features/DoublePlantFeature.java b/src/main/java/ru/betterend/world/features/DoublePlantFeature.java index a88fbcb4..310ecf4b 100644 --- a/src/main/java/ru/betterend/world/features/DoublePlantFeature.java +++ b/src/main/java/ru/betterend/world/features/DoublePlantFeature.java @@ -6,7 +6,7 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.basis.BlockDoublePlant; +import ru.betterend.blocks.basis.DoublePlantBlock; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; @@ -30,11 +30,11 @@ public class DoublePlantFeature extends ScatterFeature { @Override public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { - if (plant instanceof BlockDoublePlant) { + if (plant instanceof DoublePlantBlock) { int rot = random.nextInt(4); - BlockState state = plant.getDefaultState().with(BlockDoublePlant.ROTATION, rot); + BlockState state = plant.getDefaultState().with(DoublePlantBlock.ROTATION, rot); BlocksHelper.setWithoutUpdate(world, blockPos, state); - BlocksHelper.setWithoutUpdate(world, blockPos.up(), state.with(BlockDoublePlant.TOP, true)); + BlocksHelper.setWithoutUpdate(world, blockPos.up(), state.with(DoublePlantBlock.TOP, true)); } else { BlocksHelper.setWithoutUpdate(world, blockPos, plant); diff --git a/src/main/java/ru/betterend/world/features/EndLilyFeature.java b/src/main/java/ru/betterend/world/features/EndLilyFeature.java index 8f5614c0..e2556204 100644 --- a/src/main/java/ru/betterend/world/features/EndLilyFeature.java +++ b/src/main/java/ru/betterend/world/features/EndLilyFeature.java @@ -4,7 +4,7 @@ import java.util.Random; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.BlockEndLilySeed; +import ru.betterend.blocks.EndLilySeedBlock; import ru.betterend.registry.EndBlocks; public class EndLilyFeature extends UnderwaterPlantScatter { @@ -14,7 +14,7 @@ public class EndLilyFeature extends UnderwaterPlantScatter { @Override public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { - BlockEndLilySeed seed = (BlockEndLilySeed) EndBlocks.END_LILY_SEED; + EndLilySeedBlock seed = (EndLilySeedBlock) EndBlocks.END_LILY_SEED; seed.grow(world, random, blockPos); } diff --git a/src/main/java/ru/betterend/world/features/EndLotusFeature.java b/src/main/java/ru/betterend/world/features/EndLotusFeature.java index af29b267..ffa327a4 100644 --- a/src/main/java/ru/betterend/world/features/EndLotusFeature.java +++ b/src/main/java/ru/betterend/world/features/EndLotusFeature.java @@ -4,7 +4,7 @@ import java.util.Random; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.BlockEndLotusSeed; +import ru.betterend.blocks.EndLotusSeedBlock; import ru.betterend.registry.EndBlocks; public class EndLotusFeature extends UnderwaterPlantScatter { @@ -14,7 +14,7 @@ public class EndLotusFeature extends UnderwaterPlantScatter { @Override public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { - BlockEndLotusSeed seed = (BlockEndLotusSeed) EndBlocks.END_LOTUS_SEED; + EndLotusSeedBlock seed = (EndLotusSeedBlock) EndBlocks.END_LOTUS_SEED; seed.grow(world, random, blockPos); } diff --git a/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java b/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java index abd4f05e..116cbbdb 100644 --- a/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java +++ b/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java @@ -8,7 +8,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos.Mutable; import net.minecraft.util.math.Direction; import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.BlockEndLotusLeaf; +import ru.betterend.blocks.EndLotusLeafBlock; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; @@ -38,14 +38,14 @@ public class EndLotusLeafFeature extends ScatterFeature { private void generateLeaf(StructureWorldAccess world, BlockPos pos) { Mutable p = new Mutable(); BlockState leaf = EndBlocks.END_LOTUS_LEAF.getDefaultState(); - BlocksHelper.setWithoutUpdate(world, pos, leaf.with(BlockEndLotusLeaf.SHAPE, TripleShape.BOTTOM)); + BlocksHelper.setWithoutUpdate(world, pos, leaf.with(EndLotusLeafBlock.SHAPE, TripleShape.BOTTOM)); for (Direction move: BlocksHelper.HORIZONTAL) { - BlocksHelper.setWithoutUpdate(world, p.set(pos).move(move), leaf.with(BlockEndLotusLeaf.HORIZONTAL_FACING, move).with(BlockEndLotusLeaf.SHAPE, TripleShape.MIDDLE)); + BlocksHelper.setWithoutUpdate(world, p.set(pos).move(move), leaf.with(EndLotusLeafBlock.HORIZONTAL_FACING, move).with(EndLotusLeafBlock.SHAPE, TripleShape.MIDDLE)); } for (int i = 0; i < 4; i ++) { Direction d1 = BlocksHelper.HORIZONTAL[i]; Direction d2 = BlocksHelper.HORIZONTAL[(i + 1) & 3]; - BlocksHelper.setWithoutUpdate(world, p.set(pos).move(d1).move(d2), leaf.with(BlockEndLotusLeaf.HORIZONTAL_FACING, d1).with(BlockEndLotusLeaf.SHAPE, TripleShape.TOP)); + BlocksHelper.setWithoutUpdate(world, p.set(pos).move(d1).move(d2), leaf.with(EndLotusLeafBlock.HORIZONTAL_FACING, d1).with(EndLotusLeafBlock.SHAPE, TripleShape.TOP)); } } diff --git a/src/main/java/ru/betterend/world/features/GlowPillarFeature.java b/src/main/java/ru/betterend/world/features/GlowPillarFeature.java index c14f5833..1b51b7e7 100644 --- a/src/main/java/ru/betterend/world/features/GlowPillarFeature.java +++ b/src/main/java/ru/betterend/world/features/GlowPillarFeature.java @@ -4,7 +4,7 @@ import java.util.Random; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.basis.BlockPlantWithAge; +import ru.betterend.blocks.basis.PlantWithAgeBlock; import ru.betterend.registry.EndBlocks; public class GlowPillarFeature extends ScatterFeature { @@ -19,7 +19,7 @@ public class GlowPillarFeature extends ScatterFeature { @Override public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { - BlockPlantWithAge seed = ((BlockPlantWithAge) EndBlocks.GLOWING_PILLAR_SEED); + PlantWithAgeBlock seed = ((PlantWithAgeBlock) EndBlocks.GLOWING_PILLAR_SEED); seed.growAdult(world, random, blockPos); } diff --git a/src/main/java/ru/betterend/world/features/HydraluxFeature.java b/src/main/java/ru/betterend/world/features/HydraluxFeature.java index 48f4e46f..3aad5755 100644 --- a/src/main/java/ru/betterend/world/features/HydraluxFeature.java +++ b/src/main/java/ru/betterend/world/features/HydraluxFeature.java @@ -4,7 +4,7 @@ import java.util.Random; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.BlockHydraluxSapling; +import ru.betterend.blocks.HydraluxSaplingBlock; import ru.betterend.registry.EndBlocks; public class HydraluxFeature extends UnderwaterPlantScatter { @@ -14,7 +14,7 @@ public class HydraluxFeature extends UnderwaterPlantScatter { @Override public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { - BlockHydraluxSapling seed = (BlockHydraluxSapling) EndBlocks.HYDRALUX_SAPLING; + HydraluxSaplingBlock seed = (HydraluxSaplingBlock) EndBlocks.HYDRALUX_SAPLING; seed.grow(world, random, blockPos); } diff --git a/src/main/java/ru/betterend/world/features/LanceleafFeature.java b/src/main/java/ru/betterend/world/features/LanceleafFeature.java index 0fdb99a6..c2d3a388 100644 --- a/src/main/java/ru/betterend/world/features/LanceleafFeature.java +++ b/src/main/java/ru/betterend/world/features/LanceleafFeature.java @@ -4,7 +4,7 @@ import java.util.Random; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.basis.BlockPlantWithAge; +import ru.betterend.blocks.basis.PlantWithAgeBlock; import ru.betterend.registry.EndBlocks; public class LanceleafFeature extends ScatterFeature { @@ -19,7 +19,7 @@ public class LanceleafFeature extends ScatterFeature { @Override public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { - BlockPlantWithAge seed = ((BlockPlantWithAge) EndBlocks.LANCELEAF_SEED); + PlantWithAgeBlock seed = ((PlantWithAgeBlock) EndBlocks.LANCELEAF_SEED); seed.growAdult(world, random, blockPos); } diff --git a/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java b/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java index 18e7c812..82316fd6 100644 --- a/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java @@ -8,7 +8,7 @@ import net.minecraft.state.property.Properties; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.basis.BlockAttached; +import ru.betterend.blocks.basis.AttachedBlock; import ru.betterend.util.BlocksHelper; public class SingleInvertedScatterFeature extends InvertedScatterFeature { @@ -25,7 +25,7 @@ public class SingleInvertedScatterFeature extends InvertedScatterFeature { return false; } BlockState state = block.getDefaultState(); - if (block instanceof BlockAttached) { + if (block instanceof AttachedBlock) { state = state.with(Properties.FACING, Direction.DOWN); } return state.canPlaceAt(world, blockPos); @@ -34,7 +34,7 @@ public class SingleInvertedScatterFeature extends InvertedScatterFeature { @Override public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { BlockState state = block.getDefaultState(); - if (block instanceof BlockAttached) { + if (block instanceof AttachedBlock) { state = state.with(Properties.FACING, Direction.DOWN); } BlocksHelper.setWithoutUpdate(world, blockPos, state); diff --git a/src/main/java/ru/betterend/world/features/SinglePlantFeature.java b/src/main/java/ru/betterend/world/features/SinglePlantFeature.java index 89033266..84fbe992 100644 --- a/src/main/java/ru/betterend/world/features/SinglePlantFeature.java +++ b/src/main/java/ru/betterend/world/features/SinglePlantFeature.java @@ -6,8 +6,8 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.basis.BlockDoublePlant; -import ru.betterend.blocks.basis.BlockPlantWithAge; +import ru.betterend.blocks.basis.DoublePlantBlock; +import ru.betterend.blocks.basis.PlantWithAgeBlock; import ru.betterend.util.BlocksHelper; public class SinglePlantFeature extends ScatterFeature { @@ -50,15 +50,15 @@ public class SinglePlantFeature extends ScatterFeature { @Override public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { - if (plant instanceof BlockDoublePlant) { + if (plant instanceof DoublePlantBlock) { int rot = random.nextInt(4); - BlockState state = plant.getDefaultState().with(BlockDoublePlant.ROTATION, rot); + BlockState state = plant.getDefaultState().with(DoublePlantBlock.ROTATION, rot); BlocksHelper.setWithoutUpdate(world, blockPos, state); - BlocksHelper.setWithoutUpdate(world, blockPos.up(), state.with(BlockDoublePlant.TOP, true)); + BlocksHelper.setWithoutUpdate(world, blockPos.up(), state.with(DoublePlantBlock.TOP, true)); } - else if (plant instanceof BlockPlantWithAge) { + else if (plant instanceof PlantWithAgeBlock) { int age = random.nextInt(4); - BlockState state = plant.getDefaultState().with(BlockPlantWithAge.AGE, age); + BlockState state = plant.getDefaultState().with(PlantWithAgeBlock.AGE, age); BlocksHelper.setWithoutUpdate(world, blockPos, state); } else { diff --git a/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java b/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java index b24d94bd..5013d22c 100644 --- a/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java +++ b/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java @@ -6,7 +6,7 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.basis.BlockDoublePlant; +import ru.betterend.blocks.basis.DoublePlantBlock; import ru.betterend.util.BlocksHelper; public class UnderwaterPlantFeature extends UnderwaterPlantScatter { @@ -24,11 +24,11 @@ public class UnderwaterPlantFeature extends UnderwaterPlantScatter { @Override public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { - if (plant instanceof BlockDoublePlant) { + if (plant instanceof DoublePlantBlock) { int rot = random.nextInt(4); - BlockState state = plant.getDefaultState().with(BlockDoublePlant.ROTATION, rot); + BlockState state = plant.getDefaultState().with(DoublePlantBlock.ROTATION, rot); BlocksHelper.setWithoutUpdate(world, blockPos, state); - BlocksHelper.setWithoutUpdate(world, blockPos.up(), state.with(BlockDoublePlant.TOP, true)); + BlocksHelper.setWithoutUpdate(world, blockPos.up(), state.with(DoublePlantBlock.TOP, true)); } else { BlocksHelper.setWithoutUpdate(world, blockPos, plant); diff --git a/src/main/java/ru/betterend/world/features/WallPlantFeature.java b/src/main/java/ru/betterend/world/features/WallPlantFeature.java index dc72aeab..7faadad5 100644 --- a/src/main/java/ru/betterend/world/features/WallPlantFeature.java +++ b/src/main/java/ru/betterend/world/features/WallPlantFeature.java @@ -8,8 +8,8 @@ import net.minecraft.state.property.Properties; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.basis.BlockAttached; -import ru.betterend.blocks.basis.BlockWallPlant; +import ru.betterend.blocks.basis.AttachedBlock; +import ru.betterend.blocks.basis.EndWallPlantBlock; import ru.betterend.util.BlocksHelper; public class WallPlantFeature extends WallScatterFeature { @@ -22,11 +22,11 @@ public class WallPlantFeature extends WallScatterFeature { @Override public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos pos, Direction dir) { - if (block instanceof BlockWallPlant) { - BlockState state = block.getDefaultState().with(BlockWallPlant.FACING, dir); + if (block instanceof EndWallPlantBlock) { + BlockState state = block.getDefaultState().with(EndWallPlantBlock.FACING, dir); return block.canPlaceAt(state, world, pos); } - else if (block instanceof BlockAttached) { + else if (block instanceof AttachedBlock) { BlockState state = block.getDefaultState().with(Properties.FACING, dir); return block.canPlaceAt(state, world, pos); } @@ -36,10 +36,10 @@ public class WallPlantFeature extends WallScatterFeature { @Override public void generate(StructureWorldAccess world, Random random, BlockPos pos, Direction dir) { BlockState state = block.getDefaultState(); - if (block instanceof BlockWallPlant) { - state = state.with(BlockWallPlant.FACING, dir); + if (block instanceof EndWallPlantBlock) { + state = state.with(EndWallPlantBlock.FACING, dir); } - else if (block instanceof BlockAttached) { + else if (block instanceof AttachedBlock) { state = state.with(Properties.FACING, dir); } BlocksHelper.setWithoutUpdate(world, pos, state); diff --git a/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java index f6134344..3fbd6742 100644 --- a/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java @@ -17,7 +17,7 @@ import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockFur; +import ru.betterend.blocks.basis.FurBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -63,7 +63,7 @@ public class TenaneaBushFeature extends DefaultFeature { MHelper.shuffle(DIRECTIONS, random); for (Direction d: DIRECTIONS) { if (info.getState(d).isAir()) { - info.setBlockPos(info.getPos().offset(d), EndBlocks.TENANEA_OUTER_LEAVES.getDefaultState().with(BlockFur.FACING, d)); + info.setBlockPos(info.getPos().offset(d), EndBlocks.TENANEA_OUTER_LEAVES.getDefaultState().with(FurBlock.FACING, d)); } } diff --git a/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java b/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java index 1b5ac0b2..2868079e 100644 --- a/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java @@ -15,7 +15,7 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import ru.betterend.blocks.BlockHydrothermalVent; +import ru.betterend.blocks.HydrothermalVentBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; @@ -173,7 +173,7 @@ public class GeyserFeature extends DefaultFeature { } mut.setY(mut.getY() + 1); } - state = EndBlocks.HYDROTHERMAL_VENT.getDefaultState().with(BlockHydrothermalVent.ACTIVATED, distRaw < 2); + state = EndBlocks.HYDROTHERMAL_VENT.getDefaultState().with(HydrothermalVentBlock.ACTIVATED, distRaw < 2); BlocksHelper.setWithoutUpdate(world, mut, state); mut.setY(mut.getY() + 1); state = world.getBlockState(mut); @@ -201,7 +201,7 @@ public class GeyserFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.SULPHURIC_ROCK.stone); mut.setY(mut.getY() + 1); } - state = EndBlocks.HYDROTHERMAL_VENT.getDefaultState().with(BlockHydrothermalVent.ACTIVATED, distRaw < 2); + state = EndBlocks.HYDROTHERMAL_VENT.getDefaultState().with(HydrothermalVentBlock.ACTIVATED, distRaw < 2); BlocksHelper.setWithoutUpdate(world, mut, state); mut.setY(mut.getY() + 1); state = world.getBlockState(mut); diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java index de611ef1..c132e1da 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java @@ -17,7 +17,7 @@ import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; import ru.betterend.blocks.BlockProperties; -import ru.betterend.blocks.BlockSulphurCrystal; +import ru.betterend.blocks.SulphurCrystalBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -175,9 +175,9 @@ public class SulphuricCaveFeature extends DefaultFeature { BlockPos side; if (random.nextInt(16) == 0 && world.getBlockState((side = pos.offset(dir))).isOf(Blocks.WATER)) { BlockState state = EndBlocks.SULPHUR_CRYSTAL.getDefaultState() - .with(BlockSulphurCrystal.WATERLOGGED, true) - .with(BlockSulphurCrystal.FACING, dir) - .with(BlockSulphurCrystal.AGE, random.nextInt(3)); + .with(SulphurCrystalBlock.WATERLOGGED, true) + .with(SulphurCrystalBlock.FACING, dir) + .with(SulphurCrystalBlock.AGE, random.nextInt(3)); BlocksHelper.setWithoutUpdate(world, side, state); } } diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java index b368a575..bd388e81 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java @@ -15,7 +15,7 @@ import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; import ru.betterend.blocks.BlockProperties; -import ru.betterend.blocks.BlockSulphurCrystal; +import ru.betterend.blocks.SulphurCrystalBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -195,9 +195,9 @@ public class SulphuricLakeFeature extends DefaultFeature { BlockPos side; if (random.nextInt(16) == 0 && world.getBlockState((side = pos.offset(dir))).isOf(Blocks.WATER)) { BlockState state = EndBlocks.SULPHUR_CRYSTAL.getDefaultState() - .with(BlockSulphurCrystal.WATERLOGGED, true) - .with(BlockSulphurCrystal.FACING, dir) - .with(BlockSulphurCrystal.AGE, random.nextInt(3)); + .with(SulphurCrystalBlock.WATERLOGGED, true) + .with(SulphurCrystalBlock.FACING, dir) + .with(SulphurCrystalBlock.AGE, random.nextInt(3)); BlocksHelper.setWithoutUpdate(world, side, state); } } diff --git a/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java b/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java index 413d0b6c..01829f90 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java @@ -8,7 +8,7 @@ import net.minecraft.util.math.BlockPos.Mutable; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import ru.betterend.blocks.BlockHydrothermalVent; +import ru.betterend.blocks.HydrothermalVentBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; @@ -25,7 +25,7 @@ public class SurfaceVentFeature extends DefaultFeature { Mutable mut = new Mutable(); int count = MHelper.randRange(15, 30, random); - BlockState vent = EndBlocks.HYDROTHERMAL_VENT.getDefaultState().with(BlockHydrothermalVent.WATERLOGGED, false); + BlockState vent = EndBlocks.HYDROTHERMAL_VENT.getDefaultState().with(HydrothermalVentBlock.WATERLOGGED, false); 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)); int dist = MHelper.floor(2 - MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ())) + random.nextInt(2); diff --git a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java index 8cbfa954..4a9496cb 100644 --- a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java @@ -14,7 +14,7 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import ru.betterend.blocks.BlockHelixTreeLeaves; +import ru.betterend.blocks.HelixTreeLeavesBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; @@ -121,7 +121,7 @@ public class HelixTreeFeature extends DefaultFeature { lastPoint = point; } - leaf = leaf.with(BlockHelixTreeLeaves.COLOR, 7); + leaf = leaf.with(HelixTreeLeavesBlock.COLOR, 7); leafStart = leafStart.add(0, lastPoint.getY(), 0); if (world.getBlockState(leafStart).isAir()) { BlocksHelper.setWithoutUpdate(world, leafStart, leaf); @@ -157,7 +157,7 @@ public class HelixTreeFeature extends DefaultFeature { int color = MHelper.floor((float) i / (float) count * 7F + 0.5F) + offset; color = MathHelper.clamp(color, 0, 7); if (world.getBlockState(bPos).getMaterial().isReplaceable()) { - BlocksHelper.setWithoutUpdate(world, bPos, state.with(BlockHelixTreeLeaves.COLOR, color)); + BlocksHelper.setWithoutUpdate(world, bPos, state.with(HelixTreeLeavesBlock.COLOR, color)); } x += dx; y += dy; @@ -165,7 +165,7 @@ public class HelixTreeFeature extends DefaultFeature { } bPos.set(end.getX() + pos.getX(), end.getY() + pos.getY(), end.getZ() + pos.getZ()); if (world.getBlockState(bPos).getMaterial().isReplaceable()) { - BlocksHelper.setWithoutUpdate(world, bPos, state.with(BlockHelixTreeLeaves.COLOR, 7)); + BlocksHelper.setWithoutUpdate(world, bPos, state.with(HelixTreeLeavesBlock.COLOR, 7)); } } diff --git a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java index ffd6ee32..4539d4d5 100644 --- a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java @@ -14,7 +14,7 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import ru.betterend.blocks.BlockJellyshroomCap; +import ru.betterend.blocks.JellyshroomCapBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.MHelper; @@ -67,7 +67,7 @@ public class JellyshroomFeature extends DefaultFeature { float dz = info.getPos().getZ() - pos.getZ() - last.getZ(); float distance = MHelper.length(dx, dz) / membraneRadius * 7F; int color = MathHelper.clamp(MHelper.floor(distance), 0, 7); - return info.getState().with(BlockJellyshroomCap.COLOR, color); + return info.getState().with(JellyshroomCapBlock.COLOR, color); } return info.getState(); }).fillRecursive(world, pos); diff --git a/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java index 180ecf2e..ee8a8f50 100644 --- a/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java @@ -12,8 +12,8 @@ import net.minecraft.util.math.Direction; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import ru.betterend.blocks.BlockMossyGlowshroomCap; -import ru.betterend.blocks.basis.BlockFur; +import ru.betterend.blocks.MossyGlowshroomCapBlock; +import ru.betterend.blocks.basis.FurBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -83,7 +83,7 @@ public class MossyGlowshroomFeature extends DefaultFeature { .setPostProcess((info) -> { if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getState())) { if (random.nextBoolean() && info.getStateUp().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { - info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.getDefaultState().with(BlockMossyGlowshroomCap.TRANSITION, true)); + info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.getDefaultState().with(MossyGlowshroomCapBlock.TRANSITION, true)); return info.getState(); } else if (!EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateUp()) || !EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateDown())) { @@ -93,7 +93,7 @@ public class MossyGlowshroomFeature extends DefaultFeature { } else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateDown().getBlock())) { - info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.getDefaultState().with(BlockMossyGlowshroomCap.TRANSITION, true)); + info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.getDefaultState().with(MossyGlowshroomCapBlock.TRANSITION, true)); return info.getState(); } @@ -103,12 +103,12 @@ public class MossyGlowshroomFeature extends DefaultFeature { else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { for (Direction dir: BlocksHelper.HORIZONTAL) { if (info.getState(dir) == AIR) { - info.setBlockPos(info.getPos().offset(dir), EndBlocks.MOSSY_GLOWSHROOM_FUR.getDefaultState().with(BlockFur.FACING, dir)); + info.setBlockPos(info.getPos().offset(dir), EndBlocks.MOSSY_GLOWSHROOM_FUR.getDefaultState().with(FurBlock.FACING, dir)); } } if (info.getStateDown().getBlock() != EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { - info.setBlockPos(info.getPos().down(), EndBlocks.MOSSY_GLOWSHROOM_FUR.getDefaultState().with(BlockFur.FACING, Direction.DOWN)); + info.setBlockPos(info.getPos().down(), EndBlocks.MOSSY_GLOWSHROOM_FUR.getDefaultState().with(FurBlock.FACING, Direction.DOWN)); } } return info.getState(); diff --git a/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java b/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java index 298e8960..807da9f7 100644 --- a/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java @@ -18,7 +18,7 @@ import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockFur; +import ru.betterend.blocks.basis.FurBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -107,7 +107,7 @@ public class TenaneaFeature extends DefaultFeature { MHelper.shuffle(DIRECTIONS, random); for (Direction d: DIRECTIONS) { if (info.getState(d).isAir()) { - info.setBlockPos(info.getPos().offset(d), outer.with(BlockFur.FACING, d)); + info.setBlockPos(info.getPos().offset(d), outer.with(FurBlock.FACING, d)); } } diff --git a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java index 62afa027..dd066c5d 100644 --- a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java @@ -16,8 +16,8 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import ru.betterend.blocks.BlockUmbrellaTreeCluster; -import ru.betterend.blocks.BlockUmbrellaTreeMembrane; +import ru.betterend.blocks.UmbrellaTreeClusterBlock; +import ru.betterend.blocks.UmbrellaTreeMembraneBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; @@ -44,9 +44,9 @@ public class UmbrellaTreeFeature extends DefaultFeature { if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; BlockState wood = EndBlocks.UMBRELLA_TREE.bark.getDefaultState(); - BlockState membrane = EndBlocks.UMBRELLA_TREE_MEMBRANE.getDefaultState().with(BlockUmbrellaTreeMembrane.COLOR, 1); - BlockState center = EndBlocks.UMBRELLA_TREE_MEMBRANE.getDefaultState().with(BlockUmbrellaTreeMembrane.COLOR, 0); - BlockState fruit = EndBlocks.UMBRELLA_TREE_CLUSTER.getDefaultState().with(BlockUmbrellaTreeCluster.NATURAL, true); + BlockState membrane = EndBlocks.UMBRELLA_TREE_MEMBRANE.getDefaultState().with(UmbrellaTreeMembraneBlock.COLOR, 1); + BlockState center = EndBlocks.UMBRELLA_TREE_MEMBRANE.getDefaultState().with(UmbrellaTreeMembraneBlock.COLOR, 0); + BlockState fruit = EndBlocks.UMBRELLA_TREE_CLUSTER.getDefaultState().with(UmbrellaTreeClusterBlock.NATURAL, true); float size = MHelper.randRange(10, 20, random); int count = (int) (size * 0.15F); @@ -117,7 +117,7 @@ public class UmbrellaTreeFeature extends DefaultFeature { } int color = MHelper.floor(d / min.radius * 7); color = MathHelper.clamp(color, 1, 7); - return info.getState().with(BlockUmbrellaTreeMembrane.COLOR, color); + return info.getState().with(UmbrellaTreeMembraneBlock.COLOR, color); } return info.getState(); }).fillRecursive(world, pos); @@ -182,7 +182,7 @@ public class UmbrellaTreeFeature extends DefaultFeature { mut.move(Direction.DOWN); if (world.isAir(mut)) { BlockState state = world.getBlockState(mut.up()); - if (state.isOf(EndBlocks.UMBRELLA_TREE_MEMBRANE) && state.get(BlockUmbrellaTreeMembrane.COLOR) < 2) { + if (state.isOf(EndBlocks.UMBRELLA_TREE_MEMBRANE) && state.get(UmbrellaTreeMembraneBlock.COLOR) < 2) { BlocksHelper.setWithoutUpdate(world, mut, fruit); } break; diff --git a/src/main/java/ru/betterend/world/structures/features/StructureGiantMossyGlowshroom.java b/src/main/java/ru/betterend/world/structures/features/StructureGiantMossyGlowshroom.java index 5c90977f..86c781e3 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructureGiantMossyGlowshroom.java +++ b/src/main/java/ru/betterend/world/structures/features/StructureGiantMossyGlowshroom.java @@ -6,8 +6,8 @@ import java.util.Random; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; -import ru.betterend.blocks.BlockMossyGlowshroomCap; -import ru.betterend.blocks.basis.BlockFur; +import ru.betterend.blocks.MossyGlowshroomCapBlock; +import ru.betterend.blocks.basis.FurBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; @@ -91,7 +91,7 @@ public class StructureGiantMossyGlowshroom extends SDFStructureFeature { .setPostProcess((info) -> { if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getState())) { if (random.nextBoolean() && info.getStateUp().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { - info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.getDefaultState().with(BlockMossyGlowshroomCap.TRANSITION, true)); + info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.getDefaultState().with(MossyGlowshroomCapBlock.TRANSITION, true)); return info.getState(); } else if (!EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateUp()) || !EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateDown())) { @@ -101,7 +101,7 @@ public class StructureGiantMossyGlowshroom extends SDFStructureFeature { } else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateDown().getBlock())) { - info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.getDefaultState().with(BlockMossyGlowshroomCap.TRANSITION, true)); + info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.getDefaultState().with(MossyGlowshroomCapBlock.TRANSITION, true)); return info.getState(); } @@ -111,12 +111,12 @@ public class StructureGiantMossyGlowshroom extends SDFStructureFeature { else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { for (Direction dir: BlocksHelper.HORIZONTAL) { if (info.getState(dir) == AIR) { - info.setBlockPos(info.getPos().offset(dir), EndBlocks.MOSSY_GLOWSHROOM_FUR.getDefaultState().with(BlockFur.FACING, dir)); + info.setBlockPos(info.getPos().offset(dir), EndBlocks.MOSSY_GLOWSHROOM_FUR.getDefaultState().with(FurBlock.FACING, dir)); } } if (info.getStateDown().getBlock() != EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { - info.setBlockPos(info.getPos().down(), EndBlocks.MOSSY_GLOWSHROOM_FUR.getDefaultState().with(BlockFur.FACING, Direction.DOWN)); + info.setBlockPos(info.getPos().down(), EndBlocks.MOSSY_GLOWSHROOM_FUR.getDefaultState().with(FurBlock.FACING, Direction.DOWN)); } } return info.getState(); From b53e76ce7bc889a09fee57a1176906fd5bcf9c8a Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 5 Jan 2021 04:04:23 +0300 Subject: [PATCH 105/463] Item classes rename --- src/main/java/ru/betterend/BetterEnd.java | 4 +- .../item/{ItemDrink.java => DrinkItem.java} | 4 +- ...ntedPetal.java => EnchantedPetalItem.java} | 5 +- .../item/{EndAxe.java => EndAxeItem.java} | 5 +- .../{EndHammer.java => EndHammerItem.java} | 5 +- .../item/{EndHoe.java => EndHoeItem.java} | 5 +- .../{EndPickaxe.java => EndPickaxeItem.java} | 5 +- ...ItemSpawnEgg.java => EndSpawnEggItem.java} | 4 +- ...alCrystal.java => EternalCrystalItem.java} | 5 +- .../{GuideBook.java => GuideBookItem.java} | 7 +-- .../item/{ => material}/EndArmorMaterial.java | 2 +- .../item/{ => material}/EndToolMaterial.java | 2 +- .../mixin/common/AbstractBlockMixin.java | 4 +- .../ru/betterend/recipe/CraftingRecipes.java | 4 +- .../java/ru/betterend/registry/EndItems.java | 60 +++++++++---------- 15 files changed, 57 insertions(+), 64 deletions(-) rename src/main/java/ru/betterend/item/{ItemDrink.java => DrinkItem.java} (84%) rename src/main/java/ru/betterend/item/{EnchantedPetal.java => EnchantedPetalItem.java} (84%) rename src/main/java/ru/betterend/item/{EndAxe.java => EndAxeItem.java} (80%) rename src/main/java/ru/betterend/item/{EndHammer.java => EndHammerItem.java} (93%) rename src/main/java/ru/betterend/item/{EndHoe.java => EndHoeItem.java} (67%) rename src/main/java/ru/betterend/item/{EndPickaxe.java => EndPickaxeItem.java} (79%) rename src/main/java/ru/betterend/item/{ItemSpawnEgg.java => EndSpawnEggItem.java} (65%) rename src/main/java/ru/betterend/item/{EternalCrystal.java => EternalCrystalItem.java} (64%) rename src/main/java/ru/betterend/item/{GuideBook.java => GuideBookItem.java} (93%) rename src/main/java/ru/betterend/item/{ => material}/EndArmorMaterial.java (95%) rename src/main/java/ru/betterend/item/{ => material}/EndToolMaterial.java (93%) diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index 80e43284..ad6d2922 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -9,7 +9,7 @@ import ru.betterend.config.Configs; import ru.betterend.effects.EndEnchantments; import ru.betterend.effects.EndPotions; import ru.betterend.integration.Integrations; -import ru.betterend.item.GuideBook; +import ru.betterend.item.GuideBookItem; import ru.betterend.recipe.AlloyingRecipes; import ru.betterend.recipe.CraftingRecipes; import ru.betterend.recipe.FurnaceRecipes; @@ -60,7 +60,7 @@ public class BetterEnd implements ModInitializer { GeneratorOptions.init(); if (hasGuideBook()) { - GuideBook.register(); + GuideBookItem.register(); } FabricLoader.getInstance().getEntrypoints("betterend", BetterEndPlugin.class).forEach(BetterEndPlugin::register); diff --git a/src/main/java/ru/betterend/item/ItemDrink.java b/src/main/java/ru/betterend/item/DrinkItem.java similarity index 84% rename from src/main/java/ru/betterend/item/ItemDrink.java rename to src/main/java/ru/betterend/item/DrinkItem.java index 21abce1a..27043142 100644 --- a/src/main/java/ru/betterend/item/ItemDrink.java +++ b/src/main/java/ru/betterend/item/DrinkItem.java @@ -8,8 +8,8 @@ import net.minecraft.util.TypedActionResult; import net.minecraft.util.UseAction; import net.minecraft.world.World; -public class ItemDrink extends PatternedItem { - public ItemDrink(Settings settings) { +public class DrinkItem extends PatternedItem { + public DrinkItem(Settings settings) { super(settings); } diff --git a/src/main/java/ru/betterend/item/EnchantedPetal.java b/src/main/java/ru/betterend/item/EnchantedPetalItem.java similarity index 84% rename from src/main/java/ru/betterend/item/EnchantedPetal.java rename to src/main/java/ru/betterend/item/EnchantedPetalItem.java index 8a6146a6..93e75b96 100644 --- a/src/main/java/ru/betterend/item/EnchantedPetal.java +++ b/src/main/java/ru/betterend/item/EnchantedPetalItem.java @@ -5,9 +5,8 @@ import net.minecraft.util.Rarity; import ru.betterend.patterns.Patterns; import ru.betterend.registry.EndItems; -public class EnchantedPetal extends PatternedItem { - - public EnchantedPetal() { +public class EnchantedPetalItem extends PatternedItem { + public EnchantedPetalItem() { super(EndItems.makeItemSettings().rarity(Rarity.RARE).maxCount(16)); } diff --git a/src/main/java/ru/betterend/item/EndAxe.java b/src/main/java/ru/betterend/item/EndAxeItem.java similarity index 80% rename from src/main/java/ru/betterend/item/EndAxe.java rename to src/main/java/ru/betterend/item/EndAxeItem.java index 7667dadd..8c5a4ac7 100644 --- a/src/main/java/ru/betterend/item/EndAxe.java +++ b/src/main/java/ru/betterend/item/EndAxeItem.java @@ -12,9 +12,8 @@ import net.minecraft.tag.Tag; import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; -public class EndAxe extends AxeItem implements DynamicAttributeTool, Patterned { - - public EndAxe(ToolMaterial material, float attackDamage, float attackSpeed, Settings settings) { +public class EndAxeItem extends AxeItem implements DynamicAttributeTool, Patterned { + public EndAxeItem(ToolMaterial material, float attackDamage, float attackSpeed, Settings settings) { super(material, attackDamage, attackSpeed, settings); } diff --git a/src/main/java/ru/betterend/item/EndHammer.java b/src/main/java/ru/betterend/item/EndHammerItem.java similarity index 93% rename from src/main/java/ru/betterend/item/EndHammer.java rename to src/main/java/ru/betterend/item/EndHammerItem.java index ff92a6bd..c739d346 100644 --- a/src/main/java/ru/betterend/item/EndHammer.java +++ b/src/main/java/ru/betterend/item/EndHammerItem.java @@ -30,13 +30,12 @@ import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; import ru.betterend.registry.EndTags; -public class EndHammer extends MiningToolItem implements DynamicAttributeTool, Patterned { - +public class EndHammerItem extends MiningToolItem implements DynamicAttributeTool, Patterned { public final static UUID ATTACK_KNOCKBACK_MODIFIER_ID = MathHelper.randomUuid(ThreadLocalRandom.current()); private final Multimap attributeModifiers; - public EndHammer(ToolMaterial material, float attackDamage, float attackSpeed, double knockback, Settings settings) { + public EndHammerItem(ToolMaterial material, float attackDamage, float attackSpeed, double knockback, Settings settings) { super(attackDamage, attackSpeed, material, Sets.newHashSet(), settings); Builder builder = ImmutableMultimap.builder(); diff --git a/src/main/java/ru/betterend/item/EndHoe.java b/src/main/java/ru/betterend/item/EndHoeItem.java similarity index 67% rename from src/main/java/ru/betterend/item/EndHoe.java rename to src/main/java/ru/betterend/item/EndHoeItem.java index c9a75032..55cb135e 100644 --- a/src/main/java/ru/betterend/item/EndHoe.java +++ b/src/main/java/ru/betterend/item/EndHoeItem.java @@ -5,9 +5,8 @@ import net.minecraft.item.ToolMaterial; import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; -public class EndHoe extends HoeItem implements Patterned { - - public EndHoe(ToolMaterial material, int attackDamage, float attackSpeed, Settings settings) { +public class EndHoeItem extends HoeItem implements Patterned { + public EndHoeItem(ToolMaterial material, int attackDamage, float attackSpeed, Settings settings) { super(material, attackDamage, attackSpeed, settings); } diff --git a/src/main/java/ru/betterend/item/EndPickaxe.java b/src/main/java/ru/betterend/item/EndPickaxeItem.java similarity index 79% rename from src/main/java/ru/betterend/item/EndPickaxe.java rename to src/main/java/ru/betterend/item/EndPickaxeItem.java index 750acb42..ce27a658 100644 --- a/src/main/java/ru/betterend/item/EndPickaxe.java +++ b/src/main/java/ru/betterend/item/EndPickaxeItem.java @@ -12,9 +12,8 @@ import net.minecraft.tag.Tag; import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; -public class EndPickaxe extends PickaxeItem implements DynamicAttributeTool, Patterned { - - public EndPickaxe(ToolMaterial material, int attackDamage, float attackSpeed, Settings settings) { +public class EndPickaxeItem extends PickaxeItem implements DynamicAttributeTool, Patterned { + public EndPickaxeItem(ToolMaterial material, int attackDamage, float attackSpeed, Settings settings) { super(material, attackDamage, attackSpeed, settings); } diff --git a/src/main/java/ru/betterend/item/ItemSpawnEgg.java b/src/main/java/ru/betterend/item/EndSpawnEggItem.java similarity index 65% rename from src/main/java/ru/betterend/item/ItemSpawnEgg.java rename to src/main/java/ru/betterend/item/EndSpawnEggItem.java index d1b0583f..0987e685 100644 --- a/src/main/java/ru/betterend/item/ItemSpawnEgg.java +++ b/src/main/java/ru/betterend/item/EndSpawnEggItem.java @@ -5,8 +5,8 @@ import net.minecraft.item.SpawnEggItem; import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; -public class ItemSpawnEgg extends SpawnEggItem implements Patterned { - public ItemSpawnEgg(EntityType type, int primaryColor, int secondaryColor, Settings settings) { +public class EndSpawnEggItem extends SpawnEggItem implements Patterned { + public EndSpawnEggItem(EntityType type, int primaryColor, int secondaryColor, Settings settings) { super(type, primaryColor, secondaryColor, settings); } diff --git a/src/main/java/ru/betterend/item/EternalCrystal.java b/src/main/java/ru/betterend/item/EternalCrystalItem.java similarity index 64% rename from src/main/java/ru/betterend/item/EternalCrystal.java rename to src/main/java/ru/betterend/item/EternalCrystalItem.java index eded04d0..1ad6bb40 100644 --- a/src/main/java/ru/betterend/item/EternalCrystal.java +++ b/src/main/java/ru/betterend/item/EternalCrystalItem.java @@ -3,9 +3,8 @@ package ru.betterend.item; import net.minecraft.util.Rarity; import ru.betterend.registry.EndItems; -public class EternalCrystal extends PatternedItem { - - public EternalCrystal() { +public class EternalCrystalItem extends PatternedItem { + public EternalCrystalItem() { super(EndItems.makeItemSettings().maxCount(16).rarity(Rarity.EPIC)); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/item/GuideBook.java b/src/main/java/ru/betterend/item/GuideBookItem.java similarity index 93% rename from src/main/java/ru/betterend/item/GuideBook.java rename to src/main/java/ru/betterend/item/GuideBookItem.java index 702c9cd5..17309d80 100644 --- a/src/main/java/ru/betterend/item/GuideBook.java +++ b/src/main/java/ru/betterend/item/GuideBookItem.java @@ -18,14 +18,13 @@ import ru.betterend.registry.EndItems; import ru.betterend.util.LangUtil; import vazkii.patchouli.api.PatchouliAPI; -public class GuideBook extends PatternedItem { - +public class GuideBookItem extends PatternedItem { public final static Identifier BOOK_ID = BetterEnd.makeID("guidebook"); - public static final Item GUIDE_BOOK = EndItems.registerItem(BOOK_ID, new GuideBook()); + public static final Item GUIDE_BOOK = EndItems.registerItem(BOOK_ID, new GuideBookItem()); public static void register() {} - public GuideBook() { + public GuideBookItem() { super(EndItems.makeItemSettings().maxCount(1)); } diff --git a/src/main/java/ru/betterend/item/EndArmorMaterial.java b/src/main/java/ru/betterend/item/material/EndArmorMaterial.java similarity index 95% rename from src/main/java/ru/betterend/item/EndArmorMaterial.java rename to src/main/java/ru/betterend/item/material/EndArmorMaterial.java index b3ae46e0..6c3b5cd9 100644 --- a/src/main/java/ru/betterend/item/EndArmorMaterial.java +++ b/src/main/java/ru/betterend/item/material/EndArmorMaterial.java @@ -1,4 +1,4 @@ -package ru.betterend.item; +package ru.betterend.item.material; import java.util.function.Supplier; diff --git a/src/main/java/ru/betterend/item/EndToolMaterial.java b/src/main/java/ru/betterend/item/material/EndToolMaterial.java similarity index 93% rename from src/main/java/ru/betterend/item/EndToolMaterial.java rename to src/main/java/ru/betterend/item/material/EndToolMaterial.java index 85dcc3e4..49584f64 100644 --- a/src/main/java/ru/betterend/item/EndToolMaterial.java +++ b/src/main/java/ru/betterend/item/material/EndToolMaterial.java @@ -1,4 +1,4 @@ -package ru.betterend.item; +package ru.betterend.item.material; import java.util.function.Supplier; diff --git a/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java b/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java index 68df0c6b..fa06fe62 100644 --- a/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java @@ -19,7 +19,7 @@ import net.minecraft.item.Items; import net.minecraft.loot.context.LootContext; import net.minecraft.loot.context.LootContextParameters; import net.minecraft.util.math.MathHelper; -import ru.betterend.item.EndHammer; +import ru.betterend.item.EndHammerItem; import ru.betterend.util.MHelper; @Mixin(AbstractBlock.class) @@ -29,7 +29,7 @@ public abstract class AbstractBlockMixin { public void getDroppedStacks(BlockState state, LootContext.Builder builder, CallbackInfoReturnable> info) { if (state.isOf(Blocks.GLOWSTONE)) { ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && tool.getItem() instanceof EndHammer) { + if (tool != null && tool.getItem() instanceof EndHammerItem) { int min = 3; int max = 4; int count = 0; diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index dc5704a5..c8c5b390 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -8,7 +8,7 @@ import net.minecraft.item.Items; import net.minecraft.potion.PotionUtil; import net.minecraft.potion.Potions; import ru.betterend.BetterEnd; -import ru.betterend.item.GuideBook; +import ru.betterend.item.GuideBookItem; import ru.betterend.recipe.builders.GridRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; @@ -142,7 +142,7 @@ public class CraftingRecipes { .build(); if (BetterEnd.hasGuideBook()) { - GridRecipe.make("guide_book", GuideBook.GUIDE_BOOK) + GridRecipe.make("guide_book", GuideBookItem.GUIDE_BOOK) .setShape("D", "B", "C") .addMaterial('D', EndItems.ENDER_DUST) .addMaterial('B', Items.BOOK) diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index 9492d3d4..9743614b 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -34,17 +34,17 @@ import net.minecraft.util.math.Direction; import net.minecraft.util.registry.Registry; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; -import ru.betterend.item.EnchantedPetal; -import ru.betterend.item.EndArmorMaterial; -import ru.betterend.item.EndAxe; -import ru.betterend.item.EndHammer; -import ru.betterend.item.EndHoe; -import ru.betterend.item.EndPickaxe; -import ru.betterend.item.EndToolMaterial; -import ru.betterend.item.EternalCrystal; -import ru.betterend.item.ItemDrink; -import ru.betterend.item.ItemSpawnEgg; +import ru.betterend.item.EnchantedPetalItem; +import ru.betterend.item.EndAxeItem; +import ru.betterend.item.EndHammerItem; +import ru.betterend.item.EndHoeItem; +import ru.betterend.item.EndPickaxeItem; +import ru.betterend.item.EternalCrystalItem; +import ru.betterend.item.DrinkItem; +import ru.betterend.item.EndSpawnEggItem; import ru.betterend.item.PatternedItem; +import ru.betterend.item.material.EndArmorMaterial; +import ru.betterend.item.material.EndToolMaterial; import ru.betterend.tab.CreativeTabs; import ru.betterend.util.TagHelper; @@ -66,8 +66,8 @@ public class EndItems { public final static Item CRYSTALLINE_SULPHUR = registerItem("crystalline_sulphur"); public final static Item HYDRALUX_PETAL = registerItem("hydralux_petal"); public final static Item GELATINE = registerItem("gelatine"); - public static final Item ETERNAL_CRYSTAL = registerItem("eternal_crystal", new EternalCrystal()); - public final static Item ENCHANTED_PETAL = registerItem("enchanted_petal", new EnchantedPetal()); + public static final Item ETERNAL_CRYSTAL = registerItem("eternal_crystal", new EternalCrystalItem()); + public final static Item ENCHANTED_PETAL = registerItem("enchanted_petal", new EnchantedPetalItem()); public final static Item LEATHER_STRIPE = registerItem("leather_stripe"); public final static Item LEATHER_WRAPPED_STICK = registerItem("leather_wrapped_stick"); @@ -88,20 +88,20 @@ public class EndItems { // Tools // public static final ToolItem TERMINITE_SHOVEL = registerTool("terminite_shovel", new ShovelItem(EndToolMaterial.TERMINITE, 1.5F, -3.0F, makeItemSettings())); public static final ToolItem TERMINITE_SWORD = registerTool("terminite_sword", new SwordItem(EndToolMaterial.TERMINITE, 3, -2.4F, makeItemSettings())); - public static final ToolItem TERMINITE_PICKAXE = registerTool("terminite_pickaxe", new EndPickaxe(EndToolMaterial.TERMINITE, 1, -2.8F, makeItemSettings())); - public static final ToolItem TERMINITE_AXE = registerTool("terminite_axe", new EndAxe(EndToolMaterial.TERMINITE, 6.0F, -3.0F, makeItemSettings())); - public static final ToolItem TERMINITE_HOE = registerTool("terminite_hoe", new EndHoe(EndToolMaterial.TERMINITE, -3, 0.0F, makeItemSettings())); - public static final ToolItem TERMINITE_HAMMER = registerTool("terminite_hammer", new EndHammer(EndToolMaterial.TERMINITE, 5.0F, -3.2F, 0.3D, makeItemSettings())); + public static final ToolItem TERMINITE_PICKAXE = registerTool("terminite_pickaxe", new EndPickaxeItem(EndToolMaterial.TERMINITE, 1, -2.8F, makeItemSettings())); + public static final ToolItem TERMINITE_AXE = registerTool("terminite_axe", new EndAxeItem(EndToolMaterial.TERMINITE, 6.0F, -3.0F, makeItemSettings())); + public static final ToolItem TERMINITE_HOE = registerTool("terminite_hoe", new EndHoeItem(EndToolMaterial.TERMINITE, -3, 0.0F, makeItemSettings())); + public static final ToolItem TERMINITE_HAMMER = registerTool("terminite_hammer", new EndHammerItem(EndToolMaterial.TERMINITE, 5.0F, -3.2F, 0.3D, makeItemSettings())); public static final ToolItem AETERNIUM_SHOVEL = registerTool("aeternium_shovel", new ShovelItem(EndToolMaterial.AETERNIUM, 1.5F, -3.0F, makeItemSettings())); public static final ToolItem AETERNIUM_SWORD = registerTool("aeternium_sword", new SwordItem(EndToolMaterial.AETERNIUM, 3, -2.4F, makeItemSettings())); - public static final ToolItem AETERNIUM_PICKAXE = registerTool("aeternium_pickaxe", new EndPickaxe(EndToolMaterial.AETERNIUM, 1, -2.8F, makeItemSettings())); - public static final ToolItem AETERNIUM_AXE = registerTool("aeternium_axe", new EndAxe(EndToolMaterial.AETERNIUM, 5.0F, -3.0F, makeItemSettings())); - public static final ToolItem AETERNIUM_HOE = registerTool("aeternium_hoe", new EndHoe(EndToolMaterial.AETERNIUM, -3, 0.0F, makeItemSettings())); - public static final ToolItem AETERNIUM_HAMMER = registerTool("aeternium_hammer", new EndHammer(EndToolMaterial.AETERNIUM, 6.0F, -3.0F, 0.3D, makeItemSettings())); - public static final ToolItem IRON_HAMMER = registerTool("iron_hammer", new EndHammer(ToolMaterials.IRON, 5.0F, -3.2F, 0.2D, makeItemSettings())); - public static final ToolItem GOLDEN_HAMMER = registerTool("golden_hammer", new EndHammer(ToolMaterials.GOLD, 4.5F, -3.4F, 0.3D, makeItemSettings())); - public static final ToolItem DIAMOND_HAMMER = registerTool("diamond_hammer", new EndHammer(ToolMaterials.DIAMOND, 5.5F, -3.1F, 0.2D, makeItemSettings())); - public static final ToolItem NETHERITE_HAMMER = registerTool("netherite_hammer", new EndHammer(ToolMaterials.NETHERITE, 5.0F, -3.0F, 0.2D, makeItemSettings())); + public static final ToolItem AETERNIUM_PICKAXE = registerTool("aeternium_pickaxe", new EndPickaxeItem(EndToolMaterial.AETERNIUM, 1, -2.8F, makeItemSettings())); + public static final ToolItem AETERNIUM_AXE = registerTool("aeternium_axe", new EndAxeItem(EndToolMaterial.AETERNIUM, 5.0F, -3.0F, makeItemSettings())); + public static final ToolItem AETERNIUM_HOE = registerTool("aeternium_hoe", new EndHoeItem(EndToolMaterial.AETERNIUM, -3, 0.0F, makeItemSettings())); + public static final ToolItem AETERNIUM_HAMMER = registerTool("aeternium_hammer", new EndHammerItem(EndToolMaterial.AETERNIUM, 6.0F, -3.0F, 0.3D, makeItemSettings())); + public static final ToolItem IRON_HAMMER = registerTool("iron_hammer", new EndHammerItem(ToolMaterials.IRON, 5.0F, -3.2F, 0.2D, makeItemSettings())); + public static final ToolItem GOLDEN_HAMMER = registerTool("golden_hammer", new EndHammerItem(ToolMaterials.GOLD, 4.5F, -3.4F, 0.3D, makeItemSettings())); + public static final ToolItem DIAMOND_HAMMER = registerTool("diamond_hammer", new EndHammerItem(ToolMaterials.DIAMOND, 5.5F, -3.1F, 0.2D, makeItemSettings())); + public static final ToolItem NETHERITE_HAMMER = registerTool("netherite_hammer", new EndHammerItem(ToolMaterials.NETHERITE, 5.0F, -3.0F, 0.2D, makeItemSettings())); // Food // public final static Item SHADOW_BERRY_RAW = registerFood("shadow_berry_raw", 4, 0.5F); @@ -174,13 +174,13 @@ public class EndItems { TagHelper.addTag((Tag.Identified) FabricToolTags.SHOVELS, item); } else if (item instanceof SwordItem) { TagHelper.addTag((Tag.Identified) FabricToolTags.SWORDS, item); - } else if (item instanceof EndPickaxe) { + } else if (item instanceof EndPickaxeItem) { TagHelper.addTag((Tag.Identified) FabricToolTags.PICKAXES, item); - } else if (item instanceof EndAxe) { + } else if (item instanceof EndAxeItem) { TagHelper.addTag((Tag.Identified) FabricToolTags.AXES, item); - } else if (item instanceof EndHoe) { + } else if (item instanceof EndHoeItem) { TagHelper.addTag((Tag.Identified) FabricToolTags.HOES, item); - } else if (item instanceof EndHammer) { + } else if (item instanceof EndHammerItem) { TagHelper.addTag((Tag.Identified) EndTags.HAMMERS, item); } @@ -188,7 +188,7 @@ public class EndItems { } public static Item registerEgg(String name, EntityType type, int background, int dots) { - SpawnEggItem item = new ItemSpawnEgg(type, background, dots, makeItemSettings()); + SpawnEggItem item = new EndSpawnEggItem(type, background, dots, makeItemSettings()); ItemDispenserBehavior behavior = new ItemDispenserBehavior() { public ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { Direction direction = pointer.getBlockState().get(DispenserBlock.FACING); @@ -215,7 +215,7 @@ public class EndItems { } public static Item registerDrink(String name) { - return registerItem(name, new ItemDrink(makeItemSettings().maxCount(1))); + return registerItem(name, new DrinkItem(makeItemSettings().maxCount(1))); } public static Settings makeItemSettings() { From 061dbac03adbed64eac815e11dbf6c7bd6bd7bbe Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 5 Jan 2021 04:21:54 +0300 Subject: [PATCH 106/463] Sky optimisation --- .../mixin/client/WorldRendererMixin.java | 36 +++++++++++-------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java index 65e3d800..d5a9911d 100644 --- a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java @@ -55,6 +55,10 @@ public class WorldRendererMixin { private static Vector3f axis3; private static Vector3f axis4; private static float time; + private static float time2; + private static float time3; + private static float blind02; + private static float blind06; private static boolean directOpenGL = false; @Shadow @@ -90,7 +94,9 @@ public class WorldRendererMixin { @Inject(method = "renderSky", at = @At("HEAD"), cancellable = true) private void renderBetterEndSky(MatrixStack matrices, float tickDelta, CallbackInfo info) { if (ClientOptions.isCustomSky() && client.world.getSkyProperties().getSkyType() == SkyProperties.SkyType.END) { - time = (ticks % 360000) * 0.001F; + time = (ticks % 360000) * 0.000017453292F; + time2 = time * 2; + time3 = time * 3; BackgroundRenderer.setFogBlack(); RenderSystem.enableTexture(); @@ -108,36 +114,38 @@ public class WorldRendererMixin { } float blindA = 1F - BackgroundInfo.blindness; + blind02 = blindA * 0.2F; + blind06 = blindA * 0.6F; if (blindA > 0) { matrices.push(); - matrices.multiply(new Quaternion(0, time, 0, true)); + matrices.multiply(new Quaternion(0, time, 0, false)); textureManager.bindTexture(HORIZON); renderBuffer(matrices, horizon, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, 0.7F * blindA); matrices.pop(); matrices.push(); - matrices.multiply(new Quaternion(0, -time, 0, true)); + matrices.multiply(new Quaternion(0, -time, 0, false)); textureManager.bindTexture(NEBULA_1); - renderBuffer(matrices, nebulas1, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, 0.2F * blindA); + renderBuffer(matrices, nebulas1, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, blind02); matrices.pop(); matrices.push(); - matrices.multiply(new Quaternion(0, time * 2, 0, true)); + matrices.multiply(new Quaternion(0, time2, 0, false)); textureManager.bindTexture(NEBULA_2); - renderBuffer(matrices, nebulas2, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, 0.2F * blindA); + renderBuffer(matrices, nebulas2, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, blind02); matrices.pop(); textureManager.bindTexture(STARS); matrices.push(); - matrices.multiply(axis3.getDegreesQuaternion(time)); - renderBuffer(matrices, stars3, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, 0.6F * blindA); + matrices.multiply(axis3.getRadialQuaternion(time)); + renderBuffer(matrices, stars3, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, blind06); matrices.pop(); matrices.push(); - matrices.multiply(axis4.getDegreesQuaternion(time * 2)); - renderBuffer(matrices, stars4, VertexFormats.POSITION_TEXTURE, 1F, 1F, 1F, 0.6F * blindA); + matrices.multiply(axis4.getRadialQuaternion(time2)); + renderBuffer(matrices, stars4, VertexFormats.POSITION_TEXTURE, 1F, 1F, 1F, blind06); matrices.pop(); } @@ -152,13 +160,13 @@ public class WorldRendererMixin { if (blindA > 0) { matrices.push(); - matrices.multiply(new Quaternion(axis1, time * 3, true)); - renderBuffer(matrices, stars1, VertexFormats.POSITION, 1, 1, 1, 0.6F * blindA); + matrices.multiply(axis1.getRadialQuaternion(time3)); + renderBuffer(matrices, stars1, VertexFormats.POSITION, 1, 1, 1, blind06); matrices.pop(); matrices.push(); - matrices.multiply(new Quaternion(axis2, time * 2, true)); - renderBuffer(matrices, stars2, VertexFormats.POSITION, 0.95F, 0.64F, 0.93F, 0.6F * blindA); + matrices.multiply(axis2.getRadialQuaternion(time2)); + renderBuffer(matrices, stars2, VertexFormats.POSITION, 0.95F, 0.64F, 0.93F, blind06); matrices.pop(); } From 02d43cb670978c35201e02a513365c0a03cf057b Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 5 Jan 2021 12:00:27 +0300 Subject: [PATCH 107/463] More generator options --- .../mixin/common/DimensionTypeMixin.java | 11 +++++++- .../mixin/common/EndPortalFeatureMixin.java | 26 +++++++++++++++++++ .../mixin/common/EndSpikeFeatureMixin.java | 26 +++++++++++++++++++ .../world/generator/GeneratorOptions.java | 18 +++++++++++++ .../resources/betterend.mixins.common.json | 2 ++ 5 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java create mode 100644 src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java diff --git a/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java b/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java index 0c462a2c..99a889f9 100644 --- a/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java +++ b/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java @@ -12,14 +12,23 @@ import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraft.world.gen.chunk.NoiseChunkGenerator; import ru.betterend.world.generator.BetterEndBiomeSource; +import ru.betterend.world.generator.GeneratorOptions; @Mixin(value = DimensionType.class, priority = 100) public class DimensionTypeMixin { @Inject(method = "createEndGenerator", at = @At("HEAD"), cancellable = true) - private static void replaceGenerator(Registry biomeRegistry, Registry chunkGeneratorSettingsRegistry, long seed, CallbackInfoReturnable info) { + private static void beReplaceGenerator(Registry biomeRegistry, Registry chunkGeneratorSettingsRegistry, long seed, CallbackInfoReturnable info) { info.setReturnValue(new NoiseChunkGenerator(new BetterEndBiomeSource(biomeRegistry, seed), seed, () -> { return (ChunkGeneratorSettings) chunkGeneratorSettingsRegistry.getOrThrow(ChunkGeneratorSettings.END); })); info.cancel(); } + + @Inject(method = "hasEnderDragonFight", at = @At("HEAD"), cancellable = true) + private void beHasEnderDragonFight(CallbackInfoReturnable info) { + if (!GeneratorOptions.hasDragonFights()) { + info.setReturnValue(false); + info.cancel(); + } + } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java new file mode 100644 index 00000000..c0592b43 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java @@ -0,0 +1,26 @@ +package ru.betterend.mixin.common; + +import java.util.Random; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.gen.feature.EndPortalFeature; +import ru.betterend.world.generator.GeneratorOptions; + +@Mixin(EndPortalFeature.class) +public class EndPortalFeatureMixin { + @Inject(method = "generate", at = @At("HEAD"), cancellable = true) + private void bePortalGenerate(StructureWorldAccess structureWorldAccess, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, DefaultFeatureConfig defaultFeatureConfig, CallbackInfoReturnable info) { + if (!GeneratorOptions.hasPortal()) { + info.setReturnValue(false); + info.cancel(); + } + } +} diff --git a/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java new file mode 100644 index 00000000..0b1a8eb1 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java @@ -0,0 +1,26 @@ +package ru.betterend.mixin.common; + +import java.util.Random; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.EndSpikeFeature; +import net.minecraft.world.gen.feature.EndSpikeFeatureConfig; +import ru.betterend.world.generator.GeneratorOptions; + +@Mixin(EndSpikeFeature.class) +public class EndSpikeFeatureMixin { + @Inject(method = "generate", at = @At("HEAD"), cancellable = true) + private void beSpikeGenerate(StructureWorldAccess structureWorldAccess, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, EndSpikeFeatureConfig endSpikeFeatureConfig, CallbackInfoReturnable info) { + if (!GeneratorOptions.hasPillars()) { + info.setReturnValue(false); + info.cancel(); + } + } +} diff --git a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java index fd6b1a8f..c12b6441 100644 --- a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java +++ b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java @@ -5,10 +5,16 @@ import ru.betterend.config.Configs; public class GeneratorOptions { private static int biomeSizeLand; private static int biomeSizeVoid; + private static boolean hasPortal; + private static boolean hasPillars; + private static boolean hasDragonFights; public static void init() { biomeSizeLand = Configs.GENERATOR_CONFIG.getIntRoot("biomeSizeLand", 256); biomeSizeVoid = Configs.GENERATOR_CONFIG.getIntRoot("biomeSizeVoid", 256); + hasPortal = Configs.GENERATOR_CONFIG.getBooleanRoot("hasPortal", true); + hasPillars = Configs.GENERATOR_CONFIG.getBooleanRoot("hasPillars", true); + hasDragonFights = Configs.GENERATOR_CONFIG.getBooleanRoot("hasDragonFights", true); } public static int getBiomeSizeLand() { @@ -18,4 +24,16 @@ public class GeneratorOptions { public static int getBiomeSizeVoid() { return biomeSizeVoid; } + + public static boolean hasPortal() { + return hasPortal; + } + + public static boolean hasPillars() { + return hasPillars; + } + + public static boolean hasDragonFights() { + return hasDragonFights; + } } diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index d3a8fe85..e63a15f7 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -15,8 +15,10 @@ "ComposterBlockAccessor", "ChorusFlowerBlockMixin", "LandPathNodeMakerMixin", + "EndPortalFeatureMixin", "ChorusPlantBlockMixin", "RecipeManagerAccessor", + "EndSpikeFeatureMixin", "MinecraftServerMixin", "TagGroupLoaderMixin", "EndermanEntityMixin", From 5c4895f757e57852b6219a29218a0441f90f1ba1 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 5 Jan 2021 12:07:56 +0300 Subject: [PATCH 108/463] Ability to swap Overworld and End --- .../mixin/common/MinecraftServerMixin.java | 22 +++++++++++++++++++ .../world/generator/GeneratorOptions.java | 6 +++++ 2 files changed, 28 insertions(+) diff --git a/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java b/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java index 14b87a78..960f7ee4 100644 --- a/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java @@ -1,8 +1,10 @@ package ru.betterend.mixin.common; import java.util.Collection; +import java.util.Map; import java.util.concurrent.CompletableFuture; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -13,13 +15,21 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.resource.ServerResourceManager; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.registry.RegistryKey; +import net.minecraft.world.World; import ru.betterend.recipe.EndRecipeManager; import ru.betterend.registry.EndBiomes; +import ru.betterend.world.generator.GeneratorOptions; @Mixin(MinecraftServer.class) public class MinecraftServerMixin { @Shadow private ServerResourceManager serverResourceManager; + + @Final + @Shadow + private Map, ServerWorld> worlds; @Inject(method = "reloadResources", at = @At(value = "RETURN"), cancellable = true) private void beOnReload(Collection collection, CallbackInfoReturnable> info) { @@ -31,6 +41,18 @@ public class MinecraftServerMixin { beInjectRecipes(); EndBiomes.initRegistry((MinecraftServer) (Object) this); } + + @Inject(method = "getOverworld", at = @At(value = "HEAD"), cancellable = true) + private final void beGetOverworld(CallbackInfoReturnable info) { + if (GeneratorOptions.swapOverworldToEnd()) { + ServerWorld world = worlds.get(World.END); + if (world == null) { + world = worlds.get(World.OVERWORLD); + } + info.setReturnValue(world); + info.cancel(); + } + } private void beInjectRecipes() { if (FabricLoader.getInstance().isModLoaded("kubejs")) { diff --git a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java index c12b6441..5df80e81 100644 --- a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java +++ b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java @@ -8,6 +8,7 @@ public class GeneratorOptions { private static boolean hasPortal; private static boolean hasPillars; private static boolean hasDragonFights; + private static boolean swapOverworldToEnd; public static void init() { biomeSizeLand = Configs.GENERATOR_CONFIG.getIntRoot("biomeSizeLand", 256); @@ -15,6 +16,7 @@ public class GeneratorOptions { hasPortal = Configs.GENERATOR_CONFIG.getBooleanRoot("hasPortal", true); hasPillars = Configs.GENERATOR_CONFIG.getBooleanRoot("hasPillars", true); hasDragonFights = Configs.GENERATOR_CONFIG.getBooleanRoot("hasDragonFights", true); + swapOverworldToEnd = Configs.GENERATOR_CONFIG.getBooleanRoot("swapOverworldToEnd", false); } public static int getBiomeSizeLand() { @@ -36,4 +38,8 @@ public class GeneratorOptions { public static boolean hasDragonFights() { return hasDragonFights; } + + public static boolean swapOverworldToEnd() { + return swapOverworldToEnd; + } } From 2a2641eea373d9798aaeaa35c24dadd84706fd1d Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 5 Jan 2021 16:33:19 +0300 Subject: [PATCH 109/463] Temporary disabled WIP integrations --- .../integration/ExtraPiecesIntegration.java | 17 +++++++++++++++++ .../ru/betterend/integration/Integrations.java | 3 ++- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 src/main/java/ru/betterend/integration/ExtraPiecesIntegration.java diff --git a/src/main/java/ru/betterend/integration/ExtraPiecesIntegration.java b/src/main/java/ru/betterend/integration/ExtraPiecesIntegration.java new file mode 100644 index 00000000..61fdc5db --- /dev/null +++ b/src/main/java/ru/betterend/integration/ExtraPiecesIntegration.java @@ -0,0 +1,17 @@ +package ru.betterend.integration; + +public class ExtraPiecesIntegration extends ModIntegration { + public ExtraPiecesIntegration() { + super("extrapieces"); + } + + @Override + public void register() { + //Class pieceSets = getClass("com.shnupbups.extrapieces.core.PieceSets"); + } + + @Override + public void addBiomes() { + + } +} diff --git a/src/main/java/ru/betterend/integration/Integrations.java b/src/main/java/ru/betterend/integration/Integrations.java index 063f9687..769c7598 100644 --- a/src/main/java/ru/betterend/integration/Integrations.java +++ b/src/main/java/ru/betterend/integration/Integrations.java @@ -9,7 +9,8 @@ import ru.betterend.integration.byg.BYGIntegration; public class Integrations { public static final List INTEGRATIONS = Lists.newArrayList(); public static final ModIntegration BYG = register(new BYGIntegration()); - public static final ModIntegration ADORN = register(new AdornIntegration()); + //public static final ModIntegration EXTRA_PIECES = register(new ExtraPiecesIntegration()); + //public static final ModIntegration ADORN = register(new AdornIntegration()); public static void register() { INTEGRATIONS.forEach((integration) -> { From 22b10fe134f31ff38d7f2101b39040f028c06101 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Wed, 6 Jan 2021 15:34:01 +0300 Subject: [PATCH 110/463] Changed Aeternium crafts --- src/main/java/ru/betterend/BetterEnd.java | 2 + .../integration/rei/REIAnvilCategory.java | 4 +- .../integration/rei/REIAnvilDisplay.java | 6 +- .../betterend/integration/rei/REIPlugin.java | 6 +- .../AnvilScreenHandlerExtended.java | 28 +- .../mixin/client/AnvilScreenMixin.java | 33 +- .../mixin/common/AnvilScreenHandlerMixin.java | 34 +- .../ru/betterend/recipe/AnvilRecipes.java | 59 +++ .../ru/betterend/recipe/CraftingRecipes.java | 29 +- .../ru/betterend/recipe/SmithingRecipes.java | 114 ++-- ...ilSmithingRecipe.java => AnvilRecipe.java} | 493 +++++++++--------- .../recipe/builders/SmithingTableRecipe.java | 101 ++++ .../java/ru/betterend/util/RecipeHelper.java | 9 + .../assets/betterend/lang/en_us.json | 9 + .../assets/betterend/lang/ru_ru.json | 9 + 15 files changed, 576 insertions(+), 360 deletions(-) create mode 100644 src/main/java/ru/betterend/recipe/AnvilRecipes.java rename src/main/java/ru/betterend/recipe/builders/{AnvilSmithingRecipe.java => AnvilRecipe.java} (76%) create mode 100644 src/main/java/ru/betterend/recipe/builders/SmithingTableRecipe.java diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index ad6d2922..9726fe23 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -15,6 +15,7 @@ import ru.betterend.recipe.CraftingRecipes; import ru.betterend.recipe.FurnaceRecipes; import ru.betterend.recipe.InfusionRecipes; import ru.betterend.recipe.SmithingRecipes; +import ru.betterend.recipe.AnvilRecipes; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndBlockEntities; import ru.betterend.registry.EndBlocks; @@ -51,6 +52,7 @@ public class BetterEnd implements ModInitializer { CraftingRecipes.register(); FurnaceRecipes.register(); AlloyingRecipes.register(); + AnvilRecipes.register(); SmithingRecipes.register(); InfusionRecipes.register(); EndStructures.register(); diff --git a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java index 88c9363b..9dfe08c1 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java @@ -52,8 +52,8 @@ public class REIAnvilCategory implements TransferRecipeCategory widgets.add(Widgets.createArrow(new Point(x + 24, y + 3))); widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width - 5, bounds.y + bounds.height - 12), new TranslatableText("category.rei.damage.amount&dmg", display.getDamage())).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); - widgets.add(Widgets.createSlot(new Point(x - 20, y + 3)).entries(inputEntries.get(0)).markInput()); - widgets.add(Widgets.createSlot(new Point(x + 1, y + 3)).entries(inputEntries.get(1)).markInput()); + widgets.add(Widgets.createSlot(new Point(x - 20, y + 3)).entries(inputEntries.get(1)).markInput()); + widgets.add(Widgets.createSlot(new Point(x + 1, y + 3)).entries(inputEntries.get(0)).markInput()); widgets.add(Widgets.createSlot(new Point(x + 61, y + 4)).entries(display.getResultingEntries().get(0)).disableBackground().markOutput()); return widgets; } diff --git a/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java b/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java index df870fc7..07618850 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java @@ -12,15 +12,15 @@ import me.shedaniel.rei.server.ContainerInfo; import net.minecraft.recipe.Recipe; import net.minecraft.screen.ScreenHandler; import net.minecraft.util.Identifier; -import ru.betterend.recipe.builders.AnvilSmithingRecipe; +import ru.betterend.recipe.builders.AnvilRecipe; public class REIAnvilDisplay implements TransferRecipeDisplay { - private AnvilSmithingRecipe recipe; + private AnvilRecipe recipe; private List> input; private List output; - public REIAnvilDisplay(AnvilSmithingRecipe recipe) { + public REIAnvilDisplay(AnvilRecipe recipe) { this.recipe = recipe; this.input = EntryStack.ofIngredients(recipe.getPreviewInputs()); this.output = Collections.singletonList(EntryStack.create(recipe.getOutput())); diff --git a/src/main/java/ru/betterend/integration/rei/REIPlugin.java b/src/main/java/ru/betterend/integration/rei/REIPlugin.java index ee84dea5..ad41e411 100644 --- a/src/main/java/ru/betterend/integration/rei/REIPlugin.java +++ b/src/main/java/ru/betterend/integration/rei/REIPlugin.java @@ -10,7 +10,7 @@ import net.minecraft.recipe.BlastingRecipe; import net.minecraft.util.Identifier; import ru.betterend.BetterEnd; import ru.betterend.recipe.builders.AlloyingRecipe; -import ru.betterend.recipe.builders.AnvilSmithingRecipe; +import ru.betterend.recipe.builders.AnvilRecipe; import ru.betterend.recipe.builders.InfusionRecipe; import ru.betterend.registry.EndBlocks; @@ -19,7 +19,7 @@ public class REIPlugin implements REIPluginV0 { public final static Identifier PLUGIN_ID = BetterEnd.makeID("rei_plugin"); public final static Identifier ALLOYING = AlloyingRecipe.ID; - public final static Identifier SMITHING = AnvilSmithingRecipe.ID; + public final static Identifier SMITHING = AnvilRecipe.ID; public final static Identifier INFUSION = InfusionRecipe.ID; public final static EntryStack END_STONE_SMELTER = EntryStack.create(EndBlocks.END_STONE_SMELTER); @@ -35,7 +35,7 @@ public class REIPlugin implements REIPluginV0 { public void registerRecipeDisplays(RecipeHelper recipeHelper) { recipeHelper.registerRecipes(ALLOYING, AlloyingRecipe.class, REIAlloyingDisplay::new); recipeHelper.registerRecipes(ALLOYING, BlastingRecipe.class, REIAlloyingDisplay::new); - recipeHelper.registerRecipes(SMITHING, AnvilSmithingRecipe.class, REIAnvilDisplay::new); + recipeHelper.registerRecipes(SMITHING, AnvilRecipe.class, REIAnvilDisplay::new); recipeHelper.registerRecipes(INFUSION, InfusionRecipe.class, REIInfusionDisplay::new); } diff --git a/src/main/java/ru/betterend/interfaces/AnvilScreenHandlerExtended.java b/src/main/java/ru/betterend/interfaces/AnvilScreenHandlerExtended.java index 2c6fbc71..37c04cf2 100644 --- a/src/main/java/ru/betterend/interfaces/AnvilScreenHandlerExtended.java +++ b/src/main/java/ru/betterend/interfaces/AnvilScreenHandlerExtended.java @@ -2,10 +2,30 @@ package ru.betterend.interfaces; import java.util.List; -import ru.betterend.recipe.builders.AnvilSmithingRecipe; +import ru.betterend.recipe.builders.AnvilRecipe; public interface AnvilScreenHandlerExtended { - public void be_updateCurrentRecipe(AnvilSmithingRecipe recipe); - public AnvilSmithingRecipe be_getCurrentRecipe(); - public List be_getRecipes(); + public void be_updateCurrentRecipe(AnvilRecipe recipe); + public AnvilRecipe be_getCurrentRecipe(); + public List be_getRecipes(); + + default void be_nextRecipe() { + List recipes = this.be_getRecipes(); + AnvilRecipe current = this.be_getCurrentRecipe(); + int i = recipes.indexOf(current) + 1; + if (i >= recipes.size()) { + i = 0; + } + this.be_updateCurrentRecipe(recipes.get(i)); + } + + default void be_previousRecipe() { + List recipes = this.be_getRecipes(); + AnvilRecipe current = this.be_getCurrentRecipe(); + int i = recipes.indexOf(current) - 1; + if (i <= 0) { + i = recipes.size() - 1; + } + this.be_updateCurrentRecipe(recipes.get(i)); + } } diff --git a/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java index 6716f669..a9d0a4c1 100644 --- a/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java +++ b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java @@ -25,7 +25,6 @@ import net.minecraft.text.Text; import net.minecraft.util.Identifier; import ru.betterend.interfaces.AnvilScreenHandlerExtended; -import ru.betterend.recipe.builders.AnvilSmithingRecipe; @Mixin(AnvilScreen.class) public class AnvilScreenMixin extends ForgingScreen { @@ -34,6 +33,7 @@ public class AnvilScreenMixin extends ForgingScreen { private TextFieldWidget nameField; private List be_buttons = Lists.newArrayList(); + private AnvilScreenHandlerExtended anvilHandler; public AnvilScreenMixin(AnvilScreenHandler handler, PlayerInventory playerInventory, Text title, Identifier texture) { @@ -43,23 +43,22 @@ public class AnvilScreenMixin extends ForgingScreen { @Inject(method = "setup", at = @At("TAIL")) protected void setup(CallbackInfo info) { this.be_buttons.clear(); - int x = (this.width - this.backgroundWidth) / 2; - int y = (this.height - this.backgroundHeight) / 2; - this.be_buttons.add(new ButtonWidget(x + 8, y + 45, 15, 20, new LiteralText("<"), (b) -> be_previousRecipe())); + int x = (width - backgroundWidth) / 2; + int y = (height - backgroundHeight) / 2; + this.anvilHandler = AnvilScreenHandlerExtended.class.cast(this.handler); + this.be_buttons.add(new ButtonWidget(x + 8, y + 45, 15, 20, new LiteralText("<"), (b) -> be_previousRecipe())); this.be_buttons.add(new ButtonWidget(x + 154, y + 45, 15, 20, new LiteralText(">"), (b) -> be_nextRecipe())); } @Inject(method = "renderForeground", at = @At("TAIL")) protected void renderForeground(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo info) { - AnvilScreenHandlerExtended handler = AnvilScreenHandlerExtended.class.cast(this.handler); - if (handler.be_getRecipes().size() > 1) { + if (anvilHandler.be_getRecipes().size() > 1) { this.be_buttons.forEach(button -> button.render(matrices, mouseX, mouseY, delta)); } } @Inject(method = "onSlotUpdate", at = @At("HEAD"), cancellable = true) public void onSlotUpdate(ScreenHandler handler, int slotId, ItemStack stack, CallbackInfo info) { - AnvilScreenHandlerExtended anvilHandler = AnvilScreenHandlerExtended.class.cast(this.handler); if (anvilHandler.be_getCurrentRecipe() != null) { this.nameField.setText(""); this.nameField.setEditable(false); @@ -69,31 +68,19 @@ public class AnvilScreenMixin extends ForgingScreen { } private void be_nextRecipe() { - AnvilScreenHandlerExtended handler = AnvilScreenHandlerExtended.class.cast(this.handler); - List recipes = handler.be_getRecipes(); - AnvilSmithingRecipe current = handler.be_getCurrentRecipe(); - int i = recipes.indexOf(current) + 1; - if (i == recipes.size()) { - i = 0; - } - handler.be_updateCurrentRecipe(recipes.get(i)); + this.anvilHandler.be_nextRecipe(); } private void be_previousRecipe() { - AnvilScreenHandlerExtended handler = AnvilScreenHandlerExtended.class.cast(this.handler); - List recipes = handler.be_getRecipes(); - AnvilSmithingRecipe current = handler.be_getCurrentRecipe(); - int i = recipes.indexOf(current) - 1; - if (i == 0) { - i = recipes.size() - 1; - } - handler.be_updateCurrentRecipe(recipes.get(i)); + this.anvilHandler.be_previousRecipe(); } @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { for (AbstractButtonWidget elem : be_buttons) { if (elem.mouseClicked(mouseX, mouseY, button)) { + int i = be_buttons.indexOf(elem); + this.client.interactionManager.clickButton(handler.syncId, i); return true; } } diff --git a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java index 9c1f528b..eba846f9 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java @@ -22,13 +22,13 @@ import net.minecraft.screen.ScreenHandlerContext; import net.minecraft.screen.ScreenHandlerType; import net.minecraft.tag.BlockTags; import ru.betterend.interfaces.AnvilScreenHandlerExtended; -import ru.betterend.recipe.builders.AnvilSmithingRecipe; +import ru.betterend.recipe.builders.AnvilRecipe; @Mixin(AnvilScreenHandler.class) public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler implements AnvilScreenHandlerExtended { - private List be_recipes = Collections.emptyList(); - private AnvilSmithingRecipe be_currentRecipe; + private List be_recipes = Collections.emptyList(); + private AnvilRecipe be_currentRecipe; public AnvilScreenHandlerMixin(ScreenHandlerType type, int syncId, PlayerInventory playerInventory, ScreenHandlerContext context) { @@ -44,7 +44,6 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler imple ItemStack output = this.be_currentRecipe.craft(input, player); if (!output.isEmpty()) { info.setReturnValue(true); - info.cancel(); } } } @@ -52,8 +51,8 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler imple @Inject(method = "onTakeOutput", at = @At("HEAD"), cancellable = true) protected void onTakeOutput(PlayerEntity player, ItemStack stack, CallbackInfoReturnable info) { if (be_currentRecipe != null) { - this.input.getStack(1).decrement(1); - this.updateResult(); + this.input.getStack(0).decrement(1); + this.onContentChanged(input); this.context.run((world, blockPos) -> { BlockState anvilState = world.getBlockState(blockPos); if (!player.abilities.creativeMode && anvilState.isIn(BlockTags.ANVIL) && player.getRandom().nextFloat() < 0.12F) { @@ -70,16 +69,15 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler imple } }); info.setReturnValue(stack); - info.cancel(); } } @Inject(method = "updateResult", at = @At("HEAD"), cancellable = true) public void updateOutput(CallbackInfo info) { RecipeManager recipeManager = this.player.world.getRecipeManager(); - this.be_recipes = recipeManager.getAllMatches(AnvilSmithingRecipe.TYPE, input, player.world); + this.be_recipes = recipeManager.getAllMatches(AnvilRecipe.TYPE, input, player.world); if (be_recipes.size() > 0) { - this.be_currentRecipe = recipeManager.getFirstMatch(AnvilSmithingRecipe.TYPE, input, player.world).get(); + this.be_currentRecipe = recipeManager.getFirstMatch(AnvilRecipe.TYPE, input, player.world).get(); this.be_updateResult(); info.cancel(); } @@ -92,6 +90,18 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler imple } } + @Override + public boolean onButtonClick(PlayerEntity player, int id) { + if (id == 0) { + this.be_previousRecipe(); + return true; + } else if (id == 1) { + this.be_nextRecipe(); + return true; + } + return super.onButtonClick(player, id); + } + private void be_updateResult() { if (be_currentRecipe == null) return; this.output.setStack(0, be_currentRecipe.craft(input)); @@ -99,18 +109,18 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler imple } @Override - public void be_updateCurrentRecipe(AnvilSmithingRecipe recipe) { + public void be_updateCurrentRecipe(AnvilRecipe recipe) { this.be_currentRecipe = recipe; this.be_updateResult(); } @Override - public AnvilSmithingRecipe be_getCurrentRecipe() { + public AnvilRecipe be_getCurrentRecipe() { return this.be_currentRecipe; } @Override - public List be_getRecipes() { + public List be_getRecipes() { return this.be_recipes; } } diff --git a/src/main/java/ru/betterend/recipe/AnvilRecipes.java b/src/main/java/ru/betterend/recipe/AnvilRecipes.java new file mode 100644 index 00000000..83207d3a --- /dev/null +++ b/src/main/java/ru/betterend/recipe/AnvilRecipes.java @@ -0,0 +1,59 @@ +package ru.betterend.recipe; + +import net.minecraft.item.Items; +import ru.betterend.recipe.builders.AnvilRecipe; +import ru.betterend.registry.EndItems; + +public class AnvilRecipes { + public static void register() { + AnvilRecipe.Builder.create("ender_pearl_to_dust") + .setInput(Items.ENDER_PEARL) + .setOutput(EndItems.ENDER_DUST) + .setLevel(4) + .setDamage(5) + .build(); + AnvilRecipe.Builder.create("ender_shard_to_dust") + .setInput(EndItems.ENDER_SHARD) + .setOutput(EndItems.ENDER_DUST) + .setLevel(2) + .setDamage(3) + .build(); + + AnvilRecipe.Builder.create("aeternium_axe_head") + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_AXE_HEAD) + .setLevel(4) + .setDamage(6) + .build(); + AnvilRecipe.Builder.create("aeternium_pickaxe_head") + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_PICKAXE_HEAD) + .setLevel(4) + .setDamage(6) + .build(); + AnvilRecipe.Builder.create("aeternium_shovel_head") + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_SHOVEL_HEAD) + .setLevel(4) + .setDamage(6) + .build(); + AnvilRecipe.Builder.create("aeternium_hoe_head") + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_HOE_HEAD) + .setLevel(4) + .setDamage(6) + .build(); + AnvilRecipe.Builder.create("aeternium_hammer_head") + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_HAMMER_HEAD) + .setLevel(4) + .setDamage(6) + .build(); + AnvilRecipe.Builder.create("aeternium_sword_blade") + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_SWORD_BLADE) + .setLevel(4) + .setDamage(6) + .build(); + } +} diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index c8c5b390..791ea368 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -17,6 +17,15 @@ import ru.betterend.registry.EndTags; public class CraftingRecipes { public static void register() { + if (BetterEnd.hasGuideBook()) { + GridRecipe.make("guide_book", GuideBookItem.GUIDE_BOOK) + .setShape("D", "B", "C") + .addMaterial('D', EndItems.ENDER_DUST) + .addMaterial('B', Items.BOOK) + .addMaterial('C', EndItems.CRYSTAL_SHARDS) + .build(); + } + GridRecipe.make("ender_pearl_to_block", EndBlocks.ENDER_BLOCK) .setShape("OO", "OO") .addMaterial('O', Items.ENDER_PEARL) @@ -79,17 +88,6 @@ public class CraftingRecipes { .setList("#") .build(); - registerHelmet(material, EndItems.AETERNIUM_INGOT, EndItems.AETERNIUM_HELMET); - registerChestplate(material, EndItems.AETERNIUM_INGOT, EndItems.AETERNIUM_CHESTPLATE); - registerLeggings(material, EndItems.AETERNIUM_INGOT, EndItems.AETERNIUM_LEGGINGS); - registerBoots(material, EndItems.AETERNIUM_INGOT, EndItems.AETERNIUM_BOOTS); - registerShovel(material, EndItems.AETERNIUM_INGOT, EndItems.AETERNIUM_SHOVEL); - registerSword(material, EndItems.AETERNIUM_INGOT, EndItems.AETERNIUM_SWORD); - registerPickaxe(material, EndItems.AETERNIUM_INGOT, EndItems.AETERNIUM_PICKAXE); - registerAxe(material, EndItems.AETERNIUM_INGOT, EndItems.AETERNIUM_AXE); - registerHoe(material, EndItems.AETERNIUM_INGOT, EndItems.AETERNIUM_HOE); - registerHammer(material, EndItems.AETERNIUM_INGOT, EndItems.AETERNIUM_HAMMER); - registerHammer("iron", Items.IRON_INGOT, EndItems.IRON_HAMMER); registerHammer("golden", Items.GOLD_INGOT, EndItems.GOLDEN_HAMMER); registerHammer("diamond", Items.DIAMOND, EndItems.DIAMOND_HAMMER); @@ -141,15 +139,6 @@ public class CraftingRecipes { .addMaterial('B', EndItems.SHADOW_BERRY_COOKED) .build(); - if (BetterEnd.hasGuideBook()) { - GridRecipe.make("guide_book", GuideBookItem.GUIDE_BOOK) - .setShape("D", "B", "C") - .addMaterial('D', EndItems.ENDER_DUST) - .addMaterial('B', Items.BOOK) - .addMaterial('C', EndItems.CRYSTAL_SHARDS) - .build(); - } - GridRecipe.make("sulphur_gunpowder", Items.GUNPOWDER).setList("SCB").addMaterial('S', EndItems.CRYSTALLINE_SULPHUR).addMaterial('C', Items.COAL, Items.CHARCOAL).addMaterial('B', Items.BONE_MEAL).build(); GridRecipe.make("dense_emerald_ice", EndBlocks.DENSE_EMERALD_ICE).setShape("##", "##").addMaterial('#', EndBlocks.EMERALD_ICE).build(); diff --git a/src/main/java/ru/betterend/recipe/SmithingRecipes.java b/src/main/java/ru/betterend/recipe/SmithingRecipes.java index c5ab7711..43a795f0 100644 --- a/src/main/java/ru/betterend/recipe/SmithingRecipes.java +++ b/src/main/java/ru/betterend/recipe/SmithingRecipes.java @@ -1,47 +1,67 @@ -package ru.betterend.recipe; - -import net.minecraft.item.Items; -import ru.betterend.recipe.builders.AnvilSmithingRecipe; -import ru.betterend.registry.EndItems; - -public class SmithingRecipes { - public static void register() { - AnvilSmithingRecipe.Builder.create("ender_pearl_to_dust") - .setInput(Items.ENDER_PEARL) - .setOutput(EndItems.ENDER_DUST, 1) - .setLevel(4) - .setDamage(5) - .build(); - AnvilSmithingRecipe.Builder.create("ender_shard_to_dust") - .setInput(EndItems.ENDER_SHARD) - .setOutput(EndItems.ENDER_DUST, 1) - .setLevel(2) - .setDamage(3) - .build(); - - AnvilSmithingRecipe.Builder.create("aeternium_axe_head") - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_AXE_HEAD, 1) - .setLevel(4) - .setDamage(6) - .build(); - AnvilSmithingRecipe.Builder.create("aeternium_pickaxe_head") - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_PICKAXE_HEAD, 1) - .setLevel(4) - .setDamage(6) - .build(); - AnvilSmithingRecipe.Builder.create("aeternium_shovel_head") - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_SHOVEL_HEAD, 1) - .setLevel(4) - .setDamage(6) - .build(); - AnvilSmithingRecipe.Builder.create("aeternium_hoe_head") - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_HOE_HEAD, 1) - .setLevel(4) - .setDamage(6) - .build(); - } -} +package ru.betterend.recipe; + +import ru.betterend.recipe.builders.SmithingTableRecipe; +import ru.betterend.registry.EndItems; + +public class SmithingRecipes { + + public static void register() { + SmithingTableRecipe.create("aeternium_sword_handle") + .setResult(EndItems.AETERNIUM_SWORD_HANDLE) + .setBase(EndItems.TERMINITE_INGOT) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); + + SmithingTableRecipe.create("aeternium_sword") + .setResult(EndItems.AETERNIUM_SWORD) + .setBase(EndItems.AETERNIUM_SWORD_BLADE) + .setAddition(EndItems.AETERNIUM_SWORD_HANDLE) + .build(); + SmithingTableRecipe.create("aeternium_pickaxe") + .setResult(EndItems.AETERNIUM_PICKAXE) + .setBase(EndItems.AETERNIUM_PICKAXE_HEAD) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); + SmithingTableRecipe.create("aeternium_axe") + .setResult(EndItems.AETERNIUM_AXE) + .setBase(EndItems.AETERNIUM_AXE_HEAD) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); + SmithingTableRecipe.create("aeternium_shovel") + .setResult(EndItems.AETERNIUM_SHOVEL) + .setBase(EndItems.AETERNIUM_SHOVEL_HEAD) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); + SmithingTableRecipe.create("aeternium_hoe") + .setResult(EndItems.AETERNIUM_HOE) + .setBase(EndItems.AETERNIUM_HOE_HEAD) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); + SmithingTableRecipe.create("aeternium_hammer") + .setResult(EndItems.AETERNIUM_HAMMER) + .setBase(EndItems.AETERNIUM_HAMMER_HEAD) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); + + SmithingTableRecipe.create("aeternium_helmet") + .setResult(EndItems.AETERNIUM_HELMET) + .setBase(EndItems.TERMINITE_HELMET) + .setAddition(EndItems.AETERNIUM_INGOT) + .build(); + SmithingTableRecipe.create("aeternium_chestplate") + .setResult(EndItems.AETERNIUM_CHESTPLATE) + .setBase(EndItems.TERMINITE_CHESTPLATE) + .setAddition(EndItems.AETERNIUM_INGOT) + .build(); + SmithingTableRecipe.create("aeternium_leggings") + .setResult(EndItems.AETERNIUM_LEGGINGS) + .setBase(EndItems.TERMINITE_LEGGINGS) + .setAddition(EndItems.AETERNIUM_INGOT) + .build(); + SmithingTableRecipe.create("aeternium_boots") + .setResult(EndItems.AETERNIUM_BOOTS) + .setBase(EndItems.TERMINITE_BOOTS) + .setAddition(EndItems.AETERNIUM_INGOT) + .build(); + } +} diff --git a/src/main/java/ru/betterend/recipe/builders/AnvilSmithingRecipe.java b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java similarity index 76% rename from src/main/java/ru/betterend/recipe/builders/AnvilSmithingRecipe.java rename to src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java index fc32a204..3af522cb 100644 --- a/src/main/java/ru/betterend/recipe/builders/AnvilSmithingRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java @@ -1,246 +1,247 @@ -package ru.betterend.recipe.builders; - -import com.google.gson.JsonObject; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.Item; -import net.minecraft.item.ItemConvertible; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ToolItem; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.recipe.Ingredient; -import net.minecraft.recipe.Recipe; -import net.minecraft.recipe.RecipeSerializer; -import net.minecraft.recipe.RecipeType; -import net.minecraft.tag.Tag; -import net.minecraft.util.Identifier; -import net.minecraft.util.JsonHelper; -import net.minecraft.util.collection.DefaultedList; -import net.minecraft.world.World; -import ru.betterend.BetterEnd; -import ru.betterend.config.Configs; -import ru.betterend.recipe.EndRecipeManager; -import ru.betterend.registry.EndTags; -import ru.betterend.util.ItemUtil; -import ru.betterend.util.RecipeHelper; - -public class AnvilSmithingRecipe implements Recipe { - - public final static String GROUP = "smithing"; - public final static RecipeType TYPE = EndRecipeManager.registerType(GROUP); - public final static Serializer SERIALIZER = EndRecipeManager.registerSerializer(GROUP, new Serializer()); - public final static Identifier ID = BetterEnd.makeID(GROUP); - - private final Identifier id; - private final Ingredient input; - private final ItemStack output; - private final int damage; - private final int level; - - public AnvilSmithingRecipe(Identifier identifier, Ingredient input, ItemStack output, int level, int damage) { - this.id = identifier; - this.input = input; - this.output = output; - this.level = level; - this.damage = damage; - } - - @Override - public RecipeSerializer getSerializer() { - return SERIALIZER; - } - - @Override - public ItemStack getOutput() { - return this.output; - } - - @Override - public boolean matches(Inventory craftingInventory, World world) { - return this.matches(craftingInventory); - } - - @Override - public ItemStack craft(Inventory craftingInventory) { - return this.output.copy(); - } - - public ItemStack craft(Inventory craftingInventory, PlayerEntity player) { - if (!player.isCreative()) { - ItemStack hammer = craftingInventory.getStack(0); - int damage = hammer.getDamage() + this.damage; - if (damage >= hammer.getMaxDamage()) return ItemStack.EMPTY; - hammer.damage(this.damage, player, entity -> { - entity.sendEquipmentBreakStatus(null); - }); - } - return this.craft(craftingInventory); - } - - public boolean matches(Inventory craftingInventory) { - ItemStack hammer = craftingInventory.getStack(0); - if (hammer.isEmpty() || !EndTags.HAMMERS.contains(hammer.getItem())) { - return false; - } - int level = ((ToolItem) hammer.getItem()).getMaterial().getMiningLevel(); - return level >= this.level && this.input.test(craftingInventory.getStack(1)); - } - - public int getDamage() { - return this.damage; - } - - @Override - public DefaultedList getPreviewInputs() { - DefaultedList defaultedList = DefaultedList.of(); - defaultedList.add(Ingredient.ofStacks(EndTags.HAMMERS.values().stream().filter(hammer -> { - return ((ToolItem) hammer).getMaterial().getMiningLevel() >= level; - }).map(ItemStack::new))); - defaultedList.add(input); - - return defaultedList; - } - - @Override - @Environment(EnvType.CLIENT) - public boolean fits(int width, int height) { - return true; - } - - @Override - public Identifier getId() { - return this.id; - } - - @Override - public RecipeType getType() { - return TYPE; - } - - @Override - public boolean isIgnoredInRecipeBook() { - return true; - } - - public static class Builder { - private final static Builder INSTANCE = new Builder(); - private static boolean exist; - - public static Builder create(String id) { - return create(BetterEnd.makeID(id)); - } - - public static Builder create(Identifier id) { - INSTANCE.id = id; - INSTANCE.input = null; - INSTANCE.output = null; - INSTANCE.level = 1; - INSTANCE.damage = 1; - exist = Configs.RECIPE_CONFIG.getBoolean("anvil", id.getPath(), true); - - return INSTANCE; - } - - private Identifier id; - private Ingredient input; - private ItemStack output; - private int level = 1; - private int damage = 1; - private boolean alright = true; - - private Builder() {} - - public Builder setInput(ItemConvertible... inputItems) { - for (ItemConvertible item : inputItems) { - this.alright &= RecipeHelper.exists(item); - } - this.setInput(Ingredient.ofItems(inputItems)); - return this; - } - - public Builder setInput(Tag inputTag) { - this.setInput(Ingredient.fromTag(inputTag)); - return this; - } - - public Builder setInput(Ingredient ingredient) { - this.input = ingredient; - return this; - } - - public Builder setOutput(ItemConvertible output, int amount) { - this.alright &= RecipeHelper.exists(output); - this.output = new ItemStack(output, amount); - return this; - } - - public Builder setLevel(int level) { - this.level = level; - return this; - } - - public Builder setDamage(int damage) { - this.damage = damage; - return this; - } - - public void build() { - if (exist) { - if (input == null) { - BetterEnd.LOGGER.warning("Input for Smithing recipe can't be 'null', recipe {} will be ignored!", id); - return; - } - if(output == null) { - BetterEnd.LOGGER.warning("Output for Smithing recipe can't be 'null', recipe {} will be ignored!", id); - return; - } - if (EndRecipeManager.getRecipe(TYPE, id) != null) { - BetterEnd.LOGGER.warning("Can't add Smithing recipe! Id {} already exists!", id); - return; - } - if (!alright) { - BetterEnd.LOGGER.debug("Can't add Smithing recipe {}! Ingeredient or output not exists.", id); - return; - } - EndRecipeManager.addRecipe(TYPE, new AnvilSmithingRecipe(id, input, output, level, damage)); - } - } - } - - public static class Serializer implements RecipeSerializer { - @Override - public AnvilSmithingRecipe read(Identifier id, JsonObject json) { - Ingredient input = Ingredient.fromJson(json.get("input")); - JsonObject result = JsonHelper.getObject(json, "result"); - ItemStack output = ItemUtil.fromJsonRecipe(result); - if (output == null) { - throw new IllegalStateException("Output item does not exists!"); - } - int level = JsonHelper.getInt(json, "level", 1); - int damage = JsonHelper.getInt(json, "damage", 1); - - return new AnvilSmithingRecipe(id, input, output, level, damage); - } - - @Override - public AnvilSmithingRecipe read(Identifier id, PacketByteBuf packetBuffer) { - Ingredient input = Ingredient.fromPacket(packetBuffer); - ItemStack output = packetBuffer.readItemStack(); - int level = packetBuffer.readVarInt(); - int damage = packetBuffer.readVarInt(); - - return new AnvilSmithingRecipe(id, input, output, level, damage); - } - - @Override - public void write(PacketByteBuf packetBuffer, AnvilSmithingRecipe recipe) { - recipe.input.write(packetBuffer); - packetBuffer.writeItemStack(recipe.output); - packetBuffer.writeVarInt(recipe.level); - packetBuffer.writeVarInt(recipe.damage); - } - } -} +package ru.betterend.recipe.builders; + +import com.google.gson.JsonObject; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.Inventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemConvertible; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ToolItem; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.recipe.Ingredient; +import net.minecraft.recipe.Recipe; +import net.minecraft.recipe.RecipeSerializer; +import net.minecraft.recipe.RecipeType; +import net.minecraft.tag.Tag; +import net.minecraft.util.Identifier; +import net.minecraft.util.JsonHelper; +import net.minecraft.util.collection.DefaultedList; +import net.minecraft.world.World; +import ru.betterend.BetterEnd; +import ru.betterend.config.Configs; +import ru.betterend.recipe.EndRecipeManager; +import ru.betterend.registry.EndTags; +import ru.betterend.util.ItemUtil; +import ru.betterend.util.RecipeHelper; + +public class AnvilRecipe implements Recipe { + + public final static String GROUP = "smithing"; + public final static RecipeType TYPE = EndRecipeManager.registerType(GROUP); + public final static Serializer SERIALIZER = EndRecipeManager.registerSerializer(GROUP, new Serializer()); + public final static Identifier ID = BetterEnd.makeID(GROUP); + + private final Identifier id; + private final Ingredient input; + private final ItemStack output; + private final int damage; + private final int level; + + public AnvilRecipe(Identifier identifier, Ingredient input, ItemStack output, int level, int damage) { + this.id = identifier; + this.input = input; + this.output = output; + this.level = level; + this.damage = damage; + } + + @Override + public RecipeSerializer getSerializer() { + return SERIALIZER; + } + + @Override + public ItemStack getOutput() { + return this.output; + } + + @Override + public boolean matches(Inventory craftingInventory, World world) { + return this.matches(craftingInventory); + } + + @Override + public ItemStack craft(Inventory craftingInventory) { + return this.output.copy(); + } + + public ItemStack craft(Inventory craftingInventory, PlayerEntity player) { + if (!player.isCreative()) { + ItemStack hammer = craftingInventory.getStack(1); + int damage = hammer.getDamage() + this.damage; + if (damage >= hammer.getMaxDamage()) return ItemStack.EMPTY; + hammer.damage(this.damage, player, entity -> { + entity.sendEquipmentBreakStatus(null); + }); + } + return this.craft(craftingInventory); + } + + public boolean matches(Inventory craftingInventory) { + ItemStack hammer = craftingInventory.getStack(1); + if (hammer.isEmpty() || !EndTags.HAMMERS.contains(hammer.getItem())) { + return false; + } + int level = ((ToolItem) hammer.getItem()).getMaterial().getMiningLevel(); + return level >= this.level && this.input.test(craftingInventory.getStack(0)); + } + + public int getDamage() { + return this.damage; + } + + @Override + public DefaultedList getPreviewInputs() { + DefaultedList defaultedList = DefaultedList.of(); + defaultedList.add(Ingredient.ofStacks(EndTags.HAMMERS.values().stream().filter(hammer -> { + return ((ToolItem) hammer).getMaterial().getMiningLevel() >= level; + }).map(ItemStack::new))); + defaultedList.add(input); + + return defaultedList; + } + + @Override + @Environment(EnvType.CLIENT) + public boolean fits(int width, int height) { + return true; + } + + @Override + public Identifier getId() { + return this.id; + } + + @Override + public RecipeType getType() { + return TYPE; + } + + @Override + public boolean isIgnoredInRecipeBook() { + return true; + } + + public static class Builder { + private final static Builder INSTANCE = new Builder(); + + public static Builder create(String id) { + return create(BetterEnd.makeID(id)); + } + + public static Builder create(Identifier id) { + INSTANCE.id = id; + INSTANCE.input = null; + INSTANCE.output = null; + INSTANCE.level = 1; + INSTANCE.damage = 1; + INSTANCE.alright = true; + + return INSTANCE; + } + + private Identifier id; + private Ingredient input; + private ItemStack output; + private int level = 1; + private int damage = 1; + private boolean alright; + + private Builder() {} + + public Builder setInput(ItemConvertible... inputItems) { + this.alright &= RecipeHelper.exists(inputItems); + this.setInput(Ingredient.ofItems(inputItems)); + return this; + } + + public Builder setInput(Tag inputTag) { + this.setInput(Ingredient.fromTag(inputTag)); + return this; + } + + public Builder setInput(Ingredient ingredient) { + this.input = ingredient; + return this; + } + + public Builder setOutput(ItemConvertible output) { + return this.setOutput(output, 1); + } + + public Builder setOutput(ItemConvertible output, int amount) { + this.alright &= RecipeHelper.exists(output); + this.output = new ItemStack(output, amount); + return this; + } + + public Builder setLevel(int level) { + this.level = level; + return this; + } + + public Builder setDamage(int damage) { + this.damage = damage; + return this; + } + + public void build() { + if (Configs.RECIPE_CONFIG.getBoolean("anvil", id.getPath(), true)) { + if (input == null) { + BetterEnd.LOGGER.warning("Input for Anvil recipe can't be 'null', recipe {} will be ignored!", id); + return; + } + if(output == null) { + BetterEnd.LOGGER.warning("Output for Anvil recipe can't be 'null', recipe {} will be ignored!", id); + return; + } + if (EndRecipeManager.getRecipe(TYPE, id) != null) { + BetterEnd.LOGGER.warning("Can't add Anvil recipe! Id {} already exists!", id); + return; + } + if (!alright) { + BetterEnd.LOGGER.debug("Can't add Anvil recipe {}! Ingeredient or output not exists.", id); + return; + } + EndRecipeManager.addRecipe(TYPE, new AnvilRecipe(id, input, output, level, damage)); + } + } + } + + public static class Serializer implements RecipeSerializer { + @Override + public AnvilRecipe read(Identifier id, JsonObject json) { + Ingredient input = Ingredient.fromJson(json.get("input")); + JsonObject result = JsonHelper.getObject(json, "result"); + ItemStack output = ItemUtil.fromJsonRecipe(result); + if (output == null) { + throw new IllegalStateException("Output item does not exists!"); + } + int level = JsonHelper.getInt(json, "level", 1); + int damage = JsonHelper.getInt(json, "damage", 1); + + return new AnvilRecipe(id, input, output, level, damage); + } + + @Override + public AnvilRecipe read(Identifier id, PacketByteBuf packetBuffer) { + Ingredient input = Ingredient.fromPacket(packetBuffer); + ItemStack output = packetBuffer.readItemStack(); + int level = packetBuffer.readVarInt(); + int damage = packetBuffer.readVarInt(); + + return new AnvilRecipe(id, input, output, level, damage); + } + + @Override + public void write(PacketByteBuf packetBuffer, AnvilRecipe recipe) { + recipe.input.write(packetBuffer); + packetBuffer.writeItemStack(recipe.output); + packetBuffer.writeVarInt(recipe.level); + packetBuffer.writeVarInt(recipe.damage); + } + } +} diff --git a/src/main/java/ru/betterend/recipe/builders/SmithingTableRecipe.java b/src/main/java/ru/betterend/recipe/builders/SmithingTableRecipe.java new file mode 100644 index 00000000..7bde239e --- /dev/null +++ b/src/main/java/ru/betterend/recipe/builders/SmithingTableRecipe.java @@ -0,0 +1,101 @@ +package ru.betterend.recipe.builders; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemConvertible; +import net.minecraft.item.ItemStack; +import net.minecraft.recipe.Ingredient; +import net.minecraft.recipe.RecipeType; +import net.minecraft.recipe.SmithingRecipe; +import net.minecraft.tag.Tag; +import net.minecraft.util.Identifier; + +import ru.betterend.BetterEnd; +import ru.betterend.config.Configs; +import ru.betterend.recipe.EndRecipeManager; +import ru.betterend.util.RecipeHelper; + +public class SmithingTableRecipe { + + private final static SmithingTableRecipe BUILDER = new SmithingTableRecipe(); + private final static RecipeType TYPE = RecipeType.SMITHING; + + public static SmithingTableRecipe create(String name) { + return create(BetterEnd.makeID(name)); + } + + public static SmithingTableRecipe create(Identifier id) { + BUILDER.id = id; + BUILDER.base = null; + BUILDER.addition = null; + BUILDER.result = null; + BUILDER.alright = true; + + return BUILDER; + } + + private Identifier id; + private Ingredient base; + private Ingredient addition; + private ItemStack result; + private boolean alright; + + private SmithingTableRecipe() {} + + public SmithingTableRecipe setResult(ItemConvertible item) { + return this.setResult(item, 1); + } + + public SmithingTableRecipe setResult(ItemConvertible item, int count) { + this.alright &= RecipeHelper.exists(item); + this.result = new ItemStack(item, count); + return this; + } + + public SmithingTableRecipe setBase(ItemConvertible... items) { + this.alright &= RecipeHelper.exists(items); + this.base = Ingredient.ofItems(items); + return this; + } + + public SmithingTableRecipe setBase(Tag tag) { + this.base = (Ingredient.fromTag(tag)); + return this; + } + + public SmithingTableRecipe setAddition(ItemConvertible... items) { + this.alright &= RecipeHelper.exists(items); + this.addition = Ingredient.ofItems(items); + return this; + } + + public SmithingTableRecipe setAddition(Tag tag) { + this.addition = (Ingredient.fromTag(tag)); + return this; + } + + public void build() { + if (Configs.RECIPE_CONFIG.getBoolean("smithing", id.getPath(), true)) { + if (base == null) { + BetterEnd.LOGGER.warning("Base input for Smithing recipe can't be 'null', recipe {} will be ignored!", id); + return; + } + if (addition == null) { + BetterEnd.LOGGER.warning("Addition input for Smithing recipe can't be 'null', recipe {} will be ignored!", id); + return; + } + if(result == null) { + BetterEnd.LOGGER.warning("Result for Smithing recipe can't be 'null', recipe {} will be ignored!", id); + return; + } + if (EndRecipeManager.getRecipe(TYPE, id) != null) { + BetterEnd.LOGGER.warning("Can't add Smithing recipe! Id {} already exists!", id); + return; + } + if (!alright) { + BetterEnd.LOGGER.debug("Can't add Smithing recipe {}! Ingeredients or output not exists.", id); + return; + } + EndRecipeManager.addRecipe(TYPE, new SmithingRecipe(id, base, addition, result)); + } + } +} diff --git a/src/main/java/ru/betterend/util/RecipeHelper.java b/src/main/java/ru/betterend/util/RecipeHelper.java index 36696623..a95a372c 100644 --- a/src/main/java/ru/betterend/util/RecipeHelper.java +++ b/src/main/java/ru/betterend/util/RecipeHelper.java @@ -12,4 +12,13 @@ public class RecipeHelper { return Registry.ITEM.getId(item.asItem()) != Registry.ITEM.getDefaultId(); } } + + public static boolean exists(ItemConvertible... items) { + for (ItemConvertible item : items) { + if (!exists(item)) { + return false; + } + } + return true; + } } diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index b97b5efa..d73fbb2f 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -66,6 +66,15 @@ "item.betterend.crystalite_chestplate": "Crystalite Chestplate", "item.betterend.crystalite_helmet": "Crystalite Helmet", "item.betterend.crystalite_leggings": "Crystalite Leggings", + "item.betterend.aeternium_axe_head": "Aeternium Axe Head", + "item.betterend.aeternium_hammer_head": "Aeternium Hammer Head", + "item.betterend.aeternium_hoe_head": "Aeternium Hoe Head", + "item.betterend.aeternium_pickaxe_head": "Aeternium Pickaxe Head", + "item.betterend.aeternium_shovel_head": "Aeternium Shovel Head", + "item.betterend.aeternium_sword_blade": "Aeternium Sword Blade", + "item.betterend.aeternium_sword_handle": "Aeternium Sword Handle", + "item.betterend.leather_stripe": "Leather Stripe", + "item.betterend.leather_wrapped_stick": "Leather Wrapped Stick", "effect.betterend.end_veil": "End Veil", "enchantment.betterend.end_veil": "End Veil", diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index f443c880..470ec862 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -66,6 +66,15 @@ "item.betterend.crystalite_chestplate": "Кристалитовая кираса", "item.betterend.crystalite_helmet": "Кристалитовый шлем", "item.betterend.crystalite_leggings": "Кристалитовые поножи", + "item.betterend.aeternium_axe_head": "Навершие Этериевого топора", + "item.betterend.aeternium_hammer_head": "Навершие Этериевого молота", + "item.betterend.aeternium_hoe_head": "Навершие Этериевой мотыги", + "item.betterend.aeternium_pickaxe_head": "Навершие Этериевой кирки", + "item.betterend.aeternium_shovel_head": "Навершие Этериевой лопаты", + "item.betterend.aeternium_sword_blade": "Лезвие Этериевого меча", + "item.betterend.aeternium_sword_handle": "Рукоятка Этериевого меча", + "item.betterend.leather_stripe": "Полоска кожи", + "item.betterend.leather_wrapped_stick": "Обернутая кожей палка", "effect.betterend.end_veil": "Вуаль Края", "enchantment.betterend.end_veil": "Вуаль Края", From ca769ebc665ac1b391713b2395b68fb4b399be1f Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 6 Jan 2021 16:05:20 +0300 Subject: [PATCH 111/463] Blossom berry --- .../betterend/blocks/BlueVineSeedBlock.java | 4 +- .../betterend/blocks/BulbVineSeedBlock.java | 4 +- .../blocks/GlowingPillarSeedBlock.java | 4 +- .../betterend/blocks/LanceleafSeedBlock.java | 4 +- .../ru/betterend/blocks/ShadowBerryBlock.java | 4 +- .../betterend/blocks/basis/EndCropBlock.java | 114 ++++++++++++++++++ ...geBlock.java => EndPlantWithAgeBlock.java} | 26 ++-- .../java/ru/betterend/registry/EndBlocks.java | 4 + .../java/ru/betterend/registry/EndItems.java | 7 +- .../world/features/BlueVineFeature.java | 6 +- .../world/features/GlowPillarFeature.java | 4 +- .../world/features/LanceleafFeature.java | 4 +- .../world/features/SinglePlantFeature.java | 6 +- .../blockstates/blossom_berry_seed.json | 8 ++ .../assets/betterend/lang/en_us.json | 4 +- .../assets/betterend/lang/ru_ru.json | 4 +- .../betterend/models/block/blossom_berry.json | 56 +++++++++ .../models/block/blossom_berry_seed_0.json | 6 + .../models/block/blossom_berry_seed_1.json | 6 + .../models/block/blossom_berry_seed_2.json | 6 + .../betterend/models/item/blossom_berry.json | 6 + .../models/item/blossom_berry_seed.json | 6 + .../textures/block/blossom_berry_flower.png | Bin 0 -> 407 bytes .../textures/block/blossom_berry_fruit.png | Bin 0 -> 218 bytes .../textures/block/blossom_berry_seed_0.png | Bin 0 -> 226 bytes .../textures/block/blossom_berry_seed_1.png | Bin 0 -> 263 bytes .../textures/block/blossom_berry_seed_2.png | Bin 0 -> 304 bytes .../textures/block/blossom_berry_stem.png | Bin 0 -> 240 bytes .../betterend/textures/item/blossom_berry.png | Bin 0 -> 370 bytes .../textures/item/blossom_berry_seed.png | Bin 0 -> 327 bytes 30 files changed, 257 insertions(+), 36 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/basis/EndCropBlock.java rename src/main/java/ru/betterend/blocks/basis/{PlantWithAgeBlock.java => EndPlantWithAgeBlock.java} (72%) create mode 100644 src/main/resources/assets/betterend/blockstates/blossom_berry_seed.json create mode 100644 src/main/resources/assets/betterend/models/block/blossom_berry.json create mode 100644 src/main/resources/assets/betterend/models/block/blossom_berry_seed_0.json create mode 100644 src/main/resources/assets/betterend/models/block/blossom_berry_seed_1.json create mode 100644 src/main/resources/assets/betterend/models/block/blossom_berry_seed_2.json create mode 100644 src/main/resources/assets/betterend/models/item/blossom_berry.json create mode 100644 src/main/resources/assets/betterend/models/item/blossom_berry_seed.json create mode 100644 src/main/resources/assets/betterend/textures/block/blossom_berry_flower.png create mode 100644 src/main/resources/assets/betterend/textures/block/blossom_berry_fruit.png create mode 100644 src/main/resources/assets/betterend/textures/block/blossom_berry_seed_0.png create mode 100644 src/main/resources/assets/betterend/textures/block/blossom_berry_seed_1.png create mode 100644 src/main/resources/assets/betterend/textures/block/blossom_berry_seed_2.png create mode 100644 src/main/resources/assets/betterend/textures/block/blossom_berry_stem.png create mode 100644 src/main/resources/assets/betterend/textures/item/blossom_berry.png create mode 100644 src/main/resources/assets/betterend/textures/item/blossom_berry_seed.png diff --git a/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java b/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java index de67fdac..5a2ae3f4 100644 --- a/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java @@ -8,12 +8,12 @@ import net.minecraft.util.math.Direction; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.FurBlock; -import ru.betterend.blocks.basis.PlantWithAgeBlock; +import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; -public class BlueVineSeedBlock extends PlantWithAgeBlock { +public class BlueVineSeedBlock extends EndPlantWithAgeBlock { @Override public void growAdult(StructureWorldAccess world, Random random, BlockPos pos) { int height = MHelper.randRange(2, 5, random); diff --git a/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java b/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java index f22f46f0..9df8ecc2 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java @@ -8,12 +8,12 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.PlantWithAgeBlock; +import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; -public class BulbVineSeedBlock extends PlantWithAgeBlock { +public class BulbVineSeedBlock extends EndPlantWithAgeBlock { @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { BlockState up = world.getBlockState(pos.up()); diff --git a/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java b/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java index 97ea66f5..4109481b 100644 --- a/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java @@ -13,12 +13,12 @@ import net.minecraft.util.math.BlockPos.Mutable; import net.minecraft.util.math.Direction; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.PlantWithAgeBlock; +import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; -public class GlowingPillarSeedBlock extends PlantWithAgeBlock { +public class GlowingPillarSeedBlock extends EndPlantWithAgeBlock { public GlowingPillarSeedBlock() { super(FabricBlockSettings.of(Material.PLANT) .luminance((state) -> { return state.get(AGE) * 3 + 3; }) diff --git a/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java b/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java index b7e944c0..f4ddf4a6 100644 --- a/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java @@ -8,12 +8,12 @@ import net.minecraft.util.math.BlockPos.Mutable; import net.minecraft.util.math.Direction; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.BlockProperties.PentaShape; -import ru.betterend.blocks.basis.PlantWithAgeBlock; +import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; -public class LanceleafSeedBlock extends PlantWithAgeBlock { +public class LanceleafSeedBlock extends EndPlantWithAgeBlock { @Override public void growAdult(StructureWorldAccess world, Random random, BlockPos pos) { int height = MHelper.randRange(4, 6, random); diff --git a/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java b/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java index 2cca0ec5..06c06ef8 100644 --- a/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java +++ b/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java @@ -16,12 +16,12 @@ import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.BlockView; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.World; -import ru.betterend.blocks.basis.PlantWithAgeBlock; +import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; import ru.betterend.util.MHelper; -public class ShadowBerryBlock extends PlantWithAgeBlock { +public class ShadowBerryBlock extends EndPlantWithAgeBlock { private static final VoxelShape SHAPE = Block.createCuboidShape(1, 0, 1, 15, 8, 15); @Override diff --git a/src/main/java/ru/betterend/blocks/basis/EndCropBlock.java b/src/main/java/ru/betterend/blocks/basis/EndCropBlock.java new file mode 100644 index 00000000..16d5e8f9 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndCropBlock.java @@ -0,0 +1,114 @@ +package ru.betterend.blocks.basis; + +import java.util.Collections; +import java.util.List; +import java.util.Random; + +import com.google.common.collect.Lists; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.block.AbstractBlock; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Material; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.enchantment.Enchantments; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.context.LootContext; +import net.minecraft.loot.context.LootContextParameters; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.IntProperty; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.BlockView; +import net.minecraft.world.World; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; + +public class EndCropBlock extends EndPlantBlock { + public static final IntProperty AGE = IntProperty.of("age", 0, 3); + + private final Block[] terrain; + private final Item drop; + + public EndCropBlock(Item drop, Block... terrain) { + super(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.HOES) + .sounds(BlockSoundGroup.GRASS) + .breakByHand(true) + .ticksRandomly() + .noCollision()); + this.drop = drop; + this.terrain = terrain; + this.setDefaultState(getDefaultState().with(AGE, 0)); + } + + @Override + protected void appendProperties(StateManager.Builder stateManager) { + stateManager.add(AGE); + } + + @Override + protected boolean isTerrain(BlockState state) { + for (Block block: terrain) { + if (state.isOf(block)) { + return true; + } + } + return false; + } + + @Override + public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + if (state.get(AGE) < 3) { + return Collections.singletonList(new ItemStack(this)); + } + ItemStack tool = builder.get(LootContextParameters.TOOL); + if (tool != null && tool.isEffectiveOn(state)) { + int enchantment = EnchantmentHelper.getLevel(Enchantments.FORTUNE, tool); + if (enchantment > 0) { + int countSeeds = MHelper.randRange(MathHelper.clamp(1 + enchantment, 1, 3), 3, MHelper.RANDOM); + int countDrops = MHelper.randRange(MathHelper.clamp(1 + enchantment, 1, 2), 2, MHelper.RANDOM); + return Lists.newArrayList(new ItemStack(this, countSeeds), new ItemStack(drop, countDrops)); + } + } + int countSeeds = MHelper.randRange(1, 3, MHelper.RANDOM); + int countDrops = MHelper.randRange(1, 2, MHelper.RANDOM); + return Lists.newArrayList(new ItemStack(this, countSeeds), new ItemStack(drop, countDrops)); + } + + @Override + public AbstractBlock.OffsetType getOffsetType() { + return AbstractBlock.OffsetType.NONE; + } + + @Override + public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { + int age = state.get(AGE); + if (age < 3) { + BlocksHelper.setWithUpdate(world, pos, state.with(AGE, age + 1)); + } + } + + @Override + public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { + return state.get(AGE) < 3; + } + + @Override + public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { + return random.nextInt(8) == 0 && state.get(AGE) < 3; + } + + @Override + public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + super.scheduledTick(state, world, pos, random); + if (canGrow(world, random, pos, state)) { + grow(world, random, pos, state); + } + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/PlantWithAgeBlock.java b/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java similarity index 72% rename from src/main/java/ru/betterend/blocks/basis/PlantWithAgeBlock.java rename to src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java index 06047606..cc649f49 100644 --- a/src/main/java/ru/betterend/blocks/basis/PlantWithAgeBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java @@ -13,11 +13,12 @@ import net.minecraft.state.StateManager; import net.minecraft.state.property.IntProperty; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.World; -public abstract class PlantWithAgeBlock extends EndPlantBlock { +public abstract class EndPlantWithAgeBlock extends EndPlantBlock { public static final IntProperty AGE = IntProperty.of("age", 0, 3); - public PlantWithAgeBlock() { + public EndPlantWithAgeBlock() { this(FabricBlockSettings.of(Material.PLANT) .breakByTool(FabricToolTags.SHEARS) .sounds(BlockSoundGroup.GRASS) @@ -26,7 +27,7 @@ public abstract class PlantWithAgeBlock extends EndPlantBlock { .noCollision()); } - public PlantWithAgeBlock(FabricBlockSettings settings) { + public EndPlantWithAgeBlock(FabricBlockSettings settings) { super(settings); } @@ -39,15 +40,18 @@ public abstract class PlantWithAgeBlock extends EndPlantBlock { @Override public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { - if (random.nextInt(4) == 0) { - int age = state.get(AGE); - if (age < 3) { - world.setBlockState(pos, state.with(AGE, age + 1)); - } - else { - growAdult(world, random, pos); - } + int age = state.get(AGE); + if (age < 3) { + world.setBlockState(pos, state.with(AGE, age + 1)); } + else { + growAdult(world, random, pos); + } + } + + @Override + public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { + return random.nextInt(8) == 0; } @Override diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 49c79e41..5dc5a0c0 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -86,6 +86,7 @@ import ru.betterend.blocks.PedestalVanilla; import ru.betterend.blocks.RunedFlavolite; import ru.betterend.blocks.TerminiteBlock; import ru.betterend.blocks.basis.FurBlock; +import ru.betterend.blocks.basis.EndCropBlock; import ru.betterend.blocks.basis.EndLeavesBlock; import ru.betterend.blocks.basis.EndOreBlock; import ru.betterend.blocks.basis.SimpleLeavesBlock; @@ -220,6 +221,9 @@ public class EndBlocks { public static final Block SMALL_JELLYSHROOM = registerBlock("small_jellyshroom", new SmallJellyshroomBlock()); + // Crops + public static final Block BLOSSOM_BERRY = registerBlock("blossom_berry_seed", new EndCropBlock(EndItems.BLOSSOM_BERRY, PINK_MOSS)); + // Water plants public static final Block BUBBLE_CORAL = registerBlock("bubble_coral", new BubbleCoralBlock()); public static final Block MENGER_SPONGE = registerBlock("menger_sponge", new MengerSpongeBlock()); diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index 9743614b..44a10254 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -111,6 +111,10 @@ public class EndItems { public final static Item BUCKET_END_FISH = registerItem("bucket_end_fish", new FishBucketItem(EndEntities.END_FISH, Fluids.WATER, makeItemSettings().maxCount(1))); public final static Item SWEET_BERRY_JELLY = registerFood("sweet_berry_jelly", 3, 0.75F); public final static Item SHADOW_BERRY_JELLY = registerFood("shadow_berry_jelly", 4, 0.75F, new StatusEffectInstance(StatusEffects.NIGHT_VISION, 400)); + public final static Item BLOSSOM_BERRY = registerFood("blossom_berry", FoodComponents.APPLE); + + // Drinks + public final static Item UMBRELLA_CLUSTER_JUICE = registerDrink("umbrella_cluster_juice"); // Toolparts // public final static Item AETERNIUM_SHOVEL_HEAD = registerItem("aeternium_shovel_head"); @@ -121,9 +125,6 @@ public class EndItems { public final static Item AETERNIUM_SWORD_BLADE = registerItem("aeternium_sword_blade"); public final static Item AETERNIUM_SWORD_HANDLE = registerItem("aeternium_sword_handle"); - // Drinks - public final static Item UMBRELLA_CLUSTER_JUICE = registerDrink("umbrella_cluster_juice"); - protected static Item registerItem(String name) { return registerItem(BetterEnd.makeID(name), new PatternedItem(makeItemSettings())); } diff --git a/src/main/java/ru/betterend/world/features/BlueVineFeature.java b/src/main/java/ru/betterend/world/features/BlueVineFeature.java index d5c6b019..06883bf3 100644 --- a/src/main/java/ru/betterend/world/features/BlueVineFeature.java +++ b/src/main/java/ru/betterend/world/features/BlueVineFeature.java @@ -4,7 +4,7 @@ import java.util.Random; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.basis.PlantWithAgeBlock; +import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; @@ -26,10 +26,10 @@ public class BlueVineFeature extends ScatterFeature { @Override public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { if (small) { - BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.BLUE_VINE_SEED.getDefaultState().with(PlantWithAgeBlock.AGE, random.nextInt(4))); + BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.BLUE_VINE_SEED.getDefaultState().with(EndPlantWithAgeBlock.AGE, random.nextInt(4))); } else { - PlantWithAgeBlock seed = ((PlantWithAgeBlock) EndBlocks.BLUE_VINE_SEED); + EndPlantWithAgeBlock seed = ((EndPlantWithAgeBlock) EndBlocks.BLUE_VINE_SEED); seed.growAdult(world, random, blockPos); } } diff --git a/src/main/java/ru/betterend/world/features/GlowPillarFeature.java b/src/main/java/ru/betterend/world/features/GlowPillarFeature.java index 1b51b7e7..d64c9cbb 100644 --- a/src/main/java/ru/betterend/world/features/GlowPillarFeature.java +++ b/src/main/java/ru/betterend/world/features/GlowPillarFeature.java @@ -4,7 +4,7 @@ import java.util.Random; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.basis.PlantWithAgeBlock; +import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; public class GlowPillarFeature extends ScatterFeature { @@ -19,7 +19,7 @@ public class GlowPillarFeature extends ScatterFeature { @Override public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { - PlantWithAgeBlock seed = ((PlantWithAgeBlock) EndBlocks.GLOWING_PILLAR_SEED); + EndPlantWithAgeBlock seed = ((EndPlantWithAgeBlock) EndBlocks.GLOWING_PILLAR_SEED); seed.growAdult(world, random, blockPos); } diff --git a/src/main/java/ru/betterend/world/features/LanceleafFeature.java b/src/main/java/ru/betterend/world/features/LanceleafFeature.java index c2d3a388..97a63710 100644 --- a/src/main/java/ru/betterend/world/features/LanceleafFeature.java +++ b/src/main/java/ru/betterend/world/features/LanceleafFeature.java @@ -4,7 +4,7 @@ import java.util.Random; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.basis.PlantWithAgeBlock; +import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; public class LanceleafFeature extends ScatterFeature { @@ -19,7 +19,7 @@ public class LanceleafFeature extends ScatterFeature { @Override public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { - PlantWithAgeBlock seed = ((PlantWithAgeBlock) EndBlocks.LANCELEAF_SEED); + EndPlantWithAgeBlock seed = ((EndPlantWithAgeBlock) EndBlocks.LANCELEAF_SEED); seed.growAdult(world, random, blockPos); } diff --git a/src/main/java/ru/betterend/world/features/SinglePlantFeature.java b/src/main/java/ru/betterend/world/features/SinglePlantFeature.java index 84fbe992..0fbc1021 100644 --- a/src/main/java/ru/betterend/world/features/SinglePlantFeature.java +++ b/src/main/java/ru/betterend/world/features/SinglePlantFeature.java @@ -7,7 +7,7 @@ import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.basis.DoublePlantBlock; -import ru.betterend.blocks.basis.PlantWithAgeBlock; +import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.util.BlocksHelper; public class SinglePlantFeature extends ScatterFeature { @@ -56,9 +56,9 @@ public class SinglePlantFeature extends ScatterFeature { BlocksHelper.setWithoutUpdate(world, blockPos, state); BlocksHelper.setWithoutUpdate(world, blockPos.up(), state.with(DoublePlantBlock.TOP, true)); } - else if (plant instanceof PlantWithAgeBlock) { + else if (plant instanceof EndPlantWithAgeBlock) { int age = random.nextInt(4); - BlockState state = plant.getDefaultState().with(PlantWithAgeBlock.AGE, age); + BlockState state = plant.getDefaultState().with(EndPlantWithAgeBlock.AGE, age); BlocksHelper.setWithoutUpdate(world, blockPos, state); } else { diff --git a/src/main/resources/assets/betterend/blockstates/blossom_berry_seed.json b/src/main/resources/assets/betterend/blockstates/blossom_berry_seed.json new file mode 100644 index 00000000..64807e33 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/blossom_berry_seed.json @@ -0,0 +1,8 @@ +{ + "variants": { + "age=0": { "model": "betterend:block/blossom_berry_seed_0" }, + "age=1": { "model": "betterend:block/blossom_berry_seed_1" }, + "age=2": { "model": "betterend:block/blossom_berry_seed_2" }, + "age=3": { "model": "betterend:block/blossom_berry" } + } +} diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index b97b5efa..50a5a8d4 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -550,5 +550,7 @@ "biome.betterend.eterial_grove": "Eterial Grove", "block.betterend.umbrella_tree_sapling": "Umbrella Tree Sapling", - "item.betterend.umbrella_cluster_juice": "Umbrella Cluster Juice" + "item.betterend.umbrella_cluster_juice": "Umbrella Cluster Juice", + "block.betterend.blossom_berry_seed": "Blossom Berry Seed", + "item.betterend.blossom_berry": "Blossom Berry" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index f443c880..7412bf81 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -552,5 +552,7 @@ "biome.betterend.eterial_grove": "Эфирная роща", "block.betterend.umbrella_tree_sapling": "Саженец зонтичного дерева", - "item.betterend.umbrella_cluster_juice": "Сок зонтичного кластера" + "item.betterend.umbrella_cluster_juice": "Сок зонтичного кластера", + "block.betterend.blossom_berry_seed": "Семя цветущей ягоды", + "item.betterend.blossom_berry": "Цветущая ягода" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/blossom_berry.json b/src/main/resources/assets/betterend/models/block/blossom_berry.json new file mode 100644 index 00000000..d31374b9 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/blossom_berry.json @@ -0,0 +1,56 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/blossom_berry_flower", + "stem": "betterend:block/blossom_berry_stem", + "flower": "betterend:block/blossom_berry_flower", + "texture": "betterend:block/blossom_berry_fruit" + }, + "elements": [ + { + "__comment": "PlaneX1", + "from": [ 2.25, 0, 2.25 ], + "to": [ 2.251, 16, 18.25 ], + "rotation": { "origin": [ 2.25, 0, 2.25 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" } + } + }, + { + "__comment": "PlaneX1", + "from": [ 13.75, 0, 2.25 ], + "to": [ 13.751, 16, 18.25 ], + "rotation": { "origin": [ 13.75, 0, 2.25 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" } + } + }, + { + "__comment": "PlaneY3", + "from": [ 0, 12, 0 ], + "to": [ 16, 12.001, 16 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#flower" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#flower" } + } + }, + { + "__comment": "Box4", + "from": [ 5, 11, 5 ], + "to": [ 11, 17, 11 ], + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#texture" }, + "north": { "uv": [ 0, 0, 6, 6 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 6, 6 ], "texture": "#texture" }, + "west": { "uv": [ 0, 0, 6, 6 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 6, 6 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/blossom_berry_seed_0.json b/src/main/resources/assets/betterend/models/block/blossom_berry_seed_0.json new file mode 100644 index 00000000..7d0ca93f --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/blossom_berry_seed_0.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_no_distortion", + "textures": { + "texture": "betterend:block/blossom_berry_seed_0" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/blossom_berry_seed_1.json b/src/main/resources/assets/betterend/models/block/blossom_berry_seed_1.json new file mode 100644 index 00000000..5b9545ab --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/blossom_berry_seed_1.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_no_distortion", + "textures": { + "texture": "betterend:block/blossom_berry_seed_1" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/blossom_berry_seed_2.json b/src/main/resources/assets/betterend/models/block/blossom_berry_seed_2.json new file mode 100644 index 00000000..78ed4004 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/blossom_berry_seed_2.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_no_distortion", + "textures": { + "texture": "betterend:block/blossom_berry_seed_2" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/blossom_berry.json b/src/main/resources/assets/betterend/models/item/blossom_berry.json new file mode 100644 index 00000000..2363da03 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/blossom_berry.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/blossom_berry" + } +} diff --git a/src/main/resources/assets/betterend/models/item/blossom_berry_seed.json b/src/main/resources/assets/betterend/models/item/blossom_berry_seed.json new file mode 100644 index 00000000..decd9891 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/blossom_berry_seed.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/blossom_berry_seed" + } +} diff --git a/src/main/resources/assets/betterend/textures/block/blossom_berry_flower.png b/src/main/resources/assets/betterend/textures/block/blossom_berry_flower.png new file mode 100644 index 0000000000000000000000000000000000000000..050d776af6c0cd96653820db53aef7a9e8f13f29 GIT binary patch literal 407 zcmV;I0cie-P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0W3*GK~y+TrIRsA zLs1Y#-AX>06-a~8xxY$3hyDRI3MLeee=%ND% zgkbdX8vD!lupDe3miM<&84MrG=Hf>1Sx0A02Vixr8v+&yB*PKQbIynYRHC8@v%ohr zy2DL$04$Q-jQKW=xC1XK&q>1V(@mVci+n%e^zN*x?vE~;3)B&iyxdtTpFdx*?`-Wh z9oP*8n-L@xnQT`8jXE)Rg#L3c&bqgb;7iPJK^Jyltn=JoL7{HOxnM>V&^^1f!6ImV z&J!Kz#$rwrh~=jZqJS@vMeKaQ1o^Ck|L5PilwV?R?W^k*r%?a^002ovPDHLkV1fqA BsO|s& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/blossom_berry_fruit.png b/src/main/resources/assets/betterend/textures/block/blossom_berry_fruit.png new file mode 100644 index 0000000000000000000000000000000000000000..9ecf7a6741f4f53e2154d9ae17f77eade5831f8e GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!F*2_#}EtuWSi&PKijXL!NAN@Q}?y;;nU^e zJaWI2B^EkWFbaEY?r71FXlCfpKc~)?Cd@p;;mB<9^#^Cj9AGIjGHR%7j9@5Z^bqEm z%r)aeF7wCzwZFKY3bOV5|Np<;=p=K3egKmjuY_qsV`C#D!}IGp&tI9hgIv$x>FVdQ I&MBb@05VEOZ2$lO literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/blossom_berry_seed_0.png b/src/main/resources/assets/betterend/textures/block/blossom_berry_seed_0.png new file mode 100644 index 0000000000000000000000000000000000000000..e5183c01ab7d7fa5fa8255979d0f0d12be3ae679 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!E#R*#}Etu+aC%MVb>o#VWng)c zd|>Gr=Ku4r#vh;c%#epclkMT%#M1|*9C8E=3){@s$2C2@$k@hMby-#-eqZf51wEaU z1{-yF*8F_+l{=wug-{5?sootQS}tAqFTFg4dFG9$juQD2A3knyj@-e(%*^oDHc)bI T-&7cl#1?bP z=EMKUzok=JnoSiCitMfYI>|AA7qha*;*J>>5qxTF&lniPn9JIA|Lg1NoMgDfa*1Ja z{Jz?A4|Zt@t&?OaP)nVlsPJpnp(?hu?2QSAC1(>Dj2PtSU6=S=|9DD{g79ve+~mZh z$Q$*EiFIw;^X;8n4H)B?MV=l#FiZHgSn@Af9tjDCzWKS%UPan9hHD=nuJB^uU9qzD*Ev&8MIJ@;Ujme6)a zg$>p@KkEw1Q=Q$m6v?W&JK^Z5t=fgWP;boFyt=akR{03oz<_y7O^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/blossom_berry_stem.png b/src/main/resources/assets/betterend/textures/block/blossom_berry_stem.png new file mode 100644 index 0000000000000000000000000000000000000000..cc5ef7aabfbdcbff9128c33e0d6fc2ce4a52983c GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!B$Tf#}Etu+aC%MVWxK~PCoy3D ztKadCVGWKEGv+^h)7s9{yV=~>X=wmMpdN!Hi;=)7S4In7hMPYgd}MFio^Rh2+jv@F zkDkIYfu=YIa~9bE8EzI{hd$m3+7}q(m@k+%?`e{o%M#n*Z_M$)gdxpZvEe#vOAb3@ fQ``Z52?+)>M<2<_zITA`VPNod^>bP0l+XkK<1t9~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/blossom_berry.png b/src/main/resources/assets/betterend/textures/item/blossom_berry.png new file mode 100644 index 0000000000000000000000000000000000000000..e9676143da1af623b2f4c4eece59fb767bbf6aa6 GIT binary patch literal 370 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc4eXvSjv*HQ$$$R;w`W#u;Pjfz%OUk)&A(s& zy=Sr)SWRBQm>;({MLOjzih}Pm~G|2uahH{*pT3*!m{BQ)5nHJMux`V>S-TdO@9Fl OCk9VfKbLh*2~7Z7VU4N) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/blossom_berry_seed.png b/src/main/resources/assets/betterend/textures/item/blossom_berry_seed.png new file mode 100644 index 0000000000000000000000000000000000000000..25dabe2edc103e40c2e775a3adf4b73628604094 GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!8@KVjv*HQ$$$R;w`W#u;Pjfzt6|2lT72Hs z_;&7nm0u@0=I>%w?x@xLe4t*?u#jz~o3DX9%Lb_p);T}x3llvJq?a(VIIuO|IKkG$ zaL<87l4a5S7dgoV|D%rZ+biH@%;_x-o8 z{mJ<>k!cQ_j}G^5`~8~V_BX9z2w|~4kj3C(EYEMPhTSqyj>GA*hfDjse=F3*w0)~Gmtri27T-QC{V Uc2Oty0R73}>FVdQ&MBb@0K_SH)Bpeg literal 0 HcmV?d00001 From 24f63e4d5be0f757d5889890786cbd2e706af533 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Fri, 8 Jan 2021 12:57:42 +0300 Subject: [PATCH 112/463] A little refactoring --- src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java | 3 +-- .../ru/betterend/mixin/common/AnvilScreenHandlerMixin.java | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java index a9d0a4c1..afde9812 100644 --- a/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java +++ b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java @@ -59,10 +59,9 @@ public class AnvilScreenMixin extends ForgingScreen { @Inject(method = "onSlotUpdate", at = @At("HEAD"), cancellable = true) public void onSlotUpdate(ScreenHandler handler, int slotId, ItemStack stack, CallbackInfo info) { + AnvilScreenHandlerExtended anvilHandler = AnvilScreenHandlerExtended.class.cast(handler); if (anvilHandler.be_getCurrentRecipe() != null) { this.nameField.setText(""); - this.nameField.setEditable(false); - this.setFocused(null); info.cancel(); } } diff --git a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java index eba846f9..9552ca91 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java @@ -21,6 +21,7 @@ import net.minecraft.screen.ForgingScreenHandler; import net.minecraft.screen.ScreenHandlerContext; import net.minecraft.screen.ScreenHandlerType; import net.minecraft.tag.BlockTags; + import ru.betterend.interfaces.AnvilScreenHandlerExtended; import ru.betterend.recipe.builders.AnvilRecipe; From 1847b25aa9837a669ca470f3130fec2f26cd46f3 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Fri, 8 Jan 2021 12:58:20 +0300 Subject: [PATCH 113/463] Update ModelLoaderMixin.java --- .../java/ru/betterend/mixin/client/ModelLoaderMixin.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java index 174fc608..20c2696f 100644 --- a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java @@ -18,6 +18,7 @@ import net.minecraft.block.Block; import net.minecraft.client.render.model.ModelLoader; import net.minecraft.client.render.model.json.JsonUnbakedModel; import net.minecraft.client.render.model.json.ModelVariantMap.DeserializationContext; +import net.minecraft.client.util.ModelIdentifier; import net.minecraft.item.Item; import net.minecraft.resource.Resource; import net.minecraft.resource.ResourceManager; @@ -104,4 +105,11 @@ public class ModelLoaderMixin { context.setContextId(null); } } + + @Inject(method = "loadModel", at = @At("HEAD")) + private void loadModel(Identifier id, CallbackInfo info) throws Exception { +// if (!(id instanceof ModelIdentifier)) { +// System.out.println(id); +// } + } } From 3b96ee630799edc6adc46d316882e36e4a1880c2 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Fri, 8 Jan 2021 23:54:17 +0300 Subject: [PATCH 114/463] BlockStates pattern loading optimization --- .../interfaces/IdentifiedContext.java | 12 ------- .../mixin/client/ContextGsonAccessor.java | 14 +++++++++ .../client/DeserializationContextMixin.java | 23 -------------- .../mixin/client/ModelLoaderMixin.java | 30 +----------------- .../mixin/client/ModelVariantMapMixin.java | 31 ++++++------------- .../client/NamespaceResourceManagerMixin.java | 9 +----- .../resources/betterend.mixins.client.json | 2 +- 7 files changed, 27 insertions(+), 94 deletions(-) delete mode 100644 src/main/java/ru/betterend/interfaces/IdentifiedContext.java create mode 100644 src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java delete mode 100644 src/main/java/ru/betterend/mixin/client/DeserializationContextMixin.java diff --git a/src/main/java/ru/betterend/interfaces/IdentifiedContext.java b/src/main/java/ru/betterend/interfaces/IdentifiedContext.java deleted file mode 100644 index e03bfbb6..00000000 --- a/src/main/java/ru/betterend/interfaces/IdentifiedContext.java +++ /dev/null @@ -1,12 +0,0 @@ -package ru.betterend.interfaces; - -import net.minecraft.util.Identifier; - -public interface IdentifiedContext { - public Identifier getContextId(); - public void setContextId(Identifier id); - - default void removeId() { - this.setContextId(null); - } -} diff --git a/src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java b/src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java new file mode 100644 index 00000000..d635bdbc --- /dev/null +++ b/src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java @@ -0,0 +1,14 @@ +package ru.betterend.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import com.google.gson.Gson; + +import net.minecraft.client.render.model.json.ModelVariantMap; + +@Mixin(ModelVariantMap.DeserializationContext.class) +public interface ContextGsonAccessor { + @Accessor + public Gson getGson(); +} diff --git a/src/main/java/ru/betterend/mixin/client/DeserializationContextMixin.java b/src/main/java/ru/betterend/mixin/client/DeserializationContextMixin.java deleted file mode 100644 index 0852e1e2..00000000 --- a/src/main/java/ru/betterend/mixin/client/DeserializationContextMixin.java +++ /dev/null @@ -1,23 +0,0 @@ -package ru.betterend.mixin.client; - -import org.spongepowered.asm.mixin.Mixin; - -import net.minecraft.client.render.model.json.ModelVariantMap.DeserializationContext; -import net.minecraft.util.Identifier; -import ru.betterend.interfaces.IdentifiedContext; - -@Mixin(DeserializationContext.class) -public class DeserializationContextMixin implements IdentifiedContext { - - private Identifier contextId; - - @Override - public Identifier getContextId() { - return this.contextId; - } - - @Override - public void setContextId(Identifier id) { - this.contextId = id; - } -} diff --git a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java index 20c2696f..f1c8b1f0 100644 --- a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java @@ -9,32 +9,24 @@ import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.At.Shift; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.block.Block; import net.minecraft.client.render.model.ModelLoader; import net.minecraft.client.render.model.json.JsonUnbakedModel; -import net.minecraft.client.render.model.json.ModelVariantMap.DeserializationContext; -import net.minecraft.client.util.ModelIdentifier; import net.minecraft.item.Item; import net.minecraft.resource.Resource; import net.minecraft.resource.ResourceManager; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; + import ru.betterend.BetterEnd; -import ru.betterend.interfaces.IdentifiedContext; import ru.betterend.patterns.Patterned; @Mixin(ModelLoader.class) public class ModelLoaderMixin { - @Final - @Shadow - private DeserializationContext variantMapDeserializationContext; - @Final @Shadow private ResourceManager resourceManager; @@ -92,24 +84,4 @@ public class ModelLoaderMixin { return model; } - - @Inject(method = "loadModel", at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/render/model/json/ModelVariantMap$DeserializationContext;setStateFactory(Lnet/minecraft/state/StateManager;)V", - shift = Shift.AFTER)) - private void appendContextID(Identifier id, CallbackInfo info) { - IdentifiedContext context = IdentifiedContext.class.cast(variantMapDeserializationContext); - if (id.getNamespace().equals(BetterEnd.MOD_ID)) { - context.setContextId(BetterEnd.makeID("pattern/" + id.getPath())); - } else { - context.setContextId(null); - } - } - - @Inject(method = "loadModel", at = @At("HEAD")) - private void loadModel(Identifier id, CallbackInfo info) throws Exception { -// if (!(id instanceof ModelIdentifier)) { -// System.out.println(id); -// } - } } diff --git a/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java b/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java index b8315dfd..2c982d31 100644 --- a/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java @@ -4,40 +4,29 @@ import java.io.Reader; import java.io.StringReader; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import com.google.gson.Gson; + import net.minecraft.block.Block; import net.minecraft.client.render.model.json.ModelVariantMap; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; -import ru.betterend.interfaces.IdentifiedContext; +import net.minecraft.util.JsonHelper; + import ru.betterend.patterns.BlockPatterned; @Mixin(ModelVariantMap.class) public abstract class ModelVariantMapMixin { - @Shadow - static ModelVariantMap deserialize(ModelVariantMap.DeserializationContext context, Reader reader) { - return null; - } - @Inject(method = "deserialize", at = @At("HEAD"), cancellable = true) private static void deserializeBlockState(ModelVariantMap.DeserializationContext context, Reader reader, CallbackInfoReturnable info) { - IdentifiedContext idContext = IdentifiedContext.class.cast(context); - Identifier id = idContext.getContextId(); - if (id != null && id.getPath().contains("pattern")) { - String[] data = id.getPath().split("/"); - Identifier blockId = new Identifier(id.getNamespace(), data[1]); - Block block = Registry.BLOCK.get(blockId); - idContext.removeId(); - if (block instanceof BlockPatterned) { - String pattern = ((BlockPatterned) block).getStatesPattern(reader); - info.setReturnValue(deserialize(context, new StringReader(pattern))); - info.cancel(); - } + Block block = context.getStateFactory().getDefaultState().getBlock(); + if (block instanceof BlockPatterned) { + String pattern = ((BlockPatterned) block).getStatesPattern(reader); + Gson gson = ContextGsonAccessor.class.cast(context).getGson(); + ModelVariantMap map = JsonHelper.deserialize(gson, new StringReader(pattern), ModelVariantMap.class); + info.setReturnValue(map); } } } diff --git a/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java b/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java index 0bb4451a..6fbe8fcc 100644 --- a/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java @@ -2,7 +2,6 @@ package ru.betterend.mixin.client; import java.util.List; -import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -15,23 +14,17 @@ import com.google.common.collect.Lists; import net.minecraft.block.Block; import net.minecraft.resource.NamespaceResourceManager; import net.minecraft.resource.Resource; -import net.minecraft.resource.ResourcePack; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; + import ru.betterend.BetterEnd; import ru.betterend.patterns.BlockPatterned; @Mixin(NamespaceResourceManager.class) public abstract class NamespaceResourceManagerMixin { - @Final - @Shadow - protected List packList; - @Shadow public abstract Resource getResource(Identifier id); - @Shadow - public abstract List getAllResources(Identifier id); @Inject(method = "getAllResources", cancellable = true, at = @At( value = "NEW", diff --git a/src/main/resources/betterend.mixins.client.json b/src/main/resources/betterend.mixins.client.json index 20148d62..7da8b81b 100644 --- a/src/main/resources/betterend.mixins.client.json +++ b/src/main/resources/betterend.mixins.client.json @@ -7,12 +7,12 @@ "AbstractSoundInstanceAccessor", "ClientPlayNetworkHandlerMixin", "NamespaceResourceManagerMixin", - "DeserializationContextMixin", "EnchantingTableBlockMixin", "BackgroundRendererMixin", "ClientRecipeBookMixin", "ModelVariantMapMixin", "MinecraftClientMixin", + "ContextGsonAccessor", "WorldRendererMixin", "MusicTrackerMixin", "AnvilScreenMixin", From 1a4cc735d2f6b5aec51c93a55ce7cf62eb60a4bc Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sun, 10 Jan 2021 00:02:29 +0300 Subject: [PATCH 115/463] Guide Book as advancement reward --- .../mixin/client/ModelLoaderMixin.java | 3 -- .../client/NamespaceResourceManagerMixin.java | 1 - .../betterend/mixin/common/EntityMixin.java | 3 +- .../common/PlayerAdvancementTrackerMixin.java | 34 +++++++++++++++++++ .../resources/betterend.mixins.common.json | 3 +- 5 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 src/main/java/ru/betterend/mixin/common/PlayerAdvancementTrackerMixin.java diff --git a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java index f1c8b1f0..c28b1dd3 100644 --- a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java @@ -41,7 +41,6 @@ public class ModelLoaderMixin { model = JsonUnbakedModel.deserialize(reader); model.id = id.toString(); info.setReturnValue(model); - info.cancel(); } catch (Exception ex) { String data[] = id.getPath().split("/"); if (data.length > 1) { @@ -52,7 +51,6 @@ public class ModelLoaderMixin { Patterned patterned = (Patterned) block.get(); model = this.be_getModel(data, id, patterned); info.setReturnValue(model); - info.cancel(); } } else { Optional item = Registry.ITEM.getOrEmpty(itemId); @@ -60,7 +58,6 @@ public class ModelLoaderMixin { Patterned patterned = (Patterned) item.get(); model = this.be_getModel(data, id, patterned); info.setReturnValue(model); - info.cancel(); } } } diff --git a/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java b/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java index 6fbe8fcc..8152e707 100644 --- a/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java @@ -43,7 +43,6 @@ public abstract class NamespaceResourceManagerMixin { Resource stateRes = this.getResource(stateId); resources.add(stateRes); info.setReturnValue(resources); - info.cancel(); } catch (Exception ex) { BetterEnd.LOGGER.catching(ex); } diff --git a/src/main/java/ru/betterend/mixin/common/EntityMixin.java b/src/main/java/ru/betterend/mixin/common/EntityMixin.java index f398271c..320547fc 100644 --- a/src/main/java/ru/betterend/mixin/common/EntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EntityMixin.java @@ -8,7 +8,6 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.fabricmc.fabric.api.entity.event.v1.ServerEntityWorldChangeEvents; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.server.world.ServerWorld; @@ -16,6 +15,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.TeleportTarget; import net.minecraft.world.World; + import ru.betterend.interfaces.TeleportingEntity; @Mixin(Entity.class) @@ -74,7 +74,6 @@ public abstract class EntityMixin implements TeleportingEntity { destination.resetIdleTimeout(); this.world.getProfiler().pop(); this.beExitPos = null; - ServerEntityWorldChangeEvents.AFTER_ENTITY_CHANGE_WORLD.invoker().afterChangeWorld(Entity.class.cast(this), entity, (ServerWorld) world, (ServerWorld) entity.world); info.setReturnValue(entity); info.cancel(); } diff --git a/src/main/java/ru/betterend/mixin/common/PlayerAdvancementTrackerMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerAdvancementTrackerMixin.java new file mode 100644 index 00000000..662a3293 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/PlayerAdvancementTrackerMixin.java @@ -0,0 +1,34 @@ +package ru.betterend.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.advancement.Advancement; +import net.minecraft.advancement.PlayerAdvancementTracker; +import net.minecraft.item.ItemStack; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.util.Identifier; +import ru.betterend.BetterEnd; +import ru.betterend.item.GuideBookItem; + +@Mixin(PlayerAdvancementTracker.class) +public abstract class PlayerAdvancementTrackerMixin { + + @Shadow + private ServerPlayerEntity owner; + + @Inject(method = "grantCriterion", at = @At( + value = "INVOKE", + target = "Lnet/minecraft/advancement/AdvancementRewards;apply(Lnet/minecraft/server/network/ServerPlayerEntity;)V", + shift = Shift.AFTER)) + public void grantBonuses(Advancement advancement, String criterionName, CallbackInfoReturnable info) { + Identifier advId = new Identifier("minecraft:end/enter_end_gateway"); + if (BetterEnd.hasGuideBook() && advId.equals(advancement.getId())) { + this.owner.giveItemStack(new ItemStack(GuideBookItem.GUIDE_BOOK)); + } + } +} diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index e63a15f7..835574ad 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -4,8 +4,9 @@ "package": "ru.betterend.mixin.common", "compatibilityLevel": "JAVA_8", "mixins": [ - "ServerPlayNetworkHandlerMixin", "EnchantmentScreenHandlerMixin", + "PlayerAdvancementTrackerMixin", + "ServerPlayNetworkHandlerMixin", "CraftingScreenHandlerMixin", "GenerationSettingsAccessor", "NoiseChunkGeneratorMixin", From d45c37c37033d0db0d8352a81dc1b3c4de47c2fa Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sun, 10 Jan 2021 09:28:59 +0300 Subject: [PATCH 116/463] Advencements complete event --- src/main/java/ru/betterend/BetterEnd.java | 11 +++++++++++ .../events/PlayerAdvancementsEvents.java | 19 +++++++++++++++++++ .../common/PlayerAdvancementTrackerMixin.java | 13 ++++--------- 3 files changed, 34 insertions(+), 9 deletions(-) create mode 100644 src/main/java/ru/betterend/events/PlayerAdvancementsEvents.java diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index 9726fe23..5df06e7d 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -3,11 +3,13 @@ package ru.betterend; import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.item.ItemStack; import net.minecraft.util.Identifier; import ru.betterend.api.BetterEndPlugin; import ru.betterend.config.Configs; import ru.betterend.effects.EndEnchantments; import ru.betterend.effects.EndPotions; +import ru.betterend.events.PlayerAdvancementsEvents; import ru.betterend.integration.Integrations; import ru.betterend.item.GuideBookItem; import ru.betterend.recipe.AlloyingRecipes; @@ -67,6 +69,15 @@ public class BetterEnd implements ModInitializer { FabricLoader.getInstance().getEntrypoints("betterend", BetterEndPlugin.class).forEach(BetterEndPlugin::register); Configs.saveConfigs(); + + if (hasGuideBook()) { + PlayerAdvancementsEvents.PLAYER_ADVENCEMENT_COMPLETE.register((player, advancement, criterionName) -> { + Identifier advId = new Identifier("minecraft:end/enter_end_gateway"); + if (advId.equals(advancement.getId())) { + player.giveItemStack(new ItemStack(GuideBookItem.GUIDE_BOOK)); + } + }); + } } public static boolean hasGuideBook() { diff --git a/src/main/java/ru/betterend/events/PlayerAdvancementsEvents.java b/src/main/java/ru/betterend/events/PlayerAdvancementsEvents.java new file mode 100644 index 00000000..7a90891e --- /dev/null +++ b/src/main/java/ru/betterend/events/PlayerAdvancementsEvents.java @@ -0,0 +1,19 @@ +package ru.betterend.events; + +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; +import net.minecraft.advancement.Advancement; +import net.minecraft.server.network.ServerPlayerEntity; + +public final class PlayerAdvancementsEvents { + + public static Event PLAYER_ADVENCEMENT_COMPLETE = EventFactory.createArrayBacked(AdvancementComplete.class, callbacks -> (player, advancement, criterionName) -> { + for (AdvancementComplete event : callbacks) { + event.onAdvancementComplete(player, advancement, criterionName); + } + }); + + public interface AdvancementComplete { + void onAdvancementComplete(ServerPlayerEntity player, Advancement advancement, String criterionName); + } +} diff --git a/src/main/java/ru/betterend/mixin/common/PlayerAdvancementTrackerMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerAdvancementTrackerMixin.java index 662a3293..43220b04 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerAdvancementTrackerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerAdvancementTrackerMixin.java @@ -9,11 +9,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.advancement.Advancement; import net.minecraft.advancement.PlayerAdvancementTracker; -import net.minecraft.item.ItemStack; import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.Identifier; -import ru.betterend.BetterEnd; -import ru.betterend.item.GuideBookItem; + +import ru.betterend.events.PlayerAdvancementsEvents; @Mixin(PlayerAdvancementTracker.class) public abstract class PlayerAdvancementTrackerMixin { @@ -25,10 +23,7 @@ public abstract class PlayerAdvancementTrackerMixin { value = "INVOKE", target = "Lnet/minecraft/advancement/AdvancementRewards;apply(Lnet/minecraft/server/network/ServerPlayerEntity;)V", shift = Shift.AFTER)) - public void grantBonuses(Advancement advancement, String criterionName, CallbackInfoReturnable info) { - Identifier advId = new Identifier("minecraft:end/enter_end_gateway"); - if (BetterEnd.hasGuideBook() && advId.equals(advancement.getId())) { - this.owner.giveItemStack(new ItemStack(GuideBookItem.GUIDE_BOOK)); - } + public void be_onAdvancementComplete(Advancement advancement, String criterionName, CallbackInfoReturnable info) { + PlayerAdvancementsEvents.PLAYER_ADVENCEMENT_COMPLETE.invoker().onAdvancementComplete(owner, advancement, criterionName); } } From 89e327240d26ff4023beb538771815fb52774115 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sun, 10 Jan 2021 11:22:24 +0300 Subject: [PATCH 117/463] Fixed mixins conflicts and recipes console spam --- .../betterend/interfaces/BetterEndRecipe.java | 3 + .../mixin/client/AnvilScreenMixin.java | 6 +- .../mixin/client/BackgroundRendererMixin.java | 4 +- .../mixin/client/BiomeColorsMixin.java | 2 +- .../client/ClientPlayNetworkHandlerMixin.java | 4 +- .../mixin/client/ClientRecipeBookMixin.java | 6 +- .../client/EnchantingTableBlockMixin.java | 2 +- .../mixin/client/MinecraftClientMixin.java | 4 +- .../mixin/client/ModelLoaderMixin.java | 2 +- .../mixin/client/ModelVariantMapMixin.java | 2 +- .../mixin/client/MusicTrackerMixin.java | 2 +- .../client/NamespaceResourceManagerMixin.java | 2 +- .../mixin/client/WorldRendererMixin.java | 70 +++++++++---------- .../mixin/common/AbstractBlockMixin.java | 4 +- .../mixin/common/AnvilScreenHandlerMixin.java | 8 +-- .../mixin/common/BoneMealItemMixin.java | 2 +- .../mixin/common/ChorusPlantFeatureMixin.java | 3 +- .../common/CraftingScreenHandlerMixin.java | 2 +- .../mixin/common/EndPortalFeatureMixin.java | 1 - .../mixin/common/EndSpikeFeatureMixin.java | 1 - .../mixin/common/EndermanEntityMixin.java | 3 +- .../betterend/mixin/common/EntityMixin.java | 8 +-- .../mixin/common/HostileEntityMixin.java | 2 +- .../mixin/common/LandPathNodeMakerMixin.java | 1 - .../mixin/common/LivingEntityMixin.java | 8 +-- .../mixin/common/PlayerEntityMixin.java | 2 +- .../common/ServerPlayNetworkHandlerMixin.java | 2 +- .../mixin/common/ServerPlayerEntityMixin.java | 2 +- .../mixin/common/TagGroupLoaderMixin.java | 2 +- .../recipe/builders/AlloyingRecipe.java | 3 +- .../recipe/builders/AnvilRecipe.java | 3 +- .../recipe/builders/InfusionRecipe.java | 3 +- 32 files changed, 84 insertions(+), 85 deletions(-) create mode 100644 src/main/java/ru/betterend/interfaces/BetterEndRecipe.java diff --git a/src/main/java/ru/betterend/interfaces/BetterEndRecipe.java b/src/main/java/ru/betterend/interfaces/BetterEndRecipe.java new file mode 100644 index 00000000..9f939661 --- /dev/null +++ b/src/main/java/ru/betterend/interfaces/BetterEndRecipe.java @@ -0,0 +1,3 @@ +package ru.betterend.interfaces; + +public interface BetterEndRecipe {} diff --git a/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java index afde9812..1e2d76ce 100644 --- a/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java +++ b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java @@ -41,7 +41,7 @@ public class AnvilScreenMixin extends ForgingScreen { } @Inject(method = "setup", at = @At("TAIL")) - protected void setup(CallbackInfo info) { + protected void be_setup(CallbackInfo info) { this.be_buttons.clear(); int x = (width - backgroundWidth) / 2; int y = (height - backgroundHeight) / 2; @@ -51,14 +51,14 @@ public class AnvilScreenMixin extends ForgingScreen { } @Inject(method = "renderForeground", at = @At("TAIL")) - protected void renderForeground(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo info) { + protected void be_renderForeground(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo info) { if (anvilHandler.be_getRecipes().size() > 1) { this.be_buttons.forEach(button -> button.render(matrices, mouseX, mouseY, delta)); } } @Inject(method = "onSlotUpdate", at = @At("HEAD"), cancellable = true) - public void onSlotUpdate(ScreenHandler handler, int slotId, ItemStack stack, CallbackInfo info) { + public void be_onSlotUpdate(ScreenHandler handler, int slotId, ItemStack stack, CallbackInfo info) { AnvilScreenHandlerExtended anvilHandler = AnvilScreenHandlerExtended.class.cast(handler); if (anvilHandler.be_getCurrentRecipe() != null) { this.nameField.setText(""); diff --git a/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java b/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java index 9b53ff68..26d59d3a 100644 --- a/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java @@ -42,7 +42,7 @@ public class BackgroundRendererMixin { private static float blue; @Inject(method = "render", at = @At("RETURN")) - private static void onRender(Camera camera, float tickDelta, ClientWorld world, int i, float f, CallbackInfo info) { + private static void be_onRender(Camera camera, float tickDelta, ClientWorld world, int i, float f, CallbackInfo info) { long l = Util.getMeasuringTimeMs() - time; time += l; lerp += l * 0.001F; @@ -69,7 +69,7 @@ public class BackgroundRendererMixin { } @Inject(method = "applyFog", at = @At("HEAD"), cancellable = true) - private static void fogDensity(Camera camera, BackgroundRenderer.FogType fogType, float viewDistance, boolean thickFog, CallbackInfo info) { + private static void be_fogDensity(Camera camera, BackgroundRenderer.FogType fogType, float viewDistance, boolean thickFog, CallbackInfo info) { Entity entity = camera.getFocusedEntity(); Biome biome = entity.world.getBiome(entity.getBlockPos()); FluidState fluidState = camera.getSubmergedFluidState(); diff --git a/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java b/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java index 6ad1f324..15bc3b69 100644 --- a/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java +++ b/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java @@ -20,7 +20,7 @@ public class BiomeColorsMixin { private static final int STREAM_COLOR = MHelper.color(105, 213, 244); @Inject(method = "getWaterColor", at = @At("RETURN"), cancellable = true) - private static void beGetWaterColor(BlockRenderView world, BlockPos pos, CallbackInfoReturnable info) { + private static void be_getWaterColor(BlockRenderView world, BlockPos pos, CallbackInfoReturnable info) { int color = info.getReturnValue(); boolean scanDeep = true; diff --git a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java index 540f8128..b4166ed1 100644 --- a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java @@ -29,7 +29,7 @@ public class ClientPlayNetworkHandlerMixin private ClientWorld world; @Inject(method = "onSignEditorOpen", at = @At(value = "HEAD"), cancellable = true) - public void openSignEditor(SignEditorOpenS2CPacket packet, CallbackInfo info) { + public void be_openSignEditor(SignEditorOpenS2CPacket packet, CallbackInfo info) { NetworkThreadUtils.forceMainThread(packet, (ClientPlayNetworkHandler) (Object) this, (ThreadExecutor) client); BlockEntity blockEntity = this.world.getBlockEntity(packet.getPos()); @@ -41,7 +41,7 @@ public class ClientPlayNetworkHandlerMixin } @Inject(method = "onBlockEntityUpdate", at = @At(value = "HEAD"), cancellable = true) - public void onEntityUpdate(BlockEntityUpdateS2CPacket packet, CallbackInfo info) { + public void be_onEntityUpdate(BlockEntityUpdateS2CPacket packet, CallbackInfo info) { NetworkThreadUtils.forceMainThread(packet, (ClientPlayNetworkHandler) (Object) this, (ThreadExecutor) client); BlockPos blockPos = packet.getPos(); diff --git a/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java b/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java index 1ef0fa79..d4185133 100644 --- a/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java @@ -8,15 +8,17 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.client.recipebook.ClientRecipeBook; import net.minecraft.client.recipebook.RecipeBookGroup; import net.minecraft.recipe.Recipe; +import ru.betterend.interfaces.BetterEndRecipe; import ru.betterend.recipe.builders.AlloyingRecipe; @Mixin(ClientRecipeBook.class) public abstract class ClientRecipeBookMixin { @Inject(method = "getGroupForRecipe", at = @At("HEAD"), cancellable = true) - private static void getGroupForRecipe(Recipe recipe, CallbackInfoReturnable cinfo) { + private static void be_getGroupForRecipe(Recipe recipe, CallbackInfoReturnable cinfo) { if (recipe instanceof AlloyingRecipe) { cinfo.setReturnValue(RecipeBookGroup.BLAST_FURNACE_MISC); - cinfo.cancel(); + } else if (recipe instanceof BetterEndRecipe) { + cinfo.setReturnValue(RecipeBookGroup.UNKNOWN); } } } diff --git a/src/main/java/ru/betterend/mixin/client/EnchantingTableBlockMixin.java b/src/main/java/ru/betterend/mixin/client/EnchantingTableBlockMixin.java index 113e3c27..ee3c03aa 100644 --- a/src/main/java/ru/betterend/mixin/client/EnchantingTableBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/client/EnchantingTableBlockMixin.java @@ -22,7 +22,7 @@ public abstract class EnchantingTableBlockMixin extends Block { } @Inject(method = "randomDisplayTick", at = @At(value = "TAIL")) - private void beOnRandomDisplayTick(BlockState state, World world, BlockPos pos, Random random, CallbackInfo info) { + private void be_onRandomDisplayTick(BlockState state, World world, BlockPos pos, Random random, CallbackInfo info) { for (int px = -2; px <= 2; ++px) { for (int pz = -2; pz <= 2; ++pz) { if (px > -2 && px < 2 && pz == -1) { diff --git a/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java b/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java index 28a02e22..48a734f9 100644 --- a/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java +++ b/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java @@ -48,7 +48,7 @@ public class MinecraftClientMixin { private ItemColors itemColors; @Inject(method = "*", at = @At("TAIL")) - private void onInit(RunArgs args, CallbackInfo info) { + private void be_onInit(RunArgs args, CallbackInfo info) { Registry.BLOCK.forEach(block -> { if (block instanceof IColorProvider) { IColorProvider provider = (IColorProvider) block; @@ -59,7 +59,7 @@ public class MinecraftClientMixin { } @Inject(method = "getMusicType", at = @At("HEAD"), cancellable = true) - private void getEndMusic(CallbackInfoReturnable info) { + private void be_getEndMusic(CallbackInfoReturnable info) { if (!(this.currentScreen instanceof CreditsScreen) && this.player != null) { if (this.player.world.getRegistryKey() == World.END) { if (this.inGameHud.getBossBarHud().shouldPlayDragonMusic() && MHelper.lengthSqr(this.player.getX(), this.player.getZ()) < 250000) { diff --git a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java index c28b1dd3..b2688d0b 100644 --- a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java @@ -32,7 +32,7 @@ public class ModelLoaderMixin { private ResourceManager resourceManager; @Inject(method = "loadModelFromJson", at = @At("HEAD"), cancellable = true) - private void loadModelPattern(Identifier id, CallbackInfoReturnable info) { + private void be_loadModelPattern(Identifier id, CallbackInfoReturnable info) { if (id.getNamespace().equals(BetterEnd.MOD_ID)) { Identifier modelId = new Identifier(id.getNamespace(), "models/" + id.getPath() + ".json"); JsonUnbakedModel model; diff --git a/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java b/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java index 2c982d31..5b3cf1dc 100644 --- a/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java @@ -20,7 +20,7 @@ import ru.betterend.patterns.BlockPatterned; public abstract class ModelVariantMapMixin { @Inject(method = "deserialize", at = @At("HEAD"), cancellable = true) - private static void deserializeBlockState(ModelVariantMap.DeserializationContext context, Reader reader, CallbackInfoReturnable info) { + private static void be_deserializeBlockState(ModelVariantMap.DeserializationContext context, Reader reader, CallbackInfoReturnable info) { Block block = context.getStateFactory().getDefaultState().getBlock(); if (block instanceof BlockPatterned) { String pattern = ((BlockPatterned) block).getStatesPattern(reader); diff --git a/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java b/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java index 0e93e7c9..afae2d88 100644 --- a/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java @@ -39,7 +39,7 @@ public class MusicTrackerMixin { private static long time; @Inject(method = "tick", at = @At("HEAD"), cancellable = true) - public void beOnTick(CallbackInfo info) { + public void be_onTick(CallbackInfo info) { if (ClientOptions.blendBiomeMusic()) { MusicSound musicSound = client.getMusicType(); if (volume > 0 && beIsInEnd() && beShouldChangeSound(musicSound)) { diff --git a/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java b/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java index 8152e707..64c8f889 100644 --- a/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java @@ -30,7 +30,7 @@ public abstract class NamespaceResourceManagerMixin { value = "NEW", target = "java/io/FileNotFoundException", shift = Shift.BEFORE)) - public void getStatesPattern(Identifier id, CallbackInfoReturnable> info) { + public void be_getStatesPattern(Identifier id, CallbackInfoReturnable> info) { if (id.getNamespace().equals(BetterEnd.MOD_ID)) { String[] data = id.getPath().split("/"); if (data.length > 1) { diff --git a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java index d5a9911d..75f78bca 100644 --- a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java @@ -76,8 +76,8 @@ public class WorldRendererMixin { private int ticks; @Inject(method = "*", at = @At("TAIL")) - private void onInit(MinecraftClient client, BufferBuilderStorage bufferBuilders, CallbackInfo info) { - initStars(); + private void be_onInit(MinecraftClient client, BufferBuilderStorage bufferBuilders, CallbackInfo info) { + be_initStars(); Random random = new Random(131); axis1 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); axis2 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); @@ -92,7 +92,7 @@ public class WorldRendererMixin { } @Inject(method = "renderSky", at = @At("HEAD"), cancellable = true) - private void renderBetterEndSky(MatrixStack matrices, float tickDelta, CallbackInfo info) { + private void be_renderBetterEndSky(MatrixStack matrices, float tickDelta, CallbackInfo info) { if (ClientOptions.isCustomSky() && client.world.getSkyProperties().getSkyType() == SkyProperties.SkyType.END) { time = (ticks % 360000) * 0.000017453292F; time2 = time * 2; @@ -121,31 +121,31 @@ public class WorldRendererMixin { matrices.push(); matrices.multiply(new Quaternion(0, time, 0, false)); textureManager.bindTexture(HORIZON); - renderBuffer(matrices, horizon, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, 0.7F * blindA); + be_renderBuffer(matrices, horizon, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, 0.7F * blindA); matrices.pop(); matrices.push(); matrices.multiply(new Quaternion(0, -time, 0, false)); textureManager.bindTexture(NEBULA_1); - renderBuffer(matrices, nebulas1, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, blind02); + be_renderBuffer(matrices, nebulas1, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, blind02); matrices.pop(); matrices.push(); matrices.multiply(new Quaternion(0, time2, 0, false)); textureManager.bindTexture(NEBULA_2); - renderBuffer(matrices, nebulas2, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, blind02); + be_renderBuffer(matrices, nebulas2, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, blind02); matrices.pop(); textureManager.bindTexture(STARS); matrices.push(); matrices.multiply(axis3.getRadialQuaternion(time)); - renderBuffer(matrices, stars3, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, blind06); + be_renderBuffer(matrices, stars3, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, blind06); matrices.pop(); matrices.push(); matrices.multiply(axis4.getRadialQuaternion(time2)); - renderBuffer(matrices, stars4, VertexFormats.POSITION_TEXTURE, 1F, 1F, 1F, blind06); + be_renderBuffer(matrices, stars4, VertexFormats.POSITION_TEXTURE, 1F, 1F, 1F, blind06); matrices.pop(); } @@ -153,7 +153,7 @@ public class WorldRendererMixin { if (a > 0) { if (a > 1) a = 1; textureManager.bindTexture(FOG); - renderBuffer(matrices, fog, VertexFormats.POSITION_TEXTURE, BackgroundInfo.red, BackgroundInfo.green, BackgroundInfo.blue, a); + be_renderBuffer(matrices, fog, VertexFormats.POSITION_TEXTURE, BackgroundInfo.red, BackgroundInfo.green, BackgroundInfo.blue, a); } RenderSystem.disableTexture(); @@ -161,12 +161,12 @@ public class WorldRendererMixin { if (blindA > 0) { matrices.push(); matrices.multiply(axis1.getRadialQuaternion(time3)); - renderBuffer(matrices, stars1, VertexFormats.POSITION, 1, 1, 1, blind06); + be_renderBuffer(matrices, stars1, VertexFormats.POSITION, 1, 1, 1, blind06); matrices.pop(); matrices.push(); matrices.multiply(axis2.getRadialQuaternion(time2)); - renderBuffer(matrices, stars2, VertexFormats.POSITION, 0.95F, 0.64F, 0.93F, blind06); + be_renderBuffer(matrices, stars2, VertexFormats.POSITION, 0.95F, 0.64F, 0.93F, blind06); matrices.pop(); } @@ -177,7 +177,7 @@ public class WorldRendererMixin { } } - private void renderBuffer(MatrixStack matrices, VertexBuffer buffer, VertexFormat format, float r, float g, float b, float a) { + private void be_renderBuffer(MatrixStack matrices, VertexBuffer buffer, VertexFormat format, float r, float g, float b, float a) { RenderSystem.color4f(r, g, b, a); buffer.bind(); format.startDrawing(0L); @@ -186,84 +186,84 @@ public class WorldRendererMixin { format.endDrawing(); } - private void initStars() { + private void be_initStars() { BufferBuilder buffer = Tessellator.getInstance().getBuffer(); - stars1 = buildBufferStars(buffer, stars1, 0.1, 0.30, 3500, 41315); - stars2 = buildBufferStars(buffer, stars2, 0.1, 0.35, 2000, 35151); - stars3 = buildBufferUVStars(buffer, stars3, 0.4, 1.2, 1000, 61354); - stars4 = buildBufferUVStars(buffer, stars4, 0.4, 1.2, 1000, 61355); - nebulas1 = buildBufferFarFog(buffer, nebulas1, 40, 60, 30, 11515); - nebulas2 = buildBufferFarFog(buffer, nebulas2, 40, 60, 10, 14151); - horizon = buildBufferHorizon(buffer, horizon); - fog = buildBufferFog(buffer, fog); + stars1 = be_buildBufferStars(buffer, stars1, 0.1, 0.30, 3500, 41315); + stars2 = be_buildBufferStars(buffer, stars2, 0.1, 0.35, 2000, 35151); + stars3 = be_buildBufferUVStars(buffer, stars3, 0.4, 1.2, 1000, 61354); + stars4 = be_buildBufferUVStars(buffer, stars4, 0.4, 1.2, 1000, 61355); + nebulas1 = be_buildBufferFarFog(buffer, nebulas1, 40, 60, 30, 11515); + nebulas2 = be_buildBufferFarFog(buffer, nebulas2, 40, 60, 10, 14151); + horizon = be_buildBufferHorizon(buffer, horizon); + fog = be_buildBufferFog(buffer, fog); } - private VertexBuffer buildBufferStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { + private VertexBuffer be_buildBufferStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { if (buffer != null) { buffer.close(); } buffer = new VertexBuffer(VertexFormats.POSITION); - makeStars(bufferBuilder, minSize, maxSize, count, seed); + be_makeStars(bufferBuilder, minSize, maxSize, count, seed); bufferBuilder.end(); buffer.upload(bufferBuilder); return buffer; } - private VertexBuffer buildBufferUVStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { + private VertexBuffer be_buildBufferUVStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { if (buffer != null) { buffer.close(); } buffer = new VertexBuffer(VertexFormats.POSITION_TEXTURE); - makeUVStars(bufferBuilder, minSize, maxSize, count, seed); + be_makeUVStars(bufferBuilder, minSize, maxSize, count, seed); bufferBuilder.end(); buffer.upload(bufferBuilder); return buffer; } - private VertexBuffer buildBufferFarFog(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { + private VertexBuffer be_buildBufferFarFog(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { if (buffer != null) { buffer.close(); } buffer = new VertexBuffer(VertexFormats.POSITION_TEXTURE); - makeFarFog(bufferBuilder, minSize, maxSize, count, seed); + be_makeFarFog(bufferBuilder, minSize, maxSize, count, seed); bufferBuilder.end(); buffer.upload(bufferBuilder); return buffer; } - private VertexBuffer buildBufferHorizon(BufferBuilder bufferBuilder, VertexBuffer buffer) { + private VertexBuffer be_buildBufferHorizon(BufferBuilder bufferBuilder, VertexBuffer buffer) { if (buffer != null) { buffer.close(); } buffer = new VertexBuffer(VertexFormats.POSITION_TEXTURE); - makeCylinder(bufferBuilder, 16, 50, 100); + be_makeCylinder(bufferBuilder, 16, 50, 100); bufferBuilder.end(); buffer.upload(bufferBuilder); return buffer; } - private VertexBuffer buildBufferFog(BufferBuilder bufferBuilder, VertexBuffer buffer) { + private VertexBuffer be_buildBufferFog(BufferBuilder bufferBuilder, VertexBuffer buffer) { if (buffer != null) { buffer.close(); } buffer = new VertexBuffer(VertexFormats.POSITION_TEXTURE); - makeCylinder(bufferBuilder, 16, 50, 70); + be_makeCylinder(bufferBuilder, 16, 50, 70); bufferBuilder.end(); buffer.upload(bufferBuilder); return buffer; } - private void makeStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { + private void be_makeStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { Random random = new Random(seed); buffer.begin(7, VertexFormats.POSITION); @@ -306,7 +306,7 @@ public class WorldRendererMixin { } } - private void makeUVStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { + private void be_makeUVStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { Random random = new Random(seed); buffer.begin(7, VertexFormats.POSITION_TEXTURE); @@ -354,7 +354,7 @@ public class WorldRendererMixin { } } - private void makeFarFog(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { + private void be_makeFarFog(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { Random random = new Random(seed); buffer.begin(7, VertexFormats.POSITION_TEXTURE); @@ -405,7 +405,7 @@ public class WorldRendererMixin { } } - private void makeCylinder(BufferBuilder buffer, int segments, double height, double radius) { + private void be_makeCylinder(BufferBuilder buffer, int segments, double height, double radius) { buffer.begin(7, VertexFormats.POSITION_TEXTURE); for (int i = 0; i < segments; i ++) { double a1 = (double) i * Math.PI * 2.0 / (double) segments; diff --git a/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java b/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java index fa06fe62..4f00cf95 100644 --- a/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java @@ -26,7 +26,7 @@ import ru.betterend.util.MHelper; public abstract class AbstractBlockMixin { @Inject(method = "getDroppedStacks", at = @At("HEAD"), cancellable = true) - public void getDroppedStacks(BlockState state, LootContext.Builder builder, CallbackInfoReturnable> info) { + public void be_getDroppedStacks(BlockState state, LootContext.Builder builder, CallbackInfoReturnable> info) { if (state.isOf(Blocks.GLOWSTONE)) { ItemStack tool = builder.get(LootContextParameters.TOOL); if (tool != null && tool.getItem() instanceof EndHammerItem) { @@ -39,12 +39,10 @@ public abstract class AbstractBlockMixin { min = MathHelper.clamp(min + fortune, min, max); if (min == max) { info.setReturnValue(Lists.newArrayList(new ItemStack(Items.GLOWSTONE_DUST, max))); - info.cancel(); } } count = MHelper.randRange(min, max, MHelper.RANDOM); info.setReturnValue(Lists.newArrayList(new ItemStack(Items.GLOWSTONE_DUST, count))); - info.cancel(); } } } diff --git a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java index 9552ca91..28ecb95c 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java @@ -40,7 +40,7 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler imple public abstract void updateResult(); @Inject(method = "canTakeOutput", at = @At("HEAD"), cancellable = true) - protected void canTakeOutput(PlayerEntity player, boolean present, CallbackInfoReturnable info) { + protected void be_canTakeOutput(PlayerEntity player, boolean present, CallbackInfoReturnable info) { if (be_currentRecipe != null) { ItemStack output = this.be_currentRecipe.craft(input, player); if (!output.isEmpty()) { @@ -50,7 +50,7 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler imple } @Inject(method = "onTakeOutput", at = @At("HEAD"), cancellable = true) - protected void onTakeOutput(PlayerEntity player, ItemStack stack, CallbackInfoReturnable info) { + protected void be_onTakeOutput(PlayerEntity player, ItemStack stack, CallbackInfoReturnable info) { if (be_currentRecipe != null) { this.input.getStack(0).decrement(1); this.onContentChanged(input); @@ -74,7 +74,7 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler imple } @Inject(method = "updateResult", at = @At("HEAD"), cancellable = true) - public void updateOutput(CallbackInfo info) { + public void be_updateOutput(CallbackInfo info) { RecipeManager recipeManager = this.player.world.getRecipeManager(); this.be_recipes = recipeManager.getAllMatches(AnvilRecipe.TYPE, input, player.world); if (be_recipes.size() > 0) { @@ -85,7 +85,7 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler imple } @Inject(method = "setNewItemName", at = @At("HEAD"), cancellable = true) - public void setNewItemName(String string, CallbackInfo info) { + public void be_setNewItemName(String string, CallbackInfo info) { if (be_currentRecipe != null) { info.cancel(); } diff --git a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java index c133c80a..78618504 100644 --- a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java +++ b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java @@ -31,7 +31,7 @@ public class BoneMealItemMixin { private static final Mutable POS = new Mutable(); @Inject(method = "useOnBlock", at = @At("HEAD"), cancellable = true) - private void beOnUse(ItemUsageContext context, CallbackInfoReturnable info) { + private void be_onUse(ItemUsageContext context, CallbackInfoReturnable info) { World world = context.getWorld(); BlockPos blockPos = context.getBlockPos(); if (!world.isClient) { diff --git a/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java index 4f696af9..7742405a 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java @@ -23,7 +23,7 @@ import ru.betterend.util.MHelper; @Mixin(ChorusPlantFeature.class) public class ChorusPlantFeatureMixin { @Inject(method = "generate", at = @At("HEAD"), cancellable = true) - private void onGenerate(StructureWorldAccess structureWorldAccess, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, DefaultFeatureConfig defaultFeatureConfig, CallbackInfoReturnable info) { + private void be_onGenerate(StructureWorldAccess structureWorldAccess, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, DefaultFeatureConfig defaultFeatureConfig, CallbackInfoReturnable info) { if (structureWorldAccess.isAir(blockPos) && structureWorldAccess.getBlockState(blockPos.down()).isOf(EndBlocks.CHORUS_NYLIUM)) { ChorusFlowerBlock.generate(structureWorldAccess, blockPos, random, MHelper.randRange(8, 16, random)); BlockState bottom = structureWorldAccess.getBlockState(blockPos); @@ -31,7 +31,6 @@ public class ChorusPlantFeatureMixin { BlocksHelper.setWithoutUpdate(structureWorldAccess, blockPos, bottom.with(BlocksHelper.ROOTS, true).with(ConnectingBlock.DOWN, true)); } info.setReturnValue(true); - info.cancel(); } } } diff --git a/src/main/java/ru/betterend/mixin/common/CraftingScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/CraftingScreenHandlerMixin.java index ded3676d..7e533fa9 100644 --- a/src/main/java/ru/betterend/mixin/common/CraftingScreenHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/CraftingScreenHandlerMixin.java @@ -20,7 +20,7 @@ public abstract class CraftingScreenHandlerMixin private ScreenHandlerContext context; @Inject(method = "canUse", at = @At("HEAD"), cancellable = true) - private void canUse(PlayerEntity player, CallbackInfoReturnable info) { + private void be_canUse(PlayerEntity player, CallbackInfoReturnable info) { if (context.run((world, pos) -> { return world.getBlockState(pos).getBlock() instanceof CraftingTableBlock; }, true)) { diff --git a/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java index c0592b43..32841385 100644 --- a/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java @@ -20,7 +20,6 @@ public class EndPortalFeatureMixin { private void bePortalGenerate(StructureWorldAccess structureWorldAccess, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, DefaultFeatureConfig defaultFeatureConfig, CallbackInfoReturnable info) { if (!GeneratorOptions.hasPortal()) { info.setReturnValue(false); - info.cancel(); } } } diff --git a/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java index 0b1a8eb1..662e3ef4 100644 --- a/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java @@ -20,7 +20,6 @@ public class EndSpikeFeatureMixin { private void beSpikeGenerate(StructureWorldAccess structureWorldAccess, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, EndSpikeFeatureConfig endSpikeFeatureConfig, CallbackInfoReturnable info) { if (!GeneratorOptions.hasPillars()) { info.setReturnValue(false); - info.cancel(); } } } diff --git a/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java b/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java index 5bd9b493..3abbf94d 100644 --- a/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java @@ -16,11 +16,10 @@ import ru.betterend.effects.EndStatusEffects; public abstract class EndermanEntityMixin { @Inject(method = "isPlayerStaring", at = @At("HEAD"), cancellable = true) - private void isPlayerStaring(PlayerEntity player, CallbackInfoReturnable info) { + private void be_isPlayerStaring(PlayerEntity player, CallbackInfoReturnable info) { if (player.isCreative() || player.hasStatusEffect(EndStatusEffects.END_VEIL) || EnchantmentHelper.getLevel(EndEnchantments.END_VEIL, player.getEquippedStack(EquipmentSlot.HEAD)) > 0) { info.setReturnValue(false); - info.cancel(); } } } diff --git a/src/main/java/ru/betterend/mixin/common/EntityMixin.java b/src/main/java/ru/betterend/mixin/common/EntityMixin.java index 320547fc..ff6420a3 100644 --- a/src/main/java/ru/betterend/mixin/common/EntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EntityMixin.java @@ -53,7 +53,7 @@ public abstract class EntityMixin implements TeleportingEntity { protected abstract TeleportTarget getTeleportTarget(ServerWorld destination); @Inject(method = "moveToWorld", at = @At("HEAD"), cancellable = true) - public void moveToWorld(ServerWorld destination, CallbackInfoReturnable info) { + public void be_moveToWorld(ServerWorld destination, CallbackInfoReturnable info) { if (!removed && beExitPos != null && world instanceof ServerWorld) { this.detach(); this.world.getProfiler().push("changeDimension"); @@ -75,21 +75,19 @@ public abstract class EntityMixin implements TeleportingEntity { this.world.getProfiler().pop(); this.beExitPos = null; info.setReturnValue(entity); - info.cancel(); } } } @Inject(method = "getTeleportTarget", at = @At("HEAD"), cancellable = true) - protected void getTeleportTarget(ServerWorld destination, CallbackInfoReturnable info) { + protected void be_getTeleportTarget(ServerWorld destination, CallbackInfoReturnable info) { if (beExitPos != null) { info.setReturnValue(new TeleportTarget(new Vec3d(beExitPos.getX() + 0.5D, beExitPos.getY(), beExitPos.getZ() + 0.5D), getVelocity(), yaw, pitch)); - info.cancel(); } } @Inject(method = "baseTick", at = @At("TAIL")) - public void baseTick(CallbackInfo info) { + public void be_baseTick(CallbackInfo info) { if (hasCooldown()) { this.beCooldown--; } diff --git a/src/main/java/ru/betterend/mixin/common/HostileEntityMixin.java b/src/main/java/ru/betterend/mixin/common/HostileEntityMixin.java index dee0f41a..0e2e4bcb 100644 --- a/src/main/java/ru/betterend/mixin/common/HostileEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/HostileEntityMixin.java @@ -19,7 +19,7 @@ import net.minecraft.world.ServerWorldAccess; @Mixin(HostileEntity.class) public class HostileEntityMixin { @Inject(method = "canSpawnInDark", at = @At(value = "RETURN"), cancellable = true) - private static void endermenCheck(EntityType type, ServerWorldAccess serverWorldAccess, SpawnReason spawnReason, BlockPos pos, Random random, CallbackInfoReturnable info) { + private static void be_endermenCheck(EntityType type, ServerWorldAccess serverWorldAccess, SpawnReason spawnReason, BlockPos pos, Random random, CallbackInfoReturnable info) { boolean canSpawn = info.getReturnValue(); if (canSpawn && spawnReason == SpawnReason.NATURAL && type == EntityType.ENDERMAN) { Box box = new Box(pos).expand(16); diff --git a/src/main/java/ru/betterend/mixin/common/LandPathNodeMakerMixin.java b/src/main/java/ru/betterend/mixin/common/LandPathNodeMakerMixin.java index 50d5451b..224c3d89 100644 --- a/src/main/java/ru/betterend/mixin/common/LandPathNodeMakerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/LandPathNodeMakerMixin.java @@ -24,6 +24,5 @@ public class LandPathNodeMakerMixin { private static void beCactusDamage(CallbackInfoReturnable info) { info.setReturnValue(PathNodeType.DAMAGE_CACTUS); - info.cancel(); } } diff --git a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java index 954e0276..442fdeae 100644 --- a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java @@ -22,20 +22,20 @@ public abstract class LivingEntityMixin { private Entity lastAttacker; @Inject(method = "damage", at = @At("HEAD")) - public void damage(DamageSource source, float amount, CallbackInfoReturnable info) { + public void be_damage(DamageSource source, float amount, CallbackInfoReturnable info) { this.lastAttacker = source.getAttacker(); } @ModifyArg(method = "damage", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;takeKnockback(FDD)V")) - private float increaseKnockback(float value, double x, double z) { + private float be_increaseKnockback(float value, double x, double z) { if (lastAttacker != null && lastAttacker instanceof LivingEntity) { LivingEntity attacker = (LivingEntity) lastAttacker; - value += this.getKnockback(attacker.getMainHandStack().getItem()); + value += this.be_getKnockback(attacker.getMainHandStack().getItem()); } return value; } - private double getKnockback(Item tool) { + private double be_getKnockback(Item tool) { if (tool == null) return 0.0D; Collection modifiers = tool.getAttributeModifiers(EquipmentSlot.MAINHAND) .get(EntityAttributes.GENERIC_ATTACK_KNOCKBACK); diff --git a/src/main/java/ru/betterend/mixin/common/PlayerEntityMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerEntityMixin.java index e00fa670..e85db22e 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerEntityMixin.java @@ -24,7 +24,7 @@ public abstract class PlayerEntityMixin { private static Direction[] HORIZONTAL; @Inject(method = "findRespawnPosition", at = @At(value = "HEAD"), cancellable = true) - private static void statueRespawn(ServerWorld world, BlockPos pos, float f, boolean bl, boolean bl2, CallbackInfoReturnable> info) { + private static void be_statueRespawn(ServerWorld world, BlockPos pos, float f, boolean bl, boolean bl2, CallbackInfoReturnable> info) { BlockState blockState = world.getBlockState(pos); if (blockState.isOf(EndBlocks.RESPAWN_OBELISK)) { info.setReturnValue(beObeliskRespawnPosition(world, pos, blockState)); diff --git a/src/main/java/ru/betterend/mixin/common/ServerPlayNetworkHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/ServerPlayNetworkHandlerMixin.java index 4be1ac7d..1df58138 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerPlayNetworkHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerPlayNetworkHandlerMixin.java @@ -29,7 +29,7 @@ public class ServerPlayNetworkHandlerMixin { public ServerPlayerEntity player; @Inject(method = "onSignUpdate", at = @At(value = "HEAD"), cancellable = true) - private void signUpdate(UpdateSignC2SPacket packet, CallbackInfo info) { + private void be_signUpdate(UpdateSignC2SPacket packet, CallbackInfo info) { NetworkThreadUtils.forceMainThread(packet, (ServerPlayNetworkHandler) (Object) this, (ServerWorld) this.player.getServerWorld()); this.player.updateLastActionTime(); ServerWorld serverWorld = this.player.getServerWorld(); diff --git a/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java b/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java index 4128a8c4..8199b00e 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java @@ -15,7 +15,7 @@ public abstract class ServerPlayerEntityMixin implements TeleportingEntity { private long beCooldown; @Inject(method = "tick", at = @At("TAIL")) - public void baseTick(CallbackInfo info) { + public void be_baseTick(CallbackInfo info) { if (hasCooldown()) { this.beCooldown--; } diff --git a/src/main/java/ru/betterend/mixin/common/TagGroupLoaderMixin.java b/src/main/java/ru/betterend/mixin/common/TagGroupLoaderMixin.java index b5fbf4ed..21038c9e 100644 --- a/src/main/java/ru/betterend/mixin/common/TagGroupLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/common/TagGroupLoaderMixin.java @@ -23,7 +23,7 @@ public class TagGroupLoaderMixin { private String entryType; @Inject(method = "prepareReload", at = @At("RETURN"), cancellable = true) - public void prepareReload(ResourceManager manager, Executor prepareExecutor, CallbackInfoReturnable>> info) { + public void be_prepareReload(ResourceManager manager, Executor prepareExecutor, CallbackInfoReturnable>> info) { CompletableFuture> future = info.getReturnValue(); info.setReturnValue(CompletableFuture.supplyAsync(() -> { Map map = future.join(); diff --git a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java index 6a18f458..1467b497 100644 --- a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java @@ -21,12 +21,13 @@ import net.minecraft.util.collection.DefaultedList; import net.minecraft.world.World; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; +import ru.betterend.interfaces.BetterEndRecipe; import ru.betterend.recipe.EndRecipeManager; import ru.betterend.registry.EndBlocks; import ru.betterend.util.ItemUtil; import ru.betterend.util.RecipeHelper; -public class AlloyingRecipe implements Recipe { +public class AlloyingRecipe implements Recipe, BetterEndRecipe { public final static String GROUP = "alloying"; public final static RecipeType TYPE = EndRecipeManager.registerType(GROUP); diff --git a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java index 3af522cb..d38a5095 100644 --- a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java @@ -22,12 +22,13 @@ import net.minecraft.util.collection.DefaultedList; import net.minecraft.world.World; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; +import ru.betterend.interfaces.BetterEndRecipe; import ru.betterend.recipe.EndRecipeManager; import ru.betterend.registry.EndTags; import ru.betterend.util.ItemUtil; import ru.betterend.util.RecipeHelper; -public class AnvilRecipe implements Recipe { +public class AnvilRecipe implements Recipe, BetterEndRecipe { public final static String GROUP = "smithing"; public final static RecipeType TYPE = EndRecipeManager.registerType(GROUP); diff --git a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java index 7504abc9..f6bcb41e 100644 --- a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java @@ -20,11 +20,12 @@ import net.minecraft.world.World; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; +import ru.betterend.interfaces.BetterEndRecipe; import ru.betterend.recipe.EndRecipeManager; import ru.betterend.rituals.InfusionRitual; import ru.betterend.util.ItemUtil; -public class InfusionRecipe implements Recipe { +public class InfusionRecipe implements Recipe, BetterEndRecipe { public final static String GROUP = "infusion"; public final static RecipeType TYPE = EndRecipeManager.registerType(GROUP); From e96753eb2e1811ae41db274e1ae5e09b2e96f125 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 10 Jan 2021 15:47:30 +0300 Subject: [PATCH 118/463] Blossoming berry feature --- src/main/java/ru/betterend/registry/EndFeatures.java | 1 + .../java/ru/betterend/world/biome/BiomeBlossomingSpires.java | 1 + .../java/ru/betterend/world/features/SinglePlantFeature.java | 5 +++++ 3 files changed, 7 insertions(+) diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 0f875e3d..1ea1d4a5 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -86,6 +86,7 @@ public class EndFeatures { public static final EndFeature TWISTED_UMBRELLA_MOSS = new EndFeature("twisted_umbrella_moss", new DoublePlantFeature(EndBlocks.TWISTED_UMBRELLA_MOSS, EndBlocks.TWISTED_UMBRELLA_MOSS_TALL, 6), 5); public static final EndFeature JUNGLE_GRASS = new EndFeature("jungle_grass", new SinglePlantFeature(EndBlocks.JUNGLE_GRASS, 7, 3), 8); public static final EndFeature SMALL_JELLYSHROOM_FLOOR = new EndFeature("small_jellyshroom_floor", new SinglePlantFeature(EndBlocks.SMALL_JELLYSHROOM, 5, 5), 4); + public static final EndFeature BLOSSOM_BERRY = new EndFeature("blossom_berry", new SinglePlantFeature(EndBlocks.BLOSSOM_BERRY, 3, 3), 2); // Vines // public static final EndFeature DENSE_VINE = new EndFeature("dense_vine", new VineFeature(EndBlocks.DENSE_VINE, 24), 3); diff --git a/src/main/java/ru/betterend/world/biome/BiomeBlossomingSpires.java b/src/main/java/ru/betterend/world/biome/BiomeBlossomingSpires.java index dbecf76a..69aed399 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeBlossomingSpires.java +++ b/src/main/java/ru/betterend/world/biome/BiomeBlossomingSpires.java @@ -22,6 +22,7 @@ public class BiomeBlossomingSpires extends EndBiome { .addFeature(EndFeatures.BULB_VINE) .addFeature(EndFeatures.BUSHY_GRASS) .addFeature(EndFeatures.BUSHY_GRASS_WG) + .addFeature(EndFeatures.BLOSSOM_BERRY) .addFeature(EndFeatures.TWISTED_MOSS) .addFeature(EndFeatures.TWISTED_MOSS_WOOD) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4)); diff --git a/src/main/java/ru/betterend/world/features/SinglePlantFeature.java b/src/main/java/ru/betterend/world/features/SinglePlantFeature.java index 0fbc1021..892c3da4 100644 --- a/src/main/java/ru/betterend/world/features/SinglePlantFeature.java +++ b/src/main/java/ru/betterend/world/features/SinglePlantFeature.java @@ -7,6 +7,7 @@ import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.basis.DoublePlantBlock; +import ru.betterend.blocks.basis.EndCropBlock; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.util.BlocksHelper; @@ -56,6 +57,10 @@ public class SinglePlantFeature extends ScatterFeature { BlocksHelper.setWithoutUpdate(world, blockPos, state); BlocksHelper.setWithoutUpdate(world, blockPos.up(), state.with(DoublePlantBlock.TOP, true)); } + else if (plant instanceof EndCropBlock) { + BlockState state = plant.getDefaultState().with(EndCropBlock.AGE, 3); + BlocksHelper.setWithoutUpdate(world, blockPos, state); + } else if (plant instanceof EndPlantWithAgeBlock) { int age = random.nextInt(4); BlockState state = plant.getDefaultState().with(EndPlantWithAgeBlock.AGE, age); From 614d0a58d21f36c52a664367bcc172e939d0e3f9 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 10 Jan 2021 16:42:31 +0300 Subject: [PATCH 119/463] Chorus plant mixins config, Helix tree enhancements --- .../mixin/common/ChorusFlowerBlockMixin.java | 10 +++++-- .../mixin/common/ChorusPlantBlockMixin.java | 27 +++++++++++++++---- .../mixin/common/ChorusPlantFeatureMixin.java | 8 +++++- .../ru/betterend/registry/EndFeatures.java | 21 ++++++++------- .../features/trees/HelixTreeFeature.java | 12 ++++++--- .../world/generator/GeneratorOptions.java | 12 +++++++++ 6 files changed, 69 insertions(+), 21 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java index 6c354ff5..88cec28b 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java @@ -29,6 +29,7 @@ import net.minecraft.world.WorldView; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; +import ru.betterend.world.generator.GeneratorOptions; @Mixin(value = ChorusFlowerBlock.class, priority = 100) public abstract class ChorusFlowerBlockMixin extends Block { @@ -59,7 +60,12 @@ public abstract class ChorusFlowerBlockMixin extends Block { int i = state.get(ChorusFlowerBlock.AGE); if (i < 5) { this.grow(world, up, i + 1); - BlocksHelper.setWithoutUpdate(world, pos, plantBlock.getDefaultState().with(ChorusPlantBlock.UP, true).with(ChorusPlantBlock.DOWN, true).with(BlocksHelper.ROOTS, true)); + if (GeneratorOptions.changeChorusPlant()) { + BlocksHelper.setWithoutUpdate(world, pos, plantBlock.getDefaultState().with(ChorusPlantBlock.UP, true).with(ChorusPlantBlock.DOWN, true).with(BlocksHelper.ROOTS, true)); + } + else { + BlocksHelper.setWithoutUpdate(world, pos, plantBlock.getDefaultState().with(ChorusPlantBlock.UP, true).with(ChorusPlantBlock.DOWN, true)); + } info.cancel(); } } @@ -69,7 +75,7 @@ public abstract class ChorusFlowerBlockMixin extends Block { @Inject(method = "generate", at = @At("RETURN"), cancellable = true) private static void beOnGenerate(WorldAccess world, BlockPos pos, Random random, int size, CallbackInfo info) { BlockState state = world.getBlockState(pos); - if (state.isOf(Blocks.CHORUS_PLANT)) { + if (GeneratorOptions.changeChorusPlant() && state.isOf(Blocks.CHORUS_PLANT)) { BlocksHelper.setWithoutUpdate(world, pos, state.with(BlocksHelper.ROOTS, true)); } } diff --git a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java index f133d166..b06d48a8 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java @@ -23,6 +23,7 @@ import net.minecraft.world.WorldView; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; +import ru.betterend.world.generator.GeneratorOptions; @Mixin(value = ChorusPlantBlock.class, priority = 100) public abstract class ChorusPlantBlockMixin extends Block { @@ -32,12 +33,16 @@ public abstract class ChorusPlantBlockMixin extends Block { @Inject(method = "*", at = @At("TAIL")) private void beOnInit(AbstractBlock.Settings settings, CallbackInfo info) { - this.setDefaultState(this.getDefaultState().with(BlocksHelper.ROOTS, false)); + if (GeneratorOptions.changeChorusPlant()) { + this.setDefaultState(this.getDefaultState().with(BlocksHelper.ROOTS, false)); + } } @Inject(method = "appendProperties", at = @At("TAIL")) private void beAddProperties(StateManager.Builder builder, CallbackInfo info) { - builder.add(BlocksHelper.ROOTS); + if (GeneratorOptions.changeChorusPlant()) { + builder.add(BlocksHelper.ROOTS); + } } @Inject(method = "withConnectionProperties", at = @At("RETURN"), cancellable = true) @@ -69,11 +74,18 @@ public abstract class ChorusPlantBlockMixin extends Block { BlockState plant = info.getReturnValue(); if (plant.isOf(Blocks.CHORUS_PLANT)) { if (world.getBlockState(pos.down()).isIn(EndTags.END_GROUND)) { - plant = plant.with(Properties.DOWN, true).with(BlocksHelper.ROOTS, true); + if (GeneratorOptions.changeChorusPlant()) { + plant = plant.with(Properties.DOWN, true).with(BlocksHelper.ROOTS, true); + } + else { + plant = plant.with(Properties.DOWN, true); + } info.cancel(); } else { - plant = plant.with(BlocksHelper.ROOTS, false); + if (GeneratorOptions.changeChorusPlant()) { + plant = plant.with(BlocksHelper.ROOTS, false); + } info.cancel(); } info.setReturnValue(plant); @@ -87,7 +99,12 @@ public abstract class ChorusPlantBlockMixin extends Block { World world = ctx.getWorld(); BlockState plant = info.getReturnValue(); if (ctx.canPlace() && plant.isOf(Blocks.CHORUS_PLANT) && world.getBlockState(pos.down()).isIn(EndTags.END_GROUND)) { - info.setReturnValue(plant.with(BlocksHelper.ROOTS, true).with(Properties.DOWN, true)); + if (GeneratorOptions.changeChorusPlant()) { + info.setReturnValue(plant.with(BlocksHelper.ROOTS, true).with(Properties.DOWN, true)); + } + else { + info.setReturnValue(plant.with(Properties.DOWN, true)); + } info.cancel(); } } diff --git a/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java index 7742405a..1c11ceca 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java @@ -19,6 +19,7 @@ import net.minecraft.world.gen.feature.DefaultFeatureConfig; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; +import ru.betterend.world.generator.GeneratorOptions; @Mixin(ChorusPlantFeature.class) public class ChorusPlantFeatureMixin { @@ -28,7 +29,12 @@ public class ChorusPlantFeatureMixin { ChorusFlowerBlock.generate(structureWorldAccess, blockPos, random, MHelper.randRange(8, 16, random)); BlockState bottom = structureWorldAccess.getBlockState(blockPos); if (bottom.isOf(Blocks.CHORUS_PLANT)) { - BlocksHelper.setWithoutUpdate(structureWorldAccess, blockPos, bottom.with(BlocksHelper.ROOTS, true).with(ConnectingBlock.DOWN, true)); + if ((GeneratorOptions.changeChorusPlant())) { + BlocksHelper.setWithoutUpdate(structureWorldAccess, blockPos, bottom.with(BlocksHelper.ROOTS, true).with(ConnectingBlock.DOWN, true)); + } + else { + BlocksHelper.setWithoutUpdate(structureWorldAccess, blockPos, bottom.with(ConnectingBlock.DOWN, true)); + } } info.setReturnValue(true); } diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 1ea1d4a5..393f5019 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -50,6 +50,7 @@ import ru.betterend.world.features.trees.MossyGlowshroomFeature; import ru.betterend.world.features.trees.PythadendronTreeFeature; import ru.betterend.world.features.trees.TenaneaFeature; import ru.betterend.world.features.trees.UmbrellaTreeFeature; +import ru.betterend.world.generator.GeneratorOptions; public class EndFeatures { // Trees // @@ -156,15 +157,17 @@ public class EndFeatures { public static final EndFeature CRASHED_SHIP = EndFeature.makeChansedFeature("crashed_ship", new CrashedShipFeature(), 500); public static void registerBiomeFeatures(Identifier id, Biome biome, List>>> features) { - if (id.getNamespace().equals("minecraft")) { - String path = id.getPath(); - if (path.equals("end_highlands") || path.equals("end_midlands") || path.equals("small_end_islands")) { - int pos = GenerationStep.Feature.VEGETAL_DECORATION.ordinal(); - if (pos < features.size()) { - List>> list = features.get(pos); - // If only chorus plants are enabled - if (list.size() == 1) { - features.get(pos).clear(); + if (GeneratorOptions.removeChorusFromVanillaBiomes()) { + if (id.getNamespace().equals("minecraft")) { + String path = id.getPath(); + if (path.equals("end_highlands") || path.equals("end_midlands") || path.equals("small_end_islands")) { + int pos = GenerationStep.Feature.VEGETAL_DECORATION.ordinal(); + if (pos < features.size()) { + List>> list = features.get(pos); + // If only chorus plants are enabled + if (list.size() == 1) { + features.get(pos).clear(); + } } } } diff --git a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java index 4a9496cb..bb2ad265 100644 --- a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java @@ -80,14 +80,18 @@ public class HelixTreeFeature extends DefaultFeature { }); spline.clear(); - for (int i = 0; i <= 20; i++) { - float radius = 1 - i * 0.05F; + float rad = MHelper.randRange(8F, 11F, random); + int count = MHelper.randRange(20, 30, random); + float scaleM = 20F / (float) count * scale * 1.75F; + float hscale = 20F / (float) count * 0.05F; + for (int i = 0; i <= count; i++) { + float radius = 1 - i * hscale; radius = radius * radius * 2 - 1; radius *= radius; - radius = (1 - radius) * 8F * scale; + radius = (1 - radius) * rad * scale; dx = (float) Math.sin(i * 0.45F + angle) * radius; dz = (float) Math.cos(i * 0.45F + angle) * radius; - spline.add(new Vector3f(dx, i * scale * 1.75F, dz)); + spline.add(new Vector3f(dx, i * scaleM, dz)); } Vector3f start = new Vector3f(); diff --git a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java index 5df80e81..45da95c7 100644 --- a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java +++ b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java @@ -9,6 +9,8 @@ public class GeneratorOptions { private static boolean hasPillars; private static boolean hasDragonFights; private static boolean swapOverworldToEnd; + private static boolean changeChorusPlant; + private static boolean removeChorusFromVanillaBiomes; public static void init() { biomeSizeLand = Configs.GENERATOR_CONFIG.getIntRoot("biomeSizeLand", 256); @@ -17,6 +19,8 @@ public class GeneratorOptions { hasPillars = Configs.GENERATOR_CONFIG.getBooleanRoot("hasPillars", true); hasDragonFights = Configs.GENERATOR_CONFIG.getBooleanRoot("hasDragonFights", true); swapOverworldToEnd = Configs.GENERATOR_CONFIG.getBooleanRoot("swapOverworldToEnd", false); + changeChorusPlant = Configs.GENERATOR_CONFIG.getBooleanRoot("changeChorusPlant", true); + removeChorusFromVanillaBiomes = Configs.GENERATOR_CONFIG.getBooleanRoot("removeChorusFromVanillaBiomes", true); } public static int getBiomeSizeLand() { @@ -42,4 +46,12 @@ public class GeneratorOptions { public static boolean swapOverworldToEnd() { return swapOverworldToEnd; } + + public static boolean changeChorusPlant() { + return changeChorusPlant; + } + + public static boolean removeChorusFromVanillaBiomes() { + return removeChorusFromVanillaBiomes; + } } From 2511122d50b15e0644a9334acc10c465d9e1f0ac Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 10 Jan 2021 16:43:38 +0300 Subject: [PATCH 120/463] Slime mixin function rename --- src/main/java/ru/betterend/entity/EntityEndSlime.java | 2 +- src/main/java/ru/betterend/interfaces/ISlime.java | 2 +- src/main/java/ru/betterend/mixin/common/SlimeEntityMixin.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/betterend/entity/EntityEndSlime.java b/src/main/java/ru/betterend/entity/EntityEndSlime.java index 077981e7..b651ac72 100644 --- a/src/main/java/ru/betterend/entity/EntityEndSlime.java +++ b/src/main/java/ru/betterend/entity/EntityEndSlime.java @@ -115,7 +115,7 @@ public class EntityEndSlime extends SlimeEntity { slimeEntity.setCustomName(text); slimeEntity.setAiDisabled(bl); slimeEntity.setInvulnerable(this.isInvulnerable()); - ((ISlime) slimeEntity).setSlimeSize(j, true); + ((ISlime) slimeEntity).beSetSlimeSize(j, true); slimeEntity.calculateDimensions(); slimeEntity.refreshPositionAndAngles(this.getX() + (double) g, this.getY() + 0.5D, this.getZ() + (double) h, this.random.nextFloat() * 360.0F, 0.0F); this.world.spawnEntity(slimeEntity); diff --git a/src/main/java/ru/betterend/interfaces/ISlime.java b/src/main/java/ru/betterend/interfaces/ISlime.java index 646490c8..6d7abb63 100644 --- a/src/main/java/ru/betterend/interfaces/ISlime.java +++ b/src/main/java/ru/betterend/interfaces/ISlime.java @@ -1,5 +1,5 @@ package ru.betterend.interfaces; public interface ISlime { - public void setSlimeSize(int size, boolean heal); + public void beSetSlimeSize(int size, boolean heal); } diff --git a/src/main/java/ru/betterend/mixin/common/SlimeEntityMixin.java b/src/main/java/ru/betterend/mixin/common/SlimeEntityMixin.java index 3f16413c..f4042106 100644 --- a/src/main/java/ru/betterend/mixin/common/SlimeEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/SlimeEntityMixin.java @@ -12,7 +12,7 @@ public class SlimeEntityMixin implements ISlime { protected void setSize(int size, boolean heal) {} @Override - public void setSlimeSize(int size, boolean heal) { + public void beSetSlimeSize(int size, boolean heal) { setSize(size, heal); } } From 53b34857be1fc4fa039ef05c2c3615f6145e86c3 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 11 Jan 2021 09:43:31 +0300 Subject: [PATCH 121/463] Fixes --- src/main/java/ru/betterend/BetterEnd.java | 5 ++-- src/main/java/ru/betterend/config/Config.java | 12 +++++----- .../mixin/common/ChorusPlantBlockMixin.java | 14 +++++++++-- .../betterend/patterns/block/wall_post.json | 24 +++++++++++++++---- 4 files changed, 40 insertions(+), 15 deletions(-) diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index 5df06e7d..2b43e135 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -39,6 +39,9 @@ public class BetterEnd implements ModInitializer { public static final Logger LOGGER = Logger.get(); @Override public void onInitialize() { + TerrainGenerator.init(); + GeneratorOptions.init(); + EndSounds.register(); EndItems.register(); EndBlocks.register(); @@ -60,8 +63,6 @@ public class BetterEnd implements ModInitializer { EndStructures.register(); Integrations.register(); BonemealUtil.init(); - TerrainGenerator.init(); - GeneratorOptions.init(); if (hasGuideBook()) { GuideBookItem.register(); diff --git a/src/main/java/ru/betterend/config/Config.java b/src/main/java/ru/betterend/config/Config.java index 89fb3147..edcec1b9 100644 --- a/src/main/java/ru/betterend/config/Config.java +++ b/src/main/java/ru/betterend/config/Config.java @@ -103,10 +103,10 @@ public abstract class Config { protected float getFloat(ConfigKey key, float defaultValue) { Float val = keeper.getValue(key, FloatEntry.class); if (val == null) { - FloatEntry entry = keeper.registerEntry(key, new FloatEntry(defaultValue)); - return entry.getValue(); + keeper.registerEntry(key, new FloatEntry(defaultValue)); + return defaultValue; } - return val != null ? val : defaultValue; + return val; } protected float getFloat(ConfigKey key) { @@ -129,10 +129,10 @@ public abstract class Config { protected boolean getBoolean(ConfigKey key, boolean defaultValue) { Boolean val = keeper.getValue(key, BooleanEntry.class); if (val == null) { - BooleanEntry entry = keeper.registerEntry(key, new BooleanEntry(defaultValue)); - return entry.getValue(); + keeper.registerEntry(key, new BooleanEntry(defaultValue)); + return defaultValue; } - return val != null ? val : defaultValue; + return val; } protected boolean getBoolean(ConfigKey key) { diff --git a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java index b06d48a8..883a4cd0 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java @@ -40,9 +40,12 @@ public abstract class ChorusPlantBlockMixin extends Block { @Inject(method = "appendProperties", at = @At("TAIL")) private void beAddProperties(StateManager.Builder builder, CallbackInfo info) { + GeneratorOptions.init(); if (GeneratorOptions.changeChorusPlant()) { builder.add(BlocksHelper.ROOTS); + System.out.println("Added!"); } + System.out.println("Added? " + GeneratorOptions.changeChorusPlant()); } @Inject(method = "withConnectionProperties", at = @At("RETURN"), cancellable = true) @@ -50,11 +53,18 @@ public abstract class ChorusPlantBlockMixin extends Block { BlockState plant = info.getReturnValue(); if (plant.isOf(Blocks.CHORUS_PLANT)) { if (world.getBlockState(pos.down()).isIn(EndTags.END_GROUND)) { - info.setReturnValue(plant.with(Properties.DOWN, true).with(BlocksHelper.ROOTS, true)); + if (GeneratorOptions.changeChorusPlant()) { + info.setReturnValue(plant.with(Properties.DOWN, true).with(BlocksHelper.ROOTS, true)); + } + else { + info.setReturnValue(plant.with(Properties.DOWN, true)); + } info.cancel(); } else { - info.setReturnValue(plant.with(BlocksHelper.ROOTS, false)); + if (GeneratorOptions.changeChorusPlant()) { + info.setReturnValue(plant.with(BlocksHelper.ROOTS, false)); + } info.cancel(); } } diff --git a/src/main/resources/assets/betterend/patterns/block/wall_post.json b/src/main/resources/assets/betterend/patterns/block/wall_post.json index 9acedf1f..314e40d3 100644 --- a/src/main/resources/assets/betterend/patterns/block/wall_post.json +++ b/src/main/resources/assets/betterend/patterns/block/wall_post.json @@ -1,6 +1,20 @@ { - "parent": "minecraft:block/template_wall_post", - "textures": { - "wall": "betterend:block/%parent%" - } -} \ No newline at end of file + "textures": { + "wall": "betterend:block/%parent%", + "particle": "#wall" + }, + "elements": [ + { "from": [ 4, -0.01, 4 ], + "to": [ 12, 16, 12 ], + "faces": { + "down": { "texture": "#wall", "cullface": "down" }, + "up": { "texture": "#wall", "cullface": "up" }, + "north": { "texture": "#wall" }, + "south": { "texture": "#wall" }, + "west": { "texture": "#wall" }, + "east": { "texture": "#wall" } + }, + "__comment": "Center post" + } + ] +} From 1ea5f5a52a8048646e6dea515444c38fb0115b83 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 11 Jan 2021 09:51:48 +0300 Subject: [PATCH 122/463] More fixes --- src/main/java/ru/betterend/config/Config.java | 8 ++++---- .../ru/betterend/mixin/common/ChorusPlantBlockMixin.java | 3 +-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/ru/betterend/config/Config.java b/src/main/java/ru/betterend/config/Config.java index edcec1b9..1e8f3d3f 100644 --- a/src/main/java/ru/betterend/config/Config.java +++ b/src/main/java/ru/betterend/config/Config.java @@ -103,8 +103,8 @@ public abstract class Config { protected float getFloat(ConfigKey key, float defaultValue) { Float val = keeper.getValue(key, FloatEntry.class); if (val == null) { - keeper.registerEntry(key, new FloatEntry(defaultValue)); - return defaultValue; + FloatEntry entry = keeper.registerEntry(key, new FloatEntry(defaultValue)); + return entry.getValue(); } return val; } @@ -129,8 +129,8 @@ public abstract class Config { protected boolean getBoolean(ConfigKey key, boolean defaultValue) { Boolean val = keeper.getValue(key, BooleanEntry.class); if (val == null) { - keeper.registerEntry(key, new BooleanEntry(defaultValue)); - return defaultValue; + BooleanEntry entry = keeper.registerEntry(key, new BooleanEntry(defaultValue)); + return entry.getValue(); } return val; } diff --git a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java index 883a4cd0..79010145 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java @@ -20,6 +20,7 @@ import net.minecraft.world.BlockView; import net.minecraft.world.World; import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; +import ru.betterend.config.Configs; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; @@ -43,9 +44,7 @@ public abstract class ChorusPlantBlockMixin extends Block { GeneratorOptions.init(); if (GeneratorOptions.changeChorusPlant()) { builder.add(BlocksHelper.ROOTS); - System.out.println("Added!"); } - System.out.println("Added? " + GeneratorOptions.changeChorusPlant()); } @Inject(method = "withConnectionProperties", at = @At("RETURN"), cancellable = true) From 8f8a3e08e70425560e4be391b134e8b6d278ec7b Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 11 Jan 2021 11:24:49 +0300 Subject: [PATCH 123/463] Chorus mixin fixes --- src/main/java/ru/betterend/BetterEnd.java | 2 +- .../betterend/blocks/BlueVineSeedBlock.java | 2 +- .../blocks/complex/StoneMaterial.java | 2 +- .../blocks/complex/WoodenMaterial.java | 6 ++-- .../betterend/integration/byg/BYGBlocks.java | 2 +- .../mixin/client/AnvilScreenMixin.java | 1 - .../mixin/client/ModelLoaderMixin.java | 12 ++++++-- .../mixin/client/ModelVariantMapMixin.java | 1 - .../client/NamespaceResourceManagerMixin.java | 1 - .../mixin/common/AnvilScreenHandlerMixin.java | 1 - .../mixin/common/ChorusPlantBlockMixin.java | 1 - .../betterend/mixin/common/EntityMixin.java | 1 - .../common/PlayerAdvancementTrackerMixin.java | 3 +- .../recipe/builders/InfusionRecipe.java | 1 - .../recipe/builders/SmithingTableRecipe.java | 1 - .../betterend/registry/EndBlockEntities.java | 2 +- .../java/ru/betterend/registry/EndBlocks.java | 30 +++++++++---------- .../java/ru/betterend/registry/EndItems.java | 4 +-- .../world/features/EndLotusLeafFeature.java | 2 +- ..._flower.json => custom_chorus_flower.json} | 0 ...us_plant.json => custom_chorus_plant.json} | 0 ..._flower.json => custom_chorus_flower.json} | 0 ...us_plant.json => custom_chorus_plant.json} | 0 23 files changed, 37 insertions(+), 38 deletions(-) rename src/main/resources/assets/minecraft/blockstates/{chorus_flower.json => custom_chorus_flower.json} (100%) rename src/main/resources/assets/minecraft/blockstates/{chorus_plant.json => custom_chorus_plant.json} (100%) rename src/main/resources/assets/minecraft/models/item/{chorus_flower.json => custom_chorus_flower.json} (100%) rename src/main/resources/assets/minecraft/models/item/{chorus_plant.json => custom_chorus_plant.json} (100%) diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index 2b43e135..fb2c2b54 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -13,11 +13,11 @@ import ru.betterend.events.PlayerAdvancementsEvents; import ru.betterend.integration.Integrations; import ru.betterend.item.GuideBookItem; import ru.betterend.recipe.AlloyingRecipes; +import ru.betterend.recipe.AnvilRecipes; import ru.betterend.recipe.CraftingRecipes; import ru.betterend.recipe.FurnaceRecipes; import ru.betterend.recipe.InfusionRecipes; import ru.betterend.recipe.SmithingRecipes; -import ru.betterend.recipe.AnvilRecipes; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndBlockEntities; import ru.betterend.registry.EndBlocks; diff --git a/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java b/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java index 5a2ae3f4..38812d8c 100644 --- a/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java @@ -7,8 +7,8 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.FurBlock; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; +import ru.betterend.blocks.basis.FurBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; diff --git a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java index ffb43ed3..f159d795 100644 --- a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java @@ -12,9 +12,9 @@ import ru.betterend.blocks.basis.EndPillarBlock; import ru.betterend.blocks.basis.EndSlabBlock; import ru.betterend.blocks.basis.EndStairsBlock; import ru.betterend.blocks.basis.EndStoneButtonBlock; -import ru.betterend.blocks.basis.StoneLanternBlock; import ru.betterend.blocks.basis.EndStonelateBlock; import ru.betterend.blocks.basis.EndWallBlock; +import ru.betterend.blocks.basis.StoneLanternBlock; import ru.betterend.recipe.CraftingRecipes; import ru.betterend.recipe.builders.GridRecipe; import ru.betterend.registry.EndBlocks; diff --git a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java index 28c2c031..31fe3b18 100644 --- a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java @@ -11,9 +11,9 @@ import net.minecraft.tag.BlockTags; import net.minecraft.tag.ItemTags; import net.minecraft.tag.Tag; import ru.betterend.blocks.basis.BarkBlock; -import ru.betterend.blocks.basis.StrippableBarkBlock; -import ru.betterend.blocks.basis.EndBarrelBlock; import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.EndBarrelBlock; +import ru.betterend.blocks.basis.EndBlockStripableLogLog; import ru.betterend.blocks.basis.EndBookshelfBlock; import ru.betterend.blocks.basis.EndChestBlock; import ru.betterend.blocks.basis.EndComposterBlock; @@ -22,7 +22,6 @@ import ru.betterend.blocks.basis.EndDoorBlock; import ru.betterend.blocks.basis.EndFenceBlock; import ru.betterend.blocks.basis.EndGateBlock; import ru.betterend.blocks.basis.EndLadderBlock; -import ru.betterend.blocks.basis.EndBlockStripableLogLog; import ru.betterend.blocks.basis.EndPillarBlock; import ru.betterend.blocks.basis.EndPlateBlock; import ru.betterend.blocks.basis.EndSignBlock; @@ -30,6 +29,7 @@ import ru.betterend.blocks.basis.EndSlabBlock; import ru.betterend.blocks.basis.EndStairsBlock; import ru.betterend.blocks.basis.EndTrapdoorBlock; import ru.betterend.blocks.basis.EndWoodenButtonBlock; +import ru.betterend.blocks.basis.StrippableBarkBlock; import ru.betterend.recipe.builders.GridRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; diff --git a/src/main/java/ru/betterend/integration/byg/BYGBlocks.java b/src/main/java/ru/betterend/integration/byg/BYGBlocks.java index 93e16e8c..27717ff7 100644 --- a/src/main/java/ru/betterend/integration/byg/BYGBlocks.java +++ b/src/main/java/ru/betterend/integration/byg/BYGBlocks.java @@ -1,8 +1,8 @@ package ru.betterend.integration.byg; import net.minecraft.block.Block; -import ru.betterend.blocks.basis.VineBlock; import ru.betterend.blocks.basis.EndWallPlantBlock; +import ru.betterend.blocks.basis.VineBlock; import ru.betterend.registry.EndBlocks; public class BYGBlocks { diff --git a/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java index 1e2d76ce..4577283f 100644 --- a/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java +++ b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java @@ -23,7 +23,6 @@ import net.minecraft.screen.ScreenHandler; import net.minecraft.text.LiteralText; import net.minecraft.text.Text; import net.minecraft.util.Identifier; - import ru.betterend.interfaces.AnvilScreenHandlerExtended; @Mixin(AnvilScreen.class) diff --git a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java index b2688d0b..c3f922a4 100644 --- a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java @@ -10,6 +10,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.block.Block; @@ -20,13 +21,12 @@ import net.minecraft.resource.Resource; import net.minecraft.resource.ResourceManager; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; - import ru.betterend.BetterEnd; import ru.betterend.patterns.Patterned; +import ru.betterend.world.generator.GeneratorOptions; @Mixin(ModelLoader.class) public class ModelLoaderMixin { - @Final @Shadow private ResourceManager resourceManager; @@ -81,4 +81,12 @@ public class ModelLoaderMixin { return model; } + + @ModifyVariable(method = "loadModel", ordinal = 2, at = @At(value = "INVOKE")) + public Identifier be_SwitchModel(Identifier id) { + if (GeneratorOptions.changeChorusPlant() && id.getNamespace().equals("minecraft") && id.getPath().startsWith("blockstates/") && id.getPath().contains("chorus") && !id.getPath().contains("custom_")) { + id = new Identifier(id.getPath().replace("chorus", "custom_chorus")); + } + return id; + } } diff --git a/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java b/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java index 5b3cf1dc..c742bf18 100644 --- a/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java @@ -13,7 +13,6 @@ import com.google.gson.Gson; import net.minecraft.block.Block; import net.minecraft.client.render.model.json.ModelVariantMap; import net.minecraft.util.JsonHelper; - import ru.betterend.patterns.BlockPatterned; @Mixin(ModelVariantMap.class) diff --git a/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java b/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java index 64c8f889..a1c5ad08 100644 --- a/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java @@ -16,7 +16,6 @@ import net.minecraft.resource.NamespaceResourceManager; import net.minecraft.resource.Resource; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; - import ru.betterend.BetterEnd; import ru.betterend.patterns.BlockPatterned; diff --git a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java index 28ecb95c..c90e7f81 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java @@ -21,7 +21,6 @@ import net.minecraft.screen.ForgingScreenHandler; import net.minecraft.screen.ScreenHandlerContext; import net.minecraft.screen.ScreenHandlerType; import net.minecraft.tag.BlockTags; - import ru.betterend.interfaces.AnvilScreenHandlerExtended; import ru.betterend.recipe.builders.AnvilRecipe; diff --git a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java index 79010145..10fcef63 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java @@ -20,7 +20,6 @@ import net.minecraft.world.BlockView; import net.minecraft.world.World; import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; -import ru.betterend.config.Configs; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; diff --git a/src/main/java/ru/betterend/mixin/common/EntityMixin.java b/src/main/java/ru/betterend/mixin/common/EntityMixin.java index ff6420a3..59027c53 100644 --- a/src/main/java/ru/betterend/mixin/common/EntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EntityMixin.java @@ -15,7 +15,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.TeleportTarget; import net.minecraft.world.World; - import ru.betterend.interfaces.TeleportingEntity; @Mixin(Entity.class) diff --git a/src/main/java/ru/betterend/mixin/common/PlayerAdvancementTrackerMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerAdvancementTrackerMixin.java index 43220b04..2acef8ea 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerAdvancementTrackerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerAdvancementTrackerMixin.java @@ -3,14 +3,13 @@ package ru.betterend.mixin.common; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.advancement.Advancement; import net.minecraft.advancement.PlayerAdvancementTracker; import net.minecraft.server.network.ServerPlayerEntity; - import ru.betterend.events.PlayerAdvancementsEvents; @Mixin(PlayerAdvancementTracker.class) diff --git a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java index f6bcb41e..5a876161 100644 --- a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java @@ -17,7 +17,6 @@ import net.minecraft.util.Identifier; import net.minecraft.util.JsonHelper; import net.minecraft.util.collection.DefaultedList; import net.minecraft.world.World; - import ru.betterend.BetterEnd; import ru.betterend.config.Configs; import ru.betterend.interfaces.BetterEndRecipe; diff --git a/src/main/java/ru/betterend/recipe/builders/SmithingTableRecipe.java b/src/main/java/ru/betterend/recipe/builders/SmithingTableRecipe.java index 7bde239e..d5935492 100644 --- a/src/main/java/ru/betterend/recipe/builders/SmithingTableRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/SmithingTableRecipe.java @@ -8,7 +8,6 @@ import net.minecraft.recipe.RecipeType; import net.minecraft.recipe.SmithingRecipe; import net.minecraft.tag.Tag; import net.minecraft.util.Identifier; - import ru.betterend.BetterEnd; import ru.betterend.config.Configs; import ru.betterend.recipe.EndRecipeManager; diff --git a/src/main/java/ru/betterend/registry/EndBlockEntities.java b/src/main/java/ru/betterend/registry/EndBlockEntities.java index 47fb5a14..c3e6d87b 100644 --- a/src/main/java/ru/betterend/registry/EndBlockEntities.java +++ b/src/main/java/ru/betterend/registry/EndBlockEntities.java @@ -15,8 +15,8 @@ import ru.betterend.blocks.EternalPedestal; import ru.betterend.blocks.InfusionPedestal; import ru.betterend.blocks.basis.EndBarrelBlock; import ru.betterend.blocks.basis.EndChestBlock; -import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.basis.EndSignBlock; +import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.entities.BlockEntityHydrothermalVent; import ru.betterend.blocks.entities.EBarrelBlockEntity; import ru.betterend.blocks.entities.EChestBlockEntity; diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 5dc5a0c0..44050d9e 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -8,9 +8,9 @@ import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; import ru.betterend.BetterEnd; import ru.betterend.blocks.AeterniumBlock; -import ru.betterend.blocks.AuroraCrystalBlock; import ru.betterend.blocks.AmberBlock; import ru.betterend.blocks.AncientEmeraldIceBlock; +import ru.betterend.blocks.AuroraCrystalBlock; import ru.betterend.blocks.BlueVineBlock; import ru.betterend.blocks.BlueVineLanternBlock; import ru.betterend.blocks.BlueVineSeedBlock; @@ -32,7 +32,14 @@ import ru.betterend.blocks.EndLotusFlowerBlock; import ru.betterend.blocks.EndLotusLeafBlock; import ru.betterend.blocks.EndLotusSeedBlock; import ru.betterend.blocks.EndLotusStemBlock; +import ru.betterend.blocks.EndPathBlock; +import ru.betterend.blocks.EndPortalBlock; +import ru.betterend.blocks.EndStoneSmelter; +import ru.betterend.blocks.EndTerrainBlock; +import ru.betterend.blocks.EnderBlock; import ru.betterend.blocks.EndstoneDustBlock; +import ru.betterend.blocks.EternalPedestal; +import ru.betterend.blocks.EternalRunedFlavolite; import ru.betterend.blocks.GlowingMossBlock; import ru.betterend.blocks.GlowingPillarLuminophorBlock; import ru.betterend.blocks.GlowingPillarRootsBlock; @@ -44,6 +51,7 @@ import ru.betterend.blocks.HydraluxPetalBlock; import ru.betterend.blocks.HydraluxPetalColoredBlock; import ru.betterend.blocks.HydraluxSaplingBlock; import ru.betterend.blocks.HydrothermalVentBlock; +import ru.betterend.blocks.InfusionPedestal; import ru.betterend.blocks.JellyshroomCapBlock; import ru.betterend.blocks.LacugroveSaplingBlock; import ru.betterend.blocks.LanceleafBlock; @@ -55,9 +63,10 @@ import ru.betterend.blocks.MossyGlowshroomHymenophoreBlock; import ru.betterend.blocks.MossyGlowshroomSaplingBlock; import ru.betterend.blocks.MurkweedBlock; import ru.betterend.blocks.NeedlegrassBlock; -import ru.betterend.blocks.EndPathBlock; +import ru.betterend.blocks.PedestalVanilla; import ru.betterend.blocks.PythadendronSaplingBlock; import ru.betterend.blocks.RespawnObeliskBlock; +import ru.betterend.blocks.RunedFlavolite; import ru.betterend.blocks.ShadowBerryBlock; import ru.betterend.blocks.ShadowGrassBlock; import ru.betterend.blocks.SilkMothNestBlock; @@ -65,7 +74,7 @@ import ru.betterend.blocks.SmallJellyshroomBlock; import ru.betterend.blocks.SulphurCrystalBlock; import ru.betterend.blocks.TenaneaFlowersBlock; import ru.betterend.blocks.TenaneaSaplingBlock; -import ru.betterend.blocks.EndTerrainBlock; +import ru.betterend.blocks.TerminiteBlock; import ru.betterend.blocks.TerrainPlantBlock; import ru.betterend.blocks.TwistedUmbrellaMossBlock; import ru.betterend.blocks.TwistedUmbrellaMossTallBlock; @@ -76,25 +85,16 @@ import ru.betterend.blocks.UmbrellaTreeClusterEmptyBlock; import ru.betterend.blocks.UmbrellaTreeMembraneBlock; import ru.betterend.blocks.UmbrellaTreeSaplingBlock; import ru.betterend.blocks.VentBubbleColumnBlock; -import ru.betterend.blocks.EndPortalBlock; -import ru.betterend.blocks.EndStoneSmelter; -import ru.betterend.blocks.EnderBlock; -import ru.betterend.blocks.EternalPedestal; -import ru.betterend.blocks.EternalRunedFlavolite; -import ru.betterend.blocks.InfusionPedestal; -import ru.betterend.blocks.PedestalVanilla; -import ru.betterend.blocks.RunedFlavolite; -import ru.betterend.blocks.TerminiteBlock; -import ru.betterend.blocks.basis.FurBlock; import ru.betterend.blocks.basis.EndCropBlock; import ru.betterend.blocks.basis.EndLeavesBlock; import ru.betterend.blocks.basis.EndOreBlock; +import ru.betterend.blocks.basis.EndUnderwaterWallPlantBlock; +import ru.betterend.blocks.basis.EndWallPlantBlock; +import ru.betterend.blocks.basis.FurBlock; import ru.betterend.blocks.basis.SimpleLeavesBlock; import ru.betterend.blocks.basis.StoneLanternBlock; -import ru.betterend.blocks.basis.EndUnderwaterWallPlantBlock; import ru.betterend.blocks.basis.VineBlock; import ru.betterend.blocks.basis.WallMushroomBlock; -import ru.betterend.blocks.basis.EndWallPlantBlock; import ru.betterend.blocks.complex.ColoredMaterial; import ru.betterend.blocks.complex.StoneMaterial; import ru.betterend.blocks.complex.WoodenMaterial; diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index 44a10254..cc72a360 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -34,14 +34,14 @@ import net.minecraft.util.math.Direction; import net.minecraft.util.registry.Registry; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; +import ru.betterend.item.DrinkItem; import ru.betterend.item.EnchantedPetalItem; import ru.betterend.item.EndAxeItem; import ru.betterend.item.EndHammerItem; import ru.betterend.item.EndHoeItem; import ru.betterend.item.EndPickaxeItem; -import ru.betterend.item.EternalCrystalItem; -import ru.betterend.item.DrinkItem; import ru.betterend.item.EndSpawnEggItem; +import ru.betterend.item.EternalCrystalItem; import ru.betterend.item.PatternedItem; import ru.betterend.item.material.EndArmorMaterial; import ru.betterend.item.material.EndToolMaterial; diff --git a/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java b/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java index 116cbbdb..5c12c62e 100644 --- a/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java +++ b/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java @@ -8,8 +8,8 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos.Mutable; import net.minecraft.util.math.Direction; import net.minecraft.world.StructureWorldAccess; -import ru.betterend.blocks.EndLotusLeafBlock; import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.blocks.EndLotusLeafBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; diff --git a/src/main/resources/assets/minecraft/blockstates/chorus_flower.json b/src/main/resources/assets/minecraft/blockstates/custom_chorus_flower.json similarity index 100% rename from src/main/resources/assets/minecraft/blockstates/chorus_flower.json rename to src/main/resources/assets/minecraft/blockstates/custom_chorus_flower.json diff --git a/src/main/resources/assets/minecraft/blockstates/chorus_plant.json b/src/main/resources/assets/minecraft/blockstates/custom_chorus_plant.json similarity index 100% rename from src/main/resources/assets/minecraft/blockstates/chorus_plant.json rename to src/main/resources/assets/minecraft/blockstates/custom_chorus_plant.json diff --git a/src/main/resources/assets/minecraft/models/item/chorus_flower.json b/src/main/resources/assets/minecraft/models/item/custom_chorus_flower.json similarity index 100% rename from src/main/resources/assets/minecraft/models/item/chorus_flower.json rename to src/main/resources/assets/minecraft/models/item/custom_chorus_flower.json diff --git a/src/main/resources/assets/minecraft/models/item/chorus_plant.json b/src/main/resources/assets/minecraft/models/item/custom_chorus_plant.json similarity index 100% rename from src/main/resources/assets/minecraft/models/item/chorus_plant.json rename to src/main/resources/assets/minecraft/models/item/custom_chorus_plant.json From 82808682c81753e05bbb51887d5c925cf3ab1e21 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 11 Jan 2021 11:47:16 +0300 Subject: [PATCH 124/463] Fixed walls, removed old models --- .../blockstates/violecite_bricks.json | 7 - .../blockstates/violecite_bricks_slab.json | 15 -- .../blockstates/violecite_bricks_stairs.json | 209 ------------------ .../blockstates/violecite_button.json | 118 ---------- .../blockstates/violecite_pillar.json | 7 - .../blockstates/violecite_plate.json | 10 - .../betterend/blockstates/violecite_slab.json | 15 -- .../blockstates/violecite_small_tiles.json | 7 - .../blockstates/violecite_stairs.json | 209 ------------------ .../betterend/blockstates/violecite_tile.json | 7 - .../betterend/blockstates/violecite_wall.json | 90 -------- .../betterend/models/block/violecite.json | 6 - .../models/block/violecite_bricks.json | 6 - .../block/violecite_bricks_half_slab.json | 8 - .../block/violecite_bricks_inner_stairs.json | 8 - .../block/violecite_bricks_outer_stairs.json | 8 - .../models/block/violecite_bricks_stairs.json | 8 - .../violecite_bricks_wall_inventory.json | 6 - .../block/violecite_bricks_wall_post.json | 2 +- .../models/block/violecite_button.json | 6 - .../block/violecite_button_inventory.json | 6 - .../block/violecite_button_pressed.json | 6 - .../models/block/violecite_half_slab.json | 8 - .../models/block/violecite_inner_stairs.json | 8 - .../models/block/violecite_outer_stairs.json | 8 - .../models/block/violecite_pillar.json | 7 - .../block/violecite_pressure_plate_down.json | 6 - .../block/violecite_pressure_plate_up.json | 6 - .../models/block/violecite_small_tiles.json | 6 - .../models/block/violecite_stairs.json | 8 - .../models/block/violecite_tile.json | 6 - .../block/violecite_wall_inventory.json | 6 - .../models/block/violecite_wall_post.json | 6 - .../models/block/violecite_wall_side.json | 6 - .../block/violecite_wall_side_tall.json | 6 - .../betterend/models/item/violecite.json | 3 - .../models/item/violecite_bricks.json | 3 - .../models/item/violecite_bricks_slab.json | 3 - .../models/item/violecite_bricks_stairs.json | 3 - .../models/item/violecite_bricks_wall.json | 3 - .../models/item/violecite_button.json | 3 - .../models/item/violecite_pillar.json | 3 - .../models/item/violecite_plate.json | 3 - .../betterend/models/item/violecite_slab.json | 3 - .../models/item/violecite_small_tiles.json | 3 - .../models/item/violecite_stairs.json | 3 - .../betterend/models/item/violecite_tile.json | 3 - .../betterend/models/item/violecite_wall.json | 3 - .../betterend/patterns/block/wall_post.json | 24 +- 49 files changed, 6 insertions(+), 908 deletions(-) delete mode 100644 src/main/resources/assets/betterend/blockstates/violecite_bricks.json delete mode 100644 src/main/resources/assets/betterend/blockstates/violecite_bricks_slab.json delete mode 100644 src/main/resources/assets/betterend/blockstates/violecite_bricks_stairs.json delete mode 100644 src/main/resources/assets/betterend/blockstates/violecite_button.json delete mode 100644 src/main/resources/assets/betterend/blockstates/violecite_pillar.json delete mode 100644 src/main/resources/assets/betterend/blockstates/violecite_plate.json delete mode 100644 src/main/resources/assets/betterend/blockstates/violecite_slab.json delete mode 100644 src/main/resources/assets/betterend/blockstates/violecite_small_tiles.json delete mode 100644 src/main/resources/assets/betterend/blockstates/violecite_stairs.json delete mode 100644 src/main/resources/assets/betterend/blockstates/violecite_tile.json delete mode 100644 src/main/resources/assets/betterend/blockstates/violecite_wall.json delete mode 100644 src/main/resources/assets/betterend/models/block/violecite.json delete mode 100644 src/main/resources/assets/betterend/models/block/violecite_bricks.json delete mode 100644 src/main/resources/assets/betterend/models/block/violecite_bricks_half_slab.json delete mode 100644 src/main/resources/assets/betterend/models/block/violecite_bricks_inner_stairs.json delete mode 100644 src/main/resources/assets/betterend/models/block/violecite_bricks_outer_stairs.json delete mode 100644 src/main/resources/assets/betterend/models/block/violecite_bricks_stairs.json delete mode 100644 src/main/resources/assets/betterend/models/block/violecite_bricks_wall_inventory.json delete mode 100644 src/main/resources/assets/betterend/models/block/violecite_button.json delete mode 100644 src/main/resources/assets/betterend/models/block/violecite_button_inventory.json delete mode 100644 src/main/resources/assets/betterend/models/block/violecite_button_pressed.json delete mode 100644 src/main/resources/assets/betterend/models/block/violecite_half_slab.json delete mode 100644 src/main/resources/assets/betterend/models/block/violecite_inner_stairs.json delete mode 100644 src/main/resources/assets/betterend/models/block/violecite_outer_stairs.json delete mode 100644 src/main/resources/assets/betterend/models/block/violecite_pillar.json delete mode 100644 src/main/resources/assets/betterend/models/block/violecite_pressure_plate_down.json delete mode 100644 src/main/resources/assets/betterend/models/block/violecite_pressure_plate_up.json delete mode 100644 src/main/resources/assets/betterend/models/block/violecite_small_tiles.json delete mode 100644 src/main/resources/assets/betterend/models/block/violecite_stairs.json delete mode 100644 src/main/resources/assets/betterend/models/block/violecite_tile.json delete mode 100644 src/main/resources/assets/betterend/models/block/violecite_wall_inventory.json delete mode 100644 src/main/resources/assets/betterend/models/block/violecite_wall_post.json delete mode 100644 src/main/resources/assets/betterend/models/block/violecite_wall_side.json delete mode 100644 src/main/resources/assets/betterend/models/block/violecite_wall_side_tall.json delete mode 100644 src/main/resources/assets/betterend/models/item/violecite.json delete mode 100644 src/main/resources/assets/betterend/models/item/violecite_bricks.json delete mode 100644 src/main/resources/assets/betterend/models/item/violecite_bricks_slab.json delete mode 100644 src/main/resources/assets/betterend/models/item/violecite_bricks_stairs.json delete mode 100644 src/main/resources/assets/betterend/models/item/violecite_bricks_wall.json delete mode 100644 src/main/resources/assets/betterend/models/item/violecite_button.json delete mode 100644 src/main/resources/assets/betterend/models/item/violecite_pillar.json delete mode 100644 src/main/resources/assets/betterend/models/item/violecite_plate.json delete mode 100644 src/main/resources/assets/betterend/models/item/violecite_slab.json delete mode 100644 src/main/resources/assets/betterend/models/item/violecite_small_tiles.json delete mode 100644 src/main/resources/assets/betterend/models/item/violecite_stairs.json delete mode 100644 src/main/resources/assets/betterend/models/item/violecite_tile.json delete mode 100644 src/main/resources/assets/betterend/models/item/violecite_wall.json diff --git a/src/main/resources/assets/betterend/blockstates/violecite_bricks.json b/src/main/resources/assets/betterend/blockstates/violecite_bricks.json deleted file mode 100644 index a9d9704f..00000000 --- a/src/main/resources/assets/betterend/blockstates/violecite_bricks.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "betterend:block/violecite_bricks" - } - } -} diff --git a/src/main/resources/assets/betterend/blockstates/violecite_bricks_slab.json b/src/main/resources/assets/betterend/blockstates/violecite_bricks_slab.json deleted file mode 100644 index e677d7d4..00000000 --- a/src/main/resources/assets/betterend/blockstates/violecite_bricks_slab.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "variants": { - "type=bottom": { - "model": "betterend:block/violecite_bricks_half_slab" - }, - "type=double": { - "model": "betterend:block/violecite_bricks" - }, - "type=top": { - "model": "betterend:block/violecite_bricks_half_slab", - "uvlock": true, - "x": 180 - } - } -} diff --git a/src/main/resources/assets/betterend/blockstates/violecite_bricks_stairs.json b/src/main/resources/assets/betterend/blockstates/violecite_bricks_stairs.json deleted file mode 100644 index b528feb8..00000000 --- a/src/main/resources/assets/betterend/blockstates/violecite_bricks_stairs.json +++ /dev/null @@ -1,209 +0,0 @@ -{ - "variants": { - "facing=east,half=bottom,shape=inner_left": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "y": 270 - }, - "facing=east,half=bottom,shape=inner_right": { - "model": "betterend:block/violecite_bricks_inner_stairs" - }, - "facing=east,half=bottom,shape=outer_left": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "y": 270 - }, - "facing=east,half=bottom,shape=outer_right": { - "model": "betterend:block/violecite_bricks_outer_stairs" - }, - "facing=east,half=bottom,shape=straight": { - "model": "betterend:block/violecite_bricks_stairs" - }, - "facing=east,half=top,shape=inner_left": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "x": 180 - }, - "facing=east,half=top,shape=inner_right": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=east,half=top,shape=outer_left": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "x": 180 - }, - "facing=east,half=top,shape=outer_right": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=east,half=top,shape=straight": { - "model": "betterend:block/violecite_bricks_stairs", - "uvlock": true, - "x": 180 - }, - "facing=north,half=bottom,shape=inner_left": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "y": 180 - }, - "facing=north,half=bottom,shape=inner_right": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "y": 270 - }, - "facing=north,half=bottom,shape=outer_left": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "y": 180 - }, - "facing=north,half=bottom,shape=outer_right": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "y": 270 - }, - "facing=north,half=bottom,shape=straight": { - "model": "betterend:block/violecite_bricks_stairs", - "uvlock": true, - "y": 270 - }, - "facing=north,half=top,shape=inner_left": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=north,half=top,shape=inner_right": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "x": 180 - }, - "facing=north,half=top,shape=outer_left": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=north,half=top,shape=outer_right": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "x": 180 - }, - "facing=north,half=top,shape=straight": { - "model": "betterend:block/violecite_bricks_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=south,half=bottom,shape=inner_left": { - "model": "betterend:block/violecite_bricks_inner_stairs" - }, - "facing=south,half=bottom,shape=inner_right": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "y": 90 - }, - "facing=south,half=bottom,shape=outer_left": { - "model": "betterend:block/violecite_bricks_outer_stairs" - }, - "facing=south,half=bottom,shape=outer_right": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "y": 90 - }, - "facing=south,half=bottom,shape=straight": { - "model": "betterend:block/violecite_bricks_stairs", - "uvlock": true, - "y": 90 - }, - "facing=south,half=top,shape=inner_left": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=south,half=top,shape=inner_right": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "x": 180, - "y": 180 - }, - "facing=south,half=top,shape=outer_left": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=south,half=top,shape=outer_right": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "x": 180, - "y": 180 - }, - "facing=south,half=top,shape=straight": { - "model": "betterend:block/violecite_bricks_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=west,half=bottom,shape=inner_left": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "y": 90 - }, - "facing=west,half=bottom,shape=inner_right": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "y": 180 - }, - "facing=west,half=bottom,shape=outer_left": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "y": 90 - }, - "facing=west,half=bottom,shape=outer_right": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "y": 180 - }, - "facing=west,half=bottom,shape=straight": { - "model": "betterend:block/violecite_bricks_stairs", - "uvlock": true, - "y": 180 - }, - "facing=west,half=top,shape=inner_left": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "x": 180, - "y": 180 - }, - "facing=west,half=top,shape=inner_right": { - "model": "betterend:block/violecite_bricks_inner_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=west,half=top,shape=outer_left": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "x": 180, - "y": 180 - }, - "facing=west,half=top,shape=outer_right": { - "model": "betterend:block/violecite_bricks_outer_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=west,half=top,shape=straight": { - "model": "betterend:block/violecite_bricks_stairs", - "uvlock": true, - "x": 180, - "y": 180 - } - } -} diff --git a/src/main/resources/assets/betterend/blockstates/violecite_button.json b/src/main/resources/assets/betterend/blockstates/violecite_button.json deleted file mode 100644 index e39bf88d..00000000 --- a/src/main/resources/assets/betterend/blockstates/violecite_button.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "variants": { - "face=ceiling,facing=east,powered=false": { - "model": "betterend:block/violecite_button", - "x": 180, - "y": 270 - }, - "face=ceiling,facing=east,powered=true": { - "model": "betterend:block/violecite_button_pressed", - "x": 180, - "y": 270 - }, - "face=ceiling,facing=north,powered=false": { - "model": "betterend:block/violecite_button", - "x": 180, - "y": 180 - }, - "face=ceiling,facing=north,powered=true": { - "model": "betterend:block/violecite_button_pressed", - "x": 180, - "y": 180 - }, - "face=ceiling,facing=south,powered=false": { - "model": "betterend:block/violecite_button", - "x": 180 - }, - "face=ceiling,facing=south,powered=true": { - "model": "betterend:block/violecite_button_pressed", - "x": 180 - }, - "face=ceiling,facing=west,powered=false": { - "model": "betterend:block/violecite_button", - "x": 180, - "y": 90 - }, - "face=ceiling,facing=west,powered=true": { - "model": "betterend:block/violecite_button_pressed", - "x": 180, - "y": 90 - }, - "face=floor,facing=east,powered=false": { - "model": "betterend:block/violecite_button", - "y": 90 - }, - "face=floor,facing=east,powered=true": { - "model": "betterend:block/violecite_button_pressed", - "y": 90 - }, - "face=floor,facing=north,powered=false": { - "model": "betterend:block/violecite_button" - }, - "face=floor,facing=north,powered=true": { - "model": "betterend:block/violecite_button_pressed" - }, - "face=floor,facing=south,powered=false": { - "model": "betterend:block/violecite_button", - "y": 180 - }, - "face=floor,facing=south,powered=true": { - "model": "betterend:block/violecite_button_pressed", - "y": 180 - }, - "face=floor,facing=west,powered=false": { - "model": "betterend:block/violecite_button", - "y": 270 - }, - "face=floor,facing=west,powered=true": { - "model": "betterend:block/violecite_button_pressed", - "y": 270 - }, - "face=wall,facing=east,powered=false": { - "model": "betterend:block/violecite_button", - "uvlock": true, - "x": 90, - "y": 90 - }, - "face=wall,facing=east,powered=true": { - "model": "betterend:block/violecite_button_pressed", - "uvlock": true, - "x": 90, - "y": 90 - }, - "face=wall,facing=north,powered=false": { - "model": "betterend:block/violecite_button", - "uvlock": true, - "x": 90 - }, - "face=wall,facing=north,powered=true": { - "model": "betterend:block/violecite_button_pressed", - "uvlock": true, - "x": 90 - }, - "face=wall,facing=south,powered=false": { - "model": "betterend:block/violecite_button", - "uvlock": true, - "x": 90, - "y": 180 - }, - "face=wall,facing=south,powered=true": { - "model": "betterend:block/violecite_button_pressed", - "uvlock": true, - "x": 90, - "y": 180 - }, - "face=wall,facing=west,powered=false": { - "model": "betterend:block/violecite_button", - "uvlock": true, - "x": 90, - "y": 270 - }, - "face=wall,facing=west,powered=true": { - "model": "betterend:block/violecite_button_pressed", - "uvlock": true, - "x": 90, - "y": 270 - } - } -} diff --git a/src/main/resources/assets/betterend/blockstates/violecite_pillar.json b/src/main/resources/assets/betterend/blockstates/violecite_pillar.json deleted file mode 100644 index 90618711..00000000 --- a/src/main/resources/assets/betterend/blockstates/violecite_pillar.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "axis=x": { "model": "betterend:block/violecite_pillar", "x": 90, "y": 270 }, - "axis=y": { "model": "betterend:block/violecite_pillar" }, - "axis=z": { "model": "betterend:block/violecite_pillar", "x": 90 } - } -} diff --git a/src/main/resources/assets/betterend/blockstates/violecite_plate.json b/src/main/resources/assets/betterend/blockstates/violecite_plate.json deleted file mode 100644 index 83aba147..00000000 --- a/src/main/resources/assets/betterend/blockstates/violecite_plate.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "powered=false": { - "model": "betterend:block/violecite_pressure_plate_up" - }, - "powered=true": { - "model": "betterend:block/violecite_pressure_plate_down" - } - } -} diff --git a/src/main/resources/assets/betterend/blockstates/violecite_slab.json b/src/main/resources/assets/betterend/blockstates/violecite_slab.json deleted file mode 100644 index d27cf448..00000000 --- a/src/main/resources/assets/betterend/blockstates/violecite_slab.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "variants": { - "type=bottom": { - "model": "betterend:block/violecite_half_slab" - }, - "type=double": { - "model": "betterend:block/violecite" - }, - "type=top": { - "model": "betterend:block/violecite_half_slab", - "uvlock": true, - "x": 180 - } - } -} diff --git a/src/main/resources/assets/betterend/blockstates/violecite_small_tiles.json b/src/main/resources/assets/betterend/blockstates/violecite_small_tiles.json deleted file mode 100644 index 6f7d8561..00000000 --- a/src/main/resources/assets/betterend/blockstates/violecite_small_tiles.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "betterend:block/violecite_small_tiles" - } - } -} diff --git a/src/main/resources/assets/betterend/blockstates/violecite_stairs.json b/src/main/resources/assets/betterend/blockstates/violecite_stairs.json deleted file mode 100644 index bd76aa03..00000000 --- a/src/main/resources/assets/betterend/blockstates/violecite_stairs.json +++ /dev/null @@ -1,209 +0,0 @@ -{ - "variants": { - "facing=east,half=bottom,shape=inner_left": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "y": 270 - }, - "facing=east,half=bottom,shape=inner_right": { - "model": "betterend:block/violecite_inner_stairs" - }, - "facing=east,half=bottom,shape=outer_left": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "y": 270 - }, - "facing=east,half=bottom,shape=outer_right": { - "model": "betterend:block/violecite_outer_stairs" - }, - "facing=east,half=bottom,shape=straight": { - "model": "betterend:block/violecite_stairs" - }, - "facing=east,half=top,shape=inner_left": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "x": 180 - }, - "facing=east,half=top,shape=inner_right": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=east,half=top,shape=outer_left": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "x": 180 - }, - "facing=east,half=top,shape=outer_right": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=east,half=top,shape=straight": { - "model": "betterend:block/violecite_stairs", - "uvlock": true, - "x": 180 - }, - "facing=north,half=bottom,shape=inner_left": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "y": 180 - }, - "facing=north,half=bottom,shape=inner_right": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "y": 270 - }, - "facing=north,half=bottom,shape=outer_left": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "y": 180 - }, - "facing=north,half=bottom,shape=outer_right": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "y": 270 - }, - "facing=north,half=bottom,shape=straight": { - "model": "betterend:block/violecite_stairs", - "uvlock": true, - "y": 270 - }, - "facing=north,half=top,shape=inner_left": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=north,half=top,shape=inner_right": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "x": 180 - }, - "facing=north,half=top,shape=outer_left": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=north,half=top,shape=outer_right": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "x": 180 - }, - "facing=north,half=top,shape=straight": { - "model": "betterend:block/violecite_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=south,half=bottom,shape=inner_left": { - "model": "betterend:block/violecite_inner_stairs" - }, - "facing=south,half=bottom,shape=inner_right": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "y": 90 - }, - "facing=south,half=bottom,shape=outer_left": { - "model": "betterend:block/violecite_outer_stairs" - }, - "facing=south,half=bottom,shape=outer_right": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "y": 90 - }, - "facing=south,half=bottom,shape=straight": { - "model": "betterend:block/violecite_stairs", - "uvlock": true, - "y": 90 - }, - "facing=south,half=top,shape=inner_left": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=south,half=top,shape=inner_right": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "x": 180, - "y": 180 - }, - "facing=south,half=top,shape=outer_left": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=south,half=top,shape=outer_right": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "x": 180, - "y": 180 - }, - "facing=south,half=top,shape=straight": { - "model": "betterend:block/violecite_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=west,half=bottom,shape=inner_left": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "y": 90 - }, - "facing=west,half=bottom,shape=inner_right": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "y": 180 - }, - "facing=west,half=bottom,shape=outer_left": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "y": 90 - }, - "facing=west,half=bottom,shape=outer_right": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "y": 180 - }, - "facing=west,half=bottom,shape=straight": { - "model": "betterend:block/violecite_stairs", - "uvlock": true, - "y": 180 - }, - "facing=west,half=top,shape=inner_left": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "x": 180, - "y": 180 - }, - "facing=west,half=top,shape=inner_right": { - "model": "betterend:block/violecite_inner_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=west,half=top,shape=outer_left": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "x": 180, - "y": 180 - }, - "facing=west,half=top,shape=outer_right": { - "model": "betterend:block/violecite_outer_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=west,half=top,shape=straight": { - "model": "betterend:block/violecite_stairs", - "uvlock": true, - "x": 180, - "y": 180 - } - } -} diff --git a/src/main/resources/assets/betterend/blockstates/violecite_tile.json b/src/main/resources/assets/betterend/blockstates/violecite_tile.json deleted file mode 100644 index f735990c..00000000 --- a/src/main/resources/assets/betterend/blockstates/violecite_tile.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "betterend:block/violecite_tile" - } - } -} diff --git a/src/main/resources/assets/betterend/blockstates/violecite_wall.json b/src/main/resources/assets/betterend/blockstates/violecite_wall.json deleted file mode 100644 index afb41db1..00000000 --- a/src/main/resources/assets/betterend/blockstates/violecite_wall.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "multipart": [ - { - "when": { - "up": "true" - }, - "apply": { - "model": "betterend:block/violecite_wall_post" - } - }, - { - "when": { - "north": "low" - }, - "apply": { - "model": "betterend:block/violecite_wall_side", - "uvlock": true - } - }, - { - "when": { - "east": "low" - }, - "apply": { - "model": "betterend:block/violecite_wall_side", - "y": 90, - "uvlock": true - } - }, - { - "when": { - "south": "low" - }, - "apply": { - "model": "betterend:block/violecite_wall_side", - "y": 180, - "uvlock": true - } - }, - { - "when": { - "west": "low" - }, - "apply": { - "model": "betterend:block/violecite_wall_side", - "y": 270, - "uvlock": true - } - }, - { - "when": { - "north": "tall" - }, - "apply": { - "model": "betterend:block/violecite_wall_side_tall", - "uvlock": true - } - }, - { - "when": { - "east": "tall" - }, - "apply": { - "model": "betterend:block/violecite_wall_side_tall", - "y": 90, - "uvlock": true - } - }, - { - "when": { - "south": "tall" - }, - "apply": { - "model": "betterend:block/violecite_wall_side_tall", - "y": 180, - "uvlock": true - } - }, - { - "when": { - "west": "tall" - }, - "apply": { - "model": "betterend:block/violecite_wall_side_tall", - "y": 270, - "uvlock": true - } - } - ] -} diff --git a/src/main/resources/assets/betterend/models/block/violecite.json b/src/main/resources/assets/betterend/models/block/violecite.json deleted file mode 100644 index 1ba3d23e..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/cube_all", - "textures": { - "all": "betterend:block/violecite" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_bricks.json b/src/main/resources/assets/betterend/models/block/violecite_bricks.json deleted file mode 100644 index a62dc365..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_bricks.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/cube_all", - "textures": { - "all": "betterend:block/violecite_bricks" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_bricks_half_slab.json b/src/main/resources/assets/betterend/models/block/violecite_bricks_half_slab.json deleted file mode 100644 index 05899619..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_bricks_half_slab.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/slab", - "textures": { - "bottom": "betterend:block/violecite_bricks", - "side": "betterend:block/violecite_bricks", - "top": "betterend:block/violecite_bricks" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_bricks_inner_stairs.json b/src/main/resources/assets/betterend/models/block/violecite_bricks_inner_stairs.json deleted file mode 100644 index 09caacad..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_bricks_inner_stairs.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/inner_stairs", - "textures": { - "bottom": "betterend:block/violecite_bricks", - "side": "betterend:block/violecite_bricks", - "top": "betterend:block/violecite_bricks" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_bricks_outer_stairs.json b/src/main/resources/assets/betterend/models/block/violecite_bricks_outer_stairs.json deleted file mode 100644 index 02928f43..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_bricks_outer_stairs.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/outer_stairs", - "textures": { - "bottom": "betterend:block/violecite_bricks", - "side": "betterend:block/violecite_bricks", - "top": "betterend:block/violecite_bricks" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_bricks_stairs.json b/src/main/resources/assets/betterend/models/block/violecite_bricks_stairs.json deleted file mode 100644 index 38aa1ad7..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_bricks_stairs.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/stairs", - "textures": { - "bottom": "betterend:block/violecite_bricks", - "side": "betterend:block/violecite_bricks", - "top": "betterend:block/violecite_bricks" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_bricks_wall_inventory.json b/src/main/resources/assets/betterend/models/block/violecite_bricks_wall_inventory.json deleted file mode 100644 index 8f597f59..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_bricks_wall_inventory.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/wall_inventory", - "textures": { - "wall": "betterend:block/violecite_bricks" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_bricks_wall_post.json b/src/main/resources/assets/betterend/models/block/violecite_bricks_wall_post.json index 31041706..8a75fa2b 100644 --- a/src/main/resources/assets/betterend/models/block/violecite_bricks_wall_post.json +++ b/src/main/resources/assets/betterend/models/block/violecite_bricks_wall_post.json @@ -7,7 +7,7 @@ }, "elements": [ { - "from": [ 4, 0, 4 ], + "from": [ 4, -0.01, 4 ], "to": [ 12, 16, 12 ], "faces": { "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top", "cullface": "down" }, diff --git a/src/main/resources/assets/betterend/models/block/violecite_button.json b/src/main/resources/assets/betterend/models/block/violecite_button.json deleted file mode 100644 index 5af846c9..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_button.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/button", - "textures": { - "texture": "betterend:block/violecite" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_button_inventory.json b/src/main/resources/assets/betterend/models/block/violecite_button_inventory.json deleted file mode 100644 index 34e2c997..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_button_inventory.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/button_inventory", - "textures": { - "texture": "betterend:block/violecite" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_button_pressed.json b/src/main/resources/assets/betterend/models/block/violecite_button_pressed.json deleted file mode 100644 index 2c5dc88a..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_button_pressed.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/button_pressed", - "textures": { - "texture": "betterend:block/violecite" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_half_slab.json b/src/main/resources/assets/betterend/models/block/violecite_half_slab.json deleted file mode 100644 index ed487bae..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_half_slab.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/slab", - "textures": { - "bottom": "betterend:block/violecite", - "side": "betterend:block/violecite", - "top": "betterend:block/violecite" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_inner_stairs.json b/src/main/resources/assets/betterend/models/block/violecite_inner_stairs.json deleted file mode 100644 index 199e7654..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_inner_stairs.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/inner_stairs", - "textures": { - "bottom": "betterend:block/violecite", - "side": "betterend:block/violecite", - "top": "betterend:block/violecite" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_outer_stairs.json b/src/main/resources/assets/betterend/models/block/violecite_outer_stairs.json deleted file mode 100644 index d6ba85b4..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_outer_stairs.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/outer_stairs", - "textures": { - "bottom": "betterend:block/violecite", - "side": "betterend:block/violecite", - "top": "betterend:block/violecite" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_pillar.json b/src/main/resources/assets/betterend/models/block/violecite_pillar.json deleted file mode 100644 index f5e4b854..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_pillar.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column", - "textures": { - "end": "betterend:block/violecite_pillar_top", - "side": "betterend:block/violecite_pillar_side" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_pressure_plate_down.json b/src/main/resources/assets/betterend/models/block/violecite_pressure_plate_down.json deleted file mode 100644 index 36b648a7..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_pressure_plate_down.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/pressure_plate_down", - "textures": { - "texture": "betterend:block/violecite" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_pressure_plate_up.json b/src/main/resources/assets/betterend/models/block/violecite_pressure_plate_up.json deleted file mode 100644 index 7b85fef6..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_pressure_plate_up.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/pressure_plate_up", - "textures": { - "texture": "betterend:block/violecite" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_small_tiles.json b/src/main/resources/assets/betterend/models/block/violecite_small_tiles.json deleted file mode 100644 index a92dc366..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_small_tiles.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/cube_all", - "textures": { - "all": "betterend:block/violecite_small_tiles" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_stairs.json b/src/main/resources/assets/betterend/models/block/violecite_stairs.json deleted file mode 100644 index da47eb95..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_stairs.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/stairs", - "textures": { - "bottom": "betterend:block/violecite", - "side": "betterend:block/violecite", - "top": "betterend:block/violecite" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_tile.json b/src/main/resources/assets/betterend/models/block/violecite_tile.json deleted file mode 100644 index 148ec8d8..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_tile.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/cube_all", - "textures": { - "all": "betterend:block/violecite_tile" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_wall_inventory.json b/src/main/resources/assets/betterend/models/block/violecite_wall_inventory.json deleted file mode 100644 index 94cd6db8..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_wall_inventory.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/wall_inventory", - "textures": { - "wall": "betterend:block/violecite" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_wall_post.json b/src/main/resources/assets/betterend/models/block/violecite_wall_post.json deleted file mode 100644 index 2f1ba471..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_wall_post.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/template_wall_post", - "textures": { - "wall": "betterend:block/violecite" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_wall_side.json b/src/main/resources/assets/betterend/models/block/violecite_wall_side.json deleted file mode 100644 index 60a7b1f9..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_wall_side.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/template_wall_side", - "textures": { - "wall": "betterend:block/violecite" - } -} diff --git a/src/main/resources/assets/betterend/models/block/violecite_wall_side_tall.json b/src/main/resources/assets/betterend/models/block/violecite_wall_side_tall.json deleted file mode 100644 index 19069a9c..00000000 --- a/src/main/resources/assets/betterend/models/block/violecite_wall_side_tall.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/template_wall_side_tall", - "textures": { - "wall": "betterend:block/violecite" - } -} diff --git a/src/main/resources/assets/betterend/models/item/violecite.json b/src/main/resources/assets/betterend/models/item/violecite.json deleted file mode 100644 index c8139128..00000000 --- a/src/main/resources/assets/betterend/models/item/violecite.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/violecite" -} diff --git a/src/main/resources/assets/betterend/models/item/violecite_bricks.json b/src/main/resources/assets/betterend/models/item/violecite_bricks.json deleted file mode 100644 index c998c0c4..00000000 --- a/src/main/resources/assets/betterend/models/item/violecite_bricks.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/violecite_bricks" -} diff --git a/src/main/resources/assets/betterend/models/item/violecite_bricks_slab.json b/src/main/resources/assets/betterend/models/item/violecite_bricks_slab.json deleted file mode 100644 index a1b35d09..00000000 --- a/src/main/resources/assets/betterend/models/item/violecite_bricks_slab.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/violecite_bricks_half_slab" -} diff --git a/src/main/resources/assets/betterend/models/item/violecite_bricks_stairs.json b/src/main/resources/assets/betterend/models/item/violecite_bricks_stairs.json deleted file mode 100644 index 5a145605..00000000 --- a/src/main/resources/assets/betterend/models/item/violecite_bricks_stairs.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/violecite_bricks_stairs" -} diff --git a/src/main/resources/assets/betterend/models/item/violecite_bricks_wall.json b/src/main/resources/assets/betterend/models/item/violecite_bricks_wall.json deleted file mode 100644 index 4e894bdd..00000000 --- a/src/main/resources/assets/betterend/models/item/violecite_bricks_wall.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/violecite_bricks_wall_inventory" -} diff --git a/src/main/resources/assets/betterend/models/item/violecite_button.json b/src/main/resources/assets/betterend/models/item/violecite_button.json deleted file mode 100644 index b8ed9ab9..00000000 --- a/src/main/resources/assets/betterend/models/item/violecite_button.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/violecite_button_inventory" -} diff --git a/src/main/resources/assets/betterend/models/item/violecite_pillar.json b/src/main/resources/assets/betterend/models/item/violecite_pillar.json deleted file mode 100644 index c278b52f..00000000 --- a/src/main/resources/assets/betterend/models/item/violecite_pillar.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/violecite_pillar" -} diff --git a/src/main/resources/assets/betterend/models/item/violecite_plate.json b/src/main/resources/assets/betterend/models/item/violecite_plate.json deleted file mode 100644 index cdca92aa..00000000 --- a/src/main/resources/assets/betterend/models/item/violecite_plate.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/violecite_pressure_plate_up" -} diff --git a/src/main/resources/assets/betterend/models/item/violecite_slab.json b/src/main/resources/assets/betterend/models/item/violecite_slab.json deleted file mode 100644 index e8909031..00000000 --- a/src/main/resources/assets/betterend/models/item/violecite_slab.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/violecite_half_slab" -} diff --git a/src/main/resources/assets/betterend/models/item/violecite_small_tiles.json b/src/main/resources/assets/betterend/models/item/violecite_small_tiles.json deleted file mode 100644 index 34b0be36..00000000 --- a/src/main/resources/assets/betterend/models/item/violecite_small_tiles.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/violecite_small_tiles" -} diff --git a/src/main/resources/assets/betterend/models/item/violecite_stairs.json b/src/main/resources/assets/betterend/models/item/violecite_stairs.json deleted file mode 100644 index c7af3f8c..00000000 --- a/src/main/resources/assets/betterend/models/item/violecite_stairs.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/violecite_stairs" -} diff --git a/src/main/resources/assets/betterend/models/item/violecite_tile.json b/src/main/resources/assets/betterend/models/item/violecite_tile.json deleted file mode 100644 index 8de1a119..00000000 --- a/src/main/resources/assets/betterend/models/item/violecite_tile.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/violecite_tile" -} diff --git a/src/main/resources/assets/betterend/models/item/violecite_wall.json b/src/main/resources/assets/betterend/models/item/violecite_wall.json deleted file mode 100644 index 32556ef6..00000000 --- a/src/main/resources/assets/betterend/models/item/violecite_wall.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/violecite_wall_inventory" -} diff --git a/src/main/resources/assets/betterend/patterns/block/wall_post.json b/src/main/resources/assets/betterend/patterns/block/wall_post.json index 314e40d3..9acedf1f 100644 --- a/src/main/resources/assets/betterend/patterns/block/wall_post.json +++ b/src/main/resources/assets/betterend/patterns/block/wall_post.json @@ -1,20 +1,6 @@ { - "textures": { - "wall": "betterend:block/%parent%", - "particle": "#wall" - }, - "elements": [ - { "from": [ 4, -0.01, 4 ], - "to": [ 12, 16, 12 ], - "faces": { - "down": { "texture": "#wall", "cullface": "down" }, - "up": { "texture": "#wall", "cullface": "up" }, - "north": { "texture": "#wall" }, - "south": { "texture": "#wall" }, - "west": { "texture": "#wall" }, - "east": { "texture": "#wall" } - }, - "__comment": "Center post" - } - ] -} + "parent": "minecraft:block/template_wall_post", + "textures": { + "wall": "betterend:block/%parent%" + } +} \ No newline at end of file From 0dc6a0dd739f348b750f67fdbd686f2ef694b20c Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 11 Jan 2021 12:57:17 +0300 Subject: [PATCH 125/463] Mountain adaptation to new generator --- .../world/generator/IslandLayer.java | 34 ++++++++------- .../world/generator/TerrainGenerator.java | 43 +++++++++++++++++++ .../features/StructureMountain.java | 2 +- .../world/structures/piece/MountainPiece.java | 21 +++++---- 4 files changed, 75 insertions(+), 25 deletions(-) diff --git a/src/main/java/ru/betterend/world/generator/IslandLayer.java b/src/main/java/ru/betterend/world/generator/IslandLayer.java index beef77a8..644b4bf4 100644 --- a/src/main/java/ru/betterend/world/generator/IslandLayer.java +++ b/src/main/java/ru/betterend/world/generator/IslandLayer.java @@ -30,6 +30,8 @@ public class IslandLayer { private final int minY; private final int maxY; private final long center; + private int lastX = Integer.MIN_VALUE; + private int lastZ = Integer.MIN_VALUE; public IslandLayer(int seed, double distance, float scale, int center, int heightVariation) { this.distance = distance; @@ -48,22 +50,24 @@ public class IslandLayer { } public void updatePositions(double x, double z) { - positions.clear(); - int ix = MHelper.floor(x / distance); int iz = MHelper.floor(z / distance); - - for (int pox = -1; pox < 2; pox++) { - int px = pox + ix; - for (int poz = -1; poz < 2; poz++) { - int pz = poz + iz; - if (TerrainGenerator.noRingVoid() || (long) px + (long) pz > center) { - RANDOM.setSeed(getSeed(px, pz)); - double posX = (px + RANDOM.nextFloat()) * distance; - double posY = MHelper.randRange(minY, maxY, RANDOM); - double posZ = (pz + RANDOM.nextFloat()) * distance; - if (density.eval(posX * 0.01, posZ * 0.01) > 0) { - positions.add(new BlockPos(posX, posY, posZ)); + if (lastX != ix || lastZ != iz) { + lastX = ix; + lastZ = iz; + positions.clear(); + for (int pox = -1; pox < 2; pox++) { + int px = pox + ix; + for (int poz = -1; poz < 2; poz++) { + int pz = poz + iz; + if (TerrainGenerator.noRingVoid() || (long) px + (long) pz > center) { + RANDOM.setSeed(getSeed(px, pz)); + double posX = (px + RANDOM.nextFloat()) * distance; + double posY = MHelper.randRange(minY, maxY, RANDOM); + double posZ = (pz + RANDOM.nextFloat()) * distance; + if (density.eval(posX * 0.01, posZ * 0.01) > 0) { + positions.add(new BlockPos(posX, posY, posZ)); + } } } } @@ -102,7 +106,7 @@ public class IslandLayer { } public void clearCache() { - if (islands.size() > 32) { + if (islands.size() > 128) { islands.clear(); } } diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index 4f8c8e9a..8f19e421 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -3,6 +3,7 @@ package ru.betterend.world.generator; import java.util.Random; import java.util.concurrent.locks.ReentrantLock; +import net.minecraft.util.math.MathHelper; import ru.betterend.config.Configs; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; @@ -118,4 +119,46 @@ public class TerrainGenerator { LOCKER.unlock(); return false; } + + /** + * Check if this is land + * @param x - biome pos x + * @param z - biome pos z + */ + public static int getHeight(int x, int z) { + LOCKER.lock(); + + //x >>= 3; + //z >>= 3; + double px = (double) x / 8.0; + double pz = (double) z / 8.0; + + double distortion1 = noise1.eval(px * 0.1, pz * 0.1) * 20 + noise2.eval(px * 0.2, pz * 0.2) * 10 + noise1.eval(px * 0.4, pz * 0.4) * 5; + double distortion2 = noise2.eval(px * 0.1, pz * 0.1) * 20 + noise1.eval(px * 0.2, pz * 0.2) * 10 + noise2.eval(px * 0.4, pz * 0.4) * 5; + px = (double) x * SCALE_XZ + distortion1; + pz = (double) z * SCALE_XZ + distortion2; + + largeIslands.updatePositions(px, pz); + mediumIslands.updatePositions(px, pz); + smallIslands.updatePositions(px, pz); + + for (int y = 32; y >= 0; y--) { + double py = (double) y * SCALE_Y; + float dist = largeIslands.getDensity(px, py, pz); + dist = dist > 1 ? dist : MHelper.max(dist, mediumIslands.getDensity(px, py, pz)); + dist = dist > 1 ? dist : MHelper.max(dist, smallIslands.getDensity(px, py, pz)); + if (dist > -0.5F) { + dist += noise1.eval(px * 0.01, py * 0.01, pz * 0.01) * 0.04; + dist += noise2.eval(px * 0.05, py * 0.05, pz * 0.05) * 0.02; + dist += noise1.eval(px * 0.1, py * 0.1, pz * 0.1) * 0.01; + } + if (dist > 0) { + LOCKER.unlock(); + return MathHelper.floor(MathHelper.clamp(y + dist, y, y + 1) * SCALE_Y); + } + } + + LOCKER.unlock(); + return 0; + } } diff --git a/src/main/java/ru/betterend/world/structures/features/StructureMountain.java b/src/main/java/ru/betterend/world/structures/features/StructureMountain.java index 8de38254..6f84c53a 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructureMountain.java +++ b/src/main/java/ru/betterend/world/structures/features/StructureMountain.java @@ -29,7 +29,7 @@ public class StructureMountain extends StructureFeatureBase { int x = (chunkX << 4) | MHelper.randRange(4, 12, random); int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); - if (y > 50) { + if (y > 5) { float radius = MHelper.randRange(50, 100, random); float height = radius * MHelper.randRange(0.8F, 1.2F, random); MountainPiece piece = new MountainPiece(new BlockPos(x, y, z), radius, height, random, biome); diff --git a/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java index 73958f31..cd875fcc 100644 --- a/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java @@ -118,15 +118,15 @@ public class MountainPiece extends BasePiece { } minY = pos.getY(); minY = Math.max(minY, map2.get(x, z)); - if (minY > 10) { - float maxY = dist * height * getHeightClamp(world, 8, px, pz); + if (minY > center.getY() - 8) { + float maxY = dist * height * getHeightClamp(world, 12, px, pz); if (maxY > 0) { maxY *= (float) noise1.eval(px * 0.05, pz * 0.05) * 0.3F + 0.7F; maxY *= (float) noise1.eval(px * 0.1, pz * 0.1) * 0.1F + 0.8F; - maxY += 56; + maxY += center.getY(); int maxYI = (int) (maxY); int cover = maxYI - 1; - boolean needCover = (noise1.eval(px * 0.1, pz * 0.1) + MHelper.randRange(-0.4, 0.4, random) - (maxY - 70) * 0.1) > 0; + boolean needCover = (noise1.eval(px * 0.1, pz * 0.1) + MHelper.randRange(-0.4, 0.4, random) - (center.getY() + 14) * 0.1) > 0; for (int y = minY - 1; y < maxYI; y++) { pos.setY(y); chunk.setBlockState(pos, needCover && y == cover ? top : Blocks.END_STONE.getDefaultState(), false); @@ -140,7 +140,7 @@ public class MountainPiece extends BasePiece { map = chunk.getHeightmap(Type.WORLD_SURFACE); // Big crystals - int count = (map.get(8, 8) - 80) / 7; + int count = (map.get(8, 8) - (center.getY() + 24)) / 7; count = MathHelper.clamp(count, 0, 8); for (int i = 0; i < count; i++) { int radius = MHelper.randRange(2, 3, random); @@ -158,7 +158,7 @@ public class MountainPiece extends BasePiece { } // Small crystals - count = (map.get(8, 8) - 80) / 2; + count = (map.get(8, 8) - (center.getY() + 24)) / 2; count = MathHelper.clamp(count, 4, 8); for (int i = 0; i < count; i++) { int radius = MHelper.randRange(1, 2, random); @@ -190,10 +190,13 @@ public class MountainPiece extends BasePiece { return -10; } h = world.getTopY(Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); - if (h < 57) { - heightmap.put(p, -4); - return -4; + h = MathHelper.abs(h - center.getY()); + if (h > 4) { + h = 4 - h; + heightmap.put(p, h); + return h; } + h = MHelper.floor(noise2.eval(pos.getX() * 0.01, pos.getZ() * 0.01) * noise2.eval(pos.getX() * 0.002, pos.getZ() * 0.002) * 8 + 8); if (h < 0) { From 9f99a0e99e79d5e4b73d18393a71e06f9bafd752 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 11 Jan 2021 13:10:53 +0300 Subject: [PATCH 126/463] Fixed caves --- .../features/terrain/RoundCaveFeature.java | 42 +++++++++++++++---- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java index f254386b..82cb32c5 100644 --- a/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java @@ -41,7 +41,7 @@ public class RoundCaveFeature extends DefaultFeature { } int radius = MHelper.randRange(10, 30, random); - int bottom = BlocksHelper.upRay(world, new BlockPos(pos.getX(), 0, pos.getZ()), 32) + radius + 5; + /*int bottom = BlocksHelper.upRay(world, new BlockPos(pos.getX(), 0, pos.getZ()), 32) + radius + 5; int top = world.getTopY(Heightmap.Type.WORLD_SURFACE, pos.getX(), pos.getZ()); Mutable bpos = new Mutable(); @@ -53,6 +53,32 @@ public class RoundCaveFeature extends DefaultFeature { } top -= radius * 1.3F + 5; + if (top <= bottom) { + return false; + }*/ + + int top = world.getTopY(Heightmap.Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); + Mutable bpos = new Mutable(); + bpos.setX(pos.getX()); + bpos.setZ(pos.getZ()); + bpos.setY(top); + + BlockState state = world.getBlockState(bpos); + while (!state.isIn(EndTags.GEN_TERRAIN) && bpos.getY() > 5) { + bpos.setY(bpos.getY() - 1); + state = world.getBlockState(bpos); + } + if (bpos.getY() < 10) { + return false; + } + top = (int) (bpos.getY() - (radius * 1.3F + 5)); + + while (state.isIn(EndTags.GEN_TERRAIN) || state.isOf(Blocks.WATER) && bpos.getY() > 5) { + bpos.setY(bpos.getY() - 1); + state = world.getBlockState(bpos); + } + int bottom = (int) (bpos.getY() + radius * 1.3F + 5); + if (top <= bottom) { return false; } @@ -90,7 +116,7 @@ public class RoundCaveFeature extends DefaultFeature { double r2 = r + 5; double dist = xsq + ysq + zsq; if (dist < r * r) { - BlockState state = world.getBlockState(bpos); + state = world.getBlockState(bpos); if (isReplaceable(state)) { BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR); @@ -113,7 +139,7 @@ public class RoundCaveFeature extends DefaultFeature { } } else if (dist < r2 * r2) { - BlockState state = world.getBlockState(bpos); + state = world.getBlockState(bpos); if (!state.getFluidState().isEmpty()) { BlocksHelper.setWithoutUpdate(world, bpos, Blocks.END_STONE.getDefaultState()); } @@ -150,11 +176,11 @@ public class RoundCaveFeature extends DefaultFeature { float vx = (float) Math.sin(angleY); float vz = (float) Math.sin(angleY); prism = new SDFRotation().setRotation(new Vector3f(vx, 0, vz), random.nextFloat()).setSource(prism); - prism.setReplaceFunction((state) -> { - return state.getMaterial().isReplaceable() - || state.isIn(EndTags.GEN_TERRAIN) - || state.getMaterial().equals(Material.PLANT) - || state.getMaterial().equals(Material.LEAVES); + prism.setReplaceFunction((bState) -> { + return bState.getMaterial().isReplaceable() + || bState.isIn(EndTags.GEN_TERRAIN) + || bState.getMaterial().equals(Material.PLANT) + || bState.getMaterial().equals(Material.LEAVES); }); prism.fillRecursive(world, pos); BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.AURORA_CRYSTAL); From 23b4382231bd44ca14772a25dd1050a04b76e8e0 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 11 Jan 2021 13:29:39 +0300 Subject: [PATCH 127/463] Island shape fix --- .../ru/betterend/world/generator/IslandLayer.java | 5 ++--- .../betterend/world/generator/TerrainGenerator.java | 12 ++++++------ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/main/java/ru/betterend/world/generator/IslandLayer.java b/src/main/java/ru/betterend/world/generator/IslandLayer.java index 644b4bf4..533e2d66 100644 --- a/src/main/java/ru/betterend/world/generator/IslandLayer.java +++ b/src/main/java/ru/betterend/world/generator/IslandLayer.java @@ -14,7 +14,6 @@ import ru.betterend.util.sdf.SDF; import ru.betterend.util.sdf.operator.SDFScale; import ru.betterend.util.sdf.operator.SDFSmoothUnion; import ru.betterend.util.sdf.operator.SDFTranslate; -import ru.betterend.util.sdf.operator.SDFUnion; import ru.betterend.util.sdf.primitive.SDFCappedCone; public class IslandLayer { @@ -123,8 +122,8 @@ public class IslandLayer { SDF cone3 = makeCone(0.5F, 0.45F, 0.03F, 0.0F); SDF cone4 = makeCone(0.45F, 0, 0.02F, 0.03F); - SDF coneBottom = new SDFUnion().setSourceA(cone1).setSourceB(cone2); - SDF coneTop = new SDFUnion().setSourceA(cone3).setSourceB(cone4); + SDF coneBottom = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone1).setSourceB(cone2); + SDF coneTop = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone3).setSourceB(cone4); ISLAND = new SDFSmoothUnion().setRadius(0.01F).setSourceA(coneTop).setSourceB(coneBottom); } diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index 8f19e421..741f990c 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -29,9 +29,9 @@ public class TerrainGenerator { public static void initNoise(long seed) { Random random = new Random(seed); - largeIslands = new IslandLayer(random.nextInt(), 300, 200, 63, 0); - mediumIslands = new IslandLayer(random.nextInt(), 150, 100, 63, 16); - smallIslands = new IslandLayer(random.nextInt(), 60, 50, 63, 32); + largeIslands = new IslandLayer(random.nextInt(), 300, 200, 70, 10); + mediumIslands = new IslandLayer(random.nextInt(), 150, 100, 70, 20); + smallIslands = new IslandLayer(random.nextInt(), 60, 50, 70, 30); noise1 = new OpenSimplexNoise(random.nextInt()); noise2 = new OpenSimplexNoise(random.nextInt()); } @@ -70,9 +70,9 @@ public class TerrainGenerator { dist = dist > 1 ? dist : MHelper.max(dist, mediumIslands.getDensity(px, py, pz)); dist = dist > 1 ? dist : MHelper.max(dist, smallIslands.getDensity(px, py, pz)); if (dist > -0.5F) { - dist += noise1.eval(px * 0.01, py * 0.01, pz * 0.01) * 0.04; - dist += noise2.eval(px * 0.05, py * 0.05, pz * 0.05) * 0.02; - dist += noise1.eval(px * 0.1, py * 0.1, pz * 0.1) * 0.01; + dist += noise1.eval(px * 0.01, py * 0.01, pz * 0.01) * 0.02 + 0.02; + dist += noise2.eval(px * 0.05, py * 0.05, pz * 0.05) * 0.01 + 0.01; + dist += noise1.eval(px * 0.1, py * 0.1, pz * 0.1) * 0.005 + 0.005; } buffer[y] = dist; } From cdfb3db5153253d30ae144e564cd98edbbac2f7a Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 11 Jan 2021 13:45:30 +0300 Subject: [PATCH 128/463] Fixed wrong geyser positioning and caves --- .../world/features/terrain/GeyserFeature.java | 362 +++++++++--------- .../features/terrain/RoundCaveFeature.java | 19 +- .../terrain/SulphuricCaveFeature.java | 25 +- 3 files changed, 211 insertions(+), 195 deletions(-) diff --git a/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java b/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java index 2868079e..7334d517 100644 --- a/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java @@ -48,183 +48,195 @@ public class GeyserFeature extends DefaultFeature { public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { pos = getPosOnSurfaceWG(world, pos); - if (pos.getY() > 57) { - int halfHeight = MHelper.randRange(10, 20, random); - float radius1 = halfHeight * 0.5F; - float radius2 = halfHeight * 0.1F + 0.5F; - SDF sdf = new SDFCappedCone().setHeight(halfHeight).setRadius1(radius1).setRadius2(radius2).setBlock(EndBlocks.SULPHURIC_ROCK.stone); - sdf = new SDFTranslate().setTranslate(0, halfHeight - 3, 0).setSource(sdf); - - int count = halfHeight; - for (int i = 0; i < count; i++) { - int py = i << 1; - float delta = (float) i / (float) (count - 1); - float radius = MathHelper.lerp(delta, radius1, radius2) * 1.3F; - - SDF bowl = new SDFCappedCone().setHeight(radius).setRadius1(0).setRadius2(radius).setBlock(EndBlocks.SULPHURIC_ROCK.stone); - - SDF brimstone = new SDFCappedCone().setHeight(radius).setRadius1(0).setRadius2(radius).setBlock(EndBlocks.BRIMSTONE); - brimstone = new SDFTranslate().setTranslate(0, 2F, 0).setSource(brimstone); - bowl = new SDFSubtraction().setSourceA(bowl).setSourceB(brimstone); - bowl = new SDFUnion().setSourceA(brimstone).setSourceB(bowl); - - SDF water = new SDFCappedCone().setHeight(radius).setRadius1(0).setRadius2(radius).setBlock(Blocks.WATER); - water = new SDFTranslate().setTranslate(0, 4, 0).setSource(water); - bowl = new SDFSubtraction().setSourceA(bowl).setSourceB(water); - bowl = new SDFUnion().setSourceA(water).setSourceB(bowl); - - final OpenSimplexNoise noise1 = new OpenSimplexNoise(random.nextLong()); - final OpenSimplexNoise noise2 = new OpenSimplexNoise(random.nextLong()); - - bowl = new SDFCoordModify().setFunction((vec) -> { - float dx = (float) noise1.eval(vec.getX() * 0.1, vec.getY() * 0.1, vec.getZ() * 0.1); - float dz = (float) noise2.eval(vec.getX() * 0.1, vec.getY() * 0.1, vec.getZ() * 0.1); - vec.set(vec.getX() + dx, vec.getY(), vec.getZ() + dz); - }).setSource(bowl); - - SDF cut = new SDFFlatland().setBlock(Blocks.AIR); - cut = new SDFInvert().setSource(cut); - cut = new SDFTranslate().setTranslate(0, radius - 2, 0).setSource(cut); - bowl = new SDFSubtraction().setSourceA(bowl).setSourceB(cut); - - bowl = new SDFTranslate().setTranslate(radius, py - radius, 0).setSource(bowl); - bowl = new SDFRotation().setRotation(Vector3f.POSITIVE_Y, i * 4F).setSource(bowl); - sdf = new SDFUnion().setSourceA(sdf).setSourceB(bowl); - } - sdf.setReplaceFunction(REPLACE2).fillRecursive(world, pos); - - radius2 = radius2 * 0.5F; - if (radius2 < 0.7F) { - radius2 = 0.7F; - } - final OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); - - SDFPrimitive obj1; - SDFPrimitive obj2; - - obj1 = new SDFCappedCone().setHeight(halfHeight + 5).setRadius1(radius1 * 0.5F).setRadius2(radius2); - sdf = new SDFTranslate().setTranslate(0, halfHeight - 13, 0).setSource(obj1); - sdf = new SDFDisplacement().setFunction((vec) -> { - return (float) noise.eval(vec.getX() * 0.3F, vec.getY() * 0.3F, vec.getZ() * 0.3F) * 0.5F; - }).setSource(sdf); - - obj2 = new SDFSphere().setRadius(radius1); - SDF cave = new SDFScale3D().setScale(1.5F, 1, 1.5F).setSource(obj2); - cave = new SDFDisplacement().setFunction((vec) -> { - return (float) noise.eval(vec.getX() * 0.1F, vec.getY() * 0.1F, vec.getZ() * 0.1F) * 2F; - }).setSource(cave); - cave = new SDFTranslate().setTranslate(0, -halfHeight - 10, 0).setSource(cave); - - sdf = new SDFSmoothUnion().setRadius(5).setSourceA(cave).setSourceB(sdf); - - obj1.setBlock(WATER); - obj2.setBlock(WATER); - sdf.setReplaceFunction(REPLACE2); - sdf.fillRecursive(world, pos); - - obj1.setBlock(EndBlocks.BRIMSTONE); - obj2.setBlock(EndBlocks.BRIMSTONE); - new SDFDisplacement().setFunction((vec) -> { - return -2F; - }).setSource(sdf).setReplaceFunction(REPLACE1).fillRecursiveIgnore(world, pos, IGNORE); - - obj1.setBlock(EndBlocks.SULPHURIC_ROCK.stone); - obj2.setBlock(EndBlocks.SULPHURIC_ROCK.stone); - new SDFDisplacement().setFunction((vec) -> { - return -4F; - }).setSource(cave).setReplaceFunction(REPLACE1).fillRecursiveIgnore(world, pos, IGNORE); - - obj1.setBlock(Blocks.END_STONE); - obj2.setBlock(Blocks.END_STONE); - new SDFDisplacement().setFunction((vec) -> { - return -6F; - }).setSource(cave).setReplaceFunction(REPLACE1).fillRecursiveIgnore(world, pos, IGNORE); - - BlocksHelper.setWithoutUpdate(world, pos, WATER); - Mutable mut = new Mutable().set(pos); - count = getYOnSurface(world, pos.getX(), pos.getZ()) - pos.getY(); - for (int i = 0; i < count; i++) { - BlocksHelper.setWithoutUpdate(world, mut, WATER); - for (Direction dir: BlocksHelper.HORIZONTAL) { - BlocksHelper.setWithoutUpdate(world, mut.offset(dir), WATER); - } - mut.setY(mut.getY() + 1); - } - - for (int i = 0; i < 150; i++) { - mut.set(pos).move(MHelper.floor(random.nextGaussian() * 4 + 0.5), -halfHeight - 10, MHelper.floor(random.nextGaussian() * 4 + 0.5)); - float distRaw = MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ()); - int dist = MHelper.floor(6 - distRaw) + random.nextInt(2); - if (dist >= 0) { - BlockState state = world.getBlockState(mut); - while (!state.getFluidState().isEmpty() || state.getMaterial().equals(Material.UNDERWATER_PLANT)) { - mut.setY(mut.getY() - 1); - state = world.getBlockState(mut); - } - if (state.isIn(EndTags.GEN_TERRAIN) && !world.getBlockState(mut.up()).isOf(EndBlocks.HYDROTHERMAL_VENT)) { - for (int j = 0; j <= dist; j++) { - BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.SULPHURIC_ROCK.stone); - MHelper.shuffle(HORIZONTAL, random); - for (Direction dir: HORIZONTAL) { - BlockPos p = mut.offset(dir); - if (random.nextBoolean() && world.getBlockState(p).isOf(Blocks.WATER)) { - BlocksHelper.setWithoutUpdate(world, p, EndBlocks.TUBE_WORM.getDefaultState().with(HorizontalFacingBlock.FACING, dir)); - } - } - mut.setY(mut.getY() + 1); - } - state = EndBlocks.HYDROTHERMAL_VENT.getDefaultState().with(HydrothermalVentBlock.ACTIVATED, distRaw < 2); - BlocksHelper.setWithoutUpdate(world, mut, state); - mut.setY(mut.getY() + 1); - state = world.getBlockState(mut); - while (state.isOf(Blocks.WATER)) { - BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.VENT_BUBBLE_COLUMN.getDefaultState()); - mut.setY(mut.getY() + 1); - state = world.getBlockState(mut); - } - } - } - } - - for (int i = 0; i < 10; i++) { - mut.set(pos).move(MHelper.floor(random.nextGaussian() * 0.7 + 0.5), -halfHeight - 10, MHelper.floor(random.nextGaussian() * 0.7 + 0.5)); - float distRaw = MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ()); - int dist = MHelper.floor(6 - distRaw) + random.nextInt(2); - if (dist >= 0) { - BlockState state = world.getBlockState(mut); - while (state.isOf(Blocks.WATER)) { - mut.setY(mut.getY() - 1); - state = world.getBlockState(mut); - } - if (state.isIn(EndTags.GEN_TERRAIN)) { - for (int j = 0; j <= dist; j++) { - BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.SULPHURIC_ROCK.stone); - mut.setY(mut.getY() + 1); - } - state = EndBlocks.HYDROTHERMAL_VENT.getDefaultState().with(HydrothermalVentBlock.ACTIVATED, distRaw < 2); - BlocksHelper.setWithoutUpdate(world, mut, state); - mut.setY(mut.getY() + 1); - state = world.getBlockState(mut); - while (state.isOf(Blocks.WATER)) { - BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.VENT_BUBBLE_COLUMN.getDefaultState()); - mut.setY(mut.getY() + 1); - state = world.getBlockState(mut); - } - } - } - } - - EndFeatures.SULPHURIC_LAKE.getFeature().generate(world, chunkGenerator, random, pos, null); - - double distance = radius1 * 1.7; - BlockPos start = pos.add(-distance, -halfHeight - 15 - distance, -distance); - BlockPos end = pos.add(distance, -halfHeight - 5 + distance, distance); - BlocksHelper.fixBlocks(world, start, end); - - return true; + if (pos.getY() < 10) { + return false; } - return false; + Mutable bpos = new Mutable().set(pos); + bpos.setY(bpos.getY() - 1); + BlockState state = world.getBlockState(bpos); + while (state.isIn(EndTags.GEN_TERRAIN) || !state.getFluidState().isEmpty() && bpos.getY() > 5) { + bpos.setY(bpos.getY() - 1); + state = world.getBlockState(bpos); + } + + if (pos.getY() - bpos.getY() < 25) { + return false; + } + + int halfHeight = MHelper.randRange(10, 20, random); + float radius1 = halfHeight * 0.5F; + float radius2 = halfHeight * 0.1F + 0.5F; + SDF sdf = new SDFCappedCone().setHeight(halfHeight).setRadius1(radius1).setRadius2(radius2).setBlock(EndBlocks.SULPHURIC_ROCK.stone); + sdf = new SDFTranslate().setTranslate(0, halfHeight - 3, 0).setSource(sdf); + + int count = halfHeight; + for (int i = 0; i < count; i++) { + int py = i << 1; + float delta = (float) i / (float) (count - 1); + float radius = MathHelper.lerp(delta, radius1, radius2) * 1.3F; + + SDF bowl = new SDFCappedCone().setHeight(radius).setRadius1(0).setRadius2(radius).setBlock(EndBlocks.SULPHURIC_ROCK.stone); + + SDF brimstone = new SDFCappedCone().setHeight(radius).setRadius1(0).setRadius2(radius).setBlock(EndBlocks.BRIMSTONE); + brimstone = new SDFTranslate().setTranslate(0, 2F, 0).setSource(brimstone); + bowl = new SDFSubtraction().setSourceA(bowl).setSourceB(brimstone); + bowl = new SDFUnion().setSourceA(brimstone).setSourceB(bowl); + + SDF water = new SDFCappedCone().setHeight(radius).setRadius1(0).setRadius2(radius).setBlock(Blocks.WATER); + water = new SDFTranslate().setTranslate(0, 4, 0).setSource(water); + bowl = new SDFSubtraction().setSourceA(bowl).setSourceB(water); + bowl = new SDFUnion().setSourceA(water).setSourceB(bowl); + + final OpenSimplexNoise noise1 = new OpenSimplexNoise(random.nextLong()); + final OpenSimplexNoise noise2 = new OpenSimplexNoise(random.nextLong()); + + bowl = new SDFCoordModify().setFunction((vec) -> { + float dx = (float) noise1.eval(vec.getX() * 0.1, vec.getY() * 0.1, vec.getZ() * 0.1); + float dz = (float) noise2.eval(vec.getX() * 0.1, vec.getY() * 0.1, vec.getZ() * 0.1); + vec.set(vec.getX() + dx, vec.getY(), vec.getZ() + dz); + }).setSource(bowl); + + SDF cut = new SDFFlatland().setBlock(Blocks.AIR); + cut = new SDFInvert().setSource(cut); + cut = new SDFTranslate().setTranslate(0, radius - 2, 0).setSource(cut); + bowl = new SDFSubtraction().setSourceA(bowl).setSourceB(cut); + + bowl = new SDFTranslate().setTranslate(radius, py - radius, 0).setSource(bowl); + bowl = new SDFRotation().setRotation(Vector3f.POSITIVE_Y, i * 4F).setSource(bowl); + sdf = new SDFUnion().setSourceA(sdf).setSourceB(bowl); + } + sdf.setReplaceFunction(REPLACE2).fillRecursive(world, pos); + + radius2 = radius2 * 0.5F; + if (radius2 < 0.7F) { + radius2 = 0.7F; + } + final OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); + + SDFPrimitive obj1; + SDFPrimitive obj2; + + obj1 = new SDFCappedCone().setHeight(halfHeight + 5).setRadius1(radius1 * 0.5F).setRadius2(radius2); + sdf = new SDFTranslate().setTranslate(0, halfHeight - 13, 0).setSource(obj1); + sdf = new SDFDisplacement().setFunction((vec) -> { + return (float) noise.eval(vec.getX() * 0.3F, vec.getY() * 0.3F, vec.getZ() * 0.3F) * 0.5F; + }).setSource(sdf); + + obj2 = new SDFSphere().setRadius(radius1); + SDF cave = new SDFScale3D().setScale(1.5F, 1, 1.5F).setSource(obj2); + cave = new SDFDisplacement().setFunction((vec) -> { + return (float) noise.eval(vec.getX() * 0.1F, vec.getY() * 0.1F, vec.getZ() * 0.1F) * 2F; + }).setSource(cave); + cave = new SDFTranslate().setTranslate(0, -halfHeight - 10, 0).setSource(cave); + + sdf = new SDFSmoothUnion().setRadius(5).setSourceA(cave).setSourceB(sdf); + + obj1.setBlock(WATER); + obj2.setBlock(WATER); + sdf.setReplaceFunction(REPLACE2); + sdf.fillRecursive(world, pos); + + obj1.setBlock(EndBlocks.BRIMSTONE); + obj2.setBlock(EndBlocks.BRIMSTONE); + new SDFDisplacement().setFunction((vec) -> { + return -2F; + }).setSource(sdf).setReplaceFunction(REPLACE1).fillRecursiveIgnore(world, pos, IGNORE); + + obj1.setBlock(EndBlocks.SULPHURIC_ROCK.stone); + obj2.setBlock(EndBlocks.SULPHURIC_ROCK.stone); + new SDFDisplacement().setFunction((vec) -> { + return -4F; + }).setSource(cave).setReplaceFunction(REPLACE1).fillRecursiveIgnore(world, pos, IGNORE); + + obj1.setBlock(Blocks.END_STONE); + obj2.setBlock(Blocks.END_STONE); + new SDFDisplacement().setFunction((vec) -> { + return -6F; + }).setSource(cave).setReplaceFunction(REPLACE1).fillRecursiveIgnore(world, pos, IGNORE); + + BlocksHelper.setWithoutUpdate(world, pos, WATER); + Mutable mut = new Mutable().set(pos); + count = getYOnSurface(world, pos.getX(), pos.getZ()) - pos.getY(); + for (int i = 0; i < count; i++) { + BlocksHelper.setWithoutUpdate(world, mut, WATER); + for (Direction dir : BlocksHelper.HORIZONTAL) { + BlocksHelper.setWithoutUpdate(world, mut.offset(dir), WATER); + } + mut.setY(mut.getY() + 1); + } + + for (int i = 0; i < 150; i++) { + mut.set(pos).move(MHelper.floor(random.nextGaussian() * 4 + 0.5), -halfHeight - 10, MHelper.floor(random.nextGaussian() * 4 + 0.5)); + float distRaw = MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ()); + int dist = MHelper.floor(6 - distRaw) + random.nextInt(2); + if (dist >= 0) { + state = world.getBlockState(mut); + while (!state.getFluidState().isEmpty() || state.getMaterial().equals(Material.UNDERWATER_PLANT)) { + mut.setY(mut.getY() - 1); + state = world.getBlockState(mut); + } + if (state.isIn(EndTags.GEN_TERRAIN) && !world.getBlockState(mut.up()).isOf(EndBlocks.HYDROTHERMAL_VENT)) { + for (int j = 0; j <= dist; j++) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.SULPHURIC_ROCK.stone); + MHelper.shuffle(HORIZONTAL, random); + for (Direction dir : HORIZONTAL) { + BlockPos p = mut.offset(dir); + if (random.nextBoolean() && world.getBlockState(p).isOf(Blocks.WATER)) { + BlocksHelper.setWithoutUpdate(world, p, EndBlocks.TUBE_WORM.getDefaultState().with(HorizontalFacingBlock.FACING, dir)); + } + } + mut.setY(mut.getY() + 1); + } + state = EndBlocks.HYDROTHERMAL_VENT.getDefaultState().with(HydrothermalVentBlock.ACTIVATED, distRaw < 2); + BlocksHelper.setWithoutUpdate(world, mut, state); + mut.setY(mut.getY() + 1); + state = world.getBlockState(mut); + while (state.isOf(Blocks.WATER)) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.VENT_BUBBLE_COLUMN.getDefaultState()); + mut.setY(mut.getY() + 1); + state = world.getBlockState(mut); + } + } + } + } + + for (int i = 0; i < 10; i++) { + mut.set(pos).move(MHelper.floor(random.nextGaussian() * 0.7 + 0.5), -halfHeight - 10, MHelper.floor(random.nextGaussian() * 0.7 + 0.5)); + float distRaw = MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ()); + int dist = MHelper.floor(6 - distRaw) + random.nextInt(2); + if (dist >= 0) { + state = world.getBlockState(mut); + while (state.isOf(Blocks.WATER)) { + mut.setY(mut.getY() - 1); + state = world.getBlockState(mut); + } + if (state.isIn(EndTags.GEN_TERRAIN)) { + for (int j = 0; j <= dist; j++) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.SULPHURIC_ROCK.stone); + mut.setY(mut.getY() + 1); + } + state = EndBlocks.HYDROTHERMAL_VENT.getDefaultState().with(HydrothermalVentBlock.ACTIVATED, distRaw < 2); + BlocksHelper.setWithoutUpdate(world, mut, state); + mut.setY(mut.getY() + 1); + state = world.getBlockState(mut); + while (state.isOf(Blocks.WATER)) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.VENT_BUBBLE_COLUMN.getDefaultState()); + mut.setY(mut.getY() + 1); + state = world.getBlockState(mut); + } + } + } + } + + EndFeatures.SULPHURIC_LAKE.getFeature().generate(world, chunkGenerator, random, pos, null); + + double distance = radius1 * 1.7; + BlockPos start = pos.add(-distance, -halfHeight - 15 - distance, -distance); + BlockPos end = pos.add(distance, -halfHeight - 5 + distance, distance); + BlocksHelper.fixBlocks(world, start, end); + + return true; } static { diff --git a/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java index 82cb32c5..d6774924 100644 --- a/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java @@ -41,27 +41,12 @@ public class RoundCaveFeature extends DefaultFeature { } int radius = MHelper.randRange(10, 30, random); - /*int bottom = BlocksHelper.upRay(world, new BlockPos(pos.getX(), 0, pos.getZ()), 32) + radius + 5; - int top = world.getTopY(Heightmap.Type.WORLD_SURFACE, pos.getX(), pos.getZ()); - - Mutable bpos = new Mutable(); - bpos.setX(pos.getX()); - bpos.setZ(pos.getZ()); - bpos.setY(top); - while (top > bottom && !world.getBlockState(bpos).isIn(EndTags.GEN_TERRAIN)) { - bpos.setY(--top); - } - top -= radius * 1.3F + 5; - - if (top <= bottom) { - return false; - }*/ int top = world.getTopY(Heightmap.Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); Mutable bpos = new Mutable(); bpos.setX(pos.getX()); bpos.setZ(pos.getZ()); - bpos.setY(top); + bpos.setY(top - 1); BlockState state = world.getBlockState(bpos); while (!state.isIn(EndTags.GEN_TERRAIN) && bpos.getY() > 5) { @@ -73,7 +58,7 @@ public class RoundCaveFeature extends DefaultFeature { } top = (int) (bpos.getY() - (radius * 1.3F + 5)); - while (state.isIn(EndTags.GEN_TERRAIN) || state.isOf(Blocks.WATER) && bpos.getY() > 5) { + while (state.isIn(EndTags.GEN_TERRAIN) || !state.getFluidState().isEmpty() && bpos.getY() > 5) { bpos.setY(bpos.getY() - 1); state = world.getBlockState(bpos); } diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java index c132e1da..36686fb3 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java @@ -33,8 +33,28 @@ public class SulphuricCaveFeature extends DefaultFeature { @Override public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { int radius = MHelper.randRange(10, 30, random); - int bottom = BlocksHelper.upRay(world, new BlockPos(pos.getX(), 0, pos.getZ()), 32) + radius + 5; - int top = world.getTopY(Heightmap.Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()) - radius - 5; + + int top = world.getTopY(Heightmap.Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); + Mutable bpos = new Mutable(); + bpos.setX(pos.getX()); + bpos.setZ(pos.getZ()); + bpos.setY(top - 1); + + BlockState state = world.getBlockState(bpos); + while (!state.isIn(EndTags.GEN_TERRAIN) && bpos.getY() > 5) { + bpos.setY(bpos.getY() - 1); + state = world.getBlockState(bpos); + } + if (bpos.getY() < 10) { + return false; + } + top = (int) (bpos.getY() - (radius * 1.3F + 5)); + + while (state.isIn(EndTags.GEN_TERRAIN) || !state.getFluidState().isEmpty() && bpos.getY() > 5) { + bpos.setY(bpos.getY() - 1); + state = world.getBlockState(bpos); + } + int bottom = (int) (bpos.getY() + radius * 1.3F + 5); if (top <= bottom) { return false; @@ -55,7 +75,6 @@ public class SulphuricCaveFeature extends DefaultFeature { double hr = radius * 0.75; double nr = radius * 0.25; - BlockState state; Set brimstone = Sets.newHashSet(); BlockState rock = EndBlocks.SULPHURIC_ROCK.stone.getDefaultState(); int waterLevel = pos.getY() + MHelper.randRange(MHelper.floor(radius * 0.8), radius, random); From f4480bcb39bc9111032be8ca5f9af631098467f0 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 11 Jan 2021 14:01:37 +0300 Subject: [PATCH 129/463] Small fixes --- .../java/ru/betterend/blocks/basis/EndDoorBlock.java | 4 ++-- .../ru/betterend/blocks/basis/EndLeavesBlock.java | 2 ++ .../java/ru/betterend/blocks/basis/EndSignBlock.java | 10 +++++++++- .../ru/betterend/blocks/basis/EndTrapdoorBlock.java | 2 +- .../betterend/blocks/basis/EndWoodenButtonBlock.java | 3 +-- .../betterend/world/generator/TerrainGenerator.java | 12 ++++++------ 6 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/basis/EndDoorBlock.java b/src/main/java/ru/betterend/blocks/basis/EndDoorBlock.java index c8dbe648..797eb73d 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndDoorBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndDoorBlock.java @@ -19,8 +19,8 @@ import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; public class EndDoorBlock extends DoorBlock implements IRenderTypeable, BlockPatterned { - public EndDoorBlock(Block block) { - super(FabricBlockSettings.copy(block).nonOpaque()); + public EndDoorBlock(Block source) { + super(FabricBlockSettings.copyOf(source).strength(3F, 3F).nonOpaque()); } @Override diff --git a/src/main/java/ru/betterend/blocks/basis/EndLeavesBlock.java b/src/main/java/ru/betterend/blocks/basis/EndLeavesBlock.java index 483b877c..37bee30f 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndLeavesBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndLeavesBlock.java @@ -35,6 +35,7 @@ public class EndLeavesBlock extends LeavesBlock implements BlockPatterned, IRend .suffocates((state, world, pos) -> { return false; }) .blockVision((state, world, pos) -> { return false; }) .materialColor(color) + .breakByTool(FabricToolTags.HOES) .breakByTool(FabricToolTags.SHEARS)); this.sapling = sapling; } @@ -46,6 +47,7 @@ public class EndLeavesBlock extends LeavesBlock implements BlockPatterned, IRend .blockVision((state, world, pos) -> { return false; }) .materialColor(color) .luminance(light) + .breakByTool(FabricToolTags.HOES) .breakByTool(FabricToolTags.SHEARS)); this.sapling = sapling; } diff --git a/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java b/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java index f0f9b0f2..1b54a3c3 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java @@ -1,6 +1,8 @@ package ru.betterend.blocks.basis; import java.io.Reader; +import java.util.Collections; +import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.AbstractSignBlock; @@ -15,6 +17,7 @@ import net.minecraft.fluid.Fluids; import net.minecraft.item.DyeItem; import net.minecraft.item.ItemPlacementContext; import net.minecraft.item.ItemStack; +import net.minecraft.loot.context.LootContext; import net.minecraft.network.packet.s2c.play.SignEditorOpenS2CPacket; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.state.StateManager; @@ -53,7 +56,7 @@ public class EndSignBlock extends AbstractSignBlock implements BlockPatterned { private final Block parent; public EndSignBlock(Block source) { - super(FabricBlockSettings.copyOf(source).noCollision().nonOpaque(), SignType.OAK); + super(FabricBlockSettings.copyOf(source).strength(1.0F, 1.0F).noCollision().nonOpaque(), SignType.OAK); this.setDefaultState(this.stateManager.getDefaultState().with(ROTATION, 0).with(FLOOR, true).with(WATERLOGGED, false)); this.parent = source; } @@ -181,4 +184,9 @@ public class EndSignBlock extends AbstractSignBlock implements BlockPatterned { public BlockState mirror(BlockState state, BlockMirror mirror) { return (BlockState) state.with(ROTATION, mirror.mirror((Integer) state.get(ROTATION), 16)); } + + @Override + public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + return Collections.singletonList(new ItemStack(this)); + } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/basis/EndTrapdoorBlock.java b/src/main/java/ru/betterend/blocks/basis/EndTrapdoorBlock.java index 0351e4de..c8dbf0ed 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndTrapdoorBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndTrapdoorBlock.java @@ -20,7 +20,7 @@ import ru.betterend.patterns.Patterns; public class EndTrapdoorBlock extends TrapdoorBlock implements IRenderTypeable, BlockPatterned { public EndTrapdoorBlock(Block source) { - super(FabricBlockSettings.copyOf(source).nonOpaque()); + super(FabricBlockSettings.copyOf(source).strength(3.0F, 3.0F).nonOpaque()); } @Override diff --git a/src/main/java/ru/betterend/blocks/basis/EndWoodenButtonBlock.java b/src/main/java/ru/betterend/blocks/basis/EndWoodenButtonBlock.java index 97369b6c..d81f8dbc 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndWoodenButtonBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndWoodenButtonBlock.java @@ -16,11 +16,10 @@ import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; public class EndWoodenButtonBlock extends WoodenButtonBlock implements BlockPatterned { - private final Block parent; public EndWoodenButtonBlock(Block source) { - super(FabricBlockSettings.copyOf(source).nonOpaque()); + super(FabricBlockSettings.copyOf(source).strength(0.5F, 0.5F).nonOpaque()); this.parent = source; } diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index 741f990c..14e116eb 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -106,9 +106,9 @@ public class TerrainGenerator { dist = dist > 1 ? dist : MHelper.max(dist, mediumIslands.getDensity(px, py, pz)); dist = dist > 1 ? dist : MHelper.max(dist, smallIslands.getDensity(px, py, pz)); if (dist > -0.5F) { - dist += noise1.eval(px * 0.01, py * 0.01, pz * 0.01) * 0.04; - dist += noise2.eval(px * 0.05, py * 0.05, pz * 0.05) * 0.02; - dist += noise1.eval(px * 0.1, py * 0.1, pz * 0.1) * 0.01; + dist += noise1.eval(px * 0.01, py * 0.01, pz * 0.01) * 0.02 + 0.02; + dist += noise2.eval(px * 0.05, py * 0.05, pz * 0.05) * 0.01 + 0.01; + dist += noise1.eval(px * 0.1, py * 0.1, pz * 0.1) * 0.005 + 0.005; } if (dist > 0) { LOCKER.unlock(); @@ -148,9 +148,9 @@ public class TerrainGenerator { dist = dist > 1 ? dist : MHelper.max(dist, mediumIslands.getDensity(px, py, pz)); dist = dist > 1 ? dist : MHelper.max(dist, smallIslands.getDensity(px, py, pz)); if (dist > -0.5F) { - dist += noise1.eval(px * 0.01, py * 0.01, pz * 0.01) * 0.04; - dist += noise2.eval(px * 0.05, py * 0.05, pz * 0.05) * 0.02; - dist += noise1.eval(px * 0.1, py * 0.1, pz * 0.1) * 0.01; + dist += noise1.eval(px * 0.01, py * 0.01, pz * 0.01) * 0.02 + 0.02; + dist += noise2.eval(px * 0.05, py * 0.05, pz * 0.05) * 0.01 + 0.01; + dist += noise1.eval(px * 0.1, py * 0.1, pz * 0.1) * 0.005 + 0.005; } if (dist > 0) { LOCKER.unlock(); From 6e71d8785e6137fe9117fa28e0a6dccc6b8bc300 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 11 Jan 2021 17:10:52 +0300 Subject: [PATCH 130/463] Lake fixes --- .../world/generator/TerrainGenerator.java | 2 +- .../features/StructureMegaLake.java | 2 +- .../world/structures/piece/LakePiece.java | 111 +++++++++--------- 3 files changed, 58 insertions(+), 57 deletions(-) diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index 14e116eb..2623bd2b 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -110,7 +110,7 @@ public class TerrainGenerator { dist += noise2.eval(px * 0.05, py * 0.05, pz * 0.05) * 0.01 + 0.01; dist += noise1.eval(px * 0.1, py * 0.1, pz * 0.1) * 0.005 + 0.005; } - if (dist > 0) { + if (dist > -0.01) { LOCKER.unlock(); return true; } diff --git a/src/main/java/ru/betterend/world/structures/features/StructureMegaLake.java b/src/main/java/ru/betterend/world/structures/features/StructureMegaLake.java index fe52b804..7c2d7fab 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructureMegaLake.java +++ b/src/main/java/ru/betterend/world/structures/features/StructureMegaLake.java @@ -32,7 +32,7 @@ public class StructureMegaLake extends StructureFeatureBase { if (y > 5) { float radius = MHelper.randRange(50, 100, random); float depth = MHelper.randRange(10, 16, random); - LakePiece piece = new LakePiece(new BlockPos(x, y, z), radius, depth, random, biome); + LakePiece piece = new LakePiece(new BlockPos(x, y - 3, z), radius, depth, random, biome); this.children.add(piece); } this.setBoundingBoxFromChildren(); diff --git a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java index 99bc37df..164764ac 100644 --- a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java @@ -106,69 +106,66 @@ public class LakePiece extends BasePiece { pos.setZ(z); dist = 1 - dist / r2; int maxY = map.get(x, z); - if (maxY > 55) { + if (MathHelper.abs(maxY - center.getY()) < 8) { float minY = dist * depth * getHeightClamp(world, 8, px, pz); if (minY > 0) { minY *= (float) noise1.eval(px * 0.05, pz * 0.05) * 0.3F + 0.7F; minY *= (float) noise1.eval(px * 0.1, pz * 0.1) * 0.1F + 0.8F; - float lerp = minY / 2F; + float lerp = minY / 4F; if (lerp > 1) { lerp = 1; } - minY = MathHelper.lerp(lerp, maxY - minY, 56 - minY); + minY = MathHelper.lerp(lerp, maxY - minY, center.getY() - minY); pos.setY(maxY); while (!chunk.getBlockState(pos).getMaterial().isReplaceable()) { pos.setY(maxY ++); } - for (int y = maxY; y >= minY; y--) { - pos.setY(y); - BlockState state = chunk.getBlockState(pos); - if (state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN)) { - chunk.setBlockState(pos, y > 56 ? AIR : WATER, false); - } - else { - break; - } - } - maxY = MHelper.randRange(2, 3, random); - int last = maxY - 1; - for (int i = 0; i < maxY; i++) { - pos.setY(pos.getY() - 1); - BlockState state = chunk.getBlockState(pos); - if (state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN)) { - if (pos.getY() > 56) { - chunk.setBlockState(pos, AIR, false); - if (pos.getY() == last) { - state = world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getTopMaterial(); - chunk.setBlockState(pos.down(), state, false); - } - } - else if (pos.getY() == 56) { - if (random.nextBoolean()) { - state = EndBlocks.ENDSTONE_DUST.getDefaultState(); - } - else { - state = world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getTopMaterial(); - } - chunk.setBlockState(pos, state, false); - - state = world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getUnderMaterial(); - int count = (int) (noise1.eval((pos.getX() + sx) * 0.1, (pos.getZ() + sz) * 0.1) + 2);//MHelper.randRange(1, 2, random); - for (int n = 0; n < count; n++) { - pos.setY(pos.getY() - 1); - chunk.setBlockState(pos, state, false); - } - break; + + if (maxY <= center.getY() + 1) { + maxY = MathHelper.clamp(maxY + 4, 0, center.getY()); + BlockState surf = random.nextBoolean() ? EndBlocks.ENDSTONE_DUST.getDefaultState() : world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getTopMaterial(); + BlockState under = world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getUnderMaterial(); + for (int y = maxY; y >= minY; y--) { + pos.setY(y); + BlockState state = chunk.getBlockState(pos); + if (state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN)) { + chunk.setBlockState(pos, y > center.getY() ? AIR : y == maxY ? surf : under, false); + } + else { + break; + } + } + } + else { + for (int y = maxY; y >= minY; y--) { + pos.setY(y); + BlockState state = chunk.getBlockState(pos); + if (state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN)) { + if (maxY <= center.getY() + 1) + chunk.setBlockState(pos, Blocks.REDSTONE_BLOCK.getDefaultState(), false); + else + chunk.setBlockState(pos, y > center.getY() ? AIR : WATER, false); + } + else { + break; + } + } + } + + boolean under = pos.getY() <= center.getY() || (pos.getY() == center.getY() + 1 && random.nextBoolean()); + pos.setY(pos.getY() - 1); + BlockState state = chunk.getBlockState(pos); + if (state.isIn(EndTags.GEN_TERRAIN) || (state.getMaterial().isReplaceable() && pos.getY() <= center.getY())) { + state = under ? EndBlocks.ENDSTONE_DUST.getDefaultState() : world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getTopMaterial(); + chunk.setBlockState(pos, state, false); + maxY = (int) (noise1.eval((pos.getX() + sx) * 0.1, (pos.getZ() + sz) * 0.1) + 2); + state = world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getUnderMaterial(); + for (int i = 0; i < maxY; i++) { + pos.setY(pos.getY() - 1); + if (state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN)) { + chunk.setBlockState(pos, state, false); } else { - chunk.setBlockState(pos, EndBlocks.ENDSTONE_DUST.getDefaultState(), false); - - state = world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getUnderMaterial(); - int count = (int) (noise1.eval((pos.getX() + sx) * 0.1, (pos.getZ() + sz) * 0.1) + 2);//int count = MHelper.randRange(1, 2, random); - for (int n = 0; n < count; n++) { - pos.setY(pos.getY() - 1); - chunk.setBlockState(pos, state, false); - } break; } } @@ -192,14 +189,18 @@ public class LakePiece extends BasePiece { } if (!EndBiomes.getBiomeID(world.getBiome(pos)).equals(biomeID)) { - heightmap.put(p, -20); - return -20; + heightmap.put(p, -4); + return -4; } h = world.getTopY(Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); - if (h < 57 || h > 64) { - heightmap.put(p, -20); - return -20; + + h = MathHelper.abs(h - center.getY()); + if (h > 4) { + h = 4 - h; + heightmap.put(p, h); + return h; } + h = MHelper.floor(noise2.eval(pos.getX() * 0.01, pos.getZ() * 0.01) * noise2.eval(pos.getX() * 0.002, pos.getZ() * 0.002) * 8 + 8); if (h < 0) { From b6ff732941056aefe5b141f34337687fa8798586 Mon Sep 17 00:00:00 2001 From: Godzmoline <59003232+linzexin022@users.noreply.github.com> Date: Mon, 11 Jan 2021 22:17:19 +0800 Subject: [PATCH 131/463] Update zh_cn.json --- .../assets/betterend/lang/zh_cn.json | 521 +++++++++++++----- 1 file changed, 385 insertions(+), 136 deletions(-) diff --git a/src/main/resources/assets/betterend/lang/zh_cn.json b/src/main/resources/assets/betterend/lang/zh_cn.json index c4f30199..06ab61ed 100644 --- a/src/main/resources/assets/betterend/lang/zh_cn.json +++ b/src/main/resources/assets/betterend/lang/zh_cn.json @@ -1,13 +1,18 @@ { - "itemGroup.betterend.items": "更好的末地 (BetterEnd)", - - "category.rei.damage.amount&dmg": "工具伤害:%s", - "category.rei.infusion.time&val": "灌注时间: %s", + "itemGroup.betterend.end_items": "更好的末地:物品", + "itemGroup.betterend.end_blocks": "更好的末地:方块", + + "item.betterend.guidebook": "给新人看的末地指南", + "book.betterend.landing": "一本极端条件下在末地生存的指南", + "book.betterend.subtitle": "在末地生存", + + "category.rei.damage.amount&dmg": "工具伤害: %s", + "category.rei.infusion.time&val": "灌注时间: %s", "biome.betterend.foggy_mushroomland": "雾霭蘑菇岛", "biome.betterend.dust_wastelands": "尘土飞扬的荒地", - "biome.betterend.chorus_forest": "咏唱森林", - "biome.betterend.megalake": "巨泊", + "biome.betterend.chorus_forest": "紫颂森林", + "biome.betterend.megalake": "巨型湖泊", "biome.betterend.crystal_mountains": "水晶山脉", "entity.betterend.dragonfly": "蜻蜓", @@ -18,7 +23,7 @@ "block.betterend.end_mycelium": "末地菌丝", "block.betterend.end_moss": "末地苔藓", - "block.betterend.endstone_dust": "末地石粉", + "block.betterend.endstone_dust": "末地尘埃", "block.betterend.end_mycelium_path": "末地菌丝径", "block.betterend.end_moss_path": "末地苔藓径", @@ -30,6 +35,7 @@ "block.betterend.end_stone_smelter": "末地石冶炼炉", "item.betterend.ender_dust": "末影粉", + "item.betterend.ender_shard": "末影碎片", "item.betterend.terminite_ingot": "终界铁锭", "item.betterend.aeternium_ingot": "太古合金锭", "item.betterend.terminite_helmet": "终界铁头盔", @@ -41,7 +47,7 @@ "item.betterend.terminite_pickaxe": "终界铁镐", "item.betterend.terminite_axe": "终界铁斧", "item.betterend.terminite_hoe": "终界铁锄", - "item.betterend.terminite_hammer": "终界铁匠锤", + "item.betterend.terminite_hammer": "终界铁锻锤", "item.betterend.aeternium_helmet": "太古合金头盔", "item.betterend.aeternium_chestplate": "太古合金胸甲", "item.betterend.aeternium_leggings": "太古合金护腿", @@ -51,24 +57,28 @@ "item.betterend.aeternium_pickaxe": "太古合金镐", "item.betterend.aeternium_axe": "太古合金斧", "item.betterend.aeternium_hoe": "太古合金锄", - "item.betterend.aeternium_hammer": "太古合金匠锤", - "item.betterend.iron_hammer": "铁匠锤", - "item.betterend.golden_hammer": "金匠锤", - "item.betterend.diamond_hammer": "钻石匠锤", - "item.betterend.netherite_hammer": "下界合金匠锤", + "item.betterend.aeternium_hammer": "太古合金锻锤", + "item.betterend.iron_hammer": "铁锻锤", + "item.betterend.golden_hammer": "金锻锤", + "item.betterend.diamond_hammer": "钻石锻锤", + "item.betterend.netherite_hammer": "下界合金锻锤", + "item.betterend.crystalite_boots": "融晶合金靴子", + "item.betterend.crystalite_chestplate": "融晶合金胸甲", + "item.betterend.crystalite_helmet": "融晶合金头盔", + "item.betterend.crystalite_leggings": "融晶合金护腿", - "effect.betterend.end_veil": "末地面具", - "enchantment.betterend.end_veil": "末地面具", - "item.minecraft.potion.effect.end_veil": "末地面具药水", - "item.minecraft.potion.effect.long_end_veil": "末地面具药水", - "item.minecraft.splash_potion.effect.end_veil": "喷溅型末地面具药水", - "item.minecraft.splash_potion.effect.long_end_veil": "喷溅型末地面具药水", - "item.minecraft.lingering_potion.effect.end_veil": "滞留型末地面具药水", - "item.minecraft.lingering_potion.effect.long_end_veil": "滞留型末地面具药水", - "item.minecraft.tipped_arrow.effect.end_veil": "末地面具之箭", - "item.minecraft.tipped_arrow.effect.long_end_veil": "末地面具之箭", + "effect.betterend.end_veil": "末地面纱", + "enchantment.betterend.end_veil": "末地面纱", + "item.minecraft.potion.effect.end_veil": "末地面纱药水", + "item.minecraft.potion.effect.long_end_veil": "末地面纱药水", + "item.minecraft.splash_potion.effect.end_veil": "喷溅型末地面纱药水", + "item.minecraft.splash_potion.effect.long_end_veil": "喷溅型末地面纱药水", + "item.minecraft.lingering_potion.effect.end_veil": "滞留型末地面纱药水", + "item.minecraft.lingering_potion.effect.long_end_veil": "滞留型末地面纱药水", + "item.minecraft.tipped_arrow.effect.end_veil": "末地面纱之箭", + "item.minecraft.tipped_arrow.effect.long_end_veil": "末地面纱之箭", - "block.betterend.mossy_glowshroom_sapling": "苔光菇种子", + "block.betterend.mossy_glowshroom_sapling": "苔光菇幼苗", "block.betterend.mossy_glowshroom_cap": "苔光菇菌盖", "block.betterend.mossy_glowshroom_fur": "苔光菇菌绒", "block.betterend.mossy_glowshroom_hymenophore": "苔光菇菌褶", @@ -84,7 +94,7 @@ "block.betterend.mossy_glowshroom_log": "苔光菇原木", "block.betterend.mossy_glowshroom_planks": "苔光菇木板", "block.betterend.mossy_glowshroom_plate": "苔光菇压力板", - "block.betterend.mossy_glowshroom_sign": "苔光菇告示牌", + "block.betterend.mossy_glowshroom_sign": "苔光菇木告示牌", "block.betterend.mossy_glowshroom_slab": "苔光菇台阶", "block.betterend.mossy_glowshroom_stairs": "苔光菇楼梯", "block.betterend.mossy_glowshroom_stripped_bark": "去皮苔光菇菌木", @@ -97,37 +107,37 @@ "block.betterend.blue_vine_seed": "蓝藤种子", "block.betterend.blue_vine": "蓝藤", - "block.betterend.blue_vine_lantern": "蓝藤灯", - "block.betterend.blue_vine_fur": "蓝藤菌毛", + "block.betterend.blue_vine_lantern": "蓝藤菌光体", + "block.betterend.blue_vine_fur": "蓝藤菌绒", "block.betterend.dense_vine": "茂密藤蔓", - "block.betterend.bubble_coral": "气泡珊瑚", + "block.betterend.bubble_coral": "冒泡珊瑚", "block.betterend.aurora_crystal": "极光水晶", "item.betterend.crystal_shards": "水晶碎片", - "block.betterend.pythadendron_sapling": "咏唱木树苗", - "block.betterend.pythadendron_bark": "咏唱木树皮", - "block.betterend.pythadendron_barrel": "咏唱木桶", - "block.betterend.pythadendron_button": "咏唱木按钮", - "block.betterend.pythadendron_chest": "咏唱木箱", - "block.betterend.pythadendron_crafting_table": "咏唱木工作台", - "block.betterend.pythadendron_door": "咏唱木门", - "block.betterend.pythadendron_fence": "咏唱木栅栏", - "block.betterend.pythadendron_gate": "咏唱木栅栏门", - "block.betterend.pythadendron_ladder": "咏唱木梯", - "block.betterend.pythadendron_log": "咏唱木原木", - "block.betterend.pythadendron_planks": "咏唱木板", - "block.betterend.pythadendron_plate": "咏唱木压力板", - "block.betterend.pythadendron_sign": "咏唱木告示牌", - "block.betterend.pythadendron_slab": "咏唱木台阶", - "block.betterend.pythadendron_stairs": "咏唱木楼梯", - "block.betterend.pythadendron_stripped_bark": "去皮咏唱木树皮", - "block.betterend.pythadendron_stripped_log": "去皮咏唱木原木", - "block.betterend.pythadendron_trapdoor": "咏唱木活板门", + "block.betterend.pythadendron_sapling": "毕达树苗", + "block.betterend.pythadendron_bark": "毕达木", + "block.betterend.pythadendron_barrel": "毕达木桶", + "block.betterend.pythadendron_button": "毕达木按钮", + "block.betterend.pythadendron_chest": "毕达木箱", + "block.betterend.pythadendron_crafting_table": "毕达木工作台", + "block.betterend.pythadendron_door": "毕达木门", + "block.betterend.pythadendron_fence": "毕达木栅栏", + "block.betterend.pythadendron_gate": "毕达木栅栏门", + "block.betterend.pythadendron_ladder": "毕达木梯", + "block.betterend.pythadendron_log": "毕达木原木", + "block.betterend.pythadendron_planks": "毕达木板", + "block.betterend.pythadendron_plate": "毕达木压力板", + "block.betterend.pythadendron_sign": "毕达木告示牌", + "block.betterend.pythadendron_slab": "毕达木台阶", + "block.betterend.pythadendron_stairs": "毕达木楼梯", + "block.betterend.pythadendron_stripped_bark": "去皮毕达木", + "block.betterend.pythadendron_stripped_log": "去皮毕达木原木", + "block.betterend.pythadendron_trapdoor": "毕达木活板门", - "block.betterend.chorus_nylium": "咏唱菌岩", - "block.betterend.chorus_nylium_path": "咏唱菌岩径", - "block.betterend.chorus_grass": "咏唱菌草", + "block.betterend.chorus_nylium": "紫颂菌岩", + "block.betterend.chorus_nylium_path": "紫颂菌岩径", + "block.betterend.chorus_grass": "紫颂草", "block.betterend.end_lily": "末地睡莲", "block.betterend.end_lily_seed": "末地睡莲种子", @@ -149,20 +159,20 @@ "block.betterend.violecite_wall": "紫罗兰石墙", "block.betterend.violecite_pedestal": "紫罗兰石基座", - "block.betterend.flavolite": "香料石", - "block.betterend.flavolite_bricks": "香料石砖", - "block.betterend.flavolite_bricks_slab": "香料石砖台阶", - "block.betterend.flavolite_bricks_stairs": "香料石砖楼梯", - "block.betterend.flavolite_bricks_wall": "香料石砖墙", - "block.betterend.flavolite_button": "香料石按钮", - "block.betterend.flavolite_pillar": "香料石柱", - "block.betterend.flavolite_plate": "香料石压力板", - "block.betterend.flavolite_slab": "香料石台阶", - "block.betterend.flavolite_tiles": "香料石瓷砖", - "block.betterend.flavolite_stairs": "香料石楼梯", - "block.betterend.flavolite_polished": "磨制香料石", - "block.betterend.flavolite_wall": "香料石墙", - "block.betterend.flavolite_pedestal": "香料石基座", + "block.betterend.flavolite": "苍黄石", + "block.betterend.flavolite_bricks": "苍黄石砖", + "block.betterend.flavolite_bricks_slab": "苍黄石砖台阶", + "block.betterend.flavolite_bricks_stairs": "苍黄石砖楼梯", + "block.betterend.flavolite_bricks_wall": "苍黄石砖墙", + "block.betterend.flavolite_button": "苍黄石按钮", + "block.betterend.flavolite_pillar": "苍黄石柱", + "block.betterend.flavolite_plate": "苍黄石压力板", + "block.betterend.flavolite_slab": "苍黄石台阶", + "block.betterend.flavolite_tiles": "苍黄石瓷砖", + "block.betterend.flavolite_stairs": "苍黄石楼梯", + "block.betterend.flavolite_polished": "磨制苍黄石", + "block.betterend.flavolite_wall": "苍黄石墙", + "block.betterend.flavolite_pedestal": "苍黄石基座", "block.betterend.andesite_pedestal": "安山岩基座", "block.betterend.diorite_pedestal": "闪长岩基座", @@ -173,122 +183,120 @@ "block.betterend.end_lotus_seed": "末地莲种子", "block.betterend.end_lotus_stem": "末地莲茎", - "block.betterend.end_lotus_leaf": "末地莲叶", + "block.betterend.end_lotus_leaf": "末地莲树", "block.betterend.end_lotus_flower": "末地莲花", - "block.betterend.end_lotus_bark": "末地莲树皮", + "block.betterend.end_lotus_bark": "末地莲木", "block.betterend.end_lotus_barrel": "末地莲木桶", "block.betterend.end_lotus_button": "末地莲按钮", - "block.betterend.end_lotus_chest": "末地莲箱", + "block.betterend.end_lotus_chest": "末地莲木箱", "block.betterend.end_lotus_crafting_table": "末地莲工作台", - "block.betterend.end_lotus_door": "末地莲门", - "block.betterend.end_lotus_fence": "末地莲栅栏", - "block.betterend.end_lotus_gate": "末地莲栅栏门", - "block.betterend.end_lotus_ladder": "末地莲梯", + "block.betterend.end_lotus_door": "末地莲木门", + "block.betterend.end_lotus_fence": "末地莲木栅栏", + "block.betterend.end_lotus_gate": "末地莲木栅栏门", + "block.betterend.end_lotus_ladder": "末地莲木梯", "block.betterend.end_lotus_log": "末地莲原木", "block.betterend.end_lotus_planks": "末地莲木板", "block.betterend.end_lotus_plate": "末地莲压力板", - "block.betterend.end_lotus_sign": "末地莲告示牌", + "block.betterend.end_lotus_sign": "末地莲木告示牌", "block.betterend.end_lotus_slab": "末地莲台阶", "block.betterend.end_lotus_stairs": "末地莲楼梯", - "block.betterend.end_lotus_stripped_bark": "去皮末地莲树皮", + "block.betterend.end_lotus_stripped_bark": "去皮末地莲木", "block.betterend.end_lotus_stripped_log": "去皮末地莲原木", "block.betterend.end_lotus_trapdoor": "末地莲活板门", "block.betterend.cave_moss": "洞穴苔藓", - "block.betterend.cave_grass": "洞穴草丛", + "block.betterend.cave_grass": "洞穴草", "block.betterend.cave_bush": "洞穴灌木", "block.betterend.cave_moss_path": "洞穴苔藓径", "block.betterend.crystal_moss": "水晶苔藓", "block.betterend.crystal_moss_path": "水晶苔藓径", - "block.betterend.pythadendron_leaves": "咏唱木树叶", + "block.betterend.pythadendron_leaves": "毕达树叶", "item.betterend.spawn_egg_end_fish": "末地鱼刷怪蛋", - "block.betterend.crystal_grass": "水晶草丛", + "block.betterend.crystal_grass": "水晶草", - "block.betterend.flavolite_runed": "符文香料石", + "block.betterend.flavolite_runed": "符文苍黄石", "block.betterend.end_portal_block": "末地传送门", "block.betterend.eternal_pedestal": "永恒基座", - "block.betterend.flavolite_runed_eternal": "永恒符文香料石", + "block.betterend.flavolite_runed_eternal": "永恒符文苍黄石", "item.betterend.eternal_crystal": "永恒水晶", - "block.betterend.lacugrove_bark": "林泊木树皮", - "block.betterend.lacugrove_barrel": "林泊木桶", - "block.betterend.lacugrove_button": "林泊木按钮", - "block.betterend.lacugrove_chest": "林泊木箱", - "block.betterend.lacugrove_crafting_table": "林泊木工作台", - "block.betterend.lacugrove_door": "林泊木门", - "block.betterend.lacugrove_fence": "林泊木栅栏", - "block.betterend.lacugrove_gate": "林泊木栅栏门", - "block.betterend.lacugrove_ladder": "林泊木梯", - "block.betterend.lacugrove_log": "林泊木原木", - "block.betterend.lacugrove_planks": "林泊木木板", - "block.betterend.lacugrove_plate": "林泊木压力板", - "block.betterend.lacugrove_sign": "林泊木告示牌", - "block.betterend.lacugrove_slab": "林泊木台阶", - "block.betterend.lacugrove_stairs": "林泊木楼梯", - "block.betterend.lacugrove_stripped_bark": "去皮林泊木树皮", - "block.betterend.lacugrove_stripped_log": "去皮林泊木原木", - "block.betterend.lacugrove_trapdoor": "林泊木活板门", + "block.betterend.lacugrove_bark": "泊树林树皮", + "block.betterend.lacugrove_barrel": "泊树林木桶", + "block.betterend.lacugrove_button": "泊树林按钮", + "block.betterend.lacugrove_chest": "泊树林木箱", + "block.betterend.lacugrove_crafting_table": "泊树林工作台", + "block.betterend.lacugrove_door": "泊树林木门", + "block.betterend.lacugrove_fence": "泊树林木栅栏", + "block.betterend.lacugrove_gate": "泊树林木栅栏门", + "block.betterend.lacugrove_ladder": "泊树林木梯", + "block.betterend.lacugrove_log": "泊树林原木", + "block.betterend.lacugrove_planks": "泊树林木板", + "block.betterend.lacugrove_plate": "泊树林压力板", + "block.betterend.lacugrove_sign": "泊树林木告示牌", + "block.betterend.lacugrove_slab": "泊树林台阶", + "block.betterend.lacugrove_stairs": "泊树林楼梯", + "block.betterend.lacugrove_stripped_bark": "去皮泊树林树皮", + "block.betterend.lacugrove_stripped_log": "去皮泊树林原木", + "block.betterend.lacugrove_trapdoor": "泊树林活板门", - "block.betterend.lacugrove_leaves": "林泊木树叶", - "block.betterend.lacugrove_sapling": "林泊木树苗", + "block.betterend.lacugrove_leaves": "泊树林树叶", + "block.betterend.lacugrove_sapling": "泊树林树苗", - "biome.betterend.megalake_grove": "巨泊树林", - "biome.betterend.painted_mountains": "点缀过的山地", + "biome.betterend.megalake_grove": "巨型湖泊树林", + "biome.betterend.painted_mountains": "彩绘山脉", - "block.betterend.dragon_tree_bark": "龙鳞木树皮", - "block.betterend.dragon_tree_barrel": "龙鳞木桶", - "block.betterend.dragon_tree_button": "龙鳞木按钮", - "block.betterend.dragon_tree_chest": "龙鳞木箱", - "block.betterend.dragon_tree_crafting_table": "龙鳞木工作台", - "block.betterend.dragon_tree_door": "龙鳞木门", - "block.betterend.dragon_tree_fence": "龙鳞木栅栏", - "block.betterend.dragon_tree_gate": "龙鳞木栅栏门", - "block.betterend.dragon_tree_ladder": "龙鳞木梯", - "block.betterend.dragon_tree_log": "龙鳞木原木", - "block.betterend.dragon_tree_planks": "龙鳞木木板", - "block.betterend.dragon_tree_plate": "龙鳞木压力板", - "block.betterend.dragon_tree_sign": "龙鳞木告示牌", - "block.betterend.dragon_tree_slab": "龙鳞木台阶", - "block.betterend.dragon_tree_stairs": "龙鳞木楼梯", - "block.betterend.dragon_tree_stripped_bark": "去皮龙鳞木树皮", - "block.betterend.dragon_tree_stripped_log": "去皮龙鳞木原木", - "block.betterend.dragon_tree_trapdoor": "龙鳞木活板门", + "block.betterend.dragon_tree_bark": "龙鳞树树皮", + "block.betterend.dragon_tree_barrel": "龙鳞树木桶", + "block.betterend.dragon_tree_button": "龙鳞树按钮", + "block.betterend.dragon_tree_chest": "龙鳞树木箱", + "block.betterend.dragon_tree_crafting_table": "龙鳞树工作台", + "block.betterend.dragon_tree_door": "龙鳞树木门", + "block.betterend.dragon_tree_fence": "龙鳞树木栅栏", + "block.betterend.dragon_tree_gate": "龙鳞树木栅栏门", + "block.betterend.dragon_tree_ladder": "龙鳞树木梯", + "block.betterend.dragon_tree_log": "龙鳞树原木", + "block.betterend.dragon_tree_planks": "龙鳞树木板", + "block.betterend.dragon_tree_plate": "龙鳞树压力板", + "block.betterend.dragon_tree_sign": "龙鳞树木告示牌", + "block.betterend.dragon_tree_slab": "龙鳞树台阶", + "block.betterend.dragon_tree_stairs": "龙鳞树楼梯", + "block.betterend.dragon_tree_stripped_bark": "去皮龙鳞树树皮", + "block.betterend.dragon_tree_stripped_log": "去皮龙鳞树原木", + "block.betterend.dragon_tree_trapdoor": "龙鳞树活板门", "biome.betterend.shadow_forest": "黯影森林", - "block.betterend.dragon_tree_leaves": "龙鳞木树叶", - "block.betterend.dragon_tree_sapling": "龙鳞木树苗", - "block.betterend.shadow_grass": "黯影草地", + "block.betterend.dragon_tree_leaves": "龙鳞树树叶", + "block.betterend.dragon_tree_sapling": "龙鳞树树苗", + "block.betterend.shadow_grass": "黯影草", "block.betterend.shadow_grass_path": "黯影草径", - "block.betterend.shadow_plant": "黯影植物", + "block.betterend.shadow_plant": "黯影Plant", - "block.betterend.dragon_tree_bookshelf": "龙鳞木书架", + "block.betterend.dragon_tree_bookshelf": "龙鳞树书架", "block.betterend.end_lotus_bookshelf": "末地莲书架", - "block.betterend.lacugrove_bookshelf": "林泊木书架", - "block.betterend.mossy_glowshroom_bookshelf": "苔光菇书架", - "block.betterend.pythadendron_bookshelf": "咏唱木书架", + "block.betterend.lacugrove_bookshelf": "泊树林书架", + "block.betterend.mossy_glowshroom_bookshelf": "苔光菇木书架", + "block.betterend.pythadendron_bookshelf": "毕达木书架", "block.betterend.murkweed": "黝黯草", - "block.betterend.needlegrass": "针芒草", - "block.betterend.twisted_vine": "扭曲藤", + "block.betterend.needlegrass": "针茅草", + "block.betterend.twisted_vine": "蜷曲藤", "block.betterend.shadow_berry": "黯影浆果种子", "item.betterend.shadow_berry_cooked": "熟黯影浆果", - "item.betterend.shadow_berry_raw": "黯影浆果", + "item.betterend.shadow_berry_raw": "生黯影浆果", "block.betterend.purple_polypore": "紫色多孔菌", "block.betterend.cyan_moss": "青色苔藓", - "block.betterend.tail_moss": "尾状苔藓", + "block.betterend.tail_moss": "鼠尾苔藓", - "block.betterend.flavolite_lantern": "香料石灯笼", + "block.betterend.flavolite_lantern": "苍黄石灯笼", "block.betterend.end_stone_lantern": "末地石灯笼", "block.betterend.violecite_lantern": "紫罗兰石灯笼", - "biome.betterend.dragonfly": "蜻蜓", - "biome.betterend.end_fish": "末地鱼", - "biome.betterend.end_slime": "末地史莱姆", - "biome.betterend.shadow_walker": "黯影行者", + "entity.betterend.end_fish": "末地鱼", + "entity.betterend.shadow_walker": "黯影行者", "item.betterend.spawn_egg_shadow_walker": "黯影行者刷怪蛋", "block.betterend.andesite_lantern": "安山岩灯笼", @@ -300,5 +308,246 @@ "item.betterend.bucket_end_fish": "末地鱼桶", "item.betterend.end_fish_cooked": "熟末地鱼", - "item.betterend.end_fish_raw": "末地鱼" + "item.betterend.end_fish_raw": "生末地鱼", + + "biome.betterend.amber_land": "琥珀岛", + "biome.betterend.blossoming_spires": "花开尖塔", + "block.betterend.amber_grass": "琥珀草", + "block.betterend.amber_grass_path": "琥珀草径", + "block.betterend.tenanea_bark": "十纹树皮", + "block.betterend.tenanea_barrel": "十纹树木桶", + "block.betterend.tenanea_bookshelf": "十纹树书架", + "block.betterend.tenanea_button": "十纹树按钮", + "block.betterend.tenanea_chest": "十纹木箱", + "block.betterend.tenanea_crafting_table": "十纹工作台", + "block.betterend.tenanea_door": "十纹树木门", + "block.betterend.tenanea_fence": "十纹树木栅栏", + "block.betterend.tenanea_gate": "十纹树木栅栏门", + "block.betterend.tenanea_ladder": "十纹树木梯", + "block.betterend.tenanea_leaves": "十纹树树叶", + "block.betterend.tenanea_log": "十纹树原木", + "block.betterend.tenanea_planks": "十纹树木板", + "block.betterend.tenanea_plate": "十纹树压力板", + "block.betterend.tenanea_sapling": "十纹树树苗", + "block.betterend.tenanea_sign": "十纹树木告示牌", + "block.betterend.tenanea_slab": "十纹树台阶", + "block.betterend.tenanea_stairs": "十纹树楼梯", + "block.betterend.tenanea_stripped_bark": "去皮十纹树皮", + "block.betterend.tenanea_stripped_log": "去皮十纹树原木", + "block.betterend.tenanea_trapdoor": "十纹树活板门", + + "block.betterend.amber_block": "琥珀块", + "block.betterend.amber_ore": "琥珀矿石", + "item.betterend.amber_gem": "琥珀", + "item.betterend.raw_amber": "生琥珀", + "block.betterend.tenanea_flowers": "十纹花藤", + "block.betterend.tenanea_outer_leaves": "十纹树叶(外层)", + + "block.betterend.pink_moss": "粉色苔藓", + "block.betterend.pink_moss_path": "粉色苔藓径", + + "block.betterend.twisted_moss": "蜷曲苔藓", + + "block.betterend.bulb_vine": "灯泡藤", + "block.betterend.bulb_lantern": "灯泡灯笼", + "block.betterend.bulb_vine_seed": "灯泡藤种子", + "item.betterend.glowing_bulb": "发光灯泡0果", + + "block.betterend.bulb_lantern_black": "黑色灯泡灯笼", + "block.betterend.bulb_lantern_blue": "蓝色灯泡灯笼", + "block.betterend.bulb_lantern_brown": "棕色灯泡灯笼", + "block.betterend.bulb_lantern_cyan": "青色灯泡灯笼", + "block.betterend.bulb_lantern_gray": "灰色灯泡灯笼", + "block.betterend.bulb_lantern_green": "绿色灯泡灯笼", + "block.betterend.bulb_lantern_light_blue": "淡蓝色灯泡灯笼", + "block.betterend.bulb_lantern_light_gray": "淡灰色灯泡灯笼", + "block.betterend.bulb_lantern_lime": "黄绿色灯泡灯笼", + "block.betterend.bulb_lantern_magenta": "品红色灯泡灯笼", + "block.betterend.bulb_lantern_orange": "橙色灯泡灯笼", + "block.betterend.bulb_lantern_pink": "粉色灯泡灯笼", + "block.betterend.bulb_lantern_purple": "紫色灯泡灯笼", + "block.betterend.bulb_lantern_red": "红色灯泡灯笼", + "block.betterend.bulb_lantern_white": "白色灯泡灯笼", + "block.betterend.bulb_lantern_yellow": "黄色灯泡灯笼", + + "block.betterend.bushy_grass": "丛藓", + + "block.betterend.brimstone": "硫磺石", + "block.betterend.sulphuric_rock": "硫磺岩", + "block.betterend.sulphuric_rock_bricks": "硫磺岩砖", + "block.betterend.sulphuric_rock_bricks_slab": "硫磺岩砖台阶", + "block.betterend.sulphuric_rock_bricks_stairs": "硫磺岩砖楼梯", + "block.betterend.sulphuric_rock_bricks_wall": "硫磺岩砖墙", + "block.betterend.sulphuric_rock_button": "硫磺岩按钮", + "block.betterend.sulphuric_rock_lantern": "硫磺岩灯笼", + "block.betterend.sulphuric_rock_pedestal": "硫磺岩基座", + "block.betterend.sulphuric_rock_pillar": "硫磺岩柱", + "block.betterend.sulphuric_rock_plate": "硫磺岩压力板", + "block.betterend.sulphuric_rock_polished": "磨制硫磺岩", + "block.betterend.sulphuric_rock_slab": "硫磺岩台阶", + "block.betterend.sulphuric_rock_stairs": "硫磺岩楼梯", + "block.betterend.sulphuric_rock_tiles": "硫磺岩瓷砖", + "block.betterend.sulphuric_rock_wall": "硫磺岩墙", + "block.betterend.sulphur_crystal": "硫磺结晶", + "item.betterend.crystalline_sulphur": "硫磺", + + "biome.betterend.sulphur_springs": "硫磺矿泉", + "block.betterend.hydralux_petal_block": "水生勒克斯花瓣块", + "block.betterend.hydralux_petal_block_black": "黑色花瓣块", + "block.betterend.hydralux_petal_block_blue": "蓝色花瓣块", + "block.betterend.hydralux_petal_block_brown": "棕色花瓣块", + "block.betterend.hydralux_petal_block_cyan": "青色花瓣块", + "block.betterend.hydralux_petal_block_gray": "灰色花瓣块", + "block.betterend.hydralux_petal_block_green": "绿色花瓣块", + "block.betterend.hydralux_petal_block_light_blue": "淡蓝色花瓣块", + "block.betterend.hydralux_petal_block_light_gray": "淡灰色花瓣块", + "block.betterend.hydralux_petal_block_lime": "黄绿色花瓣块", + "block.betterend.hydralux_petal_block_magenta": "品红色花瓣块", + "block.betterend.hydralux_petal_block_orange": "橙色花瓣块", + "block.betterend.hydralux_petal_block_pink": "粉色花瓣块", + "block.betterend.hydralux_petal_block_purple": "紫色花瓣块", + "block.betterend.hydralux_petal_block_red": "红色花瓣块", + "block.betterend.hydralux_petal_block_white": "白色花瓣块", + "block.betterend.hydralux_petal_block_yellow": "黄色花瓣块", + "block.betterend.hydralux_sapling": "水生勒克斯幼苗", + "block.betterend.hydrothermal_vent": "热泉排气孔", + "item.betterend.hydralux_petal": "水生勒克斯花瓣", + + "block.betterend.menger_sponge": "门格海绵", + "block.betterend.menger_sponge_wet": "湿门格海绵", + "block.betterend.tube_worm": "管栖蠕虫", + + "block.betterend.charnia_cyan": "青色查恩海笔", + "block.betterend.charnia_light_blue": "淡蓝色查恩海笔", + "block.betterend.charnia_orange": "橙色查恩海笔", + "block.betterend.charnia_purple": "紫色查恩海笔", + "block.betterend.charnia_red": "红色查恩海笔", + + "entity.betterend.cubozoa": "箱型水母", + "item.betterend.spawn_egg_cubozoa": "箱型水母刷怪蛋", + + "item.betterend.gelatine": "水母凝胶", + "item.betterend.sweet_berry_jelly": "甜浆果冻", + "item.betterend.shadow_berry_jelly": "黯影浆果冻", + + "block.betterend.amber_moss": "琥珀苔藓", + "block.betterend.amber_moss_path": "琥珀苔藓径", + "block.betterend.helix_tree_bark": "螺旋树树皮", + "block.betterend.helix_tree_barrel": "螺旋树木桶", + "block.betterend.helix_tree_bookshelf": "螺旋树书架", + "block.betterend.helix_tree_button": "螺旋树按钮", + "block.betterend.helix_tree_chest": "螺旋树木箱", + "block.betterend.helix_tree_crafting_table": "螺旋树工作台", + "block.betterend.helix_tree_door": "螺旋树木门", + "block.betterend.helix_tree_fence": "螺旋树木栅栏", + "block.betterend.helix_tree_gate": "螺旋树木栅栏门", + "block.betterend.helix_tree_ladder": "螺旋树木梯", + "block.betterend.helix_tree_leaves": "螺旋树树叶", + "block.betterend.helix_tree_log": "螺旋树原木", + "block.betterend.helix_tree_planks": "螺旋树木板", + "block.betterend.helix_tree_plate": "螺旋树压力板", + "block.betterend.helix_tree_sapling": "螺旋树树苗", + "block.betterend.helix_tree_sign": "螺旋树木告示牌", + "block.betterend.helix_tree_slab": "螺旋树台阶", + "block.betterend.helix_tree_stairs": "螺旋树楼梯", + "block.betterend.helix_tree_stripped_bark": "去皮螺旋树树皮", + "block.betterend.helix_tree_stripped_log": "去皮螺旋树原木", + "block.betterend.helix_tree_trapdoor": "螺旋树活板门", + "block.betterend.lanceleaf": "兰塞尔叶", + "block.betterend.lanceleaf_seed": "兰塞尔叶种子", + "block.betterend.hydralux": "水生勒克斯", + "block.betterend.helix_tree_luminophor": "螺旋树光体", + + "block.betterend.glowing_pillar_leaves": "发光柱树叶", + "block.betterend.glowing_pillar_luminophor": "发光柱光体", + "block.betterend.glowing_pillar_roots": "发光柱菌索", + "block.betterend.glowing_pillar_seed": "发光柱种子", + + "biome.betterend.ice_starfield": "冰晶星空", + + "block.betterend.ancient_emerald_ice": "远古翡翠冰", + "block.betterend.dense_emerald_ice": "紧实的翡翠冰", + "block.betterend.dense_snow": "紧实的雪", + "block.betterend.emerald_ice": "翡翠冰", + + "block.betterend.bulb_moss": "灯泡 苔藓", + + "block.betterend.charnia_green": "绿色查恩海笔", + "block.betterend.vent_bubble_column": "气泡柱排气口", + "block.betterend.respawn_obelisk": "重生方尖碑", + "message.betterend.set_spawn": "\u00A7b\u00A7l你的出生点已设置在这", + "message.betterend.fail_spawn": "\u00A7c\u00A7l你需要拿着6个琥珀宝石才能设置出生点!", + + "block.betterend.dragon_tree_composter": "龙鳞木堆肥桶", + "block.betterend.end_lotus_composter": "末地莲木堆肥桶", + "block.betterend.helix_tree_composter": "螺旋木堆肥桶", + "block.betterend.lacugrove_composter": "泊树林木堆肥桶", + "block.betterend.mossy_glowshroom_composter": "苔光菇木堆肥桶", + "block.betterend.pythadendron_composter": "毕达木堆肥桶", + "block.betterend.tenanea_composter": "十纹木堆肥桶", + + "biome.betterend.old_bulbis_gardens": "旧灯泡花园", + "block.betterend.ivis_moss": "常青藓", + "block.betterend.ivis_vine": "常青藤", + "block.betterend.silk_moth_nest": "蚕蛾巢", + + "block.betterend.umbrella_tree_bark": "胶伞木", + "block.betterend.umbrella_tree_barrel": "胶伞树木桶", + "block.betterend.umbrella_tree_bookshelf": "胶伞树书架", + "block.betterend.umbrella_tree_button": "胶伞树按钮", + "block.betterend.umbrella_tree_chest": "胶伞树木箱", + "block.betterend.umbrella_tree_composter": "胶伞树木堆肥桶", + "block.betterend.umbrella_tree_crafting_table": "胶伞树工作台", + "block.betterend.umbrella_tree_door": "胶伞树木门", + "block.betterend.umbrella_tree_fence": "胶伞树木栅栏", + "block.betterend.umbrella_tree_gate": "胶伞树木栅栏门", + "block.betterend.umbrella_tree_ladder": "胶伞树木梯", + "block.betterend.umbrella_tree_log": "胶伞树原木", + "block.betterend.umbrella_tree_planks": "胶伞树木板", + "block.betterend.umbrella_tree_plate": "胶伞树压力板", + "block.betterend.umbrella_tree_sign": "胶伞树木告示牌", + "block.betterend.umbrella_tree_slab": "胶伞树台阶", + "block.betterend.umbrella_tree_stairs": "胶伞树楼梯", + "block.betterend.umbrella_tree_stripped_bark": "去皮胶伞木", + "block.betterend.umbrella_tree_stripped_log": "去皮胶伞树原木", + "block.betterend.umbrella_tree_trapdoor": "胶伞树活板门", + "block.betterend.umbrella_tree_membrane": "胶伞树膜", + + "biome.betterend.umbrella_jungle": "胶伞丛林", + "block.betterend.jungle_grass": "丛林草", + "block.betterend.jungle_moss": "丛林苔藓", + "block.betterend.jungle_moss_path": "丛林苔藓径", + "block.betterend.small_jellyshroom": "Small 水母菇", + "block.betterend.twisted_umbrella_moss": "蜷曲伞状苔藓", + "block.betterend.twisted_umbrella_moss_tall": "蜷曲Umbrella 苔藓Tall", + "block.betterend.umbrella_tree_cluster": "胶伞树花簇", + "block.betterend.umbrella_tree_cluster_empty": "空的胶伞树花簇", + "block.betterend.jungle_vine": "丛林藤", + "block.betterend.jungle_fern": "丛林蕨", + + "block.betterend.jellyshroom_bark": "水母菇菌木", + "block.betterend.jellyshroom_barrel": "水母菇木桶", + "block.betterend.jellyshroom_bookshelf": "水母菇书架", + "block.betterend.jellyshroom_button": "水母菇按钮", + "block.betterend.jellyshroom_cap_purple": "紫色水母菇菌盖", + "block.betterend.jellyshroom_chest": "水母菇木箱", + "block.betterend.jellyshroom_composter": "水母菇木堆肥桶", + "block.betterend.jellyshroom_crafting_table": "水母菇工作台", + "block.betterend.jellyshroom_door": "水母菇木门", + "block.betterend.jellyshroom_fence": "水母菇木栅栏", + "block.betterend.jellyshroom_gate": "水母菇木栅栏门", + "block.betterend.jellyshroom_ladder": "水母菇木梯", + "block.betterend.jellyshroom_log": "水母菇原木", + "block.betterend.jellyshroom_planks": "水母菇木板", + "block.betterend.jellyshroom_plate": "水母菇压力板", + "block.betterend.jellyshroom_sign": "水母菇木告示牌", + "block.betterend.jellyshroom_slab": "水母菇台阶", + "block.betterend.jellyshroom_stairs": "水母菇楼梯", + "block.betterend.jellyshroom_stripped_bark": "去皮水母菇菌木", + "block.betterend.jellyshroom_stripped_log": "去皮水母菇原木", + "block.betterend.jellyshroom_trapdoor": "水母菇活板门", + + "biome.betterend.eterial_grove": "永恒树林", + "block.betterend.umbrella_tree_sapling": "胶伞树树苗", + "item.betterend.umbrella_cluster_juice": "胶伞花簇果汁" } From 25c798b27db98715080c7f746893b1fe1ec7e4ff Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 12 Jan 2021 00:42:44 +0300 Subject: [PATCH 132/463] Lakes changes --- .../ru/betterend/registry/EndStructures.java | 2 +- .../features/StructureFeatureBase.java | 2 +- .../features/StructureMegaLake.java | 4 +- .../world/structures/piece/LakePiece.java | 76 ++++++++++++------- 4 files changed, 53 insertions(+), 31 deletions(-) diff --git a/src/main/java/ru/betterend/registry/EndStructures.java b/src/main/java/ru/betterend/registry/EndStructures.java index 67756626..87884cc4 100644 --- a/src/main/java/ru/betterend/registry/EndStructures.java +++ b/src/main/java/ru/betterend/registry/EndStructures.java @@ -33,7 +33,7 @@ public class EndStructures { public static final StructurePieceType NBT_PIECE = register("nbt_piece", NBTPiece::new); public static final EndStructureFeature GIANT_MOSSY_GLOWSHROOM = new EndStructureFeature("giant_mossy_glowshroom", new StructureGiantMossyGlowshroom(), Feature.SURFACE_STRUCTURES, 16, 8); - public static final EndStructureFeature MEGALAKE = new EndStructureFeature("megalake", new StructureMegaLake(), Feature.RAW_GENERATION, 4, 1); + public static final EndStructureFeature MEGALAKE = new EndStructureFeature("megalake", new StructureMegaLake(), Feature.RAW_GENERATION, 8, 2); public static final EndStructureFeature MOUNTAIN = new EndStructureFeature("mountain", new StructureMountain(), Feature.RAW_GENERATION, 3, 2); public static final EndStructureFeature PAINTED_MOUNTAIN = new EndStructureFeature("painted_mountain", new StructurePaintedMountain(), Feature.RAW_GENERATION, 3, 2); public static final EndStructureFeature ETERNAL_PORTAL = new EndStructureFeature("eternal_portal", new StructureEternalPortal(), Feature.SURFACE_STRUCTURES, 16, 6); diff --git a/src/main/java/ru/betterend/world/structures/features/StructureFeatureBase.java b/src/main/java/ru/betterend/world/structures/features/StructureFeatureBase.java index 845a4ad0..d37fe7af 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructureFeatureBase.java +++ b/src/main/java/ru/betterend/world/structures/features/StructureFeatureBase.java @@ -22,7 +22,7 @@ public abstract class StructureFeatureBase extends StructureFeature= 50; + return getGenerationHeight(chunkX, chunkZ, chunkGenerator) >= 20; } private static int getGenerationHeight(int chunkX, int chunkZ, ChunkGenerator chunkGenerator) { diff --git a/src/main/java/ru/betterend/world/structures/features/StructureMegaLake.java b/src/main/java/ru/betterend/world/structures/features/StructureMegaLake.java index 7c2d7fab..e42c8bb8 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructureMegaLake.java +++ b/src/main/java/ru/betterend/world/structures/features/StructureMegaLake.java @@ -30,8 +30,8 @@ public class StructureMegaLake extends StructureFeatureBase { int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); if (y > 5) { - float radius = MHelper.randRange(50, 100, random); - float depth = MHelper.randRange(10, 16, random); + float radius = MHelper.randRange(50, 150, random); + float depth = MHelper.randRange(6, 10, random); LakePiece piece = new LakePiece(new BlockPos(x, y - 3, z), radius, depth, random, biome); this.children.add(piece); } diff --git a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java index 164764ac..9ded2b51 100644 --- a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java @@ -107,7 +107,7 @@ public class LakePiece extends BasePiece { dist = 1 - dist / r2; int maxY = map.get(x, z); if (MathHelper.abs(maxY - center.getY()) < 8) { - float minY = dist * depth * getHeightClamp(world, 8, px, pz); + float minY = (float) Math.sqrt(dist) * depth * getHeightClamp(world, 8, px, pz); if (minY > 0) { minY *= (float) noise1.eval(px * 0.05, pz * 0.05) * 0.3F + 0.7F; minY *= (float) noise1.eval(px * 0.1, pz * 0.1) * 0.1F + 0.8F; @@ -121,33 +121,35 @@ public class LakePiece extends BasePiece { pos.setY(maxY ++); } - if (maxY <= center.getY() + 1) { - maxY = MathHelper.clamp(maxY + 4, 0, center.getY()); - BlockState surf = random.nextBoolean() ? EndBlocks.ENDSTONE_DUST.getDefaultState() : world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getTopMaterial(); - BlockState under = world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getUnderMaterial(); - for (int y = maxY; y >= minY; y--) { - pos.setY(y); - BlockState state = chunk.getBlockState(pos); - if (state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN)) { - chunk.setBlockState(pos, y > center.getY() ? AIR : y == maxY ? surf : under, false); - } - else { - break; + if (!waterIsNear(world, pos.getX() + sx, center.getY(), pos.getZ() + sz, 2)) { + if (maxY <= center.getY() + 1) { + maxY = MathHelper.clamp(maxY + 4, 0, center.getY()); + BlockState surf = random.nextBoolean() ? EndBlocks.ENDSTONE_DUST.getDefaultState() : world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getTopMaterial(); + BlockState under = world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getUnderMaterial(); + for (int y = maxY; y >= minY; y--) { + pos.setY(y); + BlockState state = chunk.getBlockState(pos); + if (state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN)) { + chunk.setBlockState(pos, y > center.getY() ? AIR : y == maxY ? surf : under, false); + } + else { + break; + } } } - } - else { - for (int y = maxY; y >= minY; y--) { - pos.setY(y); - BlockState state = chunk.getBlockState(pos); - if (state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN)) { - if (maxY <= center.getY() + 1) - chunk.setBlockState(pos, Blocks.REDSTONE_BLOCK.getDefaultState(), false); - else - chunk.setBlockState(pos, y > center.getY() ? AIR : WATER, false); - } - else { - break; + else { + for (int y = maxY; y >= minY; y--) { + pos.setY(y); + BlockState state = chunk.getBlockState(pos); + if (state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN)) { + if (maxY <= center.getY() + 1) + chunk.setBlockState(pos, Blocks.REDSTONE_BLOCK.getDefaultState(), false); + else + chunk.setBlockState(pos, y > center.getY() ? AIR : WATER, false); + } + else { + break; + } } } } @@ -181,6 +183,26 @@ public class LakePiece extends BasePiece { return true; } + private boolean waterIsNear(StructureWorldAccess world, int x, int y, int z, int r) { + int py = world.getChunk(x >> 4, z >> 4).sampleHeightmap(Type.WORLD_SURFACE, x & 15, z & 15) - 1; + if (py > y) { + Mutable m = new Mutable(); + m.setY(py); + for (int i = -r; i <= r; i++) { + int px = x + i; + m.setX(px); + for (int j = -r; j <= r; j++) { + int pz = z + j; + m.setZ(pz); + if (!world.getFluidState(m).isEmpty()) { + return true; + } + } + } + } + return false; + } + private int getHeight(StructureWorldAccess world, BlockPos pos) { int p = ((pos.getX() & 2047) << 11) | (pos.getZ() & 2047); int h = heightmap.getOrDefault(p, Integer.MIN_VALUE); @@ -242,4 +264,4 @@ public class LakePiece extends BasePiece { int maxZ = MHelper.floor(center.getZ() + radius + 1); this.boundingBox = new BlockBox(minX, minZ, maxX, maxZ); } -} +} \ No newline at end of file From 1b8c2cbedf0cf17a239b64e0db765f51444dc7f0 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 12 Jan 2021 00:43:15 +0300 Subject: [PATCH 133/463] Version change --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 362d8c53..731576c2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ loader_version=0.10.8 # Mod Properties - mod_version = 0.8.6-beta + mod_version = 0.8.7-beta maven_group = ru.betterend archives_base_name = better-end From 30bde849f882c3cf982a5745a080e886d64214a3 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Tue, 12 Jan 2021 09:54:25 +0300 Subject: [PATCH 134/463] Vanilla Crystalite armor textures --- .../textures/models/armor/crystalite_layer_1.png | Bin 0 -> 1538 bytes .../textures/models/armor/crystalite_layer_2.png | Bin 0 -> 474 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/assets/minecraft/textures/models/armor/crystalite_layer_1.png create mode 100644 src/main/resources/assets/minecraft/textures/models/armor/crystalite_layer_2.png diff --git a/src/main/resources/assets/minecraft/textures/models/armor/crystalite_layer_1.png b/src/main/resources/assets/minecraft/textures/models/armor/crystalite_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..2b5b4d8105ebc354e76ab6b49e7591aa4e656bf6 GIT binary patch literal 1538 zcmV+d2L1VoP)*qTa{lD70q^$RtPv8F{$+Qj;yD)d9! zfT=dNF;x@WCe>E0wU5XnKntlWqVljJ=(4PDDX_~fGW~FO*x6-amMXCEpKNySoOAD- z^S^h_J?D;u9^P1~j4I!MP|_VEh#?20RZV>F2xL6BK6|g2B(jG%foC%67oH=w@#0q~oLXhSWo*3Y>$Di!4C;Q|IuD4h@xAsZt!i;`)Z{Md7 z+Y5!OB&PSnp6v>m>2T^Fkc^_EI)*<7eYeseh%JHubAxClCqZ=`084VVQu&+Abfyy5 z9g5v3v+jiz($bkOw)OObQ3fRvzB~X|ZUeW)7+EH~#snxW^$-&TPHQ2Nv)C&LDkrLk zqK1^4rI2NU_Ksn}N-D@xRKkY!@duR{A0o7U#{>F7u)Id!0DrS)vH8snMsmoPnDKTz zPz*CdQM@NmHQd+Wk?sc@^j3gA0mUDQ8@Fx<`NyA4uEQ^)bjCR`$MjG>y@&0alSZ{i zj{yBz;MNT|We%R)zZd3wW8j&XIAZ^}bl1a;tsHjm5R(cg@D3O+!oq8jcRidw0qq@L z+vB98rUz>7;FSAFjhO%f^m28nAkPytEH;Rr<+q>LF5uP~?Kx6Go`S`OGFT0vKo~Th zX(cg#KGvyDED`WiYYU&|%vT5n4A6M`JPA1|TroPi9O2-{7Bl#Xb6Sk;JYXc06pNpV zc#p zWhevwhG@G?v?C0|78q=H5$7-fp->8(5(Gs#WWu(9tHs3wcKtW}-Vo5&<0+^BvX?UD zy(S)hdO6I`fKRGDl_CgTZDk0sre5f$E`nNFlS)fa2n<5BD~xG&88$$SU1o;EAY3Q} zToC1wg}ex2?P0_^^a&WIQMu|mKewM%8l!r-nVTk6t_$EKNb9`2ookQhNPY~7-@)a^ zM!z~*EVIiT%a7raZ|Bm~a0cA9RUHR0?aTvQ)KJS{Z#WNqp>QqI$yIA7b)3eu^A*5F zEq@C6P9eW$?b0=U*a{e|v?=fAE}<|nlLfyvkN#0a3w6dUHaK*cgnk2My9QXA@Bo9OE7WSSx)0reVr2rgQ? zo89s-U9)9!7JCAe#YRd)1T#N`oXv5x)kk{=FtsMow&Q1cJCtRDjCA_eTM1cojn*bJ zbXwtAllNAt?bF`Dzl~Nx9(C(mx}Z(yKCZlZSDEK)I=yAGOi;8@ypyG+bd;YZ@%edl zoH>u&bptkf%Yor-HCIrtGt$}nS0-fs&K;u*DwaW2gf{_dANT*>obTZqxD(-o_`lk1+B$#>BZZre;VU23R#Rj@v%9x(xo8(}^G>C!>x6^qJuL|U$)*WQ zy~UxZdW@x>*o>j=FHstLZM3VxVhgxbR&g&XP5o+c)7roToga);9R^GNuYVv?UFSKi oQJ1m5wtE)+%KaeN&k0og2Z(iq9YP_ZW&i*H07*qoM6N<$f*1kS%>V!Z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/textures/models/armor/crystalite_layer_2.png b/src/main/resources/assets/minecraft/textures/models/armor/crystalite_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..dd69c886d0a46f6517a96a2fd6100fb4dfbc5919 GIT binary patch literal 474 zcmV<00VV#4P)q=SiUE~X9*d;-HLVR16bq)yC^Eb7Rj3!5;Aivw}fr6g`nh6H6K>?D{b zri>&;61Q`BDaTz&pdl?Oyx&sZdp8`{*WMLij4{R-V~jDz7-Nhv#u#Iav5hqB3yfTW zVPC**h*eJ~Y{ty&`x{-my$GkW8cAQKelLHwJ|djTYWO?gYp@Z2++!%ud9@ClokEHA z`c+A-e|8g5Of)R?2pk>(2YHzd8pl`?b`$s;%Z%N`%kdETi~c0m>q;DR1{@dYv?mGi z`UL#$;G_!d)du)ML#gZI<1Puyq;~dNdYl4ofK(4CjdtOy>v7D{E--aR6UB3g+cLf( zP{~yQnEpGyMjb$p!1RH~agiuL)9)6=dVQS^NCqsE_WpE+GC|{FK|L-zE{&OGR&Cz+ zkhfWR5Yi7ni^k~;klmME;ka^fbY3mU_>e8Xy2XOP!y|2t*O!#Ls{vcvl=I#f-5xEP zWg^h{$U0yd-p7-t)0Vr0-K6XE-3&TDM9Z&kE~~x+EK|1hBHtAA#)sSi|Lb?Q^5y2T Qa{vGU07*qoM6N<$f>ILLCjbBd literal 0 HcmV?d00001 From 336f457b88548f46725b821b9b6fb6a9a008edc5 Mon Sep 17 00:00:00 2001 From: Godzmoline <59003232+linzexin022@users.noreply.github.com> Date: Tue, 12 Jan 2021 15:08:34 +0800 Subject: [PATCH 135/463] Update zh_cn.json --- .../assets/betterend/lang/zh_cn.json | 274 +++++++++--------- 1 file changed, 137 insertions(+), 137 deletions(-) diff --git a/src/main/resources/assets/betterend/lang/zh_cn.json b/src/main/resources/assets/betterend/lang/zh_cn.json index 06ab61ed..d07edbf2 100644 --- a/src/main/resources/assets/betterend/lang/zh_cn.json +++ b/src/main/resources/assets/betterend/lang/zh_cn.json @@ -6,8 +6,8 @@ "book.betterend.landing": "一本极端条件下在末地生存的指南", "book.betterend.subtitle": "在末地生存", - "category.rei.damage.amount&dmg": "工具伤害: %s", - "category.rei.infusion.time&val": "灌注时间: %s", + "category.rei.damage.amount&dmg": "工具伤害:%s", + "category.rei.infusion.time&val": "灌注时间:%s", "biome.betterend.foggy_mushroomland": "雾霭蘑菇岛", "biome.betterend.dust_wastelands": "尘土飞扬的荒地", @@ -82,24 +82,24 @@ "block.betterend.mossy_glowshroom_cap": "苔光菇菌盖", "block.betterend.mossy_glowshroom_fur": "苔光菇菌绒", "block.betterend.mossy_glowshroom_hymenophore": "苔光菇菌褶", - "block.betterend.mossy_glowshroom_bark": "苔光菇菌木", + "block.betterend.mossy_glowshroom_bark": "苔光菇菌柄", "block.betterend.mossy_glowshroom_barrel": "苔光菇木桶", - "block.betterend.mossy_glowshroom_button": "苔光菇按钮", + "block.betterend.mossy_glowshroom_button": "苔光菇木按钮", "block.betterend.mossy_glowshroom_chest": "苔光菇木箱", - "block.betterend.mossy_glowshroom_crafting_table": "苔光菇工作台", + "block.betterend.mossy_glowshroom_crafting_table": "苔光菇木工作台", "block.betterend.mossy_glowshroom_door": "苔光菇木门", "block.betterend.mossy_glowshroom_fence": "苔光菇木栅栏", "block.betterend.mossy_glowshroom_gate": "苔光菇木栅栏门", "block.betterend.mossy_glowshroom_ladder": "苔光菇木梯", "block.betterend.mossy_glowshroom_log": "苔光菇原木", "block.betterend.mossy_glowshroom_planks": "苔光菇木板", - "block.betterend.mossy_glowshroom_plate": "苔光菇压力板", + "block.betterend.mossy_glowshroom_plate": "苔光菇木压力板", "block.betterend.mossy_glowshroom_sign": "苔光菇木告示牌", - "block.betterend.mossy_glowshroom_slab": "苔光菇台阶", - "block.betterend.mossy_glowshroom_stairs": "苔光菇楼梯", - "block.betterend.mossy_glowshroom_stripped_bark": "去皮苔光菇菌木", + "block.betterend.mossy_glowshroom_slab": "苔光菇木台阶", + "block.betterend.mossy_glowshroom_stairs": "苔光菇木楼梯", + "block.betterend.mossy_glowshroom_stripped_bark": "去皮苔光菇菌柄", "block.betterend.mossy_glowshroom_stripped_log": "去皮苔光菇原木", - "block.betterend.mossy_glowshroom_trapdoor": "苔光菇活板门", + "block.betterend.mossy_glowshroom_trapdoor": "苔光菇木活板门", "block.betterend.umbrella_moss": "伞状苔藓", "block.betterend.umbrella_moss_tall": "高伞状苔藓", @@ -188,22 +188,22 @@ "block.betterend.end_lotus_bark": "末地莲木", "block.betterend.end_lotus_barrel": "末地莲木桶", - "block.betterend.end_lotus_button": "末地莲按钮", + "block.betterend.end_lotus_button": "末地莲木按钮", "block.betterend.end_lotus_chest": "末地莲木箱", - "block.betterend.end_lotus_crafting_table": "末地莲工作台", + "block.betterend.end_lotus_crafting_table": "末地莲木工作台", "block.betterend.end_lotus_door": "末地莲木门", "block.betterend.end_lotus_fence": "末地莲木栅栏", "block.betterend.end_lotus_gate": "末地莲木栅栏门", "block.betterend.end_lotus_ladder": "末地莲木梯", "block.betterend.end_lotus_log": "末地莲原木", "block.betterend.end_lotus_planks": "末地莲木板", - "block.betterend.end_lotus_plate": "末地莲压力板", + "block.betterend.end_lotus_plate": "末地莲木压力板", "block.betterend.end_lotus_sign": "末地莲木告示牌", "block.betterend.end_lotus_slab": "末地莲台阶", - "block.betterend.end_lotus_stairs": "末地莲楼梯", + "block.betterend.end_lotus_stairs": "末地莲木楼梯", "block.betterend.end_lotus_stripped_bark": "去皮末地莲木", "block.betterend.end_lotus_stripped_log": "去皮末地莲原木", - "block.betterend.end_lotus_trapdoor": "末地莲活板门", + "block.betterend.end_lotus_trapdoor": "末地莲木活板门", "block.betterend.cave_moss": "洞穴苔藓", "block.betterend.cave_grass": "洞穴草", @@ -222,24 +222,24 @@ "block.betterend.flavolite_runed_eternal": "永恒符文苍黄石", "item.betterend.eternal_crystal": "永恒水晶", - "block.betterend.lacugrove_bark": "泊树林树皮", + "block.betterend.lacugrove_bark": "泊树林木", "block.betterend.lacugrove_barrel": "泊树林木桶", - "block.betterend.lacugrove_button": "泊树林按钮", + "block.betterend.lacugrove_button": "泊树林木按钮", "block.betterend.lacugrove_chest": "泊树林木箱", - "block.betterend.lacugrove_crafting_table": "泊树林工作台", + "block.betterend.lacugrove_crafting_table": "泊树林木工作台", "block.betterend.lacugrove_door": "泊树林木门", "block.betterend.lacugrove_fence": "泊树林木栅栏", "block.betterend.lacugrove_gate": "泊树林木栅栏门", "block.betterend.lacugrove_ladder": "泊树林木梯", "block.betterend.lacugrove_log": "泊树林原木", "block.betterend.lacugrove_planks": "泊树林木板", - "block.betterend.lacugrove_plate": "泊树林压力板", + "block.betterend.lacugrove_plate": "泊树林木压力板", "block.betterend.lacugrove_sign": "泊树林木告示牌", - "block.betterend.lacugrove_slab": "泊树林台阶", - "block.betterend.lacugrove_stairs": "泊树林楼梯", - "block.betterend.lacugrove_stripped_bark": "去皮泊树林树皮", + "block.betterend.lacugrove_slab": "泊树林木台阶", + "block.betterend.lacugrove_stairs": "泊树林木楼梯", + "block.betterend.lacugrove_stripped_bark": "去皮泊树林木", "block.betterend.lacugrove_stripped_log": "去皮泊树林原木", - "block.betterend.lacugrove_trapdoor": "泊树林活板门", + "block.betterend.lacugrove_trapdoor": "泊树林木活板门", "block.betterend.lacugrove_leaves": "泊树林树叶", "block.betterend.lacugrove_sapling": "泊树林树苗", @@ -247,35 +247,35 @@ "biome.betterend.megalake_grove": "巨型湖泊树林", "biome.betterend.painted_mountains": "彩绘山脉", - "block.betterend.dragon_tree_bark": "龙鳞树树皮", - "block.betterend.dragon_tree_barrel": "龙鳞树木桶", - "block.betterend.dragon_tree_button": "龙鳞树按钮", - "block.betterend.dragon_tree_chest": "龙鳞树木箱", - "block.betterend.dragon_tree_crafting_table": "龙鳞树工作台", - "block.betterend.dragon_tree_door": "龙鳞树木门", - "block.betterend.dragon_tree_fence": "龙鳞树木栅栏", - "block.betterend.dragon_tree_gate": "龙鳞树木栅栏门", - "block.betterend.dragon_tree_ladder": "龙鳞树木梯", - "block.betterend.dragon_tree_log": "龙鳞树原木", - "block.betterend.dragon_tree_planks": "龙鳞树木板", - "block.betterend.dragon_tree_plate": "龙鳞树压力板", - "block.betterend.dragon_tree_sign": "龙鳞树木告示牌", - "block.betterend.dragon_tree_slab": "龙鳞树台阶", - "block.betterend.dragon_tree_stairs": "龙鳞树楼梯", - "block.betterend.dragon_tree_stripped_bark": "去皮龙鳞树树皮", - "block.betterend.dragon_tree_stripped_log": "去皮龙鳞树原木", - "block.betterend.dragon_tree_trapdoor": "龙鳞树活板门", + "block.betterend.dragon_tree_bark": "龙鳞木", + "block.betterend.dragon_tree_barrel": "龙鳞木桶", + "block.betterend.dragon_tree_button": "龙鳞木按钮", + "block.betterend.dragon_tree_chest": "龙鳞木箱", + "block.betterend.dragon_tree_crafting_table": "龙鳞木工作台", + "block.betterend.dragon_tree_door": "龙鳞木门", + "block.betterend.dragon_tree_fence": "龙鳞木栅栏", + "block.betterend.dragon_tree_gate": "龙鳞木栅栏门", + "block.betterend.dragon_tree_ladder": "龙鳞木梯", + "block.betterend.dragon_tree_log": "龙鳞木原木", + "block.betterend.dragon_tree_planks": "龙鳞木板", + "block.betterend.dragon_tree_plate": "龙鳞木压力板", + "block.betterend.dragon_tree_sign": "龙鳞木告示牌", + "block.betterend.dragon_tree_slab": "龙鳞木台阶", + "block.betterend.dragon_tree_stairs": "龙鳞木楼梯", + "block.betterend.dragon_tree_stripped_bark": "去皮龙鳞木", + "block.betterend.dragon_tree_stripped_log": "去皮龙鳞木原木", + "block.betterend.dragon_tree_trapdoor": "龙鳞木活板门", "biome.betterend.shadow_forest": "黯影森林", - "block.betterend.dragon_tree_leaves": "龙鳞树树叶", - "block.betterend.dragon_tree_sapling": "龙鳞树树苗", + "block.betterend.dragon_tree_leaves": "龙鳞树叶", + "block.betterend.dragon_tree_sapling": "龙鳞树苗", "block.betterend.shadow_grass": "黯影草", "block.betterend.shadow_grass_path": "黯影草径", - "block.betterend.shadow_plant": "黯影Plant", + "block.betterend.shadow_plant": "黯影植物", - "block.betterend.dragon_tree_bookshelf": "龙鳞树书架", - "block.betterend.end_lotus_bookshelf": "末地莲书架", - "block.betterend.lacugrove_bookshelf": "泊树林书架", + "block.betterend.dragon_tree_bookshelf": "龙鳞木书架", + "block.betterend.end_lotus_bookshelf": "末地莲木书架", + "block.betterend.lacugrove_bookshelf": "泊树林木书架", "block.betterend.mossy_glowshroom_bookshelf": "苔光菇木书架", "block.betterend.pythadendron_bookshelf": "毕达木书架", @@ -312,29 +312,29 @@ "biome.betterend.amber_land": "琥珀岛", "biome.betterend.blossoming_spires": "花开尖塔", - "block.betterend.amber_grass": "琥珀草", + "block.betterend.amber_grass": "琥珀草方块", "block.betterend.amber_grass_path": "琥珀草径", - "block.betterend.tenanea_bark": "十纹树皮", - "block.betterend.tenanea_barrel": "十纹树木桶", - "block.betterend.tenanea_bookshelf": "十纹树书架", - "block.betterend.tenanea_button": "十纹树按钮", + "block.betterend.tenanea_bark": "十纹木", + "block.betterend.tenanea_barrel": "十纹木桶", + "block.betterend.tenanea_bookshelf": "十纹木书架", + "block.betterend.tenanea_button": "十纹木按钮", "block.betterend.tenanea_chest": "十纹木箱", - "block.betterend.tenanea_crafting_table": "十纹工作台", - "block.betterend.tenanea_door": "十纹树木门", - "block.betterend.tenanea_fence": "十纹树木栅栏", - "block.betterend.tenanea_gate": "十纹树木栅栏门", - "block.betterend.tenanea_ladder": "十纹树木梯", - "block.betterend.tenanea_leaves": "十纹树树叶", - "block.betterend.tenanea_log": "十纹树原木", - "block.betterend.tenanea_planks": "十纹树木板", - "block.betterend.tenanea_plate": "十纹树压力板", - "block.betterend.tenanea_sapling": "十纹树树苗", - "block.betterend.tenanea_sign": "十纹树木告示牌", - "block.betterend.tenanea_slab": "十纹树台阶", - "block.betterend.tenanea_stairs": "十纹树楼梯", - "block.betterend.tenanea_stripped_bark": "去皮十纹树皮", - "block.betterend.tenanea_stripped_log": "去皮十纹树原木", - "block.betterend.tenanea_trapdoor": "十纹树活板门", + "block.betterend.tenanea_crafting_table": "十纹木工作台", + "block.betterend.tenanea_door": "十纹木门", + "block.betterend.tenanea_fence": "十纹木栅栏", + "block.betterend.tenanea_gate": "十纹木栅栏门", + "block.betterend.tenanea_ladder": "十纹木梯", + "block.betterend.tenanea_leaves": "十纹树叶", + "block.betterend.tenanea_log": "十纹木原木", + "block.betterend.tenanea_planks": "十纹木板", + "block.betterend.tenanea_plate": "十纹木压力板", + "block.betterend.tenanea_sapling": "十纹树苗", + "block.betterend.tenanea_sign": "十纹木告示牌", + "block.betterend.tenanea_slab": "十纹木台阶", + "block.betterend.tenanea_stairs": "十纹木楼梯", + "block.betterend.tenanea_stripped_bark": "去皮十纹木", + "block.betterend.tenanea_stripped_log": "去皮十纹木原木", + "block.betterend.tenanea_trapdoor": "十纹木活板门", "block.betterend.amber_block": "琥珀块", "block.betterend.amber_ore": "琥珀矿石", @@ -351,7 +351,7 @@ "block.betterend.bulb_vine": "灯泡藤", "block.betterend.bulb_lantern": "灯泡灯笼", "block.betterend.bulb_vine_seed": "灯泡藤种子", - "item.betterend.glowing_bulb": "发光灯泡0果", + "item.betterend.glowing_bulb": "发光灯泡果", "block.betterend.bulb_lantern_black": "黑色灯泡灯笼", "block.betterend.bulb_lantern_blue": "蓝色灯泡灯笼", @@ -423,8 +423,8 @@ "block.betterend.charnia_purple": "紫色查恩海笔", "block.betterend.charnia_red": "红色查恩海笔", - "entity.betterend.cubozoa": "箱型水母", - "item.betterend.spawn_egg_cubozoa": "箱型水母刷怪蛋", + "entity.betterend.cubozoa": "箱水母", + "item.betterend.spawn_egg_cubozoa": "箱水母刷怪蛋", "item.betterend.gelatine": "水母凝胶", "item.betterend.sweet_berry_jelly": "甜浆果冻", @@ -432,36 +432,36 @@ "block.betterend.amber_moss": "琥珀苔藓", "block.betterend.amber_moss_path": "琥珀苔藓径", - "block.betterend.helix_tree_bark": "螺旋树树皮", - "block.betterend.helix_tree_barrel": "螺旋树木桶", - "block.betterend.helix_tree_bookshelf": "螺旋树书架", - "block.betterend.helix_tree_button": "螺旋树按钮", - "block.betterend.helix_tree_chest": "螺旋树木箱", - "block.betterend.helix_tree_crafting_table": "螺旋树工作台", - "block.betterend.helix_tree_door": "螺旋树木门", - "block.betterend.helix_tree_fence": "螺旋树木栅栏", - "block.betterend.helix_tree_gate": "螺旋树木栅栏门", - "block.betterend.helix_tree_ladder": "螺旋树木梯", - "block.betterend.helix_tree_leaves": "螺旋树树叶", - "block.betterend.helix_tree_log": "螺旋树原木", - "block.betterend.helix_tree_planks": "螺旋树木板", - "block.betterend.helix_tree_plate": "螺旋树压力板", - "block.betterend.helix_tree_sapling": "螺旋树树苗", - "block.betterend.helix_tree_sign": "螺旋树木告示牌", - "block.betterend.helix_tree_slab": "螺旋树台阶", - "block.betterend.helix_tree_stairs": "螺旋树楼梯", - "block.betterend.helix_tree_stripped_bark": "去皮螺旋树树皮", - "block.betterend.helix_tree_stripped_log": "去皮螺旋树原木", - "block.betterend.helix_tree_trapdoor": "螺旋树活板门", + "block.betterend.helix_tree_bark": "螺旋木", + "block.betterend.helix_tree_barrel": "螺旋木桶", + "block.betterend.helix_tree_bookshelf": "螺旋木书架", + "block.betterend.helix_tree_button": "螺旋木按钮", + "block.betterend.helix_tree_chest": "螺旋木箱", + "block.betterend.helix_tree_crafting_table": "螺旋木工作台", + "block.betterend.helix_tree_door": "螺旋木门", + "block.betterend.helix_tree_fence": "螺旋木栅栏", + "block.betterend.helix_tree_gate": "螺旋木栅栏门", + "block.betterend.helix_tree_ladder": "螺旋木梯", + "block.betterend.helix_tree_leaves": "螺旋树叶", + "block.betterend.helix_tree_log": "螺旋木原木", + "block.betterend.helix_tree_planks": "螺旋木板", + "block.betterend.helix_tree_plate": "螺旋木压力板", + "block.betterend.helix_tree_sapling": "螺旋树苗", + "block.betterend.helix_tree_sign": "螺旋木告示牌", + "block.betterend.helix_tree_slab": "螺旋木台阶", + "block.betterend.helix_tree_stairs": "螺旋木楼梯", + "block.betterend.helix_tree_stripped_bark": "去皮螺旋木", + "block.betterend.helix_tree_stripped_log": "去皮螺旋木原木", + "block.betterend.helix_tree_trapdoor": "螺旋木活板门", "block.betterend.lanceleaf": "兰塞尔叶", "block.betterend.lanceleaf_seed": "兰塞尔叶种子", "block.betterend.hydralux": "水生勒克斯", - "block.betterend.helix_tree_luminophor": "螺旋树光体", + "block.betterend.helix_tree_luminophor": "螺旋树发光体", - "block.betterend.glowing_pillar_leaves": "发光柱树叶", - "block.betterend.glowing_pillar_luminophor": "发光柱光体", - "block.betterend.glowing_pillar_roots": "发光柱菌索", - "block.betterend.glowing_pillar_seed": "发光柱种子", + "block.betterend.glowing_pillar_leaves": "发光楹树叶", + "block.betterend.glowing_pillar_luminophor": "发光楹发光体", + "block.betterend.glowing_pillar_roots": "发光楹菌索", + "block.betterend.glowing_pillar_seed": "发光楹种子", "biome.betterend.ice_starfield": "冰晶星空", @@ -492,62 +492,62 @@ "block.betterend.silk_moth_nest": "蚕蛾巢", "block.betterend.umbrella_tree_bark": "胶伞木", - "block.betterend.umbrella_tree_barrel": "胶伞树木桶", + "block.betterend.umbrella_tree_barrel": "胶伞木桶", "block.betterend.umbrella_tree_bookshelf": "胶伞树书架", - "block.betterend.umbrella_tree_button": "胶伞树按钮", - "block.betterend.umbrella_tree_chest": "胶伞树木箱", - "block.betterend.umbrella_tree_composter": "胶伞树木堆肥桶", + "block.betterend.umbrella_tree_button": "胶伞木按钮", + "block.betterend.umbrella_tree_chest": "胶伞木箱", + "block.betterend.umbrella_tree_composter": "胶伞木堆肥桶", "block.betterend.umbrella_tree_crafting_table": "胶伞树工作台", - "block.betterend.umbrella_tree_door": "胶伞树木门", - "block.betterend.umbrella_tree_fence": "胶伞树木栅栏", - "block.betterend.umbrella_tree_gate": "胶伞树木栅栏门", - "block.betterend.umbrella_tree_ladder": "胶伞树木梯", - "block.betterend.umbrella_tree_log": "胶伞树原木", - "block.betterend.umbrella_tree_planks": "胶伞树木板", - "block.betterend.umbrella_tree_plate": "胶伞树压力板", - "block.betterend.umbrella_tree_sign": "胶伞树木告示牌", - "block.betterend.umbrella_tree_slab": "胶伞树台阶", - "block.betterend.umbrella_tree_stairs": "胶伞树楼梯", + "block.betterend.umbrella_tree_door": "胶伞木门", + "block.betterend.umbrella_tree_fence": "胶伞木栅栏", + "block.betterend.umbrella_tree_gate": "胶伞木栅栏门", + "block.betterend.umbrella_tree_ladder": "胶伞木梯", + "block.betterend.umbrella_tree_log": "胶伞木原木", + "block.betterend.umbrella_tree_planks": "胶伞木板", + "block.betterend.umbrella_tree_plate": "胶伞木压力板", + "block.betterend.umbrella_tree_sign": "胶伞木告示牌", + "block.betterend.umbrella_tree_slab": "胶伞木台阶", + "block.betterend.umbrella_tree_stairs": "胶伞木楼梯", "block.betterend.umbrella_tree_stripped_bark": "去皮胶伞木", - "block.betterend.umbrella_tree_stripped_log": "去皮胶伞树原木", - "block.betterend.umbrella_tree_trapdoor": "胶伞树活板门", + "block.betterend.umbrella_tree_stripped_log": "去皮胶伞木原木", + "block.betterend.umbrella_tree_trapdoor": "胶伞木活板门", "block.betterend.umbrella_tree_membrane": "胶伞树膜", "biome.betterend.umbrella_jungle": "胶伞丛林", "block.betterend.jungle_grass": "丛林草", "block.betterend.jungle_moss": "丛林苔藓", "block.betterend.jungle_moss_path": "丛林苔藓径", - "block.betterend.small_jellyshroom": "Small 水母菇", + "block.betterend.small_jellyshroom": "小果冻菌", "block.betterend.twisted_umbrella_moss": "蜷曲伞状苔藓", - "block.betterend.twisted_umbrella_moss_tall": "蜷曲Umbrella 苔藓Tall", + "block.betterend.twisted_umbrella_moss_tall": "高蜷曲伞状苔藓", "block.betterend.umbrella_tree_cluster": "胶伞树花簇", "block.betterend.umbrella_tree_cluster_empty": "空的胶伞树花簇", "block.betterend.jungle_vine": "丛林藤", "block.betterend.jungle_fern": "丛林蕨", - "block.betterend.jellyshroom_bark": "水母菇菌木", - "block.betterend.jellyshroom_barrel": "水母菇木桶", - "block.betterend.jellyshroom_bookshelf": "水母菇书架", - "block.betterend.jellyshroom_button": "水母菇按钮", - "block.betterend.jellyshroom_cap_purple": "紫色水母菇菌盖", - "block.betterend.jellyshroom_chest": "水母菇木箱", - "block.betterend.jellyshroom_composter": "水母菇木堆肥桶", - "block.betterend.jellyshroom_crafting_table": "水母菇工作台", - "block.betterend.jellyshroom_door": "水母菇木门", - "block.betterend.jellyshroom_fence": "水母菇木栅栏", - "block.betterend.jellyshroom_gate": "水母菇木栅栏门", - "block.betterend.jellyshroom_ladder": "水母菇木梯", - "block.betterend.jellyshroom_log": "水母菇原木", - "block.betterend.jellyshroom_planks": "水母菇木板", - "block.betterend.jellyshroom_plate": "水母菇压力板", - "block.betterend.jellyshroom_sign": "水母菇木告示牌", - "block.betterend.jellyshroom_slab": "水母菇台阶", - "block.betterend.jellyshroom_stairs": "水母菇楼梯", - "block.betterend.jellyshroom_stripped_bark": "去皮水母菇菌木", - "block.betterend.jellyshroom_stripped_log": "去皮水母菇原木", - "block.betterend.jellyshroom_trapdoor": "水母菇活板门", + "block.betterend.jellyshroom_bark": "果冻菌柄", + "block.betterend.jellyshroom_barrel": "果冻菌木桶", + "block.betterend.jellyshroom_bookshelf": "果冻菌书架", + "block.betterend.jellyshroom_button": "果冻菌木按钮", + "block.betterend.jellyshroom_cap_purple": "紫色果冻菌盖", + "block.betterend.jellyshroom_chest": "果冻菌木箱", + "block.betterend.jellyshroom_composter": "果冻菌木堆肥桶", + "block.betterend.jellyshroom_crafting_table": "果冻菌木工作台", + "block.betterend.jellyshroom_door": "果冻菌木门", + "block.betterend.jellyshroom_fence": "果冻菌木栅栏", + "block.betterend.jellyshroom_gate": "果冻菌木栅栏门", + "block.betterend.jellyshroom_ladder": "果冻菌木梯", + "block.betterend.jellyshroom_log": "果冻菌原木", + "block.betterend.jellyshroom_planks": "果冻菌木板", + "block.betterend.jellyshroom_plate": "果冻菌木压力板", + "block.betterend.jellyshroom_sign": "果冻菌木告示牌", + "block.betterend.jellyshroom_slab": "果冻菌木台阶", + "block.betterend.jellyshroom_stairs": "果冻菌木楼梯", + "block.betterend.jellyshroom_stripped_bark": "去皮果冻菌柄", + "block.betterend.jellyshroom_stripped_log": "去皮果冻菌原木", + "block.betterend.jellyshroom_trapdoor": "果冻菌活板门", "biome.betterend.eterial_grove": "永恒树林", - "block.betterend.umbrella_tree_sapling": "胶伞树树苗", + "block.betterend.umbrella_tree_sapling": "胶伞树苗", "item.betterend.umbrella_cluster_juice": "胶伞花簇果汁" } From a2d7a5f7c8d3f237054509941edb50797381a05a Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 12 Jan 2021 11:16:20 +0300 Subject: [PATCH 136/463] Config fix --- src/main/java/ru/betterend/BetterEnd.java | 5 ++--- src/main/java/ru/betterend/config/ConfigKeeper.java | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index fb2c2b54..f58d6399 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -39,9 +39,6 @@ public class BetterEnd implements ModInitializer { public static final Logger LOGGER = Logger.get(); @Override public void onInitialize() { - TerrainGenerator.init(); - GeneratorOptions.init(); - EndSounds.register(); EndItems.register(); EndBlocks.register(); @@ -63,6 +60,8 @@ public class BetterEnd implements ModInitializer { EndStructures.register(); Integrations.register(); BonemealUtil.init(); + TerrainGenerator.init(); + GeneratorOptions.init(); if (hasGuideBook()) { GuideBookItem.register(); diff --git a/src/main/java/ru/betterend/config/ConfigKeeper.java b/src/main/java/ru/betterend/config/ConfigKeeper.java index cdc10b84..5c951bd6 100644 --- a/src/main/java/ru/betterend/config/ConfigKeeper.java +++ b/src/main/java/ru/betterend/config/ConfigKeeper.java @@ -56,7 +56,7 @@ public final class ConfigKeeper { String paramKey = key.getEntry(); paramKey += " [default: " + entry.getDefault() + "]"; - this.changed = entry.setLocation(obj, paramKey); + this.changed |= entry.setLocation(obj, paramKey); } private > void storeValue(E entry, T value) { From 0ffbb1c8f260a7bb015ea276484f448930b0489c Mon Sep 17 00:00:00 2001 From: Aleksey Date: Tue, 12 Jan 2021 11:30:31 +0300 Subject: [PATCH 137/463] A little refactoring --- src/main/java/ru/betterend/util/MHelper.java | 8 ++ .../world/structures/piece/LakePiece.java | 136 +++++++++--------- 2 files changed, 75 insertions(+), 69 deletions(-) diff --git a/src/main/java/ru/betterend/util/MHelper.java b/src/main/java/ru/betterend/util/MHelper.java index 6e7fa735..7444c433 100644 --- a/src/main/java/ru/betterend/util/MHelper.java +++ b/src/main/java/ru/betterend/util/MHelper.java @@ -161,6 +161,14 @@ public class MHelper { return i * i; } + public static float pow2(float f) { + return f * f; + } + + public static double pow2(double d) { + return d * d; + } + public static int fromHSBtoRGB(float hue, float saturation, float brightness) { int red = 0; int green = 0; diff --git a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java index 9ded2b51..c4fff550 100644 --- a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java @@ -48,7 +48,7 @@ public class LakePiece extends BasePiece { this.center = center; this.radius = radius; this.depth = depth; - this.r2 = radius * radius; + this.r2 = MHelper.pow2(radius); this.seed1 = random.nextInt(); this.seed2 = random.nextInt(); this.noise1 = new OpenSimplexNoise(this.seed1); @@ -77,7 +77,7 @@ public class LakePiece extends BasePiece { center = NbtHelper.toBlockPos(tag.getCompound("center")); radius = tag.getFloat("radius"); depth = tag.getFloat("depth"); - r2 = radius * radius; + r2 = MHelper.pow2(radius); seed1 = tag.getInt("seed1"); seed2 = tag.getInt("seed2"); noise1 = new OpenSimplexNoise(seed1); @@ -94,84 +94,82 @@ public class LakePiece extends BasePiece { Heightmap map = chunk.getHeightmap(Type.WORLD_SURFACE_WG); for (int x = 0; x < 16; x++) { int px = x + sx; - int px2 = px - center.getX(); - px2 *= px2; + int px2 = MHelper.pow2(px - center.getX()); pos.setX(x); for (int z = 0; z < 16; z++) { int pz = z + sz; - int pz2 = pz - center.getZ(); - pz2 *= pz2; + int pz2 = MHelper.pow2(pz - center.getZ()); float dist = px2 + pz2; - if (dist < r2) { - pos.setZ(z); - dist = 1 - dist / r2; - int maxY = map.get(x, z); - if (MathHelper.abs(maxY - center.getY()) < 8) { - float minY = (float) Math.sqrt(dist) * depth * getHeightClamp(world, 8, px, pz); - if (minY > 0) { - minY *= (float) noise1.eval(px * 0.05, pz * 0.05) * 0.3F + 0.7F; - minY *= (float) noise1.eval(px * 0.1, pz * 0.1) * 0.1F + 0.8F; - float lerp = minY / 4F; - if (lerp > 1) { - lerp = 1; - } - minY = MathHelper.lerp(lerp, maxY - minY, center.getY() - minY); - pos.setY(maxY); - while (!chunk.getBlockState(pos).getMaterial().isReplaceable()) { - pos.setY(maxY ++); - } - - if (!waterIsNear(world, pos.getX() + sx, center.getY(), pos.getZ() + sz, 2)) { - if (maxY <= center.getY() + 1) { - maxY = MathHelper.clamp(maxY + 4, 0, center.getY()); - BlockState surf = random.nextBoolean() ? EndBlocks.ENDSTONE_DUST.getDefaultState() : world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getTopMaterial(); - BlockState under = world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getUnderMaterial(); - for (int y = maxY; y >= minY; y--) { - pos.setY(y); - BlockState state = chunk.getBlockState(pos); - if (state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN)) { - chunk.setBlockState(pos, y > center.getY() ? AIR : y == maxY ? surf : under, false); - } - else { - break; - } - } - } - else { - for (int y = maxY; y >= minY; y--) { - pos.setY(y); - BlockState state = chunk.getBlockState(pos); - if (state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN)) { - if (maxY <= center.getY() + 1) - chunk.setBlockState(pos, Blocks.REDSTONE_BLOCK.getDefaultState(), false); - else - chunk.setBlockState(pos, y > center.getY() ? AIR : WATER, false); - } - else { - break; - } - } - } - } - - boolean under = pos.getY() <= center.getY() || (pos.getY() == center.getY() + 1 && random.nextBoolean()); - pos.setY(pos.getY() - 1); - BlockState state = chunk.getBlockState(pos); - if (state.isIn(EndTags.GEN_TERRAIN) || (state.getMaterial().isReplaceable() && pos.getY() <= center.getY())) { - state = under ? EndBlocks.ENDSTONE_DUST.getDefaultState() : world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getTopMaterial(); - chunk.setBlockState(pos, state, false); - maxY = (int) (noise1.eval((pos.getX() + sx) * 0.1, (pos.getZ() + sz) * 0.1) + 2); - state = world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getUnderMaterial(); - for (int i = 0; i < maxY; i++) { - pos.setY(pos.getY() - 1); + if (dist > r2) continue; + + pos.setZ(z); + dist = 1 - dist / r2; + int maxY = map.get(x, z); + if (MathHelper.abs(maxY - center.getY()) < 8) { + float minY = (float) Math.sqrt(dist) * depth * getHeightClamp(world, 8, px, pz); + if (minY > 0) { + minY *= (float) noise1.eval(px * 0.05, pz * 0.05) * 0.3F + 0.7F; + minY *= (float) noise1.eval(px * 0.1, pz * 0.1) * 0.1F + 0.8F; + float lerp = minY / 4F; + if (lerp > 1) { + lerp = 1; + } + minY = MathHelper.lerp(lerp, maxY - minY, center.getY() - minY); + pos.setY(maxY); + while (!chunk.getBlockState(pos).getMaterial().isReplaceable()) { + pos.setY(maxY ++); + } + + if (!waterIsNear(world, pos.getX() + sx, center.getY(), pos.getZ() + sz, 2)) { + if (maxY <= center.getY() + 1) { + maxY = MathHelper.clamp(maxY + 4, 0, center.getY()); + BlockState surf = random.nextBoolean() ? EndBlocks.ENDSTONE_DUST.getDefaultState() : world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getTopMaterial(); + BlockState under = world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getUnderMaterial(); + for (int y = maxY; y >= minY; y--) { + pos.setY(y); + BlockState state = chunk.getBlockState(pos); if (state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN)) { - chunk.setBlockState(pos, state, false); + chunk.setBlockState(pos, y > center.getY() ? AIR : y == maxY ? surf : under, false); } else { break; } } } + else { + for (int y = maxY; y >= minY; y--) { + pos.setY(y); + BlockState state = chunk.getBlockState(pos); + if (state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN)) { + if (maxY <= center.getY() + 1) + chunk.setBlockState(pos, Blocks.REDSTONE_BLOCK.getDefaultState(), false); + else + chunk.setBlockState(pos, y > center.getY() ? AIR : WATER, false); + } + else { + break; + } + } + } + } + + boolean under = pos.getY() <= center.getY() || (pos.getY() == center.getY() + 1 && random.nextBoolean()); + pos.setY(pos.getY() - 1); + BlockState state = chunk.getBlockState(pos); + if (state.isIn(EndTags.GEN_TERRAIN) || (state.getMaterial().isReplaceable() && pos.getY() <= center.getY())) { + state = under ? EndBlocks.ENDSTONE_DUST.getDefaultState() : world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getTopMaterial(); + chunk.setBlockState(pos, state, false); + maxY = (int) (noise1.eval((pos.getX() + sx) * 0.1, (pos.getZ() + sz) * 0.1) + 2); + state = world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getUnderMaterial(); + for (int i = 0; i < maxY; i++) { + pos.setY(pos.getY() - 1); + if (state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN)) { + chunk.setBlockState(pos, state, false); + } + else { + break; + } + } } } } From a8d59ede8a4eb7c5b5e78eee9ce82c0566f692ca Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 12 Jan 2021 12:08:44 +0300 Subject: [PATCH 138/463] Version change --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 731576c2..0e1be849 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ loader_version=0.10.8 # Mod Properties - mod_version = 0.8.7-beta + mod_version = 0.8.8-beta maven_group = ru.betterend archives_base_name = better-end From 418f048ed32a9dff2623d4bd8e99f65776e4576b Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 12 Jan 2021 17:48:31 +0300 Subject: [PATCH 139/463] Nightshade Redwood prototype (WIP) --- .../integration/byg/biomes/BYGBiomes.java | 2 + .../byg/biomes/NightshadeRedwoods.java | 56 ++++++ .../integration/byg/features/BYGFeatures.java | 1 + .../NightshadeRedwoodTreeFeature.java | 165 ++++++++++++++++++ .../java/ru/betterend/util/SplineHelper.java | 19 ++ .../world/generator/GeneratorOptions.java | 8 +- .../world/generator/TerrainGenerator.java | 4 +- 7 files changed, 249 insertions(+), 6 deletions(-) create mode 100644 src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java create mode 100644 src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java diff --git a/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java b/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java index 8d426eb2..0211415c 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java @@ -7,12 +7,14 @@ import ru.betterend.world.biome.EndBiome; public class BYGBiomes { // New Biomes public static final EndBiome OLD_BULBIS_GARDENS = EndBiomes.registerSubBiomeIntegration(new OldBulbisGardens()); + public static final EndBiome NIGHTSHADE_REDWOODS = EndBiomes.registerSubBiomeIntegration(new NightshadeRedwoods()); //public static final EndBiome ETHERIAL_GROVE = EndBiomes.registerSubBiomeIntegration(new EterialGrove()); public static void register() {} public static void addBiomes() { EndBiomes.addSubBiomeIntegration(OLD_BULBIS_GARDENS, Integrations.BYG.getID("bulbis_gardens")); + EndBiomes.addSubBiomeIntegration(NIGHTSHADE_REDWOODS, Integrations.BYG.getID("nightshade_forest")); //EndBiomes.addSubBiomeIntegration(ETHERIAL_GROVE, Integrations.BYG.getID("ethereal_islands")); } } diff --git a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java new file mode 100644 index 00000000..bdc95139 --- /dev/null +++ b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java @@ -0,0 +1,56 @@ +package ru.betterend.integration.byg.biomes; + +import java.util.List; + +import net.minecraft.entity.SpawnGroup; +import net.minecraft.particle.ParticleTypes; +import net.minecraft.sound.SoundEvent; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.BiomeEffects; +import net.minecraft.world.biome.SpawnSettings.SpawnEntry; +import ru.betterend.BetterEnd; +import ru.betterend.integration.Integrations; +import ru.betterend.integration.byg.features.BYGFeatures; +import ru.betterend.registry.EndFeatures; +import ru.betterend.world.biome.BiomeDefinition; +import ru.betterend.world.biome.EndBiome; + +public class NightshadeRedwoods extends EndBiome { + public NightshadeRedwoods() { + super(makeDef()); + } + + private static BiomeDefinition makeDef() { + Biome biome = Integrations.BYG.getBiome("nightshade_forest"); + BiomeEffects effects = biome.getEffects(); + + BiomeDefinition def = new BiomeDefinition("nightshade_redwoods") + .setFogColor(140, 108, 47) + .setFogDensity(1.5F) + .setWaterAndFogColor(55, 70, 186) + .setFoliageColor(122, 17, 155) + .setParticles(ParticleTypes.REVERSE_PORTAL, 0.002F) + .setSurface(biome.getGenerationSettings().getSurfaceBuilder().get()) + .setGrassColor(48, 13, 89) + .setPlantsColor(200, 125, 9) + .addFeature(EndFeatures.END_LAKE_RARE) + .addFeature(BYGFeatures.NIGHTSHADE_REDWOOD_TREE); + + if (BetterEnd.isClient()) { + SoundEvent loop = effects.getLoopSound().get(); + SoundEvent music = effects.getMusic().get().getSound(); + SoundEvent additions = effects.getAdditionsSound().get().getSound(); + SoundEvent mood = effects.getMoodSound().get().getSound(); + def.setLoop(loop).setMusic(music).setAdditions(additions).setMood(mood); + } + + for (SpawnGroup group: SpawnGroup.values()) { + List list = biome.getSpawnSettings().getSpawnEntry(group); + list.forEach((entry) -> { + def.addMobSpawn(entry); + }); + } + + return def; + } +} diff --git a/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java b/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java index 8388142f..28b28ece 100644 --- a/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java +++ b/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java @@ -18,6 +18,7 @@ public class BYGFeatures { public static final EndFeature BULBIS_ODDITY = new EndFeature("bulbis_oddity", new SinglePlantFeature(Integrations.BYG.getBlock("bulbis_oddity"), 4, 4), 5); public static final EndFeature PURPLE_BULBIS_ODDITY = new EndFeature("purple_bulbis_oddity", new SinglePlantFeature(Integrations.BYG.getBlock("purple_bulbis_oddity"), 4, 4), 5); + public static final EndFeature NIGHTSHADE_REDWOOD_TREE = new EndFeature("nightshade_redwood_tree", new NightshadeRedwoodTreeFeature(), 1); public static final EndFeature BIG_ETHER_TREE = new EndFeature("big_ether_tree", new BigEtherTreeFeature(), 1); public static final ConfiguredFeature BULBIS_TREES = Integrations.BYG.getConfiguredFeature("rs_sparse_bulbis_tree"); diff --git a/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java new file mode 100644 index 00000000..554d2002 --- /dev/null +++ b/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java @@ -0,0 +1,165 @@ +package ru.betterend.integration.byg.features; + +import java.util.List; +import java.util.Random; + +import com.google.common.base.Function; +import com.google.common.collect.Lists; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.LeavesBlock; +import net.minecraft.block.Material; +import net.minecraft.client.util.math.Vector3f; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.integration.Integrations; +import ru.betterend.registry.EndTags; +import ru.betterend.util.MHelper; +import ru.betterend.util.SplineHelper; +import ru.betterend.util.sdf.PosInfo; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFFlatWave; +import ru.betterend.util.sdf.operator.SDFSmoothUnion; +import ru.betterend.util.sdf.primitive.SDFCappedCone; +import ru.betterend.util.sdf.primitive.SDFSphere; +import ru.betterend.world.features.DefaultFeature; + +public class NightshadeRedwoodTreeFeature extends DefaultFeature { + private static final List BRANCH; + + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; + + BlockState log = Integrations.BYG.getDefaultState("nightshade_log"); + BlockState wood = Integrations.BYG.getDefaultState("nightshade_wood"); + BlockState leaves = Integrations.BYG.getDefaultState("nightshade_leaves"); + //BlockState leaves_flower = Integrations.BYG.getDefaultState("flowering_nightshade_leaves"); + + Function splinePlacer = (bpos) -> { return log; }; + Function replace = (state) -> { + return state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) || state.getMaterial().isReplaceable(); + }; + Function post = (info) -> { + if (info.getState().equals(log) && (!info.getStateUp().equals(log) || !info.getStateDown().equals(log))) { + return wood; + } + return info.getState(); + }; + Function ignore = (state) -> { + return state.equals(log) || state.equals(wood); + }; + + int height = MHelper.randRange(40, 60, random); + List trunk = SplineHelper.makeSpline(0, 0, 0, 0, height, 0, height / 4); + SplineHelper.offsetParts(trunk, random, 0.8F, 0, 0.8F); + + if (!SplineHelper.canGenerate(trunk, pos, world, replace)) { + return false; + } + + int count = height >> 2; + float start = trunk.size() / 3F; + float delta = trunk.size() * 0.6F; + float max = height - 7; + //SDF leavesSDF = null; + for (int i = 0; i < count; i++) { + float scale = (float) (count - i) / count * 15; + Vector3f offset = SplineHelper.getPos(trunk, (float) i / count * delta + start); + if (offset.getY() > max) { + break; + } + List branch = SplineHelper.copySpline(BRANCH); + SplineHelper.rotateSpline(branch, i * 1.3F); + SplineHelper.scale(branch, scale); + SplineHelper.offsetParts(branch, random, 0.3F, 0.3F, 0.3F); + SplineHelper.offset(branch, offset); + SplineHelper.fillSpline(branch, world, wood, pos, replace); + + /*SDF leaf = null; + for (int j = 2; j < 5; j++) { + Vector3f point = branch.get(j); + float radius = (float) (j - 2) / 3F; + radius = (1F - radius) * 3F; + SDF sphere = new SDFSphere().setRadius(radius).setBlock(leaves); + sphere = new SDFTranslate().setTranslate(point.getX(), point.getY(), point.getZ()).setSource(sphere); + leaf = leaf == null ? sphere : new SDFUnion().setSourceA(leaf).setSourceB(leaf); + }*/ + + /*SDF leaf = SplineHelper.buildSDF(branch, (del) -> { + float radius = 1 - del; + radius = radius * radius * 2 - 1; + radius *= radius; + radius = (1 - radius) * 2; + return radius; + }, (bpos) -> { + return leaves; + });*/ + //leavesSDF = leavesSDF == null ? leaf : new SDFUnion().setSourceA(leavesSDF).setSourceB(leaf); + } + + SDF sdf = SplineHelper.buildSDF(trunk, 2.3F, 0.8F, splinePlacer); + SDF roots = new SDFSphere().setRadius(2F).setBlock(log); + roots = new SDFFlatWave().setIntensity(2F).setRaysCount(MHelper.randRange(5, 7, random)).setAngle(random.nextFloat() * MHelper.PI2).setSource(roots); + sdf = new SDFSmoothUnion().setRadius(2F).setSourceA(sdf).setSourceB(roots); + sdf.setReplaceFunction(replace).setPostProcess(post).fillRecursive(world, pos); + + /*if (leavesSDF != null) { + leavesSDF.fillArea(world, pos, new Box(pos).expand(20, 80, 20)); + }*/ + + Mutable mut = new Mutable(); + Function leavesPost = (info) -> { + if (info.getState().equals(log) || info.getState().equals(wood)) { + for (int x = -6; x < 7; x++) { + int ax = Math.abs(x); + mut.setX(x + info.getPos().getX()); + for (int z = -6; z < 7; z++) { + int az = Math.abs(z); + mut.setZ(z + info.getPos().getZ()); + for (int y = -6; y < 7; y++) { + int ay = Math.abs(y); + int d = ax + ay + az; + if (d < 7) { + mut.setY(y + info.getPos().getY()); + BlockState state = info.getState(mut); + if (state.getBlock() instanceof LeavesBlock) { + int distance = state.get(LeavesBlock.DISTANCE); + if (d < distance) { + info.setState(mut, state.with(LeavesBlock.DISTANCE, d)); + } + } + } + } + } + } + } + else if (info.getState().getBlock() instanceof LeavesBlock) { + int distance = info.getState().get(LeavesBlock.DISTANCE); + return distance > MHelper.randRange(3, 5, random) ? Blocks.AIR.getDefaultState() : info.getState(); + } + return info.getState(); + }; + + SDF canopy = new SDFCappedCone().setRadius1(12F).setRadius2(3f).setHeight(height * 0.3F).setBlock(leaves); + canopy.setPostProcess(leavesPost ).fillRecursiveIgnore(world, pos.add(0, height * 0.75, 0), ignore); + + return true; + } + + //private void makeLeavesSphere(StructureWorldAccess world, BlockPos pos, BlockState leaves, Function ignore) { + // + //} + + static { + BRANCH = Lists.newArrayList(new Vector3f(0, 0, 0), + new Vector3f(0.25F, 0.1F, 0), + new Vector3f(0.40F, 0.2F, 0), + new Vector3f(0.50F, 0.4F, 0), + new Vector3f(0.55F, 0.6F, 0)); + } +} diff --git a/src/main/java/ru/betterend/util/SplineHelper.java b/src/main/java/ru/betterend/util/SplineHelper.java index a5092018..b15ac46b 100644 --- a/src/main/java/ru/betterend/util/SplineHelper.java +++ b/src/main/java/ru/betterend/util/SplineHelper.java @@ -74,6 +74,25 @@ public class SplineHelper { return result; } + public static SDF buildSDF(List spline, Function radiusFunction, Function placerFunction) { + int count = spline.size(); + float max = count - 2; + SDF result = null; + Vector3f start = spline.get(0); + for (int i = 1; i < count; i++) { + Vector3f pos = spline.get(i); + float delta = (float) (i - 1) / max; + SDF line = new SDFLine() + .setRadius(radiusFunction.apply(delta)) + .setStart(start.getX(), start.getY(), start.getZ()) + .setEnd(pos.getX(), pos.getY(), pos.getZ()) + .setBlock(placerFunction); + result = result == null ? line : new SDFUnion().setSourceA(result).setSourceB(line); + start = pos; + } + return result; + } + public static boolean fillSpline(List spline, StructureWorldAccess world, BlockState state, BlockPos pos, Function replace) { Vector3f startPos = spline.get(0); for (int i = 1; i < spline.size(); i++) { diff --git a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java index 45da95c7..fa07784e 100644 --- a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java +++ b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java @@ -13,14 +13,14 @@ public class GeneratorOptions { private static boolean removeChorusFromVanillaBiomes; public static void init() { - biomeSizeLand = Configs.GENERATOR_CONFIG.getIntRoot("biomeSizeLand", 256); - biomeSizeVoid = Configs.GENERATOR_CONFIG.getIntRoot("biomeSizeVoid", 256); + biomeSizeLand = Configs.GENERATOR_CONFIG.getInt("biomeMap", "biomeSizeLand", 256); + biomeSizeVoid = Configs.GENERATOR_CONFIG.getInt("biomeMap", "biomeSizeVoid", 256); hasPortal = Configs.GENERATOR_CONFIG.getBooleanRoot("hasPortal", true); hasPillars = Configs.GENERATOR_CONFIG.getBooleanRoot("hasPillars", true); hasDragonFights = Configs.GENERATOR_CONFIG.getBooleanRoot("hasDragonFights", true); swapOverworldToEnd = Configs.GENERATOR_CONFIG.getBooleanRoot("swapOverworldToEnd", false); - changeChorusPlant = Configs.GENERATOR_CONFIG.getBooleanRoot("changeChorusPlant", true); - removeChorusFromVanillaBiomes = Configs.GENERATOR_CONFIG.getBooleanRoot("removeChorusFromVanillaBiomes", true); + changeChorusPlant = Configs.GENERATOR_CONFIG.getBoolean("chorusPlant", "changeChorusPlant", true); + removeChorusFromVanillaBiomes = Configs.GENERATOR_CONFIG.getBoolean("chorusPlant", "removeChorusFromVanillaBiomes", true); } public static int getBiomeSizeLand() { diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index 2623bd2b..93cd0b2a 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -23,8 +23,8 @@ public class TerrainGenerator { private static boolean noRingVoid; public static void init() { - newGenerator = Configs.GENERATOR_CONFIG.getBooleanRoot("useNewGenerator", false); - noRingVoid = Configs.GENERATOR_CONFIG.getBooleanRoot("noRingVoid", false); + newGenerator = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "useNewGenerator", false); + noRingVoid = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "noRingVoid", false); } public static void initNoise(long seed) { From 34318e283b9d489f399b216d0d7ad30f4bf70a95 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 12 Jan 2021 18:33:16 +0300 Subject: [PATCH 140/463] Finished tree shape --- .../byg/features/BigEtherTreeFeature.java | 2 +- .../NightshadeRedwoodTreeFeature.java | 90 ++++++++----- .../byg/features/OldBulbisTreeFeature.java | 2 +- src/main/java/ru/betterend/util/sdf/SDF.java | 127 +++++++----------- .../world/features/bushes/BushFeature.java | 2 +- .../features/bushes/TenaneaBushFeature.java | 2 +- .../terrain/FloatingSpireFeature.java | 2 +- .../features/terrain/IceStarFeature.java | 2 +- .../world/features/terrain/SpireFeature.java | 2 +- .../features/trees/DragonTreeFeature.java | 4 +- .../features/trees/HelixTreeFeature.java | 2 +- .../features/trees/JellyshroomFeature.java | 2 +- .../features/trees/LacugroveFeature.java | 4 +- .../trees/MossyGlowshroomFeature.java | 2 +- .../trees/PythadendronTreeFeature.java | 4 +- .../world/features/trees/TenaneaFeature.java | 2 +- .../features/trees/UmbrellaTreeFeature.java | 2 +- .../features/StructureGiantIceStar.java | 2 +- .../StructureGiantMossyGlowshroom.java | 2 +- 19 files changed, 120 insertions(+), 137 deletions(-) diff --git a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java index 23a55875..08c87af3 100644 --- a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java @@ -61,7 +61,7 @@ public class BigEtherTreeFeature extends DefaultFeature { sdf.setReplaceFunction((state) -> { return state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) || state.getMaterial().isReplaceable(); - }).setPostProcess((info) -> { + }).addPostProcess((info) -> { if (info.getState().equals(log) && (!info.getStateUp().equals(log) || !info.getStateDown().equals(log))) { return wood; } diff --git a/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java index 554d2002..3294d71d 100644 --- a/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java @@ -13,15 +13,18 @@ import net.minecraft.block.Material; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.util.math.Direction; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; import ru.betterend.integration.Integrations; import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; import ru.betterend.util.SplineHelper; import ru.betterend.util.sdf.PosInfo; import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFDisplacement; import ru.betterend.util.sdf.operator.SDFFlatWave; import ru.betterend.util.sdf.operator.SDFSmoothUnion; import ru.betterend.util.sdf.primitive.SDFCappedCone; @@ -38,7 +41,7 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { BlockState log = Integrations.BYG.getDefaultState("nightshade_log"); BlockState wood = Integrations.BYG.getDefaultState("nightshade_wood"); BlockState leaves = Integrations.BYG.getDefaultState("nightshade_leaves"); - //BlockState leaves_flower = Integrations.BYG.getDefaultState("flowering_nightshade_leaves"); + BlockState leaves_flower = Integrations.BYG.getDefaultState("flowering_nightshade_leaves"); Function splinePlacer = (bpos) -> { return log; }; Function replace = (state) -> { @@ -66,7 +69,6 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { float start = trunk.size() / 3F; float delta = trunk.size() * 0.6F; float max = height - 7; - //SDF leavesSDF = null; for (int i = 0; i < count; i++) { float scale = (float) (count - i) / count * 15; Vector3f offset = SplineHelper.getPos(trunk, (float) i / count * delta + start); @@ -79,41 +81,43 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { SplineHelper.offsetParts(branch, random, 0.3F, 0.3F, 0.3F); SplineHelper.offset(branch, offset); SplineHelper.fillSpline(branch, world, wood, pos, replace); - - /*SDF leaf = null; - for (int j = 2; j < 5; j++) { - Vector3f point = branch.get(j); - float radius = (float) (j - 2) / 3F; - radius = (1F - radius) * 3F; - SDF sphere = new SDFSphere().setRadius(radius).setBlock(leaves); - sphere = new SDFTranslate().setTranslate(point.getX(), point.getY(), point.getZ()).setSource(sphere); - leaf = leaf == null ? sphere : new SDFUnion().setSourceA(leaf).setSourceB(leaf); - }*/ - - /*SDF leaf = SplineHelper.buildSDF(branch, (del) -> { - float radius = 1 - del; - radius = radius * radius * 2 - 1; - radius *= radius; - radius = (1 - radius) * 2; - return radius; - }, (bpos) -> { - return leaves; - });*/ - //leavesSDF = leavesSDF == null ? leaf : new SDFUnion().setSourceA(leavesSDF).setSourceB(leaf); } SDF sdf = SplineHelper.buildSDF(trunk, 2.3F, 0.8F, splinePlacer); SDF roots = new SDFSphere().setRadius(2F).setBlock(log); roots = new SDFFlatWave().setIntensity(2F).setRaysCount(MHelper.randRange(5, 7, random)).setAngle(random.nextFloat() * MHelper.PI2).setSource(roots); sdf = new SDFSmoothUnion().setRadius(2F).setSourceA(sdf).setSourceB(roots); - sdf.setReplaceFunction(replace).setPostProcess(post).fillRecursive(world, pos); + sdf.setReplaceFunction(replace).addPostProcess(post).fillRecursive(world, pos); + Vector3f last = SplineHelper.getPos(trunk, trunk.size() - 1.35F); + for (int y = 0; y < 8; y++) { + BlockPos p = pos.add(last.getX() + 0.5, last.getY() + y, last.getZ() + 0.5); + BlocksHelper.setWithoutUpdate(world, p, y == 4 ? wood : log); + } - /*if (leavesSDF != null) { - leavesSDF.fillArea(world, pos, new Box(pos).expand(20, 80, 20)); - }*/ + for (int y = 0; y < 16; y++) { + BlockPos p = pos.add(last.getX() + 0.5, last.getY() + y, last.getZ() + 0.5); + if (world.isAir(p)) { + BlocksHelper.setWithoutUpdate(world, p, leaves); + } + float radius = (1 - y / 16F) * 3F; + int rad = (int) (radius + 1); + radius *= radius; + for (int x = -rad; x <= rad; x++) { + int x2 = x * x; + for (int z = -rad; z <= rad; z++) { + int z2 = z * z; + if (x2 + z2 < radius - random.nextFloat() * rad) { + BlockPos lp = p.add(x, 0, z); + if (world.isAir(lp)) { + BlocksHelper.setWithoutUpdate(world, lp, leaves); + } + } + } + } + } Mutable mut = new Mutable(); - Function leavesPost = (info) -> { + Function leavesPost1 = (info) -> { if (info.getState().equals(log) || info.getState().equals(wood)) { for (int x = -6; x < 7; x++) { int ax = Math.abs(x); @@ -138,23 +142,37 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { } } } - else if (info.getState().getBlock() instanceof LeavesBlock) { + return info.getState(); + }; + Function leavesPost2 = (info) -> { + if (info.getState().getBlock() instanceof LeavesBlock) { int distance = info.getState().get(LeavesBlock.DISTANCE); - return distance > MHelper.randRange(3, 5, random) ? Blocks.AIR.getDefaultState() : info.getState(); + if (distance > MHelper.randRange(2, 4, random)) { + return Blocks.AIR.getDefaultState(); + } + for (Direction d: BlocksHelper.DIRECTIONS) { + int airCount = 0; + if (info.getState(d).isAir()) { + airCount ++; + } + if (airCount > 5) { + return Blocks.AIR.getDefaultState(); + } + } + if (random.nextInt(8) == 0) { + return leaves_flower.with(LeavesBlock.DISTANCE, distance); + } } return info.getState(); }; - SDF canopy = new SDFCappedCone().setRadius1(12F).setRadius2(3f).setHeight(height * 0.3F).setBlock(leaves); - canopy.setPostProcess(leavesPost ).fillRecursiveIgnore(world, pos.add(0, height * 0.75, 0), ignore); + SDF canopy = new SDFCappedCone().setRadius1(12F).setRadius2(1f).setHeight(height * 0.3F).setBlock(leaves); + canopy = new SDFDisplacement().setFunction((vec) -> { return MHelper.randRange(-3F, 3F, random); }).setSource(canopy); + canopy.addPostProcess(leavesPost1).addPostProcess(leavesPost2).fillRecursiveIgnore(world, pos.add(0, height * 0.75, 0), ignore); return true; } - //private void makeLeavesSphere(StructureWorldAccess world, BlockPos pos, BlockState leaves, Function ignore) { - // - //} - static { BRANCH = Lists.newArrayList(new Vector3f(0, 0, 0), new Vector3f(0.25F, 0.1F, 0), diff --git a/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java index 9f2b4328..9f9e89a4 100644 --- a/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java @@ -81,7 +81,7 @@ public class OldBulbisTreeFeature extends DefaultFeature { sdf = (sdf == null) ? branch : new SDFUnion().setSourceA(sdf).setSourceB(branch); } - sdf.setReplaceFunction(replacement).setPostProcess((info) -> { + sdf.setReplaceFunction(replacement).addPostProcess((info) -> { if (info.getState().equals(stem) && (!info.getStateUp().equals(stem) || !info.getStateDown().equals(stem))) { return wood; } diff --git a/src/main/java/ru/betterend/util/sdf/SDF.java b/src/main/java/ru/betterend/util/sdf/SDF.java index fb881000..c5db2106 100644 --- a/src/main/java/ru/betterend/util/sdf/SDF.java +++ b/src/main/java/ru/betterend/util/sdf/SDF.java @@ -7,6 +7,7 @@ import java.util.Map; import java.util.Set; import java.util.function.Function; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; @@ -20,9 +21,7 @@ import ru.betterend.util.BlocksHelper; import ru.betterend.world.structures.StructureWorld; public abstract class SDF { - private Function postProcess = (info) -> { - return info.getState(); - }; + private List> postProcesses = Lists.newArrayList(); private Function canReplace = (state) -> { return state.getMaterial().isReplaceable(); }; @@ -31,8 +30,8 @@ public abstract class SDF { public abstract BlockState getBlockState(BlockPos pos); - public SDF setPostProcess(Function postProcess) { - this.postProcess = postProcess; + public SDF addPostProcess(Function postProcess) { + this.postProcesses.add(postProcess); return this; } @@ -41,66 +40,6 @@ public abstract class SDF { return this; } - @Deprecated - public void fillRecursive(ServerWorldAccess world, BlockPos start, int dx, int dy, int dz) { - Map mapWorld = Maps.newHashMap(); - Map addInfo = Maps.newHashMap(); - Set blocks = Sets.newHashSet(); - Set ends = Sets.newHashSet(); - Set add = Sets.newHashSet(); - ends.add(new BlockPos(0, 0, 0)); - boolean run = true; - - while (run) { - for (BlockPos center: ends) { - for (Direction dir: Direction.values()) { - BlockPos pos = center.offset(dir); - BlockPos wpos = pos.add(start); - - run &= Math.abs(pos.getX()) < dx; - run &= Math.abs(pos.getY()) < dy; - run &= Math.abs(pos.getZ()) < dz; - - if (!blocks.contains(pos) && canReplace.apply(world.getBlockState(wpos))) { - if (this.getDistance(pos.getX(), pos.getY(), pos.getZ()) < 0) { - BlockState state = getBlockState(wpos); - PosInfo.create(mapWorld, addInfo, wpos).setState(state); - if (Math.abs(pos.getX()) < dx && Math.abs(pos.getY()) < dy && Math.abs(pos.getZ()) < dz) { - add.add(pos); - } - } - } - } - } - - blocks.addAll(ends); - ends.clear(); - ends.addAll(add); - add.clear(); - - run &= !ends.isEmpty(); - } - - List infos = new ArrayList(mapWorld.values()); - if (infos.size() > 0) { - Collections.sort(infos); - infos.forEach((info) -> { - BlockState state = postProcess.apply(info); - BlocksHelper.setWithoutUpdate(world, info.getPos(), state); - }); - - infos.clear(); - infos.addAll(addInfo.values()); - Collections.sort(infos); - infos.forEach((info) -> { - if (canReplace.apply(world.getBlockState(info.getPos()))) { - BlockState state = postProcess.apply(info); - BlocksHelper.setWithoutUpdate(world, info.getPos(), state); - } - }); - } - } - public void fillRecursive(ServerWorldAccess world, BlockPos start) { Map mapWorld = Maps.newHashMap(); Map addInfo = Maps.newHashMap(); @@ -139,8 +78,10 @@ public abstract class SDF { List infos = new ArrayList(mapWorld.values()); if (infos.size() > 0) { Collections.sort(infos); - infos.forEach((info) -> { - info.setState(postProcess.apply(info)); + postProcesses.forEach((postProcess) -> { + infos.forEach((info) -> { + info.setState(postProcess.apply(info)); + }); }); infos.forEach((info) -> { BlocksHelper.setWithoutUpdate(world, info.getPos(), info.getState()); @@ -149,10 +90,14 @@ public abstract class SDF { infos.clear(); infos.addAll(addInfo.values()); Collections.sort(infos); + postProcesses.forEach((postProcess) -> { + infos.forEach((info) -> { + info.setState(postProcess.apply(info)); + }); + }); infos.forEach((info) -> { if (canReplace.apply(world.getBlockState(info.getPos()))) { - BlockState state = postProcess.apply(info); - BlocksHelper.setWithoutUpdate(world, info.getPos(), state); + BlocksHelper.setWithoutUpdate(world, info.getPos(), info.getState()); } }); } @@ -182,8 +127,10 @@ public abstract class SDF { List infos = new ArrayList(mapWorld.values()); if (infos.size() > 0) { Collections.sort(infos); - infos.forEach((info) -> { - info.setState(postProcess.apply(info)); + postProcesses.forEach((postProcess) -> { + infos.forEach((info) -> { + info.setState(postProcess.apply(info)); + }); }); infos.forEach((info) -> { BlocksHelper.setWithoutUpdate(world, info.getPos(), info.getState()); @@ -192,10 +139,14 @@ public abstract class SDF { infos.clear(); infos.addAll(addInfo.values()); Collections.sort(infos); + postProcesses.forEach((postProcess) -> { + infos.forEach((info) -> { + info.setState(postProcess.apply(info)); + }); + }); infos.forEach((info) -> { if (canReplace.apply(world.getBlockState(info.getPos()))) { - BlockState state = postProcess.apply(info); - BlocksHelper.setWithoutUpdate(world, info.getPos(), state); + BlocksHelper.setWithoutUpdate(world, info.getPos(), info.getState()); } }); } @@ -239,8 +190,10 @@ public abstract class SDF { List infos = new ArrayList(mapWorld.values()); if (infos.size() > 0) { Collections.sort(infos); - infos.forEach((info) -> { - info.setState(postProcess.apply(info)); + postProcesses.forEach((postProcess) -> { + infos.forEach((info) -> { + info.setState(postProcess.apply(info)); + }); }); infos.forEach((info) -> { BlocksHelper.setWithoutUpdate(world, info.getPos(), info.getState()); @@ -249,10 +202,14 @@ public abstract class SDF { infos.clear(); infos.addAll(addInfo.values()); Collections.sort(infos); + postProcesses.forEach((postProcess) -> { + infos.forEach((info) -> { + info.setState(postProcess.apply(info)); + }); + }); infos.forEach((info) -> { if (canReplace.apply(world.getBlockState(info.getPos()))) { - BlockState state = postProcess.apply(info); - BlocksHelper.setWithoutUpdate(world, info.getPos(), state); + BlocksHelper.setWithoutUpdate(world, info.getPos(), info.getState()); } }); } @@ -295,17 +252,25 @@ public abstract class SDF { List infos = new ArrayList(mapWorld.values()); Collections.sort(infos); + postProcesses.forEach((postProcess) -> { + infos.forEach((info) -> { + info.setState(postProcess.apply(info)); + }); + }); infos.forEach((info) -> { - BlockState state = postProcess.apply(info); - world.setBlock(info.getPos(), state); + world.setBlock(info.getPos(), info.getState()); }); infos.clear(); infos.addAll(addInfo.values()); Collections.sort(infos); + postProcesses.forEach((postProcess) -> { + infos.forEach((info) -> { + info.setState(postProcess.apply(info)); + }); + }); infos.forEach((info) -> { - BlockState state = postProcess.apply(info); - world.setBlock(info.getPos(), state); + world.setBlock(info.getPos(), info.getState()); }); } } diff --git a/src/main/java/ru/betterend/world/features/bushes/BushFeature.java b/src/main/java/ru/betterend/world/features/bushes/BushFeature.java index 2e17a8f7..3c6e20bd 100644 --- a/src/main/java/ru/betterend/world/features/bushes/BushFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/BushFeature.java @@ -46,7 +46,7 @@ public class BushFeature extends DefaultFeature { sphere = new SDFDisplacement().setFunction((vec) -> { return MHelper.randRange(-2F, 2F, random); }).setSource(sphere); sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); sphere.setReplaceFunction(REPLACE); - sphere.setPostProcess((info) -> { + sphere.addPostProcess((info) -> { if (info.getState().getBlock() instanceof LeavesBlock) { int distance = info.getPos().getManhattanDistance(pos); if (distance < 7) { diff --git a/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java index 3fbd6742..3f31e6d9 100644 --- a/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java @@ -51,7 +51,7 @@ public class TenaneaBushFeature extends DefaultFeature { sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); sphere.setReplaceFunction(REPLACE); List support = Lists.newArrayList(); - sphere.setPostProcess((info) -> { + sphere.addPostProcess((info) -> { if (info.getState().getBlock() instanceof LeavesBlock) { int distance = info.getPos().getManhattanDistance(pos); if (distance < 7) { diff --git a/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java index 600f0ddf..8f9fa9e1 100644 --- a/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java @@ -43,7 +43,7 @@ public class FloatingSpireFeature extends SpireFeature { }).setSource(sdf); final BlockPos center = pos; List support = Lists.newArrayList(); - sdf.setReplaceFunction(REPLACE).setPostProcess((info) -> { + sdf.setReplaceFunction(REPLACE).addPostProcess((info) -> { if (info.getStateUp().isAir()) { if (random.nextInt(16) == 0) { support.add(info.getPos().up()); diff --git a/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java b/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java index 89513130..b7bb5f52 100644 --- a/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java @@ -69,7 +69,7 @@ public class IceStarFeature extends DefaultFeature { final BlockState ancient = EndBlocks.ANCIENT_EMERALD_ICE.getDefaultState(); final SDF sdfCopy = sdf; - sdf.setPostProcess((info) -> { + sdf.addPostProcess((info) -> { BlockPos bpos = info.getPos(); float px = bpos.getX() - center.getX(); float py = bpos.getY() - center.getY(); diff --git a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java index 99d697ee..d0197817 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java @@ -45,7 +45,7 @@ public class SpireFeature extends DefaultFeature { }).setSource(sdf); final BlockPos center = pos; List support = Lists.newArrayList(); - sdf.setReplaceFunction(REPLACE).setPostProcess((info) -> { + sdf.setReplaceFunction(REPLACE).addPostProcess((info) -> { if (info.getStateUp().isAir()) { if (random.nextInt(16) == 0) { support.add(info.getPos().up()); diff --git a/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java index a7bbce31..469c736b 100644 --- a/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java @@ -68,7 +68,7 @@ public class DragonTreeFeature extends DefaultFeature { }); function.setReplaceFunction(REPLACE); - function.setPostProcess(POST); + function.addPostProcess(POST); function.fillRecursiveIgnore(world, pos, IGNORE); return true; @@ -124,7 +124,7 @@ public class DragonTreeFeature extends DefaultFeature { sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 1.5F; }).setSource(sphere); sphere = new SDFDisplacement().setFunction((vec) -> { return random.nextFloat() * 3F - 1.5F; }).setSource(sphere); Mutable mut = new Mutable(); - sphere.setPostProcess((info) -> { + sphere.addPostProcess((info) -> { if (random.nextInt(5) == 0) { for (Direction dir: Direction.values()) { BlockState state = info.getState(dir, 2); diff --git a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java index bb2ad265..d71004cf 100644 --- a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java @@ -64,7 +64,7 @@ public class HelixTreeFeature extends DefaultFeature { dx = 30 * scale; float dy1 = -20 * scale; float dy2 = 100 * scale; - sdf.setPostProcess(POST).fillArea(world, pos, new Box(pos.add(-dx, dy1, -dx), pos.add(dx, dy2, dx))); + sdf.addPostProcess(POST).fillArea(world, pos, new Box(pos.add(-dx, dy1, -dx), pos.add(dx, dy2, dx))); SplineHelper.scale(spline, scale); SplineHelper.fillSplineForce(spline, world, EndBlocks.HELIX_TREE.bark.getDefaultState(), pos, (state) -> { return state.getMaterial().isReplaceable(); diff --git a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java index 4539d4d5..99912b1c 100644 --- a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java @@ -56,7 +56,7 @@ public class JellyshroomFeature extends DefaultFeature { final Vector3f last = spline.get(spline.size() - 1); cap = new SDFTranslate().setTranslate(last.getX(), last.getY(), last.getZ()).setSource(cap); sdf = new SDFSmoothUnion().setRadius(3F).setSourceA(sdf).setSourceB(cap); - sdf.setReplaceFunction(REPLACE).setPostProcess((info) -> { + sdf.setReplaceFunction(REPLACE).addPostProcess((info) -> { if (EndBlocks.JELLYSHROOM.isTreeLog(info.getState())) { if (EndBlocks.JELLYSHROOM.isTreeLog(info.getStateUp()) && EndBlocks.JELLYSHROOM.isTreeLog(info.getStateDown())) { return EndBlocks.JELLYSHROOM.log.getDefaultState(); diff --git a/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java b/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java index 41b3ea5e..79410baf 100644 --- a/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java @@ -58,7 +58,7 @@ public class LacugroveFeature extends DefaultFeature { }); function.setReplaceFunction(REPLACE); - function.setPostProcess(POST); + function.addPostProcess(POST); function.fillRecursive(world, pos); spline = spline.subList(4, 6); @@ -110,7 +110,7 @@ public class LacugroveFeature extends DefaultFeature { sphere = new SDFDisplacement().setFunction((vec) -> { return random.nextFloat() * 3F - 1.5F; }).setSource(sphere); sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius - 2, 0).setSource(sphere)); Mutable mut = new Mutable(); - sphere.setPostProcess((info) -> { + sphere.addPostProcess((info) -> { if (random.nextInt(5) == 0) { for (Direction dir: Direction.values()) { BlockState state = info.getState(dir, 2); diff --git a/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java index ee8a8f50..0a176f2d 100644 --- a/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java @@ -80,7 +80,7 @@ public class MossyGlowshroomFeature extends DefaultFeature { new SDFScale().setScale(scale) .setSource(FUNCTION) .setReplaceFunction(REPLACE) - .setPostProcess((info) -> { + .addPostProcess((info) -> { if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getState())) { if (random.nextBoolean() && info.getStateUp().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.getDefaultState().with(MossyGlowshroomCapBlock.TRANSITION, true)); diff --git a/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java index d608b14f..5e946403 100644 --- a/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java @@ -52,7 +52,7 @@ public class PythadendronTreeFeature extends DefaultFeature { return EndBlocks.PYTHADENDRON.bark.getDefaultState(); }); function.setReplaceFunction(REPLACE); - function.setPostProcess(POST); + function.addPostProcess(POST); function.fillRecursive(world, pos); return true; @@ -115,7 +115,7 @@ public class PythadendronTreeFeature extends DefaultFeature { sphere = new SDFDisplacement().setFunction((vec) -> { return random.nextFloat() * 3F - 1.5F; }).setSource(sphere); sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); Mutable mut = new Mutable(); - sphere.setPostProcess((info) -> { + sphere.addPostProcess((info) -> { if (random.nextInt(5) == 0) { for (Direction dir: Direction.values()) { BlockState state = info.getState(dir, 2); diff --git a/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java b/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java index 807da9f7..34de3b30 100644 --- a/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java @@ -89,7 +89,7 @@ public class TenaneaFeature extends DefaultFeature { BlockState outer = EndBlocks.TENANEA_OUTER_LEAVES.getDefaultState(); List support = Lists.newArrayList(); - sphere.setPostProcess((info) -> { + sphere.addPostProcess((info) -> { if (random.nextInt(6) == 0 && info.getStateDown().isAir()) { BlockPos d = info.getPos().down(); support.add(d); diff --git a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java index dd066c5d..afd979bd 100644 --- a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java @@ -100,7 +100,7 @@ public class UmbrellaTreeFeature extends DefaultFeature { sdf = new SDFScale().setScale(scale).setSource(sdf); } - sdf.setReplaceFunction(REPLACE).setPostProcess((info) -> { + sdf.setReplaceFunction(REPLACE).addPostProcess((info) -> { if (EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateUp()) && EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateDown())) { return EndBlocks.UMBRELLA_TREE.log.getDefaultState(); } diff --git a/src/main/java/ru/betterend/world/structures/features/StructureGiantIceStar.java b/src/main/java/ru/betterend/world/structures/features/StructureGiantIceStar.java index f1d157d3..2aa327df 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructureGiantIceStar.java +++ b/src/main/java/ru/betterend/world/structures/features/StructureGiantIceStar.java @@ -63,7 +63,7 @@ public class StructureGiantIceStar extends SDFStructureFeature { final BlockState ancient = EndBlocks.ANCIENT_EMERALD_ICE.getDefaultState(); final SDF sdfCopy = sdf; - return sdf.setPostProcess((info) -> { + return sdf.addPostProcess((info) -> { BlockPos bpos = info.getPos(); float px = bpos.getX() - center.getX(); float py = bpos.getY() - center.getY(); diff --git a/src/main/java/ru/betterend/world/structures/features/StructureGiantMossyGlowshroom.java b/src/main/java/ru/betterend/world/structures/features/StructureGiantMossyGlowshroom.java index 86c781e3..fdd7bbeb 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructureGiantMossyGlowshroom.java +++ b/src/main/java/ru/betterend/world/structures/features/StructureGiantMossyGlowshroom.java @@ -88,7 +88,7 @@ public class StructureGiantMossyGlowshroom extends SDFStructureFeature { return new SDFRound().setRadius(1.5F).setSource(new SDFScale() .setScale(scale) .setSource(function)) - .setPostProcess((info) -> { + .addPostProcess((info) -> { if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getState())) { if (random.nextBoolean() && info.getStateUp().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.getDefaultState().with(MossyGlowshroomCapBlock.TRANSITION, true)); From 18548f0ea4cd8c0f5290d41e2a5e5a2293a0e2ba Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 12 Jan 2021 21:13:17 +0300 Subject: [PATCH 141/463] Some fixes, Nightshade Redwood biome additions --- .../betterend/integration/byg/BYGBlocks.java | 2 + .../byg/biomes/NightshadeRedwoods.java | 10 +- .../integration/byg/features/BYGFeatures.java | 2 + .../features/GreatNightshadeTreeFeature.java | 184 ++++++++++++++++++ .../blockstates/nightshade_moss.json | 24 +++ .../assets/betterend/lang/en_us.json | 5 +- .../assets/betterend/lang/ru_ru.json | 5 +- .../models/block/nightshade_moss_01.json | 97 +++++++++ .../models/block/nightshade_moss_02.json | 64 ++++++ .../models/block/nightshade_moss_03.json | 64 ++++++ .../models/item/nightshade_moss.json | 6 + .../textures/block/nightshade_moss.png | Bin 0 -> 1929 bytes 12 files changed, 460 insertions(+), 3 deletions(-) create mode 100644 src/main/java/ru/betterend/integration/byg/features/GreatNightshadeTreeFeature.java create mode 100644 src/main/resources/assets/betterend/blockstates/nightshade_moss.json create mode 100644 src/main/resources/assets/betterend/models/block/nightshade_moss_01.json create mode 100644 src/main/resources/assets/betterend/models/block/nightshade_moss_02.json create mode 100644 src/main/resources/assets/betterend/models/block/nightshade_moss_03.json create mode 100644 src/main/resources/assets/betterend/models/item/nightshade_moss.json create mode 100644 src/main/resources/assets/betterend/textures/block/nightshade_moss.png diff --git a/src/main/java/ru/betterend/integration/byg/BYGBlocks.java b/src/main/java/ru/betterend/integration/byg/BYGBlocks.java index 27717ff7..55844e08 100644 --- a/src/main/java/ru/betterend/integration/byg/BYGBlocks.java +++ b/src/main/java/ru/betterend/integration/byg/BYGBlocks.java @@ -7,6 +7,8 @@ import ru.betterend.registry.EndBlocks; public class BYGBlocks { public static final Block IVIS_MOSS = EndBlocks.registerBlock("ivis_moss", new EndWallPlantBlock()); + public static final Block NIGHTSHADE_MOSS = EndBlocks.registerBlock("nightshade_moss", new EndWallPlantBlock()); + public static final Block IVIS_VINE = EndBlocks.registerBlock("ivis_vine", new VineBlock()); public static void register() {} diff --git a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java index bdc95139..525b433a 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java @@ -8,6 +8,7 @@ import net.minecraft.sound.SoundEvent; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeEffects; import net.minecraft.world.biome.SpawnSettings.SpawnEntry; +import net.minecraft.world.gen.GenerationStep.Feature; import ru.betterend.BetterEnd; import ru.betterend.integration.Integrations; import ru.betterend.integration.byg.features.BYGFeatures; @@ -34,7 +35,9 @@ public class NightshadeRedwoods extends EndBiome { .setGrassColor(48, 13, 89) .setPlantsColor(200, 125, 9) .addFeature(EndFeatures.END_LAKE_RARE) - .addFeature(BYGFeatures.NIGHTSHADE_REDWOOD_TREE); + .addFeature(BYGFeatures.NIGHTSHADE_REDWOOD_TREE) + .addFeature(BYGFeatures.NIGHTSHADE_MOSS_WOOD) + .addFeature(BYGFeatures.NIGHTSHADE_MOSS); if (BetterEnd.isClient()) { SoundEvent loop = effects.getLoopSound().get(); @@ -43,6 +46,11 @@ public class NightshadeRedwoods extends EndBiome { SoundEvent mood = effects.getMoodSound().get().getSound(); def.setLoop(loop).setMusic(music).setAdditions(additions).setMood(mood); } + biome.getGenerationSettings().getFeatures().forEach((list) -> { + list.forEach((feature) -> { + def.addFeature(Feature.VEGETAL_DECORATION, feature.get()); + }); + }); for (SpawnGroup group: SpawnGroup.values()) { List list = biome.getSpawnSettings().getSpawnEntry(group); diff --git a/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java b/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java index 28b28ece..1f21a35c 100644 --- a/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java +++ b/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java @@ -17,6 +17,8 @@ public class BYGFeatures { public static final EndFeature IVIS_MOSS_WOOD = new EndFeature("ivis_moss_wood", new WallPlantOnLogFeature(BYGBlocks.IVIS_MOSS, 6), 15); public static final EndFeature BULBIS_ODDITY = new EndFeature("bulbis_oddity", new SinglePlantFeature(Integrations.BYG.getBlock("bulbis_oddity"), 4, 4), 5); public static final EndFeature PURPLE_BULBIS_ODDITY = new EndFeature("purple_bulbis_oddity", new SinglePlantFeature(Integrations.BYG.getBlock("purple_bulbis_oddity"), 4, 4), 5); + public static final EndFeature NIGHTSHADE_MOSS = new EndFeature("nightshade_moss", new WallPlantFeature(BYGBlocks.NIGHTSHADE_MOSS, 5), 2); + public static final EndFeature NIGHTSHADE_MOSS_WOOD = new EndFeature("nightshade_moss_wood", new WallPlantOnLogFeature(BYGBlocks.NIGHTSHADE_MOSS, 5), 8); public static final EndFeature NIGHTSHADE_REDWOOD_TREE = new EndFeature("nightshade_redwood_tree", new NightshadeRedwoodTreeFeature(), 1); public static final EndFeature BIG_ETHER_TREE = new EndFeature("big_ether_tree", new BigEtherTreeFeature(), 1); diff --git a/src/main/java/ru/betterend/integration/byg/features/GreatNightshadeTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/GreatNightshadeTreeFeature.java new file mode 100644 index 00000000..2894ea39 --- /dev/null +++ b/src/main/java/ru/betterend/integration/byg/features/GreatNightshadeTreeFeature.java @@ -0,0 +1,184 @@ +package ru.betterend.integration.byg.features; + +import java.util.List; +import java.util.Random; + +import com.google.common.base.Function; +import com.google.common.collect.Lists; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.LeavesBlock; +import net.minecraft.block.Material; +import net.minecraft.client.util.math.Vector3f; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.util.math.Direction; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.integration.Integrations; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; +import ru.betterend.util.SplineHelper; +import ru.betterend.util.sdf.PosInfo; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFDisplacement; +import ru.betterend.util.sdf.operator.SDFFlatWave; +import ru.betterend.util.sdf.operator.SDFSmoothUnion; +import ru.betterend.util.sdf.primitive.SDFCappedCone; +import ru.betterend.util.sdf.primitive.SDFSphere; +import ru.betterend.world.features.DefaultFeature; + +public class GreatNightshadeTreeFeature extends DefaultFeature { + private static final List BRANCH; + + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; + + BlockState log = Integrations.BYG.getDefaultState("nightshade_log"); + BlockState wood = Integrations.BYG.getDefaultState("nightshade_wood"); + BlockState leaves = Integrations.BYG.getDefaultState("nightshade_leaves"); + BlockState leaves_flower = Integrations.BYG.getDefaultState("flowering_nightshade_leaves"); + + Function splinePlacer = (bpos) -> { return log; }; + Function replace = (state) -> { + return state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) || state.getMaterial().isReplaceable(); + }; + Function post = (info) -> { + if (info.getState().equals(log) && (!info.getStateUp().equals(log) || !info.getStateDown().equals(log))) { + return wood; + } + return info.getState(); + }; + Function ignore = (state) -> { + return state.equals(log) || state.equals(wood); + }; + + int height = MHelper.randRange(40, 60, random); + List trunk = SplineHelper.makeSpline(0, 0, 0, 0, height, 0, height / 4); + SplineHelper.offsetParts(trunk, random, 0.8F, 0, 0.8F); + + if (!SplineHelper.canGenerate(trunk, pos, world, replace)) { + return false; + } + + int count = height >> 2; + float start = trunk.size() / 3F; + float delta = trunk.size() * 0.6F; + float max = height - 7; + for (int i = 0; i < count; i++) { + float scale = (float) (count - i) / count * 15; + Vector3f offset = SplineHelper.getPos(trunk, (float) i / count * delta + start); + if (offset.getY() > max) { + break; + } + List branch = SplineHelper.copySpline(BRANCH); + SplineHelper.rotateSpline(branch, i * 1.3F); + SplineHelper.scale(branch, scale); + SplineHelper.offsetParts(branch, random, 0.3F, 0.3F, 0.3F); + SplineHelper.offset(branch, offset); + SplineHelper.fillSpline(branch, world, wood, pos, replace); + } + SplineHelper.fillSpline(trunk, world, log, pos, ignore); + + SDF sdf = SplineHelper.buildSDF(trunk, 2.3F, 0.8F, splinePlacer); + SDF roots = new SDFSphere().setRadius(2F).setBlock(log); + roots = new SDFFlatWave().setIntensity(2F).setRaysCount(MHelper.randRange(5, 7, random)).setAngle(random.nextFloat() * MHelper.PI2).setSource(roots); + sdf = new SDFSmoothUnion().setRadius(2F).setSourceA(sdf).setSourceB(roots); + sdf.setReplaceFunction(replace).addPostProcess(post).fillRecursive(world, pos); + Vector3f last = SplineHelper.getPos(trunk, trunk.size() - 1.75F); + for (int y = 0; y < 8; y++) { + BlockPos p = pos.add(last.getX() + 0.5, last.getY() + y, last.getZ() + 0.5); + BlocksHelper.setWithoutUpdate(world, p, y == 4 ? wood : log); + } + + for (int y = 0; y < 16; y++) { + BlockPos p = pos.add(last.getX() + 0.5, last.getY() + y, last.getZ() + 0.5); + if (world.isAir(p)) { + BlocksHelper.setWithoutUpdate(world, p, leaves); + } + float radius = (1 - y / 16F) * 3F; + int rad = (int) (radius + 1); + radius *= radius; + for (int x = -rad; x <= rad; x++) { + int x2 = x * x; + for (int z = -rad; z <= rad; z++) { + int z2 = z * z; + if (x2 + z2 < radius - random.nextFloat() * rad) { + BlockPos lp = p.add(x, 0, z); + if (world.isAir(lp)) { + BlocksHelper.setWithoutUpdate(world, lp, leaves); + } + } + } + } + } + + Mutable mut = new Mutable(); + Function leavesPost1 = (info) -> { + if (info.getState().equals(log) || info.getState().equals(wood)) { + for (int x = -6; x < 7; x++) { + int ax = Math.abs(x); + mut.setX(x + info.getPos().getX()); + for (int z = -6; z < 7; z++) { + int az = Math.abs(z); + mut.setZ(z + info.getPos().getZ()); + for (int y = -6; y < 7; y++) { + int ay = Math.abs(y); + int d = ax + ay + az; + if (d < 7) { + mut.setY(y + info.getPos().getY()); + BlockState state = info.getState(mut); + if (state.getBlock() instanceof LeavesBlock) { + int distance = state.get(LeavesBlock.DISTANCE); + if (d < distance) { + info.setState(mut, state.with(LeavesBlock.DISTANCE, d)); + } + } + } + } + } + } + } + return info.getState(); + }; + Function leavesPost2 = (info) -> { + if (info.getState().getBlock() instanceof LeavesBlock) { + int distance = info.getState().get(LeavesBlock.DISTANCE); + if (distance > MHelper.randRange(2, 4, random)) { + return Blocks.AIR.getDefaultState(); + } + for (Direction d: BlocksHelper.DIRECTIONS) { + int airCount = 0; + if (info.getState(d).isAir()) { + airCount ++; + } + if (airCount > 5) { + return Blocks.AIR.getDefaultState(); + } + } + if (random.nextInt(8) == 0) { + return leaves_flower.with(LeavesBlock.DISTANCE, distance); + } + } + return info.getState(); + }; + + SDF canopy = new SDFCappedCone().setRadius1(12F).setRadius2(1f).setHeight(height * 0.3F).setBlock(leaves); + canopy = new SDFDisplacement().setFunction((vec) -> { return MHelper.randRange(-3F, 3F, random); }).setSource(canopy); + canopy.addPostProcess(leavesPost1).addPostProcess(leavesPost2).fillRecursiveIgnore(world, pos.add(0, height * 0.75, 0), ignore); + + return true; + } + + static { + BRANCH = Lists.newArrayList(new Vector3f(0, 0, 0), + new Vector3f(0.25F, 0.1F, 0), + new Vector3f(0.40F, 0.2F, 0), + new Vector3f(0.50F, 0.4F, 0), + new Vector3f(0.55F, 0.6F, 0)); + } +} diff --git a/src/main/resources/assets/betterend/blockstates/nightshade_moss.json b/src/main/resources/assets/betterend/blockstates/nightshade_moss.json new file mode 100644 index 00000000..3e588500 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/nightshade_moss.json @@ -0,0 +1,24 @@ +{ + "variants": { + "facing=north": [ + { "model": "betterend:block/nightshade_moss_01", "y": 180 }, + { "model": "betterend:block/nightshade_moss_02", "y": 180 }, + { "model": "betterend:block/nightshade_moss_03", "y": 180 } + ], + "facing=south": [ + { "model": "betterend:block/nightshade_moss_01" }, + { "model": "betterend:block/nightshade_moss_02" }, + { "model": "betterend:block/nightshade_moss_03" } + ], + "facing=east": [ + { "model": "betterend:block/nightshade_moss_01", "y": 270 }, + { "model": "betterend:block/nightshade_moss_02", "y": 270 }, + { "model": "betterend:block/nightshade_moss_03", "y": 270 } + ], + "facing=west": [ + { "model": "betterend:block/nightshade_moss_01", "y": 90 }, + { "model": "betterend:block/nightshade_moss_02", "y": 90 }, + { "model": "betterend:block/nightshade_moss_03", "y": 90 } + ] + } +} diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index c55118c5..ddfa5ebd 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -561,5 +561,8 @@ "block.betterend.umbrella_tree_sapling": "Umbrella Tree Sapling", "item.betterend.umbrella_cluster_juice": "Umbrella Cluster Juice", "block.betterend.blossom_berry_seed": "Blossom Berry Seed", - "item.betterend.blossom_berry": "Blossom Berry" + "item.betterend.blossom_berry": "Blossom Berry", + + "biome.betterend.nightshade_redwoods": "Nightshade Redwoods", + "block.betterend.nightshade_moss": "Nightshade Moss" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 2ede618f..97b67028 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -563,5 +563,8 @@ "block.betterend.umbrella_tree_sapling": "Саженец зонтичного дерева", "item.betterend.umbrella_cluster_juice": "Сок зонтичного кластера", "block.betterend.blossom_berry_seed": "Семя цветущей ягоды", - "item.betterend.blossom_berry": "Цветущая ягода" + "item.betterend.blossom_berry": "Цветущая ягода", + + "biome.betterend.nightshade_redwoods": "Теневой Секвойник", + "block.betterend.nightshade_moss": "Теневой мох" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/nightshade_moss_01.json b/src/main/resources/assets/betterend/models/block/nightshade_moss_01.json new file mode 100644 index 00000000..7eba80b6 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/nightshade_moss_01.json @@ -0,0 +1,97 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/nightshade_moss", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 3, 15, 0 ], + "to": [ 19, 15.001, 16 ], + "rotation": { "origin": [ 3, 15, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, 11, 0 ], + "to": [ 17, 11.001, 16 ], + "rotation": { "origin": [ 1, 11, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, -10, 0 ], + "to": [ 17, 6, 0.001 ], + "rotation": { "origin": [ 1, 6, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -3, 13.5, 0 ], + "to": [ 13, 13.501, 16 ], + "rotation": { "origin": [ -3, 13.5, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, 1, 0 ], + "to": [ 17, 1.001, 16 ], + "rotation": { "origin": [ 1, 1, 0 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -1, -9, 0 ], + "to": [ 15, 7, 0.001 ], + "rotation": { "origin": [ -1, 7, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -1.5, 16, 0 ], + "to": [ 14.5, 16.001, 16 ], + "rotation": { "origin": [ -1.5, 16, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -2, 0.5, 0 ], + "to": [ 14, 0.501, 16 ], + "rotation": { "origin": [ -2, 0.5, 0 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/nightshade_moss_02.json b/src/main/resources/assets/betterend/models/block/nightshade_moss_02.json new file mode 100644 index 00000000..3cf1ec95 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/nightshade_moss_02.json @@ -0,0 +1,64 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/nightshade_moss", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 3, 15, 0 ], + "to": [ 19, 15.001, 16 ], + "rotation": { "origin": [ 3, 15, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -15, 0 ], + "to": [ 16, 1, 0.001 ], + "rotation": { "origin": [ 0, 1, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -2, -12, 0 ], + "to": [ 14, 4, 0.001 ], + "rotation": { "origin": [ -2, 4, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -9, 0 ], + "to": [ 16, 7, 0.001 ], + "rotation": { "origin": [ 0, 7, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -3, 0 ], + "to": [ 16, 13, 0.001 ], + "rotation": { "origin": [ 0, 13, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/nightshade_moss_03.json b/src/main/resources/assets/betterend/models/block/nightshade_moss_03.json new file mode 100644 index 00000000..4f2147e3 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/nightshade_moss_03.json @@ -0,0 +1,64 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/nightshade_moss", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ -1, 0, 0 ], + "to": [ 15, 16, 0.001 ], + "rotation": { "origin": [ -1, 16, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 2, -3, 0 ], + "to": [ 18, 13, 0.001 ], + "rotation": { "origin": [ 2, 13, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -8, 0 ], + "to": [ 16, 8, 0.001 ], + "rotation": { "origin": [ 0, 8, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -3, -12, 0 ], + "to": [ 13, 4, 0.001 ], + "rotation": { "origin": [ -3, 4, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 3, -15, 0 ], + "to": [ 19, 1, 0.001 ], + "rotation": { "origin": [ 3, 1, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/nightshade_moss.json b/src/main/resources/assets/betterend/models/item/nightshade_moss.json new file mode 100644 index 00000000..a6d07bee --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/nightshade_moss.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/nightshade_moss" + } +} diff --git a/src/main/resources/assets/betterend/textures/block/nightshade_moss.png b/src/main/resources/assets/betterend/textures/block/nightshade_moss.png new file mode 100644 index 0000000000000000000000000000000000000000..5d7cb6227e4fffa19f6ae15fc2e6cf20b945e6f9 GIT binary patch literal 1929 zcmbVNeQeZZ94;htKyDL~$%jU5ib2fi_2YWIUfr?GyTKN{aoG+*6L4?acXxGnZE3sR zZA4Ks3?oP+vY|i}{?I@~bjHuXz{q3?-y@P>CPBg^^8?u+glr=C_I5jm8Mt^!uW#Gu zeV*s{(O+95Rf`LzJva@+u!72pP&GPFcaACdq5ns(-3I71)u?#R!mz?F=a|%1T=)=% z<@Ko1<@WOMGoq{~-9XVL=uRgMgvPLv(zF5OdT8SkjHz0HxU%mcfvZY@Smq7WVIv6R zYDKdNYnrQ~a&x`xSBTPucu87B1W9NEJe^EvmY5C@8D0^so!b)8fNQh^>qi&X%DtgsGVl1oUN6UqhaSPb5j;w@P}P1 zXbhXQvNBW_6^>rs)KOIgiq;D<9&^! zy7TeQ!rE=e-&nEb;*9Rnlqiu-YM<8wR5(6!?joPuC`rx zZ%ts|?>n}|+}(4B>r*eyDRixW_x(k!lfQMX-#e>4E$sfh^ZM%_U%5YTMtn}ujTIXg z? z`C>s^ME=CJar==dz0Yr*DIHt4;6h(l Date: Tue, 12 Jan 2021 21:20:22 +0300 Subject: [PATCH 142/463] Biome edges offset fix --- .../world/generator/TerrainGenerator.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index 93cd0b2a..506fa2d9 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -88,13 +88,13 @@ public class TerrainGenerator { public static boolean isLand(int x, int z) { LOCKER.lock(); - x >>= 1; - z >>= 1; + double px = (x >> 1) + 0.5; + double pz = (z >> 1) + 0.5; - double distortion1 = noise1.eval(x * 0.1, z * 0.1) * 20 + noise2.eval(x * 0.2, z * 0.2) * 10 + noise1.eval(x * 0.4, z * 0.4) * 5; - double distortion2 = noise2.eval(x * 0.1, z * 0.1) * 20 + noise1.eval(x * 0.2, z * 0.2) * 10 + noise2.eval(x * 0.4, z * 0.4) * 5; - double px = (double) x * SCALE_XZ + distortion1; - double pz = (double) z * SCALE_XZ + distortion2; + double distortion1 = noise1.eval(px * 0.1, pz * 0.1) * 20 + noise2.eval(px * 0.2, pz * 0.2) * 10 + noise1.eval(px * 0.4, pz * 0.4) * 5; + double distortion2 = noise2.eval(px * 0.1, pz * 0.1) * 20 + noise1.eval(px * 0.2, pz * 0.2) * 10 + noise2.eval(px * 0.4, pz * 0.4) * 5; + px = px * SCALE_XZ + distortion1; + pz = pz * SCALE_XZ + distortion2; largeIslands.updatePositions(px, pz); mediumIslands.updatePositions(px, pz); @@ -121,9 +121,9 @@ public class TerrainGenerator { } /** - * Check if this is land - * @param x - biome pos x - * @param z - biome pos z + * Get something like height + * @param x - block pos x + * @param z - block pos z */ public static int getHeight(int x, int z) { LOCKER.lock(); From 878f4bbe631fa3304ac3c715a35fc42682a883ae Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 13 Jan 2021 03:55:47 +0300 Subject: [PATCH 143/463] End slime refactor & lake variant --- .../ru/betterend/entity/EntityCubozoa.java | 1 - .../ru/betterend/entity/EntityEndSlime.java | 41 +++++++- .../entity/model/EndSlimeEntityModel.java | 63 ++++++++++++ .../entity/render/RendererEntityEndSlime.java | 96 +++++++++++++++--- .../betterend/world/biome/BiomeMegalake.java | 1 + .../world/biome/BiomeMegalakeGrove.java | 1 + .../entity/{ => end_slime}/end_slime.png | Bin .../entity/{ => end_slime}/end_slime_glow.png | Bin .../entity/end_slime/end_slime_lake.png | Bin 0 -> 6056 bytes .../entity/end_slime/end_slime_lake_glow.png | Bin 0 -> 2320 bytes .../{ => end_slime}/end_slime_mossy.png | Bin 11 files changed, 182 insertions(+), 21 deletions(-) create mode 100644 src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java rename src/main/resources/assets/betterend/textures/entity/{ => end_slime}/end_slime.png (100%) rename src/main/resources/assets/betterend/textures/entity/{ => end_slime}/end_slime_glow.png (100%) create mode 100644 src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_lake.png create mode 100644 src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_lake_glow.png rename src/main/resources/assets/betterend/textures/entity/{ => end_slime}/end_slime_mossy.png (100%) diff --git a/src/main/java/ru/betterend/entity/EntityCubozoa.java b/src/main/java/ru/betterend/entity/EntityCubozoa.java index e2cf0812..25f79963 100644 --- a/src/main/java/ru/betterend/entity/EntityCubozoa.java +++ b/src/main/java/ru/betterend/entity/EntityCubozoa.java @@ -45,7 +45,6 @@ public class EntityCubozoa extends SchoolingFishEntity { public EntityCubozoa(EntityType entityType, World world) { super(entityType, world); - //this.moveControl = new CubozoaMoveControl(this); } @Override diff --git a/src/main/java/ru/betterend/entity/EntityEndSlime.java b/src/main/java/ru/betterend/entity/EntityEndSlime.java index b651ac72..b1ad4440 100644 --- a/src/main/java/ru/betterend/entity/EntityEndSlime.java +++ b/src/main/java/ru/betterend/entity/EntityEndSlime.java @@ -42,9 +42,10 @@ import ru.betterend.interfaces.ISlime; import ru.betterend.registry.EndBiomes; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; +import ru.betterend.world.biome.EndBiome; public class EntityEndSlime extends SlimeEntity { - private static final TrackedData MOSSY = DataTracker.registerData(EntityEndSlime.class, TrackedDataHandlerRegistry.BOOLEAN); + private static final TrackedData VARIANT = DataTracker.registerData(EntityEndSlime.class, TrackedDataHandlerRegistry.BYTE); private static final Mutable POS = new Mutable(); public EntityEndSlime(EntityType entityType, World world) { @@ -74,9 +75,13 @@ public class EntityEndSlime extends SlimeEntity { @Override public EntityData initialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, EntityData entityData, CompoundTag entityTag) { EntityData data = super.initialize(world, difficulty, spawnReason, entityData, entityTag); - if (EndBiomes.getFromBiome(world.getBiome(getBlockPos())) == EndBiomes.FOGGY_MUSHROOMLAND) { + EndBiome biome = EndBiomes.getFromBiome(world.getBiome(getBlockPos())); + if (biome == EndBiomes.FOGGY_MUSHROOMLAND) { this.setMossy(true); } + else if (biome == EndBiomes.MEGALAKE || biome == EndBiomes.MEGALAKE_GROVE) { + this.setLake(true); + } this.calculateDimensions(); return data; } @@ -84,7 +89,21 @@ public class EntityEndSlime extends SlimeEntity { @Override protected void initDataTracker() { super.initDataTracker(); - this.dataTracker.startTracking(MOSSY, false); + this.dataTracker.startTracking(VARIANT, (byte) 0); + } + + @Override + public void writeCustomDataToTag(CompoundTag tag) { + super.writeCustomDataToTag(tag); + tag.putByte("Variant", (byte) getSlimeType()); + } + + @Override + public void readCustomDataFromTag(CompoundTag tag) { + super.readCustomDataFromTag(tag); + if (tag.contains("Variant")) { + this.dataTracker.set(VARIANT, tag.getByte("Variant")); + } } @Override @@ -140,12 +159,24 @@ public class EntityEndSlime extends SlimeEntity { this.world.spawnEntity(drop); } + public int getSlimeType() { + return this.dataTracker.get(VARIANT).intValue(); + } + protected void setMossy(boolean mossy) { - this.dataTracker.set(MOSSY, mossy); + this.dataTracker.set(VARIANT, (byte) 1); } public boolean isMossy() { - return this.dataTracker.get(MOSSY); + return this.dataTracker.get(VARIANT) == 1; + } + + protected void setLake(boolean mossy) { + this.dataTracker.set(VARIANT, (byte) 2); + } + + public boolean isLake() { + return this.dataTracker.get(VARIANT) == 2; } public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { diff --git a/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java new file mode 100644 index 00000000..dfea3069 --- /dev/null +++ b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java @@ -0,0 +1,63 @@ +package ru.betterend.entity.model; + +import com.google.common.collect.ImmutableList; + +import net.minecraft.client.model.ModelPart; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.entity.model.CompositeEntityModel; +import net.minecraft.client.util.math.MatrixStack; +import ru.betterend.entity.EntityEndSlime; + +public class EndSlimeEntityModel extends CompositeEntityModel { + private final ModelPart flower; + private final ModelPart innerCube; + private final ModelPart rightEye; + private final ModelPart leftEye; + private final ModelPart mouth; + + public EndSlimeEntityModel(boolean onlyShell, int type) { + super(RenderLayer::getEntityCutout); + + this.innerCube = new ModelPart(this, 0, 16); + this.rightEye = new ModelPart(this, 32, 0); + this.leftEye = new ModelPart(this, 32, 4); + this.mouth = new ModelPart(this, 32, 8); + this.flower = new ModelPart(this); + + if (onlyShell) { + this.innerCube.setTextureOffset(0, 0); + this.innerCube.addCuboid(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F); + } + else { + this.innerCube.addCuboid(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F); + this.rightEye.addCuboid(-3.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); + this.leftEye.addCuboid(1.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); + this.mouth.addCuboid(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.0F); + + for (int i = 0; i < 4; i++) { + ModelPart petalRot = new ModelPart(this); + petalRot.yaw = i * 45F; + + ModelPart petal = new ModelPart(this, 40, 0); + petal.setPivot(-4, 8, 0); + petal.addCuboid(0.0F, 0.0F, 0.0F, 8.0F, 8.0F, 0.0F, 0.0F); + + this.flower.addChild(petalRot); + petalRot.addChild(petal); + } + } + } + + @Override + public void setAngles(T entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) {} + + public void renderFlower(MatrixStack matrices, VertexConsumer vertices, int light, int overlay) { + flower.render(matrices, vertices, light, overlay); + } + + @Override + public Iterable getParts() { + return ImmutableList.of(this.innerCube, this.rightEye, this.leftEye, this.mouth); + } +} diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java index bdf2229a..8cc8f7c3 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java @@ -1,32 +1,98 @@ package ru.betterend.entity.render; +import net.minecraft.client.render.OverlayTexture; import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.client.render.entity.SlimeEntityRenderer; +import net.minecraft.client.render.entity.LivingEntityRenderer; +import net.minecraft.client.render.entity.MobEntityRenderer; import net.minecraft.client.render.entity.feature.EyesFeatureRenderer; -import net.minecraft.client.render.entity.model.SlimeEntityModel; -import net.minecraft.entity.mob.SlimeEntity; +import net.minecraft.client.render.entity.feature.FeatureRenderer; +import net.minecraft.client.render.entity.feature.FeatureRendererContext; +import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.Identifier; +import net.minecraft.util.math.MathHelper; import ru.betterend.BetterEnd; import ru.betterend.entity.EntityEndSlime; +import ru.betterend.entity.model.EndSlimeEntityModel; -public class RendererEntityEndSlime extends SlimeEntityRenderer { - private static final Identifier TEXTURE = BetterEnd.makeID("textures/entity/end_slime.png"); - private static final Identifier TEXTURE_MOSSY = BetterEnd.makeID("textures/entity/end_slime_mossy.png"); - private static final RenderLayer GLOW = RenderLayer.getEyes(BetterEnd.makeID("textures/entity/end_slime_glow.png")); +public class RendererEntityEndSlime extends MobEntityRenderer> { + private static final Identifier TEXTURE[] = new Identifier[3]; + private static final RenderLayer GLOW[] = new RenderLayer[3]; public RendererEntityEndSlime(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher); - this.addFeature(new EyesFeatureRenderer>(this) { + super(entityRenderDispatcher, new EndSlimeEntityModel(false, 0), 0.25F); + this.addFeature(new OverlayFeatureRenderer(this)); + this.addFeature(new EyesFeatureRenderer>(this) { @Override public RenderLayer getEyesTexture() { - return GLOW; + return GLOW[0]; + } + + @Override + public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, EntityEndSlime entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { + VertexConsumer vertexConsumer = vertexConsumers.getBuffer(GLOW[entity.getSlimeType()]); + this.getContextModel().render(matrices, vertexConsumer, 15728640, OverlayTexture.DEFAULT_UV, 1.0F, 1.0F, 1.0F, 1.0F); + if (entity.isLake()) { + this.getContextModel().renderFlower(matrices, vertexConsumer, 15728640, OverlayTexture.DEFAULT_UV); + } } }); } - - @Override - public Identifier getTexture(SlimeEntity entity) { - return ((EntityEndSlime) entity).isMossy() ? TEXTURE_MOSSY : TEXTURE; - } + + @Override + public Identifier getTexture(EntityEndSlime entity) { + return TEXTURE[entity.getSlimeType()]; + } + + @Override + public void render(EntityEndSlime slimeEntity, float f, float g, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i) { + this.shadowRadius = 0.25F * (float) slimeEntity.getSize(); + super.render(slimeEntity, f, g, matrixStack, vertexConsumerProvider, i); + } + + @Override + protected void scale(EntityEndSlime slimeEntity, MatrixStack matrixStack, float f) { + matrixStack.scale(0.999F, 0.999F, 0.999F); + matrixStack.translate(0.0D, 0.0010000000474974513D, 0.0D); + float h = (float) slimeEntity.getSize(); + float i = MathHelper.lerp(f, slimeEntity.lastStretch, slimeEntity.stretch) / (h * 0.5F + 1.0F); + float j = 1.0F / (i + 1.0F); + matrixStack.scale(j * h, 1.0F / j * h, j * h); + } + + private final class OverlayFeatureRenderer extends FeatureRenderer> { + private final EndSlimeEntityModel modelOrdinal = new EndSlimeEntityModel(true, 0); + private final EndSlimeEntityModel modelLake = new EndSlimeEntityModel(true, 1); + + public OverlayFeatureRenderer(FeatureRendererContext> featureRendererContext) { + super(featureRendererContext); + } + + public void render(MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, T livingEntity, float f, float g, float h, float j, float k, float l) { + if (!livingEntity.isInvisible()) { + if (livingEntity.isLake()) { + VertexConsumer vertexConsumer = vertexConsumerProvider.getBuffer(RenderLayer.getEntityCutout(this.getTexture(livingEntity))); + this.getContextModel().renderFlower(matrixStack, vertexConsumer, i, LivingEntityRenderer.getOverlay(livingEntity, 0.0F)); + } + + EndSlimeEntityModel model = livingEntity.getSlimeType() == 1 ? modelLake : modelOrdinal; + this.getContextModel().copyStateTo(model); + model.animateModel(livingEntity, f, g, h); + model.setAngles(livingEntity, f, g, j, k, l); + VertexConsumer vertexConsumer = vertexConsumerProvider.getBuffer(RenderLayer.getEntityTranslucent(this.getTexture(livingEntity))); + model.render(matrixStack, vertexConsumer, i, LivingEntityRenderer.getOverlay(livingEntity, 0.0F), 1.0F, 1.0F, 1.0F, 1.0F); + } + } + } + + static { + TEXTURE[0] = BetterEnd.makeID("textures/entity/end_slime/end_slime.png"); + TEXTURE[1] = BetterEnd.makeID("textures/entity/end_slime/end_slime_mossy.png"); + TEXTURE[2] = BetterEnd.makeID("textures/entity/end_slime/end_slime_lake.png"); + GLOW[0] = RenderLayer.getEyes(BetterEnd.makeID("textures/entity/end_slime/end_slime_glow.png")); + GLOW[1] = GLOW[0]; + GLOW[2] = RenderLayer.getEyes(BetterEnd.makeID("textures/entity/end_slime/end_slime_lake_glow.png")); + } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/world/biome/BiomeMegalake.java b/src/main/java/ru/betterend/world/biome/BiomeMegalake.java index 86ed7887..9b740291 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeMegalake.java +++ b/src/main/java/ru/betterend/world/biome/BiomeMegalake.java @@ -31,6 +31,7 @@ public class BiomeMegalake extends EndBiome { .addMobSpawn(EndEntities.DRAGONFLY, 50, 1, 3) .addMobSpawn(EndEntities.END_FISH, 50, 3, 8) .addMobSpawn(EndEntities.CUBOZOA, 50, 3, 8) + .addMobSpawn(EndEntities.END_SLIME, 5, 1, 2) .addMobSpawn(EntityType.ENDERMAN, 10, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/BiomeMegalakeGrove.java b/src/main/java/ru/betterend/world/biome/BiomeMegalakeGrove.java index 2404e851..b8a0e01b 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeMegalakeGrove.java +++ b/src/main/java/ru/betterend/world/biome/BiomeMegalakeGrove.java @@ -34,6 +34,7 @@ public class BiomeMegalakeGrove extends EndBiome { .addMobSpawn(EndEntities.DRAGONFLY, 20, 1, 3) .addMobSpawn(EndEntities.END_FISH, 20, 3, 8) .addMobSpawn(EndEntities.CUBOZOA, 50, 3, 8) + .addMobSpawn(EndEntities.END_SLIME, 5, 1, 2) .addMobSpawn(EntityType.ENDERMAN, 10, 1, 2)); } } diff --git a/src/main/resources/assets/betterend/textures/entity/end_slime.png b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime.png similarity index 100% rename from src/main/resources/assets/betterend/textures/entity/end_slime.png rename to src/main/resources/assets/betterend/textures/entity/end_slime/end_slime.png diff --git a/src/main/resources/assets/betterend/textures/entity/end_slime_glow.png b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_glow.png similarity index 100% rename from src/main/resources/assets/betterend/textures/entity/end_slime_glow.png rename to src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_glow.png diff --git a/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_lake.png b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_lake.png new file mode 100644 index 0000000000000000000000000000000000000000..080fd4b6a1f39735412c81cbf51ee641cd55c894 GIT binary patch literal 6056 zcmb_g2UJsAx;~*75iAHIN(|D35E4R3=u#~dDVHL}kOUGT2@;SV0!R@=P(T!=ND%=6 zMFm74z?E_VX;K6fP^2hQq$oWvc)h-vSu^uy&3b3$oPEyT-~Rsg?Y-B^6$>+C0X{K4 z000C|niyEJS~~02<>6vId-_8|Sq-n3i9Hnn`1kGHARz6oC;)KXBU;<}*qNR|V<{v> z436T8SM(=&vCsgZspId3!Fu3*z^-_AB3TPE|AGMl6LDG)TNP6!Q!jlyfoKxwjkgLk zv&IH`U{N@Tjy71+AI%~l;e9Y*f08GeiuTun{NP2i-gmlT5bzI(kB1gSZ^t0m&eQ^| zPw~csRTNdBSU3^^RzoSmRh3W(qyiYB1XqJ8slnjNP$f88NfoV(0{^@qENk94H?*aJ z(N9~fFD(ec$Hxl|gZcUSDf%fZQoP+^a1;s!Q$oNH2q+5yr3R3FF#b?7Rq`(e13VS$ zP4x01Qpn&PMvN=P*GCJ&^7PLTNM65a$<&`|VkHdbkMV-R6_s{E`T@jYf8o4*y*+;z z$6;Z3Pdo`v_Mx({@LyOj0>y_yB~bna^{?T-Gr&r%sp&5p|I`-}>6ZzrkKrX&7(Wy8 zPtjEC053eu5>KW0dSmg1msoB}?nL8-*7wF^d??=56pH6xg|hg|Ww5^fPGQu+vbIDr zj^am^`i&EW<4Clz(_( zYKlHdrutyWSo}!?EeI=YMIsT0#^P1gut;@RC<=$fKrwhE0_uu~2Tm z+Y$5+ji614R95u@el8I!{KcPdo<#5uS)ei49l2{kuse0e;~+n~iT@-Y|B>aN^Zf{T z7U{n!{-4&V6gM9~j5l7-ot3-)L|?FfEC;=f>d@zAmA9Nt1FhZi6|qHP>ebP z3020ZV3kziu5Ji8OAUXz^~?KTdPJZRs%WIjUwZs6z5hv%C1A+zc-9UIgZ%gL{AcR? zSMmJA`ucy32ez|!{wX!sKdSJ@*x&54taAS7Vr||#ufI+W*2k}N2Tx|D%A0kn)OcJC z0RW-mlLmU${zJ2l=dK=`veCA2vTVt8!4^=(pJ38jtmzS4& zdy9*T)JNBf0u={2`)dX>+&-sX`1~#NbJ}_>wUi9)q>8x*ul6xIqABFAbr0>^0{S=K zbQc`K^{zMSBixtrJaVuRN-6kn@YD-}?Oi%d3{CoVdu_K@L>f_`yuAFupl6SldagsU z(VNaEM~Q*)i+X2pcDR0@B(CeqF~P9VPZc9t9a|o0t)qU2Vb!@6o=j?2i z?^gEnP>Z{>FycwX;oQEEvNKk6Z}I3GvOQ(>zd6MPrq}1G6gFMv1-d}AnTTf5Uen{n zdhrjPmM&eWq1wi&G6L);``qV8PJLE>=l`uXFH+w)JJ85J?Xm6+OHspK?Kw+vscfRY zbOU(VS2B*|pl$51kreafrr zZRgq1p3g+E7knG+?_^75BAl&)nzH)3@?zqRiZR!nBo{xo$KA|tmYXOVfHes;A2eGB zl`#CS3^6o~hv6JI?UR@8yBo%d0HH=L*SNBk6Mp+@q9 z$tY&wRh3?<+L}YKT=aaa;u&p|1@Okr8HM$hyO4&w6pM#Odz~d*UNh%VvqtdxSJ~S& zOXfN&_}isg*NK#c+Y*jSpWH#{>IcI|F|0!=R_T@ifeiP2n6w|`>rs7yj~rVG9+p^9%obu*+eT$ixD zcOUM0{HYpecQtqx^2)c!Z$ZW}+RV+M#Y~*iZ<*QRy3gXMUuvd(N1DZ&kE~VSuc;f; zyC1spttCNud3X;8+v@v?G2`qIz$H8Zs~(NI#ec8`l6d+JpFuah>UtT#!!`@~T;VaC z8Mz7^0GnDB91y!1V!X&?zG5=oSb;NWu?F%K>x|3csf zI0Acde_y+sgJ7V1{Im75#iQS!ynl2uqqzIGT)q&cHIseNw(NTzpWe;1sTyvf=LZN9 zSEcA5_V2z^{3h;3wFpx|_pW^1vsjebnr-`9!VHq+-);vPGJcADsghWNF~(w!PPsvqU|i1kwJbmAG_=-#pBY&%>I>#V=>l z5Chs9wqF?OBs#~#^x4E*9Ail9d+zb*MbNFOL0bkW{P7`&;!M{JcUl5j+=L>?4~nZAx$fQ@@^KDN4^!s6!)ZIiGQI z$er<0gQ}5TUNdYrGWpz`?02v2(xOI6K0NOI5KNP491x5;Y`Cn!uJIjr=V8#D-mRgO zJ&z^=>?N!=Z@aCP>U<3vGIa%!%(p|w`NonNf?4D5-`6KQ%!m(>Y?7$MYg`>yR7I8y zFSSkxu6ISOn0R|@-W{reR(WrSm15$%8T&o&1ZsclAKd4?n>xWMcr*P{0Abq{5f&WG z{(>2e@iv>t@a&GXo!{UtEfKiJTz+o83~S6`(_^L`Kg~5zK3$tM6^dUA65JxC%}hQ{ zn$rHvoVwqB`_fv3=G8KVna=d}gvf&*zAUboC!YH$sf3+Xre=yAvonn<=oDQ{{(Lo!$NJ2~C;RGUZ)#zt6=}jszYo zd#xBc2Ce&^IlS&Xus*ni6uru);oGrWs)0QCu}bcfHuve&zTxV4$fDCV3GK|_Pv`in zoO6gbb+$i+CPy`l#YtS*eGK%Qsz^z%U=eMzwQZ>r795k2_<49yjC8k#S@fW$vu0++ zg%rGys99Y!dMk8q z5}k|4SBrn>$*ynm!x3zRYfbMsV>g9C8m70!tLfr$oZgC8R8g+;ChI8%GqIWn zS|YYG60^iM?gFcdnH^cEIn1Ena5NvAtltHDQ!XD9v`1he_b#RR{1Skop?nz@D79x_ z!|m}#D{1sJVij6jZgaG3lo!xFi_w!4#&fih5%iYE;pCVAcPbev*KOMKx{83tDVa~< zG~0YKhHsFL8c!+{9TZ;3eJpIE$pG9=z@gE0LkGN_biO113AQ+~;P(48zbl}3dz0pU z=M<4HVKct5&&$j9i`qAlkG0C3|9&=J!-==L5oDDfOHm6rM|)x%*7BH6?tPi7F_N9g zfeU-y9KLo<&B`%H(RWq$O>&ln{Y|btcwxxKJGR`D;A1?S8DDbcH^$0*0BHuDyhm9}(EE?+e5X}Iu($}hyZYd?FM0p|Klvny}wNEJp@ zqveK4tc>?|l^vIp8tyRXOr-GFIM0R@YTuiw19fGN-Mw`#2fPkb!c>@I?9*3V1UE|( zPc-s}Xwy;?x$f(%u!F?U7pZ5rQH6NO!on{LcR!kk>fTs&9TK)XcxUmnAx9}9?2IEv ztVU5}XN8gB5pnYywUxYfAfPlj6q2I*u;`+D^tU(MG)d#<{iM;H;ER|tfg&m3=m~E1 z?D~@p^+z_AU#6Bp3j+$Phou<|>qM|z>x+WkZ-?g}wc8pj_%nshU6n7)I(GZ_s9W1v zp-w%K6k^rx^g35(p7b(( zT0RxhvI&XpN+kJ}$SzO!uv?VPLZk^Ia}9^^ zyC3ZSK)p_sZF_`nJ)y98IgtlZ1eXSRx;sA=Ew~+6$3FNSZ7hY?cTTVt6uV-0svdo+ zzVJcL=k=)l5f+^LtvVcb6@k-s3Aov^dEYy8)x*IPV{ybtO!mM_na8q##7jB(Yn3u8 zjE?VAyUAg${KO)P+-VyrfpPAzo9|@V)Bp#OL_mlhrXm}s2JAac{MOz6NnBfcEa!Uy zC-HDhgeaifs^UL9p$>quj}DX*r&7sI{bb5^#)tIqrwbe93YGU~e65|r*o_mp7JI@z zb{Z>K#KUe?+>?*61rkTD^#R+!Hy@y>%}h;26u<7Aymh442J78QrHg!?un* zD*I8n{<(CnvqF;7mSES;5tL$`v@2B1m6Uz{v^M*9c9hVwtI)!yU&|{2TY41CmVPU{ z;M5@-664`#kT{3Gx-%QEd=|1Vc_t>Zg)4iDFwYiTxtCBpdT!!*;Yg`uVYE@|SJ0^O zntkDi%A+7icw-jBdHHaZ^`%{Ux*XU0M3Vs8JP9P;r%AXwdM*jMTe_IUMV}Mi}W3|FYhCptbRow)_R|_p*5}-L0{2 z(Ym0$X)3a9MtUxFTrFK^3TBiSx-3#Mo<|On4jUCYg+E>GJOm#7=@aQoff4TONRyIcZCH$#$m2YPWH!7|jn|^Av6?NfiH~+0~qtA<)Zt0z0;W^G` jodeNT`TJ&f&ngAlFuUGUk|)3OU;0TyGlP;7=fnR8ZH{?6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_lake_glow.png b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_lake_glow.png new file mode 100644 index 0000000000000000000000000000000000000000..d44ec4136758dfe14726b792a77f7433df6686d9 GIT binary patch literal 2320 zcmb_e4Qvxt94`~t92uX3O;9;+5=Z2EpKb4MbRVoMo6s?!y7A5R?zJmxd!=`y?KEr} zBP=pd2O7r57)o%A;6gwHj1YnN2@IVBl>i|bfq-O!gQ-LGUDs8(w?dqqiTc4`a z4Qz1ROVkqER9=+5dO?yMKp*n@AzG)Km=*F1Vi`~o2XMK4X0&tP0TgjdX0+H~BW(U$ zQ0mUF2!NRtg?6!`OyndqD-)R*;-LXAPz5C9_4pJ%WJV))dDzyvaTJL_)G{-gqd7!M zY(+?}8~}(xZ^T5Bp%4?NCyfM0F%uAqAWb-7!but1fgDD)PPocs)nHR=n# znbA^J_47C$3o|#z!PyUi8$~8FYu`f#F8Dcfc4q$3+wwRCma`Ad&E)+Fy2@E5eko%$)d)N=~89qysY=9{9c_)vIuSb?NwlnCI{ny`gNKZ%;aQPjAab~a|j|yv8=;Mfta;v z0XJM~g6DRt8Y>A}G!nD}2o8Wb4J3z|1V+MGf&&=E(E=qoM3G<#P0$gI@cC{9Rxcb~ zA~V6_Xv^b9BC_BGQIoqF6}37835|BU?~{*5@*JHXECtZ$LyF()U6Gw?PzZn=7tGzG z=nH=ke??gGaQ3W0k~kwPVyuY(m_cM57)P@dMgx+TSb|_Un(K=`#y+M;iYGbVK=tYI zU$T!TM=TY5E&z8>9Q_aRJd!$liQXH}UF++AjR)8E&R(hEcdIZmcH2G+%Ngl{o43}C zof_~ZcJ2TlOjQ7$D%PQ=n{>Lkkp-3jLsb|{#m6iLi*2tNI_x?J9ikk~A%>Mk;`JQn9 ziS^y2q5>f?_&uazHe30t%2_L@apb@{~(?Al|W4E!LY{>bQ`zhyR`Jb3Bi*;5Ub z&Ne6i<;Mr8)`ZgQM{z4tYd^V&pZ0V`_iS6u-s`{L+_a+Vr}gveFSl)&=6q73mtCI! zY3r$PI=@(18*-oftY_iyrkN=hbcU;NIn;|Dvor<5(us7pNGv*z%k ziKez{efx)V64Ou2+Bg>3@W+DLx|PS;>Mph1?0V_9rK{67mAJx7tDM6Zuva?1E33#T z`$d?9*M!HHZ=Pbf^lsdB|Cv|jPjBt+GTw@3wm-3N-R`Ub^wFnA&e4ai*o!J1U1u{J z(~5U(y*l3d-hxA~Z#1>OzkF0n-Pl7DGQs4%`nq}Hmm5pRO=)V(Zfv`WtgJG2-x`v! zxqW~0p*@LfFe%v6UE|C+JNC_5Q|svCucb_RaowQPv+~v_OddD)SlBjZ+gejrcG{++ zTg|6?D&KPDbT-Msoc+|`)PB0-dm4nSij=a*C&|6H4mJLV8%f)`PG Date: Wed, 13 Jan 2021 04:09:55 +0300 Subject: [PATCH 144/463] Amber slimes --- .../ru/betterend/entity/EntityEndSlime.java | 11 ++++++++++ .../entity/model/EndSlimeEntityModel.java | 20 +++++++++++++++++- .../entity/render/RendererEntityEndSlime.java | 15 ++++++++----- .../betterend/world/biome/BiomeAmberLand.java | 4 +++- .../entity/end_slime/end_slime_amber.png | Bin 0 -> 4447 bytes .../entity/end_slime/end_slime_amber_glow.png | Bin 0 -> 2524 bytes 6 files changed, 43 insertions(+), 7 deletions(-) create mode 100644 src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_amber.png create mode 100644 src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_amber_glow.png diff --git a/src/main/java/ru/betterend/entity/EntityEndSlime.java b/src/main/java/ru/betterend/entity/EntityEndSlime.java index b1ad4440..77ee1ca0 100644 --- a/src/main/java/ru/betterend/entity/EntityEndSlime.java +++ b/src/main/java/ru/betterend/entity/EntityEndSlime.java @@ -82,6 +82,9 @@ public class EntityEndSlime extends SlimeEntity { else if (biome == EndBiomes.MEGALAKE || biome == EndBiomes.MEGALAKE_GROVE) { this.setLake(true); } + else if (biome == EndBiomes.AMBER_LAND) { + this.setAmber(true); + } this.calculateDimensions(); return data; } @@ -179,6 +182,14 @@ public class EntityEndSlime extends SlimeEntity { return this.dataTracker.get(VARIANT) == 2; } + protected void setAmber(boolean mossy) { + this.dataTracker.set(VARIANT, (byte) 3); + } + + public boolean isAmber() { + return this.dataTracker.get(VARIANT) == 3; + } + public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { return isPermanentBiome(world, pos) || (notManyEntities(world, pos, 32, 3) && isWaterNear(world, pos, 32, 8)); } diff --git a/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java index dfea3069..9e91859c 100644 --- a/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java @@ -11,12 +11,13 @@ import ru.betterend.entity.EntityEndSlime; public class EndSlimeEntityModel extends CompositeEntityModel { private final ModelPart flower; + private final ModelPart crop; private final ModelPart innerCube; private final ModelPart rightEye; private final ModelPart leftEye; private final ModelPart mouth; - public EndSlimeEntityModel(boolean onlyShell, int type) { + public EndSlimeEntityModel(boolean onlyShell) { super(RenderLayer::getEntityCutout); this.innerCube = new ModelPart(this, 0, 16); @@ -24,6 +25,7 @@ public class EndSlimeEntityModel extends CompositeEnti this.leftEye = new ModelPart(this, 32, 4); this.mouth = new ModelPart(this, 32, 8); this.flower = new ModelPart(this); + this.crop = new ModelPart(this); if (onlyShell) { this.innerCube.setTextureOffset(0, 0); @@ -46,6 +48,18 @@ public class EndSlimeEntityModel extends CompositeEnti this.flower.addChild(petalRot); petalRot.addChild(petal); } + + for (int i = 0; i < 2; i++) { + ModelPart petalRot = new ModelPart(this); + petalRot.yaw = i * 90F + 45F; + + ModelPart petal = new ModelPart(this, 40, 0); + petal.setPivot(-4, 8, 0); + petal.addCuboid(0.0F, 0.0F, 0.0F, 8.0F, 8.0F, 0.0F, 0.0F); + + this.crop.addChild(petalRot); + petalRot.addChild(petal); + } } } @@ -55,6 +69,10 @@ public class EndSlimeEntityModel extends CompositeEnti public void renderFlower(MatrixStack matrices, VertexConsumer vertices, int light, int overlay) { flower.render(matrices, vertices, light, overlay); } + + public void renderCrop(MatrixStack matrices, VertexConsumer vertices, int light, int overlay) { + crop.render(matrices, vertices, light, overlay); + } @Override public Iterable getParts() { diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java index 8cc8f7c3..86ef49de 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java @@ -18,11 +18,11 @@ import ru.betterend.entity.EntityEndSlime; import ru.betterend.entity.model.EndSlimeEntityModel; public class RendererEntityEndSlime extends MobEntityRenderer> { - private static final Identifier TEXTURE[] = new Identifier[3]; - private static final RenderLayer GLOW[] = new RenderLayer[3]; + private static final Identifier TEXTURE[] = new Identifier[4]; + private static final RenderLayer GLOW[] = new RenderLayer[4]; public RendererEntityEndSlime(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new EndSlimeEntityModel(false, 0), 0.25F); + super(entityRenderDispatcher, new EndSlimeEntityModel(false), 0.25F); this.addFeature(new OverlayFeatureRenderer(this)); this.addFeature(new EyesFeatureRenderer>(this) { @Override @@ -37,6 +37,9 @@ public class RendererEntityEndSlime extends MobEntityRenderer extends FeatureRenderer> { - private final EndSlimeEntityModel modelOrdinal = new EndSlimeEntityModel(true, 0); - private final EndSlimeEntityModel modelLake = new EndSlimeEntityModel(true, 1); + private final EndSlimeEntityModel modelOrdinal = new EndSlimeEntityModel(true); + private final EndSlimeEntityModel modelLake = new EndSlimeEntityModel(true); public OverlayFeatureRenderer(FeatureRendererContext> featureRendererContext) { super(featureRendererContext); @@ -91,8 +94,10 @@ public class RendererEntityEndSlime extends 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 Date: Wed, 13 Jan 2021 04:11:29 +0300 Subject: [PATCH 145/463] Small fix --- .../ru/betterend/entity/render/RendererEntityEndSlime.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java index 86ef49de..8d8dbac2 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java @@ -37,9 +37,6 @@ public class RendererEntityEndSlime extends MobEntityRenderer model = livingEntity.getSlimeType() == 1 ? modelLake : modelOrdinal; this.getContextModel().copyStateTo(model); From 56d7a2b7c3814eefb3d26d2fa57d8a615afb8550 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 13 Jan 2021 04:20:22 +0300 Subject: [PATCH 146/463] Ability for slimes to spawn with low chance far from water --- src/main/java/ru/betterend/entity/EntityEndSlime.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/entity/EntityEndSlime.java b/src/main/java/ru/betterend/entity/EntityEndSlime.java index 77ee1ca0..a746f81c 100644 --- a/src/main/java/ru/betterend/entity/EntityEndSlime.java +++ b/src/main/java/ru/betterend/entity/EntityEndSlime.java @@ -191,7 +191,7 @@ public class EntityEndSlime extends SlimeEntity { } public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { - return isPermanentBiome(world, pos) || (notManyEntities(world, pos, 32, 3) && isWaterNear(world, pos, 32, 8)); + return random.nextInt(64) == 0 || isPermanentBiome(world, pos) || (notManyEntities(world, pos, 32, 3) && isWaterNear(world, pos, 32, 8)); } private static boolean isPermanentBiome(ServerWorldAccess world, BlockPos pos) { From e09d1d22354183a2f7a63927433aaee803df19d0 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 13 Jan 2021 04:51:17 +0300 Subject: [PATCH 147/463] Chorus forest slimes & math fixes --- .../ru/betterend/entity/EntityEndSlime.java | 4 ++++ .../entity/model/EndSlimeEntityModel.java | 5 +++-- .../entity/render/RendererEntityEndSlime.java | 2 +- .../ru/betterend/registry/EndFeatures.java | 1 - src/main/java/ru/betterend/util/MHelper.java | 6 +++++- .../world/biome/BiomeChorusForest.java | 2 +- .../textures/entity/end_slime/end_slime.png | Bin 1293 -> 4976 bytes 7 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/main/java/ru/betterend/entity/EntityEndSlime.java b/src/main/java/ru/betterend/entity/EntityEndSlime.java index a746f81c..9d34f753 100644 --- a/src/main/java/ru/betterend/entity/EntityEndSlime.java +++ b/src/main/java/ru/betterend/entity/EntityEndSlime.java @@ -190,6 +190,10 @@ public class EntityEndSlime extends SlimeEntity { return this.dataTracker.get(VARIANT) == 3; } + public boolean isChorus() { + return this.dataTracker.get(VARIANT) == 0; + } + public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { return random.nextInt(64) == 0 || isPermanentBiome(world, pos) || (notManyEntities(world, pos, 32, 3) && isWaterNear(world, pos, 32, 8)); } diff --git a/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java index 9e91859c..93a1897c 100644 --- a/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java @@ -8,6 +8,7 @@ import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.entity.model.CompositeEntityModel; import net.minecraft.client.util.math.MatrixStack; import ru.betterend.entity.EntityEndSlime; +import ru.betterend.util.MHelper; public class EndSlimeEntityModel extends CompositeEntityModel { private final ModelPart flower; @@ -39,7 +40,7 @@ public class EndSlimeEntityModel extends CompositeEnti for (int i = 0; i < 4; i++) { ModelPart petalRot = new ModelPart(this); - petalRot.yaw = i * 45F; + petalRot.yaw = MHelper.degreesToRadians(i * 45F); ModelPart petal = new ModelPart(this, 40, 0); petal.setPivot(-4, 8, 0); @@ -51,7 +52,7 @@ public class EndSlimeEntityModel extends CompositeEnti for (int i = 0; i < 2; i++) { ModelPart petalRot = new ModelPart(this); - petalRot.yaw = i * 90F + 45F; + petalRot.yaw = MHelper.degreesToRadians(i * 90F + 45F); ModelPart petal = new ModelPart(this, 40, 0); petal.setPivot(-4, 8, 0); diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java index 8d8dbac2..16bb6cc8 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java @@ -76,7 +76,7 @@ public class RendererEntityEndSlime extends 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 literal 1293 zcmV+o1@iidP)YIzSbTd9?bGQH@mvJD#rTDWT~tzOR&kwNyh2e*jTo( zu#k<9kDGsFWF*m;HEpd)M@L69_P@Kkv%MZ4AB%n8-rmCg_V@41KY6gc_8qhNu)bGT z93I-Z@KZ3$eYGewMthK6D%CKd2lU|aaGnVA{Jv7Tx53nBXE z=EjWg`W*pILVpP0-^!`hZIBzbyz zs$pU8=jZ2Q%zPF2FGTd301godC?7PKfF=S)WE+ZlU7zbB0FV(rKzigMrmkn*Nr*&T za(#VW!^(Sx@2L{tso!4$LPW}u2{pjSCpThvWnh64o(8Ufo^3(^MiJ(BIjL`|rn_us={GBvJJbVY8 z08;Mn?`{8qYXC|dtQ>tlGZwg_4SKz!32lJunW+TKucx&^U(@z?va+s(?WZWR0ARQW;P-l`?paIw%Orf}=N)N9;+oO+yFsS;46-0a?bQ786$Dk% zpK-1H*K-0qdOxMO4r(dPWrllz1T7XBw897@#Xap)FN2sl5fb?xMF}`Lv3#^e?g;E* ze)j%N)ca0=iI_lJpQo3L5EC&Sw&?RZy!q({I(Q+1!SBM?@Vh`$rw5`YNv3ur>r z@r&f5P4W&MiYy{^r#ab1zLdjJ5r=#V9W0L|GwA-sT^*7q%c=ue5~sLItM3uq;My-?{@u%Cm;wNhXnwsOZ|3I`)=2N zcmfbA4hkSr79eG@tEzps>pyK9{8Q{N0e=bj!wL8SU(z{4oR&>I00000NkvXXu0mjf Dk_~a= From 56591633ecfac62c76b455afd3b0ef95e1a000f4 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 13 Jan 2021 13:34:43 +0300 Subject: [PATCH 148/463] Player spawn in Overworld fix --- src/main/java/ru/betterend/BetterEnd.java | 2 - .../ru/betterend/blocks/EndPortalBlock.java | 2 - .../mixin/common/MinecraftServerMixin.java | 38 +++ .../common/NoiseChunkGeneratorMixin.java | 3 +- .../mixin/common/PlayerManagerMixin.java | 260 ++++++++++++++++++ .../mixin/common/ServerPlayerEntityMixin.java | 33 ++- .../java/ru/betterend/registry/EndBiomes.java | 2 +- .../world/generator/BetterEndBiomeSource.java | 4 +- .../world/generator/GeneratorOptions.java | 18 ++ .../world/generator/IslandLayer.java | 14 +- .../world/generator/TerrainGenerator.java | 28 +- .../resources/betterend.mixins.common.json | 7 +- 12 files changed, 370 insertions(+), 41 deletions(-) create mode 100644 src/main/java/ru/betterend/mixin/common/PlayerManagerMixin.java diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index f58d6399..9169d613 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -31,7 +31,6 @@ import ru.betterend.util.BonemealUtil; import ru.betterend.util.Logger; import ru.betterend.world.generator.BetterEndBiomeSource; import ru.betterend.world.generator.GeneratorOptions; -import ru.betterend.world.generator.TerrainGenerator; import ru.betterend.world.surface.SurfaceBuilders; public class BetterEnd implements ModInitializer { @@ -60,7 +59,6 @@ public class BetterEnd implements ModInitializer { EndStructures.register(); Integrations.register(); BonemealUtil.init(); - TerrainGenerator.init(); GeneratorOptions.init(); if (hasGuideBook()) { diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index 63b1e8a1..8e882f56 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -111,8 +111,6 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable while (checkPos.getY() > 5) { BlockState state = world.getBlockState(checkPos); if (state.isOf(this)) { - System.out.println("Out: " + checkPos); - Axis axis = state.get(AXIS); checkPos = this.findCenter(world, checkPos, axis); diff --git a/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java b/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java index 960f7ee4..f739527e 100644 --- a/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java @@ -15,9 +15,13 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.resource.ServerResourceManager; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.PlayerManager; +import net.minecraft.server.WorldGenerationProgressListener; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.registry.RegistryKey; +import net.minecraft.world.SaveProperties; import net.minecraft.world.World; +import net.minecraft.world.level.ServerWorldProperties; import ru.betterend.recipe.EndRecipeManager; import ru.betterend.registry.EndBiomes; import ru.betterend.world.generator.GeneratorOptions; @@ -30,6 +34,10 @@ public class MinecraftServerMixin { @Final @Shadow private Map, ServerWorld> worlds; + + @Final + @Shadow + protected SaveProperties saveProperties; @Inject(method = "reloadResources", at = @At(value = "RETURN"), cancellable = true) private void beOnReload(Collection collection, CallbackInfoReturnable> info) { @@ -53,6 +61,36 @@ public class MinecraftServerMixin { info.cancel(); } } + + @Inject(method = "createWorlds", at = @At(value = "TAIL")) + private final void be_CreateWorlds(WorldGenerationProgressListener worldGenerationProgressListener, CallbackInfo info) { + if (GeneratorOptions.swapOverworldToEnd()) { + ServerWorld world = worlds.get(World.END); + if (world == null) { + world = worlds.get(World.OVERWORLD); + } + this.getPlayerManager().setMainWorld(world); + ServerWorldProperties serverWorldProperties = saveProperties.getMainWorldProperties(); + net.minecraft.world.gen.GeneratorOptions generatorOptions = saveProperties.getGeneratorOptions(); + boolean bl = generatorOptions.isDebugWorld(); + setupSpawn(world, serverWorldProperties, generatorOptions.hasBonusChest(), bl, true); + } + } + + @Inject(method = "setupSpawn", at = @At(value = "HEAD"), cancellable = true) + private static void be_SetupSpawn(ServerWorld world, ServerWorldProperties serverWorldProperties, boolean bonusChest, boolean debugWorld, boolean bl, CallbackInfo info) { + if (GeneratorOptions.swapOverworldToEnd() && world.getRegistryKey() == World.OVERWORLD) { + info.cancel(); + } + } + + @Shadow + private static void setupSpawn(ServerWorld world, ServerWorldProperties serverWorldProperties, boolean bonusChest, boolean debugWorld, boolean bl) {} + + @Shadow + public PlayerManager getPlayerManager() { + return null; + } private void beInjectRecipes() { if (FabricLoader.getInstance().isModLoaded("kubejs")) { diff --git a/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java b/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java index 695603f5..a41e262b 100644 --- a/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java +++ b/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java @@ -12,6 +12,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.minecraft.world.biome.source.BiomeSource; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraft.world.gen.chunk.NoiseChunkGenerator; +import ru.betterend.world.generator.GeneratorOptions; import ru.betterend.world.generator.TerrainGenerator; @Mixin(NoiseChunkGenerator.class) @@ -27,7 +28,7 @@ public abstract class NoiseChunkGeneratorMixin { @Inject(method = "sampleNoiseColumn([DII)V", at = @At("HEAD"), cancellable = true, allow = 2) private void beSampleNoiseColumn(double[] buffer, int x, int z, CallbackInfo info) { - if (TerrainGenerator.useNewGenerator() && settings.get().equals(ChunkGeneratorSettings.END)) { + if (GeneratorOptions.useNewGenerator() && settings.get().equals(ChunkGeneratorSettings.END)) { if (TerrainGenerator.canGenerate(x, z)) { TerrainGenerator.fillTerrainDensity(buffer, x, z); info.cancel(); diff --git a/src/main/java/ru/betterend/mixin/common/PlayerManagerMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerManagerMixin.java new file mode 100644 index 00000000..7bcb80e6 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/PlayerManagerMixin.java @@ -0,0 +1,260 @@ +package ru.betterend.mixin.common; + +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.mojang.authlib.GameProfile; +import com.mojang.serialization.DataResult; +import com.mojang.serialization.Dynamic; + +import io.netty.buffer.Unpooled; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtOps; +import net.minecraft.nbt.Tag; +import net.minecraft.network.ClientConnection; +import net.minecraft.network.MessageType; +import net.minecraft.network.Packet; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket; +import net.minecraft.network.packet.s2c.play.DifficultyS2CPacket; +import net.minecraft.network.packet.s2c.play.EntityStatusEffectS2CPacket; +import net.minecraft.network.packet.s2c.play.GameJoinS2CPacket; +import net.minecraft.network.packet.s2c.play.HeldItemChangeS2CPacket; +import net.minecraft.network.packet.s2c.play.PlayerAbilitiesS2CPacket; +import net.minecraft.network.packet.s2c.play.PlayerListS2CPacket; +import net.minecraft.network.packet.s2c.play.SynchronizeRecipesS2CPacket; +import net.minecraft.network.packet.s2c.play.SynchronizeTagsS2CPacket; +import net.minecraft.scoreboard.ServerScoreboard; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.PlayerManager; +import net.minecraft.server.network.ServerPlayNetworkHandler; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.text.Text; +import net.minecraft.text.TranslatableText; +import net.minecraft.util.Formatting; +import net.minecraft.util.UserCache; +import net.minecraft.util.Util; +import net.minecraft.util.registry.DynamicRegistryManager; +import net.minecraft.util.registry.RegistryKey; +import net.minecraft.world.GameRules; +import net.minecraft.world.World; +import net.minecraft.world.WorldProperties; +import net.minecraft.world.biome.source.BiomeAccess; +import net.minecraft.world.dimension.DimensionType; +import ru.betterend.world.generator.GeneratorOptions; + +@Mixin(PlayerManager.class) +public class PlayerManagerMixin { + @Final + @Shadow + private static Logger LOGGER; + + @Final + @Shadow + private MinecraftServer server; + + @Final + @Shadow + private DynamicRegistryManager.Impl registryManager; + + @Shadow + private int viewDistance; + + @Final + @Shadow + private List players; + + @Final + @Shadow + private Map playerMap; + + @Inject(method = "onPlayerConnect", at = @At(value = "HEAD"), cancellable = true) + public void be_onPlayerConnect(ClientConnection connection, ServerPlayerEntity player, CallbackInfo info) { + if (GeneratorOptions.swapOverworldToEnd()) { + GameProfile gameProfile = player.getGameProfile(); + UserCache userCache = this.server.getUserCache(); + GameProfile gameProfile2 = userCache.getByUuid(gameProfile.getId()); + String string = gameProfile2 == null ? gameProfile.getName() : gameProfile2.getName(); + userCache.add(gameProfile); + CompoundTag compoundTag = this.loadPlayerData(player); + RegistryKey var23; + if (compoundTag != null) { + DataResult> var10000 = DimensionType.method_28521(new Dynamic(NbtOps.INSTANCE, compoundTag.get("Dimension"))); + Logger var10001 = LOGGER; + var10001.getClass(); + var23 = (RegistryKey) var10000.resultOrPartial(var10001::error).orElse(World.END); + } + else { + var23 = World.END; + } + + System.out.println("World " + this.server.getWorld(World.END)); + + RegistryKey registryKey = var23; + ServerWorld serverWorld = this.server.getWorld(registryKey); + ServerWorld serverWorld3; + if (serverWorld == null) { + LOGGER.warn("Unknown respawn dimension {}, defaulting to overworld", registryKey); + serverWorld3 = this.server.getOverworld(); + } + else { + serverWorld3 = serverWorld; + } + + player.setWorld(serverWorld3); + player.interactionManager.setWorld((ServerWorld) player.world); + String string2 = "local"; + if (connection.getAddress() != null) { + string2 = connection.getAddress().toString(); + } + + LOGGER.info("{}[{}] logged in with entity id {} at ({}, {}, {})", player.getName().getString(), string2, player.getEntityId(), player.getX(), player.getY(), player.getZ()); + WorldProperties worldProperties = serverWorld3.getLevelProperties(); + this.setGameMode(player, (ServerPlayerEntity) null, serverWorld3); + ServerPlayNetworkHandler serverPlayNetworkHandler = new ServerPlayNetworkHandler(this.server, connection, player); + GameRules gameRules = serverWorld3.getGameRules(); + boolean bl = gameRules.getBoolean(GameRules.DO_IMMEDIATE_RESPAWN); + boolean bl2 = gameRules.getBoolean(GameRules.REDUCED_DEBUG_INFO); + serverPlayNetworkHandler.sendPacket(new GameJoinS2CPacket(player.getEntityId(), player.interactionManager.getGameMode(), player.interactionManager.getPreviousGameMode(), BiomeAccess.hashSeed(serverWorld3.getSeed()), + worldProperties.isHardcore(), this.server.getWorldRegistryKeys(), this.registryManager, serverWorld3.getDimension(), serverWorld3.getRegistryKey(), this.getMaxPlayerCount(), this.viewDistance, bl2, !bl, + serverWorld3.isDebugWorld(), serverWorld3.isFlat())); + serverPlayNetworkHandler.sendPacket(new CustomPayloadS2CPacket(CustomPayloadS2CPacket.BRAND, (new PacketByteBuf(Unpooled.buffer())).writeString(this.getServer().getServerModName()))); + serverPlayNetworkHandler.sendPacket(new DifficultyS2CPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); + serverPlayNetworkHandler.sendPacket(new PlayerAbilitiesS2CPacket(player.abilities)); + serverPlayNetworkHandler.sendPacket(new HeldItemChangeS2CPacket(player.inventory.selectedSlot)); + serverPlayNetworkHandler.sendPacket(new SynchronizeRecipesS2CPacket(this.server.getRecipeManager().values())); + serverPlayNetworkHandler.sendPacket(new SynchronizeTagsS2CPacket(this.server.getTagManager())); + this.sendCommandTree(player); + player.getStatHandler().updateStatSet(); + player.getRecipeBook().sendInitRecipesPacket(player); + this.sendScoreboard(serverWorld3.getScoreboard(), player); + this.server.forcePlayerSampleUpdate(); + TranslatableText mutableText2; + if (player.getGameProfile().getName().equalsIgnoreCase(string)) { + mutableText2 = new TranslatableText("multiplayer.player.joined", new Object[] { player.getDisplayName() }); + } + else { + mutableText2 = new TranslatableText("multiplayer.player.joined.renamed", new Object[] { player.getDisplayName(), string }); + } + + this.broadcastChatMessage(mutableText2.formatted(Formatting.YELLOW), MessageType.SYSTEM, Util.NIL_UUID); + serverPlayNetworkHandler.requestTeleport(player.getX(), player.getY(), player.getZ(), player.yaw, player.pitch); + this.players.add(player); + this.playerMap.put(player.getUuid(), player); + this.sendToAll(new PlayerListS2CPacket(PlayerListS2CPacket.Action.ADD_PLAYER, new ServerPlayerEntity[] { player })); + + for (int i = 0; i < this.players.size(); ++i) { + player.networkHandler.sendPacket(new PlayerListS2CPacket(PlayerListS2CPacket.Action.ADD_PLAYER, new ServerPlayerEntity[] { (ServerPlayerEntity) this.players.get(i) })); + } + + serverWorld3.onPlayerConnected(player); + this.server.getBossBarManager().onPlayerConnect(player); + this.sendWorldInfo(player, serverWorld3); + if (!this.server.getResourcePackUrl().isEmpty()) { + player.sendResourcePackUrl(this.server.getResourcePackUrl(), this.server.getResourcePackHash()); + } + + Iterator var24 = player.getStatusEffects().iterator(); + + while (var24.hasNext()) { + StatusEffectInstance statusEffectInstance = (StatusEffectInstance) var24.next(); + serverPlayNetworkHandler.sendPacket(new EntityStatusEffectS2CPacket(player.getEntityId(), statusEffectInstance)); + } + + if (compoundTag != null && compoundTag.contains("RootVehicle", 10)) { + CompoundTag compoundTag2 = compoundTag.getCompound("RootVehicle"); + Entity entity = EntityType.loadEntityWithPassengers(compoundTag2.getCompound("Entity"), serverWorld3, (vehicle) -> { + return !serverWorld3.tryLoadEntity(vehicle) ? null : vehicle; + }); + if (entity != null) { + UUID uUID2; + if (compoundTag2.containsUuid("Attach")) { + uUID2 = compoundTag2.getUuid("Attach"); + } + else { + uUID2 = null; + } + + Iterator var21; + Entity entity3; + if (entity.getUuid().equals(uUID2)) { + player.startRiding(entity, true); + } + else { + var21 = entity.getPassengersDeep().iterator(); + + while (var21.hasNext()) { + entity3 = (Entity) var21.next(); + if (entity3.getUuid().equals(uUID2)) { + player.startRiding(entity3, true); + break; + } + } + } + + if (!player.hasVehicle()) { + LOGGER.warn("Couldn't reattach entity to player"); + serverWorld3.removeEntity(entity); + var21 = entity.getPassengersDeep().iterator(); + + while (var21.hasNext()) { + entity3 = (Entity) var21.next(); + serverWorld3.removeEntity(entity3); + } + } + } + } + + player.onSpawn(); + info.cancel(); + } + } + + @Shadow + public CompoundTag loadPlayerData(ServerPlayerEntity player) { + return null; + } + + @Shadow + private void setGameMode(ServerPlayerEntity player, @Nullable ServerPlayerEntity oldPlayer, ServerWorld world) {} + + @Shadow + public void sendCommandTree(ServerPlayerEntity player) {} + + @Shadow + public int getMaxPlayerCount() { + return 0; + } + + @Shadow + public MinecraftServer getServer() { + return null; + } + + @Shadow + protected void sendScoreboard(ServerScoreboard scoreboard, ServerPlayerEntity player) {} + + @Shadow + public void broadcastChatMessage(Text message, MessageType type, UUID senderUuid) {} + + @Shadow + public void sendToAll(Packet packet) {} + + @Shadow + public void sendWorldInfo(ServerPlayerEntity player, ServerWorld world) {} +} diff --git a/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java b/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java index 8199b00e..97255cd7 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java @@ -1,34 +1,57 @@ package ru.betterend.mixin.common; +import java.util.Map; + import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import com.google.common.collect.Maps; +import com.mojang.authlib.GameProfile; + +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.registry.RegistryKey; +import net.minecraft.world.World; import ru.betterend.interfaces.TeleportingEntity; @Mixin(ServerPlayerEntity.class) -public abstract class ServerPlayerEntityMixin implements TeleportingEntity { +public abstract class ServerPlayerEntityMixin extends PlayerEntity implements TeleportingEntity { + private static final Map COOLDOWN = Maps.newHashMap(); - private long beCooldown; + public ServerPlayerEntityMixin(World world, BlockPos pos, float yaw, GameProfile profile) { + super(world, pos, yaw, profile); + } + + @Shadow + private RegistryKey spawnPointDimension; @Inject(method = "tick", at = @At("TAIL")) public void be_baseTick(CallbackInfo info) { if (hasCooldown()) { - this.beCooldown--; + ServerPlayerEntity key = (ServerPlayerEntity) (Object) this; + long value = COOLDOWN.getOrDefault(key, 0L) - 1; + COOLDOWN.put(key, value); } } + @Shadow + private void moveToSpawn(ServerWorld world) {} + @Override public long beGetCooldown() { - return this.beCooldown; + ServerPlayerEntity key = (ServerPlayerEntity) (Object) this; + return COOLDOWN.getOrDefault(key, 0L); } @Override public void beSetCooldown(long time) { - this.beCooldown = time; + ServerPlayerEntity key = (ServerPlayerEntity) (Object) this; + COOLDOWN.put(key, time); } @Override diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index 2ec5e5e7..90fe5c39 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -176,6 +176,7 @@ public class EndBiomes { } } if (BetterEnd.isDevEnvironment()) { + System.out.println("=================================="); System.out.println("Added void biomes from Fabric API:"); FABRIC_VOID.forEach((id) -> { System.out.println(id); @@ -324,7 +325,6 @@ public class EndBiomes { public static void addSubBiomeIntegration(EndBiome biome, Identifier parent) { if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { EndBiome parentBiome = ID_MAP.get(parent); - System.out.println(parentBiome); if (parentBiome != null && !parentBiome.containsSubBiome(biome)) { parentBiome.addSubBiome(biome); } diff --git a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java index 441d8ce2..96e98a76 100644 --- a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java +++ b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java @@ -70,7 +70,7 @@ public class BetterEndBiomeSource extends BiomeSource { @Override public Biome getBiomeForNoiseGen(int biomeX, int biomeY, int biomeZ) { - boolean hasVoid = !TerrainGenerator.useNewGenerator() || !TerrainGenerator.noRingVoid(); + boolean hasVoid = !GeneratorOptions.useNewGenerator() || !GeneratorOptions.noRingVoid(); long i = (long) biomeX * (long) biomeX; long j = (long) biomeZ * (long) biomeZ; if (hasVoid && i + j <= 65536L) return this.centerBiome; @@ -80,7 +80,7 @@ public class BetterEndBiomeSource extends BiomeSource { mapVoid.clearCache(); } - if (TerrainGenerator.useNewGenerator()) { + if (GeneratorOptions.useNewGenerator()) { if (TerrainGenerator.isLand(biomeX, biomeZ)) { return mapLand.getBiome(biomeX << 2, biomeZ << 2).getActualBiome(); } diff --git a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java index fa07784e..8e9d4ca2 100644 --- a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java +++ b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java @@ -11,6 +11,9 @@ public class GeneratorOptions { private static boolean swapOverworldToEnd; private static boolean changeChorusPlant; private static boolean removeChorusFromVanillaBiomes; + private static boolean newGenerator; + private static boolean noRingVoid; + private static boolean generateCentralIsland; public static void init() { biomeSizeLand = Configs.GENERATOR_CONFIG.getInt("biomeMap", "biomeSizeLand", 256); @@ -21,6 +24,9 @@ public class GeneratorOptions { swapOverworldToEnd = Configs.GENERATOR_CONFIG.getBooleanRoot("swapOverworldToEnd", false); changeChorusPlant = Configs.GENERATOR_CONFIG.getBoolean("chorusPlant", "changeChorusPlant", true); removeChorusFromVanillaBiomes = Configs.GENERATOR_CONFIG.getBoolean("chorusPlant", "removeChorusFromVanillaBiomes", true); + newGenerator = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "useNewGenerator", false); + noRingVoid = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "noRingVoid", false); + generateCentralIsland = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "generateCentralIsland", false); } public static int getBiomeSizeLand() { @@ -54,4 +60,16 @@ public class GeneratorOptions { public static boolean removeChorusFromVanillaBiomes() { return removeChorusFromVanillaBiomes; } + + public static boolean noRingVoid() { + return noRingVoid; + } + + public static boolean useNewGenerator() { + return newGenerator; + } + + public static boolean hasCentralIsland() { + return generateCentralIsland; + } } diff --git a/src/main/java/ru/betterend/world/generator/IslandLayer.java b/src/main/java/ru/betterend/world/generator/IslandLayer.java index 533e2d66..5dc633e2 100644 --- a/src/main/java/ru/betterend/world/generator/IslandLayer.java +++ b/src/main/java/ru/betterend/world/generator/IslandLayer.java @@ -29,10 +29,11 @@ public class IslandLayer { private final int minY; private final int maxY; private final long center; + private final boolean hasCentralIsland; private int lastX = Integer.MIN_VALUE; private int lastZ = Integer.MIN_VALUE; - public IslandLayer(int seed, double distance, float scale, int center, int heightVariation) { + public IslandLayer(int seed, double distance, float scale, int center, int heightVariation, boolean hasCentralIsland) { this.distance = distance; this.density = new OpenSimplexNoise(seed); this.scale = scale; @@ -40,6 +41,7 @@ public class IslandLayer { this.minY = center - heightVariation; this.maxY = center + heightVariation; this.center = MHelper.floor(1000 / distance); + this.hasCentralIsland = hasCentralIsland; } private int getSeed(int x, int z) { @@ -59,7 +61,7 @@ public class IslandLayer { int px = pox + ix; for (int poz = -1; poz < 2; poz++) { int pz = poz + iz; - if (TerrainGenerator.noRingVoid() || (long) px + (long) pz > center) { + if (GeneratorOptions.noRingVoid() || (long) px + (long) pz > center) { RANDOM.setSeed(getSeed(px, pz)); double posX = (px + RANDOM.nextFloat()) * distance; double posY = MHelper.randRange(minY, maxY, RANDOM); @@ -70,6 +72,14 @@ public class IslandLayer { } } } + if (hasCentralIsland && GeneratorOptions.hasCentralIsland() && ix == 0 && iz == 0) { + if (positions.size() > 4) { + positions.set(4, new BlockPos(0, 64, 0)); + } + else { + positions.add(new BlockPos(0, 64, 0)); + } + } } } diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index 506fa2d9..fca78431 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -4,7 +4,6 @@ import java.util.Random; import java.util.concurrent.locks.ReentrantLock; import net.minecraft.util.math.MathHelper; -import ru.betterend.config.Configs; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; @@ -19,35 +18,20 @@ public class TerrainGenerator { private static IslandLayer smallIslands; private static OpenSimplexNoise noise1; private static OpenSimplexNoise noise2; - private static boolean newGenerator; - private static boolean noRingVoid; - public static void init() { - newGenerator = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "useNewGenerator", false); - noRingVoid = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "noRingVoid", false); + public static boolean canGenerate(int x, int z) { + return GeneratorOptions.noRingVoid() || (long) x + (long) z > CENTER; } public static void initNoise(long seed) { Random random = new Random(seed); - largeIslands = new IslandLayer(random.nextInt(), 300, 200, 70, 10); - mediumIslands = new IslandLayer(random.nextInt(), 150, 100, 70, 20); - smallIslands = new IslandLayer(random.nextInt(), 60, 50, 70, 30); + largeIslands = new IslandLayer(random.nextInt(), 300, 200, 70, 10, false); + mediumIslands = new IslandLayer(random.nextInt(), 150, 100, 70, 20, true); + smallIslands = new IslandLayer(random.nextInt(), 60, 50, 70, 30, false); noise1 = new OpenSimplexNoise(random.nextInt()); noise2 = new OpenSimplexNoise(random.nextInt()); } - public static boolean canGenerate(int x, int z) { - return noRingVoid || (long) x + (long) z > CENTER; - } - - public static boolean noRingVoid() { - return noRingVoid; - } - - public static boolean useNewGenerator() { - return newGenerator; - } - public static void fillTerrainDensity(double[] buffer, int x, int z) { LOCKER.lock(); @@ -128,8 +112,6 @@ public class TerrainGenerator { public static int getHeight(int x, int z) { LOCKER.lock(); - //x >>= 3; - //z >>= 3; double px = (double) x / 8.0; double pz = (double) z / 8.0; diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index 835574ad..2bd6770a 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -23,16 +23,17 @@ "MinecraftServerMixin", "TagGroupLoaderMixin", "EndermanEntityMixin", - "DimensionTypeMixin", - "RecipeManagerMixin", "AbstractBlockMixin", + "DimensionTypeMixin", + "PlayerManagerMixin", + "RecipeManagerMixin", "HostileEntityMixin", "LivingEntityMixin", "BoneMealItemMixin", "PlayerEntityMixin", "SlimeEntityMixin", "BrewingAccessor", - "EntityMixin" + "EntityMixin", ], "injectors": { "defaultRequire": 1 From a4dfa6d5071dba8283613f05bc89908e56d23391 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 13 Jan 2021 13:39:50 +0300 Subject: [PATCH 149/463] Central island fix --- .../java/ru/betterend/world/generator/IslandLayer.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/main/java/ru/betterend/world/generator/IslandLayer.java b/src/main/java/ru/betterend/world/generator/IslandLayer.java index 5dc633e2..0b3fe663 100644 --- a/src/main/java/ru/betterend/world/generator/IslandLayer.java +++ b/src/main/java/ru/betterend/world/generator/IslandLayer.java @@ -72,13 +72,8 @@ public class IslandLayer { } } } - if (hasCentralIsland && GeneratorOptions.hasCentralIsland() && ix == 0 && iz == 0) { - if (positions.size() > 4) { - positions.set(4, new BlockPos(0, 64, 0)); - } - else { - positions.add(new BlockPos(0, 64, 0)); - } + if (hasCentralIsland && GeneratorOptions.hasCentralIsland() && ix < 2 && iz < 2 && ix > -2 && iz > -2) { + positions.add(new BlockPos(0, 64, 0)); } } } From 62c9c622a49241ff45bec8ad691e32437f9f892c Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 13 Jan 2021 14:47:04 +0300 Subject: [PATCH 150/463] Crashed Ship datapck support --- .../ru/betterend/util/StructureHelper.java | 34 +++++++++++++++- .../world/features/CrashedShipFeature.java | 40 +++++++++++++++++-- 2 files changed, 69 insertions(+), 5 deletions(-) diff --git a/src/main/java/ru/betterend/util/StructureHelper.java b/src/main/java/ru/betterend/util/StructureHelper.java index ff8ab86c..65851187 100644 --- a/src/main/java/ru/betterend/util/StructureHelper.java +++ b/src/main/java/ru/betterend/util/StructureHelper.java @@ -1,9 +1,13 @@ package ru.betterend.util; +import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.util.Enumeration; import java.util.Random; import java.util.Set; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; import com.google.common.collect.Sets; @@ -35,6 +39,33 @@ public class StructureHelper { return readStructure("/data/" + ns + "/structures/" + nm + ".nbt"); } + public static Structure readStructure(File datapack, String path) { + if (datapack.isDirectory()) { + return readStructure(datapack.toString() + "/" + path); + } + else if (datapack.isFile() && datapack.getName().endsWith(".zip")) { + try { + ZipFile zipFile = new ZipFile(datapack); + Enumeration entries = zipFile.entries(); + while (entries.hasMoreElements()) { + ZipEntry entry = entries.nextElement(); + String name = entry.getName(); + long compressedSize = entry.getCompressedSize(); + long normalSize = entry.getSize(); + String type = entry.isDirectory() ? "DIR" : "FILE"; + + System.out.println(name); + System.out.format("\t %s - %d - %d\n", type, compressedSize, normalSize); + } + zipFile.close(); + } + catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } + public static Structure readStructure(String path) { try { InputStream inputstream = StructureHelper.class.getResourceAsStream(path); @@ -320,8 +351,7 @@ public class StructureHelper { || state.isIn(BlockTags.LOGS) || state.isIn(BlockTags.LEAVES) || state.getMaterial().equals(Material.PLANT) - || state.getMaterial().equals(Material.LEAVES) - || state.getMaterial().equals(Material.WOOD); + || state.getMaterial().equals(Material.LEAVES); } private static void shuffle(Random random) { diff --git a/src/main/java/ru/betterend/world/features/CrashedShipFeature.java b/src/main/java/ru/betterend/world/features/CrashedShipFeature.java index 308429a7..457cef56 100644 --- a/src/main/java/ru/betterend/world/features/CrashedShipFeature.java +++ b/src/main/java/ru/betterend/world/features/CrashedShipFeature.java @@ -2,14 +2,22 @@ package ru.betterend.world.features; import java.util.Random; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.Material; import net.minecraft.structure.Structure; +import net.minecraft.structure.Structure.StructureBlockInfo; import net.minecraft.structure.StructurePlacementData; import net.minecraft.structure.processor.BlockIgnoreStructureProcessor; +import net.minecraft.structure.processor.StructureProcessor; +import net.minecraft.structure.processor.StructureProcessorType; import net.minecraft.util.BlockMirror; import net.minecraft.util.BlockRotation; +import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockBox; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.WorldView; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; import ru.betterend.registry.EndTags; @@ -18,11 +26,19 @@ import ru.betterend.util.MHelper; import ru.betterend.util.StructureHelper; public class CrashedShipFeature extends NBTStructureFeature { + private static final StructureProcessor REPLACER; private static final String STRUCTURE_PATH = "/data/minecraft/structures/end_city/ship.nbt"; + private Structure structure; @Override protected Structure getStructure(StructureWorldAccess world, BlockPos pos, Random random) { - return StructureHelper.readStructure(STRUCTURE_PATH); + if (structure == null) { + structure = world.toServerWorld().getStructureManager().getStructureOrBlank(new Identifier("end_city/ship")); + if (structure == null) { + structure = StructureHelper.readStructure(STRUCTURE_PATH); + } + } + return structure; } @Override @@ -56,6 +72,7 @@ public class CrashedShipFeature extends NBTStructureFeature { public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, DefaultFeatureConfig featureConfig) { center = new BlockPos(((center.getX() >> 4) << 4) | 8, 128, ((center.getZ() >> 4) << 4) | 8); center = getGround(world, center); + BlockBox bounds = makeBox(center); if (!canSpawn(world, center, random)) { return false; @@ -69,7 +86,6 @@ public class CrashedShipFeature extends NBTStructureFeature { StructurePlacementData placementData = new StructurePlacementData().setRotation(rotation).setMirror(mirror); center = center.add(-offset.getX() * 0.5, 0, -offset.getZ() * 0.5); - BlockBox bounds = makeBox(center); BlockBox structB = structure.calculateBoundingBox(placementData, center); bounds = StructureHelper.intersectBoxes(bounds, structB); @@ -84,6 +100,24 @@ public class CrashedShipFeature extends NBTStructureFeature { @Override protected void addStructureData(StructurePlacementData data) { - data.addProcessor(BlockIgnoreStructureProcessor.IGNORE_AIR_AND_STRUCTURE_BLOCKS).setIgnoreEntities(true); + data.addProcessor(BlockIgnoreStructureProcessor.IGNORE_AIR_AND_STRUCTURE_BLOCKS).addProcessor(REPLACER).setIgnoreEntities(true); + } + + static { + REPLACER = new StructureProcessor() { + @Override + public StructureBlockInfo process(WorldView worldView, BlockPos pos, BlockPos blockPos, StructureBlockInfo structureBlockInfo, StructureBlockInfo structureBlockInfo2, StructurePlacementData structurePlacementData) { + BlockState state = structureBlockInfo2.state; + if (state.isOf(Blocks.SPAWNER) || state.getMaterial().equals(Material.WOOL)) { + return new StructureBlockInfo(structureBlockInfo2.pos, AIR, null); + } + return structureBlockInfo2; + } + + @Override + protected StructureProcessorType getType() { + return StructureProcessorType.NOP; + } + }; } } From 251c5750ee363128f8de9477bdb32853cf9fda7e Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 13 Jan 2021 14:54:35 +0300 Subject: [PATCH 151/463] Entity cooldown map --- .../betterend/mixin/common/EntityMixin.java | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/common/EntityMixin.java b/src/main/java/ru/betterend/mixin/common/EntityMixin.java index 59027c53..fb278a65 100644 --- a/src/main/java/ru/betterend/mixin/common/EntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EntityMixin.java @@ -1,5 +1,7 @@ package ru.betterend.mixin.common; +import java.util.Map; + import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -8,6 +10,8 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import com.google.common.collect.Maps; + import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.server.world.ServerWorld; @@ -19,9 +23,8 @@ import ru.betterend.interfaces.TeleportingEntity; @Mixin(Entity.class) public abstract class EntityMixin implements TeleportingEntity { - + private static final Map COOLDOWN = Maps.newHashMap(); private BlockPos beExitPos; - private long beCooldown; @Shadow public float yaw; @@ -81,6 +84,7 @@ public abstract class EntityMixin implements TeleportingEntity { @Inject(method = "getTeleportTarget", at = @At("HEAD"), cancellable = true) protected void be_getTeleportTarget(ServerWorld destination, CallbackInfoReturnable info) { if (beExitPos != null) { + COOLDOWN.remove(beGetSelf()); info.setReturnValue(new TeleportTarget(new Vec3d(beExitPos.getX() + 0.5D, beExitPos.getY(), beExitPos.getZ() + 0.5D), getVelocity(), yaw, pitch)); } } @@ -88,18 +92,20 @@ public abstract class EntityMixin implements TeleportingEntity { @Inject(method = "baseTick", at = @At("TAIL")) public void be_baseTick(CallbackInfo info) { if (hasCooldown()) { - this.beCooldown--; + Entity key = beGetSelf(); + long value = COOLDOWN.getOrDefault(key, 0L) - 1; + COOLDOWN.put(key, value); } } @Override public long beGetCooldown() { - return this.beCooldown; + return COOLDOWN.getOrDefault(beGetSelf(), 0L); } @Override public void beSetCooldown(long time) { - this.beCooldown = time; + COOLDOWN.put(beGetSelf(), time); } @Override @@ -111,4 +117,8 @@ public abstract class EntityMixin implements TeleportingEntity { public BlockPos beGetExitPos() { return this.beExitPos; } + + private Entity beGetSelf() { + return (Entity) (Object) this; + } } From 7aa441171c26b5a6c9642144f7b08c4ee5d6f280 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 13 Jan 2021 15:53:29 +0300 Subject: [PATCH 152/463] Crystal rendering enhancement --- .../client/render/EternalCrystalRenderer.java | 26 +++++++++++------- .../textures/entity/eternal_crystal.png | Bin 310 -> 1690 bytes 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java b/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java index 348d778c..1568062e 100644 --- a/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java +++ b/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java @@ -7,7 +7,6 @@ import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.Identifier; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3i; import ru.betterend.BetterEnd; @@ -16,9 +15,8 @@ import ru.betterend.util.ColorUtil; import ru.betterend.util.MHelper; public class EternalCrystalRenderer { - private static final Identifier CRYSTAL_TEXTURE = BetterEnd.makeID("textures/entity/eternal_crystal.png"); private static final RenderLayer RENDER_LAYER; - private static final ModelPart SHARDS; + private static final ModelPart[] SHARDS; private static final ModelPart CORE; public static void render(int age, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumerProvider, int light) { @@ -29,7 +27,15 @@ public class EternalCrystalRenderer { matrices.scale(0.6F, 0.6F, 0.6F); matrices.multiply(Vector3f.POSITIVE_Y.getRadialQuaternion(rotation)); CORE.render(matrices, vertexConsumer, light, OverlayTexture.DEFAULT_UV, colors[0], colors[1], colors[2], colors[3]); - SHARDS.render(matrices, vertexConsumer, light, OverlayTexture.DEFAULT_UV, colors[0], colors[1], colors[2], colors[3]); + + for (int i = 0; i < 4; i++) { + matrices.push(); + float offset = MathHelper.sin(rotation * 2 + i) * 0.15F; + matrices.translate(0, offset, 0); + SHARDS[i].render(matrices, vertexConsumer, light, OverlayTexture.DEFAULT_UV, colors[0], colors[1], colors[2], colors[3]); + matrices.pop(); + } + matrices.pop(); } @@ -51,12 +57,12 @@ public class EternalCrystalRenderer { } static { - RENDER_LAYER = RenderLayer.getBeaconBeam(CRYSTAL_TEXTURE, true); - SHARDS = new ModelPart(16, 16, 2, 4); - SHARDS.addCuboid(-5.0F, 1.0F, -3.0F, 2.0F, 8.0F, 2.0F); - SHARDS.addCuboid(3.0F, -1.0F, -1.0F, 2.0F, 8.0F, 2.0F); - SHARDS.addCuboid(-1.0F, 0.0F, -5.0F, 2.0F, 4.0F, 2.0F); - SHARDS.addCuboid(0.0F, 3.0F, 4.0F, 2.0F, 6.0F, 2.0F); + RENDER_LAYER = RenderLayer.getBeaconBeam(BetterEnd.makeID("textures/entity/eternal_crystal.png"), true); + SHARDS = new ModelPart[4]; + SHARDS[0] = new ModelPart(16, 16, 2, 4).addCuboid(-5.0F, 1.0F, -3.0F, 2.0F, 8.0F, 2.0F); + SHARDS[1] = new ModelPart(16, 16, 2, 4).addCuboid(3.0F, -1.0F, -1.0F, 2.0F, 8.0F, 2.0F); + SHARDS[2] = new ModelPart(16, 16, 2, 4).addCuboid(-1.0F, 0.0F, -5.0F, 2.0F, 4.0F, 2.0F); + SHARDS[3] = new ModelPart(16, 16, 2, 4).addCuboid(0.0F, 3.0F, 4.0F, 2.0F, 6.0F, 2.0F); CORE = new ModelPart(16, 16, 0, 0); CORE.addCuboid(-2.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F); } diff --git a/src/main/resources/assets/betterend/textures/entity/eternal_crystal.png b/src/main/resources/assets/betterend/textures/entity/eternal_crystal.png index 878c3156c994d20d3f49424f6908f054670a2d00..f59b4bcce4ae059e8809322490cc7a0c03aeafa1 100644 GIT binary patch literal 1690 zcmbVNZEVzJ94|%5Z1S1PN1IaRH;w!^zVpnn^nUnUw{Vk(uVrfWQ#yh?u)-WmkiP!a2y*X& zVoIc)C3F$|SN4r{V|Nw4Y#tx|PT z0}aVqzmRMb7!fNiL5mYCB!~ioM-$PAtg{IYOYyRBZf+A8nt~W@99C`$L<8P>)U9X$ zwObsxK-p;2$yg`{$e^CR^@M~v!8Dh z0A1_#W@X$_muNIALN_Wqpc!e0+!3w&J5@mVfUd+e0aSKCH49B^RMxEl-cU5ZqC_%* zs?Vs5y4_}ATliNyexnk4~IdsEs`X%4yz*+5_tzsi!K)~1Z_b)=(JHdZFdSGigJlG$!E@c6d`5? zH*;S6pXci|2^JS0xoaM?aI$hj5h9FD4HJ)<6>-?@)r+qJz4|cmZT|G5CoV;2z`$1F5s53d(`|WI^ zC4bwt$UVSHo)2{w{ISFL&@V?$&vi{)oBmzz)R(m%c)_>VHfXqeT- zZmzI8W}h5iYZn&+YxDZXpBozBkcp|8r`yGn#z0TiPgmj{1NYs~k*{LtzLota-m++U z^gD+?+O_xX>66U|R~(dHf60E}vA!=$cYZNcw0z~qpQ*_A7bcm(yq-Nd$KLzVb@AxH z3^tgv=9TB0E|o1b)(M4g>LafFsnwsJcsy_^cf)TSwc+z)%)}}te`DWhckpDvo-Sr* zfomdPwG8O59Ut2*RZTX&;cjW$zFuNi%|A-HwtVu#BS-0Hu2=Vk1IN!*_OEXlx%Tju z!?FEmhP!t6PBOoiCHEhiI`f@eRXI97f91$GRn3>>{O#|4{p>n@ZePRY9Wyu2zQ3@v T;^OsF=HH{Hveq+H(emP-%cVt* delta 283 zcmV+$0p$Lg4YmT1B!B%$L_t(|+KrO24n#l@hWA zZ<3Y0y^FnK;@|%pzZsb8x{O;zQOLTka-OHW&su0anBQ-F!`^JKuI3sH@Ne(~g8}}? zKUVq-D9ci^ER#5nC5j?Rl0-Eg%;hk8TyDCqle(_;0HDx#uzwIYecwydG-~E~u7$>f zg}6D6L#nD$(~ghEgZZ3txmlJ)wr!I%P45OY9?a)Fz~vgywyg}qaK9)to(*{7W|}5F z_&egkLR{a0ZE$zQgSi2}xUR78``3 Date: Wed, 13 Jan 2021 16:46:25 +0300 Subject: [PATCH 153/463] Redwood tree start angle & city density option --- .../NightshadeRedwoodTreeFeature.java | 3 +- .../mixin/common/EndCityFeatureMixin.java | 43 +++++++++++++++++++ .../world/generator/GeneratorOptions.java | 6 +++ .../world/generator/IslandLayer.java | 9 +++- 4 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java diff --git a/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java index 3294d71d..e58089d2 100644 --- a/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java @@ -69,6 +69,7 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { float start = trunk.size() / 3F; float delta = trunk.size() * 0.6F; float max = height - 7; + float startAngle = random.nextFloat() * MHelper.PI2; for (int i = 0; i < count; i++) { float scale = (float) (count - i) / count * 15; Vector3f offset = SplineHelper.getPos(trunk, (float) i / count * delta + start); @@ -76,7 +77,7 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { break; } List branch = SplineHelper.copySpline(BRANCH); - SplineHelper.rotateSpline(branch, i * 1.3F); + SplineHelper.rotateSpline(branch, i * 1.3F + startAngle); SplineHelper.scale(branch, scale); SplineHelper.offsetParts(branch, random, 0.3F, 0.3F, 0.3F); SplineHelper.offset(branch, offset); diff --git a/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java new file mode 100644 index 00000000..0e4629d6 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java @@ -0,0 +1,43 @@ +package ru.betterend.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.util.math.ChunkPos; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.source.BiomeSource; +import net.minecraft.world.gen.ChunkRandom; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.gen.feature.EndCityFeature; +import ru.betterend.world.generator.GeneratorOptions; + +@Mixin(EndCityFeature.class) +public class EndCityFeatureMixin { + @Inject(method = "shouldStartAt", at = @At("HEAD"), cancellable = true) + private void be_shouldStartAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long l, ChunkRandom chunkRandom, int i, int j, Biome biome, ChunkPos chunkPos, DefaultFeatureConfig defaultFeatureConfig, CallbackInfoReturnable info) { + if (GeneratorOptions.useNewGenerator()) { + int chance = GeneratorOptions.getEndCityFailChance(); + if (chance == 0) { + info.setReturnValue(getGenerationHeight(i, j, chunkGenerator) >= 60); + info.cancel(); + } + else if (chunkRandom.nextInt(chance) == 0){ + info.setReturnValue(getGenerationHeight(i, j, chunkGenerator) >= 60); + info.cancel(); + } + else { + info.setReturnValue(false); + info.cancel(); + } + } + } + + @Shadow + private static int getGenerationHeight(int chunkX, int chunkZ, ChunkGenerator chunkGenerator) { + return 0; + } +} diff --git a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java index 8e9d4ca2..2a0b2a48 100644 --- a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java +++ b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java @@ -14,6 +14,7 @@ public class GeneratorOptions { private static boolean newGenerator; private static boolean noRingVoid; private static boolean generateCentralIsland; + private static int endCityFailChance; public static void init() { biomeSizeLand = Configs.GENERATOR_CONFIG.getInt("biomeMap", "biomeSizeLand", 256); @@ -27,6 +28,7 @@ public class GeneratorOptions { newGenerator = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "useNewGenerator", false); noRingVoid = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "noRingVoid", false); generateCentralIsland = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "generateCentralIsland", false); + endCityFailChance = Configs.GENERATOR_CONFIG.getInt("customGenerator", "endCityFailChance", 5); } public static int getBiomeSizeLand() { @@ -72,4 +74,8 @@ public class GeneratorOptions { public static boolean hasCentralIsland() { return generateCentralIsland; } + + public static int getEndCityFailChance() { + return endCityFailChance; + } } diff --git a/src/main/java/ru/betterend/world/generator/IslandLayer.java b/src/main/java/ru/betterend/world/generator/IslandLayer.java index 0b3fe663..18edff44 100644 --- a/src/main/java/ru/betterend/world/generator/IslandLayer.java +++ b/src/main/java/ru/betterend/world/generator/IslandLayer.java @@ -81,8 +81,13 @@ public class IslandLayer { private SDF getIsland(BlockPos pos) { SDF island = islands.get(pos); if (island == null) { - RANDOM.setSeed(getSeed(pos.getX(), pos.getZ())); - island = new SDFScale().setScale(RANDOM.nextFloat() + 0.5F).setSource(ISLAND); + if (pos.getX() == 0 && pos.getZ() == 0) { + island = new SDFScale().setScale(1.3F).setSource(ISLAND); + } + else { + RANDOM.setSeed(getSeed(pos.getX(), pos.getZ())); + island = new SDFScale().setScale(RANDOM.nextFloat() + 0.5F).setSource(ISLAND); + } islands.put(pos, island); } return island; From b36c4777c59120206787fe7ec385b31950f68057 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Wed, 13 Jan 2021 17:02:45 +0300 Subject: [PATCH 154/463] Optimized entity teleportation --- .../ru/betterend/blocks/EndPortalBlock.java | 28 ++++---- .../interfaces/TeleportingEntity.java | 9 +-- .../betterend/mixin/common/EntityMixin.java | 40 +----------- .../mixin/common/ServerPlayerEntityMixin.java | 64 ------------------- .../resources/betterend.mixins.common.json | 3 +- 5 files changed, 17 insertions(+), 127 deletions(-) delete mode 100644 src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index 8e882f56..7b29df91 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -1,5 +1,6 @@ package ru.betterend.blocks; +import java.util.Objects; import java.util.Random; import net.fabricmc.api.EnvType; @@ -31,9 +32,7 @@ import ru.betterend.registry.EndParticles; public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable { public EndPortalBlock() { - super(FabricBlockSettings.copyOf(Blocks.NETHER_PORTAL).resistance(Blocks.BEDROCK.getBlastResistance()).luminance(state -> { - return 12; - })); + super(FabricBlockSettings.copyOf(Blocks.NETHER_PORTAL).resistance(Blocks.BEDROCK.getBlastResistance()).luminance(state -> 12)); } @Override @@ -67,8 +66,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable @Override public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) { if (world instanceof ServerWorld && !entity.hasVehicle() && !entity.hasPassengers() && entity.canUsePortals()) { - TeleportingEntity teleEntity = TeleportingEntity.class.cast(entity); - if (teleEntity.hasCooldown()) return; + if (entity.hasNetherPortalCooldown()) return; boolean isOverworld = world.getRegistryKey().equals(World.OVERWORLD); ServerWorld destination = ((ServerWorld) world).getServer().getWorld(isOverworld ? World.END : World.OVERWORLD); BlockPos exitPos = this.findExitPos(destination, pos, entity); @@ -76,11 +74,14 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable if (entity instanceof ServerPlayerEntity) { ServerPlayerEntity player = (ServerPlayerEntity) entity; player.teleport(destination, exitPos.getX() + 0.5D, exitPos.getY(), exitPos.getZ() + 0.5D, entity.yaw, entity.pitch); - teleEntity.beSetCooldown(player.isCreative() ? 50 : 300); + player.resetNetherPortalCooldown(); } else { + TeleportingEntity teleEntity = (TeleportingEntity) entity; teleEntity.beSetExitPos(exitPos); - entity.moveToWorld(destination); - teleEntity.beSetCooldown(300); + Entity teleported = entity.moveToWorld(destination); + if (teleported != null) { + teleported.resetNetherPortalCooldown(); + } } } } @@ -91,8 +92,10 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable } private BlockPos findExitPos(ServerWorld world, BlockPos pos, Entity entity) { + if (world == null) return null; + Registry registry = world.getRegistryManager().getDimensionTypes(); - double mult = registry.get(DimensionType.THE_END_ID).getCoordinateScale(); + double mult = Objects.requireNonNull(registry.get(DimensionType.THE_END_ID)).getCoordinateScale(); BlockPos.Mutable basePos; if (world.getRegistryKey().equals(World.OVERWORLD)) { basePos = pos.mutableCopy().set(pos.getX() / mult, pos.getY(), pos.getZ() / mult); @@ -120,14 +123,11 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable entityDir = frontDir; } - if (frontDir == entityDir || frontDir.getOpposite() == entityDir) { - return checkPos.offset(entityDir); - } - else { + if (frontDir != entityDir && frontDir.getOpposite() != entityDir) { entity.applyRotation(BlockRotation.CLOCKWISE_90); entityDir = entityDir.rotateYClockwise(); - return checkPos.offset(entityDir); } + return checkPos.offset(entityDir); } checkPos.move(Direction.DOWN); } diff --git a/src/main/java/ru/betterend/interfaces/TeleportingEntity.java b/src/main/java/ru/betterend/interfaces/TeleportingEntity.java index f91957b6..8b9147a8 100644 --- a/src/main/java/ru/betterend/interfaces/TeleportingEntity.java +++ b/src/main/java/ru/betterend/interfaces/TeleportingEntity.java @@ -3,12 +3,5 @@ package ru.betterend.interfaces; import net.minecraft.util.math.BlockPos; public interface TeleportingEntity { - public abstract long beGetCooldown(); - public abstract void beSetCooldown(long time); - public abstract void beSetExitPos(BlockPos pos); - public abstract BlockPos beGetExitPos(); - - default boolean hasCooldown() { - return this.beGetCooldown() > 0; - } + void beSetExitPos(BlockPos pos); } diff --git a/src/main/java/ru/betterend/mixin/common/EntityMixin.java b/src/main/java/ru/betterend/mixin/common/EntityMixin.java index fb278a65..28d63f09 100644 --- a/src/main/java/ru/betterend/mixin/common/EntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EntityMixin.java @@ -7,11 +7,8 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import com.google.common.collect.Maps; - import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.server.world.ServerWorld; @@ -23,7 +20,7 @@ import ru.betterend.interfaces.TeleportingEntity; @Mixin(Entity.class) public abstract class EntityMixin implements TeleportingEntity { - private static final Map COOLDOWN = Maps.newHashMap(); + private BlockPos beExitPos; @Shadow @@ -45,12 +42,6 @@ public abstract class EntityMixin implements TeleportingEntity { @Shadow public abstract EntityType getType(); - @Shadow - public abstract void copyFrom(Entity original); - - @Shadow - public abstract Entity moveToWorld(ServerWorld destination); - @Shadow protected abstract TeleportTarget getTeleportTarget(ServerWorld destination); @@ -84,41 +75,12 @@ public abstract class EntityMixin implements TeleportingEntity { @Inject(method = "getTeleportTarget", at = @At("HEAD"), cancellable = true) protected void be_getTeleportTarget(ServerWorld destination, CallbackInfoReturnable info) { if (beExitPos != null) { - COOLDOWN.remove(beGetSelf()); info.setReturnValue(new TeleportTarget(new Vec3d(beExitPos.getX() + 0.5D, beExitPos.getY(), beExitPos.getZ() + 0.5D), getVelocity(), yaw, pitch)); } } - - @Inject(method = "baseTick", at = @At("TAIL")) - public void be_baseTick(CallbackInfo info) { - if (hasCooldown()) { - Entity key = beGetSelf(); - long value = COOLDOWN.getOrDefault(key, 0L) - 1; - COOLDOWN.put(key, value); - } - } - - @Override - public long beGetCooldown() { - return COOLDOWN.getOrDefault(beGetSelf(), 0L); - } - - @Override - public void beSetCooldown(long time) { - COOLDOWN.put(beGetSelf(), time); - } @Override public void beSetExitPos(BlockPos pos) { this.beExitPos = pos; } - - @Override - public BlockPos beGetExitPos() { - return this.beExitPos; - } - - private Entity beGetSelf() { - return (Entity) (Object) this; - } } diff --git a/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java b/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java deleted file mode 100644 index 97255cd7..00000000 --- a/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java +++ /dev/null @@ -1,64 +0,0 @@ -package ru.betterend.mixin.common; - -import java.util.Map; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import com.google.common.collect.Maps; -import com.mojang.authlib.GameProfile; - -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.registry.RegistryKey; -import net.minecraft.world.World; -import ru.betterend.interfaces.TeleportingEntity; - -@Mixin(ServerPlayerEntity.class) -public abstract class ServerPlayerEntityMixin extends PlayerEntity implements TeleportingEntity { - private static final Map COOLDOWN = Maps.newHashMap(); - - public ServerPlayerEntityMixin(World world, BlockPos pos, float yaw, GameProfile profile) { - super(world, pos, yaw, profile); - } - - @Shadow - private RegistryKey spawnPointDimension; - - @Inject(method = "tick", at = @At("TAIL")) - public void be_baseTick(CallbackInfo info) { - if (hasCooldown()) { - ServerPlayerEntity key = (ServerPlayerEntity) (Object) this; - long value = COOLDOWN.getOrDefault(key, 0L) - 1; - COOLDOWN.put(key, value); - } - } - - @Shadow - private void moveToSpawn(ServerWorld world) {} - - @Override - public long beGetCooldown() { - ServerPlayerEntity key = (ServerPlayerEntity) (Object) this; - return COOLDOWN.getOrDefault(key, 0L); - } - - @Override - public void beSetCooldown(long time) { - ServerPlayerEntity key = (ServerPlayerEntity) (Object) this; - COOLDOWN.put(key, time); - } - - @Override - public void beSetExitPos(BlockPos pos) {} - - @Override - public BlockPos beGetExitPos() { - return null; - } -} diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index 2bd6770a..9f616c2d 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -12,7 +12,6 @@ "NoiseChunkGeneratorMixin", "AnvilScreenHandlerMixin", "ChorusPlantFeatureMixin", - "ServerPlayerEntityMixin", "ComposterBlockAccessor", "ChorusFlowerBlockMixin", "LandPathNodeMakerMixin", @@ -33,7 +32,7 @@ "PlayerEntityMixin", "SlimeEntityMixin", "BrewingAccessor", - "EntityMixin", + "EntityMixin" ], "injectors": { "defaultRequire": 1 From 25efe551b2354089846fd4524a7b441f20d4cd13 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 13 Jan 2021 17:10:58 +0300 Subject: [PATCH 155/463] Small cleanup --- src/main/java/ru/betterend/mixin/common/EntityMixin.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/common/EntityMixin.java b/src/main/java/ru/betterend/mixin/common/EntityMixin.java index 28d63f09..a73bc4d1 100644 --- a/src/main/java/ru/betterend/mixin/common/EntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EntityMixin.java @@ -1,7 +1,5 @@ package ru.betterend.mixin.common; -import java.util.Map; - import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; From a9a5d8f2257ef9e0db6ee54b06e3be38f0b9e53e Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 13 Jan 2021 19:11:14 +0300 Subject: [PATCH 156/463] Portal positioning fix --- .../ru/betterend/rituals/EternalRitual.java | 161 +++++++++--------- .../features/terrain/RoundCaveFeature.java | 3 +- 2 files changed, 86 insertions(+), 78 deletions(-) diff --git a/src/main/java/ru/betterend/rituals/EternalRitual.java b/src/main/java/ru/betterend/rituals/EternalRitual.java index d1cda0e6..64be288c 100644 --- a/src/main/java/ru/betterend/rituals/EternalRitual.java +++ b/src/main/java/ru/betterend/rituals/EternalRitual.java @@ -8,7 +8,7 @@ import com.google.common.collect.Sets; import net.minecraft.block.Block; import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; +import net.minecraft.block.Material; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtHelper; import net.minecraft.particle.BlockStateParticleEffect; @@ -25,6 +25,7 @@ import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.Heightmap; import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.feature.ConfiguredFeatures; import ru.betterend.blocks.BlockProperties; @@ -33,7 +34,6 @@ import ru.betterend.blocks.RunedFlavolite; import ru.betterend.blocks.entities.EternalPedestalEntity; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; -import ru.betterend.registry.EndTags; public class EternalRitual { private final static Set STRUCTURE_MAP = Sets.newHashSet( @@ -52,49 +52,50 @@ public class EternalRitual { private final static Set BASE_MAP = Sets.newHashSet( new Point(3, 0), new Point(2, 0), new Point(2, 1), new Point(1, 1), new Point(1, 2), new Point(0, 1), new Point(0, 2)); - + private final static Block BASE = EndBlocks.FLAVOLITE.tiles; private final static Block PEDESTAL = EndBlocks.ETERNAL_PEDESTAL; private final static Block FRAME = EndBlocks.FLAVOLITE_RUNED_ETERNAL; private final static Block PORTAL = EndBlocks.END_PORTAL_BLOCK; private final static BooleanProperty ACTIVE = BlockProperties.ACTIVE; - + private World world; private Direction.Axis axis; private BlockPos center; private BlockPos exit; private boolean active = false; - + public EternalRitual(World world) { this.world = world; } - + public EternalRitual(World world, BlockPos initial) { this(world); this.configure(initial); } - + public boolean hasWorld() { return this.world != null; } - + public void setWorld(World world) { this.world = world; } - + private boolean isValid() { return world != null && !world.isClient() && - center != null && axis != null && - world.getRegistryKey() != World.NETHER; + center != null && axis != null && + world.getRegistryKey() != World.NETHER; } - + public void checkStructure() { if (!isValid()) return; Direction moveX, moveY; if (Direction.Axis.X == axis) { moveX = Direction.EAST; moveY = Direction.NORTH; - } else { + } + else { moveX = Direction.SOUTH; moveY = Direction.EAST; } @@ -108,10 +109,10 @@ public class EternalRitual { this.activatePortal(); } } - + private boolean checkFrame() { BlockPos framePos = center.down(); - Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH: Direction.EAST; + Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH : Direction.EAST; boolean valid = true; for (Point point : FRAME_MAP) { BlockPos pos = framePos.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); @@ -123,30 +124,37 @@ public class EternalRitual { } return valid; } - + public boolean isActive() { return this.active; } - + private void activatePortal() { if (active) return; this.activatePortal(world, center); this.doEffects((ServerWorld) world, center); if (exit == null) { this.exit = this.findPortalPos(); - } else { + } + else { World targetWorld = this.getTargetWorld(); - this.activatePortal(targetWorld, exit); + if (targetWorld.getBlockState(exit.up()).isOf(EndBlocks.END_PORTAL_BLOCK)) { + this.exit = this.findPortalPos(); + } + else { + this.activatePortal(targetWorld, exit); + } } this.active = true; } - + private void doEffects(ServerWorld serverWorld, BlockPos center) { Direction moveX, moveY; if (Direction.Axis.X == axis) { moveX = Direction.EAST; moveY = Direction.NORTH; - } else { + } + else { moveX = Direction.SOUTH; moveY = Direction.EAST; } @@ -158,10 +166,10 @@ public class EternalRitual { } serverWorld.playSound(null, center, SoundEvents.BLOCK_END_PORTAL_SPAWN, SoundCategory.NEUTRAL, 16, 1); } - + private void activatePortal(World world, BlockPos center) { BlockPos framePos = center.down(); - Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH: Direction.EAST; + Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH : Direction.EAST; BlockState frame = FRAME.getDefaultState().with(ACTIVE, true); FRAME_MAP.forEach(point -> { BlockPos pos = framePos.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); @@ -179,7 +187,7 @@ public class EternalRitual { BlockState portal = PORTAL.getDefaultState().with(EndPortalBlock.AXIS, portalAxis); ParticleEffect effect = new BlockStateParticleEffect(ParticleTypes.BLOCK, portal); ServerWorld serverWorld = (ServerWorld) world; - + PORTAL_MAP.forEach(point -> { BlockPos pos = center.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); if (!world.getBlockState(pos).isOf(PORTAL)) { @@ -195,17 +203,17 @@ public class EternalRitual { } }); } - + public void removePortal() { if (!active || !isValid()) return; World targetWorld = this.getTargetWorld(); this.removePortal(world, center); this.removePortal(targetWorld, exit); } - + private void removePortal(World world, BlockPos center) { BlockPos framePos = center.down(); - Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH: Direction.EAST; + Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH : Direction.EAST; FRAME_MAP.forEach(point -> { BlockPos pos = framePos.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); BlockState state = world.getBlockState(pos); @@ -230,39 +238,40 @@ public class EternalRitual { }); this.active = false; } - + private BlockPos findPortalPos() { MinecraftServer server = world.getServer(); ServerWorld targetWorld = (ServerWorld) this.getTargetWorld(); Registry registry = server.getRegistryManager().getDimensionTypes(); double mult = registry.get(DimensionType.THE_END_ID).getCoordinateScale(); BlockPos.Mutable basePos = center.mutableCopy().set(center.getX() / mult, center.getY(), center.getZ() / mult); - Direction.Axis portalAxis = Direction.Axis.X == axis ? Direction.Axis.Z : Direction.Axis.X; + Direction.Axis portalAxis = (Direction.Axis.X == axis) ? Direction.Axis.Z : Direction.Axis.X; if (checkIsAreaValid(targetWorld, basePos, portalAxis)) { EternalRitual.generatePortal(targetWorld, basePos, portalAxis); if (portalAxis.equals(Direction.Axis.X)) { return basePos.toImmutable(); - } else { + } + else { return basePos.toImmutable(); } - } else { + } + else { Direction direction = Direction.EAST; BlockPos.Mutable checkPos = basePos.mutableCopy(); - for (int step = 1; step < 64; step++) { - for (int i = 0; i < step; i++) { - checkPos.setY(5); - int ceil = targetWorld.getChunk(basePos).sampleHeightmap(Heightmap.Type.WORLD_SURFACE, checkPos.getX(), checkPos.getZ()) + 1; - if (ceil < 5) continue; - while(checkPos.getY() < ceil) { - if(checkIsAreaValid(targetWorld, checkPos, portalAxis)) { - EternalRitual.generatePortal(targetWorld, checkPos, portalAxis); - if (portalAxis.equals(Direction.Axis.X)) { - return checkPos.toImmutable(); - } else { + for (int step = 1; step < 128; step++) { + for (int i = 0; i < (step >> 1); i++) { + Chunk chunk = world.getChunk(checkPos); + if (chunk != null) { + int ceil = chunk.sampleHeightmap(Heightmap.Type.WORLD_SURFACE, checkPos.getX() & 15, checkPos.getZ() & 15) + 1; + if (ceil < 2) continue; + checkPos.setY(ceil); + while (checkPos.getY() > 2) { + if(checkIsAreaValid(targetWorld, checkPos, portalAxis)) { + EternalRitual.generatePortal(targetWorld, checkPos, portalAxis); return checkPos.toImmutable(); } + checkPos.move(Direction.DOWN); } - checkPos.move(Direction.UP); } checkPos.move(direction); } @@ -271,28 +280,25 @@ public class EternalRitual { } if (targetWorld.getRegistryKey() == World.END) { ConfiguredFeatures.END_ISLAND.generate(targetWorld, targetWorld.getChunkManager().getChunkGenerator(), new Random(basePos.asLong()), basePos.down()); - } else { + } + else { basePos.setY(targetWorld.getChunk(basePos).sampleHeightmap(Heightmap.Type.WORLD_SURFACE, basePos.getX(), basePos.getZ()) + 1); EndFeatures.OVERWORLD_ISLAND.getFeatureConfigured().generate(targetWorld, targetWorld.getChunkManager().getChunkGenerator(), new Random(basePos.asLong()), basePos.down()); } EternalRitual.generatePortal(targetWorld, basePos, portalAxis); - if (portalAxis.equals(Direction.Axis.X)) { - return basePos.toImmutable(); - } else { - return basePos.toImmutable(); - } + return basePos.toImmutable(); } - + private World getTargetWorld() { RegistryKey target = world.getRegistryKey() == World.END ? World.OVERWORLD : World.END; return world.getServer().getWorld(target); } - + private boolean checkIsAreaValid(World world, BlockPos pos, Direction.Axis axis) { if (!isBaseValid(world, pos, axis)) return false; return EternalRitual.checkArea(world, pos, axis); } - + private boolean isBaseValid(World world, BlockPos pos, Direction.Axis axis) { boolean solid = true; if (axis.equals(Direction.Axis.X)) { @@ -302,7 +308,8 @@ public class EternalRitual { BlockState state = world.getBlockState(checkPos); solid &= this.validBlock(world, checkPos, state); } - } else { + } + else { pos = pos.down().add(-3, 0, 0); for (int i = 0; i < 7; i++) { BlockPos checkPos = pos.add(i, 0, 0); @@ -312,20 +319,14 @@ public class EternalRitual { } return solid; } - + private boolean validBlock(World world, BlockPos pos, BlockState state) { - BlockState surfaceBlock = world.getBiome(pos).getGenerationSettings().getSurfaceConfig().getTopMaterial(); - return state.isSolidBlock(world, pos) && - (EndTags.validGenBlock(state) || - state.isOf(surfaceBlock.getBlock()) || - state.isOf(Blocks.STONE) || - state.isOf(Blocks.SAND) || - state.isOf(Blocks.GRAVEL)); + return state.isSolidBlock(world, pos) && state.isFullCube(world, pos); } - + public static void generatePortal(World world, BlockPos center, Direction.Axis axis) { BlockPos framePos = center.down(); - Direction moveDir = Direction.Axis.X == axis ? Direction.EAST: Direction.NORTH; + Direction moveDir = Direction.Axis.X == axis ? Direction.EAST : Direction.NORTH; BlockState frame = FRAME.getDefaultState().with(ACTIVE, true); FRAME_MAP.forEach(point -> { BlockPos pos = framePos.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); @@ -342,7 +343,7 @@ public class EternalRitual { }); generateBase(world, framePos, moveDir); } - + private static void generateBase(World world, BlockPos center, Direction moveX) { BlockState base = BASE.getDefaultState(); Direction moveY = moveX.rotateYClockwise(); @@ -357,20 +358,22 @@ public class EternalRitual { world.setBlockState(pos, base); }); } - + public static boolean checkArea(World world, BlockPos center, Direction.Axis axis) { - Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH: Direction.EAST; + Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH : Direction.EAST; for (BlockPos checkPos : BlockPos.iterate(center.offset(moveDir.rotateYClockwise()), center.offset(moveDir.rotateYCounterclockwise()))) { for (Point point : PORTAL_MAP) { BlockPos pos = checkPos.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); - if (!world.getBlockState(pos).isAir()) return false; + BlockState state = world.getBlockState(pos); + if (state.getFluidState().isEmpty() || (!state.getMaterial().isReplaceable() && !state.getMaterial().equals(Material.PLANT))) return false; pos = checkPos.mutableCopy().move(moveDir, -point.x).move(Direction.UP, point.y); - if (!world.getBlockState(pos).isAir()) return false; + state = world.getBlockState(pos); + if (state.getFluidState().isEmpty() || (!state.getMaterial().isReplaceable() && !state.getMaterial().equals(Material.PLANT))) return false; } } return true; } - + public void configure(BlockPos initial) { BlockPos checkPos = initial.east(12); if (this.hasPedestal(checkPos)) { @@ -403,7 +406,8 @@ public class EternalRitual { if (this.hasPedestal(checkPos)) { this.center = initial.north(5).east(4); return; - } else { + } + else { this.center = initial.north(5).west(4); return; } @@ -415,7 +419,8 @@ public class EternalRitual { if (this.hasPedestal(checkPos)) { this.center = initial.south(5).east(4); return; - } else { + } + else { this.center = initial.south(5).west(4); return; } @@ -427,7 +432,8 @@ public class EternalRitual { if (this.hasPedestal(checkPos)) { this.center = initial.east(5).south(4); return; - } else { + } + else { this.center = initial.east(5).north(4); return; } @@ -439,17 +445,18 @@ public class EternalRitual { if (this.hasPedestal(checkPos)) { this.center = initial.west(5).south(4); return; - } else { + } + else { this.center = initial.west(5).north(4); return; } } } - + private boolean hasPedestal(BlockPos pos) { return world.getBlockState(pos).isOf(PEDESTAL); } - + private boolean isActive(BlockPos pos) { BlockState state = world.getBlockState(pos); if (state.isOf(PEDESTAL)) { @@ -461,7 +468,7 @@ public class EternalRitual { } return false; } - + public CompoundTag toTag(CompoundTag tag) { tag.put("center", NbtHelper.fromBlockPos(center)); if (exit != null) { @@ -471,7 +478,7 @@ public class EternalRitual { tag.putBoolean("active", active); return tag; } - + public void fromTag(CompoundTag tag) { this.axis = Direction.Axis.fromName(tag.getString("axis")); this.center = NbtHelper.toBlockPos(tag.getCompound("center")); diff --git a/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java index d6774924..8ef6297a 100644 --- a/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java @@ -30,13 +30,14 @@ import ru.betterend.util.sdf.operator.SDFTranslate; import ru.betterend.util.sdf.primitive.SDFHexPrism; import ru.betterend.util.sdf.primitive.SDFSphere; import ru.betterend.world.features.DefaultFeature; +import ru.betterend.world.generator.GeneratorOptions; public class RoundCaveFeature extends DefaultFeature { private static final BlockState CAVE_AIR = Blocks.CAVE_AIR.getDefaultState(); @Override public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (pos.getX() * pos.getX() + pos.getZ() * pos.getZ() <= 22500) { + if (!(GeneratorOptions.useNewGenerator() && GeneratorOptions.noRingVoid()) || pos.getX() * pos.getX() + pos.getZ() * pos.getZ() <= 22500) { return false; } From 2820c51ae6134ca6043d96b8b0885af5a2b502a8 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Wed, 13 Jan 2021 20:58:27 +0300 Subject: [PATCH 157/463] Small fix --- src/main/java/ru/betterend/blocks/EndPortalBlock.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index 7b29df91..ece32e40 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -73,7 +73,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable if (exitPos == null) return; if (entity instanceof ServerPlayerEntity) { ServerPlayerEntity player = (ServerPlayerEntity) entity; - player.teleport(destination, exitPos.getX() + 0.5D, exitPos.getY(), exitPos.getZ() + 0.5D, entity.yaw, entity.pitch); + player.teleport(destination, exitPos.getX() + 0.5D, exitPos.getY(), exitPos.getZ() + 0.5D, player.yaw, player.pitch); player.resetNetherPortalCooldown(); } else { TeleportingEntity teleEntity = (TeleportingEntity) entity; From 471d5791e92de43f31fba6ade6df197e4bd27da1 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 14 Jan 2021 01:02:06 +0300 Subject: [PATCH 158/463] Small changes --- src/main/java/ru/betterend/blocks/EndPortalBlock.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index 7b29df91..6fc70bba 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -75,6 +75,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable ServerPlayerEntity player = (ServerPlayerEntity) entity; player.teleport(destination, exitPos.getX() + 0.5D, exitPos.getY(), exitPos.getZ() + 0.5D, entity.yaw, entity.pitch); player.resetNetherPortalCooldown(); + } else { TeleportingEntity teleEntity = (TeleportingEntity) entity; teleEntity.beSetExitPos(exitPos); From 87c0c153bb471dbbc76c877cbe29510a7e693efa Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 14 Jan 2021 03:41:45 +0300 Subject: [PATCH 159/463] Overworld-End teleport fix --- .../ru/betterend/blocks/EndPortalBlock.java | 25 +++++++++++++++++-- .../mixin/common/DimensionTypeMixin.java | 4 +-- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index 32624117..b4dcedf1 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -2,6 +2,8 @@ package ru.betterend.blocks; import java.util.Objects; import java.util.Random; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -20,6 +22,7 @@ import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction.Axis; import net.minecraft.util.math.Direction.AxisDirection; import net.minecraft.util.registry.Registry; +import net.minecraft.world.GameMode; import net.minecraft.world.Heightmap; import net.minecraft.world.World; import net.minecraft.world.WorldAccess; @@ -73,8 +76,10 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable if (exitPos == null) return; if (entity instanceof ServerPlayerEntity) { ServerPlayerEntity player = (ServerPlayerEntity) entity; - player.teleport(destination, exitPos.getX() + 0.5D, exitPos.getY(), exitPos.getZ() + 0.5D, player.yaw, player.pitch); - player.resetNetherPortalCooldown(); + //player.teleport(destination, exitPos.getX() + 0.5D, exitPos.getY(), exitPos.getZ() + 0.5D, player.yaw, player.pitch); + //player.onTeleportationDone(); + //player.resetNetherPortalCooldown(); + teleportPlayer(player, destination, exitPos); } else { TeleportingEntity teleEntity = (TeleportingEntity) entity; @@ -87,6 +92,22 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable } } + private void teleportPlayer(ServerPlayerEntity player, ServerWorld destination, BlockPos pos) { + if (player.isCreative()) { + player.teleport(destination, pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, player.yaw, player.pitch); + } + else { + player.moveToWorld(destination); + player.teleport(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); + if (destination.getRegistryKey() == World.OVERWORLD) { + destination.tickEntity(player); + player.teleport(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); + //player.teleport(destination, pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, player.yaw, player.pitch); + } + } + player.resetNetherPortalCooldown(); + } + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.TRANSLUCENT; diff --git a/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java b/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java index 99a889f9..a851723c 100644 --- a/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java +++ b/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java @@ -17,7 +17,7 @@ import ru.betterend.world.generator.GeneratorOptions; @Mixin(value = DimensionType.class, priority = 100) public class DimensionTypeMixin { @Inject(method = "createEndGenerator", at = @At("HEAD"), cancellable = true) - private static void beReplaceGenerator(Registry biomeRegistry, Registry chunkGeneratorSettingsRegistry, long seed, CallbackInfoReturnable info) { + private static void be_replaceGenerator(Registry biomeRegistry, Registry chunkGeneratorSettingsRegistry, long seed, CallbackInfoReturnable info) { info.setReturnValue(new NoiseChunkGenerator(new BetterEndBiomeSource(biomeRegistry, seed), seed, () -> { return (ChunkGeneratorSettings) chunkGeneratorSettingsRegistry.getOrThrow(ChunkGeneratorSettings.END); })); @@ -25,7 +25,7 @@ public class DimensionTypeMixin { } @Inject(method = "hasEnderDragonFight", at = @At("HEAD"), cancellable = true) - private void beHasEnderDragonFight(CallbackInfoReturnable info) { + private void be_hasEnderDragonFight(CallbackInfoReturnable info) { if (!GeneratorOptions.hasDragonFights()) { info.setReturnValue(false); info.cancel(); From 9c31454a46a846ab83182b326101906505acb2e6 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 14 Jan 2021 06:21:05 +0300 Subject: [PATCH 160/463] Updates version --- .../ru/betterend/blocks/EndPortalBlock.java | 20 +++++----- .../interfaces/TeleportingEntity.java | 2 + .../betterend/mixin/common/EntityMixin.java | 40 +++++++++++++++---- .../mixin/common/ServerPlayerEntityMixin.java | 28 +++++++++++++ .../resources/betterend.mixins.common.json | 1 + 5 files changed, 73 insertions(+), 18 deletions(-) create mode 100644 src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index b4dcedf1..87270399 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -2,8 +2,6 @@ package ru.betterend.blocks; import java.util.Objects; import java.util.Random; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -22,7 +20,6 @@ import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction.Axis; import net.minecraft.util.math.Direction.AxisDirection; import net.minecraft.util.registry.Registry; -import net.minecraft.world.GameMode; import net.minecraft.world.Heightmap; import net.minecraft.world.World; import net.minecraft.world.WorldAccess; @@ -76,9 +73,6 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable if (exitPos == null) return; if (entity instanceof ServerPlayerEntity) { ServerPlayerEntity player = (ServerPlayerEntity) entity; - //player.teleport(destination, exitPos.getX() + 0.5D, exitPos.getY(), exitPos.getZ() + 0.5D, player.yaw, player.pitch); - //player.onTeleportationDone(); - //player.resetNetherPortalCooldown(); teleportPlayer(player, destination, exitPos); } else { @@ -93,16 +87,22 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable } private void teleportPlayer(ServerPlayerEntity player, ServerWorld destination, BlockPos pos) { + ((TeleportingEntity) player).beSetExitPos(pos); if (player.isCreative()) { player.teleport(destination, pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, player.yaw, player.pitch); } else { - player.moveToWorld(destination); - player.teleport(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); if (destination.getRegistryKey() == World.OVERWORLD) { - destination.tickEntity(player); - player.teleport(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); //player.teleport(destination, pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, player.yaw, player.pitch); + //player.updatePositionAndAngles(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, player.yaw, player.pitch); + player.moveToWorld(destination); + player.teleport(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); + //player.updatePositionAndAngles(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, player.yaw, player.pitch); + //player.teleport(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); + } + else { + player.moveToWorld(destination); + player.teleport(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); } } player.resetNetherPortalCooldown(); diff --git a/src/main/java/ru/betterend/interfaces/TeleportingEntity.java b/src/main/java/ru/betterend/interfaces/TeleportingEntity.java index 8b9147a8..8e9caa0f 100644 --- a/src/main/java/ru/betterend/interfaces/TeleportingEntity.java +++ b/src/main/java/ru/betterend/interfaces/TeleportingEntity.java @@ -4,4 +4,6 @@ import net.minecraft.util.math.BlockPos; public interface TeleportingEntity { void beSetExitPos(BlockPos pos); + + boolean beCanTeleport(); } diff --git a/src/main/java/ru/betterend/mixin/common/EntityMixin.java b/src/main/java/ru/betterend/mixin/common/EntityMixin.java index a73bc4d1..6297dc6f 100644 --- a/src/main/java/ru/betterend/mixin/common/EntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EntityMixin.java @@ -1,5 +1,7 @@ package ru.betterend.mixin.common; +import java.util.Map; + import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -7,6 +9,8 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import com.google.common.collect.Maps; + import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.server.world.ServerWorld; @@ -18,8 +22,7 @@ import ru.betterend.interfaces.TeleportingEntity; @Mixin(Entity.class) public abstract class EntityMixin implements TeleportingEntity { - - private BlockPos beExitPos; + private static final Map EXIT_POS = Maps.newHashMap(); @Shadow public float yaw; @@ -45,14 +48,15 @@ public abstract class EntityMixin implements TeleportingEntity { @Inject(method = "moveToWorld", at = @At("HEAD"), cancellable = true) public void be_moveToWorld(ServerWorld destination, CallbackInfoReturnable info) { - if (!removed && beExitPos != null && world instanceof ServerWorld) { + Entity entity = (Entity) (Object) this; + if (!removed && beCanTeleport() && world instanceof ServerWorld) { this.detach(); this.world.getProfiler().push("changeDimension"); this.world.getProfiler().push("reposition"); TeleportTarget teleportTarget = this.getTeleportTarget(destination); if (teleportTarget != null) { this.world.getProfiler().swap("reloading"); - Entity entity = this.getType().create(destination); + entity = this.getType().create(destination); if (entity != null) { entity.copyFrom(Entity.class.cast(this)); entity.refreshPositionAndAngles(teleportTarget.position.x, teleportTarget.position.y, teleportTarget.position.z, teleportTarget.yaw, entity.pitch); @@ -64,21 +68,41 @@ public abstract class EntityMixin implements TeleportingEntity { ((ServerWorld) world).resetIdleTimeout(); destination.resetIdleTimeout(); this.world.getProfiler().pop(); - this.beExitPos = null; + be_resetTeleport(); info.setReturnValue(entity); + info.cancel(); } } } @Inject(method = "getTeleportTarget", at = @At("HEAD"), cancellable = true) protected void be_getTeleportTarget(ServerWorld destination, CallbackInfoReturnable info) { - if (beExitPos != null) { - info.setReturnValue(new TeleportTarget(new Vec3d(beExitPos.getX() + 0.5D, beExitPos.getY(), beExitPos.getZ() + 0.5D), getVelocity(), yaw, pitch)); + if (beCanTeleport()) { + BlockPos pos = EXIT_POS.get(be_getSelf()); + info.setReturnValue(new TeleportTarget(new Vec3d(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5), getVelocity(), yaw, pitch)); + be_resetTeleport(); + info.cancel(); } } + + @Shadow + protected void setRotation(float yaw, float pitch) {} @Override public void beSetExitPos(BlockPos pos) { - this.beExitPos = pos; + EXIT_POS.put(be_getSelf(), pos.toImmutable()); + } + + private void be_resetTeleport() { + EXIT_POS.remove(be_getSelf()); + } + + @Override + public boolean beCanTeleport() { + return EXIT_POS.containsKey(be_getSelf()); + } + + private Entity be_getSelf() { + return (Entity) (Object) this; } } diff --git a/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java b/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java new file mode 100644 index 00000000..9288555c --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java @@ -0,0 +1,28 @@ +package ru.betterend.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.TeleportTarget; + +@Mixin(ServerPlayerEntity.class) +public class ServerPlayerEntityMixin { + @Inject(method = "createEndSpawnPlatform", at = @At("HEAD"), cancellable = true) + private void be_createEndSpawnPlatform(ServerWorld world, BlockPos centerPos, CallbackInfo info) { + if (!centerPos.equals(world.getSpawnPos())) { + info.cancel(); + } + } + + @Inject(method = "getTeleportTarget", at = @At("HEAD"), cancellable = true) + protected void be_getTeleportTarget(ServerWorld destination, CallbackInfoReturnable info) { + info.setReturnValue(new TeleportTarget(new Vec3d(0, 100, 0), Vec3d.ZERO, 0, 0)); + } +} diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index 9f616c2d..aebff1d2 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -12,6 +12,7 @@ "NoiseChunkGeneratorMixin", "AnvilScreenHandlerMixin", "ChorusPlantFeatureMixin", + "ServerPlayerEntityMixin", "ComposterBlockAccessor", "ChorusFlowerBlockMixin", "LandPathNodeMakerMixin", From fcce1b363b9fbc135dae7e9de4786677cf280d5c Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 14 Jan 2021 06:52:03 +0300 Subject: [PATCH 161/463] Fixes --- .../ru/betterend/blocks/EndPortalBlock.java | 11 ++++++-- .../betterend/mixin/common/EntityMixin.java | 27 ++++++++----------- .../mixin/common/ServerPlayerEntityMixin.java | 8 ------ 3 files changed, 20 insertions(+), 26 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index 87270399..9255f46f 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -95,10 +95,17 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable if (destination.getRegistryKey() == World.OVERWORLD) { //player.teleport(destination, pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, player.yaw, player.pitch); //player.updatePositionAndAngles(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, player.yaw, player.pitch); - player.moveToWorld(destination); - player.teleport(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); + //player.moveToWorld(destination); + //player.teleport(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); //player.updatePositionAndAngles(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, player.yaw, player.pitch); //player.teleport(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); + + //player.teleport(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); + + // The most safe way + player.moveToWorld(destination); + + //player.teleport(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); } else { player.moveToWorld(destination); diff --git a/src/main/java/ru/betterend/mixin/common/EntityMixin.java b/src/main/java/ru/betterend/mixin/common/EntityMixin.java index 6297dc6f..466e34aa 100644 --- a/src/main/java/ru/betterend/mixin/common/EntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EntityMixin.java @@ -1,7 +1,5 @@ package ru.betterend.mixin.common; -import java.util.Map; - import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -9,8 +7,6 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import com.google.common.collect.Maps; - import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.server.world.ServerWorld; @@ -22,7 +18,7 @@ import ru.betterend.interfaces.TeleportingEntity; @Mixin(Entity.class) public abstract class EntityMixin implements TeleportingEntity { - private static final Map EXIT_POS = Maps.newHashMap(); + private BlockPos exitPos; @Shadow public float yaw; @@ -68,7 +64,7 @@ public abstract class EntityMixin implements TeleportingEntity { ((ServerWorld) world).resetIdleTimeout(); destination.resetIdleTimeout(); this.world.getProfiler().pop(); - be_resetTeleport(); + beResetTeleport(); info.setReturnValue(entity); info.cancel(); } @@ -78,9 +74,8 @@ public abstract class EntityMixin implements TeleportingEntity { @Inject(method = "getTeleportTarget", at = @At("HEAD"), cancellable = true) protected void be_getTeleportTarget(ServerWorld destination, CallbackInfoReturnable info) { if (beCanTeleport()) { - BlockPos pos = EXIT_POS.get(be_getSelf()); - info.setReturnValue(new TeleportTarget(new Vec3d(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5), getVelocity(), yaw, pitch)); - be_resetTeleport(); + info.setReturnValue(new TeleportTarget(new Vec3d(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), getVelocity(), yaw, pitch)); + beResetTeleport(); info.cancel(); } } @@ -90,19 +85,19 @@ public abstract class EntityMixin implements TeleportingEntity { @Override public void beSetExitPos(BlockPos pos) { - EXIT_POS.put(be_getSelf(), pos.toImmutable()); + exitPos = pos.toImmutable(); } - private void be_resetTeleport() { - EXIT_POS.remove(be_getSelf()); + public void beResetTeleport() { + exitPos = null; } @Override public boolean beCanTeleport() { - return EXIT_POS.containsKey(be_getSelf()); + return exitPos != null; } - private Entity be_getSelf() { - return (Entity) (Object) this; - } + public BlockPos beGetExit() { + return exitPos; + }; } diff --git a/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java b/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java index 9288555c..0ee31988 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java @@ -4,13 +4,10 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.TeleportTarget; @Mixin(ServerPlayerEntity.class) public class ServerPlayerEntityMixin { @@ -20,9 +17,4 @@ public class ServerPlayerEntityMixin { info.cancel(); } } - - @Inject(method = "getTeleportTarget", at = @At("HEAD"), cancellable = true) - protected void be_getTeleportTarget(ServerWorld destination, CallbackInfoReturnable info) { - info.setReturnValue(new TeleportTarget(new Vec3d(0, 100, 0), Vec3d.ZERO, 0, 0)); - } } From a396b3c9d1efdbe282151ef0d31e795faefd6a74 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 14 Jan 2021 20:38:36 +0300 Subject: [PATCH 162/463] Version change --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 0e1be849..7794c06d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ loader_version=0.10.8 # Mod Properties - mod_version = 0.8.8-beta + mod_version = 0.8.9-beta maven_group = ru.betterend archives_base_name = better-end From c8c8c5fa9eb9110202f5d1c3785f9f214791e57e Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 14 Jan 2021 20:42:07 +0300 Subject: [PATCH 163/463] Slime fixes --- .../ru/betterend/entity/EntityEndSlime.java | 26 +++++++++++-------- .../betterend/world/biome/BiomeAmberLand.java | 2 +- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/main/java/ru/betterend/entity/EntityEndSlime.java b/src/main/java/ru/betterend/entity/EntityEndSlime.java index 9d34f753..2544996e 100644 --- a/src/main/java/ru/betterend/entity/EntityEndSlime.java +++ b/src/main/java/ru/betterend/entity/EntityEndSlime.java @@ -77,10 +77,10 @@ public class EntityEndSlime extends SlimeEntity { EntityData data = super.initialize(world, difficulty, spawnReason, entityData, entityTag); EndBiome biome = EndBiomes.getFromBiome(world.getBiome(getBlockPos())); if (biome == EndBiomes.FOGGY_MUSHROOMLAND) { - this.setMossy(true); + this.setMossy(); } else if (biome == EndBiomes.MEGALAKE || biome == EndBiomes.MEGALAKE_GROVE) { - this.setLake(true); + this.setLake(); } else if (biome == EndBiomes.AMBER_LAND) { this.setAmber(true); @@ -123,7 +123,7 @@ public class EntityEndSlime extends SlimeEntity { float f = (float) i / 4.0F; int j = i / 2; int k = 2 + this.random.nextInt(3); - boolean mossy = this.isMossy(); + int type = this.getSlimeType(); for (int l = 0; l < k; ++l) { float g = ((float) (l % 2) - 0.5F) * f; @@ -133,7 +133,7 @@ public class EntityEndSlime extends SlimeEntity { slimeEntity.setPersistent(); } - slimeEntity.setMossy(mossy); + slimeEntity.setSlimeType(type); slimeEntity.setCustomName(text); slimeEntity.setAiDisabled(bl); slimeEntity.setInvulnerable(this.isInvulnerable()); @@ -166,20 +166,24 @@ public class EntityEndSlime extends SlimeEntity { return this.dataTracker.get(VARIANT).intValue(); } - protected void setMossy(boolean mossy) { - this.dataTracker.set(VARIANT, (byte) 1); + public void setSlimeType(int value) { + this.dataTracker.set(VARIANT, (byte) value); + } + + protected void setMossy() { + setSlimeType(1); } public boolean isMossy() { - return this.dataTracker.get(VARIANT) == 1; + return getSlimeType() == 1; } - protected void setLake(boolean mossy) { - this.dataTracker.set(VARIANT, (byte) 2); + protected void setLake() { + setSlimeType(2); } public boolean isLake() { - return this.dataTracker.get(VARIANT) == 2; + return getSlimeType() == 2; } protected void setAmber(boolean mossy) { @@ -195,7 +199,7 @@ public class EntityEndSlime extends SlimeEntity { } public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { - return random.nextInt(64) == 0 || isPermanentBiome(world, pos) || (notManyEntities(world, pos, 32, 3) && isWaterNear(world, pos, 32, 8)); + return random.nextInt(16) == 0 || isPermanentBiome(world, pos) || (notManyEntities(world, pos, 32, 3) && isWaterNear(world, pos, 32, 8)); } private static boolean isPermanentBiome(ServerWorldAccess world, BlockPos pos) { diff --git a/src/main/java/ru/betterend/world/biome/BiomeAmberLand.java b/src/main/java/ru/betterend/world/biome/BiomeAmberLand.java index 964fb726..142d9337 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeAmberLand.java +++ b/src/main/java/ru/betterend/world/biome/BiomeAmberLand.java @@ -30,6 +30,6 @@ public class BiomeAmberLand extends EndBiome { .addFeature(EndFeatures.CHARNIA_RED) .addStructureFeature(ConfiguredStructureFeatures.END_CITY) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4) - .addMobSpawn(EndEntities.END_SLIME, 10, 1, 2)); + .addMobSpawn(EndEntities.END_SLIME, 30, 1, 2)); } } From ff9e67458716be9142bb62f37e77e5278cf9725e Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 14 Jan 2021 20:51:51 +0300 Subject: [PATCH 164/463] Nightshade redwood leaves fix --- .../integration/byg/features/GreatNightshadeTreeFeature.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/integration/byg/features/GreatNightshadeTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/GreatNightshadeTreeFeature.java index 2894ea39..b9005f20 100644 --- a/src/main/java/ru/betterend/integration/byg/features/GreatNightshadeTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/GreatNightshadeTreeFeature.java @@ -40,8 +40,8 @@ public class GreatNightshadeTreeFeature extends DefaultFeature { BlockState log = Integrations.BYG.getDefaultState("nightshade_log"); BlockState wood = Integrations.BYG.getDefaultState("nightshade_wood"); - BlockState leaves = Integrations.BYG.getDefaultState("nightshade_leaves"); - BlockState leaves_flower = Integrations.BYG.getDefaultState("flowering_nightshade_leaves"); + BlockState leaves = Integrations.BYG.getDefaultState("nightshade_leaves").with(LeavesBlock.DISTANCE, 1); + BlockState leaves_flower = Integrations.BYG.getDefaultState("flowering_nightshade_leaves").with(LeavesBlock.DISTANCE, 1); Function splinePlacer = (bpos) -> { return log; }; Function replace = (state) -> { From 6d039875d2991ebd05306ff9a9e35706112abc5d Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 14 Jan 2021 22:00:20 +0300 Subject: [PATCH 165/463] Spire & ship fixes --- .../ru/betterend/util/StructureHelper.java | 2 +- .../terrain/FloatingSpireFeature.java | 4 ++ .../world/features/terrain/SpireFeature.java | 68 ++++++++++--------- 3 files changed, 41 insertions(+), 33 deletions(-) diff --git a/src/main/java/ru/betterend/util/StructureHelper.java b/src/main/java/ru/betterend/util/StructureHelper.java index 65851187..39879c5d 100644 --- a/src/main/java/ru/betterend/util/StructureHelper.java +++ b/src/main/java/ru/betterend/util/StructureHelper.java @@ -246,7 +246,7 @@ public class StructureHelper { while (world.getBlockState(mut2).getMaterial().isReplaceable() && mut2.getY() > minY) { mut2.setY(mut2.getY() - 1); } - if (y > 50 && state.canPlaceAt(world, mut2)) { + if (!world.getBlockState(mut2).isAir() && state.canPlaceAt(world, mut2)) { mut2.setY(mut2.getY() + 1); BlocksHelper.setWithoutUpdate(world, mut2, state); } diff --git a/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java index 8f9fa9e1..390e5c09 100644 --- a/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java @@ -7,6 +7,7 @@ import com.google.common.collect.Lists; import net.minecraft.block.Blocks; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -50,6 +51,9 @@ public class FloatingSpireFeature extends SpireFeature { } return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceConfig().getTopMaterial(); } + else if (info.getState(Direction.UP, 3).isAir()) { + return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceConfig().getUnderMaterial(); + } return info.getState(); }); sdf.fillRecursive(world, center); diff --git a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java index d0197817..f0518d81 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java @@ -11,6 +11,7 @@ import net.minecraft.block.Blocks; import net.minecraft.block.LeavesBlock; import net.minecraft.block.Material; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -32,39 +33,42 @@ public class SpireFeature extends DefaultFeature { @Override public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { pos = getPosOnSurfaceWG(world, pos); - if (pos.getY() > 57) { - SDF sdf = new SDFSphere().setRadius(MHelper.randRange(2, 3, random)).setBlock(Blocks.END_STONE); - int count = MHelper.randRange(3, 7, random); - for (int i = 0; i < count; i++) { - float rMin = (i * 1.3F) + 2.5F; - sdf = addSegment(sdf, MHelper.randRange(rMin, rMin + 1.5F, random), random); - } - OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); - sdf = new SDFDisplacement().setFunction((vec) -> { - return (float) (Math.abs(noise.eval(vec.getX() * 0.1, vec.getY() * 0.1, vec.getZ() * 0.1)) * 3F + Math.abs(noise.eval(vec.getX() * 0.3, vec.getY() * 0.3 + 100, vec.getZ() * 0.3)) * 1.3F); - }).setSource(sdf); - final BlockPos center = pos; - List support = Lists.newArrayList(); - sdf.setReplaceFunction(REPLACE).addPostProcess((info) -> { - if (info.getStateUp().isAir()) { - if (random.nextInt(16) == 0) { - support.add(info.getPos().up()); - } - return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceConfig().getTopMaterial(); - } - return info.getState(); - }); - sdf.fillRecursive(world, center); - - support.forEach((bpos) -> { - if (EndBiomes.getFromBiome(world.getBiome(bpos)) == EndBiomes.BLOSSOMING_SPIRES) { - EndFeatures.TENANEA_BUSH.getFeature().generate(world, chunkGenerator, random, bpos, null); - } - }); - - return true; + if (pos.getY() < 10 || !world.getBlockState(pos.down(3)).isIn(EndTags.GEN_TERRAIN) || !world.getBlockState(pos.down(6)).isIn(EndTags.GEN_TERRAIN)) { + return false; } - return false; + + SDF sdf = new SDFSphere().setRadius(MHelper.randRange(2, 3, random)).setBlock(Blocks.END_STONE); + int count = MHelper.randRange(3, 7, random); + for (int i = 0; i < count; i++) { + float rMin = (i * 1.3F) + 2.5F; + sdf = addSegment(sdf, MHelper.randRange(rMin, rMin + 1.5F, random), random); + } + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); + sdf = new SDFDisplacement().setFunction((vec) -> { + return (float) (Math.abs(noise.eval(vec.getX() * 0.1, vec.getY() * 0.1, vec.getZ() * 0.1)) * 3F + Math.abs(noise.eval(vec.getX() * 0.3, vec.getY() * 0.3 + 100, vec.getZ() * 0.3)) * 1.3F); + }).setSource(sdf); + final BlockPos center = pos; + List support = Lists.newArrayList(); + sdf.setReplaceFunction(REPLACE).addPostProcess((info) -> { + if (info.getStateUp().isAir()) { + if (random.nextInt(16) == 0) { + support.add(info.getPos().up()); + } + return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceConfig().getTopMaterial(); + } + else if (info.getState(Direction.UP, 3).isAir()) { + return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceConfig().getUnderMaterial(); + } + return info.getState(); + }).fillRecursive(world, center); + + support.forEach((bpos) -> { + if (EndBiomes.getFromBiome(world.getBiome(bpos)) == EndBiomes.BLOSSOMING_SPIRES) { + EndFeatures.TENANEA_BUSH.getFeature().generate(world, chunkGenerator, random, bpos, null); + } + }); + + return true; } protected SDF addSegment(SDF sdf, float radius, Random random) { From 21f8cb54c0cd1c9d58d5a30e43102f0823d52c5c Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 15 Jan 2021 00:53:40 +0300 Subject: [PATCH 166/463] Lake prototype --- .../ru/betterend/registry/EndStructures.java | 2 +- .../features/StructureMegaLake.java | 8 +- .../world/structures/piece/LakePiece.java | 25 +-- .../world/structures/piece/LakePiece2.java | 182 ++++++++++++++++++ 4 files changed, 202 insertions(+), 15 deletions(-) create mode 100644 src/main/java/ru/betterend/world/structures/piece/LakePiece2.java diff --git a/src/main/java/ru/betterend/registry/EndStructures.java b/src/main/java/ru/betterend/registry/EndStructures.java index 87884cc4..67756626 100644 --- a/src/main/java/ru/betterend/registry/EndStructures.java +++ b/src/main/java/ru/betterend/registry/EndStructures.java @@ -33,7 +33,7 @@ public class EndStructures { public static final StructurePieceType NBT_PIECE = register("nbt_piece", NBTPiece::new); public static final EndStructureFeature GIANT_MOSSY_GLOWSHROOM = new EndStructureFeature("giant_mossy_glowshroom", new StructureGiantMossyGlowshroom(), Feature.SURFACE_STRUCTURES, 16, 8); - public static final EndStructureFeature MEGALAKE = new EndStructureFeature("megalake", new StructureMegaLake(), Feature.RAW_GENERATION, 8, 2); + public static final EndStructureFeature MEGALAKE = new EndStructureFeature("megalake", new StructureMegaLake(), Feature.RAW_GENERATION, 4, 1); public static final EndStructureFeature MOUNTAIN = new EndStructureFeature("mountain", new StructureMountain(), Feature.RAW_GENERATION, 3, 2); public static final EndStructureFeature PAINTED_MOUNTAIN = new EndStructureFeature("painted_mountain", new StructurePaintedMountain(), Feature.RAW_GENERATION, 3, 2); public static final EndStructureFeature ETERNAL_PORTAL = new EndStructureFeature("eternal_portal", new StructureEternalPortal(), Feature.SURFACE_STRUCTURES, 16, 6); diff --git a/src/main/java/ru/betterend/world/structures/features/StructureMegaLake.java b/src/main/java/ru/betterend/world/structures/features/StructureMegaLake.java index e42c8bb8..ad67f32d 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructureMegaLake.java +++ b/src/main/java/ru/betterend/world/structures/features/StructureMegaLake.java @@ -12,6 +12,7 @@ import net.minecraft.world.gen.feature.DefaultFeatureConfig; import net.minecraft.world.gen.feature.StructureFeature; import ru.betterend.util.MHelper; import ru.betterend.world.structures.piece.LakePiece; +import ru.betterend.world.structures.piece.LakePiece2; public class StructureMegaLake extends StructureFeatureBase { @Override @@ -30,9 +31,10 @@ public class StructureMegaLake extends StructureFeatureBase { int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); if (y > 5) { - float radius = MHelper.randRange(50, 150, random); - float depth = MHelper.randRange(6, 10, random); - LakePiece piece = new LakePiece(new BlockPos(x, y - 3, z), radius, depth, random, biome); + float radius = MHelper.randRange(64, 96, random); + float depth = MHelper.randRange(8, 25, random); + //LakePiece piece = new LakePiece(new BlockPos(x, y - 3, z), radius, depth, random, biome); + LakePiece2 piece = new LakePiece2(new BlockPos(x, y, z), radius, depth, random, biome); this.children.add(piece); } this.setBoundingBoxFromChildren(); diff --git a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java index c4fff550..b6965803 100644 --- a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java @@ -105,12 +105,12 @@ public class LakePiece extends BasePiece { pos.setZ(z); dist = 1 - dist / r2; int maxY = map.get(x, z); - if (MathHelper.abs(maxY - center.getY()) < 8) { - float minY = (float) Math.sqrt(dist) * depth * getHeightClamp(world, 8, px, pz); + if (MathHelper.abs(maxY - center.getY()) < 16) { + float minY = (float) Math.sqrt(dist) * depth * getHeightClamp(world, 12, px, pz); if (minY > 0) { - minY *= (float) noise1.eval(px * 0.05, pz * 0.05) * 0.3F + 0.7F; - minY *= (float) noise1.eval(px * 0.1, pz * 0.1) * 0.1F + 0.8F; - float lerp = minY / 4F; + //minY *= (float) noise1.eval(px * 0.05, pz * 0.05) * 0.3F + 0.7F; + //minY *= (float) noise1.eval(px * 0.1, pz * 0.1) * 0.1F + 0.8F; + float lerp = minY / 8F; if (lerp > 1) { lerp = 1; } @@ -214,23 +214,26 @@ public class LakePiece extends BasePiece { } h = world.getTopY(Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); - h = MathHelper.abs(h - center.getY()); - if (h > 4) { - h = 4 - h; + /*h = 5 - MathHelper.abs(h - center.getY()); + if (h < 2) { heightmap.put(p, h); return h; } - h = MHelper.floor(noise2.eval(pos.getX() * 0.01, pos.getZ() * 0.01) * noise2.eval(pos.getX() * 0.002, pos.getZ() * 0.002) * 8 + 8); + h = MHelper.floor(noise2.eval(pos.getX() * 0.01, pos.getZ() * 0.01) * noise2.eval(pos.getX() * 0.002, pos.getZ() * 0.002) * 8 + 8);*/ - if (h < 0) { + h = 8 - MathHelper.abs(h - center.getY()); + heightmap.put(p, h); + return h; + + /*if (h < 0) { heightmap.put(p, 0); return 0; } heightmap.put(p, h); - return h; + return h;*/ } private float getHeightClamp(StructureWorldAccess world, int radius, int posX, int posZ) { diff --git a/src/main/java/ru/betterend/world/structures/piece/LakePiece2.java b/src/main/java/ru/betterend/world/structures/piece/LakePiece2.java new file mode 100644 index 00000000..aac374ec --- /dev/null +++ b/src/main/java/ru/betterend/world/structures/piece/LakePiece2.java @@ -0,0 +1,182 @@ +package ru.betterend.world.structures.piece; + +import java.util.Map; +import java.util.Random; + +import com.google.common.collect.Maps; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtHelper; +import net.minecraft.structure.StructureManager; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockBox; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.Heightmap.Type; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.gen.StructureAccessor; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.registry.EndBiomes; +import ru.betterend.registry.EndStructures; +import ru.betterend.registry.EndTags; +import ru.betterend.util.MHelper; + +public class LakePiece2 extends BasePiece { + private static final BlockState ENDSTONE = Blocks.END_STONE.getDefaultState(); + private static final BlockState WATER = Blocks.WATER.getDefaultState(); + private Map heightmap = Maps.newHashMap(); + private OpenSimplexNoise noise; + private BlockPos center; + private float radius; + private float aspect; + private float depth; + private int seed; + + private Identifier biomeID; + + public LakePiece2(BlockPos center, float radius, float depth, Random random, Biome biome) { + super(EndStructures.LAKE_PIECE, random.nextInt()); + this.center = center; + this.radius = radius; + this.depth = depth; + this.seed = random.nextInt(); + this.noise = new OpenSimplexNoise(this.seed); + this.aspect = radius / depth; + this.biomeID = EndBiomes.getBiomeID(biome); + makeBoundingBox(); + } + + public LakePiece2(StructureManager manager, CompoundTag tag) { + super(EndStructures.LAKE_PIECE, tag); + makeBoundingBox(); + } + + @Override + protected void toNbt(CompoundTag tag) { + tag.put("center", NbtHelper.fromBlockPos(center)); + tag.putFloat("radius", radius); + tag.putFloat("depth", depth); + tag.putInt("seed", seed); + tag.putString("biome", biomeID.toString()); + } + + @Override + protected void fromNbt(CompoundTag tag) { + center = NbtHelper.toBlockPos(tag.getCompound("center")); + radius = tag.getFloat("radius"); + depth = tag.getFloat("depth"); + seed = tag.getInt("seed"); + noise = new OpenSimplexNoise(seed); + aspect = radius / depth; + biomeID = new Identifier(tag.getString("biome")); + } + + @Override + public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + int minY = this.boundingBox.minY; + int maxY = this.boundingBox.maxY; + int sx = chunkPos.x << 4; + int sz = chunkPos.z << 4; + Mutable mut = new Mutable(); + Chunk chunk = world.getChunk(chunkPos.x, chunkPos.z); + for (int x = 0; x < 16; x++) { + mut.setX(x); + int wx = x | sx; + double nx = wx * 0.1; + int x2 = MHelper.pow2(wx - center.getX()); + for (int z = 0; z < 16; z++) { + mut.setZ(z); + int wz = z | sz; + double nz = wz * 0.1; + int z2 = MHelper.pow2(wz - center.getZ()); + float clamp = getHeightClamp(world, 8, wx, wz); + if (clamp < 0.01) continue; + for (int y = minY; y <= maxY; y++) { + mut.setY(y); + double ny = y * 0.1; + double y2 = MHelper.pow2((y - center.getY()) * aspect); + double r2 = (noise.eval(nx, ny, nz) * 10 + radius) * clamp; + double r3 = r2 + 8; + r2 *= r2; + r3 *= r3; + double dist = x2 + y2 + z2; + if (dist < r2) { + BlockState state = chunk.getBlockState(mut); + if (state.isIn(EndTags.GEN_TERRAIN) || state.getMaterial().isReplaceable()) { + state = y < center.getY() ? WATER : AIR; + chunk.setBlockState(mut, state, false); + } + } + else if (dist < r3 && y < center.getY()) { + BlockState state = chunk.getBlockState(mut); + BlockPos worldPos = mut.add(sx, 0, sz); + if (!state.isFullCube(world, worldPos) || !state.isSolidBlock(world, worldPos)) { + chunk.setBlockState(mut, ENDSTONE, false); + } + } + } + } + } + + return true; + } + + private int getHeight(StructureWorldAccess world, BlockPos pos) { + int p = ((pos.getX() & 2047) << 11) | (pos.getZ() & 2047); + int h = heightmap.getOrDefault(p, Byte.MIN_VALUE); + if (h > Byte.MIN_VALUE) { + return h; + } + + if (!EndBiomes.getBiomeID(world.getBiome(pos)).equals(biomeID)) { + heightmap.put(p, (byte) 0); + return 0; + } + + h = world.getTopY(Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); + h = MathHelper.abs(h - center.getY()); + h = h < 8 ? 1 : 0; + + heightmap.put(p, (byte) h); + return h; + } + + private float getHeightClamp(StructureWorldAccess world, int radius, int posX, int posZ) { + Mutable mut = new Mutable(); + int r2 = radius * radius; + float height = 0; + float max = 0; + for (int x = -radius; x <= radius; x++) { + mut.setX(posX + x); + int x2 = x * x; + for (int z = -radius; z <= radius; z++) { + mut.setZ(posZ + z); + int z2 = z * z; + if (x2 + z2 < r2) { + float mult = 1 - (float) Math.sqrt(x2 + z2) / radius; + max += mult; + height += getHeight(world, mut) * mult; + } + } + } + height /= max; + return MathHelper.clamp(height, 0, 1); + } + + private void makeBoundingBox() { + int minX = MHelper.floor(center.getX() - radius - 8); + int minY = MHelper.floor(center.getX() - depth - 8); + int minZ = MHelper.floor(center.getZ() - radius - 8); + int maxX = MHelper.floor(center.getX() + radius + 8); + int maxY = MHelper.floor(center.getY() + depth + 8); + int maxZ = MHelper.floor(center.getZ() + radius + 8); + this.boundingBox = new BlockBox(minX, minY, minZ, maxX, maxY, maxZ); + } +} \ No newline at end of file From f7482ec8118ab485d50fdbedea1c45c0d9196638 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 15 Jan 2021 05:45:45 +0300 Subject: [PATCH 167/463] Lake fixes --- .../ru/betterend/registry/EndStructures.java | 2 + .../world/biome/BiomeMegalakeGrove.java | 2 +- .../features/StructureMegaLake.java | 6 +- .../features/StructureMegaLakeSmall.java | 41 +++++++ .../world/structures/piece/LakePiece2.java | 115 +++++++++++++++--- 5 files changed, 146 insertions(+), 20 deletions(-) create mode 100644 src/main/java/ru/betterend/world/structures/features/StructureMegaLakeSmall.java diff --git a/src/main/java/ru/betterend/registry/EndStructures.java b/src/main/java/ru/betterend/registry/EndStructures.java index 67756626..ce0d4833 100644 --- a/src/main/java/ru/betterend/registry/EndStructures.java +++ b/src/main/java/ru/betterend/registry/EndStructures.java @@ -15,6 +15,7 @@ import ru.betterend.world.structures.features.StructureEternalPortal; import ru.betterend.world.structures.features.StructureGiantIceStar; import ru.betterend.world.structures.features.StructureGiantMossyGlowshroom; import ru.betterend.world.structures.features.StructureMegaLake; +import ru.betterend.world.structures.features.StructureMegaLakeSmall; import ru.betterend.world.structures.features.StructureMountain; import ru.betterend.world.structures.features.StructurePaintedMountain; import ru.betterend.world.structures.piece.CavePiece; @@ -34,6 +35,7 @@ public class EndStructures { public static final EndStructureFeature GIANT_MOSSY_GLOWSHROOM = new EndStructureFeature("giant_mossy_glowshroom", new StructureGiantMossyGlowshroom(), Feature.SURFACE_STRUCTURES, 16, 8); public static final EndStructureFeature MEGALAKE = new EndStructureFeature("megalake", new StructureMegaLake(), Feature.RAW_GENERATION, 4, 1); + public static final EndStructureFeature MEGALAKE_SMALL = new EndStructureFeature("megalake_small", new StructureMegaLakeSmall(), Feature.RAW_GENERATION, 4, 1); public static final EndStructureFeature MOUNTAIN = new EndStructureFeature("mountain", new StructureMountain(), Feature.RAW_GENERATION, 3, 2); public static final EndStructureFeature PAINTED_MOUNTAIN = new EndStructureFeature("painted_mountain", new StructurePaintedMountain(), Feature.RAW_GENERATION, 3, 2); public static final EndStructureFeature ETERNAL_PORTAL = new EndStructureFeature("eternal_portal", new StructureEternalPortal(), Feature.SURFACE_STRUCTURES, 16, 6); diff --git a/src/main/java/ru/betterend/world/biome/BiomeMegalakeGrove.java b/src/main/java/ru/betterend/world/biome/BiomeMegalakeGrove.java index b8a0e01b..dc6d76f5 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeMegalakeGrove.java +++ b/src/main/java/ru/betterend/world/biome/BiomeMegalakeGrove.java @@ -19,7 +19,7 @@ public class BiomeMegalakeGrove extends EndBiome { .setMusic(EndSounds.MUSIC_WATER) .setLoop(EndSounds.AMBIENT_MEGALAKE_GROVE) .setSurface(EndBlocks.END_MOSS) - .addStructureFeature(EndStructures.MEGALAKE) + .addStructureFeature(EndStructures.MEGALAKE_SMALL) .addFeature(EndFeatures.LACUGROVE) .addFeature(EndFeatures.END_LOTUS) .addFeature(EndFeatures.END_LOTUS_LEAF) diff --git a/src/main/java/ru/betterend/world/structures/features/StructureMegaLake.java b/src/main/java/ru/betterend/world/structures/features/StructureMegaLake.java index ad67f32d..dce9d88f 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructureMegaLake.java +++ b/src/main/java/ru/betterend/world/structures/features/StructureMegaLake.java @@ -11,7 +11,6 @@ import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; import net.minecraft.world.gen.feature.StructureFeature; import ru.betterend.util.MHelper; -import ru.betterend.world.structures.piece.LakePiece; import ru.betterend.world.structures.piece.LakePiece2; public class StructureMegaLake extends StructureFeatureBase { @@ -31,9 +30,8 @@ public class StructureMegaLake extends StructureFeatureBase { int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); if (y > 5) { - float radius = MHelper.randRange(64, 96, random); - float depth = MHelper.randRange(8, 25, random); - //LakePiece piece = new LakePiece(new BlockPos(x, y - 3, z), radius, depth, random, biome); + float radius = MHelper.randRange(32, 64, random); + float depth = MHelper.randRange(7, 15, random); LakePiece2 piece = new LakePiece2(new BlockPos(x, y, z), radius, depth, random, biome); this.children.add(piece); } diff --git a/src/main/java/ru/betterend/world/structures/features/StructureMegaLakeSmall.java b/src/main/java/ru/betterend/world/structures/features/StructureMegaLakeSmall.java new file mode 100644 index 00000000..87eea48f --- /dev/null +++ b/src/main/java/ru/betterend/world/structures/features/StructureMegaLakeSmall.java @@ -0,0 +1,41 @@ +package ru.betterend.world.structures.features; + +import net.minecraft.structure.StructureManager; +import net.minecraft.structure.StructureStart; +import net.minecraft.util.math.BlockBox; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.registry.DynamicRegistryManager; +import net.minecraft.world.Heightmap.Type; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.gen.feature.StructureFeature; +import ru.betterend.util.MHelper; +import ru.betterend.world.structures.piece.LakePiece2; + +public class StructureMegaLakeSmall extends StructureFeatureBase { + @Override + public StructureFeature.StructureStartFactory getStructureStartFactory() { + return SDFStructureStart::new; + } + + public static class SDFStructureStart extends StructureStart { + public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, int references, long seed) { + super(feature, chunkX, chunkZ, box, references, seed); + } + + @Override + public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { + int x = (chunkX << 4) | MHelper.randRange(4, 12, random); + int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); + int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); + if (y > 5) { + float radius = MHelper.randRange(20, 40, random); + float depth = MHelper.randRange(5, 10, random); + LakePiece2 piece = new LakePiece2(new BlockPos(x, y, z), radius, depth, random, biome); + this.children.add(piece); + } + this.setBoundingBoxFromChildren(); + } + } +} diff --git a/src/main/java/ru/betterend/world/structures/piece/LakePiece2.java b/src/main/java/ru/betterend/world/structures/piece/LakePiece2.java index aac374ec..7b7697d7 100644 --- a/src/main/java/ru/betterend/world/structures/piece/LakePiece2.java +++ b/src/main/java/ru/betterend/world/structures/piece/LakePiece2.java @@ -7,6 +7,7 @@ import com.google.common.collect.Maps; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.fluid.FluidState; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtHelper; import net.minecraft.structure.StructureManager; @@ -15,17 +16,20 @@ import net.minecraft.util.math.BlockBox; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos.Mutable; import net.minecraft.util.math.ChunkPos; +import net.minecraft.util.math.Direction; import net.minecraft.util.math.MathHelper; -import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.Heightmap.Type; +import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.gen.StructureAccessor; import net.minecraft.world.gen.chunk.ChunkGenerator; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; +import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndStructures; import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; public class LakePiece2 extends BasePiece { @@ -90,44 +94,119 @@ public class LakePiece2 extends BasePiece { mut.setX(x); int wx = x | sx; double nx = wx * 0.1; - int x2 = MHelper.pow2(wx - center.getX()); + int x2 = wx - center.getX(); for (int z = 0; z < 16; z++) { mut.setZ(z); int wz = z | sz; double nz = wz * 0.1; - int z2 = MHelper.pow2(wz - center.getZ()); + int z2 = wz - center.getZ(); float clamp = getHeightClamp(world, 8, wx, wz); if (clamp < 0.01) continue; + + double n = noise.eval(nx, nz) * 1.5 + 1.5; + double x3 = MHelper.pow2(x2 + noise.eval(nx, nz, 100) * 10); + double z3 = MHelper.pow2(z2 + noise.eval(nx, nz, -100) * 10); + for (int y = minY; y <= maxY; y++) { - mut.setY(y); - double ny = y * 0.1; + mut.setY((int) (y + n)); double y2 = MHelper.pow2((y - center.getY()) * aspect); - double r2 = (noise.eval(nx, ny, nz) * 10 + radius) * clamp; + double r2 = radius * clamp; double r3 = r2 + 8; r2 *= r2; - r3 *= r3; - double dist = x2 + y2 + z2; + r3 = r3 * r3 + 100; + double dist = x3 + y2 + z3; if (dist < r2) { BlockState state = chunk.getBlockState(mut); - if (state.isIn(EndTags.GEN_TERRAIN) || state.getMaterial().isReplaceable()) { - state = y < center.getY() ? WATER : AIR; + if (state.isIn(EndTags.GEN_TERRAIN) || state.isAir()) { + state = mut.getY() < center.getY() ? WATER : AIR; chunk.setBlockState(mut, state, false); } } - else if (dist < r3 && y < center.getY()) { + else if (dist <= r3 && mut.getY() < center.getY()) { BlockState state = chunk.getBlockState(mut); BlockPos worldPos = mut.add(sx, 0, sz); - if (!state.isFullCube(world, worldPos) || !state.isSolidBlock(world, worldPos)) { - chunk.setBlockState(mut, ENDSTONE, false); + if (!state.isFullCube(world, worldPos) && !state.isSolidBlock(world, worldPos)) { + state = chunk.getBlockState(mut.up()); + if (state.isAir()) { + state = random.nextBoolean() ? ENDSTONE : world.getBiome(worldPos).getGenerationSettings().getSurfaceConfig().getTopMaterial(); + } + else { + state = state.getFluidState().isEmpty() ? ENDSTONE : EndBlocks.ENDSTONE_DUST.getDefaultState(); + } + chunk.setBlockState(mut, state, false); } } } } } - + fixWater(world, chunk, mut, random, sx, sz); return true; } + private void fixWater(StructureWorldAccess world, Chunk chunk, Mutable mut, Random random, int sx, int sz) { + int minY = this.boundingBox.minY; + int maxY = this.boundingBox.maxY; + for (int x = 0; x < 16; x++) { + mut.setX(x); + for (int z = 0; z < 16; z++) { + mut.setZ(z); + for (int y = minY; y <= maxY; y++) { + mut.setY(y); + FluidState state = chunk.getFluidState(mut); + if (!state.isEmpty()) { + mut.setY(y - 1); + if (chunk.getBlockState(mut).isAir()) { + mut.setY(y + 1); + + BlockState bState = chunk.getBlockState(mut); + if (bState.isAir()) { + bState = random.nextBoolean() ? ENDSTONE : world.getBiome(mut.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getTopMaterial(); + } + else { + bState = bState.getFluidState().isEmpty() ? ENDSTONE : EndBlocks.ENDSTONE_DUST.getDefaultState(); + } + + mut.setY(y); + + makeEndstonePillar(chunk, mut, bState); + } + else if (x > 1 && x < 15 && z > 1 && z < 15) { + mut.setY(y); + for (Direction dir: BlocksHelper.HORIZONTAL) { + BlockPos wPos = mut.add(dir.getOffsetX(), 0, dir.getOffsetZ()); + if (chunk.getBlockState(wPos).isAir()) { + mut.setY(y + 1); + BlockState bState = chunk.getBlockState(mut); + if (bState.isAir()) { + bState = random.nextBoolean() ? ENDSTONE : world.getBiome(mut.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getTopMaterial(); + } + else { + bState = bState.getFluidState().isEmpty() ? ENDSTONE : EndBlocks.ENDSTONE_DUST.getDefaultState(); + } + mut.setY(y); + makeEndstonePillar(chunk, mut, bState); + break; + } + } + } + else if (chunk.getBlockState(mut.move(Direction.UP)).isAir()) { + chunk.getFluidTickScheduler().schedule(mut.move(Direction.DOWN), state.getFluid(), 0); + } + } + } + } + } + } + + private void makeEndstonePillar(Chunk chunk, Mutable mut, BlockState terrain) { + chunk.setBlockState(mut, terrain, false); + mut.setY(mut.getY() - 1); + while (!chunk.getFluidState(mut).isEmpty()) { + chunk.setBlockState(mut, ENDSTONE, false); + mut.setY(mut.getY() - 1); + } + } + private int getHeight(StructureWorldAccess world, BlockPos pos) { int p = ((pos.getX() & 2047) << 11) | (pos.getZ() & 2047); int h = heightmap.getOrDefault(p, Byte.MIN_VALUE); @@ -140,6 +219,12 @@ public class LakePiece2 extends BasePiece { return 0; } + /*h = world.getTopY(Type.WORLD_SURFACE, pos.getX(), pos.getZ()); + if (!world.getBlockState(new BlockPos(pos.getX(), h - 1, pos.getZ())).getFluidState().isEmpty()) { + heightmap.put(p, (byte) 0); + return 0; + }*/ + h = world.getTopY(Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); h = MathHelper.abs(h - center.getY()); h = h < 8 ? 1 : 0; @@ -175,7 +260,7 @@ public class LakePiece2 extends BasePiece { int minY = MHelper.floor(center.getX() - depth - 8); int minZ = MHelper.floor(center.getZ() - radius - 8); int maxX = MHelper.floor(center.getX() + radius + 8); - int maxY = MHelper.floor(center.getY() + depth + 8); + int maxY = MHelper.floor(center.getY() + depth); int maxZ = MHelper.floor(center.getZ() + radius + 8); this.boundingBox = new BlockBox(minX, minY, minZ, maxX, maxY, maxZ); } From 8255318d0608b00528e99d3d077c11679150e37d Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 15 Jan 2021 05:56:05 +0300 Subject: [PATCH 168/463] Fixed slime avoid void AI --- src/main/java/ru/betterend/entity/EntityEndSlime.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/entity/EntityEndSlime.java b/src/main/java/ru/betterend/entity/EntityEndSlime.java index 2544996e..a5eb3ba3 100644 --- a/src/main/java/ru/betterend/entity/EntityEndSlime.java +++ b/src/main/java/ru/betterend/entity/EntityEndSlime.java @@ -242,8 +242,8 @@ public class EntityEndSlime extends SlimeEntity { float yaw = EntityEndSlime.this.getHeadYaw(); float speed = EntityEndSlime.this.getMovementSpeed(); if (speed > 0.1) { - float dx = MathHelper.sin(-yaw * 0.017453292F - 3.1415927F); - float dz = MathHelper.cos(-yaw * 0.017453292F - 3.1415927F); + float dx = MathHelper.sin(-yaw * 0.017453292F); + float dz = MathHelper.cos(-yaw * 0.017453292F); BlockPos pos = EntityEndSlime.this.getBlockPos().add(dx * speed * 4, 0, dz * speed * 4); int down = BlocksHelper.downRay(EntityEndSlime.this.world, pos, 16); return down < 5; From 4fb81c1c1f81832ea3bf70c019c7e01783c4f6fe Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 15 Jan 2021 05:56:59 +0300 Subject: [PATCH 169/463] Removed old lake piece --- .../features/StructureMegaLake.java | 4 +- .../features/StructureMegaLakeSmall.java | 4 +- .../world/structures/piece/LakePiece.java | 277 +++++++++--------- .../world/structures/piece/LakePiece2.java | 267 ----------------- 4 files changed, 142 insertions(+), 410 deletions(-) delete mode 100644 src/main/java/ru/betterend/world/structures/piece/LakePiece2.java diff --git a/src/main/java/ru/betterend/world/structures/features/StructureMegaLake.java b/src/main/java/ru/betterend/world/structures/features/StructureMegaLake.java index dce9d88f..e0f5368e 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructureMegaLake.java +++ b/src/main/java/ru/betterend/world/structures/features/StructureMegaLake.java @@ -11,7 +11,7 @@ import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; import net.minecraft.world.gen.feature.StructureFeature; import ru.betterend.util.MHelper; -import ru.betterend.world.structures.piece.LakePiece2; +import ru.betterend.world.structures.piece.LakePiece; public class StructureMegaLake extends StructureFeatureBase { @Override @@ -32,7 +32,7 @@ public class StructureMegaLake extends StructureFeatureBase { if (y > 5) { float radius = MHelper.randRange(32, 64, random); float depth = MHelper.randRange(7, 15, random); - LakePiece2 piece = new LakePiece2(new BlockPos(x, y, z), radius, depth, random, biome); + LakePiece piece = new LakePiece(new BlockPos(x, y, z), radius, depth, random, biome); this.children.add(piece); } this.setBoundingBoxFromChildren(); diff --git a/src/main/java/ru/betterend/world/structures/features/StructureMegaLakeSmall.java b/src/main/java/ru/betterend/world/structures/features/StructureMegaLakeSmall.java index 87eea48f..966e5dc7 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructureMegaLakeSmall.java +++ b/src/main/java/ru/betterend/world/structures/features/StructureMegaLakeSmall.java @@ -11,7 +11,7 @@ import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; import net.minecraft.world.gen.feature.StructureFeature; import ru.betterend.util.MHelper; -import ru.betterend.world.structures.piece.LakePiece2; +import ru.betterend.world.structures.piece.LakePiece; public class StructureMegaLakeSmall extends StructureFeatureBase { @Override @@ -32,7 +32,7 @@ public class StructureMegaLakeSmall extends StructureFeatureBase { if (y > 5) { float radius = MHelper.randRange(20, 40, random); float depth = MHelper.randRange(5, 10, random); - LakePiece2 piece = new LakePiece2(new BlockPos(x, y, z), radius, depth, random, biome); + LakePiece piece = new LakePiece(new BlockPos(x, y, z), radius, depth, random, biome); this.children.add(piece); } this.setBoundingBoxFromChildren(); diff --git a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java index b6965803..238704ae 100644 --- a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java @@ -7,6 +7,7 @@ import com.google.common.collect.Maps; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.fluid.FluidState; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtHelper; import net.minecraft.structure.StructureManager; @@ -15,8 +16,8 @@ import net.minecraft.util.math.BlockBox; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos.Mutable; import net.minecraft.util.math.ChunkPos; +import net.minecraft.util.math.Direction; import net.minecraft.util.math.MathHelper; -import net.minecraft.world.Heightmap; import net.minecraft.world.Heightmap.Type; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.biome.Biome; @@ -28,31 +29,30 @@ import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndStructures; import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; public class LakePiece extends BasePiece { + private static final BlockState ENDSTONE = Blocks.END_STONE.getDefaultState(); private static final BlockState WATER = Blocks.WATER.getDefaultState(); - private Map heightmap = Maps.newHashMap(); - private OpenSimplexNoise noise1; - private OpenSimplexNoise noise2; + private Map heightmap = Maps.newHashMap(); + private OpenSimplexNoise noise; private BlockPos center; private float radius; + private float aspect; private float depth; - private float r2; + private int seed; + private Identifier biomeID; - private int seed1; - private int seed2; public LakePiece(BlockPos center, float radius, float depth, Random random, Biome biome) { super(EndStructures.LAKE_PIECE, random.nextInt()); this.center = center; this.radius = radius; this.depth = depth; - this.r2 = MHelper.pow2(radius); - this.seed1 = random.nextInt(); - this.seed2 = random.nextInt(); - this.noise1 = new OpenSimplexNoise(this.seed1); - this.noise2 = new OpenSimplexNoise(this.seed2); + this.seed = random.nextInt(); + this.noise = new OpenSimplexNoise(this.seed); + this.aspect = radius / depth; this.biomeID = EndBiomes.getBiomeID(biome); makeBoundingBox(); } @@ -67,9 +67,8 @@ public class LakePiece extends BasePiece { tag.put("center", NbtHelper.fromBlockPos(center)); tag.putFloat("radius", radius); tag.putFloat("depth", depth); + tag.putInt("seed", seed); tag.putString("biome", biomeID.toString()); - tag.putInt("seed1", seed1); - tag.putInt("seed2", seed2); } @Override @@ -77,163 +76,161 @@ public class LakePiece extends BasePiece { center = NbtHelper.toBlockPos(tag.getCompound("center")); radius = tag.getFloat("radius"); depth = tag.getFloat("depth"); - r2 = MHelper.pow2(radius); - seed1 = tag.getInt("seed1"); - seed2 = tag.getInt("seed2"); - noise1 = new OpenSimplexNoise(seed1); - noise2 = new OpenSimplexNoise(seed2); + seed = tag.getInt("seed"); + noise = new OpenSimplexNoise(seed); + aspect = radius / depth; biomeID = new Identifier(tag.getString("biome")); } @Override public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { - int sx = chunkPos.getStartX(); - int sz = chunkPos.getStartZ(); - Mutable pos = new Mutable(); + int minY = this.boundingBox.minY; + int maxY = this.boundingBox.maxY; + int sx = chunkPos.x << 4; + int sz = chunkPos.z << 4; + Mutable mut = new Mutable(); Chunk chunk = world.getChunk(chunkPos.x, chunkPos.z); - Heightmap map = chunk.getHeightmap(Type.WORLD_SURFACE_WG); for (int x = 0; x < 16; x++) { - int px = x + sx; - int px2 = MHelper.pow2(px - center.getX()); - pos.setX(x); + mut.setX(x); + int wx = x | sx; + double nx = wx * 0.1; + int x2 = wx - center.getX(); for (int z = 0; z < 16; z++) { - int pz = z + sz; - int pz2 = MHelper.pow2(pz - center.getZ()); - float dist = px2 + pz2; - if (dist > r2) continue; + mut.setZ(z); + int wz = z | sz; + double nz = wz * 0.1; + int z2 = wz - center.getZ(); + float clamp = getHeightClamp(world, 8, wx, wz); + if (clamp < 0.01) continue; - pos.setZ(z); - dist = 1 - dist / r2; - int maxY = map.get(x, z); - if (MathHelper.abs(maxY - center.getY()) < 16) { - float minY = (float) Math.sqrt(dist) * depth * getHeightClamp(world, 12, px, pz); - if (minY > 0) { - //minY *= (float) noise1.eval(px * 0.05, pz * 0.05) * 0.3F + 0.7F; - //minY *= (float) noise1.eval(px * 0.1, pz * 0.1) * 0.1F + 0.8F; - float lerp = minY / 8F; - if (lerp > 1) { - lerp = 1; + double n = noise.eval(nx, nz) * 1.5 + 1.5; + double x3 = MHelper.pow2(x2 + noise.eval(nx, nz, 100) * 10); + double z3 = MHelper.pow2(z2 + noise.eval(nx, nz, -100) * 10); + + for (int y = minY; y <= maxY; y++) { + mut.setY((int) (y + n)); + double y2 = MHelper.pow2((y - center.getY()) * aspect); + double r2 = radius * clamp; + double r3 = r2 + 8; + r2 *= r2; + r3 = r3 * r3 + 100; + double dist = x3 + y2 + z3; + if (dist < r2) { + BlockState state = chunk.getBlockState(mut); + if (state.isIn(EndTags.GEN_TERRAIN) || state.isAir()) { + state = mut.getY() < center.getY() ? WATER : AIR; + chunk.setBlockState(mut, state, false); } - minY = MathHelper.lerp(lerp, maxY - minY, center.getY() - minY); - pos.setY(maxY); - while (!chunk.getBlockState(pos).getMaterial().isReplaceable()) { - pos.setY(maxY ++); - } - - if (!waterIsNear(world, pos.getX() + sx, center.getY(), pos.getZ() + sz, 2)) { - if (maxY <= center.getY() + 1) { - maxY = MathHelper.clamp(maxY + 4, 0, center.getY()); - BlockState surf = random.nextBoolean() ? EndBlocks.ENDSTONE_DUST.getDefaultState() : world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getTopMaterial(); - BlockState under = world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getUnderMaterial(); - for (int y = maxY; y >= minY; y--) { - pos.setY(y); - BlockState state = chunk.getBlockState(pos); - if (state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN)) { - chunk.setBlockState(pos, y > center.getY() ? AIR : y == maxY ? surf : under, false); - } - else { - break; - } - } + } + else if (dist <= r3 && mut.getY() < center.getY()) { + BlockState state = chunk.getBlockState(mut); + BlockPos worldPos = mut.add(sx, 0, sz); + if (!state.isFullCube(world, worldPos) && !state.isSolidBlock(world, worldPos)) { + state = chunk.getBlockState(mut.up()); + if (state.isAir()) { + state = random.nextBoolean() ? ENDSTONE : world.getBiome(worldPos).getGenerationSettings().getSurfaceConfig().getTopMaterial(); } else { - for (int y = maxY; y >= minY; y--) { - pos.setY(y); - BlockState state = chunk.getBlockState(pos); - if (state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN)) { - if (maxY <= center.getY() + 1) - chunk.setBlockState(pos, Blocks.REDSTONE_BLOCK.getDefaultState(), false); - else - chunk.setBlockState(pos, y > center.getY() ? AIR : WATER, false); + state = state.getFluidState().isEmpty() ? ENDSTONE : EndBlocks.ENDSTONE_DUST.getDefaultState(); + } + chunk.setBlockState(mut, state, false); + } + } + } + } + } + fixWater(world, chunk, mut, random, sx, sz); + return true; + } + + private void fixWater(StructureWorldAccess world, Chunk chunk, Mutable mut, Random random, int sx, int sz) { + int minY = this.boundingBox.minY; + int maxY = this.boundingBox.maxY; + for (int x = 0; x < 16; x++) { + mut.setX(x); + for (int z = 0; z < 16; z++) { + mut.setZ(z); + for (int y = minY; y <= maxY; y++) { + mut.setY(y); + FluidState state = chunk.getFluidState(mut); + if (!state.isEmpty()) { + mut.setY(y - 1); + if (chunk.getBlockState(mut).isAir()) { + mut.setY(y + 1); + + BlockState bState = chunk.getBlockState(mut); + if (bState.isAir()) { + bState = random.nextBoolean() ? ENDSTONE : world.getBiome(mut.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getTopMaterial(); + } + else { + bState = bState.getFluidState().isEmpty() ? ENDSTONE : EndBlocks.ENDSTONE_DUST.getDefaultState(); + } + + mut.setY(y); + + makeEndstonePillar(chunk, mut, bState); + } + else if (x > 1 && x < 15 && z > 1 && z < 15) { + mut.setY(y); + for (Direction dir: BlocksHelper.HORIZONTAL) { + BlockPos wPos = mut.add(dir.getOffsetX(), 0, dir.getOffsetZ()); + if (chunk.getBlockState(wPos).isAir()) { + mut.setY(y + 1); + BlockState bState = chunk.getBlockState(mut); + if (bState.isAir()) { + bState = random.nextBoolean() ? ENDSTONE : world.getBiome(mut.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getTopMaterial(); } else { - break; + bState = bState.getFluidState().isEmpty() ? ENDSTONE : EndBlocks.ENDSTONE_DUST.getDefaultState(); } - } - } - } - - boolean under = pos.getY() <= center.getY() || (pos.getY() == center.getY() + 1 && random.nextBoolean()); - pos.setY(pos.getY() - 1); - BlockState state = chunk.getBlockState(pos); - if (state.isIn(EndTags.GEN_TERRAIN) || (state.getMaterial().isReplaceable() && pos.getY() <= center.getY())) { - state = under ? EndBlocks.ENDSTONE_DUST.getDefaultState() : world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getTopMaterial(); - chunk.setBlockState(pos, state, false); - maxY = (int) (noise1.eval((pos.getX() + sx) * 0.1, (pos.getZ() + sz) * 0.1) + 2); - state = world.getBiome(pos.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getUnderMaterial(); - for (int i = 0; i < maxY; i++) { - pos.setY(pos.getY() - 1); - if (state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN)) { - chunk.setBlockState(pos, state, false); - } - else { + mut.setY(y); + makeEndstonePillar(chunk, mut, bState); break; } } } + else if (chunk.getBlockState(mut.move(Direction.UP)).isAir()) { + chunk.getFluidTickScheduler().schedule(mut.move(Direction.DOWN), state.getFluid(), 0); + } } } } } - - map = chunk.getHeightmap(Type.WORLD_SURFACE); - - return true; } - private boolean waterIsNear(StructureWorldAccess world, int x, int y, int z, int r) { - int py = world.getChunk(x >> 4, z >> 4).sampleHeightmap(Type.WORLD_SURFACE, x & 15, z & 15) - 1; - if (py > y) { - Mutable m = new Mutable(); - m.setY(py); - for (int i = -r; i <= r; i++) { - int px = x + i; - m.setX(px); - for (int j = -r; j <= r; j++) { - int pz = z + j; - m.setZ(pz); - if (!world.getFluidState(m).isEmpty()) { - return true; - } - } - } + private void makeEndstonePillar(Chunk chunk, Mutable mut, BlockState terrain) { + chunk.setBlockState(mut, terrain, false); + mut.setY(mut.getY() - 1); + while (!chunk.getFluidState(mut).isEmpty()) { + chunk.setBlockState(mut, ENDSTONE, false); + mut.setY(mut.getY() - 1); } - return false; } private int getHeight(StructureWorldAccess world, BlockPos pos) { int p = ((pos.getX() & 2047) << 11) | (pos.getZ() & 2047); - int h = heightmap.getOrDefault(p, Integer.MIN_VALUE); - if (h > Integer.MIN_VALUE) { + int h = heightmap.getOrDefault(p, Byte.MIN_VALUE); + if (h > Byte.MIN_VALUE) { return h; } if (!EndBiomes.getBiomeID(world.getBiome(pos)).equals(biomeID)) { - heightmap.put(p, -4); - return -4; - } - h = world.getTopY(Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); - - /*h = 5 - MathHelper.abs(h - center.getY()); - if (h < 2) { - heightmap.put(p, h); - return h; - } - - h = MHelper.floor(noise2.eval(pos.getX() * 0.01, pos.getZ() * 0.01) * noise2.eval(pos.getX() * 0.002, pos.getZ() * 0.002) * 8 + 8);*/ - - h = 8 - MathHelper.abs(h - center.getY()); - heightmap.put(p, h); - return h; - - /*if (h < 0) { - heightmap.put(p, 0); + heightmap.put(p, (byte) 0); return 0; } - heightmap.put(p, h); + /*h = world.getTopY(Type.WORLD_SURFACE, pos.getX(), pos.getZ()); + if (!world.getBlockState(new BlockPos(pos.getX(), h - 1, pos.getZ())).getFluidState().isEmpty()) { + heightmap.put(p, (byte) 0); + return 0; + }*/ - return h;*/ + h = world.getTopY(Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); + h = MathHelper.abs(h - center.getY()); + h = h < 8 ? 1 : 0; + + heightmap.put(p, (byte) h); + return h; } private float getHeightClamp(StructureWorldAccess world, int radius, int posX, int posZ) { @@ -255,14 +252,16 @@ public class LakePiece extends BasePiece { } } height /= max; - return MathHelper.clamp(height / radius, 0, 1); + return MathHelper.clamp(height, 0, 1); } private void makeBoundingBox() { - int minX = MHelper.floor(center.getX() - radius); - int minZ = MHelper.floor(center.getZ() - radius); - int maxX = MHelper.floor(center.getX() + radius + 1); - int maxZ = MHelper.floor(center.getZ() + radius + 1); - this.boundingBox = new BlockBox(minX, minZ, maxX, maxZ); + int minX = MHelper.floor(center.getX() - radius - 8); + int minY = MHelper.floor(center.getX() - depth - 8); + int minZ = MHelper.floor(center.getZ() - radius - 8); + int maxX = MHelper.floor(center.getX() + radius + 8); + int maxY = MHelper.floor(center.getY() + depth); + int maxZ = MHelper.floor(center.getZ() + radius + 8); + this.boundingBox = new BlockBox(minX, minY, minZ, maxX, maxY, maxZ); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/world/structures/piece/LakePiece2.java b/src/main/java/ru/betterend/world/structures/piece/LakePiece2.java deleted file mode 100644 index 7b7697d7..00000000 --- a/src/main/java/ru/betterend/world/structures/piece/LakePiece2.java +++ /dev/null @@ -1,267 +0,0 @@ -package ru.betterend.world.structures.piece; - -import java.util.Map; -import java.util.Random; - -import com.google.common.collect.Maps; - -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.fluid.FluidState; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtHelper; -import net.minecraft.structure.StructureManager; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.gen.StructureAccessor; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import ru.betterend.noise.OpenSimplexNoise; -import ru.betterend.registry.EndBiomes; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndStructures; -import ru.betterend.registry.EndTags; -import ru.betterend.util.BlocksHelper; -import ru.betterend.util.MHelper; - -public class LakePiece2 extends BasePiece { - private static final BlockState ENDSTONE = Blocks.END_STONE.getDefaultState(); - private static final BlockState WATER = Blocks.WATER.getDefaultState(); - private Map heightmap = Maps.newHashMap(); - private OpenSimplexNoise noise; - private BlockPos center; - private float radius; - private float aspect; - private float depth; - private int seed; - - private Identifier biomeID; - - public LakePiece2(BlockPos center, float radius, float depth, Random random, Biome biome) { - super(EndStructures.LAKE_PIECE, random.nextInt()); - this.center = center; - this.radius = radius; - this.depth = depth; - this.seed = random.nextInt(); - this.noise = new OpenSimplexNoise(this.seed); - this.aspect = radius / depth; - this.biomeID = EndBiomes.getBiomeID(biome); - makeBoundingBox(); - } - - public LakePiece2(StructureManager manager, CompoundTag tag) { - super(EndStructures.LAKE_PIECE, tag); - makeBoundingBox(); - } - - @Override - protected void toNbt(CompoundTag tag) { - tag.put("center", NbtHelper.fromBlockPos(center)); - tag.putFloat("radius", radius); - tag.putFloat("depth", depth); - tag.putInt("seed", seed); - tag.putString("biome", biomeID.toString()); - } - - @Override - protected void fromNbt(CompoundTag tag) { - center = NbtHelper.toBlockPos(tag.getCompound("center")); - radius = tag.getFloat("radius"); - depth = tag.getFloat("depth"); - seed = tag.getInt("seed"); - noise = new OpenSimplexNoise(seed); - aspect = radius / depth; - biomeID = new Identifier(tag.getString("biome")); - } - - @Override - public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { - int minY = this.boundingBox.minY; - int maxY = this.boundingBox.maxY; - int sx = chunkPos.x << 4; - int sz = chunkPos.z << 4; - Mutable mut = new Mutable(); - Chunk chunk = world.getChunk(chunkPos.x, chunkPos.z); - for (int x = 0; x < 16; x++) { - mut.setX(x); - int wx = x | sx; - double nx = wx * 0.1; - int x2 = wx - center.getX(); - for (int z = 0; z < 16; z++) { - mut.setZ(z); - int wz = z | sz; - double nz = wz * 0.1; - int z2 = wz - center.getZ(); - float clamp = getHeightClamp(world, 8, wx, wz); - if (clamp < 0.01) continue; - - double n = noise.eval(nx, nz) * 1.5 + 1.5; - double x3 = MHelper.pow2(x2 + noise.eval(nx, nz, 100) * 10); - double z3 = MHelper.pow2(z2 + noise.eval(nx, nz, -100) * 10); - - for (int y = minY; y <= maxY; y++) { - mut.setY((int) (y + n)); - double y2 = MHelper.pow2((y - center.getY()) * aspect); - double r2 = radius * clamp; - double r3 = r2 + 8; - r2 *= r2; - r3 = r3 * r3 + 100; - double dist = x3 + y2 + z3; - if (dist < r2) { - BlockState state = chunk.getBlockState(mut); - if (state.isIn(EndTags.GEN_TERRAIN) || state.isAir()) { - state = mut.getY() < center.getY() ? WATER : AIR; - chunk.setBlockState(mut, state, false); - } - } - else if (dist <= r3 && mut.getY() < center.getY()) { - BlockState state = chunk.getBlockState(mut); - BlockPos worldPos = mut.add(sx, 0, sz); - if (!state.isFullCube(world, worldPos) && !state.isSolidBlock(world, worldPos)) { - state = chunk.getBlockState(mut.up()); - if (state.isAir()) { - state = random.nextBoolean() ? ENDSTONE : world.getBiome(worldPos).getGenerationSettings().getSurfaceConfig().getTopMaterial(); - } - else { - state = state.getFluidState().isEmpty() ? ENDSTONE : EndBlocks.ENDSTONE_DUST.getDefaultState(); - } - chunk.setBlockState(mut, state, false); - } - } - } - } - } - fixWater(world, chunk, mut, random, sx, sz); - return true; - } - - private void fixWater(StructureWorldAccess world, Chunk chunk, Mutable mut, Random random, int sx, int sz) { - int minY = this.boundingBox.minY; - int maxY = this.boundingBox.maxY; - for (int x = 0; x < 16; x++) { - mut.setX(x); - for (int z = 0; z < 16; z++) { - mut.setZ(z); - for (int y = minY; y <= maxY; y++) { - mut.setY(y); - FluidState state = chunk.getFluidState(mut); - if (!state.isEmpty()) { - mut.setY(y - 1); - if (chunk.getBlockState(mut).isAir()) { - mut.setY(y + 1); - - BlockState bState = chunk.getBlockState(mut); - if (bState.isAir()) { - bState = random.nextBoolean() ? ENDSTONE : world.getBiome(mut.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getTopMaterial(); - } - else { - bState = bState.getFluidState().isEmpty() ? ENDSTONE : EndBlocks.ENDSTONE_DUST.getDefaultState(); - } - - mut.setY(y); - - makeEndstonePillar(chunk, mut, bState); - } - else if (x > 1 && x < 15 && z > 1 && z < 15) { - mut.setY(y); - for (Direction dir: BlocksHelper.HORIZONTAL) { - BlockPos wPos = mut.add(dir.getOffsetX(), 0, dir.getOffsetZ()); - if (chunk.getBlockState(wPos).isAir()) { - mut.setY(y + 1); - BlockState bState = chunk.getBlockState(mut); - if (bState.isAir()) { - bState = random.nextBoolean() ? ENDSTONE : world.getBiome(mut.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getTopMaterial(); - } - else { - bState = bState.getFluidState().isEmpty() ? ENDSTONE : EndBlocks.ENDSTONE_DUST.getDefaultState(); - } - mut.setY(y); - makeEndstonePillar(chunk, mut, bState); - break; - } - } - } - else if (chunk.getBlockState(mut.move(Direction.UP)).isAir()) { - chunk.getFluidTickScheduler().schedule(mut.move(Direction.DOWN), state.getFluid(), 0); - } - } - } - } - } - } - - private void makeEndstonePillar(Chunk chunk, Mutable mut, BlockState terrain) { - chunk.setBlockState(mut, terrain, false); - mut.setY(mut.getY() - 1); - while (!chunk.getFluidState(mut).isEmpty()) { - chunk.setBlockState(mut, ENDSTONE, false); - mut.setY(mut.getY() - 1); - } - } - - private int getHeight(StructureWorldAccess world, BlockPos pos) { - int p = ((pos.getX() & 2047) << 11) | (pos.getZ() & 2047); - int h = heightmap.getOrDefault(p, Byte.MIN_VALUE); - if (h > Byte.MIN_VALUE) { - return h; - } - - if (!EndBiomes.getBiomeID(world.getBiome(pos)).equals(biomeID)) { - heightmap.put(p, (byte) 0); - return 0; - } - - /*h = world.getTopY(Type.WORLD_SURFACE, pos.getX(), pos.getZ()); - if (!world.getBlockState(new BlockPos(pos.getX(), h - 1, pos.getZ())).getFluidState().isEmpty()) { - heightmap.put(p, (byte) 0); - return 0; - }*/ - - h = world.getTopY(Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); - h = MathHelper.abs(h - center.getY()); - h = h < 8 ? 1 : 0; - - heightmap.put(p, (byte) h); - return h; - } - - private float getHeightClamp(StructureWorldAccess world, int radius, int posX, int posZ) { - Mutable mut = new Mutable(); - int r2 = radius * radius; - float height = 0; - float max = 0; - for (int x = -radius; x <= radius; x++) { - mut.setX(posX + x); - int x2 = x * x; - for (int z = -radius; z <= radius; z++) { - mut.setZ(posZ + z); - int z2 = z * z; - if (x2 + z2 < r2) { - float mult = 1 - (float) Math.sqrt(x2 + z2) / radius; - max += mult; - height += getHeight(world, mut) * mult; - } - } - } - height /= max; - return MathHelper.clamp(height, 0, 1); - } - - private void makeBoundingBox() { - int minX = MHelper.floor(center.getX() - radius - 8); - int minY = MHelper.floor(center.getX() - depth - 8); - int minZ = MHelper.floor(center.getZ() - radius - 8); - int maxX = MHelper.floor(center.getX() + radius + 8); - int maxY = MHelper.floor(center.getY() + depth); - int maxZ = MHelper.floor(center.getZ() + radius + 8); - this.boundingBox = new BlockBox(minX, minY, minZ, maxX, maxY, maxZ); - } -} \ No newline at end of file From 57548290e9b84862c000e0032c7e81c1b3add67a Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 15 Jan 2021 12:04:26 +0300 Subject: [PATCH 170/463] Entity class rename --- ...{EntityCubozoa.java => CubozoaEntity.java} | 14 ++-- ...ityDragonfly.java => DragonflyEntity.java} | 28 +++---- ...{EntityEndFish.java => EndFishEntity.java} | 12 +-- ...ntityEndSlime.java => EndSlimeEntity.java} | 84 +++++++++---------- ...dowWalker.java => ShadowWalkerEntity.java} | 12 +-- .../entity/{ => model}/BlockBenchModel.java | 2 +- ...tyCubozoa.java => CubozoaEntityModel.java} | 9 +- ...agonfly.java => DragonflyEntityModel.java} | 9 +- ...tyEndFish.java => EndFishEntityModel.java} | 9 +- .../entity/model/EndSlimeEntityModel.java | 4 +- .../entity/render/RendererEntityCubozoa.java | 16 ++-- .../render/RendererEntityDragonfly.java | 12 +-- .../entity/render/RendererEntityEndFish.java | 22 ++--- .../entity/render/RendererEntityEndSlime.java | 20 ++--- .../render/RendererEntityShadowWalker.java | 8 +- .../ru/betterend/registry/EndEntities.java | 30 +++---- 16 files changed, 144 insertions(+), 147 deletions(-) rename src/main/java/ru/betterend/entity/{EntityCubozoa.java => CubozoaEntity.java} (90%) rename src/main/java/ru/betterend/entity/{EntityDragonfly.java => DragonflyEntity.java} (81%) rename src/main/java/ru/betterend/entity/{EntityEndFish.java => EndFishEntity.java} (88%) rename src/main/java/ru/betterend/entity/{EntityEndSlime.java => EndSlimeEntity.java} (77%) rename src/main/java/ru/betterend/entity/{EntityShadowWalker.java => ShadowWalkerEntity.java} (88%) rename src/main/java/ru/betterend/entity/{ => model}/BlockBenchModel.java (91%) rename src/main/java/ru/betterend/entity/model/{ModelEntityCubozoa.java => CubozoaEntityModel.java} (90%) rename src/main/java/ru/betterend/entity/model/{ModelEntityDragonfly.java => DragonflyEntityModel.java} (90%) rename src/main/java/ru/betterend/entity/model/{ModelEntityEndFish.java => EndFishEntityModel.java} (88%) diff --git a/src/main/java/ru/betterend/entity/EntityCubozoa.java b/src/main/java/ru/betterend/entity/CubozoaEntity.java similarity index 90% rename from src/main/java/ru/betterend/entity/EntityCubozoa.java rename to src/main/java/ru/betterend/entity/CubozoaEntity.java index 25f79963..65a20bb9 100644 --- a/src/main/java/ru/betterend/entity/EntityCubozoa.java +++ b/src/main/java/ru/betterend/entity/CubozoaEntity.java @@ -38,12 +38,12 @@ import net.minecraft.world.World; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndItems; -public class EntityCubozoa extends SchoolingFishEntity { +public class CubozoaEntity extends SchoolingFishEntity { public static final int VARIANTS = 2; - private static final TrackedData VARIANT = DataTracker.registerData(EntityCubozoa.class, TrackedDataHandlerRegistry.BYTE); - private static final TrackedData SCALE = DataTracker.registerData(EntityCubozoa.class, TrackedDataHandlerRegistry.BYTE); + private static final TrackedData VARIANT = DataTracker.registerData(CubozoaEntity.class, TrackedDataHandlerRegistry.BYTE); + private static final TrackedData SCALE = DataTracker.registerData(CubozoaEntity.class, TrackedDataHandlerRegistry.BYTE); - public EntityCubozoa(EntityType entityType, World world) { + public CubozoaEntity(EntityType entityType, World world) { super(entityType, world); } @@ -97,9 +97,9 @@ public class EntityCubozoa extends SchoolingFishEntity { return this.dataTracker.get(SCALE) / 32F + 0.75F; } - public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { + public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { Box box = new Box(pos).expand(16); - List list = world.getEntitiesByClass(EntityCubozoa.class, box, (entity) -> { + List list = world.getEntitiesByClass(CubozoaEntity.class, box, (entity) -> { return true; }); return list.size() < 9; @@ -141,7 +141,7 @@ public class EntityCubozoa extends SchoolingFishEntity { } static class CubozoaMoveControl extends MoveControl { - CubozoaMoveControl(EntityCubozoa owner) { + CubozoaMoveControl(CubozoaEntity owner) { super(owner); } diff --git a/src/main/java/ru/betterend/entity/EntityDragonfly.java b/src/main/java/ru/betterend/entity/DragonflyEntity.java similarity index 81% rename from src/main/java/ru/betterend/entity/EntityDragonfly.java rename to src/main/java/ru/betterend/entity/DragonflyEntity.java index f808e0d1..2cafb340 100644 --- a/src/main/java/ru/betterend/entity/EntityDragonfly.java +++ b/src/main/java/ru/betterend/entity/DragonflyEntity.java @@ -37,8 +37,8 @@ import ru.betterend.registry.EndSounds; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; -public class EntityDragonfly extends AnimalEntity implements Flutterer { - public EntityDragonfly(EntityType entityType, World world) { +public class DragonflyEntity extends AnimalEntity implements Flutterer { + public DragonflyEntity(EntityType entityType, World world) { super(entityType, world); this.moveControl = new FlightMoveControl(this, 20, true); this.lookControl = new DragonflyLookControl(this); @@ -137,11 +137,11 @@ public class EntityDragonfly extends AnimalEntity implements Flutterer { } public boolean canStart() { - return EntityDragonfly.this.navigation.isIdle() && EntityDragonfly.this.random.nextInt(10) == 0; + return DragonflyEntity.this.navigation.isIdle() && DragonflyEntity.this.random.nextInt(10) == 0; } public boolean shouldContinue() { - return EntityDragonfly.this.navigation.isFollowingPath(); + return DragonflyEntity.this.navigation.isFollowingPath(); } public void start() { @@ -149,9 +149,9 @@ public class EntityDragonfly extends AnimalEntity implements Flutterer { if (vec3d != null) { BlockPos pos = new BlockPos(vec3d); try { - Path path = EntityDragonfly.this.navigation.findPathTo(pos, 1); + Path path = DragonflyEntity.this.navigation.findPathTo(pos, 1); if (path != null) { - EntityDragonfly.this.navigation.startMovingAlong(path, 1.0D); + DragonflyEntity.this.navigation.startMovingAlong(path, 1.0D); } } catch (Exception e) {} @@ -160,29 +160,29 @@ public class EntityDragonfly extends AnimalEntity implements Flutterer { } private Vec3d getRandomLocation() { - int h = BlocksHelper.downRay(EntityDragonfly.this.world, EntityDragonfly.this.getBlockPos(), 16); - Vec3d rotation = EntityDragonfly.this.getRotationVec(0.0F); - Vec3d airPos = TargetFinder.findAirTarget(EntityDragonfly.this, 8, 7, rotation, 1.5707964F, 2, 1); + int h = BlocksHelper.downRay(DragonflyEntity.this.world, DragonflyEntity.this.getBlockPos(), 16); + Vec3d rotation = DragonflyEntity.this.getRotationVec(0.0F); + Vec3d airPos = TargetFinder.findAirTarget(DragonflyEntity.this, 8, 7, rotation, 1.5707964F, 2, 1); if (airPos != null) { if (isInVoid(airPos)) { for (int i = 0; i < 8; i++) { - airPos = TargetFinder.findAirTarget(EntityDragonfly.this, 16, 7, rotation, MHelper.PI2, 2, 1); + airPos = TargetFinder.findAirTarget(DragonflyEntity.this, 16, 7, rotation, MHelper.PI2, 2, 1); if (airPos != null && !isInVoid(airPos)) { return airPos; } } return null; } - if (h > 5 && airPos.getY() >= EntityDragonfly.this.getBlockPos().getY()) { + if (h > 5 && airPos.getY() >= DragonflyEntity.this.getBlockPos().getY()) { airPos = new Vec3d(airPos.x, airPos.y - h * 0.5, airPos.z); } return airPos; } - return TargetFinder.findGroundTarget(EntityDragonfly.this, 8, 4, -2, rotation, 1.5707963705062866D); + return TargetFinder.findGroundTarget(DragonflyEntity.this, 8, 4, -2, rotation, 1.5707963705062866D); } private boolean isInVoid(Vec3d pos) { - int h = BlocksHelper.downRay(EntityDragonfly.this.world, new BlockPos(pos), 128); + int h = BlocksHelper.downRay(DragonflyEntity.this.world, new BlockPos(pos), 128); return h > 100; } } @@ -192,7 +192,7 @@ public class EntityDragonfly extends AnimalEntity implements Flutterer { return EndEntities.DRAGONFLY.create(world); } - public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { + public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { int y = world.getChunk(pos).sampleHeightmap(Type.WORLD_SURFACE, pos.getX() & 15, pos.getY() & 15); return y > 0 && pos.getY() >= y; } diff --git a/src/main/java/ru/betterend/entity/EntityEndFish.java b/src/main/java/ru/betterend/entity/EndFishEntity.java similarity index 88% rename from src/main/java/ru/betterend/entity/EntityEndFish.java rename to src/main/java/ru/betterend/entity/EndFishEntity.java index 27f74725..4b633a4d 100644 --- a/src/main/java/ru/betterend/entity/EntityEndFish.java +++ b/src/main/java/ru/betterend/entity/EndFishEntity.java @@ -29,14 +29,14 @@ import net.minecraft.world.World; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndItems; -public class EntityEndFish extends SchoolingFishEntity { +public class EndFishEntity extends SchoolingFishEntity { public static final int VARIANTS_NORMAL = 5; public static final int VARIANTS_SULPHUR = 3; public static final int VARIANTS = VARIANTS_NORMAL + VARIANTS_SULPHUR; - private static final TrackedData VARIANT = DataTracker.registerData(EntityEndFish.class, TrackedDataHandlerRegistry.BYTE); - private static final TrackedData SCALE = DataTracker.registerData(EntityEndFish.class, TrackedDataHandlerRegistry.BYTE); + private static final TrackedData VARIANT = DataTracker.registerData(EndFishEntity.class, TrackedDataHandlerRegistry.BYTE); + private static final TrackedData SCALE = DataTracker.registerData(EndFishEntity.class, TrackedDataHandlerRegistry.BYTE); - public EntityEndFish(EntityType entityType, World world) { + public EndFishEntity(EntityType entityType, World world) { super(entityType, world); } @@ -126,9 +126,9 @@ public class EntityEndFish extends SchoolingFishEntity { return this.dataTracker.get(SCALE) / 32F + 0.75F; } - public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { + public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { Box box = new Box(pos).expand(16); - List list = world.getEntitiesByClass(EntityEndFish.class, box, (entity) -> { return true; }); + List list = world.getEntitiesByClass(EndFishEntity.class, box, (entity) -> { return true; }); return list.size() < 9; } diff --git a/src/main/java/ru/betterend/entity/EntityEndSlime.java b/src/main/java/ru/betterend/entity/EndSlimeEntity.java similarity index 77% rename from src/main/java/ru/betterend/entity/EntityEndSlime.java rename to src/main/java/ru/betterend/entity/EndSlimeEntity.java index a5eb3ba3..b9b6118c 100644 --- a/src/main/java/ru/betterend/entity/EntityEndSlime.java +++ b/src/main/java/ru/betterend/entity/EndSlimeEntity.java @@ -44,11 +44,11 @@ import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; import ru.betterend.world.biome.EndBiome; -public class EntityEndSlime extends SlimeEntity { - private static final TrackedData VARIANT = DataTracker.registerData(EntityEndSlime.class, TrackedDataHandlerRegistry.BYTE); +public class EndSlimeEntity extends SlimeEntity { + private static final TrackedData VARIANT = DataTracker.registerData(EndSlimeEntity.class, TrackedDataHandlerRegistry.BYTE); private static final Mutable POS = new Mutable(); - public EntityEndSlime(EntityType entityType, World world) { + public EndSlimeEntity(EntityType entityType, World world) { super(entityType, world); this.moveControl = new EndSlimeMoveControl(this); } @@ -128,7 +128,7 @@ public class EntityEndSlime extends SlimeEntity { for (int l = 0; l < k; ++l) { float g = ((float) (l % 2) - 0.5F) * f; float h = ((float) (l / 2) - 0.5F) * f; - EntityEndSlime slimeEntity = (EntityEndSlime) this.getType().create(this.world); + EndSlimeEntity slimeEntity = (EndSlimeEntity) this.getType().create(this.world); if (this.isPersistent()) { slimeEntity.setPersistent(); } @@ -198,7 +198,7 @@ public class EntityEndSlime extends SlimeEntity { return this.dataTracker.get(VARIANT) == 0; } - public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { + public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { return random.nextInt(16) == 0 || isPermanentBiome(world, pos) || (notManyEntities(world, pos, 32, 3) && isWaterNear(world, pos, 32, 8)); } @@ -209,7 +209,7 @@ public class EntityEndSlime extends SlimeEntity { private static boolean notManyEntities(ServerWorldAccess world, BlockPos pos, int radius, int maxCount) { Box box = new Box(pos).expand(radius); - List list = world.getEntitiesByClass(EntityEndSlime.class, box, (entity) -> { return true; }); + List list = world.getEntitiesByClass(EndSlimeEntity.class, box, (entity) -> { return true; }); return list.size() <= maxCount; } @@ -235,17 +235,17 @@ public class EntityEndSlime extends SlimeEntity { } public boolean canStart() { - if (EntityEndSlime.this.hasVehicle()) { + if (EndSlimeEntity.this.hasVehicle()) { return false; } - float yaw = EntityEndSlime.this.getHeadYaw(); - float speed = EntityEndSlime.this.getMovementSpeed(); + float yaw = EndSlimeEntity.this.getHeadYaw(); + float speed = EndSlimeEntity.this.getMovementSpeed(); if (speed > 0.1) { float dx = MathHelper.sin(-yaw * 0.017453292F); float dz = MathHelper.cos(-yaw * 0.017453292F); - BlockPos pos = EntityEndSlime.this.getBlockPos().add(dx * speed * 4, 0, dz * speed * 4); - int down = BlocksHelper.downRay(EntityEndSlime.this.world, pos, 16); + BlockPos pos = EndSlimeEntity.this.getBlockPos().add(dx * speed * 4, 0, dz * speed * 4); + int down = BlocksHelper.downRay(EndSlimeEntity.this.world, pos, 16); return down < 5; } @@ -253,28 +253,28 @@ public class EntityEndSlime extends SlimeEntity { } public void tick() { - ((EndSlimeMoveControl) EntityEndSlime.this.getMoveControl()).move(1.0D); + ((EndSlimeMoveControl) EndSlimeEntity.this.getMoveControl()).move(1.0D); } } class SwimmingGoal extends Goal { public SwimmingGoal() { this.setControls(EnumSet.of(Goal.Control.JUMP, Goal.Control.MOVE)); - EntityEndSlime.this.getNavigation().setCanSwim(true); + EndSlimeEntity.this.getNavigation().setCanSwim(true); } public boolean canStart() { - return (EntityEndSlime.this.isTouchingWater() - || EntityEndSlime.this.isInLava()) - && EntityEndSlime.this.getMoveControl() instanceof EndSlimeMoveControl; + return (EndSlimeEntity.this.isTouchingWater() + || EndSlimeEntity.this.isInLava()) + && EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl; } public void tick() { - if (EntityEndSlime.this.getRandom().nextFloat() < 0.8F) { - EntityEndSlime.this.getJumpControl().setActive(); + if (EndSlimeEntity.this.getRandom().nextFloat() < 0.8F) { + EndSlimeEntity.this.getJumpControl().setActive(); } - ((EndSlimeMoveControl) EntityEndSlime.this.getMoveControl()).move(1.2D); + ((EndSlimeMoveControl) EndSlimeEntity.this.getMoveControl()).move(1.2D); } } @@ -287,21 +287,21 @@ public class EntityEndSlime extends SlimeEntity { } public boolean canStart() { - return EntityEndSlime.this.getTarget() == null - && (EntityEndSlime.this.onGround - || EntityEndSlime.this.isTouchingWater() - || EntityEndSlime.this.isInLava() - || EntityEndSlime.this.hasStatusEffect(StatusEffects.LEVITATION)) - && EntityEndSlime.this.getMoveControl() instanceof EndSlimeMoveControl; + return EndSlimeEntity.this.getTarget() == null + && (EndSlimeEntity.this.onGround + || EndSlimeEntity.this.isTouchingWater() + || EndSlimeEntity.this.isInLava() + || EndSlimeEntity.this.hasStatusEffect(StatusEffects.LEVITATION)) + && EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl; } public void tick() { if (--this.timer <= 0) { - this.timer = 40 + EntityEndSlime.this.getRandom().nextInt(60); - this.targetYaw = (float) EntityEndSlime.this.getRandom().nextInt(360); + this.timer = 40 + EndSlimeEntity.this.getRandom().nextInt(60); + this.targetYaw = (float) EndSlimeEntity.this.getRandom().nextInt(360); } - ((EndSlimeMoveControl) EntityEndSlime.this.getMoveControl()).look(this.targetYaw, false); + ((EndSlimeMoveControl) EndSlimeEntity.this.getMoveControl()).look(this.targetYaw, false); } } @@ -313,7 +313,7 @@ public class EntityEndSlime extends SlimeEntity { } public boolean canStart() { - LivingEntity livingEntity = EntityEndSlime.this.getTarget(); + LivingEntity livingEntity = EndSlimeEntity.this.getTarget(); if (livingEntity == null) { return false; } @@ -321,7 +321,7 @@ public class EntityEndSlime extends SlimeEntity { return false; } else { - return livingEntity instanceof PlayerEntity && ((PlayerEntity) livingEntity).abilities.invulnerable ? false : EntityEndSlime.this.getMoveControl() instanceof EndSlimeMoveControl; + return livingEntity instanceof PlayerEntity && ((PlayerEntity) livingEntity).abilities.invulnerable ? false : EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl; } } @@ -331,7 +331,7 @@ public class EntityEndSlime extends SlimeEntity { } public boolean shouldContinue() { - LivingEntity livingEntity = EntityEndSlime.this.getTarget(); + LivingEntity livingEntity = EndSlimeEntity.this.getTarget(); if (livingEntity == null) { return false; } @@ -347,8 +347,8 @@ public class EntityEndSlime extends SlimeEntity { } public void tick() { - EntityEndSlime.this.lookAtEntity(EntityEndSlime.this.getTarget(), 10.0F, 10.0F); - ((EndSlimeMoveControl) EntityEndSlime.this.getMoveControl()).look(EntityEndSlime.this.yaw, EntityEndSlime.this.canAttack()); + EndSlimeEntity.this.lookAtEntity(EndSlimeEntity.this.getTarget(), 10.0F, 10.0F); + ((EndSlimeMoveControl) EndSlimeEntity.this.getMoveControl()).look(EndSlimeEntity.this.yaw, EndSlimeEntity.this.canAttack()); } } @@ -357,7 +357,7 @@ public class EntityEndSlime extends SlimeEntity { private int ticksUntilJump; private boolean jumpOften; - public EndSlimeMoveControl(EntityEndSlime slime) { + public EndSlimeMoveControl(EndSlimeEntity slime) { super(slime); this.targetYaw = 180.0F * slime.yaw / 3.1415927F; } @@ -384,19 +384,19 @@ public class EntityEndSlime extends SlimeEntity { if (this.entity.isOnGround()) { this.entity.setMovementSpeed((float) (this.speed * this.entity.getAttributeValue(EntityAttributes.GENERIC_MOVEMENT_SPEED))); if (this.ticksUntilJump-- <= 0) { - this.ticksUntilJump = EntityEndSlime.this.getTicksUntilNextJump(); + this.ticksUntilJump = EndSlimeEntity.this.getTicksUntilNextJump(); if (this.jumpOften) { this.ticksUntilJump /= 3; } - EntityEndSlime.this.getJumpControl().setActive(); - if (EntityEndSlime.this.makesJumpSound()) { - EntityEndSlime.this.playSound(EntityEndSlime.this.getJumpSound(), EntityEndSlime.this.getSoundVolume(), getJumpSoundPitch()); + EndSlimeEntity.this.getJumpControl().setActive(); + if (EndSlimeEntity.this.makesJumpSound()) { + EndSlimeEntity.this.playSound(EndSlimeEntity.this.getJumpSound(), EndSlimeEntity.this.getSoundVolume(), getJumpSoundPitch()); } } else { - EntityEndSlime.this.sidewaysSpeed = 0.0F; - EntityEndSlime.this.forwardSpeed = 0.0F; + EndSlimeEntity.this.sidewaysSpeed = 0.0F; + EndSlimeEntity.this.forwardSpeed = 0.0F; this.entity.setMovementSpeed(0.0F); } } @@ -408,8 +408,8 @@ public class EntityEndSlime extends SlimeEntity { } private float getJumpSoundPitch() { - float f = EntityEndSlime.this.isSmall() ? 1.4F : 0.8F; - return ((EntityEndSlime.this.random.nextFloat() - EntityEndSlime.this.random.nextFloat()) * 0.2F + 1.0F) * f; + float f = EndSlimeEntity.this.isSmall() ? 1.4F : 0.8F; + return ((EndSlimeEntity.this.random.nextFloat() - EndSlimeEntity.this.random.nextFloat()) * 0.2F + 1.0F) * f; } } } diff --git a/src/main/java/ru/betterend/entity/EntityShadowWalker.java b/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java similarity index 88% rename from src/main/java/ru/betterend/entity/EntityShadowWalker.java rename to src/main/java/ru/betterend/entity/ShadowWalkerEntity.java index b7d5d50c..d4108e07 100644 --- a/src/main/java/ru/betterend/entity/EntityShadowWalker.java +++ b/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java @@ -29,8 +29,8 @@ import net.minecraft.world.World; import ru.betterend.registry.EndSounds; import ru.betterend.util.MHelper; -public class EntityShadowWalker extends HostileEntity { - public EntityShadowWalker(EntityType entityType, World world) { +public class ShadowWalkerEntity extends HostileEntity { + public ShadowWalkerEntity(EntityType entityType, World world) { super(entityType, world); } @@ -112,20 +112,20 @@ public class EntityShadowWalker extends HostileEntity { return attack; } - public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { + public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { if (HostileEntity.canSpawnInDark(type, world, spawnReason, pos, random)) { Box box = new Box(pos).expand(16); - List entities = world.getEntitiesByClass(EntityShadowWalker.class, box, (entity) -> { return true; }); + List entities = world.getEntitiesByClass(ShadowWalkerEntity.class, box, (entity) -> { return true; }); return entities.size() < 6; } return false; } private final class AttackGoal extends MeleeAttackGoal { - private final EntityShadowWalker walker; + private final ShadowWalkerEntity walker; private int ticks; - public AttackGoal(EntityShadowWalker walker, double speed, boolean pauseWhenMobIdle) { + public AttackGoal(ShadowWalkerEntity walker, double speed, boolean pauseWhenMobIdle) { super(walker, speed, pauseWhenMobIdle); this.walker = walker; } diff --git a/src/main/java/ru/betterend/entity/BlockBenchModel.java b/src/main/java/ru/betterend/entity/model/BlockBenchModel.java similarity index 91% rename from src/main/java/ru/betterend/entity/BlockBenchModel.java rename to src/main/java/ru/betterend/entity/model/BlockBenchModel.java index 0c3ad64b..f53dc212 100644 --- a/src/main/java/ru/betterend/entity/BlockBenchModel.java +++ b/src/main/java/ru/betterend/entity/model/BlockBenchModel.java @@ -1,4 +1,4 @@ -package ru.betterend.entity; +package ru.betterend.entity.model; import java.util.function.Function; diff --git a/src/main/java/ru/betterend/entity/model/ModelEntityCubozoa.java b/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java similarity index 90% rename from src/main/java/ru/betterend/entity/model/ModelEntityCubozoa.java rename to src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java index 5207fde6..f9b7d5cd 100644 --- a/src/main/java/ru/betterend/entity/model/ModelEntityCubozoa.java +++ b/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java @@ -5,10 +5,9 @@ import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.math.MathHelper; -import ru.betterend.entity.BlockBenchModel; -import ru.betterend.entity.EntityCubozoa; +import ru.betterend.entity.CubozoaEntity; -public class ModelEntityCubozoa extends BlockBenchModel { +public class CubozoaEntityModel extends BlockBenchModel { private final ModelPart model; private final ModelPart main_cube_r1; private final ModelPart tentacle_center_1; @@ -22,7 +21,7 @@ public class ModelEntityCubozoa extends BlockBenchModel { private float scaleY; private float scaleXZ; - public ModelEntityCubozoa() { + public CubozoaEntityModel() { super(RenderLayer::getEntityTranslucent); textureWidth = 48; @@ -83,7 +82,7 @@ public class ModelEntityCubozoa extends BlockBenchModel { } @Override - public void setAngles(EntityCubozoa entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { + public void setAngles(CubozoaEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { float sin = MathHelper.sin(animationProgress * 0.13F); scaleY = sin * 0.1F + 0.9F; scaleXZ = MathHelper.sin(animationProgress * 0.13F + 3.14F) * 0.1F + 0.9F; diff --git a/src/main/java/ru/betterend/entity/model/ModelEntityDragonfly.java b/src/main/java/ru/betterend/entity/model/DragonflyEntityModel.java similarity index 90% rename from src/main/java/ru/betterend/entity/model/ModelEntityDragonfly.java rename to src/main/java/ru/betterend/entity/model/DragonflyEntityModel.java index 764bb647..47acf4a6 100644 --- a/src/main/java/ru/betterend/entity/model/ModelEntityDragonfly.java +++ b/src/main/java/ru/betterend/entity/model/DragonflyEntityModel.java @@ -4,10 +4,9 @@ import net.minecraft.client.model.ModelPart; import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.util.math.MatrixStack; -import ru.betterend.entity.BlockBenchModel; -import ru.betterend.entity.EntityDragonfly; +import ru.betterend.entity.DragonflyEntity; -public class ModelEntityDragonfly extends BlockBenchModel { +public class DragonflyEntityModel extends BlockBenchModel { private final ModelPart model; private final ModelPart head; private final ModelPart tail; @@ -19,7 +18,7 @@ public class ModelEntityDragonfly extends BlockBenchModel { private final ModelPart legs_1; private final ModelPart legs_2; - public ModelEntityDragonfly() { + public DragonflyEntityModel() { super(RenderLayer::getEntityCutout); textureWidth = 64; @@ -82,7 +81,7 @@ public class ModelEntityDragonfly extends BlockBenchModel { @Override - public void setAngles(EntityDragonfly entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { + public void setAngles(DragonflyEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { float progress = animationProgress * 2F; wing_1.roll = 0.3491F + (float) Math.sin(progress) * 0.3491F; diff --git a/src/main/java/ru/betterend/entity/model/ModelEntityEndFish.java b/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java similarity index 88% rename from src/main/java/ru/betterend/entity/model/ModelEntityEndFish.java rename to src/main/java/ru/betterend/entity/model/EndFishEntityModel.java index 5e0019b2..c2a75cec 100644 --- a/src/main/java/ru/betterend/entity/model/ModelEntityEndFish.java +++ b/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java @@ -4,10 +4,9 @@ import net.minecraft.client.model.ModelPart; import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.util.math.MatrixStack; -import ru.betterend.entity.BlockBenchModel; -import ru.betterend.entity.EntityEndFish; +import ru.betterend.entity.EndFishEntity; -public class ModelEntityEndFish extends BlockBenchModel { +public class EndFishEntityModel extends BlockBenchModel { private final ModelPart model; private final ModelPart fin_top; private final ModelPart fin_bottom; @@ -15,7 +14,7 @@ public class ModelEntityEndFish extends BlockBenchModel { private final ModelPart fin_right; private final ModelPart fin_left; - public ModelEntityEndFish() { + public EndFishEntityModel() { super(RenderLayer::getEntityCutout); textureWidth = 32; @@ -58,7 +57,7 @@ public class ModelEntityEndFish extends BlockBenchModel { @Override - public void setAngles(EntityEndFish entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { + public void setAngles(EndFishEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { float s1 = (float) Math.sin(animationProgress * 0.1); float s2 = (float) Math.sin(animationProgress * 0.05); flipper.yaw = s1 * 0.3F; diff --git a/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java index 93a1897c..6725e790 100644 --- a/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java @@ -7,10 +7,10 @@ import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.entity.model.CompositeEntityModel; import net.minecraft.client.util.math.MatrixStack; -import ru.betterend.entity.EntityEndSlime; +import ru.betterend.entity.EndSlimeEntity; import ru.betterend.util.MHelper; -public class EndSlimeEntityModel extends CompositeEntityModel { +public class EndSlimeEntityModel extends CompositeEntityModel { private final ModelPart flower; private final ModelPart crop; private final ModelPart innerCube; diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java b/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java index 6e23c023..cf36a3be 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java @@ -10,23 +10,23 @@ import net.minecraft.client.render.entity.feature.EyesFeatureRenderer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.Identifier; import ru.betterend.BetterEnd; -import ru.betterend.entity.EntityCubozoa; -import ru.betterend.entity.model.ModelEntityCubozoa; +import ru.betterend.entity.CubozoaEntity; +import ru.betterend.entity.model.CubozoaEntityModel; -public class RendererEntityCubozoa extends MobEntityRenderer { +public class RendererEntityCubozoa extends MobEntityRenderer { private static final Identifier[] TEXTURE = new Identifier[2]; private static final RenderLayer[] GLOW = new RenderLayer[2]; public RendererEntityCubozoa(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new ModelEntityCubozoa(), 0.5f); - this.addFeature(new EyesFeatureRenderer(this) { + super(entityRenderDispatcher, new CubozoaEntityModel(), 0.5f); + this.addFeature(new EyesFeatureRenderer(this) { @Override public RenderLayer getEyesTexture() { return GLOW[0]; } @Override - public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, EntityCubozoa entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { + public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, CubozoaEntity entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { VertexConsumer vertexConsumer = vertexConsumers.getBuffer(GLOW[entity.getVariant()]); this.getContextModel().render(matrices, vertexConsumer, 15728640, OverlayTexture.DEFAULT_UV, 1.0F, 1.0F, 1.0F, 1.0F); } @@ -34,13 +34,13 @@ public class RendererEntityCubozoa extends MobEntityRenderer { +public class RendererEntityDragonfly extends MobEntityRenderer { private static final Identifier TEXTURE = BetterEnd.makeID("textures/entity/dragonfly.png"); private static final RenderLayer GLOW = RenderLayer.getEyes(BetterEnd.makeID("textures/entity/dragonfly_glow.png")); public RendererEntityDragonfly(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new ModelEntityDragonfly(), 0.5f); - this.addFeature(new EyesFeatureRenderer(this) { + super(entityRenderDispatcher, new DragonflyEntityModel(), 0.5f); + this.addFeature(new EyesFeatureRenderer(this) { @Override public RenderLayer getEyesTexture() { return GLOW; @@ -24,7 +24,7 @@ public class RendererEntityDragonfly extends MobEntityRenderer { - private static final Identifier[] TEXTURE = new Identifier[EntityEndFish.VARIANTS]; - private static final RenderLayer[] GLOW = new RenderLayer[EntityEndFish.VARIANTS]; +public class RendererEntityEndFish extends MobEntityRenderer { + private static final Identifier[] TEXTURE = new Identifier[EndFishEntity.VARIANTS]; + private static final RenderLayer[] GLOW = new RenderLayer[EndFishEntity.VARIANTS]; public RendererEntityEndFish(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new ModelEntityEndFish(), 0.5f); - this.addFeature(new EyesFeatureRenderer(this) { + super(entityRenderDispatcher, new EndFishEntityModel(), 0.5f); + this.addFeature(new EyesFeatureRenderer(this) { @Override public RenderLayer getEyesTexture() { return GLOW[0]; } @Override - public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, EntityEndFish entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { + public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, EndFishEntity entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { VertexConsumer vertexConsumer = vertexConsumers.getBuffer(GLOW[entity.getVariant()]); this.getContextModel().render(matrices, vertexConsumer, 15728640, OverlayTexture.DEFAULT_UV, 1.0F, 1.0F, 1.0F, 1.0F); } @@ -34,18 +34,18 @@ public class RendererEntityEndFish extends MobEntityRenderer> { +public class RendererEntityEndSlime extends MobEntityRenderer> { private static final Identifier TEXTURE[] = new Identifier[4]; private static final RenderLayer GLOW[] = new RenderLayer[4]; public RendererEntityEndSlime(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new EndSlimeEntityModel(false), 0.25F); - this.addFeature(new OverlayFeatureRenderer(this)); - this.addFeature(new EyesFeatureRenderer>(this) { + super(entityRenderDispatcher, new EndSlimeEntityModel(false), 0.25F); + this.addFeature(new OverlayFeatureRenderer(this)); + this.addFeature(new EyesFeatureRenderer>(this) { @Override public RenderLayer getEyesTexture() { return GLOW[0]; } @Override - public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, EntityEndSlime entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { + public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, EndSlimeEntity entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { VertexConsumer vertexConsumer = vertexConsumers.getBuffer(GLOW[entity.getSlimeType()]); this.getContextModel().render(matrices, vertexConsumer, 15728640, OverlayTexture.DEFAULT_UV, 1.0F, 1.0F, 1.0F, 1.0F); if (entity.isLake()) { @@ -42,18 +42,18 @@ public class RendererEntityEndSlime extends MobEntityRenderer extends FeatureRenderer> { + private final class OverlayFeatureRenderer extends FeatureRenderer> { private final EndSlimeEntityModel modelOrdinal = new EndSlimeEntityModel(true); private final EndSlimeEntityModel modelLake = new EndSlimeEntityModel(true); diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityShadowWalker.java b/src/main/java/ru/betterend/entity/render/RendererEntityShadowWalker.java index 6e3b8291..42ce3685 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityShadowWalker.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityShadowWalker.java @@ -5,17 +5,17 @@ import net.minecraft.client.render.entity.EntityRenderDispatcher; import net.minecraft.client.render.entity.model.PlayerEntityModel; import net.minecraft.util.Identifier; import ru.betterend.BetterEnd; -import ru.betterend.entity.EntityShadowWalker; +import ru.betterend.entity.ShadowWalkerEntity; -public class RendererEntityShadowWalker extends BipedEntityRenderer> { +public class RendererEntityShadowWalker extends BipedEntityRenderer> { private static final Identifier TEXTURE = BetterEnd.makeID("textures/entity/shadow_walker.png"); public RendererEntityShadowWalker(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new PlayerEntityModel(0.0F, false), 0.5F); + super(entityRenderDispatcher, new PlayerEntityModel(0.0F, false), 0.5F); } @Override - public Identifier getTexture(EntityShadowWalker zombieEntity) { + public Identifier getTexture(ShadowWalkerEntity zombieEntity) { return TEXTURE; } } diff --git a/src/main/java/ru/betterend/registry/EndEntities.java b/src/main/java/ru/betterend/registry/EndEntities.java index 7e4b812e..60480491 100644 --- a/src/main/java/ru/betterend/registry/EndEntities.java +++ b/src/main/java/ru/betterend/registry/EndEntities.java @@ -13,27 +13,27 @@ import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; -import ru.betterend.entity.EntityCubozoa; -import ru.betterend.entity.EntityDragonfly; -import ru.betterend.entity.EntityEndFish; -import ru.betterend.entity.EntityEndSlime; -import ru.betterend.entity.EntityShadowWalker; +import ru.betterend.entity.CubozoaEntity; +import ru.betterend.entity.DragonflyEntity; +import ru.betterend.entity.EndFishEntity; +import ru.betterend.entity.EndSlimeEntity; +import ru.betterend.entity.ShadowWalkerEntity; import ru.betterend.util.MHelper; import ru.betterend.util.SpawnHelper; public class EndEntities { - public static final EntityType DRAGONFLY = register("dragonfly", SpawnGroup.AMBIENT, 0.6F, 0.5F, EntityDragonfly::new, EntityDragonfly.createMobAttributes(), true, MHelper.color(32, 42, 176), MHelper.color(115, 225, 249)); - public static final EntityType END_SLIME = register("end_slime", SpawnGroup.MONSTER, 2F, 2F, EntityEndSlime::new, EntityEndSlime.createMobAttributes(), false, MHelper.color(28, 28, 28), MHelper.color(99, 11, 99)); - public static final EntityType END_FISH = register("end_fish", SpawnGroup.WATER_AMBIENT, 0.5F, 0.5F, EntityEndFish::new, EntityEndFish.createMobAttributes(), true, MHelper.color(3, 50, 76), MHelper.color(120, 206, 255)); - public static final EntityType SHADOW_WALKER = register("shadow_walker", SpawnGroup.MONSTER, 0.6F, 1.95F, EntityShadowWalker::new, EntityShadowWalker.createMobAttributes(), true, MHelper.color(30, 30, 30), MHelper.color(5, 5, 5)); - public static final EntityType CUBOZOA = register("cubozoa", SpawnGroup.WATER_AMBIENT, 0.6F, 1F, EntityCubozoa::new, EntityCubozoa.createMobAttributes(), true, MHelper.color(151, 77, 181), MHelper.color(93, 176, 238)); + public static final EntityType DRAGONFLY = register("dragonfly", SpawnGroup.AMBIENT, 0.6F, 0.5F, DragonflyEntity::new, DragonflyEntity.createMobAttributes(), true, MHelper.color(32, 42, 176), MHelper.color(115, 225, 249)); + public static final EntityType END_SLIME = register("end_slime", SpawnGroup.MONSTER, 2F, 2F, EndSlimeEntity::new, EndSlimeEntity.createMobAttributes(), false, MHelper.color(28, 28, 28), MHelper.color(99, 11, 99)); + public static final EntityType END_FISH = register("end_fish", SpawnGroup.WATER_AMBIENT, 0.5F, 0.5F, EndFishEntity::new, EndFishEntity.createMobAttributes(), true, MHelper.color(3, 50, 76), MHelper.color(120, 206, 255)); + public static final EntityType SHADOW_WALKER = register("shadow_walker", SpawnGroup.MONSTER, 0.6F, 1.95F, ShadowWalkerEntity::new, ShadowWalkerEntity.createMobAttributes(), true, MHelper.color(30, 30, 30), MHelper.color(5, 5, 5)); + public static final EntityType CUBOZOA = register("cubozoa", SpawnGroup.WATER_AMBIENT, 0.6F, 1F, CubozoaEntity::new, CubozoaEntity.createMobAttributes(), true, MHelper.color(151, 77, 181), MHelper.color(93, 176, 238)); public static void register() { - SpawnHelper.restrictionAir(DRAGONFLY, EntityDragonfly::canSpawn); - SpawnHelper.restrictionLand(END_SLIME, EntityEndSlime::canSpawn); - SpawnHelper.restrictionWater(END_FISH, EntityEndFish::canSpawn); - SpawnHelper.restrictionLand(SHADOW_WALKER, EntityShadowWalker::canSpawn); - SpawnHelper.restrictionWater(CUBOZOA, EntityCubozoa::canSpawn); + SpawnHelper.restrictionAir(DRAGONFLY, DragonflyEntity::canSpawn); + SpawnHelper.restrictionLand(END_SLIME, EndSlimeEntity::canSpawn); + SpawnHelper.restrictionWater(END_FISH, EndFishEntity::canSpawn); + SpawnHelper.restrictionLand(SHADOW_WALKER, ShadowWalkerEntity::canSpawn); + SpawnHelper.restrictionWater(CUBOZOA, CubozoaEntity::canSpawn); } protected static EntityType register(String name, SpawnGroup group, float width, float height, EntityFactory entity) { From fcf1be070cd93af4445db2b6a58560cb00bb9b9f Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 15 Jan 2021 13:55:11 +0300 Subject: [PATCH 171/463] Moth model --- .../ru/betterend/entity/SilkMothEntity.java | 45 ++++++ .../entity/model/SilkMothEntityModel.java | 137 ++++++++++++++++++ .../entity/render/SilkMothEntityRenderer.java | 21 +++ .../ru/betterend/registry/EndEntities.java | 2 + .../registry/EndEntitiesRenders.java | 2 + .../betterend/textures/entity/silk_moth.png | Bin 0 -> 1221 bytes 6 files changed, 207 insertions(+) create mode 100644 src/main/java/ru/betterend/entity/SilkMothEntity.java create mode 100644 src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java create mode 100644 src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java create mode 100644 src/main/resources/assets/betterend/textures/entity/silk_moth.png diff --git a/src/main/java/ru/betterend/entity/SilkMothEntity.java b/src/main/java/ru/betterend/entity/SilkMothEntity.java new file mode 100644 index 00000000..7c4809f4 --- /dev/null +++ b/src/main/java/ru/betterend/entity/SilkMothEntity.java @@ -0,0 +1,45 @@ +package ru.betterend.entity; + +import net.minecraft.entity.EntityType; +import net.minecraft.entity.Flutterer; +import net.minecraft.entity.passive.AnimalEntity; +import net.minecraft.entity.passive.PassiveEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.world.World; +import ru.betterend.registry.EndEntities; + +public class SilkMothEntity extends AnimalEntity implements Flutterer { + public SilkMothEntity(EntityType entityType, World world) { + super(entityType, world); + } + + @Override + public boolean isPushable() { + return false; + } + + @Override + protected boolean hasWings() { + return true; + } + + @Override + public boolean handleFallDamage(float fallDistance, float damageMultiplier) { + return false; + } + + @Override + public boolean canClimb() { + return false; + } + + @Override + public boolean hasNoGravity() { + return true; + } + + @Override + public PassiveEntity createChild(ServerWorld world, PassiveEntity entity) { + return EndEntities.SILK_MOTH.create(world); + } +} diff --git a/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java b/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java new file mode 100644 index 00000000..c9751121 --- /dev/null +++ b/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java @@ -0,0 +1,137 @@ +package ru.betterend.entity.model; + +import net.minecraft.client.model.ModelPart; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.math.MathHelper; +import ru.betterend.entity.SilkMothEntity; + +public class SilkMothEntityModel extends BlockBenchModel { + private final ModelPart legsL; + private final ModelPart cube_r1; + private final ModelPart cube_r2; + private final ModelPart cube_r3; + private final ModelPart legsR; + private final ModelPart cube_r4; + private final ModelPart cube_r5; + private final ModelPart cube_r6; + private final ModelPart head_pivot; + private final ModelPart tendril_r_r1; + private final ModelPart tendril_r_r2; + private final ModelPart bb_main; + private final ModelPart wingR_r1; + private final ModelPart wingL_r1; + private final ModelPart abdomen_r1; + + public SilkMothEntityModel() { + super(RenderLayer::getEntityCutout); + + textureWidth = 64; + textureHeight = 64; + + legsL = new ModelPart(this); + legsL.setPivot(1.5F, 19.9F, -0.45F); + setRotationAngle(legsL, 0.0F, 0.0F, 0.6981F); + + cube_r1 = new ModelPart(this); + cube_r1.setPivot(0.0F, 0.0F, -1.0F); + legsL.addChild(cube_r1); + setRotationAngle(cube_r1, 0.0F, 0.2182F, 0.3927F); + cube_r1.setTextureOffset(0, 13).addCuboid(0.0216F, 0.0F, -0.5976F, 3.0F, 0.0F, 1.0F, 0.0F); + + cube_r2 = new ModelPart(this); + cube_r2.setPivot(0.5F, 0.1F, -0.05F); + legsL.addChild(cube_r2); + setRotationAngle(cube_r2, 0.0F, 0.0F, 0.3927F); + cube_r2.setTextureOffset(0, 15).addCuboid(0.0F, 0.0F, -0.6F, 3.0F, 0.0F, 1.0F, 0.0F); + + cube_r3 = new ModelPart(this); + cube_r3.setPivot(0.0F, 0.0F, 0.9F); + legsL.addChild(cube_r3); + setRotationAngle(cube_r3, 0.0F, -0.2182F, 0.3927F); + cube_r3.setTextureOffset(0, 14).addCuboid(0.0F, 0.0F, -0.5F, 3.0F, 0.0F, 1.0F, 0.0F); + + legsR = new ModelPart(this); + legsR.setPivot(-1.5F, 19.9F, -0.55F); + setRotationAngle(legsR, 0.0F, 3.1416F, -0.6545F); + + cube_r4 = new ModelPart(this); + cube_r4.setPivot(0.0F, 0.0F, -1.0F); + legsR.addChild(cube_r4); + setRotationAngle(cube_r4, 0.0F, 0.2182F, 0.3927F); + cube_r4.setTextureOffset(0, 10).addCuboid(0.0F, 0.0F, -0.5F, 3.0F, 0.0F, 1.0F, 0.0F); + + cube_r5 = new ModelPart(this); + cube_r5.setPivot(0.5F, 0.1F, -0.05F); + legsR.addChild(cube_r5); + setRotationAngle(cube_r5, 0.0F, 0.0F, 0.3927F); + cube_r5.setTextureOffset(0, 11).addCuboid(0.0F, 0.0F, -0.4F, 3.0F, 0.0F, 1.0F, 0.0F); + + cube_r6 = new ModelPart(this); + cube_r6.setPivot(0.0F, 0.0F, 0.9F); + legsR.addChild(cube_r6); + setRotationAngle(cube_r6, 0.0F, -0.2182F, 0.3927F); + cube_r6.setTextureOffset(0, 12).addCuboid(0.0216F, 0.0F, -0.4024F, 3.0F, 0.0F, 1.0F, 0.0F); + + head_pivot = new ModelPart(this); + head_pivot.setPivot(0.0F, 18.0F, -3.0F); + head_pivot.setTextureOffset(15, 10).addCuboid(-1.5F, -1.5F, -2.0F, 3.0F, 3.0F, 3.0F, 0.0F); + + tendril_r_r1 = new ModelPart(this); + tendril_r_r1.setPivot(1.0F, -1.15F, -1.0F); + head_pivot.addChild(tendril_r_r1); + setRotationAngle(tendril_r_r1, 0.0F, 0.0F, 0.3927F); + tendril_r_r1.setTextureOffset(23, 0).addCuboid(-1.5F, -5.0F, 0.0F, 3.0F, 5.0F, 0.0F, 0.0F, true); + + tendril_r_r2 = new ModelPart(this); + tendril_r_r2.setPivot(-1.0F, -1.15F, -1.0F); + head_pivot.addChild(tendril_r_r2); + setRotationAngle(tendril_r_r2, 0.0F, 0.0F, -0.3927F); + tendril_r_r2.setTextureOffset(23, 0).addCuboid(-1.5F, -5.0F, 0.0F, 3.0F, 5.0F, 0.0F, 0.0F); + + bb_main = new ModelPart(this); + bb_main.setPivot(0.0F, 24.0F, 0.0F); + bb_main.setTextureOffset(19, 19).addCuboid(-2.5F, -8.5F, -3.0F, 5.0F, 5.0F, 3.0F, 0.0F); + + wingR_r1 = new ModelPart(this); + wingR_r1.setPivot(-1.5F, -6.5F, 0.5F); + bb_main.addChild(wingR_r1); + setRotationAngle(wingR_r1, 0.0F, 0.0F, 0.3927F); + wingR_r1.setTextureOffset(0, 5).addCuboid(-7.0F, 0.0F, -3.0F, 9.0F, 0.0F, 5.0F, 0.0F, true); + + wingL_r1 = new ModelPart(this); + wingL_r1.setPivot(1.5F, -6.5F, 0.5F); + bb_main.addChild(wingL_r1); + setRotationAngle(wingL_r1, 0.0F, 0.0F, -0.3927F); + wingL_r1.setTextureOffset(0, 5).addCuboid(-2.0F, 0.0F, -3.0F, 9.0F, 0.0F, 5.0F, 0.0F); + + abdomen_r1 = new ModelPart(this); + abdomen_r1.setPivot(1.0F, -3.9F, 0.0F); + bb_main.addChild(abdomen_r1); + setRotationAngle(abdomen_r1, -0.3927F, 0.0F, 0.0F); + abdomen_r1.setTextureOffset(0, 10).addCuboid(-3.0F, -4.0F, -1.0F, 4.0F, 4.0F, 7.0F, 0.0F); + } + + + @Override + public void setAngles(SilkMothEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { + wingR_r1.roll = MathHelper.sin(animationProgress * 2F) * 0.4F + 0.3927F; + wingL_r1.roll = -wingR_r1.roll; + head_pivot.pitch = MathHelper.sin(animationProgress * 0.03F) * 0.1F; + tendril_r_r1.roll = MathHelper.sin(animationProgress * 0.07F) * 0.2F + 0.3927F; + tendril_r_r2.roll = -tendril_r_r1.roll; + abdomen_r1.pitch = MathHelper.sin(animationProgress * 0.05F) * 0.1F - 0.3927F; + legsR.roll = MathHelper.sin(animationProgress * 0.07F) * 0.1F - 0.6545F; + legsL.roll = -legsR.roll; + } + + + @Override + public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { + bb_main.render(matrices, vertices, light, overlay); + head_pivot.render(matrices, vertices, light, overlay); + legsL.render(matrices, vertices, light, overlay); + legsR.render(matrices, vertices, light, overlay); + } +} diff --git a/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java b/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java new file mode 100644 index 00000000..818520d6 --- /dev/null +++ b/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java @@ -0,0 +1,21 @@ +package ru.betterend.entity.render; + +import net.minecraft.client.render.entity.EntityRenderDispatcher; +import net.minecraft.client.render.entity.MobEntityRenderer; +import net.minecraft.util.Identifier; +import ru.betterend.BetterEnd; +import ru.betterend.entity.SilkMothEntity; +import ru.betterend.entity.model.SilkMothEntityModel; + +public class SilkMothEntityRenderer extends MobEntityRenderer { + private static final Identifier TEXTURE = BetterEnd.makeID("textures/entity/silk_moth.png"); + + public SilkMothEntityRenderer(EntityRenderDispatcher entityRenderDispatcher) { + super(entityRenderDispatcher, new SilkMothEntityModel(), 0.5f); + } + + @Override + public Identifier getTexture(SilkMothEntity entity) { + return TEXTURE; + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/registry/EndEntities.java b/src/main/java/ru/betterend/registry/EndEntities.java index 60480491..3da97dc8 100644 --- a/src/main/java/ru/betterend/registry/EndEntities.java +++ b/src/main/java/ru/betterend/registry/EndEntities.java @@ -18,6 +18,7 @@ import ru.betterend.entity.DragonflyEntity; import ru.betterend.entity.EndFishEntity; import ru.betterend.entity.EndSlimeEntity; import ru.betterend.entity.ShadowWalkerEntity; +import ru.betterend.entity.SilkMothEntity; import ru.betterend.util.MHelper; import ru.betterend.util.SpawnHelper; @@ -27,6 +28,7 @@ public class EndEntities { public static final EntityType END_FISH = register("end_fish", SpawnGroup.WATER_AMBIENT, 0.5F, 0.5F, EndFishEntity::new, EndFishEntity.createMobAttributes(), true, MHelper.color(3, 50, 76), MHelper.color(120, 206, 255)); public static final EntityType SHADOW_WALKER = register("shadow_walker", SpawnGroup.MONSTER, 0.6F, 1.95F, ShadowWalkerEntity::new, ShadowWalkerEntity.createMobAttributes(), true, MHelper.color(30, 30, 30), MHelper.color(5, 5, 5)); public static final EntityType CUBOZOA = register("cubozoa", SpawnGroup.WATER_AMBIENT, 0.6F, 1F, CubozoaEntity::new, CubozoaEntity.createMobAttributes(), true, MHelper.color(151, 77, 181), MHelper.color(93, 176, 238)); + public static final EntityType SILK_MOTH = register("silk_moth", SpawnGroup.AMBIENT, 0.6F, 0.6F, SilkMothEntity::new, SilkMothEntity.createMobAttributes(), true, MHelper.color(0, 0, 0), MHelper.color(225, 225, 225)); public static void register() { SpawnHelper.restrictionAir(DRAGONFLY, DragonflyEntity::canSpawn); diff --git a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java index 7c0b0ed5..35d2a367 100644 --- a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java +++ b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java @@ -11,6 +11,7 @@ import ru.betterend.entity.render.RendererEntityDragonfly; import ru.betterend.entity.render.RendererEntityEndFish; import ru.betterend.entity.render.RendererEntityEndSlime; import ru.betterend.entity.render.RendererEntityShadowWalker; +import ru.betterend.entity.render.SilkMothEntityRenderer; public class EndEntitiesRenders { @@ -20,6 +21,7 @@ public class EndEntitiesRenders { register(EndEntities.END_FISH, RendererEntityEndFish::new); register(EndEntities.SHADOW_WALKER, RendererEntityShadowWalker::new); register(EndEntities.CUBOZOA, RendererEntityCubozoa::new); + register(EndEntities.SILK_MOTH, SilkMothEntityRenderer::new); } private static void register(EntityType type, Function> render) { diff --git a/src/main/resources/assets/betterend/textures/entity/silk_moth.png b/src/main/resources/assets/betterend/textures/entity/silk_moth.png new file mode 100644 index 0000000000000000000000000000000000000000..d622f9401b3c0dd39d7869a81a5f63544911ebd3 GIT binary patch literal 1221 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEVCnI6aSW-5dm9pFh3)`H`pprps+Uv@9?uk<-t10(v!eW1X?{vV`1$&`>rJaNb{u%d zzUf5X*@e+xAKcA&+&S65+b}R^pY8Ss`Fb}N=v(To>&*LdkJngu-h<}zxuTEP$HpAn zoX^7`!In6Mck_FhS&i25u0fF-6q!E-SKe83g_S$)yI8{1;E0*)*%<^DXqe4h{_Mif zELQ7&yO}49BqT$2?3?+ri8*Ea^ML3qb_SP?4{u1{kNLh`{?5b`Cyn=cH2(ea^ShG> zXG6}zpa*+3%sf~B?_>x#GUMkLAF+Ey(%Ji~n|MXcJYNE3=IrRn)M57cykQ5g|2)4% zH!^q++*v5}CrW;5ytLBq+iBhz+h#E`a~x2SUd#BPUEq5CI<|*urVR`}n>=k8_Sf!w z@;$8jgO=X1Zz2loB`Z#Cd-&V#PhI>Okb4LPlxE1o6ur{;4bsw%fIjwfz3gC(ps~peS6+YQ_59D|FW=Ox=7j|NDm*+9zZF zD>F{GAAMxnO<$&lsI7WH#n$t0iZT>bZxnhXA6N0uwdU8uN}1}n8v7!4iDa(qUG3vi zFj>Muy84#e?`7H&3cqEy3m=&~UytSb*{f~^zKma2F*AB9Ngrb}@MOMpwC9IQ-TSYX z3yk>uYQLDB+xLs_PG7gVy@hgE|GO&oxwG1REW0hhLy|M{ZtC*3@M&Z6SQhkr+=9=_4AE^gl=_p1#{ zQoiIp-ca}FjkSH~hKaYIb!=RFlr81{CY^%Jt)!b1KQ#=6udcuIii9 z`+|d4GD@tqle7Ee@#w|B^$Zi5yISwKFr<7t*;2Mt)y&t1chdeEyBhs>lNT*u@yLAl z!y~gx{^fZ!?*rLenNNNG-OwWu&h&?C%5S#H0;l@J-;>xM?;rN3|uUHy%Yx*4CDlo5LJ?vY}aEK@2?CJkv78ie~vz4eboW5G> zSkEa^f4E&Iu+*(}ZV{W$B?imFoi_iLn>e_-z1zyalxN5FgR3j%Gdi$#S^YNPxnNnX zm1NEn(75QF9S?KKxp`eTc$q^Mtk}$dm|^bb Date: Fri, 15 Jan 2021 14:19:13 +0300 Subject: [PATCH 172/463] Simple moth AI --- .../ru/betterend/entity/SilkMothEntity.java | 102 ++++++++++++++++++ .../materialmaps/block/creeping_moss.json | 2 +- .../materials/waving_floor_glow_half.json | 10 ++ .../betterend/textures/entity/silk_moth.png | Bin 1221 -> 2350 bytes 4 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/assets/betterend/materials/waving_floor_glow_half.json diff --git a/src/main/java/ru/betterend/entity/SilkMothEntity.java b/src/main/java/ru/betterend/entity/SilkMothEntity.java index 7c4809f4..c5b625ca 100644 --- a/src/main/java/ru/betterend/entity/SilkMothEntity.java +++ b/src/main/java/ru/betterend/entity/SilkMothEntity.java @@ -1,16 +1,76 @@ package ru.betterend.entity; +import java.util.EnumSet; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.block.BlockState; import net.minecraft.entity.EntityType; import net.minecraft.entity.Flutterer; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.ai.TargetFinder; +import net.minecraft.entity.ai.control.FlightMoveControl; +import net.minecraft.entity.ai.control.LookControl; +import net.minecraft.entity.ai.goal.AnimalMateGoal; +import net.minecraft.entity.ai.goal.FollowParentGoal; +import net.minecraft.entity.ai.goal.Goal; +import net.minecraft.entity.ai.goal.SwimGoal; +import net.minecraft.entity.ai.pathing.BirdNavigation; +import net.minecraft.entity.ai.pathing.EntityNavigation; +import net.minecraft.entity.ai.pathing.PathNodeType; +import net.minecraft.entity.attribute.DefaultAttributeContainer; +import net.minecraft.entity.attribute.EntityAttributes; +import net.minecraft.entity.mob.MobEntity; import net.minecraft.entity.passive.AnimalEntity; import net.minecraft.entity.passive.PassiveEntity; import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import ru.betterend.registry.EndEntities; public class SilkMothEntity extends AnimalEntity implements Flutterer { public SilkMothEntity(EntityType entityType, World world) { super(entityType, world); + this.moveControl = new FlightMoveControl(this, 20, true); + this.lookControl = new MothLookControl(this); + this.setPathfindingPenalty(PathNodeType.WATER, -1.0F); + this.setPathfindingPenalty(PathNodeType.DANGER_FIRE, -1.0F); + this.experiencePoints = 1; + } + + public static DefaultAttributeContainer.Builder createMobAttributes() { + return LivingEntity.createLivingAttributes() + .add(EntityAttributes.GENERIC_MAX_HEALTH, 2.0D) + .add(EntityAttributes.GENERIC_FOLLOW_RANGE, 16.0D) + .add(EntityAttributes.GENERIC_FLYING_SPEED, 0.4D) + .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.1D); + } + + @Override + protected void initGoals() { + this.goalSelector.add(2, new AnimalMateGoal(this, 1.0D)); + this.goalSelector.add(5, new FollowParentGoal(this, 1.25D)); + this.goalSelector.add(8, new WanderAroundGoal()); + this.goalSelector.add(9, new SwimGoal(this)); + } + + @Override + protected EntityNavigation createNavigation(World world) { + BirdNavigation birdNavigation = new BirdNavigation(this, world) { + public boolean isValidPosition(BlockPos pos) { + BlockState state = this.world.getBlockState(pos); + return state.isAir() || !state.getMaterial().blocksMovement(); + } + + public void tick() { + super.tick(); + } + }; + birdNavigation.setCanPathThroughDoors(false); + birdNavigation.setCanSwim(false); + birdNavigation.setCanEnterOpenDoors(true); + return birdNavigation; } @Override @@ -42,4 +102,46 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { public PassiveEntity createChild(ServerWorld world, PassiveEntity entity) { return EndEntities.SILK_MOTH.create(world); } + + class MothLookControl extends LookControl { + MothLookControl(MobEntity entity) { + super(entity); + } + + protected boolean shouldStayHorizontal() { + return true; + } + } + + class WanderAroundGoal extends Goal { + WanderAroundGoal() { + this.setControls(EnumSet.of(Goal.Control.MOVE)); + } + + public boolean canStart() { + return SilkMothEntity.this.navigation.isIdle() && SilkMothEntity.this.random.nextInt(10) == 0; + } + + public boolean shouldContinue() { + return SilkMothEntity.this.navigation.isFollowingPath(); + } + + public void start() { + Vec3d vec3d = this.getRandomLocation(); + if (vec3d != null) { + try { + SilkMothEntity.this.navigation.startMovingAlong(SilkMothEntity.this.navigation.findPathTo((BlockPos) (new BlockPos(vec3d)), 1), 1.0D); + } + catch (Exception e) {} + } + + } + + @Nullable + private Vec3d getRandomLocation() { + Vec3d vec3d3 = SilkMothEntity.this.getRotationVec(0.0F); + Vec3d vec3d4 = TargetFinder.findAirTarget(SilkMothEntity.this, 8, 7, vec3d3, 1.5707964F, 2, 1); + return vec3d4 != null ? vec3d4 : TargetFinder.findGroundTarget(SilkMothEntity.this, 8, 4, -2, vec3d3, 1.5707963705062866D); + } + } } diff --git a/src/main/resources/assets/betterend/materialmaps/block/creeping_moss.json b/src/main/resources/assets/betterend/materialmaps/block/creeping_moss.json index 3b73d687..3af6aa5a 100644 --- a/src/main/resources/assets/betterend/materialmaps/block/creeping_moss.json +++ b/src/main/resources/assets/betterend/materialmaps/block/creeping_moss.json @@ -3,7 +3,7 @@ "spriteMap": [ { "sprite": "betterend:block/creeping_moss_spores", - "material": "betterend:wave_glow_50_half" + "material": "betterend:waving_floor_glow_half" }, { "sprite": "betterend:block/creeping_moss_leaves", diff --git a/src/main/resources/assets/betterend/materials/waving_floor_glow_half.json b/src/main/resources/assets/betterend/materials/waving_floor_glow_half.json new file mode 100644 index 00000000..6217c243 --- /dev/null +++ b/src/main/resources/assets/betterend/materials/waving_floor_glow_half.json @@ -0,0 +1,10 @@ +{ + "layers": [ + { + "vertexSource": "betterend:shaders/material/wave_floor.vert", + "fragmentSource": "betterend:shaders/material/glow_all_half.frag", + "disableAo": true, + "disableDiffuse": true + } + ] +} diff --git a/src/main/resources/assets/betterend/textures/entity/silk_moth.png b/src/main/resources/assets/betterend/textures/entity/silk_moth.png index d622f9401b3c0dd39d7869a81a5f63544911ebd3..4976d1f08a953ea7e2b361eee28c1c25bdda80ee 100644 GIT binary patch literal 2350 zcmbVO2~-nj9v>PIgrXvNR8-~-AfQcV5@JF|B3HOqQ{ zXtBB$mCGV6D#}(Xwm`8^>Z-d%SwZUo0{Xe04memo9{}tvq&nG{ ztb7&4X}ti`(CLIAPtR~@00<7rV=z36FoNksCP~Sm(dI88kkrVbq~%IP$wUxZGA5rT z67%EKczzZx(?B6B!QecUBhV8@49wH(C!P$rYXhzJ&m_#A?7FjGb>k53uArx+B30cT0ZNYWH&WyI3y z9HSiKG@UR(&)8@w!=#%yhrxLm0}BO+)ueHt2Djmu99B0jT!X`ej?fd7(ZFGaHY}s1 zjkG~a{~K!C=U)imT&q;tWc;o!dc94A!5Ep#nK9{*-$fhLW`=+h2m_tN;zVRFr>3{n z8U~GE3Cu{dYMRzf1xhugG8hqI4NMT|pF~m`+GGg$*%?BC83{QgLPSC?WPIUrwNQkL zxLdXi2}BWO0;;4nWQO^-P%()F%!vJ0um(pnXjYGLHj{cRlYkj269R3X zL?dV&&2oY{?E=TOP%6<_%3#DOoQPG(A3L4L`26yVb=KnmunkBj7!gSBgV=XyrR-iGYfs2=UvM3UX?8%jm z1jiEr#c*qa%OTtvSwaI%z9ygB0~53+Ey0oghj35840MLkgt0_eCg-jHC8J2)} z12=psF6|x8Fm;sY?CIJs+4)t*r(d_Smxd3#T`~G~f#H&Wr=qg2>XEi`QBl!Y=Z(Xw zY9;T!H80Zr(B{oArf;~TN;%V->fb*0ir>Cm z{q2kn`&n_)NdmVl2a&?KKRcZ4Q(vqS*%!{?aSw4PYFso^-!AU5+ebP1R z;+JLSnbF<%%&M9bC6E6(+!Ax?>JU59J5=Xs`D{_y>sMT6be>67%q|*vXRE}6_h9?z z{K4SCO@5NFxjA)_K4Kqt}fhV3wWxb8Vs84v(l$EPG7h*bs6v2$mv^& zmdBeYwr^HZ$8}!}|(C>22vnw;JLSA>V+$gPTIkK2{>ooX} z^$yTQr=SlzX39SR+hS6Ae78AXgZt+^b96+YtE^?x2; z>QGUeedjxS?a-0=5fv|Z*g*@XL8_+|)v52QcYm|N`9e*y%Y)bE9VbF6-d)?%B(fJc zl!rS6w_6NPOE24A3bz!4u93XT<{uj zxUHkHq5QmO)$y(wr8?fG!FiF2f|LVWi!0qm<9kkd2idhb>zs8&=J^FwxR zLk+zqAcb#{BR>JhAH?Wxd{7LAT*ZHQa&2kOn3r$g+=^P+ z?dhHI3-4_RzuR0HwWXkZtnjUA)|2w-ssYH=pdvbYHK)*RM8E&lJ zw=MU2!28$ssd(V_T+u+Eb7KD4YoPB(Ngju%759X?ZnW>LPpt3yA?U+z%4(c|DBuOP zW1Xqs(9;s9L%qJ|-R!%`cUpIQAL>3#Wq;$ng)Ljvdx5FoX_asI-QVeb<|m))MO{fp m@(W)Cc&z{eJm2(o>L%XbiW%aq1yaKLM-v+vr>GB4EBqJgtZh*M delta 1202 zcma)zdpy$#0Kk7Uw(2(dFtu72amjhit5))?&*rv^M)V|GIL+HtYMJ~-oM)0pT8Gh9 z6t>k)Cbd?Ze!m>k_LarfpkW~izbk|uK7Ba!B8q_a z^75*9+bS|{i}TGj#ahwDwA|0|sZtxsc2jn-VL076mblfl&<1~D^#fW2-BsD+Bl^>c zh>LsB9x5j|o8V>;{BG4VwL0ug<@$yM=@3gAGKFnQWpQS>Lj8xdNsqz(k;m|DYJH|t zQpK4`3HXn`Vk7^_&7gSN^3!aJPFtjEi&WL0k)|X?Q4jWk)7)*TG=b{uC+|7pY3 z3=axn-(lV+=v?qwdE-l?AEGsDsO7YenAF(fSat87FU1;pT=ZsjxT4pE2!yQn znb4?~$-vN9IDo&Slwn50G%XhLOC6nVLSn`@^^#^cY9%vXxli%X7DsAW&I1A^SC-WN zYu=u~#64nUB2hTf`|qYwP#EI?CC>8%NOJYwYcd*AB(F8q9kD2J?rOQ$@umix@k zjf0?Bm~iZPrNd56PV-VIZyuN0Gm#FA)Iu;2>e>M!`8PwrtHoZLrPUf+tN;`z4%+Rk z=eE^5Hd>bRUnFT}!72OBuw`pV@o1>z@=$;Q^GGxHd+osIIVI+ZsWqC1sN z9ZpCE^BOflibFn>#mD3dw<{xF7rOfG?l&9D*u%ln)W49}g!oEbS44nkUwr2(#!y93 zaPTb%y2*Q^_Z)F-O3wv~&*x{$@j%p<&aBfnHsb<3ktL7PywjX!O0U%z5@Ti-i81*W z@B3`_h~k=|UGrLIA^MTD6&W89J>{=!0yD1ldLy8xdaLtg zNN7k+J%6 Date: Fri, 15 Jan 2021 17:23:54 +0300 Subject: [PATCH 173/463] Mole nest interaction --- .../betterend/blocks/SilkMothNestBlock.java | 35 ++++++- .../ru/betterend/entity/SilkMothEntity.java | 94 ++++++++++++++++++- 2 files changed, 126 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java index deacc08a..6f502ded 100644 --- a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java +++ b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java @@ -2,6 +2,7 @@ package ru.betterend.blocks; import java.util.Collections; import java.util.List; +import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.Block; @@ -13,7 +14,10 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemPlacementContext; import net.minecraft.item.ItemStack; import net.minecraft.loot.context.LootContext; +import net.minecraft.server.world.ServerWorld; import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvents; import net.minecraft.state.StateManager; import net.minecraft.state.property.BooleanProperty; import net.minecraft.state.property.DirectionProperty; @@ -22,14 +26,18 @@ import net.minecraft.tag.BlockTags; import net.minecraft.util.BlockMirror; import net.minecraft.util.BlockRotation; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Vec3d; import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.BlockView; import net.minecraft.world.World; import net.minecraft.world.WorldAccess; import ru.betterend.blocks.basis.BaseBlock; import ru.betterend.client.render.ERenderLayer; +import ru.betterend.entity.SilkMothEntity; import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.registry.EndEntities; import ru.betterend.util.BlocksHelper; public class SilkMothNestBlock extends BaseBlock implements IRenderTypeable { @@ -39,7 +47,7 @@ public class SilkMothNestBlock extends BaseBlock implements IRenderTypeable { private static final VoxelShape BOTTOM = createCuboidShape(0, 0, 0, 16, 16, 16); public SilkMothNestBlock() { - super(FabricBlockSettings.of(Material.WOOL).hardness(0.5F).resistance(0.1F).sounds(BlockSoundGroup.WOOL).nonOpaque()); + super(FabricBlockSettings.of(Material.WOOL).hardness(0.5F).resistance(0.1F).sounds(BlockSoundGroup.WOOL).nonOpaque().ticksRandomly()); this.setDefaultState(getDefaultState().with(ACTIVE, true)); } @@ -103,4 +111,29 @@ public class SilkMothNestBlock extends BaseBlock implements IRenderTypeable { } super.onBreak(world, pos, state, player); } + + @Override + public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + if (!state.get(ACTIVE)) { + return; + } + if (random.nextInt(16) > 0) { + return; + } + Direction dir = state.get(FACING); + BlockPos spawn = pos.offset(dir); + if (!world.getBlockState(spawn).isAir()) { + return; + } + int count = world.getEntitiesByType(EndEntities.SILK_MOTH, new Box(pos).expand(16), (entity) -> { return true; }).size(); + if (count > 8) { + return; + } + SilkMothEntity moth = new SilkMothEntity(EndEntities.SILK_MOTH, world); + moth.refreshPositionAndAngles(spawn.getX() + 0.5, spawn.getY() + 0.5, spawn.getZ() + 0.5, dir.asRotation(), 0); + moth.setVelocity(new Vec3d(dir.getOffsetX() * 0.4, 0, dir.getOffsetZ() * 0.4)); + moth.setHive(world, pos); + world.spawnEntity(moth); + world.playSound(null, pos, SoundEvents.BLOCK_BEEHIVE_EXIT, SoundCategory.BLOCKS, 1, 1); + } } diff --git a/src/main/java/ru/betterend/entity/SilkMothEntity.java b/src/main/java/ru/betterend/entity/SilkMothEntity.java index c5b625ca..dc1169de 100644 --- a/src/main/java/ru/betterend/entity/SilkMothEntity.java +++ b/src/main/java/ru/betterend/entity/SilkMothEntity.java @@ -23,13 +23,27 @@ import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.entity.mob.MobEntity; import net.minecraft.entity.passive.AnimalEntity; import net.minecraft.entity.passive.PassiveEntity; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtHelper; import net.minecraft.server.world.ServerWorld; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvents; +import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.World; +import ru.betterend.BetterEnd; +import ru.betterend.blocks.SilkMothNestBlock; +import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; public class SilkMothEntity extends AnimalEntity implements Flutterer { + private BlockPos hivePos; + private BlockPos entrance; + private World hiveWorld; + public SilkMothEntity(EntityType entityType, World world) { super(entityType, world); this.moveControl = new FlightMoveControl(this, 20, true); @@ -46,9 +60,38 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { .add(EntityAttributes.GENERIC_FLYING_SPEED, 0.4D) .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.1D); } + + public void setHive(World world, BlockPos hive) { + this.hivePos = hive; + this.hiveWorld = world; + } + + @Override + public void writeCustomDataToTag(CompoundTag tag) { + if (hivePos != null) { + tag.put("HivePos", NbtHelper.fromBlockPos(hivePos)); + tag.putString("HiveWorld", hiveWorld.getRegistryKey().getValue().toString()); + } + } + + @Override + public void readCustomDataFromTag(CompoundTag tag) { + if (tag.contains("HivePos")) { + hivePos = NbtHelper.toBlockPos(tag.getCompound("HivePos")); + Identifier worldID = new Identifier(tag.getString("HiveWorld")); + try { + hiveWorld = world.getServer().getWorld(RegistryKey.of(Registry.DIMENSION, worldID)); + } + catch (Exception e) { + BetterEnd.LOGGER.warning("Silk Moth Hive World {} is missing!", worldID); + hivePos = null; + } + } + } @Override protected void initGoals() { + this.goalSelector.add(1, new ReturnToHiveGoal()); this.goalSelector.add(2, new AnimalMateGoal(this, 1.0D)); this.goalSelector.add(5, new FollowParentGoal(this, 1.25D)); this.goalSelector.add(8, new WanderAroundGoal()); @@ -118,23 +161,25 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { this.setControls(EnumSet.of(Goal.Control.MOVE)); } + @Override public boolean canStart() { return SilkMothEntity.this.navigation.isIdle() && SilkMothEntity.this.random.nextInt(10) == 0; } + @Override public boolean shouldContinue() { return SilkMothEntity.this.navigation.isFollowingPath(); } + @Override public void start() { Vec3d vec3d = this.getRandomLocation(); if (vec3d != null) { try { - SilkMothEntity.this.navigation.startMovingAlong(SilkMothEntity.this.navigation.findPathTo((BlockPos) (new BlockPos(vec3d)), 1), 1.0D); + SilkMothEntity.this.navigation.startMovingAlong(SilkMothEntity.this.navigation.findPathTo(new BlockPos(vec3d), 1), 1.0D); } catch (Exception e) {} } - } @Nullable @@ -144,4 +189,49 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { return vec3d4 != null ? vec3d4 : TargetFinder.findGroundTarget(SilkMothEntity.this, 8, 4, -2, vec3d3, 1.5707963705062866D); } } + + class ReturnToHiveGoal extends Goal { + ReturnToHiveGoal() { + this.setControls(EnumSet.of(Goal.Control.MOVE)); + } + + @Override + public boolean canStart() { + return SilkMothEntity.this.hivePos != null + && SilkMothEntity.this.hiveWorld == SilkMothEntity.this.world + && SilkMothEntity.this.navigation.isIdle() + && SilkMothEntity.this.random.nextInt(16) == 0 + && SilkMothEntity.this.getPos().squaredDistanceTo(SilkMothEntity.this.hivePos.getX(), SilkMothEntity.this.hivePos.getY(), SilkMothEntity.this.hivePos.getZ()) < 32; + } + + @Override + public boolean shouldContinue() { + return SilkMothEntity.this.navigation.isFollowingPath() && world.getBlockState(entrance).isAir(); + } + + @Override + public void start() { + BlockState state = SilkMothEntity.this.world.getBlockState(SilkMothEntity.this.hivePos); + if (!state.isOf(EndBlocks.SILK_MOTH_NEST)) { + SilkMothEntity.this.hivePos = null; + } + try { + entrance = SilkMothEntity.this.hivePos.offset(state.get(SilkMothNestBlock.FACING)); + SilkMothEntity.this.navigation.startMovingAlong(SilkMothEntity.this.navigation.findPathTo(entrance, 1), 1.0D); + } + catch (Exception e) {} + } + + @Override + public void tick() { + super.tick(); + double dx = Math.abs(SilkMothEntity.this.entrance.getX() - SilkMothEntity.this.getX()); + double dy = Math.abs(SilkMothEntity.this.entrance.getY() - SilkMothEntity.this.getY()); + double dz = Math.abs(SilkMothEntity.this.entrance.getZ() - SilkMothEntity.this.getZ()); + if (dx + dy + dz < 1) { + SilkMothEntity.this.world.playSound(null, SilkMothEntity.this.entrance, SoundEvents.BLOCK_BEEHIVE_ENTER, SoundCategory.BLOCKS, 1, 1); + SilkMothEntity.this.remove(); + } + } + } } From e80c146727bce55e03b0dd3d4a34921d50874812 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 15 Jan 2021 18:07:55 +0300 Subject: [PATCH 174/463] Silk moth nest generation --- .../ru/betterend/blocks/BlockProperties.java | 1 + .../betterend/blocks/SilkMothNestBlock.java | 6 +- .../ru/betterend/entity/SilkMothEntity.java | 27 +++++++-- .../ru/betterend/registry/EndEntities.java | 1 + .../ru/betterend/registry/EndFeatures.java | 4 ++ .../world/biome/BiomeBlossomingSpires.java | 5 +- .../world/features/SilkMothNestFeature.java | 55 ++++++++++++++++++ .../betterend/blockstates/silk_moth_nest.json | 20 +++++-- .../block/silk_moth_nest_bottom_silk.json | 37 ++++++++++++ .../textures/minimap/entities/cubozoa.png | Bin 0 -> 1814 bytes .../textures/minimap/entities/dragonfly.png | Bin 0 -> 1860 bytes .../textures/minimap/entities/end_fish.png | Bin 0 -> 2040 bytes .../textures/minimap/entities/end_slime.png | Bin 0 -> 2048 bytes .../minimap/entities/shadow_walker.png | Bin 0 -> 1619 bytes .../textures/minimap/entities/silk_moth.png | Bin 0 -> 1648 bytes 15 files changed, 145 insertions(+), 11 deletions(-) create mode 100644 src/main/java/ru/betterend/world/features/SilkMothNestFeature.java create mode 100644 src/main/resources/assets/betterend/models/block/silk_moth_nest_bottom_silk.json create mode 100644 src/main/resources/assets/betterend/textures/minimap/entities/cubozoa.png create mode 100644 src/main/resources/assets/betterend/textures/minimap/entities/dragonfly.png create mode 100644 src/main/resources/assets/betterend/textures/minimap/entities/end_fish.png create mode 100644 src/main/resources/assets/betterend/textures/minimap/entities/end_slime.png create mode 100644 src/main/resources/assets/betterend/textures/minimap/entities/shadow_walker.png create mode 100644 src/main/resources/assets/betterend/textures/minimap/entities/silk_moth.png diff --git a/src/main/java/ru/betterend/blocks/BlockProperties.java b/src/main/java/ru/betterend/blocks/BlockProperties.java index f1c2f10a..27e13d36 100644 --- a/src/main/java/ru/betterend/blocks/BlockProperties.java +++ b/src/main/java/ru/betterend/blocks/BlockProperties.java @@ -15,6 +15,7 @@ public class BlockProperties { public static final BooleanProperty ACTIVE = BooleanProperty.of("active"); public static final IntProperty ROTATION = IntProperty.of("rotation", 0, 3); public static final BooleanProperty NATURAL = BooleanProperty.of("natural"); + public static final IntProperty FULLNESS = IntProperty.of("fullness", 0, 3); public static enum TripleShape implements StringIdentifiable { TOP("top"), diff --git a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java index 6f502ded..f7e8cd62 100644 --- a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java +++ b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java @@ -21,6 +21,7 @@ import net.minecraft.sound.SoundEvents; import net.minecraft.state.StateManager; import net.minecraft.state.property.BooleanProperty; import net.minecraft.state.property.DirectionProperty; +import net.minecraft.state.property.IntProperty; import net.minecraft.state.property.Properties; import net.minecraft.tag.BlockTags; import net.minecraft.util.BlockMirror; @@ -43,17 +44,18 @@ import ru.betterend.util.BlocksHelper; public class SilkMothNestBlock extends BaseBlock implements IRenderTypeable { public static final BooleanProperty ACTIVE = BlockProperties.ACTIVE; public static final DirectionProperty FACING = Properties.HORIZONTAL_FACING; + public static final IntProperty FULLNESS = BlockProperties.FULLNESS; private static final VoxelShape TOP = createCuboidShape(6, 0, 6, 10, 16, 10); private static final VoxelShape BOTTOM = createCuboidShape(0, 0, 0, 16, 16, 16); public SilkMothNestBlock() { super(FabricBlockSettings.of(Material.WOOL).hardness(0.5F).resistance(0.1F).sounds(BlockSoundGroup.WOOL).nonOpaque().ticksRandomly()); - this.setDefaultState(getDefaultState().with(ACTIVE, true)); + this.setDefaultState(getDefaultState().with(ACTIVE, true).with(FULLNESS, 0)); } @Override protected void appendProperties(StateManager.Builder stateManager) { - stateManager.add(ACTIVE, FACING); + stateManager.add(ACTIVE, FACING, FULLNESS); } @Override diff --git a/src/main/java/ru/betterend/entity/SilkMothEntity.java b/src/main/java/ru/betterend/entity/SilkMothEntity.java index dc1169de..75085238 100644 --- a/src/main/java/ru/betterend/entity/SilkMothEntity.java +++ b/src/main/java/ru/betterend/entity/SilkMothEntity.java @@ -1,6 +1,7 @@ package ru.betterend.entity; import java.util.EnumSet; +import java.util.Random; import org.jetbrains.annotations.Nullable; @@ -8,6 +9,7 @@ import net.minecraft.block.BlockState; import net.minecraft.entity.EntityType; import net.minecraft.entity.Flutterer; import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.SpawnReason; import net.minecraft.entity.ai.TargetFinder; import net.minecraft.entity.ai.control.FlightMoveControl; import net.minecraft.entity.ai.control.LookControl; @@ -33,11 +35,15 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryKey; +import net.minecraft.world.ServerWorldAccess; import net.minecraft.world.World; +import net.minecraft.world.Heightmap.Type; import ru.betterend.BetterEnd; +import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.SilkMothNestBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; +import ru.betterend.util.BlocksHelper; public class SilkMothEntity extends AnimalEntity implements Flutterer { private BlockPos hivePos; @@ -146,6 +152,11 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { return EndEntities.SILK_MOTH.create(world); } + public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { + int y = world.getChunk(pos).sampleHeightmap(Type.WORLD_SURFACE, pos.getX() & 15, pos.getY() & 15); + return y > 0 && pos.getY() >= y; + } + class MothLookControl extends LookControl { MothLookControl(MobEntity entity) { super(entity); @@ -206,7 +217,7 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { @Override public boolean shouldContinue() { - return SilkMothEntity.this.navigation.isFollowingPath() && world.getBlockState(entrance).isAir(); + return SilkMothEntity.this.navigation.isFollowingPath() && world.getBlockState(entrance).isAir() && world.getBlockState(hivePos).isOf(EndBlocks.SILK_MOTH_NEST); } @Override @@ -216,7 +227,7 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { SilkMothEntity.this.hivePos = null; } try { - entrance = SilkMothEntity.this.hivePos.offset(state.get(SilkMothNestBlock.FACING)); + SilkMothEntity.this.entrance = SilkMothEntity.this.hivePos.offset(state.get(SilkMothNestBlock.FACING)); SilkMothEntity.this.navigation.startMovingAlong(SilkMothEntity.this.navigation.findPathTo(entrance, 1), 1.0D); } catch (Exception e) {} @@ -229,8 +240,16 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { double dy = Math.abs(SilkMothEntity.this.entrance.getY() - SilkMothEntity.this.getY()); double dz = Math.abs(SilkMothEntity.this.entrance.getZ() - SilkMothEntity.this.getZ()); if (dx + dy + dz < 1) { - SilkMothEntity.this.world.playSound(null, SilkMothEntity.this.entrance, SoundEvents.BLOCK_BEEHIVE_ENTER, SoundCategory.BLOCKS, 1, 1); - SilkMothEntity.this.remove(); + BlockState state = SilkMothEntity.this.world.getBlockState(hivePos); + if (state.isOf(EndBlocks.SILK_MOTH_NEST)) { + int fullness = state.get(BlockProperties.FULLNESS); + if (fullness < 3 && SilkMothEntity.this.random.nextBoolean()) { + fullness ++; + BlocksHelper.setWithUpdate(SilkMothEntity.this.hiveWorld, SilkMothEntity.this.hivePos, state); + } + SilkMothEntity.this.world.playSound(null, SilkMothEntity.this.entrance, SoundEvents.BLOCK_BEEHIVE_ENTER, SoundCategory.BLOCKS, 1, 1); + SilkMothEntity.this.remove(); + } } } } diff --git a/src/main/java/ru/betterend/registry/EndEntities.java b/src/main/java/ru/betterend/registry/EndEntities.java index 3da97dc8..d89d2d46 100644 --- a/src/main/java/ru/betterend/registry/EndEntities.java +++ b/src/main/java/ru/betterend/registry/EndEntities.java @@ -36,6 +36,7 @@ public class EndEntities { SpawnHelper.restrictionWater(END_FISH, EndFishEntity::canSpawn); SpawnHelper.restrictionLand(SHADOW_WALKER, ShadowWalkerEntity::canSpawn); SpawnHelper.restrictionWater(CUBOZOA, CubozoaEntity::canSpawn); + SpawnHelper.restrictionAir(SILK_MOTH, SilkMothEntity::canSpawn); } protected static EntityType register(String name, SpawnGroup group, float width, float height, EntityFactory entity) { diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index f1fa80a4..da3e61c1 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -24,6 +24,7 @@ import ru.betterend.world.features.HydraluxFeature; import ru.betterend.world.features.LanceleafFeature; import ru.betterend.world.features.MengerSpongeFeature; import ru.betterend.world.features.OverworldIslandFeature; +import ru.betterend.world.features.SilkMothNestFeature; import ru.betterend.world.features.SingleInvertedScatterFeature; import ru.betterend.world.features.SinglePlantFeature; import ru.betterend.world.features.UnderwaterPlantFeature; @@ -155,6 +156,9 @@ public class EndFeatures { // Buildings public static final EndFeature CRASHED_SHIP = EndFeature.makeChansedFeature("crashed_ship", new CrashedShipFeature(), 500); + // Mobs + public static final EndFeature SILK_MOTH_NEST = EndFeature.makeChansedFeature("silk_moth_nest", new SilkMothNestFeature(), 2); + public static void registerBiomeFeatures(Identifier id, Biome biome, List>>> features) { if (GeneratorOptions.removeChorusFromVanillaBiomes()) { if (id.getNamespace().equals("minecraft")) { diff --git a/src/main/java/ru/betterend/world/biome/BiomeBlossomingSpires.java b/src/main/java/ru/betterend/world/biome/BiomeBlossomingSpires.java index 69aed399..08630fbf 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeBlossomingSpires.java +++ b/src/main/java/ru/betterend/world/biome/BiomeBlossomingSpires.java @@ -2,6 +2,7 @@ package ru.betterend.world.biome; import net.minecraft.entity.EntityType; import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; @@ -25,6 +26,8 @@ public class BiomeBlossomingSpires extends EndBiome { .addFeature(EndFeatures.BLOSSOM_BERRY) .addFeature(EndFeatures.TWISTED_MOSS) .addFeature(EndFeatures.TWISTED_MOSS_WOOD) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4)); + .addFeature(EndFeatures.SILK_MOTH_NEST) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4) + .addMobSpawn(EndEntities.SILK_MOTH, 5, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java b/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java new file mode 100644 index 00000000..a66d8862 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java @@ -0,0 +1,55 @@ +package ru.betterend.world.features; + +import java.util.Random; + +import net.minecraft.block.BlockState; +import net.minecraft.state.property.Properties; +import net.minecraft.tag.BlockTags; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.util.math.Direction; +import net.minecraft.world.Heightmap; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.blocks.BlockProperties; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.BlocksHelper; + +public class SilkMothNestFeature extends DefaultFeature { + private static final Mutable POS = new Mutable(); + + private boolean canGenerate(StructureWorldAccess world, BlockPos pos) { + BlockState state = world.getBlockState(pos.up()); + if (state.isIn(BlockTags.LEAVES) || state.isIn(BlockTags.LOGS)) { + state = world.getBlockState(pos); + if ((state.isAir() || state.isOf(EndBlocks.TENANEA_OUTER_LEAVES)) && world.isAir(pos.down())) { + for (Direction dir: BlocksHelper.HORIZONTAL) { + if (world.getBlockState(pos.down().offset(dir)).getMaterial().blocksMovement()) { + return false; + } + return true; + } + } + } + return false; + } + + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, DefaultFeatureConfig featureConfig) { + int maxY = world.getTopY(Heightmap.Type.WORLD_SURFACE, center.getX(), center.getZ()); + int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); + POS.set(center); + for (int y = maxY; y > minY; y--) { + POS.setY(y); + if (canGenerate(world, POS)) { + Direction dir = BlocksHelper.randomHorizontal(random); + BlocksHelper.setWithoutUpdate(world, POS, EndBlocks.SILK_MOTH_NEST.getDefaultState().with(Properties.HORIZONTAL_FACING, dir).with(BlockProperties.ACTIVE, false)); + POS.setY(y - 1); + BlocksHelper.setWithoutUpdate(world, POS, EndBlocks.SILK_MOTH_NEST.getDefaultState().with(Properties.HORIZONTAL_FACING, dir)); + return true; + } + } + return false; + } +} diff --git a/src/main/resources/assets/betterend/blockstates/silk_moth_nest.json b/src/main/resources/assets/betterend/blockstates/silk_moth_nest.json index 332f6ffc..41975436 100644 --- a/src/main/resources/assets/betterend/blockstates/silk_moth_nest.json +++ b/src/main/resources/assets/betterend/blockstates/silk_moth_nest.json @@ -1,9 +1,21 @@ { "variants": { "active=false": { "model": "betterend:block/silk_moth_nest_top" }, - "active=true,facing=north": { "model": "betterend:block/silk_moth_nest_bottom" }, - "active=true,facing=south": { "model": "betterend:block/silk_moth_nest_bottom", "y": 180 }, - "active=true,facing=east": { "model": "betterend:block/silk_moth_nest_bottom", "y": 90 }, - "active=true,facing=west": { "model": "betterend:block/silk_moth_nest_bottom", "y": 270 } + "active=true,facing=north,fullness=0": { "model": "betterend:block/silk_moth_nest_bottom" }, + "active=true,facing=south,fullness=0": { "model": "betterend:block/silk_moth_nest_bottom", "y": 180 }, + "active=true,facing=east,fullness=0": { "model": "betterend:block/silk_moth_nest_bottom", "y": 90 }, + "active=true,facing=west,fullness=0": { "model": "betterend:block/silk_moth_nest_bottom", "y": 270 }, + "active=true,facing=north,fullness=1": { "model": "betterend:block/silk_moth_nest_bottom" }, + "active=true,facing=south,fullness=1": { "model": "betterend:block/silk_moth_nest_bottom", "y": 180 }, + "active=true,facing=east,fullness=1": { "model": "betterend:block/silk_moth_nest_bottom", "y": 90 }, + "active=true,facing=west,fullness=1": { "model": "betterend:block/silk_moth_nest_bottom", "y": 270 }, + "active=true,facing=north,fullness=2": { "model": "betterend:block/silk_moth_nest_bottom" }, + "active=true,facing=south,fullness=2": { "model": "betterend:block/silk_moth_nest_bottom", "y": 180 }, + "active=true,facing=east,fullness=2": { "model": "betterend:block/silk_moth_nest_bottom", "y": 90 }, + "active=true,facing=west,fullness=2": { "model": "betterend:block/silk_moth_nest_bottom", "y": 270 }, + "active=true,facing=north,fullness=3": { "model": "betterend:block/silk_moth_nest_bottom_silk" }, + "active=true,facing=south,fullness=3": { "model": "betterend:block/silk_moth_nest_bottom_silk", "y": 180 }, + "active=true,facing=east,fullness=3": { "model": "betterend:block/silk_moth_nest_bottom_silk", "y": 90 }, + "active=true,facing=west,fullness=3": { "model": "betterend:block/silk_moth_nest_bottom_silk", "y": 270 } } } diff --git a/src/main/resources/assets/betterend/models/block/silk_moth_nest_bottom_silk.json b/src/main/resources/assets/betterend/models/block/silk_moth_nest_bottom_silk.json new file mode 100644 index 00000000..7635ef7e --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/silk_moth_nest_bottom_silk.json @@ -0,0 +1,37 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "betterend:block/silk_moth_nest_side", + "texture": "betterend:block/silk_moth_nest_side", + "top": "betterend:block/silk_moth_nest_top", + "front": "betterend:block/silk_moth_nest_front_silk" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 0, 0, 0 ], + "to": [ 16, 13, 16 ], + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#top", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" }, + "north": { "uv": [ 0, 3, 16, 16 ], "texture": "#front", "cullface": "north" }, + "south": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture", "cullface": "south" }, + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture", "cullface": "west" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture", "cullface": "east" } + } + }, + { + "__comment": "Box1", + "from": [ 3, 12, 3 ], + "to": [ 13, 16, 13 ], + "faces": { + "up": { "uv": [ 3, 3, 13, 13 ], "texture": "#top", "cullface": "up" }, + "north": { "uv": [ 3, 0, 13, 4 ], "texture": "#texture" }, + "south": { "uv": [ 3, 0, 13, 4 ], "texture": "#texture" }, + "west": { "uv": [ 3, 0, 13, 4 ], "texture": "#texture" }, + "east": { "uv": [ 3, 0, 13, 4 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/minimap/entities/cubozoa.png b/src/main/resources/assets/betterend/textures/minimap/entities/cubozoa.png new file mode 100644 index 0000000000000000000000000000000000000000..68b94dcc98e173be5fe7418983365af5786a9dc8 GIT binary patch literal 1814 zcmbVNZEO=|9KUVavEdvtKTHGeyv+r~>%H{#&UK?}$GS-O+GJZywq2il+FjP(op-mj zTjJ(evdsitG-43c1oAx(>pge< z{eS=e@Bh|UJKI|;%AYL9Fs!02;O|Cv+`Kke(6>G@@jJSeseyhS!!}l#R}psL-D(Vb zct#5K8GXUsJW%3RK~%!fnvAOmjbRNK7*oToOG*uOmnYRUaId z0uvhSnP?Azi4nkwL{lT)kmM0T92x?ijK^f1PkM+9FOSaVYl^@#5M#tccuj|RU$7JR zDH_BbRwoGPsB@zj1!e&*pD8+CbN6{?BvLr%~`nYTeNmABp^9+8d15Hv5Ns)1rQ3xxehKE3r zW+lYc0?Y3aM_WE2A2KEn~=It*J)keHs)DMGGlP zEMKV3ygc0JGYjL!xAjW0s3i35ci2F`U_cMS(kz2YMly~NZ9Gk9p+VFN zqF@O32UbKWGX9^?LVkIl5>vFGBBD5K1TF$TqG)je z`8@=ZZIvXEx7it%35yIV0w*A8&JIW}!U`lOiZ&+f0AV)(d3(PCM$J0q?Zy9T-=Rrp zxP;gP^PnO4OLv~dixlaodU|d|nuTcY6q6cFnP!-Fr^6m`3vMLS;Ut}QyA#P|93*62 zg3IRQ95fIbD03c=5uQC|iKu&f%ycOqkjx0ibAEf^ON9vVOk?r_FbB><0JGDeNaS8i z4_uKfZDJTA(tEUD7N#o^BOz$e8%5Q-pAM(;Imk+({;4vPsXI1F9*)+Nc`WQj^ibHW zP)6%iLwmDyuH`z06>)8TZ>TQ?)^Fc#O6@GJpDnT+ezbaY@kmMEhVApr!3t`dv6Mcy z(mU`&bJyGp@~MwPUme<7{7qx}@pC(Wd*m1qQ%}`Pi*NR9-aWIPB9|?Z zsh6*Bv{qi@0#|-K_2DM(z<}k6{;r>PO@F=^o$WZ|rngv1R$t%4jjgs$PjfZc*s=P8aK>at`N+!I!SmtEo7Yoy<&$6DnBRBvLhaJUEyZV5&N%+`W5s)y zPL#bUPZsYu+I11s&2@}(i{G{%_$<)bWPkQ>V(^_`*EYSjaOnN+(oc@tRzAhvTR1kk v+UlJvx79Y*d~of%?<;R=LnrzhKi-OAbxEn^p)@;U{&TgpwEK@W5AFFArtf0~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/minimap/entities/dragonfly.png b/src/main/resources/assets/betterend/textures/minimap/entities/dragonfly.png new file mode 100644 index 0000000000000000000000000000000000000000..c26c6f9ecdcc8a63073eb73c1960f75a3e1898cd GIT binary patch literal 1860 zcmbVN3v3f*9KX6j$LL@JhB6j*+$3nAy}Pz+>9JC_7HPveCX_Hxpx3)^>#??X+}&u` zjchn0AQ%Wf647K^ltd-IB2f%cK;~S838)DnWIU3Q4Frd>jPY>icU{{UgNj`8y?@{D z|NQ>9qpEUgUT#4yf*^Tbk9!3iQMKiahrN_Y48dW7;8`Of$i%5?(;)la)+0#vEzVyp zSNkd`hL0F&mJb4BJR(3ef|NSr0?pI`84ZG3F6zJr4KHqVITxX&aS9SdfJ~$DNH{7{aR-*F%B+CMY zQxyX(N#g zT9TJ+h8m@8dmvi!HwXY<0VKX&WWbWmP-1afF(JguycFX9!H&#v#u|ZgiGY@Q(a-bY zbfBuzEU3$+24(^J)M_ru@-gXYRZ!{vmvJRU^l-6kq{i zrfoq(4O>GP2#bX=1g(tSV71cffr$<-u%z$1d8S?sV){P&KkqLWIrxa^@T2o&f<(Fa zFfaOe7JAvNrf@QqC=VyWcr~OR#Y(U#H4AfSGJ7bRQ4`#OF=}K1i>0=?NA}DZZ7c*J z>A!?~3?}h4a*P&1SuOP9!(zWWmbKC1K^H(2d?kkG(_~OU9p4IN6TBc|#0)Y`_lE6Z79}~=;={T?kmlA%~Aq~)^?oqtkT9WH2&Upc^sbA+F3hZSMc88 z@UIt@tkV6*Hrk4sj!#>yLW1@MyJfVpfryTPHug2>cp(scdzDEezJ&rWl-07jc%IVog*Vx zxTF0)Z&M1UJRcaoVRP!O1;3ra^GetD9PK`FVx(==n_0o`TNicwhEe*piTlyK_UF1g zlo_)=9vIra)ALd*@_u4ZVfN;h{!e!+W&3t`7Y|r+_I#jqw-z4keYx%N>&T5C=IVwU z=DX)E%HQ(gAM>(Ad;1$FDi5yD-y-~2)OFyBsc&w1RbA-pndO1c-zq6`X^YIo>z0*Q zH45L3+n$B#M)bMe;puyCAiZ;V<+EJ#)^kTLjxvV|i%)uPe;+!yfw+cjM38rWIdHo1 Sn}L}6pYtxMbbnMHc;Qbun3enh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/minimap/entities/end_fish.png b/src/main/resources/assets/betterend/textures/minimap/entities/end_fish.png new file mode 100644 index 0000000000000000000000000000000000000000..6884a71d5b15014583e6dc1f9bd941d46ab0712c GIT binary patch literal 2040 zcmbVN4Qvx-7{2{NH_-*fYy)qG(+}b;OH`? zpZ9&2f2F?uIy~v*(!~mbdQTReKpSrScwCj8f76t5U3m)4c3GdHfqNbyewR6w+ReQK-6kGHeCydR=O)t zrxXUL*{7AwnCZu%Dn9h9O8JVKm|pfh%<(m5bsbrFewF1r$Ck%Bm=ZP>qrEO0}vT zgGz@}2+AqikdiDDEEo~xWP&n~T1p9^z^8C>ZMY^8T;K^%1A-u=DiBMhuyR0BB_$x; zhdTB6jsUQKBP2L5e8P-?j(1I2G72BWa|dWjIB9C>wN*r7e?5nkC6$ zs9O?5U)^0$vxl;>W-CjZ?|{Ot5jd6mPq4tVJ}DgJV9sKY^8-Q-`7tzAN!BUVNMRTl zs-qJs+-|lkq^Mko2W2ih2Gcf(qQEkYS@7{D68BQP4>tn1VmO$J&1bflDGHc4pJ`;j zOX6!abG7}$eJ)5m0SiHE^N?CB4G?{RYvzc&#F;g_n2*7JivCR#O@Kxh# zZfDh036Rmt(>|Iq^04B61&|h#*3gL_VM|2?x>uKcMHYY+ z$yJSrCfb7Kc&**-7_a#Z1T1-5yhlAADspmvBmf}k1I!%y7x^&c#mrGI1B=HtDmuiUKqx&=9T{HgRU7kj#1dGguJTZ6u7x=q`@ zEOK=2yM$buWPYjX*Vbc&Bwo~>5kI=1Vcv}1&Yn}wDPtPyt`_tv1KoQ%$=?MU}~3)89w zy0@Lx4>XDC_A`&%$g4Wh(*J$W>s3GK_l}wv8T=#jq@iSa+uH5LZynJWS+2kMsWi7_ zcR%OghB9@9L0;V6(AL*g_S)dqwyFWypZ)5r$pstBN4FzWnx9$Lm@`M&)W3Vr`bo2k zChk1knjKpm_3C23RG15T51qSq;b{BKg~yNOebqegQf9pKlXYLr?c0?R&#FX=uKsy` z{1eUm-tiljFi4iva(Ugrgt6&;j>fF+K55sw)8mY99^^v0_|h%E9XP$Yw6-Hpd<>~3 zTHAkG)mgM+vOYJyI14>=-un6PmFEkyyUu2iP5YLT`fg;;#Ez?vP8hq~;oMfTXGc4# zukINA(YOOQ0^U_`)82jNjpc>;mt$MlrXLZ6-MT-`=q&wE`!<)&EO)ics9O6sVoAR+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/minimap/entities/end_slime.png b/src/main/resources/assets/betterend/textures/minimap/entities/end_slime.png new file mode 100644 index 0000000000000000000000000000000000000000..ac9ab7e8566c4c344187eb41420f2998bbfc8556 GIT binary patch literal 2048 zcmbVNdr%a09A7|4QIbJ4hf3FFsPnP6xA%fwIRx*NLpf3&0r{w9_jj;yw|nd^+yNmf zPGT{o4MSstMIud(h&tLZh7(LaQX3yMj+$Bik=lb44IOn%?6=3=WsRA6Gkg2nz0dda z{eHf$Tem1DGbTDA8bOelEW0fi-cj`$9RKvbkVatJnmVi=Tuwa8dy%@@K7Oc?Z&^bI-P{!M9 zB#>8=lh4+avlNHTNkdb8G$e2Xg+YC8mmt$V3+Csg;aPo6V5lFWlv}V2)gfBsScFFy#}o)l@cUHQG`xU==C^6;BvK~Fg{$66N3ykAhQzhQFu{6RYs;ntW+!* zjC4eT+Y_P{5yyteJ(ZHnA2G)gzy;hu zP-KWDLk?hS9gYzEp|QB#A+)T_tAa8D33(`5&ad_WA{WSFrNn}HRnTLis>VZGCBP`6 zlrM^|V4)TT<)K!qT9_16Q^*UP=#{5GU;}K70xXzbrzc^_aMF}dCetP}Z8FW&8EBnu z1nPjTz%dH*cwmv^oz?#d4ds`%iY`%dh#ZW=fT0{qJ4MOOz+CWdrW6n!q0}FR!$D^W zvcd=~$g){5C|k?(99=>>*%Bwk;UonZTu&JpoFdK1xY-C;lOfq?HXHRpdz;8ss&xw5 zbN|!+C5eZ_#kiiB2M)nsx`QkkP>~F)CkIAkE>jvfx%f0yrWz&#ND}~53a)1XiF3(D zfK!~4!+{fuHv-0-!Z4|XIuFnY9XX8<5s&uh?^4>%s}WQO{N{m*Pz0#IF=>WX2hM`A zYNr7X3%ur^xFRF8-ZB75AJKjzFj;geUPb~LrLcOB)8Rxg2P0C5f2#Cn>VZuXgv0fu z9z%N(K7=+a5a2qM;NGlz@7x{)2~W(jW#kv_ztYnC&IB^{kXsyXZ&Q@!Rt?slk=dY0 z`C--NSh3G~ZQQ=7W2Sv!jnQw}Plm-sE^fX*U>bTh^~L7P*uihI%JAYJZ_-0`L&tpP zw2q5{G|IcbJ?Ugz*%+m3wr*p#cGtko&ktR#>WNxXP;m70rMh>Y9~YI7zwFGfwY?YS zSk|Rio%RjpC0aYB~0}3sqJV#I4 z+`r@HnSG1XFYKE1*?E___RQcd>xKkW!X~bbMt0h_^$#^&xmmMdb=~PdI_)us8#Rst z^$adU(*yH-S%|%s@>;D4UErh?z_GzHodQLQe5_yH{)|7 zj?eyNgJv_**HU;o<*E4EpYFNqZr!^s7OWaxnY+HBx$;O{v=8Y#vc7y_OvIhAh_hWU zICeLNhrd!0gGaV_SEhY`zoYPY=3vX$9dT=x3d@(j-Zn!Td!RTycT4x?h|!)8w`;DP zW5AS-uHLI%(PxvUqSP~Tt^4;CH2RCdcX(@3P2)$yrUP5ES7xofWCmFM-O8rnwyvX^ llfy~nWA=<1t_`n8PVBW+zdE&|QT>n3nwMkin)}-7KLHQ~)Y1R| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/minimap/entities/shadow_walker.png b/src/main/resources/assets/betterend/textures/minimap/entities/shadow_walker.png new file mode 100644 index 0000000000000000000000000000000000000000..56de0661ad600c71033acc6a25bed0e191a2c9a6 GIT binary patch literal 1619 zcmbVNTWl0n7@mqW7APX9k>bN-+6S=Ao|)O}j2&RvZS5MSwq;|Nm;kdgXLl#vnKRDJ zvKLW_l4u_^czHmhybvGSG&R*KF(Ps)m}t=_^##RZ2ogn8U890T&+KJl3@S3onRCvZ z?|lFLpRvJ#``VXuEFlP@J<%T@#xv=TTUznku2iacYBT${*#xn4l{;F9mtVPyAa4Fi zOQxKZv_(*m?vquNhQ5++Vl+YYY%H0wG723s4YQgdQa`-=K1FJ(NR0#~MlxeCr}bAX zxV18nR4StiuTmQ~kUb><6X?*9$&#KoY@sAlHC_R)-Oqp`YY=Btq@u1sG9?X?F=Rn9 z=nK&b8{o(=?_)y@&jr?#9K(hI69%lGW>|p<34WezJQS8@sTpB7-q(3faQ4}FdX1G8Y5`CY&dd>HtfzOLmb+QrJ0U~4ANzk)2QHx6xOtEf^K@W zhTU)zb{HthCSZMxYf=rUDjv=(SoxZ8RRJ&$b!a#?#?=GxS z!?tUp?PS@6U>Mq{U@5S77na!BRLsmF2iZCF4|aIRo;9Wrv!LuCD~V9P8K}V~3mJ>K zfr*f7M>Io4MSGnqsBs6zWe18B$8anT8O;WhY*+{~0>^bTet}`?Pzk4kDm(J^fsv|Z z%Kr&f6(NHxUB-^mbU6!wX=H2CBuPjZwj&z~OvFVBtLoDh;4A3b}5T(-AoPxZMkuKocgE2;67bo;HZ&+ea!{G3{R465l~zoP7mcWrp5bz%O~ zHs_{Sk5+y2Gml+}-nRQgc4#g)vw5z}rq5p4w=gPZ4{rz7+2ymuc{cje?JKHhcAuYR zKKcE<$nzZ+Td1|GyJob-udVs~^8DNP?6@;=EPQU$_`>6b=@%!yu1@g3JZ(P{`Rc%$ z?l)GCEIgSycG{19M z*O!;XgKr(WoHS35p{GvHT`@NudE}1nN4v=G`)9?W@AnQ)9@qBw9a#EJ%Z14^hZbE; fe1`2fz3SIRGvjI`v%P}<4g`_t9f(hD-uc9z-pU?9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/minimap/entities/silk_moth.png b/src/main/resources/assets/betterend/textures/minimap/entities/silk_moth.png new file mode 100644 index 0000000000000000000000000000000000000000..5dacaa25b900b7f919ea204387abf57075a2c281 GIT binary patch literal 1648 zcmbVNe`p(39KW_(*VeUA26h(5o|m#!>gC=gO_RLt8f(%nfu+_ovaUkin&-eHDo*5k2-`LRFz%Wc>Bpiy-8Q7z)mcGsD=`}jl>)}Ht!`!jM9#zasuk2)) zEx)SqVQV;g0LdidloXP{&Rj;PXolGr$mxytLGP4peiDJ&=ZAGJ&03k zc-p{2(*tpNdR+D^Y@i41%OOgT!IlJanY3o2oX8e<5nbD#c@`8P*0{*_+5*9FbPxoI zfq}=_#mPda3wZrbp$qz5o%aD36udn2@`9U#0)k!0?FXfYrP2%~iDIGtk}SFt*_37J zi08A}tTXF&5@U=P{C+$_Z^`U9c9Jz6tRezBL84V<+x&vj)Df3EMmk7NtXjP zSY`pipdA<=Xg{cG3dx%H+JZ`Va7ePS$hx3QpdsS~Ph9Y#P9O4gbwD?Qun3LPR8S;K zx-~FS)a2BELKPV$iII`0qtuKvhIw5ZD@cn*QA9H>Nt1CTB(hXhr>ZJQ@%rQ>Ovqd^ z30<7a(}_8s7t$P5+=84?e4a#?uY5m5}917(M_e3VU4yggZ8Ok9zEq{ zm?}pk)EghZC~s_T1}@%Tz2{g}?QGM|$)$XEe(P&je_r`;X=?4p%U{BK`XkMw$HZTIqfKLkGi z7Kq^E@ay|W>mJ|uy+s3c`R$jMk8ck8&yAcOeRjw4$sux~^XV61?+4HW#phAJ`Odl3 zrk>>Wjg@URZ@t?-a0&QlT4zS)+U2(HmZiI^wvXsDn?38T>H50B`Ri+ek5-`Po%!k? z8~Pu6q2`35Oq^YV&&77luD7<#e0^%qcNg0H;2YGuaPI8eO??Zq^Yvf6`lQw4c=+;D zUtLZubvUeR*S>f7)_*&B#kbNwo1gn6@&2KnpYjiFJAn?L*~Kv3M~y}OjZf$8e?p{h LAhhtn;iG>7PG2G` literal 0 HcmV?d00001 From f9d765bee8313c12717bc73d2991f8cc6672925e Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 15 Jan 2021 20:24:04 +0300 Subject: [PATCH 175/463] Fixes --- src/main/java/ru/betterend/blocks/SilkMothNestBlock.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java index f7e8cd62..cb3588e6 100644 --- a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java +++ b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java @@ -119,7 +119,7 @@ public class SilkMothNestBlock extends BaseBlock implements IRenderTypeable { if (!state.get(ACTIVE)) { return; } - if (random.nextInt(16) > 0) { + if (random.nextBoolean()) { return; } Direction dir = state.get(FACING); From 59167a18f7b5b5182a5c67599f5721934a377d68 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 16 Jan 2021 04:17:30 +0300 Subject: [PATCH 176/463] Some tree blocks (WIP) --- .../ru/betterend/blocks/BlockProperties.java | 1 + .../ru/betterend/blocks/CapsacisCapBlock.java | 35 ++++++++++++++++++ .../blocks/HelixTreeLeavesBlock.java | 2 +- .../betterend/blocks/JellyshroomCapBlock.java | 2 +- .../blocks/UmbrellaTreeMembraneBlock.java | 2 +- .../java/ru/betterend/registry/EndBlocks.java | 19 ++++++++++ .../textures/block/capsacis_cap_black.png | Bin 0 -> 469 bytes .../textures/block/capsacis_cap_magenta.png | Bin 0 -> 521 bytes .../textures/block/capsacis_cap_white.png | Bin 0 -> 526 bytes .../textures/block/capsacis_log_side.png | Bin 0 -> 1700 bytes .../textures/block/capsacis_log_top.png | Bin 0 -> 461 bytes .../textures/block/capsacis_planks.png | Bin 0 -> 2864 bytes .../block/capsacis_stripped_log_side.png | Bin 0 -> 432 bytes .../block/capsacis_stripped_log_top.png | Bin 0 -> 374 bytes 14 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/CapsacisCapBlock.java create mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_cap_black.png create mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_cap_magenta.png create mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_cap_white.png create mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_log_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_log_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_planks.png create mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_stripped_log_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_stripped_log_top.png diff --git a/src/main/java/ru/betterend/blocks/BlockProperties.java b/src/main/java/ru/betterend/blocks/BlockProperties.java index 27e13d36..4da42d5c 100644 --- a/src/main/java/ru/betterend/blocks/BlockProperties.java +++ b/src/main/java/ru/betterend/blocks/BlockProperties.java @@ -16,6 +16,7 @@ public class BlockProperties { public static final IntProperty ROTATION = IntProperty.of("rotation", 0, 3); public static final BooleanProperty NATURAL = BooleanProperty.of("natural"); public static final IntProperty FULLNESS = IntProperty.of("fullness", 0, 3); + public static final IntProperty COLOR = IntProperty.of("color", 0, 7); public static enum TripleShape implements StringIdentifiable { TOP("top"), diff --git a/src/main/java/ru/betterend/blocks/CapsacisCapBlock.java b/src/main/java/ru/betterend/blocks/CapsacisCapBlock.java new file mode 100644 index 00000000..18f2974a --- /dev/null +++ b/src/main/java/ru/betterend/blocks/CapsacisCapBlock.java @@ -0,0 +1,35 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.MaterialColor; +import net.minecraft.item.ItemPlacementContext; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.IntProperty; +import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.util.MHelper; + +public class CapsacisCapBlock extends BaseBlock { + public static final IntProperty COLOR = IntProperty.of("color", 0, 7); + private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); + + public CapsacisCapBlock(MaterialColor color) { + super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK).materialColor(color)); + } + + @Override + public BlockState getPlacementState(ItemPlacementContext ctx) { + double px = ctx.getBlockPos().getX() * 0.1; + double py = ctx.getBlockPos().getY() * 0.1; + double pz = ctx.getBlockPos().getZ() * 0.1; + return this.getDefaultState().with(COLOR, MHelper.floor(NOISE.eval(px, py, pz) * 3.5 + 4)); + } + + @Override + protected void appendProperties(StateManager.Builder stateManager) { + stateManager.add(COLOR); + } +} diff --git a/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java b/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java index fb299993..48e03300 100644 --- a/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java +++ b/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java @@ -30,7 +30,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; public class HelixTreeLeavesBlock extends BaseBlock implements IColorProvider { - public static final IntProperty COLOR = IntProperty.of("color", 0, 7); + public static final IntProperty COLOR = BlockProperties.COLOR; private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); public HelixTreeLeavesBlock() { diff --git a/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java b/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java index 482966fb..0812cfb4 100644 --- a/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java +++ b/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java @@ -30,7 +30,7 @@ import ru.betterend.patterns.Patterns; import ru.betterend.util.MHelper; public class JellyshroomCapBlock extends SlimeBlock implements IRenderTypeable, BlockPatterned, IColorProvider { - public static final IntProperty COLOR = IntProperty.of("color", 0, 7); + public static final IntProperty COLOR = BlockProperties.COLOR; private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); private final Vec3i colorStart; private final Vec3i colorEnd; diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java index 75075069..3fb85637 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java @@ -32,7 +32,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; public class UmbrellaTreeMembraneBlock extends SlimeBlock implements IRenderTypeable, BlockPatterned { - public static final IntProperty COLOR = IntProperty.of("color", 0, 7); + public static final IntProperty COLOR = BlockProperties.COLOR; private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); public UmbrellaTreeMembraneBlock() { diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 44050d9e..f29fbafc 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -20,6 +20,7 @@ import ru.betterend.blocks.BulbVineBlock; import ru.betterend.blocks.BulbVineLanternBlock; import ru.betterend.blocks.BulbVineLanternColoredBlock; import ru.betterend.blocks.BulbVineSeedBlock; +import ru.betterend.blocks.CapsacisCapBlock; import ru.betterend.blocks.CharniaBlock; import ru.betterend.blocks.ChorusGrassBlock; import ru.betterend.blocks.DenseEmeraldIceBlock; @@ -192,6 +193,24 @@ public class EndBlocks { public static final Block JELLYSHROOM_CAP_PURPLE = registerBlock("jellyshroom_cap_purple", new JellyshroomCapBlock(217, 142, 255, 164, 0, 255)); public static final WoodenMaterial JELLYSHROOM = new WoodenMaterial("jellyshroom", MaterialColor.PURPLE, MaterialColor.LIGHT_BLUE); + // Tree from original concept (+ modifications) + public static final Block CAPSACIS_SAPLING = registerBlock("capsacis_sapling", new UmbrellaTreeSaplingBlock()); + public static final Block CAPSACIS_CAP_BLACK = registerBlock("capsacis_cap_black", new CapsacisCapBlock(MaterialColor.BLACK)); + public static final Block CAPSACIS_CAP_WHITE = registerBlock("capsacis_cap_white", new CapsacisCapBlock(MaterialColor.WHITE)); + public static final Block CAPSACIS_CAP_MAGENTA = registerBlock("capsacis_cap_magenta", new CapsacisCapBlock(MaterialColor.MAGENTA)); + public static final WoodenMaterial CAPSACIS = new WoodenMaterial("capsacis", MaterialColor.PURPLE, MaterialColor.LIGHT_BLUE); + + // Small ecosystem tree + public static final WoodenMaterial INANIS = new WoodenMaterial("inanis", MaterialColor.PURPLE, MaterialColor.LIGHT_BLUE); + + // Tree from Yuki's ide + public static final Block CEMINUS_SAPLING = registerBlock("ceminus_sapling", new UmbrellaTreeSaplingBlock()); + public static final Block CEMINUS_GRID = registerBlock("ceminus_grid", new UmbrellaTreeMembraneBlock()); + public static final WoodenMaterial CEMINUS = new WoodenMaterial("ceminus", MaterialColor.PURPLE, MaterialColor.LIGHT_BLUE); + + // For megacolonies + public static final Block VOID_COLONY_MEMBRANE = registerBlock("void_colony_membrane", new UmbrellaTreeMembraneBlock()); + // Small Plants // public static final Block UMBRELLA_MOSS = registerBlock("umbrella_moss", new UmbrellaMossBlock()); public static final Block UMBRELLA_MOSS_TALL = registerBlock("umbrella_moss_tall", new UmbrellaMossTallBlock()); diff --git a/src/main/resources/assets/betterend/textures/block/capsacis_cap_black.png b/src/main/resources/assets/betterend/textures/block/capsacis_cap_black.png new file mode 100644 index 0000000000000000000000000000000000000000..5f0b2b6bdebf74a9b06b9561e214fab5bdcdc759 GIT binary patch literal 469 zcmV;`0V@89P)vo%x&HwVBY0}w=n-aF@cet=DlZCPp2p$4jon*k6RIDnbbdgpA7QG=?2 z0#&C)M?~1x^$CjPeL27wMPwidMX|WQB-)b+;Ol-TebA#5k+?Yupem>+zz6tR`?dja zwDY4rTUgx596-IKxy|$9%YWt178dt^E=1&fZYaJ!7K=nMvlrOwnsh1tCWg5!5JDl&V6$NBp*L^V40b_HE-Y`)40E>wg;T00000 LNkvXXu0mjf$eh@n literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/capsacis_cap_magenta.png b/src/main/resources/assets/betterend/textures/block/capsacis_cap_magenta.png new file mode 100644 index 0000000000000000000000000000000000000000..3dffd7a905c7af1280dbbd0584ac7499b0248e43 GIT binary patch literal 521 zcmV+k0`~ohP)-(-Q15Zg0jX%EAgpp#3sTHP&K{@nj{fI&v~de5hw zd9!~kz90e(EwfMT^+2HIY$t*QdKmy{vL^%~5V-n<4|`|v8AS=Sw9>NI1JNQgGmSKK z(gTn^(Ezm4@#z=N%LfZHhT%9n8lruos_gXuK=R0KGyn?=(XS|q;BON^`q_U1|@(e&HJ+n_-${7M=OBKAiHD@AMr?V$o=_p=U zeElB)OPQHGGkIS3U|Ul`DOQ*)Qz!%pm=}U*b-tC3t6eIyqdxKy4BWDJ|S?BLE-gfv$6Ctu?pXM6D|y=b=g4n0LL$d*AN7??@>TLc}?T z&RMwMAKpTUc<-M|9&mbh^e)4nr3Xy!uNHg>l|O7m)5S=5K~$RG4bni##)0&X<=G`Wy#c95h<jt8B2SX#N5K}3NNGu@wBVdY zNcUO1qD{XIg z8(|w;lINan z+pK}w<|?1i+#onbV(C+OS&T&lGB9{NCWjTBjk$;fFN@aZXNtfR5Tn6Gl$!$adafFG zLk-|176&OXb}L@$v@j0ZX|)&QR+=fL=u(QYku<~74%X(xlMjKUX<~q_@hnfuLOT}` zG7OcasAx25iP|hs3sQ{J>7-~YWwnwBLF!G4!N*8N&rdOUfG%i~YDiGQO-9}iBZiAW zn$DRZt7%$APr3;?jEeCp#aL+5qy$hD(l|Aug%iR>fdXM51I5r0mPuogmpCpBzbUOO zr_s7m(TFrk+ICa4?rTy3RReSw(F9P@h$QBx6jMXcfO-i2gB|JPv^6U0)&Orn%?DvP z6{zYI3+{HCfmwnV)=7#8qxxb~Q1TA&@CI-ZR@%y-kdchTN84DtleLu;p#@FPK{=EP zB5&}w28N;(X!=j6D6j#j$vkqDB=bQ)sY);*jpNu#MK^dw0F@pWfmF3flE?}+t4Py; zA)StrQZit*+ep97?k8=21_Wr@j?U+_MfW{Wh?qf4-53Ao{Z*QTiii*2K2JJGtQ&@* z#z7Hz*=DA2B9&OLq@#E>C5xgKY)G!c5}wE&mKV$fcM*aaSs)V0&(dvsW{x%*0*Lfq z!aWDmVZey;8YmAUFWyQxa7W=@Z@e&s-e;AlTafWBJwn z)%~G2d{XWalHG7-u;BZg^?~5TN5>u;9f$UGd|cQQ`=aZsGg*aLX7-&^c;1r2C-)xN6vrCZYX^ULd-i1f z#(`2j8tLP5GcL%dU+y^i`Ur=8^Tg^wq1&UM{e!7u_zLI z?D1Fnil3RcZ7qEN^Ud#Qhc^ZWf6aWjbEA;`V%yo@zFa)|*5swWzVWIP?HzeL_Vk?U ziZkqV@k8;ZBCV`-c%WnE(XsspJ{`P#@AHnY-*ejW^M4FZ_4ar+JMGm4?QmCiAb0Ee zu93{x?8eRSkRFu8BX*UJmVDkTZ+v W+Va+}7W%sRAE~UU@(euvLi?YITv0^; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/capsacis_log_top.png b/src/main/resources/assets/betterend/textures/block/capsacis_log_top.png new file mode 100644 index 0000000000000000000000000000000000000000..6ddad95076788ab556cb3c71bbb2a085792f4b6c GIT binary patch literal 461 zcmV;;0W$uHP)WyT5QV=;L&=g2$cCUGiFaLgUGxOK{}FP5!m%VvX2lVcE?m;G+n}={IGn-z!Q;cX z`s>Fk&DgIW33ae70M<_wX--{isdg3Jv5W84PfYL1!;h!$AFrE{WqF-Rjo@`=wJ!NJ zo&iXW+|0f726?U;Uj4}N=NkYfGndmCRFzrhxG?LCssgZUYWC{}Db^+Qmx0Iq69DQQ z06D80Mxi%!r#K_svBSU5n9QKg;TMSavVsg_%;lbdESsV1*+v;aq+OInyo(VIwk0{( z7XL?EKvAa@Wq}w$jKsxzCICsRLqrSBVC1ZGG%>JQO0a$+$&)Mfe^sC#&KpT-PEuu? zPnVbU1B0c>b+IL>H`~7u;9_Lo_Smz%$->g`YF8o7=?wy0-Cmk^FH4Nj9XsUYM$$qe zN{H}%YynJ`#Q;T_&R?ky-6=-+f0Y{HFtmvE699R+B4>ry88H%>0H1y+>nG&R^?Vr` zo~wppU0%QJ(9-Hao*1gRq~5&XoN}@w&MVeW^g8kzz!&E9%bVOn00000NkvXXu0mjf D?Izg> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/capsacis_planks.png b/src/main/resources/assets/betterend/textures/block/capsacis_planks.png new file mode 100644 index 0000000000000000000000000000000000000000..6d6aef0033d7c13531b1121f8bea9b9c09a9a314 GIT binary patch literal 2864 zcmcImYitx%6rS?1P@csQ(HIy95)hr8=g#g<7+TmZw&K>ZtYN_fxpU`EcVOq?%yf6# z7!yH!Bp4L@p@fGLq6r3yK|>5CCN*LVs3h>i_^3Y+{6V4^G(-*PoqY_&w6uzBc6J_n z?)lDl&Uen-7rQzin$~nr6G0HuI@(hie4ZH`lg8oSmtVgRK>51uY<=7MOIAwO$xOv03>ti zE;4Dmh>S)g8ge2}#u5=uViUahAjz{_jA3I8C(tY>vyv<%$l8a(Xs)Kqnbe9J7QR!c zyze_Q!<0&;NJ)s;Za2dv5($Ro8J?%H1?}}(J}A?cH^1&7g*@mQj&Il&8F&P$-Qz11 zjWb>ue0&|47#4rF)YXC zmBo&nbP@1vH*4F4dX>BCe92@osA`;Cw8pSByX4&;0M^!^6!4Kk@hs2MY>ejlEEkpW zSByTu3Np)9P1Ck!=)IvShowPtQkE65h0IAem}1Fkzz3rmYf#p0*916Wh6%b6<5=Ak z8J0m#+6CLiz&JXg5=A;KcUYbeEQmT%3WX^|3`3K7U4)_}a5Mm%h6#vq8t@vR1rG8O z%W}M`Y4!Cf8}X9tBqCkRWL^WFbdKqoPU!K?SrbLBOlL8dVc&&%&aj>jcp-r6aX0 zyXZ?ZbFyimb*lgF<82qu?QfhoarOk|_rF@sPnq}9=A(P~=Qd6Um%l!>VDdYkUo-oQ zr_{a2cIVb!>pT4R%GQRdXIsCwugqDs>&?9#zn*z&aPDdF!MA^~gQxo!Z{P9QstX6E zpZRRy;VsRVbH7D@SSYN#yL|4x8FMGkIRbK1Jyjf;r`sXZG{ z4HQe4y!^I(%Uf2wD!-6~GhBD2`_}Z=&@JCC7yHO(`V)My-_?0;&dp__3WF6EQ?YZwEi0hoa7WKG5O4;^g?>w~bmVrIglG^_oII+X*{a$ptn0C#g4)AYQ2b zT4B`QJTZi3;iPQ+{unBxl*X>6%-L{BEoIyV|-+MM)&^u+7K_KkWjOh5I|0ueR~bxjclUUicb1g_8MdKKJ ze3IC|-P-!`Ag7E@da=t;kTYg_Ng~BKUf_97ppEl%yHRp(1mZpOdLMVuEu7Jx_q;Bb ar~U`F;n<`AqmZ}&0000e;|l<(WnM*4RiZ|_ z5H+Hz0Q4`|N1q?S2ZyttN?Wr&Ey!MVzk z8Q06zWB^9H?OKb21ibgSahymuZMmurO53#r2?Pmtam@t4`XVBh%tl6yW@2WumT+(E z17!MnE%#>PBV-9BgVJQ@Dngz@RkgOkY@`l~)Uq&mZFop2Ena}T+ogGHS(#bLRb%09 zIXESxu5HKw#&KGDa6X=Fg#Uss831g$h7Ao#<2)ocCcwiF<-Moscl#*^*^mF=7g~>{ UXX639=l}o!07*qoM6N<$f~l&gApigX literal 0 HcmV?d00001 From cfba4b4822ebf22829b02d27c246d1a14df96911 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 16 Jan 2021 04:37:07 +0300 Subject: [PATCH 177/463] New biomes (WIP) --- .../ru/betterend/entity/SilkMothEntity.java | 2 +- .../java/ru/betterend/registry/EndBiomes.java | 4 ++++ .../world/biome/CapsacisForestBiome.java | 18 ++++++++++++++++++ .../world/biome/HangingGardensBiome.java | 18 ++++++++++++++++++ 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 src/main/java/ru/betterend/world/biome/CapsacisForestBiome.java create mode 100644 src/main/java/ru/betterend/world/biome/HangingGardensBiome.java diff --git a/src/main/java/ru/betterend/entity/SilkMothEntity.java b/src/main/java/ru/betterend/entity/SilkMothEntity.java index 75085238..f20237bf 100644 --- a/src/main/java/ru/betterend/entity/SilkMothEntity.java +++ b/src/main/java/ru/betterend/entity/SilkMothEntity.java @@ -35,9 +35,9 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryKey; +import net.minecraft.world.Heightmap.Type; import net.minecraft.world.ServerWorldAccess; import net.minecraft.world.World; -import net.minecraft.world.Heightmap.Type; import ru.betterend.BetterEnd; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.SilkMothNestBlock; diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index 90fe5c39..99f7f2c6 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -43,7 +43,9 @@ import ru.betterend.world.biome.BiomePaintedMountains; import ru.betterend.world.biome.BiomeShadowForest; import ru.betterend.world.biome.BiomeSulphurSprings; import ru.betterend.world.biome.BiomeUmbrellaJungle; +import ru.betterend.world.biome.CapsacisForestBiome; import ru.betterend.world.biome.EndBiome; +import ru.betterend.world.biome.HangingGardensBiome; import ru.betterend.world.generator.BELayerRandomSource; import ru.betterend.world.generator.BiomePicker; import ru.betterend.world.generator.BiomeType; @@ -83,6 +85,8 @@ public class EndBiomes { public static final EndBiome BLOSSOMING_SPIRES = registerBiome(new BiomeBlossomingSpires(), BiomeType.LAND); public static final EndBiome SULPHUR_SPRINGS = registerBiome(new BiomeSulphurSprings(), BiomeType.LAND); public static final EndBiome UMBRELLA_JUNGLE = registerBiome(new BiomeUmbrellaJungle(), BiomeType.LAND); + public static final EndBiome CAPSACIS_FOREST = registerBiome(new CapsacisForestBiome(), BiomeType.LAND); + public static final EndBiome HANGING_GARDENS = registerBiome(new HangingGardensBiome(), BiomeType.LAND); // Better End Void public static final EndBiome ICE_STARFIELD = registerBiome(new BiomeIceStarfield(), BiomeType.VOID); diff --git a/src/main/java/ru/betterend/world/biome/CapsacisForestBiome.java b/src/main/java/ru/betterend/world/biome/CapsacisForestBiome.java new file mode 100644 index 00000000..a01d1a38 --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/CapsacisForestBiome.java @@ -0,0 +1,18 @@ +package ru.betterend.world.biome; + +import net.minecraft.entity.EntityType; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndSounds; + +public class CapsacisForestBiome extends EndBiome { + public CapsacisForestBiome() { + super(new BiomeDefinition("capsacis_forest") + .setSurface(EndBlocks.SHADOW_GRASS, EndBlocks.CHORUS_NYLIUM) + .setMusic(EndSounds.MUSIC_FOREST) + .setWaterAndFogColor(84, 61, 127) + .setFoliageColor(71, 45, 120) + .setFogColor(78, 71, 92) + .setFogDensity(1.5F) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4)); + } +} diff --git a/src/main/java/ru/betterend/world/biome/HangingGardensBiome.java b/src/main/java/ru/betterend/world/biome/HangingGardensBiome.java new file mode 100644 index 00000000..3a6e2161 --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/HangingGardensBiome.java @@ -0,0 +1,18 @@ +package ru.betterend.world.biome; + +import net.minecraft.entity.EntityType; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndSounds; + +public class HangingGardensBiome extends EndBiome { + public HangingGardensBiome() { + super(new BiomeDefinition("hanging_gardens") + .setSurface(EndBlocks.SHADOW_GRASS, EndBlocks.CHORUS_NYLIUM) + .setMusic(EndSounds.MUSIC_FOREST) + .setWaterAndFogColor(84, 61, 127) + .setFoliageColor(71, 45, 120) + .setFogColor(78, 71, 92) + .setFogDensity(1.5F) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4)); + } +} \ No newline at end of file From 93673b46ef55cd5bf1bdab70fd6a2d207081e5f2 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 16 Jan 2021 06:37:44 +0300 Subject: [PATCH 178/463] Tree feature prototype --- .../java/ru/betterend/registry/EndBlocks.java | 2 +- .../ru/betterend/registry/EndFeatures.java | 5 + .../world/biome/CapsacisForestBiome.java | 2 + .../features/trees/CapsacisTreeFeature.java | 122 ++++++++++++++++++ ...ap_magenta.png => capsacis_cap_purple.png} | Bin 5 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 src/main/java/ru/betterend/world/features/trees/CapsacisTreeFeature.java rename src/main/resources/assets/betterend/textures/block/{capsacis_cap_magenta.png => capsacis_cap_purple.png} (100%) diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index f29fbafc..0d5f6ba9 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -197,7 +197,7 @@ public class EndBlocks { public static final Block CAPSACIS_SAPLING = registerBlock("capsacis_sapling", new UmbrellaTreeSaplingBlock()); public static final Block CAPSACIS_CAP_BLACK = registerBlock("capsacis_cap_black", new CapsacisCapBlock(MaterialColor.BLACK)); public static final Block CAPSACIS_CAP_WHITE = registerBlock("capsacis_cap_white", new CapsacisCapBlock(MaterialColor.WHITE)); - public static final Block CAPSACIS_CAP_MAGENTA = registerBlock("capsacis_cap_magenta", new CapsacisCapBlock(MaterialColor.MAGENTA)); + public static final Block CAPSACIS_CAP_PURPLE = registerBlock("capsacis_cap_purple", new CapsacisCapBlock(MaterialColor.MAGENTA)); public static final WoodenMaterial CAPSACIS = new WoodenMaterial("capsacis", MaterialColor.PURPLE, MaterialColor.LIGHT_BLUE); // Small ecosystem tree diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index da3e61c1..1a976641 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -43,6 +43,7 @@ import ru.betterend.world.features.terrain.SulphurHillFeature; import ru.betterend.world.features.terrain.SulphuricCaveFeature; import ru.betterend.world.features.terrain.SulphuricLakeFeature; import ru.betterend.world.features.terrain.SurfaceVentFeature; +import ru.betterend.world.features.trees.CapsacisTreeFeature; import ru.betterend.world.features.trees.DragonTreeFeature; import ru.betterend.world.features.trees.HelixTreeFeature; import ru.betterend.world.features.trees.JellyshroomFeature; @@ -63,6 +64,10 @@ public class EndFeatures { public static final EndFeature HELIX_TREE = new EndFeature("helix_tree", new HelixTreeFeature(), 2); public static final EndFeature UMBRELLA_TREE = new EndFeature("umbrella_tree", new UmbrellaTreeFeature(), 4); public static final EndFeature JELLYSHROOM = new EndFeature("jellyshroom", new JellyshroomFeature(), 3); + public static final EndFeature CAPSACIS = new EndFeature("capsacis", new CapsacisTreeFeature((random) -> { + int state = random.nextInt(3); + return state == 0 ? EndBlocks.CAPSACIS_CAP_BLACK.getDefaultState() : state == 1 ? EndBlocks.CAPSACIS_CAP_PURPLE.getDefaultState() : EndBlocks.CAPSACIS_CAP_WHITE.getDefaultState(); + }), 1); // Bushes // public static final EndFeature PYTHADENDRON_BUSH = new EndFeature("pythadendron_bush", new BushFeature(EndBlocks.PYTHADENDRON_LEAVES, EndBlocks.PYTHADENDRON.bark), 4); diff --git a/src/main/java/ru/betterend/world/biome/CapsacisForestBiome.java b/src/main/java/ru/betterend/world/biome/CapsacisForestBiome.java index a01d1a38..4c7394ab 100644 --- a/src/main/java/ru/betterend/world/biome/CapsacisForestBiome.java +++ b/src/main/java/ru/betterend/world/biome/CapsacisForestBiome.java @@ -2,6 +2,7 @@ package ru.betterend.world.biome; import net.minecraft.entity.EntityType; import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; public class CapsacisForestBiome extends EndBiome { @@ -13,6 +14,7 @@ public class CapsacisForestBiome extends EndBiome { .setFoliageColor(71, 45, 120) .setFogColor(78, 71, 92) .setFogDensity(1.5F) + .addFeature(EndFeatures.CAPSACIS) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4)); } } diff --git a/src/main/java/ru/betterend/world/features/trees/CapsacisTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/CapsacisTreeFeature.java new file mode 100644 index 00000000..16a4c7c3 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/trees/CapsacisTreeFeature.java @@ -0,0 +1,122 @@ +package ru.betterend.world.features.trees; + +import java.util.List; +import java.util.Random; + +import com.google.common.base.Function; +import com.google.common.collect.Lists; + +import net.minecraft.block.BlockState; +import net.minecraft.client.util.math.Vector3f; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.MHelper; +import ru.betterend.util.SplineHelper; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFFlatWave; +import ru.betterend.util.sdf.operator.SDFScale; +import ru.betterend.util.sdf.operator.SDFSmoothUnion; +import ru.betterend.util.sdf.operator.SDFTranslate; +import ru.betterend.util.sdf.operator.SDFUnion; +import ru.betterend.util.sdf.primitive.SDFCappedCone; +import ru.betterend.util.sdf.primitive.SDFSphere; +import ru.betterend.world.features.DefaultFeature; + +public class CapsacisTreeFeature extends DefaultFeature { + private static final Function REPLACE; + private static final List ROOT; + + private final Function capFunction; + + public CapsacisTreeFeature(Function capFunction) { + this.capFunction = capFunction; + } + + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; + + int height = MHelper.randRange(20, 30, random); + List spline = SplineHelper.makeSpline(0, 0, 0, 0, height * 0.2F, 0, 5); + + BlockPos center = pos.up(9); + if (!SplineHelper.canGenerate(spline, center, world, REPLACE)) { + return false; + } + + BlockState woodState = EndBlocks.CAPSACIS.bark.getDefaultState(); + BlockState logState = EndBlocks.CAPSACIS.log.getDefaultState(); + BlockState capState = capFunction.apply(random); + + SplineHelper.offsetParts(spline, random, 0.5F, 0, 0.5F); + SDF sdf = SplineHelper.buildSDF(spline, 2.5F, 0.8F, (bpos) -> { + return woodState; + }); + + SDF cap = makeCap(height * 0.2F, height * 0.1F, random, capState); + + sdf = new SDFUnion().setSourceA(sdf).setSourceB(cap); + makeRoots(world, center, height * 0.4F, random, woodState); + sdf.addPostProcess((info) -> { + if (EndBlocks.CAPSACIS.isTreeLog(info.getStateUp()) && EndBlocks.CAPSACIS.isTreeLog(info.getStateDown())) { + return logState; + } + return info.getState(); + }).fillRecursive(world, center); + + return true; + } + + private SDF makeCap(float offset, float radius, Random random, BlockState capState) { + float angle = random.nextFloat() * MHelper.PI2; + int count = MHelper.randRange(5, 7, random); + SDF cap = new SDFSphere().setRadius(radius).setBlock(capState); + SDF cone = new SDFCappedCone().setRadius1(radius).setRadius2(radius * 0.4F).setHeight(radius * 0.3F).setBlock(capState); + cone = new SDFTranslate().setTranslate(0, radius * 0.3F, 0).setSource(cone); + cap = new SDFSmoothUnion().setRadius(5).setSourceA(cap).setSourceB(cone); + SDF upperSphere = new SDFSphere().setRadius(radius * 0.4F).setBlock(capState); + upperSphere = new SDFTranslate().setTranslate(0, radius * 0.3F, 0).setSource(upperSphere); + cap = new SDFSmoothUnion().setRadius(5).setSourceA(cap).setSourceB(upperSphere); + cap = new SDFFlatWave().setAngle(angle).setRaysCount(count).setIntensity(1F).setSource(cap); + + cap = new SDFTranslate().setTranslate(0, offset, 0).setSource(cap); + + return cap; + } + + private void makeRoots(StructureWorldAccess world, BlockPos pos, float radius, Random random, BlockState state) { + int count = (int) (radius); + for (int i = 0; i < count; i++) { + float angle = (float) i / (float) count * MHelper.PI2; + float scale = radius * MHelper.randRange(0.85F, 1.15F, random); + + List branch = SplineHelper.copySpline(ROOT); + SplineHelper.rotateSpline(branch, angle); + SplineHelper.scale(branch, scale); + SplineHelper.offsetParts(branch, random, 0.5F, 0.7F, 0.5F); + Vector3f last = branch.get(branch.size() - 1); + if (world.getBlockState(pos.add(last.getX(), last.getY(), last.getZ())).isIn(EndTags.GEN_TERRAIN)) { + SplineHelper.fillSpline(branch, world, state, pos, REPLACE); + } + } + } + + static { + REPLACE = (state) -> { + return EndBlocks.CAPSACIS.isTreeLog(state) || state.getMaterial().isReplaceable(); + }; + + ROOT = Lists.newArrayList( + new Vector3f(0F, 1F, 0), + new Vector3f(0.1F, 0.7F, 0), + new Vector3f(0.3F, 0.3F, 0), + new Vector3f(0.7F, 0.05F, 0), + new Vector3f(0.8F, -0.2F, 0) + ); + SplineHelper.offset(ROOT, Vector3f.NEGATIVE_Y); + } +} diff --git a/src/main/resources/assets/betterend/textures/block/capsacis_cap_magenta.png b/src/main/resources/assets/betterend/textures/block/capsacis_cap_purple.png similarity index 100% rename from src/main/resources/assets/betterend/textures/block/capsacis_cap_magenta.png rename to src/main/resources/assets/betterend/textures/block/capsacis_cap_purple.png From ba68f1fe4ff73d81413e10b408d6ba0f78e6de4a Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 16 Jan 2021 06:45:06 +0300 Subject: [PATCH 179/463] Fixes --- .../betterend/world/features/trees/CapsacisTreeFeature.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/betterend/world/features/trees/CapsacisTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/CapsacisTreeFeature.java index 16a4c7c3..fcf88690 100644 --- a/src/main/java/ru/betterend/world/features/trees/CapsacisTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/CapsacisTreeFeature.java @@ -18,7 +18,6 @@ import ru.betterend.util.MHelper; import ru.betterend.util.SplineHelper; import ru.betterend.util.sdf.SDF; import ru.betterend.util.sdf.operator.SDFFlatWave; -import ru.betterend.util.sdf.operator.SDFScale; import ru.betterend.util.sdf.operator.SDFSmoothUnion; import ru.betterend.util.sdf.operator.SDFTranslate; import ru.betterend.util.sdf.operator.SDFUnion; @@ -57,7 +56,7 @@ public class CapsacisTreeFeature extends DefaultFeature { return woodState; }); - SDF cap = makeCap(height * 0.2F, height * 0.1F, random, capState); + SDF cap = makeCap(height * 0.2F, height * 0.25F, random, capState); sdf = new SDFUnion().setSourceA(sdf).setSourceB(cap); makeRoots(world, center, height * 0.4F, random, woodState); @@ -79,7 +78,7 @@ public class CapsacisTreeFeature extends DefaultFeature { cone = new SDFTranslate().setTranslate(0, radius * 0.3F, 0).setSource(cone); cap = new SDFSmoothUnion().setRadius(5).setSourceA(cap).setSourceB(cone); SDF upperSphere = new SDFSphere().setRadius(radius * 0.4F).setBlock(capState); - upperSphere = new SDFTranslate().setTranslate(0, radius * 0.3F, 0).setSource(upperSphere); + upperSphere = new SDFTranslate().setTranslate(0, radius * 0.6F, 0).setSource(upperSphere); cap = new SDFSmoothUnion().setRadius(5).setSourceA(cap).setSourceB(upperSphere); cap = new SDFFlatWave().setAngle(angle).setRaysCount(count).setIntensity(1F).setSource(cap); From c3277e7a2e933a985d450d64e7c71037ee6b9dff Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 16 Jan 2021 18:23:00 +0300 Subject: [PATCH 180/463] Silk fiber --- .../ru/betterend/entity/SilkMothEntity.java | 23 ++++++++++++++++++ .../ru/betterend/recipe/CraftingRecipes.java | 2 ++ .../java/ru/betterend/registry/EndBiomes.java | 3 +-- .../java/ru/betterend/registry/EndBlocks.java | 10 ++++---- .../java/ru/betterend/registry/EndItems.java | 1 + .../betterend/textures/item/silk_fiber.png | Bin 0 -> 395 bytes 6 files changed, 32 insertions(+), 7 deletions(-) create mode 100644 src/main/resources/assets/betterend/textures/item/silk_fiber.png diff --git a/src/main/java/ru/betterend/entity/SilkMothEntity.java b/src/main/java/ru/betterend/entity/SilkMothEntity.java index f20237bf..96ee96f7 100644 --- a/src/main/java/ru/betterend/entity/SilkMothEntity.java +++ b/src/main/java/ru/betterend/entity/SilkMothEntity.java @@ -6,8 +6,10 @@ import java.util.Random; import org.jetbrains.annotations.Nullable; import net.minecraft.block.BlockState; +import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.EntityType; import net.minecraft.entity.Flutterer; +import net.minecraft.entity.ItemEntity; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.SpawnReason; import net.minecraft.entity.ai.TargetFinder; @@ -22,9 +24,11 @@ import net.minecraft.entity.ai.pathing.EntityNavigation; import net.minecraft.entity.ai.pathing.PathNodeType; import net.minecraft.entity.attribute.DefaultAttributeContainer; import net.minecraft.entity.attribute.EntityAttributes; +import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.mob.MobEntity; import net.minecraft.entity.passive.AnimalEntity; import net.minecraft.entity.passive.PassiveEntity; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtHelper; import net.minecraft.server.world.ServerWorld; @@ -43,7 +47,9 @@ import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.SilkMothNestBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; +import ru.betterend.registry.EndItems; import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; public class SilkMothEntity extends AnimalEntity implements Flutterer { private BlockPos hivePos; @@ -152,6 +158,23 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { return EndEntities.SILK_MOTH.create(world); } + @Override + protected void dropLoot(DamageSource source, boolean causedByPlayer) { + int minCount = 0; + int maxCount = 1; + if (causedByPlayer && this.attackingPlayer != null) { + int looting = EnchantmentHelper.getLooting(this.attackingPlayer); + minCount += looting; + maxCount += looting; + if (maxCount > 2) { + maxCount = 2; + } + } + int count = minCount < maxCount ? MHelper.randRange(minCount, maxCount, random) : maxCount; + ItemEntity drop = new ItemEntity(world, getX(), getY(), getZ(), new ItemStack(EndItems.SILK_FIBER, count)); + this.world.spawnEntity(drop); + } + public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { int y = world.getChunk(pos).sampleHeightmap(Type.WORLD_SURFACE, pos.getX() & 15, pos.getY() & 15); return y > 0 && pos.getY() >= y; diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index 791ea368..d4c236fb 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -187,6 +187,8 @@ public class CraftingRecipes { .addMaterial('S', Items.STICK) .addMaterial('L', EndItems.LEATHER_STRIPE) .build(); + + GridRecipe.make("fiber_string", Items.STRING).setOutputCount(6).setShape("#", "#", "#").addMaterial('#', EndItems.SILK_FIBER).build(); } private static void registerLantern(String name, Block lantern, Block slab) { diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index 99f7f2c6..8fd56735 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -45,7 +45,6 @@ import ru.betterend.world.biome.BiomeSulphurSprings; import ru.betterend.world.biome.BiomeUmbrellaJungle; import ru.betterend.world.biome.CapsacisForestBiome; import ru.betterend.world.biome.EndBiome; -import ru.betterend.world.biome.HangingGardensBiome; import ru.betterend.world.generator.BELayerRandomSource; import ru.betterend.world.generator.BiomePicker; import ru.betterend.world.generator.BiomeType; @@ -86,7 +85,7 @@ public class EndBiomes { public static final EndBiome SULPHUR_SPRINGS = registerBiome(new BiomeSulphurSprings(), BiomeType.LAND); public static final EndBiome UMBRELLA_JUNGLE = registerBiome(new BiomeUmbrellaJungle(), BiomeType.LAND); public static final EndBiome CAPSACIS_FOREST = registerBiome(new CapsacisForestBiome(), BiomeType.LAND); - public static final EndBiome HANGING_GARDENS = registerBiome(new HangingGardensBiome(), BiomeType.LAND); + //public static final EndBiome HANGING_GARDENS = registerBiome(new HangingGardensBiome(), BiomeType.LAND); // Better End Void public static final EndBiome ICE_STARFIELD = registerBiome(new BiomeIceStarfield(), BiomeType.VOID); diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 0d5f6ba9..b358dfb4 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -201,15 +201,15 @@ public class EndBlocks { public static final WoodenMaterial CAPSACIS = new WoodenMaterial("capsacis", MaterialColor.PURPLE, MaterialColor.LIGHT_BLUE); // Small ecosystem tree - public static final WoodenMaterial INANIS = new WoodenMaterial("inanis", MaterialColor.PURPLE, MaterialColor.LIGHT_BLUE); + //public static final WoodenMaterial INANIS = new WoodenMaterial("inanis", MaterialColor.PURPLE, MaterialColor.LIGHT_BLUE); // Tree from Yuki's ide - public static final Block CEMINUS_SAPLING = registerBlock("ceminus_sapling", new UmbrellaTreeSaplingBlock()); - public static final Block CEMINUS_GRID = registerBlock("ceminus_grid", new UmbrellaTreeMembraneBlock()); - public static final WoodenMaterial CEMINUS = new WoodenMaterial("ceminus", MaterialColor.PURPLE, MaterialColor.LIGHT_BLUE); + //public static final Block CEMINUS_SAPLING = registerBlock("ceminus_sapling", new UmbrellaTreeSaplingBlock()); + //public static final Block CEMINUS_GRID = registerBlock("ceminus_grid", new UmbrellaTreeMembraneBlock()); + //public static final WoodenMaterial CEMINUS = new WoodenMaterial("ceminus", MaterialColor.PURPLE, MaterialColor.LIGHT_BLUE); // For megacolonies - public static final Block VOID_COLONY_MEMBRANE = registerBlock("void_colony_membrane", new UmbrellaTreeMembraneBlock()); + //public static final Block VOID_COLONY_MEMBRANE = registerBlock("void_colony_membrane", new UmbrellaTreeMembraneBlock()); // Small Plants // public static final Block UMBRELLA_MOSS = registerBlock("umbrella_moss", new UmbrellaMossBlock()); diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index cc72a360..9c3c64dd 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -70,6 +70,7 @@ public class EndItems { public final static Item ENCHANTED_PETAL = registerItem("enchanted_petal", new EnchantedPetalItem()); public final static Item LEATHER_STRIPE = registerItem("leather_stripe"); public final static Item LEATHER_WRAPPED_STICK = registerItem("leather_wrapped_stick"); + public final static Item SILK_FIBER = registerItem("silk_fiber"); // Armor // public static final Item TERMINITE_HELMET = registerItem("terminite_helmet", new ArmorItem(EndArmorMaterial.TERMINITE, EquipmentSlot.HEAD, makeItemSettings())); diff --git a/src/main/resources/assets/betterend/textures/item/silk_fiber.png b/src/main/resources/assets/betterend/textures/item/silk_fiber.png new file mode 100644 index 0000000000000000000000000000000000000000..06bf85f0848bc45efe192ff6b19008b8eb255a02 GIT binary patch literal 395 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc4GNwvjv*HQ$r8UB1icO)JmY!!pYu$fmz9wc zpA0_y|6kAM=H?c{>@Z7psjB3XB`Fei^*_%Py#B?zp&}|zEkJiwqy(Enw%BBm_AVoX zJ9}%{^8_|^2k>O9&;7GLcLDqLKd*jzZ{V(|ta#XVkf%wK$+&@2hnw}ptf`@)2Wlp` zO_1ow&&lc%a#LtXV(@slIoA>D&5rk6%vkac9PgjMK!>AYC)1LThi-1> z*}XlNxw>(Bzx*mDrUPstX4j4FcK&a8`0HzSg5!qV`F4kL_f|a=ija|R*v*i};bC}2 zK|(-Clr>pTE^ouZ6AY$B3mHVT6{6e%8yn}(=YI#ZYXYmn=?!WsB@D(Kk_{%!88aAD km?tnQGzj%BVP<1v(9KxDxmPH+5Ey_Ap00i_>zopr0Kt`yW&i*H literal 0 HcmV?d00001 From d050e8089fe90bcdb87003724ee04ba4121a3d06 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sat, 16 Jan 2021 22:48:05 +0300 Subject: [PATCH 181/463] End Stone Smelter slots fix --- .../entities/EndStoneSmelterBlockEntity.java | 64 ++++++------------- 1 file changed, 21 insertions(+), 43 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java index ae764e76..8a8b75ca 100644 --- a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java @@ -1,15 +1,9 @@ package ru.betterend.blocks.entities; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - import com.google.common.collect.Lists; import com.google.common.collect.Maps; - import it.unimi.dsi.fastutil.objects.Object2IntMap.Entry; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; -import it.unimi.dsi.fastutil.objects.ObjectIterator; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.entity.LockableContainerBlockEntity; @@ -23,15 +17,9 @@ import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.nbt.CompoundTag; -import net.minecraft.recipe.BlastingRecipe; -import net.minecraft.recipe.Recipe; -import net.minecraft.recipe.RecipeFinder; -import net.minecraft.recipe.RecipeInputProvider; -import net.minecraft.recipe.RecipeType; -import net.minecraft.recipe.RecipeUnlocker; +import net.minecraft.recipe.*; import net.minecraft.screen.PropertyDelegate; import net.minecraft.screen.ScreenHandler; -import net.minecraft.tag.Tag; import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; import net.minecraft.util.Identifier; @@ -47,11 +35,15 @@ import ru.betterend.client.gui.EndStoneSmelterScreenHandler; import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.registry.EndBlockEntities; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity implements SidedInventory, RecipeUnlocker, RecipeInputProvider, Tickable { private static final int[] TOP_SLOTS = new int[] { 0, 1 }; private static final int[] BOTTOM_SLOTS = new int[] { 2, 3 }; - private static final int[] SIDE_SLOTS = new int[] { 3 }; + private static final int[] SIDE_SLOTS = new int[] { 1, 2 }; private static final Map AVAILABLE_FUELS = Maps.newHashMap(); private final Object2IntOpenHashMap recipesUsed; @@ -66,7 +58,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp public EndStoneSmelterBlockEntity() { super(EndBlockEntities.END_STONE_SMELTER); this.inventory = DefaultedList.ofSize(4, ItemStack.EMPTY); - this.recipesUsed = new Object2IntOpenHashMap(); + this.recipesUsed = new Object2IntOpenHashMap<>(); this.propertyDelegate = new PropertyDelegate() { public int get(int index) { switch(index) { @@ -167,6 +159,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp } protected int getSmeltTime() { + assert this.world != null; int smeltTime = this.world.getRecipeManager().getFirstMatch(AlloyingRecipe.TYPE, this, world) .map(AlloyingRecipe::getSmeltTime).orElse(0); if (smeltTime == 0) { @@ -178,10 +171,9 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp } public void dropExperience(PlayerEntity player) { + assert world != null; List> list = Lists.newArrayList(); - ObjectIterator> usedRecipes = this.recipesUsed.object2IntEntrySet().iterator(); - while(usedRecipes.hasNext()) { - Entry entry = usedRecipes.next(); + for (Entry entry : this.recipesUsed.object2IntEntrySet()) { world.getRecipeManager().get(entry.getKey()).ifPresent((recipe) -> { list.add(recipe); if (recipe instanceof AlloyingRecipe) { @@ -213,6 +205,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp @Override public boolean canPlayerUse(PlayerEntity player) { + assert this.world != null; if (this.world.getBlockEntity(this.pos) != this) { return false; } else { @@ -243,10 +236,11 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp } boolean burning = this.isBurning(); + assert this.world != null; if (!this.world.isClient) { ItemStack fuel = this.inventory.get(2); if (!burning && (fuel.isEmpty() || inventory.get(0).isEmpty() && inventory.get(1).isEmpty())) { - if (!burning && smeltTime > 0) { + if (smeltTime > 0) { this.smeltTime = MathHelper.clamp(smeltTime - 2, 0, smeltTimeTotal); } } else { @@ -294,7 +288,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp protected boolean canAcceptRecipeOutput(Recipe recipe) { if (recipe == null) return false; - boolean validInput = false; + boolean validInput; if (recipe instanceof AlloyingRecipe) { validInput = !inventory.get(0).isEmpty() && !inventory.get(1).isEmpty(); @@ -336,6 +330,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp output.increment(result.getCount()); } + assert this.world != null; if (!this.world.isClient) { this.setLastRecipe(recipe); } @@ -354,9 +349,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp @Override public void provideRecipeInputs(RecipeFinder finder) { - Iterator inventory = this.inventory.iterator(); - while(inventory.hasNext()) { - ItemStack itemStack = inventory.next(); + for (ItemStack itemStack : this.inventory) { finder.addItem(itemStack); } } @@ -392,9 +385,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp @Override public boolean canExtract(int slot, ItemStack stack, Direction dir) { if (dir == Direction.DOWN && slot == 2) { - if (stack.getItem() != Items.BUCKET) { - return false; - } + return stack.getItem() == Items.BUCKET; } return true; } @@ -418,9 +409,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp this.smeltTime = tag.getShort("SmeltTime"); this.smeltTimeTotal = tag.getShort("SmeltTimeTotal"); CompoundTag compoundTag = tag.getCompound("RecipesUsed"); - Iterator recipes = compoundTag.getKeys().iterator(); - while(recipes.hasNext()) { - String id = recipes.next(); + for (String id : compoundTag.getKeys()) { this.recipesUsed.put(new Identifier(id), compoundTag.getInt(id)); } } @@ -434,9 +423,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp tag.putShort("SmeltTimeTotal", (short) smeltTimeTotal); Inventories.toTag(tag, inventory); CompoundTag usedRecipes = new CompoundTag(); - this.recipesUsed.forEach((identifier, integer) -> { - usedRecipes.putInt(identifier.toString(), integer); - }); + this.recipesUsed.forEach((identifier, integer) -> usedRecipes.putInt(identifier.toString(), integer)); tag.put("RecipesUsed", usedRecipes); return tag; @@ -445,7 +432,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp public boolean isValid(int slot, ItemStack stack) { if (slot == 3) { return false; - } else if (slot != 0 || slot != 1) { + } else if (slot == 0 || slot == 1) { return true; } else { ItemStack itemStack = this.inventory.get(2); @@ -458,16 +445,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp } public static void registerFuel(ItemConvertible fuel, int time) { - if (AVAILABLE_FUELS.containsKey(fuel)) { - AVAILABLE_FUELS.replace(fuel.asItem(), time); - } else { - AVAILABLE_FUELS.put(fuel.asItem(), time); - } - } - - public static void registerFuel(Tag tag, int time) { - Iterator tagItems = tag.values().iterator(); - tagItems.forEachRemaining(item -> registerFuel(item, time)); + AVAILABLE_FUELS.put(fuel.asItem(), time); } public static Map availableFuels() { From e991a8a23ad5c7ef65c3522f69facc2a38596cdd Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sat, 16 Jan 2021 22:48:05 +0300 Subject: [PATCH 182/463] End Stone Smelter slots fix --- .../entities/EndStoneSmelterBlockEntity.java | 107 +++++++----------- 1 file changed, 40 insertions(+), 67 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java index ae764e76..54b3fcc1 100644 --- a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java @@ -1,15 +1,9 @@ package ru.betterend.blocks.entities; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - import com.google.common.collect.Lists; import com.google.common.collect.Maps; - import it.unimi.dsi.fastutil.objects.Object2IntMap.Entry; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; -import it.unimi.dsi.fastutil.objects.ObjectIterator; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.entity.LockableContainerBlockEntity; @@ -23,15 +17,9 @@ import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.nbt.CompoundTag; -import net.minecraft.recipe.BlastingRecipe; -import net.minecraft.recipe.Recipe; -import net.minecraft.recipe.RecipeFinder; -import net.minecraft.recipe.RecipeInputProvider; -import net.minecraft.recipe.RecipeType; -import net.minecraft.recipe.RecipeUnlocker; +import net.minecraft.recipe.*; import net.minecraft.screen.PropertyDelegate; import net.minecraft.screen.ScreenHandler; -import net.minecraft.tag.Tag; import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; import net.minecraft.util.Identifier; @@ -47,11 +35,15 @@ import ru.betterend.client.gui.EndStoneSmelterScreenHandler; import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.registry.EndBlockEntities; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity implements SidedInventory, RecipeUnlocker, RecipeInputProvider, Tickable { private static final int[] TOP_SLOTS = new int[] { 0, 1 }; private static final int[] BOTTOM_SLOTS = new int[] { 2, 3 }; - private static final int[] SIDE_SLOTS = new int[] { 3 }; + private static final int[] SIDE_SLOTS = new int[] { 1, 2 }; private static final Map AVAILABLE_FUELS = Maps.newHashMap(); private final Object2IntOpenHashMap recipesUsed; @@ -66,7 +58,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp public EndStoneSmelterBlockEntity() { super(EndBlockEntities.END_STONE_SMELTER); this.inventory = DefaultedList.ofSize(4, ItemStack.EMPTY); - this.recipesUsed = new Object2IntOpenHashMap(); + this.recipesUsed = new Object2IntOpenHashMap<>(); this.propertyDelegate = new PropertyDelegate() { public int get(int index) { switch(index) { @@ -167,6 +159,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp } protected int getSmeltTime() { + assert this.world != null; int smeltTime = this.world.getRecipeManager().getFirstMatch(AlloyingRecipe.TYPE, this, world) .map(AlloyingRecipe::getSmeltTime).orElse(0); if (smeltTime == 0) { @@ -178,10 +171,9 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp } public void dropExperience(PlayerEntity player) { + assert world != null; List> list = Lists.newArrayList(); - ObjectIterator> usedRecipes = this.recipesUsed.object2IntEntrySet().iterator(); - while(usedRecipes.hasNext()) { - Entry entry = usedRecipes.next(); + for (Entry entry : this.recipesUsed.object2IntEntrySet()) { world.getRecipeManager().get(entry.getKey()).ifPresent((recipe) -> { list.add(recipe); if (recipe instanceof AlloyingRecipe) { @@ -213,11 +205,11 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp @Override public boolean canPlayerUse(PlayerEntity player) { + assert this.world != null; if (this.world.getBlockEntity(this.pos) != this) { return false; - } else { - return player.squaredDistanceTo(this.pos.getX() + 0.5D, this.pos.getY() + 0.5D, this.pos.getZ() + 0.5D) <= 64.0D; } + return player.squaredDistanceTo(this.pos.getX() + 0.5D, this.pos.getY() + 0.5D, this.pos.getZ() + 0.5D) <= 64.0D; } @Override @@ -243,10 +235,11 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp } boolean burning = this.isBurning(); + assert this.world != null; if (!this.world.isClient) { ItemStack fuel = this.inventory.get(2); if (!burning && (fuel.isEmpty() || inventory.get(0).isEmpty() && inventory.get(1).isEmpty())) { - if (!burning && smeltTime > 0) { + if (smeltTime > 0) { this.smeltTime = MathHelper.clamp(smeltTime - 2, 0, smeltTimeTotal); } } else { @@ -294,7 +287,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp protected boolean canAcceptRecipeOutput(Recipe recipe) { if (recipe == null) return false; - boolean validInput = false; + boolean validInput; if (recipe instanceof AlloyingRecipe) { validInput = !inventory.get(0).isEmpty() && !inventory.get(1).isEmpty(); @@ -306,22 +299,21 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp ItemStack result = recipe.getOutput(); if (result.isEmpty()) { return false; - } else { - ItemStack output = this.inventory.get(3); - int outCount = output.getCount(); - int total = outCount + result.getCount(); - if (output.isEmpty()) { - return true; - } else if (!output.isItemEqualIgnoreDamage(result)) { - return false; - } else if (outCount < this.getMaxCountPerStack() && outCount < output.getMaxCount()) { - return this.getMaxCountPerStack() >= total; - } else { - return output.getCount() < result.getMaxCount(); - } } + ItemStack output = this.inventory.get(3); + int outCount = output.getCount(); + int total = outCount + result.getCount(); + if (output.isEmpty()) { + return true; + } + if (!output.isItemEqualIgnoreDamage(result)) { + return false; + } + if (outCount < this.getMaxCountPerStack() && outCount < output.getMaxCount()) { + return this.getMaxCountPerStack() >= total; + } + return output.getCount() < result.getMaxCount(); } - return false; } @@ -336,6 +328,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp output.increment(result.getCount()); } + assert this.world != null; if (!this.world.isClient) { this.setLastRecipe(recipe); } @@ -354,9 +347,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp @Override public void provideRecipeInputs(RecipeFinder finder) { - Iterator inventory = this.inventory.iterator(); - while(inventory.hasNext()) { - ItemStack itemStack = inventory.next(); + for (ItemStack itemStack : this.inventory) { finder.addItem(itemStack); } } @@ -379,9 +370,8 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp public int[] getAvailableSlots(Direction side) { if (side == Direction.DOWN) { return BOTTOM_SLOTS; - } else { - return side == Direction.UP ? TOP_SLOTS : SIDE_SLOTS; } + return side == Direction.UP ? TOP_SLOTS : SIDE_SLOTS; } @Override @@ -392,9 +382,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp @Override public boolean canExtract(int slot, ItemStack stack, Direction dir) { if (dir == Direction.DOWN && slot == 2) { - if (stack.getItem() != Items.BUCKET) { - return false; - } + return stack.getItem() == Items.BUCKET; } return true; } @@ -402,10 +390,9 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp protected int getFuelTime(ItemStack fuel) { if (fuel.isEmpty()) { return 0; - } else { - Item item = fuel.getItem(); - return AVAILABLE_FUELS.getOrDefault(item, 0); } + Item item = fuel.getItem(); + return AVAILABLE_FUELS.getOrDefault(item, 0); } @Override @@ -418,9 +405,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp this.smeltTime = tag.getShort("SmeltTime"); this.smeltTimeTotal = tag.getShort("SmeltTimeTotal"); CompoundTag compoundTag = tag.getCompound("RecipesUsed"); - Iterator recipes = compoundTag.getKeys().iterator(); - while(recipes.hasNext()) { - String id = recipes.next(); + for (String id : compoundTag.getKeys()) { this.recipesUsed.put(new Identifier(id), compoundTag.getInt(id)); } } @@ -434,9 +419,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp tag.putShort("SmeltTimeTotal", (short) smeltTimeTotal); Inventories.toTag(tag, inventory); CompoundTag usedRecipes = new CompoundTag(); - this.recipesUsed.forEach((identifier, integer) -> { - usedRecipes.putInt(identifier.toString(), integer); - }); + this.recipesUsed.forEach((identifier, integer) -> usedRecipes.putInt(identifier.toString(), integer)); tag.put("RecipesUsed", usedRecipes); return tag; @@ -445,12 +428,11 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp public boolean isValid(int slot, ItemStack stack) { if (slot == 3) { return false; - } else if (slot != 0 || slot != 1) { + } else if (slot != 2) { return true; - } else { - ItemStack itemStack = this.inventory.get(2); - return canUseAsFuel(stack) || stack.getItem() == Items.BUCKET && itemStack.getItem() != Items.BUCKET; } + ItemStack itemStack = this.inventory.get(2); + return canUseAsFuel(stack) || stack.getItem() == Items.BUCKET && itemStack.getItem() != Items.BUCKET; } public static boolean canUseAsFuel(ItemStack stack) { @@ -458,16 +440,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp } public static void registerFuel(ItemConvertible fuel, int time) { - if (AVAILABLE_FUELS.containsKey(fuel)) { - AVAILABLE_FUELS.replace(fuel.asItem(), time); - } else { - AVAILABLE_FUELS.put(fuel.asItem(), time); - } - } - - public static void registerFuel(Tag tag, int time) { - Iterator tagItems = tag.values().iterator(); - tagItems.forEachRemaining(item -> registerFuel(item, time)); + AVAILABLE_FUELS.put(fuel.asItem(), time); } public static Map availableFuels() { From 5e6763d6195cf8a81484c90fb79517299d91ca24 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sun, 17 Jan 2021 17:46:23 +0300 Subject: [PATCH 183/463] Finally fixed Eternal Teleportation --- .../ru/betterend/blocks/EndPortalBlock.java | 35 ++--- .../interfaces/TeleportingEntity.java | 2 +- .../betterend/mixin/common/EntityMixin.java | 35 ++--- .../common/ServerPlayNetworkHandlerMixin.java | 17 ++- .../mixin/common/ServerPlayerEntityMixin.java | 122 +++++++++++++++++- 5 files changed, 150 insertions(+), 61 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index 9255f46f..69fcf6c7 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -73,8 +73,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable if (exitPos == null) return; if (entity instanceof ServerPlayerEntity) { ServerPlayerEntity player = (ServerPlayerEntity) entity; - teleportPlayer(player, destination, exitPos); - + this.teleportPlayer(player, destination, exitPos); } else { TeleportingEntity teleEntity = (TeleportingEntity) entity; teleEntity.beSetExitPos(exitPos); @@ -85,32 +84,14 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable } } } - - private void teleportPlayer(ServerPlayerEntity player, ServerWorld destination, BlockPos pos) { - ((TeleportingEntity) player).beSetExitPos(pos); + + private void teleportPlayer(ServerPlayerEntity player, ServerWorld destination, BlockPos exitPos) { if (player.isCreative()) { - player.teleport(destination, pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, player.yaw, player.pitch); - } - else { - if (destination.getRegistryKey() == World.OVERWORLD) { - //player.teleport(destination, pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, player.yaw, player.pitch); - //player.updatePositionAndAngles(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, player.yaw, player.pitch); - //player.moveToWorld(destination); - //player.teleport(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); - //player.updatePositionAndAngles(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, player.yaw, player.pitch); - //player.teleport(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); - - //player.teleport(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); - - // The most safe way - player.moveToWorld(destination); - - //player.teleport(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); - } - else { - player.moveToWorld(destination); - player.teleport(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); - } + player.teleport(destination, exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5, player.yaw, player.pitch); + } else { + TeleportingEntity teleEntity = (TeleportingEntity) player; + teleEntity.beSetExitPos(exitPos); + player.moveToWorld(destination); } player.resetNetherPortalCooldown(); } diff --git a/src/main/java/ru/betterend/interfaces/TeleportingEntity.java b/src/main/java/ru/betterend/interfaces/TeleportingEntity.java index 8e9caa0f..76cf8c24 100644 --- a/src/main/java/ru/betterend/interfaces/TeleportingEntity.java +++ b/src/main/java/ru/betterend/interfaces/TeleportingEntity.java @@ -4,6 +4,6 @@ import net.minecraft.util.math.BlockPos; public interface TeleportingEntity { void beSetExitPos(BlockPos pos); - + void beResetExitPos(); boolean beCanTeleport(); } diff --git a/src/main/java/ru/betterend/mixin/common/EntityMixin.java b/src/main/java/ru/betterend/mixin/common/EntityMixin.java index 466e34aa..de405742 100644 --- a/src/main/java/ru/betterend/mixin/common/EntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EntityMixin.java @@ -18,8 +18,7 @@ import ru.betterend.interfaces.TeleportingEntity; @Mixin(Entity.class) public abstract class EntityMixin implements TeleportingEntity { - private BlockPos exitPos; - + @Shadow public float yaw; @Shadow @@ -41,10 +40,11 @@ public abstract class EntityMixin implements TeleportingEntity { @Shadow protected abstract TeleportTarget getTeleportTarget(ServerWorld destination); - + + private BlockPos exitPos; + @Inject(method = "moveToWorld", at = @At("HEAD"), cancellable = true) public void be_moveToWorld(ServerWorld destination, CallbackInfoReturnable info) { - Entity entity = (Entity) (Object) this; if (!removed && beCanTeleport() && world instanceof ServerWorld) { this.detach(); this.world.getProfiler().push("changeDimension"); @@ -52,7 +52,7 @@ public abstract class EntityMixin implements TeleportingEntity { TeleportTarget teleportTarget = this.getTeleportTarget(destination); if (teleportTarget != null) { this.world.getProfiler().swap("reloading"); - entity = this.getType().create(destination); + Entity entity = this.getType().create(destination); if (entity != null) { entity.copyFrom(Entity.class.cast(this)); entity.refreshPositionAndAngles(teleportTarget.position.x, teleportTarget.position.y, teleportTarget.position.z, teleportTarget.yaw, entity.pitch); @@ -64,9 +64,8 @@ public abstract class EntityMixin implements TeleportingEntity { ((ServerWorld) world).resetIdleTimeout(); destination.resetIdleTimeout(); this.world.getProfiler().pop(); - beResetTeleport(); + this.beResetExitPos(); info.setReturnValue(entity); - info.cancel(); } } } @@ -75,29 +74,21 @@ public abstract class EntityMixin implements TeleportingEntity { protected void be_getTeleportTarget(ServerWorld destination, CallbackInfoReturnable info) { if (beCanTeleport()) { info.setReturnValue(new TeleportTarget(new Vec3d(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), getVelocity(), yaw, pitch)); - beResetTeleport(); - info.cancel(); } } - - @Shadow - protected void setRotation(float yaw, float pitch) {} @Override public void beSetExitPos(BlockPos pos) { - exitPos = pos.toImmutable(); + this.exitPos = pos.toImmutable(); } - - public void beResetTeleport() { - exitPos = null; + + @Override + public void beResetExitPos() { + this.exitPos = null; } - + @Override public boolean beCanTeleport() { - return exitPos != null; + return this.exitPos != null; } - - public BlockPos beGetExit() { - return exitPos; - }; } diff --git a/src/main/java/ru/betterend/mixin/common/ServerPlayNetworkHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/ServerPlayNetworkHandlerMixin.java index 1df58138..d0644012 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerPlayNetworkHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerPlayNetworkHandlerMixin.java @@ -1,13 +1,5 @@ package ru.betterend.mixin.common; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.network.NetworkThreadUtils; @@ -18,6 +10,13 @@ import net.minecraft.server.world.ServerWorld; import net.minecraft.text.LiteralText; import net.minecraft.util.Formatting; import net.minecraft.util.math.BlockPos; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.betterend.blocks.entities.ESignBlockEntity; @Mixin(ServerPlayNetworkHandler.class) @@ -30,7 +29,7 @@ public class ServerPlayNetworkHandlerMixin { @Inject(method = "onSignUpdate", at = @At(value = "HEAD"), cancellable = true) private void be_signUpdate(UpdateSignC2SPacket packet, CallbackInfo info) { - NetworkThreadUtils.forceMainThread(packet, (ServerPlayNetworkHandler) (Object) this, (ServerWorld) this.player.getServerWorld()); + NetworkThreadUtils.forceMainThread(packet, ServerPlayNetworkHandler.class.cast(this), player.getServerWorld()); this.player.updateLastActionTime(); ServerWorld serverWorld = this.player.getServerWorld(); BlockPos blockPos = packet.getPos(); diff --git a/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java b/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java index 0ee31988..ed57ad0a 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java @@ -1,6 +1,22 @@ package ru.betterend.mixin.common; +import com.mojang.authlib.GameProfile; +import net.minecraft.entity.Entity; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.network.packet.s2c.play.*; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.PlayerManager; +import net.minecraft.server.network.ServerPlayNetworkHandler; +import net.minecraft.server.network.ServerPlayerInteractionManager; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.TeleportTarget; +import net.minecraft.world.World; +import net.minecraft.world.WorldProperties; +import net.minecraft.world.biome.source.BiomeAccess; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -8,13 +24,115 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import ru.betterend.interfaces.TeleportingEntity; @Mixin(ServerPlayerEntity.class) -public class ServerPlayerEntityMixin { +public abstract class ServerPlayerEntityMixin extends PlayerEntity implements TeleportingEntity { + + @Shadow + public ServerPlayNetworkHandler networkHandler; + @Final + @Shadow + public ServerPlayerInteractionManager interactionManager; + @Final + @Shadow + public MinecraftServer server; + @Shadow + private boolean inTeleportationState; + @Shadow + private float syncedHealth; + @Shadow + private int syncedFoodLevel; + @Shadow + private int syncedExperience; + + private BlockPos exitPos; + + public ServerPlayerEntityMixin(World world, BlockPos pos, float yaw, GameProfile profile) { + super(world, pos, yaw, profile); + } + @Inject(method = "createEndSpawnPlatform", at = @At("HEAD"), cancellable = true) private void be_createEndSpawnPlatform(ServerWorld world, BlockPos centerPos, CallbackInfo info) { - if (!centerPos.equals(world.getSpawnPos())) { + if (!centerPos.equals(world.getSpawnPos()) || beCanTeleport()) { info.cancel(); } } + + @Inject(method = "getTeleportTarget", at = @At("HEAD"), cancellable = true) + protected void be_getTeleportTarget(ServerWorld destination, CallbackInfoReturnable info) { + if (beCanTeleport()) { + info.setReturnValue(new TeleportTarget(new Vec3d(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), getVelocity(), yaw, pitch)); + } + } + + @Inject(method = "moveToWorld", at = @At("HEAD"), cancellable = true) + public void be_moveToWorld(ServerWorld destination, CallbackInfoReturnable info) { + if (beCanTeleport() && world instanceof ServerWorld) { + this.inTeleportationState = true; + ServerWorld serverWorld = this.getServerWorld(); + WorldProperties worldProperties = destination.getLevelProperties(); + ServerPlayerEntity player = ServerPlayerEntity.class.cast(this); + this.networkHandler.sendPacket(new PlayerRespawnS2CPacket(destination.getDimension(), destination.getRegistryKey(), BiomeAccess.hashSeed(destination.getSeed()), + interactionManager.getGameMode(),interactionManager.getPreviousGameMode(), destination.isDebugWorld(), destination.isFlat(), true)); + this.networkHandler.sendPacket(new DifficultyS2CPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); + PlayerManager playerManager = this.server.getPlayerManager(); + playerManager.sendCommandTree(player); + serverWorld.removePlayer(player); + this.removed = false; + TeleportTarget teleportTarget = this.getTeleportTarget(destination); + if (teleportTarget != null) { + serverWorld.getProfiler().push("moving"); + serverWorld.getProfiler().pop(); + serverWorld.getProfiler().push("placing"); + this.setWorld(destination); + destination.onPlayerChangeDimension(player); + this.setRotation(teleportTarget.yaw, teleportTarget.pitch); + this.refreshPositionAfterTeleport(teleportTarget.position.x, teleportTarget.position.y, teleportTarget.position.z); + serverWorld.getProfiler().pop(); + this.worldChanged(serverWorld); + this.interactionManager.setWorld(destination); + this.networkHandler.sendPacket(new PlayerAbilitiesS2CPacket(this.abilities)); + playerManager.sendWorldInfo(player, destination); + playerManager.sendPlayerStatus(player); + + for (StatusEffectInstance statusEffectInstance : this.getStatusEffects()) { + this.networkHandler.sendPacket(new EntityStatusEffectS2CPacket(getEntityId(), statusEffectInstance)); + } + + this.networkHandler.sendPacket(new WorldEventS2CPacket(1032, BlockPos.ORIGIN, 0, false)); + this.syncedExperience = -1; + this.syncedHealth = -1.0F; + this.syncedFoodLevel = -1; + } + this.beResetExitPos(); + info.setReturnValue(player); + } + } + + @Shadow + abstract ServerWorld getServerWorld(); + + @Shadow + abstract void worldChanged(ServerWorld origin); + + @Shadow + @Override + protected abstract TeleportTarget getTeleportTarget(ServerWorld destination); + + @Override + public void beSetExitPos(BlockPos pos) { + this.exitPos = pos.toImmutable(); + } + + @Override + public void beResetExitPos() { + this.exitPos = null; + } + + @Override + public boolean beCanTeleport() { + return this.exitPos != null; + } } From 527ba2bbaadbf65a56e9b285edaa42acb4dea360 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sun, 17 Jan 2021 22:20:35 +0300 Subject: [PATCH 184/463] Eternal Portal generation fix --- .../ru/betterend/rituals/EternalRitual.java | 66 ++++++++----------- 1 file changed, 28 insertions(+), 38 deletions(-) diff --git a/src/main/java/ru/betterend/rituals/EternalRitual.java b/src/main/java/ru/betterend/rituals/EternalRitual.java index 64be288c..e633adea 100644 --- a/src/main/java/ru/betterend/rituals/EternalRitual.java +++ b/src/main/java/ru/betterend/rituals/EternalRitual.java @@ -1,6 +1,7 @@ package ru.betterend.rituals; import java.awt.Point; +import java.util.Objects; import java.util.Random; import java.util.Set; @@ -74,22 +75,18 @@ public class EternalRitual { this.configure(initial); } - public boolean hasWorld() { - return this.world != null; - } - public void setWorld(World world) { this.world = world; } - private boolean isValid() { - return world != null && !world.isClient() && - center != null && axis != null && - world.getRegistryKey() != World.NETHER; + private boolean isInvalid() { + return world == null || world.isClient() || + center == null || axis == null || + world.getRegistryKey() == World.NETHER; } public void checkStructure() { - if (!isValid()) return; + if (isInvalid()) return; Direction moveX, moveY; if (Direction.Axis.X == axis) { moveX = Direction.EAST; @@ -205,7 +202,7 @@ public class EternalRitual { } public void removePortal() { - if (!active || !isValid()) return; + if (!active || isInvalid()) return; World targetWorld = this.getTargetWorld(); this.removePortal(world, center); this.removePortal(targetWorld, exit); @@ -241,21 +238,16 @@ public class EternalRitual { private BlockPos findPortalPos() { MinecraftServer server = world.getServer(); + assert server != null; ServerWorld targetWorld = (ServerWorld) this.getTargetWorld(); Registry registry = server.getRegistryManager().getDimensionTypes(); - double mult = registry.get(DimensionType.THE_END_ID).getCoordinateScale(); + double mult = Objects.requireNonNull(registry.get(DimensionType.THE_END_ID)).getCoordinateScale(); BlockPos.Mutable basePos = center.mutableCopy().set(center.getX() / mult, center.getY(), center.getZ() / mult); Direction.Axis portalAxis = (Direction.Axis.X == axis) ? Direction.Axis.Z : Direction.Axis.X; if (checkIsAreaValid(targetWorld, basePos, portalAxis)) { EternalRitual.generatePortal(targetWorld, basePos, portalAxis); - if (portalAxis.equals(Direction.Axis.X)) { - return basePos.toImmutable(); - } - else { - return basePos.toImmutable(); - } - } - else { + return basePos.toImmutable(); + } else { Direction direction = Direction.EAST; BlockPos.Mutable checkPos = basePos.mutableCopy(); for (int step = 1; step < 128; step++) { @@ -291,7 +283,7 @@ public class EternalRitual { private World getTargetWorld() { RegistryKey target = world.getRegistryKey() == World.END ? World.OVERWORLD : World.END; - return world.getServer().getWorld(target); + return Objects.requireNonNull(world.getServer()).getWorld(target); } private boolean checkIsAreaValid(World world, BlockPos pos, Direction.Axis axis) { @@ -365,15 +357,21 @@ public class EternalRitual { for (Point point : PORTAL_MAP) { BlockPos pos = checkPos.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); BlockState state = world.getBlockState(pos); - if (state.getFluidState().isEmpty() || (!state.getMaterial().isReplaceable() && !state.getMaterial().equals(Material.PLANT))) return false; + if (isStateInvalid(state)) return false; pos = checkPos.mutableCopy().move(moveDir, -point.x).move(Direction.UP, point.y); state = world.getBlockState(pos); - if (state.getFluidState().isEmpty() || (!state.getMaterial().isReplaceable() && !state.getMaterial().equals(Material.PLANT))) return false; + if (isStateInvalid(state)) return false; } } return true; } + private static boolean isStateInvalid(BlockState state) { + if (!state.getFluidState().isEmpty()) return true; + Material material = state.getMaterial(); + return !material.isReplaceable() && !material.equals(Material.PLANT); + } + public void configure(BlockPos initial) { BlockPos checkPos = initial.east(12); if (this.hasPedestal(checkPos)) { @@ -405,12 +403,10 @@ public class EternalRitual { checkPos = checkPos.east(8); if (this.hasPedestal(checkPos)) { this.center = initial.north(5).east(4); - return; - } - else { + } else { this.center = initial.north(5).west(4); - return; } + return; } checkPos = initial.south(10); if (this.hasPedestal(checkPos)) { @@ -418,12 +414,10 @@ public class EternalRitual { checkPos = checkPos.east(8); if (this.hasPedestal(checkPos)) { this.center = initial.south(5).east(4); - return; - } - else { + } else { this.center = initial.south(5).west(4); - return; } + return; } checkPos = initial.east(10); if (this.hasPedestal(checkPos)) { @@ -431,12 +425,10 @@ public class EternalRitual { checkPos = checkPos.south(8); if (this.hasPedestal(checkPos)) { this.center = initial.east(5).south(4); - return; - } - else { + } else { this.center = initial.east(5).north(4); - return; } + return; } checkPos = initial.west(10); if (this.hasPedestal(checkPos)) { @@ -444,11 +436,8 @@ public class EternalRitual { checkPos = checkPos.south(8); if (this.hasPedestal(checkPos)) { this.center = initial.west(5).south(4); - return; - } - else { + } else { this.center = initial.west(5).north(4); - return; } } } @@ -461,6 +450,7 @@ public class EternalRitual { BlockState state = world.getBlockState(pos); if (state.isOf(PEDESTAL)) { EternalPedestalEntity pedestal = (EternalPedestalEntity) world.getBlockEntity(pos); + assert pedestal != null; if (!pedestal.hasRitual()) { pedestal.linkRitual(this); } From 7e750411a07e355105ef3a2fe115eaa6ab724777 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 18 Jan 2021 23:05:08 +0300 Subject: [PATCH 185/463] Capsacis tree enhancements --- .../ru/betterend/blocks/CapsacisCapBlock.java | 16 +++++----- .../java/ru/betterend/registry/EndBiomes.java | 2 +- .../java/ru/betterend/registry/EndBlocks.java | 4 +-- .../ru/betterend/registry/EndFeatures.java | 5 +-- .../world/biome/CapsacisForestBiome.java | 6 +++- .../features/trees/CapsacisTreeFeature.java | 30 +++++++++++------- .../betterend/blockstates/capsacis_bark.json | 19 +++++++++++ .../betterend/blockstates/capsacis_cap.json | 12 +++++++ .../betterend/blockstates/capsacis_log.json | 19 +++++++++++ .../models/block/capsacis_bark_1.json | 6 ++++ .../models/block/capsacis_bark_2.json | 6 ++++ .../models/block/capsacis_bark_3.json | 6 ++++ .../models/block/capsacis_cap_0.json | 6 ++++ .../models/block/capsacis_cap_1.json | 6 ++++ .../models/block/capsacis_cap_2.json | 6 ++++ .../models/block/capsacis_cap_3.json | 6 ++++ .../models/block/capsacis_cap_4.json | 6 ++++ .../models/block/capsacis_cap_5.json | 6 ++++ .../models/block/capsacis_cap_6.json | 6 ++++ .../models/block/capsacis_cap_7.json | 6 ++++ .../models/block/capsacis_log_1.json | 7 ++++ .../models/block/capsacis_log_2.json | 7 ++++ .../models/block/capsacis_log_3.json | 7 ++++ .../betterend/textures/block/capsacis_cap.png | Bin 0 -> 2189 bytes .../textures/block/capsacis_cap_0.png | Bin 0 -> 1565 bytes .../textures/block/capsacis_cap_1.png | Bin 0 -> 1563 bytes .../textures/block/capsacis_cap_2.png | Bin 0 -> 1554 bytes .../textures/block/capsacis_cap_3.png | Bin 0 -> 1540 bytes .../textures/block/capsacis_cap_4.png | Bin 0 -> 1520 bytes .../textures/block/capsacis_cap_5.png | Bin 0 -> 1506 bytes .../textures/block/capsacis_cap_6.png | Bin 0 -> 1480 bytes .../textures/block/capsacis_cap_7.png | Bin 0 -> 1477 bytes .../textures/block/capsacis_cap__22.png | Bin 0 -> 2233 bytes .../textures/block/capsacis_cap_black.png | Bin 469 -> 0 bytes .../textures/block/capsacis_cap_purple.png | Bin 521 -> 0 bytes .../textures/block/capsacis_cap_white.png | Bin 526 -> 0 bytes .../textures/block/capsacis_log_side.png | Bin 1700 -> 1837 bytes .../textures/block/capsacis_log_side_2.png | Bin 0 -> 1839 bytes .../textures/block/capsacis_log_side_3.png | Bin 0 -> 1842 bytes .../textures/block/capsacis_log_top.png | Bin 461 -> 1741 bytes 40 files changed, 172 insertions(+), 28 deletions(-) create mode 100644 src/main/resources/assets/betterend/blockstates/capsacis_bark.json create mode 100644 src/main/resources/assets/betterend/blockstates/capsacis_cap.json create mode 100644 src/main/resources/assets/betterend/blockstates/capsacis_log.json create mode 100644 src/main/resources/assets/betterend/models/block/capsacis_bark_1.json create mode 100644 src/main/resources/assets/betterend/models/block/capsacis_bark_2.json create mode 100644 src/main/resources/assets/betterend/models/block/capsacis_bark_3.json create mode 100644 src/main/resources/assets/betterend/models/block/capsacis_cap_0.json create mode 100644 src/main/resources/assets/betterend/models/block/capsacis_cap_1.json create mode 100644 src/main/resources/assets/betterend/models/block/capsacis_cap_2.json create mode 100644 src/main/resources/assets/betterend/models/block/capsacis_cap_3.json create mode 100644 src/main/resources/assets/betterend/models/block/capsacis_cap_4.json create mode 100644 src/main/resources/assets/betterend/models/block/capsacis_cap_5.json create mode 100644 src/main/resources/assets/betterend/models/block/capsacis_cap_6.json create mode 100644 src/main/resources/assets/betterend/models/block/capsacis_cap_7.json create mode 100644 src/main/resources/assets/betterend/models/block/capsacis_log_1.json create mode 100644 src/main/resources/assets/betterend/models/block/capsacis_log_2.json create mode 100644 src/main/resources/assets/betterend/models/block/capsacis_log_3.json create mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_cap.png create mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_cap_0.png create mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_cap_1.png create mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_cap_2.png create mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_cap_3.png create mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_cap_4.png create mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_cap_5.png create mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_cap_6.png create mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_cap_7.png create mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_cap__22.png delete mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_cap_black.png delete mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_cap_purple.png delete mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_cap_white.png create mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_log_side_2.png create mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_log_side_3.png diff --git a/src/main/java/ru/betterend/blocks/CapsacisCapBlock.java b/src/main/java/ru/betterend/blocks/CapsacisCapBlock.java index 18f2974a..514bb05f 100644 --- a/src/main/java/ru/betterend/blocks/CapsacisCapBlock.java +++ b/src/main/java/ru/betterend/blocks/CapsacisCapBlock.java @@ -13,11 +13,16 @@ import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; public class CapsacisCapBlock extends BaseBlock { - public static final IntProperty COLOR = IntProperty.of("color", 0, 7); private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); + public static final IntProperty COLOR = BlockProperties.COLOR; - public CapsacisCapBlock(MaterialColor color) { - super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK).materialColor(color)); + public CapsacisCapBlock() { + super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK).materialColor(MaterialColor.MAGENTA)); + } + + @Override + protected void appendProperties(StateManager.Builder stateManager) { + stateManager.add(COLOR); } @Override @@ -27,9 +32,4 @@ public class CapsacisCapBlock extends BaseBlock { double pz = ctx.getBlockPos().getZ() * 0.1; return this.getDefaultState().with(COLOR, MHelper.floor(NOISE.eval(px, py, pz) * 3.5 + 4)); } - - @Override - protected void appendProperties(StateManager.Builder stateManager) { - stateManager.add(COLOR); - } } diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index 8fd56735..dc20d7ac 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -84,7 +84,7 @@ public class EndBiomes { public static final EndBiome BLOSSOMING_SPIRES = registerBiome(new BiomeBlossomingSpires(), BiomeType.LAND); public static final EndBiome SULPHUR_SPRINGS = registerBiome(new BiomeSulphurSprings(), BiomeType.LAND); public static final EndBiome UMBRELLA_JUNGLE = registerBiome(new BiomeUmbrellaJungle(), BiomeType.LAND); - public static final EndBiome CAPSACIS_FOREST = registerBiome(new CapsacisForestBiome(), BiomeType.LAND); + public static final EndBiome CAPSACIS_FOREST = registerSubBiome(new CapsacisForestBiome(), CHORUS_FOREST); //public static final EndBiome HANGING_GARDENS = registerBiome(new HangingGardensBiome(), BiomeType.LAND); // Better End Void diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index b358dfb4..50dfbff9 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -195,9 +195,7 @@ public class EndBlocks { // Tree from original concept (+ modifications) public static final Block CAPSACIS_SAPLING = registerBlock("capsacis_sapling", new UmbrellaTreeSaplingBlock()); - public static final Block CAPSACIS_CAP_BLACK = registerBlock("capsacis_cap_black", new CapsacisCapBlock(MaterialColor.BLACK)); - public static final Block CAPSACIS_CAP_WHITE = registerBlock("capsacis_cap_white", new CapsacisCapBlock(MaterialColor.WHITE)); - public static final Block CAPSACIS_CAP_PURPLE = registerBlock("capsacis_cap_purple", new CapsacisCapBlock(MaterialColor.MAGENTA)); + public static final Block CAPSACIS_CAP = registerBlock("capsacis_cap", new CapsacisCapBlock()); public static final WoodenMaterial CAPSACIS = new WoodenMaterial("capsacis", MaterialColor.PURPLE, MaterialColor.LIGHT_BLUE); // Small ecosystem tree diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 1a976641..de96bdbc 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -64,10 +64,7 @@ public class EndFeatures { public static final EndFeature HELIX_TREE = new EndFeature("helix_tree", new HelixTreeFeature(), 2); public static final EndFeature UMBRELLA_TREE = new EndFeature("umbrella_tree", new UmbrellaTreeFeature(), 4); public static final EndFeature JELLYSHROOM = new EndFeature("jellyshroom", new JellyshroomFeature(), 3); - public static final EndFeature CAPSACIS = new EndFeature("capsacis", new CapsacisTreeFeature((random) -> { - int state = random.nextInt(3); - return state == 0 ? EndBlocks.CAPSACIS_CAP_BLACK.getDefaultState() : state == 1 ? EndBlocks.CAPSACIS_CAP_PURPLE.getDefaultState() : EndBlocks.CAPSACIS_CAP_WHITE.getDefaultState(); - }), 1); + public static final EndFeature CAPSACIS = new EndFeature("capsacis", new CapsacisTreeFeature(), 3); // Bushes // public static final EndFeature PYTHADENDRON_BUSH = new EndFeature("pythadendron_bush", new BushFeature(EndBlocks.PYTHADENDRON_LEAVES, EndBlocks.PYTHADENDRON.bark), 4); diff --git a/src/main/java/ru/betterend/world/biome/CapsacisForestBiome.java b/src/main/java/ru/betterend/world/biome/CapsacisForestBiome.java index 4c7394ab..eaefb4ef 100644 --- a/src/main/java/ru/betterend/world/biome/CapsacisForestBiome.java +++ b/src/main/java/ru/betterend/world/biome/CapsacisForestBiome.java @@ -8,13 +8,17 @@ import ru.betterend.registry.EndSounds; public class CapsacisForestBiome extends EndBiome { public CapsacisForestBiome() { super(new BiomeDefinition("capsacis_forest") - .setSurface(EndBlocks.SHADOW_GRASS, EndBlocks.CHORUS_NYLIUM) + .setSurface(EndBlocks.CHORUS_NYLIUM) .setMusic(EndSounds.MUSIC_FOREST) .setWaterAndFogColor(84, 61, 127) .setFoliageColor(71, 45, 120) .setFogColor(78, 71, 92) .setFogDensity(1.5F) .addFeature(EndFeatures.CAPSACIS) + .addFeature(EndFeatures.PURPLE_POLYPORE) + .addFeature(EndFeatures.TAIL_MOSS_WOOD) + .addFeature(EndFeatures.TAIL_MOSS) + .addFeature(EndFeatures.CHORUS_GRASS) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4)); } } diff --git a/src/main/java/ru/betterend/world/features/trees/CapsacisTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/CapsacisTreeFeature.java index fcf88690..edce411d 100644 --- a/src/main/java/ru/betterend/world/features/trees/CapsacisTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/CapsacisTreeFeature.java @@ -9,15 +9,18 @@ import com.google.common.collect.Lists; import net.minecraft.block.BlockState; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.blocks.BlockProperties; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.MHelper; import ru.betterend.util.SplineHelper; import ru.betterend.util.sdf.SDF; import ru.betterend.util.sdf.operator.SDFFlatWave; +import ru.betterend.util.sdf.operator.SDFScale; import ru.betterend.util.sdf.operator.SDFSmoothUnion; import ru.betterend.util.sdf.operator.SDFTranslate; import ru.betterend.util.sdf.operator.SDFUnion; @@ -28,12 +31,6 @@ import ru.betterend.world.features.DefaultFeature; public class CapsacisTreeFeature extends DefaultFeature { private static final Function REPLACE; private static final List ROOT; - - private final Function capFunction; - - public CapsacisTreeFeature(Function capFunction) { - this.capFunction = capFunction; - } @Override public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { @@ -49,30 +46,41 @@ public class CapsacisTreeFeature extends DefaultFeature { BlockState woodState = EndBlocks.CAPSACIS.bark.getDefaultState(); BlockState logState = EndBlocks.CAPSACIS.log.getDefaultState(); - BlockState capState = capFunction.apply(random); + BlockState capState = EndBlocks.CAPSACIS_CAP.getDefaultState(); SplineHelper.offsetParts(spline, random, 0.5F, 0, 0.5F); SDF sdf = SplineHelper.buildSDF(spline, 2.5F, 0.8F, (bpos) -> { return woodState; }); - SDF cap = makeCap(height * 0.2F, height * 0.25F, random, capState); + final float scale = config == null ? 1 : MHelper.randRange(1, 3, random); + final float offset = height * 0.2F; + final float radius = height * 0.25F; + final float heightScale = radius * 2 * scale; + final int count = MHelper.randRange(5, 7, random); + final float angle = random.nextFloat() * MHelper.PI2; + SDF cap = makeCap(offset, radius, count, angle, capState); sdf = new SDFUnion().setSourceA(sdf).setSourceB(cap); + sdf = new SDFScale().setScale(scale).setSource(sdf); makeRoots(world, center, height * 0.4F, random, woodState); sdf.addPostProcess((info) -> { if (EndBlocks.CAPSACIS.isTreeLog(info.getStateUp()) && EndBlocks.CAPSACIS.isTreeLog(info.getStateDown())) { return logState; } + else if (info.getState().equals(capState)) { + double off = Math.cos(Math.atan2(info.getPos().getX() - pos.getX(), info.getPos().getZ() - pos.getZ()) * count + angle) * 2; + int color = (int) ((info.getPos().getY() - pos.getY() - radius) / heightScale * 7 + off); + color = 7 - MathHelper.clamp(color, 0, 7); + return info.getState().with(BlockProperties.COLOR, color); + } return info.getState(); }).fillRecursive(world, center); return true; } - private SDF makeCap(float offset, float radius, Random random, BlockState capState) { - float angle = random.nextFloat() * MHelper.PI2; - int count = MHelper.randRange(5, 7, random); + private SDF makeCap(float offset, float radius, int count, float angle, BlockState capState) { SDF cap = new SDFSphere().setRadius(radius).setBlock(capState); SDF cone = new SDFCappedCone().setRadius1(radius).setRadius2(radius * 0.4F).setHeight(radius * 0.3F).setBlock(capState); cone = new SDFTranslate().setTranslate(0, radius * 0.3F, 0).setSource(cone); diff --git a/src/main/resources/assets/betterend/blockstates/capsacis_bark.json b/src/main/resources/assets/betterend/blockstates/capsacis_bark.json new file mode 100644 index 00000000..98418992 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/capsacis_bark.json @@ -0,0 +1,19 @@ +{ + "variants": { + "axis=x": [ + { "model": "betterend:block/capsacis_bark_1", "x": 90, "y": 90 }, + { "model": "betterend:block/capsacis_bark_2", "x": 90, "y": 90 }, + { "model": "betterend:block/capsacis_bark_3", "x": 90, "y": 90 } + ], + "axis=y": [ + { "model": "betterend:block/capsacis_bark_1" }, + { "model": "betterend:block/capsacis_bark_2" }, + { "model": "betterend:block/capsacis_bark_3" } + ], + "axis=z": [ + { "model": "betterend:block/capsacis_bark_1", "x": 90 }, + { "model": "betterend:block/capsacis_bark_2", "x": 90 }, + { "model": "betterend:block/capsacis_bark_3", "x": 90 } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/capsacis_cap.json b/src/main/resources/assets/betterend/blockstates/capsacis_cap.json new file mode 100644 index 00000000..4c051cb8 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/capsacis_cap.json @@ -0,0 +1,12 @@ +{ + "variants": { + "color=0": { "model": "betterend:block/capsacis_cap_0" }, + "color=1": { "model": "betterend:block/capsacis_cap_1" }, + "color=2": { "model": "betterend:block/capsacis_cap_2" }, + "color=3": { "model": "betterend:block/capsacis_cap_3" }, + "color=4": { "model": "betterend:block/capsacis_cap_4" }, + "color=5": { "model": "betterend:block/capsacis_cap_5" }, + "color=6": { "model": "betterend:block/capsacis_cap_6" }, + "color=7": { "model": "betterend:block/capsacis_cap_7" } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/capsacis_log.json b/src/main/resources/assets/betterend/blockstates/capsacis_log.json new file mode 100644 index 00000000..62fca081 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/capsacis_log.json @@ -0,0 +1,19 @@ +{ + "variants": { + "axis=x": [ + { "model": "betterend:block/capsacis_log_1", "x": 90, "y": 90 }, + { "model": "betterend:block/capsacis_log_2", "x": 90, "y": 90 }, + { "model": "betterend:block/capsacis_log_3", "x": 90, "y": 90 } + ], + "axis=y": [ + { "model": "betterend:block/capsacis_log_1" }, + { "model": "betterend:block/capsacis_log_2" }, + { "model": "betterend:block/capsacis_log_3" } + ], + "axis=z": [ + { "model": "betterend:block/capsacis_log_1", "x": 90 }, + { "model": "betterend:block/capsacis_log_2", "x": 90 }, + { "model": "betterend:block/capsacis_log_3", "x": 90 } + ] + } +} diff --git a/src/main/resources/assets/betterend/models/block/capsacis_bark_1.json b/src/main/resources/assets/betterend/models/block/capsacis_bark_1.json new file mode 100644 index 00000000..7d89f680 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/capsacis_bark_1.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/capsacis_log_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/capsacis_bark_2.json b/src/main/resources/assets/betterend/models/block/capsacis_bark_2.json new file mode 100644 index 00000000..b0844d4e --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/capsacis_bark_2.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/capsacis_log_side_2" + } +} diff --git a/src/main/resources/assets/betterend/models/block/capsacis_bark_3.json b/src/main/resources/assets/betterend/models/block/capsacis_bark_3.json new file mode 100644 index 00000000..4b266581 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/capsacis_bark_3.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/capsacis_log_side_3" + } +} diff --git a/src/main/resources/assets/betterend/models/block/capsacis_cap_0.json b/src/main/resources/assets/betterend/models/block/capsacis_cap_0.json new file mode 100644 index 00000000..81bef2fb --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/capsacis_cap_0.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/capsacis_cap_0" + } +} diff --git a/src/main/resources/assets/betterend/models/block/capsacis_cap_1.json b/src/main/resources/assets/betterend/models/block/capsacis_cap_1.json new file mode 100644 index 00000000..88b91485 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/capsacis_cap_1.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/capsacis_cap_1" + } +} diff --git a/src/main/resources/assets/betterend/models/block/capsacis_cap_2.json b/src/main/resources/assets/betterend/models/block/capsacis_cap_2.json new file mode 100644 index 00000000..3ce9ed12 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/capsacis_cap_2.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/capsacis_cap_2" + } +} diff --git a/src/main/resources/assets/betterend/models/block/capsacis_cap_3.json b/src/main/resources/assets/betterend/models/block/capsacis_cap_3.json new file mode 100644 index 00000000..bad70714 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/capsacis_cap_3.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/capsacis_cap_3" + } +} diff --git a/src/main/resources/assets/betterend/models/block/capsacis_cap_4.json b/src/main/resources/assets/betterend/models/block/capsacis_cap_4.json new file mode 100644 index 00000000..d87e3a0c --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/capsacis_cap_4.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/capsacis_cap_4" + } +} diff --git a/src/main/resources/assets/betterend/models/block/capsacis_cap_5.json b/src/main/resources/assets/betterend/models/block/capsacis_cap_5.json new file mode 100644 index 00000000..834740b8 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/capsacis_cap_5.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/capsacis_cap_5" + } +} diff --git a/src/main/resources/assets/betterend/models/block/capsacis_cap_6.json b/src/main/resources/assets/betterend/models/block/capsacis_cap_6.json new file mode 100644 index 00000000..130d8da0 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/capsacis_cap_6.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/capsacis_cap_6" + } +} diff --git a/src/main/resources/assets/betterend/models/block/capsacis_cap_7.json b/src/main/resources/assets/betterend/models/block/capsacis_cap_7.json new file mode 100644 index 00000000..af98b021 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/capsacis_cap_7.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/capsacis_cap_7" + } +} diff --git a/src/main/resources/assets/betterend/models/block/capsacis_log_1.json b/src/main/resources/assets/betterend/models/block/capsacis_log_1.json new file mode 100644 index 00000000..4fdebd0d --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/capsacis_log_1.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "betterend:block/capsacis_log_top", + "side": "betterend:block/capsacis_log_side" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/capsacis_log_2.json b/src/main/resources/assets/betterend/models/block/capsacis_log_2.json new file mode 100644 index 00000000..94e439e1 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/capsacis_log_2.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "betterend:block/capsacis_log_top", + "side": "betterend:block/capsacis_log_side_2" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/capsacis_log_3.json b/src/main/resources/assets/betterend/models/block/capsacis_log_3.json new file mode 100644 index 00000000..150ba53c --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/capsacis_log_3.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "betterend:block/capsacis_log_top", + "side": "betterend:block/capsacis_log_side_3" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/capsacis_cap.png b/src/main/resources/assets/betterend/textures/block/capsacis_cap.png new file mode 100644 index 0000000000000000000000000000000000000000..ba60d3393b42fd6e39b58b761d110f85fc0aec47 GIT binary patch literal 2189 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/capsacis_cap_1.png b/src/main/resources/assets/betterend/textures/block/capsacis_cap_1.png new file mode 100644 index 0000000000000000000000000000000000000000..59df594a19ef2f48bace117a3b89c69aae40e716 GIT binary patch literal 1563 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6Sh*NEJGweqnwwfWn;RMeS(Lv8`kW|!2W%(B!Jx1#)91+cfRGI6`b z6sLJmy(zfeVun+%KF~4xpvXmvY?u%*1%a6GqzmN06Mt$RFvS-EllJ@wQC0>9rfyFc z$B>F!DnZ`aB8~#Z0=GJ{KGBx<gw%vKRJ{j*%y3ckiT;+fBn^jhi8{b8nv&ycp zJt)I(hyv??%JW$ur!4yv){7v8OxM48`FaG zyu4(->{?{5=DsBH=eO?cjhzz=cW=M?ZJjH_2luD! z(K+|8zip_wJ=^(emx5J8UG)1Wm6_)v_w+p9Xy?QMyFY6FteVRyQxK*l7B5n#VIYwGb&~Bc;z4b%Ij$lIQ0w$(s38 zqT#d!lW?5tQpURMJ)52yu~dIuzwpAY@X~MT_))d!v1CwJ0Dd!iayD#)${U~%@S7X_d_5YqkE}i>tLtbaNd*$6z><+S5 zh04?#!YlS3x7nz@KYc%wsv4i~ex)q7Eo^ru`6|r~Nb1&0Z(fp zxZST~n2-EE=**|%sCi+l3M1<@-=I?sAD7-)sic2>&dTa{r`F7rne`;1l{;zS;mfMe zzf81T({-%J*j`PF#cFAUPj$EIiTR6n&OfzXbA7V)5skJhjOEUCMF!^^j|)Wm+Me<4 dSh=5xhao1|T{Qa7mtUab+SAp~Wt~$(69D-cMR))J literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/capsacis_cap_2.png b/src/main/resources/assets/betterend/textures/block/capsacis_cap_2.png new file mode 100644 index 0000000000000000000000000000000000000000..90826dd369edc96e14a2960e17e6769f0eaa9f34 GIT binary patch literal 1554 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6Sh*NEyPBA}8JJo+n;ROsI$1h9895tU zxVTwbx*EG#I>Yq3+b4WhYLT0-lZlf9f72sZ54}Ybn#28f{&4@p z{Ey+|E7f$@Jsk>*1ew$XV>}n_KAE@aonKjcS=Fx7_ac_-y;}XOTEuSkn)DOj4dyfH zw_H9jr^PHGp<719mO&vz=whNkz|L~@Ohvi0l@HQtFK=G+zggterd6!V-rs6j+wA!z z=!K`+ndF6&Wi)+U%VvmLN{HKq^`Dx<%qgt&|8z;xmiWTmx&I!#eziI_EAO?wp!?-l zr?l=1c1*m=)%v)g;VvKByJpwm{SU6rh^#xbmgh;>lP;D^3A)kzp;A{F+-6_7;az5O zglo^bH&cBt=AN?M8!hrwajw-uDJ9o9R&}+FyZGC6KN~+0XcXe;pXA0}vFC%!y1j?{ zbvK{Sxjg0N>^y~CxnFkQIT={!cBzxPX z3LJ2L$>UMEG=lv{Vv=*if{oux(lqAGaAf(_!KU0{s=~-~dBUz#eNL711u{2oG};9_ z&v$)xYSP37IyYD*3Gz$kFnnpNdMC1J!o>HPuXRqZNWUHV<$LMjt*n7MU9-CR8~RIw zl@z<0R`4E}to!${;+*Az{eBzcCyBBpANY5Tce(rLj({Hl1;Ki$ z^Xdzl-BGb;L!T^BmMd1#U)5@oHvP?0=3=LY`ztM5F8owJc-wQIr-z`|@(UkBX3U%N cwVsKG;lfYz6Lme)^g*Sxr>mdKI;Vst0P*}!`2YX_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/capsacis_cap_3.png b/src/main/resources/assets/betterend/textures/block/capsacis_cap_3.png new file mode 100644 index 0000000000000000000000000000000000000000..e71f7d3568183030cbab92029d3bd24654dd3ac4 GIT binary patch literal 1540 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6Sh*NEyPBA}nV4ESn;ROsI$1h9895tU zxVTwbx*EG#I>Yq3s9EANRHzZ)M{*=xj0Cu zJY-}Lh+|)IhPTUDuYF0(I zsn6?TmP+~Xt-E~Kj#{Ps{U!GsyN{%tFn zl373Xwr^INTH;#KqU%eoJvD({ z`IUUqmFIE2Qrc-x_e9@WcrO2D%DH06%XfeMnxwO|tS0`Nw#np6D<*7Q2qxQZ&nDdOS z>-|q=ZnlFa8ex5JcYJdZ zRcW_5n0WY%!KSiL$KP`OnB=|H)aWw9nlqhiSEl&MC|+G*m-|TlM}*+|?&&QN2Csuw zMxELf_~Jn3>ynj48~p;ipUt1SytuCJ%;T2!?ljBAH8_5}?NQc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6Sh*NEyPBA}S(sWnn;ROsI$1h9895tU zxVTwbx*EG#I>Yq3U*w(8Nw2cY3X4`2J}9nVH<5vf+e35>-{01w3m)w8 z5j`t#!1vC|0u~P6tYbB&RMelj#|!OlT`zRG)IfX34$*t@<^H?@imig(49u6`9}tv? zC^Vmck()o~_7-ukROaoxlIQ(ew$2xtwroOqj`g?Wd|cd1@AM_V$SACS)hF&_d)!CB zMvSf5%53!=nSi2mcUSrdc>33-zYSrH{_%-ne{6yO$tebBYG%#c(sMFi&MhK#bAQ;K zS2N!pD^dx1F~Mx{N7=edX1{OMHtk)U5Wl!nK5RwRbn~cZeOnLOMwJKEJYSz9abLf# z#3)*Kd(iYq74<)@_RlA6dy+VLy3(Ki__Y}<*MqKaKQ-^bw$IL`%zE?L|3t9MUeqw$ z$R3}t?#Q)2Zwn2B8p@P{8(wz)e0ngJlO@tU{e#ZFh8UN^2aS^FdnaG`XR>>i$>f(F zZK-R%+?f;WvenAeA(#2(?;{H?{xZ$V(ErxsuebK8Q<|`ZX3||HQ;jlN-d7b}rcALi z>rYu;o1?x*w)4xErW+;c7GEEUJe9APaPVxj lnwd49aoV)AU+bB87_OZN&|0;_{R*fI_H^}gS?83{1OUWPG)n*g literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/capsacis_cap_5.png b/src/main/resources/assets/betterend/textures/block/capsacis_cap_5.png new file mode 100644 index 0000000000000000000000000000000000000000..d479ebacb13395097e569c2e98546cd7ff7e1ce9 GIT binary patch literal 1506 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6Sh*Ov7#mr*8Jb!;n;ROsI$1h9895tU zxVTwbx*EG#I>Yq3N@Uj$6rVXoau z3=B*`o-U3d6}NPPeDj431?Fx%e(%jPUcr!1mQ`M=4z4DP9v!&8QHWjTA47e=_5ViZ zNBRyA1H80vspXo@?mzpk%J%S*L!S;B*Cn6d^ZkSK|HaKN=8UERp&Ph1iU>HatYBnd zo6A@-Lumo4celmG$;W-(YejBq`LD2X=G*Igt{5;~H{9;g(#LSodE0}PY>Lw>q!X661b*e)q$;;6;V$0%lY{;Z|Mi`KV_ z@~(+eyYI_Qvb8ixN=j+G=J0C4Wrvx+_Y3dq5!$lj(^DU}28YQNGn2M&o62ColDtxT zHs^P*+2S^N3$Af0UoqaN=b-4||MTlk>v<<#T4aBCiJ9u{)tqMYdPWXIvvs1u@{cTE zSF3sWZe7Xt@Z*iS@7fX_7f-ak%ILMv%cuN;-7UlOGCPm#;fVP^A-~DTy5hpDXS}jc zcc@roDAu)}Ke+66q5k80LR`6>5laouzs!(Q4>@*c!T(5k8f52M4|${u^^{>cN@P+iz^Suxhec-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6Sh*Ov7#mr*nVMQUn;ROsI$1h9895tU zxVTwbx*EG#I>Yq3|LG`BKc8dv4z4}1M=z}5`DY9Wgz!U^x!jmqL15f;^dB7B31WejnU9ajhFfdto zx;TbZ+)@eJ?I#^5Fn8wMz1h-dj5%181T#IF7jMa2G2s*I&l4g)JFjFaS#@=IOo-U_ zF?;@Z!^s`GdRn!rPRZ=QIeH#ob<_+n|*(U5dd$$tmf@LRrJdZqqtu zIN!f#wKC+1siyP0j~Bdi6E8g}O*FqY{otmJ@ykQoB8AR}9C&tkbH!n!Etd_dH&1YP zU2*4rRCtY?UFpvl4L4r)n#wD&(hVzm6C;j+H6s)ET##nj9AwN*+I_J^LJE&7}<6qF2$^zdzJ-{^fdqTb29o=)K{^ zid|A6DWQcX8VMit?oG?w)1*H6y-2>-_mBhcgyx@F&X>E!WLHk=+3K5-%kF$u_x_vg x5N*EAmDOzTb%T4i`@*}>1k>QoLhoao}!xEsf)zj6_Wt~$(699ZYEH3~6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/capsacis_cap_7.png b/src/main/resources/assets/betterend/textures/block/capsacis_cap_7.png new file mode 100644 index 0000000000000000000000000000000000000000..6bb18653d1cacee7da439cdc28d0dfbc04294592 GIT binary patch literal 1477 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6Sh*Ov7#mr*S(;ipn;ROsI$1h9895tU zxVTwbx*EG#I>Yq3etkdV2=D2y|n#-3Kcv>2WUXZovS+2%!A~kDo<-e7g z+2z5fC-L9D-a9wdEAZCw8k0P~km#0K2No86dc%LWsnMus{?_+ODskf1-QMKcC_bFB z*dfGgS{?V*WizfBoD~Z7(b_Y8rqCxXf9^M~d{rj}I(w%!POV#Tl`U=UmK$F$Fr7AieU7VUIcu+~H3xj1LdrhOZ~%e@nF71?}Q?&@2o(-E%BSF+33mi*^p zF=ER0mJB+kq4es*p}!Xj7e~a2PQP1Yz!tgs|7x3y*^SKYuWXxM%vYuRRd>=xeu9M*ruSi|U9Au`?Jzrby(muv_t$SPl1TnmS u*0gq;cZSxEtNL#?EdC^LgR%ENmjS~IFMEZ95_+Hlo59o7&t;ucLK6Uml_whj literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/capsacis_cap__22.png b/src/main/resources/assets/betterend/textures/block/capsacis_cap__22.png new file mode 100644 index 0000000000000000000000000000000000000000..a54a1a07203ad5ae61b55e39bd2c8d0fea113abe GIT binary patch literal 2233 zcmbVO2~ZPf6kZMmQJe}MDWYB1idIbaNKDAq$Q1-Ei5N2l5s%GgLspY)++8jm&mJh^ z)r!j5;yE~uV{OITR`IIGppK$|XB|aaZ7XWAw$}d3kx{GGac6e--`(%M_r3SM|IIE; zHpT}Agakkk6quNxH-Y;*(&_IFuFIC&)!^2}oiJX2psvBv=>-*+${?syHET{4Qw>QZ z%{dj6m9sF49H$$gA!tNoj+>&VF(PbXGFX=m`EAel2+Ue_NXl>nW^l(cb~a%K&y1U4 zG}AMt(ON4KIT9X`Ljng*Mx@{zr^6+XIXa}(FA3JtYZQT7A>uS05-kOUQw_;*EXOnO zaD`e<<0=ByXcf2`(-Nv-FoEG36w{!%QjXyyrY4nIxcxvtG~Q|>P5M#ovA~lKv5TUc zMA7W*Y(=(G!SNX=uGMN$j6exO4iIu7*CkRpa+ff$!-Jj?Xr6V8Ea!qHkCcVW6mu!u0bp?t)@|oRPOx*Y zaP9g0TmVp7gTWKyrCgj&PY6Mb%K~Y%7v!aA!JO-6P!l6?nLN$JWdWK4rEJ_}EYDCP z$D29M(IHfF2W2=mRuU!x9+JYktX#J6!810Do)Q@yLSO_AB$MN6Go~VOpdAs8DM<`# zgBmz1Ys-BB8et{~5(nsr=b)f#tdvOoFW5?xHjZ~vAZOM|WiY7Qm4U#XN|LdhgX2M9 zz)so9!eAg1U4lrtXeLpwLqOUJmbH>LjIb#w8zHw@aL|!96(f(p2}VvUtr`Z$G=v4m zJM8rwohgaiVQ&TYG^Mdc&=#d!ZPBXbmfXbF>$mB(Tmn{0WB=M`sJ!c+W^&WnJ zs=m6{bj7>(1NYrA&57&*eLh^dqW8qmiJYT$OMPKj(;Of3l5c#ToGyypq?&cO^TuCf zyY8N8{ItAFVc+djSvGXhu;poKCR3OoYG!yr!x}DxoG`AR*A#cVZhJw?&XenHU7SAt z0v>vH?bYg*m|n6}{m>2a+^Wf{3ElOuuW;&Gd2RC-{~Z2dWaw=1j5(~c=^hlHJoGrT z{P*DEAOA2a)_)w;^C#l^MDKk;MF-~=j9+!)q^xqc=Jeg4g^K%6GwjpL0?Lf3jqm?C zRW)not@?Ap-j`zzrT6;0ep}Dtmb6j*yoh5hMY3_j*`@oF3s;ua72ak}O?Ys(t~79U zNC`T zkGX>Ug|+#RUv%T0l!}75^8=18ZCV~b_5RKHt(ns*nsoL@eSOId6RXeo*Bb8l-OEdV zIC#^S_oC6u`1aa;4{IMNFV>;m;tv|XV|v`a@X5nnQ^NTaL+w@c%2=H2Kf8Eq`It4M zc3xlEWB24ay5kMzC4B#yN8$IcS8v*L``Wg56VgL72RH0mFko)?fK!XZ`?$Gn4K=fu z)MFyL{z^mCCIXVhvo%x&HwVBY0}w=n-aF@cet=DlZCPp2p$4jon*k6RIDnbbdgpA7QG=?2 z0#&C)M?~1x^$CjPeL27wMPwidMX|WQB-)b+;Ol-TebA#5k+?Yupem>+zz6tR`?dja zwDY4rTUgx596-IKxy|$9%YWt178dt^E=1&fZYaJ!7K=nMvlrOwnsh1tCWg5!5JDl&V6$NBp*L^V40b_HE-Y`)40E>wg;T00000 LNkvXXu0mjf$eh@n diff --git a/src/main/resources/assets/betterend/textures/block/capsacis_cap_purple.png b/src/main/resources/assets/betterend/textures/block/capsacis_cap_purple.png deleted file mode 100644 index 3dffd7a905c7af1280dbbd0584ac7499b0248e43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 521 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 aqt7g#+cvMQ{WtxumX}lD*fn**qQ3yAHji%r literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/capsacis_log_top.png b/src/main/resources/assets/betterend/textures/block/capsacis_log_top.png index 6ddad95076788ab556cb3c71bbb2a085792f4b6c..b45ac0367e736724e08e11a1a177fcd93c40f984 100644 GIT binary patch literal 1741 zcmbVNe{2&~9KUU4VUsx=KV0S?9>*L%;@bc)g2-D`WU_oH_= z+6@ejA8{jD#A#H@B$|ngU;YR|L8D-12w5TvK>`5@x=4UIQGx~&3Hq*U8zlIPOWwWr z?tR|p`}=#nElmw2#TCT}f|U5YOaRW)jWIPJzPG#_wZo}M@wRFRa^DPN&lN3$bX{!^>JQ$Rw@?ko_EX&A(I~Nw! zb%iE~L?U5MSk1B;At_O5-lNQ=WJxW?>lAMJ4 zWnKt(-T|!%S}59LyAukthG%v5U%@;_hh|kS%re3cGk2O zen0J#G@X?=;A31EG}|l)JPoWYXQQ0exSix!++nlX@ftqtz{71$k_uDKHb>Z&z0b&8 zhY{TDeg1#mZ&n3ZTx{%~d5n@XvV!&s8jM$GrYKf`cxDw7&~zfuEN3LR3*(H)0v^kJ z7Vg;tleCE_fTaHr?n#&?hxG)j0(S&@>%U|a0re-0YMeBMxYNq?*=?1Zg~N7WEOUJb zZgQOrNU(jWuusi=v6VrPycc|oJ2-!|BOo>nlhgbwYL`1GiYhON7u`~3Up>-#D6hW$ zI6fZz;q;C3Bb!qC5}ICcaM0Q}>}-C0|E~?b zJLBs@9~|JPp12|HR%g8wDBS~&&s;06Iludxu|o6qs#DAp<7Zd3Tp9au>|#l(q~WWH z&)$E2-;>>W4<7yY7t>=uza6MrGVt_v&zehb)sEB;HZ@-OWZT7xW^;6WEB0H7I$Zku zUf=hH7g}c9Q}4J>jGoH>oSFEj);(*_0qLx%Sps+_)XhpgwvdW*VE z1situ{qgQ2@&2{mAj> z8vrIVm(v(jm09PwFzbw}0JQO0a$+$&)Mfe^sC#&KpT-PEuu?PnVbU1B0c>b+IL>H`~7u z;9_Lo_Smz%$->g`YF8o7=?wy0-Cmk^FH4Nj9XsUYM$$qeN{H}%YynJ`#Q;T_&R?ky z-6=-+f0Y{HFtmvE699R+B4>ry88H%>0H1y+>nG&R^*4MO8lJ0$VqIRp?9kHcK%N+? oxuo8_;GA-@BhD+ Date: Mon, 18 Jan 2021 23:14:23 +0300 Subject: [PATCH 186/463] Tree enhancements --- .../features/trees/CapsacisTreeFeature.java | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/main/java/ru/betterend/world/features/trees/CapsacisTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/CapsacisTreeFeature.java index edce411d..12eae23b 100644 --- a/src/main/java/ru/betterend/world/features/trees/CapsacisTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/CapsacisTreeFeature.java @@ -53,7 +53,7 @@ public class CapsacisTreeFeature extends DefaultFeature { return woodState; }); - final float scale = config == null ? 1 : MHelper.randRange(1, 3, random); + final float scale = config == null ? 1 : MHelper.randRange(1, 1.5F, random); final float offset = height * 0.2F; final float radius = height * 0.25F; final float heightScale = radius * 2 * scale; @@ -62,8 +62,12 @@ public class CapsacisTreeFeature extends DefaultFeature { SDF cap = makeCap(offset, radius, count, angle, capState); sdf = new SDFUnion().setSourceA(sdf).setSourceB(cap); + SDF roots = makeRoots(world, center, height * 0.4F, random, woodState); + if (roots != null) { + sdf = new SDFUnion().setSourceA(sdf).setSourceB(roots); + } sdf = new SDFScale().setScale(scale).setSource(sdf); - makeRoots(world, center, height * 0.4F, random, woodState); + sdf.addPostProcess((info) -> { if (EndBlocks.CAPSACIS.isTreeLog(info.getStateUp()) && EndBlocks.CAPSACIS.isTreeLog(info.getStateDown())) { return logState; @@ -95,12 +99,25 @@ public class CapsacisTreeFeature extends DefaultFeature { return cap; } - private void makeRoots(StructureWorldAccess world, BlockPos pos, float radius, Random random, BlockState state) { - int count = (int) (radius); + private SDF makeRoots(StructureWorldAccess world, BlockPos pos, float radius, Random random, BlockState state) { + int count = (int) (radius * 0.7F); + SDF roots = null; for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2; float scale = radius * MHelper.randRange(0.85F, 1.15F, random); + List branch = SplineHelper.copySpline(ROOT); + SplineHelper.rotateSpline(branch, angle); + SplineHelper.scale(branch, scale); + SplineHelper.offsetParts(branch, random, 0.5F, 0.7F, 0.5F); + SDF sdf = SplineHelper.buildSDF(branch, 2F, 1F, (p) -> { return state; }); + roots = roots == null ? sdf : new SDFUnion().setSourceA(sdf).setSourceB(roots); + } + return roots; + /*for (int i = 0; i < count; i++) { + float angle = (float) i / (float) count * MHelper.PI2; + float scale = radius * MHelper.randRange(0.85F, 1.15F, random); + List branch = SplineHelper.copySpline(ROOT); SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); @@ -109,7 +126,7 @@ public class CapsacisTreeFeature extends DefaultFeature { if (world.getBlockState(pos.add(last.getX(), last.getY(), last.getZ())).isIn(EndTags.GEN_TERRAIN)) { SplineHelper.fillSpline(branch, world, state, pos, REPLACE); } - } + }*/ } static { From 49bf8441e61fb6ff8b11ea4dc76bebeb4da17915 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 19 Jan 2021 00:28:41 +0300 Subject: [PATCH 187/463] Removed tree and unfinished biome --- .../entities/EndStoneSmelterBlockEntity.java | 16 +- .../common/ServerPlayNetworkHandlerMixin.java | 15 +- .../mixin/common/ServerPlayerEntityMixin.java | 35 +++-- .../java/ru/betterend/registry/EndBiomes.java | 3 - .../java/ru/betterend/registry/EndBlocks.java | 17 -- .../ru/betterend/registry/EndFeatures.java | 2 - .../world/biome/CapsacisForestBiome.java | 24 --- .../world/biome/HangingGardensBiome.java | 18 --- .../features/trees/CapsacisTreeFeature.java | 146 ------------------ .../betterend/textures/block/capsacis_cap.png | Bin 2189 -> 0 bytes .../textures/block/capsacis_cap_0.png | Bin 1565 -> 0 bytes .../textures/block/capsacis_cap_1.png | Bin 1563 -> 0 bytes .../textures/block/capsacis_cap_2.png | Bin 1554 -> 0 bytes .../textures/block/capsacis_cap_3.png | Bin 1540 -> 0 bytes .../textures/block/capsacis_cap_4.png | Bin 1520 -> 0 bytes .../textures/block/capsacis_cap_5.png | Bin 1506 -> 0 bytes .../textures/block/capsacis_cap_6.png | Bin 1480 -> 0 bytes .../textures/block/capsacis_cap_7.png | Bin 1477 -> 0 bytes .../textures/block/capsacis_cap__22.png | Bin 2233 -> 0 bytes .../textures/block/capsacis_log_side.png | Bin 1837 -> 0 bytes .../textures/block/capsacis_log_side_2.png | Bin 1839 -> 0 bytes .../textures/block/capsacis_log_side_3.png | Bin 1842 -> 0 bytes .../textures/block/capsacis_log_top.png | Bin 1741 -> 0 bytes .../textures/block/capsacis_planks.png | Bin 2864 -> 0 bytes .../block/capsacis_stripped_log_side.png | Bin 432 -> 0 bytes .../block/capsacis_stripped_log_top.png | Bin 374 -> 0 bytes 26 files changed, 39 insertions(+), 237 deletions(-) delete mode 100644 src/main/java/ru/betterend/world/biome/CapsacisForestBiome.java delete mode 100644 src/main/java/ru/betterend/world/biome/HangingGardensBiome.java delete mode 100644 src/main/java/ru/betterend/world/features/trees/CapsacisTreeFeature.java delete mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_cap.png delete mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_cap_0.png delete mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_cap_1.png delete mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_cap_2.png delete mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_cap_3.png delete mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_cap_4.png delete mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_cap_5.png delete mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_cap_6.png delete mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_cap_7.png delete mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_cap__22.png delete mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_log_side.png delete mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_log_side_2.png delete mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_log_side_3.png delete mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_log_top.png delete mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_planks.png delete mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_stripped_log_side.png delete mode 100644 src/main/resources/assets/betterend/textures/block/capsacis_stripped_log_top.png diff --git a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java index 54b3fcc1..05020b72 100644 --- a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java @@ -1,7 +1,12 @@ package ru.betterend.blocks.entities; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + import com.google.common.collect.Lists; import com.google.common.collect.Maps; + import it.unimi.dsi.fastutil.objects.Object2IntMap.Entry; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import net.minecraft.block.BlockState; @@ -17,7 +22,12 @@ import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.nbt.CompoundTag; -import net.minecraft.recipe.*; +import net.minecraft.recipe.BlastingRecipe; +import net.minecraft.recipe.Recipe; +import net.minecraft.recipe.RecipeFinder; +import net.minecraft.recipe.RecipeInputProvider; +import net.minecraft.recipe.RecipeType; +import net.minecraft.recipe.RecipeUnlocker; import net.minecraft.screen.PropertyDelegate; import net.minecraft.screen.ScreenHandler; import net.minecraft.text.Text; @@ -35,10 +45,6 @@ import ru.betterend.client.gui.EndStoneSmelterScreenHandler; import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.registry.EndBlockEntities; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity implements SidedInventory, RecipeUnlocker, RecipeInputProvider, Tickable { private static final int[] TOP_SLOTS = new int[] { 0, 1 }; diff --git a/src/main/java/ru/betterend/mixin/common/ServerPlayNetworkHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/ServerPlayNetworkHandlerMixin.java index d0644012..471ed720 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerPlayNetworkHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerPlayNetworkHandlerMixin.java @@ -1,5 +1,13 @@ package ru.betterend.mixin.common; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.network.NetworkThreadUtils; @@ -10,13 +18,6 @@ import net.minecraft.server.world.ServerWorld; import net.minecraft.text.LiteralText; import net.minecraft.util.Formatting; import net.minecraft.util.math.BlockPos; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.betterend.blocks.entities.ESignBlockEntity; @Mixin(ServerPlayNetworkHandler.class) diff --git a/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java b/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java index ed57ad0a..ae19c112 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java @@ -1,30 +1,35 @@ package ru.betterend.mixin.common; -import com.mojang.authlib.GameProfile; -import net.minecraft.entity.Entity; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.packet.s2c.play.*; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.PlayerManager; -import net.minecraft.server.network.ServerPlayNetworkHandler; -import net.minecraft.server.network.ServerPlayerInteractionManager; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.TeleportTarget; -import net.minecraft.world.World; -import net.minecraft.world.WorldProperties; -import net.minecraft.world.biome.source.BiomeAccess; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import com.mojang.authlib.GameProfile; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.network.packet.s2c.play.DifficultyS2CPacket; +import net.minecraft.network.packet.s2c.play.EntityStatusEffectS2CPacket; +import net.minecraft.network.packet.s2c.play.PlayerAbilitiesS2CPacket; +import net.minecraft.network.packet.s2c.play.PlayerRespawnS2CPacket; +import net.minecraft.network.packet.s2c.play.WorldEventS2CPacket; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.PlayerManager; +import net.minecraft.server.network.ServerPlayNetworkHandler; import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.network.ServerPlayerInteractionManager; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.TeleportTarget; +import net.minecraft.world.World; +import net.minecraft.world.WorldProperties; +import net.minecraft.world.biome.source.BiomeAccess; import ru.betterend.interfaces.TeleportingEntity; @Mixin(ServerPlayerEntity.class) diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index dc20d7ac..90fe5c39 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -43,7 +43,6 @@ import ru.betterend.world.biome.BiomePaintedMountains; import ru.betterend.world.biome.BiomeShadowForest; import ru.betterend.world.biome.BiomeSulphurSprings; import ru.betterend.world.biome.BiomeUmbrellaJungle; -import ru.betterend.world.biome.CapsacisForestBiome; import ru.betterend.world.biome.EndBiome; import ru.betterend.world.generator.BELayerRandomSource; import ru.betterend.world.generator.BiomePicker; @@ -84,8 +83,6 @@ public class EndBiomes { public static final EndBiome BLOSSOMING_SPIRES = registerBiome(new BiomeBlossomingSpires(), BiomeType.LAND); public static final EndBiome SULPHUR_SPRINGS = registerBiome(new BiomeSulphurSprings(), BiomeType.LAND); public static final EndBiome UMBRELLA_JUNGLE = registerBiome(new BiomeUmbrellaJungle(), BiomeType.LAND); - public static final EndBiome CAPSACIS_FOREST = registerSubBiome(new CapsacisForestBiome(), CHORUS_FOREST); - //public static final EndBiome HANGING_GARDENS = registerBiome(new HangingGardensBiome(), BiomeType.LAND); // Better End Void public static final EndBiome ICE_STARFIELD = registerBiome(new BiomeIceStarfield(), BiomeType.VOID); diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 50dfbff9..44050d9e 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -20,7 +20,6 @@ import ru.betterend.blocks.BulbVineBlock; import ru.betterend.blocks.BulbVineLanternBlock; import ru.betterend.blocks.BulbVineLanternColoredBlock; import ru.betterend.blocks.BulbVineSeedBlock; -import ru.betterend.blocks.CapsacisCapBlock; import ru.betterend.blocks.CharniaBlock; import ru.betterend.blocks.ChorusGrassBlock; import ru.betterend.blocks.DenseEmeraldIceBlock; @@ -193,22 +192,6 @@ public class EndBlocks { public static final Block JELLYSHROOM_CAP_PURPLE = registerBlock("jellyshroom_cap_purple", new JellyshroomCapBlock(217, 142, 255, 164, 0, 255)); public static final WoodenMaterial JELLYSHROOM = new WoodenMaterial("jellyshroom", MaterialColor.PURPLE, MaterialColor.LIGHT_BLUE); - // Tree from original concept (+ modifications) - public static final Block CAPSACIS_SAPLING = registerBlock("capsacis_sapling", new UmbrellaTreeSaplingBlock()); - public static final Block CAPSACIS_CAP = registerBlock("capsacis_cap", new CapsacisCapBlock()); - public static final WoodenMaterial CAPSACIS = new WoodenMaterial("capsacis", MaterialColor.PURPLE, MaterialColor.LIGHT_BLUE); - - // Small ecosystem tree - //public static final WoodenMaterial INANIS = new WoodenMaterial("inanis", MaterialColor.PURPLE, MaterialColor.LIGHT_BLUE); - - // Tree from Yuki's ide - //public static final Block CEMINUS_SAPLING = registerBlock("ceminus_sapling", new UmbrellaTreeSaplingBlock()); - //public static final Block CEMINUS_GRID = registerBlock("ceminus_grid", new UmbrellaTreeMembraneBlock()); - //public static final WoodenMaterial CEMINUS = new WoodenMaterial("ceminus", MaterialColor.PURPLE, MaterialColor.LIGHT_BLUE); - - // For megacolonies - //public static final Block VOID_COLONY_MEMBRANE = registerBlock("void_colony_membrane", new UmbrellaTreeMembraneBlock()); - // Small Plants // public static final Block UMBRELLA_MOSS = registerBlock("umbrella_moss", new UmbrellaMossBlock()); public static final Block UMBRELLA_MOSS_TALL = registerBlock("umbrella_moss_tall", new UmbrellaMossTallBlock()); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index de96bdbc..da3e61c1 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -43,7 +43,6 @@ import ru.betterend.world.features.terrain.SulphurHillFeature; import ru.betterend.world.features.terrain.SulphuricCaveFeature; import ru.betterend.world.features.terrain.SulphuricLakeFeature; import ru.betterend.world.features.terrain.SurfaceVentFeature; -import ru.betterend.world.features.trees.CapsacisTreeFeature; import ru.betterend.world.features.trees.DragonTreeFeature; import ru.betterend.world.features.trees.HelixTreeFeature; import ru.betterend.world.features.trees.JellyshroomFeature; @@ -64,7 +63,6 @@ public class EndFeatures { public static final EndFeature HELIX_TREE = new EndFeature("helix_tree", new HelixTreeFeature(), 2); public static final EndFeature UMBRELLA_TREE = new EndFeature("umbrella_tree", new UmbrellaTreeFeature(), 4); public static final EndFeature JELLYSHROOM = new EndFeature("jellyshroom", new JellyshroomFeature(), 3); - public static final EndFeature CAPSACIS = new EndFeature("capsacis", new CapsacisTreeFeature(), 3); // Bushes // public static final EndFeature PYTHADENDRON_BUSH = new EndFeature("pythadendron_bush", new BushFeature(EndBlocks.PYTHADENDRON_LEAVES, EndBlocks.PYTHADENDRON.bark), 4); diff --git a/src/main/java/ru/betterend/world/biome/CapsacisForestBiome.java b/src/main/java/ru/betterend/world/biome/CapsacisForestBiome.java deleted file mode 100644 index eaefb4ef..00000000 --- a/src/main/java/ru/betterend/world/biome/CapsacisForestBiome.java +++ /dev/null @@ -1,24 +0,0 @@ -package ru.betterend.world.biome; - -import net.minecraft.entity.EntityType; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndFeatures; -import ru.betterend.registry.EndSounds; - -public class CapsacisForestBiome extends EndBiome { - public CapsacisForestBiome() { - super(new BiomeDefinition("capsacis_forest") - .setSurface(EndBlocks.CHORUS_NYLIUM) - .setMusic(EndSounds.MUSIC_FOREST) - .setWaterAndFogColor(84, 61, 127) - .setFoliageColor(71, 45, 120) - .setFogColor(78, 71, 92) - .setFogDensity(1.5F) - .addFeature(EndFeatures.CAPSACIS) - .addFeature(EndFeatures.PURPLE_POLYPORE) - .addFeature(EndFeatures.TAIL_MOSS_WOOD) - .addFeature(EndFeatures.TAIL_MOSS) - .addFeature(EndFeatures.CHORUS_GRASS) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4)); - } -} diff --git a/src/main/java/ru/betterend/world/biome/HangingGardensBiome.java b/src/main/java/ru/betterend/world/biome/HangingGardensBiome.java deleted file mode 100644 index 3a6e2161..00000000 --- a/src/main/java/ru/betterend/world/biome/HangingGardensBiome.java +++ /dev/null @@ -1,18 +0,0 @@ -package ru.betterend.world.biome; - -import net.minecraft.entity.EntityType; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndSounds; - -public class HangingGardensBiome extends EndBiome { - public HangingGardensBiome() { - super(new BiomeDefinition("hanging_gardens") - .setSurface(EndBlocks.SHADOW_GRASS, EndBlocks.CHORUS_NYLIUM) - .setMusic(EndSounds.MUSIC_FOREST) - .setWaterAndFogColor(84, 61, 127) - .setFoliageColor(71, 45, 120) - .setFogColor(78, 71, 92) - .setFogDensity(1.5F) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4)); - } -} \ No newline at end of file diff --git a/src/main/java/ru/betterend/world/features/trees/CapsacisTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/CapsacisTreeFeature.java deleted file mode 100644 index 12eae23b..00000000 --- a/src/main/java/ru/betterend/world/features/trees/CapsacisTreeFeature.java +++ /dev/null @@ -1,146 +0,0 @@ -package ru.betterend.world.features.trees; - -import java.util.List; -import java.util.Random; - -import com.google.common.base.Function; -import com.google.common.collect.Lists; - -import net.minecraft.block.BlockState; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import ru.betterend.blocks.BlockProperties; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndTags; -import ru.betterend.util.MHelper; -import ru.betterend.util.SplineHelper; -import ru.betterend.util.sdf.SDF; -import ru.betterend.util.sdf.operator.SDFFlatWave; -import ru.betterend.util.sdf.operator.SDFScale; -import ru.betterend.util.sdf.operator.SDFSmoothUnion; -import ru.betterend.util.sdf.operator.SDFTranslate; -import ru.betterend.util.sdf.operator.SDFUnion; -import ru.betterend.util.sdf.primitive.SDFCappedCone; -import ru.betterend.util.sdf.primitive.SDFSphere; -import ru.betterend.world.features.DefaultFeature; - -public class CapsacisTreeFeature extends DefaultFeature { - private static final Function REPLACE; - private static final List ROOT; - - @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; - - int height = MHelper.randRange(20, 30, random); - List spline = SplineHelper.makeSpline(0, 0, 0, 0, height * 0.2F, 0, 5); - - BlockPos center = pos.up(9); - if (!SplineHelper.canGenerate(spline, center, world, REPLACE)) { - return false; - } - - BlockState woodState = EndBlocks.CAPSACIS.bark.getDefaultState(); - BlockState logState = EndBlocks.CAPSACIS.log.getDefaultState(); - BlockState capState = EndBlocks.CAPSACIS_CAP.getDefaultState(); - - SplineHelper.offsetParts(spline, random, 0.5F, 0, 0.5F); - SDF sdf = SplineHelper.buildSDF(spline, 2.5F, 0.8F, (bpos) -> { - return woodState; - }); - - final float scale = config == null ? 1 : MHelper.randRange(1, 1.5F, random); - final float offset = height * 0.2F; - final float radius = height * 0.25F; - final float heightScale = radius * 2 * scale; - final int count = MHelper.randRange(5, 7, random); - final float angle = random.nextFloat() * MHelper.PI2; - SDF cap = makeCap(offset, radius, count, angle, capState); - - sdf = new SDFUnion().setSourceA(sdf).setSourceB(cap); - SDF roots = makeRoots(world, center, height * 0.4F, random, woodState); - if (roots != null) { - sdf = new SDFUnion().setSourceA(sdf).setSourceB(roots); - } - sdf = new SDFScale().setScale(scale).setSource(sdf); - - sdf.addPostProcess((info) -> { - if (EndBlocks.CAPSACIS.isTreeLog(info.getStateUp()) && EndBlocks.CAPSACIS.isTreeLog(info.getStateDown())) { - return logState; - } - else if (info.getState().equals(capState)) { - double off = Math.cos(Math.atan2(info.getPos().getX() - pos.getX(), info.getPos().getZ() - pos.getZ()) * count + angle) * 2; - int color = (int) ((info.getPos().getY() - pos.getY() - radius) / heightScale * 7 + off); - color = 7 - MathHelper.clamp(color, 0, 7); - return info.getState().with(BlockProperties.COLOR, color); - } - return info.getState(); - }).fillRecursive(world, center); - - return true; - } - - private SDF makeCap(float offset, float radius, int count, float angle, BlockState capState) { - SDF cap = new SDFSphere().setRadius(radius).setBlock(capState); - SDF cone = new SDFCappedCone().setRadius1(radius).setRadius2(radius * 0.4F).setHeight(radius * 0.3F).setBlock(capState); - cone = new SDFTranslate().setTranslate(0, radius * 0.3F, 0).setSource(cone); - cap = new SDFSmoothUnion().setRadius(5).setSourceA(cap).setSourceB(cone); - SDF upperSphere = new SDFSphere().setRadius(radius * 0.4F).setBlock(capState); - upperSphere = new SDFTranslate().setTranslate(0, radius * 0.6F, 0).setSource(upperSphere); - cap = new SDFSmoothUnion().setRadius(5).setSourceA(cap).setSourceB(upperSphere); - cap = new SDFFlatWave().setAngle(angle).setRaysCount(count).setIntensity(1F).setSource(cap); - - cap = new SDFTranslate().setTranslate(0, offset, 0).setSource(cap); - - return cap; - } - - private SDF makeRoots(StructureWorldAccess world, BlockPos pos, float radius, Random random, BlockState state) { - int count = (int) (radius * 0.7F); - SDF roots = null; - for (int i = 0; i < count; i++) { - float angle = (float) i / (float) count * MHelper.PI2; - float scale = radius * MHelper.randRange(0.85F, 1.15F, random); - - List branch = SplineHelper.copySpline(ROOT); - SplineHelper.rotateSpline(branch, angle); - SplineHelper.scale(branch, scale); - SplineHelper.offsetParts(branch, random, 0.5F, 0.7F, 0.5F); - SDF sdf = SplineHelper.buildSDF(branch, 2F, 1F, (p) -> { return state; }); - roots = roots == null ? sdf : new SDFUnion().setSourceA(sdf).setSourceB(roots); - } - return roots; - /*for (int i = 0; i < count; i++) { - float angle = (float) i / (float) count * MHelper.PI2; - float scale = radius * MHelper.randRange(0.85F, 1.15F, random); - - List branch = SplineHelper.copySpline(ROOT); - SplineHelper.rotateSpline(branch, angle); - SplineHelper.scale(branch, scale); - SplineHelper.offsetParts(branch, random, 0.5F, 0.7F, 0.5F); - Vector3f last = branch.get(branch.size() - 1); - if (world.getBlockState(pos.add(last.getX(), last.getY(), last.getZ())).isIn(EndTags.GEN_TERRAIN)) { - SplineHelper.fillSpline(branch, world, state, pos, REPLACE); - } - }*/ - } - - static { - REPLACE = (state) -> { - return EndBlocks.CAPSACIS.isTreeLog(state) || state.getMaterial().isReplaceable(); - }; - - ROOT = Lists.newArrayList( - new Vector3f(0F, 1F, 0), - new Vector3f(0.1F, 0.7F, 0), - new Vector3f(0.3F, 0.3F, 0), - new Vector3f(0.7F, 0.05F, 0), - new Vector3f(0.8F, -0.2F, 0) - ); - SplineHelper.offset(ROOT, Vector3f.NEGATIVE_Y); - } -} diff --git a/src/main/resources/assets/betterend/textures/block/capsacis_cap.png b/src/main/resources/assets/betterend/textures/block/capsacis_cap.png deleted file mode 100644 index ba60d3393b42fd6e39b58b761d110f85fc0aec47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2189 zcmbVO3ry5@96s3y4-s|X6oaOeIo!0g*L${l^0?zQIYlH23?IF=a0Tw#T`SzdHkmpz zi7sf2ZVXh^ndv6()Uid$bfUz?h#=yEMAXdr07V_cfsf4TG^K*`1o`mw0>5ROty*yM6B08-g<@=we2h_)S4>eTyqmbR zbSd4OOwzn9l45uZ8|kzO0Ig8WjdBVUoySU$h0WpY2Kd486EMUv26(B)jF|-^YvmG) z9PHwv1!;6q9!)TC)I4aelLQ1dR-z!ME#EGZP6Ir^OMOtswsX*3tSms zt0V~|iWU|YMi#0fc}EVaBnSe0w z0R~P7L$C=RTDv%uCXg`HNeQSj5|cw305Y@(C#-Vh4~R1~%I32+)-H(vtMp(6D=+b) zm46Pk=kYTFAhl+*M`KhkHk(I6l;R3N7()pe6)mQ@1QtzYMShioX5$Kg&2TvyfiyZ; zO5z=9JfA;YsFY#LkkKd?Mi0$g%GnvdP<&&=9@a!jtO3R`TnS2sDD`PLPRd{1EKEgW z*dWx*GhDW7RH&N7o`r(0VJM0EPcTE1*}TI>ftWcPmBXTfJqLz7nIw&TKJNg+z@2Kq zh1pCd*+q%6(`=H-0E4h2IgTMIy^_{bv>wsvFbc8g)EHvXXtEK4VsL`OD2rCd4DUDb z^eVZy^8Ud-XLuTL{H;n5p#QYl7DSEFYJ}CR)d->0GKiAG37XMhI>0*2w$Q+6obI%a;aPjA5Gr`{_X4SCx93@FTP^eVlwFR8;lt*v`{b#v3~?5>L9E`vC}XpU=g zE?7Y?I3d4(V*XE^T>y94I ztyNaqqfYtGno%;I;Lo&fSr&Z-nr8TZb?(N`kKFrqVO?EiM9JEV4O6}dn7F^3b-5NV z5Bbvf@rMUma|1t>+{Ze4H(Uy3s;^li?$j?TZ27vjeEzKHDmQ#+a^Qp=3GJaLP~z<$ zD?0sSy)SHB6ssjxl|MsP<=vfS1&_7k zBld*v?7eZ*l+@S#KzDoglirTxJlBKkCGOH!c5mu?^7E0cJxCnd_M^I|x^Q(Xa%9~CVMBT8=dMdh8hdHv=eoHDJk z%(y8EjpSx_Gua|gTpWGH&Q+_a`(oy=^ zv7o&|O+))7apvxWYr4X*!0+}@_e0lBst@^S{rjOlcbn_BH{RL)Am`-%O7FK;2Gx9! zTYvZR>gJna(Z`#vw>EXYcE>N{C$sY2$D5Y4^&iiwhV;qx+@c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6Sh*NEJGweq8k<@=n;RMeS(Lv8`kW|!2W%(B!Jx1#)91+cfRGI6`b z5T|)iy(zfeVuVw#KF~4xpvXmvY?u%*1%a6GqzmN06Mt$RFvS-ElXgMQXJD>i>h*MS z45_%K66Bp7>?mTFp7w69=j1zPxwE!y3w2p4)*AG}N#oJARwcag`}0KBIBwy{%zUZ5wzu-R+V^vhD}v4^%`pBvH-F#fvj>m2x;JtZPw-rL zf0^Iqt5w@PAIJopzQX9RP(6^ZQ-;awOQ`8h*C~>MpJGp6<9+#GLG_Pe{-WI3bJP;7 zmObLW-|o;jA=2=VyFA;A?=kwyn+-T>Ufk7vAfPd0!pu!8k0#hZIK$Fx z_~h&J`JTNyY*hSZ&bI)LBf1$O1s_gKnmd!%t#eKl|9$5Z_de!Tsmwe!G5Kib!>ud# zx6Mx7yKv?E#8saktal$?{e}ZgG;#OjKPck>-@=rGqdZS-M7y7ch$?gl@S+f zGwI}_?GeSt7iWFyu@4UjW@wwb`trf0GCZ-3+_#sVW4ZrfLGxWZRm~4xRdd^&8dA23 h$-G~F<%~Te8-rlGoBg{>KaxQOwx_F~%Q~loCIEUgRZsu` diff --git a/src/main/resources/assets/betterend/textures/block/capsacis_cap_1.png b/src/main/resources/assets/betterend/textures/block/capsacis_cap_1.png deleted file mode 100644 index 59df594a19ef2f48bace117a3b89c69aae40e716..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1563 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6Sh*NEJGweqnwwfWn;RMeS(Lv8`kW|!2W%(B!Jx1#)91+cfRGI6`b z6sLJmy(zfeVun+%KF~4xpvXmvY?u%*1%a6GqzmN06Mt$RFvS-EllJ@wQC0>9rfyFc z$B>F!DnZ`aB8~#Z0=GJ{KGBx<gw%vKRJ{j*%y3ckiT;+fBn^jhi8{b8nv&ycp zJt)I(hyv??%JW$ur!4yv){7v8OxM48`FaG zyu4(->{?{5=DsBH=eO?cjhzz=cW=M?ZJjH_2luD! z(K+|8zip_wJ=^(emx5J8UG)1Wm6_)v_w+p9Xy?QMyFY6FteVRyQxK*l7B5n#VIYwGb&~Bc;z4b%Ij$lIQ0w$(s38 zqT#d!lW?5tQpURMJ)52yu~dIuzwpAY@X~MT_))d!v1CwJ0Dd!iayD#)${U~%@S7X_d_5YqkE}i>tLtbaNd*$6z><+S5 zh04?#!YlS3x7nz@KYc%wsv4i~ex)q7Eo^ru`6|r~Nb1&0Z(fp zxZST~n2-EE=**|%sCi+l3M1<@-=I?sAD7-)sic2>&dTa{r`F7rne`;1l{;zS;mfMe zzf81T({-%J*j`PF#cFAUPj$EIiTR6n&OfzXbA7V)5skJhjOEUCMF!^^j|)Wm+Me<4 dSh=5xhao1|T{Qa7mtUab+SAp~Wt~$(69D-cMR))J diff --git a/src/main/resources/assets/betterend/textures/block/capsacis_cap_2.png b/src/main/resources/assets/betterend/textures/block/capsacis_cap_2.png deleted file mode 100644 index 90826dd369edc96e14a2960e17e6769f0eaa9f34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1554 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6Sh*NEyPBA}8JJo+n;ROsI$1h9895tU zxVTwbx*EG#I>Yq3+b4WhYLT0-lZlf9f72sZ54}Ybn#28f{&4@p z{Ey+|E7f$@Jsk>*1ew$XV>}n_KAE@aonKjcS=Fx7_ac_-y;}XOTEuSkn)DOj4dyfH zw_H9jr^PHGp<719mO&vz=whNkz|L~@Ohvi0l@HQtFK=G+zggterd6!V-rs6j+wA!z z=!K`+ndF6&Wi)+U%VvmLN{HKq^`Dx<%qgt&|8z;xmiWTmx&I!#eziI_EAO?wp!?-l zr?l=1c1*m=)%v)g;VvKByJpwm{SU6rh^#xbmgh;>lP;D^3A)kzp;A{F+-6_7;az5O zglo^bH&cBt=AN?M8!hrwajw-uDJ9o9R&}+FyZGC6KN~+0XcXe;pXA0}vFC%!y1j?{ zbvK{Sxjg0N>^y~CxnFkQIT={!cBzxPX z3LJ2L$>UMEG=lv{Vv=*if{oux(lqAGaAf(_!KU0{s=~-~dBUz#eNL711u{2oG};9_ z&v$)xYSP37IyYD*3Gz$kFnnpNdMC1J!o>HPuXRqZNWUHV<$LMjt*n7MU9-CR8~RIw zl@z<0R`4E}to!${;+*Az{eBzcCyBBpANY5Tce(rLj({Hl1;Ki$ z^Xdzl-BGb;L!T^BmMd1#U)5@oHvP?0=3=LY`ztM5F8owJc-wQIr-z`|@(UkBX3U%N cwVsKG;lfYz6Lme)^g*Sxr>mdKI;Vst0P*}!`2YX_ diff --git a/src/main/resources/assets/betterend/textures/block/capsacis_cap_3.png b/src/main/resources/assets/betterend/textures/block/capsacis_cap_3.png deleted file mode 100644 index e71f7d3568183030cbab92029d3bd24654dd3ac4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1540 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6Sh*NEyPBA}nV4ESn;ROsI$1h9895tU zxVTwbx*EG#I>Yq3s9EANRHzZ)M{*=xj0Cu zJY-}Lh+|)IhPTUDuYF0(I zsn6?TmP+~Xt-E~Kj#{Ps{U!GsyN{%tFn zl373Xwr^INTH;#KqU%eoJvD({ z`IUUqmFIE2Qrc-x_e9@WcrO2D%DH06%XfeMnxwO|tS0`Nw#np6D<*7Q2qxQZ&nDdOS z>-|q=ZnlFa8ex5JcYJdZ zRcW_5n0WY%!KSiL$KP`OnB=|H)aWw9nlqhiSEl&MC|+G*m-|TlM}*+|?&&QN2Csuw zMxELf_~Jn3>ynj48~p;ipUt1SytuCJ%;T2!?ljBAH8_5}?NQc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6Sh*NEyPBA}S(sWnn;ROsI$1h9895tU zxVTwbx*EG#I>Yq3U*w(8Nw2cY3X4`2J}9nVH<5vf+e35>-{01w3m)w8 z5j`t#!1vC|0u~P6tYbB&RMelj#|!OlT`zRG)IfX34$*t@<^H?@imig(49u6`9}tv? zC^Vmck()o~_7-ukROaoxlIQ(ew$2xtwroOqj`g?Wd|cd1@AM_V$SACS)hF&_d)!CB zMvSf5%53!=nSi2mcUSrdc>33-zYSrH{_%-ne{6yO$tebBYG%#c(sMFi&MhK#bAQ;K zS2N!pD^dx1F~Mx{N7=edX1{OMHtk)U5Wl!nK5RwRbn~cZeOnLOMwJKEJYSz9abLf# z#3)*Kd(iYq74<)@_RlA6dy+VLy3(Ki__Y}<*MqKaKQ-^bw$IL`%zE?L|3t9MUeqw$ z$R3}t?#Q)2Zwn2B8p@P{8(wz)e0ngJlO@tU{e#ZFh8UN^2aS^FdnaG`XR>>i$>f(F zZK-R%+?f;WvenAeA(#2(?;{H?{xZ$V(ErxsuebK8Q<|`ZX3||HQ;jlN-d7b}rcALi z>rYu;o1?x*w)4xErW+;c7GEEUJe9APaPVxj lnwd49aoV)AU+bB87_OZN&|0;_{R*fI_H^}gS?83{1OUWPG)n*g diff --git a/src/main/resources/assets/betterend/textures/block/capsacis_cap_5.png b/src/main/resources/assets/betterend/textures/block/capsacis_cap_5.png deleted file mode 100644 index d479ebacb13395097e569c2e98546cd7ff7e1ce9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1506 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 diff --git a/src/main/resources/assets/betterend/textures/block/capsacis_cap_7.png b/src/main/resources/assets/betterend/textures/block/capsacis_cap_7.png deleted file mode 100644 index 6bb18653d1cacee7da439cdc28d0dfbc04294592..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1477 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6Sh*Ov7#mr*S(;ipn;ROsI$1h9895tU zxVTwbx*EG#I>Yq3etkdV2=D2y|n#-3Kcv>2WUXZovS+2%!A~kDo<-e7g z+2z5fC-L9D-a9wdEAZCw8k0P~km#0K2No86dc%LWsnMus{?_+ODskf1-QMKcC_bFB z*dfGgS{?V*WizfBoD~Z7(b_Y8rqCxXf9^M~d{rj}I(w%!POV#Tl`U=UmK$F$Fr7AieU7VUIcu+~H3xj1LdrhOZ~%e@nF71?}Q?&@2o(-E%BSF+33mi*^p zF=ER0mJB+kq4es*p}!Xj7e~a2PQP1Yz!tgs|7x3y*^SKYuWXxM%vYuRRd>=xeu9M*ruSi|U9Au`?Jzrby(muv_t$SPl1TnmS u*0gq;cZSxEtNL#?EdC^LgR%ENmjS~IFMEZ95_+Hlo59o7&t;ucLK6Uml_whj diff --git a/src/main/resources/assets/betterend/textures/block/capsacis_cap__22.png b/src/main/resources/assets/betterend/textures/block/capsacis_cap__22.png deleted file mode 100644 index a54a1a07203ad5ae61b55e39bd2c8d0fea113abe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2233 zcmbVO2~ZPf6kZMmQJe}MDWYB1idIbaNKDAq$Q1-Ei5N2l5s%GgLspY)++8jm&mJh^ z)r!j5;yE~uV{OITR`IIGppK$|XB|aaZ7XWAw$}d3kx{GGac6e--`(%M_r3SM|IIE; zHpT}Agakkk6quNxH-Y;*(&_IFuFIC&)!^2}oiJX2psvBv=>-*+${?syHET{4Qw>QZ z%{dj6m9sF49H$$gA!tNoj+>&VF(PbXGFX=m`EAel2+Ue_NXl>nW^l(cb~a%K&y1U4 zG}AMt(ON4KIT9X`Ljng*Mx@{zr^6+XIXa}(FA3JtYZQT7A>uS05-kOUQw_;*EXOnO zaD`e<<0=ByXcf2`(-Nv-FoEG36w{!%QjXyyrY4nIxcxvtG~Q|>P5M#ovA~lKv5TUc zMA7W*Y(=(G!SNX=uGMN$j6exO4iIu7*CkRpa+ff$!-Jj?Xr6V8Ea!qHkCcVW6mu!u0bp?t)@|oRPOx*Y zaP9g0TmVp7gTWKyrCgj&PY6Mb%K~Y%7v!aA!JO-6P!l6?nLN$JWdWK4rEJ_}EYDCP z$D29M(IHfF2W2=mRuU!x9+JYktX#J6!810Do)Q@yLSO_AB$MN6Go~VOpdAs8DM<`# zgBmz1Ys-BB8et{~5(nsr=b)f#tdvOoFW5?xHjZ~vAZOM|WiY7Qm4U#XN|LdhgX2M9 zz)so9!eAg1U4lrtXeLpwLqOUJmbH>LjIb#w8zHw@aL|!96(f(p2}VvUtr`Z$G=v4m zJM8rwohgaiVQ&TYG^Mdc&=#d!ZPBXbmfXbF>$mB(Tmn{0WB=M`sJ!c+W^&WnJ zs=m6{bj7>(1NYrA&57&*eLh^dqW8qmiJYT$OMPKj(;Of3l5c#ToGyypq?&cO^TuCf zyY8N8{ItAFVc+djSvGXhu;poKCR3OoYG!yr!x}DxoG`AR*A#cVZhJw?&XenHU7SAt z0v>vH?bYg*m|n6}{m>2a+^Wf{3ElOuuW;&Gd2RC-{~Z2dWaw=1j5(~c=^hlHJoGrT z{P*DEAOA2a)_)w;^C#l^MDKk;MF-~=j9+!)q^xqc=Jeg4g^K%6GwjpL0?Lf3jqm?C zRW)not@?Ap-j`zzrT6;0ep}Dtmb6j*yoh5hMY3_j*`@oF3s;ua72ak}O?Ys(t~79U zNC`T zkGX>Ug|+#RUv%T0l!}75^8=18ZCV~b_5RKHt(ns*nsoL@eSOId6RXeo*Bb8l-OEdV zIC#^S_oC6u`1aa;4{IMNFV>;m;tv|XV|v`a@X5nnQ^NTaL+w@c%2=H2Kf8Eq`It4M zc3xlEWB24ay5kMzC4B#yN8$IcS8v*L``Wg56VgL72RH0mFko)?fK!XZ`?$Gn4K=fu z)MFyL{z^mCCIXVh^S?6+bqeTlSIoJvVit6NNEX*~hz58a3|AOWwWr?)~2H z|NXzEg)^p)N_;j^qtT3VIqkFHoUD%F@$kK3rOyPX5u$UhtkEQ;sv}Ob_T4m%W=Id` zDN#z?FH(#U(9x_=33Q==2+?kuQJ zQA7&Eg2A9JNa_Ts3e%g-W(+4Vg3v;QR<7d}I;7?034;uFATtstDxAP0DkEJf)F>7d zYC2#-K#bAya@0-GVOWS3F})5~O^N_nCWaGhB!5IW%V59{0)SU!h}FliqEAo+*(dxB zb?o>70noK>cTC13bqNGwB4ou;3(bf+P;S;qzqp9)f0j2!bMU%J?7@W(`X#^uK~xhVlwhfQB}60lErcB433fF;7x9!7oTqFw~BW zXyJBKE?!n>o&heq1%+noIF6-&*JL0_6QjieVbrpup;Bu$n2lP(U^HjrS)>7&OoR9B z0#l;~ckn*@Kkv_!I9Ob?|FL=0l2fySa&j_^S6#Fyiok;C%FiK@M4)I!O>hg!sF4LM z8vV>Ywg(1igFXOB{~_E1Fj?>_L0SUVD(J2Ml2I7cA5*Jwz!dCZDqBr8>tuk3?Ms4vD*a0$tkJ|>blI(*j8l_VooPzdC);nfUtNErv9)AG@=RxcQuD#) zo+GJKOGkg__mX2SWcQV7$(bCxkXZq)qc8zsz*=cn3{ruLN4KECwe$KQ8t>)PSy7?W!lmg)63b$o{BUckC19`mIPEx%dR_Hp^Ow4(Sc zmoL?q@9dq}{c`v+Q`SEXt<*@TPw^>tyO&%G&YjbdF#W1_*Rju&N=jQA<1ZcwAKZ60 z4O#q!?dz=e+E2F9Jt;~<9I<@M(akqLDkFPOK9|l`Z*rA(>#wwjrgq3VtLEvR_`_R} zUF@ov-&FC{=(ypB8n!(aWa&%bj(+2(d!Yu~r&`-1J6=; zkQRsYtZihWxp7zVj|rWJepuVPd;dN@wZ5n9X#3Tz7B*);h{&4TFYbp3m(RjG9V*Hxk;X_Pam6;pE9cRC3+uTYdH(Wop!kUp-f24G7=b!a& VGg|+p9r@}H&E=S3-!`>k(O5FANIlAMWct^B~d-MtU)ZgVr>Ku$Si;N&Yw_jVu0#@+6^yT=`v zHECvyRHRwKG}GvW`TZT1sSIhRIFketQ`bkK;zmzTBC&@4bD$_xpeU zw>B?#=BSYmk3EDJQ8)1L0*zhzv;{+Xj>d}2PQoc=fC@glMg|2n zxh}S*lC^QzjHl4)K?)N1fXbjjpI1<*AdQ81DY(`?;}{x(sFgI9rU^ugoq1@6Cqpsi++{Hpr(T+ z_@oG}poHB79fk)P2`BZ0W>N^qu@Ri)m%Sn39E$@l@Bu+pAeM|^r3z6Ml?w51s3XUB z34pG3IwLafsf*7S5uvD=RnUyEL+*)IT-6f5^MNAzWfo*sK{Y38)<{%_3>a0EU83k6 z3RK>Z%4kN078ol!xri4yF`!Jj;|{PhDxfg~VIX11bfnc~ASt7TGTBlHBSjE{P^ZZ8 z<<)r!i=@p659V5QcKjLI9nOA*{Mo&cx_!EJ5h3W{_&JkS5Mdn1}A$Mb@tc zcj!L%Kkv_xd01SG_r7_wlGCz+%H|aquj+776o7@{m6u0Di9j)|mf$qTYLNvT7XHlN zw+9Ak0~G+0{zJG2VTxF;1{fKnd7!ucOGe>Pe_X4^K~wNQTNygLqjHDfupMa2NFRcm zNGAgVY+o|$Q=4li&Yeu3w$-SDXCQ3b4c9zP0$1f>mYd@n^0_QCUpC83JB}=W(?d*&BJRaW*}b3p zwjGOgzdJl>z_Veb<;uXmXOH*9yk;tD%}eR%_8m?c=xj)FcU(Js!gA!$IqUx2>(T;Ii(5%TwW{`#i0?-&FDELK{4%*NVFAdlFYYas~5Ut#XX6u4Tsk0EVOA0{J zOzB3Ju#kwAG7;%GMOt1)NSv@@xD_MJMx3DWblOZI;RA(g3g@AV9Mi&D@X3byG)<;4 zED#8o0%nt>crk*aC=4etk~BhuQLPd+CTJAZq&@}*P+5hSHC_@Cosn@%6`Bo&miD?J z$Prpm4TlK^3=1+cMwoEjr4W!~BRIK2@rT4Y76X1D08vvRmWW_wpQK5uPx=??$mhod zU}&Arh{h9b5rl|@s^wHdH^KpVB3do3k^xo(RH;H?K~5z!GfDSGrtJz~G)XCzB!6F` z3j0h(>~=jd8OQ_|FLF{qO?hMwa4;IMp(IWcFl9y}qnIRUvz4|`6LB+*M~(jG|>80al8FkXPkq8CLXF{JI1Us9kXw96dQcRJ}jQPmic z1$hn|3LQ4_JV(26(vuEw(nw`6xY0vd2&3DY;WmOa51`CewRb~;n(~#N1&HB z-~*8KDT(fdsgg$vFbc@_!f5@MTEd|HnBIrIu3&%nGW6|{p6!FfL7*=q69_&;W*89R z;8Ng(dc%P@4Th+WJV$o%gw?jX3oFjyL*5lWr}qC)Vr-mp>;(E*&GaingX-;rS4#Ic z3H9j(SEDzNIksooiuTQ2Sv|E6etCH9fOvVitG&5SaqUjXsXvuJ@srfyn_qafdeXrk zFAJAmoHM_pXkcQp*B(21QS6M=G2h&`?7J9UcKz4Zk&Ub3YmXG1jKR+KJ2QD@!k5U{ z`$@~DS%uTH-*bVI2RGlU-#Mz=5@V@qb-Lp3(nkXuzfbuX9XS4I;LnZjtqaSyT(!5X z*|7Cq(!DN~xXvVC-n$mNNJ6TwBGS%=IO6?zmG@ zFO+l?CA6Hlvo$MD?EhMG=Z;Nf?Kh4$du*5#NlY~!<&=58M! zAGICn`094lu5ax^%hcKD%bF7(?rC4Lg~=Zj|LNERaf2=5^%d2zUGA>NF<9cxx>MJO zO^rXj4c|1WrJr!CB`V=w&!NS~h~$Q)UsT=leU#rh-uB&b$}wts;?8wlt%qukyi=mQ z{ia`gX(8Hk>25*8&~e_y?(?axk!kPhz(Ftq1 aqt7g#+cvMQ{WtxumX}lD*fn**qQ3yAHji%r diff --git a/src/main/resources/assets/betterend/textures/block/capsacis_log_top.png b/src/main/resources/assets/betterend/textures/block/capsacis_log_top.png deleted file mode 100644 index b45ac0367e736724e08e11a1a177fcd93c40f984..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1741 zcmbVNe{2&~9KUU4VUsx=KV0S?9>*L%;@bc)g2-D`WU_oH_= z+6@ejA8{jD#A#H@B$|ngU;YR|L8D-12w5TvK>`5@x=4UIQGx~&3Hq*U8zlIPOWwWr z?tR|p`}=#nElmw2#TCT}f|U5YOaRW)jWIPJzPG#_wZo}M@wRFRa^DPN&lN3$bX{!^>JQ$Rw@?ko_EX&A(I~Nw! zb%iE~L?U5MSk1B;At_O5-lNQ=WJxW?>lAMJ4 zWnKt(-T|!%S}59LyAukthG%v5U%@;_hh|kS%re3cGk2O zen0J#G@X?=;A31EG}|l)JPoWYXQQ0exSix!++nlX@ftqtz{71$k_uDKHb>Z&z0b&8 zhY{TDeg1#mZ&n3ZTx{%~d5n@XvV!&s8jM$GrYKf`cxDw7&~zfuEN3LR3*(H)0v^kJ z7Vg;tleCE_fTaHr?n#&?hxG)j0(S&@>%U|a0re-0YMeBMxYNq?*=?1Zg~N7WEOUJb zZgQOrNU(jWuusi=v6VrPycc|oJ2-!|BOo>nlhgbwYL`1GiYhON7u`~3Up>-#D6hW$ zI6fZz;q;C3Bb!qC5}ICcaM0Q}>}-C0|E~?b zJLBs@9~|JPp12|HR%g8wDBS~&&s;06Iludxu|o6qs#DAp<7Zd3Tp9au>|#l(q~WWH z&)$E2-;>>W4<7yY7t>=uza6MrGVt_v&zehb)sEB;HZ@-OWZT7xW^;6WEB0H7I$Zku zUf=hH7g}c9Q}4J>jGoH>oSFEj);(*_0qLx%Sps+_)XhpgwvdW*VE z1situ{qgQ2@&2ZtYN_fxpU`EcVOq?%yf6# z7!yH!Bp4L@p@fGLq6r3yK|>5CCN*LVs3h>i_^3Y+{6V4^G(-*PoqY_&w6uzBc6J_n z?)lDl&Uen-7rQzin$~nr6G0HuI@(hie4ZH`lg8oSmtVgRK>51uY<=7MOIAwO$xOv03>ti zE;4Dmh>S)g8ge2}#u5=uViUahAjz{_jA3I8C(tY>vyv<%$l8a(Xs)Kqnbe9J7QR!c zyze_Q!<0&;NJ)s;Za2dv5($Ro8J?%H1?}}(J}A?cH^1&7g*@mQj&Il&8F&P$-Qz11 zjWb>ue0&|47#4rF)YXC zmBo&nbP@1vH*4F4dX>BCe92@osA`;Cw8pSByX4&;0M^!^6!4Kk@hs2MY>ejlEEkpW zSByTu3Np)9P1Ck!=)IvShowPtQkE65h0IAem}1Fkzz3rmYf#p0*916Wh6%b6<5=Ak z8J0m#+6CLiz&JXg5=A;KcUYbeEQmT%3WX^|3`3K7U4)_}a5Mm%h6#vq8t@vR1rG8O z%W}M`Y4!Cf8}X9tBqCkRWL^WFbdKqoPU!K?SrbLBOlL8dVc&&%&aj>jcp-r6aX0 zyXZ?ZbFyimb*lgF<82qu?QfhoarOk|_rF@sPnq}9=A(P~=Qd6Um%l!>VDdYkUo-oQ zr_{a2cIVb!>pT4R%GQRdXIsCwugqDs>&?9#zn*z&aPDdF!MA^~gQxo!Z{P9QstX6E zpZRRy;VsRVbH7D@SSYN#yL|4x8FMGkIRbK1Jyjf;r`sXZG{ z4HQe4y!^I(%Uf2wD!-6~GhBD2`_}Z=&@JCC7yHO(`V)My-_?0;&dp__3WF6EQ?YZwEi0hoa7WKG5O4;^g?>w~bmVrIglG^_oII+X*{a$ptn0C#g4)AYQ2b zT4B`QJTZi3;iPQ+{unBxl*X>6%-L{BEoIyV|-+MM)&^u+7K_KkWjOh5I|0ueR~bxjclUUicb1g_8MdKKJ ze3IC|-P-!`Ag7E@da=t;kTYg_Ng~BKUf_97ppEl%yHRp(1mZpOdLMVuEu7Jx_q;Bb ar~U`F;n<`AqmZ}&0000e;|l<(WnM*4RiZ|_ z5H+Hz0Q4`|N1q?S2ZyttN?Wr&Ey!MVzk z8Q06zWB^9H?OKb21ibgSahymuZMmurO53#r2?Pmtam@t4`XVBh%tl6yW@2WumT+(E z17!MnE%#>PBV-9BgVJQ@Dngz@RkgOkY@`l~)Uq&mZFop2Ena}T+ogGHS(#bLRb%09 zIXESxu5HKw#&KGDa6X=Fg#Uss831g$h7Ao#<2)ocCcwiF<-Moscl#*^*^mF=7g~>{ UXX639=l}o!07*qoM6N<$f~l&gApigX From 90421733363ae75b23e6e9614d09d748748b78a0 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 19 Jan 2021 03:52:51 +0300 Subject: [PATCH 188/463] Glowing grasslands prototype --- .../ru/betterend/blocks/BlockProperties.java | 31 +++ .../ru/betterend/blocks/LumecornBlock.java | 80 ++++++++ .../java/ru/betterend/registry/EndBiomes.java | 2 + .../java/ru/betterend/registry/EndBlocks.java | 3 + .../ru/betterend/registry/EndFeatures.java | 2 + .../world/biome/GlowingGrasslandsBiome.java | 26 +++ .../world/features/bushes/Lumecorn.java | 66 +++++++ .../betterend/blockstates/capsacis_bark.json | 19 -- .../betterend/blockstates/capsacis_cap.json | 12 -- .../betterend/blockstates/capsacis_log.json | 19 -- .../betterend/blockstates/lumecorn.json | 10 + .../materialmaps/block/lumecorn.json | 10 + .../models/block/capsacis_bark_1.json | 6 - .../models/block/capsacis_bark_2.json | 6 - .../models/block/capsacis_bark_3.json | 6 - .../models/block/capsacis_cap_0.json | 6 - .../models/block/capsacis_cap_1.json | 6 - .../models/block/capsacis_cap_2.json | 6 - .../models/block/capsacis_cap_3.json | 6 - .../models/block/capsacis_cap_4.json | 6 - .../models/block/capsacis_cap_5.json | 6 - .../models/block/capsacis_cap_6.json | 6 - .../models/block/capsacis_cap_7.json | 6 - .../models/block/capsacis_log_1.json | 7 - .../models/block/capsacis_log_2.json | 7 - .../models/block/capsacis_log_3.json | 7 - .../models/block/lumecon_middle_big.json | 156 +++++++++++++++ .../models/block/lumecorn_bottom_big.json | 45 +++++ .../models/block/lumecorn_bottom_small.json | 179 ++++++++++++++++++ .../models/block/lumecorn_light_1.json | 22 +++ .../models/block/lumecorn_light_2.json | 22 +++ .../models/block/lumecorn_light_3.json | 22 +++ .../textures/block/lumecorn_bark.png | Bin 0 -> 2026 bytes .../textures/block/lumecorn_leaf_1.png | Bin 0 -> 1840 bytes .../textures/block/lumecorn_leaf_2.png | Bin 0 -> 1154 bytes .../textures/block/lumecorn_light_1.png | Bin 0 -> 1197 bytes .../textures/block/lumecorn_light_2.png | Bin 0 -> 1206 bytes .../textures/block/lumecorn_light_3.png | Bin 0 -> 1255 bytes .../textures/block/lumecorn_roots.png | Bin 0 -> 1906 bytes 39 files changed, 676 insertions(+), 137 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/LumecornBlock.java create mode 100644 src/main/java/ru/betterend/world/biome/GlowingGrasslandsBiome.java create mode 100644 src/main/java/ru/betterend/world/features/bushes/Lumecorn.java delete mode 100644 src/main/resources/assets/betterend/blockstates/capsacis_bark.json delete mode 100644 src/main/resources/assets/betterend/blockstates/capsacis_cap.json delete mode 100644 src/main/resources/assets/betterend/blockstates/capsacis_log.json create mode 100644 src/main/resources/assets/betterend/blockstates/lumecorn.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/lumecorn.json delete mode 100644 src/main/resources/assets/betterend/models/block/capsacis_bark_1.json delete mode 100644 src/main/resources/assets/betterend/models/block/capsacis_bark_2.json delete mode 100644 src/main/resources/assets/betterend/models/block/capsacis_bark_3.json delete mode 100644 src/main/resources/assets/betterend/models/block/capsacis_cap_0.json delete mode 100644 src/main/resources/assets/betterend/models/block/capsacis_cap_1.json delete mode 100644 src/main/resources/assets/betterend/models/block/capsacis_cap_2.json delete mode 100644 src/main/resources/assets/betterend/models/block/capsacis_cap_3.json delete mode 100644 src/main/resources/assets/betterend/models/block/capsacis_cap_4.json delete mode 100644 src/main/resources/assets/betterend/models/block/capsacis_cap_5.json delete mode 100644 src/main/resources/assets/betterend/models/block/capsacis_cap_6.json delete mode 100644 src/main/resources/assets/betterend/models/block/capsacis_cap_7.json delete mode 100644 src/main/resources/assets/betterend/models/block/capsacis_log_1.json delete mode 100644 src/main/resources/assets/betterend/models/block/capsacis_log_2.json delete mode 100644 src/main/resources/assets/betterend/models/block/capsacis_log_3.json create mode 100644 src/main/resources/assets/betterend/models/block/lumecon_middle_big.json create mode 100644 src/main/resources/assets/betterend/models/block/lumecorn_bottom_big.json create mode 100644 src/main/resources/assets/betterend/models/block/lumecorn_bottom_small.json create mode 100644 src/main/resources/assets/betterend/models/block/lumecorn_light_1.json create mode 100644 src/main/resources/assets/betterend/models/block/lumecorn_light_2.json create mode 100644 src/main/resources/assets/betterend/models/block/lumecorn_light_3.json create mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_bark.png create mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_leaf_1.png create mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_leaf_2.png create mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_light_1.png create mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_light_2.png create mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_light_3.png create mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_roots.png diff --git a/src/main/java/ru/betterend/blocks/BlockProperties.java b/src/main/java/ru/betterend/blocks/BlockProperties.java index 4da42d5c..fca28924 100644 --- a/src/main/java/ru/betterend/blocks/BlockProperties.java +++ b/src/main/java/ru/betterend/blocks/BlockProperties.java @@ -119,4 +119,35 @@ public class BlockProperties { return name; } } + + public static enum LumecornShape implements StringIdentifiable { + LIGHT1("light1", 15), + LIGHT2("light2", 14), + LIGHT3("light3", 13), + MIDDLE("middle", 0), + BOTTOM_BIG("bottom_big", 0), + BOTTOM_SMALL("bottom_small", 0); + + private final String name; + private final int light; + + LumecornShape(String name, int light) { + this.name = name; + this.light = light; + } + + @Override + public String asString() { + return name; + } + + @Override + public String toString() { + return name; + } + + public int getLight() { + return light; + } + } } diff --git a/src/main/java/ru/betterend/blocks/LumecornBlock.java b/src/main/java/ru/betterend/blocks/LumecornBlock.java new file mode 100644 index 00000000..c04b1ed5 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/LumecornBlock.java @@ -0,0 +1,80 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.Material; +import net.minecraft.block.ShapeContext; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.EnumProperty; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.BlockView; +import net.minecraft.world.WorldAccess; +import net.minecraft.world.WorldView; +import ru.betterend.blocks.BlockProperties.LumecornShape; +import ru.betterend.blocks.basis.BaseBlockNotFull; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.registry.EndTags; + +public class LumecornBlock extends BaseBlockNotFull implements IRenderTypeable { + public static final EnumProperty SHAPE = EnumProperty.of("shape", LumecornShape.class); + private static final VoxelShape SHAPE_BIG = Block.createCuboidShape(5, 0, 5, 11, 16, 11); + private static final VoxelShape SHAPE_MEDIUM = Block.createCuboidShape(6, 0, 6, 10, 16, 10); + private static final VoxelShape SHAPE_SMALL = Block.createCuboidShape(7, 0, 7, 9, 16, 9); + + public LumecornBlock() { + super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).hardness(0.5F).luminance((state) -> { + return state.get(SHAPE).getLight(); + })); + } + + @Override + protected void appendProperties(StateManager.Builder stateManager) { + stateManager.add(SHAPE); + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + LumecornShape shape = state.get(SHAPE); + if (shape == LumecornShape.LIGHT3) { + return SHAPE_SMALL; + } + else if (shape == LumecornShape.LIGHT2) { + return SHAPE_MEDIUM; + } + else { + return SHAPE_BIG; + } + } + + @Override + public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + LumecornShape shape = state.get(SHAPE); + if (shape == LumecornShape.BOTTOM_BIG || shape == LumecornShape.BOTTOM_SMALL) { + return world.getBlockState(pos.down()).isIn(EndTags.END_GROUND); + } + else { + return world.getBlockState(pos.down()).isOf(this); + } + } + + @Override + public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { + if (!canPlaceAt(state, world, pos)) { + return Blocks.AIR.getDefaultState(); + } + else { + return state; + } + } +} diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index 90fe5c39..5907a212 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -44,6 +44,7 @@ import ru.betterend.world.biome.BiomeShadowForest; import ru.betterend.world.biome.BiomeSulphurSprings; import ru.betterend.world.biome.BiomeUmbrellaJungle; import ru.betterend.world.biome.EndBiome; +import ru.betterend.world.biome.GlowingGrasslandsBiome; import ru.betterend.world.generator.BELayerRandomSource; import ru.betterend.world.generator.BiomePicker; import ru.betterend.world.generator.BiomeType; @@ -83,6 +84,7 @@ public class EndBiomes { public static final EndBiome BLOSSOMING_SPIRES = registerBiome(new BiomeBlossomingSpires(), BiomeType.LAND); public static final EndBiome SULPHUR_SPRINGS = registerBiome(new BiomeSulphurSprings(), BiomeType.LAND); public static final EndBiome UMBRELLA_JUNGLE = registerBiome(new BiomeUmbrellaJungle(), BiomeType.LAND); + public static final EndBiome GLOWING_GRASSLANDS = registerBiome(new GlowingGrasslandsBiome(), BiomeType.LAND); // Better End Void public static final EndBiome ICE_STARFIELD = registerBiome(new BiomeIceStarfield(), BiomeType.VOID); diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 44050d9e..504c8739 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -56,6 +56,7 @@ import ru.betterend.blocks.JellyshroomCapBlock; import ru.betterend.blocks.LacugroveSaplingBlock; import ru.betterend.blocks.LanceleafBlock; import ru.betterend.blocks.LanceleafSeedBlock; +import ru.betterend.blocks.LumecornBlock; import ru.betterend.blocks.MengerSpongeBlock; import ru.betterend.blocks.MengerSpongeWetBlock; import ru.betterend.blocks.MossyGlowshroomCapBlock; @@ -221,6 +222,8 @@ public class EndBlocks { public static final Block SMALL_JELLYSHROOM = registerBlock("small_jellyshroom", new SmallJellyshroomBlock()); + public static final Block LUMECORN = registerBlock("lumecorn", new LumecornBlock()); + // Crops public static final Block BLOSSOM_BERRY = registerBlock("blossom_berry_seed", new EndCropBlock(EndItems.BLOSSOM_BERRY, PINK_MOSS)); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index da3e61c1..ee25cdd2 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -32,6 +32,7 @@ import ru.betterend.world.features.VineFeature; import ru.betterend.world.features.WallPlantFeature; import ru.betterend.world.features.WallPlantOnLogFeature; import ru.betterend.world.features.bushes.BushFeature; +import ru.betterend.world.features.bushes.Lumecorn; import ru.betterend.world.features.bushes.TenaneaBushFeature; import ru.betterend.world.features.terrain.EndLakeFeature; import ru.betterend.world.features.terrain.FloatingSpireFeature; @@ -68,6 +69,7 @@ public class EndFeatures { public static final EndFeature PYTHADENDRON_BUSH = new EndFeature("pythadendron_bush", new BushFeature(EndBlocks.PYTHADENDRON_LEAVES, EndBlocks.PYTHADENDRON.bark), 4); public static final EndFeature DRAGON_TREE_BUSH = new EndFeature("dragon_tree_bush", new BushFeature(EndBlocks.DRAGON_TREE_LEAVES, EndBlocks.DRAGON_TREE.bark), 15); public static final EndFeature TENANEA_BUSH = new EndFeature("tenanea_bush", new TenaneaBushFeature(), 10); + public static final EndFeature LUMECORN = new EndFeature("lumecorn", new Lumecorn(), 5); // Plants // public static final EndFeature UMBRELLA_MOSS = new EndFeature("umbrella_moss", new DoublePlantFeature(EndBlocks.UMBRELLA_MOSS, EndBlocks.UMBRELLA_MOSS_TALL, 5), 5); diff --git a/src/main/java/ru/betterend/world/biome/GlowingGrasslandsBiome.java b/src/main/java/ru/betterend/world/biome/GlowingGrasslandsBiome.java new file mode 100644 index 00000000..f878e85d --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/GlowingGrasslandsBiome.java @@ -0,0 +1,26 @@ +package ru.betterend.world.biome; + +import net.minecraft.entity.EntityType; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndSounds; + +public class GlowingGrasslandsBiome extends EndBiome { + public GlowingGrasslandsBiome() { + super(new BiomeDefinition("glowing_grasslands") + .setFogColor(99, 228, 247) + .setFogDensity(1.3F) + .setMusic(EndSounds.MUSIC_OPENSPACE) + .setSurface(EndBlocks.END_MOSS) + .addFeature(EndFeatures.END_LAKE_RARE) + .addFeature(EndFeatures.LUMECORN) + .addFeature(EndFeatures.UMBRELLA_MOSS) + .addFeature(EndFeatures.CREEPING_MOSS) + .addFeature(EndFeatures.TWISTED_UMBRELLA_MOSS) + .addFeature(EndFeatures.CHARNIA_CYAN) + .addFeature(EndFeatures.CHARNIA_GREEN) + .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) + .addFeature(EndFeatures.CHARNIA_RED_RARE) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + } +} diff --git a/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java b/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java new file mode 100644 index 00000000..5c823cb0 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java @@ -0,0 +1,66 @@ +package ru.betterend.world.features.bushes; + +import java.util.Random; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.blocks.BlockProperties.LumecornShape; +import ru.betterend.blocks.LumecornBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; +import ru.betterend.world.features.DefaultFeature; + +public class Lumecorn extends DefaultFeature { + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + int height = MHelper.randRange(3, 6, random); + Mutable mut = new Mutable().set(pos); + for (int i = 1; i < height; i++) { + mut.move(Direction.UP); + if (!world.isAir(mut)) { + return false; + } + } + mut.set(pos); + if (height == 3) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.BOTTOM_SMALL)); + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.LIGHT2)); + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.LIGHT3)); + return true; + } + boolean tall = random.nextBoolean(); + if (tall) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.BOTTOM_BIG)); + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.MIDDLE)); + height -= 2; + } + else { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.BOTTOM_SMALL)); + height --; + } + boolean smallBottom = height > 2 && random.nextBoolean(); + for (int i = 0; i < height; i++) { + int size = i - height + 4; + size = MathHelper.clamp(size, 1, 3); + if (smallBottom && i == 0) { + size ++; + } + if (size == 1) { + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.LIGHT1)); + } + else if (size == 2) { + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.LIGHT2)); + } + else { + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.LIGHT3)); + } + } + return false; + } +} diff --git a/src/main/resources/assets/betterend/blockstates/capsacis_bark.json b/src/main/resources/assets/betterend/blockstates/capsacis_bark.json deleted file mode 100644 index 98418992..00000000 --- a/src/main/resources/assets/betterend/blockstates/capsacis_bark.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "variants": { - "axis=x": [ - { "model": "betterend:block/capsacis_bark_1", "x": 90, "y": 90 }, - { "model": "betterend:block/capsacis_bark_2", "x": 90, "y": 90 }, - { "model": "betterend:block/capsacis_bark_3", "x": 90, "y": 90 } - ], - "axis=y": [ - { "model": "betterend:block/capsacis_bark_1" }, - { "model": "betterend:block/capsacis_bark_2" }, - { "model": "betterend:block/capsacis_bark_3" } - ], - "axis=z": [ - { "model": "betterend:block/capsacis_bark_1", "x": 90 }, - { "model": "betterend:block/capsacis_bark_2", "x": 90 }, - { "model": "betterend:block/capsacis_bark_3", "x": 90 } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/capsacis_cap.json b/src/main/resources/assets/betterend/blockstates/capsacis_cap.json deleted file mode 100644 index 4c051cb8..00000000 --- a/src/main/resources/assets/betterend/blockstates/capsacis_cap.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "variants": { - "color=0": { "model": "betterend:block/capsacis_cap_0" }, - "color=1": { "model": "betterend:block/capsacis_cap_1" }, - "color=2": { "model": "betterend:block/capsacis_cap_2" }, - "color=3": { "model": "betterend:block/capsacis_cap_3" }, - "color=4": { "model": "betterend:block/capsacis_cap_4" }, - "color=5": { "model": "betterend:block/capsacis_cap_5" }, - "color=6": { "model": "betterend:block/capsacis_cap_6" }, - "color=7": { "model": "betterend:block/capsacis_cap_7" } - } -} diff --git a/src/main/resources/assets/betterend/blockstates/capsacis_log.json b/src/main/resources/assets/betterend/blockstates/capsacis_log.json deleted file mode 100644 index 62fca081..00000000 --- a/src/main/resources/assets/betterend/blockstates/capsacis_log.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "variants": { - "axis=x": [ - { "model": "betterend:block/capsacis_log_1", "x": 90, "y": 90 }, - { "model": "betterend:block/capsacis_log_2", "x": 90, "y": 90 }, - { "model": "betterend:block/capsacis_log_3", "x": 90, "y": 90 } - ], - "axis=y": [ - { "model": "betterend:block/capsacis_log_1" }, - { "model": "betterend:block/capsacis_log_2" }, - { "model": "betterend:block/capsacis_log_3" } - ], - "axis=z": [ - { "model": "betterend:block/capsacis_log_1", "x": 90 }, - { "model": "betterend:block/capsacis_log_2", "x": 90 }, - { "model": "betterend:block/capsacis_log_3", "x": 90 } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/lumecorn.json b/src/main/resources/assets/betterend/blockstates/lumecorn.json new file mode 100644 index 00000000..d78ebe45 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/lumecorn.json @@ -0,0 +1,10 @@ +{ + "variants": { + "shape=light1": { "model": "betterend:block/lumecorn_light_1" }, + "shape=light2": { "model": "betterend:block/lumecorn_light_2" }, + "shape=light3": { "model": "betterend:block/lumecorn_light_3" }, + "shape=middle": { "model": "betterend:block/lumecon_middle_big" }, + "shape=bottom_big": { "model": "betterend:block/lumecorn_bottom_big" }, + "shape=bottom_small": { "model": "betterend:block/lumecorn_bottom_small" } + } +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/lumecorn.json b/src/main/resources/assets/betterend/materialmaps/block/lumecorn.json new file mode 100644 index 00000000..bba3fb7d --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/lumecorn.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/lumecorn_light_1", + "material": "betterend:glow_inc" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/capsacis_bark_1.json b/src/main/resources/assets/betterend/models/block/capsacis_bark_1.json deleted file mode 100644 index 7d89f680..00000000 --- a/src/main/resources/assets/betterend/models/block/capsacis_bark_1.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/cube_all", - "textures": { - "all": "betterend:block/capsacis_log_side" - } -} diff --git a/src/main/resources/assets/betterend/models/block/capsacis_bark_2.json b/src/main/resources/assets/betterend/models/block/capsacis_bark_2.json deleted file mode 100644 index b0844d4e..00000000 --- a/src/main/resources/assets/betterend/models/block/capsacis_bark_2.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/cube_all", - "textures": { - "all": "betterend:block/capsacis_log_side_2" - } -} diff --git a/src/main/resources/assets/betterend/models/block/capsacis_bark_3.json b/src/main/resources/assets/betterend/models/block/capsacis_bark_3.json deleted file mode 100644 index 4b266581..00000000 --- a/src/main/resources/assets/betterend/models/block/capsacis_bark_3.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/cube_all", - "textures": { - "all": "betterend:block/capsacis_log_side_3" - } -} diff --git a/src/main/resources/assets/betterend/models/block/capsacis_cap_0.json b/src/main/resources/assets/betterend/models/block/capsacis_cap_0.json deleted file mode 100644 index 81bef2fb..00000000 --- a/src/main/resources/assets/betterend/models/block/capsacis_cap_0.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/cube_all", - "textures": { - "all": "betterend:block/capsacis_cap_0" - } -} diff --git a/src/main/resources/assets/betterend/models/block/capsacis_cap_1.json b/src/main/resources/assets/betterend/models/block/capsacis_cap_1.json deleted file mode 100644 index 88b91485..00000000 --- a/src/main/resources/assets/betterend/models/block/capsacis_cap_1.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/cube_all", - "textures": { - "all": "betterend:block/capsacis_cap_1" - } -} diff --git a/src/main/resources/assets/betterend/models/block/capsacis_cap_2.json b/src/main/resources/assets/betterend/models/block/capsacis_cap_2.json deleted file mode 100644 index 3ce9ed12..00000000 --- a/src/main/resources/assets/betterend/models/block/capsacis_cap_2.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/cube_all", - "textures": { - "all": "betterend:block/capsacis_cap_2" - } -} diff --git a/src/main/resources/assets/betterend/models/block/capsacis_cap_3.json b/src/main/resources/assets/betterend/models/block/capsacis_cap_3.json deleted file mode 100644 index bad70714..00000000 --- a/src/main/resources/assets/betterend/models/block/capsacis_cap_3.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/cube_all", - "textures": { - "all": "betterend:block/capsacis_cap_3" - } -} diff --git a/src/main/resources/assets/betterend/models/block/capsacis_cap_4.json b/src/main/resources/assets/betterend/models/block/capsacis_cap_4.json deleted file mode 100644 index d87e3a0c..00000000 --- a/src/main/resources/assets/betterend/models/block/capsacis_cap_4.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/cube_all", - "textures": { - "all": "betterend:block/capsacis_cap_4" - } -} diff --git a/src/main/resources/assets/betterend/models/block/capsacis_cap_5.json b/src/main/resources/assets/betterend/models/block/capsacis_cap_5.json deleted file mode 100644 index 834740b8..00000000 --- a/src/main/resources/assets/betterend/models/block/capsacis_cap_5.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/cube_all", - "textures": { - "all": "betterend:block/capsacis_cap_5" - } -} diff --git a/src/main/resources/assets/betterend/models/block/capsacis_cap_6.json b/src/main/resources/assets/betterend/models/block/capsacis_cap_6.json deleted file mode 100644 index 130d8da0..00000000 --- a/src/main/resources/assets/betterend/models/block/capsacis_cap_6.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/cube_all", - "textures": { - "all": "betterend:block/capsacis_cap_6" - } -} diff --git a/src/main/resources/assets/betterend/models/block/capsacis_cap_7.json b/src/main/resources/assets/betterend/models/block/capsacis_cap_7.json deleted file mode 100644 index af98b021..00000000 --- a/src/main/resources/assets/betterend/models/block/capsacis_cap_7.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/cube_all", - "textures": { - "all": "betterend:block/capsacis_cap_7" - } -} diff --git a/src/main/resources/assets/betterend/models/block/capsacis_log_1.json b/src/main/resources/assets/betterend/models/block/capsacis_log_1.json deleted file mode 100644 index 4fdebd0d..00000000 --- a/src/main/resources/assets/betterend/models/block/capsacis_log_1.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column", - "textures": { - "end": "betterend:block/capsacis_log_top", - "side": "betterend:block/capsacis_log_side" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/capsacis_log_2.json b/src/main/resources/assets/betterend/models/block/capsacis_log_2.json deleted file mode 100644 index 94e439e1..00000000 --- a/src/main/resources/assets/betterend/models/block/capsacis_log_2.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column", - "textures": { - "end": "betterend:block/capsacis_log_top", - "side": "betterend:block/capsacis_log_side_2" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/capsacis_log_3.json b/src/main/resources/assets/betterend/models/block/capsacis_log_3.json deleted file mode 100644 index 150ba53c..00000000 --- a/src/main/resources/assets/betterend/models/block/capsacis_log_3.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column", - "textures": { - "end": "betterend:block/capsacis_log_top", - "side": "betterend:block/capsacis_log_side_3" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecon_middle_big.json b/src/main/resources/assets/betterend/models/block/lumecon_middle_big.json new file mode 100644 index 00000000..b51bf2d0 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecon_middle_big.json @@ -0,0 +1,156 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/lumecorn_bark", + "texture": "betterend:block/lumecorn_bark", + "leaf_2": "betterend:block/lumecorn_leaf_2", + "leaf_1": "betterend:block/lumecorn_leaf_1" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 5, 0, 5 ], + "to": [ 11, 16, 11 ], + "faces": { + "down": { "uv": [ 8, 0, 14, 6 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 8, 0, 14, 6 ], "texture": "#texture", "cullface": "up" }, + "north": { "uv": [ 2, 0, 8, 16 ], "texture": "#texture" }, + "south": { "uv": [ 2, 0, 8, 16 ], "texture": "#texture" }, + "west": { "uv": [ 2, 0, 8, 16 ], "texture": "#texture" }, + "east": { "uv": [ 2, 0, 8, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY4", + "from": [ 11, 14, 0 ], + "to": [ 27, 14.001, 16 ], + "rotation": { "origin": [ 11, 14, 0 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 90 } + } + }, + { + "__comment": "PlaneY4", + "from": [ 11, 15, 0 ], + "to": [ 19, 15.001, 16 ], + "rotation": { "origin": [ 11, 15, 0 ], "axis": "z", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#leaf_1", "rotation": 90 } + } + }, + { + "__comment": "PlaneY4", + "from": [ -11, 13.999, 0 ], + "to": [ 5, 14, 16 ], + "rotation": { "origin": [ 5, 14, 0 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 270 }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2", "rotation": 270 } + } + }, + { + "__comment": "PlaneY4", + "from": [ -3, 14.999, 0 ], + "to": [ 5, 15, 16 ], + "rotation": { "origin": [ 5, 15, 0 ], "axis": "z", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 16 ], "texture": "#leaf_1", "rotation": 270 }, + "up": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1", "rotation": 270 } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 14, 11 ], + "to": [ 16, 14.001, 27 ], + "rotation": { "origin": [ 0, 14, 11 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 180 } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 15, 10.999 ], + "to": [ 16, 23, 11 ], + "rotation": { "origin": [ 0, 15, 11 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "north": { "uv": [ 16, 16, 0, 8 ], "texture": "#leaf_1", "rotation": 180 }, + "south": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1" } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 13.999, -11 ], + "to": [ 16, 14, 5 ], + "rotation": { "origin": [ 0, 14, 5 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 180 }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2" } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 15, 4.999 ], + "to": [ 16, 23, 5 ], + "rotation": { "origin": [ 0, 15, 5 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 16, 16, 0, 8 ], "texture": "#leaf_1", "rotation": 180 }, + "south": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1" } + } + }, + { + "__comment": "PlaneY24", + "from": [ 13, 14, -2.5 ], + "to": [ 21, 14.001, 5.5 ], + "rotation": { "origin": [ 13, 14, -2.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 4, 8, 12, 0 ], "texture": "#leaf_1" }, + "up": { "uv": [ 4, 0, 12, 8 ], "texture": "#leaf_1" } + } + }, + { + "__comment": "PlaneY24", + "from": [ 10.5, 14, 5 ], + "to": [ 18.5, 14.001, 13 ], + "rotation": { "origin": [ 18.5, 15, 13 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 4, 8, 12, 0 ], "texture": "#leaf_1", "rotation": 180 }, + "up": { "uv": [ 4, 0, 12, 8 ], "texture": "#leaf_1", "rotation": 180 } + } + }, + { + "__comment": "PlaneY24", + "from": [ -5, 14, 10.5 ], + "to": [ 3, 14.001, 18.5 ], + "rotation": { "origin": [ 3, 15, 18.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 4, 8, 12, 0 ], "texture": "#leaf_1", "rotation": 180 }, + "up": { "uv": [ 4, 0, 12, 8 ], "texture": "#leaf_1", "rotation": 180 } + } + }, + { + "__comment": "PlaneY24", + "from": [ -2.4999, 14, 3 ], + "to": [ 5.5001, 14.001, 11 ], + "rotation": { "origin": [ -2.5, 15, 3 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 4, 8, 12, 0 ], "texture": "#leaf_1" }, + "up": { "uv": [ 4, 0, 12, 8 ], "texture": "#leaf_1" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_bottom_big.json b/src/main/resources/assets/betterend/models/block/lumecorn_bottom_big.json new file mode 100644 index 00000000..c751a83e --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_bottom_big.json @@ -0,0 +1,45 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/lumecorn_bark", + "texture": "betterend:block/lumecorn_bark", + "roots": "betterend:block/lumecorn_roots" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 5, 0, 5 ], + "to": [ 11, 16, 11 ], + "faces": { + "down": { "uv": [ 8, 6, 14, 12 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 8, 0, 14, 6 ], "texture": "#texture", "cullface": "up" }, + "north": { "uv": [ 2, 0, 8, 16 ], "texture": "#texture" }, + "south": { "uv": [ 2, 0, 8, 16 ], "texture": "#texture" }, + "west": { "uv": [ 2, 0, 8, 16 ], "texture": "#texture" }, + "east": { "uv": [ 2, 0, 8, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0, 0, 0 ], + "to": [ 0.001, 16, 22.5 ], + "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#roots" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#roots" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, 0, 0 ], + "to": [ 16.001, 16, 22.5 ], + "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#roots" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#roots" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_bottom_small.json b/src/main/resources/assets/betterend/models/block/lumecorn_bottom_small.json new file mode 100644 index 00000000..c2a96a29 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_bottom_small.json @@ -0,0 +1,179 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/lumecorn_bark", + "texture": "betterend:block/lumecorn_bark", + "leaf_2": "betterend:block/lumecorn_leaf_2", + "leaf_1": "betterend:block/lumecorn_leaf_1", + "roots": "betterend:block/lumecorn_roots" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 5, 0, 5 ], + "to": [ 11, 16, 11 ], + "faces": { + "down": { "uv": [ 8, 0, 14, 6 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 8, 0, 14, 6 ], "texture": "#texture", "cullface": "up" }, + "north": { "uv": [ 2, 0, 8, 16 ], "texture": "#texture" }, + "south": { "uv": [ 2, 0, 8, 16 ], "texture": "#texture" }, + "west": { "uv": [ 2, 0, 8, 16 ], "texture": "#texture" }, + "east": { "uv": [ 2, 0, 8, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY4", + "from": [ 11, 14, 0 ], + "to": [ 27, 14.001, 16 ], + "rotation": { "origin": [ 11, 14, 0 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 90 } + } + }, + { + "__comment": "PlaneY4", + "from": [ 11, 15, 0 ], + "to": [ 19, 15.001, 16 ], + "rotation": { "origin": [ 11, 15, 0 ], "axis": "z", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#leaf_1", "rotation": 90 } + } + }, + { + "__comment": "PlaneY4", + "from": [ -11, 13.999, 0 ], + "to": [ 5, 14, 16 ], + "rotation": { "origin": [ 5, 14, 0 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 270 }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2", "rotation": 270 } + } + }, + { + "__comment": "PlaneY4", + "from": [ -3, 14.999, 0 ], + "to": [ 5, 15, 16 ], + "rotation": { "origin": [ 5, 15, 0 ], "axis": "z", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 16 ], "texture": "#leaf_1", "rotation": 270 }, + "up": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1", "rotation": 270 } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 14, 11 ], + "to": [ 16, 14.001, 27 ], + "rotation": { "origin": [ 0, 14, 11 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 180 } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 15, 10.999 ], + "to": [ 16, 23, 11 ], + "rotation": { "origin": [ 0, 15, 11 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "north": { "uv": [ 16, 16, 0, 8 ], "texture": "#leaf_1", "rotation": 180 }, + "south": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1" } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 13.999, -11 ], + "to": [ 16, 14, 5 ], + "rotation": { "origin": [ 0, 14, 5 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 180 }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2" } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 15, 4.999 ], + "to": [ 16, 23, 5 ], + "rotation": { "origin": [ 0, 15, 5 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 16, 16, 0, 8 ], "texture": "#leaf_1", "rotation": 180 }, + "south": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1" } + } + }, + { + "__comment": "PlaneY24", + "from": [ 13, 14, -2.5 ], + "to": [ 21, 14.001, 5.5 ], + "rotation": { "origin": [ 13, 14, -2.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 4, 8, 12, 0 ], "texture": "#leaf_1" }, + "up": { "uv": [ 4, 0, 12, 8 ], "texture": "#leaf_1" } + } + }, + { + "__comment": "PlaneY24", + "from": [ 10.5, 14, 5 ], + "to": [ 18.5, 14.001, 13 ], + "rotation": { "origin": [ 18.5, 15, 13 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 4, 8, 12, 0 ], "texture": "#leaf_1", "rotation": 180 }, + "up": { "uv": [ 4, 0, 12, 8 ], "texture": "#leaf_1", "rotation": 180 } + } + }, + { + "__comment": "PlaneY24", + "from": [ -5, 14, 10.5 ], + "to": [ 3, 14.001, 18.5 ], + "rotation": { "origin": [ 3, 15, 18.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 4, 8, 12, 0 ], "texture": "#leaf_1", "rotation": 180 }, + "up": { "uv": [ 4, 0, 12, 8 ], "texture": "#leaf_1", "rotation": 180 } + } + }, + { + "__comment": "PlaneY24", + "from": [ -2.4999, 14, 3 ], + "to": [ 5.5001, 14.001, 11 ], + "rotation": { "origin": [ -2.5, 15, 3 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 4, 8, 12, 0 ], "texture": "#leaf_1" }, + "up": { "uv": [ 4, 0, 12, 8 ], "texture": "#leaf_1" } + } + }, + { + "__comment": "PlaneX14", + "from": [ 0, 0, 0 ], + "to": [ 0.001, 16, 22.5 ], + "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#roots" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#roots" } + } + }, + { + "__comment": "PlaneX14", + "from": [ 16, 0, 0 ], + "to": [ 16.001, 16, 22.5 ], + "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#roots" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#roots" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_light_1.json b/src/main/resources/assets/betterend/models/block/lumecorn_light_1.json new file mode 100644 index 00000000..c7c70e16 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_light_1.json @@ -0,0 +1,22 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/lumecorn_light_1", + "texture": "betterend:block/lumecorn_light_1" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 5, 0, 5 ], + "to": [ 11, 16, 11 ], + "faces": { + "down": { "uv": [ 5, 5, 11, 11 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 5, 5, 11, 11 ], "texture": "#texture", "cullface": "up" }, + "north": { "uv": [ 5, 0, 11, 16 ], "texture": "#texture" }, + "south": { "uv": [ 5, 0, 11, 16 ], "texture": "#texture" }, + "west": { "uv": [ 5, 0, 11, 16 ], "texture": "#texture" }, + "east": { "uv": [ 5, 0, 11, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_light_2.json b/src/main/resources/assets/betterend/models/block/lumecorn_light_2.json new file mode 100644 index 00000000..866e326b --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_light_2.json @@ -0,0 +1,22 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/lumecorn_light_1", + "texture": "betterend:block/lumecorn_light_1" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 6, 0, 6 ], + "to": [ 10, 16, 10 ], + "faces": { + "down": { "uv": [ 6, 6, 10, 10 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 6, 6, 10, 10 ], "texture": "#texture", "cullface": "up" }, + "north": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, + "south": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, + "west": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, + "east": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_light_3.json b/src/main/resources/assets/betterend/models/block/lumecorn_light_3.json new file mode 100644 index 00000000..771c759e --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_light_3.json @@ -0,0 +1,22 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/lumecorn_light_1", + "texture": "betterend:block/lumecorn_light_1" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 7, 0, 7 ], + "to": [ 9, 16, 9 ], + "faces": { + "down": { "uv": [ 7, 7, 9, 9 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 7, 7, 9, 9 ], "texture": "#texture", "cullface": "up" }, + "north": { "uv": [ 7, 0, 9, 16 ], "texture": "#texture" }, + "south": { "uv": [ 7, 0, 9, 16 ], "texture": "#texture" }, + "west": { "uv": [ 7, 0, 9, 16 ], "texture": "#texture" }, + "east": { "uv": [ 7, 0, 9, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_bark.png b/src/main/resources/assets/betterend/textures/block/lumecorn_bark.png new file mode 100644 index 0000000000000000000000000000000000000000..fa71da05affbec3b375bd5f7ded7c9c54ba90548 GIT binary patch literal 2026 zcmbVN4Qvx-7%qk}Ko>fP2!!Z)gG7GXyX)V2mmScx-CCe!KUIc7^m_NTJ+|H*cel0M zBH>3tq9X*A$d59ELc|0CHRvX6fMbyg0Tf3vmj#qygbAbx1ZCoP>knu)v)JT%f6x1T z&-1?T_uj^Ge_7u6spEAzU7pwDs)T2~c8nbZ|DR6YXW(g^GMpF$#&}eMXq~QjUR+|>8lWOU5atCMz0uZ=B0NW-XV#VK!XIZN}z~!G7BKQ zFte1Ry6d6DwAm2^yX%3VX2Ur)8!OexwS#HmSPayHD1<4{6_M2`MMPCpBH}Pf$iB{| zLZX~9U{p~Kh+=J~%HRB3q|rFcZ(gc-&z(JDhf#m2~3-;VyBw ztrnNvYDUu!hY~!plBGyv5dbOw)o~BEQ3|GrAvMOxz!8S!9Z^%K;@Aiy zgaMqI7^*qNwE2>BQ#v`j)!7yk7j~ zC3f4%FTo>sy~|E*eQ!gdr`XvNnYyRD`|RF|z$xqZ(=K(*TRi24jb1ddH@xBpCU_;e z8_jp$+tsu0_<{cRC!c%gLTAOBm#=otaeUQ!tn}2~f@jXQwUu2Il9RYQo4QNJzjoOC zyrV=|n6r;L{$h1UQ_r_?{oLXMyFXQkM-Z5f3+S~B^ zq?~~zhu?Z;bAB$Z{+2g=oqq0V?8sSzqQMR|oiQA^Ci~qNB0FdKZ%>%`b$(%iuW@5* ze@pqt`fbhU&!cMB$);PM=WMAt_gVji75IWGJ-2VctiN`w-j(c}aX+`{sX(GJ^kdDf Zu@jo_Ez7N3c24^md){!N z1aa3FQgYNBP3++WRdz#BO(S>;i6#2Y7=_CoF-AAP#(z`W?)y0ty9aXrfTHW4U%BLwo{>T z5gkEO)sw24uT^=t#sVS{tEvI8eZQoLYQflHd8)=B9-1gbvNX%!db^ll5?9^l;e5Vs z+QZRw1)5MrDKqtNC|hn2=5J8kaw0V0X26LAH>emUR0K50he#~SElDEh&-gL{It^VO z#ClyB#_M%KHbY}^Vmc^@ko9NMWnDO)SA_{HgSB`O$J60}CmacceZeTrFwy>S)aT^` zY}6B@{r+$?R*T)MOL(8b{Qu(+1umoNGQ>?G$uNs3P05nLE)Ew_^Qw*$hqLRk`X0Np z^deoFL}E-=Wl-)%PFg1eRR=vAJE+8p8@mr|7)#k=;*x=zW~#ca_n~L2S9u9*!|l#N z!P=rB(tubqS$(*k;LVk+LR!cnOnH09{iBU4Fhk9l1*oHN7MFKZObd^j06BivkD z>vOX4m8;Gti2AczFQ@o6f%g;dt#ltYTIXK-{=&tDSKjWtdS8whUZ!3c)0mH%^QoP4 zbsg+LXUWl6T3Y?1dF19V4WIAm?Y)?C9tf>8Jy{}mFE~DMfHuOncDFRMyvR6TpKTdk zI`e7)_zyUDfu(bg)*WwHEzMk;4L==ooalIH?>QnCn`=Ay&QEtdKJ(|bgI9KaQr~r` zx%JZgvE4@;pyjjQn=afBoT+sCuge{?O^pva=Px}!@Ww*-*WbiHbfmsLW!||bdFcG{ zvvosXg2)^TZe0FqZEWc|loFhe{5)1_FCPB5qxHw@p83U>Ppy2n`cfnD@X_~wcxEx$ fwVgS=ZJXOkWN)0lBC3rit#8_3bcjFEpL+2x?EY9+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_leaf_2.png b/src/main/resources/assets/betterend/textures/block/lumecorn_leaf_2.png new file mode 100644 index 0000000000000000000000000000000000000000..9ab93d96e3dbc01fea29664b51139c2ba269ae33 GIT binary patch literal 1154 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SQ$8)IJ#Pzn3!6+8WZ1Ks{ z#WAGfR??sU|LvJo8#)`E3_h?KG#qLOuu$3m|DXJHJGGpyiKY!V;|1FmNFU?aJa^(m zL7ks}Kk&1q)v2+W*_v(mvEF;XM4j!=vj@};bBQs3bo?U2$mce}hI^OqnKwQOyb1@F zoncE~e3_?AW`2#~*xTV7BSTsSLp#c2f)*X7jPc+wF1YoW0w8 zozs;+zgn%O9Mzgd8geF0n3!7e^9kb&-bIzHEeB>@SNAe}we2wFn6V@%z(Esy?t#jM{`hO2Xm<19T-mI9T9s7J@ QIH*+cboFyt=akR{01P{V4gdfE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_light_1.png b/src/main/resources/assets/betterend/textures/block/lumecorn_light_1.png new file mode 100644 index 0000000000000000000000000000000000000000..459f8269f0ad86760479e67cfa278b7690a76a57 GIT binary patch literal 1197 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SQ$7PS-2XR8k<_W8WEaktacj!t(|(5y1YFn8HF=lKsI*6n!$mOuK>laNKkTQqR^Dn+>61S*qs#TRSKsE2 zl(V+RGpm*Ne7CTje^vZ$)gBSmup&O@?t_vwYs?>QF>`-XaMkVZVgXAwd#CE|xw*+p z3l9_*R*Oi7Y;#PN@~BEuud<$Q`AZ>hqbd6=j|VGvc+Nji(LU>lY3aUGVH%rF9n)V5 zhpgl6etb?RE=|i}GGp7cYcuS29GGirdEi3IfqNzYlitawDP1z#9(`Mv#i%fsE#qBO{*}Q!f7|AHLQi8(OxQEgT%RTCda|Ng z&7sx14)c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SQ$7PS-2XRnwwg>8W(;Dv-l&~f_`|7G$Wes=#>+C+jw_$CzX6q!2%`??LUe+vaY2mrQ z`LBUiOGDzGtM4B+`(>q2iUQdoY6QA#HI5mHxsrM3| zw3@k*B~od#c1&RYxH6`Du4bT$WO$rG%|S(zLdHp_c)Xt~{_!=fS+K+5snnaCo6XKU zxaHi<-zPk4JkaWw{$aXxV(z=gOiau7CMH*8%Q3X>IN&sU^@bp>rTeLA^tz(g3xLbUh UU31-`a!^U)>FVdQ&MBb@0Ps(vO8@`> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_light_3.png b/src/main/resources/assets/betterend/textures/block/lumecorn_light_3.png new file mode 100644 index 0000000000000000000000000000000000000000..6415a37a12bc1fb69dc06084de3111258f2413a4 GIT binary patch literal 1255 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SQ$8)IJ#Pz7?@hR8Wm~`ac z+>eh-8zduEyEcdyv6*{V2pO=1ziT;`StD_ZNAQ8s$?6*y%>x_%7tCB&eWOB}g-4CW zWa|d=W0=v*UTQv+e~?&mWAj4s}fCP2KmN_w@tWt;eozbico?kK1O& z8?`h03bJLSw{~$)ImuN#voFDHYVzt&1@fXh7JJt+PZN)?P?t+J+sn@De`wyJNM5y| zfYLj&7#=ab|K_m3ZE1hvy{->QCKEe-*Tnt~|FraeZ%Xj`+D@(wmt(K3d$J+Hq<&q; ze?htQkOc3&S}HeGPOlEEyU4b!FTCU1fh)nuDvXK~yHpP7?iKxe>F&3=xy{cbD^)*e aA7E%*#MS+5;pxMmqQ}$K&t;ucLK6URkGymM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_roots.png b/src/main/resources/assets/betterend/textures/block/lumecorn_roots.png new file mode 100644 index 0000000000000000000000000000000000000000..56434d06759f787420a25b2c3559b19674250c45 GIT binary patch literal 1906 zcmb_dTZrRS7>*3oy^RhmEPD|QSp;QGbCRY>6Q+*YHgyVi9A=9<%0BFwoRc<8laom@ z({?~tc2RagpS*$kpuPw`=$qgLW>FDj5nS*^R1gQBh4sM)h5DzL?1(cmils?TPQL&0 z{r`8)xwg3Q$n>F;hd7R#uFqGO;5n0C2Xb(~_tyc2$H8#^iJ0RKA5E`2xYyn|&T+Yy zz2Z z5k0rL&~!Fe9fJsS5Am}-6CC(7!FLBXUR4kbB{Qc4qGqw&vB-_Ou-vP5s^yQ|~4*$=6-L}RudITYZhC!ylR-hdRx zWcOigZ_psg%!!lPhU-yhSSI2~v_pM>#lT9=@(kN7VR4)7QH1PsR*KN9L=-11YBJWD zba`>&g|Af7u9o=w&wBx3-S~l&)7XYqaYD<2f)pA0Ey_j{x?U`pMfD6Smp|RZ2?Hu#qg=XDz#^R!fRqs3A?W?ApZkvB-mU zhCBbw2XRc7MLq^mcs_1XDGXWypEbv4{`&!o7hR0XjzCc4xmODv>e96Z>wPg3FzX0}UZlmM1bA#g3Vqba6zj7PNO? zq8`~fZ5*^H?3$90GEKLaf6r%s5*!8GmCw#)@xStsQbMCvNh3+!?&9#ct1o;tb7bo4 z;%A?)eR%n!+;#N|XXoBr{i1c?dyaf(aj)dAD%`j3g`3abn5n(`>FnFv_q=YGrXRlh c&I{KLb6EZ9=P&W^o%B?!+Y8nA&R)FyCzuXd`~Uy| literal 0 HcmV?d00001 From 1168ec55b03a18f39a9faabbc15e70ee6a0aa8a4 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 19 Jan 2021 18:57:50 +0300 Subject: [PATCH 189/463] Lumecorn update --- .../betterend/blockstates/lumecorn.json | 6 +- .../materialmaps/block/lumecorn.json | 12 ++ .../models/block/lumecorn_middle.json | 133 ++++++++++++++++++ .../models/block/lumecorn_roots_big.json | 32 +++++ .../models/block/lumecorn_roots_small.json | 133 ++++++++++++++++++ .../textures/block/lumecorn_bark.png | Bin 2026 -> 0 bytes .../textures/block/lumecorn_big_petal.png | Bin 0 -> 1623 bytes .../textures/block/lumecorn_leaf_1.png | Bin 1840 -> 1950 bytes .../textures/block/lumecorn_leaf_2.png | Bin 1154 -> 1231 bytes .../textures/block/lumecorn_light_2.png | Bin 1206 -> 0 bytes .../textures/block/lumecorn_light_3.png | Bin 1255 -> 0 bytes .../textures/block/lumecorn_roots.png | Bin 1906 -> 2101 bytes .../textures/block/lumecorn_stem.png | Bin 0 -> 1858 bytes 13 files changed, 313 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/assets/betterend/models/block/lumecorn_middle.json create mode 100644 src/main/resources/assets/betterend/models/block/lumecorn_roots_big.json create mode 100644 src/main/resources/assets/betterend/models/block/lumecorn_roots_small.json delete mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_bark.png create mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_big_petal.png delete mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_light_2.png delete mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_light_3.png create mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_stem.png diff --git a/src/main/resources/assets/betterend/blockstates/lumecorn.json b/src/main/resources/assets/betterend/blockstates/lumecorn.json index d78ebe45..ab9cf754 100644 --- a/src/main/resources/assets/betterend/blockstates/lumecorn.json +++ b/src/main/resources/assets/betterend/blockstates/lumecorn.json @@ -3,8 +3,8 @@ "shape=light1": { "model": "betterend:block/lumecorn_light_1" }, "shape=light2": { "model": "betterend:block/lumecorn_light_2" }, "shape=light3": { "model": "betterend:block/lumecorn_light_3" }, - "shape=middle": { "model": "betterend:block/lumecon_middle_big" }, - "shape=bottom_big": { "model": "betterend:block/lumecorn_bottom_big" }, - "shape=bottom_small": { "model": "betterend:block/lumecorn_bottom_small" } + "shape=middle": { "model": "betterend:block/lumecorn_middle" }, + "shape=bottom_big": { "model": "betterend:block/lumecorn_roots_big" }, + "shape=bottom_small": { "model": "betterend:block/lumecorn_roots_small" } } } diff --git a/src/main/resources/assets/betterend/materialmaps/block/lumecorn.json b/src/main/resources/assets/betterend/materialmaps/block/lumecorn.json index bba3fb7d..f2157010 100644 --- a/src/main/resources/assets/betterend/materialmaps/block/lumecorn.json +++ b/src/main/resources/assets/betterend/materialmaps/block/lumecorn.json @@ -4,6 +4,18 @@ { "sprite": "betterend:block/lumecorn_light_1", "material": "betterend:glow_inc" + }, + { + "sprite": "betterend:block/lumecorn_leaf_2", + "material": "betterend:waving_floor" + }, + { + "sprite": "betterend:block/lumecorn_leaf_1", + "material": "betterend:waving_floor" + }, + { + "sprite": "betterend:block/lumecorn_big_petal", + "material": "betterend:waving" } ] } diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_middle.json b/src/main/resources/assets/betterend/models/block/lumecorn_middle.json new file mode 100644 index 00000000..e44c70df --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_middle.json @@ -0,0 +1,133 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/lumecorn_stem", + "texture": "betterend:block/lumecorn_stem", + "leaf_2": "betterend:block/lumecorn_leaf_2", + "leaf_1": "betterend:block/lumecorn_leaf_1", + "big_petal": "betterend:block/lumecorn_big_petal" + }, + "elements": [ + { + "__comment": "PlaneY4", + "from": [ 11, 16, 0 ], + "to": [ 27, 16.001, 16 ], + "rotation": { "origin": [ 11, 16, 0 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 90 } + } + }, + { + "__comment": "PlaneY4", + "from": [ 11, 16, 0 ], + "to": [ 19, 16.001, 16 ], + "rotation": { "origin": [ 11, 16, 0 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#leaf_1", "rotation": 90 } + } + }, + { + "__comment": "PlaneY4", + "from": [ -11, 15.999, 0 ], + "to": [ 5, 16, 16 ], + "rotation": { "origin": [ 5, 16, 0 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 270 }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2", "rotation": 270 } + } + }, + { + "__comment": "PlaneY4", + "from": [ -3, 15.999, 0 ], + "to": [ 5, 16, 16 ], + "rotation": { "origin": [ 5, 16, 0 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 16 ], "texture": "#leaf_1", "rotation": 270 }, + "up": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1", "rotation": 270 } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 16, 11 ], + "to": [ 16, 16.001, 27 ], + "rotation": { "origin": [ 0, 16, 11 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 180 } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 16, 11 ], + "to": [ 16, 16.001, 19 ], + "rotation": { "origin": [ 0, 16, 11 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1" }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#leaf_1", "rotation": 180 } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 15.999, -11 ], + "to": [ 16, 16, 5 ], + "rotation": { "origin": [ 0, 16, 5 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 180 }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2" } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 15.999, -3 ], + "to": [ 16, 16, 5 ], + "rotation": { "origin": [ 0, 16, 5 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 16 ], "texture": "#leaf_1", "rotation": 180 }, + "up": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1" } + } + }, + { + "__comment": "PlaneY14", + "from": [ 8, 16, -7.5 ], + "to": [ 30, 16.001, 14.5 ], + "rotation": { "origin": [ 8, 16, -7.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 11, 11 ], "texture": "#big_petal" }, + "up": { "uv": [ 0, 0, 11, 11 ], "texture": "#big_petal" } + } + }, + { + "__comment": "PlaneX15", + "from": [ 0, 0, 0 ], + "to": [ 0.001, 16, 22.5 ], + "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX15", + "from": [ 16, 0, 0 ], + "to": [ 16.001, 16, 22.5 ], + "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_roots_big.json b/src/main/resources/assets/betterend/models/block/lumecorn_roots_big.json new file mode 100644 index 00000000..376d26f1 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_roots_big.json @@ -0,0 +1,32 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/lumecorn_roots", + "texture": "betterend:block/lumecorn_roots", + "roots": "betterend:block/lumecorn_roots" + }, + "elements": [ + { + "__comment": "PlaneX2", + "from": [ 0, 0, 0 ], + "to": [ 0.001, 16, 22.5 ], + "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#roots" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#roots" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, 0, 0 ], + "to": [ 16.001, 16, 22.5 ], + "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#roots" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#roots" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_roots_small.json b/src/main/resources/assets/betterend/models/block/lumecorn_roots_small.json new file mode 100644 index 00000000..2e152863 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_roots_small.json @@ -0,0 +1,133 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/lumecorn_roots", + "texture": "betterend:block/lumecorn_roots", + "leaf_2": "betterend:block/lumecorn_leaf_2", + "leaf_1": "betterend:block/lumecorn_leaf_1", + "big_petal": "betterend:block/lumecorn_big_petal" + }, + "elements": [ + { + "__comment": "PlaneY4", + "from": [ 11, 16, 0 ], + "to": [ 27, 16.001, 16 ], + "rotation": { "origin": [ 11, 16, 0 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 90 } + } + }, + { + "__comment": "PlaneY4", + "from": [ 11, 16, 0 ], + "to": [ 19, 16.001, 16 ], + "rotation": { "origin": [ 11, 16, 0 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#leaf_1", "rotation": 90 } + } + }, + { + "__comment": "PlaneY4", + "from": [ -11, 15.999, 0 ], + "to": [ 5, 16, 16 ], + "rotation": { "origin": [ 5, 16, 0 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 270 }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2", "rotation": 270 } + } + }, + { + "__comment": "PlaneY4", + "from": [ -3, 15.999, 0 ], + "to": [ 5, 16, 16 ], + "rotation": { "origin": [ 5, 16, 0 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 16 ], "texture": "#leaf_1", "rotation": 270 }, + "up": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1", "rotation": 270 } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 16, 11 ], + "to": [ 16, 16.001, 27 ], + "rotation": { "origin": [ 0, 16, 11 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 180 } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 16, 11 ], + "to": [ 16, 16.001, 19 ], + "rotation": { "origin": [ 0, 16, 11 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1" }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#leaf_1", "rotation": 180 } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 15.999, -11 ], + "to": [ 16, 16, 5 ], + "rotation": { "origin": [ 0, 16, 5 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf_2", "rotation": 180 }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#leaf_2" } + } + }, + { + "__comment": "PlaneY17", + "from": [ 0, 15.999, -3 ], + "to": [ 16, 16, 5 ], + "rotation": { "origin": [ 0, 16, 5 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 16 ], "texture": "#leaf_1", "rotation": 180 }, + "up": { "uv": [ 16, 8, 0, 16 ], "texture": "#leaf_1" } + } + }, + { + "__comment": "PlaneY14", + "from": [ 8, 16, -7.5 ], + "to": [ 30, 16.001, 14.5 ], + "rotation": { "origin": [ 8, 16, -7.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 11, 11 ], "texture": "#big_petal" }, + "up": { "uv": [ 0, 0, 11, 11 ], "texture": "#big_petal" } + } + }, + { + "__comment": "PlaneX15", + "from": [ 0, 0, 0 ], + "to": [ 0.001, 16, 22.5 ], + "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX15", + "from": [ 16, 0, 0 ], + "to": [ 16.001, 16, 22.5 ], + "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_bark.png b/src/main/resources/assets/betterend/textures/block/lumecorn_bark.png deleted file mode 100644 index fa71da05affbec3b375bd5f7ded7c9c54ba90548..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2026 zcmbVN4Qvx-7%qk}Ko>fP2!!Z)gG7GXyX)V2mmScx-CCe!KUIc7^m_NTJ+|H*cel0M zBH>3tq9X*A$d59ELc|0CHRvX6fMbyg0Tf3vmj#qygbAbx1ZCoP>knu)v)JT%f6x1T z&-1?T_uj^Ge_7u6spEAzU7pwDs)T2~c8nbZ|DR6YXW(g^GMpF$#&}eMXq~QjUR+|>8lWOU5atCMz0uZ=B0NW-XV#VK!XIZN}z~!G7BKQ zFte1Ry6d6DwAm2^yX%3VX2Ur)8!OexwS#HmSPayHD1<4{6_M2`MMPCpBH}Pf$iB{| zLZX~9U{p~Kh+=J~%HRB3q|rFcZ(gc-&z(JDhf#m2~3-;VyBw ztrnNvYDUu!hY~!plBGyv5dbOw)o~BEQ3|GrAvMOxz!8S!9Z^%K;@Aiy zgaMqI7^*qNwE2>BQ#v`j)!7yk7j~ zC3f4%FTo>sy~|E*eQ!gdr`XvNnYyRD`|RF|z$xqZ(=K(*TRi24jb1ddH@xBpCU_;e z8_jp$+tsu0_<{cRC!c%gLTAOBm#=otaeUQ!tn}2~f@jXQwUu2Il9RYQo4QNJzjoOC zyrV=|n6r;L{$h1UQ_r_?{oLXMyFXQkM-Z5f3+S~B^ zq?~~zhu?Z;bAB$Z{+2g=oqq0V?8sSzqQMR|oiQA^Ci~qNB0FdKZ%>%`b$(%iuW@5* ze@pqt`fbhU&!cMB$);PM=WMAt_gVji75IWGJ-2VctiN`w-j(c}aX+`{sX(GJ^kdDf Zu@jo_Ez7N3c24^md)!lvI6;>1s;*b3=DjSL74G){)!X^24=_1kcg59UmvUF{9L`nl>DSry^7odplSvN z8~cia#N_PM5{0DH^vpb4rT4q{D=B2A*eZpa`WpBaIHzW0dQ=sq23ProBv)l8Tc#-4 z+wpSQR9FE`$W1LtRH(?!$t$+1uvG#ZYz1V4g!Ppaz)DK8ZIv8BHY!B;1}He^7o{qg z>Y3>#8=4p?m|N-@ni*Icndm4O85o-D8<^`G8tWPuS{ayG8CxnqffCR<1qGX;lr*a# z7dNPNK%T8qMoCG5mA-y?dAVM>v0i>ry1t>MrKP@sk-m|UE>MMTab;dfVufyAu`ZE{1p|w*YQ-UNJPhfFY+}kyxN_sAmB38cdgi&u1T;l2Gc(1?z|qLU z)yUM?)Y8?!(9qS%(bd$%#lpzd*v-Jq%+b{irq?AuximL5uLPzy1)^p76m3N zAkRi0o~A)Oc)m!@17?OIV5%3_Wz=S1V4Cmg;usR){&w2#d|^j{W8amM?=QR|)PIB{ zT4b5W0%lE9j}V(ECsvaW@fR6Hx3H{mSk&j@=`@k;jfWbaM`2Sght6;5JpbCqSsVaAyPGv!}D{A)5n>d^1?{9oeUuYUEeE=>J=_|u;7X0L(}+Z{&s zg_A;%2#v?yKd(x zvodQ5x08>f)4liaSGV4pd8GOn8f!y_4&xOBUuf99&zxArur9*fb@6)f%yz@7o5pZ6@IMXEIz}fU%-*bmW zT$+!yZfrboE~5EGzrET#@#o9$au`lr_(Cdu`U%Ux4$FzH1rmnJdOACGjV`?Xeqv{O z$;{=kQbDo}GEOJ{2D^stzA%C5Nl&6FZ;#KxS5ddme3R!9+kDw5X=m2=yxk|+*@FEV z#m{|@|6LM#-PW&1%B&2sxiW_IHzopr08;p5L;wH) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_leaf_1.png b/src/main/resources/assets/betterend/textures/block/lumecorn_leaf_1.png index 7488b67de8ed3cd31e402a6d79f3fa229facde13..5a1a5355c40a54bf8f39fa2cbf22ad25b6659b8a 100644 GIT binary patch delta 574 zcmdnMH;;dUiWFmUkh>GZx^prw85kH?(j9#r85lP9bN@+Xov0|z#Ktqx%AbjsYhqU} zGcT9I#P3e5KuSSjvnAsXCU!7WL1D5XOSgrBz8#dSU{jG>;OlGUky%`lUsMSfR#31h zN=dT{PAxv4)Vvg1r6MJJyLeY+CI$w^dTCD=#}EtuYV$@6#Pfty_{)g|`|2^k8mreX>AOEjSnup0JK#I?y>mXO7 z#1XgWi;L8N`8@OQ?@JcAD8$~~n8V6w=cm_ZdCo?o${^;$my^O9oZ=D{ z+ti=GYcg%-VXp6Nd~$)Yjq&!QE0T$A4GbQexAgEteEwF!yW@T$!(na%2Cje!&*bg* z8FYA^ZgiH{I@)j@D0qqI6I)L&_k$9~jSS1VJ6N|EGE5P3kT`Ypfim+Py&vn(oe?O1 zcDP=EZDS$h95$QVzb7>MPGat{kN?3VdXyz1xpCseiHbR=SN}I!Ki@9t!Gi~k?&?)~ rEsS&Y7%~|$*;G}YxU_IdNHAz@oLzBe&%$zG0%7oU^>bP0l+XkK&=bf1 delta 464 zcmbQozkzRp%0x#ICf1`9!~Gc*Ca%bxEWzlsIiB$c)8sgoZW(<$1)GZ80$*P%kIdqd z{Gv)AzbGZmDmb;!Zn7flxq6TSeV7Q4iLMwd=aO2ST$EW*l9`_eQy%2v24YrN0X5{N zmLvi>_7w$*$=RtT3aNQ1wn{}x_I6HlS6yLXU=;LpaSX9Io&4wje|u&lkDniyLm4>F z2tG(~5wA~nF=JTsQ+rCWSV!;08+T^3Es**klED!0QNJ<1z;GLXPJ&$ro1~Gu)P6>u z{qO$$;t%@sl>3OLjm@0|<~rM-ykYy5yk;=2XH*bpF#XS-S@ZFUA#;C&K*YP#?d1w) zb<7S5?=Gmbt>FH*zvfeeV~iW)I!P7(3k+^<9pZbJ-(#xxuKD|^^P$5|PUQ*wV)rL4 z^_s(|Ah7QX?+sA}=7c1PS05!CczG0=C*7}ipEyJN#7U1Wj0tBCl(6`OOt`Y*44dCE z1?LVUg>Mgz|BruHo0^c!toAs5zeL599g5jgR3=A9lx&I`x0{NT;9+AZi419+{nDKc2 ziWCM0X2*$M{!F}F6KCZz^KvOnW@mI_1=0!%n>`uh8QH;11%=5gn7S<$^z9&A8~vh` zG%J_X;^d;tf|AVqJg_)KG|0sb$g|O}u&T%{$W1Lt1o9>)G7Hx~NsEqTU|R z|KBv--+a_wHX$+Mr7o8kJL3*UgR=^~3JjMSm`^-9(RP5> zhsXQ%1LT+wzh2&dAjzO%jac4+9Q8c62`sxUw3*j$5D1yl`0(@X@&qXrwn@w@8CSA$ zGckIZD0v@XIH7uC+v3#+XNd=Wul>va$^6Vqh1)+Zc5aAjm^i_KVTt4tQ%07AS&m6J z7{Zt*2y^)uZ;~)Nkj22!ut<fFDZ*D#yJTG!&W;#+t zMm``sFL*k5ZE$U6bYVUqJU@7FVPk7$bRcDJWIZBsB0oMadJ&2M008nyL_t(|+G70w z|33pIfQf-ZFz^O2fWm-KI3&OS{vVev)cpE|I~qYIgA{;l zl8}*Qc=_Z3m<^(N1%$ww*HI@*G2%@JAO$c(xOw=%nn5%d5EGq{V21DjZ3Th9fB#^$ yourhAO*38tV6LDjFZ}!liMGFg{@_#t5MTi8sGKWZ=aE+c0000c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SQ$7PS-2XRnwwg>8W(;Dv-l&~f_`|7G$Wes=#>+C+jw_$CzX6q!2%`??LUe+vaY2mrQ z`LBUiOGDzGtM4B+`(>q2iUQdoY6QA#HI5mHxsrM3| zw3@k*B~od#c1&RYxH6`Du4bT$WO$rG%|S(zLdHp_c)Xt~{_!=fS+K+5snnaCo6XKU zxaHi<-zPk4JkaWw{$aXxV(z=gOiau7CMH*8%Q3X>IN&sU^@bp>rTeLA^tz(g3xLbUh UU31-`a!^U)>FVdQ&MBb@0Ps(vO8@`> diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_light_3.png b/src/main/resources/assets/betterend/textures/block/lumecorn_light_3.png deleted file mode 100644 index 6415a37a12bc1fb69dc06084de3111258f2413a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1255 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SQ$8)IJ#Pz7?@hR8Wm~`ac z+>eh-8zduEyEcdyv6*{V2pO=1ziT;`StD_ZNAQ8s$?6*y%>x_%7tCB&eWOB}g-4CW zWa|d=W0=v*UTQv+e~?&mWAj4s}fCP2KmN_w@tWt;eozbico?kK1O& z8?`h03bJLSw{~$)ImuN#voFDHYVzt&1@fXh7JJt+PZN)?P?t+J+sn@De`wyJNM5y| zfYLj&7#=ab|K_m3ZE1hvy{->QCKEe-*Tnt~|FraeZ%Xj`+D@(wmt(K3d$J+Hq<&q; ze?htQkOc3&S}HeGPOlEEyU4b!FTCU1fh)nuDvXK~yHpP7?iKxe>F&3=xy{cbD^)*e aA7E%*#MS+5;pxMmqQ}$K&t;ucLK6URkGymM diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_roots.png b/src/main/resources/assets/betterend/textures/block/lumecorn_roots.png index 56434d06759f787420a25b2c3559b19674250c45..f8680a6aac3b7b07a76a9aec57b6c3a77be49174 100644 GIT binary patch delta 522 zcmeyww^d+*iWFmUkh>GZx^prw85kH?(j9#r85lP9bN@+Xov0|m_+p}!KNBz4#I9Us zUM_`+-2l!C%$OU55e>|myX!em31ZVLr{J1AGdrXsh%*VoD;v$!O`s1h!$pkPy! zl4cd0T8Jd1F!=_{IX)!KK*J}mU_DolB4neFuG2;znSQIMFNom!%hnwMg$RHS5Y=ar=R9T*Vx*F0SuLoEEaPWI(G zWFXM$?x?x&-JTZh^$WcZCUfb1m0Gu_xr1AGVZ??{$9yu4CpR?lpYpllqzh zxqtt7;J8JyE$d5$8w%|g|Nee@?0-YUldR-YhMNlE?e7ksQeaF g4NJdR2=8TF!J0Jp_TDeEfqrE0boFyt=akR{04qGMArwFb4e{uF3Kz@$;{7#DGzdS z12HSCfEsdBOA>(``-+0Zi z%w&`7!xk5O@TqufOSNhrwkk-eiXe(CNI_9>5fxuVMN#yr)IPXkz5J6*(yi>uVqkJ| z&V1j0{_nr#$*IY){@|`4MN$2^@k}1p0q@zm1->7+@i&4c;N-_r)a6fi{{ox7imb>K z^~UM#H_@H2-)4>QCoKCg`!(jCM1;@VWg1~4mS-8&=fUtsA(Z} z7Q1u_S9CMUTzhYsp>-|E9FHlSVx@6aAD_4J(fP@OIzOw58guBO{@_Sc0t*Iq5#2Ou zrXw|zOxv&ozrACYq1zC5Hp$4|jdW3&qSM62bSxYXseDwRhs7`-=R_g;AT4nGFv|_I zd?dv25*L>uBJF<|xQ?brY^^NiGo$`>uuC#k*R>>;Z8RF;MkGw^3d@V4$Z`TJ2q8d( zoR;aLX2^8*bd30BGT2dV-Ewte(wY>EFb1PXF>;ArAf(pK_Egsjolbk%P0$C9>!wB; z&XA|c=im%-agq@@frq?@c(DN4k42>wABIIaU#h^CiY>q6rae>)UPPeU%+3|LX5 zoawm8RBHEsRb*B$Oju~STTuXItT&9->K$P_`MNzc9o(8B z))|m(HcUv^0k1ory zEq(FQsT_bH0{TkFf#N+r1W%B9Cv_P_P;%YEm< zGxO#tZ@qr~q$y1;UOW&eojrg0$Q@VD{8afwJp1w8+n%Mrx$nf)rAN-)Pe1Yc<9TOj pB9Q-R*U~+gX0}etzmtLY1G)WUJNEv(@|^camdj3NE~jP|{{cp*MDPFr literal 0 HcmV?d00001 From 31163e7658bb927b0b451fdb161ec1e90c323353 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 19 Jan 2021 20:06:51 +0300 Subject: [PATCH 190/463] Fireflies, small fixes --- .../betterend/particle/FireflyParticle.java | 81 ++++++++++++++++++ .../ru/betterend/registry/EndParticles.java | 3 + .../world/biome/GlowingGrasslandsBiome.java | 2 + .../world/features/bushes/Lumecorn.java | 3 + .../materialmaps/particle/firefly.json | 3 + .../assets/betterend/particles/firefly.json | 5 ++ .../betterend/textures/particle/firefly.png | Bin 0 -> 1486 bytes 7 files changed, 97 insertions(+) create mode 100644 src/main/java/ru/betterend/particle/FireflyParticle.java create mode 100644 src/main/resources/assets/betterend/materialmaps/particle/firefly.json create mode 100644 src/main/resources/assets/betterend/particles/firefly.json create mode 100644 src/main/resources/assets/betterend/textures/particle/firefly.png diff --git a/src/main/java/ru/betterend/particle/FireflyParticle.java b/src/main/java/ru/betterend/particle/FireflyParticle.java new file mode 100644 index 00000000..5bb620f4 --- /dev/null +++ b/src/main/java/ru/betterend/particle/FireflyParticle.java @@ -0,0 +1,81 @@ +package ru.betterend.particle; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.particle.AnimatedParticle; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleFactory; +import net.minecraft.client.particle.SpriteProvider; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.particle.DefaultParticleType; +import net.minecraft.util.math.MathHelper; +import ru.betterend.util.MHelper; + +@Environment(EnvType.CLIENT) +public class FireflyParticle extends AnimatedParticle { + private double preVX; + private double preVY; + private double preVZ; + private double nextVX; + private double nextVY; + private double nextVZ; + + protected FireflyParticle(ClientWorld world, double x, double y, double z, SpriteProvider sprites, double r, double g, double b) { + super(world, x, y, z, sprites, 0); + setSprite(sprites.getSprite(random)); + this.maxAge = MHelper.randRange(150, 300, random); + this.scale = MHelper.randRange(0.05F, 0.15F, random); + this.setTargetColor(15916745); + this.setSpriteForAge(spriteProvider); + this.setColorAlpha(0); + + preVX = random.nextGaussian() * 0.02; + preVY = random.nextGaussian() * 0.02; + preVZ = random.nextGaussian() * 0.02; + + nextVX = random.nextGaussian() * 0.02; + nextVY = random.nextGaussian() * 0.02; + nextVZ = random.nextGaussian() * 0.02; + } + + @Override + public void tick() { + int ticks = this.age & 31; + if (ticks == 0) { + preVX = nextVX; + preVY = nextVY; + preVZ = nextVZ; + nextVX = random.nextGaussian() * 0.02; + nextVY = random.nextGaussian() * 0.02; + nextVZ = random.nextGaussian() * 0.02; + } + double delta = (double) ticks / 31.0; + + this.velocityX = MathHelper.lerp(delta, preVX, nextVX); + this.velocityY = MathHelper.lerp(delta, preVY, nextVY); + this.velocityZ = MathHelper.lerp(delta, preVZ, nextVZ); + + if (this.age <= 60) { + this.setColorAlpha(this.age / 60F); + } + else if (this.age > maxAge - 60) { + this.setColorAlpha((maxAge - this.age) / 60F); + } + + super.tick(); + } + + @Environment(EnvType.CLIENT) + public static class FireflyParticleFactory implements ParticleFactory { + private final SpriteProvider sprites; + + public FireflyParticleFactory(SpriteProvider sprites) { + this.sprites = sprites; + } + + @Override + public Particle createParticle(DefaultParticleType type, ClientWorld world, double x, double y, double z, double vX, double vY, double vZ) { + return new FireflyParticle(world, x, y, z, sprites, 1, 1, 1); + } + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/registry/EndParticles.java b/src/main/java/ru/betterend/registry/EndParticles.java index d273cb29..05defbc7 100644 --- a/src/main/java/ru/betterend/registry/EndParticles.java +++ b/src/main/java/ru/betterend/registry/EndParticles.java @@ -7,6 +7,7 @@ import net.minecraft.particle.ParticleEffect; import net.minecraft.particle.ParticleType; import net.minecraft.util.registry.Registry; import ru.betterend.BetterEnd; +import ru.betterend.particle.FireflyParticle; import ru.betterend.particle.InfusionParticle; import ru.betterend.particle.InfusionParticleType; import ru.betterend.particle.ParticleBlackSpore; @@ -29,6 +30,7 @@ public class EndParticles { public static final DefaultParticleType BLACK_SPORE = register("black_spore"); public static final DefaultParticleType TENANEA_PETAL = register("tenanea_petal"); public static final DefaultParticleType JUNGLE_SPORE = register("jungle_spore"); + public static final DefaultParticleType FIREFLY = register("firefly"); public static void register() { ParticleFactoryRegistry.getInstance().register(GLOWING_SPHERE, ParticleGlowingSphere.FactoryGlowingSphere::new); @@ -41,6 +43,7 @@ public class EndParticles { ParticleFactoryRegistry.getInstance().register(BLACK_SPORE, ParticleBlackSpore.FactoryBlackSpore::new); ParticleFactoryRegistry.getInstance().register(TENANEA_PETAL, ParticleTenaneaPetal.FactoryTenaneaPetal::new); ParticleFactoryRegistry.getInstance().register(JUNGLE_SPORE, ParticleJungleSpore.FactoryJungleSpore::new); + ParticleFactoryRegistry.getInstance().register(FIREFLY, FireflyParticle.FireflyParticleFactory::new); } private static DefaultParticleType register(String name) { diff --git a/src/main/java/ru/betterend/world/biome/GlowingGrasslandsBiome.java b/src/main/java/ru/betterend/world/biome/GlowingGrasslandsBiome.java index f878e85d..be5bdd10 100644 --- a/src/main/java/ru/betterend/world/biome/GlowingGrasslandsBiome.java +++ b/src/main/java/ru/betterend/world/biome/GlowingGrasslandsBiome.java @@ -3,6 +3,7 @@ package ru.betterend.world.biome; import net.minecraft.entity.EntityType; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; public class GlowingGrasslandsBiome extends EndBiome { @@ -10,6 +11,7 @@ public class GlowingGrasslandsBiome extends EndBiome { super(new BiomeDefinition("glowing_grasslands") .setFogColor(99, 228, 247) .setFogDensity(1.3F) + .setParticles(EndParticles.FIREFLY, 0.001F) .setMusic(EndSounds.MUSIC_OPENSPACE) .setSurface(EndBlocks.END_MOSS) .addFeature(EndFeatures.END_LAKE_RARE) diff --git a/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java b/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java index 5c823cb0..f9d6c5da 100644 --- a/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java +++ b/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java @@ -12,6 +12,7 @@ import net.minecraft.world.gen.feature.DefaultFeatureConfig; import ru.betterend.blocks.BlockProperties.LumecornShape; import ru.betterend.blocks.LumecornBlock; import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; import ru.betterend.world.features.DefaultFeature; @@ -19,6 +20,8 @@ import ru.betterend.world.features.DefaultFeature; public class Lumecorn extends DefaultFeature { @Override public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; + int height = MHelper.randRange(3, 6, random); Mutable mut = new Mutable().set(pos); for (int i = 1; i < height; i++) { diff --git a/src/main/resources/assets/betterend/materialmaps/particle/firefly.json b/src/main/resources/assets/betterend/materialmaps/particle/firefly.json new file mode 100644 index 00000000..ab909d8e --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/particle/firefly.json @@ -0,0 +1,3 @@ +{ + "material": "canvas:emissive_no_diffuse" +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/particles/firefly.json b/src/main/resources/assets/betterend/particles/firefly.json new file mode 100644 index 00000000..059552aa --- /dev/null +++ b/src/main/resources/assets/betterend/particles/firefly.json @@ -0,0 +1,5 @@ +{ + "textures": [ + "betterend:firefly" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/particle/firefly.png b/src/main/resources/assets/betterend/textures/particle/firefly.png new file mode 100644 index 0000000000000000000000000000000000000000..de0c2bc0ffdf9f1b4adedad3085dcf48737b0c19 GIT binary patch literal 1486 zcmbVMU1%Id9N#F$SR1AE!77N$#s|gj?ac1wE<0os<8Ab=cGGKm(D>H5nYp_qw>#V2 zx!xrrN#K-D`RH0aB?qe-dHMlT4U%&bNzyEL7 z*It@E@WcU4(`IW`e_hTqYRpW_|J6q?pO@1^N%fUX(;hyo#+3Hq?h#FUU@B~Eh>hSl zB0MT!%A2e(h!Tm`w8iB?g2^TmdXu%o*fVZk`qI!t>KUi!0}vz?)(NZIDLb{j)*#!P z#HGgalD;@Vk|1IN>w~BpXK3IVLtZ4;>ew>$Aw+C?#)=ZCZv=I{!c(Tt7fL39MO!bs z1y};ET|BDW0G2IKwxDAIh(HNBu0H+@DJ`WfwC=w+mL+$d(Gem+meud~3w@`+)3ya& z*R_Cc*|sSWX0{azJTT*IZo=TRjHF>ALLTdi5jS~Hc!tz;WI~kWv~f0elXRFhz=;J5 zK$$cIQj+76UfLZBr^I4i7O_}l5({&z^imMy@O#omQI5{U>N%;=*tUD3v&L4!taX<0 zUP{>NIVo{&qFB=5f@dB64|e3&xitx@qznt5HaPE20#%=|=#`2J%!2;R=`g0epFOJt zjo&aI3+5R%u%Qf@3Ec*CkyAvl{2Xu)03&E1Q-NZE_Xp-QY;FA~loHh9X@sSt!U(sS zmBj6#v>-sWI1@M~tmb=$RJ9O>6wS9jro8^+j2q*$lYEIt! zob*%>)%#ICQ%)pD?mEZI)mWnppi@ccElbQUt99Vml7b*-oUPEGgW*n^kE= z_pQ}max1*c(|}Xyb4MlgFtJcI%w+Vo#wBu!ogJ^bp+3wdgo#Rb&mbz!j2h$P@PGSh zMBDE$N%}9rAHg!-5`CPqmA3The)7wb`dg|tN2XYRw{m!QR~=8_vN@<_-j(Dg?`tfU z%`BB&OZ5C7WXH>D{z~J>2juphJInVkU71-wbLgqP_t57@Pwakl;l_{Gt{pso>B4dJ z)wgff!L7Yd7Y|Q;^Zd!_M}GbK;Bx%&?>`S-`{Ir7p1!zaet+|)$Il*XRAF*#iTw7* z?d!K5dva;_o%i1=-!S%Go&H3>J_~9W@7uY2 Date: Wed, 20 Jan 2021 18:08:36 +0300 Subject: [PATCH 191/463] Glowing grasslands update --- .../ru/betterend/blocks/BlockProperties.java | 7 +-- .../ru/betterend/blocks/LumecornBlock.java | 4 +- .../java/ru/betterend/registry/EndBlocks.java | 4 ++ .../ru/betterend/registry/EndFeatures.java | 7 +++ .../world/biome/GlowingGrasslandsBiome.java | 10 ++-- .../world/features/bushes/Lumecorn.java | 46 ++++++++---------- .../blockstates/blooming_cooksonia.json | 10 ++++ .../betterend/blockstates/fracturn.json | 10 ++++ .../betterend/blockstates/lumecorn.json | 7 +-- .../betterend/blockstates/salteago.json | 10 ++++ .../betterend/blockstates/vaiolush_fern.json | 10 ++++ .../assets/betterend/lang/en_us.json | 12 ++++- .../assets/betterend/lang/ru_ru.json | 12 ++++- .../block/blooming_cooksonia.json | 3 ++ .../materialmaps/block/fracturn.json | 3 ++ .../materialmaps/block/lumecorn.json | 14 +++++- .../materialmaps/block/salteago.json | 3 ++ .../materialmaps/block/vaiolush_fern.json | 3 ++ .../materialmaps/item/blooming_cooksonia.json | 1 + .../betterend/materialmaps/item/fracturn.json | 1 + .../betterend/materialmaps/item/salteago.json | 1 + .../materialmaps/item/vaiolush_fern.json | 1 + .../models/block/blooming_cooksonia_01.json | 6 +++ .../models/block/blooming_cooksonia_02.json | 6 +++ .../models/block/blooming_cooksonia_03.json | 6 +++ .../models/block/blooming_cooksonia_04.json | 6 +++ .../betterend/models/block/fracturn_01.json | 6 +++ .../betterend/models/block/fracturn_02.json | 6 +++ .../betterend/models/block/fracturn_03.json | 6 +++ .../betterend/models/block/fracturn_04.json | 6 +++ .../models/block/lumecorn_light_1.json | 22 --------- .../models/block/lumecorn_light_2.json | 22 --------- .../models/block/lumecorn_light_3.json | 22 --------- .../models/block/lumecorn_light_bottom.json | 31 ++++++++++++ .../models/block/lumecorn_light_middle.json | 31 ++++++++++++ .../models/block/lumecorn_light_top.json | 31 ++++++++++++ .../block/lumecorn_light_top_middle.json | 31 ++++++++++++ .../betterend/models/block/salteago_01.json | 6 +++ .../betterend/models/block/salteago_02.json | 6 +++ .../betterend/models/block/salteago_03.json | 6 +++ .../betterend/models/block/salteago_04.json | 6 +++ .../models/block/vaiolush_fern_01.json | 6 +++ .../models/block/vaiolush_fern_02.json | 6 +++ .../models/block/vaiolush_fern_03.json | 6 +++ .../models/block/vaiolush_fern_04.json | 6 +++ .../models/item/blooming_cooksonia.json | 6 +++ .../betterend/models/item/fracturn.json | 6 +++ .../betterend/models/item/salteago.json | 6 +++ .../betterend/models/item/vaiolush_fern.json | 6 +++ .../textures/block/blooming_cooksonia.png | Bin 0 -> 1797 bytes .../betterend/textures/block/fracturn.png | Bin 0 -> 1803 bytes .../textures/block/lumecorn_light_bottom.png | Bin 0 -> 385 bytes .../textures/block/lumecorn_light_middle.png | Bin 0 -> 1102 bytes .../textures/block/lumecorn_light_top.png | Bin 0 -> 1484 bytes .../block/lumecorn_light_top_middle.png | Bin 0 -> 348 bytes .../betterend/textures/block/salteago.png | Bin 0 -> 2113 bytes .../textures/block/vaiolush_fern.png | Bin 0 -> 2145 bytes 57 files changed, 382 insertions(+), 107 deletions(-) create mode 100644 src/main/resources/assets/betterend/blockstates/blooming_cooksonia.json create mode 100644 src/main/resources/assets/betterend/blockstates/fracturn.json create mode 100644 src/main/resources/assets/betterend/blockstates/salteago.json create mode 100644 src/main/resources/assets/betterend/blockstates/vaiolush_fern.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/blooming_cooksonia.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/fracturn.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/salteago.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/vaiolush_fern.json create mode 100644 src/main/resources/assets/betterend/materialmaps/item/blooming_cooksonia.json create mode 100644 src/main/resources/assets/betterend/materialmaps/item/fracturn.json create mode 100644 src/main/resources/assets/betterend/materialmaps/item/salteago.json create mode 100644 src/main/resources/assets/betterend/materialmaps/item/vaiolush_fern.json create mode 100644 src/main/resources/assets/betterend/models/block/blooming_cooksonia_01.json create mode 100644 src/main/resources/assets/betterend/models/block/blooming_cooksonia_02.json create mode 100644 src/main/resources/assets/betterend/models/block/blooming_cooksonia_03.json create mode 100644 src/main/resources/assets/betterend/models/block/blooming_cooksonia_04.json create mode 100644 src/main/resources/assets/betterend/models/block/fracturn_01.json create mode 100644 src/main/resources/assets/betterend/models/block/fracturn_02.json create mode 100644 src/main/resources/assets/betterend/models/block/fracturn_03.json create mode 100644 src/main/resources/assets/betterend/models/block/fracturn_04.json delete mode 100644 src/main/resources/assets/betterend/models/block/lumecorn_light_1.json delete mode 100644 src/main/resources/assets/betterend/models/block/lumecorn_light_2.json delete mode 100644 src/main/resources/assets/betterend/models/block/lumecorn_light_3.json create mode 100644 src/main/resources/assets/betterend/models/block/lumecorn_light_bottom.json create mode 100644 src/main/resources/assets/betterend/models/block/lumecorn_light_middle.json create mode 100644 src/main/resources/assets/betterend/models/block/lumecorn_light_top.json create mode 100644 src/main/resources/assets/betterend/models/block/lumecorn_light_top_middle.json create mode 100644 src/main/resources/assets/betterend/models/block/salteago_01.json create mode 100644 src/main/resources/assets/betterend/models/block/salteago_02.json create mode 100644 src/main/resources/assets/betterend/models/block/salteago_03.json create mode 100644 src/main/resources/assets/betterend/models/block/salteago_04.json create mode 100644 src/main/resources/assets/betterend/models/block/vaiolush_fern_01.json create mode 100644 src/main/resources/assets/betterend/models/block/vaiolush_fern_02.json create mode 100644 src/main/resources/assets/betterend/models/block/vaiolush_fern_03.json create mode 100644 src/main/resources/assets/betterend/models/block/vaiolush_fern_04.json create mode 100644 src/main/resources/assets/betterend/models/item/blooming_cooksonia.json create mode 100644 src/main/resources/assets/betterend/models/item/fracturn.json create mode 100644 src/main/resources/assets/betterend/models/item/salteago.json create mode 100644 src/main/resources/assets/betterend/models/item/vaiolush_fern.json create mode 100644 src/main/resources/assets/betterend/textures/block/blooming_cooksonia.png create mode 100644 src/main/resources/assets/betterend/textures/block/fracturn.png create mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_light_bottom.png create mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_light_middle.png create mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_light_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_light_top_middle.png create mode 100644 src/main/resources/assets/betterend/textures/block/salteago.png create mode 100644 src/main/resources/assets/betterend/textures/block/vaiolush_fern.png diff --git a/src/main/java/ru/betterend/blocks/BlockProperties.java b/src/main/java/ru/betterend/blocks/BlockProperties.java index fca28924..14933431 100644 --- a/src/main/java/ru/betterend/blocks/BlockProperties.java +++ b/src/main/java/ru/betterend/blocks/BlockProperties.java @@ -121,9 +121,10 @@ public class BlockProperties { } public static enum LumecornShape implements StringIdentifiable { - LIGHT1("light1", 15), - LIGHT2("light2", 14), - LIGHT3("light3", 13), + LIGHT_TOP("light_top", 10), + LIGHT_TOP_MIDDLE("light_top_middle", 13), + LIGHT_MIDDLE("light_middle", 15), + LIGHT_BOTTOM("light_bottom", 10), MIDDLE("middle", 0), BOTTOM_BIG("bottom_big", 0), BOTTOM_SMALL("bottom_small", 0); diff --git a/src/main/java/ru/betterend/blocks/LumecornBlock.java b/src/main/java/ru/betterend/blocks/LumecornBlock.java index c04b1ed5..a201101c 100644 --- a/src/main/java/ru/betterend/blocks/LumecornBlock.java +++ b/src/main/java/ru/betterend/blocks/LumecornBlock.java @@ -46,10 +46,10 @@ public class LumecornBlock extends BaseBlockNotFull implements IRenderTypeable { @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { LumecornShape shape = state.get(SHAPE); - if (shape == LumecornShape.LIGHT3) { + if (shape == LumecornShape.LIGHT_MIDDLE) { return SHAPE_SMALL; } - else if (shape == LumecornShape.LIGHT2) { + else if (shape == LumecornShape.LIGHT_TOP_MIDDLE) { return SHAPE_MEDIUM; } else { diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 504c8739..851a1cff 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -206,6 +206,10 @@ public class EndBlocks { public static final Block TWISTED_UMBRELLA_MOSS = registerBlock("twisted_umbrella_moss", new TwistedUmbrellaMossBlock()); public static final Block TWISTED_UMBRELLA_MOSS_TALL = registerBlock("twisted_umbrella_moss_tall", new TwistedUmbrellaMossTallBlock()); public static final Block JUNGLE_GRASS = registerBlock("jungle_grass", new TerrainPlantBlock(JUNGLE_MOSS)); + public static final Block BLOOMING_COOKSONIA = registerBlock("blooming_cooksonia", new TerrainPlantBlock(END_MOSS)); + public static final Block SALTEAGO = registerBlock("salteago", new TerrainPlantBlock(END_MOSS)); + public static final Block VAIOLUSH_FERN = registerBlock("vaiolush_fern", new TerrainPlantBlock(END_MOSS)); + public static final Block FRACTURN = registerBlock("fracturn", new TerrainPlantBlock(END_MOSS)); public static final Block BLUE_VINE_SEED = registerBlock("blue_vine_seed", new BlueVineSeedBlock()); public static final Block BLUE_VINE = registerBlockNI("blue_vine", new BlueVineBlock()); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index ee25cdd2..96c646e5 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -91,6 +91,13 @@ public class EndFeatures { public static final EndFeature JUNGLE_GRASS = new EndFeature("jungle_grass", new SinglePlantFeature(EndBlocks.JUNGLE_GRASS, 7, 3), 8); public static final EndFeature SMALL_JELLYSHROOM_FLOOR = new EndFeature("small_jellyshroom_floor", new SinglePlantFeature(EndBlocks.SMALL_JELLYSHROOM, 5, 5), 4); public static final EndFeature BLOSSOM_BERRY = new EndFeature("blossom_berry", new SinglePlantFeature(EndBlocks.BLOSSOM_BERRY, 3, 3), 2); + public static final EndFeature BLOOMING_COOKSONIA = new EndFeature("blooming_cooksonia", new SinglePlantFeature(EndBlocks.BLOOMING_COOKSONIA, 5), 5); + public static final EndFeature SALTEAGO = new EndFeature("salteago", new SinglePlantFeature(EndBlocks.SALTEAGO, 5), 5); + public static final EndFeature VAIOLUSH_FERN = new EndFeature("vaiolush_fern", new SinglePlantFeature(EndBlocks.VAIOLUSH_FERN, 5), 5); + public static final EndFeature FRACTURN = new EndFeature("fracturn", new SinglePlantFeature(EndBlocks.FRACTURN, 5), 5); + public static final EndFeature UMBRELLA_MOSS_RARE = new EndFeature("umbrella_moss_rare", new SinglePlantFeature(EndBlocks.UMBRELLA_MOSS, 3), 2); + public static final EndFeature CREEPING_MOSS_RARE = new EndFeature("creeping_moss_rare", new SinglePlantFeature(EndBlocks.CREEPING_MOSS, 3), 2); + public static final EndFeature TWISTED_UMBRELLA_MOSS_RARE = new EndFeature("twisted_umbrella_moss_rare", new SinglePlantFeature(EndBlocks.TWISTED_UMBRELLA_MOSS, 3), 2); // Vines // public static final EndFeature DENSE_VINE = new EndFeature("dense_vine", new VineFeature(EndBlocks.DENSE_VINE, 24), 3); diff --git a/src/main/java/ru/betterend/world/biome/GlowingGrasslandsBiome.java b/src/main/java/ru/betterend/world/biome/GlowingGrasslandsBiome.java index be5bdd10..b8ac72bc 100644 --- a/src/main/java/ru/betterend/world/biome/GlowingGrasslandsBiome.java +++ b/src/main/java/ru/betterend/world/biome/GlowingGrasslandsBiome.java @@ -16,9 +16,13 @@ public class GlowingGrasslandsBiome extends EndBiome { .setSurface(EndBlocks.END_MOSS) .addFeature(EndFeatures.END_LAKE_RARE) .addFeature(EndFeatures.LUMECORN) - .addFeature(EndFeatures.UMBRELLA_MOSS) - .addFeature(EndFeatures.CREEPING_MOSS) - .addFeature(EndFeatures.TWISTED_UMBRELLA_MOSS) + .addFeature(EndFeatures.BLOOMING_COOKSONIA) + .addFeature(EndFeatures.SALTEAGO) + .addFeature(EndFeatures.VAIOLUSH_FERN) + .addFeature(EndFeatures.FRACTURN) + .addFeature(EndFeatures.UMBRELLA_MOSS_RARE) + .addFeature(EndFeatures.CREEPING_MOSS_RARE) + .addFeature(EndFeatures.TWISTED_UMBRELLA_MOSS_RARE) .addFeature(EndFeatures.CHARNIA_CYAN) .addFeature(EndFeatures.CHARNIA_GREEN) .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) diff --git a/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java b/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java index f9d6c5da..81bad45d 100644 --- a/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java +++ b/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java @@ -2,10 +2,10 @@ package ru.betterend.world.features.bushes; import java.util.Random; +import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos.Mutable; import net.minecraft.util.math.Direction; -import net.minecraft.util.math.MathHelper; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -22,7 +22,7 @@ public class Lumecorn extends DefaultFeature { public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; - int height = MHelper.randRange(3, 6, random); + int height = MHelper.randRange(4, 7, random); Mutable mut = new Mutable().set(pos); for (int i = 1; i < height; i++) { mut.move(Direction.UP); @@ -31,39 +31,31 @@ public class Lumecorn extends DefaultFeature { } } mut.set(pos); - if (height == 3) { + BlockState topMiddle = EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.LIGHT_TOP_MIDDLE); + BlockState middle = EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.LIGHT_MIDDLE); + BlockState bottom = EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.LIGHT_BOTTOM); + BlockState top = EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.LIGHT_TOP); + if (height == 4) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.BOTTOM_SMALL)); - BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.LIGHT2)); - BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.LIGHT3)); + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), bottom); + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), topMiddle); + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), top); return true; } - boolean tall = random.nextBoolean(); - if (tall) { - BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.BOTTOM_BIG)); - BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.MIDDLE)); - height -= 2; + if (random.nextBoolean()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.BOTTOM_SMALL)); } else { - BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.BOTTOM_SMALL)); + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.BOTTOM_BIG)); + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.MIDDLE)); height --; } - boolean smallBottom = height > 2 && random.nextBoolean(); - for (int i = 0; i < height; i++) { - int size = i - height + 4; - size = MathHelper.clamp(size, 1, 3); - if (smallBottom && i == 0) { - size ++; - } - if (size == 1) { - BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.LIGHT1)); - } - else if (size == 2) { - BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.LIGHT2)); - } - else { - BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.LIGHT3)); - } + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), bottom); + for (int i = 4; i < height; i++) { + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), middle); } + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), topMiddle); + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), top); return false; } } diff --git a/src/main/resources/assets/betterend/blockstates/blooming_cooksonia.json b/src/main/resources/assets/betterend/blockstates/blooming_cooksonia.json new file mode 100644 index 00000000..8ff50a40 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/blooming_cooksonia.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/blooming_cooksonia_01" }, + { "model": "betterend:block/blooming_cooksonia_02" }, + { "model": "betterend:block/blooming_cooksonia_03" }, + { "model": "betterend:block/blooming_cooksonia_04" } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/fracturn.json b/src/main/resources/assets/betterend/blockstates/fracturn.json new file mode 100644 index 00000000..b53acc64 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/fracturn.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/fracturn_01" }, + { "model": "betterend:block/fracturn_02" }, + { "model": "betterend:block/fracturn_03" }, + { "model": "betterend:block/fracturn_04" } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/lumecorn.json b/src/main/resources/assets/betterend/blockstates/lumecorn.json index ab9cf754..f35cf962 100644 --- a/src/main/resources/assets/betterend/blockstates/lumecorn.json +++ b/src/main/resources/assets/betterend/blockstates/lumecorn.json @@ -1,8 +1,9 @@ { "variants": { - "shape=light1": { "model": "betterend:block/lumecorn_light_1" }, - "shape=light2": { "model": "betterend:block/lumecorn_light_2" }, - "shape=light3": { "model": "betterend:block/lumecorn_light_3" }, + "shape=light_bottom": { "model": "betterend:block/lumecorn_light_bottom" }, + "shape=light_middle": { "model": "betterend:block/lumecorn_light_middle" }, + "shape=light_top_middle": { "model": "betterend:block/lumecorn_light_top_middle" }, + "shape=light_top": { "model": "betterend:block/lumecorn_light_top" }, "shape=middle": { "model": "betterend:block/lumecorn_middle" }, "shape=bottom_big": { "model": "betterend:block/lumecorn_roots_big" }, "shape=bottom_small": { "model": "betterend:block/lumecorn_roots_small" } diff --git a/src/main/resources/assets/betterend/blockstates/salteago.json b/src/main/resources/assets/betterend/blockstates/salteago.json new file mode 100644 index 00000000..a3a2de25 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/salteago.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/salteago_01" }, + { "model": "betterend:block/salteago_02" }, + { "model": "betterend:block/salteago_03" }, + { "model": "betterend:block/salteago_04" } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/vaiolush_fern.json b/src/main/resources/assets/betterend/blockstates/vaiolush_fern.json new file mode 100644 index 00000000..4956451d --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/vaiolush_fern.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/vaiolush_fern_01" }, + { "model": "betterend:block/vaiolush_fern_02" }, + { "model": "betterend:block/vaiolush_fern_03" }, + { "model": "betterend:block/vaiolush_fern_04" } + ] + } +} diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index ddfa5ebd..dfba0019 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -564,5 +564,15 @@ "item.betterend.blossom_berry": "Blossom Berry", "biome.betterend.nightshade_redwoods": "Nightshade Redwoods", - "block.betterend.nightshade_moss": "Nightshade Moss" + "block.betterend.nightshade_moss": "Nightshade Moss", + + "biome.betterend.glowing_grasslands": "Glowing Grasslands", + "block.betterend.blooming_cooksonia": "Blooming Cooksonia", + "block.betterend.fracturn": "Fracturn", + "block.betterend.lumecorn": "Lumecorn", + "block.betterend.salteago": "Salteago", + "block.betterend.vaiolush_fern": "Vaiolush Fern", + "entity.betterend.silk_moth": "Silk Moth", + "item.betterend.silk_fiber": "Silk Fiber", + "item.betterend.spawn_egg_silk_moth": "Silk Moth Spawn Egg" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 97b67028..e337d629 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -566,5 +566,15 @@ "item.betterend.blossom_berry": "Цветущая ягода", "biome.betterend.nightshade_redwoods": "Теневой Секвойник", - "block.betterend.nightshade_moss": "Теневой мох" + "block.betterend.nightshade_moss": "Теневой мох", + + "biome.betterend.glowing_grasslands": "Светящиеся луга", + "block.betterend.blooming_cooksonia": "Цветущая куксония", + "block.betterend.fracturn": "Фрактюрн", + "block.betterend.lumecorn": "Люмекорн", + "block.betterend.salteago": "Сальтеаго", + "block.betterend.vaiolush_fern": "Пышнопёрый папоротник", + "entity.betterend.silk_moth": "Шелковичная моль", + "item.betterend.silk_fiber": "Шёлковое волокно", + "item.betterend.spawn_egg_silk_moth": "Яйцо призыва шелковичной моли" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/blooming_cooksonia.json b/src/main/resources/assets/betterend/materialmaps/block/blooming_cooksonia.json new file mode 100644 index 00000000..c19e0715 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/blooming_cooksonia.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_floor_glow_50" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/fracturn.json b/src/main/resources/assets/betterend/materialmaps/block/fracturn.json new file mode 100644 index 00000000..c19e0715 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/fracturn.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_floor_glow_50" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/lumecorn.json b/src/main/resources/assets/betterend/materialmaps/block/lumecorn.json index f2157010..5b4926ac 100644 --- a/src/main/resources/assets/betterend/materialmaps/block/lumecorn.json +++ b/src/main/resources/assets/betterend/materialmaps/block/lumecorn.json @@ -2,7 +2,19 @@ "defaultMap": { "spriteMap": [ { - "sprite": "betterend:block/lumecorn_light_1", + "sprite": "betterend:block/lumecorn_light_bottom", + "material": "betterend:glow_inc" + }, + { + "sprite": "betterend:block/lumecorn_light_middle", + "material": "betterend:glow_inc" + }, + { + "sprite": "betterend:block/lumecorn_light_top_middle", + "material": "betterend:glow_inc" + }, + { + "sprite": "betterend:block/lumecorn_light_top", "material": "betterend:glow_inc" }, { diff --git a/src/main/resources/assets/betterend/materialmaps/block/salteago.json b/src/main/resources/assets/betterend/materialmaps/block/salteago.json new file mode 100644 index 00000000..352de84b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/salteago.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_floor" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/vaiolush_fern.json b/src/main/resources/assets/betterend/materialmaps/block/vaiolush_fern.json new file mode 100644 index 00000000..352de84b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/vaiolush_fern.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_floor" +} diff --git a/src/main/resources/assets/betterend/materialmaps/item/blooming_cooksonia.json b/src/main/resources/assets/betterend/materialmaps/item/blooming_cooksonia.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/blooming_cooksonia.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materialmaps/item/fracturn.json b/src/main/resources/assets/betterend/materialmaps/item/fracturn.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/fracturn.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materialmaps/item/salteago.json b/src/main/resources/assets/betterend/materialmaps/item/salteago.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/salteago.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/item/vaiolush_fern.json b/src/main/resources/assets/betterend/materialmaps/item/vaiolush_fern.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/vaiolush_fern.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/blooming_cooksonia_01.json b/src/main/resources/assets/betterend/models/block/blooming_cooksonia_01.json new file mode 100644 index 00000000..c68906bb --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/blooming_cooksonia_01.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/blooming_cooksonia" + } +} diff --git a/src/main/resources/assets/betterend/models/block/blooming_cooksonia_02.json b/src/main/resources/assets/betterend/models/block/blooming_cooksonia_02.json new file mode 100644 index 00000000..ac276975 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/blooming_cooksonia_02.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/blooming_cooksonia" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/blooming_cooksonia_03.json b/src/main/resources/assets/betterend/models/block/blooming_cooksonia_03.json new file mode 100644 index 00000000..ccaffe10 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/blooming_cooksonia_03.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/blooming_cooksonia" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/blooming_cooksonia_04.json b/src/main/resources/assets/betterend/models/block/blooming_cooksonia_04.json new file mode 100644 index 00000000..703797e8 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/blooming_cooksonia_04.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/blooming_cooksonia" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/fracturn_01.json b/src/main/resources/assets/betterend/models/block/fracturn_01.json new file mode 100644 index 00000000..f2fec641 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/fracturn_01.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/fracturn" + } +} diff --git a/src/main/resources/assets/betterend/models/block/fracturn_02.json b/src/main/resources/assets/betterend/models/block/fracturn_02.json new file mode 100644 index 00000000..3ad3fb70 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/fracturn_02.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/fracturn" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/fracturn_03.json b/src/main/resources/assets/betterend/models/block/fracturn_03.json new file mode 100644 index 00000000..0d401711 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/fracturn_03.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/fracturn" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/fracturn_04.json b/src/main/resources/assets/betterend/models/block/fracturn_04.json new file mode 100644 index 00000000..f7727012 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/fracturn_04.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/fracturn" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_light_1.json b/src/main/resources/assets/betterend/models/block/lumecorn_light_1.json deleted file mode 100644 index c7c70e16..00000000 --- a/src/main/resources/assets/betterend/models/block/lumecorn_light_1.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", - "textures": { - "particle": "betterend:block/lumecorn_light_1", - "texture": "betterend:block/lumecorn_light_1" - }, - "elements": [ - { - "__comment": "Box1", - "from": [ 5, 0, 5 ], - "to": [ 11, 16, 11 ], - "faces": { - "down": { "uv": [ 5, 5, 11, 11 ], "texture": "#texture", "cullface": "down" }, - "up": { "uv": [ 5, 5, 11, 11 ], "texture": "#texture", "cullface": "up" }, - "north": { "uv": [ 5, 0, 11, 16 ], "texture": "#texture" }, - "south": { "uv": [ 5, 0, 11, 16 ], "texture": "#texture" }, - "west": { "uv": [ 5, 0, 11, 16 ], "texture": "#texture" }, - "east": { "uv": [ 5, 0, 11, 16 ], "texture": "#texture" } - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_light_2.json b/src/main/resources/assets/betterend/models/block/lumecorn_light_2.json deleted file mode 100644 index 866e326b..00000000 --- a/src/main/resources/assets/betterend/models/block/lumecorn_light_2.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", - "textures": { - "particle": "betterend:block/lumecorn_light_1", - "texture": "betterend:block/lumecorn_light_1" - }, - "elements": [ - { - "__comment": "Box1", - "from": [ 6, 0, 6 ], - "to": [ 10, 16, 10 ], - "faces": { - "down": { "uv": [ 6, 6, 10, 10 ], "texture": "#texture", "cullface": "down" }, - "up": { "uv": [ 6, 6, 10, 10 ], "texture": "#texture", "cullface": "up" }, - "north": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, - "south": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, - "west": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, - "east": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" } - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_light_3.json b/src/main/resources/assets/betterend/models/block/lumecorn_light_3.json deleted file mode 100644 index 771c759e..00000000 --- a/src/main/resources/assets/betterend/models/block/lumecorn_light_3.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", - "textures": { - "particle": "betterend:block/lumecorn_light_1", - "texture": "betterend:block/lumecorn_light_1" - }, - "elements": [ - { - "__comment": "Box1", - "from": [ 7, 0, 7 ], - "to": [ 9, 16, 9 ], - "faces": { - "down": { "uv": [ 7, 7, 9, 9 ], "texture": "#texture", "cullface": "down" }, - "up": { "uv": [ 7, 7, 9, 9 ], "texture": "#texture", "cullface": "up" }, - "north": { "uv": [ 7, 0, 9, 16 ], "texture": "#texture" }, - "south": { "uv": [ 7, 0, 9, 16 ], "texture": "#texture" }, - "west": { "uv": [ 7, 0, 9, 16 ], "texture": "#texture" }, - "east": { "uv": [ 7, 0, 9, 16 ], "texture": "#texture" } - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_light_bottom.json b/src/main/resources/assets/betterend/models/block/lumecorn_light_bottom.json new file mode 100644 index 00000000..c46d9653 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_light_bottom.json @@ -0,0 +1,31 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/lumecorn_light_bottom", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneX2", + "from": [ 0, 0, 0 ], + "to": [ 0.001, 16, 22.5 ], + "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, 0, 0 ], + "to": [ 16.001, 16, 22.5 ], + "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_light_middle.json b/src/main/resources/assets/betterend/models/block/lumecorn_light_middle.json new file mode 100644 index 00000000..5bdf6223 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_light_middle.json @@ -0,0 +1,31 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/lumecorn_light_middle", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneX2", + "from": [ 0, 0, 0 ], + "to": [ 0.001, 16, 22.5 ], + "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, 0, 0 ], + "to": [ 16.001, 16, 22.5 ], + "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_light_top.json b/src/main/resources/assets/betterend/models/block/lumecorn_light_top.json new file mode 100644 index 00000000..bde1ef2a --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_light_top.json @@ -0,0 +1,31 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/lumecorn_light_top", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneX2", + "from": [ 0, 0, 0 ], + "to": [ 0.001, 16, 22.5 ], + "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, 0, 0 ], + "to": [ 16.001, 16, 22.5 ], + "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_light_top_middle.json b/src/main/resources/assets/betterend/models/block/lumecorn_light_top_middle.json new file mode 100644 index 00000000..f9639ab8 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_light_top_middle.json @@ -0,0 +1,31 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/lumecorn_light_top_middle", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneX2", + "from": [ 0, 0, 0 ], + "to": [ 0.001, 16, 22.5 ], + "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, 0, 0 ], + "to": [ 16.001, 16, 22.5 ], + "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/salteago_01.json b/src/main/resources/assets/betterend/models/block/salteago_01.json new file mode 100644 index 00000000..d7efc8e0 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/salteago_01.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/salteago" + } +} diff --git a/src/main/resources/assets/betterend/models/block/salteago_02.json b/src/main/resources/assets/betterend/models/block/salteago_02.json new file mode 100644 index 00000000..1f3cd308 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/salteago_02.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/salteago" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/salteago_03.json b/src/main/resources/assets/betterend/models/block/salteago_03.json new file mode 100644 index 00000000..3e56d4ed --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/salteago_03.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/salteago" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/salteago_04.json b/src/main/resources/assets/betterend/models/block/salteago_04.json new file mode 100644 index 00000000..abc5b3fc --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/salteago_04.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/salteago" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/vaiolush_fern_01.json b/src/main/resources/assets/betterend/models/block/vaiolush_fern_01.json new file mode 100644 index 00000000..a77378fd --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/vaiolush_fern_01.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/vaiolush_fern" + } +} diff --git a/src/main/resources/assets/betterend/models/block/vaiolush_fern_02.json b/src/main/resources/assets/betterend/models/block/vaiolush_fern_02.json new file mode 100644 index 00000000..d65a3ecd --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/vaiolush_fern_02.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/vaiolush_fern" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/vaiolush_fern_03.json b/src/main/resources/assets/betterend/models/block/vaiolush_fern_03.json new file mode 100644 index 00000000..0e7d06d6 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/vaiolush_fern_03.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/vaiolush_fern" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/vaiolush_fern_04.json b/src/main/resources/assets/betterend/models/block/vaiolush_fern_04.json new file mode 100644 index 00000000..4e1eaf13 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/vaiolush_fern_04.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/vaiolush_fern" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/blooming_cooksonia.json b/src/main/resources/assets/betterend/models/item/blooming_cooksonia.json new file mode 100644 index 00000000..a93ec2e2 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/blooming_cooksonia.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "betterend:block/blooming_cooksonia" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/fracturn.json b/src/main/resources/assets/betterend/models/item/fracturn.json new file mode 100644 index 00000000..d233c677 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/fracturn.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "betterend:block/fracturn" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/salteago.json b/src/main/resources/assets/betterend/models/item/salteago.json new file mode 100644 index 00000000..720dd34b --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/salteago.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "betterend:block/salteago" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/vaiolush_fern.json b/src/main/resources/assets/betterend/models/item/vaiolush_fern.json new file mode 100644 index 00000000..ff63ab3c --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/vaiolush_fern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "betterend:block/vaiolush_fern" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/blooming_cooksonia.png b/src/main/resources/assets/betterend/textures/block/blooming_cooksonia.png new file mode 100644 index 0000000000000000000000000000000000000000..673ee47c2130861828cedc1eeb39038a036ad0a9 GIT binary patch literal 1797 zcmbVNTWB0r7@lp|khBd5EmC7^$B7iRo$JnCX2_VPyJ-{XrXgKS3Zgx8&e`1|yK}~w z+3Y3{-X3afeaJ(xC^gMC*fSwNOQ*wpq{Y%|ucgT$r8P zcfRlYFXx|^Murb{ZSLO8Fih9bU}}_}?+K2McKW~jw<@5gPG|6#$1q#A1xJW^?d%SQ z2`^ijaeq90Scjx207OhIREiEoGfZz^#Q|^v`>cs`mThp?=Pz-rg$!;inwHW|66dYK zX%`=z9?rn&38*2i?=iNwqEmt*_5oWd7Hm(i7+j54r`N$_kz;ERf5PDU13`8?J;El5 zi`l3UXwf@^%lp2g zi(_OLZe2ds@zz9rI@(qqUt%p!_ zTC}#;NE1z%SOJbG3sMkL4TxY1=ak$+O&mcH7jO~VzDKcg3+v>GPrN+219j{58UdQx zbh@Rnu9sr5CE@u4lQfJ*Le@olnJEX0qu3)Q7vh0QYO^PZ#?g~520n2!gcO>E8fjW) zlgXek3HISJ%SNQ^J+f*IP5~bqoFXYQEg7#!89A;?iY`a?N)cU>>d-VnR(5JVs2tOk z#2P5=8U%cBS1^KlmbgVgW44MQhegNEacnD-dXf}~ONFVsNXr(`lg5n12>wS(0q#XaK#-kAQ*iwv z%8m8qJf@`oQT)2PN3wnyxVS$@bGMQH67S^S1Cw`izmaOzZLQ~iO+Wrm_l@MhJg{?^ zPEe5x;t_*cQ!kD9@2b__t(r?sI30GuWoydPo7SAhHl=py6yCRd?kb(&Uk|1FGl@^( zt!lNeZQ!}_w#T2jxpL{o<@xH5)345a;e7W^`NZeqQ}FFYi@A6rIlo7~wmg=5=;JM4 zp6XuN_DdLrr9WOja(zd~ROr`Dv+ZY2#jEGuTYBq<+lR_sC!a*(!uB`!esuo63!(S7 zFFx`75_7NLkDguJ+S~or!psAg-;hF^4(>V7*>Pq6%S>2nGfuu6-g&Wmc4zO_+2pSF z-+#Kg((~7@V_lyeujmV}d?G{z^VZ7EwzJ;~4}SRP?eE>gm z1k0(@+FmtHBw<_;IGhmXgOJKVsMm4Mn42$)L!Co;WFg!42v(?LogDVDm&13Uu0P%& zKvJ7d*EKfvVp(+w&+i^5VN?^cDcZ|SIEWiS9v*Xb)ICmY?hB%El%$J*kKGK$`C6g+ zYnJI`GAK-(e(Z>8LtOCouiJxCz(*=0@}fXW#)^DKkQ822gvbFtqVRkLn#RyHCN_f# zvJ#OtKuOm?;Di4JLtQbjYXK6oX@M-_96QU<^-L;BoX0K^Chj6-7wNRpYkNMhb<~?u z84`BbG@+s!dQ6K*kVS|`tSCg|tR@E0@J3vQqG)Jspte7S^|7G1!Tw60L#z{ye^g^} zF(Qb(!Nw6XSUnbnEQpCw(&NU0}U6Z_OAith9a0LmYq{-2kB+G0x262GMABl{e{fTPQ#e+FfPzpw0*~)!XJK z`PhJDbeuo^xTUBlp9(&@YK|wYwxzG^zkd(&aEVvZ+7zUl+G{C4mK?O^7bWbeCfh! zY31UhqtB%Zdyj>l|NY7X_r)j0wOfDeegBh7&&j|!>GEm&(=*G7?}n!L!)wFY__H0a?@^zg`s}aiMDy?zT>b%m-W>k5>zhXgo*h5!aTR`a5v%4R8Lu&n^@r58z(YZ%m4rY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_light_bottom.png b/src/main/resources/assets/betterend/textures/block/lumecorn_light_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..e65650c5440a41d5dd5980f9c82270e58b537060 GIT binary patch literal 385 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc4Pu@yjv*HQb0_<99WoGUiD&u99^!JaRY~dY z&TkCszDiYT_CL5~yrb-~my3XS?35wG<+!dn)(03){2PUUhdGSdDn%U zVs6+Z3*2KWHE*54ku>j^TJnY$XIpe#WQwI`$FLl5>N~XT_T|23cUQjSePZ2_?2uC4 z@aJ!td+PC{Pk1caWRFgjf5P)YbFOSm-^(tY`0@u=*|T<)bUs_oXArx~=kXhc$N%m! zW`sp~<&+;_KYJvT;mSHUc7wmGm=D+%uy=gqT;5o@U2v_57eaD4!KnY%q$3M-WpoEP|$}SYOFf)N$m35j3WoaeC=ZnFhKR zr!PiiR<@F;pr>bSbbe+aug;9Cyhit(_BY2$0#PuKtALU*VLC!7PFI8la`vtv4Jr_K zJWh+AM=&U7K@!^tM3`tm<-$SG!!ulz<%8iUI9+gEOMtLgEHcFqgY7ZM@jMUNAPfcr1QBqiO;;%eOs8{Gq$(pJN40g! z)v*aYS!D!Ix^bFBy!jNvs%e`}HD4riu%uX!V_5HLTR>Ujk}jNWr?YRjyV)q)>e>tOgZ>UZwx4{AO2GZb@4a zD+X&l?OC);|4OSsiP<+k0c*fmg#E(g|jvr-Nib^oQr+)HXZQf94QUlV9#PIAN-3eC; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_light_top.png b/src/main/resources/assets/betterend/textures/block/lumecorn_light_top.png new file mode 100644 index 0000000000000000000000000000000000000000..d5955163d41bdc9c174f473047d0aff4cc6b8ed3 GIT binary patch literal 1484 zcmbVMOKjXk7&d|yh?2G!gn&Z_N0kc2p0W28k7}ZH9mpaaqI9Khr3x`Sp4~NBdt7^x z-OZ(e6BQh|a6l;H#sNW9RY)Ll;1bjb$|an7p;C{CheQs5R5pzFVKt~gTg&#mzWM(5 ze{pH?#i@xWClp1Qsw_Cmay*iLj~tZ$qq}=V4v$6)XA?y^w3U7jym#WzQ;PD?u3xQ* zn)@=QJkW{9>rC$kkwh!X$=Pm1=n4~{&YFH`tG|Bvl?r^%R?ie%2?8bv=mzaD!ChM&@M1Ynx1kCK5V2ybbE!a3bC*Dw#|#woqDGCp z2}+i36p>}-p93Z`N)VNxk<*ZYQ4!}XFnUxeE%q9C*?D0kORj9SB}9ZF>~uPMC#Unc z2@T7#ATpt8Y7(I(y-<*@7ADhU28Sgy_9Nl*5TuNx&R2!4N==6*1W`sCCL=dVhruq1 zprNDGqyf;Q87^9l+XLYqg{;j27K%h-jSL&LxZp{P{|j|?yib61t?Ono?x;%;WFitV zzb4HXIpmJ$q}q!ZTxJPhjVYU7lWI<<)d zf<1~GJPwGo*$+sQ!6S)`)Zx0M9o$nOV#9jPw(cCZm zTk~#ji+}O{*91E!rCXdcCnUH|C_P^J=**r2q2ewDJKXPotn|G+Vea3r7mh5Rpk%+` zQ*7|ZRTz1>bL^q540S0RIqeOE1egO^-N=dGIi2le^+63p*c+gTe~DWM4fRl$pG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/salteago.png b/src/main/resources/assets/betterend/textures/block/salteago.png new file mode 100644 index 0000000000000000000000000000000000000000..a79bedcb1cea6e30620d9fa80ee4b0abc9f328ad GIT binary patch literal 2113 zcmb_dTWl0n7#^r;X{CTxNP`IsQxyoz&UNQT*QRu-ZQ?>x8mZ8So}F`cJ7MR-%#__? z#kL{@FA<_7L`V$cgAYb)Fj_+*Xo;Fo<-rF?yx@gMj6o`mwAAW)X1lwBDM*N$%+8sa z?|lFF|NnQ++1s-Ik;;n26$C+4HaA6E@qIyX%_+tIOUJSR-^!h)$323$yDGS55w9Gs zCWz7_Mq9hz9(z>NZ8HR*9Y>*z>0mTL)YfGjpl?M!8AnOOicpu2pP)zsMyO5U7#njM zP?yoP!$li+tZ&nIY}Hjr)jdqsW;9G-A|H?$Gi7;NCPL+SH9QVpGZdMF_*)}XeGrgr zkF}5uwu{JcNTPL4kwS3&v!C!*C%sNGS(|dJ*SzyQy4os52;qOl0{U#&Sih(`Ea%*Ja;? zy7>8q0JyZVSTV+oT1>MT!t>W{$7$pXG9%h+>v0g%iafj9)zP}`SY}O-jiWWV2>7XI8l3IhEvRxb)s}pi6Vll1R z@_bhySmXo&(kc?-v?Plht%MZ`^CnoR0}jbTqQJJnHSkgcsq0w-RS+|RM4Su5 zaDrCjP@+XBDs)_tbedOr8L6TyLzNE7RG-APyB&WqH`DKd?YCC1#-+Hx2@=hz z2+|2C%5*%;$=H}YRAn`;qOerRekS$Uy#ibC;~lEc7f0^`RubVIl%eiCpWAciw9uLI zxnX_%ulX>+-Z^bG=HD*NeYX#G5tj6YO zeVcMxpUP(IN*?Un+rO3_EgkHeb6{%rP+xQ7*I7YW#NB)J+83wF4~8Ztey%#VAhmdK z@3GDm6KCd#7iu2+y!Or1#PE0D96H;%d2{=&S%*%4I5qjg`M#x>&-WYi5{u?uyfXG% zzp*komQ^Yzu8eZS$JWTzJE#5}CO`h@nRwO6wYs|Ala~hGe(}|Tg?)!B_)|y8AL~Z4 z!nqLO4Aax_h4uL`1sikPSgDleIoP@xh1PhE2_2$!XS8RXK&ea zPj{3byU#j#x@LLxw;e;DjgEa;Hnfc7B(QAvo-Ob7o0BEK&l|bA=g|AhItYH@g?H!6 z){*Kfzg$|gJDbh+n`IxAK2SRQ;zefH@wcdkBf|%YGi+193oqN=J@PFgg0>r2L&DaW?Af`R!9#zD^ zzIuZ29MlqBPFMU{Nj5S*s2EA)%VkWACWz*ioC)PM$RU#`rRibn@<&4ysVQMj>ZVu&g%}$(Yigi%n(JkY-y&W89M1Q!lcpb zgek0aB87}uq1EkDnQ+0F95fl=W8IXBKt-OmmAelmP|$>Zev1Z({fE$jI8~{O> z@VR2hnB$+Qs$UiZst}}wKmgG)F9>u9vNA0Mc_6Ezs0yN3W_!-k@KS^6n^|2|3T8wK z7J~c%nuQ8pCrLr2L;hfh4sal(1fUucIN3FH(IZk!vvK$Gr6sZy^^`_wjV#(ig0gG( zFeSTvMhaEBtxZyoyNXur5)K?m{c&jVXw{qQ_;_PPz@GtW<(_2Ih(W8vUw^U}rjp1SE% z3Y$F1^EZC`vfDb+O-Uhq272kPML)?Ll#I=zp4)Bo7O zp$yo!Q|G#?IYHQdNYyHdf zb@dCw#M0Vo5?sq(KK?`3%45T|N4}Up_m`H~n7X3j)QcbQ9^1bCWOZRfe_{XFTl;-4 d%~|Fpi2U#;*4C=;dfbnIwk7S+_ZP3;{5P&%&I14d literal 0 HcmV?d00001 From 0610389fa9153e337005bdbf4dfc8a1eada73a6a Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 20 Jan 2021 18:10:37 +0300 Subject: [PATCH 192/463] Some features rebalance --- src/main/java/ru/betterend/registry/EndFeatures.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 96c646e5..11e21d00 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -157,10 +157,10 @@ public class EndFeatures { public static final EndFeature SULPHUR_HILL = EndFeature.makeChansedFeature("sulphur_hill", new SulphurHillFeature(), 8); // Ores // - public static final EndFeature ENDER_ORE = EndFeature.makeOreFeature("ender_ore", EndBlocks.ENDER_ORE, 6, 3, 0, 4, 96); - public static final EndFeature AMBER_ORE = EndFeature.makeOreFeature("amber_ore", EndBlocks.AMBER_ORE, 12, 6, 0, 4, 96); - public static final EndFeature VIOLECITE_LAYER = EndFeature.makeLayerFeature("violecite_layer", EndBlocks.VIOLECITE, 15, 4, 96, 8); - public static final EndFeature FLAVOLITE_LAYER = EndFeature.makeLayerFeature("flavolite_layer", EndBlocks.FLAVOLITE, 12, 4, 96, 6); + public static final EndFeature ENDER_ORE = EndFeature.makeOreFeature("ender_ore", EndBlocks.ENDER_ORE, 8, 3, 0, 16, 128); + public static final EndFeature AMBER_ORE = EndFeature.makeOreFeature("amber_ore", EndBlocks.AMBER_ORE, 12, 6, 0, 16, 128); + public static final EndFeature VIOLECITE_LAYER = EndFeature.makeLayerFeature("violecite_layer", EndBlocks.VIOLECITE, 15, 16, 128, 8); + public static final EndFeature FLAVOLITE_LAYER = EndFeature.makeLayerFeature("flavolite_layer", EndBlocks.FLAVOLITE, 12, 16, 128, 6); // Buildings public static final EndFeature CRASHED_SHIP = EndFeature.makeChansedFeature("crashed_ship", new CrashedShipFeature(), 500); From bf8234a02e9d0f7f2746b1e2eb1e03e86b4a02ef Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 20 Jan 2021 21:50:26 +0300 Subject: [PATCH 193/463] Thalassium prototype --- .../java/ru/betterend/item/EndShovelItem.java | 32 ++++++++++++++++++ .../java/ru/betterend/item/EndSwordItem.java | 18 ++++++++++ .../item/material/EndToolMaterial.java | 3 ++ .../java/ru/betterend/registry/EndBlocks.java | 3 ++ .../ru/betterend/registry/EndFeatures.java | 2 ++ .../java/ru/betterend/registry/EndItems.java | 19 ++++++++--- .../assets/betterend/lang/en_us.json | 10 +++++- .../assets/betterend/lang/ru_ru.json | 10 +++++- .../models/item/aeternium_shovel.json | 6 ---- .../models/item/aeternium_sword.json | 6 ---- .../models/item/terminite_shovel.json | 6 ---- .../models/item/terminite_sword.json | 6 ---- .../textures/block/thalassium_ore.png | Bin 0 -> 611 bytes .../textures/item/thalassium_axe.png | Bin 0 -> 2002 bytes .../textures/item/thalassium_hoe.png | Bin 0 -> 1965 bytes .../textures/item/thalassium_ingot.png | Bin 0 -> 341 bytes .../textures/item/thalassium_pickaxe.png | Bin 0 -> 2034 bytes .../textures/item/thalassium_shovel.png | Bin 0 -> 1944 bytes .../textures/item/thalassium_sword.png | Bin 0 -> 2024 bytes 19 files changed, 91 insertions(+), 30 deletions(-) create mode 100644 src/main/java/ru/betterend/item/EndShovelItem.java create mode 100644 src/main/java/ru/betterend/item/EndSwordItem.java delete mode 100644 src/main/resources/assets/betterend/models/item/aeternium_shovel.json delete mode 100644 src/main/resources/assets/betterend/models/item/aeternium_sword.json delete mode 100644 src/main/resources/assets/betterend/models/item/terminite_shovel.json delete mode 100644 src/main/resources/assets/betterend/models/item/terminite_sword.json create mode 100644 src/main/resources/assets/betterend/textures/block/thalassium_ore.png create mode 100644 src/main/resources/assets/betterend/textures/item/thalassium_axe.png create mode 100644 src/main/resources/assets/betterend/textures/item/thalassium_hoe.png create mode 100644 src/main/resources/assets/betterend/textures/item/thalassium_ingot.png create mode 100644 src/main/resources/assets/betterend/textures/item/thalassium_pickaxe.png create mode 100644 src/main/resources/assets/betterend/textures/item/thalassium_shovel.png create mode 100644 src/main/resources/assets/betterend/textures/item/thalassium_sword.png diff --git a/src/main/java/ru/betterend/item/EndShovelItem.java b/src/main/java/ru/betterend/item/EndShovelItem.java new file mode 100644 index 00000000..2af12d3a --- /dev/null +++ b/src/main/java/ru/betterend/item/EndShovelItem.java @@ -0,0 +1,32 @@ +package ru.betterend.item; + +import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.block.BlockState; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ShovelItem; +import net.minecraft.item.ToolMaterial; +import net.minecraft.tag.Tag; +import ru.betterend.patterns.Patterned; +import ru.betterend.patterns.Patterns; + +public class EndShovelItem extends ShovelItem implements DynamicAttributeTool, Patterned { + public EndShovelItem(ToolMaterial material, float attackDamage, float attackSpeed, Settings settings) { + super(material, attackDamage, attackSpeed, settings); + } + + @Override + public int getMiningLevel(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { + if (tag.equals(FabricToolTags.SHOVELS)) { + return this.getMaterial().getMiningLevel(); + } + return 0; + } + + @Override + public String getModelPattern(String name) { + return Patterns.createJson(Patterns.ITEM_HANDHELD, name); + } +} diff --git a/src/main/java/ru/betterend/item/EndSwordItem.java b/src/main/java/ru/betterend/item/EndSwordItem.java new file mode 100644 index 00000000..46afd39c --- /dev/null +++ b/src/main/java/ru/betterend/item/EndSwordItem.java @@ -0,0 +1,18 @@ +package ru.betterend.item; + +import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; +import net.minecraft.item.SwordItem; +import net.minecraft.item.ToolMaterial; +import ru.betterend.patterns.Patterned; +import ru.betterend.patterns.Patterns; + +public class EndSwordItem extends SwordItem implements DynamicAttributeTool, Patterned { + public EndSwordItem(ToolMaterial material, int attackDamage, float attackSpeed, Settings settings) { + super(material, attackDamage, attackSpeed, settings); + } + + @Override + public String getModelPattern(String name) { + return Patterns.createJson(Patterns.ITEM_HANDHELD, name); + } +} diff --git a/src/main/java/ru/betterend/item/material/EndToolMaterial.java b/src/main/java/ru/betterend/item/material/EndToolMaterial.java index 49584f64..5060662f 100644 --- a/src/main/java/ru/betterend/item/material/EndToolMaterial.java +++ b/src/main/java/ru/betterend/item/material/EndToolMaterial.java @@ -8,6 +8,9 @@ import net.minecraft.util.Lazy; import ru.betterend.registry.EndItems; public enum EndToolMaterial implements ToolMaterial { + THALASSIUM(2, 320, 6.5F, 4.5F, 13, () -> { + return Ingredient.ofItems(EndItems.AETERNIUM_INGOT); + }), TERMINITE(3, 1230, 8.5F, 3.0F, 14, () -> { return Ingredient.ofItems(EndItems.TERMINITE_INGOT); }), diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 851a1cff..0ec3c22c 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -1,5 +1,6 @@ package ru.betterend.registry; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.Block; import net.minecraft.block.Blocks; import net.minecraft.block.MaterialColor; @@ -86,6 +87,7 @@ import ru.betterend.blocks.UmbrellaTreeClusterEmptyBlock; import ru.betterend.blocks.UmbrellaTreeMembraneBlock; import ru.betterend.blocks.UmbrellaTreeSaplingBlock; import ru.betterend.blocks.VentBubbleColumnBlock; +import ru.betterend.blocks.basis.BaseBlock; import ru.betterend.blocks.basis.EndCropBlock; import ru.betterend.blocks.basis.EndLeavesBlock; import ru.betterend.blocks.basis.EndOreBlock; @@ -278,6 +280,7 @@ public class EndBlocks { public static final Block SILK_MOTH_NEST = registerBlock("silk_moth_nest", new SilkMothNestBlock()); // Ores // + public static final Block THALASSIUM_ORE = registerBlock("thalassium_ore", new BaseBlock(FabricBlockSettings.copyOf(Blocks.END_STONE))); public static final Block ENDER_ORE = registerBlock("ender_ore", new EndOreBlock(EndItems.ENDER_SHARD, 1, 3, 5)); public static final Block AMBER_ORE = registerBlock("amber_ore", new EndOreBlock(EndItems.RAW_AMBER, 1, 2, 4)); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 11e21d00..f04d3eb8 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -157,6 +157,7 @@ public class EndFeatures { public static final EndFeature SULPHUR_HILL = EndFeature.makeChansedFeature("sulphur_hill", new SulphurHillFeature(), 8); // Ores // + public static final EndFeature THALASSIUM_ORE = EndFeature.makeOreFeature("thalassium_ore", EndBlocks.THALASSIUM_ORE, 12, 6, 0, 16, 128); public static final EndFeature ENDER_ORE = EndFeature.makeOreFeature("ender_ore", EndBlocks.ENDER_ORE, 8, 3, 0, 16, 128); public static final EndFeature AMBER_ORE = EndFeature.makeOreFeature("amber_ore", EndBlocks.AMBER_ORE, 12, 6, 0, 16, 128); public static final EndFeature VIOLECITE_LAYER = EndFeature.makeLayerFeature("violecite_layer", EndBlocks.VIOLECITE, 15, 16, 128, 8); @@ -186,6 +187,7 @@ public class EndFeatures { } addFeature(FLAVOLITE_LAYER, features); + addFeature(THALASSIUM_ORE, features); addFeature(ENDER_ORE, features); addFeature(CRASHED_SHIP, features); diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index 9c3c64dd..30011e19 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -40,7 +40,9 @@ import ru.betterend.item.EndAxeItem; import ru.betterend.item.EndHammerItem; import ru.betterend.item.EndHoeItem; import ru.betterend.item.EndPickaxeItem; +import ru.betterend.item.EndShovelItem; import ru.betterend.item.EndSpawnEggItem; +import ru.betterend.item.EndSwordItem; import ru.betterend.item.EternalCrystalItem; import ru.betterend.item.PatternedItem; import ru.betterend.item.material.EndArmorMaterial; @@ -55,6 +57,7 @@ public class EndItems { // Materials // public final static Item ENDER_DUST = registerItem("ender_dust"); public final static Item ENDER_SHARD = registerItem("ender_shard"); + public final static Item THALASSIUM_INGOT = registerItem("thalassium_ingot"); public final static Item TERMINITE_INGOT = registerItem("terminite_ingot"); public final static Item AETERNIUM_INGOT = registerItem("aeternium_ingot"); public final static Item END_LILY_LEAF = registerItem("end_lily_leaf"); @@ -87,18 +90,26 @@ public class EndItems { public static final Item CRYSTALITE_BOOTS = registerItem("crystalite_boots", new ArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.FEET, makeItemSettings().rarity(Rarity.UNCOMMON))); // Tools // - public static final ToolItem TERMINITE_SHOVEL = registerTool("terminite_shovel", new ShovelItem(EndToolMaterial.TERMINITE, 1.5F, -3.0F, makeItemSettings())); - public static final ToolItem TERMINITE_SWORD = registerTool("terminite_sword", new SwordItem(EndToolMaterial.TERMINITE, 3, -2.4F, makeItemSettings())); + public static final ToolItem THALASSIUM_SHOVEL = registerTool("thalassium_shovel", new EndShovelItem(EndToolMaterial.THALASSIUM, 1.0F, -3.0F, makeItemSettings())); + public static final ToolItem THALASSIUM_SWORD = registerTool("thalassium_sword", new EndSwordItem(EndToolMaterial.THALASSIUM, 2, -2.4F, makeItemSettings())); + public static final ToolItem THALASSIUM_PICKAXE = registerTool("thalassium_pickaxe", new EndPickaxeItem(EndToolMaterial.THALASSIUM, 1, -2.8F, makeItemSettings())); + public static final ToolItem THALASSIUM_AXE = registerTool("thalassium_axe", new EndAxeItem(EndToolMaterial.THALASSIUM, 5.0F, -3.0F, makeItemSettings())); + public static final ToolItem THALASSIUM_HOE = registerTool("thalassium_hoe", new EndHoeItem(EndToolMaterial.THALASSIUM, -3, 0.0F, makeItemSettings())); + + public static final ToolItem TERMINITE_SHOVEL = registerTool("terminite_shovel", new EndShovelItem(EndToolMaterial.TERMINITE, 1.5F, -3.0F, makeItemSettings())); + public static final ToolItem TERMINITE_SWORD = registerTool("terminite_sword", new EndSwordItem(EndToolMaterial.TERMINITE, 3, -2.4F, makeItemSettings())); public static final ToolItem TERMINITE_PICKAXE = registerTool("terminite_pickaxe", new EndPickaxeItem(EndToolMaterial.TERMINITE, 1, -2.8F, makeItemSettings())); public static final ToolItem TERMINITE_AXE = registerTool("terminite_axe", new EndAxeItem(EndToolMaterial.TERMINITE, 6.0F, -3.0F, makeItemSettings())); public static final ToolItem TERMINITE_HOE = registerTool("terminite_hoe", new EndHoeItem(EndToolMaterial.TERMINITE, -3, 0.0F, makeItemSettings())); public static final ToolItem TERMINITE_HAMMER = registerTool("terminite_hammer", new EndHammerItem(EndToolMaterial.TERMINITE, 5.0F, -3.2F, 0.3D, makeItemSettings())); - public static final ToolItem AETERNIUM_SHOVEL = registerTool("aeternium_shovel", new ShovelItem(EndToolMaterial.AETERNIUM, 1.5F, -3.0F, makeItemSettings())); - public static final ToolItem AETERNIUM_SWORD = registerTool("aeternium_sword", new SwordItem(EndToolMaterial.AETERNIUM, 3, -2.4F, makeItemSettings())); + + public static final ToolItem AETERNIUM_SHOVEL = registerTool("aeternium_shovel", new EndShovelItem(EndToolMaterial.AETERNIUM, 1.5F, -3.0F, makeItemSettings())); + public static final ToolItem AETERNIUM_SWORD = registerTool("aeternium_sword", new EndSwordItem(EndToolMaterial.AETERNIUM, 3, -2.4F, makeItemSettings())); public static final ToolItem AETERNIUM_PICKAXE = registerTool("aeternium_pickaxe", new EndPickaxeItem(EndToolMaterial.AETERNIUM, 1, -2.8F, makeItemSettings())); public static final ToolItem AETERNIUM_AXE = registerTool("aeternium_axe", new EndAxeItem(EndToolMaterial.AETERNIUM, 5.0F, -3.0F, makeItemSettings())); public static final ToolItem AETERNIUM_HOE = registerTool("aeternium_hoe", new EndHoeItem(EndToolMaterial.AETERNIUM, -3, 0.0F, makeItemSettings())); public static final ToolItem AETERNIUM_HAMMER = registerTool("aeternium_hammer", new EndHammerItem(EndToolMaterial.AETERNIUM, 6.0F, -3.0F, 0.3D, makeItemSettings())); + public static final ToolItem IRON_HAMMER = registerTool("iron_hammer", new EndHammerItem(ToolMaterials.IRON, 5.0F, -3.2F, 0.2D, makeItemSettings())); public static final ToolItem GOLDEN_HAMMER = registerTool("golden_hammer", new EndHammerItem(ToolMaterials.GOLD, 4.5F, -3.4F, 0.3D, makeItemSettings())); public static final ToolItem DIAMOND_HAMMER = registerTool("diamond_hammer", new EndHammerItem(ToolMaterials.DIAMOND, 5.5F, -3.1F, 0.2D, makeItemSettings())); diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index dfba0019..07b2716f 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -574,5 +574,13 @@ "block.betterend.vaiolush_fern": "Vaiolush Fern", "entity.betterend.silk_moth": "Silk Moth", "item.betterend.silk_fiber": "Silk Fiber", - "item.betterend.spawn_egg_silk_moth": "Silk Moth Spawn Egg" + "item.betterend.spawn_egg_silk_moth": "Silk Moth Spawn Egg", + + "block.betterend.thalassium_ore": "Thalassium Ore", + "item.betterend.thalassium_axe": "Thalassium Axe", + "item.betterend.thalassium_hoe": "Thalassium Hoe", + "item.betterend.thalassium_ingot": "Thalassium Ingot", + "item.betterend.thalassium_pickaxe": "Thalassium Pickaxe", + "item.betterend.thalassium_shovel": "Thalassium Shovel", + "item.betterend.thalassium_sword": "Thalassium Sword" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index e337d629..454135a5 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -576,5 +576,13 @@ "block.betterend.vaiolush_fern": "Пышнопёрый папоротник", "entity.betterend.silk_moth": "Шелковичная моль", "item.betterend.silk_fiber": "Шёлковое волокно", - "item.betterend.spawn_egg_silk_moth": "Яйцо призыва шелковичной моли" + "item.betterend.spawn_egg_silk_moth": "Яйцо призыва шелковичной моли", + + "block.betterend.thalassium_ore": "Талласиевая руда", + "item.betterend.thalassium_axe": "Талласиевый топор", + "item.betterend.thalassium_hoe": "Талласиевая мотыга", + "item.betterend.thalassium_ingot": "Талласиевый слиток", + "item.betterend.thalassium_pickaxe": "Талласиевая кирка", + "item.betterend.thalassium_shovel": "Талласиевая лопата", + "item.betterend.thalassium_sword": "Талласиевый меч" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/aeternium_shovel.json b/src/main/resources/assets/betterend/models/item/aeternium_shovel.json deleted file mode 100644 index 8592a817..00000000 --- a/src/main/resources/assets/betterend/models/item/aeternium_shovel.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/handheld", - "textures": { - "layer0": "betterend:item/aeternium_shovel" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/aeternium_sword.json b/src/main/resources/assets/betterend/models/item/aeternium_sword.json deleted file mode 100644 index c526a1d1..00000000 --- a/src/main/resources/assets/betterend/models/item/aeternium_sword.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/handheld", - "textures": { - "layer0": "betterend:item/aeternium_sword" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/terminite_shovel.json b/src/main/resources/assets/betterend/models/item/terminite_shovel.json deleted file mode 100644 index 2f34062b..00000000 --- a/src/main/resources/assets/betterend/models/item/terminite_shovel.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/handheld", - "textures": { - "layer0": "betterend:item/terminite_shovel" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/terminite_sword.json b/src/main/resources/assets/betterend/models/item/terminite_sword.json deleted file mode 100644 index 00cf03e3..00000000 --- a/src/main/resources/assets/betterend/models/item/terminite_sword.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/handheld", - "textures": { - "layer0": "betterend:item/terminite_sword" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/thalassium_ore.png b/src/main/resources/assets/betterend/textures/block/thalassium_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..1bc8e7e6b9aa952cb910c25524611e1730b002b3 GIT binary patch literal 611 zcmV-p0-XJcP)b`^FH49-uHWrqtlI%DK!8(HwXb$1uB$CU!jyD z{hA^Kh^7P}2qOkbifBqaE3VEBGmFar6lWKR!}aUNE3xzyrqpPyi90Q{)-;YzH%3Y+ zPUR!AvkQ{JUjX*@Pgr@Hqm-h^Gpch#RY5QxU`p-WdBs7&A5jo@V9tlfcO=g@ra0c( z#5|mH?xq)(owK;p0$`A&G`@dX9ogODs6{n22v1TC4Mm<2gwce%z5Nr`mM;16X%_%b zG$qx!VKxd#cXp{NCUyoU#K&8kRK2e2@c?F{fa0KFW^tM6D?xC$?i_XfZ4%n_dnID& zN$v7#K;!qncO$^r1l+WKuS9r~bZ3{i(_)aM&SBhXQREq(@FasQB~uTa5TM^HDe?@R z*YSQiyC9irv&h?;8LbJzh+Ear5QGt3f7|W2wsbiG*7yxR-hRgF!F|U=WB=Eyk!@_< zyE}3HBF`LoHklW1e2%v^dA-s`DMjP+ht-h^>lnu|wY%P|ai=vAvuDLY7@@Uhkfcm6 zT&H2JznuSuXiBu!m@-59>N*9j>wmb3w7tpuewQN8+%E)S1c2~lO`=89TI>I8JL0OL xVSIp1z?2%DoBD{BMEf`vpz*2p(6-OM_bY002ovPDHLkV1l@c8*~5w literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/thalassium_axe.png b/src/main/resources/assets/betterend/textures/item/thalassium_axe.png new file mode 100644 index 0000000000000000000000000000000000000000..84e3625186884d79fada3ef6bea66dc9443a0a8a GIT binary patch literal 2002 zcmbVNZD`zN98Wh^`?5lrpx0Jh%ot8ImzPWKlGs~q@4EHCtED?=-N5Zh^5ib`F3FO# zcP;4Ztb;jqRs7&;zgQ+hmF|PZ3iXu@9agFP&?$9bi=rPUb1)F9gZkv&)=F242e~{+ ze$Vgs`@cNTbGobZU|mgP4TfQLv5sgry4QPGRVDi0eQOnIFdU1AL_ZUxMV5OEXK5xx(IJWnkTfIFK`9{O#UFvxY*mxGqX&vw=qXI3 zT-TB)Dx1yvvjM+pCn-i0MT%xAmL(B_bOsF<-*V_-QYsJWy52IIG`I=fzcpf@zq6hU*|KQ^r~;(>0xxc^B&P z=XC-owefgaV?!^QOj*Kl+Xqk>#e{5#b`paYq`IMF_S*_5%?SyHj zONHtxS;iv~uP_3>uSYjjGwVFEW)6%37lsLzW*Jm6k_jXj0aZ;31RtdX5=|GNaZ}Z` z!SzsFccVzh6xn5U)NPh5M)LGvO+QPx=B-yf7-zQk(1NJ6P(_JwJm*7l+{SvL8I( zv=UIf#TX_OuM43{6kqEbRBKClDbCNPAR^tQH4EyFskvET!`39K>{hy;x|@Fo3~cUx zYrR&mwch;(tL1;XFD6Gx0V4^~{!S5IJo)MtN<;m-YWZ(#cFhtTZN=WOdG%(?F4T`#;(gEkdE?=WC)@wN+4TA4%T@PJPaYnbSh;e2_fC7_ft^Pt7JP5KBl!Lb zegZG`4Zn17akcu);V;H!YsP%U@~&(3qi@g5%&V7v+a@%fZ}{c+%)2f0$keAh?mKd2@x`C8(KjcPQtt<|r}2yD zUzu+mYk0nKd1_nZ@Q=0lQu3P}Gb_KIIZ+>LI6kuX?9rtl_MRr!VfrbtsXegkiO$FO xRW41R^KHK!|EPNL0Rsvy%^HdMnvfB?A+aw+nw$1 zCU;4Z79XNfp;%ue3TjY6Dhi5L=!2;NK?+76T3SCIT16;6_)v?jis$ToHIXz15B7F; z_cy=a@Bc9~bE6~sd%AaYGYr!+oXw2U`_E!x`;NTFlRj2F*Mm5FNc?~*_UJD#shlCR;ZZHyL$8)1> zn)sMa#uXlkvc#%-TvUKA$q%v;5LE%Ff|%feXaL1X=xp=HQ8nKx7-N}-np*TJ#g)R) zGX$Yhsl+RZIPr^usO!1_BtepRir|B3H-uH*4R*E|GB`lK?S(dR*@zLEWHL-~)M+CG z$7|ENK{HJ>VL}ypf*1!;NOhov+Bk30FW1E_B;Yc3up0&xE4Hy-iG(C5ky}u=Kd%y? zsmp8~02iQI2YkUyVpEYJ(voV6?NQ&ROAVG+vPP~f$|z%1Qca9`699`B zby?^2q$u+iLJ~^Kx+GyMYUrEFEtWwVUqEXaG#AW1SZt2U_TIHkV=W=+REXD+Xz>ME zhPOb=P%ka#? z)8jp7ip>q>K zyOwKGZ>;mNk}9Nql}MG(5T&<-8MNhpeoSzPrCq*#ikE}g+No{=5Xgk9 zdzTFW+X;2zH%PreCY)bBGn&TCo*ou6u$_?8!)@J3)-aF>w~sSE;|~C~$|ar44N;k_ zf|U06tlZxK@O(+lsulu0U-D+(01!=v!te%N!S@!FNmi;|yWP{VXfn*-LDobU%>$zM n*OgFKxl>m65W3D<=zr-89p!t+SZR>e00000NkvXXu0mjfdYF|c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/thalassium_pickaxe.png b/src/main/resources/assets/betterend/textures/item/thalassium_pickaxe.png new file mode 100644 index 0000000000000000000000000000000000000000..525d35b45447879d39895c24e84e1f2ccfa4a83e GIT binary patch literal 2034 zcmbVNTWl0n7@lQqp;!{IYN%)!hf9hwJ7+Gtb4j-scB^f4YlV$e6Um;LIkP)<=isf`r6i>Y2SkO+n%&vvX$V zJKy*HmvhdZp~0tDEPrGl%ZK$U=7DV=UXix&c-~< z0ywpqOhaQ)FP7Di@PocF97Zi6i=zGPxQm#r$ah9P4fTy-o9n`8TqWfp7&u}PiR{>J+PYKnH{CV|rD1@Q6bCpKmyBllEGyxvDSYBdz$*Y$p&3Uvjq!z0 z4rDo?aH7IV3!u1bbQr+@1nZh&IGzP@%%%nNh;i*aMK&_2q@1GTVPWi!ueiu$lmXih zpsk^Sbdthh$4paKbY2C##EP_F@G7nI0-z;5q0zt)cnRQ!gtAajnU6!7(;zZbSu%u#7&i1RMYC&h(@5euSp|TW zHCCq$L4dR>#RZxb6QT;^K#)|nlL^-frXZ`MDlKz&{YnQb{buNAyyjvXdbQz)tTe3x zwQw;eDJ|?mq*Jxm<|5U)r@YkWmkJ1z-la9G>b_$HCFr5vJg)4$bU$+^|2`bMyZd|V zwW_U!?iX1t|I>XfIa&eQd4%_Oh6>}URJU3h=HFGTe7kMeti$nE91a_20DfqkBFM(n z9zG*(L}NLEh-?~2_hzMUw43wu-O&wGs}4mj%AxpO=awB<`~1tzA6`z&r<(U%Ig=aO|4VN6$3OS4dOy-iMtcr! zKQ^}Wq1Ea2T%ltx*B|>lf8f|v`OCL|n{2=OMkIQs34CyU;_J!d7f&r!Zb}sjt2BZ6|X>)qK<-uoA+wbn0sk259-MIM`)bZBGrv>8OvxVuK zKYe!c&Bsq2y>EtiJ)!wcohzZ){g<_2$D#ABJ?qiF$l!Y~bhPYVIn};IBsN`Mg@{&y Zc=-EoU%L47lBMCPJkU3o{$xvT*FPqXmel|N literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/thalassium_shovel.png b/src/main/resources/assets/betterend/textures/item/thalassium_shovel.png new file mode 100644 index 0000000000000000000000000000000000000000..f7fbf23245fff5712f204c635f6ed4c477fdbcb5 GIT binary patch literal 1944 zcmbVNTWB0r7@iW@#+X1uwWPjeI`vkP**SCH8L~~&Y&3yx4C&Hr@j}m>IkP)vcg{F7 z$!_vcib65a2L+LMfohRFR4heHLATjHxdLH~PiEJJ#`+aEm`GR!?&<7*T1+8aF# zlOS#`ALXO(Y*Bi6zN*GqHPKm3$qT|3Q9sacTqhjGyz zoe%K-`SBc@pGJnw4en+KswO2U;|Q|Va>)zLYMQI@nsgk$7C5#BiKf%sP%OyivlHwv z2{5ZBH6DqI#Og*;)PNx={j3B;T>!cu$~+KFpqaA4Hhvsc3v9=n%skrAqEBhA7)8D* z2$f1DS&@?@C zY__Gbrk8TLB@sp=vowrGLe@lwxj7#TlQ<+Z0m37*)aK4O8s8iaFpNl$Bc#+U)I`%V zJ3Jg0CdEE7<$5-$gu7PE!5J9gG$#Q`q$T4;IVYxQ)l6CI1F{J~9hxP!>&&f&N+2fz zQ%aelx(Z6W#)c96Pq2+lhXiFvV|L51fCb+xaBM4+<}fLdfC^K0a?M3HYmRwg1U-bu zGHH&6opfE>L^f1pOSO3202Yr`1@lnUA&(p^shTJQ=;+P)8G>fw;>PpqeQpy(Ic}?3 zs^$QsiaeGLhj(lx#Tz;nd0nz)LvvE9DyvPl#{-uxHCS578oRP7qoDx{Dk+Cobj{&) zQ89QZVU1UiuF44LhNFscL*G_zvJBDqLR!nPv0(PXLSs~Ncdu<4r)0^n0N@QI+PtGE zkhfB*!i&15TTlf`$`S{Jc&$(hwmz!U3hV3FI@la_V?T2Z7yI$EEkA6nX-$aY#hB($ z+=bZY8n4|ost#-f0 zYWbh;8_7XM=oK*C-vus?r&is1X@q}Qt@drjuGxgstvDXG&H(z*Iz_NYsRMdO_~8RP z==pMGEHji#eSvN*FAugoc;uy1iTsq1=sP^~TYLWcwQKT%&b&Q$V47L{_=ih=j`^SSBq_@zux!qroSKh_E185eL-W6J10JR jGkN~5A78}G2MlxI%9-zTH$Ll+&(5)t@yw~cho1Wfu?Ti< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/thalassium_sword.png b/src/main/resources/assets/betterend/textures/item/thalassium_sword.png new file mode 100644 index 0000000000000000000000000000000000000000..642e5123d88e43e3fe570557e2e1dd488dc055d7 GIT binary patch literal 2024 zcmbVNTWB0r7@k}jYnx!D6q;1YFnMV(vvcOMml?86(`;&j*)&boCZdI$Idf)r%O-Lq5(SG=@B${r2gPVTv%A?QlE&b| z?3|hT&i8%)<(zY}r~BEOZFSoyimK`Ci1m{D4*%L(MgHrT9zb$?-0pb6rKs&Y{i}>R z^X_hns zb{kF^9b*pe8|zM>u^}XDOv^sHIj0bU4E7+M%cMFA@Upx(zD~G3+A8usy>vX`d0Q*02|4 zh|@v{8M{Ply2Uh+gmF1&b9?~!A?1M@D&g#5C!H795Qoz^gH6vRSiXd{Q$Q)NFp3FT7wslSZOrvz*BW*ZZXY2w8~kW&rOm<6vz&xw zrB@2ovtpTUYx4^eq4)M1re;`(4|Z&ZC2WHh%j*{=3T_& zN~h_1&_uX17G+4-0mIM~Nfv;lVTqN6aFEr=n1uoctPa(n%*!GOV|itM%tFI{asBy) zKG!TnI3B9vu&N_9B(o@@BNhTlW+O5Vu~3(x3T0L1QOV6A#~@1$rdPB2t~A2P2T@pv zK%P~31XxX#bT*>OI;-oVBmjs|ID-6!eyF^{(n{iUNiE&tf;j+_#ZlVW_XyJwQIJ&t zSQ+set4k7O)ksic`EV$#!XS_$D&NfcYlTqIg;9Z)+gLx}!AghW`xz~|=)=cKe&~GD zDiHaLG0Gsn3$ex&UmNRGYg2hC&d;VWA>E)g3+k?=ds*n<)+DLyX1bqylz$hFZ0vq> zy;iWb*8MuG<$t;_CI_XUnZ#s&=NLbpe02+@;r?B<{I^xR<_er_#s08#29Sr+DS}Nx z?T|B~vE|YUiYlw`jI|~rx6$&02Q3vBX0MI$FYRo&P&F>~@5)VlwdL5|^R?8S=1akG zIQMpcwR7&N>Z4oYH}{Ok#aoZXYR8`w5ANPy@%mzFsOj*T!_`z{*QBcs%%tkO$_C2c zyFWjlJXiPa_r~0e^(TL|>{V&{Iu-ltbZ;Ndjr*dLQ@kqt*H|J`*PEFMw z`Dlcniobu{II(B^a_x)sr$^78ZQ2&9JpIK$%|iIz-&dOEZp{3V-Fp0uB&c|zrT(+m zb}ij|d9jYV^Rvm^0>*c4)i-ZVpW6TC;K|7!g(-V>VdD9_%*=tM+gqyVyI&c+y12|u zUrZ_=ZlC>ic44rxcH%D8^V^N(?R}I`dB1$e_{Zg!%C3C*^o<`5z0-QN{7LHC(C35m S?B$$)7I(IH$38ePIPnj$@|@ZL literal 0 HcmV?d00001 From 04e3372e2b387d7833def8d4cbbee1acca14e4b9 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 20 Jan 2021 22:27:29 +0300 Subject: [PATCH 194/463] Thalassium Block & recipes --- .../java/ru/betterend/recipe/AlloyingRecipes.java | 13 +++++++++++++ .../java/ru/betterend/recipe/CraftingRecipes.java | 8 ++++++++ .../java/ru/betterend/recipe/FurnaceRecipes.java | 1 + .../java/ru/betterend/registry/EndBlocks.java | 1 + src/main/java/ru/betterend/registry/EndTags.java | 2 ++ .../resources/assets/betterend/lang/en_us.json | 3 ++- .../resources/assets/betterend/lang/ru_ru.json | 3 ++- .../betterend/textures/block/thalassium_block.png | Bin 0 -> 421 bytes 8 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/assets/betterend/textures/block/thalassium_block.png diff --git a/src/main/java/ru/betterend/recipe/AlloyingRecipes.java b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java index b3927ce4..2dc62043 100644 --- a/src/main/java/ru/betterend/recipe/AlloyingRecipes.java +++ b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java @@ -3,6 +3,7 @@ package ru.betterend.recipe; import net.minecraft.block.Blocks; import net.minecraft.item.Items; import ru.betterend.recipe.builders.AlloyingRecipe; +import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; public class AlloyingRecipes { @@ -35,5 +36,17 @@ public class AlloyingRecipes { .setExpiriense(4.5F) .setSmeltTime(600) .build(); + AlloyingRecipe.Builder.create("terminite_ingot_thalassium") + .setInput(EndItems.THALASSIUM_INGOT, EndItems.ENDER_DUST) + .setOutput(EndItems.TERMINITE_INGOT, 1) + .setExpiriense(2.5F) + .setSmeltTime(450) + .build(); + AlloyingRecipe.Builder.create("thalassium_ingot") + .setInput(EndBlocks.THALASSIUM_ORE, EndBlocks.THALASSIUM_ORE) + .setOutput(EndItems.THALASSIUM_INGOT, 3) + .setExpiriense(2.1F) + .setSmeltTime(600) + .build(); } } diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index d4c236fb..66f11907 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -189,6 +189,14 @@ public class CraftingRecipes { .build(); GridRecipe.make("fiber_string", Items.STRING).setOutputCount(6).setShape("#", "#", "#").addMaterial('#', EndItems.SILK_FIBER).build(); + + GridRecipe.make("thalassium_block", EndBlocks.THALASSIUM_BLOCK).setShape("###", "###", "###").addMaterial('#', EndItems.THALASSIUM_INGOT).build(); + GridRecipe.make("thalassium_ingot_from_block", EndItems.THALASSIUM_INGOT).setOutputCount(9).setList("#").addMaterial('#', EndBlocks.THALASSIUM_BLOCK).build(); + + GridRecipe.make("thalassium_axe", EndItems.THALASSIUM_AXE).setShape("##", "#I", " I").addMaterial('#', EndItems.THALASSIUM_INGOT).addMaterial('I', Items.STICK).build(); + GridRecipe.make("thalassium_axe", EndItems.THALASSIUM_HOE).setShape("##", " I", " I").addMaterial('#', EndItems.THALASSIUM_INGOT).addMaterial('I', Items.STICK).build(); + GridRecipe.make("thalassium_axe", EndItems.THALASSIUM_PICKAXE).setShape("###", " I ", " I ").addMaterial('#', EndItems.THALASSIUM_INGOT).addMaterial('I', Items.STICK).build(); + GridRecipe.make("thalassium_axe", EndItems.THALASSIUM_SWORD).setShape("#", "#", "I").addMaterial('#', EndItems.THALASSIUM_INGOT).addMaterial('I', Items.STICK).build(); } private static void registerLantern(String name, Block lantern, Block slab) { diff --git a/src/main/java/ru/betterend/recipe/FurnaceRecipes.java b/src/main/java/ru/betterend/recipe/FurnaceRecipes.java index 3c664ec5..11dfc6b0 100644 --- a/src/main/java/ru/betterend/recipe/FurnaceRecipes.java +++ b/src/main/java/ru/betterend/recipe/FurnaceRecipes.java @@ -13,5 +13,6 @@ public class FurnaceRecipes { FurnaceRecipe.make("end_berry", EndItems.SHADOW_BERRY_RAW, EndItems.SHADOW_BERRY_COOKED).build(); FurnaceRecipe.make("end_fish", EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED).build(); FurnaceRecipe.make("slime_ball", EndBlocks.JELLYSHROOM_CAP_PURPLE, Items.SLIME_BALL).build(); + FurnaceRecipe.make("thalassium_ingot_furnace", EndBlocks.THALASSIUM_ORE, EndItems.THALASSIUM_INGOT).build(); } } diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 0ec3c22c..5a939e4e 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -287,6 +287,7 @@ public class EndBlocks { // Materials // public static final Block TERMINITE_BLOCK = registerBlock("terminite_block", new TerminiteBlock()); public static final Block AETERNIUM_BLOCK = registerBlock("aeternium_block", new AeterniumBlock()); + public static final Block THALASSIUM_BLOCK = registerBlock("thalassium_block", new BaseBlock(FabricBlockSettings.copyOf(Blocks.IRON_BLOCK))); public static final Block ENDER_BLOCK = registerBlock("ender_block", new EnderBlock()); public static final Block AURORA_CRYSTAL = registerBlock("aurora_crystal", new AuroraCrystalBlock()); public static final Block AMBER_BLOCK = registerBlock("amber_block", new AmberBlock()); diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index 30b0650e..d32226c9 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -68,7 +68,9 @@ public class EndTags { public static void register() { addSurfaceBlock(Blocks.END_STONE); + addSurfaceBlock(EndBlocks.THALASSIUM_ORE); addSurfaceBlock(EndBlocks.ENDSTONE_DUST); + addSurfaceBlock(EndBlocks.AMBER_ORE); EndItems.getModBlocks().forEach((item) -> { Block block = ((BlockItem) item).getBlock(); diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 07b2716f..6985862f 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -582,5 +582,6 @@ "item.betterend.thalassium_ingot": "Thalassium Ingot", "item.betterend.thalassium_pickaxe": "Thalassium Pickaxe", "item.betterend.thalassium_shovel": "Thalassium Shovel", - "item.betterend.thalassium_sword": "Thalassium Sword" + "item.betterend.thalassium_sword": "Thalassium Sword", + "block.betterend.thalassium_block": "Thalassium Block" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 454135a5..51e0286d 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -584,5 +584,6 @@ "item.betterend.thalassium_ingot": "Талласиевый слиток", "item.betterend.thalassium_pickaxe": "Талласиевая кирка", "item.betterend.thalassium_shovel": "Талласиевая лопата", - "item.betterend.thalassium_sword": "Талласиевый меч" + "item.betterend.thalassium_sword": "Талласиевый меч", + "block.betterend.thalassium_block": "Талласиевый блок" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/thalassium_block.png b/src/main/resources/assets/betterend/textures/block/thalassium_block.png new file mode 100644 index 0000000000000000000000000000000000000000..e76081e3f419dc21e645c1b8074d74833142d024 GIT binary patch literal 421 zcmV;W0b2fvP)!T$v>gLO&382|ARUS9TcSqF2NEDh4xBITZ#_p zN%K)XQ*v{j_rB*NI~TXTA5x+93;?C3l^PX#jjz;aCO$)A=e9P8Gl1K#dw6NlufHvD%f@` z1K(8u1vovGOb^mEi%rKe3Xak}+0}Z+aI*Xp&etrk?<&gmCcEU~KUhkVNdU2cEQlm` zJ5>VDF5C=ocC-&b7-<&cQ7jNfIs=Pn80n<$Fw)7ltz+B1B|NCJ(1U*~q}N<3)PDy8&P^9#O70lV^$iS^oVOt4QziR{<4f P00000NkvXXu0mjf02;T; literal 0 HcmV?d00001 From 2934ac16b085cd5ebd36a95cf4434bf7edc03cd1 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 20 Jan 2021 22:27:56 +0300 Subject: [PATCH 195/463] Name fix --- src/main/java/ru/betterend/recipe/CraftingRecipes.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index 66f11907..9e7c6ab9 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -194,9 +194,9 @@ public class CraftingRecipes { GridRecipe.make("thalassium_ingot_from_block", EndItems.THALASSIUM_INGOT).setOutputCount(9).setList("#").addMaterial('#', EndBlocks.THALASSIUM_BLOCK).build(); GridRecipe.make("thalassium_axe", EndItems.THALASSIUM_AXE).setShape("##", "#I", " I").addMaterial('#', EndItems.THALASSIUM_INGOT).addMaterial('I', Items.STICK).build(); - GridRecipe.make("thalassium_axe", EndItems.THALASSIUM_HOE).setShape("##", " I", " I").addMaterial('#', EndItems.THALASSIUM_INGOT).addMaterial('I', Items.STICK).build(); - GridRecipe.make("thalassium_axe", EndItems.THALASSIUM_PICKAXE).setShape("###", " I ", " I ").addMaterial('#', EndItems.THALASSIUM_INGOT).addMaterial('I', Items.STICK).build(); - GridRecipe.make("thalassium_axe", EndItems.THALASSIUM_SWORD).setShape("#", "#", "I").addMaterial('#', EndItems.THALASSIUM_INGOT).addMaterial('I', Items.STICK).build(); + GridRecipe.make("thalassium_hoe", EndItems.THALASSIUM_HOE).setShape("##", " I", " I").addMaterial('#', EndItems.THALASSIUM_INGOT).addMaterial('I', Items.STICK).build(); + GridRecipe.make("thalassium_pickaxe", EndItems.THALASSIUM_PICKAXE).setShape("###", " I ", " I ").addMaterial('#', EndItems.THALASSIUM_INGOT).addMaterial('I', Items.STICK).build(); + GridRecipe.make("thalassium_sword", EndItems.THALASSIUM_SWORD).setShape("#", "#", "I").addMaterial('#', EndItems.THALASSIUM_INGOT).addMaterial('I', Items.STICK).build(); } private static void registerLantern(String name, Block lantern, Block slab) { From dce84e13a567debf128eead32ead6e9a6279e7ce Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 21 Jan 2021 03:35:27 +0300 Subject: [PATCH 196/463] Thallasium name fix --- .../item/material/EndToolMaterial.java | 2 +- .../ru/betterend/recipe/AlloyingRecipes.java | 10 +++++----- .../ru/betterend/recipe/CraftingRecipes.java | 12 ++++++------ .../ru/betterend/recipe/FurnaceRecipes.java | 2 +- .../java/ru/betterend/registry/EndBlocks.java | 4 ++-- .../java/ru/betterend/registry/EndFeatures.java | 4 ++-- .../java/ru/betterend/registry/EndItems.java | 12 ++++++------ .../java/ru/betterend/registry/EndTags.java | 2 +- .../resources/assets/betterend/lang/en_us.json | 16 ++++++++-------- .../resources/assets/betterend/lang/ru_ru.json | 16 ++++++++-------- .../betterend/textures/block/lumecorn_0.png | Bin 0 -> 254 bytes .../betterend/textures/block/lumecorn_1.png | Bin 0 -> 266 bytes .../betterend/textures/block/lumecorn_2.png | Bin 0 -> 335 bytes .../betterend/textures/block/lumecorn_3.png | Bin 0 -> 352 bytes .../textures/block/thalassium_block.png | Bin 421 -> 0 bytes .../textures/block/thallasium_block.png | Bin 0 -> 430 bytes .../{thalassium_ore.png => thallasium_ore.png} | Bin .../assets/betterend/textures/item/lumicorn.png | Bin 0 -> 378 bytes .../{thalassium_axe.png => thallasium_axe.png} | Bin .../{thalassium_hoe.png => thallasium_hoe.png} | Bin ...halassium_ingot.png => thallasium_ingot.png} | Bin ...ssium_pickaxe.png => thallasium_pickaxe.png} | Bin ...lassium_shovel.png => thallasium_shovel.png} | Bin ...halassium_sword.png => thallasium_sword.png} | Bin 24 files changed, 40 insertions(+), 40 deletions(-) create mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_0.png create mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_1.png create mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_2.png create mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_3.png delete mode 100644 src/main/resources/assets/betterend/textures/block/thalassium_block.png create mode 100644 src/main/resources/assets/betterend/textures/block/thallasium_block.png rename src/main/resources/assets/betterend/textures/block/{thalassium_ore.png => thallasium_ore.png} (100%) create mode 100644 src/main/resources/assets/betterend/textures/item/lumicorn.png rename src/main/resources/assets/betterend/textures/item/{thalassium_axe.png => thallasium_axe.png} (100%) rename src/main/resources/assets/betterend/textures/item/{thalassium_hoe.png => thallasium_hoe.png} (100%) rename src/main/resources/assets/betterend/textures/item/{thalassium_ingot.png => thallasium_ingot.png} (100%) rename src/main/resources/assets/betterend/textures/item/{thalassium_pickaxe.png => thallasium_pickaxe.png} (100%) rename src/main/resources/assets/betterend/textures/item/{thalassium_shovel.png => thallasium_shovel.png} (100%) rename src/main/resources/assets/betterend/textures/item/{thalassium_sword.png => thallasium_sword.png} (100%) diff --git a/src/main/java/ru/betterend/item/material/EndToolMaterial.java b/src/main/java/ru/betterend/item/material/EndToolMaterial.java index 5060662f..4302dfaa 100644 --- a/src/main/java/ru/betterend/item/material/EndToolMaterial.java +++ b/src/main/java/ru/betterend/item/material/EndToolMaterial.java @@ -8,7 +8,7 @@ import net.minecraft.util.Lazy; import ru.betterend.registry.EndItems; public enum EndToolMaterial implements ToolMaterial { - THALASSIUM(2, 320, 6.5F, 4.5F, 13, () -> { + THALLASIUM(2, 320, 6.5F, 4.5F, 13, () -> { return Ingredient.ofItems(EndItems.AETERNIUM_INGOT); }), TERMINITE(3, 1230, 8.5F, 3.0F, 14, () -> { diff --git a/src/main/java/ru/betterend/recipe/AlloyingRecipes.java b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java index 2dc62043..d8bacb80 100644 --- a/src/main/java/ru/betterend/recipe/AlloyingRecipes.java +++ b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java @@ -36,15 +36,15 @@ public class AlloyingRecipes { .setExpiriense(4.5F) .setSmeltTime(600) .build(); - AlloyingRecipe.Builder.create("terminite_ingot_thalassium") - .setInput(EndItems.THALASSIUM_INGOT, EndItems.ENDER_DUST) + AlloyingRecipe.Builder.create("terminite_ingot_thallasium") + .setInput(EndItems.THALLASIUM_INGOT, EndItems.ENDER_DUST) .setOutput(EndItems.TERMINITE_INGOT, 1) .setExpiriense(2.5F) .setSmeltTime(450) .build(); - AlloyingRecipe.Builder.create("thalassium_ingot") - .setInput(EndBlocks.THALASSIUM_ORE, EndBlocks.THALASSIUM_ORE) - .setOutput(EndItems.THALASSIUM_INGOT, 3) + AlloyingRecipe.Builder.create("thallasium_ingot") + .setInput(EndBlocks.THALLASIUM_ORE, EndBlocks.THALLASIUM_ORE) + .setOutput(EndItems.THALLASIUM_INGOT, 3) .setExpiriense(2.1F) .setSmeltTime(600) .build(); diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index 9e7c6ab9..9a73f132 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -190,13 +190,13 @@ public class CraftingRecipes { GridRecipe.make("fiber_string", Items.STRING).setOutputCount(6).setShape("#", "#", "#").addMaterial('#', EndItems.SILK_FIBER).build(); - GridRecipe.make("thalassium_block", EndBlocks.THALASSIUM_BLOCK).setShape("###", "###", "###").addMaterial('#', EndItems.THALASSIUM_INGOT).build(); - GridRecipe.make("thalassium_ingot_from_block", EndItems.THALASSIUM_INGOT).setOutputCount(9).setList("#").addMaterial('#', EndBlocks.THALASSIUM_BLOCK).build(); + GridRecipe.make("thallasium_block", EndBlocks.THALLASIUM_BLOCK).setShape("###", "###", "###").addMaterial('#', EndItems.THALLASIUM_INGOT).build(); + GridRecipe.make("thallasium_ingot_from_block", EndItems.THALLASIUM_INGOT).setOutputCount(9).setList("#").addMaterial('#', EndBlocks.THALLASIUM_BLOCK).build(); - GridRecipe.make("thalassium_axe", EndItems.THALASSIUM_AXE).setShape("##", "#I", " I").addMaterial('#', EndItems.THALASSIUM_INGOT).addMaterial('I', Items.STICK).build(); - GridRecipe.make("thalassium_hoe", EndItems.THALASSIUM_HOE).setShape("##", " I", " I").addMaterial('#', EndItems.THALASSIUM_INGOT).addMaterial('I', Items.STICK).build(); - GridRecipe.make("thalassium_pickaxe", EndItems.THALASSIUM_PICKAXE).setShape("###", " I ", " I ").addMaterial('#', EndItems.THALASSIUM_INGOT).addMaterial('I', Items.STICK).build(); - GridRecipe.make("thalassium_sword", EndItems.THALASSIUM_SWORD).setShape("#", "#", "I").addMaterial('#', EndItems.THALASSIUM_INGOT).addMaterial('I', Items.STICK).build(); + GridRecipe.make("thallasium_axe", EndItems.THALLASIUM_AXE).setShape("##", "#I", " I").addMaterial('#', EndItems.THALLASIUM_INGOT).addMaterial('I', Items.STICK).build(); + GridRecipe.make("thallasium_hoe", EndItems.THALLASIUM_HOE).setShape("##", " I", " I").addMaterial('#', EndItems.THALLASIUM_INGOT).addMaterial('I', Items.STICK).build(); + GridRecipe.make("thallasium_pickaxe", EndItems.THALLASIUM_PICKAXE).setShape("###", " I ", " I ").addMaterial('#', EndItems.THALLASIUM_INGOT).addMaterial('I', Items.STICK).build(); + GridRecipe.make("thallasium_sword", EndItems.THALLASIUM_SWORD).setShape("#", "#", "I").addMaterial('#', EndItems.THALLASIUM_INGOT).addMaterial('I', Items.STICK).build(); } private static void registerLantern(String name, Block lantern, Block slab) { diff --git a/src/main/java/ru/betterend/recipe/FurnaceRecipes.java b/src/main/java/ru/betterend/recipe/FurnaceRecipes.java index 11dfc6b0..febed809 100644 --- a/src/main/java/ru/betterend/recipe/FurnaceRecipes.java +++ b/src/main/java/ru/betterend/recipe/FurnaceRecipes.java @@ -13,6 +13,6 @@ public class FurnaceRecipes { FurnaceRecipe.make("end_berry", EndItems.SHADOW_BERRY_RAW, EndItems.SHADOW_BERRY_COOKED).build(); FurnaceRecipe.make("end_fish", EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED).build(); FurnaceRecipe.make("slime_ball", EndBlocks.JELLYSHROOM_CAP_PURPLE, Items.SLIME_BALL).build(); - FurnaceRecipe.make("thalassium_ingot_furnace", EndBlocks.THALASSIUM_ORE, EndItems.THALASSIUM_INGOT).build(); + FurnaceRecipe.make("thallasium_ingot_furnace", EndBlocks.THALLASIUM_ORE, EndItems.THALLASIUM_INGOT).build(); } } diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 5a939e4e..dfc04652 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -280,14 +280,14 @@ public class EndBlocks { public static final Block SILK_MOTH_NEST = registerBlock("silk_moth_nest", new SilkMothNestBlock()); // Ores // - public static final Block THALASSIUM_ORE = registerBlock("thalassium_ore", new BaseBlock(FabricBlockSettings.copyOf(Blocks.END_STONE))); + public static final Block THALLASIUM_ORE = registerBlock("thallasium_ore", new BaseBlock(FabricBlockSettings.copyOf(Blocks.END_STONE))); public static final Block ENDER_ORE = registerBlock("ender_ore", new EndOreBlock(EndItems.ENDER_SHARD, 1, 3, 5)); public static final Block AMBER_ORE = registerBlock("amber_ore", new EndOreBlock(EndItems.RAW_AMBER, 1, 2, 4)); // Materials // public static final Block TERMINITE_BLOCK = registerBlock("terminite_block", new TerminiteBlock()); public static final Block AETERNIUM_BLOCK = registerBlock("aeternium_block", new AeterniumBlock()); - public static final Block THALASSIUM_BLOCK = registerBlock("thalassium_block", new BaseBlock(FabricBlockSettings.copyOf(Blocks.IRON_BLOCK))); + public static final Block THALLASIUM_BLOCK = registerBlock("thallasium_block", new BaseBlock(FabricBlockSettings.copyOf(Blocks.IRON_BLOCK))); public static final Block ENDER_BLOCK = registerBlock("ender_block", new EnderBlock()); public static final Block AURORA_CRYSTAL = registerBlock("aurora_crystal", new AuroraCrystalBlock()); public static final Block AMBER_BLOCK = registerBlock("amber_block", new AmberBlock()); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index f04d3eb8..d4a74f9e 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -157,7 +157,7 @@ public class EndFeatures { public static final EndFeature SULPHUR_HILL = EndFeature.makeChansedFeature("sulphur_hill", new SulphurHillFeature(), 8); // Ores // - public static final EndFeature THALASSIUM_ORE = EndFeature.makeOreFeature("thalassium_ore", EndBlocks.THALASSIUM_ORE, 12, 6, 0, 16, 128); + public static final EndFeature THALLASIUM_ORE = EndFeature.makeOreFeature("thallasium_ore", EndBlocks.THALLASIUM_ORE, 12, 6, 0, 16, 128); public static final EndFeature ENDER_ORE = EndFeature.makeOreFeature("ender_ore", EndBlocks.ENDER_ORE, 8, 3, 0, 16, 128); public static final EndFeature AMBER_ORE = EndFeature.makeOreFeature("amber_ore", EndBlocks.AMBER_ORE, 12, 6, 0, 16, 128); public static final EndFeature VIOLECITE_LAYER = EndFeature.makeLayerFeature("violecite_layer", EndBlocks.VIOLECITE, 15, 16, 128, 8); @@ -187,7 +187,7 @@ public class EndFeatures { } addFeature(FLAVOLITE_LAYER, features); - addFeature(THALASSIUM_ORE, features); + addFeature(THALLASIUM_ORE, features); addFeature(ENDER_ORE, features); addFeature(CRASHED_SHIP, features); diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index 30011e19..3e1922e0 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -57,7 +57,7 @@ public class EndItems { // Materials // public final static Item ENDER_DUST = registerItem("ender_dust"); public final static Item ENDER_SHARD = registerItem("ender_shard"); - public final static Item THALASSIUM_INGOT = registerItem("thalassium_ingot"); + public final static Item THALLASIUM_INGOT = registerItem("thallasium_ingot"); public final static Item TERMINITE_INGOT = registerItem("terminite_ingot"); public final static Item AETERNIUM_INGOT = registerItem("aeternium_ingot"); public final static Item END_LILY_LEAF = registerItem("end_lily_leaf"); @@ -90,11 +90,11 @@ public class EndItems { public static final Item CRYSTALITE_BOOTS = registerItem("crystalite_boots", new ArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.FEET, makeItemSettings().rarity(Rarity.UNCOMMON))); // Tools // - public static final ToolItem THALASSIUM_SHOVEL = registerTool("thalassium_shovel", new EndShovelItem(EndToolMaterial.THALASSIUM, 1.0F, -3.0F, makeItemSettings())); - public static final ToolItem THALASSIUM_SWORD = registerTool("thalassium_sword", new EndSwordItem(EndToolMaterial.THALASSIUM, 2, -2.4F, makeItemSettings())); - public static final ToolItem THALASSIUM_PICKAXE = registerTool("thalassium_pickaxe", new EndPickaxeItem(EndToolMaterial.THALASSIUM, 1, -2.8F, makeItemSettings())); - public static final ToolItem THALASSIUM_AXE = registerTool("thalassium_axe", new EndAxeItem(EndToolMaterial.THALASSIUM, 5.0F, -3.0F, makeItemSettings())); - public static final ToolItem THALASSIUM_HOE = registerTool("thalassium_hoe", new EndHoeItem(EndToolMaterial.THALASSIUM, -3, 0.0F, makeItemSettings())); + public static final ToolItem THALLASIUM_SHOVEL = registerTool("thallasium_shovel", new EndShovelItem(EndToolMaterial.THALLASIUM, 1.0F, -3.0F, makeItemSettings())); + public static final ToolItem THALLASIUM_SWORD = registerTool("thallasium_sword", new EndSwordItem(EndToolMaterial.THALLASIUM, 2, -2.4F, makeItemSettings())); + public static final ToolItem THALLASIUM_PICKAXE = registerTool("thallasium_pickaxe", new EndPickaxeItem(EndToolMaterial.THALLASIUM, 1, -2.8F, makeItemSettings())); + public static final ToolItem THALLASIUM_AXE = registerTool("thallasium_axe", new EndAxeItem(EndToolMaterial.THALLASIUM, 5.0F, -3.0F, makeItemSettings())); + public static final ToolItem THALLASIUM_HOE = registerTool("thallasium_hoe", new EndHoeItem(EndToolMaterial.THALLASIUM, -3, 0.0F, makeItemSettings())); public static final ToolItem TERMINITE_SHOVEL = registerTool("terminite_shovel", new EndShovelItem(EndToolMaterial.TERMINITE, 1.5F, -3.0F, makeItemSettings())); public static final ToolItem TERMINITE_SWORD = registerTool("terminite_sword", new EndSwordItem(EndToolMaterial.TERMINITE, 3, -2.4F, makeItemSettings())); diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index d32226c9..f89ba480 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -68,7 +68,7 @@ public class EndTags { public static void register() { addSurfaceBlock(Blocks.END_STONE); - addSurfaceBlock(EndBlocks.THALASSIUM_ORE); + addSurfaceBlock(EndBlocks.THALLASIUM_ORE); addSurfaceBlock(EndBlocks.ENDSTONE_DUST); addSurfaceBlock(EndBlocks.AMBER_ORE); diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 6985862f..3b448522 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -576,12 +576,12 @@ "item.betterend.silk_fiber": "Silk Fiber", "item.betterend.spawn_egg_silk_moth": "Silk Moth Spawn Egg", - "block.betterend.thalassium_ore": "Thalassium Ore", - "item.betterend.thalassium_axe": "Thalassium Axe", - "item.betterend.thalassium_hoe": "Thalassium Hoe", - "item.betterend.thalassium_ingot": "Thalassium Ingot", - "item.betterend.thalassium_pickaxe": "Thalassium Pickaxe", - "item.betterend.thalassium_shovel": "Thalassium Shovel", - "item.betterend.thalassium_sword": "Thalassium Sword", - "block.betterend.thalassium_block": "Thalassium Block" + "block.betterend.thallasium_ore": "Thallasium Ore", + "item.betterend.thallasium_axe": "Thallasium Axe", + "item.betterend.thallasium_hoe": "Thallasium Hoe", + "item.betterend.thallasium_ingot": "Thallasium Ingot", + "item.betterend.thallasium_pickaxe": "Thallasium Pickaxe", + "item.betterend.thallasium_shovel": "Thallasium Shovel", + "item.betterend.thallasium_sword": "Thallasium Sword", + "block.betterend.thallasium_block": "Thallasium Block" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 51e0286d..c9f090b5 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -578,12 +578,12 @@ "item.betterend.silk_fiber": "Шёлковое волокно", "item.betterend.spawn_egg_silk_moth": "Яйцо призыва шелковичной моли", - "block.betterend.thalassium_ore": "Талласиевая руда", - "item.betterend.thalassium_axe": "Талласиевый топор", - "item.betterend.thalassium_hoe": "Талласиевая мотыга", - "item.betterend.thalassium_ingot": "Талласиевый слиток", - "item.betterend.thalassium_pickaxe": "Талласиевая кирка", - "item.betterend.thalassium_shovel": "Талласиевая лопата", - "item.betterend.thalassium_sword": "Талласиевый меч", - "block.betterend.thalassium_block": "Талласиевый блок" + "block.betterend.thallasium_ore": "Талласиевая руда", + "item.betterend.thallasium_axe": "Талласиевый топор", + "item.betterend.thallasium_hoe": "Талласиевая мотыга", + "item.betterend.thallasium_ingot": "Талласиевый слиток", + "item.betterend.thallasium_pickaxe": "Талласиевая кирка", + "item.betterend.thallasium_shovel": "Талласиевая лопата", + "item.betterend.thallasium_sword": "Талласиевый меч", + "block.betterend.thallasium_block": "Талласиевый блок" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_0.png b/src/main/resources/assets/betterend/textures/block/lumecorn_0.png new file mode 100644 index 0000000000000000000000000000000000000000..9322a74ab2af82502086d1d77c962563f1135d37 GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1enaI&Y1V~B-+@}K|z?U_{@IK3wGy75X}VOvvK z{^x*agg1Uto{7m;^s!wjv z^_werij{edUcszVv7A@ur|&;lBhauhvB`p4jf=$xH!d3cf!WHsX(VPc)I$z JtaD0e0su!NVfX+5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_2.png b/src/main/resources/assets/betterend/textures/block/lumecorn_2.png new file mode 100644 index 0000000000000000000000000000000000000000..04a3c654a9eea2eab1ca94b399a60deb2a7c2dea GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1en@QJ63V~B-+@}K|z?U_{@IK3wGW@H~|UH|?6 z`~Nkf>*YCjIdpo<%@9S&QD*nHhZdP7zrX0b<`=I3D-hBOovsf)F zKJH>#&Zr>mXg2>}MZ4p?NS4)a6&kK`$93oZ6Tj%R_3PQK(|K+`x?;$4sG#xkn#~Eq z_51$tK5J&^;hpTvs388}keTGh|6iS%8hze;Qs^<4s;~cj{DAhM!wCXXEw-x~7}hhY zi|H}`p4r^ZedajZ2Pp@h1KAC(H9R+7+V87n{=AWK17lCmjm0ykc6UDfJX@bfJZ$~p diF^_g43ci;iGI2LOhErKc)I$ztaD0e0s#GYftCOO literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_3.png b/src/main/resources/assets/betterend/textures/block/lumecorn_3.png new file mode 100644 index 0000000000000000000000000000000000000000..3ec3dbe2fee86ae87673d11b0c97f3050f8658c4 GIT binary patch literal 352 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1en@T;ebV~B-+@}K|z?V0ro9=`tj|NZ~kH^i3rJ>=>!D410$mhvr4hDL4uY00vK2KbLh*2~7Z{7LIQK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/thalassium_block.png b/src/main/resources/assets/betterend/textures/block/thalassium_block.png deleted file mode 100644 index e76081e3f419dc21e645c1b8074d74833142d024..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 421 zcmV;W0b2fvP)!T$v>gLO&382|ARUS9TcSqF2NEDh4xBITZ#_p zN%K)XQ*v{j_rB*NI~TXTA5x+93;?C3l^PX#jjz;aCO$)A=e9P8Gl1K#dw6NlufHvD%f@` z1K(8u1vovGOb^mEi%rKe3Xak}+0}Z+aI*Xp&etrk?<&gmCcEU~KUhkVNdU2cEQlm` zJ5>VDF5C=ocC-&b7-<&cQ7jNfIs=Pn80n<$Fw)7ltz+B1B|NCJ(1U*~q}N<3)PDy8&P^9#O70lV^$iS^oVOt4QziR{<4f P00000NkvXXu0mjf02;T; diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_block.png b/src/main/resources/assets/betterend/textures/block/thallasium_block.png new file mode 100644 index 0000000000000000000000000000000000000000..a50b3a8be06476496258dfdf636885401044bc36 GIT binary patch literal 430 zcmV;f0a5;mP)Px$Xh}ptR5*>Dlf6sBKp4hEhsEO2U!Yq`fwA&>=MS10v>@<9P1JJ@5NIH*<``SOBo31-C{rHW}H1I6Xl9sYAS7uIw=yC(yM@*K*e zD8lLa7>gF$$EUflU8~Y=9U%91kp2*W67Z+(3H(({;uukHrX>`ClX09n7)4PbSTl5# z=cFYRfi+!E9ZaTB1QzvX>Yxa0*Q(PoP7?MX*tW#9gr5n^gHH}u=srFn12xUT&xGZ@ zoZa(>hV~BH3^5CP z#B0;>eZwb-Ci4wjuHL$IOp7H@hp8(;L96MadCIid&ighTvm>9?mQC_)P4w`b(06VB z$Ka-iWs7EAx9(?K8~188ivriq=+_^VE3_4klec>sKf;IZ7&g<7J#s z7Y&|SOvPu#X z` Date: Thu, 21 Jan 2021 06:15:35 +0300 Subject: [PATCH 197/463] Thallasium additional blocks, metal material class prototype, lang text --- .../blocks/basis/EndMetalPaneBlock.java | 70 ++++++++++++++++ .../blocks/basis/EndMetalPlateBlock.java | 52 ++++++++++++ ...ateBlock.java => EndWoodenPlateBlock.java} | 6 +- .../blocks/complex/MetalMaterial.java | 77 ++++++++++++++++++ .../blocks/complex/WoodenMaterial.java | 4 +- .../java/ru/betterend/patterns/Patterns.java | 3 + .../ru/betterend/recipe/AlloyingRecipes.java | 8 +- .../ru/betterend/recipe/CraftingRecipes.java | 8 -- .../ru/betterend/recipe/FurnaceRecipes.java | 1 - .../java/ru/betterend/registry/EndBlocks.java | 7 +- .../ru/betterend/registry/EndFeatures.java | 2 +- .../java/ru/betterend/registry/EndItems.java | 11 +-- .../java/ru/betterend/registry/EndTags.java | 2 +- .../assets/betterend/lang/en_us.json | 8 +- .../assets/betterend/lang/ru_ru.json | 8 +- .../betterend/patterns/block/bars_post.json | 22 +++++ .../betterend/patterns/block/bars_side.json | 23 ++++++ .../betterend/patterns/blockstate/bars.json | 53 ++++++++++++ .../textures/block/thallasium_bars.png | Bin 0 -> 437 bytes .../textures/block/thallasium_bars_top.png | Bin 0 -> 272 bytes .../textures/block/thallasium_door_bottom.png | Bin 0 -> 527 bytes .../textures/block/thallasium_door_side.png | Bin 0 -> 237 bytes .../textures/block/thallasium_door_top.png | Bin 0 -> 556 bytes .../textures/block/thallasium_tile.png | Bin 0 -> 475 bytes .../textures/block/thallasium_trapdoor.png | Bin 0 -> 558 bytes .../textures/item/thallasium_door.png | Bin 0 -> 450 bytes 26 files changed, 327 insertions(+), 38 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/basis/EndMetalPaneBlock.java create mode 100644 src/main/java/ru/betterend/blocks/basis/EndMetalPlateBlock.java rename src/main/java/ru/betterend/blocks/basis/{EndPlateBlock.java => EndWoodenPlateBlock.java} (87%) create mode 100644 src/main/java/ru/betterend/blocks/complex/MetalMaterial.java create mode 100644 src/main/resources/assets/betterend/patterns/block/bars_post.json create mode 100644 src/main/resources/assets/betterend/patterns/block/bars_side.json create mode 100644 src/main/resources/assets/betterend/patterns/blockstate/bars.json create mode 100644 src/main/resources/assets/betterend/textures/block/thallasium_bars.png create mode 100644 src/main/resources/assets/betterend/textures/block/thallasium_bars_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/thallasium_door_bottom.png create mode 100644 src/main/resources/assets/betterend/textures/block/thallasium_door_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/thallasium_door_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/thallasium_tile.png create mode 100644 src/main/resources/assets/betterend/textures/block/thallasium_trapdoor.png create mode 100644 src/main/resources/assets/betterend/textures/item/thallasium_door.png diff --git a/src/main/java/ru/betterend/blocks/basis/EndMetalPaneBlock.java b/src/main/java/ru/betterend/blocks/basis/EndMetalPaneBlock.java new file mode 100644 index 00000000..6ec846cd --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndMetalPaneBlock.java @@ -0,0 +1,70 @@ +package ru.betterend.blocks.basis; + +import java.io.Reader; +import java.util.Collections; +import java.util.List; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.PaneBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.context.LootContext; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.Direction; +import net.minecraft.util.registry.Registry; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; + +public class EndMetalPaneBlock extends PaneBlock implements BlockPatterned, IRenderTypeable { + public EndMetalPaneBlock(Block source) { + super(FabricBlockSettings.copyOf(source).strength(5.0F, 6.0F).nonOpaque()); + } + + @Override + public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + return Collections.singletonList(new ItemStack(this)); + } + + @Override + public String getStatesPattern(Reader data) { + Identifier blockId = Registry.BLOCK.getId(this); + return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); + } + + @Override + public String getModelPattern(String block) { + Identifier blockId = Registry.BLOCK.getId(this); + if (block.contains("item")) { + return Patterns.createJson(Patterns.ITEM_BLOCK, blockId.getPath()); + } + if (block.contains("post")) { + return Patterns.createJson(Patterns.BLOCK_BARS_POST, blockId.getPath(), blockId.getPath()); + } + else { + return Patterns.createJson(Patterns.BLOCK_BARS_SIDE, blockId.getPath(), blockId.getPath()); + } + } + + @Environment(EnvType.CLIENT) + public boolean isSideInvisible(BlockState state, BlockState stateFrom, Direction direction) { + if (direction.getAxis().isVertical() && stateFrom.getBlock().is(this) && !stateFrom.equals(state)) { + return false; + } + return super.isSideInvisible(state, stateFrom, direction); + } + + @Override + public Identifier statePatternId() { + return Patterns.STATE_BARS; + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/EndMetalPlateBlock.java b/src/main/java/ru/betterend/blocks/basis/EndMetalPlateBlock.java new file mode 100644 index 00000000..8b6808f2 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndMetalPlateBlock.java @@ -0,0 +1,52 @@ +package ru.betterend.blocks.basis; + +import java.io.Reader; +import java.util.Collections; +import java.util.List; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.WeightedPressurePlateBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.context.LootContext; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; + +public class EndMetalPlateBlock extends WeightedPressurePlateBlock implements BlockPatterned { + private final Block parent; + + public EndMetalPlateBlock(Block source) { + super(15, FabricBlockSettings.copyOf(source).noCollision().nonOpaque().requiresTool().strength(0.5F)); + this.parent = source; + } + + @Override + public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + return Collections.singletonList(new ItemStack(this)); + } + + @Override + public String getStatesPattern(Reader data) { + Identifier blockId = Registry.BLOCK.getId(this); + Identifier parentId = Registry.BLOCK.getId(parent); + return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); + } + + @Override + public String getModelPattern(String block) { + Identifier blockId = Registry.BLOCK.getId(this); + Identifier parentId = Registry.BLOCK.getId(parent); + if (block.contains("down")) { + return Patterns.createJson(Patterns.BLOCK_PLATE_DOWN, parentId.getPath(), blockId.getPath()); + } + return Patterns.createJson(Patterns.BLOCK_PLATE_UP, parentId.getPath(), blockId.getPath()); + } + + @Override + public Identifier statePatternId() { + return Patterns.STATE_PLATE; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/EndPlateBlock.java b/src/main/java/ru/betterend/blocks/basis/EndWoodenPlateBlock.java similarity index 87% rename from src/main/java/ru/betterend/blocks/basis/EndPlateBlock.java rename to src/main/java/ru/betterend/blocks/basis/EndWoodenPlateBlock.java index 955024b5..a865159e 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndPlateBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndWoodenPlateBlock.java @@ -15,11 +15,11 @@ import net.minecraft.util.registry.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class EndPlateBlock extends PressurePlateBlock implements BlockPatterned { +public class EndWoodenPlateBlock extends PressurePlateBlock implements BlockPatterned { private final Block parent; - public EndPlateBlock(Block source) { - super(ActivationRule.EVERYTHING, FabricBlockSettings.copyOf(source).nonOpaque()); + public EndWoodenPlateBlock(Block source) { + super(ActivationRule.EVERYTHING, FabricBlockSettings.copyOf(source).noCollision().nonOpaque().strength(0.5F)); this.parent = source; } diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java new file mode 100644 index 00000000..f9224a50 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -0,0 +1,77 @@ +package ru.betterend.blocks.complex; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.Block; +import net.minecraft.block.Blocks; +import net.minecraft.block.MaterialColor; +import net.minecraft.item.Item; +import net.minecraft.item.Items; +import net.minecraft.item.ToolMaterial; +import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.EndDoorBlock; +import ru.betterend.blocks.basis.EndMetalPaneBlock; +import ru.betterend.blocks.basis.EndTrapdoorBlock; +import ru.betterend.blocks.basis.EndWoodenPlateBlock; +import ru.betterend.item.EndAxeItem; +import ru.betterend.item.EndHoeItem; +import ru.betterend.item.EndPickaxeItem; +import ru.betterend.item.EndShovelItem; +import ru.betterend.item.EndSwordItem; +import ru.betterend.recipe.builders.AlloyingRecipe; +import ru.betterend.recipe.builders.FurnaceRecipe; +import ru.betterend.recipe.builders.GridRecipe; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndItems; + +public class MetalMaterial { + public final Block ore; + public final Block block; + public final Block tile; + public final Block bars; + public final Block plate; + public final Block door; + public final Block trapdoor; + + public final Item ingot; + public final Item shovel; + public final Item sword; + public final Item pickaxe; + public final Item axe; + public final Item hoe; + + public MetalMaterial(String name, MaterialColor color, ToolMaterial material) { + FabricBlockSettings materialBlock = FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color); + + ore = EndBlocks.registerBlock(name + "_ore", new BaseBlock(FabricBlockSettings.copyOf(Blocks.END_STONE))); + block = EndBlocks.registerBlock(name + "_block", new BaseBlock(materialBlock)); + tile = EndBlocks.registerBlock(name + "_tile", new BaseBlock(materialBlock)); + bars = EndBlocks.registerBlock(name + "_bars", new EndMetalPaneBlock(block)); + plate = EndBlocks.registerBlock(name + "_plate", new EndWoodenPlateBlock(block)); + door = EndBlocks.registerBlock(name + "_door", new EndDoorBlock(block)); + trapdoor = EndBlocks.registerBlock(name + "_trapdoor", new EndTrapdoorBlock(block)); + + ingot = EndItems.registerItem(name + "_ingot"); + shovel = EndItems.registerTool(name + "_shovel", new EndShovelItem(material, 1.0F, -3.0F, EndItems.makeItemSettings())); + sword = EndItems.registerTool(name + "_sword", new EndSwordItem(material, 2, -2.4F, EndItems.makeItemSettings())); + pickaxe = EndItems.registerTool(name + "_pickaxe", new EndPickaxeItem(material, 1, -2.8F, EndItems.makeItemSettings())); + axe = EndItems.registerTool(name + "_axe", new EndAxeItem(material, 5.0F, -3.0F, EndItems.makeItemSettings())); + hoe = EndItems.registerTool(name + "_hoe", new EndHoeItem(material, -3, 0.0F, EndItems.makeItemSettings())); + + FurnaceRecipe.make("thallasium_ingot_furnace", ore, ingot).build(); + AlloyingRecipe.Builder.create("thallasium_ingot").setInput(ore, ore).setOutput(ingot, 3).setExpiriense(2.1F).build(); + + GridRecipe.make(name + "_block", block).setShape("###", "###", "###").addMaterial('#', ingot).build(); + GridRecipe.make(name + "_ingot_from_block", ingot).setOutputCount(9).setList("#").addMaterial('#', block).build(); + + GridRecipe.make(name + "_tile", tile).setOutputCount(4).setShape("##", "##").addMaterial('#', block).build(); + GridRecipe.make(name + "_bars", bars).setOutputCount(16).setShape("###", "###").addMaterial('#', ingot).build(); + GridRecipe.make(name + "_plate", plate).setShape("##").addMaterial('#', ingot).build(); + GridRecipe.make(name + "_door", door).setOutputCount(3).setOutputCount(16).setShape("##", "##", "##").addMaterial('#', ingot).build(); + GridRecipe.make(name + "_trapdoor", trapdoor).setShape("##", "##").addMaterial('#', ingot).build(); + + GridRecipe.make(name + "_axe", axe).setShape("##", "#I", " I").addMaterial('#', ingot).addMaterial('I', Items.STICK).build(); + GridRecipe.make(name + "_hoe", hoe).setShape("##", " I", " I").addMaterial('#', ingot).addMaterial('I', Items.STICK).build(); + GridRecipe.make(name + "_pickaxe", pickaxe).setShape("###", " I ", " I ").addMaterial('#', ingot).addMaterial('I', Items.STICK).build(); + GridRecipe.make(name + "_sword", sword).setShape("#", "#", "I").addMaterial('#', ingot).addMaterial('I', Items.STICK).build(); + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java index 31fe3b18..a7533747 100644 --- a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java @@ -23,7 +23,7 @@ import ru.betterend.blocks.basis.EndFenceBlock; import ru.betterend.blocks.basis.EndGateBlock; import ru.betterend.blocks.basis.EndLadderBlock; import ru.betterend.blocks.basis.EndPillarBlock; -import ru.betterend.blocks.basis.EndPlateBlock; +import ru.betterend.blocks.basis.EndWoodenPlateBlock; import ru.betterend.blocks.basis.EndSignBlock; import ru.betterend.blocks.basis.EndSlabBlock; import ru.betterend.blocks.basis.EndStairsBlock; @@ -80,7 +80,7 @@ public class WoodenMaterial { fence = EndBlocks.registerBlock(name + "_fence", new EndFenceBlock(planks)); gate = EndBlocks.registerBlock(name + "_gate", new EndGateBlock(planks)); button = EndBlocks.registerBlock(name + "_button", new EndWoodenButtonBlock(planks)); - pressurePlate = EndBlocks.registerBlock(name + "_plate", new EndPlateBlock(planks)); + pressurePlate = EndBlocks.registerBlock(name + "_plate", new EndWoodenPlateBlock(planks)); trapdoor = EndBlocks.registerBlock(name + "_trapdoor", new EndTrapdoorBlock(planks)); door = EndBlocks.registerBlock(name + "_door", new EndDoorBlock(planks)); diff --git a/src/main/java/ru/betterend/patterns/Patterns.java b/src/main/java/ru/betterend/patterns/Patterns.java index 4ac4ede2..8650353c 100644 --- a/src/main/java/ru/betterend/patterns/Patterns.java +++ b/src/main/java/ru/betterend/patterns/Patterns.java @@ -38,6 +38,7 @@ public class Patterns { public final static Identifier STATE_DIRECT = BetterEnd.makeID("patterns/blockstate/direct.json"); public final static Identifier STATE_BULB_LANTERN = BetterEnd.makeID("patterns/blockstate/bulb_lantern.json"); public final static Identifier STATE_COMPOSTER = BetterEnd.makeID("patterns/blockstate/composter.json"); + public final static Identifier STATE_BARS = BetterEnd.makeID("patterns/blockstate/bars.json"); //Models Block public final static Identifier BLOCK_EMPTY = BetterEnd.makeID("patterns/block/empty.json"); @@ -84,6 +85,8 @@ public class Patterns { public final static Identifier BLOCK_PETAL_COLORED = BetterEnd.makeID("models/block/block_petal_colored.json"); public final static Identifier BLOCK_COMPOSTER = BetterEnd.makeID("patterns/block/composter.json"); public final static Identifier BLOCK_COLORED = BetterEnd.makeID("patterns/block/block_colored.json"); + public final static Identifier BLOCK_BARS_POST = BetterEnd.makeID("patterns/block/bars_post.json"); + public final static Identifier BLOCK_BARS_SIDE = BetterEnd.makeID("patterns/block/bars_side.json"); //Models Item public final static Identifier ITEM_WALL = BetterEnd.makeID("patterns/item/pattern_wall.json"); diff --git a/src/main/java/ru/betterend/recipe/AlloyingRecipes.java b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java index d8bacb80..61795576 100644 --- a/src/main/java/ru/betterend/recipe/AlloyingRecipes.java +++ b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java @@ -37,16 +37,10 @@ public class AlloyingRecipes { .setSmeltTime(600) .build(); AlloyingRecipe.Builder.create("terminite_ingot_thallasium") - .setInput(EndItems.THALLASIUM_INGOT, EndItems.ENDER_DUST) + .setInput(EndBlocks.THALLASIUM.ingot, EndItems.ENDER_DUST) .setOutput(EndItems.TERMINITE_INGOT, 1) .setExpiriense(2.5F) .setSmeltTime(450) .build(); - AlloyingRecipe.Builder.create("thallasium_ingot") - .setInput(EndBlocks.THALLASIUM_ORE, EndBlocks.THALLASIUM_ORE) - .setOutput(EndItems.THALLASIUM_INGOT, 3) - .setExpiriense(2.1F) - .setSmeltTime(600) - .build(); } } diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index 9a73f132..d4c236fb 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -189,14 +189,6 @@ public class CraftingRecipes { .build(); GridRecipe.make("fiber_string", Items.STRING).setOutputCount(6).setShape("#", "#", "#").addMaterial('#', EndItems.SILK_FIBER).build(); - - GridRecipe.make("thallasium_block", EndBlocks.THALLASIUM_BLOCK).setShape("###", "###", "###").addMaterial('#', EndItems.THALLASIUM_INGOT).build(); - GridRecipe.make("thallasium_ingot_from_block", EndItems.THALLASIUM_INGOT).setOutputCount(9).setList("#").addMaterial('#', EndBlocks.THALLASIUM_BLOCK).build(); - - GridRecipe.make("thallasium_axe", EndItems.THALLASIUM_AXE).setShape("##", "#I", " I").addMaterial('#', EndItems.THALLASIUM_INGOT).addMaterial('I', Items.STICK).build(); - GridRecipe.make("thallasium_hoe", EndItems.THALLASIUM_HOE).setShape("##", " I", " I").addMaterial('#', EndItems.THALLASIUM_INGOT).addMaterial('I', Items.STICK).build(); - GridRecipe.make("thallasium_pickaxe", EndItems.THALLASIUM_PICKAXE).setShape("###", " I ", " I ").addMaterial('#', EndItems.THALLASIUM_INGOT).addMaterial('I', Items.STICK).build(); - GridRecipe.make("thallasium_sword", EndItems.THALLASIUM_SWORD).setShape("#", "#", "I").addMaterial('#', EndItems.THALLASIUM_INGOT).addMaterial('I', Items.STICK).build(); } private static void registerLantern(String name, Block lantern, Block slab) { diff --git a/src/main/java/ru/betterend/recipe/FurnaceRecipes.java b/src/main/java/ru/betterend/recipe/FurnaceRecipes.java index febed809..3c664ec5 100644 --- a/src/main/java/ru/betterend/recipe/FurnaceRecipes.java +++ b/src/main/java/ru/betterend/recipe/FurnaceRecipes.java @@ -13,6 +13,5 @@ public class FurnaceRecipes { FurnaceRecipe.make("end_berry", EndItems.SHADOW_BERRY_RAW, EndItems.SHADOW_BERRY_COOKED).build(); FurnaceRecipe.make("end_fish", EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED).build(); FurnaceRecipe.make("slime_ball", EndBlocks.JELLYSHROOM_CAP_PURPLE, Items.SLIME_BALL).build(); - FurnaceRecipe.make("thallasium_ingot_furnace", EndBlocks.THALLASIUM_ORE, EndItems.THALLASIUM_INGOT).build(); } } diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index dfc04652..0560bb93 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -1,6 +1,5 @@ package ru.betterend.registry; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.Block; import net.minecraft.block.Blocks; import net.minecraft.block.MaterialColor; @@ -87,7 +86,6 @@ import ru.betterend.blocks.UmbrellaTreeClusterEmptyBlock; import ru.betterend.blocks.UmbrellaTreeMembraneBlock; import ru.betterend.blocks.UmbrellaTreeSaplingBlock; import ru.betterend.blocks.VentBubbleColumnBlock; -import ru.betterend.blocks.basis.BaseBlock; import ru.betterend.blocks.basis.EndCropBlock; import ru.betterend.blocks.basis.EndLeavesBlock; import ru.betterend.blocks.basis.EndOreBlock; @@ -99,9 +97,11 @@ import ru.betterend.blocks.basis.StoneLanternBlock; import ru.betterend.blocks.basis.VineBlock; import ru.betterend.blocks.basis.WallMushroomBlock; import ru.betterend.blocks.complex.ColoredMaterial; +import ru.betterend.blocks.complex.MetalMaterial; import ru.betterend.blocks.complex.StoneMaterial; import ru.betterend.blocks.complex.WoodenMaterial; import ru.betterend.config.Configs; +import ru.betterend.item.material.EndToolMaterial; public class EndBlocks { // Terrain // @@ -280,14 +280,13 @@ public class EndBlocks { public static final Block SILK_MOTH_NEST = registerBlock("silk_moth_nest", new SilkMothNestBlock()); // Ores // - public static final Block THALLASIUM_ORE = registerBlock("thallasium_ore", new BaseBlock(FabricBlockSettings.copyOf(Blocks.END_STONE))); public static final Block ENDER_ORE = registerBlock("ender_ore", new EndOreBlock(EndItems.ENDER_SHARD, 1, 3, 5)); public static final Block AMBER_ORE = registerBlock("amber_ore", new EndOreBlock(EndItems.RAW_AMBER, 1, 2, 4)); // Materials // public static final Block TERMINITE_BLOCK = registerBlock("terminite_block", new TerminiteBlock()); public static final Block AETERNIUM_BLOCK = registerBlock("aeternium_block", new AeterniumBlock()); - public static final Block THALLASIUM_BLOCK = registerBlock("thallasium_block", new BaseBlock(FabricBlockSettings.copyOf(Blocks.IRON_BLOCK))); + public static final MetalMaterial THALLASIUM = new MetalMaterial("thallasium", MaterialColor.BLUE, EndToolMaterial.THALLASIUM); public static final Block ENDER_BLOCK = registerBlock("ender_block", new EnderBlock()); public static final Block AURORA_CRYSTAL = registerBlock("aurora_crystal", new AuroraCrystalBlock()); public static final Block AMBER_BLOCK = registerBlock("amber_block", new AmberBlock()); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index d4a74f9e..c2386cde 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -157,7 +157,7 @@ public class EndFeatures { public static final EndFeature SULPHUR_HILL = EndFeature.makeChansedFeature("sulphur_hill", new SulphurHillFeature(), 8); // Ores // - public static final EndFeature THALLASIUM_ORE = EndFeature.makeOreFeature("thallasium_ore", EndBlocks.THALLASIUM_ORE, 12, 6, 0, 16, 128); + public static final EndFeature THALLASIUM_ORE = EndFeature.makeOreFeature("thallasium_ore", EndBlocks.THALLASIUM.ore, 12, 6, 0, 16, 128); public static final EndFeature ENDER_ORE = EndFeature.makeOreFeature("ender_ore", EndBlocks.ENDER_ORE, 8, 3, 0, 16, 128); public static final EndFeature AMBER_ORE = EndFeature.makeOreFeature("amber_ore", EndBlocks.AMBER_ORE, 12, 6, 0, 16, 128); public static final EndFeature VIOLECITE_LAYER = EndFeature.makeLayerFeature("violecite_layer", EndBlocks.VIOLECITE, 15, 16, 128, 8); diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index 3e1922e0..71c4230c 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -57,7 +57,6 @@ public class EndItems { // Materials // public final static Item ENDER_DUST = registerItem("ender_dust"); public final static Item ENDER_SHARD = registerItem("ender_shard"); - public final static Item THALLASIUM_INGOT = registerItem("thallasium_ingot"); public final static Item TERMINITE_INGOT = registerItem("terminite_ingot"); public final static Item AETERNIUM_INGOT = registerItem("aeternium_ingot"); public final static Item END_LILY_LEAF = registerItem("end_lily_leaf"); @@ -90,12 +89,6 @@ public class EndItems { public static final Item CRYSTALITE_BOOTS = registerItem("crystalite_boots", new ArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.FEET, makeItemSettings().rarity(Rarity.UNCOMMON))); // Tools // - public static final ToolItem THALLASIUM_SHOVEL = registerTool("thallasium_shovel", new EndShovelItem(EndToolMaterial.THALLASIUM, 1.0F, -3.0F, makeItemSettings())); - public static final ToolItem THALLASIUM_SWORD = registerTool("thallasium_sword", new EndSwordItem(EndToolMaterial.THALLASIUM, 2, -2.4F, makeItemSettings())); - public static final ToolItem THALLASIUM_PICKAXE = registerTool("thallasium_pickaxe", new EndPickaxeItem(EndToolMaterial.THALLASIUM, 1, -2.8F, makeItemSettings())); - public static final ToolItem THALLASIUM_AXE = registerTool("thallasium_axe", new EndAxeItem(EndToolMaterial.THALLASIUM, 5.0F, -3.0F, makeItemSettings())); - public static final ToolItem THALLASIUM_HOE = registerTool("thallasium_hoe", new EndHoeItem(EndToolMaterial.THALLASIUM, -3, 0.0F, makeItemSettings())); - public static final ToolItem TERMINITE_SHOVEL = registerTool("terminite_shovel", new EndShovelItem(EndToolMaterial.TERMINITE, 1.5F, -3.0F, makeItemSettings())); public static final ToolItem TERMINITE_SWORD = registerTool("terminite_sword", new EndSwordItem(EndToolMaterial.TERMINITE, 3, -2.4F, makeItemSettings())); public static final ToolItem TERMINITE_PICKAXE = registerTool("terminite_pickaxe", new EndPickaxeItem(EndToolMaterial.TERMINITE, 1, -2.8F, makeItemSettings())); @@ -137,7 +130,7 @@ public class EndItems { public final static Item AETERNIUM_SWORD_BLADE = registerItem("aeternium_sword_blade"); public final static Item AETERNIUM_SWORD_HANDLE = registerItem("aeternium_sword_handle"); - protected static Item registerItem(String name) { + public static Item registerItem(String name) { return registerItem(BetterEnd.makeID(name), new PatternedItem(makeItemSettings())); } @@ -176,7 +169,7 @@ public class EndItems { return item; } - private static ToolItem registerTool(String name, ToolItem item) { + public static ToolItem registerTool(String name, ToolItem item) { Identifier id = BetterEnd.makeID(name); if (!Configs.ITEM_CONFIG.getBoolean("tools", id.getPath(), true)) { return item; diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index f89ba480..bb324daa 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -68,7 +68,7 @@ public class EndTags { public static void register() { addSurfaceBlock(Blocks.END_STONE); - addSurfaceBlock(EndBlocks.THALLASIUM_ORE); + addSurfaceBlock(EndBlocks.THALLASIUM.ore); addSurfaceBlock(EndBlocks.ENDSTONE_DUST); addSurfaceBlock(EndBlocks.AMBER_ORE); diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 3b448522..d44bc57d 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -583,5 +583,11 @@ "item.betterend.thallasium_pickaxe": "Thallasium Pickaxe", "item.betterend.thallasium_shovel": "Thallasium Shovel", "item.betterend.thallasium_sword": "Thallasium Sword", - "block.betterend.thallasium_block": "Thallasium Block" + "block.betterend.thallasium_block": "Thallasium Block", + + "block.betterend.thallasium_bars": "Thallasium Bars", + "block.betterend.thallasium_door": "Thallasium Door", + "block.betterend.thallasium_plate": "Thallasium Pressure Plate", + "block.betterend.thallasium_tile": "Thallasium Tile", + "block.betterend.thallasium_trapdoor": "Thallasium Trapdoor" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index c9f090b5..ed391bab 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -585,5 +585,11 @@ "item.betterend.thallasium_pickaxe": "Талласиевая кирка", "item.betterend.thallasium_shovel": "Талласиевая лопата", "item.betterend.thallasium_sword": "Талласиевый меч", - "block.betterend.thallasium_block": "Талласиевый блок" + "block.betterend.thallasium_block": "Талласиевый блок", + + "block.betterend.thallasium_bars": "Талласиевые прутья", + "block.betterend.thallasium_door": "Талласиевая дверь", + "block.betterend.thallasium_plate": "Талласиевая нажимная плита", + "block.betterend.thallasium_tile": "Талласиевая плитка", + "block.betterend.thallasium_trapdoor": "Талласиевый люк" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/bars_post.json b/src/main/resources/assets/betterend/patterns/block/bars_post.json new file mode 100644 index 00000000..eb195425 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/bars_post.json @@ -0,0 +1,22 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "top": "betterend:block/%block%_top", + "particle": "#top" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 7, 0, 7 ], + "to": [ 9, 16, 9 ], + "faces": { + "down": { "uv": [ 7, 7, 9, 9 ], "texture": "#top", "cullface": "down" }, + "up": { "uv": [ 7, 7, 9, 9 ], "texture": "#top", "cullface": "up" }, + "north": { "uv": [ 7, 0, 9, 16 ], "texture": "#top" }, + "south": { "uv": [ 7, 0, 9, 16 ], "texture": "#top" }, + "west": { "uv": [ 7, 0, 9, 16 ], "texture": "#top" }, + "east": { "uv": [ 7, 0, 9, 16 ], "texture": "#top" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/bars_side.json b/src/main/resources/assets/betterend/patterns/block/bars_side.json new file mode 100644 index 00000000..5d1f5198 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/bars_side.json @@ -0,0 +1,23 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "side": "betterend:block/%block%", + "top": "betterend:block/%block%_top", + "particle": "#side" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 7, 0, 0 ], + "to": [ 9, 16, 9 ], + "faces": { + "down": { "uv": [ 7, 7, 9, 16 ], "texture": "#top", "cullface": "down" }, + "up": { "uv": [ 7, 0, 9, 9 ], "texture": "#top", "cullface": "up" }, + "north": { "uv": [ 7, 0, 9, 16 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 7, 0, 9, 16 ], "texture": "#side" }, + "west": { "uv": [ 0, 0, 9, 16 ], "texture": "#side" }, + "east": { "uv": [ 7, 0, 16, 16 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/blockstate/bars.json b/src/main/resources/assets/betterend/patterns/blockstate/bars.json new file mode 100644 index 00000000..592671d3 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/blockstate/bars.json @@ -0,0 +1,53 @@ +{ + "multipart": [ + { + "when": { + "west": "false", + "east": "false", + "south": "false", + "north": "false" + }, + "apply": { + "model": "betterend:pattern/%block%/%block%_post" + } + }, + { + "when": { + "north": "true" + }, + "apply": { + "model": "betterend:pattern/%block%/%block%_side" + } + }, + { + "when": { + "east": "true" + }, + "apply": { + "model": "betterend:pattern/%block%/%block%_side", + "uvlock": true, + "y": 90 + } + }, + { + "when": { + "south": "true" + }, + "apply": { + "model": "betterend:pattern/%block%/%block%_side", + "uvlock": true, + "y": 180 + } + }, + { + "when": { + "west": "true" + }, + "apply": { + "model": "betterend:pattern/%block%/%block%_side", + "uvlock": true, + "y": 270 + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_bars.png b/src/main/resources/assets/betterend/textures/block/thallasium_bars.png new file mode 100644 index 0000000000000000000000000000000000000000..dc41f1232e398eea88c12f85e9e2c2f612790897 GIT binary patch literal 437 zcmV;m0ZRUfP)Px$Z%IT!R5*>LQZY}$Kp1`3+A0kvWh2Zmm_WLikT5aw2b@S8IuHkA!r+2oqb?36 z#(^+6u*whM7nqp1IJvMf5eG{fD&D0z2fd~R!Juz>ukXJ0`|f=uweC=`AOQ1RsG1Hn zWgvVH03gz8$^d}K4>?0Rmj??1pxPdY!_ymqZ%F-{C*M<;=i=%1jK~8X_z7O;JzO4> z`E-IEecwbJ%y&_!H-+S7FAklWAeB~6gq(o~KA7)<`!kG3ePY>;c)q(J03dat-V_?m zK&K`&gJSXa`gIriMcGku96y~|wj)TjJrK-uqX~3sLUvw;WjjLFY@A>d;x(m4M<{Z) ze}THYw;JL$SKxvFzYt4}&T5F;u8~w)J@I&b5{-OtbS}6*gGMvp{tN&jtdV4jOleliiQjFVo300000NkvXXu0mjf3b(oe literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_bars_top.png b/src/main/resources/assets/betterend/textures/block/thallasium_bars_top.png new file mode 100644 index 0000000000000000000000000000000000000000..ec2fdad4bc8b87c00d4c8042562004420797421e GIT binary patch literal 272 zcmV+r0q_2aP)Px#%1J~)R5*>LQ@aj=FcdvnEVMz=k?<3aCQf{df8gqj|KRM*Ul|9S2!x^~O&t`C zOH0Zf@8jg$d(H(ckr$=e9WTb#v$PeJlu%7=YjFTHHM;6*1qf_Kng|TC^=F`a3H^Nd z0}#eR!pI*0fRn)@FG@3Bo2)1Z4u==<%r zLKyuq7}rs44Vnn2#MmCrX0t!}8;LMJPlYMr^ua6{^`M|y`=P8>j?)Y@5&jIOeB%oe WPhL22^`w6Q0000G~? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_door_bottom.png b/src/main/resources/assets/betterend/textures/block/thallasium_door_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..d6f436242221237ef94891333cc17c1b1f8e32bc GIT binary patch literal 527 zcmV+q0`UEbP)ljQ6otQ9j$iU@2NI%2@zf}7m#7P3C?k)tZG;rEoNxV@d~02wF`W0AryPsn(=R4NwYO zRRK_F73pBsT$gmIv8sZ4yN&uW!vExRkwlo%0bsrH{ov(`;^BDWV=k1!ZZ?X^d)?!$ zlXKgf8i4t??eE_%`SLkop%gXO1z)wF(x*dWrF50k!;Go|t zCZC_4acBRKbg8j-y)4As+A8_KZ8i3b%;Jfk)tLWKk+Kv{wPu|}g>E@@jGF7-2&D|p ztG0w7)tZWQt`8}i%?t5guvHb9(jnCvuhYy{SSVH4UL{E>Yze_SiSRm2S`B&KLN0p! z9_OcLsIgxh5P&J2;+P(voX~1W2E$)iPCdJWP1{G0j<-(EZRc<_n`ar^e|SVN8kO4K z2H(5e!)|-*JbCrzDjW_l3 zpC;En?TM|leRn0L+(PNtiN`j}v|`fagwwhNua|2@NL{Y-mtyKIy~^q}+4@3Hz^tdT z3_JF%-q+yLGczf~@kg(MAwwp|nz`?Ul6+pmdKI;Vst0FF>zc>n+a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_door_top.png b/src/main/resources/assets/betterend/textures/block/thallasium_door_top.png new file mode 100644 index 0000000000000000000000000000000000000000..1259c13b28f9e72a1585a2b1b4c0c6b95fbe3d96 GIT binary patch literal 556 zcmV+{0@MA8P)mMW~P^ z3y6p*jEv6*@!r?2k&fcn#TNn+Tdij2&6_uGR(p8#u{=IJf#3p;=RuyFF#z}@=6D`* z#;~=08^?zy&^8`FFXPib+IKdv)Cv&ADU$Ok+=V8>fFkq>qHmdso3;hhvJedhh)?@y z2rm8`90nA3w{F66o6sH4yA<5(zJ=}(*pwoP#_*Rr3M>l)fSxmUDYNbnym@qA1Ay(P zugi*O8o0k&cEn z>;86MTv#GkRpne;s@pirGS#*O%Yn%p uHX5qUon;9c^ET#;{Sz$PmLJO?E`9=33_zx@tUApA0000Px$l}SWFR5*=&l0A-_Kp2J}qg`VLV+#wRg<_Q`N*yT|NRcb-1#*`hB-%b*E|4Nh zl_rv#EmvAB5W-=AF+WP20x^o6@zM;^%cJ=|-e-3A>HD!RB{EHMJdZ9g5A^7`F- z>QXW&b&@f(Ghl;m#_Et zSTaosd~pIV*DHdJ%TSM#Px$=t)FDR5*=|lD}&cVHn3hZ+>5rGieftDTt{?sf(#1uCCXqgAT4{$l%sFb3t$r zmku4GW5Ge(>R*thgMok$I}`&A2WOkh<$Ae#jt-@IDgc1z41o7vPSkxDLK04Qhww-Tu&iDVLg zWGyAgRY?i|8k7r@zg50x|P&1m>ej<&Pt1T5W_#+Du7UkppT~TlBsZGc}j1|WF zuR(RAqI~Fl{(?Ikga)a${hU=cHa1O_Z5hw4m#@^Sq+tMO{U6uZ$ZC{R#d7FysgNNo w_TtIwcfs77T#2W27{DJ{>RUvjNLI%FHxBG;L9n(^b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_door.png b/src/main/resources/assets/betterend/textures/item/thallasium_door.png new file mode 100644 index 0000000000000000000000000000000000000000..f9b342c19ffb2dbe2ca82dd5631ba9b72f79151f GIT binary patch literal 450 zcmV;z0X_bSP)DHUxd+yB~86%%lNyZg2*)o=Cq7{o= z9c=!Z>1qb}di$K=a6}?~pTROsWJx4CGv-p@0(g4_@;R0IYk}vd7cO>JJ$mVthr2Wd zwb~v4kc=w;obRl705118JOI{**&ZMa43Wu}o!Yi-Cl5y?7r@)xFy2a7!^4cH5-cB{ z+5in*CzeXI65HB>EQvfmWC@7Hvl?&qw!WE8CS^XR03i@vkQ~Rqa$1& z9pUr)+XDdSjj|+?$(E_TYj}lTf?}Y(g|CKzWtxN|5;w;ud>J(W7Pq&ZWBv)SY8qOx sh%AYO=a=yL{RG7Tm1>=+GUx()1KX*SD&K@yi2wiq07*qoM6N<$f Date: Thu, 21 Jan 2021 07:06:34 +0300 Subject: [PATCH 198/463] Lumecorn seed & rod --- .../betterend/blocks/BlueVineSeedBlock.java | 6 ++ .../blocks/GlowingPillarSeedBlock.java | 6 ++ .../betterend/blocks/LanceleafSeedBlock.java | 6 ++ .../ru/betterend/blocks/LumecornBlock.java | 53 +++++++++++++----- .../betterend/blocks/LumecornSeedBlock.java | 28 +++++++++ .../java/ru/betterend/registry/EndBlocks.java | 4 +- .../java/ru/betterend/registry/EndItems.java | 1 + .../betterend/blockstates/lumecorn_seed.json | 8 +++ .../assets/betterend/lang/en_us.json | 5 +- .../assets/betterend/lang/ru_ru.json | 5 +- .../lights/item/blue_vine_lantern.json | 7 +++ .../item/glowing_pillar_luminophor.json | 7 +++ .../betterend/lights/item/lumecorn_rod.json | 7 +++ .../materialmaps/block/lumecorn_seed.json | 3 + .../materialmaps/item/lumecorn_rod.json | 3 + .../materialmaps/item/lumecorn_seed.json | 1 + .../models/block/lumecorn_seed_0.json | 6 ++ .../models/block/lumecorn_seed_1.json | 6 ++ .../models/block/lumecorn_seed_2.json | 6 ++ .../models/block/lumecorn_seed_3.json | 6 ++ .../betterend/models/item/lumecorn_seed.json | 6 ++ .../item/{lumicorn.png => lumecorn_rod.png} | Bin .../betterend/textures/item/lumecorn_seed.png | Bin 0 -> 1591 bytes 23 files changed, 162 insertions(+), 18 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/LumecornSeedBlock.java create mode 100644 src/main/resources/assets/betterend/blockstates/lumecorn_seed.json create mode 100644 src/main/resources/assets/betterend/lights/item/blue_vine_lantern.json create mode 100644 src/main/resources/assets/betterend/lights/item/glowing_pillar_luminophor.json create mode 100644 src/main/resources/assets/betterend/lights/item/lumecorn_rod.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/lumecorn_seed.json create mode 100644 src/main/resources/assets/betterend/materialmaps/item/lumecorn_rod.json create mode 100644 src/main/resources/assets/betterend/materialmaps/item/lumecorn_seed.json create mode 100644 src/main/resources/assets/betterend/models/block/lumecorn_seed_0.json create mode 100644 src/main/resources/assets/betterend/models/block/lumecorn_seed_1.json create mode 100644 src/main/resources/assets/betterend/models/block/lumecorn_seed_2.json create mode 100644 src/main/resources/assets/betterend/models/block/lumecorn_seed_3.json create mode 100644 src/main/resources/assets/betterend/models/item/lumecorn_seed.json rename src/main/resources/assets/betterend/textures/item/{lumicorn.png => lumecorn_rod.png} (100%) create mode 100644 src/main/resources/assets/betterend/textures/item/lumecorn_seed.png diff --git a/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java b/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java index 38812d8c..a4710621 100644 --- a/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java @@ -2,6 +2,7 @@ package ru.betterend.blocks; import java.util.Random; +import net.minecraft.block.AbstractBlock; import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; @@ -46,4 +47,9 @@ public class BlueVineSeedBlock extends EndPlantWithAgeBlock { protected boolean isTerrain(BlockState state) { return state.isOf(EndBlocks.END_MOSS) || state.isOf(EndBlocks.END_MYCELIUM); } + + @Override + public AbstractBlock.OffsetType getOffsetType() { + return AbstractBlock.OffsetType.NONE; + } } diff --git a/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java b/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java index 4109481b..3c29919f 100644 --- a/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java @@ -4,6 +4,7 @@ import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.block.AbstractBlock; import net.minecraft.block.BlockState; import net.minecraft.block.Material; import net.minecraft.sound.BlockSoundGroup; @@ -66,4 +67,9 @@ public class GlowingPillarSeedBlock extends EndPlantWithAgeBlock { protected boolean isTerrain(BlockState state) { return state.isOf(EndBlocks.AMBER_MOSS); } + + @Override + public AbstractBlock.OffsetType getOffsetType() { + return AbstractBlock.OffsetType.NONE; + } } diff --git a/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java b/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java index f4ddf4a6..182519aa 100644 --- a/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java @@ -2,6 +2,7 @@ package ru.betterend.blocks; import java.util.Random; +import net.minecraft.block.AbstractBlock; import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos.Mutable; @@ -37,4 +38,9 @@ public class LanceleafSeedBlock extends EndPlantWithAgeBlock { protected boolean isTerrain(BlockState state) { return state.isOf(EndBlocks.AMBER_MOSS); } + + @Override + public AbstractBlock.OffsetType getOffsetType() { + return AbstractBlock.OffsetType.NONE; + } } diff --git a/src/main/java/ru/betterend/blocks/LumecornBlock.java b/src/main/java/ru/betterend/blocks/LumecornBlock.java index a201101c..309fb3bf 100644 --- a/src/main/java/ru/betterend/blocks/LumecornBlock.java +++ b/src/main/java/ru/betterend/blocks/LumecornBlock.java @@ -1,5 +1,8 @@ package ru.betterend.blocks; +import java.util.Collections; +import java.util.List; + import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.block.Block; @@ -7,6 +10,8 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.Material; import net.minecraft.block.ShapeContext; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.context.LootContext; import net.minecraft.state.StateManager; import net.minecraft.state.property.EnumProperty; import net.minecraft.util.math.BlockPos; @@ -19,16 +24,21 @@ import ru.betterend.blocks.BlockProperties.LumecornShape; import ru.betterend.blocks.basis.BaseBlockNotFull; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndItems; import ru.betterend.registry.EndTags; +import ru.betterend.util.MHelper; public class LumecornBlock extends BaseBlockNotFull implements IRenderTypeable { public static final EnumProperty SHAPE = EnumProperty.of("shape", LumecornShape.class); - private static final VoxelShape SHAPE_BIG = Block.createCuboidShape(5, 0, 5, 11, 16, 11); - private static final VoxelShape SHAPE_MEDIUM = Block.createCuboidShape(6, 0, 6, 10, 16, 10); - private static final VoxelShape SHAPE_SMALL = Block.createCuboidShape(7, 0, 7, 9, 16, 9); + private static final VoxelShape SHAPE_BOTTOM = Block.createCuboidShape(6, 0, 6, 10, 16, 10); + private static final VoxelShape SHAPE_TOP = Block.createCuboidShape(6, 0, 6, 10, 8, 10); public LumecornBlock() { - super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).hardness(0.5F).luminance((state) -> { + super(FabricBlockSettings.of(Material.WOOD) + .breakByTool(FabricToolTags.AXES) + .hardness(0.5F) + .luminance((state) -> { return state.get(SHAPE).getLight(); })); } @@ -45,16 +55,7 @@ public class LumecornBlock extends BaseBlockNotFull implements IRenderTypeable { @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - LumecornShape shape = state.get(SHAPE); - if (shape == LumecornShape.LIGHT_MIDDLE) { - return SHAPE_SMALL; - } - else if (shape == LumecornShape.LIGHT_TOP_MIDDLE) { - return SHAPE_MEDIUM; - } - else { - return SHAPE_BIG; - } + return state.get(SHAPE) == LumecornShape.LIGHT_TOP ? SHAPE_TOP : SHAPE_BOTTOM; } @Override @@ -63,9 +64,12 @@ public class LumecornBlock extends BaseBlockNotFull implements IRenderTypeable { if (shape == LumecornShape.BOTTOM_BIG || shape == LumecornShape.BOTTOM_SMALL) { return world.getBlockState(pos.down()).isIn(EndTags.END_GROUND); } - else { + else if (shape == LumecornShape.LIGHT_TOP) { return world.getBlockState(pos.down()).isOf(this); } + else { + return world.getBlockState(pos.down()).isOf(this) && world.getBlockState(pos.up()).isOf(this); + } } @Override @@ -77,4 +81,23 @@ public class LumecornBlock extends BaseBlockNotFull implements IRenderTypeable { return state; } } + + @Override + public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + LumecornShape shape = state.get(SHAPE); + if (shape == LumecornShape.BOTTOM_BIG || shape == LumecornShape.BOTTOM_SMALL || shape == LumecornShape.MIDDLE) { + if (MHelper.RANDOM.nextBoolean()) { + return Collections.singletonList(new ItemStack(EndBlocks.LUMECORN_SEED)); + } + else { + return Collections.emptyList(); + } + } + if (MHelper.RANDOM.nextBoolean()) { + return Collections.singletonList(new ItemStack(EndItems.LUMECORN_ROD)); + } + else { + return Collections.emptyList(); + } + } } diff --git a/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java b/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java new file mode 100644 index 00000000..de06b251 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java @@ -0,0 +1,28 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.minecraft.block.AbstractBlock; +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.StructureWorldAccess; +import ru.betterend.blocks.basis.EndPlantWithAgeBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; + +public class LumecornSeedBlock extends EndPlantWithAgeBlock { + @Override + public void growAdult(StructureWorldAccess world, Random random, BlockPos pos) { + EndFeatures.LUMECORN.getFeature().generate(world, null, random, pos, null); + } + + @Override + protected boolean isTerrain(BlockState state) { + return state.isOf(EndBlocks.END_MOSS); + } + + @Override + public AbstractBlock.OffsetType getOffsetType() { + return AbstractBlock.OffsetType.NONE; + } +} diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 0560bb93..6d337615 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -57,6 +57,7 @@ import ru.betterend.blocks.LacugroveSaplingBlock; import ru.betterend.blocks.LanceleafBlock; import ru.betterend.blocks.LanceleafSeedBlock; import ru.betterend.blocks.LumecornBlock; +import ru.betterend.blocks.LumecornSeedBlock; import ru.betterend.blocks.MengerSpongeBlock; import ru.betterend.blocks.MengerSpongeWetBlock; import ru.betterend.blocks.MossyGlowshroomCapBlock; @@ -228,7 +229,8 @@ public class EndBlocks { public static final Block SMALL_JELLYSHROOM = registerBlock("small_jellyshroom", new SmallJellyshroomBlock()); - public static final Block LUMECORN = registerBlock("lumecorn", new LumecornBlock()); + public static final Block LUMECORN_SEED = registerBlock("lumecorn_seed", new LumecornSeedBlock()); + public static final Block LUMECORN = registerBlockNI("lumecorn", new LumecornBlock()); // Crops public static final Block BLOSSOM_BERRY = registerBlock("blossom_berry_seed", new EndCropBlock(EndItems.BLOSSOM_BERRY, PINK_MOSS)); diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index 71c4230c..b9bc0d75 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -73,6 +73,7 @@ public class EndItems { public final static Item LEATHER_STRIPE = registerItem("leather_stripe"); public final static Item LEATHER_WRAPPED_STICK = registerItem("leather_wrapped_stick"); public final static Item SILK_FIBER = registerItem("silk_fiber"); + public final static Item LUMECORN_ROD = registerItem("lumecorn_rod"); // Armor // public static final Item TERMINITE_HELMET = registerItem("terminite_helmet", new ArmorItem(EndArmorMaterial.TERMINITE, EquipmentSlot.HEAD, makeItemSettings())); diff --git a/src/main/resources/assets/betterend/blockstates/lumecorn_seed.json b/src/main/resources/assets/betterend/blockstates/lumecorn_seed.json new file mode 100644 index 00000000..7277a13a --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/lumecorn_seed.json @@ -0,0 +1,8 @@ +{ + "variants": { + "age=0": { "model": "betterend:block/lumecorn_seed_0" }, + "age=1": { "model": "betterend:block/lumecorn_seed_1" }, + "age=2": { "model": "betterend:block/lumecorn_seed_2" }, + "age=3": { "model": "betterend:block/lumecorn_seed_3" } + } +} diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index d44bc57d..71f863e0 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -589,5 +589,8 @@ "block.betterend.thallasium_door": "Thallasium Door", "block.betterend.thallasium_plate": "Thallasium Pressure Plate", "block.betterend.thallasium_tile": "Thallasium Tile", - "block.betterend.thallasium_trapdoor": "Thallasium Trapdoor" + "block.betterend.thallasium_trapdoor": "Thallasium Trapdoor", + + "block.betterend.lumecorn_seed": "Lumecorn Seed", + "item.betterend.lumecorn_rod": "Lumecorn Rod" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index ed391bab..1d247de1 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -591,5 +591,8 @@ "block.betterend.thallasium_door": "Талласиевая дверь", "block.betterend.thallasium_plate": "Талласиевая нажимная плита", "block.betterend.thallasium_tile": "Талласиевая плитка", - "block.betterend.thallasium_trapdoor": "Талласиевый люк" + "block.betterend.thallasium_trapdoor": "Талласиевый люк", + + "block.betterend.lumecorn_seed": "Семя люмекорна", + "item.betterend.lumecorn_rod": "Стержень люмекорна" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/lights/item/blue_vine_lantern.json b/src/main/resources/assets/betterend/lights/item/blue_vine_lantern.json new file mode 100644 index 00000000..5e61fc7d --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/blue_vine_lantern.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.0, + "green": 0.0, + "blue": 1.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/glowing_pillar_luminophor.json b/src/main/resources/assets/betterend/lights/item/glowing_pillar_luminophor.json new file mode 100644 index 00000000..adffdd3a --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/glowing_pillar_luminophor.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 0.5, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/lumecorn_rod.json b/src/main/resources/assets/betterend/lights/item/lumecorn_rod.json new file mode 100644 index 00000000..44c23281 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/lumecorn_rod.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.5, + "green": 1.0, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/lumecorn_seed.json b/src/main/resources/assets/betterend/materialmaps/block/lumecorn_seed.json new file mode 100644 index 00000000..c19e0715 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/lumecorn_seed.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_floor_glow_50" +} diff --git a/src/main/resources/assets/betterend/materialmaps/item/lumecorn_rod.json b/src/main/resources/assets/betterend/materialmaps/item/lumecorn_rod.json new file mode 100644 index 00000000..36db9946 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/lumecorn_rod.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_50" +} diff --git a/src/main/resources/assets/betterend/materialmaps/item/lumecorn_seed.json b/src/main/resources/assets/betterend/materialmaps/item/lumecorn_seed.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/lumecorn_seed.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_seed_0.json b/src/main/resources/assets/betterend/models/block/lumecorn_seed_0.json new file mode 100644 index 00000000..b368c4dd --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_seed_0.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_no_distortion", + "textures": { + "texture": "betterend:block/lumecorn_0" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_seed_1.json b/src/main/resources/assets/betterend/models/block/lumecorn_seed_1.json new file mode 100644 index 00000000..a86effd6 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_seed_1.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_no_distortion", + "textures": { + "texture": "betterend:block/lumecorn_1" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_seed_2.json b/src/main/resources/assets/betterend/models/block/lumecorn_seed_2.json new file mode 100644 index 00000000..b73ac4a8 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_seed_2.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_no_distortion", + "textures": { + "texture": "betterend:block/lumecorn_2" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lumecorn_seed_3.json b/src/main/resources/assets/betterend/models/block/lumecorn_seed_3.json new file mode 100644 index 00000000..3223318b --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lumecorn_seed_3.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_no_distortion", + "textures": { + "texture": "betterend:block/lumecorn_3" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/lumecorn_seed.json b/src/main/resources/assets/betterend/models/item/lumecorn_seed.json new file mode 100644 index 00000000..b00d70f6 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/lumecorn_seed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "betterend:item/lumecorn_seed" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/item/lumicorn.png b/src/main/resources/assets/betterend/textures/item/lumecorn_rod.png similarity index 100% rename from src/main/resources/assets/betterend/textures/item/lumicorn.png rename to src/main/resources/assets/betterend/textures/item/lumecorn_rod.png diff --git a/src/main/resources/assets/betterend/textures/item/lumecorn_seed.png b/src/main/resources/assets/betterend/textures/item/lumecorn_seed.png new file mode 100644 index 0000000000000000000000000000000000000000..e2d72406f86f734a08eafd216bd2b6193b20f1d1 GIT binary patch literal 1591 zcmbVMTZr6L7*5wkdbi%XU0Z0HRqLh6NiwrDo6xvBovhB#&A4m_y6c1VOmb!>>?9{9 z+0N{`^-`odkBU;MqUeKC1p8JIrHf!$s}#WpMOf*sg$iov%4ln8o$+KYL8NMJAj!FW z=ld_;fBx!d=8<))?^;b!)Vg#^9V7n@!MpNi^4(f%K=NDVq$WIyT625wuAq**zKNo` zYi4%bAJ;}?9a|hUa1L=5%OPlr+BsNppgxIwI)@6TtuPlpnqz3wP?){_8m~D?R5VjF zF4{Ab$?7wcx@0he579d-G9j>#59x|kvOT$?Fil>WjDuys&`pRxsW6GaAU&>)(n;(h zx}S@&x)2rVxWoxDUJ|1_XptA?9^nFJL zpj<9<~W z*7n+IA_)T(=m3G^gOHj)Ll1Gzlv`>VH*|nX$U?U75v&kmNtQG%gkO`^vO=`y5AP=) zwPU*`+RIKm2#g^QPq{i8-cKy{bsTew*vDQG|3e(%b{LH#CtU=6>}D}8b%Yx2u+Yh5 zAj|-L-(J%;aM`;*Fw{PSROlmx5qVJ{lCh$YC8|Y!{3d}!+^ttt$0l`~C4?iZn+gM!Y+^1Q^7a?7(h zJ|1VKXe273e7}^7$2#X#tWO0ZcFr6B^ZcW(NiGpA-8fGulAOdP>}uE`S&jrH+$<$I zWqL%f>Gq}AgPv%QN+#W`9vSLEfh&w2D2oiHy=>laW?Ho6A|j;!B6kbs;k;jlE=m+g z7O$tG0P!CLx3Lup_NoxG6_2wvPt`LNuT=pms*|lxF6GMB0KPf zeznmUyy>22s?Y8kdU?eyjT4vW&V5&H-0|VitFIiM?OC{T@ufs{_m=mz^u0Co>tlXx z?uCtN?X^kJd;H|l$ZhAl-km6X@=jy+^5*2)^+O!}oF(QOKRw@FpTBqh;OTSAyN@j$ zUnpe?i+3);#l`O#ZbRb8w}z*%JlH-D|R>a_U|t~2`-H+1g$+ioKfH3weR4c-@X`O literal 0 HcmV?d00001 From 6b8422dae32b5973c3edad42acc57e6a8994b56f Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 21 Jan 2021 08:05:35 +0300 Subject: [PATCH 199/463] Thallasium Chandelier (floor, WIP) --- .../ru/betterend/blocks/AeterniumBlock.java | 4 +- .../java/ru/betterend/blocks/AmberBlock.java | 4 +- .../blocks/AncientEmeraldIceBlock.java | 4 +- .../blocks/BlueVineLanternBlock.java | 4 +- .../ru/betterend/blocks/BrimstoneBlock.java | 4 +- .../ru/betterend/blocks/CapsacisCapBlock.java | 4 +- .../blocks/DenseEmeraldIceBlock.java | 4 +- .../ru/betterend/blocks/DenseSnowBlock.java | 4 +- .../betterend/blocks/EndLotusLeafBlock.java | 4 +- .../betterend/blocks/EndLotusStemBlock.java | 4 +- .../ru/betterend/blocks/EndPathBlock.java | 4 +- .../ru/betterend/blocks/EndStoneBlock.java | 4 +- .../ru/betterend/blocks/EndTerrainBlock.java | 4 +- .../java/ru/betterend/blocks/EnderBlock.java | 4 +- .../blocks/GlowingPillarLuminophorBlock.java | 4 +- .../blocks/HelixTreeLeavesBlock.java | 4 +- .../betterend/blocks/HydraluxPetalBlock.java | 4 +- .../blocks/HydrothermalVentBlock.java | 4 +- .../ru/betterend/blocks/LumecornBlock.java | 4 +- .../betterend/blocks/MengerSpongeBlock.java | 4 +- .../blocks/MengerSpongeWetBlock.java | 4 +- .../blocks/MossyGlowshroomCapBlock.java | 4 +- .../MossyGlowshroomHymenophoreBlock.java | 4 +- .../betterend/blocks/RespawnObeliskBlock.java | 4 +- .../ru/betterend/blocks/RunedFlavolite.java | 4 +- .../betterend/blocks/SilkMothNestBlock.java | 4 +- .../ru/betterend/blocks/TerminiteBlock.java | 4 +- .../blocks/ThallasiumChandelierBlock.java | 47 +++++++ .../blocks/UmbrellaTreeClusterBlock.java | 4 +- .../blocks/UmbrellaTreeClusterEmptyBlock.java | 4 +- .../betterend/blocks/basis/AttachedBlock.java | 2 +- .../basis/{BaseBlock.java => BlockBase.java} | 4 +- ...lockNotFull.java => BlockBaseNotFull.java} | 4 +- .../blocks/basis/DoublePlantBlock.java | 2 +- .../blocks/basis/EndBookshelfBlock.java | 2 +- .../blocks/basis/EndLadderBlock.java | 2 +- .../blocks/basis/EndLanternBlock.java | 2 +- .../betterend/blocks/basis/EndPlantBlock.java | 2 +- .../blocks/basis/FeatureSaplingBlock.java | 2 +- .../betterend/blocks/basis/PedestalBlock.java | 2 +- .../blocks/basis/SimpleLeavesBlock.java | 2 +- .../blocks/basis/UnderwaterPlantBlock.java | 2 +- .../blocks/basis/UpDownPlantBlock.java | 2 +- .../ru/betterend/blocks/basis/VineBlock.java | 2 +- .../blocks/complex/MetalMaterial.java | 8 +- .../blocks/complex/StoneMaterial.java | 10 +- .../blocks/complex/WoodenMaterial.java | 4 +- .../java/ru/betterend/registry/EndBlocks.java | 3 + .../blockstates/thallasium_chandelier.json | 10 ++ .../assets/betterend/lang/en_us.json | 3 +- .../assets/betterend/lang/ru_ru.json | 3 +- .../block/thallasium_chandelier.json | 3 + .../assets/betterend/materials/glow_60.json | 10 ++ .../models/block/thallasium_chandelier.json | 132 ++++++++++++++++++ .../models/item/thallasium_chandelier.json | 6 + .../betterend/shaders/material/glow_65.frag | 6 + .../textures/block/thallasium_chandelier.png | Bin 0 -> 543 bytes .../textures/item/thallasium_chandelier.png | Bin 0 -> 366 bytes 58 files changed, 306 insertions(+), 87 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/ThallasiumChandelierBlock.java rename src/main/java/ru/betterend/blocks/basis/{BaseBlock.java => BlockBase.java} (88%) rename src/main/java/ru/betterend/blocks/basis/{BaseBlockNotFull.java => BlockBaseNotFull.java} (81%) create mode 100644 src/main/resources/assets/betterend/blockstates/thallasium_chandelier.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/thallasium_chandelier.json create mode 100644 src/main/resources/assets/betterend/materials/glow_60.json create mode 100644 src/main/resources/assets/betterend/models/block/thallasium_chandelier.json create mode 100644 src/main/resources/assets/betterend/models/item/thallasium_chandelier.json create mode 100644 src/main/resources/assets/betterend/shaders/material/glow_65.frag create mode 100644 src/main/resources/assets/betterend/textures/block/thallasium_chandelier.png create mode 100644 src/main/resources/assets/betterend/textures/item/thallasium_chandelier.png diff --git a/src/main/java/ru/betterend/blocks/AeterniumBlock.java b/src/main/java/ru/betterend/blocks/AeterniumBlock.java index 580971f0..e5e11578 100644 --- a/src/main/java/ru/betterend/blocks/AeterniumBlock.java +++ b/src/main/java/ru/betterend/blocks/AeterniumBlock.java @@ -9,9 +9,9 @@ import net.minecraft.block.MaterialColor; import net.minecraft.sound.BlockSoundGroup; import net.minecraft.util.math.BlockPos; import net.minecraft.world.BlockView; -import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.BlockBase; -public class AeterniumBlock extends BaseBlock { +public class AeterniumBlock extends BlockBase { public AeterniumBlock() { super(FabricBlockSettings.of(Material.METAL, MaterialColor.GRAY) diff --git a/src/main/java/ru/betterend/blocks/AmberBlock.java b/src/main/java/ru/betterend/blocks/AmberBlock.java index ccb5c7e1..54e7ee94 100644 --- a/src/main/java/ru/betterend/blocks/AmberBlock.java +++ b/src/main/java/ru/betterend/blocks/AmberBlock.java @@ -3,9 +3,9 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.Blocks; import net.minecraft.block.MaterialColor; -import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.BlockBase; -public class AmberBlock extends BaseBlock { +public class AmberBlock extends BlockBase { public AmberBlock() { super(FabricBlockSettings.copyOf(Blocks.DIAMOND_BLOCK).materialColor(MaterialColor.YELLOW)); } diff --git a/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java index cf79803a..7c1395d3 100644 --- a/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java +++ b/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java @@ -8,13 +8,13 @@ import net.minecraft.block.Blocks; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; -import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndParticles; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; -public class AncientEmeraldIceBlock extends BaseBlock { +public class AncientEmeraldIceBlock extends BlockBase { public AncientEmeraldIceBlock() { super(FabricBlockSettings.copyOf(Blocks.BLUE_ICE).ticksRandomly()); } diff --git a/src/main/java/ru/betterend/blocks/BlueVineLanternBlock.java b/src/main/java/ru/betterend/blocks/BlueVineLanternBlock.java index d89b2cda..a79781a6 100644 --- a/src/main/java/ru/betterend/blocks/BlueVineLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/BlueVineLanternBlock.java @@ -13,10 +13,10 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; -import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; -public class BlueVineLanternBlock extends BaseBlock { +public class BlueVineLanternBlock extends BlockBase { public static final BooleanProperty NATURAL = BlockProperties.NATURAL; public BlueVineLanternBlock() { diff --git a/src/main/java/ru/betterend/blocks/BrimstoneBlock.java b/src/main/java/ru/betterend/blocks/BrimstoneBlock.java index 8d213b02..4ddf7416 100644 --- a/src/main/java/ru/betterend/blocks/BrimstoneBlock.java +++ b/src/main/java/ru/betterend/blocks/BrimstoneBlock.java @@ -13,11 +13,11 @@ import net.minecraft.state.StateManager; import net.minecraft.state.property.BooleanProperty; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; -import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; -public class BrimstoneBlock extends BaseBlock { +public class BrimstoneBlock extends BlockBase { public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; public BrimstoneBlock() { diff --git a/src/main/java/ru/betterend/blocks/CapsacisCapBlock.java b/src/main/java/ru/betterend/blocks/CapsacisCapBlock.java index 514bb05f..a0ed6f46 100644 --- a/src/main/java/ru/betterend/blocks/CapsacisCapBlock.java +++ b/src/main/java/ru/betterend/blocks/CapsacisCapBlock.java @@ -8,11 +8,11 @@ import net.minecraft.block.MaterialColor; import net.minecraft.item.ItemPlacementContext; import net.minecraft.state.StateManager; import net.minecraft.state.property.IntProperty; -import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.BlockBase; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; -public class CapsacisCapBlock extends BaseBlock { +public class CapsacisCapBlock extends BlockBase { private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); public static final IntProperty COLOR = BlockProperties.COLOR; diff --git a/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java index e94b0a6f..48c1059a 100644 --- a/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java +++ b/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java @@ -2,11 +2,11 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.Blocks; -import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.BlockBase; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; -public class DenseEmeraldIceBlock extends BaseBlock implements IRenderTypeable { +public class DenseEmeraldIceBlock extends BlockBase implements IRenderTypeable { public DenseEmeraldIceBlock() { super(FabricBlockSettings.copyOf(Blocks.PACKED_ICE)); } diff --git a/src/main/java/ru/betterend/blocks/DenseSnowBlock.java b/src/main/java/ru/betterend/blocks/DenseSnowBlock.java index a408291f..d0c9ecf6 100644 --- a/src/main/java/ru/betterend/blocks/DenseSnowBlock.java +++ b/src/main/java/ru/betterend/blocks/DenseSnowBlock.java @@ -3,9 +3,9 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.Material; import net.minecraft.sound.BlockSoundGroup; -import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.BlockBase; -public class DenseSnowBlock extends BaseBlock { +public class DenseSnowBlock extends BlockBase { public DenseSnowBlock() { super(FabricBlockSettings.of(Material.SNOW_BLOCK).strength(0.2F).sounds(BlockSoundGroup.SNOW)); } diff --git a/src/main/java/ru/betterend/blocks/EndLotusLeafBlock.java b/src/main/java/ru/betterend/blocks/EndLotusLeafBlock.java index 2281bb7e..cb15f1e5 100644 --- a/src/main/java/ru/betterend/blocks/EndLotusLeafBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLotusLeafBlock.java @@ -21,13 +21,13 @@ import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.BlockView; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BaseBlockNotFull; +import ru.betterend.blocks.basis.BlockBaseNotFull; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; -public class EndLotusLeafBlock extends BaseBlockNotFull implements IRenderTypeable { +public class EndLotusLeafBlock extends BlockBaseNotFull implements IRenderTypeable { public static final EnumProperty HORIZONTAL_FACING = Properties.HORIZONTAL_FACING; public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; private static final VoxelShape VSHAPE = Block.createCuboidShape(0, 0, 0, 16, 1, 16); diff --git a/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java b/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java index 62acf529..33a8d215 100644 --- a/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java @@ -26,12 +26,12 @@ import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.BlockView; import net.minecraft.world.WorldAccess; import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.BlockBase; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.util.BlocksHelper; -public class EndLotusStemBlock extends BaseBlock implements Waterloggable, IRenderTypeable { +public class EndLotusStemBlock extends BlockBase implements Waterloggable, IRenderTypeable { public static final EnumProperty FACING = Properties.FACING; public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; public static final BooleanProperty LEAF = BooleanProperty.of("leaf"); diff --git a/src/main/java/ru/betterend/blocks/EndPathBlock.java b/src/main/java/ru/betterend/blocks/EndPathBlock.java index 4b3a28bf..acfb6c53 100644 --- a/src/main/java/ru/betterend/blocks/EndPathBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPathBlock.java @@ -16,9 +16,9 @@ import net.minecraft.loot.context.LootContextParameters; import net.minecraft.util.math.BlockPos; import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.BlockView; -import ru.betterend.blocks.basis.BaseBlockNotFull; +import ru.betterend.blocks.basis.BlockBaseNotFull; -public class EndPathBlock extends BaseBlockNotFull { +public class EndPathBlock extends BlockBaseNotFull { private static final VoxelShape SHAPE = Block.createCuboidShape(0, 0, 0, 16, 15, 16); public EndPathBlock(Block source) { diff --git a/src/main/java/ru/betterend/blocks/EndStoneBlock.java b/src/main/java/ru/betterend/blocks/EndStoneBlock.java index 399333c1..4bfa9cb4 100644 --- a/src/main/java/ru/betterend/blocks/EndStoneBlock.java +++ b/src/main/java/ru/betterend/blocks/EndStoneBlock.java @@ -4,9 +4,9 @@ import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.Blocks; import net.minecraft.block.MaterialColor; import net.minecraft.sound.BlockSoundGroup; -import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.BlockBase; -public class EndStoneBlock extends BaseBlock { +public class EndStoneBlock extends BlockBase { public EndStoneBlock(MaterialColor color) { super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color).sounds(BlockSoundGroup.STONE)); } diff --git a/src/main/java/ru/betterend/blocks/EndTerrainBlock.java b/src/main/java/ru/betterend/blocks/EndTerrainBlock.java index 489fbdd8..3d34f8b3 100644 --- a/src/main/java/ru/betterend/blocks/EndTerrainBlock.java +++ b/src/main/java/ru/betterend/blocks/EndTerrainBlock.java @@ -29,9 +29,9 @@ import net.minecraft.util.math.Direction; import net.minecraft.world.World; import net.minecraft.world.WorldView; import net.minecraft.world.chunk.light.ChunkLightProvider; -import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.BlockBase; -public class EndTerrainBlock extends BaseBlock { +public class EndTerrainBlock extends BlockBase { private Block pathBlock; public EndTerrainBlock(MaterialColor color) { diff --git a/src/main/java/ru/betterend/blocks/EnderBlock.java b/src/main/java/ru/betterend/blocks/EnderBlock.java index e1d1552f..1b80fabd 100644 --- a/src/main/java/ru/betterend/blocks/EnderBlock.java +++ b/src/main/java/ru/betterend/blocks/EnderBlock.java @@ -9,9 +9,9 @@ import net.minecraft.block.MaterialColor; import net.minecraft.sound.BlockSoundGroup; import net.minecraft.util.math.BlockPos; import net.minecraft.world.BlockView; -import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.BlockBase; -public class EnderBlock extends BaseBlock { +public class EnderBlock extends BlockBase { public EnderBlock() { super(FabricBlockSettings.of(Material.STONE, MaterialColor.field_25708) diff --git a/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java b/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java index 15f2f295..5e0f9d58 100644 --- a/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java +++ b/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java @@ -14,10 +14,10 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; -import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; -public class GlowingPillarLuminophorBlock extends BaseBlock { +public class GlowingPillarLuminophorBlock extends BlockBase { public static final BooleanProperty NATURAL = BooleanProperty.of("natural"); public GlowingPillarLuminophorBlock() { diff --git a/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java b/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java index 48e03300..7d4eaba6 100644 --- a/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java +++ b/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java @@ -23,13 +23,13 @@ import net.minecraft.sound.BlockSoundGroup; import net.minecraft.state.StateManager; import net.minecraft.state.property.IntProperty; import net.minecraft.util.math.MathHelper; -import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.BlockBase; import ru.betterend.interfaces.IColorProvider; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; -public class HelixTreeLeavesBlock extends BaseBlock implements IColorProvider { +public class HelixTreeLeavesBlock extends BlockBase implements IColorProvider { public static final IntProperty COLOR = BlockProperties.COLOR; private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); diff --git a/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java b/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java index 81722164..b514b7ef 100644 --- a/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java +++ b/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java @@ -8,9 +8,9 @@ import net.minecraft.entity.Entity; import net.minecraft.sound.BlockSoundGroup; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.BlockBase; -public class HydraluxPetalBlock extends BaseBlock { +public class HydraluxPetalBlock extends BlockBase { public HydraluxPetalBlock() { this(FabricBlockSettings.of(Material.PLANT) .materialColor(MaterialColor.SPRUCE) diff --git a/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java b/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java index 0b2807c6..262cad10 100644 --- a/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java +++ b/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java @@ -36,13 +36,13 @@ import net.minecraft.world.BlockView; import net.minecraft.world.World; import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; -import ru.betterend.blocks.basis.BaseBlockNotFull; +import ru.betterend.blocks.basis.BlockBaseNotFull; import ru.betterend.blocks.entities.BlockEntityHydrothermalVent; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndParticles; import ru.betterend.util.BlocksHelper; -public class HydrothermalVentBlock extends BaseBlockNotFull implements BlockEntityProvider, FluidFillable, Waterloggable { +public class HydrothermalVentBlock extends BlockBaseNotFull implements BlockEntityProvider, FluidFillable, Waterloggable { public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; private static final VoxelShape SHAPE = Block.createCuboidShape(1, 1, 1, 15, 16, 15); diff --git a/src/main/java/ru/betterend/blocks/LumecornBlock.java b/src/main/java/ru/betterend/blocks/LumecornBlock.java index 309fb3bf..0011b4ce 100644 --- a/src/main/java/ru/betterend/blocks/LumecornBlock.java +++ b/src/main/java/ru/betterend/blocks/LumecornBlock.java @@ -21,7 +21,7 @@ import net.minecraft.world.BlockView; import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties.LumecornShape; -import ru.betterend.blocks.basis.BaseBlockNotFull; +import ru.betterend.blocks.basis.BlockBaseNotFull; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndBlocks; @@ -29,7 +29,7 @@ import ru.betterend.registry.EndItems; import ru.betterend.registry.EndTags; import ru.betterend.util.MHelper; -public class LumecornBlock extends BaseBlockNotFull implements IRenderTypeable { +public class LumecornBlock extends BlockBaseNotFull implements IRenderTypeable { public static final EnumProperty SHAPE = EnumProperty.of("shape", LumecornShape.class); private static final VoxelShape SHAPE_BOTTOM = Block.createCuboidShape(6, 0, 6, 10, 16, 10); private static final VoxelShape SHAPE_TOP = Block.createCuboidShape(6, 0, 6, 10, 8, 10); diff --git a/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java b/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java index d7cffe8f..abefc6e1 100644 --- a/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java +++ b/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java @@ -19,12 +19,12 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.World; import net.minecraft.world.WorldAccess; -import ru.betterend.blocks.basis.BaseBlockNotFull; +import ru.betterend.blocks.basis.BlockBaseNotFull; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndBlocks; -public class MengerSpongeBlock extends BaseBlockNotFull implements IRenderTypeable { +public class MengerSpongeBlock extends BlockBaseNotFull implements IRenderTypeable { public MengerSpongeBlock() { super(FabricBlockSettings.copyOf(Blocks.SPONGE).nonOpaque()); } diff --git a/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java b/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java index 8439dfd3..a2a5a41c 100644 --- a/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java +++ b/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java @@ -16,13 +16,13 @@ import net.minecraft.sound.SoundEvents; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.World; -import ru.betterend.blocks.basis.BaseBlockNotFull; +import ru.betterend.blocks.basis.BlockBaseNotFull; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; -public class MengerSpongeWetBlock extends BaseBlockNotFull implements IRenderTypeable { +public class MengerSpongeWetBlock extends BlockBaseNotFull implements IRenderTypeable { public MengerSpongeWetBlock() { super(FabricBlockSettings.copyOf(Blocks.WET_SPONGE).nonOpaque()); } diff --git a/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java b/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java index 9aabe27f..af9338a4 100644 --- a/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java +++ b/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java @@ -9,10 +9,10 @@ import net.minecraft.item.ItemPlacementContext; import net.minecraft.sound.BlockSoundGroup; import net.minecraft.state.StateManager; import net.minecraft.state.property.BooleanProperty; -import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; -public class MossyGlowshroomCapBlock extends BaseBlock { +public class MossyGlowshroomCapBlock extends BlockBase { public static final BooleanProperty TRANSITION = BooleanProperty.of("transition"); public MossyGlowshroomCapBlock() { diff --git a/src/main/java/ru/betterend/blocks/MossyGlowshroomHymenophoreBlock.java b/src/main/java/ru/betterend/blocks/MossyGlowshroomHymenophoreBlock.java index a74c85bf..5f136023 100644 --- a/src/main/java/ru/betterend/blocks/MossyGlowshroomHymenophoreBlock.java +++ b/src/main/java/ru/betterend/blocks/MossyGlowshroomHymenophoreBlock.java @@ -4,9 +4,9 @@ import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.block.Material; import net.minecraft.sound.BlockSoundGroup; -import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.BlockBase; -public class MossyGlowshroomHymenophoreBlock extends BaseBlock { +public class MossyGlowshroomHymenophoreBlock extends BlockBase { public MossyGlowshroomHymenophoreBlock() { super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sounds(BlockSoundGroup.WART_BLOCK).luminance(15)); } diff --git a/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java b/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java index 8443c9f3..269ddc43 100644 --- a/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java +++ b/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java @@ -36,7 +36,7 @@ import net.minecraft.world.World; import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.BlockBase; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IColorProvider; import ru.betterend.interfaces.IRenderTypeable; @@ -46,7 +46,7 @@ import ru.betterend.registry.EndItems; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; -public class RespawnObeliskBlock extends BaseBlock implements IColorProvider, IRenderTypeable { +public class RespawnObeliskBlock extends BlockBase implements IColorProvider, IRenderTypeable { private static final VoxelShape VOXEL_SHAPE_BOTTOM = Block.createCuboidShape(1, 0, 1, 15, 16, 15); private static final VoxelShape VOXEL_SHAPE_MIDDLE_TOP = Block.createCuboidShape(2, 0, 2, 14, 16, 14); diff --git a/src/main/java/ru/betterend/blocks/RunedFlavolite.java b/src/main/java/ru/betterend/blocks/RunedFlavolite.java index 4ce7a552..9e4b18d4 100644 --- a/src/main/java/ru/betterend/blocks/RunedFlavolite.java +++ b/src/main/java/ru/betterend/blocks/RunedFlavolite.java @@ -6,10 +6,10 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.state.StateManager; import net.minecraft.state.property.BooleanProperty; -import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; -public class RunedFlavolite extends BaseBlock { +public class RunedFlavolite extends BlockBase { public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; public RunedFlavolite() { diff --git a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java index cb3588e6..7ed3e427 100644 --- a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java +++ b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java @@ -34,14 +34,14 @@ import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.BlockView; import net.minecraft.world.World; import net.minecraft.world.WorldAccess; -import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.BlockBase; import ru.betterend.client.render.ERenderLayer; import ru.betterend.entity.SilkMothEntity; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndEntities; import ru.betterend.util.BlocksHelper; -public class SilkMothNestBlock extends BaseBlock implements IRenderTypeable { +public class SilkMothNestBlock extends BlockBase implements IRenderTypeable { public static final BooleanProperty ACTIVE = BlockProperties.ACTIVE; public static final DirectionProperty FACING = Properties.HORIZONTAL_FACING; public static final IntProperty FULLNESS = BlockProperties.FULLNESS; diff --git a/src/main/java/ru/betterend/blocks/TerminiteBlock.java b/src/main/java/ru/betterend/blocks/TerminiteBlock.java index 627fe65f..204a2e55 100644 --- a/src/main/java/ru/betterend/blocks/TerminiteBlock.java +++ b/src/main/java/ru/betterend/blocks/TerminiteBlock.java @@ -4,9 +4,9 @@ import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.Material; import net.minecraft.block.MaterialColor; import net.minecraft.sound.BlockSoundGroup; -import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.BlockBase; -public class TerminiteBlock extends BaseBlock { +public class TerminiteBlock extends BlockBase { public TerminiteBlock() { super(FabricBlockSettings.of(Material.METAL, MaterialColor.field_25708) .hardness(7F) diff --git a/src/main/java/ru/betterend/blocks/ThallasiumChandelierBlock.java b/src/main/java/ru/betterend/blocks/ThallasiumChandelierBlock.java new file mode 100644 index 00000000..d11573f7 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/ThallasiumChandelierBlock.java @@ -0,0 +1,47 @@ +package ru.betterend.blocks; + +import java.util.EnumMap; + +import com.google.common.collect.Maps; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.MaterialColor; +import net.minecraft.block.ShapeContext; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.BlockView; +import ru.betterend.blocks.basis.AttachedBlock; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; + +public class ThallasiumChandelierBlock extends AttachedBlock implements IRenderTypeable { + private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); + + public ThallasiumChandelierBlock() { + super(FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(MaterialColor.BLUE).noCollision().nonOpaque().requiresTool().luminance(15)); + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + return BOUNDING_SHAPES.get(state.get(FACING)); + } + + static { + BOUNDING_SHAPES.put(Direction.UP, Block.createCuboidShape(5, 0, 5, 11, 13, 11)); + BOUNDING_SHAPES.put(Direction.DOWN, Block.createCuboidShape(5, 3, 5, 11, 16, 11)); + BOUNDING_SHAPES.put(Direction.NORTH, VoxelShapes.cuboid(0.0, 0.0, 0.5, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.SOUTH, VoxelShapes.cuboid(0.0, 0.0, 0.0, 1.0, 1.0, 0.5)); + BOUNDING_SHAPES.put(Direction.WEST, VoxelShapes.cuboid(0.5, 0.0, 0.0, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.EAST, VoxelShapes.cuboid(0.0, 0.0, 0.0, 0.5, 1.0, 1.0)); + } +} diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java index 55c2d478..e1a6b8a9 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java @@ -17,12 +17,12 @@ import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; import ru.betterend.util.BlocksHelper; -public class UmbrellaTreeClusterBlock extends BaseBlock { +public class UmbrellaTreeClusterBlock extends BlockBase { public static final BooleanProperty NATURAL = BlockProperties.NATURAL; public UmbrellaTreeClusterBlock() { diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java index 6cb335b5..29e5ba36 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java @@ -11,11 +11,11 @@ import net.minecraft.server.world.ServerWorld; import net.minecraft.state.StateManager; import net.minecraft.state.property.BooleanProperty; import net.minecraft.util.math.BlockPos; -import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; -public class UmbrellaTreeClusterEmptyBlock extends BaseBlock { +public class UmbrellaTreeClusterEmptyBlock extends BlockBase { public static final BooleanProperty NATURAL = BlockProperties.NATURAL; public UmbrellaTreeClusterEmptyBlock() { diff --git a/src/main/java/ru/betterend/blocks/basis/AttachedBlock.java b/src/main/java/ru/betterend/blocks/basis/AttachedBlock.java index e5a58779..25b73d13 100644 --- a/src/main/java/ru/betterend/blocks/basis/AttachedBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/AttachedBlock.java @@ -16,7 +16,7 @@ import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; import ru.betterend.util.BlocksHelper; -public abstract class AttachedBlock extends BaseBlockNotFull { +public abstract class AttachedBlock extends BlockBaseNotFull { public static final DirectionProperty FACING = Properties.FACING; public AttachedBlock(Settings settings) { diff --git a/src/main/java/ru/betterend/blocks/basis/BaseBlock.java b/src/main/java/ru/betterend/blocks/basis/BlockBase.java similarity index 88% rename from src/main/java/ru/betterend/blocks/basis/BaseBlock.java rename to src/main/java/ru/betterend/blocks/basis/BlockBase.java index a58755b9..cdebbf74 100644 --- a/src/main/java/ru/betterend/blocks/basis/BaseBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/BlockBase.java @@ -13,8 +13,8 @@ import net.minecraft.util.registry.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class BaseBlock extends Block implements BlockPatterned { - public BaseBlock(Settings settings) { +public class BlockBase extends Block implements BlockPatterned { + public BlockBase(Settings settings) { super(settings); } diff --git a/src/main/java/ru/betterend/blocks/basis/BaseBlockNotFull.java b/src/main/java/ru/betterend/blocks/basis/BlockBaseNotFull.java similarity index 81% rename from src/main/java/ru/betterend/blocks/basis/BaseBlockNotFull.java rename to src/main/java/ru/betterend/blocks/basis/BlockBaseNotFull.java index fb967f7e..dbf23923 100644 --- a/src/main/java/ru/betterend/blocks/basis/BaseBlockNotFull.java +++ b/src/main/java/ru/betterend/blocks/basis/BlockBaseNotFull.java @@ -5,9 +5,9 @@ import net.minecraft.entity.EntityType; import net.minecraft.util.math.BlockPos; import net.minecraft.world.BlockView; -public class BaseBlockNotFull extends BaseBlock { +public class BlockBaseNotFull extends BlockBase { - public BaseBlockNotFull(Settings settings) { + public BlockBaseNotFull(Settings settings) { super(settings); } diff --git a/src/main/java/ru/betterend/blocks/basis/DoublePlantBlock.java b/src/main/java/ru/betterend/blocks/basis/DoublePlantBlock.java index e21e6d92..fd8f7570 100644 --- a/src/main/java/ru/betterend/blocks/basis/DoublePlantBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/DoublePlantBlock.java @@ -40,7 +40,7 @@ import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; -public class DoublePlantBlock extends BaseBlockNotFull implements IRenderTypeable, Fertilizable { +public class DoublePlantBlock extends BlockBaseNotFull implements IRenderTypeable, Fertilizable { private static final VoxelShape SHAPE = Block.createCuboidShape(4, 2, 4, 12, 16, 12); public static final IntProperty ROTATION = BlockProperties.ROTATION; public static final BooleanProperty TOP = BooleanProperty.of("top"); diff --git a/src/main/java/ru/betterend/blocks/basis/EndBookshelfBlock.java b/src/main/java/ru/betterend/blocks/basis/EndBookshelfBlock.java index b275fd37..0916c4b0 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndBookshelfBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndBookshelfBlock.java @@ -17,7 +17,7 @@ import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; import ru.betterend.patterns.Patterns; -public class EndBookshelfBlock extends BaseBlock { +public class EndBookshelfBlock extends BlockBase { public EndBookshelfBlock(Block source) { super(FabricBlockSettings.copyOf(source)); } diff --git a/src/main/java/ru/betterend/blocks/basis/EndLadderBlock.java b/src/main/java/ru/betterend/blocks/basis/EndLadderBlock.java index a7343275..eaade397 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndLadderBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndLadderBlock.java @@ -31,7 +31,7 @@ import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; import ru.betterend.util.BlocksHelper; -public class EndLadderBlock extends BaseBlockNotFull implements IRenderTypeable, BlockPatterned { +public class EndLadderBlock extends BlockBaseNotFull implements IRenderTypeable, BlockPatterned { public static final DirectionProperty FACING = HorizontalFacingBlock.FACING; public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; protected static final VoxelShape EAST_SHAPE = Block.createCuboidShape(0.0D, 0.0D, 0.0D, 3.0D, 16.0D, 16.0D); diff --git a/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java index cb72f15c..79992a35 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java @@ -19,7 +19,7 @@ import net.minecraft.world.BlockView; import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; -public class EndLanternBlock extends BaseBlockNotFull implements Waterloggable, FluidFillable { +public class EndLanternBlock extends BlockBaseNotFull implements Waterloggable, FluidFillable { public static final BooleanProperty IS_FLOOR = BooleanProperty.of("is_floor"); public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; diff --git a/src/main/java/ru/betterend/blocks/basis/EndPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/EndPlantBlock.java index 136b7346..b684f604 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndPlantBlock.java @@ -34,7 +34,7 @@ import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndTags; -public class EndPlantBlock extends BaseBlockNotFull implements IRenderTypeable, Fertilizable { +public class EndPlantBlock extends BlockBaseNotFull implements IRenderTypeable, Fertilizable { private static final VoxelShape SHAPE = Block.createCuboidShape(4, 0, 4, 12, 14, 12); public EndPlantBlock() { diff --git a/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java b/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java index fd0b6ab5..7dcf202e 100644 --- a/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java @@ -27,7 +27,7 @@ import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.Patterns; import ru.betterend.registry.EndTags; -public abstract class FeatureSaplingBlock extends BaseBlockNotFull implements Fertilizable, IRenderTypeable { +public abstract class FeatureSaplingBlock extends BlockBaseNotFull implements Fertilizable, IRenderTypeable { private static final VoxelShape SHAPE = Block.createCuboidShape(4, 0, 4, 12, 14, 12); public FeatureSaplingBlock() { diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index 2214bf40..c1011797 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -43,7 +43,7 @@ import ru.betterend.patterns.Patterns; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; -public class PedestalBlock extends BaseBlockNotFull implements BlockEntityProvider { +public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvider { public final static EnumProperty STATE = BlockProperties.PEDESTAL_STATE; public static final BooleanProperty HAS_ITEM = BlockProperties.HAS_ITEM; public static final BooleanProperty HAS_LIGHT = BlockProperties.HAS_LIGHT; diff --git a/src/main/java/ru/betterend/blocks/basis/SimpleLeavesBlock.java b/src/main/java/ru/betterend/blocks/basis/SimpleLeavesBlock.java index 4161584a..dff29707 100644 --- a/src/main/java/ru/betterend/blocks/basis/SimpleLeavesBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/SimpleLeavesBlock.java @@ -12,7 +12,7 @@ import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.Patterns; -public class SimpleLeavesBlock extends BaseBlockNotFull implements IRenderTypeable { +public class SimpleLeavesBlock extends BlockBaseNotFull implements IRenderTypeable { public SimpleLeavesBlock(MaterialColor color) { super(FabricBlockSettings.of(Material.LEAVES) .strength(0.2F) diff --git a/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantBlock.java index 085118e7..b527c7f3 100644 --- a/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantBlock.java @@ -39,7 +39,7 @@ import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; -public class UnderwaterPlantBlock extends BaseBlockNotFull implements IRenderTypeable, Fertilizable, FluidFillable { +public class UnderwaterPlantBlock extends BlockBaseNotFull implements IRenderTypeable, Fertilizable, FluidFillable { private static final VoxelShape SHAPE = Block.createCuboidShape(4, 0, 4, 12, 14, 12); public UnderwaterPlantBlock() { diff --git a/src/main/java/ru/betterend/blocks/basis/UpDownPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/UpDownPlantBlock.java index d7778163..ae9e56a2 100644 --- a/src/main/java/ru/betterend/blocks/basis/UpDownPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/UpDownPlantBlock.java @@ -30,7 +30,7 @@ import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndTags; -public class UpDownPlantBlock extends BaseBlockNotFull implements IRenderTypeable { +public class UpDownPlantBlock extends BlockBaseNotFull implements IRenderTypeable { private static final VoxelShape SHAPE = Block.createCuboidShape(4, 0, 4, 12, 16, 12); public UpDownPlantBlock() { diff --git a/src/main/java/ru/betterend/blocks/basis/VineBlock.java b/src/main/java/ru/betterend/blocks/basis/VineBlock.java index e6360b4d..1fe0f431 100644 --- a/src/main/java/ru/betterend/blocks/basis/VineBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/VineBlock.java @@ -38,7 +38,7 @@ import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.util.BlocksHelper; -public class VineBlock extends BaseBlockNotFull implements IRenderTypeable, Fertilizable { +public class VineBlock extends BlockBaseNotFull implements IRenderTypeable, Fertilizable { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; private static final VoxelShape VOXEL_SHAPE = Block.createCuboidShape(2, 0, 2, 14, 16, 14); diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index f9224a50..a59e1d93 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -7,7 +7,7 @@ import net.minecraft.block.MaterialColor; import net.minecraft.item.Item; import net.minecraft.item.Items; import net.minecraft.item.ToolMaterial; -import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.BlockBase; import ru.betterend.blocks.basis.EndDoorBlock; import ru.betterend.blocks.basis.EndMetalPaneBlock; import ru.betterend.blocks.basis.EndTrapdoorBlock; @@ -42,9 +42,9 @@ public class MetalMaterial { public MetalMaterial(String name, MaterialColor color, ToolMaterial material) { FabricBlockSettings materialBlock = FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color); - ore = EndBlocks.registerBlock(name + "_ore", new BaseBlock(FabricBlockSettings.copyOf(Blocks.END_STONE))); - block = EndBlocks.registerBlock(name + "_block", new BaseBlock(materialBlock)); - tile = EndBlocks.registerBlock(name + "_tile", new BaseBlock(materialBlock)); + ore = EndBlocks.registerBlock(name + "_ore", new BlockBase(FabricBlockSettings.copyOf(Blocks.END_STONE))); + block = EndBlocks.registerBlock(name + "_block", new BlockBase(materialBlock)); + tile = EndBlocks.registerBlock(name + "_tile", new BlockBase(materialBlock)); bars = EndBlocks.registerBlock(name + "_bars", new EndMetalPaneBlock(block)); plate = EndBlocks.registerBlock(name + "_plate", new EndWoodenPlateBlock(block)); door = EndBlocks.registerBlock(name + "_door", new EndDoorBlock(block)); diff --git a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java index f159d795..d4b4cefe 100644 --- a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java @@ -7,7 +7,7 @@ import net.minecraft.block.MaterialColor; import net.minecraft.tag.BlockTags; import net.minecraft.tag.ItemTags; import ru.betterend.blocks.EndPedestal; -import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.BlockBase; import ru.betterend.blocks.basis.EndPillarBlock; import ru.betterend.blocks.basis.EndSlabBlock; import ru.betterend.blocks.basis.EndStairsBlock; @@ -44,9 +44,9 @@ public class StoneMaterial { public StoneMaterial(String name, MaterialColor color) { FabricBlockSettings material = FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color); - stone = EndBlocks.registerBlock(name, new BaseBlock(material)); - polished = EndBlocks.registerBlock(name + "_polished", new BaseBlock(material)); - tiles = EndBlocks.registerBlock(name + "_tiles", new BaseBlock(material)); + stone = EndBlocks.registerBlock(name, new BlockBase(material)); + polished = EndBlocks.registerBlock(name + "_polished", new BlockBase(material)); + tiles = EndBlocks.registerBlock(name + "_tiles", new BlockBase(material)); pillar = EndBlocks.registerBlock(name + "_pillar", new EndPillarBlock(material)); stairs = EndBlocks.registerBlock(name + "_stairs", new EndStairsBlock(stone)); slab = EndBlocks.registerBlock(name + "_slab", new EndSlabBlock(stone)); @@ -56,7 +56,7 @@ public class StoneMaterial { pedestal = EndBlocks.registerBlock(name + "_pedestal", new EndPedestal(stone)); lantern = EndBlocks.registerBlock(name + "_lantern", new StoneLanternBlock(stone)); - bricks = EndBlocks.registerBlock(name + "_bricks", new BaseBlock(material)); + bricks = EndBlocks.registerBlock(name + "_bricks", new BlockBase(material)); brick_stairs = EndBlocks.registerBlock(name + "_bricks_stairs", new EndStairsBlock(bricks)); brick_slab = EndBlocks.registerBlock(name + "_bricks_slab", new EndSlabBlock(bricks)); brick_wall = EndBlocks.registerBlock(name + "_bricks_wall", new EndWallBlock(bricks)); diff --git a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java index a7533747..b934845d 100644 --- a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java @@ -11,7 +11,7 @@ import net.minecraft.tag.BlockTags; import net.minecraft.tag.ItemTags; import net.minecraft.tag.Tag; import ru.betterend.blocks.basis.BarkBlock; -import ru.betterend.blocks.basis.BaseBlock; +import ru.betterend.blocks.basis.BlockBase; import ru.betterend.blocks.basis.EndBarrelBlock; import ru.betterend.blocks.basis.EndBlockStripableLogLog; import ru.betterend.blocks.basis.EndBookshelfBlock; @@ -74,7 +74,7 @@ public class WoodenMaterial { log = EndBlocks.registerBlock(name + "_log", new EndBlockStripableLogLog(woodColor, log_stripped)); bark = EndBlocks.registerBlock(name + "_bark", new StrippableBarkBlock(woodColor, bark_stripped)); - planks = EndBlocks.registerBlock(name + "_planks", new BaseBlock(materialPlanks)); + planks = EndBlocks.registerBlock(name + "_planks", new BlockBase(materialPlanks)); stairs = EndBlocks.registerBlock(name + "_stairs", new EndStairsBlock(planks)); slab = EndBlocks.registerBlock(name + "_slab", new EndSlabBlock(planks)); fence = EndBlocks.registerBlock(name + "_fence", new EndFenceBlock(planks)); diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 6d337615..abad7f6c 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -78,6 +78,7 @@ import ru.betterend.blocks.TenaneaFlowersBlock; import ru.betterend.blocks.TenaneaSaplingBlock; import ru.betterend.blocks.TerminiteBlock; import ru.betterend.blocks.TerrainPlantBlock; +import ru.betterend.blocks.ThallasiumChandelierBlock; import ru.betterend.blocks.TwistedUmbrellaMossBlock; import ru.betterend.blocks.TwistedUmbrellaMossTallBlock; import ru.betterend.blocks.UmbrellaMossBlock; @@ -307,6 +308,8 @@ public class EndBlocks { public static final Block BULB_LANTERN = registerBlock("bulb_lantern", new BulbVineLanternBlock()); public static final ColoredMaterial BULB_LANTERN_COLORED = new ColoredMaterial(BulbVineLanternColoredBlock::new, BULB_LANTERN, false); + public static final Block THALLASIUM_CHANDELIER = registerBlock("thallasium_chandelier", new ThallasiumChandelierBlock()); + // Blocks With Entity // public static final Block END_STONE_SMELTER = registerBlock("end_stone_smelter", new EndStoneSmelter()); public static final Block ETERNAL_PEDESTAL = registerBlock("eternal_pedestal", new EternalPedestal()); diff --git a/src/main/resources/assets/betterend/blockstates/thallasium_chandelier.json b/src/main/resources/assets/betterend/blockstates/thallasium_chandelier.json new file mode 100644 index 00000000..d5395443 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/thallasium_chandelier.json @@ -0,0 +1,10 @@ +{ + "variants": { + "facing=up": { "model": "betterend:block/thallasium_chandelier" }, + "facing=down": { "model": "betterend:block/blue_vine_fur", "x": 180 }, + "facing=north": { "model": "betterend:block/blue_vine_fur", "x": 90 }, + "facing=south": { "model": "betterend:block/blue_vine_fur", "x": 90, "y": 180 }, + "facing=east": { "model": "betterend:block/blue_vine_fur", "x": 90, "y": 90 }, + "facing=west": { "model": "betterend:block/blue_vine_fur", "x": 90, "y": 270 } + } +} diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 71f863e0..79e32b8a 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -592,5 +592,6 @@ "block.betterend.thallasium_trapdoor": "Thallasium Trapdoor", "block.betterend.lumecorn_seed": "Lumecorn Seed", - "item.betterend.lumecorn_rod": "Lumecorn Rod" + "item.betterend.lumecorn_rod": "Lumecorn Rod", + "block.betterend.thallasium_chandelier": "Thallasium Chandelier" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 1d247de1..76f0b583 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -594,5 +594,6 @@ "block.betterend.thallasium_trapdoor": "Талласиевый люк", "block.betterend.lumecorn_seed": "Семя люмекорна", - "item.betterend.lumecorn_rod": "Стержень люмекорна" + "item.betterend.lumecorn_rod": "Стержень люмекорна", + "block.betterend.thallasium_chandelier": "Талласиевый канделябр" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_chandelier.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_chandelier.json new file mode 100644 index 00000000..fde436df --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_chandelier.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_65" +} diff --git a/src/main/resources/assets/betterend/materials/glow_60.json b/src/main/resources/assets/betterend/materials/glow_60.json new file mode 100644 index 00000000..4df0ffa1 --- /dev/null +++ b/src/main/resources/assets/betterend/materials/glow_60.json @@ -0,0 +1,10 @@ +{ + "layers": [ + { + "vertexSource": "canvas:shaders/material/default.vert", + "fragmentSource": "betterend:shaders/material/glow_65.frag", + "disableAo": true, + "disableDiffuse": true + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/thallasium_chandelier.json b/src/main/resources/assets/betterend/models/block/thallasium_chandelier.json new file mode 100644 index 00000000..cf862ca5 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/thallasium_chandelier.json @@ -0,0 +1,132 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/thallasium_chandelier", + "texture": "betterend:block/thallasium_chandelier" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 6, 0, 6 ], + "to": [ 10, 1, 10 ], + "faces": { + "down": { "uv": [ 0, 0, 4, 4 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 4, 4 ], "texture": "#texture" }, + "north": { "uv": [ 0, 4, 4, 5 ], "texture": "#texture" }, + "south": { "uv": [ 0, 4, 4, 5 ], "texture": "#texture" }, + "west": { "uv": [ 0, 4, 4, 5 ], "texture": "#texture" }, + "east": { "uv": [ 0, 4, 4, 5 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 2, 1, 2 ], + "to": [ 2.001, 10, 19 ], + "rotation": { "origin": [ 2, 1, 2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 7, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 7, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 14, 1, 2 ], + "to": [ 14.001, 10, 19 ], + "rotation": { "origin": [ 14, 1, 2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 7, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 7, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 2, 10, 2 ], + "to": [ 2.001, 16, 7.5 ], + "rotation": { "origin": [ 2, 10, 2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 6, 10, 2 ], + "to": [ 6.001, 16, 7.5 ], + "rotation": { "origin": [ 6, 10, 2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 10, 10, 2 ], + "to": [ 10.001, 16, 7.5 ], + "rotation": { "origin": [ 10, 10, 2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 14, 10, 2 ], + "to": [ 14.001, 16, 7.5 ], + "rotation": { "origin": [ 14, 10, 2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 2, 10, 10 ], + "to": [ 2.001, 16, 15.5 ], + "rotation": { "origin": [ 2, 10, 10 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 6, 10, 10 ], + "to": [ 6.001, 16, 15.5 ], + "rotation": { "origin": [ 6, 10, 10 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 10, 10, 10 ], + "to": [ 10.001, 16, 15.5 ], + "rotation": { "origin": [ 10, 10, 10 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 14, 10, 10 ], + "to": [ 14.001, 16, 15.5 ], + "rotation": { "origin": [ 14, 10, 10 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/thallasium_chandelier.json b/src/main/resources/assets/betterend/models/item/thallasium_chandelier.json new file mode 100644 index 00000000..7668a892 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/thallasium_chandelier.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "betterend:item/thallasium_chandelier" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/shaders/material/glow_65.frag b/src/main/resources/assets/betterend/shaders/material/glow_65.frag new file mode 100644 index 00000000..6e1480fd --- /dev/null +++ b/src/main/resources/assets/betterend/shaders/material/glow_65.frag @@ -0,0 +1,6 @@ +#include frex:shaders/api/fragment.glsl +#include frex:shaders/lib/math.glsl + +void frx_startFragment(inout frx_FragmentData fragData) { + fragData.emissivity = frx_luminance(fragData.spriteColor.rgb) > 0.65 ? 1 : 0; +} diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_chandelier.png b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier.png new file mode 100644 index 0000000000000000000000000000000000000000..f6027db7970436a4048615120a83141f00b3251c GIT binary patch literal 543 zcmV+)0^t3LP)Px$*-1n}R5*>5kv(iuQ5c4wLqu-V^4Dup7+^5yq|um=Xw$`sE;=!rxZ%*SsqLz9 zZ#tMb-E=ga(19j(mCpDVq7eeZh13gN%5NDy7okvr#AiA==gs@R-}zJ`m6dYELUTE3 zoYXmb`cSR!?28@_VHHb!eDz527ZCyApnfcXim%?qQLb3@TBq~}LxQ0I0D3rt&%2Bs z4snr#`msb@YXAb^&|FTIJZ`LFiGKeK0IOJ{X?L)SrGE?n{F-}Y#-+wdonR<{cI_(V z?>_;iYR^e0;#%X!peBxPvq{tLpzEHQl_zQRtZ}+ubJOTq%uJfcn_uq%#J{A|=ve^j zzYO4f6C)g>!?UBWl1OC*U}M{m=+@p?8Qt2Gjcr2!p1k`c&p&({zl|FtQd#+3@6fhe zw5z59%|0Bg1ZY zX4u>t>!g#hDec8=%p`7PWPN9UrgGs3BL@9G!&7@<$XtU&Dl0A1 hPx$C`m*?R5*>zlCe(0P#A^35)}v3Fd-9~@Dln0@&J7RMiK{i1c%$9Eor?3)WqMZO`&PkxOk?Ud(MB(`ExJ)8;A%Z!mVeEi2Rr@Bt@1#OizBp z7d9{I#R`@`%rx2LV*|?{O1)U2yt@aGO3LD6gZa{nNajl~m7K+IB{aspGZKJa#|5C( zAIo&2xVtzrdL0+eN3k|_hz4ALfeu2nqbS#Ec(WG@@=58i%F%HZ*I!^YPvW^`1Ev#& zb`%fSO#{H}+OkkH9&fG;fJS>D+EHt(tu;u(?AoG(5P;Ib{#t4hsb`F!gOKgw4&L(< zk Date: Thu, 21 Jan 2021 08:50:27 +0300 Subject: [PATCH 200/463] Chandelier models --- .../blockstates/thallasium_chandelier.json | 10 +- .../materials/{glow_60.json => glow_65.json} | 0 .../block/thallasium_chandelier_ceil.json | 133 ++++++++++++++++++ .../block/thallasium_chandelier_wall.json | 102 ++++++++++++++ .../block/thallasium_chandelier_ceil.png | Bin 0 -> 390 bytes .../block/thallasium_chandelier_wall.png | Bin 0 -> 376 bytes 6 files changed, 240 insertions(+), 5 deletions(-) rename src/main/resources/assets/betterend/materials/{glow_60.json => glow_65.json} (100%) create mode 100644 src/main/resources/assets/betterend/models/block/thallasium_chandelier_ceil.json create mode 100644 src/main/resources/assets/betterend/models/block/thallasium_chandelier_wall.json create mode 100644 src/main/resources/assets/betterend/textures/block/thallasium_chandelier_ceil.png create mode 100644 src/main/resources/assets/betterend/textures/block/thallasium_chandelier_wall.png diff --git a/src/main/resources/assets/betterend/blockstates/thallasium_chandelier.json b/src/main/resources/assets/betterend/blockstates/thallasium_chandelier.json index d5395443..1d3659ef 100644 --- a/src/main/resources/assets/betterend/blockstates/thallasium_chandelier.json +++ b/src/main/resources/assets/betterend/blockstates/thallasium_chandelier.json @@ -1,10 +1,10 @@ { "variants": { "facing=up": { "model": "betterend:block/thallasium_chandelier" }, - "facing=down": { "model": "betterend:block/blue_vine_fur", "x": 180 }, - "facing=north": { "model": "betterend:block/blue_vine_fur", "x": 90 }, - "facing=south": { "model": "betterend:block/blue_vine_fur", "x": 90, "y": 180 }, - "facing=east": { "model": "betterend:block/blue_vine_fur", "x": 90, "y": 90 }, - "facing=west": { "model": "betterend:block/blue_vine_fur", "x": 90, "y": 270 } + "facing=down": { "model": "betterend:block/thallasium_chandelier_ceil" }, + "facing=north": { "model": "betterend:block/thallasium_chandelier_wall", "y": 180 }, + "facing=south": { "model": "betterend:block/thallasium_chandelier_wall" }, + "facing=east": { "model": "betterend:block/thallasium_chandelier_wall", "y": 270 }, + "facing=west": { "model": "betterend:block/thallasium_chandelier_wall", "y": 90 } } } diff --git a/src/main/resources/assets/betterend/materials/glow_60.json b/src/main/resources/assets/betterend/materials/glow_65.json similarity index 100% rename from src/main/resources/assets/betterend/materials/glow_60.json rename to src/main/resources/assets/betterend/materials/glow_65.json diff --git a/src/main/resources/assets/betterend/models/block/thallasium_chandelier_ceil.json b/src/main/resources/assets/betterend/models/block/thallasium_chandelier_ceil.json new file mode 100644 index 00000000..fdd8c61b --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/thallasium_chandelier_ceil.json @@ -0,0 +1,133 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/thallasium_chandelier_ceil", + "texture": "betterend:block/thallasium_chandelier_ceil", + "rod": "betterend:block/thallasium_chandelier" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 6, 15, 6 ], + "to": [ 10, 16, 10 ], + "faces": { + "down": { "uv": [ 0, 0, 4, 4 ], "texture": "#rod" }, + "up": { "uv": [ 0, 0, 4, 4 ], "texture": "#rod" }, + "north": { "uv": [ 0, 4, 4, 5 ], "texture": "#rod" }, + "south": { "uv": [ 0, 4, 4, 5 ], "texture": "#rod" }, + "west": { "uv": [ 0, 4, 4, 5 ], "texture": "#rod" }, + "east": { "uv": [ 0, 4, 4, 5 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 2, 2, 2 ], + "to": [ 2.001, 15, 19 ], + "rotation": { "origin": [ 2, 2, 2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 13 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 14, 2, 2 ], + "to": [ 14.001, 15, 19 ], + "rotation": { "origin": [ 14, 2, 2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 13 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 2, 3, 2 ], + "to": [ 2.001, 9, 7.5 ], + "rotation": { "origin": [ 2, 3, 2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 6, 3, 2 ], + "to": [ 6.001, 9, 7.5 ], + "rotation": { "origin": [ 6, 3, 2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 14, 3, 2 ], + "to": [ 14.001, 9, 7.5 ], + "rotation": { "origin": [ 14, 3, 2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 10, 3, 2 ], + "to": [ 10.001, 9, 7.5 ], + "rotation": { "origin": [ 10, 3, 2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 2, 3, 10 ], + "to": [ 2.001, 9, 15.5 ], + "rotation": { "origin": [ 2, 3, 10 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 6, 3, 10 ], + "to": [ 6.001, 9, 15.5 ], + "rotation": { "origin": [ 6, 3, 10 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 14, 3, 10 ], + "to": [ 14.001, 9, 15.5 ], + "rotation": { "origin": [ 14, 3, 10 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 10, 3, 10 ], + "to": [ 10.001, 9, 15.5 ], + "rotation": { "origin": [ 10, 3, 10 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/thallasium_chandelier_wall.json b/src/main/resources/assets/betterend/models/block/thallasium_chandelier_wall.json new file mode 100644 index 00000000..83efb04a --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/thallasium_chandelier_wall.json @@ -0,0 +1,102 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/thallasium_chandelier_wall", + "texture": "betterend:block/thallasium_chandelier_wall" + }, + "elements": [ + { + "__comment": "PlaneZ2", + "from": [ 4, 2, 2 ], + "to": [ 12, 8, 2.001 ], + "shade": false, + "faces": { + "north": { "uv": [ 4, 8, 12, 14 ], "texture": "#texture" }, + "south": { "uv": [ 4, 8, 12, 14 ], "texture": "#texture" } + } + }, + { + "__comment": "Box3", + "from": [ 7, 3, 0 ], + "to": [ 9, 5, 3 ], + "faces": { + "down": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "up": { "uv": [ 0, 11, 2, 8 ], "texture": "#texture" }, + "north": { "uv": [ 7, 11, 9, 13 ], "texture": "#texture" }, + "south": { "uv": [ 7, 11, 9, 13 ], "texture": "#texture" }, + "west": { "uv": [ 0, 11, 2, 8 ], "texture": "#texture", "rotation": 270 }, + "east": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture", "rotation": 270 } + } + }, + { + "__comment": "Box4", + "from": [ 2, 6, 1 ], + "to": [ 4, 9, 3 ], + "faces": { + "down": { "uv": [ 0, 12, 2, 14 ], "texture": "#texture" }, + "up": { "uv": [ 0, 12, 2, 14 ], "texture": "#texture" }, + "north": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "south": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "west": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "east": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" } + } + }, + { + "__comment": "Box4", + "from": [ 12, 6, 1 ], + "to": [ 14, 9, 3 ], + "faces": { + "down": { "uv": [ 0, 12, 2, 14 ], "texture": "#texture" }, + "up": { "uv": [ 0, 12, 2, 14 ], "texture": "#texture" }, + "north": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "south": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "west": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "east": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX6", + "from": [ 1, 9, 0 ], + "to": [ 1.001, 15, 5.5 ], + "rotation": { "origin": [ 1, 9, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX6", + "from": [ 5, 9, 0 ], + "to": [ 5.001, 15, 5.5 ], + "rotation": { "origin": [ 5, 9, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX6", + "from": [ 11, 9, 0 ], + "to": [ 11.001, 15, 5.5 ], + "rotation": { "origin": [ 11, 9, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX6", + "from": [ 15, 9, 0 ], + "to": [ 15.001, 15, 5.5 ], + "rotation": { "origin": [ 15, 9, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_ceil.png b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_ceil.png new file mode 100644 index 0000000000000000000000000000000000000000..1e8745ba6d104c8c05a0451af76fba3c1530c7ed GIT binary patch literal 390 zcmV;10eSw3P)Px$KuJVFR5*?0l08eqU=)SVTWa2*i7DdHe^5}-RV9lcw3AbRKwP9-7eV5xP#he( z2`<4=oI17WA`~)p=^#W3DK06r7E+s%Nc1|01u+SdF#Y_m4;m z9OmT_i_^wZG)&q)zNREiDk&KFK2ictY%(3|-kl*Ei7bbnp@Q z;F64HMPsE}o0P>gF80^huL;~qh{4c9q1qq-j7u`OC?X|ra7hLLR;V^;F!bO~!oMqY zZ3jKeLcN@4qLLv1Ebx7Nz6SunL?uJ@a-Q`p3tihuTnl?=w*-72aqIA$06^7^$YVxY zqv{4_b2*IN5dc6^mT{-;L~0{lXjU{fc1Kv?0$w}M(?T;-G)&q(y_xS1O0_oiZ5y8R k^5e|xlxl67JNX~+1>LxPg;y?jmH+?%07*qoM6N<$f?_nIn*aa+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_wall.png b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_wall.png new file mode 100644 index 0000000000000000000000000000000000000000..87c4d7353b734c0c5227f2bc2c682ac58ca07bba GIT binary patch literal 376 zcmV-;0f+vHP)Px$GD$>1R5*>bk-bg=K@^3*AsVqDh!$GdX+mRVB?+YomKHp~mfKM(Pq4PW0S`c7 zs8DH4Hc<;33X|1BE2UT#m#|>?$+dAOtkR5$r<%;2``vTqDhwnd0Mvs!0aSVYfRqU! zZr)wl1Q5U+0FX;(Vwf3VZaT3GBS3G|)zfq7482j8B@+Okt~&RUTiu{H>H;Wb2+*6* zL{q>|Q0k=hD0ZW*u}9~Z0#K~h^j&<8YY7K-qb+_AQMU@(&EeUFe1;!tudpwE5Yh2G zmCmk7>-1Q^(GFf;-syN=f;yXwaUBakh4t;tqC&(3z1a5&}L z1+HWLc3?N!Qm)-5vbm0>24SCYIOXB`hC$d*G|y{c1b}9xr2HUaIg_PXDgAj{|F18D WzL5RU^@JG!0000 Date: Thu, 21 Jan 2021 08:54:26 +0300 Subject: [PATCH 201/463] Chandelier recipe --- src/main/java/ru/betterend/recipe/CraftingRecipes.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index d4c236fb..7bd080d5 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -189,6 +189,9 @@ public class CraftingRecipes { .build(); GridRecipe.make("fiber_string", Items.STRING).setOutputCount(6).setShape("#", "#", "#").addMaterial('#', EndItems.SILK_FIBER).build(); + + GridRecipe.make("thallasium_chandelier", EndBlocks.THALLASIUM_CHANDELIER).setShape("I#I", " # ") + .addMaterial('#', EndBlocks.THALLASIUM.ingot).addMaterial('I', EndItems.LUMECORN_ROD).build(); } private static void registerLantern(String name, Block lantern, Block slab) { From 25700fa00ad8bde709ba968cab4a0b3c8b147ba2 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 21 Jan 2021 09:12:11 +0300 Subject: [PATCH 202/463] Bonemeal plant grow fix --- .../java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java | 4 ++-- src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java b/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java index cc649f49..2d370940 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java @@ -51,13 +51,13 @@ public abstract class EndPlantWithAgeBlock extends EndPlantBlock { @Override public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { - return random.nextInt(8) == 0; + return true; } @Override public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { super.scheduledTick(state, world, pos, random); - if (canGrow(world, random, pos, state)) { + if (random.nextInt(8) == 0) { grow(world, random, pos, state); } } diff --git a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java index b934845d..46aaa669 100644 --- a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java @@ -23,12 +23,12 @@ import ru.betterend.blocks.basis.EndFenceBlock; import ru.betterend.blocks.basis.EndGateBlock; import ru.betterend.blocks.basis.EndLadderBlock; import ru.betterend.blocks.basis.EndPillarBlock; -import ru.betterend.blocks.basis.EndWoodenPlateBlock; import ru.betterend.blocks.basis.EndSignBlock; import ru.betterend.blocks.basis.EndSlabBlock; import ru.betterend.blocks.basis.EndStairsBlock; import ru.betterend.blocks.basis.EndTrapdoorBlock; import ru.betterend.blocks.basis.EndWoodenButtonBlock; +import ru.betterend.blocks.basis.EndWoodenPlateBlock; import ru.betterend.blocks.basis.StrippableBarkBlock; import ru.betterend.recipe.builders.GridRecipe; import ru.betterend.registry.EndBlocks; From 80d2b27a1d68e2074bc913d838a2e5f0a193ea1c Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 21 Jan 2021 10:54:09 +0300 Subject: [PATCH 203/463] Sign support fix --- .../betterend/blocks/basis/EndSignBlock.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java b/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java index 1b54a3c3..0a7c8d6b 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java @@ -8,6 +8,7 @@ import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.AbstractSignBlock; import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.block.ShapeContext; import net.minecraft.block.entity.BlockEntity; import net.minecraft.entity.LivingEntity; @@ -43,6 +44,7 @@ import net.minecraft.world.WorldView; import ru.betterend.blocks.entities.ESignBlockEntity; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; +import ru.betterend.util.BlocksHelper; public class EndSignBlock extends AbstractSignBlock implements BlockPatterned { public static final IntProperty ROTATION = Properties.ROTATION; @@ -113,14 +115,26 @@ public class EndSignBlock extends AbstractSignBlock implements BlockPatterned { } @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, - WorldAccess world, BlockPos pos, BlockPos neighborPos) { + public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { if ((Boolean) state.get(WATERLOGGED)) { world.getFluidTickScheduler().schedule(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); } - + if (!canPlaceAt(state, world, pos)) { + return state.get(WATERLOGGED) ? state.getFluidState().getBlockState() : Blocks.AIR.getDefaultState(); + } return super.getStateForNeighborUpdate(state, facing, neighborState, world, pos, neighborPos); } + + @Override + public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + if (!state.get(FLOOR)) { + int index = (((state.get(ROTATION) >> 2) + 2)) & 3; + return world.getBlockState(pos.offset(BlocksHelper.HORIZONTAL[index])).getMaterial().isSolid(); + } + else { + return world.getBlockState(pos.down()).getMaterial().isSolid(); + } + } @Override public BlockState getPlacementState(ItemPlacementContext ctx) { From 076094d5b77e8ccdc84b62f0144eaedcb2b372d4 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 21 Jan 2021 11:05:02 +0300 Subject: [PATCH 204/463] Biome-relative bonemeal grasses --- .../mixin/common/BoneMealItemMixin.java | 2 +- .../java/ru/betterend/util/BonemealUtil.java | 42 ++++++++++++++++++- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java index 78618504..1eff0099 100644 --- a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java +++ b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java @@ -128,7 +128,7 @@ public class BoneMealItemMixin { private BlockState beGetGrassState(World world, BlockPos pos) { BlockState state = world.getBlockState(pos); Block block = state.getBlock(); - block = BonemealUtil.getGrass(block, world.getRandom()); + block = BonemealUtil.getGrass(EndBiomes.getBiomeID(world.getBiome(pos)), block, world.getRandom()); return block == null ? null : block.getDefaultState(); } diff --git a/src/main/java/ru/betterend/util/BonemealUtil.java b/src/main/java/ru/betterend/util/BonemealUtil.java index c604aaa4..ab433e6c 100644 --- a/src/main/java/ru/betterend/util/BonemealUtil.java +++ b/src/main/java/ru/betterend/util/BonemealUtil.java @@ -8,9 +8,13 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import net.minecraft.block.Block; +import net.minecraft.util.Identifier; +import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndBlocks; +import ru.betterend.world.biome.EndBiome; public class BonemealUtil { + private static final Map> GRASS_BIOMES = Maps.newHashMap(); private static final Map GRASS_TYPES = Maps.newHashMap(); public static void init() { @@ -29,6 +33,15 @@ public class BonemealUtil { addBonemealGrass(EndBlocks.JUNGLE_MOSS, EndBlocks.JUNGLE_GRASS); addBonemealGrass(EndBlocks.JUNGLE_MOSS, EndBlocks.TWISTED_UMBRELLA_MOSS); addBonemealGrass(EndBlocks.JUNGLE_MOSS, EndBlocks.SMALL_JELLYSHROOM, 0.1F); + + addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.BLOOMING_COOKSONIA); + addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.VAIOLUSH_FERN); + addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.FRACTURN); + addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.SALTEAGO); + + addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.CREEPING_MOSS, 0.1F); + addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.UMBRELLA_MOSS, 0.1F); + addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.TWISTED_UMBRELLA_MOSS, 0.1F); } public static void addBonemealGrass(Block terrain, Block plant) { @@ -44,8 +57,33 @@ public class BonemealUtil { list.addGrass(plant, chance); } - public static Block getGrass(Block terrain, Random random) { - GrassList list = GRASS_TYPES.get(terrain); + public static void addBonemealGrass(EndBiome biome, Block terrain, Block plant) { + addBonemealGrass(biome, terrain, plant, 1F); + } + + public static void addBonemealGrass(EndBiome biome, Block terrain, Block plant, float chance) { + Map map = GRASS_BIOMES.get(biome.getID()); + if (map == null) { + map = Maps.newHashMap(); + GRASS_BIOMES.put(biome.getID(), map); + } + GrassList list = map.get(terrain); + if (list == null) { + list = new GrassList(); + map.put(terrain, list); + } + list.addGrass(plant, chance); + } + + public static Block getGrass(Identifier biomeID, Block terrain, Random random) { + Map map = GRASS_BIOMES.get(biomeID); + GrassList list = null; + if (map != null) { + list = map.get(terrain); + } + else { + list = GRASS_TYPES.get(terrain); + } return list == null ? null : list.getGrass(random); } From f20c23d7f48534dce3030f6fbfa02ff90cb8cc56 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 21 Jan 2021 11:23:24 +0300 Subject: [PATCH 205/463] Light values update --- src/main/java/ru/betterend/blocks/BlockProperties.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/BlockProperties.java b/src/main/java/ru/betterend/blocks/BlockProperties.java index 14933431..39ee9d5c 100644 --- a/src/main/java/ru/betterend/blocks/BlockProperties.java +++ b/src/main/java/ru/betterend/blocks/BlockProperties.java @@ -121,10 +121,10 @@ public class BlockProperties { } public static enum LumecornShape implements StringIdentifiable { - LIGHT_TOP("light_top", 10), - LIGHT_TOP_MIDDLE("light_top_middle", 13), + LIGHT_TOP("light_top", 15), + LIGHT_TOP_MIDDLE("light_top_middle", 15), LIGHT_MIDDLE("light_middle", 15), - LIGHT_BOTTOM("light_bottom", 10), + LIGHT_BOTTOM("light_bottom", 15), MIDDLE("middle", 0), BOTTOM_BIG("bottom_big", 0), BOTTOM_SMALL("bottom_small", 0); From c7823886418f10344e6bc6423708f91f1768ea9b Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 21 Jan 2021 13:16:07 +0300 Subject: [PATCH 206/463] Optifine grass overlay & emissive textures --- .../textures/block/blooming_cooksonia_e.png | Bin 0 -> 1885 bytes .../textures/block/creeping_moss_spores_e.png | Bin 0 -> 1609 bytes .../textures/block/dense_vine_bottom_e.png | Bin 0 -> 1564 bytes .../textures/block/end_lily_flower_e.png | Bin 0 -> 396 bytes .../textures/block/end_lily_flower_small_e.png | Bin 0 -> 330 bytes .../textures/block/end_lotus_center_2_e.png | Bin 0 -> 1609 bytes .../textures/block/end_lotus_center_e.png | Bin 0 -> 1617 bytes .../textures/block/end_lotus_petal_2_e.png | Bin 0 -> 339 bytes .../textures/block/end_lotus_petal_e.png | Bin 0 -> 351 bytes .../betterend/textures/block/fracturn_e.png | Bin 0 -> 1881 bytes .../betterend/textures/block/lumecorn_0_e.png | Bin 0 -> 1414 bytes .../betterend/textures/block/lumecorn_1_e.png | Bin 0 -> 1414 bytes .../betterend/textures/block/lumecorn_2_e.png | Bin 0 -> 1451 bytes .../betterend/textures/block/lumecorn_3_e.png | Bin 0 -> 1471 bytes .../textures/block/lumecorn_light_bottom_e.png | Bin 0 -> 385 bytes .../textures/block/lumecorn_light_middle_e.png | Bin 0 -> 1102 bytes .../textures/block/lumecorn_light_top_e.png | Bin 0 -> 1484 bytes .../block/lumecorn_light_top_middle_e.png | Bin 0 -> 348 bytes .../textures/block/thallasium_chandelier_e.png | Bin 0 -> 1452 bytes .../block/thallasium_chandelier_wall_e.png | Bin 0 -> 1467 bytes .../block/twisted_umbrella_moss_sporophyte_e.png | Bin 0 -> 1519 bytes .../block/umbrella_moss_sporophyte_e.png | Bin 0 -> 1551 bytes .../optifine/ctm/_overlays/amber_moss/0.png | Bin 0 -> 993 bytes .../optifine/ctm/_overlays/amber_moss/1.png | Bin 0 -> 1076 bytes .../optifine/ctm/_overlays/amber_moss/10.png | Bin 0 -> 1182 bytes .../optifine/ctm/_overlays/amber_moss/11.png | Bin 0 -> 1150 bytes .../optifine/ctm/_overlays/amber_moss/12.png | Bin 0 -> 1216 bytes .../optifine/ctm/_overlays/amber_moss/13.png | Bin 0 -> 1227 bytes .../optifine/ctm/_overlays/amber_moss/14.png | Bin 0 -> 1008 bytes .../optifine/ctm/_overlays/amber_moss/15.png | Bin 0 -> 1084 bytes .../optifine/ctm/_overlays/amber_moss/16.png | Bin 0 -> 1007 bytes .../optifine/ctm/_overlays/amber_moss/2.png | Bin 0 -> 1011 bytes .../optifine/ctm/_overlays/amber_moss/3.png | Bin 0 -> 1163 bytes .../optifine/ctm/_overlays/amber_moss/4.png | Bin 0 -> 1155 bytes .../optifine/ctm/_overlays/amber_moss/5.png | Bin 0 -> 1227 bytes .../optifine/ctm/_overlays/amber_moss/6.png | Bin 0 -> 1210 bytes .../optifine/ctm/_overlays/amber_moss/7.png | Bin 0 -> 1115 bytes .../optifine/ctm/_overlays/amber_moss/8.png | Bin 0 -> 1245 bytes .../optifine/ctm/_overlays/amber_moss/9.png | Bin 0 -> 1103 bytes .../_overlays/amber_moss/amber_moss.properties | 7 +++++++ .../optifine/ctm/_overlays/cave_moss/0.png | Bin 0 -> 1038 bytes .../optifine/ctm/_overlays/cave_moss/1.png | Bin 0 -> 1201 bytes .../optifine/ctm/_overlays/cave_moss/10.png | Bin 0 -> 1390 bytes .../optifine/ctm/_overlays/cave_moss/11.png | Bin 0 -> 1375 bytes .../optifine/ctm/_overlays/cave_moss/12.png | Bin 0 -> 1512 bytes .../optifine/ctm/_overlays/cave_moss/13.png | Bin 0 -> 1526 bytes .../optifine/ctm/_overlays/cave_moss/14.png | Bin 0 -> 1037 bytes .../optifine/ctm/_overlays/cave_moss/15.png | Bin 0 -> 1204 bytes .../optifine/ctm/_overlays/cave_moss/16.png | Bin 0 -> 1042 bytes .../optifine/ctm/_overlays/cave_moss/2.png | Bin 0 -> 1038 bytes .../optifine/ctm/_overlays/cave_moss/3.png | Bin 0 -> 1365 bytes .../optifine/ctm/_overlays/cave_moss/4.png | Bin 0 -> 1365 bytes .../optifine/ctm/_overlays/cave_moss/5.png | Bin 0 -> 1510 bytes .../optifine/ctm/_overlays/cave_moss/6.png | Bin 0 -> 1506 bytes .../optifine/ctm/_overlays/cave_moss/7.png | Bin 0 -> 1223 bytes .../optifine/ctm/_overlays/cave_moss/8.png | Bin 0 -> 1584 bytes .../optifine/ctm/_overlays/cave_moss/9.png | Bin 0 -> 1235 bytes .../ctm/_overlays/cave_moss/cave_moss.properties | 7 +++++++ .../optifine/ctm/_overlays/chorus_nylium/0.png | Bin 0 -> 987 bytes .../optifine/ctm/_overlays/chorus_nylium/1.png | Bin 0 -> 1048 bytes .../optifine/ctm/_overlays/chorus_nylium/10.png | Bin 0 -> 1171 bytes .../optifine/ctm/_overlays/chorus_nylium/11.png | Bin 0 -> 1158 bytes .../optifine/ctm/_overlays/chorus_nylium/12.png | Bin 0 -> 1228 bytes .../optifine/ctm/_overlays/chorus_nylium/13.png | Bin 0 -> 1227 bytes .../optifine/ctm/_overlays/chorus_nylium/14.png | Bin 0 -> 989 bytes .../optifine/ctm/_overlays/chorus_nylium/15.png | Bin 0 -> 1065 bytes .../optifine/ctm/_overlays/chorus_nylium/16.png | Bin 0 -> 988 bytes .../optifine/ctm/_overlays/chorus_nylium/2.png | Bin 0 -> 999 bytes .../optifine/ctm/_overlays/chorus_nylium/3.png | Bin 0 -> 1156 bytes .../optifine/ctm/_overlays/chorus_nylium/4.png | Bin 0 -> 1164 bytes .../optifine/ctm/_overlays/chorus_nylium/5.png | Bin 0 -> 1234 bytes .../optifine/ctm/_overlays/chorus_nylium/6.png | Bin 0 -> 1201 bytes .../optifine/ctm/_overlays/chorus_nylium/7.png | Bin 0 -> 1086 bytes .../optifine/ctm/_overlays/chorus_nylium/8.png | Bin 0 -> 1250 bytes .../optifine/ctm/_overlays/chorus_nylium/9.png | Bin 0 -> 1130 bytes .../chorus_nylium/chorus_nylium.properties | 7 +++++++ .../optifine/ctm/_overlays/crystal_moss/0.png | Bin 0 -> 1004 bytes .../optifine/ctm/_overlays/crystal_moss/1.png | Bin 0 -> 1178 bytes .../optifine/ctm/_overlays/crystal_moss/10.png | Bin 0 -> 1363 bytes .../optifine/ctm/_overlays/crystal_moss/11.png | Bin 0 -> 1376 bytes .../optifine/ctm/_overlays/crystal_moss/12.png | Bin 0 -> 1492 bytes .../optifine/ctm/_overlays/crystal_moss/13.png | Bin 0 -> 1482 bytes .../optifine/ctm/_overlays/crystal_moss/14.png | Bin 0 -> 1010 bytes .../optifine/ctm/_overlays/crystal_moss/15.png | Bin 0 -> 1205 bytes .../optifine/ctm/_overlays/crystal_moss/16.png | Bin 0 -> 1012 bytes .../optifine/ctm/_overlays/crystal_moss/2.png | Bin 0 -> 1007 bytes .../optifine/ctm/_overlays/crystal_moss/3.png | Bin 0 -> 1356 bytes .../optifine/ctm/_overlays/crystal_moss/4.png | Bin 0 -> 1338 bytes .../optifine/ctm/_overlays/crystal_moss/5.png | Bin 0 -> 1496 bytes .../optifine/ctm/_overlays/crystal_moss/6.png | Bin 0 -> 1494 bytes .../optifine/ctm/_overlays/crystal_moss/7.png | Bin 0 -> 1211 bytes .../optifine/ctm/_overlays/crystal_moss/8.png | Bin 0 -> 1552 bytes .../optifine/ctm/_overlays/crystal_moss/9.png | Bin 0 -> 1216 bytes .../crystal_moss/crystal_moss.properties | 7 +++++++ .../optifine/ctm/_overlays/end_moss/0.png | Bin 0 -> 1099 bytes .../optifine/ctm/_overlays/end_moss/1.png | Bin 0 -> 1245 bytes .../optifine/ctm/_overlays/end_moss/10.png | Bin 0 -> 1447 bytes .../optifine/ctm/_overlays/end_moss/11.png | Bin 0 -> 1429 bytes .../optifine/ctm/_overlays/end_moss/12.png | Bin 0 -> 1581 bytes .../optifine/ctm/_overlays/end_moss/13.png | Bin 0 -> 1584 bytes .../optifine/ctm/_overlays/end_moss/14.png | Bin 0 -> 1100 bytes .../optifine/ctm/_overlays/end_moss/15.png | Bin 0 -> 1236 bytes .../optifine/ctm/_overlays/end_moss/16.png | Bin 0 -> 1102 bytes .../optifine/ctm/_overlays/end_moss/2.png | Bin 0 -> 1104 bytes .../optifine/ctm/_overlays/end_moss/3.png | Bin 0 -> 1399 bytes .../optifine/ctm/_overlays/end_moss/4.png | Bin 0 -> 1430 bytes .../optifine/ctm/_overlays/end_moss/5.png | Bin 0 -> 1570 bytes .../optifine/ctm/_overlays/end_moss/6.png | Bin 0 -> 1579 bytes .../optifine/ctm/_overlays/end_moss/7.png | Bin 0 -> 1262 bytes .../optifine/ctm/_overlays/end_moss/8.png | Bin 0 -> 1648 bytes .../optifine/ctm/_overlays/end_moss/9.png | Bin 0 -> 1275 bytes .../ctm/_overlays/end_moss/end_moss.properties | 7 +++++++ .../optifine/ctm/_overlays/end_mycelium/0.png | Bin 0 -> 998 bytes .../optifine/ctm/_overlays/end_mycelium/1.png | Bin 0 -> 1148 bytes .../optifine/ctm/_overlays/end_mycelium/10.png | Bin 0 -> 1296 bytes .../optifine/ctm/_overlays/end_mycelium/11.png | Bin 0 -> 1312 bytes .../optifine/ctm/_overlays/end_mycelium/12.png | Bin 0 -> 1434 bytes .../optifine/ctm/_overlays/end_mycelium/13.png | Bin 0 -> 1431 bytes .../optifine/ctm/_overlays/end_mycelium/14.png | Bin 0 -> 1002 bytes .../optifine/ctm/_overlays/end_mycelium/15.png | Bin 0 -> 1137 bytes .../optifine/ctm/_overlays/end_mycelium/16.png | Bin 0 -> 999 bytes .../optifine/ctm/_overlays/end_mycelium/2.png | Bin 0 -> 998 bytes .../optifine/ctm/_overlays/end_mycelium/3.png | Bin 0 -> 1284 bytes .../optifine/ctm/_overlays/end_mycelium/4.png | Bin 0 -> 1319 bytes .../optifine/ctm/_overlays/end_mycelium/5.png | Bin 0 -> 1447 bytes .../optifine/ctm/_overlays/end_mycelium/6.png | Bin 0 -> 1448 bytes .../optifine/ctm/_overlays/end_mycelium/7.png | Bin 0 -> 1148 bytes .../optifine/ctm/_overlays/end_mycelium/8.png | Bin 0 -> 1507 bytes .../optifine/ctm/_overlays/end_mycelium/9.png | Bin 0 -> 1184 bytes .../end_mycelium/end_mycelium.properties | 7 +++++++ .../optifine/ctm/_overlays/jungle_moss/0.png | Bin 0 -> 1068 bytes .../optifine/ctm/_overlays/jungle_moss/1.png | Bin 0 -> 1118 bytes .../optifine/ctm/_overlays/jungle_moss/10.png | Bin 0 -> 1206 bytes .../optifine/ctm/_overlays/jungle_moss/11.png | Bin 0 -> 1215 bytes .../optifine/ctm/_overlays/jungle_moss/12.png | Bin 0 -> 1246 bytes .../optifine/ctm/_overlays/jungle_moss/13.png | Bin 0 -> 1241 bytes .../optifine/ctm/_overlays/jungle_moss/14.png | Bin 0 -> 1075 bytes .../optifine/ctm/_overlays/jungle_moss/15.png | Bin 0 -> 1131 bytes .../optifine/ctm/_overlays/jungle_moss/16.png | Bin 0 -> 1067 bytes .../optifine/ctm/_overlays/jungle_moss/2.png | Bin 0 -> 1073 bytes .../optifine/ctm/_overlays/jungle_moss/3.png | Bin 0 -> 1194 bytes .../optifine/ctm/_overlays/jungle_moss/4.png | Bin 0 -> 1218 bytes .../optifine/ctm/_overlays/jungle_moss/5.png | Bin 0 -> 1253 bytes .../optifine/ctm/_overlays/jungle_moss/6.png | Bin 0 -> 1257 bytes .../optifine/ctm/_overlays/jungle_moss/7.png | Bin 0 -> 1161 bytes .../optifine/ctm/_overlays/jungle_moss/8.png | Bin 0 -> 1259 bytes .../optifine/ctm/_overlays/jungle_moss/9.png | Bin 0 -> 1180 bytes .../_overlays/jungle_moss/jungle_moss.properties | 7 +++++++ .../optifine/ctm/_overlays/pink_moss/0.png | Bin 0 -> 1027 bytes .../optifine/ctm/_overlays/pink_moss/1.png | Bin 0 -> 1178 bytes .../optifine/ctm/_overlays/pink_moss/10.png | Bin 0 -> 1315 bytes .../optifine/ctm/_overlays/pink_moss/11.png | Bin 0 -> 1352 bytes .../optifine/ctm/_overlays/pink_moss/12.png | Bin 0 -> 1473 bytes .../optifine/ctm/_overlays/pink_moss/13.png | Bin 0 -> 1479 bytes .../optifine/ctm/_overlays/pink_moss/14.png | Bin 0 -> 1035 bytes .../optifine/ctm/_overlays/pink_moss/15.png | Bin 0 -> 1161 bytes .../optifine/ctm/_overlays/pink_moss/16.png | Bin 0 -> 1029 bytes .../optifine/ctm/_overlays/pink_moss/2.png | Bin 0 -> 1034 bytes .../optifine/ctm/_overlays/pink_moss/3.png | Bin 0 -> 1331 bytes .../optifine/ctm/_overlays/pink_moss/4.png | Bin 0 -> 1330 bytes .../optifine/ctm/_overlays/pink_moss/5.png | Bin 0 -> 1459 bytes .../optifine/ctm/_overlays/pink_moss/6.png | Bin 0 -> 1466 bytes .../optifine/ctm/_overlays/pink_moss/7.png | Bin 0 -> 1209 bytes .../optifine/ctm/_overlays/pink_moss/8.png | Bin 0 -> 1544 bytes .../optifine/ctm/_overlays/pink_moss/9.png | Bin 0 -> 1222 bytes .../ctm/_overlays/pink_moss/pink_moss.properties | 7 +++++++ .../optifine/ctm/_overlays/shadow_grass/0.png | Bin 0 -> 1001 bytes .../optifine/ctm/_overlays/shadow_grass/1.png | Bin 0 -> 1093 bytes .../optifine/ctm/_overlays/shadow_grass/10.png | Bin 0 -> 1196 bytes .../optifine/ctm/_overlays/shadow_grass/11.png | Bin 0 -> 1214 bytes .../optifine/ctm/_overlays/shadow_grass/12.png | Bin 0 -> 1276 bytes .../optifine/ctm/_overlays/shadow_grass/13.png | Bin 0 -> 1293 bytes .../optifine/ctm/_overlays/shadow_grass/14.png | Bin 0 -> 999 bytes .../optifine/ctm/_overlays/shadow_grass/15.png | Bin 0 -> 1094 bytes .../optifine/ctm/_overlays/shadow_grass/16.png | Bin 0 -> 996 bytes .../optifine/ctm/_overlays/shadow_grass/2.png | Bin 0 -> 1001 bytes .../optifine/ctm/_overlays/shadow_grass/3.png | Bin 0 -> 1204 bytes .../optifine/ctm/_overlays/shadow_grass/4.png | Bin 0 -> 1207 bytes .../optifine/ctm/_overlays/shadow_grass/5.png | Bin 0 -> 1288 bytes .../optifine/ctm/_overlays/shadow_grass/6.png | Bin 0 -> 1284 bytes .../optifine/ctm/_overlays/shadow_grass/7.png | Bin 0 -> 1111 bytes .../optifine/ctm/_overlays/shadow_grass/8.png | Bin 0 -> 1324 bytes .../optifine/ctm/_overlays/shadow_grass/9.png | Bin 0 -> 1129 bytes .../shadow_grass/shadow_grass.properties | 7 +++++++ .../assets/minecraft/optifine/ctm/desktop.ini | 3 +++ .../minecraft/optifine/emissive.properties | 1 + 186 files changed, 67 insertions(+) create mode 100644 src/main/resources/assets/betterend/textures/block/blooming_cooksonia_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/creeping_moss_spores_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/dense_vine_bottom_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/end_lily_flower_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/end_lily_flower_small_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/end_lotus_center_2_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/end_lotus_center_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/end_lotus_petal_2_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/end_lotus_petal_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/fracturn_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_0_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_1_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_2_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_3_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_light_bottom_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_light_middle_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_light_top_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/lumecorn_light_top_middle_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/thallasium_chandelier_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/thallasium_chandelier_wall_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_sporophyte_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/umbrella_moss_sporophyte_e.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/0.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/1.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/10.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/11.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/12.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/13.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/14.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/15.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/16.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/2.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/3.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/4.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/5.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/6.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/7.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/8.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/9.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/amber_moss.properties create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/0.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/1.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/10.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/11.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/12.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/13.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/14.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/15.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/16.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/2.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/3.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/4.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/5.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/6.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/7.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/8.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/9.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/cave_moss.properties create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/0.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/1.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/10.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/11.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/12.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/13.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/14.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/15.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/16.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/2.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/3.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/4.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/5.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/6.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/7.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/8.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/9.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/chorus_nylium.properties create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/0.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/1.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/10.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/11.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/12.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/13.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/14.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/15.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/16.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/2.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/3.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/4.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/5.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/6.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/7.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/8.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/9.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/crystal_moss.properties create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/0.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/1.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/10.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/11.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/12.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/13.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/14.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/15.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/16.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/2.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/3.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/4.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/5.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/6.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/7.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/8.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/9.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/end_moss.properties create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/0.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/1.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/10.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/11.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/12.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/13.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/14.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/15.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/16.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/2.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/3.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/4.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/5.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/6.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/7.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/8.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/9.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/end_mycelium.properties create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/0.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/1.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/10.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/11.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/12.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/13.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/14.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/15.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/16.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/2.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/3.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/4.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/5.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/6.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/7.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/8.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/9.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/jungle_moss.properties create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/0.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/1.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/10.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/11.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/12.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/13.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/14.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/15.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/16.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/2.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/3.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/4.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/5.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/6.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/7.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/8.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/9.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/pink_moss.properties create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/0.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/1.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/10.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/11.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/12.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/13.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/14.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/15.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/16.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/2.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/3.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/4.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/5.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/6.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/7.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/8.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/9.png create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/shadow_grass.properties create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/desktop.ini create mode 100644 src/main/resources/assets/minecraft/optifine/emissive.properties diff --git a/src/main/resources/assets/betterend/textures/block/blooming_cooksonia_e.png b/src/main/resources/assets/betterend/textures/block/blooming_cooksonia_e.png new file mode 100644 index 0000000000000000000000000000000000000000..12c6be07b1b93f8fad0b178d40ab43e21cf45022 GIT binary patch literal 1885 zcmb_dU5MO798Wo}wAUU8zUaLeQk51vn@qklG#=;f)mw1S<8HCnC!NepcEfElG0EQU zod~5*7DUuXDU^HalZS5#f`a-W2;!rUS}2GwrHD_8>tw&Yo>zMm14$;6-~9f+|HsV# z#@g!3^K%Pxk|fR7S8D6x{X}`6Iw_vd{5HVibvj+SnoH7|C(HYU^wG_yBhBhh(tCuQn7%Xv2=YjFpT80% zl=t!r2iC9}E|{GoF9`f9Lw@}eXq>~>3<}DWIg9$ z(Zd;AYKhn#r@qvO>Cf@@qtu6nrw1YMC=CF_rUtMcIKVWS2{AJ?TQ?`(AEh4JNOvdo z_?YU)!69v&w3s+SRps&hIbL;+gdXze-}~!-^+zqw&QYnUhpTY-@4z`L(m9+Ghj%%g zb`9|{?K> zJ$-F|@7KG33~s;vMfl^#w=ds3@tOI<_h-JH`{cs&zs%CvZ_ur0)w7kE_rHGUqIjI@ pNc-m%v~c5e_rr}lKfO0gC24Qr*3a|2?vxF%zPwu7f9Z|ue*+U=RkHv9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/creeping_moss_spores_e.png b/src/main/resources/assets/betterend/textures/block/creeping_moss_spores_e.png new file mode 100644 index 0000000000000000000000000000000000000000..5a1f89382294eb2936f63be97f856a5cefe1f711 GIT binary patch literal 1609 zcmbVMTWB0r7@l@xX_KuM^AZ*7Fr`>Avvb+|X{Kr1P2B}INz)BoHBB=+b9Q%{ojKE) z+3apwO|gYi>O&Q@r35NINTA|_U@5k+P}^EjfdaEgLvNLjP>jA|C!sih^GyD>}8W6+S;A5hB!ObK@css zm1N3FC0+s&Qaz%K($G^(=e-O0=00dLXnCrP<#CeHlasgPKiwz zaL+_vQkoc(!ZOvpgX}5+OrSzbBui>uGeJq9s=NTNonwX~s}O5Upn4pEWGXR0MvwtX zzb8OToR24iVGkEz!@RGP}cqdRf%hCbE z6pKYq(d$7*mf^zTFvIc;&(jz|n`O-sOSEQgX)r{gDH)1xDM%w7Mlp>FmOx=mYbL0A zlU6h9Zo&>@N}|qi9@a6b3Y4WLPA?ews&H9iU>>SavrLTTnpi!DEM(@;1E`zV_XxnQ zO(dE!?yHNcHbt0L?>IK2?vVSU&16}J%pf#T!H{6@I979uV~q|X1{5u1BoWFt0yWT3 znT$l7z=X(cdlgMaMf174-oU76L4o2~p2H!dc`nIuz!v~4_dM$bEL(#nkgR0N4}g04 zd!RULWYH4;6)a02gA7%~HY=)_g^aFcDYEHF5J7olV8K{BZ&iy#0>m}b5;Y0NqXLD^ z_9%)Bpf4l^Whm2$=g^`h7V57t+Cg{&q55G5zU1xj)v3uUT)tUR;_YP7{1#H9Za?i$QQ z8LKE7uqTVX^L` z3zOWf4-ZAA+TPq@%cH}Kj}Og$b=-X*I5O%#^2oj)zW;T_ZMf%mK6?Bl{p$4f^-`Mv z@7R53*UV&zYiqfS*Oz=}-mR>xbblP0NlkyU{pir}BHe!Un``@R?#j+3+O>Pbl{=sH zulwL9X18m0=@;AX48DHz+quIxS~l-$T|Tw;i60;PeCvMuP`>g=4NT0zzDB+4}YwV?umswyM8hbEa5DQKQSIykKix13? z7xnoWT{YN|Jz#eeQUVM62sEvl?ZKwTws;|3hsOd7S`dFmW7DBPFjbfU8RB9P=M$VR z#bl6Fc_|^Pa_kWxi&9b$lY*phq6EbRR8-LUSSrmm%5XBfuOo}@G`8yd4itn&qro>6 zp12i3QdLzDWkHrXir~CC+eb~#_J+C)S?uYq>G&qGLCAGq!!T7dpM`=)>^_1UBESLVcYj8R_bA$D)EU|C4WQRyS`2Ub#0;0ld+*L zmemvC`J=PcjE+M#M0>?K2Md$fBXw8Dqq9`aq0kx!W?YPX;uZ<1bptigRT*S5VPH~V z_@HSUq~Sey%^RFWKGs-SlqDK6PL_(21miI%OAm_*6vZ~QKn$}yw;?nRW8!sCnl%RU z(Z7NX9hQk}A!@T}p$ZlpyTXE=Ct-%vh)V@i?Ua@lg#ygmo{wxD=d&71&E`$hfHF!Y z%932-k|j09sY23$i?Xj z_11sMD1quPgw@zKMfj_gt-EU~w+pB3AYAtP5Z&}T8MbNra%rF1Id<#>?Q!Sw*>o|r zre6tykj4HBD42sfpGluwO@Wb zE4(oC%IWXweM27}S^wa-ZAX6(4z2I_^u=42qp2SjSEgS*uPzKeA6$88fB#FT7Nd8q ze-ur9yCfftECml-h=8-t*jLBiN%P{o X_p(n9-e0>E_V4`Yc=qJpC!hNhZ`J~P literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/end_lily_flower_e.png b/src/main/resources/assets/betterend/textures/block/end_lily_flower_e.png new file mode 100644 index 0000000000000000000000000000000000000000..2dc6da0d5db519e303aee3171ac7b0f18e5e047d GIT binary patch literal 396 zcmV;70dxL|P)!5e^^r7&3Bfpb5#%+BH#UeA|E(FXUkYjB^gz?rAbI9v0? zYAS~%<_E|@Igbljs99ziD__lWQH!;)v9cY(H}DC>YRBKKGyV+P ziijYV;}2$YHRHrpF<@ulgiG!@--U!g2!U6GHvp_Na~!`zh}wgTYd|6&_-(9 zj{)g1zcR5|AIs`aEWX4IAnE-)e}zNtAP6v$0IKy~BH;G{b!o1vi8PtQO)07&m)?H} zXjIOorZPKP9rYdp$eb<4#t0CFsppsgvXyhdQGip}1VB0&%POEtozY!9{R@{sO-T#u c05y}=f<_^NLNFRM=|iKf@uBg-06rLvCYXrTq**bIu_SnAFB35J#w2IX z?K|Ip|9AEEKD5fW-bWC`s$?SGkLMO=cvj;7-4`!Qc=8&FCoF=vaji41BMwfkBZw6j z)zqLpC_VyYr1>QUWuU*L85m6votsOBBo9NI%)p$gN2!IWX^K>pD77spvZ4`#c{MR+ z!hx~glsq;pM-*yv7ui_?m_UQJM3%IIZh=yis`3K7c8(c}tU~PJDAnx7X?2ua|{=WL>QK5c%H@x+A8a|RHAjOwZRaFmTanqtstRD~-t0}D`tx@}=B=VFaKvXPZXe?#qFUnKy$ zRuo+s%j%+Ot_aKS8O3JQ9kMLiN|g=B^g|1cm@@1c#cH-X))*jWLdiyE3ZX(HP<;)R z$ym$@Ob5APo2o0QXl=aW4U9`Rj8Z(yb2wx)&!spH1Op(@v56G`%hsSGQq*jDS!fUl z>{U>lHHu_Q{|Z)QkVU2@VVhM=%0b4^a}?=%62wpenOHE^PN-@jiXf?5wxr828IMxf zY`>~1Adn4b1vwzmvVeaP7!c@8B#@;8VI><5@jNfUOyhkV$s`TkK;#l
    4Mk{aC$b57cOjd5B5>A>1{X zg|c>0GGTWPd+Wbs6od6=oNBC@!u-|B>fIHU+koSC;4Ixfgg0&{gF0?sChk+c&5J|0 z$6ZRsyHg!=M+QFeeabeAQ@eN1jFV%xZ2xTH@v}q2_y<-}rgv%!h|7cPwprdte2z`X%4Jhra!y z;(aXHl-m14`e@hL1LuzY>bYy~kJdH)YhLiSw`ZE3BCmh1X)E>Y2j9HdHpzEZzI=BF z8*lr3X4fmTZR~5_%*y0+sAXbOiy5b9=Swdi*f6?j?G2t=i7j`ICl4;NkvVOZA?WZiH+;cHu_B0$iUUzp^mlo&Nqz0$cfZ%? z_xZlRlZozK>l<1c2!dE2i-vpfywMuXFe9r0YUPauij<`QwbvbI;#vr1<>;sm zdq=yI;^?5rOH}*aq`v?#fdWl|EGRkE0EGZmX!+HweJ4 zjmN7pR@FsOsv-C^zjMdy`S)+lF4h0kGNrZBhKqV?F zlcA6m7$3P~udGTaZ?s%VM@?AlH~Nrs!%uJ zTsJ^*)<}XW{3}=zK^p0bfNho)Ap>bm%}`|3lOTk0NXLS)cFv*}@i>U7hAF5bjD-Uf zHrpY~5|F%1+9Ragc3zTLyU4qoc7YXHJ7j#4JMHFEg4b7hA4cMk72L{u>3_bzSC?^d z3Avl*u}aR$3J{eI9IugbQS`!x%d4DB783yoqLttQO0*&iC8~TZ-?RrxwD~N=r2i1^ z63jqpGcV{cn8DuqFBwH+{b{QjOQz6&wX%43UFBBbxE)x_Y9GRzYA1s#ZeKd?Q_EeS z?I(yDTPz$*`pzHk?P_?ZaPx93;xJlc|;d6jGbdc)y8Q&+b<(fJT>q+7|S7T-Jd(YfU(ZAaM6yBdGl zTejn?c25mFJ zkAeTtg_Bnfyg0wyzpnn$z`*I+6R&*uf`|NxTKn4%0~3qq9>4Vq<-V;O{HLYuZ1eYz zf~m`qOS4U5!T!YPLNsx8AKi8FU~r!QG(CNC@tZgADoieKUz6J1QhUZW{Kzpz=9lKa oTsV6B$`#wYzj{5*U$y^eJNV%2OJe`{8msBYBHiIr_Y55P6P8yQ*#H0l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_petal_2_e.png b/src/main/resources/assets/betterend/textures/block/end_lotus_petal_2_e.png new file mode 100644 index 0000000000000000000000000000000000000000..7f688b6740d3b238d3adf42ba334a84744613534 GIT binary patch literal 339 zcmV-Z0j&OsP)7xl5QO(xco~WaDU?(|jg+TBNRO!>^8Ibr-uu?@p z6=D%7NcM4aW{y2{4h6+%eY3OQt}MnFxktsva3^N4lgam=fqVe|`P=twPW#12Z|edd z>Cq{GoQH#+&4+;Jjo+YyWghYYfFabk?Qbxoedzka0D!>j*CBv#n0^$%0o2iF>bGgp zXYOABw^4ZC1R%s_ceOYDv1&p=5ZrG`Yne~5NFjk(3PQ9L!H-BjLLrT*{RHb&sYH@z z6hpwqq!0qZCiu>qea^9$+|$Bh*t^-8*?q?o=bW5_;_&z-Zs>8hataE-^UNM}hA$2e zpDM@)Yef`tFh@P;qk#T8Oo)VK9Q0AZLG*k7;kKPjD@`I>(c-L002ovPDHLkV1nnPm#qK* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/fracturn_e.png b/src/main/resources/assets/betterend/textures/block/fracturn_e.png new file mode 100644 index 0000000000000000000000000000000000000000..e772127795e0e857fcfadb3c55b533e465177dbe GIT binary patch literal 1881 zcmb_dUx?g99F82UdiJ1VAIgCka#Sjs&CFzXlMIdLxqEdN+;h1u^n58!W+uDgHkp{@ zZujn`;)7TyYF|YJk-o{jTC2r-=$rT;`qC#AUsMna;)@i{$^P?tUh7d@$Yzp!^ZmZx z@Au8jrPj(zbF=failWRl>a|sQKb~KY6y*O?f9w%?do-@Unkvd;PvqA_%KIOjRFuL; zL3=G*Yrc%B2#bUXj~54FEYXT`W^oV`y3RAz$5R$FC+EN}+U2C?~sz|t6 zE>?63OGvexBCG%hm7Y@(fR+I)1DZO37*w$7sN*)u!|3<> z#lBe-NymVW;}`%L2FajlrL{enG1O~F|H<@WFlz`(VH}?HIb}Vt9fH= z_4N55Vxpfuvu_Tsk&L?<0tm{M=?Ju;g#p6Qd={7(fDyDQSm19RfWkI}*t9W1cR{6V z7|F=G@n5 zS+bEbDoLkv4{(nli_r<&D@h=i8tLt4%~dhUXn9UaDs%Lb)TTpLvUOr1Pv@Rr0lp7? z6Ir>ThaSQ8AeG(Q8ZVJ^{Pppu7pOy9U_x`dyBf{=%$YWR9UM}RBSjw1?{~Q*y-)K; z(Np1PeUk8{j;!5L{AJure@Zs*ub%p}?3otRIR{)vP}a>uxi^7tI}9P;tB^_dhpC4S zHm!*tA5i_cIJ8Tm4wpNqp*?s$M|0;$=z)Cxy}tg}e2jeW99hjc=)&Q*efz9z=kS%> zyz}Ao)Q}I;bB9N=REa!Q-o3GNTb@W48nvai{T02lx3@TR>WwQ;7e4vx&QBLl8V@hr zDqOp8{m+Y^emMV2;W#y~&!3pNee2k_Z|}VI^9wh*z3}zNS6bJ0=XS5Y*Sfqrr=I%t t^z6(R-_$REf9ajG-i@2~51&1*Jb6|8_}j4)-{ps2V|k^v^Wtl7{td9fRCoXY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_0_e.png b/src/main/resources/assets/betterend/textures/block/lumecorn_0_e.png new file mode 100644 index 0000000000000000000000000000000000000000..30fa3c7472141b0845bf32733a1cc0052e4aa9e2 GIT binary patch literal 1414 zcmbVMOKa3X9FJ7R7Fvqpr5+kn1WQdO$!1?eV`+D*yI^W*7i>>;5(*wmOH2;;>E!hia zh75TU;=u8lLp?EKL}l7wro=Vvo8bB}trrg5#2p4&$OoFDMke)uHjZ(ABdGU;+Zd2K zaf!!5j@4qUU!#nMHToOs`1*tZ?pn)=Wt^&u>&7BNw!Fj57&zoqbXaQp1gw#eHUdnR zcet7}ku^Td1q3k~lqjta1GPF-SYJQ?uflafCxtkZb~?cEU~4* zv2$h*^l6(l!b$%S?mjG}71l%nS*&tz{Yypxu0M#Xv2P0a)ym%8vC197c{_-faUbHF zxRVi&x37TrsSEPeZ@kB4i}}S;<}?1@?JkVmc)GW{q&_-)m)iPraHTu_cL5gi3Gcy>AvVlMc74lqeTLn05@ja+1<*vQ`>>v#fus* zd;o8J1mhR*z(Era-n@B~#FGaPcr>ijeKcV3MU&~ge)Idk|Jw`mb3=ny2PH`wDi-pK zVjhXcxdHLNzTYNdI`0=&LrEHb7mZUd$A_;;(%F5dw8B@+2iRh6g4nD~6HV6_Xi1u! zYWl=lryP`N)$t7Z+nZe(IJO}#r%h=3Ia+fHTLE3#nlD*f>y~cIQ+L2*6AJ>Dasrxe z-3xKkkUP9stfOO91|0}rH{|I^AXqUMK#m0zq!Ss%LMaVo^#sa5T}#~p8bnzYW>u6_ zAi^+%lRD^qvXBAJ2$P1Q6-Ae6A>ane-0 zaJ0{mr=b-%K6jW0B1TeX8{CkErd<*9iVN+IDaFkcZA!P zO6%069uEZ;#aO?_I16j+H`MX<5dp%rrWwmPRu|WeMTC5IQ<%|n$g$|K)bgpiNJF*} zSafz%s5u&0lxv3fsH3w@PAE*Ax60^D47JexJbu|scYo^Wc&8q|;onWCW* zLO7YhC^HU|7{V^pWVTaj9Sfbn5FLSvtg#6ve+AnXuCTx*!e+-MRjT@4RR*yqagNnl zAOs8Tk{vBf6BoUZ6VIZ>ydev-6OLnJqF1ssty6`hU|E4Mr72~Yf=VTYGP<5c=@df! z_jzV*M8WO9xBv6~!@v>6Md~N!iApZY3S4kP5wBLSD3<8s-m30^P9k7pMG0=mRuoxk z%e`ag#2)C|8m72f)nj8cXEYE+F~Q`BFr?A#ry+&)~igJ>D| zA+d=&8TCZ_3Phh;`&j%WdYoR&PnRY>SU=kBsWUg8ZaR^=g99I#fq{Vrj&s%XXjJxmHB{H@tM7mRSLWxA zPHg#QizG=C)me8z%s-{$$4%nD<8>d3X)~KWl}OU$qjaphwr_H~ByD&d)E4=ocMKpJ z<{+kZlIw&_pe5WZu&~Rw2z`b~Pp^R_AJHbqU#6 znLa2V=m0?w5)S1~*oqR+ag+fs5bN|33`^AwpcjB;%cD;b(qim`1^38Eme@H;lXC_%t=(?t+E$Ln4b8A^ zThmR=G*y96lWxReM~#wQV+NNbC=M78Xe6hMuufOFqXY19k@SOs7d_URVT^&!-wIPkk`LW>}8eFPO*gCU1s1Y-nz8i!EW z9E7kzG!``!IrAi_&=!q_V4%ueN9GbLVqo-#-S0W v!<}u1EuJ3gJxUhWr$n#t4xG71^{l}kP`uE{v+D@x8bMEcKzg_qbUBb}U literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_3_e.png b/src/main/resources/assets/betterend/textures/block/lumecorn_3_e.png new file mode 100644 index 0000000000000000000000000000000000000000..3615659eb522fc901a4edc9ab70062474c72b501 GIT binary patch literal 1471 zcmbVMU1%Id9N)CH)Y6nbSv5k}?Ssm>J3D*HUT)|b)7#V>xG|&$jSr%8GqZO~Zg;k` zliVdBLIk02ejxbfON(#ntG3`vgo1((;+qc!gg%HQSnws5bM`)#R^nF|X6NfSzyJ6D z+Vav%lP8}%scG6|ebHZ0^O<~{IIjNZ?)I^o9!(ct%{1-wPCh0+ES;Xxv}1Rp#;RNm zUPgq+7N)$(tX`Zdw5DB{>!p~iF{w9MD@r_L@8(yA9#PM@G85QAT4U{KaZ9kvTT2bH zwMMGcn0rCL&_jwKW)kbYxRYe4=NSWDq}KT{F!TXLu6f3ME>K?$mh~DJOrNn_lfY?5 zuT(AQ+Er)zdEK#L1=tk;%cc#H?V@s3AAN?BCTNIO{7WNQYUdekDN_VMx7)S4Ws8dz zfYoXh*bZP|qEtpa(Q`)JWpw2LveB20pv5Rt@!A{}#btJN zwCY6qAQ2EId4hWe$s^0CF*=SO+5S$d^SQQk$Zau|%~mq52dJZhxkFoT&TrjoEL=AN~H^Q7hg3hiPHaDQ>(p=G8rP@x_xGkg-#Iw<@e})B9QkD8VD9yM;P%efnwU88 zlXztQ?2iY(zrXwI-gl>-zWCVno0?y`dhLTdM?NYoy>;vD?>DxOpE-JI^6?q%m{xk` VwcQtQurKo#TVGi6KfUwG<+!dn)(03){2PUUhdGSdDn%U zVs6+Z3*2KWHE*54ku>j^TJnY$XIpe#WQwI`$FLl5>N~XT_T|23cUQjSePZ2_?2uC4 z@aJ!td+PC{Pk1caWRFgjf5P)YbFOSm-^(tY`0@u=*|T<)bUs_oXArx~=kXhc$N%m! zW`sp~<&+;_KYJvT;mSHUc7wmGm=D+%uy=gqT;5o@U2v_57eaD4!KnY%q$3M-WpoEP|$}SYOFf)N$m35j3WoaeC=ZnFhKR zr!PiiR<@F;pr>bSbbe+aug;9Cyhit(_BY2$0#PuKtALU*VLC!7PFI8la`vtv4Jr_K zJWh+AM=&U7K@!^tM3`tm<-$SG!!ulz<%8iUI9+gEOMtLgEHcFqgY7ZM@jMUNAPfcr1QBqiO;;%eOs8{Gq$(pJN40g! z)v*aYS!D!Ix^bFBy!jNvs%e`}HD4riu%uX!V_5HLTR>Ujk}jNWr?YRjyV)q)>e>tOgZ>UZwx4{AO2GZb@4a zD+X&l?OC);|4OSsiP<+k0c*fmg#E(g|jvr-Nib^oQr+)HXZQf94QUlV9#PIAN-3eC; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_light_top_e.png b/src/main/resources/assets/betterend/textures/block/lumecorn_light_top_e.png new file mode 100644 index 0000000000000000000000000000000000000000..d5955163d41bdc9c174f473047d0aff4cc6b8ed3 GIT binary patch literal 1484 zcmbVMOKjXk7&d|yh?2G!gn&Z_N0kc2p0W28k7}ZH9mpaaqI9Khr3x`Sp4~NBdt7^x z-OZ(e6BQh|a6l;H#sNW9RY)Ll;1bjb$|an7p;C{CheQs5R5pzFVKt~gTg&#mzWM(5 ze{pH?#i@xWClp1Qsw_Cmay*iLj~tZ$qq}=V4v$6)XA?y^w3U7jym#WzQ;PD?u3xQ* zn)@=QJkW{9>rC$kkwh!X$=Pm1=n4~{&YFH`tG|Bvl?r^%R?ie%2?8bv=mzaD!ChM&@M1Ynx1kCK5V2ybbE!a3bC*Dw#|#woqDGCp z2}+i36p>}-p93Z`N)VNxk<*ZYQ4!}XFnUxeE%q9C*?D0kORj9SB}9ZF>~uPMC#Unc z2@T7#ATpt8Y7(I(y-<*@7ADhU28Sgy_9Nl*5TuNx&R2!4N==6*1W`sCCL=dVhruq1 zprNDGqyf;Q87^9l+XLYqg{;j27K%h-jSL&LxZp{P{|j|?yib61t?Ono?x;%;WFitV zzb4HXIpmJ$q}q!ZTxJPhjVYU7lWI<<)d zf<1~GJPwGo*$+sQ!6S)`)Zx0M9o$nOV#9jPw(cCZm zTk~#ji+}O{*91E!rCXdcCnUH|C_P^J=**r2q2ewDJKXPotn|G+Vea3r7mh5Rpk%+` zQ*7|ZRTz1>bL^q540S0RIqeOE1egO^-N=dGIi2le^+63p*c+gTe~DWM4fRl$pG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_e.png b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_e.png new file mode 100644 index 0000000000000000000000000000000000000000..468c93a1d7c5e8a8444a53b62520443250eab8be GIT binary patch literal 1452 zcmbVMOK8+U7*0`Y?L&o%uZv^qLD6g;yWMSurnTLzcA=@YF1CtbXD73}p_@!hrrm8X zN-t9IBHl#stcT*gi0DnkgI5&_(z`+t4=Q!CkDyXt4NT_s&G*0m<%#igUF}EO1wrV_ zj%FtLye}MWt^9vNq@5QL8IaI^^b?jI6_of~#;noXNy5K||HESe{=s^f9A zAoLGbJ%nco19?)kT|@k^`cwqAWr$O~reb<&QnE)EeR6SeJck!&v2KZj1E9YOIe|kM z0#&E%2C!;~HD1Wq;jt`&8idUn;!r3MOq&xRO??7-V@V0C2@Rz5n3_~{EpZxXikgy@ zl&r=jMTJTd#&yv6L@v#@3UD%Wwjqn}46($R2W7cZsl+Pr81;*?s_VL}XtJhB93ce@ zE<;tx4SJdk84_UM_Lxmw5Hg}XonwZ`HLaWAcoD4|G~C1;CRdRst1%@ssRp!gg!AV7 za!t5}Wl|;%aaq8zYJ~Mll+mC>e?uKz|0ICB)-)p-Tk7ICk%)ke%yTmu4%reN z5P1@&X_@+5FxM_#)50`i)(sePG0A2Ok((W}Z3`;86~~3%q?9KpA?0yGl@LzGrQVdD zK$b@M+}C`cp?EF~Zu7nMpYPB6HZLwz-ZoEIa$#1$Q9I!AT4)r-MRL8dD%+rz2oT{g z!3`0IktLScIJUR#fjVuaL^$am!d-_2w7@FJCqqTiy)mS%0{?*Fb-4B)9 zg!6U~E~7rgH&G`eE^l8x?^AEwt6zAJyOzxi<@#RYubZ2LJ08xwTI~kr?PJ3SI>**a zm(amo>a*nCve4G%e|+BA^GZ1W_VCOKcyaUd+S+qx*K07)vAj}z_v!umjiGV$xUlcR no%_>gTE{x~FJ0Jiwo7Oc_B;`9?S1s^O4v`cBjcHs;hClHTU^LF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_wall_e.png b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_wall_e.png new file mode 100644 index 0000000000000000000000000000000000000000..5d749931476fe9124a5d8167ab64c896af7125b9 GIT binary patch literal 1467 zcmbVM%Wu<295%0rrvzGc30xSN9(b(dM-nFc1P3^9LE-=s{{Yw3iqlFf$~X@TRt0vkG@jQt-|zjqHZy&8*Y^F} z1wq(VuT^LHygM0NGyH$x;~L`AHotZu6oehWBx8ec>vmQUHh**)^K9Olf;M$?2-7CX z#jelMf^hs~>?3=TFwi7z$1}x0A3qa;gH7>#(NZkGLOM=uB_MMv(+zuN(KfJn@&q^@ zLr&llhCu9gy%5Hx*yn|OogB*|=tJ0|DNZB;!MrsCDl{OVnA0U&Eoh)*t8DJoQSm^Z-i6S=eix8Q8`%up8JnPP`AAIfqRMY$-Sqd{9%4a1NXP1ZDt zBc!nBF%(N)cyPo}C7~TSK69uC5=PXdOUx9xrUMgPKc)4;p_{nFdiU`@{GB;!Bkaf{v zqvsQOmV|UEu*u{ySMy+EjSnjUL5v0sO1q;#&5TqAl}ZwrGB|YJ@i2|T!(Y51Rm6xX zYKo@vkV%@_P*s@Mp{gHM@=#F*P>W)x)ms-@g89N%P@XjyG4w+)wqc6~F5)&jE@~6m z_u3*zJqatcO9L*LYnSh9VOg;5g$#K%saH*ro1JqU44dVGp_Ga($<7y>5>W~*$}*=lkCShZh&>{xnZga!FReniKMP^@c?;M=lOmT?h0N z0U|p|a8tCC$Pz3LkDZ_Pz<@UD5Kj7?a1UT1ZLtUiWTMTz^2~WJX!nnt9R^b=C2DiRoI%1o|gaq zV|6Zjci)Tl_!}XfdTx!s71)*R8*6-Qb?nBS%uaoiaOA_GOX|J&RnlJTlhf7vrxz}N E1~>W2cK`qY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_sporophyte_e.png b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_sporophyte_e.png new file mode 100644 index 0000000000000000000000000000000000000000..e72fae7808fabe397015f6a348da213246a2f1ba GIT binary patch literal 1519 zcmbVM-)kI29N#8VZB4Ks*i#=m*&7%!L13ZIX}0oo;Js z8a8BT7>2BiZmlNRxa&mxY62{vd_Mx!SE8|vixCIQ^FmX*lZR~OGq zL_}Px)u<*LL#~n+GKW>t9d-OCP2lIU`E3#rLAG0=7%bSVlfWPBsj6) z`VMVJ58d#Fn3$2gs46PtA(K>Cg%If)%4iQO8d8)#)S`}CU)vX&MLN6*%CpA74F4#U7KGSlGR`Y#zJ zbN%JG8vCZmf3>oAcSGe4;k+Hh%cKwSP14DT&)ZkX`_#lcJFC3My<0YCs*|7F8{e*9 zn;tzf_1xa=CMiH4(3_SSK za^dH%?mCRy4z3va%75&9M^M0Z7!3k%l)BWaB7ZjH^YU4}4ce~T04{UC|a7uah@{%G5 ZSHI4__TbCUycf6R^6Z@X;i;u_e*y;!JO9N)T(WLEZ z&v(B6|Nh(I(UHejB-SMef>@Eysbl!PD!P|0!O!*A{{Z;4%*{RN6U6d|qPvSY`sO19 z(S6-4j0fY|4oOEg0}NDzOlZ3pO%PiLLKo;0Fd&PtY&tUa^9ScC(llghPoKtVt^zA& zuI|BI^^t;JpU^V~HL#7`8cLYJh5;Z$+j4vFbORGPWW)%HXflu~>}gAa z?Z&i@-wqQF7#jkYEb5DG$0qz>cnZsC2V_ySU#Pi|9fLla^mI5ph289p)VPx3K@cFXfRNQm)M&?L zQc0NA9Bk#Qs?1zE_$hOu|arWcwf7N&g|;Etro= zK^1r~TgK7)FBQdN|JkS;TTssjE@W9%cuFtLvE%|(CsQCP)#MI$jqp@!8ll@0dJT-W3 zU+(6zubkQXpx<-(r@=$H_wHM`H$1p<`|mxQtid&>PS5OCK0J8l(!<|{OK3 z$G`vP%>3Go^$VZA`h~aQ#+nzeoxJDrt&g|uy?=V(>T|!;pPiq6?veG843oK)Hh4rGCCa-Jkk{6R#n+?Su zps<5yy?D@*2N~#9(0P=xo2UH)-t^$51F^nzZRf!nczHkgd_LbF@AI~nm#$5Wof%^o zWn_=d%k#AZJL_ig-IiAA)`0$AZj;*k(GlpRJDylmRn*mzcTq;|e z4NJ1w>^zu@WGdhyVuHwB_d+>R*siWj*YPpWf-ZzK6!tKwim?n-93U{mr4trRi6A3! zFfB-8>M9TgnBj#C50eQ2%0gOBN}%_#G+JQSXMbLtS@(4oL|e<@-8JvY#WzurA#U%#S?k_<&mb)y?hq^jTcjwOl#cum0+EvZEIsZavBi zw|Cx*s9%|4vH0}KXSVb0;+4*cca!?wBG~J++mkQm@7wKzXD`WV(3svG*T=uZkN0+u g)gH8eKOX@*jK6wz|Mj`IH{wU97nZc`{H@1-02YNii2wiq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/1.png new file mode 100644 index 0000000000000000000000000000000000000000..ffcddb8b5924fdb84f36e080fd13a17c9bf8e5c8 GIT binary patch literal 1076 zcmaJ=O-K|`9G_e&?MIz!?a(u)U3RBdVyeEzO`QCs6?d5e4LoQPYuf5q3{kqHFgUvS1HFMk4HfQki5Akg<(Gz!&tY zyk7tz(Z>flQSdhaf#XAv3qiio%kdHylo~~F@Ub+Stqn-2So=XNx{I(wgjf=U*=*LA zZS-M#5b~lZLQa5!;H3z!Gj0+k=QW+WfAs;yf@$0l$Um3}-%A}q~xzXZcNlr^1$ zHqnN`oMJ)V$GIgHfXU?lp@wmYc1Q{x<@--zCp~TAEKI{`QdIkA?zm za+v4iZDL6D%d)@;LNv~YgP{U9hSf0xnWVtgj=15XT-OeUMI*v|(_b0zyxzDfHD_dWVUl-VsYgP5T`P$kR z`Qyy(g#{4bTA!?GEqS&*iKcXBZuQqj#n<`eeA)c8e`W`~=z7pB?C!qZTnoeKiH7pi zJ3oFyPsgK|pR&sXi#6p_Z=$W~yXTgwOEZgsI?tjPtZhy$dREH6cUC{lp1)I4TEnDa V=kw6J*{AM1PQ<%oOKmr1{s7BfTlxS1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/10.png new file mode 100644 index 0000000000000000000000000000000000000000..95ae3e9bbec7f2511689a2c62205fd965fa85ff5 GIT binary patch literal 1182 zcmaJ>TWs4@7(Qu7=z3v+X_qpj9=Ti9i6*|JNouQEmf9(ev{Y3VX?cuepSD(GAJ;x5 zX$dN$5*>ShGR6b1g*_obkoLr+5mq!bE`tXi2AYJBiV)I784QVsv2dIL8HRaS_3^sm`D* zQuW388)y`O_5mZ8C;7}NNyBDH^)R7|X;U@;qlt>GYIBIdBAPL*IJ0%-V+I;}oH-N8 za2Z=hv&O`dgHA6^=Cq|bP1Kph2{>AjsDO!x3M*#Ga-~X~Y3fRJ?_IMDY(mIfoOzg3 zJ~IVn>>wBkMS~hYEWnr;;-j1>3=ctp<6|rrWBG89<0URCg+;jiFf^K@PfJ;4d^;9B z#hF<`Y>8#d<#MPT4q<18tCdRGZ~PoL5o{n92M<)HHX{F3F;Q^L?bSn_ILIn?){Oa5Or& z>3%PiEy)g233hTAms(w%n#BaWv)G2R>~(Df4xTYA9hcqXO-?2wr7f4JmWI+woS`Zq z!_Xx@A}X<{oQ#agBRroP6Jz4AEDM|)FAy zX=DXC#`8!Ycd!YYWlP5Hxs2?px6RcbnM<<{aaS%&lVQE#{%6>&E9xL`yJKB?*fBq{ zsN)@K?IV$I?g8L?BCRBImG6spE+1;Jq5G>p_Vpz;whko@pQtvzfb|<+)^Gl~f9U$X zU-~z`#&-(yYf|8)yFc95QNj1*di8c;@7jRRf9~i;`Jn$SPMln~<;Ex9^3^@>X@$SO zs=v$pwy)IHu~OP|_V*RGH|bv)zE*1Ukp(zE9%$d}@ecyyl@EVDHu(4Bi_gCJS-5uV z)V||2sn+#I4}5H>i=}cg4YgudN$A_~@+{wCnPx-X9~KnpEB&E4=&<>~n+j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/11.png new file mode 100644 index 0000000000000000000000000000000000000000..61a75bc8cbc28e32879f7f753a89a822d10d2052 GIT binary patch literal 1150 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SQ(l+8=IS&8k;&fTNoO;I$4@qnm9Wf z85kKkx*A%TnZxwDKtTGa`;D8wc&y_U_8nBe@q;hgUYScQOHg=G=b2Y* z+_UE}SG#{pE897@d-J?wsds7@a9E${*VOy2?z5V4|6I>=dt)c6?t5}l`OEJ)rVk4{ z4>|B@7*)tWdUsGob93lLr^+2%{3jmv`6|XryzyA`O})KU^NQaQ{dt>be)WF&!}9_6 z?Vl^2Y!%zx{N&_Qzq+Hber&4D(+aBV_}JPrLlvahjAGxJxyI;aiL1x%W@vr2mTxtm z4cEjaVM&@F-fq4s@Lw?8`Oj&$uB&dZ%NLlv3SL{w`ZqOqP6ej{10#QDV9B%tUZ4`e M)78&qol`;+0Q-l7i2wiq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/12.png new file mode 100644 index 0000000000000000000000000000000000000000..d6a962bffbf8620a6f21475c6623f7b633261050 GIT binary patch literal 1216 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SQ(l+8=IS&nwvT~TNoO;I$4@qnm9Wf z85kKkx*A%TnZxwDFfbZ; zx;TbZ+?o??=y%vbV2&~0G~ttTrnpSJ)cB%;MYlB0VY>PUws{W1PbIhPQHf<~YI0HP zds^U^b~sAg>b}>u^ToT1t9NgH_p|PjPaAv7Bd)K%QX6VEv<$9zTE%m-f< zzx*G5)%n!*9TF$lnr+U_)(HM_cV33K)D?c|kIY#r+wD$h)>J6HefjqA#2JlMLT~rW z7anI_-)Nt_VV!utIq!PY`dIF7pA1CpPhJozF%`;8^W1oc54Z^G1&#~|XDY~W}V9H|u(YvZK%XLXktIN(+89I4KmzHuIRkaJZ zFDRSAk-<xRTfWi_vTd7$7^iNDb#9skL* e=6m)t@i4^RIo>ApZjS?~O!0K}b6Mw<&;$S)z@=&c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/13.png new file mode 100644 index 0000000000000000000000000000000000000000..bf7e550d5ad0e2bf22a9caa6c844f3ba28bfe649 GIT binary patch literal 1227 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SQ(nSIlGv+7??UaTNoO;I$4@qnm9Wf z85kKkx*A%TnZxwDu`WT+w- zJDZjlZbue5Y2Pq&nfz_Gkx=Z5)BNwBrW*Y}lk%_f;iDDdU#;c`Z8Kk5G4Eu?FV&mB zx|T@qy!oY8=ckIPb=`sc@t;FIZ|r(It+rvx$xn-Ygiop&uetB&{eAMrpPeF$sv|Qa zBT`tNn;&*a=$Oa(=iA|RGHv;tYp1vKzl^tM&6&Qvf8p-io6gMH7;MFDzq+WgplnC5 zrK3_|>7Lli)Lm1>4lSCwk#Pl^k7)8&2cveUlH9$G^@#f?|LltWR7K=_saPa3(u{7$1E-7T8kU;(Wg#4Gdecu^{SgP xI~qBE>pT2yo7Ge2nUrcHdx!m9uePCh0)yA*Q$CC@=evW77f)9|mvv4FO#m37vKIgV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/14.png new file mode 100644 index 0000000000000000000000000000000000000000..17ddf5d32883cea3cfb73af6b002681475ef867b GIT binary patch literal 1008 zcmaJ=PiWIn9F7*M495m4=q^4o5C=9dN&hA^&MoP-f*GSLtjDFv+Zwmz#pG>GcX4_V z!OOfTg1D35#fwLW4lgo2Djq~o+{x1fMG(aL(zTrjYvASm;rqVdpZC3+Gt-m(eM5Z= z!}J%Yv=W^Mqj5A&|7X564LY4Bg$kL)3#4xNh#9kR6@j8-ETR%Jtj3iclxLXOS-V^z z75$QIVuv##3>P{cWiw2EH1rH}2@z05i?*w?)sb%475f2iYh(E%x;gM9xf9F!X#f+ZB-72l*6w=f)q@?_OV2El$A zpoTr5s!`W+;M|<;TDTsJv^csh7u|puu8E48!crB^wk=smPpDc-OQpxvoFEj&rL2@v zRgo9Pv4W7xWIJ39n=1}-Nr!74aML}xksTb5M%IvTuOe&0#|~(fE!(|w5qs*jxmNF7 zl0CVQCIh3({p+$jN7O;lvTI$s>6#z8)bT#G_F&(=uk=~W7qzi+_`dq9*&L0HtZ!^= z7!Pl}Z4P{Fid#Q-UTwd)$lkrP`TfC{HL6w?FX=*k-m~=HHzpzduB8uvnPZ9*@so{{s^yLp%Tg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/15.png new file mode 100644 index 0000000000000000000000000000000000000000..bae0ee464d112508c9e3252c32eec221cdee2c6b GIT binary patch literal 1084 zcmaJ=O=#0l9M4q7+?-AX?L4?grlMf;wSFb6)-GAKXh*5V?Pk*CtqW`NV)AOcv4gsU zdXZhdiFi{4#hVAG13~=Q#gi!F(K(n-1sQ|-QrpdgHSqF2`2BwWkN11mvm+$8p3#p`m3J|0%tq5~aGo~)QfP)mZ^{|;A z!(*8PX9@2ERzK?av=yak)Y0p z1P~P&KEjDY=ok<^+v{&CDA3bg)4?XPfv>0)P#MQ*lIfokEN4U3_8M&> z4P&dC!}1L0m(&DiGXIBK)&||%BTVdPC92gtJDwHP=uYT5>>ct`7;Oh!uE9@cCfrjq(56Ll} zA085;Vn~(+P7spAd@K@eauuYPEokE=*VyEWExEoOEQdr^ple=)M#@DNsFy97t#gUA z)N62!*11Gma#@lL>tF6)m)$%f4)T{9)+L(_^Fy0B-X+#PKVEo9p2fYilFV1%6_y|E ztFg@b)lYqWiG`JYiNNuh+DkD1;??|{pL>oy|M9thVG%8>7v`j%OW!`O8&GZAeS7A; zx_$0&Tl=+x3zfa?mr>%xZAY#>eap{myQ{0eUeDj5zwRn^braWaEm(Fp)a1!uI*Yqw|1kbKDc=xr@-kO@HX%$?4TfmP+z*X^ROCtc|Z7kKHnej^BylP-W(aeI?OQ4 zNMS)O()m(2&PVBg{6|Zt(-o30lV!X{8oGy=tcj}#6l}eQibyxN?i`>QhKXFWN@Y^k zZpj9=IX%R1f$dT@!_3SDu5PR&0;;HHIT`l&%{~h(GsCVVHC}TSRJRtkJ+!>NSTeTP z4asEZX2DD#Qvn+h9R&7<{|Y!=5Bn)|P;RJp__mDrN`?5u_zf zNb!=Gm;xd%q#>V%LOjL`GM|#;66ky^jpmtaa#5Y{#G<g4fqN|`H-|#G#Sl9ufqF%+DB*W57PfD=eo~+|{+C&=$1KouJ z$A=|#ftvPzsBQPqJ}IKpe9sj2OIt32Mdag6&!88#HW7w$WyM1}!CndDjcym0>X=}^ zj$NQAVb`X?^%cu8al@Z%b2LpZI6l!G0~OQ^OI0|_GG!qZ7sOmbNamDjLCEK%w3JX3 zkr%~mUYJg$yId6;n>KPtmusGK#lGCo4z^1ptH`tNB6HruHfWbETW95xoLAI@n(eFC z;hOz(;rntSO$LUS`_E-}kEnyfWzV{F(=$JEsN+3q?Y-k?FX^*bEvVU2@U{B=_2m}i z{_Gx&kIyL|nmbQgtyT@3J--@5~mN0m<;L literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/2.png new file mode 100644 index 0000000000000000000000000000000000000000..15620fc3b9a2618521660ab560b252fe0b132103 GIT binary patch literal 1011 zcmaJ=%WKp?9FA6s)K-fqwtDE8swlX5?K7cq*-ducKvT+gq3g|TGVP{qGBKIDX%Vy* zgdXit1TP-+B8V4@hYAHjQNgSJ1zxP^wYW~UyIT*ffyq4hzVG*#Z`LL!t`GE`?V~7a zKr5+bG7m=MXfOGX{B9a#8peexoo*+!$mG~x{MXIWkp zMV1p-L5LAVELd`}5ysqLw4l;EhZF2 z-~=I8;4`UohpQrU(Sa`RaIHNqe;_xqgX59ND)jB!&?@@K0j;tnd%s)~#k7#fi3jSn zxz>KU>~eDla#@lL8(r={m)$uc4vLmt>yk~^{Lm$i_ldQ=3mPXx2WRa7n?o)dGPS#kNx(yC&Ic#m0rF6Ir8A{ot=K|*bjdF(MDB0 zy)pb}W#`xT(XH_l&zs!z!&ANBQ+D%Z{ONZ1t~5799T}o3=g*y4&7AxcJwvT9p}xr9 Gy#E)@j6Yrg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/3.png new file mode 100644 index 0000000000000000000000000000000000000000..becaaa5b6f2b6ece75da33db7801efd4105e2a70 GIT binary patch literal 1163 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/6.png new file mode 100644 index 0000000000000000000000000000000000000000..987fbde545613e6d004fb487a7212b3d816ae3dd GIT binary patch literal 1210 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SQ(m{nz|LG`BKc8dv4z4}1M=z}5`DY9Wgz!U^x!jmqL15f;^dB7B31WekNS)1-NFfeL) zx;TbZ+*&f(*6*-`Kx=yML{TMHZ^bT=iw!S!Fv#kfs(T#g6i9!-VbYO&p-9MzrKw5b zp}gdthqDb<>pD$LUGnu-{`0eI?w{H5`tr*8efyWlzxDcl=S1~i-KPoOU30@WzDZWh z4b|wAPrIN0cH0vhwZ#kN9JEqPHA?kTuQs$T*!%OO(_a^>lYOV+Hg7o55o^20g2{P{ z&kZa4@?x{kvp$MXIFa|fect_DJL-dE;>-RtzkhmiU%Ka_)M{6Cog+S629^@5cD>Pb zG?EL`n{v;B!DaQ@&aItK1(s$_Iw7U7u6R<%e?@k||60m7tp2>Kd6Q{$FV@CqegFK0 z$_L+;sW3E4g!BHL&>FVdQ&MBb@00LX2r2qf` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/7.png new file mode 100644 index 0000000000000000000000000000000000000000..be6227d883d31ae799492ccfda37dc6439fa0efb GIT binary patch literal 1115 zcmaJ=OK1~87+zb9rA1q;pcSRV7JPu&SDU1}G}a^=o1j}tjM|%ScBjo!cW2$5nxys+ zOF;xtOACr1_F}<{AbL}5EBL6Md>qtE5A~oZ6d#v@7-wr!Js1~e=fU@V|6{&6*VEm# zzIJOZMN#XM2{}dP25;2($iMkpNhMPgj`!k2s1N5<2T~CoWgtkJYClXtRWF>JgB=uA zy~9ZN;$G#Tq#=`0Jq(jKZNjFgj?TQTY6B314D2_oFuizhng)g*rjG^`PO)P!Yb1so zcxb3Qtql!mqE2`21s!>b2$&G7Aa9mvtqw_KsN^EJN@>nEstquhIiz$blfh z1pOM{CV-I0@Ig)#+V%i}<3lVLV)<4-$4gvLY8AoCN0Vrd-Y2Ex{VTD^E=*@Jwk4L$ z<#J4}l|fEF%ZsAOasn#|euD731q-WrzvZ@+6=djYj$va1S-?|NGiVTpX_D#h5=?tl z)^bk8CRh#7*&MT=5RFwZiO>-6P;uQRo?>~jzbisyf3c6^}(a6R1wRoXyDds>G zBPWf}iE*qAzX_I0U#z9igVntL|$a36i;^5pmHA76F(*7#0=#ZYzQO<%FC zw6L)5PJ{t(i=%_6>DYYf8TGa5%|4${q;|GGjKAM<>A^x%%hM(L^K`OaZuoF_bBUc< zx_IW=r}_fZaQOX>`MSE1(b*R@Rh`qf$1N(+STnx8Zju_k5p7V8Y?){to~t>K&>vOp z+V=CyZN9j1Q)A)k(rj|;#AG5!O*L)0q_54q965cSosSN0sFjOUHMKEvc=7ex3t8{E MC*$4nt?2QQUqO&=w*UYD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/8.png new file mode 100644 index 0000000000000000000000000000000000000000..8f0a76094962f71c5c90cb487a13d65b7871de51 GIT binary patch literal 1245 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SQ(mHx|o|e8<{#eTNoO;I$4@qnm9Wf z85kKkx*A%TnZxwD6H@mEs-;;80&(HrK-S(E<%KPVWX~(pRZ4*;}XghxO`V*C6^Eb+K%eP*B z%ZBggS19q#4_lnaAHbFJTVvtmguRUB=CcC)!qn7-y6>@eRvv70XK<5`e=a9d=+GRm z_PqD^+$%Qk93C1uh}EAu+^|pgDu>*aCo>u!p1!i#WOE5e`Qzh1S=s&_eo#5log;nS z)wSurJch|zX+^tI0-7@-tZGDfL8Fz)uoEsqU;>gNZ(;JHy9X(~w zn|Jx7^XD9AGj@d=UQ3#$SQs25#Ix$u48e>vYdpNJo* zuiacr5JY{nS5D%&!5uXo{BNBvDR^o|k$!X-4xqeZ1EO1l89+u2B@2>3(MFCJK_@}1 z-ma(mQGe`^s6vBQTnt?>EX*c|&aQ%`sDl8J8IaY@F!lA(Q;O8JFm)slV`G*Ca(eHm z4GxdSQ|joTDri*KUb3?wVgUmng)A6DrXv=@)S|A4*X}Vxk&6&C7^aqz>W?Kz3EF@R z&_SQd`FS!V&|Huec>ivaXSoo=h8V8h$8sVY6x#)I`J-?&TN@CQ^8V#mco(K}2w5V- z$)a#0YMH0 zrC^{(>fpFYj}Q|4lEkw--yPvPf}t{3hU%~ZOjPD-f4HHFT-OeUg(J(r)=vO!zYPs? zv20PVoQuDr-ZEFKoJ*i0m%+&}?&bb<+2tebAa}W9UA$Q_KQOW5ZEWp^)6;(ZES^T? z?o{Dj=JWl=5<@Rc&a}36Nv|hPUMQ7HS#k~giYE9$92VP&*%oF^on?XV`|$=VpCtlw3@~jJ`{=I z*-Nu5p?jLCsp6rBjcIOfzGaW}^J4baTB_Ik;z6sXds^mZejW29GE^hmce8oxxy!P* zW6Lub8T8zSjOlI>%oI*^47*Sd0Fyivw`jd zb{G`(q=*M$c<>+|JPm|74=RFQ1Q9$9=JX&U;z7{5`qH(X2W#NveenDJ{vYr6)+Q&; z_x2p`Aqb*3Jtk-H9Q4Q0Blv&fdtJrTF_g@qDL8{Fsso5o9p(Xi09Bu#eFdu*s+9mD^Ppf@67}`*6N)r+iJFcmtYRlX(HL8B zz|_J-R$C}(f=-Q`C1ak51x$cc(lg7JD|!;u&=v98KV~Sh0YN2++D|H{Op*!c05U>H zLmD^4lfwedMOlF#8YFp^8)n#Hh6{&SPGqBESRk7pg`+w8jF^#A%~*IRQALDokzp#8 z3S9})&?zvSAP5Z0Gdv%{h>$yPA=L|6ZhuQb2Cn89HZq_^`ig2E&LN4yneLZh+HG0O zZMF$FjPX>P;b_(`sRdM&|3gi)jdoE69OU~?VK+N(111ApIOk~i;%55&P_~$GfQq1# zg|OV};$#sb=oX<(CK7(v&X5DshNZ)bd%D3<6fteNNVPPOmL&?S(1xLlQBIKAun>;K z6Df{M#^Z7{k`%a9iWm4~N|0Mz8ESJTuuzMuA8>~{a(z3PHjXR<$G8milmkt&QMPDw z&V}o!*W~J*bKyI38JrB`U+!O*-8#Y!@|SJv;!WH9z`~Aqu(iMZ+L*=9;%ZtR&3fS^ccl^3t-?*^x~ZWpet|ES-(yLsc| z$|tzV)%JehQ6H^;UR+*$5V%k--&c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SeY4Gx)>N+nwvT~yBQj~Iyt$RnYvmU zy15xy8o9bzy1?|hCuBlP0bb^JAN{}Rah~%M)AJG2i+~r z#e&U2I=%~e%~odqYX9T8&d~Yb!Igcsw;PN1Rkt7R;P~uuXigM^SVKMInJ-%|FF05D z`TDxEi=|)9Gx>j~Dto=-O?LhEaFrGYewJU$w?{s#-0l}Vuc~@h>uvVySMKefbMW1@ z^O+w^8LR!*Tj{x<-nwDw6v0-(u+`cE3lALlT6k?|x_#^Mw^nPf@&x$2h)Awsv+LT` zwzU5qhx56OE2k;3=H6AmG%)#K%oqm9lX{kG2By^YTL%L~aN=tHw86`L4b~ zl$XVmB{Frzvc$_$he~8mFfCAMTc@S5QmbkoyPMIyV|tG?4xV`YLo9(|#kHE~vmr%` PK!u2>tDnm{r-UW|jliV$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/10.png new file mode 100644 index 0000000000000000000000000000000000000000..135782d08c17abbd0be680a2c3278909d99f7d28 GIT binary patch literal 1390 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SeY3aTNpSQI+{8;yBQj~Iyt$RnYvmU zy15xy8o9bzy1?|hH{644~kr*$c704QxJ#=Pr5)3Jn^UI0aJVtFloOx z-hG>af$^TFi(^Q|ttpewW(x<39IbzUR%ND&@yjK-LOx3(R%kB0F?T^z_oG8o6`G{Q z%K`&-eabIXPAUv8SQ%ZoaCTG3g;u8(qV^jyRF`eNTyx$>?flHZ-DT%q?K@rDUVYv+ z+-Cj#0Q~fiTPNTo!|{`QS7dD{RSpYB3IrjeT|y=Y=ifMRWoYV-*xnUdE(lJei=Jg67s5y-bH=0<#+$3^WH{idE6c0yXORU zPf$H{?NXPOVW@&czvbtwSe>)iSNP40nQ7ZA&GPX?)zXBbuV<4F#_QzS+VrhnD&y=Q zSpQc&ytXXd*GJUPq(m_9Fr4XIH8mCUt;mcWk$xDDU##vm`72M(Z+iCw-0T9KLb{LlG}Yz$5>HcQT$YRL~O O0X<#)T-G@yGywp2A^;u$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/11.png new file mode 100644 index 0000000000000000000000000000000000000000..f757688d048f160f6a7974567269b9fd1cbb1881 GIT binary patch literal 1375 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SeY4_I++_<8k;&fyBQj~Iyt$RnYvmU zy15xy8o9bzy1?|huqIQ*dxbc{YIa*-k%CIn1DASOKN0y*%+pPC0u@kPL-?WetrpMin# zyr+v}NX4x=lWg-Z2Z*%Iug+EXd&{E!#Mx_chy$mKsKP-eXLhxgT?%y$)=a|tTRAyj zFeEu|FgA4TPHF6sm=?TbYs}HF?JmJn5A^?Lel@MvrdMCQ*!#_wzKC^Cc3xUDVY=kC@Ao>| z_uF?A>N`vp3J|$Cll#W}(#W+_A~L63m^)`;!0ls|$0jo@74cI%?zH>*_9-(javq*A zJ3hYaakc-{>+*?nyw=3DdC#B6Z96M-$3ugK)~wyXj;A;MUll&>1GDSv-(^A3b4uUY z1-2z#`1eU^W#{)^_N<5b7awi?As*!QE2`!F?-s`s+ofk~nI;_7Gw8cqzV}A-om>BY zJq{6gS>?Q|ne)5#`xf~#2F5RAUWjKuO?k$B_ut1~Jd$V9d!8}QzixK*-dy*W#y=`Q ziCfOUyyE#|$1|7qx$l2 vUp%WKyHERdHqBkUX7-yqx4c+?svlrTSiR+kp6B0npd!!H)z4*}Q$iB}EXWEp literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/12.png new file mode 100644 index 0000000000000000000000000000000000000000..8903c2dd2e54d0d6b0d8648207956ddb20ab69b8 GIT binary patch literal 1512 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SeY4_I++_jE_m&V_z5$NOZTS3U1qpJa}quJ@&k@IolRYwAJQZBssmaszW)2_z-ee6#sOm(sTRB-83 zf`F^Vv`rTzc?_1wxTJRoIcUyqUibRPos2`Oiklo+Zhsf#bq|QDlP@{(utG5{-AF;F zckZs{(^E~E67|#b3$$ko>G#QqJQ22%NZc@qv*z`U1%DM9e4TZ2ZPnGU$xod3Sb4VJ zsr@%%A|ARgztrKTd}e>GlbGN61s18tT2r3>{pa{4EqjTWy+!j+@8tjW>bl&AsAThHM(MMDbMA}TbviYBp8PS!OW)t! zF?!E!^?L2UA2pL0cfWQLtk&>Qn#%EI_lj3ljHjB#UcHq&6>VCxtDxQ3>*MabN0WX= z)?`&yU%r&6a#iAKz%LiZO?9u-@~h;EJei%$Gg|DOYj@jLVJRZ!XM>FVdQ&MBb@0DY=1Q2+n{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/13.png new file mode 100644 index 0000000000000000000000000000000000000000..6439f42132460efe8a72a15c8fdd880c367239de GIT binary patch literal 1526 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SeY4Fnmd`B7??UayBQj~Iyt$RnYvmU zy15xy8o9bzy1?|hp4U}WJm52`l>t6RW&9dYW_2RcR{6uC%|4HE*UAP^Itbb%ar;!n*3ruZUY(*8Yn zmp=moQ<|rXV@SoVp2=skg&if1&7XPK*DOugJacwJkXEbNRu^rJrqC(@ex*mQA092V z{gP1qDgUEN-Is**P2nFeEZ(+AVbRi{4M#7zZOc8eZ1&wZ?rFzo9&MJp^<&Pn=E~=_ z_2++2ntF?QpZpGmDG4gsk9OxK7HwdeyXwX!zCbhHKW}6l)490X7+q60>=xvDX;PLW zy=BJf4(G0om(?s1CC)v&z{gb5#NiTtz+^$1SitIO2|r~wG^ihxcIOlEWwrfadqJ*U zc~Mw<(F_Smr@mzdoA>#=`&;3=r;MXDh(U&RMF;1Go7qV@8)l^V?loxfRW>;HpwziU zMn27sdF9rXmUU?g{9?ynBu?q4Zg_4d=GA}c?gw-XH9c)LKL zdy`7eD{Y>A@0GcfYxY>2zUcn->hdSM9!wUUqvBI_?Zjc>FS@r|mu23V6KP>~;@nwR zy`3k%HWs+t^3mPhyzKJPw{OFbh|7EtvHVtk(%FAyg>lt)6dKT~7R+1!n+gxmC?GqGhzJ*wfX|Wt~$(69Dnh BNJ{_! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/14.png new file mode 100644 index 0000000000000000000000000000000000000000..6ebfa407a6351d32a7707ffe033581618554f4f2 GIT binary patch literal 1037 zcmaJ=O=#0l9FG)=Oa=o*S1)Fn%qccs{W4*7Yn#>uOc`D2dQqAtZ)@C=7n3)e6=WzA z+(Bd~PvYH!Fgz-o=t1Tef}T7L#9bBiAULTnUE6uE243C=zu)iw@qTZ0Du1EB?|2_U z5dHF`RKW9qKMn@*|HSvEil-3DmeDkvMRnByL`sKMK+2{%2MR#dm#%JsF@gw;7{xLw zD;Gr#nzZU;XwS4Un;^!A9b?vjO6FKoHP9R&%vnq%0=fEMX1s#Um%k`&H#uLRTX%35x_O}Jr< zr`ilhvwle(prZUAYMNcNiwa;r-+v0b#U&ds1>nL(N5dC4JM4$D#f$?~1f3#;3!N@b z)gXdy4ccTT<9F>GIXYulI;^{=TO36ZWy?jXr2$z=QdosH3|)-#LL!}rMq}wrj^ncF zv=onJ1umE41wNY-qz+et+M)?8)Zyy;+*nVpZwJ%HktN_5*MOdLph>pM7LDGy@ICd~ zT)lTLk)B)zC&T!c``2Z6jo%k zw^!un&3g|vSbKe)yY1NA(_g#yZ>${&42D9XozX_~*w2@*zTLgGmRec8g8~zk&Bl-A z%XBH2I*<>J1bO1{=jEW4j|ac}{t%Mm+Z)=>a;a1bzSSN-dpERosC?c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SeY4Fnmd`BSeQCFyBQj~Iyt$RnYvmU zy15xy8o9bzy1?|hvcFm!tMNb)mv>#a+7k8x*b^*B6I7g=aGdKyn1@EU)xFwg!izimwtZE z#PW7Q#FBt|1+%SYy)V;C1lyYyB%lBCY0n(xKCjuY6f0ak4z9^8e!4Yc)|tsutjyP{ zFU#rP?KeAR$-@Y-S#l5ewpw(u@Sb<}Thdc8MJFX^O2-Vt;5{sia}``vOcxny+~iX= z_g{Tok?TtMo}1q^XNdhuUf*34{-bc~i!_0#S-+Q^fAw^q!m|xK76xsTjOSvX>$vCI z;qXv0RbeUP|qm zJ;wE$v@N37X|`R6xF7a)>stB$w_k0u(yh04TDkDw`U!s~1}2F7n0}z0ftlezb)ws9 S#;zTpa>Ucs&t;ucLK6U4Sf)(? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/16.png new file mode 100644 index 0000000000000000000000000000000000000000..f3abcfc01b88e91936e429eba9b63cf2caed5986 GIT binary patch literal 1042 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/5.png new file mode 100644 index 0000000000000000000000000000000000000000..a596289d0301c69f858afcef87183b8a19f0b641 GIT binary patch literal 1510 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SeXHpy12O-nmReV85+7eIk}jbx>_2# zxfxj+xw=`p!1TK0Czs}?=9R$orXchh;nWLC4!H$Dn_W_iGRsm^+=}vZ6~NxM%Eaat zLuXf4O9Mxo=0WwQ;C71vPQCg-$LND17b&t~LckORV#1RykONQrsd>N@Uj$6reb;}! zWnf?m^K@|xskqfM`E<5$pvbZP)z4?nTr%^PyNRyuR%!3r2BmFY=DP$6)pz8If8F~r zzfe^#`VQwimzbTGIFypMP6^9gYBKR;@uV{;YBP_2JtyKQ?rU?p`kd{Y_vPo@=RMEg zv}fM2FHa25?5p*4%>k(o$w>y!`snflTL|8)km~ zJ)cFSe^_!VJz8+Z%|-K>+i^!*#g^xlAFA!_=0&G9|2r=}Z=&|>*DlMALbRIvmbYI} zRP;IBsN#7evZ^3u^51O!o9&z1Cuq;>jor+Z6=jxHGvEAMoWOcd zp52=gbV4$7!ujXnGw*)gc;xt@dKaDG2fq$$9O}FJfM*ed-<89=f2MBRSy8Xh+#P?d zQ^h+VR5VMYAusgwf<3oW><)_y{t1@(+)?`fZ`iJXGepm_?VFkUq&V_Iup8g5H4Uvi zEfbbJIKM*ny8FsYmUryu>+Nf-xT^I0fq?u*{TKU^9R*q5h|boynv;_w{_*RjyDrby zM{#pYXLCxgeyTJ#@Z;xK%4!0PZYrwFgd&e@xSgluJ@v^FX$}L%Ne-7b8O5Eumz10( zm3uC;djBM!*$w|Q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/6.png new file mode 100644 index 0000000000000000000000000000000000000000..ef8eb7401c12fc80b7bf43b1b540a9ee505f4eb4 GIT binary patch literal 1506 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/9.png new file mode 100644 index 0000000000000000000000000000000000000000..f4b2e314b93810ac54388ce0514783411b026837 GIT binary patch literal 1235 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SeY3aTNpSQnwdH|yBQj~Iyt$RnYvmU zy15xy8o9bzy1?|hSlGLz5t`d(qVme675CBiK&TElSC`iNhxtaR=cfj2cw+S)GwRd!%@ka>)$H;oR+CqvYwpeE_BbNp9MySx z71!a?#3;RA)$T8i|MU2qcaA){Fq=2A=2pcGn@vq3^Ze!-{8xgDO7B`nwYZVwT2x9TlWU_b2UwxQ=W1vQ&mdgcQ_7;IX zZ{`=w?AVo>Y*JWgutPB8kfQZ*^VU5<(G71|Hzz!Q`Re(Ef@232_#PgydlxPHZBO-? z^9%kbI`kx8*_sq&_2g{(o@Lh#2zBTrW!T1jTL1Cv#t9Quc-oTxxGQx_#;GUwtZ42| yn?1WR=IoO|O|6RM!6){$y!-ZMW>Ehp)dLK93+uY_=berP6*Hc$elF{r5}E*lYql8x literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/cave_moss.properties b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/cave_moss.properties new file mode 100644 index 00000000..ab0683a4 --- /dev/null +++ b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/cave_moss.properties @@ -0,0 +1,7 @@ +matchBlocks=minecraft:end_stone betterend:end_mycelium betterend:endstone_dust betterend:crystal_moss betterend:shadow_grass betterend:pink_moss byg:ivis_phylium byg:vermilion_sculk +connectBlocks=betterend:cave_moss +connect=block +method=overlay +layer=cutout +tiles=0-16 +faces=top \ No newline at end of file diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/0.png new file mode 100644 index 0000000000000000000000000000000000000000..8e3d4cf11f99143a3eb954a2e94439d6599ba3f2 GIT binary patch literal 987 zcmaJ=&1=*^9E}#F)D{)Iv>qH%6t!+RapU@k7v=!91AQNI5aPO4iGh83KU&DdoZw=$lEic~$u4kdAwkd1B^7aD|;q(LH} z>si;Pz@;TW^hh(g+~(M}YJ~}PLKjv| W?(7TY>&YwGbF*gWjhE%+hkpRAi8Z_c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/1.png new file mode 100644 index 0000000000000000000000000000000000000000..83823914ad43c4d3c5b7d0329f56610db6d43862 GIT binary patch literal 1048 zcmaJ=OK1~87~T>srBW!0PNLcl2ur#dr#D}{rh%@->B*qX$yOSc^|5&y zPRwWX>io1C)#$`9h*bq5U_h*Zsxf0aLN!j;bOo|@k69YjAb2`X?^2hG|lxwxr5HC448(;zmYH=Bpoz zJG;9HPyfQw)f9JO`?vbcP}3N_AZ~jV}7`z_5N5~-bBUn^+9`WeWl~b zy|1@RBM+17*6Q}t_ko_9y^9-X5($1_YjEM{@XpWf?8|ee=W*iK7vS-p^cLc42SKLC s_m(+u_wv?8+o#a|*z-flZzJneTRXM-OpPx# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/10.png new file mode 100644 index 0000000000000000000000000000000000000000..f623c7bd9a3c08e4873b1d00287f9a099fd10556 GIT binary patch literal 1171 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SQ$8(8k(E9IhtCyxfmL{I$0XHxjDPI zxVae{nVPy8n85V9|~h6w>v5Qqs+xEZ|V79^;vObrveCKgrMc1K~}LFS6KipB}d6^z{3 z+}gpC8-$gXc#BqYOK-dT)qL~JlYjpHPQOxF{O|k>gL34O{mU9A+B32-1cmizPPxc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SQ$8(nz)&p8Jk+TxfmL{I$0XHxjDPI zxVae{nVPy8n85V9M=_16)gL^&_ZO}#I3T?%!aS@`nwmNyH#JsImMPs`DNT()y0jA z)^X*!iE898HN3hpO0luw_NMH#Bg~9;4EuKW2JGd?D4Og#O}ugTs;Vza7XnTk2)DcO zS9n3_f!j>qckaOQ#Na@O7+CR7q81~Pb VoU!$O?JrQt;OXk;vd$@?2>|W!i%|do literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/12.png new file mode 100644 index 0000000000000000000000000000000000000000..6e9b01bb2165bd37859cda8d9e92b0f7135ce5ce GIT binary patch literal 1228 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 b6m|!M{qXwp`=9q7rSGjgyI{STS$*&qQE)lj literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/2.png new file mode 100644 index 0000000000000000000000000000000000000000..f392e54642159c0b685adf30f17da1ab0a3f291c GIT binary patch literal 999 zcmaJ=&ui0A9FH4Q84ikq;12r8=1^FZmt87Gg^|ApU8i%#drY?&SL=Wi!n5OdMGD3L>C_s;;lHzuvrMf$OO3QpSX4prM*Ow-KVnjro$j zv0}>(J97n0#|jnj5V1h)t@@D?t87bGq3h(BXF&@>R#f&Nsj|5MG#nz3;U?3zFd>4h z%n6fF7AMAm2!$*Uv%Dasp`gG?MUp}LV`;R|Syqa=(T+uTDqABYPiPpmlYM9pI4Z3Nh%cfDuZ1?fxaE-~RG?@fvIq`K7_WA^xKP6c zM>QM(O-s5q1uiYQzJu%0@m4Y7;%ePTMS6QmUxvrzYykuxX9%iNtT@YsTGBgZL z*9}7wGZ_O;bhtXU*F5Bt4%a#43P*AiJ9q(&tfSDqgB&Bo9%z-VxV>}9=Oic}sn_N@ zy>m&pxg)teO@>b{_n*t|98m`)%dU0lrfYuWQ^$wY+CMe+G<_CJ1wB`azg7M;n=}0v zH+Q%4@YcI$#~SY$!!ULldncNWT59amKz4tB^!vcL^t`(L%HFy0;jVUFOFbH`zTCWj r@9}x@^Xp9G!H={3+HmS&AJcb=`TFF{m#w|0cJlNJv-A3k{LSsZ>DM|Z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/3.png new file mode 100644 index 0000000000000000000000000000000000000000..c9ba7fc2c284c1107c3c4918f1e6a1921d90fc91 GIT binary patch literal 1156 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SQ$7OyEz*=nV4F*xfmL{I$0XHxjDPI zxVae{nVPy8n85V9^sQ*gY9qQ`3p*0UA5MVTw>*k zNiR*D!Yg#?4(|!QckkZZc_$>fXjhn&+5RU|^OL;{R=)HWIz6L@v&&ua#{2twEg2`= z3qF{&hGSFlvZdMMK4}EpW%x0-Y9LRdrrS|-io#yzu?EXEBTkh1J;raFYWY= zCn_1UcKVpSpJ%wLQ2Bt@Ki}eG@9POxzEa7$?>R`LHvC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/4.png new file mode 100644 index 0000000000000000000000000000000000000000..ea9eec427f01355a5c96c34c901ce2b589b735b0 GIT binary patch literal 1164 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SQ$7OyEz*=S(sY5xfmL{I$0XHxjDPI zxVae{nVPy8n85V9DhGtn{ZB(pvIc; zuPPH0KbeUC-pF*Kw49gC=yuNQI0jAq)EymvcTZ1>+;O(BmM3k(1E*ZEO=|9KWs!lBGkVBxH)&<5A5Rw)fI@-JLzQw%1CD-DcOYs=<2eJ!>!HUUv74 zb|qlw2a};O(@26QEGh&M3E2k_0s#_)EF?y8K|eH07z5`UkqCSd1bl9+!w<|$?w*(Y ze!u_QFE`TN`Eo=3)Aa;FG$huEDZD;mze|_kZ_~~D5?&fnEQ5OVepHl9NQ7m*4}yd$ zLkYaoun&IhI-p7IYhs4oLxt~vo z@%dQzB#;G!44$Hj#iF<9^Xg`vVmOYYXqIAG4@P*bVGT(ok7li^DTvU@nTmlFT?4kF z)Ta+2fy9|UC_yzAWHoEPO}JrHNirzLOWP&YfXU?lLsfMFZJ`u=nC~Nnt@N+~sT8#I zAv1>u*T2dRW$;lGN=P@;y1uE_#qNTRbgQ5nAR4v1)&`n;6;0NQ*6KM%+V2S`Mrv1|4nA z$EIC|mOd>G#KeI5_1V-1k@ct}u2#KQ%l2)Pdvdcsa}6abEoX z(yaFPVb`_0Z+o4;KX-Xcs`J~MgC{qt8@{V7+ZMfj;kQ5Jd#UV9{~PMFlV*DVvcRd{ zTL(}5`1P;UnR~FwT)N-$F1u~ZZDRDj?8IyJKmBs#nUKr%WLMLkiC04xWNZAT>oe8Q zAK$er{3m>8>p!9Dh9Tz zE>O7fX2;21cjMmIJ4P;!HcYLq#?XlS259-D5o8;?vNLu0(JR7N5m6hzw8q(Y_4#X# z538Yb)+)`!AD-b&7`~Z&m&UD>$t+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/6.png new file mode 100644 index 0000000000000000000000000000000000000000..489a5a542a7a3920fc5ad2ced37334681dcf0815 GIT binary patch literal 1201 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SQ$8(m>ZfnnVMR-xfmL{I$0XHxjDPI zxVae{nVPy8n85V9|LG`BKc8dv4z4}1M=z}5`DY9Wgz!U^x!jmqL15f;^dB7B31Wek2T*lc942+7N zE{-7;x0Xy+V3F11x4e@K9Lk zJavz6opIU2*_qbX_5c3NZM$1>J)|`CLEQb^0G>BrE0=zc+n$~pIP1LsugPE50 zWc|9_?BS<9TP))_(w?4C;(x`ln@^{$JH+Eo_-_WoSKF@VD){f&n=f`Wu7um#)~~aN zX;N2HS0HQH^H7f27ne1%Fzxc?znmc1afWfm?7SJXTpcEsi$zAV+zUNB!&M>pgF?97 zi$BQ;K?m+O#q;F2C#3EbzsVA#I(wP4L+2Hl=f}fDtsf^V9bkU4xM5N1&YY5^GDpNG zUOeKy&;4z~KlZg-_|9HPQ(bd_$ zy=-?GK@i*H9by8{JH1g_g8#nNtb(UX)Ygl-VIRsUHXvFxm;z+nQ2IdvDB9481<*tg zMb&z;7xl`A1Qi+q#lr+#!@_KWXliyXMI8i)Oo4vgj8H3&o=~K&MW~*T%*a*@4Co!h zHs~JiOsd0!Dz8z^2gxQ^zybz93h5fhO-FDe)Vi*K*WNKrk?RmN7@>YA)hl*?ve1L6WcrI8+ats@$nJ~@P`x#bX8iabD-1sOQ&DQ#ageYyq!n+7HfRH87 zbS9GtWas+@ud9M#q>q(hVR6qOWAqX>mF{au1# zZOWR?Mw@WMXjidlHo$l#<$$vMf2d(>q8*d~fAamOu#+6J0G$91Oxr5HxV|bclqJM$ zpde@`Av~VzV%Gpf&>4Uh8H;&cYb0xWbW?*Fr*@qq%R=0AkYcJJE=DM<63}%`V4}e= z8;tUyMoDDZwkXd?QcM&jsh$gkBqo^Sicn1(z(hH&_J`Y=m+RTVuyAA%*!oGJNj5ad z^|A#$e=gy?dK+9Ve=d!Axin6O_Ad9Y%g!BP2YJg)>*CF(`GJWYZ)0ow=3YAZS=@<> ztx5N7>T5RJTvY4Mt-Z)@Yw4OjvgRATTG6p(M{{I!&xh)jXD#;&jH!1O%I9kBb*VZ*5&_ud4B%`u=U=%-Ceb-Kl%~ n-WSh|Y?+lVqzZOjCJIW3#l91Z)3KxF-iwa6b&7YQ$Iku&^&n+V literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/8.png new file mode 100644 index 0000000000000000000000000000000000000000..49794325de62ddeba43fa8e5253ca564b2aa17a5 GIT binary patch literal 1250 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SQ$8(8k(E98JSwRxfmL{I$0XHxjDPI zxVae{nVPy8n85V9* zT^vIyZcUkNnC0Xs&{jUZ;chd>OQ!Q)t3|G9ZrOB-@d)<|Nt=fB3)~&-Cm6SQc8dIcLT&y zKm2%6n3DZgl|PB)%66+0ee;iteQvz5WKPQwC-X^jnQv!FFaNue_0dmt!#82?SFd1M zzCPIF)VYN}Z`)`|DpXg@Y)Vu$EBv`7$0MkOYj^G+tGxUlr^Wud8rMifHMz)2ls;!k ze*M{s?;ZQH@TNsmT76G!xm%h3k54LP(Y-qfQT=@F{fGU3i-|^*8wckrF!11P^7=mV`~ChO@Aocrbskt( zRaZq()Vg@PlqB;;cdV%-|Lt=Hg-l-D)`JhDKAcf(NVRAv4ME&c`e70(+UW2!Y^JEP zoqDPV_ar(56&V4=#RRg3Mc5S8yf14h>LA1*4f}O7M*o<6LIYik(MQ4wHercyKyM$j z;o-5)lsY!3@*2HwFKEsRM8JSp0a;_nbcAe-UeFcD+C64yumHh>F?unno7z+BTk8{&lDrg)>|*o)#+JY^ znM@{-X$&B{pW%3(XV@SU4EhPe?~IyQ$@)#lS5%OoquRQKbz}lpQAwi_9HU95izOJ= zvaIPWwTU#0$to7Z1z5MFA~2EoKh!Xm(GE_+m3;px?4(95$RweIMr@T_T%XSkWeK7U z6^!f@LPNzab`2nmoB?D3QFOZ&1r0}ZQ$rbN*8(Sz5aOnT6;p+ADMk~OfUau-+ZyH~ zA-O3Wl_idAYvoy479~lR8-wAn%!Z0w38^CnG;xuut#BhHxvm`yi$s>7t)GONY$F3K zlr89`a|xByTjFY^a|xH^G9($sz1+VpyLdz#yUJwI2Ot z*Nan=+h!_~>@`o$lb^`tYWJV3pXFzBDTaMKJvr_LV*SJD<@)slvVZdhL?c8gcl@vqM&R`<$hj+Kk^Z}8hZwWS(RRn<1N`TWLo zO`1Ae(Qx$Ikf&kh%9q^CnewW#%X8BgS|8N(>eTh^Q$Ib?x|ZL$;lWB@-d}kx1a?$V a<+aqNoA-PteD9vRuRq?_Dcx`FJ^crnlyVyY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/chorus_nylium.properties b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/chorus_nylium.properties new file mode 100644 index 00000000..f351f2ea --- /dev/null +++ b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/chorus_nylium.properties @@ -0,0 +1,7 @@ +matchBlocks=minecraft:end_stone betterend:end_mycelium betterend:endstone_dust byg:ivis_phylium betterend:cave_moss betterend:crystal_moss betterend:shadow_grass betterend:pink_moss byg:vermilion_sculk +connectBlocks=betterend:chorus_nylium +connect=block +method=overlay +layer=cutout +tiles=0-16 +faces=top \ No newline at end of file diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/0.png new file mode 100644 index 0000000000000000000000000000000000000000..057d32f97a8932c01f2e514da60b63044250737d GIT binary patch literal 1004 zcmaJ=&rj1(950d>L$ZXE33}jJqS3_l*I2hU)P=4CmRKZX$PQ}k+Q(K$`)d1e1vwzb z7!G>&5Afj0t0o*2IT*ZnL(!8r^}>MzBxvUA*oFsZlh^knpU>y}<9*)R)Z}=q?@S*> zQL+4lRv>eKG)|o)|G~Y6L8bwmE8%H0hwFw9sZk4+A;>#M1s0%TE#BRNBNWwp!7i3? zNxv$a$YG2K!-S4U*c3IA2|dHCK@7^UV!H~xyZ(j-wx!UsNuATZEUelSOFo=lnk<@2 zHB++a%oQ*a%0$3{*Z`q3?*?+H&`n*LtfOO=22BXADfCfNC4CBHkq<$V5#uI5EP#~6 z@FFJ(!r6etAiu)$ zk|eR5zzRZ~AmYKIi;Xbu219KH4F;xfd)P)Uh!l-7TEGfTGCeB6@j9|@&}tKD7#kWM z%QIY5QX8o2|A#tG2OZ!7JkIx@!a;G-gKPl?Xu&th#mx;xp*%V3Ljxnfh|qkyi&IsE zQBXx5$Y!IirNPBn+qF+c$nIJbaQ>++0M?!@(R^U)qb9R{4sWYFnWLa+@$tWy}kMe8E;3) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/1.png new file mode 100644 index 0000000000000000000000000000000000000000..9594e510889c5a21be80a03916467bcec0af1c2c GIT binary patch literal 1178 zcmaJ>TWH%>7*RdC4+U0K{}c>-3TP~^eBzfJjIjm zo?;#+HCh;^v(N=}EGk8G{*XY&lTlvclER^vXo2J7EEi{aF~adOC&^-x-h3Dm%{9j4 zqB^h{i=0wS6(L7v*?PSmt&36UR#-lnOtPH73POY+BHo0JG(Tc{JuL+lc)Dvk$b>c> zC~9R`Ln(%2`nUwk*^;%r%{GySvA*W8e3T1HY5@y{|A$)E7TQBa@Fd^=6!uCJ4q%JG zgEdztgB$A!LOF8Q1sZ~G3BpsYE)G{Af?gFmbT%7wEkQqb)U*v)_nzP26bf?Q_K;@l zAg`tvq7pStLzbj?HpeOPn35gf`JAFi87?8@5{eWP<3d7daaE|-EMTJ+*LcEBwB-hN zupAOu1+MufFa}&`(HmvUX8T-XZS^*}M*Cc(wp^AZ!v@3s*RWex#6iJ!%ev&SWqx22 z$GgPZmei$C)V9vNnko4|l-Ds%cN{!DJEd?Zo9DMBGCw_B!7twUrT2x|3m@$K<46rR z{<@o-JD7hDynB5mzFrvv;P&1-*LFO^o&R$UFD+F$G*E+5GlpjPaF5`0WP1y8K{a-~6$;-(NqQ7T;>D z%}hO|UJjka>-YCA;0B&rWjlJF-8nsXp>ttn=~j3<0O9_=i7%Tyy;ql)Z(1|2-8efP j69iFQ{^o0u+TKkqR%?Hs`*`tq@VCh4hSX1$6Yo3%+0vZj literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/10.png new file mode 100644 index 0000000000000000000000000000000000000000..732e8e8af15d46c22c4891f68d1689fad9274ad5 GIT binary patch literal 1363 zcmaJ>du$VR9KTxZV6>a>Di`Aqy}-BH<*{&5A_Qq08$M@;-Ns=-@m= z>T>8FBozrZ!(L7Ru-Rxa#Iaf&uCp023u?n_pM`N0t3%K_1Tz^>j6f}f$p$Y!Iyss^ zwG$zqe>s+Xa_BlGi6;;wkw_R5CL>4 zi2y4~BpU|-pF=0B7-^a!EOi*}v0`qs$Lq(iMvuqhMy+_G)nhT6>Ts*4!1ZzQ9tN;d zflKANCd^`TqpNarc3^lpvJVLKPC)quj)C)K6ZGo2SXb3s=28#MC0~baRW2eYgXD($ zpJ5lSWC!K8E7p|{E9M8R?07-8_WDqf0)iCjfX^LH{uryBJ9IaD^<=d=n_U7oHkFV! z-g%eGEX-A;54MeI*HD!9C)XS5qoB;`OkKV`cco&G<7Uu3pB^*)otYn*tskD8zjMc{ zs%kI!ynTCXt14w~9UN>hndJ>%L%4Npx`$;842F!hsdKNs zGV_&Yr}@aw*L$)H)kPQ{ReaHMaIqsAi)H@&Rg->ufh+srRI1EaTZ(=2hbx<%IQd)D z8{uhHe|ma*)b`$BY1`PqgxeU64pW)?x7I5+DxZLkDt$=Hny2iZ|E+G zsUf=Wr4|i5gL(PZFr-B)zMz3ko4}JanXZGEHWv@QALwkI) z?b~zbFI>5OYeH02f+ugj41K5Gx2{=o*1x{5|NRf19wqi#q9aEt^)=;gdiMNB7l*Rh z#iDA)ufqG90@t!TX2#Jzb>$@}lDzKRJu)BRUp#ToWw-a)4!jjsE-fuh^5pj{4-cF$ cHS{Tc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6Secm{8=4tA8k;&fyBQj~Iysp+8dw;) zS~!`R8k-wgIKlL~drKSf#n&%dfc6t)Ud9QBkf@aaOS_ zrqWly+ge(>`!ye*tB|xPpOEi`458#6wY1|i1Ct%rpRkiiOSo5EbANXJiQ}EDZaQKc zk_5N4x!o}3ZA*Oc?2k-op82GS9QSQK+?5UFC#*=l=aWxc`CG%Q=y0P0Se`?M@26Zpa9)3!B|_q5tQkfCb;5t1&M1jQFHbVwu<>kHE7O#$xHgU4`ogXsVqr55ZnlV+H+9MV$IeCackd>D+${0v zVZq6o^e3D5EDi}wiC?=|SZDs(124aNIaaDJO1b!~yU=n<)VvKGC$Gv*ILY-WxPSeR zch~Q8c(ZB#vpH)gpY+iAN`@cH@4x?5_p?X6|EM5oJ5}-nqr=h#D>Fj)0xL5_C0FpV zbM1_t!TQu8JzoFWx4s#Y%ulV3-4Cywr4!8d$T_CtpoE;tvM2$2!}%u<{Leib!hPjk p(c&5VpBJxN^#6L;QMG<19tIA^CARrVaYsRAo~Nsy%Q~loCII?Y>>B_8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/12.png new file mode 100644 index 0000000000000000000000000000000000000000..7373cf41c084fce66147716fef33f09d5138548b GIT binary patch literal 1492 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6Secm{8=4tAnwvT~yBQj~Iysp+8dw;) zS~!`R8k-wgIKlL~taMM_F7L@V!b%`$HF>?gZx~g zBCZ1EUJDmUJF=9Q25#We%2;F~Hc4yR5>KC?$tIJRT`QaSeqWGgZfiwiMZfj?n0L0% zW41lN=4?0Fvsqv7(A8(|-H8Xbh0AYvmLR=M_tWH;9WFSjV>9ztgyLCfBP+ z>q3Gi2ZZ=Gna@<)wQcqa&JFKwHB{|nTD+Xye!pKsljf=)5@$~2{hYQ^Ys$5=cQ4q= zxvZa?COemnDbCz3&i3fNSc`M_=GmUw^ijW{TtcIEw!@oWlFN4A`Q)oOb4u*yd+z6d zoY?5h^ZLj=c7F>I)~!i`#Y;0^oRvG0_hs|Gi5llqH*MSVmdTzVs!N|1coF&W2B_YnTYaX_W2y#t0^FOx1 zgExNX@!Eq8UpTTw$_-~d2~OosUVs0<%}ZR`(~llod;8k^h6wcor(_yEIVTx^erS7T zncB;9rmSVLyL45R51f*C)oU_?U#32y}vG^Z|-xpA2oNGL@#o6vK(Unc3LvtrcP__wY%k$s&{W&Fzc-6?{&`_ zYaG*!esM~jb<&-@d4-mt54W=l>!C!8_dG?P{=EP7Muc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SecodxtY5f8kjmcyBQj~Iysp+8dw;) zS~!`R8k-wgIKlL~IwGE5O$QP-5eP_d0l39(#dD+tg&0SB{*%|&b7Bfz@}>Bh20*m zF8rdmx}5fQXgs>;Ezo~&&z0tcuSys6Y9v{df}hFsFLm_2)iI5&rc`i6~R zj?OjOE?x5^CqHp+Ydn0M_X^9+w;vY;u5*x=I@G^D-XWpO+lI&O&z2Z(nbQ61`43L$ zyBN%7^t80)x2ejr^+tc(a^5LkZ?f7XfA4YhBSYz(8xLgiE>KR7OgQ#b(r;B>Kilhn zYjc$n|C}u5b9G!BaKLRPNBMik8RhFYue|O#?{vz=ysZnWj!Kx!s(dcheb(+l--kz+ z5BX|tDS0}n#@nfkb?4Jm%{wy{THepkUATVLrx^ET%PKdAxfWDJ2$lIcu~U4Gf<^W0@`+h#5~tC{xtt#!rUx)dK_ z_I|nMMZA2AuC6G*JLAL@mZP3?3%-6iQKrQtVQH;b{$oBvrL$p>_=#R(O@kk9#Max2-<8 z{jb2@z?y{|x6aOglq01!Z{G_or@!Xn@rhTrJuUsGdVpb(BUApgovRjrN>@);KbLh* G2~7Y})hlTL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/14.png new file mode 100644 index 0000000000000000000000000000000000000000..4d49254f4e336cf9b0276c3633a1be25a1f40ee9 GIT binary patch literal 1010 zcmaJ=&ui0A9FG)aZWab!T0wkfAP#JPwN0DQIM$|h1v5%lSZ_8>-r8(SUQFI>Hc-La z@E`Cjo*yUd7PrC zXn9Vpl6f*5W9P~L>QPrGQydrTcmXZpj_yHf)c`z;+3nqH;5Vs~am2gC=ZQjza&~-l2hID)eGn<21Jb+t%EM2NyQxYsSWk zA(`~dEszUjB49(TgTP*Od^u3)o~}&R;W0~t9t5u_^l4IctpW1wAR{rn z$Vo!#CJ;D2!*UsxPbN5C=0rIuf&NF6Xr8$wSJhHK7TGCu8)H{y*-od!bdn76S}ZR~ z63Yp!AS4JP;jcSb4-$?)HBeBYZ+MoAE#!buQE#F(tk5LW(-LfVDC_wBHj#$0f$p+A z!-XXcfSUGysBI6?KCZ&EeE%uz*VbLgR-up9JcC@^(o`7Al?xu!G4g5%tq!_aX(NpM zHgZ9s5OysKZY)}ki8}stkE3aF+3~UN7_h7=G*MwJ%ap~8SjrUnR61WM@q96#7iYPw zP|W7VbTT7k^8>Dmj5QlNc)&H!xapDH&(av8Q{V;twC3eAu0PF%gT$-{Q}|kGkyleeLx` wZDtbpH8>5%IC(X6Jd(OM- zaw#G@A#6~=y}-oD*kA+c2NlNrGG>MBOVQE~_R9wIg?;hMsG>zh+uL)ssrz6&xO-ms z{eJ(qANR%Jz`<>;yIU~~+m`81=Fqysd0X7*+y1~7(Bd;w1@jOrnH50?Sf2!o0M97G zD98apsvemG-5BQDBj*cdA^ScjLM0$Ln1H2dh>c<0J(ebj2hfAT$2R81~JEZ z;(1bq>>!?iI>18#)-Tds3?7aKXqJjHUHfr{qQfK=Ch4G`qB)A?f>C_^Ay713Dsj1F zdOa38@kH4)HI5`Jl}exz3_yL9q@&R&NiihD_z}WyR8>>3{HoE>P)Gtp)Md?-p^7_- zLJ>}yJb^NOUV@@+$g0MAn^40@OVCII;Of z@j9}0cYJvU!#2H>N%rNfzlvQ;XCK%%e(Chs_A0pDwoADE^*7SvM@#MXZ-*~>H%pTD zX3sItPrw(8Rj=P$T4=99c#Hb{{7mrKdwmV2Rv__ZT0>csa_rH9kW-T&0W14sr+rP%=Jxs z3djFl1h((Y8Sj-V)%v}ERz7mG>L<0W^QnO@7ahT1S@O zt^a&E*T(Pv!;9&R>*U+@3uV%?)o0uGLhqK5;txBfcT;0n3%1#djr)oxzFXLS)A^BP MQUl2g@sZE|12$5gnE(I) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/16.png new file mode 100644 index 0000000000000000000000000000000000000000..112d9b5cb354bbc91c1978023361190f7f79a7e3 GIT binary patch literal 1012 zcmaJ=PiWIn91e;y#|FK27oV97g*E@WrcGF^ZPU7f8KbML1BIr^>l(M@#pKOqLmYS! z!J8h$i{infVDtc2YT)Jl;rqVdpZC3IGt;+*2S)}e ziW)9XsU{4XE0bTUP8zJg~_9XE9kQW+D~ASl}U0xUt@TzT*nPEyqQF{@m` z745ccAe+%c3=`NcVN=v(I&gJk5n@n-3znnM`=2&xV3`U%m(V!P&B2B>wd%py)#`R7INsIpjf*V8ocgPY56> zF}%o0!o)ZbI6ld8NtTbtI9}#NIWB?DN0VrtS(i&{p%aVj6uN=2E3<5~*<_k=26+oC zFG&*139KN*2qNaMI9Ly2jz8K}P@!*lmWwUqfKXAdp=GSlB-4`;Y_})t_?!r=vF;eKs46s3VJyp(#bj0xaw4C|<_bKY&t}C8 zmlE=+teA)=g;ci7Rgtl5LkD-c<|$X`%MI;dyCkv-J?kMf3m&pTyKLDyGZ(Rt%=4MP zdL6FWKNqeqmnF%t;pP5w+1(@Jpm5ofm_;>H4t~}q_Fo^g zzJFXFT3h>LM()fSKVIzae7Sk9dUSYrWqW<+O?2qj-RP_N`RLSz@ndgrX!G-9y|ULB z*pQCW)>!J>y{GSfw_2^MdLfdzRIR;@JRjliZ|!mv*rMLQOg|dlt8Rzyu$Z4#KV+*< F{sN%}Mk4?K literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/2.png new file mode 100644 index 0000000000000000000000000000000000000000..9279002de21b8eb4988eeb88ae550b1cbbd0e51a GIT binary patch literal 1007 zcmaJ=O=#0l9M33!JFsJy)R2}pZrh$Xc%Pb!-Wc-KvTGG_>jt3s0xAR7}Kx>4Qu}TI?Pa1?2KKm z;EH}xHj%>^5rzpJkFY5!GaPz`IRi1M!fD&h(%)9!(7?8`^kh=!bT1EU_UM8SClvfx7;GsN;0d0WQIve0LQN%JUv%OE5rlzDX`_Y9I>b$$1|d82M#{X4_pH zuOWWP#vD3E}Z!6rjwWnQo-%^kE^*2`8&%YioEiHB3)5Oi6&oA{H{#fc+{(>GZKdY>4 zZ1i2u-2C8eZ8|SsuYLdXwg3Leh4<`}was+>#Ji)Xwqjt7atDvcw3YQ#^aQoSnEFDw Gdgm|O#Y77L literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/3.png new file mode 100644 index 0000000000000000000000000000000000000000..f50499f0a9fa17b463cb7ba6ac0b43c04d98bd1a GIT binary patch literal 1356 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SecnQ8o9Wcn3y^_yBQj~Iysp+8dw;) zS~!`R8k-wgIKlL~EaktacjCdxt-G&9C>lmZpqE% zJaO+9t@vcts4ZGxWan_joOMsa!R#0v*#k-&3_MwO%Wer^$Y(Jq6Iu`=u;AIfL?fnx z@NkjqY)?dw&S-tgC(k)=p5tYcWCpQkMcPwRHkCMBzb2Pz{jf5m+J;T*fyIyK*H<2X z?4~Bh{BwPtn!v*E=ee4mi)*Z2(==&9z~wui%2{)Kd_HV0?A+1v{fzRX>){V{#rAY; zyx;Kcrsyf5o4NLnE0*+gm{~8{J-a1KHqe+>`!raNbTgnXDeFI zzH})JvzRUMFKugXRp%;8R-Qvk4<%mNEnV9G=0RFvSIXtgyUTS{_jN|{Z5EH2t2(#Y zx!_lnqm`Ih#@zGmzmBoR$h|on^_uA+2iH%VJ9YL(kM{n1W?vM!rL?^9rnjq7K&s>$ z`x!<3nM=A#ek!h16-_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/4.png new file mode 100644 index 0000000000000000000000000000000000000000..9f8bed30450dac5d2be884c2337418cbce59e9bd GIT binary patch literal 1338 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SecnQ8o9WcSeQCFyBQj~Iysp+8dw;) zS~!`R8k-wgIKlL~%ZJd0KH@oO+u2^!xQScT|R8&qzp1>^Sjui_PCo~;fuyUm; zN7JH>x>8Y19NHQy7b{rVF5J9C+xhjo()WuLly)vi&$x~RpnftYK=D8x~$Q>>}e{u2hiT?}U z6CB^DY&J*7r|{#?)Kx3B&P_}6^>^Yp|C-mLBvmc*udAbilxv#3yRZ3&k``Wer<05~ z_U_ARS1F}3X6ojWa2<2P!xNl4_Xjm56=ApHSV^wo%lfXRmva zO7G#fx)!x{$`Lx!XX2g-G@r5980zhM^2dgC8Ue3OCoBtKm%5Y3u`@WJ_to>u6Q{kC z^Z02ab5`z3Y2jkN-`~6pj^t$d*0!tP>Evf*W7xQTv!#Wix<9Bi^K|udS?83{1ORMz B*scHo literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/5.png new file mode 100644 index 0000000000000000000000000000000000000000..a4365c8af56f1d8f133ca61adcffdc9588c87901 GIT binary patch literal 1496 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6Seco*ni&{58=5*fyBQj~Iysp+8dw;) zS~!`R8k-wgIKlL~N@Uj$6rb^$K~ z85o#6JY5_^DsJ@z`(_IVirBtCn{ugU=CLJ;XW6-CX>IXnQpi&(S;&32$S=s43@4a8(mP*{(0H-7Yz@O>%07|mh_GnPvC#Uu>9G+1c8Oh?F%J% zUbM~ptR7Lkl+D#R$#OQ^`iP=NN! zEhPumTu;-VbFbv{){LMOEz=|M`x|e*bWsyK{4I9(!L@njb?dJE-`pu>#^rwPug3HV zbF0~pW*nJhGv7PmMF7iw>2JMvuh}lkl{Tz>rg2%vOvlGIVUg~Ixaj6pSyG>7uFYW*l_&$)wPS6{s!oaISQ_S z_UXTgu(y?dU3!nKO(oa52XY%e9I18e@BCB$`_D{~6KmPKH#vTr^ijbXXS*mPeeNZs!lvoq{sehp-e^^cO9nz!)ymdKI;Vst04cIL-2eap literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/6.png new file mode 100644 index 0000000000000000000000000000000000000000..9ebf8e71a200ea4dd05bc0bd97ed3fd3944d6ffd GIT binary patch literal 1494 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6Seco*ni&{5o0>W~yBQj~Iysp+8dw;) zS~!`R8k-wgIKlL~|LG`BKc8dv4z4}1M=z}5`DY9Wgz!U^x!jmqL15f;^dB7B31WekJ{1;;w7?|8V zT^vIyZcPckm>rZT^8fDZxl1l*?(DQmb&T~k^N{?KwxPWyvflB?J!LWFSBcG6H6ru{ zU0wY5dbkFB3FF`U<$|}!VbNO(+FW<1JY9Bf<>yy>doo-kU~%4F81ZBTyOu>N(|iB8+fvtQDLyQXe;TzmHZoC$|6m(N`I`iD`qugc#2 zC2>bKmUB*vKczU|YisxZy#`wEQX&J7#JC?nHZyGP0b>gdj=6IKPMbUnd+4XZx6YvR ziL{;Wl)KlGrMD};(o5Ry(7ArOy^NdQSJATd>>nqdn0NAjbB%?7gW+xslLu@E92KW; ziZsxRS)ReJl~BC<;+pGau|8^-a^hJn3`*2?H49Y#YSW!|?fccnP17F#-kNLWZP8z? zX#JhDb-td9ylwiD({YP?ZR(DuR0-5y%3Nr7bIP2s$LEy0!;5~(ro1XTtvqq&?={<^ zT0~~eNZjOk@Wal)nu?!HVbh}}y5rQ>PB(K=n(SwyWjU#CMX1(=t!z)^=F6w;mVJ37 z-Jtp7=A9FjkM}8W-@wp)nXz~B?wvRG?_bI~bC=l{F_}ijKcWc?aq$c?m5(zogGyRY LS3j3^P6Uu+X~9KWTcnz0cH4_HUC^H8FJ_WrSJd)wLnvrXt&N|)A$Nw0UmwU=>!yt~oc z)Hs+MF(fi#knkXTkc0;ljXV&NCH@I&Aeue+LX@Cg#TZnw4T7C+?)=?YhY!|E?tXvr z`Fy_rKDoF0`(A8seX12fkoHtEo`LHV&il9EaNZ ziT7^Af+r3uo2JI%c%@SDRcN28mvAx|4B`ZZQ;kXRnMyGkwzE$%c`jwWmQ9CF{f(*^tqg*h-$@new~v}vnjijTOF zrd-DkvIZl^fi4{dVy~{s=z7_#)I1k|Q@stY*gTg&Q!WmZ!JXm$YuJq|=pbjiXZg6Z+!SmUnlC!xt~y zwLe-o{A74)8iarT^JaDN%Ij;`osX-R#oykrtk?cZj%C(XR{U2d2WLM&w*2?q4)-|X YLT-=~m!F;2hMnI@D$y7JFj_eN574Nu>;M1& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/8.png new file mode 100644 index 0000000000000000000000000000000000000000..af2b1b2f23862aef9fe7943b6a4a3a16eac526de GIT binary patch literal 1552 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 t9(i}S2F8ATAu#y^dtqT=u9?^vB+h;D1Y&yW9W( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/10.png new file mode 100644 index 0000000000000000000000000000000000000000..f0ae41cda04b96d9a392755f159a0df2ac1b7f1b GIT binary patch literal 1447 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 ft|X8&kdES8X-*(I2IgEnx=pt6TmBi<0}s literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/12.png new file mode 100644 index 0000000000000000000000000000000000000000..09de79e74165dbb3798d9346658404cbc6e8b753 GIT binary patch literal 1581 zcma)6c~I156pvCVQ1Pl_(OP3Xsq7}%J1JYoJ%DxGb%nL!Af?$P%ce_`B?;Yy5sKi9 zRa?V_ zS&|21$!|u;D@lGFh690sGN4xSLJo{#7zQIMSfx_P77DR|lZc>#6Q_nfSZI+H7{A2u z92oLQxcPj^2+2$bQegdd`%}l9I4G1X85|`1FsejgmJQ|AZ!Jn`^nWy-Yc0A8{4|_K zi+sL7%JuL}4TELvUK}W7D6_#A2#j15BG;|vK~dPCIg094F;XnVznX`)T|F< zZJa0(97%^`Gji-ftp0^q+$_+9#0xH-&kc8h)5}Y|=;i&O*&M360i3m%;V3>JCWOi~ zkhO&tm=9Rc)UuT?o4u}7j{{WtPM!$hRl~3e6{9!scqDLrFBde)aAsU4i)#w$N zM^+QlVW=9D`;?&65G+%KL#^{nD}|5b{tRuO4u<^lbhKzro+m*boNGy69R+})b8MEm zuHc!<^qUJl%^O=>+&g>p&{rx_v3Hk7W+o=))Wxyx&C%2AersN~tK|@1+_R&v=HcY` zv*PL+Pv>vxI;V5GzQ5|!!zJmfwqEpYIMrKo{0?fU?&#(MGBZk! zVxzwq78Fmn6^kWBm9_1`orS>kmo`KT(DE<$)ZZ9_XSZy>q#XIv&UYHxqUo>E`jzHy zC&Y9{UM!3UiJ}Ov=GVt%Jr|KH-Qp-;JlA`3$FigmZ0)P1foZAp8rIaFY+d+-m2OoC zf$4W0mh0Us?_Q4m?u*0s@!|FAE>ia-YumXGtB13!vun{<{pFssS#_kp`Y#29RGa_+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/13.png new file mode 100644 index 0000000000000000000000000000000000000000..1d506846f6a35214b7c1ca9a2db2f3fffa8948f7 GIT binary patch literal 1584 zcma)6eM}Q)7_Wc}RxwnZ4t07tqfXZA-SzuUswr)eCKPJzCMp`PcUP#;Ub#DL!8xYu zGC`TTsmP2&4H4PY&D4)EhEu^AG2r5+qR~Ip4Z@-UKc*50?k!N~AI9vGyZ62Kp5OEQ zp5OC4S7FauoFJVhl}IEB)(o=)tcj63{w?sF_4ow^mSoYABQE9KVu0dViIL%4EM)ak z`K*Jbn9|~lY^p>O8}c}F#2i~DNpoHW6|qqSy?%g}NKzLC{S;luija%V_xKEOZ__U@ zsKmzHHY>9RtaVBkdyq0}G=9C%rgf`Z;6pFjo;@UUMJ>?6l0 z3=Nxzg$8(pRF2IKnK+(>Gzu+3<7y?OBNVt6Ba~`6q{MI?is?{Xg|X-O3Ujb1Q_ z#xrixVNM^71>OvBfhhV(6b%FdihxSN@%boD5Cn=TQKb?A7Kl*l6R9BL6J|#}m|215 zJ$}){`JjkL%Egt41{g3MNx|#4*M{xy)dcBdnhOGtB!Tv|%wbp{O z)X$<0R^Uo_8q~u*I|>Hcy*W_C5U?S$c@HQGRb=Mq5-;l$t!4uZz9<+ELuzSC$GG)0 zLMfFl1Xrt72!Xq`h{mO4DGg1~7_E)^c^zJ7Ni$+bC9ct@>u}tXrY8uCUaz&7Ef&m- zn{-jE)hCFQk7lE>Js|cd7JDO>H1RAYa=eq{ilSX$FW^K@DB%2%$rP!&9(r$?$H#C1 zVSc1cBUzhS-m{iv(s|Ac4eLyLUc=%4q1@ zT&+V0H&Bz%61a*0eM&JZ7zGs3Nb9`PO3@?GpONj$!2mBWM~n4=dE&v~B&nYEN+dC9 zRlvBQwiw~VKb|>wZH4X9#p>~^w5!%GFAqKbqN}UiuIt#d z;^fu8)4uMQl(;n4vOM$9riHp&$H!$nc|SfBI`!1;T#Y^6(m2D>JX6(vVbh&9)}CUt!W%LhTHSvdq>_n!pK0dool=usyQIy%-%vcG zC+~-!@7y?VJeQC4J&YYV_ETlwKZSLLPi0A~$L`bZ>ASjM>)o4VL0SKtg8lX>iMNX` zF~PxVxvTxb*#pg=KT-5|4*i;bh`hPI582@R>(~eKjbc?5UK*D5?1TneTAEtRjgz;l z)zGZXck9PPt%daovV&` z*O8qYN;+C9E8^a ol8U{j=IuUwdS*{m!k{cq(%krL-D=|P8&1B04Bz!c#y=dKeo1OWh~p;!4ikdSi&wEzO~=B2HLN*AFktq zAzrwN|AKe_0gYlfaq!?#5)*?r6ZODRWULos5^o|UZ@9mQ=Aj>p1YIqqna2xoL%37!n>7oOgumXYA**JuA6cu}BS8KRd zdZ3xeiG#={9y%UDQ`B50^nkerFTrMS$RLQ}!DkksIA}=T$uW&+w%m7TZyF5^2NZ4o(eVY^otn0|! zbfAlidYU1B;+Ab`vI!Kckuq5zigi{+ZxD@szT zpa_DIOR1`nO38+97`!gzl>xTs1{k;|9K^Os>^?SmDOSt-5Mbn25n3N~LAix63R=jc z^ZBUiDf;e;?OLcE%tmGEWvxTsegdt6j~x0`XU)EV!~f;q!&~R{>-8zQA$fQMIvTI= zmYF1KCPY5TNhl~p03l0F4ig5d~7E^3`~tu(kI{TXe~27?^VMhm)Ro_sPm z2UkDdCqwtRsAsF;QT=zfn~BXn-P_xHzwzN)x4Zqv3OmPlVmD&D`<>56-Cz0K^!CuF z7jNgs#^}lCJK6n{FGKvno0nfRhr_AwN4v+(Lgj$E#S7(;!uXW5>P=A-tJJmY=ECHa QACIE>E*eYvtK90&UmkH^&Hw-a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/15.png new file mode 100644 index 0000000000000000000000000000000000000000..a31f12118486f3eed6f7b9764e32359856cbf9e2 GIT binary patch literal 1236 zcma)6U1%It6doH0rED;uLed8vrls1SnYlBwJF_!p4V#@^vo)KB?bZY-y7O~4J0>%C zoVn@FMkF95APV~COMLOc2Wd;OShXp%SP(&P#l=K zckZ0;obP<+oOx?(^!c7$yLV9()l(eS%Vh11@15P``P82+gDm|xKY@>;8g3W?q_Q?L zAzgHhNmz!4-F$5c4p3CrNvAS_CrTrlgV9mhF^{B<71wo zH%#zUhG~rM6hJz~$*d(LMOslgK?bUrJVc8?P3Gm#Xa$as9purm zN5e!jIKvR8?G#+URN8Xvg_}YV$@s|dd4U7G>&AI)SckX_|D&<3by#WokT1g!%>)*y zM{Q3BOtgD=pxBVG(T)TTDT*cLerft7^@?U!aDNlTrRG9nto>7@odxx_s3;wXRX7)IRWiLfLwY* zXU*A$!~e^_jkh1ruidBQgyi9O=x9Izwv{AmN+L+IDIuw_YK^F=%Bmo#q)!c7Vt7K4 zk6Y(~R_Yv){*1RjRGTdD4sj~$zTbn-g5zqV@j-ne0Ze$L+Cwe~)rSTN1R!Y5+l)XGYtHMed@&DFhK zj}1$2FC4mZq)?du^uWjO96x+G@d|gmdiUzm(&YmOuijbvC+zkb0 z7cVC6<%as_1OSG2u=d%TXV(YcyH@??yT5;UhcKiGj zBdKz(%WS&jZ>#cXce7YY9V>=5yeW|M7 cNA*^z7hWyzJ^j_0590q!F+ZxG8LGbdFVeK63jhEB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/16.png new file mode 100644 index 0000000000000000000000000000000000000000..574f4558ee45b611599fa296ab7c2444313cf607 GIT binary patch literal 1102 zcma)5PiWI%6pv2E91itnr(noHrYz0BwrRrZ{xq2@+Bv$ydKv6%@}&)1^2Owv?RrwT zgW?2_JM1EQ5D_mPJ#0tyAb1eLyT_qS(80v|rETU8V;D%jKY73Re((3*doVq9t*^Jg zm!hb?+@w|@>zVNF=_cQcKbn9nF|3#H46<+y_>dYiQ5n)X2UK7I0(1G+J2*^HU8{Dn zgiHAws)3w12yNnZ$0KNp8Xl>8z*vBoF2joLW|(hpHW}JBGt6u<&*!}?tlEzU zibi9>P)ugzDm`3Ri30~>K-Zl`H&E*trsY>9`|z4$=#~jy$S`eErTjFVMLwjH@f2$a z36YkSxRBx%F)>7oydZPD%n1_93o4&dC57%h42kBOmRiszIjps zMI__uz~h8C&pA$*SIauU1^AD~q1Hih*@IjG258AQNIk592u!p)I#6gx*r+#sn-m2s zYRFh}po?=_h9Q6ArfsSz1IVV8Hdr8vWmZTeBvuiu6q_uI5F`!7;Ehz|=PA_jsHBl|N9G0n_wFZ6rHZ&)E+fgD(9P$xv10v8`McupZhl&eHDh<^-4EN%(XG*5t5N%UrR(9w(8|Zvlg-aB zo{Qq+p7lSu`_hG-9qae6?ei;pKb>am?XgR9bKaw8jk{;H>Er9?22VWgUhC)6r>GvD XdR;L#wodQ83@1FNPie2l=kNUmi^pTN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/2.png new file mode 100644 index 0000000000000000000000000000000000000000..7d5bcb3984a52e75be7c0566aca467a1ef026500 GIT binary patch literal 1104 zcma)5-D}fO6i*p!G8iZbqAv>>f}&||(l%-0y3sZ5R(@= zoH(X`!33Wb5g)_{LB$Eahy!2!co3YR55hp7L|MJ*$K1mh29o=c^E>Bve&?K($^7_0 z|B-%%VFt1jdV#L{gLhvq{SN+YLb@C#=@~MG%cKT9#3W5zLTuKC6;wdbY+QVeh8d>k zx>cMZGr7~6f$cC1Y{GThrD%p39<963m_>vwp^D`sxXq_8IMy-~+;l7la&8J$t%(H> zO)cb$#=@+jn%w9JJ6zYO0~-;@*6lgR*Xjwb8I*>%8L+bv@|FH$2NF7IxUcBP`*0lHe%Qb_%we%WXS$ z{EkpmGNBG#K@0=Iwu8J{);=kqe>8Tr_KOV{2?gZidC#ErC=YePRJ*+c1%{N3cE+=4 zQQ(}8jd>e6B&#Pl`X_8!rY0LuG0Sm-hmus{#b`9bt72K^V!F(YC0a5(|S4$bTOrLv029_&@oUqwnbxiuwYNDmhuoJ*ehZ@*X@GI zDkj*kVwX*&f~v>aW7C#n;+lUvC{sIY9eLIzWM({Uvn`!9YZngxmwy{??$EE@r}T#A z;dbe0Kmn!^rD{eb5anZHRN>V!Ra2E!F{08wg=T~kC`BP?ogJ;zy`udYY_|u49=1md zIdq;pIyk@c-x74_N?AQwtbZu|X*NfDj$U0^90M2D?uC|KF>japwjz=wJ=uJ>^=V`6 z@(=08+3BxW?w&jK@^*6d*1`2J&q}|Vn}Z|Lci*o(e*b9IJOrL=jhl;imiyM#&l_(h c?uVFAFLPo%x%}}!=s_^!*>qliIClQpUzD(CQ~&?~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/3.png new file mode 100644 index 0000000000000000000000000000000000000000..19214a1b0ea0c31485412312948b177fc2e63ebc GIT binary patch literal 1399 zcma)6e@xtD7%qrNPKF~g92iIKC1h^&`s04K;aK2$zySw%kN|V&mA1!q$F-#`y91NW zZD5?+G?SoHXSNA!BP75?aB=FwA7s-dOpViQQJ5y`aLF)^#kocCJK%7Cki{nL_x0=h zyzlcq@B4ONb!EvKL$(2epf#RS#s}85u{$LhJacX>uwcp3-Sv8n9MB`IDnNz2+$6xB zFxxEn1eR}a{anb0pocoe+Iqd-TS0Sj*u=(cOwq6c&=8crC91GoNYLRXp;?ri$lTd; z2rTkWq|WNay^2c+ilrT@P}5Oa%XNe}ibu8-!1+-cI0y?m3rE8(l14|J$f92w>|@6m z0xz2AAt$m#s@_`-yJS^>ttK1F5f&1*QzpWOQ=}yiCUL@!;dYELqc}n1HrhbgQ>SR@iLMa(8yZN>7WsMap&Y!sC=W84EHXq+l4 zx+qI<%p=<*x9LsVrgESj0b?8tw0m%%m?2<8SE(W>3fscSTw7R>bPwZ1z!wuQ^0bX(?R>z&p)5%@ zp@hX^Mkyj-L#<7uz*;$q!#P{r&uVzPyU>Qaimg^hv7I2?MGlH`I~+DQ<96c=;j+iE z9!b+#i4)?nMG$)#Yk44+cBulZ%WADGx5T@kIwqb&&0~K zlr3fs533D!r}krzl7)S({HIy!3oGiiPNERJI-?!pr)C`EvS{S*ik9~ z)TC?_VWvQzvb-6=07Wd;I`_3w{0Q`CY`ZcT;ALgB1PRQO3I=DherXnh683qR!rJK7 zBfj$TL^i`|wsi&lU9V?m2ge5c8q*sZ0(_zGo0*imkKZmabX3pdIRjVr=IuqEOX+!X zW_|F`!QDRua`%i+H8!TrIA^FoHzbqW^-%Yzt?qv|8OEpCdsDWqU!FLO9hZ-`?mpD( z|IJb%?t;q3KHm8-SAey*7*j9SO?7?f7g8A3px_h%{-PfsU$DSQt82j?vcv<$~ zx}SDT9)8tx&zMy}_hpV|UEY?4J)h%92;Kbf*kwMkD(TzLPFEi7|G<*3k5o-EiM`X@ z?8z$^ADx}f8OShv6`DWutN;3qF5jS=dhg{ogo*h)th)%hQ<1!>H@&fZ{{;qtdkkey z-~E&sF<7mh9^O#IeZ(C&q1`G>_g%_d_FVPu%)_=clJ*ze10@k{K%U@A(&e C-tG+m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/4.png new file mode 100644 index 0000000000000000000000000000000000000000..cde72ff014a55311540ebafe3cb59362a86e3271 GIT binary patch literal 1430 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m|HSKB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD#PU%0_}#n6BP2AO_EVu8M)o`HUDF34YC)x{-2sR(CaRb3oXS&*t9 zlvO-zh+Ee+GmbWM|tQWH&+Et3tB&0ywW({JwTXlCH-W@&2SW^QQc z>SSSQ>1ttN=IY|=YT#n%Y!1`wnO9trn3tRivpW-LH&m|$UcFY%MX8A;`9&f5`8lvu z5Rj2yl3$#WU!dUZ42pFN1`yp;U%VogvqL456!T9jFqn&MWJpQ`{4XRAysZXnM8 z5dA4g;Ri{lKoOun3SiE$GB7ttNj3q7rm>NMiLR-kiMg(28Zb01%`6R#ErIDYF~wL( zALvAVP|`t4N-!Z{`UElI83V|HXRXvcV16nBW}F7^g;y9D7*}|@IEGZ*nls7U+bK|_ z_4-b&q$nvZ(+e!xD;BW#uJZipRPE5r_SN{6e9Qg=k-S+klNYG1Ox5pR#GaNZ64k80 zbIM1{NB8}^D(2_k-<^CYbM9Y6_4?M%#m-VuF)AFUrSrx7HIF`>WFD|B;-Wmqg{Wxj z$vh8c&;BsgOWDl&^qzyhFS+de&mWk2`jM)Qm0D!urHqXZm#=c}JbLweiE_Q<@gIp( zQW)noCBFDwb@27qPa*~OsX3OhJw=u?876aH)oF2)$%$y=&M8Q244KNcZ&T!vXU~`J z4iH%Kd8v?4o&99frcDto%N888vM@I8Znnf_HpJ@$-j3@#Dt9^al6UkoZKJzf1=);T3K0RRvs3XA{% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/5.png new file mode 100644 index 0000000000000000000000000000000000000000..28aa99eedc08fb33f6cd65a592435e4cce0303ee GIT binary patch literal 1570 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¬I3u>b&mdP|cp%@X^A?T-n^H zo07#&-vF6VrUVWm1_+%sH;_YxZSl%buuXU<8U&90k zHSB?0F0R@XxVB`w7H$UDTNquJi*7&+*F;54VJQn|+m@V9sY#K3lT(GPAmr7oAgXyG zFQxf{sH#)h4pzfv!$B_TV67AEL{Dri2gjqHHRRj(kyY@q16pazcJEk(o_uYr)jJlk zCl=CRVBFlln%%jg3W~Q~>C!`2{K%z>_o=k^mVegivsf%@*>d=``YVd2`>t&5Y^(g; z4=+yT_L*nj?nJ|MlwUpHwhN`?g_<%YHO_a4-c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6Sh<=x85A@X^^Z1Kj^ z#WAGf)|<)uy_pIn+UI}&z4!5vHy32?ygKqiK0B*Zp@5?~n?tHgVbj8#yjS-#HHDVy zeqOWT^tbI!D`>b!D) zvdRt1P)|FL$A&=~Nz+b6gr7Jzf5s`UZBLXdoqkmdKI;Vst0Ali!>i_@% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/10.png new file mode 100644 index 0000000000000000000000000000000000000000..17f87ab2b46fc583ba0d541dea1496c31b03708b GIT binary patch literal 1296 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6Sh<=x8(11RI+|LzIT{+eIyo8|Ik_6T zTACZU896ywIKuS0|~h6w>v5Qqs+x=T|{yc=-gZ{Xio7w>#DoxMJP%j*0EAzah4otIW$ z+{yyE8%(+Ur;i*!Blmwb;IFWYu8ZA={ACShe`U zboa(9PxGYC@LV4t0$n~kvl>-b9mN~A|4p5z- z_J)&x;(xBc1?-`A_m`ckUVPgzv9?iZf6t@9zPi`XPs>)_h*HrLeNYi;Gxte{k>rcr zv-htHW^(g6`z~%%-nN990;gs-c5!RG)0@c3o1G)`Cj2q;t|FN&UE43rHLy!ad)#yT zD%T0G(%KH*9riJb?nVxMy2*TxXa89Laz@^tlcS?83{1OR*q&o2M~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/11.png new file mode 100644 index 0000000000000000000000000000000000000000..ff076b6929846bcd1a5c566fe38c6e160e9f7835 GIT binary patch literal 1312 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/15.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8383149f97d0143c434185ab409b84b880b8c7 GIT binary patch literal 1137 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6Sh<=xTez7TT9{h6IT{+eIyo8|Ik_6T zTACZU896ywIKuS0Y%I5xuEk zXqf%YzpkmHHCC$IW=3L~#J!#^R^OkoJD<8Pz9cMJwJ2lHx$7%j%(t)nB=^mb=i+f$ z8O3bDf4Z~ZUpim-Scm=n%!QK;*Ue0Dl#p5@qp0UG*>=rzHc!E_k?Q@!kt(rEm9U7^wsx(r=0K~Dcjg{JG>??7) zP`a^!gkbE#h!`rt0;n({HU=h^F0imv2q7Lt3gOcHcYf~5=gvV~pFj4@o~`jpKulT(pzS`9=%4J|vK!tTD|)9g3|~ccXJ#!x3u|*_ zYpr2PHam40Ohz&la1k*<`}yU@yrftuFUNQ%RW07IF~k`5YAU zI@G0%P!RL^Y_7-Eu(j$UkMy|q0aqNzjqTw2G_r;Q=N7UH0d_&BY}q+Hmuw*ga|89d zTzhaX!ay!hli}mb{pYfKN7O;_vTt3w>6;&U)bRnew)th}2YnWcMJ-p3KGw>+SHHJ+ z9^sMg>)X{R`)uQDyWJjn%skxWZ$RPC-rH%e`g`xQa_{HR^J}ldU$?hr?;B4x8b@1q rPR(v@!k4e7&!0|JKdiqond$W*=A^5>|1|z!J$`yceNKCtuWtMWa;-x0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/2.png new file mode 100644 index 0000000000000000000000000000000000000000..1e27b8bdf358322b9858ce54c7cd87d4af0442bb GIT binary patch literal 998 zcmaJ=&ui0A9M2dQ84Nt^VCTU{hN58et82T2#gQh>Ry4D8W$Q&)n!K&COI}RgY}S)M zP#9iz)PoE>$UqUnlPKsxg~<+r2f;r;@FYXQgF=1j+Rnpf;N|_`^Z9&#yw6)N%}x&w zjSf*1HC&w0%49wkkE03lKl!6=k|~J`RXm55aMKJRrP!zjLD4mrVHukC+SP41Nl}BR zok|r~jf;|nT*izsOyv56O;M9mk#AZJh(Qf5JDyB`fBBjQjxEy*8G|!?71o`ZRsiQ( zvlXk=utb}lIu9lzi3qq5n;>#myikf{x}z(Rb$raypaa1TnchpPYLtMA0thlpHf8bS z0?3IBpXEeh{2UNCKF4x7mQSZRUgEM+S_IvXCeZ?WNh)i4Hx}8+bRA<~V%cW1$u!dp z3YJ-36h)R3SV2e;L@HeKuoH!Vo|4`TMqeEPV`}rOy99GtR$d+MDBS&|GJU+zDb-8&)E}KZ(Q)GM)}Eu!AHvdyCXYWrH}2+-Cwyo xzvmt&&BVsn+nbxodq>_SM?Rg{{_vR^NKg--NzZp*T*|~RuUMGXp5_;C{sopTK3o6* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/3.png new file mode 100644 index 0000000000000000000000000000000000000000..b3e34e3e54d203274d616a27e56301896f7a3653 GIT binary patch literal 1284 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6Sh<=xnK?Tv_TUg*pYX%^9|L!;j)B^d771SslSwNKKMHbh+;HjG z{^Z3S0=X5+2U*KzzD`nAt-d|8_}Me-bPhT7;615dW(Vx;2;MF3bC5$r>T}uxwMhl9 zc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6Sh<=xnK?T9fb5oc;Q1+d4JzG_%8VtLuu-T{v`+f7@JZ9;x~O?R){5 z)34*NGG-fQtz2+<+FEhHcngcf=iD|*GiGPo)CWJ9FE4giP|5iGg0r$dzwc*ol-=N- zojsNJ)Z3bJcZ08NSFV^m>pH&1_kL{SwIrv_jJ}MkZfig36Yy1-b^2jW`P5B6&!6L% z5^4RUePa&Widx;B+5++kOCx{Z%h0olII+oK=CRY4%sYcid>PCdlIa zem+B^{PKviHm%<{(r2IUzwoR()$V?^yUFe?CrzHUhZVin-_uzrP%TlSB0c}!<<)u4+JD(F;jyV=XH%WCHZDW3Z4 z4Ixt7?zZ(+8LU;Slg*#F=wJPdl&E``rk|9W_|c;036qe3cD>3D3s&zSX3NJ5nT*@d jYE5+7_M!DXs|17Px|JUfO-g(ZD!M#f{an^LB{Ts57WLP5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/5.png new file mode 100644 index 0000000000000000000000000000000000000000..fee7f640e152252470a6a1a4d03737f9c94dd4cb GIT binary patch literal 1447 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 JWt~$(69CjFh^7Dl literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/8.png new file mode 100644 index 0000000000000000000000000000000000000000..1f7a4c2195062c7473d401b086a57be6a3a950d8 GIT binary patch literal 1507 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6Sh<=x8(11R8kt(SIT{+eIyo8|Ik_6T zTACZU896ywIKuS0EaktajPdd)?YYKz_$3knAgv&l^vXyE{VOJZGZ9zdy z?S2&Z1TM)va%9_yZ4UP3-}^RuCoQtO;Q4Ov&hqqg=gwF<-~7s-<0t(hq^_x|dSSKB zihUe&(%7>qSmJ&%#N?k?b;v80xwSf>ZYooJ$mtEYmKr7S)CA{AhZ!-7IqYn(_MM=* zptJiy^PYwqk8ZQ4wMq3fK3W`bZ>4TD_tCYiT)pZC^$yD1)>v~#<$blFmK1B%uL<>k zCoB;8^eN9*<-ydt19$&3Ey>gWe56;#KW2WqefOC^-4Fg;-}HL-!Rl8B{R-65uUS++ zx4e9HX?e~ZHkscNN5i>W^m0DkQ_H^G=9RLb=k_n*Idy;L?Pkp# zh`UWZwKwtYmffB1YTJ*l-Fv>^Xndw_uk9L#$?fa=mz~#D+`Qr7TrbHb)y&_faPlk7 z@k@SxQg_y#-GzCa_ruaPRiqY7P&M&pdsA{jPvl%y^!&H0I)Bf$4Ek6YG0{L|jX+Ps zlILN&vl1Mhz6pLNEFE|FePh6hO$J77+TGT%jS|xx&q{f?EVB@5mD|hH#dE+Vx&D9V zM_qs2zx+{m&I$7J9-b58demL?L!qypX~j=lpS$<%f^Xe1KBwh65WM=(?f)!dORGNh#)|qZl3&C2IN{-&?F`He Y5Bwy`-`t6~1uAwuUHx3vIVCg!0FvG^e*gdg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/9.png new file mode 100644 index 0000000000000000000000000000000000000000..fa92f732c036efd290d37766222fa339844236ae GIT binary patch literal 1184 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6Sh<=x8(11RnweU-IT{+eIyo8|Ik_6T zTACZU896ywIKuS0xFqlKZ?vPeM`k2 zH)dac^YzzX>25|wL7z|UcOQGdi;b-`8#lp@KTzT>(r_xi@%K);zs0VdInF&S`g;c_;g- w9j|7&ZZCC;lMAqF(hCi+-Tl$%V|)W6Lvw%T>zhfQXF+9#r>mdKI;Vst0Lv(vV*mgE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/end_mycelium.properties b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/end_mycelium.properties new file mode 100644 index 00000000..8156c558 --- /dev/null +++ b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/end_mycelium.properties @@ -0,0 +1,7 @@ +matchBlocks=minecraft:end_stone betterend:endstone_dust byg:ivis_phylium betterend:cave_moss betterend:crystal_moss betterend:shadow_grass betterend:pink_moss byg:vermilion_sculk +connectBlocks=betterend:end_mycelium +connect=block +method=overlay +layer=cutout +tiles=0-16 +faces=top \ No newline at end of file diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/0.png new file mode 100644 index 0000000000000000000000000000000000000000..8db7ca1f51c482031e888c7066faa6007dc350f7 GIT binary patch literal 1068 zcmaJ=O-K|`93K%DOQkX>?9wn>QsnM@?5;M0>$*FmxzUQO8+r<7XP)k~JM*TQXS+(E zrXZUa3!+Ph3eVB4Ktd^uM2HTZk`V2~TM}Iir0vb>t{vJ2-n9_aXcS&MvV*qPyZ~)cxptQ1E>!Up{#5HBCNtBAfviG4B|jmM{lfvHiD>b z(h>t`Aa+Gipzf6&j5nv7m`xCEp`0lzX@JNi7}ks+wY{)Nk(wH$`U5d0W{M!Cb&pw~ zZ>%SwjHMM`r9$mwTTZ|NIzTd+(=&!GAOqeO zkHY#nvX%F;Eey~3n@NsgTWO}1W_=!p6_^&m$CLXXg`-*OkPw%;_G95)kV+wB3N)R~ zX1!UT7h1zK%kw7p zRszCIsf)cSh@hQjHR3Y5OioRCX z7l?==%XUV>EHCmtpD6h`t~1PbmADdAMs#4H5?4Lo`YUoBJLo2kECEZq3DhnN>SVEO zL93h#TTySHt5(j1tH`BsGPHBKe_eLz2s_AGmaU67W%C0AJKn<9o_+ph6+erIQ7N3r zeN65a3Zd$=6Zy#qbA4%!>1cYq6LP!V)ioFHXLo0QY-~<9G;|-UdAs$YFub`r_+tI) zp%cB$=|W+9?TE`YSGB{m6WsKplO1>7FVBCTT}p<&x1V`e%WVDrwcFVI=GAKL&{XQl zYvNnOv&Fk#^8w;hEx9%x9A8&%)ZCJont8UX7;Z{J z(5XWi-MVxO3W_KwQ4dC9M29{vi9`j}AtDdK_QqW6&^GYqeenDJ{vYr6E_8Jst=znO zGeuFA@pdIi<|=P&DkuMa-wG<3cHvkWA4eISRUJr0b<_hv+*EsE5~}*p>Bq2DjM)fdE&a?@eq8giXwyO0*40>R%VMXY#4<6CL&?EH8V1i57GVC+jhaGr) zxHF{<_iLg~H#dRCoJ0gnh*gj?2P{|0Md%e>iLAY2mIf;j+#jKTCzVcg0U0?E1euUe z;{yT+iwqy)L?Lhl2pk_~xiHK7eH<@wA;~X-)sH6896ci?mA2JbWEY|PFt#O@&1SPq z*3TfPm*quKWI2Hq1Rp{8+#w6AIiKa$78MleYK~!J16jaRRC~}Mj?g62-zAv#nylrn zwuv;1&8araGn`ja5tvB)A8MLwXcs5ppM3u*?52in$R?qS1|5xDT&C6wWlORHRg9bz zLIcGvcJ(2Q+&*LjS@yct0P0T~mX5OSp%qRdA;m2htCj}iN`xjVjA7_fw2hbjVLlve zm1UlfwMKbS7X5x%2?#(@BhN;$I9YRl&qM~xOYWya?UV7BfUm1sSH1k> zb43~R=IXtMnlITC!t^o-wO{=B;@cHFHrh0r$-kO-dX1YIeS3CpYIb&J<4)!7UcG7y z%ckEwKY#Y(hux|(aA|RCN8#a!eEOztm#3?5@1NV5U*3KrAdD@wo(L->ioHFr{+g)c`rU5 L>r`&Gc8~o6H?wiD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/10.png new file mode 100644 index 0000000000000000000000000000000000000000..a32184315677b5cba9cc474228674f5889d18c9b GIT binary patch literal 1206 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SUI{mxwx5{I+{8;I~y9hIyo9zI$IhW zJG+<|8M!(dy213iH{644~kr*$c704QxJ#=Pr5)3Jn^UI0aJVtFljGi z%!*`SU{v#TaSW-r)iZf-7E_==>vz5Gjw41LOD0TkKgE1wna5P61l6#n)~T(zatGWe zZD{RSVxrUS5w`!J^5oDjd^*+7&&@I3Z*KF|e$|@0eiOD_^(mVzZ~gzTnCIf#8+RAY zye)Y%e|ws@d=%#nk<{(?W-x9z@v3QV{#R38rs#kfKMhU@KCUw47h9{LD^=E{nVjRM z5b(Y>qO)a-V2L18OUS=Z-k$M&Oq#h4^Nw)untG?^Wh}#bPdn+>=jRJkdF`exZII+@ zdw=o(heh#o*C(GGcdgHN6RTPEM|$q@`o23?PyTt4zwGVFy?LMQO@HY*+6wnhm^kma zgmQ}FhH0IDcg}9i-;lpxo8c-JU$@1d&-T1)ywCW5#UjpEyrK4+A_VeVw=OSJdhai6 b$zj0oDDJ#%YVWdYP)XwH>gTe~DWM4fEGVP& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/11.png new file mode 100644 index 0000000000000000000000000000000000000000..b3a93ac758089f0cbf172ebb3cada41d0715b615 GIT binary patch literal 1215 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SUI}6IGbC#7@ImdI~y9hIyo9zI$IhW zJG+<|8M!(dy213ie$ciwiNTG6?4weVTLqXt2nP_bk$V4WGiMyv?-;PQMUbJM&3Q?az z1_s5evYMV=hukJC_C8|k8OPwWP~pv_@1H8gFIGjC=754ks?fw8O# zy0^j)=Uc`fzBI))BKJZ6JGoaeu~+0c-mHF}(rYH+pXK*s`QMN&Ypwjkbu$Z=>u|2| zUE?kDqAmac literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/12.png new file mode 100644 index 0000000000000000000000000000000000000000..1b2d4715012a4407a4304c5b43fdee5b36f47960 GIT binary patch literal 1246 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SUI}6IGbC#n43B|I~y9hIyo9zI$IhW zJG+<|8M!(dy213i=NX`F>Rv2 zvuwQ=$LJ2TB^r%g96wUiT&kmK#n`YQYU{(N7<8GeVh|BW~zd3)`3 z!PDxCnPN^Z&60H$KH?d4|BiaWoWy6}zkZuD#iQWozgdfJrAae95;?rbLoB1NHolwX zrbM~mC9Ngv+V;fghQ}^)n8cM~VEHy=XJL9=WrdwR!>(GpyQQnn<;gc+h}L*Hu|df4 zaj~_V-QFFme)>=HnxxY0v(av*{a?n-s|9!1iyx3G`NjW+A@r;ImC0%I-bcKzeQ9UI zag+Dk@+XqNZ?mmD$B^1Rz5NL@kL$)mZ}x?Lf4We0WpQYh_Q7R$!}4?Hw5gt)P_gjc z;-U>z%rXblE*;T0bd6EXpNskR)W5Z>%T86VzI}#UVCU{@-_;K=Ed438LT$^Dt)LRe M)78&qol`;+06RXt7ytkO literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/13.png new file mode 100644 index 0000000000000000000000000000000000000000..3998baf861af6288cd6350751f0083636b9ad6be GIT binary patch literal 1241 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SUDLOI6E0y8kjmcI~y9hIyo9zI$IhW zJG+<|8M!(dy213iBP3skQoPQCg-$LND17b&t~LckORV#1RykONQrsd>N@Uj$6r z>(8v($-uzq>FMGaQgN$hvZ1%Lqd?31K4&L`r7aVbI_yu%C(J%{%4vg;wqonl*0uHu z_MR%OEeSIPoCN0Ay_S}c;}@5^xqI)-xpQ|vx%str@-2#}}2{mR}_8aL#Xio>ZeV zrz>Nv2-5@(MyFS+4v3Yu@iNTkV<-~JKOp6ERqf5B>*A}Qx7XDDzF{y)r2XXauWF^~ zmwh#sys9mn{_>o@#D>xW!{5>mr&~rGPcJ-hJYd}{?X`NHej==wcD?q#Q=eTjFXo(d z<%EBn6Mu=aHHsfuHPPUlXT{caB0goG?-Z;d{KDp>Vzp7rS?){LKE?Sh3k>j^AD|x%q0x&By#V=KU8;V5pv^9scRjS$9xj Nvd$@?2>>3%t?>W= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/14.png new file mode 100644 index 0000000000000000000000000000000000000000..21a2a1d92dc0b4cc93807e957a9b9ce7504ddbf5 GIT binary patch literal 1075 zcmaJ=O-K|`93NY#@B<|Uu?{{)kP3IccGYHZ)!msjmt2u`!M(ZT%u@%QdE?BpT_r-) zO6eleHH7^`)A|fIbs*8t+Fb{T!wm0f(hqi$??}Oj(_y2gmH{a8Jv8?!X zF-1{ju}&pH<_d3|JWl?#J2{n1H8`5Wy=V|;R0mRF9SuMbGu0uOfT}(*_5!w0l&{`M zrf@3WC27cHR1d>sO`EVOs--P!tJ(;}U;qvoR*3$-{FDZU9-{ji<6PX9;jqy;>A>E} z?xZ$3qKP`))(Tp(5)m*VRzcPrwOlD1qW5$qvi6Qy8tg&vNQmA~Di!YmGIAhjWSaaM z9~3~d$nZ^^CuTz8O|#y4~)nE4>iq0w2Kq)DBphyyU7U~vI*#-aYrK;H(2L|vL)GpDn?Ec zq0xL7dxjB4?l7`}EPGwM0M7OqmX0#+xjjxiF2yVttCj|1N{A*ZjA7_fgyZB0F9sVU zvdr_*NSGI8F%XcIpdduUd`F(EAZ^@)7S40^BW`0su4f0+CXp5B7?+{m;UE+2l`R>C za}f&a9dPx+xdaMwS&|IvUG86(oj)QD@|K6zC7VO@LyI`xA=YjkoBK+h#r>EPPG&z2 z{L1Cpe66eN>+4{#H@7%{bLR8&%^Rhox4xve`(O79+_uegd(IK~R|fkb81POH(ydc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SUDLOI6E0yT9`UHI~y9hIyo9zI$IhW zJG+<|8M!(dy213i7J=- r**<%xKvRvfe*7!`AFKz08yFcLHFbW9?>zYol>I$j{an^LB{Ts5Xn}b8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/16.png new file mode 100644 index 0000000000000000000000000000000000000000..51651b6198c7df2162b515f2111963c505c8c5eb GIT binary patch literal 1067 zcmaJ=Pe>F|93IouG)baE=E2t}QsD0V+0|_ZH`$%hTxxAw7u_Jj*_pRGtut?$dA6$r ziFHVdSi+ljsYBEu=p3k!9_k_#bm$UU)TtyqBo%CL)LlDh1M~jz`@Y}z`@Qc?$NJ9H z)f}s#D5@^fE62%P@BY=5WNcb5C}e8D-AUY!(m1QwkP2xi1wq76hG85k+W6I1u#=+7 zTlGW|C!^;?6&YT|jq&CTi=Zj0vnyvQY6fDEg2TEQq}N_7&_LIM^k93Gjam{M(R(Ls z*gw&iP$x2~pwV5YL1#`R1O~(k$Qh%iBj$qiCa*}=?lD7y%@CXk(p#dE(HM}B4MDrN z!=rM39s~q0*TD+BzYXv#7hu=`!}&ZcC$b%)PXOB=O|scqT8zs*+quXtNRMD_i42p? zX1!UT7umxMCkO(=@(j;=NQB23H?flQm`-z%L57ZM>lW6L30y`cg~o7@CQ7$TFsu@- z>1?-&G>pk97Q=a2x1?fVH2VKg!ze{NI1YF8?n>+=#x2Oip@YV3m0Vo9*-d4Mk_{D% z>;yui#V*E15Jt`jvVbJHT{{I%4CtxQ8XE7U* zLy6q`)XY8R*9uipn7^(Lt$y71cJ%)0!9$Pz{M1sRP<8fGMH{FC)SEw8X=*N?p4_iB zR!@%3tUM{KEG?IP`LOo1j#O^21GD+%>W0Nz-!IiSw)7mH6q@8mFK*{+j~-a|U3ku3S&RiJut>doaObn| Ra+PtPZ=}0Veij~@`U_7jS=ayo literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/2.png new file mode 100644 index 0000000000000000000000000000000000000000..fd9ca0bb3a7b64b14de3c2324fa95a7dacd5463a GIT binary patch literal 1073 zcmaJ=Pe>F|93GXjO!3bl(u>1blH~5p?5OJuZn`_;=2C02F1QC1$C;;2I`hVvXFCdk zN?__n841xTj}e&N#2|xCLK)PpF4?I|7zlwRZEsdrJ7@!M-XFg2`~7*}o9Sr3QdCe; zKoCSxq)m$9xx^i(PU3&%c3Q?$IciOyPS}rFxrt#n)NbnNm*bt`hTddAE0d%1Bdw@DQw5bOhCtg4M!~nUtE8c8_E%l+rFvq#uL?()F8cynNWU|`2v*xHZYT~Fa> zu^5qpap!a2ZaUqZcVS{?GQ`|`^OTvGpP$buzqF9toqh?*W+PY6&w?N4Dq2n#RrWvp z@GM>YX?N>O@k;n{W02k*|5LWHv%SNGrsndV&oPC)-!^l(2YUYG?;8uLwVv12-*dz3 zUsGvPOgLkkOU~-@{ZhX0XU^H~C&7*B)rryygb1!wL an<(ie@>Y5XPe=N;`-mg0?b1@Hcj_;W4__Am literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/3.png new file mode 100644 index 0000000000000000000000000000000000000000..a62a37e578b6cab64dc7778735eb00c753f4fa64 GIT binary patch literal 1194 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SUI|xSQ;9eo0vK|I~y9hIyo9zI$IhW zJG+<|8M!(dy213i?URdY&i{IJI&@}O@Jy}3a*K_R9%n7n|Gl>E z-uucm7xT2&{xeW%ez7GoV_vE3#mep1T;=!mU0<2UIKAp}YLv+1uRp3*UuROhG|3<+ z<)b)r=D&n5E0^fm%sbf3;H~YjU*e{IgTQ9hzrHbZnp)cbO?J(kFO6VV=af<)_Du zXuS&dyLAbze?C|A7rvex^0el0&nA;Q%s$b+%c?mI7+91J>b+Z~t_~_aJYD@<);T3K F0RW6#o+|(V literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/4.png new file mode 100644 index 0000000000000000000000000000000000000000..236fc41eacffe260f3fb93d42fe56850a5afa8b9 GIT binary patch literal 1218 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SUI|xSQ;9eTbMdII~y9hIyo9zI$IhW zJG+<|8M!(dy213iA+P z|N8xToq()$|9^x`k`y{qe(U4jIr~y4Rvt)MCNwYUck=ST2j$}IPpuKUkYG@!xpK+N z(~2Lha-JEp3%2~4ez`3;?WKcsS@VL0wo=EKYnlBTLrQuz7>=;8siX_{sCBH_@nU)F ze-@wB6KngtPsXxQs|LgxG^?q3g z)2ZX*%iq0&z`xmP>-kjyOi!CJjq$u+g`?F6*2UngG6ossR81 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/5.png new file mode 100644 index 0000000000000000000000000000000000000000..78df1b23fdeecd797e2c0f178a8b43e3fc008816 GIT binary patch literal 1253 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SUI{`SX#Qe8k#yeI~y9hIyo9zI$IhW zJG+<|8M!(dy213iN@Uj$6rr@U6? zFfcHNdb&7lr6fA7rEt7o0-@4R*TzMKE-$usjNKUG>2FQ0ruVfjqo z!w-vd(-+*$(Y1H<`&?%oyo*U=>vfskH{wmJ7Z~IkgB}1js>rF3gZ`ADR%?lM=?~#&S{a`9n$akSy#hDrl z1o#a2ef+*Tvj3NSr5HCWZjD>0t)OervswvXCMAKH`wTBRyIN|$dp=Ewo6%rGOI1xA zYwOjt>6M*ll^AaJ_ov)Hmr`hzwOPZl@z+BE)~wZRmm77M&(_>A_v~Bpbz05+KDA|g z+E`Z|Uwk%1(D!6@(#FQc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SUI{`SX#QenwmN}I~y9hIyo9zI$IhW zJG+<|8M!(dy213i|LG`BKc8dv4z4}1M=z}5`DY9Wgz!U^x!jmqL15f;^dB7B31Wek;PPWWoU|@{& zba4!+xK%QFuNQNmK%bh4TJ$de#RQ9$6r{ z?Q}nbZ2aBQUyKYbA+A~{*%A*+HpU&j{kJrDa>fxugSCD)rm{=OXKnfUIQNIwq70+E z>#`rmmIYf%k-o!zP5X01{AqdafkymFh&e$Nw! z7CP9c*R16}(tdYqG2N>bD?077zDrkY&f2j%;Qz!aGFfFQ_Dnns{I&WU TPr3f{2Ngb^u6{1-oD!M<1OK;a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/7.png new file mode 100644 index 0000000000000000000000000000000000000000..0828a3639fcc09e0c01a379bcee281e00e1bd25f GIT binary patch literal 1161 zcmaJ>TWr%-7&fXXw5U@Ac^N|5sTmd3NNgu{t1*k6*4;u)rLR>m-+k_a1!6aVL_E-c+Q@d$Gs#vKuu}NHxOH=l+%#wXB z`o8bKobUKxU%I!caeX62QBBDmN`{O9|6N^AzHcqOP|5HnP84t!4dAlsKuXe4KLklr z9fTRE>XqR;u#=+dT8vx)7gDBm>E)4mGq>C8a0>hNc<#0I~M$RC^@jTD45hfA|5k$zXSXlK!mbo13>zEB0=}Z! zk4jjiNv5w#Fzsbo%Ux;{X&B?FHp7KkzoaTKmHL0EX)dE(oPn?N{ZC;xSFs_Jfi5aJ z8acRujeaOwkR7OEpI9}$XQCVq=L=qC$Q{^g1E1A&3Rj&S;E7j!sb}(%c zS%Hr65!8DeWP-)A1*3K@@tS%|T)lQK9W}WONrv$c_g{xy-69V1r_0tQi)Hgei#XmP z);<6SM#;7KJE=%H@80n&*LZV#;C_>&>}r*Q%Jtd0OP8iHeP?d%{Ceub)SoN1C2w^r zTP6Z;&*~@M>1{-%&o`96aW7t67yI$2I2&#MCp$B7DEN3hH@ScM`OL@7=Rc&!H%yl5 zch9T*FALTWcjo@$7d{&;oV?K@|2!;eySFwxdhjK0=8xycQ1h8@Ke%z~x1#mrw)brK zyGQQ_)~z&x$GrJtt750;9=_Yq3NEa8+FXBnwLKks@6f4Dr8QS7zjs~ho&LUe=k~Fn zb~s2+q*tDuzX`@Fbf4PM|{AA6{ue0Kjuc$hz W95~9|eQss_pF=W{R?cc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SUI{mxwx5{8kssdI~y9hIyo9zI$IhW zJG+<|8M!(dy213ik(EI#YmR75ICSce8UF)i&mB%KK~gR% zbAI)Hk3S}BkyoDfe`fu^xxI(4zqGs(R&wj%mfssozgBasb-Z75^U$Gc4A%Wl1M zy7;!`QT~2&_WA=WuXEq~plQf3_qauL0O#_CsQmELD@-4py>7#mlC%EgoAXTz&ilCf z)H(D&-oE*p)#;r}6ns{AJ$U)|aLK{@uk7!?>BFXF?85#Q{T5^?=iQlvp9eMas72oVDgT6UtJp* Z8MZ9e&ELGTF&R|+c)I$ztaD0e0syQi#Ek#| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/9.png new file mode 100644 index 0000000000000000000000000000000000000000..36a53fdbe4b3cb277a6a6e3d8471c1ef896b97ac GIT binary patch literal 1180 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SUI{mxwx5{nwdH|I~y9hIyo9zI$IhW zJG+<|8M!(dy213i$aTm;;EuJEfZ@`X1jR>_YZ}(JPHjz44QpC3wRNf80rSq*mV}iZEfb83 z@4Q<1U@r4Ry~dk&XU^^TR=oj2%wxnmyZss&RP#dA3DE$Zlc^>j-# z=PzNUm%JiYi#Zfto7T#S39si=Iq{;$^TU&yGf&-~YxQ{Nr4&%^4MEU>+se@|tG zl6|V@zJ?wrgQ@#B@+@cHHR&Ux(Fvm~J6of+uhqZ6yJ;_{&yz_44IBnHC&UHkOs^BN z<4xJ2Vq@)OpWdLV*z3nXW6jykHV3%&UXwU>R{wcrE5}ssNxm$Sl0S?tPIXzk-AnQR t)NL%rjRmt#>^GROTvAbbpPC(u1jCw{>s|FZ82Lcug{P~Z%Q~loCIAOZlU@J- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/jungle_moss.properties b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/jungle_moss.properties new file mode 100644 index 00000000..a6065533 --- /dev/null +++ b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/jungle_moss.properties @@ -0,0 +1,7 @@ +matchBlocks=minecraft:end_stone betterend:end_mycelium betterend:chorus_nylium betterend:end_moss betterend:endstone_dust betterend:amber_moss betterend:cave_moss betterend:crystal_moss betterend:shadow_grass betterend:pink_moss byg:ivis_phylium byg:vermilion_sculk +connectBlocks=betterend:jungle_moss +connect=block +method=overlay +layer=cutout +tiles=0-16 +faces=top \ No newline at end of file diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/0.png new file mode 100644 index 0000000000000000000000000000000000000000..0e8a30b81b4a02e6942277b9bda68a4e309a1fc6 GIT binary patch literal 1027 zcmaJ=O=#0l9FGo$h|?Ve-4F~JlL|Ip{aQlnT$cHJA`Lx3O-2+}v6G-=j4nE0VsR{| zEzW9!P7PltqoDH2IGKbFAR}}%sBvMQ zj0rRsWd%NbjpSJ_#;`Gl3k6wDWTRq8Ae$eBy*c`{n3dB_U)V}eC4_8|Vanw)T@KOE zDKeZO2n@?JJRih}pj)w!>IE%#prs%KS91&-8PFnqMYRAIP=dmd9;IN~ZCT50mI)V( z@l>1PXx2}u1yq#(Lrt@dc2O1_$NNuVH&?L%lLanZa5UVw=>gxBEhZhHBIx8GoNHBa zyaW++OVB2hNxy1CWMI;;bXaz;HaLnRW-J$}mIg9%g2F1aVd!F1N(o##5{gL4G{>c+ zA%RV&lGu)>Mp7|3)Z)reTQGrzT3r2@8}7*U$HBC*XBjxgeW0fuXp)VzMWb^pTt~eo zSMMAP-;vAUU>Lu-e>J;xg(t{AwnrBm?coO&o_Gh3w$$^{e;95?9?5y13y1akaM$3{ z%0r2r*?x5*$1OcN|GrwS1`Y@JL$%c(%WD~Td%ZaS<)ALbPi|CHZRcryt9IDEcWE=Q zy8re0xii&`Z|N5oW?nw2Kd9B#-%9VE9o)FP7XMw}y94{e`tHTE_kZDAEy%K&ZXkJ!#MO?m6$C zG?!AX?t@TtpZE4b2Ez%f!@*!5CbUwgR4sxZ6voi8Ztb=YQ|Xslr181h)O}cXaQD3M z`~CiJKW?(O=e_N%Z?sYrwLRM{=gIoA|85JA@2=&#N|qqb6mcIa!+54m*c8>7^lVidh8UFKpkXEGhd)l!z|a%) zp=gfF*=aarbdNc(Z>*=FjSXv}PAA_5ot{JlOo&zBnIo1fc?o)5S0a1=nx(-y1P>?Z z=SdZFy&#Po2%?M-()a^m5EB_*;KcBO{UFToF_w$5d?dv25+_Iz5o|m(iRS2KDK9G< zvB)Vw4`FOeEL*KsnQDYV&LGQ+qR4V#HXIHSM98gKSoK1d+ul%+p{qHDjSXZ0Ur{Zg z3Qo`@)8{3a_NJ`mZnTLsjP+ETZ_4%UVA>?I z3>{+>>WYI*uwJ%gG|wg4RBwZ;H_t_A%4JD1tUug;4ZCqg9OQ2|txFD@=7$z>yhE&g zQRFHVwWT#HcNM&!OHb?dWXs-@lc!SL(U}Wd3Ouz#DDS`W`T2Wa-MaqS-A}IGUb+4K z+clTK&5-;oyVgPiAJ~?NdwjkKg>EZ6#g{ z?!5X(@c#JNEa=!XN98Z=KK{7AmE9HIIdVarsxYhQOY6p?mHEDaa8Nk?!I322y=^kW zmA}}#wzRak_2~Fbz<_JNTEE}2*Z#=_MupLU0xqxqDYZmijm(~#o@n#LTHA@IYjfZo jdY-zoyt*(PI7ziov)4;!e_7?H{J%vu(<6VI8u;iL`E!^4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/10.png new file mode 100644 index 0000000000000000000000000000000000000000..8f2135402887dcaa01b8c3ef9096afa32ff02c94 GIT binary patch literal 1315 zcmaJ>ZA{#B9Ik9ZWJUSF0!);qkPRYSUyi$@m6ILUyK(9fgv+?7ag_GYQCP2CTXsD{ z#Dg%yn3<87fDuMa#F^m4eE~xjj39GF#LR@mO+^f5Sp-3sEp8%b@5Z4YhE3Z4OP=TX zy*+79b=8ry)B~vy1f_W@nHpnFkG(0$#y9s?lr@%Y&E?l>rA95pDgbiuQUgFdA{ziT zfaSv{u7ENK+H+9w`8B`yd76_%6C1;rbWt|g5L8yK%PiLdG^7CpgrFT=pPWJwfw!Y| z7BB9VouEmmY*RpOTa}M%YvCv!Eq?|n(`iFM1R9Iz;_;wL>vlA*OB?&xHHIQ_h}L39 z?jD8OM8N< z#s)dyVeF`(ViE+NwmNO4r7pr@sc^ap!c|d9;cl1HVzyXa4wsEFC%BBnwTd99CAfT? zOW6pL!guAy>>$cUWCke0Nx-`mNkrmh)57k#lS=8&%@KNW4T%S zr+T(8|Lv?I%U4-{zP9>f-nZHNXI8S9yRNLOM>B}jjTAg*^3_hq3oj2jDh{7nzP=#A zBh9lg{M^rh%>dN-%9I;VOPc&+adWA5?6+uVe_@nuPrpQiC;O9c4rJPIMrS@-jKbG1 z)@>fku|07iJNfYGlSvlSnZeWOI4L~ZU!FI5qoYS$?3ma$7O@oGIx#2CzqmCu`{71; z-kxk|<^Acpvqby7I|Gp(-#n6OCJ3TreU01uMTW-&g&)ayX<_LSbou+Py0ew4dBcO-g|rV2UWg$@H?owB6YBD zrr`5KNndB?hgoj+t?2MXfam#%+bh=Tef1;gQ*iTOZ?t1;Yar4)*sEcq&kp?+UHf1h gK0r4AvMC`ZaaaA!FD(XA`0h8p}KmY&$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/11.png new file mode 100644 index 0000000000000000000000000000000000000000..3e2f8e4f189a07db123ed4704f24df646a1fda65 GIT binary patch literal 1352 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SeZFnnj0Ef8k;&fyBQj~I$2m6xVbu; z8k?HAI=Y&>7{m0s zKcA=V)Gr?E^KVltem)d!=9q5~!7prYZhyG7db&i#&I-v8m8lXsre`F6G`zW|d|6WT z$P)>dpRN*@!bA+YK5!Vw?5=Ba42+rQ=;YAz@b>w9o?TqGczp8h_NG2~{3JCYIWhS} zMChRxwz`uphTZN;^gp=kzk)BLak6Cj)3rb4cWX=z40LK#%#4&)yDRO*iXpX<=eoxJ?e(S$6q66N@ouo zJ9X^B>+2qICQU|{m#?2M(Pe(sc+%trGvexN&MGLX@cI2dw5KUymIyNg6A!~zrzJ`^ SdarbV$~I3|KbLh*2~7Y;y6%Jk literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/12.png new file mode 100644 index 0000000000000000000000000000000000000000..7ac8e31f8e655ce4e62b0a2c065ac7ecaa6886f0 GIT binary patch literal 1473 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SeZFnnj0EfnwvT~yBQj~I$2m6xVbu; z8k?HAI=Y&>7{m0s{>md>-^6%Z7Yhk;Lv(IJOuU`8%AW?*slXYLn6=xPfG10u0p1IjAt^H2? zwqZg+nHwXYIi(4G3rKh}`C{_LW)@eKtam$J|J%JY+q!yp`k@sL8Q*!PTN^*G`9A0U zocEiu+t(HBPIA|gJpAK}xlUw?V^SGg+GNS9F!$7-X$2pbJinx|Ni4B)A@9SPD?ZFN zkekyGl2)#uRTnWma%0`os5iGlSR?n`uef}0j_T75+FIwn#if}s&f)P@n$q#$@{#n6 zhnfLNnu}j&$YrDoJ}mgYbwhKx--cJG?pECW(BjlH<>sb~YR_2^t2sfj z+corYYOwx$%c}=J_W$%N|K!N{rtI#&)8CgI%&sYy+kGy2mF*plBTU!s|44AW&wW1m z-md3D=_d|%T>5Y#`pABDg{NH0x>P+6U0rDAHu=;_rbRB7Ked}C7cFkwct>l+$7{yA zMy*!&S)b{|CTFnx{MPWT`uOcn*-DbV^D_P{`*7#&FMp`UGcWe*lI3Q$Mb*Rq`qzV zCRV;;^@Ou&hSt-Kgjg3bDn7O_+2|duy{+T+bOSw)>nF?pg-VyEb-#3RO>6KbLh*2~7YdQ8A$a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/13.png new file mode 100644 index 0000000000000000000000000000000000000000..7e146564e311807d1f5a2ba347924cd08aa669a6 GIT binary patch literal 1479 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SeZFHn>o4~8kjmcyBQj~I$2m6xVbu; z8k?HAI=Y&>7{m0s%%YKYI31@9C!96C%74lIplxS;bzQ?l#CZQ2egk{%h6TfMb)-E!miUJ8#cViyn^} zu~}=UWTz}$&Ghl8#Tx0gD?aAACf~KY(ewRX`QAml)^O?VZY%a*$K}3}`MtaQhNF8W z<=iEMUW!O%eLu8i(rLw2$A9F{UB8=!XU|@f6>VjvD^LE+&)D}|{7dbNvhE7G7vaa7 za+U7fT5hC0GhW!D_uTE%**kt@Mh65kd(G=Sd+7C-gah@{yEXlePDy5%nbW3udWGS? zk`k#ae=F)6ggN&$mMvUfvZYP$PoJPhyGB^n(>?l<#>c)}?Y$#gzd*I(*LsPCCt^A# zZsgySlW7?Jp#IK5n~Cfl`=ybH671Wn6P=D!-F@wWwr3RCm|LdiTTiqLZJf*hWUzonLlS;Ac~h%cN|x-uF(E z6wk1xmB{bhruRSmZQ|iWk<%uL`MayWo&Cl`Pxa=hBiU=&+<(_J*%+Hy_C48jPF(Z3 zQ1J(gyLYx;iE8>frK0RvW0Z&9f_00g^}k%sz|64UgPTQGi}gCFX!UgUb6Mw<&;$Ue CXDD+3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/14.png new file mode 100644 index 0000000000000000000000000000000000000000..db2cbf584e21b7ea9f65b5b029018dadd9e05cd3 GIT binary patch literal 1035 zcmaJ=O=#0l9M4u5ZfsE4rS)P=!4FvT(XQzdT4$TIwqWPz3hS|H^4f+jd0Fyi(&@z= z1o7s{o1Q%gJ9!XviXLQw7f%ibB8V_>F!dsX`qH(X2W#NveenDJ{vYr6?kz7}o0&R0 zMG(YHu^^Z69Q4PT3H(3zqpRR4jB-`90vpIxY(Qi*SO;X$P@13&6s@!V4x|Voa6zwB zQMGhkRG~pDK8E%T3$qC#wdh%j+6IWMgQjk#sl(?lDN@(c)M}!{mMjUh^uneMRyLO^ z>SkLNG-~k*nes#|U;w0$p0Q>+qL-$6x*}ft#|%aGAgG)XMwaAX-n>Tif~r*e^}9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/15.png new file mode 100644 index 0000000000000000000000000000000000000000..a9c0943b06bfa7bdd7294bf1a755225692fb0ecd GIT binary patch literal 1161 zcmaJ>ZD*5OsDNI6I`-bG51aU_7{cUikff z|Ci_Y+>!RS?RB+lY6*ga^@)Xh%0On;@E798*?$03y3UUNa)p^RaP?)YJ&I zBbZ`SrU(jJYrh3D{cTyLzenL!s^ufH*%7dS4v|v)g`-(&w~&?+ zi?Q%3LKP4)1%@dWi*zwSLo3g4JkK+%pYi*B7~!+~3?w@~!)~Z3NWfMs%|seBNLNwr zg1sn0;Y?qbpqopwhP~J(+%U$GO@^acx1nc&?H6C?OGGLX@_R0uxM{y;G|MQ(y)lT9Gd#qv-R3D;LOdeK3Fr#=2m?9!zs_?VP?J8`O&G*ZaC>}3|{rVJn-~h z!_E5D7aw`0xw!X6=Z9SFYz@11Z2v&CW7kMDw(a=LoomqZQ|+|J^YMfHt2{BVdpyC` zy+8KXtylLm=l&=U3~esU`&RxUfOSL5AAi?N&yRxP*-?4ti=*XZ55JuZP7A-&l%ak1e literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/16.png new file mode 100644 index 0000000000000000000000000000000000000000..03fb198badcf34014c5359792e1c7c6feac9564f GIT binary patch literal 1029 zcmaJ=O=#0l9FLoBGCI)1WZPvSgE7J8qg~r2EY2=zUBJxI6;=_{Gomb{p}+N^kS z%0S&|r+M+9;z>mh9>jx!7wZn*MeyK21Yw9Dco6GL*LEIO126A`-|zSTc)xdjcIISn z&tMNh5WUK@oWb*xki|DkU+4Nn6ol|yrI0hKiu5J>~(0jXG80c3z?EMKgG34-Vx zF|#?8Q%?yxv}i5B(7xqhHbG2G`i`bA0z~FP!L&tc`}qrsG!2oOkEyKcNT6s=S6nbx znaS#vMV&XO$>ZdNFJJ)+AdU2`CEF8xk*ezocpV%w6j_I$MUmP`DyPnp5_AC>qvK(n z8;g($p622#9~nDFMp!PvunC5XhFMNv<3f}t8y|(ExyFK!k<*P>cqdXtgdBlk%H=X$ zj?&OAFdWbG3>#r0kuXMty=5C|e%SVgn+h`Ubk}r{32ib^)bg-|L<(oRQ-bBRWNoj} zCfqQ_*BpkU*`TB*P*wjAwX7D}Lm9A}@1DY5cG&?;26(XK>iFUohJ#R!Ah|$8(9J@) z)a>GH5hCanp+ibi(6w=Lbl$WLSoV(AIjSlswudxZ2Z}6GScNuCLx{_40=JrrO-X5v zOHGaQY&s>yqOo`?nM%mfCRc`f$pSWNa*bVXq%AkFgXQ4JGH}gHz(~8$BI{)f=3co- zQaqXBl5O=GT%&z1Y+EjalVO6({pYfqN7zBZvSnSoX_+6`*zqp5cBT92HT*0}ik!^) z@A6-MKCHdntZq7=|MYcri)U9KKdY|QYPAA+gst9q!~XvD<7#r_bpL}}SLB!9KW(31 zUFnUjb-ceEy7}>b?Zd{Ctx08MY4hCIp?inVgtiXkxmWAI2KwXcc|zH@8VmK0?!Vi$ eHh7}1ljsN$`WD}MnhAx#DV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/2.png new file mode 100644 index 0000000000000000000000000000000000000000..c298da04becf15d56d5eaa7a65d74d94e4061619 GIT binary patch literal 1034 zcmaJ=&ui0A9M5nL9SprpRzZAZP956(XxDZLtFuj7S1@CAl~qJAP2SqLB`-_fY+5`_ z-39|MQ`G-JWT*#k;=u`CgrS$6)Pn~v^P=EssH-ns+j-awyu2TLKA-Q8_jyZWqZhh5 zk9JZN)s-2Mvt&N(j{_a#fBa`nB~t*W@^~Cg;JzLeLAO;0kG^{xN{ncw47O;gE|-~d zm_bgFM`X|~WV&cdC1cNKPX6&tcy=%QIiBNsQ>>xZ&M$$=_HP7a~z zW*5gw2qU+IY#>Q~*9O7q3B%G++3l}$6h+KfE>?I3?1VJ)YA?!LA`9z*e#c2 zO5oEGVNbmVSKlp{ZEj*uE=!VO{mcF5vYSW5LH@F3U9xGJA6mrm4zc!&?nl4Kv#4g| zM9%wI_+6_F@9Udex|QUvuRdv8=jWD}m)quJkoj{+yRWaVe0}+4?Z?Ka;^KphJMzBg z?&Ze^YYUt6fpwS*6pl>JJv-HRhu`S`#@*c73OudMe8%^#t~#4c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SeZE+SQuIwn3y^_yBQj~I$2m6xVbu; z8k?HAI=Y&>7{m0sj%4gi1;_yRr&6_5TU)S4Sy#34T_rKSQsZS?Z zEh)L=6^B{Xw43K%>K!`Ie~R;mI*a3h6VEI%U3!g#r|WL^>6-q4YlmRZo==CWm%eGz ziss(=-X^20BsedMk83mc70DB}4@y_%&6#*h|Aw@>NKRUbY58`@`h|Kr`?A5;%8bd;@gb~o551uDioUHx3vIVCg!0ANVt;s5{u literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/4.png new file mode 100644 index 0000000000000000000000000000000000000000..3d3195534acc38b4d38255f74b787edb46db2ac3 GIT binary patch literal 1330 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/7.png new file mode 100644 index 0000000000000000000000000000000000000000..faf95c266b3fd31023735e6adfc5ead16dd0e050 GIT binary patch literal 1209 zcmaJ>ZD<>19KS43*OAF&%qIKNhYRS&mU~H>q<18%O)lMHO{r;caa74A_awQs_p-aE zO(2v-Bw(-*z>ur>HJ_kxO-ms z{eJ(qA9rGK;NbRcySEVpu|0W6NaJ;f{cdf;-_CoMh!+n^WYLgTL>1A1M6aafAxJ7> z38tYaO&q%pBLv}mPR?XeHuVx;&=g9vF;rF2F`FPFJyl&Sj6ekPuq3Nda{2NV639}N zJRD3hDLoF$@}Wrs4owbZ3X>xRP9l2_fJl|c0t!STs4AnX$ycM~x-O6R_BBm{bqE@X zl8=+hrUpS=Gav|3Azy**@`Er(u_1=@ckKs$h7Hq9m}Ub$hUJ+MAK<{oL*i(LROHh_ z-$pEaijrl7be^Uwl?qh}P?}MqS&rjq#!vhGK8*006Dks`KGpO#6$EG&3|U9ArUF}0 z%xhyPO5#i(m!RmIvZ}e!CfqQ(D(W;#F?LB!U@Gzqntk&>o?l@VJx59A2;Y!#`F>8uY@xg_ZhJX>piv&Y$_!Gxhh{{K|u`hwi!v z$E(lCZBM^4e%JNwsY}0DC(fMr9GJ3VpE~+~E;UN|e7^j{(w7TYZ^Vv(3#r#u&Q8~+ zf2v>ZaCN@*a{b3|yo+ssG6S(XWOdT05Eg z@z0Fkt}E|$biRIay5s0f&6-+UJNb&x%L~Lb<(8bwX T@oSCm?Vm|9F(6!s<&OUYc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SeZGSTUfXn8kssdyBQj~I$2m6xVbu; z8k?HAI=Y&>7{m0s(N zT^vIyZuJDmdQ1+Ks5>{)&v(1!%wlDuwJ+EguLv-D<+Y+)Vb2Epf|*H6B~-7a#=68V za|wy!IsIjkJZFA)%L2Wo1@ekoi&xCayPUhrH+cE$FShJri4u15^7p^b{k-pe`MmFy zaTi0vR(oB~b1u>9T6n?0=(4fE{CO_3Gq-h2{IMl9 zI?*(5UX<7qtH6*ALRVvXAJxqbKX~BX>QE&EJFfD1+_CdscioS<|9doP`xCi#r#Y`4uumM>RIG&EK9zHR5!Qe|cNk6 zlk$$BO3%QwpZ|`t*KpSzpZhBNRI2_3$8J%Dr3Wem+^hY#%;w1*oH@7Gs&UiD3h#vz z7gfIwm@TyYbiZcV)LYA+L~-rv-?EzX@We}#rZ&HQ?PWN3M&y+5hfKZR_5awI`Zeu@ z?@{Tkib-wHG?kYgSa#_V_sYPc_N$G@*Z)?W&ueqM;0C{9iy7zY=JWbWwX}uZqJPnp2Zgh zSdPyWKDqEw%!OMe>b!3K0cn#>674Mczh$T8h25TEnS9akk5~f3O)u#kUX9m_L1nY2 LtDnm{r-UW|B+5uc literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/9.png new file mode 100644 index 0000000000000000000000000000000000000000..87bb5c5039c055f52b4c65ce9d41c5519197b0a6 GIT binary patch literal 1222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SeZGSTUfXnnwdH|yBQj~I$2m6xVbu; z8k?HAI=Y&>7{m0s46xz|wZT z?aR^schy=A^m^ucZBp!E4a@v5dgO@&O9e|q+{A<*f8H89e|W?4D7kTF=gfr(&b*6z zIz$e??$4KSdZsc-M9ioD-@n8arFy^qzrSx^5Hd-IZOdH8o*rwlTbpgki^-eK27)>- z`v>&s)suG-+~_XzPtc1uuOgm=VSVY^&Vx1Z@_z97e7-;4=k3*N_hzQAPE!;$V=UMZ$R|Jk?6bOl$Mcm=KDt{p*Y(M2r?4Bu`;3)=4X<4_w4DuzK?}CMK%u{X*r$Q#D)ef>p(*h1O-OSIsBXeiW0+%oFvTM z0RqPtS+2rIuj%mt95Mw)VprI=?QDHpKm5V&jsd+tLP_-)0S5#G03)PCq^SYSV zs`}!Ht0QO2hXEdO-Ba$|L~d#aKO~WL7E-@)*`p)kpmaI5F4>ID4+G-(h*&$fe+`gl@xag*8_Ac}alc>A+<3P4T;P21W7_jqi7h@jM|-54znt$3Hq`Gb zE?Qee5JYioHy_7yi9J>p;{S&EpCX>hQC$maf^8@x8i1&kVJjeGs@M+VK$NqGAAul2 zEU!`$EvQANid=x8ju7=bsTQGuj6egB z9;eqKu{AEz7jUv(Cg7^sO1c=9T}bvqcAW4xR@KrVh1j%LVhT%3u45D3tWi*~sj7~wFp8WJssW>(}BcwkC~q9X-rq^&5n!ZZp|IMd%H zsQQwuW-hh~H;lGKoo1bkT~ZDx2>*ww>Jr*SaquVKe+rw4tPbcnFk#w|@Wr)N*r9YT zVgM0ABLQJ5*Tse;M9@q^os2~6uKCI8W<`@>#@xKX5dR&gqd%=uWB z3A=fpCme~gY+X3)4SS+>UY6y(?nsoc&2f1srB$Gz99RCs_2=c=@Qvt)jtVaFTT+V@XMA{l=N&Gtp3{1cBlE0H$Qt*sj-5SBUg{!>eV0a^)~yjJ$*8#db$VZ z_|>aEFFP=KjL`OVWJ`tTKi2JPEIoLR?UT=6PW6ccqoc{P!oH0$wWM|EtsH=E`^3zOfH$@6Jl+t3Gv2 xjm&Sm{?b1*Q@G_4GgNW>@x+6Ptrxlq%7~qVwSlhT?Pu(V9jmM7$HRxZe*u-{Yw!R7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/10.png new file mode 100644 index 0000000000000000000000000000000000000000..effc7384d42c41911dd51a6ed5d9c192a71aeafd GIT binary patch literal 1196 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SeY9-85tS7Ihr~-yBQj~Iysp+nYy`} z85+8n89TeVIKuS0H{644~kr*$c704QxJ#=Pr5)3Jn^UI0aJVtFljsR z-ulbHz$oMC;uunKYfiBD>1GF>GppA2FA~#{yV6`G`2T;t&`~GNB-alU&vRD%)_W%- zVzzs-r&{3p>)kIMrlo$V+yC6xt=H%Bl+Bg%JT+Zk?+TJ=`%+`) zDJx%RBe&)KZkG4ot$7bSobj2Kdh+r6@80WPd)b^X{#9e=#N@;*Ubrwfn)O<0q)Nm8 zg&w7`%O}|OC0o5$Qk>#w>Kdq`I>*BM7k_A|=bCldev?`*o20smH?nNY_4Z%z%!u(p zrJQx2@?XOe4xYmk>JDh?HWkW<$~2vgVqti4m{XVO{&z{gU8o Pfyxh0S3j3^P6c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SeYBTm>4;_8k;&fyBQj~Iysp+nYy`} z85+8n89TeVIKuS0!)?Txa;u@z3JR{-$d*f7E78J^4ZoWC; zd8NuFlhE4x#R_w#r3T*Kwq%OZWs{!;vDddmt-VoiA@ibaw;@a6rc5cmJ9*oEWZN2z z6X$9Rg@$sb@E@MAu)(s=*)@=($u)3E0dGjt-@5(JznWXi^}q3+^hDk5OiF8!gZng{ z(=4@#MLT1%wCk?zNUK!x4tYJ@@nX za$RsaaqauxdeaZ;46B-^Fz$?7f4|?5gX!AApEcKJA6k<+Dah%5mG2RDe+mAq?YC=r ce{vWw^v|5;r|VgB6jY*ky85}Sb4q9e0R8x;;Q#;t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/12.png new file mode 100644 index 0000000000000000000000000000000000000000..0b74ea003300af061b564dd05482165b10f59d1f GIT binary patch literal 1276 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SeYBTm>4;_nwvT~yBQj~Iysp+nYy`} z85+8n89TeVIKuS00!ReeLbbuH8*LJQm%s zp7*uKcmI9y9TL56H{O=*h|yaSqLr~VYDe7qioJ0hO%DI>zAu+Z{!n9gF>m|Dmn8{z zoTYl%?!Dixw)(18-*IIZmPCnH4-Y?VsM@>k=f{ekzjf;sShnb-9IV=F=2B}TH|xP| zL!;Sek8Sv!V9>BW)!9fn`%9JW-X{L~rTdf2W@qNv&G(*`Y9zyV^ughT=BTyHj1_11 zGfEW7c#F7N$w#vth+6%5LC{i$bI&&~beghLgrWJ%N*B$Bw9T3_2`?orIIl*8DE;_i zuy@1VysJ}7-t#xxoPWAK^55qJNgECB=7sC}3cOx2AwSn}rjN*6g+0sdXQ*@rR7-XA zdfb2CtjO?niB9IMq@6LVj%~l~yS;bvHK*&nrLKV)^O&DJy7{tXmHhI{oU5;THO7=r pP<#KP@o$(=hxYm2)MkA~HiixL8#%V{eq{!gN1m>JF6*2UngB}S$PEAh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/13.png new file mode 100644 index 0000000000000000000000000000000000000000..bb1198e4b8df5a5a1a528e4d41a093675fc7ae33 GIT binary patch literal 1293 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SeY9EL&w6@z|_gv&Ct-*$;r&g)Xmk* z(9p%q*xAj+5vJEAKe;qFHLnDwHwB^B5T{;Ha>y+J+U$~Alv$RV;#QQOs{r=4RVFsK z7`m7kIl5ZnG!Lpb1)EzSdL41<)dxC89~8Mrkqr|9rXUa#o^*j6c;ZjZ1E%;QVA5VR zb(JIo17oeHi(^Q|ttpc&`ws>1w7hlS@qV*|h=cR_|NrGX+M1XY9XfuuZU4FE?6lqa zcU?T+Y_v7L_Oas4^UpiKRM|$Zzg}cFUv;jZ_tKz=r=Kdl{~jH*a!T#)yLpRNeX82K zBxQmoa$n{&z z^%I?NGiTYFVH;;^MgVvt8;%``wiHN3C6>*;c%ROPjgLrJhm2^y~%`g>`rHW~=Nl zNcnRx;en+6PIliptePKH*}Ns=*FXOtqd&)Bm)Y#I3aXDvZJ#`zug}QFu*%`qCZ@AX QnL!1Vr>mdKI;Vst0MrW3V*mgE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/14.png new file mode 100644 index 0000000000000000000000000000000000000000..eab2989c8444d9e99e7657b9efc46573af39117b GIT binary patch literal 999 zcmaJ=O=#0l91l~ZOb3FXC`cb~pbl)l`n80{xhCyaFm-g5^)SRNd2Pd%yexUO*}Uk6 z1J5ETUPYLQpjQPyZe9d$qBn1XBB;2FIA6N9^I#3UybpfA-~Z$N-i?{^)X4C$VTNHw zO4C|}&Ih9r+eiQL@7o5Qj*>!+%;Gv}8$MztExdq0$uSzJf(&bA`8CQh%$^f=wMJ_C zIoZSxYeX0}bUeytnA}9@8RjA)U;#C3SAk!jK8L`z6gZdGdEHY{)1F@S(d=ruYOXGt zk_9KufLth30S6HSgwB#1$e{u|x-wly#~cJ52w7C%PEs{}2B_FaAkAhHrjQarR$_$= zFNvwsK;(ri$7eYqncxMP&&Wv$bU#R=`Bq)7XvJI125Krc~cDv2ClPvZdoFGXO z$BUdOCMY5ithmGo6K*itQ_xUg`nE@G?1D(qSimi!K$_`J369s7b%So3Xv4VB@Hm0x zqmp_+UH?DSar)?hRM2j|{}c|YD<0x1D8Mb>q!(8ojY4^{>LY_-zl!lvuZuHHOmNV| z9#GY&YvbV5ob6h;9gKB2x-OU8fEcccN}2+x3TxYzoE2$z#?z^EUM&hjA)n9W)5StY z5VTBEEozfJu7=H)gIv<%TD#ozKyG9Q$D@%obLFy$R`hPz%?1bcURW$$A5g&FYG^ldp_7| mw0^z(@M`L$H?$p_A3DImkGYLcPcB}Mo?fX?)*j_At^EP}raV0W literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/15.png new file mode 100644 index 0000000000000000000000000000000000000000..e888cb2d8a6f3843eecc974bc6543d2de160b1c1 GIT binary patch literal 1094 zcmaJ=Pe>F|93Dwb6h#R7cX1jeOxvBA)!lU_S95oEbEA=MUD6Igu_mO@ZLQACsnd!w#)Xd8I*{_uU@@6Y?*xk%%I zg1nu11VI#p8-ysHi|mn`ga5_fmnA&yK*1K&1lv$TG67Mqz*azpH7O3FKvGg&Pe2Vp zY}&2HT2PC4h?k+}lx&PMsTr6}5H)p4Ly|iHB3nUR)qT{Ldk-m6ReV&lTVzBd0NT}t z9uqY6G{)qf4w+M^x>~X($zuTxAc;(Bow~&*ebkCBkJt7wO_3`Q)ZwF6lWGwoWB{6g zbUQr`nXPh>Ue3vS7|vC-mvk|#mu9>)Tj^j}p7HRN9J%&UIGU-n@lheP77OouR69Zj zPt%D+!kMUaLNiXY9LLd&i*~sj7~!x|I+BtO-6}~d2*8p})j%rLNn25Bh26+U;Y?Rc z(2R9i-CAoCZWx`E44QQ^c1dZVDE=R+Y3pbUMZreC{}i@jDFe_^V8L!v#uwLCVuv#L zfC(f7%@~B8=`KdvA%a#rG{``}?pifj)~xCZOjvtXIHJghbqh(l48nqs!YWQxRd}xp zccHh&8wMn@nqCn<0_eR@n+=GI2qc$+`le6eS{rkFW0S$H|ypHI(EE?txY`6If$Rd zL|CYgC0~CY+?U_a6!ph@vrDh`4V9lh@@siH94QjAgI_ON+onG9!xdMkQ%@I%kCo5P zEewrs?R_hc#HYK?SBZD_=3iLYzx~X&iP4II+@%L4v#!Nd;bh_1_)Kb~wfqJnZkhTy zaIK+saABY{JUwp!cyfns3$QlB)G$(VfCJ2=QbH+wC^jj&sju3t(SpIy z@Swo)(Utl@UH?DSaR%ssl+by;7YYaET@S$$3h<6^(#F-6qEMck^N~TYU&grAuVS%* z2@V?A1G!vOwPkQ^%XTf?4z71Ox-J*ofEccc3aY|V70$LTIV~pA0U7fSH5osNhtH3WPM%qF4-XD*C-$eV qj6L~QpMrdGLYtmXZhQ00%r>)lxVrx8#hu5|yDQ{3)R)=q2Y&$s#5)`S literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/2.png new file mode 100644 index 0000000000000000000000000000000000000000..fe25e341bb8aeba759fa7cfd3f8acf727b52bfb5 GIT binary patch literal 1001 zcmaJ=PiWIn91ad-P6{5pYy*8}Iu&e^m#*!SEsi#6UBS%RRaQNjC9iGVk{6RVoAopX z&Iy7C5fl&J#FMBX_z!m$6+Gxg@!~}fg9%Q~sorlf9%lpIkeZN2NdsinXPQ-fp zdKiX@6~?t9o%ckednf(x|M|zDQ!mMt$rP@Ty5S=xW8oPD3XV}lMPyhD7hj`MhUpr# zOJ!2lPs%2CI3vPvq2p0D!;FrFo?*@+0%lOvb`^I0#VQMIOJS#zx}bY1s@dZWA5AqT zN@io$lq`1aI2a9OD&QbufY6z9136UKrmjra(J{}0CWOo?>_$>$eG;hHM;XuegEi(0-Fi|!P*Mu;c#e7#=h>In|} zRUS%`#0w%XigAjF2MaDS!nhj@v=uZIn7-{18@nJNp*AK#FKH-z|lM(t?NhA`0-lZ_uHD7S z8YVcXVGpQk)U{!7WZHHuTn~;mIl3+v+<+Lai3*y+QWeg&EjbMnnPD+6B(rKB!dy0+ z$|m!<6ogtTq2{$ro2y}S-a#&DbFED-+?E^J!SQHh4f*yZWaWMAfM(gUy=5*?$R;#t zTfG+7+A^0WH?u95r^)cq<^FTo?IY@-XxXtY-E_>4To~g-KA?cmj?T_wbj1Zhu??$f7q{94!!yE`rYZu*MqSu&lY$8+O@dyQ2zGz30hp4 zyVF>|yYKyumzQrJVDDe3PMvu=a;w+8_W1L4ri(fCaqqe1k>z{Q<16GQvc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SeY9dJ6agInV32`yBQj~Iysp+nYy`} z85+8n89TeVIKuS0LYHsG_}hkF z<>8z5ys{=XJfWv?k%odS>y*@!0tvI!*77rN__Z(n_daJ4SA}kdci*k&FXL=WwBY+t zJ3s$6+w#ktx3;mWU205}h`DSsAvMy6*>h4uG2ivqp*$B#Wu3VLnH3qtw)IDGFzQX` zUcbsKrrChU@p@@M=+_;++i&-ZyE+CQGx%FNL51^w+z)-`^Uo(+_AwXA2)q2+*z~`O zJ9Czhtm2RJ@10L?vZ$)Jo3Gir{(AS``}qqNIx+m}+_qyKcjUB*#~)iX<=$TMrTo{2 zdp74w`XU_^s%_+!WW-))Iq2+jbCb>&iK)ll&04n5cFrLM4u$i@uihyiU|7uCv~=?& R6HQP#;_2$=vd$@?2>^2ioVox2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/4.png new file mode 100644 index 0000000000000000000000000000000000000000..b1d245878141b314c2f52c649ffd364b778e2f0c GIT binary patch literal 1207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SeY9dJ6agIS(rLGyBQj~Iysp+nYy`} z85+8n89TeVIKuS0c4gU3LGEm_6LSu)tXQeD;_Aa@cr+r z(|emf|6H>yvnhz{mwamEy5I+u^S-7s|ERHZ`}g=`L#X((%3}`;4t)N(0t_g$s)#hcg5n=y(k*|gzij?a?(?Xww;q;vGG zQ~0vxub7k-IX&pn*DA+JZVl%c-+i~Xke1P_a!RgGYkm9diO`f~nr(>&Th}u%GyG2K VO@6h&@eQab@pScbS?83{1OWIYr8ocp literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/5.png new file mode 100644 index 0000000000000000000000000000000000000000..dd439534958228f74f1df3e88be26c42db6a3604 GIT binary patch literal 1288 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SeYAI7#O=+7@9gcyBQj~Iysp+nYy`} z85+8n89TeVIKuS0N@Uj$6rZi}`l zGB7Y!c)B=-RNR^pynP*$qrm4gvX&h&3S0{uJNo|r7gS*p>1dkcxTLaT>E+k=-p+p4 zv{&x7_Th&Yjy*QCIQ}?L!1!v`)wuQIE-Z->PTzmqb{$gGutiL|#Y+COQ7bV78yZL_qk~TKHU!k>P z&a>CQ|GKRVS;X~G)nfj6r}yiwYnyN|O?a|j_~Dn`{4=uc=9|YCEDSLC)~@2^F3DN^ zb#B_`P9L?;*-B?Mrk~bZWMQy4PH+0V3%~#JrK-yJx1XLW`1dNS+<_I95xeh}shr|7 z5URTPwoKOAb4NPM68kfDQ@wVI`Kbxt%-ep>`sXS0bpoNY)~YD(K3MUxq~!Mx`KzC- zcRM&eEM2zv;?hU%+j{N^_$*)9m-bmUeBJfeGtNKvyW7ve%y9G5<;ocC6YoG}lc%en J%Q~loCICc$(|rH{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/6.png new file mode 100644 index 0000000000000000000000000000000000000000..aff99fbb485cfac25741ca96477191aa4f0e387a GIT binary patch literal 1284 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 Date: Thu, 21 Jan 2021 15:19:37 +0300 Subject: [PATCH 207/463] Texture compression --- .../textures/block/blooming_cooksonia.png | Bin 1797 -> 222 bytes .../textures/block/blooming_cooksonia_e.png | Bin 1885 -> 141 bytes .../textures/block/blossom_berry_flower.png | Bin 407 -> 249 bytes .../textures/block/blossom_berry_fruit.png | Bin 218 -> 146 bytes .../textures/block/blossom_berry_seed_0.png | Bin 226 -> 150 bytes .../textures/block/blossom_berry_seed_1.png | Bin 263 -> 168 bytes .../textures/block/blossom_berry_seed_2.png | Bin 304 -> 184 bytes .../textures/block/blossom_berry_stem.png | Bin 240 -> 149 bytes .../textures/block/chorus_nylium_path_top.png | Bin 711 -> 711 bytes .../betterend/textures/block/chorus_plant.png | Bin 712 -> 712 bytes .../textures/block/creeping_moss_spores_e.png | Bin 1609 -> 259 bytes .../textures/block/crystal_moss_path_top.png | Bin 617 -> 617 bytes .../textures/block/dense_emerald_ice.png | Bin 235 -> 235 bytes .../textures/block/dense_vine_bottom_e.png | Bin 1564 -> 223 bytes .../textures/block/end_lotus_center_2_e.png | Bin 1609 -> 233 bytes .../textures/block/end_lotus_center_e.png | Bin 1617 -> 238 bytes .../textures/block/end_moss_side.png | Bin 645 -> 645 bytes .../textures/block/end_mycelium_path_top.png | Bin 548 -> 548 bytes .../textures/block/flavolite_pillar_side.png | Bin 606 -> 606 bytes .../block/flavolite_runed_active_1.png | Bin 719 -> 719 bytes .../betterend/textures/block/fracturn.png | Bin 1803 -> 233 bytes .../betterend/textures/block/fracturn_e.png | Bin 1881 -> 136 bytes .../textures/block/inactive_brimstone.png | Bin 223 -> 223 bytes .../textures/block/jellyshroom_trapdoor.png | Bin 626 -> 626 bytes .../textures/block/jungle_moss_top.png | Bin 228 -> 228 bytes .../betterend/textures/block/lumecorn_0.png | Bin 254 -> 172 bytes .../betterend/textures/block/lumecorn_0_e.png | Bin 1414 -> 105 bytes .../betterend/textures/block/lumecorn_1.png | Bin 266 -> 179 bytes .../betterend/textures/block/lumecorn_1_e.png | Bin 1414 -> 105 bytes .../betterend/textures/block/lumecorn_2.png | Bin 335 -> 200 bytes .../betterend/textures/block/lumecorn_2_e.png | Bin 1451 -> 125 bytes .../betterend/textures/block/lumecorn_3.png | Bin 352 -> 213 bytes .../betterend/textures/block/lumecorn_3_e.png | Bin 1471 -> 137 bytes .../textures/block/lumecorn_big_petal.png | Bin 1623 -> 432 bytes .../textures/block/lumecorn_leaf_1.png | Bin 1950 -> 243 bytes .../textures/block/lumecorn_leaf_2.png | Bin 1231 -> 234 bytes .../textures/block/lumecorn_light_1.png | Bin 1197 -> 300 bytes .../textures/block/lumecorn_light_bottom.png | Bin 385 -> 248 bytes .../block/lumecorn_light_bottom_e.png | Bin 385 -> 248 bytes .../textures/block/lumecorn_light_middle.png | Bin 1102 -> 171 bytes .../block/lumecorn_light_middle_e.png | Bin 1102 -> 171 bytes .../textures/block/lumecorn_light_top.png | Bin 1484 -> 151 bytes .../textures/block/lumecorn_light_top_e.png | Bin 1484 -> 151 bytes .../block/lumecorn_light_top_middle.png | Bin 348 -> 234 bytes .../block/lumecorn_light_top_middle_e.png | Bin 348 -> 234 bytes .../textures/block/lumecorn_roots.png | Bin 2101 -> 189 bytes .../textures/block/lumecorn_stem.png | Bin 1858 -> 177 bytes .../mossy_glowshroom_stripped_log_side_2.png | Bin 682 -> 682 bytes .../mossy_glowshroom_stripped_log_top.png | Bin 726 -> 726 bytes .../textures/block/nightshade_moss.png | Bin 1929 -> 376 bytes .../block/pythadendron_stripped_log_top.png | Bin 507 -> 507 bytes .../betterend/textures/block/salteago.png | Bin 2113 -> 292 bytes .../textures/block/silk_moth_nest_front.png | Bin 265 -> 265 bytes .../textures/block/silk_moth_nest_top.png | Bin 252 -> 252 bytes .../textures/block/sulphuric_rock.png | Bin 241 -> 241 bytes .../textures/block/thallasium_bars.png | Bin 437 -> 234 bytes .../textures/block/thallasium_bars_top.png | Bin 272 -> 170 bytes .../textures/block/thallasium_block.png | Bin 430 -> 275 bytes .../textures/block/thallasium_chandelier.png | Bin 543 -> 346 bytes .../block/thallasium_chandelier_ceil.png | Bin 390 -> 240 bytes .../block/thallasium_chandelier_e.png | Bin 1452 -> 138 bytes .../block/thallasium_chandelier_wall.png | Bin 376 -> 245 bytes .../block/thallasium_chandelier_wall_e.png | Bin 1467 -> 150 bytes .../textures/block/thallasium_door_bottom.png | Bin 527 -> 315 bytes .../textures/block/thallasium_door_side.png | Bin 237 -> 155 bytes .../textures/block/thallasium_door_top.png | Bin 556 -> 340 bytes .../textures/block/thallasium_ore.png | Bin 611 -> 316 bytes .../textures/block/thallasium_tile.png | Bin 475 -> 318 bytes .../textures/block/thallasium_trapdoor.png | Bin 558 -> 314 bytes .../twisted_umbrella_moss_sporophyte_e.png | Bin 1519 -> 158 bytes .../block/umbrella_moss_sporophyte_e.png | Bin 1551 -> 249 bytes .../textures/block/vaiolush_fern.png | Bin 2145 -> 270 bytes .../betterend/textures/block/violecite.png | Bin 237 -> 237 bytes .../textures/entity/cubozoa/cubozoa.png | Bin 2502 -> 595 bytes .../textures/entity/cubozoa/cubozoa_glow.png | Bin 2530 -> 626 bytes .../entity/cubozoa/cubozoa_sulphur.png | Bin 2085 -> 533 bytes .../entity/cubozoa/cubozoa_sulphur_glow.png | Bin 2676 -> 532 bytes .../textures/entity/end_fish/end_fish_0.png | Bin 2563 -> 681 bytes .../entity/end_fish/end_fish_0_glow.png | Bin 2033 -> 226 bytes .../textures/entity/end_fish/end_fish_1.png | Bin 2571 -> 682 bytes .../entity/end_fish/end_fish_1_glow.png | Bin 2178 -> 226 bytes .../textures/entity/end_fish/end_fish_2.png | Bin 2667 -> 452 bytes .../entity/end_fish/end_fish_2_glow.png | Bin 2244 -> 201 bytes .../textures/entity/end_fish/end_fish_3.png | Bin 2715 -> 480 bytes .../entity/end_fish/end_fish_3_glow.png | Bin 2347 -> 216 bytes .../textures/entity/end_fish/end_fish_4.png | Bin 2715 -> 477 bytes .../entity/end_fish/end_fish_4_glow.png | Bin 2347 -> 217 bytes .../textures/entity/end_fish/end_fish_5.png | Bin 2561 -> 689 bytes .../entity/end_fish/end_fish_5_glow.png | Bin 2179 -> 226 bytes .../textures/entity/end_fish/end_fish_6.png | Bin 2572 -> 680 bytes .../entity/end_fish/end_fish_6_glow.png | Bin 3524 -> 226 bytes .../textures/entity/end_fish/end_fish_7.png | Bin 2569 -> 675 bytes .../entity/end_fish/end_fish_7_glow.png | Bin 3522 -> 226 bytes .../textures/entity/end_slime/end_slime.png | Bin 4976 -> 3243 bytes .../entity/end_slime/end_slime_amber.png | Bin 4447 -> 2118 bytes .../entity/end_slime/end_slime_amber_glow.png | Bin 2524 -> 689 bytes .../entity/end_slime/end_slime_lake.png | Bin 6056 -> 3190 bytes .../entity/end_slime/end_slime_lake_glow.png | Bin 2320 -> 437 bytes .../textures/entity/eternal_crystal.png | Bin 1690 -> 314 bytes .../betterend/textures/entity/silk_moth.png | Bin 2350 -> 692 bytes .../eternal_ritual/portal_frame_full.png | Bin 5249 -> 3378 bytes .../eternal_ritual/portal_structure.png | Bin 4956 -> 3151 bytes .../images/eternal_ritual/ritual_finished.png | Bin 11641 -> 7186 bytes .../infusion_ritual/infusion_ritual_full.png | Bin 3121 -> 2081 bytes .../infusion_ritual/infusion_ritual_start.png | Bin 2093 -> 1494 bytes .../infusion_ritual/ritual_finished.png | Bin 2405 -> 1466 bytes .../images/infusion_ritual/ritual_ready.png | Bin 2989 -> 1817 bytes .../images/infusion_ritual/ritual_started.png | Bin 3734 -> 2171 bytes .../infusion_ritual/ritual_structure.png | Bin 2318 -> 1344 bytes .../betterend/textures/item/aeternium_axe.png | Bin 462 -> 401 bytes .../textures/item/aeternium_axe_head.png | Bin 355 -> 305 bytes .../textures/item/aeternium_hammer.png | Bin 530 -> 426 bytes .../textures/item/aeternium_hammer_head.png | Bin 435 -> 373 bytes .../betterend/textures/item/aeternium_hoe.png | Bin 446 -> 338 bytes .../textures/item/aeternium_hoe_head.png | Bin 300 -> 275 bytes .../textures/item/aeternium_pickaxe.png | Bin 557 -> 456 bytes .../textures/item/aeternium_pickaxe_head.png | Bin 423 -> 371 bytes .../textures/item/aeternium_shovel.png | Bin 376 -> 303 bytes .../textures/item/aeternium_shovel_head.png | Bin 262 -> 222 bytes .../textures/item/aeternium_sword.png | Bin 629 -> 570 bytes .../textures/item/aeternium_sword_blade.png | Bin 359 -> 329 bytes .../textures/item/aeternium_sword_handle.png | Bin 439 -> 378 bytes .../betterend/textures/item/blossom_berry.png | Bin 370 -> 240 bytes .../textures/item/blossom_berry_seed.png | Bin 327 -> 194 bytes .../textures/item/leather_stripe.png | Bin 332 -> 204 bytes .../textures/item/leather_wrapped_stick.png | Bin 316 -> 180 bytes .../betterend/textures/item/lumecorn_rod.png | Bin 378 -> 237 bytes .../betterend/textures/item/lumecorn_seed.png | Bin 1591 -> 231 bytes .../betterend/textures/item/silk_fiber.png | Bin 395 -> 227 bytes .../textures/item/thallasium_axe.png | Bin 2002 -> 224 bytes .../textures/item/thallasium_chandelier.png | Bin 366 -> 228 bytes .../textures/item/thallasium_door.png | Bin 450 -> 272 bytes .../textures/item/thallasium_hoe.png | Bin 1965 -> 221 bytes .../textures/item/thallasium_ingot.png | Bin 341 -> 214 bytes .../textures/item/thallasium_pickaxe.png | Bin 2034 -> 262 bytes .../textures/item/thallasium_shovel.png | Bin 1944 -> 202 bytes .../textures/item/thallasium_sword.png | Bin 2024 -> 258 bytes .../textures/minimap/entities/cubozoa.png | Bin 1814 -> 297 bytes .../textures/minimap/entities/dragonfly.png | Bin 1860 -> 402 bytes .../textures/minimap/entities/end_fish.png | Bin 2040 -> 396 bytes .../textures/minimap/entities/end_slime.png | Bin 2048 -> 581 bytes .../minimap/entities/shadow_walker.png | Bin 1619 -> 276 bytes .../textures/minimap/entities/silk_moth.png | Bin 1648 -> 266 bytes .../textures/mob_effect/end_veil.png | Bin 841 -> 672 bytes .../model/armor/crystalite_layer_1.png | Bin 2064 -> 1604 bytes .../model/armor/crystalite_layer_2.png | Bin 641 -> 463 bytes .../armor/crystalite_overlay_layer_1.png | Bin 563 -> 353 bytes .../armor/crystalite_overlay_layer_2.png | Bin 252 -> 170 bytes .../betterend/textures/particle/firefly.png | Bin 1486 -> 133 bytes .../assets/betterend/textures/sky/stars.png | Bin 355 -> 229 bytes 150 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/betterend/textures/block/blooming_cooksonia.png b/src/main/resources/assets/betterend/textures/block/blooming_cooksonia.png index 673ee47c2130861828cedc1eeb39038a036ad0a9..4cc6d5d8f060114a3206b37b87e97667189ff4d9 100644 GIT binary patch delta 194 zcmV;z06qVO4&DKfB!8tzL_t(|+GF_t|33pI7(x&MR(|^azw*U96vcQAK-U0byIj0U zyaDJMtQR$4C?x0wWK9IUfUE$JV+LeKzo z#n=plg%ME(V6z<-MsNerqX=8Tp{oJO!41F`MSAsdIHM6}Fgx4;T%imy1Y3B(3`Pk9 wbiaZ$t7iG(brp&M=(d40gD|={G9RQD0O^gMC*fSwNOQ*wpq{Y%|ucgT$r8P zcfRlYFXx|^Murb{ZSLO8Fih9bU}}_}?+K2McKW~jw<@5gPG|6#$1q#A1xJW^?d%SQ z2`^ijaeq90Scjx207OhIREiEoGfZz^#Q|^v`>cs`mThp?=Pz-rg$!;inwHW|66dYK zX%`=z9?rn&38*2i?=iNwqEmt*_5oWd7Hm(i7+j54r`N$_kz;ERf5PDU13`8?J;El5 zi`l3UXwf@^%lp2g zi(_OLZe2ds@zz9rI@(qqUt%p!_ zTC}#;NE1z%SOJbG3sMkL4TxY1=ak$+O&mcH7jO~VzDKcg3+v>GPrN+219j{58UdQx zbh@Rnu9sr5CE@u4lQfJ*Le@olnJEX0qu3)Q7vh0QYO^PZ#?g~520n2!gcO>E8fjW) zlgXek3HISJ%SNQ^J+f*IP5~bqoFXYQEg7#!89A;?iY`a?N)cU>>d-VnR(5JVs2tOk z#2P5=8U%cBS1^KlmbgVgW44MQhegNEacnD-dXf}~ONFVsNXr(`lg5n12>wS(0q#XaK#-kAQ*iwv z%8m8qJf@`oQT)2PN3wnyxVS$@bGMQH67S^S1Cw`izmaOzZLQ~iO+Wrm_l@MhJg{?^ zPEe5x;t_*cQ!kD9@2b__t(r?sI30GuWoydPo7SAhHl=py6yCRd?kb(&Uk|1FGl@^( zt!lNeZQ!}_w#T2jxpL{o<@xH5)345a;e7W^`NZeqQ}FFYi@A6rIlo7~wmg=5=;JM4 zp6XuN_DdLrr9WOja(zd~ROr`Dv+ZY2#jEGuTYBq<+lR_sC!a*(!uB`!esuo63!(S7 zFFx`75_7NLkDguJ+S~or!psAg-;hF^4(>V7*>Pq6%S>2nGfuu6-g&Wmc4zO_+2pSF z-+#Kg((~7@V_lyeujmV}d?G{z^VZ7EwzJ;~4}SRP?eE>gb&|M}={{UTn6>kLV|WA=FNnJmsO qubM9+DBF9a#ptw&Yo>zMm14$;6-~9f+|HsV# z#@g!3^K%Pxk|fR7S8D6x{X}`6Iw_vd{5HVibvj+SnoH7|C(HYU^wG_yBhBhh(tCuQn7%Xv2=YjFpT80% zl=t!r2iC9}E|{GoF9`f9Lw@}eXq>~>3<}DWIg9$ z(Zd;AYKhn#r@qvO>Cf@@qtu6nrw1YMC=CF_rUtMcIKVWS2{AJ?TQ?`(AEh4JNOvdo z_?YU)!69v&w3s+SRps&hIbL;+gdXze-}~!-^+zqw&QYnUhpTY-@4z`L(m9+Ghj%%g zb`9|{?K> zJ$-F|@7KG33~s;vMfl^#w=ds3@tOI<_h-JH`{cs&zs%CvZ_ur0)w7kE_rHGUqIjI@ pNc-m%v~c5e_rr}lKfO0gC24Qr*3a|2?vxF%zPwu7f9Z|ue*+U=RkHv9 diff --git a/src/main/resources/assets/betterend/textures/block/blossom_berry_flower.png b/src/main/resources/assets/betterend/textures/block/blossom_berry_flower.png index 050d776af6c0cd96653820db53aef7a9e8f13f29..ba9f2ee44ecb000ca6c3e452a6b7ba0fc1a48b4b 100644 GIT binary patch delta 221 zcmV<303!dF1Ni}vB!2{FK}|sb0I`n?{9y$E006K_L_t(|+GF_t|33pRyeo9se-Or} z2B+egULF50X6y%J5F3{|xFAe1OaVyK)4FSL17PCF>M#s|X@Dt!i6Lu*sX;LSn<3Z? zK-Y}b0Az(A8kvpme7FH1Kcf2+qyZ+5Y%?r;U;&F^GYo?itXA@y2B(o-fNUVv00gmN znnCg~1CYH0Hvpd(KpK&4$La;D1R}0z#1^Gk4ZxL<&<((ukZ>hsD0W3*G zK~y+TrIRsALs1Y#-AX>06-a~8xxY$3hyDRH| zg+)B3|LCFv2!vqt@f!Qf_plsnAC~vGQ5g&$%jV)n@L5M^O$T6gts4Rs2_(Z2%X7|% z0#u@+3A4aAG`ho0bO0=p-HiD*jkp6ZDbGp5?bA)1y^DN5;PmdSs_u_2n+wztki6Vk zDxW`JvF~i{HXYav1)C8h6`5>T0F63WF?WRib1%-iw~pXT%x^&#c3`aY++RVVZpOJ_ zMikIJyR^X~XnoET9q7hlP7{dbrwyWjFOfy;e82?xtb_mO-?@}uVsGuM>lLR_00000 LNkvXXu0mjfQY)kP diff --git a/src/main/resources/assets/betterend/textures/block/blossom_berry_fruit.png b/src/main/resources/assets/betterend/textures/block/blossom_berry_fruit.png index 9ecf7a6741f4f53e2154d9ae17f77eade5831f8e..4e45aec2b463f693c918aeb26764bbffa236aad8 100644 GIT binary patch delta 117 zcmV-*0E++G0g?fbByI#}K}|sb0I`n?{9y$E002ozL_t(|+G9B9xAXt)l#_4_;%|3Y z{2vGyh`|gXP48>&fibcnBpHB?Niu+9FMu?lW0DL2DMr`4)@TOt1`w-o)PPX~Xleie X?&SH1H(uCH00000NkvXXu0mjfhcqqc delta 175 zcmV;g08syu0onnOBnkm@Qb$4nuFf3kks%X*32;bRa{vGi!vFvd!vV){sAK>D0B=b| zK~y+TV?5`#^FObc00Rtse)WOj<)>E+9{Xb$p+a~86G*d&geVw;0EjQnCkAE{1DHU> zn-{Oam>j?aaxyZ2d4X5}b^%Be43i3&&}{?pzkT`&D0C!15 zK~y+TWBmXBKLaIz2}+X00ih`z@^Ls|DV-g$C~Cb3;-zx;oV`&!5Tnp5ixOw zH?LlT<eIgnb_qb lK^Sis@bR!iS-1cL0|5O!Q5l_%)ZYLA002ovPDHLkV1n?GNhAOO diff --git a/src/main/resources/assets/betterend/textures/block/blossom_berry_seed_1.png b/src/main/resources/assets/betterend/textures/block/blossom_berry_seed_1.png index 15eec1178839b332031ba6e594334c0e6dad30b7..fe5bdee0fcd9994fe2c9a144623c57e6c588fcb4 100644 GIT binary patch delta 140 zcmV;70CWF`0;mCyB!2{FK}|sb0I`n?{9y$E003V}L_t(|oMZU^|33pIm?F)i1`J69 zE@tfi|FrJfe}V>p6oD{E1F}YBF}w!s3SIUerU{t_i4*MwkYW&?P#XFl#wIHa<~7Fr u-#8^3t7h680CGM^GsqCK3?QT#gaI!a_)x;(PD0Gvrg zK~y+TWBmXBKLaIz2}+Xa+2Z3NQbj@H# z05Sj{p4S-jf8&&FAQQVhZDV0#S=fJJVSa|UZ$CmsFacfz6y?RhniK05WBMHo7#IMK WpKU`*aw~oS0000D0L4i} zK~y+TWBmXBKLaIz2}+XpV4#gR3_0M2v(G6Y0$ zKhfF7kXW}ELn92}3`CG^AkD(U{7@0>0B?=?o1%SYe0V2DzMY}c-X;w zY=B@oc>DGvUT;vGknkEXzbW=V$oBgWUqMAM0bT=Onqgsq2^bgvX4OnEgU{gq00000 LNkvXXu0mjf$)9d< diff --git a/src/main/resources/assets/betterend/textures/block/blossom_berry_stem.png b/src/main/resources/assets/betterend/textures/block/blossom_berry_stem.png index cc5ef7aabfbdcbff9128c33e0d6fc2ce4a52983c..de1ecd70e4bad6aeb1c0ac593e4204293bf4bd9a 100644 GIT binary patch delta 120 zcmV-;0EhqZ0hIxeByj|1K}|sb0I`n?{9y$E002x$L_t(|+GF_t|33pIm|++jP?zHK ze_mtE|BX|!|AW{R833Yj8G_e-*kAw^%DxmO%2ki}@$O{w)B1i+-(MWMRAjWp8 a7ytka(A>cxSMQ+!0000D0EJ0J zK~y+TWBmXBKLaIz2}+X<2HpUiVNjpy`(Hs;fI(Q8pW*CV_~7vehPQ7&f?a{j5WFrR#t?#DKsN*(P#g;c4M2_!kSovuUIWlIgS>(; z9-RbTfKM|B;4}bcJ0XDA1%zw|0fJt@4;UB#HbG1olTF+J00000NkvXXu0mjf?*>Cl diff --git a/src/main/resources/assets/betterend/textures/block/chorus_nylium_path_top.png b/src/main/resources/assets/betterend/textures/block/chorus_nylium_path_top.png index dc0ea52d69cb503b32b8556f0a2113af9f32086a..459a3d637c68bdcc8559fc11c0ceded27b65341b 100644 GIT binary patch delta 29 jcmX@kdYpBF7GvB-?H(op-j;G<1|aZs^>bP0l+XkKfNuyn delta 29 jcmX@kdYpBF7UQjr+C5AHTiL^BGXR07tDnm{r-UW|lWYk{ diff --git a/src/main/resources/assets/betterend/textures/block/chorus_plant.png b/src/main/resources/assets/betterend/textures/block/chorus_plant.png index 2bf9e6f223652cd03dfdf7ff91fcef5d9a8bc91c..756dae1e12c722629c9b10f6a8b16b57d9c7e699 100644 GIT binary patch delta 29 jcmX@XdV+O=7UQjr+PzEyMb_C{O^CK^FL7(hadg%-=yOiaRwCc`u5+s{1J-c$he#TqY};$XFy`;)&Gg1r*ZmO z@X7!G1j7IuuCYB0rsePcCe8qu26Vo|slWdnFCfAQu0ZAus$kP_8Gs%}V8Z6fzyAtH ze&RI%IgFB#!Uz&|OTPa1*z)c_vEi|*>M&{;RJK1OS~FGyut|_)z!vqBBpCoxPqqti h8UVuo{{17#005lDAvvb+|X{Kr1P2B}INz)BoHBB=+b9Q%{ojKE) z+3apwO|gYi>O&Q@r35NINTA|_U@5k+P}^EjfdaEgLvNLjP>jA|C!sih^GyD>}8W6+S;A5hB!ObK@css zm1N3FC0+s&Qaz%K($G^(=e-O0=00dLXnCrP<#CeHlasgPKiwz zaL+_vQkoc(!ZOvpgX}5+OrSzbBui>uGeJq9s=NTNonwX~s}O5Upn4pEWGXR0MvwtX zzb8OToR24iVGkEz!@RGP}cqdRf%hCbE z6pKYq(d$7*mf^zTFvIc;&(jz|n`O-sOSEQgX)r{gDH)1xDM%w7Mlp>FmOx=mYbL0A zlU6h9Zo&>@N}|qi9@a6b3Y4WLPA?ews&H9iU>>SavrLTTnpi!DEM(@;1E`zV_XxnQ zO(dE!?yHNcHbt0L?>IK2?vVSU&16}J%pf#T!H{6@I979uV~q|X1{5u1BoWFt0yWT3 znT$l7z=X(cdlgMaMf174-oU76L4o2~p2H!dc`nIuz!v~4_dM$bEL(#nkgR0N4}g04 zd!RULWYH4;6)a02gA7%~HY=)_g^aFcDYEHF5J7olV8K{BZ&iy#0>m}b5;Y0NqXLD^ z_9%)Bpf4l^Whm2$=g^`h7V57t+Cg{&q55G5zU1xj)v3uUT)tUR;_YP7{1#H9Za?i$QQ z8LKE7uqTVX^L` z3zOWf4-ZAA+TPq@%cH}Kj}Og$b=-X*I5O%#^2oj)zW;T_ZMf%mK6?Bl{p$4f^-`Mv z@7R53*UV&zYiqfS*Oz=}-mR>xbblP0NlkyU{pir}BHe!Un``@R?#j+3+O>Pbl{=sH zulwL9X18m0=@;AX48DHz+quIxS~l-$T|Tw;i60;PeCvMuP`wBS3j3^P6Ir)Q delta 28 icmaFO_?mG-86)Gw@)Ut|hCk04fWXt$&t;ucLK6UzZV8zH diff --git a/src/main/resources/assets/betterend/textures/block/dense_vine_bottom_e.png b/src/main/resources/assets/betterend/textures/block/dense_vine_bottom_e.png index b95b56ecacdc574e241ad59fc3f55910dff9c1f5..8cb58d0944e71b4956415533b926b518f331304d 100644 GIT binary patch delta 195 zcmV;!06hPk4Br8eB!8w!L_t(|+GF_t|33pIm|@fa8XB;)=+6J0rO*G9ZNUEWm;W#H zek9L;9fi;S-2k!c_%-UUB_ioXLjeX0NR|2x73BpLAkd)=S^Fg*I)#HXYM;+@2M4FA^u x`~SD`?|%>t;*%B&&NspM{~n<8VQd@*005f}1K!U#CdL2&002ovPDHLkV1feoYRmut literal 1564 zcmbVMTWB0r7@k^FwVR}h7q&jw(}~4+nfu=6*lFDErrCvV4CzASQ$0I#c6XAUIpfT1 zb`u1v7HvR$5rv3~A{3;h4I+XFjX_MsPzv@zEMh_NK@=)BzDVtOW^c3-Zyh*uZr}O- z`@b+TJ~puR-mMJ74CHg!Njl#ij$60T|BlN6qSI|o?g@`!B6o&k6Z85TQHHtsvRRz+ zrwaR_PAnc7q=fmV>g=4NT0zzDB+4}YwV?umswyM8hbEa5DQKQSIykKix13? z7xnoWT{YN|Jz#eeQUVM62sEvl?ZKwTws;|3hsOd7S`dFmW7DBPFjbfU8RB9P=M$VR z#bl6Fc_|^Pa_kWxi&9b$lY*phq6EbRR8-LUSSrmm%5XBfuOo}@G`8yd4itn&qro>6 zp12i3QdLzDWkHrXir~CC+eb~#_J+C)S?uYq>G&qGLCAGq!!T7dpM`=)>^_1UBESLVcYj8R_bA$D)EU|C4WQRyS`2Ub#0;0ld+*L zmemvC`J=PcjE+M#M0>?K2Md$fBXw8Dqq9`aq0kx!W?YPX;uZ<1bptigRT*S5VPH~V z_@HSUq~Sey%^RFWKGs-SlqDK6PL_(21miI%OAm_*6vZ~QKn$}yw;?nRW8!sCnl%RU z(Z7NX9hQk}A!@T}p$ZlpyTXE=Ct-%vh)V@i?Ua@lg#ygmo{wxD=d&71&E`$hfHF!Y z%932-k|j09sY23$i?Xj z_11sMD1quPgw@zKMfj_gt-EU~w+pB3AYAtP5Z&}T8MbNra%rF1Id<#>?Q!Sw*>o|r zre6tykj4HBD42sfpGluwO@Wb zE4(oC%IWXweM27}S^wa-ZAX6(4z2I_^u=42qp2SjSEgS*uPzKeA6$88fB#FT7Nd8q ze-ur9yCfftECml-h=8-t*jLBiN%P{o X_p(n9-e0>E_V4`Yc=qJpC!hNhZ`J~P diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_center_2_e.png b/src/main/resources/assets/betterend/textures/block/end_lotus_center_2_e.png index a031b4e9c8e287d7c003e2d4ed006a43448ffd61..0bb66e458586fddddc8ddc49fa134b2480fc1817 100644 GIT binary patch delta 205 zcmV;;05bo{4Cw)oB!93;L_t(|+O?4}3Iah4Md$vFr|<|?p1|J1!oo&uEEbj(wTb+J zH+;rrvj`TS3`zc*Or}IcS<-oYhqS*vst)&OkUI{qWwWFvnTUQCBn7xZQPL#DvgQex z{j694UU2b7YIC3pU_lfxD%amg-E$3qkw$X8;cJP0TMuAqK1MQX-{^l!6DFOrB^L~g z_Y=U){Wqn6-F0fl9;VtVfD0o^0h`kh+simB)lxv#@OQum!5&|ZHK6<;00000NkvXX Hu0mjf>vUWF literal 1609 zcmbVMTWl0n7#y}=f<_^NLNFRM=|iKf@uBg-06rLvCYXrTq**bIu_SnAFB35J#w2IX z?K|Ip|9AEEKD5fW-bWC`s$?SGkLMO=cvj;7-4`!Qc=8&FCoF=vaji41BMwfkBZw6j z)zqLpC_VyYr1>QUWuU*L85m6votsOBBo9NI%)p$gN2!IWX^K>pD77spvZ4`#c{MR+ z!hx~glsq;pM-*yv7ui_?m_UQJM3%IIZh=yis`3K7c8(c}tU~PJDAnx7X?2ua|{=WL>QK5c%H@x+A8a|RHAjOwZRaFmTanqtstRD~-t0}D`tx@}=B=VFaKvXPZXe?#qFUnKy$ zRuo+s%j%+Ot_aKS8O3JQ9kMLiN|g=B^g|1cm@@1c#cH-X))*jWLdiyE3ZX(HP<;)R z$ym$@Ob5APo2o0QXl=aW4U9`Rj8Z(yb2wx)&!spH1Op(@v56G`%hsSGQq*jDS!fUl z>{U>lHHu_Q{|Z)QkVU2@VVhM=%0b4^a}?=%62wpenOHE^PN-@jiXf?5wxr828IMxf zY`>~1Adn4b1vwzmvVeaP7!c@8B#@;8VI><5@jNfUOyhkV$s`TkK;#l
    4Mk{aC$b57cOjd5B5>A>1{X zg|c>0GGTWPd+Wbs6od6=oNBC@!u-|B>fIHU+koSC;4Ixfgg0&{gF0?sChk+c&5J|0 z$6ZRsyHg!=M+QFeeabeAQ@eN1jFV%xZ2xTH@v}q2_y<-}rgv%!h|7cPwprdte2z`X%4Jhra!y z;(aXHl-m14`e@hL1LuzY>bYy~kJdH)YhLiSw`ZE3BCmh1X)E>Y2j9HdHpzEZzI=BF z8*lr3X4fmTZR~5_%*y0+sAXbOiy5b9=Swdi*f6?j?G2t=i7j`ICl4t0sxe*cWX@%=skfn)DZ)dhNpWSpf)1)z|e)rFd{%V(M#tkwcqq@*;MmDV-m8_ z!14Y9sJVTn6mVZ1zQ1S#D`!&xDjMr|2DmN;zb*HnaF%D_K1;I!Pdvdj)i0V?l>h($ M07*qoM6N<$g5qUeG5`Po literal 1617 zcmbVMduSVV9KS-^b)B1IYr%F7j~mXFF1bgZ_am{5NxEcRYHWk6osM4aeo2nz?swi@ zo3w(Ib-LDp{!;NkvVOZA?WZiH+;cHu_B0$iUUzp^mlo&Nqz0$cfZ%? z_xZlRlZozK>l<1c2!dE2i-vpfywMuXFe9r0YUPauij<`QwbvbI;#vr1<>;sm zdq=yI;^?5rOH}*aq`v?#fdWl|EGRkE0EGZmX!+HweJ4 zjmN7pR@FsOsv-C^zjMdy`S)+lF4h0kGNrZBhKqV?F zlcA6m7$3P~udGTaZ?s%VM@?AlH~Nrs!%uJ zTsJ^*)<}XW{3}=zK^p0bfNho)Ap>bm%}`|3lOTk0NXLS)cFv*}@i>U7hAF5bjD-Uf zHrpY~5|F%1+9Ragc3zTLyU4qoc7YXHJ7j#4JMHFEg4b7hA4cMk72L{u>3_bzSC?^d z3Avl*u}aR$3J{eI9IugbQS`!x%d4DB783yoqLttQO0*&iC8~TZ-?RrxwD~N=r2i1^ z63jqpGcV{cn8DuqFBwH+{b{QjOQz6&wX%43UFBBbxE)x_Y9GRzYA1s#ZeKd?Q_EeS z?I(yDTPz$*`pzHk?P_?ZaPx93;xJlc|;d6jGbdc)y8Q&+b<(fJT>q+7|S7T-Jd(YfU(ZAaM6yBdGl zTejn?c25mFJ zkAeTtg_Bnfyg0wyzpnn$z`*I+6R&*uf`|NxTKn4%0~3qq9>4Vq<-V;O{HLYuZ1eYz zf~m`qOS4U5!T!YPLNsx8AKi8FU~r!QG(CNC@tZgADoieKUz6J1QhUZW{Kzpz=9lKa oTsV6B$`#wYzj{5*U$y^eJNV%2OJe`{8msBYBHiIr_Y55P6P8yQ*#H0l diff --git a/src/main/resources/assets/betterend/textures/block/end_moss_side.png b/src/main/resources/assets/betterend/textures/block/end_moss_side.png index 6a3288128c75ec0382abbc581ea3d145b3203aa1..26a0031be203ea4a88626c6b28784d5ce5fb6ed5 100644 GIT binary patch delta 29 jcmZo=ZDpOH#Td6y+lxuS{CLx01|aZs^>bP0l+XkKeJ}`{ delta 29 jcmZo=ZDpOH#dvF@wilBC+Z>r63_#%N>gTe~DWM4fe_#lT diff --git a/src/main/resources/assets/betterend/textures/block/end_mycelium_path_top.png b/src/main/resources/assets/betterend/textures/block/end_mycelium_path_top.png index efd16c00ee064df829cf751684098b3172412268..14f7385b8a9bfcc215c36ae151118e2eed60671d 100644 GIT binary patch delta 29 jcmZ3&vV>)V7UQjr+AkRen0IO&VgLe9S3j3^P6)V79-MHFaUw4tDnm{r-UW|i_-~M diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_pillar_side.png b/src/main/resources/assets/betterend/textures/block/flavolite_pillar_side.png index b550c4db2b6d66414ce9c46ef6d36bac6708380f..0aad4be7d947c268b7f1259502044e2c5c871b4c 100644 GIT binary patch delta 575 zcmV-F0>J&=1l|OYDt}%jQpt|gFch?(m)J>X5yN3-#0U+H_;Wsk6A}V(U`{<;K;p!z z>F#uA@lG`y;y8}0URAxvciY#xyL|Zc_U`2?USE9Kez?ARHeB9*zJJ$sPll`KU$-A` zZf-Xh*Z1$=ytuui;5`xNoQg1bt?SCTnC4|&mz1JbS}D!Qv(-q~nrvvv;mA7X6%J0K>TZ1xwDY zD?$ieHOn&VN{{1XfkLgYqJ9Wb2|;Z)0E22x(^Zv`QYp#X zwmlt3h>%j|l(n%60V&0Z$wEkgYpsoGAYh)RB5LnFz?)5Wrw(X$@9y1E1q@>hU zP0l$wH^IB*2y@Vl9V~$%F@XjHgI3`7j40+4HEoYKZv4+4E&&6J4}mc*(P1GF5n}Ax zPU>2sSxku9+D-oyM8+6o0+`WCD2xz;7+W{6hw&oS(BtnP2p0+P5)lQs5m;SYXrVk| z_~5PYhd9#_g46eJ52P?D=ng0=aqe`^2oAr|rxYCH4BP-?9M8Nt{smC)V{U)!Icxv` N002ovPDHLkV1n})5X}Gp delta 575 zcmV-F0>J&=1l|OYDu3D~Qpt`JF%-0)m$tjpix>_wBSvUo#GmsSoRAQR19Qr70f`f< zCP^o~c&7r9+U>Yq^{VPUzT3Xm-Q~llw|6gJ@%rM+_QUnnv*Ggg^ZmQ7doo--|GNEn zb91}7xW0e?=EdzD1@DPC=TwBjYh72y#WXMLx}+4f(n@JYCV!V=t<_o)7c!=tb6S_R zuu?MfA!}XXGftOv0V7vdkccsoRCGE{C?JG%Zb~r$tIWpK4R)%sZ9fPpMRB<>B03xn z#8`ITp?VCVZkkFf>|*f1R(4ZTbnEIvB97{%Fiy6vAsv^To4s>|vFPU%0~p5LFIaMJ z9d|z&ToS<$)_;GNNi566SP??#s#%su=t2uLYLOcp`{Tx)Gi0|E0i6;XTd0p4u-loG1LJckDc(w0g%;s_pu zwj`+QhZN4rfw4_n83U20!yo)*jHT#lJnV7A35&!tj(_`g+M@{|Yug@r;4!E3Pf4k( znw)cVZi08q5$2#9J6HlkVgd~Y2CcyD8Bxq9YT6!e-1wh8Tml9b9|B`sigRg1gc!TF zle(5@789bjcGEuvkue6D0A{oj3M0fI#?}q&VZ2B+^!WP+!bJkSL_`5@1XkA;S}0E# zK6vZ<;W%`J;Pn0511U@jx&z8eoI9N}g2QL@DFw$k12@1J$1`t^e*sYMV{Xvm%bNfI N002ovPDHLkV1haw3M2pk diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_1.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_1.png index 804be8bb5a10550cf11b14a11e15531fd7ef425f..62d6cbade51805a6b58a801b7f731ad661247617 100644 GIT binary patch delta 689 zcmV;i0#5zU1Vb z5^^Hm03i|(AQo#^;<7?Wtc~Z=)7^Ed58oI3;agwE5mm+AskP$nq?B-XYORO}B0>m( zAOazPD*G2dqU*Bo*Dv1@V}>BuG{XuaLe#`OPt;mTDHEFpcYnj(xP1B+FYkUv-JKXS zH&1UVV}%afB35Q%GobdG6(i*q$&u#riZcF7*Y*tkfR<9Ii*eo;>bc^dP&fReJJOf81W}gH z@6djM;7rqm0Dk~Xr!&jG5JXt3u|8IOEtnbOt0V3!R%TBBJg}S!Q5981=Xpl8rERwy z?q`NtiK@iZF@5ly`8YG)pJAHFO$!Umrz4&Bm>H_7M2T#+J8E|(Mnz&Gra=Ar7FlL^ z|5sEM_m$Li!+c0Pc>82q6T{ z#{<${k((Am#7n`S{fSLR+qN`q2f+UEo~nWE8#`1L4KXs?MBfCWfLX!n#CqD(e)BF( z2*`)OQ_OI8DuvYweYjwrXXJD^kaJ7g4lL`QYKAQfg%fKvf+*HF?oKsBHW0!}@D&k3 zhs_2w5PzakWu$)g1LeFRA+UV<6Y=sIYT@+p_l&0p+R&g`kem?_bgdQDfXhOEvtwPH z^?pQ~hSWu3K7e)%`GRnmNL^yH+Ypn|HZAJzTwK4&W_!szSIRPTG29SUsnsAt%7zXt z-ObyGKq(_-I#Ab&j(`8g%NNf{DPd-a2&dzbCn`^_7|$bSMvM_FMnCkJ8Ko2ea?bn@ Xj;2MG!?#Mn-16x@UTanH54B3@i-303R0{At4Ne%MW4V z;A8Oz2;qPLv5a;l9xH?dJxo8UD=Q-_F?t}pYeXn++!L)7N-$ z_XApM#rw$3(_8Xbpo3~2%L(5MsQt}?5n_u(Pjh)i9{-|idxm~MbIz36IPEg!l&L3= z_=v_0-a2{>qQqiVquxy;R4@l{WpT327rF{4+`uQ7ZHR}6! zgwJkqqRgM%p@01ht};y%!edRx6Z0^X(Bc)%#e-;y4quAsH)<{vs!N`-3jj%@c|zk z<%?TnPVn|mk1;QVrXvmkN5wgZIOiyN1`(RBqt*oxp?_!tIAYV%uY0@*>J{w=f}U;H zTG9UiIUV*$dv#vZd1}tocYnhsqitK7wgX`Iu%)PD{mSNi1Lr--Ci=$V1WB^ObtOVn9nH3FaYK)kOc${Fqu$*VE{-Y$Y78hUIRc1 z3_G*_qdOhhTUZT%DMWWZEL@OXh1CFQ7(XmKDGcvc19WAXhaS`^wbCwCm4;O z0Cd>1@jrTM1c`%ONH7|8s$#Kv0a+Zc0jgPkSPeiHM>YTe$HuQkjQ+wq00000NkvXX Hu0mjfqS8!8 literal 1803 zcmbVNZD`zN9M4%cX1C&oP-m z1k0(@+FmtHBw<_;IGhmXgOJKVsMm4Mn42$)L!Co;WFg!42v(?LogDVDm&13Uu0P%& zKvJ7d*EKfvVp(+w&+i^5VN?^cDcZ|SIEWiS9v*Xb)ICmY?hB%El%$J*kKGK$`C6g+ zYnJI`GAK-(e(Z>8LtOCouiJxCz(*=0@}fXW#)^DKkQ822gvbFtqVRkLn#RyHCN_f# zvJ#OtKuOm?;Di4JLtQbjYXK6oX@M-_96QU<^-L;BoX0K^Chj6-7wNRpYkNMhb<~?u z84`BbG@+s!dQ6K*kVS|`tSCg|tR@E0@J3vQqG)Jspte7S^|7G1!Tw60L#z{ye^g^} zF(Qb(!Nw6XSUnbnEQpCw(&NU0}U6Z_OAith9a0LmYq{-2kB+G0x262GMABl{e{fTPQ#e+FfPzpw0*~)!XJK z`PhJDbeuo^xTUBlp9(&@YK|wYwxzG^zkd(&aEVvZ+7zUl+G{C4mK?O^7bWbeCfh! zY31UhqtB%Zdyj>l|NY7X_r)j0wOfDeegBh7&&j|!>GEm&(=*G7?}n!L!)wFY__H0a?@^zg`s}aiMDy?zT>b%m-W>k5>zhXgo*h5!aTR`a5v%4R8Lu&n^@r58z(YZ%m4rY diff --git a/src/main/resources/assets/betterend/textures/block/fracturn_e.png b/src/main/resources/assets/betterend/textures/block/fracturn_e.png index e772127795e0e857fcfadb3c55b533e465177dbe..3e739d5b4973e269a36b0713431eacfa6f0638a7 100644 GIT binary patch delta 107 zcmV-x0F?jP4u}DeBxFxXL_t(|+GF_t|33pIn1Ln+to-!-KSc((T)au10mRshu7+rv zVH(lZ5FJ>!3}>KuG!hCIf(i-62w71_Q5fKjMq>Oa|sQKb~KY6y*O?f9w%?do-@Unkvd;PvqA_%KIOjRFuL; zL3=G*Yrc%B2#bUXj~54FEYXT`W^oV`y3RAz$5R$FC+EN}+U2C?~sz|t6 zE>?63OGvexBCG%hm7Y@(fR+I)1DZO37*w$7sN*)u!|3<> z#lBe-NymVW;}`%L2FajlrL{enG1O~F|H<@WFlz`(VH}?HIb}Vt9fH= z_4N55Vxpfuvu_Tsk&L?<0tm{M=?Ju;g#p6Qd={7(fDyDQSm19RfWkI}*t9W1cR{6V z7|F=G@n5 zS+bEbDoLkv4{(nli_r<&D@h=i8tLt4%~dhUXn9UaDs%Lb)TTpLvUOr1Pv@Rr0lp7? z6Ir>ThaSQ8AeG(Q8ZVJ^{Pppu7pOy9U_x`dyBf{=%$YWR9UM}RBSjw1?{~Q*y-)K; z(Np1PeUk8{j;!5L{AJure@Zs*ub%p}?3otRIR{)vP}a>uxi^7tI}9P;tB^_dhpC4S zHm!*tA5i_cIJ8Tm4wpNqp*?s$M|0;$=z)Cxy}tg}e2jeW99hjc=)&Q*efz9z=kS%> zyz}Ao)Q}I;bB9N=REa!Q-o3GNTb@W48nvai{T02lx3@TR>WwQ;7e4vx&QBLl8V@hr zDqOp8{m+Y^emMV2;W#y~&!3pNee2k_Z|}VI^9wh*z3}zNS6bJ0=XS5Y*Sfqrr=I%t t^z6(R-_$REf9ajG-i@2~51&1*Jb6|8_}j4)-{ps2V|k^v^Wtl7{td9fRCoXY diff --git a/src/main/resources/assets/betterend/textures/block/inactive_brimstone.png b/src/main/resources/assets/betterend/textures/block/inactive_brimstone.png index 0c0b22af919c2ce18843929ac76fadbb7d0b8f51..0961b6211fa1a0790fec676ab54675d072884a6b 100644 GIT binary patch delta 28 icmcc5c%N}X86)Gw@(2ODz6X~XfWXt$&t;ucLK6UzL9Mw(QoDzgz}fCa%gD5iC_zE==6(bio`6v5k7?66D&FQbi?zL!s^MFjEHZ8L zpun{sesazfP{3ZM^O44Ui$jHP_9>^}%?*D%yx-hNAe=HXw9D3{GMwRgmb{D-#o$8G z90CMY#+rnLV_JMCsIt3+YIU|Qnhvy&C>}x)b-twxCt3drkT_Y;y-~S8iDszQ>Ji#7 zBYCUmsjFC7CiMZb1(u)+-v=Zw?FezU+E{#-rw?J!7w4bRQo3cJIusKTM}FCI(@lT< zq$J}4?rM*J;23CrH-zxJyfea6Tsr3)dHvD-)6h4wdjbjrxkMnqH`IsrP^WJf?; zqSL#)yAKG;Y<)rt&E*d?7@FD77WaR$MSwz81Vx66mJUD=`lHyq+x|v(ND?*}=c=eU z+ypcXia{#Q6#K;aMg+b^cZm}5MuQ2iR?r8*CgVjoB2+{2zYK^7>%w^cE!(oicKf5pn%QcyOH(V_cFIu&gd!?q4^tr;9YmD zC|}Eb>G8Ik)H;W>B-rjn(@3|B2uVZq=6(bio`6v3k6F_>Vs3M~#oJy|)A3!NEYdCW zATP8YehSVMP{3ZMazuT;#i9H+`&3Zz76yMF-fwQoAe?dvw2RiHG@Rjimbi?NOmKlQ zhX6s9vnCos1_&{}QeS*mrVnAz7w4bRQmSd7Iut|5Bfn_5sYZYI zq@dse?&^(Y4sA!P?*^x>Cksv)S`S9i(h($ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_moss_top.png b/src/main/resources/assets/betterend/textures/block/jungle_moss_top.png index 375059290bb71abc77ad4feed1e056126be63c33..71e619dd8232a15250b1013d1b57c05f3cc43545 100644 GIT binary patch delta 28 icmaFD_=Isn86)Gw@>qcikIAnXfWXt$&t;ucLK6UxCkb}| delta 28 icmaFD_=Isn8RM;q<*@>SS1dUhfWXt$&t;ucLK6U!UkN$@ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_0.png b/src/main/resources/assets/betterend/textures/block/lumecorn_0.png index 9322a74ab2af82502086d1d77c962563f1135d37..524e49b9282848a3ef8ee609953df0badca00d53 100644 GIT binary patch delta 144 zcmV;B0B`^P0jvR#B!2{FK}|sb0I`n?{9y$E003i2L_t(|+GF_t|33pIm|@g_VQs+b zx5xiK`1ATd*#_+UbcHelK$<~@kY#}9!W;i%PrnCa5St_e9A}>S4>KTa%PTM&Bu26q y^g{yw+hoL&9|q=e(O?5W29cc(V20pR0|1&d_#u$!184vM00{s|MNUMnLSTZ7jyt&k delta 211 zcmV;^04)Ek0saAyBnkm@Qb$4nuFf3kks%X*32;bRa{vGi!TH}U7o-(VV93>;5(*wmOH2;;>E!hia zh75TU;=u8lLp?EKL}l7wro=Vvo8bB}trrg5#2p4&$OoFDMke)uHjZ(ABdGU;+Zd2K zaf!!5j@4qUU!#nMHToOs`1*tZ?pn)=Wt^&u>&7BNw!Fj57&zoqbXaQp1gw#eHUdnR zcet7}ku^Td1q3k~lqjta1GPF-SYJQ?uflafCxtkZb~?cEU~4* zv2$h*^l6(l!b$%S?mjG}71l%nS*&tz{Yypxu0M#Xv2P0a)ym%8vC197c{_-faUbHF zxRVi&x37TrsSEPeZ@kB4i}}S;<}?1@?JkVmc)GW{q&_-)m)iPraHTu_#lL1IK1;5hRPSaH~vS8&ZBHb@L4 zN0JxJ0MZOHgzSVw$aWA000Xc0To7VK=|lhk002ovPDHLk FV1hWRKpp@9 delta 223 zcmV<503iRf0g3{UBnkm@Qb$4nuFf3kks%X*32;bRa{vGi!T_NT;dF;Ki+}z zFage#=(XtPe-SNlC=UYOTzko|El!;g$^`?gE^wN47HsOzm%qV$5P-2^axg$JFIdD% z$NXpIVq!QveG!VyFn~7#*7m0t92>$G2}#7B;}Z Z007aHHZ72`ew6?K002ovPDHLkV1khHTp$1d diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_1_e.png b/src/main/resources/assets/betterend/textures/block/lumecorn_1_e.png index f4bf20b9df49836b10c2b5d122549ffaefc35982..8f92d67401c8b65563392acffd100adbd0f0a31e 100644 GIT binary patch delta 75 zcmZqU&YYm)YT)VO7*cU7`N#kN_ROj?60a~=No@G__Tzv4e|!Gf7qGqgUD9gA>@dr5 forEuY^GybZcz?#<9JU=&3_#%N>gTe~DWM4f^mQJi literal 1414 zcmbVMOHb559IuZM#ejG+>cL5gi3Gcy>AvVlMc74lqeTLn05@ja+1<*vQ`>>v#fus* zd;o8J1mhR*z(Era-n@B~#FGaPcr>ijeKcV3MU&~ge)Idk|Jw`mb3=ny2PH`wDi-pK zVjhXcxdHLNzTYNdI`0=&LrEHb7mZUd$A_;;(%F5dw8B@+2iRh6g4nD~6HV6_Xi1u! zYWl=lryP`N)$t7Z+nZe(IJO}#r%h=3Ia+fHTLE3#nlD*f>y~cIQ+L2*6AJ>Dasrxe z-3xKkkUP9stfOO91|0}rH{|I^AXqUMK#m0zq!Ss%LMaVo^#sa5T}#~p8bnzYW>u6_ zAi^+%lRD^qvXBAJ2$P1Q6-Ae6A>ane-0 zaJ0{mr=b-%K6jW0B1TeX8{CkErd<*9iVN+IDaFkcZA!P zO6%069uEZ;#aO?_I16j+H`MX<5dp%rrWwmPRu|WeMTC5IQ<%|n$g$|K)bgpiNJF*} zSafz%s5u&0lxv3fsH3w@PAE*Ax60^D47JexJbu|scYo^Wc&8q|;onWCW* zLO7YhC^HU|7{V^pWVTaj9Sfbn5FLSvtg#6ve+AnXuCTx*!e+-MRjT@4RR*yqagNnl zAOs8Tk{vBf6BoUZ6VIZ>ydev-6OLnJqF1ssty6`hU|E4Mr72~Yf=VTYGP<5c=@df! z_jzV*M8WO9xBv6~!@v>6Md~N!iApZY3S4kP5wBLSD3<8s-m30^P9k7pMG0=mRuoxk z%e`ag#2)C|8m72f)nj8cXEYE+F~Q`BFr?A#ry+&)~igJ>D| zA+d=&8TCZ_3Phh;`&j%WdYoR&PnRY>SU=kBsWUg8Za}Z7B!2{FK}|sb0I`n?{9y$E004hUL_t(|+GF_t|33pIm|<`maQ@4^ z|NA~&`A?An5B|I+&j64{5GLdboCbh2!CZjP6?nY>GGz7J%nCl)RN`KfZkf^RWT20gQ~; rqnVY9iQ)5`FANt}ufvfJ7#IK^ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_2_e.png b/src/main/resources/assets/betterend/textures/block/lumecorn_2_e.png index 81744a63f20db1d50a18bb1baa467dd015c2b878..e8f415374ee36b9aee83e272225fefe9117e8328 100644 GIT binary patch delta 95 zcmV-l0HFV?3w@9zSwu-hK~#9!WBC97KLaJ0VQ?F8{>#1p`#xRyPmuu+{=6p70FXuy zCgcj727oldT!7CNc)b8JWcAzQ|A%lijv7EG0{~Q=1|WPy{TcuO002ovPDHLkV1f~r BC(8f; literal 1451 zcmbVMJBSoX7;eu8r?|^qB%Fb5dxD}p{n~kSVY`mgt2R^=g99I#fq{Vrj&s%XXjJxmHB{H@tM7mRSLWxA zPHg#QizG=C)me8z%s-{$$4%nD<8>d3X)~KWl}OU$qjaphwr_H~ByD&d)E4=ocMKpJ z<{+kZlIw&_pe5WZu&~Rw2z`b~Pp^R_AJHbqU#6 znLa2V=m0?w5)S1~*oqR+ag+fs5bN|33`^AwpcjB;%cD;b(qim`1^38Eme@H;lXC_%t=(?t+E$Ln4b8A^ zThmR=G*y96lWxReM~#wQV+NNbC=M78Xe6hMuufOFqXY19k@SOs7d_URVT^&!-wIPkk`LW>}8eFPO*gCU1s1Y-nz8i!EW z9E7kzG!``!IrAi_&=!q_V4%ueN9GbLVqo-#-S0W v!<}u1EuJ3gJxUhWr$n#t4xG71^{l}kP`uE{v+D@x8bMEcKzg_qbUBb}U diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_3.png b/src/main/resources/assets/betterend/textures/block/lumecorn_3.png index 3ec3dbe2fee86ae87673d11b0c97f3050f8658c4..c9c7b9694eada0af5a89ce13ab59cd0feaa5473d 100644 GIT binary patch delta 185 zcmV;q07n1d0@VSKB!2{FK}|sb0I`n?{9y$E004|hL_t(|+GF_t|33pReE!S5|NA~& z`HxQx10e$*{CQ2D0U(VaOvn{D4FG9^xd5Ll2)Y1d(CW9x$#Ve+lkEbSEAZKl(*Vzf zH~z<-evg7dVni9>IP(lxaoCnuaLph#NDL%Lk{4_;V*l%h1TvDJkU$2Q$3+jI0U*tU n48dyvF|HuW1^5Dz;#dFx(CPV**ijy>00000NkvXXu0mjf`CLr= delta 310 zcmV-60m=T=0pJ3VBnkm@Qb$4nuFf3kks%X*32;bRa{vGi!TR07*qo IM6N<$f-6{wWdHyG diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_3_e.png b/src/main/resources/assets/betterend/textures/block/lumecorn_3_e.png index 3615659eb522fc901a4edc9ab70062474c72b501..8c8f1ebf43bd8618769d934b8996fe406d17741c 100644 GIT binary patch delta 108 zcmV-y0F(c}3yA@cBxO)ZL_t(|+GF_t|33pReE!S5|NA~&`HxQx10e$*{CQ2D0U(Va zOvn{D4FG9^xd5Ll2)Y1d(CW9x$#Ve+lkEbSEAZJ)&;Vlar~#t}fG_}fsSA4h3Ba%b O0000J3D*HUT)|b)7#V>xG|&$jSr%8GqZO~Zg;k` zliVdBLIk02ejxbfON(#ntG3`vgo1((;+qc!gg%HQSnws5bM`)#R^nF|X6NfSzyJ6D z+Vav%lP8}%scG6|ebHZ0^O<~{IIjNZ?)I^o9!(ct%{1-wPCh0+ES;Xxv}1Rp#;RNm zUPgq+7N)$(tX`Zdw5DB{>!p~iF{w9MD@r_L@8(yA9#PM@G85QAT4U{KaZ9kvTT2bH zwMMGcn0rCL&_jwKW)kbYxRYe4=NSWDq}KT{F!TXLu6f3ME>K?$mh~DJOrNn_lfY?5 zuT(AQ+Er)zdEK#L1=tk;%cc#H?V@s3AAN?BCTNIO{7WNQYUdekDN_VMx7)S4Ws8dz zfYoXh*bZP|qEtpa(Q`)JWpw2LveB20pv5Rt@!A{}#btJN zwCY6qAQ2EId4hWe$s^0CF*=SO+5S$d^SQQk$Zau|%~mq52dJZhxkFoT&TrjoEL=AN~H^Q7hg3hiPHaDQ>(p=G8rP@x_xGkg-#Iw<@e})B9QkD8VD9yM;P%efnwU88 zlXztQ?2iY(zrXwI-gl>-zWCVno0?y`dhLTdM?NYoy>;vD?>DxOpE-JI^6?q%m{xk` VwcQtQurKo#TVGi6KfU6hWMSZn&;Q*mZ zD!5d-L-jIrp-`RW*%sj;Gp zzTXeYUh$XRPh6h&b>g$_E0_yFmoWRT0LbO$T#L-!zguB0KYyONmH-K1LOi^FwlEk& z>kgn00I=d&01)bG8}tK2xeBT8RpXo|+yZy)cJp?e1Y<0NeO~pORVw46+{fqbsf8E} zpxeqqP~7@J#TV-`{=Uemh8P8)#-lh|ErC9R_|wOs*(rAbAXoy0fLJOi4AIB8uXdc` z)f~5ZzyesIp?^Sk18502nJs}DFjWEz;bKBt|EwnL+lC0%x-nbGx()w3h!7B#5`?S= z(H|NUTw<<5Q}fVuYL5CZ=n_ZERS@F^cL17;K0$qDr}zTQR|oFv+TAdz_SNl90LP>- z`|5VL637KK^o_XyjJ;@NyAe$Q6Tk#80eI&Hj-`$S=nq-3HUIzs07*qoM6N<$g0Q;0 Aq5uE@ literal 1623 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!X^24=_1kcg59UmvUF{9L`nl>DSry^7odplSvN z8~cia#N_PM5{0DH^vpb4rT4q{D=B2A*eZpa`WpBaIHzW0dQ=sq23ProBv)l8Tc#-4 z+wpSQR9FE`$W1LtRH(?!$t$+1uvG#ZYz1V4g!Ppaz)DK8ZIv8BHY!B;1}He^7o{qg z>Y3>#8=4p?m|N-@ni*Icndm4O85o-D8<^`G8tWPuS{ayG8CxnqffCR<1qGX;lr*a# z7dNPNK%T8qMoCG5mA-y?dAVM>v0i>ry1t>MrKP@sk-m|UE>MMTab;dfVufyAu`ZE{1p|w*YQ-UNJPhfFY+}kyxN_sAmB38cdgi&u1T;l2Gc(1?z|qLU z)yUM?)Y8?!(9qS%(bd$%#lpzd*v-Jq%+b{irq?AuximL5uLPzy1)^p76m3N zAkRi0o~A)Oc)m!@17?OIV5%3_Wz=S1V4Cmg;usR){&w2#d|^j{W8amM?=QR|)PIB{ zT4b5W0%lE9j}V(ECsvaW@fR6Hx3H{mSk&j@=`@k;jfWbaM`2Sght6;5JpbCqSsVaAyPGv!}D{A)5n>d^1?{9oeUuYUEeE=>J=_|u;7X0L(}+Z{&s zg_A;%2#v?yKd(x zvodQ5x08>f)4liaSGV4pd8GOn8f!y_4&xOBUuf99&zxArur9*fb@6)f%yz@7o5pZ6@IMXEIz}fU%-*bmW zT$+!yZfrboE~5EGzrET#@#o9$au`lr_(Cdu`U%Ux4$FzH1rmnJdOACGjV`?Xeqv{O z$;{=kQbDo}GEOJ{2D^stzA%C5Nl&6FZ;#KxS5ddme3R!9+kDw5X=m2=yxk|+*@FEV z#m{|@|6LM#-PW&1%B&2sxiW_IHzopr08;p5L;wH) diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_leaf_1.png b/src/main/resources/assets/betterend/textures/block/lumecorn_leaf_1.png index 5a1a5355c40a54bf8f39fa2cbf22ad25b6659b8a..725ed5574972a6cfb751bb4aaa987fc6b023f800 100644 GIT binary patch delta 215 zcmV;|04V>S5Ay+#B!2{FK}|sb0I`n?{9y$E0062_^FeZWy#T@> zjW9zTXP$u@1`-3&1Pwqo1Y`iZW}*y$g$GCz%oPksfG7h%nowchK(?J|1Bk_g)BsSZ zgD@^WQ3fPG`3_G=AU4ScfI=Rm5rko>kZ1!y067Y=QOp1U literal 1950 zcmbVNZEO=|9KSMFq3g(ysB@U?xM>(_@2xLuFYQX#b}xn-%V@%k#_{y-X?t0Fcii39 zZeOH87LXa4;S(+)Mx!5$z#<<^BpAhgP|PA|!Us&Y7&77)G+-2Au|C&c%h1g%UUGMR zp8kIS=l}oxU+(xoe@~;M#erd1V_$D<5WSnsdy^eKTkn1CrNodi#P8t*B}W2LNkX!aQxO`&g5iP+ zgb`@qNtl-85b?`rpA)zwhKT)Mp61mk%t*Zx8r(P0pAaTSgn&qdI~yIr0*5T*paJkg zE-UL?Aw-l7bLh9ZO%Zq*VvK}{he%tL}Uy@VhVzhNQ^2X%-}vQ6oekk1L_%)S7KsxAa2FQ3aq<3`v`z zRe?PJ-_TsHhSrTi_|WN94eN<<6;gvxS4K4fB6wT%DBXyUAs4NP*FlbtLD{I$MWM!3 zN40EOD^Z|e7UmF4M^P~~Kh=z4D0)U&LxkGjH7QgsszG2VT0&8>)oc$`t>Dq9nO#5L zzF(3>C9m%?W3o6f1`HS?Sej)}-d#)}fwJ#)b6)QYw40;p3Y1qwDK-9YC|fQR<`F0= zJrNjSJz$>a`efYzvH<&HAp$u?N|MO=Qr?uGP6C%3vL088@pxQ-P0`3XF&Pj8Cf*f^dp$8f8+UipK3^o>UFGi8B-C&q`~Pf+ z0+&*>96&`OcT15ye zkdCzjsc^-$Mewi9rOIt>_PFI#ucV_I8n10z&AJaBT(MIe=9W*3JD9iVs! zYjd?=)|b_a(R>CXlPinzAC*>t=}OAT0}V#fr~=ki_Z6Oy0dg9m35#0pp$aH6${a>3 z;|)@kd_5{n1-D{|RR(04jV2^oAzpPno2%N0hcY@IKTOW=|986e@$+8ZrC%> zvSs%hUpR`*Uv=Mlug*!mfBV7x()WKT&NB;_gr=*HKX#&+t+#ddlaqn@VEY99>aV|j zz3qJ0YhcIZ&Re$+dyhElju&r!XPdO$`00nI!Q>&V_mc}#&Y`=%7aBiZ0NCXQ8gmSs zTxtzpqL00Fr5J5}e(un9w0X^W$3FFD!=hoE#Xf8}R)2xPPCdE1`J1`Lwz?Ve-nsd2 zoAOJSUvIL{9<A#huY6QGccwGBxVUKR**QTT owat*2gh}@2p1m16>S%7p+GpP>{CM%*y!nyri}%OQb{#nUHxBq{#{d8T diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_leaf_2.png b/src/main/resources/assets/betterend/textures/block/lumecorn_leaf_2.png index 74d8e57e5fcf5d405327ac46dcefd32e520b71b9..1c93b511a64378640574e7e22b9210b7944e1aeb 100644 GIT binary patch delta 206 zcmV;<05Sj13F-lmB!2{FK}|sb0I`n?{9y$E005y$L_t(|+TD`74S+BVM6((t3((QA z6eT;*G64+01Qawh^oBzmGR{XJItnX^bNB3goQSwD;eH4x+F1}!^PZ?$rz6UKxx|<= zZy}x;Vr|es<~8I3+(g}aM0CAtJpeaB&+0+)W)z;AIgHf#9Y>rMAcC0&3uH&ZOVkho zG|ZZV&u9U*`lFA8D%NZ(Cjm6D3j$w#Wdc&>B!HI(0Om2>1~hW~eE;3$3;+NC07*qo IM6N<$f;y5@zyJUM literal 1231 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qt-49t$1ArU1JzCKpT`MG+DDfvmMdKI|^K-CNk zHue<-iOJciB??KY>6v-9O7C~?S5nAKu~iB;^)>Jx^|#0uTKVr7US zP-9$Di<65o3raHc^AteFCMM;Vme?u*T@3L`ZUNlvykcm00Ygr|BC$Zc+maY$uBs(w&vaeir0aw<@{GRUd|E9aur#FG4?ko^1{SZD@h zzpQ z&^n+4TvCfN%TiO^it=+6z`nQ2#O)*_oW?@+rr>sxF>by3P)FJ5gJK#f<{_yHEDB6k zK%R|0JWYdm@O+V)2h0pbz*PSvEjkjI`@}t6978PplmGnxZ_ljS!09!amu(^A!|3?` z?1>uUd!(|5M6OT@`9pLr&`|FQ=%tiGugTIsCo6k7*fSGsZSzS&u201o^v-a`-(sooo zXFGgZ-Ty$2z`rklr6YKbu&r)f#R@Vh+M%Jjx&7hse*FMB=EJX-_a8_yXjmhbcOXYS z&us$BZVPSZ^&132rZhhMe7ihBN`-9_^Ge2*tlUhDUM5Q32N+JMp4hf{^}$)xrC7=VU}ak4Tdo03Bp`H#+xLJ4rDQKG%ONiOJMBe bl#pOxPwI{dE?YeTRH}Ho`njxgN@xNAhiQuV diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_light_1.png b/src/main/resources/assets/betterend/textures/block/lumecorn_light_1.png index 459f8269f0ad86760479e67cfa278b7690a76a57..f192caf1bf978c28736f3b53ca602cc2d691ba29 100644 GIT binary patch delta 273 zcmV+s0q*{-39JH;B!BZsL_t(|UX_!{3c^4TME(CS5f{)~A}V-rkD9myabM06vw1DM z2KAs3I)`CG$a~Y1t}Xy5e6LC{Kso4R9B<*LSIpCsJnxY8?avFYst9Ju0ju<4_MwRE zyQ>#C@!r5wft%qRrJx5^r4}sHGbRRJpcr(`by$U3;3h`{6MwX%bVu$_sanvEmaszC zlug)wTtTT?&ii;8PhmP_Ikm4 z7Q7ey&V^b~yN%3=EZvd46Zz;yYrTNeH;6ZA$*FabjU>jo{sD8(YjAOlIauDGBt8Le X3NkQ#(I*`M015yANkvXXu0mjfAHaP0 literal 1197 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(zG{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6SQ$7PS-2XR8k<_W8WEaktacj!t(|(5y1YFn8HF=lKsI*6n!$mOuK>laNKkTQqR^Dn+>61S*qs#TRSKsE2 zl(V+RGpm*Ne7CTje^vZ$)gBSmup&O@?t_vwYs?>QF>`-XaMkVZVgXAwd#CE|xw*+p z3l9_*R*Oi7Y;#PN@~BEuud<$Q`AZ>hqbd6=j|VGvc+Nji(LU>lY3aUGVH%rF9n)V5 zhpgl6etb?RE=|i}GGp7cYcuS29GGirdEi3IfqNzYlitawDP1z#9(`Mv#i%fsE#qBO{*}Q!f7|AHLQi8(OxQEgT%RTCda|Ng z&7sx14)B3d1lAME&9Yl0v?q zYv-;Vlc96zkS$~h9RmuN_CPu0AR9!CExqUtxtLi&VBO}Y_20LB)@cvyAIr;djxU1w ztSJgWk}u>Lf!Fc=ul&^>0Jzjbc0}kYK)aw64^07T9$bdbd{ur3po~b0|9cg{E>w!@ zZ}tGiX+X_`BCFX0>{A{95_ymY_~~o*!26&ho$??W=}7-6KxITTZ~#OXUWUE_|B5$z W!ayly!h0eB0000D0TxL_ zK~y+Tos&%p!Y~wsUj*?7R7AmrA|lG!5EosPf(3sNjGeSE zq-g~8gVItmlQ+{;NGS;jA!rqBq*v-tvs_c}!h1yF>q@~hqE<0^H>r(;dWeChkUndF zAb{|2^=bd`wRl*KjSE#;p4SpWT-ZEg5Z(fHH-(r8VxGn(W3cGWge^oIa~hjm1i(U$ z!lv8Pj^^E|?hWKSh+{xxcYyr;c1LB$#pDb)h8@L~ALI=1DV-f$j_HalUw7cu2Wq-> ziRPycFkQM#B3d1lAME&9Yl0v?q zYv-;Vlc96zkS$~h9RmuN_CPu0AR9!CExqUtxtLi&VBO}Y_20LB)@cvyAIr;djxU1w ztSJgWk}u>Lf!Fc=ul&^>0Jzjbc0}kYK)aw64^07T9$bdbd{ur3po~b0|9cg{E>w!@ zZ}tGiX+X_`BCFX0>{A{95_ymY_~~o*!26&ho$??W=}7-6KxITTZ~#OXUWUE_|B5$z W!ayly!h0eB0000D0TxL_ zK~y+Tos&%p!Y~wsUj*?7R7AmrA|lG!5EosPf(3sNjGeSE zq-g~8gVItmlQ+{;NGS;jA!rqBq*v-tvs_c}!h1yF>q@~hqE<0^H>r(;dWeChkUndF zAb{|2^=bd`wRl*KjSE#;p4SpWT-ZEg5Z(fHH-(r8VxGn(W3cGWge^oIa~hjm1i(U$ z!lv8Pj^^E|?hWKSh+{xxcYyr;c1LB$#pDb)h8@L~ALI=1DV-f$j_HalUw7cu2Wq-> ziRPycFkQM#N|ND;EFFau#O0;$1i0L&1W xW@L>p7vMEun1lh$R&D%PDHLkV1nCZImrM3 literal 1102 zcmaJ=PfXKL81F<;kQt2!0X4joXhd9JyMNGTlXUBFODryPMu;9L?SnPYzSU2v_57eaD4!KnY%q$3M-WpoEP|$}SYOFf)N$m35j3WoaeC=ZnFhKR zr!PiiR<@F;pr>bSbbe+aug;9Cyhit(_BY2$0#PuKtALU*VLC!7PFI8la`vtv4Jr_K zJWh+AM=&U7K@!^tM3`tm<-$SG!!ulz<%8iUI9+gEOMtLgEHcFqgY7ZM@jMUNAPfcr1QBqiO;;%eOs8{Gq$(pJN40g! z)v*aYS!D!Ix^bFBy!jNvs%e`}HD4riu%uX!V_5HLTR>Ujk}jNWr?YRjyV)q)>e>tOgZ>UZwx4{AO2GZb@4a zD+X&l?OC);|4OSsiP<+k0c*fmg#E(g|jvr-Nib^oQr+)HXZQf94QUlV9#PIAN-3eC; diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_light_middle_e.png b/src/main/resources/assets/betterend/textures/block/lumecorn_light_middle_e.png index fb20994a1da8ba44a281e7c87db0ecc7c83ad81d..f592a2fa69c0f4312a583edaaecad966e8b99d9e 100644 GIT binary patch delta 143 zcmV;A0C4}#2&(~*B!2{FK}|sb0I`n?{9y$E003f1L_t(|+GF_t|33o^uYP;{|GrOG z{-6JH@Bf28ufa5k4-*H`$m&5Dg){5P7Pw}Z24q9A8G>N|ND;EFFau#O0;$1i0L&1W xW@L>p7vMEun1lh$R&D%PDHLkV1nCZImrM3 literal 1102 zcmaJ=PfXKL81F<;kQt2!0X4joXhd9JyMNGTlXUBFODryPMu;9L?SnPYzSU2v_57eaD4!KnY%q$3M-WpoEP|$}SYOFf)N$m35j3WoaeC=ZnFhKR zr!PiiR<@F;pr>bSbbe+aug;9Cyhit(_BY2$0#PuKtALU*VLC!7PFI8la`vtv4Jr_K zJWh+AM=&U7K@!^tM3`tm<-$SG!!ulz<%8iUI9+gEOMtLgEHcFqgY7ZM@jMUNAPfcr1QBqiO;;%eOs8{Gq$(pJN40g! z)v*aYS!D!Ix^bFBy!jNvs%e`}HD4riu%uX!V_5HLTR>Ujk}jNWr?YRjyV)q)>e>tOgZ>UZwx4{AO2GZb@4a zD+X&l?OC);|4OSsiP<+k0c*fmg#E(g|jvr-Nib^oQr+)HXZQf94QUlV9#PIAN-3eC; diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_light_top.png b/src/main/resources/assets/betterend/textures/block/lumecorn_light_top.png index d5955163d41bdc9c174f473047d0aff4cc6b8ed3..fbe0ee350ee96336f17bd705ea5192aa8cc98774 100644 GIT binary patch delta 122 zcmV-=0EPd|3zq?qBy(O#L_t(|+GF_t|33pIm|@g_!EV6nx5xj3FhvHO|8ftnAp{M0 z@aHvo2Ec45%K&7}WO)JRbdctKpRSN@z^o@*;5LIWK0|OC0MiKb3P_BkKm=(3X#`=A cLAVS60Pm*|PO3>l!vFvP07*qoM6N<$f^@<&j{pDw literal 1484 zcmbVMOKjXk7&d|yh?2G!gn&Z_N0kc2p0W28k7}ZH9mpaaqI9Khr3x`Sp4~NBdt7^x z-OZ(e6BQh|a6l;H#sNW9RY)Ll;1bjb$|an7p;C{CheQs5R5pzFVKt~gTg&#mzWM(5 ze{pH?#i@xWClp1Qsw_Cmay*iLj~tZ$qq}=V4v$6)XA?y^w3U7jym#WzQ;PD?u3xQ* zn)@=QJkW{9>rC$kkwh!X$=Pm1=n4~{&YFH`tG|Bvl?r^%R?ie%2?8bv=mzaD!ChM&@M1Ynx1kCK5V2ybbE!a3bC*Dw#|#woqDGCp z2}+i36p>}-p93Z`N)VNxk<*ZYQ4!}XFnUxeE%q9C*?D0kORj9SB}9ZF>~uPMC#Unc z2@T7#ATpt8Y7(I(y-<*@7ADhU28Sgy_9Nl*5TuNx&R2!4N==6*1W`sCCL=dVhruq1 zprNDGqyf;Q87^9l+XLYqg{;j27K%h-jSL&LxZp{P{|j|?yib61t?Ono?x;%;WFitV zzb4HXIpmJ$q}q!ZTxJPhjVYU7lWI<<)d zf<1~GJPwGo*$+sQ!6S)`)Zx0Ml!vFvP07*qoM6N<$f^@<&j{pDw literal 1484 zcmbVMOKjXk7&d|yh?2G!gn&Z_N0kc2p0W28k7}ZH9mpaaqI9Khr3x`Sp4~NBdt7^x z-OZ(e6BQh|a6l;H#sNW9RY)Ll;1bjb$|an7p;C{CheQs5R5pzFVKt~gTg&#mzWM(5 ze{pH?#i@xWClp1Qsw_Cmay*iLj~tZ$qq}=V4v$6)XA?y^w3U7jym#WzQ;PD?u3xQ* zn)@=QJkW{9>rC$kkwh!X$=Pm1=n4~{&YFH`tG|Bvl?r^%R?ie%2?8bv=mzaD!ChM&@M1Ynx1kCK5V2ybbE!a3bC*Dw#|#woqDGCp z2}+i36p>}-p93Z`N)VNxk<*ZYQ4!}XFnUxeE%q9C*?D0kORj9SB}9ZF>~uPMC#Unc z2@T7#ATpt8Y7(I(y-<*@7ADhU28Sgy_9Nl*5TuNx&R2!4N==6*1W`sCCL=dVhruq1 zprNDGqyf;Q87^9l+XLYqg{;j27K%h-jSL&LxZp{P{|j|?yib61t?Ono?x;%;WFitV zzb4HXIpmJ$q}q!ZTxJPhjVYU7lWI<<)d zf<1~GJPwGo*$+sQ!6S)`)Zx0M|?!`g5}JTI~B<%M<(P9x6QS_MwO& zq?t0227Zd|e;Cfv2JQSQVhB-Krw!N{LeBuEDFf!GkcNswXh*=yo`K>JGN1{CoG4|W z7^Gk0`wV>7#|-MOK1wPA^YiQT)2JUS%&!<=UB?I^Mhp~(8!+iO|5xxUyZ`_I07*qo IM6N<$f~fvoo&W#< delta 306 zcmV-20nPsE0o($RBnkm@Qb$4nuFf3kks%X*32;bRa{vGi!vFvd!vV){sAK>D0P#sg zK~y+Ty^_HSf!MUZvJdE(5xz*QGS zaJWa`@p(}q zii>eVX^<$W6cKQ~v}F{dNl3>!*C%cq06uk{F59<0Dpkf9fJ$)yJU@zk2Y^Z*WQp2* z-@z{r4q!Lmc-ie_IN(vFID5c5zz+Cp5NQ_%JHYiH2hlX{%0nC&0G_|wK3&8p2;g=M z0MF0c*LQ&Dk_T7fcYc&@2Y>=%doTbUyaSR0{-tJ!KC*nkV~R-t&;S4c07*qoM6N<$ Ef(nO*Z~y=R diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_light_top_middle_e.png b/src/main/resources/assets/betterend/textures/block/lumecorn_light_top_middle_e.png index 13801a453f8b94dc36fb0c619cfc41f57e3edc97..3376913685b5fe9e56360b5ab31f29de146295c4 100644 GIT binary patch delta 206 zcmV;<05SjE0_p*fB!2{FK}|sb0I`n?{9y$E005y$L_t(|Ud5BK3WPumME!8TM7S@o zwYIf93v02k6C1hmATkRBVaY(OEP}hs&Ls2H#>|?!`g5}JTI~B<%M<(P9x6QS_MwO& zq?t0227Zd|e;Cfv2JQSQVhB-Krw!N{LeBuEDFf!GkcNswXh*=yo`K>JGN1{CoG4|W z7^Gk0`wV>7#|-MOK1wPA^YiQT)2JUS%&!<=UB?I^Mhp~(8!+iO|5xxUyZ`_I07*qo IM6N<$f~fvoo&W#< delta 306 zcmV-20nPsE0o($RBnkm@Qb$4nuFf3kks%X*32;bRa{vGi!vFvd!vV){sAK>D0P#sg zK~y+Ty^_HSf!MUZvJdE(5xz*QGS zaJWa`@p(}q zii>eVX^<$W6cKQ~v}F{dNl3>!*C%cq06uk{F59<0Dpkf9fJ$)yJU@zk2Y^Z*WQp2* z-@z{r4q!Lmc-ie_IN(vFID5c5zz+Cp5NQ_%JHYiH2hlX{%0nC&0G_|wK3&8p2;g=M z0MF0c*LQ&Dk_T7fcYc&@2Y>=%doTbUyaSR0{-tJ!KC*nkV~R-t&;S4c07*qoM6N<$ Ef(nO*Z~y=R diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_roots.png b/src/main/resources/assets/betterend/textures/block/lumecorn_roots.png index f8680a6aac3b7b07a76a9aec57b6c3a77be49174..73990ff8cf5117090faffa5c953683403565d3f5 100644 GIT binary patch delta 161 zcmV;S0AByK5WNAAB!2{FK}|sb0I`n?{9y$E004AJL_t(|+GAkA0rW!x|J!85f-#8A zKq?qm12jE6|C`4}gEfO_5T7F3NiqQ4c9NYB(f~7nWZOXirWu4u)=YH+NcIA<|B(Zc z=zv5HeQX91v>jP7$mz%~0?|a-j_hxkAw(r}7_m&183T(QF#hg(Uc(XJ^jtj@g|V zXC~QAM2uBQeGtX^)GCsSMMM&%6d&49FVIRKs}{_}tT<(!uX2YOnXb~I5G)za4+AA1>-Kc70o(7G07hJ#6zv|=Qu_fFa5z|=rWof=amjoJ4|OH)Tl1`7q^ zV!Bkw8;)FxGG)Uue0$RzLzf}$Sd>w`73q=WARRMpLI?dJR^>&34oiMMgd{sV>ZFAX{SsxU(5Dj%?cfhdD)H7 z?ZdjEnMG%hr>V*zaqN;PBOrl?ytBNNg6szaa!}lh0y07sXwua5%;evpf{fr7x&sQO zr(qXw2AoXFeTL&=LnVFjC<9LUbzPIgd?<`GA;gLy5wS!P1FVz@hglL*1suUz7-zy| zzknY%)p0L^HNFOXq(lNrEFuJ@1mgKbmy!sI@raNJbfZv6Np#n^`)wT>4(I=y4Na9Z zrd_~L6nX(?31=BuhOQ?^j+uGWhQL8|1GVCZ@&}Qg+r-u_q_3yeM-+> zfBojUlgBO^=JJD$t0(@vd*p*lh40!{UwLlv#QRGhYj+(dO6$t+sb{_n?QS^qPVDOU zJD2heo$md|u6{kUom$-eY}9 zTttmFT%#`2GmAG@e>i(NvGT56>)rexCNF$?TEKXXNL<=o}qwpMLj7q;&b(E0eeQ76951J diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_stem.png b/src/main/resources/assets/betterend/textures/block/lumecorn_stem.png index 56d7e386c02dda3c7700550dfa72ecd96d3f8aad..17081516688579b4e104b75cf5dad8f5782c9c85 100644 GIT binary patch delta 149 zcmV;G0BZlj4zU4{B!2{FK}|sb0I`n?{9y$E003x7L_t(|+GF_t|33pZtRE8i-zFm# zj6rN%>KN!^fTo8hX$F8an8!tfHG^o94M2B3Nd}N(tOmd|6AC=q z8G!5svJ3!eg2e)%C?q->Nj8Augfw_E6LNyWr49i1Y_JBp7Y=bx00000NkvXXu0mjf Dp&mDw literal 1858 zcmbVNTZkJ~7@o*l+O(?+^+8L;*(tp&HJM8;n;ACN$z^u~JKJp<+N@aIlbMrb*vy>i z%w&`7!xk5O@TqufOSNhrwkk-eiXe(CNI_9>5fxuVMN#yr)IPXkz5J6*(yi>uVqkJ| z&V1j0{_nr#$*IY){@|`4MN$2^@k}1p0q@zm1->7+@i&4c;N-_r)a6fi{{ox7imb>K z^~UM#H_@H2-)4>QCoKCg`!(jCM1;@VWg1~4mS-8&=fUtsA(Z} z7Q1u_S9CMUTzhYsp>-|E9FHlSVx@6aAD_4J(fP@OIzOw58guBO{@_Sc0t*Iq5#2Ou zrXw|zOxv&ozrACYq1zC5Hp$4|jdW3&qSM62bSxYXseDwRhs7`-=R_g;AT4nGFv|_I zd?dv25*L>uBJF<|xQ?brY^^NiGo$`>uuC#k*R>>;Z8RF;MkGw^3d@V4$Z`TJ2q8d( zoR;aLX2^8*bd30BGT2dV-Ewte(wY>EFb1PXF>;ArAf(pK_Egsjolbk%P0$C9>!wB; z&XA|c=im%-agq@@frq?@c(DN4k42>wABIIaU#h^CiY>q6rae>)UPPeU%+3|LX5 zoawm8RBHEsRb*B$Oju~STTuXItT&9->K$P_`MNzc9o(8B z))|m(HcUv^0k1ory zEq(FQsT_bH0{TkFf#N+r1W%B9Cv_P_P;%YEm< zGxO#tZ@qr~q$y1;UOW&eojrg0$Q@VD{8afwJp1w8+n%Mrx$nf)rAN-)Pe1Yc<9TOj pB9Q-R*U~+gX0}etzmtLY1G)WUJNEv(@|^camdj3NE~jP|{{cp*MDPFr diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_side_2.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_side_2.png index 518cee46a7a5fd09a300e4e71690af72baae4e8c..13b2fd818692e23cf962af9d8c01c7e2dc8292a0 100644 GIT binary patch delta 29 jcmZ3*x{7sz7UQjr+WAZZA}k&r3_#%N>gTe~DWM4fd#4BM delta 29 jcmZ3*x{7sz79-gTe~DWM4fe8>n_ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_top.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_top.png index 683ed129fc2e21096ac0f546f7b55d6a8e782958..5809e4e4c0e90ba9e5358d65bcb99c5f8e749fa1 100644 GIT binary patch delta 29 jcmcb{dX0607UQjr+OwGi_H3A^zyJiEu6{1-oD!M0@J)OI-{hL4PIa&%DDJ#)2>ChRJs|-R;WxrR;Ew@m ztt|K5UKJ;<@-O@EiENVze|Cxx|#V9osR_A1lAn*cC%~L&Oi%Z^HY=Il~O<{cLmMcrehP59YcD%?y%l~y zlVo5XTrGVWROT(B;SA%>!d{;A>Sj-PN7(fBx^ZPng$EA4>VJ} zL1`kPB0oXEV^>nV1}Unf#2WGjQs6Q2{sAfP&?GZrXTxVjdHNpFJU>t=lu(vMAw#_%7!0_?^J2eIQtU;qFB07*qoM6N<$g85&eMF0Q* literal 1929 zcmbVNeQeZZ94;htKyDL~$%jU5ib2fi_2YWIUfr?GyTKN{aoG+*6L4?acXxGnZE3sR zZA4Ks3?oP+vY|i}{?I@~bjHuXz{q3?-y@P>CPBg^^8?u+glr=C_I5jm8Mt^!uW#Gu zeV*s{(O+95Rf`LzJva@+u!72pP&GPFcaACdq5ns(-3I71)u?#R!mz?F=a|%1T=)=% z<@Ko1<@WOMGoq{~-9XVL=uRgMgvPLv(zF5OdT8SkjHz0HxU%mcfvZY@Smq7WVIv6R zYDKdNYnrQ~a&x`xSBTPucu87B1W9NEJe^EvmY5C@8D0^so!b)8fNQh^>qi&X%DtgsGVl1oUN6UqhaSPb5j;w@P}P1 zXbhXQvNBW_6^>rs)KOIgiq;D<9&^! zy7TeQ!rE=e-&nEb;*9Rnlqiu-YM<8wR5(6!?joPuC`rx zZ%ts|?>n}|+}(4B>r*eyDRixW_x(k!lfQMX-#e>4E$sfh^ZM%_U%5YTMtn}ujTIXg z? z`C>s^ME=CJar==dz0Yr*DIHt4;6h(lP<-_Yi{uoAWiBW+7KH36+h82t-0rGLu zcl~jw$iHBNm11N%0P-7DMFH}0cE(mtPWMO8Ng+lQ03`w71_5S85FOoC$e3H^xtVCX rrXDo{dRYCU-$*nNVH#xkUBmqYE=~x6{ephj00000NkvXXu0mjf)do3w delta 137 zcmV;40CxZT1N#GzDgoNDD^vk|Ab^aXNJwYt^5OL$e+;9x#Hc_3A8i3Z!wSZa0QorS zyZ$&-k8AGUk?fZYG+p rsYi`~9#+5THxdm*mV0pq!Tv$Klt`{zvBH!&nXQII;gf zE<@18F$@4H2)}ynKgbYlnv-u|#&3Y@p&eiY&=ta629(2VfbGU*U`5&Yu48xu<~ooX zoCX+9>I5qQxd3DcvH>75kO5{3r{Ok0tuzm;0Ok#tAt2j9Y=6(whyQ~t!D;}^$uL)d zy#e(z%yy7CRs%qR2a7(KD?nl}4Islne2_Ru9%dQb0FXj-LtvUgVjwxkUF*T(FxP^_ z;0AysK#D<%kPR_kI{Uw7O)1}5Vk2vYc>w@@$5aeX$9p0G P0000x8mZ8So}F`cJ7MR-%#__? z#kL{@FA<_7L`V$cgAYb)Fj_+*Xo;Fo<-rF?yx@gMj6o`mwAAW)X1lwBDM*N$%+8sa z?|lFF|NnQ++1s-Ik;;n26$C+4HaA6E@qIyX%_+tIOUJSR-^!h)$323$yDGS55w9Gs zCWz7_Mq9hz9(z>NZ8HR*9Y>*z>0mTL)YfGjpl?M!8AnOOicpu2pP)zsMyO5U7#njM zP?yoP!$li+tZ&nIY}Hjr)jdqsW;9G-A|H?$Gi7;NCPL+SH9QVpGZdMF_*)}XeGrgr zkF}5uwu{JcNTPL4kwS3&v!C!*C%sNGS(|dJ*SzyQy4os52;qOl0{U#&Sih(`Ea%*Ja;? zy7>8q0JyZVSTV+oT1>MT!t>W{$7$pXG9%h+>v0g%iafj9)zP}`SY}O-jiWWV2>7XI8l3IhEvRxb)s}pi6Vll1R z@_bhySmXo&(kc?-v?Plht%MZ`^CnoR0}jbTqQJJnHSkgcsq0w-RS+|RM4Su5 zaDrCjP@+XBDs)_tbedOr8L6TyLzNE7RG-APyB&WqH`DKd?YCC1#-+Hx2@=hz z2+|2C%5*%;$=H}YRAn`;qOerRekS$Uy#ibC;~lEc7f0^`RubVIl%eiCpWAciw9uLI zxnX_%ulX>+-Z^bG=HD*NeYX#G5tj6YO zeVcMxpUP(IN*?Un+rO3_EgkHeb6{%rP+xQ7*I7YW#NB)J+83wF4~8Ztey%#VAhmdK z@3GDm6KCd#7iu2+y!Or1#PE0D96H;%d2{=&S%*%4I5qjg`M#x>&-WYi5{u?uyfXG% zzp*komQ^Yzu8eZS$JWTzJE#5}CO`h@nRwO6wYs|Ala~hGe(}|Tg?)!B_)|y8AL~Z4 z!nqLO4Aax_h4uL`1sikPSgDleIoP@xh1PhE2_2$!XS8RXK&ea zPj{3byU#j#x@LLxw;e;DjgEa;Hnfc7B(QAvo-Ob7o0BEK&l|bA=g|AhItYH@g?H!6 z){*Kfzg$|gJDbh+n`IxAK2SRQ;zefH@wSUTw#>hCayh-38(+egBAnSUTw#&~ODd6PiyGQ+0~K;Y@>=d#Wzp$Pzx#R;td diff --git a/src/main/resources/assets/betterend/textures/block/silk_moth_nest_top.png b/src/main/resources/assets/betterend/textures/block/silk_moth_nest_top.png index d102e5abfc2316d9a97b4589473329d63b7523bc..efca652e61bacca8fa1841e5c40abc5fe9281688 100644 GIT binary patch delta 28 icmeyv_=j;q86)Gw@=}2}OEcOTfWXt$&t;ucLK6U-ISK** delta 28 icmeyv_=j;q8RM;q<)s4h>kkz%0D-5gpUXO@geCx`rwUyF diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock.png index cdecb5f289892d380448969f8582875c3d6e3a40..78cb7e9b643043f8a9314c7b8ed6a3dd90009614 100644 GIT binary patch delta 28 icmey!_>pl!86)Gw@+^Vog<&ZSK;Y@>=d#Wzp$Pzwk_kTm delta 28 icmey!_>pl!8RM;qzz;DTYJE)FKffiO6*$`9Zdn3%XYxv()22TL0&-laJQy`}}h zpl^Av@4oi??tLY-?ohBG0P|d^nhrH(Abbx1Aku2e0D#C3Ie$Ysmj??1pxPdY!_ymq zZ%F-{C*M<;=i=%1jK~8X_z7O;JzO4>`E-IEecwbJ%y&_!H-+S7FAklWAeB~6gq(o~ zKA7)<`!kG3ePY>;c)q(J03dat-V_?mK&K`&gJSXa`gIriMcGku96y~|wj)TjJrK-u zqX~3sLUvw;Wq&(D)@+<$6XG?cMn@=ew|{}UySEzRHdo+*|GyARjm~O_+pdvRT0QZ2 zeG-j)aC9!XKZ8ay;QkB%BCXL3Uhc1=TFZ8X5^|OpRi`G#qdt)w*E(JOYn5~^pU6Qo zXoA;yweC=4i)BO^%%>CR)I|8PNUUl3S$57A%V3_1PZWMK5v`1qUW5Pu002ovPDHLk FV1m1HxNHCb diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_bars_top.png b/src/main/resources/assets/betterend/textures/block/thallasium_bars_top.png index ec2fdad4bc8b87c00d4c8042562004420797421e..fba8e1a81e3e41753feac57fc185ec01cde3b322 100644 GIT binary patch delta 142 zcmV;90CE420;&O!B!6*9L_t(|+GAkA0~}h`{I{xF^q+xT0McxdGl_fyK$2ACJl_^%UPJAf_#89>klu&4qB7|6*WHi$-MgJ@)NkXm>Y!!(0J8{}M&jWCRj w55gd|L`5;kHrj^)O%0&f3lt}1y5vRx*U^KoUI54`00000Ne4wvM6N<$f=sVCK>z>% delta 244 zcmV4u==<%rLKyuq7}rs44Vnn2#MmCrX0t!}8;LMJPlYMr u^ua6{^`M|y`=P8>j?)Y@5&jIOeB%oePhL22^`w6Q0000H07+D-<5l9{;rx{Z6p8;eVNYShtPyRbJt{|uxrVb>h z7uWEg0pui*B9I_RfRN2Fbs#wvk2Hu2NO3l@9NYkMG=s$9UT`2sGe{n60LTU8Xa>=6 zFOZ`d9tN;jAXPI6ql5veno**W9L*p#a4(>zFnpR}>fkPbc>y_v;jcuyLIUo!&6-L7_vK%rWgaHU7ppcYsy|e%T002ovPDHLkV1h}#Wc>gD delta 404 zcmV;F0c-w~0_k zeo>X8lj7heIOyW&A1ECJ2k~zZL`OI2;^1IP!jagdy*6>sAvE;^BIcIkc<#qN@B2PC zbAIvgG3bYcu1m!<8AVaH15`|t$@-?fj~Pmj@}M8GzR|$mZ+{^Jh12s%#xYi78M{`+ zwgfUzNPozz5NL*;X}6sYrO<``SOBo31-C{ zrHW}H1I6Xl9sYAS7uIw=yC(yM@*K*eD8lLa7>gF$$EUflU8~Y=9U%91kp2*W67Z+( z3H(({;uukHrhg?Afs=8ZIv7P!Ay_kXl;@-+6oEBePaRCAPy`nBX6m2_Y}cyOF-{Wp zAK13Uw1l4t%Y#o2SLi-IAp%{r?*2T^Zk-&lE0rhPpFd;%0tR_#kr84bq(00003-r5QX<2rAi|K30z^5E-5Y2rAZyMvCtx< z3pSD_Vv#`7h}Z~%jUc2EQlu1%bRnIkFy1%#j^j=*nt^5C&dqyoX7|F);L|QT6T5nz zTJ$im5J#!r^Bj9fg_-$!|D9R990v*^vR7X}oFL4e6@WZnEq@R&7r&f%Dd2`+*&JLjWAFQJvh-T2GL0H4*mc6!@R zzJketsi8I}z=zB3%qou~id}@<_Ut(@HRN*wDg;OOeJAKC!Q|8(wK;)woHyV63vMUZ zElcOJcd;{Y(K$G3TiqQbpph7X3k2_bjl#fr-`{zVfI9e>08dqJy!a&+jj#ccwrt-Q SH^?Ud0000Px$*-1n}R5*>5kv(iuQ5c4wLqu-V^4Dup z7+^5yq|um=Xw$`sE;=!rxZ%*SsqLz9Z#tMb-E=ga(19j(mCpDVq7eeZh13gN%5NDy z7okvr#AiA==gs@R-}zJ`m6dYELUTE3oYXmb`cSR!?28@_VSg1%e0=pt@fQ&R;Glji zfQql)#Zj(U^jfF%2Sb9P004S8gwMN-9u9GlgZi;VTx$RV;Lu!7mOO5(Vu^nL3;?TG zqG@-qilu)H0Q{PJWX7e&Nu6LQfOhRFg-w8zfR$`CaeOwp+BTrUK-~y*m{0Che*TpjHAwS@C+fvbxOc z2RGGJgF@br=6`Y&^5)_>@4t8}0C6KDw;sQg z$-BwF5Rvl+lMK6E;zmZ=c8lQcC~+er!)|wG*xW5_?jDNMb(!jy&*+isq?55J?Zs`( zByMD6eP@5Ba^VOg2K_$6Q+r{^T!Ta^D=pLHtZlQodpNi6AD}bd#Kbfte*gdg07*qo IM6N<$f_EGPZ2$lO diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_ceil.png b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_ceil.png index 1e8745ba6d104c8c05a0451af76fba3c1530c7ed..96ea3c60653182bfdfa65cde267dfaa0b004bcb8 100644 GIT binary patch delta 212 zcmV;_04x871MmTmB!9O_L_t(|+GAkA0YVlW|DUnx(tp$3$^R{jXZ>d&2Y?K*D49*3 zW)Se5vH!nS)gs~yDBp7p>|_wzrg8z;=^z6@E&#DXVjww?8jxBH13(fWCwolX2~rF; z1jGlq0K^7~f#hIegJA$vBUr+vV*^+N%mpAeNDSsWkXpRnaZPMq^&b|9`iU)YjYJ0? z%=sXjV9q8v20$7?UH}CkK_}x&2Si6Bwpg*RUj_~XvRwc&glx?t2mk-kl*Ei7bbnp@Q;F64HMPsE}o0P>gF80^huL;~qh{4c9q1qq- zj7u`OC?X|ra7hLLR;V^;F!bO~!oMqYZ3jKeLcN@4qLLv1Ebx7Nz6SunL?uJ@a-Q`p z3tihuTnl?=w`2r-A93sOoB%-8jmTq0TBGU)Wpg=<-4OslQkHS2?L=xLU1(M`Hg-o? z-~wJd&(lIPQ#4H4J-wOl4@$K*^=%uT^YY`&?38M4nmhR)@de$ueT7#pca{JE002ov JPDHLkV1jL&p{@V` diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_e.png b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_e.png index 468c93a1d7c5e8a8444a53b62520443250eab8be..34b5cc22260b6ab696ef6dd4d51ea25f43c3d8f5 100644 GIT binary patch delta 109 zcmV-z0FwW#3yJ}dBxX@bL_t(|+GF_t|33q%c=g-k|A83HCQI}AFZVzO{3qLh2Y+7w zhq;0*+d&4vTtSinvz}}LYldMEpHu_DhJb7a(I7s_VStWD4Hz|mDh2=mP09oceW3(+ P00000NkvXXu0mjf%-<~5 literal 1452 zcmbVMOK8+U7*0`Y?L&o%uZv^qLD6g;yWMSurnTLzcA=@YF1CtbXD73}p_@!hrrm8X zN-t9IBHl#stcT*gi0DnkgI5&_(z`+t4=Q!CkDyXt4NT_s&G*0m<%#igUF}EO1wrV_ zj%FtLye}MWt^9vNq@5QL8IaI^^b?jI6_of~#;noXNy5K||HESe{=s^f9A zAoLGbJ%nco19?)kT|@k^`cwqAWr$O~reb<&QnE)EeR6SeJck!&v2KZj1E9YOIe|kM z0#&E%2C!;~HD1Wq;jt`&8idUn;!r3MOq&xRO??7-V@V0C2@Rz5n3_~{EpZxXikgy@ zl&r=jMTJTd#&yv6L@v#@3UD%Wwjqn}46($R2W7cZsl+Pr81;*?s_VL}XtJhB93ce@ zE<;tx4SJdk84_UM_Lxmw5Hg}XonwZ`HLaWAcoD4|G~C1;CRdRst1%@ssRp!gg!AV7 za!t5}Wl|;%aaq8zYJ~Mll+mC>e?uKz|0ICB)-)p-Tk7ICk%)ke%yTmu4%reN z5P1@&X_@+5FxM_#)50`i)(sePG0A2Ok((W}Z3`;86~~3%q?9KpA?0yGl@LzGrQVdD zK$b@M+}C`cp?EF~Zu7nMpYPB6HZLwz-ZoEIa$#1$Q9I!AT4)r-MRL8dD%+rz2oT{g z!3`0IktLScIJUR#fjVuaL^$am!d-_2w7@FJCqqTiy)mS%0{?*Fb-4B)9 zg!6U~E~7rgH&G`eE^l8x?^AEwt6zAJyOzxi<@#RYubZ2LJ08xwTI~kr?PJ3SI>**a zm(amo>a*nCve4G%e|+BA^GZ1W_VCOKcyaUd+S+qx*K07)vAj}z_v!umjiGV$xUlcR no%_>gTE{x~FJ0Jiwo7Oc_B;`9?S1s^O4v`cBjcHs;hClHTU^LF diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_wall.png b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_wall.png index 87c4d7353b734c0c5227f2bc2c682ac58ca07bba..31e50d27f080314ae9676ea8b2b724fbaf9afef2 100644 GIT binary patch delta 217 zcmV;~04D$V0`&oqB!9d~L_t(|+GAiK0sQ~}AB7BvmImr%oQXVFzd+{ux1zr@kuoRYzW9^5Dns!3}7(o^*LoooPIb;E9Xu5Q4_z%H;Wb2+*6*L{q>|Q0k=hD0ZW*u}9~Z0#K~h^j&<8YY7K- zqb+_AQMU@(&EeUFe1;!tudpwE5Yh2GmCmk7>-1Q^(GFf;-syN=f;yXwaUBakhwgT9dc(Dj5F00000NkvXXu0mjfp<|!) diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_wall_e.png b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_wall_e.png index 5d749931476fe9124a5d8167ab64c896af7125b9..fc23c16ebb1e3345d568ac33960b49cfccc60ec0 100644 GIT binary patch delta 121 zcmV-<0EYj&3zh+pBywFzL_t(|+GAiK0sQ~}AB7BvmImr%oQXVFzd+{ux1zr@kuoRYzW9^5Dns!3}7(8fk?PU00000NkvXXu0mjf7#l8? literal 1467 zcmbVM%Wu<295%0rrvzGc30xSN9(b(dM-nFc1P3^9LE-=s{{Yw3iqlFf$~X@TRt0vkG@jQt-|zjqHZy&8*Y^F} z1wq(VuT^LHygM0NGyH$x;~L`AHotZu6oehWBx8ec>vmQUHh**)^K9Olf;M$?2-7CX z#jelMf^hs~>?3=TFwi7z$1}x0A3qa;gH7>#(NZkGLOM=uB_MMv(+zuN(KfJn@&q^@ zLr&llhCu9gy%5Hx*yn|OogB*|=tJ0|DNZB;!MrsCDl{OVnA0U&Eoh)*t8DJoQSm^Z-i6S=eix8Q8`%up8JnPP`AAIfqRMY$-Sqd{9%4a1NXP1ZDt zBc!nBF%(N)cyPo}C7~TSK69uC5=PXdOUx9xrUMgPKc)4;p_{nFdiU`@{GB;!Bkaf{v zqvsQOmV|UEu*u{ySMy+EjSnjUL5v0sO1q;#&5TqAl}ZwrGB|YJ@i2|T!(Y51Rm6xX zYKo@vkV%@_P*s@Mp{gHM@=#F*P>W)x)ms-@g89N%P@XjyG4w+)wqc6~F5)&jE@~6m z_u3*zJqatcO9L*LYnSh9VOg;5g$#K%saH*ro1JqU44dVGp_Ga($<7y>5>W~*$}*=lkCShZh&>{xnZga!FReniKMP^@c?;M=lOmT?h0N z0U|p|a8tCC$Pz3LkDZ_Pz<@UD5Kj7?a1UT1ZLtUiWTMTz^2~WJX!nnt9R^b=C2DiRoI%1o|gaq zV|6Zjci)Tl_!}XfdTx!s71)*R8*6-Qb?nBS%uaoiaOA_GOX|J&RnlJTlhf7vrxz}N E1~>W2cK`qY diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_door_bottom.png b/src/main/resources/assets/betterend/textures/block/thallasium_door_bottom.png index d6f436242221237ef94891333cc17c1b1f8e32bc..0127e6adc595c56e99b0865bb06f9c6838cdebca 100644 GIT binary patch delta 288 zcmV+*0pI?Q1iJ!|B!2=)L_t(|UX_x)4go>KW(GSO#q9k(XU@*OS$AEy(fQ%>!`2_|13EUe}ULJ)omOdkZQHOHH`f>3sQx_|dgNX35oAu;(#LF(pT zH6sYY_^2X}m9JP}NIiibQQ)eZ`9&%AZve9zL{G&M-${BHpg?j;IUX_5C4NO-60000?k)tZG; zrEoNxV@d~02wF`W0AryPsn(=R4NwYORRK_F73pBsT$gmIv8sZ4yN&uW!vExRkwlo% z0bsrH{ov(`;^BDWV=k1!ZZ?X^d)?!$lXKgf8i4t??eE_%`SLkop%gXO1zwn&W_qrW|FfQ7#gy5jxD<+?xo^faYkaVfBcfBmc+}bMnzil=4i_GGQ zpVgTEP?53}PPJy8M1^iSb&Q(p-Uy`(&a1YBAk~_RbgmC6n#~LGU$9jbn9?ED8n4sL zR#+%i*j^<`DQpSBI*IT)OiAbX?WB|*lbGv&;I2`aB|3yyr5C3#B00000NkvXXu0mjf`i1bK diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_door_side.png b/src/main/resources/assets/betterend/textures/block/thallasium_door_side.png index 23077abe5393349e8c3cd5132e09137c705b1709..597023e8272fc893f09a5a58182b3f1533ab582f 100644 GIT binary patch delta 126 zcmV-^0D=GQ0hpg&a2V(yBk=`j(!_wptG$~D9;%2*76%muqsQrmz7GL2D65C}=UcJ_u00000 LNkvXXu0mjfUT0hb diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_door_top.png b/src/main/resources/assets/betterend/textures/block/thallasium_door_top.png index 1259c13b28f9e72a1585a2b1b4c0c6b95fbe3d96..3431684ff1b852f89398fb0470bdb766ab68a650 100644 GIT binary patch delta 313 zcmV-90mlBU1k?hMB!3%8L_t(|+LcqWY64LZeBWasHYs8d3^t}ob+uTEl|^h0i@rGZ1;ls?V&%B0DnmyxRHO$^XEohCi|GD zV8loO1>R(U!|w$WPgSk^Q79nTPJJBAlmNL^gI*}o707O#YclfFaG^c=Cz6$9|H;MyqG##>CGlXDfe}H#?@(|B1Y2HZI?Do&00000 LNkvXXu0mjfX~~hJ delta 531 zcmV+u0_^?N0;~j(B!BZsL_t(Ijg?b9ZxcZfeP`}-_s-Fs4uVqTM( zdwBG*JU%>u-~x{4L7tp30Qe*3cph@bu(f>~$A>4-HXc7OfFkq>qHmdso3;hhvJedhh)?@y2rm8`90nA3w{F66o6sH4yA<5(zJ=}(*pwoP z#_*Rr3M>l)fSxmUDYNbnym@qA1Ay(Pugiu5EnWC#XOl~U4QVb+}ztQr34w@+}ke&=MV))`gMp#&X{V= zrc|*?2?x77n(h!4w<(1vI858B@&G7ZNi@bht2{sQtQPl|J5>?sf*i`l!N~${cohe` zJHI6q9PUCB263U?d-AgMTi21CPmzv>HS7L%UtC#57=KW7U%aYpGzfudTX26pRFZBW zic<*AL9ZAvZ408{3LN?bBAHea<~Qu@(-(Z`WwpN`?*P#5wCallpayPtT8QElH1O55 z4MLRF?~b}yTfbH1TwAK!ILk8Cwgk(8$s9Hss?D8c2^#Y@=8XLlEZdeJ%OEa(0#pn@ Vrmw6z%?tnl002ovPDHLkV1mXt^IHG_ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_ore.png b/src/main/resources/assets/betterend/textures/block/thallasium_ore.png index 1bc8e7e6b9aa952cb910c25524611e1730b002b3..07482cbcf95185a2dd78dced7371bfd88c58a208 100644 GIT binary patch delta 290 zcmV+-0p0%N1iS)}BYyz{Nkl+mVj zK3^rLkYdPatTRXeuFhSF`Q}gyA&`>XB#@^>(SLUZJX~DxF6fh4FB?>jj>dFu)0O)K0d?P-yqCf@u;XuH6!)HK)x&;&{ zcq1|?_U4@R3GTo=eRm$;AQ}09Lbs{gI=|hC!hvp@y!$CT*Da7tnTEYP*j*dh#_Sx& oWdd?$H*z9O*&8fA==>M|0nDIKmssAGumAu607*qoM6N<$f+7BgsQ>@~ delta 587 zcmV-R0<`_S0^b`^FH49 z-uHWrqtlI%DK!8(HwXb$1uB$CU!jyD{hA^Kh^7P}2qOkbihpQIJS(ow4Ks_&02F5z zh{N^k#w)S(6{gf^t%*A=wAM6^PB%tMDNf}hva<`4!CwIO_D@)OnxmAW$TO;QLsdaA zA7D!D+i&cVNzk$9E*pH>Nn=+QdAZbMB@WmYuV>(*j_Sq%^*NSsmHk;;2P6 zGzd>p4Gl$}5r2fyguA`{6V{e4`SEEN08ca})wy9d3P^W$sVXLR1}4PETboq9uIupt zW}|@OpkQWkndvJ*aJcRqb^UD;+Vp!RV(Cfk@@hci_rG@|z}W=cw0^Hdc#?Eym$=hn zkfhFG+-Xtd8J_SYgDfRe51bI7-zzEd44v2UemT1!nSW}t$lID3tqH=2Th-7Igb`hT z+wHivbU6Xm_zgbZe#Yv-eaAy%|JSRLZEW4UJ8}IY&m4I+nHO(-j<+^>z0yW0MdR~_ z)sYJ87{@WSyWXsEr!^6?XT?Dnp|xg^q)abdr(vzXod1SsO0?FPGDG_6It8ukf4GUX zy~+E2mqa4Z+%E)S1c2~lO`=89TI>I8JL0OLVSIp1z?2%DoBD{BMEf`vpz*2p(6-OM Z_bY002ovPDHLkV1l)z8jk<~ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_tile.png b/src/main/resources/assets/betterend/textures/block/thallasium_tile.png index e4b29be2d18adbe00d2f52550d19a72c55496518..4e21d16b6c4690aa19d1f4d07cbf8fdcc06b9e7e 100644 GIT binary patch delta 292 zcmV+<0o(rD1HJ-~BYyz}NklR*T7GRxDyNX%T~hU=}Qz z#6KX|Y=XgV_P?Bd3-h>l?9*`EyPKW4eLEBSr)TW$Zn3>M$IkXr+MA)*ahx9vMz!uz!kymOQcwz&)}auns)3 z3J~zfoC^Vu%$W}K3ps{p@e5u7qBeu?v^_Go319`&q?ijW&Mfd0%fCZa4p?apN*VBS zQ024cqqc=BC&dgrt0+iaO35V~t9(Wv&p}#a0{?tg2RWJjr;YMiIjG7>XifJ&eP-Go qSshvq8pCzrdmZYva**dlwX6>n7l$>7Ff?@l0000Px$l}SWFR5*=&l0A-_Kp2J}qg`VLV+#wR zg<_Q`N*yT|NRcb-1#*`hB-%b*E|4Nhl_rv#EmvAB5W-=AF+WP20x^o6@zM;^%cJ=| z-e-3A>HD!RB{EHMJdZ9g5A^7`F->QXW&b&@f(GEOobMGXORx@AWrU{>03)0i4FDEkg!7_7gfWMzGQxe= zA;NfE!35W(9DgSmS|i-I9RRa8A3h%Y>K8*T5n;^qOyj%JEzRyxXDUlh-e;FQ0LUM< z+Jk>{;C~PD^@_TbxEo*Zoc#DkT}qbg74wBn-*!3&*natpH7IqlX8@U|dgmzzv?o`G zs?vs?|7`%r^NjFxf#rDK#h!;+jx`$Ke6PkDfoFT3@;h@_izIhX&-TpFUW8Saj2;~S s{6?iu0EjTwU8^j?jcz&jWO4-HFYszu0|tbdSpWb407*qoM6N<$g1t=2oB#j- diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_trapdoor.png b/src/main/resources/assets/betterend/textures/block/thallasium_trapdoor.png index fe6671815174cbaa98f964f7ed34c2f4a167ea5d..41e7eee2b8366608052c3ea8c755d10d00549095 100644 GIT binary patch delta 288 zcmV+*0pI?v1iAu{BYyz_Nkl3@>k+oF2Bfy4wE!X5-n>Y2IR!w}v$s zvirxbUtg!AbmKsPeY-e^SVJ^149-v6880iHHLRf&F#w9vt$%GLQ`;Uboc8Y_HlF7# z&e3c4)NKJQQdA&&ZZbrYx(ZZ!8hwqmsa!>*MpTwn$-t0WREA-i mGZ>BbDm@VtRYNbyA0000Px$=t)FDR5*=|lD}&cVHn3hZ+>5rGieft zDTt{?sf(#1uCCXqgAT4{$l%sFb3t$rmku4GW5Ge(>R*thgMok$I}`&A2WOkh<$Ae< za1QZ(vFQmu({nGM=ic}GeZJzw$4)S@$Ba!AP1mspr{r!`@qZi#08Q5c@EnKr`}bI7 zV-tH!b)!P*@m;KoOFI1?@pPKC%1ugz45hU+*2N{(xl0%u8Jnhp&W7hKJeO?lM(A)D z8`E@M9n7XaQ7y~2!wc`Ez822aB_4Y>W#hN z`=_@8K=%1N4}Sv5rix{zzf2;De38o5Q#Oqq+~H4phi^p9Xa?POOYo<+_RKWGn&_a zB8`=+Efq5OBMT80<>UQbQE%+2O~^is6~_CoL3N{|eCT}sf;$|92C26FoK-e9Hcgdn z8PBbkuhgofVE||SAJ^E(YLrvOa_DfWkRdGg;>qiG!Q7i%iKlcJz#m!aTSTHrR>uA} Y4(w||un)L2lmGw#07*qoM6N<$g6L-k)Bpeg diff --git a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_sporophyte_e.png b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_sporophyte_e.png index e72fae7808fabe397015f6a348da213246a2f1ba..703a1e39e6292355ae7740c6081ca2d459da4b52 100644 GIT binary patch delta 129 zcmV-{0Dk}P3!VXxBzk2@L_t(|+GBX&df`6^A5%L6#xOn*Fc5EWaDBa%`jJxWB|G}_0Wi(z jG|>hSt8mnSVQl~aXNvB(t8_d$00000NkvXXu0mjfGov(N literal 1519 zcmbVM-)kI29N#8VZB4Ks*i#=m*&7%!L13ZIX}0oo;Js z8a8BT7>2BiZmlNRxa&mxY62{vd_Mx!SE8|vixCIQ^FmX*lZR~OGq zL_}Px)u<*LL#~n+GKW>t9d-OCP2lIU`E3#rLAG0=7%bSVlfWPBsj6) z`VMVJ58d#Fn3$2gs46PtA(K>Cg%If)%4iQO8d8)#)S`}CU)vX&MLN6*%CpA74F4#U7KGSlGR`Y#zJ zbN%JG8vCZmf3>oAcSGe4;k+Hh%cKwSP14DT&)ZkX`_#lcJFC3My<0YCs*|7F8{e*9 zn;tzf_1xa=CMiH4(3_SSK za^dH%?mCRy4z3va%75&9M^M0Z7!3k%l)BWaB7ZjH^YU4}4ce~T04{UC|a7uah@{%G5 ZSHI4__TbCUycf6R^6Z@X;i;u_e*y;!3W8u1hG8!z92%M=Bt*>NCnQ3gTG|?dAc~?v ziXf<^APj>rj6ety@2xBFe;d33r7aphzO$T%!%>J@5O?A1z{Q2ohKCKHl!+pbI&4kw z1#)4*Uckwy0IVA1!#Z-H!Q4ZRHS(oe9^hajCpyer7+J-9^;XIQ`MO3vRlygqabPDP z=~uWQ?LlZF0|x>Dkpp+D0+1QVo5s71LfV1MfS0K7#JE{3CuY%4yXevvz*qSLKLLCI XQ3~+eeBYnw00000NkvXXu0mjfRTE;2 literal 1551 zcmbVMTa46H81CvW!XStdPJO9N)T(WLEZ z&v(B6|Nh(I(UHejB-SMef>@Eysbl!PD!P|0!O!*A{{Z;4%*{RN6U6d|qPvSY`sO19 z(S6-4j0fY|4oOEg0}NDzOlZ3pO%PiLLKo;0Fd&PtY&tUa^9ScC(llghPoKtVt^zA& zuI|BI^^t;JpU^V~HL#7`8cLYJh5;Z$+j4vFbORGPWW)%HXflu~>}gAa z?Z&i@-wqQF7#jkYEb5DG$0qz>cnZsC2V_ySU#Pi|9fLla^mI5ph289p)VPx3K@cFXfRNQm)M&?L zQc0NA9Bk#Qs?1zE_$hOu|arWcwf7N&g|;Etro= zK^1r~TgK7)FBQdN|JkS;TTssjE@W9%cuFtLvE%|(CsQCP)#MI$jqp@!8ll@0dJT-W3 zU+(6zubkQXpx<-(r@=$H_wHM`H$1p<`|mxQtid&>PS5OCK0J8l(!<|{OK3 z$G`vP%>3Go^$VZA`h~aQ#+nzeoxJDrt&g|uy?=V(>T|!;pPiq6NSC zMzjGSO+FV+z%k4aq6~m(wph9FzkYwmf0rY>;f4@pK=kb^U=1*5gA4*00um?60GI}3 zF_7xy=mCYz0GQ2K4FH)8GXz~B2!q6YGLk@Y*bM*)fDFN=5QITu s#bJTC4S)e;g~$LTmg?$&A`UYE03p{1e~KMV-2eap07*qoM6N<$f_eF2M*si- literal 2145 zcmb_eeQeZZ9PT!9PB`LF0-F+7OOT27+PCd}wAr!29ePW=ImZbjitt|h_SSIMc5S!2 zTlkh3AVdt17$yNp{6iCwU_vru%=l1TBm+alVEh;}nrMPThQwfq=iA%e31%Q6UefE^ z_IaP*^ZWgt_ieXzv_CU_>cdkBf|%YGi+193oqN=J@PFgg0>r2L&DaW?Af`R!9#zD^ zzIuZ29MlqBPFMU{Nj5S*s2EA)%VkWACWz*ioC)PM$RU#`rRibn@<&4ysVQMj>ZVu&g%}$(Yigi%n(JkY-y&W89M1Q!lcpb zgek0aB87}uq1EkDnQ+0F95fl=W8IXBKt-OmmAelmP|$>Zev1Z({fE$jI8~{O> z@VR2hnB$+Qs$UiZst}}wKmgG)F9>u9vNA0Mc_6Ezs0yN3W_!-k@KS^6n^|2|3T8wK z7J~c%nuQ8pCrLr2L;hfh4sal(1fUucIN3FH(IZk!vvK$Gr6sZy^^`_wjV#(ig0gG( zFeSTvMhaEBtxZyoyNXur5)K?m{c&jVXw{qQ_;_PPz@GtW<(_2Ih(W8vUw^U}rjp1SE% z3Y$F1^EZC`vfDb+O-Uhq272kPML)?Ll#I=zp4)Bo7O zp$yo!Q|G#?IYHQdNYyHdf zb@dCw#M0Vo5?sq(KK?`3%45T|N4}Up_m`H~n7X3j)QcbQ9^1bCWOZRfe_{XFTl;-4 d%~|Fpi2U#;*4C=;dfbnIwk7S+_ZP3;{5P&%&I14d diff --git a/src/main/resources/assets/betterend/textures/block/violecite.png b/src/main/resources/assets/betterend/textures/block/violecite.png index 7b3f9b76558aeed726f3c074de97640c7313119a..d919a3a5e468d581b2d44114d9cc94a168d3c156 100644 GIT binary patch delta 28 icmaFM_?B@(86)Gw@-%_S<962=fWXt$&t;ucLK6Uzh6#xP delta 28 icmaFM_?B@(8RM;q=d#Wzp$Pz)Pzja* diff --git a/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa.png b/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa.png index 5b757d6939a214a776681b44aac649f0815b079a..5f5dbb9371b42ce170ee7370e0e685135957d96d 100644 GIT binary patch delta 571 zcmV-B0>u5s6Vn8cBYy%KNklhydvb2wJmn=4q$DiLL$OIg5dArX zCyxn1bdaqC^N^T=iY90`-qg(VDI(F{dM=+j&ciE|o>ih{8#t35M0HXO&aK#Zp0H8Tj+GA8aO8Xt7 zkiA;wrw@)(s()qofC%Bf%*2a~N(rXXLKyq?i_8ok8&D>G!__ZVmFEcn3+m=0ml&g; zjo5~&JShN@klao^I}bvOnC1|x%JT$pW!eroVzEyTRezBu1-MUj_=C`5Q8`+6V(LF7 z3x=vZDZoprZgl4I23jmYA1#ejUsawIz`Yo1Myzjr@g<|o8~Pqts=ZlI?C9N^+Ih9a zc-V9Luk|Cq_QQu`T8w=UK&B!5<6`W405Xl1m1ITJ#7Apsk z)x0cL4m6)F-Nm^!23zfOY@?002ov JPDHLkV1ksm{PO?+ literal 2502 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 diff --git a/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa_sulphur.png b/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa_sulphur.png index ef7c10fb39f997a89e3f06428e7d470dc18c124c..4cf677401e9196f7570e33f1efa2c7886004583c 100644 GIT binary patch delta 508 zcmVRaqN*n{1V^`_sI< zIqv^3JmdOxv02;fd>HI$dJyJZZ~I=$vcCXO{N-LRn1+Bj2!Ez%j319hF!<2`C>Fwt ze7QCaLBSAtv7ZMc7}fw54M2+55CGsQL-c5Sr94_)sz*XFl@<=b^wHvJO#l#2BLvec zSpW)@zkmcFU^DP0Z=pyC$9bE0Vo~yWKkg0000kccLhBH)V4QZbL;BQBOb-@v({z)boe>1if6xtSsp7yxiTVIRD_neN^I;A|t+@ocQLi!)&;o*?Q_VOLzLHbZ*KUmo zRhS8krOj%ZHjD%+W<+IBp|A%g2%Hv2QX1OAOn>eUp~P51&PQMb7Kji5EK!SKG(e1s zgJ!~F6o!YODq2HoSG^P}LB+@mP%djU7>oTYSc9Wl+HAx)n@J<4BOnu{oRpcH%)TR4O!zVpxpAi72I<&zUVGNe$|cOT`2%#smm176~L;e~|!#F|mM!gK6O1N`aA$QU5rwOsr4;g`E^u7s7JaV`R0N@ zZcL-Rd9mb-F`nIvtL}RSNA4=xTf+l?*k)?wc}$F+;PFOo|CaZRr*=)s%{Wl`sH!vD zTeg*WcEC5Gx>B~ZP9l>f`?cGoPqsWB)vYkBiNn3df0c9C;Nw!Tv#sw&`=&z$HPl&} zYAa%-&bGeyTWX#@>2r1Z^xTZv*0e+Nik|{!kYn@)g;%$#rMTf%+S4ty@8))Hoa~cNcC<0qkfduUCREI7X$Yc+s;L}da@oR zo9Z9;_ojixBs!X@W$r@?8F_9 zbu0IKT?h_u4!L$A(F09CJO(dCbSJkiX*wml180w&ezjttt21GDeaRH}rE2$+NMwF) z*~Z`88}44ozZ$VqmJY>wR(E-4y2GsOvw?>UmleCd2!{Y;cv{GDyl zdaH7YiU~``ekWt8vbMCQx?kEtyFR;j{50BI_)S>R;*Zy!8q4-X-D*B_eO>wGz6%|1 z8{}(}mPVhUwhAg&Y}3x)(0MLG_QB>mCb^`#oj8k0bSXz^`Lad&f`HD4v$kbsqM=#m zAIz)xx#zW(#*mE&+P|WT>x{zj=b)Ryykpc>%p?qkEol|9=;P_U<-K|$vet~wCMP4 zdA5|@Y0vX7+Bs?96Vmtk!0OHvINHzbUuncw~H3 z?!vDwyYz?gAqC@E3=_?8f0J&Ruqq(Pf$`9B-{*Bohl41&H;sH1q%nG;}htj{g9}g|$NhB4|V)uVkza&lFHp zvOn!1oize+lWbo{Z|dOKi$=$u1=1xH{n(Sq-i-|EV$=AA& z5d|X95IQ(KL=?!fh52rfRfEs7gHH9`Iv|}@`yrj3NLd$1v$+RW*l+!McA+cabKHZ! zpR{M4!fHEb(rIb5k6wJm+ekoP9|Lk&ZRfo9=jDIw6?DO)7jFba4mftj>M9UN`{>0R z0g(eEUE0p!j}8__(2Fk(;q{HDCq>JyM1kPX@fCW=>l;sVVU7|4s>YWF^7^K}pMr&D xUVI7j`eu=SN|r2HvSi7UB}%d`i*jMzv_i zkQb9j>2fz(qfwkhFr2}R3~7eKKNzUV zypzeb%?xXSD+}yaRX>BG!C){YNTx`#3&qW5Gl~%?K_CEuD5XA?4Iw^dQiQ=KD4Z<% zRZ;Rm8YAnF0;&ZDP6tEq`lGZyC7dRZFf_#aQ9K3HLK*<_TomUI$esalovv14q`0LYp^iTOjsQrl-5%Ars~4{~Dxs(uB_ND&Lhg!I@=E;znky($K<0#u z5@2(Z7LA`tmjzap4M1Vi`(L*A~VECFP4gUJ5Fc@0cUlSXHpV1V&&8P9PYa zhhq#yGNdUPBN+@EgxV!ube8@QN-{XkP~U}us^M9c{Yfy-F-}SLvLI&B%en;A?{mRW zG?Prau6;4V;-2FhEamB(4RGBP_;}h+yU^gNZOXog|%#YTW@QL4%_~ zBJ|#hKmg=9Q`8)khIQu%&qN(S17*svoYsC8nA7S`;NkFX@hH=$dKlP6On16*Wxwm@*#$iT*cOaaBHz7vBU_{IqO(T?l2siEJm!hvUZ zy!Rs|4K@>P7~RFdMRXq&d>~aa*yYw=eqgLl7t@txv*yij?wQ-}JDoOe`(x#o@?Wcr zt(!4CZpw<5n6;1Y)af64`?cH6WqYrTTDF`T-cpmfYSyZ<7ZL-T&z3u;{mpb}d-fye zULAGedQ!sn!@=Fkl0_-?dEG}lTZ=1PJM?~T?weNv%c|zOP#*$rMVN=%Foz&H# z6Bju=4T-;K8A9bJ|1qhm&6Bi$RM)*B$J0 zzSo&xJu_?aUr!ZQ?aEoVyYKDx+A{Z7wxYBlA0#C-D!6srLp5qb#^JaV%~$#k7F@jf zS<@e6v_rpV*cTsHSe;Z_*VmU4CGO>A@a2iudoNV1p67VMUw*4=BX#kSh3lI}H12<; zsT+H>`rHEclY`Q>)JH!zEUT>hrYUQ3ZR)YT`8C34qp$vU)7HY;hVq_{=V$)r_|5+P zAFL|ecB5p|$N3|^+(3q=FYRi5qI&<4OYgVWh(%R@+PHw(S(v8}z^|{g_7_ci<=Nd` z?X9O?EGv)AjxGB1*XZA8HXT)Nbhgi`4W4eCT3yyZsj}+jZxnR+t#4)Y#tQ%1 zcYeh9IjbMEKit+(tAFy^x@M*_aDL04Pc7>z#%%aq!5a%tPTsVWuJ1Y7afF_ILb|+h zDRXVdQMY{SRzutSP3Og)38Te_4t-u<(&@adriQM+`&@Of;KR7fp+^0CJ>~N@cs6(I z?ZquC>wBR!@h7JCB{9LdC4X+R@0;L()~J;+8`16NXYy~)s>4t2NOT|YWv+hrB)PQx z!9}oKTsn5>?@QX+HxXz40#EzrvA$c9l(pi(HU7-9{))P)Li!)i9sA{Js=jsHvjyjR zd$wGeRFu5=AiYfCkRg#>tP#m58iaiCK_aG$l|@5>WhI6KN%#-c``7t4XAj#+ z8fwnjLiF%4o4wYserK)qZ3BSuJ5_a$qvGxuwVb2UuR)ixsDy!{y!!S81*N0Q5Jl#%<@qapr70 zznsPMkH?XBpnpd|uoD~ycY=#achI8Qyb}ihR2ln?U=9Q}ZGjZd-m{38VWe~3c! zw}mlx`(@1bpF>V{tGHuq<;iY%T3*A`{0@N!$?QAezkfe!w!h!}vN-bVI*@m`4fD8k zfe>89hcJCpJ!Y04#e!W;$lVh`VX({WRF64^0eEkI&aMMBPridXJpf8vnynV%nRkrI zJT+#^5(Z-5D3nD%O#o2~GsYa|+U^1iz*u$ZWvY+`0SU&K%(ER}nr8=Q><(d3eN+}o zwVP+&F@MG!=KhlaLYYP&^Be(4UqU(W^d)ozK((PPoG#Udj=4Z7Vpy60Wq09U0OWfh z0i^F82apdBzgTX(bcEFfk>eP^WOkd(mQDf)sl`h($ literal 2563 zcmb_e4^$L&9v{%aL?IxIuG5=0nGrTSGy8uARwNc(#D#U;cfd)>{P``r!R~A`v+S~U zouWu0rASC3cp;eGr4@H4T@SS@|KxRsS9yA68F$y6e>zlN>P3Xz%(85qk9@w~?Rzux zo8NqXpYQkk`F`d%yWUo`c;@sUO@|<8W`V_Qm#?sLOpBAxVkmS)zTED!l!*|Okg6Op zP>?{6cj&ILBh38hC(L5@jqA z#mXvKtx@=-v>s0sElT+{az>HbCPj;mS|7mdK;-=b3-W8^i1$t;=5z59FS_{esU!M0 zT8)p&696sof`jL)CmLm&V1e`Ul*Sn0j1sq(;{)OYN}$LZV5TKtLe#h#M+qENYaE1z z!i|(hHy@V=_&C%mTY;k``UbGxK@f6_{|Cu)ZfEVyaU4rIdBH==61hEeCBS^%%5WU3 zl`8Ox676L{f!Tz}Nvhm#jsgbU$>?+%RL$u~REulXDB}crR0{~Lo;0wW0T?FMn|ao+ zv`<+-?qrT-fAsMa{uq)x-3EJ+$slF_pA$w;FNXW(!ROY5Du6M?^to5xr4f|ciFwKa;B!(qX_Mk!klNI^9}E$_bj{7P*BVGptpPa7>2(}x&?|b91cS<*HjuK`05Hr%^^;{!;FOk_ zu;LHQJ|ZsbqP>+s-a9emhu3p!uAQ_SH@sK>*J3bb%N+L^cB2Ku&%U$0%DoIv$$Pdk zjD9TSo9O2Tcx9ag`D5~IL*EDlO-U{==Q>Ic4wYD4smt!T{z%QXLpA-&dQY_X_0>Pr z6+e6y-c#4u7+?SQt~nQSKQDU)Irm}zBcU$_f7O;5Oings94<_*U$S@4JoiUEjuvOj zCtS;OXSXd**^;^L9dGEd!QpxQ8RvnmBhD?LL;Tu0kYn}DFIn``3w76CD|tM<{LYo# z39mb1p3JG3`+@D}`j5A)gHFtfVGhRre*L?y9V3vizGG^0Sz}$v(o-=n&P@J_6owyM z0un}cewN5p9EM`+rhK}f+jTl?)9O`8Cx5-#-ZdlZ>duk7kG^tGMNHZVH?f< z@k!&}cCH`p*!{XCD__+aKbCRNtk_Y>x8m5ER}-IF;`(GLqwUa{_ZpexZ?f-y;)>0- zd{gm?%T?v(_9IvSm>TqnQ`7ECnxC9oU&d@?E}Xf0Y18aAJI2;tHEme9E$OyyN1$l5 zuW(_~KQ;QVJwJA;??d{U)k}}1}^EEoFQA zGllWalYh9puz0rRFRIzcfAMhcihkAcl^YvO?z}ApyL!3<8(w;!K;J*#RGnzM*w-a| zh9q4{%)2ya?UTM~@uAT_pGw|*Frrr&&LfEE_-1AoqH|BFFQw9)f*CiGuOPY zxw|1FVK;SGc1*Y3li&04hnI9)(+ZE(Kl)ScrH^dJiWQwLMU~tanP2T$W1%k0**|v| za^A7-tmcDq{L`$&6W8}u#ihUDZ%ZAqsLBu6Pwn5n)}E5YA1$-ZZ&>~xduca+@C7iK ev#N9RO3S8oZ^geE`bPPiR*+w0e)*w_y8i;vdYkeJK`M>+we`FCL7br+I3(AgtK{F1> z1qu%0Fo{_I0EjBiVF?7FAVii@JCtK;giJk=t$`Q~6a-39#~;kRLJ;GCMgtMVN}wP$ z!wP5|&|FBE02x#^o#qzMHi&2&$@EC3aI@f6VzrM70fok(4nKf67U*htlmZzL-%!UN zSQ8~Y$qu#306COsQmjJ4idIDhaxNRK*@qPX04OV literal 2033 zcmb_dU1%It6rNP_Z==zq#$wAjDN-@B^Se7cL)SFfP2E5?4avf$P%(Gr-rXIuJ2RP? zWH)({G{II;YtaWQR{KLie6SR1C@2<5&^)e~m#RUZiWGnF!HOnry|aJTn$}Ppn3+3w zzWbeXzH{z9FAWVov$bh^6G0GL`=gOz{3gA-VGDk)cl>k)zZ$LR0f!)(ANKAV;_Y`j z2%_$k9v^i_V*`q2W_@K=aR zyRM}$OfHx6ZU<@j6gLf-4KO6 zErpP^s|Ug*__AwjtVyPg{r?MvggYYp8DuTkNbjW~EKnbkgP>;;8q8v)m}rjzJ-p@-wr3Dz^X+SR!cwBTgR?hX-XbGtqCCpzWU-bMpn2sU zqBJkh2vX%~eFL2~=TV6^mqwWMF3B&!95dFdP5g zUH@x5jCXdHN{zX_3XA`4IcIS?i&OaU_J-B2fj_E!2N_r@8+Vm!OJWV~NZ0x!J@M!l z+E_>JnX$IQ4)@?6m)0)709(mNc1IUxyVC2q_db0WeZOy;ywH)a&<=XG!Ke zuyo{!#Kg}x=MFzG`%3$4Q`>>lkBxM~tBn^L)6}6Q8iUp}5V^4#LVq1E7p z_a9w;b~Ukf#y}TzeTnc$deO$>(~MEv)=ZvTDKKi*vIQzcP-2|EED$Z zp_TLV3&#eI!loQQ|LTwJ&u_`6hjw=TU>v@xsCy2$>7eD`?_C&&K%Kd$V Kkq>*v4*do3LzIL7 diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_1.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_1.png index 470fcd5c606596067d1f2c90ddfde98bc351a80b..4d73ab1378438b8d0f91c7f506051d44d0832b3e 100644 GIT binary patch delta 659 zcmV;E0&M+@6siS~BYy&MNklnu7|5K$+aDPSPaO(*;dxlXl_}+ei z?E`U?heqLiGJxW{5&Hp3@4tpCJc_lK11P%PWk0~ihdK&x#gON{i4|wA*bk8J>qTK8 zhOC-X$o5>cA7I^$e&k&WVP3TdbN1KR53uq=7gn`CgTs9Qj@^gM2cW-cHEuf>jx%T5 z`Q}d)xIKn#(J{Ds$Duw}f7OA_kuhwEyuk+lQ>^zthUe3FQE1`e zbC`eBi@8;&kyUq9+%dMgUhmd>zI&#kXuz*Wf z)d0tiYRueMi`jdRU{P%ovg@0X-x@%HuM@7GmvDwhGV8#>#5YhUzJL;!6Rj5FnRkrI zJT+#@5?1OTDU|oUn*^d3W{f$^HQfaUfVQTiFImWdfCOVq=9vyKW9J^sI@W+C-Zoh% z*>0YB$A1`enEOux2&Ef=%(Da_bqVFXQ=rTIK?!h-PRKl-Y%U0g&&3 z1dzVB96&xi{9?KB(h)`%M2=+uQ`v1QTUrSqq!w2pWZVt_ZK9~AbRv1Ss<;4<2Lh<$ tP|vmiP=*!7IMlOk0MnuW0Mice6K_d)l@-Cqatr_f002ovPDHLkV1g%oJ*EHv literal 2571 zcmb_e3se->8D4@y05yougb0(NMogHU$HMN;$jWO`NL+$SWcw_neuz zbLYF?|Nr0r&7FNUJ8SXe(8oemD%Ir74C69*MZCwuLGUb>l?}j4h%+N!R;j|Kd5-|q z?me?rs-RjiCr`;UEn#@cu4V;^18TS33DGK5Vv^g*@txsaP?fFw>C|>`p(eLmrh03WmE`Cr+vfZ%IC&!25B|VwcSqT;OqF19sq0WQZmG zSg4Z8T0vkH_B&v04oN~J6HomISQ13D=YK*4o-s=CAv8<1vmlQ&<8OZ^me#)kC9cG!&&{IbKVStv5=1 zvA2od^&@^3Bp!13rDODD0!Nqy4ol!@4MywZX^i8{8jKh8oIn5$kR&_C_MA(EuM}(h zHmf%)0Wwk=Gesw81dOL?Jw|i!JUr=Hj1zPMq2XDrnJ}ZsH*wP>o8&S{0@PgNHMGxI zOok}K?s-OEk>y~`=*T7_J})sW@3p%D<-L6d0y;V^j-%6qWi&!tY6Xz=2bwr{=&a6f0-@$;q2pev_NS9feG3K0n=%{deS6^nSoYEL#+YexUuTT%bp~d zcyi2*KQjAKad|82umHG&;^>dB=fPY%Za4n>?fSpggM0VR5v$?fb)oOsxAs}sPTv&V zyuCyJR|DSozdOJIrE^0hc3@U;)B;bxw*Oq4u0QV&^oM`CS(e&Uc^hdzSY91{elqcX><24? zKOPLN2uNPupS`NZE`}s8ov_Ii=v1b!==d@)_O~E*L(R^NjbY)A&Fv9v`Ti3H74}GC zR@c2J0`n(795Ur6Tk8uhE)F}U{_c^Y%|&|( zOh;FSXI=bhT@||Hlb96!#K78C(iwoXM+X-3@0<$zWV<`+^_tZ;_TGBsmxZCFU$MQD zCd546TM%{cPT}dz2iMq!mdyUk^mp0jvvp*D-%|(Xoo|iqu4v3pt#AGLYi8Y^Pv!G- zYj(8ln_Kn8>M3#7Cvw~GrW@bH*Dvmjt=Tgibh+bZRQEtb=u4k<2TTRl>TPS)EoaU@ zdYFhTC<|P7*+}ksna{2L-EjF0A}{i(br)t2Us>etoA6LTK?&Gd!!NDcbuN^&pZbn4mt`~nj zWnfEXW6R4yzuLW$DLgA&=$^54C_3w&hYHRkciad|%?w#QD`-equ@G#iC=ZDYSk;%j z^QG%gK2r5qn$10-@r|XAFIf0WZQvSlNzdlIX)9~6c{PXPTAxujd;WFcWLINXs%qz^ z*Ow05t&Zvl$-hx?B_^^;yk6P#==;O#D!0aQt$HvO~G#{ z9Z8;Nv(noSPLf_cb-iNn+M1fLZ=K|>dWN@68_aNAsb2l(!sk-w|8;+`Yi7qEFEp&3 l-_ZFUdztEsZr<<_K0~u{f68E!+WU7cGd;_AICWLUzX8D6q(T4y diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_1_glow.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_1_glow.png index 5556a47f272d5a74fd4bbe7592e46b76c51c3db4..f3c96e462f3d36c964bfef427dff4e5f517954c1 100644 GIT binary patch delta 198 zcmV;%06G7H5#j-mB!8(%L_t(|+GAiC1*2dT&>eJq`oH`8e`FCL7br+I3(B5;K{F1> z1qu%0Fp0SM0EjByV+jPHAVii@JCuuRgq%H*t$`Q~6a-39#~;jsLJ;GCMgtMVN}wP$ z!wP5|&|FBE02x#^o#qzMHi&2&$@EC3aI@f6VzrM70fok(4nKf67U*htlmZzL-%!UN zSQ8~Y$qu#306COsQmjJ4idIDhaxNRK*@qPX02gP9YeUF3`Tzg`07*qoM6N<$f_&Lb AssI20 literal 2178 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 literal 2715 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 diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_5.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_5.png index 94b41e534652f08071f3b976d234e4e1c15c7b45..6120cb0a3ad5ae18422813966a32131124032197 100644 GIT binary patch delta 666 zcmV;L0%iSy6tM-6BYy&TNkloY>RH7D$l2DJu1dWo+Vk$LJojz1mwVl!Fm}#OBJF#HZr1_iwo%`K< zcQhu}9^IJqa^IXCBb&pH2ZMggGw&b~yqVsd-n@)<=Qg)0iFd4 z(HRFgS)YT8mvik0@O7_&$6tVB?m4JEkYztWvu`4lxQ25fPa5dfsH)3ee32#RcFxdc1wWGOp zDK6Yuh#QZVpz*Ko_c@ab%vyPl(-G3I%?61{q(6K@gT^|~+`a;DdT?_c+UhRIX3L}02t zVf1+xkLh`G%#0=c9IK+?!(fFGL@LY}bC_$o3N!$v%fCu5q(MM{F(&d%2dLRG19it| z;dav^QGZBpH+`Nl#vJDUlK`rv8iB~O1R!|{^?4^Pp(Oya3`OB&Gsw^?6-Y%C&5YeJ zx$rLl;yw@nLid&fh>M3`EH+*!LhC{z$0~s7UgKrx^2JAmT#sPi;!4vC-p_Sa}NB{r;07*qoM6N<$f`zy{ A7XSbN literal 2561 zcmb_e4Nw&48D1O9zs3|x(P~^56(a8K&;4&X0XY;1M~IwqY9?iGcaJ-{yFGRn56(Y~ zKVWPi7+Vtp3E-eMMiN^?{6Rf+NVUxj7$yc4jmBWeD9M;wXf@V;dmILCWGxdRC^}X?#zFNB z@emZ&>@Zs-iz%04c$b1^c`K(VcXKh;Jv39oNwAeGcDN15*GEqvu!A)qg=!OS z@?>y!N0v|E3VeBH##h4VStNBnoKj8!0v9LIaJkFr7O8Rr65yr4Sf0iZH~^7K3`n{h z5Vn}|;S65jV6{SnGK7kRwR#1i!S$qS9!%nd7Q?j|p+s?l!Znmq4+nn;h$gT$YO!%) zFc!EoAa+UeP#EU*dKF%!f)|Q0La*0jIEj%Y3J|DR;g;xf)Ga2AG8j3L5gZ=L!MkCZ zk+$+>k^upkj+Ef?glOGjP$nQ4R!(~`LV?RA1%NCQ!g?|i{=Ushb`trzD!`a%vB&_!f0Y1J1_B~o&TOXLXSh$ zc&H44qa|K2^SpDkQTd}Ra7KpQ7#*Bc=y0>VSA0qi6kNj@X^Ar+Bu?Tefup3-OeiT_ zM=90GI2hm~P!q5MOH1^_U=qc(0kE1>qq>|@(kbzNk^&GdYs|3EUMCQILfJ2I#f>raspQ~TAJi+q=p=2dq!}8SBiE% z%qnNa0!C74BlT(}i!ypWps=bKaMIDJmDRGilA$#=+=js4#m(TIykO#4pt({ubii0t zmO}*Hs|da#1zc%x{VJlODaK2SdE%RwHjGZJz+&{oJOk$T63J$I$Hf$*%LUW zB1YZ#BeM^R%h+jmF$Z=~4Egc(Jeq6&yBlM^UH{j5FnRABu^RTDE(|<-XrBe`3`~K| zTONkK8sH}M-QnCoDgk^|j(_yC%MkQfShg|UY&ktxXex<)cCrCe{=;rcoE@?JQqGFs zn~&`M)wab03tC$~YeOz4xxbCJ4u92|>1``ZuCBhi@Wo%IcdqMI)vwEI?w!?hHrGa; z{p;o8`iV^)@S3d!`|2)c zd(2`>Bf015AhD&R|Jti@i!NLrICn99^Fa2TXSpXSBs;D2fiKTEFuU_<|K94{eT4Id zt54?*kKI)Z9i2nI@83W5_Yh5d%|F>wV~9kR(smU?UT9|71(=LW_7+7R^3+c z&cr1@X}@>By+Lud=K42N&Q+ximNmY)EvocVB|=x+%ME^?W&b zX#BEIUg%4h(RkaDU8RqW6;lFg18YT^UD-T(E5%Wz$mvQLZ>s8Cn3ETcKYgR|yAHUf8)5v)- z<8mP5(K9>l-CO&q&7sIzy8X*Zm-5FKg>USsA3F1kr9efQ+7#M^b38yf6ypMGQ0M_*m(>7Un|T(y4s?gO?56IOiSUk^R_^E&9W XoJ}{Xht5xv|Dj5$)$#xDZWNKfyMcmKv*647GBo3W zT%h0}4wDDBB7o@suL^9zRRNKu)Q*}8Wlwh@WNRQs0|kLn)bWRqATz``pwU1Cu@Wdq z&9DL*2Q(KFCO`(2O{cj9v<)KKMlwB;Dcmf$m00bgLO`K0s6SP@RX|(~k5V85;v4Gt z18bs$C)uG^86bxeO^Q`WSkbDeK+a{OHT$pv0PD4k)jeh*U;qFB07*qoM6N<$f|^QH A%m4rY literal 2179 zcmb_eZEVzJ94}sF#n2c=C^=W(8H+O8eJKz?*v5bp@h{>Mzd3sm4Yirx> zZi~q#5Yz;T8a08a5&7aLJ|KKBOC)B>iy@Ji@JSMk-y|Bu#F!8ke0p!7j!B43`t)i0 zdw&17-_w8J93I-bYQ^I#7=~Fjn9YpPD;u5dOX+xX-LJ>!rNhha3>fCYhof@|bL7Ky z470q?&hH3!>HAumBlH9e~(;RE#BsZGK!JL;S zMLRp?lkHPOd2?!ysbQ{f6Wd$WDM6Wph^>}OPM}wlT#Z+!^XM_pu{B7zC&{HEgY1sn zFq?LL!X{!eFon3tDq2jCp(e(ASP=>e4;5aJ02Fj6>ypMc4vt#$v89h>wlr+fyChc( zLr>@VN~IF3NHNzh@PejkJQR6R1QY>+Nhd^A-~=0*3>gxbzU_s!>#z|cGTiYn$x%=1 zA(XuqtrIlTL=(nWk;e-$7==^=VzY(w#{E*wI5v4wB4y%)0mTX}EX`6b*McudTQ0ZI zLAZH>den$*L3EIx^awvf0(aau$>s@aaYNHFujqzuP;~DSN9%Pf8c$FA1ck1jcimF6 zP{U0YHl2BuP$$A_M{iqLddT9jdyN=!SFx>(CsP0!AUa z6D$I#)W8W{QvU{av29KMCls5y<@#kr6J?iCf$*MFs9DS9^g$;GkzFn#%vqw zilD|79LK;A6C$wWI02fhAb_ALB{V2X#ELi9XIyhUDq^(0u4n9;l%th8T{1L*E|36H zR0tF)ZU6(*fhbT_H929KvfO0b=G$~jq0*hKkyn^9ijpO22?+yJ(^Q}tagz=zqGSq& zl8IysS{!@ZZrUxme$K@-=Tao-ny~b&9nk7cHnzxi@=9Y?ve}xJbYw%~uHQuN9jpUj|pY3 z5KwQ;i;_*bYO^{mzqtJx@{TUhTufU_G;Q@XdeiEP#G!@sY0vB5x9T|UmsbZfseJaV zIks-uv9ZpJ>u=t=bp6&fr}LfDv#;&NPn_F-=GKir*3Vt}ylY_kyS;78!Pu)__tNb7 z?k;#@e5`Hso4Ms{W>zjc^+@N=k?lu+`8n2hvZKgdF0zkxwZHf2p{@Jd4nK2d$y*O_ zZ@k~1`Zjl9%kQ&)PH+48MmuKa+Sc~;$A;hD{piKj@T-02E+2e)?GOEJnE4{#!5!Hu zzWnaS%jX}GPmF%n@#E3dsgr9e&wYLAx2|O(`{mI?eKXdQj}Cq?HnZy!w)f(J)%~lV z-F^7{!6#q5aN)}FUGw4mh`Rs!{MqTNXXQ&jO?0k&ieY+^uYbQqdj6&8H(_w|Q0Dl+ H*xtVYbS%Rk diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_6.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_6.png index 475ef5a2b7c789b855a9677149954a7aa0bb49dd..606fbca6a303d77174b542e5995f0f1445fa9f37 100644 GIT binary patch delta 657 zcmV;C0&e|`6sQG|BYy&KNkl=yVn2Z?615RnCO#DSr=Q)3xY(uVeU=*M5Lo zsXgeObR+UoNAPil{Qy_qIx#TmL2Gmqy5igI2k0K(feT~XaAu$sP2sin1GGIULsuH$ zKwBY>UM{j9;QZ)jv?NNg&%YSnrULr`PQ}+D@Mt}p2OZFlJIn{5ziBmYI~R^KXWRMZ zEZ&kR!HJP#0e`_xa2(tTE+*YUi{|rAX#7*`b1ix%b|Nyac*xMM8zq7uQe3fxFmV`$0)^|AV^4h$xDVd&j%bUfIKi}$wR)epZYRNt`- z`-4lc_v|7xUM&=NjQQ_uK=*SO!mnMpo2tpb1H)5Zgnynn5lU3T*H?n(p5pY%i#uW1uF`N{P#KtA%*x9b+<2 zjhV89u`e|gu6=ON08tAw#vJCF?g9fq3qReMDP%xEf-xrZOb2k+&qG6C0Z#X>l!Y?w z=9zblF@J}-|0IA=t`W#QO8~N$P|iDh2`vFoZ72(8OSPe8E>MbShGsySUHBIO`5s6B z>3hookC&aTP+w?EuiyMKz@pnX^^J1%NydKplsA rwgrGPtSH8zo^1n|3;hR}bAX?j^I65Vtm~2h015yANkvXXu0mjfT!cBa literal 2572 zcmb_e4OrCX9S_0@C|Fvsb~+^n>|~lta=EW$oQQWf!EzLV%Asv%F3EBCz$Nh#xZ^rO zv30h{sCC_@#VTU`XlwnbPUp1Z2UgswBD3pMN?j+~XRWoZmKJN>n*(mHrJYZo-SZ@Q zllHyewc1_VA{Vc?*zLXhd81qt)gV5~mI5I77`$}LE? z8W46m3Sg_~=V61^h_ZxU2b(A@VZ;uSbCAZMt72IlZKM&T`p4%gu*fulOIm>_A~ zOp}HwI2hplPzSIA$0*F5U>%B^!e9e!(Ek@$-n=z6U>t?vY`8JWQ zRGX;I@Aoq&vVbEZ9Zl#chINy`!i-sux+y)6GMt$}-3Ef>Oa_yIBgsLwhy7l#q?n33 zS=FpKz^EhLI?6zDC`(ahlyd1=a56Kfi!*UJ$udSa?ndDM#I=eQqTeBMKyy+xbl6yQ zj#mcVs~%V)Mf`$+QH2){dx>UP)$SIARr}0?I{P1chtTQnGU}fn@bG~2dz#-5lSQ`@ zVElY`8PN1@{Dpm2{xVbb{n_hH6sIG39OaClwiCq=kWH*YjiKx>|Nxdy8rDtiK_ z^~9hXe_-|l;<6q_DC5BniXlI|p1X7Hx4SXq>iWOdgQ^$;O$wQvx*(nzBxd*-UnstADxc1B( zP4md?lnpgWvp+a|YDS0MG}@$n?5E1dCmLS4`e?l}Q9Bh`w$2`-d1}_~xAR|E{q(tw zZ*jVn?aLRwadY+2g0_P8qYb8n&w9FkcR@a7=^e#1$zQb}Ybd(#sc-W|^Oc(Bn?JIS zcWkMIi?%1-yY~9d__oBBcjqKePd@yGd!F;H=zTlR1fivTZc?XQ8ddkV@zWjoFYK** zs!7xRIliW9?5Wne+_BKK1E!1n+K!P)kECqK8>i_$awc}qCkY!Iu`BQ;%|9DvyA`$l zS6fy#&24z{LCs9Vm|aCZDVg^(xG&W=H^siT#ah2)M90~e4=-s%7d(GrESq-nQ`Mu^aEVnD^Aiq1{&JU;gfyy&gX>W0JYc z^ysj@!nZ4v#vE$Mn?RIsO{d`clGELnW;-)x)Rs4ULjJ~IW~4Q`YZGl#>eq(~g}pJo zJ@+hV8=3ZHTg;Dt-S}B)(4N}9Dl@Z(ZI?P;&6xjq+(!opn=`quPY>UJ_~gl$)BB(C z#cv(v+J38J>8#clFE72M6LnL)*;iLIo-FpZypgbc`GkwQXOo&YXPteq!(M(aEp<)2E&8l4C%ZPV z%vLHKiMo;hSZUnI<{kGz+M{p2GH-jrGp~jAbYt7zFZ_J}zUUM0)$NkDTwb;A_Xlgp z#hZ$XcBZHAU-(4qGEMx{xTslB@w^oo+phMmHD=39!)QaRF(vAqzV~)*w0x?0{#IXh zdh~cp=cG-@)-4Ha;LSf4)JS6|-~Qr(a|?X`M1JzgiZuuI&eB**{7YT?T*pfbv@>te nIqdGQ#~GI|z72i-{4J>E!zB~71;g%9|F7lR^KGxqm|ypA#6Flw diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_6_glow.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_6_glow.png index 2a0c9ca520a75e4b723c6fd4edb714b56d22361f..43118e034b4038b78d78b5d681bc359774c2883e 100644 GIT binary patch delta 181 zcmV;m080PF8{z?wBnPQUL_t(|+LONw7JoGh&U`6DGY-fF3J&5h+4>*?h_3vvz?1?C zLS!kmBcVpw!cz#@8i>(AL7)_M{J|&03^5L9G!Q|o1PW3!tboP=&4q*skU?eBX>I{+ zgNU|~Opjy=Hw$hhR{N+BP-qP50ElCOu7*b`kOA=xb^L)fQNok#P^%1(Ly0EEDk3DT jXjN1o=d#h7eOLhiNG5}87$wsB00000NkvXXu0mjf-`z*{ literal 3524 zcmc&%ZHN?Q9G{cSd^zwX?0h+z#xNtFooC*6hFkT#y}HxZmvce;Vm>p^Gq=<2&P+3N zw|i1}N^wRX3X-4@Duh5R>q~+8AuLD>qN0evKqUPXW>!#%Y0vD-+*a$|VOk5j`^@g| z`M>`D&;S2Cvt`pm?Q@pSVHl>pzb`vLzuEYG#|-*;rQ^aO`Ze3{dn9C-xr^d=8}stP z4u+W*I{6*Zj@-kB<&{zhdnQR$N5|;0(82$-$i8 zLkdpc?tpCDy(w?)9(fpN^t&gP^>D)7Eg+#MBFH(SRujEDCKeqyrtMu zDM5!(?+CT1?psTAm>=~CKR`lnIIu|X2-UcvVOSUqkcrStV>^W>oBe_pd11l3P7sp6 zlTi3ZPe4%Q1$oaaHnO~>A%*SfiL;t!S8aD(?3Kg&V=L=>NESsT!--IYK!8A$@`7Z* zv>_=EK)Qf6XpZs-qX;#FMF6!bSTzLr7qEvNdvr=DwhY?~N{B|;DWO5a`|e;>TP|nx zyJ3V}i}YtR95prNIM^^%TT?Va1(JnjAe%A-x~1wskTDjpnU+*lY3$E>)^N;#cz>-J zuxC*jN$3nsAsV!?0t5}IAZ^Mv&?SKY87Zns1dMg7<~y}!bKuZ=M8#&Qu~nE#6eU~K z6$t}N*V8~ZWs82K5iqfap=2S|hBn7e=h|@aWoOJ9)Z=G&g#{0d0+oR(nJ~_LLMyv0pLrC13!+Jwo zj|P+0wx;!Dkrot_P8KFmOr0L~X;}xRX-mMuX%j<2hYJC9RYP2KsI2O$CYGOEe-+s@ zIX5=baXelo_W=5k+$4xg`&U5k3H@UGN_xlmwLjaP?>lMj>X>o3g~hF`bMU$+dOG(opUyCrfD_EIb={R$+dIdWZ}>`lVTu06 zRcX)h^7${{`~K|wk3PG2?eN{F^Ut2%3M&lr$rt0#9sb~+LVVBa@7BXM$UiSeSrgV5G4OHAZf-RR1yAM$LG-(3FQG6zV zk_+wb1MGUPqau^QYNHiJk-hE%Y#rCJ?XeC|w-=spgZ%*XH?78P=fZL3Y&*Z4#mh5s zl#Rs&1UtcTaDOMbm~;m%TF5)0@lS1EQfPdafNv^>sz)&lV-ycCjm`JM*l@iMrFX;F zbo+$3W32X7KWZj*w9F*npEaO9R)5uj=9wh+y&b^rhf!4D55f3xQxsZvt`lo6c45`o zb`)PZD()EDJ{m&(%af>o9Yb(#u<#B9W(QICB8u8fAAibkbffHQ7uFg<6r~TqbG#AD z2U@W5R5R8OccA2a2P#L7p=vA)|C=a$AN9gI5c+-z)M?zI#HHD4A)a~1n9NgSwk%=r zt3jdZL;nI0wJ>AMVXo~iumH3j&w8?jEC@(2#$=xD0LwZ{u_Eoo#%l*m?1yFVu{sln32NFQ~-f;l= z@bHV}#!E+7T@X2r0W4;>#cb&$fRI{Tg^+PK05r3xrgS2EcB;4lkOu;&<517808o|{ m#W>WnYXD23{{Tx4@Du3*DlvCWk}?1Q002ovP6b4+LSTY(PB3=> literal 2569 zcmb_e3se->86GfztdB@RjY&1*K%%V9&g^q`1{X_qL5MCQ5D}lu&de?=JCE!P>_RwJ zELu#6#6%ta8k<@lG4Xv)G$ko$B~7$^WmpPpcpZ8k3c2%LQjRaEy!w|8hk|KRCronT0Y0jfxK(5zyA{ zPeD+0gFAnbvdBJl`%d5!FXDUhcPg=qyjBohz}^V1Th)!>1Wf)ix|z&M%iZESHnTQZK`$mw||hLy1Ynq9V%0;y2V0z8$Vc zqO4wyRzz>UD0+sB${AvTt=51sW_WsmTVO?>oE!)gdWN&n3THudxDH3PII7dEFO2>vop^PbkY!PSMNLKqxm)yEse|T)}8| zJC!BK3N0{Pmd%2IR5fllOOb?G@6gi@)M+;0D9#ud)IqZh%FqrPcN%nh&d3ctZxfl) zfQfudjsMxGU38TS;I&_>K)jGAb(P7pSI2&f0?{$M$iuOFp z8pw(Tj5@tjM;i4k%8;ZPB^@9u(qX1i2TQQHo}o=n+=;;difa`;qSr36Ky!Vdp@WS@ zWx8eHUU}#h$>UxQjXZ8R*h>`61lrw#Fae)A770zehtcWrG8&}y6?1^}Tg)GX$)Z#7 z(Oxdi1vGt}{=&W~f0-`(_UsJ=$pR~JlrSfdo4~G zv_swa9kUOK%M{asivuethJ5#W98Jq%( zcVHOaHNZu9-{Axxl^5(PlNV^~A!x+dEL&RsqR!6>PM5?l828|^^VBhu;7Q}RO<380 zZ2I7}nm?(2(dch1hSd8LpE=+1kstcyiKLoK`$h<4)rg$i$n_~bl?gxP+Y2xL zXhMC4?W;rh`(N4G(K~5Tn-EV#N8em&qVDyk)eJNbZ7=NZ7|%S_(k$;vy*<;^iI~aaZg{3c@@s++Ln-Tz>HRtLTF%GqoNz<4{nYpN zj2(03i%*Q3o`_t+F5lPJyhX16{-oo7Sx?(uef~~m+}4i0H}VM;!H|{Vr z<670hXx+lGy?aOA?u%9xj<|U|VOAo>U*F%AT66zx=!%t@vXZ#5XNgpCBf6j!slAIz z$1{YZRVzL(LWK^O>QYNYdfn8k12vQR_S6MMt#jri{khhbYjw9pTN++UJM3v|+dZMN z72T2RzD*`YeAGGq@Udy`l-E{WYR}6Z*g9anaO`U0udj}(uI}7TaL`Ho%(>Fh{1-gT zwT+(jcRu1&#nKBOCp}xOTQ_sdiS8ftzJI#=h_W%;^tTUJtI9?v?#$YA_rMFimdLN~ z(~9EzdCHloJLVot$ep_zzeyBTF8guHma2!92lh5yYhDZC8z=3&6aQY!Z)21FIXBm| zY^?i3^_l3xD*ao`_Q<%{`On4F#MEj&IFXS`#j9eD_0{>GD^Y#hhE|<8zcK%c{244JXg{U5IU5Jt{9>jdAFUJ@2|)`0R&izp1Vv%+i~` zI@0~h)C638cOlzda;p_NTi?*yylk_-hM6AOyrVs9+A{+k-K%aPZ&p#*y_4@{QU|Ua z-Jh(fe|AcY`iGY{BriRb(!RbjX`-fX;oWAUVN-wCjDw@ppEZ8inXs_;VlzGd{*y&b b*C$pc*8X+!1J^r&kF~7yY}=j}iq`xS(HWZo diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_7_glow.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_7_glow.png index a0d27eb3523d6998cfd8092ceaf467acca3d5ad8..1577d4a08b214a92d37ffb7fd3160525fdff540e 100644 GIT binary patch delta 181 zcmV;m080PD8{z?wBnPQUL_t(|+LONw7JoGh%DyZ>GY-fF3J&5hiFnWoL>2#+VoCu8 zA+nU(pD4Xo; znc46B*YE%TGcWaRdvtN@%GN|8vACx@-Oqlx=sUleU9YY9`8fMoQ0RU#NF)~C8-1G+ zZ@jr8kysQs1B2mUrq{$?z6}x2qHU#ofuR$L_D!V%!h2}QS#-#8Q~ae*PVt;WQv6Oe z12cs#nsvJO`gF(MZ3B4k9&8YP(?+hnWHJGH8X~Tg&$)qFO7Ug6CR<031)eKI!aXUz zBT~o>X8O1;&!?Q)rU5J}5~mw&q6Q5~*}zFq)CH&uq70yDLd}#7uKMAbHlNsLe|l?G z7rRUG*)S}af>10L+lq3V=MM>@VHg6G1W5u60fJFCL?z$`YibhGG{C-72p!MmB8kZI zhQk!kEUmbZFT`Tqpc*C?FrkDBg4hNlm&!nbV_ad_&y|%EEYKXyQ#TA4R*bPMN|{Uy zZzwjOkI_N6WrSH&^{pW~7#J;3p`Qlcu#f4M5vFlX&9ETsr_-UC#dZddHy5&A=mlBt z20@7bjzdu}yL^g5&mZu-TrJCeH7Q(ISCrKxw{EB760aDnkF2cjp=lJ-6fZ#u0ucg9 z9uQ>{CQVs=1hNIJKr@U-1cj&`ECHyO!J4UPe*t^Mu}5cw5^UO@pGPdpP96)k}@6B21zr z+mfNm1YpBR0>e@;yCe~?h)$r4k!C|CXIgKUm-GCLM_A0|s2a+wG`pREWpA`vUpwft z)m6^n%0x5~j%p>v<0#LR@YTmogE-C3qKepJmNKC?Nqz+ucy?GsKJ6G{F`W&+gd5o( zpplzfujmGmWC{V%R04D@il-r3z^0mRuvk-SSvBt)Sua9U5o>I`MeD1<#aZMIQPzG1 z{?`4GDI!!BC4ix(0-Go@Fc4ILCLv-QSi?3y8b_Bu;-3Yzm8r7T9ZPPK;ZyYp2eW#8F^;%*RxZ9|2M$%bH2yH`D0g{y@ zP<7S}EKMW;Dk@P71!3K2NV+?bq#2!|hAk6a$AGF51-cq_HpwDDA-ZJf)Rth9b@hMN z|Fko8{rtbLpg7|-o9gLMCcz9mi>Mg$@^+B!_UM~2PqUk6cOp+hbR??`A>r@ysdAsL zRPffQCzOvmW}`_oTPCuzkICk9Jh5xDb+%<0?f3rejE-7-+`G)$sPABhkZ3dq)q&QD zhT_q-vGK_wDXJEfGJ$uLawI|&%(ETOey<+b1-Am7`3a{-t_1pEe zWC^!?UH6Hx-t4vFu1&}2$(J`YUu>S+;vIxr+p}}~Td%aPdgW}^Uv~ZVjisxJ(}Poe znL}&8Qt$3O_VDJT`ycvja-KgnzIpv)`w~+}UPxa3n%*@@JCE)dJO9ncA6Olk_S(W%|D%BLe70SapF+#tE9Ck zO-%l@?3w0Lwr}-@AKVvDu3Y`j=6PS}=PtLL+3@z^v-d1IxNzx2%Xep*PEVy(`OxP- z-v7%7+jl-avCEr)e>{J^>-TTped_#y@lWR@_~qk|k8VFYhXo+fvt?WQ{m$Lve**kh BeZ&9& diff --git a/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime.png b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime.png index 092bfc3da0b7960ca602776ef55702b2fdfe4566..f896529eed294f7eea4cb98eb2296fe2ca2ae54c 100644 GIT binary patch delta 3240 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 diff --git a/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_amber.png b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_amber.png index 5f33ac7ba8e8647f5b3ce65bf3e646dc97182757..2f44e3294b21ee17ae37466587575cb151e534c6 100644 GIT binary patch delta 2106 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 Y0vG`Ekn2ix3jhEB07*qoM6N<$f~9Zgs{jB1 literal 6056 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 diff --git a/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_lake_glow.png b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_lake_glow.png index d44ec4136758dfe14726b792a77f7433df6686d9..711d1497ece75b6459e7d044cf2c9e52905a5987 100644 GIT binary patch delta 412 zcmbOrw3T^+ay?^>r;B4q#jUs39lee?2(&(IcxN+T{R7WU$r4j(@wBN&bCfEY=QtE~ z#5nG0rlD||>6z4r91RJ1@KU^Ui(s6{Wc%8|>Wft-g@G zVAIWtJr&P26#@@b$UiYunm;LdH_NWLJp~`;e%?7sGL%}&`nFXQ%&bem^$mp2^g4mZ-`FOCpPmC4wBM2p!djdjN}kinlH zPYGE)@#H3fw_Qs!ufJVX&r|)J)Aq0F6(ilJXRh79xmNS^(M>b|_gLSy_h;;6TK40W z>gBYX^3ybCZ{WM3yXUi|*oMDXKmRE-c^dkk$B-}lzx4g1*8Yqy;}1PGoU(q`tIcPZ zZhkZO{10vojfUw4rU48MJTbBU+#(EEfr7MXeA!unYe%(atO6Z5 AKL7v# literal 2320 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 T;^OsF=HH{Hveq+H(emP-%cVt* diff --git a/src/main/resources/assets/betterend/textures/entity/silk_moth.png b/src/main/resources/assets/betterend/textures/entity/silk_moth.png index 4976d1f08a953ea7e2b361eee28c1c25bdda80ee..c66fb1921a14c6de1ae2414ffddb256fdf4dc3c8 100644 GIT binary patch delta 669 zcmZ1{w1stoay?VEr;B4q#jUq9Y>inQ1={|KcLpf!beZa-6700_zLLm%k3gZ8mPN_| z`_Av=FK1$sXZ&~I!?~-gZ(R}D9e(QFn(|ez{kx4{;QXf_2bRs>TJO!T!1LkXmvh{2 zZ0t__h<<<5G1|J5>p-{Bj&pve({Hd%zser4U~Oy_Ls`AEfXb=cY}1djGdmuCb19$E z`o@!-1B-wBG4Wz=h;+?de9`doww}#DRJav#@-`mW^h1T0VWw+yazRFo*#R9pPv!?V z<;?cl*ezu@u-H+!_io?rDC_e2Yi%+4Cb8Lnjja9`mB@W-KYpj3t>^Tw@A9^u3>oiZ zcFx|rZvJ7u=MM|p`DHU$`uDf{Nil5dToAY0{~q7-Z%;qYF|v*OY|FSyNR+|xz(bj{ z{f8zqB+X}L(Ngp_Rk_amD`-h+uDXZQ2NmP{>Y{Oix{ zyxA!!Z({N+Ciz>UdO6RtmyG)jxfmauuG;-_Gxx?~xm=rjJI-Y_$Zu!c)bp0{2hFl}SLmnC;Y7$G<;Lmu+}`k~zUa zlaUDi0$Osur%*Ix1@&lfu=HY+SD&D_3fHlmQ4lUHx3vIVCg!0O+qVpa1{> literal 2350 zcmbVO2~-nj9v>PIgrXvNR8-~-AfQcV5@JF|B3HOqQ{ zXtBB$mCGV6D#}(Xwm`8^>Z-d%SwZUo0{Xe04memo9{}tvq&nG{ ztb7&4X}ti`(CLIAPtR~@00<7rV=z36FoNksCP~Sm(dI88kkrVbq~%IP$wUxZGA5rT z67%EKczzZx(?B6B!QecUBhV8@49wH(C!P$rYXhzJ&m_#A?7FjGb>k53uArx+B30cT0ZNYWH&WyI3y z9HSiKG@UR(&)8@w!=#%yhrxLm0}BO+)ueHt2Djmu99B0jT!X`ej?fd7(ZFGaHY}s1 zjkG~a{~K!C=U)imT&q;tWc;o!dc94A!5Ep#nK9{*-$fhLW`=+h2m_tN;zVRFr>3{n z8U~GE3Cu{dYMRzf1xhugG8hqI4NMT|pF~m`+GGg$*%?BC83{QgLPSC?WPIUrwNQkL zxLdXi2}BWO0;;4nWQO^-P%()F%!vJ0um(pnXjYGLHj{cRlYkj269R3X zL?dV&&2oY{?E=TOP%6<_%3#DOoQPG(A3L4L`26yVb=KnmunkBj7!gSBgV=XyrR-iGYfs2=UvM3UX?8%jm z1jiEr#c*qa%OTtvSwaI%z9ygB0~53+Ey0oghj35840MLkgt0_eCg-jHC8J2)} z12=psF6|x8Fm;sY?CIJs+4)t*r(d_Smxd3#T`~G~f#H&Wr=qg2>XEi`QBl!Y=Z(Xw zY9;T!H80Zr(B{oArf;~TN;%V->fb*0ir>Cm z{q2kn`&n_)NdmVl2a&?KKRcZ4Q(vqS*%!{?aSw4PYFso^-!AU5+ebP1R z;+JLSnbF<%%&M9bC6E6(+!Ax?>JU59J5=Xs`D{_y>sMT6be>67%q|*vXRE}6_h9?z z{K4SCO@5NFxjA)_K4Kqt}fhV3wWxb8Vs84v(l$EPG7h*bs6v2$mv^& zmdBeYwr^HZ$8}!}|(C>22vnw;JLSA>V+$gPTIkK2{>ooX} z^$yTQr=SlzX39SR+hS6Ae78AXgZt+^b96+YtE^?x2; z>QGUeedjxS?a-0=5fv|Z*g*@XL8_+|)v52QcYm|N`9e*y%Y)bE9VbF6-d)?%B(fJc zl!rS6w_6NPOE24A3bz!4u93XT<{uj zxUHkHq5QmO)$y(wr8?fG!FiF2f|LVWi!0qm<9kkd2idhb>zs8&=J^FwxR zLk+zqAcb#{BR>JhAH?Wxd{7LAT*ZHQa&2kOn3r$g+=^P+ z?dhHI3-4_RzuR0HwWXkZtnjUA)|2w-ssYH=pdvbYHK)*RM8E&lJ zw=MU2!28$ssd(V_T+u+Eb7KD4YoPB(Ngju%759X?ZnW>LPpt3yA?U+z%4(c|DBuOP zW1Xqs(9;s9L%qJ|-R!%`cUpIQAL>3#Wq;$ng)Ljvdx5FoX_asI-QVeb<|m))MO{fp m@(W)Cc&z{eJm2(o>L%XbiW%aq1yaKLM-v+vr>GB4EBqJgtZh*M diff --git a/src/main/resources/assets/betterend/textures/images/eternal_ritual/portal_frame_full.png b/src/main/resources/assets/betterend/textures/images/eternal_ritual/portal_frame_full.png index c038989ed920cb5b732fc54ad4034777d568712f..64af920a6dd04888be3cd7be7476ebd2cc821118 100644 GIT binary patch literal 3378 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 literal 5249 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 Nx*hX8T5*`h`X48H&ocl3 literal 4956 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 diff --git a/src/main/resources/assets/betterend/textures/images/eternal_ritual/ritual_finished.png b/src/main/resources/assets/betterend/textures/images/eternal_ritual/ritual_finished.png index 76d833249e00f46f451c7c5952508478c5699cea..ef52fda7649bd182c0c09d4fab2019a5817c2283 100644 GIT binary patch literal 7186 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 diff --git a/src/main/resources/assets/betterend/textures/images/infusion_ritual/infusion_ritual_full.png b/src/main/resources/assets/betterend/textures/images/infusion_ritual/infusion_ritual_full.png index b8ee16a105eaf5be2b0efb3b234d5aed39a9a663..88e04018178f12e3d2c6220b3b7e03e3a2125126 100644 GIT binary patch literal 2081 zcmbtVi94Iw9`>j<$~B0##+rCkW0{eTxm9u}6{KPf1}$1#Yo)ZRwZ@XM)-JZusaRrZ zifX1UQ$%GhYD)>JGWIDdNyQ$qChnIz_x=HQ=6SyJo#&kIecto_e&6r?olGYzMovam zMnXbD&c+)3Junl+L;4i(W?L<^N=Se>HfVF#n5os9reWn*&%9Ybxp02i;#^1nh2N@7 zWW(Lxfs0QbPWEnQDNUw+^_6pQ)iOxJ0dYnPp^EVIMA+)f$e_*Tk>Ha<7o(SF*#k>y z$;tb9%j!6O=c?^|0%Co*JQjmV6fUamZio4#lKbe#J6>OM_Z`h<9?*|ssJkTZSKF*j zNK^cbS{e1`Y8=U%miV!q7QXo;j{2bQ>+*#6WH!96fZp-ukxn%`_N5?{zI41EqmvH) zNY8P>IGXa0vXyjiB@9NV87DIg@UZ#8MW$KF=%NV9(E+ zZLH{ORDy&3gSv+*A4g~3IyXDmW^h+nw{x%apzHoRo*h8BT#ox2Ui9{K@oZ~OaZ;pVlZ2v3%b{|5|JFO%oqNc^G^Wd-FQshL+rJa=H=JPjc&wz?Yhgv3S+ zR5+$zW0_ei#Ul5NHq@TA!C;|FKzRM${e!rvof}|Wvf$?2Oi7lb0deOaR_aa0Y5H=@3bc(L&XcLX+IQy5YLADIPDdBYX6hkn*r>{|I zxY%TaEeqBuaJ!&k1)Wv{s1y%T-0UfM*Ye!a1kwA|l3g!FilsN$kgM3MPb_3SX=#=u zv*#btjaXjJ1|_j6rBrp654t|)Mw*^V^H%VO7ZrU1!m};iSiXr*nihLLLsK`f#c2MT zq+rF`2XS0doaYz^MUH>2?iQg|qbtDD$YU!WngS09ytKZzoer<0*}YX$3B@4H)}n{< z?!Z({k9${v@8xjVdp7H(r_q&TZ8w|IFg}fN^n0o$Ao#e~B|oLitV8o@6cWol`nZE? zSqZmg%TqxOUimHvLJZPr6;ERAcdsPfo>(j%hIq@n(ljX%q78i2)Q(Br_QQ!2AD;K= zmH#!0Zz@En5j<&Xkt^R5b8teu{Q1u=JN*dI2m)l%ll!ePDU^P;Zzu$Nm%h3*{!5YC zbsGCMsUvQBfCuiNJ84U&^4684znutYdE7T5=p;s+qp=y-a}x_Ai+OZ<>*s(0rO*R6 zm_O{JFiq7G>MCZH?NRyBW;bBP<1)1GsI;At|6>Tl{52-s%kB$~vWAtNpy$>pOnHud z*P-mCEL4W*%F8#3`tM>w1~m#PGlsEUg!=sG)9<%xX0@5a8xy;7rYetr*j3iY0-7sF z*n2n}>N~CY$O3^ktOjNgSs+X8Blp!XO>lBNV(_}6V--cL#U;r}n6T6v#0v|EerD|N zLVjI9>-6wWm>U>0CGZ-@_P8-fZH0EaQ@AAg@UUMH6q+Y&-g%_Hg*IJW$~_s)o~DxG zTR-I|TsnAH#ASVQ|0xHR(&?9L|0|%nK~n4BFjcdk+8T8@$988px|9lKLWP%LK7@s( z4A`Kr+1jC1T;P=BEoF=28s?yA^I{YEf6^1J})(;XMLVJBNeLY`7={8QdtDwX3d#90=Ie{kk^f} zWl&V@^b5(z>%RQ}p_W1e-I0?tJlshs?>k`< zhiUoW4G~HV0sMj{X#NKwLj3{x(h)#xk3cfS8@F@B>ZOr@kAZ4Xzyr1g>P(9-Had_1 zj@Z{D!n6^wje%cC78~DUSJ{FI_&jwDo>~Fe`Y#d)lb&L#&76kt>IWyB^DPNgkA*-h z(FS6|pFcS9;aMNqOku}_4{Df%06hr&|G^6tq|E=s6R-zj*+>TV9Q?crT>TO@SFz~l I7XM8CHw7jvZU6uP literal 3121 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 H5Pan?+m{Wf diff --git a/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_finished.png b/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_finished.png index 1816fe7d31965e752bbdbb6219ec01caefb13976..1bfb82df12e0f93826912fec9752974238eb37dc 100644 GIT binary patch delta 1405 zcmV-@1%mqJ61oeJBYy>fNkl(oQ4r&X0H419=vE-gfs)14juDf?N-`!2$#F-?q6%UcyS5-C$BvT4`}f`* zavWmhbtK+=>_(lj=KJJuMw?w`~EbvUY63G*3uP z)Y@(S^qjZu-`YVWrUa4aZFyhaG1iQ?%eH_eW$if=X2n>QEdIa15|^JnzOjRZx2+)d z5F^ji*I1hz>v-mlx68JGEoJT4gpG-@=+k^H#(&3GPfnpCqy*7WLG-y74<62zButLS zM42N-^KAh+%i2?7EKU{!K~$137tu2pO;|Niwa;54NbHL-D@v}KjayOnC~K$0Seh)p z{_@?y9%91XBs_}=#W+bJae4O?ue|iyVnN2fLDeyJ-4?J%S$j&1CHaR4^3LT4!<|>J zqJN^u&#V~o|C1P+b6krd_e;zb#3rdJQMzvn*rTkSLyVXp8t28o-W_!DCC0>%kk?uw z$doAIIJ;~M*rTkSvsfjIs*x0Bh8P-Kz9bAq>Ao#skFs{oDyE7d3!4;WLJWQG7C~a7 z9HK2CXIXoX^0qFl$e;@!ijopTex6H?n13jTXbbRO)|SP6@7^b8DMC?FV(8C~Jb%rV z@wW&P6D1`^DM7k!3-DgnjtOE#Nr_QPkgnSTJeRd~chDUpCQ3>SdEVADn3m^nw*h)6 zYwOOT66k`@5kz+sy{)3;E>YBIgD5VC*Rr-Os3xH)QRaw|YZvj-22ph9@LJYZL4WM2 zY)q6XG3@s#xr>_B+8{~^;<>DC1qr|N2t`SWvE{3Fmu(QG1@T(ewugq4D09SEdWdn| z22n#0k7aEu#+WGf(>f-`(jCNm8$^{P)oWQh6hr@?N)}^cEZsdkw?ViP#Yno_8mmx5|( zyv^5U#wKo$>Se8DvDSFI6~!KJb4`?oWU=IUyB8(*-<*0%7E6q`dr@*vl*eRo&+#5Y zl$;agIaxeZ8K2}BNRENz7%_lk5l9vRlMx9XlOPEXlOPET7yR-cwyEDAkgAAC00000 LNkvXXu0mjfNw=T` delta 2331 zcmV+$3FP*=3*{1!BYz1jNkliilA-bAe72Myb3sLw9a}q1Ijd^kz$9xYXV(vA*P_ zl#@k)bCAjLH`EEbee)Bwwr_Bh%C)P6(Munw*W!aI>Mab?`bts#&7yFRv%I!sor7fA zURSU_Xg*QgeFp_DiDXd{)Ui`%>4zI1c|C@}J%?Wu=6}UTkseP^(dXBHQujY7qL^v7 z*CiqiF=-}?(sNMlTe`Yl6=7p>=GD-$v7*FaQMdXnBQW}t77?*96-664ByAF6eHOmaLj)VSVWS7=HQ zy{v5tupT&029pYu-le~D-o~H$b3Sum4KmDWb zo2(`#ipL=$Q=vj3Y z-+$wfMAZZjGXuk?y?6Mt=Z;R$ROhnVAI&{%>ZJIS<3^$ci4hh**F{kW6()wMdo|S@ zB$$%jORnMOpitYJB_kTWUe?J-9dFE0@FcpUOx0@|OAT`#o1U>i+@3u^D>5d#ww+eV`^E37?DLp;p9~AkNCw< zQZS{eu)S;BRQ_khN)W*$N?4E44$}g>AtuhUwtnBiBnDX~i<4Wuw7s`Ui;_pwMEUai z?^IeZ(XE@;JTbod<{1t34bjxgx$3s-+tqzgwQWUeE*H_0V-ZEK$xvz%s7Jtx@ z#GFrxNers>AcfvxC5W(Cs9iPoR8QDs>D4Z0dumq`TlHcv8|7u%*=w!`(UGeee~+@T z^t7&>SN_cx1jW}~|6McQmAMt}E_Y96DDVvE+6ivC52JAN*q8XRX?TZr>pz`Y2c z*pt13bnM7+b>hj_qwspcFUHZMJ@oSBR;1x24CztAs=bu+X#w8BxL(%oeQmHZarz?d z?CvTl{Gw2Z82moJSK3-g?D*PsT0q?pW2#oVSk~@8F`z_Y0Yns&82lc;rhi2{P764s z{~_1r+)z1aPQs+C+@wj~;@1p^Oxu_mnq|Xy zc;VNz7pwc;BTbYbF?dMg9!B<)G_J+36^z9?!G*H6e*G8h~V({?8JTIFIicxT38bn%j=B2Ey-yk!I zLJh>=9L2kz5|N;yCS^1YA`Mgzl9#f!E(!TWp$1}5?J_tDL1KipH%t_h7_R=Xs>AiN zww_py_K(*|BEw5}SC^N-28j{nR(qHjnNNdAi4NDx+AN5OAt&E2%74g6pSQfQuxJ#6 zKVws@bA1{_T6DTz*5;F0T&pI$B8KD<7tT$pS6_0hn0Y))q=_M)vAu$Ec^X6-)E$he zT1gI-wPm;wF-*xK`MP!y#a0a0r$MBJ@t{nixKP#(%L#)1UzZ+z73VaFvl|IDe<$uTAO&w&GW$ku(^p%jeU-^gLY8UiI9i&G=W%=kUS8)E<{Ri#Q zSFVwZU-y%vkG{gM`x{^iT#|uu<-wVP@kL1M&t_0SGw{AMvu z7z)B>T7U_?tZjHZ5SD~L=bxb^val#DhLi;Ku3w+16Xo$!S%0+GC7SL*TAdaUM_JpH z1ElrnE6Sj~E?_mpM41*4XIa~n1El%rtF+te0+Ao2OCf;^3sl}71?56}v!vw*>G}iL zC{UE)qoAVVN_(@QX+fHu7LY{sGLAX3tvvcF?e@BaRS#nNZK@u)+4(=cZQ}}5mdRok z?RAYvLrhTM_-jeXatRt|piEsmg@|Gjqm^Va?e@AvOE=0)flDe-E+mU-w$~M6xs$2~ z&af^vOgR8$kSwOvUKhwkqf9g0$Tu&e-IK+v$W^d{MBzEJ0>p@yTn5b~O1meES&{4D z>7o$CNQAZsqFyb97?W`YD*_HYlW_$b8IUYQ^gkQQ5OguKvTFbU002ovPDHLkV1lQa BeFgvk diff --git a/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_ready.png b/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_ready.png index 5306fdc92634c33914f790ab775370e99241b11f..42a5459e19e28b5e9de5ddd74675fcdaa30e9362 100644 GIT binary patch literal 1817 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 diff --git a/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_structure.png b/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_structure.png index b154a1bd0157620c8bec38382cd0c3691be0f952..b06d537f789c5cbbb0c32e387348af1ecd116408 100644 GIT binary patch delta 1277 zcmV#`#^6R!q99QMO0w{Q=*9;=K!OHA zL2=>EjsL=(OBenHf9S{^<_grc@)vfAtpdd4oNm5;Bs=t|g)2kH#0000000000 z000000001hF`k@0U+ds#zy&eBpa0wqM1h?cXU{(E$)Q8;M}HK=*b_nrq9Dee0IwdO zT^NY6ps*O)F?@2klC+6JIIbuxsvz!S=N5!;Y$z7L`?^QAMxnl$&92*Xct{^(xzoTu@nqtTpx`Pmo3ki$vVuwWO5@VQGrL2`vf zS=^8)U1G@BrGJNG)8r0|^8G#;n!AZl485<^a9orixx%7+zrGUNc8xYMDpjH+J8Pl)j3t&7BELyyGx8A`9lPe-Qd>M zQ?DrUm`I`_Rc>#@(9E$FL++Q+R}eR(hD52pEntqab__9mg6P;S{&siJ#owHETEvhc zKWm5}U7|GSS!G+m9A)j8#VT1;9YIlgh@oT3hlEX0s&5OJqpTgXim77A!Ujd@5JR6k zMSl>VD2r$dh*{R2qr9yPD>CT9H$@4FA&-)s}K zP}bI+LnY7!?<0urDEhUE61zl^qYWat9Di2J+OnV;LPMhT5hKCR!btgV8$ zZ)JU=bcx}9o)WvLnXL^Xl^~YO+O8nY&peuunI`L|NLUpscq+m=tAcmx8k124Pl~C0z=N|L!+l)?V7B zuc{DaNtc4+zx$1swU>73t11Pl`BG3-m+|L%H?x#WLFJrpu{+07E(Mi)zC{W$rY)e< zOF`wHZ?S^(Z3~E9*0yx%s}%DsT2_!yTR_)=%6TcMlIB}{ZKmzO%~8F~6&7>Nw^~u$ z^KGmHWg#r4oNx7_#QvXCOJOm^e5)5F_JOh(7U!JrB1DOKpe%>QMV0Xh$3Qp+!ZBh1 nVG#(6ld%XVlfVcP7k2p%5@`3x{2nLt00000NkvXXu0mjf*Q9M< delta 2231 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 b1_lNI#Jq0-1b`E*00000NkvXXu0mjf*WRK> diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_hammer.png b/src/main/resources/assets/betterend/textures/item/aeternium_hammer.png index a594cfd5e620d6bc9553e61c467912ef64577ac4..39a69799076eb5aa24e0157c505d6b77d42ea0d9 100644 GIT binary patch delta 400 zcmV;B0dM}21gZm&B!6*9L_t(|+O3mKO9D|8hVLS4zSPJPH>qebIin*j`al;g64Z@u zTm*)jiu?geMI=;CsW~);2ql`(qJPrgdYe07Bspr-fdiL&d7ty1bMGbOzXE_|`a}`_ zh>T@L0dATF; uz4EM2|0{;mo<%$sKqpP}x1aCN@d-z{{;=T6iCX{w00{s|MNUMnLSTZ;X|&7$ delta 504 zcmVnR{pM;J#uRo``g#YV3Am1soTQkOtVrw;vjh8h>!xvenyZ_U$4qynjaz z8yiUMNp-bZFViID1lB%oq@m|SNS>ykkb(yl5;o?%uvsmbUyZ7)Za}pxlV|t^zVAkm zIzK}=6aqIGG5F*fGplEa#bS&VSzyqR|5U&Y_^|a+g%5Uq;>7n1$IVrk4;e8U2*6TO zLMAZc8Zy%Y=YQaCNIj9j8px?IZ zAVo|YVK^|(u1P^~Y(firTW$1tpqct)Nq;nR2JgQXGAB=eiDEgD(4CQ7WdpifDyYn1 uR?E&87Rnl}R;yZaJRZ*rzU%YlF90`Qx6v*DRga7S00005C zCd8a6=zsRQ0!H(Bc%3)Ae}6%nnTF_PO(Pm$WKu)hdqnM~g@4AwJvton^7%p1n${hV z$>q>~_F?Vs!K&;aZD`QvW--j6L#b3?RuhSEz?iPVu2#5t7ukXi`g#KSa0{aE`W`4_ zP~!3MBXAR8gGsRD0C*ClgLO!ywV*z(oxy$b{|E3}CoAP`vQ)H5zbprd!n|58VcxQE zb?1WdbtvHUx>G?E#z;(2I6xwlsaP&E;iZbhC$v%5lJSkqJBudye9(*Q6qHPr(crc9GnX6eD)>!XO-THO!J*RWJKm32N zp9zS_dY9Hz5f?ZN-GD*Fu8vQw8Dlo;mw;J5S*F?fIa*j=qJOgbS~7e7>Pl;F3H>JE zt0<>nUoRe26>gUcCB;5yn#LkZ1lMP0Sq>aO1^lv1!B7xu@ogZj1}=_Ha3AWyWuOR71`H1kl9-=Q^eux;fOF2amsha6vWmN# zB=oHV(5;GxWPb|DR0MouBDmj+8YuZo8(-Ko1zG`wIaT^kDkIp@LU%# z5uO@{C`oXOA{?$fcqA`1b#+r?M<*%KD7i(EMq<-8Ue*;pDd^COusoiNTb&4KVB699}(jzfQW&F$hJ0l+&j3KE~sMR_5d00000NkvXXu0mjf DlLNTH diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_hoe.png b/src/main/resources/assets/betterend/textures/item/aeternium_hoe.png index 18af1b177bb289a02d4abb7ca47922bab0cfb027..97ae061700e387c15ef6551b85f6955e68587c1d 100644 GIT binary patch delta 311 zcmV-70m%No1JVMJB!3x6L_t(|+GAj#7Wn`FKODn=qK?*oSyk2l^6KjUNj5-6Py7Fc zYghhn*s=Y8(}ceNYWlkWiFS>UuIB%fS1`qG-~UV3uQBX9dX#}rNa%lLUgrOnNfZ8erhlvdmynRaZvYoR9|I2% zU%Yk|%r9$eWdPY6m6iFwslWGsY-Z+v4sLGThVTdoFz^Thu>e1q4|6ui=8%Mh|J*>= zg(oBs7ary2@^EK|r6enx>+EC*j*G*u(Z$6Dtoc}s>HiRQvH#d&jiBavo?2Kn z<28Vg%>)e~WH2*c17M*|NHbOgK$?k4B)AL!X(U!N!B`*#007G+pF5_pkoN!p002ov JPDHLkV1f$Co@M|5 delta 420 zcmV;V0bBmk0=@%~B!7iTL_t(Ijir)LO9D|8#m^gw3MZX}WEPPWm6cgUR0|;@Y!PN9 z2yR@=s@w$`v~X9eHWqFA5-x1fpHC24o1m12AaExkIg*Pk@x~Y<$!JC$c#HRVzjN=o z@8Q2<8c#$uE5^Q#`^U$qT>1dVamdIr`>~d4peQ+LD*X6ot|NZQ__{o^PNI32V++e4w%zM5IXw%W}mG7ykRCRpwzk9Dt?Ji!1Q zgLbr~PH=cyKsKALvYd_vU;r4$z|=U4E*C;OVWuQvNI%FZjcj1a=R=3l*gO(12;jQ~ z@PfIz*V-0Ek$?P>L`IW|0+NKL9TXJ>#k_)|Qo!zZg&;F3eJ$D`y;j2^s_^vdBiSuRoIm9dlb?0>R0H+D=ptzF+K{y={9QT& zt#b4x(-PK2P^WDZJCT#$TEbd{I{0AIUVW-oRW*Y;sU6^N;f4l(5`a(MzN*dXuKno% O0000wCNY2gS$z=i=qX?F=DNQ3hT?0R}EUJ}@8TWL6G#239W4|KaIr|2cVh{)Z+d x5*HpYKeK=g;NV~YX|AZNXYdaXA5Esz1_1b;QfA>YzZC!g002ovPDHLkV1iYVd`SQR delta 273 zcmV+s0q*{j0;~d%B!BZsL_t(Ijbj)E42;-;kS47bl;!m0)*5K&kA zf9}ea|C@L2_}@Bt;(tvOqyM0@P~d-DLC*h%2|fR{%}oFQ z|Nox>gz*9nZm$2_{Cxi}Ucbh$Y4=VB9s&OUarrs_TPF4Y7k^Pw_%9?Ui=mwfnZwM& z!UzHk4F4JYT-_ObBO(}=&zj3{>)t(v?CdNC2S>;MT)e!vogpMD%D^iqz`(`F2j+vE z%*w&ez{KRi9{KPL~*|InmF41HJu%+D+!12{MsK$KXjQ!?7tJ1!MyT1_l80 XXHtlkd88iz015yANkvXXu0mjf>nVh! diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_pickaxe.png b/src/main/resources/assets/betterend/textures/item/aeternium_pickaxe.png index 9879f80615ab5bac83d06558b5ffb759be1d5c4c..8f059795df435185c6139e0a0d1123c9efa62b2b 100644 GIT binary patch delta 430 zcmV;f0a5;~1jqxBB!7=dL_t(|+O?9+O9D|8#jjG1GftMG;UYg$a{QRlRkaC(b_UwU z7DXRWL=#1esEh>nE`(MslG@d>sGyLtc9HZ)o!(Ov3rF2_;4R+co!`Ch+(+~u@+RVl zBsEN`F?gq@;8&Ev&5lG2weLFa-l`~HUSRk11OWyLGvGh~0Dt7vqHw5D$YZ0(ZmuD{ zzJmSY8G>3I=@~cltj`!`SEE#`f6@KRGo4>m$mw>&?sQ^)IfsK{0i_)U9*@Tu;8Mag z5sOkN&Q?OBoW4z4$4A5~&oAY$S2%@ixA%TdNK+}8)Y|)2+r08zdI5Sq4@s5>%OpSR zZ?~PwW=Lel)PLe4#6bYu{JA=foH7m`E|)Yif>b7p4PA#Iis)&+PRAPNzf7$51zbQRPm6S+wHe;~iube&1=OZDi(RZ8sp?T)Dkz9(p1Qe45(- zlQ0cQBAKiLJ-t@xsakCwy8M0w%7=~FO0up0Y%RlNW+%%eSekpYO@f&P!c%3V=@018 Y4@_aN3lA=M?EnA(07*qoM6N<$f-pPJEC2ui delta 532 zcmV+v0_*+A1FZy*B!BctL_t(Ijir;%ZxTTi$G>msE-X-q^+%ehfmqj7q{JGnSHs14 z@n_Ee_+OD1ez$O^_boC$qCVT^K%LvZkuIFlKchi8m}|6QJk; zWV0DUr@Od68s*si+Z+ssIT#N0V}DCip=c_|ukDnegn}$vqse~(pmwYEZxbm1KLP&R Wz+iG58VxJ}0000oqB!4%X9$)_)OQt^YE5+W(bwwTRa&tfKsX z*Xa}g*YDo>zk24>|Do08|CRN0{;L}5{U^$R|Ns9phyV@Y)6x9T&d>MXJ}B_NZ&KX< zmWdPpYnmAS2g!plP9UqK%y8hy5r!4pwlcI&oyx!iG=xV$;D3KeM(Y1&pdpePYX61h zz-T@h)psk7G zEjDg05dQBH5%NE+sPI204-fHS0>Z4EoM1z^`S|`@dAJjH1+r$iAzWMxTtEXX+};1D z78d;H0kVnGj8QJm!NvW*2^bdaJly|D(hN6%lk@-THEaGeadP}8Ni(tm`}ZIC&&7(&-dlo(ee4-r_o+$A9_Z5jY!%n~O_ka()L8 z5jqAGQk^{B?;kK0jY4jBV>A>-YCDO{$ys%mv1XRNe((nr>}@64<8uMI+#M3@YXru@ z!83-+JPjX$muF+r4QIub!yt5_#!W&T>w5L6VDD;9uX%{6&F-WKrM rr?rwON!5G1OQ6l&otArlEC8Q8M}`zm-RUI&0000QuZvaU1k<+LDw@se>-!35Fe^p1@ z|DF5x{paB3Cf)^}W}^Q?Qq%sIH8%d=x@-4;Za%*M+js9KPJeT`x%~gmboKula@_y7 z?b-96lZOXn5X078yNJ_#EXMSIh`QK+n*d)1m}a0s#A%-AsRh;y6Wao`b=#iZq}fbz zd}FhjC?Ke-^?rmd$dyI{%$RgZ^{y^Zn=K<0Czt|NsA=feRSQTs++WxwyIM bm%#v6MtAF0Ob+Jq00000NkvXXu0mjfn8BM+ delta 350 zcmV-k0iph{0{8-uBYy!uNklGivO%!T>nAhOc*M$08JC4|I?>TW;lH6B*VNlD;V6|T;Ylc8UWHf zd-_aK!=&T>iglAEGYy-zLD9 zfs=>le_3NA!?rzp;7W0N0i;=7h?`;Cy*CVNZoUGm+p=pH0}~S?gO`gdhI$OmFq<(X z(Ex@Eu-S|cuvft31a-Ckb1^V72pRlg*mi(8%^(0bfR}-ZK~+PIp?<|42FCxyCvmvK w|Ns9paP#v1XJ7y$#&2K05^DwpfPsMl0A-tQ!meg+hX4Qo07*qoM6N<$f`CGxP5=M^ diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_shovel_head.png b/src/main/resources/assets/betterend/textures/item/aeternium_shovel_head.png index 71814f10e85644cd910cbddc73cf6de78a35f6b7..491768923fd3547ae9997fc4dc0d6ee757a64613 100644 GIT binary patch delta 194 zcmV;z06qVP0^R|TB!8tzL_t(|+GAiC1q6YSwe^2Z6Qlp!{CxjO)~u|j`+wiDqyLYb zKK;MGx92}M9|?vi>FfUAb?CtV%FfpRX_aOF4;(xGpNp55I0KXoA)0HtI{rI{2mi0> z>G;3%z&_#)00BV-ng6!_e*Y_4n!$#FoWFI~F5)!*|NozXPdic^h{Zsfz?#dOn;Eu{ wVgQe*FaxiI2m>b%_y3Z*dIq9x9|fcX0O_4i50m)T8vpaW_EA6$z`(!&03zc}RKgqepa1{>07*qoM6N<$f*Of@%K!iX diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_sword.png b/src/main/resources/assets/betterend/textures/item/aeternium_sword.png index 7ed4b9e7800aa8d81cc45f660b603443bdaffba9..f697c0d02a6f73624609593571f19bb0b21cbf5b 100644 GIT binary patch delta 545 zcmV++0^a@g1iA!}B!2-(L_t(|+MSZmPZL2D$A_kc*_rJR5?V{xZK2)m(xpXd3Pd@m z@t`E!Ku;K`7ZW@XG0}_B#6*b+MF>UIgHhvuf*NcOBo^7)G$itme4SY}X+cn&?!Nwyoe z`!Rg^k_4b|dmc|qYnZ+@2Q?G~4+My!sz(DdBYBb^8^gJYE3lv6hxup@*KQObL{bd) zH$XB!L=tC5i7_+?^UihXGvh+cF*!R!nCf@Ml=0)=`hVVN9IwZ1=>{v86LAKL_-(Qa zDt4+U$BREr4`a%TK!0#kxT@$-6oh+v5bcd28jnf9VTfiLi1u5qvlRc%i+@gJu@p%d z7ZKJp;$;T_-LV+-;sU5BXwJ7YM!X6oK1xZbJ4!l5@JN`n(T-MtoX^7j?7 delta 604 zcmV-i0;B!91oZ@vB!4_fL_t(Ijh&J`OjA)5$N%@$wy*D1`+(BW*dowkDWxWAt#JWN zbYXE&1}AZM&@K+hKr~Lcm61dSmihq+p_6ejCWtX4is^@dfCZ&ubs#?M$35mflgdjQ zqn`2R{LcNI|Gfu%~C3rCP|h_sDJ7BLv@5hH2-)8kCJmJ z6GyR9`FprM9HR8{GL4PLDV@%cS(51G+a(wboPHl2>Iv4s!N>_pPETX*=@XoZMiDs` z!Htny4ErPScKB%U>JT{tN6FLuYX}kP@ao1ojZfaEXD{YSb~tD(9><$hO7E$@g3Ifn zHop&_H$OtKT7MV`jKDc2Cnm6z&EjMzjQ-wU43Cbo;aIGCadicz&tk}Lf5LVy2Mz8! ze+~BX@2aV1t3C+ZGCv%X=89g;y9Hx`HmBUss)(ngVfRoO7tVyY&b3 zL?aN*RJFN& zUuGY&S*)cpuqz52&PFKCCOsv0000+}=LK9Alcf#}vpVPAA^KBOZ8osfsAIXdiQMo8 z!%`{8Ndh69e1iJ^9%7ZCJGg;-R}fAPfrdZ6KH=ZrA?9@3b$=m~B>T@gIe2_PG#;bO z$!EPD#nS{UYpdx6kit?;(7g>1zDArpkIwZKy-7JeaeaF$1*)plDrJU-G@@iYu!34u$`%l5ObZp;hJi1Scj7wB#i4$uMWBXj$o&Sn`kO8xj70)CU88xBvhE07*qoM6N<$g6N`* AZ~y=R delta 332 zcmV-S0ki(e0_OsdB!4bRL_t(Ijn$8_O2beXh5y9VB)vCAgo2BT1wk!Q6ko*AK7sfY z4oX!pC`|}DsknEllZZ%!8i!7jkOVUWFq3+E!k$)_g+nt4TdYIfmBp5j{nb zko#t4aXt^$mo50g1NNOZ?s`4&aT9xPTks1^)M_-hvV@JT&1@=e?|tZ;ZnSJ8(EoiR*0000o_wa7}5sa^}>PS4&S*yGlXnyw37&49AL!f^j^Vtc42=+F^jJ#T|IP4u4_W|2I&V-eHXKdgFiZ-A(!X^es}pY+k?z2U|MZ9;eE<^zyR<^A zYE_FeR{V_VNe>^FAxzFOnog0No$9lM!KE218bQII_ha1pE_$nloVTjsMyD&)f#da1 z=2m_NA>Y3xKUk2etl*!#gmuf*G@-O3_d%L&zVg0YocsO^DmVW-ui680=EN@B!7NML_t(Ijm=WKN&`_4J#$Trx{tgdL=*%=&=?XF1WOTXvCALW zXkjV#)`GRaU@889AcCNs7=(z6B1WsYCNbH2M|Klem#nRL;5IXJX3m_s_`jGe7kRog z7tqJdf#*VmZICJzxVX9kBEk8EvQG{}XagY`?fXZFApv8|_||I*gCb2Q<_4YLrsFCIjp~c9y1iCZ%EP)WYoI zBBYYIy}a_K3V$N7QuJ=y;R;;xdOm~wi+f}?)~I@T?EV16lPOP{6BTIGU)bB?C($ew zSSNwK3C2n76-U*&mmk&j-YJ#x?%4rDB}~FoJ@^j{2sqmnY@R*%K5Y=TB&t{QNs`O9DV-Oo;2uw3UFMtdHX?$OE4~#+VBTnnUhD{I*19aPwT>9vPPl;5!n!AJg}LG5C#C_SLaW#6Opn2 O0000D0S8G$ zK~y+TWBmXBKLaIz2}+X<2paIL{`&t*nFnw>lb``_UcF=x5ff*?WeCAA*d4a~zqqg@ z*pQvfZ4AP~{9tjv>?w>O8mj?29G8FvzkT`&=JP7^F+9=P2G)G`!b7lF z7UvUV;1v@9^FP1(z;OS`eFm1K%V5ngjWB>U3_zMiBt*dX+yM0000S~1B!2{FK}|sb0I`n?{9y$E004POL_t(|+GF_t|33pIm|<`l@U-sQ ze;B@)vHw3z9K;5R5j0>|=rXWIm0>~f`p4S)y)(m2k6$T&!>Qa3ElNE>{ zjT1^kNjCtb31l+}lWYJ?^TsLJV2n#MRs)bV6S5tr0mN#?Y99bd12P_>d4UuR0IlKb UPgoTXKmY&$07*qoM6N<$g8NH7Pyhe` delta 285 zcmV+&0pk9`0mlN6Bnkm@Qb$4nuFf3kks%X*32;bRa{vGi!vFvd!vV){sAK>D0NhDL zK~y+TWBmXBKLaIz2}+Xf!N3ff&kt?1Q`UPpXh93aQ|DyaP|5H2G>=QaLr%M<$zW+ac`3dD=0-Od+EDQTTzbW>=f~){k1UtZL07x?*4?Baf zFh3Z-d;guGarS0Zze53r0mz!)zWvB>|KTgB40eFk1u)GZzvHtV1TYK$X*he~A;W{m j9|&p&fgzun7#IM4-Hn?*TFJZs00008NkvXXu0mjfh5K`b diff --git a/src/main/resources/assets/betterend/textures/item/leather_stripe.png b/src/main/resources/assets/betterend/textures/item/leather_stripe.png index 37007bfa5ebe46f0b0f39ba5fdd52e9c48fe7459..ac46074d9fb10acc38088ecf9c993b77fa176fb0 100644 GIT binary patch delta 176 zcmV;h08jtS0?YxBB!2{FK}|sb0I`n?{9y$E004tYL_t(|+GAj#6#W1HpCUZS4G2*e z`;U%oWd!~cWdKO=u^7|;*R!4B7{mu*WJ7RjM%OgYQwxk?VlYE+I(bX50gCO&27=@; z3;<~Y*#NTD0O3hQ zK~y+TW1ti;{{R0U$|MgkL20r9#RlN@La2r~hUCkyzZecZe$NQy;x+)JxyV$WL6Dyh zD#F0<{^KVwU4Gy;+z_k=fHXI|=z`fWO*h_t1=E&Fl3+2IAt+%0(g<_*-4}1cVjvfP zfG|iSO!K?%zrk`K0CxdMqnDBhgN86Sm=6NT3Xy>jCo9|qU;~gfBl{T{z`OziAn(k- z{0!9qWIx0FE5^kJreWaKw_jiyrWwSB8vqJ%kj8EI-hiVD2E@4$hQP#Onn3^_26nQ7 oU)%(_B0dy zuOY|%pKQ&Y>FT5#K(Xd>bNT-nesbh%J{Dv8KSW)OJk9ewwaC{@f15#oY@0y<6jh+m z25Fu)Z5o5AsVQliVet&oOp*cUi3FsPB-=q6$x7dp0svJIP7(D;o$-JG0000D0MSWA zK~y+TV;B(N;^G3vAixABNdO>?te-Cae{$>ie-NJ}17MmR427T~3=E7=njk>dJb(KW zh8vH*g7p$*07$d(=iC23ivMRgaN#XnGYAm$0!*{Nsu;tYn?F!Ag8*I^z%;81aWiau zyZ44+&CORB>T$XN*=AgtK>({DF*d^hRu>RsGYl|8X*lpS6aCL2!NRcj(pv_n{07EX zuU;`cd-e<}iwRI%0MZPKXHZmuG(&}n10cFWPAp3@6BdaXJ+o7a<2-?xiMBTRF*AJ@Uwq?WeEuN z+vK5o>8xEx|NK(`5QhmtfED}LOA0iV673>6112yPptg>c@JdC%A%&^hy52u3&{QV# z-U^=tVe6V2PChEQn>rw!dQ!k4>07vKJ1XE;#^e-u5fI1)ANv~*lGr3S&mI+?00000 LNkvXXu0mjfW!qRJ delta 336 zcmV-W0k8h;0r~=vBnkm@Qb$4nuFf3kks%X*32;bRa{vGi!TAXY$J8-*&9_E(=>QM2G_A9cnE zfULV(=>o5)Ap$`eAodLbka1Ss)yfr(=prbHJ%a9vp`k{q#b!xkXQtc%B_Pq6pt*9A zhmf7Ea-U8Hj06%LA{ZFH0$j28>?|-l1Q1o6W$FM#;>dvdm1Tec5=`AWzrP|1lt6zm iGA_j@q9EaQCb|QH#->?`PXxOF00008L+0XEwA7PfW%1lf=x#3fBld^;=K@d@zsAA25AHt zU>+AuoB<$Bu`k}kvCoRlI5lG!fUFtj0+$^Z|C=n`OPT>7+C+2j4Y+2VIh%<$0H)b_ z+xh>Ns}F-UJ8n5cd{PE!25Nw7H0j#QpwqZ{fHM<53;<9X@n8wXhn@fc002ovPDHLk FV1nFJTyy{c literal 1591 zcmbVMTZr6L7*5wkdbi%XU0Z0HRqLh6NiwrDo6xvBovhB#&A4m_y6c1VOmb!>>?9{9 z+0N{`^-`odkBU;MqUeKC1p8JIrHf!$s}#WpMOf*sg$iov%4ln8o$+KYL8NMJAj!FW z=ld_;fBx!d=8<))?^;b!)Vg#^9V7n@!MpNi^4(f%K=NDVq$WIyT625wuAq**zKNo` zYi4%bAJ;}?9a|hUa1L=5%OPlr+BsNppgxIwI)@6TtuPlpnqz3wP?){_8m~D?R5VjF zF4{Ab$?7wcx@0he579d-G9j>#59x|kvOT$?Fil>WjDuys&`pRxsW6GaAU&>)(n;(h zx}S@&x)2rVxWoxDUJ|1_XptA?9^nFJL zpj<9<~W z*7n+IA_)T(=m3G^gOHj)Ll1Gzlv`>VH*|nX$U?U75v&kmNtQG%gkO`^vO=`y5AP=) zwPU*`+RIKm2#g^QPq{i8-cKy{bsTew*vDQG|3e(%b{LH#CtU=6>}D}8b%Yx2u+Yh5 zAj|-L-(J%;aM`;*Fw{PSROlmx5qVJ{lCh$YC8|Y!{3d}!+^ttt$0l`~C4?iZn+gM!Y+^1Q^7a?7(h zJ|1VKXe273e7}^7$2#X#tWO0ZcFr6B^ZcW(NiGpA-8fGulAOdP>}uE`S&jrH+$<$I zWqL%f>Gq}AgPv%QN+#W`9vSLEfh&w2D2oiHy=>laW?Ho6A|j;!B6kbs;k;jlE=m+g z7O$tG0P!CLx3Lup_NoxG6_2wvPt`LNuT=pms*|lxF6GMB0KPf zeznmUyy>22s?Y8kdU?eyjT4vW&V5&H-0|VitFIiM?OC{T@ufs{_m=mz^u0Co>tlXx z?uCtN?X^kJd;H|l$ZhAl-km6X@=jy+^5*2)^+O!}oF(QOKRw@FpTBqh;OTSAyN@j$ zUnpe?i+3);#l`O#ZbRb8w}z*%JlH-D|R>a_U|t~2`-H+1g$+ioKfH3weR4c-@X`O diff --git a/src/main/resources/assets/betterend/textures/item/silk_fiber.png b/src/main/resources/assets/betterend/textures/item/silk_fiber.png index 06bf85f0848bc45efe192ff6b19008b8eb255a02..e8e0dfeec856f52835cb540fde86aa859992584d 100644 GIT binary patch delta 199 zcmV;&0671P1LFaZB!2{FK}|sb0I`n?{9y$E005dvL_t(|+TGGS3V<*W1W+$-VP$V2 z*a%`Rf~}yXg&sn3k(DhbjK+-!Rt8eI$-I0_lKih#MJed9c_MNj9=cw(WtDlHJajiX zsBzfs&Uc1PAWySX7&~ALP!!-W2N?!p?!bcZt>eMHDA3l;2|z#?HJzhD93{9!AiNW- zs$-7;kSoN00d*6wAVqL~t(yD0U$|4 zK~y+TV;K5?5lX|s%t_P!LzxWed080pF!2BXe+EWIMpOepnkA(r8Kk6S7(Rdb%y8@a z4X}7xZYEGIs#zEYAZr$r6o-m3FxmzY-)-UMj(J<07&7pXHUS2L2Qs_m_aauLEc0* z1a82`kDs6{2!Oc)r18SpvkbepZ3BCOmyaK+0s_DWR5sT$KDqyZ;rjJ!U_r2LpFYBE zy?WsiSR5OGy8vbgNHNSH7!VQ_1!FEu9&WI~$N)8Rp#T&sAX-LIfq|c&5AJM`W{?FS z%djRSbO1958Gtl{XqW+H1CRkAfD(#9KHjl{fxQ(7y1hQCuo3*M;cr+hz&9zWWjMTUtNOfKQS%<8v?}) zAe)g50f`fG0UX1e4YC(vOUdkK^bv4#%lmp&BPjj y>}&=c0B0=Vw3!$Kh_M;30U(XUXvS#(xflTY@%ALNGX5q20000IFdU1AL_ZUxMV5OEXK5xx(IJWnkTfIFK`9{O#UFvxY*mxGqX&vw=qXI3 zT-TB)Dx1yvvjM+pCn-i0MT%xAmL(B_bOsF<-*V_-QYsJWy52IIG`I=fzcpf@zq6hU*|KQ^r~;(>0xxc^B&P z=XC-owefgaV?!^QOj*Kl+Xqk>#e{5#b`paYq`IMF_S*_5%?SyHj zONHtxS;iv~uP_3>uSYjjGwVFEW)6%37lsLzW*Jm6k_jXj0aZ;31RtdX5=|GNaZ}Z` z!SzsFccVzh6xn5U)NPh5M)LGvO+QPx=B-yf7-zQk(1NJ6P(_JwJm*7l+{SvL8I( zv=UIf#TX_OuM43{6kqEbRBKClDbCNPAR^tQH4EyFskvET!`39K>{hy;x|@Fo3~cUx zYrR&mwch;(tL1;XFD6Gx0V4^~{!S5IJo)MtN<;m-YWZ(#cFhtTZN=WOdG%(?F4T`#;(gEkdE?=WC)@wN+4TA4%T@PJPaYnbSh;e2_fC7_ft^Pt7JP5KBl!Lb zegZG`4Zn17akcu);V;H!YsP%U@~&(3qi@g5%&V7v+a@%fZ}{c+%)2f0$keAh?mKd2@x`C8(KjcPQtt<|r}2yD zUzu+mYk0nKd1_nZ@Q=0lQu3P}Gb_KIIZ+>LI6kuX?9rtl_MRr!VfrbtsXegkiO$FO xRW41R^KHK!|EPNLG0|F^1I1ZIQ8VDdPl5~dNx2PxK1Z26B%9zidFxdepq+KSILATOBa zPKJjA$pB-Y^%Cr5P0B_Vvrafk?I&hyef|K<_~}u`ZVY0000D+EHt(tu;u( z?AoG(5P;Ib{!ChG5~*j5po5U@;tt;P6OqxcVRmgfz3ktp_uR(4|ra`Me lmQX3)bwHy%$Zhc_d;w(rm;Tyk2*LmW002ovPDHLkV1nORn^gb+ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_door.png b/src/main/resources/assets/betterend/textures/item/thallasium_door.png index f9b342c19ffb2dbe2ca82dd5631ba9b72f79151f..914279d1eec411dc90a61e927b1412d6ecaa9408 100644 GIT binary patch delta 245 zcmVF-RSe&2%MyVZe%^=#dZwpv6hz-I74KT}_1lDX@H6N@QB<9$>63hn~M3ey_XM;2V z0ay$~gZLnW2^s+MC&T53BYy#jNklDHUxd+yB~86%%lNyZg2*)o=Cq7{o=9c=!Z>1qb}di$K=aDPN1eV@THO=L+VIy2@{ z-~xDi1oAnR`fGvbrxz}ES3P>^m4~}D1-0590FaC;0G#ivcmOWRw5Z!$mdi7Vn4GBlgOhZTpu0b^ZVNa0OyUeB$CONsl97>gMiG=5u@FMyB1jPWAYMrPu=mLBL+o_W( T--K9+00000NkvXXu0mjfYZ$(l diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_hoe.png b/src/main/resources/assets/betterend/textures/item/thallasium_hoe.png index dc7bc40aa4d8b0e3407b29525ecf90122796faae..ce2633742413d6bb27342c0c52641e2065594a79 100644 GIT binary patch delta 193 zcmV;y06zb%58VNfB!8qyL_t(|USs(G|33pI7_X#N)uR7Mm^1@Gny&o+^nc5%*Z*hT zc!JXqdC2kPVrdF8yC!f{CyJAPm(E#vq$P zhJ-9Q4t5n$2EZ`P*&v&t-h#^!r5WaIAZ7qz1|dG;3_!LSraGBu1F+c)!szNqvKgCN vvTep{04X+O7(lAc7zRK!lB5~K3*=w`kYI8Hoc2XD00000NkvXXu0mjfymwV1 literal 1965 zcmbVNU1%Id9N!p7YrJ5azBE;I-L_ECy`A0L+b?nr>0Rsvy%^HdMnvfB?A+aw+nw$1 zCU;4Z79XNfp;%ue3TjY6Dhi5L=!2;NK?+76T3SCIT16;6_)v?jis$ToHIXz15B7F; z_cy=a@Bc9~bE6~sd%AaYGYr!+oXw2U`_E!x`;NTFlRj2F*Mm5FNc?~*_UJD#shlCR;ZZHyL$8)1> zn)sMa#uXlkvc#%-TvUKA$q%v;5LE%Ff|%feXaL1X=xp=HQ8nKx7-N}-np*TJ#g)R) zGX$Yhsl+RZIPr^usO!1_BtepRir|B3H-uH*4R*E|GB`lK?S(dR*@zLEWHL-~)M+CG z$7|ENK{HJ>VL}ypf*1!;NOhov+Bk30FW1E_B;Yc3up0&xE4Hy-iG(C5ky}u=Kd%y? zsmp8~02iQI2YkUyVpEYJ(voV6?NQ&ROAVG+vPP~f$|z%1Qca9`699`B zby?^2q$u+iLJ~^Kx+GyMYUrEFEtWwVUqEXaG#AW1SZt2U_TIHkV=W=+REXD+Xz>ME zhPOb=P%ka#? z)8jp7ip>q>K zyOwKGZ>;mN*7;qpYu1yrSs#^3Pgwe%`(geaahwp%~$Hbi| zh7i=W<<)BxjBW@~n(!F{)_mpvCxV(_7^D`a9%Kju%vOAcz%(Ii1nE)nNJAKaZV0-j zkOjxV8bKJu#%ch}5Nw)Y7+Edc0GNre0K}&eBnQ$6!YHu-Gc*L7bCET{G-9L!WJ5r- pS@BGqns6p0SXv;Y3B`Z`2LNczp9$sGT=W0{002ovPDHLkV1ljRO>zJL delta 315 zcmV-B0mS~+0o4MKBYy!LNklk}9Nql} zMG(5T&<-8MNhpeoSzPrCq*#ikE-vAIzhQja$ zUBUMjlu1^qT{OGh)3InW%-=!QL>J8iqW9O8P*%B9R`(FP&RXby=?fj@d&gL5kktSH N002ovPDHLkV1gyElRf|d diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_pickaxe.png b/src/main/resources/assets/betterend/textures/item/thallasium_pickaxe.png index 525d35b45447879d39895c24e84e1f2ccfa4a83e..7a2f2209dce5a4b9d0fb53fcdb6318b7bf67df14 100644 GIT binary patch delta 234 zcmVsf`r6i>Y2SkO+n%&vvX$V zJKy*HmvhdZp~0tDEPrGl%ZK$U=7DV=UXix&c-~< z0ywpqOhaQ)FP7Di@PocF97Zi6i=zGPxQm#r$ah9P4fTy-o9n`8TqWfp7&u}PiR{>J+PYKnH{CV|rD1@Q6bCpKmyBllEGyxvDSYBdz$*Y$p&3Uvjq!z0 z4rDo?aH7IV3!u1bbQr+@1nZh&IGzP@%%%nNh;i*aMK&_2q@1GTVPWi!ueiu$lmXih zpsk^Sbdthh$4paKbY2C##EP_F@G7nI0-z;5q0zt)cnRQ!gtAajnU6!7(;zZbSu%u#7&i1RMYC&h(@5euSp|TW zHCCq$L4dR>#RZxb6QT;^K#)|nlL^-frXZ`MDlKz&{YnQb{buNAyyjvXdbQz)tTe3x zwQw;eDJ|?mq*Jxm<|5U)r@YkWmkJ1z-la9G>b_$HCFr5vJg)4$bU$+^|2`bMyZd|V zwW_U!?iX1t|I>XfIa&eQd4%_Oh6>}URJU3h=HFGTe7kMeti$nE91a_20DfqkBFM(n z9zG*(L}NLEh-?~2_hzMUw43wu-O&wGs}4mj%AxpO=awB<`~1tzA6`z&r<(U%Ig=aO|4VN6$3OS4dOy-iMtcr! zKQ^}Wq1Ea2T%ltx*B|>lf8f|v`OCL|n{2=OMkIQs34CyU;_J!d7f&r!Zb}sjt2BZ6|X>)qK<-uoA+wbn0sk259-MIM`)bZBGrv>8OvxVuK zKYe!c&Bsq2y>EtiJ)!wcohzZ){g<_2$D#ABJ?qiF$l!Y~bhPYVIn};IBsN`Mg@{&y Zc=-EoU%L47lBMCPJkU3o{$xvT*FPqXmel|N diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_shovel.png b/src/main/resources/assets/betterend/textures/item/thallasium_shovel.png index f7fbf23245fff5712f204c635f6ed4c477fdbcb5..798b288ce83b61933fbe1f38ba0d43b9e0a39f9d 100644 GIT binary patch delta 174 zcmV;f08#8S_MB!7`fL_t(|+GF_t|33pIn1QYaSXC|h55g)QX&_9R0U(W6{(l1F zn!|U%h7fH4O!Jmkufdu@Y@!W7*9@Yu8h{G`4Pfvy=EBg75eB#bNb}Tm>Hq2yOei)J zWdO2fpbHpaHp4Jp13;P!eTBf9VPbgG0WO=7#fdTio6STS04LIj%Vwetz^9ogFMu?Y cZ2-9#08Dr(0AyfFD*ylh07*qoM6N<$f@ohxGynhq literal 1944 zcmbVNTWB0r7@iW@#+X1uwWPjeI`vkP**SCH8L~~&Y&3yx4C&Hr@j}m>IkP)vcg{F7 z$!_vcib65a2L+LMfohRFR4heHLATjHxdLH~PiEJJ#`+aEm`GR!?&<7*T1+8aF# zlOS#`ALXO(Y*Bi6zN*GqHPKm3$qT|3Q9sacTqhjGyz zoe%K-`SBc@pGJnw4en+KswO2U;|Q|Va>)zLYMQI@nsgk$7C5#BiKf%sP%OyivlHwv z2{5ZBH6DqI#Og*;)PNx={j3B;T>!cu$~+KFpqaA4Hhvsc3v9=n%skrAqEBhA7)8D* z2$f1DS&@?@C zY__Gbrk8TLB@sp=vowrGLe@lwxj7#TlQ<+Z0m37*)aK4O8s8iaFpNl$Bc#+U)I`%V zJ3Jg0CdEE7<$5-$gu7PE!5J9gG$#Q`q$T4;IVYxQ)l6CI1F{J~9hxP!>&&f&N+2fz zQ%aelx(Z6W#)c96Pq2+lhXiFvV|L51fCb+xaBM4+<}fLdfC^K0a?M3HYmRwg1U-bu zGHH&6opfE>L^f1pOSO3202Yr`1@lnUA&(p^shTJQ=;+P)8G>fw;>PpqeQpy(Ic}?3 zs^$QsiaeGLhj(lx#Tz;nd0nz)LvvE9DyvPl#{-uxHCS578oRP7qoDx{Dk+Cobj{&) zQ89QZVU1UiuF44LhNFscL*G_zvJBDqLR!nPv0(PXLSs~Ncdu<4r)0^n0N@QI+PtGE zkhfB*!i&15TTlf`$`S{Jc&$(hwmz!U3hV3FI@la_V?T2Z7yI$EEkA6nX-$aY#hB($ z+=bZY8n4|ost#-f0 zYWbh;8_7XM=oK*C-vus?r&is1X@q}Qt@drjuGxgstvDXG&H(z*Iz_NYsRMdO_~8RP z==pMGEHji#eSvN*FAugoc;uy1iTsq1=sP^~TYLWcwQKT%&b&Q$V47L{_=ih=j`^SSBq_@zux!qroSKh_E185eL-W6J10JR jGkN~5A78}G2MlxI%9-zTH$Ll+&(5)t@yw~cho1Wfu?Ti< diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_sword.png b/src/main/resources/assets/betterend/textures/item/thallasium_sword.png index 642e5123d88e43e3fe570557e2e1dd488dc055d7..544cb1b2b53459c29e7bba6aa13a45bcc6ad5228 100644 GIT binary patch delta 230 zcmVHyOxy|92-1Y4`9C(zCO-Lq5(SG=@B${r2gPVTv%A?QlE&b| z?3|hT&i8%)<(zY}r~BEOZFSoyimK`Ci1m{D4*%L(MgHrT9zb$?-0pb6rKs&Y{i}>R z^X_hns zb{kF^9b*pe8|zM>u^}XDOv^sHIj0bU4E7+M%cMFA@Upx(zD~G3+A8usy>vX`d0Q*02|4 zh|@v{8M{Ply2Uh+gmF1&b9?~!A?1M@D&g#5C!H795Qoz^gH6vRSiXd{Q$Q)NFp3FT7wslSZOrvz*BW*ZZXY2w8~kW&rOm<6vz&xw zrB@2ovtpTUYx4^eq4)M1re;`(4|Z&ZC2WHh%j*{=3T_& zN~h_1&_uX17G+4-0mIM~Nfv;lVTqN6aFEr=n1uoctPa(n%*!GOV|itM%tFI{asBy) zKG!TnI3B9vu&N_9B(o@@BNhTlW+O5Vu~3(x3T0L1QOV6A#~@1$rdPB2t~A2P2T@pv zK%P~31XxX#bT*>OI;-oVBmjs|ID-6!eyF^{(n{iUNiE&tf;j+_#ZlVW_XyJwQIJ&t zSQ+set4k7O)ksic`EV$#!XS_$D&NfcYlTqIg;9Z)+gLx}!AghW`xz~|=)=cKe&~GD zDiHaLG0Gsn3$ex&UmNRGYg2hC&d;VWA>E)g3+k?=ds*n<)+DLyX1bqylz$hFZ0vq> zy;iWb*8MuG<$t;_CI_XUnZ#s&=NLbpe02+@;r?B<{I^xR<_er_#s08#29Sr+DS}Nx z?T|B~vE|YUiYlw`jI|~rx6$&02Q3vBX0MI$FYRo&P&F>~@5)VlwdL5|^R?8S=1akG zIQMpcwR7&N>Z4oYH}{Ok#aoZXYR8`w5ANPy@%mzFsOj*T!_`z{*QBcs%%tkO$_C2c zyFWjlJXiPa_r~0e^(TL|>{V&{Iu-ltbZ;Ndjr*dLQ@kqt*H|J`*PEFMw z`Dlcniobu{II(B^a_x)sr$^78ZQ2&9JpIK$%|iIz-&dOEZp{3V-Fp0uB&c|zrT(+m zb}ij|d9jYV^Rvm^0>*c4)i-ZVpW6TC;K|7!g(-V>VdD9_%*=tM+gqyVyI&c+y12|u zUrZ_=ZlC>ic44rxcH%D8^V^N(?R}I`dB1$e_{Zg!%C3C*^o<`5z0-QN{7LHC(C35m S?B$$)7I(IH$38ePIPnj$@|@ZL diff --git a/src/main/resources/assets/betterend/textures/minimap/entities/cubozoa.png b/src/main/resources/assets/betterend/textures/minimap/entities/cubozoa.png index 68b94dcc98e173be5fe7418983365af5786a9dc8..ac048eec21337142fc4e014dc31ccab90f9ad746 100644 GIT binary patch delta 270 zcmV+p0rCEp4ygi=B!BQpL_t(|+U=G-3c^4XgmWod3tRC7!9!RC4`AU1#KJ~wQw4&R zAOK@*6oR+vcNXU1Qe~Y@QjBs0~T?I8F$?mV1Zr+ruCu1miZ$9di#@r zPv`0a$FqQ!1&n?71v%H{#&UK?}$GS-O+GJZywq2il+FjP(op-mj zTjJ(evdsitG-43c1oAx(>pge< z{eS=e@Bh|UJKI|;%AYL9Fs!02;O|Cv+`Kke(6>G@@jJSeseyhS!!}l#R}psL-D(Vb zct#5K8GXUsJW%3RK~%!fnvAOmjbRNK7*oToOG*uOmnYRUaId z0uvhSnP?Azi4nkwL{lT)kmM0T92x?ijK^f1PkM+9FOSaVYl^@#5M#tccuj|RU$7JR zDH_BbRwoGPsB@zj1!e&*pD8+CbN6{?BvLr%~`nYTeNmABp^9+8d15Hv5Ns)1rQ3xxehKE3r zW+lYc0?Y3aM_WE2A2KEn~=It*J)keHs)DMGGlP zEMKV3ygc0JGYjL!xAjW0s3i35ci2F`U_cMS(kz2YMly~NZ9Gk9p+VFN zqF@O32UbKWGX9^?LVkIl5>vFGBBD5K1TF$TqG)je z`8@=ZZIvXEx7it%35yIV0w*A8&JIW}!U`lOiZ&+f0AV)(d3(PCM$J0q?Zy9T-=Rrp zxP;gP^PnO4OLv~dixlaodU|d|nuTcY6q6cFnP!-Fr^6m`3vMLS;Ut}QyA#P|93*62 zg3IRQ95fIbD03c=5uQC|iKu&f%ycOqkjx0ibAEf^ON9vVOk?r_FbB><0JGDeNaS8i z4_uKfZDJTA(tEUD7N#o^BOz$e8%5Q-pAM(;Imk+({;4vPsXI1F9*)+Nc`WQj^ibHW zP)6%iLwmDyuH`z06>)8TZ>TQ?)^Fc#O6@GJpDnT+ezbaY@kmMEhVApr!3t`dv6Mcy z(mU`&bJyGp@~MwPUme<7{7qx}@pC(Wd*m1qQ%}`Pi*NR9-aWIPB9|?Z zsh6*Bv{qi@0#|-K_2DM(z<}k6{;r>PO@F=^o$WZ|rngv1R$t%4jjgs$PjfZc*s=P8aK>at`N+!I!SmtEo7Yoy<&$6DnBRBvLhaJUEyZV5&N%+`W5s)y zPL#bUPZsYu+I11s&2@}(i{G{%_$<)bWPkQ>V(^_`*EYSjaOnN+(oc@tRzAhvTR1kk v+UlJvx79Y*d~of%?<;R=LnrzhKi-OAbxEn^p)@;U{&TgpwEK@W5AFFArtf0~ diff --git a/src/main/resources/assets/betterend/textures/minimap/entities/dragonfly.png b/src/main/resources/assets/betterend/textures/minimap/entities/dragonfly.png index c26c6f9ecdcc8a63073eb73c1960f75a3e1898cd..f3a11e2c18b64d9e333b8c3d6facb12ac9baa16e 100644 GIT binary patch delta 376 zcmV-;0f+v?4w3_qBYy!|Nkl0|F;K`yadD)xbF*p!4Z} zxAKPr=K$-(JO5qt9}JuWtRn9GH}bhQa1PM6zVzSF^~S(BK!2_J#(&KvPrz8K{my@? zJHX@a~{O4dXigD5ax+dg!MW;~=Cr1yGgCLeeH4~c%k!f=Dz#Ig304VrKNk||Xy&ND# zFNg-&Nl_vMwT2A0y#r$qo9-ncs6A+Y{v#OoQ_wCX+W|U@-@rov#2)Pzj5=V*IsgD4 W4*r6W13%CJ00009JC_7HPveCX_Hxpx3)^>#??X+}&u` zjchn0AQ%Wf647K^ltd-IB2f%cK;~S838)DnWIU3Q4Frd>jPY>icU{{UgNj`8y?@{D z|NQ>9qpEUgUT#4yf*^Tbk9!3iQMKiahrN_Y48dW7;8`Of$i%5?(;)la)+0#vEzVyp zSNkd`hL0F&mJb4BJR(3ef|NSr0?pI`84ZG3F6zJr4KHqVITxX&aS9SdfJ~$DNH{7{aR-*F%B+CMY zQxyX(N#g zT9TJ+h8m@8dmvi!HwXY<0VKX&WWbWmP-1afF(JguycFX9!H&#v#u|ZgiGY@Q(a-bY zbfBuzEU3$+24(^J)M_ru@-gXYRZ!{vmvJRU^l-6kq{i zrfoq(4O>GP2#bX=1g(tSV71cffr$<-u%z$1d8S?sV){P&KkqLWIrxa^@T2o&f<(Fa zFfaOe7JAvNrf@QqC=VyWcr~OR#Y(U#H4AfSGJ7bRQ4`#OF=}K1i>0=?NA}DZZ7c*J z>A!?~3?}h4a*P&1SuOP9!(zWWmbKC1K^H(2d?kkG(_~OU9p4IN6TBc|#0)Y`_lE6Z79}~=;={T?kmlA%~Aq~)^?oqtkT9WH2&Upc^sbA+F3hZSMc88 z@UIt@tkV6*Hrk4sj!#>yLW1@MyJfVpfryTPHug2>cp(scdzDEezJ&rWl-07jc%IVog*Vx zxTF0)Z&M1UJRcaoVRP!O1;3ra^GetD9PK`FVx(==n_0o`TNicwhEe*piTlyK_UF1g zlo_)=9vIra)ALd*@_u4ZVfN;h{!e!+W&3t`7Y|r+_I#jqw-z4keYx%N>&T5C=IVwU z=DX)E%HQ(gAM>(Ad;1$FDi5yD-y-~2)OFyBsc&w1RbA-pndO1c-zq6`X^YIo>z0*Q zH45L3+n$B#M)bMe;puyCAiZ;V<+EJ#)^kTLjxvV|i%)uPe;+!yfw+cjM38rWIdHo1 Sn}L}6pYtxMbbnMHc;Qbun3enh diff --git a/src/main/resources/assets/betterend/textures/minimap/entities/end_fish.png b/src/main/resources/assets/betterend/textures/minimap/entities/end_fish.png index 6884a71d5b15014583e6dc1f9bd941d46ab0712c..bb9e8cb1fb63a4157d9c857ecf4a4b8f6f319eab 100644 GIT binary patch delta 370 zcmV-&0ge9n4~zqlBYy!?NklQ zfb#!P%mBsz(J)xtb^S9i9(oS2oOuI`(H#P_pyJ$rFoy9H_I(Cpm^ibM4-7Ma@X&LB zZtZC>hB*Y?Vwi<6iyT%y0b>{+OVoh*L(c((EQVpV?jv9jM4SM)D0mAw44TG zbc0|P0TU(|0~00~Th6`<#`0zBz!(-K=nft_4p7eA3&!Z#3>Yn7jGpbxCY%6cwY=3} zj2=aVvg6=&0L%a&8;oHNfJFt&fr`oV!I(+g8H{li%|pilFpV&acR%|N#vNB6SU!F> z7)yn;g0W0UH)|LZDw>C$1NiN$!5C(7*|9HR%x94a#xMuKq6C-4WJke(JAhp;4vb+A z5%KQ;V_ZRvt2!n*8x95sfH9T=1&o1?U;trU@<2y1fbh_Dz-Yf<)B*Iy06irbm;8=E Q+5i9m07*qoM6N<$g3ywkA^-pY literal 2040 zcmbVN4Qvx-7{2{NH_-*fYy)qG(+}b;OH`? zpZ9&2f2F?uIy~v*(!~mbdQTReKpSrScwCj8f76t5U3m)4c3GdHfqNbyewR6w+ReQK-6kGHeCydR=O)t zrxXUL*{7AwnCZu%Dn9h9O8JVKm|pfh%<(m5bsbrFewF1r$Ck%Bm=ZP>qrEO0}vT zgGz@}2+AqikdiDDEEo~xWP&n~T1p9^z^8C>ZMY^8T;K^%1A-u=DiBMhuyR0BB_$x; zhdTB6jsUQKBP2L5e8P-?j(1I2G72BWa|dWjIB9C>wN*r7e?5nkC6$ zs9O?5U)^0$vxl;>W-CjZ?|{Ot5jd6mPq4tVJ}DgJV9sKY^8-Q-`7tzAN!BUVNMRTl zs-qJs+-|lkq^Mko2W2ih2Gcf(qQEkYS@7{D68BQP4>tn1VmO$J&1bflDGHc4pJ`;j zOX6!abG7}$eJ)5m0SiHE^N?CB4G?{RYvzc&#F;g_n2*7JivCR#O@Kxh# zZfDh036Rmt(>|Iq^04B61&|h#*3gL_VM|2?x>uKcMHYY+ z$yJSrCfb7Kc&**-7_a#Z1T1-5yhlAADspmvBmf}k1I!%y7x^&c#mrGI1B=HtDmuiUKqx&=9T{HgRU7kj#1dGguJTZ6u7x=q`@ zEOK=2yM$buWPYjX*Vbc&Bwo~>5kI=1Vcv}1&Yn}wDPtPyt`_tv1KoQ%$=?MU}~3)89w zy0@Lx4>XDC_A`&%$g4Wh(*J$W>s3GK_l}wv8T=#jq@iSa+uH5LZynJWS+2kMsWi7_ zcR%OghB9@9L0;V6(AL*g_S)dqwyFWypZ)5r$pstBN4FzWnx9$Lm@`M&)W3Vr`bo2k zChk1knjKpm_3C23RG15T51qSq;b{BKg~yNOebqegQf9pKlXYLr?c0?R&#FX=uKsy` z{1eUm-tiljFi4iva(Ugrgt6&;j>fF+K55sw)8mY99^^v0_|h%E9XP$Yw6-Hpd<>~3 zTHAkG)mgM+vOYJyI14>=-un6PmFEkyyUu2iP5YLT`fg;;#Ez?vP8hq~;oMfTXGc4# zukINA(YOOQ0^U_`)82jNjpc>;mt$MlrXLZ6-MT-`=q&wE`!<)&EO)ics9O6sVoAR+ diff --git a/src/main/resources/assets/betterend/textures/minimap/entities/end_slime.png b/src/main/resources/assets/betterend/textures/minimap/entities/end_slime.png index ac9ab7e8566c4c344187eb41420f2998bbfc8556..4fdb6367f03050c9d9f62925baee0206d5a406c1 100644 GIT binary patch delta 557 zcmV+|0@D3}5XA(LBYy%6NklVQStKJo)@&8wh^Ca z-lL|z&=I{4%;C_&PeKw>UoBnH6A|w><;4IoKn(ED0~CwJC(35CA@V#gK&e#f3+bAX zUC-z9AxfvyPviukP$)cdx!gUI$$TXe2_Ges$t%(|Bb~G6M}I(fJ^ye5pubQr4yx6v zlu9M3)oRl3_hm2`$ap-KX0s{nc3arDbIxfL0tFA90H|)2O2rsxG#WA*jf^2XwpuMS zmdj-W$QcE=xdI@+J|6xp{CR1)T*_*-lEq?SK;HN2^}1+Ud{X8FKy!X2>|8G1w-Eps zpG+n)olaltoPXi07U2#9qc55Q>4nRr(&?0mLz-9CK+<1&Z z3|}r6Gd~`WvRfa*7XwhkwK2RrP?_=nw_cKy#ugxdQO< z&Nd*T0fYsZ&1NPl?BhNA>b>s-Knp2UZ*E*paWPWm6dWTx0Hb(KglI%a({`hYIRQ{_ z0wREHyQSFxV^hP3Fiz8o9;eVn5k55q4;}AOL7K;i&+J`xJ?fly)kF1k0)V17A=G(* v>~lKvbkVatJnmVi=Tuwa8dy%@@K7Oc?Z&^bI-P{!M9 zB#>8=lh4+avlNHTNkdb8G$e2Xg+YC8mmt$V3+Csg;aPo6V5lFWlv}V2)gfBsScFFy#}o)l@cUHQG`xU==C^6;BvK~Fg{$66N3ykAhQzhQFu{6RYs;ntW+!* zjC4eT+Y_P{5yyteJ(ZHnA2G)gzy;hu zP-KWDLk?hS9gYzEp|QB#A+)T_tAa8D33(`5&ad_WA{WSFrNn}HRnTLis>VZGCBP`6 zlrM^|V4)TT<)K!qT9_16Q^*UP=#{5GU;}K70xXzbrzc^_aMF}dCetP}Z8FW&8EBnu z1nPjTz%dH*cwmv^oz?#d4ds`%iY`%dh#ZW=fT0{qJ4MOOz+CWdrW6n!q0}FR!$D^W zvcd=~$g){5C|k?(99=>>*%Bwk;UonZTu&JpoFdK1xY-C;lOfq?HXHRpdz;8ss&xw5 zbN|!+C5eZ_#kiiB2M)nsx`QkkP>~F)CkIAkE>jvfx%f0yrWz&#ND}~53a)1XiF3(D zfK!~4!+{fuHv-0-!Z4|XIuFnY9XX8<5s&uh?^4>%s}WQO{N{m*Pz0#IF=>WX2hM`A zYNr7X3%ur^xFRF8-ZB75AJKjzFj;geUPb~LrLcOB)8Rxg2P0C5f2#Cn>VZuXgv0fu z9z%N(K7=+a5a2qM;NGlz@7x{)2~W(jW#kv_ztYnC&IB^{kXsyXZ&Q@!Rt?slk=dY0 z`C--NSh3G~ZQQ=7W2Sv!jnQw}Plm-sE^fX*U>bTh^~L7P*uihI%JAYJZ_-0`L&tpP zw2q5{G|IcbJ?Ugz*%+m3wr*p#cGtko&ktR#>WNxXP;m70rMh>Y9~YI7zwFGfwY?YS zSk|Rio%RjpC0aYB~0}3sqJV#I4 z+`r@HnSG1XFYKE1*?E___RQcd>xKkW!X~bbMt0h_^$#^&xmmMdb=~PdI_)us8#Rst z^$adU(*yH-S%|%s@>;D4UErh?z_GzHodQLQe5_yH{)|7 zj?eyNgJv_**HU;o<*E4EpYFNqZr!^s7OWaxnY+HBx$;O{v=8Y#vc7y_OvIhAh_hWU zICeLNhrd!0gGaV_SEhY`zoYPY=3vX$9dT=x3d@(j-Zn!Td!RTycT4x?h|!)8w`;DP zW5AS-uHLI%(PxvUqSP~Tt^4;CH2RCdcX(@3P2)$yrUP5ES7xofWCmFM-O8rnwyvX^ llfy~nWA=<1t_`n8PVBW+zdE&|QT>n3nwMkin)}-7KLHQ~)Y1R| diff --git a/src/main/resources/assets/betterend/textures/minimap/entities/shadow_walker.png b/src/main/resources/assets/betterend/textures/minimap/entities/shadow_walker.png index 56de0661ad600c71033acc6a25bed0e191a2c9a6..ab8fdf5f10b495a0d587464012f2bc077df27127 100644 GIT binary patch delta 248 zcmVN1YjOSM6&!?)BE3)vZG^aFVNEP@Fk5U zI+;bHskNGKG9$nUFarF1fFP+Vw+PH`g%~r)X$=B)_OS0y=s&>XrK+jjbi&P7a7%!c z${}wMS_oCj4*dtvzr{IJ*7=TotG7M&34{3UMKx5=_=X{{dLFX-ic! z1z0(&=5?;KZCtAV069OZ@~Z%==4d`QBmcMUx9UFtA5^v-T&q>FYT|3kBRQrF{RiOD y%gx4$c_3YfP+OxoDhBO8!1y8>0Y-qo5AXsDDHdy-qc1xE0000NZU literal 1619 zcmbVNTWl0n7@mqW7APX9k>bN-+6S=Ao|)O}j2&RvZS5MSwq;|Nm;kdgXLl#vnKRDJ zvKLW_l4u_^czHmhybvGSG&R*KF(Ps)m}t=_^##RZ2ogn8U890T&+KJl3@S3onRCvZ z?|lFLpRvJ#``VXuEFlP@J<%T@#xv=TTUznku2iacYBT${*#xn4l{;F9mtVPyAa4Fi zOQxKZv_(*m?vquNhQ5++Vl+YYY%H0wG723s4YQgdQa`-=K1FJ(NR0#~MlxeCr}bAX zxV18nR4StiuTmQ~kUb><6X?*9$&#KoY@sAlHC_R)-Oqp`YY=Btq@u1sG9?X?F=Rn9 z=nK&b8{o(=?_)y@&jr?#9K(hI69%lGW>|p<34WezJQS8@sTpB7-q(3faQ4}FdX1G8Y5`CY&dd>HtfzOLmb+QrJ0U~4ANzk)2QHx6xOtEf^K@W zhTU)zb{HthCSZMxYf=rUDjv=(SoxZ8RRJ&$b!a#?#?=GxS z!?tUp?PS@6U>Mq{U@5S77na!BRLsmF2iZCF4|aIRo;9Wrv!LuCD~V9P8K}V~3mJ>K zfr*f7M>Io4MSGnqsBs6zWe18B$8anT8O;WhY*+{~0>^bTet}`?Pzk4kDm(J^fsv|Z z%Kr&f6(NHxUB-^mbU6!wX=H2CBuPjZwj&z~OvFVBtLoDh;4A3b}5T(-AoPxZMkuKocgE2;67bo;HZ&+ea!{G3{R465l~zoP7mcWrp5bz%O~ zHs_{Sk5+y2Gml+}-nRQgc4#g)vw5z}rq5p4w=gPZ4{rz7+2ymuc{cje?JKHhcAuYR zKKcE<$nzZ+Td1|GyJob-udVs~^8DNP?6@;=EPQU$_`>6b=@%!yu1@g3JZ(P{`Rc%$ z?l)GCEIgSycG{19M z*O!;XgKr(WoHS35p{GvHT`@NudE}1nN4v=G`)9?W@AnQ)9@qBw9a#EJ%Z14^hZbE; fe1`2fz3SIRGvjI`v%P}<4g`_t9f(hD-uc9z-pU?9 diff --git a/src/main/resources/assets/betterend/textures/minimap/entities/silk_moth.png b/src/main/resources/assets/betterend/textures/minimap/entities/silk_moth.png index 5dacaa25b900b7f919ea204387abf57075a2c281..fb1a6fb97c37221c5ba1c49dd634a52b35ac8f46 100644 GIT binary patch delta 238 zcmVA*f|gB!xC& z{h^VT36LA3-aDleuX;vuMOqK*ODW|K4TEvh;4eQyT zQ$Sx3&};%2avQ9d-8mZAB2WvX2fesX65udUEe|{q2yxV~o@f2Z0(NMZfR)W5Am+B~ zaeW9h3D~@O9Fi(fpUy66!q)Pw$RQwa2uQNPJzdMm$G(K){zyr=*hko$3;eIZus2Y$ oofi={=K}sm0zV~i1)})ylw92zNB{r;07*qoM6N<$f~Rb1mjD0& literal 1648 zcmbVNe`p(39KW_(*VeUA26h(5o|m#!>gC=gO_RLt8f(%nfu+_ovaUkin&-eHDo*5k2-`LRFz%Wc>Bpiy-8Q7z)mcGsD=`}jl>)}Ht!`!jM9#zasuk2)) zEx)SqVQV;g0LdidloXP{&Rj;PXolGr$mxytLGP4peiDJ&=ZAGJ&03k zc-p{2(*tpNdR+D^Y@i41%OOgT!IlJanY3o2oX8e<5nbD#c@`8P*0{*_+5*9FbPxoI zfq}=_#mPda3wZrbp$qz5o%aD36udn2@`9U#0)k!0?FXfYrP2%~iDIGtk}SFt*_37J zi08A}tTXF&5@U=P{C+$_Z^`U9c9Jz6tRezBL84V<+x&vj)Df3EMmk7NtXjP zSY`pipdA<=Xg{cG3dx%H+JZ`Va7ePS$hx3QpdsS~Ph9Y#P9O4gbwD?Qun3LPR8S;K zx-~FS)a2BELKPV$iII`0qtuKvhIw5ZD@cn*QA9H>Nt1CTB(hXhr>ZJQ@%rQ>Ovqd^ z30<7a(}_8s7t$P5+=84?e4a#?uY5m5}917(M_e3VU4yggZ8Ok9zEq{ zm?}pk)EghZC~s_T1}@%Tz2{g}?QGM|$)$XEe(P&je_r`;X=?4p%U{BK`XkMw$HZTIqfKLkGi z7Kq^E@ay|W>mJ|uy+s3c`R$jMk8ck8&yAcOeRjw4$sux~^XV61?+4HW#phAJ`Odl3 zrk>>Wjg@URZ@t?-a0&QlT4zS)+U2(HmZiI^wvXsDn?38T>H50B`Ri+ek5-`Po%!k? z8~Pu6q2`35Oq^YV&&77luD7<#e0^%qcNg0H;2YGuaPI8eO??Zq^Yvf6`lQw4c=+;D zUtLZubvUeR*S>f7)_*&B#kbNwo1gn6@&2KnpYjiFJAn?L*~Kv3M~y}OjZf$8e?p{h LAhhtn;iG>7PG2G` diff --git a/src/main/resources/assets/betterend/textures/mob_effect/end_veil.png b/src/main/resources/assets/betterend/textures/mob_effect/end_veil.png index c3c79c99bc37ff53967fa06b73452d76ebb07b75..39e14cdf8d7f654df99dcd53390fb8f9459500b5 100644 GIT binary patch delta 649 zcmV;40(Sk$2A~CyBYy&CNkl)b9Yd`>=-qn)rJRBKtsJ^bwsQnXwC*S(CkL!;4&qb1fNwb+k4}yvH8O>F zmnLzueUSSMWPfKCz@(t9mTJWO=#dPLGio7|Hc(PD{7_Ad9Ulf}zXKN(ya?Y$?D7*_ zZ$FDAenBy}1Vu4;TQaO#3q(Y}jC8`lmz06>oQ963LwIw30vIbJ)X<9EtD7+2`3x@y z#&L9=40F-M0?&;lG_XxlMG+l7%&1UHD=4KkoRW^L8~ixDB>=Pc6{dUc zA?iB_O<6>N=f@K&SffWHpTJA3*HlB;H2u<8{{q%w3tnaHt>4^E$qM z)R4^RU_PnFjA;5KbG?Mr`#hFEtNe|1<8kLLOmvLm>VZD2=q8kS-pa9Z`LHW95+K@A zg3)W;D1V`@ZX1djmABG{Xk#1le8{WnTkKXShm`Od56F7`6d;R)>^-5S^VtfiZMIpm zeH5ddU;E<)xmR7N5-_)kMHF)(bI-_QLK(FxfC4~1iv985U#(2Q+*Yl;CaBgeLLJ5a j_Feid_%9!^8uk;U@=tATxztnu0000WlUxFqOGls8pEZG-5quj zEsM6CFtUH`#4E|$GnccE^!iwPxI7ccf=Yh{bs8X{Ph)S{5U2+WnVaahjX6yInQ_A^Sp|tIx^vQ2@m=e=70E~YnIF`5fu&`gO2M$ z%Q+ztmCRm=T{4)Kb3$pECNp7FMp4IgDZkeRz)&m<=NnguU~)`DM z0T>PHjhBP)@h2L1uZy9Z-LRlQ6xa;Pn-77bNFOvY4j1a7%?qVlmWWy!vcD0FFm!*A z{COe#kB`o8uYWRQ#QE{gFYG#al8HQE|K_aHmIh(KzeLpLRg{(qgJFtO5ngz2Qc{q| zV~>|3$K1S2q`3QCD`P!A!gKR%IDH1z8E^p@@Ixr6ps9|4+XtW5$oQK%i3Ag}IJ+Qs zo7+WRy%)I}l-|1EW!TdrzaG6Jsi~xdr&1CO&Iw=ENPocXgQhwxl-R`?za?+}^kEao z$$?8>HL!id78rU@?H^~j{HUG6w^nvv69VShhO`A4SR8WX48d!6!EJWuq(rGLRh^hR6nG-kztuoftOMyl4 z!CFP<*?((PRa9UEQy6O$j?KmV{j7)czg;G^AcU2|SzQUoKZ8(GWglc)J=<#c^5KC! zOwXn`d*de_K6%WPEy|P;=6+u{m%KkS9iOAPx(eqvmC)rO;6G@3M*x3ygQp()M%a3! zhL2K;;pe^lP~8Yt@bunh-3}LvYZTO$fla}cR)63k86xM*HK^LDOBs(r{nt!8)>Bly zN8dpjI`>t=_q7m5p9E5M30Gay=GJJ#f~ib5}^fixLrahsR$(%pKgT737tGTqUWa%>BI;93b#wl xsVrIduhw^#+sCqk|L997#i6@~`68DUMa3 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 diff --git a/src/main/resources/assets/betterend/textures/model/armor/crystalite_layer_2.png b/src/main/resources/assets/betterend/textures/model/armor/crystalite_layer_2.png index 58523c40d794dd40ba1e38712aa5e8208de6d5cd..26bda1e9e14a35d30ce755c02b26f3d4e5cbf0a4 100644 GIT binary patch delta 438 zcmV;n0ZIOW1PbBQzsVB%ay`w0rbq(y*sD?tHvwtqf}OR0yfwybz)uR;LX z^n_qYufp<7MhNBo#o8k}o3~%RKmMbS9ctPLZ1DqGJih`2g$iW#PKgwLRbV0nIF|ADuno1z7$0c3Yj0pChC^#5ALQpugc~x zdmfOVnf|nvJ`d0*KwuuAPk_KYAbtUA<^ehcsF4T6FF?_4Z*TxQ*1Ga{Qv*}07*qoM6N<$f=KYf6951J delta 617 zcmV-v0+#*H1AzsQBYy%&Nkl6w5M4T_|3Wo~Y6cV`yOdTe0l z-q-BDdBg6$H^14Lc?g0a2!bF8f*=TjAkbcnSZha}>%)7I?|%siofgHDNBa6^!EyOU z#fj(kt@yt2!g2eCtAM4Yfe73Xrsnz744gPl%C`L%FQomASAp}?5}~KSkx@8sF#hVi zcBvCEHxIvl#w~O6Odb2c;qz~Mw(U>ZB`2h{0?(fIqF8@C!_b!+qZ4rGZj(0mQ+~UD z*{LvG({k=gdVgqb2V8^U1sMCj3)}D5rB{F=F`~h#Gb~;o=Q9!0^+}-Sj<`n(&{H6} z;c2a~`|7N|Z*(PZ`F+|Tg&j$&wSQzpx8$`?kEOTEDnY7G7FoWmwxqA%Wj5Xj*_)ru z+A0zI_QtAEA8nFjV|;n~7fk=zRSLK>t(V5}%ew961b=L=>NfMgPywr?snO2Uf6Elm z59aV>P(hegLhT!{Ml)~!0_i`y_5JC8fEr;V>CK!e{?)%=1-K7ab%3NCPo8!AB#5G7 zO9nyk*Vp$=_7sqMK$k2@dWNe2sR!h&2W0(6O2oj|1H#U_n+!(T&3CZzEw*jHC&4S6 zdH{Ql5@KCBN3i@HUS4v~|Gw7)Sg#ViUWWHSpt{pN|NCAKp!EQ5e1zXkSpBL49<+J@ z^-sVySj{;9dsYvq^v?H&ymrZncY^<04-f>Qv;cnq=n5k1*Ofp100000NkvXXu0mjf DjOjHJ diff --git a/src/main/resources/assets/betterend/textures/model/armor/crystalite_overlay_layer_1.png b/src/main/resources/assets/betterend/textures/model/armor/crystalite_overlay_layer_1.png index 10059fd610956fb77e4baedf2b9706aaa8386016..42b159fe6d47a15e5dc4015fa7dad40ed28735ae 100644 GIT binary patch delta 326 zcmV-M0lEIO1mOaZB!2{FK}|sb0I`n?{9y$E009_DL_t(|+U=JC3WG2VMSHHzZugky z5s#ra&6Z)Lh7KEPY1%~y+t+~ouaYzl0Ng)^GXMs_02lxRU;qq2G^Tk5jPO6kYaD?; z?+(Cb>;M3-WnB*d@FLw605rwTqQ>9Bdx+(91prNkX6YW+Jb$OF8o&)ppIa9&00y9a z0Ac^v(DQSzC+UUM{xr0^{XDYdX}`(D@nu>7p!r-Ia+*NKwE)Py9`!|v&mdCWJODaw z(~(=Ms{)XIrm_4@^E#BQs{x>$NL|RUe12c5s{-KT^Oby@HOLsv9ui&s3y=Va<&&wa zaSEVRm8DTRbw4Mh`Pq)bC9AA-T&^)*7q7DFhoRC{Ry}~yRaQTM;bZFl_=dkd#nC!| YHFcgMOrYJqIKr;g5#-UlEk4Png$ELi}~@B!v8SOesMVGY=6j1Or2$H7v24tUvY#N^Xz<)~}$bv&}y-R^u3^J2n6v?~DSPR67vfWCEIsS0rKVX?6G zG^I@d-g3O%ictamo#!meGNDzB&1e$nqK zJo1xE^*0(50ONf!k7r5V5@XNQ`)#n=gWOH0Qnl0QS){y3?{@*1Kn*I_A&PFI(*&SN zqBKgn_{Zf^)FA~`*U?!5U?dDfu_W6hp)S7Ka8Y#~oqw(Xyot6;5nPH#qm?8@(Ze-W zH_>SVsI9UtUKvwRbsf(0dfiEtMW=W_pP%1EQ^!b+H^l@$Sgx8>tpf(|-$7e5)Ob^f zPk>rgt6B$)P|Q%{O&}6Lt*X>-yU#d&5OB})giwWpqW}Aina1(`fHPiraO6lK{d~7L c0gU|u5EHG0X9W&(8vp@z+C5q|K!^-m~P1B>8LjG(n_iu=5E$=9A0;#_s a`+)h!f(JMBUiw>u_@3;pelF{r5}E)aqc7M1 delta 209 zcmZ3*_=jkh>GZx^prwCn^fpa~60+7BevL9ROj*tZSW|3=9ktJzX3_GMwMe zJjmOiAi#2QSBuk;dq=`Hh-*F;*~~Az@{A|dgl9+mO#5LV6kKI~K5BXSVZ$oP fCa8&?oDbQU>@Ht_VR-mA&~*%+u6{1-oD!M diff --git a/src/main/resources/assets/betterend/textures/particle/firefly.png b/src/main/resources/assets/betterend/textures/particle/firefly.png index de0c2bc0ffdf9f1b4adedad3085dcf48737b0c19..2e305b9ac14fe9ceab2c9249d484cbef7f1d38bf 100644 GIT binary patch delta 104 zcmV-u0GI#H3xxrYBwH5nYp_qw>#V2 zx!xrrN#K-D`RH0aB?qe-dHMlT4U%&bNzyEL7 z*It@E@WcU4(`IW`e_hTqYRpW_|J6q?pO@1^N%fUX(;hyo#+3Hq?h#FUU@B~Eh>hSl zB0MT!%A2e(h!Tm`w8iB?g2^TmdXu%o*fVZk`qI!t>KUi!0}vz?)(NZIDLb{j)*#!P z#HGgalD;@Vk|1IN>w~BpXK3IVLtZ4;>ew>$Aw+C?#)=ZCZv=I{!c(Tt7fL39MO!bs z1y};ET|BDW0G2IKwxDAIh(HNBu0H+@DJ`WfwC=w+mL+$d(Gem+meud~3w@`+)3ya& z*R_Cc*|sSWX0{azJTT*IZo=TRjHF>ALLTdi5jS~Hc!tz;WI~kWv~f0elXRFhz=;J5 zK$$cIQj+76UfLZBr^I4i7O_}l5({&z^imMy@O#omQI5{U>N%;=*tUD3v&L4!taX<0 zUP{>NIVo{&qFB=5f@dB64|e3&xitx@qznt5HaPE20#%=|=#`2J%!2;R=`g0epFOJt zjo&aI3+5R%u%Qf@3Ec*CkyAvl{2Xu)03&E1Q-NZE_Xp-QY;FA~loHh9X@sSt!U(sS zmBj6#v>-sWI1@M~tmb=$RJ9O>6wS9jro8^+j2q*$lYEIt! zob*%>)%#ICQ%)pD?mEZI)mWnppi@ccElbQUt99Vml7b*-oUPEGgW*n^kE= z_pQ}max1*c(|}Xyb4MlgFtJcI%w+Vo#wBu!ogJ^bp+3wdgo#Rb&mbz!j2h$P@PGSh zMBDE$N%}9rAHg!-5`CPqmA3The)7wb`dg|tN2XYRw{m!QR~=8_vN@<_-j(Dg?`tfU z%`BB&OZ5C7WXH>D{z~J>2juphJInVkU71-wbLgqP_t57@Pwakl;l_{Gt{pso>B4dJ z)wgff!L7Yd7Y|Q;^Zd!_M}GbK;Bx%&?>`S-`{Ir7p1!zaet+|)$Il*XRAF*#iTw7* z?d!K5dva;_o%i1=-!S%Go&H3>J_~9W@7uY25Dx zW=@Ke_Py8ufK~uo03ZNx1E2tK1_0tUm>Wp$v#9_)2^d+4nauzsi+9hU_3U0ob0_X0 zru2URx>lh!Qntfo1<>va*#DB2 z0d#T(H#wtwAB30!;Q!=#yj)3{2j8yuC711S6~gRx0KPNF$H^a(uK)l507*qoM6N<$ Ef&=qam;e9( delta 329 zcmV-P0k;0-0pkLYBYy!ZNkl3f-YK&(u=2(kit`cg|J z0>Dkmpm{Oz;DRHFXilJoeUU)c0+I6Qq&#euviE^gZ3bgdNFLffUu6*Lz+e#$^9AG9 z9>|w-RR*8;1D3&ev^F066V>5v%-@X0KC12 zo{;o{53*2Ps<3hdRqeg`ur1p9 bjyK>A*wC?TlT?(a00000NkvXXu0mjfSc;VV From 155b2b2b21dc26cd71ad9755e2e95514ffbc8ffa Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 22 Jan 2021 12:33:23 +0300 Subject: [PATCH 208/463] Anvil and chain prototype --- .../betterend/blocks/basis/EndAnvilBlock.java | 45 ++++++++++++++ .../betterend/blocks/basis/EndChainBlock.java | 55 ++++++++++++++++++ .../blocks/complex/MetalMaterial.java | 10 ++++ .../java/ru/betterend/patterns/Patterns.java | 4 ++ .../ru/betterend/recipe/CraftingRecipes.java | 7 +++ .../betterend/patterns/block/anvil.json | 8 +++ .../betterend/patterns/block/chain.json | 7 +++ .../betterend/patterns/blockstate/anvil.json | 19 ++++++ .../betterend/patterns/blockstate/chain.json | 16 +++++ .../textures/block/thallasium_anvil.png | Bin 0 -> 380 bytes .../textures/block/thallasium_anvil_top.png | Bin 0 -> 316 bytes .../textures/block/thallasium_bars.png | Bin 234 -> 429 bytes .../textures/block/thallasium_block.png | Bin 275 -> 1667 bytes .../textures/block/thallasium_chain.png | Bin 0 -> 177 bytes .../textures/block/thallasium_door_bottom.png | Bin 315 -> 310 bytes .../textures/block/thallasium_door_top.png | Bin 340 -> 555 bytes .../textures/block/thallasium_ore.png | Bin 316 -> 319 bytes .../textures/block/thallasium_tile.png | Bin 318 -> 231 bytes .../textures/block/thallasium_trapdoor.png | Bin 314 -> 557 bytes .../textures/item/thallasium_chain.png | Bin 0 -> 174 bytes .../textures/item/thallasium_ingot.png | Bin 214 -> 396 bytes 21 files changed, 171 insertions(+) create mode 100644 src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java create mode 100644 src/main/java/ru/betterend/blocks/basis/EndChainBlock.java create mode 100644 src/main/resources/assets/betterend/patterns/block/anvil.json create mode 100644 src/main/resources/assets/betterend/patterns/block/chain.json create mode 100644 src/main/resources/assets/betterend/patterns/blockstate/anvil.json create mode 100644 src/main/resources/assets/betterend/patterns/blockstate/chain.json create mode 100644 src/main/resources/assets/betterend/textures/block/thallasium_anvil.png create mode 100644 src/main/resources/assets/betterend/textures/block/thallasium_anvil_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/thallasium_chain.png create mode 100644 src/main/resources/assets/betterend/textures/item/thallasium_chain.png diff --git a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java new file mode 100644 index 00000000..701f1c16 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java @@ -0,0 +1,45 @@ +package ru.betterend.blocks.basis; + +import java.io.Reader; +import java.util.Collections; +import java.util.List; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.AnvilBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.MaterialColor; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.context.LootContext; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; + +public class EndAnvilBlock extends AnvilBlock implements BlockPatterned { + public EndAnvilBlock(MaterialColor color) { + super(FabricBlockSettings.copyOf(Blocks.ANVIL).materialColor(color)); + } + + @Override + public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + return Collections.singletonList(new ItemStack(this)); + } + + @Override + public String getStatesPattern(Reader data) { + Identifier blockId = Registry.BLOCK.getId(this); + return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); + } + + @Override + public String getModelPattern(String block) { + Identifier blockId = Registry.BLOCK.getId(this); + return Patterns.createJson(Patterns.BLOCK_ANVIL, blockId.getPath(), blockId.getPath()); + } + + @Override + public Identifier statePatternId() { + return Patterns.STATE_ANVIL; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/EndChainBlock.java b/src/main/java/ru/betterend/blocks/basis/EndChainBlock.java new file mode 100644 index 00000000..993d06a2 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndChainBlock.java @@ -0,0 +1,55 @@ +package ru.betterend.blocks.basis; + +import java.io.Reader; +import java.util.Collections; +import java.util.List; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.ChainBlock; +import net.minecraft.block.MaterialColor; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.context.LootContext; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; + +public class EndChainBlock extends ChainBlock implements BlockPatterned, IRenderTypeable { + public EndChainBlock(MaterialColor color) { + super(FabricBlockSettings.copyOf(Blocks.CHAIN).materialColor(color)); + } + + @Override + public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + return Collections.singletonList(new ItemStack(this)); + } + + @Override + public String getStatesPattern(Reader data) { + Identifier blockId = Registry.BLOCK.getId(this); + return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); + } + + @Override + public String getModelPattern(String block) { + Identifier blockId = Registry.BLOCK.getId(this); + if (block.contains("item")) { + return Patterns.createJson(Patterns.ITEM_GENERATED, "item/" + blockId.getPath()); + } + return Patterns.createJson(Patterns.BLOCK_CHAIN, blockId.getPath(), blockId.getPath()); + } + + @Override + public Identifier statePatternId() { + return Patterns.STATE_CHAIN; + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } +} diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index a59e1d93..56a6d8c6 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -7,7 +7,10 @@ import net.minecraft.block.MaterialColor; import net.minecraft.item.Item; import net.minecraft.item.Items; import net.minecraft.item.ToolMaterial; +import net.minecraft.tag.BlockTags; import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.EndAnvilBlock; +import ru.betterend.blocks.basis.EndChainBlock; import ru.betterend.blocks.basis.EndDoorBlock; import ru.betterend.blocks.basis.EndMetalPaneBlock; import ru.betterend.blocks.basis.EndTrapdoorBlock; @@ -22,6 +25,7 @@ import ru.betterend.recipe.builders.FurnaceRecipe; import ru.betterend.recipe.builders.GridRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; +import ru.betterend.util.TagHelper; public class MetalMaterial { public final Block ore; @@ -31,6 +35,8 @@ public class MetalMaterial { public final Block plate; public final Block door; public final Block trapdoor; + public final Block anvil; + public final Block chain; public final Item ingot; public final Item shovel; @@ -49,6 +55,8 @@ public class MetalMaterial { plate = EndBlocks.registerBlock(name + "_plate", new EndWoodenPlateBlock(block)); door = EndBlocks.registerBlock(name + "_door", new EndDoorBlock(block)); trapdoor = EndBlocks.registerBlock(name + "_trapdoor", new EndTrapdoorBlock(block)); + anvil = EndBlocks.registerBlock(name + "_anvil", new EndAnvilBlock(color)); + chain = EndBlocks.registerBlock(name + "_chain", new EndChainBlock(color)); ingot = EndItems.registerItem(name + "_ingot"); shovel = EndItems.registerTool(name + "_shovel", new EndShovelItem(material, 1.0F, -3.0F, EndItems.makeItemSettings())); @@ -73,5 +81,7 @@ public class MetalMaterial { GridRecipe.make(name + "_hoe", hoe).setShape("##", " I", " I").addMaterial('#', ingot).addMaterial('I', Items.STICK).build(); GridRecipe.make(name + "_pickaxe", pickaxe).setShape("###", " I ", " I ").addMaterial('#', ingot).addMaterial('I', Items.STICK).build(); GridRecipe.make(name + "_sword", sword).setShape("#", "#", "I").addMaterial('#', ingot).addMaterial('I', Items.STICK).build(); + + TagHelper.addTag(BlockTags.ANVIL, anvil); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/patterns/Patterns.java b/src/main/java/ru/betterend/patterns/Patterns.java index 8650353c..30ed7436 100644 --- a/src/main/java/ru/betterend/patterns/Patterns.java +++ b/src/main/java/ru/betterend/patterns/Patterns.java @@ -39,6 +39,8 @@ public class Patterns { public final static Identifier STATE_BULB_LANTERN = BetterEnd.makeID("patterns/blockstate/bulb_lantern.json"); public final static Identifier STATE_COMPOSTER = BetterEnd.makeID("patterns/blockstate/composter.json"); public final static Identifier STATE_BARS = BetterEnd.makeID("patterns/blockstate/bars.json"); + public final static Identifier STATE_ANVIL = BetterEnd.makeID("patterns/blockstate/anvil.json"); + public final static Identifier STATE_CHAIN = BetterEnd.makeID("patterns/blockstate/chain.json"); //Models Block public final static Identifier BLOCK_EMPTY = BetterEnd.makeID("patterns/block/empty.json"); @@ -87,6 +89,8 @@ public class Patterns { public final static Identifier BLOCK_COLORED = BetterEnd.makeID("patterns/block/block_colored.json"); public final static Identifier BLOCK_BARS_POST = BetterEnd.makeID("patterns/block/bars_post.json"); public final static Identifier BLOCK_BARS_SIDE = BetterEnd.makeID("patterns/block/bars_side.json"); + public final static Identifier BLOCK_ANVIL = BetterEnd.makeID("patterns/block/anvil.json"); + public final static Identifier BLOCK_CHAIN = BetterEnd.makeID("patterns/block/chain.json"); //Models Item public final static Identifier ITEM_WALL = BetterEnd.makeID("patterns/item/pattern_wall.json"); diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index 7bd080d5..1cfccd12 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -192,6 +192,13 @@ public class CraftingRecipes { GridRecipe.make("thallasium_chandelier", EndBlocks.THALLASIUM_CHANDELIER).setShape("I#I", " # ") .addMaterial('#', EndBlocks.THALLASIUM.ingot).addMaterial('I', EndItems.LUMECORN_ROD).build(); + + GridRecipe.make("ender_eye_amber", Items.ENDER_EYE) + .setShape("SAS", "APA", "SAS") + .addMaterial('S', EndItems.CRYSTAL_SHARDS) + .addMaterial('A', EndItems.AMBER_GEM) + .addMaterial('P', Items.ENDER_PEARL) + .build(); } private static void registerLantern(String name, Block lantern, Block slab) { diff --git a/src/main/resources/assets/betterend/patterns/block/anvil.json b/src/main/resources/assets/betterend/patterns/block/anvil.json new file mode 100644 index 00000000..4e7ee106 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/anvil.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/template_anvil", + "textures": { + "top": "betterend:block/%block%_top", + "body": "betterend:block/%block%", + "particle": "#body" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/chain.json b/src/main/resources/assets/betterend/patterns/block/chain.json new file mode 100644 index 00000000..8638b8b3 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/chain.json @@ -0,0 +1,7 @@ +{ + "parent": "block/chain", + "textures": { + "particle": "betterend:block/%block%", + "all": "betterend:block/%block%" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/blockstate/anvil.json b/src/main/resources/assets/betterend/patterns/blockstate/anvil.json new file mode 100644 index 00000000..82389017 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/blockstate/anvil.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "betterend:pattern/%block%", + "y": 270 + }, + "facing=north": { + "model": "betterend:pattern/%block%", + "y": 180 + }, + "facing=south": { + "model": "betterend:pattern/%block%" + }, + "facing=west": { + "model": "betterend:pattern/%block%", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/blockstate/chain.json b/src/main/resources/assets/betterend/patterns/blockstate/chain.json new file mode 100644 index 00000000..76071638 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/blockstate/chain.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "betterend:pattern/%block%", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "betterend:pattern/%block%" + }, + "axis=z": { + "model": "betterend:pattern/%block%", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_anvil.png b/src/main/resources/assets/betterend/textures/block/thallasium_anvil.png new file mode 100644 index 0000000000000000000000000000000000000000..2d582f321b10d1dbaf3e86780ff00205e284aa01 GIT binary patch literal 380 zcmV-?0fYXDP)Px$Hc3Q5R5*=wl0j>PFc5{mb{DfmgF@Lup~wEC{)ztMUV2=*hqjHz5Z^+giPje4;4!7c zl#Z|WH}+Eq`12{}poxS;TZ^H`pHBcxA+XZA-EcX70M{wVPh+e6 zXgk@~by9KgBx{*Mm_wAA-U4YmV#$;a_xQxl+Bt)rwYh`trWZ!%u~{UoVttl;BuEWj z5XdTPpjNd8!gUJra#2>M5J>zj*e&2ffs8WCzd@>1Q8&vBbVs?ESeCZ9QJ_iW@;Z|> aQ0f<$pVQ#vUoGGO0000Px#_DMuRR5*==Qb`WNFbo_DqEZ*y3kSZyvv>th;1xWJ7a)4*rK?dYRd8q>oTQ
    Mu{HcP<^X=46+C?)YWu| z2WB7}&h+y zEO(5Q|Lq!pJE=o3>d_g;Cqb*gQY8!4D46vmGCbgiHzKk@Gf3I3G>IM4Rz%h2moJ;Fpzb|pGLPNSK@f(!2Lv@x(A@(F2CHVqUclH~d?e<&K2D&l zUP19NrkW`mh!@yZoC#E1*tWl#u3=`UN5l`B>Ms7NuD^QhdVlxInFhXIhhZ1zJAF5X z0v^MH)xA^MXoOe}{qojNi?Sma}SG(m1wc2DwG@B*Gwl1h_>No?q#VgV*?{Axiv__qa* zbiunSO%~Aj%f`Own6p^WH|FQq=-n1Ky!HDM7djn@*tqW{*M@Bl!zo9I08Vyb(78?Y*@Jchd3Ff;8>`OOs*%^?LWTy|wq^-9ZZu zU#1XnnNFB7en6)Q(Pd`IVhl1hY>SD>rrSsqmBs9X`av_|7TuP8Kzy#W&1Udzmpu18 z&pp5A_kaK2cxU^=n>LnhL=a?Cpv@nIv%?-63gG*|t8oTSMS9y~CV~`yW{-8RRTq~d zNa1gCsN3r1cX6VoxCBXy09RVkAsRvI8`8QUCV+)TKulJ>*smYYVW=#5v9O0Hc-;r$ za@&vrx`x_A;!r|lC9Gj5TA$`1fdVW6O)E*&m0IMY}X3hLbGI;sk|LloKMH=Adc`X{Ty#%Q5(YDH^hF$(oAVj6y`~x4anC zbkzh!&(o@A)=ki1cv{eL(nZ)NWq^{H$Lak>G9z3PagYQGP%RT;$vjq%YnEolwZEax zAKxMXx|ZkjGS<{ZQSu^8t7QP1k#)$LXfrgZ13U;!t=|wq%K%h!n{AEG`3xXfni0~p zWG+yhIh9eL&kjr-x+5&Bl9nTUmLU~P+ zql0TgJseHm0)<&436}7$U`gbnnxP2LW?2zp0N2$RhUPuV`Lv{FK*3NuI->>8a{<+~ z1XTn9zZZjMyJT77=m^U&5?$vcr3mX}>fD4=U>J|nLqvoK$wulV3gqtlHL>3gZtlMH zKks)KGAu43dD}d8$=O-KwaF%o*I>3Ny1-M}RZ>PXiNFb>o#0+fv?B{7Ec;o$Z4a!{ zrs4pS{zJG|VWt+fQi1`RV$fUvC8KbtKWI>*VMPTb*m;?U!tT-m*Iq~yeR zTYCB53tF2C3dc^4-Mz1Gdb-GQW63@FWwTzgbm{C2{p`x&;l3k1J&%0x%=>-S#Rp&b z=4)`J`Cc@=Z(+mbJ(XwXYfc4b(N|vnVEbVCv6bZuyWQ)t#!mz3>pyPU|6+Ui?9}W_ zJE&9c?bS6gulAlX-?|t+)bI{?G&~!yB6}f-$+cI}zn^;&OExxx*6e$=$`dwx0 z)M)gcnt_FdxvDpQsIa!;U4cv2uZ1V>yZkx-!0^fe>wHYMd`rWVOg;F%{^!u7X5c_Uynk= z*f5MDS32vzeqzgi29V~AO_%=H9KHjl{bn8j8wfHOSsZ2&NFFAq8B+3}0c09T(X1O! z{yQ|TAgCFp4kV`+*YKYK8jGaeFqh9NYkMG=s$9ULZ#^ zNFHne$OYtR2GMXYkfRwM2C!HlRWk^qgaN6VQKFF?%^)>!FQBI|e41hE;4Xl90Xc=? zvl%(Xg2TWxZwg7yhN*$a0w_!B#W#XEAPh1UM#C_&95Nq-0SF|Zkd$z}v;Y7A07*qo IM6N<$f}7H3Q~&?~ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_chain.png b/src/main/resources/assets/betterend/textures/block/thallasium_chain.png new file mode 100644 index 0000000000000000000000000000000000000000..1e0bc26e200d19b74c0faa160c857d8c75053231 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|vOQfKLo9le z6C9Yj<`w>*n3=@T9Ts%-f4scC0SNs0`>ogUqVYR>V{!3~za%9>nv6ZRiAowAGBGMH zG~Do!+u%Sxw@JRr$4z}s%-Mf`-^84k2iTQ_Ezh~JX>4rZaZ7HjF!S>O>_%)r2R7=#&* z=dVZs3if-tIEK_qT;@Hqo3F`0qV3^%>j^G*w+2asUb-f&Q7rl=(S`4&7fX`+W5&Gb zdw(l8`hQaNx+=Tqlvdzr>KW(GSO#q9k(XU@*OS$AEy(fQ%>!`2_|13EUe}ULJ)omOn)B)sx`-(w}Mc1d%E{c zNX35oAu;(#LF(pTH6sYY_^2X}m9JP}NIiibQQ)eZ`9&%AZve9zL{ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_door_top.png b/src/main/resources/assets/betterend/textures/block/thallasium_door_top.png index 3431684ff1b852f89398fb0470bdb766ab68a650..f48cbd2b3c62bba7b9a16ebbb0e558682be6da60 100644 GIT binary patch delta 531 zcmV+u0_^?N0;>d&BYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D0l-N_K~y+Tg_GYaLtz-lpTm~zEH>K?jkJaf&4ta9Bq^3V*DhTs z|9~iefhhlgl3N$bg$w0JE@VadQKEKXOBRcb4Le(gqwm8zhktE+>TS=S_dM_We4q0@ z(!k1=MrEkDfBK3_lS`$E5AfJ!x>fU3CmYFZwUDDmq6WE=uGKe+T|HCuUgZKjC-%Yi z>Je2SC|8_()Jhg(AA6wC0X9R+o183#tT?|SBHy5&&ZBpf+CTa1K%8uLI_Pk2Lc+== z6F=hJ$x#VQy?;wkHl5*)03RUQ(qnRb->8oTxD>F2kscRoUR&7Uq`qANZU*SmAME5y z@w@@A>NKwKCP2&hZ6BM~&K75i;=t6rrtg>~K-1+-iW7prB%t^-{>rfwTv*lK?bZC} zB@!#N`dfy`gW>TZ_Q&yhhzv+rOh)!WIP$-Q-q|G$9)Ey$080=iGTE%01mz^i_F9&V z8o(0T0?jjD(Rc(UT84-ZVp VfXbFHSquOG002ovPDHLkV1k%8^>hFL delta 314 zcmV-A0mc5S1k?hMBYy!KNkl)+>n~0TGg4oyzDeSHNmz8;!SvHTohzEDOx3@DpJKPJSpNlldYpLfeX?<<=#=BQz zBrf1l?YztD{3yNMS+eCx+S5afct@kHqYpW80c`hz`R$=Uk$(V59=MTz%k$?(UMBmP zr(ncL00rJ;fWz+v5>HjF`%x$$*iL;M%#;ARRfAqA(iO;Vr=}~gjvBxiTFKsu6(|kO zw$aPcLqnB-dzDS~3 zv%uUMj;I6{d^2nE({Q0Z`X`c=WdF&=0itK>0VVNZm4OjK!0%9S1q54OWjf0Oj{pDw M07*qoM6N<$f@{H%qW}N^ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_ore.png b/src/main/resources/assets/betterend/textures/block/thallasium_ore.png index 07482cbcf95185a2dd78dced7371bfd88c58a208..84b2471f8926355e1e49dba07d9b9efe278f289a 100644 GIT binary patch delta 304 zcmdnPw4Z5$L_G^L0|Ud`yN`l^6k~CayA#8@b22Z19F}xPUq=Rpjs4tz5?O(Kg8-ip z*W`W2sxDmaynA)Yi(5zcb)P-fef8Fqd(W1<`?lrVuf6AgJ_0I41|cfTEP#B@0*}aI z1_r*vAk26?e?&<&4^)`Oa zdVOvV!<5ZI2L;aT_^Nf*RPM#??5{5;2`^e7wWGtiP%>p&^VKsUlhUPrZ%;bvqL~tK r?z8K^JuVS>xmLRj`HTdcy#KK`mg*OC8+!nq%)sF3>gTe~DWM4f=dXLK delta 301 zcmV+|0n+}z0=xo{7=H)`0000V^Z#K0009F@L_t(|+HI4e4gx_8MEhI(36k$X1`-4g4B{jL5(MG|=E!XFHgn}fvvjZ1nQe#Y9^2t|Uza%Uo8fY5%Bfu6-hEr| zsnZ>KaH)&y@F~$gUnQrIV#sK$Ge`ig&RvQ5=1>bEkdoXakbkE{(SLUZJXcZb9Fil|2>eO7{MXU(q!Q=x&rh}#IZ-^=sFb@$W3N^^;$`C04=xhLdBR;dDKn42Y zK)`szXF!9x1r#WFBQh!W=A88j?!Y{KcOKs$8To)hx2fAYzuk$#fo__-`zbruEs#u^ zhP^x3T^rfP>?Rz?Wdd?$H*z9O*(^Tj{1^WL%%D)0Sl*Vf00000NkvXXu0mjf*58T) diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_tile.png b/src/main/resources/assets/betterend/textures/block/thallasium_tile.png index 4e21d16b6c4690aa19d1f4d07cbf8fdcc06b9e7e..50cc2384afce987d810b4fefd84a51e20d0b4bbe 100644 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFyjm=G9S)V0O4?{JdN@d`tWJ{2>p00i_>zopr0R3-3o&W#< delta 303 zcmV+~0nq;E0lor|7=H)`0000V^Z#K0009L_L_t(|UWJk&3qnBo@4F#(eMB`xxV7^@wUBpxEldty+4b>B?Qhlci;gvkAKX$)*ahx9vMz!u!@0} zJhBSFJ+dCK4m`375b(&H3jvSJnGW;|IfiKQ3tj=DHiPf9JuFC`esO$t4@Bd`2M8L0V%1|9n;lIhp;Zjq+JJ zsLDxbP4_>2W+>VoSshvq8pCzrd+N1vkmp3TtPd3zhc$>WG<5&~002ovPDHLkV1g#{ BhV=jd diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_trapdoor.png b/src/main/resources/assets/betterend/textures/block/thallasium_trapdoor.png index 41e7eee2b8366608052c3ea8c755d10d00549095..9f05c7f376142936b93292ba507874fd2911e9e5 100644 GIT binary patch delta 533 zcmV+w0_y#`0<8p)BYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D0m4Z{K~y+TjZ@1mLs1mn_iDJUXS9e$#QUA7R3cuJ#(wm7Z&t7})qj;9q1Q}36 zQF^)$Q)X3}!RVYsqA=HpKDC^nsj`Udc?vmg8MLstMfL48A0cNcQr8sS+Oavo>V*UW_tb6$X$yH>9=T?u4tPVSqfM$0X(f1gD*45uh1syJ-^i3~|26q+v z^sa8Q0Ogt?Z^R{@!8W#VcpelM)YDRuL3^Y(=`RcJkttDXMeh?tLXavxW{ajE$yfYl z!FQV=BvI}j^gU>-aPW9GR=mkl%{C+tv<-AoR<4zfy?TX;&GUjj00000NkvXXu0mjfyWsL@ delta 288 zcmV+*0pI?u1iAu{BYyz_Nkl3@>k+oF2Bfy4wE!X5-n>Y2IR!w}v$s zvirxbUtg!AbmKsPeY-e^SVJ^149-v6880iHHLRf&F#w9vt$%GLQ`;Uboc8Y_HlF7# z&e3c4)NKJQQdA&&ZZbrYx(ZZ!8hwqmsa!>*MpTwn$-t0WREA-i mGZ>BbDm@VtRYNbyA00005586B`>X@*kKmq*>qGc;LVR1COM}ncdwQ%^R4Kk{Xj37zAzg V_tr-TCj;$d@O1TaS?83{1OP-SKF9z7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_ingot.png b/src/main/resources/assets/betterend/textures/item/thallasium_ingot.png index a73aa71191999f71f32409aa4ba80075c24637c0..9c5ede2992eb9029908c565c3480b5a7965bc7da 100644 GIT binary patch delta 369 zcmV-%0gnFG0gMBXB!2;OQb$4nuFf3k00004XF*Lt006O%3;baP00009a7bBm000id z000id0mpBsWB>pGAxT6*R5(v#{Qv(y10{e7N|OzUHo&5B)_)L&a^V247mzhL2UvmW zQ>X4Q>`o0}1ap7@!vJ(m{Jf}+{P_7FiXmVF2x&qG$c8YQH-F6hKcmu<;p+Pz3{SuQ zhAP1X(%h_IT3e6x+gD^;A>B6&M`Mc}a zGq8YJKmal%RFfadL)ZiYAWf$)zhe0C>I0ZBASM8&K>%(52p}7Rt_cQQoz=iJC>%fl z90sxmY7DCK!fIdv0X}A|8qLg9z<~>rJ3DheSnS@mg^ci6fEj{r0L-~CO&|c$2xTJD z0n89(pdoi3z6Bcq3M3dn)`SdD5)v#uygGRl%*Uk(8DOMDQUQgzk%0jKvoM?9n})t5 P00000NkvXXu0mjfiJFlT delta 186 zcmV;r07d_d1J(hMB!8VrL_t(|USnVwa3CbEO%%4OTJ#@;(Zz|<1j03k?|`w##GNRH z5Y)8g)oT=tZU|AD@EHQueC7Wqf|_6$q!y+gWC#PyR(yuQG$CsQ=~3}WLl}T=2)d?_ z1;@b}K^VlwY5>d-Y?@#gSuNZEn2E3e#HSG?2hs?_D6s%D1T&j+ku||IVx$9PLqN1y o@l2eWa3&;JS|Fqe#ee|^0BFsh3FX#Y^Z)<=07*qoM6N<$f_DB*DgXcg From 5f20079a30eab08c191f3de3373b669579d0d105 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 22 Jan 2021 13:06:58 +0300 Subject: [PATCH 209/463] Nourish tags --- .../betterend/integration/Integrations.java | 1 + .../betterend/integration/ModIntegration.java | 18 ++++++++++++ .../integration/NourishIntegration.java | 28 +++++++++++++++++++ src/main/resources/fabric.mod.json | 3 +- 4 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 src/main/java/ru/betterend/integration/NourishIntegration.java diff --git a/src/main/java/ru/betterend/integration/Integrations.java b/src/main/java/ru/betterend/integration/Integrations.java index 769c7598..e139c5df 100644 --- a/src/main/java/ru/betterend/integration/Integrations.java +++ b/src/main/java/ru/betterend/integration/Integrations.java @@ -9,6 +9,7 @@ import ru.betterend.integration.byg.BYGIntegration; public class Integrations { public static final List INTEGRATIONS = Lists.newArrayList(); public static final ModIntegration BYG = register(new BYGIntegration()); + public static final ModIntegration NOURISH = register(new NourishIntegration()); //public static final ModIntegration EXTRA_PIECES = register(new ExtraPiecesIntegration()); //public static final ModIntegration ADORN = register(new AdornIntegration()); diff --git a/src/main/java/ru/betterend/integration/ModIntegration.java b/src/main/java/ru/betterend/integration/ModIntegration.java index 0e560852..ef39fa69 100644 --- a/src/main/java/ru/betterend/integration/ModIntegration.java +++ b/src/main/java/ru/betterend/integration/ModIntegration.java @@ -4,9 +4,15 @@ import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import net.fabricmc.fabric.api.tag.TagRegistry; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.item.Item; +import net.minecraft.tag.BlockTags; +import net.minecraft.tag.ItemTags; +import net.minecraft.tag.Tag; +import net.minecraft.tag.Tag.Identified; import net.minecraft.util.Identifier; import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.util.registry.Registry; @@ -168,4 +174,16 @@ public abstract class ModIntegration { } return null; } + + public Tag.Identified getItemTag(String name) { + Identifier id = getID(name); + Tag tag = ItemTags.getTagGroup().getTag(id); + return tag == null ? (Identified) TagRegistry.item(id) : (Identified) tag; + } + + public Tag.Identified getBlockTag(String name) { + Identifier id = getID(name); + Tag tag = BlockTags.getTagGroup().getTag(id); + return tag == null ? (Identified) TagRegistry.block(id) : (Identified) tag; + } } diff --git a/src/main/java/ru/betterend/integration/NourishIntegration.java b/src/main/java/ru/betterend/integration/NourishIntegration.java new file mode 100644 index 00000000..3e700dbd --- /dev/null +++ b/src/main/java/ru/betterend/integration/NourishIntegration.java @@ -0,0 +1,28 @@ +package ru.betterend.integration; + +import net.minecraft.item.Item; +import net.minecraft.tag.Tag; +import ru.betterend.registry.EndItems; +import ru.betterend.util.TagHelper; + +public class NourishIntegration extends ModIntegration { + public NourishIntegration() { + super("nourish"); + } + + @Override + public void register() { + Tag.Identified fats = getItemTag("fats"); + Tag.Identified fruit = getItemTag("fruit"); + Tag.Identified protein = getItemTag("protein"); + Tag.Identified sweets = getItemTag("sweets"); + + TagHelper.addTag(fats, EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED); + TagHelper.addTag(fruit, EndItems.SHADOW_BERRY_RAW, EndItems.SHADOW_BERRY_COOKED, EndItems.BLOSSOM_BERRY, EndItems.SHADOW_BERRY_JELLY, EndItems.SWEET_BERRY_JELLY); + TagHelper.addTag(protein, EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED); + TagHelper.addTag(sweets, EndItems.SHADOW_BERRY_JELLY, EndItems.SWEET_BERRY_JELLY); + } + + @Override + public void addBiomes() {} +} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 71c71e3c..a832e8b1 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -44,6 +44,7 @@ }, "suggests": { "byg": ">=1.1.3", - "blockus": ">=2.0.2" + "blockus": ">=2.0.2", + "nourish": ">=1.2.0" } } From 1717b30d4106eacddccb6ee232f8fa8899614250 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 22 Jan 2021 13:30:31 +0300 Subject: [PATCH 210/463] Obsidian platform fix --- .../ru/betterend/mixin/common/ServerPlayerEntityMixin.java | 3 ++- .../java/ru/betterend/world/generator/GeneratorOptions.java | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java b/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java index ae19c112..1342b15a 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java @@ -31,6 +31,7 @@ import net.minecraft.world.World; import net.minecraft.world.WorldProperties; import net.minecraft.world.biome.source.BiomeAccess; import ru.betterend.interfaces.TeleportingEntity; +import ru.betterend.world.generator.GeneratorOptions; @Mixin(ServerPlayerEntity.class) public abstract class ServerPlayerEntityMixin extends PlayerEntity implements TeleportingEntity { @@ -60,7 +61,7 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntity implements Te @Inject(method = "createEndSpawnPlatform", at = @At("HEAD"), cancellable = true) private void be_createEndSpawnPlatform(ServerWorld world, BlockPos centerPos, CallbackInfo info) { - if (!centerPos.equals(world.getSpawnPos()) || beCanTeleport()) { + if (!GeneratorOptions.generateObsidianPlatform()) { info.cancel(); } } diff --git a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java index 2a0b2a48..3a4ab11a 100644 --- a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java +++ b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java @@ -14,6 +14,7 @@ public class GeneratorOptions { private static boolean newGenerator; private static boolean noRingVoid; private static boolean generateCentralIsland; + private static boolean generateObsidianPlatform; private static int endCityFailChance; public static void init() { @@ -29,6 +30,7 @@ public class GeneratorOptions { noRingVoid = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "noRingVoid", false); generateCentralIsland = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "generateCentralIsland", false); endCityFailChance = Configs.GENERATOR_CONFIG.getInt("customGenerator", "endCityFailChance", 5); + generateObsidianPlatform = Configs.GENERATOR_CONFIG.getBooleanRoot("generateObsidianPlatform", true); } public static int getBiomeSizeLand() { @@ -75,6 +77,10 @@ public class GeneratorOptions { return generateCentralIsland; } + public static boolean generateObsidianPlatform() { + return generateObsidianPlatform; + } + public static int getEndCityFailChance() { return endCityFailChance; } From 5314e4823a8eda183b035eecff92caddcd52340a Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 22 Jan 2021 13:51:36 +0300 Subject: [PATCH 211/463] Stairs & slabs --- .../java/ru/betterend/blocks/complex/MetalMaterial.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index 56a6d8c6..51cb2054 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -13,6 +13,8 @@ import ru.betterend.blocks.basis.EndAnvilBlock; import ru.betterend.blocks.basis.EndChainBlock; import ru.betterend.blocks.basis.EndDoorBlock; import ru.betterend.blocks.basis.EndMetalPaneBlock; +import ru.betterend.blocks.basis.EndSlabBlock; +import ru.betterend.blocks.basis.EndStairsBlock; import ru.betterend.blocks.basis.EndTrapdoorBlock; import ru.betterend.blocks.basis.EndWoodenPlateBlock; import ru.betterend.item.EndAxeItem; @@ -37,6 +39,8 @@ public class MetalMaterial { public final Block trapdoor; public final Block anvil; public final Block chain; + public final Block stairs; + public final Block slab; public final Item ingot; public final Item shovel; @@ -57,6 +61,8 @@ public class MetalMaterial { trapdoor = EndBlocks.registerBlock(name + "_trapdoor", new EndTrapdoorBlock(block)); anvil = EndBlocks.registerBlock(name + "_anvil", new EndAnvilBlock(color)); chain = EndBlocks.registerBlock(name + "_chain", new EndChainBlock(color)); + stairs = EndBlocks.registerBlock(name + "_stairs", new EndStairsBlock(tile)); + slab = EndBlocks.registerBlock(name + "_slab", new EndSlabBlock(tile)); ingot = EndItems.registerItem(name + "_ingot"); shovel = EndItems.registerTool(name + "_shovel", new EndShovelItem(material, 1.0F, -3.0F, EndItems.makeItemSettings())); From 6f40eae64643270f2abe32faf859c0dc1a72f675 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 22 Jan 2021 20:51:32 +0300 Subject: [PATCH 212/463] Fixes --- .../java/ru/betterend/blocks/complex/MetalMaterial.java | 6 +++--- .../java/ru/betterend/item/material/EndToolMaterial.java | 2 +- src/main/resources/assets/betterend/lang/en_us.json | 7 ++++++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index 51cb2054..0f8a3fbf 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -65,10 +65,10 @@ public class MetalMaterial { slab = EndBlocks.registerBlock(name + "_slab", new EndSlabBlock(tile)); ingot = EndItems.registerItem(name + "_ingot"); - shovel = EndItems.registerTool(name + "_shovel", new EndShovelItem(material, 1.0F, -3.0F, EndItems.makeItemSettings())); - sword = EndItems.registerTool(name + "_sword", new EndSwordItem(material, 2, -2.4F, EndItems.makeItemSettings())); + shovel = EndItems.registerTool(name + "_shovel", new EndShovelItem(material, 1.5F, -3.0F, EndItems.makeItemSettings())); + sword = EndItems.registerTool(name + "_sword", new EndSwordItem(material, 3, -2.4F, EndItems.makeItemSettings())); pickaxe = EndItems.registerTool(name + "_pickaxe", new EndPickaxeItem(material, 1, -2.8F, EndItems.makeItemSettings())); - axe = EndItems.registerTool(name + "_axe", new EndAxeItem(material, 5.0F, -3.0F, EndItems.makeItemSettings())); + axe = EndItems.registerTool(name + "_axe", new EndAxeItem(material, 6.0F, -3.0F, EndItems.makeItemSettings())); hoe = EndItems.registerTool(name + "_hoe", new EndHoeItem(material, -3, 0.0F, EndItems.makeItemSettings())); FurnaceRecipe.make("thallasium_ingot_furnace", ore, ingot).build(); diff --git a/src/main/java/ru/betterend/item/material/EndToolMaterial.java b/src/main/java/ru/betterend/item/material/EndToolMaterial.java index 4302dfaa..5724307b 100644 --- a/src/main/java/ru/betterend/item/material/EndToolMaterial.java +++ b/src/main/java/ru/betterend/item/material/EndToolMaterial.java @@ -8,7 +8,7 @@ import net.minecraft.util.Lazy; import ru.betterend.registry.EndItems; public enum EndToolMaterial implements ToolMaterial { - THALLASIUM(2, 320, 6.5F, 4.5F, 13, () -> { + THALLASIUM(2, 320, 7.0F, 1.5F, 12, () -> { return Ingredient.ofItems(EndItems.AETERNIUM_INGOT); }), TERMINITE(3, 1230, 8.5F, 3.0F, 14, () -> { diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 79e32b8a..f77ae1b5 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -593,5 +593,10 @@ "block.betterend.lumecorn_seed": "Lumecorn Seed", "item.betterend.lumecorn_rod": "Lumecorn Rod", - "block.betterend.thallasium_chandelier": "Thallasium Chandelier" + "block.betterend.thallasium_chandelier": "Thallasium Chandelier", + + "block.betterend.thallasium_anvil": "Thallasium Anvil", + "block.betterend.thallasium_chain": "Thallasium Chain", + "block.betterend.thallasium_slab": "Thallasium Slab", + "block.betterend.thallasium_stairs": "Thallasium Stairs" } From c9aacbff2b91440a04d61676a3d99aadedf08810 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 22 Jan 2021 21:37:17 +0300 Subject: [PATCH 213/463] Texture, lang & shader update --- .../blocks/complex/MetalMaterial.java | 16 +++++---- .../assets/betterend/lang/ru_ru.json | 7 +++- .../block/thallasium_chandelier.json | 2 +- .../item/thallasium_chandelier.json | 1 + .../betterend/materials/glow_green.json | 8 +++++ .../block/thallasium_chandelier_wall.json | 32 +++++++++--------- .../shaders/material/glow_green.frag | 9 +++++ .../textures/block/thallasium_bars_top.png | Bin 170 -> 258 bytes .../textures/block/thallasium_chandelier.png | Bin 346 -> 539 bytes .../block/thallasium_chandelier_ceil.png | Bin 240 -> 348 bytes .../block/thallasium_chandelier_wall.png | Bin 245 -> 394 bytes .../textures/item/thallasium_axe.png | Bin 224 -> 424 bytes .../item/thallasium_chandelier_item.png | Bin 0 -> 399 bytes .../textures/item/thallasium_door.png | Bin 272 -> 407 bytes .../textures/item/thallasium_hoe.png | Bin 221 -> 371 bytes .../textures/item/thallasium_pickaxe.png | Bin 262 -> 417 bytes .../textures/item/thallasium_shovel.png | Bin 202 -> 392 bytes .../textures/item/thallasium_sword.png | Bin 258 -> 442 bytes 18 files changed, 50 insertions(+), 25 deletions(-) create mode 100644 src/main/resources/assets/betterend/materialmaps/item/thallasium_chandelier.json create mode 100644 src/main/resources/assets/betterend/materials/glow_green.json create mode 100644 src/main/resources/assets/betterend/shaders/material/glow_green.frag create mode 100644 src/main/resources/assets/betterend/textures/item/thallasium_chandelier_item.png diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index 0f8a3fbf..29d2e49e 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -74,14 +74,16 @@ public class MetalMaterial { FurnaceRecipe.make("thallasium_ingot_furnace", ore, ingot).build(); AlloyingRecipe.Builder.create("thallasium_ingot").setInput(ore, ore).setOutput(ingot, 3).setExpiriense(2.1F).build(); - GridRecipe.make(name + "_block", block).setShape("###", "###", "###").addMaterial('#', ingot).build(); - GridRecipe.make(name + "_ingot_from_block", ingot).setOutputCount(9).setList("#").addMaterial('#', block).build(); + GridRecipe.make(name + "_block", block).setShape("###", "###", "###").addMaterial('#', ingot).setGroup("end_metal_blocks").build(); + GridRecipe.make(name + "_ingot_from_block", ingot).setOutputCount(9).setList("#").addMaterial('#', block).setGroup("end_metal_ingots").build(); - GridRecipe.make(name + "_tile", tile).setOutputCount(4).setShape("##", "##").addMaterial('#', block).build(); - GridRecipe.make(name + "_bars", bars).setOutputCount(16).setShape("###", "###").addMaterial('#', ingot).build(); - GridRecipe.make(name + "_plate", plate).setShape("##").addMaterial('#', ingot).build(); - GridRecipe.make(name + "_door", door).setOutputCount(3).setOutputCount(16).setShape("##", "##", "##").addMaterial('#', ingot).build(); - GridRecipe.make(name + "_trapdoor", trapdoor).setShape("##", "##").addMaterial('#', ingot).build(); + GridRecipe.make(name + "_tile", tile).setOutputCount(4).setShape("##", "##").addMaterial('#', block).setGroup("end_metal_tiles").build(); + GridRecipe.make(name + "_bars", bars).setOutputCount(16).setShape("###", "###").addMaterial('#', ingot).setGroup("end_metal_bars").build(); + GridRecipe.make(name + "_plate", plate).setShape("##").addMaterial('#', ingot).setGroup("end_metal_plates").build(); + GridRecipe.make(name + "_door", door).setOutputCount(3).setOutputCount(16).setShape("##", "##", "##").addMaterial('#', ingot).setGroup("end_metal_doors").build(); + GridRecipe.make(name + "_trapdoor", trapdoor).setShape("##", "##").addMaterial('#', ingot).setGroup("end_metal_trapdoors").build(); + GridRecipe.make(name + "_stairs", stairs).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', block).setGroup("end_metal_stairs").build(); + GridRecipe.make(name + "_slab", slab).setOutputCount(6).setShape("###").addMaterial('#', block).setGroup("end_metal_slabs").build(); GridRecipe.make(name + "_axe", axe).setShape("##", "#I", " I").addMaterial('#', ingot).addMaterial('I', Items.STICK).build(); GridRecipe.make(name + "_hoe", hoe).setShape("##", " I", " I").addMaterial('#', ingot).addMaterial('I', Items.STICK).build(); diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 76f0b583..a1b1774c 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -595,5 +595,10 @@ "block.betterend.lumecorn_seed": "Семя люмекорна", "item.betterend.lumecorn_rod": "Стержень люмекорна", - "block.betterend.thallasium_chandelier": "Талласиевый канделябр" + "block.betterend.thallasium_chandelier": "Талласиевый канделябр", + + "block.betterend.thallasium_anvil": "Талласиевая наковальня", + "block.betterend.thallasium_chain": "Талласиевая цепь", + "block.betterend.thallasium_slab": "Талласиевая плита", + "block.betterend.thallasium_stairs": "Талласиевые ступени" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_chandelier.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_chandelier.json index fde436df..73a05561 100644 --- a/src/main/resources/assets/betterend/materialmaps/block/thallasium_chandelier.json +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_chandelier.json @@ -1,3 +1,3 @@ { - "defaultMaterial": "betterend:glow_65" + "defaultMaterial": "betterend:glow_green" } diff --git a/src/main/resources/assets/betterend/materialmaps/item/thallasium_chandelier.json b/src/main/resources/assets/betterend/materialmaps/item/thallasium_chandelier.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/thallasium_chandelier.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materials/glow_green.json b/src/main/resources/assets/betterend/materials/glow_green.json new file mode 100644 index 00000000..382bc183 --- /dev/null +++ b/src/main/resources/assets/betterend/materials/glow_green.json @@ -0,0 +1,8 @@ +{ + "layers": [ + { + "vertexSource": "canvas:shaders/material/default.vert", + "fragmentSource": "betterend:shaders/material/glow_green.frag" + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/thallasium_chandelier_wall.json b/src/main/resources/assets/betterend/models/block/thallasium_chandelier_wall.json index 83efb04a..b3a77432 100644 --- a/src/main/resources/assets/betterend/models/block/thallasium_chandelier_wall.json +++ b/src/main/resources/assets/betterend/models/block/thallasium_chandelier_wall.json @@ -30,8 +30,8 @@ }, { "__comment": "Box4", - "from": [ 2, 6, 1 ], - "to": [ 4, 9, 3 ], + "from": [ 3, 6, 1 ], + "to": [ 5, 9, 3 ], "faces": { "down": { "uv": [ 0, 12, 2, 14 ], "texture": "#texture" }, "up": { "uv": [ 0, 12, 2, 14 ], "texture": "#texture" }, @@ -43,8 +43,8 @@ }, { "__comment": "Box4", - "from": [ 12, 6, 1 ], - "to": [ 14, 9, 3 ], + "from": [ 11, 6, 1 ], + "to": [ 13, 9, 3 ], "faces": { "down": { "uv": [ 0, 12, 2, 14 ], "texture": "#texture" }, "up": { "uv": [ 0, 12, 2, 14 ], "texture": "#texture" }, @@ -56,9 +56,9 @@ }, { "__comment": "PlaneX6", - "from": [ 1, 9, 0 ], - "to": [ 1.001, 15, 5.5 ], - "rotation": { "origin": [ 1, 9, 0 ], "axis": "y", "angle": 45 }, + "from": [ 2, 9, 0 ], + "to": [ 2.001, 15, 5.5 ], + "rotation": { "origin": [ 2, 9, 0 ], "axis": "y", "angle": 45 }, "shade": false, "faces": { "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, @@ -67,9 +67,9 @@ }, { "__comment": "PlaneX6", - "from": [ 5, 9, 0 ], - "to": [ 5.001, 15, 5.5 ], - "rotation": { "origin": [ 5, 9, 0 ], "axis": "y", "angle": -45 }, + "from": [ 6, 9, 0 ], + "to": [ 6.001, 15, 5.5 ], + "rotation": { "origin": [ 6, 9, 0 ], "axis": "y", "angle": -45 }, "shade": false, "faces": { "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, @@ -78,9 +78,9 @@ }, { "__comment": "PlaneX6", - "from": [ 11, 9, 0 ], - "to": [ 11.001, 15, 5.5 ], - "rotation": { "origin": [ 11, 9, 0 ], "axis": "y", "angle": 45 }, + "from": [ 10, 9, 0 ], + "to": [ 10.001, 15, 5.5 ], + "rotation": { "origin": [ 10, 9, 0 ], "axis": "y", "angle": 45 }, "shade": false, "faces": { "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, @@ -89,9 +89,9 @@ }, { "__comment": "PlaneX6", - "from": [ 15, 9, 0 ], - "to": [ 15.001, 15, 5.5 ], - "rotation": { "origin": [ 15, 9, 0 ], "axis": "y", "angle": -45 }, + "from": [ 14, 9, 0 ], + "to": [ 14.001, 15, 5.5 ], + "rotation": { "origin": [ 14, 9, 0 ], "axis": "y", "angle": -45 }, "shade": false, "faces": { "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, diff --git a/src/main/resources/assets/betterend/shaders/material/glow_green.frag b/src/main/resources/assets/betterend/shaders/material/glow_green.frag new file mode 100644 index 00000000..67bfbc03 --- /dev/null +++ b/src/main/resources/assets/betterend/shaders/material/glow_green.frag @@ -0,0 +1,9 @@ +#include frex:shaders/api/fragment.glsl +#include frex:shaders/lib/math.glsl + +void frx_startFragment(inout frx_FragmentData fragData) { + float a = abs(fragData.spriteColor.g - fragData.spriteColor.r); + float b = abs(fragData.spriteColor.g - fragData.spriteColor.b); + float l = frx_luminance(fragData.spriteColor.rgb); + fragData.emissivity = ((l > 0.9) || (a > 0.1 && b > 0.1 && fragData.spriteColor.g > 0.5)) ? 1 : 0; +} diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_bars_top.png b/src/main/resources/assets/betterend/textures/block/thallasium_bars_top.png index fba8e1a81e3e41753feac57fc185ec01cde3b322..9036f5cae9adf0c6b5893071b09fd67db565592e 100644 GIT binary patch delta 230 zcmVpFmq|oHR5(v#zz1Art^W_gP%c)$1f{WpA0Iw4yt{oD%EJ!u8u0D) z8-`E!?m&6i0bT>RL`9%1+yJiu!~lW@u<;8(S=a%=FdzgNVPDY%3TXD@%q_r*@yX!@Mx{OfRf03fPe>yq8u1zciYh4!b0`lx gz-s{E+{nNH08DB|r6%I3qW}N^07*qoM6N<$f_s5i82|tP delta 142 zcmV;90CE3<0;&O!B!6*9L_t(|+GAkA0~}h`{I{xF^q+xT0McxdGl_fyK$2ACJl_^%UPJAf_#89>klu&4qB7|6*WHi$-MgJ@)NkXm>Y!!(0J8{}M&jWCRj w55gd|L`5;kHrj^)O%0&f3lt}1y5vRx*U^KoUI54`00000Ne4wvM6N<$f<)^$GXMYp diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_chandelier.png b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier.png index a31edede51bb3019df894525ee99967a2e3c6fe4..04fc62d37ec0a673f670833c197ccca8f0631693 100644 GIT binary patch delta 514 zcmV+d0{#8k0-FSoBYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D0kBC#K~y+Tm6A;_LqQaVXD$gvHQEUAv8Yr?rIiqZorb-I#19a) z@gLO2A7G=w#!A}60y}IZDiwePYeC0-&o$S*(SIg9$-QUJnfILeIK!t7 zW5QEk%0Toi&6a!vrr2a-2d9CG5Q1ztxi3cTeH2$93~ipX)yO?-YOW#yV(^b2KFBwM zWLH@oS@_Cb_LJr9R+>z_Xe(eRZf7marQgVxAgRaZVm0Mf1`D5$@9YVSt&#*tz!AtP zKqwKR0+NGtoPR0UHn!}j=1dkUMk<$JsrQUFRxSLZs}&-6vjHP&EDlOm;r}WCWG5tg zf$57Qnwe?!aw!VLk7*Eac}U0A^`uUZ;RhCOPiO)iko30MsFlWUAO`#mZgT-V9tf}E zk9u33_6o9>$t+nVnPKhSEmUxEu%B|Z=caOc`Al|uVtYiZtZvsA-V#XiN1}Xed6r^% zHAcd3^c_fy=WnPeVR&eGU~^qwHUCF0bqf6rK!oq+`jzfuH}<6Ot`NTpNQPI|Iqrjw zu(@qo{mk^lez delta 320 zcmV-G0l)s61lj_SBYy!QNkl3-r5QX<2rAi|K30z^5E-5Y2rAZyMvCtx< z3pSD_Vv#`7h}Z~%jUc2EQlu1%bRnIkFy1%#j^j=*nt^5C&dqyoX7|F);L|QT6T5nz zTJ$im5J#!r^Bj9fg_-$!|D9R990v*^vR7X}oFL4e6@WZnEq@R&7r&f%Dd2`+*&JLjWAFQJvh-T2GL0H4*mc6!@R zzJketsi8I}z=zB3%qou~id}@<_Ut(@HRN*wDg;OOeJAKC!Q|8(wK;)woHyV63vMUZ zElcOJcd;{Y(K$G3TiqQbpph7X3k2_bjl#fr-`{zVfI9e>08dqJy!a&+jj#ccwrt-Q SH^?Ud0000pF@kvBMR5(v#WWWJ(&R+a4%*V(e#l_6n)?6$e};xTm;b|TfBWe_!(<~pMj(KyKmaBv&3{mT`_g|9hH@F6JpRIP z>gGp=!xvvMT)Y1oDvGHNZsg3TSHXfSk3R?VncjT{(=hN)h!;$UTS|iIbZKp{UbqV` zzxV^TabJiF%d&2Y?K*D49*3 zW)Se5vH!nS)gs~yDBp7p>|_wzrg8z;=^z6@E&#DXVjww?8jxBH13(fWCwolX2~rF; z1jGlq0K^7~f#hIegJA$vBUr+vV*^+N%mpAeNDSsWkXpRnaZPMq^&b|9`iU)YjYJ0? z%=sXjV9q8v20$7?UH}CkK_}x&2Si6Bwpg*RUj_~XvRwc&glx?t2mkpGA4x<(R5(v#AO-yY{~wH3zda75AZ#Y69MNFSyA%Ia*u}v#h|dTX zB@%#aHsx1=@)#ISf4oDw3(x^c2E70Nmf`)6&k#0{2JuPq!hftMTR_x*K~7`p+=g2;xNy7l6C~3kPKI z7BvmImr%oQXVFzd+{ux1zr@kuoRYzW9^5Dns!3}7(o^*LoooPIb;E9Xu5Q4_z%pGJxN4CR5(v#{Qv(y10{e7O2fg*q$(&20W2D4{Rd&|>cvnI1i&x= z9e^~>sPtq2;lFI(F`SFn0GQ^h?|*o0r$chC&SUw|_rj2w8fOacNr7|qBofEz#_U|;|M)EKJFGKaUn00000Ne4wvM6N<$f*hNmaR2}S delta 196 zcmV;#06YJv1K#9KHjl{fxQ(7y1hQCuo3*M;cr+hz&9zWWjMTUtNOfKQS%<8v?}) zAe)g50f`fG0UX1e4YC(vOUdkK^bv4#%lmp&BPjj y>}&=c0B0=Vw3!$Kh_M;30U(XUXvS#(xflTY@%ALNGX5q20000H& diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_chandelier_item.png b/src/main/resources/assets/betterend/textures/item/thallasium_chandelier_item.png new file mode 100644 index 0000000000000000000000000000000000000000..77827afc5ec5af381c6c649ae61a120022f7f6f6 GIT binary patch literal 399 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc4Jw{4jv*HQ$$$R;w`W#u;Pjfzdw|Wr$f(J3 z3BwFI5%Dv1yT1OPRjz)Zj!Dzu*o#jF4G&pG%L>^RC~5EuFF1Xemtkg()`Fu7Ck}Ey zN@~&3tK7l(e*gYf&!(F%7^d4;NIBNc`I^Gr!Ea_6dQ1Av%Qoxj2mi2%#u~_ruqjA! zNL)^-kvLG5$kuS+%<}O6@pT{DAKvufvK;upWVB*`?aTcl;>L$J=hsW#tNX=YZe|1$ulV$X`-XSB{ywI5PCo`CR&j>P pgQ?f5=5Vce#JYj;2{RiTLsQ5$0WbEBGr&M(@O1TaS?83{1ORTqnlAtV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_door.png b/src/main/resources/assets/betterend/textures/item/thallasium_door.png index 914279d1eec411dc90a61e927b1412d6ecaa9408..b06c0796cd2978e9a29be1b192baada3d9cd38e3 100644 GIT binary patch delta 380 zcmV-?0fYXK0+$1jB!2;OQb$4nuFf3k00004XF*Lt006O%3;baP00009a7bBm000id z000id0mpBsWB>pGEJ;K`R5(v#7;wM{rQyJ7&7S`tn(5tVFdrT4Nee{L!vv*KfT9o= zgSDeFL#VeJnAR{>Vvtu6XZZ2qBUA+fU^Re~pPS+E#a9d~kAFW0)7S35hRR?9tOf}4 zF*3Z^wuj-@y(eHAgh7UWd;JEg0s*iZAjQSZaCL4w*sm}eWGFU()qrQ;{xaBhF9ZiB zh!)b&02_)8U^U?Fr~eFxOXI;-g6MZQZZKSa@dqr24loP=Mc?<2Um2X&?)}fEBm<@; zyj-BNm;kE_Ky?8I0=D{M4B?iNU^Yo%08c2zdivJm#F8%kIxbuI_;XD6B799WY zH}e2koS*?lsU2|5AlkEU3s^IV4Z;KsFw2_+)@)lfAFLT9=GeRv%m*1nlmQ@TgERmE zSPVpi_#lG`8UXSq$j>kXU>L+F+6yp0JGZX~W2>q~q=f-YGi}HqSYYbKH4x_okO3es zfNVvMMvws{#R3R}G{G>@UH}Cm%-QH+KvFb<3;}6?c|j|r1WXeh1~6B^*hGf`C@I6D u5u^!ZGYG>BBPlb13<7C_X$E-*T|EG|cN^VFU-3%-0000pG2uVaiR5(v#{Qv(y10?{j0Tzw3;F8S0I2n(&#zJ`v3@ekW7{ceZ zF)%^-7yzVsMx`f1ZiXX6P^=BZU$*c6t*aM9Wf1_U0U#TL0)J{4Y7<)+K79HMH^j?a z?0=@eJlthC4FCa2Ll;Ko{~U}fs(RptI2Z~s9JufnssfJzApgEPcLdA^8FC@r8EnXD z&lwCqwS&RpAV5?sfSfHa!3nk*q#0yji=;6AK!gF1W|*`8|N73zc76%tol`5IvIN2a zX7l{*Pr#a?!ciyyrvd0TLxmY`Jpaq^|LsR84~GG`YzApY2N(w6vl$yeF@O}CVE}Fb qsW!s^+<^NpzL8`z3{aSz85jVtj-8g{b?E2-0000C2kPVrdF8yC!f{CyJAPm(E#vq$P zhJ-9Q4t5n$2EZ`P*&v&t-h#^!r5WaIAZ7qz1|dG;3_!LSraGBu1F+c)!szNqvKgCN vvTep{04X+O7(lAc7zRK!lB5~K3*=w`kYI8Hoc2XD00000NkvXXu0mjf=Y3UM diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_pickaxe.png b/src/main/resources/assets/betterend/textures/item/thallasium_pickaxe.png index 7a2f2209dce5a4b9d0fb53fcdb6318b7bf67df14..537321d8ee2982a4e7eee68c65932523bf4fed51 100644 GIT binary patch delta 390 zcmV;10eSw00-*ztB!2;OQb$4nuFf3k00004XF*Lt006O%3;baP00009a7bBm000id z000id0mpBsWB>pGHc3Q5R5(v#{Qv(y10{e7N;9lXssdwdz`A-dl!Xacpfm=sXq<&` z8XK6;!2FAo@n~x-R1gAi8UO;h8IBCvf*epD14Bmp_WxeyVt)+s5}XXvH$G$piQxA>? zW&8ow)Gi^783u%G28BE*@IabDd=vxF{R|bx03g4^0Ne{On+a(K0gyLf0B(S$JP(*b kNHYw;3?Z11@B;=004La#)k~r;mjD0&07*qoM6N<$f($60)Bpeg delta 234 zcmVSB!A6GL_t(|+GF_t|33pI7^|RF)uR7sn0Ny~8m|2R^nc5%*Z*hT zcml@w48mpr*bo(uG%&6?dpG9Z5t%R5(v#{Qv(y10{e7N|Oypa)CwTEU@BNCyz2P|L0)5y?rJF z1IPekuzADG|L1=`0^`c_m;Nhy#sP)@6Xykx&AAzl47;9uW`9_9?E^!YmHx0Jv$ToBU((GU;#4vyR6NZqb7a5nfHT{R% z39YfEy6H@c@`% zx;+EzXKXeT^a3cF)=3r-bT%@88?f5nfpOo)<4_*)fTYZX2^bgvm^8PU3uW{$00000 LNkvXXu0mjfmn@vf delta 174 zcmV;f08#&l1IhuAB!7`fL_t(|+GF_t|33pIn1QYaSXC|h55g)QX&_9R0U(W6{(l1F zn!|U%h7fH4O!Jmkufdu@Y@!W7*9@Yu8h{G`4Pfvy=EBg75eB#bNb}Tm>Hq2yOei)J zWdO2fpbHpaHp4Jp13;P!eTBf9VPbgG0WO=7#fdTio6STS04LIj%Vwetz^9ogFMu?Y cZ2-9#08Dr(0AyfFD*ylh07*qoM6N<$f>mQi7ytkO diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_sword.png b/src/main/resources/assets/betterend/textures/item/thallasium_sword.png index 544cb1b2b53459c29e7bba6aa13a45bcc6ad5228..0683e273eb25b1d7f2ec06c9dcf625163fca3443 100644 GIT binary patch delta 416 zcmV;R0bl-t0=ff`B!2;OQb$4nuFf3k00004XF*Lt006O%3;baP00009a7bBm000id z000id0mpBsWB>pGPf0{UR5(v#{Qv(y1F0Z%;{muPCMZob0BH`ekY=d%RAzX5;TCBI zz%*+MaxkpA_5mzLv;pXv_ia4R@b<)6MxqQr*1YS29O~Fe1FW~fCISztOyH$djX``!BB|dz=gLAvI=^PAg6;gBLh{>bSMh}SS%W6 zft_Fow0ZvaCk!_peP#T!Vm^b4XE5XTJU6f+5SV@QDU^i@z%Bqecjs>hhCf=-U@w9E zdT0Auu#L4x?t(Ecz-Znu^Z%=pN5LHC{~Ykph5=+}V;Ke_0|Nkqp1;wO%_?&M0000< KMNUMnLSTZ07_VOd delta 230 zcmVHyOxy|92-1Y4`9C(zC Date: Fri, 22 Jan 2021 22:35:11 +0300 Subject: [PATCH 214/463] Activation function --- .../ru/betterend/blocks/InfusionPedestal.java | 5 ++++- .../betterend/blocks/basis/PedestalBlock.java | 20 +++++++++++++++++++ .../ru/betterend/rituals/InfusionRitual.java | 8 ++++++-- .../betterend/materials/glow_green.json | 4 +++- .../models/block/thallasium_chandelier.json | 1 + .../block/thallasium_chandelier_ceil.json | 1 + .../block/thallasium_chandelier_wall.json | 3 +++ 7 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/InfusionPedestal.java b/src/main/java/ru/betterend/blocks/InfusionPedestal.java index b10bbf5c..d8562937 100644 --- a/src/main/java/ru/betterend/blocks/InfusionPedestal.java +++ b/src/main/java/ru/betterend/blocks/InfusionPedestal.java @@ -43,7 +43,10 @@ public class InfusionPedestal extends PedestalBlock { } } } - ActionResult result = super.onUse(state, world, pos, player, hand, hit); + ActionResult result = ActionResult.FAIL; + if (hand != null) { + result = super.onUse(state, world, pos, player, hand, hit); + } if (result == ActionResult.SUCCESS) { if (pedestal != null) { if (pedestal.hasRitual()) { diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index c1011797..787313ab 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -1,5 +1,6 @@ package ru.betterend.blocks.basis; +import java.awt.Point; import java.io.Reader; import java.util.HashMap; import java.util.List; @@ -29,6 +30,7 @@ import net.minecraft.util.Hand; import net.minecraft.util.Identifier; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockPos.Mutable; import net.minecraft.util.math.Direction; import net.minecraft.util.registry.Registry; import net.minecraft.util.shape.VoxelShape; @@ -38,9 +40,11 @@ import net.minecraft.world.World; import net.minecraft.world.WorldAccess; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.PedestalState; +import ru.betterend.blocks.InfusionPedestal; import ru.betterend.blocks.entities.PedestalBlockEntity; import ru.betterend.patterns.Patterns; import ru.betterend.registry.EndBlocks; +import ru.betterend.rituals.InfusionRitual; import ru.betterend.util.BlocksHelper; public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvider { @@ -110,6 +114,7 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid ItemStack itemStack = player.getStackInHand(hand); if (itemStack.isEmpty()) return ActionResult.CONSUME; pedestal.setStack(0, itemStack.split(1)); + activate(world, pos, player, hand, hit); return ActionResult.SUCCESS; } else { ItemStack itemStack = pedestal.getStack(0); @@ -123,6 +128,21 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid return ActionResult.PASS; } + private void activate(World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + Mutable mut = new Mutable(); + Point[] points = InfusionRitual.getMap(); + for (Point p: points) { + mut.set(pos).move(p.x, 0, p.y); + BlockState state = world.getBlockState(mut); + if (state.getBlock() instanceof InfusionPedestal) { + ActionResult result = state.getBlock().onUse(state, world, mut, player, null, hit); + if (result == ActionResult.SUCCESS) { + break; + } + } + } + } + @Override @Nullable public BlockState getPlacementState(ItemPlacementContext context) { diff --git a/src/main/java/ru/betterend/rituals/InfusionRitual.java b/src/main/java/ru/betterend/rituals/InfusionRitual.java index 85bb4384..dbe24bd5 100644 --- a/src/main/java/ru/betterend/rituals/InfusionRitual.java +++ b/src/main/java/ru/betterend/rituals/InfusionRitual.java @@ -18,7 +18,7 @@ import ru.betterend.particle.InfusionParticleType; import ru.betterend.recipe.builders.InfusionRecipe; public class InfusionRitual implements Inventory { - private static Point[] pedestalsMap = new Point[] { + private static final Point[] PEDESTALS_MAP = new Point[] { new Point(0, 3), new Point(2, 2), new Point(3, 0), new Point(2, -2), new Point(0, -3), new Point(-2, -2), new Point(-3, 0), new Point(-2, 2) }; @@ -40,6 +40,10 @@ public class InfusionRitual implements Inventory { this.configure(); } + public static Point[] getMap() { + return PEDESTALS_MAP; + } + public void configure() { if (world == null || world.isClient || worldPos == null) return; BlockEntity inputEntity = world.getBlockEntity(worldPos); @@ -47,7 +51,7 @@ public class InfusionRitual implements Inventory { this.input = (InfusionPedestalEntity) inputEntity; } int i = 0; - for(Point point : pedestalsMap) { + for(Point point : PEDESTALS_MAP) { BlockPos.Mutable checkPos = worldPos.mutableCopy().move(Direction.EAST, point.x).move(Direction.NORTH, point.y); BlockEntity catalystEntity = world.getBlockEntity(checkPos); if (catalystEntity instanceof PedestalBlockEntity) { diff --git a/src/main/resources/assets/betterend/materials/glow_green.json b/src/main/resources/assets/betterend/materials/glow_green.json index 382bc183..952f0717 100644 --- a/src/main/resources/assets/betterend/materials/glow_green.json +++ b/src/main/resources/assets/betterend/materials/glow_green.json @@ -2,7 +2,9 @@ "layers": [ { "vertexSource": "canvas:shaders/material/default.vert", - "fragmentSource": "betterend:shaders/material/glow_green.frag" + "fragmentSource": "betterend:shaders/material/glow_green.frag", + "disableAo": true, + "disableDiffuse": true } ] } diff --git a/src/main/resources/assets/betterend/models/block/thallasium_chandelier.json b/src/main/resources/assets/betterend/models/block/thallasium_chandelier.json index cf862ca5..b9e009da 100644 --- a/src/main/resources/assets/betterend/models/block/thallasium_chandelier.json +++ b/src/main/resources/assets/betterend/models/block/thallasium_chandelier.json @@ -9,6 +9,7 @@ "__comment": "Box1", "from": [ 6, 0, 6 ], "to": [ 10, 1, 10 ], + "shade": false, "faces": { "down": { "uv": [ 0, 0, 4, 4 ], "texture": "#texture" }, "up": { "uv": [ 0, 0, 4, 4 ], "texture": "#texture" }, diff --git a/src/main/resources/assets/betterend/models/block/thallasium_chandelier_ceil.json b/src/main/resources/assets/betterend/models/block/thallasium_chandelier_ceil.json index fdd8c61b..91576939 100644 --- a/src/main/resources/assets/betterend/models/block/thallasium_chandelier_ceil.json +++ b/src/main/resources/assets/betterend/models/block/thallasium_chandelier_ceil.json @@ -10,6 +10,7 @@ "__comment": "Box1", "from": [ 6, 15, 6 ], "to": [ 10, 16, 10 ], + "shade": false, "faces": { "down": { "uv": [ 0, 0, 4, 4 ], "texture": "#rod" }, "up": { "uv": [ 0, 0, 4, 4 ], "texture": "#rod" }, diff --git a/src/main/resources/assets/betterend/models/block/thallasium_chandelier_wall.json b/src/main/resources/assets/betterend/models/block/thallasium_chandelier_wall.json index b3a77432..9fb3d09b 100644 --- a/src/main/resources/assets/betterend/models/block/thallasium_chandelier_wall.json +++ b/src/main/resources/assets/betterend/models/block/thallasium_chandelier_wall.json @@ -19,6 +19,7 @@ "__comment": "Box3", "from": [ 7, 3, 0 ], "to": [ 9, 5, 3 ], + "shade": false, "faces": { "down": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, "up": { "uv": [ 0, 11, 2, 8 ], "texture": "#texture" }, @@ -32,6 +33,7 @@ "__comment": "Box4", "from": [ 3, 6, 1 ], "to": [ 5, 9, 3 ], + "shade": false, "faces": { "down": { "uv": [ 0, 12, 2, 14 ], "texture": "#texture" }, "up": { "uv": [ 0, 12, 2, 14 ], "texture": "#texture" }, @@ -45,6 +47,7 @@ "__comment": "Box4", "from": [ 11, 6, 1 ], "to": [ 13, 9, 3 ], + "shade": false, "faces": { "down": { "uv": [ 0, 12, 2, 14 ], "texture": "#texture" }, "up": { "uv": [ 0, 12, 2, 14 ], "texture": "#texture" }, From bca09946521430b9d44d8a4683c6b703352f182f Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 22 Jan 2021 22:52:18 +0300 Subject: [PATCH 215/463] Optimisation --- src/main/java/ru/betterend/blocks/basis/PedestalBlock.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index 787313ab..b4402901 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -114,7 +114,9 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid ItemStack itemStack = player.getStackInHand(hand); if (itemStack.isEmpty()) return ActionResult.CONSUME; pedestal.setStack(0, itemStack.split(1)); - activate(world, pos, player, hand, hit); + if (!(this instanceof InfusionPedestal)) { + activate(world, pos, player, hit); + } return ActionResult.SUCCESS; } else { ItemStack itemStack = pedestal.getStack(0); @@ -128,7 +130,7 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid return ActionResult.PASS; } - private void activate(World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + private void activate(World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) { Mutable mut = new Mutable(); Point[] points = InfusionRitual.getMap(); for (Point p: points) { From 7d178dedb07f3a040236532c8ca23b16bb3b1161 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 22 Jan 2021 23:08:08 +0300 Subject: [PATCH 216/463] Function optimisation --- src/main/java/ru/betterend/blocks/EternalPedestal.java | 3 +++ src/main/java/ru/betterend/blocks/InfusionPedestal.java | 3 +++ src/main/java/ru/betterend/blocks/basis/PedestalBlock.java | 6 ++---- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/EternalPedestal.java b/src/main/java/ru/betterend/blocks/EternalPedestal.java index deef385c..b64b05be 100644 --- a/src/main/java/ru/betterend/blocks/EternalPedestal.java +++ b/src/main/java/ru/betterend/blocks/EternalPedestal.java @@ -68,6 +68,9 @@ public class EternalPedestal extends PedestalBlock { return result; } + @Override + protected void activate(World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) {} + @Override public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState newState, WorldAccess world, BlockPos pos, BlockPos posFrom) { BlockState updated = super.getStateForNeighborUpdate(state, direction, newState, world, pos, posFrom); diff --git a/src/main/java/ru/betterend/blocks/InfusionPedestal.java b/src/main/java/ru/betterend/blocks/InfusionPedestal.java index d8562937..0e57bb94 100644 --- a/src/main/java/ru/betterend/blocks/InfusionPedestal.java +++ b/src/main/java/ru/betterend/blocks/InfusionPedestal.java @@ -61,6 +61,9 @@ public class InfusionPedestal extends PedestalBlock { return result; } + @Override + protected void activate(World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) {} + @Override public BlockEntity createBlockEntity(BlockView world) { return new InfusionPedestalEntity(); diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index b4402901..1cc317c9 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -114,9 +114,7 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid ItemStack itemStack = player.getStackInHand(hand); if (itemStack.isEmpty()) return ActionResult.CONSUME; pedestal.setStack(0, itemStack.split(1)); - if (!(this instanceof InfusionPedestal)) { - activate(world, pos, player, hit); - } + activate(world, pos, player, hit); return ActionResult.SUCCESS; } else { ItemStack itemStack = pedestal.getStack(0); @@ -130,7 +128,7 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid return ActionResult.PASS; } - private void activate(World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) { + protected void activate(World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) { Mutable mut = new Mutable(); Point[] points = InfusionRitual.getMap(); for (Point p: points) { From f62f88e4bd5cd4dce755dbebea3117855733097c Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 23 Jan 2021 01:37:52 +0300 Subject: [PATCH 217/463] Water color option, disabling color if sodium is installed --- .../ru/betterend/client/ClientOptions.java | 20 +++++- .../mixin/client/BiomeColorsMixin.java | 63 ++++++++++--------- 2 files changed, 50 insertions(+), 33 deletions(-) diff --git a/src/main/java/ru/betterend/client/ClientOptions.java b/src/main/java/ru/betterend/client/ClientOptions.java index de13c4ec..e17b3c5d 100644 --- a/src/main/java/ru/betterend/client/ClientOptions.java +++ b/src/main/java/ru/betterend/client/ClientOptions.java @@ -1,16 +1,22 @@ package ru.betterend.client; +import net.fabricmc.loader.api.FabricLoader; import ru.betterend.config.Configs; public class ClientOptions { private static boolean customSky; private static boolean useFogDensity; private static boolean blendBiomeMusic; + private static boolean sulfurWaterColor; public static void init() { - setCustomSky(Configs.CLENT_CONFIG.getBooleanRoot("customSky", true)); - setUseFogDensity(Configs.CLENT_CONFIG.getBooleanRoot("useFogDensity", true)); - setBlendBiomeMusic(Configs.CLENT_CONFIG.getBooleanRoot("blendBiomeMusic", true)); + customSky = Configs.CLENT_CONFIG.getBooleanRoot("customSky", true); + useFogDensity = Configs.CLENT_CONFIG.getBooleanRoot("useFogDensity", true); + blendBiomeMusic = Configs.CLENT_CONFIG.getBooleanRoot("blendBiomeMusic", true); + sulfurWaterColor = Configs.CLENT_CONFIG.getBooleanRoot("sulfurWaterColor", true); + if (sulfurWaterColor) { + sulfurWaterColor = !FabricLoader.getInstance().isModLoaded("sodium"); + } Configs.CLENT_CONFIG.saveChanges(); } @@ -37,4 +43,12 @@ public class ClientOptions { public static void setBlendBiomeMusic(boolean blendBiomeMusic) { ClientOptions.blendBiomeMusic = blendBiomeMusic; } + + public static boolean useSulfurWaterColor() { + return sulfurWaterColor; + } + + public static void setSulfurWaterColor(boolean sulfurWaterColor) { + ClientOptions.sulfurWaterColor = sulfurWaterColor && !FabricLoader.getInstance().isModLoaded("sodium"); + } } diff --git a/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java b/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java index 15bc3b69..195ca679 100644 --- a/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java +++ b/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java @@ -10,6 +10,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos.Mutable; import net.minecraft.util.math.Direction; import net.minecraft.world.BlockRenderView; +import ru.betterend.client.ClientOptions; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; @@ -21,41 +22,43 @@ public class BiomeColorsMixin { @Inject(method = "getWaterColor", at = @At("RETURN"), cancellable = true) private static void be_getWaterColor(BlockRenderView world, BlockPos pos, CallbackInfoReturnable info) { - int color = info.getReturnValue(); - - boolean scanDeep = true; - Mutable mut = new Mutable(); - for (Direction d: BlocksHelper.HORIZONTAL) { - mut.set(pos).move(d); - if ((world.getBlockState(mut).isOf(EndBlocks.BRIMSTONE))) { - color = POISON_COLOR; - scanDeep = false; - break; + if (ClientOptions.useSulfurWaterColor()) { + int color = info.getReturnValue(); + + boolean scanDeep = true; + Mutable mut = new Mutable(); + for (Direction d: BlocksHelper.HORIZONTAL) { + mut.set(pos).move(d); + if ((world.getBlockState(mut).isOf(EndBlocks.BRIMSTONE))) { + color = POISON_COLOR; + scanDeep = false; + break; + } } - } - - if (scanDeep) { - int x1 = pos.getX() - 2; - int z1 = pos.getZ() - 2; - - int x2 = pos.getX() + 3; - int z2 = pos.getZ() + 3; - - mut.setY(pos.getY()); - for (int x = x1; x < x2 && scanDeep; x++) { - mut.setX(x); - for (int z = z1; z < z2 && scanDeep; z++) { - mut.setZ(z); - if (Math.abs(pos.getX() - x) != 2 || Math.abs(pos.getZ() - z) != 2) { - if ((world.getBlockState(mut).isOf(EndBlocks.BRIMSTONE))) { - color = STREAM_COLOR; - scanDeep = false; + + if (scanDeep) { + int x1 = pos.getX() - 2; + int z1 = pos.getZ() - 2; + + int x2 = pos.getX() + 3; + int z2 = pos.getZ() + 3; + + mut.setY(pos.getY()); + for (int x = x1; x < x2 && scanDeep; x++) { + mut.setX(x); + for (int z = z1; z < z2 && scanDeep; z++) { + mut.setZ(z); + if (Math.abs(pos.getX() - x) != 2 || Math.abs(pos.getZ() - z) != 2) { + if ((world.getBlockState(mut).isOf(EndBlocks.BRIMSTONE))) { + color = STREAM_COLOR; + scanDeep = false; + } } } } } + + info.setReturnValue(color); } - - info.setReturnValue(color); } } From 482dcc16387706514ef7f804dc1112a0396ea381 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sat, 23 Jan 2021 13:08:29 +0300 Subject: [PATCH 218/463] Infusion starts by placing ingredients at any pedestals. --- .../ru/betterend/blocks/EternalPedestal.java | 45 ++++++++----------- .../ru/betterend/blocks/InfusionPedestal.java | 38 ++++------------ .../betterend/blocks/basis/PedestalBlock.java | 18 +++----- 3 files changed, 34 insertions(+), 67 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/EternalPedestal.java b/src/main/java/ru/betterend/blocks/EternalPedestal.java index b64b05be..ed2d1d69 100644 --- a/src/main/java/ru/betterend/blocks/EternalPedestal.java +++ b/src/main/java/ru/betterend/blocks/EternalPedestal.java @@ -38,39 +38,32 @@ public class EternalPedestal extends PedestalBlock { } @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - ActionResult result = super.onUse(state, world, pos, player, hand, hit); - if (result.equals(ActionResult.SUCCESS)) { - BlockEntity blockEntity = world.getBlockEntity(pos); - if (blockEntity instanceof EternalPedestalEntity) { - EternalPedestalEntity pedestal = (EternalPedestalEntity) blockEntity; - BlockState updatedState = world.getBlockState(pos); - if (pedestal.isEmpty() && updatedState.get(ACTIVATED)) { + public void checkRitual(World world, BlockPos pos) { + BlockEntity blockEntity = world.getBlockEntity(pos); + if (blockEntity instanceof EternalPedestalEntity) { + EternalPedestalEntity pedestal = (EternalPedestalEntity) blockEntity; + BlockState updatedState = world.getBlockState(pos); + if (pedestal.isEmpty() && updatedState.get(ACTIVATED)) { + if (pedestal.hasRitual()) { + EternalRitual ritual = pedestal.getRitual(); + ritual.removePortal(); + } + world.setBlockState(pos, updatedState.with(ACTIVATED, false)); + } else { + ItemStack itemStack = pedestal.getStack(0); + if (itemStack.getItem() == EndItems.ETERNAL_CRYSTAL) { + world.setBlockState(pos, updatedState.with(ACTIVATED, true)); if (pedestal.hasRitual()) { - EternalRitual ritual = pedestal.getRitual(); - ritual.removePortal(); - } - world.setBlockState(pos, updatedState.with(ACTIVATED, false)); - } else { - ItemStack itemStack = pedestal.getStack(0); - if (itemStack.getItem() == EndItems.ETERNAL_CRYSTAL) { - world.setBlockState(pos, updatedState.with(ACTIVATED, true)); - if (pedestal.hasRitual()) { - pedestal.getRitual().checkStructure(); - } else { - EternalRitual ritual = new EternalRitual(world, pos); - ritual.checkStructure(); - } + pedestal.getRitual().checkStructure(); + } else { + EternalRitual ritual = new EternalRitual(world, pos); + ritual.checkStructure(); } } } } - return result; } - @Override - protected void activate(World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) {} - @Override public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState newState, WorldAccess world, BlockPos pos, BlockPos posFrom) { BlockState updated = super.getStateForNeighborUpdate(state, direction, newState, world, pos, posFrom); diff --git a/src/main/java/ru/betterend/blocks/InfusionPedestal.java b/src/main/java/ru/betterend/blocks/InfusionPedestal.java index 0e57bb94..65023821 100644 --- a/src/main/java/ru/betterend/blocks/InfusionPedestal.java +++ b/src/main/java/ru/betterend/blocks/InfusionPedestal.java @@ -28,42 +28,20 @@ public class InfusionPedestal extends PedestalBlock { } @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - if (world.isClient || !state.isOf(this)) return ActionResult.CONSUME; + public void checkRitual(World world, BlockPos pos) { BlockEntity blockEntity = world.getBlockEntity(pos); - InfusionPedestalEntity pedestal = null; if (blockEntity instanceof InfusionPedestalEntity) { - pedestal = (InfusionPedestalEntity) blockEntity; - if (!pedestal.isEmpty() && pedestal.hasRitual()) { - if (pedestal.getRitual().hasRecipe()) { - pedestal.getRitual().stop(); - return ActionResult.SUCCESS; - } else if (pedestal.getRitual().checkRecipe()) { - return ActionResult.SUCCESS; - } + InfusionPedestalEntity pedestal = (InfusionPedestalEntity) blockEntity; + if (pedestal.hasRitual()) { + pedestal.getRitual().checkRecipe(); + } else { + InfusionRitual ritual = new InfusionRitual(world, pos); + pedestal.linkRitual(ritual); + ritual.checkRecipe(); } } - ActionResult result = ActionResult.FAIL; - if (hand != null) { - result = super.onUse(state, world, pos, player, hand, hit); - } - if (result == ActionResult.SUCCESS) { - if (pedestal != null) { - if (pedestal.hasRitual()) { - pedestal.getRitual().checkRecipe(); - } else { - InfusionRitual ritual = new InfusionRitual(world, pos); - pedestal.linkRitual(ritual); - ritual.checkRecipe(); - } - } - } - return result; } - @Override - protected void activate(World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) {} - @Override public BlockEntity createBlockEntity(BlockView world) { return new InfusionPedestalEntity(); diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index 1cc317c9..9829e1fa 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -114,7 +114,7 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid ItemStack itemStack = player.getStackInHand(hand); if (itemStack.isEmpty()) return ActionResult.CONSUME; pedestal.setStack(0, itemStack.split(1)); - activate(world, pos, player, hit); + this.checkRitual(world, pos); return ActionResult.SUCCESS; } else { ItemStack itemStack = pedestal.getStack(0); @@ -128,17 +128,13 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid return ActionResult.PASS; } - protected void activate(World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) { - Mutable mut = new Mutable(); - Point[] points = InfusionRitual.getMap(); - for (Point p: points) { - mut.set(pos).move(p.x, 0, p.y); - BlockState state = world.getBlockState(mut); + public void checkRitual(World world, BlockPos pos) { + Mutable posMutable = new Mutable(); + for (Point point: InfusionRitual.getMap()) { + posMutable.set(pos).move(point.x, 0, point.y); + BlockState state = world.getBlockState(posMutable); if (state.getBlock() instanceof InfusionPedestal) { - ActionResult result = state.getBlock().onUse(state, world, mut, player, null, hit); - if (result == ActionResult.SUCCESS) { - break; - } + ((InfusionPedestal) state.getBlock()).checkRitual(world, posMutable); } } } From f309af077b9c176c6cfc62c190adf613660b7ac5 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sat, 23 Jan 2021 13:08:46 +0300 Subject: [PATCH 219/463] Anvil Screen crash fix --- .../mixin/client/AnvilScreenMixin.java | 33 ++++++++++++------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java index 4577283f..a47b4c53 100644 --- a/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java +++ b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java @@ -31,7 +31,7 @@ public class AnvilScreenMixin extends ForgingScreen { @Shadow private TextFieldWidget nameField; - private List be_buttons = Lists.newArrayList(); + private final List be_buttons = Lists.newArrayList(); private AnvilScreenHandlerExtended anvilHandler; public AnvilScreenMixin(AnvilScreenHandler handler, PlayerInventory playerInventory, Text title, @@ -44,24 +44,31 @@ public class AnvilScreenMixin extends ForgingScreen { this.be_buttons.clear(); int x = (width - backgroundWidth) / 2; int y = (height - backgroundHeight) / 2; - this.anvilHandler = AnvilScreenHandlerExtended.class.cast(this.handler); + this.anvilHandler = (AnvilScreenHandlerExtended) this.handler; this.be_buttons.add(new ButtonWidget(x + 8, y + 45, 15, 20, new LiteralText("<"), (b) -> be_previousRecipe())); this.be_buttons.add(new ButtonWidget(x + 154, y + 45, 15, 20, new LiteralText(">"), (b) -> be_nextRecipe())); } @Inject(method = "renderForeground", at = @At("TAIL")) protected void be_renderForeground(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo info) { - if (anvilHandler.be_getRecipes().size() > 1) { - this.be_buttons.forEach(button -> button.render(matrices, mouseX, mouseY, delta)); - } + this.be_buttons.forEach(button -> { + button.render(matrices, mouseX, mouseY, delta); + }); } @Inject(method = "onSlotUpdate", at = @At("HEAD"), cancellable = true) public void be_onSlotUpdate(ScreenHandler handler, int slotId, ItemStack stack, CallbackInfo info) { - AnvilScreenHandlerExtended anvilHandler = AnvilScreenHandlerExtended.class.cast(handler); + AnvilScreenHandlerExtended anvilHandler = (AnvilScreenHandlerExtended) handler; if (anvilHandler.be_getCurrentRecipe() != null) { + if (anvilHandler.be_getRecipes().size() > 1) { + this.be_buttons.forEach(button -> button.visible = true); + } else { + this.be_buttons.forEach(button -> button.visible = false); + } this.nameField.setText(""); info.cancel(); + } else { + this.be_buttons.forEach(button -> button.visible = false); } } @@ -75,11 +82,15 @@ public class AnvilScreenMixin extends ForgingScreen { @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { - for (AbstractButtonWidget elem : be_buttons) { - if (elem.mouseClicked(mouseX, mouseY, button)) { - int i = be_buttons.indexOf(elem); - this.client.interactionManager.clickButton(handler.syncId, i); - return true; + if (client != null) { + for (AbstractButtonWidget elem : be_buttons) { + if (elem.visible && elem.mouseClicked(mouseX, mouseY, button)) { + if (client.interactionManager != null) { + int i = be_buttons.indexOf(elem); + this.client.interactionManager.clickButton(handler.syncId, i); + return true; + } + } } } return super.mouseClicked(mouseX, mouseY, button); From b5ca1df3d1221ae2b2a984caa33a739899d092a3 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sat, 23 Jan 2021 14:48:43 +0300 Subject: [PATCH 220/463] Small fix --- src/main/java/ru/betterend/blocks/EternalPedestal.java | 2 +- src/main/java/ru/betterend/blocks/basis/PedestalBlock.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/blocks/EternalPedestal.java b/src/main/java/ru/betterend/blocks/EternalPedestal.java index ed2d1d69..dc964bd5 100644 --- a/src/main/java/ru/betterend/blocks/EternalPedestal.java +++ b/src/main/java/ru/betterend/blocks/EternalPedestal.java @@ -99,7 +99,7 @@ public class EternalPedestal extends PedestalBlock { } List drop = Lists.newArrayList(); BlockEntity blockEntity = builder.getNullable(LootContextParameters.BLOCK_ENTITY); - if (blockEntity != null && blockEntity instanceof EternalPedestalEntity) { + if (blockEntity instanceof EternalPedestalEntity) { EternalPedestalEntity pedestal = (EternalPedestalEntity) blockEntity; if (!pedestal.isEmpty()) { drop.add(pedestal.getStack(0)); diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index 9829e1fa..bcf6377e 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -135,6 +135,7 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid BlockState state = world.getBlockState(posMutable); if (state.getBlock() instanceof InfusionPedestal) { ((InfusionPedestal) state.getBlock()).checkRitual(world, posMutable); + break; } } } From 50acd994950d2eb520d1e3f8bb1856aabc94d397 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 24 Jan 2021 03:12:24 +0300 Subject: [PATCH 221/463] Water mixin optimization --- .../ru/betterend/blocks/EternalPedestal.java | 3 - .../ru/betterend/blocks/InfusionPedestal.java | 4 - .../ru/betterend/client/ClientOptions.java | 6 +- .../mixin/client/BiomeColorsMixin.java | 80 +++++++++++-------- 4 files changed, 47 insertions(+), 46 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/EternalPedestal.java b/src/main/java/ru/betterend/blocks/EternalPedestal.java index dc964bd5..8a5ff3cb 100644 --- a/src/main/java/ru/betterend/blocks/EternalPedestal.java +++ b/src/main/java/ru/betterend/blocks/EternalPedestal.java @@ -14,9 +14,6 @@ import net.minecraft.loot.context.LootContext; import net.minecraft.loot.context.LootContextParameters; import net.minecraft.state.StateManager; import net.minecraft.state.property.BooleanProperty; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.BlockView; diff --git a/src/main/java/ru/betterend/blocks/InfusionPedestal.java b/src/main/java/ru/betterend/blocks/InfusionPedestal.java index 65023821..062cdd8e 100644 --- a/src/main/java/ru/betterend/blocks/InfusionPedestal.java +++ b/src/main/java/ru/betterend/blocks/InfusionPedestal.java @@ -5,10 +5,6 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.ShapeContext; import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; diff --git a/src/main/java/ru/betterend/client/ClientOptions.java b/src/main/java/ru/betterend/client/ClientOptions.java index e17b3c5d..d80f950c 100644 --- a/src/main/java/ru/betterend/client/ClientOptions.java +++ b/src/main/java/ru/betterend/client/ClientOptions.java @@ -1,6 +1,5 @@ package ru.betterend.client; -import net.fabricmc.loader.api.FabricLoader; import ru.betterend.config.Configs; public class ClientOptions { @@ -14,9 +13,6 @@ public class ClientOptions { useFogDensity = Configs.CLENT_CONFIG.getBooleanRoot("useFogDensity", true); blendBiomeMusic = Configs.CLENT_CONFIG.getBooleanRoot("blendBiomeMusic", true); sulfurWaterColor = Configs.CLENT_CONFIG.getBooleanRoot("sulfurWaterColor", true); - if (sulfurWaterColor) { - sulfurWaterColor = !FabricLoader.getInstance().isModLoaded("sodium"); - } Configs.CLENT_CONFIG.saveChanges(); } @@ -49,6 +45,6 @@ public class ClientOptions { } public static void setSulfurWaterColor(boolean sulfurWaterColor) { - ClientOptions.sulfurWaterColor = sulfurWaterColor && !FabricLoader.getInstance().isModLoaded("sodium"); + ClientOptions.sulfurWaterColor = sulfurWaterColor; } } diff --git a/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java b/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java index 195ca679..5fac649e 100644 --- a/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java +++ b/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java @@ -1,10 +1,13 @@ package ru.betterend.mixin.client; +import java.awt.Point; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.color.world.BiomeColors; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos.Mutable; @@ -19,46 +22,55 @@ import ru.betterend.util.MHelper; public class BiomeColorsMixin { private static final int POISON_COLOR = MHelper.color(92, 160, 78); private static final int STREAM_COLOR = MHelper.color(105, 213, 244); + private static final Mutable POS = new Mutable(); + private static final Point[] OUTER_POINTS; + private static final Point[] INNER_POINTS; + private static final boolean CAN_RENDER; @Inject(method = "getWaterColor", at = @At("RETURN"), cancellable = true) private static void be_getWaterColor(BlockRenderView world, BlockPos pos, CallbackInfoReturnable info) { - if (ClientOptions.useSulfurWaterColor()) { - int color = info.getReturnValue(); - - boolean scanDeep = true; - Mutable mut = new Mutable(); - for (Direction d: BlocksHelper.HORIZONTAL) { - mut.set(pos).move(d); - if ((world.getBlockState(mut).isOf(EndBlocks.BRIMSTONE))) { - color = POISON_COLOR; - scanDeep = false; - break; - } - } - - if (scanDeep) { - int x1 = pos.getX() - 2; - int z1 = pos.getZ() - 2; - - int x2 = pos.getX() + 3; - int z2 = pos.getZ() + 3; - - mut.setY(pos.getY()); - for (int x = x1; x < x2 && scanDeep; x++) { - mut.setX(x); - for (int z = z1; z < z2 && scanDeep; z++) { - mut.setZ(z); - if (Math.abs(pos.getX() - x) != 2 || Math.abs(pos.getZ() - z) != 2) { - if ((world.getBlockState(mut).isOf(EndBlocks.BRIMSTONE))) { - color = STREAM_COLOR; - scanDeep = false; - } - } - } + if (CAN_RENDER && ClientOptions.useSulfurWaterColor()) { + POS.setY(pos.getY()); + for (Point offset: INNER_POINTS) { + POS.setX(pos.getX() + offset.x); + POS.setZ(pos.getZ() + offset.y); + if ((world.getBlockState(POS).isOf(EndBlocks.BRIMSTONE))) { + info.setReturnValue(POISON_COLOR); + info.cancel(); + return; } } - info.setReturnValue(color); + for (Point offset: OUTER_POINTS) { + POS.setX(pos.getX() + offset.x); + POS.setZ(pos.getZ() + offset.y); + if ((world.getBlockState(POS).isOf(EndBlocks.BRIMSTONE))) { + info.setReturnValue(STREAM_COLOR); + info.cancel(); + return; + } + } + } + } + + static { + CAN_RENDER = !FabricLoader.getInstance().isModLoaded("sodium"); + + OUTER_POINTS = new Point[16]; + for (int i = 0; i < 3; i++) { + int p = i - 1; + OUTER_POINTS[i] = new Point(p, -2); + OUTER_POINTS[i + 3] = new Point(p, 2); + OUTER_POINTS[i + 6] = new Point(-2, p); + OUTER_POINTS[i + 9] = new Point(2, p); + } + + INNER_POINTS = new Point[4]; + for (int i = 0; i < 4; i++) { + Direction dir = BlocksHelper.HORIZONTAL[i]; + INNER_POINTS[i] = new Point(dir.getOffsetX(), dir.getOffsetZ()); + dir = BlocksHelper.HORIZONTAL[(i + 1) & 3]; + OUTER_POINTS[i + 12] = new Point(INNER_POINTS[i].x + dir.getOffsetX(), INNER_POINTS[i].y + dir.getOffsetZ()); } } } From c949652e992bef862bc5674782291434362c65f1 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 24 Jan 2021 03:38:36 +0300 Subject: [PATCH 222/463] Fixes --- .../mixin/client/BiomeColorsMixin.java | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java b/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java index 5fac649e..1c4bacea 100644 --- a/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java +++ b/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java @@ -8,6 +8,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.color.world.BiomeColors; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos.Mutable; @@ -22,19 +23,21 @@ import ru.betterend.util.MHelper; public class BiomeColorsMixin { private static final int POISON_COLOR = MHelper.color(92, 160, 78); private static final int STREAM_COLOR = MHelper.color(105, 213, 244); - private static final Mutable POS = new Mutable(); private static final Point[] OUTER_POINTS; private static final Point[] INNER_POINTS; - private static final boolean CAN_RENDER; + private static final boolean HAS_SODIUM; @Inject(method = "getWaterColor", at = @At("RETURN"), cancellable = true) private static void be_getWaterColor(BlockRenderView world, BlockPos pos, CallbackInfoReturnable info) { - if (CAN_RENDER && ClientOptions.useSulfurWaterColor()) { - POS.setY(pos.getY()); + if (ClientOptions.useSulfurWaterColor()) { + BlockRenderView view = HAS_SODIUM ? MinecraftClient.getInstance().world : world; + Mutable mut = new Mutable(); + mut.setY(pos.getY()); + for (Point offset: INNER_POINTS) { - POS.setX(pos.getX() + offset.x); - POS.setZ(pos.getZ() + offset.y); - if ((world.getBlockState(POS).isOf(EndBlocks.BRIMSTONE))) { + mut.setX(pos.getX() + offset.x); + mut.setZ(pos.getZ() + offset.y); + if ((view.getBlockState(mut).isOf(EndBlocks.BRIMSTONE))) { info.setReturnValue(POISON_COLOR); info.cancel(); return; @@ -42,9 +45,9 @@ public class BiomeColorsMixin { } for (Point offset: OUTER_POINTS) { - POS.setX(pos.getX() + offset.x); - POS.setZ(pos.getZ() + offset.y); - if ((world.getBlockState(POS).isOf(EndBlocks.BRIMSTONE))) { + mut.setX(pos.getX() + offset.x); + mut.setZ(pos.getZ() + offset.y); + if ((view.getBlockState(mut).isOf(EndBlocks.BRIMSTONE))) { info.setReturnValue(STREAM_COLOR); info.cancel(); return; @@ -54,7 +57,7 @@ public class BiomeColorsMixin { } static { - CAN_RENDER = !FabricLoader.getInstance().isModLoaded("sodium"); + HAS_SODIUM = FabricLoader.getInstance().isModLoaded("sodium"); OUTER_POINTS = new Point[16]; for (int i = 0; i < 3; i++) { From 2e8564a26c03a397c044e7a42c727d1c0d2db25f Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 24 Jan 2021 15:41:26 +0300 Subject: [PATCH 223/463] Fixed issue with sodium --- .../ru/betterend/blocks/BrimstoneBlock.java | 33 ++++++++++++++++ .../mixin/client/BiomeColorsMixin.java | 38 +++++++------------ 2 files changed, 46 insertions(+), 25 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/BrimstoneBlock.java b/src/main/java/ru/betterend/blocks/BrimstoneBlock.java index 4ddf7416..8b832d94 100644 --- a/src/main/java/ru/betterend/blocks/BrimstoneBlock.java +++ b/src/main/java/ru/betterend/blocks/BrimstoneBlock.java @@ -2,17 +2,24 @@ package ru.betterend.blocks; import java.util.Random; +import org.jetbrains.annotations.Nullable; + import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.MaterialColor; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.LivingEntity; import net.minecraft.fluid.Fluids; +import net.minecraft.item.ItemStack; import net.minecraft.server.world.ServerWorld; import net.minecraft.state.StateManager; import net.minecraft.state.property.BooleanProperty; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; +import net.minecraft.world.World; +import net.minecraft.world.WorldAccess; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; @@ -29,6 +36,32 @@ public class BrimstoneBlock extends BlockBase { protected void appendProperties(StateManager.Builder stateManager) { stateManager.add(ACTIVATED); } + + @Override + public void onPlaced(World world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack itemStack) { + if (world.isClient()) { + updateChunks((ClientWorld) world, pos); + } + } + + public void onBroken(WorldAccess world, BlockPos pos, BlockState state) { + if (world.isClient()) { + updateChunks((ClientWorld) world, pos); + } + } + + private void updateChunks(ClientWorld world, BlockPos pos) { + int y = pos.getY() >> 4; + int x1 = (pos.getX() - 2) >> 4; + int z1 = (pos.getZ() - 2) >> 4; + int x2 = (pos.getX() + 2) >> 4; + int z2 = (pos.getZ() + 2) >> 4; + for (int x = x1; x <= x2; x++) { + for (int z = z1; z <= z2; z++) { + world.scheduleBlockRenders(x, y, z); + } + } + } @Override public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { diff --git a/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java b/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java index 1c4bacea..33f777be 100644 --- a/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java +++ b/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java @@ -23,8 +23,7 @@ import ru.betterend.util.MHelper; public class BiomeColorsMixin { private static final int POISON_COLOR = MHelper.color(92, 160, 78); private static final int STREAM_COLOR = MHelper.color(105, 213, 244); - private static final Point[] OUTER_POINTS; - private static final Point[] INNER_POINTS; + private static final Point[] OFFSETS; private static final boolean HAS_SODIUM; @Inject(method = "getWaterColor", at = @At("RETURN"), cancellable = true) @@ -33,22 +32,11 @@ public class BiomeColorsMixin { BlockRenderView view = HAS_SODIUM ? MinecraftClient.getInstance().world : world; Mutable mut = new Mutable(); mut.setY(pos.getY()); - - for (Point offset: INNER_POINTS) { - mut.setX(pos.getX() + offset.x); - mut.setZ(pos.getZ() + offset.y); + for (int i = 0; i < OFFSETS.length; i++) { + mut.setX(pos.getX() + OFFSETS[i].x); + mut.setZ(pos.getZ() + OFFSETS[i].y); if ((view.getBlockState(mut).isOf(EndBlocks.BRIMSTONE))) { - info.setReturnValue(POISON_COLOR); - info.cancel(); - return; - } - } - - for (Point offset: OUTER_POINTS) { - mut.setX(pos.getX() + offset.x); - mut.setZ(pos.getZ() + offset.y); - if ((view.getBlockState(mut).isOf(EndBlocks.BRIMSTONE))) { - info.setReturnValue(STREAM_COLOR); + info.setReturnValue(i < 16 ? STREAM_COLOR : POISON_COLOR); info.cancel(); return; } @@ -59,21 +47,21 @@ public class BiomeColorsMixin { static { HAS_SODIUM = FabricLoader.getInstance().isModLoaded("sodium"); - OUTER_POINTS = new Point[16]; + OFFSETS = new Point[20]; for (int i = 0; i < 3; i++) { int p = i - 1; - OUTER_POINTS[i] = new Point(p, -2); - OUTER_POINTS[i + 3] = new Point(p, 2); - OUTER_POINTS[i + 6] = new Point(-2, p); - OUTER_POINTS[i + 9] = new Point(2, p); + OFFSETS[i] = new Point(p, -2); + OFFSETS[i + 3] = new Point(p, 2); + OFFSETS[i + 6] = new Point(-2, p); + OFFSETS[i + 9] = new Point(2, p); } - INNER_POINTS = new Point[4]; for (int i = 0; i < 4; i++) { + int inner = i + 16; Direction dir = BlocksHelper.HORIZONTAL[i]; - INNER_POINTS[i] = new Point(dir.getOffsetX(), dir.getOffsetZ()); + OFFSETS[inner] = new Point(dir.getOffsetX(), dir.getOffsetZ()); dir = BlocksHelper.HORIZONTAL[(i + 1) & 3]; - OUTER_POINTS[i + 12] = new Point(INNER_POINTS[i].x + dir.getOffsetX(), INNER_POINTS[i].y + dir.getOffsetZ()); + OFFSETS[i + 12] = new Point(OFFSETS[inner].x + dir.getOffsetX(), OFFSETS[inner].y + dir.getOffsetZ()); } } } From 1985750261fb08717c6966fbef7904d2db465108 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 25 Jan 2021 06:58:30 +0300 Subject: [PATCH 224/463] Metal lanterns --- .../blocks/BulbVineLanternBlock.java | 46 +++++++++++- .../blocks/BulbVineLanternColoredBlock.java | 28 +------ ...ndelierBlock.java => ChandelierBlock.java} | 8 +- .../blocks/complex/MetalMaterial.java | 40 ++++++++-- .../java/ru/betterend/patterns/Patterns.java | 4 +- .../ru/betterend/recipe/CraftingRecipes.java | 5 +- .../recipe/builders/FurnaceRecipe.java | 10 +++ .../java/ru/betterend/registry/EndBlocks.java | 7 +- .../blockstates/thallasium_anvil.json | 19 +++++ .../assets/betterend/lang/en_us.json | 52 ++++++++----- .../assets/betterend/lang/ru_ru.json | 52 ++++++++----- .../materialmaps/block/bulb_lantern.json | 3 - .../materialmaps/block/iron_bulb_lantern.json | 10 +++ ...lack.json => iron_bulb_lantern_black.json} | 0 ..._blue.json => iron_bulb_lantern_blue.json} | 0 ...rown.json => iron_bulb_lantern_brown.json} | 0 ..._cyan.json => iron_bulb_lantern_cyan.json} | 0 ..._gray.json => iron_bulb_lantern_gray.json} | 0 ...reen.json => iron_bulb_lantern_green.json} | 0 ...json => iron_bulb_lantern_light_blue.json} | 0 ...json => iron_bulb_lantern_light_gray.json} | 0 ..._lime.json => iron_bulb_lantern_lime.json} | 0 ...ta.json => iron_bulb_lantern_magenta.json} | 0 ...nge.json => iron_bulb_lantern_orange.json} | 0 ..._pink.json => iron_bulb_lantern_pink.json} | 0 ...ple.json => iron_bulb_lantern_purple.json} | 0 ...rn_red.json => iron_bulb_lantern_red.json} | 0 ...hite.json => iron_bulb_lantern_white.json} | 0 ...low.json => iron_bulb_lantern_yellow.json} | 0 .../block/thallasium_bulb_lantern.json | 10 +++ .../block/thallasium_bulb_lantern_black.json | 10 +++ .../block/thallasium_bulb_lantern_blue.json | 10 +++ .../block/thallasium_bulb_lantern_brown.json | 10 +++ .../block/thallasium_bulb_lantern_cyan.json | 10 +++ .../block/thallasium_bulb_lantern_gray.json | 10 +++ .../block/thallasium_bulb_lantern_green.json | 10 +++ .../thallasium_bulb_lantern_light_blue.json | 10 +++ .../thallasium_bulb_lantern_light_gray.json | 10 +++ .../block/thallasium_bulb_lantern_lime.json | 10 +++ .../thallasium_bulb_lantern_magenta.json | 10 +++ .../block/thallasium_bulb_lantern_orange.json | 10 +++ .../block/thallasium_bulb_lantern_pink.json | 10 +++ .../block/thallasium_bulb_lantern_purple.json | 10 +++ .../block/thallasium_bulb_lantern_red.json | 10 +++ .../block/thallasium_bulb_lantern_white.json | 10 +++ .../block/thallasium_bulb_lantern_yellow.json | 10 +++ .../models/block/bulb_vine_lantern_ceil.json | 58 --------------- .../models/block/bulb_vine_lantern_floor.json | 56 -------------- .../models/block/thallasium_anvil.json | 69 ++++++++++++++++++ .../models/item/thallasium_anvil.json | 3 + .../block/bulb_lantern_ceil.json} | 4 +- .../block/bulb_lantern_floor.json} | 4 +- .../patterns/blockstate/bulb_lantern.json | 4 +- .../textures/block/bulb_vine_lantern.png | Bin 422 -> 0 bytes .../textures/block/bulb_vine_lantern_bulb.png | Bin 0 -> 766 bytes ...meta => bulb_vine_lantern_bulb.png.mcmeta} | 0 ...l.png => iron_bulb_vine_lantern_metal.png} | Bin .../textures/block/thallasium_anvil.png | Bin 380 -> 0 bytes .../textures/block/thallasium_anvil_back.png | Bin 0 -> 423 bytes .../block/thallasium_anvil_bottom.png | Bin 0 -> 328 bytes .../textures/block/thallasium_anvil_front.png | Bin 0 -> 456 bytes .../textures/block/thallasium_anvil_panel.png | Bin 0 -> 561 bytes .../textures/block/thallasium_anvil_top.png | Bin 316 -> 329 bytes .../thallasium_bulb_vine_lantern_metal.png | Bin 0 -> 402 bytes .../block/thallasium_chandelier_e.png | Bin 138 -> 1470 bytes .../block/thallasium_chandelier_wall_e.png | Bin 150 -> 1456 bytes .../textures/item/thallasium_nugget.png | Bin 0 -> 1488 bytes .../{block => item}/thermal fungus.png | Bin 68 files changed, 446 insertions(+), 206 deletions(-) rename src/main/java/ru/betterend/blocks/{ThallasiumChandelierBlock.java => ChandelierBlock.java} (79%) create mode 100644 src/main/resources/assets/betterend/blockstates/thallasium_anvil.json delete mode 100644 src/main/resources/assets/betterend/materialmaps/block/bulb_lantern.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern.json rename src/main/resources/assets/betterend/materialmaps/block/{bulb_lantern_black.json => iron_bulb_lantern_black.json} (100%) rename src/main/resources/assets/betterend/materialmaps/block/{bulb_lantern_blue.json => iron_bulb_lantern_blue.json} (100%) rename src/main/resources/assets/betterend/materialmaps/block/{bulb_lantern_brown.json => iron_bulb_lantern_brown.json} (100%) rename src/main/resources/assets/betterend/materialmaps/block/{bulb_lantern_cyan.json => iron_bulb_lantern_cyan.json} (100%) rename src/main/resources/assets/betterend/materialmaps/block/{bulb_lantern_gray.json => iron_bulb_lantern_gray.json} (100%) rename src/main/resources/assets/betterend/materialmaps/block/{bulb_lantern_green.json => iron_bulb_lantern_green.json} (100%) rename src/main/resources/assets/betterend/materialmaps/block/{bulb_lantern_light_blue.json => iron_bulb_lantern_light_blue.json} (100%) rename src/main/resources/assets/betterend/materialmaps/block/{bulb_lantern_light_gray.json => iron_bulb_lantern_light_gray.json} (100%) rename src/main/resources/assets/betterend/materialmaps/block/{bulb_lantern_lime.json => iron_bulb_lantern_lime.json} (100%) rename src/main/resources/assets/betterend/materialmaps/block/{bulb_lantern_magenta.json => iron_bulb_lantern_magenta.json} (100%) rename src/main/resources/assets/betterend/materialmaps/block/{bulb_lantern_orange.json => iron_bulb_lantern_orange.json} (100%) rename src/main/resources/assets/betterend/materialmaps/block/{bulb_lantern_pink.json => iron_bulb_lantern_pink.json} (100%) rename src/main/resources/assets/betterend/materialmaps/block/{bulb_lantern_purple.json => iron_bulb_lantern_purple.json} (100%) rename src/main/resources/assets/betterend/materialmaps/block/{bulb_lantern_red.json => iron_bulb_lantern_red.json} (100%) rename src/main/resources/assets/betterend/materialmaps/block/{bulb_lantern_white.json => iron_bulb_lantern_white.json} (100%) rename src/main/resources/assets/betterend/materialmaps/block/{bulb_lantern_yellow.json => iron_bulb_lantern_yellow.json} (100%) create mode 100644 src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_black.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_blue.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_brown.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_cyan.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_gray.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_green.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_light_blue.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_light_gray.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_lime.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_magenta.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_orange.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_pink.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_purple.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_red.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_white.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_yellow.json delete mode 100644 src/main/resources/assets/betterend/models/block/bulb_vine_lantern_ceil.json delete mode 100644 src/main/resources/assets/betterend/models/block/bulb_vine_lantern_floor.json create mode 100644 src/main/resources/assets/betterend/models/block/thallasium_anvil.json create mode 100644 src/main/resources/assets/betterend/models/item/thallasium_anvil.json rename src/main/resources/assets/betterend/{models/block/bulb_lantern_colored_ceil.json => patterns/block/bulb_lantern_ceil.json} (95%) rename src/main/resources/assets/betterend/{models/block/bulb_lantern_colored_floor.json => patterns/block/bulb_lantern_floor.json} (95%) delete mode 100644 src/main/resources/assets/betterend/textures/block/bulb_vine_lantern.png create mode 100644 src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb.png rename src/main/resources/assets/betterend/textures/block/{bulb_vine_lantern.png.mcmeta => bulb_vine_lantern_bulb.png.mcmeta} (100%) rename src/main/resources/assets/betterend/textures/block/{bulb_vine_lantern_metal.png => iron_bulb_vine_lantern_metal.png} (100%) delete mode 100644 src/main/resources/assets/betterend/textures/block/thallasium_anvil.png create mode 100644 src/main/resources/assets/betterend/textures/block/thallasium_anvil_back.png create mode 100644 src/main/resources/assets/betterend/textures/block/thallasium_anvil_bottom.png create mode 100644 src/main/resources/assets/betterend/textures/block/thallasium_anvil_front.png create mode 100644 src/main/resources/assets/betterend/textures/block/thallasium_anvil_panel.png create mode 100644 src/main/resources/assets/betterend/textures/block/thallasium_bulb_vine_lantern_metal.png create mode 100644 src/main/resources/assets/betterend/textures/item/thallasium_nugget.png rename src/main/resources/assets/betterend/textures/{block => item}/thermal fungus.png (100%) diff --git a/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java b/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java index 1a6f715c..00775b1f 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java @@ -1,5 +1,10 @@ package ru.betterend.blocks; +import java.io.Reader; +import java.util.Map; + +import com.google.common.collect.Maps; + import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.block.Block; @@ -8,14 +13,18 @@ import net.minecraft.block.Material; import net.minecraft.block.MaterialColor; import net.minecraft.block.ShapeContext; import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.registry.Registry; import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.BlockView; import ru.betterend.blocks.basis.EndLanternBlock; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; -public class BulbVineLanternBlock extends EndLanternBlock implements IRenderTypeable { +public class BulbVineLanternBlock extends EndLanternBlock implements IRenderTypeable, BlockPatterned { private static final VoxelShape SHAPE_CEIL = Block.createCuboidShape(4, 4, 4, 12, 16, 12); private static final VoxelShape SHAPE_FLOOR = Block.createCuboidShape(4, 0, 4, 12, 12, 12); @@ -43,4 +52,39 @@ public class BulbVineLanternBlock extends EndLanternBlock implements IRenderType public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } + + @Override + public String getStatesPattern(Reader data) { + Identifier blockId = Registry.BLOCK.getId(this); + return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); + } + + @Override + public String getModelPattern(String block) { + Identifier blockId = Registry.BLOCK.getId(this); + Map map = Maps.newHashMap(); + map.put("%glow%", getGlowTexture()); + map.put("%metal%", getMetalTexture(blockId)); + if (block.contains("item") || block.contains("ceil")) { + return Patterns.createJson(Patterns.BLOCK_BULB_LANTERN_CEIL, map); + } + else { + return Patterns.createJson(Patterns.BLOCK_BULB_LANTERN_FLOOR, map); + } + } + + protected String getMetalTexture(Identifier blockId) { + String name = blockId.getPath(); + name = name.substring(0, name.indexOf('_')); + return name + "_bulb_vine_lantern_metal"; + } + + protected String getGlowTexture() { + return "bulb_vine_lantern_bulb"; + } + + @Override + public Identifier statePatternId() { + return Patterns.STATE_BULB_LANTERN; + } } diff --git a/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java b/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java index edcbbbb3..99d18dd5 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java @@ -1,16 +1,11 @@ package ru.betterend.blocks; -import java.io.Reader; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.color.block.BlockColorProvider; import net.minecraft.client.color.item.ItemColorProvider; -import net.minecraft.util.Identifier; import ru.betterend.interfaces.IColorProvider; -import ru.betterend.patterns.BlockPatterned; -import ru.betterend.patterns.Patterns; -public class BulbVineLanternColoredBlock extends BulbVineLanternBlock implements IColorProvider, BlockPatterned { +public class BulbVineLanternColoredBlock extends BulbVineLanternBlock implements IColorProvider { public BulbVineLanternColoredBlock(FabricBlockSettings settings) { super(settings); } @@ -30,24 +25,7 @@ public class BulbVineLanternColoredBlock extends BulbVineLanternBlock implements } @Override - public String getStatesPattern(Reader data) { - String path = "betterend:block/bulb_lantern_colored"; - return Patterns.createJson(data, path, path); - } - - @Override - public String getModelPattern(String block) { - String path = "betterend:block/bulb_lantern_colored"; - if (block.contains("item") || block.contains("ceil")) { - return Patterns.createJson(Patterns.BLOCK_BULB_LANTERN_COLORED_CEIL, path, path); - } - else { - return Patterns.createJson(Patterns.BLOCK_BULB_LANTERN_COLORED_FLOOR, path, path); - } - } - - @Override - public Identifier statePatternId() { - return Patterns.STATE_BULB_LANTERN; + protected String getGlowTexture() { + return "bulb_vine_lantern_overlay"; } } diff --git a/src/main/java/ru/betterend/blocks/ThallasiumChandelierBlock.java b/src/main/java/ru/betterend/blocks/ChandelierBlock.java similarity index 79% rename from src/main/java/ru/betterend/blocks/ThallasiumChandelierBlock.java rename to src/main/java/ru/betterend/blocks/ChandelierBlock.java index d11573f7..6d7a3ffb 100644 --- a/src/main/java/ru/betterend/blocks/ThallasiumChandelierBlock.java +++ b/src/main/java/ru/betterend/blocks/ChandelierBlock.java @@ -7,8 +7,6 @@ import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.Block; import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.MaterialColor; import net.minecraft.block.ShapeContext; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; @@ -19,11 +17,11 @@ import ru.betterend.blocks.basis.AttachedBlock; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; -public class ThallasiumChandelierBlock extends AttachedBlock implements IRenderTypeable { +public class ChandelierBlock extends AttachedBlock implements IRenderTypeable { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); - public ThallasiumChandelierBlock() { - super(FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(MaterialColor.BLUE).noCollision().nonOpaque().requiresTool().luminance(15)); + public ChandelierBlock(FabricBlockSettings settings) { + super(settings.noCollision().nonOpaque().requiresTool().luminance(15)); } @Override diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index 29d2e49e..a186e3eb 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -7,7 +7,11 @@ import net.minecraft.block.MaterialColor; import net.minecraft.item.Item; import net.minecraft.item.Items; import net.minecraft.item.ToolMaterial; +import net.minecraft.sound.BlockSoundGroup; import net.minecraft.tag.BlockTags; +import ru.betterend.blocks.BulbVineLanternBlock; +import ru.betterend.blocks.BulbVineLanternColoredBlock; +import ru.betterend.blocks.ChandelierBlock; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.blocks.basis.EndAnvilBlock; import ru.betterend.blocks.basis.EndChainBlock; @@ -42,6 +46,11 @@ public class MetalMaterial { public final Block stairs; public final Block slab; + public final Block chandelier; + public final Block bulb_lantern; + public final ColoredMaterial bulb_lantern_colored; + + public final Item nugget; public final Item ingot; public final Item shovel; public final Item sword; @@ -51,19 +60,25 @@ public class MetalMaterial { public MetalMaterial(String name, MaterialColor color, ToolMaterial material) { FabricBlockSettings materialBlock = FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color); + FabricBlockSettings lantern = FabricBlockSettings.copyOf(materialBlock).sounds(BlockSoundGroup.LANTERN).hardness(1).resistance(1).luminance(15); ore = EndBlocks.registerBlock(name + "_ore", new BlockBase(FabricBlockSettings.copyOf(Blocks.END_STONE))); block = EndBlocks.registerBlock(name + "_block", new BlockBase(materialBlock)); tile = EndBlocks.registerBlock(name + "_tile", new BlockBase(materialBlock)); - bars = EndBlocks.registerBlock(name + "_bars", new EndMetalPaneBlock(block)); - plate = EndBlocks.registerBlock(name + "_plate", new EndWoodenPlateBlock(block)); + stairs = EndBlocks.registerBlock(name + "_stairs", new EndStairsBlock(tile)); + slab = EndBlocks.registerBlock(name + "_slab", new EndSlabBlock(tile)); door = EndBlocks.registerBlock(name + "_door", new EndDoorBlock(block)); trapdoor = EndBlocks.registerBlock(name + "_trapdoor", new EndTrapdoorBlock(block)); anvil = EndBlocks.registerBlock(name + "_anvil", new EndAnvilBlock(color)); + bars = EndBlocks.registerBlock(name + "_bars", new EndMetalPaneBlock(block)); chain = EndBlocks.registerBlock(name + "_chain", new EndChainBlock(color)); - stairs = EndBlocks.registerBlock(name + "_stairs", new EndStairsBlock(tile)); - slab = EndBlocks.registerBlock(name + "_slab", new EndSlabBlock(tile)); + plate = EndBlocks.registerBlock(name + "_plate", new EndWoodenPlateBlock(block)); + chandelier = EndBlocks.registerBlock(name + "_chandelier", new ChandelierBlock(materialBlock)); + bulb_lantern = EndBlocks.registerBlock(name + "_bulb_lantern", new BulbVineLanternBlock(lantern)); + bulb_lantern_colored = new ColoredMaterial(BulbVineLanternColoredBlock::new, bulb_lantern, false); + + nugget = EndItems.registerItem(name + "_nugget"); ingot = EndItems.registerItem(name + "_ingot"); shovel = EndItems.registerTool(name + "_shovel", new EndShovelItem(material, 1.5F, -3.0F, EndItems.makeItemSettings())); sword = EndItems.registerTool(name + "_sword", new EndSwordItem(material, 3, -2.4F, EndItems.makeItemSettings())); @@ -71,9 +86,10 @@ public class MetalMaterial { axe = EndItems.registerTool(name + "_axe", new EndAxeItem(material, 6.0F, -3.0F, EndItems.makeItemSettings())); hoe = EndItems.registerTool(name + "_hoe", new EndHoeItem(material, -3, 0.0F, EndItems.makeItemSettings())); - FurnaceRecipe.make("thallasium_ingot_furnace", ore, ingot).build(); + FurnaceRecipe.make("thallasium_ingot_furnace", ore, ingot).build(true); AlloyingRecipe.Builder.create("thallasium_ingot").setInput(ore, ore).setOutput(ingot, 3).setExpiriense(2.1F).build(); + GridRecipe.make(name + "_ingot_from_nuggets", ingot).setShape("###", "###", "###").addMaterial('#', nugget).setGroup("end_metal_ingots_nug").build(); GridRecipe.make(name + "_block", block).setShape("###", "###", "###").addMaterial('#', ingot).setGroup("end_metal_blocks").build(); GridRecipe.make(name + "_ingot_from_block", ingot).setOutputCount(9).setList("#").addMaterial('#', block).setGroup("end_metal_ingots").build(); @@ -82,14 +98,24 @@ public class MetalMaterial { GridRecipe.make(name + "_plate", plate).setShape("##").addMaterial('#', ingot).setGroup("end_metal_plates").build(); GridRecipe.make(name + "_door", door).setOutputCount(3).setOutputCount(16).setShape("##", "##", "##").addMaterial('#', ingot).setGroup("end_metal_doors").build(); GridRecipe.make(name + "_trapdoor", trapdoor).setShape("##", "##").addMaterial('#', ingot).setGroup("end_metal_trapdoors").build(); - GridRecipe.make(name + "_stairs", stairs).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', block).setGroup("end_metal_stairs").build(); - GridRecipe.make(name + "_slab", slab).setOutputCount(6).setShape("###").addMaterial('#', block).setGroup("end_metal_slabs").build(); + GridRecipe.make(name + "_stairs", stairs).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', block, tile).setGroup("end_metal_stairs").build(); + GridRecipe.make(name + "_slab", slab).setOutputCount(6).setShape("###").addMaterial('#', block, tile).setGroup("end_metal_slabs").build(); + GridRecipe.make(name + "_chain", chain).setShape("N", "#", "N").addMaterial('#', ingot).addMaterial('N', nugget).setGroup("end_metal_chain").build(); + GridRecipe.make(name + "_anvil", anvil).setOutputCount(3).setShape("###", " I ", "III").addMaterial('#', block, tile).addMaterial('I', ingot).setGroup("end_metal_anvil").build(); + GridRecipe.make(name + "bulb_lantern", bulb_lantern).setShape("C", "I", "#").addMaterial('C', chain).addMaterial('I', ingot).addMaterial('#', EndItems.GLOWING_BULB).build(); GridRecipe.make(name + "_axe", axe).setShape("##", "#I", " I").addMaterial('#', ingot).addMaterial('I', Items.STICK).build(); GridRecipe.make(name + "_hoe", hoe).setShape("##", " I", " I").addMaterial('#', ingot).addMaterial('I', Items.STICK).build(); GridRecipe.make(name + "_pickaxe", pickaxe).setShape("###", " I ", " I ").addMaterial('#', ingot).addMaterial('I', Items.STICK).build(); GridRecipe.make(name + "_sword", sword).setShape("#", "#", "I").addMaterial('#', ingot).addMaterial('I', Items.STICK).build(); + GridRecipe.make(name + "_chandelier", chandelier).setShape("I#I", " # ").addMaterial('#', ingot).addMaterial('I', EndItems.LUMECORN_ROD).setGroup("end_metal_chandelier").build(); + + FurnaceRecipe.make(name + "_axe_ingot", axe, nugget).build(true); + FurnaceRecipe.make(name + "_hoe_ingot", hoe, nugget).build(true); + FurnaceRecipe.make(name + "_pickaxe_ingot", pickaxe, nugget).build(true); + FurnaceRecipe.make(name + "_sword_ingot", sword, nugget).build(true); + TagHelper.addTag(BlockTags.ANVIL, anvil); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/patterns/Patterns.java b/src/main/java/ru/betterend/patterns/Patterns.java index 30ed7436..94722c6f 100644 --- a/src/main/java/ru/betterend/patterns/Patterns.java +++ b/src/main/java/ru/betterend/patterns/Patterns.java @@ -82,8 +82,8 @@ public class Patterns { public final static Identifier BLOCK_BOOKSHELF = BetterEnd.makeID("patterns/block/bookshelf.json"); public final static Identifier BLOCK_STONE_LANTERN_CEIL = BetterEnd.makeID("patterns/block/stone_lantern_ceil.json"); public final static Identifier BLOCK_STONE_LANTERN_FLOOR = BetterEnd.makeID("patterns/block/stone_lantern_floor.json"); - public final static Identifier BLOCK_BULB_LANTERN_COLORED_FLOOR = BetterEnd.makeID("models/block/bulb_lantern_colored_floor.json"); - public final static Identifier BLOCK_BULB_LANTERN_COLORED_CEIL = BetterEnd.makeID("models/block/bulb_lantern_colored_ceil.json"); + public final static Identifier BLOCK_BULB_LANTERN_FLOOR = BetterEnd.makeID("patterns/block/bulb_lantern_floor.json"); + public final static Identifier BLOCK_BULB_LANTERN_CEIL = BetterEnd.makeID("patterns/block/bulb_lantern_ceil.json"); public final static Identifier BLOCK_PETAL_COLORED = BetterEnd.makeID("models/block/block_petal_colored.json"); public final static Identifier BLOCK_COMPOSTER = BetterEnd.makeID("patterns/block/composter.json"); public final static Identifier BLOCK_COLORED = BetterEnd.makeID("patterns/block/block_colored.json"); diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index 1cfccd12..b5cafe59 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -117,7 +117,7 @@ public class CraftingRecipes { GridRecipe.make("amber_gem", EndItems.AMBER_GEM).setShape("##", "##").addMaterial('#', EndItems.RAW_AMBER).build(); GridRecipe.make("amber_block", EndBlocks.AMBER_BLOCK).setShape("###", "###", "###").addMaterial('#', EndItems.AMBER_GEM).build(); - GridRecipe.make("bulb_lantern", EndBlocks.BULB_LANTERN).addMaterial('C', Items.CHAIN).addMaterial('I', Items.IRON_INGOT).setShape("C", "I", "#").addMaterial('#', EndItems.GLOWING_BULB).build(); + GridRecipe.make("bulb_lantern", EndBlocks.IRON_BULB_LANTERN).setShape("C", "I", "#").addMaterial('C', Items.CHAIN).addMaterial('I', Items.IRON_INGOT).addMaterial('#', EndItems.GLOWING_BULB).build(); GridRecipe.make("twisted_moss_dye", Items.PINK_DYE).setList("#").addMaterial('#', EndBlocks.TWISTED_MOSS).build(); GridRecipe.make("byshy_grass_dye", Items.MAGENTA_DYE).setList("#").addMaterial('#', EndBlocks.BUSHY_GRASS).build(); GridRecipe.make("tail_moss_dye", Items.GRAY_DYE).setList("#").addMaterial('#', EndBlocks.TAIL_MOSS).build(); @@ -190,9 +190,6 @@ public class CraftingRecipes { GridRecipe.make("fiber_string", Items.STRING).setOutputCount(6).setShape("#", "#", "#").addMaterial('#', EndItems.SILK_FIBER).build(); - GridRecipe.make("thallasium_chandelier", EndBlocks.THALLASIUM_CHANDELIER).setShape("I#I", " # ") - .addMaterial('#', EndBlocks.THALLASIUM.ingot).addMaterial('I', EndItems.LUMECORN_ROD).build(); - GridRecipe.make("ender_eye_amber", Items.ENDER_EYE) .setShape("SAS", "APA", "SAS") .addMaterial('S', EndItems.CRYSTAL_SHARDS) diff --git a/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java b/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java index 474466f6..b56d8e9a 100644 --- a/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java @@ -2,6 +2,7 @@ package ru.betterend.recipe.builders; import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; +import net.minecraft.recipe.BlastingRecipe; import net.minecraft.recipe.Ingredient; import net.minecraft.recipe.RecipeType; import net.minecraft.recipe.SmeltingRecipe; @@ -58,10 +59,19 @@ public class FurnaceRecipe { } public void build() { + build(false); + } + + public void build(boolean blasting) { if (exist) { Identifier id = BetterEnd.makeID(name); SmeltingRecipe recipe = new SmeltingRecipe(id, group, Ingredient.ofItems(input), new ItemStack(output, count), xp, time); EndRecipeManager.addRecipe(RecipeType.SMELTING, recipe); + + if (blasting) { + BlastingRecipe recipe2 = new BlastingRecipe(id, group, Ingredient.ofItems(input), new ItemStack(output, count), xp, time / 2); + EndRecipeManager.addRecipe(RecipeType.BLASTING, recipe2); + } } else { BetterEnd.LOGGER.debug("Smelting recipe {} couldn't be added", name); diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index abad7f6c..033b6bc3 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -78,7 +78,6 @@ import ru.betterend.blocks.TenaneaFlowersBlock; import ru.betterend.blocks.TenaneaSaplingBlock; import ru.betterend.blocks.TerminiteBlock; import ru.betterend.blocks.TerrainPlantBlock; -import ru.betterend.blocks.ThallasiumChandelierBlock; import ru.betterend.blocks.TwistedUmbrellaMossBlock; import ru.betterend.blocks.TwistedUmbrellaMossTallBlock; import ru.betterend.blocks.UmbrellaMossBlock; @@ -305,10 +304,8 @@ public class EndBlocks { public static final Block END_STONE_LANTERN = registerBlock("end_stone_lantern", new StoneLanternBlock(Blocks.END_STONE)); public static final Block BLACKSTONE_LANTERN = registerBlock("blackstone_lantern", new StoneLanternBlock(Blocks.BLACKSTONE)); - public static final Block BULB_LANTERN = registerBlock("bulb_lantern", new BulbVineLanternBlock()); - public static final ColoredMaterial BULB_LANTERN_COLORED = new ColoredMaterial(BulbVineLanternColoredBlock::new, BULB_LANTERN, false); - - public static final Block THALLASIUM_CHANDELIER = registerBlock("thallasium_chandelier", new ThallasiumChandelierBlock()); + public static final Block IRON_BULB_LANTERN = registerBlock("iron_bulb_lantern", new BulbVineLanternBlock()); + public static final ColoredMaterial IRON_BULB_LANTERN_COLORED = new ColoredMaterial(BulbVineLanternColoredBlock::new, IRON_BULB_LANTERN, false); // Blocks With Entity // public static final Block END_STONE_SMELTER = registerBlock("end_stone_smelter", new EndStoneSmelter()); diff --git a/src/main/resources/assets/betterend/blockstates/thallasium_anvil.json b/src/main/resources/assets/betterend/blockstates/thallasium_anvil.json new file mode 100644 index 00000000..917cb573 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/thallasium_anvil.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "betterend:block/thallasium_anvil", + "y": 270 + }, + "facing=north": { + "model": "betterend:block/thallasium_anvil", + "y": 180 + }, + "facing=south": { + "model": "betterend:block/thallasium_anvil" + }, + "facing=west": { + "model": "betterend:block/thallasium_anvil", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index f77ae1b5..e0839b80 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -358,26 +358,44 @@ "block.betterend.twisted_moss": "Twisted Moss", "block.betterend.bulb_vine": "Bulb Vine", - "block.betterend.bulb_lantern": "Bulb Lantern", "block.betterend.bulb_vine_seed": "Bulb Vine Seed", "item.betterend.glowing_bulb": "Glowing Bulb", - "block.betterend.bulb_lantern_black": "Black Bulb Lantern", - "block.betterend.bulb_lantern_blue": "Blue Bulb Lantern", - "block.betterend.bulb_lantern_brown": "Brown Bulb Lantern", - "block.betterend.bulb_lantern_cyan": "Cyan Bulb Lantern", - "block.betterend.bulb_lantern_gray": "Gray Bulb Lantern", - "block.betterend.bulb_lantern_green": "Green Bulb Lantern", - "block.betterend.bulb_lantern_light_blue": "Light Blue Bulb Lantern", - "block.betterend.bulb_lantern_light_gray": "Light Gray Bulb Lantern", - "block.betterend.bulb_lantern_lime": "Lime Bulb Lantern", - "block.betterend.bulb_lantern_magenta": "Magenta Bulb Lantern", - "block.betterend.bulb_lantern_orange": "Orange Bulb Lantern", - "block.betterend.bulb_lantern_pink": "Pink Bulb Lantern", - "block.betterend.bulb_lantern_purple": "Purple Bulb Lantern", - "block.betterend.bulb_lantern_red": "Red Bulb Lantern", - "block.betterend.bulb_lantern_white": "White Bulb Lantern", - "block.betterend.bulb_lantern_yellow": "Yellow Bulb Lantern", + "block.betterend.iron_bulb_lantern": "Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_black": "Black Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_blue": "Blue Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_brown": "Brown Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_cyan": "Cyan Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_gray": "Gray Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_green": "Green Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_light_blue": "Light Blue Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_light_gray": "Light Gray Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_lime": "Lime Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_magenta": "Magenta Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_orange": "Orange Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_pink": "Pink Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_purple": "Purple Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_red": "Red Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_white": "White Iron Bulb Lantern", + "block.betterend.iron_bulb_lantern_yellow": "Yellow Iron Bulb Lantern", + + "block.betterend.thallasium_bulb_lantern": "Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_black": "Black Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_blue": "Blue Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_brown": "Brown Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_cyan": "Cyan Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_gray": "Gray Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_green": "Green Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_light_blue": "Light Blue Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_light_gray": "Light Gray Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_lime": "Lime Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_magenta": "Magenta Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_orange": "Orange Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_pink": "Pink Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_purple": "Purple Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_red": "Red Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_white": "White Thallasium Bulb Lantern", + "block.betterend.thallasium_bulb_lantern_yellow": "Yellow Thallasium Bulb Lantern", "block.betterend.bushy_grass": "Bushy Grass", diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index a1b1774c..f9540b90 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -360,26 +360,44 @@ "block.betterend.twisted_moss": "Закрученный мох", "block.betterend.bulb_vine": "Луковичная лоза", - "block.betterend.bulb_lantern": "Луковичный фонарь", "block.betterend.bulb_vine_seed": "Семя луковичной лозы", "item.betterend.glowing_bulb": "Светящаяся луковица", - "block.betterend.bulb_lantern_black": "Чёрный луковичный фонарь", - "block.betterend.bulb_lantern_blue": "Синий луковичный фонарь", - "block.betterend.bulb_lantern_brown": "Коричневый луковичный фонарь", - "block.betterend.bulb_lantern_cyan": "Циановый луковичный фонарь", - "block.betterend.bulb_lantern_gray": "Серый луковичный фонарь", - "block.betterend.bulb_lantern_green": "Зелёный луковичный фонарь", - "block.betterend.bulb_lantern_light_blue": "Голубой луковичный фонарь", - "block.betterend.bulb_lantern_light_gray": "Светло-серый луковичный фонарь", - "block.betterend.bulb_lantern_lime": "Лаймовый луковичный фонарь", - "block.betterend.bulb_lantern_magenta": "Фиолетовый луковичный фонарь", - "block.betterend.bulb_lantern_orange": "Оранжевый луковичный фонарь", - "block.betterend.bulb_lantern_pink": "Розовый луковичный фонарь", - "block.betterend.bulb_lantern_purple": "Пурпурный луковичный фонарь", - "block.betterend.bulb_lantern_red": "Красный луковичный фонарь", - "block.betterend.bulb_lantern_white": "Белый луковичный фонарь", - "block.betterend.bulb_lantern_yellow": "Жёлтый луковичный фонарь", + "block.betterend.iron_bulb_lantern": "Железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_black": "Чёрный железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_blue": "Синий железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_brown": "Коричневый железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_cyan": "Циановый железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_gray": "Серый железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_green": "Зелёный железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_light_blue": "Голубой железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_light_gray": "Светло-серый железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_lime": "Лаймовый железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_magenta": "Фиолетовый железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_orange": "Оранжевый железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_pink": "Розовый железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_purple": "Пурпурный железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_red": "Красный железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_white": "Белый железный луковичный фонарь", + "block.betterend.iron_bulb_lantern_yellow": "Жёлтый железный луковичный фонарь", + + "block.betterend.thallasium_bulb_lantern": "Талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_black": "Чёрный талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_blue": "Синий талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_brown": "Коричневый талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_cyan": "Циановый талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_gray": "Серый талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_green": "Зелёный талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_light_blue": "Голубой талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_light_gray": "Светло-серый талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_lime": "Лаймовый талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_magenta": "Фиолетовый талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_orange": "Оранжевый талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_pink": "Розовый талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_purple": "Пурпурный талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_red": "Красный талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_white": "Белый талласиевый луковичный фонарь", + "block.betterend.thallasium_bulb_lantern_yellow": "Жёлтый талласиевый луковичный фонарь", "block.betterend.bushy_grass": "Густая трава", diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern.json b/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern.json deleted file mode 100644 index 2163812f..00000000 --- a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "defaultMaterial": "betterend:glow_inc" -} diff --git a/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern.json new file mode 100644 index 00000000..f84c70f5 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_bulb", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_black.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_black.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_black.json rename to src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_black.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_blue.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_blue.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_blue.json rename to src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_blue.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_brown.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_brown.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_brown.json rename to src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_brown.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_cyan.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_cyan.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_cyan.json rename to src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_cyan.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_gray.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_gray.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_gray.json rename to src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_gray.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_green.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_green.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_green.json rename to src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_green.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_light_blue.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_light_blue.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_light_blue.json rename to src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_light_blue.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_light_gray.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_light_gray.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_light_gray.json rename to src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_light_gray.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_lime.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_lime.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_lime.json rename to src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_lime.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_magenta.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_magenta.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_magenta.json rename to src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_magenta.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_orange.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_orange.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_orange.json rename to src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_orange.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_pink.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_pink.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_pink.json rename to src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_pink.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_purple.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_purple.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_purple.json rename to src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_purple.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_red.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_red.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_red.json rename to src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_red.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_white.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_white.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_white.json rename to src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_white.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_yellow.json b/src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_yellow.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/bulb_lantern_yellow.json rename to src/main/resources/assets/betterend/materialmaps/block/iron_bulb_lantern_yellow.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern.json new file mode 100644 index 00000000..f84c70f5 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_bulb", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_black.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_black.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_black.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_blue.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_blue.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_blue.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_brown.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_brown.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_brown.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_cyan.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_cyan.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_cyan.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_gray.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_gray.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_gray.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_green.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_green.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_green.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_light_blue.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_light_blue.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_light_blue.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_light_gray.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_light_gray.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_light_gray.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_lime.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_lime.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_lime.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_magenta.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_magenta.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_magenta.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_orange.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_orange.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_orange.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_pink.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_pink.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_pink.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_purple.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_purple.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_purple.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_red.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_red.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_red.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_white.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_white.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_white.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_yellow.json b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_yellow.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/thallasium_bulb_lantern_yellow.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/bulb_vine_lantern_ceil.json b/src/main/resources/assets/betterend/models/block/bulb_vine_lantern_ceil.json deleted file mode 100644 index cac5d4b2..00000000 --- a/src/main/resources/assets/betterend/models/block/bulb_vine_lantern_ceil.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", - "parent": "block/block", - "textures": { - "particle": "betterend:block/bulb_vine_lantern", - "texture": "betterend:block/bulb_vine_lantern" - }, - "elements": [ - { - "__comment": "Box1", - "from": [ 4, 4, 4 ], - "to": [ 12, 12, 12 ], - "shade": false, - "faces": { - "down": { "uv": [ 8, 0, 16, 8 ], "texture": "#texture" }, - "up": { "uv": [ 0, 0, 8, 8 ], "texture": "#texture" }, - "north": { "uv": [ 0, 8, 8, 16 ], "texture": "#texture" }, - "south": { "uv": [ 0, 8, 8, 16 ], "texture": "#texture" }, - "west": { "uv": [ 0, 8, 8, 16 ], "texture": "#texture" }, - "east": { "uv": [ 0, 8, 8, 16 ], "texture": "#texture" } - } - }, - { - "__comment": "Box11", - "from": [ 6, 12, 6 ], - "to": [ 10, 13, 10 ], - "faces": { - "up": { "uv": [ 10, 8, 14, 12 ], "texture": "#texture" }, - "north": { "uv": [ 10, 12, 14, 13 ], "texture": "#texture" }, - "south": { "uv": [ 10, 12, 14, 13 ], "texture": "#texture" }, - "west": { "uv": [ 10, 12, 14, 13 ], "texture": "#texture" }, - "east": { "uv": [ 10, 12, 14, 13 ], "texture": "#texture" } - } - }, - { - "__comment": "PlaneX15", - "from": [ 7, 13, 7 ], - "to": [ 7.001, 16, 10 ], - "rotation": { "origin": [ 7, 13, 7 ], "axis": "y", "angle": 45 }, - "shade": false, - "faces": { - "west": { "uv": [ 10, 13, 13, 16 ], "texture": "#texture" }, - "east": { "uv": [ 10, 13, 13, 16 ], "texture": "#texture" } - } - }, - { - "__comment": "PlaneX15", - "from": [ 9, 13, 7 ], - "to": [ 9.001, 16, 10 ], - "rotation": { "origin": [ 9, 13, 7 ], "axis": "y", "angle": -45 }, - "shade": false, - "faces": { - "west": { "uv": [ 10, 13, 13, 16 ], "texture": "#texture" }, - "east": { "uv": [ 10, 13, 13, 16 ], "texture": "#texture" } - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/bulb_vine_lantern_floor.json b/src/main/resources/assets/betterend/models/block/bulb_vine_lantern_floor.json deleted file mode 100644 index ddbed87f..00000000 --- a/src/main/resources/assets/betterend/models/block/bulb_vine_lantern_floor.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", - "parent": "block/block", - "textures": { - "particle": "betterend:block/bulb_vine_lantern", - "texture": "betterend:block/bulb_vine_lantern" - }, - "elements": [ - { - "from": [ 4, 0, 4 ], - "to": [ 12, 8, 12 ], - "shade": false, - "faces": { - "down": { "uv": [ 8, 0, 16, 8 ], "texture": "#texture" }, - "up": { "uv": [ 0, 0, 8, 8 ], "texture": "#texture" }, - "north": { "uv": [ 0, 8, 8, 16 ], "texture": "#texture" }, - "south": { "uv": [ 0, 8, 8, 16 ], "texture": "#texture" }, - "west": { "uv": [ 0, 8, 8, 16 ], "texture": "#texture" }, - "east": { "uv": [ 0, 8, 8, 16 ], "texture": "#texture" } - } - }, - { - "from": [ 6, 8, 6 ], - "to": [ 10, 9, 10 ], - "faces": { - "up": { "uv": [ 10, 8, 14, 12 ], "texture": "#texture" }, - "north": { "uv": [ 10, 12, 14, 13 ], "texture": "#texture" }, - "south": { "uv": [ 10, 12, 14, 13 ], "texture": "#texture" }, - "west": { "uv": [ 10, 12, 14, 13 ], "texture": "#texture" }, - "east": { "uv": [ 10, 12, 14, 13 ], "texture": "#texture" } - } - }, - { - "__comment": "PlaneX15", - "from": [ 7, 9, 7 ], - "to": [ 7.001, 12, 10 ], - "rotation": { "origin": [ 7, 13, 7 ], "axis": "y", "angle": 45 }, - "shade": false, - "faces": { - "west": { "uv": [ 10, 13, 13, 16 ], "texture": "#texture" }, - "east": { "uv": [ 10, 13, 13, 16 ], "texture": "#texture" } - } - }, - { - "__comment": "PlaneX15", - "from": [ 9, 9, 7 ], - "to": [ 9.001, 12, 10 ], - "rotation": { "origin": [ 9, 13, 7 ], "axis": "y", "angle": -45 }, - "shade": false, - "faces": { - "west": { "uv": [ 10, 13, 13, 16 ], "texture": "#texture" }, - "east": { "uv": [ 10, 13, 13, 16 ], "texture": "#texture" } - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/thallasium_anvil.json b/src/main/resources/assets/betterend/models/block/thallasium_anvil.json new file mode 100644 index 00000000..dfbf1030 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/thallasium_anvil.json @@ -0,0 +1,69 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "betterend:block/thallasium_anvil_front", + "front": "betterend:block/thallasium_anvil_front", + "back": "betterend:block/thallasium_anvil_back", + "top": "betterend:block/thallasium_anvil_top", + "panel": "betterend:block/thallasium_anvil_panel", + "bottom": "betterend:block/thallasium_anvil_bottom" + }, + "elements": [ + { + "__comment": "Bottom", + "from": [ 2, 0, 2 ], + "to": [ 14, 4, 14 ], + "faces": { + "down": { "uv": [ 2, 2, 14, 14 ], "texture": "#bottom", "cullface": "down" }, + "up": { "uv": [ 2, 2, 14, 14 ], "texture": "#panel" }, + "north": { "uv": [ 2, 12, 14, 16 ], "texture": "#back" }, + "south": { "uv": [ 2, 12, 14, 16 ], "texture": "#back" }, + "west": { "uv": [ 2, 12, 14, 16 ], "texture": "#front" }, + "east": { "uv": [ 2, 12, 14, 16 ], "texture": "#front" } + } + }, + { + "__comment": "Plate", + "from": [ 4, 4, 3 ], + "to": [ 12, 5, 13 ], + "faces": { + "up": { "uv": [ 4, 3, 12, 13 ], "texture": "#panel" }, + "north": { "uv": [ 4, 11, 12, 12 ], "texture": "#back" }, + "south": { "uv": [ 4, 11, 12, 12 ], "texture": "#back" }, + "west": { "uv": [ 3, 11, 13, 12 ], "texture": "#front" }, + "east": { "uv": [ 3, 11, 13, 12 ], "texture": "#front" } + } + }, + { + "__comment": "Support", + "from": [ 6, 5, 4 ], + "to": [ 10, 10, 12 ], + "faces": { + "north": { "uv": [ 6, 6, 10, 11 ], "texture": "#back" }, + "south": { "uv": [ 6, 6, 10, 11 ], "texture": "#back" }, + "west": { "uv": [ 4, 6, 12, 11 ], "texture": "#front" }, + "east": { "uv": [ 4, 6, 12, 11 ], "texture": "#front" } + } + }, + { + "__comment": "Top", + "from": [ 3, 10, 0 ], + "to": [ 13, 16, 16 ], + "faces": { + "down": { "uv": [ 3, 0, 13, 16 ], "texture": "#top" }, + "up": { "uv": [ 3, 0, 13, 16 ], "texture": "#top" }, + "north": { "uv": [ 3, 0, 13, 6 ], "texture": "#back" }, + "south": { "uv": [ 3, 0, 13, 6 ], "texture": "#back" }, + "west": { "uv": [ 0, 0, 16, 6 ], "texture": "#front" }, + "east": { "uv": [ 0, 0, 16, 6 ], "texture": "#front" } + } + } + ], + "display": { + "fixed": { + "rotation": [ 0, 90, 0 ], + "scale": [ 0.5, 0.5, 0.5 ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/thallasium_anvil.json b/src/main/resources/assets/betterend/models/item/thallasium_anvil.json new file mode 100644 index 00000000..acefa708 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/thallasium_anvil.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/thallasium_anvil" +} diff --git a/src/main/resources/assets/betterend/models/block/bulb_lantern_colored_ceil.json b/src/main/resources/assets/betterend/patterns/block/bulb_lantern_ceil.json similarity index 95% rename from src/main/resources/assets/betterend/models/block/bulb_lantern_colored_ceil.json rename to src/main/resources/assets/betterend/patterns/block/bulb_lantern_ceil.json index 7bb4eab5..2fbd730d 100644 --- a/src/main/resources/assets/betterend/models/block/bulb_lantern_colored_ceil.json +++ b/src/main/resources/assets/betterend/patterns/block/bulb_lantern_ceil.json @@ -2,8 +2,8 @@ "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", "parent": "block/block", "textures": { - "overlay": "betterend:block/bulb_vine_lantern_overlay", - "metal": "betterend:block/bulb_vine_lantern_metal", + "overlay": "betterend:block/%glow%", + "metal": "betterend:block/%metal%", "particle": "#overlay" }, "elements": [ diff --git a/src/main/resources/assets/betterend/models/block/bulb_lantern_colored_floor.json b/src/main/resources/assets/betterend/patterns/block/bulb_lantern_floor.json similarity index 95% rename from src/main/resources/assets/betterend/models/block/bulb_lantern_colored_floor.json rename to src/main/resources/assets/betterend/patterns/block/bulb_lantern_floor.json index a2ff75fe..eff565eb 100644 --- a/src/main/resources/assets/betterend/models/block/bulb_lantern_colored_floor.json +++ b/src/main/resources/assets/betterend/patterns/block/bulb_lantern_floor.json @@ -2,8 +2,8 @@ "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", "parent": "block/block", "textures": { - "overlay": "betterend:block/bulb_vine_lantern_overlay", - "metal": "betterend:block/bulb_vine_lantern_metal", + "overlay": "betterend:block/%glow%", + "metal": "betterend:block/%metal%", "particle": "#overlay" }, "elements": [ diff --git a/src/main/resources/assets/betterend/patterns/blockstate/bulb_lantern.json b/src/main/resources/assets/betterend/patterns/blockstate/bulb_lantern.json index 5948df50..f8917353 100644 --- a/src/main/resources/assets/betterend/patterns/blockstate/bulb_lantern.json +++ b/src/main/resources/assets/betterend/patterns/blockstate/bulb_lantern.json @@ -1,6 +1,6 @@ { "variants": { - "is_floor=false": { "model": "%block%_ceil" }, - "is_floor=true": { "model": "%block%_floor" } + "is_floor=false": { "model": "betterend:pattern/%block%/%block%_ceil" }, + "is_floor=true": { "model": "betterend:pattern/%block%/%block%_floor" } } } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern.png deleted file mode 100644 index ac1adf8dc0a835523be7d1051ad2738a03f63e18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 422 zcmV;X0a^ZuP)+3!Kv)XKQ43HbC~A3E-V%cGW5+; zF<~fL=+_POTSY#`aE}0ZDkm}sV+t7CJ34aNK4>b zj7pF+5pRGAT~-qS{r0>1ZQ|83&b@Gc95nMC^v}1TxHG3S1GpDlJI9?lokakf&Qm3f z05+XP0GrN#0cNspqD^PB2j;2)QW+6yu42GV=E3?trm}V~8z|p%@{_xd%jN+>n)m=s za@0Wa@4SEAf=Vm>ouFU7<#Is&l!97S`a7w=N+_PQ%jN-I8&6hAH7-Ha#K(jZie*OS z5bz=SPxHX0vv?j%=_~@+bQb;2Hl4-uU`l7vJh16}^*o58NY4Y5j#mc!0K(d(>ATcc Qi2wiq07*qoM6N<$f{pdRoB#j- diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb.png new file mode 100644 index 0000000000000000000000000000000000000000..761259c6bde855466f49c712f4494a3e2665731a GIT binary patch literal 766 zcmVDi87{`C_U3j@CH3wITWa+@x31#%m;PnQCi&3joawV6+17jo@x*)k?Xa#}65Cm$P zn532Jln!)Yb~;7s&>4gZa$7>5A!na+_c0)cT$Bbw82VqHbobu7@B9D1`@sRF01AZy z0KHxh0N?j>o9-{&lQZXL)bjNu(MEIX^V90Pi}P~$_))ce!N$f0#uxySBq0n#f*=6E zTFc7KrpQ(XTA{R}R4J>~)zw!OOixdfrYT910AP&4^E@UeCjq#-*b+35K{iOy;~q*W z%!gL#QTj~dEf7$i0)ecblJ>R$(8HdSB*7SiF@_{baz2!6pD6$lK^qTkJWikeRBc}X z5QZV1=izxCVHg77oWnUsb8bOOm9ol`6o68tteRIAB$vX_u%VoDxm5OgzqYo<8$DQG zU#Hz}9^?ZN$}dt$BS=Y^l-m*rKl*7EC(yRy@VAPBJ5Vyz_z0$QyW0Am1W z&dsP{&ehno+bL{UWixGVj?HYJK8HXk@C6bgt4B0{lP%&j8w+Qbv3q6&h5Xy)Yh zS5JIWRKq!dS3lIwb*T3@NX|JroerH&XWM1p_wjw7);B9+t)=D0iNw-h<@zHnWL6Va8-+~8U ze05fJA3S5w8<2_c;?FLX3tx`TgT{qxQmxli{Lc&e-5%9?O*PJ6`#2zd}185qA@!s)p~7o9^Cr+hD;ng!Xaz$v}WSi5pG|aKL8JQ*{WMfZG*^#A|>07*qoM6N<$g4O(OCjbBd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern.png.mcmeta b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb.png.mcmeta similarity index 100% rename from src/main/resources/assets/betterend/textures/block/bulb_vine_lantern.png.mcmeta rename to src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb.png.mcmeta diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_metal.png b/src/main/resources/assets/betterend/textures/block/iron_bulb_vine_lantern_metal.png similarity index 100% rename from src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_metal.png rename to src/main/resources/assets/betterend/textures/block/iron_bulb_vine_lantern_metal.png diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_anvil.png b/src/main/resources/assets/betterend/textures/block/thallasium_anvil.png deleted file mode 100644 index 2d582f321b10d1dbaf3e86780ff00205e284aa01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 380 zcmV-?0fYXDP)Px$Hc3Q5R5*=wl0j>PFc5{mb{DfmgF@Lup~wEC{)ztMUV2=*hqjHz5Z^+giPje4;4!7c zl#Z|WH}+Eq`12{}poxS;TZ^H`pHBcxA+XZA-EcX70M{wVPh+e6 zXgk@~by9KgBx{*Mm_wAA-U4YmV#$;a_xQxl+Bt)rwYh`trWZ!%u~{UoVttl;BuEWj z5XdTPpjNd8!gUJra#2>M5J>zj*e&2ffs8WCzd@>1Q8&vBbVs?ESeCZ9QJ_iW@;Z|> aQ0f<$pVQ#vUoGGO0000Px$VM#5Q_W7oKo}f~B(SEoskDjQ(3=;3uIfR25g$UmdRJe-n-9Pvz|EL= zkw)T46GH$&!KSrRn}A&pb~oK_AnBa;+w9Eu?d)t03DoKh3IK}Z0{|jJMY0ZE4*+m` zcAR6JC8Th$WuZdW@D}{y^NZrgo8T2d)gUNo>#&$sr9T zy^$n;1XF=rA$bI&@qB^M^#rm-3Ie%3oJkW%9@xzmg3%bnETbQHBW4)@r0xr`e{n<4 zpC9RU|B3FNUeS5yBo7#hy2i(56J!#I3>EF+44r|CqON5ZP#hnffeVWicz`kqgs#V5 zVUc-KGMHiMdoz)T%M*dai(0)w6~{+ps8aTey2jUOAt48Qha2d1zfr21LU{gzWndCc zv3;~7{0APx$0!c(cR5*>zk}+<=KoCWrA(6;N!YJSrbfl!@7Mz4OMRJPdAl!kTk_IU)ia-Wo z9NAX9SaK|<+LhOMrF3Mf(X8IgpT7gw4o4-E*Y^@Ycmw^|>A3)8QLJk+I03MFdvO46 zs@-PKQ+!zvCMD-MInrW#-cmoT3Z@}j`HB`2$3KR@j z;mwycJTMxl$-o8tu?YYekG$pvot|rz{ke}AJqTS_=3XeU!S#Bhf-H&~cdo;}ER1h8 z6x1izz3^qhZu@OF5zvM;O%9V%o2)_~k_=9SNlCx!7=~5XIm(Px$f=NU{R5*==lTAwkK^%u4CxvxwQ#Or?LMkW-g5GX*>E$EUm#98Lr#^ttu}fWp zE-3_^0ujZ^)kWK!1ar4byUglZbDG)ZdFKEB%}ngDaO(jG+X28ejnG{E*K2ne9&vz_ zmLR{g%*Je-x*RaC&rz2HYSmB5w!}3JmQ0;wdYS2|81woBPjBCp?urOuJLKmw3Oqqw z4rqONlx+#{3#UTxSEq}#nh4i4BH^!2mz0(m3ok5AqUW**AQEoKJ~MhE5-!`4)`y3* zn#7JTuRT8?X*B`Rb6J3~YjwniKkT1fd273?kvkV}?s+^v2{B?=pk>k{@N?M;Rr066 zHH{Eld2I(lYMJ!^0%1ELSPe4jB8>=o?M~41@G1No;`Zr1zMdYNF?|+&`2?Li_Px$>q$gGR5*=wlRb+XK^Vt>u6wY~MR!?UIVIt+J+MfbBUK=QE7Io^ByB!Ns#A;ozD`xWkC6GNajXz_%2eom-VmH-F}t=l}9Ng;(Ex?D%(_*#dxVSpM(b zNCkiw_!y~ho!Np?GvvGx(09Z&3c#=vO>N+B-G1MFT`&h52ixW!zsipnp^LLgiK}0pC^VB*Apec#~Oy@f* z;jp+rS|g&G^`u%Uq!PAa*>+y4#OgmRz8%B>T(lyxraGSBII{)Q`3^7e8S52Z;2#zL z`YmaN0x$5XRtk85Pk*#dB^asf?{#rv>E(+vIeEF67fwdmNJYs%#Ykm~mnzxw!brtX zZ!l6Z)~i&47x=V7VLJo1^Pv|25BGlnNX+Ung^XU7_w67)N@1us=y<|dulCGzja0PH zTzc`uW-G66xXVpsegYGdQqS1BfQ_-&=^l-8=1+#p>zh3@T`%yN&Ud_h|Hhh^PhqJN z#yTW1D=rR}383)u(^tFB8BKUxsyudxi>St5o`?vo$^~e@00000NkvXXu0mjfbo~S2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_anvil_top.png b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_top.png index 4eed87bb13d6f617baa44d1ce4d608846367535a..b83f089dbe19a8dec8bbabaffa03664cfe24449d 100644 GIT binary patch delta 290 zcmV+-0p0$*0?7i9Fn<99Nkl*P#Bqzcmv*mm*CkL zkaz&f%E*Gm%7&0itGE><0}vJ*`4Sxd$+z$LoZqs*s`KkbXU55TYj4pu8h|ucEG{pE zS>MB}le(hJ1c&l~m)#euO~=#olGC$e%1m%~^WdCMoXL9o3x7{~_(Q*2q7(l*rgQWx3_2fo0wcm+@36+DXh+yEO(5Q|Lq!pJE=o3>d_g;Cqb*gQY8!4D46vmGCbgiHzKk@Gf3I3G>IM4Rz%h b2moJ;Fpzb| diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_bulb_vine_lantern_metal.png b/src/main/resources/assets/betterend/textures/block/thallasium_bulb_vine_lantern_metal.png new file mode 100644 index 0000000000000000000000000000000000000000..c110d90384ec19f5e00150907eef79f6d7cf8f84 GIT binary patch literal 402 zcmV;D0d4+?P)Px$Oi4sRR5*>LQ!#48KoFceMS?xsoC+5vwbLm05BY(cX(EJV%k| zXq*d;M1=kNT_ie1Rv*Oo=bK1$ibZS$5#c6MDoi^Ur?8>D_5S(Q&yQQdwfS)?cGJv9 z)<6OX&7<)Iqwxgi;uPd_1A1Ui_6ygrTCF;77(hf}Gb>?l0AM%Ge18~ovTYcj&^ESl zF5J9aE<2ty&O!V;#-Y0xu@U?AyI`fhGL; zvM)h$L%+b>Y&HwBD{D|$gZ4Qc4=&|wtsPcyEoZHDhi3!BfT5fjky6O&gXsGr%d*6# wPJLw!w(+gMdwlVgHQ3atZ~uoxr=6Ga3n(wyksAWc&+Ly#M_8I#^(oTp0 z2?i#RSojw}VgMut23`_Ohy`{QSO9gP5|nbz!ve&!md^M3?)$xemnJ8U_HG{7%yC?A zajY=K<}LBqm}383iz|ptn}V^E5y$mCipQF3`}=lq-1PH;gz zthIzYwuEcg!#<4|R!Oiyl~58@$#1BW>mLL#*IHI06)7ED=)c25PdaGRWuSzzl)C)2{E3Mzrs{H@JW(HhEQ6 z6&5l<&6H#vY8j}?`(+KvavN$9$1TtQ2C8L$fU>M{5Ji6lJ2otn&_m2-*FzO71%8DG zi6>#6)JVt#GwrmN7M2BzengRP<6^<&nc1T2I#4w1Qijci&ZR z7tY#2yiEEK+a#R~`>cJ1tWTX>uGU$PJ6kM_l!l($ODik6b-R1k$zR{yeY*1S)p*aI z3z_#5U#3z2hL>PCeY^J_mrkdzr(V~d-CEn9TmIPhRy?#}&-M>rKcBkzDL0&db!gyG zW%rB2PhRf2x!nI|Yicg_`N~!K{NwePcPgn#q31~NwmYmFpGlp#@oeeVc-&!&qZ5Uj IhfiPl1`-C&xBvhE delta 109 zcmV-z0FwW{3yJ}dBxX@bL_t(|+GF_t|33q%c=g-k|A83HCQI}AFZVzO{3qLh2Y+7w zhq;0*+d&4vTtSinvz}}LYldMEpHu_DhJb7a(I7s_VStWD4Hz|mDh2=mP09oceW3(+ P00000NkvXXu0mjf)QK$U diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_wall_e.png b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_wall_e.png index fc23c16ebb1e3345d568ac33960b49cfccc60ec0..41c321e9e93cac3c61dfcdf0fe327713c77922ef 100644 GIT binary patch literal 1456 zcmbVM%Wu?17&lT0Z3Iy(RYHVA2Gc_ewa1UmZal(-u$z*V>NE-~B^8G~)R2;a1lndg5goJu2SJX=nRf{V+fIv(uWU9jUL>*5Utd{=Pj0-?_*86n^g{E1zeYHgh|F4}5oe=D4Q4^*C&7s?Fe2 z!enGpE}O#aM+u-c?aX37p=?Vi)D-P7_VwRy?&&DxzP>RZSV2-1op5C*6&H6_8*FEb zd0bySi_Y{35JW;z)Q`GxM*6-!wq3)riB%@9hsKW%+EU&k>$OkDx?tz)9ij8V==n{r$EI#@b#Axa9`I2(rv0*3oE!M17T zE)9X46}V(O?GBZ5hDBFIB32n-?E;&0q>@=jzJj{AenA0*HV6tGFSR9#3Kf}Jz6NfL z1M*UI))*uLuZv7>r%Wtg12a$N-Xx@&3aVtyG8vkTS!WZ&)Sb&J)KvZMnpnzW#;QIJDeB%g=XnP$2r2mrc5iFA})uX9cYD2XCPeoy{ALrdTas~g>%i-N~ zojZZUILMd99D+?T$wUm}D}_0A>YE=f!Hi?|+EQcTF1w5lJlWr$+uhjnpUvHAHPL%N z4tfvwrf)8MKlSKX{r=$_55E24;JwACk7j-~&mH>U*dNdSy7bkbi)X7ppPRkiK5_s2 vouB5eKRx=(`%_yWuymqc!Mn5870uMN-5vYZjdl84K2z(7BvmImr%oQXVFzd+{ux1zr@kuoRYzW9^5Dns!3}7(8fk?PU00000NkvXXu0mjf66h|9 diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_nugget.png b/src/main/resources/assets/betterend/textures/item/thallasium_nugget.png new file mode 100644 index 0000000000000000000000000000000000000000..f9a9c2092135b8b8f6f6e96e60d90b829992fb75 GIT binary patch literal 1488 zcmbVMU5M019G|0QvGy#MN)ZJOxfX0|b|%SwWiUOqoAYj=xjW9Kx4t=-%46k%AAAvdB8cKS*^f|)^(!!$uiyOs z-~W^Iv(wwQ?%E0f*jAmf7R0qzjtGki0Q3x=5P$a+wUb~41D|DP5|EA@M?8l zw?D@Y^RvWdOElZ{LxBe1z+^Wh&NAiF5^Z{cDc}3~vMhP7DKF-2WQP^n@@7^edT4dF z=BzF|hAU5gDjn!zLEuwPq^{o%V%#<5J}(yQh`=;VG)(`*@EJz zIZY}WS+#%+Ew^9NkXnSO2vuD{Dn9k zq9#-g!+=PGnx+VZ688d5x=IjFj2J8$JCPT1j|Eb~NS4?NH)Wyezyv=`X@hv^CgCvH zB_UL^C^4xIbe$9zu0-v=aMyvfO??{hSYXu@E4*aeDg2qVzMrCFK6OlJG_>uR=(yGk zDO{j2TZtSxbxcT{7%3LE7-w;d{f`~#b!ttBD-k7}MK#9Sqd?7%SfolN2~0`ax99~f z>%<==f`)IXML0EO4QZ+fnWE)uD2KHIR?#O&#|RCewnzn+aPo3s=6a3Z3!$!q8!YmP zaFpkhCWT?p>`Sw4Tn%DQ0*6*DQx>XbJYp(`J%DZ zK$_u<-doIBNrE_f@4n*uxyTbmMB1;2&`*;7U+!0)~gJhZZA+bq284X1HibS7!|J~cN=y6|Gt#Yk&&3U}JIr+wiCyxFO z)-(0ojkPNJ{^H!kb#UhIv-RB>FZklCtNMd;7pIHkzlpQ;@#&0Teg|#deYAIc?(&n& zkIg$=TmR#yGhd$_(?2$U-BkwXAKw3K@yLT)-)x-J!JXqf!L3u5_Ow75qF-=t$KmZ) g4z6WRU$AbDfeNO7{_{a~PttR%Q?u3&pB-6y3P|JEDgXcg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/thermal fungus.png b/src/main/resources/assets/betterend/textures/item/thermal fungus.png similarity index 100% rename from src/main/resources/assets/betterend/textures/block/thermal fungus.png rename to src/main/resources/assets/betterend/textures/item/thermal fungus.png From 5da69761583ab13a59174a59fcd36b43517865d7 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 25 Jan 2021 07:31:55 +0300 Subject: [PATCH 225/463] Chandeliers --- .../ru/betterend/blocks/ChandelierBlock.java | 39 ++++- .../blocks/complex/MetalMaterial.java | 2 +- .../java/ru/betterend/patterns/Patterns.java | 4 + .../ru/betterend/recipe/CraftingRecipes.java | 3 + .../java/ru/betterend/registry/EndBlocks.java | 6 + .../blockstates/thallasium_chandelier.json | 10 -- .../assets/betterend/lang/en_us.json | 24 +++- .../assets/betterend/lang/ru_ru.json | 24 +++- .../lights/item/gold_chandelier.json | 7 + .../lights/item/iron_chandelier.json | 7 + .../betterend/lights/item/lumecorn_rod.json | 2 +- .../lights/item/thallasium_chandelier.json | 7 + .../materialmaps/block/gold_chandelier.json | 3 + .../materialmaps/block/iron_chandelier.json | 3 + .../materialmaps/item/gold_chandelier.json | 3 + .../materialmaps/item/iron_chandelier.json | 3 + .../item/thallasium_chandelier.json | 4 +- .../models/item/thallasium_chandelier.json | 6 - .../patterns/block/chandelier_ceil.json | 134 ++++++++++++++++++ .../patterns/block/chandelier_floor.json | 133 +++++++++++++++++ .../patterns/block/chandelier_wall.json | 105 ++++++++++++++ .../patterns/blockstate/chandelier.json | 10 ++ .../block/gold_bulb_vine_lantern_metal.png | Bin 0 -> 420 bytes .../textures/block/gold_chandelier_ceil.png | Bin 0 -> 314 bytes .../textures/block/gold_chandelier_floor.png | Bin 0 -> 471 bytes .../textures/block/gold_chandelier_wall.png | Bin 0 -> 352 bytes .../textures/block/iron_chandelier_ceil.png | Bin 0 -> 340 bytes .../textures/block/iron_chandelier_floor.png | Bin 0 -> 502 bytes .../textures/block/iron_chandelier_wall.png | Bin 0 -> 373 bytes ...er.png => thallasium_chandelier_floor.png} | Bin .../textures/item/gold_chandelier.png | Bin 0 -> 341 bytes .../textures/item/iron_chandelier.png | Bin 0 -> 369 bytes .../textures/item/thallasium_chandelier.png | Bin 228 -> 399 bytes .../item/thallasium_chandelier_item.png | Bin 399 -> 0 bytes 34 files changed, 515 insertions(+), 24 deletions(-) delete mode 100644 src/main/resources/assets/betterend/blockstates/thallasium_chandelier.json create mode 100644 src/main/resources/assets/betterend/lights/item/gold_chandelier.json create mode 100644 src/main/resources/assets/betterend/lights/item/iron_chandelier.json create mode 100644 src/main/resources/assets/betterend/lights/item/thallasium_chandelier.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/gold_chandelier.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/iron_chandelier.json create mode 100644 src/main/resources/assets/betterend/materialmaps/item/gold_chandelier.json create mode 100644 src/main/resources/assets/betterend/materialmaps/item/iron_chandelier.json delete mode 100644 src/main/resources/assets/betterend/models/item/thallasium_chandelier.json create mode 100644 src/main/resources/assets/betterend/patterns/block/chandelier_ceil.json create mode 100644 src/main/resources/assets/betterend/patterns/block/chandelier_floor.json create mode 100644 src/main/resources/assets/betterend/patterns/block/chandelier_wall.json create mode 100644 src/main/resources/assets/betterend/patterns/blockstate/chandelier.json create mode 100644 src/main/resources/assets/betterend/textures/block/gold_bulb_vine_lantern_metal.png create mode 100644 src/main/resources/assets/betterend/textures/block/gold_chandelier_ceil.png create mode 100644 src/main/resources/assets/betterend/textures/block/gold_chandelier_floor.png create mode 100644 src/main/resources/assets/betterend/textures/block/gold_chandelier_wall.png create mode 100644 src/main/resources/assets/betterend/textures/block/iron_chandelier_ceil.png create mode 100644 src/main/resources/assets/betterend/textures/block/iron_chandelier_floor.png create mode 100644 src/main/resources/assets/betterend/textures/block/iron_chandelier_wall.png rename src/main/resources/assets/betterend/textures/block/{thallasium_chandelier.png => thallasium_chandelier_floor.png} (100%) create mode 100644 src/main/resources/assets/betterend/textures/item/gold_chandelier.png create mode 100644 src/main/resources/assets/betterend/textures/item/iron_chandelier.png delete mode 100644 src/main/resources/assets/betterend/textures/item/thallasium_chandelier_item.png diff --git a/src/main/java/ru/betterend/blocks/ChandelierBlock.java b/src/main/java/ru/betterend/blocks/ChandelierBlock.java index 6d7a3ffb..aa711298 100644 --- a/src/main/java/ru/betterend/blocks/ChandelierBlock.java +++ b/src/main/java/ru/betterend/blocks/ChandelierBlock.java @@ -1,5 +1,6 @@ package ru.betterend.blocks; +import java.io.Reader; import java.util.EnumMap; import com.google.common.collect.Maps; @@ -8,20 +9,24 @@ import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.ShapeContext; +import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; +import net.minecraft.util.registry.Registry; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; import net.minecraft.world.BlockView; import ru.betterend.blocks.basis.AttachedBlock; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; -public class ChandelierBlock extends AttachedBlock implements IRenderTypeable { +public class ChandelierBlock extends AttachedBlock implements IRenderTypeable, BlockPatterned { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); - public ChandelierBlock(FabricBlockSettings settings) { - super(settings.noCollision().nonOpaque().requiresTool().luminance(15)); + public ChandelierBlock(Block source) { + super(FabricBlockSettings.copyOf(source).noCollision().nonOpaque().requiresTool().luminance(15)); } @Override @@ -34,6 +39,34 @@ public class ChandelierBlock extends AttachedBlock implements IRenderTypeable { return BOUNDING_SHAPES.get(state.get(FACING)); } + @Override + public String getStatesPattern(Reader data) { + Identifier blockId = Registry.BLOCK.getId(this); + return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); + } + + @Override + public String getModelPattern(String block) { + Identifier blockId = Registry.BLOCK.getId(this); + if (block.contains("item")) { + return Patterns.createJson(Patterns.ITEM_GENERATED, "item/" + blockId.getPath()); + } + else if (block.contains("ceil")) { + return Patterns.createJson(Patterns.BLOCK_CHANDELIER_CEIL, blockId.getPath()); + } + else if (block.contains("wall")) { + return Patterns.createJson(Patterns.BLOCK_CHANDELIER_WALL, blockId.getPath()); + } + else { + return Patterns.createJson(Patterns.BLOCK_CHANDELIER_FLOOR, blockId.getPath()); + } + } + + @Override + public Identifier statePatternId() { + return Patterns.STATE_CHANDELIER; + } + static { BOUNDING_SHAPES.put(Direction.UP, Block.createCuboidShape(5, 0, 5, 11, 13, 11)); BOUNDING_SHAPES.put(Direction.DOWN, Block.createCuboidShape(5, 3, 5, 11, 16, 11)); diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index a186e3eb..c451d59b 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -74,7 +74,7 @@ public class MetalMaterial { chain = EndBlocks.registerBlock(name + "_chain", new EndChainBlock(color)); plate = EndBlocks.registerBlock(name + "_plate", new EndWoodenPlateBlock(block)); - chandelier = EndBlocks.registerBlock(name + "_chandelier", new ChandelierBlock(materialBlock)); + chandelier = EndBlocks.registerBlock(name + "_chandelier", new ChandelierBlock(block)); bulb_lantern = EndBlocks.registerBlock(name + "_bulb_lantern", new BulbVineLanternBlock(lantern)); bulb_lantern_colored = new ColoredMaterial(BulbVineLanternColoredBlock::new, bulb_lantern, false); diff --git a/src/main/java/ru/betterend/patterns/Patterns.java b/src/main/java/ru/betterend/patterns/Patterns.java index 94722c6f..3493a0ff 100644 --- a/src/main/java/ru/betterend/patterns/Patterns.java +++ b/src/main/java/ru/betterend/patterns/Patterns.java @@ -41,6 +41,7 @@ public class Patterns { public final static Identifier STATE_BARS = BetterEnd.makeID("patterns/blockstate/bars.json"); public final static Identifier STATE_ANVIL = BetterEnd.makeID("patterns/blockstate/anvil.json"); public final static Identifier STATE_CHAIN = BetterEnd.makeID("patterns/blockstate/chain.json"); + public final static Identifier STATE_CHANDELIER = BetterEnd.makeID("patterns/blockstate/chandelier.json"); //Models Block public final static Identifier BLOCK_EMPTY = BetterEnd.makeID("patterns/block/empty.json"); @@ -91,6 +92,9 @@ public class Patterns { public final static Identifier BLOCK_BARS_SIDE = BetterEnd.makeID("patterns/block/bars_side.json"); public final static Identifier BLOCK_ANVIL = BetterEnd.makeID("patterns/block/anvil.json"); public final static Identifier BLOCK_CHAIN = BetterEnd.makeID("patterns/block/chain.json"); + public final static Identifier BLOCK_CHANDELIER_FLOOR = BetterEnd.makeID("patterns/block/chandelier_floor.json"); + public final static Identifier BLOCK_CHANDELIER_WALL = BetterEnd.makeID("patterns/block/chandelier_wall.json"); + public final static Identifier BLOCK_CHANDELIER_CEIL = BetterEnd.makeID("patterns/block/chandelier_ceil.json"); //Models Item public final static Identifier ITEM_WALL = BetterEnd.makeID("patterns/item/pattern_wall.json"); diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index b5cafe59..897399e5 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -196,6 +196,9 @@ public class CraftingRecipes { .addMaterial('A', EndItems.AMBER_GEM) .addMaterial('P', Items.ENDER_PEARL) .build(); + + GridRecipe.make("iron_chandelier", EndBlocks.IRON_CHANDELIER).setShape("I#I", " # ").addMaterial('#', Items.IRON_INGOT).addMaterial('I', EndItems.LUMECORN_ROD).setGroup("end_metal_chandelier").build(); + GridRecipe.make("gold_chandelier", EndBlocks.GOLD_CHANDELIER).setShape("I#I", " # ").addMaterial('#', Items.GOLD_INGOT).addMaterial('I', EndItems.LUMECORN_ROD).setGroup("end_metal_chandelier").build(); } private static void registerLantern(String name, Block lantern, Block slab) { diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 033b6bc3..5489b217 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -20,6 +20,7 @@ import ru.betterend.blocks.BulbVineBlock; import ru.betterend.blocks.BulbVineLanternBlock; import ru.betterend.blocks.BulbVineLanternColoredBlock; import ru.betterend.blocks.BulbVineSeedBlock; +import ru.betterend.blocks.ChandelierBlock; import ru.betterend.blocks.CharniaBlock; import ru.betterend.blocks.ChorusGrassBlock; import ru.betterend.blocks.DenseEmeraldIceBlock; @@ -306,6 +307,11 @@ public class EndBlocks { public static final Block IRON_BULB_LANTERN = registerBlock("iron_bulb_lantern", new BulbVineLanternBlock()); public static final ColoredMaterial IRON_BULB_LANTERN_COLORED = new ColoredMaterial(BulbVineLanternColoredBlock::new, IRON_BULB_LANTERN, false); + public static final Block GOLD_BULB_LANTERN = registerBlock("gold_bulb_lantern", new BulbVineLanternBlock()); + public static final ColoredMaterial GOLD_BULB_LANTERN_COLORED = new ColoredMaterial(BulbVineLanternColoredBlock::new, GOLD_BULB_LANTERN, false); + + public static final Block IRON_CHANDELIER = EndBlocks.registerBlock("iron_chandelier", new ChandelierBlock(Blocks.GOLD_BLOCK)); + public static final Block GOLD_CHANDELIER = EndBlocks.registerBlock("gold_chandelier", new ChandelierBlock(Blocks.GOLD_BLOCK)); // Blocks With Entity // public static final Block END_STONE_SMELTER = registerBlock("end_stone_smelter", new EndStoneSmelter()); diff --git a/src/main/resources/assets/betterend/blockstates/thallasium_chandelier.json b/src/main/resources/assets/betterend/blockstates/thallasium_chandelier.json deleted file mode 100644 index 1d3659ef..00000000 --- a/src/main/resources/assets/betterend/blockstates/thallasium_chandelier.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "facing=up": { "model": "betterend:block/thallasium_chandelier" }, - "facing=down": { "model": "betterend:block/thallasium_chandelier_ceil" }, - "facing=north": { "model": "betterend:block/thallasium_chandelier_wall", "y": 180 }, - "facing=south": { "model": "betterend:block/thallasium_chandelier_wall" }, - "facing=east": { "model": "betterend:block/thallasium_chandelier_wall", "y": 270 }, - "facing=west": { "model": "betterend:block/thallasium_chandelier_wall", "y": 90 } - } -} diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index e0839b80..fd331ffe 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -379,6 +379,24 @@ "block.betterend.iron_bulb_lantern_white": "White Iron Bulb Lantern", "block.betterend.iron_bulb_lantern_yellow": "Yellow Iron Bulb Lantern", + "block.betterend.gold_bulb_lantern": "Gold Bulb Lantern", + "block.betterend.gold_bulb_lantern_black": "Black Gold Bulb Lantern", + "block.betterend.gold_bulb_lantern_blue": "Blue Gold Bulb Lantern", + "block.betterend.gold_bulb_lantern_brown": "Brown Gold Bulb Lantern", + "block.betterend.gold_bulb_lantern_cyan": "Cyan Gold Bulb Lantern", + "block.betterend.gold_bulb_lantern_gray": "Gray Gold Bulb Lantern", + "block.betterend.gold_bulb_lantern_green": "Green Gold Bulb Lantern", + "block.betterend.gold_bulb_lantern_light_blue": "Light Blue Gold Bulb Lantern", + "block.betterend.gold_bulb_lantern_light_gray": "Light Gray Gold Bulb Lantern", + "block.betterend.gold_bulb_lantern_lime": "Lime Gold Bulb Lantern", + "block.betterend.gold_bulb_lantern_magenta": "Magenta Gold Bulb Lantern", + "block.betterend.gold_bulb_lantern_orange": "Orange Gold Bulb Lantern", + "block.betterend.gold_bulb_lantern_pink": "Pink Gold Bulb Lantern", + "block.betterend.gold_bulb_lantern_purple": "Purple Gold Bulb Lantern", + "block.betterend.gold_bulb_lantern_red": "Red Gold Bulb Lantern", + "block.betterend.gold_bulb_lantern_white": "White Gold Bulb Lantern", + "block.betterend.gold_bulb_lantern_yellow": "Yellow Gold Bulb Lantern", + "block.betterend.thallasium_bulb_lantern": "Thallasium Bulb Lantern", "block.betterend.thallasium_bulb_lantern_black": "Black Thallasium Bulb Lantern", "block.betterend.thallasium_bulb_lantern_blue": "Blue Thallasium Bulb Lantern", @@ -616,5 +634,9 @@ "block.betterend.thallasium_anvil": "Thallasium Anvil", "block.betterend.thallasium_chain": "Thallasium Chain", "block.betterend.thallasium_slab": "Thallasium Slab", - "block.betterend.thallasium_stairs": "Thallasium Stairs" + "block.betterend.thallasium_stairs": "Thallasium Stairs", + + "block.betterend.gold_chandelier": "Gold Chandelier", + "block.betterend.iron_chandelier": "Iron Chandelier", + "item.betterend.thallasium_nugget": "Thallasium Nugget" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index f9540b90..d7126914 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -381,6 +381,24 @@ "block.betterend.iron_bulb_lantern_white": "Белый железный луковичный фонарь", "block.betterend.iron_bulb_lantern_yellow": "Жёлтый железный луковичный фонарь", + "block.betterend.gold_bulb_lantern": "Золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_black": "Чёрный золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_blue": "Синий золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_brown": "Коричневый золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_cyan": "Циановый золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_gray": "Серый золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_green": "Зелёный золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_light_blue": "Голубой золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_light_gray": "Светло-серый золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_lime": "Лаймовый золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_magenta": "Фиолетовый золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_orange": "Оранжевый золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_pink": "Розовый золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_purple": "Пурпурный золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_red": "Красный золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_white": "Белый золотой луковичный фонарь", + "block.betterend.gold_bulb_lantern_yellow": "Жёлтый золотой луковичный фонарь", + "block.betterend.thallasium_bulb_lantern": "Талласиевый луковичный фонарь", "block.betterend.thallasium_bulb_lantern_black": "Чёрный талласиевый луковичный фонарь", "block.betterend.thallasium_bulb_lantern_blue": "Синий талласиевый луковичный фонарь", @@ -618,5 +636,9 @@ "block.betterend.thallasium_anvil": "Талласиевая наковальня", "block.betterend.thallasium_chain": "Талласиевая цепь", "block.betterend.thallasium_slab": "Талласиевая плита", - "block.betterend.thallasium_stairs": "Талласиевые ступени" + "block.betterend.thallasium_stairs": "Талласиевые ступени", + + "block.betterend.gold_chandelier": "Золотой канделябр", + "block.betterend.iron_chandelier": "Железный канделябр", + "item.betterend.thallasium_nugget": "Талласиевый самородок" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/lights/item/gold_chandelier.json b/src/main/resources/assets/betterend/lights/item/gold_chandelier.json new file mode 100644 index 00000000..044e62bf --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/gold_chandelier.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.2, + "red": 0.5, + "green": 1.0, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/iron_chandelier.json b/src/main/resources/assets/betterend/lights/item/iron_chandelier.json new file mode 100644 index 00000000..044e62bf --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/iron_chandelier.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.2, + "red": 0.5, + "green": 1.0, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/lumecorn_rod.json b/src/main/resources/assets/betterend/lights/item/lumecorn_rod.json index 44c23281..044e62bf 100644 --- a/src/main/resources/assets/betterend/lights/item/lumecorn_rod.json +++ b/src/main/resources/assets/betterend/lights/item/lumecorn_rod.json @@ -1,5 +1,5 @@ { - "intensity": 0.5, + "intensity": 0.2, "red": 0.5, "green": 1.0, "blue": 0.0, diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_chandelier.json b/src/main/resources/assets/betterend/lights/item/thallasium_chandelier.json new file mode 100644 index 00000000..044e62bf --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_chandelier.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.2, + "red": 0.5, + "green": 1.0, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/gold_chandelier.json b/src/main/resources/assets/betterend/materialmaps/block/gold_chandelier.json new file mode 100644 index 00000000..73a05561 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/gold_chandelier.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_green" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/iron_chandelier.json b/src/main/resources/assets/betterend/materialmaps/block/iron_chandelier.json new file mode 100644 index 00000000..73a05561 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/iron_chandelier.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_green" +} diff --git a/src/main/resources/assets/betterend/materialmaps/item/gold_chandelier.json b/src/main/resources/assets/betterend/materialmaps/item/gold_chandelier.json new file mode 100644 index 00000000..73a05561 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/gold_chandelier.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_green" +} diff --git a/src/main/resources/assets/betterend/materialmaps/item/iron_chandelier.json b/src/main/resources/assets/betterend/materialmaps/item/iron_chandelier.json new file mode 100644 index 00000000..73a05561 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/iron_chandelier.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_green" +} diff --git a/src/main/resources/assets/betterend/materialmaps/item/thallasium_chandelier.json b/src/main/resources/assets/betterend/materialmaps/item/thallasium_chandelier.json index 69a88e3b..73a05561 100644 --- a/src/main/resources/assets/betterend/materialmaps/item/thallasium_chandelier.json +++ b/src/main/resources/assets/betterend/materialmaps/item/thallasium_chandelier.json @@ -1 +1,3 @@ -{} +{ + "defaultMaterial": "betterend:glow_green" +} diff --git a/src/main/resources/assets/betterend/models/item/thallasium_chandelier.json b/src/main/resources/assets/betterend/models/item/thallasium_chandelier.json deleted file mode 100644 index 7668a892..00000000 --- a/src/main/resources/assets/betterend/models/item/thallasium_chandelier.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "betterend:item/thallasium_chandelier" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/chandelier_ceil.json b/src/main/resources/assets/betterend/patterns/block/chandelier_ceil.json new file mode 100644 index 00000000..d39683f3 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/chandelier_ceil.json @@ -0,0 +1,134 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/%texture%_ceil", + "texture": "betterend:block/%texture%_ceil", + "rod": "betterend:block/%texture%_floor" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 6, 15, 6 ], + "to": [ 10, 16, 10 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 4, 4 ], "texture": "#rod" }, + "up": { "uv": [ 0, 0, 4, 4 ], "texture": "#rod" }, + "north": { "uv": [ 0, 4, 4, 5 ], "texture": "#rod" }, + "south": { "uv": [ 0, 4, 4, 5 ], "texture": "#rod" }, + "west": { "uv": [ 0, 4, 4, 5 ], "texture": "#rod" }, + "east": { "uv": [ 0, 4, 4, 5 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 2, 2, 2 ], + "to": [ 2.001, 15, 19 ], + "rotation": { "origin": [ 2, 2, 2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 13 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 14, 2, 2 ], + "to": [ 14.001, 15, 19 ], + "rotation": { "origin": [ 14, 2, 2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 13 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 2, 3, 2 ], + "to": [ 2.001, 9, 7.5 ], + "rotation": { "origin": [ 2, 3, 2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 6, 3, 2 ], + "to": [ 6.001, 9, 7.5 ], + "rotation": { "origin": [ 6, 3, 2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 14, 3, 2 ], + "to": [ 14.001, 9, 7.5 ], + "rotation": { "origin": [ 14, 3, 2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 10, 3, 2 ], + "to": [ 10.001, 9, 7.5 ], + "rotation": { "origin": [ 10, 3, 2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 2, 3, 10 ], + "to": [ 2.001, 9, 15.5 ], + "rotation": { "origin": [ 2, 3, 10 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 6, 3, 10 ], + "to": [ 6.001, 9, 15.5 ], + "rotation": { "origin": [ 6, 3, 10 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 14, 3, 10 ], + "to": [ 14.001, 9, 15.5 ], + "rotation": { "origin": [ 14, 3, 10 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 10, 3, 10 ], + "to": [ 10.001, 9, 15.5 ], + "rotation": { "origin": [ 10, 3, 10 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" }, + "east": { "uv": [ 11, 6, 16, 0 ], "texture": "#rod" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/chandelier_floor.json b/src/main/resources/assets/betterend/patterns/block/chandelier_floor.json new file mode 100644 index 00000000..54123380 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/chandelier_floor.json @@ -0,0 +1,133 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/%texture%_floor", + "texture": "betterend:block/%texture%_floor" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 6, 0, 6 ], + "to": [ 10, 1, 10 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 4, 4 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 4, 4 ], "texture": "#texture" }, + "north": { "uv": [ 0, 4, 4, 5 ], "texture": "#texture" }, + "south": { "uv": [ 0, 4, 4, 5 ], "texture": "#texture" }, + "west": { "uv": [ 0, 4, 4, 5 ], "texture": "#texture" }, + "east": { "uv": [ 0, 4, 4, 5 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 2, 1, 2 ], + "to": [ 2.001, 10, 19 ], + "rotation": { "origin": [ 2, 1, 2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 7, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 7, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 14, 1, 2 ], + "to": [ 14.001, 10, 19 ], + "rotation": { "origin": [ 14, 1, 2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 7, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 7, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 2, 10, 2 ], + "to": [ 2.001, 16, 7.5 ], + "rotation": { "origin": [ 2, 10, 2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 6, 10, 2 ], + "to": [ 6.001, 16, 7.5 ], + "rotation": { "origin": [ 6, 10, 2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 10, 10, 2 ], + "to": [ 10.001, 16, 7.5 ], + "rotation": { "origin": [ 10, 10, 2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 14, 10, 2 ], + "to": [ 14.001, 16, 7.5 ], + "rotation": { "origin": [ 14, 10, 2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 2, 10, 10 ], + "to": [ 2.001, 16, 15.5 ], + "rotation": { "origin": [ 2, 10, 10 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 6, 10, 10 ], + "to": [ 6.001, 16, 15.5 ], + "rotation": { "origin": [ 6, 10, 10 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 10, 10, 10 ], + "to": [ 10.001, 16, 15.5 ], + "rotation": { "origin": [ 10, 10, 10 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX5", + "from": [ 14, 10, 10 ], + "to": [ 14.001, 16, 15.5 ], + "rotation": { "origin": [ 14, 10, 10 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/chandelier_wall.json b/src/main/resources/assets/betterend/patterns/block/chandelier_wall.json new file mode 100644 index 00000000..e469fb1f --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/chandelier_wall.json @@ -0,0 +1,105 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/%texture%_wall", + "texture": "betterend:block/%texture%_wall" + }, + "elements": [ + { + "__comment": "PlaneZ2", + "from": [ 4, 2, 2 ], + "to": [ 12, 8, 2.001 ], + "shade": false, + "faces": { + "north": { "uv": [ 4, 8, 12, 14 ], "texture": "#texture" }, + "south": { "uv": [ 4, 8, 12, 14 ], "texture": "#texture" } + } + }, + { + "__comment": "Box3", + "from": [ 7, 3, 0 ], + "to": [ 9, 5, 3 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "up": { "uv": [ 0, 11, 2, 8 ], "texture": "#texture" }, + "north": { "uv": [ 7, 11, 9, 13 ], "texture": "#texture" }, + "south": { "uv": [ 7, 11, 9, 13 ], "texture": "#texture" }, + "west": { "uv": [ 0, 11, 2, 8 ], "texture": "#texture", "rotation": 270 }, + "east": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture", "rotation": 270 } + } + }, + { + "__comment": "Box4", + "from": [ 3, 6, 1 ], + "to": [ 5, 9, 3 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 12, 2, 14 ], "texture": "#texture" }, + "up": { "uv": [ 0, 12, 2, 14 ], "texture": "#texture" }, + "north": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "south": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "west": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "east": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" } + } + }, + { + "__comment": "Box4", + "from": [ 11, 6, 1 ], + "to": [ 13, 9, 3 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 12, 2, 14 ], "texture": "#texture" }, + "up": { "uv": [ 0, 12, 2, 14 ], "texture": "#texture" }, + "north": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "south": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "west": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" }, + "east": { "uv": [ 0, 8, 2, 11 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX6", + "from": [ 2, 9, 0 ], + "to": [ 2.001, 15, 5.5 ], + "rotation": { "origin": [ 2, 9, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX6", + "from": [ 6, 9, 0 ], + "to": [ 6.001, 15, 5.5 ], + "rotation": { "origin": [ 6, 9, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX6", + "from": [ 10, 9, 0 ], + "to": [ 10.001, 15, 5.5 ], + "rotation": { "origin": [ 10, 9, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX6", + "from": [ 14, 9, 0 ], + "to": [ 14.001, 15, 5.5 ], + "rotation": { "origin": [ 14, 9, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 16, 6 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/blockstate/chandelier.json b/src/main/resources/assets/betterend/patterns/blockstate/chandelier.json new file mode 100644 index 00000000..c8b5b577 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/blockstate/chandelier.json @@ -0,0 +1,10 @@ +{ + "variants": { + "facing=up": { "model": "betterend:pattern/%block%/%block%_floor" }, + "facing=down": { "model": "betterend:pattern/%block%/%block%_ceil" }, + "facing=north": { "model": "betterend:pattern/%block%/%block%_wall", "y": 180 }, + "facing=south": { "model": "betterend:pattern/%block%/%block%_wall" }, + "facing=east": { "model": "betterend:pattern/%block%/%block%_wall", "y": 270 }, + "facing=west": { "model": "betterend:pattern/%block%/%block%_wall", "y": 90 } + } +} diff --git a/src/main/resources/assets/betterend/textures/block/gold_bulb_vine_lantern_metal.png b/src/main/resources/assets/betterend/textures/block/gold_bulb_vine_lantern_metal.png new file mode 100644 index 0000000000000000000000000000000000000000..c16377fbfb9ba54973436185d95a6a59a408229d GIT binary patch literal 420 zcmV;V0bBlwP)Px$UP(kjR5*>LlRs<1P!z>~FFdNmz%vkta|;G%cMF{h>FVl-=;+{7`XOAM^8q@v zU!n?K9Rev5h`~tUb@4s_w3wl1d2lZG-gD34iR$f6*Gl4gA*U#d6q(lmT&p{^l9t%7 z*X-A8$|ALmwUW5Qr6BN$pSyzST@d(;XOXCtM7mx`S)_b^K&!0)sCHWhBaU0YpL9IY z!fcNxS|oF!$wC|enb)-19je`yYPY4;?pXPzfeRSUxhz~mk|bxZ9Z)N2Hyb6!8-Qdk z^siwD&M}4!M$nIP`cckcbac8bQhRe8$7i0DMT+=$j7@hxzT66TxD-aIX&%oaar5vc zoTi)&TrY&chrq}6LTjXSz3^(zO>j)ZWx;U0UeC%V+d#JA^qeyf{>nMe^JWFta#l*6 z@y0+qpebhq*9(cCyW%oVDf61ebfw8cl2Px#^hrcPR5*?8lCf$6K@>&LBtk#~L9n-wU@cfmAl;@~$zP;P>tEQV^$P?mEAa;e z+k`ZmGB6?m6&7@_#WE|4Gm;`@PB+7S@7+7|3<0tvlDWNs`Xj98n8w6}v_aBYOWQ?T zmo(n4l3>-Bo32fYX- M07*qoM6N<$g5VB?d;kCd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/gold_chandelier_floor.png b/src/main/resources/assets/betterend/textures/block/gold_chandelier_floor.png new file mode 100644 index 0000000000000000000000000000000000000000..0782f2b5bb59cdfb66cbada49eff7a349c958008 GIT binary patch literal 471 zcmV;|0Vw{7P)Px$kx4{BR5*>5le68@u7`}yIXJcbwWg~{5 zC}<<1jTQl0LD7Jw5V9`8TqR~KPIlcjM&iJ-!_?Re5R_X zDhKwpx<2~3rH%8rR&q(z;G>vrotF~;jfO{YYBqrU3jk)3ezUxTwgM765--VKG0y0rnCql7<^f#I@3Y_d zL>hfQ3#ySwn}29M2x#R~D)lNKg@Pw*WM~Y4YWdZ)TWZo5PZ(hGQUW8?ich9!=|TG2 z?N)NARcdm)w<>G98||2-0IpsgOAO2(T?FR>EjN&fQxV_J-Mp?UxbMPkKQepwDPx$8c9S!R5*>jlCes|U=)SFzXXbt1O-Qj7UB!INuap6>Ff9wc?9G_%l?Gg(o;e78RL|KS&r+ql)-6Pn!s0000Px$4oO5oR5*?8k+Dj{P!xv03r;2-8kZ`8;u4VJ&E6pZ|M|~<4F%L2u_|lpyibQXuE+V= zu_>x8#IFVlYLOPzEag2)qTT5!neI3x-S#hxG4m!;f!)0W0jbr&(<1;c&x1_E_qtTF z8Fw|?@G%`_8kgNN0F_lAfUC<>lW{P48)L2I;jV8av3+<#>HbCllZ`ENeY6ii7`0@r zT@=e#29jvTUDX@0l6xMxAtsE5ujx52z=Zqh}&44dH&F#ij` mBH1~pMe?hGiuV8KkN5-)!D%a=eSPx$ut`KgR5*>5l0Rz{Q5400cNtJKJ3Gv5p~w;ul5K*BLK1C6LYi1bBKQg7m$0)) zl}`}CPcWi|Xpt0&)oQU8TS>r(4!hILJd*vFz{0gyXR@=K$a<>ByXT&J-#Jh2Ev>3k zase<&OryRpqj#V8-U@%AssIE@O`rJ>1fbxQTz(ujh*}|)*?9n*l1tPIX`dW3jv%S& z+?DGDNlgJPyXZ4h^ZeJ2D(6885p_1s<(#C=3%w;rV6SC&#%oJiiRU!EPV`nQJN0#LX<$ zRP5}m4?wSDuq-PlmdLwA4w{GP2_U0Bv$$FRM!AKP)Px$FG)l}R5*>jk-bU-Q4oc{8y3W5K@!0q2&4%qZNyd(Y_t%?2hc{r7tx3C5t72r z!crj#0UJ>;5r0Flxw|I2>n7D$#9gwo3b*l8Gca?`nKNJj5kW+#>bgXA#)JT%<}{={ zHBZfH2!JwKuIjq1%#`E4)qgN|@DoM^Zm4mG-nbrmxS_@}6jZH`JIPPa;)WVP8D#+D zPb3)s8s6AG5PhgFm;UGfB8}xAPx$4@pEpR5*>@lCev}P#DC2F9a(FQ6~qNf`TG~OI%%C1cz?!4xOF-FY2nRgJ8i$ zK?G+j_y-uI=%ApGGzhUV*!CPWK^p=QH*b0$clX`9$AkX^N$fqG=qR|9q|&@KES#%M z)9kbggNFHRL9^4+%H$$bqvHU%D-`kBf-nwJk}wW($wj>VO=HfVt^`n@*)Vkp2D_h0 z*0ur6{^MzyY#2TO$gfFJLhRpRzw{VcUP4jAd;6B&gw0rW0YwQ`^(^!Kd_+IQymfJ0 z&m13YnslzLwTz<79y?iYa^7e@MnAg3HO!-0@*C100000NkvXXu0mjfATyDa literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/iron_chandelier.png b/src/main/resources/assets/betterend/textures/item/iron_chandelier.png new file mode 100644 index 0000000000000000000000000000000000000000..e0b7a132efb0fcfd4b5376cd0e9c7b05ea4e36d5 GIT binary patch literal 369 zcmV-%0gnEOP)Px$D@jB_R5*>@l08eqP#A^Jl|XbzYjvooi%=YNa!|KSS%MCM{D%0W`WG6vjvd6M z(Lo1saVbb>Ba(!Cv|TQ|4($y|ukma2nJ%37o^$R8@P8m8bp1Z{!XXjSr+P0OO8VOB zU`K7kjl9~RRlP89BacoukI-7z06?nXMjmz4wxkyZ@jMhF;&~_~*Xc|wx_-ZKcJ?k9 zV+^L{P%s|h@qWOTGa{K??O#?60Kl{yn&uI*Gy&%vt*vbY6CbL&0Yy=;vwMJP9^rOy zUF=iJ2Elj)&N-eQZWsXQhE20P#>?{^1Avn=gE;4vqg5J|(G8ojGywo;jbc P00000NkvXXu0mjfKboIW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_chandelier.png b/src/main/resources/assets/betterend/textures/item/thallasium_chandelier.png index fe4202a6357a229d8724536c35bc1a21413e51fe..77827afc5ec5af381c6c649ae61a120022f7f6f6 100644 GIT binary patch delta 372 zcmV-)0gL|R0gnTaB!2;OQb$4nuFf3k00004XF*Lt006O%3;baP00009a7bBm000id z000id0mpBsWB>pGBuPX;R5(v#{Qv(y10{e7N|O!11~4)*f;prBm>v`t%znD{|C)Cv zzmbf+8gZYhC7$R{00?WFdq~KAQ}i5(`0-Yz;kxdaE&j_&3hpWB4b;%MflU3Fc2R)(2|<=|u^|Q#U^{eE;~BVPA*~ zW6JSUj4=M5v~55}kQj`Q3{YHv4xHBP`44gl$gqg{?NCt!!0-YxsK0&bzZ4fU!?SOH z8Qy;S4|g^)!0-Yxc=GrQ*h_~mz5<5{P5?3m7XW#|W!8F}3aH`*umR))1_l6vRJIUG S2Z+o70000G0|F^1I1ZIQ8VDdPl5~dNx2PxK1Z26B%9zidFxdepq+KSILATOBa zPKJjA$pB-Y^%Cr5P0B_Vvrafk?I&hyef|K<_~}u`ZVY0000^RC~5EuFF1Xemtkg()`Fu7Ck}Ey zN@~&3tK7l(e*gYf&!(F%7^d4;NIBNc`I^Gr!Ea_6dQ1Av%Qoxj2mi2%#u~_ruqjA! zNL)^-kvLG5$kuS+%<}O6@pT{DAKvufvK;upWVB*`?aTcl;>L$J=hsW#tNX=YZe|1$ulV$X`-XSB{ywI5PCo`CR&j>P pgQ?f5=5Vce#JYj;2{RiTLsQ5$0WbEBGr&M(@O1TaS?83{1ORTqnlAtV From dad2064486521c33d1c398978966c89d2a09f9c0 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 25 Jan 2021 07:46:03 +0300 Subject: [PATCH 226/463] Lantern color correction --- .../blocks/BulbVineLanternColoredBlock.java | 14 ++++++++++++-- .../{bulb_lantern.json => gold_bulb_lantern.json} | 0 ...ern_black.json => gold_bulb_lantern_black.json} | 0 ...ntern_blue.json => gold_bulb_lantern_blue.json} | 0 ...ern_brown.json => gold_bulb_lantern_brown.json} | 0 ...ntern_cyan.json => gold_bulb_lantern_cyan.json} | 0 ...ntern_gray.json => gold_bulb_lantern_gray.json} | 0 ...ern_green.json => gold_bulb_lantern_green.json} | 0 ...blue.json => gold_bulb_lantern_light_blue.json} | 0 ...gray.json => gold_bulb_lantern_light_gray.json} | 0 ...ntern_lime.json => gold_bulb_lantern_lime.json} | 0 ...magenta.json => gold_bulb_lantern_magenta.json} | 0 ...n_orange.json => gold_bulb_lantern_orange.json} | 0 ...ntern_pink.json => gold_bulb_lantern_pink.json} | 0 ...n_purple.json => gold_bulb_lantern_purple.json} | 0 ...lantern_red.json => gold_bulb_lantern_red.json} | 0 ...ern_white.json => gold_bulb_lantern_white.json} | 0 ...n_yellow.json => gold_bulb_lantern_yellow.json} | 0 .../betterend/lights/item/iron_bulb_lantern.json | 7 +++++++ .../lights/item/iron_bulb_lantern_black.json | 7 +++++++ .../lights/item/iron_bulb_lantern_blue.json | 7 +++++++ .../lights/item/iron_bulb_lantern_brown.json | 7 +++++++ .../lights/item/iron_bulb_lantern_cyan.json | 7 +++++++ .../lights/item/iron_bulb_lantern_gray.json | 7 +++++++ .../lights/item/iron_bulb_lantern_green.json | 7 +++++++ .../lights/item/iron_bulb_lantern_light_blue.json | 7 +++++++ .../lights/item/iron_bulb_lantern_light_gray.json | 7 +++++++ .../lights/item/iron_bulb_lantern_lime.json | 7 +++++++ .../lights/item/iron_bulb_lantern_magenta.json | 7 +++++++ .../lights/item/iron_bulb_lantern_orange.json | 7 +++++++ .../lights/item/iron_bulb_lantern_pink.json | 7 +++++++ .../lights/item/iron_bulb_lantern_purple.json | 7 +++++++ .../lights/item/iron_bulb_lantern_red.json | 7 +++++++ .../lights/item/iron_bulb_lantern_white.json | 7 +++++++ .../lights/item/iron_bulb_lantern_yellow.json | 7 +++++++ .../lights/item/thallasium_bulb_lantern.json | 7 +++++++ .../lights/item/thallasium_bulb_lantern_black.json | 7 +++++++ .../lights/item/thallasium_bulb_lantern_blue.json | 7 +++++++ .../lights/item/thallasium_bulb_lantern_brown.json | 7 +++++++ .../lights/item/thallasium_bulb_lantern_cyan.json | 7 +++++++ .../lights/item/thallasium_bulb_lantern_gray.json | 7 +++++++ .../lights/item/thallasium_bulb_lantern_green.json | 7 +++++++ .../item/thallasium_bulb_lantern_light_blue.json | 7 +++++++ .../item/thallasium_bulb_lantern_light_gray.json | 7 +++++++ .../lights/item/thallasium_bulb_lantern_lime.json | 7 +++++++ .../item/thallasium_bulb_lantern_magenta.json | 7 +++++++ .../item/thallasium_bulb_lantern_orange.json | 7 +++++++ .../lights/item/thallasium_bulb_lantern_pink.json | 7 +++++++ .../item/thallasium_bulb_lantern_purple.json | 7 +++++++ .../lights/item/thallasium_bulb_lantern_red.json | 7 +++++++ .../lights/item/thallasium_bulb_lantern_white.json | 7 +++++++ .../item/thallasium_bulb_lantern_yellow.json | 7 +++++++ .../materialmaps/block/gold_bulb_lantern.json | 10 ++++++++++ .../block/gold_bulb_lantern_black.json | 10 ++++++++++ .../materialmaps/block/gold_bulb_lantern_blue.json | 10 ++++++++++ .../block/gold_bulb_lantern_brown.json | 10 ++++++++++ .../materialmaps/block/gold_bulb_lantern_cyan.json | 10 ++++++++++ .../materialmaps/block/gold_bulb_lantern_gray.json | 10 ++++++++++ .../block/gold_bulb_lantern_green.json | 10 ++++++++++ .../block/gold_bulb_lantern_light_blue.json | 10 ++++++++++ .../block/gold_bulb_lantern_light_gray.json | 10 ++++++++++ .../materialmaps/block/gold_bulb_lantern_lime.json | 10 ++++++++++ .../block/gold_bulb_lantern_magenta.json | 10 ++++++++++ .../block/gold_bulb_lantern_orange.json | 10 ++++++++++ .../materialmaps/block/gold_bulb_lantern_pink.json | 10 ++++++++++ .../block/gold_bulb_lantern_purple.json | 10 ++++++++++ .../materialmaps/block/gold_bulb_lantern_red.json | 10 ++++++++++ .../block/gold_bulb_lantern_white.json | 10 ++++++++++ .../block/gold_bulb_lantern_yellow.json | 10 ++++++++++ 69 files changed, 420 insertions(+), 2 deletions(-) rename src/main/resources/assets/betterend/lights/item/{bulb_lantern.json => gold_bulb_lantern.json} (100%) rename src/main/resources/assets/betterend/lights/item/{bulb_lantern_black.json => gold_bulb_lantern_black.json} (100%) rename src/main/resources/assets/betterend/lights/item/{bulb_lantern_blue.json => gold_bulb_lantern_blue.json} (100%) rename src/main/resources/assets/betterend/lights/item/{bulb_lantern_brown.json => gold_bulb_lantern_brown.json} (100%) rename src/main/resources/assets/betterend/lights/item/{bulb_lantern_cyan.json => gold_bulb_lantern_cyan.json} (100%) rename src/main/resources/assets/betterend/lights/item/{bulb_lantern_gray.json => gold_bulb_lantern_gray.json} (100%) rename src/main/resources/assets/betterend/lights/item/{bulb_lantern_green.json => gold_bulb_lantern_green.json} (100%) rename src/main/resources/assets/betterend/lights/item/{bulb_lantern_light_blue.json => gold_bulb_lantern_light_blue.json} (100%) rename src/main/resources/assets/betterend/lights/item/{bulb_lantern_light_gray.json => gold_bulb_lantern_light_gray.json} (100%) rename src/main/resources/assets/betterend/lights/item/{bulb_lantern_lime.json => gold_bulb_lantern_lime.json} (100%) rename src/main/resources/assets/betterend/lights/item/{bulb_lantern_magenta.json => gold_bulb_lantern_magenta.json} (100%) rename src/main/resources/assets/betterend/lights/item/{bulb_lantern_orange.json => gold_bulb_lantern_orange.json} (100%) rename src/main/resources/assets/betterend/lights/item/{bulb_lantern_pink.json => gold_bulb_lantern_pink.json} (100%) rename src/main/resources/assets/betterend/lights/item/{bulb_lantern_purple.json => gold_bulb_lantern_purple.json} (100%) rename src/main/resources/assets/betterend/lights/item/{bulb_lantern_red.json => gold_bulb_lantern_red.json} (100%) rename src/main/resources/assets/betterend/lights/item/{bulb_lantern_white.json => gold_bulb_lantern_white.json} (100%) rename src/main/resources/assets/betterend/lights/item/{bulb_lantern_yellow.json => gold_bulb_lantern_yellow.json} (100%) create mode 100644 src/main/resources/assets/betterend/lights/item/iron_bulb_lantern.json create mode 100644 src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_black.json create mode 100644 src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_blue.json create mode 100644 src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_brown.json create mode 100644 src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_cyan.json create mode 100644 src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_gray.json create mode 100644 src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_green.json create mode 100644 src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_light_blue.json create mode 100644 src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_light_gray.json create mode 100644 src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_lime.json create mode 100644 src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_magenta.json create mode 100644 src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_orange.json create mode 100644 src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_pink.json create mode 100644 src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_purple.json create mode 100644 src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_red.json create mode 100644 src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_white.json create mode 100644 src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_yellow.json create mode 100644 src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern.json create mode 100644 src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_black.json create mode 100644 src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_blue.json create mode 100644 src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_brown.json create mode 100644 src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_cyan.json create mode 100644 src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_gray.json create mode 100644 src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_green.json create mode 100644 src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_light_blue.json create mode 100644 src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_light_gray.json create mode 100644 src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_lime.json create mode 100644 src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_magenta.json create mode 100644 src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_orange.json create mode 100644 src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_pink.json create mode 100644 src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_purple.json create mode 100644 src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_red.json create mode 100644 src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_white.json create mode 100644 src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_yellow.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_black.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_blue.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_brown.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_cyan.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_gray.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_green.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_light_blue.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_light_gray.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_lime.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_magenta.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_orange.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_pink.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_purple.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_red.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_white.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_yellow.json diff --git a/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java b/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java index 99d18dd5..cc72d55a 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java @@ -4,6 +4,7 @@ import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.color.block.BlockColorProvider; import net.minecraft.client.color.item.ItemColorProvider; import ru.betterend.interfaces.IColorProvider; +import ru.betterend.util.MHelper; public class BulbVineLanternColoredBlock extends BulbVineLanternBlock implements IColorProvider { public BulbVineLanternColoredBlock(FabricBlockSettings settings) { @@ -13,17 +14,26 @@ public class BulbVineLanternColoredBlock extends BulbVineLanternBlock implements @Override public BlockColorProvider getProvider() { return (state, world, pos, tintIndex) -> { - return this.getDefaultMaterialColor().color; + return getColor(); }; } @Override public ItemColorProvider getItemProvider() { return (stack, tintIndex) -> { - return this.getDefaultMaterialColor().color; + return getColor(); }; } + private int getColor() { + int color = this.getDefaultMaterialColor().color; + int b = (color & 255); + int g = ((color >> 8) & 255); + int r = ((color >> 16) & 255); + float[] hsv = MHelper.fromRGBtoHSB(r, g, b); + return MHelper.fromHSBtoRGB(hsv[0], hsv[1], hsv[1] > 0.2 ? 1 : hsv[2]); + } + @Override protected String getGlowTexture() { return "bulb_vine_lantern_overlay"; diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern.json b/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern.json rename to src/main/resources/assets/betterend/lights/item/gold_bulb_lantern.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_black.json b/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_black.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_black.json rename to src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_black.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_blue.json b/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_blue.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_blue.json rename to src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_blue.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_brown.json b/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_brown.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_brown.json rename to src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_brown.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_cyan.json b/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_cyan.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_cyan.json rename to src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_cyan.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_gray.json b/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_gray.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_gray.json rename to src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_gray.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_green.json b/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_green.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_green.json rename to src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_green.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_light_blue.json b/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_light_blue.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_light_blue.json rename to src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_light_blue.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_light_gray.json b/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_light_gray.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_light_gray.json rename to src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_light_gray.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_lime.json b/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_lime.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_lime.json rename to src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_lime.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_magenta.json b/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_magenta.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_magenta.json rename to src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_magenta.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_orange.json b/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_orange.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_orange.json rename to src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_orange.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_pink.json b/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_pink.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_pink.json rename to src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_pink.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_purple.json b/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_purple.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_purple.json rename to src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_purple.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_red.json b/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_red.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_red.json rename to src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_red.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_white.json b/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_white.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_white.json rename to src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_white.json diff --git a/src/main/resources/assets/betterend/lights/item/bulb_lantern_yellow.json b/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_yellow.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/bulb_lantern_yellow.json rename to src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_yellow.json diff --git a/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern.json new file mode 100644 index 00000000..f8f55c76 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 1.0, + "blue": 1.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_black.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_black.json new file mode 100644 index 00000000..26b54a96 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_black.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.1, + "green": 0.1, + "blue": 0.1, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_blue.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_blue.json new file mode 100644 index 00000000..5e61fc7d --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_blue.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.0, + "green": 0.0, + "blue": 1.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_brown.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_brown.json new file mode 100644 index 00000000..0936aeb3 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_brown.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.32, + "green": 0.18, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_cyan.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_cyan.json new file mode 100644 index 00000000..f21fd061 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_cyan.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.0, + "green": 1.0, + "blue": 0.5, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_gray.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_gray.json new file mode 100644 index 00000000..38131230 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_gray.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.3, + "green": 0.3, + "blue": 0.3, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_green.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_green.json new file mode 100644 index 00000000..fa215316 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_green.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.0, + "green": 1.0, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_light_blue.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_light_blue.json new file mode 100644 index 00000000..55a59fe6 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_light_blue.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.5, + "green": 0.5, + "blue": 1.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_light_gray.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_light_gray.json new file mode 100644 index 00000000..4d9bc9b4 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_light_gray.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.5, + "green": 0.5, + "blue": 0.5, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_lime.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_lime.json new file mode 100644 index 00000000..44c23281 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_lime.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.5, + "green": 1.0, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_magenta.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_magenta.json new file mode 100644 index 00000000..4884ec74 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_magenta.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 0.0, + "blue": 1.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_orange.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_orange.json new file mode 100644 index 00000000..adffdd3a --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_orange.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 0.5, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_pink.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_pink.json new file mode 100644 index 00000000..9aaba1df --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_pink.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 0.5, + "blue": 1.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_purple.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_purple.json new file mode 100644 index 00000000..11d0542e --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_purple.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.5, + "green": 0.0, + "blue": 0.5, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_red.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_red.json new file mode 100644 index 00000000..801dd380 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_red.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 0.0, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_white.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_white.json new file mode 100644 index 00000000..f8f55c76 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_white.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 1.0, + "blue": 1.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_yellow.json b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_yellow.json new file mode 100644 index 00000000..92c63bba --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/iron_bulb_lantern_yellow.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 1.0, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern.json new file mode 100644 index 00000000..f8f55c76 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 1.0, + "blue": 1.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_black.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_black.json new file mode 100644 index 00000000..26b54a96 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_black.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.1, + "green": 0.1, + "blue": 0.1, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_blue.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_blue.json new file mode 100644 index 00000000..5e61fc7d --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_blue.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.0, + "green": 0.0, + "blue": 1.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_brown.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_brown.json new file mode 100644 index 00000000..0936aeb3 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_brown.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.32, + "green": 0.18, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_cyan.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_cyan.json new file mode 100644 index 00000000..f21fd061 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_cyan.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.0, + "green": 1.0, + "blue": 0.5, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_gray.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_gray.json new file mode 100644 index 00000000..38131230 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_gray.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.3, + "green": 0.3, + "blue": 0.3, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_green.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_green.json new file mode 100644 index 00000000..fa215316 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_green.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.0, + "green": 1.0, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_light_blue.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_light_blue.json new file mode 100644 index 00000000..55a59fe6 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_light_blue.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.5, + "green": 0.5, + "blue": 1.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_light_gray.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_light_gray.json new file mode 100644 index 00000000..4d9bc9b4 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_light_gray.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.5, + "green": 0.5, + "blue": 0.5, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_lime.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_lime.json new file mode 100644 index 00000000..44c23281 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_lime.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.5, + "green": 1.0, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_magenta.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_magenta.json new file mode 100644 index 00000000..4884ec74 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_magenta.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 0.0, + "blue": 1.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_orange.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_orange.json new file mode 100644 index 00000000..adffdd3a --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_orange.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 0.5, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_pink.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_pink.json new file mode 100644 index 00000000..9aaba1df --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_pink.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 0.5, + "blue": 1.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_purple.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_purple.json new file mode 100644 index 00000000..11d0542e --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_purple.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 0.5, + "green": 0.0, + "blue": 0.5, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_red.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_red.json new file mode 100644 index 00000000..801dd380 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_red.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 0.0, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_white.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_white.json new file mode 100644 index 00000000..f8f55c76 --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_white.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 1.0, + "blue": 1.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_yellow.json b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_yellow.json new file mode 100644 index 00000000..92c63bba --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/thallasium_bulb_lantern_yellow.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.5, + "red": 1.0, + "green": 1.0, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern.json new file mode 100644 index 00000000..f84c70f5 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_bulb", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_black.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_black.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_black.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_blue.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_blue.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_blue.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_brown.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_brown.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_brown.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_cyan.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_cyan.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_cyan.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_gray.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_gray.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_gray.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_green.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_green.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_green.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_light_blue.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_light_blue.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_light_blue.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_light_gray.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_light_gray.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_light_gray.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_lime.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_lime.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_lime.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_magenta.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_magenta.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_magenta.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_orange.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_orange.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_orange.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_pink.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_pink.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_pink.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_purple.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_purple.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_purple.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_red.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_red.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_red.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_white.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_white.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_white.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_yellow.json b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_yellow.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/gold_bulb_lantern_yellow.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file From 7be83d0d2175172c663a0eaca48fbc7e09c4c956 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 25 Jan 2021 08:21:17 +0300 Subject: [PATCH 227/463] Structure update --- .../biome/blossoming_spires/house.nbt | Bin 17539 -> 17547 bytes .../biome/blossoming_spires/ruins_2.nbt | Bin 492 -> 498 bytes .../biome/blossoming_spires/ruins_3.nbt | Bin 686 -> 691 bytes .../biome/blossoming_spires/ruins_4.nbt | Bin 800 -> 806 bytes .../biome/blossoming_spires/ruins_6.nbt | Bin 891 -> 904 bytes .../biome/chorus_forest/ruins_4.nbt | Bin 541 -> 543 bytes .../biome/foggy_mushroomland/tree_house.nbt | Bin 23503 -> 23513 bytes .../biome/shadow_forest/small_mansion.nbt | Bin 10067 -> 10077 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/data/betterend/structures/biome/blossoming_spires/house.nbt b/src/main/resources/data/betterend/structures/biome/blossoming_spires/house.nbt index 3741013b2b5892ecec597e692da071b35d295007..e642b0e13206ebf43711b6e660ab17eb5c3a2393 100644 GIT binary patch literal 17547 zcma)j30zah7I&XM^i_f@OAwW!C|YHS$WB0;T143t6xlH-K|wGgAcUoAWebRvDmw^T zL=mEf9TT*WpfwN>A%H-XC_z>sKv)8NXRvnpUi-e!-~8e*ckaD2XU_UR=PFbG^Tnrs ztcK>-F7S z)okUAPT$4LyWh>`{OhW=@MB!$bj8;jeUBeG{vGq)VV-*BhxfPUDd8^zI!Cg^wD~EP zAVRZ}H6_S5vrnkktQ17taG7soC336EodY^M=Sv5yGEK@~DUWwj=kHrrw7qX`Yo7Y3 z;NfYamA^<(NZ;yAB2)W)F!XiFCoYgDq8HlzWxsWz@3zu)I2G=6Ea_7d<(|o~d}~PW zj~M#CZuW^jf5yqVwrvNy%~&~k?*+0hHT$83F7L0k=!}5QbHTjV0rp<%nBhIF6c)O|9M*N%UHN2OFDhkSyra!oQx+v(j%(`-J94f zvpDL)xP}QaP>R2O!~pAQAN_d*ZugPaHR6k7>eM}5+;yecuz`~yTU-4!f8ML86_&?&Czn@u+&@{ zSF}M@y`~}LYSBvDMxtNxi9MP)D@|O{ges$^p*?YIHNo5ZB7s%ooItxk&6CR=B&>vbd%LaZdKJ~ zWAA$P^*m(Wyo+sr5ufTwxqchGZP1oB3)0w!FU$YBN$j7+C3vQs(DYXcR$!45D+f+|O(H2o|AGZFLF_SQ_vRa2rf zyvBPaPUF*a%rN7&TmQQo_W~qRQtqAXqEcH^wr&k!HUsFs@R~IT;WZ|!&};taCV3F^ zNM;5ln(rd9eVY%$rf1*)eWSB8Wns&G<}mW9o1{d{Q`=ik?mgeNQUIGDFWIVBQ`WIk zFs<;JR?}o4O`fuX|E>25-#qNI2i{%;ocCq(W?80Wd)NLd#3A21)RzVGUR8PL0hLeQ~f!-nQ`--k&7Z z$!bXX*GreU*GpFtNK5tw;m&z}e@@{~T|wU&oLr|%L9+tvJp+FeIDxbRw%E|N_*WU+ zxry)pI$Snhi8Z9`uAq`BFNnRNi$I&zt6d%XukHd>nETEp@KzCo>(G1aFTi{Mwkw$U zA!)s-G$J}dxEZ}W_)GL|*Nf=gNoYxb8h*6~xD_4Le_i>n8|=54!7Wta^U;kv;V&vcK(B?OW-T3#ClEl>9ndVSr(^8Ogs0IsJi zf^-c^8*GWJKM$hyo0u62;4z;@vb8t-TMDuO0{g3+BFb!DPs(0C%G{ zEDtJ2cxc~(4Y8t8q$opj1LgJ)gy%DlFM-o0*?X!)IK~-OsjxHn$(Xn%J50s}6+Wv$ z5es(Ja4`W)8~bMRe$0osr7Q1UHx;n7zv*f&12NN90|jg7|IOca4>i9UTot1@ zyei}0o(|7o-90}bmNm#m@@0j1JY@~y@jndT>)Fh3ohe4IM(6dj4JcdxZ9kc! zwSpS{o8kSOtO3rK=$ik+E$QeMZ8dbu-wvl;Kvx%d<5LGsOGbAiCQ3&dd*S*Y!zJp# zK)hN|8hb%6H#n?9taD_6b>x6`{yKa+)%4sE)t;k)%T;??i=HAy4YvVr!)?IZM}9!O zEtmb*VU5}ebKe@^LPVmG1r=nBNTj#|k%)ciPs2ptn&PQ!0Vxq{ShdRk77HnAbeX@P zCG^l;Q!?nTaJY-p)f?^z)-|IpI<*AEZ55bYD_bOCU>`}^`%rh&skP%3P7U8+5W5Y@ z75a;2`&L%p_v^Y;2Sne)pEB5k$=KdY@GZg`YBvxTj3@g&`}vcG@71CWG2pvb7!#Vt1TBHCuZz_-dejyLaTSCiQ8WsXJoEr@>2l z)el~h4GnoojBs$K#;5Zg%R+8x_HK@xp1hre?Gu2aUr_PcCMF+#8w}y@4jn4O_BDdN z&oi?I9^8Njz781!p8S1K1F`AfjQ>7(*z)cQ%5mp}!GJ%%=)Xgt{Tkm&& z8SrJu7_b+-^?!Gr=k6y;p8x;N%`;OLsqIVyha-E=2$;FA3b`5otDD8{hz_&Hy>ddn z3nKuI{2#ldCXMIu4wtesk+ahmV~Z^RKXuv6o0ZtUpu{0!9^VqAKU@#A;dCcxgN4EL zA>>--RarQ~>UN$~iJX1`$K9uyC{Ik6zjGNy9kPU3=h$p)pOB69#E)RB+n>Gz9Q5kN74j9%Irk22d$=3%j|aHsa5L}^{s`iqqvlkHJ%2m?X>j@i zc?SHM+Wp{5ZrBbS6>=Z3*~4qVW@zwk?_PM29eR*0db%YGo(>Z8*FlBFf{@L`ycGw4 zN+vrHl^!4}RbKI3lLTRIX198?d#AN^2^*9WQ@|DNWaG>}j=s^FmdlWe< z$rVR8NtU(#A;UBwUMR}AC zBRRsXEf~mgYx5x7E7Q%LEO-TYI)4lf1>Kst2vVvC!9jM{RwSjjkd($>`_rHb8U#*? zzXt53w;$LGW}-oeXkRJ)3~_6hSKP4{n)44>w#ltzGDcvm$sXT0jNx#=yVTSw%%Z40 zEN8`?&eX&5l+#ti_o{D+aZ~s7^^qqG*Sh}D;pI{b+^+!q6BSSP#TngVJ%3^mk0<8Y zAApy+o_>|XvZ3joYW!nhBRkl!;hQ+6;m<<9LxvC?EE8dj=-N7HpRc@IpIJcjGXJKQSgvjQMXz7n= z$wjpMJQ#Mc!6mNgZ!i5mSkN~#vHQklV4qoM#6DcaNq^HNm14o^clN!%tXzd%2a=F= z00N@va^&RycNeGU822JRKxH8)_`ApbEhR&FGaiviUdgMuC80BIgBE=Wb0y zye7`5nj`HPouZh=0vzJMn~yY)?6~6-bAFKi9Sr%@;p9G9xZ_5(shSk~!)A7!$8TZO zr(o*$-wxxFuWKOmf-o?hRi^(Na==|JQ`qBO-Xj zfjEk5^qBDk_3OJk0*?B_O3nMCXEHO|JzYrC?7@*{nRyw`y3 z38zng%6vjr$Xj7n-NC4uOnJdT$~n!x)$OLv7lr^#I3uN-B|BhXKH#929DL!A<7<<} zwu^5~MrVgrVY2{t(pI0;+1_gWr`E9oGe|#ZLM1cBQdQFz-DcG#ISkq+0>!OSYy zq>>pi!B1(y-S$PKgAM0?oRk|b-Y03-O@8S1(7I@!k8dY+!s!ZTu=HELfKkJVb0ek? z69LqlVt(EF`1hvKO8?Zhb$HvBB_)rDym{^|k!|v4eViUFoYV~|O1j%?r^(`NS{n92 zF~e=C(LM4wLC3Qew_T)I2W(Z%pAXVvbA8d49PlN@KC1kq?Fl^7b}yzt^I6Z~r#**>{u44L74^C9+>)ED33*<2yZ#lbJV8e(UK(eoRI5)4 z7_OUM)@L#5f@#h_%)jgUbFc;UM#`IrdG)uaY%tAN!IIxo`4FtaW=+*=vDp(A*V_FS zPef-M`Ztj?%KuemwQM3?b>etHXWh(JX-soUnpU7A{P%8VSL6125j;k8yVLo!f(Q&DIY7FP``MuV9)38fo_nH~qF-2NyHP9jnvmj@#SUWw}vn zGFt-jJdJkR(f3w8N>!h}-t5sxlP8R0+vxiTVsIU@g>>~A5{24t6aOu9cp1blr&J%2 zf}|;VzS-ojBl~Wo@%i%Ddrn@Dso52m!8Hnyu8Sh(`L+dySDo0YWmoEBROnQq5~&{9 zC;v#O`cN%@jc?a=XZJkca)*3bxbd0zWRAUa8oFDOD({miH>9(@!}~~?eb!`V^A|rU zg+1+Iy8A~+r``26*lAaKbr^AMUI{up)a0SXxH)vL9z2P&d%aHa-szk=htq_K`^$K3 zvdO2P_6({Q61ctqL92*l-&LS=1G^h%mk+ehh2EZ+Kc0_SZ3>g7&}F zq)F9e#3vH%h<5U6kHcG6`Y#O6%ark$VF#Jr<&6qHL(;n9(g!JhH#QLh4vcMo?e}>P zJuz-=nV1hCsK55bp9kveJpVB}Rkc06S@k&g9$@wt+T?w@y1EVR7GDMPzU6KgwNK{P zV4U5724l_0zW6k{rBr17e8VI_lwW~|c~8&l%4)(mn1Tt2M~kZ{R5{ zv8LyK*H>xQzyQLT4Wqz?!@7$ZPaScw%=avYx0 z7Mdn*EPOR$W}kPItlrFK^0qSiox@sg3!zpdmwroesmMCkst?zid62{T3@M}MaM5i zud$Xw5502{O|@N^dN+@qGT{WU$SZz!$YIRjbBIPUv%cHGqx0fN_POF-9oVS893lH% zR^aQEkyY65?_o>T0KrY&Y7(@he((S!Bran0m|LDR9tDXu?52Wtqh^N{EUx)@+g)V- zvapA+fN;IssNieNINqMwHM0Hnyh<7gr2li9`IhQa zb@^^b)_Z@#;i=4Bt(<(R>r zzpZ){_T{Lz!-L?I*7Sn9TlluQC7q!D>$i+-H=0@RuT#%RyNG{%QT{b7FXJ0WpEYT> z+=#sl#luzUxs|`Pw#iA_p=}N?hGddM8u@EaTX!!8!6VoW0xWPXin?NOKJc4u;EX8< z%8^%(Y%u~K*Kzo&JQ3#URAKFDvE<=>vf3@(4elLAt660g_Hj;kz#hn*Bs;HJU&ZQX zR;os}xZSx4w?*uwbThWZ;M>*?%8rt*wRRA_;scjCrpx-6Y-t*Ev{J&T3ez-VX0!tnnWxdfG6(y*<64>fS_IMNrB+>yo+H@Xpg(MROa| zl92Tnl%enUsc-Q*&i#~id;Lv%>2pSo8`10Z;o{l_<}JJ`s=Qc7^y-w&DhFzOOMVQi zUDG((t`Mp~=+Ee-P_xIEgEoa13eal_WD`{;Dd7AVgH;v+yV1<^OzVh~a}!asr>A_M z#p^R`e3oIFxs5$X%`$)v=8%Q4Gv!Nxiy9xM0DKd09^oT~#%u#hl6##0kto}Amd$#r zaLYASkJ^(Zsd9g5ebR!Q&mz45#!j0h_X(J|pWAxk;cMa*;k*dmi6tR_{ZY?05_eMS96ci|%74F`V>KNBg zj?Q+>0F}U$vjXkGUv>wy2fzQYz`{EUD;!Yz4p;9`rwm8dYxD+JU(nxRxS3tfDszNv zT@W#yUW@_lHY=Y1`iaT6EdM$(yvgj-FU~oT##JImSYX1^P|mOF!zR!prR4xVjJ@6s zki)F*gL_g1#}WW=E8ai$Ys&)=py}DKAYKeN-3Q?%e+7hvy)&J+Sqq9$iGc25Lq3vF zg+r-HKMZ=*tnW+YEn{Yn{D`g`UbrHMt~l+58^Ws6idq9D7OM#S;apNIcDim8gp%Q+ zeGpahjUmA7)k_$&SY_Mz0&g3L6y5MfbZ_N8^fHZW=#f-a^$DcyXR861Ah73Z$>ZrB(C5h|s3MU{xqZK(fO5ira%MgE?eHaV z(w9dl!vaL28BjK<6#i0m`OCl%B<1$_-%To@Ot9UFB;yf$Rtz)2VmTRHlG)et)QFR!m7d#YE! zUUw;ne*y5t)W^jQ=MF;FJ9WkL%o92Gy1cyMD*Fn$QB1g|sM>9ZDXp6+E_9ZMk@l z`y>8xJx~M%C(<783l=kKxm*O)(ZNW-|{&0cF@!q3OT*thm|O8AoEr@OP{o%Q*L*l<~7- z+vMR|0;i@1s3DTA-utu%+KHT#C48mRzPPa+(YmF{E^i@Sk}y=PG0D_$CfT}|T&Bc8 z08Zf2?%^St_ewCFzK&nIO&Ap8RzN9F=Wh-_Au^6{3hTC?Fy34>Aq6qglucaP3P?PD z`cI#Fwd+*i%iM-F$=gUQDwo+QYcDPQBeca`*0?CSpLJo7yEt zXVX{OC9d4z1Hk&RlZzT3?5wgm} z-$Xme7Ye$hRXknFu26Vau_0N)+6-lst98Xd6m?L1-$WHaEEz>`ZtMu(RRQ8Jo8tz& zKl|&cXL(>p4YjAc9z}IIdTEnn?o6P` zmmX^U6t+I8cxxMd-@x-zC3%!1${Q3z^tQZbKXMoCgpdaefJZvLJpmR42g={A2I;~| z6Ht|QP1hCztKJNica_+X(j`;OZ4li5sg+-Lv-3zC20uI>X57nq4m(M6So@+9d;-_a zX+dD?3-)q<4I^4VhSd9g2=K4}7TL#=x%+WL4%-l-^FjvodbEh$!HrF-^+AjLJEA1J zCcB6&ktr)U`dI?MT{Q#obyO(Mp~Pg1Sz#y*(xo8Y2C1>x?BHv!zCadx zxgH!yNR$%G48y37@22k`y#wLIH^}98y@gzU+CgynD|z>Dw?lUH96M49u4dkqjbO4W zdEmj14e5Z%Vo>72WQ`v?ENy?lXBpVI>8k+S4U;xO(aua8q+iFvby4`pxXmkB2_Z`T zu7#*(EecVz#3;1N~H2zF;!OB zS=waWYlWeJty;BydgoN?#f!9+l22Yxtes*UAByM2a6H}Fj*t27LuRLwC>B~86t)Qj3db-w?3jAcn{_#CItc*7lYFi4WF0ubxPi?KBI!560fFZr)#WhpU z(q*wPXPjp|eL1xzrE+mo+GKQFa{s#d`P$(zPJCVBTV*IK>(WxY+;6d_ zr+NvYJj5fhJPFmm1V(;X>X~k;yxG87>?r5sswV!m=iw&*J5Ma!F&k2vR*A@$$bxfD zAHAK*c)I2GkLwFTA6n5|o@R!r2vipfbMsGuj_}@J@65jxP3TV|pJYIW>G-|_n>U<~3H!@}WcRj8zR84+#Knt+Y zo$u)NBbI4S2Bfy8$7dufseAe*SH=we_+iPQ%UtvaY0l#(5a@ZHNHzk(agMtOYH8$N z&8J_;PS3hH6!z8-n&<-Az*N(jGy<94Ua1o0EVC_=&HK?o9-_sXvXKB1D#=O%l(BqoT$)~ukA<(r684AiL+-hy z?j52cW$ZnBl8VsOoc#uK)-_J)QqUSp0i)unZ)(=e#UcE=$Jith@dmr+`4fGxJ?qls z3h9d2mpM@q167O1yli*w$(+5%hq^9)knz`S-1Q<$AUb(Ev`SlRyZ?IJ(3FWHR03uu zX+&0DAcw44V_=9}*VR_xW7mImr6BE;M;Mjssfm&+VSO z==atqubUu@ue#2OGV}B;-1J8*uz-nsdMDRC8Ixk;D_IN0iO2w|hR+^4L;}YS!rjwW zsD#kWd<8FIjdqF9PcQlUvE0Rii4}LA2N1#58mG$@YHxSGqnu2>GMlkPkZBqAG?VGh zHE!%5*2U`ian__cVer<^X;bQwwZcCBflRl?9(@gYsWk9$ps^Z6Kl!-I|EX=BN^BPW zWSW1`?YHJMxtH6a&zuXtMD{Pkh6F;vQUg5=Vu;L61e^?*?4&OuaD$L;VxnTEPbt!X zZ{m&}QLCA(Y5(qzs!He3KrnAinKt_NR{F53@*RiSHG@-2Wjr0+*%kBEO9ZD1j4n+S z&K(T5!IylAi_@h#D0(_RfXbDJClORp;k#Ji4KdP?S=};S?&l_s!O!PC)u&8f#KY!; zS6APUjMJ^H2y%Vkz&Rf}D_BC%Io_;!Pi33lC(I5IL5oq)t0{m^0*rY>>W_A0ag$P2 z4b*tqF!n=a9&$ZY!FD90uUY@by!j>acry0h$!+z-yxgB5?n=D@f!L{btnj`kQu(Pj zfF!3JfebJQ3cPaTahy|*YhR$*2%@^NP%_3TQbJ#U2 z;*p^-z@V*-J@Rx7ExRaXom+;XN|IQTG{nlx!LsFQlp34$8xYAEBffXkZ zrOB`h#%sWF*EgwZcK1>T@X|IWfucbJLo4hBSH#E*S9Bx$;U>5f1O>W4JZ`|e@!e`c z$LiWg*iuhfg0~`2&hZ7p{~RNMpIV?yid^5JTE14e6=miS_99Q{Uyo)Dqgf$p>?t?Z zabs`-3W5;e$$)YzG$9)%G(4_2(49D|Yrt0PzitBnLP*r-LPe&)(K`#^wY0oB16A_e z;1cZ;gO+`rXH2I%dpEEzCqKlKudD`5cHF%qcr`0}dgshdN=s5((BqO=@hO~u!ZP$f zQpUS~hQ>UT0WBEp$}a)(m-}~I>zBN^?MV&B`Uj+RY-b0jbo9IFBxfiZ5%VG+2hT^3 zcxPzMS3Hf&vYg)%9M0;OygnYD3pxUPQl|1X{rSoz^c`B;tIsVq^MCat+5gpXcW0WV zZsUf=Y{8VUVMOBp{X=cbp=P32#HQ(SBN@+AY~Fo$5wrn$-Qi^uasJ~$iBnqBa}=4# zp2MR6ok9IfXCsYo-6QO^4~$Hdq$+%FYT+kl-=~RpJkh=^ag_b7ttQN@e#d+C1{#z| zXo92ZWu4nMb5tCWWo#{2H@8#rBFBzP@%ytDDy?RAIdiHzKW6# z#dFK9#4^S$p9bMP`1GK9NE&!WT#~eJnK)i0w~4-mXBkw$vkm66)`CBM6vg3G%h4z}NQR&mXwdro>kOl)kvSZiaXB2&jnc z;>F2;X}>k;rdh=kgEDH3WUo6wfd ze$jVgiKUrt{<^(CaTQALEw4#eiRh|OJAhH<+J)`oFg zj9_JsYkmaET0&x|f|up?aN;$DxQv6N-uCeIfYX}6HEA9N8lJ|b67nTQ-WL%s-6win zqu#kbT(OZ|kXBO`kcchqS|w;PLi*w4qb239r&5n_T4_f&#VF3m^%HP{5jo0kBHKWj zVoqd_!~|qOKF8Bu$@eh;X%EVw8GpQ0oNLs>I07Yjq z9N=4rUjn8VS`UCgiv5`xM);kAU>&2NkmJ3QQ=IsgfOI$N1+q6D2<*Y%j{v$*$KQXu zA2$-&xVTwOoNry31=~GzxDe~8hhmC~ZS|%A*;=Bn0(@h+KlyY*WJ&1Xf@rIU@aBrU zYqQ83JcU1aY+#GH{X^pq0V~dtZ(I8V1RMRD5O)+*p|blq6pc7IfZhlybb>KNAqy+2zMHy&Huq5}D=$b*mVo$X^&lpsD0lA=1uCm+7xppZ-s zB`ObEiMx$9`UCpny+-)_Nt_3^|DpL=+R-MfYZO+yHHY2Nf85=Zt%-9I@PNE0fxH*U ze0<8Ml%0W=phAyHI(r=uVco{e`zDWhQwGOC>*xdzeM@;nvVCmzDojtycdl(S?>V!X za=fGT`U()gpvy$eEwB-SjT5jWDbxSV#55>aL&x9RQXOXDQ; zCE8csX6bz@dLUyWu5mnuFLy-iQa{vz5el29f>sr3DsezU3r6}?N47KFy5V=m*9tKF zvLFYGrIF0G{kqlw7m5cC_q9zNG#1ldC^ z0_P}oQt6@Pu~7IfVGsH)K?aamFFzEkQZ9i>6kl;eADaw0KP`crSW(12FjzC_JDnmu ztnlOHI$20wPt>u>_!Y6_ssK5-2~{xbjW$mXScXn~nHc7+bLIWyTo(ZXcpju=OD5tB zvKZXH*)thOmBfn$Er7P@ISChQ*T>Iyxp!3ZAevRzT+&kmu0%5%oFzgrc`To0b9x=Z zV3f=lpr&T7ie6j**9R;rU?EEZt-mI&5MU)8UBIzV z`G9CNw*m$3JxqYkL0U@yutt4K|3yfBE?0x{z4cZQq#LHg#sl;LnC?6C@<3dZw=MP( zF&zrMj;Mj#SYQPhs$&KKxW$H02X-pp=yF65O1rnY1bqUJ5q^i|U#G zsz!_He-yN}@@|a6VuH^6(yJnB4Uj}90+FOn8IeQ;h|frN>ijdCI%_x^9aG?gW(g<| zI}xN|;Nt@f!(O$=zeFS2!yw;20aG9i*h7)VR{%p)d=H!LUj(OKAf1!zkYNr`e=4eD z)iFgRL&dDk5=62obE@SrK!8Is;f8TzM4e!SU5Jp+B)sM7fVU1gE&azPfj#WFC|VF+ z#)fFhfSPX>eIB#HTce4gWBB~$yYiiCkoM`5sxkaJf9lq-L)BM3)*UbKgRWWqj{=^~ z7Se}*22Cy{0zg44e`+`i`<*As4CRYege)6;g!0+&1%Ed)feFbY;c$>Mmmfubxb9Eh zDy$i?$tM>UJlYVG9uZ9sCIA_9lHq{c- z{1zR_Z<#STrvUwCrI~L)V)YLfxQvuNiGWA8r2#5`qE{0y5uwjdsiSAubJy zv=qHpRW)ux=MBstx_vqM@KeuwLX?=vT((vLMFa@J{CpMY3YYA-X6oHRd~n?Nc2M~8 zC~^u%QO49Ck%1{&Yi{mb(!0ymscQSL*B>{z}tP z$oUi#(zWR#$w8`5*vPSG%|0vUt3jPm>z6`3n5Uz=m&~XNWIkHHY82mR&pi<6>|02( zs!oHSDYF_Ss+Sn-EMi7iKwi`hW$*v+P=+cK^Hpmf1?*X;;Lu4q4gm|$4FVQ$&=rt_ zUh)0e!yJ8kIzBX(o=i>`h&5{#7O#E9{|F-V{bjngNDc+vk3YC(t?8aih8v-}0v-g~ zCE#CB!c(Mi6G+w~1+sGopg$-L5kWQ(o&uI$$Fz=HscKITY64>qhXF%yl4fv{sABub zoz&A=5a0E7P+n~`;;$B@4|0_iORGZK878I2bpp{Y6=xC*yQ=5&1Z!uWl?7dlQS6tC zDAj-vyhSRq>wy39AwZ=d%$z+1%xH$Pp>LsHIkN8~w)#H%O8F`gaLrpJs!<@mz~(q- z8TiB_MvxP*9+(@n92>lQU~b~p+|`78v*1>M-i48A1Mv4W?`3&loOs#OkRTcH7e=T; z$qJ8jrPaajcmJ)xZVs8U|s*vlb)2rTaf6{o%Ls7tMQ= z4=I(_p$WtF?P^d35O5)TR;aIbobsZvXTXJakOm76FD`_FM2d&#B)Fx`#OX!A>zw$3 z_4>*|v=&iY<`h(_2DkvGU!+_Oda5IfIJ>AFLB#x3fM5TD~q{{UyZz8C$r- z^Hk5jae#n~e~nHdAFY&jL_o(eY0`ioFW>_vw-H>R%PxogpY%wF{lgyy%tRZ``5p86 zcZ(r48c?j2tVE--pDHR3ydZY=g9u4 zN|Onmaah`+xEbA_lNpWPnZ4J;YPGt+ae4D&3KqUFE0uz(j8Z8N-{X9z1jvraOR)=< z0xQQkX~$;!Nq=YQgfmX=IJzZdZ)ei;fSjTHUjmLi4|vp`PzWR_$lD8MS1UXr!1e(t zaq@ce7w0lgpUuDuUCw4quHOo2VH&_o51x*JgIB1w8I`N@_oH-J*NxRDcZ#6kXZ6=2v+fRh`O*&rzG-cSfw!;fIR(BJC(nzMFEPOuF zpjRyL2j|Q06xVlG=(uZ}QHtr{WZUe?hW?^A4+WOH^L`o zBU8m#thn=Exb6P5_fO(PYW>?JTi<=xalm0SFJ>Yd)j{a+9Ml|(!0RSMTroD}J?aAI zosJdGl)S0LLdJ+^+PNZbrn3d77oIIDZt-;Q(CdL}O24ISR{95Om7 zdHcRpsKA>)`%-;gG8w^`6quJ%rmDh6-}Mc2PtxQgK1w9rtoexMg82c7$jq9nIo~}h zp=z}1uV=r|kC+#_dk|aR8qrORC=&ycjbC^woMSI)wlm{KOkx(7z|l7cGQhVj93lYLftlBazo5oby#msZ_3Ewh(gN*G@{ zEI0q=rs?^r$)(=2PnVW5s%N{EIb%y#{2K9bQRw_@vjnbbMBv2xWcru51C_)%hhWX*1l^K+9%9S zOWxk*B3Wy0z|Zwn-Z$T{BkC$QVtk8u?v2qvK2^<>!4y_=Gu=X49*=Ax zPt&?Wo%=SOZVJ-o==Gc}UG{=8{DAIfT50t?t-k6s`&+k3N5<;J6M7LLf#k;=GBLQU zH#Z_Q5Wk&I*<9>uG0c-MoEvLPyd&fmZpd)cs9-516w*YKBGFL2pL#{}cvaQoIR#+? zt>Qy7T`0^bypEw#Mf56@s$B|_I=#v_2SjEgl(EUQD85PgxuBW&pwn}-s($IY_Dbd( z8WTFd8kN5p8z3cUR2oHyMl~aT;uzX*m)f zXSv`b0$ms!rg3GNq`vr|%2*pqB#Md%!=KsU%AcC%hm1&`Lf=Lr?ubR}~R29IP*-LxXIq|TH* znGdsF?3v`2g~tz1b2FV?@KY1-4_~W&nZ!$o?zaey@u^DV)NjC3d4pBPGm_~GFD
  • R(lo;T@D_9vO7XSpbR;n!RJf+`u43~KJA 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%0Ayn=FN4rjA8{_AV{ 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 literal 492 zcmVJilipo0Q<>BqfGngsxbIi zLN*w8EJ$E_k_>X^(bJ(KW|A398ZimOWHT5sgUM$wiLL;7OwzQ5MR?7~E?2)~C<%!MxEiJZT+Ng-X`DPt_; z9V$l!te!%6HmrI>>%%0MPqR}^tx$)dj+-(qn9%OFQd4WO^ABy0@~n#>48DZ7JAPF~ z*yv!b|1+H8{4Kc8C35iLJf4npOBc6jlDIM5$-<|?;`BiP diff --git a/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_3.nbt b/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_3.nbt index 788b433498f0c9e241602f86100b899e69a90a26..8d3477e707c70f705d4e0686a76ba27c4b00ad0e 100644 GIT binary patch literal 691 zcmV;k0!;lMiwFP!000000L4~KkJB&^oj6XKrhJ27;efv6V8J(rOROWwq2ms9+={M1DJcoprDpxs|&^&X9 zvqG$HWU7CBn?qO$*=-8o^aLS9QZdEb9T3V1E-0ePf@z9ZTw>8@s=x`%_VfX11M=$&G>M+!E76j4b!ua$64ClsE$87P% z>M+#9Lng!m7|y6?jyY!PdG5fNdR`!U>{u@mJ@EuR@dQ0K&npLJOtZ~{X`We_*GR0H zrP+mcfK9&%vgOhy6@v~pHy{T zReZfH#MYC@*9S=?-mq0(Zh;=TR6bSWpch6+qEggqcPUFGcdX+2>ME2H`<~_fkY!Vd zqt4tZL+UUW%jhe@+5Ia*4%I!&5h_t#P>Up&%_mVqv|)wh2`rAf`D*Q{Enl~bJ?|%j zcgKo?$^5WiW``nM7Od1?N}C^HL)`rVGOZVC!G0t)z9+2EHZ9ib&Jd&WU|YGW%|!; Z@trC5s~N$f)R&?w_y_INnhK*2008gJRQCV? literal 686 zcmV;f0#W@RiwFP!000000L4~KkDD+M9gHD_wB3HG-Cp`1+DoOCdfRi=Q?HRpoCGbw z2s=%;zrJRJ5iw&!vnwqU2b||OZ^myXP66gXW&W3k0MNXVeiQx1b4Ylpa+Pxl%`=BM zE5zzfruyUi9KuRSvnhbn6NC^+#T0LMU>MTF1P)Bt!w?HY5FR@gL3r#~A%ej)2NU$z z7%VShVL}IndU%L=dl-uFgcIrrK5=hp$hL$T1!Pf**y)N~FzTyB?^?~a? zr$5-9!*$j$)Vy5Z=wDgM*|Om5x4s3r3BNoEA!UDZ3Bi50^TTjw#_GG#eV>Q>q^k3( z;_GE0ww^@3JxL<*hOP2)3-rjP@~ILBy)Z%&m7-R=OIaehV-?p|SD}>HcPyWVESo|c zb>>bPQir)%MpqHe9$yi1s2*94P>Je-S|qt_eiAiA8&*i3z~ZQzuhyR0@^!n2xi>o$ z*|K1z{w!@$gaWbj)jluzs%9H?v)ZwIz;Y_=gI^t#?E!Y5CtGy^AFOI+@DZsDZ~6oc z?x{%^y%qR8!L8I=EzcADJoWQA^MAo7ocVdx&+@)3GVWP*k4ze5hRcFw`fqG;%M|<7 U3|mp^>(4d(1Ip|~U5yU_0Ev@N!T8hYr!0(844hI)A!nVlV`WW$F+lmYEkp zVqty)kK6;pkLg)4LwN;;=LpdWjaadTNgWJ9bg;aLM=UZBD?H>etP>B^P<`~hNGwe1 zVAQz?JQ&?iYGE=5qxu;%CbKY+#*8dX?9fs9>v@eWOz5E#Ir37BEB6Sgq3K64i3gK9 zm;n0cbYfu=4}T_gFzPG^9*irNil^7-nS~kJ_aV;_;>WC^nj5Yf5`@A0gaiE(L4W>W zduq;~=a%`S`*~qubU!aGOybZXh@V%8XLHt>jGBk8Ix9x^{My3kz46Av=y|=hFs}X~ z9(f)5)L`CO=DeQ!g@tkL7eQiOB7PDNKZ%DQQ|HRU=zpH4h-Xs=^PCzCwx_A#*~a+j zL=J{nbkdp@ObFJ#zFv=E{IjWQ*0is;8Dz^`qUC}?@HvCAywBwg`T7fyXm(7_i|7a4 zGMLU=g@%>OuktA^8J!i3{+4gZcEL}NA{fy>Ifvl3TX})3tk#3eF8j;ow7GHk|MGwQ zf9S8|qJPQjnk}(Jk`-O#=UHwprm~Uv!h^T5*xyvAv%}4X~Mp$XvGXECbqwJ@NAFs}j{D8DiV*A#d cz!&5j74%p8qg<8pU&s{h0H;C@7RVC-02MQi!vFvP delta 792 zcmV+z1Lypv2A~Fz6@MUY)31D8`XAcfa?Y{S>8V#nfB;X7<*`I*`s*tb#0YsMt0A3u zhJ($cci&yD7BdDIK_bdOi~vCQN!6!NpV0^kR?AYBOh9*yAe&Zvb}z>2=GzEJ!-ZZH z!Q&MZNQI=5?N?w-7Qo~N6Io2WXCjY|X5s)HVlc6T$pUmt&ws>X2olTIAxJDcFM`Cv z{6qn{N0uMkvu1|!iY(6wq7z%OQU{ZJ7=q|vd69rvWFS_&%VSt49jKwc%)Q7QOzvUy zxrhQ7(@*YT3J;_E84RXyFp0s898Bub(fONsjU7xJpp$s=(u^AOflY5v5 z`seh_!DInU?tfwQS&jl2Uo0KZtj{Y4GqmqRo)g56T|+%Ld^IEpgZYUE`X_<@{K59r zofFE1u%E6ePuYVEGwhrbww-{_sbIY@f3DHSB z3~}h>4Xv1ztb2XE8N>KT%Ny2queSvh^HQPpj6w9JfU$Zm)C2YU3yEwuOwEhrJ6$ul zo^}c?tLL}sTUs+ZsTlpG-jLmbpPxlAp}$K3(ZgZo1+tPa2bW#;mrZGV@A3cj|M>sZ zUnyi;Hh&G9V~J!7IxFiXBwHq=PlRvO1BVGMk_ttwPFAUT`wS|_Ud;X3b|s%r)?7GO zCybt6j(F2NRU#ED+A#IckW0ze2bG(?%A(?1)kVEVD@FGeZy{aKO0WXXw(88bss)y8 zzJG{SXS%7TlZw{rw(d3CidG9Ck~gT_!FHiKj(?WRm2_?g(%IzT33=Q{!6DHw zy>oWHE^9Vx=|bMlR|H(}y@X6GQPJr$=ke5S-<`kROmxQFDIabh3wB6( zH_ogszd}wA>t-<;+;eUY(f0;lCb&2CH5+DEZNYfj+oj!OEo W`w{u&wfett4SxZI&8X+H6952mY>yZK diff --git a/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_6.nbt b/src/main/resources/data/betterend/structures/biome/blossoming_spires/ruins_6.nbt index 42954404e2de4329e6893eb5e1a8802db2e00018..69904743a3d63fe8c962eadbf763e080f3345701 100644 GIT binary patch delta 890 zcmV-=1BLwi28aic8-IkvuR!9OYs3||m9x5S)HI1=cV+waIMCCX)IL7jAW~EHl-Hr}PZb9)yvR;t$2rdFDb*No*=(_L@%-2QPhV_Dy6ICQ!)CbW@8 z9Z&d}gun;_lOs$*&;yLCCkZeq!A?eCIDx@p2L_8hCFB_xSAS0$U@$!y!51(o;tLo| z4=|V>PS694Tdyp@Z~}wr5d=NJWJv75VEF+C(~~oB7H3?|JiuUc0Sq=5z+iI$j6h-s z2Ahk55IZnfy@0{;3=F2{x1Wd}U}8HniRb|)wliaTfJu;A0E6`^Fj!3!g68zdxIHEU zjH@RPFqoc>EG5)y zy6b%Pn(pVRp4_8nYA5&Tc^zO}UvC0CN+A7{LT!=Q1=vIEz>ad~;xfSSNZq+-28&)c z${02NOn>oq&gS2Tu2;kOGe*g{{8?+3+}c6p-{elQkJX3{s$G6Ds+Fyh3vGtF@6~eA zbZh26e@8wK+|@bPH?rO86LEP@^mV&k>^iLj?(gNlJ2&f5T`p^zp!Qm^hSP$}i3d&k9R!!Fpf7;g@+R5Z6 z$8)t!NF#N<-z}eTfWgv^9=?-cr?QR)Aodo_BucfV-b}GTs z-OEuuDRu7Q!#K4|?`H6d-rF_wpGE)il$ox7_&jRc1CN-;CvE|%*Nk0!l}7#;mu1)5 QSML@31uv4-lr0wk0OfSDu>b%7 delta 877 zcmV-z1CsoR2m1z)8-K*#K;oKf#1*%dv$}26ERJG#W&8CwtYgx@&ir?yhF6R=sU)s|=g287rGkUvACZeYu{oV$cQ--CqS0#!9OW zCqhg{U<83F5hf$(0mj#pMVOpmryww#z+kZhgT2GjG$PeKncshyc6^Z=9EnJGQMWJoQ5!Fm-Ktfm=3bADj_9upD9 z*HcCqOiw{zIDa8Og20r7T9l8lgY8~muzCTLn!!}PDneYqq-HSH^A$l4JJdckgLy&^ zFsb=EwiD|4Jdx*&;444eSkDWBo|2FsU{XDniVK)j|D^O(1Un2q2~4W)1)=UKrX=VA z2K$`=43_7Lpl7-`AwQguA5QQk629QKsNZ8%geefFAb&8N;7bq~cz^j!9btSuv&g&2 z&+|O;Zt|J42;=*D5qW?4%*zPF35-BAi-4V15k??+E(4lhN8Sa#uQ!pMnI(EGC)DeB z*M;hJyq}NtlmR`*cFKUBw-Lto^)9lb1kyh_)E0?dfIY+x>?nUO&La#@)SU-ruo`5i ztX0$B6o2pMZ2n`^gBqv5F>1!;uhy{a#tkC>F0T~(+)U`G`sG)vdf6+vFm`N*K`j@Z zUbFD|Tk?6}E>5|jll|7*6Xy@a(DvKKl{O~g{z3kSQ?mip^|Eyd>Ms?`zSL~)o*VZ- z^_Fov?i41nQ}S9pi2QU)G+J-XMs=%WuV;H#lYi04S*s-zE7=+4%-EYjv9i(D>Z^OR z9|KwJWOEY!Mmjf#!x0CPl~m!x()NjjX*cLP>- zy>kyBU;k7%-z#Guult!!m3)fR@bOf-0`1)F%;sjX9_8s2)U8>pI<3dM_6>#>YOQA1 zHD(Jpbna_^Y*TEUYQ=b`Ru)nxI=xq8?H0=P>1FM&ARX<@^oU;wc{xcY<;y?3pGI{V zTn9nXJGXoOv*zu1v~pDt^7G{NZq^l?FIV{yXC=IA{PJv DUAe7w diff --git a/src/main/resources/data/betterend/structures/biome/chorus_forest/ruins_4.nbt b/src/main/resources/data/betterend/structures/biome/chorus_forest/ruins_4.nbt index 21e443aa649524b79162a24462051647d8574c11..d77c15f834c438d85d898afd230414f062c089d0 100644 GIT binary patch literal 543 zcmV+)0^t20iwFP!000000KJtSg%Ddp;-?W~CSJj?;W}cNM`wu{@&qF$m@t7SPdJkqMocurJm;0H z@ES6WnRvp0r}ku~htFjWJUSaso+*<~m}o_wVZN67vy_LO{Kib?scXvQp1PKpXay5{ zn5`#syr2`TV8Rtlw1SDfOb($cDTP4n;9bdyxZ!Gd)A1d5kj!C=6^UD32;%J#yK05v zmBE^BP#6aB7kyB~eCwG_{NB8vU;N5`%(G^%Ubw!eei>{!l)X>CHNQ3 zLQ7sbyP`D0ZQ(F5pM6ZHrLYa(^`FLfqdRW;pFj#pjg?S)XRQy^oHgD*Y7h!pwA$La zp%F(*7mbXSHh*cF3R~1tYXfnO(()9xcdlnf>iynTcYJwP{N!teMCIP8sdChytRW=b zc{Nklq6RysZONe6H#FA)?;N?A73N7b|KfSaFZ1;JMEFZsVD~;jav>#JacGOGK{3;~ zq|`*ZeZAiK>!5pQbINj7y`En+g_T(T=ZY?!nY2Osuz!q99yWw&J^mGb+KN`I=9QL* hRu%5+Td5qv_A3(p;KmBA+;8Rs`~g&&6r*hl005?P3IhND literal 541 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 literal 23503 zcmb7s30#xM*0)QM78Ghl0wPeaEv`UVj6zs$^;T}YC>9hI1QH_xvehEQuoe|)3rICC zVNI=E5CJiUMGQL<5CSMW#3Zj$LRmtT2nYf4ok`I4-uJ%m_kI0MaWc<5%gmfPbLRa2 zXABcRUZ(u7yK+M@|S(y}xS4Fj+oP)D4Or^$JZO1mMocV^h-P=<|boa0+{fHvbR)n|_ogMPmLNrq;IXv6I9+`_)tTc zp&tD~)A6T&OYM(cMD0d&Z=#0bVrDzRj<%=1&t}x($M*TPLrkk{H*`6ozcYTs5d*GR zVsQ=+-_`VOeEKTn^e>XJDJ6EPrn#F(9auGd%JUyeUx=3J2a551pVizewj5OU|aw?u(ABdh@sDNK12^ z(}llSUuIf;4_`mMynu_vRoSl%tjUNETTUKicaLQsKBJ?@E`;*1GViSLE6H9rP3eQL zP3T>{wS9eo@YzhZ8%2+@io@|v+?15ul4Gc&cgxrgi!(VkNFIFH@F|CL5?v_I*#{R2 z*VJY2DYBj#O}>${1_oY7&*`B3*rC)2vbQYbrqwHZ?-$hV-tkQ4NZ#+N98PBLXFfW5 zlmhOSIP?0xN1ZpzcY79lXPvqxa#HuU6JMu}TIF$b1`3np6j@<|1nWsmE>2&~C|2dO~K+cUKJ#aMlz@HqN6f=97UCmvGg{sr5p zDQ}Z;eVj$Kt4zDm)ZgA_OYd*v3`DqRc~+B#tcpSMwF8^<~N`E~p z`uaAvWiORjVCOB?=1!V)O53=N z*E26>@xrIh`+9q7HCOz8y*$@!hi1}9e{;po>(rx7vU`WKj^4J(KST|8;|FGScD@Yy zDnT5Qqth}H^p*Ye{f5l~?>WDg&UE?l$eVHIrt03FVa+c(Q*QVi-P#WKZpw{N2^?Qv z%skfAoAukNZ!Yw{S}QRRJkGxrH@Q=N=!CZ7`J&`n8_-yriSQE66M2(&0S}_ zZ`(k#ZpKX(SP!M1+9?U7h7UG;CCw0AICuEjep$vg&h*!sY6A}_#@3S2p*n#IdEmk1 zPW;fwP}g^6zl}X0g;}4oyB=P9{1A_F(Cntmj`m+)-~W2pqjC?AP28F5nng0f1!u8% zSg8i97we!RdQ_8<#0}%mY@s)YIFeU}Y!rkJY;$t552WVkbiS;3zTZ8op~*&l_F{ik z{j-UuHC%P>H?dYGSX@l$yPBQq61VmA&{(S-*xpT;mWv!>fUWO_OH8{LmZjT^YmesI zR5E`tc9La;4qFAf+wH)nuL$WR4MeV47`pl!=m=F&u|hf`TOCAqYqG;z)u+-hqq|JI z{1<-+FI*8~xtNNfYZ;;>ez(yPn~QW9=&S8-PN<45oYqix{K?`!r!U)lVy$#jFRh?W zs(eV~5Zu^qqI31~4<#;7d-scezUe~0?n0+Nvw)^Csln-;g2;k zq36XB$X_~c*gR^|f=eLfUAAL@;Ztj+$A%C|bECDvubKh2o;srSUDHte?l zoYFxjA>|J3om)fi3RX_U49sY#=iOfFZO`Gj@J#6K43CYwz3noHht#-!u_v^Uu5~!$ zPL_UhW<7njiCfPWWl~C{_0(Yx7p`^1nD1$geW|3j6(Kf@Rv$~OCo1xXSDqE_Y6z%f zAKHJ${<^Nn2Adl&75TWw8nag^GPDra1Lz0%u4!WZt9n9{qd z+8jiC-Wp?DYEGVSeo-~{tBdGnc?LD+WAehwyz8o*xq6Vl3h8}MuU>dNbMf_&fwptG z+{&u^QN3DFr{;LfyJxoo&9yi}?}@2U%`w}Nu~nQo>oIo|RA8T&V-r|O?0Ba^6Mcpy zv|~q1et+52Culn*iok2mbe|5+jXGA;9spySy{qXtTsh<}a@BJHRcco1@b+7w_4V0D zE+S7u0s3g$UlStaFRie{u~x=5sz&0<`fPRx)=vTk0@Bfmu+Gd7dFC^mqEfC)JHgvi zySZZgdN~Dm_8d~5da8xo{Jp8i;)V;<17Y>~${&v{m6M~?9Y@`X&cg3{wuJ=C8|OUH zIws*mFY@F}vmxj+!D32sF4oT`jxe~*af1`7oVuV(AKaTka#kb_G{Y4+ z+y|>__Vnp6HOFQZuIE+@ZuDKeW13H0HaimQm-R`A=hk+ZgE#hgJzb0+T4D4d6{-^h z>am(IAq>d^x zM{D)(2|mlQBRiKFWvbL_o?Dri-Rr_LP8Z^eJp`6W~6As z@EDj!&io?vsmCT=V=vh$EE`4wGo<)Nm%356y3teuHg5uZ<1x=_peB2&p|+{7{Kk75 zn$uRe^L_v2d2GDmn3hnV&0O}!Sbi8(MJDH3qNR3Cb_utF)+v}hl-`N6!*0t(iC6Ah zz3CGgbl<6u$-`cOt0RWZHHBPbB>H*cnm&n^`)X28-0&C4wMSmjdN7SF#+7p}A6DC> z1%qFw?6K1xyT)ROi=53CUzRdOGM>#j)9h((tG=_L(A1{{4D#hixBxRPA zkPoE8g1aPSogY@rai0H87ae>GE2FNDnlYqh)VhucOQRxTGBZlSu24L}G3_5U0mGFG z2TkaAR*-#SZc=pcGFC->Uq55&B^G+NUCnVo?=q9s@P zrjBVdb=gxYj-!plj+0u-Ugxw8!lppE2>a=)B7M?xZs~Ve&zU#S^uMReYO~7?9e)B* zbo!nk`ve>2>37af^5g;KzR!kBNFP7~O*UFj>afNbK|_#gQ(6gupjKI6d@M&=L6OKl zX^M}7@1tK&Z0UDuY!;kIe=i~*_FJ5`PkCnd%j~Of!X_wd)@@XS93k@0lSQ8HnDHY8 z1ow|>(B3DPJhnJg({b+pIB5LfFxc@puO^M}#t-NmGMi4<*WQQbN9Ygj=Nu9$ZQF5e zE=giz_YCxqSF6bpE!sXhyqKUto2d*-QC3otc*ad(1qBHEkXGTqu7J0@6fBuAWP7Qw%Ls_)ZN~a6uJdE%S|LP!BA1Jldf)M4LNc`_fLBp!0(58ts15Q-d|SCeHpALlbV zypRj;)_C*>TdgaEuTO+c>9jj+UqJ;#x9m&5wQv&`Us-t({@AL*#!gH-4!cc8c5?fX z)Ih#1wzQgLcA2@5jEfgjW{Dj$n@AmH+N6LO_%O0euX_*Atq;VeD(2&mBMRMYLL8U< z8fcP3e``z9;oW+GgnOrT`R|1xg&sA1(HCJ3RHdIS|DL(~_k!{%vI$gYi z)AJ6eQP;OY2oLv^CvBFbr8tgilDMohL$QQGyyN6o?dnt3+piDbh3#U_q=|dW>ZIAyRh&romE@{I zTy9_nspI4dqbNLl49s^O_hYVu8CB}%oPU6K>7tgVF_THbg+9=CyU6*&+n`!tMy`%~ zZgHBV@W+A3gJuLNw$z{)JOSa)ptWPQxVFlvE8rf0azCLCr{@xClct*q+V(&nL61%S z;%8tawl{U)RDJ17R!gGBIqE4)SzBHDb@&Fxzy+8A&^VVC**$2!TRUi9eA};fmMyFI~;YhS|@bgf|H@bm_$=-xCJ*?1a@NS%US8Okjov=`jTGE(=pA zYyFZqUNu)=UQ}QUD=`BWCenENc2^2)iges5WmcKthkknbrm2sz2;U&mHq^l<1oGOn z$o^;1=;s-?VM`}UPiCBd^};y>w!LVGYs%%h0@5^@Xic!AjQF-;fUAOm8g6gz0dx1THx#=JiEXx(-US z!ya$cl?ATQQzZr1*FrO8pY+`Pkj1&8+osyFdB*kGr4<`eeIDlE0&Dt$zdX)ZMw_GR z@V59hPQYH8P$2xC8TDDGCd?^%G|Z_dbIGBbKJ4e9Wx`Vn7D?i=;~=-y4FjN{8KiLm z8w7khY$w<>P-6=j#5n|Jg5yswb70gsRqRs>nn_WVhVPb>XSju)!NbQ><(=S@^c<=WsEmc_q!pK^A9jm;@_l(t@Wr?sr|I5g3w2 zVt~DLujMM5=p}ZVFTr_%Aq{U>&@LQWcmV5qbPnp4?~uB?1?mpe40N$L)Lo%rJNnkp zChZJUEqgB#s0mElvn}`}e(ytAFFnhK^o@o<)x0*AU`vaFsP-FDi%TyO{CDWcY`svQ zNYkT<9mki^-mWBP6}Z~FNX(sF^BLPXZR!Ez@n$HWN67>q!Y?2b)xJ{}4SoE*dKBV# z(CuVAHcUg&4ZKEl_pVM&#|;$XwP;X1QXF);B(=vWruBN-beI1RRd)TmP@iMswE89Tk^OUOp; zduq9gEIj9Y?TPI|K*IzD06v--&d%US$Tio5}M~)j{-r1D^#QWC3j7zzTL; z!|g;?NX}7Yg)Dx`X54X3EUP7HGMpcI=mWHUeGwCNty z!-lo_4t#Is#PnOqY1`o*=y=0Q992ut?c*HK!DC99lLbG+ECl_qy4-IZ%UTK)@!r!JfTU+RKU9C83J+;hpA zwmKF!c@jg5;IR))S8P^H@fnNkfBGgv8>%XY;!Iy4cq^ zL|h!@%j8xEBk``9z0ajwdY_{ zJ*+ti^XD0?l6L7O>N@Q9GqA!=uuibQH}k6g*8-+2phvN>f($M?p-5e*LGc2nWV(3{E>k8|0Gmx*#T=;1;J$O#B6qWA-H< zx41uNg=Ut8b=ix$Xg#{-irFm9uKB{YK6`eRV~2$@CGlr0ps7*zsMY^HI~GA2pD_)n zVvhe#{fRJkK!@$_8y?SO$L09^uUTQ~gGF7=gtqHchNwON>MZPo!ACx$gBEYw{a~Bq zc_>P%m!C!5X6DBJo*9t@y)bCiDSp;i6sq^!0PVPqJbn)_JGC#oiZJzhm_8(K1G>(^1+7w ziEq1*vlxrehd_fo?QzR9v2P9Vreu_JcN9IaR6;>AtlUB|*>3_5HDf+d811V|N6lM`vdZKDK(7{U0ONSp3t6-D;idsh67@>K|1BG!bjGIXF|=WabXGB8 z>D5mMRFY=Xp?5_d=B@Q~%2Uu;f-gI5lBl=d7xwKQJ*en?f;91>h;&Uv;;!^gOEA;C z?q|T6KL~cWbayHg3Qt2}3~i~9o{h@;ZPbjw3ipe)GJk5Zg6z2+6ou%Y4?%PMDQmY4 zmC{h@A6eMOCCz3RfKq`izMB_vzMMUMMulT@qNj?;rFo0h|D2t7MWw;0^xv}`o*Nz0 z{A;t%`FK2oX0er$goH_qT3ps5B10CvTwsE}No zn##ZobQJZ8V?I_fPP6&VJ0zO?^D2I(4Q834hY z`EYIIC)1H-t_2HvvYsBdiZz^Mb^L&Ae2zFD)DEm3l z7QeeGMNyPcqEkmV>`}bT7dq;W~T;&P8a3k7RHku(>m+2t&APra%-}wE0Sj84z^=O7@TcA-K+2I zYH~EGb7`@JCG$^Lzp#~H;BpliE`wh+dsfFW&7qbqfqQ5@zF0s08s#;`Qkyh;1w9py zo+{_Rjl`NG2PG1Am=!HKRK)}^O^1n59RL$U{_x++$IIrGvber=OHA|2rfdL5&ae9D zz0$f=3QEh)7b&g(IlELDoP^-_b@9VL<*AT8+hPebVEozY>PUmi#8E#H#QK~HUXOsp zWd{a=ChzK5MdCVr$U5s?CIo(JRPq(Q3q1CUAMfjU1YQ#5mWHX3v;6&Yv7+)nviMS% zFjeFa>pt?jfKCzpQLf0+1{%)YRvHG2-e`7tq5BrS^{RHIk?+!R8RHu}rR|?|ug68(L*VxO{+Hx%L3J zn#q5GPnf@iKA|c#8f~&5ab;(sv=k!xkNi182$^oV+Yv=jX|r&#bB5y;Dt zl2g1@L@f~grSL0aN7fd{0V!Y*S@_Mg`Gd%A6b)G}K+m$e+hOMd4VCyQ8(N(U9WbAT zIv^q~8tk(|Z(@hrDx)a9r&||}B ztocafr$%DqdiqSyz~`W1fx!ZL8kD5K8SVN1fo6m8uH;&PCJ;JddDG@&*!8tNBwYgo zZ|tmFoLN!+)HhgB5$dn%4lunJ4}d#kc8AjbCfG}_rmokK`e`K1T7vN}>V)kLUD6KX zT4mq4Drt5Rc9J5Q1&FbtQ1DkMggFR>Yb>E~rWI-mcB4Wesu^VwxDf+Ii+j+`gQ#dN zx*1mLz~veq{;aMeZ8>g2*5C zthLG=`Iqs8_OaCVJ49~8DgU!NQZI0+b7P*1&i_OJ*2wkn&1

    OvbtA09c+X;!tY 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 diff --git a/src/main/resources/data/betterend/structures/biome/shadow_forest/small_mansion.nbt b/src/main/resources/data/betterend/structures/biome/shadow_forest/small_mansion.nbt index 0af440e53f0155e28c055f7246a5a43d084a963b..74c6bb5391c5e8ac4d276c29cebf40aa01b71ddb 100644 GIT binary patch delta 147 zcmV;E0Brx$PTfwh(6V>0RTiw BPA|9-o}O&u!BU#NS??UmsteoS!v!zPs)CRWD60$b5_1s4{tm}o==R)^VO&HI@YT$ rUc9vY?tP4RYfPq#QPcmy@%8cF?B4v{W}@l7*8DraquZ?_lmP(%eTPlE From 650c85194e528ed1a785c9d0bea396a652073c2a Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 25 Jan 2021 08:25:54 +0300 Subject: [PATCH 228/463] Added missing recipe --- src/main/java/ru/betterend/recipe/CraftingRecipes.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index 897399e5..85ef47ec 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -117,7 +117,8 @@ public class CraftingRecipes { GridRecipe.make("amber_gem", EndItems.AMBER_GEM).setShape("##", "##").addMaterial('#', EndItems.RAW_AMBER).build(); GridRecipe.make("amber_block", EndBlocks.AMBER_BLOCK).setShape("###", "###", "###").addMaterial('#', EndItems.AMBER_GEM).build(); - GridRecipe.make("bulb_lantern", EndBlocks.IRON_BULB_LANTERN).setShape("C", "I", "#").addMaterial('C', Items.CHAIN).addMaterial('I', Items.IRON_INGOT).addMaterial('#', EndItems.GLOWING_BULB).build(); + GridRecipe.make("iron_bulb_lantern", EndBlocks.IRON_BULB_LANTERN).setShape("C", "I", "#").addMaterial('C', Items.CHAIN).addMaterial('I', Items.IRON_INGOT).addMaterial('#', EndItems.GLOWING_BULB).build(); + GridRecipe.make("gold_bulb_lantern", EndBlocks.GOLD_BULB_LANTERN).setShape("C", "I", "#").addMaterial('C', Items.CHAIN).addMaterial('I', Items.GOLD_INGOT).addMaterial('#', EndItems.GLOWING_BULB).build(); GridRecipe.make("twisted_moss_dye", Items.PINK_DYE).setList("#").addMaterial('#', EndBlocks.TWISTED_MOSS).build(); GridRecipe.make("byshy_grass_dye", Items.MAGENTA_DYE).setList("#").addMaterial('#', EndBlocks.BUSHY_GRASS).build(); GridRecipe.make("tail_moss_dye", Items.GRAY_DYE).setList("#").addMaterial('#', EndBlocks.TAIL_MOSS).build(); From 28886adf33b5f207886ad30be4d058976a10ef03 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 25 Jan 2021 22:04:06 +0300 Subject: [PATCH 229/463] Anvil states & new textures --- .../ru/betterend/blocks/BlockProperties.java | 13 ++-- .../betterend/blocks/basis/EndAnvilBlock.java | 28 ++++++- .../mixin/common/AnvilBlockMixin.java | 24 ++++++ .../blockstates/thallasium_anvil.json | 19 ----- .../models/block/thallasium_anvil.json | 69 ------------------ .../models/item/thallasium_anvil.json | 3 - .../betterend/patterns/block/anvil.json | 68 ++++++++++++++++- .../betterend/patterns/blockstate/anvil.json | 27 +++---- .../textures/block/thallasium_anvil_back.png | Bin 423 -> 372 bytes .../block/thallasium_anvil_bottom.png | Bin 328 -> 298 bytes .../textures/block/thallasium_anvil_front.png | Bin 456 -> 370 bytes .../textures/block/thallasium_anvil_panel.png | Bin 561 -> 368 bytes .../textures/block/thallasium_anvil_top.png | Bin 329 -> 0 bytes .../textures/block/thallasium_anvil_top_0.png | Bin 0 -> 314 bytes .../textures/block/thallasium_anvil_top_1.png | Bin 0 -> 400 bytes .../textures/block/thallasium_anvil_top_2.png | Bin 0 -> 382 bytes .../resources/betterend.mixins.common.json | 1 + 17 files changed, 136 insertions(+), 116 deletions(-) create mode 100644 src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java delete mode 100644 src/main/resources/assets/betterend/blockstates/thallasium_anvil.json delete mode 100644 src/main/resources/assets/betterend/models/block/thallasium_anvil.json delete mode 100644 src/main/resources/assets/betterend/models/item/thallasium_anvil.json delete mode 100644 src/main/resources/assets/betterend/textures/block/thallasium_anvil_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/thallasium_anvil_top_0.png create mode 100644 src/main/resources/assets/betterend/textures/block/thallasium_anvil_top_1.png create mode 100644 src/main/resources/assets/betterend/textures/block/thallasium_anvil_top_2.png diff --git a/src/main/java/ru/betterend/blocks/BlockProperties.java b/src/main/java/ru/betterend/blocks/BlockProperties.java index 39ee9d5c..b79bf939 100644 --- a/src/main/java/ru/betterend/blocks/BlockProperties.java +++ b/src/main/java/ru/betterend/blocks/BlockProperties.java @@ -6,15 +6,18 @@ import net.minecraft.state.property.IntProperty; import net.minecraft.util.StringIdentifiable; public class BlockProperties { - public static final EnumProperty TRIPLE_SHAPE = EnumProperty.of("shape", TripleShape.class); - public final static EnumProperty PEDESTAL_STATE = EnumProperty.of("state", PedestalState.class); public static final EnumProperty HYDRALUX_SHAPE = EnumProperty.of("shape", HydraluxShape.class); + public final static EnumProperty PEDESTAL_STATE = EnumProperty.of("state", PedestalState.class); + public static final EnumProperty TRIPLE_SHAPE = EnumProperty.of("shape", TripleShape.class); public static final EnumProperty PENTA_SHAPE = EnumProperty.of("shape", PentaShape.class); - public static final BooleanProperty HAS_ITEM = BooleanProperty.of("has_item"); + public static final BooleanProperty HAS_LIGHT = BooleanProperty.of("has_light"); - public static final BooleanProperty ACTIVE = BooleanProperty.of("active"); - public static final IntProperty ROTATION = IntProperty.of("rotation", 0, 3); + public static final BooleanProperty HAS_ITEM = BooleanProperty.of("has_item"); public static final BooleanProperty NATURAL = BooleanProperty.of("natural"); + public static final BooleanProperty ACTIVE = BooleanProperty.of("active"); + + public static final IntProperty DESTRUCTION = IntProperty.of("destruction", 0, 2); + public static final IntProperty ROTATION = IntProperty.of("rotation", 0, 3); public static final IntProperty FULLNESS = IntProperty.of("fullness", 0, 3); public static final IntProperty COLOR = IntProperty.of("color", 0, 7); diff --git a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java index 701f1c16..6e06f0cf 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java @@ -3,24 +3,39 @@ package ru.betterend.blocks.basis; import java.io.Reader; import java.util.Collections; import java.util.List; +import java.util.Map; + +import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.AnvilBlock; +import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.MaterialColor; import net.minecraft.item.ItemStack; import net.minecraft.loot.context.LootContext; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.IntProperty; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; +import ru.betterend.blocks.BlockProperties; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; public class EndAnvilBlock extends AnvilBlock implements BlockPatterned { + public static final IntProperty DESTRUCTION = BlockProperties.DESTRUCTION; + public EndAnvilBlock(MaterialColor color) { super(FabricBlockSettings.copyOf(Blocks.ANVIL).materialColor(color)); } + @Override + protected void appendProperties(StateManager.Builder builder) { + super.appendProperties(builder); + builder.add(DESTRUCTION); + } + @Override public List getDroppedStacks(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); @@ -35,7 +50,18 @@ public class EndAnvilBlock extends AnvilBlock implements BlockPatterned { @Override public String getModelPattern(String block) { Identifier blockId = Registry.BLOCK.getId(this); - return Patterns.createJson(Patterns.BLOCK_ANVIL, blockId.getPath(), blockId.getPath()); + Map map = Maps.newHashMap(); + map.put("%anvil%", blockId.getPath()); + map.put("%top%", getTop(blockId, block)); + return Patterns.createJson(Patterns.BLOCK_ANVIL, map); + } + + private String getTop(Identifier blockId, String block) { + if (block.contains("item")) { + return blockId.getPath() + "_top_0"; + } + char last = block.charAt(block.length() - 1); + return blockId.getPath() + "_top_" + last; } @Override diff --git a/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java new file mode 100644 index 00000000..9e73f468 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java @@ -0,0 +1,24 @@ +package ru.betterend.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.block.AnvilBlock; +import net.minecraft.block.BlockState; +import ru.betterend.blocks.BlockProperties; +import ru.betterend.blocks.basis.EndAnvilBlock; + +@Mixin(AnvilBlock.class) +public class AnvilBlockMixin { + @Inject(method = "getLandingState", at = @At("HEAD"), cancellable = true) + private static void be_getLandingState(BlockState fallingState, CallbackInfoReturnable info) { + if (fallingState.getBlock() instanceof EndAnvilBlock) { + int destruction = fallingState.get(BlockProperties.DESTRUCTION); + BlockState state = (destruction < 2) ? fallingState.with(BlockProperties.DESTRUCTION, destruction + 1) : null; + info.setReturnValue(state); + info.cancel(); + } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/thallasium_anvil.json b/src/main/resources/assets/betterend/blockstates/thallasium_anvil.json deleted file mode 100644 index 917cb573..00000000 --- a/src/main/resources/assets/betterend/blockstates/thallasium_anvil.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "variants": { - "facing=east": { - "model": "betterend:block/thallasium_anvil", - "y": 270 - }, - "facing=north": { - "model": "betterend:block/thallasium_anvil", - "y": 180 - }, - "facing=south": { - "model": "betterend:block/thallasium_anvil" - }, - "facing=west": { - "model": "betterend:block/thallasium_anvil", - "y": 90 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/thallasium_anvil.json b/src/main/resources/assets/betterend/models/block/thallasium_anvil.json deleted file mode 100644 index dfbf1030..00000000 --- a/src/main/resources/assets/betterend/models/block/thallasium_anvil.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", - "parent": "block/block", - "textures": { - "particle": "betterend:block/thallasium_anvil_front", - "front": "betterend:block/thallasium_anvil_front", - "back": "betterend:block/thallasium_anvil_back", - "top": "betterend:block/thallasium_anvil_top", - "panel": "betterend:block/thallasium_anvil_panel", - "bottom": "betterend:block/thallasium_anvil_bottom" - }, - "elements": [ - { - "__comment": "Bottom", - "from": [ 2, 0, 2 ], - "to": [ 14, 4, 14 ], - "faces": { - "down": { "uv": [ 2, 2, 14, 14 ], "texture": "#bottom", "cullface": "down" }, - "up": { "uv": [ 2, 2, 14, 14 ], "texture": "#panel" }, - "north": { "uv": [ 2, 12, 14, 16 ], "texture": "#back" }, - "south": { "uv": [ 2, 12, 14, 16 ], "texture": "#back" }, - "west": { "uv": [ 2, 12, 14, 16 ], "texture": "#front" }, - "east": { "uv": [ 2, 12, 14, 16 ], "texture": "#front" } - } - }, - { - "__comment": "Plate", - "from": [ 4, 4, 3 ], - "to": [ 12, 5, 13 ], - "faces": { - "up": { "uv": [ 4, 3, 12, 13 ], "texture": "#panel" }, - "north": { "uv": [ 4, 11, 12, 12 ], "texture": "#back" }, - "south": { "uv": [ 4, 11, 12, 12 ], "texture": "#back" }, - "west": { "uv": [ 3, 11, 13, 12 ], "texture": "#front" }, - "east": { "uv": [ 3, 11, 13, 12 ], "texture": "#front" } - } - }, - { - "__comment": "Support", - "from": [ 6, 5, 4 ], - "to": [ 10, 10, 12 ], - "faces": { - "north": { "uv": [ 6, 6, 10, 11 ], "texture": "#back" }, - "south": { "uv": [ 6, 6, 10, 11 ], "texture": "#back" }, - "west": { "uv": [ 4, 6, 12, 11 ], "texture": "#front" }, - "east": { "uv": [ 4, 6, 12, 11 ], "texture": "#front" } - } - }, - { - "__comment": "Top", - "from": [ 3, 10, 0 ], - "to": [ 13, 16, 16 ], - "faces": { - "down": { "uv": [ 3, 0, 13, 16 ], "texture": "#top" }, - "up": { "uv": [ 3, 0, 13, 16 ], "texture": "#top" }, - "north": { "uv": [ 3, 0, 13, 6 ], "texture": "#back" }, - "south": { "uv": [ 3, 0, 13, 6 ], "texture": "#back" }, - "west": { "uv": [ 0, 0, 16, 6 ], "texture": "#front" }, - "east": { "uv": [ 0, 0, 16, 6 ], "texture": "#front" } - } - } - ], - "display": { - "fixed": { - "rotation": [ 0, 90, 0 ], - "scale": [ 0.5, 0.5, 0.5 ] - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/thallasium_anvil.json b/src/main/resources/assets/betterend/models/item/thallasium_anvil.json deleted file mode 100644 index acefa708..00000000 --- a/src/main/resources/assets/betterend/models/item/thallasium_anvil.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/thallasium_anvil" -} diff --git a/src/main/resources/assets/betterend/patterns/block/anvil.json b/src/main/resources/assets/betterend/patterns/block/anvil.json index 4e7ee106..8d6658d3 100644 --- a/src/main/resources/assets/betterend/patterns/block/anvil.json +++ b/src/main/resources/assets/betterend/patterns/block/anvil.json @@ -1,8 +1,68 @@ { - "parent": "minecraft:block/template_anvil", + "parent": "block/block", "textures": { - "top": "betterend:block/%block%_top", - "body": "betterend:block/%block%", - "particle": "#body" + "particle": "betterend:block/%anvil%_front", + "front": "betterend:block/%anvil%_front", + "back": "betterend:block/%anvil%_back", + "top": "betterend:block/%top%", + "panel": "betterend:block/%anvil%_panel", + "bottom": "betterend:block/%anvil%_bottom" + }, + "elements": [ + { + "__comment": "Bottom", + "from": [ 2, 0, 2 ], + "to": [ 14, 4, 14 ], + "faces": { + "down": { "uv": [ 2, 2, 14, 14 ], "texture": "#bottom", "cullface": "down" }, + "up": { "uv": [ 2, 2, 14, 14 ], "texture": "#panel" }, + "north": { "uv": [ 2, 12, 14, 16 ], "texture": "#back" }, + "south": { "uv": [ 2, 12, 14, 16 ], "texture": "#back" }, + "west": { "uv": [ 2, 12, 14, 16 ], "texture": "#front" }, + "east": { "uv": [ 2, 12, 14, 16 ], "texture": "#front" } + } + }, + { + "__comment": "Plate", + "from": [ 4, 4, 3 ], + "to": [ 12, 5, 13 ], + "faces": { + "up": { "uv": [ 4, 3, 12, 13 ], "texture": "#panel" }, + "north": { "uv": [ 4, 11, 12, 12 ], "texture": "#back" }, + "south": { "uv": [ 4, 11, 12, 12 ], "texture": "#back" }, + "west": { "uv": [ 3, 11, 13, 12 ], "texture": "#front" }, + "east": { "uv": [ 3, 11, 13, 12 ], "texture": "#front" } + } + }, + { + "__comment": "Support", + "from": [ 6, 5, 4 ], + "to": [ 10, 10, 12 ], + "faces": { + "north": { "uv": [ 6, 6, 10, 11 ], "texture": "#back" }, + "south": { "uv": [ 6, 6, 10, 11 ], "texture": "#back" }, + "west": { "uv": [ 4, 6, 12, 11 ], "texture": "#front" }, + "east": { "uv": [ 4, 6, 12, 11 ], "texture": "#front" } + } + }, + { + "__comment": "Top", + "from": [ 3, 10, 0 ], + "to": [ 13, 16, 16 ], + "faces": { + "down": { "uv": [ 3, 0, 13, 16 ], "texture": "#top" }, + "up": { "uv": [ 3, 0, 13, 16 ], "texture": "#top" }, + "north": { "uv": [ 3, 0, 13, 6 ], "texture": "#back" }, + "south": { "uv": [ 3, 0, 13, 6 ], "texture": "#back" }, + "west": { "uv": [ 0, 0, 16, 6 ], "texture": "#front" }, + "east": { "uv": [ 0, 0, 16, 6 ], "texture": "#front" } + } + } + ], + "display": { + "fixed": { + "rotation": [ 0, 90, 0 ], + "scale": [ 0.5, 0.5, 0.5 ] + } } } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/blockstate/anvil.json b/src/main/resources/assets/betterend/patterns/blockstate/anvil.json index 82389017..253ff406 100644 --- a/src/main/resources/assets/betterend/patterns/blockstate/anvil.json +++ b/src/main/resources/assets/betterend/patterns/blockstate/anvil.json @@ -1,19 +1,16 @@ { "variants": { - "facing=east": { - "model": "betterend:pattern/%block%", - "y": 270 - }, - "facing=north": { - "model": "betterend:pattern/%block%", - "y": 180 - }, - "facing=south": { - "model": "betterend:pattern/%block%" - }, - "facing=west": { - "model": "betterend:pattern/%block%", - "y": 90 - } + "destruction=0,facing=east": { "model": "betterend:pattern/%block%/%block%_0", "y": 270 }, + "destruction=0,facing=north": { "model": "betterend:pattern/%block%/%block%_0", "y": 180 }, + "destruction=0,facing=south": { "model": "betterend:pattern/%block%/%block%_0" }, + "destruction=0,facing=west": { "model": "betterend:pattern/%block%/%block%_0", "y": 90 }, + "destruction=1,facing=east": { "model": "betterend:pattern/%block%/%block%_1", "y": 270 }, + "destruction=1,facing=north": { "model": "betterend:pattern/%block%/%block%_1", "y": 180 }, + "destruction=1,facing=south": { "model": "betterend:pattern/%block%/%block%_1" }, + "destruction=1,facing=west": { "model": "betterend:pattern/%block%/%block%_1", "y": 90 }, + "destruction=2,facing=east": { "model": "betterend:pattern/%block%/%block%_2", "y": 270 }, + "destruction=2,facing=north": { "model": "betterend:pattern/%block%/%block%_2", "y": 180 }, + "destruction=2,facing=south": { "model": "betterend:pattern/%block%/%block%_2" }, + "destruction=2,facing=west": { "model": "betterend:pattern/%block%/%block%_2", "y": 90 } } } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_anvil_back.png b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_back.png index 321f670eca3a828dec23d5fca78beae94ac6e225..fe9b06bb82fd429aa2ab38da4cb7e54ee6c8f31c 100644 GIT binary patch delta 333 zcmV-T0kZz51M~urFn<69XF*Lt006O%3;baP00009a7bBm000id000id0mpBsWB>pG z2}wjjR5(v#{Qv(y0}M3WxeVq=aWRAWF!1c#UnmO#8ddcep-cu81Dx0H1#=XIxWIfE zxc}}Olm!9%LR_#L;5vH)nDgVqM=&29a0u{&={;$I_+3B<;D2-hC=Ag34+2DoLCXH) zC@w(vI}G4-0V5+^oWW(*dKANu{f!KmpfrkR5a5&&V)!S-3&tQeE&w+G9f)zULRqM6 zbb!+U7~tl>tr-OH8bC-h2*3jo76!@tj{WE4=VlP*gYe&eg2;dW_!Uggb+SSUEVu!n zD3p=qLCFW`@kWnq7|b9HFMu?`FbIG&f$)>ZU*N7l1}Fv~D~4f^CUlL+2@J&xAR1Td fLkE!5$iM&qFUORD7(I8U00000NkvXXu0mjfsNIN| delta 384 zcmV-`0e}AV0;dCzFnOp)FA40u) zS6{%J55Ob9&6s$RM&d~mLjXa+rnOR=fL#xEH{EU^>74f4?9BJ=>}(DR)anfi0E*)S z03t(0vJPDj0C0PDoMW6Nq;Rlhp+eU17X0G#i{i(d;1xjCAb%)n>#&$sr9Ty^$n;1XF=rA$bI&@qB^M^#rm-3Ie%3oJkW%9@xzmg3%bnETbQH zBW4)@r0xr`e{n<4pC9RU|B3FNUeS5yBo7#hy2i(56J!#I3>EF+44r|CqON5ZP#hnf zfeVWicz`kqgn6#VUty7XQZkrf>3cJghszUz!;4zIK^4bGWT;a1i@L_wX(1s8dxsn7 zb-z)nnnHN~gJob6PO*KoBm4(0pg2ByT_PoqrE(HZu^9^|J>de8p`!Eh&PQiY7rGu# e=H0z5nfM3eH@;c^TwfFb0000pF zzez+vR5(w~kxL4~Pz*({1x19abnHZzA}+yYx&(0%j>Qi+aZ+pxA_{))qX~~kT6iNp zlS0yS(=_-wo%)ISYW<#O1Ej+)s`80LenXO1xL*tO$0NM56noO&9t&)i3+E=z{t_dz zCul&7%$}eDzD(NW-fZIDAsXOMCZYV;pIx0Y>w*TfeKzH=E@(iE%yk6~XxiD5PrFNP zc>&hsur9KBg;2I8^GD07f(DQ#nRQO~dx8eY87}c8Fn<98Nklb;@5JjIMk;q2EDBu)yq@?5)oP;(-a*E_2 z+<~5w1}QCyKn7tP*;c$*axACXmDhNsbY!a0tlrF@zXR6}M|aR6?r-Db~Id|41CCFeNhD03dgEqCq{{jS4Mw0~J2ept>InrW#-cmoT3 zZ@}j`HB`2$3KR@j;mwycJTMxl$-o8tu?YYekG$pvot|rz{ke}AJqTS_=3XeU!S#Bh zf-H&~cdo;}ER1h86x1izz3^qhZu@OF5zvM;O%9V%o2)_~k_=9SNlCx!7=~5XIm(pG z2T4RhR5(v#%sG4UKLZd5^D%-b1}QFPFbxCGzWs%=P{G?zU~LSHPHXo3R}|s`bCALP zci*5a{D9GA)_Sl}KR$c}3y=!HE`YMJ0;YGLp)6GJPly*x4}XF%fYNY)>?Lf@-;)-I zqK64e!vQx3D}$DzD1)uO7=wnf5(B4{5ZJ#U3}T}L3}f9Fn`LHHjRoxDkuno-fng2j4Pc0l+nl z&|Ll3Yj+qPae$PTAiuNB#%!Fr95AoXQI`X1)lbT{#5E0;On;qZdYS2|81woBPjBCp z?urOuJLKmw3Oqqw4rqONlx+#{3#UTxSEq}#nh4i4BH^!2mz0(m3ok5AqUW**AQEoK zJ~MhE5-!`4)`y3*n#7JTuRT8?X*B`Rb6J3~YjwniKkT1fd273?kvkV}?s+^v2{B?= zpk>k{@N?M;Re$oQz%`8!TzPE=L28-w{{mqLQH@dhJfo^YAJB8{+oqg{SuF zm+bHC3)CQk$zkEv6Sfn23qGi2(qkoYwSv8a6>8N_l1sUfBWy^MZm-Yg(H5nfoFn<69XF*Lt006O%3;baP00009a7bBm000id000id0mpBsWB>pG z1xZ9fR5(w?lf8-pK@fy{?@ZJ~K{*l8z(^3p%*@C~xaYVB^C64{0|N!YXahwBQBeFz zlsRg!nr2uN4ekS3XKSmvX4s9KbMg)!kL$~5gWvJQ6?2hPGJl`4y4+=VbaFkMC7sVo zcz+geW$@FB;L`?ts6SlGa&huz0@G-I@b_V^7cvjU1aJaHOs>|xq*YG&aI67z{s$Vs zdf-`Ys}T+0o|Zz*Y+nj2c31 z7|;M)Eu0Ju??M2ugMbEb&+-1^*WAi;Fn6=ut=FBRUm;Y z(&rN-Z9Ye;wCPe>q)%aL;kpCi;F?Id!-%UgquFu5w-lS5Ta`>Vf99Fz|MEPASKof@ z_;;My0)TB;{_ovL1%Ma$7^!fb*@99t9Z&3c#=vO>N+B-G1MFT`&h52ixW!zsipnp^LLgiK}0pC z^VB*Apec#~On>J)E8(!XKUyQAn)RewDWnp%VcB+Gs>JF)EWRDY09>>pvZgwo;5f4d z)A@U|N1Ryg#s_|sa6Vjflq(5P9+$r?C*7PV(I0JGdX#=nHNq**+@mn zKgCF8iM@0kUY7UmAU;ZA zs5j_%!dS2N%yf-Zw9j06@x*2;uWz`^O=Nxo6O&TU*t&p?vDfJyjdJEshRf@lJu_V| z@R`ncynX-1nwL*usS?IIBrz*44wea^@bc4FyUrO+cwDMHc8H6p#$TR@2(8KmXukje O002ovP6b4+LSTaKG5+lU diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_anvil_top.png b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_top.png deleted file mode 100644 index b83f089dbe19a8dec8bbabaffa03664cfe24449d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 329 zcmV-P0k-~$P)Px$14%?dR5*=|le$fS2Ie7?5}X%F4)s#L9+{ zN~^dPB?Ax^9QhI){>iuR_?+Lez^e1>MQ6szdTVddHX495S1c|sgjwIitCPB-%mjz> zfS27Dt4+t#^ODoEW6Df$ck|$!Pn^km`wLHc_(Q*2q7(l4%UF_pe{LFSDq00000NkvXXu0mjf=RK1B diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_anvil_top_0.png b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_top_0.png new file mode 100644 index 0000000000000000000000000000000000000000..a8444900ee3d0408110c21064cf16dad234544c2 GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!SkLjjv*HQy%Tox9Wvl?jh&&vp(4QDw2+yb z`TvRZ4~ZL$K12vGcN}l&lF8a(?z?Kv(oL6(lhuV2YVS;0{ybW5dyv~-AGONpHTT|~ z+oW-9-Tqnn^>M3zSp}uMRTdGL6n~xl8h;})i*O?PwBIarsRsA>yfIJIN5d`|$wy){2RCDxal zIx+etueO={HKsSfp=%A0yK!z{UQP3ja~iK7{}cSlFn{(_t0e{tyn$Y0@O1TaS?83{ F1OVdaduspy literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_anvil_top_1.png b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_top_1.png new file mode 100644 index 0000000000000000000000000000000000000000..9af873c21f70323ec0c1d4f4350fe883afd0f640 GIT binary patch literal 400 zcmV;B0dM|^P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0VPR9K~y+TZIZ!C z13?f(d!v^`QBZ^+@vsLkg8pMZBj4lATaW~D+JjL-LWC7vFA0%1SVQ-af}xq-?yBnE zsmx*WK0ADLd)s~;?E0dz<=eN7?#|QwxBapH{E^=G(zZ%5k4Jo7}9t z5C~9I(d%kw&1aXCAL^T&N5mr#U>6dKP_3^9K^amUc?1HAL;}<-QrvJnj_v^K-ZrGq z({&=`cmx7%n`R<+k%Cek1Of_Vo5&upU+%*r5U2p#DrB5;nI3^a1=wb08aa^oZytdF zyDy72&x|SukmH;FkPryiHVv8?pv+SB8maLJ1gIQ)Kt!OsM<7shIWx9#p$Fv=2&4?u uj4NzE4o_3meuO|E+o(y|JE1u~CbK_v0MH;$nb1A}0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0TW3?K~y+TeUrUP z15pr#CrOnkS%{cIwAey~6tT1O;d~4qAM1-oR4?9_V%4n@ky_fYPs0! zPB0+R56#|xty!+^XZ0P#gebv)b}``)sr8^|-RdBS=|~9%9C8yViRnlw?ts?wwq1;= z5)AwhV%{odq!Piv6G* Date: Tue, 26 Jan 2021 17:33:26 +0300 Subject: [PATCH 230/463] Shelf recipe fix --- src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java index 46aaa669..d3626da5 100644 --- a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java @@ -108,7 +108,7 @@ public class WoodenMaterial { GridRecipe.make(name + "_sign", sign).setOutputCount(3).setShape("###", "###", " I ").addMaterial('#', planks).addMaterial('I', Items.STICK).setGroup("end_signs").build(); GridRecipe.make(name + "_chest", chest).setShape("###", "# #", "###").addMaterial('#', planks).setGroup("end_chests").build(); GridRecipe.make(name + "_barrel", barrel).setShape("#S#", "# #", "#S#").addMaterial('#', planks).addMaterial('S', slab).setGroup("end_barrels").build(); - GridRecipe.make(name + "_bookshelf", shelf).setShape("###", "PPP", "###").addMaterial('#', planks).addMaterial('P', Items.PAPER).setGroup("end_bookshelves").build(); + GridRecipe.make(name + "_bookshelf", shelf).setShape("###", "PPP", "###").addMaterial('#', planks).addMaterial('P', Items.BOOK).setGroup("end_bookshelves").build(); GridRecipe.make(name + "_bark", bark).setShape("##", "##").addMaterial('#', log).setOutputCount(3).build(); GridRecipe.make(name + "_log", log).setShape("##", "##").addMaterial('#', bark).setOutputCount(3).build(); GridRecipe.make(name + "_composter", composter).setShape("# #", "# #", "###").addMaterial('#', slab).build(); From f3fbe60ab51c6f4236e1f4c3f72c4a3ae7d0f87b Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 26 Jan 2021 18:24:23 +0300 Subject: [PATCH 231/463] Compatibility with Plated (#47) and other similar mods --- src/main/java/ru/betterend/BetterEnd.java | 10 ++++ .../betterend/blocks/basis/EndPlateBlock.java | 52 +++++++++++++++++++ .../blocks/basis/EndStonelateBlock.java | 47 +---------------- .../blocks/basis/EndWoodenPlateBlock.java | 47 +---------------- .../java/ru/betterend/patterns/Patterns.java | 1 + .../blockstate/pressure_plate_rotated.json | 21 ++++++++ 6 files changed, 88 insertions(+), 90 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/basis/EndPlateBlock.java create mode 100644 src/main/resources/assets/betterend/patterns/blockstate/pressure_plate_rotated.json diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index 9169d613..4cf23d03 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -2,9 +2,12 @@ package ru.betterend; import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.event.registry.RegistryEntryAddedCallback; import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.block.SlabBlock; import net.minecraft.item.ItemStack; import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; import ru.betterend.api.BetterEndPlugin; import ru.betterend.config.Configs; import ru.betterend.effects.EndEnchantments; @@ -76,6 +79,13 @@ public class BetterEnd implements ModInitializer { } }); } + + RegistryEntryAddedCallback.event(Registry.BLOCK).register((i, id, block) -> { + if (block instanceof SlabBlock) { + // Do Some Stuff + System.out.println(id); + } + }); } public static boolean hasGuideBook() { diff --git a/src/main/java/ru/betterend/blocks/basis/EndPlateBlock.java b/src/main/java/ru/betterend/blocks/basis/EndPlateBlock.java new file mode 100644 index 00000000..c38a3045 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndPlateBlock.java @@ -0,0 +1,52 @@ +package ru.betterend.blocks.basis; + +import java.io.Reader; +import java.util.Collections; +import java.util.List; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.PressurePlateBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.context.LootContext; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; + +public class EndPlateBlock extends PressurePlateBlock implements BlockPatterned { + private final Block parent; + + public EndPlateBlock(ActivationRule rule, Block source) { + super(rule, FabricBlockSettings.copyOf(source).noCollision().nonOpaque().strength(0.5F)); + this.parent = source; + } + + @Override + public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + return Collections.singletonList(new ItemStack(this)); + } + + @Override + public String getStatesPattern(Reader data) { + Identifier blockId = Registry.BLOCK.getId(this); + Identifier parentId = Registry.BLOCK.getId(parent); + return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); + } + + @Override + public String getModelPattern(String block) { + Identifier blockId = Registry.BLOCK.getId(this); + Identifier parentId = Registry.BLOCK.getId(parent); + if (block.contains("down")) { + return Patterns.createJson(Patterns.BLOCK_PLATE_DOWN, parentId.getPath(), blockId.getPath()); + } + return Patterns.createJson(Patterns.BLOCK_PLATE_UP, parentId.getPath(), blockId.getPath()); + } + + @Override + public Identifier statePatternId() { + return this.stateManager.getProperty("facing") != null ? Patterns.STATE_PLATE_ROTATED : Patterns.STATE_PLATE; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/EndStonelateBlock.java b/src/main/java/ru/betterend/blocks/basis/EndStonelateBlock.java index 1ce22d37..0e8b9dd6 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndStonelateBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndStonelateBlock.java @@ -1,52 +1,9 @@ package ru.betterend.blocks.basis; -import java.io.Reader; -import java.util.Collections; -import java.util.List; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.PressurePlateBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; -import ru.betterend.patterns.BlockPatterned; -import ru.betterend.patterns.Patterns; -public class EndStonelateBlock extends PressurePlateBlock implements BlockPatterned { - private final Block parent; - +public class EndStonelateBlock extends EndPlateBlock { public EndStonelateBlock(Block source) { - super(ActivationRule.MOBS, FabricBlockSettings.copyOf(source).nonOpaque()); - this.parent = source; - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - return Collections.singletonList(new ItemStack(this)); - } - - @Override - public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); - return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); - } - - @Override - public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); - if (block.contains("down")) { - return Patterns.createJson(Patterns.BLOCK_PLATE_DOWN, parentId.getPath(), blockId.getPath()); - } - return Patterns.createJson(Patterns.BLOCK_PLATE_UP, parentId.getPath(), blockId.getPath()); - } - - @Override - public Identifier statePatternId() { - return Patterns.STATE_PLATE; + super(ActivationRule.MOBS, source); } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndWoodenPlateBlock.java b/src/main/java/ru/betterend/blocks/basis/EndWoodenPlateBlock.java index a865159e..e167c109 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndWoodenPlateBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndWoodenPlateBlock.java @@ -1,52 +1,9 @@ package ru.betterend.blocks.basis; -import java.io.Reader; -import java.util.Collections; -import java.util.List; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.PressurePlateBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; -import ru.betterend.patterns.BlockPatterned; -import ru.betterend.patterns.Patterns; -public class EndWoodenPlateBlock extends PressurePlateBlock implements BlockPatterned { - private final Block parent; - +public class EndWoodenPlateBlock extends EndPlateBlock { public EndWoodenPlateBlock(Block source) { - super(ActivationRule.EVERYTHING, FabricBlockSettings.copyOf(source).noCollision().nonOpaque().strength(0.5F)); - this.parent = source; - } - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - return Collections.singletonList(new ItemStack(this)); - } - - @Override - public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); - return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); - } - - @Override - public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); - if (block.contains("down")) { - return Patterns.createJson(Patterns.BLOCK_PLATE_DOWN, parentId.getPath(), blockId.getPath()); - } - return Patterns.createJson(Patterns.BLOCK_PLATE_UP, parentId.getPath(), blockId.getPath()); - } - - @Override - public Identifier statePatternId() { - return Patterns.STATE_PLATE; + super(ActivationRule.EVERYTHING, source); } } diff --git a/src/main/java/ru/betterend/patterns/Patterns.java b/src/main/java/ru/betterend/patterns/Patterns.java index 3493a0ff..daf238d2 100644 --- a/src/main/java/ru/betterend/patterns/Patterns.java +++ b/src/main/java/ru/betterend/patterns/Patterns.java @@ -27,6 +27,7 @@ public class Patterns { public final static Identifier STATE_BUTTON = BetterEnd.makeID("patterns/blockstate/button.json"); public final static Identifier STATE_PILLAR = BetterEnd.makeID("patterns/blockstate/pillar.json"); public final static Identifier STATE_PLATE = BetterEnd.makeID("patterns/blockstate/pressure_plate.json"); + public final static Identifier STATE_PLATE_ROTATED = BetterEnd.makeID("patterns/blockstate/pressure_plate_rotated.json"); public final static Identifier STATE_DOOR = BetterEnd.makeID("patterns/blockstate/door.json"); public final static Identifier STATE_SAPLING = BetterEnd.makeID("patterns/blockstate/sapling.json"); public final static Identifier STATE_GATE = BetterEnd.makeID("patterns/blockstate/fence_gate.json"); diff --git a/src/main/resources/assets/betterend/patterns/blockstate/pressure_plate_rotated.json b/src/main/resources/assets/betterend/patterns/blockstate/pressure_plate_rotated.json new file mode 100644 index 00000000..87927d74 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/blockstate/pressure_plate_rotated.json @@ -0,0 +1,21 @@ +{ + "variants": { + "facing=up,powered=false": { "model": "betterend:pattern/%block%/%block%_up" }, + "facing=up,powered=true": { "model": "betterend:pattern/%block%/%block%_down" }, + + "facing=down,powered=false": { "model": "betterend:pattern/%block%/%block%_up", "x": 180 }, + "facing=down,powered=true": { "model": "betterend:pattern/%block%/%block%_down", "x": 180 }, + + "facing=north,powered=false": { "model": "betterend:pattern/%block%/%block%_up", "x": 90 }, + "facing=north,powered=true": { "model": "betterend:pattern/%block%/%block%_down", "x": 90 }, + + "facing=south,powered=false": { "model": "betterend:pattern/%block%/%block%_up", "x": 90, "y": 180 }, + "facing=south,powered=true": { "model": "betterend:pattern/%block%/%block%_down", "x": 90, "y": 180 }, + + "facing=east,powered=false": { "model": "betterend:pattern/%block%/%block%_up", "x": 90, "y": 90 }, + "facing=east,powered=true": { "model": "betterend:pattern/%block%/%block%_down", "x": 90, "y": 90 }, + + "facing=west,powered=false": { "model": "betterend:pattern/%block%/%block%_up", "x": 90, "y": 270 }, + "facing=west,powered=true": { "model": "betterend:pattern/%block%/%block%_down", "x": 90, "y": 270 } + } +} \ No newline at end of file From 67a4b19b472dfaa7ab4d29703edd1e2a5356e9c5 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 27 Jan 2021 04:21:29 +0300 Subject: [PATCH 232/463] Fix luminophor block property --- .../java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java b/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java index 5e0f9d58..ea26f658 100644 --- a/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java +++ b/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java @@ -18,7 +18,7 @@ import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; public class GlowingPillarLuminophorBlock extends BlockBase { - public static final BooleanProperty NATURAL = BooleanProperty.of("natural"); + public static final BooleanProperty NATURAL = BlockProperties.NATURAL; public GlowingPillarLuminophorBlock() { super(FabricBlockSettings.of(Material.LEAVES) From 7b1c9ec0fbe05ffa9389e96366279f7b6bb46ecc Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sat, 30 Jan 2021 10:25:19 +0300 Subject: [PATCH 233/463] Aeternium items have fireproof now. --- .../java/ru/betterend/registry/EndItems.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index b9bc0d75..3cb38792 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -80,10 +80,10 @@ public class EndItems { public static final Item TERMINITE_CHESTPLATE = registerItem("terminite_chestplate", new ArmorItem(EndArmorMaterial.TERMINITE, EquipmentSlot.CHEST, makeItemSettings())); public static final Item TERMINITE_LEGGINGS = registerItem("terminite_leggings", new ArmorItem(EndArmorMaterial.TERMINITE, EquipmentSlot.LEGS, makeItemSettings())); public static final Item TERMINITE_BOOTS = registerItem("terminite_boots", new ArmorItem(EndArmorMaterial.TERMINITE, EquipmentSlot.FEET, makeItemSettings())); - public static final Item AETERNIUM_HELMET = registerItem("aeternium_helmet", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.HEAD, makeItemSettings())); - public static final Item AETERNIUM_CHESTPLATE = registerItem("aeternium_chestplate", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.CHEST, makeItemSettings())); - public static final Item AETERNIUM_LEGGINGS = registerItem("aeternium_leggings", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.LEGS, makeItemSettings())); - public static final Item AETERNIUM_BOOTS = registerItem("aeternium_boots", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.FEET, makeItemSettings())); + public static final Item AETERNIUM_HELMET = registerItem("aeternium_helmet", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.HEAD, makeItemSettings().fireproof())); + public static final Item AETERNIUM_CHESTPLATE = registerItem("aeternium_chestplate", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.CHEST, makeItemSettings().fireproof())); + public static final Item AETERNIUM_LEGGINGS = registerItem("aeternium_leggings", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.LEGS, makeItemSettings().fireproof())); + public static final Item AETERNIUM_BOOTS = registerItem("aeternium_boots", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.FEET, makeItemSettings().fireproof())); public static final Item CRYSTALITE_HELMET = registerItem("crystalite_helmet", new ArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.HEAD, makeItemSettings().rarity(Rarity.UNCOMMON))); public static final Item CRYSTALITE_CHESTPLATE = registerItem("crystalite_chestplate", new ArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.CHEST, makeItemSettings().rarity(Rarity.UNCOMMON))); public static final Item CRYSTALITE_LEGGINGS = registerItem("crystalite_leggings", new ArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.LEGS, makeItemSettings().rarity(Rarity.UNCOMMON))); @@ -97,12 +97,12 @@ public class EndItems { public static final ToolItem TERMINITE_HOE = registerTool("terminite_hoe", new EndHoeItem(EndToolMaterial.TERMINITE, -3, 0.0F, makeItemSettings())); public static final ToolItem TERMINITE_HAMMER = registerTool("terminite_hammer", new EndHammerItem(EndToolMaterial.TERMINITE, 5.0F, -3.2F, 0.3D, makeItemSettings())); - public static final ToolItem AETERNIUM_SHOVEL = registerTool("aeternium_shovel", new EndShovelItem(EndToolMaterial.AETERNIUM, 1.5F, -3.0F, makeItemSettings())); - public static final ToolItem AETERNIUM_SWORD = registerTool("aeternium_sword", new EndSwordItem(EndToolMaterial.AETERNIUM, 3, -2.4F, makeItemSettings())); - public static final ToolItem AETERNIUM_PICKAXE = registerTool("aeternium_pickaxe", new EndPickaxeItem(EndToolMaterial.AETERNIUM, 1, -2.8F, makeItemSettings())); - public static final ToolItem AETERNIUM_AXE = registerTool("aeternium_axe", new EndAxeItem(EndToolMaterial.AETERNIUM, 5.0F, -3.0F, makeItemSettings())); - public static final ToolItem AETERNIUM_HOE = registerTool("aeternium_hoe", new EndHoeItem(EndToolMaterial.AETERNIUM, -3, 0.0F, makeItemSettings())); - public static final ToolItem AETERNIUM_HAMMER = registerTool("aeternium_hammer", new EndHammerItem(EndToolMaterial.AETERNIUM, 6.0F, -3.0F, 0.3D, makeItemSettings())); + public static final ToolItem AETERNIUM_SHOVEL = registerTool("aeternium_shovel", new EndShovelItem(EndToolMaterial.AETERNIUM, 1.5F, -3.0F, makeItemSettings().fireproof())); + public static final ToolItem AETERNIUM_SWORD = registerTool("aeternium_sword", new EndSwordItem(EndToolMaterial.AETERNIUM, 3, -2.4F, makeItemSettings().fireproof())); + public static final ToolItem AETERNIUM_PICKAXE = registerTool("aeternium_pickaxe", new EndPickaxeItem(EndToolMaterial.AETERNIUM, 1, -2.8F, makeItemSettings().fireproof())); + public static final ToolItem AETERNIUM_AXE = registerTool("aeternium_axe", new EndAxeItem(EndToolMaterial.AETERNIUM, 5.0F, -3.0F, makeItemSettings().fireproof())); + public static final ToolItem AETERNIUM_HOE = registerTool("aeternium_hoe", new EndHoeItem(EndToolMaterial.AETERNIUM, -3, 0.0F, makeItemSettings().fireproof())); + public static final ToolItem AETERNIUM_HAMMER = registerTool("aeternium_hammer", new EndHammerItem(EndToolMaterial.AETERNIUM, 6.0F, -3.0F, 0.3D, makeItemSettings().fireproof())); public static final ToolItem IRON_HAMMER = registerTool("iron_hammer", new EndHammerItem(ToolMaterials.IRON, 5.0F, -3.2F, 0.2D, makeItemSettings())); public static final ToolItem GOLDEN_HAMMER = registerTool("golden_hammer", new EndHammerItem(ToolMaterials.GOLD, 4.5F, -3.4F, 0.3D, makeItemSettings())); From 4cba51a9de14b0c1caec7dbabb27f8b2bc95ef6b Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sat, 30 Jan 2021 11:45:21 +0300 Subject: [PATCH 234/463] Anvil craft fixes --- .../gui/EndStoneSmelterScreenHandler.java | 6 ++-- .../mixin/common/AnvilScreenHandlerMixin.java | 10 +++---- .../recipe/builders/AnvilRecipe.java | 29 +++++++++++++++++-- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java index d6eb2249..f8a00502 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java @@ -113,7 +113,7 @@ public class EndStoneSmelterScreenHandler extends AbstractRecipeScreenHandler= 4 && index < 31) { + } else if (index < 31) { if (!insertItem(itemStack2, 31, 40, false)) { return ItemStack.EMPTY; } - } else if (index >= 31 && index < 40 && !insertItem(itemStack2, 4, 31, false)) { + } else if (index < 40 && !insertItem(itemStack2, 4, 31, false)) { return ItemStack.EMPTY; } } else if (!insertItem(itemStack2, 4, 40, false)) { diff --git a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java index c90e7f81..4367431d 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java @@ -41,10 +41,7 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler imple @Inject(method = "canTakeOutput", at = @At("HEAD"), cancellable = true) protected void be_canTakeOutput(PlayerEntity player, boolean present, CallbackInfoReturnable info) { if (be_currentRecipe != null) { - ItemStack output = this.be_currentRecipe.craft(input, player); - if (!output.isEmpty()) { - info.setReturnValue(true); - } + info.setReturnValue(be_currentRecipe.checkHammerDurability(input, player)); } } @@ -52,6 +49,7 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler imple protected void be_onTakeOutput(PlayerEntity player, ItemStack stack, CallbackInfoReturnable info) { if (be_currentRecipe != null) { this.input.getStack(0).decrement(1); + stack = be_currentRecipe.craft(input, player); this.onContentChanged(input); this.context.run((world, blockPos) -> { BlockState anvilState = world.getBlockState(blockPos); @@ -77,7 +75,9 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler imple RecipeManager recipeManager = this.player.world.getRecipeManager(); this.be_recipes = recipeManager.getAllMatches(AnvilRecipe.TYPE, input, player.world); if (be_recipes.size() > 0) { - this.be_currentRecipe = recipeManager.getFirstMatch(AnvilRecipe.TYPE, input, player.world).get(); + if (be_currentRecipe == null || !be_recipes.contains(be_currentRecipe)) { + this.be_currentRecipe = be_recipes.get(0); + } this.be_updateResult(); info.cancel(); } diff --git a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java index d38a5095..eef5ce40 100644 --- a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java @@ -28,6 +28,8 @@ import ru.betterend.registry.EndTags; import ru.betterend.util.ItemUtil; import ru.betterend.util.RecipeHelper; +import java.util.Objects; + public class AnvilRecipe implements Recipe, BetterEndRecipe { public final static String GROUP = "smithing"; @@ -71,15 +73,21 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { public ItemStack craft(Inventory craftingInventory, PlayerEntity player) { if (!player.isCreative()) { + if (!checkHammerDurability(craftingInventory, player)) return ItemStack.EMPTY; ItemStack hammer = craftingInventory.getStack(1); - int damage = hammer.getDamage() + this.damage; - if (damage >= hammer.getMaxDamage()) return ItemStack.EMPTY; hammer.damage(this.damage, player, entity -> { entity.sendEquipmentBreakStatus(null); }); } return this.craft(craftingInventory); } + + public boolean checkHammerDurability(Inventory craftingInventory, PlayerEntity player) { + if (player.isCreative()) return true; + ItemStack hammer = craftingInventory.getStack(1); + int damage = hammer.getDamage() + this.damage; + return damage < hammer.getMaxDamage(); + } public boolean matches(Inventory craftingInventory) { ItemStack hammer = craftingInventory.getStack(1); @@ -125,7 +133,20 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { public boolean isIgnoredInRecipeBook() { return true; } - + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + AnvilRecipe that = (AnvilRecipe) o; + return damage == that.damage && level == that.level && id.equals(that.id) && input.equals(that.input) && output.equals(that.output); + } + + @Override + public int hashCode() { + return Objects.hash(id, input, output, damage, level); + } + public static class Builder { private final static Builder INSTANCE = new Builder(); @@ -244,5 +265,7 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { packetBuffer.writeVarInt(recipe.level); packetBuffer.writeVarInt(recipe.damage); } + + } } From e6c7b48802211eac73a95d6eae1a8e293a21fea6 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 30 Jan 2021 11:53:02 +0300 Subject: [PATCH 235/463] Metal unification (WIP) --- .../blocks/complex/MetalMaterial.java | 78 +++++++++---- .../item/material/EndArmorMaterial.java | 8 +- .../item/material/EndToolMaterial.java | 5 +- .../ru/betterend/recipe/AlloyingRecipes.java | 6 +- .../ru/betterend/recipe/CraftingRecipes.java | 106 +----------------- .../ru/betterend/recipe/InfusionRecipes.java | 8 +- .../ru/betterend/recipe/SmithingRecipes.java | 11 +- .../java/ru/betterend/registry/EndBlocks.java | 7 +- .../java/ru/betterend/registry/EndItems.java | 38 ++----- .../java/ru/betterend/registry/EndTags.java | 22 ++-- 10 files changed, 105 insertions(+), 184 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index c451d59b..7471a144 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -4,7 +4,11 @@ import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.Block; import net.minecraft.block.Blocks; import net.minecraft.block.MaterialColor; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.item.ArmorItem; +import net.minecraft.item.ArmorMaterial; import net.minecraft.item.Item; +import net.minecraft.item.Item.Settings; import net.minecraft.item.Items; import net.minecraft.item.ToolMaterial; import net.minecraft.sound.BlockSoundGroup; @@ -22,10 +26,12 @@ import ru.betterend.blocks.basis.EndStairsBlock; import ru.betterend.blocks.basis.EndTrapdoorBlock; import ru.betterend.blocks.basis.EndWoodenPlateBlock; import ru.betterend.item.EndAxeItem; +import ru.betterend.item.EndHammerItem; import ru.betterend.item.EndHoeItem; import ru.betterend.item.EndPickaxeItem; import ru.betterend.item.EndShovelItem; import ru.betterend.item.EndSwordItem; +import ru.betterend.item.PatternedItem; import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.recipe.builders.FurnaceRecipe; import ru.betterend.recipe.builders.GridRecipe; @@ -57,37 +63,66 @@ public class MetalMaterial { public final Item pickaxe; public final Item axe; public final Item hoe; + public final Item hammer; - public MetalMaterial(String name, MaterialColor color, ToolMaterial material) { - FabricBlockSettings materialBlock = FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color); - FabricBlockSettings lantern = FabricBlockSettings.copyOf(materialBlock).sounds(BlockSoundGroup.LANTERN).hardness(1).resistance(1).luminance(15); + public final Item helmet; + public final Item chestplate; + public final Item leggings; + public final Item boots; + + public static MetalMaterial makeNormal(String name, MaterialColor color, ToolMaterial material, ArmorMaterial armor) { + return new MetalMaterial(name, true, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color), EndItems.makeItemSettings(), material, armor); + } + + public static MetalMaterial makeNormal(String name, MaterialColor color, float hardness, float resistance, ToolMaterial material, ArmorMaterial armor) { + return new MetalMaterial(name, true, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color).hardness(hardness).resistance(resistance), EndItems.makeItemSettings(), material, armor); + } + + public static MetalMaterial makeOreless(String name, MaterialColor color, ToolMaterial material, ArmorMaterial armor) { + return new MetalMaterial(name, false, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color), EndItems.makeItemSettings(), material, armor); + } + + public static MetalMaterial makeOreless(String name, MaterialColor color, float hardness, float resistance, ToolMaterial material, ArmorMaterial armor) { + return new MetalMaterial(name, false, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color).hardness(hardness).resistance(resistance), EndItems.makeItemSettings(), material, armor); + } + + private MetalMaterial(String name, boolean hasOre, FabricBlockSettings settings, Settings itemSettings, ToolMaterial material, ArmorMaterial armor) { + FabricBlockSettings lantern = FabricBlockSettings.copyOf(settings).sounds(BlockSoundGroup.LANTERN).hardness(1).resistance(1).luminance(15); - ore = EndBlocks.registerBlock(name + "_ore", new BlockBase(FabricBlockSettings.copyOf(Blocks.END_STONE))); - block = EndBlocks.registerBlock(name + "_block", new BlockBase(materialBlock)); - tile = EndBlocks.registerBlock(name + "_tile", new BlockBase(materialBlock)); + ore = hasOre ? EndBlocks.registerBlock(name + "_ore", new BlockBase(FabricBlockSettings.copyOf(Blocks.END_STONE))) : null; + block = EndBlocks.registerBlock(name + "_block", new BlockBase(settings)); + tile = EndBlocks.registerBlock(name + "_tile", new BlockBase(settings)); stairs = EndBlocks.registerBlock(name + "_stairs", new EndStairsBlock(tile)); slab = EndBlocks.registerBlock(name + "_slab", new EndSlabBlock(tile)); door = EndBlocks.registerBlock(name + "_door", new EndDoorBlock(block)); trapdoor = EndBlocks.registerBlock(name + "_trapdoor", new EndTrapdoorBlock(block)); - anvil = EndBlocks.registerBlock(name + "_anvil", new EndAnvilBlock(color)); + anvil = EndBlocks.registerBlock(name + "_anvil", new EndAnvilBlock(block.getDefaultMaterialColor())); bars = EndBlocks.registerBlock(name + "_bars", new EndMetalPaneBlock(block)); - chain = EndBlocks.registerBlock(name + "_chain", new EndChainBlock(color)); + chain = EndBlocks.registerBlock(name + "_chain", new EndChainBlock(block.getDefaultMaterialColor())); plate = EndBlocks.registerBlock(name + "_plate", new EndWoodenPlateBlock(block)); chandelier = EndBlocks.registerBlock(name + "_chandelier", new ChandelierBlock(block)); bulb_lantern = EndBlocks.registerBlock(name + "_bulb_lantern", new BulbVineLanternBlock(lantern)); bulb_lantern_colored = new ColoredMaterial(BulbVineLanternColoredBlock::new, bulb_lantern, false); - nugget = EndItems.registerItem(name + "_nugget"); - ingot = EndItems.registerItem(name + "_ingot"); - shovel = EndItems.registerTool(name + "_shovel", new EndShovelItem(material, 1.5F, -3.0F, EndItems.makeItemSettings())); - sword = EndItems.registerTool(name + "_sword", new EndSwordItem(material, 3, -2.4F, EndItems.makeItemSettings())); - pickaxe = EndItems.registerTool(name + "_pickaxe", new EndPickaxeItem(material, 1, -2.8F, EndItems.makeItemSettings())); - axe = EndItems.registerTool(name + "_axe", new EndAxeItem(material, 6.0F, -3.0F, EndItems.makeItemSettings())); - hoe = EndItems.registerTool(name + "_hoe", new EndHoeItem(material, -3, 0.0F, EndItems.makeItemSettings())); + nugget = EndItems.registerItem(name + "_nugget", new PatternedItem(itemSettings)); + ingot = EndItems.registerItem(name + "_ingot", new PatternedItem(itemSettings)); + shovel = EndItems.registerTool(name + "_shovel", new EndShovelItem(material, 1.5F, -3.0F, itemSettings)); + sword = EndItems.registerTool(name + "_sword", new EndSwordItem(material, 3, -2.4F, itemSettings)); + pickaxe = EndItems.registerTool(name + "_pickaxe", new EndPickaxeItem(material, 1, -2.8F, itemSettings)); + axe = EndItems.registerTool(name + "_axe", new EndAxeItem(material, 6.0F, -3.0F, itemSettings)); + hoe = EndItems.registerTool(name + "_hoe", new EndHoeItem(material, -3, 0.0F, itemSettings)); + hammer = EndItems.registerTool(name + "_hammer", new EndHammerItem(material, 5.0F, -3.2F, 0.3D, itemSettings)); - FurnaceRecipe.make("thallasium_ingot_furnace", ore, ingot).build(true); - AlloyingRecipe.Builder.create("thallasium_ingot").setInput(ore, ore).setOutput(ingot, 3).setExpiriense(2.1F).build(); + helmet = EndItems.registerItem(name + "_helmet", new ArmorItem(armor, EquipmentSlot.HEAD, itemSettings)); + chestplate = EndItems.registerItem(name + "_chestplate", new ArmorItem(armor, EquipmentSlot.CHEST, itemSettings)); + leggings = EndItems.registerItem(name + "_leggings", new ArmorItem(armor, EquipmentSlot.LEGS, itemSettings)); + boots = EndItems.registerItem(name + "_boots", new ArmorItem(armor, EquipmentSlot.FEET, itemSettings)); + + if (hasOre) { + FurnaceRecipe.make("thallasium_ingot_furnace", ore, ingot).build(true); + AlloyingRecipe.Builder.create("thallasium_ingot").setInput(ore, ore).setOutput(ingot, 3).setExpiriense(2.1F).build(); + } GridRecipe.make(name + "_ingot_from_nuggets", ingot).setShape("###", "###", "###").addMaterial('#', nugget).setGroup("end_metal_ingots_nug").build(); GridRecipe.make(name + "_block", block).setShape("###", "###", "###").addMaterial('#', ingot).setGroup("end_metal_blocks").build(); @@ -104,12 +139,13 @@ public class MetalMaterial { GridRecipe.make(name + "_anvil", anvil).setOutputCount(3).setShape("###", " I ", "III").addMaterial('#', block, tile).addMaterial('I', ingot).setGroup("end_metal_anvil").build(); GridRecipe.make(name + "bulb_lantern", bulb_lantern).setShape("C", "I", "#").addMaterial('C', chain).addMaterial('I', ingot).addMaterial('#', EndItems.GLOWING_BULB).build(); - GridRecipe.make(name + "_axe", axe).setShape("##", "#I", " I").addMaterial('#', ingot).addMaterial('I', Items.STICK).build(); - GridRecipe.make(name + "_hoe", hoe).setShape("##", " I", " I").addMaterial('#', ingot).addMaterial('I', Items.STICK).build(); - GridRecipe.make(name + "_pickaxe", pickaxe).setShape("###", " I ", " I ").addMaterial('#', ingot).addMaterial('I', Items.STICK).build(); - GridRecipe.make(name + "_sword", sword).setShape("#", "#", "I").addMaterial('#', ingot).addMaterial('I', Items.STICK).build(); + GridRecipe.make(name + "_axe", axe).setShape("##", "#I", " I").addMaterial('#', ingot).addMaterial('I', Items.STICK).setGroup("end_metal_axes").build(); + GridRecipe.make(name + "_hoe", hoe).setShape("##", " I", " I").addMaterial('#', ingot).addMaterial('I', Items.STICK).setGroup("end_metal_hoes").build(); + GridRecipe.make(name + "_pickaxe", pickaxe).setShape("###", " I ", " I ").addMaterial('#', ingot).addMaterial('I', Items.STICK).setGroup("end_metal_picks").build(); + GridRecipe.make(name + "_sword", sword).setShape("#", "#", "I").addMaterial('#', ingot).addMaterial('I', Items.STICK).setGroup("end_metal_swords").build(); GridRecipe.make(name + "_chandelier", chandelier).setShape("I#I", " # ").addMaterial('#', ingot).addMaterial('I', EndItems.LUMECORN_ROD).setGroup("end_metal_chandelier").build(); + GridRecipe.make(name + "_hammer", hammer).setShape("III", "ISI", " S ").addMaterial('I', ingot).addMaterial('S', Items.STICK).setGroup("end_metal_hammers").build(); FurnaceRecipe.make(name + "_axe_ingot", axe, nugget).build(true); FurnaceRecipe.make(name + "_hoe_ingot", hoe, nugget).build(true); diff --git a/src/main/java/ru/betterend/item/material/EndArmorMaterial.java b/src/main/java/ru/betterend/item/material/EndArmorMaterial.java index 6c3b5cd9..ef10f3a9 100644 --- a/src/main/java/ru/betterend/item/material/EndArmorMaterial.java +++ b/src/main/java/ru/betterend/item/material/EndArmorMaterial.java @@ -10,17 +10,21 @@ import net.minecraft.recipe.Ingredient; import net.minecraft.sound.SoundEvent; import net.minecraft.sound.SoundEvents; import net.minecraft.util.Lazy; +import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; public enum EndArmorMaterial implements ArmorMaterial { + THALLASIUM("thallasium", 26, new int[] { 3, 6, 7, 3 }, 14, SoundEvents.ITEM_ARMOR_EQUIP_IRON, 1.0F, 0.05F, () -> { + return Ingredient.ofItems(EndBlocks.THALLASIUM.ingot); + }), TERMINITE("terminite", 26, new int[] { 3, 6, 7, 3 }, 14, SoundEvents.ITEM_ARMOR_EQUIP_IRON, 1.0F, 0.05F, () -> { - return Ingredient.ofItems(EndItems.TERMINITE_INGOT); + return Ingredient.ofItems(EndBlocks.TERMINITE.ingot); }), AETERNIUM("aeternium", 40, new int[] { 4, 7, 9, 4 }, 18, SoundEvents.ITEM_ARMOR_EQUIP_NETHERITE, 3.5F, 0.2F, () -> { return Ingredient.ofItems(EndItems.AETERNIUM_INGOT); }), CRYSTALITE("crystalite", 30, new int[] { 3, 6, 8, 3 }, 24, SoundEvents.ITEM_ARMOR_EQUIP_DIAMOND, 1.2F, 0.1F, () -> { - return Ingredient.ofItems(EndItems.TERMINITE_INGOT); + return Ingredient.ofItems(EndBlocks.TERMINITE.ingot); }); private static final int[] BASE_DURABILITY = new int[] { 13, 15, 16, 11 }; diff --git a/src/main/java/ru/betterend/item/material/EndToolMaterial.java b/src/main/java/ru/betterend/item/material/EndToolMaterial.java index 5724307b..de508032 100644 --- a/src/main/java/ru/betterend/item/material/EndToolMaterial.java +++ b/src/main/java/ru/betterend/item/material/EndToolMaterial.java @@ -5,14 +5,15 @@ import java.util.function.Supplier; import net.minecraft.item.ToolMaterial; import net.minecraft.recipe.Ingredient; import net.minecraft.util.Lazy; +import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; public enum EndToolMaterial implements ToolMaterial { THALLASIUM(2, 320, 7.0F, 1.5F, 12, () -> { - return Ingredient.ofItems(EndItems.AETERNIUM_INGOT); + return Ingredient.ofItems(EndBlocks.THALLASIUM.ingot); }), TERMINITE(3, 1230, 8.5F, 3.0F, 14, () -> { - return Ingredient.ofItems(EndItems.TERMINITE_INGOT); + return Ingredient.ofItems(EndBlocks.TERMINITE.ingot); }), AETERNIUM(5, 2196, 10.0F, 4.5F, 18, () -> { return Ingredient.ofItems(EndItems.AETERNIUM_INGOT); diff --git a/src/main/java/ru/betterend/recipe/AlloyingRecipes.java b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java index 61795576..10d63003 100644 --- a/src/main/java/ru/betterend/recipe/AlloyingRecipes.java +++ b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java @@ -26,19 +26,19 @@ public class AlloyingRecipes { .build(); AlloyingRecipe.Builder.create("terminite_ingot") .setInput(Items.IRON_INGOT, EndItems.ENDER_DUST) - .setOutput(EndItems.TERMINITE_INGOT, 1) + .setOutput(EndBlocks.TERMINITE.ingot, 1) .setExpiriense(2.5F) .setSmeltTime(450) .build(); AlloyingRecipe.Builder.create("aeternium_ingot") - .setInput(EndItems.TERMINITE_INGOT, Items.NETHERITE_INGOT) + .setInput(EndBlocks.TERMINITE.ingot, Items.NETHERITE_INGOT) .setOutput(EndItems.AETERNIUM_INGOT, 1) .setExpiriense(4.5F) .setSmeltTime(600) .build(); AlloyingRecipe.Builder.create("terminite_ingot_thallasium") .setInput(EndBlocks.THALLASIUM.ingot, EndItems.ENDER_DUST) - .setOutput(EndItems.TERMINITE_INGOT, 1) + .setOutput(EndBlocks.TERMINITE.ingot, 1) .setExpiriense(2.5F) .setSmeltTime(450) .build(); diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index 85ef47ec..6a204a57 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -2,7 +2,6 @@ package ru.betterend.recipe; import net.minecraft.block.Block; import net.minecraft.block.Blocks; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.potion.PotionUtil; @@ -55,29 +54,7 @@ public class CraftingRecipes { .addMaterial('#', Blocks.OBSIDIAN) .build(); - String material = "terminite"; - GridRecipe.make(material + "_block", EndBlocks.TERMINITE_BLOCK) - .setShape("III", "III", "III") - .addMaterial('I', EndItems.TERMINITE_INGOT) - .build(); - GridRecipe.make(material + "_block_to_ingot", EndItems.TERMINITE_INGOT) - .addMaterial('#', EndBlocks.TERMINITE_BLOCK) - .setOutputCount(9) - .setList("#") - .build(); - - registerHelmet(material, EndItems.TERMINITE_INGOT, EndItems.TERMINITE_HELMET); - registerChestplate(material, EndItems.TERMINITE_INGOT, EndItems.TERMINITE_CHESTPLATE); - registerLeggings(material, EndItems.TERMINITE_INGOT, EndItems.TERMINITE_LEGGINGS); - registerBoots(material, EndItems.TERMINITE_INGOT, EndItems.TERMINITE_BOOTS); - registerShovel(material, EndItems.TERMINITE_INGOT, EndItems.TERMINITE_SHOVEL); - registerSword(material, EndItems.TERMINITE_INGOT, EndItems.TERMINITE_SWORD); - registerPickaxe(material, EndItems.TERMINITE_INGOT, EndItems.TERMINITE_PICKAXE); - registerAxe(material, EndItems.TERMINITE_INGOT, EndItems.TERMINITE_AXE); - registerHoe(material, EndItems.TERMINITE_INGOT, EndItems.TERMINITE_HOE); - registerHammer(material, EndItems.TERMINITE_INGOT, EndItems.TERMINITE_HAMMER); - - material = "aeternium"; + String material = "aeternium"; GridRecipe.make(material + "_block", EndBlocks.AETERNIUM_BLOCK) .setShape("III", "III", "III") .addMaterial('I', EndItems.AETERNIUM_INGOT) @@ -88,11 +65,6 @@ public class CraftingRecipes { .setList("#") .build(); - registerHammer("iron", Items.IRON_INGOT, EndItems.IRON_HAMMER); - registerHammer("golden", Items.GOLD_INGOT, EndItems.GOLDEN_HAMMER); - registerHammer("diamond", Items.DIAMOND, EndItems.DIAMOND_HAMMER); - registerHammer("netherite", Items.NETHERITE_INGOT, EndItems.NETHERITE_HAMMER); - GridRecipe.make("blue_vine_seed_dye", Items.BLUE_DYE).setList("#").addMaterial('#', EndBlocks.BLUE_VINE_SEED).build(); GridRecipe.make("creeping_moss_dye", Items.CYAN_DYE).setList("#").addMaterial('#', EndBlocks.CREEPING_MOSS).build(); GridRecipe.make("umbrella_moss_dye", Items.YELLOW_DYE).setList("#").addMaterial('#', EndBlocks.UMBRELLA_MOSS).build(); @@ -219,80 +191,4 @@ public class CraftingRecipes { .setOutputCount(2) .build(); } - - private static void registerHelmet(String name, Item material, Item result) { - GridRecipe.make(name + "_helmet", result) - .setShape("III", "I I") - .addMaterial('I', material) - .build(); - } - - private static void registerChestplate(String name, Item material, Item result) { - GridRecipe.make(name + "_chestplate", result) - .setShape("I I", "III", "III") - .addMaterial('I', material) - .build(); - } - - private static void registerLeggings(String name, Item material, Item result) { - GridRecipe.make(name + "_leggings", result) - .setShape("III", "I I", "I I") - .addMaterial('I', material) - .build(); - } - - private static void registerBoots(String name, Item material, Item result) { - GridRecipe.make(name + "_boots", result) - .setShape("I I", "I I") - .addMaterial('I', material) - .build(); - } - - private static void registerShovel(String name, Item material, Item result) { - GridRecipe.make(name + "_shovel", result) - .setShape("I", "#", "#") - .addMaterial('I', material) - .addMaterial('#', Items.STICK) - .build(); - } - - private static void registerSword(String name, Item material, Item result) { - GridRecipe.make(name + "_sword", result) - .setShape(new String[] { "I", "I", "#" }) - .addMaterial('I', material) - .addMaterial('#', Items.STICK) - .build(); - } - - private static void registerPickaxe(String name, Item material, Item result) { - GridRecipe.make(name + "_pickaxe", result) - .setShape("III", " # ", " # ") - .addMaterial('I', material) - .addMaterial('#', Items.STICK) - .build(); - } - - private static void registerAxe(String name, Item material, Item result) { - GridRecipe.make(name + "_axe", result) - .setShape("II", "#I", "# ") - .addMaterial('I', material) - .addMaterial('#', Items.STICK) - .build(); - } - - private static void registerHoe(String name, Item material, Item result) { - GridRecipe.make(name + "_hoe", result) - .setShape("II", "# ", "# ") - .addMaterial('I', material) - .addMaterial('#', Items.STICK) - .build(); - } - - private static void registerHammer(String name, Item material, Item result) { - GridRecipe.make(name + "_hammer", result) - .setShape("I I", "I#I", " # ") - .addMaterial('I', material) - .addMaterial('#', Items.STICK) - .build(); - } } diff --git a/src/main/java/ru/betterend/recipe/InfusionRecipes.java b/src/main/java/ru/betterend/recipe/InfusionRecipes.java index d7120fec..0be70464 100644 --- a/src/main/java/ru/betterend/recipe/InfusionRecipes.java +++ b/src/main/java/ru/betterend/recipe/InfusionRecipes.java @@ -38,7 +38,7 @@ public class InfusionRecipes { .build(); InfusionRecipe.Builder.create("crystalite_helmet") - .setInput(EndItems.TERMINITE_HELMET) + .setInput(EndBlocks.TERMINITE.helmet) .setOutput(EndItems.CRYSTALITE_HELMET) .addCatalyst(0, EndItems.AMBER_GEM) .addCatalyst(2, EndItems.CRYSTAL_SHARDS) @@ -46,7 +46,7 @@ public class InfusionRecipes { .setTime(150) .build(); InfusionRecipe.Builder.create("crystalite_chestplate") - .setInput(EndItems.TERMINITE_CHESTPLATE) + .setInput(EndBlocks.TERMINITE.chestplate) .setOutput(EndItems.CRYSTALITE_CHESTPLATE) .addCatalyst(0, EndItems.AMBER_GEM) .addCatalyst(1, EndItems.CRYSTAL_SHARDS) @@ -56,7 +56,7 @@ public class InfusionRecipes { .setTime(300) .build(); InfusionRecipe.Builder.create("crystalite_leggings") - .setInput(EndItems.TERMINITE_LEGGINGS) + .setInput(EndBlocks.TERMINITE.leggings) .setOutput(EndItems.CRYSTALITE_LEGGINGS) .addCatalyst(0, EndItems.AMBER_GEM) .addCatalyst(2, EndItems.CRYSTAL_SHARDS) @@ -65,7 +65,7 @@ public class InfusionRecipes { .setTime(225) .build(); InfusionRecipe.Builder.create("crystalite_boots") - .setInput(EndItems.TERMINITE_BOOTS) + .setInput(EndBlocks.TERMINITE.boots) .setOutput(EndItems.CRYSTALITE_BOOTS) .addCatalyst(0, EndItems.AMBER_GEM) .addCatalyst(2, EndItems.CRYSTAL_SHARDS) diff --git a/src/main/java/ru/betterend/recipe/SmithingRecipes.java b/src/main/java/ru/betterend/recipe/SmithingRecipes.java index 43a795f0..b3774481 100644 --- a/src/main/java/ru/betterend/recipe/SmithingRecipes.java +++ b/src/main/java/ru/betterend/recipe/SmithingRecipes.java @@ -1,6 +1,7 @@ package ru.betterend.recipe; import ru.betterend.recipe.builders.SmithingTableRecipe; +import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; public class SmithingRecipes { @@ -8,7 +9,7 @@ public class SmithingRecipes { public static void register() { SmithingTableRecipe.create("aeternium_sword_handle") .setResult(EndItems.AETERNIUM_SWORD_HANDLE) - .setBase(EndItems.TERMINITE_INGOT) + .setBase(EndBlocks.TERMINITE.ingot) .setAddition(EndItems.LEATHER_WRAPPED_STICK) .build(); @@ -45,22 +46,22 @@ public class SmithingRecipes { SmithingTableRecipe.create("aeternium_helmet") .setResult(EndItems.AETERNIUM_HELMET) - .setBase(EndItems.TERMINITE_HELMET) + .setBase(EndBlocks.TERMINITE.helmet) .setAddition(EndItems.AETERNIUM_INGOT) .build(); SmithingTableRecipe.create("aeternium_chestplate") .setResult(EndItems.AETERNIUM_CHESTPLATE) - .setBase(EndItems.TERMINITE_CHESTPLATE) + .setBase(EndBlocks.TERMINITE.chestplate) .setAddition(EndItems.AETERNIUM_INGOT) .build(); SmithingTableRecipe.create("aeternium_leggings") .setResult(EndItems.AETERNIUM_LEGGINGS) - .setBase(EndItems.TERMINITE_LEGGINGS) + .setBase(EndBlocks.TERMINITE.leggings) .setAddition(EndItems.AETERNIUM_INGOT) .build(); SmithingTableRecipe.create("aeternium_boots") .setResult(EndItems.AETERNIUM_BOOTS) - .setBase(EndItems.TERMINITE_BOOTS) + .setBase(EndBlocks.TERMINITE.boots) .setAddition(EndItems.AETERNIUM_INGOT) .build(); } diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 5489b217..7abeb9b3 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -77,7 +77,6 @@ import ru.betterend.blocks.SmallJellyshroomBlock; import ru.betterend.blocks.SulphurCrystalBlock; import ru.betterend.blocks.TenaneaFlowersBlock; import ru.betterend.blocks.TenaneaSaplingBlock; -import ru.betterend.blocks.TerminiteBlock; import ru.betterend.blocks.TerrainPlantBlock; import ru.betterend.blocks.TwistedUmbrellaMossBlock; import ru.betterend.blocks.TwistedUmbrellaMossTallBlock; @@ -103,6 +102,7 @@ import ru.betterend.blocks.complex.MetalMaterial; import ru.betterend.blocks.complex.StoneMaterial; import ru.betterend.blocks.complex.WoodenMaterial; import ru.betterend.config.Configs; +import ru.betterend.item.material.EndArmorMaterial; import ru.betterend.item.material.EndToolMaterial; public class EndBlocks { @@ -287,9 +287,10 @@ public class EndBlocks { public static final Block AMBER_ORE = registerBlock("amber_ore", new EndOreBlock(EndItems.RAW_AMBER, 1, 2, 4)); // Materials // - public static final Block TERMINITE_BLOCK = registerBlock("terminite_block", new TerminiteBlock()); + public static final MetalMaterial THALLASIUM = MetalMaterial.makeNormal("thallasium", MaterialColor.BLUE, EndToolMaterial.THALLASIUM, EndArmorMaterial.TERMINITE); + public static final MetalMaterial TERMINITE = MetalMaterial.makeOreless("terminite", MaterialColor.field_25708, 7F, 9F, EndToolMaterial.TERMINITE, EndArmorMaterial.TERMINITE); public static final Block AETERNIUM_BLOCK = registerBlock("aeternium_block", new AeterniumBlock()); - public static final MetalMaterial THALLASIUM = new MetalMaterial("thallasium", MaterialColor.BLUE, EndToolMaterial.THALLASIUM); + public static final Block ENDER_BLOCK = registerBlock("ender_block", new EnderBlock()); public static final Block AURORA_CRYSTAL = registerBlock("aurora_crystal", new AuroraCrystalBlock()); public static final Block AMBER_BLOCK = registerBlock("amber_block", new AmberBlock()); diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index 3cb38792..c5b6859f 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -25,7 +25,6 @@ import net.minecraft.item.ShovelItem; import net.minecraft.item.SpawnEggItem; import net.minecraft.item.SwordItem; import net.minecraft.item.ToolItem; -import net.minecraft.item.ToolMaterials; import net.minecraft.tag.Tag; import net.minecraft.util.Identifier; import net.minecraft.util.Rarity; @@ -57,7 +56,6 @@ public class EndItems { // Materials // public final static Item ENDER_DUST = registerItem("ender_dust"); public final static Item ENDER_SHARD = registerItem("ender_shard"); - public final static Item TERMINITE_INGOT = registerItem("terminite_ingot"); public final static Item AETERNIUM_INGOT = registerItem("aeternium_ingot"); public final static Item END_LILY_LEAF = registerItem("end_lily_leaf"); public final static Item END_LILY_LEAF_DRIED = registerItem("end_lily_leaf_dried"); @@ -76,10 +74,6 @@ public class EndItems { public final static Item LUMECORN_ROD = registerItem("lumecorn_rod"); // Armor // - public static final Item TERMINITE_HELMET = registerItem("terminite_helmet", new ArmorItem(EndArmorMaterial.TERMINITE, EquipmentSlot.HEAD, makeItemSettings())); - public static final Item TERMINITE_CHESTPLATE = registerItem("terminite_chestplate", new ArmorItem(EndArmorMaterial.TERMINITE, EquipmentSlot.CHEST, makeItemSettings())); - public static final Item TERMINITE_LEGGINGS = registerItem("terminite_leggings", new ArmorItem(EndArmorMaterial.TERMINITE, EquipmentSlot.LEGS, makeItemSettings())); - public static final Item TERMINITE_BOOTS = registerItem("terminite_boots", new ArmorItem(EndArmorMaterial.TERMINITE, EquipmentSlot.FEET, makeItemSettings())); public static final Item AETERNIUM_HELMET = registerItem("aeternium_helmet", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.HEAD, makeItemSettings().fireproof())); public static final Item AETERNIUM_CHESTPLATE = registerItem("aeternium_chestplate", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.CHEST, makeItemSettings().fireproof())); public static final Item AETERNIUM_LEGGINGS = registerItem("aeternium_leggings", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.LEGS, makeItemSettings().fireproof())); @@ -90,13 +84,6 @@ public class EndItems { public static final Item CRYSTALITE_BOOTS = registerItem("crystalite_boots", new ArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.FEET, makeItemSettings().rarity(Rarity.UNCOMMON))); // Tools // - public static final ToolItem TERMINITE_SHOVEL = registerTool("terminite_shovel", new EndShovelItem(EndToolMaterial.TERMINITE, 1.5F, -3.0F, makeItemSettings())); - public static final ToolItem TERMINITE_SWORD = registerTool("terminite_sword", new EndSwordItem(EndToolMaterial.TERMINITE, 3, -2.4F, makeItemSettings())); - public static final ToolItem TERMINITE_PICKAXE = registerTool("terminite_pickaxe", new EndPickaxeItem(EndToolMaterial.TERMINITE, 1, -2.8F, makeItemSettings())); - public static final ToolItem TERMINITE_AXE = registerTool("terminite_axe", new EndAxeItem(EndToolMaterial.TERMINITE, 6.0F, -3.0F, makeItemSettings())); - public static final ToolItem TERMINITE_HOE = registerTool("terminite_hoe", new EndHoeItem(EndToolMaterial.TERMINITE, -3, 0.0F, makeItemSettings())); - public static final ToolItem TERMINITE_HAMMER = registerTool("terminite_hammer", new EndHammerItem(EndToolMaterial.TERMINITE, 5.0F, -3.2F, 0.3D, makeItemSettings())); - public static final ToolItem AETERNIUM_SHOVEL = registerTool("aeternium_shovel", new EndShovelItem(EndToolMaterial.AETERNIUM, 1.5F, -3.0F, makeItemSettings().fireproof())); public static final ToolItem AETERNIUM_SWORD = registerTool("aeternium_sword", new EndSwordItem(EndToolMaterial.AETERNIUM, 3, -2.4F, makeItemSettings().fireproof())); public static final ToolItem AETERNIUM_PICKAXE = registerTool("aeternium_pickaxe", new EndPickaxeItem(EndToolMaterial.AETERNIUM, 1, -2.8F, makeItemSettings().fireproof())); @@ -104,10 +91,14 @@ public class EndItems { public static final ToolItem AETERNIUM_HOE = registerTool("aeternium_hoe", new EndHoeItem(EndToolMaterial.AETERNIUM, -3, 0.0F, makeItemSettings().fireproof())); public static final ToolItem AETERNIUM_HAMMER = registerTool("aeternium_hammer", new EndHammerItem(EndToolMaterial.AETERNIUM, 6.0F, -3.0F, 0.3D, makeItemSettings().fireproof())); - public static final ToolItem IRON_HAMMER = registerTool("iron_hammer", new EndHammerItem(ToolMaterials.IRON, 5.0F, -3.2F, 0.2D, makeItemSettings())); - public static final ToolItem GOLDEN_HAMMER = registerTool("golden_hammer", new EndHammerItem(ToolMaterials.GOLD, 4.5F, -3.4F, 0.3D, makeItemSettings())); - public static final ToolItem DIAMOND_HAMMER = registerTool("diamond_hammer", new EndHammerItem(ToolMaterials.DIAMOND, 5.5F, -3.1F, 0.2D, makeItemSettings())); - public static final ToolItem NETHERITE_HAMMER = registerTool("netherite_hammer", new EndHammerItem(ToolMaterials.NETHERITE, 5.0F, -3.0F, 0.2D, makeItemSettings())); + // Toolparts // + public final static Item AETERNIUM_SHOVEL_HEAD = registerItem("aeternium_shovel_head"); + public final static Item AETERNIUM_PICKAXE_HEAD = registerItem("aeternium_pickaxe_head"); + public final static Item AETERNIUM_AXE_HEAD = registerItem("aeternium_axe_head"); + public final static Item AETERNIUM_HOE_HEAD = registerItem("aeternium_hoe_head"); + public final static Item AETERNIUM_HAMMER_HEAD = registerItem("aeternium_hammer_head"); + public final static Item AETERNIUM_SWORD_BLADE = registerItem("aeternium_sword_blade"); + public final static Item AETERNIUM_SWORD_HANDLE = registerItem("aeternium_sword_handle"); // Food // public final static Item SHADOW_BERRY_RAW = registerFood("shadow_berry_raw", 4, 0.5F); @@ -119,23 +110,14 @@ public class EndItems { public final static Item SHADOW_BERRY_JELLY = registerFood("shadow_berry_jelly", 4, 0.75F, new StatusEffectInstance(StatusEffects.NIGHT_VISION, 400)); public final static Item BLOSSOM_BERRY = registerFood("blossom_berry", FoodComponents.APPLE); - // Drinks + // Drinks // public final static Item UMBRELLA_CLUSTER_JUICE = registerDrink("umbrella_cluster_juice"); - // Toolparts // - public final static Item AETERNIUM_SHOVEL_HEAD = registerItem("aeternium_shovel_head"); - public final static Item AETERNIUM_PICKAXE_HEAD = registerItem("aeternium_pickaxe_head"); - public final static Item AETERNIUM_AXE_HEAD = registerItem("aeternium_axe_head"); - public final static Item AETERNIUM_HOE_HEAD = registerItem("aeternium_hoe_head"); - public final static Item AETERNIUM_HAMMER_HEAD = registerItem("aeternium_hammer_head"); - public final static Item AETERNIUM_SWORD_BLADE = registerItem("aeternium_sword_blade"); - public final static Item AETERNIUM_SWORD_HANDLE = registerItem("aeternium_sword_handle"); - public static Item registerItem(String name) { return registerItem(BetterEnd.makeID(name), new PatternedItem(makeItemSettings())); } - protected static Item registerItem(String name, Item item) { + public static Item registerItem(String name, Item item) { return registerItem(BetterEnd.makeID(name), item); } diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index bb324daa..63b26079 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -1,6 +1,8 @@ package ru.betterend.registry; -import java.util.Arrays; +import java.util.List; + +import com.google.common.collect.Lists; import net.fabricmc.fabric.api.tag.TagRegistry; import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl; @@ -26,6 +28,7 @@ import ru.betterend.blocks.EndTerrainBlock; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.basis.SimpleLeavesBlock; import ru.betterend.blocks.basis.VineBlock; +import ru.betterend.item.EndHammerItem; import ru.betterend.mixin.common.ComposterBlockAccessor; import ru.betterend.util.TagHelper; @@ -96,16 +99,13 @@ public class EndTags { TagHelper.addTag(GEN_TERRAIN, EndBlocks.ENDER_ORE, EndBlocks.FLAVOLITE.stone, EndBlocks.VIOLECITE.stone, EndBlocks.SULPHURIC_ROCK.stone, EndBlocks.BRIMSTONE); TagHelper.addTag(END_GROUND, EndBlocks.SULPHURIC_ROCK.stone, EndBlocks.BRIMSTONE); - ToolManagerImpl.tag(HAMMERS).register(new ModdedToolsVanillaBlocksToolHandler( - Arrays.asList( - EndItems.IRON_HAMMER, - EndItems.GOLDEN_HAMMER, - EndItems.DIAMOND_HAMMER, - EndItems.NETHERITE_HAMMER, - EndItems.TERMINITE_HAMMER, - EndItems.AETERNIUM_HAMMER - ) - )); + List hammers = Lists.newArrayList(); + EndItems.getModItems().forEach((item) -> { + if (item instanceof EndHammerItem) { + hammers.add(item); + } + }); + ToolManagerImpl.tag(HAMMERS).register(new ModdedToolsVanillaBlocksToolHandler(hammers)); } public static void addSurfaceBlock(Block block) { From 1589bf33c03ac78420629cb358887d3fce8db310 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 30 Jan 2021 21:51:44 +0300 Subject: [PATCH 236/463] Metal textures & recipes --- .../blocks/complex/MetalMaterial.java | 27 +++++++++------ .../java/ru/betterend/item/EndArmorItem.java | 19 +++++++++++ .../ru/betterend/recipe/CraftingRecipes.java | 1 - .../recipe/builders/AnvilRecipe.java | 4 +-- .../java/ru/betterend/registry/EndBlocks.java | 2 -- .../java/ru/betterend/registry/EndItems.java | 32 ++++++++++++------ .../models/item/aeternium_boots.json | 6 ---- .../models/item/aeternium_chestplate.json | 6 ---- .../models/item/aeternium_hammer.json | 6 ---- .../models/item/aeternium_helmet.json | 6 ---- .../models/item/aeternium_ingot.json | 6 ---- .../models/item/aeternium_leggings.json | 6 ---- .../models/item/crystalite_boots.json | 6 ---- .../models/item/crystalite_chestplate.json | 6 ---- .../models/item/crystalite_hammer.json | 6 ---- .../models/item/crystalite_helmet.json | 6 ---- .../models/item/crystalite_leggings.json | 6 ---- .../betterend/models/item/diamond_hammer.json | 6 ---- .../betterend/models/item/golden_hammer.json | 6 ---- .../betterend/models/item/iron_hammer.json | 6 ---- .../models/item/netherite_hammer.json | 6 ---- .../models/item/terminite_block.json | 3 -- .../models/item/terminite_boots.json | 6 ---- .../models/item/terminite_chestplate.json | 6 ---- .../models/item/terminite_hammer.json | 6 ---- .../models/item/terminite_helmet.json | 6 ---- .../models/item/terminite_ingot.json | 6 ---- .../models/item/terminite_leggings.json | 6 ---- .../block/gold_bulb_vine_lantern_metal.png | Bin 420 -> 0 bytes .../textures/item/aeternium_hammer.png | Bin 426 -> 517 bytes .../textures/item/aeternium_hammer_head.png | Bin 373 -> 447 bytes .../textures/item/diamond_hammer.png | Bin 279 -> 0 bytes .../betterend/textures/item/golden_hammer.png | Bin 316 -> 0 bytes .../betterend/textures/item/iron_hammer.png | Bin 225 -> 0 bytes .../textures/item/netherite_hammer.png | Bin 230 -> 0 bytes .../textures/item/terminite_hammer.png | Bin 273 -> 492 bytes .../textures/item/terminite_nugget.png | Bin 0 -> 248 bytes .../textures/item/thallasium_boots.png | Bin 0 -> 255 bytes .../textures/item/thallasium_chestplate.png | Bin 0 -> 335 bytes .../textures/item/thallasium_hammer.png | Bin 0 -> 474 bytes .../textures/item/thallasium_helmet.png | Bin 0 -> 284 bytes .../textures/item/thallasium_leggings.png | Bin 0 -> 277 bytes 42 files changed, 58 insertions(+), 156 deletions(-) create mode 100644 src/main/java/ru/betterend/item/EndArmorItem.java delete mode 100644 src/main/resources/assets/betterend/models/item/aeternium_boots.json delete mode 100644 src/main/resources/assets/betterend/models/item/aeternium_chestplate.json delete mode 100644 src/main/resources/assets/betterend/models/item/aeternium_hammer.json delete mode 100644 src/main/resources/assets/betterend/models/item/aeternium_helmet.json delete mode 100644 src/main/resources/assets/betterend/models/item/aeternium_ingot.json delete mode 100644 src/main/resources/assets/betterend/models/item/aeternium_leggings.json delete mode 100644 src/main/resources/assets/betterend/models/item/crystalite_boots.json delete mode 100644 src/main/resources/assets/betterend/models/item/crystalite_chestplate.json delete mode 100644 src/main/resources/assets/betterend/models/item/crystalite_hammer.json delete mode 100644 src/main/resources/assets/betterend/models/item/crystalite_helmet.json delete mode 100644 src/main/resources/assets/betterend/models/item/crystalite_leggings.json delete mode 100644 src/main/resources/assets/betterend/models/item/diamond_hammer.json delete mode 100644 src/main/resources/assets/betterend/models/item/golden_hammer.json delete mode 100644 src/main/resources/assets/betterend/models/item/iron_hammer.json delete mode 100644 src/main/resources/assets/betterend/models/item/netherite_hammer.json delete mode 100644 src/main/resources/assets/betterend/models/item/terminite_block.json delete mode 100644 src/main/resources/assets/betterend/models/item/terminite_boots.json delete mode 100644 src/main/resources/assets/betterend/models/item/terminite_chestplate.json delete mode 100644 src/main/resources/assets/betterend/models/item/terminite_hammer.json delete mode 100644 src/main/resources/assets/betterend/models/item/terminite_helmet.json delete mode 100644 src/main/resources/assets/betterend/models/item/terminite_ingot.json delete mode 100644 src/main/resources/assets/betterend/models/item/terminite_leggings.json delete mode 100644 src/main/resources/assets/betterend/textures/block/gold_bulb_vine_lantern_metal.png delete mode 100644 src/main/resources/assets/betterend/textures/item/diamond_hammer.png delete mode 100644 src/main/resources/assets/betterend/textures/item/golden_hammer.png delete mode 100644 src/main/resources/assets/betterend/textures/item/iron_hammer.png delete mode 100644 src/main/resources/assets/betterend/textures/item/netherite_hammer.png create mode 100644 src/main/resources/assets/betterend/textures/item/terminite_nugget.png create mode 100644 src/main/resources/assets/betterend/textures/item/thallasium_boots.png create mode 100644 src/main/resources/assets/betterend/textures/item/thallasium_chestplate.png create mode 100644 src/main/resources/assets/betterend/textures/item/thallasium_hammer.png create mode 100644 src/main/resources/assets/betterend/textures/item/thallasium_helmet.png create mode 100644 src/main/resources/assets/betterend/textures/item/thallasium_leggings.png diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index 7471a144..a2acc88c 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -5,7 +5,6 @@ import net.minecraft.block.Block; import net.minecraft.block.Blocks; import net.minecraft.block.MaterialColor; import net.minecraft.entity.EquipmentSlot; -import net.minecraft.item.ArmorItem; import net.minecraft.item.ArmorMaterial; import net.minecraft.item.Item; import net.minecraft.item.Item.Settings; @@ -25,6 +24,7 @@ import ru.betterend.blocks.basis.EndSlabBlock; import ru.betterend.blocks.basis.EndStairsBlock; import ru.betterend.blocks.basis.EndTrapdoorBlock; import ru.betterend.blocks.basis.EndWoodenPlateBlock; +import ru.betterend.item.EndArmorItem; import ru.betterend.item.EndAxeItem; import ru.betterend.item.EndHammerItem; import ru.betterend.item.EndHoeItem; @@ -114,14 +114,14 @@ public class MetalMaterial { hoe = EndItems.registerTool(name + "_hoe", new EndHoeItem(material, -3, 0.0F, itemSettings)); hammer = EndItems.registerTool(name + "_hammer", new EndHammerItem(material, 5.0F, -3.2F, 0.3D, itemSettings)); - helmet = EndItems.registerItem(name + "_helmet", new ArmorItem(armor, EquipmentSlot.HEAD, itemSettings)); - chestplate = EndItems.registerItem(name + "_chestplate", new ArmorItem(armor, EquipmentSlot.CHEST, itemSettings)); - leggings = EndItems.registerItem(name + "_leggings", new ArmorItem(armor, EquipmentSlot.LEGS, itemSettings)); - boots = EndItems.registerItem(name + "_boots", new ArmorItem(armor, EquipmentSlot.FEET, itemSettings)); + helmet = EndItems.registerItem(name + "_helmet", new EndArmorItem(armor, EquipmentSlot.HEAD, itemSettings)); + chestplate = EndItems.registerItem(name + "_chestplate", new EndArmorItem(armor, EquipmentSlot.CHEST, itemSettings)); + leggings = EndItems.registerItem(name + "_leggings", new EndArmorItem(armor, EquipmentSlot.LEGS, itemSettings)); + boots = EndItems.registerItem(name + "_boots", new EndArmorItem(armor, EquipmentSlot.FEET, itemSettings)); if (hasOre) { - FurnaceRecipe.make("thallasium_ingot_furnace", ore, ingot).build(true); - AlloyingRecipe.Builder.create("thallasium_ingot").setInput(ore, ore).setOutput(ingot, 3).setExpiriense(2.1F).build(); + FurnaceRecipe.make(name + "_ingot_furnace", ore, ingot).setGroup("end_ingot").build(true); + AlloyingRecipe.Builder.create(name + "_ingot_alloy").setInput(ore, ore).setOutput(ingot, 3).setExpiriense(2.1F).build(); } GridRecipe.make(name + "_ingot_from_nuggets", ingot).setShape("###", "###", "###").addMaterial('#', nugget).setGroup("end_metal_ingots_nug").build(); @@ -147,10 +147,15 @@ public class MetalMaterial { GridRecipe.make(name + "_chandelier", chandelier).setShape("I#I", " # ").addMaterial('#', ingot).addMaterial('I', EndItems.LUMECORN_ROD).setGroup("end_metal_chandelier").build(); GridRecipe.make(name + "_hammer", hammer).setShape("III", "ISI", " S ").addMaterial('I', ingot).addMaterial('S', Items.STICK).setGroup("end_metal_hammers").build(); - FurnaceRecipe.make(name + "_axe_ingot", axe, nugget).build(true); - FurnaceRecipe.make(name + "_hoe_ingot", hoe, nugget).build(true); - FurnaceRecipe.make(name + "_pickaxe_ingot", pickaxe, nugget).build(true); - FurnaceRecipe.make(name + "_sword_ingot", sword, nugget).build(true); + FurnaceRecipe.make(name + "_axe_nugget", axe, nugget).setGroup("end_nugget").build(true); + FurnaceRecipe.make(name + "_hoe_nugget", hoe, nugget).setGroup("end_nugget").build(true); + FurnaceRecipe.make(name + "_pickaxe_nugget", pickaxe, nugget).setGroup("end_nugget").build(true); + FurnaceRecipe.make(name + "_sword_nugget", sword, nugget).setGroup("end_nugget").build(true); + FurnaceRecipe.make(name + "_hammer_nugget", hammer, nugget).setGroup("end_nugget").build(true); + FurnaceRecipe.make(name + "_helmet_nugget", helmet, nugget).setGroup("end_nugget").build(true); + FurnaceRecipe.make(name + "_chestplate_nugget", chestplate, nugget).setGroup("end_nugget").build(true); + FurnaceRecipe.make(name + "_leggings_nugget", leggings, nugget).setGroup("end_nugget").build(true); + FurnaceRecipe.make(name + "_boots_nugget", boots, nugget).setGroup("end_nugget").build(true); TagHelper.addTag(BlockTags.ANVIL, anvil); } diff --git a/src/main/java/ru/betterend/item/EndArmorItem.java b/src/main/java/ru/betterend/item/EndArmorItem.java new file mode 100644 index 00000000..67bf3031 --- /dev/null +++ b/src/main/java/ru/betterend/item/EndArmorItem.java @@ -0,0 +1,19 @@ +package ru.betterend.item; + +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.item.ArmorItem; +import net.minecraft.item.ArmorMaterial; +import net.minecraft.item.Item; +import ru.betterend.patterns.Patterned; +import ru.betterend.patterns.Patterns; + +public class EndArmorItem extends ArmorItem implements Patterned { + public EndArmorItem(ArmorMaterial material, EquipmentSlot slot, Item.Settings settings) { + super(material, slot, settings); + } + + @Override + public String getModelPattern(String name) { + return Patterns.createJson(Patterns.ITEM_GENERATED, name); + } +} diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index 6a204a57..972b817a 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -90,7 +90,6 @@ public class CraftingRecipes { GridRecipe.make("amber_gem", EndItems.AMBER_GEM).setShape("##", "##").addMaterial('#', EndItems.RAW_AMBER).build(); GridRecipe.make("amber_block", EndBlocks.AMBER_BLOCK).setShape("###", "###", "###").addMaterial('#', EndItems.AMBER_GEM).build(); GridRecipe.make("iron_bulb_lantern", EndBlocks.IRON_BULB_LANTERN).setShape("C", "I", "#").addMaterial('C', Items.CHAIN).addMaterial('I', Items.IRON_INGOT).addMaterial('#', EndItems.GLOWING_BULB).build(); - GridRecipe.make("gold_bulb_lantern", EndBlocks.GOLD_BULB_LANTERN).setShape("C", "I", "#").addMaterial('C', Items.CHAIN).addMaterial('I', Items.GOLD_INGOT).addMaterial('#', EndItems.GLOWING_BULB).build(); GridRecipe.make("twisted_moss_dye", Items.PINK_DYE).setList("#").addMaterial('#', EndBlocks.TWISTED_MOSS).build(); GridRecipe.make("byshy_grass_dye", Items.MAGENTA_DYE).setList("#").addMaterial('#', EndBlocks.BUSHY_GRASS).build(); GridRecipe.make("tail_moss_dye", Items.GRAY_DYE).setList("#").addMaterial('#', EndBlocks.TAIL_MOSS).build(); diff --git a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java index eef5ce40..602ad83e 100644 --- a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java @@ -1,5 +1,7 @@ package ru.betterend.recipe.builders; +import java.util.Objects; + import com.google.gson.JsonObject; import net.fabricmc.api.EnvType; @@ -28,8 +30,6 @@ import ru.betterend.registry.EndTags; import ru.betterend.util.ItemUtil; import ru.betterend.util.RecipeHelper; -import java.util.Objects; - public class AnvilRecipe implements Recipe, BetterEndRecipe { public final static String GROUP = "smithing"; diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 7abeb9b3..322357a2 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -308,8 +308,6 @@ public class EndBlocks { public static final Block IRON_BULB_LANTERN = registerBlock("iron_bulb_lantern", new BulbVineLanternBlock()); public static final ColoredMaterial IRON_BULB_LANTERN_COLORED = new ColoredMaterial(BulbVineLanternColoredBlock::new, IRON_BULB_LANTERN, false); - public static final Block GOLD_BULB_LANTERN = registerBlock("gold_bulb_lantern", new BulbVineLanternBlock()); - public static final ColoredMaterial GOLD_BULB_LANTERN_COLORED = new ColoredMaterial(BulbVineLanternColoredBlock::new, GOLD_BULB_LANTERN, false); public static final Block IRON_CHANDELIER = EndBlocks.registerBlock("iron_chandelier", new ChandelierBlock(Blocks.GOLD_BLOCK)); public static final Block GOLD_CHANDELIER = EndBlocks.registerBlock("gold_chandelier", new ChandelierBlock(Blocks.GOLD_BLOCK)); diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index c5b6859f..8d6cebea 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -35,6 +35,7 @@ import ru.betterend.BetterEnd; import ru.betterend.config.Configs; import ru.betterend.item.DrinkItem; import ru.betterend.item.EnchantedPetalItem; +import ru.betterend.item.EndArmorItem; import ru.betterend.item.EndAxeItem; import ru.betterend.item.EndHammerItem; import ru.betterend.item.EndHoeItem; @@ -74,14 +75,14 @@ public class EndItems { public final static Item LUMECORN_ROD = registerItem("lumecorn_rod"); // Armor // - public static final Item AETERNIUM_HELMET = registerItem("aeternium_helmet", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.HEAD, makeItemSettings().fireproof())); - public static final Item AETERNIUM_CHESTPLATE = registerItem("aeternium_chestplate", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.CHEST, makeItemSettings().fireproof())); - public static final Item AETERNIUM_LEGGINGS = registerItem("aeternium_leggings", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.LEGS, makeItemSettings().fireproof())); - public static final Item AETERNIUM_BOOTS = registerItem("aeternium_boots", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.FEET, makeItemSettings().fireproof())); - public static final Item CRYSTALITE_HELMET = registerItem("crystalite_helmet", new ArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.HEAD, makeItemSettings().rarity(Rarity.UNCOMMON))); - public static final Item CRYSTALITE_CHESTPLATE = registerItem("crystalite_chestplate", new ArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.CHEST, makeItemSettings().rarity(Rarity.UNCOMMON))); - public static final Item CRYSTALITE_LEGGINGS = registerItem("crystalite_leggings", new ArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.LEGS, makeItemSettings().rarity(Rarity.UNCOMMON))); - public static final Item CRYSTALITE_BOOTS = registerItem("crystalite_boots", new ArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.FEET, makeItemSettings().rarity(Rarity.UNCOMMON))); + public static final Item AETERNIUM_HELMET = registerItem("aeternium_helmet", new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.HEAD, makeItemSettings().fireproof())); + public static final Item AETERNIUM_CHESTPLATE = registerItem("aeternium_chestplate", new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.CHEST, makeItemSettings().fireproof())); + public static final Item AETERNIUM_LEGGINGS = registerItem("aeternium_leggings", new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.LEGS, makeItemSettings().fireproof())); + public static final Item AETERNIUM_BOOTS = registerItem("aeternium_boots", new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.FEET, makeItemSettings().fireproof())); + public static final Item CRYSTALITE_HELMET = registerItem("crystalite_helmet", new EndArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.HEAD, makeItemSettings().rarity(Rarity.UNCOMMON))); + public static final Item CRYSTALITE_CHESTPLATE = registerItem("crystalite_chestplate", new EndArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.CHEST, makeItemSettings().rarity(Rarity.UNCOMMON))); + public static final Item CRYSTALITE_LEGGINGS = registerItem("crystalite_leggings", new EndArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.LEGS, makeItemSettings().rarity(Rarity.UNCOMMON))); + public static final Item CRYSTALITE_BOOTS = registerItem("crystalite_boots", new EndArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.FEET, makeItemSettings().rarity(Rarity.UNCOMMON))); // Tools // public static final ToolItem AETERNIUM_SHOVEL = registerTool("aeternium_shovel", new EndShovelItem(EndToolMaterial.AETERNIUM, 1.5F, -3.0F, makeItemSettings().fireproof())); @@ -106,12 +107,12 @@ public class EndItems { public final static Item END_FISH_RAW = registerFood("end_fish_raw", FoodComponents.SALMON); public final static Item END_FISH_COOKED = registerFood("end_fish_cooked", FoodComponents.COOKED_SALMON); public final static Item BUCKET_END_FISH = registerItem("bucket_end_fish", new FishBucketItem(EndEntities.END_FISH, Fluids.WATER, makeItemSettings().maxCount(1))); - public final static Item SWEET_BERRY_JELLY = registerFood("sweet_berry_jelly", 3, 0.75F); - public final static Item SHADOW_BERRY_JELLY = registerFood("shadow_berry_jelly", 4, 0.75F, new StatusEffectInstance(StatusEffects.NIGHT_VISION, 400)); + public final static Item SWEET_BERRY_JELLY = registerFood("sweet_berry_jelly", 6, 0.75F); + public final static Item SHADOW_BERRY_JELLY = registerFood("shadow_berry_jelly", 7, 0.75F, new StatusEffectInstance(StatusEffects.NIGHT_VISION, 400)); public final static Item BLOSSOM_BERRY = registerFood("blossom_berry", FoodComponents.APPLE); // Drinks // - public final static Item UMBRELLA_CLUSTER_JUICE = registerDrink("umbrella_cluster_juice"); + public final static Item UMBRELLA_CLUSTER_JUICE = registerDrink("umbrella_cluster_juice", 5, 0.7F); public static Item registerItem(String name) { return registerItem(BetterEnd.makeID(name), new PatternedItem(makeItemSettings())); @@ -206,6 +207,15 @@ public class EndItems { public static Item registerDrink(String name) { return registerItem(name, new DrinkItem(makeItemSettings().maxCount(1))); } + + public static Item registerDrink(String name, FoodComponent foodComponent) { + return registerItem(name, new DrinkItem(makeItemSettings().maxCount(1).food(foodComponent))); + } + + public static Item registerDrink(String name, int hunger, float saturation) { + FoodComponent.Builder builder = new FoodComponent.Builder().hunger(hunger).saturationModifier(saturation); + return registerDrink(name, builder.build()); + } public static Settings makeItemSettings() { return new Item.Settings().group(CreativeTabs.TAB_ITEMS); diff --git a/src/main/resources/assets/betterend/models/item/aeternium_boots.json b/src/main/resources/assets/betterend/models/item/aeternium_boots.json deleted file mode 100644 index f6caae83..00000000 --- a/src/main/resources/assets/betterend/models/item/aeternium_boots.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "betterend:item/aeternium_boots" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/aeternium_chestplate.json b/src/main/resources/assets/betterend/models/item/aeternium_chestplate.json deleted file mode 100644 index 6f9a2c71..00000000 --- a/src/main/resources/assets/betterend/models/item/aeternium_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "betterend:item/aeternium_chestplate" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/aeternium_hammer.json b/src/main/resources/assets/betterend/models/item/aeternium_hammer.json deleted file mode 100644 index 97f80b2e..00000000 --- a/src/main/resources/assets/betterend/models/item/aeternium_hammer.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/handheld", - "textures": { - "layer0": "betterend:item/aeternium_hammer" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/aeternium_helmet.json b/src/main/resources/assets/betterend/models/item/aeternium_helmet.json deleted file mode 100644 index 791cb597..00000000 --- a/src/main/resources/assets/betterend/models/item/aeternium_helmet.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "betterend:item/aeternium_helmet" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/aeternium_ingot.json b/src/main/resources/assets/betterend/models/item/aeternium_ingot.json deleted file mode 100644 index 6f365de5..00000000 --- a/src/main/resources/assets/betterend/models/item/aeternium_ingot.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "betterend:item/aeternium_ingot" - } -} diff --git a/src/main/resources/assets/betterend/models/item/aeternium_leggings.json b/src/main/resources/assets/betterend/models/item/aeternium_leggings.json deleted file mode 100644 index b21c3b7b..00000000 --- a/src/main/resources/assets/betterend/models/item/aeternium_leggings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "betterend:item/aeternium_leggings" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/crystalite_boots.json b/src/main/resources/assets/betterend/models/item/crystalite_boots.json deleted file mode 100644 index 1a96c392..00000000 --- a/src/main/resources/assets/betterend/models/item/crystalite_boots.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "betterend:item/crystalite_boots" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/crystalite_chestplate.json b/src/main/resources/assets/betterend/models/item/crystalite_chestplate.json deleted file mode 100644 index 8fcf0ae2..00000000 --- a/src/main/resources/assets/betterend/models/item/crystalite_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "betterend:item/crystalite_chestplate" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/crystalite_hammer.json b/src/main/resources/assets/betterend/models/item/crystalite_hammer.json deleted file mode 100644 index b1428237..00000000 --- a/src/main/resources/assets/betterend/models/item/crystalite_hammer.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/handheld", - "textures": { - "layer0": "betterend:item/crystalite_hammer" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/crystalite_helmet.json b/src/main/resources/assets/betterend/models/item/crystalite_helmet.json deleted file mode 100644 index c6377a56..00000000 --- a/src/main/resources/assets/betterend/models/item/crystalite_helmet.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "betterend:item/crystalite_helmet" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/crystalite_leggings.json b/src/main/resources/assets/betterend/models/item/crystalite_leggings.json deleted file mode 100644 index 4457aef3..00000000 --- a/src/main/resources/assets/betterend/models/item/crystalite_leggings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "betterend:item/crystalite_leggings" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/diamond_hammer.json b/src/main/resources/assets/betterend/models/item/diamond_hammer.json deleted file mode 100644 index 767d96df..00000000 --- a/src/main/resources/assets/betterend/models/item/diamond_hammer.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/handheld", - "textures": { - "layer0": "betterend:item/diamond_hammer" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/golden_hammer.json b/src/main/resources/assets/betterend/models/item/golden_hammer.json deleted file mode 100644 index 91d0fbde..00000000 --- a/src/main/resources/assets/betterend/models/item/golden_hammer.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/handheld", - "textures": { - "layer0": "betterend:item/golden_hammer" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/iron_hammer.json b/src/main/resources/assets/betterend/models/item/iron_hammer.json deleted file mode 100644 index 37c4f957..00000000 --- a/src/main/resources/assets/betterend/models/item/iron_hammer.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/handheld", - "textures": { - "layer0": "betterend:item/iron_hammer" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/netherite_hammer.json b/src/main/resources/assets/betterend/models/item/netherite_hammer.json deleted file mode 100644 index 0040a0f7..00000000 --- a/src/main/resources/assets/betterend/models/item/netherite_hammer.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/handheld", - "textures": { - "layer0": "betterend:item/netherite_hammer" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/terminite_block.json b/src/main/resources/assets/betterend/models/item/terminite_block.json deleted file mode 100644 index 43510386..00000000 --- a/src/main/resources/assets/betterend/models/item/terminite_block.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/terminite_block" -} diff --git a/src/main/resources/assets/betterend/models/item/terminite_boots.json b/src/main/resources/assets/betterend/models/item/terminite_boots.json deleted file mode 100644 index 8e7f7ffe..00000000 --- a/src/main/resources/assets/betterend/models/item/terminite_boots.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "betterend:item/terminite_boots" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/terminite_chestplate.json b/src/main/resources/assets/betterend/models/item/terminite_chestplate.json deleted file mode 100644 index 1b0e7442..00000000 --- a/src/main/resources/assets/betterend/models/item/terminite_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "betterend:item/terminite_chestplate" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/terminite_hammer.json b/src/main/resources/assets/betterend/models/item/terminite_hammer.json deleted file mode 100644 index f579c92d..00000000 --- a/src/main/resources/assets/betterend/models/item/terminite_hammer.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/handheld", - "textures": { - "layer0": "betterend:item/terminite_hammer" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/terminite_helmet.json b/src/main/resources/assets/betterend/models/item/terminite_helmet.json deleted file mode 100644 index 7fbdb8a6..00000000 --- a/src/main/resources/assets/betterend/models/item/terminite_helmet.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "betterend:item/terminite_helmet" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/terminite_ingot.json b/src/main/resources/assets/betterend/models/item/terminite_ingot.json deleted file mode 100644 index 219b282f..00000000 --- a/src/main/resources/assets/betterend/models/item/terminite_ingot.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "betterend:item/terminite_ingot" - } -} diff --git a/src/main/resources/assets/betterend/models/item/terminite_leggings.json b/src/main/resources/assets/betterend/models/item/terminite_leggings.json deleted file mode 100644 index 191cd4d8..00000000 --- a/src/main/resources/assets/betterend/models/item/terminite_leggings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "betterend:item/terminite_leggings" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/gold_bulb_vine_lantern_metal.png b/src/main/resources/assets/betterend/textures/block/gold_bulb_vine_lantern_metal.png deleted file mode 100644 index c16377fbfb9ba54973436185d95a6a59a408229d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 420 zcmV;V0bBlwP)Px$UP(kjR5*>LlRs<1P!z>~FFdNmz%vkta|;G%cMF{h>FVl-=;+{7`XOAM^8q@v zU!n?K9Rev5h`~tUb@4s_w3wl1d2lZG-gD34iR$f6*Gl4gA*U#d6q(lmT&p{^l9t%7 z*X-A8$|ALmwUW5Qr6BN$pSyzST@d(;XOXCtM7mx`S)_b^K&!0)sCHWhBaU0YpL9IY z!fcNxS|oF!$wC|enb)-19je`yYPY4;?pXPzfeRSUxhz~mk|bxZ9Z)N2Hyb6!8-Qdk z^siwD&M}4!M$nIP`cckcbac8bQhRe8$7i0DMT+=$j7@hxzT66TxD-aIX&%oaar5vc zoTi)&TrY&chrq}6LTjXSz3^(zO>j)ZWx;U0UeC%V+d#JA^qeyf{>nMe^JWFta#l*6 z@y0+qpebhq*9(cCyW%oVDf61ebfw8cl2TBYyw^b5ch_0Itp)=>Px$zez+vR5*>LlTS!gQ5eO4_daLP=S-s1 z@HRC?KA$v+QB1Zhj6f+{6d2M{BX><$=2S$BX!^4YT)1mpxNH;Hs=$;Y8KXfN5Vb)a zv?fPqGxN15UQNA`!n3+uzH{z5=iUq3g!0-H5qI6#+9KM}lz)mPN+K#fmHb6k3cZ#3 zp5|s5xPFZ@r@Qd`{iLUo>~C!;o2jZq-W@q0H*d$;Q5(c|Y@n0Qwve3KTT|xTGs3>6 zCJ7&ma5xgdc5D)f1OYR^m-Tgut7~L385O9jBcIE8M-ZPuA-}=9>1iH4c*ycV7qd|d zpMsvgUd&)n39KNTo&|33&_=($zRzK2vIyiTsn`4XbC2ZBOv%Ve>q9@y#NzIVUe^-nTH=7G)Nvp_UivEYChIDS&FzL}@Jm zgExkh0o=WRkK)GW-{dzJqjKH}$)CcN;5zvI itbevGB4rhz0eWbTn zP|SES6|id9)_YwXmrKYMPv8xQ5HNuCQxP7I#{>|Tu?7U?5YmObDc+37!M|5Af0Tk> zmeB5Y!SFn6ENg8c5RDLF(Fxw^fYapyTQ0!19|I={I9FBZoer3ZfQU?z`2#|GrnV`F zv)d6%Cb5^zLVwjXEKCBFZm-GNj?Wwz?U{Et5KB>U2KRc)Y@t%Eju$5q2~+%WxP_eP zMpRiMoB`N1s^9645R7$Q)5uL#wHEi&k|`cu7b^&a;dn3{hl1;0BYyw^b5ch_0Itp)=>Px$c}YY;R5*>*lD$h?VHC!H?|XC8a82s! zQbqI{F-kzm=Fn0nQ5Oe0)lPz&7OOUX;UGrsQiN^}PWm4xqER=$aFAFKMF`SDTZ9sG z)l%*~4nh>;$LyI7hx28gcRikg;WMav^IEx=|JYbbiaEQA z)|xNhrgNESb>lqmg4TC!Y%eXdv$hV10wLD$mcxTXGR_&@9i4m}8O$j>`Uhs<1*XrG zXnj3_0*j4>MdI-Rb*enR4h}yp01&V&l-2^!*Z)}=z#r)N81DJSUG%xu6^?Fz?#aER Q3jhEB07*qoM6N<$f;36Vp8x;= delta 347 zcmV-h0i^!F1N8!sBYy!rNkle;XjccpMF*=8Td74GMI=!i6sm6eCqC~o2oABCd+@mLzT^GgaoiEodjr6)#!Ukg zQzpcmDd>Opx&lV?d3c>SynlZ|o0*2_WlbX*U}RE5+j~UqrhkRT!#z42^78pX(wf#C zkjdrHe)eJQ@4>3&VS`DqC*o-Aq*0tcno-do&gqMAU`vx$eH~ivh7!$GHG-y?_7!002ovPDHLkV1h92aJ>Kk diff --git a/src/main/resources/assets/betterend/textures/item/golden_hammer.png b/src/main/resources/assets/betterend/textures/item/golden_hammer.png deleted file mode 100644 index aed9697c55808d757b3279e8bbcc320083fdec6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 316 zcmV-C0mJ@@P)gsC O0000_KpK5BJPfwHiZzR zs2>1h&RJ4QJERLhGd@Dz%R|1eQA_~LF~;3gLw=v9%+mnb6?pGe2>!9Q$pn}X6M&vk zwgxc)JTUb9Uy0cQlX+keAvB)?>SUS=z}03Ipe1u;wGldu@hn-H%<(2(B{w~$V(c}1|M>sko>_H0fg^K)6w@PZZjMGEQ^JAkqok7tkAy=Vo2B$@MHb!$R*4hmU+5{mV4ZPx0|Rs7 z3`K*p7Q7DIB$r8MF)(jRTf>&HSyC+Zgp{L%vQ**Co;7Td#$Aj*a@4ep9Ze@Knfc;Q c2R}1|z)L&c_BD4t0UgfZ>FVdQ&MBb@0B8hJQ2+n{ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_hammer.png b/src/main/resources/assets/betterend/textures/item/terminite_hammer.png index 06738ec9468ef98a3f292baed0361ff8a6202bb0..ca25e71effffa9bbbd074f0d635f83c7385bcf7c 100644 GIT binary patch delta 466 zcmV;@0WJQK0_+2jB!2;OQb$4nuFf3k0004|NklHZg-S z1fkH-76%9!=ec<=_NIQKQb; zT)|GdUQq`tWfxXD&#m6L!!=R;#ub4#ub;`)KkY$qt-zz>Kc6bcL1OxMbpQYW07*qo IM6N<$g3^NBZU6uP delta 245 zcmVi@ym0E|g90Hmqx@s0oarw;)& ztNq960(5|^dGY&aa6|lzx&9aW3jHT&0LV7Cc~ilfkPVrdF8yCkmLFsg0|O^39s~5$ z{)=S9Vl@Qp9iTiI<2FE*fk8(6KM3PB1g8PIsvuV|fcy+{Hf}aU@ETy;)xZD?Fp!@a zq{UDSfqDUV7{F`>X$E2jkO81DNtitap&6F}$TovC!!SJHV4ATRfNnFAW(vVKu#6MAn+nihK z^Yej^2 vwtnyCJ&)gt-tb$n(qPj43om}n%>2Q0RNtygh?7Sb=z0cES3j3^P6yH6Y&q&-U_v<3ByRR_}U#$N!cik`fXUGcNG%{PmAL z?C|=1{||on@;aZVkcSy4zCr7VTH95I7_LIbHF`gO{FHymHpBePA9<1N=3vD$7fyT& zVtdk%;&lDb$Itd{(fs!kBnn<1ly2*v|KIS#XQPD@OyviUpa1`0*7@-?kSET!5Zn@O1TaS?83{1ORe| BZdCvP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_chestplate.png b/src/main/resources/assets/betterend/textures/item/thallasium_chestplate.png new file mode 100644 index 0000000000000000000000000000000000000000..6e4fc44a6b7288121231d0727db85c73e485601f GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D%zIXzt*Lo9le z6C^SYoH%gcK*BwP&-S~HoNOy`OR>{4)iF5NtW{tc_ER zb8-R@6!2|u+IVqK;Px$lu1NER5*>LlRqqEQ5431*S~!Rky~vtbh9BcXy%E@W*bpVWr#u}ip@3@YSkuQ zC{%=~W=n-eAri9PlFbSle-a5Vn~?Ad34>q_lW`PygoKjWh5QNCObohNrb)gh*d6@zP@n1q~*buJhu2|2oQnv!;9_v?MnqW@=`B z-vOxOqgyx5)Zmy4b8?oy#&{$kp`gLyRt8?JIo;SPKo$nrvAqKENI+tyW^(D;1Kavz z{xfawqm;@v`8nH1mrsZ0Iu8tF1$>=f;9U3TzvBu->#HRBujs$vT!DAjBQ=AwqM<@H Qa{vGU07*qoM6N<$f*m-|hyVZp literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_helmet.png b/src/main/resources/assets/betterend/textures/item/thallasium_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..452e6e8ab129ce61786e9457fbc548e68a4f461c GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|u6epRhFJ6_ zCrEs15S+cB^6;7eH;(w5ElFOHesI}M%L84F^QUvV{`vAWoM*kw@8dWskd`xR ztI7>YoufM?>;C*b|KaC%do~b|)AM616D@6fFaO`XW=HWx!DZ}MrP$bZoDIMKKcV8+ zS94|{IDGuPfb$g*7lS>m4_Sel+Lp)H8?TA3VLA7Fs!+0kfUv^7hSKhSgF833$+?~} zP@UV@7{R=u@%;HX!#h<94T^n&Z1VR1lPgL;X|y@zBtc!oA)t*5*0ThYX&selF{r5}E)k!*rei literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_leggings.png b/src/main/resources/assets/betterend/textures/item/thallasium_leggings.png new file mode 100644 index 0000000000000000000000000000000000000000..ef9a6f99c08978b90b3b8bf3ac7733e74582e06e GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|&U?BzhFJ6_ zCrD%*=+H~JXYkox@926zxzru|YX!UH#7fTYl16Va~i039Gc-<}ey8*I)m}jc>#MWx=O5N;O=~J#j7_XoZ0B_G2%-?#xpbN|0#C zvu0*i`M0t2amm58?D-qCj;Zw}9auft-Sg6!0}ZNT=g!UP4^`Cr*vQUM)9oeob=sS$ QK(8@)y85}Sb4q9e0I{ZU;{X5v literal 0 HcmV?d00001 From 271dacc22849b1a4e9aa548893a214e8916266bf Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 30 Jan 2021 22:50:18 +0300 Subject: [PATCH 237/463] Lang files --- .../assets/betterend/lang/en_us.json | 56 ++++++++++++------- .../assets/betterend/lang/ru_ru.json | 38 ++++++++++++- 2 files changed, 74 insertions(+), 20 deletions(-) diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index fd331ffe..e98f0319 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -379,24 +379,6 @@ "block.betterend.iron_bulb_lantern_white": "White Iron Bulb Lantern", "block.betterend.iron_bulb_lantern_yellow": "Yellow Iron Bulb Lantern", - "block.betterend.gold_bulb_lantern": "Gold Bulb Lantern", - "block.betterend.gold_bulb_lantern_black": "Black Gold Bulb Lantern", - "block.betterend.gold_bulb_lantern_blue": "Blue Gold Bulb Lantern", - "block.betterend.gold_bulb_lantern_brown": "Brown Gold Bulb Lantern", - "block.betterend.gold_bulb_lantern_cyan": "Cyan Gold Bulb Lantern", - "block.betterend.gold_bulb_lantern_gray": "Gray Gold Bulb Lantern", - "block.betterend.gold_bulb_lantern_green": "Green Gold Bulb Lantern", - "block.betterend.gold_bulb_lantern_light_blue": "Light Blue Gold Bulb Lantern", - "block.betterend.gold_bulb_lantern_light_gray": "Light Gray Gold Bulb Lantern", - "block.betterend.gold_bulb_lantern_lime": "Lime Gold Bulb Lantern", - "block.betterend.gold_bulb_lantern_magenta": "Magenta Gold Bulb Lantern", - "block.betterend.gold_bulb_lantern_orange": "Orange Gold Bulb Lantern", - "block.betterend.gold_bulb_lantern_pink": "Pink Gold Bulb Lantern", - "block.betterend.gold_bulb_lantern_purple": "Purple Gold Bulb Lantern", - "block.betterend.gold_bulb_lantern_red": "Red Gold Bulb Lantern", - "block.betterend.gold_bulb_lantern_white": "White Gold Bulb Lantern", - "block.betterend.gold_bulb_lantern_yellow": "Yellow Gold Bulb Lantern", - "block.betterend.thallasium_bulb_lantern": "Thallasium Bulb Lantern", "block.betterend.thallasium_bulb_lantern_black": "Black Thallasium Bulb Lantern", "block.betterend.thallasium_bulb_lantern_blue": "Blue Thallasium Bulb Lantern", @@ -638,5 +620,41 @@ "block.betterend.gold_chandelier": "Gold Chandelier", "block.betterend.iron_chandelier": "Iron Chandelier", - "item.betterend.thallasium_nugget": "Thallasium Nugget" + "item.betterend.thallasium_nugget": "Thallasium Nugget", + + "block.betterend.terminite_anvil": "Terminite Anvil", + "block.betterend.terminite_bars": "Terminite Bars", + + "block.betterend.terminite_bulb_lantern": "Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_black": "Black Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_blue": "Blue Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_brown": "Brown Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_cyan": "Cyan Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_gray": "Gray Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_green": "Green Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_light_blue": "Light Blue Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_light_gray": "Light Gray Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_lime": "Lime Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_magenta": "Magenta Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_orange": "Orange Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_pink": "Pink Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_purple": "Purple Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_red": "Red Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_white": "White Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_yellow": "Yellow Terminite Bulb Lantern", + + "block.betterend.terminite_chain": "Terminite Chain", + "block.betterend.terminite_chandelier": "Terminite Chandelier", + "block.betterend.terminite_door": "Terminite Door", + "block.betterend.terminite_plate": "Terminite Pressure Plate", + "block.betterend.terminite_slab": "Terminite Slab", + "block.betterend.terminite_stairs": "Terminite Stairs", + "block.betterend.terminite_tile": "Terminite Tile", + "block.betterend.terminite_trapdoor": "Terminite Trapdoor", + "item.betterend.terminite_nugget": "Terminite Nugget", + "item.betterend.thallasium_boots": "Thallasium Boots", + "item.betterend.thallasium_chestplate": "Thallasium Chestplate", + "item.betterend.thallasium_hammer": "Thallasium Hammer", + "item.betterend.thallasium_helmet": "Thallasium Helmet", + "item.betterend.thallasium_leggings": "Thallasium Leggings" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index d7126914..1c20c6fe 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -640,5 +640,41 @@ "block.betterend.gold_chandelier": "Золотой канделябр", "block.betterend.iron_chandelier": "Железный канделябр", - "item.betterend.thallasium_nugget": "Талласиевый самородок" + "item.betterend.thallasium_nugget": "Талласиевый самородок", + + "block.betterend.terminite_anvil": "Терминитовая наковальня", + "block.betterend.terminite_bars": "Терминитовая решётка", + + "block.betterend.terminite_bulb_lantern": "Терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_black": "Чёрный терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_blue": "Синий терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_brown": "Коричневый терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_cyan": "Циановый терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_gray": "Серый терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_green": "Зелёный терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_light_blue": "Голубой терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_light_gray": "Светло-серый терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_lime": "Лаймовый терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_magenta": "Фиолетовый терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_orange": "Оранжевый терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_pink": "Розовый терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_purple": "Пурпурный терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_red": "Красный терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_white": "Белый терминитовый луковичный фонарь", + "block.betterend.terminite_bulb_lantern_yellow": "Жёлтый терминитовый луковичный фонарь", + + "block.betterend.terminite_chain": "Терминитовая цепь", + "block.betterend.terminite_chandelier": "Терминитовый канделябр", + "block.betterend.terminite_door": "Терминитовая дверь", + "block.betterend.terminite_plate": "Терминитовая нажимная плита", + "block.betterend.terminite_slab": "Терминитовая плита", + "block.betterend.terminite_stairs": "Терминитовые ступени", + "block.betterend.terminite_tile": "Терминитовая плитка", + "block.betterend.terminite_trapdoor": "Терминитовый люк", + "item.betterend.terminite_nugget": "Терминитовый самородок", + "item.betterend.thallasium_boots": "Талласиевые ботинки", + "item.betterend.thallasium_chestplate": "Талласиевый нагрудник", + "item.betterend.thallasium_hammer": "Талласиевый молот", + "item.betterend.thallasium_helmet": "Талласиевый шлем", + "item.betterend.thallasium_leggings": "Талласиевые поножи" } \ No newline at end of file From 5fd949027019154301eda64156604e5e2e6b1176 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 31 Jan 2021 07:33:23 +0300 Subject: [PATCH 238/463] Small texture update --- .../java/ru/betterend/recipe/AnvilRecipes.java | 2 +- .../betterend/textures/block/ender_block.png | Bin 498 -> 256 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/recipe/AnvilRecipes.java b/src/main/java/ru/betterend/recipe/AnvilRecipes.java index 83207d3a..40b8498c 100644 --- a/src/main/java/ru/betterend/recipe/AnvilRecipes.java +++ b/src/main/java/ru/betterend/recipe/AnvilRecipes.java @@ -15,7 +15,7 @@ public class AnvilRecipes { AnvilRecipe.Builder.create("ender_shard_to_dust") .setInput(EndItems.ENDER_SHARD) .setOutput(EndItems.ENDER_DUST) - .setLevel(2) + .setLevel(0) .setDamage(3) .build(); diff --git a/src/main/resources/assets/betterend/textures/block/ender_block.png b/src/main/resources/assets/betterend/textures/block/ender_block.png index 4658d5a1c5bf5c972d14f4f5b1feabfba5399649..a9a40e7ec463516690700698bb473ac90e9ecada 100644 GIT binary patch delta 239 zcmeyw+`u$JvYwfNfk8u;KNv_c76-XIF|0c$^AgCB3-AeX1=0-i5)3M`40c8g-gXR; zUJR+>43#+yliL`s9R2%tGDsy?NswPK!+#j4>l6tCidK2LIEF|}we9B=I-tP89O`l5 zfBg>5ZKXD8%5PpYxEb;EJTvpExFlIO{o5Xj1zV34DQ#his(C^|89BxziWpMzW#pQ!SX~#|Nhs@ g*IQ1XzI@wHhC}fzyHzu$hk~5%>FVdQ&MBb@0ApQdEC2ui delta 483 zcmV<90UZ8-0`dcp8Gi-<001BJ|6u?C0l7&;K~#9!Rg+6r!e9)AvkT=MJvd+k%1kN_ zu|PK(D$TmZ zab(ZtO2|8!%OT&ed~HD`4?dq&e!mTmmj-h00dD~}XNF#)(tmGT9{daZe5veg25hMu z_EbJ5DtG59w*groB~j^s_^4+EYKsU&rNBX^@;Wgh757t>)CI5&j`}Lc0S_1MfS&II zVU!tZe5!ICu-8%P#6E|}tWz2C?xqVYy1=dXI6gD-Adt5=ylNo#+ExS-PRTLYrHZ%k z@?_+(R~|TUkblNj00GEJRNl&r01k%T(08|VfBU$1Tt=0=S@^G%i6NfkHGNA`Y;J06ijbeWG#|(D613;EEw5 z!2aYd;DBj!H3+Z+94c-By9mXrCW<(2_%v1({XUoH Z{s0hWp+T?Fp8Eg*002ovPDHLkV1hyd-8KLK From 49b0e5257dae2ab4b1aef0a7d5bc0caa24c65a10 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 31 Jan 2021 08:33:15 +0300 Subject: [PATCH 239/463] More shaders & textures --- ...lantern.json => terminite_bulb_lantern.json} | 0 ...k.json => terminite_bulb_lantern_black.json} | 0 ...ue.json => terminite_bulb_lantern_blue.json} | 0 ...n.json => terminite_bulb_lantern_brown.json} | 0 ...an.json => terminite_bulb_lantern_cyan.json} | 0 ...ay.json => terminite_bulb_lantern_gray.json} | 0 ...n.json => terminite_bulb_lantern_green.json} | 0 ...n => terminite_bulb_lantern_light_blue.json} | 0 ...n => terminite_bulb_lantern_light_gray.json} | 0 ...me.json => terminite_bulb_lantern_lime.json} | 0 ...json => terminite_bulb_lantern_magenta.json} | 0 ....json => terminite_bulb_lantern_orange.json} | 0 ...nk.json => terminite_bulb_lantern_pink.json} | 0 ....json => terminite_bulb_lantern_purple.json} | 0 ...red.json => terminite_bulb_lantern_red.json} | 0 ...e.json => terminite_bulb_lantern_white.json} | 0 ....json => terminite_bulb_lantern_yellow.json} | 0 .../lights/item/terminite_chandelier.json | 7 +++++++ .../block/terminite_bulb_lantern.json | 10 ++++++++++ .../block/terminite_bulb_lantern_black.json | 10 ++++++++++ .../block/terminite_bulb_lantern_blue.json | 10 ++++++++++ .../block/terminite_bulb_lantern_brown.json | 10 ++++++++++ .../block/terminite_bulb_lantern_cyan.json | 10 ++++++++++ .../block/terminite_bulb_lantern_gray.json | 10 ++++++++++ .../block/terminite_bulb_lantern_green.json | 10 ++++++++++ .../terminite_bulb_lantern_light_blue.json | 10 ++++++++++ .../terminite_bulb_lantern_light_gray.json | 10 ++++++++++ .../block/terminite_bulb_lantern_lime.json | 10 ++++++++++ .../block/terminite_bulb_lantern_magenta.json | 10 ++++++++++ .../block/terminite_bulb_lantern_orange.json | 10 ++++++++++ .../block/terminite_bulb_lantern_pink.json | 10 ++++++++++ .../block/terminite_bulb_lantern_purple.json | 10 ++++++++++ .../block/terminite_bulb_lantern_red.json | 10 ++++++++++ .../block/terminite_bulb_lantern_white.json | 10 ++++++++++ .../block/terminite_bulb_lantern_yellow.json | 10 ++++++++++ .../block/terminite_chandelier.json | 3 +++ .../materialmaps/item/terminite_chandelier.json | 3 +++ .../textures/block/terminite_block.png | Bin 476 -> 233 bytes .../block/terminite_bulb_vine_lantern_metal.png | Bin 0 -> 414 bytes .../textures/block/terminite_chain.png | Bin 0 -> 167 bytes .../block/terminite_chandelier_ceilt.png | Bin 0 -> 342 bytes .../block/terminite_chandelier_floor.png | Bin 0 -> 463 bytes .../block/terminite_chandelier_wall.png | Bin 0 -> 369 bytes .../betterend/textures/block/terminite_tile.png | Bin 0 -> 210 bytes .../betterend/textures/item/terminite_chain.png | Bin 0 -> 170 bytes .../textures/item/terminite_chandelier.png | Bin 0 -> 345 bytes 46 files changed, 183 insertions(+) rename src/main/resources/assets/betterend/lights/item/{gold_bulb_lantern.json => terminite_bulb_lantern.json} (100%) rename src/main/resources/assets/betterend/lights/item/{gold_bulb_lantern_black.json => terminite_bulb_lantern_black.json} (100%) rename src/main/resources/assets/betterend/lights/item/{gold_bulb_lantern_blue.json => terminite_bulb_lantern_blue.json} (100%) rename src/main/resources/assets/betterend/lights/item/{gold_bulb_lantern_brown.json => terminite_bulb_lantern_brown.json} (100%) rename src/main/resources/assets/betterend/lights/item/{gold_bulb_lantern_cyan.json => terminite_bulb_lantern_cyan.json} (100%) rename src/main/resources/assets/betterend/lights/item/{gold_bulb_lantern_gray.json => terminite_bulb_lantern_gray.json} (100%) rename src/main/resources/assets/betterend/lights/item/{gold_bulb_lantern_green.json => terminite_bulb_lantern_green.json} (100%) rename src/main/resources/assets/betterend/lights/item/{gold_bulb_lantern_light_blue.json => terminite_bulb_lantern_light_blue.json} (100%) rename src/main/resources/assets/betterend/lights/item/{gold_bulb_lantern_light_gray.json => terminite_bulb_lantern_light_gray.json} (100%) rename src/main/resources/assets/betterend/lights/item/{gold_bulb_lantern_lime.json => terminite_bulb_lantern_lime.json} (100%) rename src/main/resources/assets/betterend/lights/item/{gold_bulb_lantern_magenta.json => terminite_bulb_lantern_magenta.json} (100%) rename src/main/resources/assets/betterend/lights/item/{gold_bulb_lantern_orange.json => terminite_bulb_lantern_orange.json} (100%) rename src/main/resources/assets/betterend/lights/item/{gold_bulb_lantern_pink.json => terminite_bulb_lantern_pink.json} (100%) rename src/main/resources/assets/betterend/lights/item/{gold_bulb_lantern_purple.json => terminite_bulb_lantern_purple.json} (100%) rename src/main/resources/assets/betterend/lights/item/{gold_bulb_lantern_red.json => terminite_bulb_lantern_red.json} (100%) rename src/main/resources/assets/betterend/lights/item/{gold_bulb_lantern_white.json => terminite_bulb_lantern_white.json} (100%) rename src/main/resources/assets/betterend/lights/item/{gold_bulb_lantern_yellow.json => terminite_bulb_lantern_yellow.json} (100%) create mode 100644 src/main/resources/assets/betterend/lights/item/terminite_chandelier.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_black.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_blue.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_brown.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_cyan.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_gray.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_green.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_light_blue.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_light_gray.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_lime.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_magenta.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_orange.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_pink.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_purple.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_red.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_white.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_yellow.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/terminite_chandelier.json create mode 100644 src/main/resources/assets/betterend/materialmaps/item/terminite_chandelier.json create mode 100644 src/main/resources/assets/betterend/textures/block/terminite_bulb_vine_lantern_metal.png create mode 100644 src/main/resources/assets/betterend/textures/block/terminite_chain.png create mode 100644 src/main/resources/assets/betterend/textures/block/terminite_chandelier_ceilt.png create mode 100644 src/main/resources/assets/betterend/textures/block/terminite_chandelier_floor.png create mode 100644 src/main/resources/assets/betterend/textures/block/terminite_chandelier_wall.png create mode 100644 src/main/resources/assets/betterend/textures/block/terminite_tile.png create mode 100644 src/main/resources/assets/betterend/textures/item/terminite_chain.png create mode 100644 src/main/resources/assets/betterend/textures/item/terminite_chandelier.png diff --git a/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/gold_bulb_lantern.json rename to src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern.json diff --git a/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_black.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_black.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_black.json rename to src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_black.json diff --git a/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_blue.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_blue.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_blue.json rename to src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_blue.json diff --git a/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_brown.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_brown.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_brown.json rename to src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_brown.json diff --git a/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_cyan.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_cyan.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_cyan.json rename to src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_cyan.json diff --git a/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_gray.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_gray.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_gray.json rename to src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_gray.json diff --git a/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_green.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_green.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_green.json rename to src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_green.json diff --git a/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_light_blue.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_light_blue.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_light_blue.json rename to src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_light_blue.json diff --git a/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_light_gray.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_light_gray.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_light_gray.json rename to src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_light_gray.json diff --git a/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_lime.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_lime.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_lime.json rename to src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_lime.json diff --git a/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_magenta.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_magenta.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_magenta.json rename to src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_magenta.json diff --git a/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_orange.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_orange.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_orange.json rename to src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_orange.json diff --git a/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_pink.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_pink.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_pink.json rename to src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_pink.json diff --git a/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_purple.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_purple.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_purple.json rename to src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_purple.json diff --git a/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_red.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_red.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_red.json rename to src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_red.json diff --git a/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_white.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_white.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_white.json rename to src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_white.json diff --git a/src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_yellow.json b/src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_yellow.json similarity index 100% rename from src/main/resources/assets/betterend/lights/item/gold_bulb_lantern_yellow.json rename to src/main/resources/assets/betterend/lights/item/terminite_bulb_lantern_yellow.json diff --git a/src/main/resources/assets/betterend/lights/item/terminite_chandelier.json b/src/main/resources/assets/betterend/lights/item/terminite_chandelier.json new file mode 100644 index 00000000..044e62bf --- /dev/null +++ b/src/main/resources/assets/betterend/lights/item/terminite_chandelier.json @@ -0,0 +1,7 @@ +{ + "intensity": 0.2, + "red": 0.5, + "green": 1.0, + "blue": 0.0, + "worksInFluid": true +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern.json new file mode 100644 index 00000000..f84c70f5 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_bulb", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_black.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_black.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_black.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_blue.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_blue.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_blue.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_brown.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_brown.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_brown.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_cyan.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_cyan.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_cyan.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_gray.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_gray.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_gray.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_green.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_green.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_green.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_light_blue.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_light_blue.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_light_blue.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_light_gray.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_light_gray.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_light_gray.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_lime.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_lime.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_lime.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_magenta.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_magenta.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_magenta.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_orange.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_orange.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_orange.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_pink.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_pink.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_pink.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_purple.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_purple.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_purple.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_red.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_red.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_red.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_white.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_white.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_white.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_yellow.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_yellow.json new file mode 100644 index 00000000..8e6f0041 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_bulb_lantern_yellow.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/bulb_vine_lantern_overlay", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/terminite_chandelier.json b/src/main/resources/assets/betterend/materialmaps/block/terminite_chandelier.json new file mode 100644 index 00000000..73a05561 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/terminite_chandelier.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_green" +} diff --git a/src/main/resources/assets/betterend/materialmaps/item/terminite_chandelier.json b/src/main/resources/assets/betterend/materialmaps/item/terminite_chandelier.json new file mode 100644 index 00000000..73a05561 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/terminite_chandelier.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_green" +} diff --git a/src/main/resources/assets/betterend/textures/block/terminite_block.png b/src/main/resources/assets/betterend/textures/block/terminite_block.png index ff56e729fec6deb38213540e00ad03e589104df6..050b090dd9ed28e74f33b949676b42c8b5e3aa53 100644 GIT binary patch delta 216 zcmV;}04M+41L*;f8Gi!+001a04^sdD00DDSM?wIu&K&6g000|MOjJbyOh*A?TLE)x z0fl=2pp-Poy++l_ar5ZM{rH;w8b1I40DMVAK~xx(MUM*(1R)4Ru`S^JPrQYh$r2&< z$>D1BN!(-E6wZYdzyFbux59MrG-4_dX!a9yOJ%2raHaHU^-Vi?sz5|2T S@ATLJ0000KZqf3hB0U8j*hA5PEgl@m#`^Rm8JTXFY}9P2oJRv_ zz`p+e638@Q_~M)nYap0n-@HOf8H(QE(O%ia$vzsZ(*vq)nu11^ymN|58)6quL;w<~ z!e&9G=x#nT8-L)?dPH~2pr zjRDcL1$e-kho7$BjjiD>`RJa(bnFDCxpq#NM~D3vI($lV#O@G000000NkvXXu0mjf Do$B2G diff --git a/src/main/resources/assets/betterend/textures/block/terminite_bulb_vine_lantern_metal.png b/src/main/resources/assets/betterend/textures/block/terminite_bulb_vine_lantern_metal.png new file mode 100644 index 0000000000000000000000000000000000000000..93dcab0c53d05777f09aed7c200d65779ce670a6 GIT binary patch literal 414 zcmV;P0b%}$P)Px$SV=@dR5*>LQ?Y6SK@fej*n2rdT=xg=3cC$rAMA|a599+ZEYe*qSEUh>56BM$ zB%MWC5v*ciNPixLVDtx^6nnd;N4P8UU|4pBnR)vjOLRYG_#RkEoP&}S*dNTLq%Pol zEP;EAVuWu90MovF#Kmj%OiZr(rX6ivx7&6)?R4V@kyNmTi4!Ae30 zA#@Oem2^UiDxa%Rvkk>UJDw3neQvc{j`sTe{TVJa_{--CGg70?Z+ z^4WrwG$I#tsbPP>Yq!Jvu?0qbrspTKsoUZ6|Db~qz`~stzmRCbwv@Aou>b%707*qo IM6N<$f`;F-1poj5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/terminite_chain.png b/src/main/resources/assets/betterend/textures/block/terminite_chain.png new file mode 100644 index 0000000000000000000000000000000000000000..70720d4e322215e910fcbd8fbd92c0e2aa35ab29 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|5ffTpO3;7RAco;&hT^H;(Ki&ki OjKR~@&t;ucLK6UL);I|O literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/terminite_chandelier_ceilt.png b/src/main/resources/assets/betterend/textures/block/terminite_chandelier_ceilt.png new file mode 100644 index 0000000000000000000000000000000000000000..201d6847046c41c2b76556f8769a3b226f5a762b GIT binary patch literal 342 zcmV-c0jd6pP)Px$5J^NqR5*?8lCeqyVGxAB4VD%nB8ZJ3f+_4Sh=>+8X<}!W!jRf0Ft(Q`NM&)v z!s_7O;I2@_q_`?Y3JKVVAQG>zAB!Ui!TYbWbgF-sWp-xvHyrQ=vC=p}+gsS%JL>r6 znsve&by>TqvYARzQxfKPq>FRd-N75gl8Sj&=G**^fQ8g)hD|g0%19>x9G(@(-SmDe(5Iq+x`Ddy~Y;^&L;EF9JCJ-m}N=TyqBM*s z4Mq}@px@KXzbk{n5a+p!#-w4CzpeO+PJ&AJMmng%`Wm%i;#6EnU}pIhMq`+~lHLYo oLVsiC+1gE6qwf3z|M(;P0J^Ppoof5!&;S4c07*qoM6N<$f-el7)&Kwi literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/terminite_chandelier_floor.png b/src/main/resources/assets/betterend/textures/block/terminite_chandelier_floor.png new file mode 100644 index 0000000000000000000000000000000000000000..5beee74466f13b3d3b33c5a06a3597e5ee69ca16 GIT binary patch literal 463 zcmV;=0WkiFP)Px$iAh93R5*>5kuOX_VHCxGm$9iqLHswy=G-Jmun0^t28+qb3rzC@O)6JlBWAL6E0h8D8cuzraddm0he&;*)-g88D^Qw_B0CIbW?jOqc z8k^ff8>$L`VVSxXN(q2ZBVoiiN6HoAnN^1v2_xkS^72YI49nE$z!ZjMDu6FB7lX-h z0IJ23Hwm*dV7>kLoD4)69ULYZh+DA5x#h46^(?6FQp+A{FQ9C z8rbhm=lK!dND0d zJNa4jq)rYL+6lPb=3`Ej-_p?em~(FAq+mzV>WSHHfm$621v>;i0UnIA~uifUkJb$-Px$D@jB_R5*>jlD$d;Q4oc{2@7H+Vn|*fMbfXJ2sR>V@(%g{mUhq0H|py8p33Qo`MQf7 zRmGuESGQa-Ge{9MuMi+;wg0r9!g0$L0`D$!IVX$Ms!Ab`UR+wQ`~UC_2M>ovjR|6< P00000NkvXXu0mjf;}D!R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/terminite_tile.png b/src/main/resources/assets/betterend/textures/block/terminite_tile.png new file mode 100644 index 0000000000000000000000000000000000000000..e8abe370630f965076c4051858ff8f146a816f6c GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~=>VS)S4JOq z#-wP*;%vs&YK8?gnPbA~ChJ|2E$N1rBGyop1i{ zuh8vE$$U-u#hEamg$$mqelF{r G5}E*NT}}@G literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/terminite_chain.png b/src/main/resources/assets/betterend/textures/item/terminite_chain.png new file mode 100644 index 0000000000000000000000000000000000000000..f5a686bde4c9145b12fb50651b93b6f32598606f GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|QaoK8Lo9le z6BdXj_;mg2_j%0ZQ^A|L_Sou~8??JNb4oQ_X6;#f^}po3dW8&*JpDbt4}7S<7v$FV zUH(KdqhfChZ-T@Nhm?c_g;UZyk{PqCe{MW*z#t;YF`z-Cd4sfri%tL!!{?(KO=0Ke Rw*l>A@O1TaS?83{1OV?AJbC~C literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/terminite_chandelier.png b/src/main/resources/assets/betterend/textures/item/terminite_chandelier.png new file mode 100644 index 0000000000000000000000000000000000000000..4045357bb1b7d027dd215403b05ec4caed23168f GIT binary patch literal 345 zcmV-f0jBPx$6G=otR5*>@k}prgP!z?_#SBBz%}jtGp$QquB%cDl0geO=5?NhYx0;D%2DQo> zKEdiI77~_BY+2H@uXU3LQQiyPqss_xN4=Ndz31Hb2RI&)#BddJl21wUS3b$77C+f7 zbX#3SDrpSb<;EaV32&Vnv`^0fz#1V^3EfuL;>MuZ<{F~d=2mhO7rhv+V&nXDekURV zj0cq291KGFuF=Wzd~shl08lloH-IXEq6DrkfyEL?GvL|<`#s2d1A4yct6ieZ=D=bJ z2BC2DRu!cg7{3dHP&BXgSclcX_Xt&1n~qaU{VD4ijZ_JA9N^;<#^|pS-=jP}*uUza r3AEB|FK#v%52!CpUSIZ3@h^P=tz3J2yn~{x00000NkvXXu0mjfoQaPd literal 0 HcmV?d00001 From 211c87864d89b9647f42efad6f066e49fa91096b Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 31 Jan 2021 09:29:21 +0300 Subject: [PATCH 240/463] More textures --- .../textures/block/terminite_anvil_back.png | Bin 0 -> 343 bytes .../textures/block/terminite_anvil_bottom.png | Bin 0 -> 212 bytes .../textures/block/terminite_anvil_front.png | Bin 0 -> 349 bytes .../textures/block/terminite_anvil_panel.png | Bin 0 -> 329 bytes .../textures/block/terminite_anvil_top_0.png | Bin 0 -> 288 bytes .../textures/block/terminite_anvil_top_1.png | Bin 0 -> 373 bytes .../textures/block/terminite_anvil_top_2.png | Bin 0 -> 417 bytes .../betterend/textures/block/terminite_bars.png | Bin 0 -> 394 bytes .../textures/block/terminite_bars_top.png | Bin 0 -> 217 bytes .../textures/block/terminite_door_bottom.png | Bin 0 -> 407 bytes .../textures/block/terminite_door_side.png | Bin 0 -> 185 bytes .../textures/block/terminite_door_top.png | Bin 0 -> 404 bytes .../textures/block/terminite_trapdoor.png | Bin 0 -> 1648 bytes .../textures/block/thallasium_anvil_top_1.png | Bin 400 -> 382 bytes .../textures/block/thallasium_anvil_top_2.png | Bin 382 -> 400 bytes .../betterend/textures/item/terminite_door.png | Bin 0 -> 1530 bytes 16 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/assets/betterend/textures/block/terminite_anvil_back.png create mode 100644 src/main/resources/assets/betterend/textures/block/terminite_anvil_bottom.png create mode 100644 src/main/resources/assets/betterend/textures/block/terminite_anvil_front.png create mode 100644 src/main/resources/assets/betterend/textures/block/terminite_anvil_panel.png create mode 100644 src/main/resources/assets/betterend/textures/block/terminite_anvil_top_0.png create mode 100644 src/main/resources/assets/betterend/textures/block/terminite_anvil_top_1.png create mode 100644 src/main/resources/assets/betterend/textures/block/terminite_anvil_top_2.png create mode 100644 src/main/resources/assets/betterend/textures/block/terminite_bars.png create mode 100644 src/main/resources/assets/betterend/textures/block/terminite_bars_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/terminite_door_bottom.png create mode 100644 src/main/resources/assets/betterend/textures/block/terminite_door_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/terminite_door_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/terminite_trapdoor.png create mode 100644 src/main/resources/assets/betterend/textures/item/terminite_door.png diff --git a/src/main/resources/assets/betterend/textures/block/terminite_anvil_back.png b/src/main/resources/assets/betterend/textures/block/terminite_anvil_back.png new file mode 100644 index 0000000000000000000000000000000000000000..01a7c6d213404dd3eecf553dca01f805e572e61b GIT binary patch literal 343 zcmV-d0jU0oP)Px$5lKWrR5*>5Q!#GCFbq5zeSmBT0*WpHYQW8&KQu%0l8k*v#{R@hUf{)BhV%nP z0mHEU17(mYQI1?R2N)(P@kpISvetr;9rn&K+6B7aufb^V+xko#e!>!*oGbSMz&Hh4 zlHL(iB~Yl~50m@9ZbB?qKz&{z7$=}murJR500O+tz9&r*%Zwvg95X zku{*tqvf;j-nIaM_WSBO87A1%7bOYq=71~9xk$`Id<3K88DL-9vH;{mGCI8ZVIH1B p#dZRrgRTdf)+O+@Ep7INs5fYma1H0aBa;9C002ovPDHLkV1gp}kNW@s literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/terminite_anvil_bottom.png b/src/main/resources/assets/betterend/textures/block/terminite_anvil_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..2d11b71272dd17ebfb78b1e415a06f10e16c4c51 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|`aE46Lo9la zPVyCUFyL{E?`4*-e#|1~mzJ6NcEz!CI~;X0RO`HQQ?4$njK8GvVY_5~hBUXsJjR66 zNniPueT=uQ`(~Z6`yPXe*E_B@;WH-HDpNNwJI_>I!_pVo{2^?mkOf<7LgdSTtl}z6 z^AaZb_B8yRE!5Gtepvy#y|3e2M;~Q>rugLx%s;B?%>J=oH+ycWlGJT$kh>W?UHx3v IIVCg!0OAr#qyPW_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/terminite_anvil_front.png b/src/main/resources/assets/betterend/textures/block/terminite_anvil_front.png new file mode 100644 index 0000000000000000000000000000000000000000..4140d6e5ae1e3b9b4e7de12d447610f51bb8b97a GIT binary patch literal 349 zcmV-j0iyniP)Px$7fD1xR5*>LlRaw0Fc5`51s_0Ogkaew5W^;Y?y$|?AYBfYE;mS%JETt*b|Fm& z7-Q=ON@0(FEU%kP<6&gIdGF0gspG-(kEpO_%xXP;2NzG5YEmB@v>g?9x1sKLThz~Q z*=D0x81xP{8o%2HkZTdZ`^c!`bOvism+we@TGTfI^*BovpYA7U21)m@;pj_L`pDp4z>y)8Yd&OvC7V@0zjBXcDdGtfiN>s zJwJJB9roh!{sDlGug_@Y;P5Z6ssPB|giw|7ruoD|rjbjq2KG%{C~L}m-(**+knNke vfxSbdWVxIrW=4Qv)E8cw>_VE$e~FoYH{)-whB3Y~00000NkvXXu0mjfEb^9V literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/terminite_anvil_panel.png b/src/main/resources/assets/betterend/textures/block/terminite_anvil_panel.png new file mode 100644 index 0000000000000000000000000000000000000000..9feb81d989aa35a5daab2e34752b0b006082f082 GIT binary patch literal 329 zcmV-P0k-~$P)Px$14%?dR5*>rlf6nqF%-vt5g#DAl!CYvDoBSuK$p%gKCO#y;Ns>Wf`UsaTrSCZ z0^@L!o1_gc9lTSLbN(OaG46W+~2`qiMKZZn8Ojgz+g4;>l?<2 zpQmTj5U^apdZh_~@d80K=B$zg(epTUN^nWl*`nqwalb3~TI{rhIVr0Gal2`O%X zRmVZDH`&Wzb2zpnRe#P1@B+)lIoQi=y#}`>)Sd2ud$GpB>FE9fd+8A5#~^x6_qmaI zj1{;gsFi~z$L*$7%<~UD2Opm$DUHj#z3XBHDe<9Qq|!uymsjodepeg~X$xJo%C+l% b{~Lb+BuaeE>Zc}E00000NkvXXu0mjf>PeEO literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/terminite_anvil_top_0.png b/src/main/resources/assets/betterend/textures/block/terminite_anvil_top_0.png new file mode 100644 index 0000000000000000000000000000000000000000..013f1f7e4042c3d48f325f1753aecb4dfe05a7c9 GIT binary patch literal 288 zcmV+*0pI?KP)Px#+DSw~R5*>Dl06E-KoCaX2HQYbL=aD4;RU>&jb})a&L$VJN|{2i3Wy-GEGz^Y ziPeT={}jJ!Cz&@p^UVq-I=^27K;3Hq+O7jY88hZIWyMgPgpC(C+8+;~G{}Nsvj#xi z?w~ZoZi{$4XZhJQsC%7+L(04_E({}V<7k1l>-?LYVyu?&0@f_I?GaWQQXa@WPs0KE z9uSz>!m{{Yz?*pj+kam>_!S1{At_@#IJLrP2T@q*^crQJkLRe7sWsZfzqg=_Nx~r` mXC^jfg>c)nGheOKP)Px$FG)l}R5*=|lD$g9P#A`vuecV{5CY;-s2~|~0XldG-FinZUPFg$E+t#;AWNoB zQbceHgn&pq5GXEk9MYWpn)chy;d|fn{v4q-$?uN_*c}xBhcpGCC`+@m-v;R5Me6ev zy?JM7MkT8O~TeR;XpI@E*S^Ka%st#D<1j%v(9-GvRY@8Ps7(oS+}?&AnuKrRwz!rZTYS^XjFARat0*<75~>pP(M? zd+5y?38N;Dg$1^Cp1@=P;5wC^&ALPx$TS-JgR5*==lD&$;Koo_)S+*5o5J7AN1xb-^8@Jduu=9*z&aRcI?@?n^d{fhz!ifEM7Pn9 zF`JHze2x^ws3?~ArwpPP>wDPASYSr6bZt6f_S7KFP(fJcO*1ibos!QZ13MYZ3KvW1 zIvk)D%bVgF1D)rn-CoF_Xj|Vy9puk^x<)|6K`6OT!eSzAYHO@-AqY#_X;yY^w*=~= z2tZ~31x#%!rgtOgJTJw&y%g(H4A-fNYZI)dGx>Qg3(p*Gj1TY+t6-PdzHJzM00000 LNkvXXu0mjfAH=iB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/terminite_bars.png b/src/main/resources/assets/betterend/textures/block/terminite_bars.png new file mode 100644 index 0000000000000000000000000000000000000000..33043adeec53ae55e2c3aa3af90ff4737f82c906 GIT binary patch literal 394 zcmV;50d@X~P)Px$L`g(JR5*=wl09yNKoEt$u{eM&A?iqplnbQE323+h9j!~3)Lg@zZ{WsilMnXHx&d-~DPo!&=egJ^WIh^AZ{B+t_@;^VIA3&N~r79JIk1@Gjbr*~O zsqVz(j6Poifb&aY*DB)#&aWHC9KAn;A}3>}jFLxZWR<21!+F#@70QEgF5kM2cMPiU1Tjr}VPYwJNu(&IQp=52p8r@ck7Y zHr+XoNK(dag`lbRaGfI|&EhdEz(y-cNI+&em#Wm6|8WXUqMU89%|G$`v%rmA=ZUd+CGnUe oU8@v%)IpkH8mwZ8GJ6-}Z-xcx28ORqEdT%j07*qoM6N<$f>vX#Gynhq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/terminite_bars_top.png b/src/main/resources/assets/betterend/textures/block/terminite_bars_top.png new file mode 100644 index 0000000000000000000000000000000000000000..814038122bf2cab2c576b2ae6991f25d250c84af GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|CVRR#hFJ6_ zCmdjwh+h5QSk3kS@#Srt^HmPtW#{2pfA2wP(|rad2JW~>N5&?$fHzEk*!KK)SjgDK z#KJsr;>NAN?12h7cnxN=vMPL8ZO+5Zz%$T(J%=c`OW#M@>C9$uV63I*-BA L)z4*}Q$iB}8170n literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/terminite_door_bottom.png b/src/main/resources/assets/betterend/textures/block/terminite_door_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..105806b12df999158f9b9c90c3f538c533ae620f GIT binary patch literal 407 zcmV;I0cie-P)Px$QAtEWR5*=&ld(zzK@f(&J+2ZCjwJ*_Aaz2pimi=etqA%u*7iPuU@iCn5iM*2 znp7#`3xvRNY!>bT&SGyiw;Pjbc6Vm}*_r>}RqFAfzPh;v;Qjf9$=xlBk54d``g8<< zT5rHu&^eRK3l^_$pmUhbNobqS-5P_NSl#cTv&`@5cA^4+&a!>5u|ZDV@1d3}fc*ku z0a$L7SOcagNrLLl{t(#vW!(QpFjaLJY^;m7{D~0ffk(iS>&Gcd*MX@j&u+kSt8F1x zXIbD+FxET8;+y@AF-NpikP&3{;7C%5@7{sV!}*VZ;|_xkWQ_T5qp{9W>y6XgSl|Bn zcpMZ>+Z@#W9%sW53`4>I#)AO>_a`||%av24C`lz@`tuFoK2l61Fm29H%N1;Qk1u6w zJ=jYYOV~ckhii(Y0P1VzoJHvpyB)s=Pymrn><`8uy4V}E+D`xg002ovPDHLkV1hsN Bxhntw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/terminite_door_side.png b/src/main/resources/assets/betterend/textures/block/terminite_door_side.png new file mode 100644 index 0000000000000000000000000000000000000000..4a4bfd7d592f016abeea44564a15fc8301b504a5 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|ialK%Lo9mV zUR=o4U?Af5@Nt)dM9jy=FPb$)8&4h5HRfqi^_?tTo_KM8ee#^!xzGQ}C@O?M5m}ga zds9%)?&5V$Rkth{?E9X%cNIF{XEyNPCzbt}A<65RyvS$M3EE-Fx&PR7r6ZR4?q-{& hopE_x<5R9%dn#Z1e%mUT^$}=2gQu&X%Q~loCIC;?MezUt literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/terminite_door_top.png b/src/main/resources/assets/betterend/textures/block/terminite_door_top.png new file mode 100644 index 0000000000000000000000000000000000000000..ece7d7d0447d73b11b3b90c346b3742db9a0a87a GIT binary patch literal 404 zcmV;F0c-w=P)Px$PDw;TR5*=|ld)>UFcd|POs0ZC5g`x)nPW<}PW_PnMu#qi(y0_mp^)#$Cv@zP zK$}h>q_ZIeLU06ztnMJ|S#}KVTV&nmt9S3Utkm;Efv?QE)#z$}w9=+q;sMqHnBPA# zJ6YCgN?2K*W8zqz0olKQeWE@VL;$ms<>o?jIU4<+yxLR>)@jOY1k>BQN@i#!sA4z} zGW!D^?|Yr5(ACUe-|(sgFI6mmHe8JpzE>M}c)#ZqH0%21$pvUM#c%+C+U`)9g>fRd zS}cjY%q-8rXg9fq>@jb{SJVv5d#{m!Vv^K?RNEc&dqiZmB4_SXHYdx(GB1CqC=d(5 zD&%sq+U~$;>HEW?8fY{oj@!urNqYN3rJ$BU;Q5Rk^qhh)1OGxJKu<0vNlS=f2Emjz y@>vgvINB19KWnhY`2aLI%$;2ZdY|H>*ZdOCb_fenk7vW=+)2#T0tfCY9 zJ#W9~_kVru2YM?W?xQclVp)qXmU{MpLX<*_hkWthCaew(5fh%%=m>dvjK?{Mb z5}nh*;kogIG&e1AGI4MSA1v~SAP-CtFXnTq!50HWjh9DbYndYO8pNCq5J5{IJ|)EQ z5Yz!a;PR3Z<6&_h=VH7x$9np4mS%hu?V}hsNi#g{<=q_KcnBm-m(%=2IMR@XW&t8= zni@}0g+jqqaJ!(Mp%{+iD4L~MmP82BD5<7cBvqrg$q)vHq$`@KKoz$b#T1+|0|e5v zZbDvb(W*wnO~_$XQPe2LMO!A-fU?xWX)}7RCR~;%kOO(3ng+r$EiCeqAhh6*rOoGC zXu}+tMH)41do0>Wlr%t100YkG5*V395__A9X<2AOBMbk*j@EX|8jTO>Ks2GAfH2n# zRJ_T8heB3h{P_M!MU`Q}=(7Yh&VaCJf&jtNEQ3Nux|syc@w5-U2WU4>({-qTQb86? z@yWnYR??;agvt`1hI(E^j#Bbs22h%ssYw$AKBgL`s7fFf4iHFHm!imgT9yFg_cLUQ zPIDyd@eGh6%dw=)akQIG4{$!#*E}DF(u@_v=6U&lo_|$W&?ORcPtVf|5+8y&s0&a= zUUpk4TuUWBsu(CA1e=bM?JW4^1Wd!e`>V>i3>&Q<#u zovHjD>%yjwZ+ZC)wsJSqb>ls+>Qsv!!9T&b^-f{gbeSS7rO|I=f z+qt@+9Pf+VK3VBGw01h#Gp|3}A1@zG{#5xkIdo#U`pxq3ZtSSvvgfBSJ3Tv0 z-;d4QM)h&3-<*$ky7u;+Q1MBxlWMux>rOBr(GShuf2~=r?SE(W9mIqv!GLx#;Sj0y zpl99cAc*Nm2?iW;6DW!4NGa}s*7LSqjHwa~{19T^DrTe-!N3zpzPhMva`%?T$@ifI zgM4OSoP3!|Fi`RI{v!!_Fv*RbV4yPtsXRbUe{+I?AMlxhWR^%bmhtZ&s2gzDLFTbSJ~_z`+wG^#G{(!00000NkvXXu0mjf D4)c^l delta 323 zcmV-J0lfbH0+0icR(~Z)L_t(IPi>OHN&`U4bH=Eq7ybuUbRMG2dXU%7qlz$)Uo190)BM@L05{gi* zuLeOGQXF{%0*XWe)GSima6FFg0PEg1q|eiJBII}k0&SaSB6pF3QXK>W3S^te9gg_wMs7cv7p*cP#vp;nJ V&>&Bl&^`bF002ovPDHLkV1kOzk^=w$ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_anvil_top_2.png b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_top_2.png index 1e212986968b4a229feddff6c524603b174ebe7c..9af873c21f70323ec0c1d4f4350fe883afd0f640 100644 GIT binary patch delta 323 zcmV-J0lfbH0+0icR(~Z)L_t(IPi>OHN&`U4bH=Eq7ybuUbRMG2dXU%7qlz$)Uo190)BM@L05{gi* zuLeOGQXF{%0*XWe)GSima6FFg0PEg1q|eiJBII}k0&SaSB6pF3QXK>W3S^te9gg_wMs7cv7p*cP#vp;nJ V&>&Bl&^`bF002ovPDHLkV1kOzk^=w$ delta 305 zcmV-10nYxA1O5V#R(}&oL_t(IPkocUN&`_4g(pdsC|QV@LbTXIgcPx}^Wl69A0f|? z!dim1TlkA1fr!RNiF}t#ICHt=gJs#tJ?G2}H!TxxUmiBE>pxq3ZtSSvvgfBSJ3Tv0 z-;d4QM)h&3-<*$ky7u;+Q1MBxlWMux>rOBr(GShuf2~=r?SE(W9mIqv!GLx#;Sj0y zpl99cAc*Nm2?iW;6DW!4NGa}s*7LSqjHwa~{19T^DrTe-!N3zpzPhMva`%?T$@ifI zgM4OSoP3!|Fi`RI{v!!_Fv*RbV4yPtsXRbUe{+I?AMlxhWR^%bmhtZ&s2gzDLFTbSJ~_z`+wG^#G{(!00000NkvXXu0mjf D4)c^l diff --git a/src/main/resources/assets/betterend/textures/item/terminite_door.png b/src/main/resources/assets/betterend/textures/item/terminite_door.png new file mode 100644 index 0000000000000000000000000000000000000000..eab163de98f7a18d435465c64cc0483b529f2193 GIT binary patch literal 1530 zcmbVMU1%Id9A8ZvYcG+~fT{Jtb<^VK-p=mcm8uVU2nw~nNX?V95NGdW5vf|cFgstr z`Tf8DXBOt4AKtxxH^*_qrJ_-0^PYI@8f5>+wzd(Q9`uSw1CC3L#N$5h?RWNZ+>R}~ zvJ@_va}ZM}jVxLv>B#XIn&T#>A`jtZ67p42w_RQM?XwF4Z(F)>Bx?fGE0Bg=T=U7| z+I$7CEo03RrY8A`2r>ePgouxvrW?RW7dpIa@!;5(3TSr?{bf&7xWz!#`b_-uMy z#BxUAb6Q#+2bz+3mREqBlR!?ART0P#j6+r9d!N9h`Bn{BecKCd>hduos?wEE7nr796C5w0b%UOp zn8Tz9d6Jw4u}K}Eg%g~&;x{|OEi92HafllR3@ayC<|Wfi;CG~ToCF<&vnQEGJ=^Yx z4l1i2k;){XD?TQ(Cz-^tzG7a3hBRoYlHCZZHC`5M$rj}h>{ZFWc zVU79@Vve#MR40<>);rQn6PDZ{L@p*JLl>B;Y1_779^`7dY}FETSj&rfl+i@Zs^-LM zR?Sp_rR8Nj-hXdUyb=eo|K9qa?_cn3Rz#?I?>tG6V1YKNZ&HhSS&dV;lS;5?2P|Hz zy`oqoCwi-<&3Cc~A{-~UF5oz_#1eYP_C0&1OWSG?M*1(|?!p3E3tPx1({<*>yU8et z=`Y3A*fmA^yOo{0zf^7?&e}n|O!^SpB%O@7tbO^cPaPetTw*=$gOV{_$$yD&Z*NZx z96WtyedhBvs+O*t`u^Pr+}gPQm3Q;Kb1%JeqdvKLHX1&?zOnW2%)XiXkN<=_BvIwYl-Y;K;DK_aawP|5)F3bx1vXVBqUa>gMlzM^l#{f9TrW zC!?=t7cZuM-YJyl_$Quj4^EuAH8{5a#7^PTH<#Nlj({Hz|8heqzV_-D&b2q+z(1JH lO#9p0sXd3TJen^bi+-$ literal 0 HcmV?d00001 From 7b4004721385b58bfe5db67f9f6807214dd8504f Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 31 Jan 2021 14:53:16 +0300 Subject: [PATCH 241/463] Missing tile --- .../ru/betterend/blocks/MissingTileBlock.java | 11 ++++++++++ .../ru/betterend/recipe/CraftingRecipes.java | 7 +++++++ .../java/ru/betterend/registry/EndBlocks.java | 2 ++ .../assets/betterend/lang/en_us.json | 19 +++++++++--------- .../assets/betterend/lang/ru_ru.json | 3 ++- .../betterend/textures/block/missing_tile.png | Bin 0 -> 509 bytes 6 files changed, 32 insertions(+), 10 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/MissingTileBlock.java create mode 100644 src/main/resources/assets/betterend/textures/block/missing_tile.png diff --git a/src/main/java/ru/betterend/blocks/MissingTileBlock.java b/src/main/java/ru/betterend/blocks/MissingTileBlock.java new file mode 100644 index 00000000..1e361549 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/MissingTileBlock.java @@ -0,0 +1,11 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.Blocks; +import ru.betterend.blocks.basis.BlockBase; + +public class MissingTileBlock extends BlockBase { + public MissingTileBlock() { + super(FabricBlockSettings.copyOf(Blocks.END_STONE)); + } +} diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index 972b817a..0dcafc0b 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -171,6 +171,13 @@ public class CraftingRecipes { GridRecipe.make("iron_chandelier", EndBlocks.IRON_CHANDELIER).setShape("I#I", " # ").addMaterial('#', Items.IRON_INGOT).addMaterial('I', EndItems.LUMECORN_ROD).setGroup("end_metal_chandelier").build(); GridRecipe.make("gold_chandelier", EndBlocks.GOLD_CHANDELIER).setShape("I#I", " # ").addMaterial('#', Items.GOLD_INGOT).addMaterial('I', EndItems.LUMECORN_ROD).setGroup("end_metal_chandelier").build(); + + GridRecipe.make("missing_tile", EndBlocks.MISSING_TILE) + .setOutputCount(4) + .setShape("#P", "P#") + .addMaterial('#', EndBlocks.VIOLECITE.stone, EndBlocks.VIOLECITE.bricks, EndBlocks.VIOLECITE.tiles) + .addMaterial('P', Blocks.PURPUR_BLOCK) + .build(); } private static void registerLantern(String name, Block lantern, Block slab) { diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 322357a2..9fa2a9e2 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -61,6 +61,7 @@ import ru.betterend.blocks.LumecornBlock; import ru.betterend.blocks.LumecornSeedBlock; import ru.betterend.blocks.MengerSpongeBlock; import ru.betterend.blocks.MengerSpongeWetBlock; +import ru.betterend.blocks.MissingTileBlock; import ru.betterend.blocks.MossyGlowshroomCapBlock; import ru.betterend.blocks.MossyGlowshroomHymenophoreBlock; import ru.betterend.blocks.MossyGlowshroomSaplingBlock; @@ -135,6 +136,7 @@ public class EndBlocks { public static final StoneMaterial SULPHURIC_ROCK = new StoneMaterial("sulphuric_rock", MaterialColor.BROWN); public static final Block BRIMSTONE = registerBlock("brimstone", new BrimstoneBlock()); public static final Block SULPHUR_CRYSTAL = registerBlock("sulphur_crystal", new SulphurCrystalBlock()); + public static final Block MISSING_TILE = registerBlock("missing_tile", new MissingTileBlock()); public static final Block FLAVOLITE_RUNED = registerBlock("flavolite_runed", new RunedFlavolite()); public static final Block FLAVOLITE_RUNED_ETERNAL = registerBlock("flavolite_runed_eternal", new EternalRunedFlavolite()); diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index e98f0319..955bd1ba 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -78,14 +78,14 @@ "effect.betterend.end_veil": "End Veil", "enchantment.betterend.end_veil": "End Veil", - "item.minecraft.potion.effect.end_veil": "Potion of End Veil", - "item.minecraft.potion.effect.long_end_veil": "Potion of End Veil", - "item.minecraft.splash_potion.effect.end_veil": "Splash potion of End Veil", - "item.minecraft.splash_potion.effect.long_end_veil": "Splash potion of End Veil", - "item.minecraft.lingering_potion.effect.end_veil": "Lingering potion of End Veil", - "item.minecraft.lingering_potion.effect.long_end_veil": "Lingering potion of End Veil", - "item.minecraft.tipped_arrow.effect.end_veil": "Arrow of End Veil", - "item.minecraft.tipped_arrow.effect.long_end_veil": "Arrow of End Veil", + "item.minecraft.potion.effect.end_veil": "Potion Of End Veil", + "item.minecraft.potion.effect.long_end_veil": "Potion Of End Veil", + "item.minecraft.splash_potion.effect.end_veil": "Splash Potion Of End Veil", + "item.minecraft.splash_potion.effect.long_end_veil": "Splash Potion Of End Veil", + "item.minecraft.lingering_potion.effect.end_veil": "Lingering Potion Of End Veil", + "item.minecraft.lingering_potion.effect.long_end_veil": "Lingering Potion Of End Veil", + "item.minecraft.tipped_arrow.effect.end_veil": "ARrow Of End Veil", + "item.minecraft.tipped_arrow.effect.long_end_veil": "ARrow Of End Veil", "block.betterend.mossy_glowshroom_sapling": "Mossy Glowshroom Sapling", "block.betterend.mossy_glowshroom_cap": "Mossy Glowshroom Cap", @@ -656,5 +656,6 @@ "item.betterend.thallasium_chestplate": "Thallasium Chestplate", "item.betterend.thallasium_hammer": "Thallasium Hammer", "item.betterend.thallasium_helmet": "Thallasium Helmet", - "item.betterend.thallasium_leggings": "Thallasium Leggings" + "item.betterend.thallasium_leggings": "Thallasium Leggings", + "block.betterend.missing_tile": "Missing Tile" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 1c20c6fe..8b988c95 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -676,5 +676,6 @@ "item.betterend.thallasium_chestplate": "Талласиевый нагрудник", "item.betterend.thallasium_hammer": "Талласиевый молот", "item.betterend.thallasium_helmet": "Талласиевый шлем", - "item.betterend.thallasium_leggings": "Талласиевые поножи" + "item.betterend.thallasium_leggings": "Талласиевые поножи", + "block.betterend.missing_tile": "Отсутствующая плитка" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/missing_tile.png b/src/main/resources/assets/betterend/textures/block/missing_tile.png new file mode 100644 index 0000000000000000000000000000000000000000..75779b386801c94920a905bdc9df6afea9a21d9b GIT binary patch literal 509 zcmVPx$w@E}nR5*==l0j-4F&Krv%m`-eSh#XJg)w0$4TM7P(;mi`=qa*s50OO{g`S`e zUUW8I3`Q}U*b-3wI5#o|e8jn*2a6k)X1)OF3x<#*Z#gV`D6 zR03dj27uLejnG=NTrQDP#>+woilU%t8rq5B=I0NjI7g131@?ydti;$B0U)KMEK7tC z066EUs*25KGrTO$`SkuHws+)7hRi2iUtDo}e>XS)=(_I34kM=$IhKr)93bxKHssE- z4DUTzmI0uYijK_Qa2Q)`@1jT$79q3up04ZSIZXI4+dGt)0&wVU6c$=*ilU&ZDwI;O z4W(2Rn$JqEFRo%FfXTaIi@L69nuexn@ZLw;-g}HOtkN~cw%p#|4FY3{*$=Laf8^}X zw_i{H_8hFQwrhTW-SQeIqJ4P1=eIZ!q316jK6B_Tqa^1rwp8l!X#0c{=NxI8MovVi z#3OiUmyundqV&kTquaw?h6N=`WuLPVj!NfMN7?-(Wd5Fzwz+nD*3 z4d;#yh1r?^_H6csw>S~2?aQ7|yEgujw>bF=;Hx6uf15EW00000NkvXXu0mjfIXUVe literal 0 HcmV?d00001 From 364382b29b0ce325da10f26f21d47a089e876218 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 31 Jan 2021 16:54:04 +0300 Subject: [PATCH 242/463] Charcoal block & fuel support --- .../java/ru/betterend/blocks/CharcoalBlock.java | 13 +++++++++++++ .../entities/EndStoneSmelterBlockEntity.java | 10 ++++++++-- .../java/ru/betterend/recipe/CraftingRecipes.java | 2 ++ .../java/ru/betterend/registry/EndBlocks.java | 2 ++ .../resources/assets/betterend/lang/en_us.json | 3 ++- .../resources/assets/betterend/lang/ru_ru.json | 3 ++- .../betterend/textures/block/charcoal_block.png | Bin 0 -> 414 bytes 7 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/CharcoalBlock.java create mode 100644 src/main/resources/assets/betterend/textures/block/charcoal_block.png diff --git a/src/main/java/ru/betterend/blocks/CharcoalBlock.java b/src/main/java/ru/betterend/blocks/CharcoalBlock.java new file mode 100644 index 00000000..7097a6e0 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/CharcoalBlock.java @@ -0,0 +1,13 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.registry.FuelRegistry; +import net.minecraft.block.Blocks; +import ru.betterend.blocks.basis.BlockBase; + +public class CharcoalBlock extends BlockBase { + public CharcoalBlock() { + super(FabricBlockSettings.copyOf(Blocks.COAL_BLOCK)); + FuelRegistry.INSTANCE.add(this, 6000); + } +} diff --git a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java index 05020b72..19c6c0ee 100644 --- a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java @@ -9,6 +9,7 @@ import com.google.common.collect.Maps; import it.unimi.dsi.fastutil.objects.Object2IntMap.Entry; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import net.fabricmc.fabric.api.registry.FuelRegistry; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.entity.LockableContainerBlockEntity; @@ -398,7 +399,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp return 0; } Item item = fuel.getItem(); - return AVAILABLE_FUELS.getOrDefault(item, 0); + return AVAILABLE_FUELS.getOrDefault(item, getFabricFuel(fuel)); } @Override @@ -442,7 +443,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp } public static boolean canUseAsFuel(ItemStack stack) { - return AVAILABLE_FUELS.containsKey(stack.getItem()); + return AVAILABLE_FUELS.containsKey(stack.getItem()) || getFabricFuel(stack) > 2000; } public static void registerFuel(ItemConvertible fuel, int time) { @@ -452,4 +453,9 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp public static Map availableFuels() { return AVAILABLE_FUELS; } + + private static int getFabricFuel(ItemStack stack) { + Integer ticks = FuelRegistry.INSTANCE.get(stack.getItem()); + return ticks == null ? 0 : ticks; + } } diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index 0dcafc0b..735c04cb 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -178,6 +178,8 @@ public class CraftingRecipes { .addMaterial('#', EndBlocks.VIOLECITE.stone, EndBlocks.VIOLECITE.bricks, EndBlocks.VIOLECITE.tiles) .addMaterial('P', Blocks.PURPUR_BLOCK) .build(); + + GridRecipe.make("charcoal_block", EndBlocks.CHARCOAL_BLOCK).setShape("###", "###", "###").addMaterial('#', Items.CHARCOAL).build(); } private static void registerLantern(String name, Block lantern, Block slab) { diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 9fa2a9e2..ab9f2e6c 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -21,6 +21,7 @@ import ru.betterend.blocks.BulbVineLanternBlock; import ru.betterend.blocks.BulbVineLanternColoredBlock; import ru.betterend.blocks.BulbVineSeedBlock; import ru.betterend.blocks.ChandelierBlock; +import ru.betterend.blocks.CharcoalBlock; import ru.betterend.blocks.CharniaBlock; import ru.betterend.blocks.ChorusGrassBlock; import ru.betterend.blocks.DenseEmeraldIceBlock; @@ -292,6 +293,7 @@ public class EndBlocks { public static final MetalMaterial THALLASIUM = MetalMaterial.makeNormal("thallasium", MaterialColor.BLUE, EndToolMaterial.THALLASIUM, EndArmorMaterial.TERMINITE); public static final MetalMaterial TERMINITE = MetalMaterial.makeOreless("terminite", MaterialColor.field_25708, 7F, 9F, EndToolMaterial.TERMINITE, EndArmorMaterial.TERMINITE); public static final Block AETERNIUM_BLOCK = registerBlock("aeternium_block", new AeterniumBlock()); + public static final Block CHARCOAL_BLOCK = registerBlock("charcoal_block", new CharcoalBlock()); public static final Block ENDER_BLOCK = registerBlock("ender_block", new EnderBlock()); public static final Block AURORA_CRYSTAL = registerBlock("aurora_crystal", new AuroraCrystalBlock()); diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 955bd1ba..b03141fb 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -657,5 +657,6 @@ "item.betterend.thallasium_hammer": "Thallasium Hammer", "item.betterend.thallasium_helmet": "Thallasium Helmet", "item.betterend.thallasium_leggings": "Thallasium Leggings", - "block.betterend.missing_tile": "Missing Tile" + "block.betterend.missing_tile": "Missing Tile", + "block.betterend.charcoal_block": "Charcoal Block" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 8b988c95..f7fd144f 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -677,5 +677,6 @@ "item.betterend.thallasium_hammer": "Талласиевый молот", "item.betterend.thallasium_helmet": "Талласиевый шлем", "item.betterend.thallasium_leggings": "Талласиевые поножи", - "block.betterend.missing_tile": "Отсутствующая плитка" + "block.betterend.missing_tile": "Отсутствующая плитка", + "block.betterend.charcoal_block": "Блок древесного угля" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/charcoal_block.png b/src/main/resources/assets/betterend/textures/block/charcoal_block.png new file mode 100644 index 0000000000000000000000000000000000000000..b86c8eaebfa855c03789e8b9ba74061261d056c6 GIT binary patch literal 414 zcmV;P0b%}$P)Px$SV=@dR5*=wQo(A%KolJ1Z8i-t7>U?Q#e@ImvZDIsyq!y@OCTf%IaC z7u*jQSyG`vp*`!R#5q0t3uH;fy2=DNlxoe*Gmp=&of1gm1gZbozH7qG`^aqlski$Z zel2^+L?Wsq- z-D{k7m`2w}EnYdDU`&JF-ak-p_vrfg048JCM-+L6#eAmE6N0$a_JQ-;$n2&ELyQ>P z$U=Kkce!XWpJDyFz-IlTta;{j(P*=NzEZNSuq~GD0hy`l8;F$h+ufweNB{r;07*qo IM6N<$f Date: Sun, 31 Jan 2021 17:29:56 +0300 Subject: [PATCH 243/463] Furnaces prototypes --- .../blocks/basis/EndFurnaceBlock.java | 65 +++++++++++++++++++ .../blocks/complex/StoneMaterial.java | 4 ++ .../blocks/entities/EFurnaceBlockEntity.java | 24 +++++++ .../java/ru/betterend/patterns/Patterns.java | 2 + .../ru/betterend/recipe/CraftingRecipes.java | 7 +- .../betterend/registry/EndBlockEntities.java | 17 +++++ .../java/ru/betterend/registry/EndBlocks.java | 2 + .../betterend/patterns/block/furnace.json | 9 +++ .../patterns/blockstate/furnace.json | 34 ++++++++++ 9 files changed, 161 insertions(+), 3 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java create mode 100644 src/main/java/ru/betterend/blocks/entities/EFurnaceBlockEntity.java create mode 100644 src/main/resources/assets/betterend/patterns/block/furnace.json create mode 100644 src/main/resources/assets/betterend/patterns/blockstate/furnace.json diff --git a/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java b/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java new file mode 100644 index 00000000..c75e50dd --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java @@ -0,0 +1,65 @@ +package ru.betterend.blocks.basis; + +import java.io.Reader; +import java.util.Map; + +import com.google.common.collect.Maps; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.Block; +import net.minecraft.block.FurnaceBlock; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.screen.NamedScreenHandlerFactory; +import net.minecraft.stat.Stats; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.registry.Registry; +import net.minecraft.world.BlockView; +import net.minecraft.world.World; +import ru.betterend.blocks.entities.EFurnaceBlockEntity; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; + +public class EndFurnaceBlock extends FurnaceBlock implements BlockPatterned { + public EndFurnaceBlock(Block source) { + super(FabricBlockSettings.copyOf(source)); + } + + @Override + public BlockEntity createBlockEntity(BlockView world) { + return new EFurnaceBlockEntity(); + } + + @Override + protected void openScreen(World world, BlockPos pos, PlayerEntity player) { + BlockEntity blockEntity = world.getBlockEntity(pos); + if (blockEntity instanceof EFurnaceBlockEntity) { + player.openHandledScreen((NamedScreenHandlerFactory) blockEntity); + player.incrementStat(Stats.INTERACT_WITH_FURNACE); + } + } + + @Override + public String getStatesPattern(Reader data) { + Identifier blockId = Registry.BLOCK.getId(this); + return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); + } + + @Override + public String getModelPattern(String block) { + String add = block.contains("_on") ? "_on" : ""; + Identifier blockId = Registry.BLOCK.getId(this); + Map map = Maps.newHashMap(); + map.put("%top%", blockId.getPath() + "_top"); + map.put("%front%", blockId.getPath() + "_front" + add); + map.put("%side%", blockId.getPath() + "_side"); + map.put("%bottom%", blockId.getPath() + "_bottom"); + return Patterns.createJson(Patterns.BLOCK_FURNACE, map); + } + + @Override + public Identifier statePatternId() { + return Patterns.STATE_FURNACE; + } +} diff --git a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java index d4b4cefe..b98fcd97 100644 --- a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java @@ -8,6 +8,7 @@ import net.minecraft.tag.BlockTags; import net.minecraft.tag.ItemTags; import ru.betterend.blocks.EndPedestal; import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.EndFurnaceBlock; import ru.betterend.blocks.basis.EndPillarBlock; import ru.betterend.blocks.basis.EndSlabBlock; import ru.betterend.blocks.basis.EndStairsBlock; @@ -40,6 +41,7 @@ public class StoneMaterial { public final Block brick_stairs; public final Block brick_slab; public final Block brick_wall; + public final Block furnace; public StoneMaterial(String name, MaterialColor color) { FabricBlockSettings material = FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color); @@ -60,6 +62,7 @@ public class StoneMaterial { brick_stairs = EndBlocks.registerBlock(name + "_bricks_stairs", new EndStairsBlock(bricks)); brick_slab = EndBlocks.registerBlock(name + "_bricks_slab", new EndSlabBlock(bricks)); brick_wall = EndBlocks.registerBlock(name + "_bricks_wall", new EndWallBlock(bricks)); + furnace = EndBlocks.registerBlock(name + "_furnace", new EndFurnaceBlock(bricks)); // Recipes // GridRecipe.make(name + "_bricks", bricks).setOutputCount(4).setShape("##", "##").addMaterial('#', stone).setGroup("end_bricks").build(); @@ -78,6 +81,7 @@ public class StoneMaterial { GridRecipe.make(name + "_button", button).setList("#").addMaterial('#', stone).setGroup("end_stone_buttons").build(); GridRecipe.make(name + "_pressure_plate", pressure_plate).setShape("##").addMaterial('#', stone).setGroup("end_stone_plates").build(); GridRecipe.make(name + "_lantern", lantern).setShape("S", "#", "S").addMaterial('#', EndItems.CRYSTAL_SHARDS).addMaterial('S', slab, brick_slab).setGroup("end_stone_lanterns").build(); + GridRecipe.make(name + "_furnace", furnace).setShape("###", "# #", "###").addMaterial('#', stone).setGroup("end_stone_furnaces").build(); CraftingRecipes.registerPedestal(name + "_pedestal", pedestal, slab, pillar); diff --git a/src/main/java/ru/betterend/blocks/entities/EFurnaceBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EFurnaceBlockEntity.java new file mode 100644 index 00000000..8537ae9d --- /dev/null +++ b/src/main/java/ru/betterend/blocks/entities/EFurnaceBlockEntity.java @@ -0,0 +1,24 @@ +package ru.betterend.blocks.entities; + +import net.minecraft.block.entity.AbstractFurnaceBlockEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.recipe.RecipeType; +import net.minecraft.screen.FurnaceScreenHandler; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.text.Text; +import net.minecraft.text.TranslatableText; +import ru.betterend.registry.EndBlockEntities; + +public class EFurnaceBlockEntity extends AbstractFurnaceBlockEntity { + public EFurnaceBlockEntity() { + super(EndBlockEntities.FURNACE, RecipeType.SMELTING); + } + + protected Text getContainerName() { + return new TranslatableText("container.furnace"); + } + + protected ScreenHandler createScreenHandler(int syncId, PlayerInventory playerInventory) { + return new FurnaceScreenHandler(syncId, playerInventory, this, this.propertyDelegate); + } +} diff --git a/src/main/java/ru/betterend/patterns/Patterns.java b/src/main/java/ru/betterend/patterns/Patterns.java index daf238d2..6c4cfbcb 100644 --- a/src/main/java/ru/betterend/patterns/Patterns.java +++ b/src/main/java/ru/betterend/patterns/Patterns.java @@ -43,6 +43,7 @@ public class Patterns { public final static Identifier STATE_ANVIL = BetterEnd.makeID("patterns/blockstate/anvil.json"); public final static Identifier STATE_CHAIN = BetterEnd.makeID("patterns/blockstate/chain.json"); public final static Identifier STATE_CHANDELIER = BetterEnd.makeID("patterns/blockstate/chandelier.json"); + public final static Identifier STATE_FURNACE = BetterEnd.makeID("patterns/blockstate/furnace.json"); //Models Block public final static Identifier BLOCK_EMPTY = BetterEnd.makeID("patterns/block/empty.json"); @@ -96,6 +97,7 @@ public class Patterns { public final static Identifier BLOCK_CHANDELIER_FLOOR = BetterEnd.makeID("patterns/block/chandelier_floor.json"); public final static Identifier BLOCK_CHANDELIER_WALL = BetterEnd.makeID("patterns/block/chandelier_wall.json"); public final static Identifier BLOCK_CHANDELIER_CEIL = BetterEnd.makeID("patterns/block/chandelier_ceil.json"); + public final static Identifier BLOCK_FURNACE = BetterEnd.makeID("patterns/block/furnace.json"); //Models Item public final static Identifier ITEM_WALL = BetterEnd.makeID("patterns/item/pattern_wall.json"); diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index 735c04cb..5719d280 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -25,11 +25,11 @@ public class CraftingRecipes { .build(); } - GridRecipe.make("ender_pearl_to_block", EndBlocks.ENDER_BLOCK) + GridRecipe.make("ender_shards_to_block", EndBlocks.ENDER_BLOCK) .setShape("OO", "OO") - .addMaterial('O', Items.ENDER_PEARL) + .addMaterial('O', EndItems.ENDER_SHARD) .build(); - GridRecipe.make("ender_block_to_pearl", Items.ENDER_PEARL) + GridRecipe.make("ender_block_to_shards", EndItems.ENDER_SHARD) .addMaterial('#', EndBlocks.ENDER_BLOCK) .setOutputCount(4) .setList("#") @@ -180,6 +180,7 @@ public class CraftingRecipes { .build(); GridRecipe.make("charcoal_block", EndBlocks.CHARCOAL_BLOCK).setShape("###", "###", "###").addMaterial('#', Items.CHARCOAL).build(); + GridRecipe.make("end_stone_furnace", EndBlocks.END_STONE_FURNACE).setShape("###", "# #", "###").addMaterial('#', Blocks.END_STONE).build(); } private static void registerLantern(String name, Block lantern, Block slab) { diff --git a/src/main/java/ru/betterend/registry/EndBlockEntities.java b/src/main/java/ru/betterend/registry/EndBlockEntities.java index c3e6d87b..6b74d82c 100644 --- a/src/main/java/ru/betterend/registry/EndBlockEntities.java +++ b/src/main/java/ru/betterend/registry/EndBlockEntities.java @@ -15,11 +15,13 @@ import ru.betterend.blocks.EternalPedestal; import ru.betterend.blocks.InfusionPedestal; import ru.betterend.blocks.basis.EndBarrelBlock; import ru.betterend.blocks.basis.EndChestBlock; +import ru.betterend.blocks.basis.EndFurnaceBlock; import ru.betterend.blocks.basis.EndSignBlock; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.entities.BlockEntityHydrothermalVent; import ru.betterend.blocks.entities.EBarrelBlockEntity; import ru.betterend.blocks.entities.EChestBlockEntity; +import ru.betterend.blocks.entities.EFurnaceBlockEntity; import ru.betterend.blocks.entities.ESignBlockEntity; import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; import ru.betterend.blocks.entities.EternalPedestalEntity; @@ -43,6 +45,8 @@ public class EndBlockEntities { BlockEntityType.Builder.create(ESignBlockEntity::new, getSigns())); public final static BlockEntityType HYDROTHERMAL_VENT = registerBlockEntity("hydrother_malvent", BlockEntityType.Builder.create(BlockEntityHydrothermalVent::new, EndBlocks.HYDROTHERMAL_VENT)); + public static final BlockEntityType FURNACE = registerBlockEntity("furnace", + BlockEntityType.Builder.create(EFurnaceBlockEntity::new, getFurnaces())); public static BlockEntityType registerBlockEntity(String id, BlockEntityType.Builder builder) { return Registry.register(Registry.BLOCK_ENTITY_TYPE, BetterEnd.makeID(id), builder.build(null)); @@ -103,4 +107,17 @@ public class EndBlockEntities { }); return result.toArray(new Block[] {}); } + + static Block[] getFurnaces() { + List result = Lists.newArrayList(); + EndItems.getModBlocks().forEach((item) -> { + if (item instanceof BlockItem) { + Block block = ((BlockItem) item).getBlock(); + if (block instanceof EndFurnaceBlock) { + result.add(block); + } + } + }); + return result.toArray(new Block[] {}); + } } diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index ab9f2e6c..58dbc930 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -90,6 +90,7 @@ import ru.betterend.blocks.UmbrellaTreeMembraneBlock; import ru.betterend.blocks.UmbrellaTreeSaplingBlock; import ru.betterend.blocks.VentBubbleColumnBlock; import ru.betterend.blocks.basis.EndCropBlock; +import ru.betterend.blocks.basis.EndFurnaceBlock; import ru.betterend.blocks.basis.EndLeavesBlock; import ru.betterend.blocks.basis.EndOreBlock; import ru.betterend.blocks.basis.EndUnderwaterWallPlantBlock; @@ -317,6 +318,7 @@ public class EndBlocks { public static final Block GOLD_CHANDELIER = EndBlocks.registerBlock("gold_chandelier", new ChandelierBlock(Blocks.GOLD_BLOCK)); // Blocks With Entity // + public static final Block END_STONE_FURNACE = registerBlock("end_stone_furnace", new EndFurnaceBlock(Blocks.END_STONE)); public static final Block END_STONE_SMELTER = registerBlock("end_stone_smelter", new EndStoneSmelter()); public static final Block ETERNAL_PEDESTAL = registerBlock("eternal_pedestal", new EternalPedestal()); public static final Block INFUSION_PEDESTAL = registerBlock("infusion_pedestal", new InfusionPedestal()); diff --git a/src/main/resources/assets/betterend/patterns/block/furnace.json b/src/main/resources/assets/betterend/patterns/block/furnace.json new file mode 100644 index 00000000..3824c3a0 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/furnace.json @@ -0,0 +1,9 @@ +{ + "parent": "minecraft:block/orientable_with_bottom", + "textures": { + "top": "minecraft:block/%top%", + "front": "minecraft:block/%front%", + "side": "minecraft:block/%side%" + "bottom": "minecraft:block/%bottom%" + } +} diff --git a/src/main/resources/assets/betterend/patterns/blockstate/furnace.json b/src/main/resources/assets/betterend/patterns/blockstate/furnace.json new file mode 100644 index 00000000..84d508df --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/blockstate/furnace.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,lit=false": { + "model": "betterend:pattern/%block%/%block%", + "y": 90 + }, + "facing=east,lit=true": { + "model": "betterend:pattern/%block%/%block%_on", + "y": 90 + }, + "facing=north,lit=false": { + "model": "betterend:pattern/%block%/%block%" + }, + "facing=north,lit=true": { + "model": "betterend:pattern/%block%/%block%_on" + }, + "facing=south,lit=false": { + "model": "betterend:pattern/%block%/%block%", + "y": 180 + }, + "facing=south,lit=true": { + "model": "betterend:pattern/%block%/%block%_on", + "y": 180 + }, + "facing=west,lit=false": { + "model": "betterend:pattern/%block%/%block%", + "y": 270 + }, + "facing=west,lit=true": { + "model": "betterend:pattern/%block%/%block%_on", + "y": 270 + } + } +} From 68636e2ecd5411aa7f9412eb0d7139af31260380 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sun, 31 Jan 2021 17:35:11 +0300 Subject: [PATCH 244/463] - Got all hammers back - Added anvil level and recipe input count --- .../betterend/blocks/basis/EndAnvilBlock.java | 4 + .../integration/rei/REIAnvilCategory.java | 5 +- .../integration/rei/REIAnvilDisplay.java | 10 ++- .../mixin/common/AnvilScreenHandlerMixin.java | 26 ++++-- .../ru/betterend/recipe/AnvilRecipes.java | 16 ++-- .../ru/betterend/recipe/CraftingRecipes.java | 33 +++++--- .../ru/betterend/recipe/SmithingRecipes.java | 7 ++ .../recipe/builders/AnvilRecipe.java | 78 +++++++++++++----- .../java/ru/betterend/registry/EndItems.java | 18 ++-- .../java/ru/betterend/registry/EndTags.java | 40 ++++----- .../betterend/models/item/diamond_hammer.json | 6 ++ .../betterend/models/item/golden_hammer.json | 6 ++ .../betterend/models/item/iron_hammer.json | 6 ++ .../models/item/netherite_hammer.json | 6 ++ .../textures/item/diamond_hammer.png | Bin 0 -> 279 bytes .../betterend/textures/item/golden_hammer.png | Bin 0 -> 316 bytes .../betterend/textures/item/iron_hammer.png | Bin 0 -> 225 bytes .../textures/item/netherite_hammer.png | Bin 0 -> 230 bytes 18 files changed, 176 insertions(+), 85 deletions(-) create mode 100644 src/main/resources/assets/betterend/models/item/diamond_hammer.json create mode 100644 src/main/resources/assets/betterend/models/item/golden_hammer.json create mode 100644 src/main/resources/assets/betterend/models/item/iron_hammer.json create mode 100644 src/main/resources/assets/betterend/models/item/netherite_hammer.json create mode 100644 src/main/resources/assets/betterend/textures/item/diamond_hammer.png create mode 100644 src/main/resources/assets/betterend/textures/item/golden_hammer.png create mode 100644 src/main/resources/assets/betterend/textures/item/iron_hammer.png create mode 100644 src/main/resources/assets/betterend/textures/item/netherite_hammer.png diff --git a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java index 6e06f0cf..105b1a1c 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java @@ -35,6 +35,10 @@ public class EndAnvilBlock extends AnvilBlock implements BlockPatterned { super.appendProperties(builder); builder.add(DESTRUCTION); } + + public int getCraftingLevel() { + return 1; + } @Override public List getDroppedStacks(BlockState state, LootContext.Builder builder) { diff --git a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java index 9dfe08c1..539b00ed 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java @@ -2,6 +2,7 @@ package ru.betterend.integration.rei; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; import org.jetbrains.annotations.NotNull; @@ -49,10 +50,12 @@ public class REIAnvilCategory implements TransferRecipeCategory int y = startPoint.y; widgets.add(Widgets.createResultSlotBackground(new Point(x + 61, y + 4))); List> inputEntries = display.getInputEntries(); + List materials = inputEntries.get(1); + materials.forEach(entryStack -> entryStack.setAmount(display.getInputCount())); widgets.add(Widgets.createArrow(new Point(x + 24, y + 3))); widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width - 5, bounds.y + bounds.height - 12), new TranslatableText("category.rei.damage.amount&dmg", display.getDamage())).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); - widgets.add(Widgets.createSlot(new Point(x - 20, y + 3)).entries(inputEntries.get(1)).markInput()); + widgets.add(Widgets.createSlot(new Point(x - 20, y + 3)).entries(materials).markInput()); widgets.add(Widgets.createSlot(new Point(x + 1, y + 3)).entries(inputEntries.get(0)).markInput()); widgets.add(Widgets.createSlot(new Point(x + 61, y + 4)).entries(display.getResultingEntries().get(0)).disableBackground().markOutput()); return widgets; diff --git a/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java b/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java index 07618850..518bfcfe 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java @@ -16,9 +16,9 @@ import ru.betterend.recipe.builders.AnvilRecipe; public class REIAnvilDisplay implements TransferRecipeDisplay { - private AnvilRecipe recipe; - private List> input; - private List output; + private final AnvilRecipe recipe; + private final List> input; + private final List output; public REIAnvilDisplay(AnvilRecipe recipe) { this.recipe = recipe; @@ -29,6 +29,10 @@ public class REIAnvilDisplay implements TransferRecipeDisplay { public int getDamage() { return this.recipe.getDamage(); } + + public int getInputCount() { + return this.recipe.getInputCount(); + } @Override public @NotNull Optional getRecipeLocation() { diff --git a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java index 4367431d..57579dc8 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java @@ -2,7 +2,9 @@ package ru.betterend.mixin.common; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; +import net.minecraft.block.Block; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -21,6 +23,7 @@ import net.minecraft.screen.ForgingScreenHandler; import net.minecraft.screen.ScreenHandlerContext; import net.minecraft.screen.ScreenHandlerType; import net.minecraft.tag.BlockTags; +import ru.betterend.blocks.basis.EndAnvilBlock; import ru.betterend.interfaces.AnvilScreenHandlerExtended; import ru.betterend.recipe.builders.AnvilRecipe; @@ -48,7 +51,7 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler imple @Inject(method = "onTakeOutput", at = @At("HEAD"), cancellable = true) protected void be_onTakeOutput(PlayerEntity player, ItemStack stack, CallbackInfoReturnable info) { if (be_currentRecipe != null) { - this.input.getStack(0).decrement(1); + this.input.getStack(0).decrement(be_currentRecipe.getInputCount()); stack = be_currentRecipe.craft(input, player); this.onContentChanged(input); this.context.run((world, blockPos) -> { @@ -75,11 +78,24 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler imple RecipeManager recipeManager = this.player.world.getRecipeManager(); this.be_recipes = recipeManager.getAllMatches(AnvilRecipe.TYPE, input, player.world); if (be_recipes.size() > 0) { - if (be_currentRecipe == null || !be_recipes.contains(be_currentRecipe)) { - this.be_currentRecipe = be_recipes.get(0); + this.context.run((world, blockPos) -> { + int anvilLevel; + Block anvilBlock = world.getBlockState(blockPos).getBlock(); + if (anvilBlock instanceof EndAnvilBlock) { + anvilLevel = ((EndAnvilBlock) anvilBlock).getCraftingLevel(); + } else { + anvilLevel = 1; + } + this.be_recipes = be_recipes.stream().filter(recipe -> + anvilLevel >= recipe.getAnvilLevel()).collect(Collectors.toList()); + }); + if (be_recipes.size() > 0) { + if (be_currentRecipe == null || !be_recipes.contains(be_currentRecipe)) { + this.be_currentRecipe = be_recipes.get(0); + } + this.be_updateResult(); + info.cancel(); } - this.be_updateResult(); - info.cancel(); } } diff --git a/src/main/java/ru/betterend/recipe/AnvilRecipes.java b/src/main/java/ru/betterend/recipe/AnvilRecipes.java index 40b8498c..3df5e7ee 100644 --- a/src/main/java/ru/betterend/recipe/AnvilRecipes.java +++ b/src/main/java/ru/betterend/recipe/AnvilRecipes.java @@ -9,50 +9,50 @@ public class AnvilRecipes { AnvilRecipe.Builder.create("ender_pearl_to_dust") .setInput(Items.ENDER_PEARL) .setOutput(EndItems.ENDER_DUST) - .setLevel(4) + .setToolLevel(4) .setDamage(5) .build(); AnvilRecipe.Builder.create("ender_shard_to_dust") .setInput(EndItems.ENDER_SHARD) .setOutput(EndItems.ENDER_DUST) - .setLevel(0) + .setToolLevel(0) .setDamage(3) .build(); AnvilRecipe.Builder.create("aeternium_axe_head") .setInput(EndItems.AETERNIUM_INGOT) .setOutput(EndItems.AETERNIUM_AXE_HEAD) - .setLevel(4) + .setToolLevel(4) .setDamage(6) .build(); AnvilRecipe.Builder.create("aeternium_pickaxe_head") .setInput(EndItems.AETERNIUM_INGOT) .setOutput(EndItems.AETERNIUM_PICKAXE_HEAD) - .setLevel(4) + .setToolLevel(4) .setDamage(6) .build(); AnvilRecipe.Builder.create("aeternium_shovel_head") .setInput(EndItems.AETERNIUM_INGOT) .setOutput(EndItems.AETERNIUM_SHOVEL_HEAD) - .setLevel(4) + .setToolLevel(4) .setDamage(6) .build(); AnvilRecipe.Builder.create("aeternium_hoe_head") .setInput(EndItems.AETERNIUM_INGOT) .setOutput(EndItems.AETERNIUM_HOE_HEAD) - .setLevel(4) + .setToolLevel(4) .setDamage(6) .build(); AnvilRecipe.Builder.create("aeternium_hammer_head") .setInput(EndItems.AETERNIUM_INGOT) .setOutput(EndItems.AETERNIUM_HAMMER_HEAD) - .setLevel(4) + .setToolLevel(4) .setDamage(6) .build(); AnvilRecipe.Builder.create("aeternium_sword_blade") .setInput(EndItems.AETERNIUM_INGOT) .setOutput(EndItems.AETERNIUM_SWORD_BLADE) - .setLevel(4) + .setToolLevel(4) .setDamage(6) .build(); } diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index 0dcafc0b..96e91f06 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -2,6 +2,7 @@ package ru.betterend.recipe; import net.minecraft.block.Block; import net.minecraft.block.Blocks; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.potion.PotionUtil; @@ -163,21 +164,25 @@ public class CraftingRecipes { GridRecipe.make("fiber_string", Items.STRING).setOutputCount(6).setShape("#", "#", "#").addMaterial('#', EndItems.SILK_FIBER).build(); GridRecipe.make("ender_eye_amber", Items.ENDER_EYE) - .setShape("SAS", "APA", "SAS") - .addMaterial('S', EndItems.CRYSTAL_SHARDS) - .addMaterial('A', EndItems.AMBER_GEM) - .addMaterial('P', Items.ENDER_PEARL) - .build(); + .setShape("SAS", "APA", "SAS") + .addMaterial('S', EndItems.CRYSTAL_SHARDS) + .addMaterial('A', EndItems.AMBER_GEM) + .addMaterial('P', Items.ENDER_PEARL) + .build(); GridRecipe.make("iron_chandelier", EndBlocks.IRON_CHANDELIER).setShape("I#I", " # ").addMaterial('#', Items.IRON_INGOT).addMaterial('I', EndItems.LUMECORN_ROD).setGroup("end_metal_chandelier").build(); GridRecipe.make("gold_chandelier", EndBlocks.GOLD_CHANDELIER).setShape("I#I", " # ").addMaterial('#', Items.GOLD_INGOT).addMaterial('I', EndItems.LUMECORN_ROD).setGroup("end_metal_chandelier").build(); GridRecipe.make("missing_tile", EndBlocks.MISSING_TILE) - .setOutputCount(4) - .setShape("#P", "P#") - .addMaterial('#', EndBlocks.VIOLECITE.stone, EndBlocks.VIOLECITE.bricks, EndBlocks.VIOLECITE.tiles) - .addMaterial('P', Blocks.PURPUR_BLOCK) - .build(); + .setOutputCount(4) + .setShape("#P", "P#") + .addMaterial('#', EndBlocks.VIOLECITE.stone, EndBlocks.VIOLECITE.bricks, EndBlocks.VIOLECITE.tiles) + .addMaterial('P', Blocks.PURPUR_BLOCK) + .build(); + + registerHammer("iron", Items.IRON_INGOT, EndItems.IRON_HAMMER); + registerHammer("golden", Items.GOLD_INGOT, EndItems.GOLDEN_HAMMER); + registerHammer("diamond", Items.DIAMOND, EndItems.DIAMOND_HAMMER); } private static void registerLantern(String name, Block lantern, Block slab) { @@ -197,4 +202,12 @@ public class CraftingRecipes { .setOutputCount(2) .build(); } + + private static void registerHammer(String name, Item material, Item result) { + GridRecipe.make(name + "_hammer", result) + .setShape("I I", "I#I", " # ") + .addMaterial('I', material) + .addMaterial('#', Items.STICK) + .build(); + } } diff --git a/src/main/java/ru/betterend/recipe/SmithingRecipes.java b/src/main/java/ru/betterend/recipe/SmithingRecipes.java index b3774481..1fb36947 100644 --- a/src/main/java/ru/betterend/recipe/SmithingRecipes.java +++ b/src/main/java/ru/betterend/recipe/SmithingRecipes.java @@ -1,5 +1,6 @@ package ru.betterend.recipe; +import net.minecraft.item.Items; import ru.betterend.recipe.builders.SmithingTableRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; @@ -43,6 +44,12 @@ public class SmithingRecipes { .setBase(EndItems.AETERNIUM_HAMMER_HEAD) .setAddition(EndItems.LEATHER_WRAPPED_STICK) .build(); + + SmithingTableRecipe.create("netherite_hammer") + .setResult(EndItems.NETHERITE_HAMMER) + .setBase(EndItems.DIAMOND_HAMMER) + .setAddition(Items.NETHERITE_INGOT) + .build(); SmithingTableRecipe.create("aeternium_helmet") .setResult(EndItems.AETERNIUM_HELMET) diff --git a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java index 602ad83e..24aa4047 100644 --- a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java @@ -41,13 +41,17 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { private final Ingredient input; private final ItemStack output; private final int damage; - private final int level; + private final int toolLevel; + private final int anvilLevel; + private final int inputCount; - public AnvilRecipe(Identifier identifier, Ingredient input, ItemStack output, int level, int damage) { + public AnvilRecipe(Identifier identifier, Ingredient input, ItemStack output, int inputCount, int toolLevel, int anvilLevel, int damage) { this.id = identifier; this.input = input; this.output = output; - this.level = level; + this.toolLevel = toolLevel; + this.anvilLevel = anvilLevel; + this.inputCount = inputCount; this.damage = damage; } @@ -75,9 +79,8 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { if (!player.isCreative()) { if (!checkHammerDurability(craftingInventory, player)) return ItemStack.EMPTY; ItemStack hammer = craftingInventory.getStack(1); - hammer.damage(this.damage, player, entity -> { - entity.sendEquipmentBreakStatus(null); - }); + hammer.damage(this.damage, player, entity -> + entity.sendEquipmentBreakStatus(null)); } return this.craft(craftingInventory); } @@ -94,20 +97,31 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { if (hammer.isEmpty() || !EndTags.HAMMERS.contains(hammer.getItem())) { return false; } + ItemStack material = craftingInventory.getStack(0); + int materialCount = material.getCount(); int level = ((ToolItem) hammer.getItem()).getMaterial().getMiningLevel(); - return level >= this.level && this.input.test(craftingInventory.getStack(0)); + return this.input.test(craftingInventory.getStack(0)) && + materialCount >= this.inputCount && + level >= this.toolLevel; } public int getDamage() { return this.damage; } + public int getInputCount() { + return this.inputCount; + } + + public int getAnvilLevel() { + return this.anvilLevel; + } + @Override public DefaultedList getPreviewInputs() { DefaultedList defaultedList = DefaultedList.of(); - defaultedList.add(Ingredient.ofStacks(EndTags.HAMMERS.values().stream().filter(hammer -> { - return ((ToolItem) hammer).getMaterial().getMiningLevel() >= level; - }).map(ItemStack::new))); + defaultedList.add(Ingredient.ofStacks(EndTags.HAMMERS.values().stream().filter(hammer -> + ((ToolItem) hammer).getMaterial().getMiningLevel() >= toolLevel).map(ItemStack::new))); defaultedList.add(input); return defaultedList; @@ -139,12 +153,12 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; AnvilRecipe that = (AnvilRecipe) o; - return damage == that.damage && level == that.level && id.equals(that.id) && input.equals(that.input) && output.equals(that.output); + return damage == that.damage && toolLevel == that.toolLevel && id.equals(that.id) && input.equals(that.input) && output.equals(that.output); } @Override public int hashCode() { - return Objects.hash(id, input, output, damage, level); + return Objects.hash(id, input, output, damage, toolLevel); } public static class Builder { @@ -158,7 +172,9 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { INSTANCE.id = id; INSTANCE.input = null; INSTANCE.output = null; - INSTANCE.level = 1; + INSTANCE.inputCount = 1; + INSTANCE.toolLevel = 1; + INSTANCE.anvilLevel = 1; INSTANCE.damage = 1; INSTANCE.alright = true; @@ -168,7 +184,9 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { private Identifier id; private Ingredient input; private ItemStack output; - private int level = 1; + private int inputCount = 1; + private int toolLevel = 1; + private int anvilLevel = 1; private int damage = 1; private boolean alright; @@ -189,6 +207,11 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { this.input = ingredient; return this; } + + public Builder setInputCount(int count) { + this.inputCount = count; + return this; + } public Builder setOutput(ItemConvertible output) { return this.setOutput(output, 1); @@ -200,8 +223,13 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { return this; } - public Builder setLevel(int level) { - this.level = level; + public Builder setToolLevel(int level) { + this.toolLevel = level; + return this; + } + + public Builder setAnvilLevel(int level) { + this.anvilLevel = level; return this; } @@ -228,7 +256,7 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { BetterEnd.LOGGER.debug("Can't add Anvil recipe {}! Ingeredient or output not exists.", id); return; } - EndRecipeManager.addRecipe(TYPE, new AnvilRecipe(id, input, output, level, damage)); + EndRecipeManager.addRecipe(TYPE, new AnvilRecipe(id, input, output, inputCount, toolLevel, anvilLevel, damage)); } } } @@ -242,27 +270,33 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { if (output == null) { throw new IllegalStateException("Output item does not exists!"); } - int level = JsonHelper.getInt(json, "level", 1); + int inputCount = JsonHelper.getInt(json, "inputCount", 1); + int toolLevel = JsonHelper.getInt(json, "toolLevel", 1); + int anvilLevel = JsonHelper.getInt(json, "anvilLevel", 1); int damage = JsonHelper.getInt(json, "damage", 1); - return new AnvilRecipe(id, input, output, level, damage); + return new AnvilRecipe(id, input, output, inputCount, toolLevel, anvilLevel, damage); } @Override public AnvilRecipe read(Identifier id, PacketByteBuf packetBuffer) { Ingredient input = Ingredient.fromPacket(packetBuffer); ItemStack output = packetBuffer.readItemStack(); - int level = packetBuffer.readVarInt(); + int inputCount = packetBuffer.readVarInt(); + int toolLevel = packetBuffer.readVarInt(); + int anvilLevel = packetBuffer.readVarInt(); int damage = packetBuffer.readVarInt(); - return new AnvilRecipe(id, input, output, level, damage); + return new AnvilRecipe(id, input, output, inputCount, toolLevel, anvilLevel, damage); } @Override public void write(PacketByteBuf packetBuffer, AnvilRecipe recipe) { recipe.input.write(packetBuffer); packetBuffer.writeItemStack(recipe.output); - packetBuffer.writeVarInt(recipe.level); + packetBuffer.writeVarInt(recipe.inputCount); + packetBuffer.writeVarInt(recipe.toolLevel); + packetBuffer.writeVarInt(recipe.anvilLevel); packetBuffer.writeVarInt(recipe.damage); } diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index 8d6cebea..f3d9cf85 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -13,18 +13,8 @@ import net.minecraft.entity.SpawnReason; import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.entity.effect.StatusEffects; import net.minecraft.fluid.Fluids; -import net.minecraft.item.ArmorItem; -import net.minecraft.item.FishBucketItem; -import net.minecraft.item.FoodComponent; -import net.minecraft.item.FoodComponents; -import net.minecraft.item.Item; +import net.minecraft.item.*; import net.minecraft.item.Item.Settings; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.item.ShovelItem; -import net.minecraft.item.SpawnEggItem; -import net.minecraft.item.SwordItem; -import net.minecraft.item.ToolItem; import net.minecraft.tag.Tag; import net.minecraft.util.Identifier; import net.minecraft.util.Rarity; @@ -100,6 +90,12 @@ public class EndItems { public final static Item AETERNIUM_HAMMER_HEAD = registerItem("aeternium_hammer_head"); public final static Item AETERNIUM_SWORD_BLADE = registerItem("aeternium_sword_blade"); public final static Item AETERNIUM_SWORD_HANDLE = registerItem("aeternium_sword_handle"); + + // Hammers // + public static final ToolItem IRON_HAMMER = registerTool("iron_hammer", new EndHammerItem(ToolMaterials.IRON, 5.0F, -3.2F, 0.2D, makeItemSettings())); + public static final ToolItem GOLDEN_HAMMER = registerTool("golden_hammer", new EndHammerItem(ToolMaterials.GOLD, 4.5F, -3.4F, 0.3D, makeItemSettings())); + public static final ToolItem DIAMOND_HAMMER = registerTool("diamond_hammer", new EndHammerItem(ToolMaterials.DIAMOND, 5.5F, -3.1F, 0.2D, makeItemSettings())); + public static final ToolItem NETHERITE_HAMMER = registerTool("netherite_hammer", new EndHammerItem(ToolMaterials.NETHERITE, 5.0F, -3.0F, 0.2D, makeItemSettings().fireproof())); // Food // public final static Item SHADOW_BERRY_RAW = registerFood("shadow_berry_raw", 4, 0.5F); diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index 63b26079..6ce63a51 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -1,14 +1,9 @@ package ru.betterend.registry; -import java.util.List; - -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.block.Block; -import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.LeavesBlock; import net.minecraft.block.Material; @@ -28,10 +23,11 @@ import ru.betterend.blocks.EndTerrainBlock; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.basis.SimpleLeavesBlock; import ru.betterend.blocks.basis.VineBlock; -import ru.betterend.item.EndHammerItem; import ru.betterend.mixin.common.ComposterBlockAccessor; import ru.betterend.util.TagHelper; +import java.util.Arrays; + public class EndTags { // Block Tags public static final Tag.Identified BOOKSHELVES = makeCommonBlockTag("bookshelves"); @@ -98,14 +94,18 @@ public class EndTags { TagHelper.addTag(GEN_TERRAIN, EndBlocks.ENDER_ORE, EndBlocks.FLAVOLITE.stone, EndBlocks.VIOLECITE.stone, EndBlocks.SULPHURIC_ROCK.stone, EndBlocks.BRIMSTONE); TagHelper.addTag(END_GROUND, EndBlocks.SULPHURIC_ROCK.stone, EndBlocks.BRIMSTONE); - - List hammers = Lists.newArrayList(); - EndItems.getModItems().forEach((item) -> { - if (item instanceof EndHammerItem) { - hammers.add(item); - } - }); - ToolManagerImpl.tag(HAMMERS).register(new ModdedToolsVanillaBlocksToolHandler(hammers)); + + ToolManagerImpl.tag(HAMMERS).register(new ModdedToolsVanillaBlocksToolHandler( + Arrays.asList( + EndItems.IRON_HAMMER, + EndItems.GOLDEN_HAMMER, + EndItems.DIAMOND_HAMMER, + EndItems.NETHERITE_HAMMER, + EndItems.AETERNIUM_HAMMER, + EndBlocks.THALLASIUM.hammer, + EndBlocks.TERMINITE.hammer + ) + )); } public static void addSurfaceBlock(Block block) { @@ -123,17 +123,7 @@ public class EndTags { TagHelper.addTag(END_GROUND, surface); } }); - END_STONES.values().forEach((block) -> { - addSurfaceBlock(block); - }); - } - - public static boolean validGenBlock(BlockState block) { - return block.isIn(END_GROUND) || block.isIn(GEN_TERRAIN); - } - - public static Tag registerItemTag(String name) { - return TagRegistry.item(BetterEnd.makeID(name)); + END_STONES.values().forEach(EndTags::addSurfaceBlock); } public static Tag registerFabricItemTag(String name) { diff --git a/src/main/resources/assets/betterend/models/item/diamond_hammer.json b/src/main/resources/assets/betterend/models/item/diamond_hammer.json new file mode 100644 index 00000000..77d71587 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/diamond_hammer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "betterend:item/diamond_hammer" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/golden_hammer.json b/src/main/resources/assets/betterend/models/item/golden_hammer.json new file mode 100644 index 00000000..3928ba3a --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/golden_hammer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "betterend:item/golden_hammer" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/iron_hammer.json b/src/main/resources/assets/betterend/models/item/iron_hammer.json new file mode 100644 index 00000000..f738e323 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/iron_hammer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "betterend:item/iron_hammer" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/netherite_hammer.json b/src/main/resources/assets/betterend/models/item/netherite_hammer.json new file mode 100644 index 00000000..bdf1b7e6 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/netherite_hammer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "betterend:item/netherite_hammer" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/item/diamond_hammer.png b/src/main/resources/assets/betterend/textures/item/diamond_hammer.png new file mode 100644 index 0000000000000000000000000000000000000000..d89f5c0c0976b9cd2c730a6b4ca6f23f425f53d8 GIT binary patch literal 279 zcmV+y0qFjTP)C*o-Aq*0tcno-do&gqMAU`vx$eH~ivh7!$GHG-y?_7!002ovPDHLkV1h92aJ>Kk literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/golden_hammer.png b/src/main/resources/assets/betterend/textures/item/golden_hammer.png new file mode 100644 index 0000000000000000000000000000000000000000..aed9697c55808d757b3279e8bbcc320083fdec6f GIT binary patch literal 316 zcmV-C0mJ@@P)gsC O0000_KpK5BJPfwHiZzR zs2>1h&RJ4QJERLhGd@Dz%R|1eQA_~LF~;3gLw=v9%+mnb6?pGe2>!9Q$pn}X6M&vk zwgxc)JTUb9Uy0cQlX+keAvB)?>SUS=z}03Ipe1u;wGldu@hn-H%<(2(B{w~$V(c}1|M>sko>_H0fg^K)6w@PZZjMGEQ^JAkqok7tkAy=Vo2B$@MHb!$R*4hmU+5{mV4ZPx0|Rs7 z3`K*p7Q7DIB$r8MF)(jRTf>&HSyC+Zgp{L%vQ**Co;7Td#$Aj*a@4ep9Ze@Knfc;Q c2R}1|z)L&c_BD4t0UgfZ>FVdQ&MBb@0B8hJQ2+n{ literal 0 HcmV?d00001 From 7888bde9e64b9ab0667992996dfb6ea4f887cdea Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sun, 31 Jan 2021 18:41:37 +0300 Subject: [PATCH 245/463] new End Stone Smelter recipe --- src/main/java/ru/betterend/recipe/CraftingRecipes.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index 3b927dd2..560800f9 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -37,8 +37,9 @@ public class CraftingRecipes { .build(); GridRecipe.make("end_stone_smelter", EndBlocks.END_STONE_SMELTER) - .setShape("###", "V V", "###") + .setShape("T#T", "V V", "T#T") .addMaterial('#', Blocks.END_STONE_BRICKS) + .addMaterial('T', EndBlocks.THALLASIUM.ingot) .addMaterial('V', Items.BUCKET) .build(); From 13079052f5118b02caea2ad22a962b568695ec80 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 1 Feb 2021 04:00:02 +0300 Subject: [PATCH 246/463] Cleanup, texture compression --- .../integration/rei/REIAnvilCategory.java | 1 - .../mixin/common/AnvilScreenHandlerMixin.java | 2 +- .../java/ru/betterend/registry/EndItems.java | 13 ++++++++++++- .../java/ru/betterend/registry/EndTags.java | 4 ++-- .../textures/block/blue_vine_lantern.png | Bin 700 -> 700 bytes .../textures/block/bulb_vine_lantern_bulb.png | Bin 766 -> 416 bytes .../betterend/textures/block/cave_moss_top.png | Bin 710 -> 710 bytes .../textures/block/charcoal_block.png | Bin 414 -> 259 bytes .../textures/block/chorus_nylium_path_top.png | Bin 711 -> 711 bytes .../betterend/textures/block/chorus_plant.png | Bin 712 -> 712 bytes .../textures/block/dense_emerald_ice.png | Bin 235 -> 235 bytes .../betterend/textures/block/dense_snow.png | Bin 215 -> 215 bytes .../betterend/textures/block/end_moss_side.png | Bin 645 -> 645 bytes .../textures/block/end_mycelium_path_top.png | Bin 548 -> 548 bytes .../block/end_stone_furnace_bottom.png | Bin 0 -> 614 bytes .../textures/block/end_stone_furnace_front.png | Bin 0 -> 722 bytes .../block/end_stone_furnace_front_on.png | Bin 0 -> 873 bytes .../end_stone_furnace_front_on.png.mcmeta | 12 ++++++++++++ .../textures/block/end_stone_furnace_side.png | Bin 0 -> 624 bytes .../textures/block/end_stone_furnace_top.png | Bin 0 -> 614 bytes .../betterend/textures/block/ender_block.png | Bin 256 -> 237 bytes .../textures/block/flavolite_pillar_side.png | Bin 606 -> 606 bytes .../textures/block/flavolite_polished.png | Bin 590 -> 590 bytes .../textures/block/gold_chandelier_ceil.png | Bin 314 -> 201 bytes .../textures/block/gold_chandelier_floor.png | Bin 471 -> 291 bytes .../textures/block/gold_chandelier_wall.png | Bin 352 -> 233 bytes .../textures/block/helix_tree_log_side.png | Bin 253 -> 253 bytes .../textures/block/inactive_brimstone.png | Bin 223 -> 223 bytes .../textures/block/iron_chandelier_ceil.png | Bin 340 -> 199 bytes .../textures/block/iron_chandelier_floor.png | Bin 502 -> 291 bytes .../textures/block/iron_chandelier_wall.png | Bin 373 -> 233 bytes .../textures/block/jungle_moss_top.png | Bin 228 -> 228 bytes .../betterend/textures/block/missing_tile.png | Bin 509 -> 340 bytes .../mossy_glowshroom_stripped_log_side_4.png | Bin 681 -> 681 bytes .../block/pythadendron_stripped_log_top.png | Bin 507 -> 507 bytes .../textures/block/silk_moth_nest_front.png | Bin 265 -> 265 bytes .../textures/block/sulphuric_rock.png | Bin 241 -> 241 bytes .../textures/block/terminite_anvil_back.png | Bin 343 -> 238 bytes .../textures/block/terminite_anvil_bottom.png | Bin 212 -> 158 bytes .../textures/block/terminite_anvil_front.png | Bin 349 -> 229 bytes .../textures/block/terminite_anvil_panel.png | Bin 329 -> 225 bytes .../textures/block/terminite_anvil_top_0.png | Bin 288 -> 210 bytes .../textures/block/terminite_anvil_top_1.png | Bin 373 -> 258 bytes .../textures/block/terminite_anvil_top_2.png | Bin 417 -> 272 bytes .../textures/block/terminite_bars.png | Bin 394 -> 239 bytes .../textures/block/terminite_bars_top.png | Bin 217 -> 147 bytes .../textures/block/terminite_block.png | Bin 233 -> 198 bytes .../terminite_bulb_vine_lantern_metal.png | Bin 414 -> 249 bytes .../textures/block/terminite_chain.png | Bin 167 -> 122 bytes .../block/terminite_chandelier_ceilt.png | Bin 342 -> 201 bytes .../block/terminite_chandelier_floor.png | Bin 463 -> 292 bytes .../block/terminite_chandelier_wall.png | Bin 369 -> 232 bytes .../textures/block/terminite_door_bottom.png | Bin 407 -> 285 bytes .../textures/block/terminite_door_side.png | Bin 185 -> 150 bytes .../textures/block/terminite_door_top.png | Bin 404 -> 292 bytes .../textures/block/terminite_tile.png | Bin 210 -> 183 bytes .../textures/block/terminite_trapdoor.png | Bin 1648 -> 266 bytes .../textures/block/thallasium_anvil_back.png | Bin 372 -> 236 bytes .../textures/block/thallasium_anvil_bottom.png | Bin 298 -> 189 bytes .../textures/block/thallasium_anvil_front.png | Bin 370 -> 229 bytes .../textures/block/thallasium_anvil_panel.png | Bin 368 -> 228 bytes .../textures/block/thallasium_anvil_top_0.png | Bin 314 -> 204 bytes .../textures/block/thallasium_anvil_top_1.png | Bin 382 -> 238 bytes .../textures/block/thallasium_anvil_top_2.png | Bin 400 -> 245 bytes .../textures/block/thallasium_bars.png | Bin 429 -> 265 bytes .../textures/block/thallasium_bars_top.png | Bin 258 -> 154 bytes .../textures/block/thallasium_block.png | Bin 1667 -> 269 bytes .../thallasium_bulb_vine_lantern_metal.png | Bin 402 -> 242 bytes .../textures/block/thallasium_chain.png | Bin 177 -> 122 bytes .../block/thallasium_chandelier_ceil.png | Bin 348 -> 218 bytes .../textures/block/thallasium_chandelier_e.png | Bin 1470 -> 144 bytes .../block/thallasium_chandelier_floor.png | Bin 539 -> 303 bytes .../block/thallasium_chandelier_wall.png | Bin 394 -> 250 bytes .../block/thallasium_chandelier_wall_e.png | Bin 1456 -> 136 bytes .../textures/block/thallasium_door_bottom.png | Bin 310 -> 272 bytes .../textures/block/thallasium_door_top.png | Bin 555 -> 324 bytes .../textures/block/thallasium_ore.png | Bin 319 -> 283 bytes .../textures/block/thallasium_tile.png | Bin 231 -> 196 bytes .../textures/block/thallasium_trapdoor.png | Bin 557 -> 370 bytes .../betterend/textures/block/violecite.png | Bin 237 -> 237 bytes .../textures/item/aeternium_hammer.png | Bin 517 -> 365 bytes .../textures/item/aeternium_hammer_head.png | Bin 447 -> 326 bytes .../textures/item/gold_chandelier.png | Bin 341 -> 215 bytes .../textures/item/iron_chandelier.png | Bin 369 -> 214 bytes .../textures/item/terminite_chain.png | Bin 170 -> 118 bytes .../textures/item/terminite_chandelier.png | Bin 345 -> 208 bytes .../betterend/textures/item/terminite_door.png | Bin 1530 -> 194 bytes .../textures/item/terminite_hammer.png | Bin 492 -> 271 bytes .../textures/item/terminite_nugget.png | Bin 248 -> 160 bytes .../betterend/textures/item/thallasium_axe.png | Bin 424 -> 264 bytes .../textures/item/thallasium_boots.png | Bin 255 -> 172 bytes .../textures/item/thallasium_chain.png | Bin 174 -> 118 bytes .../textures/item/thallasium_chandelier.png | Bin 399 -> 263 bytes .../textures/item/thallasium_chestplate.png | Bin 335 -> 215 bytes .../textures/item/thallasium_door.png | Bin 407 -> 245 bytes .../textures/item/thallasium_hammer.png | Bin 474 -> 263 bytes .../textures/item/thallasium_helmet.png | Bin 284 -> 172 bytes .../betterend/textures/item/thallasium_hoe.png | Bin 371 -> 254 bytes .../textures/item/thallasium_ingot.png | Bin 396 -> 247 bytes .../textures/item/thallasium_leggings.png | Bin 277 -> 177 bytes .../textures/item/thallasium_nugget.png | Bin 1488 -> 152 bytes .../textures/item/thallasium_pickaxe.png | Bin 417 -> 268 bytes .../textures/item/thallasium_shovel.png | Bin 392 -> 247 bytes .../textures/item/thallasium_sword.png | Bin 442 -> 274 bytes .../model/armor/crystalite_layer_2.png | Bin 463 -> 463 bytes 105 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/assets/betterend/textures/block/end_stone_furnace_bottom.png create mode 100644 src/main/resources/assets/betterend/textures/block/end_stone_furnace_front.png create mode 100644 src/main/resources/assets/betterend/textures/block/end_stone_furnace_front_on.png create mode 100644 src/main/resources/assets/betterend/textures/block/end_stone_furnace_front_on.png.mcmeta create mode 100644 src/main/resources/assets/betterend/textures/block/end_stone_furnace_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/end_stone_furnace_top.png diff --git a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java index 539b00ed..5c58bcd5 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java @@ -2,7 +2,6 @@ package ru.betterend.integration.rei; import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java index 57579dc8..cc92009d 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java @@ -4,7 +4,6 @@ import java.util.Collections; import java.util.List; import java.util.stream.Collectors; -import net.minecraft.block.Block; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -13,6 +12,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.block.AnvilBlock; +import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index f3d9cf85..16e29828 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -13,8 +13,19 @@ import net.minecraft.entity.SpawnReason; import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.entity.effect.StatusEffects; import net.minecraft.fluid.Fluids; -import net.minecraft.item.*; +import net.minecraft.item.ArmorItem; +import net.minecraft.item.FishBucketItem; +import net.minecraft.item.FoodComponent; +import net.minecraft.item.FoodComponents; +import net.minecraft.item.Item; import net.minecraft.item.Item.Settings; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.item.ShovelItem; +import net.minecraft.item.SpawnEggItem; +import net.minecraft.item.SwordItem; +import net.minecraft.item.ToolItem; +import net.minecraft.item.ToolMaterials; import net.minecraft.tag.Tag; import net.minecraft.util.Identifier; import net.minecraft.util.Rarity; diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index 6ce63a51..a85ade47 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -1,5 +1,7 @@ package ru.betterend.registry; +import java.util.Arrays; + import net.fabricmc.fabric.api.tag.TagRegistry; import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl; import net.fabricmc.fabric.impl.tool.attribute.handlers.ModdedToolsVanillaBlocksToolHandler; @@ -26,8 +28,6 @@ import ru.betterend.blocks.basis.VineBlock; import ru.betterend.mixin.common.ComposterBlockAccessor; import ru.betterend.util.TagHelper; -import java.util.Arrays; - public class EndTags { // Block Tags public static final Tag.Identified BOOKSHELVES = makeCommonBlockTag("bookshelves"); diff --git a/src/main/resources/assets/betterend/textures/block/blue_vine_lantern.png b/src/main/resources/assets/betterend/textures/block/blue_vine_lantern.png index c269849a7245a67d024a2ee362c3bd221bb1f81d..4b7ca65f4fff2cf86c9161a78abde28084b0b7f4 100644 GIT binary patch delta 29 jcmdnPx`%aw7UQjr+Ko&CtA3P9GXR07tDnm{r-UW|n8pdK delta 29 jcmdnPx`%aw79-6^GD|9ogb z45-6`R>h!ZT@nOsaSFVPs}$xA5qE$AO;Qp7{rbDmcfhN$je%4DMF0RG8_q#rOTnZw zPGkU|1seJ|);E*RJaHCa(s>9Nr=S5$I*S1&ou>f9bJ2D%rStd@hrI@n$cWHkF9wJ& z(r;IJb01P#`+t`$cN!G;(B1xS^S($IxngR kQ#y<5fk|g^J@`xe0jSaSk8g;IGXMYp07*qoM6N<$g3XA%vH$=8 delta 743 zcmVDi87{`C_U3j@CH3wITWa+@x31#%m;PnQC zi&3joawV6+17jo@x*)k?Xa#}65Cm$Pn532Jln!)Yb~;7s&>4gZa$7>5A!na+_c0)c zT$Bbw82VqHbobu7@B9D1`@sRF01AZy0KHxh0N?j>o9-{&lYcYkX4LZaCDBH6>hsg; zyNmO3`1nz^eZj`Y2F4fwk|ZGvLxLaxz*@`7&8Em!23n!CqEsoX)z#Hk6--Z0lcp(2 zk^o?g!Sg&OCno{8yVw#mkU=&`(c>OUDa?mf=~4Pj<1G+So&tfapOW^r0MNsplO(|y zgE59ANpe1vYk!|901-hO4{bb7pZ!#AUjPt>A)e>qc^+XH0^pp(IY)DDK}waf%90d- zQl+e#R~96f!qBjxoO8KU_Ikgzw#FMhSYKbK-EQNY%N?GYntJWQ{iSx#1pX8V2 zRk7Cc>y5jz(}y4ku-0O&B?tmqtrh@d0B6q4sA108Ab(@!W>ZR)vf5qtUeW+7^G!j4 z@-(uQfr1}y-I3ir$8k&?$GLVi?4R>U73`PuZaL>@x7+!Ln-85tQAGT>EB(JVC5j?8 zA2=x#3Wx|ILa|uPts?T;#1o~W3W9)W=H&KQPkd5T!#RLgKh(~3sP{KW&N(`r4xLVC z+hyPP@qc}v);B9+t)=D0iNw-h<@zHnWL6Va8-+~8Ue05fJA3S5w8<2_c;?FLX3tx`TgT{qx zQmxli{Lc&e-5%9?O*PJ6`#O ZUINC2(M9)si}e5i002ovPDHLkV1n~*Y}fz* diff --git a/src/main/resources/assets/betterend/textures/block/cave_moss_top.png b/src/main/resources/assets/betterend/textures/block/cave_moss_top.png index 335fa1cb84944ce789cbc22122e5e477f0d5ef56..1d3698b27d0636d92874efdfda9d20e0492c1a8a 100644 GIT binary patch delta 29 jcmX@cdW>~~7UQjr+TBb76O8%t8Gyjk)z4*}Q$iB}jVlP( delta 29 jcmX@cdW>~~79-gTe~DWM4ffzJqe diff --git a/src/main/resources/assets/betterend/textures/block/charcoal_block.png b/src/main/resources/assets/betterend/textures/block/charcoal_block.png index b86c8eaebfa855c03789e8b9ba74061261d056c6..8b3696b5d62ae0b1e3eb0a675e7af1d2d8017c8c 100644 GIT binary patch delta 231 zcmVmvZDIsyq!y@OCTf%IaC7u*jQSyG`vp*`!R#5q0t3uH;fy2=DNlxoe* zGmp=&of1gm1gZbozH7qG`^aqlski$Ze_y8tj z*GCk2hQ)lQ&l7^U)%Jn&+sN#u2Sbb)+sHzDQg^v%F`r@my1-`rqO5u5bKllZ^4r~{$w&YI002ovPDHLkV1l+@zcl~= diff --git a/src/main/resources/assets/betterend/textures/block/chorus_nylium_path_top.png b/src/main/resources/assets/betterend/textures/block/chorus_nylium_path_top.png index 459a3d637c68bdcc8559fc11c0ceded27b65341b..dc0ea52d69cb503b32b8556f0a2113af9f32086a 100644 GIT binary patch delta 29 jcmX@kdYpBF7UQjr+C5AHTiL^BGXR07tDnm{r-UW|lWYk{ delta 29 jcmX@kdYpBF7GvB-?H(op-j;G<1|aZs^>bP0l+XkKfNuyn diff --git a/src/main/resources/assets/betterend/textures/block/chorus_plant.png b/src/main/resources/assets/betterend/textures/block/chorus_plant.png index 756dae1e12c722629c9b10f6a8b16b57d9c7e699..2bf9e6f223652cd03dfdf7ff91fcef5d9a8bc91c 100644 GIT binary patch delta 29 jcmX@XdV+O=7GvB-?OrAU^}_|97=Xaj)z4*}Q$iB}ko*a4 delta 29 jcmX@XdV+O=7UQjr+PzEyMIr)Q diff --git a/src/main/resources/assets/betterend/textures/block/dense_snow.png b/src/main/resources/assets/betterend/textures/block/dense_snow.png index 6ea9931268bf8c5493c81c0d8821961b54f4c595..efbdb3695b034bd6baf7fe3fab639a787d3fb42c 100644 GIT binary patch delta 28 icmcc4c%5-V8RM;qr63_#%N>gTe~DWM4fe_#lT delta 29 jcmZo=ZDpOH#Td6y+lxuS{CLx01|aZs^>bP0l+XkKeJ}`{ diff --git a/src/main/resources/assets/betterend/textures/block/end_mycelium_path_top.png b/src/main/resources/assets/betterend/textures/block/end_mycelium_path_top.png index 14f7385b8a9bfcc215c36ae151118e2eed60671d..efd16c00ee064df829cf751684098b3172412268 100644 GIT binary patch delta 29 jcmZ3&vV>)V79-MHFaUw4tDnm{r-UW|i_-~M delta 29 jcmZ3&vV>)V7UQjr+AkRen0IO&VgLe9S3j3^P6v16ia-2_X;=mAE8sZ zU{(lPFN5jNVA39K+hG_qmg$KF`M!@Z46WXE9sIV3(2U?J)d;AVw1X)tRK*&fkB*@P zNbn$D`(Z#Vk&s{zy{t;~evT$@(G(@Tmj_P=vMx>+m~ZbO*`6T?0vodRDn!&h&$F^A zDoZlm-i4nV{GT(udV^GuzKAa2?miH+2y&w2Nhqe7%A?c_Re_yz`&w z@Y!?BCR6y5e6n%s`O`#DLlDNLQQk{1XGsXmH)DLF848i;f{2z6 zMNq$%2vR9y;M*gpmIttRmt(N247SdP%pva7&o%@{o1pXvV%L{qw71-a%T|fOz9-Nf zj755K95Rn+k)_*+v?L8qB*kIK{S^JyG8XB!l)&0q68!`MRkrt6FgZ)N372!W;P$nh zxRJLFxmocXJGMU-K9>=_qTu+v8RH8LQGt;W6SqedGE%ghaO>(W6y$El&Ac7BQ;>*D zISDM_aTxe>f{|MI!gWxFCthJ{@hzNIJ?yF;nW&l} zz)(VS4XYNG3IPL7iYnP@S~z`1CtmcZx z4@Cz@F}m}*ss;Bx8j|W+bF|}K&+rNQN*Cc&x~@EMN|k96p~msD=if%%DPE0b$#H+SZPb= zSLU>-IGr}9q|Aw%PSW}95Y1|Ppq80Wr1I-E}2nf$TXG^~?zgCgd;; z$iWd4c|eRxMIzL-NrLG%RonX%sFlh1(2$09RVp;~cc_PWho&lE=qmx&C>T}mZlR_$ z0Xoe+=$ccIb@dPm;txZX;E$Kr1MuRC53=KZ(cAF=txb+34ay`m)h9WA0ukA{Q=JNF z+(EQn*bl=cZY!RNsV7*x6vo!$-3OT+hH03|Wg|s=0=V^0P1> z6#|a$27)0)7PI1Rol4!kM`UlftByb{4MQbffW$BXE3%@l^?yCNJA2|J28e5;M5BbnQT zglyd=3&eDO82ZO#7@4mE$If?F76o2@4A`;R5hQ#A8YIl^m0_-A_TnS37KFI!!j)j^ zStxi#C}y`fgDN8ENanmE%$1CLucqE-+~|8PKR7L8E<$_Kpm?rq@4S=HujriS&jMb#`V^v3Z&72FP=w zQt6_Ptr2l<9{krlAhqx9xIq7y2hM9tc|fkVc&$8eUfX3naB^Z*9=MDG4=5W%i#(ug zaPz>;gN?=mKWBeH#_gNdt3O~2U_2n#d{rKZf5U@6?GIQ_uws88cJsi^gAK?7A14od z*0n!a%7Zoc2kce9CLV0%R^$QuAK~V~U*N$HvxgM(I_{Ws00000NkvXXu0mjfMzWb_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_furnace_front_on.png.mcmeta b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_front_on.png.mcmeta new file mode 100644 index 00000000..98b9ae71 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_front_on.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_furnace_side.png b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_side.png new file mode 100644 index 0000000000000000000000000000000000000000..bd8a0e5975976b579626c8210e93c9e38a3a0cf6 GIT binary patch literal 624 zcmV-$0+0QPP)Qxls<@;0{T)-tgV(pqHTdRmSSt6(F!dT18hxA8-Zmhdo^-z(uX#E@!@l3 z@F4o|WzU)U=9|lz)tq4hKW}yg#~(u&-|GLM_iJ0A?&VJ*^lsn7>t|uL_n>vU69Fbw z3s0wFDp2_qgmX;-qYP{(1C2@SU}EKH9@WD~geR0KEXbwrp?nY)n_iqJPDr@^Wfo>T z4ehw_5XFQ0$P%$uilEV2Li^%14Ei>ji!j=+-ce*giBvoiy}*+}?z@|J!G6Y0>Mu{(7{39_%R`O)F+F1d0000< KMNUMnLSTZ}yeFRk literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_furnace_top.png b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_top.png new file mode 100644 index 0000000000000000000000000000000000000000..5b79a56e8fe5ed1a65bb2378e7d4068f57ab10e9 GIT binary patch literal 614 zcmV-s0-61ZP)v16ia-2_X;=mAE8sZ zU{(lPFN5jNVA39K+hG_qmg$KF`M!@Z46WXE9sIV3(2U?J)d;AVw1X)tRK*&fkB*@P zNbn$D`(Z#Vk&s{zy{t;~evT$@(G(@Tmj_P=vMx>+m~ZbO*`6T?0vodRDn!&h&$F^A zDoZlm-i4nV{GT(udV^GuzKAa2?miH+2y&w2Nhqe7%A?c_Re_yz`&w z@Y!?BCR6y5e#j|mdMAP56hNYMX(xCyp( zJZ2;8=zvDVzpa6NPSxJK3OeS%0cb*|k`By72FRKtiuE%}j=HS+l2|RS*WKmpfT??B z;%G-k_oo<3!OPYVsxaSvs#uQCZ|-X0{Iml>_zw4*3IhU8Gw)p_UUj(}l TC1{sb00000NkvXXu0mjffqPFR diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_pillar_side.png b/src/main/resources/assets/betterend/textures/block/flavolite_pillar_side.png index 0aad4be7d947c268b7f1259502044e2c5c871b4c..b550c4db2b6d66414ce9c46ef6d36bac6708380f 100644 GIT binary patch delta 575 zcmV-F0>J&=1l|OYDu3D~Qpt`JF%-0)m$tjpix>_wBSvUo#GmsSoRAQR19Qr70f`f< zCP^o~c&7r9+U>Yq^{VPUzT3Xm-Q~llw|6gJ@%rM+_QUnnv*Ggg^ZmQ7doo--|GNEn zb91}7xW0e?=EdzD1@DPC=TwBjYh72y#WXMLx}+4f(n@JYCV!V=t<_o)7c!=tb6S_R zuu?MfA!}XXGftOv0V7vdkccsoRCGE{C?JG%Zb~r$tIWpK4R)%sZ9fPpMRB<>B03xn z#8`ITp?VCVZkkFf>|*f1R(4ZTbnEIvB97{%Fiy6vAsv^To4s>|vFPU%0~p5LFIaMJ z9d|z&ToS<$)_;GNNi566SP??#s#%su=t2uLYLOcp`{Tx)Gi0|E0i6;XTd0p4u-loG1LJckDc(w0g%;s_pu zwj`+QhZN4rfw4_n83U20!yo)*jHT#lJnV7A35&!tj(_`g+M@{|Yug@r;4!E3Pf4k( znw)cVZi08q5$2#9J6HlkVgd~Y2CcyD8Bxq9YT6!e-1wh8Tml9b9|B`sigRg1gc!TF zle(5@789bjcGEuvkue6D0A{oj3M0fI#?}q&VZ2B+^!WP+!bJkSL_`5@1XkA;S}0E# zK6vZ<;W%`J;Pn0511U@jx&z8eoI9N}g2QL@DFw$k12@1J$1`t^e*sYMV{Xvm%bNfI N002ovPDHLkV1haw3M2pk delta 575 zcmV-F0>J&=1l|OYDt}%jQpt|gFch?(m)J>X5yN3-#0U+H_;Wsk6A}V(U`{<;K;p!z z>F#uA@lG`y;y8}0URAxvciY#xyL|Zc_U`2?USE9Kez?ARHeB9*zJJ$sPll`KU$-A` zZf-Xh*Z1$=ytuui;5`xNoQg1bt?SCTnC4|&mz1JbS}D!Qv(-q~nrvvv;mA7X6%J0K>TZ1xwDY zD?$ieHOn&VN{{1XfkLgYqJ9Wb2|;Z)0E22x(^Zv`QYp#X zwmlt3h>%j|l(n%60V&0Z$wEkgYpsoGAYh)RB5LnFz?)5Wrw(X$@9y1E1q@>hU zP0l$wH^IB*2y@Vl9V~$%F@XjHgI3`7j40+4HEoYKZv4+4E&&6J4}mc*(P1GF5n}Ax zPU>2sSxku9+D-oyM8+6o0+`WCD2xz;7+W{6hw&oS(BtnP2p0+P5)lQs5m;SYXrVk| z_~5PYhd9#_g46eJ52P?D=ng0=aqe`^2oAr|rxYCH4BP-?9M8Nt{smC)V{U)!Icxv` N002ovPDHLkV1n})5X}Gp diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_polished.png b/src/main/resources/assets/betterend/textures/block/flavolite_polished.png index a98bc902c18b2b0c3fd2cf373e55aa54a4cac44d..fdcb63e723ee1f9bf792eef180a9db9a19095da8 100644 GIT binary patch delta 559 zcmV+~0?_@=1kMDIDt}%jQp;}JFc1{QZJvm#IYrcr1!Z0q{oN_u!azy>l#~*#8ltafl?>q^`$sDnSSYnK&pnrzlUYQtD!a0rONciIj zKG!}cUrXiE2tA>WOXuu6n#{wA*P!QzV}AuZDWzWB1{f!qQj}eXk-6*yXJweWT2ee1 zlf+#NhxeX3++fT(D`b*#ID%^c&e3;Y-#AfNUm@B|7d>cr(?pwTNh#g#SJw5~j8cu> zzVCLk_6Dxg`F{bH`TZuA3$8Vc6k=Y^DQCDNu_Kq^w-SdJv~0U^u0X8fHj>B~3KugNkjvlb*+Eu3Y8lm2P5&afXi&`F?%D7c-bP z5A@k>C80SMXSXA~2&t55`=Y*ByXKrq&cW|WNeJ%Ob$^|fi!yU?t9O9hz#W6-%H)n? zcfmP$1wDYZs7%v@P}I`=Mkdf2=jJt@jvYX|Eyc(fmwLv1LdXO)*Qe71IC4CMf>(y+ zor_^Pe*sQPHO-4qMr++dswA|`*1F*CLP#mKw{I0@PK9{?>GN0K*KNH)1_ZJvm#IYrcq{K&u zwFL|)nX|hyJG@-JIp>I|)|zt$N-6K>?*ET-en*n>&&zj;F|L1qDQ!DJZn-d4iKH^a za(&-p?1$OdQ%-wHo~Zlz^rLGfRnIsJK9JOc?0%GZl;b!`0e{BLUAXL1!Z{7YK=@;i zA=fUaP)ilcN;3k7nR)ktCR2YBHJa&h-`-H2wAOEa1x=7j=}?SeWTBW8y!0chB^^8G ziiAJn9zr078=QOZq)JNld-RPU1p02vyC90o8${djY7)~3j`w5a@NfV9vpkiHaWTs)9s?hle+B7l!Fu_NN{J6a0i|uWj z2m0K)kTe2|bL$>orPA8AeNk7OTXIe%=NLAv6$E$7vVV;8S=%Z4C3sM-sC`5yw9QOl zchP%z1wG{+mT?>ridvfA$OKyB+`Pua_zt#T({XSvl$mg!5Hd;4_3`wG8u{3zhF6y7 zO~`(J_yV3%dYopdtudyBR4Ztiob%D&q*O|o;NC0D91Dr=)90_EtLt)w3>2i>@8{>2 xCqx=cK`2K={d_)e+lE*80kqZvksa1rsegt7VmETs-Om63002ovPDHLkV1mOaARzz% diff --git a/src/main/resources/assets/betterend/textures/block/gold_chandelier_ceil.png b/src/main/resources/assets/betterend/textures/block/gold_chandelier_ceil.png index 46e6047e79ae8a9353d95df91c0f9d68ed1e75e5..bf3c870e96704a8f4069907aa5e920f35fc47a57 100644 GIT binary patch delta 173 zcmV;e08;*z#5=V1sia~?mq~FTmZr_1CZ6B8UV5lh+!H)&PT>@gP`iL2O7{u zm9lQLDE@E+eKTKG~TX~VAYqKu1$(*PJfLt=kiKXWMcs*t9A`` z%x?1yK(*=D6)klb3ShT<%RB$0FyI0D_HqQZ^_Erxx2q4mUlB&ea*jl7^$Qvds2j|TCT2J<+lLz*bMZ(8>(I= zMnDfWgrWe*``b||A|L@=65zyKWJe5;n&;UQwS#Mf7 zeIgM|1b@bgx_9vQ{S|xzN8u|Fkb5P#))PJ*XTdYoyxg*983hRBOxRpx5^LX;5^G0y1fCGa4-U6@<`#eIM)6U=>bj?Hi5&n!g1wJ)p$jJEq*Wv&G O002ovPDHLkU;%<`26@5& delta 445 zcmV;u0Yd(x0@nkOB!2;OQb$4nuFf3k0004zNklm@;vV8BXL zVu-z134&JXloa|HzJ*|CV`E`uBZiG>vrotF~;jfO{YYBqrU3jk)3ezUxT zwgM765--VKF@MhJp_uEWGv)zY&F{0{_(U3gJ`1XmNSl9XJqT#!Q!4c;ABBP^Yh-8) zfNJ^Gv|DP@7f%>q@=^jL)QV50Xz4-v+wE3zs8womytgWAyBqD8r2wv89ZL+%A6*3J z0xdU?iBl2Z&fUDOD!A{$Z9g)5_bVXO4Y0pCFCT>hRyL{0@pd{;+_P13No}0R^|v$k nHFh7NxE$C)X!1;c0sy`MhuY|J;d3^f00000NkvXXu0mjfnw`#G diff --git a/src/main/resources/assets/betterend/textures/block/gold_chandelier_wall.png b/src/main/resources/assets/betterend/textures/block/gold_chandelier_wall.png index 72efa57e6672871291b057c824d56806ccda0bca..27182e7aa3f94efff8e8e291ad88b4b9c3b2461c 100644 GIT binary patch delta 205 zcmV;;05bpJ0_g#eB!93;L_t(|+GAiK0sQ~}AB=6|NlGT|Gx(wU^Yw~(*U3%5XS1n8+QLe*rsv;Zblb?Yyc_3W&q43c)fr# zpg>*&xeiE!Ex{QEP(>I9K%I~7cdUU3vH_b*kiCG@fB^>pL$owrXKA-ZLV1osxfsV>E_g~n9^Di&Om#!}m~(0Uxwgti3XUp&*jKj++YIrj$( zNJ0|rq_3i`*$e>aj0bAgPw0#X0x&k>cGB1RVYBRqlQ;Vf_J3hDAk7le#Wb%MQ_?KK zu{1QpuNS!oN2FN-V5~BL{1Q78|0KuPdD6!ZrVyHqXVE*`B!F4y3BZ}Gz-^(=N0z;Y z=Fex=T6B!7-cL_t(|+GAkA0SwJt{(Al@ z-pe`v`Okk11=Jg{Dr@V!Plq_J$NAZ@DXJ~RuLcTgkrve~<$pa&qTT5!neI3x-S#hx zG4m!;f!)0W0jbr&(<1;c&x1_E_qtTF8Fw|?@G%`_8kgNN0F_lAfUC<>lW{P48)L2I z;jV8av3+<#>HbCllZ`ENeY6ii7`0@rT@=e#29jvTUDX@0l6xMxAtsE5ujx52z=Z3c^4TMfV_rT^g~_LOZcYV<&h53lHH{Jb_^A z9W1?pSlEf3r7-#yepn})gnSrwXZFv}&+LZDth7bBi7}ooE&PzyLIN|3ae7@$`v7S$ zEUXyKZMELT25RI8c>$WQ@0&>^&;&VczzKUf5@@=Ao>h=nJr0j^ zv`;fDc^f|`5JmVhD|v5d`qeE6{DN*lhpMIITrDDf3kq@#H?0vh0TJ~k2sJ6^OuU+a zNa=x^j@$iT&GWKD^4IIhjRJzV-&+9N*w-&KIc(l@M O002ovPDHLkU;%=CWOd*G delta 476 zcmV<20VDpS0`>!tB!2;OQb$4nuFf3k00057Nkl&PY}URFrtNMkrav5YOxkuNx+B>yVJ}(lKq#! z!nIguva_4WdaB2}=bn4tIZy5_t*TRU0We8SqrNYrcc1s(3V(m0ssIE@O`rJ>1fbxQ zTz(ujh*}|)*?9n*l1tPIX`dW3jv%S&+?DGDNlgJPyXZ4h^ZQ25tPeo1W3VhMCzuIzyF+(>|NNe z+J6vM(>DKa=Mwzi(98wQhKXYs08#|P*qo?qKPU9z$YxA9an zFmukCGhhG_K}4wPxbk7Vlz-#C)qgN|@DoM^Zm4mG z-nbrmxS_@}6jZH`JIPPa;)WVP8D#+DPb3)s8s6AG5PhgFm;UGfB8}xAQ5cfrzlVb0~rDkh2TC_nx?JUZ}JTtkv~h$=QWCg9zQ%4gimxn^fx& stVkhYYdoxqrHW+jJnh@2@w@*IUn9MSK#^ZbQUCw|07*qoM6N<$g0Rh>Qvd(} diff --git a/src/main/resources/assets/betterend/textures/block/jungle_moss_top.png b/src/main/resources/assets/betterend/textures/block/jungle_moss_top.png index 71e619dd8232a15250b1013d1b57c05f3cc43545..375059290bb71abc77ad4feed1e056126be63c33 100644 GIT binary patch delta 28 icmaFD_=Isn8RM;q<*@>SS1dUhfWXt$&t;ucLK6U!UkN$@ delta 28 icmaFD_=Isn86)Gw@>qcikIAnXfWXt$&t;ucLK6UxCkb}| diff --git a/src/main/resources/assets/betterend/textures/block/missing_tile.png b/src/main/resources/assets/betterend/textures/block/missing_tile.png index 75779b386801c94920a905bdc9df6afea9a21d9b..5b31bfae1e13fe24798a81d0625f3ac8983895e0 100644 GIT binary patch delta 314 zcmV-A0mc6P1JnYLBYy!KNklPx$w@E}nR5*==l0j-4F&Krv%m`-eSh#XJ zg)w0$4TM7P(;mi`=qa*s50OO{g`S`eUUW8I3`Q}U*b-3wI5 z#o|e8jn*2a6k)X1)OF3x<#*Z#gV`D6R03dj27uLejnG=NTz@W+QpU?d2#TVhX&Tyz z;pXQLq&P>8p9S`Y`K-j)76Bloq%2E>5CAymsH%$1W;47j&iVBIBer+sNrucPTwh#q zdw(}L0O-2z#SSB<5;>NPk{lrJ=r-ievJCG%S(X8yl!}hb-f$ROZ118-5Edb`_nxln z;yFzCFxxwnn12Fr=xr1hT5F1;psFgAQn3xCR1})eO0F-iVkCgcyJ3sEu4$TvrfKlr zN88?ej4`azHO98w-ro%ZV~N=hu8e==?9aDfPyhBDtgp6fet+Ha8YiNCc)jPhI1!=e zFCRX0=q;lp=Phfs&gcIi+X_`h(M5yD?A8QIbSY18kBTduzPXI}<43H0000k8AGUk?fZYG+p rsYi`~9#+5THxdm*mP<-_Yi{uoAWiBW+7KH36+h82t-0rGLu zcl~jw$iHBNm11N%0P-7DMFH}0cE(mtPWMO8Ng+lQ03`w71_5S85FOoC$e3H^xtVCX rrXDo{dRYCU-$*nNVH#xkUBmqYE=~x6{ephj00000NkvXXu0mjf)do3w diff --git a/src/main/resources/assets/betterend/textures/block/silk_moth_nest_front.png b/src/main/resources/assets/betterend/textures/block/silk_moth_nest_front.png index d3b45891ca21956ef63659c9e21e8afa82b9df58..cd0f27670700198b39bad105de983d545b07dad7 100644 GIT binary patch delta 28 icmeBV>SUTw#&~ODd6PiyGQ+0~K;Y@>=d#Wzp$Pzx#R;td delta 28 icmeBV>SUTw#>hCayh-38(+egBAnpl!8RM;qpl!86)Gw@+^Vog<&ZSK;Y@>=d#Wzp$Pzwk_kTm diff --git a/src/main/resources/assets/betterend/textures/block/terminite_anvil_back.png b/src/main/resources/assets/betterend/textures/block/terminite_anvil_back.png index 01a7c6d213404dd3eecf553dca01f805e572e61b..ab1960cbaca0d390109edad076e6a75b4335234b 100644 GIT binary patch delta 210 zcmV;@04@L50`38jB!9I@L_t(|+GF_t|33o^Gy1sy2jiq@2!`=tVo){%GQcnZrnxv9 zfnj{8A-D|yDQc}oV3+}DeB1_rYyc``STF^Qk=Zalegj}$Kz0SXYk>0j4L}b_^uWXy z2FL)c80LR;P1p=T2VeuBVSwRpq6`4}6&85t{wCH1@Q^3h086sM0Hz6KyUB^YV2m>j zARB-)`q0_vQHha=kkdbM9>A3!(33Gn9>A6#kOLLN3&^<-osGo>0P-bl-=}ep5dZ)H M07*qoM6N<$g8olfumAu6 delta 316 zcmV-C0mJ_80oMYMB!2;OQb$4nuFf3k0003INklb>!3_KcrfNTf?iY@_a zz|EdNG(+=}jD1JO{=`dO;Kf^p^aDi!!?67WWsoURj$AYc7$zz4NS#Eo)`F28_RcZd z1-jm^!D#Q>`b->t!V;XEEB67wI0ajh-VszKP^jP!ll#AJLVqk*Kz&{z7$=}murJR5 z00O+tz9&r*%Zwvg95Xku{*tqvf;j-nIaM_WSBO87A1%7bOYq=71~9 zxk$`Id<3K888u*E+Oh!TLozzN`C%TOLdA9hp@Xgmn${)owJmM-g{U`Zl5h>@z9W+W O0000k|B=ENxe`p&EK%N0$%VPBpBTO^4uJ$`%yWRjKO704V z6U;PwB$coOLzyM41ddsQ@K&i3I0l7aS?T@-7bF6nV319WfHD1>5{QAXrf>&8O+oEJ mOe0SMU#Flq@g*#q_`fY{opmA_+dEPK0000K0_6daB!8?)L_t(|+NDyl4S+BV3qSD#3m>qtGBPsr0SE91J6{#GBvEP_ ziUg8HTPcq1gqpq!e?ZMRgoJszA$RXh-s3+JtVEPG00000NkvXXu0mjf DuS{6m delta 322 zcmV-I0log^0o?+SB!2;OQb$4nuFf3k0003ONkl@TGTfI^*BovpYA7U21)m@;pj_L`pDp z4z>y)8Yd&OvC7V@0zjBXcDdGtfiN>sJwJJB9roh!{sDlGug_@Y;P5Z6ssPB|giw|7 zruoD|rjbjq20QjmTqtYGeBWeOs*vrQxPiSxq-43AC1yr|Vbm91n(RWF%YTWPe>dZA UuZA(cGXMYp07*qoM6N<$g58*uo&W#< diff --git a/src/main/resources/assets/betterend/textures/block/terminite_anvil_panel.png b/src/main/resources/assets/betterend/textures/block/terminite_anvil_panel.png index 9feb81d989aa35a5daab2e34752b0b006082f082..c017633db5e5480fc3a137b694060358d026fdf0 100644 GIT binary patch delta 197 zcmV;$06PE40^tFWB!8$$L_t(|+Qm~b5`ZuWtFLqM2X3y8j?VtT2l!Jg9C)Dx7YBzN zwUE#@Scs^6!6&j47^aZ~+e*W+Q@Kt7uWe7T%u?42aKZ|hz~FWJ%`p_H3F&Cvl;lof z0yXvmdTi|2T?4Kd3JA2wkx@V!#R7V~klf_LH?ZQ6+~o2%Kt9WmjCR(TyMVT3E@T4F z94H(aT?lQ|7j_eg!({tflaKP73nmx|{Ps8A*j!*0^#Haq00000NkvXXu0mjfLa$lP delta 302 zcmV+}0nz^90m%Z8B!2;OQb$4nuFf3k00034NklJQo!x6l|U^VgU8^(#Br)Sd;uw1};r3rxX0)Ig?=B$zg(epTUN^nWl z*`nqwalb3~TI{rhIVr0Gal2`O%XRmVZDH`&Wzb2zpnRe#P1@B+)lIoQi=y#}`> z)Sd2ud$GpB>FE9fd+8A5#~^x6_qmaIj1{;gsFi~z$L*$7%<~UD2Opm$DUHj#z3XBH zDe<9Qq|!uymnT>4^nO}UU_z%K`pI?Bn+tpKGY;s~R95W_G|7XAj zK$;m_tN$|=XM<^m1yjHnCI)8vxZ^eeWGg<+#2J9D8J&;M0FZxi+6*-eZy10A39n|5 z_XxQFuV!Kmz^R$!FhJ8xFcx42;L=Rc0B}k}(~RLFq71;L880M`FB+*63-~k>;{}Rh k0pve01}cJMEMmxd0G&5c<=DGFasU7T07*qoM6N<$g7j!gr2qf` delta 260 zcmV+f0sH>a0iXhqB!2;OQb$4nuFf3k0002mNklJqp4=5Juky+dx=E5Kmy? z1-zb(XGoFGCKs_vnL@A%h#;~oECd^g)rMsM6u)XGnKwK0%?c(uzh47D-D?2at^+_B zGv+j9#ZaAujTboD9}l23$bw-?LYVyu?&0@f_I?GaWQQXa@WPs0KE9uSz>!m{{Yz?*pj+kam>_!S1{At_@#IJLrP z2T@q*^crQJkLRe7sWsZfzqg=_Nx~r`XC^jfg>c)nGheOzPp7$K7hUU9A?EsZ`voQ>ZO~<6)oTZnQm|j#hEC zv^$=w1W;8l)JUjgJ^{f{1z0=5w?_cK`(jhtf4k7=oEfN$d0@*T8Pg4`=&4lW){5`YT#yw g9Gm%N&D<&G4a^HotEZ2iRR91007*qoM6N<$g7Ca$SO5S3 delta 346 zcmV-g0j2(e0`&rrB!2;OQb$4nuFf3k0003mNkl1v(xE9h70^(Ar zAQ^H2I(P@&dPgo^Lx*fGC0p(wOQudzL~sg(fJi(LC@yjw(wzL7_S??kd*Ac^9HBMI z?~ex99TfnFGzFk2OS7}z2I$~L>hl%7d3b(;LV<0eZ>|B5Fn@x(TeR;XpI@E*S^Ka% zst#D<1j%v(9-GvRY@8Ps7(oS+}?&AnuK zrRwz!rZTYS^XjFARat0*<75~>pP(M?d+5y?38N;Dg$1^Cp1@=P;5wC^&ALsbi%UUSP savTi*w$KT2zYUPS%v$>U2f}dv01P0A%)A+pS^xk507*qoM6N<$f+iW8Jpcdz diff --git a/src/main/resources/assets/betterend/textures/block/terminite_anvil_top_2.png b/src/main/resources/assets/betterend/textures/block/terminite_anvil_top_2.png index 87d0a05685e310036712fcebd601e61d8dbe6f44..ee1d9403bd96b1ec070b66ffee68b88290183d4a 100644 GIT binary patch delta 244 zcmV|alf<>RigxD6h8yD6#li8!B*B_DRbhnKTP zUa#~H|4o2oRj~*JG(sFW8vp?yV|W#E?g7NFJ~j)SRqw2-CT&2PqyiG_8C6(i-3lfa zC@Y{bpzgj185ROeWvXi^gW6otQ8wiRL!L2LvC zNs(?Fx7atZ^NqIIXRxr_M(lipG-=k-LNE{lB7`sw1Z10Kwz!%Y! zC;a=h0P~{(V4WlY=sYiKR?``F_N~tMSFX0e_$tOBfEYzK2S)O8v{_ zWqvdw-fW@YLj@sfw};{2y3cI`09;1|;ScnC09fCH%~s4F8LX28+wI7u-2!c}-A)mq zc)w>*z&aRcI?@?n^d{fhz!ifEM7Pn9F`JHze2x^ws3?~ArwpPP>wDPASYSr6bZt6f z_S7KFP(fJcO@A{nbDfgUBLh1b%L*4u={g*s7R#IB8Uvl@sNG)3pJ-d(LmlMLe7Z(J z#6c*zPr_m%ZE9<*Zy^Xv+G$pHZMOvKqX8KDyDZM=sYjQyS)_aQw-OsiE9(A krZf3@E(^~bZj2A`53698*uHHTd;kCd07*qoM6N<$f~5_yvH$=8 diff --git a/src/main/resources/assets/betterend/textures/block/terminite_bars.png b/src/main/resources/assets/betterend/textures/block/terminite_bars.png index 33043adeec53ae55e2c3aa3af90ff4737f82c906..e9be368c461bcf40e23e872706353aa3205cc91c 100644 GIT binary patch delta 211 zcmV;^04)EC1MdNlB!9L^L_t(|+Kp2|5`Z8G)Yo}M?AW8j;|OmOm?~v}q8SN*i5Uh_wNXyU2D{)j&rHhEE@+|H{7fKb=H{;p zGjh5?>gYw9yDrQOQjl5eW=7MEsTO$TLlQvS%uuPX{~M83hedb%eE`Z9`7MUQmPr5r N002ovPDHLkV1g*LVNL)5 delta 367 zcmV-#0g(Rh0g3~VB!2;OQb$4nuFf3k0003*NklPU%{ z3#7>jXt)6#txK2GT*IAj;KqkRqF${6Hy9VY3&T%FLOaaP&zpTuq-&La0D#LmoZ}Sy zblO<*KR=)!K$=>mDiwl{F}YoJ7mNR??!@JcK3@WW^GjmaDu3ey&aWHC9KAn;A}3>< zLW1*4BY?jtBmoH_fIeR$RjCv?I8Qcrvy=NF>}jFLxZWR<21!+F#@70QEgF5kM2cMP ziU1Tjr}VPYwJNu(&IQp=52p8r@ck7YHr+XoNK^>CddAdAqi86Z^<8Ouq>IR0dO)UTb N002ovPDHLkV1i}Vt4;s_ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_bars_top.png b/src/main/resources/assets/betterend/textures/block/terminite_bars_top.png index 814038122bf2cab2c576b2ae6991f25d250c84af..351d8fe54a0d55bcbb9b046e0ada61b3dabc50b3 100644 GIT binary patch delta 118 zcmV-+0Ez$E0h0lcByU07*qoM6N<$f{*MhG5`Po delta 189 zcmV;u07Czh0oehNB!2;OQb$4nuFf3k0001!NklM95^n7pzA1H;`13@kXK>gFAYMi^U61mPu^dIGLvU^Xny{?F*+PC-I?{{dn% r*#-=bbU+}W@F!(u1qxk2L~aBCfyFgRvK|7^00000NkvXXu0mjf`DRCt diff --git a/src/main/resources/assets/betterend/textures/block/terminite_block.png b/src/main/resources/assets/betterend/textures/block/terminite_block.png index 050b090dd9ed28e74f33b949676b42c8b5e3aa53..26c25d6ce847665dd612ff7309ed778e5f28f49f 100644 GIT binary patch delta 133 zcmV;00DAxF0mcE4B#|*EduB;QK~#7F1;K$)!~hTjF*zLcUoXsOk?xC3F>$^NP3HZa zCQasjo&1i$UR~Ocq-Hzt*QUO|?aoTM1v~rE69*HBVN3z{QJ;HQMR(L+SW}7j4 n=XkwV=8fx>$uv11Sy=E7*}zdIL`tW&00000NkvXXu0mjf-o-r> delta 167 zcmV;Y09gOV0qFsdBnkm@Qb$4nuFf3kks&I7d`Uz>R2Y>-j|&b2AqYdUE#Uo6yoH&` z5+U}<&mald&pDV7yj`~RvCE)`d>RJT&UKMZKm@9AZ%>vIJP#l!5lMwh68&hV24t~E zQ!H_N_~Lg7#Rciq(c8mg(_pp1*F(EM&~FdrY+2nG3wFXfjyFAjJ%2Vh6C&OaKM1}O V1B2J^^wGLirC1Kydm3BFoaGe%Y zpSq#|0R3ys@&?eZCxErx9YgDWtgt}t>$>{i@7;&BLYa0Net*;}+uSJOt?JoO5oj&;+z}M!XB?>AatS4_J@b(-{Cv!&5B)M@9eu-B0@k Xef12gE5#==00000NkvXXu0mjfHVI>~ delta 387 zcmV-}0et@X0iFYpB!2;OQb$4nuFf3k00044Nkl3<-^?aPArZcI7|F<5N~ zz6aqZFW11&!NhV60AMA-O5%F;#_f1Uc6&RX(Jq=WD+vL>P;EAVuWu90MovF#Kmj%< ziiI-F=ktp*AK-iWX3Heg1^{-^gp0#$PB_7O8o2UI^mHz4lDan!heH5xnoyF0{%>Oi zZr(rX6ivx7&3u{%s|}qV9!XUBY{5!G2O)G2f|YbaiYlM0P_qriLOY%jMtyFzT8{Sm z{QVg&H2BNs0eX-mRzXQbK~#9!V_-l6j7ib|k!hj;V{7$)#^P)U25JOjAe(ptpo&Sd y72Vk|TajHuo?+B*%@7Sl>cs*Q9*u>el#~Hi17+b!HU5YI00008e*tq+M?wIu&K&6g003c0L_t(IjbmUy0*pz~|B-2801IPl^?!zU zA0WKh`r#S{1sE8F1Q=kh`QJO0k#y6@a19d*@BIgoEgkqk sWFp7eC=Ni01tc&U3nb_t@T3d?RXatXzchOjE*vUYfVE!i<2G|UMg#$^Nam51ZX(j+I7D#ph*cH&&AlVC} bfHVLA2=tsGpqA|-00000NkvXXu0mjfy4Ok! delta 315 zcmV-B0mS~v0oDSLB!2;OQb$4nuFf3k0003HNklakE zDeNwYh!!?!VrQ4aklH6OwwEVJWpTv9>fqksu296JxGF^o3D}4r60fiyiz5la`>(Qe zs(+Vdc4qcB9PkFQ(l|leTiDw>>iFiGb;25TS-YvSnMzSp5`X4*q>FRd-N75gl8Sj& z=G**^fQ8g)hD|g0%19>x9G(@(-SmDe(5Iq+x`D zdy~Y;^&L;EF9JCJ-m}N=TyqBM*s4Mq}@px@KXzbk{n5a+p!#-w4CzpeO+PJ&AJ zMmng%`Wm%i;xtrTNML696-Hy2yprAqWkP>r=God!S)=a!1ONCV`~bSGb)9PaB N002ovPDHLkV1mxroZ$cf diff --git a/src/main/resources/assets/betterend/textures/block/terminite_chandelier_floor.png b/src/main/resources/assets/betterend/textures/block/terminite_chandelier_floor.png index 5beee74466f13b3d3b33c5a06a3597e5ee69ca16..a44c68b60abbaaa3776baa39bc1e9e154100a0af 100644 GIT binary patch delta 265 zcmV+k0rvjS1Ed0wB!BBkL_t(|+Lcl<4#F@DbpOO3Soi@Gtc*;EnIAAQF(R?DGQ-9X z5Ca=xV?;7JlS_k}7WE{nvE#d55=*sOs%+O5)qJKBkk=%Gs#@%yC*@j2moOay<%7kO{+_Ul)Oz!CTg++;0pF4crj$5~)l9xpeqAsPayG0ubqiOjJV`MzH(C7FTwn2${PX(eR)OTm+3zg?+ji!7gf^$0;2m_$Lo5D`I0Zf<#c%MqB7)ce P0000kLoD4)69ULYZh+DA5x#h46^(?6FQp+A{FQ9C8rbhm=lN?w%|;CeAFPCNNo^Q2A=6xs>6-R5IXl;6_O`IvKV>A4*CF=cGltxq*c;bCD_D5i?vb6Lb8?M4@9sDf#7B%DK?d3vDr&jC2$*0 zHTT{#XU@!Auz;$fsx-rnrg6?j0H8JYwX{;CHTD%iY?7N{M}IfhO6J`C?Atr|2`hmp z4vA*dB%V!);tep2Bg<6$0-r ob2%rA)T&A$k6v6_ulxV-4F?a0MvVz#r2qf`07*qoM6N<$f|LT9l>h($ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_door_bottom.png b/src/main/resources/assets/betterend/textures/block/terminite_door_bottom.png index 105806b12df999158f9b9c90c3f538c533ae620f..3491b811a6f8da295b7f4d5d8aba8f3f531bac6d 100644 GIT binary patch delta 257 zcmV+c0sj7%1DyhpB!A>dL_t(|UX4?`5kfHxOLk%gXxM;`mWrdKW&;LbkypdfvjaU1 z4HqI`l&5^iQRtpyM~WloIe$8a<>PMfhh13Qrhpt`cR3rl#@Fg8_Ulz}g@9}*$O%|; zpVhXTRsi3IoKB>G)sPzr^vJmb2>LSC_CA4NE%*QtEo=gsR4L*MguroZ7VZJgVsAFL8hYnzy1546{rQE--7SlcPcWAHbOeA}Z@^g4Ig`r^7O!uhbAOo4NobqS-5P_NSl#cT zv&`@5cA^4+&a!>5u|ZDV@1d3}fc*ku0a$L7SOcagNrLLl{t(#vW!(QpFjaLJY^;m7 z{D~0ffk(iS>&Gcd*MX@j&u+kSt8F1xXIbD+FxET8;+y@AF-NpikP&3{;7C%5@7{sV z!}*VZ;|_xkWOa=BZ=0QV<3Ps^24 zq$o)xVfyn8;674JBrt8xPs*t+!uV-F7?k?uHi`(-#ollKG zz>(xHSd~-)NebA>_rLGL`4FY)yS)Y4u63es1<8f%~b*@sS30O zT+~(uU|FHW5x^iLh+tIIVwUfL`ZWF0vH6|#PVYvM3)0NdgKT&Msu0wKlu{rzwiaQ`9+GlL`X^i P0000o?j zIU4<+yxLR>)@jOY1k>BQN@i#!sA4z}GW!D^?|Yr5(ACUe-|(sgFI6mmHe8JpzE>M} zc)#ZqH0%21$pvUM#c%+C+U`)9g>fRdS}cjY%q-8rXg9fq>@jb{SJVv5d#{m!Vv^K? zRNEc&dqiZmB64T$Q#L2d#4;~`s3;H%!7Ai(vfA#zXzBaIq8ey4CXU<50ZDrML#3dW zLE!m}9Q2%mFa!TWBS23sCP_<(VFtmJHu6~yh&b9RgFnb2(f8ygHh&xko?oV#(*1#7 X0*}+1nyAjz00000NkvXXu0mjf3@x*e diff --git a/src/main/resources/assets/betterend/textures/block/terminite_tile.png b/src/main/resources/assets/betterend/textures/block/terminite_tile.png index e8abe370630f965076c4051858ff8f146a816f6c..3b31396d08c1c17664d36a28bdfd7835d754c559 100644 GIT binary patch delta 118 zcmV-+0Ez$70k;8=B#|*EY*$G{K~#9!bR#_70N{y3IFUmQn7>JqA^bOx1ZLSN-T0hOF1J)zx%vJyZ002ovPDHLkV1oS&J)-~s diff --git a/src/main/resources/assets/betterend/textures/block/terminite_trapdoor.png b/src/main/resources/assets/betterend/textures/block/terminite_trapdoor.png index db72e0abfa6b3153d182f39a9d34fbc4d4826dbe..e904fb281839aac1c51dbfbcd0285a9c30dbaf1f 100644 GIT binary patch delta 238 zcmVXK4m1GBfSC+p z0|5g*3~~wFaIg!=F#zTgunVAGfSF8;0U*sN2EYOc#3p0_JZBI=Ucd+gA`O5CDzX7E zzmXIMuxNzEGqDCx6b7L5f-?+25-`^wr#x6fgQZw_IzTo6?kuDfhm{Y@Oz@Nl3J78~ oqvukX0dNcy0Apk}J~1E$09>$a?W-tv^Z)<=07*qoM6N<$f{+$k%>V!Z literal 1648 zcmbVNZD<>19KWnhY`2aLI%$;2ZdY|H>*ZdOCb_fenk7vW=+)2#T0tfCY9 zJ#W9~_kVru2YM?W?xQclVp)qXmU{MpLX<*_hkWthCaew(5fh%%=m>dvjK?{Mb z5}nh*;kogIG&e1AGI4MSA1v~SAP-CtFXnTq!50HWjh9DbYndYO8pNCq5J5{IJ|)EQ z5Yz!a;PR3Z<6&_h=VH7x$9np4mS%hu?V}hsNi#g{<=q_KcnBm-m(%=2IMR@XW&t8= zni@}0g+jqqaJ!(Mp%{+iD4L~MmP82BD5<7cBvqrg$q)vHq$`@KKoz$b#T1+|0|e5v zZbDvb(W*wnO~_$XQPe2LMO!A-fU?xWX)}7RCR~;%kOO(3ng+r$EiCeqAhh6*rOoGC zXu}+tMH)41do0>Wlr%t100YkG5*V395__A9X<2AOBMbk*j@EX|8jTO>Ks2GAfH2n# zRJ_T8heB3h{P_M!MU`Q}=(7Yh&VaCJf&jtNEQ3Nux|syc@w5-U2WU4>({-qTQb86? z@yWnYR??;agvt`1hI(E^j#Bbs22h%ssYw$AKBgL`s7fFf4iHFHm!imgT9yFg_cLUQ zPIDyd@eGh6%dw=)akQIG4{$!#*E}DF(u@_v=6U&lo_|$W&?ORcPtVf|5+8y&s0&a= zUUpk4TuUWBsu(CA1e=bM?JW4^1Wd!e`>V>i3>&Q<#u zovHjD>%yjwZ+ZC)wsJSqb>ls+>Qsv!!9T&b^-f{gbeSS7rO|I=f z+qt@+9Pf+VK3VBGw01h#Gp|3}A1@zG{#5xkIdo#U`05AXa0_*{hB!2{FK}|sb0I`n?{9y$E005&&L_t(|+GF_t|33o^*WbSMAB1N< zy^4Zi;xNpB43G_QTC?Xr2q*75hJs<@FpSdxms#uogRo840<0J&PtXN~Fir!o`JbdP zAmn#~E z!myaZX#hwPJsqIOKeAys4Zx=f<~p1Ppex3PLGmbx2|X2(njZjqH2d-gdczR_0000< KMNUMnLSTYn6jqb~ delta 330 zcmV-Q0k!_@0rUcpBnkm@Qb$4nuFf3kks%X*32;bRa{vGi!vFvd!vV){sAK>D0SQS& zK~y+TWBmXBKLZRj+_?s?geucg}A_c7`XrL z88{j&71DNyU!$&Y59dHQngXukKf%siO2;g)9C=Ag34+2DoLCXH)C@w&M z_d5*WbO9qHT%5sW)_N4fko}Den4mO@W)R?%5@Pr##0$nCHZA}+03C>Nu|ip>Y;=Ir z02turz^xes@ESl!GYG%~5f%o?`;PtRO%*R c)X2a9058Xsffzk^rT_o{07*qoM6N<$g1Wnjb^rhX diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_anvil_bottom.png b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_bottom.png index dfdba38756ff3d884f39349901a522314e7d35e0..14d41562f215e23262eb696ac399fcc20b8678c7 100644 GIT binary patch delta 161 zcmV;S0ABy90=)r{B!2{FK}|sb0I`n?{9y$E004AJL_t(|+GAiCG{9-ip8v`Fj{Pq< za~e#8_%5^7|F`K{0H%@UL2L{INYM-u!!Upp%^*3fE`TY3VO*NAdV!G5=;9a#kfIqR zj$r^PnsK@So1d|1#u^L6+Ke|A2x&%^!x@c);vXi5Ga8A}j2bl%2MhoJM~Z~YmSp-Q P00000NkvXXu0mjf^zlH6 delta 255 zcmVD0KZ8@ zK~y+T&5=tA!cYuFuLVVfs&wo`mm)5~Wx51$5st+VIB`;J3nB`B?xP8hM_PCzJ(EJx zbJH~VIi326`D*>1W&@(0lrMydUGV6i{w0$<^ur6pojLdZf4QSfgl25x!ZFvFK zd;qFhz(g}XJ)!^r002ovPDHLk FV1jW`ZaDw| diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_anvil_front.png b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_front.png index 1bf03e69e87d0c160ab57a1d5d0a3c0b3ee91477..83a1ac999bf7bd9f758d71f6b8db0fa6b5c0c103 100644 GIT binary patch delta 201 zcmV;)05<>f0_6daB!2{FK}|sb0I`n?{9y$E005jxL_t(|+GEH$d+|RA*WbPb#xtK@ zMZqv}bPUtS;IwAX|KxqgFfd4*7|h@@YyE!^w&_|x7G@x11Iz++40pl6hXFbuD0S8G$ zK~y+TW6U{w@jn9)2=g(5CPhf2fj81Fz{8tp>0&|eT{deD> zEc}4cW!8GIQ9nL>1PhP~z%GEYu>z)dpP?*N@K1;rOb>!EfYNY)>?Lf@-;)-IqK658 zO2Yv+2P=b?q9}u{z8Hgsu@VEPln~gzAPi!o0}KPixLBbq2teke%Yguf0WbgyBp3j> z3>&~O;MKR^U>X)HAb?9V2%rQ=^1fsLIr+I!G{ao-{o_|K4FYqWtl$dZ43K6SSss*h zfSv}B4TBki;RTQ;7zP25CJ=t|_zQ|ND_{V{0A$554AO+I5jl~ecmYHcn*#TRxB&Gs aFaQ8H@quUH2BA^_0000hurCuiSLsSpTvjeDyfJ(HQGFO_~1Xy(P*eYNh`uI|tEI9YUF^@9}x zc*#L0qMQIRFW`j$CNME_1T1v$WSg-t158k4#tH%cUNxC9xj_Z)xoz%p3m`;c!bRwS zw~$X}OlAD0R>4! zK~y+T#gn~?0znXjd+$utLqRza(ZEO$#LUddN4V#>2lF9}1p@;G!Ds_T1yNA^Nt8Ki zu$pFA6AkVIS!Zjjx@OpooOALHACK$HXoKJJ#1(UqR5G8ky4+=VbaFkMC7sVocz+gu zZ)Nb)i{R4+e5gNM%W`q@W&+b_e(?8Ut`{;7#RPByMNF>NzNA%7`EaZObp8h#zUn4etQ3gMbEb&+-1^*WAiK4&9~<1~O6%^+9dGytEo zLED0MAK8 zK~y+TjgY$z!Y~X)U6?2cBoGUNp#uv8|Hx#M9&AruhX*~YdrgaTr+-E3zF1*FJ& zhEM>?xU(OOPypVn`0`*M|r`2e4r V02#^1I^hdxq8xcX$6P70e#dt9`~U2g_1@cQe$LG>KK0_3!VrT% zgi*Hw?1)PQDZ+Zy0Yw~)vlZYafYCN#e5+=V!Knkigk52MQcD`5b|w__NFAtcfNx=@ z87K^p4nFD0TW3? zK~y+TeUrUP15pr#CrOnkS%{cIwAey~6tT1O;d~4qAM1-oR4?9_V%5B zQ1MBxlWMux>rOBr(GShuf2~=r?Pv8J#DplpfOawA5UKT`XWi-`i0McP1{`t|D2eGv zDei#Q^R``#sS*tQ5MtgcW~36qz!ONmx~Ob&_m;-V_n`!Xd}d&re3?oxQ1SHsBMEsh z$&H<0pfdxhJU~rL_t(|+Le>R4S*mJ1gXtd{Mv(c z*n=e)pZ)*nVAf>Kdf@;`2nTWRmN^VT#&8|6Klj+J+q1Uw^6nAyJa|LJNJddJ zPM>o(0W0Do3bisFW*sm|N{krOO~48es%<94idke}?@UKU2U1E~?OPsMh$)ffk#%5g zr(k9osF=_YSGAD>1*!3`E~I!=G4NiWUc*hG)K#plEi#}B`)BID*hc$=Rcs;NpHAc~ T;J_@z00000NkvXXu0mjf52;`1 delta 358 zcmV-s0h#{w0gwZbBnkm@Qb$4nuFf3kks%X*32;bRa{vGi!vFvd!vV){sAK>D0VPR9 zK~y+TZIZ!C13?f(d!v^`QBZ^+@vsLkg8pMZBj4lATaW~D+JjL-LWC7vFA0%1SVQ-a zf}xq-?yBnEsmx*WK0ADLd)s~;?E0dz<=eN7?#|QwxBapH{E^=G(!4 zNy>4bH=Eq7ybuUbRMG2dXU%7qlppGwoJYhX5MUP)icqbu20)tk`&(n1xak}( z(6e_F_0kU*?H5cR;Y+CuWt(Ysfgs6bVLMD`D0TgFUUE3y-$fiRie7g`i8qe8<=>Y5V z=c^!JCUHFWL;*foc94sp9Hejhe}p8ki(thlMz9>TM%dJA5ljbs6WO+ia}42%m=dU6 nWi9ZSntmoF!1o-D7GTd0+sy1J{CLXi00000NkvXXu0mjfa<*zq delta 387 zcmV-}0et?60<8m(Bnkm@Qb$4nuFf3kks%X*32;bRa{vGi!vFvd!vV){sAK>D0YXVc zK~y+Tosv6B1VIpny9Wd{P|)222nMTW#$LeKTzn+vx;{>ztX@I!Fs7O*8;BR!Rh$V_ zT-dh1nyz7Hr$@vOn(8k8sjk0z?0WagnFhXIhhZ1zJAF5X0v^MH)xA^MXoOe}{qoj- zflI=Ni? zSma}SG(m1wc2DwG@B*Gwl1h_>No?qDpke_gZTxCMJNUN+k95JiDoqy9_{+w==$Nxu z&^PAi*y!CBH@x-x5*IohiP*UB9f}tCRy!y_ba%XCiM%ySb3sxe@z;iJ4#O!&h~*Sp h9!hxze_@oR<_FF7^pIrM+iU;;002ovPDHLkV1gEFwL<^^ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_bars_top.png b/src/main/resources/assets/betterend/textures/block/thallasium_bars_top.png index 9036f5cae9adf0c6b5893071b09fd67db565592e..6195a42f22c50ab42ad39655a34f3cf596722524 100644 GIT binary patch delta 125 zcmV-@0D}L50-6DkBz6R6K}|sb0I`n?{9y$E002=*L_t(|+GAkA16*dU{|~|p1yT&M5r#p0V&vda1+oc*L4Jl|V&q1n fks8rB;JFb12Qq~?(gw{300000NkvXXu0mjfx`r$4 delta 215 zcmV;|04V>O0fGXMBnkm@Qb$4nuFf3kks%X*32;bRa{vGi!vFvd!vV){sAK>D0GCNb zK~y+TW55SoX087Z!cZ<&zyzhSf*&6~GQ7Ke7s|s9@EY*#^&5sy_wGP>*a2PxxI{&u zEZhLE0mJ};2C(r9Kv~!U!7v~M7-7)_3TR$?o92U|O_wihqpRqClexoJduwk(jRujk@j0okw)j~7X@8QmW+ zfQ<$)jc?cf?ksKu?=}@F1O}@;2XW);ZBJI)RF195{Hvu#w`yDhAT?l}Knc9tza-p{ ztL@z|b%4*xxl=|1(GTX_`UVN4nrCD(l+eKM+UBNic!SL{x=lz^HQ;BN_U6?P@RRm# rI*BJOE!m_aHywJl4iFV^_zP?wwQS>D5hl-(00000NkvXXu0mjf5B6;# literal 1667 zcmbVNZA=?w9KRt;#&l4(U>08Vyb(78?Y*@Jchd3Ff;8>`OOs*%^?LWTy|wq^-9ZZu zU#1XnnNFB7en6)Q(Pd`IVhl1hY>SD>rrSsqmBs9X`av_|7TuP8Kzy#W&1Udzmpu18 z&pp5A_kaK2cxU^=n>LnhL=a?Cpv@nIv%?-63gG*|t8oTSMS9y~CV~`yW{-8RRTq~d zNa1gCsN3r1cX6VoxCBXy09RVkAsRvI8`8QUCV+)TKulJ>*smYYVW=#5v9O0Hc-;r$ za@&vrx`x_A;!r|lC9Gj5TA$`1fdVW6O)E*&m0IMY}X3hLbGI;sk|LloKMH=Adc`X{Ty#%Q5(YDH^hF$(oAVj6y`~x4anC zbkzh!&(o@A)=ki1cv{eL(nZ)NWq^{H$Lak>G9z3PagYQGP%RT;$vjq%YnEolwZEax zAKxMXx|ZkjGS<{ZQSu^8t7QP1k#)$LXfrgZ13U;!t=|wq%K%h!n{AEG`3xXfni0~p zWG+yhIh9eL&kjr-x+5&Bl9nTUmLU~P+ zql0TgJseHm0)<&436}7$U`gbnnxP2LW?2zp0N2$RhUPuV`Lv{FK*3NuI->>8a{<+~ z1XTn9zZZjMyJT77=m^U&5?$vcr3mX}>fD4=U>J|nLqvoK$wulV3gqtlHL>3gZtlMH zKks)KGAu43dD}d8$=O-KwaF%o*I>3Ny1-M}RZ>PXiNFb>o#0+fv?B{7Ec;o$Z4a!{ zrs4pS{zJG|VWt+fQi1`RV$fUvC8KbtKWI>*VMPTb*m;?U!tT-m*Iq~yeR zTYCB53tF2C3dc^4-Mz1Gdb-GQW63@FWwTzgbm{C2{p`x&;l3k1J&%0x%=>-S#Rp&b z=4)`J`Cc@=Z(+mbJ(XwXYfc4b(N|vnVEbVCv6bZuyWQ)t#!mz3>pyPU|6+Ui?9}W_ zJE&9c?bS6gulAlX-?|t+)bI{?G&~!yB6}f-$+cI}zn^;&OExxx*6e$=$`dwx0 z)M)gcnt_FdxvDpQsIa!;U4cv2uZ1V>yZkx-!0^fe>wHYMd`rWVOg;F%{^!uNOTX#T94dD`xLEm6Np z0|5P%Q>_4KW&+LtX!Zcb&j2+O8^G)e91p=5S%+jf<4=u3Ku4| z(% zo`?`Bg*F=JP?jYC;96Z0Q6P#uN0H}foC}Rag#G$mBsxV_AAiL6=bK1$ibZS$5#c6M zDoi^Ur?8>D_5S(Q&yQQdwfS)?cGJv9)<6OX&7<)Iqwxgi;uPd_1A1Ui_6ygrTCF;7 z7(hf}Gb>?l0AM%Ge18~ovTYcj&^ESlF5J9aE<2ty&O!V;#-Y0xu@U?AyI`fVxR}BFnPGrcQlj4Yu*Ezk7V~l{MJZsc-*>M5mpX@e3#~ V*^wI%Y*zpP002ovPDHLkV1lM3u4MoK diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_chain.png b/src/main/resources/assets/betterend/textures/block/thallasium_chain.png index 1e0bc26e200d19b74c0faa160c857d8c75053231..02a0fd430155d23a64599e2b4acc49c827a99ce9 100644 GIT binary patch delta 92 zcmV-i0Hgo00eX-mRzXQbK~#9!V_-l6ik@-*k!hlUR#L@(mEa6825AIg5SwTNV2Vky y72Vk|TajHumSI$J%@7Sls>K2_9*u>el#~Ip0cQ02uXrB-0000a delta 148 zcmb>0$T&fzp0PN{-HBn{IhmIX3=G+xE{-7v+-loxQQR_{Lw75+O~-9@|7E4Gx(Y6&D(A_{eQ=Af`C|EsxtIU*+SbJ}2hv zzrSx{&dUSrO2U@s+}JcWHt@J5H&z&Y@RVdY^(Iiq=p0|NHPBuLPgg&ebxsLQ0O8X) AmH+?% diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_ceil.png b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_ceil.png index 0ab69d7468587a60327c42125ef87b1099752c89..942ba9ce9b8eb5b217c7e79d3456b4aa7f82be16 100644 GIT binary patch delta 190 zcmV;v073uU0@?wPB!2{FK}|sb0I`n?{9y$E005CmL_t(|+GAkA0dme>{9k|j(*K!H zuYzd?a)8UM_5YpL>>*wA|Ns9PkZlLK1|)_TfE2=<3R0ZB@7RA32Dt!)VFnS$oCm06U41k3LNt$uR s0?AQ{9t$M90EA(&L6#TL@hHFz06Xs6LM@wVy8r+H07*qoM6N<$f^APut^fc4 delta 306 zcmV-20nPr}0o($RBnkm@Qb$4nuFf3kks%X*32;bRa{vGi!vFvd!vV){sAK>D0P#sg zK~y+TV`RVqa?W1-FU-ftAjQSZ@a)@PhDKFAoN93bms#uoJFVICAIilFu$ub+|9^&t zJD2~%Y=8UdKf`1rJw_masz3lHD9uoR`_g|9hH@F6JpRIP>gGp=!xvvMT)Y1oDvGIp z4sPVkr&qy(D~~@1^O@d#2GcO`Ply*xhg(X5>2zsruwJ+eF2DE#wsBvG3*+8kXT~4* zKQdZ7Dl>pEhz$}0VVF9+02Brw4007HHeh^g0PX^80A$nmk6*!TYyk)YM90DuV|}b@ zvAO_c8?IO&3c&mfN<^Td=m1w3i~3y=YjBy3knL_t(|+GF_t|33pE3bJ-L!{tad0Hpc+mwW$VhLB_c zNYjHqui+TPr>_CCo@@a-AEX&XgZQKx05$|Wc&+Ly#M_8I#^(oTp0 z2?i#RSojw}VgMut23`_Ohy`{QSO9gP5|nbz!ve&!md^M3?)$xemnJ8U_HG{7%yC?A zajY=K<}LBqm}383iz|ptn}V^E5y$mCipQF3`}=lq-1PH;gz zthIzYwuEcg!#<4|R!Oiyl~58@$#1BW>mLL#*IHI06)7ED=)c25PdaGRWuSzzl)C)2{E3Mzrs{H@JW(HhEQ6 z6&5l<&6H#vY8j}?`(+KvavN$9$1TtQ2C8L$fU>M{5Ji6lJ2otn&_m2-*FzO71%8DG zi6>#6)JVt#GwrmN7M2BzengRP<6^<&nc1T2I#4w1Qijci&ZR z7tY#2yiEEK+a#R~`>cJ1tWTX>uGU$PJ6kM_l!l($ODik6b-R1k$zR{yeY*1S)p*aI z3z_#5U#3z2hL>PCeY^J_mrkdzr(V~d-CEn9TmIPhRy?#}&-M>rKcBkzDL0&db!gyG zW%rB2PhRf2x!nI|Yicg_`N~!K{NwePcPgn#q31~NwmYmFpGlp#@oeeVc-&!&qZ5Uj IhfiPl1`-C&xBvhE diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_floor.png b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_floor.png index 04fc62d37ec0a673f670833c197ccca8f0631693..90b9a25b20390d3e5069370320f4379b8fd83c86 100644 GIT binary patch delta 276 zcmV+v0qg#o1g`>+B!2{FK}|sb0I`n?{9y$E008DmL_t(|oRyL>3IZ_@MRPXsB4Xd*FL5@z%YGP=nf&?tcakvLA8q$Ua@2g29&;&Vcz<&vQITC2PeV%2Im*iZ7 zM^*p_SZ4K>J&OA(+NYV7yosL^h$4KMmAo@F{qhzBenGdOL)B7pt`?EL1qHc=o7RYm zfQWh%gqoCdCSFBAr1U^dv%&bU=6Ts6`Rn!MS^>e^?<|0A?CTfmoHjx;$epzcv^{YN ad;ud^x_G0&Xbr;v0000D0kBC# zK~y+Tm6A;_LqQaVXD$gvHQEUAv8Yr?rIiqZorb-I#19a)@gLO2A7G=w#!A}60y}IZ zDiwePYeC0-&o$S*(Iz~}y=Tsu_ni4S!>0~o!c$+$K=drlmV5)I*kogW z2d9CG5Q1ztxi3cTeH2$93~ipX)yO?-YOW#yV(^b2KFBwMWLH@oS@_Cb_LJr9R+>z_ zXe(eRZf7marQgVxAgRaZVm0Mf1`D5$@9YVSt&#*tz!AtPKqwKR0+NGtoGI8gw(O|p zOcp9eDwklX_l!1HE&QUZ6(V@E0V8UEEDlOm;r}WCWG5tgf$57Qnwe?!aw!VLk7*Ea zc}U0A^`uUZ;RhCOPiO)iko30MsFlWUAO`#mZgT-V9tf}Ek9u33_6o9>$t+nVnPKhS zEmUxEu%B|Z=caOc`Al|uVnnN~Zr2yy5=in#qI_(5mSTA|M#69O9Y~DlZ>T6;VR&eG zU~^qwHUCF0bqf6rK!oq+`jzfuH}<6Ot`NTpNQPI|Iqrjwu(@qo{mTh5A55mYA(G5aT1OiTL_WTE7ms#uo&wP6If6m#9U^Yw~!&d;1A`r&r#N>U){)4bh zD0Ut?3 zK~y+TV;}|m|NkG1SHC?Dq#$f2s2tH?&ASu-RoKPBG>Fd#79|pZY&PXrf$|s_PJg^Z zx(m<&Nd~D_0BP;WJc%P;;g+&FuW;hzvMNSI+?hznR9+<=)+ zuYy_W(%L8zAds^EIGA&D_btZ5ZSi0+bQdszY&doEBbb8@?!WuS@bJz{h9m6>P!UW3 zF%AuYOmDbz`M(qwGsClQe;M9>`p+;+*$CoA3>SdB01F3X@Z|9qu*(i#e8q6>{%f#C ym}X?a1hWAdfE3PkvSI{z0Th_9fE$c}fdK#)ubO4{1|J;&0000>t)Bvg&007B%L64l{De(XR N002ovPDHLkV1l67D^CCb literal 1456 zcmbVM%Wu?17&lT0Z3Iy(RYHVA2Gc_ewa1UmZal(-u$z*V>NE-~B^8G~)R2;a1lndg5goJu2SJX=nRf{V+fIv(uWU9jUL>*5Utd{=Pj0-?_*86n^g{E1zeYHgh|F4}5oe=D4Q4^*C&7s?Fe2 z!enGpE}O#aM+u-c?aX37p=?Vi)D-P7_VwRy?&&DxzP>RZSV2-1op5C*6&H6_8*FEb zd0bySi_Y{35JW;z)Q`GxM*6-!wq3)riB%@9hsKW%+EU&k>$OkDx?tz)9ij8V==n{r$EI#@b#Axa9`I2(rv0*3oE!M17T zE)9X46}V(O?GBZ5hDBFIB32n-?E;&0q>@=jzJj{AenA0*HV6tGFSR9#3Kf}Jz6NfL z1M*UI))*uLuZv7>r%Wtg12a$N-Xx@&3aVtyG8vkTS!WZ&)Sb&J)KvZMnpnzW#;QIJDeB%g=XnP$2r2mrc5iFA})uX9cYD2XCPeoy{ALrdTas~g>%i-N~ zojZZUILMd99D+?T$wUm}D}_0A>YE=f!Hi?|+EQcTF1w5lJlWr$+uhjnpUvHAHPL%N z4tfvwrf)8MKlSKX{r=$_55E24;JwACk7j-~&mH>U*dNdSy7bkbi)X7ppPRkiK5_s2 vouB5eKRx=(`%_yWuymqc!Mn5870uMN-5vYZjdl84K2z((K~#9!1;Mcnf-n#U;2!?2^lou8wnP^lOne7l+C*Of zNlaK=lm=YI!!TOv_hG%CFE75^LU`;mZf_v&qUY#9oQ6U&3sNHz21ZgN`I#6=NuI6_ zc>gweBnkm@Qb$4nuFf3kks(ii32;bRa{vGi!vFvd!vV){sAK>D0FOyT zK~xyi4a~a^f-o3{;mH(=Mip}{}EFG<@v z@5+EbQgZ#eK=7vLRBu{@FeQF?`JsWgV4r>NKm@0|GCSG%T5%?(SIB-i%>FvSpGl&b9=t^ z-=7m2gGtubB^4AR0kSNCf+gE34g~a^lM9Hc2#N!N)*%Os|FnSONWdDaWLujpL;_Z2 zrIuPiK^&q8_zsj<*FtNy3Dr>?TaZ(BT?^zV3YaS2xF&5S(+2TmjdCzmI}aeKfCu)o vMy6`#L6S}$lpd&Bnkm@Qb$4nuFf3kks%X*32;bRa{vGi!vFvd!vV){sAK>D0l-N_ zK~y+Tg_GYaLtz-lpTm~zEH>K?jkJaf&4ta9Bq^3V*DhTs|9~iefhhlgl3N$bg$w0J zE@VadQKEKXOBRcb4Le(gqwm8zhi!c7ZO@+fJn#E_pYuJ^z{-|JWvIA+`ie@EOQnf_ z5AfJ!x>fU3CmYFZwUDDmq6WE=uGKe+T|HCuUgZKjC-%Yi>Je2SC|8_()Jhg(AA6wC z0X9R+o183#tT?|SBHy5&&ZBpf+CTa1K%8uLI_Pk2Lc+==6F=hJ$x#VQy-QFwo#BoE zA0XP&V{&}osE-A>6tIMm9v5p~TiD=#q`qANZU*SmAME5y@w@@A>NKwKCP2&hZ6BM~ z&K75i;=t6rrtg>~K-1+-iW7prB%t^-{>rfwTv*lK?bZC}B@!#N`dfy`gW>TZ_Q&yh zhzv+rOh)!WIP$-Q-q|G$9)NcMOAsb9*{qxdjD(Rc(UT84-ZVpfXbFHSpWb407*qoM6N<$ Eg8s7dF8}}l diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_ore.png b/src/main/resources/assets/betterend/textures/block/thallasium_ore.png index 84b2471f8926355e1e49dba07d9b9efe278f289a..13bf31a4b26eb22b27bbe3bd04d7ac081f2119f7 100644 GIT binary patch delta 182 zcmV;n07?J90-FMmB#|*pf0ju^K~#9!1;H^6f-o2c(2s?5)j^O=9h~cAoUNWfLfBNK zj4qacw1TyG03l9_iHV%j_n@SeWtfFX33em98^{DxV@Cv$IW6^?E8^do7wvF~o!>Zj z&O*q7R~lBrjyu0L!r+0vyVf6qJt6+;g@+_kmqG3@tY)?*ksIvaESi@Sl|!@VO9t}_ kQMGmD(MxckR4GB?4}o@Bjb+ delta 216 zcmV;}04M*O0>1)~Bnkm@Qb$4nuFf3kks(ii32;bRa{vGi!vFvd!vV){sAK>D0GLTc zK~xyi4a_kPf-o2c(2s?%>LAFb4$gHl&Q?z#A#5u0GrCwhTESX8fDk9e#6(Uh?*I>i z3>85dAdxT|YHyI*pK3Fb;HlNfUVTOMJF~nQF0u1!>&~12l(SO75X`vsD$O+>=-X>U z_34rmqOV%Gh(mE1WR`=~%v6$R8vD0m#YALK&hth7yhK=TZ92L!4l)sfOa2FebuV)Z SGe~m)0000F!6K9%8rY)Fc$xzLwQu#Y3#F7CBJYD@<);T3K0RVh$ B4{iVe delta 79 zcmX@Y_?&Tq3KwH>kh>GZx^prwCo1~Oa29w(7BevL9R^{>FVdQ&MBb@0N!U9DgXcg diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_trapdoor.png b/src/main/resources/assets/betterend/textures/block/thallasium_trapdoor.png index 9f05c7f376142936b93292ba507874fd2911e9e5..30b1170e272158d7e4adab9693d9667edbb24ce2 100644 GIT binary patch delta 343 zcmV-d0jU111o8rqB!2{FK}|sb0I`n?{9y$E00AjUL_t(|+KrRDPQySDMfZCsDMPBn zKSHQ@v`A@y77#TM3PPWVd;ks=Q1DC)DS(d0Z)ETpYpi9pk!|T}$Fp~?=kAVOYnX~5 zIU7my@Iu0zA;xvQY&}h7?=zF$?@W_x*LVMN#N=XJ6|e*=$$wZeYmDn?#S)N~w~urK z5F2=pah;K^Ab%WK>U5)VD6SpQ;^yN-Ru1|l(HHY$is5#~w^*91fcf;>4PkqHWaoV% z8xJpqKsy&W{dp@rRat;@{FSLlYj8E!TiE@Ws>q_Y!x#&QP?D&$61{NV|7g2>9b!Wuew6bJF1u**{Wil<{Y_PQG9D#5t$hqs)*{ pV8sZMt2N4i(*;};!(xbW{{X0>xVXH!;(!1E002ovPDHLkV1nO^p>_ZO delta 532 zcmV+v0_*+q0<8p)B!2;OQb$4nuFf3k00004XF*Lt006O%3;baP00009a7bBm000id z000id0mpBsWB>pG!bwCyR5(wKQ_C(xQ54uNN=$u5NFxQAawVa@-vWV8W_K9T_ZWcI)!#`49WJ5tO)rZEcNP2e zu5Pjb<(eUH#3i1=Hnwnh9uyYT(^8T_d!#q%FAMIGDN$-g?-N8qkSacAi>4sSSNvwd zcbgz2QSKh}J!q_O@OU;>yvb6{HY5+U4Rldfu9c3xXMe&1;wciNkn%qZ-Q%+&Ge_f| z30MG$4ckBU^PDAqvY^$J)6qqUE>HaQ9F8byR~eb(fuM2Z(+=Kxnr(N8`M{ z&BZG7cvA;wffTK(ud+_a^+Zp!JX`WGcz8~yO<852u(p~xd@yE-my;`QB%o`F-U0ZB W4`vMkwGF)h0000=d#Wzp$Pz)Pzja* delta 28 icmaFM_?B@(86)Gw@-%_S<962=fWXt$&t;ucLK6Uzh6#xP diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_hammer.png b/src/main/resources/assets/betterend/textures/item/aeternium_hammer.png index b7d92f4c32674d1e6c1749c97170c16a23a05617..8b98f4fbeab748eb10b4189d0c1045036e364b24 100644 GIT binary patch delta 339 zcmV-Z0j&Oo1nmNlBYy!jNkl*@SgHPrhLq7`+uQRE03Agiwa zfBKSz|BGsC{%e{T{RfFD>FE$>fQ*(VSo6~L>)?iXnu-3;@RR#b&;Ug>wf_!5fnZG_ z&GI^$|Fz9b|4Rc6m5`7C8^F!ShuZ)JZO#7{?(SeilytTKbAK)<|IeQ7`yV6@GL(~t z=RX%OFK#CQH8JoA3jF60;QtS_39Okd&xa`I&{C9c&{^Gb~Ja zfP9<=RCKm7l$*mX9wr=| zod27eTNv_NnoMwOp696r)(nd-c1}(P4xk|*To2R?GJu(j6Ti(QCtqZnN!APs?ap*{ l@-%}0D5OD{)XYW|000^B(m`WY$Zh}t002ovPDHLkV1gveoaz7o delta 492 zcmVPx$zez+vR5*>LlTS!gQ5eO4_daLP=S-s1 z@HRC?KA$v+QB1Zhj6f+{6d2M{BX><$=2S$BX!^4YT)1mpxNH;Hs=$;Y8KXfN5Vb)a zv?fPqGxN15UQNA`!n3+uzH{z5=iUq3g!0-H5qI6#+9KM}lz)mPN+K#fmHb6k3cZ#3 zp5|s5xPFZ@r@Qd`{iLUo>~C!;o2jZq-W@q0H*d$;Q5(c|Y@n0Qwve3KTT|xTGs3>6 zCJ7&ma5xgdc5D)f1OYR^m-Tgut7~L385O9jBcIE8M-ZPuA-}=9>1iH4c*ycV7qd|d zpMsvgUd&)n39KNTo&|33&_=($zRzK2vIyiTsn`4XbC2ZBOv%Ve>q9@y#NzIVUe^-nTH=7G)Nvp_UivEYChIDS&FzL}@Jm zgExkh0o=WRkK)GW-{dzJqjKH}$)CcN;5zvI itbevGB4r{x7Pn`LAhW^dBUqq^Coi0Ww;eV9iU{uY(&hXZbP)c}-2i1}Lhj{dWio1Zx6m zmeuHP);76 z|6IJhxSash#K0pc@SjJ3|3Ak-VaRW3 yBF+F1X6NK&;3WVW0>bq`%^(Aqxj2VY-T?r)owe1fDzv2l0000<1;0BYyw^b5ch_0Itp)=>Px$c}YY;R5*>*lD$h?VHC!H?|XC8a82s! zQbqI{F-kzm=Fn0nQ5Oe0)lPz&7OOUX;UGrsQiN^}PWm4xqER=$aFAFKMF`SDTZ9sG z)l%*~4nh>;$LyI7hx28gcRikg;WMav^IEx=|JYbbiaEQA z)|xNhrgNESb>lqmg4TC!Y%eXdv$hV10wLD$mcxTXGR_&@9i4m}8O$j>`Uhs<1*XrG zXnj3_0*j4>MdI-Rb*enR4h}yp01&V&l-2^!*Z)}=z#r)N81DJSUG%xu6^?Fz?#aER Q3jhEB07*qoM6N<$g66=p{2#^#u|Z-mKJJ*fVfP<|LF^TYl_-34d7=Q!B{U$zNCsfP1Dy<_@j9E3 pcR;QHVbYy|002ovPDHLkV1lU@SIGbX delta 314 zcmV-A0mc5;0o4MKB!2;OQb$4nuFf3k0003GNkli;ot^zJ>Z+@QV8KN}1ZOMw2N^+?5D7ciQ(!4b+oU2UJ?6eAlhWTtkv(wVbVO=HfVt^`n@*)Vkp2D_h0*0ur6{^MzyY#2TO$gfFJLhRpRzw{VcUP4jA zd;6B&gw0rW0YwQ`^(^!Kd_+IQymfJ0&m13YnslzLwTjd0q4Km z11Z9304{mBVHEsm;cCyKr!}!1Zl8y z2?lG@HF5y6)wIpQY>*gC9%oFzG{X2G#WM10|8dFV1u&O@Ff(3T@wo=(0_1QY3BbaD o?9_=K1|$Jch=XjW$P2^(0130VrPbZ%LjV8(07*qoM6N<$f^aQWf&c&j delta 342 zcmV-c0jd7h0r3KmB!2;OQb$4nuFf3k0003iNkl?{^1Avn= zgE;4vqg5J|(N7JVvNQnzXpLqiwT$$Pf-Fs-HJW&TdxbFiHM(Kb;qkfrtA5fzFw5gF o^;!edawwSi02Y_`UC^KT0M9*z(OgI5@&Et;07*qoM6N<$g527jp8x;= diff --git a/src/main/resources/assets/betterend/textures/item/terminite_chain.png b/src/main/resources/assets/betterend/textures/item/terminite_chain.png index f5a686bde4c9145b12fb50651b93b6f32598606f..3489d080982c8d0af592bc21228d3782ab66418e 100644 GIT binary patch delta 88 zcmZ3*ST;c=$kx-vF{I*Fa>4@91fQ;d{XUaZ8IrTV)^FlvkPe#T+nBcEZHhG0Wsg7! so{tVoPW&{u-R`XuFhxqUmoN8?WME(*${V<2 v0ctz>vB1DESYkm?fGC5o8$d)XPz(U`#VCSS&Yy+=0000<2SrXqu0mjfBX&7h diff --git a/src/main/resources/assets/betterend/textures/item/terminite_chandelier.png b/src/main/resources/assets/betterend/textures/item/terminite_chandelier.png index 4045357bb1b7d027dd215403b05ec4caed23168f..78c6d14acd137ff653bbea8b168f5322d25008f8 100644 GIT binary patch delta 180 zcmV;l089Vb0?+}FB!8DlL_t(|+GAiCKH&fV{|vL9Z27jd0q4Km z11Z9304{mBMuZ<{F~d=2mhO7rhv+V&nXDekURVj0cq291KGFuF=Wzd~shl08lloH-IXEq6Drk zfyEL?GvL|<`#s2d1A4yct6ieZ=D=bJ2BC2DRu!cg7{3dHP&BXgSclcX_Xt&1n~qaU z{VD4ijZ_JA95>+O6UOMT65pddKG?tNpb50nY%gv$7!Rl~OkQ91PVp~&0j*qne7u9A QtpET307*qoM6N<$f-obEGynhq diff --git a/src/main/resources/assets/betterend/textures/item/terminite_door.png b/src/main/resources/assets/betterend/textures/item/terminite_door.png index eab163de98f7a18d435465c64cc0483b529f2193..c5a6452431fb36e51990e917bfc459a425644aed 100644 GIT binary patch delta 166 zcmV;X09pU~3&H`AB!7uXL_t(|+GF_t|33pIn1SjBFcxS3ce{EDj7?7Lg=5LhE5Mj& z13)www^oBO!-6Sbny>*tMIalIHG|k-F_H{G(oDVqNZugb0JJawhYPU=fI=It8EO#e z2B3L?JQq;K3*7lof+5Fc*<-1+DjD2J{d03GY1 UU&Pz32LJ#707*qoM6N<$f`mXpa{vGU literal 1530 zcmbVMU1%Id9A8ZvYcG+~fT{Jtb<^VK-p=mcm8uVU2nw~nNX?V95NGdW5vf|cFgstr z`Tf8DXBOt4AKtxxH^*_qrJ_-0^PYI@8f5>+wzd(Q9`uSw1CC3L#N$5h?RWNZ+>R}~ zvJ@_va}ZM}jVxLv>B#XIn&T#>A`jtZ67p42w_RQM?XwF4Z(F)>Bx?fGE0Bg=T=U7| z+I$7CEo03RrY8A`2r>ePgouxvrW?RW7dpIa@!;5(3TSr?{bf&7xWz!#`b_-uMy z#BxUAb6Q#+2bz+3mREqBlR!?ART0P#j6+r9d!N9h`Bn{BecKCd>hduos?wEE7nr796C5w0b%UOp zn8Tz9d6Jw4u}K}Eg%g~&;x{|OEi92HafllR3@ayC<|Wfi;CG~ToCF<&vnQEGJ=^Yx z4l1i2k;){XD?TQ(Cz-^tzG7a3hBRoYlHCZZHC`5M$rj}h>{ZFWc zVU79@Vve#MR40<>);rQn6PDZ{L@p*JLl>B;Y1_779^`7dY}FETSj&rfl+i@Zs^-LM zR?Sp_rR8Nj-hXdUyb=eo|K9qa?_cn3Rz#?I?>tG6V1YKNZ&HhSS&dV;lS;5?2P|Hz zy`oqoCwi-<&3Cc~A{-~UF5oz_#1eYP_C0&1OWSG?M*1(|?!p3E3tPx1({<*>yU8et z=`Y3A*fmA^yOo{0zf^7?&e}n|O!^SpB%O@7tbO^cPaPetTw*=$gOV{_$$yD&Z*NZx z96WtyedhBvs+O*t`u^Pr+}gPQm3Q;Kb1%JeqdvKLHX1&?zOnW2%)XiXkN<=_BvIwYl-Y;K;DK_aawP|5)F3bx1vXVBqUa>gMlzM^l#{f9TrW zC!?=t7cZuM-YJyl_$Quj4^EuAH8{5a#7^PTH<#Nlj({Hz|8heqzV_-D&b2q+z(1JH lO#9p0sXd3TJen^bi+-$ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_hammer.png b/src/main/resources/assets/betterend/textures/item/terminite_hammer.png index ca25e71effffa9bbbd074f0d635f83c7385bcf7c..0901146d7ac6bd55b4070d455c22b4088b7cb3b8 100644 GIT binary patch delta 243 zcmVI5Ca1zD}Dn+ zGGehB0`m?yOmG4{RR#`imH!}&%Mg$pZUb~xfrh9tfcy+{Hf%OS@ETy;)xZD?Fp!_o zT>{n&v;Zf7*$mPQ#9;4$!X#n#6oh761|ZuE(hS3}FoA2vW&pa)FpQ!JiZRjwE}IcC tgQ^+D0Gu`x$UAUgq0URRW~>HK0sxK*6F2#Q9zXy9002ovPDHLkV1nm(Xukje delta 466 zcmV;@0WJQI0_+2jB!2;OQb$4nuFf3k0004|NklHZg-S z1fkH-76%9!=ec<=_NIQKQb; zT)|GdUQq`tWfxXD&#m6L!!=R;#ub4#ub;`)KkY$qt-zz>Kc6bcL1OxMbpQYW07*qo IM6N<$g3jLEYybcN diff --git a/src/main/resources/assets/betterend/textures/item/terminite_nugget.png b/src/main/resources/assets/betterend/textures/item/terminite_nugget.png index 90b29a76558e78bd1543f0fdc88b6acdaac6c79c..5cf323f65fb5a361001a269183e03df760eccb37 100644 GIT binary patch delta 131 zcmV-}0DS-W0iXepBz$K{L_t(|+GAiC1=I)s|NjSLet(z$AZ*?+6D|hAL>U0mn1A}v z|FXw7{=*D{8AcF*6oND^fAaeX4VTUWW1I l2zvqKPjpSlcofh8008SdXF1jPhhzW%002ovPDHLkV1l!UHh%yB delta 220 zcmV<203-jP0r&xsB!2;OQb$4nuFf3k00028NklAAZ%5&h;#!$8qfcH1jZmXNd~|)FL`kbjPV)(10VxH0H(R~?$!U5=P!W`@H7+s zpW!F>pC|(qJ>$TdUA04TsfhQKh)5Rj`td}W*lfPjie8XUu%4KoCU z2^s+6!!&oMtAm|gbNCM2MIbr627my}W{_sMpo};i<23-QW?~IMb~XbJfHM|w+DwcA m#Mq420FXvvG~+aYTnqqneDr_%;*3rJ0000D0X<1X zK~y+TWBmXBKLaIz2};Ak%A_hN3jr(|XZ;6Z>*~c&5d^?603Cod&ZzWc0O7xE-!Ytv z*8rI2tM7k+F*X1oMP20)hXJUw~<>VSrULE&y@? z%oQL2(%hM@{$E3m8zG1WV0u6p#S6sRjBFv?3n0y)03*uTNC55vO?e(LgBZ=oE`S?A c9$;Vq0Mr<&%rb|!zW@LL07*qoM6N<$f(cKYBL_t(|+GAiCe!#q8=6@K*Cx%n=`Ja#eFL`n6zoKW{e?sC| z4FD;^W&lX6^X^sR3_w>15(kM9WdJsXBpXn5;WFt4AS=RV07wj*99GRC8}?%u020G# y2+Rg#&BzL1d~`J^2EY{I3nXMUcms220RTgc;Kz*S$wvSH00{s|MNUMnLSTYmEI7>o delta 227 zcmV<90383U0sjGzB!2;OQb$4nuFf3k0002FNklwt7#J9^ zD#Rv+)c{-yaRIC@`1tuB=?0iL%={k|YlBlE%+Sd8QU>IJWL!em{PFWYhFcHbU>I=g z!5fB;pZ_uN^D?0r0(Zg3&;Q_>&(55WqWRUyqi`{F3s_)`<(1uV!TZ}6p(GXnpK dN*Wj@002|XX#IxhphN%w002ovPDHLkV1hrHY!m4@9fG<72`+X*-HiQKot>47Uz&P~*&nMHvIqJ6sX1H}7 sO6Xu$ay{36)6OTUaZ$q(3$YGH29CR?-qj_w?-+o<)78&qol`;+0Clt@aR2}S delta 145 zcmV;C0B-+wt^trFe*tq+M?wIu&K&6g003x7L_t(IjbmV-6;Sky`;ScH0!;WMwUR3E zY9im-v#WRXPPPjv7Z1SV_shO@-I2S^AiAcOhldoJY+uylugJUYIHgXS#3VO zUjSl!J8H1qt20}wTg+uOIcHYK?~(xetF;jMq&H0J+;;(a*d)Nb_z7TlM&=uj{WrkI lWeQXq5U)_>x3@wQy#dwL?%C%zR;vI2002ovPDHLkV1ltVVUhp< delta 357 zcmV-r0h<1Y0*?cbBnkm@Qb$4nuFf3kks%X*32;bRa{vGi!vFvd!vV){sAK>D0VGL8 zK~y+TWBmXBKLaIz2}+XffGJ-jz0GJ*W7tDUT_5Yf8C%}FJDL}^P@-Tqm1r>I2 z2B0D+4-=rv!wmqLY$~9|AjrWB;$nm>E_t{C@4vr=NrKtv0GB*C8bN-X^<)c(4>mb} zRoWZu>4rO(!TbglT`(UM1|S*;7}I2Y7{GdA27tiKr&s@9e({Il+WprIOz%E3gnFwn zfcQ7g-edSD#LEzFDGBCJG1dob0O>^u#8WpvGJOB|m0@3q3uDUhQ;abFp0q$lkQj`Q z3{YHv4xHBP`44gl$gqg{?NCt!!0-Z4GN`|O>Aw^gGsClQe;M9>`VV(DGQjWxGI;X% z3)oACFTMhY2~Geq1s4E$!DZHZoC>Jo1+W3+0|o{Ff>gE;N(YF{00000NkvXXu0mjf DG98q+ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_chestplate.png b/src/main/resources/assets/betterend/textures/item/thallasium_chestplate.png index 6e4fc44a6b7288121231d0727db85c73e485601f..562bf4bd827e4dfc33cdcc7ee2e8a468b517178f 100644 GIT binary patch delta 187 zcmV;s07U=K0@neMB!8YsL_t(|+GAiC6u`V;=6`fdk{S@_{Le@Km%O<3zw_=@oCe@j z1LD9WK)C9{WfTPWCLJffK4;V`9v9j3p5jD0Jac^X(q}5SZrX! pumHrHtZ^AalxFm3MaMMBhyWQ!gxj8KxC;OP002ovPDHLkV1m&YN;m)j delta 308 zcmV-40n7f^0nY-EB!2;OQb$4nuFf3k0003ANklS6g}fG(mj#|)CBL_t(|+GAiCbiirNp8p{1GHX3n zOq2o1`;PsuzkTWd%%@kubk5m}U@@Dn1;iNu(g1S_43lI4$X2bS3a|zc4Z5Z3Ku^LXxd3D<$Pf^QC1;QrQ3fE#JxBvG#+H-;A!{u- T7X*GL00000NkvXXu0mjfU;|Hj delta 365 zcmV-z0h0dp0ha@iBnkm@Qb$4nuFf3kks%X*32;bRa{vGi!vFvd!vV){sAK>D0W3*G zK~y+TV;FG22&Lh`Y0aMhAe!mjXD}Zf>`4nm(Zd9#QGlWl7lXB z5oh@E;UiQ90$??Olb@U6@WodQD~~@1)7S35hRR?9tOf}4F*3Z^wuj-@y(eHAgh7UX zetZ1}ssaJ98X(2R%y4yXJJ_!<8e}LofYpF!-~KY#b}s}6CWsc&&;T2X4PZ6k?Wg|? zhfCwZR)XkvH*PRoe(?t^hYm0d07c*Tk6#&_*Y5q#rX&NVCA?gqvX}s?3qSz|0=D{M z4B?iNU^Yo%08pDx0rZr|B`U&jq$~kR4+8@L!WnIv7MfMd00000 LNkvXXu0mjf12C9B diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_hammer.png b/src/main/resources/assets/betterend/textures/item/thallasium_hammer.png index f99d629edab0d95d6490df9e1bd6b6685719c89f..aa8a26dda1f5f4f45e2f4ec483474d93efc7080c 100644 GIT binary patch delta 235 zcmVtoRKG z*{~n0Au#WN!vrVLQ)N)}jKgaPNFKKVx~f1!)EGd1200s>A!K+BFz#w#fCU)H&*&}z zYX(|?6ToZ+X$E2x@4z+VG630TkY*SLX++VC%>Z8&OPUh(aTZ%{CNj)h1pjRD`HzONB-u60+Tr%?cWS5(zJxknjo#gJ2Dl zaTIvt&CHWcoa!d`{J!se_vFGmO96<8Z$s2dxR>km<4QL7vVX8r6uqS$wGuMe-$r-e z7XV(vo(XbGL|izm4R+5{I5%nj^t2EP8jLTTsW&HxS_x_I`iygvX7@ZrSR2$-loB&F zi(45w%?ebY48T8veR#^{)q_W*+WN(}goRa(N($Nw95`#LX=F}nOpP<}6G#IP)`q9GV1!6tFY(f2 z2?Y%%m#*{TeE&MifwQK3BeWzpBxY)6e%}G8K+5_AAWBxO3@1vB;HaYn@+eepAhvqsD3}gj-onPQw q_vgRk3PkIxB>AuCzu;Vfch@5|gR`QcLN#*$0000|F} diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_helmet.png b/src/main/resources/assets/betterend/textures/item/thallasium_helmet.png index 452e6e8ab129ce61786e9457fbc548e68a4f461c..bef4d557639574e2d2a80730b993deba0cd0f563 100644 GIT binary patch delta 144 zcmV;B0B`@C0;~a$B!6>BL_t(|+GAiCp1{0e=6`IMXw6j@F8}YmdldzTY}o%_(KGHp zQJR;$xb^@1&qrVyW&lW>pdlawK#D;c(KW*`Q3il8vfo{1tq0pqv;iPm*vtb3gAAd_ y0FW3_VF0rQ-2jjn(J=wifG!Sm1;Z%7006T*z-X1RM^o)v delta 256 zcmV+b0ssE20h|JmB!2;OQb$4nuFf3k0002iNklUTLPd21u zsAs{Z**U<9fuENNMf~*TR}8N_b`^Do?;rm+e7JM55vB*#8U_Zq%~#+5V0ilVHvKTYLo0=amv;5D*g}-hg$Bk1*WXwjM>yFeROVfmj2ufzQugG2D6}fFX_% z1|L8FV|aD)D2768VpxHB!_5D}W*!*nK-kRVKd$sK(g6TYs7HTBT|DOi0000D0SHM% zK~y+TWBmXBKLaHIuK^Z~v*41w#Gtv3=Auisu;rOwJ|V3`4|ACc}ArtLvDs6 zLr|;@!(X=V|E;SRLuC;FrvV@vg92(8Y7<)+K79HMH^j?a?0=@eJlthC4FCa2Ll;JW z=KmawE2?_nhBz1sF&wz?7ODb|0U-arI(G!j1{rc8-5G4iY0nu9KedCw;vhg&EP$LX zFTn}68KfCxV2h+M{y>BQkY<>(|Nr{V$aa1S^0NjB4FTRmvGYn9e bof#Mau#TOU<8|oh00000NkvXXu0mjfw_AoQ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_ingot.png b/src/main/resources/assets/betterend/textures/item/thallasium_ingot.png index 9c5ede2992eb9029908c565c3480b5a7965bc7da..95c0dceac49b7fd9449750af355fd3be8fa591ec 100644 GIT binary patch delta 219 zcmV<103`p61NQ-tB!2{FK}|sb0I`n?{9y$E006E@L_t(|+GF_t|33pIn1OBvm^aM) z55goF0Mi7*RTnOUvCFLW|M41tuBr3xRTPYF2vM5w83NXP{^z6rOJ3ZkNE+3(o)m002ovPDHLkV1itwSQh{Q delta 354 zcmV-o0iFK$0gMBXBnkm@Qb$4nuFf3kks%X*32;bRa{vGi!vFvd!vV){sAK>D0U=35 zK~y+TWBmXBKLaIz2}+XrJ3DheSnS@mg^ci6fEj{KZUD@=Fiju;(gJ-j-36wJq^2^nCdL{b5TxsibZ0JAWg-kXNLBme*a07*qoM6N<$f+Jsz A{r~^~ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_leggings.png b/src/main/resources/assets/betterend/textures/item/thallasium_leggings.png index ef9a6f99c08978b90b3b8bf3ac7733e74582e06e..f816d6031bdeb90f904df53777fb95c2d2c361af 100644 GIT binary patch delta 149 zcmV;G0BZl00k1=OZu%u|c@= z?o}`j*{~nKAut1wH6i1w3zvyA0Hzp*$uSBOiTHU_`~ z4&4jb#Bmyc9^Wtn2&MyAh+{JVn>bbjkTD_g!2tlK%?#-k@D3mK00000NkvXXu0mjf DlYKiv delta 249 zcmdnUIF)IFNGZx^prw85kJOd%8G=So9_*NMs!7&`Y>y@Y!DP=z2f7)E)b4 z1-sa@(`0_fxt$+UigFpZ5@wxH016Va~i039Gc-<}ey8*I)m} zjc>#MWx=O5N;O=~J#j7_XorCD_G2%-?#xpbN|0#Cvu0*i`M0t2amm58?D-qCj;Zw} w9auft-Sg6!0}ZNT=g!UP4^`Cr*vQUM)9oeob=sS$K)*3~y85}Sb4q9e0Pmk}Q~&?~ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_nugget.png b/src/main/resources/assets/betterend/textures/item/thallasium_nugget.png index f9a9c2092135b8b8f6f6e96e60d90b829992fb75..a43592289b5472b977e26335efd3f3894359b59f 100644 GIT binary patch delta 123 zcmV->0EGY03zz|rBy?X%L_t(|+GF_t|33pIm|@fa+y;6ftmql{pC|)h8ey74HtYvuq78uA2(uLl6XgX4bWO;3 dG$qo&007?3;(~8aYSsV%002ovPDHLkV1k5zH3k3x literal 1488 zcmbVMU5M019G|0QvGy#MN)ZJOxfX0|b|%SwWiUOqoAYj=xjW9Kx4t=-%46k%AAAvdB8cKS*^f|)^(!!$uiyOs z-~W^Iv(wwQ?%E0f*jAmf7R0qzjtGki0Q3x=5P$a+wUb~41D|DP5|EA@M?8l zw?D@Y^RvWdOElZ{LxBe1z+^Wh&NAiF5^Z{cDc}3~vMhP7DKF-2WQP^n@@7^edT4dF z=BzF|hAU5gDjn!zLEuwPq^{o%V%#<5J}(yQh`=;VG)(`*@EJz zIZY}WS+#%+Ew^9NkXnSO2vuD{Dn9k zq9#-g!+=PGnx+VZ688d5x=IjFj2J8$JCPT1j|Eb~NS4?NH)Wyezyv=`X@hv^CgCvH zB_UL^C^4xIbe$9zu0-v=aMyvfO??{hSYXu@E4*aeDg2qVzMrCFK6OlJG_>uR=(yGk zDO{j2TZtSxbxcT{7%3LE7-w;d{f`~#b!ttBD-k7}MK#9Sqd?7%SfolN2~0`ax99~f z>%<==f`)IXML0EO4QZ+fnWE)uD2KHIR?#O&#|RCewnzn+aPo3s=6a3Z3!$!q8!YmP zaFpkhCWT?p>`Sw4Tn%DQ0*6*DQx>XbJYp(`J%DZ zK$_u<-doIBNrE_f@4n*uxyTbmMB1;2&`*;7U+!0)~gJhZZA+bq284X1HibS7!|J~cN=y6|Gt#Yk&&3U}JIr+wiCyxFO z)-(0ojkPNJ{^H!kb#UhIv-RB>FZklCtNMd;7pIHkzlpQ;@#&0Teg|#deYAIc?(&n& zkIg$=TmR#yGhd$_(?2$U-BkwXAKw3K@yLT)-)x-J!JXqf!L3u5_Ow75qF-=t$KmZ) g4z6WRU$AbDfeNO7{_{a~PttR%Q?u3&pB-6y3P|JEDgXcg diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_pickaxe.png b/src/main/resources/assets/betterend/textures/item/thallasium_pickaxe.png index 537321d8ee2982a4e7eee68c65932523bf4fed51..c02927e754889890d5bc52c1635ce7fcfabf53fc 100644 GIT binary patch delta 240 zcmVUgO<@rlsgFr3;iQ#nt48t^ooDH%$WNE{Gut6YKf#e7p0MZO| zcF2O`U~ds^0J6<6F<5wjXi%UNWizrkQ3hbM897W~F@x0rTsET{0!ueU+l-81no$fO q#%5#}z%X18q>&iS=!P&*nwD0X9iQ zK~y+TWBmXBKLaIz2}(1pOsWE7Y{0sDF_eV~SfDfpuxOlxa2gw!&%pePlksS4EL0Ez za2fytxfzZO+JYQV9s@&0`}Y4{=3)%;5}XXvH$G$piQxF9+_Z=B?9BO483@2@05HJ7 zHpBe9I^F^-4)O*Fv`7l$HUOjQ`jTr`nYzBoq zDDXgD0Ub$1 zK~y+TWBmXBKLaIz2}+XU90-)X$pX_QSUfs`A1N(%h^JK>;=3FaT?W`4JcJG!y;bnXdj{Lyr6Z zk{7q&epm5G1M7pw0?0OW0MhJWD8w*-`xAzcr572Owl)2S+YAJtSiorjNVB{IC&PgY zZy9bp`U;kWsYM1@0}*C3vSwTW!v)w$Y=!}BE`S>ly72&*VY)p7>}PB?6Z8Ton$}4c w5p*^(fE%#d-+^)8#^X>P@qnbvgb5fJ0GKqlnG0p~FaQ7m07*qoM6N<$f=YLpzyJUM diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_sword.png b/src/main/resources/assets/betterend/textures/item/thallasium_sword.png index 0683e273eb25b1d7f2ec06c9dcf625163fca3443..9a13f7963ba0a2f0afb23b10006adae45459db0d 100644 GIT binary patch delta 246 zcmVXVa|rBLD!7o1&|>i4Is_1gl~e&W()&Bz|&0he}jMo5=W^@D44Z;D0Z&Op zK~y+TWBmXBKLe>CbmIZICMGCNGyrK1u#je`_EctgeBl;p2Ea6H3vw{5y7mDqMzjIw zn)huy&hYlcSw^A^K-RqL$!EA`kQ_k+&^51Hd<3o;1h5)lUA-7g6ViNp`%DIuXas40 z0MXA*J!X_Llf~+1utFdJX$Aqf3t+aI>WVQCs~H5adI1#2SD*iY2iS@FG)9;vWX&Le z;suZ^{<3}l@8oaE5T+%-kkP&!r_C?`H-M3mk-^hU^uN3WC&PK8Y6g%Y0({KifCISz ztOyH$djX``!BB|dz=gLAvI=^PAg6=XMvqy2()?r_9qNC9(`r} zvtmAjif1t6_B=PRA`qB;^C^^t3cxM^Id|u82Zldd(O@ru{Ca2mTCk0^NA7|#F2HEs uF!TSblSjcE=Kmb<(1rnIXJZB;0|Nkqp1;wO%_?&M0000n#0PFp$YkGjCreyN^hrP$(1%g+ifFC=?2XqAWn~ zC8#Vwc?LfT$g?Wa#6tqo#1Ie$9ug2oRpT7u!Mn{nZkvlBfPaS`H)xZKkbGH~hT;e} z+b`JJzyHab>kGN_sLMJG@G*J=02Eii=GHZu>%Veo3c$uEa1MMO0w<$84-^nbi#r-e zC}@TmJ(-3Z>#`IO2GxNlO^n2CauEuMBhygdoTKgCvbC=IeAc; zPAG`a1x!x!LVv{#Gl4esP7P6RD9_BFqD?_I^-c`YdhmRx56xxKRln|j0DwP@wf6($ z5n$;D$Rohg4{)D=fqsAt0tWa2?i0{<+nbz%E{<061KcN|dB4A$0sv_K4B87i{Q!9i zIJ*VC&Owh4pz*E;3TV6Uk0+pmPbBQzsVB%ay`w0rbq(y*sD?tHvwmykVsfVn#taxazLVp0+^n_qYufp<7MhNBo z#o8k}o3~%RKmMbS9ctPLZ1DqGCv9j z$+1Ga{Qv*}07*qoM6N<$g7oFR6aWAK From bea2bef853f3ef56b79d1d763f94ffb1f8b9cf05 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 1 Feb 2021 06:20:24 +0300 Subject: [PATCH 247/463] Lang & textures --- .../resources/assets/betterend/lang/en_gb.json | 3 ++- .../resources/assets/betterend/lang/en_us.json | 6 +++++- .../resources/assets/betterend/lang/ru_ru.json | 6 +++++- .../betterend/patterns/block/furnace.json | 8 ++++---- .../textures/block/end_stone_smelter_front.png | Bin 722 -> 704 bytes .../block/end_stone_smelter_front_on.png | Bin 873 -> 918 bytes .../textures/block/end_stone_smelter_side.png | Bin 624 -> 615 bytes .../textures/block/end_stone_smelter_top.png | Bin 614 -> 578 bytes 8 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/main/resources/assets/betterend/lang/en_gb.json b/src/main/resources/assets/betterend/lang/en_gb.json index d001c2ce..b4f84411 100644 --- a/src/main/resources/assets/betterend/lang/en_gb.json +++ b/src/main/resources/assets/betterend/lang/en_gb.json @@ -35,5 +35,6 @@ "block.betterend.umbrella_tree_stripped_bark": "Striped Umbrella Tree Bark", "block.betterend.umbrella_tree_stripped_log": "Striped Umbrella Tree Log", "block.betterend.jellyshroom_stripped_bark": "Striped Jellyshroom Bark", - "block.betterend.jellyshroom_stripped_log": "Striped Jellyshroom Log" + "block.betterend.jellyshroom_stripped_log": "Striped Jellyshroom Log", + "block.betterend.sulphuric_rock_furnace": "Sulphuric Rock Furnace" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index b03141fb..9ddd63e7 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -658,5 +658,9 @@ "item.betterend.thallasium_helmet": "Thallasium Helmet", "item.betterend.thallasium_leggings": "Thallasium Leggings", "block.betterend.missing_tile": "Missing Tile", - "block.betterend.charcoal_block": "Charcoal Block" + "block.betterend.charcoal_block": "Charcoal Block", + "block.betterend.end_stone_furnace": "End Stone Furnace", + "block.betterend.flavolite_furnace": "Flavolite Furnace", + "block.betterend.sulphuric_rock_furnace": "Sulfuric Rock Furnace", + "block.betterend.violecite_furnace": "Violecite Furnace" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index f7fd144f..e25a5697 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -678,5 +678,9 @@ "item.betterend.thallasium_helmet": "Талласиевый шлем", "item.betterend.thallasium_leggings": "Талласиевые поножи", "block.betterend.missing_tile": "Отсутствующая плитка", - "block.betterend.charcoal_block": "Блок древесного угля" + "block.betterend.charcoal_block": "Блок древесного угля", + "block.betterend.end_stone_furnace": "Эндерняковая печь", + "block.betterend.flavolite_furnace": "Флаволитовая печь", + "block.betterend.sulphuric_rock_furnace": "Печь из серного камня", + "block.betterend.violecite_furnace": "Виолецитовая печь" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/furnace.json b/src/main/resources/assets/betterend/patterns/block/furnace.json index 3824c3a0..accba1f5 100644 --- a/src/main/resources/assets/betterend/patterns/block/furnace.json +++ b/src/main/resources/assets/betterend/patterns/block/furnace.json @@ -1,9 +1,9 @@ { "parent": "minecraft:block/orientable_with_bottom", "textures": { - "top": "minecraft:block/%top%", - "front": "minecraft:block/%front%", - "side": "minecraft:block/%side%" - "bottom": "minecraft:block/%bottom%" + "top": "betterend:block/%top%", + "front": "betterend:block/%front%", + "side": "betterend:block/%side%", + "bottom": "betterend:block/%bottom%" } } diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_smelter_front.png b/src/main/resources/assets/betterend/textures/block/end_stone_smelter_front.png index 65e87503f9abb3b28cdbe94923c84f2645ba1ebf..50ef457922736c9797ebaf8bdd5b3a4dfce8dac2 100644 GIT binary patch delta 681 zcmV;a0#^Of1;7Q6BYyw^b5ch_0Itp)=>Px%dPzhKsCz5;c0;HBwCyG)+6{RDUBAU6N13@pr3+N@328z-mqy%bOa!wBW{H?wB z+3UxF-7!Vq(YxMnJ)`ga#7}?y9#5_3d>%Qv_keV3NZ2kZQh&oJHvpX3j#bkkrwf{D z#UGV+>DS1{Qqy#`oiSwRh!w`2O zAp{o71;1Tl^wGTs*ztsK-+ju??jA094nF>hfe{#`kSb#9NF?&Z&)*S^l8Lz)F9Adr z0!k^;G$qlJa#K+bbDFk8Daq*75~-Ig79Al3k|d$$WRV)ec8M{D##*ERp(V?CLpIQO zABheIS%T7%7$ZUmdQOjW!x`YcC(R2Ef4s|}ENI&nZGQ~PXxh4^$TQkiO|x9lIY-aQ ze#g#xAad*G9d6$|zb^)U_ zp@aEyO+8=GtR3|_Af-YGanTLg7o=`lq>{AjKsEJ*rek{E(yjw4KsEK)+LH_toO2h& z68ne0M1MP;aJYX;nr8SHB_c*LV+bM8hQL5dgb;LH$I`C2`{&!(@dVM|La+0AWM@B5o~<~u9i!ZEPQlKm;LSbF!{?5ZXBDH|kPZ9%3J;$<9^F4i_VAOb zed*KHT>UTH=k;twQ_awi?jHlNu4bG}hcwlU%OXm*hCF_erCTr0?Rdi9lE8+9O)3mo P00000NkvXXu0mjfIwnsh delta 699 zcmV;s0!0151=0nOBYy&!Nkl6n%s`O`#DLlczhs+`F z)Xz2qN1LGZ2x8ZlVzjs1h09in!M-QZ9gIbKavU;`XpyDch_oaPP9())$o&-k)-o39 zwv@oySrYvO0)JJu_g64EOScJ^bGG32wVk+;w+*>j@fMj)IZpY2M9k^4Fh)X#MEZ}h%_;Z4hTKK|sP=+U7VQTR$oK`*T zsveoCT3i&>ubkV8LeT+<6kbn6zIal1ZhIBaWO%X$Lw_PynH0(4#U@tuIjZ4x8xaiE z!0Ueo|M!;&PS(O3Fd-Cv1Haz{=RhS7I5^Y5P(pJJs}`0D0Rv8oD%ojTIDJOsW+&kM z>39T$V9u${NI$H>fclu78T-+QndMJVq`%Y_si*9XL55BPpXlJi*#w+P)xha8aO~*5 zSROPLlYe<@0@n6oxE)nEuzLfN_r$>CtmcZx4@Cz@F}m}*ss;Bx);8B@^b(H002ovPDHLkV1nkLPF(;1 diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_smelter_front_on.png b/src/main/resources/assets/betterend/textures/block/end_stone_smelter_front_on.png index 629e8dac27d408836e3fa46962267fae2ad4f45e..2a7aaad70dccbf5de3a3f8afa1dd781a9bae97e0 100644 GIT binary patch delta 896 zcmV-`1AqMK29^hqBYyw^b5ch_0Itp)=>Px&P)S5VR9J=Wm(PnEWf;dl?>p~gCYk2P zCN?WQsGzAJw3ku@ZE<_Hpa=I<{BhBPc$5AIBD4oD(u3@!1;JAlSt(d3tp zS=er%w%bfLn@p0)WF|Ay!|d#)T3DCTdT8Fu`^+=*oy+@uK7V{)@!j8l#rNEhEhlE_ z#x2ZJk*J))j@XV$b`5RAaqIO39Md>m(|FO zy5y83)hWx=8I<$Pgf3RI$?UdEE*Dd3Z@?eGnZNj$blb*h@vX#&>Z z0Rg&sbB6cXX1;Mcw z6}LCXH12n(=5(^fwEqIPH^;2pTt}wjJ8k!okAIHjw8x6m{;)g1>vT~oH`f91J6#&> zB3`G<CyMD-9pX3dzAfoP-fr-(Cz_DdGPFb5N<#NcpbR@q&)cIAUyc( z8mxi;*;(}YpWxGo;QfQ}ARSxXfVl`3c6g9-Vm}^GmoOJ0`X0_ANgXD;v&fVOQyx5j zJb7qrz%uX#up;2}%l}6{xO5e2?D3#3iN1Y%A0E_57@!-82^J>u!Cdqoc(AaO2_BaZ zYEvFedGH+aV0{BtN%Fxe&+@)7nGgQSg9GP-G!q=;zQC{S@c@!c5Q6g!)BD2H;=x0e Wowk43E7djt00008j|W+bF|}K&+rNQN*Cc&x~@E zMN|k96p~msD=if%%DPE0b$#H+SZPb=SLU>-IGr}9q|Aw%PSW}95Y1|P?U;c!#DcVCX9W*C-fO?{1-{GyyuzJ?NTKkahJC3gQn#mf(+<*8}k4iVw2m zebL+T0If}qB!3OcBsA40Ier2W*|}4l3TfOyv|iW`!zFK+E+0UzXfO2Vyy#kf>^|tV z_t7kDXqu41G+E?G(A%2{tx}9ZO)}aq!qxpW1_=U=OIGJYiJd zgihGmV9CQrvjkkvz!MBvi(#s{hKcgCFdr2Hj_(G7Ie%aq=NieHDQG7qYh%%09gm*D z9CQn@+@KI_ww7Q_9)quy(cr72U~jt!n<^Uimh-UbVqt4I4ZbT5yebA?6p^sJ62UN1 zM8z4$i|BF96o%uwA{-D2JBm4ctBs^1ncIYfY~3ac#B_cb`p0A#nXdxJ&UaQ81zvs( z*s<9WB!7GZ8YIl^m0_-A_TnS37KFI!!j)j^Stxi#C}y`fgDN8ENanmE%$1C0$Sn4I>mM$=9H5t&TA3>vi zi1v;Qx~A7ZUgqQEg^Bcr5p{NEQL%ZM>;}klqEhLikF61LZXW#CJRr62?YKbym9*BR#gFo#LSWmEGe;{`Az|DgV$O9iI4}8|OKUm6xHTMVXRlg=4Y~@zu0s9}} d=D}a!!4I>C6!SXnm~;RD002ovPDHLkV1gt0nUnwk diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_smelter_side.png b/src/main/resources/assets/betterend/textures/block/end_stone_smelter_side.png index bd8a0e5975976b579626c8210e93c9e38a3a0cf6..185565fef0486973e542614fc5c17efb8b9f7766 100644 GIT binary patch delta 591 zcmV-V0Px%AxT6*R5*=olRI(~K@f(&p4r8V#A=27 zfFj@qgb;B7&OmVvVp38fGBQrV4RAq~fieNOOcgIl7LshOjCZD+U^PN6=%~AAzOI?> zzvcPY_x7!hoXm~4uijAfD|ArOEpqlcIRL}DVR7EzCa0WFXMa3;c$dUv$@y?Jq8^O_ zD1gPFWJqh9a6KBc$z;iKlT)5OSRi%^Tp=_H!2EPhuh%2H?r<&;O?bJ%$o;1;tR9Vd za_=WQyA|b)irjl*jHoIu%Rm(~1K?~pC#drH^=<0Wn5^hm00=+n-|V+<&OJWQ5LLhc zk6_qEpu1agbbt7j#AP}tDOM$dM)IN{FSc;rqpDQ~vsxm)2BXMr8lhZBo)yq9j96rxLr0s!om>H&RA?F++ z7>RRf#wHDlVWz~;HqcCoO#=cZf@&njh=}~vMw)TvJbz{&;&9I4{VH}2LGaE2vYtlb zToQ|;BfylF2P5W`qHIa9sgfA<(IQX+k?aX&j4IZXB{;LT;+=X d<@0(p<`0CFcPjoCQXv2U002ovPDHLkV1mYa9OeK3 delta 600 zcmV-e0;m1w1n>lqBYy%nNklQxls<@;0{T)-tgV(pqHTdRmSSt6 z(F!dT18hxA8-Zmhdo^-z(uX#E@!@l3@F4o|WzU)U=9|lz)tq4hKW}yg#~(u&-|GLM z_iJ0A?&VJ*^lsn7>t|uL_n>vU69Fbw3s0wFDp2_qgmX;-qkjx+Cj*U1>|kQ$XdczW zM}#MoDJ;mP@1cAU7Mot2Cr(JX{$&n zujJe`UJ6c#!y=`85aq+*qy+|NYMIM|w!2D*p=C!2E7PwM&1M3yM=99j`Iird)F%%R~%QKwkVrC{$WEdnO>dqJxHc#@riMTE{Q%08~(!@B^? zZc?CG!=yY{<>)aDY|=kxx44SIngqJTb=YJxov6%UZ+~kJoxvu$H~Y}k`<|4-Xp%Z- zk&+1n$sgXdFkybu8uHx}*+} m?z@|J!G6Y0>Mu{(7{39_%R`O)F+F1d0000Px${7FPXR5*=|lf7;eK@^3*xijlsuj3># zQl28B1Br%)9*G)J@+dUC0VSg55%LUi17#2bf)tw&;_Q0YGjoR`o{bA4G15r$_szM| zJ;%KJ@hP3Rkzdz|`N=8O;Q>0EGN}rV>H>g^*3)zzxm?j*{eR)r%SU9!<;CYO3);mJ zfC^}4Q!cn2yKuW$vdg%u3Qnv5~VV9Ek# z45CU(31{A#V59T8uHnd7hbb*@d9Q&8^J z_+|}&_x`qh>mC4WEzQ+6*Ee^zHoIYZ{{20ZagBA3YOfx;;Jqhw8~kQNvu^qN`1QZT sG(UTImm|jZ{xm*2z9&roo5o${FMkfH>U|u?ZU6uP07*qoM6N<$f(35}TmS$7 delta 590 zcmV-U0v16ia-2_X;=mAE8sZU{(lPFN5jNVA39K+kasgG?wX!1^K>@Fbu8U zbshY+htQ1RD%A+6n6!f_D^$fApO22A1W528Ui)D{ERm345WTEQ^nQ*eZ_yMbyq5=0 z2eK|s7npDFAlaTF2m%|j^(sWvJ) z34mUyQ$jZgr+*0&v0uNxk1YL!Ae`+&cW07+i%=fjn>!=)yMxYz%TDm}+C&29V1C)^(eSiPfj&LpcghhyW zYbrBejfJ)CtLkyIi)D^{y@EPlV$Q}~j9B1EnWws Date: Sat, 6 Feb 2021 04:41:22 +0300 Subject: [PATCH 248/463] Removed path node mixin --- .../ru/betterend/blocks/MurkweedBlock.java | 7 +++++ .../ru/betterend/blocks/NeedlegrassBlock.java | 7 +++++ .../mixin/common/LandPathNodeMakerMixin.java | 28 ------------------- .../resources/betterend.mixins.common.json | 1 - 4 files changed, 14 insertions(+), 29 deletions(-) delete mode 100644 src/main/java/ru/betterend/mixin/common/LandPathNodeMakerMixin.java diff --git a/src/main/java/ru/betterend/blocks/MurkweedBlock.java b/src/main/java/ru/betterend/blocks/MurkweedBlock.java index 14fd6e19..6dac38de 100644 --- a/src/main/java/ru/betterend/blocks/MurkweedBlock.java +++ b/src/main/java/ru/betterend/blocks/MurkweedBlock.java @@ -7,10 +7,12 @@ import net.fabricmc.api.Environment; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.ai.pathing.NavigationType; import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.entity.effect.StatusEffects; import net.minecraft.particle.ParticleTypes; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.BlockView; import net.minecraft.world.World; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; @@ -37,4 +39,9 @@ public class MurkweedBlock extends EndPlantBlock { protected boolean isTerrain(BlockState state) { return state.isOf(EndBlocks.SHADOW_GRASS); } + + @Override + public boolean canPathfindThrough(BlockState state, BlockView world, BlockPos pos, NavigationType type) { + return false; + } } diff --git a/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java b/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java index fe6bd91e..e55699eb 100644 --- a/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java +++ b/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java @@ -10,12 +10,14 @@ import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.enchantment.Enchantments; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.ai.pathing.NavigationType; import net.minecraft.entity.damage.DamageSource; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.loot.context.LootContext; import net.minecraft.loot.context.LootContextParameters; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.BlockView; import net.minecraft.world.World; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; @@ -44,4 +46,9 @@ public class NeedlegrassBlock extends EndPlantBlock { protected boolean isTerrain(BlockState state) { return state.isOf(EndBlocks.SHADOW_GRASS); } + + @Override + public boolean canPathfindThrough(BlockState state, BlockView world, BlockPos pos, NavigationType type) { + return false; + } } diff --git a/src/main/java/ru/betterend/mixin/common/LandPathNodeMakerMixin.java b/src/main/java/ru/betterend/mixin/common/LandPathNodeMakerMixin.java deleted file mode 100644 index 224c3d89..00000000 --- a/src/main/java/ru/betterend/mixin/common/LandPathNodeMakerMixin.java +++ /dev/null @@ -1,28 +0,0 @@ -package ru.betterend.mixin.common; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.block.BlockState; -import net.minecraft.entity.ai.pathing.LandPathNodeMaker; -import net.minecraft.entity.ai.pathing.PathNodeType; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; -import ru.betterend.registry.EndBlocks; - -@Mixin(LandPathNodeMaker.class) -public class LandPathNodeMakerMixin { - @Inject(method = "getCommonNodeType", at = @At(value = "HEAD"), cancellable = true) - private static void beModifyPathNodes(BlockView blockView, BlockPos blockPos, CallbackInfoReturnable info) { - BlockState blockState = blockView.getBlockState(blockPos); - if (blockState.isOf(EndBlocks.NEEDLEGRASS) || blockState.isOf(EndBlocks.MURKWEED)) { - beCactusDamage(info); - } - } - - private static void beCactusDamage(CallbackInfoReturnable info) { - info.setReturnValue(PathNodeType.DAMAGE_CACTUS); - } -} diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index 3c6ce7fa..47b3b116 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -15,7 +15,6 @@ "ServerPlayerEntityMixin", "ComposterBlockAccessor", "ChorusFlowerBlockMixin", - "LandPathNodeMakerMixin", "EndPortalFeatureMixin", "ChorusPlantBlockMixin", "RecipeManagerAccessor", From 7ef23332fc3fc4e891c7c58d1bed9bcebef289f0 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 6 Feb 2021 05:05:33 +0300 Subject: [PATCH 249/463] Painted mountains adaptation --- .../ru/betterend/registry/EndStructures.java | 4 +- .../features/StructureMountain.java | 4 +- .../piece/CrystalMountainPiece.java | 167 +++++++++++++++++ .../world/structures/piece/MountainPiece.java | 169 ++---------------- .../piece/PaintedMountainPiece.java | 116 +----------- 5 files changed, 196 insertions(+), 264 deletions(-) create mode 100644 src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java diff --git a/src/main/java/ru/betterend/registry/EndStructures.java b/src/main/java/ru/betterend/registry/EndStructures.java index ce0d4833..72c87bf4 100644 --- a/src/main/java/ru/betterend/registry/EndStructures.java +++ b/src/main/java/ru/betterend/registry/EndStructures.java @@ -20,14 +20,14 @@ import ru.betterend.world.structures.features.StructureMountain; import ru.betterend.world.structures.features.StructurePaintedMountain; import ru.betterend.world.structures.piece.CavePiece; import ru.betterend.world.structures.piece.LakePiece; -import ru.betterend.world.structures.piece.MountainPiece; +import ru.betterend.world.structures.piece.CrystalMountainPiece; import ru.betterend.world.structures.piece.NBTPiece; import ru.betterend.world.structures.piece.PaintedMountainPiece; import ru.betterend.world.structures.piece.VoxelPiece; public class EndStructures { public static final StructurePieceType VOXEL_PIECE = register("voxel", VoxelPiece::new); - public static final StructurePieceType MOUNTAIN_PIECE = register("mountain_piece", MountainPiece::new); + public static final StructurePieceType MOUNTAIN_PIECE = register("mountain_piece", CrystalMountainPiece::new); public static final StructurePieceType CAVE_PIECE = register("cave_piece", CavePiece::new); public static final StructurePieceType LAKE_PIECE = register("lake_piece", LakePiece::new); public static final StructurePieceType PAINTED_MOUNTAIN_PIECE = register("painted_mountain_piece", PaintedMountainPiece::new); diff --git a/src/main/java/ru/betterend/world/structures/features/StructureMountain.java b/src/main/java/ru/betterend/world/structures/features/StructureMountain.java index 6f84c53a..f9ed7476 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructureMountain.java +++ b/src/main/java/ru/betterend/world/structures/features/StructureMountain.java @@ -11,7 +11,7 @@ import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; import net.minecraft.world.gen.feature.StructureFeature; import ru.betterend.util.MHelper; -import ru.betterend.world.structures.piece.MountainPiece; +import ru.betterend.world.structures.piece.CrystalMountainPiece; public class StructureMountain extends StructureFeatureBase { @Override @@ -32,7 +32,7 @@ public class StructureMountain extends StructureFeatureBase { if (y > 5) { float radius = MHelper.randRange(50, 100, random); float height = radius * MHelper.randRange(0.8F, 1.2F, random); - MountainPiece piece = new MountainPiece(new BlockPos(x, y, z), radius, height, random, biome); + CrystalMountainPiece piece = new CrystalMountainPiece(new BlockPos(x, y, z), radius, height, random, biome); this.children.add(piece); } this.setBoundingBoxFromChildren(); diff --git a/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java new file mode 100644 index 00000000..5267cc2c --- /dev/null +++ b/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java @@ -0,0 +1,167 @@ +package ru.betterend.world.structures.piece; + +import java.util.Random; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.structure.StructureManager; +import net.minecraft.util.math.BlockBox; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.Heightmap; +import net.minecraft.world.Heightmap.Type; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.gen.StructureAccessor; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import ru.betterend.registry.EndBiomes; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndStructures; +import ru.betterend.registry.EndTags; +import ru.betterend.util.MHelper; + +public class CrystalMountainPiece extends MountainPiece { + private BlockState top; + + public CrystalMountainPiece(BlockPos center, float radius, float height, Random random, Biome biome) { + super(EndStructures.MOUNTAIN_PIECE, center, radius, height, random, biome); + top = biome.getGenerationSettings().getSurfaceConfig().getTopMaterial(); + } + + public CrystalMountainPiece(StructureManager manager, CompoundTag tag) { + super(EndStructures.MOUNTAIN_PIECE, manager, tag); + } + + @Override + protected void fromNbt(CompoundTag tag) { + super.fromNbt(tag); + top = EndBiomes.getBiome(biomeID).getBiome().getGenerationSettings().getSurfaceConfig().getTopMaterial(); + } + + @Override + public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + int sx = chunkPos.getStartX(); + int sz = chunkPos.getStartZ(); + Mutable pos = new Mutable(); + Chunk chunk = world.getChunk(chunkPos.x, chunkPos.z); + Heightmap map = chunk.getHeightmap(Type.WORLD_SURFACE); + Heightmap map2 = chunk.getHeightmap(Type.WORLD_SURFACE_WG); + for (int x = 0; x < 16; x++) { + int px = x + sx; + int px2 = px - center.getX(); + px2 *= px2; + pos.setX(x); + for (int z = 0; z < 16; z++) { + int pz = z + sz; + int pz2 = pz - center.getZ(); + pz2 *= pz2; + float dist = px2 + pz2; + if (dist < r2) { + pos.setZ(z); + dist = 1 - (float) Math.pow(dist / r2, 0.3); + int minY = map.get(x, z); + if (minY < 10) { + continue; + } + pos.setY(minY); + while (!chunk.getBlockState(pos).isIn(EndTags.GEN_TERRAIN) && pos.getY() > 56 && !chunk.getBlockState(pos.down()).isOf(Blocks.CAVE_AIR)) { + pos.setY(pos.getY() - 1); + } + minY = pos.getY(); + minY = Math.max(minY, map2.get(x, z)); + if (minY > center.getY() - 8) { + float maxY = dist * height * getHeightClamp(world, 12, px, pz); + if (maxY > 0) { + maxY *= (float) noise1.eval(px * 0.05, pz * 0.05) * 0.3F + 0.7F; + maxY *= (float) noise1.eval(px * 0.1, pz * 0.1) * 0.1F + 0.8F; + maxY += center.getY(); + int maxYI = (int) (maxY); + int cover = maxYI - 1; + boolean needCover = (noise1.eval(px * 0.1, pz * 0.1) + MHelper.randRange(-0.4, 0.4, random) - (center.getY() + 14) * 0.1) > 0; + for (int y = minY - 1; y < maxYI; y++) { + pos.setY(y); + chunk.setBlockState(pos, needCover && y == cover ? top : Blocks.END_STONE.getDefaultState(), false); + } + } + } + } + } + } + + map = chunk.getHeightmap(Type.WORLD_SURFACE); + + // Big crystals + int count = (map.get(8, 8) - (center.getY() + 24)) / 7; + count = MathHelper.clamp(count, 0, 8); + for (int i = 0; i < count; i++) { + int radius = MHelper.randRange(2, 3, random); + float fill = MHelper.randRange(0F, 1F, random); + int x = MHelper.randRange(radius, 15 - radius, random); + int z = MHelper.randRange(radius, 15 - radius, random); + int y = map.get(x, z); + if (y > 80) { + pos.set(x, y, z); + if (chunk.getBlockState(pos.down()).isOf(Blocks.END_STONE)) { + int height = MHelper.floor(radius * MHelper.randRange(1.5F, 3F, random) + (y - 80) * 0.3F); + crystal(chunk, pos, radius, height, fill, random); + } + } + } + + // Small crystals + count = (map.get(8, 8) - (center.getY() + 24)) / 2; + count = MathHelper.clamp(count, 4, 8); + for (int i = 0; i < count; i++) { + int radius = MHelper.randRange(1, 2, random); + float fill = random.nextBoolean() ? 0 : 1; + int x = MHelper.randRange(radius, 15 - radius, random); + int z = MHelper.randRange(radius, 15 - radius, random); + int y = map.get(x, z); + if (y > 80) { + pos.set(x, y, z); + if (chunk.getBlockState(pos.down()).getBlock() == Blocks.END_STONE) { + int height = MHelper.floor(radius * MHelper.randRange(1.5F, 3F, random) + (y - 80) * 0.3F); + crystal(chunk, pos, radius, height, fill, random); + } + } + } + + return true; + } + + private void crystal(Chunk chunk, BlockPos pos, int radius, int height, float fill, Random random) { + Mutable mut = new Mutable(); + int max = MHelper.floor(fill * radius + radius + 0.5F); + height += pos.getY(); + Heightmap map = chunk.getHeightmap(Type.WORLD_SURFACE); + int coefX = MHelper.randRange(-1, 1, random); + int coefZ = MHelper.randRange(-1, 1, random); + for (int x = -radius; x <= radius; x++) { + mut.setX(x + pos.getX()); + if (mut.getX() >= 0 && mut.getX() < 16) { + int ax = Math.abs(x); + for (int z = -radius; z <= radius; z++) { + mut.setZ(z + pos.getZ()); + if (mut.getZ() >= 0 && mut.getZ() < 16) { + int az = Math.abs(z); + if (ax + az < max) { + int minY = map.get(mut.getX(), mut.getZ()) - MHelper.randRange(3, 7, random); + if (pos.getY() - minY > 8) { + minY = pos.getY() - 8; + } + int h = coefX * x + coefZ * z + height; + for (int y = minY; y < h; y++) { + mut.setY(y); + chunk.setBlockState(mut, EndBlocks.AURORA_CRYSTAL.getDefaultState(), false); + } + } + } + } + } + } + } +} diff --git a/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java index cd875fcc..22ce829e 100644 --- a/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java @@ -5,46 +5,36 @@ import java.util.Random; import com.google.common.collect.Maps; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtHelper; import net.minecraft.structure.StructureManager; +import net.minecraft.structure.StructurePieceType; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockBox; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.MathHelper; -import net.minecraft.world.Heightmap; import net.minecraft.world.Heightmap.Type; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.biome.Biome; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.gen.StructureAccessor; -import net.minecraft.world.gen.chunk.ChunkGenerator; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndStructures; -import ru.betterend.registry.EndTags; import ru.betterend.util.MHelper; -public class MountainPiece extends BasePiece { - private Map heightmap = Maps.newHashMap(); - private OpenSimplexNoise noise1; - private OpenSimplexNoise noise2; - private BlockPos center; - private float radius; - private float height; - private float r2; - private Identifier biomeID; - private BlockState top; - private int seed1; - private int seed2; +public abstract class MountainPiece extends BasePiece { + protected Map heightmap = Maps.newHashMap(); + protected OpenSimplexNoise noise1; + protected OpenSimplexNoise noise2; + protected BlockPos center; + protected float radius; + protected float height; + protected float r2; + protected Identifier biomeID; + protected int seed1; + protected int seed2; - public MountainPiece(BlockPos center, float radius, float height, Random random, Biome biome) { - super(EndStructures.MOUNTAIN_PIECE, random.nextInt()); + public MountainPiece(StructurePieceType type, BlockPos center, float radius, float height, Random random, Biome biome) { + super(type, random.nextInt()); this.center = center; this.radius = radius; this.height = height; @@ -54,12 +44,11 @@ public class MountainPiece extends BasePiece { this.noise1 = new OpenSimplexNoise(this.seed1); this.noise2 = new OpenSimplexNoise(this.seed2); this.biomeID = EndBiomes.getBiomeID(biome); - top = biome.getGenerationSettings().getSurfaceConfig().getTopMaterial(); makeBoundingBox(); } - public MountainPiece(StructureManager manager, CompoundTag tag) { - super(EndStructures.MOUNTAIN_PIECE, tag); + public MountainPiece(StructurePieceType type, StructureManager manager, CompoundTag tag) { + super(type, tag); makeBoundingBox(); } @@ -84,98 +73,6 @@ public class MountainPiece extends BasePiece { seed2 = tag.getInt("seed2"); noise1 = new OpenSimplexNoise(seed1); noise2 = new OpenSimplexNoise(seed2); - top = EndBiomes.getBiome(biomeID).getBiome().getGenerationSettings().getSurfaceConfig().getTopMaterial(); - } - - @Override - public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { - int sx = chunkPos.getStartX(); - int sz = chunkPos.getStartZ(); - Mutable pos = new Mutable(); - Chunk chunk = world.getChunk(chunkPos.x, chunkPos.z); - Heightmap map = chunk.getHeightmap(Type.WORLD_SURFACE); - Heightmap map2 = chunk.getHeightmap(Type.WORLD_SURFACE_WG); - for (int x = 0; x < 16; x++) { - int px = x + sx; - int px2 = px - center.getX(); - px2 *= px2; - pos.setX(x); - for (int z = 0; z < 16; z++) { - int pz = z + sz; - int pz2 = pz - center.getZ(); - pz2 *= pz2; - float dist = px2 + pz2; - if (dist < r2) { - pos.setZ(z); - dist = 1 - (float) Math.pow(dist / r2, 0.3); - int minY = map.get(x, z); - if (minY < 10) { - continue; - } - pos.setY(minY); - while (!chunk.getBlockState(pos).isIn(EndTags.GEN_TERRAIN) && pos.getY() > 56 && !chunk.getBlockState(pos.down()).isOf(Blocks.CAVE_AIR)) { - pos.setY(pos.getY() - 1); - } - minY = pos.getY(); - minY = Math.max(minY, map2.get(x, z)); - if (minY > center.getY() - 8) { - float maxY = dist * height * getHeightClamp(world, 12, px, pz); - if (maxY > 0) { - maxY *= (float) noise1.eval(px * 0.05, pz * 0.05) * 0.3F + 0.7F; - maxY *= (float) noise1.eval(px * 0.1, pz * 0.1) * 0.1F + 0.8F; - maxY += center.getY(); - int maxYI = (int) (maxY); - int cover = maxYI - 1; - boolean needCover = (noise1.eval(px * 0.1, pz * 0.1) + MHelper.randRange(-0.4, 0.4, random) - (center.getY() + 14) * 0.1) > 0; - for (int y = minY - 1; y < maxYI; y++) { - pos.setY(y); - chunk.setBlockState(pos, needCover && y == cover ? top : Blocks.END_STONE.getDefaultState(), false); - } - } - } - } - } - } - - map = chunk.getHeightmap(Type.WORLD_SURFACE); - - // Big crystals - int count = (map.get(8, 8) - (center.getY() + 24)) / 7; - count = MathHelper.clamp(count, 0, 8); - for (int i = 0; i < count; i++) { - int radius = MHelper.randRange(2, 3, random); - float fill = MHelper.randRange(0F, 1F, random); - int x = MHelper.randRange(radius, 15 - radius, random); - int z = MHelper.randRange(radius, 15 - radius, random); - int y = map.get(x, z); - if (y > 80) { - pos.set(x, y, z); - if (chunk.getBlockState(pos.down()).isOf(Blocks.END_STONE)) { - int height = MHelper.floor(radius * MHelper.randRange(1.5F, 3F, random) + (y - 80) * 0.3F); - crystal(chunk, pos, radius, height, fill, random); - } - } - } - - // Small crystals - count = (map.get(8, 8) - (center.getY() + 24)) / 2; - count = MathHelper.clamp(count, 4, 8); - for (int i = 0; i < count; i++) { - int radius = MHelper.randRange(1, 2, random); - float fill = random.nextBoolean() ? 0 : 1; - int x = MHelper.randRange(radius, 15 - radius, random); - int z = MHelper.randRange(radius, 15 - radius, random); - int y = map.get(x, z); - if (y > 80) { - pos.set(x, y, z); - if (chunk.getBlockState(pos.down()).getBlock() == Blocks.END_STONE) { - int height = MHelper.floor(radius * MHelper.randRange(1.5F, 3F, random) + (y - 80) * 0.3F); - crystal(chunk, pos, radius, height, fill, random); - } - } - } - - return true; } private int getHeight(StructureWorldAccess world, BlockPos pos) { @@ -209,7 +106,7 @@ public class MountainPiece extends BasePiece { return h; } - private float getHeightClamp(StructureWorldAccess world, int radius, int posX, int posZ) { + protected float getHeightClamp(StructureWorldAccess world, int radius, int posX, int posZ) { Mutable mut = new Mutable(); float height = 0; float max = 0; @@ -237,36 +134,4 @@ public class MountainPiece extends BasePiece { int maxZ = MHelper.floor(center.getZ() + radius + 1); this.boundingBox = new BlockBox(minX, minZ, maxX, maxZ); } - - private void crystal(Chunk chunk, BlockPos pos, int radius, int height, float fill, Random random) { - Mutable mut = new Mutable(); - int max = MHelper.floor(fill * radius + radius + 0.5F); - height += pos.getY(); - Heightmap map = chunk.getHeightmap(Type.WORLD_SURFACE); - int coefX = MHelper.randRange(-1, 1, random); - int coefZ = MHelper.randRange(-1, 1, random); - for (int x = -radius; x <= radius; x++) { - mut.setX(x + pos.getX()); - if (mut.getX() >= 0 && mut.getX() < 16) { - int ax = Math.abs(x); - for (int z = -radius; z <= radius; z++) { - mut.setZ(z + pos.getZ()); - if (mut.getZ() >= 0 && mut.getZ() < 16) { - int az = Math.abs(z); - if (ax + az < max) { - int minY = map.get(mut.getX(), mut.getZ()) - MHelper.randRange(3, 7, random); - if (pos.getY() - minY > 8) { - minY = pos.getY() - 8; - } - int h = coefX * x + coefZ * z + height; - for (int y = minY; y < h; y++) { - mut.setY(y); - chunk.setBlockState(mut, EndBlocks.AURORA_CRYSTAL.getDefaultState(), false); - } - } - } - } - } - } - } } diff --git a/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java index 48f7b0b5..3176cf11 100644 --- a/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java @@ -1,21 +1,16 @@ package ru.betterend.world.structures.piece; -import java.util.Map; import java.util.Random; -import com.google.common.collect.Maps; - import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.NbtHelper; import net.minecraft.structure.StructureManager; -import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockBox; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos.Mutable; import net.minecraft.util.math.ChunkPos; -import net.minecraft.util.math.MathHelper; import net.minecraft.world.Heightmap; import net.minecraft.world.Heightmap.Type; import net.minecraft.world.StructureWorldAccess; @@ -23,53 +18,23 @@ import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.gen.StructureAccessor; import net.minecraft.world.gen.chunk.ChunkGenerator; -import ru.betterend.noise.OpenSimplexNoise; -import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndStructures; import ru.betterend.util.MHelper; -public class PaintedMountainPiece extends BasePiece { - private Map heightmap = Maps.newHashMap(); - private OpenSimplexNoise noise1; - private OpenSimplexNoise noise2; - private BlockPos center; - private float radius; - private float height; - private float r2; - private Identifier biomeID; +public class PaintedMountainPiece extends MountainPiece { private BlockState[] slises; - private int seed1; - private int seed2; - public PaintedMountainPiece(BlockPos center, float radius, float height, Random random, Biome biome, BlockState[] slises) { - super(EndStructures.PAINTED_MOUNTAIN_PIECE, random.nextInt()); - this.center = center; - this.radius = radius; - this.height = height; - this.r2 = radius * radius; - this.seed1 = random.nextInt(); - this.seed2 = random.nextInt(); - this.noise1 = new OpenSimplexNoise(this.seed1); - this.noise2 = new OpenSimplexNoise(this.seed2); - this.biomeID = EndBiomes.getBiomeID(biome); + super(EndStructures.PAINTED_MOUNTAIN_PIECE, center, radius, height, random, biome); this.slises = slises; - makeBoundingBox(); } public PaintedMountainPiece(StructureManager manager, CompoundTag tag) { - super(EndStructures.PAINTED_MOUNTAIN_PIECE, tag); - makeBoundingBox(); + super(EndStructures.PAINTED_MOUNTAIN_PIECE, manager, tag); } @Override protected void toNbt(CompoundTag tag) { - tag.put("center", NbtHelper.fromBlockPos(center)); - tag.putFloat("radius", radius); - tag.putFloat("height", height); - tag.putString("biome", biomeID.toString()); - tag.putInt("seed1", seed1); - tag.putInt("seed2", seed2); - + super.toNbt(tag); ListTag slise = new ListTag(); for (BlockState state: slises) { slise.add(NbtHelper.fromBlockState(state)); @@ -79,15 +44,7 @@ public class PaintedMountainPiece extends BasePiece { @Override protected void fromNbt(CompoundTag tag) { - center = NbtHelper.toBlockPos(tag.getCompound("center")); - radius = tag.getFloat("radius"); - height = tag.getFloat("height"); - biomeID = new Identifier(tag.getString("biome")); - r2 = radius * radius; - seed1 = tag.getInt("seed1"); - seed2 = tag.getInt("seed2"); - noise1 = new OpenSimplexNoise(seed1); - noise2 = new OpenSimplexNoise(seed2); + super.fromNbt(tag); ListTag slise = tag.getList("slises", 10); slises = new BlockState[slise.size()]; for (int i = 0; i < slises.length; i++) { @@ -123,12 +80,12 @@ public class PaintedMountainPiece extends BasePiece { } minY = pos.getY(); minY = Math.max(minY, map2.get(x, z)); - if (minY > 56) { - float maxY = dist * height * getHeightClamp(world, 8, px, pz); + if (minY > center.getY() - 8) { + float maxY = dist * height * getHeightClamp(world, 10, px, pz); if (maxY > 0) { maxY *= (float) noise1.eval(px * 0.05, pz * 0.05) * 0.3F + 0.7F; maxY *= (float) noise1.eval(px * 0.1, pz * 0.1) * 0.1F + 0.9F; - maxY += 56; + maxY += center.getY(); float offset = (float) (noise1.eval(px * 0.07, pz * 0.07) * 5 + noise1.eval(px * 0.2, pz * 0.2) * 2 + 7); for (int y = minY - 1; y < maxY; y++) { pos.setY(y); @@ -143,61 +100,4 @@ public class PaintedMountainPiece extends BasePiece { return true; } - - private int getHeight(StructureWorldAccess world, BlockPos pos) { - int p = ((pos.getX() & 2047) << 11) | (pos.getZ() & 2047); - int h = heightmap.getOrDefault(p, Integer.MIN_VALUE); - if (h > Integer.MIN_VALUE) { - return h; - } - - if (!EndBiomes.getBiomeID(world.getBiome(pos)).equals(biomeID)) { - heightmap.put(p, -4); - return -4; - } - h = world.getTopY(Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); - if (h < 57) { - heightmap.put(p, -4); - return -4; - } - h = MHelper.floor(noise2.eval(pos.getX() * 0.005, pos.getZ() * 0.005) * noise2.eval(pos.getX() * 0.001, pos.getZ() * 0.001) * 8 + 8); - - if (h < 0) { - heightmap.put(p, 0); - return 0; - } - - heightmap.put(p, h); - - return h; - } - - private float getHeightClamp(StructureWorldAccess world, int radius, int posX, int posZ) { - Mutable mut = new Mutable(); - float height = 0; - float max = 0; - for (int x = -radius; x <= radius; x++) { - mut.setX(posX + x); - int x2 = x * x; - for (int z = -radius; z <= radius; z++) { - mut.setZ(posZ + z); - int z2 = z * z; - float mult = 1 - (float) Math.sqrt(x2 + z2) / radius; - if (mult > 0) { - max += mult; - height += getHeight(world, mut) * mult; - } - } - } - height /= max; - return MathHelper.clamp(height / radius, 0, 1); - } - - private void makeBoundingBox() { - int minX = MHelper.floor(center.getX() - radius); - int minZ = MHelper.floor(center.getZ() - radius); - int maxX = MHelper.floor(center.getX() + radius + 1); - int maxZ = MHelper.floor(center.getZ() + radius + 1); - this.boundingBox = new BlockBox(minX, minZ, maxX, maxZ); - } } From 38a09c7221c04a0b103adb3824444600c8dd2f73 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 9 Feb 2021 15:06:08 +0300 Subject: [PATCH 250/463] BYG crash fix, BYG end sub-biome support, Old Bulbis Gardens improvements --- .../integration/AdornIntegration.java | 20 +++----- .../betterend/integration/ModIntegration.java | 44 +++++++++++----- .../integration/byg/BYGIntegration.java | 50 +++++++++++++++++++ .../byg/biomes/OldBulbisGardens.java | 49 ++++++++++++++---- .../integration/byg/features/BYGFeatures.java | 5 +- .../byg/features/OldBulbisTreeFeature.java | 7 ++- .../java/ru/betterend/registry/EndBiomes.java | 9 ++-- .../ru/betterend/registry/EndStructures.java | 2 +- .../ru/betterend/world/biome/EndBiome.java | 35 +++++++++++-- .../world/generator/BiomePicker.java | 15 +++++- 10 files changed, 183 insertions(+), 53 deletions(-) diff --git a/src/main/java/ru/betterend/integration/AdornIntegration.java b/src/main/java/ru/betterend/integration/AdornIntegration.java index 707daefe..1a2ef30e 100644 --- a/src/main/java/ru/betterend/integration/AdornIntegration.java +++ b/src/main/java/ru/betterend/integration/AdornIntegration.java @@ -1,9 +1,5 @@ package ru.betterend.integration; -import java.lang.reflect.Method; - -import ru.betterend.BetterEnd; - public class AdornIntegration extends ModIntegration { public AdornIntegration() { super("adorn"); @@ -11,15 +7,15 @@ public class AdornIntegration extends ModIntegration { @Override public void register() { - Class adornBlockBuilder = getClass("juuxel.adorn.api.block.AdornBlockBuilder"); - Class blockVariantWood = getClass("juuxel.adorn.api.block.BlockVariant$Wood"); - Class blockVariant = getClass("juuxel.adorn.api.block.BlockVariant"); + //Class adornBlockBuilder = getClass("juuxel.adorn.api.block.AdornBlockBuilder"); + //Class blockVariantWood = getClass("juuxel.adorn.api.block.BlockVariant$Wood"); + //Class blockVariant = getClass("juuxel.adorn.api.block.BlockVariant"); - Object testVariant = newInstance(blockVariantWood, BetterEnd.MOD_ID + "/mossy_glowshroom"); - Method create = getMethod(adornBlockBuilder, "create", blockVariant); - Object builder = executeMethod(adornBlockBuilder, create, testVariant); - getAndExecuteRuntime(builder, "withEverything"); - getAndExecuteRuntime(builder, "registerIn", BetterEnd.MOD_ID); + //Object testVariant = newInstance(blockVariantWood, BetterEnd.MOD_ID + "/mossy_glowshroom"); + //Method create = getMethod(adornBlockBuilder, "create", blockVariant); + //Object builder = executeMethod(adornBlockBuilder, create, testVariant); + //getAndExecuteRuntime(builder, "withEverything"); + //getAndExecuteRuntime(builder, "registerIn", BetterEnd.MOD_ID); } @Override diff --git a/src/main/java/ru/betterend/integration/ModIntegration.java b/src/main/java/ru/betterend/integration/ModIntegration.java index ef39fa69..07074df6 100644 --- a/src/main/java/ru/betterend/integration/ModIntegration.java +++ b/src/main/java/ru/betterend/integration/ModIntegration.java @@ -1,6 +1,7 @@ package ru.betterend.integration; import java.lang.reflect.Constructor; +import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -87,25 +88,41 @@ public abstract class ModIntegration { return cl; } - public Method getMethod(Class cl, String functionName, Class... args) { + @SuppressWarnings("unchecked") + public T getStaticFieldValue(Class cl, String name) { if (cl != null) { try { - return cl.getMethod(functionName, args); - } - catch (NoSuchMethodException | SecurityException e) { - BetterEnd.LOGGER.error(e.getMessage()); - if (BetterEnd.isDevEnvironment()) { - e.printStackTrace(); + Field field = cl.getDeclaredField(name); + if (field != null) { + return (T) field.get(null); } } + catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { + e.printStackTrace(); + } } return null; } - public Method getInstanceMethod(Object instance, String functionName, Class... args) { - if (instance != null) { + public Object getFieldValue(Class cl, String name, Object classInstance) { + if (cl != null) { try { - return instance.getClass().getDeclaredMethod(functionName, args); + Field field = cl.getDeclaredField(name); + if (field != null) { + return field.get(classInstance); + } + } + catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { + e.printStackTrace(); + } + } + return null; + } + + public Method getMethod(Class cl, String functionName, Class... args) { + if (cl != null) { + try { + return cl.getMethod(functionName, args); } catch (NoSuchMethodException | SecurityException e) { BetterEnd.LOGGER.error(e.getMessage()); @@ -144,14 +161,15 @@ public abstract class ModIntegration { return null; } - public Object getAndExecuteRuntime(Object instance, String functionName, Object... args) { + @SuppressWarnings("unchecked") + public T getAndExecuteRuntime(Class cl, Object instance, String functionName, Object... args) { if (instance != null) { Class[] classes = new Class[args.length]; for (int i = 0; i < args.length; i++) { classes[i] = args[i].getClass(); } - Method method = getInstanceMethod(instance, functionName, classes); - return executeMethod(instance, method, args); + Method method = getMethod(cl, functionName, classes); + return (T) executeMethod(instance, method, args); } return null; } diff --git a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java index d6797d65..6064442b 100644 --- a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java +++ b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java @@ -1,11 +1,20 @@ package ru.betterend.integration.byg; +import java.util.List; +import java.util.stream.Collectors; + +import net.minecraft.util.Identifier; +import net.minecraft.util.collection.WeightedList; +import net.minecraft.util.registry.BuiltinRegistries; +import net.minecraft.world.biome.Biome; import ru.betterend.integration.Integrations; import ru.betterend.integration.ModIntegration; import ru.betterend.integration.byg.biomes.BYGBiomes; import ru.betterend.integration.byg.features.BYGFeatures; +import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndTags; import ru.betterend.util.TagHelper; +import ru.betterend.world.biome.EndBiome; public class BYGIntegration extends ModIntegration { public BYGIntegration() { @@ -23,5 +32,46 @@ public class BYGIntegration extends ModIntegration { @Override public void addBiomes() { BYGBiomes.addBiomes(); + + Class biomeClass = this.getClass("corgiaoc.byg.common.world.biome.BYGEndBiome"); + List biomes = this.getStaticFieldValue(biomeClass, "BYG_END_BIOMES"); + + if (biomes != null && biomeClass != null) { + biomes.forEach((obj) -> { + Biome biome = this.getAndExecuteRuntime(biomeClass, obj, "getBiome"); + if (biome != null) { + Identifier biomeID = BuiltinRegistries.BIOME.getId(biome); + EndBiome endBiome = EndBiomes.getBiome(biomeID); + Biome edge = this.getAndExecuteRuntime(biomeClass, obj, "getEdge"); + if (edge != null) { + Identifier edgeID = BuiltinRegistries.BIOME.getId(edge); + EndBiomes.LAND_BIOMES.removeMutableBiome(edgeID); + EndBiomes.VOID_BIOMES.removeMutableBiome(edgeID); + EndBiome edgeBiome = EndBiomes.getBiome(edgeID); + endBiome.setEdge(edgeBiome); + endBiome.setEdgeSize(32); + } + else { + boolean isVoid = this.getAndExecuteRuntime(biomeClass, obj, "isVoid"); + if (isVoid) { + EndBiomes.LAND_BIOMES.removeMutableBiome(biomeID); + EndBiomes.VOID_BIOMES.addBiome(endBiome); + } + WeightedList subBiomes = this.getAndExecuteRuntime(biomeClass, obj, "getHills"); + if (subBiomes != null) { + subBiomes.stream().collect(Collectors.toList()).forEach((id) -> { + EndBiome subBiome = EndBiomes.getBiome(id); + EndBiomes.LAND_BIOMES.removeMutableBiome(id); + EndBiomes.VOID_BIOMES.removeMutableBiome(id); + if (!endBiome.containsSubBiome(subBiome)) { + EndBiomes.SUBBIOMES.add(subBiome); + endBiome.addSubBiome(subBiome); + } + }); + } + } + } + }); + } } } diff --git a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java index 739bc7b1..ec711c80 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java @@ -1,14 +1,21 @@ package ru.betterend.integration.byg.biomes; import java.util.List; +import java.util.function.Supplier; +import net.minecraft.block.Block; import net.minecraft.entity.SpawnGroup; import net.minecraft.particle.ParticleTypes; import net.minecraft.sound.SoundEvent; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.BuiltinRegistries; +import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeEffects; import net.minecraft.world.biome.SpawnSettings.SpawnEntry; import net.minecraft.world.gen.GenerationStep.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.ConfiguredFeatures; import ru.betterend.BetterEnd; import ru.betterend.integration.Integrations; import ru.betterend.integration.byg.features.BYGFeatures; @@ -25,24 +32,17 @@ public class OldBulbisGardens extends EndBiome { Biome biome = Integrations.BYG.getBiome("bulbis_gardens"); BiomeEffects effects = biome.getEffects(); + Block ivis = Integrations.BYG.getBlock("ivis_phylium"); + Block origin = biome.getGenerationSettings().getSurfaceConfig().getTopMaterial().getBlock(); BiomeDefinition def = new BiomeDefinition("old_bulbis_gardens") .setFogColor(215, 132, 207) .setFogDensity(1.8F) .setWaterAndFogColor(40, 0, 56) .setFoliageColor(122, 17, 155) .setParticles(ParticleTypes.REVERSE_PORTAL, 0.002F) - .setSurface(Integrations.BYG.getBlock("ivis_phylium")) + .setSurface(ivis, origin) .addFeature(EndFeatures.END_LAKE_RARE) - .addFeature(BYGFeatures.OLD_BULBIS_TREE) - .addFeature(Feature.VEGETAL_DECORATION, BYGFeatures.BULBIS_TREES) - .addFeature(Feature.VEGETAL_DECORATION, BYGFeatures.PURPLE_BULBIS_TREES) - .addFeature(EndFeatures.PURPLE_POLYPORE) - .addFeature(BYGFeatures.IVIS_MOSS_WOOD) - .addFeature(BYGFeatures.IVIS_MOSS) - .addFeature(BYGFeatures.IVIS_VINE) - .addFeature(BYGFeatures.IVIS_SPROUT) - .addFeature(BYGFeatures.BULBIS_ODDITY) - .addFeature(BYGFeatures.PURPLE_BULBIS_ODDITY); + .addFeature(BYGFeatures.OLD_BULBIS_TREE); if (BetterEnd.isClient()) { SoundEvent loop = effects.getLoopSound().get(); @@ -59,6 +59,33 @@ public class OldBulbisGardens extends EndBiome { }); } + List>>> features = biome.getGenerationSettings().getFeatures(); + List>> vegetal = features.get(Feature.VEGETAL_DECORATION.ordinal()); + if (vegetal.size() > 2) { + Supplier> getter; + // Trees (first two features) + // I couldn't process them with conditions, so that's why they are hardcoded (paulevs) + for (int i = 0; i < 2; i++) { + getter = vegetal.get(i); + ConfiguredFeature feature = getter.get(); + Identifier id = BetterEnd.makeID("obg_feature_" + i); + feature = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, feature.decorate(ConfiguredFeatures.Decorators.SQUARE_HEIGHTMAP).repeatRandomly(1)); + def.addFeature(Feature.VEGETAL_DECORATION, feature); + } + // Grasses and other features + for (int i = 2; i < vegetal.size(); i++) { + getter = vegetal.get(i); + ConfiguredFeature feature = getter.get(); + def.addFeature(Feature.VEGETAL_DECORATION, feature); + } + } + + def.addFeature(EndFeatures.PURPLE_POLYPORE) + .addFeature(BYGFeatures.IVIS_MOSS_WOOD) + .addFeature(BYGFeatures.IVIS_MOSS) + .addFeature(BYGFeatures.IVIS_VINE) + .addFeature(BYGFeatures.IVIS_SPROUT); + return def; } } diff --git a/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java b/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java index 1f21a35c..83f9780d 100644 --- a/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java +++ b/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java @@ -1,6 +1,5 @@ package ru.betterend.integration.byg.features; -import net.minecraft.world.gen.feature.ConfiguredFeature; import ru.betterend.integration.Integrations; import ru.betterend.integration.byg.BYGBlocks; import ru.betterend.world.features.EndFeature; @@ -23,8 +22,8 @@ public class BYGFeatures { public static final EndFeature NIGHTSHADE_REDWOOD_TREE = new EndFeature("nightshade_redwood_tree", new NightshadeRedwoodTreeFeature(), 1); public static final EndFeature BIG_ETHER_TREE = new EndFeature("big_ether_tree", new BigEtherTreeFeature(), 1); - public static final ConfiguredFeature BULBIS_TREES = Integrations.BYG.getConfiguredFeature("rs_sparse_bulbis_tree"); - public static final ConfiguredFeature PURPLE_BULBIS_TREES = Integrations.BYG.getConfiguredFeature("rs_sparse_purple_bulbis_tree"); + //public static final ConfiguredFeature BULBIS_TREES = Integrations.BYG.getConfiguredFeature("rs_sparse_bulbis_tree"); + //public static final ConfiguredFeature PURPLE_BULBIS_TREES = Integrations.BYG.getConfiguredFeature("rs_sparse_purple_bulbis_tree"); public static void register() {} } diff --git a/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java index 9f9e89a4..a7d93ef7 100644 --- a/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java @@ -53,7 +53,10 @@ public class OldBulbisTreeFeature extends DefaultFeature { }; float size = MHelper.randRange(10, 20, random); + float addSize = MHelper.randRange(1, 1.7F, random); + float addRad = addSize * 0.5F + 0.5F; int count = (int) (size * 0.15F); + size *= addSize; float var = MHelper.PI2 / (float) (count * 3); float start = MHelper.randRange(0, MHelper.PI2, random); SDF sdf = null; @@ -65,10 +68,10 @@ public class OldBulbisTreeFeature extends DefaultFeature { List spline = SplineHelper.copySpline(SPLINE); float sizeXZ = (size + MHelper.randRange(0, size * 0.5F, random)) * 0.7F; SplineHelper.scale(spline, sizeXZ, sizeXZ * 1.5F + MHelper.randRange(0, size * 0.5F, random), sizeXZ); - SplineHelper.offset(spline, new Vector3f((20 - size), 0, 0)); + SplineHelper.offset(spline, new Vector3f(size * random.nextFloat() * 0.3F, 0, 0)); SplineHelper.rotateSpline(spline, angle); SplineHelper.offsetParts(spline, random, 1F, 0, 1F);//1.3F 0.8F - SDF branch = SplineHelper.buildSDF(spline, 2.3F, 1.3F, (bpos) -> { + SDF branch = SplineHelper.buildSDF(spline, 2.3F * addRad, 1.3F * addRad, (bpos) -> { return stem; }); diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index 5907a212..282ee5cc 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -144,18 +144,15 @@ public class EndBiomes { VOID_BIOMES.rebuild(); LAND_BIOMES.getBiomes().forEach((endBiome) -> { - Biome biome = biomeRegistry.get(endBiome.getID()); - endBiome.setActualBiome(biome); + endBiome.updateActualBiomes(biomeRegistry); }); VOID_BIOMES.getBiomes().forEach((endBiome) -> { - Biome biome = biomeRegistry.get(endBiome.getID()); - endBiome.setActualBiome(biome); + endBiome.updateActualBiomes(biomeRegistry); }); SUBBIOMES.forEach((endBiome) -> { - Biome biome = biomeRegistry.get(endBiome.getID()); - endBiome.setActualBiome(biome); + endBiome.updateActualBiomes(biomeRegistry); }); CLIENT.clear(); diff --git a/src/main/java/ru/betterend/registry/EndStructures.java b/src/main/java/ru/betterend/registry/EndStructures.java index 72c87bf4..a14fd9f3 100644 --- a/src/main/java/ru/betterend/registry/EndStructures.java +++ b/src/main/java/ru/betterend/registry/EndStructures.java @@ -19,8 +19,8 @@ import ru.betterend.world.structures.features.StructureMegaLakeSmall; import ru.betterend.world.structures.features.StructureMountain; import ru.betterend.world.structures.features.StructurePaintedMountain; import ru.betterend.world.structures.piece.CavePiece; -import ru.betterend.world.structures.piece.LakePiece; import ru.betterend.world.structures.piece.CrystalMountainPiece; +import ru.betterend.world.structures.piece.LakePiece; import ru.betterend.world.structures.piece.NBTPiece; import ru.betterend.world.structures.piece.PaintedMountainPiece; import ru.betterend.world.structures.piece.VoxelPiece; diff --git a/src/main/java/ru/betterend/world/biome/EndBiome.java b/src/main/java/ru/betterend/world/biome/EndBiome.java index 7ab7a540..c36369b0 100644 --- a/src/main/java/ru/betterend/world/biome/EndBiome.java +++ b/src/main/java/ru/betterend/world/biome/EndBiome.java @@ -9,6 +9,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; import ru.betterend.config.Configs; import ru.betterend.util.JsonFactory; @@ -161,10 +162,6 @@ public class EndBiome { return structuresFeature; } - public void setActualBiome(Biome biome) { - this.actualBiome = biome; - } - public Biome getActualBiome() { return this.actualBiome; } @@ -180,4 +177,34 @@ public class EndBiome { public boolean hasCaves() { return hasCaves; } + + public void updateActualBiomes(Registry biomeRegistry) { + subbiomes.forEach((sub) -> { + sub.updateActualBiomes(biomeRegistry); + }); + if (edge != null) { + edge.updateActualBiomes(biomeRegistry); + } + Biome biome = biomeRegistry.get(mcID); + this.actualBiome = biome; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + EndBiome biome = (EndBiome) obj; + return biome == null ? false : biome.mcID.equals(mcID); + } + + @Override + public int hashCode() { + return mcID.hashCode(); + } + + public List subbiomes() { + // TODO Auto-generated method stub + return this.subbiomes; + } } diff --git a/src/main/java/ru/betterend/world/generator/BiomePicker.java b/src/main/java/ru/betterend/world/generator/BiomePicker.java index 15108bb8..4db12d23 100644 --- a/src/main/java/ru/betterend/world/generator/BiomePicker.java +++ b/src/main/java/ru/betterend/world/generator/BiomePicker.java @@ -28,7 +28,6 @@ public class BiomePicker { public void addBiomeMutable(EndBiome biome) { biomes.add(biome); - maxChance = biome.mutateGenChance(maxChance); } public void clearMutables() { @@ -49,7 +48,21 @@ public class BiomePicker { return immutableIDs.contains(id); } + public void removeMutableBiome(Identifier id) { + for (int i = biomeCount; i < biomes.size(); i++) { + EndBiome biome = biomes.get(i); + if (biome.getID().equals(id)) { + biomes.remove(i); + break; + } + } + } + public void rebuild() { + maxChance = maxChanceUnmutable; + for (int i = biomeCount; i < biomes.size(); i++) { + maxChance = biomes.get(i).mutateGenChance(maxChance); + } tree = new WeighTree(biomes); } } From e144d1a9084d661b7906a1dadf0360fbba08dd5a Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 9 Feb 2021 15:08:08 +0300 Subject: [PATCH 251/463] Small fixes --- .../integration/byg/BYGIntegration.java | 3 +-- .../java/ru/betterend/world/biome/EndBiome.java | 17 +++++++---------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java index 6064442b..475d608a 100644 --- a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java +++ b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java @@ -49,13 +49,12 @@ public class BYGIntegration extends ModIntegration { EndBiomes.VOID_BIOMES.removeMutableBiome(edgeID); EndBiome edgeBiome = EndBiomes.getBiome(edgeID); endBiome.setEdge(edgeBiome); - endBiome.setEdgeSize(32); } else { boolean isVoid = this.getAndExecuteRuntime(biomeClass, obj, "isVoid"); if (isVoid) { EndBiomes.LAND_BIOMES.removeMutableBiome(biomeID); - EndBiomes.VOID_BIOMES.addBiome(endBiome); + EndBiomes.VOID_BIOMES.addBiomeMutable(endBiome); } WeightedList subBiomes = this.getAndExecuteRuntime(biomeClass, obj, "getHills"); if (subBiomes != null) { diff --git a/src/main/java/ru/betterend/world/biome/EndBiome.java b/src/main/java/ru/betterend/world/biome/EndBiome.java index c36369b0..d8dfb17b 100644 --- a/src/main/java/ru/betterend/world/biome/EndBiome.java +++ b/src/main/java/ru/betterend/world/biome/EndBiome.java @@ -38,11 +38,12 @@ public class EndBiome { private Biome actualBiome; public EndBiome(BiomeDefinition definition) { - biome = definition.build(); - mcID = definition.getID(); - fogDensity = Configs.BIOME_CONFIG.getFloat(mcID, "fog_density", definition.getFodDensity()); - genChanceUnmutable = Configs.BIOME_CONFIG.getFloat(mcID, "generation_chance", definition.getGenChance()); - hasCaves = Configs.BIOME_CONFIG.getBoolean(mcID, "has_caves", definition.hasCaves()); + this.biome = definition.build(); + this.mcID = definition.getID(); + this.fogDensity = Configs.BIOME_CONFIG.getFloat(mcID, "fog_density", definition.getFodDensity()); + this.genChanceUnmutable = Configs.BIOME_CONFIG.getFloat(mcID, "generation_chance", definition.getGenChance()); + this.hasCaves = Configs.BIOME_CONFIG.getBoolean(mcID, "has_caves", definition.hasCaves()); + this.edgeSize = Configs.BIOME_CONFIG.getInt(mcID, "edge_size", 32); readStructureList(); } @@ -52,6 +53,7 @@ public class EndBiome { this.fogDensity = Configs.BIOME_CONFIG.getFloat(mcID, "fog_density", fogDensity); this.genChanceUnmutable = Configs.BIOME_CONFIG.getFloat(mcID, "generation_chance", genChance); this.hasCaves = Configs.BIOME_CONFIG.getBoolean(mcID, "has_caves", hasCaves); + this.edgeSize = Configs.BIOME_CONFIG.getInt(mcID, "edge_size", 32); readStructureList(); } @@ -202,9 +204,4 @@ public class EndBiome { public int hashCode() { return mcID.hashCode(); } - - public List subbiomes() { - // TODO Auto-generated method stub - return this.subbiomes; - } } From 3d0a3d5983241be20795c75683920057184256e1 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 9 Feb 2021 15:15:19 +0300 Subject: [PATCH 252/463] Cleanup --- .../ru/betterend/integration/byg/features/BYGFeatures.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java b/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java index 83f9780d..b2e7e812 100644 --- a/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java +++ b/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java @@ -14,16 +14,11 @@ public class BYGFeatures { public static final EndFeature IVIS_VINE = new EndFeature("ivis_vine", new VineFeature(BYGBlocks.IVIS_VINE, 24), 5); public static final EndFeature IVIS_MOSS = new EndFeature("ivis_moss", new WallPlantFeature(BYGBlocks.IVIS_MOSS, 6), 1); public static final EndFeature IVIS_MOSS_WOOD = new EndFeature("ivis_moss_wood", new WallPlantOnLogFeature(BYGBlocks.IVIS_MOSS, 6), 15); - public static final EndFeature BULBIS_ODDITY = new EndFeature("bulbis_oddity", new SinglePlantFeature(Integrations.BYG.getBlock("bulbis_oddity"), 4, 4), 5); - public static final EndFeature PURPLE_BULBIS_ODDITY = new EndFeature("purple_bulbis_oddity", new SinglePlantFeature(Integrations.BYG.getBlock("purple_bulbis_oddity"), 4, 4), 5); public static final EndFeature NIGHTSHADE_MOSS = new EndFeature("nightshade_moss", new WallPlantFeature(BYGBlocks.NIGHTSHADE_MOSS, 5), 2); public static final EndFeature NIGHTSHADE_MOSS_WOOD = new EndFeature("nightshade_moss_wood", new WallPlantOnLogFeature(BYGBlocks.NIGHTSHADE_MOSS, 5), 8); public static final EndFeature NIGHTSHADE_REDWOOD_TREE = new EndFeature("nightshade_redwood_tree", new NightshadeRedwoodTreeFeature(), 1); public static final EndFeature BIG_ETHER_TREE = new EndFeature("big_ether_tree", new BigEtherTreeFeature(), 1); - //public static final ConfiguredFeature BULBIS_TREES = Integrations.BYG.getConfiguredFeature("rs_sparse_bulbis_tree"); - //public static final ConfiguredFeature PURPLE_BULBIS_TREES = Integrations.BYG.getConfiguredFeature("rs_sparse_purple_bulbis_tree"); - public static void register() {} } From 67e21a361d0ed54aa1c01399c6d011af497f9fc6 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 10 Feb 2021 14:57:24 +0300 Subject: [PATCH 253/463] Metal crafting (WIP) --- .../betterend/blocks/basis/EndAnvilBlock.java | 6 ++- .../blocks/complex/MetalMaterial.java | 48 +++++++++++++++--- .../textures/item/thallasium_hoe_head.png | Bin 0 -> 1716 bytes .../textures/item/thallasium_pickaxe_head.png | Bin 0 -> 1773 bytes .../textures/item/thallasium_shovel_head.png | Bin 0 -> 1747 bytes .../textures/item/thallasium_sword_blade.png | Bin 0 -> 1533 bytes .../textures/item/thallasium_sword_handle.png | Bin 0 -> 1807 bytes 7 files changed, 45 insertions(+), 9 deletions(-) create mode 100644 src/main/resources/assets/betterend/textures/item/thallasium_hoe_head.png create mode 100644 src/main/resources/assets/betterend/textures/item/thallasium_pickaxe_head.png create mode 100644 src/main/resources/assets/betterend/textures/item/thallasium_shovel_head.png create mode 100644 src/main/resources/assets/betterend/textures/item/thallasium_sword_blade.png create mode 100644 src/main/resources/assets/betterend/textures/item/thallasium_sword_handle.png diff --git a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java index 105b1a1c..b63cd2d0 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java @@ -25,9 +25,11 @@ import ru.betterend.patterns.Patterns; public class EndAnvilBlock extends AnvilBlock implements BlockPatterned { public static final IntProperty DESTRUCTION = BlockProperties.DESTRUCTION; + private final int level; - public EndAnvilBlock(MaterialColor color) { + public EndAnvilBlock(MaterialColor color, int level) { super(FabricBlockSettings.copyOf(Blocks.ANVIL).materialColor(color)); + this.level = level; } @Override @@ -37,7 +39,7 @@ public class EndAnvilBlock extends AnvilBlock implements BlockPatterned { } public int getCraftingLevel() { - return 1; + return level; } @Override diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index a2acc88c..51710a29 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -12,6 +12,7 @@ import net.minecraft.item.Items; import net.minecraft.item.ToolMaterial; import net.minecraft.sound.BlockSoundGroup; import net.minecraft.tag.BlockTags; +import net.minecraft.tag.ItemTags; import ru.betterend.blocks.BulbVineLanternBlock; import ru.betterend.blocks.BulbVineLanternColoredBlock; import ru.betterend.blocks.ChandelierBlock; @@ -33,8 +34,10 @@ import ru.betterend.item.EndShovelItem; import ru.betterend.item.EndSwordItem; import ru.betterend.item.PatternedItem; import ru.betterend.recipe.builders.AlloyingRecipe; +import ru.betterend.recipe.builders.AnvilRecipe; import ru.betterend.recipe.builders.FurnaceRecipe; import ru.betterend.recipe.builders.GridRecipe; +import ru.betterend.recipe.builders.SmithingTableRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; import ru.betterend.util.TagHelper; @@ -58,6 +61,14 @@ public class MetalMaterial { public final Item nugget; public final Item ingot; + + public final Item shovelHead; + public final Item pickaxeHead; + public final Item axeHead; + public final Item hoeHead; + public final Item swordBlade; + public final Item swordHandle; + public final Item shovel; public final Item sword; public final Item pickaxe; @@ -88,6 +99,7 @@ public class MetalMaterial { private MetalMaterial(String name, boolean hasOre, FabricBlockSettings settings, Settings itemSettings, ToolMaterial material, ArmorMaterial armor) { FabricBlockSettings lantern = FabricBlockSettings.copyOf(settings).sounds(BlockSoundGroup.LANTERN).hardness(1).resistance(1).luminance(15); + final int level = material.getMiningLevel(); ore = hasOre ? EndBlocks.registerBlock(name + "_ore", new BlockBase(FabricBlockSettings.copyOf(Blocks.END_STONE))) : null; block = EndBlocks.registerBlock(name + "_block", new BlockBase(settings)); @@ -96,7 +108,7 @@ public class MetalMaterial { slab = EndBlocks.registerBlock(name + "_slab", new EndSlabBlock(tile)); door = EndBlocks.registerBlock(name + "_door", new EndDoorBlock(block)); trapdoor = EndBlocks.registerBlock(name + "_trapdoor", new EndTrapdoorBlock(block)); - anvil = EndBlocks.registerBlock(name + "_anvil", new EndAnvilBlock(block.getDefaultMaterialColor())); + anvil = EndBlocks.registerBlock(name + "_anvil", new EndAnvilBlock(block.getDefaultMaterialColor(), level)); bars = EndBlocks.registerBlock(name + "_bars", new EndMetalPaneBlock(block)); chain = EndBlocks.registerBlock(name + "_chain", new EndChainBlock(block.getDefaultMaterialColor())); plate = EndBlocks.registerBlock(name + "_plate", new EndWoodenPlateBlock(block)); @@ -107,6 +119,14 @@ public class MetalMaterial { nugget = EndItems.registerItem(name + "_nugget", new PatternedItem(itemSettings)); ingot = EndItems.registerItem(name + "_ingot", new PatternedItem(itemSettings)); + + shovelHead = EndItems.registerItem(name + "_shovel_head"); + pickaxeHead = EndItems.registerItem(name + "_pickaxe_head"); + axeHead = EndItems.registerItem(name + "_axe_head"); + hoeHead = EndItems.registerItem(name + "_hoe_head"); + swordBlade = EndItems.registerItem(name + "_sword_blade"); + swordHandle = EndItems.registerItem(name + "_sword_handle"); + shovel = EndItems.registerTool(name + "_shovel", new EndShovelItem(material, 1.5F, -3.0F, itemSettings)); sword = EndItems.registerTool(name + "_sword", new EndSwordItem(material, 3, -2.4F, itemSettings)); pickaxe = EndItems.registerTool(name + "_pickaxe", new EndPickaxeItem(material, 1, -2.8F, itemSettings)); @@ -124,10 +144,12 @@ public class MetalMaterial { AlloyingRecipe.Builder.create(name + "_ingot_alloy").setInput(ore, ore).setOutput(ingot, 3).setExpiriense(2.1F).build(); } + // Basic recipes GridRecipe.make(name + "_ingot_from_nuggets", ingot).setShape("###", "###", "###").addMaterial('#', nugget).setGroup("end_metal_ingots_nug").build(); GridRecipe.make(name + "_block", block).setShape("###", "###", "###").addMaterial('#', ingot).setGroup("end_metal_blocks").build(); GridRecipe.make(name + "_ingot_from_block", ingot).setOutputCount(9).setList("#").addMaterial('#', block).setGroup("end_metal_ingots").build(); + // Block recipes GridRecipe.make(name + "_tile", tile).setOutputCount(4).setShape("##", "##").addMaterial('#', block).setGroup("end_metal_tiles").build(); GridRecipe.make(name + "_bars", bars).setOutputCount(16).setShape("###", "###").addMaterial('#', ingot).setGroup("end_metal_bars").build(); GridRecipe.make(name + "_plate", plate).setShape("##").addMaterial('#', ingot).setGroup("end_metal_plates").build(); @@ -139,14 +161,10 @@ public class MetalMaterial { GridRecipe.make(name + "_anvil", anvil).setOutputCount(3).setShape("###", " I ", "III").addMaterial('#', block, tile).addMaterial('I', ingot).setGroup("end_metal_anvil").build(); GridRecipe.make(name + "bulb_lantern", bulb_lantern).setShape("C", "I", "#").addMaterial('C', chain).addMaterial('I', ingot).addMaterial('#', EndItems.GLOWING_BULB).build(); - GridRecipe.make(name + "_axe", axe).setShape("##", "#I", " I").addMaterial('#', ingot).addMaterial('I', Items.STICK).setGroup("end_metal_axes").build(); - GridRecipe.make(name + "_hoe", hoe).setShape("##", " I", " I").addMaterial('#', ingot).addMaterial('I', Items.STICK).setGroup("end_metal_hoes").build(); - GridRecipe.make(name + "_pickaxe", pickaxe).setShape("###", " I ", " I ").addMaterial('#', ingot).addMaterial('I', Items.STICK).setGroup("end_metal_picks").build(); - GridRecipe.make(name + "_sword", sword).setShape("#", "#", "I").addMaterial('#', ingot).addMaterial('I', Items.STICK).setGroup("end_metal_swords").build(); - + GridRecipe.make(name + "_smith_table", Blocks.SMITHING_TABLE).setShape("II", "##", "##").addMaterial('#', ItemTags.PLANKS).addMaterial('I', ingot).setGroup("smith_table").build(); GridRecipe.make(name + "_chandelier", chandelier).setShape("I#I", " # ").addMaterial('#', ingot).addMaterial('I', EndItems.LUMECORN_ROD).setGroup("end_metal_chandelier").build(); - GridRecipe.make(name + "_hammer", hammer).setShape("III", "ISI", " S ").addMaterial('I', ingot).addMaterial('S', Items.STICK).setGroup("end_metal_hammers").build(); + // Tools & armor into nuggets FurnaceRecipe.make(name + "_axe_nugget", axe, nugget).setGroup("end_nugget").build(true); FurnaceRecipe.make(name + "_hoe_nugget", hoe, nugget).setGroup("end_nugget").build(true); FurnaceRecipe.make(name + "_pickaxe_nugget", pickaxe, nugget).setGroup("end_nugget").build(true); @@ -157,6 +175,22 @@ public class MetalMaterial { FurnaceRecipe.make(name + "_leggings_nugget", leggings, nugget).setGroup("end_nugget").build(true); FurnaceRecipe.make(name + "_boots_nugget", boots, nugget).setGroup("end_nugget").build(true); + // Tool parts from ingots + AnvilRecipe.Builder.create(name + "_shovel_head").setInput(ingot).setOutput(shovelHead).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); + AnvilRecipe.Builder.create(name + "_pickaxe_head").setInput(ingot).setInputCount(3).setOutput(pickaxeHead).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); + AnvilRecipe.Builder.create(name + "_axe_head").setInput(ingot).setInputCount(3).setOutput(axeHead).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); + AnvilRecipe.Builder.create(name + "_hoe_head").setInput(ingot).setInputCount(2).setOutput(hoeHead).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); + AnvilRecipe.Builder.create(name + "_sword_blade").setInput(ingot).setOutput(swordBlade).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); + AnvilRecipe.Builder.create(name + "_sword_handle").setInput(ingot).setOutput(swordHandle).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); + + // Tools from parts + SmithingTableRecipe.create(name + "_hammer").setResult(hammer).setBase(block).setAddition(Items.STICK).build(); + SmithingTableRecipe.create(name + "_axe").setResult(axe).setBase(axeHead).setAddition(Items.STICK).build(); + SmithingTableRecipe.create(name + "_pickaxe").setResult(pickaxe).setBase(pickaxeHead).setAddition(Items.STICK).build(); + SmithingTableRecipe.create(name + "_hoe").setResult(hoe).setBase(hoeHead).setAddition(Items.STICK).build(); + SmithingTableRecipe.create(name + "_sword_handle").setResult(swordHandle).setBase(ingot).setAddition(Items.STICK).build(); + SmithingTableRecipe.create(name + "_sword").setResult(sword).setBase(swordBlade).setAddition(swordHandle).build(); + TagHelper.addTag(BlockTags.ANVIL, anvil); } } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_hoe_head.png b/src/main/resources/assets/betterend/textures/item/thallasium_hoe_head.png new file mode 100644 index 0000000000000000000000000000000000000000..eb1efc432b968cb02d9cc9ebb6062544fcece4c8 GIT binary patch literal 1716 zcmbVN-HY5*9L-p*wdIYRnR^NB7*-xUt9!HTw2iwMT_85EnHP=y3xY6RE)|#g`Tq3Sx0nAv@>>t_(>-D7L@WqX52i;(c<0>%f^gS2 zUZt8;-RB@?eiji{quH(>aBdJ}lIRgfI&QkE8y0BOE3HTL z*!p4xudiU6NOMn#vt7sue3~G!>$id!b{(nD3;8;|tw>@YlB_t=d@3kb-6gTWA}X5M zoQyRChJwy7Qb?&W|D+ZQ97MY zwxefR)KE0rwiOj90LUC6$7?}?x^fWDj2MbE#*r5$9t*^j5!F~baU||^5P~0$X@hu} zCY~^*i$X=qs%c1lAi-l?*p6C#ae@`vqCO3hm}9juHf*wl#Z7h#>ha^71bAv)cdW6a z7vCRC#L2=c4`Y~+9no=REu_jajafUwbYYd-oJpezVIiU@VNr##)~HZRBg^gmvP_C-%@HN~j|N6==LuO+&Lk|b7K^wrcc=GVxGpRQae@L&%SA`xVP`#$ zKy2m_M!Z`nRdceQH#FG-#FA^k%2U-gY}+tL`-=>>)8eN42YpT$<{ba1BFjJ)su?mh zYD5MoWy=91*KysXRI{}_A|tlvBagpos5Qx&x+0uW)j~Gs?(Z}y zC%sMa2Qo3MCmj^g`3BG3Zu(2PmH!y6-roK0syVPV>3+w4{GaZJ$-zw&G$@~-ij>Bq zq_bvF8s*pz>AOCvZRcIk3FW%M|=t&KK=a(KEcnHi}MxhOZ;cAH@D}} z)2F@_e%V_!zCJSrdOwoc%LkwRI3s?gKjA!l{*&H??ccAnjrMDA{9xYssc`+;XZK#Z zbR#o$bn`8B-?sMBwEe<+pO-c>;`X&G4{U6`KKIwmp*xoEGhW#|Qu+1OyAMTwTs^t* zzW$Sb<+~5wJXhIs5!6zx|OQBFyurEq|DI!RHih@rqJ`^FK63^_-t)w+LFf(Un zzVm(Gf0=)^Fnx4*&)z*8#|`JQnHhE;iOyXE?7IKfCSfWXL|)E&X;QJX zOFlWVG+jhX^T@!$_|yEMy2%I}5<t0->!KTsb{H}wK)&sTHg)-k5n6O1ObN_sD+I^u z(z-!AO)Ozj9eNUo$x%p6AVyuBx8PTs;uuM!N*v;b0mFhW)~nEv1{Hb->h9;;1XybG z`L4#6UL2<@5rmVAER1$SwnPWThDW3s63_)7k;z47b2N&^Gt)kSA@z%tRy&0%bS(4f zbW|9fKQL>%nAU&3-jl?PZNzVa9016%`=BG76a&1;lmH zN&;pQ=~zx`sz#D()X>cyF|&5Ss@G`$A}7d;?N!z0n{8o26t#OwKvA6u7TT}vE%LD~ z<@Wwsg)q{)6u+e&&{9}~KA9-9+-;}7q&xW!;NsogZ?BpyTfOeL?8pDOzZdNMQmzVE-_QS^V@Q?Dj$N7uTyq0}q=h$Z(oA)_mL)YJaWayppjdJ~^ zpAY_W^QM|pxXfSL^f6p`_o33<@gJ^u^ryo|W`?`BlMry JpB_H_>faV3G?)MY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_shovel_head.png b/src/main/resources/assets/betterend/textures/item/thallasium_shovel_head.png new file mode 100644 index 0000000000000000000000000000000000000000..57fb43b2baebefb405c41e0b05d2fd6ab0e6c973 GIT binary patch literal 1747 zcmbVNO>Em#9CtQ|*w%drBviQIxk4HYe?2F5Y}G3zDKru(rOULAQ(xYDPOQd$uI)BS zg~Y~T(l}90z>qj_U`!PpnKZ-%>@u-|211B&V7q`+A%TQA3=PV2l9~*4qau>yuiyLq ze*cg6_o?ZrXLj#=cqhkkyUUZM8Ft>69QS3}|0BPxLw4E`Odg9kZr20Jk>TEaYnbEi zz3NtHbaq9+_AeJH(H+Ek@vx81ike=|@)E7P`C^yG|a<0^fzi^R_Ua2=cR)X}(B9 z!sjJjL~0K3hAFAKVuIWgJWy0aRt#CyL`Ag}-O^0H{}Y&6h#hOD^mJc~-PuATjsr`U zTdkJV(j*$zWz{rISphNtB14E#$B$uK^rMjth7yTT=mxP%eLi7?HM$tv0(066!3$Da zKkBE6B}{I^KvpFs38@RjD8&VfVY4fakxZJzBYqq)teRqj290Udpm(57U*9IcQd_B{ z8k>6Yyi_8JCzeg{j=Dakt?03VHKYV%Vhcb4Dl3@?KozK#nzNL`K}E9^r3bB0>^hx6C=gYpsxpLW z0dO0Xbq$6w{7*1OmP11ivY1^D)`=YWb%9SaX%%UchD?~b)4DDy6|3w=G4v5Bmu!KB zEx9hXfKCiZkR$2@Vv&Fx7NKsMBGeSk)R0~yYA*`5zC_VtQru*Hug@_>jN>2Gf}U3m zV&p`kGIvSupmm>-4;+%XM%x7OFk zwm*7&;hy2StA$;w*T1>+&d}v`bC}Y%%O7RoAW(}VE(Az)qeD-+m zC#L{L|NP_hjnCe_Fa%%NHZ-2eUwnxB`o-UG?mhYa-XFm0Yps1X@`KEL_Pf=!H@c42njo_T)n zzc=USp5L|e(Vc=I?5dQ_1wKC*j~!$Dzh`S3@#$W_d?*xz`yP(Rh;Z!qxFFoKG#v$NTNdwX)$X7%P-NUQ(g<`!L_+6 zUR%aRB27IjPIe$CaA}0Zj@$A=*fFFYFXZd^SdqjYBw9A4=~$p>Tk~Rx1yszYb23&l znwT%9)f^~lnZ2S0)Vu=nimJ;%g&+s@qB!^@E-fH+xL`gvki~a~)Qln@DoVTEPPg?m z3mS@AEEW}@DVip8gdBFg2z6vHoES2gG{k}9M-KDEm=V?3N@Pe})4mC=pU`^Yz)jp? zN(cFhng+2+Js`me&R+>yJ>di^v_)O&MIpzk36^`wvJ&`hXr-WchHNFkbY_)HoER$RH(A8OCi@3FlIz48AC>}&A{JB`YYhW6KV%V0r8qDJ@u@|} zBdi@h9Sa(~p(cu`A!$HUWuVC_sH!?t0R;JHfDQrZLoJ>P1V!l1z>GNc?telFhIJOW zh&#%0QG+VJ*XT*JELicv2zi)ROhe+TrX7dCdOm|m2503$oz&z^K9iRVK(Fx})N(`z zSg+}|;d_(el{kpQ_vC-RKM**)h*0b9d6FQ(5^J%*VuX8Hk5jmpO0evNJYL;FQ5>W% z4OT5j>}3x`I8Jaw!f|9Nkp{=kU3;ca+ip@$`Y++`!$MY%+9;sY4erG|$tZ>Euf)~Z zH%0lomA$*aRPGSY+d;fc`VikFos4?CeFeNvnX)~~d)!9FoURtW$G5h(r&3QIIl4af zx;H5-etqTFSC2lC+IK9q_v784j~2(ZE1UZ969*=K5y*v;>#r%d1{PqVUH#5IwzWr)VJ#*)J!F*7jtTG3b-zxx3Iyo|xo% z*N!>6N_8^un=r9VKgsq%5Cjon6B$+TgD?daG+QPi&VP->K%?+=fAo5}y9H`X9IwYWns`V_TuPk1y@Z@<$< zQQN<@vg5&c=2^|ab_|+WN3n|S5;R5i^j2JGOrikjC~r9ldgarLG_cGBeOS(L88?Xv z*3gWH#%6}I#>}Llnso2epr@h{0viPoRP3VTYn23D<<-bKyv@>}3JE3?bblxa#xo-z zi9H15ST|$vk^mGn#&>h7AVq<|@e0c+EH5$~uW{X)sDk>BCTgCU(?(N=>RRL~K^KC+ z)mXM%F2~AZ410N&S5=ke1Xd6jf?)hhq)DyBP+RskAh#f^fE_ntTm?AbKVKlCm^bicNm&LfaUZ|0E z%OIHy3lj(X4_l6j%l?xa_Mj9DP=XdXfhQ$n1R*Q%8ZT*Fyo(bxj;ld4*tBxf8=(Tj zb6H;0_z-;?lyr>=1Nfg{)6jC*vmuGuvSA*vu9K%hBa>PZ7qLf#i950CB9qb5jvqkB zK9dJDyMRcti}xl^&HYkuZKw@`%~B`g~bi`*ZSPV z2I2TeRo3;KDt4QUjC7fibO|w#i*t;blT6u&BSFqJ*q-w&@~Xk&M%K`kNf<>W$uh6- zjDoslM#)JEqwA8)Kn03|Aquh}nqfoNd<|JXsor$`6&XV>)mKFeRNF#>M%eBN+6e26 zh=bZ~YmV@_gkxG&DKWuoA%@X zbYD-7QGiY!kqOGuVLWU&Yigxo|6R4}vkh};9ZrT_xNJ;Wa?zO6$RX4onZhp%-!GC0 zel4Bq&&IzpZmq5LZrk_Dso8^lA2vmAK9*D-p;lL}ocrSR;1MJ3&z64IIs1IqB0!I? zo~7CBu>*5Qw_R%UPT$mZ|n<-Xm|%)dL{IbUjR1)c3J9n^QfOzgkJomkz|yZ{o5$2;F#d*Z-@(T@D= z-i~|hX6wRl*SnU^?!D2T?U`%;_@_^HKlD22UAeXV*{_3L9S Date: Thu, 11 Feb 2021 10:30:45 +0300 Subject: [PATCH 254/463] Terminite textures --- .../ru/betterend/recipe/CraftingRecipes.java | 6 +++--- .../betterend/textures/item/terminite_axe.png | Bin 265 -> 360 bytes .../betterend/textures/item/terminite_boots.png | Bin 237 -> 317 bytes .../textures/item/terminite_chestplate.png | Bin 321 -> 482 bytes .../textures/item/terminite_hammer.png | Bin 271 -> 461 bytes .../textures/item/terminite_helmet.png | Bin 279 -> 389 bytes .../betterend/textures/item/terminite_hoe.png | Bin 232 -> 336 bytes .../betterend/textures/item/terminite_ingot.png | Bin 271 -> 391 bytes .../textures/item/terminite_leggings.png | Bin 274 -> 327 bytes .../textures/item/terminite_nugget.png | Bin 160 -> 254 bytes .../textures/item/terminite_pickaxe.png | Bin 293 -> 470 bytes .../textures/item/terminite_shovel.png | Bin 201 -> 301 bytes .../betterend/textures/item/terminite_sword.png | Bin 292 -> 433 bytes 13 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index 560800f9..06568c56 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -26,11 +26,11 @@ public class CraftingRecipes { .build(); } - GridRecipe.make("ender_pearl_to_block", EndBlocks.ENDER_BLOCK) + GridRecipe.make("ender_shard_to_block", EndBlocks.ENDER_BLOCK) .setShape("OO", "OO") - .addMaterial('O', Items.ENDER_PEARL) + .addMaterial('O', EndItems.ENDER_SHARD) .build(); - GridRecipe.make("ender_block_to_pearl", Items.ENDER_PEARL) + GridRecipe.make("ender_block_to_shard", EndItems.ENDER_SHARD) .addMaterial('#', EndBlocks.ENDER_BLOCK) .setOutputCount(4) .setList("#") diff --git a/src/main/resources/assets/betterend/textures/item/terminite_axe.png b/src/main/resources/assets/betterend/textures/item/terminite_axe.png index 3c565da5c21d72ec9d5005e6158e895c2449986a..dc0c5142571ee351b3a3110a5e476aad6d561856 100644 GIT binary patch delta 333 zcmV-T0kZyy0_XyeB!2;OQb$4nuFf3k0003ZNklyuZ*+%cWfRV%jc}#@%v~0 z%O2nO&tL#C1X&)x3k(pN^G_f8&!DG<-vAVVrdhc>@4wr;ssH_qx&9aW3jHT+fDj+p z0IOh{ph*?{mxy1K0HS;Y|v003=m{y3B@Ni1(}6(I6v$==MezcPUx9rS!p#|&XbN~PV07*qoM6N<$f`vkbmjD0& delta 201 zcmV;)05<=<0__2iEPsy+{9y$E005*(L_t(|+G9BR=05`^m|<`jfDHKkUH-!`J~0r$ zFaV@r#k*(!)6X6G&!MdXmjJP`iDNYYq{wjTEDQrcVni7LQm9;>hhYFn4BcS30j!du zU<@+=M57x35<@o_ZovQl|KTnGDI&`NnE!DFA~rd=0Whb7BtmfoBC;IJCCFg_78J>d z1!IsT%v&HDgkb>*Q-@&yGKOhFHUNat)eWM&KnVr_OM&|~Rvsm;00000NkvXXu0mjf D8dpqy diff --git a/src/main/resources/assets/betterend/textures/item/terminite_chestplate.png b/src/main/resources/assets/betterend/textures/item/terminite_chestplate.png index 3d896a0554fab043fc9d3bb7eb7ee78bf2591800..88504a6f81feb883a8fec911cd82cbd7265059c8 100644 GIT binary patch delta 448 zcmV;x0YCo10^$RZEPsxC`%#ks00EgvL_t(Ijir)5OCwPf#ea7UM%Knc!oq?qSO&B( zgTJ3c}hN*s%}`{SKmbi-n6Irs+xR8cSBFbvDF+}FqO}L?gKDy730=sX4P7(_Kz=3#@dGoI6A;utSTS{qt~M# zUJdc3(oeo=gWsX``ZPF}+5EY_PRO~V~PX*JXh zy^I&)*vY>edVgAJH4;84kT%KD^`*XbE@chC987V}myalIY|d@YyR-q{@}9N$9p%)#mp@H+t1{+?x$ z^CQUEC^9yh9f9aMUT@l5azZV4(q-c$zEXgvmwvH)OF81$N@)_NKWByBd(glaPOq{a qq@g2S5x=8moQxLug6aVOF1!H(2lK0{70Rdp0000 zK#-uY+ysHZk#G<+$3Sw0rGJvY%x+suoBX8RKmYCQY{fYzZ4`VAirhg>#l6+iK{6ZZ zcQQ#O2p?Wgl@`s%l`y>QepNpJ*zn`?)`HRugf(~;5&*DB!G9bccV6(>K_g&sK6wD% zQNWqtz0UUl4u?f{7V*xgF-MciptuXp%QG_!A=r40?83Hd+ve`I0GXy@hsOZL^;&@R zJF>rBgoERC#_hwi06znLN(fBeNF2r*0n$wb3IXNAABGSsUZ(0HU#M*bP zpYT@l-4qG=H5qCvlb-@EC)?86%w{yoQsRlQ+eeG86AXA+*-z3QC`M_80OUJ{b92W| z`ai5g*zIF@Dne;*l;znuQ4Jt-3o6f+PQH(;m$xx>Y;ap%#+L{&k4D(-Bj(Zgtghm2 zZ5@pBaeD^>a({WDLIu|n+&W@_QPW9><^f$Nk{-2n;2#;J@nlVEDvFrj{2(4rm`+~3 zrA&ABAeR@4he!JiDiBM6tS|O%;}#sGzpLc zb7I5Ca1zD}Dn+ zGGehB0`m?yOmG4{RR#`imH!}&%Mg$pZUb~xfrh9tfcy+{Hf%OS@ETy;)xZD?Fp!_o zT>{n&v;Zf7*$mPQ#9;4$!X#n#6oh761|ZuE(hS3}FoA2vW&pa)FpQ!JiZRjwE}IcC tgQ^+D0Gu`x$UAUgq0URRW~>HK0sxK*6F2#Q9zXy9002ovPDHLkV1mjEXrKT9 diff --git a/src/main/resources/assets/betterend/textures/item/terminite_helmet.png b/src/main/resources/assets/betterend/textures/item/terminite_helmet.png index 575354dd4a8c87ccde2734c9d3b9551d2a5aa8d1..c13584e50815c98306baf10de2cc8035cbc37af1 100644 GIT binary patch delta 354 zcmV-o0iFJr0)+#REPsxC`%#ks00BHnL_t(Ijn$C9OG0rJ#Xny&2nresYilhW5^SrM z8XR&8dXrN^(9$1J28GdBVL?-WK+m$tu@;4v7YU*7EkTP(;t&MU@7qv5-+T3Z7ycT`IcTLK`@^FIk_iEz-uNIwy#UNC%qsvrGG=RnUVq0xG9l5qS;oU*dsirz zF)Wj8W>=afO|&_O%G0AQ-stM1JJ?S7`GJ8@h!+vAJ3FZ8M=P9Ptl9^^>$Q1!Kwv$E zet!$VR%RQ+G8q{hYSr?qU|1%qT0?Sq3X>BUmI=8$YI+L8`!v4Zq1fd=_W%F@07*qoM6N<$g5oxy A7ytkO delta 243 zcmVoLD9EL$+u=GKc0SrElV2uo3_6!W}wqOH57_R{! t0a(gokPwC#00l5{kQ$r@kctO~0RRntPKMW_+LZtR002ovPDHLkV1kdGU8ev5 diff --git a/src/main/resources/assets/betterend/textures/item/terminite_hoe.png b/src/main/resources/assets/betterend/textures/item/terminite_hoe.png index 7b15332401ef2dfe341ad2913381014c42e7c93d..8fd994b9bde8b28915868c37186a023819eee198 100644 GIT binary patch delta 309 zcmV-50m}a90nh@FB!2;OQb$4nuFf3k0003BNkl}*n5cnwQ2t)$5Tln_W^t&kib9zfP6!6c1{^3r5RC(f>l4?g(j=l#sb z0B1sUL()DFfixRtll@0Q7D!qp%?3$wyjimSGw0vhoF5b*34e(dC02|kBO_9~xn%p+ z-&b%6z%KxP0TL_Xp~q-4;{9EjVc;2o)ENMP6t7HQtE@R}bs)0@7{7r}FZN7a33Tb$ zVc=0>#W3);CRqsppdRI@qHA;qiMc;r<$=#{0D$LY?U1Xb3yb_8sRG*h`E_BD-;)ja z@s<4q?d&2OqArL#L6)-%R)S-kQxlx(yq93-cO6C63C_kZW{AkLZHtQI00000NkvXX Hu0mjfmsp8M delta 204 zcmV;-05kv40_XvdB!90-L_t(|+GF_t|33pI7`Frn7;5~7V0EYf0uVL;sB!W8XaCC{ z-}s+@`p|y{1NHwTxd1FF#P=VB-R4b&7^0{4-_Mxqf1$6?e_{=Q;s46zd0>O4rc3`< zmtZ2<00xlFAVWklV!^H=$^aOKIU8g%NHdToE(~CrVa^6=1Vv$xi-TEPsxC`%#ks00BNpL_t(Ijn$IBO9EjS$3HJz(V$C0*sRM4cdkDB&bTBsVye7*x{H7lExS|z0000f|3xxl|1-e+htH6? zK)E>|o`W%n57G$I!=bH$FaU(-A{nyc-BTcb_J1){4CG{xMr05Mv9THeamn-l%Yhp6 zPai_j1jEQ`;Re7=1mUvBH?V311unyaDPTE}MzCh&Sb!OVZUBgltO-RUdQ^fG%FLS# lra^pyns6l|k~9rC00665J3b=#cLo3e002ovPDHLkV1f_^X=MNa diff --git a/src/main/resources/assets/betterend/textures/item/terminite_leggings.png b/src/main/resources/assets/betterend/textures/item/terminite_leggings.png index 599719744c4aaba0596895f2d83db9c119b5f4b2..eb4bf6dcea8d622a90fb1f37951ab1d9bc149294 100644 GIT binary patch delta 292 zcmV+<0o(qP0>=W7EPsxC`%#ks0090;L_t(IjbmUKXuyaekQDtNpN9YQmSX5Z(R}>x zkN+@m{O^zd$N&ELU-lVZ zfWud>GB9Xsqw-;zpFYQMHHHCa_wGX|K7IxwC?>+dsH}k9-+#z}F)14EcgCdX|1oo? zGFWsqGBEnMBg6@XLD83&aA)6o`@1Py@s9mI~AJC(trt7nk`qzNWYR2YDq3}Tyg zHGpFVq>1Q21Sx_!mjMbunqcBYxd4RG4SEFfcGM zCCB_{U|?V{le1$yQJ;p;z=*1a1)Hf%$ua+p(~=l$wY3>0U0mn1A}v z|FXw7{=*D{8AcF*6oND^fAaeX4VTUWW1I l2zvqKPjpSlcofh8008SdXF1jPhhzW%002ovPDHLkV1l-pHiZBH diff --git a/src/main/resources/assets/betterend/textures/item/terminite_pickaxe.png b/src/main/resources/assets/betterend/textures/item/terminite_pickaxe.png index 75500c23b6fde8d25a7512795068d8cf500dbf6f..8b3f425c45bc420e990b778d413148010b4c8106 100644 GIT binary patch delta 444 zcmV;t0Ym z6!Hfof{D=4EG8BdmpDZn1f>SFQ%5HS!8YO+A}U=1tqRUAnn6XxB@WJ!kbqT(Acor^ zzR%C-CxRF5@XmYZoOj;4@WGN-!DK?6Ydt*{PA}Y5RMl=tCVx~_HD9Z0zE;)L?UhP0 zp^rF?Ek?ju*2H)nD3uBR_zu9Yz5ybW6U5H`(9_k*@=itU2#o@p*G10nZU9)C`lbLn z8Y49_O7C2dpW8(MDHLljBRCshJA;{31~aR~gB~TDu16Y*YM|44GIkR%BJrR{Q!$?g zIxQue)_kq1GJh0ReC=3o{t*!Ge$Z&BgT13`Dqj;Kxm{+C4xZlYE%I=vO?$dp?acna zTlU`U?{y>+R#$=HP@CV<%tvmtBc9{~NkufFk=*XHLvCcJ2*7_*mGCwfJvv_i0000rDu*$g>pc;@$7Xbowc7GcImD?T{-4+xFIC`Fu zGKr9EApkZ4Sct8SWI*IPx>*_kv#qVnWarWd;3uOpWC5;4lVoc)0D)k|QNXWcH?$NW zmK+RL9$N)ammF@!v@rj|c)(C9*$3dUK?cz0#rfn`Q)doZkh_zoq}kU87_AL)^LV%B Q00000NkvXXt^-0~f=69&NdN!< diff --git a/src/main/resources/assets/betterend/textures/item/terminite_shovel.png b/src/main/resources/assets/betterend/textures/item/terminite_shovel.png index 10ff054077ab6078bb6510fad27a24f307fb535b..b95e9e484cd3b2fc691559e26c63593fa15ba34b 100644 GIT binary patch delta 274 zcmV+t0qy?D0j&a%B!2;OQb$4nuFf3k0002zNklJ7vHW5*a7-hDC*qzC74h(6Jr3fX194$8BjDs4PeBlSy_sMVcY2s3^!l=V`N~!jA}+k z9NLj>Mi$2!L&VsOYyi3oSdcX`FfcH9rp!T0Z4~T_$L6|fHKpGdn ze+I^G^QM9gA=&_#=Ca2(z?wm9;tkMKMbQkRu^NC6_!)CyXvPQwe43}GOaE7wU_#MM zlmW<^fi7S`)=baPA+Tnc7~XV%%VuP8q71-hGf@VBG$!J*nP>y>X(q}GAkAbO bKrRLVC~^kFbcjF@00000NkvXXu0mjfF$GAq diff --git a/src/main/resources/assets/betterend/textures/item/terminite_sword.png b/src/main/resources/assets/betterend/textures/item/terminite_sword.png index 2bd0192c2f4fa95026cb43425aa006fb624f3cb2..0ebdbe88b629af9904c35b1a7986e9e2a1124147 100644 GIT binary patch delta 407 zcmV;I0cifD0D7fy5hvx3uQc(prm?LrzfyO+`Zx6a?0k8qscZQDRn>5H`rypig~1 zN$bE_&b`0y{JU514--SDB|x%m7ei;VRAjPLqy+r@lYkgHNq zuZ3pt>|P8u0WoyKGu#%u{*VTGyK4gGa4G=A(Af$m2}k`lj=u7i?Id<~;k~)Ul-rHy z@(O&5K^gbWAmZ_YZ=d!xilI|W#VG+llcnOXnN7FPV1K&|8G03#fS=7^n*d2jz)#uQ zXqmZs-xL6Vd4Eme&_E}m^ny!s&_>5_w;3rXxlV|s@5ZMboaka~b&wm1A@=+3cC~HJ)90qT%rvyfWb^?ez0XNsA zy@1tAXI^y3L3y4 z0)<494(KOr6b$!qD%q}cm}7z~0@+wNg{0`4ni=On;Fi3&|&JJEV9gi;8Lql7H}BUm<8E;tu1CE+YH_eqV^N%LK4#e P0000 Date: Thu, 11 Feb 2021 11:11:47 +0300 Subject: [PATCH 255/463] More textures & recipes --- .../betterend/blocks/complex/MetalMaterial.java | 1 + .../betterend/textures/item/diamond_hammer.png | Bin 279 -> 443 bytes .../textures/item/terminite_axe_head.png | Bin 0 -> 1997 bytes .../textures/item/terminite_hoe_head.png | Bin 0 -> 1929 bytes .../textures/item/terminite_pickaxe_head.png | Bin 0 -> 2024 bytes .../textures/item/terminite_shovel_head.png | Bin 0 -> 1953 bytes .../textures/item/terminite_sword_blade.png | Bin 0 -> 1937 bytes .../textures/item/terminite_sword_handle.png | Bin 0 -> 2060 bytes .../textures/item/thallasium_axe_head.png | Bin 0 -> 1786 bytes 9 files changed, 1 insertion(+) create mode 100644 src/main/resources/assets/betterend/textures/item/terminite_axe_head.png create mode 100644 src/main/resources/assets/betterend/textures/item/terminite_hoe_head.png create mode 100644 src/main/resources/assets/betterend/textures/item/terminite_pickaxe_head.png create mode 100644 src/main/resources/assets/betterend/textures/item/terminite_shovel_head.png create mode 100644 src/main/resources/assets/betterend/textures/item/terminite_sword_blade.png create mode 100644 src/main/resources/assets/betterend/textures/item/terminite_sword_handle.png create mode 100644 src/main/resources/assets/betterend/textures/item/thallasium_axe_head.png diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index 51710a29..b75353c5 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -190,6 +190,7 @@ public class MetalMaterial { SmithingTableRecipe.create(name + "_hoe").setResult(hoe).setBase(hoeHead).setAddition(Items.STICK).build(); SmithingTableRecipe.create(name + "_sword_handle").setResult(swordHandle).setBase(ingot).setAddition(Items.STICK).build(); SmithingTableRecipe.create(name + "_sword").setResult(sword).setBase(swordBlade).setAddition(swordHandle).build(); + SmithingTableRecipe.create(name + "_shovel").setResult(shovel).setBase(shovelHead).setAddition(Items.STICK).build(); TagHelper.addTag(BlockTags.ANVIL, anvil); } diff --git a/src/main/resources/assets/betterend/textures/item/diamond_hammer.png b/src/main/resources/assets/betterend/textures/item/diamond_hammer.png index d89f5c0c0976b9cd2c730a6b4ca6f23f425f53d8..faa4b9b44afd17ab57fb407a19db42fe5fbd8024 100644 GIT binary patch delta 417 zcmV;S0bc%>0=ol{B!2;OQb$4nuFf3k0004XNklC=?27*X|Bn^(*_-`0etr7C_VG3U`RvX9^VyrB$m0aanwR|j05`ZA8486|88}qr8Qe_-8Ma^i30KF0+kXuVj32h{hr6*~g@K_^ zNR^?#Wdj3q!b1j5HO2owzWiXs=>jA}7(O39jo}jIMLi50JRJXVy5N(o9>f3U*$n-TXU1vw#<>jVZIu5jOK~tPJ@S>|>BajDtRjL8%)HzTXE^^dT(t^i zn6hUdBToH(#(!M@r>0B)*O24>|NsAg2Dz?s1`bt)|8iaB|2b3@{u{qO&Cq=F1_M?T z{EWH&D@$>}LL08;`ok{_oN9{y4YzDy^kCs+sJFJmG{Dc8>%Y5+Aj9PCA5b*kc=Q!T z9V`(sqHD%xGrDGE1DKFCBP9~Nnvnrqp@tmye{?Z?ni}!u15yA0$hNlGwh5i#X0Hj&2s~oHe*^sH}(*HH&xQQ}=fk90Ut05phgOtR7 z21yD020#pv#cha$_H~ivh7!$GHG-y?_7!002ovPDHLkV1j*+ BZax42 diff --git a/src/main/resources/assets/betterend/textures/item/terminite_axe_head.png b/src/main/resources/assets/betterend/textures/item/terminite_axe_head.png new file mode 100644 index 0000000000000000000000000000000000000000..ff870193cf340f7861ee86e315a5512493ede7b4 GIT binary patch literal 1997 zcmb_dUu@e%9Cm@0c5SsGkXE%q7*|6p;Q0I}j%_U~T~cVKrIa?JMexw``I1;oY}a<1 zv=5`(1Y#0MeFi3hCh>w)Ata=!JTSDXt0*AY3u6x(NE;F_unHc^HZ7c!)MTg|)kGx6 zXZyR~@B4ng@9s{H48PF1t9utkQJtxw8Hb0y}^HWGQnEr$GfwD#d6tNHKaC<7#9ayyh6X3h}4n%s`Nk zo=A_-3ERbVG$ONzmjpVdMtB*hg7hpc06xZn7{`k&;58s?qDt3)49VsiS#31=d_5O= ziZglNcQlSGl}eG47_r?P$E&K!0f7?)mLOPf&hlZIwY=V~2ubWA*K~Z-w&)-t)a@BR z&Jd5*hV^Y>W0Xa}MT4v1iY?2oKH@n!SM~ z?ZQ^0Mz$!^iA2yCh2B4IT83Tn`WoioB=m8d5rDvxma&465qOQ4G@v{KL=Au%G;JGZ zcCHaBusomPNspr%5bl5y*BH=;{|PpbmbKj?B$~}4%wf*4ats|-QcKtc+a-w!JF&_l zoz_y8=R*tOR5H#G*%8w;GzH2C8c~&%WdXBUMMA8ui-8(l#6XlGpRK7N^OH8337Q+s zuld}t5sC3nRzrtak@P6bt0HD)EM-|;&}CLMVo{`vs;(eqi_MF!NtPNcG)4_r86=_v zBoxJ2fyF$I1*{}iQ8CX#0m4{Rjp;x)0z+3lq79iI>E2v@iHzat`lw*iRaw z709FslFULKkd~6-2?olFN-R|0$UgKVv97%3$NOYoFAmB>D~HJr$}#t^XJ_uL5#3f# zD%7S+g4VZx>d-HSDvboz+)l^A3jLsX-pXa|c_bR4zGHuJuo^k`w7dDmjo* z*3qp>rT@Ww3nz~q0@qtU`Jf#L0&_9-{ZG`5SgEb|Q|0iPW6E0BQ!N)d9ynjQy}28o zUONZcUw(bx`CAWP`fB9QYx~aq{PFn4&8B!al=mJzx^d;|%H>K&`$r2u($n;+&%fDp z@VCj_3F*Ye$>qIWxBS+H>DgS08(e dz0~(@J9T>b>~!?-)REx8O$`nwmkv!H{~M=HicbIl literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/terminite_hoe_head.png b/src/main/resources/assets/betterend/textures/item/terminite_hoe_head.png new file mode 100644 index 0000000000000000000000000000000000000000..d189bbcef94881fd531f2d79e20b270eb1e91454 GIT binary patch literal 1929 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/terminite_sword_handle.png b/src/main/resources/assets/betterend/textures/item/terminite_sword_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..524b0eff1f3a95846845e10de50c9c1dc6e1f1a2 GIT binary patch literal 2060 zcmb_de`wrP9M7$_bX}`0li3!*kfBqyTwZ=%F4?X>c2{j_uPfcjP7vu!^6naYmt;xW zyVg;4Ucm%e=Vcf_5iO59Vpp-MPjPL$2l+wr5x-=`%vr8uua; zR$5LWYgcJaw^AltFeVReh7AHgr4mrrsyKVx$&`ZY8iO(@i%ieOShk9_M=j5CN3Hu% zS3lnq0GBo%ug2I=OEy~#;d(t2IE_j{HblFLNgFZ4$hF2D4fRZ5nLGV#Y$fU-=vhv} zvNCIp8d{S~Mx%aX!sN4u3{$sq?sMzrpcwQ}gyI0l;+D}Im*7~16%-KO4R{5BGBj@K zMrv|Bl%rWT!Qvi=6(HOL#jeqz2mceSYf8#;vJmHNWMLXHwwb2LY9*DZm9ZQg7^~w; zD&lda&vZR#YN#(3p>Wzk!_XC7lLZKMiB^Fcrg<}^MevI0UODYZ5~W@+Po zbN%^cpX-)}IsS<%u(}3xK1{Pb)akG+=(HM!kPZQ)YJ5rzhlDEI0mr~g4QAG}`l@uy z$Rj}%S&5}36cTAEg;lAlAkt8RJXXeu9IyL^E_p=hHC)`i$;uKrhz?gq8G|g@LV=oZ z_Xwr=eMUM}d2MV^k4;6c%+HM?O!|Q4m!rE@%F96qb*FLdHsdeme)?TF@nH3$1R*Qw zh*l*|q6+E}d~tXGVKA`rSmMd+S4PgB+4|?B^{bsz zCtA)2$faA)%r?Fg>PY9|?ZuT}e>-sD?Ci~LZC}sVwtl>Nw@{c>iSMqByng;uKC}1k z(ZV;&3(Y7PGH`sa0D&tUA_{*l?g0oJah?EnA( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_axe_head.png b/src/main/resources/assets/betterend/textures/item/thallasium_axe_head.png new file mode 100644 index 0000000000000000000000000000000000000000..1ce969e2078046a11e5e1bcbe2f4d83423743067 GIT binary patch literal 1786 zcmbVNU2NM_6!to;T00fS2BNGISS|?0>i8#499s*ei(3*jm#WKH2OISI`Z_ULZ$9Jn*)m@q*AKCO~5q;%AyBUiQEfLw!Mlhp`7lMYzr%8R|wwB*)kG zcfa$U^Bo_*JvI5vK>wb8ilPQ`S#6q}cSgtdUh@CQ%{m~bJ}-MTpr{?Yqhkwo`n^Gl z+IG#(&xAAjK^0;r225_enxgiPRy_dcP)Hl7V7qDNx6i&{XxmIPM-n=(dl^); zvkN{tv@n^63v*C0nbD`{{Z*9^I4A^k)hW4wT1_(zUX`q)+Z;nTAmLn^8H)naGx`*r z!9JoBu_OxxNu*^ZCM0=9ltyTg7i5l?IU&ySg32e=xI(vn42kBOmO8CXv|^E~G*b*i zPvy8ur4p;eW7scnf}$uKFLI*D5(FF6+z?b*HyCa+XefZb?S(dW>4*^+xE!V#qO_TU z<8^4=pj9SPFs=$bPKfbQN)4b1J24M9q7!r381 zX04PYu_+>m1tI`)LXi#LFr$WU^oW|Z1L9t-^@0;%0*`ir}h{s7G1UH#_VY|83ZzhOWAPxY{a^Gu`NGb{NIj`vz1!9T;Eq)y>X8=xFUt%BfWI;O-p;R@A^u4=!L!j!X?bSr zeGfkW`|_VJ*Z$fy`1E<;zd&i|b44r%s)DX(oFu cmActO9X|S@y7uek1JTzhH$JJIKQO!WH@Lb(5C8xG literal 0 HcmV?d00001 From 8bffd166eb3d17f714a960ed42ba68ad133a5ca3 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 11 Feb 2021 12:07:49 +0300 Subject: [PATCH 256/463] Recipe changes --- .../java/ru/betterend/blocks/complex/MetalMaterial.java | 2 +- src/main/java/ru/betterend/recipe/CraftingRecipes.java | 6 +++--- src/main/java/ru/betterend/recipe/SmithingRecipes.java | 6 ++++++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index b75353c5..49eddd31 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -158,7 +158,7 @@ public class MetalMaterial { GridRecipe.make(name + "_stairs", stairs).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', block, tile).setGroup("end_metal_stairs").build(); GridRecipe.make(name + "_slab", slab).setOutputCount(6).setShape("###").addMaterial('#', block, tile).setGroup("end_metal_slabs").build(); GridRecipe.make(name + "_chain", chain).setShape("N", "#", "N").addMaterial('#', ingot).addMaterial('N', nugget).setGroup("end_metal_chain").build(); - GridRecipe.make(name + "_anvil", anvil).setOutputCount(3).setShape("###", " I ", "III").addMaterial('#', block, tile).addMaterial('I', ingot).setGroup("end_metal_anvil").build(); + GridRecipe.make(name + "_anvil", anvil).setShape("###", " I ", "III").addMaterial('#', block, tile).addMaterial('I', ingot).setGroup("end_metal_anvil").build(); GridRecipe.make(name + "bulb_lantern", bulb_lantern).setShape("C", "I", "#").addMaterial('C', chain).addMaterial('I', ingot).addMaterial('#', EndItems.GLOWING_BULB).build(); GridRecipe.make(name + "_smith_table", Blocks.SMITHING_TABLE).setShape("II", "##", "##").addMaterial('#', ItemTags.PLANKS).addMaterial('I', ingot).setGroup("smith_table").build(); diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index 06568c56..d88c8adc 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -26,11 +26,11 @@ public class CraftingRecipes { .build(); } - GridRecipe.make("ender_shard_to_block", EndBlocks.ENDER_BLOCK) + GridRecipe.make("ender_perl_to_block", EndBlocks.ENDER_BLOCK) .setShape("OO", "OO") - .addMaterial('O', EndItems.ENDER_SHARD) + .addMaterial('O', Items.ENDER_PEARL) .build(); - GridRecipe.make("ender_block_to_shard", EndItems.ENDER_SHARD) + GridRecipe.make("ender_block_to_perl", Items.ENDER_PEARL) .addMaterial('#', EndBlocks.ENDER_BLOCK) .setOutputCount(4) .setList("#") diff --git a/src/main/java/ru/betterend/recipe/SmithingRecipes.java b/src/main/java/ru/betterend/recipe/SmithingRecipes.java index 1fb36947..b1d951a2 100644 --- a/src/main/java/ru/betterend/recipe/SmithingRecipes.java +++ b/src/main/java/ru/betterend/recipe/SmithingRecipes.java @@ -71,5 +71,11 @@ public class SmithingRecipes { .setBase(EndBlocks.TERMINITE.boots) .setAddition(EndItems.AETERNIUM_INGOT) .build(); + + SmithingTableRecipe.create("thallasium_anvil_updrade") + .setResult(EndBlocks.TERMINITE.anvil) + .setBase(EndBlocks.THALLASIUM.anvil) + .setAddition(EndBlocks.TERMINITE.block) + .build(); } } From 408c4541c317e781cb8d590a188d7180d4fc3f86 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 11 Feb 2021 12:36:53 +0300 Subject: [PATCH 257/463] Texture compression & update --- .../blocks/complex/WoodenMaterial.java | 1 + .../betterend/textures/block/brimstone.png | Bin 223 -> 223 bytes .../betterend/textures/block/chorus_plant.png | Bin 712 -> 712 bytes .../betterend/textures/block/end_moss_side.png | Bin 645 -> 645 bytes .../textures/block/end_mycelium_path_top.png | Bin 548 -> 548 bytes .../textures/block/end_stone_smelter_front.png | Bin 704 -> 602 bytes .../block/end_stone_smelter_front_on.png | Bin 918 -> 759 bytes .../textures/block/end_stone_smelter_side.png | Bin 615 -> 513 bytes .../textures/block/end_stone_smelter_top.png | Bin 578 -> 494 bytes .../textures/block/flavolite_polished.png | Bin 590 -> 590 bytes .../block/flavolite_runed_active_1.png | Bin 719 -> 719 bytes .../textures/block/flavolite_tiles.png | Bin 606 -> 606 bytes .../textures/block/helix_tree_log_side.png | Bin 253 -> 253 bytes .../block/mossy_glowshroom_log_side_5.png | Bin 274 -> 274 bytes .../mossy_glowshroom_stripped_log_side.png | Bin 635 -> 635 bytes .../mossy_glowshroom_stripped_log_side_4.png | Bin 681 -> 681 bytes .../textures/block/silk_moth_nest_top.png | Bin 252 -> 252 bytes .../textures/block/terminite_anvil_top_0.png | Bin 210 -> 204 bytes .../textures/block/terminite_anvil_top_1.png | Bin 258 -> 256 bytes .../textures/block/terminite_anvil_top_2.png | Bin 272 -> 260 bytes .../textures/block/violecite_tiles.png | Bin 195 -> 195 bytes .../betterend/textures/item/diamond_hammer.png | Bin 443 -> 254 bytes .../betterend/textures/item/terminite_axe.png | Bin 360 -> 229 bytes .../textures/item/terminite_axe_head.png | Bin 1997 -> 204 bytes .../textures/item/terminite_boots.png | Bin 317 -> 219 bytes .../textures/item/terminite_chestplate.png | Bin 482 -> 311 bytes .../textures/item/terminite_hammer.png | Bin 461 -> 271 bytes .../textures/item/terminite_helmet.png | Bin 389 -> 246 bytes .../betterend/textures/item/terminite_hoe.png | Bin 336 -> 227 bytes .../textures/item/terminite_hoe_head.png | Bin 1929 -> 155 bytes .../textures/item/terminite_ingot.png | Bin 391 -> 248 bytes .../textures/item/terminite_leggings.png | Bin 327 -> 233 bytes .../textures/item/terminite_nugget.png | Bin 254 -> 160 bytes .../textures/item/terminite_pickaxe.png | Bin 470 -> 290 bytes .../textures/item/terminite_pickaxe_head.png | Bin 2024 -> 210 bytes .../textures/item/terminite_shovel.png | Bin 301 -> 205 bytes .../textures/item/terminite_shovel_head.png | Bin 1953 -> 171 bytes .../textures/item/terminite_sword.png | Bin 433 -> 286 bytes .../textures/item/terminite_sword_blade.png | Bin 1937 -> 177 bytes .../textures/item/terminite_sword_handle.png | Bin 2060 -> 244 bytes .../textures/item/thallasium_axe_head.png | Bin 1786 -> 200 bytes .../textures/item/thallasium_hoe_head.png | Bin 1716 -> 154 bytes .../textures/item/thallasium_pickaxe_head.png | Bin 1773 -> 190 bytes .../textures/item/thallasium_shovel_head.png | Bin 1747 -> 171 bytes .../textures/item/thallasium_sword_blade.png | Bin 1533 -> 182 bytes .../textures/item/thallasium_sword_handle.png | Bin 1807 -> 211 bytes .../model/armor/crystalite_layer_2.png | Bin 463 -> 463 bytes 47 files changed, 1 insertion(+) diff --git a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java index d3626da5..fd4f4c17 100644 --- a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java @@ -112,6 +112,7 @@ public class WoodenMaterial { GridRecipe.make(name + "_bark", bark).setShape("##", "##").addMaterial('#', log).setOutputCount(3).build(); GridRecipe.make(name + "_log", log).setShape("##", "##").addMaterial('#', bark).setOutputCount(3).build(); GridRecipe.make(name + "_composter", composter).setShape("# #", "# #", "###").addMaterial('#', slab).build(); + GridRecipe.make(name + "_shulker", Items.SHULKER_BOX).setShape("S", "#", "S").addMaterial('S', Items.SHULKER_SHELL).addMaterial('#', chest).build(); // Item Tags // TagHelper.addTag(ItemTags.PLANKS, planks); diff --git a/src/main/resources/assets/betterend/textures/block/brimstone.png b/src/main/resources/assets/betterend/textures/block/brimstone.png index f642a97214f29ee93209d1fc0acc6211c0d39678..e6c11d99a4944516b89a63a5333325c8e4143cb4 100644 GIT binary patch delta 28 icmcc5c%N}X8RM;qbP0l+XkKeJ}`{ delta 29 jcmZo=ZDpOH#dvF@wilBC+Z>r63_#%N>gTe~DWM4fe_#lT diff --git a/src/main/resources/assets/betterend/textures/block/end_mycelium_path_top.png b/src/main/resources/assets/betterend/textures/block/end_mycelium_path_top.png index efd16c00ee064df829cf751684098b3172412268..14f7385b8a9bfcc215c36ae151118e2eed60671d 100644 GIT binary patch delta 29 jcmZ3&vV>)V7UQjr+AkRen0IO&VgLe9S3j3^P6)V79-MHFaUw4tDnm{r-UW|i_-~M diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_smelter_front.png b/src/main/resources/assets/betterend/textures/block/end_stone_smelter_front.png index 50ef457922736c9797ebaf8bdd5b3a4dfce8dac2..1ee9ea3cbd46ae6f5bccdae1ee610d4daff80c33 100644 GIT binary patch delta 578 zcmV-I0=@mf1=<9VBYy%RNklH?Df%)uE2+z8BJ7FaG-(sDn%O9fd<^?XA7EIs zuny+2f4l%=Zw^PlKEbl)pr@zUV8Pi6C}}ErchxN&jej2KW(?sDFS?pbu%`$^O~nY@ zbR(Ud;Lg|zwl9*CQXBg*<0waGMlPyqU;OKW^fRt{OYPZE@;FpmWq9bDRvIj-p_#GgK;~M4 zrtGY}d^=M(N8J7w#8p}aNaO-IE6*MXnArXYOgZ*|Si}%no#D)#JSPwS0IkNK2TWU( Qx&QzG07*qoM6N<$f~d_DhX4Qo delta 681 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 diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_smelter_top.png b/src/main/resources/assets/betterend/textures/block/end_stone_smelter_top.png index c54e06a5b28e549e70abc2090a6bfb29a7feed03..71f47f4fad3be469b2032d114bd18bed80024999 100644 GIT binary patch delta 469 zcmV;`0V@8&1nvWnBYy$4NklFBmyaj3yH##KJDh+<(rI9$Tbba+!>{o9D&* zRm$7zTw;lm*E8hAXu^7PIZpcB0+ozSvI<^$&U>hs-QW>>Pq{5#XKliGcuG~HNoin5 z5&-4$9#ty)WLdjpnmcO5c|l*Nhv>YLq)92*0&*A)3Ccuy4m6Owb-jMXdf9cG5NiQTFQ{jfhE9lwT-*!j12hr>$pA^Pfp)V+ zf)m|Fa(;|xXp;NE_$2}Xzq_p)d+Eq5gL{6aet%=n&(!a4bYgx0Jb&`uUN=Hk00000 LNkvXXu0mjfz{=V> delta 554 zcmV+_0@eNQ1HuH5BYyw^b5ch_0Itp)=>Px${7FPXR5*=|lf7;eK@^3*xijlsuj3># zQl28B1Br%)9*G)J@+dUC0VSg55%LUi17#2bf)tw&;_Q0YGjoR`o{bA4G15r$_szM| zJ;%KJ@hP3Rkzdz|`N=8O;Q>0EGN}rV>H>g^*3)zzxm?j*{eR)r%SU9!<;CYO3);mJ zfC^}4Q!cn2yKuW$vdg%u3Qnv5~VV9Ek# z45CU(31{A#V59T8uHnd7hbb*@d9Q&8^J z_+|}&_x`qh>mC4WEzQ+6*Ee^zHoIYZ{{20ZagBA3YOfx;;Jqhw8~kQNvu^qN`1QZT sG(UTImm|jZ{xm*2z9&roo5o${FMkfH>U|u?ZU6uP07*qoM6N<$f)thqV*mgE diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_polished.png b/src/main/resources/assets/betterend/textures/block/flavolite_polished.png index fdcb63e723ee1f9bf792eef180a9db9a19095da8..a98bc902c18b2b0c3fd2cf373e55aa54a4cac44d 100644 GIT binary patch delta 559 zcmV+~0?_@=1kMDIDu3D~Qp;}JFc2igZJvm#IYrcq{K&u zwFL|)nX|hyJG@-JIp>I|)|zt$N-6K>?*ET-en*n>&&zj;F|L1qDQ!DJZn-d4iKH^a za(&-p?1$OdQ%-wHo~Zlz^rLGfRnIsJK9JOc?0%GZl;b!`0e{BLUAXL1!Z{7YK=@;i zA=fUaP)ilcN;3k7nR)ktCR2YBHJa&h-`-H2wAOEa1x=7j=}?SeWTBW8y!0chB^^8G ziiAJn9zr078=QOZq)JNld-RPU1p02vyC90o8${djY7)~3j`w5a@NfV9vpkiHaWTs)9s?hle+B7l!Fu_NN{J6a0i|uWj z2m0K)kTe2|bL$>orPA8AeNk7OTXIe%=NLAv6$E$7vVV;8S=%Z4C3sM-sC`5yw9QOl zchP%z1wG{+mT?>ridvfA$OKyB+`Pua_zt#T({XSvl$mg!5Hd;4_3`wG8u{3zhF6y7 zO~`(J_yV3%dYopdtudyBR4Ztiob%D&q*O|o;NC0D91Dr=)90_EtLt)w3>2i>@8{>2 xCqx=cK`2K={d_)e+lE*80kqZvksa1rsegt7VmETs-Om63002ovPDHLkV1mOaARzz% delta 559 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 N002ovPDHLkV1m~w8>IjM diff --git a/src/main/resources/assets/betterend/textures/block/helix_tree_log_side.png b/src/main/resources/assets/betterend/textures/block/helix_tree_log_side.png index 9324519214ed1948fe25581f527455ccc9de05eb..32df32a1cc00bd78c9d389a0e6fb8ddb09589192 100644 GIT binary patch delta 28 icmey%_?K})8RM;qK_K86)Gw@@@f+>q(axfWXt$&t;ucLK6Ug(+JuC delta 28 icmbQlG>K_K8RM;q<=p~PT@FYv0D-5gpUXO@geCxucnMGd diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_side.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_side.png index 8af2a9a1f289ca46a601fc8017b1f7c807a3c9c8..f3fc5d8433a1300d9c66f97b914f43cf676c3445 100644 GIT binary patch delta 29 jcmey(@|$IX79-kkz%0D-5gpUXO@geCx`rwUyF delta 28 icmeyv_=j;q86)Gw@=}2}OEcOTfWXt$&t;ucLK6U-ISK** diff --git a/src/main/resources/assets/betterend/textures/block/terminite_anvil_top_0.png b/src/main/resources/assets/betterend/textures/block/terminite_anvil_top_0.png index d3b78ec9226651d4c5d02bb6ad08fb3127eafddd..7aa548fae5e34b70a91ce9e4f85d7b8486ea8b60 100644 GIT binary patch delta 176 zcmV;h08jtY0n7oAB!81hL_t(|+GF_t|33o^Gc1_$AA}kETmCaPSAl5^v5JEKD0%>=^$7>M{Z6O08ynu#(1T{DKE1j7KIW{^0(XeorJ#GxAtpsWh=BS;Y( egZOA-$a(-yg}UU_z%K`pI?Bn+tpKGY;s~R95W_G|7XAj zK$;m_tN$|=XM<^m1yjHnCI)8vxZ^eeWGg<+#2J9D8J&;M0FZxi+6*-eZy10A39n|5 z_XxQFuV!Kmz^R$!FhJ8xFcx42;L=Rc0B}k}(~RLFq71;L880M`FB+*63-~k>;{}Rh k0pve01}cJMEMmxd0G&5c<=DGFasU7T07*qoM6N<$f)ff#&;S4c diff --git a/src/main/resources/assets/betterend/textures/block/terminite_anvil_top_1.png b/src/main/resources/assets/betterend/textures/block/terminite_anvil_top_1.png index 69d0465dcb7e9604e024a044781c755bccde6024..b590f6043d360467288c6a60919b1960a01294e4 100644 GIT binary patch delta 228 zcmV}&PErj#?c`4O$HO*(ba7ys z_eN-BO#(<%FuDTlmEhb{V2{z=cTQxq%zPp7$K7hUU9A?EsZ`voQ>ZO~<6)oTZnQm|j#hEC zv^$=w1W;8l)JUjgJ^{f{1z0=5w?_cK`(jhtf4k7=oEfN$d0@*T8Pg4`=&4lW){5`YT#yw g9Gm%N&D<&G4a^HotEZ2iRR91007*qoM6N<$f`^`D;{X5v diff --git a/src/main/resources/assets/betterend/textures/block/terminite_anvil_top_2.png b/src/main/resources/assets/betterend/textures/block/terminite_anvil_top_2.png index ee1d9403bd96b1ec070b66ffee68b88290183d4a..cf463857cd6b4ca2cc38198dbd77e5da0429308f 100644 GIT binary patch delta 232 zcmV1%{<4}_x8H6ldrfm|alf<>RigxD6h8yD6#li8!B*B_DRbhnKTP zUa#~H|4o2oRj~*JG(sFW8vp?yV|W#E?g7NFJ~j)SRqw2-CT&2PqyiG_8C6(i-3lfa zC@Y{bpzgj185ROeWvXi^gW=d#Wzp$Pzy(g~CR delta 28 icmX@ic$jfQ8RM;q0D-5gpUXO@geCx;!3sM7 diff --git a/src/main/resources/assets/betterend/textures/item/diamond_hammer.png b/src/main/resources/assets/betterend/textures/item/diamond_hammer.png index faa4b9b44afd17ab57fb407a19db42fe5fbd8024..ea668c2b7981b07efd45779530746955580532d7 100644 GIT binary patch delta 226 zcmV<803H9k1O5S!B!9(8L_t(|+GAj#7Wn`FKTgbNZ}uOGG2{pu0Mcmu`t*P8<7==Q zg4abb%}f4%fE(gx%=N#}SLi=M13;SPy2`A@~h=f1UvrU?4w(6eAk~;?H?_4_mi>n9Z;N18Qb~83Lk# zhA=eWyn$OY%w`~FfMJk9AkCIHFEBLTy~)5JA&%c>WX-rzE>Sk)OZp_+jMD(9Mxr$1 c^a42m0P=tu!*V!5)&Kwi07*qoM6N<$f--qz$^ZZW delta 417 zcmV;S0bc(80lNc`B!2;OQb$4nuFf3k0004XNklC=?27*X|Bn^(*_-`0etr7C_VG3U`RvX9^VyrB$m0aanwR|j05`ZA8486|88}qr8Qe_-8Ma^i30KF0+kXuVj32h{hr6*~g@K_^ zNR^?#Wdj3q!b1j5HO2owzWiXs=>jA}7(O39jo}jIMLi50JRJXVy5N(o9>f3U*$n-TXU1vw#<>jVZIu5jOK~tPJ@S>|>BajDtRjL8%)HzTXE^^dT(t^i zn6hUdBToH(#(!M@r>0B)*O24>|NsAg2Dz?s1`bt)|8iaB|2b3@{u{qO&Cq=F1_M?T z{EWH&D@$>}LL08;`ok{_oN9{y4YzDy^kCs+sJFJmG{Dc8>%Y5+Aj9PCA5b*kc=Q!T z9V`(sqHD%xGrDGE1DKFCBP9~Nnvnrqp@tmye{?Z?ni}!u15yA0$hNV0_6daB!8?)L_t(|+GAj#7Wn`FKO7?i#-!-~AdD_f&;Sq()%gGT-yd*8 za2kYe08De?=NJD?PV6OY0J^i0H8U)j0%rRebNw&$6(Vc`qmMh-*6(c(0NL625*=wa6Jr1|Hsdt_q>;Ep!a!VdCKdny*HgQx!*9w!00000NkvXXu0mjf D^<`8G delta 333 zcmV-T0kZz(0q6pdB!2;OQb$4nuFf3k0003ZNklyuZ*+%cWfRV%jw)Ata=!JTSDXt0*AY3u6x(NE;F_unHc^HZ7c!)MTg|)kGx6 zXZyR~@B4ng@9s{H48PF1t9utkQJtxw8Hb0y}^HWGQnEr$GfwD#d6tNHKaC<7#9ayyh6X3h}4n%s`Nk zo=A_-3ERbVG$ONzmjpVdMtB*hg7hpc06xZn7{`k&;58s?qDt3)49VsiS#31=d_5O= ziZglNcQlSGl}eG47_r?P$E&K!0f7?)mLOPf&hlZIwY=V~2ubWA*K~Z-w&)-t)a@BR z&Jd5*hV^Y>W0Xa}MT4v1iY?2oKH@n!SM~ z?ZQ^0Mz$!^iA2yCh2B4IT83Tn`WoioB=m8d5rDvxma&465qOQ4G@v{KL=Au%G;JGZ zcCHaBusomPNspr%5bl5y*BH=;{|PpbmbKj?B$~}4%wf*4ats|-QcKtc+a-w!JF&_l zoz_y8=R*tOR5H#G*%8w;GzH2C8c~&%WdXBUMMA8ui-8(l#6XlGpRK7N^OH8337Q+s zuld}t5sC3nRzrtak@P6bt0HD)EM-|;&}CLMVo{`vs;(eqi_MF!NtPNcG)4_r86=_v zBoxJ2fyF$I1*{}iQ8CX#0m4{Rjp;x)0z+3lq79iI>E2v@iHzat`lw*iRaw z709FslFULKkd~6-2?olFN-R|0$UgKVv97%3$NOYoFAmB>D~HJr$}#t^XJ_uL5#3f# zD%7S+g4VZx>d-HSDvboz+)l^A3jLsX-pXa|c_bR4zGHuJuo^k`w7dDmjo* z*3qp>rT@Ww3nz~q0@qtU`Jf#L0&_9-{ZG`5SgEb|Q|0iPW6E0BQ!N)d9ynjQy}28o zUONZcUw(bx`CAWP`fB9QYx~aq{PFn4&8B!al=mJzx^d;|%H>K&`$r2u($n;+&%fDp z@VCj_3F*Ye$>qIWxBS+H>DgS08(e dz0~(@J9T>b>~!?-)REx8O$`nwmkv!H{~M=HicbIl diff --git a/src/main/resources/assets/betterend/textures/item/terminite_boots.png b/src/main/resources/assets/betterend/textures/item/terminite_boots.png index c0f5d3ebe827a46a9f3af7e220fd079dce9665d0..bfc2254af24fa4e9a7238cd0e79d8b8ed905ff33 100644 GIT binary patch delta 175 zcmdnXbenO4N&O^G7srr_TgeF$bq$7^zwCJ)3m;x7$q-EL_9ZAR<~< z*OHkbE6x?wn&&N!kRq6X@XK4Yp?;&0X05$hxZ3Xn?$#UB}+8;${b~Q(s1Z0 z>l{YTVkIBrHt~j>35+|QJoIC^%~Ps&CR#!2jnf1+jRjI`;us4j82SirVl;4`@X_F; ZHN)G``zP3n7=AMVfv2mV%Q~loCIDQML^S{a delta 274 zcmV+t0qy?V0lfl{G=KC-L_t(Ijn$H|P69y`MbFzTpJ3s4=s!r|c63;+i5-Ps!XMDl z&|-lFHpH-rYq^0RPzj+RAt7LNuf+sq879`eYI5e~zB_jwoP3!F(x!H2b-ET}$JNrN zBx(G;kzHTuKMoKbie%-M-g@bYhqx!uTQ3Oh{ph* z?{mxy1K0HS;Y|v003=m{y3B@Ni1(}6(I6v$==MezcPUx9rSvla3*=*l?*aN_oUiHhYS z(6CoCb8h#1NInB-GY9`rQ`K1p$pCx_iQ%ySid!%5P{ajH?tj+=;BQog*~@ z-@;Z-a1GE8g(?Vb)(^;X0bD`1tJ_9(7eM`v0O)cQ!2sdj1yH+5oAaq!l=9Uv&RY9C z5f>047#~-(W@$eHsMR2mjWoIl(bD^1eOYLTw@fq}TZ@U+Jne;*n5QG__$@x2iM1!Y Tfuha;0000!cVz z!3x6K8rZQA3;hnFc8i6JAmk&s#Aek5RK*f9?Y?Zx!R#W@gn|toDyDO~%@X2{<~yTC6G{1*6xaAYKjerP5En zX@lRP_4+h8mf8HdzD~%w&2?yA#EHG+xy^OzQ9wNkGO=;Hj;-R@T4^=Z4ZVyP;@HW* z8+ux4H4;84kbgGH4Lx;3PYu$^X#+DRreWG!D-Y-MND9cO5>j2@;{U&)frigNkOF{= z7g^rh=GW;Na(B=9#uoEdF>$>f1$-@++1}Y5C>-BH^vuEP5AZtx)c&4jlJg_T*eEhK znjL}YIbLttTyjD!chY6!B)(FBr9-h0r%7f!FT9;BfoT@k;d jW}J)`_=4&H|1P`%0tfS}sujwp00000NkvXXu0mjf@`Tbr diff --git a/src/main/resources/assets/betterend/textures/item/terminite_hammer.png b/src/main/resources/assets/betterend/textures/item/terminite_hammer.png index b50ca942adb27b520427258ceef63b42dc4ca379..2bd4831235365c8e1b5984506a62499e6043d1af 100644 GIT binary patch delta 243 zcmVJZk9k3-hfu1S@qmTQ45XNZ;NDe2^RRtQN#sKm&$ZXljhQPuEuK~tg4GgdV z1Nj-HK0sz?s7C8xp%jp0B002ovPDHLkV1iY%V~GF& delta 435 zcmV;k0Zjgn0?h-EB!2;OQb$4nuFf3k0004pNkl0HU#M*bP zpYT@l-4qG=H5qCvlb-@EC)?86%w{yoQsRlQ+eeG86AXA+*-z3QC`M_80OUJ{b92W| z`ai5g*zIF@Dne;*l;znuQ4Jt-3o6f+PQH(;m$xx>Y;ap%#+L{&k4D(-Bj(Zgtghm2 zZ5@pBaeD^>a({WDLIu|n+&W@_QPW9><^f$Nk{-2n;2#;J@nlVEDvFrj{2(4rm`+~3 zrA&ABAeR@4he!JiDiBM6tS|O%;}#sGzpLc zb7ECPn`TV;^@2hVnu3AdJ@l zkV2Cad;b@HegVfIKEr}3a6@ncWX&LO{O=E}h7dFWtgy8jt{KDziGk!mUczetOf!SA z0o*VU8)gV`27qX&CYWJxIlKmdLL8(CY5+0@#{@`@C<8!>&_oSDmLtXhSe(N!Nd|yz z^>KtG8ZUbW26tNqxGV4(08WK4=Sv8qraGtrAT`4b001Gb(p(cM*fIbB002ovPDHLk FV1io&OYZ;x delta 347 zcmV-h0i^!+0fhsQGk*a*Nklpx*c(LcIXYEX*qaJu+r%f?mf!G9l5qS%1dEVS867moY4pY-U%Q zCQY2^1t~)!Z=tnD@U#!{(zw5PmctBu1g?@hvz*c4( z!!j8e9BS3_t6*3rs#-&Gc?y#g7?ugSJZgFh!}~P91YBMLaCUrxs@7aPFWd?0jg|nA zT;4@Hxt|kwdQ|%Ez9eu!+uL!~&8E`wYXhm>pr@A6*3#&UOYr&zjXTt-;dk#-D1wT| tglI(Q??EdSTVymMDjpM&Z-e}2yaQoOa-rDeKlcCt002ovPDHLkV1jG%os9qh diff --git a/src/main/resources/assets/betterend/textures/item/terminite_hoe.png b/src/main/resources/assets/betterend/textures/item/terminite_hoe.png index 8fd994b9bde8b28915868c37186a023819eee198..778f244e49ea9df949d2fbe396eee7bf605d5bd6 100644 GIT binary patch delta 199 zcmV;&067290^0RwAO^%QpZ3002ovPDHLkV1hXt BQ9S?v delta 309 zcmV-50m}a40nh@FB!2;OQb$4nuFf3k0003BNkl}*n5cnwQ2t)$5Tln_W^t&kib9zfP6!6c1{^3r5RC(f>l4?g(j=l#sb z0B1sUL()DFfixRtll@0Q7D!qp%?3$wyjimSGw0vhoF5b*34e(dC02|kBO_9~xn%p+ z-&b%6z%KxP0TL_Xp~q-4;{9EjVc;2o)ENMP6t7HQtE@R}bs)0@7{7r}FZN7a33Tb$ zVc=0>#W3);CRqsppdRI@qHA;qiMc;r<$=#{0D$LY?U1Xb3yb_8sRG*h`E_BD-;)ja z@s<4q?d&2OqArL#L6)-%R)S-kQxlx(yq93-cO6C63C_kZW{AkLZHtQI00000NkvXX Hu0mjfkxz+2 diff --git a/src/main/resources/assets/betterend/textures/item/terminite_hoe_head.png b/src/main/resources/assets/betterend/textures/item/terminite_hoe_head.png index d189bbcef94881fd531f2d79e20b270eb1e91454..9a4863c2ecd2f7083765e3366008f7399b84b6d3 100644 GIT binary patch delta 126 zcmV-^0D=FB51RpyBzIy-L_t(|+GF_t|33pIm|@faOanlGF)8{#3^Sksf(C#zfxz*< zKmHefe(@j5C(R3tKJNcP*yO}sf`(uh6ygJ8kRc2UrhpBCdWrNvgc-uvS`Bs;IR?PJ gM3xIilQLlp0OK9bC1C;Rr2qf`07*qoM6N<$f;7)F761SM literal 1929 zcmb_dUuYaf99{{Aw6>t=LsAMZTk9WmZ)a!!FFj*=mzslK49P*$hoZAHb9ZZQcecBm z+$D&OQ9}EmQY}8zf++avTc3O|&<8=^L@9zGc@jYp34)dCIeY)S*0hG=!QRg9e)Ijl z-|zR$%!Rqx=MU~bv|kW}gQc0`JikAfU1OvC|IwW`;!ExVix2OVIIx3f{3F9;n-v=LU@U$qDO0fn3sO}^fO8HNnSc-ltDQv(7Hdf z7Sn~b*$Q4;!VZxppB0a_Tuug*2GgU`1F;H52> z2QhZl5(I+~Njkm4)94jsS9DTYji@qD6Sf>Ftn3jrp ziKm_Oed0PM)HLFFGW4J>JDLt<1OSw)z^XzUm^Q)H{`?}t%UN@?`CXqAhB?PSQ2|9% zuR>2ICN^aQ>8k8N&5%9Kvn`7t-K*MtwijZbFE!K{X3bO)&ImMUVgoy}ZcrdQ23O^o zwkKfGsGk(Imx7u4G3-oMn)bPcQEnI{%yXPgG^_dc>_uAj39(#)1 zo8PQcPI{N-ccUk)nl@2Pr)s=*d-0cYC;bUpxx0F7SO_D&_9+FXtXaJNHYB#}LEECh z(H%!O`q>Yw=Y9kgl{?mUHLLH(dsN>m4z8oHM)?k^NcW!4-rU(0dRspKUSI!fK1#NC zcCDt|?!wNup?#LOv-65?-q~<)YVe1_xkE!KS^Vwik!x?<^hU)G zE~s2L#X!foXdE z?++NmG{Rg7Hvr~jm?6lTKo}(FcJ&k_5L>Ik7^?v=LvU#VVMdtkAUU`J$N>j(CNUb} zfd~som;#XVku`(ZU_Mk6ibnLP1Sy0?6H%IQCL&Ta4LAS*;?iQbAI?c)00000NkvXX Hu0mjf@nlY% delta 349 zcmV-j0iyo+0fz&SGk*a-Nkl#Naf{$B4fY50AB012 zgKJ_FE{dOx~t7bVV9X zrIekM%i|O7rW4xJ$+u8?X$63_S*(snl(x3L3991}#aIF$V&X%a%P|1@@=A3);^?%7 zr5gk*Ty#1VOahZI1aSE5(isdmySYZ)KX``=8~7?bJyMJ%aOLd_1m49ZmBi8wR^#zc z1E<#oAZwajy;i?)(7TOxn*-1H_Pt!AsWd59lmc=5z0;XUS4kzk?zK8C>H+9atpS8h v+NO!68#ps4m>>j&6-fsFVdyS|{+2!fA-aoz6D_+`00000NkvXXu0mjf+$^C- diff --git a/src/main/resources/assets/betterend/textures/item/terminite_leggings.png b/src/main/resources/assets/betterend/textures/item/terminite_leggings.png index eb4bf6dcea8d622a90fb1f37951ab1d9bc149294..18503e47fe48177823b7902d33789b158afb3227 100644 GIT binary patch delta 189 zcmV;u07C!A0_g#eG=HE;L_t(|+GAiCbbv7_`aeEQQ1kJ>KmNl2hz-JppI?Bn$%(!H z8GYRU<23-J5T+4XGYB&*m_pb9kS)lXKztAeYi_M3Yye0RvSKiXiW6l3%mM%0Qan;>5TBgf`I)fQ#cb0NExq13+Sg ry#NYvSS%nZ#3hd103=LEd~g5&WxMnr9(F@@00000NkvXXu0mjf`)Et@ delta 284 zcmV+%0ptGZ0mlN6G=Kg{L_t(IjbmUKXuyaekQDtNpN9YQmSX5Z(R}>xkN+@m{O^zd z$N&ELU-lVZfWud>GB9Xs zqw-;zpFYQMHHHCa_wGX|K7IxwC?>+dsH}k9-^hS5DH`r~#($*f|1oo?GFWsqGBEnM zBg6@XLD83&aA)6o`U0mXmVoj z|H98N{=*D{8AcF*6oNE@!12F7z-*9V3=5|GXY_IZPm}>LjVPL1tBE%NqzTzp7*_O* lBkTo`KhZTI<555Z007N2XdY2-j`IKj002ovPDHLkV1hfWH{$>R delta 226 zcmV<803H9J0saAyB!2;OQb$4nuFf3k0002ENklEFfcGM zCCB_{U|?V{le1$yQJ;p;z=*1a1)Hf%$ua+p(~=l$wY3>06 z2?6jY03mD}$$;26=<55g763Eb?yMKWd-)0AlhHCn07t0=_+*+Pq{0}+C z6!Hfof{D=4EG8BdmpDZn1f>SFQ%5HS!8YO+A}U=1tqRUAnn6XxB@WJ!kbqT(Acor^ zzR%C-CxRF5@XmYZoOj;4@WGN-!DK?6Ydt*{PA}Y5RMl=tCVx~_HD9Z0zE;)L?UhP0 zp^rF?Ek?ju*2H)nD3uBR_zu9Yz5ybW6U5H`(9_k*@=itU2#o@p*G10nZU9)C`lbLn z8Y49_O7C2dpW8(MDHLljBRCshJA;{31~aR~gB~TDu16Y*YM|44GIkR%BJrR{Q!$?g zIxQue)_kq1GJh0ReC=3o{t*!Ge$Z&BgT13`Dqj;Kxm{+C4xZlYE%I=vO?$dp?acna zTlU`U?{y>+R#$=HP@CV<%tvmtBc9{~NkufFk=*XHLvCcJ2*7_*mGCwfJvv_i00007%Q7MzQen=Hqrmy)iR>DZC31g$LDL=>0J%J zlczgmzs zLEMVqj1il&@u9ilgf=&&DLUJ~pXn>8G(Zl!h$-Z;Il!*`$6;3$G~W=$6rIMdm)79olq%{DC8ASUBQL`gF3 zhFPk#nnKR1hc%sAnP|cI0;BW zASAoisL?gaOeEqpMrIxzH%y)6oqg-(;3#r&m=%BkY0Ef4NC;4c0TsxP15pK_3XK!p zNX@Q?3LJz9Sm`koZh}(R=*UI?3Dz|=MeH1+IU6~Y#=K>wS*Bh|HA1q)ro>d8SWyv= zt3#&aB2&Xd(J)KX_8W$->M~ZKf@KZ_G?7Ee0OU|ePH~zPfHFcz4@qckew1j_UUR+q zRiEobqcQ$r1xb)fNdn@6nhZE070@|ZQ~)Q*BGf`D7}RiG&4_K#rG~QWqk5`z8Zj9V z=mbbBN)>Pd49HwE1XG-%$vOy0qJ%@DXXuJY)R^JW?#vp zSrvLqKL1`{|7$+Hw|7>p#^36~%C~j|!} zzf@Z8kF`Gb`9jNCYqG2Jh40FzPJh#Kk-2bn_foN^`1Jn1^hc#1cfR@knYY@H|K7WN zX|%Iv2|ReN^XD(;ofDIP+}qpq@hj+jNAbi$c6!_1j@e!8mXog?zWh`9#(|61j&<*T zuXLj7jUaIR z?~nh5pI<->A=UtxW{^gc6MMmi5N!ZRGt5?yW)O|l0DQpDnCm~of+?t)(Zc|r=Beq@ z|J5a!P&E@{0J3Jcc~cosG!rraq`A;n2&@@bI1yztzJMm$W-6i#0BOW!Gtma%(@c~X fK$J7vHW5*a7-hDC*qzC74h(6Jr3fX194$8BjDs4PeBlSy_sMVcY2s3^!l=V`N~!jA}+k z9NLj>Mi$2!L&VsOYyi3oSdcX`FfcHV200J;JV^Z{gF!pi(&mhE0ngJk< zAaMNekN<_AUw{oE+5nhlkVcaed%=bfZ2(9!%vO+Q5RKCSTmWPU!-6R&nu!hrs4Eyi xnvgYD%PDHLkV1ltBH`)LI literal 1953 zcmb_dUuYaf9NrL!rcJO|3Z*Y@w-gnf+u7N@+uNmQh-Kq(fs3ACoy2$t6~Hy^OMc>0?E9X+}Ag%)`8& zWfgaFFp3fG?!7v9?ti`} zfGBM~-;c4SmRhYJB8(;$L>k?KY>5sFO`oZ=EadY6VG|2N=7BgH-_8aMM?5HSUhOq% zrYBj>X5+@B<-3l#9_97$?oD%84o57bAc!>4GJsG4X|`tAFntfyZ3sKiJg2VH+zdrP z(+XO<$A*3lRJexX2>&OT65HWH4U3%J8ZI-{_sWXgucV#jRUU}ILY>}LkE}AXow zA)rL{Bw!jM4zw6SB^n#L?Gby@4Mq2w-6e9Ao$QXPuH3eTjY(|xj6&i*$N6+#yIa&_ zTaml->lG$QZ_xZsn2?XRBpVG{*3(IYK;vZ zTt0bj-{sZSRcUwm!55!~$3McqEd8+eYU_hHpEIS4zkd78!I3-v{DT%ZejNPtnbpSW zrIk9ook?WYD2AV(Jv(ydz2od$^~tpp->n}xKOnEXwD!i%_xD`<`jN+1_P_9ubZHUpK!vJug=&2E1a6bl^MvzP3$rhUzV9^D#8KfC5 z0aPrK5eqj6WGGGpK+Z+C0h~yH7^D$~u^Rxj0jCq82H^?=0Jz~EYFPD}5dZ)H07*qo IM6N<$g3fYfA^-pY delta 407 zcmV;I0cif70D7fy5hvx3uQc(prm?LrzfyO+`Zx6a?0k8qscZQDRn>5H`rypig~1 zN$bE_&b`0y{JU514--SDB|x%m7ei;VRAjPLqy+r@lYkgHNq zuZ3pt>|P8u0WoyKGu#%u{*VTGyK4gGa4G=A(Af$m2}k`lj=u7i?Id<~;k~)Ul-rHy z@(O&5K^gbWAmZ_YZ=d!xilI|W#VG+llcnOXnN7FPV1K&|8G03#fS=7^n*d2jz)#uQ zXqmZs-xL6Vd4Eme&_E}m^ny!s&_>5_w;3rXxlV|s@5ZMboaka~b&woj1|WqpLCrV~ z0EIL$nlTI@RWnutkTruaKFwGSfN2Ec0m=(>Hvj;2qOh5(We%d^00000NkvXXu0mjf DAKN_H literal 1937 zcmc&#U1%Id9N!WNwY?CbFZBalw~7^=+nJra+YfTa^e&pHn}+1DQ9-ghGkdq>ZfCo@ z$=wAXn)qTN=!=MyzUYJCiy*!z2Aao0D?*@PXvjsp#)1Eget3zwsM$2cV_tFs0Rl2~BT04uU&+XMKXw2j699Ve43 z!lPbnd!pk?J7nq{i}`Xy*yM_^c&zVOSmOzgYy2K@41N!y39VAZoP=DhuDI!3$=w5sFOH%fl&pC zD(eUjRFCti*o>*IS3q# zF<=bqNY8sNp{&n#GV;Zia_V=ore0CO=;=8^b0iN8kGdeI=X78|?24VC6)1)TyVzCa zzwMTIokupOBIh_2bVpd$lpl-gwR>A+o}KQE>b~63lI4(8?nQ;9b!H;Y?zF#0p7!Ta zcYU+Q1nGT>--X58OPWr^CaNN*`_Y$rFaKj_<^JAdQlLiOq`>o>0x(&Q0mINC@EA3b z=^>QYMP2sv{@-eRK<|6>q~-)wCQeXQdGL7lr`rD`9yL8XyHZo{R$=Gg9p|hlXJ<+r z-sy1AHN?lD@326mDiU4g?aQ;Gb4edhmnSO5C31UrcYNrXGiTRMY^`UvE?#_p9+A1+ z^>257$*vuLsJ(VHv;FSv8>7(s{q*kWk!Rn+2R}LgEN~a>d%j7GV7b)j7a{|Z{V4sm!7gWyv)$lm5nPB{a)TUi5EtrcNSm$;Ex}6 rejOS6>CbDM?=8-GPwZSSe|13maO9)m?aF88(xy2*IaB`f#Nzs2qttFn diff --git a/src/main/resources/assets/betterend/textures/item/terminite_sword_handle.png b/src/main/resources/assets/betterend/textures/item/terminite_sword_handle.png index 524b0eff1f3a95846845e10de50c9c1dc6e1f1a2..c4e35d665ea671d30d2a16b56bd9f686060f47b2 100644 GIT binary patch delta 216 zcmV;}04M*95cC0%B!9a}L_t(|+GF_t|33pIn1QMWfB=lmm=yh=K~If513;RO|NZeF zM3Zem;pZ3R8vrxJ2=vQzI z0Br_ohARTvD3TEiHwa`XP6I&B#c(E&4Zc2{j_uPfcjP7vu!^6naYmt;xW zyVg;4Ucm%e=Vcf_5iO59Vpp-MPjPL$2l+wr5x-=`%vr8uua; zR$5LWYgcJaw^AltFeVReh7AHgr4mrrsyKVx$&`ZY8iO(@i%ieOShk9_M=j5CN3Hu% zS3lnq0GBo%ug2I=OEy~#;d(t2IE_j{HblFLNgFZ4$hF2D4fRZ5nLGV#Y$fU-=vhv} zvNCIp8d{S~Mx%aX!sN4u3{$sq?sMzrpcwQ}gyI0l;+D}Im*7~16%-KO4R{5BGBj@K zMrv|Bl%rWT!Qvi=6(HOL#jeqz2mceSYf8#;vJmHNWMLXHwwb2LY9*DZm9ZQg7^~w; zD&lda&vZR#YN#(3p>Wzk!_XC7lLZKMiB^Fcrg<}^MevI0UODYZ5~W@+Po zbN%^cpX-)}IsS<%u(}3xK1{Pb)akG+=(HM!kPZQ)YJ5rzhlDEI0mr~g4QAG}`l@uy z$Rj}%S&5}36cTAEg;lAlAkt8RJXXeu9IyL^E_p=hHC)`i$;uKrhz?gq8G|g@LV=oZ z_Xwr=eMUM}d2MV^k4;6c%+HM?O!|Q4m!rE@%F96qb*FLdHsdeme)?TF@nH3$1R*Qw zh*l*|q6+E}d~tXGVKA`rSmMd+S4PgB+4|?B^{bsz zCtA)2$faA)%r?Fg>PY9|?ZuT}e>-sD?Ci~LZC}sVwtl>Nw@{c>iSMqByng;uKC}1k z(ZV;&3(Y7PGH`sa0D&tUA_{*l?g0oJah?EnA( diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_axe_head.png b/src/main/resources/assets/betterend/textures/item/thallasium_axe_head.png index 1ce969e2078046a11e5e1bcbe2f4d83423743067..c82b065d22f5acca021b9e8e0343f454d9e75cc4 100644 GIT binary patch delta 172 zcmV;d08{_^4afnIB!7=dL_t(|+GF_t|33pI7(-x1V&woEK(-e^0A13&Vdj4jwyIi0 zx&a`K=YKu|V-TAp17Mn$ytoC%L>Yjtx%2MT|CQ%2!3_Xn;tWvqj00r?tfLsOQlN^mOLqHg20E3J;@dnf!z5{oWiX}%H%*vZUwirh0000i8#499s*ei(3*jm#WKH2OISI`Z_ULZ$9Jn*)m@q*AKCO~5q;%AyBUiQEfLw!Mlhp`7lMYzr%8R|wwB*)kG zcfa$U^Bo_*JvI5vK>wb8ilPQ`S#6q}cSgtdUh@CQ%{m~bJ}-MTpr{?Yqhkwo`n^Gl z+IG#(&xAAjK^0;r225_enxgiPRy_dcP)Hl7V7qDNx6i&{XxmIPM-n=(dl^); zvkN{tv@n^63v*C0nbD`{{Z*9^I4A^k)hW4wT1_(zUX`q)+Z;nTAmLn^8H)naGx`*r z!9JoBu_OxxNu*^ZCM0=9ltyTg7i5l?IU&ySg32e=xI(vn42kBOmO8CXv|^E~G*b*i zPvy8ur4p;eW7scnf}$uKFLI*D5(FF6+z?b*HyCa+XefZb?S(dW>4*^+xE!V#qO_TU z<8^4=pj9SPFs=$bPKfbQN)4b1J24M9q7!r381 zX04PYu_+>m1tI`)LXi#LFr$WU^oW|Z1L9t-^@0;%0*`ir}h{s7G1UH#_VY|83ZzhOWAPxY{a^Gu`NGb{NIj`vz1!9T;Eq)y>X8=xFUt%BfWI;O-p;R@A^u4=!L!j!X?bSr zeGfkW`|_VJ*Z$fy`1E<;zd&i|b44r%s)DX(oFu cmActO9X|S@y7uek1JTzhH$JJIKQO!WH@Lb(5C8xG diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_hoe_head.png b/src/main/resources/assets/betterend/textures/item/thallasium_hoe_head.png index eb1efc432b968cb02d9cc9ebb6062544fcece4c8..0c235fb58e94736dca7d482329a85cdc5a87b764 100644 GIT binary patch delta 125 zcmV-@0D}Lt4VnRvBz9p*L_t(|+GF_t|33pIm|@fa>;{-O%={0-R#l5gGXSLN{Le@K zm%O<3zw_=@f`(uSfD|iw#{CE3%JY}thLB_c2&;IcF`yd)#H0rz%#e@``@yav#{jsO f$a2AGQYMT6giGPd6<~qw00000NkvXXu0mjf7LhwD literal 1716 zcmbVN-HY5*9L-p*wdIYRnR^NB7*-xUt9!HTw2iwMT_85EnHP=y3xY6RE)|#g`Tq3Sx0nAv@>>t_(>-D7L@WqX52i;(c<0>%f^gS2 zUZt8;-RB@?eiji{quH(>aBdJ}lIRgfI&QkE8y0BOE3HTL z*!p4xudiU6NOMn#vt7sue3~G!>$id!b{(nD3;8;|tw>@YlB_t=d@3kb-6gTWA}X5M zoQyRChJwy7Qb?&W|D+ZQ97MY zwxefR)KE0rwiOj90LUC6$7?}?x^fWDj2MbE#*r5$9t*^j5!F~baU||^5P~0$X@hu} zCY~^*i$X=qs%c1lAi-l?*p6C#ae@`vqCO3hm}9juHf*wl#Z7h#>ha^71bAv)cdW6a z7vCRC#L2=c4`Y~+9no=REu_jajafUwbYYd-oJpezVIiU@VNr##)~HZRBg^gmvP_C-%@HN~j|N6==LuO+&Lk|b7K^wrcc=GVxGpRQae@L&%SA`xVP`#$ zKy2m_M!Z`nRdceQH#FG-#FA^k%2U-gY}+tL`-=>>)8eN42YpT$<{ba1BFjJ)su?mh zYD5MoWy=91*KysXRI{}_A|tlvBagpos5Qx&x+0uW)j~Gs?(Z}y zC%sMa2Qo3MCmj^g`3BG3Zu(2PmH!y6-roK0syVPV>3+w4{GaZJ$-zw&G$@~-ij>Bq zq_bvF8s*pz>AOCvZRcIk3FW%M|=t&KK=a(KEcnHi}MxhOZ;cAH@D}} z)2F@_e%V_!zCJSrdOwoc%LkwRI3s?gKjA!l{*&H??ccAnjrMDA{9xYssc`+;XZK#Z zbR#o$bn`8B-?sMBwEe<+pO-c>;`X&G4{U6`KKIwmp*xoEGhW#|Qu+1OyAMTwTs^t* zzW$Sb<+~5wJXhIs4ZZ=8B!7iTL_t(|+GF_t|33pIn1N~rtVpZ`ABJIuL0v<7EPxEDJbwvn5XcY}k2I1E02>mrVL#X) z5SttW;4UHA0AyEyyg`-$u&|)W08rq;Vg@>Er(u>mj)0J)>e(F0t4 Q!2kdN07*qoM6N<$f)C$8`v3p{ literal 1773 zcmbVMTWB0r7@j6Jv`vEX0!piPoDi(o*_ku5yK|vyOn1}nLN?u|3rVSB&zy61cg)V5 zab}X;jToY~5Ag!6q7M>5!6zx|OQBFyurEq|DI!RHih@rqJ`^FK63^_-t)w+LFf(Un zzVm(Gf0=)^Fnx4*&)z*8#|`JQnHhE;iOyXE?7IKfCSfWXL|)E&X;QJX zOFlWVG+jhX^T@!$_|yEMy2%I}5<t0->!KTsb{H}wK)&sTHg)-k5n6O1ObN_sD+I^u z(z-!AO)Ozj9eNUo$x%p6AVyuBx8PTs;uuM!N*v;b0mFhW)~nEv1{Hb->h9;;1XybG z`L4#6UL2<@5rmVAER1$SwnPWThDW3s63_)7k;z47b2N&^Gt)kSA@z%tRy&0%bS(4f zbW|9fKQL>%nAU&3-jl?PZNzVa9016%`=BG76a&1;lmH zN&;pQ=~zx`sz#D()X>cyF|&5Ss@G`$A}7d;?N!z0n{8o26t#OwKvA6u7TT}vE%LD~ z<@Wwsg)q{)6u+e&&{9}~KA9-9+-;}7q&xW!;NsogZ?BpyTfOeL?8pDOzZdNMQmzVE-_QS^V@Q?Dj$N7uTyq0}q=h$Z(oA)_mL)YJaWayppjdJ~^ zpAY_W^QM|pxXfSL^f6p`_o33<@gJ^u^ryo|W`?`BlMry JpB_H_>faV3G?)MY diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_shovel_head.png b/src/main/resources/assets/betterend/textures/item/thallasium_shovel_head.png index 57fb43b2baebefb405c41e0b05d2fd6ab0e6c973..fe00931eb38bccf89399005ee8e1a5cf728a3907 100644 GIT binary patch delta 143 zcmV;A0C4})4XXi=B!6;AL_t(|+GF_t|33pIm|+AMVBRqEKL{&&#{F0ENF&VvkjC>r zAAxb@`Ac9!h&BMEdC7}g|2ywq1#1QwLbL%e%^-~-8}@?@A;|!kAt22lLqLX+90ouG x7(kj}nn7aZ7{CCt8HNWgA%VaUHvks~02(gXm)_;dNB{r;00>D%PDHLkV1n4rH$VUY literal 1747 zcmbVNO>Em#9CtQ|*w%drBviQIxk4HYe?2F5Y}G3zDKru(rOULAQ(xYDPOQd$uI)BS zg~Y~T(l}90z>qj_U`!PpnKZ-%>@u-|211B&V7q`+A%TQA3=PV2l9~*4qau>yuiyLq ze*cg6_o?ZrXLj#=cqhkkyUUZM8Ft>69QS3}|0BPxLw4E`Odg9kZr20Jk>TEaYnbEi zz3NtHbaq9+_AeJH(H+Ek@vx81ike=|@)E7P`C^yG|a<0^fzi^R_Ua2=cR)X}(B9 z!sjJjL~0K3hAFAKVuIWgJWy0aRt#CyL`Ag}-O^0H{}Y&6h#hOD^mJc~-PuATjsr`U zTdkJV(j*$zWz{rISphNtB14E#$B$uK^rMjth7yTT=mxP%eLi7?HM$tv0(066!3$Da zKkBE6B}{I^KvpFs38@RjD8&VfVY4fakxZJzBYqq)teRqj290Udpm(57U*9IcQd_B{ z8k>6Yyi_8JCzeg{j=Dakt?03VHKYV%Vhcb4Dl3@?KozK#nzNL`K}E9^r3bB0>^hx6C=gYpsxpLW z0dO0Xbq$6w{7*1OmP11ivY1^D)`=YWb%9SaX%%UchD?~b)4DDy6|3w=G4v5Bmu!KB zEx9hXfKCiZkR$2@Vv&Fx7NKsMBGeSk)R0~yYA*`5zC_VtQru*Hug@_>jN>2Gf}U3m zV&p`kGIvSupmm>-4;+%XM%x7OFk zwm*7&;hy2StA$;w*T1>+&d}v`bC}Y%%O7RoAW(}VE(Az)qeD-+m zC#L{L|NP_hjnCe_Fa%%NHZ-2eUwnxB`o-UG?mhYa-XFm0Yps1X@`KEL_Pf=!H@IE3$_7}B!7KLL_t(|+GF_t|33pIn1QYaglyRVABIUb0HkTji(CKC|9te{ zykRD31|Vy$Jb#Ha1F&gU@kk>s43IT<-n|OfOq2omG~+bDs%jBQnz0&y%g@*}V;DfH zW)uTJnqeAY&W6e1(u`pMNHZ*<5V9GY0Sq9GP&`O86E+M0dlSFTCJvagY5)KL07*qo IM6N<$f;9?2QUCw| literal 1533 zcmbVM?Q0xG9Nusy)JjzpB=v(`Hwuc~+u7ZF9kQnBZS)SZX-H49{nX6O%-yZI-C1`x zxx1iHMFc^Fe$!G^RIpeGDJl^wD73Vo6j}wTEhxo5KuWOmLm|%I%OX;>c42njo_T)n zzc=USp5L|e(Vc=I?5dQ_1wKC*j~!$Dzh`S3@#$W_d?*xz`yP(Rh;Z!qxFFoKG#v$NTNdwX)$X7%P-NUQ(g<`!L_+6 zUR%aRB27IjPIe$CaA}0Zj@$A=*fFFYFXZd^SdqjYBw9A4=~$p>Tk~Rx1yszYb23&l znwT%9)f^~lnZ2S0)Vu=nimJ;%g&+s@qB!^@E-fH+xL`gvki~a~)Qln@DoVTEPPg?m z3mS@AEEW}@DVip8gdBFg2z6vHoES2gG{k}9M-KDEm=V?3N@Pe})4mC=pU`^Yz)jp? zN(cFhng+2+Js`me&R+>yJ>di^v_)O&MIpzk36^`wvJ&`hXr-WchHNFkbY_)HoER$RH(A8OCi@3FlIz48AC>}&A{JB`YYhW6KV%V0r8qDJ@u@|} zBdi@h9Sa(~p(cu`A!$HUWuVC_sH!?t0R;JHfDQrZLoJ>P1V!l1z>GNc?telFhIJOW zh&#%0QG+VJ*XT*JELicv2zi)ROhe+TrX7dCdOm|m2503$oz&z^K9iRVK(Fx})N(`z zSg+}|;d_(el{kpQ_vC-RKM**)h*0b9d6FQ(5^J%*VuX8Hk5jmpO0evNJYL;FQ5>W% z4OT5j>}3x`I8Jaw!f|9Nkp{=kU3;ca+ip@$`Y++`!$MY%+9;sY4erG|$tZ>Euf)~Z zH%0lomA$*aRPGSY+d;fc`VikFos4?CeFeNvnX)~~d)!9FoURtW$G5h(r&3QIIl4af zx;H5-etqTFSC2lC+IK9q_v784j~2(ZE1UZ969*=K5y*v;>#r%d1{PqVUH#5IwzWr)VJ#*H5qx&JUjK&}C?i827B zxiek;zlI$5|Bwa8!7hPeyavD&fouk82Dt>}Y>$aMi3>!Sb1)S><52tyVuNta;X8y4 l0BJ@y0NJ1+l$7aW003mq$q%suWBLF9002ovPDHLkV1fcpP%{7k literal 1807 zcmbVNZD`zN98Vo9cI(hFr+pE9$T^+s)J!F*7jtTG3b-zxx3Iyo|xo% z*N!>6N_8^un=r9VKgsq%5Cjon6B$+TgD?daG+QPi&VP->K%?+=fAo5}y9H`X9IwYWns`V_TuPk1y@Z@<$< zQQN<@vg5&c=2^|ab_|+WN3n|S5;R5i^j2JGOrikjC~r9ldgarLG_cGBeOS(L88?Xv z*3gWH#%6}I#>}Llnso2epr@h{0viPoRP3VTYn23D<<-bKyv@>}3JE3?bblxa#xo-z zi9H15ST|$vk^mGn#&>h7AVq<|@e0c+EH5$~uW{X)sDk>BCTgCU(?(N=>RRL~K^KC+ z)mXM%F2~AZ410N&S5=ke1Xd6jf?)hhq)DyBP+RskAh#f^fE_ntTm?AbKVKlCm^bicNm&LfaUZ|0E z%OIHy3lj(X4_l6j%l?xa_Mj9DP=XdXfhQ$n1R*Q%8ZT*Fyo(bxj;ld4*tBxf8=(Tj zb6H;0_z-;?lyr>=1Nfg{)6jC*vmuGuvSA*vu9K%hBa>PZ7qLf#i950CB9qb5jvqkB zK9dJDyMRcti}xl^&HYkuZKw@`%~B`g~bi`*ZSPV z2I2TeRo3;KDt4QUjC7fibO|w#i*t;blT6u&BSFqJ*q-w&@~Xk&M%K`kNf<>W$uh6- zjDoslM#)JEqwA8)Kn03|Aquh}nqfoNd<|JXsor$`6&XV>)mKFeRNF#>M%eBN+6e26 zh=bZ~YmV@_gkxG&DKWuoA%@X zbYD-7QGiY!kqOGuVLWU&Yigxo|6R4}vkh};9ZrT_xNJ;Wa?zO6$RX4onZhp%-!GC0 zel4Bq&&IzpZmq5LZrk_Dso8^lA2vmAK9*D-p;lL}ocrSR;1MJ3&z64IIs1IqB0!I? zo~7CBu>*5Qw_R%UPT$mZ|n<-Xm|%)dL{IbUjR1)c3J9n^QfOzgkJomkz|yZ{o5$2;F#d*Z-@(T@D= z-i~|hX6wRl*SnU^?!D2T?U`%;_@_^HKlD22UAeXV*{_3L9SPbBQzsVB%ay`w0rbq(y*sD?tHvwmykVsfVn#taxazLVp0+^n_qYufp<7MhNBo z#o8k}o3~%RKmMbS9ctPLZ1DqGCv9j z$+1Ga{Qv*}07*qoM6N<$g7oFR6aWAK delta 426 zcmV;b0agCb1J47HFMq^95FPx5>n#0PFp$YkGjCreyN^hrP$(1%g+ifFC=?2XqAWn~ zC8#Vwc?LfT$g?Wa#6tqo#1Ie$9ug2oRpT7u!Mn{nZkvlBfPaS`H)xZKkbGH~hT;e} z+b`JJzyHab>kGN_sLMJG@G*J=02Eii=GHZu>%Veo3c$uEa1MMO0w<$84-^nbi#r-e zC}@TmJ(-3Z>#`IO2GxNlO^n2CauEuMBhygdoTKgCvbC=IeAc; zPAG`a1x!x!LVv{#Gl4esP7P6RD9_BFqD?_I^-c`YdhmRx56xxKRln|j0DwP@wf6($ z5n$;D$Rohg4{)D=fqsAt0tWa2?i0{<+nbz%E{<061KcN|dB4A$0sv_K4B87i{Q!9i zIJ*VC&Owh4pz*E;3TV6Uk0+pm Date: Thu, 11 Feb 2021 15:16:49 +0300 Subject: [PATCH 258/463] Lang additions & correction --- .../assets/betterend/lang/en_us.json | 15 +++- .../assets/betterend/lang/ru_ru.json | 87 +++++++++++-------- 2 files changed, 64 insertions(+), 38 deletions(-) diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 9ddd63e7..1d96ca76 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -662,5 +662,18 @@ "block.betterend.end_stone_furnace": "End Stone Furnace", "block.betterend.flavolite_furnace": "Flavolite Furnace", "block.betterend.sulphuric_rock_furnace": "Sulfuric Rock Furnace", - "block.betterend.violecite_furnace": "Violecite Furnace" + "block.betterend.violecite_furnace": "Violecite Furnace", + + "item.betterend.terminite_axe_head": "Terminite Axe Head", + "item.betterend.terminite_hoe_head": "Terminite Hoe Head", + "item.betterend.terminite_pickaxe_head": "Terminite Pickaxe Head", + "item.betterend.terminite_shovel_head": "Terminite Shovel Head", + "item.betterend.terminite_sword_blade": "Terminite Sword Blade", + "item.betterend.terminite_sword_handle": "Terminite Sword Handle", + "item.betterend.thallasium_axe_head": "Thallasium Axe Head", + "item.betterend.thallasium_hoe_head": "Thallasium Hoe Head", + "item.betterend.thallasium_pickaxe_head": "Thallasium Pickaxe Head", + "item.betterend.thallasium_shovel_head": "Thallasium Shovel Head", + "item.betterend.thallasium_sword_blade": "Thallasium Sword Blade", + "item.betterend.thallasium_sword_handle": "Thallasium Sword Handle" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index e25a5697..b28cc4db 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -29,50 +29,50 @@ "block.betterend.end_moss_path": "Тропа из мха Края", "block.betterend.ender_ore": "Руда Края", - "block.betterend.terminite_block": "Блок Терминита", - "block.betterend.aeternium_block": "Блок Этерия", - "block.betterend.ender_block": "Блок Края", - "block.betterend.end_stone_smelter": "Плавильня из камня Края", + "block.betterend.terminite_block": "Блок терминита", + "block.betterend.aeternium_block": "Блок этерия", + "block.betterend.ender_block": "Блок жемчуга Края", + "block.betterend.end_stone_smelter": "Плавильня из эндерняка", "item.betterend.ender_dust": "Пыль Края", "item.betterend.ender_shard": "Осколок Края", - "item.betterend.terminite_ingot": "Слиток Терминита", + "item.betterend.terminite_ingot": "Слиток терминита", "item.betterend.aeternium_ingot": "Этериевый слиток", - "item.betterend.terminite_helmet": "Шлем из Терминита", - "item.betterend.terminite_chestplate": "Кираса из Терминита", - "item.betterend.terminite_leggings": "Поножи из Терминита", - "item.betterend.terminite_boots": "Сапоги из Терминита", - "item.betterend.terminite_shovel": "Лопата из Терминита", - "item.betterend.terminite_sword": "Меч из Терминита", - "item.betterend.terminite_pickaxe": "Кирка из Терминита", - "item.betterend.terminite_axe": "Топор из Терминита", - "item.betterend.terminite_hoe": "Мотыга из Терминита", - "item.betterend.terminite_hammer": "Кузнечный Молот из Терминита", - "item.betterend.aeternium_helmet": "Этериевый Шлем", - "item.betterend.aeternium_chestplate": "Этериевая Кираса", - "item.betterend.aeternium_leggings": "Этериевые Поножи", - "item.betterend.aeternium_boots": "Этериевые Сапоги", - "item.betterend.aeternium_shovel": "Этериевая Лопата", - "item.betterend.aeternium_sword": "Этериевый Меч", - "item.betterend.aeternium_pickaxe": "Этериевая Кирка", - "item.betterend.aeternium_axe": "Этериевый Топор", - "item.betterend.aeternium_hoe": "Этериевая Мотыга", - "item.betterend.aeternium_hammer": "Этериевый Кузнечный Молот", - "item.betterend.iron_hammer": "Железный Кузнечный Молот", - "item.betterend.golden_hammer": "Золотой Кузнечный Молот", - "item.betterend.diamond_hammer": "Алмазный Кузнечный Молот", + "item.betterend.terminite_helmet": "Шлем из терминита", + "item.betterend.terminite_chestplate": "Кираса из терминита", + "item.betterend.terminite_leggings": "Поножи из терминита", + "item.betterend.terminite_boots": "Сапоги из терминита", + "item.betterend.terminite_shovel": "Лопата из терминита", + "item.betterend.terminite_sword": "Меч из терминита", + "item.betterend.terminite_pickaxe": "Кирка из терминита", + "item.betterend.terminite_axe": "Топор из терминита", + "item.betterend.terminite_hoe": "Мотыга из терминита", + "item.betterend.terminite_hammer": "Кузнечный молот из терминита", + "item.betterend.aeternium_helmet": "Этериевый шлем", + "item.betterend.aeternium_chestplate": "Этериевая кираса", + "item.betterend.aeternium_leggings": "Этериевые поножи", + "item.betterend.aeternium_boots": "Этериевые сапоги", + "item.betterend.aeternium_shovel": "Этериевая лопата", + "item.betterend.aeternium_sword": "Этериевый меч", + "item.betterend.aeternium_pickaxe": "Этериевая кирка", + "item.betterend.aeternium_axe": "Этериевый топор", + "item.betterend.aeternium_hoe": "Этериевая мотыга", + "item.betterend.aeternium_hammer": "Этериевый кузнечный молот", + "item.betterend.iron_hammer": "Железный кузнечный молот", + "item.betterend.golden_hammer": "Золотой кузнечный молот", + "item.betterend.diamond_hammer": "Алмазный кузнечный молот", "item.betterend.netherite_hammer": "Кузнечный Молот из Незерита", "item.betterend.crystalite_boots": "Кристалитовые сапоги", "item.betterend.crystalite_chestplate": "Кристалитовая кираса", "item.betterend.crystalite_helmet": "Кристалитовый шлем", "item.betterend.crystalite_leggings": "Кристалитовые поножи", - "item.betterend.aeternium_axe_head": "Навершие Этериевого топора", - "item.betterend.aeternium_hammer_head": "Навершие Этериевого молота", - "item.betterend.aeternium_hoe_head": "Навершие Этериевой мотыги", - "item.betterend.aeternium_pickaxe_head": "Навершие Этериевой кирки", - "item.betterend.aeternium_shovel_head": "Навершие Этериевой лопаты", - "item.betterend.aeternium_sword_blade": "Лезвие Этериевого меча", - "item.betterend.aeternium_sword_handle": "Рукоятка Этериевого меча", + "item.betterend.aeternium_axe_head": "Навершие этериевого топора", + "item.betterend.aeternium_hammer_head": "Навершие этериевого молота", + "item.betterend.aeternium_hoe_head": "Навершие этериевой мотыги", + "item.betterend.aeternium_pickaxe_head": "Навершие этериевой кирки", + "item.betterend.aeternium_shovel_head": "Навершие этериевой лопаты", + "item.betterend.aeternium_sword_blade": "Лезвие этериевого меча", + "item.betterend.aeternium_sword_handle": "Рукоятка этериевого меча", "item.betterend.leather_stripe": "Полоска кожи", "item.betterend.leather_wrapped_stick": "Обернутая кожей палка", @@ -303,7 +303,7 @@ "block.betterend.tail_moss": "Хвостовидный мох", "block.betterend.flavolite_lantern": "Флаволитовый фонарь", - "block.betterend.end_stone_lantern": "Фонарь из камня Края", + "block.betterend.end_stone_lantern": "Фонарь из эндерняка", "block.betterend.violecite_lantern": "Виолецитовый фонарь", "entity.betterend.end_fish": "Рыба Края", @@ -682,5 +682,18 @@ "block.betterend.end_stone_furnace": "Эндерняковая печь", "block.betterend.flavolite_furnace": "Флаволитовая печь", "block.betterend.sulphuric_rock_furnace": "Печь из серного камня", - "block.betterend.violecite_furnace": "Виолецитовая печь" + "block.betterend.violecite_furnace": "Виолецитовая печь", + + "item.betterend.terminite_axe_head": "Навершие терминитового топора", + "item.betterend.terminite_hoe_head": "Навершие терминитовой мотыги", + "item.betterend.terminite_pickaxe_head": "Навершие терминитовой кирки", + "item.betterend.terminite_shovel_head": "Навершие терминитовой лопаты", + "item.betterend.terminite_sword_blade": "Лезвие терминитового меча", + "item.betterend.terminite_sword_handle": "Рукоятка терминитового меча", + "item.betterend.thallasium_axe_head": "Навершие талласиевого топора", + "item.betterend.thallasium_hoe_head": "Навершие талласиевой мотыги", + "item.betterend.thallasium_pickaxe_head": "Навершие талласиевой кирки", + "item.betterend.thallasium_shovel_head": "Навершие талласиевой лопаты", + "item.betterend.thallasium_sword_blade": "Лезвие талласиевого меча", + "item.betterend.thallasium_sword_handle": "Рукоятка талласиевого меча" } \ No newline at end of file From 94d998bcd3537cbfdcbc347765b4a73acf00c9ea Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 12 Feb 2021 11:39:25 +0300 Subject: [PATCH 259/463] Removed incorrect recipe --- src/main/java/ru/betterend/blocks/complex/MetalMaterial.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index 49eddd31..ff1340f7 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -181,7 +181,6 @@ public class MetalMaterial { AnvilRecipe.Builder.create(name + "_axe_head").setInput(ingot).setInputCount(3).setOutput(axeHead).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); AnvilRecipe.Builder.create(name + "_hoe_head").setInput(ingot).setInputCount(2).setOutput(hoeHead).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); AnvilRecipe.Builder.create(name + "_sword_blade").setInput(ingot).setOutput(swordBlade).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); - AnvilRecipe.Builder.create(name + "_sword_handle").setInput(ingot).setOutput(swordHandle).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); // Tools from parts SmithingTableRecipe.create(name + "_hammer").setResult(hammer).setBase(block).setAddition(Items.STICK).build(); From 2403907b0dc42d0cde5900f3b3bc3cf3e9792a2b Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 12 Feb 2021 11:47:17 +0300 Subject: [PATCH 260/463] Metal values correction --- .../java/ru/betterend/item/material/EndArmorMaterial.java | 2 +- src/main/java/ru/betterend/recipe/AnvilRecipes.java | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/item/material/EndArmorMaterial.java b/src/main/java/ru/betterend/item/material/EndArmorMaterial.java index ef10f3a9..9916cb8d 100644 --- a/src/main/java/ru/betterend/item/material/EndArmorMaterial.java +++ b/src/main/java/ru/betterend/item/material/EndArmorMaterial.java @@ -14,7 +14,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; public enum EndArmorMaterial implements ArmorMaterial { - THALLASIUM("thallasium", 26, new int[] { 3, 6, 7, 3 }, 14, SoundEvents.ITEM_ARMOR_EQUIP_IRON, 1.0F, 0.05F, () -> { + THALLASIUM("thallasium", 17, new int[] { 1, 4, 5, 2 }, 12, SoundEvents.ITEM_ARMOR_EQUIP_IRON, 0.0F, 0.0F, () -> { return Ingredient.ofItems(EndBlocks.THALLASIUM.ingot); }), TERMINITE("terminite", 26, new int[] { 3, 6, 7, 3 }, 14, SoundEvents.ITEM_ARMOR_EQUIP_IRON, 1.0F, 0.05F, () -> { diff --git a/src/main/java/ru/betterend/recipe/AnvilRecipes.java b/src/main/java/ru/betterend/recipe/AnvilRecipes.java index 3df5e7ee..1eb4da43 100644 --- a/src/main/java/ru/betterend/recipe/AnvilRecipes.java +++ b/src/main/java/ru/betterend/recipe/AnvilRecipes.java @@ -22,36 +22,42 @@ public class AnvilRecipes { AnvilRecipe.Builder.create("aeternium_axe_head") .setInput(EndItems.AETERNIUM_INGOT) .setOutput(EndItems.AETERNIUM_AXE_HEAD) + .setAnvilLevel(3) .setToolLevel(4) .setDamage(6) .build(); AnvilRecipe.Builder.create("aeternium_pickaxe_head") .setInput(EndItems.AETERNIUM_INGOT) .setOutput(EndItems.AETERNIUM_PICKAXE_HEAD) + .setAnvilLevel(3) .setToolLevel(4) .setDamage(6) .build(); AnvilRecipe.Builder.create("aeternium_shovel_head") .setInput(EndItems.AETERNIUM_INGOT) .setOutput(EndItems.AETERNIUM_SHOVEL_HEAD) + .setAnvilLevel(3) .setToolLevel(4) .setDamage(6) .build(); AnvilRecipe.Builder.create("aeternium_hoe_head") .setInput(EndItems.AETERNIUM_INGOT) .setOutput(EndItems.AETERNIUM_HOE_HEAD) + .setAnvilLevel(3) .setToolLevel(4) .setDamage(6) .build(); AnvilRecipe.Builder.create("aeternium_hammer_head") .setInput(EndItems.AETERNIUM_INGOT) .setOutput(EndItems.AETERNIUM_HAMMER_HEAD) + .setAnvilLevel(3) .setToolLevel(4) .setDamage(6) .build(); AnvilRecipe.Builder.create("aeternium_sword_blade") .setInput(EndItems.AETERNIUM_INGOT) .setOutput(EndItems.AETERNIUM_SWORD_BLADE) + .setAnvilLevel(3) .setToolLevel(4) .setDamage(6) .build(); From dec0c7df51867c7ed84a63467d3a89989c8b3ede Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 12 Feb 2021 12:26:05 +0300 Subject: [PATCH 261/463] Aeternium anvil --- .../ru/betterend/blocks/AeterniumAnvil.java | 77 ++++++++++++++++++ .../ru/betterend/blocks/BlockProperties.java | 1 + .../java/ru/betterend/patterns/Patterns.java | 1 + .../ru/betterend/recipe/AnvilRecipes.java | 13 +-- .../ru/betterend/recipe/SmithingRecipes.java | 6 ++ .../java/ru/betterend/registry/EndBlocks.java | 2 + .../assets/betterend/lang/en_us.json | 3 +- .../assets/betterend/lang/ru_ru.json | 3 +- .../patterns/blockstate/anvil_long.json | 48 +++++++++++ .../textures/block/aeternium_anvil_back.png | Bin 0 -> 421 bytes .../textures/block/aeternium_anvil_bottom.png | Bin 0 -> 360 bytes .../textures/block/aeternium_anvil_front.png | Bin 0 -> 464 bytes .../textures/block/aeternium_anvil_panel.png | Bin 0 -> 371 bytes .../textures/block/aeternium_anvil_top_0.png | Bin 0 -> 420 bytes .../textures/block/aeternium_anvil_top_1.png | Bin 0 -> 485 bytes .../textures/block/aeternium_anvil_top_2.png | Bin 0 -> 537 bytes .../textures/block/aeternium_block.png | Bin 299 -> 277 bytes 17 files changed, 146 insertions(+), 8 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/AeterniumAnvil.java create mode 100644 src/main/resources/assets/betterend/patterns/blockstate/anvil_long.json create mode 100644 src/main/resources/assets/betterend/textures/block/aeternium_anvil_back.png create mode 100644 src/main/resources/assets/betterend/textures/block/aeternium_anvil_bottom.png create mode 100644 src/main/resources/assets/betterend/textures/block/aeternium_anvil_front.png create mode 100644 src/main/resources/assets/betterend/textures/block/aeternium_anvil_panel.png create mode 100644 src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_0.png create mode 100644 src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_1.png create mode 100644 src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_2.png diff --git a/src/main/java/ru/betterend/blocks/AeterniumAnvil.java b/src/main/java/ru/betterend/blocks/AeterniumAnvil.java new file mode 100644 index 00000000..c0268a3b --- /dev/null +++ b/src/main/java/ru/betterend/blocks/AeterniumAnvil.java @@ -0,0 +1,77 @@ +package ru.betterend.blocks; + +import java.io.Reader; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import com.google.common.collect.Maps; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.AnvilBlock; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.context.LootContext; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.IntProperty; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; +import ru.betterend.item.material.EndToolMaterial; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; +import ru.betterend.registry.EndBlocks; + +public class AeterniumAnvil extends AnvilBlock implements BlockPatterned { + public static final IntProperty DESTRUCTION = BlockProperties.DESTRUCTION_LONG; + private final int level; + + public AeterniumAnvil() { + super(FabricBlockSettings.copyOf(Blocks.ANVIL).materialColor(EndBlocks.AETERNIUM_BLOCK.getDefaultMaterialColor())); + this.level = EndToolMaterial.AETERNIUM.getMiningLevel(); + } + + @Override + protected void appendProperties(StateManager.Builder builder) { + super.appendProperties(builder); + builder.add(DESTRUCTION); + } + + public int getCraftingLevel() { + return level; + } + + @Override + public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + return Collections.singletonList(new ItemStack(this)); + } + + @Override + public String getStatesPattern(Reader data) { + Identifier blockId = Registry.BLOCK.getId(this); + return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); + } + + @Override + public String getModelPattern(String block) { + Identifier blockId = Registry.BLOCK.getId(this); + Map map = Maps.newHashMap(); + map.put("%anvil%", blockId.getPath()); + map.put("%top%", getTop(blockId, block)); + return Patterns.createJson(Patterns.BLOCK_ANVIL, map); + } + + private String getTop(Identifier blockId, String block) { + if (block.contains("item")) { + return blockId.getPath() + "_top_0"; + } + char last = block.charAt(block.length() - 1); + return blockId.getPath() + "_top_" + last; + } + + @Override + public Identifier statePatternId() { + return Patterns.STATE_ANVIL_LONG; + } +} diff --git a/src/main/java/ru/betterend/blocks/BlockProperties.java b/src/main/java/ru/betterend/blocks/BlockProperties.java index b79bf939..4fbf6cbd 100644 --- a/src/main/java/ru/betterend/blocks/BlockProperties.java +++ b/src/main/java/ru/betterend/blocks/BlockProperties.java @@ -16,6 +16,7 @@ public class BlockProperties { public static final BooleanProperty NATURAL = BooleanProperty.of("natural"); public static final BooleanProperty ACTIVE = BooleanProperty.of("active"); + public static final IntProperty DESTRUCTION_LONG = IntProperty.of("destruction", 0, 8); public static final IntProperty DESTRUCTION = IntProperty.of("destruction", 0, 2); public static final IntProperty ROTATION = IntProperty.of("rotation", 0, 3); public static final IntProperty FULLNESS = IntProperty.of("fullness", 0, 3); diff --git a/src/main/java/ru/betterend/patterns/Patterns.java b/src/main/java/ru/betterend/patterns/Patterns.java index 6c4cfbcb..9bcf7a28 100644 --- a/src/main/java/ru/betterend/patterns/Patterns.java +++ b/src/main/java/ru/betterend/patterns/Patterns.java @@ -41,6 +41,7 @@ public class Patterns { public final static Identifier STATE_COMPOSTER = BetterEnd.makeID("patterns/blockstate/composter.json"); public final static Identifier STATE_BARS = BetterEnd.makeID("patterns/blockstate/bars.json"); public final static Identifier STATE_ANVIL = BetterEnd.makeID("patterns/blockstate/anvil.json"); + public final static Identifier STATE_ANVIL_LONG = BetterEnd.makeID("patterns/blockstate/anvil_long.json"); public final static Identifier STATE_CHAIN = BetterEnd.makeID("patterns/blockstate/chain.json"); public final static Identifier STATE_CHANDELIER = BetterEnd.makeID("patterns/blockstate/chandelier.json"); public final static Identifier STATE_FURNACE = BetterEnd.makeID("patterns/blockstate/furnace.json"); diff --git a/src/main/java/ru/betterend/recipe/AnvilRecipes.java b/src/main/java/ru/betterend/recipe/AnvilRecipes.java index 1eb4da43..9509c3c9 100644 --- a/src/main/java/ru/betterend/recipe/AnvilRecipes.java +++ b/src/main/java/ru/betterend/recipe/AnvilRecipes.java @@ -1,6 +1,7 @@ package ru.betterend.recipe; import net.minecraft.item.Items; +import ru.betterend.item.material.EndToolMaterial; import ru.betterend.recipe.builders.AnvilRecipe; import ru.betterend.registry.EndItems; @@ -22,42 +23,42 @@ public class AnvilRecipes { AnvilRecipe.Builder.create("aeternium_axe_head") .setInput(EndItems.AETERNIUM_INGOT) .setOutput(EndItems.AETERNIUM_AXE_HEAD) - .setAnvilLevel(3) + .setAnvilLevel(EndToolMaterial.AETERNIUM.getDurability()) .setToolLevel(4) .setDamage(6) .build(); AnvilRecipe.Builder.create("aeternium_pickaxe_head") .setInput(EndItems.AETERNIUM_INGOT) .setOutput(EndItems.AETERNIUM_PICKAXE_HEAD) - .setAnvilLevel(3) + .setAnvilLevel(EndToolMaterial.AETERNIUM.getDurability()) .setToolLevel(4) .setDamage(6) .build(); AnvilRecipe.Builder.create("aeternium_shovel_head") .setInput(EndItems.AETERNIUM_INGOT) .setOutput(EndItems.AETERNIUM_SHOVEL_HEAD) - .setAnvilLevel(3) + .setAnvilLevel(EndToolMaterial.AETERNIUM.getDurability()) .setToolLevel(4) .setDamage(6) .build(); AnvilRecipe.Builder.create("aeternium_hoe_head") .setInput(EndItems.AETERNIUM_INGOT) .setOutput(EndItems.AETERNIUM_HOE_HEAD) - .setAnvilLevel(3) + .setAnvilLevel(EndToolMaterial.AETERNIUM.getDurability()) .setToolLevel(4) .setDamage(6) .build(); AnvilRecipe.Builder.create("aeternium_hammer_head") .setInput(EndItems.AETERNIUM_INGOT) .setOutput(EndItems.AETERNIUM_HAMMER_HEAD) - .setAnvilLevel(3) + .setAnvilLevel(EndToolMaterial.AETERNIUM.getDurability()) .setToolLevel(4) .setDamage(6) .build(); AnvilRecipe.Builder.create("aeternium_sword_blade") .setInput(EndItems.AETERNIUM_INGOT) .setOutput(EndItems.AETERNIUM_SWORD_BLADE) - .setAnvilLevel(3) + .setAnvilLevel(EndToolMaterial.AETERNIUM.getDurability()) .setToolLevel(4) .setDamage(6) .build(); diff --git a/src/main/java/ru/betterend/recipe/SmithingRecipes.java b/src/main/java/ru/betterend/recipe/SmithingRecipes.java index b1d951a2..eeac8bc4 100644 --- a/src/main/java/ru/betterend/recipe/SmithingRecipes.java +++ b/src/main/java/ru/betterend/recipe/SmithingRecipes.java @@ -77,5 +77,11 @@ public class SmithingRecipes { .setBase(EndBlocks.THALLASIUM.anvil) .setAddition(EndBlocks.TERMINITE.block) .build(); + + SmithingTableRecipe.create("terminite_anvil_updrade") + .setResult(EndBlocks.AETERNIUM_ANVIL) + .setBase(EndBlocks.TERMINITE.anvil) + .setAddition(EndBlocks.AETERNIUM_BLOCK) + .build(); } } diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 58dbc930..fcec5f5b 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -7,6 +7,7 @@ import net.minecraft.item.BlockItem; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; import ru.betterend.BetterEnd; +import ru.betterend.blocks.AeterniumAnvil; import ru.betterend.blocks.AeterniumBlock; import ru.betterend.blocks.AmberBlock; import ru.betterend.blocks.AncientEmeraldIceBlock; @@ -322,6 +323,7 @@ public class EndBlocks { public static final Block END_STONE_SMELTER = registerBlock("end_stone_smelter", new EndStoneSmelter()); public static final Block ETERNAL_PEDESTAL = registerBlock("eternal_pedestal", new EternalPedestal()); public static final Block INFUSION_PEDESTAL = registerBlock("infusion_pedestal", new InfusionPedestal()); + public static final Block AETERNIUM_ANVIL = registerBlock("aeternium_anvil", new AeterniumAnvil()); // Technical public static final Block END_PORTAL_BLOCK = registerBlockNI("end_portal_block", new EndPortalBlock()); diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 1d96ca76..8c95e3c0 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -675,5 +675,6 @@ "item.betterend.thallasium_pickaxe_head": "Thallasium Pickaxe Head", "item.betterend.thallasium_shovel_head": "Thallasium Shovel Head", "item.betterend.thallasium_sword_blade": "Thallasium Sword Blade", - "item.betterend.thallasium_sword_handle": "Thallasium Sword Handle" + "item.betterend.thallasium_sword_handle": "Thallasium Sword Handle", + "block.betterend.aeternium_anvil": "Aeternium Anvil" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index b28cc4db..8645338b 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -695,5 +695,6 @@ "item.betterend.thallasium_pickaxe_head": "Навершие талласиевой кирки", "item.betterend.thallasium_shovel_head": "Навершие талласиевой лопаты", "item.betterend.thallasium_sword_blade": "Лезвие талласиевого меча", - "item.betterend.thallasium_sword_handle": "Рукоятка талласиевого меча" + "item.betterend.thallasium_sword_handle": "Рукоятка талласиевого меча", + "block.betterend.aeternium_anvil": "Этериевая наковальня" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/blockstate/anvil_long.json b/src/main/resources/assets/betterend/patterns/blockstate/anvil_long.json new file mode 100644 index 00000000..485d07d2 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/blockstate/anvil_long.json @@ -0,0 +1,48 @@ +{ + "variants": { + "destruction=0,facing=east": { "model": "betterend:pattern/%block%/%block%_0", "y": 270 }, + "destruction=0,facing=north": { "model": "betterend:pattern/%block%/%block%_0", "y": 180 }, + "destruction=0,facing=south": { "model": "betterend:pattern/%block%/%block%_0" }, + "destruction=0,facing=west": { "model": "betterend:pattern/%block%/%block%_0", "y": 90 }, + + "destruction=1,facing=east": { "model": "betterend:pattern/%block%/%block%_0", "y": 270 }, + "destruction=1,facing=north": { "model": "betterend:pattern/%block%/%block%_0", "y": 180 }, + "destruction=1,facing=south": { "model": "betterend:pattern/%block%/%block%_0" }, + "destruction=1,facing=west": { "model": "betterend:pattern/%block%/%block%_0", "y": 90 }, + + "destruction=2,facing=east": { "model": "betterend:pattern/%block%/%block%_0", "y": 270 }, + "destruction=2,facing=north": { "model": "betterend:pattern/%block%/%block%_0", "y": 180 }, + "destruction=2,facing=south": { "model": "betterend:pattern/%block%/%block%_0" }, + "destruction=2,facing=west": { "model": "betterend:pattern/%block%/%block%_0", "y": 90 }, + + "destruction=3,facing=east": { "model": "betterend:pattern/%block%/%block%_1", "y": 270 }, + "destruction=3,facing=north": { "model": "betterend:pattern/%block%/%block%_1", "y": 180 }, + "destruction=3,facing=south": { "model": "betterend:pattern/%block%/%block%_1" }, + "destruction=3,facing=west": { "model": "betterend:pattern/%block%/%block%_1", "y": 90 }, + + "destruction=4,facing=east": { "model": "betterend:pattern/%block%/%block%_1", "y": 270 }, + "destruction=4,facing=north": { "model": "betterend:pattern/%block%/%block%_1", "y": 180 }, + "destruction=4,facing=south": { "model": "betterend:pattern/%block%/%block%_1" }, + "destruction=4,facing=west": { "model": "betterend:pattern/%block%/%block%_1", "y": 90 }, + + "destruction=5,facing=east": { "model": "betterend:pattern/%block%/%block%_1", "y": 270 }, + "destruction=5,facing=north": { "model": "betterend:pattern/%block%/%block%_1", "y": 180 }, + "destruction=5,facing=south": { "model": "betterend:pattern/%block%/%block%_1" }, + "destruction=5,facing=west": { "model": "betterend:pattern/%block%/%block%_1", "y": 90 }, + + "destruction=6,facing=east": { "model": "betterend:pattern/%block%/%block%_2", "y": 270 }, + "destruction=6,facing=north": { "model": "betterend:pattern/%block%/%block%_2", "y": 180 }, + "destruction=6,facing=south": { "model": "betterend:pattern/%block%/%block%_2" }, + "destruction=6,facing=west": { "model": "betterend:pattern/%block%/%block%_2", "y": 90 }, + + "destruction=7,facing=east": { "model": "betterend:pattern/%block%/%block%_2", "y": 270 }, + "destruction=7,facing=north": { "model": "betterend:pattern/%block%/%block%_2", "y": 180 }, + "destruction=7,facing=south": { "model": "betterend:pattern/%block%/%block%_2" }, + "destruction=7,facing=west": { "model": "betterend:pattern/%block%/%block%_2", "y": 90 }, + + "destruction=8,facing=east": { "model": "betterend:pattern/%block%/%block%_2", "y": 270 }, + "destruction=8,facing=north": { "model": "betterend:pattern/%block%/%block%_2", "y": 180 }, + "destruction=8,facing=south": { "model": "betterend:pattern/%block%/%block%_2" }, + "destruction=8,facing=west": { "model": "betterend:pattern/%block%/%block%_2", "y": 90 } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_back.png b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_back.png new file mode 100644 index 0000000000000000000000000000000000000000..d1a6ad61c5e1f1df924693c43754d2fd400ddda8 GIT binary patch literal 421 zcmV;W0b2fvP)L&UMJkT=L-c#N zxOD1QsM0UsB3K8ZT?(2ab|{6kkhIHnXcO|9{sGVS?mO>r-o5u|%pf8dcQ>N<`b@Sq zSp>b;XVP^Tw>w%;OUx5)&(1l?=NAgJoDNUbs!~hLlMKt`rCukMO*0w{0Z3)jJbyH~ zFBD>;F@XT1!H|Y{n9dJ;gJYU6vls%5-o%b=}?h|mM#W@(9OZOa1tM&FVr`1a?uA6 zI`j=(3hff8sba(=kOY!uiG$7UjfrH`Gu`{$?+@pk3x8coc{skkE>zDa@Aq0os^=5W z7YaZ}25&B}nAmo!!OC@*%@3H&H-t$RrKkf_a63Q6pW9dIW=JL)Nf_6{Y6fy8Q6NN*!3O|S zy-U7ze{Vt44U#Z!OzXODHLPYJ53H=GB5f2yLkme59|SM^P zE7xIkVKD`=kyTq6d~ZRX!Qm^PkBf3WGNB0r*sUFfe^Fm%19uEXYb7ZF00000WbcEP)1unNfU?>t6j^ixhP9=lBD< z6gs&$wn#@6x(K=mbt%>qF+&vEKx!1?a7|2Fv3}Ei-`zcT?|a`#>2fKMZ3lm8foTz6 zC)*Bw&mtw;4o5q?Y!(Vr0d1>8-dK;um1>m~fTF8hHX3A2bF|dQ?Yp?|0|2!7S={#l z&A>yg*8w;#76AkxjM`J114)hYX5gV(FYqk#aK{kIx`G)_*JOTk(3kek-E(648B?RLqUCbf%m zJ{~)XJu?$`8-=E468Ud3{saIl=2mh0Z-CGo%J>%`JWO^_%sY5gH zP;_;|Ko~PIT`mQu8(UljpKK4lcc7@;{vzO85o`m!RW4nn57|0000bq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_panel.png b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_panel.png new file mode 100644 index 0000000000000000000000000000000000000000..4dbd58f4075fea57ca5ee4fcb41aca1ecfba78a5 GIT binary patch literal 371 zcmV-(0gV2MP)7vlZ&B0ZtY`Tab_>24zPD0Ti zASg)ZLY6?gWH3@lAT1LH4 zA@S?G2C!EquTRflYNLA#gdbLp?k!+yb8lU7cX6)54vHe{_c$4i7*7tlwJZRR%^|kq zDDimmhV3{!JUuE--JrmiXsLSUxd5!ArRuc}y`rxL03?wliKH@jjIIhvB8eE7^%2S_ z#Lz8;beg2i0p+0eDhA+r86beRp_6@jzmKq9#mcw~jR8OLlFQ8+8&DfzKTEfUj}51n zdH`ZzlFr>~fbc_Ro{J0ubgJtt%rXc_B3XHZ?N>e;=EZu-f+h|iox2+U0^hAbgh3fp RjF|uc002ovPDHLkV1h{;n%V#W literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_0.png b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_0.png new file mode 100644 index 0000000000000000000000000000000000000000..287f800af5dc183a340e477b7d79c6741e0ecd5f GIT binary patch literal 420 zcmV;V0bBlwP)zq#g8IX}2>uZg z9zAxo!@LaFEHuzy4rWtW2X$<7rtj(d-tT>%=Xsx(PaqJ7PY<3r8sp}3#DzE-;|@%I zd%CdBC87n7*EdvDH5NcKb?S{qC>H{7^EoQ2%4@4dp;Q7OC8wELj(?8EK^&8GlmXx^ zlc3|xv8@S1!-!QC4l6Bxkw&{HEj0LvLbH*$uD;0jN$F zNOG2YVL87$F!vh)!2X$rjN98pfaBsB=U3&BnwjP7H^Q2!tX!-VN!xhB0ODwjX6pXE z{?P-V+1F`%4kJv%q$13`@Xe#10Wd9zQ)in z{ANcvU6MphOl))lh0+Nxh=9xUY7?;BLev8xc*)$|deH*0sBAO^zw;jf+lo><)ojiH O0000RVJIw@=H!|9{$I+EP9>f?1~NH~>_IBxzOUH1rvH z{&E1@viP{Q#k=k`nw;TwIE?nhb>n4#QG6S9U|SYurNXW-om*oc|Ko%{+N2kg@C70 zb)9d2Tl6{|B=?Fx5BK=S+Sp_!#6%omHTQ-iL?Ga>T#WRQ=g(yzOfKZ@&2aXBxNgi{ bn*7d>hrE^n1p=7b00000NkvXXu0mjfk%HjK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_2.png b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_2.png new file mode 100644 index 0000000000000000000000000000000000000000..b490b9abe94c37d302d79d73f67f1af4069f8868 GIT binary patch literal 537 zcmV+!0_OdRP)~sTNmH$Js#ipeIMSF7>L_1 zUj$LNjjyE`7g4v3f7s-F|3K>3CWjmH$-6u&KIik!4o8g!Q?s)y=W+m4%4O`s<~7lY z!Nk{6bcEnzr2>F(U1EyNuagtrZ)`A~&5pR57%u3BfpA^Y=`^QnkN6Z^U|SZdrV&%* zZ~=gVX;O0>0P<3VgsQR?bm@8BaDnAq4%@O=SzYD9kDsLCNjgIO`^+gh@I&Q|l1^RXirg^o>nRkqEU8b|y@D*=F2uK!sGE&=Kt=Xf3EMo?Qzs-P`J3o z*Yh*%$ZvM5)e(r3!vZlyCZVdlzLy1jTJ;96ibVi=UYFX3&1?PAU=m+@5)4C%&SXZw b4ZiaqXmt00000NkvXXu0mjfc*6uT literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/aeternium_block.png b/src/main/resources/assets/betterend/textures/block/aeternium_block.png index 413d165944d50d9a4f581910f4fdb55103d69eda..9ead52cd46f2bb48daf9819b15ec3c74e63dca2b 100644 GIT binary patch delta 260 zcmZ3@G?i(BWIZzj1A~Sxe=v|@EDmyaVpw-h<|UA$72p%%3Z&W9l>}@pc%ALpqk`C@ zLiOA0e50cyb21`xa#E{GQmd+RJDR61UF!F(3}g~tNswPK!+&HD?sZ!PC{yq0;us<^ z)wGY1?|=da^K%6Uoqzv#XV;dRwHL`888<6urY zEb=^Ys!&bqg11>aXGrErrU@3)-aJ0AKRNt?{nXosUQSz^#U*iDF<|Dq+lQEFKt!M-P>t<}=rUlz4A)YvS2jJ+qFgIjOb4JM#l7(8A5T-G@yGywqY^=iZb delta 283 zcmV+$0p$Lb0;>X$8Gi-<001BJ|6u?C0P;yhK~#9!g_11}!axv(aVQebfI(t01cAmh zK|nPLqBv9q1_2k~2t8-X+wzsy-E9!Boy^XB^Rqjdo(}D7w{7*$tLW9mnY~=J6B*~a zZr@GwSJ&5LU zC`Wd-10YmpULOg7_BQ}@x+Hs`L&UzaBQW1s`v9^#$R**YGm0c5c)QH1B;QSE--ZBv zyeivw097SkVlsj!a|e4mcCCE} hGF Date: Fri, 12 Feb 2021 12:32:49 +0300 Subject: [PATCH 262/463] Armor recipes --- .../java/ru/betterend/blocks/complex/MetalMaterial.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index ff1340f7..cba55195 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -191,6 +191,12 @@ public class MetalMaterial { SmithingTableRecipe.create(name + "_sword").setResult(sword).setBase(swordBlade).setAddition(swordHandle).build(); SmithingTableRecipe.create(name + "_shovel").setResult(shovel).setBase(shovelHead).setAddition(Items.STICK).build(); + // Armor crafting + GridRecipe.make(name + "_helmet", helmet).setShape("###", "# #").addMaterial('#', ingot).setGroup("end_metal_helmets").build(); + GridRecipe.make(name + "_chestplate", chestplate).setShape("# #", "###", "###").addMaterial('#', ingot).setGroup("end_metal_chestplates").build(); + GridRecipe.make(name + "_leggings", leggings).setShape("###", "# #", "# #").addMaterial('#', ingot).setGroup("end_metal_leggings").build(); + GridRecipe.make(name + "_boots", boots).setShape("# #", "# #").addMaterial('#', ingot).setGroup("end_metal_boots").build(); + TagHelper.addTag(BlockTags.ANVIL, anvil); } } \ No newline at end of file From 2315e97b9a6434fc574689e2299ddd9b80a0e4f0 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 12 Feb 2021 14:41:14 +0300 Subject: [PATCH 263/463] Flavolite textures update --- .../materialmaps/block/flavolite_runed.json | 3 +++ .../betterend/textures/block/flavolite.png | Bin 656 -> 285 bytes .../textures/block/flavolite_bricks.png | Bin 611 -> 279 bytes .../block/flavolite_lantern_bottom.png | Bin 361 -> 222 bytes .../textures/block/flavolite_lantern_side.png | Bin 482 -> 231 bytes .../textures/block/flavolite_lantern_top.png | Bin 343 -> 221 bytes .../textures/block/flavolite_pillar_side.png | Bin 606 -> 278 bytes .../textures/block/flavolite_pillar_top.png | Bin 614 -> 266 bytes .../textures/block/flavolite_polished.png | Bin 590 -> 267 bytes .../textures/block/flavolite_runed_1.png | Bin 734 -> 311 bytes .../textures/block/flavolite_runed_2.png | Bin 741 -> 308 bytes .../textures/block/flavolite_runed_3.png | Bin 717 -> 310 bytes .../textures/block/flavolite_runed_4.png | Bin 731 -> 312 bytes .../textures/block/flavolite_runed_5.png | Bin 733 -> 312 bytes .../textures/block/flavolite_runed_6.png | Bin 724 -> 310 bytes .../textures/block/flavolite_runed_7.png | Bin 727 -> 309 bytes .../textures/block/flavolite_runed_8.png | Bin 723 -> 307 bytes .../textures/block/flavolite_runed_9.png | Bin 734 -> 308 bytes .../block/flavolite_runed_active_1.png | Bin 719 -> 2046 bytes .../block/flavolite_runed_active_2.png | Bin 724 -> 2071 bytes .../block/flavolite_runed_active_3.png | Bin 702 -> 2069 bytes .../block/flavolite_runed_active_4.png | Bin 721 -> 2068 bytes .../block/flavolite_runed_active_5.png | Bin 720 -> 2080 bytes .../block/flavolite_runed_active_6.png | Bin 703 -> 2060 bytes .../block/flavolite_runed_active_7.png | Bin 711 -> 2069 bytes .../block/flavolite_runed_active_8.png | Bin 704 -> 2063 bytes .../block/flavolite_runed_active_9.png | Bin 717 -> 2066 bytes .../textures/block/flavolite_tiles.png | Bin 606 -> 277 bytes 28 files changed, 3 insertions(+) create mode 100644 src/main/resources/assets/betterend/materialmaps/block/flavolite_runed.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/flavolite_runed.json b/src/main/resources/assets/betterend/materialmaps/block/flavolite_runed.json new file mode 100644 index 00000000..5d23c84f --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/flavolite_runed.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_purple" +} diff --git a/src/main/resources/assets/betterend/textures/block/flavolite.png b/src/main/resources/assets/betterend/textures/block/flavolite.png index 07fb6d59bd45efc5259cb1ee3394f4758269a412..9d4126e46a07af184ec7cb2ad88a3d620772da65 100644 GIT binary patch delta 269 zcmbQhI+tmJWIZzj1A~Sxe=v|@EDmyaVpw-h<|UA$65tc!3Z##$EX$`M=+KrP9KL8i(G=^|9$sE1qn+KXuQm9Eq@drvrDbRrc3xn;@)F zyk^p@=f;e3D;M2&P0D&4{X)L#>*t1qUBV*H_a7L9>6bm{nsV~mtep1Drt z!Nxa*ywUQV5<#C{`Zwq&$H#Z*uH5Wl@%2{54zG7c?^rf|kKOy5-_?Olvg9v|D$s2V No~~?uF6*2UngH2eekuR} delta 642 zcmV-|0)73R0+0oe8Gi-<001BJ|6u?C0#`{yK~#9!Wm9WYQc)DW|GE$L2b^S(5)((n z84v_6n2(xN2vZWX5F9QSF5OFr$os8M4LPmO-p)~}4`nP)50L?QuIyoN( zc^@X#ZT!C6LG5%AqkjW$L0|WyuX&;L^)&&GU{s3WDic6Q^P`mu z!#Z9>D<6d(w;>;!#gCIElv6JBte6P;MkICP##EtvKb%MF+>1*ArU!IMYXbMIIL{PJ z+keUHp`r45Er0D1H0GfY7aEj_0#G&rP!M`Z01lE|cnCZ+BA~?dPU+;l%=63J7Yr_^ zmN=WFKp?rNnFdqMt+Aj=GwVT552EzRfn@mE6j*}joCfVF302$Hg6N#DLbiP zn}5tyJM(ktPr))f-8VIrD`;d^p!{kiaUt3^D2ASh6@Ov=|CTN*8yaCWv#abGWm4VZ zo*M^q%=cd9*c1ht>0DMtVz+YvHX0jA+nZsP2}GB~QD&2^qrD7B_f!EIyW|50N29W( zNU7*^;XeC=aoYNHHF|uO-PNn4YsH@&PMg=_a{paj{aLxad=26bW(Ax^7D5(E2gH|_Hm+W+k?-oc ze8a67p$88M-sFGQV&tQdu;{|x@^xoid9|y$b{zbCctWV}3ddjB8goB*`mJgRIzPiJ z=0WBAX-qTp!;jbcTON)3_-pgllt3P%8CsKGTI~#Z$)4lMCM9AR8U}O~gQu&X%Q~lo FCIDE$bI&0^J(VKe&^E~68 zF}5sAtyL){-1F~7D9tOz#No6jlt>}>``y>|r}Og`*`~j(Wq+D;(26G%b0L-LDIqaN z-StYZ^IVZ9rF6p~=V^3rR9cKmxiBHv#f>FLA5)rq41R7^cN-K_N|o-?6qW8-i{0jP zTj=?85|p+O#!`xqdd{gWWHFdWaAUePSzIX@wSxPS5}}NB_KL^!n-o2lDyKLn&p88z zTIbrTA70Og-G3BQ*ITUxBV_4U>*NP}bC;%|v@v##3Hau@2-R^Z8_F(65Eh(^r|sji z;B^uHl5@%_oR511)t~meKcJ3R@Ii)iCm}d>Pv3FKIa_P-03@xoch#{LXs@-#5iwY$ z;Z@+uzikOKaX5BHHfC#y(VwL>jB_nn4DIdpMH@8iw||en1a>@9T_z9S&YeqomdYTe zlu6dc(V-(IloXp*fWQC-z>qNomx5Q_ja1#zn$Ue+0I5lBv0JDO>ZoKu%!MGWl{`sp zf;&QjoIE8IY_Vx*3*9JT+H9@`aF`Tel5TDvI=g|-O7hyQXdR*Hhr2IV3+DLo{y~`) zx?lZhK~7fk!HwYpu3BjuE{9p^)fz_RO7zU?VK~Yuf-v3x{Py(s7nniZ|2BSK+Vyuu j%i$dW%aBzmIgXcqrkHW&!uVZB00000NkvXXu0mjfuT>z| diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_lantern_bottom.png b/src/main/resources/assets/betterend/textures/block/flavolite_lantern_bottom.png index 3d4de1a14520d909126c7e46cfc46153b71bd966..bf85781c8fdc440f15aa6ac964679b25cd6b75b0 100644 GIT binary patch delta 205 zcmaFKbdPa@WIZzj1A~Sxe=v|@EDmyaVpw-h<|UA$65tc!3Z##$EU<>%a+XyT%?aifcy&Ls1lxo4)M08oBY%HINf zJeYXC*~i;$4X=U0VG17<|>BnCa#+6=pHQK zyuJjdG=)}SG8*uBt@ExIhszk)8~knSb1>CWG_*0edr5{w0^Y+q2-3H*xNGNlX9}8I zBXG;pXl}<~7vpjORp8|jb~T}rf?rGHRG$^FdG@zH}s1n@GfvQmO?q(x{211E<-fbNCPrI}&>PGv@Z3tv}d7ZY4`aMbp(7Gr?)5Gm}G r65p=WE(N@D5)E~n=hFY+e?F#9)9M>f`8PL800000NkvXXu0mjfCyu0$ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_lantern_side.png b/src/main/resources/assets/betterend/textures/block/flavolite_lantern_side.png index eec16dfebb975112284fcaf01be8706b2be72145..5808a0c36c5dfb4d71b825536b2aa6cbbf22ddfe 100644 GIT binary patch delta 214 zcmaFF{G4%uWIZzj1A~Sxe=v|@EDmyaVpw-h<|UA$65tc!3Z##$EBv8=AG;8kWPtYq0c-kJISnOVj; zr~fP^YlxzV7-MvMb;hmkJ87Cms%B8X*I|c8=Mw=~ngHJ~^?wVlDl&zEN0KB_5Ck+D zjmVgtqcGyJL%`Pej;9kit!rK}SE*1akZs$f>$)KDeP58tvP@6S1~Rg#0bU>O=-cj* zqA28fo{$13$8m(sFboRAFuw+jA{IrQGfAe!+NL0Z1gybln}#t}xiZgk10ecLoTa){ zqi*Ysxv>P)1%KH~6_evXh|)_+Z*~q&MG$C4b{qx)fb87xjqP25s%SbXkwS$yU`(-Cq*B=w6d%vc{7HOl)WswM z6`6sHVq%Z`fPMD%j<+%NSrBsGX}<{Uq-9B0stYUhHL%9|_yalY>kwyhTMPgI002ov JPDHLkV1fwV)+7J` diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_lantern_top.png b/src/main/resources/assets/betterend/textures/block/flavolite_lantern_top.png index 07df994d8b073d9658afc0f191150a879d91ee2b..1ba17928ee29fd032156f2f456b0109a6ac86443 100644 GIT binary patch delta 204 zcmcc4beD00WIZzj1A~Sxe=v|@EDmyaVpw-h<|UA$65tc!3Z##$E0J`DrNVGEi>nnbj9KPc#2r z9#3{azyBm}p0wx_W@(a9-e%!9Ps&ax|HP`U!?8SfJ;$$O*$(sN7J2XZQ=D!p{c7T8 zPPsc*9zOGQ;Joqrr>Q^R^upPze0_g#+4hzGKm3PLjg$3V#f1|>Ku0lny85}Sb4q9e E0Nbu}lK=n! delta 592 zcmV-W0cyn{RxwyW6|K`Q*9R=@+IOkM^!GCLASH{IOFYCIb6t&Vy zX+|cOVy)F$5f?J1oO4>2wXjk$^C4?p;WJK`bpaz+R*;A>l2mj$PADLRbZ$y90jtc$ z)D3p3vTZ*IDMfL)Fd{k}4#Ze?-l2L7p>CQ=E9_$Mz*crsQgrL;Ln4mqr7%vmt|1+l zoSVIKg|X=86n_I4#@#Pia&8@WKN(yS!4TGemPstj#8?qR=&D(kSyy@-9}5&}g%$Nf zh)M`*y8#$fYnraAjFd`A-nQ-OI6{P!GN-JKRR~BaMobn$0$gitOalS)G!;>M?*ZOy z`jir?!#sxv2GW*FIN}H%gtjE8>xUH1%7L*>TNwk9r+>pA{AG-#=xIFcal{FW#50cj zb=so|AZyzmdf+jq^G`{stD2m1bZ&xo%Ms?F8#`D6Lt+9A1_rIb?HN(bCu-UrZ`}Bw zJzN3?79Rp*T#9pPM1&Z-wv)P+XciNqwszA$1(7iZnE+4AjZ}W>|wk}HT3xV z2f{@Hyh%hv0d53V*A`kRPZ&OU>-*t!gy8i3+XE>~3c3TzN}M~LGlIis^eF|$I0HAp e7{@bjj(-7A?_+Mz;>()=0000Z(&1PM8(b23?+xR4_H;)G9~z#uhpG-o3-af$IWuZ-aFw99c<6` r9=cyp^vkAb?_$k4VMWV7`R_9q&0+2AoNKcJ=nw`^S3j3^P6{02}to^$CJ=(6{=6NoJ=(?_H8bm4OVb1o0 zQhJC&%0J5w!djc%{ZO9IxX9BrA)OFX=^(vNYHLj})PB_L>VI}u3c;>#KKH;~I_kX_LYu%d10cfj zUi2Q40*NaVgoCmy;h;I1;VOusrcZ-lv;G%PXLi%m5r4RuXDPrq3YTYsx=)uMrTlVu zfc-2>k-4vZyF(t4rfE1FC&^!1rnV~9tJ}%(nf60JnzXJg(xfVKGzBu_S?@_0hG+`# zhTrH3Xhm&%8TbgTYg?j9&KYBr9^k%!Tq*eZ>{;~q0&65ijkMO_!1;sGqY1bjdPI6Y z_WNG)6j3&#$3Eo!D86B{k>Q$Z&2O7D2&0D@pxPm m1(xsw(f9p*-#G9@HU0zfLs2150#{f70000*?YcA~7|z zKU&CHk;kc)F?{#`zhaNxy3f35sLt70ocq5!H@Mw$fy>uzqJa!A&lIpuwoxmZ%cvx$ zXtl{6b2!SHq$Z}zzhCQ9tem|1wKFj(Q9d*OHT?8j sDO*y0_uiMvPyIz=cMr++{<|z5u#k11cqK$kFhy85}Sb4q9e0KFk@CIA2c delta 576 zcmV-G0>Ax>0?q`G8Gix*005AYXf^-<0u@O_K~#9!B~r_7+b|F$#pOfP!*LrF{r|t| zwTA*ta_Xf8n#8dsiloFxhqVO^D4DanGdsLozB%WJsMeZu21+UK=kEWHbACsX^3Th6 ziZQN#e<^J{L2kJ)R*9rC!*YG!W9*07*i%k>NuH?t`Shb}C4W`VI14_I)Pn4Olz5cm zI7$J=&0V5ti2S&`;*0HVn+N*bx{x#ii*xH9U!~I8wtsz5SDagNP9^6UHmwx|cgwPj z^I6*|`XzW!uBd%PC$!B>V0Y1bcm+M>9+q(&5sF%x-^c`7{-=tJZnc&_l%p41e z?$hV5qB*PUa)k^Oq}%W3=a(l$8cRV(ME!g|Z`+1f_yM%m0+AioTB(1A0%A9E)ZNbj O0000~kT-y<}zB}^h z;_M@<%TI2oJ-4;x%I@ylhbBKhHT%`2#h-4i`EYyVyF1(7-raMwEQA}VO|T@$FPPy! z8W0e5SO}Dy>gnPbA~99BkCCtbumTUWcSPe2wO9Y+tuN~eG0JwneZ8{EZ*REhdUfH- zb5`5i4o-7nOeyqd-W8&><#hw=mSti^)5Eh;wgTe~DWM4fvx10< delta 721 zcmV;?0xtcx0^S9X8Gi-<001BJ|6u?C0;NerK~#7F1;I^=TtyUs;kQnms{7qNBbmUc z|71{@fTM8{MkEXIFNy?2<3`;mh)Y34C0PlgF*Y;Zef!p}FP}&2?#H^$Gpb6hm7FuR zR-ALxTFE&hB8Uja7>o!Q1FGD=_!%wh%AddfgtZPtNMQjAB7cfiM+h@HWt?xZuA!6+ zC9!?@7BBz!1+BGWt>fbIZDL3mQ>aylF`(_heD{iy60YsA>hR+QasP_0?HT$3jWLo_ z;xq?xTBxNWzQ?r_;(PjyVL9%IA>g|+v@V$GfBe*VX+l-e5CYD(G``{P{y$>QIPY-Hz}58)r{jV9{c8^MfuSF$r4Z&jy3Ll9 z5~`|LYZ*6Zq?}RbQT2E=eEG#^%*)KxyVrQ(go-izwR000000NkvXXu0mjf DI=xtx diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_2.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_2.png index 6e6ccb14736f8b197afdd44b8b888abbe13683b0..3d1e53e16ce4a3e2be6ddcb121dcf441ac069898 100644 GIT binary patch delta 292 zcmaFLx`k~kT-y<}zB}^h z;_M@<%TI2oJ-4;x%I@ylhbBKhHT%`2#h-4i`EYyVyF1(7-raMwEQA}VO|T@$FPPy! z8W0e5SO}DyP&&@ z*Vkqis01?1w0V7Mfw!iUI(N>3(yeOcS5Ni5XkNRR|HBk!?HBL2GAv;{wcIXjhIq%N z)YplBSigQ~v5rWX-cY-uO~-fr4f{B`L;MG3&TKkdt-4krVZNxBdg!tencJl@b7hOq gR<5tCzh!$r?JVbMtwopK0Nuyn>FVdQ&MBb@0M7o2h5!Hn delta 728 zcmV;}0w?{n0_6pe8Gi-<001BJ|6u?C0<1|yK~#7F1;I^=TtyUs;kT+z)&1_CkxXFJ zAK^;DASA)45f>x65r3X8gJcoRO5C^*mqHK?$x0B7v6<=a+qZ6=s`7cH?tZT8JR>61 zTFE(6YsGs{t(BZJ)>^E!7-KNjf-xY%&5K`=vabC3+b=lh!GBsbE4HL{Qjw-

    r1Sudx#N;rqvk z_dK}znxCG2hkq%N4?g*VAD=$PN#LWauMjs=jb&LD1OVW4I^aW#Sc9fSUT3mKvMPt& zKa`Tu<;Y?8H{EznKTU`T5@W=NmL@b@-~7k>_dcfS2YfTI#+evbZuYNv=iT?%oLx|J zCeGJ%n=Pt}hzQO(#?2X;GZI>S7zkp}q{MZBQfd2Xl z;)z-c_a0u+Z7(V5#GU&OnfE(1B}6<ylyGvaShDk$;GZJ-K9L z{_783zW5#QJ*tYemgC{T`S}~nrx{hnIfo{tA9_@klo9|T1pWsVxnQQ||L^Dk0000< KMNUMnLSTYB$7Xf_ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_3.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_3.png index 5e27f92915ed1d43082cec7f36774022bfdcb2cf..60573b690c797a24b844c631bfb9cf4957f79521 100644 GIT binary patch delta 294 zcmX@hx{YaqWIZzj1A~Sxe=v|@EDmyaVpw-h<|UA09N-h;3Z!QgTP>~kT-y<}zB}^h z;_M@<%TI2oJ-4;x%I@ylhbBKhHT%`2#h-4i`EYyVyF1(7-raMwEQA}VO|T@$FPPy! z8W0e5SO}Dy;_2cTA~99hkCCtbhyq9O9TzXv-~Y4Mzq{sgfJyhQpx2L}ZR$*g_pD|H zA5ojhVx+yj+oSO)OSx>4<5|5M7gmH#V_7hNrsDS;(GT}#K3sS463Ys^hjNN5A0K+N zxIy5rx{BqKg&j6Wyk^M?OE-p3$u!z|Y{v(|Tm3pt$FrAC5Ni0cV$~ke)hE_&Ze1&X ix%k(d?dN~0?h@G8Gi-<001BJ|6u?C0+dNaK~#7F1;M+H97Pm>;lECus=m+eB9A2l zPeXtuA~qy|XX6DNvjIW~5=4lE5Fk4OA!N)lJ2Tx~cfL>C;}0#aE2>IsjZzA&HJo#_ z)+nVQB8Uja7>o!Q1FAf|{t2xy^2aYfVyy!aa@c{2h+@?d!hcH11?PLL>!`Ir&D=cy zfH%MYjJDRW)^U9CAt_{xskA1f6wrQRJ-wyojOz!iI{bVjo!>I_BhxscDJ4qIY-^z8 zomLy-M_j)keq=lt_Uj`l1pIJ|wjHw^sU#W=?YfSf1Kar>qMniy4*2$~S2#alY9QxI zi~*~jk3ankwSOzk2>ZUH007%|!TBEV2U6H5IUypHoC*7ih>-Uym&d;u<~zn^K~>QZ z0?zkzzT@=tFW-Irfb))*_g@gVC${T_>-rxC!{PQwD}}J07!Eh&oKaQ9TFZR6C6|Ia zkE+M3;j(Y6>j`S3A7^S#bi+h9E(i@{3~G!ar+|pi^?wts7OYx|oiIi?+#V@0@clOr zsB^r${~T`(0IfAtL;&G>enR?%X&Pyw)U@OKffP3SXs zX}QB%W#1z?UwL@-CEj-!V^GtGF;Q!ymO|WDN~?qr(Chh(??(K%5Y{s(MM8{p4Mc=) zn8_tlTYn{`gjJ>0LTeQfL8o~J5vY}tA|HKnPYN4ignm9S+`OQsjnlh7S!7j8+OYMYQWtKO*G{Ze+QAjsVVg%*z359evlMtu+qMUN9{;#F)q_ za5%n?sH2tyVsWmacA=jZtZBr!llC*E7IgjVH#y$C{uSpOIcG$K>*d1T-FvLtO3oQ; mEjeYzX(Z=NN(lh(J^ushq-J~kT-y<}zB}^h z;_M@<%TI2oJ-4;x%I@ylhbBKhHT%`2#h-4i`EYyVyF1(7-raMwEQA}VO|T@$FPPy! z8W0e5SO}Dy=IP=XA~99fkCCtbhyqX4*Jaa`ZvKz2-eD>@b=!fjFA6=Y97}Cyo+!Sy z)6yqrlIsGmt;;)$0(A;r3vlPTxj0vr#6*cXY`N#3Jlo?8N0=02q)5s9i)kj_vf^Q{ zvuvZEyB}z=?OEZx=F@q-y%TQS=L*{rufKb*9^cGJC7FBLhawxlzL@?@)$2)Fj^g#Q kFH*%l)qTHPtN$?iT;`nNeBk8-pc@%HUHx3vIVCg!0KkZf!2kdN delta 718 zcmV;<0x|u#0^0?U8Gi-<001BJ|6u?C0-{MoK~#7F1;I^=TtyUs;kQnms{7qNBbmUc ze?$fhF=8-+;KHrH&7B*A3khc7LR^VUK}024DK6re^mO;Vw{Cs;Jf^<>sc!R(s#0qu z=S-~?=Nz?Ga?XedB7!jnBLc>NDt9k_LCd!B*Ka>#tpgEKSbu?nh+@?d!c0yX=Uc36 zC?!Kl?C-zB%RhfbYpq!8xVnCq7!t-5Y87G(Xge?;UQtrQwH;O+e!L$;)<0Lya1`4;axVpzy2A|m9J217Raz1gM-|+04uNeA)2alc*<^$bsPf7_@ zRjjp)y9-jzsPm|Lyc(W;`!(}AbMyW~yz`V?aBWA^Pk#s%V+?AHA;o}*(6j@!WUN}U z9RS174~*jlYAxy1rIN{K5Uefl{uEU0f7#}R<}@Gq(D z*fj&HiW+O#wv}PJ#9HOOhfj!M<@wVu@xH+rgPO|Cqff{=5!aP%oyoNjLO{;PBfjbJ z{lvB$34hC(^XUyKMpBB1dJ=|G3fr<^RiRdDEr5oFh@d5BR1CF5`u#m>&Xl;JO^f;-$!Bmq)5U!RaK2%jc3A6Z zn-;CLvb%T9Fzwm4NQ!~o)!T?VN{%2F=PGI^+DBo+n##7V#Pvun8J++6gO@LU$2mtz z2@&CZI&pdV7V|QbQo>qGiiv*cNhuLy1i*XG|H0B%i}n7GD*ylh07*qoM6N<$g7@)R AkpKVy diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_5.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_5.png index e97c2d77fe6e17bfd37562691c4caf3a72d2e6bb..2fd2ff41cd443595c3a7caaa981b836e9bbdb9f1 100644 GIT binary patch delta 296 zcmcc1x`SzgWIZzj1A~Sxe=v|@EDmyaVpw-h<|UA09N-h;3Z!QgTP>~kT-y<}zB}^h z;_M@<%TI2oJ-4;x%I@ylhbBKhHT%`2#h-4i`EYyVyF1(7-raMwEQA}VO|T@$FPPy! z8W0e5SO}Dy=IP=XA~99BkDITaMUlfHJR5?rZBY91(6(eBGnapQEVV kx90bZWSe4}{HkO837wo9MRxmm1Kr5r>FVdQ&MBb@0Mem`?EnA( delta 720 zcmV;>0x$iz0^J3W8Gi-<001BJ|6u?C0;EYqK~#7F1;IUU9Yqv?;djoQnf<=kMzJLW z|HKl31PF2wDFrRR4v8j+0wO3V5EY_CLI|Ry0#O8G?CZO`v-8FCXubKVZu5+)QfnpW zOsy5?9JN+*&WH#if-wdo0>*$Ucdvdy%eL|7Z$D$L0})bKfq#OCV$~7COimf+TdZp+ zB|}N<&)?zo%U{u2E7m&BF5V@EgfWF$g%|_c4$QZ2C@JCE4yz77o)Hgk=-Qs4AJ7;h zIVF}kkkd*n74bc;oem4 z-(gB1rNZT-Cx7G^*o;T*Of|x~t|$P&vfSf*i}xKdEaVgs5pqg|btdJ+cDP1F=*Cm} zX+l-e5CYD(G``{X?q7cV{yUs^JbCsR+j7TpyyrOo$BVDNVCV-PKE5K%w{*KbDJ4`@ zvDPx~PDnYU&ZFw_YIyPWbLMsC^1To6&Qo&1wH-}AA%9eiF{m+y6aykc(+)iR@QUH| zoNPP5F!TfCc*5gPp5ogc-%WUH0I0R1A_54TXJ0a`01y_u%NzS7zO}t zZ~h^*9lK^gRZ(Lt+qN=Hr&z0e^ZavCidc1c-(ZYEO=SszQYx44f5f)Vi0000~kT-y<}zB}^h z;_M@<%TI2oJ-4;x%I@ylhbBKhHT%`2#h-4i`EYyVyF1(7-raMwEQA}VO|T@$FPPy! z8W0e5SO}Dy;_2cTA~99BkCCtbr~-$xtNGNRlke(p#c%UxIwBr@OD;6c?!T<=-G^6q zo26I(nZUy&D4EXL(sh!-U+hN1Oa@a;&%E;23;C}Jx*yoM#<=DtLlA?D{NCALy~9dd zFCH)DHMMV8vD;LTwd_PZ(@UA>ldrs<#8S_Y+NUD&Z*P#Kf_|aTgkS&w delta 711 zcmV;&0yzD)0@MYN8Gi-<001BJ|6u?C0-H%hK~#7F1;I;;Bt;Z}(JyY?h|J2YtnQZS zfmZ*C8xh>N5m#>gaiR-n;{yhKY;+?o1re2*l_D~>{m81UjEu+i9A|ew+O{mHDrQEl z6*D7*fSFNiMMMx0oO3u4a1K;?eDO2dwv9i3{R!^_h)~iBG=D@CuYr^nYN>?S<3mSl z6dmJtCe+KQ2>DR`ACR8Dvpvfbz7+3vu=rX{*TrwWj%4c z`-k2BieZ{iRV1ZEh&|(Y;Cw!kYej=6bR+3>&*}aZkMk|Z<%ko9wMJSVFej8!P*ufy z&;D>psTB&M(B5R!-QZs=YLS=93>}2gsva4R`KdF34mi9 zMrx^uI5Y&}ZX$XIfSI8p0tl!15$Px1|L`N4AE_m=E%)SfMq|e~jsQH|{Y&Y09J&!z zMV4a8w$JJ002 zv8F`HnSW9;qLG55StI8SuL@?EHADm*_j?e5)~I>oo%cQ%aoirT)&QJpw$fG3Bgc5(T@|}8QZp!*Fc%tD!TmrJ1<}SMhJmY3L?Vkc;xEp tHJ0;2DFyF6B^QQqpp-(+8Gslg{{s-rb2F-W)HMJA002ovPDHLkV1kiPRwMub diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_7.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_7.png index 8dc86dc9e9af8ff5de4a727e8a4353020c6ecef7..6f7024cbbd3f3f20fbd9238720810738ffcd1b31 100644 GIT binary patch delta 293 zcmcc4x|L~yWIZzj1A~Sxe=v|@EDmyaVpw-h<|UA09N-h;3Z!QgTP>~kT-y<}zB}^h z;_M@<%TI2oJ-4;x%I@ylhbBKhHT%`2#h-4i`EYyVyF1(7-raMwEQA}VO|T@$FPPy! z8W0e5SO}Dy?CIhdA~99BkCCtbhyn-8?W~15+8_U~e|yPVC{WGlX7c-0w|?&qseHrX zGJkpgtOH6jS&X!&%Zsi|GCUZ{EB7EI_PXhpt1L<;y@tg^fns&_O@SI*VH gc=PSI|8C{#hwtIMaP=8W9ngUcp00i_>zopr0L)H?s{jB1 delta 714 zcmV;*0yX`$0@nqQ8Gi-<001BJ|6u?C0-i}kK~#7F1;I;;Ttygw;kUl}s?M!X_l%|k zqy7>D!fXs~LN-~r@(;QQNZg2PgWyIGQAt1$L?$|!?mm|~b@O>ly?l#YQ zP!fm7AM^H)U(i}B);f+ipAbXBm_n^Wi~(&2=7&2AP&#Pc0p+cWe78e=4< z#4-nRTB)TXzQ?sA;(PkNVV&-YA>g|!w62)(NFh?GXwx*L6j;vxBI^16+n1su9+8MF0Sn<-!(bR17Iba*E^>2wP&FFO-rA>%`^$AHo_? zRa6xXA>e#V;~O4M|MBVVQ<{FjcYC(w#4=r&=Jyy3`>P{0XTtnIw?B|lLRA%OExY{{ zDQDETI6vUk@amhdnb(;opWV{-J4%W)-9Xci2o+-tVtLp+p z`hlNb|A2FzrW^3xh_?oSS}Q6dfH0j;NIP=ajTGBba>O}DN)g|9u0K2i@NoZ*)OPHf z0aZnewQSo8qFAd;(}mOBpFFvJit`QqF!JohS1ilI<#MLv%(l+tS_mN^)A@{VdVD{! zEoZ_qF@Ig&6T?DE5m8UVQc7W47OX1NO05MEL5JNAM4%LM+_28mv^}*HZoha=cetU% zg>4Hg%bAW5Rfp9U5kX7Ns2FOA^oK{(oGEcbn-=vwk|%II~kT-y<}zB}^h z;_M@<%TI2oJ-4;x%I@ylhbBKhHT%`2#h-4i`EYyVyF1(7-raMwEQA}VO|T@$FPPy! z8W0e5SO}Dy=;`7ZA~99BkCCtbr~;4E^4nLK%y$3Jw7**?Y-q>*up-Oo^W`TWT@+re z*=5SJO@&Kga<$Zj#Ucymvh8fR7WMwG&0Z@WrKr8fh%v?e6Cm*A-QzwMHq0 z)*8+^T5FV25D`QKV+=+Fi~&_1UjB;K82S76U$EAJ2s!LPMSn!G>Ih+_{%|C24{XbYWqpUiaJ)X#N+GQG9F8Y)&Zw$lt>x-? zO)iC>e*7NiJWhpqo>})5YQuLORxD3H`IK&$5E{l9)PER5P5}|2>qlBGShX~9fMFa) zN-l^P)H(cN!dnACYYi0}_+Wx0^T8`O6=-{HHSX*#hiGo@r|Da3uHv`Pp8S>_qv4ftUqZZlz9 zST65KVSgj%gs3NDskIWf4XX;R(ON}B(DCXDM4(nmidg6A`hiv}Pd5oJh@iC;R1B>qhSMWjDby6vu1EcVlm*k zIGu!{jJ1}WGQ&8Kb0(z(fcKvN0V4)!NDzguR{#J207*qoM6N<$g4ifgX#fBK diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_9.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_9.png index 35acb53863ba18f79815f0524e8ef5fa379dc405..c445645c638e3a4b2f31168aa94069c65c05f34b 100644 GIT binary patch delta 292 zcmcb|x`k~kT-y<}zB}^h z;_M@<%TI2oJ-4;x%I@ylhbBKhHT%`2#h-4i`EYyVyF1(7-raMwEQA}VO|T@$FPPy! z8W0e5SO}Dy>_<{>J)V|xl^SM4hlFNht_>bWKkCq!vOn+CL zEtTUb;vn|jXu(pUg|X~+99py%l}7I^N_ShlsGsrOVb>D4{$#?r*rV>{P-7>3g#(?|EL6 gvz2QrZI7Go*Vg6C_NuqI0dyaOr>mdKI;Vst01w!SXaE2J delta 721 zcmV;?0xtcu0^S9X8Gi-<001BJ|6u?C0;NerK~#7F1;I~?97Pzw;a|P=R&`JJ_Ux`? z0#Uz)7vmusA}E59oFw@96apd$>p?u|NjwT7D#^(ZB*w{Z&-8Tt_jyd)|J>rTpsKXi zD5cO^!#PK5jZz9Cf{0*@!H9q{pvukDU(p&PfB*gq);bU&hkq5Qh$vPaAuN-U%=zuNc=p$CXlo5?9lJYklS0OrN^3$&0qsYY>zCA=as39X4u7^I%`e&X1LH8F zDJ4qIoR&bzE3G!f54e6p{J^j^tj9em1pMX#Z7XKlQAso!+I1Z{2Tt=VL_I%TeS`Q0N`{w5W|9sA*V!%3nk2im|2zswHCs9 zoP@84&8v7?njSgzS@&&fHX zs*1Iiv+V`B6x4ZCJwJW-gn6EM=iR%sTIu_dniJh-q<rs48l#CB~I;y2M&#T_ZUk3CBHt*fNY0Y8qExe@U&4yZ0Ut*M-t5Aq4a| z&-iY@4}TM3nMo-UVkCtVVlAScTq3nqQc74=S}n9z5fOAeI|C7@m69SKeEb`Hr(` zi?xov>(SO4+go=Sr*mRVG-6yy>rANyU0(djv!{RH zoFnIqh;Td{xV(IW<+PA<##&2GnPD8rIg?TXzE00000NkvXXu0mjf DjhR|| diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_1.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_1.png index 804be8bb5a10550cf11b14a11e15531fd7ef425f..15759ee2ec3cb61be867871841ae680de9c45470 100644 GIT binary patch literal 2046 zcmbVNeN5D57%xn4qDK6jGKO858>qd0+;{avygLQrodnO}*A{#2dv^_Y?RhQSfm7$0 zsPk*$Vt_H6Om~t+U8W{u)1b0MT%ruWhMO~Si5kT*{Kw6ieY`!6i!RI=o3wq~{+{Rg zJh( zU2rW{7CYuMoD|ToyyOO&NFWH&2r@G-5@fkDprCHx6+{d6>(^}(PskLArmXGR$4AOI8=jRgFn%tS0$%r67i>T3c+V-Tgxg5|3L(Z!Bp z)GCDls@E8Bj?&Sn(X62iq?y)DM`@BW5~Pu!v^YsIq=C_z(fEPEXd&Lil-TCRW5Fj2 z=2Mg)LlEI`SQFN2q>z`O%w{t|(gaQ85P{2;qQXXSQO+LlU;{E25`u~#iKyz4bxY-n z1%picQwRhTZbdm>CRi{c!UhRSL#ipofIOGL1=lq^wwg_lv4#Mv zNFkRb`3Hn59-xd`t*S64G^bP$c_}RCK4JrGtO6_;P0|!j(oi)Qsb%y!hSpDm3zF=I zIwW53R6Y)+Xcwhpw0cHscnk`=hG!M_f5AM*c%)E(g*giW)(eQB=*7@PB^j&amqIWw zWT%a>a5$JkQC3)y1BEsV2GiCE0?(Lu+Nk9y6V8(qz*$P?!QFbj5$DWW)@U-(CX-P& zU~iMSa#h>`dmh@eZc48=b2M%+(ZWHbSJgsK|uQ%%W0s93Z0d6kV|IB{W zEvI$`Qy|DtugdtQSO`|eSAGGFH3GwOYJ*!aPE{5_2K}#vK`QWc8T8wSeE>Rrg53Qu zS@I}hHU#p$uv$;kQN(}om)VLZvwu4M24g=+2RQxNGKmJ@aJ;F@#9W0BiOCE^=sE=F?#ns(=MW_6dZ8`fmDBk~Nul^7Id0!8wHd;s z37OH(lohO^F_z>m2h?NUJDLZoW48!C%?O+qWM& z*^RxMnrD|TuXTDauf0EUO=n))$*h_k=~vgkw5y~zqv_Am&w75jKcixj(Kvb0_{hbE zk|Q5{8u)3;x-G$))NzNri;iz?u1jaeD{cDT`a|4_l})2(zBcTI=8UlE%_-|9dhbry zQ@XKfY0;j&_sZt)zP#UdZFNhY*7ZeSR(*6|ZWq#2*R!{@=npaD%)VY7-+ul;a`C3s zZ9R=c-@Y@YIQee-(4AcyzvVXXGK`Ay-N%04eW&;Pu1f!D=eDf+wAmYubkv3)*e{$e zzkj2;{czuV{E#t?x2w-P^?gio(&o%54bgMYd7D-_rXJn!sS{kwHUghLs_vxm4z1gCdr9V{`6piAjX3+(*Y3PD zWNF9LFBh(fw)S@11S`+F{w}>5I6Lju(gwukzA)nBlDy2He_Jnp^WBxYdhX!%$Y}Od zN}2CwO6v{Uvh}T5(R(AdO*+L)PhXyXYiRep1rJi(c3;bjqdxMS=yP8mIVX4djP5Ln lT!y5sXuf+usGoNwFZ;~c>J_=Q>(oDVq1|aaIA_H>{{X8z#^V40 delta 706 zcmV;z0zLiy56=aV8Gi-<001BJ|6u?C0+vZcK~#9!J(IhRBt;NKPew*&y}D<5hnW>Z z8VoE9z5pK=8zCVKgv$?M;^1TP2MFPS0I`gAB_1n;1U*bYsw*oaD=~T?ylX@#Zrl^D z-hWl+aYR+AwNgr<)=CKBe=Q=22+ld22sj6-?4EyzF7wRqKYxCW_Ys_6Q-TFV1h0XV zCQ2!U5b;eztwycJ<&C^@*SfGPy9?J>e45hMIQg6 zYkP)%Ky%KN**NVo<&>!>kNAkj4c4WxNT{%2;my1=K5bk{6Prc%+SX|QaZwhu_@ ziJ!iOc%^*!D}Va=8)!A^`*(!TZgHZ_pWLDS46ZUw6T)Ln#}o4|<3w1Bu{;#&k})&J zmj`NHu$(yldCz>zcvVytO(~(;(za{%+r&@`UKJlYrgxr^4vBGlf@vZ)EzFRP2fEs0 zW~i#-#j{#(DBTI~74ZQd9Oa8!WKQt*PmeJ#gr*}70e?ruIfppsD0v1Eny#bP1recW z12|&S(yx2G22ZEk$*ILp40687@NPBf&(|Kyn)OUZwCZlaznzjRA_pqg?WBtnJ zd;{k_$tL>7;RVbxRwkC?j`qtpX`Dme`-Nu!nciKHQbLaVJu$X~^}xLBC}!9^ zlR2^!!+(ilO+7c8AuDih!97~lVYLEvIByggDIb4JKFx@8%pZM^zr2Q$IezdB zHE0wh#`A!s6jU8mX8M~A%UoHuBib~C&g0`Av}1@Dxcx-v0;|mmAC$If&%bbS{VJ>V zB`Fp1oVXZn@T!zz;2}gqhnDWk diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_2.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_2.png index 76a658a4f418e69e573977fb62790a498b9b6fec..1a31a28205fe8cd7cb754ce72f02dfdc1d6d8c44 100644 GIT binary patch literal 2071 zcmbVN3ry5@7_X?j6cq$Thq0+s0qym1FRpkh-XWY?LAa@Gx>(xYQQ_L7E!>^D&ABB; zBoiIzd?dyQbHT^hrY`d|IyE}8MbvGY;Wi&}x)~osoR5jw{ymP1F6fL++Wy=AzVG{e z-|zc>T~RnQFCl(-JOn`rj(mF&xDV3K*eGzVTU}-Xw>WQpi2_0W25V<8Xv3yd24Fmto6!6)xr7f@no<2M;2!z*&(wMjEHRHoi>A zUnKLzi)K36Mdhr8LncjxC-^Dgz{9Hy?DtfN3gx#VA-@z@Yp*c`4nfp%E0UuHgy+(Q zuuYPA*r+q1EMXvFvqeXka0_V|50f}y#&9!6=uw=Ya1*7sz~KV{(PYj=71^hTV}U0t zQl_e23d4LppU$V(NwOOwEEWrflNd>&0D&q2QDyw7sEq3NVCNN97QCt;iLmC8DV3^J zD*~8yrQq>K+=@!LOrT(xpYdXZ4%bo&0Xa5;^H#|fq2L^g@fEy>7gYsdi3rwPCaIEA zCOyM-RNpmU2n5hXFYY9>&dMUeS%fkxEiFsX~%L zV8BivVnNfCLsV2oWO;|(ih#6rg1}KOJxP*!jzI|n&!P-#aG|A4sS(v1a3f>U^Bhi? zy6x=}TcwHHZO;LFf*^1XcX23Z(3?>fHyBWcAhJ*<%V06PSf1fs5&HsJ0Go@ccxgY{ zmeaa|$`=%%S0KD8iuua$szQK6jX*K1*5Foz)s*EqB>Y|ad3p4j)$fiKBETwJz{5#2nPnHZwwgK5*HOB(FI zs)fEiF^Rh2V7zI|$Xo>vk;%-9z_kqKZm%z+WeDo^x5J*}OkeFOnl7Hl2aRwfXB3SL z4!O}7y`lQ_^efRN*Px%SIS))WTWtdh;qycK)Ew32kz07K^Ycdft#1=MN|M$D(i@BTgQGiV z^l5HAb01n<`@!fvWZT1(Exz*fLqYV$w&a@nUzP>m*cV0J^$NM=wfDAN+Wo`c&-_7W z!Mz1zPKg@_<2$ELJ3b(5Slq=H^kV$wl(Ch+L*(AJNxz!c-M@Tu$JU**jU8v$sOvB} zvf;+Q14FVN3}3r+PfR7&9N(PfF1=cCr+?gs3v2bo!Mg94+N-%K?#iJVHKX6Z@Ls@? z`r38YKX_&T*Xt8ImfuSIW5vMO>zlK&fk#r`bk^7p!^-A$-!ujTv1{v6#$mcKtAd%R zayWrrvLq&L`1(ypiN6y2_syH!$FlQ8;#Y?<=SQDAChgcw`#V~)3g|~Wc9})2=||nE z$K?%e;_(Z=?VUYefAr@~`Hz;5N0O#BoHevBo7Kb^|1@uG&1h|*k7us!J+ZDnd&1(@ z2bM<5E1zT!JT@#=9DfV``0^K9Z=TrD*zaiUy!!p7n5(ny4E<+GT3dB;L+ID-$en55 JHD$rFe*xvw(6|5q delta 711 zcmV;&0yzDb5Yz>b8Gi-<001BJ|6u?C0-H%hK~#7F1;H_HBt;Z};lEzJs_vd1du(H` z5XeYK9Dqx31TsKcB62Q5L_|cuMMzd45g;uBR_g#EAy!~xk7wLn^{O7<7yRypm*Wvt z#ocMG;qIiAaCcg3hzKG=2!S91A%H3muYX2+Dg61%55$-u2!FP$&_P6qnpoF`)*2~g z;xOQDxEs4??{M?#CF<_Pn7Mj(O+7Z4z%62RB@Q!c|I#s19+4awb{Ev+KTP9>c{8K6 zR(ds#`$}62;VDAMq;!VV4O2{%@<6>`nJ-UJtAx!Z-7Aix!!S^5Wx2mY`bhrzLnJEg z`5)+a?-SkdPk&yKzP%=hQoj6^I4!uqvMdMyz|-EJtQOpzaT@8pFlAkRu$!@O-o@SV&)-nOLhqe*U6I3nPs$Uz*;1bN zG&8IeN`E`jn-N5@7;tx*84@G7 zT5cH`h%q8*Kt#~q8Zib4h56!~UYzc?=%DB%#QXp{vCTVVzmlfJ_H2u)G7cl^?wnq} z&Gux+x;AQAIi0VFsQ{9+%$T<`$|vRyLxxff|;Ad zVKnGAjGB6`hmI&l%yc-NIyclfWz)nN18x(ek$nfH(FL8c$@RYP?s=d0 z=Xt;P*3HYG6+3+Fa0EeOb93zT;XO{jUK#@bKm5pJg12aY&LR~-MkMH06jB>XM35I- zMQ4##1zAYo0~&`0eO^grgI27MmxXKnF@d3d5Us?DW$F&mBF8+` zCMy6{$bFYBDmT4_Uy1PxU*s& zP4lw^5eNhf0mdLJ#RO%sSO}6PXc~tITrHP0E{IF&!~q67Pd<5q&RlI%91)cz2-~*DTLM#=*`aQBHs~-6Y z)REVZIe?{gI3hjp2Y16GVCX$mK4sG5^x*fb+cr%i92rz%pq@vzr0{=iFurr${4%rvt`?Ge(XB0^HLsYQWwu z^QF4D1NH*6Pd8bNz@6sCT`mUTG-pi5T|C3%0%;aV7n9Cgn27ycMTCco^FB9^e&qD7 zU~@zj>Qx>-6brzL@X9NqeT~3!yx!nejMtR~0v3KO4pM<<%b=e&-~o{IDRTG2RN1Ws zI0a-D!)iTCM-fkoU**c49{scFH(2z8bl`JFA1*HM;iO^!XC{H^`4IYa>6eE1uWEho z9+^Y~a5&!dWn`|xO=L0y2~sO??gr~89YT<(o?LsTbIK`DQ?T(TGOp@YdegO|xw~Q= zW8$11`6&L6bg=8l(83u>?=5MVje2a&9g{X}yRiE;^DRUCmaElm%)R38VlH2NH+yT= z#vVQ4p|AQOfdh_SId-keze;rCDvR5Wn9P8QCQoEGc8t6*wD(lKGdH;jg=`&5U zzQ3?tJbcPkl@z~c{X30$@tG-aO#U-@!m>}7uU}Z(U3oOxvCo>=NW1E49u{?uSkn}j z5I^JF+o|Uctf*W0TSj|o@MdVnP^Pn_Q!1JIwPQ2Yy6A9*a&h!DLk!)JeScMKdu8Db zp>cEfoy^7S>XEqm#usu6?{`X3qk5X!N51*Rxw5Jj zjys(?<(up|y|w1eJ7=E0Qn0IiCs#dffhz_1|vmZGuEC$zK!j51l z>37prhuD$aU|W^4@6zcp^ynoY@6U75(SL_#@$@!2>g>U5vBap8)#t}u7;h@5?5-J> zo;*>m9FmuM5^XpluVv2rLQ7Z2R?Y2fX{!$%Z`mII^4kdqez>E5xO21e?Yn0#tNa&1 Cc-J2Q delta 689 zcmV;i0#5yv5WWSF8Gi-<001BJ|6u?C0)@76$hN#`xm_X z>vt?7NGbFDo0pWuktRe*l&N6($h>@{QpqWka-ut(DDww)!=A(bfR$3H#hI^#x~#AX z!VzoFkg{jco^|<5SysCH8`4&g{T(d|L12B~<6f9Q{YQ!&ei1TG{_$JXI#M{=8r3&M zjqQiGm@b6EvVSZn08N-LGwWqTeV}}5M027Q+?}${L^QmtTt9wboi~yhW`?cnO17R} zk39V|bNKlc$&C2!J@a&Bo+hU0j3hXIH4-$|>509JxI1QMq-2b{TWZ&llA$T1Nw_X6 z^KwC?G4y-d>U85kKlW$@B7%tsbt_0`^m!zrp{g|5p?{IMIiB#carosGnhd^wAd5pl zM4+k)2-Eq3c0FA`Ad-m1$$5ZH*>y+yVMorH>G3nuWg<|_43m^tePQ1Vg5X~8x{!W) zPH!(5L{Ng_g@_=$u`V0?XsqjsUe9N`ZXh2IZ1qfa$G44EomL%DqoG6u)g9dlA`OX# zs$z$61b-7GIW1k;UcX^`a=aPcIFfF^r1`@2@n7ckks)PLCurB9s#vQPGa+wyN5r?IpglAD%Z<}(<aF>_-y8cl3&j;#>hLmTNyB1<#0d(+DU8r-ae~H8wBC$F4irZ7aW1;hmK})& zpDbvZqDVA``Tc&KU#}B=Zj3OS%@|H%B&mf6tsE2-CZHAMgfR~`AhSMRQg~57RF8~P ztWYc{WICFHM~b=?Qwjq)Hj0xfeC6Tb9E*W+-~oanLo5-+N@b!V z%4OnXTt`1Y5&)LgZjZ(omy5>}4IwL8l`xG+LB>VPj-UjvLLiG3J{DwELYfI`HWF?1 z0Y(vh4pA&06RKd0GGeu=!lWXL*75=;`sLRjvH> zj*mj^BFDRek3tF3K^SPgihcwNyM|*F=6}H)OS?p$hk-fs9>xtYNpPb`w34({EEjz+ zFl46>v#{IgTtQYCfd#oX3kuWL@jORU1~Wwh64&ZYETeTf4Q6dBZXmRj6L3a~buomI z7_+yDY=tWBm^}yW4UE}nFmkvS2OOov&Ct~8q!=x1=~SH28%(K`bId;9$HUFVls~f{ zb<3$;LFe!?)GHX-6sv$YvMT41a3jzRt2Vd=WmRPXhelrW<5b}3G8lF1F9Xo&6XYI+ z$)Zc~Gd_^%hShqSj=~L>08;|`s9r%pwBgJLQ7{LwT%*0SNA55Jtqtami zRW1DOp-D6bhvQ9MM&~Mgh)!l8K-WGvcN?-dY|>~Z{FQ6VbS(PbUU+WDk9ho%PwpqR z?B;F?{*GD23vP8z@PC)qbu~x{^ZL8qKblcoo0szGk>sBf!@ROH4SU-e(?G6!u9)S6gRie_SYBJY$-HNnYTBtTVB&B!n zcbA-Pp!)TbGH%{G)D+s#cw^~EY5O1b+}y!}JH160&~HMmY2F^iyX#cC_cL<7d&ZZ^3~@)HyGE zc=={>Wa7esmVI^Js_h5j>B-v<&szJdAu#)*3_AnX7-&b z?YbLTy~MSGn~nGMErSgud5N)Ymi+0uckd(^yLK+T#NVIQR5Eqn-TAw&9j={pe6jGH zp=wUm+^*z)WXso=w;tqQ%rC8)Q9b9+CR)*5PoJ?mzU_@_;~Mq9otw4N*1l|g^}oUw B)o1_! delta 708 zcmV;#0z3Vb5YYvY8Gi-<001BJ|6u?C0+>leK~#7F1;NXX+(ZV8x1;Kqv?aDdMJN15%K}kW5dv?Q&fX-{S3y zXKF4imrPv~Y!1gBZ4YpHWblD4-?5!8O!0u`jN3iJEMpkj_dTU#mbbTf8z^T-uuAy) zV?;Z=6{I!z@_#4l$yi+@*h*7a*A)ezIhON6Fi*E#QBH=nf;C62m68+n-jlX7Zq1B0 zJBI5CRYg-u1nuc%&*`6q>ANR*Rrul+>t!LG6Z7T5?wd~-`pEk98R_m!Jnku_psI@Z z%5J=(3<2*I@c|zk_4^NzEy1V1p{kfQLKx|H0RfzIh<|gAk~c(z7zfN6B0|+3aCCiS z+>dw>)GHy51n&SaGgL$XxLi(1Jks?MoX2v;KKqNZ7GjL_aRA_M{*T%ThvPM>iaPJv zYGN7%FOK=EpDDL6eEWn>-=lX9!I(dPPU{v-S5j?M_kffVa=E{!i;?ayvemaFyW`Ss zX|>R5!GDR;5L!$mPRQVJzJM!;2s-U{IC0<_)fW6d&^ef&J|o5h{^}vk7Pj*}%l3xB z22>T%h=`!AR=jtZC8nDj+GezJi;jXu#djwN1N-TSoD<#9F&*}J4a7d8X2#*+W2XHT zITf<59Qt?h5-7D`UI<+wFfv?!ggDspLSFBwtv#ait3P=8;&(y_lu{58F6T4H<2Ca# qQ%b>mPsxRG8Y!iaa|WR6I{pVAX;sj+ZQ!{80000E*%u{3pb97oI18cQ(}KmHJPluT2z-i6~v8#KqA+1+<{f6w#$ zp6BKPLat{;9>m<(=Diy6~pjpmtn^^DTg*1e$7 z^xMa|bCq027D)>M9mNP9Ru>A00IkuCpAZr$x|mfU59{N23w*U@Hwu^G;g2X}wU9y(O^f+WR>#$_hjO)iiIEon&)QDh&7R5+3nIz0m_<%t)iSd#-w)Ai; z@MM7t6-6WwBp3|pf`m?xd~b*#OHcGQeUHtXL>0 zf?Oy(#C7EJ0|7v39gawhUbzGUkr1+yRtC}t7o=CT>@F8sB!`uSQi*2M$^gv-H5-vk zl~_s&@&}<9?#A>aVIooN0VwDihEk~i1v5116{G+Ka^?b*k3~e@2SbrclBt4U zkU(I-j_6|HaFBLhRw$lk?KTSx($;YtL+S}ak0+ZAS`T5Sv;?a+Xw4ootMwXC){7bl z55?j=_BMeoRmJVGXMjEJ#VHyy8nrm82UcdiM{Dv>m=-siym}+BHkz;=`^gdqHW%f8 zVn6DZQ@eu9;AEgzd3aN}*pl$d&p};{KvJ~Y;1-xxm1P+?{F>{f0*{wLx7%PL3!FYe z?rxYYc$FX}u_-=Kt;gvoU67|5rcvF{=xe6X4lbPj#YYEKV_`UX@G@9r>c3X-&@rPMCN0uB%W1HJg zE{VUmV19Gny4Im*kG@MF+XwBb54InOdhT>cGrJ(AvAXZ6##4c_$=MzI7p-iDHZ%Hr zk6qol0;~Am*SYEZ zb?c}Ep3g68ZJXCOeTKn#;LoP$I^6$Rt&VTIk{GxAOL23{Tfg3JU%$sOs&i5G;Kfa? zBfo9fZx}SQ#=3Hh4;tII!nxCu+vqy}+Lh`%rl#+TGUwjRqo;llJ949xB4h>EoLgmj zbNC>l>e=aQ8)rp*dTn^_U8i!Ye~o@NnjcjWnqJN9E<5(Oc1FV8iu#Vgj-t`Q-7n|o z_gQmw#g@jWI^rv*EL*qy8a(M@%b^X!u6HKo-(Kjnk105JHfe5A_Q}t;i7x9>`-orY zQHSGSkF!_p`g;GWxb#m>tj~0gyRcnwZMhRPxaMaL9(!W-)})!u>k8hP`o8DTlnd6Z zc~u+qY0Qv5&8~B2+$&mcB^IOB+5!C=^Ut)^uTHv^K4H2A&+f5}L>zvXm~Eyf(_!kBDjbvFx{LTlOl^R+H}IfB3i0XWWZA XJZ{+UYfJJx>Ob6`mTlWQv7qu_*;C!s delta 707 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 delta 691 zcmV;k0!;mn5WoeH8Gi-<001BJ|6u?C0*6UNK~#7F1;M$FoJACX(XVdZs(8NK;#D^M)IQ|G7yU}vPEFY!60Vo?tiK6a*o==PnPBxRmIGxwPI$35HK@p zt%wLBf^!Zh0?vUd&+mUlTS|QV<7d2&fKZkM7|to)N47L$wSS^9q9IZ#K;d}ziVuJP zj+zD&(Sl1N=z<(Uebs^+HCqkCSYc$h~OMt z=O=W3B)<8FwjQV#!@s?w)Jl8(k>S?EwDG*$Q$k>W>`_(JdC!(t#z~MM%*!+R{6r`_ zdjAETM&zzzZjaPF(TN?y;@R?+#>J3hSsix2{(6hwsU)YeF(FV92x_!>l=I&yv0lTixi!1*l6t>qTAdwPN$3g zjCYr+rLMU&D+)%26FtBf5+sP$=`!pgiD4^%igxCJ9j2ArUAiZ)r1$bmv{GFMI)J7!0G!6zH) zQ&ow^uwXD~44RCh?8OMH)r#RHMv?}IFeudll?fRFO7Z}M11PM_ODZo05RH-Xh?S}h zg^~8BAV^W#fD$PaEEpDIB#bcPT1sIc$3}5drR)zo=U5E*fdB%k00az%X%8jB!AT_|d96-*;ikU`OkyIKNRF;K)xnFYC3FwA5v8;Q=50i%kt zTNM2RLKO{!jO65K!lWb97V-g33@RzNtN{*21vZq#Ny31WP&GGhqSMSYnKlC&INlF+ zi5y>EeLIvO-GrGo<1|U#28CV2F)H)FV2-8BMOk2A&b+{Q0VV~!C=#tCog?~189Ij1 znZi-HT(mQws7!zbPKOPJX&ZT-qb;n*Ty9DC7(C^GFmM*L)xZ$YGLsgTVXag;Zb=_l z?-1EaP27R?99$1PCK6aUtAQd2%0PL{z+j~)!a#846h(T>xQUDUpC|Khb20w==FzsC z))jOt|Ir}!17>h96sn|^~uKS&4OXY`TcvOXr@1#o6!sFn|=O_zRYu>YzS z{&veG8i2#`rkT;X3Lm1A83Z7;4Ck)9c~p%~H{_brk>#HD<+|bm`Bdh}?uK8tk1r^h z{^`Tctj<41S!17cQxjGX`(=6=sxO(aD)#Tx)v?BdhbgLU!<6HBTd$Vxdfu~UPTG~l z=XPKF>-c*6Q})9v?H76;JtFk>4QtJwy!gP1Z5{2t6Gwi&-u3O3KX2%}XBaVW)nlV4 zW^cbfxBkQ7xlQuL%w=nX7c!ia*&5_)dy=sCsI!fnm-1R!^??Ib{Dn8_uQ5%BVmdv) zcb@cB)VPapcEy~|{NX+4)EmOs2ihtwkG|M?rf`2@+Udzi*j&bAMOp)TK+Aok;wOabV}ng_p;- zW6d|m79FdqiZi|R#M|5}^C!7y`Qn%KBo-{fbVts&oKUvD`nso!|DrLJQUA$1ea&+w z<*gzmUt?p9W67$rWc{wk^~E?&R+YY**7?6^Gg{gw7C{kAj5;&&fR8k%n2 zc(!kE?^jcnt#M3P{31Rk<-5M*&pQgYEWOb_dtb%Ur1?_tnELl+s4G6AF{98)|#|ue$1jr zQtLBTKljkVJ)yXU`i_Zye#YiE(b?xWUhToB%{v*#x5Tt|XPlm;{k5IBg^t$jr)&QO DskF_` delta 704 zcmV;x0zdtd5X}XU8Gi-<001BJ|6u?C0+dNaK~#9!J(Ep}WK|S|zkANP??0<5o2o*Z zR&fE&U4t`MAUbj2zy*o81;I^-6Qx1HmTt5W#J0)m%B+0(?z?{us_dA>B;X4otls=k z*LlXwsI`)Frq+u0{;d}gL(?JqZGXTCX$e3@L{asGWg+K` z_buidG6_hWUq9x>@4sNRR#Y3VuHPlj83w3Dh%w-skvZ5zkz&A!BgMdS z`!Bs8>Bj*x!$Js{b#&c^!|RnXXVeUB2I9?3T^G{2vj6xeHjf7&u`F-sWg?}7nHeg| zw7DSl0aZiPqu)ItFDG^%J*E1Eb}}-7c5G=bdcBXif1!C zbl_A8X<=v`B94?IDKC`yfIlCwwnwPMZ{MfZO8xW|>%34(A%uV(4+om2!*52`-5yJc z6eCFwIDax;j8g9Bol`#9cM1`UTMd0000n9WIZzj1A~Sxe=v|@EDmyaVpw-h<|UA$65tc!3Z##$Ey?YkjdwiywbS(XZ^*5=`(Z8HjNFA8jAy%UmzZ}OhAK?& z37Ww8bxMOe|AeWfrY#C)O&p9a6+5i|v}IbI|9$?GqTx@5zP4kfqRYQrU9j=g@|qbY zXG2!{FrH835r2_#n%#`Q@q6ov;;>f+GU8tfgMRSG-(ikAFAoyr`94_0dn!5@o+H zPcy=Qktb;~*nzlYq$Gw+7JM{R81hjHSn1PDJ|=H5Bt zn$1pCM{}~cCAb`H2ltF%G>Bw@=XnOb%*$k+V(^%Pm<`SYC#4h&SZlb5LV(hu0RiCO zzS%G$*FJ+-mwyK;SCGvxzAo#csL&I<6H*CTU@%zR?_YM!He(EOL;sqj46+no|K8r5 zgAd-u737X82-EQuHr{U>j7zRKv21V3TN}QI5pO82jfWs2rsKf4l zk;Xj?){?4}pqc5edA>UP`R)7X&7X^+D8RC7UZl!(u76M0zX&R(Yl$m{i!+^fPh3dM z0KTeP8Pkqq#1<-ouXZ``K1%*jY2;sZ{0000 Date: Fri, 12 Feb 2021 15:42:14 +0300 Subject: [PATCH 264/463] Flavolite furnace, missing shaders, some pick stacks --- .../blocks/GlowingPillarRootsBlock.java | 11 +++++++++++ .../java/ru/betterend/blocks/LumecornBlock.java | 12 ++++++++++++ .../materialmaps/block/eternal_pedestal.json | 3 +++ .../assets/betterend/patterns/block/furnace.json | 2 +- .../block/flavolite_furnace_fron_on.png.mcmeta | 12 ++++++++++++ .../textures/block/flavolite_furnace_front.png | Bin 0 -> 679 bytes .../block/flavolite_furnace_front_on.png | Bin 0 -> 2640 bytes .../textures/block/flavolite_furnace_side.png | Bin 0 -> 620 bytes .../textures/block/flavolite_furnace_top.png | Bin 0 -> 561 bytes 9 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/assets/betterend/materialmaps/block/eternal_pedestal.json create mode 100644 src/main/resources/assets/betterend/textures/block/flavolite_furnace_fron_on.png.mcmeta create mode 100644 src/main/resources/assets/betterend/textures/block/flavolite_furnace_front.png create mode 100644 src/main/resources/assets/betterend/textures/block/flavolite_furnace_front_on.png create mode 100644 src/main/resources/assets/betterend/textures/block/flavolite_furnace_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/flavolite_furnace_top.png diff --git a/src/main/java/ru/betterend/blocks/GlowingPillarRootsBlock.java b/src/main/java/ru/betterend/blocks/GlowingPillarRootsBlock.java index bd7264eb..c6e5d493 100644 --- a/src/main/java/ru/betterend/blocks/GlowingPillarRootsBlock.java +++ b/src/main/java/ru/betterend/blocks/GlowingPillarRootsBlock.java @@ -1,9 +1,14 @@ package ru.betterend.blocks; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.item.ItemStack; import net.minecraft.state.StateManager; import net.minecraft.state.property.EnumProperty; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.BlockView; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.UpDownPlantBlock; import ru.betterend.registry.EndBlocks; @@ -20,4 +25,10 @@ public class GlowingPillarRootsBlock extends UpDownPlantBlock { protected boolean isTerrain(BlockState state) { return state.isOf(EndBlocks.AMBER_MOSS); } + + @Override + @Environment(EnvType.CLIENT) + public ItemStack getPickStack(BlockView world, BlockPos pos, BlockState state) { + return new ItemStack(EndBlocks.GLOWING_PILLAR_SEED); + } } diff --git a/src/main/java/ru/betterend/blocks/LumecornBlock.java b/src/main/java/ru/betterend/blocks/LumecornBlock.java index 0011b4ce..c29c2c95 100644 --- a/src/main/java/ru/betterend/blocks/LumecornBlock.java +++ b/src/main/java/ru/betterend/blocks/LumecornBlock.java @@ -3,6 +3,8 @@ package ru.betterend.blocks; import java.util.Collections; import java.util.List; +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.block.Block; @@ -100,4 +102,14 @@ public class LumecornBlock extends BlockBaseNotFull implements IRenderTypeable { return Collections.emptyList(); } } + + @Override + @Environment(EnvType.CLIENT) + public ItemStack getPickStack(BlockView world, BlockPos pos, BlockState state) { + LumecornShape shape = state.get(SHAPE); + if (shape == LumecornShape.BOTTOM_BIG || shape == LumecornShape.BOTTOM_SMALL || shape == LumecornShape.MIDDLE) { + return new ItemStack(EndBlocks.LUMECORN_SEED); + } + return new ItemStack(EndItems.LUMECORN_ROD); + } } diff --git a/src/main/resources/assets/betterend/materialmaps/block/eternal_pedestal.json b/src/main/resources/assets/betterend/materialmaps/block/eternal_pedestal.json new file mode 100644 index 00000000..5d23c84f --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/eternal_pedestal.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_purple" +} diff --git a/src/main/resources/assets/betterend/patterns/block/furnace.json b/src/main/resources/assets/betterend/patterns/block/furnace.json index accba1f5..be5bece7 100644 --- a/src/main/resources/assets/betterend/patterns/block/furnace.json +++ b/src/main/resources/assets/betterend/patterns/block/furnace.json @@ -4,6 +4,6 @@ "top": "betterend:block/%top%", "front": "betterend:block/%front%", "side": "betterend:block/%side%", - "bottom": "betterend:block/%bottom%" + "bottom": "betterend:block/%top%" } } diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_furnace_fron_on.png.mcmeta b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_fron_on.png.mcmeta new file mode 100644 index 00000000..98b9ae71 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_fron_on.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_furnace_front.png b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_front.png new file mode 100644 index 0000000000000000000000000000000000000000..210567575e07efaac6d70e0196bd57966c9fde19 GIT binary patch literal 679 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 TZ7t65&ll*shF$SZPx%CP_p=R5*=Ylgnsc# zDvC1rKb$pDPMUV1Ctew>wK!K}OvmhriF`wB45N_=3J&&^7wX#LoOCsIe$tRWGy(8Z zz9*(EHbmb2QxJIl#+Mn)W{(s_Nl}y-V{o#g zRWTyMa=8k5?4toEC#PN2FSqdj9uDeSrP)^t;`}n~Al!}H64`CSbAFu9xO#WaVmcPx$>q$gGR5*==lQC}-K@^0)-Mf8v@tK4i5fVY7Boff@3y>(OXyG656G2q`2AUvJ zkOY%};y7W?-g|3%Db79uh10F}y&1ik(U^;)kI5tjU_QMdAKU{V8NnpQrie|ErEx5c zBN+j}B<=RsK!7iYpLu-njI!JUrT~O6qYVLoqAba(2e`$AtH~v!(J{G6N*e-2S>l{< zdh!i`7+ahx`ge?qbHc&XZLTJl6lDoO-i*I98XXg(G8o+9^yrA;utG$b*+jmaG9F(7 zFdSC=`f<$p`6IuA z2_Ya-^gt1Zs$$au!-B?NuZR`z8}eo6k8?u4G;YP-66YNOKvoQitzXS_Mck3BF)=C@ zpj;W^a)*dRM0z6cn_mBVwy+gN(V3nnBZLr$u|=d~PGs1$AQPdkrN3Y;&m^U712JkB zW2dL+-G@aFxOsjeqw&|+6#rgeQ|z-|YgCP>D!cU_PPQ;C`hV{mY>KpP=wiI-!P(hQ zyl?QnK}3i;V`(x}mGOAe`!Tlzc6RP|QUBkCPaod*X;gy&yY(K8zsCE9S(x$a&AZKA zc=`J6<}$(NF3hJF8_OhHw{_u`GS&6{f4cAo?s!bxD|!!q00000NkvXXu0mjfrUeA5 literal 0 HcmV?d00001 From 3d5620965361963f6dc01ba67e6703f9dbb48cb9 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 12 Feb 2021 16:30:57 +0300 Subject: [PATCH 265/463] Violecite furnace --- ...eta => flavolite_furnace_front_on.png.mcmeta} | 0 .../textures/block/violecite_furnace_front.png | Bin 0 -> 545 bytes .../block/violecite_furnace_front_on.png | Bin 0 -> 2227 bytes .../block/violecite_furnace_front_on.png.mcmeta | 12 ++++++++++++ .../textures/block/violecite_furnace_side.png | Bin 0 -> 542 bytes .../textures/block/violecite_furnace_top.png | Bin 0 -> 546 bytes 6 files changed, 12 insertions(+) rename src/main/resources/assets/betterend/textures/block/{flavolite_furnace_fron_on.png.mcmeta => flavolite_furnace_front_on.png.mcmeta} (100%) create mode 100644 src/main/resources/assets/betterend/textures/block/violecite_furnace_front.png create mode 100644 src/main/resources/assets/betterend/textures/block/violecite_furnace_front_on.png create mode 100644 src/main/resources/assets/betterend/textures/block/violecite_furnace_front_on.png.mcmeta create mode 100644 src/main/resources/assets/betterend/textures/block/violecite_furnace_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/violecite_furnace_top.png diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_furnace_fron_on.png.mcmeta b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_front_on.png.mcmeta similarity index 100% rename from src/main/resources/assets/betterend/textures/block/flavolite_furnace_fron_on.png.mcmeta rename to src/main/resources/assets/betterend/textures/block/flavolite_furnace_front_on.png.mcmeta diff --git a/src/main/resources/assets/betterend/textures/block/violecite_furnace_front.png b/src/main/resources/assets/betterend/textures/block/violecite_furnace_front.png new file mode 100644 index 0000000000000000000000000000000000000000..1204a735bac2b1305322b3d53214966e40dc372d GIT binary patch literal 545 zcmV++0^a?JP)Px$+et)0R5*=&liO0KqAAOkS?nZATOw+ITPGe5kI_a|64F$mjY8>!qR6o=8_TjOikz}6 z5kgSbGF<5b;7G3;B7n4=8g#ihza-0YR+}XNNBtvIs_VGKbG%BfNna$WG^wgN4qtAr znB0D&D02S%opST@n&Du`{q&9>zb2Ti0cZ&ZC~~qq!;vmoo>3Gz!m?Ul z8(j}^`!a(>CupPaT#u92r<7&Mpf}*+-6aS?oNPFKbB5U(dO;t6;UFZ@F>of%vyWvX j!FPkbb{oI3Lz4ahr@|q-owt|T00000NkvXXu0mjf=g0Xl literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/violecite_furnace_front_on.png b/src/main/resources/assets/betterend/textures/block/violecite_furnace_front_on.png new file mode 100644 index 0000000000000000000000000000000000000000..38e1c90b29f1e7c4f0e8db7bd19160f3bb187cba GIT binary patch literal 2227 zcmbVO3sBQ$9515aivv&R1Ya>e25OoneI`;BTNO@=2vwM`k)~hUNZW)aKw&zaL%~C* z(_`+Of}+zoU-L1?PH&2+)AKbzC!S8Z&F36G&N4yTA@N;Nq3G0AK0*{LSM^XR+SPE@ z3@O7ho@RNElCkqPp!9nLh*l`#NB9MX%>oi)15VCsMDOg~k0PAih^A{TDvMwOE-taa z2hs|Xt!zOSOWDy8!;yGD4GBCzVi3Q_?Gfqy-1Yl|{mY_zfUOb+lgeZ;9g<%8|(kfcC<_iE%1tOp0W5MWLXtTc@jX;}xfRT8g zmFL|pg-U6$jF?PvVGKxYI_I_Xd1BlPdw`jdfDt8CB!Q_&j3BLqjwUEtqaUJD(<)Un z)WX|2M}BKilA;OnB`E9~J0mgw3AVGegZFtD7>#oB$WRP811dk~Z;f-Uo%DJ9U!_ zi-k_|iW1{xL6X^s!myPbXQzQp-=hL&{@(Ai)W9_a^;?zskSJ zc{`-K9C&N#dw_nPEZ_`?Zc>4KO+SbVgr`_S;vGYhndN7BBWIL)wN^U0q&RL{SEYEz%j zFJ8&0V=}@`XWYyO9m*#^>HL2CZ#G4|-PV*-yJgt6kHR~znw4dwHTW&{;48(ulDGEERCWz7y1KnDcHvOOHo>^@-p0ey z>EfE$!$@TEjLIE5rspo+8CH@#Co5Mu)nnZky2q34omnkfDvuwWogS6a*5AIKpZa6! zjb(#-v@hk#>Ml*~rcLlC??~6DS1uhkV(8I?J)3%-%MZ)!WVAJWe1aWYb+RndWg9c8 zZv4I}SmSVPT-@dFw=`a+r;I;z**$s2i05ObjcfO99ls=U{c?X7iI~?nc2>yZxcYS) z3J=Dt(NPaqU+d9v-lm${&vw#hO9zys5iyG;4VLwS%LUU%0(yN%vn$ji;iI7Jl_0EcAR<%$`Q7m$@M3s5Q3s+@O##AO2NQ zZgsB|6Am)h=GQ6XmsAuyT^(QVFC3H~7hSS$0z)L9O+v#8+_j5}o}aGn6awbv%zfA; z-*ETYjo&AB>(ggNF8?@w_pK+VEABS14fj%(etrFZLs#-w=14WTC%ku{-+{0L&Yhmh zE`Hae2UTYl&-&xBu<_5LqVm%H_vfC?JbgVR^F-*WZdVo+MMthUT>W#>?AWneB72vI qKPmss^jT5jgDSk!t~*~GtL1Avh0EqHoKPWuRwRv1Hg6l1Iqz@aeH;k@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/violecite_furnace_front_on.png.mcmeta b/src/main/resources/assets/betterend/textures/block/violecite_furnace_front_on.png.mcmeta new file mode 100644 index 00000000..98b9ae71 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/violecite_furnace_front_on.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/betterend/textures/block/violecite_furnace_side.png b/src/main/resources/assets/betterend/textures/block/violecite_furnace_side.png new file mode 100644 index 0000000000000000000000000000000000000000..0a696fce325c4090f4c4c3b53527e3d6e23a6c19 GIT binary patch literal 542 zcmV+(0^$9MP)Px$*hxe|R5*=&lgW;oKoEvMplQIw4A}BZz0?wIa_87SUR9E03|o7R$rMp|xUAJ!SC)fI;;i0%@%{9QTMp z^}L>*$>mK3tL}V{_TtNBf!H=Xw#|-X`@*)_@hG?DexwV4{oyaxTei)PVd!w)Are8a zdO`?99hAiy?;T2yH1(ECf97!969cSPGhgd0Qf8z=(v2M=5u_ret~N-Sk>>@ZegSKi0Fh-%RLg|sqa7NpCGD4&n zr-`Eo=N!fwq>uolBAc5CAd>Xzlx&_dyq`FAE!t|TvSQG4*?E?erP)l^nmGx8GUJSv zrcB;ro#E|mB8d}}QPk@O0Ou^$SxVs4weJAyvSLs@{cu4ff@zvah2*KKi9$pa$9U&( z-l46&HqoK2ngK>VqOBs68O}RG2vlW-hy_Fu!`Kl*n6qCeR<9dIJs^(l3$LeV0L+z_ zwu*D#-fbd4E(^|mOM5=PH+tE`$4&ce6L0TFEP>@{mP2|xqQ^MEpMSrJzJ2`>77Dp6 g?#f;CMLweR9|#RK{QQg!CjbBd07*qoM6N<$fPx$+(|@1R5*=wlg)11Fc5@4%9KP#wqwT#iku4c*n3ay1N7SWe}TeC>mP~YufiS_ z$+4TviAw^@nb{rj^ZTz1;G9J%%>?HxZ*lvkl;&{!gPbmW^!VrjNGa0jB>={D?>2JI zayF;2fsdZ!`S0b2V0k|7QI&qT2Kcml0vH?Am123fVz+(d7H_3FXR)qlyV>EK#RZF; z=y!d~Zu^KaEipypLekleoHL?@Mz2UIvOoN0yV-H>P8S9fLJU+@4G7NWL@7%Emdy$w z3Z#@XlQbk$r70!}0OX7h9_xEbSyG4sUEdKxU>Fj;HM0*7n+II56iR8lAN5$*b2cYj z7)K~&iI0v#2x5%*;Agg_tS=JeqI|uqc(|`gY2er%aKW)|))?21Bdir|e?lpZwLPlR zqlwnP7G=qh5+QnCUIrG$0_!cC)fRvl!_45=9xe=4%^G7nI&(%YB*QRJ%8L8-29X7# zC`d69Q+#7$9LEUIyB-%TbyX8nB&0bN~PV07*qoM6N<$f; Date: Fri, 12 Feb 2021 17:40:15 +0300 Subject: [PATCH 266/463] Sulphuric rock furnace, shaders, furnaces tag --- .../blocks/basis/EndFurnaceBlock.java | 26 +++++++++--- .../blocks/complex/MetalMaterial.java | 2 + .../blocks/complex/StoneMaterial.java | 1 + .../java/ru/betterend/patterns/Patterns.java | 1 + .../ru/betterend/recipe/CraftingRecipes.java | 2 +- .../java/ru/betterend/registry/EndTags.java | 7 ++++ .../materialmaps/block/flavolite_furnace.json | 10 +++++ .../block/sulphuric_rock_furnace.json | 10 +++++ .../materialmaps/block/violecite_furnace.json | 10 +++++ .../patterns/block/furnace_glow.json | 38 ++++++++++++++++++ .../block/flavolite_furnace_front_on.png | Bin 2640 -> 2625 bytes .../textures/block/flavolite_furnace_glow.png | Bin 0 -> 2064 bytes ...meta => flavolite_furnace_glow.png.mcmeta} | 0 .../block/sulphuric_rock_furnace_front.png | Bin 0 -> 530 bytes .../block/sulphuric_rock_furnace_front_on.png | Bin 0 -> 2071 bytes .../block/sulphuric_rock_furnace_glow.png | Bin 0 -> 2064 bytes ...=> sulphuric_rock_furnace_glow.png.mcmeta} | 0 .../block/sulphuric_rock_furnace_side.png | Bin 0 -> 479 bytes .../block/sulphuric_rock_furnace_top.png | Bin 0 -> 438 bytes .../block/violecite_furnace_front_on.png | Bin 2227 -> 2478 bytes .../textures/block/violecite_furnace_glow.png | Bin 0 -> 2064 bytes .../block/violecite_furnace_glow.png.mcmeta | 12 ++++++ 22 files changed, 112 insertions(+), 7 deletions(-) create mode 100644 src/main/resources/assets/betterend/materialmaps/block/flavolite_furnace.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/sulphuric_rock_furnace.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/violecite_furnace.json create mode 100644 src/main/resources/assets/betterend/patterns/block/furnace_glow.json create mode 100644 src/main/resources/assets/betterend/textures/block/flavolite_furnace_glow.png rename src/main/resources/assets/betterend/textures/block/{flavolite_furnace_front_on.png.mcmeta => flavolite_furnace_glow.png.mcmeta} (100%) create mode 100644 src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_front.png create mode 100644 src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_front_on.png create mode 100644 src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow.png rename src/main/resources/assets/betterend/textures/block/{violecite_furnace_front_on.png.mcmeta => sulphuric_rock_furnace_glow.png.mcmeta} (100%) create mode 100644 src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/violecite_furnace_glow.png create mode 100644 src/main/resources/assets/betterend/textures/block/violecite_furnace_glow.png.mcmeta diff --git a/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java b/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java index c75e50dd..7920088b 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java @@ -18,12 +18,16 @@ import net.minecraft.util.registry.Registry; import net.minecraft.world.BlockView; import net.minecraft.world.World; import ru.betterend.blocks.entities.EFurnaceBlockEntity; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class EndFurnaceBlock extends FurnaceBlock implements BlockPatterned { +public class EndFurnaceBlock extends FurnaceBlock implements BlockPatterned, IRenderTypeable { public EndFurnaceBlock(Block source) { - super(FabricBlockSettings.copyOf(source)); + super(FabricBlockSettings.copyOf(source).luminance((state) -> { + return state.get(LIT) ? 13 : 0; + })); } @Override @@ -48,18 +52,28 @@ public class EndFurnaceBlock extends FurnaceBlock implements BlockPatterned { @Override public String getModelPattern(String block) { - String add = block.contains("_on") ? "_on" : ""; Identifier blockId = Registry.BLOCK.getId(this); Map map = Maps.newHashMap(); map.put("%top%", blockId.getPath() + "_top"); - map.put("%front%", blockId.getPath() + "_front" + add); map.put("%side%", blockId.getPath() + "_side"); - map.put("%bottom%", blockId.getPath() + "_bottom"); - return Patterns.createJson(Patterns.BLOCK_FURNACE, map); + if (block.contains("_on")) { + map.put("%front%", blockId.getPath() + "_front_on"); + map.put("%glow%", blockId.getPath() + "_glow"); + return Patterns.createJson(Patterns.BLOCK_FURNACE_GLOW, map); + } + else { + map.put("%front%", blockId.getPath() + "_front"); + return Patterns.createJson(Patterns.BLOCK_FURNACE, map); + } } @Override public Identifier statePatternId() { return Patterns.STATE_FURNACE; } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } } diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index cba55195..01728e0e 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -40,6 +40,7 @@ import ru.betterend.recipe.builders.GridRecipe; import ru.betterend.recipe.builders.SmithingTableRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; +import ru.betterend.registry.EndTags; import ru.betterend.util.TagHelper; public class MetalMaterial { @@ -198,5 +199,6 @@ public class MetalMaterial { GridRecipe.make(name + "_boots", boots).setShape("# #", "# #").addMaterial('#', ingot).setGroup("end_metal_boots").build(); TagHelper.addTag(BlockTags.ANVIL, anvil); + TagHelper.addTag(EndTags.IRON_INGOTS, ingot); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java index b98fcd97..08fde481 100644 --- a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java @@ -90,6 +90,7 @@ public class StoneMaterial { TagHelper.addTag(ItemTags.STONE_BRICKS, bricks); TagHelper.addTag(ItemTags.STONE_CRAFTING_MATERIALS, stone); TagHelper.addTag(ItemTags.STONE_TOOL_MATERIALS, stone); + TagHelper.addTag(EndTags.FURNACES, furnace); // Block Tags // TagHelper.addTag(BlockTags.STONE_BRICKS, bricks); diff --git a/src/main/java/ru/betterend/patterns/Patterns.java b/src/main/java/ru/betterend/patterns/Patterns.java index 9bcf7a28..48fbe9ca 100644 --- a/src/main/java/ru/betterend/patterns/Patterns.java +++ b/src/main/java/ru/betterend/patterns/Patterns.java @@ -99,6 +99,7 @@ public class Patterns { public final static Identifier BLOCK_CHANDELIER_WALL = BetterEnd.makeID("patterns/block/chandelier_wall.json"); public final static Identifier BLOCK_CHANDELIER_CEIL = BetterEnd.makeID("patterns/block/chandelier_ceil.json"); public final static Identifier BLOCK_FURNACE = BetterEnd.makeID("patterns/block/furnace.json"); + public final static Identifier BLOCK_FURNACE_GLOW = BetterEnd.makeID("patterns/block/furnace_glow.json"); //Models Item public final static Identifier ITEM_WALL = BetterEnd.makeID("patterns/item/pattern_wall.json"); diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index d88c8adc..9a41e21a 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -40,7 +40,7 @@ public class CraftingRecipes { .setShape("T#T", "V V", "T#T") .addMaterial('#', Blocks.END_STONE_BRICKS) .addMaterial('T', EndBlocks.THALLASIUM.ingot) - .addMaterial('V', Items.BUCKET) + .addMaterial('V', EndTags.FURNACES) .build(); registerPedestal("andesite_pedestal", EndBlocks.ANDESITE_PEDESTAL, Blocks.POLISHED_ANDESITE_SLAB, Blocks.POLISHED_ANDESITE); diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index a85ade47..0a6c9cb2 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -29,6 +29,9 @@ import ru.betterend.mixin.common.ComposterBlockAccessor; import ru.betterend.util.TagHelper; public class EndTags { + // Table with common (c) tags: + // https://fabricmc.net/wiki/tutorial:tags + // Block Tags public static final Tag.Identified BOOKSHELVES = makeCommonBlockTag("bookshelves"); public static final Tag.Identified GEN_TERRAIN = makeBlockTag("gen_terrain"); @@ -39,6 +42,8 @@ public class EndTags { // Item Tags public static final Tag.Identified ITEM_CHEST = makeCommonItemTag("chest"); + public static final Tag.Identified IRON_INGOTS = makeCommonItemTag("iron_ingots"); + public static final Tag.Identified FURNACES = makeCommonItemTag("furnaces"); public final static Tag HAMMERS = registerFabricItemTag("hammers"); public static Tag.Identified makeBlockTag(String name) { @@ -106,6 +111,8 @@ public class EndTags { EndBlocks.TERMINITE.hammer ) )); + + TagHelper.addTag(FURNACES, Blocks.FURNACE); } public static void addSurfaceBlock(Block block) { diff --git a/src/main/resources/assets/betterend/materialmaps/block/flavolite_furnace.json b/src/main/resources/assets/betterend/materialmaps/block/flavolite_furnace.json new file mode 100644 index 00000000..9e241063 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/flavolite_furnace.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/flavolite_furnace_glow", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/sulphuric_rock_furnace.json b/src/main/resources/assets/betterend/materialmaps/block/sulphuric_rock_furnace.json new file mode 100644 index 00000000..be8b6e0f --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/sulphuric_rock_furnace.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/sulphuric_rock_furnace_glow", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/violecite_furnace.json b/src/main/resources/assets/betterend/materialmaps/block/violecite_furnace.json new file mode 100644 index 00000000..d8868020 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/violecite_furnace.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/violecite_furnace_glow", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/furnace_glow.json b/src/main/resources/assets/betterend/patterns/block/furnace_glow.json new file mode 100644 index 00000000..db2bd401 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/furnace_glow.json @@ -0,0 +1,38 @@ +{ + "parent": "block/block", + "textures": { + "top": "betterend:block/%top%", + "front": "betterend:block/%front%", + "side": "betterend:block/%side%", + "glow": "betterend:block/%glow%" + }, + "display": { + "firstperson_righthand": { + "rotation": [ 0, 135, 0 ], + "translation": [ 0, 0, 0 ], + "scale": [ 0.40, 0.40, 0.40 ] + } + }, + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "down": { "texture": "#top", "cullface": "down" }, + "up": { "texture": "#top", "cullface": "up" }, + "north": { "texture": "#front", "cullface": "north" }, + "south": { "texture": "#side", "cullface": "south" }, + "west": { "texture": "#side", "cullface": "west" }, + "east": { "texture": "#side", "cullface": "east" } + } + }, + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "shade": false, + "faces": { + "north": { "texture": "#glow", "cullface": "north" } + } + } + ] +} diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_furnace_front_on.png b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_front_on.png index 57455f2674fd81508434c47bed8249aaf0418af6..1aade7134ee17754c596671521a950ae71046a31 100644 GIT binary patch delta 1287 zcmca0a!_P~IF|qi8v_G_{OA9P6BWgo*bO&YO=4mNmYVq}tP zX`X6gqHAQHY^ZB&YGR?AWMYt}Yn)_mmS~caWRPrbusMpkjMF}dHnO9trn3tUD>0+x?kz1gbnVDi`n3`f?k!otJo0MpprfXkBgSOY(~| z@(Zk7@{>z*Q}aq3fq_$8l3!E|b+l7rI^6koi7EL>sa7fZ$-q!UXf;bqH8x60G1fIr zwM^ADH8DxkwJ=LD*R?b?H!)30O|?idFt^c%gaFViFbiU=j6T8?3pBDPm!|IYCd@(^Ke(r{et82g-AMUSOW@df{mf~Ti?>mNA% zW%;h>BEBwWcY!jaa)!j@87cE-zMGf6fA^m4YMo*tch;?|e!uhi9HGC*(p5v);#}{v zKh=L7!6{vnw<6}fSHxys@Bh#1k8a^#Sud<9;I!c5Yxc19>kfadStangJ5xy6TS%iT z_jqGubfb~B8x@&}H$*BDiwthoB@;@$hMd+pedmuYw&ShGx`P4Sf1!H>2qbDc}9*>}xw<#oC7 zW6835M`6eP-EykcElW0UZe`U>yeP&t;fSP~$&sB`XA3Mla_g8{RP}9+!^s}bq8^u9 z9$2sFVw(K^e!<>V2Ki4X^tlKwUE$Mc=<_DGwsm)z^rseiH-(uuZ_X*%c&0E@B3aVX zW_}bucL4VUjsiASp{{nODBgpXXM`{EPER;KSy88Hd%eYsLo2x})^B6|7yaraZ>gP! zVDR-*A3O!i+Zw+5c`Q@%PlytF`+N414))KFxl;BH}O=~!e!jqp0Jz3H> zXQqeXYQC8J$Je^AFMU4${ruHe+4W2J{Czhws{V)D@%Vdop*cF=T2yl-+@?BD^e%dI zV9Ofg6M+JAjvo3`UT-JYtGLQX_`IFq#dGYYeY;*v5VzW2{?IBV{M(V3-YF9e-dIj~ z$r32BaEaR<^LMt#R4fh^u4g`&fAE2!pN96$`~N2W6IpWXO>D%icWwI@>8?GVcBSU} z8nqLT7Jl3Pc&Ej?Erkz12{nZ|ubzCVvNloh?BUv&J=>Zx>%+x;AF(XH7@qKL#t)%< zTji6QC-?n1duPtS`9AIs(w3h*^PQc9%ZyF@CweRAExw(nDD`FQxoJ-)q*i~} lQ`x)4z4-H^<42ADu|~{qDD(_d_XHMr44$rjF6*2UngEEp3;F;6 delta 1382 zcmV-s1)2K66wnlq7YaZK0ssI2oF8Dpks%iX1oN>vk^+;T0u+h&q9S000F8Nkl$Y*~JR+o1vf0ee&d$t7-yxm)O=1K9MT`JHw>E1HHzm1=dR~Djl%~PrFq1)P5NN3+`sG1ze~%9;SCg%P=?F3lBeUrF_3=6f;b0sCBf~g zj9M`PG$Uw+&%-o&o;OHhX49E&>P{0sT7w4!769%U^Zu!S69FGEM_U!g^@sglN zGP4=o`uwu%`L;!@D+;fbAB)_8QkrUXiwVo56joU^V^i0wR2FV5o_}~%DLMD>+T8Eg za-%Qa_-uR2GK~e9syYs}oGHbVD2x`DB6~nHvDzm0+B)~w>z}ATv#Mm~j@9ng<-Z*uVx8ecWsPtqQG99rWWgya-|-FLfDigj>YDP?2%;ql8n@FKP$4@^gK7(6)?5AIkV+zEMD zD|vV{ArG#rWu7ce&Vv}wgZ&&2){uwdH1ZIouF8G&*xy+7NuzRS*<<=dJYZvaxKi>! zh(!v20^~;`*P!$W58?$L>Wk-py{fdF`|8`df3D@K$ zJkXMdN=;<(_D&1Wp!I);hr{Uu^1vqK;i*1<wydTk;T0$iq+{fZ+f#Mjv>F-EojU9K^$@J|v}o zKJ3Fo8nga>`cNtL;eWsb>I0j6UQ(q#z+va5-h}f~RPwO825SV)0@M$hmpFY--3ujW;jstaoJ0uE2{E6|P8#rTd zv!A4RKomT9q+9<5d1!BKv>Sy!D49=xO;y=YA4ES2ySm`PeE7*1Nr*hONx1UIPz?yd zb_#6&wdeF<5Lo`}Me7dd^E99~aLId;bI0?-AUJ;Nc(=Xc6vgIK(=|kKcJ9pq&Y1?V zT>XBG6C_p2tHRWO;Rc=w*i{lI_``#$q oqA5?RwWHXJ{iKJcN~3}OFa5kb$uGW7AOHXW07*qoM6N<$f(%-vsQ>@~ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_furnace_glow.png b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_glow.png new file mode 100644 index 0000000000000000000000000000000000000000..1c3df136998375daa2315fbac277d45e3aadb76a GIT binary patch literal 2064 zcmc&#ZEO@p7+#>XK!a_m7D80kZBU5r?d-?hbyv=E_9{K)YAu&gjMUEV%-wBzx4Yfl za@Q)L5C~{cjL{mXU(rDPNK(!65soP~2Jikcg3inNk@CApT*DkcBb>(9MNZnLeXH4a6US9{kq zYFGaPiYk3wkGHvPv6YHuW_%EtD)!|v7C}?gvih6_wNC8PDo*M~h&em_DMRZh#H{wm zK+I~uDZQ!J#;bap<63X0CL^Z)9(q|$Ap{xhLOPd88;+6-F?n8vjJ;`&q4N;8GsJ|w zfOK1|g>EoyO#6KSR^ugs4$3}00AxYBixvPMaV7k&(hW}}4C8o93! zi#&yxl|S>}Mi2?9$HtkYw-Fvl8B?G!@IEvS!4c@<5F-GAXMw=-LY((260Zotoj_Co zn1sfN6%cgczrkLM6(IcsY$83;^PfHdKd?KrGS7DUa>AaT| zsCjk|F`CzBjF`f-ei@yvEu%@=Yzh<7t2BQS=9mdL3vC=u5>2ngU)+`Qci_6KXD?$d z01yT&k2Rjfb)+vUj|4UWWCXMzR1=Wsd8Oo@u-hS|v+p5a%esA!%n>UrU%;R_L{kHPlyxtc|!sQzm4*Qqf8h+sY^ADdc zoAc1h!$X^n#JMAfL=lYty5srJ1#QdX6(vWhwhLV+K~=>KA3XWk$eG>e2abHRvErFe z7HoZL*UYc?9UE5%_x$iID2>Nu?#C}iQ++$%*n##zsm(%`yMU%}1Xe zkUNrV``7%^``nik9W^`qz|hCXvmXvF8~W(f=2_dGn7Q8Cx$Ta!-3Mx|@rn5tMxvEt z^B1MJ$d7-u^u)2B_Z-|?@!jInu{SChdV0+tBO93Zck5r0CLV3te`;*_?7qn8+rM{J w&Zs}M5l(;PdxN{>#?fjw{uVp&+J*yV?T5RMpIE!U-8-|Rjm?pPdpkD$1<_5cVgLXD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_furnace_front_on.png.mcmeta b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_glow.png.mcmeta similarity index 100% rename from src/main/resources/assets/betterend/textures/block/flavolite_furnace_front_on.png.mcmeta rename to src/main/resources/assets/betterend/textures/block/flavolite_furnace_glow.png.mcmeta diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_front.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_front.png new file mode 100644 index 0000000000000000000000000000000000000000..62a1030ec55e5fd69b84a0ef20ada86a4466f013 GIT binary patch literal 530 zcmV+t0`2{YP)Px$%t=H+R5*=olR<0SKoEsLOTv+|h9DB~v8AX5L+!M;LJ$2V?ceCH?4dO{IF(xp zf?ynFaqH2pMJ4xO??!eyr?nL|Dq|QZ#Xu=GB2>l@ zIl_68?3lyyc}_>LcFT)r&jHZC z|9JewgJGI7Oj8y`!MpL8_2C)6zrF_GTb?t?GGPDAhiMAneF$8USj$?3d#xE>UV4I? zb*Z&iuoijz3yY$79HFieYY}VNbc&o$8xb}lT&1a3(EITA&CY!kH`o8LJG*fCf5EOd U6rc5IK>z>%07*qoM6N<$f-jowW&i*H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_front_on.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_front_on.png new file mode 100644 index 0000000000000000000000000000000000000000..437b180d408a985f1d070248ea99d0e9d9afd828 GIT binary patch literal 2071 zcmbVN3rrJd951>#9=;~SIYm7WjXJsBqtNyaszVC4(;@{XXlC?!_qDy)-qpK<7BVnd zFpCp)n`Uvy3`#PMP7N|8igWR?=_H!Xskm(Mz0Aee1m-)s@7mJgg3heT^}f6NeZSxD z|G57xD=e5XC~;(>PNy4Ww^@ted8l^84}kw;yPmM{ln}7ZRdl+fWbKI4)i;dL>0bU( zC@E9R9J3fs^6Ob%ashqFAAo3`E_+%iz;cU#inxGB5H0Afwr@~G;4Nrrrh{+PSuePMB)!+{U@fv74FOUAGPucS(fS9%6@ z?D10qFtrXxOruXPet%3tQS&Nb7}13EiB?J~0{|}qic~IhAg==2Ow*zXFu5{dRY@+9 zBwtUV3VSRgxw%?l%*dotLFA>NGP&0tU}aTcK`DYFF@nNKs)RH#28tocDTIL`hzQgn z@q)XuPpE;(d>RV7hG$jwKfyf5xFy-o!k7g=>j8K`^q@#AlT5DUlVm6i-5J6z91g}V zDk>{-z;3mmFl@ab@C@O~FtWUXz-W#qFgKB5z*wF)VZ@sf{H`|_gf{dTq~}& zKho#C#6gaKRNXG#P0^eYBh8S=OlFXn830J`GMXrgHoIJzY>%7SvH)K-*4LX=bHzhO zx7lFed6x-ejjS2tOpuJGI1^@aac+*}NzR?gYYiRl5ymDcuzHozSELv$j;?$H5^f8I z<+OIUpqy4`z@yRILLd2fA?4`)pcg>W=M+Dpu1Ib*$jTtc19SHx{e?fvzrt2L-~EeK zGh(Yx_r3e^f4Yw*hx4+c2fzu6qgp(;HftiK!T(*g@UvcXsRs^+owkfkS$Gkf(?EpO zGMvI|JI<`r>Ef>2tvMy;75?IxVsg&VYRk>Dmd_TplXhflJZ*E@E~V-g$C;-OZN2bj zI-QVocx8$&y|y{!`%f|xzoTx4rr!Rb#^1pYTvJlNrGCry(j9wG|I$%9vn*joTJ526 zC)PRYn&NjMZ#hRa*&6OAkNPQZlXt<80r7PQ&L8Yw)BW&l^Z7~k#<>fRfxBJq6|Rv- zM&)(4R-dn)YXiv-<|VGZF!+tf$C8?aN2`v%N3YpP8^$%ajjz5{?(Ez*=(VnI`*|i# z+px11uj-heQTIW0*5k{Kwfz^+>zePh?rx_ycPKS#^Kvrf)Uh!Y*o6Ia zhA+K#@v&oPrPwk#K~1%hua<6m-4(}8nKszZE$-c&Iji+e&`GOP8aWh!2JO>r&nvKQpT6+@zX7(V*?#~4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow.png new file mode 100644 index 0000000000000000000000000000000000000000..1c3df136998375daa2315fbac277d45e3aadb76a GIT binary patch literal 2064 zcmc&#ZEO@p7+#>XK!a_m7D80kZBU5r?d-?hbyv=E_9{K)YAu&gjMUEV%-wBzx4Yfl za@Q)L5C~{cjL{mXU(rDPNK(!65soP~2Jikcg3inNk@CApT*DkcBb>(9MNZnLeXH4a6US9{kq zYFGaPiYk3wkGHvPv6YHuW_%EtD)!|v7C}?gvih6_wNC8PDo*M~h&em_DMRZh#H{wm zK+I~uDZQ!J#;bap<63X0CL^Z)9(q|$Ap{xhLOPd88;+6-F?n8vjJ;`&q4N;8GsJ|w zfOK1|g>EoyO#6KSR^ugs4$3}00AxYBixvPMaV7k&(hW}}4C8o93! zi#&yxl|S>}Mi2?9$HtkYw-Fvl8B?G!@IEvS!4c@<5F-GAXMw=-LY((260Zotoj_Co zn1sfN6%cgczrkLM6(IcsY$83;^PfHdKd?KrGS7DUa>AaT| zsCjk|F`CzBjF`f-ei@yvEu%@=Yzh<7t2BQS=9mdL3vC=u5>2ngU)+`Qci_6KXD?$d z01yT&k2Rjfb)+vUj|4UWWCXMzR1=Wsd8Oo@u-hS|v+p5a%esA!%n>UrU%;R_L{kHPlyxtc|!sQzm4*Qqf8h+sY^ADdc zoAc1h!$X^n#JMAfL=lYty5srJ1#QdX6(vWhwhLV+K~=>KA3XWk$eG>e2abHRvErFe z7HoZL*UYc?9UE5%_x$iID2>Nu?#C}iQ++$%*n##zsm(%`yMU%}1Xe zkUNrV``7%^``nik9W^`qz|hCXvmXvF8~W(f=2_dGn7Q8Cx$Ta!-3Mx|@rn5tMxvEt z^B1MJ$d7-u^u)2B_Z-|?@!jInu{SChdV0+tBO93Zck5r0CLV3te`;*_?7qn8+rM{J w&Zs}M5l(;PdxN{>#?fjw{uVp&+J*yV?T5RMpIE!U-8-|Rjm?pPdpkD$1<_5cVgLXD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/violecite_furnace_front_on.png.mcmeta b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow.png.mcmeta similarity index 100% rename from src/main/resources/assets/betterend/textures/block/violecite_furnace_front_on.png.mcmeta rename to src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow.png.mcmeta diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_side.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_side.png new file mode 100644 index 0000000000000000000000000000000000000000..be7c8f10065e802047a26c75205efb7f3b47c4bb GIT binary patch literal 479 zcmV<50U-W~P)Px$nMp)JR5*=wlR<9VFc3wb4Z$K!CkE>jx`4KE+FgMzdXn}Uy=T|)qJV%vNMu5- zM;v>TE@CorlzxB!IhYy#|A(CY{PF!6pbdex>)6&cy$EaP7^4>f$niD=4k8re!+8Ju z;Q?n1Z?SfcUDL2~4pF6OL%=K+06d;q3^8654KcE`mLWz~&arZig9t;66scfo?Mstx zp9^J(lYQHDxhcSWTi1N_o*~AZWK20({`v}IN*=pC)n>!eT9(!_Pv#^B#+3P1yI5cs z3sjH9(<#R*@3TL}SgSE5_UuPODpWmQOhi-}Vq`wC`JG~b+3aNj=sCW$mSXK3Pa!bG zcyUXT@D{4aJn}3-R3}OP`s%-pZoG#O5Y&y`?`t{tuC8 V5l@%(W{Lm+002ovPDHLkV1m<4((eEO literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_top.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_top.png new file mode 100644 index 0000000000000000000000000000000000000000..080d12123f70cbbb0efc0791837dd9716c253118 GIT binary patch literal 438 zcmV;n0ZIOeP)Px$a7jc#R5*==lTB{hFc5`58-h3#od|4N_yS&MnH(VJXs^-Jc2OW`pt>@VABrPw z+J#L*w$pe30pwub@XZ^&#rJPt{{nO&(DgmHn+?w~(mKaHo?`?k`7Q+BVx*d1=I5VJ zPdE`yqjioSkB_XJBdSt$As}@P!1lmmNa+YPq(oyaLrSciW91xgF*2k?l>v>l`zHOa z0OOF(&RyS^rU1*^&4w@DGo)0CM9kUeudfg>Z2KMSn;RNyX{=?L#mNjrOnKGTHMXu% z9SJY5CBOE*=u^#S6*1U@9y!u9A!1M+Q60-hqAEj5EYD;<0RyOxh!_@&eO?dw##*Y@ zIsSyekWzVJKEgbV*)z#2FC#?Nqe9gYe|`1eMxVWh5QwVBB8nJ3we1o8d4!kO!ZK@6 z<$3Z5zw~zz?UYp!bDGM3P_4aZ?S1jWw%---drcnh@5=pMFFf4eeP|}&f)_5BNvG*! gFI+NH-dL{r2Tw;E?y{qMDF6Tf07*qoM6N<$f>6l8IRF3v literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/violecite_furnace_front_on.png b/src/main/resources/assets/betterend/textures/block/violecite_furnace_front_on.png index 38e1c90b29f1e7c4f0e8db7bd19160f3bb187cba..1656e41ddc53d41f65beb4c81038088ccaf7787a 100644 GIT binary patch delta 877 zcmdlixK4P2IF|qi8v_G_{OA9P6BWgo*zGr3O<-a-w=y!YGBlWckx32C{>K!cl9ZZa zXlap>s%vg$ny71OXp*dJVUcQ}o0Mi~o@{EGW}cXsHo1s-R((N6eo20DMt*^nOMY@` zZfahMV_tGJYHXC0VytVL zYMH8QYGRV6YhjjRu4`#(Zep60nre|^U~Z!iG7M;h0)z!IRz@FT3WftVbF!>uocxT% zj5zN&uu8$hAdz)leYw%$OAHK5qMj~}Ar`&4!MFWH90hFeUfyh6Eh@%n7RZk$%#uiMnIUktD00(*Q}>=-E6&_qH79jWz)7F^tJbZ1waV)3 zy`1+N8Jve1)J?b8H!lA78Iq-1;8Xee!P>CNr=0dBn;8fx|A$MD6zZ!|OSe?*CBBoMb++ z&hPBm_p3#sZf#=gG<_Q|TU_X2M?Lo!SKg2NoA0*jRsFqR*`UECaNKUr2cf>Qh>Q2v z`9$m#&(C(^)$L2QzS1s`plA|Jl+KkL~|QqS)Oxx4^oD+W(jKbLh*2~7Z63vCAg delta 742 zcmV)3hHrjHP~w1`sC z9snW4p&W8TP=rt={xvSGdf>(laplA{CsZLdq&z~RG$n0Ap0;DJcf;6Df>jC09Ox-4 zXZ72sXEO6?OrC7*0Kjl)>3SUeh8iXamYTsVfS&DIISh4ap- z9-G|cSkqxx2Se0sVSWjpR{IQl2(_sV7X(9f(yTkKg9i+we{fi&RG}boUILX;++Mq9 z4bAzvh2EfxCQ)2SBs`-X?tCg0Gb-eWvrerWU@j8}hvlyyE!)Hmu5dl4@u$Uf&xp|| z#UKw(UbwNbU3QIsvIdKBe`|IwTWwUl1Ga5(Zfe7GO}NX#eOC}r1b7J8Z(Gn(=#nZJ z2$gA`)81PYH9>ezu~#=&xR5(PEXYB&sTPppO>fl|9ZG$b_o(1_Rk^8n*2@97K8=$W$oO*Cqi*f&HSNRBW1aLBe6?h0`uP zkD_|~ojlloc!VZ-DH)5SPhl}m)kz`-dTi2+hyTyR3jt+-b%6H~c{uR?=-*25@Ze+M@lcSk=kwqbGUH*!!)5VsU%(;22Eb>sZMYG5X!-TQ)Qx=f`f#WA zhlih)zw?0AV9)0PV9W!~6y%JD84s7m!`(@JC`YU*4;`Ne`=9DVn1@L9!7mH5@1@Do YZ_#apl7NX%q5uE@07*qoM6N<$f}NFC_5c6? diff --git a/src/main/resources/assets/betterend/textures/block/violecite_furnace_glow.png b/src/main/resources/assets/betterend/textures/block/violecite_furnace_glow.png new file mode 100644 index 0000000000000000000000000000000000000000..1c3df136998375daa2315fbac277d45e3aadb76a GIT binary patch literal 2064 zcmc&#ZEO@p7+#>XK!a_m7D80kZBU5r?d-?hbyv=E_9{K)YAu&gjMUEV%-wBzx4Yfl za@Q)L5C~{cjL{mXU(rDPNK(!65soP~2Jikcg3inNk@CApT*DkcBb>(9MNZnLeXH4a6US9{kq zYFGaPiYk3wkGHvPv6YHuW_%EtD)!|v7C}?gvih6_wNC8PDo*M~h&em_DMRZh#H{wm zK+I~uDZQ!J#;bap<63X0CL^Z)9(q|$Ap{xhLOPd88;+6-F?n8vjJ;`&q4N;8GsJ|w zfOK1|g>EoyO#6KSR^ugs4$3}00AxYBixvPMaV7k&(hW}}4C8o93! zi#&yxl|S>}Mi2?9$HtkYw-Fvl8B?G!@IEvS!4c@<5F-GAXMw=-LY((260Zotoj_Co zn1sfN6%cgczrkLM6(IcsY$83;^PfHdKd?KrGS7DUa>AaT| zsCjk|F`CzBjF`f-ei@yvEu%@=Yzh<7t2BQS=9mdL3vC=u5>2ngU)+`Qci_6KXD?$d z01yT&k2Rjfb)+vUj|4UWWCXMzR1=Wsd8Oo@u-hS|v+p5a%esA!%n>UrU%;R_L{kHPlyxtc|!sQzm4*Qqf8h+sY^ADdc zoAc1h!$X^n#JMAfL=lYty5srJ1#QdX6(vWhwhLV+K~=>KA3XWk$eG>e2abHRvErFe z7HoZL*UYc?9UE5%_x$iID2>Nu?#C}iQ++$%*n##zsm(%`yMU%}1Xe zkUNrV``7%^``nik9W^`qz|hCXvmXvF8~W(f=2_dGn7Q8Cx$Ta!-3Mx|@rn5tMxvEt z^B1MJ$d7-u^u)2B_Z-|?@!jInu{SChdV0+tBO93Zck5r0CLV3te`;*_?7qn8+rM{J w&Zs}M5l(;PdxN{>#?fjw{uVp&+J*yV?T5RMpIE!U-8-|Rjm?pPdpkD$1<_5cVgLXD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/violecite_furnace_glow.png.mcmeta b/src/main/resources/assets/betterend/textures/block/violecite_furnace_glow.png.mcmeta new file mode 100644 index 00000000..98b9ae71 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/violecite_furnace_glow.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} From 7e367a1971ee93173bba97fc3f6f20004a2d099b Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sat, 13 Feb 2021 00:15:11 +0300 Subject: [PATCH 267/463] Anvil crafting fixes --- .../ru/betterend/blocks/AeterniumAnvil.java | 47 ++++--------------- .../betterend/blocks/basis/EndAnvilBlock.java | 10 ++-- .../ru/betterend/config/ConfigKeeper.java | 3 +- .../AnvilScreenHandlerExtended.java | 20 ++++---- .../mixin/common/AnvilBlockMixin.java | 15 ++++-- .../mixin/common/AnvilScreenHandlerMixin.java | 42 ++++++++++------- .../ru/betterend/recipe/AnvilRecipes.java | 13 ++--- .../recipe/builders/AnvilRecipe.java | 7 ++- .../java/ru/betterend/registry/EndTags.java | 2 + 9 files changed, 76 insertions(+), 83 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/AeterniumAnvil.java b/src/main/java/ru/betterend/blocks/AeterniumAnvil.java index c0268a3b..c66b29eb 100644 --- a/src/main/java/ru/betterend/blocks/AeterniumAnvil.java +++ b/src/main/java/ru/betterend/blocks/AeterniumAnvil.java @@ -8,68 +8,37 @@ import java.util.Map; import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.AnvilBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; +import net.minecraft.block.*; import net.minecraft.item.ItemStack; import net.minecraft.loot.context.LootContext; import net.minecraft.state.StateManager; import net.minecraft.state.property.IntProperty; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; +import ru.betterend.blocks.basis.EndAnvilBlock; import ru.betterend.item.material.EndToolMaterial; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; import ru.betterend.registry.EndBlocks; -public class AeterniumAnvil extends AnvilBlock implements BlockPatterned { +public class AeterniumAnvil extends EndAnvilBlock { public static final IntProperty DESTRUCTION = BlockProperties.DESTRUCTION_LONG; - private final int level; public AeterniumAnvil() { - super(FabricBlockSettings.copyOf(Blocks.ANVIL).materialColor(EndBlocks.AETERNIUM_BLOCK.getDefaultMaterialColor())); - this.level = EndToolMaterial.AETERNIUM.getMiningLevel(); + super(EndBlocks.AETERNIUM_BLOCK.getDefaultMaterialColor(), EndToolMaterial.AETERNIUM.getMiningLevel()); } @Override protected void appendProperties(StateManager.Builder builder) { - super.appendProperties(builder); builder.add(DESTRUCTION); + builder.add(FACING); } - public int getCraftingLevel() { - return level; - } - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - return Collections.singletonList(new ItemStack(this)); + public IntProperty getDestructionProperty() { + return DESTRUCTION; } - - @Override - public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); - return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); - } - - @Override - public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); - Map map = Maps.newHashMap(); - map.put("%anvil%", blockId.getPath()); - map.put("%top%", getTop(blockId, block)); - return Patterns.createJson(Patterns.BLOCK_ANVIL, map); - } - - private String getTop(Identifier blockId, String block) { - if (block.contains("item")) { - return blockId.getPath() + "_top_0"; - } - char last = block.charAt(block.length() - 1); - return blockId.getPath() + "_top_" + last; - } - + @Override public Identifier statePatternId() { return Patterns.STATE_ANVIL_LONG; diff --git a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java index b63cd2d0..f56221fa 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java @@ -25,7 +25,7 @@ import ru.betterend.patterns.Patterns; public class EndAnvilBlock extends AnvilBlock implements BlockPatterned { public static final IntProperty DESTRUCTION = BlockProperties.DESTRUCTION; - private final int level; + protected final int level; public EndAnvilBlock(MaterialColor color, int level) { super(FabricBlockSettings.copyOf(Blocks.ANVIL).materialColor(color)); @@ -38,6 +38,10 @@ public class EndAnvilBlock extends AnvilBlock implements BlockPatterned { builder.add(DESTRUCTION); } + public IntProperty getDestructionProperty() { + return DESTRUCTION; + } + public int getCraftingLevel() { return level; } @@ -61,8 +65,8 @@ public class EndAnvilBlock extends AnvilBlock implements BlockPatterned { map.put("%top%", getTop(blockId, block)); return Patterns.createJson(Patterns.BLOCK_ANVIL, map); } - - private String getTop(Identifier blockId, String block) { + + protected String getTop(Identifier blockId, String block) { if (block.contains("item")) { return blockId.getPath() + "_top_0"; } diff --git a/src/main/java/ru/betterend/config/ConfigKeeper.java b/src/main/java/ru/betterend/config/ConfigKeeper.java index 5c951bd6..84133efc 100644 --- a/src/main/java/ru/betterend/config/ConfigKeeper.java +++ b/src/main/java/ru/betterend/config/ConfigKeeper.java @@ -17,8 +17,7 @@ import ru.betterend.util.JsonFactory; public final class ConfigKeeper { - private Map> configEntries = Maps.newHashMap(); - + private final Map> configEntries = Maps.newHashMap(); private final JsonObject configObject; private final ConfigWriter writer; diff --git a/src/main/java/ru/betterend/interfaces/AnvilScreenHandlerExtended.java b/src/main/java/ru/betterend/interfaces/AnvilScreenHandlerExtended.java index 37c04cf2..9146ab8e 100644 --- a/src/main/java/ru/betterend/interfaces/AnvilScreenHandlerExtended.java +++ b/src/main/java/ru/betterend/interfaces/AnvilScreenHandlerExtended.java @@ -5,27 +5,29 @@ import java.util.List; import ru.betterend.recipe.builders.AnvilRecipe; public interface AnvilScreenHandlerExtended { - public void be_updateCurrentRecipe(AnvilRecipe recipe); - public AnvilRecipe be_getCurrentRecipe(); - public List be_getRecipes(); + void be_updateCurrentRecipe(AnvilRecipe recipe); + AnvilRecipe be_getCurrentRecipe(); + List be_getRecipes(); default void be_nextRecipe() { - List recipes = this.be_getRecipes(); - AnvilRecipe current = this.be_getCurrentRecipe(); + List recipes = be_getRecipes(); + if (recipes.size() < 2) return; + AnvilRecipe current = be_getCurrentRecipe(); int i = recipes.indexOf(current) + 1; if (i >= recipes.size()) { i = 0; } - this.be_updateCurrentRecipe(recipes.get(i)); + be_updateCurrentRecipe(recipes.get(i)); } default void be_previousRecipe() { - List recipes = this.be_getRecipes(); - AnvilRecipe current = this.be_getCurrentRecipe(); + List recipes = be_getRecipes(); + if (recipes.size() < 2) return; + AnvilRecipe current = be_getCurrentRecipe(); int i = recipes.indexOf(current) - 1; if (i <= 0) { i = recipes.size() - 1; } - this.be_updateCurrentRecipe(recipes.get(i)); + be_updateCurrentRecipe(recipes.get(i)); } } diff --git a/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java index 9e73f468..a422c461 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java @@ -1,5 +1,6 @@ package ru.betterend.mixin.common; +import net.minecraft.state.property.IntProperty; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -15,10 +16,16 @@ public class AnvilBlockMixin { @Inject(method = "getLandingState", at = @At("HEAD"), cancellable = true) private static void be_getLandingState(BlockState fallingState, CallbackInfoReturnable info) { if (fallingState.getBlock() instanceof EndAnvilBlock) { - int destruction = fallingState.get(BlockProperties.DESTRUCTION); - BlockState state = (destruction < 2) ? fallingState.with(BlockProperties.DESTRUCTION, destruction + 1) : null; - info.setReturnValue(state); - info.cancel(); + IntProperty destructionProperty = ((EndAnvilBlock) fallingState.getBlock()).getDestructionProperty(); + int destruction = fallingState.get(destructionProperty); + try { + BlockState state = fallingState.with(destructionProperty, destruction + 1); + info.setReturnValue(state); + info.cancel(); + } catch (Exception ex) { + info.setReturnValue(null); + info.cancel(); + } } } } diff --git a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java index cc92009d..f672562f 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java @@ -4,6 +4,7 @@ import java.util.Collections; import java.util.List; import java.util.stream.Collectors; +import net.minecraft.screen.*; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -18,10 +19,6 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.ItemStack; import net.minecraft.recipe.RecipeManager; -import net.minecraft.screen.AnvilScreenHandler; -import net.minecraft.screen.ForgingScreenHandler; -import net.minecraft.screen.ScreenHandlerContext; -import net.minecraft.screen.ScreenHandlerType; import net.minecraft.tag.BlockTags; import ru.betterend.blocks.basis.EndAnvilBlock; import ru.betterend.interfaces.AnvilScreenHandlerExtended; @@ -32,11 +29,26 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler imple private List be_recipes = Collections.emptyList(); private AnvilRecipe be_currentRecipe; - + private Property anvilLevel; + public AnvilScreenHandlerMixin(ScreenHandlerType type, int syncId, PlayerInventory playerInventory, ScreenHandlerContext context) { super(type, syncId, playerInventory, context); } + + @Inject(method = "*", at = @At("TAIL")) + public void be_initAnvilLevel(int syncId, PlayerInventory inventory, ScreenHandlerContext context, CallbackInfo info) { + int anvLevel = context.run((world, blockPos) -> { + Block anvilBlock = world.getBlockState(blockPos).getBlock(); + if (anvilBlock instanceof EndAnvilBlock) { + return ((EndAnvilBlock) anvilBlock).getCraftingLevel(); + } + return 1; + }, 1); + Property anvilLevel = Property.create(); + anvilLevel.set(anvLevel); + this.anvilLevel = addProperty(anvilLevel); + } @Shadow public abstract void updateResult(); @@ -76,25 +88,19 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler imple @Inject(method = "updateResult", at = @At("HEAD"), cancellable = true) public void be_updateOutput(CallbackInfo info) { RecipeManager recipeManager = this.player.world.getRecipeManager(); - this.be_recipes = recipeManager.getAllMatches(AnvilRecipe.TYPE, input, player.world); + be_recipes = recipeManager.getAllMatches(AnvilRecipe.TYPE, input, player.world); if (be_recipes.size() > 0) { - this.context.run((world, blockPos) -> { - int anvilLevel; - Block anvilBlock = world.getBlockState(blockPos).getBlock(); - if (anvilBlock instanceof EndAnvilBlock) { - anvilLevel = ((EndAnvilBlock) anvilBlock).getCraftingLevel(); - } else { - anvilLevel = 1; - } - this.be_recipes = be_recipes.stream().filter(recipe -> + int anvilLevel = this.anvilLevel.get(); + be_recipes = be_recipes.stream().filter(recipe -> anvilLevel >= recipe.getAnvilLevel()).collect(Collectors.toList()); - }); if (be_recipes.size() > 0) { if (be_currentRecipe == null || !be_recipes.contains(be_currentRecipe)) { - this.be_currentRecipe = be_recipes.get(0); + be_currentRecipe = be_recipes.get(0); } - this.be_updateResult(); + be_updateResult(); info.cancel(); + } else { + be_currentRecipe = null; } } } diff --git a/src/main/java/ru/betterend/recipe/AnvilRecipes.java b/src/main/java/ru/betterend/recipe/AnvilRecipes.java index 9509c3c9..2a4db6a7 100644 --- a/src/main/java/ru/betterend/recipe/AnvilRecipes.java +++ b/src/main/java/ru/betterend/recipe/AnvilRecipes.java @@ -20,45 +20,46 @@ public class AnvilRecipes { .setDamage(3) .build(); + int anvilLevel = EndToolMaterial.AETERNIUM.getMiningLevel(); AnvilRecipe.Builder.create("aeternium_axe_head") .setInput(EndItems.AETERNIUM_INGOT) .setOutput(EndItems.AETERNIUM_AXE_HEAD) - .setAnvilLevel(EndToolMaterial.AETERNIUM.getDurability()) + .setAnvilLevel(anvilLevel) .setToolLevel(4) .setDamage(6) .build(); AnvilRecipe.Builder.create("aeternium_pickaxe_head") .setInput(EndItems.AETERNIUM_INGOT) .setOutput(EndItems.AETERNIUM_PICKAXE_HEAD) - .setAnvilLevel(EndToolMaterial.AETERNIUM.getDurability()) + .setAnvilLevel(anvilLevel) .setToolLevel(4) .setDamage(6) .build(); AnvilRecipe.Builder.create("aeternium_shovel_head") .setInput(EndItems.AETERNIUM_INGOT) .setOutput(EndItems.AETERNIUM_SHOVEL_HEAD) - .setAnvilLevel(EndToolMaterial.AETERNIUM.getDurability()) + .setAnvilLevel(anvilLevel) .setToolLevel(4) .setDamage(6) .build(); AnvilRecipe.Builder.create("aeternium_hoe_head") .setInput(EndItems.AETERNIUM_INGOT) .setOutput(EndItems.AETERNIUM_HOE_HEAD) - .setAnvilLevel(EndToolMaterial.AETERNIUM.getDurability()) + .setAnvilLevel(anvilLevel) .setToolLevel(4) .setDamage(6) .build(); AnvilRecipe.Builder.create("aeternium_hammer_head") .setInput(EndItems.AETERNIUM_INGOT) .setOutput(EndItems.AETERNIUM_HAMMER_HEAD) - .setAnvilLevel(EndToolMaterial.AETERNIUM.getDurability()) + .setAnvilLevel(anvilLevel) .setToolLevel(4) .setDamage(6) .build(); AnvilRecipe.Builder.create("aeternium_sword_blade") .setInput(EndItems.AETERNIUM_INGOT) .setOutput(EndItems.AETERNIUM_SWORD_BLADE) - .setAnvilLevel(EndToolMaterial.AETERNIUM.getDurability()) + .setAnvilLevel(anvilLevel) .setToolLevel(4) .setDamage(6) .build(); diff --git a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java index 24aa4047..13cc06d4 100644 --- a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java @@ -161,6 +161,11 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { return Objects.hash(id, input, output, damage, toolLevel); } + @Override + public String toString() { + return "AnvilRecipe [" + id + "]"; + } + public static class Builder { private final static Builder INSTANCE = new Builder(); @@ -299,7 +304,5 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { packetBuffer.writeVarInt(recipe.anvilLevel); packetBuffer.writeVarInt(recipe.damage); } - - } } diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index 0a6c9cb2..218b97ea 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -22,6 +22,7 @@ import net.minecraft.world.biome.Biome.Category; import net.minecraft.world.gen.surfacebuilder.SurfaceConfig; import ru.betterend.BetterEnd; import ru.betterend.blocks.EndTerrainBlock; +import ru.betterend.blocks.basis.EndAnvilBlock; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.basis.SimpleLeavesBlock; import ru.betterend.blocks.basis.VineBlock; @@ -113,6 +114,7 @@ public class EndTags { )); TagHelper.addTag(FURNACES, Blocks.FURNACE); + TagHelper.addTag(BlockTags.ANVIL, EndBlocks.AETERNIUM_ANVIL); } public static void addSurfaceBlock(Block block) { From 4480d72344c2ddaf57ee8d3cae12e496181f3e46 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 13 Feb 2021 00:22:29 +0300 Subject: [PATCH 268/463] Cleanup & version change --- gradle.properties | 2 +- .../java/ru/betterend/blocks/AeterniumAnvil.java | 15 ++------------- .../betterend/mixin/common/AnvilBlockMixin.java | 3 +-- .../mixin/common/AnvilScreenHandlerMixin.java | 6 +++++- src/main/java/ru/betterend/registry/EndTags.java | 1 - 5 files changed, 9 insertions(+), 18 deletions(-) diff --git a/gradle.properties b/gradle.properties index 7794c06d..d31d8a17 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ loader_version=0.10.8 # Mod Properties - mod_version = 0.8.9-beta + mod_version = 0.9.0-pre maven_group = ru.betterend archives_base_name = better-end diff --git a/src/main/java/ru/betterend/blocks/AeterniumAnvil.java b/src/main/java/ru/betterend/blocks/AeterniumAnvil.java index c66b29eb..d997ce9d 100644 --- a/src/main/java/ru/betterend/blocks/AeterniumAnvil.java +++ b/src/main/java/ru/betterend/blocks/AeterniumAnvil.java @@ -1,23 +1,12 @@ package ru.betterend.blocks; -import java.io.Reader; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import com.google.common.collect.Maps; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.*; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; import net.minecraft.state.StateManager; import net.minecraft.state.property.IntProperty; import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; import ru.betterend.blocks.basis.EndAnvilBlock; import ru.betterend.item.material.EndToolMaterial; -import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; import ru.betterend.registry.EndBlocks; diff --git a/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java index a422c461..130df457 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java @@ -1,6 +1,5 @@ package ru.betterend.mixin.common; -import net.minecraft.state.property.IntProperty; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -8,7 +7,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.block.AnvilBlock; import net.minecraft.block.BlockState; -import ru.betterend.blocks.BlockProperties; +import net.minecraft.state.property.IntProperty; import ru.betterend.blocks.basis.EndAnvilBlock; @Mixin(AnvilBlock.class) diff --git a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java index f672562f..89da01cd 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java @@ -4,7 +4,6 @@ import java.util.Collections; import java.util.List; import java.util.stream.Collectors; -import net.minecraft.screen.*; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -19,6 +18,11 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.ItemStack; import net.minecraft.recipe.RecipeManager; +import net.minecraft.screen.AnvilScreenHandler; +import net.minecraft.screen.ForgingScreenHandler; +import net.minecraft.screen.Property; +import net.minecraft.screen.ScreenHandlerContext; +import net.minecraft.screen.ScreenHandlerType; import net.minecraft.tag.BlockTags; import ru.betterend.blocks.basis.EndAnvilBlock; import ru.betterend.interfaces.AnvilScreenHandlerExtended; diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index 218b97ea..6cfa8e76 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -22,7 +22,6 @@ import net.minecraft.world.biome.Biome.Category; import net.minecraft.world.gen.surfacebuilder.SurfaceConfig; import ru.betterend.BetterEnd; import ru.betterend.blocks.EndTerrainBlock; -import ru.betterend.blocks.basis.EndAnvilBlock; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.basis.SimpleLeavesBlock; import ru.betterend.blocks.basis.VineBlock; From 775e2f6a8e1d75cb32689fc25529c68079bff589 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sat, 13 Feb 2021 13:52:49 +0300 Subject: [PATCH 269/463] REI anvil recipes display improvement --- .../integration/rei/REIAnvilCategory.java | 30 ++++++++++++++----- .../integration/rei/REIAnvilDisplay.java | 12 +++++--- .../betterend/integration/rei/REIPlugin.java | 21 +++++++++++-- .../ru/betterend/recipe/AlloyingRecipes.java | 4 +-- 4 files changed, 51 insertions(+), 16 deletions(-) diff --git a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java index 5c58bcd5..d502e812 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java @@ -2,7 +2,10 @@ package ru.betterend.integration.rei; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; +import net.minecraft.block.Block; +import net.minecraft.item.BlockItem; import org.jetbrains.annotations.NotNull; import com.google.common.collect.Lists; @@ -21,6 +24,7 @@ import net.minecraft.client.gui.DrawableHelper; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.TranslatableText; import net.minecraft.util.Identifier; +import ru.betterend.blocks.basis.EndAnvilBlock; import ru.betterend.util.LangUtil; public class REIAnvilCategory implements TransferRecipeCategory { @@ -37,7 +41,7 @@ public class REIAnvilCategory implements TransferRecipeCategory @Override public @NotNull EntryStack getLogo() { - return REIPlugin.ANVIL; + return REIPlugin.ANVILS.get(0); } @Override @@ -47,16 +51,26 @@ public class REIAnvilCategory implements TransferRecipeCategory widgets.add(Widgets.createRecipeBase(bounds)); int x = startPoint.x + 10; int y = startPoint.y; - widgets.add(Widgets.createResultSlotBackground(new Point(x + 61, y + 4))); + widgets.add(Widgets.createResultSlotBackground(new Point(x + 61, y + 5))); List> inputEntries = display.getInputEntries(); List materials = inputEntries.get(1); + int anvilLevel = display.getAnvilLevel(); + List anvils = REIPlugin.ANVILS.stream().filter(anvil -> { + Block block = ((BlockItem) anvil.getItem()).getBlock(); + if (block instanceof EndAnvilBlock) { + return ((EndAnvilBlock) block).getCraftingLevel() >= anvilLevel; + } + return anvilLevel == 1; + }).collect(Collectors.toList()); materials.forEach(entryStack -> entryStack.setAmount(display.getInputCount())); - widgets.add(Widgets.createArrow(new Point(x + 24, y + 3))); - widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width - 5, bounds.y + bounds.height - 12), + widgets.add(Widgets.createArrow(new Point(x + 24, y + 4))); + widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width - 7, bounds.y + bounds.height - 15), new TranslatableText("category.rei.damage.amount&dmg", display.getDamage())).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); - widgets.add(Widgets.createSlot(new Point(x - 20, y + 3)).entries(materials).markInput()); - widgets.add(Widgets.createSlot(new Point(x + 1, y + 3)).entries(inputEntries.get(0)).markInput()); - widgets.add(Widgets.createSlot(new Point(x + 61, y + 4)).entries(display.getResultingEntries().get(0)).disableBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(x - 20, y + 4)).entries(materials).markInput()); + widgets.add(Widgets.createSlot(new Point(x + 1, y + 4)).entries(inputEntries.get(0)).markInput()); + widgets.add(Widgets.createSlot(new Point(x + 61, y + 5)).entries(display.getResultingEntries().get(0)).disableBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(x - 9, y + 25)).entries(anvils)); + return widgets; } @@ -80,7 +94,7 @@ public class REIAnvilCategory implements TransferRecipeCategory @Override public int getDisplayHeight() { - return 49; + return 60; } } diff --git a/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java b/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java index 518bfcfe..3381f2fb 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java @@ -27,11 +27,15 @@ public class REIAnvilDisplay implements TransferRecipeDisplay { } public int getDamage() { - return this.recipe.getDamage(); + return recipe.getDamage(); } public int getInputCount() { - return this.recipe.getInputCount(); + return recipe.getInputCount(); + } + + public int getAnvilLevel() { + return recipe.getAnvilLevel(); } @Override @@ -56,7 +60,7 @@ public class REIAnvilDisplay implements TransferRecipeDisplay { @Override public @NotNull List> getRequiredEntries() { - return this.input; + return input; } @Override @@ -72,6 +76,6 @@ public class REIAnvilDisplay implements TransferRecipeDisplay { @Override public List> getOrganisedInputEntries(ContainerInfo containerInfo, ScreenHandler container) { - return this.input; + return input; } } diff --git a/src/main/java/ru/betterend/integration/rei/REIPlugin.java b/src/main/java/ru/betterend/integration/rei/REIPlugin.java index ad41e411..2c6f12f1 100644 --- a/src/main/java/ru/betterend/integration/rei/REIPlugin.java +++ b/src/main/java/ru/betterend/integration/rei/REIPlugin.java @@ -1,18 +1,29 @@ package ru.betterend.integration.rei; +import com.google.common.collect.Lists; import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.RecipeHelper; import me.shedaniel.rei.api.plugins.REIPluginV0; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.block.Block; import net.minecraft.block.Blocks; +import net.minecraft.item.BlockItem; +import net.minecraft.item.ItemConvertible; import net.minecraft.recipe.BlastingRecipe; +import net.minecraft.recipe.Ingredient; +import net.minecraft.tag.BlockTags; import net.minecraft.util.Identifier; import ru.betterend.BetterEnd; +import ru.betterend.blocks.basis.EndAnvilBlock; import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.recipe.builders.AnvilRecipe; import ru.betterend.recipe.builders.InfusionRecipe; import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndItems; + +import java.util.List; +import java.util.stream.Collectors; @Environment(EnvType.CLIENT) public class REIPlugin implements REIPluginV0 { @@ -24,7 +35,7 @@ public class REIPlugin implements REIPluginV0 { public final static EntryStack END_STONE_SMELTER = EntryStack.create(EndBlocks.END_STONE_SMELTER); public final static EntryStack INFUSION_RITUAL = EntryStack.create(EndBlocks.INFUSION_PEDESTAL); - public final static EntryStack ANVIL = EntryStack.create(Blocks.ANVIL); + public final static List ANVILS; @Override public Identifier getPluginIdentifier() { @@ -43,7 +54,7 @@ public class REIPlugin implements REIPluginV0 { public void registerOthers(RecipeHelper recipeHelper) { recipeHelper.registerWorkingStations(ALLOYING, END_STONE_SMELTER); recipeHelper.registerWorkingStations(INFUSION, INFUSION_RITUAL); - recipeHelper.registerWorkingStations(SMITHING, ANVIL); + recipeHelper.registerWorkingStations(SMITHING, ANVILS.toArray(new EntryStack[]{})); recipeHelper.removeAutoCraftButton(SMITHING); } @@ -53,4 +64,10 @@ public class REIPlugin implements REIPluginV0 { new REIInfusionCategory(), new REIAnvilCategory()); } + + static { + ANVILS = Lists.newArrayList(EntryStack.ofItems(EndItems.getModBlocks().stream() + .filter(item -> ((BlockItem) item).getBlock() instanceof EndAnvilBlock).collect(Collectors.toList()))); + ANVILS.add(0, EntryStack.create(Blocks.ANVIL)); + } } diff --git a/src/main/java/ru/betterend/recipe/AlloyingRecipes.java b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java index 10d63003..aade6259 100644 --- a/src/main/java/ru/betterend/recipe/AlloyingRecipes.java +++ b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java @@ -22,7 +22,7 @@ public class AlloyingRecipes { .setInput(Blocks.ANCIENT_DEBRIS, Blocks.ANCIENT_DEBRIS) .setOutput(Items.NETHERITE_SCRAP, 3) .setExpiriense(6F) - .setSmeltTime(500) + .setSmeltTime(1000) .build(); AlloyingRecipe.Builder.create("terminite_ingot") .setInput(Items.IRON_INGOT, EndItems.ENDER_DUST) @@ -34,7 +34,7 @@ public class AlloyingRecipes { .setInput(EndBlocks.TERMINITE.ingot, Items.NETHERITE_INGOT) .setOutput(EndItems.AETERNIUM_INGOT, 1) .setExpiriense(4.5F) - .setSmeltTime(600) + .setSmeltTime(850) .build(); AlloyingRecipe.Builder.create("terminite_ingot_thallasium") .setInput(EndBlocks.THALLASIUM.ingot, EndItems.ENDER_DUST) From 09403054156d029259ee3ce0eadb4f96806036ea Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 13 Feb 2021 14:12:25 +0300 Subject: [PATCH 270/463] Merge --- gradle.properties | 2 +- .../betterend/integration/rei/REIAnvilCategory.java | 4 ++-- .../java/ru/betterend/integration/rei/REIPlugin.java | 11 ++++------- src/main/java/ru/betterend/recipe/FurnaceRecipes.java | 1 + 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/gradle.properties b/gradle.properties index d31d8a17..091f260e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ loader_version=0.10.8 # Mod Properties - mod_version = 0.9.0-pre + mod_version = 0.9.1-pre maven_group = ru.betterend archives_base_name = better-end diff --git a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java index d502e812..7ba9e210 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java @@ -4,8 +4,6 @@ import java.util.Collections; import java.util.List; import java.util.stream.Collectors; -import net.minecraft.block.Block; -import net.minecraft.item.BlockItem; import org.jetbrains.annotations.NotNull; import com.google.common.collect.Lists; @@ -19,9 +17,11 @@ import me.shedaniel.rei.api.widgets.Widgets; import me.shedaniel.rei.gui.entries.RecipeEntry; import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; import me.shedaniel.rei.gui.widget.Widget; +import net.minecraft.block.Block; import net.minecraft.block.Blocks; import net.minecraft.client.gui.DrawableHelper; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.item.BlockItem; import net.minecraft.text.TranslatableText; import net.minecraft.util.Identifier; import ru.betterend.blocks.basis.EndAnvilBlock; diff --git a/src/main/java/ru/betterend/integration/rei/REIPlugin.java b/src/main/java/ru/betterend/integration/rei/REIPlugin.java index 2c6f12f1..913b9db7 100644 --- a/src/main/java/ru/betterend/integration/rei/REIPlugin.java +++ b/src/main/java/ru/betterend/integration/rei/REIPlugin.java @@ -1,18 +1,18 @@ package ru.betterend.integration.rei; +import java.util.List; +import java.util.stream.Collectors; + import com.google.common.collect.Lists; + import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.RecipeHelper; import me.shedaniel.rei.api.plugins.REIPluginV0; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.block.Block; import net.minecraft.block.Blocks; import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemConvertible; import net.minecraft.recipe.BlastingRecipe; -import net.minecraft.recipe.Ingredient; -import net.minecraft.tag.BlockTags; import net.minecraft.util.Identifier; import ru.betterend.BetterEnd; import ru.betterend.blocks.basis.EndAnvilBlock; @@ -22,9 +22,6 @@ import ru.betterend.recipe.builders.InfusionRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; -import java.util.List; -import java.util.stream.Collectors; - @Environment(EnvType.CLIENT) public class REIPlugin implements REIPluginV0 { diff --git a/src/main/java/ru/betterend/recipe/FurnaceRecipes.java b/src/main/java/ru/betterend/recipe/FurnaceRecipes.java index 3c664ec5..8f5546bb 100644 --- a/src/main/java/ru/betterend/recipe/FurnaceRecipes.java +++ b/src/main/java/ru/betterend/recipe/FurnaceRecipes.java @@ -13,5 +13,6 @@ public class FurnaceRecipes { FurnaceRecipe.make("end_berry", EndItems.SHADOW_BERRY_RAW, EndItems.SHADOW_BERRY_COOKED).build(); FurnaceRecipe.make("end_fish", EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED).build(); FurnaceRecipe.make("slime_ball", EndBlocks.JELLYSHROOM_CAP_PURPLE, Items.SLIME_BALL).build(); + FurnaceRecipe.make("menger_sponge", EndBlocks.MENGER_SPONGE_WET, EndBlocks.MENGER_SPONGE).build(); } } From cbdf79d0f12c4c3c2386f64adb058c933356a378 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 13 Feb 2021 22:15:16 +0300 Subject: [PATCH 271/463] Boolean null pointer fix (issue #91) --- .../java/ru/betterend/integration/byg/BYGIntegration.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java index 475d608a..ffa7d743 100644 --- a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java +++ b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java @@ -51,8 +51,8 @@ public class BYGIntegration extends ModIntegration { endBiome.setEdge(edgeBiome); } else { - boolean isVoid = this.getAndExecuteRuntime(biomeClass, obj, "isVoid"); - if (isVoid) { + Boolean isVoid = this.getAndExecuteRuntime(biomeClass, obj, "isVoid"); + if (isVoid != null && isVoid.booleanValue()) { EndBiomes.LAND_BIOMES.removeMutableBiome(biomeID); EndBiomes.VOID_BIOMES.addBiomeMutable(endBiome); } From f57df6ac0bee70bbae4a2cfd1d06794ceed129e2 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 13 Feb 2021 22:17:40 +0300 Subject: [PATCH 272/463] Door recipe fix --- src/main/java/ru/betterend/blocks/complex/MetalMaterial.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index 01728e0e..38ece37a 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -154,7 +154,7 @@ public class MetalMaterial { GridRecipe.make(name + "_tile", tile).setOutputCount(4).setShape("##", "##").addMaterial('#', block).setGroup("end_metal_tiles").build(); GridRecipe.make(name + "_bars", bars).setOutputCount(16).setShape("###", "###").addMaterial('#', ingot).setGroup("end_metal_bars").build(); GridRecipe.make(name + "_plate", plate).setShape("##").addMaterial('#', ingot).setGroup("end_metal_plates").build(); - GridRecipe.make(name + "_door", door).setOutputCount(3).setOutputCount(16).setShape("##", "##", "##").addMaterial('#', ingot).setGroup("end_metal_doors").build(); + GridRecipe.make(name + "_door", door).setOutputCount(3).setShape("##", "##", "##").addMaterial('#', ingot).setGroup("end_metal_doors").build(); GridRecipe.make(name + "_trapdoor", trapdoor).setShape("##", "##").addMaterial('#', ingot).setGroup("end_metal_trapdoors").build(); GridRecipe.make(name + "_stairs", stairs).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', block, tile).setGroup("end_metal_stairs").build(); GridRecipe.make(name + "_slab", slab).setOutputCount(6).setShape("###").addMaterial('#', block, tile).setGroup("end_metal_slabs").build(); From 70d44fa825f3c62a1a32a6bc78560cd1be269e13 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 13 Feb 2021 23:47:16 +0300 Subject: [PATCH 273/463] Fixed missing vines & texture overlays --- .../ru/betterend/blocks/AeterniumAnvil.java | 2 +- .../betterend/blocks/basis/EndAnvilBlock.java | 2 +- .../ru/betterend/blocks/basis/VineBlock.java | 4 ++ .../betterend/world/features/VineFeature.java | 40 ++++++++++++++++-- .../textures/block/bulb_moss_bulbs_e.png | Bin 0 -> 1584 bytes .../betterend/textures/block/bulb_vine_e.png | Bin 0 -> 1829 bytes .../textures/block/bulb_vine_e.png.mcmeta | 6 +++ .../block/bulb_vine_lantern_bulb_e.png | Bin 0 -> 416 bytes .../block/bulb_vine_lantern_bulb_e.png.mcmeta | 6 +++ .../block/bulb_vine_lantern_overlay_e.png | Bin 0 -> 284 bytes .../bulb_vine_lantern_overlay_e.png.mcmeta | 6 +++ .../textures/block/bulb_vine_seed_0_e.png | Bin 0 -> 1444 bytes .../textures/block/bulb_vine_seed_1_e.png | Bin 0 -> 1458 bytes .../textures/block/bulb_vine_seed_2_e.png | Bin 0 -> 1466 bytes .../textures/block/bulb_vine_seed_3_e.png | Bin 0 -> 1464 bytes .../textures/block/crystal_grass_1.png | Bin 447 -> 0 bytes .../block/end_stone_furnace_front_on.png | Bin 873 -> 2450 bytes .../textures/block/end_stone_furnace_glow.png | Bin 0 -> 1826 bytes ...meta => end_stone_furnace_glow.png.mcmeta} | 0 .../block/end_stone_furnace_glow_e.png | Bin 0 -> 1826 bytes .../block/end_stone_furnace_glow_e.png.mcmeta | 12 ++++++ .../block/flavolite_furnace_glow_e.png | Bin 0 -> 2064 bytes .../block/flavolite_furnace_glow_e.png.mcmeta | 12 ++++++ .../block/glowing_pillar_seed_0_e.png | Bin 0 -> 1459 bytes .../block/glowing_pillar_seed_1_e.png | Bin 0 -> 1458 bytes .../block/glowing_pillar_seed_2_e.png | Bin 0 -> 1529 bytes .../block/glowing_pillar_seed_3_e.png | Bin 0 -> 1623 bytes .../block/gold_chandelier_floor_e.png | Bin 0 -> 1454 bytes .../textures/block/gold_chandelier_wall_e.png | Bin 0 -> 1474 bytes .../block/hydralux_flower_bottom_e.png | Bin 0 -> 1448 bytes .../textures/block/hydralux_flower_bud_e.png | Bin 0 -> 1483 bytes .../hydralux_flower_bud_petal_side_e.png | Bin 0 -> 207 bytes .../block/hydralux_flower_bud_petal_top_e.png | Bin 0 -> 196 bytes .../block/hydralux_flower_petal_e.png | Bin 0 -> 248 bytes .../textures/block/hydralux_sapling_1_e.png | Bin 0 -> 1479 bytes .../textures/block/hydralux_sapling_2_e.png | Bin 0 -> 1523 bytes .../textures/block/hydralux_sapling_3_e.png | Bin 0 -> 1530 bytes .../textures/block/hydralux_sapling_4_e.png | Bin 0 -> 1520 bytes .../block/iron_chandelier_floor_e.png | Bin 0 -> 1454 bytes .../textures/block/iron_chandelier_wall_e.png | Bin 0 -> 1474 bytes .../block/mossy_glowshroom_sapling_e.png | Bin 0 -> 1727 bytes .../block/sulphuric_rock_furnace_glow_e.png | Bin 0 -> 2064 bytes .../sulphuric_rock_furnace_glow_e.png.mcmeta | 12 ++++++ ...eilt.png => terminite_chandelier_ceil.png} | Bin .../block/terminite_chandelier_floor_e.png | Bin 0 -> 1468 bytes .../block/terminite_chandelier_wall_e.png | Bin 0 -> 1468 bytes .../block/thallasium_chandelier_floor_e.png | Bin 0 -> 1454 bytes .../block/thallasium_chandelier_wall_e.png | Bin 136 -> 1474 bytes .../block/violecite_furnace_glow_e.png | Bin 0 -> 2064 bytes .../block/violecite_furnace_glow_e.png.mcmeta | 12 ++++++ .../{cave_moss => 00_cave_moss}/0.png | Bin .../{cave_moss => 00_cave_moss}/1.png | Bin .../{cave_moss => 00_cave_moss}/10.png | Bin .../{cave_moss => 00_cave_moss}/11.png | Bin .../{cave_moss => 00_cave_moss}/12.png | Bin .../{cave_moss => 00_cave_moss}/13.png | Bin .../{cave_moss => 00_cave_moss}/14.png | Bin .../{cave_moss => 00_cave_moss}/15.png | Bin .../{cave_moss => 00_cave_moss}/16.png | Bin .../{cave_moss => 00_cave_moss}/2.png | Bin .../{cave_moss => 00_cave_moss}/3.png | Bin .../{cave_moss => 00_cave_moss}/4.png | Bin .../{cave_moss => 00_cave_moss}/5.png | Bin .../{cave_moss => 00_cave_moss}/6.png | Bin .../{cave_moss => 00_cave_moss}/7.png | Bin .../{cave_moss => 00_cave_moss}/8.png | Bin .../{cave_moss => 00_cave_moss}/9.png | Bin .../00_cave_moss/cave_moss.properties | 7 +++ .../{end_mycelium => 01_end_mycelium}/0.png | Bin .../{end_mycelium => 01_end_mycelium}/1.png | Bin .../{end_mycelium => 01_end_mycelium}/10.png | Bin .../{end_mycelium => 01_end_mycelium}/11.png | Bin .../{end_mycelium => 01_end_mycelium}/12.png | Bin .../{end_mycelium => 01_end_mycelium}/13.png | Bin .../{end_mycelium => 01_end_mycelium}/14.png | Bin .../{end_mycelium => 01_end_mycelium}/15.png | Bin .../{end_mycelium => 01_end_mycelium}/16.png | Bin .../{end_mycelium => 01_end_mycelium}/2.png | Bin .../{end_mycelium => 01_end_mycelium}/3.png | Bin .../{end_mycelium => 01_end_mycelium}/4.png | Bin .../{end_mycelium => 01_end_mycelium}/5.png | Bin .../{end_mycelium => 01_end_mycelium}/6.png | Bin .../{end_mycelium => 01_end_mycelium}/7.png | Bin .../{end_mycelium => 01_end_mycelium}/8.png | Bin .../{end_mycelium => 01_end_mycelium}/9.png | Bin .../01_end_mycelium/end_mycelium.properties | 7 +++ .../{shadow_grass => 02_shadow_grass}/0.png | Bin .../{shadow_grass => 02_shadow_grass}/1.png | Bin .../{shadow_grass => 02_shadow_grass}/10.png | Bin .../{shadow_grass => 02_shadow_grass}/11.png | Bin .../{shadow_grass => 02_shadow_grass}/12.png | Bin .../{shadow_grass => 02_shadow_grass}/13.png | Bin .../{shadow_grass => 02_shadow_grass}/14.png | Bin .../{shadow_grass => 02_shadow_grass}/15.png | Bin .../{shadow_grass => 02_shadow_grass}/16.png | Bin .../{shadow_grass => 02_shadow_grass}/2.png | Bin .../{shadow_grass => 02_shadow_grass}/3.png | Bin .../{shadow_grass => 02_shadow_grass}/4.png | Bin .../{shadow_grass => 02_shadow_grass}/5.png | Bin .../{shadow_grass => 02_shadow_grass}/6.png | Bin .../{shadow_grass => 02_shadow_grass}/7.png | Bin .../{shadow_grass => 02_shadow_grass}/8.png | Bin .../{shadow_grass => 02_shadow_grass}/9.png | Bin .../shadow_grass.properties | 2 +- .../{pink_moss => 03_pink_moss}/0.png | Bin .../{pink_moss => 03_pink_moss}/1.png | Bin .../{pink_moss => 03_pink_moss}/10.png | Bin .../{pink_moss => 03_pink_moss}/11.png | Bin .../{pink_moss => 03_pink_moss}/12.png | Bin .../{pink_moss => 03_pink_moss}/13.png | Bin .../{pink_moss => 03_pink_moss}/14.png | Bin .../{pink_moss => 03_pink_moss}/15.png | Bin .../{pink_moss => 03_pink_moss}/16.png | Bin .../{pink_moss => 03_pink_moss}/2.png | Bin .../{pink_moss => 03_pink_moss}/3.png | Bin .../{pink_moss => 03_pink_moss}/4.png | Bin .../{pink_moss => 03_pink_moss}/5.png | Bin .../{pink_moss => 03_pink_moss}/6.png | Bin .../{pink_moss => 03_pink_moss}/7.png | Bin .../{pink_moss => 03_pink_moss}/8.png | Bin .../{pink_moss => 03_pink_moss}/9.png | Bin .../pink_moss.properties | 2 +- .../{crystal_moss => 04_crystal_moss}/0.png | Bin .../{crystal_moss => 04_crystal_moss}/1.png | Bin .../{crystal_moss => 04_crystal_moss}/10.png | Bin .../{crystal_moss => 04_crystal_moss}/11.png | Bin .../{crystal_moss => 04_crystal_moss}/12.png | Bin .../{crystal_moss => 04_crystal_moss}/13.png | Bin .../{crystal_moss => 04_crystal_moss}/14.png | Bin .../{crystal_moss => 04_crystal_moss}/15.png | Bin .../{crystal_moss => 04_crystal_moss}/16.png | Bin .../{crystal_moss => 04_crystal_moss}/2.png | Bin .../{crystal_moss => 04_crystal_moss}/3.png | Bin .../{crystal_moss => 04_crystal_moss}/4.png | Bin .../{crystal_moss => 04_crystal_moss}/5.png | Bin .../{crystal_moss => 04_crystal_moss}/6.png | Bin .../{crystal_moss => 04_crystal_moss}/7.png | Bin .../{crystal_moss => 04_crystal_moss}/8.png | Bin .../{crystal_moss => 04_crystal_moss}/9.png | Bin .../crystal_moss.properties | 2 +- .../{chorus_nylium => 05_chorus_nylium}/0.png | Bin .../{chorus_nylium => 05_chorus_nylium}/1.png | Bin .../10.png | Bin .../11.png | Bin .../12.png | Bin .../13.png | Bin .../14.png | Bin .../15.png | Bin .../16.png | Bin .../{chorus_nylium => 05_chorus_nylium}/2.png | Bin .../{chorus_nylium => 05_chorus_nylium}/3.png | Bin .../{chorus_nylium => 05_chorus_nylium}/4.png | Bin .../{chorus_nylium => 05_chorus_nylium}/5.png | Bin .../{chorus_nylium => 05_chorus_nylium}/6.png | Bin .../{chorus_nylium => 05_chorus_nylium}/7.png | Bin .../{chorus_nylium => 05_chorus_nylium}/8.png | Bin .../{chorus_nylium => 05_chorus_nylium}/9.png | Bin .../chorus_nylium.properties | 2 +- .../_overlays/{end_moss => 06_end_moss}/0.png | Bin .../_overlays/{end_moss => 06_end_moss}/1.png | Bin .../{end_moss => 06_end_moss}/10.png | Bin .../{end_moss => 06_end_moss}/11.png | Bin .../{end_moss => 06_end_moss}/12.png | Bin .../{end_moss => 06_end_moss}/13.png | Bin .../{end_moss => 06_end_moss}/14.png | Bin .../{end_moss => 06_end_moss}/15.png | Bin .../{end_moss => 06_end_moss}/16.png | Bin .../_overlays/{end_moss => 06_end_moss}/2.png | Bin .../_overlays/{end_moss => 06_end_moss}/3.png | Bin .../_overlays/{end_moss => 06_end_moss}/4.png | Bin .../_overlays/{end_moss => 06_end_moss}/5.png | Bin .../_overlays/{end_moss => 06_end_moss}/6.png | Bin .../_overlays/{end_moss => 06_end_moss}/7.png | Bin .../_overlays/{end_moss => 06_end_moss}/8.png | Bin .../_overlays/{end_moss => 06_end_moss}/9.png | Bin .../end_moss.properties | 2 +- .../{jungle_moss => 07_jungle_moss}/0.png | Bin .../{jungle_moss => 07_jungle_moss}/1.png | Bin .../{jungle_moss => 07_jungle_moss}/10.png | Bin .../{jungle_moss => 07_jungle_moss}/11.png | Bin .../{jungle_moss => 07_jungle_moss}/12.png | Bin .../{jungle_moss => 07_jungle_moss}/13.png | Bin .../{jungle_moss => 07_jungle_moss}/14.png | Bin .../{jungle_moss => 07_jungle_moss}/15.png | Bin .../{jungle_moss => 07_jungle_moss}/16.png | Bin .../{jungle_moss => 07_jungle_moss}/2.png | Bin .../{jungle_moss => 07_jungle_moss}/3.png | Bin .../{jungle_moss => 07_jungle_moss}/4.png | Bin .../{jungle_moss => 07_jungle_moss}/5.png | Bin .../{jungle_moss => 07_jungle_moss}/6.png | Bin .../{jungle_moss => 07_jungle_moss}/7.png | Bin .../{jungle_moss => 07_jungle_moss}/8.png | Bin .../{jungle_moss => 07_jungle_moss}/9.png | Bin .../jungle_moss.properties | 2 +- .../{amber_moss => 08_amber_moss}/0.png | Bin .../{amber_moss => 08_amber_moss}/1.png | Bin .../{amber_moss => 08_amber_moss}/10.png | Bin .../{amber_moss => 08_amber_moss}/11.png | Bin .../{amber_moss => 08_amber_moss}/12.png | Bin .../{amber_moss => 08_amber_moss}/13.png | Bin .../{amber_moss => 08_amber_moss}/14.png | Bin .../{amber_moss => 08_amber_moss}/15.png | Bin .../{amber_moss => 08_amber_moss}/16.png | Bin .../{amber_moss => 08_amber_moss}/2.png | Bin .../{amber_moss => 08_amber_moss}/3.png | Bin .../{amber_moss => 08_amber_moss}/4.png | Bin .../{amber_moss => 08_amber_moss}/5.png | Bin .../{amber_moss => 08_amber_moss}/6.png | Bin .../{amber_moss => 08_amber_moss}/7.png | Bin .../{amber_moss => 08_amber_moss}/8.png | Bin .../{amber_moss => 08_amber_moss}/9.png | Bin .../amber_moss.properties | 2 +- .../_overlays/cave_moss/cave_moss.properties | 7 --- .../end_mycelium/end_mycelium.properties | 7 --- 214 files changed, 129 insertions(+), 27 deletions(-) create mode 100644 src/main/resources/assets/betterend/textures/block/bulb_moss_bulbs_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/bulb_vine_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/bulb_vine_e.png.mcmeta create mode 100644 src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb_e.png.mcmeta create mode 100644 src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_overlay_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_overlay_e.png.mcmeta create mode 100644 src/main/resources/assets/betterend/textures/block/bulb_vine_seed_0_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/bulb_vine_seed_1_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/bulb_vine_seed_2_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/bulb_vine_seed_3_e.png delete mode 100644 src/main/resources/assets/betterend/textures/block/crystal_grass_1.png create mode 100644 src/main/resources/assets/betterend/textures/block/end_stone_furnace_glow.png rename src/main/resources/assets/betterend/textures/block/{end_stone_furnace_front_on.png.mcmeta => end_stone_furnace_glow.png.mcmeta} (100%) create mode 100644 src/main/resources/assets/betterend/textures/block/end_stone_furnace_glow_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/end_stone_furnace_glow_e.png.mcmeta create mode 100644 src/main/resources/assets/betterend/textures/block/flavolite_furnace_glow_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/flavolite_furnace_glow_e.png.mcmeta create mode 100644 src/main/resources/assets/betterend/textures/block/glowing_pillar_seed_0_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/glowing_pillar_seed_1_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/glowing_pillar_seed_2_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/glowing_pillar_seed_3_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/gold_chandelier_floor_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/gold_chandelier_wall_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/hydralux_flower_bottom_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_side_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_top_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/hydralux_flower_petal_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/hydralux_sapling_1_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/hydralux_sapling_2_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/hydralux_sapling_3_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/hydralux_sapling_4_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/iron_chandelier_floor_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/iron_chandelier_wall_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/mossy_glowshroom_sapling_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow_e.png.mcmeta rename src/main/resources/assets/betterend/textures/block/{terminite_chandelier_ceilt.png => terminite_chandelier_ceil.png} (100%) create mode 100644 src/main/resources/assets/betterend/textures/block/terminite_chandelier_floor_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/terminite_chandelier_wall_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/thallasium_chandelier_floor_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/violecite_furnace_glow_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/violecite_furnace_glow_e.png.mcmeta rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{cave_moss => 00_cave_moss}/0.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{cave_moss => 00_cave_moss}/1.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{cave_moss => 00_cave_moss}/10.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{cave_moss => 00_cave_moss}/11.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{cave_moss => 00_cave_moss}/12.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{cave_moss => 00_cave_moss}/13.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{cave_moss => 00_cave_moss}/14.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{cave_moss => 00_cave_moss}/15.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{cave_moss => 00_cave_moss}/16.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{cave_moss => 00_cave_moss}/2.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{cave_moss => 00_cave_moss}/3.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{cave_moss => 00_cave_moss}/4.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{cave_moss => 00_cave_moss}/5.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{cave_moss => 00_cave_moss}/6.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{cave_moss => 00_cave_moss}/7.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{cave_moss => 00_cave_moss}/8.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{cave_moss => 00_cave_moss}/9.png (100%) create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/cave_moss.properties rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_mycelium => 01_end_mycelium}/0.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_mycelium => 01_end_mycelium}/1.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_mycelium => 01_end_mycelium}/10.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_mycelium => 01_end_mycelium}/11.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_mycelium => 01_end_mycelium}/12.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_mycelium => 01_end_mycelium}/13.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_mycelium => 01_end_mycelium}/14.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_mycelium => 01_end_mycelium}/15.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_mycelium => 01_end_mycelium}/16.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_mycelium => 01_end_mycelium}/2.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_mycelium => 01_end_mycelium}/3.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_mycelium => 01_end_mycelium}/4.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_mycelium => 01_end_mycelium}/5.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_mycelium => 01_end_mycelium}/6.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_mycelium => 01_end_mycelium}/7.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_mycelium => 01_end_mycelium}/8.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_mycelium => 01_end_mycelium}/9.png (100%) create mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/end_mycelium.properties rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{shadow_grass => 02_shadow_grass}/0.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{shadow_grass => 02_shadow_grass}/1.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{shadow_grass => 02_shadow_grass}/10.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{shadow_grass => 02_shadow_grass}/11.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{shadow_grass => 02_shadow_grass}/12.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{shadow_grass => 02_shadow_grass}/13.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{shadow_grass => 02_shadow_grass}/14.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{shadow_grass => 02_shadow_grass}/15.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{shadow_grass => 02_shadow_grass}/16.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{shadow_grass => 02_shadow_grass}/2.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{shadow_grass => 02_shadow_grass}/3.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{shadow_grass => 02_shadow_grass}/4.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{shadow_grass => 02_shadow_grass}/5.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{shadow_grass => 02_shadow_grass}/6.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{shadow_grass => 02_shadow_grass}/7.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{shadow_grass => 02_shadow_grass}/8.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{shadow_grass => 02_shadow_grass}/9.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{shadow_grass => 02_shadow_grass}/shadow_grass.properties (62%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{pink_moss => 03_pink_moss}/0.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{pink_moss => 03_pink_moss}/1.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{pink_moss => 03_pink_moss}/10.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{pink_moss => 03_pink_moss}/11.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{pink_moss => 03_pink_moss}/12.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{pink_moss => 03_pink_moss}/13.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{pink_moss => 03_pink_moss}/14.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{pink_moss => 03_pink_moss}/15.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{pink_moss => 03_pink_moss}/16.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{pink_moss => 03_pink_moss}/2.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{pink_moss => 03_pink_moss}/3.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{pink_moss => 03_pink_moss}/4.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{pink_moss => 03_pink_moss}/5.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{pink_moss => 03_pink_moss}/6.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{pink_moss => 03_pink_moss}/7.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{pink_moss => 03_pink_moss}/8.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{pink_moss => 03_pink_moss}/9.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{pink_moss => 03_pink_moss}/pink_moss.properties (56%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{crystal_moss => 04_crystal_moss}/0.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{crystal_moss => 04_crystal_moss}/1.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{crystal_moss => 04_crystal_moss}/10.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{crystal_moss => 04_crystal_moss}/11.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{crystal_moss => 04_crystal_moss}/12.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{crystal_moss => 04_crystal_moss}/13.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{crystal_moss => 04_crystal_moss}/14.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{crystal_moss => 04_crystal_moss}/15.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{crystal_moss => 04_crystal_moss}/16.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{crystal_moss => 04_crystal_moss}/2.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{crystal_moss => 04_crystal_moss}/3.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{crystal_moss => 04_crystal_moss}/4.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{crystal_moss => 04_crystal_moss}/5.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{crystal_moss => 04_crystal_moss}/6.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{crystal_moss => 04_crystal_moss}/7.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{crystal_moss => 04_crystal_moss}/8.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{crystal_moss => 04_crystal_moss}/9.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{crystal_moss => 04_crystal_moss}/crystal_moss.properties (53%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{chorus_nylium => 05_chorus_nylium}/0.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{chorus_nylium => 05_chorus_nylium}/1.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{chorus_nylium => 05_chorus_nylium}/10.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{chorus_nylium => 05_chorus_nylium}/11.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{chorus_nylium => 05_chorus_nylium}/12.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{chorus_nylium => 05_chorus_nylium}/13.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{chorus_nylium => 05_chorus_nylium}/14.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{chorus_nylium => 05_chorus_nylium}/15.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{chorus_nylium => 05_chorus_nylium}/16.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{chorus_nylium => 05_chorus_nylium}/2.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{chorus_nylium => 05_chorus_nylium}/3.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{chorus_nylium => 05_chorus_nylium}/4.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{chorus_nylium => 05_chorus_nylium}/5.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{chorus_nylium => 05_chorus_nylium}/6.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{chorus_nylium => 05_chorus_nylium}/7.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{chorus_nylium => 05_chorus_nylium}/8.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{chorus_nylium => 05_chorus_nylium}/9.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{chorus_nylium => 05_chorus_nylium}/chorus_nylium.properties (88%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_moss => 06_end_moss}/0.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_moss => 06_end_moss}/1.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_moss => 06_end_moss}/10.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_moss => 06_end_moss}/11.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_moss => 06_end_moss}/12.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_moss => 06_end_moss}/13.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_moss => 06_end_moss}/14.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_moss => 06_end_moss}/15.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_moss => 06_end_moss}/16.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_moss => 06_end_moss}/2.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_moss => 06_end_moss}/3.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_moss => 06_end_moss}/4.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_moss => 06_end_moss}/5.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_moss => 06_end_moss}/6.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_moss => 06_end_moss}/7.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_moss => 06_end_moss}/8.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_moss => 06_end_moss}/9.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{end_moss => 06_end_moss}/end_moss.properties (82%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{jungle_moss => 07_jungle_moss}/0.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{jungle_moss => 07_jungle_moss}/1.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{jungle_moss => 07_jungle_moss}/10.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{jungle_moss => 07_jungle_moss}/11.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{jungle_moss => 07_jungle_moss}/12.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{jungle_moss => 07_jungle_moss}/13.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{jungle_moss => 07_jungle_moss}/14.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{jungle_moss => 07_jungle_moss}/15.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{jungle_moss => 07_jungle_moss}/16.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{jungle_moss => 07_jungle_moss}/2.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{jungle_moss => 07_jungle_moss}/3.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{jungle_moss => 07_jungle_moss}/4.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{jungle_moss => 07_jungle_moss}/5.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{jungle_moss => 07_jungle_moss}/6.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{jungle_moss => 07_jungle_moss}/7.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{jungle_moss => 07_jungle_moss}/8.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{jungle_moss => 07_jungle_moss}/9.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{jungle_moss => 07_jungle_moss}/jungle_moss.properties (90%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{amber_moss => 08_amber_moss}/0.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{amber_moss => 08_amber_moss}/1.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{amber_moss => 08_amber_moss}/10.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{amber_moss => 08_amber_moss}/11.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{amber_moss => 08_amber_moss}/12.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{amber_moss => 08_amber_moss}/13.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{amber_moss => 08_amber_moss}/14.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{amber_moss => 08_amber_moss}/15.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{amber_moss => 08_amber_moss}/16.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{amber_moss => 08_amber_moss}/2.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{amber_moss => 08_amber_moss}/3.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{amber_moss => 08_amber_moss}/4.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{amber_moss => 08_amber_moss}/5.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{amber_moss => 08_amber_moss}/6.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{amber_moss => 08_amber_moss}/7.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{amber_moss => 08_amber_moss}/8.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{amber_moss => 08_amber_moss}/9.png (100%) rename src/main/resources/assets/minecraft/optifine/ctm/_overlays/{amber_moss => 08_amber_moss}/amber_moss.properties (83%) delete mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/cave_moss.properties delete mode 100644 src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/end_mycelium.properties diff --git a/src/main/java/ru/betterend/blocks/AeterniumAnvil.java b/src/main/java/ru/betterend/blocks/AeterniumAnvil.java index d997ce9d..a57ca9c6 100644 --- a/src/main/java/ru/betterend/blocks/AeterniumAnvil.java +++ b/src/main/java/ru/betterend/blocks/AeterniumAnvil.java @@ -11,7 +11,7 @@ import ru.betterend.patterns.Patterns; import ru.betterend.registry.EndBlocks; public class AeterniumAnvil extends EndAnvilBlock { - public static final IntProperty DESTRUCTION = BlockProperties.DESTRUCTION_LONG; + private static final IntProperty DESTRUCTION = BlockProperties.DESTRUCTION_LONG; public AeterniumAnvil() { super(EndBlocks.AETERNIUM_BLOCK.getDefaultMaterialColor(), EndToolMaterial.AETERNIUM.getMiningLevel()); diff --git a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java index f56221fa..ca836924 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java @@ -24,7 +24,7 @@ import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; public class EndAnvilBlock extends AnvilBlock implements BlockPatterned { - public static final IntProperty DESTRUCTION = BlockProperties.DESTRUCTION; + private static final IntProperty DESTRUCTION = BlockProperties.DESTRUCTION; protected final int level; public EndAnvilBlock(MaterialColor color, int level) { diff --git a/src/main/java/ru/betterend/blocks/basis/VineBlock.java b/src/main/java/ru/betterend/blocks/basis/VineBlock.java index 1fe0f431..f66fcdf8 100644 --- a/src/main/java/ru/betterend/blocks/basis/VineBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/VineBlock.java @@ -77,6 +77,10 @@ public class VineBlock extends BlockBaseNotFull implements IRenderTypeable, Fert public AbstractBlock.OffsetType getOffsetType() { return AbstractBlock.OffsetType.XZ; } + + public boolean canGenerate(BlockState state, WorldView world, BlockPos pos) { + return isSupport(state, world, pos); + } @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { diff --git a/src/main/java/ru/betterend/world/features/VineFeature.java b/src/main/java/ru/betterend/world/features/VineFeature.java index 362a31b2..535ecd7c 100644 --- a/src/main/java/ru/betterend/world/features/VineFeature.java +++ b/src/main/java/ru/betterend/world/features/VineFeature.java @@ -3,36 +3,68 @@ package ru.betterend.world.features; import java.util.Random; import net.minecraft.block.Block; +import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.blocks.basis.VineBlock; import ru.betterend.util.BlocksHelper; public class VineFeature extends InvertedScatterFeature { private final Block vineBlock; private final int maxLength; + private final boolean vine; public VineFeature(Block vineBlock, int maxLength) { super(6); this.vineBlock = vineBlock; this.maxLength = maxLength; + this.vine = vineBlock instanceof VineBlock; } @Override public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { - return world.isAir(blockPos) && vineBlock.canPlaceAt(AIR, world, blockPos); + BlockState state = world.getBlockState(blockPos); + return state.getMaterial().isReplaceable() && canPlaceBlock(state, world, blockPos); } @Override public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { int h = BlocksHelper.downRay(world, blockPos, random.nextInt(maxLength)) - 1; if (h > 2) { - BlocksHelper.setWithoutUpdate(world, blockPos, vineBlock.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); + BlockState top = getTopState(); + BlockState middle = getMiggleState(); + BlockState bottom = getBottomState(); + BlocksHelper.setWithoutUpdate(world, blockPos, top); for (int i = 1; i < h; i++) { - BlocksHelper.setWithoutUpdate(world, blockPos.down(i), vineBlock.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); + BlocksHelper.setWithoutUpdate(world, blockPos.down(i), middle); } - BlocksHelper.setWithoutUpdate(world, blockPos.down(h), vineBlock.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); + BlocksHelper.setWithoutUpdate(world, blockPos.down(h), bottom); } } + + private boolean canPlaceBlock(BlockState state, StructureWorldAccess world, BlockPos blockPos) { + if (vine) { + return ((VineBlock) vineBlock).canGenerate(state, world, blockPos); + } + else { + return vineBlock.canPlaceAt(state, world, blockPos); + } + } + + private BlockState getTopState() { + BlockState state = vineBlock.getDefaultState(); + return vine ? state.with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP) : state; + } + + private BlockState getMiggleState() { + BlockState state = vineBlock.getDefaultState(); + return vine ? state.with(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE) : state; + } + + private BlockState getBottomState() { + BlockState state = vineBlock.getDefaultState(); + return vine ? state.with(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM) : state; + } } diff --git a/src/main/resources/assets/betterend/textures/block/bulb_moss_bulbs_e.png b/src/main/resources/assets/betterend/textures/block/bulb_moss_bulbs_e.png new file mode 100644 index 0000000000000000000000000000000000000000..d6af956e05c5ae01fe07a86cc17e43943569a574 GIT binary patch literal 1584 zcmbVMTWAzl7@jrKCNV-nAI$2*4kNupot@k6Yr4!S*V8mW>cFvjIAv<#> zGn4ElSR2J#+dL>zkWl(iTF}yqP$XiZeUMV2)(S1y2OkWAeeglrSg@c?&+H8?>CJ&N z=k}fNzyEIz552IqeSJGcQERhq*G;Jx6b?D1^X5KAVag|900_jn0m`-CC z(ebFv>OxGU6UnF`^GPwbg%)`s!SM-BkXT+&cv+E>bp2z9G#47mNM>7I7TKvx(f1vN z%og9>YV8ygH6Jq^~kW)0zpE z)15?IPe~H-~Yl5vbvY z%5*v%1g4jMW|wJ0T=se%c!M&)M=B%oqQLSZD@Zv}R3x4RZZj__JYR!q7@EfPicnDz z`G=q+YasB!zk;Ez7}&J{vDvgh0dbC9VCbeNl{7A4mk1`>NmVU0P08Ax4{RM}Gb%&O zj+!P^dId>9IC@jip~$so9m_wawd-{G31xIpQV zd4iG)vO*a&Jrb|!dQt2|6ZKWeq^pUb06j=>mC=L9BFNN_%}4e?jka7wg!CW6U4wbp z@XNqOsRHrVf5|A0=+6b!STlwDtCiKe2P(G#C+#3uHv16SG&>oxN&9k1pIT^{+DCfa zjcg{B>-|>0x4hif^5pD<6F&3#$ofmi<*u-ezyI`w1@4V- zCVuy&j^wku-wSKEU%PSbNM}pG{PreSYVFxB?fw1ETZ^|&a2-27dmSFTx>!hEJ$NZ4 z^!Fb)w13ax$G3#!>zl4nuk72l_wtbq4*EpCaBD+k+54sc<+fi}MIzGSn~CrL7(3W? zjp{sicByAHbkUgVIXXVpK5?k)a&dLI{fD{u-0Z6z^S|vse#)QSJa<&4_H=jMS#>^i z5qxkn`d#aq$onTm_vEp6)^&%&;WMW{{E4C#zy5g9Ubu2H=;_&kq0Fbxj~)0E6e|Y{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_e.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_e.png new file mode 100644 index 0000000000000000000000000000000000000000..6bf08ad677e3183ca10fcf234198c4f914d8fea1 GIT binary patch literal 1829 zcmbVN3v3f*9KXR}!W>R!%-j|{Zb*i#y+_w|Jyu6;2P?CqY$Y&2vCt;w91F1OE$*@90N ztV&fS8pngdpgw5Oi?RWW%u6aS3aG}&c*JVe zfZy+?=t{H>vYC#JkXawAZ|iYi))~aSU?_#R@}7`z{`OmR?93Xu7Pf5YicCgCIdzl zWw$8$M-t^4aT&GQw8RvkISY7!6NAdMd-ec3qXG*?5frH-C>?2VQxr`V(0Qimgn=fA zVW?B&cyH|kp=O#i-Uo$M!!auJuV9X)y`mgopk_Y6_y8^mJ`9aVlD3I{QHF-0cZR4J zPABaU6qONJ;ILaTC|l3-91V;{V;)sN=ol`~sPhncCY{;9dUcesz~nI+Ny_UPRsr|h zMYdW??#O=bf9{_v^RT%X|3mX=EvHolUBW9cU$wEOr~u1iD?g7$3xQ@>t-vi9t7R5& zSnM_b&=DA>4ORh2`VZ+IhAE;~4KgyY`e3yFOGV+(e_ZRvVJY}uRYt$v)43yXI1aRB zd=9~f_#^`Y9A7e=Q<+mgb0bK?Nr&C)E;;nQ+bO1zsST5Q_x0pEr|oo4$m;CAdw0y% zb4ADGmE+s$b0+gGFSZw@A3d>lZCH2hiPAHnPn&OezdSnkgQh>4tfBLR$>#=cA8eSj z?aYdt4{zK&UHcWd*!;sjymt@XH7ByJ{geH-uD7=hMOyasE=fMw-7}H-CBeAz){)l_ z{>EPGN?hMnQ{_`!kujSxHuQ};pAOnjjs~46OWMxTgf=gpZsOfy6r<(o21tEXiOp1y{?ul_`smrt!&)FWnv6H6;fk;sA_X>~u2&|rDRYlxCVrcK z_#3)!^(&9QcJX{pWYSQcYpy+ zQW60D`n%9~z^k#1fm8oQ001Bx&Ou*G!K5=zWB{K98u~caHly#|oTh|pm#28b`xZ&!J9A5vQTmo4P)Df!Xe$Fj$SkSaVv z6`g>A;^%yL-GPdW{+^(pzoqhekUqtr)l9`W@iC%+Y?T0} zL%@gVKh*=1&Wq~7l+NOMVA5IqoJ~3}ss~d#i|c_&XK_9FOZx$+(e;mSh>9}+0000< KMNUMnLSTZNy1!ol literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb_e.png.mcmeta b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb_e.png.mcmeta new file mode 100644 index 00000000..f0c66dc9 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb_e.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 32 + } +} diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_overlay_e.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_overlay_e.png new file mode 100644 index 0000000000000000000000000000000000000000..8a3c1a3a05b7bea895154aa678bb5e83c766ebd0 GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3Qja}d978JR?47imtJQ(WS1=Ye zv?(x!Fn_CU=W$Fi54B)U@e$SdCHd)vkgDC=&o;M(_FSsq?x+k?=co*0OqzF9)Cr7z zr&m1vX)k5Zo)USibk!=S*z0?iXL1EIHEqf5UiVtT!Sq0N|GxKzeadZ#4`L^+U~mom zurPC$#03-HQ=7JgE1X!&RXOi7<1ekN3-4N{dw+OaFYtMdpTMUzOh;^1GZ>y<#uYv< gv|+~c^QQk8JfZ_v8k!v91$vjk)78&qol`;+0KBPl{{R30 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_overlay_e.png.mcmeta b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_overlay_e.png.mcmeta new file mode 100644 index 00000000..f0c66dc9 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_overlay_e.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 32 + } +} diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_0_e.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_0_e.png new file mode 100644 index 0000000000000000000000000000000000000000..8b75b1c8414b85704137cae32f7f75153c1266ec GIT binary patch literal 1444 zcmbVM%WKp?9FA0c7X(417eh*YpxH^X&kUyRx?AmnsiiKo#e>dHW_Lq3nV3wwyA{PM z7K+TBX?O_F5hj*M#dZzp{liC+Xj_Ifoir8G%aN)*zUY$^ixWk>IEQsh8W|Q3H6SN& z2t#7Ssks4c7*d-T@^yF&B(V))bB2@+1&TA~q?n^V5tFf$jMaoDruCSbQgkhGP}CGP z4U{xcG2}^recNL;b;XbomFPS(B(7=41jmbL-Jt6x?l90m9#CUSXi^(!;Rxr= z`?a=k3j3}yVf)#8Efj|IFX2ejV*99x(-9cse1aJDi|QkAWe zjuPcmJY}Iw?|q))`7pS>_trnYKknPSxKQoCdBTzlvjUFW0gqR+TNEeAneM7)i|s^! z2!{!7NH~lvv83*?{ofww(AKMjll~^$9auoitd4w=t#EJsO-2E(KM1R_V+#1$%J$uN zmD_{!b`UP3KEyXsCnGLzUq0_sr_P^!#CzOyA)hT~Uf{2-)=1ybg_WhlqbK`@-<)f; zp5A=bdaeogZ{59jY3bID%WvPU?#=Y0Cqt{BzU*GUw{7HcV)*eDuyZuk`uy=~_Vw(_ j^@DxO*~GPh(Y<}b#yfjnme84JVIM7wP2?XOK7H{U&GgLg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_1_e.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_1_e.png new file mode 100644 index 0000000000000000000000000000000000000000..588a2ba08b0dcd03143a55fb613a2abb74bc9866 GIT binary patch literal 1458 zcmbVM%TLrm94^rq6^texBqqkDsKID=`dW57QgPiyK`jv21iU#+huwy4r?!K;-~~Ns zhzAut8INAPm>3c-9@LwO-aL8pFVF*tfds+nJ{mMWX)>MHH{b95TNoKSzi0Qs-GU(O z85}5#@_Ao8cJAQ+!^<0pPrHJF%aI_o?~g~D@aS=;AZ%ZDixX_Zz63G#Qpll`BvtbQ zjuwR8zFL6rG-2W-DY?ESeR=sx5?#lV#?!W92YFI<2j)UDHaAqnbJN&#q`uQ)Zw+z+ zk1!3{SfDszkBE615;2|Xk+EuMV#Z9VJ&LIrCq+$B zGeF4zRhJbNDm_p)#pWk*X`wR(M+@hgviQ!D%8UgNfNHgxs_H2kmVj!SCQvk>X);I1 z(X7u{yJBksm=6hJG%QkDX$5MerLvgM$AQU;-Q%wB&}wvi(;HGij98MU zXsWDevZ@y~4Qd%^C?^yhDoO)tQ^%c}{S7p2{s84!;~<9q3U)A@qM?Vl&8~+^1O$Fb z5))6tJgv}>3+CGCbuDZg4*C&8J|=?&OX6myT-SkyHmMugj3H;!8B@-x29ixZqsa!= zopeUY;lLX|D^#3dJJ1srfA9xlpn zjuYIHa2#3UNX=t+%N}UZR?CEw{vq5ASVX5-6@?^M;@>F;D`wx}wT+FwZAa%9Zk$y*I*e!vaaSGeA1XXMd*$YLNa)Ol literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_2_e.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_2_e.png new file mode 100644 index 0000000000000000000000000000000000000000..d47215d8f9c7b6c89c984e418659bb8bd3b54289 GIT binary patch literal 1466 zcmbVMO=#3u9FJ9oYFn%bq8{`SQIy>zFPZ5~@-UX^Otk}MEOnsu=4zKc`2NUNaK^WK_-&=%Vf7>ev+t%F544bh| zBb$0McIYgTTVBA?f^dAa6<~XgFfdDMu5XGj{`y-4u49VRBNnuR0;#(bOCdSCRIb=d zbGG4#qbI=e7UBdRVHmW$h99ApDYkhLU&p@{5wsy}&J^>pK`>)Yf&vW*7?HD*t!6Zk zGh{Uj4K4E{(4d-AU`|of5>ye)qO<|Jm&mP!P8CfRPj+qbFH@{D79d4wHk)!YEz_{3 zsD@!EP*XHb;s_~P^cikResrkEP$ZEZx&d>k4`N0a!)%Fyda_Vqi&dZz?2pa z6jg??q&Cp86I?JKHrmD=TOkeN5uZgIt0vf>P8p5r^fT1S_D2SIXe}$Tv7s-Xmzapy z_yU*F4akP*sInLkWr{>}KD5dB0(bLJtR_H(kYGl`3Z;!+q9%JTgF+!rj1G=YyS_u4 z(XkKCkRoQp6g8-+64WF$UC}h88+vegVRq@2#n z4r`g5r0cdO&5l5*8(KQ2XF4kQ`69LF{@O&pSZjYsQSDoWx0 zD{(h=q$r=NZ0~*0xji@^2k|nQL;NF|WW?v=E97%(>!o9W&p5AC%vbak``!Bb=+?tm zmVX|D7lc2C-UQEH{xp1KMYwTN-hLoeE$>NPz6PJH4z9jgd%6>@KYxB}@XYJS4=(f% zWb-#t3*v(-yQZg7_xqgT{&#O*UC%!{w|w(99R6tP*n$V&ByVP7CwVb> z?M&-IT?O%^mjw~Qy}75o?6RD3cYwJ)R*}PD)p;@m-qF1zyJ6D z!esGa-{u{g1wrU5gu$kKp-;bdB})D#36 zJ*lP@9j1l=RMd>DWMoy76cs6Hr0JmZiCkJ>SI|`MKt~qe8DfnwAIWl~(MUG5Bn_&v zs_VL}Kp8@bBcyP_W4I}KVWP{BBcT;IK69uCB1T-MbIcIArfm~kKc@AonkkxprDh3)4geFJ#!WNFis4-0Y;|*hp7XDNEB;DN{+8 zC8(ur30EMNhH)CI>0zR!bliQPqt;v$-0pk(JKrA)99~?wzGj}NS2nbtIf*Yb0MV8oN=h#`Z2imla8sVg02zMJ6(h6(ffQ(nUx4tE#WUjv) zRb$%}`BN)fcOO)47tY&3w2b=@-^87ac)WcDyie_%KYx_>xYtUiPQlS9Cx5&? zIP`KI=zF#MTuwoB`T^0Se@?hd{v QM!mH#QOy0l|Jd*E0h7zjO8@`> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/crystal_grass_1.png b/src/main/resources/assets/betterend/textures/block/crystal_grass_1.png deleted file mode 100644 index 7e47df58c8602c55a23a680d29516814934b599d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 447 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 diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_furnace_glow.png b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_glow.png new file mode 100644 index 0000000000000000000000000000000000000000..8e02f4ce7a148ebcfe4ab1177356ec0089175b58 GIT binary patch literal 1826 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_furnace_glow_e.png.mcmeta b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_glow_e.png.mcmeta new file mode 100644 index 00000000..98b9ae71 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_glow_e.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/betterend/textures/block/glowing_pillar_seed_0_e.png b/src/main/resources/assets/betterend/textures/block/glowing_pillar_seed_0_e.png new file mode 100644 index 0000000000000000000000000000000000000000..c51528ff1a650045d22e6abc271e74c96ea59798 GIT binary patch literal 1459 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/glowing_pillar_seed_3_e.png b/src/main/resources/assets/betterend/textures/block/glowing_pillar_seed_3_e.png new file mode 100644 index 0000000000000000000000000000000000000000..b334f87907bb18764ce6fe3e459896fe3ed05eed GIT binary patch literal 1623 zcmbVMX>1f#9G_|fwb*pAnpBN2PHO~Vc8+$KT_MgmCUg+!x?R~poy2~i||Pzz}=Mr=e;LMwhS(KmYqOud+7X5R7p zAHV;#Bi3_&L;Y>_1VJ=J!l7RLci3;;Jp5gJ=?{Q^H|XJYCP6G{vfmnFd|xv`)Lv5J zeO6!eK~X}g6UZn5ojFyDIqkm-dc8Z;!>HH6)4vDxTi(15@~MjW9`B~h`8 z%VaQUCq^KbtW`7_WzD5m$iNV=V1VLTo}*cw=3H@}7kQ7!v&&eQ$g(A96v;|5KPS{H zy1A>MxN2lzfqw3NU9y1u4krT8bj8kraa{gA8mKd*>>85siuw&9s0f!AK}T zVcJebkwpo5k`kBTXdugg<~g@O3vM@0%l?EQKp-T5ORmU=kThr~w<0h9Px)1bf}0Cu zu33-Wa&}dSVa3Gx%9opB4Sb@!$|z*95JVu^1s<-;9D$O2HVv`Te@J%; zW}>8(1qSR$;b{Griej+;jNOeTD$HM57Voa;+zK3z1AAGWLwHl2WKhH7%fNF=7&_-6 zh?@FHs3R_%_^Hs*eO--XWa8@sZw7aMKEA&@xg}rU`tss0Uf3|d@eXlldh+D--80Lm zd#I-izua`^H=TX2kG}KT*4>XEti9LE?)IUnwnb85&*9|6_1|tS>>F(abuapJJ7SX` zzxCy=PsdjEcMC%Q!ja`So3SMy%zoF5va5Z^fB62_XD)1f|49G52lAiHceH;ve9Ov~ z@P<9UF@3M&Xiw_Bv!4YoH;iA7y?U&$ebK{B^3l~#J+$CJorikm*^$$?H{W<))3)a4 z9|b$xXC}WoH8Oi1zWsV&wX^}@TS)7OV2-cwy}1q=J@!Nn@%$qQugSNboGRebgtj>CxntCGynhq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/gold_chandelier_floor_e.png b/src/main/resources/assets/betterend/textures/block/gold_chandelier_floor_e.png new file mode 100644 index 0000000000000000000000000000000000000000..2a48e04dfb0eb45d9344e77f77ffe975a4af86d9 GIT binary patch literal 1454 zcmbVMOK8+U7>*B$wiIdwkzN`i_&~FnWVhShp|P&J)h?K}v|CzlPBXK+p_@!hrfymU zMZJg~L~m74uon@ecvUE#Ja`mD^rCog4tr9HN_{mXnb$Yp|NgIzjhyUk?`anV zp))_68|PzJ`0Z%p|K5)^#D|^k@M&KVI(CQO7Gd$uUP0LY(JD-{Y2y?$sU1U@&X8DO zyBsYD1A~E!%vr+38B($wU0QpxB8e8(rKvsx7;cu7t>FcaOe~BP%!OGqjite(;y?g7 zflU|^1H0n*FwmtsFXZ!ZTam;%gw5(wCKM=68)IUYdPMAtC1q1hXkvdlrY1pJOB@k3 zp!O@EUs2;SP$5Xdcv@^e5|`%TA{@`1Xv*R%T`Du?LPe=otFdZ4M!k}vrqgK!Xo{xE z93lJj4nu+L`1@K6IpUk1*guI%Gq% zUzm4^GERIt=b2>a99MH+XpIZA9zl$H1xhQeK#jFj7PHwfFe&lil;vPr^$)GPLvn}_ zUDAN2%0QFVctO)3fBV2;5QhLXpa#WOaehN+0;)eldDdXW&|ksWghlGvh}&%0s6-Uk zDM@1FNtmS->T$tbyLep-!+?3mXUH*0KBr6E?3iU?m;fdKX^i9 zNN_O)G=x)X>wb=!b762>_wj$;AN4F=T&S{Xp0MP?tboIo&*L@UEQ$$owmGX+UYxerVD7GWqW7%igsct6SNzn_JdaR!C6$5Wmv7lsUhrTgC(5-oLq! q89~d%uDeU%-s_J0ZP$A)b_l|1ZSwZ5#nH!MN6in7EyR}(-!~X=Vnk{VJq$# zh-s)IpL#^?hA~G=((&1DjBt}M;E{R|+47&a*JKd*w!EBkbvG`NMo?Z&$obWUDqd~k zqA$;$0LQzK6NH2z&<$Hr3cI%4=Y@PPK5H`QLs-+6=Y&GA;x2*`O$f-Tc?BEOCYULz zMqV$P)5n0R8#9_dqZyW>8&Jw28Eupf!^8uoby2Jt zsxDmW1AUy~;&#&NEBCQRS|lV9OF7oauyKPjnl|VwsI%WMDBz)W-Au=}wuE7(B4zVe zxf{cPY>Q5-y_jfAB&F>HlliOM%tOMP7?u)(7)`2_wnm9s9GMJCC6Sl{IIKJBER zJtspP#E31Mx@jo7sTfw(G$Frp`cd72x;}uq)DLRCZJ`!4trwuYYJ9}d8^Jz?HJXHo z`y7O*PP90x%OHy+EYTKCxMFUd)wjZRVI@i#iZH1-w#?mDgTROR95!;(9#(Q*zNQ#x zx}bQN7f%6O9`a^P>|6PfyhCwYBzGk5zoq=yB;d`3TJOvwT2532EC(siS8v!9=gAkt zT`K_nLVyU10=H!>GE01U_&Ipz2n=XD4Z=xZlkNd5r8U+;37M<&X#Jmx(zyMa=*EF7 z+RI+{|2@~aBRC%iVw=q&e#j;niTL?=HXp>+F-qyZ=y6esK7}Ur+zN`1L=tCrbBD z9$c?~x^e2xZ&SCPOg`K<))WG5^T@+xCte<-?ULXHqquid9B=$S} USy|ltMNHYs{DO1q)RnKE0c_gUR{#J2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_flower_bottom_e.png b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bottom_e.png new file mode 100644 index 0000000000000000000000000000000000000000..ab1a812348ce954ade6741741fba181b2f2f97a4 GIT binary patch literal 1448 zcmbVM%WKp?9FA7R))oaX;>9t&D4NYA+wFD-V_A1wch%Hd7g|xUvy<7~xSLFxOx7Y~YFM6cew2;yJh!Gj1wo!LiFsn0-?N#>jH`@OGBPaPN<*fyXj z%22V8pAqlP^4_psJhy*Z!Q#~)6plxVvT=*N*C==HZdH_ZpWMBM3(C$5uZ3C+~@{mRdiHZ z3aCCqBeob4I&nsrIV`;iP%fmHv#`WiqnD`Zp2;AWlZhDvJ7-hrVgzGwpP->J(+0@E}jA>?S1ZtTIakPKN7m4xp3pZd1TAUsz3!d68T!{HpMZz&|NiL&@Kdo zi7aqSB{H+rQM-RO&ro}RYdD=DoPjj>#`d=uIN8|+1~rE zb9-8(N z;Kx(Xm23T155b2E1Mu0|;Np%)4jO*EJjwg!FM;~nN7+mF>aSd7urc>;!>z%~_g}v$ k++6eW+|jgh4WIUI5Cxfuz&u-H};drVE_OC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_e.png b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_e.png new file mode 100644 index 0000000000000000000000000000000000000000..736bebad5a88b2eccd833bcd405acb27557447d9 GIT binary patch literal 1483 zcmbVM-)kI29N(Cxq-g>HA8HGdVS^CSy`9~?+~tODW4w*tp_``3K~JIL-0a-llG~ki zcdmEIL;dk*!lO7Nkm=#%{i6bh-96iN%emb?}rf?!`tDNSeZ$I?o)wF|TJ>ocG4 z@9+BJ!mDE=M@A$`8Y>p8B{7f3V|c&#Pu$wYVmc5M-iRdW;M4IKkT$+~Mw0g3a!X}i zwqHktc`59$3Qe`WK%gb*=xjT{WQB52p*7bx<-dNuCu_}WOgs+(LTr3cj?M0AhAqCT^j6$@u z4zjtFmVr4v{UXqzmQ`U^)eHq{2xgFx1HDfc(n6<-maJELvc%4m>zoHjRa>oAs%4~D zSW~rJE~i3W)pbQ6lxWrGxUKlnWS_yJ5eeOZyUYhMBd)L}H)Ww|*90#}X#J??CgCu( zjRRFn!Puk@&>;yfXoiiBaEGY0K|Sj8NMN-D8`K$RQJwt@b#ncX0O4BOPGsz3MpnOO%XJLu4Mn6!CeU(8z9|vXzOr3On zhqa>TA9zD8%&95sP}dZwE1FT#b!0#hxEG*-AnZbI=D5|>J)s)XABKvoaWKb^1Um#( zS?FP5v+Lm+RRg~!gT#|4&l)Tgf`xWQM+@6VML*)$C$wmpvM@X4x(=El>1>7=M4?8G zDh^C%6kJJX6)l@JG8(B&R~)VX-eRN~2e<#;`JeBPhps3t+<0Q1xa8ujKm|7v@mlQ_ z#WH=Tw`#bclL!ctIKfSs#F3?r+&gxk*aKbKR-Fpc{|I*%7O^UC;gHVNgts0iqg0{4 z8dqc26!o80cJ3ai+&)~igLs+rA+bq18TCc`3Pqp#?d+S!MUOjEwB|}PpOCw|yR(DO zy|*rJf46`1&|vw)6Tfb44cD&kT$6tM<@?_ce|+95oEzBMIJFraKKAaJ%kZ=J2b}TA zD{o2ez1w$&E`4#M1)c)6@lAMRt}(uS?&jYUKYTSc_|nFw&zA2_REMuFemf=&oc-yK l3fTDk>pw?78sbf;NhcQ0f2qATvJ!lvI6;So-U3d z6}OH~I>^~zAixqlXKP1lM||~%g{%<`^6_O8s`PRaQYSvHYwv%$BemSgqid$m6dFJvOMu9^!w#LQ2ddg&S#%SpUfddAKI+`YXn&vGF%8+X~@4`@ao}2N4 z5nukz&rS?}PBY|>e=cJDAIHeZyZXv$Rt1mDNZYq2zWxumvo54w0J@05)78&qol`;+ E03-uU{{R30 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_top_e.png b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_top_e.png new file mode 100644 index 0000000000000000000000000000000000000000..f625b709e4a3bd88a6dfb2ee73e75ba96e48033c GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6boFyt=akR{0D%KUh5!Hn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_flower_petal_e.png b/src/main/resources/assets/betterend/textures/block/hydralux_flower_petal_e.png new file mode 100644 index 0000000000000000000000000000000000000000..892bfa06af042d14c6c5e2c79b2b0150ea140a61 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6<*JzX3_ zDsIi4Xvo)WAi(lBX5PekZQ@HBj9j&}x-PWHf0!#1xx_V_`!~-tzfC#!->lQ05t*!nkS7j~?>9H;lhXXe@IijP+tGf6a7-w9>h^7F1eUkA5EaCpP(rdPir7}s%c z?cd9EN1|fItCh^9-|c^=GT!%>f9n1*|HUGX1yYRXw{^;dGG4J`v|6asa8`$n5Wa2?xtq36GL2@ltS_4&D-4}JM$(p zFWKE3N@#n~n~0ZcL=UAGp@$w?N)Ht+G$L&;QlYm(DfDDP5QRYcW>0C_8;=a6NL9tQ@}^AP2sZfZ!!D2Gi8^d41Oi`*)nDZSORC3m)37b3(EHk-{% z)6DRw26fA_ATpp~XcD2t?Ld&07Q`cc4J8)S$P0zX1CVGW^L$Czs`Ru=!4FflLEHa*Y5b7C}Q0f3(n&QHxsL?U*Qpg(2XMu<%R!^~EoeLh<`QNBcueTYHp>>?p#*V)D zerh5X6U&lDFCaUj<4QYZaE8TvDWYs*S-LrrunBQ7Vnpz$!g-^gsOi4Tpjb>2Qvk2e zdV$NE@zE_ZtV9H}RRbBih73(ND~5qhBolWGnHZri)ZwmIZSM#*FdE$kl~v;sLH-r& zQe5ScPb6p0Cp8Acpr(Q}lDNnlJd%c`cV@>6$HC1a-~EWMx=as@L-t0vP;w=ZAfbSX)0U*7$n@@FGYHWz8Uu%4vllB&RyUM%y~ z?lr|Zw%A)WJkTiwOlVTzwn~%CGRdHO?7eUVy7J9BlS=;~-CbDBtD;FFHeQp_`Y#m) zrT;ML#x523Jj>4Amd@?N+2Wp+<16>;GIhqyz3Tg4JzL9zMt6Bjc14N-t!j@A2{=wdAYIr^(?yk z{X;nPm$9{li2aqZBl;l0+in*$%OIadyy`tj9I jKl$>H)wz$3<`m_-Kij_^dH+r&8MWn!snX|fp8xPK3_;iO literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_sapling_2_e.png b/src/main/resources/assets/betterend/textures/block/hydralux_sapling_2_e.png new file mode 100644 index 0000000000000000000000000000000000000000..456326a5baed1357516c361afc337d0ad6e71ac6 GIT binary patch literal 1523 zcmbVMOK2Tc7@iPYYHgtpH_U<0oEeOKi(wI5P=Y8?mwUhq`H@6U<9uCG{j0EA4zIgNq7Z>{l;h{~pJjJH0 zlhCG~j4-Vbx#cYlk58gaMxN^B4b-!JTDOu zvC(tfjE+OLMMvfNfGCqBqI025M$d6Ihhl32SPThbG%QnE?*?k3t1>7SlV@BX z(?)dUo;Soqj2NP>>YAkLl9np#I!viNa7Wb?RMj@rqS$rjw}omjle-Vfvj!uE{uPXE z=+MwZ+-BE9RiXrbRRoDAVUgBp$OUulQY|ek3zqzdA>Sq?(-67Yvg=~#I2Fxt?2P1O z^GHhT>710;GMc25w2dn`lSLWQeQ#2GE)H(@J^r8XPlYZoE>wSDp19=Vtbk)~#N##J zDT>o%wzI0cpp^&^*>Qp!q8&$;V6k)TKClPcw2d0!r2i1^HY}nJYoL&fRJphQOGYVN ze~-YrMyOS~5q<`Rn%Gt*znS zL$A*E53H=M?W*QJSzbAG+xd0%?7{Kg6Bql=9@by}h z_x$Gd)%trqSAO~a;KtyW&oB0Xr44p-OMc<^J<8yZJKmv-SKiL|o|t~+)ZwY$zS$@S zOFQ1Uy#K&X@U^_YJbmrsTc2NeYzf1m(vqOB+&bD%SN8w>`V(K=+4t?qA6_#rt$tU0 dbl?Lv+ap9r-dvx)0rj{omqy3U%g;=o{}aHp@XG)I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_sapling_3_e.png b/src/main/resources/assets/betterend/textures/block/hydralux_sapling_3_e.png new file mode 100644 index 0000000000000000000000000000000000000000..072cca9e703b9a67aa0d028082b16e2c4e94d61a GIT binary patch literal 1530 zcmbVMU1%Id9N*d!Y-^w(mexSKZV(i+x3jysyY95>5pPp-#ZAKHY)>ngx!t+jHMcvP z-AV2eL`y4TQ83kqf>gvJ=!@333PxH=`V=dOKIwz458{)a1_ePmXYXTaC4O~bcD{b| z`+xsWPftENxZ~a(9LEh7CX6DRcg5q*0rua&(MD|A9!xwDaooOzMXvUPkc348}a=X7B#7RZ;)X+BRv%%@Ws z(UM0MKC7kV4A7L(5ncguRsvZ`Rz)B~kb$bk_dbD13+*Z_8i#wb*iIK5N&_fKjYcEY zP*WtVNwTJC5>O;X5g9^^mVAnuq8|f)^yTe$;al zbC}dbfh4CuY*GhkTL~^$2@_OMSQhLsa+;1Eh8hx`q7a(#;c=33KCWNfO7 z=OrQ{I=;xv=s9FlbW~ajuvEkmSqLpWzR1)Zj;#q`KE#NUutZ3`AE@cR%6vW_2j&3( zz%kdiNh5mjrZ?C?6zhTl6j=m{D61t!fhu5udkClyfG*S|wp(4=6e`2Cd<&Fijg2V! zSFmltDhWNrY<4|V!&2ba1U~U3%#%6^nP8@!+R?%^VZo0m@-192bb*2S1uKp$wuRoYd)pr9(l#8-NdF<+U06h_w1GlAR%71! zFBv5<{iV1XyQWBgwX$<}Q|0#ItR2M5qz|!8(#f#T+E>W>)WvUi#ZB`4f-zP)ux|a{ zZs)e%e`3BhwBlSCJPO*^A3uD4aMpg|J?}{L+x~M;f7bfxmz^)_>${aNuYGmu?S1cV z0oPVni+8=1%bgl39*nZXpAURwTvb~yA32e}^ejDlbvL9wx0U%n<@YJ`bt@O^UOQWw!O1I-1CZh{iR>8 ny#95g^~}Dt!rtS~7oT$6_wdylBg^?u;_h4+pEN#rWcK8r85r?p literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_sapling_4_e.png b/src/main/resources/assets/betterend/textures/block/hydralux_sapling_4_e.png new file mode 100644 index 0000000000000000000000000000000000000000..d89004aa7a1b69c12790285952ede208de16c50b GIT binary patch literal 1520 zcmbVMO=uid9G|p)w28GrK}tOIF+ow<`QBtRk4)EeCz=H(hGa4E*0*oo?he_RH_l8l zn#Yca9z1vvu|3$d!uV!ChE`%*JMiXx{oe2Y z{Xaf4{nEbvp?;3z_LZj0SvC)*W6vY(fAD&O*tFN5dM)I*fhW_^$8DZEz;O>h-h6j#q@be>mFy4fWz$Fm^O}F8NuxapZUdYzzvBZNmBw951iBuq1ux3D!1_X?VqXJfP zD#+`iGAiq8?l4egB`?W&NznvZf$}KSbkO~HCM~e5aMpaWD~s(6z8*zBl%zP0#aI(* zP?Hp0*Ckn%R8?RIAzbky)D*mMxW{0U5C@JQIn)CwBdXA)$l#f#9TQwXqxHhBo0!9- zCh{dklv9)1KpST`e<^6Rh1*yn4dN0n3K>?(uzsCJG_2GApw6!E5Wrk(S(%I-b#dKH zL>NsjGc&pl*%2LO)I8kFS@)S|XiUD*+;z+CPQD9aifMd+Sj z8^bCMT*Pd4TvQ{H@6~vac@h?Bg9c16(@tw^VOg-`g%R>FDVYY(%oZKThBi_vRf1JP zMLAv2bGeEzrr|MxRPac?YLDs!ReSGEikH&h_TJn7^ZhGr`@@f&(_-!8vlsk{@cf~lTHB9)pzVPE;-uUo`kI#G!&V0I_|8}FlwQZbC_Pa+~Ygd16ZC(83(m*cH Yam)4ZN>>JkcBMVJG&ya4e)QP-Khvi5UjP6A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/iron_chandelier_floor_e.png b/src/main/resources/assets/betterend/textures/block/iron_chandelier_floor_e.png new file mode 100644 index 0000000000000000000000000000000000000000..6bf84215ed916de6fe5acd65ba24444972f83d3a GIT binary patch literal 1454 zcmbVMOK8+U7>*B$wiK#@NG}Z$)S}tEw%ulEtm|&I3#OL3rS;})W_CAplZnZ!n-)P) zFQNz0TNNtkMFbJA9*Sp=UPKRCdT$R!P*B&&K0+(?8IsKFo9}=BHz&qVcX#%7avay4 z8_Q0zu_yX=b+CWmdL6Q1w>Ne^;JB`R(YK9TcyNH@cCOp`89HO00Tyu*5Rn2-gpSA1 z95*}?deEB1lrP|t?Ha<`%O!!gks(YEn6l|*aM>Q4_wl*;@w_!ZYw1WBInEDe%7l`jOnyNfA8!)CTx*)Kj4gF>oLEFaM=vomS`OI~9pvXc zEKTBoRDBDNUSetbEnKTk-d9jJ-6%6ujh1!jmpGHttv)PnvEcW@R`YzV5X zDx$24ik4SZz}^A*sH_25ZbD6h?Bd*(&?L}Oo1iRf5Tx*rU}S+J@g2x)wjEf)lINBL zKK3NYkP7jcV5Xhc(84r9&J8GZEu7050y8^d+X!eFY6{Y@s22(;u`rk{in=Q6Vo@DJ zNt{GQR7ke(XNgsfg4@22{_*}<-)6-HEC0%_=tENCW__ zD8UWEiXw}V(Au{D+XGG7S{XCa--Npf3rLaHppVlf=B>ZUD2eGWMb+3eMf%yw#@U9- zZNphRh^BELVvD$wVVAWppY^E^tJBM@$H81SogaE_eXiF>c036`yD zzdwC`>$=^uxCeFiFPLAZK7M`Ew{~ZBJ3VoC+uG6+4(lu0jqbp)h*Atb9NRS(U?p53*w_85DX z-3^>LRH@WUB@R`^32q4GfVkz53qlAaq^Os2Lsbs+)J7aCwS{!N4=YpwS}Z@tGvELH z@BiDW$#eUA5BCa!u)i>2PV?`<_}SaT-vckUF#miQOney$!bcy+&o1G|8=ncn?iX%x zj?G!;kxe}rJ9L4_4KLtmK{!3!2(Z0K7+4@>*Ehu9R@X$}I)*qqWI-#)lZrdB6q1>x z$)dfqXy+Vp_zXDRK%BrM41v&rcK?}kb4RJJ92V%00 zOljaiQDqpr)B-wof(vS4wWZv#6;dT0@ma*NYJv?al+ma{-$0!lzovkP*0K^EJKExT ziHeAgU*>Lf0hli07-> zX^I(gsk5rOpj8M6+i`&#q8(?JIAUkpeeVdgY3mijN#Bz0HY}ngR>vV3E%Rvomx@xj z{Yu=8ZC8|kd)YeM*126c9|!R=nM3?1nPkN0<16HI>e3gVuJIXHE109j>|=W#?D~6a zYv8-tHRIL5gVF-%yVI=yvevtr{h?>Gzp%dV?$hgEfAD1Z<>rB3<&izd`+tA+*H_>C zF?=Tf^T^@*!c=P+) YvLLXB=-$=p(bkkLj8B>?WAoSk0qEDxPyhe` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_sapling_e.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_sapling_e.png new file mode 100644 index 0000000000000000000000000000000000000000..91521f55b9fa99ae2ed5fd5fb78d77f5a2f12c4d GIT binary patch literal 1727 zcmbVNX-pJX93RSJ0gEDR2q99YgSJ-PonzT+WEI>6fwD-~O@L22%)Etxox_=dU7#cc zYY8=>2W@J(dVa8xHniy#DGF_^Y5X86v^Jz4idtKWB`Hm;vDcerccTrxoaD`WZ{F|y z{`Y@+tE={;rRJm}2$EJ_=JCNfT_4G7;5%>m4+c&ta#@{{@xN%g=S7G#J#auJk^)ex z*=AzN0t&S|&7_TRQU%*liXiPcVaG{}i6CjhMq8X{^ueGsg$vL=Pia&Z+_|tuO_OOH z4~0VJki{%14LIp^I&p%+Dar&9Cbdn}n6ODy^J5Gipt1@tYrG_)IwMmrwP-F3YPw>A zAjfG%HR>klFg(o2IB6zylOjNljpO7NB^VLTu{a0<0f?Fkv1A-8H%gkMHcEd(9Y4N9 z0CcU_8<(-FE`ksjp=u?q(2S@nKlo}}GUP*R{^sGTLEh1W}$i>k(m zEGYN5Fle@!=Q-LIs3#pH2~0K+u$kX8K;7X8fMwFg#c zLyZ8E{zJG|V5$_*LW}~68=$xTOGe>Pe_XG|6;trPS{XUJt#V^<*bek%ybr-mypsVD zwl4+tsZ;A;G$TlYQtm1CJI=n@KT(lbY&?8!adGdf9wKYpR%mR8EFHt;$(u&a*%JhDdRY2)NbT9M;dkHS{)9O& zJ-Dswp}vZg;712<+_S}A^nNbdfBw?Vtd|VNja;_o|2XA%eZJHq9L#1%=xC> zsj2?o3?-FzhFd%>8{b2!iU-Hlt*EuCW(A3SaEuCh-)`NI9557wm{9Ch}7 z*5C12?I?e3;7b2#Walh;{p(gSMU+(0?)IB~_lcb|2{e6E(*~ A?EnA( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow_e.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow_e.png new file mode 100644 index 0000000000000000000000000000000000000000..1c3df136998375daa2315fbac277d45e3aadb76a GIT binary patch literal 2064 zcmc&#ZEO@p7+#>XK!a_m7D80kZBU5r?d-?hbyv=E_9{K)YAu&gjMUEV%-wBzx4Yfl za@Q)L5C~{cjL{mXU(rDPNK(!65soP~2Jikcg3inNk@CApT*DkcBb>(9MNZnLeXH4a6US9{kq zYFGaPiYk3wkGHvPv6YHuW_%EtD)!|v7C}?gvih6_wNC8PDo*M~h&em_DMRZh#H{wm zK+I~uDZQ!J#;bap<63X0CL^Z)9(q|$Ap{xhLOPd88;+6-F?n8vjJ;`&q4N;8GsJ|w zfOK1|g>EoyO#6KSR^ugs4$3}00AxYBixvPMaV7k&(hW}}4C8o93! zi#&yxl|S>}Mi2?9$HtkYw-Fvl8B?G!@IEvS!4c@<5F-GAXMw=-LY((260Zotoj_Co zn1sfN6%cgczrkLM6(IcsY$83;^PfHdKd?KrGS7DUa>AaT| zsCjk|F`CzBjF`f-ei@yvEu%@=Yzh<7t2BQS=9mdL3vC=u5>2ngU)+`Qci_6KXD?$d z01yT&k2Rjfb)+vUj|4UWWCXMzR1=Wsd8Oo@u-hS|v+p5a%esA!%n>UrU%;R_L{kHPlyxtc|!sQzm4*Qqf8h+sY^ADdc zoAc1h!$X^n#JMAfL=lYty5srJ1#QdX6(vWhwhLV+K~=>KA3XWk$eG>e2abHRvErFe z7HoZL*UYc?9UE5%_x$iID2>Nu?#C}iQ++$%*n##zsm(%`yMU%}1Xe zkUNrV``7%^``nik9W^`qz|hCXvmXvF8~W(f=2_dGn7Q8Cx$Ta!-3Mx|@rn5tMxvEt z^B1MJ$d7-u^u)2B_Z-|?@!jInu{SChdV0+tBO93Zck5r0CLV3te`;*_?7qn8+rM{J w&Zs}M5l(;PdxN{>#?fjw{uVp&+J*yV?T5RMpIE!U-8-|Rjm?pPdpkD$1<_5cVgLXD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow_e.png.mcmeta b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow_e.png.mcmeta new file mode 100644 index 00000000..98b9ae71 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow_e.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/betterend/textures/block/terminite_chandelier_ceilt.png b/src/main/resources/assets/betterend/textures/block/terminite_chandelier_ceil.png similarity index 100% rename from src/main/resources/assets/betterend/textures/block/terminite_chandelier_ceilt.png rename to src/main/resources/assets/betterend/textures/block/terminite_chandelier_ceil.png diff --git a/src/main/resources/assets/betterend/textures/block/terminite_chandelier_floor_e.png b/src/main/resources/assets/betterend/textures/block/terminite_chandelier_floor_e.png new file mode 100644 index 0000000000000000000000000000000000000000..2fd988b4bcdc89058ac17c2a339d1ca9577a7f5b GIT binary patch literal 1468 zcmbVMO^DQ19FMqN+O=B>#j<`tADN4#o8%?){V*=;%<2r7-DP*s@#ahNW+v<;FD7rz z>{3KT&_#5wR@xp~Xm1v8(iSYUagcD`1oo3eK^YhU%c#MK78a?PKSc9=d<|RCEWaWLJ&q?I<-2h8z+!O zT^ZZdByz{~Ia&}7Pj!53EfEGx(sVpseE!>A5jeIkp2`}~@JpoSR8|ABxH?<2R+p@z zElwQ)hdYQ9xP)QQaob*qI=a~7MSLD_De{B+#ImS72UI(-Kq>%%OA<3?7k73+x73C?6Zh;wxQjG3FyhiK0l3(lQO2idrld z6{sniCUJxmu6PW0Bri-28OkKI0>@_#^+3#sO}fl9KyVfug89VCYx`~L8&79+A z3>>l}I;^euL|GsqT@EZVbB?Q-immZcDIl29phjtX7^wN7%Aiz=15*HpPC1@Uqwvcu zcSspCqKg{TR0(R5nyzUY;%^py1=9$^KGdML(^%ONnn7A&8V*t@7O9qXk((_$j*T*nM#eUa4JoZ=Oi9aU z@{(D|WF<2Tp>5(^0h;FUewkX!ad3zC?f-dyE^v5p;r4s;#3dJJ1*$k9kJrkeC>F`t z!L03oULqiD#R;y9RvcMki-T?Fy*<#Ujar10{!6&~u#h%bgab0&`-+uux7MwT9YxB1IG`IDcfzdm;3$t59`N^LY2&+omn@nk)!M7t2Uf8n2p54GRB zFZSIV{SzG7v-Y|6{VV_3UGOukr?1Q{Ok5CtUHxJFj}IOnxboxZ$0v6S2OrgM<|Z$X P#Qn88Gh4oO^vuQAPfXIG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/terminite_chandelier_wall_e.png b/src/main/resources/assets/betterend/textures/block/terminite_chandelier_wall_e.png new file mode 100644 index 0000000000000000000000000000000000000000..b1da1d0cb746693dde54d5610eaaa933eec49023 GIT binary patch literal 1468 zcmbVM%WvF77T&>qJ+}AhQQb7%4eUxdMCnRN)dQIw&+b}TdyGBl z?&gFzAhqI9q#g=_{{Z!Xddndop@M`2s>*?03l~mp)k6=Z4WIX6wJ5x5*`68u_x-;2 zcYb;4?fo-HW)wx)U$0eHU_FpN&rid9?%pni<%OtrCQ+0ZUrC=S<+INZE6OwX{KlGG zbKfCM1UmIZlk5E;0<@wWpYKPMZE%U2yzPgMdV70EMZV{#s|D9^qYCf%wXK++-dbv~ ztqo>->ih|Gyib52;F6+#&-4n3=aw z$=1!HVO#k(k!6@AY?QE>(+rasMUu18_)-F?rP8V?- zo3?FZ!@`!O0YXa#p`?8+OpZ+$sytz_A4y+?C}pHgu_+xDEFHNJL>XyOFsDwW((EyFT3!_v%L!?Fn61>+4PM+{>Gb%p1*275yDfPMlBRpU`f{}t>p(h_k% z!Dm09ZH}X`t)eWFq$0W^2E|}qZfJ$;l6sg(8Zut5Ix4uW`@TntR-W-<$<)fWQPc`7 zU((7}F{c#@7Ae7_xoG#PdD50ktAf=01oAZ)H^piG z{&?5*(XbE*WodysDoZoVJ$3xqf9eQ~XnP$Fr2mla5iAic*`qOEXhXFAOGRO@AE(_o zas~g@%i+JrI(Gtxagc7aIRuAnlJOA6R}6FN>?aqm!i*F3>O!OZ16xN^f9&qgeZ0Ek zJes@KYND6F9Q1DO%xsr0Pv4!bU*GrD%}eh+`{Vq>yD$B&pM37s**lLOoc-wj{E5mh zCy#vFK6?GswHtF+9v=Gb;PeIvEF7(u@Yi2_^L_2pse{|=KPy)c&t8-t>{AZ>l;2jr S`}IOPU+arY)hnmgKl~Fk6VGx0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_floor_e.png b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_floor_e.png new file mode 100644 index 0000000000000000000000000000000000000000..b7733670fad129016a439d02660f69bd55aac684 GIT binary patch literal 1454 zcmbVM%WKp?9F7kbtrn_+h#m|Pe4u%6x6RO4*WGFtOfBt-6)#R_W_Lq3nV3x7v2cxGVLD;Y*`Bn)Fx3&qw+7E7dicLAk0HU4(F`Xt#>;)Vx z2t&hh0MQI#;xwtczAY_1S(HQ<+tSH?M{|M#skx)`A(@;XE2H@tWMOIepg0r*PT&y+ z#n`L+5r}Q6#S8d6*;Xa71z|I`lurbTQ_i?ppdk_am7I+9tRW6qik{OfBYQwJG<`tT z22|aYH63U!bon^MfHEo;V1u3l`b=<@qrp7Q(bwx`|Y5_4yalvd@ zZwbdpC3WHvpG6$2r`VuI8I5Z67u4zT4+6Mr9VeBsqAs47iip_AIc`SBAuFPz@?1dF z2@=uS5Rs8{T+LmHH32Au1Tq?yDXn({HQrTOEEJN!42pYCx<00jXy39sqzDxJcsW8}oASz5MyDn`J!o_4SJj`7!vY o(s$>c_B8W$N9Jy30YpL0Z^IqB;Wu2@BhNs=z-N;JzX5f zt3#9k}>k)t8Ut=tgZ9o*Gxn>lXDM<+i?C(VPoYXR?d`Am$eP9!OyQ#A>HNEUvpjHYouBA4Wz)~%k~1~n%o0a zSxHNBT2c~%tUx&h6B=k8Jku7~1vqZ(Z|Pz?oi9=9LrJPut70`FlAtIlnx;vzDygc# z5JFh@D5?owxV_C_;Lr*jpE|??5hI!+6{_>h(xwZpAJckaD@-h4QVsc%BFd3V4WMns zIKL8<8_I1K=M0@^Zi|j%!%V@>q?1}okTskXa3P6>Ov*+= zGL4YRP9=q`w!A^CN|fBTy#1f@hXRK+7b-8BCu+HqRDY^}-;XcPiO zR#f0RZ$+8KHsAW}EII;B+G+_i(m$lT2@6SqR#AWli!56IQc)7KUy8c1>5BBLmyLfv zb#5EZ#zC}<=MdY(lMH)odHN^0d%Eh*i_6ECKI#AVVa;1{VA+oD_us!9JNK!7U-tPx&;8=Ir$Y~( z_1^xr>Gj6W=}4fW?tFdtps@)&>K-_aKEK&={zm7^^Xr4_mu`w2M<2qwXUba}Q#Lm| KYTO<=arOsop4F%T delta 107 zcmV-x0F?j23y1-bBxFxXL_t(|+GAiK0sQ~}AB>t)Bvg&007B%L64l{De(XR N002ovPDHLkV1lS#D`5Zt diff --git a/src/main/resources/assets/betterend/textures/block/violecite_furnace_glow_e.png b/src/main/resources/assets/betterend/textures/block/violecite_furnace_glow_e.png new file mode 100644 index 0000000000000000000000000000000000000000..1c3df136998375daa2315fbac277d45e3aadb76a GIT binary patch literal 2064 zcmc&#ZEO@p7+#>XK!a_m7D80kZBU5r?d-?hbyv=E_9{K)YAu&gjMUEV%-wBzx4Yfl za@Q)L5C~{cjL{mXU(rDPNK(!65soP~2Jikcg3inNk@CApT*DkcBb>(9MNZnLeXH4a6US9{kq zYFGaPiYk3wkGHvPv6YHuW_%EtD)!|v7C}?gvih6_wNC8PDo*M~h&em_DMRZh#H{wm zK+I~uDZQ!J#;bap<63X0CL^Z)9(q|$Ap{xhLOPd88;+6-F?n8vjJ;`&q4N;8GsJ|w zfOK1|g>EoyO#6KSR^ugs4$3}00AxYBixvPMaV7k&(hW}}4C8o93! zi#&yxl|S>}Mi2?9$HtkYw-Fvl8B?G!@IEvS!4c@<5F-GAXMw=-LY((260Zotoj_Co zn1sfN6%cgczrkLM6(IcsY$83;^PfHdKd?KrGS7DUa>AaT| zsCjk|F`CzBjF`f-ei@yvEu%@=Yzh<7t2BQS=9mdL3vC=u5>2ngU)+`Qci_6KXD?$d z01yT&k2Rjfb)+vUj|4UWWCXMzR1=Wsd8Oo@u-hS|v+p5a%esA!%n>UrU%;R_L{kHPlyxtc|!sQzm4*Qqf8h+sY^ADdc zoAc1h!$X^n#JMAfL=lYty5srJ1#QdX6(vWhwhLV+K~=>KA3XWk$eG>e2abHRvErFe z7HoZL*UYc?9UE5%_x$iID2>Nu?#C}iQ++$%*n##zsm(%`yMU%}1Xe zkUNrV``7%^``nik9W^`qz|hCXvmXvF8~W(f=2_dGn7Q8Cx$Ta!-3Mx|@rn5tMxvEt z^B1MJ$d7-u^u)2B_Z-|?@!jInu{SChdV0+tBO93Zck5r0CLV3te`;*_?7qn8+rM{J w&Zs}M5l(;PdxN{>#?fjw{uVp&+J*yV?T5RMpIE!U-8-|Rjm?pPdpkD$1<_5cVgLXD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/violecite_furnace_glow_e.png.mcmeta b/src/main/resources/assets/betterend/textures/block/violecite_furnace_glow_e.png.mcmeta new file mode 100644 index 00000000..98b9ae71 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/violecite_furnace_glow_e.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/0.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/0.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/0.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/1.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/1.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/1.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/10.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/10.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/10.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/11.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/11.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/11.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/12.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/12.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/12.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/13.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/13.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/13.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/14.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/14.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/14.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/15.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/15.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/15.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/16.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/16.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/16.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/2.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/2.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/2.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/3.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/3.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/3.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/4.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/4.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/4.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/5.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/5.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/5.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/6.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/6.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/6.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/7.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/7.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/7.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/8.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/8.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/8.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/9.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/9.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/9.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/cave_moss.properties b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/cave_moss.properties new file mode 100644 index 00000000..77f44365 --- /dev/null +++ b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/cave_moss.properties @@ -0,0 +1,7 @@ +matchBlocks=minecraft:end_stone betterend:endstone_dust byg:ivis_phylium byg:vermilion_sculk byg:shulkren_phylium +connectBlocks=betterend:cave_moss +connect=block +method=overlay +layer=cutout +tiles=0-16 +faces=top \ No newline at end of file diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/0.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/0.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/0.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/1.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/1.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/1.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/10.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/10.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/10.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/11.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/11.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/11.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/12.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/12.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/12.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/13.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/13.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/13.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/14.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/14.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/14.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/15.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/15.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/15.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/16.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/16.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/16.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/2.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/2.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/2.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/3.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/3.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/3.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/4.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/4.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/4.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/5.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/5.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/5.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/6.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/6.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/6.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/7.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/7.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/7.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/8.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/8.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/8.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/9.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/9.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/9.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/end_mycelium.properties b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/end_mycelium.properties new file mode 100644 index 00000000..d4138f3a --- /dev/null +++ b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/end_mycelium.properties @@ -0,0 +1,7 @@ +matchBlocks=minecraft:end_stone betterend:endstone_dust betterend:cave_moss betterend:shadow_grass byg:ivis_phylium byg:vermilion_sculk byg:shulkren_phylium +connectBlocks=betterend:end_mycelium +connect=block +method=overlay +layer=cutout +tiles=0-16 +faces=top \ No newline at end of file diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/0.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/0.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/0.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/1.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/1.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/1.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/10.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/10.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/10.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/11.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/11.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/11.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/12.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/12.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/12.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/13.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/13.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/13.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/14.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/14.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/14.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/15.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/15.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/15.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/16.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/16.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/16.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/2.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/2.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/2.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/3.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/3.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/3.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/4.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/4.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/4.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/5.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/5.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/5.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/6.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/6.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/6.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/7.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/7.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/7.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/8.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/8.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/8.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/9.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/9.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/9.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/shadow_grass.properties b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/shadow_grass.properties similarity index 62% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/shadow_grass.properties rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/shadow_grass.properties index 9aebf042..a519ff8a 100644 --- a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/shadow_grass/shadow_grass.properties +++ b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/shadow_grass.properties @@ -1,4 +1,4 @@ -matchBlocks=minecraft:end_stone betterend:end_mycelium betterend:endstone_dust byg:ivis_phylium byg:vermilion_sculk +matchBlocks=minecraft:end_stone betterend:end_mycelium betterend:endstone_dust betterend:cave_moss byg:ivis_phylium byg:vermilion_sculk byg:shulkren_phylium connectBlocks=betterend:shadow_grass connect=block method=overlay diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/0.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/0.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/0.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/1.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/1.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/1.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/10.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/10.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/10.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/11.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/11.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/11.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/12.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/12.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/12.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/13.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/13.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/13.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/14.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/14.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/14.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/15.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/15.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/15.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/16.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/16.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/16.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/2.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/2.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/2.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/3.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/3.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/3.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/4.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/4.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/4.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/5.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/5.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/5.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/6.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/6.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/6.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/7.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/7.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/7.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/8.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/8.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/8.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/9.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/9.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/9.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/pink_moss.properties b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/pink_moss.properties similarity index 56% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/pink_moss.properties rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/pink_moss.properties index e3379a03..092dc56e 100644 --- a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/pink_moss/pink_moss.properties +++ b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/pink_moss.properties @@ -1,4 +1,4 @@ -matchBlocks=minecraft:end_stone betterend:end_mycelium betterend:endstone_dust betterend:shadow_grass byg:ivis_phylium byg:vermilion_sculk +matchBlocks=minecraft:end_stone betterend:end_mycelium betterend:endstone_dust betterend:cave_moss betterend:shadow_grass byg:ivis_phylium byg:vermilion_sculk byg:shulkren_phylium connectBlocks=betterend:pink_moss connect=block method=overlay diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/0.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/0.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/0.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/1.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/1.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/1.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/10.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/10.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/10.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/11.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/11.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/11.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/12.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/12.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/12.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/13.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/13.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/13.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/14.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/14.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/14.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/15.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/15.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/15.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/16.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/16.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/16.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/2.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/2.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/2.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/3.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/3.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/3.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/4.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/4.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/4.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/5.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/5.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/5.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/6.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/6.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/6.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/7.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/7.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/7.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/8.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/8.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/8.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/9.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/9.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/9.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/crystal_moss.properties b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/crystal_moss.properties similarity index 53% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/crystal_moss.properties rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/crystal_moss.properties index 1c5eea51..02961bfd 100644 --- a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/crystal_moss/crystal_moss.properties +++ b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/crystal_moss.properties @@ -1,4 +1,4 @@ -matchBlocks=minecraft:end_stone betterend:end_mycelium betterend:endstone_dust betterend:shadow_grass betterend:pink_moss byg:ivis_phylium byg:vermilion_sculk +matchBlocks=minecraft:end_stone betterend:end_mycelium betterend:endstone_dust betterend:cave_moss betterend:shadow_grass betterend:pink_moss byg:ivis_phylium byg:vermilion_sculk byg:shulkren_phylium connectBlocks=betterend:crystal_moss connect=block method=overlay diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/0.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/0.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/0.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/1.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/1.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/1.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/10.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/10.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/10.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/11.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/11.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/11.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/12.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/12.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/12.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/13.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/13.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/13.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/14.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/14.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/14.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/15.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/15.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/15.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/16.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/16.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/16.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/2.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/2.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/2.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/3.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/3.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/3.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/4.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/4.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/4.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/5.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/5.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/5.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/6.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/6.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/6.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/7.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/7.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/7.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/8.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/8.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/8.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/9.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/9.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/9.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/chorus_nylium.properties b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/chorus_nylium.properties similarity index 88% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/chorus_nylium.properties rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/chorus_nylium.properties index f351f2ea..773c7b74 100644 --- a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/chorus_nylium/chorus_nylium.properties +++ b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/chorus_nylium.properties @@ -1,4 +1,4 @@ -matchBlocks=minecraft:end_stone betterend:end_mycelium betterend:endstone_dust byg:ivis_phylium betterend:cave_moss betterend:crystal_moss betterend:shadow_grass betterend:pink_moss byg:vermilion_sculk +matchBlocks=minecraft:end_stone betterend:end_mycelium betterend:endstone_dust byg:ivis_phylium betterend:cave_moss betterend:crystal_moss betterend:shadow_grass betterend:pink_moss byg:vermilion_sculk byg:shulkren_phylium connectBlocks=betterend:chorus_nylium connect=block method=overlay diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/0.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/0.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/0.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/1.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/1.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/1.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/10.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/10.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/10.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/11.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/11.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/11.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/12.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/12.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/12.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/13.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/13.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/13.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/14.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/14.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/14.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/15.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/15.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/15.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/16.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/16.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/16.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/2.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/2.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/2.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/3.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/3.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/3.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/4.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/4.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/4.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/5.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/5.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/5.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/6.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/6.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/6.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/7.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/7.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/7.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/8.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/8.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/8.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/9.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/9.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/9.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/end_moss.properties b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/end_moss.properties similarity index 82% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/end_moss.properties rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/end_moss.properties index aa7e4b13..18c68b3d 100644 --- a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_moss/end_moss.properties +++ b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/end_moss.properties @@ -1,4 +1,4 @@ -matchBlocks=minecraft:end_stone betterend:end_mycelium betterend:chorus_nylium betterend:endstone_dust betterend:cave_moss betterend:crystal_moss betterend:shadow_grass betterend:pink_moss byg:ivis_phylium byg:vermilion_sculk +matchBlocks=minecraft:end_stone betterend:end_mycelium betterend:chorus_nylium betterend:endstone_dust betterend:cave_moss betterend:crystal_moss betterend:shadow_grass betterend:pink_moss byg:ivis_phylium byg:vermilion_sculk byg:shulkren_phylium connectBlocks=betterend:end_moss connect=block method=overlay diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/0.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/0.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/0.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/1.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/1.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/1.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/10.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/10.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/10.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/11.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/11.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/11.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/12.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/12.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/12.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/13.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/13.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/13.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/14.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/14.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/14.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/15.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/15.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/15.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/16.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/16.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/16.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/2.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/2.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/2.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/3.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/3.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/3.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/4.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/4.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/4.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/5.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/5.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/5.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/6.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/6.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/6.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/7.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/7.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/7.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/8.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/8.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/8.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/9.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/9.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/9.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/jungle_moss.properties b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/jungle_moss.properties similarity index 90% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/jungle_moss.properties rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/jungle_moss.properties index a6065533..68671e67 100644 --- a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/jungle_moss/jungle_moss.properties +++ b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/jungle_moss.properties @@ -1,4 +1,4 @@ -matchBlocks=minecraft:end_stone betterend:end_mycelium betterend:chorus_nylium betterend:end_moss betterend:endstone_dust betterend:amber_moss betterend:cave_moss betterend:crystal_moss betterend:shadow_grass betterend:pink_moss byg:ivis_phylium byg:vermilion_sculk +matchBlocks=minecraft:end_stone betterend:end_mycelium betterend:chorus_nylium betterend:end_moss betterend:endstone_dust betterend:amber_moss betterend:cave_moss betterend:crystal_moss betterend:shadow_grass betterend:pink_moss byg:ivis_phylium byg:vermilion_sculk byg:shulkren_phylium connectBlocks=betterend:jungle_moss connect=block method=overlay diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/0.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/0.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/0.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/1.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/1.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/1.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/10.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/10.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/10.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/11.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/11.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/11.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/12.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/12.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/12.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/13.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/13.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/13.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/14.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/14.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/14.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/15.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/15.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/15.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/16.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/16.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/16.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/2.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/2.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/2.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/3.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/3.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/3.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/4.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/4.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/4.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/5.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/5.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/5.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/6.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/6.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/6.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/7.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/7.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/7.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/8.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/8.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/8.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/9.png similarity index 100% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/9.png rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/9.png diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/amber_moss.properties b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/amber_moss.properties similarity index 83% rename from src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/amber_moss.properties rename to src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/amber_moss.properties index 67a4257a..b229a7cf 100644 --- a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/amber_moss/amber_moss.properties +++ b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/amber_moss.properties @@ -1,4 +1,4 @@ -matchBlocks=minecraft:end_stone betterend:end_mycelium betterend:endstone_dust betterend:end_moss byg:ivis_phylium betterend:cave_moss betterend:crystal_moss betterend:shadow_grass betterend:pink_moss byg:vermilion_sculk +matchBlocks=minecraft:end_stone betterend:end_mycelium betterend:endstone_dust betterend:end_moss byg:ivis_phylium betterend:cave_moss betterend:crystal_moss betterend:shadow_grass betterend:pink_moss byg:vermilion_sculk byg:shulkren_phylium connectBlocks=betterend:amber_moss connect=block method=overlay diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/cave_moss.properties b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/cave_moss.properties deleted file mode 100644 index ab0683a4..00000000 --- a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/cave_moss/cave_moss.properties +++ /dev/null @@ -1,7 +0,0 @@ -matchBlocks=minecraft:end_stone betterend:end_mycelium betterend:endstone_dust betterend:crystal_moss betterend:shadow_grass betterend:pink_moss byg:ivis_phylium byg:vermilion_sculk -connectBlocks=betterend:cave_moss -connect=block -method=overlay -layer=cutout -tiles=0-16 -faces=top \ No newline at end of file diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/end_mycelium.properties b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/end_mycelium.properties deleted file mode 100644 index 8156c558..00000000 --- a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/end_mycelium/end_mycelium.properties +++ /dev/null @@ -1,7 +0,0 @@ -matchBlocks=minecraft:end_stone betterend:endstone_dust byg:ivis_phylium betterend:cave_moss betterend:crystal_moss betterend:shadow_grass betterend:pink_moss byg:vermilion_sculk -connectBlocks=betterend:end_mycelium -connect=block -method=overlay -layer=cutout -tiles=0-16 -faces=top \ No newline at end of file From 53e0773e5daa900d53839731d6aad9ec6e8f1982 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 14 Feb 2021 01:10:06 +0300 Subject: [PATCH 274/463] More emissive textures --- .../block/flavolite_runed_active_1_e.png | Bin 0 -> 1863 bytes .../block/flavolite_runed_active_2_e.png | Bin 0 -> 1850 bytes .../block/flavolite_runed_active_3_e.png | Bin 0 -> 1886 bytes .../block/flavolite_runed_active_4_e.png | Bin 0 -> 1861 bytes .../block/flavolite_runed_active_5_e.png | Bin 0 -> 1879 bytes .../block/flavolite_runed_active_6_e.png | Bin 0 -> 1882 bytes .../block/flavolite_runed_active_7_e.png | Bin 0 -> 1890 bytes .../block/flavolite_runed_active_8_e.png | Bin 0 -> 1882 bytes .../block/flavolite_runed_active_9_e.png | Bin 0 -> 1896 bytes 9 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/assets/betterend/textures/block/flavolite_runed_active_1_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/flavolite_runed_active_2_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/flavolite_runed_active_3_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/flavolite_runed_active_4_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/flavolite_runed_active_5_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/flavolite_runed_active_6_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/flavolite_runed_active_7_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/flavolite_runed_active_8_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/flavolite_runed_active_9_e.png diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_1_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_1_e.png new file mode 100644 index 0000000000000000000000000000000000000000..3c8976afab676e3ae1d511c588c5da028b32b1c1 GIT binary patch literal 1863 zcmb_dO^D<~6wc1-qU(+274T48+P;{R##QJ!*o)a zBs2Y^u&&~Q;?0|Q^Q_?RMO094f+sI}R#-i%2#O+(Fa5`k^sd8TAW5b2z4yNFy;oIl zY^*=Mc=F6iMNt;(Yqd>ypU&?)PQde_U-v1z?u^%-OBLm=d-D63^3J+ZLJH673)=Yd?MRnWhH3tX*^(W+SeOPOvsi#D(E{ zlMT0-$F-Fw)bo7;4nmPpwI6n)l=REm$S;9$K5b~~2$F4=wMrgP-D+&8RhbCYDHL^v zY^;{N0xFsww$G{9L?y#48OYL2M9d3eK4!x*`-&mI4;duyIFbGVRElxSst!5CBr!Xv|{FfE!jPH_u73632q zxKpzE)c)BdfW<|-NA{C1xx6dLT987$29rf`LF`OM-9Q~R0--E#@Uq78$_ijGo(|?@ z;BX4Y_Pve(r?)8g7?w&u>(NA1+K{cobd+&3{wdwNHG7xilEsj#a}x=jBHPznj#JW^ zXVH@DV%II%Q}qYgBiuwbu^eI*ryY1i_LJnY4vpFZ_Dn-Nx}L-J{2^z400J0Je?;OW1WbILcj@k@XH@n&WC+5^j1-OBwh4;Q|! zz2&}e{L9}Ku3oGEzHs;J4-YPXzxDa`+m~MY=uxqGOnL9h``=w&ynZb|>gucOwGW$(dAi!eKTFl2F2#w1nw>FyL8hp~Hf8q7G%Htcw_x~kG0rjyDf zndzRnC?bLfMergbcv}_EMT|9d7BzRgyTrZ-F2QT9I(tqq|?>YN);A=y>1jgmGsi{LqvF&Rsr9*Wq*ih>-6RK-e zbcP*Et$GHoAkT81RV{?8CaRj)))6MCLTpbRUmAGJct|!IFN}S`m#=k;A|GV&=5JxqO^!)qLvnETkaOV224j1;&f^@$;V-W zfSCiDn%F?4q#=;ADK6d3dPC=&nW86RkrX*#@f4eOWg+vfe1Pfc?;{Q%v_UZSF_TLi zPhI52>K@1#2V^EXZ|$eT+!VRo&6rr-1DcmgH7TiQf)+AsN!gnuYGXoKt=G%M)YPZ1 zMG2Sv{F(dKhz2c$uUW{#IZEo2kdA(p!Y1B6D*VHd&nXPNHfU`nlRC9_!`JIqKFgM#x=n( z)mfXibsjocr)}5M8FMLexy`H2NCm8KNVZ!hce0+tdW&>IcvD;zJL6F=Qip{=C@Txx*I1cZ!L{*p zG$R7XQ!p~y?+P&bkaUk=xeSXw&BRIvqIH~#G9Sc0r+W`)AKI2>*_`Uw5lpAd33W)M ztJ@B8sb>q0FvNcrdu+9^L+lE{l}QDjkp0*^>(Znn;LJ3&lj}KNJM_gH za#U*OKdW%~@4k~2(m9-h&nR2lS}j;&0yF+poR#?b)-RFFmoabK~B{`M>TQe)92W3)ib3;2+xOe>wHu<@tA#rF(OC q(n{0#@~7T+i|A&XzWL)R<&U4={eJMx#S3M3Yp$+0K7IbxH~t3WzDJ_~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_3_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_3_e.png new file mode 100644 index 0000000000000000000000000000000000000000..9f08d64f3517bc12b284e41791cda50060298df3 GIT binary patch literal 1886 zcmb_dPiP!f7@t^NYD!Uv*ccBEQv{37&i~z=N7op4((ZyALps<9TJq+-H@ic2=1pcM z*-a1(y%j_RZ<<4|UIfnt6$LMP5%JKQ?V+NV7V1SQ#&7l?iEe8MF3iq*Z+_qJ`+a}j zd)JniE}ovAn-&D&bffO9!27BEIaz@J=kM=hcs&u<-%17H)J*$TctQAC6>F$j$B{85?>9W;Sn{kb`gZfUwF6}J2 zWM`e&RGNQ9Jl{h=5V8!5y|5Fds8^Nxya>kmvLcCnNVZ;;7IKH;YI9kv@q~$1u_P1C z)Wx!0)Jm$Yn=gyHs+ASBtZ0U;YDg_1!xo1>3A`oLM=Q>Sp)Z(KrFNFZNKv}oZn0|= zdD2oe+qM-|S9Dzlgq&_i8ScqZdUnL%u#_Z0oCQ1*b4Kj(&8#Yc(m@DeJf@A(VVWRe zN)N}1R#fwl`anv?xOg+^^qo_punr4Zl%;^x#@M*cGoH5jL#W4}4>^F;Hk)G~6Sail z*hQKxZb2BsgiJ)I?sm+S6_)bNgs{aeka;$bCPuY{;fyCP=bcfZmPeAsS}iY3MSSsc z5K-Pu&mFK~4$fFr(p6oPRUNA4ss^%5q+2h+Kvf6OCZ~bFeHf}4t`1NeX{AF@=o*SM z{GVV-kk6A4L(D;lTTF?gmL!fdiE6yV6L1XbjJ}Fy6E&hV!x3Q(rz%0%#UP-_GCaSm ztEx=Bk|t}|v}9b;eVOXIS;oGFDa9juhm*~`xFdTC_LY)tGT-uL&oh{;W3wWA#2_+N z%T)D@3b74sWdBAIz~;i8WAo%&F7FCd4^pVt_Ha{NVjIIzClLFMfH27$yeg5rvW!Z@ z74&3$k^Tj#3_`KgC;*R&Q8l+1D78v0sMzsiq-U znBmEWi7}%v*FDJpB=wr^Y9=zu2RiVW>WB2CjiVNWGgFa{AJ5VHabi6G-ckQ+JW76A z4q8q5XBYOr9XMH`oc$#@uJhseo`A{treP7JDuH{%y1Vo_+(8=+XThy}M;`3&&!2c< zcVqUsd-g9=&TY$m_35wgyz}W-^}VTEPyY4ZpMOk$e}|ko@uT>~?*-#QVK@BNoB83& z?#=h3nMPr^ot^nPdG<}^-JPqyKKAzQ$~VF@zpc%kE1kR{%oVPGc=3bBXFs`q>cZL; ZLHNnux^->O*w1gk#^RFm*=uW8{{~jTQ%L{- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_4_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_4_e.png new file mode 100644 index 0000000000000000000000000000000000000000..f2d5ead95ca2e272417a4515b5ab89f34075f1fe GIT binary patch literal 1861 zcmb_dO>f*p7o3e{=8l@{GaO!wGyX$7{acn2M ziIAvT4j|yvTh;!BN?f=!65NqMf-?s=&`YI8>J=%x-Y+$1TcQX{w#Vb={d}I8`D%6L z!?S1JJR?cc*+#v#2JdsleR>X_7oQzcc)gm`KglHNwKs};M!I+Zyd=%t4VxSJhW9aH zA}Y~9_`KAQ566^5s4O2NBPy+>g3(M*0i zq&o;3)_bynbXP;Jrkg6#337;u<e zgo=^|z<^C~$#&Wu1P_?TyFB7?o&i>$V3Ur>Mb;57a6S2bBmlJ5^CmH-<`PAd5Lv#w z17(aFG8LUQcN4Cy@l0%|j4$s%nhQlW38|)><|1th(H#@DI!;-xRtsXv@;mEc9Ee_a z={Xx-qdBiA1~PON8NgZ-nZ&k;VZRFlgoaR01Yv9UC{#C_20$@E))6SECZIX}PjJ9U zOQaEnn!|{;xt7FjMV@q$R7F>$5E!yE2U&O?X~bDhW5ye`iUMVq!Z08$({XW`Ayvn| ztzzHuRmyFwI*wCzux?@BamMyF!L|!>$Myl(TNK-t9Uv9)z*P~pbk+A=s)D4;h?g9QI62Ie9(D)8jNYrmU#{wH~e5Er(Lm z{;k5nzvp&VpmQ(<+jTLVoD=XdIcazdtxDk>`F8){XE=j48nvZn`6u@G;o;)!+qbsP zzjc5g&s_P_o}GRA(JNPfoj?8g!QpSetj~Y;#GjWx-Me#PYwpMHUk`5ITqtclnfu_u xH(z`EGppj({cHO(^?P5we({U%(5Yvqq~AC1{PF#xo1{4C8p|uShgWXg{s->CM3(>n literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_5_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_5_e.png new file mode 100644 index 0000000000000000000000000000000000000000..22cc7a59c9e0ffd851a6f4112aa6bf2fe7506e2a GIT binary patch literal 1879 zcmb_dO>f*p7^n_ymCU4r1|QKy9VzU^ZVE=JWt;{pzt~#uUttb>A9EkdrG?b?SdrDeibw} zvW?nB!bDi0o@nwyFN^^#N#_=OF=d-PlbgI1L}g|F){lxDcx7eXs-aq3;q72$FX5N= z>J7HH$sA8vd|N)(Bj6z98I^lsCrU}Ltn~d780XWPBKINLW?5Ov1Iin`LnRFxD#8R6iQ&k@OMz&K=aV(}!Y~$mm6dju#YEG(-EN_4 z6hzX}u;Vxy(luRI0imY5QAT@el%5%RaCyp-AkG32$+<_`6x&%@flLP!!g%a9N{3~F zf@wV(Yq)@NN`0Wm#<+Mp>GXqpOyeCM@+eCIi^tfwEi#d|#Y0?=e;*0}rLEP*F(&2` zhT{-vw!8y0h6S03P8+*1*VcF{wiCvecOcC(Ih&YN5>7LbG=%7kgjyY?ELSSIFt+^0 zdJuV{o4)yg4R>kA%ZiS4tRfv$YaoMICef|8V1Up7S`%L2?;eI?qoD)TCYEss3SHyT zj6N3ZG2)9Pq`)}{X^U%d)KcVeB}qkeL;`^!JENaPtwyR*n$d{ys#{iob|DBnV%iiV zVU0NwKOs zwr_$tFWGox|3MPK;-Z}=_LDEUyer5`kb+*j!$on4Zw*JCK<+mJp)7Ckvchs@xu*=L zg9#Nl8iRq`ZkvPCN60;ZrNYm;G~r7vsMb+BN_$xTDcyN=_NHN&deN~!HHWGOH!am^ zI-rDwxQ{FY6wpWP4`+|{1~!Rd6NE<{_=MRHi_6+HYH`>zHRUPz9H}2CsWD+i{jYqq ze7795n)cr=?EiaUX9YR?Q?Om<;fvuONFE4LqLMM6I zB<;);(Na*@+k&^U;EET$2;No{#e*L7;!RJ2rv)!7^dt!N%lu<2vuh~^lDxe9zVG|} zzVCbQ-L9{_F*my~D@oE^wNl=I_w(ufOa`8pj*cn3&WDw^V@Z1UVtSvG4)4xOQszUi zv6*bv-Xcu+S?UUhXM27KXi2)Z+zTn&=85d^mKPM2hhKfG$evqNZdf%`3roE1RrVr& zeQ&M7_O_YrD$B3R*LnmT_&lL<&+h~==@pfMUjpNFT2tf!B-t)1D``M^vsRZ&BI2@@ z&8bW`v7EQFdJfsxyeea)=QWhqbVEftK{;aB^5{|^TI4p#M)~zoEchxa?Ia0_rggjB zY}d$&sHN$)ZEFZ?7^{F#<9?9Po*Kl9V-IB>v&ah*PXu!6kvd{0DJsBpD8UaWZi9G~ zCP#fxTlv zD)Q81R4+J=?$ELQdgQ_4qMbAQNtayO6{OHO~v#C-B zMYMB{t#V}MO^T6&9cQfmBzqk9_sx-u=t?>_ely(xWhegVxK a%}Cuhqu={W_h-`6ue!Qc{`|GAgMR>5`%CZu literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_7_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_7_e.png new file mode 100644 index 0000000000000000000000000000000000000000..0d484b921dd30fcaa2895efa0095f13830e54d1f GIT binary patch literal 1890 zcmb_dPl()97|*u0*li015$bwq$fCArCV4N(%;eE@yF0VG3(mT12fE^=FE4Lq!cOwi zB(pQSNG%=~trx+Ih~TN97r~n-vaLr89=s?hwSwqPg}r!C)-UrXbY*In#Xypmm*4k& zzwh^b@4YvdmtHtIIW;Ls(#gez>I%G1W%r{;;dy3fm%{5NYl?ld+CUnqJb7q3Vd}MPk_U@KPXJ>@~)R1l4nvOM$RY0i8Mwrr`8Ya^t4^^J9*pE_QgmUJQx}uXh3NRg{5Jb7# zFd51Of@wV(X{exQDfNLK%W+XBZuf(GOyg}H@GwmPi*jt#5~)a9;sLJn-+Kapw6$6u zV=R{-$U`LQ{5qsD6l5$qsc%GFTj7c5#Ej3c1I_6yn}}3mPE!%rg=miowLGFMS1MUy z%JSLEe&~sAa_&AGUZp8_6s%*U>KLk4*9~Hs1Y6I-K-UM*n(+L_#$G5g>KLG9ViakHWfKnl2k-n#1I(R8GRPD8d(gJl!lBiRviV>F8IDj z8W!g|LZ(XH5>}aIx~h$kt72@@61I_t86VkK1?yzR9oc(ek9Cf4k(O1Lc~mW%COlXf zt6rnwnuvjLt~auODfVG;(e{D;WJ@mV3bNoQP_K>QqPWDb4o7WY?l%IVENgH_VOeE4 zFc?hxV-(n51_S$Ui-XhuDE9!Ch(_9_F`sRMTKnlJ?Lqt#y8bZsrfqSXsYOs*H5;a_ zmR(d*4NEs{W-!CF%u)7x*&|#>CTuap$eZErUB7yI>JR(Z+pleXdvWXRsqL-F8*{$=LHFjN>1&6-JahfXg}+}t^2^RAZy|Z- zX6aq@jdtSJ-HAhY&wcpy(_cxw)r%9K{dnw2>BRB3w{KJV#`ll^`GsUX;@o?qc+bD} j(e8J1*FJrQuS`hm#aDisocirbb_y=eFI7LDyYl)!&7f3I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_8_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_8_e.png new file mode 100644 index 0000000000000000000000000000000000000000..082456bf76d9b347245ff8bd741a1caa70b23f7e GIT binary patch literal 1882 zcmb_dPl()99FAQWbeGklm!%g&2BAyMsc4plfG3$0av|A72o0pfFxRbmz z$?nW9f?H1tz4a!gdhsfP7r}z`qM`@A_0WTOS_*=NVh>AUeVIR@tJAtH29mtIe82Da z{r$#|YIT3`Jm$LgA;nN#)f>5~b zH`mj3=Pg87P{J;2(NaH%I9d?SF7zWzHfSogXxk5M>CbP!lSJROrAuW8I8l{${Q6Ez zFYK%|$<79`TxsDo@oXP)f`F!2><8U2L48{q@FG6WrWHvXK++9cTFe}Z>&~iJWib`Y zrHV{c9g2okQY*lM`l})Ys-XZwQ8gK;2vm?}iK9#6-eT87Yqd80$E4{pi6RGv>A5?&RwF=E)8gyCLF8g*r>x&mUP$?sPo^49PrdSPVQr( zmLSMoBYygQ)){PKvf2iSFH&&RMrtJpWy=lhERvOzPEiCs%lNhp(cX*At>(} z7pM3?!7f1_iv!GK_5<9eN))ywG0!BbvM!6cW3EmcsBj$A2$K|tgf?on#KSK6zKhD# zuv`!5vIZ+H*(ExZEvu}_p6QwvX&G7>>SOyFBb!-q$M!C_H#~zHP_<+i6HV4sU6os{ ziY1!{fEs|Hf~h&Se>?X1;=k3r&6JD?F(W1COuZ%`rUmP?7!X#^OTOwIy zsVj}9{RtU3S_DJdUWanhr<8jLOPH7Ta7-85JX=TUDCJ4|6TJ0w^%aX47Peg3^Gs6) zM0aJ3Jx|s!woDZOXjXXrCaG6pQ`M0MQ8{ncW2zs~lMW8sl<%2}bo_XZ){hh8`S*(Y zU*l1--E!D!%0Ihs@b9smm6vlc#kcEhn4c5;BR^?q$Ws;bbL8UH`bB;Q1&!Kb)BKq{ zIyhLEdS&;@+^PH4quU=A&Y#{ZpDccTb+`A$iQ>CcHw!oRfBB*G{r!7;XTF*H_=OXq zdT-XdrawIQ{I4@Vt}H+NY2(FPLg97ivzxc1-)6v_&+opuJhgj%fA5Y_xc%2V*NXG= b*QbTA{=mP#zyComJN+62BxX0FuM=L!k;`%awLRY4BSqvok^78xs z{=WCVYfFpgkB?7}OOkYaVZOF3-jmsVMvl*gCcRc!;0M?5@<;}Gt-R-U1ce7Skn(H@^4>#BLm;9$d^lXSdXf#<O4A6dYNyjF zcJv~Tn<}zxTZNjcX^KE7$!3_6t`a6EhZbrqp|KyOJ`X`=kvM!kt;izMehNX9n+=me znMA?VE{RlBgjq^Gpi6UHv>vy6&RwdqHVasoCIX9cY}Dc@Pg?u|rt{x>9Ej4^>$#7S zu>?WxB1z{qL>hyFj6^4m&4{VXEaB@hWpf)M%#&F*5w6CJq&#kL-X0RQGz=M3s~It6 z@YH2Lba^Lv`aT_2BPpxM8q|;iHNjc~>bPWJt#n!l5cZ*U?)u*5UMSKVnt+xu()K__ z*SI7l{|R;}_IMl+k+UC=CR3xZDTBO{xXRl+7LG-9dM}E49WR7QN(qJK2`Yx&qJpiQsEAy+s|vv&xR*cnm47 zW!MTqLNYXq5^9@eXqAWA?~NX54P*%Zv1SfC@PN?|ic4E0Y%+0Xs`A0}*2K`$-TW*g-n z>0i6MGh?S-T`NrAwSWEYl{bGrcI@lZj}`8`JSn}6-g;#F#@X-JPE7uNd-ujipA|l~ zt|R&0A3NKHcea23^7gH%C&qrdQrnq0dt!F+jYH{^Q%t(~!_~1%?-J>Yb1UGN_~_c_ rcc Date: Sun, 14 Feb 2021 11:17:28 +0300 Subject: [PATCH 275/463] Glowing Grasslands ambient, biome structures fix --- .../ru/betterend/registry/EndFeatures.java | 18 ++++++++++++++++++ .../java/ru/betterend/registry/EndSounds.java | 1 + .../world/biome/BiomeDefinition.java | 2 ++ .../world/biome/BiomeUmbrellaJungle.java | 2 ++ .../ru/betterend/world/biome/EndBiome.java | 8 ++++---- .../world/biome/GlowingGrasslandsBiome.java | 5 +++++ .../resources/assets/betterend/sounds.json | 10 ++++++++++ .../sounds/ambient/glowing_grasslands.ogg | Bin 0 -> 938714 bytes 8 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/assets/betterend/sounds/ambient/glowing_grasslands.ogg diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index c2386cde..7b69c964 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -9,6 +9,8 @@ import net.minecraft.util.Identifier; import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.GenerationStep; import net.minecraft.world.gen.feature.ConfiguredFeature; +import ru.betterend.BetterEnd; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; import ru.betterend.world.features.BlueVineFeature; import ru.betterend.world.features.CavePlantFeature; @@ -170,6 +172,10 @@ public class EndFeatures { public static final EndFeature SILK_MOTH_NEST = EndFeature.makeChansedFeature("silk_moth_nest", new SilkMothNestFeature(), 2); public static void registerBiomeFeatures(Identifier id, Biome biome, List>>> features) { + if (id.getNamespace().equals(BetterEnd.MOD_ID)) { + return; + } + if (GeneratorOptions.removeChorusFromVanillaBiomes()) { if (id.getNamespace().equals("minecraft")) { String path = id.getPath(); @@ -203,6 +209,18 @@ public class EndFeatures { } } + public static void addDefaultFeatures(BiomeDefinition def) { + def.addFeature(FLAVOLITE_LAYER); + def.addFeature(THALLASIUM_ORE); + def.addFeature(ENDER_ORE); + def.addFeature(CRASHED_SHIP); + + if (def.hasCaves()) { + def.addFeature(ROUND_CAVE_RARE); + def.addFeature(CAVE_GRASS); + } + } + private static void addFeature(EndFeature feature, List>>> features) { int index = feature.getFeatureStep().ordinal(); if (features.size() > index) { diff --git a/src/main/java/ru/betterend/registry/EndSounds.java b/src/main/java/ru/betterend/registry/EndSounds.java index 2d746ec2..319df053 100644 --- a/src/main/java/ru/betterend/registry/EndSounds.java +++ b/src/main/java/ru/betterend/registry/EndSounds.java @@ -20,6 +20,7 @@ public class EndSounds { public static final SoundEvent AMBIENT_BLOSSOMING_SPIRES = register("ambient", "blossoming_spires"); public static final SoundEvent AMBIENT_SULPHUR_SPRINGS = register("ambient", "sulphur_springs"); public static final SoundEvent AMBIENT_UMBRELLA_JUNGLE = register("ambient", "umbrella_jungle"); + public static final SoundEvent AMBIENT_GLOWING_GRASSLANDS = register("ambient", "glowing_grasslands"); // Entity public static final SoundEvent ENTITY_DRAGONFLY = register("entity", "dragonfly"); diff --git a/src/main/java/ru/betterend/world/biome/BiomeDefinition.java b/src/main/java/ru/betterend/world/biome/BiomeDefinition.java index 03980cea..a9547b37 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeDefinition.java +++ b/src/main/java/ru/betterend/world/biome/BiomeDefinition.java @@ -35,6 +35,7 @@ import net.minecraft.world.gen.surfacebuilder.ConfiguredSurfaceBuilders; import net.minecraft.world.gen.surfacebuilder.SurfaceBuilder; import net.minecraft.world.gen.surfacebuilder.TernarySurfaceConfig; import ru.betterend.BetterEnd; +import ru.betterend.registry.EndFeatures; import ru.betterend.util.MHelper; import ru.betterend.world.features.EndFeature; import ru.betterend.world.structures.EndStructureFeature; @@ -233,6 +234,7 @@ public class BiomeDefinition { spawnSettings.spawn(entry.type.getSpawnGroup(), entry); }); + EndFeatures.addDefaultFeatures(this); generationSettings.surfaceBuilder(surface == null ? ConfiguredSurfaceBuilders.END : surface); structures.forEach((structure) -> generationSettings.structureFeature(structure)); features.forEach((info) -> generationSettings.feature(info.featureStep, info.feature)); diff --git a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java index 87509059..a18bc64e 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java +++ b/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java @@ -1,6 +1,7 @@ package ru.betterend.world.biome; import net.minecraft.entity.EntityType; +import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; @@ -34,6 +35,7 @@ public class BiomeUmbrellaJungle extends EndBiome { .addFeature(EndFeatures.CHARNIA_GREEN) .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) .addFeature(EndFeatures.CHARNIA_RED_RARE) + .addStructureFeature(ConfiguredStructureFeatures.END_CITY) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/world/biome/EndBiome.java b/src/main/java/ru/betterend/world/biome/EndBiome.java index d8dfb17b..48e13736 100644 --- a/src/main/java/ru/betterend/world/biome/EndBiome.java +++ b/src/main/java/ru/betterend/world/biome/EndBiome.java @@ -38,23 +38,23 @@ public class EndBiome { private Biome actualBiome; public EndBiome(BiomeDefinition definition) { - this.biome = definition.build(); this.mcID = definition.getID(); + this.readStructureList(); + this.biome = definition.build(); this.fogDensity = Configs.BIOME_CONFIG.getFloat(mcID, "fog_density", definition.getFodDensity()); this.genChanceUnmutable = Configs.BIOME_CONFIG.getFloat(mcID, "generation_chance", definition.getGenChance()); this.hasCaves = Configs.BIOME_CONFIG.getBoolean(mcID, "has_caves", definition.hasCaves()); this.edgeSize = Configs.BIOME_CONFIG.getInt(mcID, "edge_size", 32); - readStructureList(); } public EndBiome(Identifier id, Biome biome, float fogDensity, float genChance, boolean hasCaves) { - this.biome = biome; this.mcID = id; + this.readStructureList(); + this.biome = biome; this.fogDensity = Configs.BIOME_CONFIG.getFloat(mcID, "fog_density", fogDensity); this.genChanceUnmutable = Configs.BIOME_CONFIG.getFloat(mcID, "generation_chance", genChance); this.hasCaves = Configs.BIOME_CONFIG.getBoolean(mcID, "has_caves", hasCaves); this.edgeSize = Configs.BIOME_CONFIG.getInt(mcID, "edge_size", 32); - readStructureList(); } public EndBiome getEdge() { diff --git a/src/main/java/ru/betterend/world/biome/GlowingGrasslandsBiome.java b/src/main/java/ru/betterend/world/biome/GlowingGrasslandsBiome.java index b8ac72bc..379b9a45 100644 --- a/src/main/java/ru/betterend/world/biome/GlowingGrasslandsBiome.java +++ b/src/main/java/ru/betterend/world/biome/GlowingGrasslandsBiome.java @@ -1,6 +1,7 @@ package ru.betterend.world.biome; import net.minecraft.entity.EntityType; +import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; @@ -13,7 +14,10 @@ public class GlowingGrasslandsBiome extends EndBiome { .setFogDensity(1.3F) .setParticles(EndParticles.FIREFLY, 0.001F) .setMusic(EndSounds.MUSIC_OPENSPACE) + .setLoop(EndSounds.AMBIENT_GLOWING_GRASSLANDS) .setSurface(EndBlocks.END_MOSS) + .setWaterAndFogColor(92, 250, 230) + .setPlantsColor(73, 210, 209) .addFeature(EndFeatures.END_LAKE_RARE) .addFeature(EndFeatures.LUMECORN) .addFeature(EndFeatures.BLOOMING_COOKSONIA) @@ -27,6 +31,7 @@ public class GlowingGrasslandsBiome extends EndBiome { .addFeature(EndFeatures.CHARNIA_GREEN) .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) .addFeature(EndFeatures.CHARNIA_RED_RARE) + .addStructureFeature(ConfiguredStructureFeatures.END_CITY) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); } } diff --git a/src/main/resources/assets/betterend/sounds.json b/src/main/resources/assets/betterend/sounds.json index 78aa8e92..797e3d1b 100644 --- a/src/main/resources/assets/betterend/sounds.json +++ b/src/main/resources/assets/betterend/sounds.json @@ -174,6 +174,16 @@ } ] }, + "betterend.ambient.glowing_grasslands": { + "category": "ambient", + "sounds": [ + { + "name": "betterend:ambient/glowing_grasslands", + "volume": 1.0, + "stream": false + } + ] + }, "betterend.entity.dragonfly": { "category": "entity", diff --git a/src/main/resources/assets/betterend/sounds/ambient/glowing_grasslands.ogg b/src/main/resources/assets/betterend/sounds/ambient/glowing_grasslands.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f2c886feebdb8a028bb428927da8c0e7512b0c4d GIT binary patch literal 938714 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⁣YnkzNcpX?E2mY53GBwQ<9o1^b;oxmqTA(z zkx1L+MZF{NQmS{E|6w!q2HPt*n9qzSc|VT%-O`acz4JmmH+6h`-a~g3gwA=~@^yff z?YXKVk;|OUe9@%arK%Z0=UHDz&qAG|zt%@u)ltmt5~|K6{qq_zMgQK8XJSj^v7I+Y zlh0s+15I{DY^(H{a&KU|kGu>%+0X&IrsS3zP12750h$3W{>2-R`f=%rma6a^2sn26 z-s+Jlrp)Q{Ju@+g{*q4Xj=leqtNKo+u&0=0wi4fo*id(acUlxqTltCcbHs7H(~@&L zdMk@G@+!wi>Mr8upt@nxT(S|}-SG6(IGB01b8(PlDX^;E(txYyy@#Vp)ydh8=SZ9) z7w1S-*6TaF(MuOz$HkFQsb$8-#|mnUGumZE8*VD1v!dE?q&Kex_B8H~4VAMh?<GXbm3LViZ|_fg@dKy4d4g?)NV~hFlRl-)2M2eUXa@Xs;NHq18zoe!DbHmfB^UKjK3SZ9Gefid3PWAz zi#*g}+f*ZREkRvt;Iz%^X4xOuLSVhw*m<4L@&&Bc#AgnUG7Ho2_wpo;MAq_G7u&r_ zux>t9ZJ!Un4Np;>D$?jm|Jay79D^K7tDrW)fvepvWpNmGC<|;Rp`qky%R-rSNAZ;= zML7!%?3Zyqh&p2xa{q2(79%Ra00jfn?KH0h^tM-Q_mbdF2IF;B8UDM%N3>{J$h%1f z(VT1^kF?Fz*=oO5vEYyto1jLgG|~xc((0DBp;}ub<825(uvm;@IpOc#JhEr*M2Piy z4Pob*Ak`W@kRr(|y~(wCM{$;&Hw`%>B2Vzdcz`PmU%^MxhHlpy+D-RqSapA8l<#rI1`U>kWZZVxdfd5Gh9|#pfNYFK386`y8dYzS zz@`rRHbrh3xP|l*Ec;E2*p?7p zWz{a95wcOkecZkYzGj5ti`2cJ5vw~7@V^?eUE(+o)eL?OUW~pF@q%^x#y5p+6|J1RiGAQd26}5^E$pNFe!zCmmhpA!f;YV@P0W=Xkp1E?RcQh=pSK<9i*mL%p7K!(MGqWqHYomH(4E!z0p9n7M} z>3mX*lZsa2E*C~F@r@@HB3{+uIXsu`avNB$Pvz3sJ#v0pzq$UH(_9yg>r^u@Lh(N*cW&;+2k@T zac8hmSAQ~9E(;4H79_e;lSBQG8mQzZxphc7m=~*=%TXPh(L;(^%x~`%+w}_K^gw!2 zZ1;xfjtBkzy_L4kdsZ}94epZ%>fidkL�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

    yNTzGQ}k0) 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%0A3FsIW-E0h0zFBRqPu+aAUe+X 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

  • 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,-XV=wCc` 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

    sz?zOv-MBd>rB!?3orI-wj=9qXFce_}qKMZf)rn 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[Yo?(eSz}X6?yq7Xt+00ylg0+Ey0BA72 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

    -thD?u2~z%`$b~VxHQs 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�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

    f;mGRlO# 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 LZMSC!4 Date: Sun, 14 Feb 2021 11:34:33 +0300 Subject: [PATCH 276/463] Thallasium armor fix --- .../java/ru/betterend/registry/EndBlocks.java | 2 +- .../models/armor/crystalite_layer_1.png | Bin 1538 -> 1604 bytes .../models/armor/crystalite_layer_2.png | Bin 474 -> 463 bytes .../armor/crystalite_overlay_layer_1.png | Bin 0 -> 353 bytes .../armor/crystalite_overlay_layer_2.png | Bin 0 -> 170 bytes .../models/armor/thallasium_layer_1.png | Bin 0 -> 1111 bytes .../models/armor/thallasium_layer_2.png | Bin 0 -> 473 bytes 7 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 src/main/resources/assets/minecraft/textures/models/armor/crystalite_overlay_layer_1.png create mode 100644 src/main/resources/assets/minecraft/textures/models/armor/crystalite_overlay_layer_2.png create mode 100644 src/main/resources/assets/minecraft/textures/models/armor/thallasium_layer_1.png create mode 100644 src/main/resources/assets/minecraft/textures/models/armor/thallasium_layer_2.png diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index fcec5f5b..5241c8b3 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -292,7 +292,7 @@ public class EndBlocks { public static final Block AMBER_ORE = registerBlock("amber_ore", new EndOreBlock(EndItems.RAW_AMBER, 1, 2, 4)); // Materials // - public static final MetalMaterial THALLASIUM = MetalMaterial.makeNormal("thallasium", MaterialColor.BLUE, EndToolMaterial.THALLASIUM, EndArmorMaterial.TERMINITE); + public static final MetalMaterial THALLASIUM = MetalMaterial.makeNormal("thallasium", MaterialColor.BLUE, EndToolMaterial.THALLASIUM, EndArmorMaterial.THALLASIUM); public static final MetalMaterial TERMINITE = MetalMaterial.makeOreless("terminite", MaterialColor.field_25708, 7F, 9F, EndToolMaterial.TERMINITE, EndArmorMaterial.TERMINITE); public static final Block AETERNIUM_BLOCK = registerBlock("aeternium_block", new AeterniumBlock()); public static final Block CHARCOAL_BLOCK = registerBlock("charcoal_block", new CharcoalBlock()); diff --git a/src/main/resources/assets/minecraft/textures/models/armor/crystalite_layer_1.png b/src/main/resources/assets/minecraft/textures/models/armor/crystalite_layer_1.png index 2b5b4d8105ebc354e76ab6b49e7591aa4e656bf6..5019c1ce3fe61ee308729ff5ce8a6740ddd4a1c9 100644 GIT binary patch delta 1600 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 delta 461 zcmV;;0W$v21KIq=SiUE~X9* zd;-HLVR16bq)yC^Eb7Rj3!5;Aivw}fr6g`nh6H6K>?D{bri>&;61Q`BDaTz&pdl?O zyx&sZdp8`{*WMLij4{R-V~jDz7-Nhv#u#Iav5hqB3yfTWVSiu1ZirP+Cv3*d?E4#C zyS)gfvKmQWrhYGfw>~1A%4+yK;A^lEf81jz&v~^DoSj06_4-vwt$%hCQA{)}^avat z0S9@R4I0N-5_S{#8_SH{#LMvz`HTJ}*6T_fa|Rq2=(HyZ@%jY(?%<>f?9~SNK|`tQ z=?swF zmtEnwa&dHCEy(zgEx)?Og22NgZH?ELl)I||TicZL-bNSQ9xa+>BGCBAI$#;z$CIbi zmb--Ar0ewE3_3nU%dc)OtG)v)Q?~RX-xTx4hui`G>vy*D<>s<;00000NkvXXu0mjf DC0^Mh diff --git a/src/main/resources/assets/minecraft/textures/models/armor/crystalite_overlay_layer_1.png b/src/main/resources/assets/minecraft/textures/models/armor/crystalite_overlay_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..42b159fe6d47a15e5dc4015fa7dad40ed28735ae GIT binary patch literal 353 zcmV-n0iOPeP)7p!r-Ia+*NKwE)Py9`!|v&mdCWJODaw(~(=Ms{)XIrm_4@^E#BQs{x>$NL|RU ze12c5s{-KT^Oby@HOLsv9ui&s3y=Va<&&waaSEVRm8DTRbtk0x*^a^`tE_Zft}$L0 zud?cgq0&`WJ%G|xRzHB@W9t6+hQB?<(K>)Pm4z3Ch4+zc00000NkvXXu0mjfTTYkJ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/textures/models/armor/crystalite_overlay_layer_2.png b/src/main/resources/assets/minecraft/textures/models/armor/crystalite_overlay_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..692a470de6ce4ad4e6b93db5232b1eef3d920755 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQY`6?zK#qG8~eHcB(eheiJmTw zAr-gYUUB3-U?9MJkRiLnq+->9j2XMER_f%*v2FPL!NbTZAE*)waHwvmUV9~q>CeN; v^CwNyqnJYeY%ce2h-xkGC~pF(zaaa7`Nx6>H}qcmTZ8zXu6{1-oD!MPx(5lKWrRA_N^0uSn$7_W(tfk?A^H;03`2&Cw8Pf?LmokJz)U8GGuhUGDm%Y5dMMDlb~hg zVO8bGK~eIwN4NA5vI?li>o{rjvuk^HG2*#@{R*phbU80bC+V=PJS;1ZY$gXGM4+my z7kYqNR82Dl&vC1XFDIE!PoKk%?c0&fLW>%PH3LF=Nc>0WeTV7^D2<*Ih5hw012-8dC2NXTdN&2WXEQmxeSDYU z@FC#c`@px|M@Fzx`Gud=^=>g(N32q37hVbg7#`XN0Jwc{KLddN1N-sk_iwCzvfHYl zj)$eMf=cRAse)Sv_N~dWv9rMN&^D~PtDy?<{o`WCjVC<%`~wf3*mbK-5+oXjyCHGe z#j*@WEA)vy0h||PdF%#oUXUfX6F{_(ka;W@SP3HT9L zX$np~I-AMGCf`I?pdO|t(g1+F_iD2N=H>+%H8L|R`UVGN)QDf56@cJSMm+}S1>8A* z2=+=Dyz02Ay<2>`%B#{*{Eg5O2k3)NdRH&f6KQykAN8x3k5?a2-GGb=QW`*LmY|IP zuXH1{!~s!1nBLlptCx=h2pbePECJzGnuaIN3qW=H)M>hcDt{bW;($=Zib01&4O&r7 zh$?HInoRaxDrsAQX@LKu{w z)XkI9YUC(O>ot08ax}1}%BY6Zo;08(ZK0F$8)K8BGK<w2=Yg*cVdEMH$E(`X`-O%P={_*w~oVx+FsJpjH1;$S})P5 d=vISu`~?qy>oNeH1I_>d002ovPDHLkV1hfD4Nw38 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/textures/models/armor/thallasium_layer_2.png b/src/main/resources/assets/minecraft/textures/models/armor/thallasium_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..9d1f79b1e289783e67b7922cbf95b11dd37bccac GIT binary patch literal 473 zcmV;~0Ve*5P)Px$lSxEDRA_-q=Tz|03Dp&^gB2?x%ds79NZk* zI@^wl$s$N9NV}%tEk&}V({m_!OE3z^5#Yj{v^gAoZ@Z)Uywgt}{!Ex#UW-YFwk8azUN<;yJXOBWyt7 Date: Sun, 14 Feb 2021 11:46:42 +0300 Subject: [PATCH 277/463] Crystalite armor fix --- .../item/model/CrystaliteArmorProvider.java | 5 ++--- .../textures/model/armor/crystalite_layer_1.png | Bin 1604 -> 0 bytes .../textures/model/armor/crystalite_layer_2.png | Bin 463 -> 0 bytes .../model/armor/crystalite_overlay_layer_1.png | Bin 353 -> 0 bytes .../model/armor/crystalite_overlay_layer_2.png | Bin 170 -> 0 bytes 5 files changed, 2 insertions(+), 3 deletions(-) delete mode 100644 src/main/resources/assets/betterend/textures/model/armor/crystalite_layer_1.png delete mode 100644 src/main/resources/assets/betterend/textures/model/armor/crystalite_layer_2.png delete mode 100644 src/main/resources/assets/betterend/textures/model/armor/crystalite_overlay_layer_1.png delete mode 100644 src/main/resources/assets/betterend/textures/model/armor/crystalite_overlay_layer_2.png diff --git a/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java b/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java index b80c871f..c5462c51 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java @@ -16,13 +16,12 @@ import net.minecraft.entity.LivingEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.Identifier; -import ru.betterend.BetterEnd; import ru.betterend.registry.EndItems; @Environment(EnvType.CLIENT) public class CrystaliteArmorProvider implements ModelProvider, TextureProvider { - private final static Identifier FIRST_LAYER = BetterEnd.makeID("textures/model/armor/crystalite_layer_1.png"); - private final static Identifier SECOND_LAYER = BetterEnd.makeID("textures/model/armor/crystalite_layer_2.png"); + private final static Identifier FIRST_LAYER = new Identifier("textures/models/armor/crystalite_layer_1.png"); + private final static Identifier SECOND_LAYER = new Identifier("textures/models/armor/crystalite_layer_2.png"); private final static CrystaliteHelmetModel HELMET_MODEL = new CrystaliteHelmetModel(1.0F); private final static CrystaliteChestplateModel CHEST_MODEL = new CrystaliteChestplateModel(1.0F, false); private final static CrystaliteChestplateModel CHEST_MODEL_SLIM = new CrystaliteChestplateModel(1.0F, true); diff --git a/src/main/resources/assets/betterend/textures/model/armor/crystalite_layer_1.png b/src/main/resources/assets/betterend/textures/model/armor/crystalite_layer_1.png deleted file mode 100644 index 5019c1ce3fe61ee308729ff5ce8a6740ddd4a1c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1604 zcmV-K2D|x*P)-Fuj1D!j#Z#x&-o7lLSbDN#rP=!isHKIE7yKQfTFyv zxT3Toeo26?ydrwvF9=XpTQ+~$8hU+`SKUf_#R|KSozt$v9@!+WrzF*(Z|Z(fb`{9> zp*p6@4ys-ax3NMy!i~C9x^~X<2O7Ph!s?G2k82}xl{v6NO9#eZ2`3 zI?8C;l7a>TWap_JqrO3a?&bBfT@yPMAd|}R{m2$7p4>#~(Pt>mc9O=eY#_4N5RGTk zpAc$vit@W;LR`cV-Y3B1)eR5p6SXi^IT~#9jFp&4vG_ml5MXMS1XxV8v#Z!1(LPIn zJn@d+_ci(V1SG!)A({z$TcHaQoPTMR55y4}MB z_=3qRQ-}o4j|S48*y{lTvG1)9cd@5^Te^C$}&XgzYt!3kO()=?2BX=PZ!nW}>4OSprx z*c{p-@RU9!=vXo&dGShiBuZDa*PAA6K4%&q4BY@HeYhk;i0A}2(Z-^BnC#Wbj^wCvqouK@T^ee^> zN;g!UJwkxt!-pVYqcAh4f+pPZLy2r1niVKS39|HY?ZpCC^#hL(U{%5CMBioVYc8j^ zql~K>f@iWpxq{OL@wNQFYZW1LIn1hWE@yeDr1gJ2z&xLlLeLIACU<3msz39;dH`*x zP`^bqRPw?^`d>YO(szR@YeB_q2_MY&zj}a(5|vyb{$ufB#_RQfZdW*W8)$PWsB|;0 z_yXShc9zw=|33#Uo59C%MJt{d+luc_<1I1+J)eNsFF;jwpuGn`OXGyuQzI*VZYwJ| z3ly8C;`=l_QNzz_c#kI_CPQ_4d1Y+!OIX1;wZDrq#^kx6XcNBl?N&S~ycZBKdo8Hs zB*^|P$hKVlAX`@r+UZ~gBRO?m=K{B@c&FQzgG6tv7S)-tsSVyIAYd72F0bZW9D0wR z4GNjUO2(`HAT$sLe4K_a)$mE9xsvBo=H4^SM5(7O5vXmP6BdO*()h0XcBVpiKWs%E5o`gT(f=oJLC z$@eF{q?%6$>H$5UfNrP<^gIjbhI&BHA;8b;0sjE{Rgoy=O7Zdl0000PbBQzsVB%ay z`w0rbq(y*sD?tHvwmykVsfVn#taxazLIBzHgkVUo!tzW;2<837+9Nufw_m+K{-ci` zuC4Ru*Typ#*%{DWJ%>O3tJmfLth@oozSWA|K9|V)eY_Cmh2Dira7<5<}Z65ke`|Uw3a>(&?i7(9-vQvz&s#+0cz#} zIs~YZ2gENx(QR*V06N)SC=ZBV0RMh}I-KPJGfF1!V<^lRnf(AoU_yD<9_=}~#i2VQn002ovPDHLk FV1hMG!#)52 diff --git a/src/main/resources/assets/betterend/textures/model/armor/crystalite_overlay_layer_1.png b/src/main/resources/assets/betterend/textures/model/armor/crystalite_overlay_layer_1.png deleted file mode 100644 index 42b159fe6d47a15e5dc4015fa7dad40ed28735ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 353 zcmV-n0iOPeP)7p!r-Ia+*NKwE)Py9`!|v&mdCWJODaw(~(=Ms{)XIrm_4@^E#BQs{x>$NL|RU ze12c5s{-KT^Oby@HOLsv9ui&s3y=Va<&&waaSEVRm8DTRbtk0x*^a^`tE_Zft}$L0 zud?cgq0&`WJ%G|xRzHB@W9t6+hQB?<(K>)Pm4z3Ch4+zc00000NkvXXu0mjfTTYkJ diff --git a/src/main/resources/assets/betterend/textures/model/armor/crystalite_overlay_layer_2.png b/src/main/resources/assets/betterend/textures/model/armor/crystalite_overlay_layer_2.png deleted file mode 100644 index 692a470de6ce4ad4e6b93db5232b1eef3d920755..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQY`6?zK#qG8~eHcB(eheiJmTw zAr-gYUUB3-U?9MJkRiLnq+->9j2XMER_f%*v2FPL!NbTZAE*)waHwvmUV9~q>CeN; v^CwNyqnJYeY%ce2h-xkGC~pF(zaaa7`Nx6>H}qcmTZ8zXu6{1-oD!M Date: Sun, 14 Feb 2021 11:49:59 +0300 Subject: [PATCH 278/463] Texture compression --- .../textures/block/aeternium_anvil_back.png | Bin 421 -> 256 bytes .../textures/block/aeternium_anvil_bottom.png | Bin 360 -> 238 bytes .../textures/block/aeternium_anvil_front.png | Bin 464 -> 288 bytes .../textures/block/aeternium_anvil_panel.png | Bin 371 -> 247 bytes .../textures/block/aeternium_anvil_top_0.png | Bin 420 -> 273 bytes .../textures/block/aeternium_anvil_top_1.png | Bin 485 -> 298 bytes .../textures/block/aeternium_anvil_top_2.png | Bin 537 -> 306 bytes .../textures/block/aeternium_block.png | Bin 277 -> 263 bytes .../textures/block/amber_moss_top.png | Bin 239 -> 239 bytes .../textures/block/bulb_moss_bulbs_e.png | Bin 1584 -> 219 bytes .../betterend/textures/block/bulb_vine_e.png | Bin 1829 -> 424 bytes .../textures/block/bulb_vine_seed_0_e.png | Bin 1444 -> 126 bytes .../textures/block/bulb_vine_seed_1_e.png | Bin 1458 -> 138 bytes .../textures/block/bulb_vine_seed_2_e.png | Bin 1466 -> 141 bytes .../textures/block/bulb_vine_seed_3_e.png | Bin 1464 -> 142 bytes .../textures/block/cave_moss_path_top.png | Bin 586 -> 586 bytes .../textures/block/chorus_nylium_path_top.png | Bin 711 -> 711 bytes .../betterend/textures/block/chorus_plant.png | Bin 712 -> 712 bytes .../textures/block/dense_emerald_ice.png | Bin 235 -> 235 bytes .../betterend/textures/block/dense_snow.png | Bin 215 -> 215 bytes .../betterend/textures/block/end_moss_side.png | Bin 645 -> 645 bytes .../textures/block/end_mycelium_path_top.png | Bin 548 -> 548 bytes .../block/end_stone_furnace_front_on.png | Bin 2450 -> 709 bytes .../textures/block/end_stone_furnace_glow.png | Bin 1826 -> 245 bytes .../block/end_stone_furnace_glow_e.png | Bin 1826 -> 245 bytes .../betterend/textures/block/flavolite.png | Bin 285 -> 256 bytes .../textures/block/flavolite_bricks.png | Bin 279 -> 257 bytes .../textures/block/flavolite_furnace_front.png | Bin 679 -> 435 bytes .../block/flavolite_furnace_front_on.png | Bin 2625 -> 749 bytes .../textures/block/flavolite_furnace_glow.png | Bin 2064 -> 291 bytes .../block/flavolite_furnace_glow_e.png | Bin 2064 -> 291 bytes .../textures/block/flavolite_furnace_side.png | Bin 620 -> 390 bytes .../textures/block/flavolite_furnace_top.png | Bin 561 -> 373 bytes .../block/flavolite_lantern_bottom.png | Bin 222 -> 207 bytes .../textures/block/flavolite_lantern_side.png | Bin 231 -> 216 bytes .../textures/block/flavolite_lantern_top.png | Bin 221 -> 205 bytes .../textures/block/flavolite_pillar_side.png | Bin 278 -> 246 bytes .../textures/block/flavolite_pillar_top.png | Bin 266 -> 246 bytes .../textures/block/flavolite_polished.png | Bin 267 -> 246 bytes .../textures/block/flavolite_runed_1.png | Bin 311 -> 280 bytes .../textures/block/flavolite_runed_2.png | Bin 308 -> 280 bytes .../textures/block/flavolite_runed_3.png | Bin 310 -> 275 bytes .../textures/block/flavolite_runed_4.png | Bin 312 -> 278 bytes .../textures/block/flavolite_runed_5.png | Bin 312 -> 278 bytes .../textures/block/flavolite_runed_6.png | Bin 310 -> 273 bytes .../textures/block/flavolite_runed_7.png | Bin 309 -> 277 bytes .../textures/block/flavolite_runed_8.png | Bin 307 -> 273 bytes .../textures/block/flavolite_runed_9.png | Bin 308 -> 276 bytes .../block/flavolite_runed_active_1.png | Bin 2046 -> 416 bytes .../block/flavolite_runed_active_1_e.png | Bin 1863 -> 133 bytes .../block/flavolite_runed_active_2.png | Bin 2071 -> 418 bytes .../block/flavolite_runed_active_2_e.png | Bin 1850 -> 122 bytes .../block/flavolite_runed_active_3.png | Bin 2069 -> 421 bytes .../block/flavolite_runed_active_3_e.png | Bin 1886 -> 142 bytes .../block/flavolite_runed_active_4.png | Bin 2068 -> 424 bytes .../block/flavolite_runed_active_4_e.png | Bin 1861 -> 127 bytes .../block/flavolite_runed_active_5.png | Bin 2080 -> 419 bytes .../block/flavolite_runed_active_5_e.png | Bin 1879 -> 140 bytes .../block/flavolite_runed_active_6.png | Bin 2060 -> 422 bytes .../block/flavolite_runed_active_6_e.png | Bin 1882 -> 133 bytes .../block/flavolite_runed_active_7.png | Bin 2069 -> 425 bytes .../block/flavolite_runed_active_7_e.png | Bin 1890 -> 136 bytes .../block/flavolite_runed_active_8.png | Bin 2063 -> 417 bytes .../block/flavolite_runed_active_8_e.png | Bin 1882 -> 132 bytes .../block/flavolite_runed_active_9.png | Bin 2066 -> 417 bytes .../block/flavolite_runed_active_9_e.png | Bin 1896 -> 146 bytes .../textures/block/flavolite_tiles.png | Bin 277 -> 254 bytes .../textures/block/glowing_pillar_seed_0_e.png | Bin 1459 -> 140 bytes .../textures/block/glowing_pillar_seed_1_e.png | Bin 1458 -> 139 bytes .../textures/block/glowing_pillar_seed_2_e.png | Bin 1529 -> 212 bytes .../textures/block/glowing_pillar_seed_3_e.png | Bin 1623 -> 292 bytes .../textures/block/gold_chandelier_floor_e.png | Bin 1454 -> 131 bytes .../textures/block/gold_chandelier_wall_e.png | Bin 1474 -> 147 bytes .../textures/block/helix_tree_log_side.png | Bin 253 -> 253 bytes .../block/hydralux_flower_bottom_e.png | Bin 1448 -> 129 bytes .../textures/block/hydralux_flower_bud_e.png | Bin 1483 -> 144 bytes .../textures/block/hydralux_sapling_1_e.png | Bin 1479 -> 144 bytes .../textures/block/hydralux_sapling_2_e.png | Bin 1523 -> 172 bytes .../textures/block/hydralux_sapling_3_e.png | Bin 1530 -> 172 bytes .../textures/block/hydralux_sapling_4_e.png | Bin 1520 -> 172 bytes .../textures/block/iron_chandelier_floor_e.png | Bin 1454 -> 131 bytes .../textures/block/iron_chandelier_wall_e.png | Bin 1474 -> 147 bytes .../block/mossy_glowshroom_barrel_bottom.png | Bin 577 -> 577 bytes .../block/mossy_glowshroom_hymenophore_2.png | Bin 661 -> 661 bytes .../block/mossy_glowshroom_log_side_5.png | Bin 274 -> 274 bytes .../block/mossy_glowshroom_sapling_e.png | Bin 1727 -> 371 bytes .../mossy_glowshroom_stripped_log_side.png | Bin 635 -> 635 bytes .../mossy_glowshroom_stripped_log_side_2.png | Bin 682 -> 682 bytes .../mossy_glowshroom_stripped_log_top.png | Bin 726 -> 726 bytes .../block/sulphuric_rock_furnace_front.png | Bin 530 -> 315 bytes .../block/sulphuric_rock_furnace_front_on.png | Bin 2071 -> 403 bytes .../block/sulphuric_rock_furnace_glow.png | Bin 2064 -> 291 bytes .../block/sulphuric_rock_furnace_glow_e.png | Bin 2064 -> 291 bytes .../block/sulphuric_rock_furnace_side.png | Bin 479 -> 292 bytes .../block/sulphuric_rock_furnace_top.png | Bin 438 -> 274 bytes .../block/terminite_chandelier_floor_e.png | Bin 1468 -> 144 bytes .../block/terminite_chandelier_wall_e.png | Bin 1468 -> 143 bytes .../block/thallasium_chandelier_floor_e.png | Bin 1454 -> 131 bytes .../block/thallasium_chandelier_wall_e.png | Bin 1474 -> 147 bytes .../textures/block/umbrella_tree_cluster.png | Bin 243 -> 243 bytes .../textures/block/violecite_furnace_front.png | Bin 545 -> 394 bytes .../block/violecite_furnace_front_on.png | Bin 2478 -> 469 bytes .../textures/block/violecite_furnace_glow.png | Bin 2064 -> 291 bytes .../block/violecite_furnace_glow_e.png | Bin 2064 -> 291 bytes .../textures/block/violecite_furnace_side.png | Bin 542 -> 420 bytes .../textures/block/violecite_furnace_top.png | Bin 546 -> 416 bytes .../textures/block/violecite_tiles.png | Bin 195 -> 195 bytes 107 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_back.png b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_back.png index d1a6ad61c5e1f1df924693c43754d2fd400ddda8..42d597088d46b385103d35d7e1b6ddc085b86abe 100644 GIT binary patch delta 213 zcmV;`04o2b1AqdMGk*ZLNklh1^wrBw*L>Jv0<>By3&6JYye~c zNI_~<)&HqWmtw`a9nFLd04ef~j{YB+lL4k-Yyn#f(hLA$kh4J=K^Vja$$``mG$6IA z1WZHNRVZwNE&wS2VPrNs#%TaD067^HaCmLS2Ve%^4LD*908Y68XTZ_a09cHW>;+hS zgKS1lNZ@pV&mcni049$!KM=|Xuo%JVC2Xk>Jtg8zjp(TmJtd-x!Sn$D@^Bv{)fRM? P00000NkvXXu0mjf&m~qd delta 379 zcmV->0fhd50;L0xGk*bGNklL&U zMJkT=L-c#NxOD1QsM0UsB3K8ZT?(2ab|{6kkhIHnXcO|9{sGVS?mO>r-o5u|%pf8d zcQ>N<`b@SqSp>b;XVP^Tw>w%;OUx5)&(1l?=NAgJoDNUbs((^T%##eu#APxi1uAqA`I0qrs4dc$m%)e1m82PF?0~#_i5(f$hB=3@bw!@b`}}EE53V z^_X-Wg&Q_QM6j+eB_QZIJ4Ox=ZDI%!QO?OyQ66hGd8kw*d3YeP2QzGhR0u$EWzN$M4q{K)6(mx7XMNwCKZC zIS5<Yjt0U5)*fHNVX xM<05W!o;z=04NAD1e~0KY#7EShSh)p0|36lDI4zLpo{YU6vls%5-o%b=}?h|mM#W@(9OZOa1tM& zFVr`1a?uA6I`j=(3hff8sba(=kOY!uiG$7UjfrH`Gu`{$?+@pk3x8coc{skkE>zDa z@Aq0os^=5W7YaZ}25&B}nAmo!!OC@*%@1IeK8c7(}!fFO` zB~c(mkHH53Q@u;Rb$@R`(+!d^ZcOXCZ#ArDAP=mpry^|>LqiKm7#{>L`{eywYMue0 z4or4yr)r>jJ~u1ZVRT_J1+tMxay>Gk2?N-z9ff~UUuFY$3`J`t QDF6Tf07*qoM6N<$f;u~hT>t<8 diff --git a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_front.png b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_front.png index 3456a86636d8808c41c088ed0e312850a0d78a79..9b2d22b66fa5e1cc246de85233cd152f936c4a1d 100644 GIT binary patch delta 245 zcmV(qgT z0WQE1dd{HF$i_qoNh>|ow(_2T;xv=vK1{cpz`q24PVB`zG#ID853gY;;`+S**d~Cp zYg-ZepbLk~Sz1unNfU?>t6j^ zixhP9=lBD<6gs&$wn#@6x(K=mbt%>qF+&vEKx!1?a7|2Fv3}Ei-`zcT?|a`#>2fKM zZ3lm8foTz6C)*Bw&mtw;4o5q?Y!(Vr0d1>8-dK;um1>m~fPbQ^Ts9hHO>?x=$L+hg z?*jm|`B~ie0nNZet=9oKE*1dYJ67a%-Q)3v|Om;}hS zL)+>^dF`n~Gw@J!b;3XxGcjE*1*aQZTm_$O559QqcEv45jRerVZ6%D9;+v=a3E6f4 z@suGX6`!2;CqikJYBj1QT3OLm?jP==P6Xk8{0WDBFCYPpB*Z)NKb;s#_yz};pyNH7 RK_LJD002ovPDHLkV1f#>z#;$u diff --git a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_panel.png b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_panel.png index 4dbd58f4075fea57ca5ee4fcb41aca1ecfba78a5..afdcd73135de5d02e0a5859e8bd60ce0187dc309 100644 GIT binary patch delta 204 zcmV;-05kvd0`~!sGk*ZCNklYVz&;Xc?AjL4vAQ~ozH4Kmq04YY+2w|6yZU6}TMn{7&EJgH*@&Zf~)eHd1!J?L+ z0pR$CYQTm;2H;FcFw^lRB;4r$CtF{}m*7ytmms18qFRJ=O?00007vlZ&B0ZtY`Tab z_>24zPD0TiASg)ZLY6?gWH3@lAT1LH4A@S?G2C!EquTRflYNLA#gdbLp?k!+yb8lU7cYkrN!VZce>-RVrjTlc3 zxwR|+j?E#q<0$cX@`mj=JUl%rPTioumuRVa=D7f@qowM#4ZWhT1pp+GB#ERlcZ{wI zNg|0DnDr6LD8$e$g>;&v%>m`0^(qG7c^M#pwxN@KdcTjbUd76|3ylFk@si8U8XHg> zVLwZ^hK~)WmqK~~VqlWa-D-gFLuQ_f3<7kj>nzMN2uLDXd4ug&J{so5ddh+(4j`So b8vg>{tw4l98B~m!00000NkvXXu0mjfxfPUo diff --git a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_0.png b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_0.png index 287f800af5dc183a340e477b7d79c6741e0ecd5f..b206f3736fbf559f28ce255993440933835a4637 100644 GIT binary patch delta 230 zcmVAXR7MD|69`=d8q&&A-r|_$>po=lR$FZo}>+v7J zE-XB@Z3ZDsHg*Bd{WTl5&wCc%K-~b$m@s1^W{&Zy69{4f)L+R3kd(jbQk8=87NDvI zES3awry!%^E)G5blXhqQ1>Hn<3f4@|_^R2>19Sp=6J@RjV5FB>DY$At(WVm&Up1M% g2YRknr7`RI0F7Bn(VUomw*UYD07*qoM6N<$f`VOW7ytkO delta 378 zcmV-=0fqjN0;B_wGk*bFNklzq# zg8IX}2>uZg9zAxo!@LaFEHuzy4rWtW2X$<7rtj(d-tT>%=Xsx(PaqJ7PY<3r8sp}3 z#DzE-;|@%Id%CdBC87n7*EdvDH5NcKb?S{qC>H{7^EoQ2%71ICMWIvzASI`nS&n~> z#z7pDbd&+$Et8<*&9SWsL&Jzw6%Qb1v8@RJH6aN=+jD#+I{|EKf+T0T{QRcl%|mZu zQP~Z!1_7u}7f5oJdto`hJ23Yf0l@y5hK$?WM1bSs8Ru8!keZq0>^H)isjOVA6iM57 z!T{oEjArWoy>tH21EAU0X?qSSIsLx}Za(L;cDy+?A?a@+ZGP>qpx@P~P8ZB92d(?Q zwRr;|7|p)M&@lXFM>$=RL`+Oy7i{ z_8Y({Y}}Qlfe1v`w*8DZp>Yp{LYVuyp{n40+`wW0000ShS{B&_vUZ2EIPAG5$1<|K#z&}R?Cq6I|LldGPGS6>ZS>& zsxr+R!8b`jmTjI7K<@YNJG|P~?%0w90s>lpo+cuN%tZj0a(@8>veJ8Bl7L=S!TEL_ z$`=81N)iAhD_XtNf@_Eb#dFZxO`wb_U9HIOYJp(=2Q(yF?IZzC?LFRthUi)&Sp|y8 z7Q0QFKwnw?+TQ!QXqZU?Z2+JqPj(TxW}s|!^RPQM#8m+Sv5eVb%nzTrJe%jlVWOL(yW delta 496 zcmV~sTNmH$Js#ip zeIMSF7>L_1Uj$LNjjyE`7g4v3f7s-F|3K>3CWjmH$-6u&K7Z%)&JIV722-=MEa!3n zRLW)S!{#;7iNVCzQgnpiW2FLsa9v`G%&(IZ-fwI$oz0H8niwwVhJkQh(&;p(YmfL8 zTwq%ks-_WBF}{N*&0 z33rfLxPRrqwtp;i!{DhT)2i3;Z-NMyr0*z~Q|I+X5~@0G#=iynb_=F?waS@yjBs71 zv)S+!)=MRJt5s@_!+NPi&2gC57g04W+(FcBv)4SJV448D{l3rK!zFCXVk_tpQ{&{Rmm;L%NfN4x+-!|?FmlS3a+!`0=xK&Q&+GE$%Qh>*anxu~xVXjF^E2$oZ+5HI5r~t+0x?Ak8HmV)#W<;NT)+=zy?q_ut)J5VqsSCqMX7;c;pl|wOxC|G66#iU9H}!&SQUCw| M07*qoM6N<$f)~t1!~g&Q delta 170 zcmV;b09F5o0+j-gBnkm@Qb$4nuFf3kks(ume@R3^R2Y>tjsXt9AP58JAV4hs|GR5- zHip1Kk;l!inAvy?>#F(2<12ygE<`X9P})rxl^dXOV diff --git a/src/main/resources/assets/betterend/textures/block/amber_moss_top.png b/src/main/resources/assets/betterend/textures/block/amber_moss_top.png index f4ca3917a4c2dba136fb56545f896244217b5a22..eabd119cd57d49b3eac14e7d15fac2aea0f71696 100644 GIT binary patch delta 28 icmaFQ_?~e>86)Gw@(h8Nc_%CwfWXt$&t;ucLK6Uz8RM;qV;FK~k{mM{Mi>CH6{Pw8E(efCupw*H`2Sq5iox~?u1_s&~000sPoIzV!q+kF5002ovPDHLkV1g#qOTYjC literal 1584 zcmbVMTWAzl7@jrKCNV-nAI$2*4kNupot@k6Yr4!S*V8mW>cFvjIAv<#> zGn4ElSR2J#+dL>zkWl(iTF}yqP$XiZeUMV2)(S1y2OkWAeeglrSg@c?&+H8?>CJ&N z=k}fNzyEIz552IqeSJGcQERhq*G;Jx6b?D1^X5KAVag|900_jn0m`-CC z(ebFv>OxGU6UnF`^GPwbg%)`s!SM-BkXT+&cv+E>bp2z9G#47mNM>7I7TKvx(f1vN z%og9>YV8ygH6Jq^~kW)0zpE z)15?IPe~H-~Yl5vbvY z%5*v%1g4jMW|wJ0T=se%c!M&)M=B%oqQLSZD@Zv}R3x4RZZj__JYR!q7@EfPicnDz z`G=q+YasB!zk;Ez7}&J{vDvgh0dbC9VCbeNl{7A4mk1`>NmVU0P08Ax4{RM}Gb%&O zj+!P^dId>9IC@jip~$so9m_wawd-{G31xIpQV zd4iG)vO*a&Jrb|!dQt2|6ZKWeq^pUb06j=>mC=L9BFNN_%}4e?jka7wg!CW6U4wbp z@XNqOsRHrVf5|A0=+6b!STlwDtCiKe2P(G#C+#3uHv16SG&>oxN&9k1pIT^{+DCfa zjcg{B>-|>0x4hif^5pD<6F&3#$ofmi<*u-ezyI`w1@4V- zCVuy&j^wku-wSKEU%PSbNM}pG{PreSYVFxB?fw1ETZ^|&a2-27dmSFTx>!hEJ$NZ4 z^!Fb)w13ax$G3#!>zl4nuk72l_wtbq4*EpCaBD+k+54sc<+fi}MIzGSn~CrL7(3W? zjp{sicByAHbkUgVIXXVpK5?k)a&dLI{fD{u-0Z6z^S|vse#)QSJa<&4_H=jMS#>^i z5qxkn`d#aq$onTm_vEp6)^&%&;WMW{{E4C#zy5g9Ubu2H=;_&kq0Fbxj~)0E6e|Y{ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_e.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_e.png index 6bf08ad677e3183ca10fcf234198c4f914d8fea1..430080fa30cbfb3bee46bb966b72b247ecf13091 100644 GIT binary patch delta 399 zcmV;A0dW4M4yXf=BYy#JNklOwJj%%mw z<>48qgjyt9f)hPF$&&p(kDkZV0nqu4I)4rbdt>a^!Nm|xz;^?!+oeJ^&QMJRubqHR zrauijnUTj>U@rxi@tU?ViPg~2vA4AJirdM@1n9e+reMFRr0iDCfB1P#>K zqXId|Q9lUinS>gaTsGZIX4>-tn5bbBRj^4l)Tm?tRppUEZEvqZVUl)L%b5_E_S_lF zzsxCV&0!LNUV*Z40_YG2w|@a^q%}XOZyzvZWlpva{`ovuJtl5I@tplQ57c{wv>Uns z*-eCIS|0U5Gk+=|`mqPV9;#n+NGlao(DXB{>X#fzZ{Y?+XH!JyGl<(5X)olm>1Hz1 zo)FaTng9R*00>D%PDHLkV1hb(uR!%-j|{Zb*i#y+_w|Jyu6;2P?CqY$Y&2vCt;w91F1OE$*@90N ztV&fS8pngdpgw5Oi?RWW%u6aS3aG}&c*JVe zfZy+?=t{H>vYC#JkXawAZ|iYi))~aSU?_#R@}7`z{`OmR?93Xu7Pf5YicCgCIdzl zWw$8$M-t^4aT&GQw8RvkISY7!6NAdMd-ec3qXG*?5frH-C>?2VQxr`V(0Qimgn=fA zVW?B&cyH|kp=O#i-Uo$M!!auJuV9X)y`mgopk_Y6_y8^mJ`9aVlD3I{QHF-0cZR4J zPABaU6qONJ;ILaTC|l3-91V;{V;)sN=ol`~sPhncCY{;9dUcesz~nI+Ny_UPRsr|h zMYdW??#O=bf9{_v^RT%X|3mX=EvHolUBW9cU$wEOr~u1iD?g7$3xQ@>t-vi9t7R5& zSnM_b&=DA>4ORh2`VZ+IhAE;~4KgyY`e3yFOGV+(e_ZRvVJY}uRYt$v)43yXI1aRB zd=9~f_#^`Y9A7e=Q<+mgb0bK?Nr&C)E;;nQ+bO1zsST5Q_x0pEr|oo4$m;CAdw0y% zb4ADGmE+s$b0+gGFSZw@A3d>lZCH2hiPAHnPn&OezdSnkgQh>4tfBLR$>#=cA8eSj z?aYdt4{zK&UHcWd*!;sjymt@XH7ByJ{geH-uD7=hMOyasE=fMw-7}H-CBeAz){)l_ z{>EPGN?hMnQ{_`!kujSxHuQ};pAOnjjs~46OWMxTgf=gpZsOfy6r<(o21tEXiOp1y{?ul_`smrt!&)FWnv6H6;fk;sA_X>~u2&|rDRYlxCVrcK z_#3)!^(&9QcJX{pWYSiR5)uNU;mqbQM^p` zpZO`w4rYgA9Dt%cmwu$2zx&_WLd=adHW_Lq3nV3wwyA{PM z7K+TBX?O_F5hj*M#dZzp{liC+Xj_Ifoir8G%aN)*zUY$^ixWk>IEQsh8W|Q3H6SN& z2t#7Ssks4c7*d-T@^yF&B(V))bB2@+1&TA~q?n^V5tFf$jMaoDruCSbQgkhGP}CGP z4U{xcG2}^recNL;b;XbomFPS(B(7=41jmbL-Jt6x?l90m9#CUSXi^(!;Rxr= z`?a=k3j3}yVf)#8Efj|IFX2ejV*99x(-9cse1aJDi|QkAWe zjuPcmJY}Iw?|q))`7pS>_trnYKknPSxKQoCdBTzlvjUFW0gqR+TNEeAneM7)i|s^! z2!{!7NH~lvv83*?{ofww(AKMjll~^$9auoitd4w=t#EJsO-2E(KM1R_V+#1$%J$uN zmD_{!b`UP3KEyXsCnGLzUq0_sr_P^!#CzOyA)hT~Uf{2-)=1ybg_WhlqbK`@-<)f; zp5A=bdaeogZ{59jY3bID%WvPU?#=Y0Cqt{BzU*GUw{7HcV)*eDuyZuk`uy=~_Vw(_ j^@DxO*~GPh(Y<}b#yfjnme84JVIM7wP2?XOK7H{U&GgLg diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_1_e.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_1_e.png index 588a2ba08b0dcd03143a55fb613a2abb74bc9866..6430c8668aaf4a7921ac51c17d3e87ff2191357f 100644 GIT binary patch delta 109 zcmV-z0FwW*3yJ}dBxX@bL_t(|+GF_t|33pIm|@fa>;`Vit;jBTvga;o27qh?X#~+AOtJwmLqHk{X&y~TgT(*<3c-9@LwO-aL8pFVF*tfds+nJ{mMWX)>MHH{b95TNoKSzi0Qs-GU(O z85}5#@_Ao8cJAQ+!^<0pPrHJF%aI_o?~g~D@aS=;AZ%ZDixX_Zz63G#Qpll`BvtbQ zjuwR8zFL6rG-2W-DY?ESeR=sx5?#lV#?!W92YFI<2j)UDHaAqnbJN&#q`uQ)Zw+z+ zk1!3{SfDszkBE615;2|Xk+EuMV#Z9VJ&LIrCq+$B zGeF4zRhJbNDm_p)#pWk*X`wR(M+@hgviQ!D%8UgNfNHgxs_H2kmVj!SCQvk>X);I1 z(X7u{yJBksm=6hJG%QkDX$5MerLvgM$AQU;-Q%wB&}wvi(;HGij98MU zXsWDevZ@y~4Qd%^C?^yhDoO)tQ^%c}{S7p2{s84!;~<9q3U)A@qM?Vl&8~+^1O$Fb z5))6tJgv}>3+CGCbuDZg4*C&8J|=?&OX6myT-SkyHmMugj3H;!8B@-x29ixZqsa!= zopeUY;lLX|D^#3dJJ1srfA9xlpn zjuYIHa2#3UNX=t+%N}UZR?CEw{vq5ASVX5-6@?^M;@>F;D`wx}wT+FwZAa%9Zk$y*I*e!vaaSGeA1XXMd*$YLNa)Ol diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_2_e.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_2_e.png index d47215d8f9c7b6c89c984e418659bb8bd3b54289..511e9552cd2239616097def4a90975207a062c40 100644 GIT binary patch delta 112 zcmV-$0FVE=3ylGgBxzJhL_t(|+GF_t|33pIm|@g_!EV6&%dh@}Fj)qGH2!@3?f<7c z@9-LeQ!_{-48J(``2UkVcmES@07wJO`5;WP0Wep9G~&}tFc3i+@o63=2?+pp3=DdC S(0?@m0000zFPZ5~@-UX^Otk}MEOnsu=4zKc`2NUNaK^WK_-&=%Vf7>ev+t%F544bh| zBb$0McIYgTTVBA?f^dAa6<~XgFfdDMu5XGj{`y-4u49VRBNnuR0;#(bOCdSCRIb=d zbGG4#qbI=e7UBdRVHmW$h99ApDYkhLU&p@{5wsy}&J^>pK`>)Yf&vW*7?HD*t!6Zk zGh{Uj4K4E{(4d-AU`|of5>ye)qO<|Jm&mP!P8CfRPj+qbFH@{D79d4wHk)!YEz_{3 zsD@!EP*XHb;s_~P^cikResrkEP$ZEZx&d>k4`N0a!)%Fyda_Vqi&dZz?2pa z6jg??q&Cp86I?JKHrmD=TOkeN5uZgIt0vf>P8p5r^fT1S_D2SIXe}$Tv7s-Xmzapy z_yU*F4akP*sInLkWr{>}KD5dB0(bLJtR_H(kYGl`3Z;!+q9%JTgF+!rj1G=YyS_u4 z(XkKCkRoQp6g8-+64WF$UC}h88+vegVRq@2#n z4r`g5r0cdO&5l5*8(KQ2XF4kQ`69LF{@O&pSZjYsQSDoWx0 zD{(h=q$r=NZ0~*0xji@^2k|nQL;NF|WW?v=E97%(>!o9W&p5AC%vbak``!Bb=+?tm zmVX|D7lc2C-UQEH{xp1KMYwTN-hLoeE$>NPz6PJH4z9jgd%6>@KYxB}@XYJS4=(f% zWb-#t3*v(-yQZg7_xqgT{&#O*UC%!{w|w(99R6CQWXhG5kU(g?#Zjy?YWWY69IL>mCo0CPSFlWYLY6(Eg-G~*3KkVZn9sS=FtP*n$V&ByVP7CwVb> z?M&-IT?O%^mjw~Qy}75o?6RD3cYwJ)R*}PD)p;@m-qF1zyJ6D z!esGa-{u{g1wrU5gu$kKp-;bdB})D#36 zJ*lP@9j1l=RMd>DWMoy76cs6Hr0JmZiCkJ>SI|`MKt~qe8DfnwAIWl~(MUG5Bn_&v zs_VL}Kp8@bBcyP_W4I}KVWP{BBcT;IK69uCB1T-MbIcIArfm~kKc@AonkkxprDh3)4geFJ#!WNFis4-0Y;|*hp7XDNEB;DN{+8 zC8(ur30EMNhH)CI>0zR!bliQPqt;v$-0pk(JKrA)99~?wzGj}NS2nbtIf*Yb0MV8oN=h#`Z2imla8sVg02zMJ6(h6(ffQ(nUx4tE#WUjv) zRb$%}`BN)fcOO)47tY&3w2b=@-^87ac)WcDyie_%KYx_>xYtUiPQlS9Cx5&? zIP`KI=zF#MTuwoB`T^0Se@?hd{v QM!mH#QOy0l|Jd*E0h7zjO8@`> diff --git a/src/main/resources/assets/betterend/textures/block/cave_moss_path_top.png b/src/main/resources/assets/betterend/textures/block/cave_moss_path_top.png index 2d67b1775d8bb0fb8c7f8fd35aff55795e77cac3..efdecb02a0eb75c590c87f7b57fcaa688a658e36 100644 GIT binary patch delta 29 jcmX@ba*Abw7UQjr+WbrcualBqGXR07tDnm{r-UW|m-Y#} delta 29 jcmX@ba*Abw79- diff --git a/src/main/resources/assets/betterend/textures/block/chorus_nylium_path_top.png b/src/main/resources/assets/betterend/textures/block/chorus_nylium_path_top.png index dc0ea52d69cb503b32b8556f0a2113af9f32086a..459a3d637c68bdcc8559fc11c0ceded27b65341b 100644 GIT binary patch delta 29 jcmX@kdYpBF7GvB-?H(op-j;G<1|aZs^>bP0l+XkKfNuyn delta 29 jcmX@kdYpBF7UQjr+C5AHTiL^BGXR07tDnm{r-UW|lWYk{ diff --git a/src/main/resources/assets/betterend/textures/block/chorus_plant.png b/src/main/resources/assets/betterend/textures/block/chorus_plant.png index 756dae1e12c722629c9b10f6a8b16b57d9c7e699..2bf9e6f223652cd03dfdf7ff91fcef5d9a8bc91c 100644 GIT binary patch delta 29 jcmX@XdV+O=7GvB-?OrAU^}_|97=Xaj)z4*}Q$iB}ko*a4 delta 29 jcmX@XdV+O=7UQjr+PzEyMIr)Q delta 28 icmaFO_?mG-86)Gw@)Ut|hCk04fWXt$&t;ucLK6UzZV8zH diff --git a/src/main/resources/assets/betterend/textures/block/dense_snow.png b/src/main/resources/assets/betterend/textures/block/dense_snow.png index efbdb3695b034bd6baf7fe3fab639a787d3fb42c..6ea9931268bf8c5493c81c0d8821961b54f4c595 100644 GIT binary patch delta 28 icmcc4c%5-V86)Gw@&JK*mvajkfWXt$&t;ucLK6Uzz6qfK delta 28 icmcc4c%5-V8RM;qr63_#%N>gTe~DWM4fe_#lT delta 29 jcmZo=ZDpOH#Td6y+lxuS{CLx01|aZs^>bP0l+XkKeJ}`{ diff --git a/src/main/resources/assets/betterend/textures/block/end_mycelium_path_top.png b/src/main/resources/assets/betterend/textures/block/end_mycelium_path_top.png index 14f7385b8a9bfcc215c36ae151118e2eed60671d..efd16c00ee064df829cf751684098b3172412268 100644 GIT binary patch delta 29 jcmZ3&vV>)V79-MHFaUw4tDnm{r-UW|i_-~M delta 29 jcmZ3&vV>)V7UQjr+AkRen0IO&VgLe9S3j3^P6g4;x;Gg)J+|sS#3AIopZ*yGaG!^ zbDr~go^vnfxq@e<0SlY0jDb%Y1h%Aq@P$7x_7L;hJfKFuNFOK&9c{ zM@lnZ$oDzS*&q%42Dm*22vnjQR5TfjAoi$<^nfw?r39j>7~}mKjG0Rz^*v+`b>~;x z;hbrPFhE4}=lkexDTGye4C_z{DsLV^eZev43ls6~b`sv+IEt!*csM4WVq`GVq~D~* zV4phj3KV+sq<>fnUH)N=Tsa8mwf%5kKLkh4KG-kCv0Po=0oW~1FhmY?`*m;!8Y2xH zjtW>zcQGdwV>BlY-_FD$cp(<+s@({ljltTvy_i2019Mg^T;e@g$;nP%ExvlS5T-pZ zF&}J#yZaXWZ5QD^K?+Xq0r?5rp*eTTE(Ch=Fxypt>3_LuOp#h)jud-?%~&?%;#WsD zgG|I2Rikf@`IbUDtX;2L2c`l#_q= zsFXNF8Y;0q8EbXvm|fOmakCQwzu)irEXanFQIR|WkHa15(YWb2g7vA&Tqq4zU#CGf zrbWf}On)VojnM{jXC`q|!RLp~foLj&w_1fCHA#@`k{Mxb0^~P|khSq-of7$fmB1WN zRVKvVGB!W#8n;g)y;2H~T|OQ7tSoG_upDdOSz@3vsX( U2?pY@~07*qoM6N<$f(JW3IRF3v literal 2450 zcmb_e32@X@7>-aYwBl3*EmsXe5rk~c-Ry>LOWWNZJp8}&Y?la6{R4S3H3Uh#%{XpAURs%qAn|Jz zXR%%^OyVWgXA))A1x#UI0HP5jH9Z^NQQ?bvT`?!iz+wqrBQ0x1NtfJe!z z41%J{0;g12D%oT#Jq=9_^Dux9=pq{SdHot6wqudFJiIoB2@H)u^in&PVGyFlLLr)^ z1_5d|S#XJBX_T{>C<|$$+3_e%QXD~Y1jXPa#gi7Ev7yl)2HAqLo1f~)iE_a^JLb{# z08bF1P{JC_B?5SX5BPNrVyPH5;8Ar|^Qcz| z9eeyY0$5r>h;dv|i_aIM(Ddwbm`1c9S43;hiU1&{0!=LoN+7!&${b~66X3IgK-ATs zQ&qh^jVkPsjAmsSjj^I*W+;AH4QXS0%>fQk2X>4mX$rOsXDBDd@eIW?%s7(aNwOO% zsIua&=nbWDigD63PgA_v@;4}SjV$Wozk+3ncdJ342y<3^VhJDu{t^t0Rg%wAy=o8= zLv>6G+cC-LGmx?9uyTcZTo-e6e#ir0&}%fmn_W}gdPod{j1pM8>+u(H zHT{}cer@%X*=%!>vEV==7L$|En>U;T-wf6Y&KdO(0 zmpr1s1i%%P!2Wwa*XPb_=JVJ4^}psr7;9&@)rfz(F!HR|It$ww8G?(qaT(h+;7x4b z0e)DjAly|}DVbde(r0kVd?n?Rvso!eo0c3HimW$py%5(t z64U48)|U)Y3X(>%Le1L?wA$tcuaq@!{&wun!MoGC7S~v;Qen=NLFPqMW;a$2ng4ss z=?RVBCvDC6c41gR+Gl6XJ92k5yII;a$?q%o0bC}dLw79{V*nVJl!kW&`zVmCEDf z(!T$0Noe!J&o8YBt>0Me-g#=B+I-hq;f}^tKUC|8qwdzjooPQDY#6(2X3MTqRUPRS zzNU8z2CiF0fn}pi8}bfa+#xTGlP_JqtlfDye@8`!_tOJ6w(Zz(ZfIu4xRK*0IxI(D z-@btRb^Du_GKoL-#yxgo%#HKT|2X!Y(?69CIHhvdwhwTX4MevOklO@Amj}EISjz*He#B@(qOJh|1^2Od T=U~pP00000NkvXXu0mjfdEi<; literal 1826 zcmbVNZ)n_P9M1K$({95`5nN?1rmIXemw$J;OYF7R-PQKM>uPthu1@Wnyl?J8FL~1> z?Op4{)q%FCP*g@?*YHM3?gs3;( zx|5=AUNZ9|{z&d&RmWBYK&+ui#c~LmqPlu24$#MuPiv@P+DYb@&%R)26DFAhu^gXs z(x_+-%(!U(%wS%h8P^ra^mNl*6_pTJ$Om-AD%qY|NitPlm8^r?979(j{&IvBp?d7K(#0?`4Pr5qln<6$lf@mBy?IPe~H;-{? ztx!X2mg#glC`^LhbHKDAE_?T_+k-N|M@dHHMS+xzm4v(yS0zD}r2BbE<@p*khoNaq zuZN1PAmv3-6$MpPu7Q%Sfxrj<35L3AVAld9X43)%#5s0>p&OZ0)3}6PB23&#RTsIO znzcP2*gDE)k_-tuVwzBmf`lx}ior(XN|Z%LG{z<*7-Ka}69q$#Nl|31?ayF+GAM4a zzt-mv>xAPU)wrSnJt`S&!q5{ekD`Dj{4yIC6ADNeK-9#Bn|-cHUNul!&l@J5r~7(x^dhheh)ht93F6^`SyL+w_wTAzpRJoqYj85`f@NdMl8eTiMmC{#$rL`> z(f<^g;8(Jl-u%cJ{jb&4o^a=piSyKG`}bd7J$`Zbg1kj*UAf%TaqLiQ%SQ+A82BV) zooG6R!xuiBEy0P;o9D#Uf^+rxv;L9!*^9qDnLo3OH@=8i7 zMelj3oqu^7_5RA6snMNt<)x3iQs10@`^2$7ZX0fHef(~^@EDX`rMEQO6uIm0?Vaa7 z_N*-cFP{C>DS*wk93|Z z?ro2ay}o1Yx%1thDr1+zhfsLwQuqfswDehvdwhwTX4MevOklO@Amj}EISjz*He#B@(qOJh|1^2Od T=U~pP00000NkvXXu0mjfdEi<; literal 1826 zcmbVNZ)n_P9M1K$({95`5nN?1rmIXemw$J;OYF7R-PQKM>uPthu1@Wnyl?J8FL~1> z?Op4{)q%FCP*g@?*YHM3?gs3;( zx|5=AUNZ9|{z&d&RmWBYK&+ui#c~LmqPlu24$#MuPiv@P+DYb@&%R)26DFAhu^gXs z(x_+-%(!U(%wS%h8P^ra^mNl*6_pTJ$Om-AD%qY|NitPlm8^r?979(j{&IvBp?d7K(#0?`4Pr5qln<6$lf@mBy?IPe~H;-{? ztx!X2mg#glC`^LhbHKDAE_?T_+k-N|M@dHHMS+xzm4v(yS0zD}r2BbE<@p*khoNaq zuZN1PAmv3-6$MpPu7Q%Sfxrj<35L3AVAld9X43)%#5s0>p&OZ0)3}6PB23&#RTsIO znzcP2*gDE)k_-tuVwzBmf`lx}ior(XN|Z%LG{z<*7-Ka}69q$#Nl|31?ayF+GAM4a zzt-mv>xAPU)wrSnJt`S&!q5{ekD`Dj{4yIC6ADNeK-9#Bn|-cHUNul!&l@J5r~7(x^dhheh)ht93F6^`SyL+w_wTAzpRJoqYj85`f@NdMl8eTiMmC{#$rL`> z(f<^g;8(Jl-u%cJ{jb&4o^a=piSyKG`}bd7J$`Zbg1kj*UAf%TaqLiQ%SQ+A82BV) zooG6R!xuiBEy0P;o9D#Uf^+rxv;L9!*^9qDnLo3OH@=8i7 zMelj3oqu^7_5RA6snMNt<)x3iQs10@`^2$7ZX0fHef(~^@EDX`rMEQO6uIm0?Vaa7 z_N*-cFP{C>DS*wk93|Z z?ro2ay}o1Yx%1thDr1+zhfsLwQuqfswDeq+^-tkXV|;pu0dFTOEYD+luF&?6(2=F1{r(Iw$uOs N002ovPDHLkV1hHVj|mRMFbD(b3fs{9|Gzt_ zBB5Y>K#h}KXXSY0vfq`w>TDQR-pf(Cts_q(^b07*qoM6N<$g0-nsZvX%Q diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_bricks.png b/src/main/resources/assets/betterend/textures/block/flavolite_bricks.png index 8a41a8fad46cf54a2e788648b0a0bd4534d6bb68..9446fb394a86a8c01206085e21d1dc10f6904431 100644 GIT binary patch delta 160 zcmV;R0AK%?0)YaMB#|*le}G9uK~#7F1;K$40x%2%vA3IpWB+m6*huqJ!HEHIX3=@e zewNvW5v(Z0Z(cnSR0^th-VTKVsMVHn6cu@iVj!_Z-AqYY(6V|%_eHY}z zW}bvZ-|l|R9=#5L7eF>}2{JemI3mCorFDU;t0-?pNvE*dm{q~T5!nysgfdJhV4~2y zcdpDu4J&$zxWV(okX22nLHcVbo$yIcs(@0@m`YsWdGD42m@ikyeNQ>XUh(>~wPaBr i3^JH1lIc3RROtt7Nd_7eF;!Lo0000CGSoZTL-x(5^9z2D1Z#AgLczO2nyWw_7gNBVmVj5A2cdAZtl zqJ$(^0a`l~IeEQYvg+iZt&EjyVRRsqP=px}pJxC83XZnQ9!LU-5Xd0p3<8Q~1+fJw zQ1#8JA=?=LSAU^4xCx57g1FJ39-5183=jj0)-!|H0*C6KL_C$j)dC7MH&+lhBx#7K z(cr+frcDjeuTc*J0uD*U>&os9mfeHN;@ndF3&sBcx&DBjaq;iC0=;)U(li$^JUG=z z*1yo)atlhJ74--voQcQS{E$>tZ=1m4dzY7z_`&`FP7{>xml;q>BLDyZ07*qoM6N<$ Ef=rRZ=l}o! delta 656 zcmV;B0&o4Z1E&R$BYyw^b5ch_0Itp)=>Px%VM#&6Whlpi*^%8&(YDBVb4#6X0dHDGW>taRb z8~|yVzhXAKBm~c3aEIw+!e}(aTFWkpq)kPhuK*a0hAduRGM`Tov4~`t{KZeP%wMrs z%$ZImSZg_dK7YnJ;r*i;`1ZSRuvYl;t4GW({-!A2k|Z&ps#u%hedxeL*XQ2J2`=kn z62Up){P~#ewj^y@eMBs2W7?OzuL-vS=LC}o``EtR&xC#^c%OD`j+hWU34l8YBB`Jn z7}%74CYU5;-@vX8RQ?v#fVGx=G9=4d(bH%ws!9ko)_)35o<2rwzxA5^ft~+A4--9g ztu2FNh(t0*qaow7F~6OUG3@#E{AYgn{zm}*{N)eEXJfo?gVixeV(7fK)}q?p^L$0A zyN>p8-fl~h7^rJ)Z7lvfi#MxlX0uDKUR+?U;C(n`LFi>8_Vt!LFS;*${rDM2>&^RJ z_wK&%9R`cz=iq=?p=s3T)B4PMgm6AFeWj{JTu)r&wh7#Z%v{X3T{>1SDkZ844R*n zP#M^YcmT^^(Y_Kk_}oyrUX`%s3zoj;yJ9wg)QRK>A<+Ew1Al8*H{g0cRfu(9n#9PG z1d4pyabVU~A|nx9JN{ly@Nf}>kDvfhmr)$YKBo5qO24g-$T$nLa%$Mi&@k_gw0QC z7PJrydgxQKM}L!acek-9B`jLP0FpSvlpb+z?IwgNvA(&5_WlmS@C4FO1=2L3@f}n} zf$8^exL#FgSUIF4QA8;!Q(yuU``cgPuHS|{#fK-5jO_fK6jWl;9G*|DM+K+_ zhy*yp5()Vu0nLWs9L9;@hD&3|(-ABhZ)rG#Qy1`F?SF90KT}U`sPjRJn7USmPmH+p z37GGMXe#mqrX|t2zeS9AFh9Of21=crXTVX-DGX~Qt89Ewzu69%R=$Ac{jf`7g+|DR9B z6NoC)z<;w&M6~-sO`;yUq=oM9J-80Zl{K+YBW5HFdjVxSMHEITsS&Tudyg>AvYDw#7^VA$`R#Rm0NbBA4T%2?}xNvzHLA$Bh zN$I@4xP;cx0WMx!#cZ&rizab`@pw4@OdQ0EZBIgUN|G<{8Jn~F>1+&cc9zT-WQ3dK z?!#e(8S8-5nCCfqoi?K3K=W)_4oS8T&ui#O`}A%${#;DsUs#`jaolI@^Z)<=07*qo IM6N<$f@Tn3=>Px# literal 2625 zcmb_e4R8}>8V*osrPphlR;hX;+tgw^cC&v;Hd#oWkhCPylu9ctwP-iHU(!92>^8e? zS_*@702QWOJy47Gs2&v&u#A8xwp#fuMewGl9EWgML@VBbEy~F;b5ie1ngoA98OF?P z_S?<#KJVZ2eqWv{DV~)y`L4+-l`6?$x6Ot3l+cwh34Tw#^c@Rtw@LQ-vPzYh7P`i% zo^Q`ksp1KttU{@97BQUY)3Uti0@?ezw?$sayZ`PFS zow!r7f*QfTC;&w#`Aj=3n zqazrSydS3+93O)^p%i#lVSfsy84_m*!w9!)DgNP_=@Y!BG!BBJh3J*R?#a4 zoFWgaOob#ImJ(wZWZ199$WWAm+Q`Z)AYt_|EEf{ES;K`o3wTZBwQ!xv++1d3w80tx zNq?r@V=!5CD?v5@EFM_Jn^6>YqxfaE{^z470BF{xoc zR^c_hMm2AN^B2;n9O>*#))VV-{@5YGiyR!RYo-P_phy=_p?Y8fs9vXYqecTyqb5DA z)4KpL@;E&s9EDeaT;bIiEq0CMdj7-6@9q0hV|bW^ma$U|KE%#J;D?P2z*DX-uDM60 z8o%3Nvy>TIoTcyoKHZXTKEB{;dy(3nKA}0sveB~O+=P3zakZIWB)=sM9cfv5X6Dtn z|7vYhx~jURtZ`X28Ef144eN(DczU~g-kkQ-9qFgLx|&AzoNHHKJ>Q|(>rUe5j9i50$6HFR=y$?H1~BWTmgyjP~rpIln`)(*oT*z~z+ zbLeM2yqNIi-^OKsw)yzy1OFH-cqc!;uRh1|-nLB{D>IKgxc4h_+@Gw<^!T^i3X*Jp zztXwMl4j{$eNT4N^3I(*S4_-h2kw~Edf?7!x&wQTzmT%&z{iKCRW_YU*w5Lmx7$Bl zerEdSRpZx=3`*~8!NsB0HMZ23Hy14Ee{d*bLL|L#w!%eSYN zo;Y&Rks4h2_&3G&O`18?mFh45_d@5B@s~bL1TTKn-&pwk;GWexwk43|+>rXS&Nc1p z?WtRTTQ%7C+N|w$=Q>6@wjPhi>UypYudiHsrLga@f95~z&AYrj+m})JjP>c+fwS-J z+D09ID5d@2zHfv1_q1egDN6fGe(Jyn@%lAyf6+RH=?#9u@a2~eRJE*o8oyv#_pi8z zGG6K|?4gIvhwe4*tKB|fuekRNQJi!C$-&V-j;41Wy0D<)#I|XN z&%SiI`_nzf;a#<#e64PtXWhE?uZ>IC)MNXXRQ2p`7M7Mzah{FaI8c4L?TT77XZ7dy zzx(a6)9s@jMYGPhU+F(;DeQ3!=V#d3b|fEeY22{!lt1&X|Ge?RvqP<*>0(b~%dT1S frL%np$4(%0xv2{F=;fSLu~ z0YYh>`sgtWTgR#`Pbnw=}>c9X7xD>EU;3dF5z_e8#lz#%bI$#pRr{-LsY~q8J zgMm6AbMT;fAh0qY7{CCR0~QI)11tkPg>} zRe)FZ!J_s5LMgD(zAt)E_3FI!aFPb?oC=Ke&|?f+g?$LD#eDD|fG;0Z&0xF;iRl0U O002ovPDHLkU;%<$i+{@i literal 2064 zcmc&#ZEO@p7+#>XK!a_m7D80kZBU5r?d-?hbyv=E_9{K)YAu&gjMUEV%-wBzx4Yfl za@Q)L5C~{cjL{mXU(rDPNK(!65soP~2Jikcg3inNk@CApT*DkcBb>(9MNZnLeXH4a6US9{kq zYFGaPiYk3wkGHvPv6YHuW_%EtD)!|v7C}?gvih6_wNC8PDo*M~h&em_DMRZh#H{wm zK+I~uDZQ!J#;bap<63X0CL^Z)9(q|$Ap{xhLOPd88;+6-F?n8vjJ;`&q4N;8GsJ|w zfOK1|g>EoyO#6KSR^ugs4$3}00AxYBixvPMaV7k&(hW}}4C8o93! zi#&yxl|S>}Mi2?9$HtkYw-Fvl8B?G!@IEvS!4c@<5F-GAXMw=-LY((260Zotoj_Co zn1sfN6%cgczrkLM6(IcsY$83;^PfHdKd?KrGS7DUa>AaT| zsCjk|F`CzBjF`f-ei@yvEu%@=Yzh<7t2BQS=9mdL3vC=u5>2ngU)+`Qci_6KXD?$d z01yT&k2Rjfb)+vUj|4UWWCXMzR1=Wsd8Oo@u-hS|v+p5a%esA!%n>UrU%;R_L{kHPlyxtc|!sQzm4*Qqf8h+sY^ADdc zoAc1h!$X^n#JMAfL=lYty5srJ1#QdX6(vWhwhLV+K~=>KA3XWk$eG>e2abHRvErFe z7HoZL*UYc?9UE5%_x$iID2>Nu?#C}iQ++$%*n##zsm(%`yMU%}1Xe zkUNrV``7%^``nik9W^`qz|hCXvmXvF8~W(f=2_dGn7Q8Cx$Ta!-3Mx|@rn5tMxvEt z^B1MJ$d7-u^u)2B_Z-|?@!jInu{SChdV0+tBO93Zck5r0CLV3te`;*_?7qn8+rM{J w&Zs}M5l(;PdxN{>#?fjw{uVp&+J*yV?T5RMpIE!U-8-|Rjm?pPdpkD$1<_5cVgLXD diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_furnace_glow_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_glow_e.png index 1c3df136998375daa2315fbac277d45e3aadb76a..ad6556936322b7a49c6cc571b6a0d36a279c5b87 100644 GIT binary patch delta 264 zcmV+j0r&op5TgQ+B!B8jL_t(|+U=LIZo)7Sh9k_G4Dnk4Dnb>4(%0xv2{F=;fSLu~ z0YYh>`sgtWTgR#`Pbnw=}>c9X7xD>EU;3dF5z_e8#lz#%bI$#pRr{-LsY~q8J zgMm6AbMT;fAh0qY7{CCR0~QI)11tkPg>} zRe)FZ!J_s5LMgD(zAt)E_3FI!aFPb?oC=Ke&|?f+g?$LD#eDD|fG;0Z&0xF;iRl0U O002ovPDHLkU;%<$i+{@i literal 2064 zcmc&#ZEO@p7+#>XK!a_m7D80kZBU5r?d-?hbyv=E_9{K)YAu&gjMUEV%-wBzx4Yfl za@Q)L5C~{cjL{mXU(rDPNK(!65soP~2Jikcg3inNk@CApT*DkcBb>(9MNZnLeXH4a6US9{kq zYFGaPiYk3wkGHvPv6YHuW_%EtD)!|v7C}?gvih6_wNC8PDo*M~h&em_DMRZh#H{wm zK+I~uDZQ!J#;bap<63X0CL^Z)9(q|$Ap{xhLOPd88;+6-F?n8vjJ;`&q4N;8GsJ|w zfOK1|g>EoyO#6KSR^ugs4$3}00AxYBixvPMaV7k&(hW}}4C8o93! zi#&yxl|S>}Mi2?9$HtkYw-Fvl8B?G!@IEvS!4c@<5F-GAXMw=-LY((260Zotoj_Co zn1sfN6%cgczrkLM6(IcsY$83;^PfHdKd?KrGS7DUa>AaT| zsCjk|F`CzBjF`f-ei@yvEu%@=Yzh<7t2BQS=9mdL3vC=u5>2ngU)+`Qci_6KXD?$d z01yT&k2Rjfb)+vUj|4UWWCXMzR1=Wsd8Oo@u-hS|v+p5a%esA!%n>UrU%;R_L{kHPlyxtc|!sQzm4*Qqf8h+sY^ADdc zoAc1h!$X^n#JMAfL=lYty5srJ1#QdX6(vWhwhLV+K~=>KA3XWk$eG>e2abHRvErFe z7HoZL*UYc?9UE5%_x$iID2>Nu?#C}iQ++$%*n##zsm(%`yMU%}1Xe zkUNrV``7%^``nik9W^`qz|hCXvmXvF8~W(f=2_dGn7Q8Cx$Ta!-3Mx|@rn5tMxvEt z^B1MJ$d7-u^u)2B_Z-|?@!jInu{SChdV0+tBO93Zck5r0CLV3te`;*_?7qn8+rM{J w&Zs}M5l(;PdxN{>#?fjw{uVp&+J*yV?T5RMpIE!U-8-|Rjm?pPdpkD$1<_5cVgLXD diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_furnace_side.png b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_side.png index 1b99c12fecfddebf71675468c45f4aec97f0c789..1d51de8a870fecc1894cd5bf016927d87ff2ad19 100644 GIT binary patch delta 364 zcmV-y0h9jh1cn2UBYy!+Nkl*8Vd5pK1LV$t-?%$Fp}_x+ zMVfuVhsDorBs&-Ot(9N`rC1|A{d7FXwvXhk{%r!g|6Qw+JYatm!V`wzj5=lj0000< KMNUMnLSTYRF|(}z delta 596 zcmV-a0;~Oo1MCElBYyw^b5ch_0Itp)=>Px%CP_p=R5*=Ylgn{=LD?{*PmXoUOkg$830MS{LOTFhjYSUaLi;p zW;o0-#;}V#Nn5d8J_9fu<~%*zF`rM++Msnxl#gC>b@e8IjWLM0-sc`q%-QGy01?Oi z&l^5|`AVL@qJOHkM3Hw`YcVDbKw~r_LgX714P~+EiG`vlN!l(Stqn=5bkAPn_8kF0 zoDOky(Vt0A+>snG&Iu7f)(4^!jWHTyOdu+XGWb87HBnBQcA+O;8LYK9S7S`a?1_nd zLu?GAkqHV8_LLXu+TxsaHFkc|kUlg4@KU}frYtr@-hcg55P286K6n&yhzMt+3$!^x z(S-j+Q4)DaUE8k4ml@1vj}%2oQIr^CaI&LSF(Sfpxe9sgqX8!;r(M-AxA6ZS4(eK^ z*;fnV{4(qy+>P53*=@peew@#^dUwuZIws39thJn+o-(<=QE`C%b9HNAPdt9?Z|AK#;utp0 zQV<{!B9Tf7Js>{y00I>B>!*o;+eM^Ak#K2J;7dS(>KB2pA3(xOaH%Qqh5}VLL_o>H zpC0%Ubi0R=*i=J`0`<)lctZ)Q)hm&oGSx(TMtuwjI3&@(hI)Zd@O=yUSs;Md08*iw tJGGPIS@_Q|9i4@uVJe)3qG8I;BYyw^b5ch_0Itp)=>Px$>q$gGR5*==lQC}-K@^0)-Mf8v@tK4i z5fVY7Boff@3y>(OXyG656G2q`2AUvJkOY%};y7W?-g|3%Db79uh10F}y&1ik(U^;) zkI5tjU_QMdAKU{V8NnpQrie|ErEx5cBN+j}B<=RsK!7iYpMQCL@QkwD0;T|jFry6t zfTAqPst35mgsaIVqtP+BNlF_6MOosUaC-6$fEZhxEBbegigUuj(`~LMmlS0QK;DeM zGa4NeqcRxW;q>T;;jltPnAt?WoH8C?0x%p_{Q7as`S~f%3Ce?e7kGoAj%+7t;PAX4-|5r?W`(*nbS#$T_974IAJW#^A` zLcTO^#oiL<9RWaA42i8@&2&ZFk*qN>Di)wz8RBw>h(knrBJZ1C|9ZBt6-CjRo+l%O z5Qwowq+?EG*t8%Mp{}LBU@gxirELQ-Y8PXtr|8{>MSl;td43|J@z>ZC|6X8I?6Y2L zRE?-AyY(JUwlFOEfA1S?inML$V!Y|W+1XFLZ}7fBM2I?LX);um@p#hvF}DMDcJ6jj z|KEjAAKv$ARD%J#^&XAC#`}g@nDOe(yUksA`TFhVGQs99%%>L{%OqR3b>WsW)%E>< by6^|?coIz9D|!!q00000NkvXXu0mjf?@t4o diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_lantern_bottom.png b/src/main/resources/assets/betterend/textures/block/flavolite_lantern_bottom.png index bf85781c8fdc440f15aa6ac964679b25cd6b75b0..51971a4c120bc21df1d1e8a84aab32f9cce06b14 100644 GIT binary patch delta 109 zcmV-z0FwXS0nY)DB#|*lV@^p#K~#9!os2mSfItw#(B{%8|Nk!)BU(sl#lEgz>rC5r z{D8JIt+5X|rucxVBA!F8;_w_|l_nBjU=mB=E2<>k#uxyB1ttIz+xWN}Yn1|Wc5enr P00000NkvXXu0mjfka8{_ delta 122 zcmV-=0EPe00p0-(-Ppkb3JEc$wRcbi z7itMLn>@zo`$X^%6a*mP6dGvm&NGFc+j$fEufzE5z~e+C-!37GR#lx%S=igI3@H@f Y02JQ>CV~P+tpET307*qoM6N<$f&-8;9smFU delta 131 zcmV-}0DS-00p|gbBnkm@Qb$4nuFf3kks(WNSxH1eR2Y?ojtdIFFbG2{iHhz0@4H&o zu5^P16!P$sQocnIY}Qh0Hhr{KdqwaD3IY&tf&!Ym^SMIL?mR&Kov;&Z6L_s?VvJ5u;v_b3(l!b7i;M@1IKZ4IuqqzHT`F~lD;%iXp!SxF b?)az|e`NxaFhBs400000NkvXXu0mjfB!M#Q diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_pillar_side.png b/src/main/resources/assets/betterend/textures/block/flavolite_pillar_side.png index 966d76011a1cf788e382e981eb874f43b73698f6..28ec082092b699e79bbaa84027bec2654a24d919 100644 GIT binary patch delta 149 zcmV;G0BZl10`>urB#|*le|1SjK~#7F1;K%B!!Q5?FiOT+WdEPLSR?y=&i6T==luMh z?~_k)+~itl%3ii3JEm6_G4skQ+cN4htqtxQSJW~|dYPNnf?X3;8W)X{&fF?{cyX2h3jhEBNkvXXu0mjf DUs^;( delta 179 zcmV;k08Ib(0hR)gBnkm@Qb$4nuFf3kks(Weh)G02R2Y>lkWmuEFbG1`Xj9nx-*+MD zOg{|Z3u$aDeGk@9Lq4Gsk()Van-a)ZNOAKaP$TnsfT1z%p z*~uM{ck%@%EC{DXGva9^BO7=1D*a*z5TurB#|*le|1SjK~#7F1;K%B!$1rKFrF+I=>E$Var{?ue*u7Zy}7<} zeVb^Wl@9=Sv+8bgy~mi>sw(C*+C{TEdNN~8${+W$#nK7axt<2Af?SfpBJneH&af&y zAE{I9OisJm_cUq`qCtt}9_S1vE6$N7sP6kf3h)n2xIRz@evHBZ3jhEBNkvXXu0mjf D+k!&! delta 167 zcmV;Y09gO_0g3{UBnkm@Qb$4nuFf3kks(Wed`Uz>R2Y?2PmKX49F<(zjU@q0+*g2z2IjrO-*9sJJaWCGDV$bvr}9s}Hx+CW V1&N8BJg5Kw002ovPDHLkV1la}NiYBa diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_polished.png b/src/main/resources/assets/betterend/textures/block/flavolite_polished.png index 58a5ad08a10d15a444c7896b0cae4438b4b85269..8f239b70ecb0d6ab6622aeb69c68b93736f224af 100644 GIT binary patch delta 149 zcmV;G0BZk>0`>urB#|*le|1SjK~#7F1;Mdl1ThQ)Fi=*L{m1>Y8DReafV*zaC+BOT z`K`FoTe@GfN|WPt?tWHL%xiADyoB4Amy9)@mxu(fD zUXBA;c0k1iVkQ9$k8&2>!XAzO(-%+^ Wp#{Dfz)F$;00000#Qgmzptze@m? z!14??7HqW~_rMhDD)Z>T0){p{%Fy!9=g;@Wr*xKr)x|Xo`he#?KxHr}mp`H~DMBD;OE2HHltD{tC<3$4S9>1&+A4!h!3`)539FTamU(VV8PnRd_yws~OL?r@ RT(|%L002ovPDHLkV1hllN6`QP delta 192 zcmV;x06+hj0=EK?Bnkm@Qb$4nuFf3kks)7yl}SWFR2Y>ljsXtCAPfUbSb^9k>i=Im z(=8GK9f|Ghsd`SmR~4@(6M4=$w}!!%L;+-RPXoGCBDCv(1+=CXa+g{ u0M?UVHLp^Yv>n^E9i3y2anEtT?H*q;W(j5K0vVqG0000vp+;_4a(y>1b%uY<~90F*SsP^>9Y zfq^xwMphUapMHZ+ZtjtdS1AqYc9-BD>Pnfsr1 z%YH~i^MsdP`M5Iw7q2G*QD@h!X>cS_0GT}N%AiXrLMIDspmnt-ch$;{=!31J5Ac)& zE9mdF0HguRr#@Dg7l_hj>tXx__3(r{SYVfceW->kO|RHLULL{^z?qqX!+RyIAYh*; r6-p;nrgR+JbsU{@&3UhRf7(6YX3Yu9Dx%Wt00000NkvXXu0mjf^c7Q4 diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_3.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_3.png index 60573b690c797a24b844c631bfb9cf4957f79521..c3c624c5ac8c3ff3eea64e9618cb2db439793747 100644 GIT binary patch delta 158 zcmV;P0Ac^O0+RxeB#|*(e|||sK~#7F1;Ig1BmoS-Ks%ko0vG=OPb3yJF;)8s958Ue zYx$3XrSbeOY>=nyOBW7ssOgENz%M}GqJ=OtI)^=d{qWHp56O-L(lL#&ggE!~?K`k= z!r9;nOQU^(60xU|8VW4XznJIlQWl%Q8&F(kI8A0K_VsHtWmEVE6p{)}R%I$=2><{9 M07*qoM6N<$f;dw{*8l(j delta 191 zcmV;w06_nf0=5E>Bnkm@Qb$4nuFf3kks)7ylu1NER2Y>lP5};Jj6RkP?6@ t^r))56|2atvxTkGbNZaO&-)Gc`~g3X32?Lt6GZ?3002ovPDHLkV1iGzR)7Ei diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_4.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_4.png index 76900c7dd197ed68b1e847a65f6b0d1aa4d5fad8..a6d93c1616d83d91b800c4b049f98e57c3fdc625 100644 GIT binary patch delta 161 zcmV;S0AByN0+s@hB#|*(e}PFvK~#7F1;IgT!vGKj!S2x-EON>J|EUBlwBxGz-2e+= zfoHg}V5{Z02c}S0nMVf}Ftq7Wh8DcQcPX8vSQJ{rpwEY&?*4ODCI;ls7b*-zjYb6q zR@k$`3Pa=B3v#xULEFWY3d}dP5}ktcWMnpq-bX-~%K(yXZW1C3K z2v!;aSrl}i(PlJD9T!&XYCT)$N5F(VjHpAb^3N{4kl5b}RQ76L4U zy@o$5*lIbx15>E0%%!s|U})2$Oj_^-o~3l4SQJ{rpx3{T?tVNggF$(FQ-z^;CYn=$ zS=O-kDl1GHUx1JsWzeEn5g4HNl4EzP3^oNfpg5bbT1jY`>uYIR7n>G;EDlI{aw`Hl P00000NkvXXu0mjf&Za_h delta 193 zcmV;y06zbg0=NQ@Bnkm@Qb$4nuFf3kks)7ymPtfGR2Y>ljtdS1AqYbi9Y3WK?|<4Y zvqK`70*{t^BjVn#gqOQFcD|LBL&72H1l+^VEU{g|po1qQ+yymjtp?YqR+a#$)><}B zGBB&rw=xhCKv-k7X-%k{NL*Ok$&e85N1`%3CziA35wpH={wsN-x8CsykY^7<=HDwU vE&#+6f+6dSAdhS-j;#BbV?1*_Z+gZLV2KH_6uV4I00000NkvXXu0mjfB^FS= diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_6.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_6.png index ced138fc79077ddfc201f43c050de727e854ab4b..40bdc6149739a7a8b797e45a50ecc74d3061e460 100644 GIT binary patch delta 156 zcmV;N0Av5Q0+9lcB#|*(e|$+qK~#7F1;N2h0{{%bKs$|upda?%6L?gOx!Z5xU;qx@ zdoK(ujmK+;4f2$I>%svJH9cY}{&<4FJfl4VyTWr=^bK~0B#VRo5~{Eh!Vn^`aDG84 zCoGLWfY=AIXo#i)3-lTDxVw}+o4^}TTxK{;W+?XkGMcg}{0AI65=vXMWpf??0000< KMNUMnLSTZ_UO&J9 delta 191 zcmV;w06_nd0=5E>Bnkm@Qb$4nuFf3kks)7ylu1NER2Y>ljsXtEAP7T6H!A=^W>i)a#N2e*k5UBozL=QW+pB tKUpwWOQupD#a10fkGbZ&*Sz0x&mTsI33=B~s>L08CtH|lk+~ln7~lYK zFTWUA8rN%KgFMRKx`zWe)O5vCd;@~dXdw_0j>Dq&W9%F*k{t)&i??ZnCCpFxdskrL zIEW5M*wa|gA08F4Xq^#AV1cmr>lDgj6LljsXtDAP5B8YN0GE@&B*w z(mN7SCNkM$@2cASyHt7X2t=Q!Z<@d&nFKN`mmd|WVlly04IbcBUDq}A)dV6mjWOp$ zE`fkYGQ%A}Ns9LIJUzr4MC*D<_y_u-d6LL#sRYO|)B~SXuLpC=i$8!eXAuhDE9ey| s$R`C$Nm)fM#a1mvPjj=|?f%+rFIT(?(ADMyegFUf07*qoM6N<$g2^vXfdBvi diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_8.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_8.png index 6461ba504fda126dfda7d4e6bc3b69b93a8b63e6..60792f55c7b317963573de045b434474f3c5f17c 100644 GIT binary patch delta 156 zcmV;N0Av5N0+9lcB#|*(e|$+qK~#7F1;Ig5!$1%OF!gv2CMW*?P*POzHqw5>VK{i! zuavY&U7ux3a}xU`%Rxpvy=qVEO^C1RQX<63*h!vy(sNuIE8~sucZXF;G$L3|Ui`S@ zgw;u#PTHzHNqYtwEGm6nrljsXtEAPhpM+tdO!yZ>oF z-F_1>J`3S^YBKZFa4mo47MZ+Ad`C<(4!Qgod&sp)>`lVJiR&$B3ix9>jHOW zU0)an(J2M5Bw)IL{F$ qN;g%ev|Zb?U7cf&anEtTa*rQAg9)DcP~B<(00004Vqk%)TW2*KC0002) z<&A-*alIEd$fNA73kPth>58TJN~DeK3u%glJbPuyCYD zzdSj@(g>+9KZ!--#54*l&{z3=&PiEp0?&ZrGQ-hihGOrx(UeW$6+h+iM{_>^HRS*R N002ovPDHLkV1i6UNc8{! delta 189 zcmV;u07Czi0<;23RSS!;}$Kls8Iug_mz;@BW0uQ*U*3U#s>~|%=(fhy);La?;<)2^Zl5n0V rBUEmxDrvj6wOyTa&3UbPJ;yb_D=i6YN`E-m00000NkvXXu0mjfIB8Qh diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_1.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_1.png index 15759ee2ec3cb61be867871841ae680de9c45470..bfb72505f5b8f56b6d1abfae973b41f039a27fa0 100644 GIT binary patch delta 390 zcmV;10eSxZ51<2(BYy#BNklO-n*i5QhDS?fet|fL86=wP+Ev32NabBCS-i zE_BhdgsX*w)FMT!ls+u2Zs5A-_@3^E!f?(zbLO3oGm{$kyzg!i0mNm_D0R@>N}=4H zts&johCqm0<<+=-)XrYzmMtN8I2vDYM2l+3&0fC$y)*?k>PQ@NId+A2M2y=fq(;^mcT!ljI)wNP$eQLCk~dNrqRPn z=vW{uQavOHWPcPv&tMW7%YRAq5D{n^J*-52@n0ep5pC0pCFyf)GwG=5#4j=C*TYjD z2=?rhAkzsGG_IR27N(x~B_G kBm!|F^=w8MFsI7$2Oecc4yt{w`Tzg`07*qoM6N<$g1>pVaR2}S literal 2046 zcmbVNeN5D57%xn4qDK6jGKO858>qd0+;{avygLQrodnO}*A{#2dv^_Y?RhQSfm7$0 zsPk*$Vt_H6Om~t+U8W{u)1b0MT%ruWhMO~Si5kT*{Kw6ieY`!6i!RI=o3wq~{+{Rg zJh( zU2rW{7CYuMoD|ToyyOO&NFWH&2r@G-5@fkDprCHx6+{d6>(^}(PskLArmXGR$4AOI8=jRgFn%tS0$%r67i>T3c+V-Tgxg5|3L(Z!Bp z)GCDls@E8Bj?&Sn(X62iq?y)DM`@BW5~Pu!v^YsIq=C_z(fEPEXd&Lil-TCRW5Fj2 z=2Mg)LlEI`SQFN2q>z`O%w{t|(gaQ85P{2;qQXXSQO+LlU;{E25`u~#iKyz4bxY-n z1%picQwRhTZbdm>CRi{c!UhRSL#ipofIOGL1=lq^wwg_lv4#Mv zNFkRb`3Hn59-xd`t*S64G^bP$c_}RCK4JrGtO6_;P0|!j(oi)Qsb%y!hSpDm3zF=I zIwW53R6Y)+Xcwhpw0cHscnk`=hG!M_f5AM*c%)E(g*giW)(eQB=*7@PB^j&amqIWw zWT%a>a5$JkQC3)y1BEsV2GiCE0?(Lu+Nk9y6V8(qz*$P?!QFbj5$DWW)@U-(CX-P& zU~iMSa#h>`dmh@eZc48=b2M%+(ZWHbSJgsK|uQ%%W0s93Z0d6kV|IB{W zEvI$`Qy|DtugdtQSO`|eSAGGFH3GwOYJ*!aPE{5_2K}#vK`QWc8T8wSeE>Rrg53Qu zS@I}hHU#p$uv$;kQN(}om)VLZvwu4M24g=+2RQxNGKmJ@aJ;F@#9W0BiOCE^=sE=F?#ns(=MW_6dZ8`fmDBk~Nul^7Id0!8wHd;s z37OH(lohO^F_z>m2h?NUJDLZoW48!C%?O+qWM& z*^RxMnrD|TuXTDauf0EUO=n))$*h_k=~vgkw5y~zqv_Am&w75jKcixj(Kvb0_{hbE zk|Q5{8u)3;x-G$))NzNri;iz?u1jaeD{cDT`a|4_l})2(zBcTI=8UlE%_-|9dhbry zQ@XKfY0;j&_sZt)zP#UdZFNhY*7ZeSR(*6|ZWq#2*R!{@=npaD%)VY7-+ul;a`C3s zZ9R=c-@Y@YIQee-(4AcyzvVXXGK`Ay-N%04eW&;Pu1f!D=eDf+wAmYubkv3)*e{$e zzkj2;{czuV{E#t?x2w-P^?gio(&o%54bgMYd7D-_rXJn!sS{kwHUghLs_vxm4z1gCdr9V{`6piAjX3+(*Y3PD zWNF9LFBh(fw)S@11S`+F{w}>5I6Lju(gwukzA)nBlDy2He_Jnp^WBxYdhX!%$Y}Od zN}2CwO6v{Uvh}T5(R(AdO*+L)PhXyXYiRep1rJi(c3;bjqdxMS=yP8mIVX4djP5Ln lT!y5sXuf+usGoNwFZ;~c>J_=Q>(oDVq1|aaIA_H>{{X8z#^V40 diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_1_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_1_e.png index 3c8976afab676e3ae1d511c588c5da028b32b1c1..f243c1b35aa5fea064a228950d34e686dea4419c 100644 GIT binary patch delta 104 zcmV-u0GI#A4ut`bBwM;tyZ`{p7z2pqQ-|3A0000< KMNUMnLSTZ(_bn;_ literal 1863 zcmb_dO^D<~6wc1-qU(+274T48+P;{R##QJ!*o)a zBs2Y^u&&~Q;?0|Q^Q_?RMO094f+sI}R#-i%2#O+(Fa5`k^sd8TAW5b2z4yNFy;oIl zY^*=Mc=F6iMNt;(Yqd>ypU&?)PQde_U-v1z?u^%-OBLm=d-D63^3J+ZLJH673)=Yd?MRnWhH3tX*^(W+SeOPOvsi#D(E{ zlMT0-$F-Fw)bo7;4nmPpwI6n)l=REm$S;9$K5b~~2$F4=wMrgP-D+&8RhbCYDHL^v zY^;{N0xFsww$G{9L?y#48OYL2M9d3eK4!x*`-&mI4;duyIFbGVRElxSst!5CBr!Xv|{FfE!jPH_u73632q zxKpzE)c)BdfW<|-NA{C1xx6dLT987$29rf`LF`OM-9Q~R0--E#@Uq78$_ijGo(|?@ z;BX4Y_Pve(r?)8g7?w&u>(NA1+K{cobd+&3{wdwNHG7xilEsj#a}x=jBHPznj#JW^ zXVH@DV%II%Q}qYgBiuwbu^eI*ryY1i_LJnY4vpFZ_Dn-Nx}L-J{2^z400J0Je?;OW1WbILcj@k@XH@n&WC+5^j1-OBwh4;Q|! zz2&}e{L9}Ku3oGEzHs;J4-YPXzxDa`+m~MY=uxqGOnL9h``=w&ynZb|>gucOwGW^WdsY5PerS!wH>;<0vJm&SDt-Q)X84vmJLANAC0d{pV0~OTFdbc%KMLj|9@63AnL9%jJ8!b-z=Jzc3P}5NY&^z#-w?h66 zmzoq2MW^^xG_h{p^#I*CvkQi3oj9cvKdcuKqF)YA34n_MFo*Y>9b6D2lVw6Ql@U55 zzyYX$jTZo1>3>+5P*74Zz$Ae5%!J$`wiz*@L^=nc>3Jr)>AzEwQl@Fy156f&V@u&l z0$@p9evs_RF9D_#HmE~00UkFcK1_+tgMpY_gxm<*l^d~BGMi?Fa*QYlrRB9pieQ@4 n;9@C+#)~wvY0*&(xYQQ_L7E!>^D&ABB; zBoiIzd?dyQbHT^hrY`d|IyE}8MbvGY;Wi&}x)~osoR5jw{ymP1F6fL++Wy=AzVG{e z-|zc>T~RnQFCl(-JOn`rj(mF&xDV3K*eGzVTU}-Xw>WQpi2_0W25V<8Xv3yd24Fmto6!6)xr7f@no<2M;2!z*&(wMjEHRHoi>A zUnKLzi)K36Mdhr8LncjxC-^Dgz{9Hy?DtfN3gx#VA-@z@Yp*c`4nfp%E0UuHgy+(Q zuuYPA*r+q1EMXvFvqeXka0_V|50f}y#&9!6=uw=Ya1*7sz~KV{(PYj=71^hTV}U0t zQl_e23d4LppU$V(NwOOwEEWrflNd>&0D&q2QDyw7sEq3NVCNN97QCt;iLmC8DV3^J zD*~8yrQq>K+=@!LOrT(xpYdXZ4%bo&0Xa5;^H#|fq2L^g@fEy>7gYsdi3rwPCaIEA zCOyM-RNpmU2n5hXFYY9>&dMUeS%fkxEiFsX~%L zV8BivVnNfCLsV2oWO;|(ih#6rg1}KOJxP*!jzI|n&!P-#aG|A4sS(v1a3f>U^Bhi? zy6x=}TcwHHZO;LFf*^1XcX23Z(3?>fHyBWcAhJ*<%V06PSf1fs5&HsJ0Go@ccxgY{ zmeaa|$`=%%S0KD8iuua$szQK6jX*K1*5Foz)s*EqB>Y|ad3p4j)$fiKBETwJz{5#2nPnHZwwgK5*HOB(FI zs)fEiF^Rh2V7zI|$Xo>vk;%-9z_kqKZm%z+WeDo^x5J*}OkeFOnl7Hl2aRwfXB3SL z4!O}7y`lQ_^efRN*Px%SIS))WTWtdh;qycK)Ew32kz07K^Ycdft#1=MN|M$D(i@BTgQGiV z^l5HAb01n<`@!fvWZT1(Exz*fLqYV$w&a@nUzP>m*cV0J^$NM=wfDAN+Wo`c&-_7W z!Mz1zPKg@_<2$ELJ3b(5Slq=H^kV$wl(Ch+L*(AJNxz!c-M@Tu$JU**jU8v$sOvB} zvf;+Q14FVN3}3r+PfR7&9N(PfF1=cCr+?gs3v2bo!Mg94+N-%K?#iJVHKX6Z@Ls@? z`r38YKX_&T*Xt8ImfuSIW5vMO>zlK&fk#r`bk^7p!^-A$-!ujTv1{v6#$mcKtAd%R zayWrrvLq&L`1(ypiN6y2_syH!$FlQ8;#Y?<=SQDAChgcw`#V~)3g|~Wc9})2=||nE z$K?%e;_(Z=?VUYefAr@~`Hz;5N0O#BoHevBo7Kb^|1@uG&1h|*k7us!J+ZDnd&1(@ z2bM<5E1zT!JT@#=9DfV``0^K9Z=TrD*zaiUy!!p7n5(ny4E<+GT3dB;L+ID-$en55 JHD$rFe*xvw(6|5q diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_2_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_2_e.png index cca9df0659eadadeeedd6902eb092ce419b4fa47..1e613a9089fc0674c4578e11a6af022cd0b02c25 100644 GIT binary patch delta 92 zcmV-i0Hgo94tkIzRzXQbK~#9!WBC97KLaJ0VHg_lDf|BaPht1}<74AD0I2AR|H=RO y*hG5)qzRj?#2b)JsR1~gOyZ`{PFae2>LD$#-0000$(dAi!eKTFl2F2#w1nw>FyL8hp~Hf8q7G%Htcw_x~kG0rjyDf zndzRnC?bLfMergbcv}_EMT|9d7BzRgyTrZ-F2QT9I(tqq|?>YN);A=y>1jgmGsi{LqvF&Rsr9*Wq*ih>-6RK-e zbcP*Et$GHoAkT81RV{?8CaRj)))6MCLTpbRUmAGJct|!IFN}S`m#=k;A|GV&=5JxqO^!)qLvnETkaOV224j1;&f^@$;V-W zfSCiDn%F?4q#=;ADK6d3dPC=&nW86RkrX*#@f4eOWg+vfe1Pfc?;{Q%v_UZSF_TLi zPhI52>K@1#2V^EXZ|$eT+!VRo&6rr-1DcmgH7TiQf)+AsN!gnuYGXoKt=G%M)YPZ1 zMG2Sv{F(dKhz2c$uUW{#IZEo2kdA(p!Y1B6D*VHd&nXPNHfU`nlRC9_!`JIqKFgM#x=n( z)mfXibsjocr)}5M8FMLexy`H2NCm8KNVZ!hce0+tdW&>IcvD;zJL6F=Qip{=C@Txx*I1cZ!L{*p zG$R7XQ!p~y?+P&bkaUk=xeSXw&BRIvqIH~#G9Sc0r+W`)AKI2>*_`Uw5lpAd33W)M ztJ@B8sb>q0FvNcrdu+9^L+lE{l}QDjkp0*^>(Znn;LJ3&lj}KNJM_gH za#U*OKdW%~@4k~2(m9-h&nR2lS}j;&0yF+poR#?b)-RFFmoabK~B{`M>TQe)92W3)ib3;2+xOe>wHu<@tA#rF(OC q(n{0#@~7T+i|A&XzWL)R<&U4={eJMx#S3M3Yp$+0K7IbxH~t3WzDJ_~ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_3.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_3.png index ad510fce3b31ece5981601dc7c8d372b90fdb7fa..1370b36956d129aecb151cfe4c21fdec57c24d32 100644 GIT binary patch delta 396 zcmV;70dxM95Tyf!HGA?6e!{B3zsX_eAVsQw zu?xcHz62)jx;x4Iq*u5uZ)rj_sIdRKJDlCrKI_grI2*bpKz|IPhs#lrr>5;}YXVx} zFRa zs2FXufp7>&s*4ROia_t`N^a?8uWHUi=RN0>0aTAq&e5k*E8v4tT%HX9em|cLGe^(> zjbVl*pa4PLK7YOg9g9VjCVN;Rn07@${4p8n!4hbiJ$2d~vo5_tiW66wHdhjJj7t)r zuuh;Stl)=q30dAwm1aB~w=VI)C0<^JLfSlOe2002ovP6b4+LSTY*rn-Ru literal 2069 zcmbVN4NMbf7(R51L%|_z$`tW(E-I1h{gsy9tcWcLN>Q{9+%$T<`$|vRyLxxff|;Ad zVKnGAjGB6`hmI&l%yc-NIyclfWz)nN18x(ek$nfH(FL8c$@RYP?s=d0 z=Xt;P*3HYG6+3+Fa0EeOb93zT;XO{jUK#@bKm5pJg12aY&LR~-MkMH06jB>XM35I- zMQ4##1zAYo0~&`0eO^grgI27MmxXKnF@d3d5Us?DW$F&mBF8+` zCMy6{$bFYBDmT4_Uy1PxU*s& zP4lw^5eNhf0mdLJ#RO%sSO}6PXc~tITrHP0E{IF&!~q67Pd<5q&RlI%91)cz2-~*DTLM#=*`aQBHs~-6Y z)REVZIe?{gI3hjp2Y16GVCX$mK4sG5^x*fb+cr%i92rz%pq@vzr0{=iFurr${4%rvt`?Ge(XB0^HLsYQWwu z^QF4D1NH*6Pd8bNz@6sCT`mUTG-pi5T|C3%0%;aV7n9Cgn27ycMTCco^FB9^e&qD7 zU~@zj>Qx>-6brzL@X9NqeT~3!yx!nejMtR~0v3KO4pM<<%b=e&-~o{IDRTG2RN1Ws zI0a-D!)iTCM-fkoU**c49{scFH(2z8bl`JFA1*HM;iO^!XC{H^`4IYa>6eE1uWEho z9+^Y~a5&!dWn`|xO=L0y2~sO??gr~89YT<(o?LsTbIK`DQ?T(TGOp@YdegO|xw~Q= zW8$11`6&L6bg=8l(83u>?=5MVje2a&9g{X}yRiE;^DRUCmaElm%)R38VlH2NH+yT= z#vVQ4p|AQOfdh_SId-keze;rCDvR5Wn9P8QCQoEGc8t6*wD(lKGdH;jg=`&5U zzQ3?tJbcPkl@z~c{X30$@tG-aO#U-@!m>}7uU}Z(U3oOxvCo>=NW1E49u{?uSkn}j z5I^JF+o|Uctf*W0TSj|o@MdVnP^Pn_Q!1JIwPQ2Yy6A9*a&h!DLk!)JeScMKdu8Db zp>cEfoy^7S>XEqm#usu6?{`X3qk5X!N51*Rxw5Jj zjys(?<(up|y|w1eJ7=E0Qn0IiCs#dffhz_1|vmZGuEC$zK!j51l z>37prhuD$aU|W^4@6zcp^ynoY@6U75(SL_#@$@!2>g>U5vBap8)#t}u7;h@5?5-J> zo;*>m9FmuM5^XpluVv2rLQ7Z2R?Y2fX{!$%Z`mII^4kdqez>E5xO21e?Yn0#tNa&1 Cc-J2Q diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_3_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_3_e.png index 9f08d64f3517bc12b284e41791cda50060298df3..e7e499f53d3ead97348144a31159e62433414097 100644 GIT binary patch delta 113 zcmcb|*T*uik*KIZ0!71#?5!{2%jKl4mF? zm^m^R+;rI@4kRWq-iUE1k!TP}DrVFxoRiq#qbLTme^^i QsxttAr>mdKI;Vst08;BK8~^|S literal 1886 zcmb_dPiP!f7@t^NYD!Uv*ccBEQv{37&i~z=N7op4((ZyALps<9TJq+-H@ic2=1pcM z*-a1(y%j_RZ<<4|UIfnt6$LMP5%JKQ?V+NV7V1SQ#&7l?iEe8MF3iq*Z+_qJ`+a}j zd)JniE}ovAn-&D&bffO9!27BEIaz@J=kM=hcs&u<-%17H)J*$TctQAC6>F$j$B{85?>9W;Sn{kb`gZfUwF6}J2 zWM`e&RGNQ9Jl{h=5V8!5y|5Fds8^Nxya>kmvLcCnNVZ;;7IKH;YI9kv@q~$1u_P1C z)Wx!0)Jm$Yn=gyHs+ASBtZ0U;YDg_1!xo1>3A`oLM=Q>Sp)Z(KrFNFZNKv}oZn0|= zdD2oe+qM-|S9Dzlgq&_i8ScqZdUnL%u#_Z0oCQ1*b4Kj(&8#Yc(m@DeJf@A(VVWRe zN)N}1R#fwl`anv?xOg+^^qo_punr4Zl%;^x#@M*cGoH5jL#W4}4>^F;Hk)G~6Sail z*hQKxZb2BsgiJ)I?sm+S6_)bNgs{aeka;$bCPuY{;fyCP=bcfZmPeAsS}iY3MSSsc z5K-Pu&mFK~4$fFr(p6oPRUNA4ss^%5q+2h+Kvf6OCZ~bFeHf}4t`1NeX{AF@=o*SM z{GVV-kk6A4L(D;lTTF?gmL!fdiE6yV6L1XbjJ}Fy6E&hV!x3Q(rz%0%#UP-_GCaSm ztEx=Bk|t}|v}9b;eVOXIS;oGFDa9juhm*~`xFdTC_LY)tGT-uL&oh{;W3wWA#2_+N z%T)D@3b74sWdBAIz~;i8WAo%&F7FCd4^pVt_Ha{NVjIIzClLFMfH27$yeg5rvW!Z@ z74&3$k^Tj#3_`KgC;*R&Q8l+1D78v0sMzsiq-U znBmEWi7}%v*FDJpB=wr^Y9=zu2RiVW>WB2CjiVNWGgFa{AJ5VHabi6G-ckQ+JW76A z4q8q5XBYOr9XMH`oc$#@uJhseo`A{treP7JDuH{%y1Vo_+(8=+XThy}M;`3&&!2c< zcVqUsd-g9=&TY$m_35wgyz}W-^}VTEPyY4ZpMOk$e}|ko@uT>~?*-#QVK@BNoB83& z?#=h3nMPr^ot^nPdG<}^-JPqyKKAzQ$~VF@zpc%kE1kR{%oVPGc=3bBXFs`q>cZL; ZLHNnux^->O*w1gk#^RFm*=uW8{{~jTQ%L{- diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_4.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_4.png index 33b36101ed890170bfbe1f72e6b8ce4f376cce85..1735bdd33d7bb3f36407b5d9b6318c66f3c9bca6 100644 GIT binary patch delta 399 zcmV;A0dW455U2x?BYy#JNkl2k;iQ3|&S}!fQ_Dlam5(7Wy%*>g8uBR~W``=-WGXbiQQ^BCSQNVO_ zyad8vMM5H9x{F!+s8>F#&KttyZWsOiYHNI6e``3O?Zbgv0e`P2)nR*6vGM6R3xeJGX`}ml(c}C&Xua$o5dv2@DS_1Y&9z6*CL~UiVq{=NqwOXM;gH;v1QkN)l%DK5 z&j7#STt}xYD%PDHLkV1fo|yqo|4 literal 2068 zcmbVNeN5D57(b0VMPcYN-JCPEOmN^`KklPkaF>_-y8cl3&j;#>hLmTNyB1<#0d(+DU8r-ae~H8wBC$F4irZ7aW1;hmK})& zpDbvZqDVA``Tc&KU#}B=Zj3OS%@|H%B&mf6tsE2-CZHAMgfR~`AhSMRQg~57RF8~P ztWYc{WICFHM~b=?Qwjq)Hj0xfeC6Tb9E*W+-~oanLo5-+N@b!V z%4OnXTt`1Y5&)LgZjZ(omy5>}4IwL8l`xG+LB>VPj-UjvLLiG3J{DwELYfI`HWF?1 z0Y(vh4pA&06RKd0GGeu=!lWXL*75=;`sLRjvH> zj*mj^BFDRek3tF3K^SPgihcwNyM|*F=6}H)OS?p$hk-fs9>xtYNpPb`w34({EEjz+ zFl46>v#{IgTtQYCfd#oX3kuWL@jORU1~Wwh64&ZYETeTf4Q6dBZXmRj6L3a~buomI z7_+yDY=tWBm^}yW4UE}nFmkvS2OOov&Ct~8q!=x1=~SH28%(K`bId;9$HUFVls~f{ zb<3$;LFe!?)GHX-6sv$YvMT41a3jzRt2Vd=WmRPXhelrW<5b}3G8lF1F9Xo&6XYI+ z$)Zc~Gd_^%hShqSj=~L>08;|`s9r%pwBgJLQ7{LwT%*0SNA55Jtqtami zRW1DOp-D6bhvQ9MM&~Mgh)!l8K-WGvcN?-dY|>~Z{FQ6VbS(PbUU+WDk9ho%PwpqR z?B;F?{*GD23vP8z@PC)qbu~x{^ZL8qKblcoo0szGk>sBf!@ROH4SU-e(?G6!u9)S6gRie_SYBJY$-HNnYTBtTVB&B!n zcbA-Pp!)TbGH%{G)D+s#cw^~EY5O1b+}y!}JH160&~HMmY2F^iyX#cC_cL<7d&ZZ^3~@)HyGE zc=={>Wa7esmVI^Js_h5j>B-v<&szJdAu#)*3_AnX7-&b z?YbLTy~MSGn~nGMErSgud5N)Ymi+0uckd(^yLK+T#NVIQR5Eqn-TAw&9j={pe6jGH zp=wUm+^*z)WXso=w;tqQ%rC8)Q9b9+CR)*5PoJ?mzU_@_;~Mq9otw4N*1l|g^}oUw B)o1_! diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_4_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_4_e.png index f2d5ead95ca2e272417a4515b5ab89f34075f1fe..1320a86ad84db425892e64a33eb2c131195707ce 100644 GIT binary patch delta 97 zcmV-n0G|KF4u6m&TSiGlK~#9!WBC97KLaJ0VHg|mDf|9^I1ao2pL7F&nx6Qd{12mv zHUMTTvEtYbfI1l$n|K3|oKL&~IQ)!Dd=SRM2+Rur$>IY5nQmsp00000NkvXXu0mjf DZ&oRL literal 1861 zcmb_dO>f*p7o3e{=8l@{GaO!wGyX$7{acn2M ziIAvT4j|yvTh;!BN?f=!65NqMf-?s=&`YI8>J=%x-Y+$1TcQX{w#Vb={d}I8`D%6L z!?S1JJR?cc*+#v#2JdsleR>X_7oQzcc)gm`KglHNwKs};M!I+Zyd=%t4VxSJhW9aH zA}Y~9_`KAQ566^5s4O2NBPy+>g3(M*0i zq&o;3)_bynbXP;Jrkg6#337;u<e zgo=^|z<^C~$#&Wu1P_?TyFB7?o&i>$V3Ur>Mb;57a6S2bBmlJ5^CmH-<`PAd5Lv#w z17(aFG8LUQcN4Cy@l0%|j4$s%nhQlW38|)><|1th(H#@DI!;-xRtsXv@;mEc9Ee_a z={Xx-qdBiA1~PON8NgZ-nZ&k;VZRFlgoaR01Yv9UC{#C_20$@E))6SECZIX}PjJ9U zOQaEnn!|{;xt7FjMV@q$R7F>$5E!yE2U&O?X~bDhW5ye`iUMVq!Z08$({XW`Ayvn| ztzzHuRmyFwI*wCzux?@BamMyF!L|!>$Myl(TNK-t9Uv9)z*P~pbk+A=s)D4;h?g9QI62Ie9(D)8jNYrmU#{wH~e5Er(Lm z{;k5nzvp&VpmQ(<+jTLVoD=XdIcazdtxDk>`F8){XE=j48nvZn`6u@G;o;)!+qbsP zzjc5g&s_P_o}GRA(JNPfoj?8g!QpSetj~Y;#GjWx-Me#PYwpMHUk`5ITqtclnfu_u xH(z`EGppj({cHO(^?P5we({U%(5Yvqq~AC1{PF#xo1{4C8p|uShgWXg{s->CM3(>n diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_5.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_5.png index 030249bdb88c25e4e01b6235be1cc840f3e9d481..d945f546e5ac41a01ac7542cc43d90ed73d261a7 100644 GIT binary patch delta 394 zcmV;50d@YM5TgT-BYy#ENkli5QX!G?)nma09WqZxo{!qLa2)t5i61w zs{sS8(L!5Aq`ERn)E0lL^(O__emCcGV?;QFnaP|vGjqqA-iF{aZU}P!4PuN2>mJtC z;Sz|W6&cPxZ!P|gPlnZ#`n)Bi*E{&H7n{@5=1bdu@9mFT+kfEss6Os(s5Uu$f5F3n zfDicn7KF3*;QMUI_hYa7w0l4aQc1G}6p+5@tlbASN|Kb86NkxG2SGT9=Pf~q{mMhF z$#0OBlJQ(0U?_qP;wa=ZQ2TDVVXBrAHS<^rT?7sZbY%(bfhk>W2+A{rECQc|oPYvd zGA2Gw#57ED0C4Bg4t!H8({z*4uU-mo={hb0d!Y72M1hx o8k`V9SbRaZT9%FR$5rG9$u~yu^IP!q00000NkvXXt^-0~f|XseegFUf literal 2080 zcmbVNeNYr-7(ehMvP=Zc{1{u8$tb+ruRHE;^Ujb1IpXl-&O}jRZ+GulxZ7QJ7w)i$ z6iBW7s5B`AEp=4zV>E*%u{3pb97oI18cQ(}KmHJPluT2z-i6~v8#KqA+1+<{f6w#$ zp6BKPLat{;9>m<(=Diy6~pjpmtn^^DTg*1e$7 z^xMa|bCq027D)>M9mNP9Ru>A00IkuCpAZr$x|mfU59{N23w*U@Hwu^G;g2X}wU9y(O^f+WR>#$_hjO)iiIEon&)QDh&7R5+3nIz0m_<%t)iSd#-w)Ai; z@MM7t6-6WwBp3|pf`m?xd~b*#OHcGQeUHtXL>0 zf?Oy(#C7EJ0|7v39gawhUbzGUkr1+yRtC}t7o=CT>@F8sB!`uSQi*2M$^gv-H5-vk zl~_s&@&}<9?#A>aVIooN0VwDihEk~i1v5116{G+Ka^?b*k3~e@2SbrclBt4U zkU(I-j_6|HaFBLhRw$lk?KTSx($;YtL+S}ak0+ZAS`T5Sv;?a+Xw4ootMwXC){7bl z55?j=_BMeoRmJVGXMjEJ#VHyy8nrm82UcdiM{Dv>m=-siym}+BHkz;=`^gdqHW%f8 zVn6DZQ@eu9;AEgzd3aN}*pl$d&p};{KvJ~Y;1-xxm1P+?{F>{f0*{wLx7%PL3!FYe z?rxYYc$FX}u_-=Kt;gvoU67|5rcvF{=xe6X4lbPj#YYEKV_`UX@G@9r>c3X-&@rPMCN0uB%W1HJg zE{VUmV19Gny4Im*kG@MF+XwBb54InOdhT>cGrJ(AvAXZ6##4c_$=MzI7p-iDHZ%Hr zk6qol0;~Am*SYEZ zb?c}Ep3g68ZJXCOeTKn#;LoP$I^6$Rt&VTIk{GxAOL23{Tfg3JU%$sOs&i5G;Kfa? zBfo9fZx}SQ#=3Hh4;tII!nxCu+vqy}+Lh`%rl#+TGUwjRqo;llJ949xB4h>EoLgmj zbNC>l>e=aQ8)rp*dTn^_U8i!Ye~o@NnjcjWnqJN9E<5(Oc1FV8iu#Vgj-t`Q-7n|o z_gQmw#g@jWI^rv*EL*qy8a(M@%b^X!u6HKo-(Kjnk105JHfe5A_Q}t;i7x9>`-orY zQHSGSkF!_p`g;GWxb#m>tj~0gyRcnwZMhRPxaMaL9(!W-)})!u>k8hP`o8DTlnd6Z zc~u+qY0Qv5&8~B2+$&mcB^IOB+5!C=^Ut)^uTHv^K4H2A&+f5}L>zvXm~Eyf(_!kBDjbvFx{LTlOl^R+H}IfB3i0XWWZA XJZ{+UYfJJx>Ob6`mTlWQv7qu_*;C!s diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_5_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_5_e.png index 22cc7a59c9e0ffd851a6f4112aa6bf2fe7506e2a..43650b68730a2f1bc7d8f7760b5b13192fc0f00c 100644 GIT binary patch delta 111 zcmV-#0FeLJ4vYbiBxqAfL_t(|+GF_t|33pIm|++j@G1NLe`HL$0b%$5Kk+{a#vnG) z27qnEq5+pUPMgs+A&V0oh`2P-HWpyc24m!y2*Vy5IGqhM1UV*%3d9kZ7XT{O0+vKi RwQ~Rf002ovPDHLkV1ikfD`@}# literal 1879 zcmb_dO>f*p7^n_ymCU4r1|QKy9VzU^ZVE=JWt;{pzt~#uUttb>A9EkdrG?b?SdrDeibw} zvW?nB!bDi0o@nwyFN^^#N#_=OF=d-PlbgI1L}g|F){lxDcx7eXs-aq3;q72$FX5N= z>J7HH$sA8vd|N)(Bj6z98I^lsCrU}Ltn~d780XWPBKINLW?5Ov1Iin`LnRFxD#8R6iQ&k@OMz&K=aV(}!Y~$mm6dju#YEG(-EN_4 z6hzX}u;Vxy(luRI0imY5QAT@el%5%RaCyp-AkG32$+<_`6x&%@flLP!!g%a9N{3~F zf@wV(Yq)@NN`0Wm#<+Mp>GXqpOyeCM@+eCIi^tfwEi#d|#Y0?=e;*0}rLEP*F(&2` zhT{-vw!8y0h6S03P8+*1*VcF{wiCvecOcC(Ih&YN5>7LbG=%7kgjyY?ELSSIFt+^0 zdJuV{o4)yg4R>kA%ZiS4tRfv$YaoMICef|8V1Up7S`%L2?;eI?qoD)TCYEss3SHyT zj6N3ZG2)9Pq`)}{X^U%d)KcVeB}qkeL;`^!JENaPtwyR*n$d{ys#{iob|DBnV%iiV zVU0NwKOs zwr_$tFWGox|3MPK;-Z}=_LDEUyer5`kb+*j!$on4Zw*JCK<+mJp)7Ckvchs@xu*=L zg9#Nl8iRq`ZkvPCN60;ZrNYm;G~r7vsMb+BN_$xTDcyN=_NHN&deN~!HHWGOH!am^ zI-rDwxQ{FY6wpWP4`+|{1~!Rd6NE<{_=MRHi_6+HYH`>zHRUPz9H}2CsWD+i{jYqq ze7795n)cr=?EiaUX9YR?Q?Om#LMnFkqxL+>X`_Q1b9s~psX#~tcXZ$V6tU}y)FxQZr zMj%aN<0Xh=fq!U(OAjdl6J#d3-5($(A*-0rdq<3MCZK70GBZinBb|Lt1^`Lp9&<}H*UD0ZT9s-VU#Nf0#d z2A&5eQ_9pS=xdW8622Hv@$+6 zuQI^QugrH*m8F!KMrLNiSs?;A;24>NL!6(Nh>!&t@=JiV@)||pA&6XRL2{IUaIvER zwh93THfW4$N~_0VlUbuRVrE>Q0ppm~gkmOCt5aiI0y7diGaNn;5G_D^2&ZjUI2L%a zAU;_Z2^1|aFV~doG(y0OYRzUdis2}Zs{ukSRq!$yQuETZ5f3&-q5`ZavjPt*9!a+l zlr0EgI-CM0M%?mJxJ;m6XowV1tp-z48UoT(1SbXq{-NMBg))AIV|ZBtSZxF=`UF{! ze8K}6@h{PC`3&%x5NOEo&NF!X3QPGmCLS#@UBMHF(#pIR&n$whQM8X4n?MB>aYyWFV4rC)=sdX5sPLlSGA#U_e`P@I2dorGBQ`eLu4{DJa8QVbJx@B-vL3YKD#Z)m3p$o`4ayVHeu?V zNojNH>K5#~p=#tSH-EZ3_Sc=Wf79&n)kFm^PPbo=ef7G>M*WrK?uI*;`cG8ewe6q>2DbK} zPT7DgxZ6H2c*{Bc2$%QVc=(Sq)V_FY!r1QEy*=-2<1QwzDyBD$?J3FN65s#KwRrZ5 zmHD;vpy&-%X@$G%`_qp<+xH=~C%vn)W)=Ry`L;FcrNxtH$S3*OAE=`pTO zNo;vJafRyX#r$6C@Y~D_(!o)LUifznbr<|G2?AH@ReT zay7eQ*Ai-dM*OLrTL+HLShKmm$(dx2PcwF(8+Y^bpA*h6gYJm>&RO5r|G9nJn6I!; zu97Y9-7afcvS@wk-#={XckHejOuS~;zBYYHOy&Hz!nXZf#Z7+Wo@?lU8O7<}_bCe>$baQ9H0M;atI?V9BL|!7=MR@pEf-FCf#%?2(X^NyPvF?*rYzWqWr30000< KMNUMnLSTYebu1A8 literal 1882 zcmb_dPiW*+7|&K2+`1KI5lRs@q)1nGGkJMQW+smvOP#6Ch|><;fvuONFE4LqLMM6I zB<;);(Na*@+k&^U;EET$2;No{#e*L7;!RJ2rv)!7^dt!N%lu<2vuh~^lDxe9zVG|} zzVCbQ-L9{_F*my~D@oE^wNl=I_w(ufOa`8pj*cn3&WDw^V@Z1UVtSvG4)4xOQszUi zv6*bv-Xcu+S?UUhXM27KXi2)Z+zTn&=85d^mKPM2hhKfG$evqNZdf%`3roE1RrVr& zeQ&M7_O_YrD$B3R*LnmT_&lL<&+h~==@pfMUjpNFT2tf!B-t)1D``M^vsRZ&BI2@@ z&8bW`v7EQFdJfsxyeea)=QWhqbVEftK{;aB^5{|^TI4p#M)~zoEchxa?Ia0_rggjB zY}d$&sHN$)ZEFZ?7^{F#<9?9Po*Kl9V-IB>v&ah*PXu!6kvd{0DJsBpD8UaWZi9G~ zCP#fxTlv zD)Q81R4+J=?$ELQdgQ_4qMbAQNtayO6{OHO~v#C-B zMYMB{t#V}MO^T6&9cQfmBzqk9_sx-u=t?>_ely(xWhegVxK a%}Cuhqu={W_h-`6ue!Qc{`|GAgMR>5`%CZu diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_7.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_7.png index 71d90cdb685b6693f6d474b8aa500e8765336a3d..437974a93865d3345505c5bb89414d6d6c3ed6f4 100644 GIT binary patch delta 400 zcmV;B0dM}55UB%@BYy#KNkl$hC+732ghr#2&W{8WsC z%fkf_R2D@dUN6j#@An$%)6A?9gtt5Wv;2p*2VP4Ku~XOtaDNb99d*5xu$iqnb1@1b zcsb6z7v0a@D)=e+zvm4iyth#vEbAVck$}=%##xwXhw-+FB14Xbn#Pg@tu6b>a+TMe zsey6MT?1pytPx=8p=bw7>u6+&2)|F}0NKym`y`NQnr04f7i(-`j7|{94B3x%p5k;! z!bqTzF=GTKJAZBDwB-#H6v>P}UjZ%cS`#z~~ee^*_mSiz1LX!Rnugh?vQ!>pkbnnExlsHPL*kg271{s4MXLB&00{s|MNUMnLSTYF=DJG& literal 2069 zcmbVNeN5D57(Y=&5&Vc#K-AT$6QjL;To1V7iO8LT^MD}{*|K4;eebBpU5~bK2Y(ot zb3*+7h}-aMpu*S`w@k#(Nx~F$ZY+}kF)=WWZp0~mz%((sy*=Qf3r=H`wr|_t^E|)j z`91H`vb2=Np}~`aH5yH5a*`<>-p8uvhyZxqvNb0f-bT8UvSf{B)OhtAqAA}UuF(WG z3K=Vu6_%w8Cpxt(FIs`t>vTi3Ml&zo>t;CzP!KDy3oawted;WV2)q%^)LRIPI}zjv zNktM^R+N*)KqkH*hO=6M0Qil;FLqsz=1JZw>Fq*{Mm~_*k{#fwI zh~_AYo5699$D{S=w4!9kNrSUTAi5CMBWo4& z6(b6n_NCx-``x)KhB*m<@$p291e1U6Sx!^Vo5*Nog*ru zoFl%(wg2-A0bpq@7JrOExj3Ev5VB$}fNAs>WKgu6QRoJEI*`SDi38>WNOQWHjhji7 z0IP^nhA8F^2$eQK8A(i3g^5L?G6feedgR&9*#Hx(03%8f6p0ZOR4s$hF?yPz^mE{X zAo`#dkr!-*FG5KwgQTIrjP6A!>>8d`*jIvijuBJ$HHP^l3lXGx;T(*GNLeTtsw9WMbHL4FmPBjO>!7*qYYTBm5jl3dO~O5bexXX z(*yP_^>l zYF98xf(-R4?B5j2KwkeUS3rD?z_6U!;6{{Fl?9MN-)mve3cOARefFLl0Ge*bmZyZ^*vCxLgkFvI96Xaa7F*SEoy#H28m2 z^L=}65)HuNcvF}Dxe6crlNq?6YYEQXP3@cSYBWP0Cz}#7qPAMnlhaQNxmo~LbZf7B&5UHwD}?v1*&BYA39ZJz5+3tD;W^LM&6 z1>wD^R);+(oxGnvGBCuT1fCpUJ~S{q_|N#TJ->a}!q`){96HuhGjw0j&Bo!)^zQvx zla8#q>fNIQE5=kFGz_w0yzech2x#Gj?r> zng4s8=H|B@HzKl^p1vP2MQWIkHllj81hEdDbE=fJQy_h{*e_=P* zdA#&t`@^;|#4p7g%%iQdSI1o~smr>z`fW=H~bUIW#-uI%G1W%r{;;dy3fm%{5NYl?ld+CUnqJb7q3Vd}MPk_U@KPXJ>@~)R1l4nvOM$RY0i8Mwrr`8Ya^t4^^J9*pE_QgmUJQx}uXh3NRg{5Jb7# zFd51Of@wV(X{exQDfNLK%W+XBZuf(GOyg}H@GwmPi*jt#5~)a9;sLJn-+Kapw6$6u zV=R{-$U`LQ{5qsD6l5$qsc%GFTj7c5#Ej3c1I_6yn}}3mPE!%rg=miowLGFMS1MUy z%JSLEe&~sAa_&AGUZp8_6s%*U>KLk4*9~Hs1Y6I-K-UM*n(+L_#$G5g>KLG9ViakHWfKnl2k-n#1I(R8GRPD8d(gJl!lBiRviV>F8IDj z8W!g|LZ(XH5>}aIx~h$kt72@@61I_t86VkK1?yzR9oc(ek9Cf4k(O1Lc~mW%COlXf zt6rnwnuvjLt~auODfVG;(e{D;WJ@mV3bNoQP_K>QqPWDb4o7WY?l%IVENgH_VOeE4 zFc?hxV-(n51_S$Ui-XhuDE9!Ch(_9_F`sRMTKnlJ?Lqt#y8bZsrfqSXsYOs*H5;a_ zmR(d*4NEs{W-!CF%u)7x*&|#>CTuap$eZErUB7yI>JR(Z+pleXdvWXRsqL-F8*{$=LHFjN>1&6-JahfXg}+}t^2^RAZy|Z- zX6aq@jdtSJ-HAhY&wcpy(_cxw)r%9K{dnw2>BRB3w{KJV#`ll^`GsUX;@o?qc+bD} j(e8J1*FJrQuS`hm#aDisocirbb_y=eFI7LDyYl)!&7f3I diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_8.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_8.png index d787990c66ee0ef60c3a1214d16d94f7fbdebf3b..85e2fe339ea8a3043d1d0e4d5d3b9a8bf811d5cb 100644 GIT binary patch delta 392 zcmV;30eAk75TOH*BYy#CNkl5gwaAm63R)mlrEN56SVG`-jC18;N{FY=R5DYPHfb1qxkT1!ha9w*VkgWu8$Xi zUs;x7^+sVK>K`^!=b1S}2yXXB7x}Sw2wqAKvR~K%=pbmF41c`!pq;Hb^M>$znt3a_ z?*~=zRjPkqHj(JV?Q&=~JUE6xXOt!xZ$Z2pBz_T9;$1k@G%bnH*-bwt-N8(aXQZHL z6mo@)wX>5M?u%)EWebj4LZbJUa)9Wky(0ohZ3yfktVm1IW~?6X!Y5!tpaM2t+Xivb zmNdg30u|X34}XG9ER&X4!(O=_pgCJU`PhM4Q`6t;PTV002ovPDHLkU;%=-{I(?k literal 2063 zcmbVN32f756n5BPh0<|Ulh$<<&s?p*@sTu%P1CL;o44PNNm@3o1W=IK)bK6d{3t2?i1y6a+#H1RHFqpmK<6Te-CDcbi5q6^5{6`?vkQ z_rCYO_dnOoES{D!&a8em>jD%!>hM=6hh|I7{cnvP&%LUPn+}?Wtfd$Tv%*poP9@)VM zgo2pDm&A&FY-|ZjaY$Y+oD-pegAlJVa3mBIRXSovdi>I0t-r<)xCf#wu_O6;dNic~MRt&ddgbBq78n@6U3XUHLh^BCU+UuMej|HCW zNI=tM8pFcjurX{hN=i9KP!xsXBu0`bK%i<=)R+h=s$=>*IC+&-1X&X#5!O92Wm2VP zM*!2_6hd;st*FM!1PX>l7#SmsxSmoEkYf`#xl#%C1m{?c5Aq>i)Kq{a5?DDPX_6X{ zp5Qw1`LO_?v>s0)M!#G_p+pE(b5(&f;sxm!t@@%ek9m1js#I9sRRw5{(X)|hhr%|_A?X#Y%V7F+e zr*{QiAgDmEXna$Y@D=e@P=I?Hfo52}!R-jEE6a08{I$?e1)eQ~Ubo=@51c+l?p~NG z`L!^k@cHGSTF=r^*pv9HOx4rbKbwC2vG1n?pObyOxNLwC%Xu&}F+|S?)2B-qM`B*fLHz2g>BCxnJN@C6JKgOw*1M7A`R~1XvMs|l!}#|PU5nf9yBtT3AD>pTZbkL! zKN>48Wu%{>uHsW-3(p+gFg%NWxZtFH-uaHNJ+s=!j`6h?{d{)Q8u!Muv|?9Ha_iAd z*NVH}oigTnYu-swWoY++O&u?$Z`()Jv;=nq&!%r_#{$jn@=j*HFM0i?KOxsQ2U9)! zuV3_THT{$8vb35CKfCDbN?n~izi|1Y`=JAQIk9E8e{ATE1=ePE53F6+)P7@9>MxRk z_{s2n5&mnf;o;Id;wMET8uQ;;J-PMB_?~CgiWp&H39E z+C>$;G-0u|`B=uaA}+eK)0@4)24kEdv#gYu*(kzE*qPY_ksS)cDst5EmIb~`!BQ6&awai diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_8_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_8_e.png index 082456bf76d9b347245ff8bd741a1caa70b23f7e..8925d70b80019316dc3590bb25ebd625a0eb6168 100644 GIT binary patch delta 103 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 DskF_` diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_9_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_9_e.png index e588809ab0f6c79eda2f9d68b30b005d829bd8a8..46ed75381ea9b7aff53eea20e115da3ee0bcdcec 100644 GIT binary patch delta 117 zcmV-*0E++U4w32BxX0FuM=L!k;`%awLRY4BSqvok^78xs z{=WCVYfFpgkB?7}OOkYaVZOF3-jmsVMvl*gCcRc!;0M?5@<;}Gt-R-U1ce7Skn(H@^4>#BLm;9$d^lXSdXf#<O4A6dYNyjF zcJv~Tn<}zxTZNjcX^KE7$!3_6t`a6EhZbrqp|KyOJ`X`=kvM!kt;izMehNX9n+=me znMA?VE{RlBgjq^Gpi6UHv>vy6&RwdqHVasoCIX9cY}Dc@Pg?u|rt{x>9Ej4^>$#7S zu>?WxB1z{qL>hyFj6^4m&4{VXEaB@hWpf)M%#&F*5w6CJq&#kL-X0RQGz=M3s~It6 z@YH2Lba^Lv`aT_2BPpxM8q|;iHNjc~>bPWJt#n!l5cZ*U?)u*5UMSKVnt+xu()K__ z*SI7l{|R;}_IMl+k+UC=CR3xZDTBO{xXRl+7LG-9dM}E49WR7QN(qJK2`Yx&qJpiQsEAy+s|vv&xR*cnm47 zW!MTqLNYXq5^9@eXqAWA?~NX54P*%Zv1SfC@PN?|ic4E0Y%+0Xs`A0}*2K`$-TW*g-n z>0i6MGh?S-T`NrAwSWEYl{bGrcI@lZj}`8`JSn}6-g;#F#@X-JPE7uNd-ujipA|l~ zt|R&0A3NKHcea23^7gH%C&qrdQrnq0dt!F+jYH{^Q%t(~!_~1%?-J>Yb1UGN_~_c_ rccPun4X>UT zom`3O1o4RhEO(@XNhk0fGQku{lxK+CmuYav1xP|o_k@}@yi?)) zj=9oFhc>|55V7fI$|go&hye_V6ub!wunE#8(PH)~JsLpY0op%96B=3pflPXQ7HF$BXRYyJPfm$YZv z>O@4??hG%MFTb#DeBJP^2AFN3XaUWN+jKXJF;yU!j8c#R^^|}o50I60HH08Gf(QXb zc(^m^95)sZ0USVGI}OWXlIO4}tfEsB=~w g>M$G^^l?)74`0~@+KOut)&Kwi07*qoM6N<$g87+E%m4rY diff --git a/src/main/resources/assets/betterend/textures/block/glowing_pillar_seed_0_e.png b/src/main/resources/assets/betterend/textures/block/glowing_pillar_seed_0_e.png index c51528ff1a650045d22e6abc271e74c96ea59798..b1495472670b102efd0266f125745b3df85aedb9 100644 GIT binary patch delta 111 zcmV-#0FeK)3ycAfBxqAfL_t(|+GF_t|33pIm|@g_Q3Ggiz<&S#|Mz(RC(nQ_uK)k_ z+x-8t#OeS4^$!0@HsD{4;s3YUYX5)ass8^zNAEvbUie!C)ZC>EGGq|P0syq<`6kaS R1LObz002ovPDHLkV1lU4JJ$dJ literal 1459 zcmbVMO>fjj7&Z!2lm-c@7m`axhKg3yJ7aH>U5{d-bT^PyaR|vuNl)$Ucy`xh?Q!f0 zyNN0YNE~|L5}`^U{zB;w;80W*35lwws^UOZ5LYCqQY0h-X1pI(8l~mKlI^kQndg0< z_v^cv=@a|+4enDEWq)a^I4j==l6&t5@;S5-6Z!funEEPGl#f16?p?~Y>jxEO_l8?u z5DWH6Ou3gK4zI9G%L^o0QO3qw0ilabfC{U*zNJ37`I8D<$5Q7X>C4t8T0WGiLN4RCFZC)(b$#1BFHbg91>O^7?EZ8%kz(WQ`GNT&R zhYgT3Gx{hpjp5IMf%F_iIjCnfq+>LSvnJ?Xs@!!8I(wB109;;g5|K$HttZ!8q8z9h$L1|u|b^+9@Y7OP^a7fG9W{1+o_Emeet~1 zL?kB9N*UdN?1+xaD*=PEEaJ-{Ws_&6n}-rL0WO4$2p*O>Z}bv1({mXV3Q1z};L~~6 zcX%`UY|9x|B!XG0fec+khNfrBhJlR{Y@nkkixKKTZSJ_$l^vm@+o7^*93sdY!4Ab$ z9(qJ-c0E#KFz{DrIL}*TGD$B8G;kW{y;= zT7?WFEzj~qb8==SM=Qw8c2&spMNXHKeo!R0temgyXlAL%4xz8qhnoKv$8&K!|5u39Qil=FA#W*m?AeX_Rn z``YQgI=^*cE$%-bBb4Xl@Skfx_;LK#tKXiUx^nr#)fYp3ggEQfGw{7|MlDa z|FgvD|Nr$4|4BCBUyb4ax7lj{f8?qD|363XKUrS*TLjeHr3^A;G#%i<0I*m2CeOXt Q(*OVf07*qoM6N<$g7E!4(f|Me literal 1458 zcmbVM%Wu?195xE7S_l$SFTf?10jUV=8Qa;1N0=zx4NXKHqGY9nQ<)vl?z&lfj6Gp@ zqqYR39(w2{>V=96e*pBxg+rsNNJyZZ5aLjTa*xzjv=UN6-0?mvsM7MVG@jQt-|zkV zZf5$k1N)BblO*ZD)MR;9%m>r);RoVB@;t#}`Y4>d5KGejkJGV7`timgN!t6|t1R#Z z=W|4uuVI%}sn+&GftIAxW9<-=MatzWt$Ts3{C@XmMfO}eco{|ly7XT~(-Bh8DU>=#4-2W6IEplsUwtTiPOYCf=!Fh-PXti2e%hXs@ z2fAfh02;tBRDn?APQY@vQYDAYE6hr5yhNE6~>x_K+OzPmP@5HFh%*3c`tBT zD?ahc8(PMk+KK@UU4@3Kn-#-AMh+S9Bs39(J*dN6uh!WWnn!y6HK@oM7jyhZuuD*l zMLrfbdp@pH5C(Nc&OC`qtjQuFSZHTXJLRCRMTm?O|MU5gCfml;_~gFATdzT^Azktd1^H{Y8lEx9x+(4-fOcy;kQwX=JIZ^pCyw_CSxe)u4j(f5P2^#jM6#IHKcq;jOpHC?NC) zX*Kpt0spqLd-qD^4&b64q|2-iiA~nYXdv2GB>L3NR_BiBaU$&FmEr@kog`yJ$5$>r zTG?Q0S67nZD+z=}hL1g6xfLYIvz_%n&j0ZJ)$3a$L#4HE&aMu>_+s&|jo%AeK{uOH-glV|NG)S}Hn# zK?#nES8!>}BHX+~&@o#4KTYj@G*!d9{@{g20qT>fUj}j)b|xepB;#)`kX9`fwZ~hXGVmC_H4P0Wmb8foyC5^_W|bb&9 z=ch}?{H&pv?8I&`-h!0C#sLB?yYBd~rLtXKNY~-9z=AF$m{r-yP#~Dm3m{884955r zXGo(mNGrUQ5*2xL1jwS47R0n5B{@-oVhSb|(EnH}%`+>osJ+yeMRzJ&3j!AkLbKWA zn@OH{RY6h|MG$2{mN|;x{5dB;Eza?W2Mika4bO4|i#Q-;L}k(lRF-PmGr@KvTF39Z zi8@SZAy<%iF*Kr)7HoSUQxM>Kuj&1A&KE+BA)~%6%_%-r3)Y0`r0;p?sJ(97e zF18(s@Pph@YDV87Yoh(qoQs7b_DRDtaPBBob2zldg;@`yfOsWB>VrTP1}cMWHVjM# zY(Ho@CTaRR9(aQ_6kwH=MOorRnUj(wS%&f$l*L_Q5{hCEsuRr`0~c@kzxop@9*)h^l9Lf2v5@dM--IIpQJHJi6A6B?;e zDT&e*PRf`WPBKTwI3y`Dmnml?MNEn5a;7|ZuMwjW26yn@{Gab%_AFXlsQ$=2VabJA z0jDgV#%r!$6#Ma!{;F<)ZX!TrgbA*)Mi^Oavi)Q0kv-6(ZPqX){fBV(U_Pk?P2}Op zD)rWX$tZ#9FND?DGe!8TmEF4sDt7>8~Mqbt0>z=!C@!Knj*mwM!i|;Mk`&R7EjrBX@ zJBqE}+h1Kja{A+UPv-Imo;dSbQi-%huz&x8;u|E)IY8W$o0$PkV01IPvt=3%~twY~=Qz*FJpVo8`-$jc*^? rD_<&{U2T7_uiVKGZRq@b;_`+cI*dHN(0S{fusP>*)7t8u!wdHT?Vj)W diff --git a/src/main/resources/assets/betterend/textures/block/glowing_pillar_seed_3_e.png b/src/main/resources/assets/betterend/textures/block/glowing_pillar_seed_3_e.png index b334f87907bb18764ce6fe3e459896fe3ed05eed..a3943870b9db5f61df0d4ad5a1db9722391b0367 100644 GIT binary patch delta 265 zcmV+k0rvja45R{(B!BBkL_t(|+U?T6i@|Xm$MMe}B1F_J%CGNqN?j(!$!M`&q_`N+ zEpBp!vZ&*xGf@`fxg(qZz;Jbc#tlC2r{TLv`4pK9@8vx_dcA)rK%G-Zo4V$K4-4MB z(7%J08|g=2lQRHbTrjfW`w@Q2FpJyu9z}X#P69HBz%m2dB7bahHZqOD-o}q;3G{vJ-g?A1f#9G_|fwb*pAnpBN2PHO~Vc8+$KT_MgmCUg+!x?R~poy2~i||Pzz}=Mr=e;LMwhS(KmYqOud+7X5R7p zAHV;#Bi3_&L;Y>_1VJ=J!l7RLci3;;Jp5gJ=?{Q^H|XJYCP6G{vfmnFd|xv`)Lv5J zeO6!eK~X}g6UZn5ojFyDIqkm-dc8Z;!>HH6)4vDxTi(15@~MjW9`B~h`8 z%VaQUCq^KbtW`7_WzD5m$iNV=V1VLTo}*cw=3H@}7kQ7!v&&eQ$g(A96v;|5KPS{H zy1A>MxN2lzfqw3NU9y1u4krT8bj8kraa{gA8mKd*>>85siuw&9s0f!AK}T zVcJebkwpo5k`kBTXdugg<~g@O3vM@0%l?EQKp-T5ORmU=kThr~w<0h9Px)1bf}0Cu zu33-Wa&}dSVa3Gx%9opB4Sb@!$|z*95JVu^1s<-;9D$O2HVv`Te@J%; zW}>8(1qSR$;b{Griej+;jNOeTD$HM57Voa;+zK3z1AAGWLwHl2WKhH7%fNF=7&_-6 zh?@FHs3R_%_^Hs*eO--XWa8@sZw7aMKEA&@xg}rU`tss0Uf3|d@eXlldh+D--80Lm zd#I-izua`^H=TX2kG}KT*4>XEti9LE?)IUnwnb85&*9|6_1|tS>>F(abuapJJ7SX` zzxCy=PsdjEcMC%Q!ja`So3SMy%zoF5va5Z^fB62_XD)1f|49G52lAiHceH;ve9Ov~ z@P<9UF@3M&Xiw_Bv!4YoH;iA7y?U&$ebK{B^3l~#J+$CJorikm*^$$?H{W<))3)a4 z9|b$xXC}WoH8Oi1zWsV&wX^}@TS)7OV2-cwy}1q=J@!Nn@%$qQugSNboGRebgtj>CxntCGynhq diff --git a/src/main/resources/assets/betterend/textures/block/gold_chandelier_floor_e.png b/src/main/resources/assets/betterend/textures/block/gold_chandelier_floor_e.png index 2a48e04dfb0eb45d9344e77f77ffe975a4af86d9..e747def3cd6752ca5fa80bbcf25d0d5d1c5ccb0f 100644 GIT binary patch delta 102 zcmV-s0Ga=;3xffWBwtENL_t(|+GF_t|33q%c=g-k|6y#hG@t)+??22Ck~Kg0^BRsp zeEJ$N>&X_d^Ff+HG>A{C0boNwHiKvopX5M9$D;;}8bB2T00(vk*!q$8NdN!<07*qo IM6N<$g3698!~g&Q literal 1454 zcmbVMOK8+U7>*B$wiIdwkzN`i_&~FnWVhShp|P&J)h?K}v|CzlPBXK+p_@!hrfymU zMZJg~L~m74uon@ecvUE#Ja`mD^rCog4tr9HN_{mXnb$Yp|NgIzjhyUk?`anV zp))_68|PzJ`0Z%p|K5)^#D|^k@M&KVI(CQO7Gd$uUP0LY(JD-{Y2y?$sU1U@&X8DO zyBsYD1A~E!%vr+38B($wU0QpxB8e8(rKvsx7;cu7t>FcaOe~BP%!OGqjite(;y?g7 zflU|^1H0n*FwmtsFXZ!ZTam;%gw5(wCKM=68)IUYdPMAtC1q1hXkvdlrY1pJOB@k3 zp!O@EUs2;SP$5Xdcv@^e5|`%TA{@`1Xv*R%T`Du?LPe=otFdZ4M!k}vrqgK!Xo{xE z93lJj4nu+L`1@K6IpUk1*guI%Gq% zUzm4^GERIt=b2>a99MH+XpIZA9zl$H1xhQeK#jFj7PHwfFe&lil;vPr^$)GPLvn}_ zUDAN2%0QFVctO)3fBV2;5QhLXpa#WOaehN+0;)eldDdXW&|ksWghlGvh}&%0s6-Uk zDM@1FNtmS->T$tbyLep-!+?3mXUH*0KBr6E?3iU?m;fdKX^i9 zNN_O)G=x)X>wb=!b762>_wj$;AN4F=T&S{Xp0MP?tboIo&*L@UEQ$$owmGX+UYxerVD7GWqW7%igsct6SNzn_JdaR!C6$5Wmv7lsUhrTgC(5-oLq! q89~d%uDeU%-s_J0ZP$A)b_l|1ZSwZ5#nH!MN6in7(*ZgL Y0MwH6&U~yRSO5S307*qoM6N<$g6HWl{{R30 literal 1474 zcmbVMO=uKX93QDoZQ6)MA?hWsqX&!5cXqS;aEx&$b{Cu&<3b_|`sU5s-C=j;O=sS^ zyMbPMC=`0^p@`ls6c4303%LX@LLsyVy^05WY9)mpT8;1R$Dk6mI?T*_Z|3*^{lEX; zEG~RLF@A7dlB9`B*;(T29`WoNEyR}(-!~X=Vnk{VJq$# zh-s)IpL#^?hA~G=((&1DjBt}M;E{R|+47&a*JKd*w!EBkbvG`NMo?Z&$obWUDqd~k zqA$;$0LQzK6NH2z&<$Hr3cI%4=Y@PPK5H`QLs-+6=Y&GA;x2*`O$f-Tc?BEOCYULz zMqV$P)5n0R8#9_dqZyW>8&Jw28Eupf!^8uoby2Jt zsxDmW1AUy~;&#&NEBCQRS|lV9OF7oauyKPjnl|VwsI%WMDBz)W-Au=}wuE7(B4zVe zxf{cPY>Q5-y_jfAB&F>HlliOM%tOMP7?u)(7)`2_wnm9s9GMJCC6Sl{IIKJBER zJtspP#E31Mx@jo7sTfw(G$Frp`cd72x;}uq)DLRCZJ`!4trwuYYJ9}d8^Jz?HJXHo z`y7O*PP90x%OHy+EYTKCxMFUd)wjZRVI@i#iZH1-w#?mDgTROR95!;(9#(Q*zNQ#x zx}bQN7f%6O9`a^P>|6PfyhCwYBzGk5zoq=yB;d`3TJOvwT2532EC(siS8v!9=gAkt zT`K_nLVyU10=H!>GE01U_&Ipz2n=XD4Z=xZlkNd5r8U+;37M<&X#Jmx(zyMa=*EF7 z+RI+{|2@~aBRC%iVw=q&e#j;niTL?=HXp>+F-qyZ=y6esK7}Ur+zN`1L=tCrbBD z9$c?~x^e2xZ&SCPOg`K<))WG5^T@+xCte<-?ULXHqquid9B=$S} USy|ltMNHYs{DO1q)RnKE0c_gUR{#J2 diff --git a/src/main/resources/assets/betterend/textures/block/helix_tree_log_side.png b/src/main/resources/assets/betterend/textures/block/helix_tree_log_side.png index 32df32a1cc00bd78c9d389a0e6fb8ddb09589192..9324519214ed1948fe25581f527455ccc9de05eb 100644 GIT binary patch delta 28 icmey%_?K})86)Gw@-l&(X?+tIfWXt$&t;ucLK6U%DG8+j delta 28 icmey%_?K})8RM;q9t&D4NYA+wFD-V_A1wch%Hd7g|xUvy<7~xSLFxOx7Y~YFM6cew2;yJh!Gj1wo!LiFsn0-?N#>jH`@OGBPaPN<*fyXj z%22V8pAqlP^4_psJhy*Z!Q#~)6plxVvT=*N*C==HZdH_ZpWMBM3(C$5uZ3C+~@{mRdiHZ z3aCCqBeob4I&nsrIV`;iP%fmHv#`WiqnD`Zp2;AWlZhDvJ7-hrVgzGwpP->J(+0@E}jA>?S1ZtTIakPKN7m4xp3pZd1TAUsz3!d68T!{HpMZz&|NiL&@Kdo zi7aqSB{H+rQM-RO&ro}RYdD=DoPjj>#`d=uIN8|+1~rE zb9-8(N z;Kx(Xm23T155b2E1Mu0|;Np%)4jO*EJjwg!FM;~nN7+mF>aSd7urc>;!>z%~_g}v$ k++6eW+|jgh4WIUI5Cxfuz&u-H};drVE_OC diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_e.png b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_e.png index 736bebad5a88b2eccd833bcd405acb27557447d9..96544df99dc72f24a5e08e31b8368d82fff4def6 100644 GIT binary patch delta 115 zcmV-(0F3|33y=YjBy3knL_t(|+GF_t|33pIm|@g_Q3HrI02$2d&iD_)AU4ScfHXdO zboKw$tGmI5kYxZ!^RWYq|2L(%kY)hPMi33sOp+Hsnn1R~41pO+k_%u?Cffj9VgU4v V%fM<|V6*@L002ovPDHLkV1mN?F{A(h literal 1483 zcmbVM-)kI29N(Cxq-g>HA8HGdVS^CSy`9~?+~tODW4w*tp_``3K~JIL-0a-llG~ki zcdmEIL;dk*!lO7Nkm=#%{i6bh-96iN%emb?}rf?!`tDNSeZ$I?o)wF|TJ>ocG4 z@9+BJ!mDE=M@A$`8Y>p8B{7f3V|c&#Pu$wYVmc5M-iRdW;M4IKkT$+~Mw0g3a!X}i zwqHktc`59$3Qe`WK%gb*=xjT{WQB52p*7bx<-dNuCu_}WOgs+(LTr3cj?M0AhAqCT^j6$@u z4zjtFmVr4v{UXqzmQ`U^)eHq{2xgFx1HDfc(n6<-maJELvc%4m>zoHjRa>oAs%4~D zSW~rJE~i3W)pbQ6lxWrGxUKlnWS_yJ5eeOZyUYhMBd)L}H)Ww|*90#}X#J??CgCu( zjRRFn!Puk@&>;yfXoiiBaEGY0K|Sj8NMN-D8`K$RQJwt@b#ncX0O4BOPGsz3MpnOO%XJLu4Mn6!CeU(8z9|vXzOr3On zhqa>TA9zD8%&95sP}dZwE1FT#b!0#hxEG*-AnZbI=D5|>J)s)XABKvoaWKb^1Um#( zS?FP5v+Lm+RRg~!gT#|4&l)Tgf`xWQM+@6VML*)$C$wmpvM@X4x(=El>1>7=M4?8G zDh^C%6kJJX6)l@JG8(B&R~)VX-eRN~2e<#;`JeBPhps3t+<0Q1xa8ujKm|7v@mlQ_ z#WH=Tw`#bclL!ctIKfSs#F3?r+&gxk*aKbKR-Fpc{|I*%7O^UC;gHVNgts0iqg0{4 z8dqc26!o80cJ3ai+&)~igLs+rA+bq18TCc`3Pqp#?d+S!MUOjEwB|}PpOCw|yR(DO zy|*rJf46`1&|vw)6Tfb44cD&kT$6tM<@?_ce|+95oEzBMIJFraKKAaJ%kZ=J2b}TA zD{o2ez1w$&E`4#M1)c)6@lAMRt}(uS?&jYUKYTSc_|nFw&zA2_REMuFemf=&oc-yK l3fTDk>pw?78sbf;NhcQ0f2qATvJ$n5Wa2?xtq36GL2@ltS_4&D-4}JM$(p zFWKE3N@#n~n~0ZcL=UAGp@$w?N)Ht+G$L&;QlYm(DfDDP5QRYcW>0C_8;=a6NL9tQ@}^AP2sZfZ!!D2Gi8^d41Oi`*)nDZSORC3m)37b3(EHk-{% z)6DRw26fA_ATpp~XcD2t?Ld&07Q`cc4J8)S$P0zX1CVGW^L$Czs`Ru=!4FflLEHa*Y5b7C}Q0f3(n&QHxsL?U*Qpg(2XMu<%R!^~EoeLh<`QNBcueTYHp>>?p#*V)D zerh5X6U&lDFCaUj<4QYZaE8TvDWYs*S-LrrunBQ7Vnpz$!g-^gsOi4Tpjb>2Qvk2e zdV$NE@zE_ZtV9H}RRbBih73(ND~5qhBolWGnHZri)ZwmIZSM#*FdE$kl~v;sLH-r& zQe5ScPb6p0Cp8Acpr(Q}lDNnlJd%c`cV@>6$HC1a-~EWMx=as@L-t0vP;w=ZAfbSX)0U*7$n@@FGYHWz8Uu%4vllB&RyUM%y~ z?lr|Zw%A)WJkTiwOlVTzwn~%CGRdHO?7eUVy7J9BlS=;~-CbDBtD;FFHeQp_`Y#m) zrT;ML#x523Jj>4Amd@?N+2Wp+<16>;GIhqyz3Tg4JzL9zMt6Bjc14N-t!j@A2{=wdAYIr^(?yk z{X;nPm$9{li2aqZBl;l0+in*$%OIadyy`tj9I jKl$>H)wz$3<`m_-Kij_^dH+r&8MWn!snX|fp8xPK3_;iO diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_sapling_2_e.png b/src/main/resources/assets/betterend/textures/block/hydralux_sapling_2_e.png index 456326a5baed1357516c361afc337d0ad6e71ac6..e9258f7c1dde2a64d87a65e5b1aa22a7ba33c3c4 100644 GIT binary patch delta 144 zcmV;B0B`^E3#BL_t(|+GF_t|33pIm|++ifDD?_T>ir_h)hAx?4lD*6Lb3rM%`gKJ?6inC07Qcf0BKymr~!pH_U<0oEeOKi(wI5P=Y8?mwUhq`H@6U<9uCG{j0EA4zIgNq7Z>{l;h{~pJjJH0 zlhCG~j4-Vbx#cYlk58gaMxN^B4b-!JTDOu zvC(tfjE+OLMMvfNfGCqBqI025M$d6Ihhl32SPThbG%QnE?*?k3t1>7SlV@BX z(?)dUo;Soqj2NP>>YAkLl9np#I!viNa7Wb?RMj@rqS$rjw}omjle-Vfvj!uE{uPXE z=+MwZ+-BE9RiXrbRRoDAVUgBp$OUulQY|ek3zqzdA>Sq?(-67Yvg=~#I2Fxt?2P1O z^GHhT>710;GMc25w2dn`lSLWQeQ#2GE)H(@J^r8XPlYZoE>wSDp19=Vtbk)~#N##J zDT>o%wzI0cpp^&^*>Qp!q8&$;V6k)TKClPcw2d0!r2i1^HY}nJYoL&fRJphQOGYVN ze~-YrMyOS~5q<`Rn%Gt*znS zL$A*E53H=M?W*QJSzbAG+xd0%?7{Kg6Bql=9@by}h z_x$Gd)%trqSAO~a;KtyW&oB0Xr44p-OMc<^J<8yZJKmv-SKiL|o|t~+)ZwY$zS$@S zOFQ1Uy#K&X@U^_YJbmrsTc2NeYzf1m(vqOB+&bD%SN8w>`V(K=+4t?qA6_#rt$tU0 dbl?Lv+ap9r-dvx)0rj{omqy3U%g;=o{}aHp@XG)I diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_sapling_3_e.png b/src/main/resources/assets/betterend/textures/block/hydralux_sapling_3_e.png index 072cca9e703b9a67aa0d028082b16e2c4e94d61a..fd52c709effb41a89b2ff5a589ef2285c491cafa 100644 GIT binary patch delta 144 zcmV;B0B`^L3#BL_t(|+GF_t|33pIm|^f6kYK0vAB0IV00x@UT>f9Zy8HjJ z1B?HI*dQ^Y4S;EW^yn&zAtV_9(gf4Ieo+Hy27my_?;wpZ%_MnYUU$ZS5JnC}q749P yg!vuBCOH~Gn(zf2(Ow{=c@QUMY@tmv0|4D)$~cK7i>&|v00{s|MNUMnLSTYV@;jmc literal 1530 zcmbVMU1%Id9N*d!Y-^w(mexSKZV(i+x3jysyY95>5pPp-#ZAKHY)>ngx!t+jHMcvP z-AV2eL`y4TQ83kqf>gvJ=!@333PxH=`V=dOKIwz458{)a1_ePmXYXTaC4O~bcD{b| z`+xsWPftENxZ~a(9LEh7CX6DRcg5q*0rua&(MD|A9!xwDaooOzMXvUPkc348}a=X7B#7RZ;)X+BRv%%@Ws z(UM0MKC7kV4A7L(5ncguRsvZ`Rz)B~kb$bk_dbD13+*Z_8i#wb*iIK5N&_fKjYcEY zP*WtVNwTJC5>O;X5g9^^mVAnuq8|f)^yTe$;al zbC}dbfh4CuY*GhkTL~^$2@_OMSQhLsa+;1Eh8hx`q7a(#;c=33KCWNfO7 z=OrQ{I=;xv=s9FlbW~ajuvEkmSqLpWzR1)Zj;#q`KE#NUutZ3`AE@cR%6vW_2j&3( zz%kdiNh5mjrZ?C?6zhTl6j=m{D61t!fhu5udkClyfG*S|wp(4=6e`2Cd<&Fijg2V! zSFmltDhWNrY<4|V!&2ba1U~U3%#%6^nP8@!+R?%^VZo0m@-192bb*2S1uKp$wuRoYd)pr9(l#8-NdF<+U06h_w1GlAR%71! zFBv5<{iV1XyQWBgwX$<}Q|0#ItR2M5qz|!8(#f#T+E>W>)WvUi#ZB`4f-zP)ux|a{ zZs)e%e`3BhwBlSCJPO*^A3uD4aMpg|J?}{L+x~M;f7bfxmz^)_>${aNuYGmu?S1cV z0oPVni+8=1%bgl39*nZXpAURwTvb~yA32e}^ejDlbvL9wx0U%n<@YJ`bt@O^UOQWw!O1I-1CZh{iR>8 ny#95g^~}Dt!rtS~7oT$6_wdylBg^?u;_h4+pEN#rWcK8r85r?p diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_sapling_4_e.png b/src/main/resources/assets/betterend/textures/block/hydralux_sapling_4_e.png index d89004aa7a1b69c12790285952ede208de16c50b..4ca5bde7489c801dd2c13feebe17cb83cb5fe49e 100644 GIT binary patch delta 144 zcmV;B0B`^B3#BL_t(|+GF_t|33pIn1SX7B-m;F2Vt@dXi9VWfA#9_|Hlq2 z{tsf4WB^R_qeoZq8iLmVkS3Vs^@|!vGXUm)kVagZu^IqU2*V@?B1jVtd2>F}7NqO)a007em>j=MY()0iT00{s|MNUMnLSTaV**Z%A literal 1520 zcmbVMO=uid9G|p)w28GrK}tOIF+ow<`QBtRk4)EeCz=H(hGa4E*0*oo?he_RH_l8l zn#Yca9z1vvu|3$d!uV!ChE`%*JMiXx{oe2Y z{Xaf4{nEbvp?;3z_LZj0SvC)*W6vY(fAD&O*tFN5dM)I*fhW_^$8DZEz;O>h-h6j#q@be>mFy4fWz$Fm^O}F8NuxapZUdYzzvBZNmBw951iBuq1ux3D!1_X?VqXJfP zD#+`iGAiq8?l4egB`?W&NznvZf$}KSbkO~HCM~e5aMpaWD~s(6z8*zBl%zP0#aI(* zP?Hp0*Ckn%R8?RIAzbky)D*mMxW{0U5C@JQIn)CwBdXA)$l#f#9TQwXqxHhBo0!9- zCh{dklv9)1KpST`e<^6Rh1*yn4dN0n3K>?(uzsCJG_2GApw6!E5Wrk(S(%I-b#dKH zL>NsjGc&pl*%2LO)I8kFS@)S|XiUD*+;z+CPQD9aifMd+Sj z8^bCMT*Pd4TvQ{H@6~vac@h?Bg9c16(@tw^VOg-`g%R>FDVYY(%oZKThBi_vRf1JP zMLAv2bGeEzrr|MxRPac?YLDs!ReSGEikH&h_TJn7^ZhGr`@@f&(_-!8vlsk{@cf~lTHB9)pzVPE;-uUo`kI#G!&V0I_|8}FlwQZbC_Pa+~Ygd16ZC(83(m*cH Yam)4ZN>>JkcBMVJG&ya4e)QP-Khvi5UjP6A diff --git a/src/main/resources/assets/betterend/textures/block/iron_chandelier_floor_e.png b/src/main/resources/assets/betterend/textures/block/iron_chandelier_floor_e.png index 6bf84215ed916de6fe5acd65ba24444972f83d3a..e747def3cd6752ca5fa80bbcf25d0d5d1c5ccb0f 100644 GIT binary patch delta 102 zcmV-s0Ga=;3xffWBwtENL_t(|+GF_t|33q%c=g-k|6y#hG@t)+??22Ck~Kg0^BRsp zeEJ$N>&X_d^Ff+HG>A{C0boNwHiKvopX5M9$D;;}8bB2T00(vk*!q$8NdN!<07*qo IM6N<$g3698!~g&Q literal 1454 zcmbVMOK8+U7>*B$wiK#@NG}Z$)S}tEw%ulEtm|&I3#OL3rS;})W_CAplZnZ!n-)P) zFQNz0TNNtkMFbJA9*Sp=UPKRCdT$R!P*B&&K0+(?8IsKFo9}=BHz&qVcX#%7avay4 z8_Q0zu_yX=b+CWmdL6Q1w>Ne^;JB`R(YK9TcyNH@cCOp`89HO00Tyu*5Rn2-gpSA1 z95*}?deEB1lrP|t?Ha<`%O!!gks(YEn6l|*aM>Q4_wl*;@w_!ZYw1WBInEDe%7l`jOnyNfA8!)CTx*)Kj4gF>oLEFaM=vomS`OI~9pvXc zEKTBoRDBDNUSetbEnKTk-d9jJ-6%6ujh1!jmpGHttv)PnvEcW@R`YzV5X zDx$24ik4SZz}^A*sH_25ZbD6h?Bd*(&?L}Oo1iRf5Tx*rU}S+J@g2x)wjEf)lINBL zKK3NYkP7jcV5Xhc(84r9&J8GZEu7050y8^d+X!eFY6{Y@s22(;u`rk{in=Q6Vo@DJ zNt{GQR7ke(XNgsfg4@22{_*}<-)6-HEC0%_=tENCW__ zD8UWEiXw}V(Au{D+XGG7S{XCa--Npf3rLaHppVlf=B>ZUD2eGWMb+3eMf%yw#@U9- zZNphRh^BELVvD$wVVAWppY^E^tJBM@$H81SogaE_eXiF>c036`yD zzdwC`>$=^uxCeFiFPLAZK7M`Ew{~ZBJ3VoC+uG6+4(lu0jqbp)h*Atb9NRS(U?p53*w_85DX z-3^>LRH@WUB@R`^32q4GfVkz53qlAaq^Os2Lsbs+)J7aCwS{!N4=YpwS}Z@tGvELH z@BiDW$#eUA5BCa!u)i>2PV?`<_}SaT-vckUF#miQOney$!bcy+&o1G|8=ncn?iX%x zj?G!;kxe}rJ9L4_4KLtmK{!3!2(Z0K7+4@>*Ehu9R@X$}I)*qqWI-#)lZrdB6q1>x z$)dfqXy+Vp_zXDRK%BrM41v&rcK?}kb4RJJ92V%00 zOljaiQDqpr)B-wof(vS4wWZv#6;dT0@ma*NYJv?al+ma{-$0!lzovkP*0K^EJKExT ziHeAgU*>Lf0hli07-> zX^I(gsk5rOpj8M6+i`&#q8(?JIAUkpeeVdgY3mijN#Bz0HY}ngR>vV3E%Rvomx@xj z{Yu=8ZC8|kd)YeM*126c9|!R=nM3?1nPkN0<16HI>e3gVuJIXHE109j>|=W#?D~6a zYv8-tHRIL5gVF-%yVI=yvevtr{h?>Gzp%dV?$hgEfAD1Z<>rB3<&izd`+tA+*H_>C zF?=Tf^T^@*!c=P+) YvLLXB=-$=p(bkkLj8B>?WAoSk0qEDxPyhe` diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_barrel_bottom.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_barrel_bottom.png index 7e09714be35baecfbc795eda26ddc5b69189048b..8df3c4384b7f7537904767fbd0699785e5650f10 100644 GIT binary patch delta 420 zcmV;V0bBmT1i=K5Dgj=RD?V0abN1dj=giEx2Hgfa>-<_jKmHy6J;9q9G- z1d+c+e^ggqf8Old(5Ya*gu^Wza#}hpSZCc(2S(0{diXZ-Q8<1iA1D%bKZ)MgRWtzK zh(r&tAQsr-2KhR8BAlC4~KS zO-nf3wz}J>&Xb#{GrqUzHLql=8>eb0NM10SMC`Sa5kz?_}r{E}p^I1-&9#e(Q?9MHr@^IHG0X(;f6#|`5QR9FW>ARrHE#8@x4W_c_drim|QY6j+1{GL&-%hj`9m}YZg&oLOrKM^Kmt}h<)VS zjyH#(50iJa#cL==bf2OyCnxwj7veh*fH2L01(yf)PKHk5;u(xx&?}1|aZs^>bP0l+XkKcHam4 delta 29 jcmbQrI+b;T7UQjr+EGjb8$R!LU;qM7S3j3^P6K_K8RM;q<=p~PT@FYv0D-5gpUXO@geCxucnMGd delta 28 icmbQlG>K_K86)Gw@@@f+>q(axfWXt$&t;ucLK6Ug(+JuC diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_sapling_e.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_sapling_e.png index 91521f55b9fa99ae2ed5fd5fb78d77f5a2f12c4d..2da2775c22461fc6e9441048c10ca4bfe9d9468c 100644 GIT binary patch delta 345 zcmV-f0jB=H4f6t!BYy!pNkltmA{$imfQ;wd zyh3MC3K@OziKkWYyTjsBP+8WInOkJ;zMx-SFo3Cdn7HzY9or=b0{8;)84*BSQL5&{`00000NkvXXu0mjf!2zT^ literal 1727 zcmbVNX-pJX93RSJ0gEDR2q99YgSJ-PonzT+WEI>6fwD-~O@L22%)Etxox_=dU7#cc zYY8=>2W@J(dVa8xHniy#DGF_^Y5X86v^Jz4idtKWB`Hm;vDcerccTrxoaD`WZ{F|y z{`Y@+tE={;rRJm}2$EJ_=JCNfT_4G7;5%>m4+c&ta#@{{@xN%g=S7G#J#auJk^)ex z*=AzN0t&S|&7_TRQU%*liXiPcVaG{}i6CjhMq8X{^ueGsg$vL=Pia&Z+_|tuO_OOH z4~0VJki{%14LIp^I&p%+Dar&9Cbdn}n6ODy^J5Gipt1@tYrG_)IwMmrwP-F3YPw>A zAjfG%HR>klFg(o2IB6zylOjNljpO7NB^VLTu{a0<0f?Fkv1A-8H%gkMHcEd(9Y4N9 z0CcU_8<(-FE`ksjp=u?q(2S@nKlo}}GUP*R{^sGTLEh1W}$i>k(m zEGYN5Fle@!=Q-LIs3#pH2~0K+u$kX8K;7X8fMwFg#c zLyZ8E{zJG|V5$_*LW}~68=$xTOGe>Pe_XG|6;trPS{XUJt#V^<*bek%ybr-mypsVD zwl4+tsZ;A;G$TlYQtm1CJI=n@KT(lbY&?8!adGdf9wKYpR%mR8EFHt;$(u&a*%JhDdRY2)NbT9M;dkHS{)9O& zJ-Dswp}vZg;712<+_S}A^nNbdfBw?Vtd|VNja;_o|2XA%eZJHq9L#1%=xC> zsj2?o3?-FzhFd%>8{b2!iU-Hlt*EuCW(A3SaEuCh-)`NI9557wm{9Ch}7 z*5C12?I?e3;7b2#Walh;{p(gSMU+(0?)IB~_lcb|2{e6E(*~ A?EnA( diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_side.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_side.png index f3fc5d8433a1300d9c66f97b914f43cf676c3445..8af2a9a1f289ca46a601fc8017b1f7c807a3c9c8 100644 GIT binary patch delta 29 icmey(@|$IX7UQjr+73(tQ(ojTfPkl~pUXO@geCx;bP1jS delta 29 jcmey(@|$IX79-gTe~DWM4fe8>n_ delta 29 jcmZ3*x{7sz7UQjr+WAZZA}k&r3_#%N>gTe~DWM4fd#4BM diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_top.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_top.png index 5809e4e4c0e90ba9e5358d65bcb99c5f8e749fa1..683ed129fc2e21096ac0f546f7b55d6a8e782958 100644 GIT binary patch delta 29 jcmcb{dX0607GvB-?b%EM^JnZ~X8;0ES3j3^P6EEGW$ECg-TRRzi`qZU?eXdwp(e`?PO4FJAa?Wcg7D18XwJN@nq0X z<6bu-Q4UQT1nNMt3Pk{ji$FEVXb>=gcgHe8CZXJcNWgJb2Rx=68vY3U571qOjPAZj zeCm(@n@eCHI*Y(1WII4lDWUxTj>Zny19x5@h`X;s&li3>5YR>fNAa+y0a_KL00000NkvXXu0mjfwZDIN delta 505 zcmVPx$%t=H+R5*=olR<0SKoEsLOTv+|h9DB~ zv8AX5L+!M;LJ$2V?ceCH?4dO{IF(xpf?ynFaqH2pMJ4xO??!eyr?BU5IMqmlI)w551uHMd4iW^>6-#XlPqIV6s)xN zMc;q^APj;d6;0bR9*tO)54?W$(l-j6IZi>B9EBmhUJrmU2$AEB7OawLUSM&$-QWl764Bvl(BeQ<8q4+dOABpA*MtTy;E%x+XSl>t&j{ z=5N#Zv%}VIahF!c5V?6yN3eFwi)YUP(7*q9{KSJ{nsPEsQx-+RyYZOy;TgZbz6Ri1 zo-@fZVE@dAX$s(d2wag^%UXnctr=ckdV-sEskK+I7J2*&i=ucOp{@~Y5o_6Wikwdy v5jG-RrKwlY`|$S7&V3X&*Z;6PyKwn`!LBzHpY>=#00000NkvXXu0mjf;z;Y> diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_front_on.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_front_on.png index 437b180d408a985f1d070248ea99d0e9d9afd828..989c56501282e0938ddb4bc5757d94f2440f7883 100644 GIT binary patch delta 377 zcmV-<0fzpU5R(ItBYy!}NklC;?jU zu%qiNUyp$Dd1frO!-j0P0@+;&WWU{%z12`TG^`2EbXpy^s+ zfIU2hH@NAga(&d1omNrmMj*xKETCa+a1hDd9)abIj$_HYkvyMuJYKRyVKv0eF0--$ zNPZH_eG>W1*m79MVe;`XF5dyjV?WglHn7eBNnqgbfWM@A1aJfcRsNP&?f|$eO8S~l z)g9G#9=;~SIYm7WjXJsBqtNyaszVC4(;@{XXlC?!_qDy)-qpK<7BVnd zFpCp)n`Uvy3`#PMP7N|8igWR?=_H!Xskm(Mz0Aee1m-)s@7mJgg3heT^}f6NeZSxD z|G57xD=e5XC~;(>PNy4Ww^@ted8l^84}kw;yPmM{ln}7ZRdl+fWbKI4)i;dL>0bU( zC@E9R9J3fs^6Ob%ashqFAAo3`E_+%iz;cU#inxGB5H0Afwr@~G;4Nrrrh{+PSuePMB)!+{U@fv74FOUAGPucS(fS9%6@ z?D10qFtrXxOruXPet%3tQS&Nb7}13EiB?J~0{|}qic~IhAg==2Ow*zXFu5{dRY@+9 zBwtUV3VSRgxw%?l%*dotLFA>NGP&0tU}aTcK`DYFF@nNKs)RH#28tocDTIL`hzQgn z@q)XuPpE;(d>RV7hG$jwKfyf5xFy-o!k7g=>j8K`^q@#AlT5DUlVm6i-5J6z91g}V zDk>{-z;3mmFl@ab@C@O~FtWUXz-W#qFgKB5z*wF)VZ@sf{H`|_gf{dTq~}& zKho#C#6gaKRNXG#P0^eYBh8S=OlFXn830J`GMXrgHoIJzY>%7SvH)K-*4LX=bHzhO zx7lFed6x-ejjS2tOpuJGI1^@aac+*}NzR?gYYiRl5ymDcuzHozSELv$j;?$H5^f8I z<+OIUpqy4`z@yRILLd2fA?4`)pcg>W=M+Dpu1Ib*$jTtc19SHx{e?fvzrt2L-~EeK zGh(Yx_r3e^f4Yw*hx4+c2fzu6qgp(;HftiK!T(*g@UvcXsRs^+owkfkS$Gkf(?EpO zGMvI|JI<`r>Ef>2tvMy;75?IxVsg&VYRk>Dmd_TplXhflJZ*E@E~V-g$C;-OZN2bj zI-QVocx8$&y|y{!`%f|xzoTx4rr!Rb#^1pYTvJlNrGCry(j9wG|I$%9vn*joTJ526 zC)PRYn&NjMZ#hRa*&6OAkNPQZlXt<80r7PQ&L8Yw)BW&l^Z7~k#<>fRfxBJq6|Rv- zM&)(4R-dn)YXiv-<|VGZF!+tf$C8?aN2`v%N3YpP8^$%ajjz5{?(Ez*=(VnI`*|i# z+px11uj-heQTIW0*5k{Kwfz^+>zePh?rx_ycPKS#^Kvrf)Uh!Y*o6Ia zhA+K#@v&oPrPwk#K~1%hua<6m-4(}8nKszZE$-c&Iji+e&`GOP8aWh!2JO>r&nvKQpT6+@zX7(V*?#~4 diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow.png index 1c3df136998375daa2315fbac277d45e3aadb76a..ad6556936322b7a49c6cc571b6a0d36a279c5b87 100644 GIT binary patch delta 264 zcmV+j0r&op5TgQ+B!B8jL_t(|+U=LIZo)7Sh9k_G4Dnk4Dnb>4(%0xv2{F=;fSLu~ z0YYh>`sgtWTgR#`Pbnw=}>c9X7xD>EU;3dF5z_e8#lz#%bI$#pRr{-LsY~q8J zgMm6AbMT;fAh0qY7{CCR0~QI)11tkPg>} zRe)FZ!J_s5LMgD(zAt)E_3FI!aFPb?oC=Ke&|?f+g?$LD#eDD|fG;0Z&0xF;iRl0U O002ovPDHLkU;%<$i+{@i literal 2064 zcmc&#ZEO@p7+#>XK!a_m7D80kZBU5r?d-?hbyv=E_9{K)YAu&gjMUEV%-wBzx4Yfl za@Q)L5C~{cjL{mXU(rDPNK(!65soP~2Jikcg3inNk@CApT*DkcBb>(9MNZnLeXH4a6US9{kq zYFGaPiYk3wkGHvPv6YHuW_%EtD)!|v7C}?gvih6_wNC8PDo*M~h&em_DMRZh#H{wm zK+I~uDZQ!J#;bap<63X0CL^Z)9(q|$Ap{xhLOPd88;+6-F?n8vjJ;`&q4N;8GsJ|w zfOK1|g>EoyO#6KSR^ugs4$3}00AxYBixvPMaV7k&(hW}}4C8o93! zi#&yxl|S>}Mi2?9$HtkYw-Fvl8B?G!@IEvS!4c@<5F-GAXMw=-LY((260Zotoj_Co zn1sfN6%cgczrkLM6(IcsY$83;^PfHdKd?KrGS7DUa>AaT| zsCjk|F`CzBjF`f-ei@yvEu%@=Yzh<7t2BQS=9mdL3vC=u5>2ngU)+`Qci_6KXD?$d z01yT&k2Rjfb)+vUj|4UWWCXMzR1=Wsd8Oo@u-hS|v+p5a%esA!%n>UrU%;R_L{kHPlyxtc|!sQzm4*Qqf8h+sY^ADdc zoAc1h!$X^n#JMAfL=lYty5srJ1#QdX6(vWhwhLV+K~=>KA3XWk$eG>e2abHRvErFe z7HoZL*UYc?9UE5%_x$iID2>Nu?#C}iQ++$%*n##zsm(%`yMU%}1Xe zkUNrV``7%^``nik9W^`qz|hCXvmXvF8~W(f=2_dGn7Q8Cx$Ta!-3Mx|@rn5tMxvEt z^B1MJ$d7-u^u)2B_Z-|?@!jInu{SChdV0+tBO93Zck5r0CLV3te`;*_?7qn8+rM{J w&Zs}M5l(;PdxN{>#?fjw{uVp&+J*yV?T5RMpIE!U-8-|Rjm?pPdpkD$1<_5cVgLXD diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow_e.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_glow_e.png index 1c3df136998375daa2315fbac277d45e3aadb76a..ad6556936322b7a49c6cc571b6a0d36a279c5b87 100644 GIT binary patch delta 264 zcmV+j0r&op5TgQ+B!B8jL_t(|+U=LIZo)7Sh9k_G4Dnk4Dnb>4(%0xv2{F=;fSLu~ z0YYh>`sgtWTgR#`Pbnw=}>c9X7xD>EU;3dF5z_e8#lz#%bI$#pRr{-LsY~q8J zgMm6AbMT;fAh0qY7{CCR0~QI)11tkPg>} zRe)FZ!J_s5LMgD(zAt)E_3FI!aFPb?oC=Ke&|?f+g?$LD#eDD|fG;0Z&0xF;iRl0U O002ovPDHLkU;%<$i+{@i literal 2064 zcmc&#ZEO@p7+#>XK!a_m7D80kZBU5r?d-?hbyv=E_9{K)YAu&gjMUEV%-wBzx4Yfl za@Q)L5C~{cjL{mXU(rDPNK(!65soP~2Jikcg3inNk@CApT*DkcBb>(9MNZnLeXH4a6US9{kq zYFGaPiYk3wkGHvPv6YHuW_%EtD)!|v7C}?gvih6_wNC8PDo*M~h&em_DMRZh#H{wm zK+I~uDZQ!J#;bap<63X0CL^Z)9(q|$Ap{xhLOPd88;+6-F?n8vjJ;`&q4N;8GsJ|w zfOK1|g>EoyO#6KSR^ugs4$3}00AxYBixvPMaV7k&(hW}}4C8o93! zi#&yxl|S>}Mi2?9$HtkYw-Fvl8B?G!@IEvS!4c@<5F-GAXMw=-LY((260Zotoj_Co zn1sfN6%cgczrkLM6(IcsY$83;^PfHdKd?KrGS7DUa>AaT| zsCjk|F`CzBjF`f-ei@yvEu%@=Yzh<7t2BQS=9mdL3vC=u5>2ngU)+`Qci_6KXD?$d z01yT&k2Rjfb)+vUj|4UWWCXMzR1=Wsd8Oo@u-hS|v+p5a%esA!%n>UrU%;R_L{kHPlyxtc|!sQzm4*Qqf8h+sY^ADdc zoAc1h!$X^n#JMAfL=lYty5srJ1#QdX6(vWhwhLV+K~=>KA3XWk$eG>e2abHRvErFe z7HoZL*UYc?9UE5%_x$iID2>Nu?#C}iQ++$%*n##zsm(%`yMU%}1Xe zkUNrV``7%^``nik9W^`qz|hCXvmXvF8~W(f=2_dGn7Q8Cx$Ta!-3Mx|@rn5tMxvEt z^B1MJ$d7-u^u)2B_Z-|?@!jInu{SChdV0+tBO93Zck5r0CLV3te`;*_?7qn8+rM{J w&Zs}M5l(;PdxN{>#?fjw{uVp&+J*yV?T5RMpIE!U-8-|Rjm?pPdpkD$1<_5cVgLXD diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_side.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_side.png index be7c8f10065e802047a26c75205efb7f3b47c4bb..c5b2f091eafa902105f503ef82b11726a3570ebe 100644 GIT binary patch delta 265 zcmV+k0rvji1Ed0wB!BBkL_t(|+I^F~4#F@Dg!49K;zw!+5I-ss0}?O*D~ORd;PHbl z=&Oz->R{P%?X%Cd!{_;klGphZkE>;}-?wYTkI3hK#ozaR4E_*++tRrxUYdeIhLELq zi+OTNWAjEUjv{)8JfLlwQE|`&Kueyyo=pombZyf5PWy?1+JA?0o~$H^`(;zK0PrM) zBp2mCV-&!vc9WkJ6!IC=D7a5C6dVBj4-k}7aWL;Xzy}JK?PdVVldCg;PflTM7m67$ z2X>yDfS&Ka#}Bsv8r%qEWwG(I`l$nk!JY%=2SWl?|AtsQpqlN+<^C^RF2wE5Ab7g~ P0000wffPg?qWJ0Y+9D9>4Vlr}+et-Zum>K^6hn)TV@%nw10cQ+vv38DK)39<5QGcaqL%=K+06d;q3^865 z4KcE`mLWz~&arZig9t;66scfo?Mstxp9^J(lYQHDxhcSWTi1N_o*~AZWK20({`v}I zN*=pC)n>!eT9(!_Pv#^B#+3P1yI5cs3sjH9(<#R*@3TL}SgSE5_UuPODpWmQOhi-} zVq`wC`JG~b*?;V10q8ltw3cG+98V!I#CUN_lJFL)$2{^ZK~yJ6{`%^_jc&Y$5D?W% z6OAePuwGB-CxkzLGt1;bk@O@9dwPs1Q9Vv1Wrkx9D(|VhXV)}*xxJ-7KjW`=cL4ml zzh_(5z{@kQya&iW%u|x6(u?pE0@Y@d3(~yX5Hf>a! v2nP{vyw40~-#&kOP9G)ddT*c32`T;$k!TT5m-S|f00000NkvXXu0mjfDdo{= diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_top.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_top.png index 080d12123f70cbbb0efc0791837dd9716c253118..5314ff634ed8bc686f9730ca1c75f4d9c171962d 100644 GIT binary patch delta 246 zcmVecU7CG{iKH{O9oyO%EVYALtGFKsGcuU|yTVRGpAg?Uev*Lksc+dAqX?$NKsGH1w1`GB zm4O<{s1j%~aF~Tsg1>_)2^vEV8)gFi15EN#luV~K>Y;?&ZkvgG@#Gy)kN=Hcj>h@u w@;lI7Xg#FnF8s4h)m>;UQ*#$u%j9=q1c!ve9%c5iQvd(}07*qoM6N<$f*L_|CjbBd delta 412 zcmV;N0b~A>0=5H?B!2;OQb$4nuFf3k0004SNklWyT5QRS*f;beN2y9yT z0$yjC93batuhG+XQ6Olbx-yX;iX&~>g-t@X(|7;@$VoV+1JqE(G3Uq?%vm=bukcI1x^xb&em8kF1;{s((^-As}@P!1lmmNa+YP zq(oyaLrSciW91xgF*2k?l>v>l`zHOa0OOF(&RyS^rU1*^&4w@DGo)0CM9kUeudfg> zZ2KMSn;RNyX{=?L#mNjrOnKGTHMXu%9SJY5CBOE*=u^#S6*1U@9y!u9A!1M+Q60-h zqAEj5EYD;<0e=Iij))i*i+x@X`NmqR);a!!z>rdTVLrkK~002ovPDHLkV1fslEY|=4 literal 1468 zcmbVMO^DQ19FMqN+O=B>#j<`tADN4#o8%?){V*=;%<2r7-DP*s@#ahNW+v<;FD7rz z>{3KT&_#5wR@xp~Xm1v8(iSYUagcD`1oo3eK^YhU%c#MK78a?PKSc9=d<|RCEWaWLJ&q?I<-2h8z+!O zT^ZZdByz{~Ia&}7Pj!53EfEGx(sVpseE!>A5jeIkp2`}~@JpoSR8|ABxH?<2R+p@z zElwQ)hdYQ9xP)QQaob*qI=a~7MSLD_De{B+#ImS72UI(-Kq>%%OA<3?7k73+x73C?6Zh;wxQjG3FyhiK0l3(lQO2idrld z6{sniCUJxmu6PW0Bri-28OkKI0>@_#^+3#sO}fl9KyVfug89VCYx`~L8&79+A z3>>l}I;^euL|GsqT@EZVbB?Q-immZcDIl29phjtX7^wN7%Aiz=15*HpPC1@Uqwvcu zcSspCqKg{TR0(R5nyzUY;%^py1=9$^KGdML(^%ONnn7A&8V*t@7O9qXk((_$j*T*nM#eUa4JoZ=Oi9aU z@{(D|WF<2Tp>5(^0h;FUewkX!ad3zC?f-dyE^v5p;r4s;#3dJJ1*$k9kJrkeC>F`t z!L03oULqiD#R;y9RvcMki-T?Fy*<#Ujar10{!6&~u#h%bgab0&`-+uux7MwT9YxB1IG`IDcfzdm;3$t59`N^LY2&+omn@nk)!M7t2Uf8n2p54GRB zFZSIV{SzG7v-Y|6{VV_3UGOukr?1Q{Ok5CtUHxJFj}IOnxboxZ$0v6S2OrgM<|Z$X P#Qn88Gh4oO^vuQAPfXIG diff --git a/src/main/resources/assets/betterend/textures/block/terminite_chandelier_wall_e.png b/src/main/resources/assets/betterend/textures/block/terminite_chandelier_wall_e.png index b1da1d0cb746693dde54d5610eaaa933eec49023..eab36ddcc399c033fff81bebc310a65b8eba09fd 100644 GIT binary patch delta 114 zcmV-&0FD2=3y%SiBx_blL_t(|+GAiK0sQ~}ABXUjP6A literal 1468 zcmbVM%WvF77T&>qJ+}AhQQb7%4eUxdMCnRN)dQIw&+b}TdyGBl z?&gFzAhqI9q#g=_{{Z!Xddndop@M`2s>*?03l~mp)k6=Z4WIX6wJ5x5*`68u_x-;2 zcYb;4?fo-HW)wx)U$0eHU_FpN&rid9?%pni<%OtrCQ+0ZUrC=S<+INZE6OwX{KlGG zbKfCM1UmIZlk5E;0<@wWpYKPMZE%U2yzPgMdV70EMZV{#s|D9^qYCf%wXK++-dbv~ ztqo>->ih|Gyib52;F6+#&-4n3=aw z$=1!HVO#k(k!6@AY?QE>(+rasMUu18_)-F?rP8V?- zo3?FZ!@`!O0YXa#p`?8+OpZ+$sytz_A4y+?C}pHgu_+xDEFHNJL>XyOFsDwW((EyFT3!_v%L!?Fn61>+4PM+{>Gb%p1*275yDfPMlBRpU`f{}t>p(h_k% z!Dm09ZH}X`t)eWFq$0W^2E|}qZfJ$;l6sg(8Zut5Ix4uW`@TntR-W-<$<)fWQPc`7 zU((7}F{c#@7Ae7_xoG#PdD50ktAf=01oAZ)H^piG z{&?5*(XbE*WodysDoZoVJ$3xqf9eQ~XnP$Fr2mla5iAic*`qOEXhXFAOGRO@AE(_o zas~g@%i+JrI(Gtxagc7aIRuAnlJOA6R}6FN>?aqm!i*F3>O!OZ16xN^f9&qgeZ0Ek zJes@KYND6F9Q1DO%xsr0Pv4!bU*GrD%}eh+`{Vq>yD$B&pM37s**lLOoc-wj{E5mh zCy#vFK6?GswHtF+9v=Gb;PeIvEF7(u@Yi2_^L_2pse{|=KPy)c&t8-t>{AZ>l;2jr S`}IOPU+arY)hnmgKl~Fk6VGx0 diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_floor_e.png b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_floor_e.png index b7733670fad129016a439d02660f69bd55aac684..e747def3cd6752ca5fa80bbcf25d0d5d1c5ccb0f 100644 GIT binary patch delta 102 zcmV-s0Ga=;3xffWBwtENL_t(|+GF_t|33q%c=g-k|6y#hG@t)+??22Ck~Kg0^BRsp zeEJ$N>&X_d^Ff+HG>A{C0boNwHiKvopX5M9$D;;}8bB2T00(vk*!q$8NdN!<07*qo IM6N<$g3698!~g&Q literal 1454 zcmbVM%WKp?9F7kbtrn_+h#m|Pe4u%6x6RO4*WGFtOfBt-6)#R_W_Lq3nV3x7v2cxGVLD;Y*`Bn)Fx3&qw+7E7dicLAk0HU4(F`Xt#>;)Vx z2t&hh0MQI#;xwtczAY_1S(HQ<+tSH?M{|M#skx)`A(@;XE2H@tWMOIepg0r*PT&y+ z#n`L+5r}Q6#S8d6*;Xa71z|I`lurbTQ_i?ppdk_am7I+9tRW6qik{OfBYQwJG<`tT z22|aYH63U!bon^MfHEo;V1u3l`b=<@qrp7Q(bwx`|Y5_4yalvd@ zZwbdpC3WHvpG6$2r`VuI8I5Z67u4zT4+6Mr9VeBsqAs47iip_AIc`SBAuFPz@?1dF z2@=uS5Rs8{T+LmHH32Au1Tq?yDXn({HQrTOEEJN!42pYCx<00jXy39sqzDxJcsW8}oASz5MyDn`J!o_4SJj`7!vY o(s$>c_B8W$N9Jy30YpL0Z^IqB;Wu2@BhNs=z-N;JzX5f zt3#9k}>k)t8Ut=tgZ9o*Gxn>lXDM<+i?C(VPoYXR?d`Am$eP9!OyQ#A>HNEUvpjHYouBA4Wz)~%k~1~n%o0a zSxHNBT2c~%tUx&h6B=k8Jku7~1vqZ(Z|Pz?oi9=9LrJPut70`FlAtIlnx;vzDygc# z5JFh@D5?owxV_C_;Lr*jpE|??5hI!+6{_>h(xwZpAJckaD@-h4QVsc%BFd3V4WMns zIKL8<8_I1K=M0@^Zi|j%!%V@>q?1}okTskXa3P6>Ov*+= zGL4YRP9=q`w!A^CN|fBTy#1f@hXRK+7b-8BCu+HqRDY^}-;XcPiO zR#f0RZ$+8KHsAW}EII;B+G+_i(m$lT2@6SqR#AWli!56IQc)7KUy8c1>5BBLmyLfv zb#5EZ#zC}<=MdY(lMH)odHN^0d%Eh*i_6ECKI#AVVa;1{VA+oD_us!9JNK!7U-tPx&;8=Ir$Y~( z_1^xr>Gj6W=}4fW?tFdtps@)&>K-_aKEK&={zm7^^Xr4_mu`w2M<2qwXUba}Q#Lm| KYTO<=arOsop4F%T diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_cluster.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_cluster.png index 8686d88707545a52999ff46e6306906209d7550a..6d457f4b324b634fce68ad02319f81b88bc3908a 100644 GIT binary patch delta 28 icmey&_?dA+86)Gw@*DwsmYn+xK;Y@>=d#Wzp$PzrA_(;W delta 28 icmey&_?dA+8RM;q#N@R&3~RDm)JQO?oD3it%A8* z5?IGyO|hx%`tnZoFK+ip++j!rZrzj!itwW%h(4RkCjKv+q_x=5L4~58jD+srTSKP01E|yg<(ji|vedgqqc4+Y*FU+U%fL zcOPr1@W7=Wk!fRIB9t@)WxWG*;3eV$%VuIZg8dk@J4l=r0e=*0sWa^pl8U9GIB{|! zM}Fb0i6GUU2>2zQdU+B{-zYftp^m*i`7aFlf#k>e5C8d0U1>5tHPSEW>5U_8%Dwdf O0000Px$+et)0R5*=&liOPJx7VmN0U*n>3J369zoIG2mRam1N?Rgoe_JOW z50BACRT9!vp?{4+>4c)lu`L_RvMGw3vMdooP}VYB=>p(LuNoqNw4EAsxj4Th%W_tm zB>+eLBUGyExWse3O0G#?B&am0syPl{ZmyWzexoRI{`{SC^YfbFV95RSjvv1!n5_Y5 z2`qp?{|JC6ex@jLvOL3)E?J&Y6gk4OT3;Jo4{`f4gMUOPXru64kCWG@lx4}FH{jyk zB?v*BY&d;$hS?f=K_7tOASBT-aD*u52zK-l+7#ABoGg zY;F`BDAZJs%3KIgEo+;#(AYriOh$6dZE?48HgL2CyAkiZw|~gSGsq=#I80_4#7S#a zuNbthrnjR6ZF|VYO>>4^B7=N713h(s_Q5{9+_E3{Mi8fkr(;b=ODm#(WR!1l9oBaS2naiDEK^*?tVcr^uKF8uhNq7Vf(~Mwfn+ zpzn@g=L>jq9e;e*4Scvd9!e*Sce{+ap)!_c5lh#?qH~Mu+Bh=sj4pa=2`kSGclL|< zkbl)HA%8VBymkg~O3lb%7~BCF&<UFT+PAYLL}VoTLINiBcEhQtZPNi`GPRITuJDu2DYU9V4`3q>9v md2s%#e+`ouj%|F`aD4-f=&nQ3&YErj0000&d9cuZlRTKt!+b#NMSy2yOZwjEIU*B zLHXDs5CwyxZJBIP5;xvj|>?MT7vkHY%2aG7Ai@JhjtlV-w5DHJG6(Kvs3z!M^uB^-Ew7x;7y#*)!kzgyK+ z&8YwrAc4&3Q08DG8$X{B z0D`Ut3RTq;S*W~-WF#ZQSQr~Jyh!oMYK1o9jyb>~=)jIr1Vv&5g^^St$?zn{)9j0c zg(rxPP^T&@uB!V(S)L+zlDI1rx<(ds;Xi|AiFc_1uK;sayh16!{k~EZiB^)&P(5k@ z5<_*CkP4@h&-Q7$;FCbM!;ZqV&59!PB9KYWCIgIRtOCZ7w1nAgfWSl-$x2qMixmV{ zWWGa{%8kV}=6Cp9RwamWo0YPNoG4N*Xl<6lY$8o#f>ngIv5_KYVQ8C;lp<)a1Qgh6 zg6B?DLzN5>Z8nB+!Kz}C%jUvt63t+oEKnFnSXhGNXqE-%CBub4M#Ha_PFCxY>Jpw`;RX=&A=d0**Ho8YAp}5r zDO}k{aXr&^9i}N!)o}wE)0FUV;6{68g4DdFuJF~ zhv=>de6UmjxaU<+?T1aKt^=|i>4mn1-hz|4{nO*^r;cp2%oy-Y7xL9Zv&SxoOSw^- zJoOFopE=1tewR3__8_t}QL3$v4+bW-Y~OeKr(>GZTHOE|^7iJeY-(=4+{6b@d#(<5 z_iQ&cPa609>bg(16kYn*KeEs28DI4YR)2G;R_*1OS#vh28~6I6180xDoFrdc`B_r} zb9mR`bJV3lC6ntny>Q{m>DuliN^AOk?O1AB!S4F}rrqzGGuUzNi@3V_%<_3dT z*Y$tx`<5OHtiR+fOXz!ce(&pGM z)Uq+L*dp-K(RumDckEr}ZWd0sHzcl`P&;qZ6@L8N%lE|fN!wDMQ1a}mjnk4(@}}ik zOWrF`CfAKFFZT@cEy?>RbN;1V>!e diff --git a/src/main/resources/assets/betterend/textures/block/violecite_furnace_glow.png b/src/main/resources/assets/betterend/textures/block/violecite_furnace_glow.png index 1c3df136998375daa2315fbac277d45e3aadb76a..ad6556936322b7a49c6cc571b6a0d36a279c5b87 100644 GIT binary patch delta 264 zcmV+j0r&op5TgQ+B!B8jL_t(|+U=LIZo)7Sh9k_G4Dnk4Dnb>4(%0xv2{F=;fSLu~ z0YYh>`sgtWTgR#`Pbnw=}>c9X7xD>EU;3dF5z_e8#lz#%bI$#pRr{-LsY~q8J zgMm6AbMT;fAh0qY7{CCR0~QI)11tkPg>} zRe)FZ!J_s5LMgD(zAt)E_3FI!aFPb?oC=Ke&|?f+g?$LD#eDD|fG;0Z&0xF;iRl0U O002ovPDHLkU;%<$i+{@i literal 2064 zcmc&#ZEO@p7+#>XK!a_m7D80kZBU5r?d-?hbyv=E_9{K)YAu&gjMUEV%-wBzx4Yfl za@Q)L5C~{cjL{mXU(rDPNK(!65soP~2Jikcg3inNk@CApT*DkcBb>(9MNZnLeXH4a6US9{kq zYFGaPiYk3wkGHvPv6YHuW_%EtD)!|v7C}?gvih6_wNC8PDo*M~h&em_DMRZh#H{wm zK+I~uDZQ!J#;bap<63X0CL^Z)9(q|$Ap{xhLOPd88;+6-F?n8vjJ;`&q4N;8GsJ|w zfOK1|g>EoyO#6KSR^ugs4$3}00AxYBixvPMaV7k&(hW}}4C8o93! zi#&yxl|S>}Mi2?9$HtkYw-Fvl8B?G!@IEvS!4c@<5F-GAXMw=-LY((260Zotoj_Co zn1sfN6%cgczrkLM6(IcsY$83;^PfHdKd?KrGS7DUa>AaT| zsCjk|F`CzBjF`f-ei@yvEu%@=Yzh<7t2BQS=9mdL3vC=u5>2ngU)+`Qci_6KXD?$d z01yT&k2Rjfb)+vUj|4UWWCXMzR1=Wsd8Oo@u-hS|v+p5a%esA!%n>UrU%;R_L{kHPlyxtc|!sQzm4*Qqf8h+sY^ADdc zoAc1h!$X^n#JMAfL=lYty5srJ1#QdX6(vWhwhLV+K~=>KA3XWk$eG>e2abHRvErFe z7HoZL*UYc?9UE5%_x$iID2>Nu?#C}iQ++$%*n##zsm(%`yMU%}1Xe zkUNrV``7%^``nik9W^`qz|hCXvmXvF8~W(f=2_dGn7Q8Cx$Ta!-3Mx|@rn5tMxvEt z^B1MJ$d7-u^u)2B_Z-|?@!jInu{SChdV0+tBO93Zck5r0CLV3te`;*_?7qn8+rM{J w&Zs}M5l(;PdxN{>#?fjw{uVp&+J*yV?T5RMpIE!U-8-|Rjm?pPdpkD$1<_5cVgLXD diff --git a/src/main/resources/assets/betterend/textures/block/violecite_furnace_glow_e.png b/src/main/resources/assets/betterend/textures/block/violecite_furnace_glow_e.png index 1c3df136998375daa2315fbac277d45e3aadb76a..ad6556936322b7a49c6cc571b6a0d36a279c5b87 100644 GIT binary patch delta 264 zcmV+j0r&op5TgQ+B!B8jL_t(|+U=LIZo)7Sh9k_G4Dnk4Dnb>4(%0xv2{F=;fSLu~ z0YYh>`sgtWTgR#`Pbnw=}>c9X7xD>EU;3dF5z_e8#lz#%bI$#pRr{-LsY~q8J zgMm6AbMT;fAh0qY7{CCR0~QI)11tkPg>} zRe)FZ!J_s5LMgD(zAt)E_3FI!aFPb?oC=Ke&|?f+g?$LD#eDD|fG;0Z&0xF;iRl0U O002ovPDHLkU;%<$i+{@i literal 2064 zcmc&#ZEO@p7+#>XK!a_m7D80kZBU5r?d-?hbyv=E_9{K)YAu&gjMUEV%-wBzx4Yfl za@Q)L5C~{cjL{mXU(rDPNK(!65soP~2Jikcg3inNk@CApT*DkcBb>(9MNZnLeXH4a6US9{kq zYFGaPiYk3wkGHvPv6YHuW_%EtD)!|v7C}?gvih6_wNC8PDo*M~h&em_DMRZh#H{wm zK+I~uDZQ!J#;bap<63X0CL^Z)9(q|$Ap{xhLOPd88;+6-F?n8vjJ;`&q4N;8GsJ|w zfOK1|g>EoyO#6KSR^ugs4$3}00AxYBixvPMaV7k&(hW}}4C8o93! zi#&yxl|S>}Mi2?9$HtkYw-Fvl8B?G!@IEvS!4c@<5F-GAXMw=-LY((260Zotoj_Co zn1sfN6%cgczrkLM6(IcsY$83;^PfHdKd?KrGS7DUa>AaT| zsCjk|F`CzBjF`f-ei@yvEu%@=Yzh<7t2BQS=9mdL3vC=u5>2ngU)+`Qci_6KXD?$d z01yT&k2Rjfb)+vUj|4UWWCXMzR1=Wsd8Oo@u-hS|v+p5a%esA!%n>UrU%;R_L{kHPlyxtc|!sQzm4*Qqf8h+sY^ADdc zoAc1h!$X^n#JMAfL=lYty5srJ1#QdX6(vWhwhLV+K~=>KA3XWk$eG>e2abHRvErFe z7HoZL*UYc?9UE5%_x$iID2>Nu?#C}iQ++$%*n##zsm(%`yMU%}1Xe zkUNrV``7%^``nik9W^`qz|hCXvmXvF8~W(f=2_dGn7Q8Cx$Ta!-3Mx|@rn5tMxvEt z^B1MJ$d7-u^u)2B_Z-|?@!jInu{SChdV0+tBO93Zck5r0CLV3te`;*_?7qn8+rM{J w&Zs}M5l(;PdxN{>#?fjw{uVp&+J*yV?T5RMpIE!U-8-|Rjm?pPdpkD$1<_5cVgLXD diff --git a/src/main/resources/assets/betterend/textures/block/violecite_furnace_side.png b/src/main/resources/assets/betterend/textures/block/violecite_furnace_side.png index 0a696fce325c4090f4c4c3b53527e3d6e23a6c19..311fda8cc3c52ffd16e03d25672068f5dc131134 100644 GIT binary patch delta 395 zcmV;60d)SJ1f&CyBYy#FNklZz04CFid)HGK^2=@`rK+*thXFAjW{}@#( z;^3h<9yHe4)@mhNMxXx@tPXlozQVdq&y;UWFTjt?;u;8F$2$4u)gc3ivzL_sWx)F0 z6stWUP?p+EbB6pRLvy6F-DSv02Y%4L`^VjL9AhjC- z$M~C0Y^8gaz;Kg`)nQLf^hJlDBYP1Ffqh9T1a3Nch7sG;s5{u07*qoLPx$*hxe|R5*=&lgW;oKoEvMplQIw4A}BZ zz0?wIa_87SUR9E03|o z7R$rMp|xUAJ!SC)fI;;i0%@%{9QTMp^}L>*$>mK3tL}V{_J88bWr5f>JGRY^WBbCk z+3_g1<$k0Kfc@bw)?2pCj$!C<-XRh}uX;iVL>-jH8t)xSk2Lj`OMm8Y+!F(=Rx@Ag zEK+8qLeh;LA`zq_rLHzenUUuO%8UT`$pg#)nat;UL%>*rG9#%-iKCbzTVbtbnmnT# zaMzEUdV{uV27fR{p{+vck;`yK+j%lVq!_1(qX_35#u}uM0Hh+Dn+PD1^y-vso-(|j zICU-BYO1ng&~w>&mXoE~OxKz@34k)=jFzTM-eaBN?QJ576O>WZ>jnVlEY?{{;MBG6 z0PC`1P(A%{K_r4{nn;D@sj7)WL=?w(=WyPkt-dzVp?Bf4_;oef<#@3b`!q%3btDKBDv=2n{v-{EQ7J00000NkvXX Hu0mjf@qqXh diff --git a/src/main/resources/assets/betterend/textures/block/violecite_furnace_top.png b/src/main/resources/assets/betterend/textures/block/violecite_furnace_top.png index 037eba44d5b5d2161356ecbdfdfddb2da7bfa712..dffd5b35c71364fae5f925f332b86fe4255cd083 100644 GIT binary patch delta 390 zcmV;10eSwS1fT?LqRlmsSFmrkkz0Y>|r$&OY-h1ar7 z(O(5US>Hsn;sC3)4#`+~OaNeX$XQNm)i%1EK_wBYyw^b5ch_0Itp)=>Px$+(|@1R5*=wlg)11Fc5@4%9KP#wqwT# ziku4c*n3ay1N7SWe}TeC>mP~YufiS_$+4TviAw^@nb{rj^ZTz1;G9J%%>?HxZ*lvk zl;&{!gPbmW^!VrjNGa0jB>={D?>2JIayF;2fsdZ!`S0b2V1Ic&?opL~w+8sMdjc36 z)Rkg+w_>+_|4b4<74#N?B5f0$tw` zLSPsYy*0BB4}Y5nT(A^MX}llxSl4qlCtMguC}oL{jzS1xjQHSZwxz5u66B(My{ve+ zuSsd(*dB1fv2NBF*N-Et6>Wb)DUG!~s?wv0*1r~I$&eBudR|@z7R3VVEt}OAfEdHf z;Mg863|7q=V>>!?MlK}7Fi^^h`}GEq1)?ZOF%naJV}D{C#|Y579v3WiRTEPr=ghiU zBMS*aVEUGvGa-iA#La3;?+j8YjrF5xlSwXEPTk>Z69H7Eap85b+*r?h@cHS>RbW2a z#H&zE5_GLGwwr^~=;ePQnrdUaIcNal+t(lY`MAHLczd33D+%Bq*WoMyb0D-5gpUXO@geCx;!3sM7 delta 28 icmX@ic$jfQ8DreUavOnX`E9KXK;Y@>=d#Wzp$Pzy(g~CR From dcb89e1b1b2cf9ae17eb5262b9537f642a8db7f1 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 14 Feb 2021 12:13:31 +0300 Subject: [PATCH 279/463] Version change --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 091f260e..d412b84c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ loader_version=0.10.8 # Mod Properties - mod_version = 0.9.1-pre + mod_version = 0.9.2-pre maven_group = ru.betterend archives_base_name = better-end From 3719ffc3d9200145db0e62dfbf6e41b8820328ad Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 14 Feb 2021 12:44:36 +0300 Subject: [PATCH 280/463] Blocks as beacon base --- src/main/java/ru/betterend/blocks/complex/MetalMaterial.java | 2 ++ src/main/java/ru/betterend/registry/EndTags.java | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index 38ece37a..4c1b5c68 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -199,6 +199,8 @@ public class MetalMaterial { GridRecipe.make(name + "_boots", boots).setShape("# #", "# #").addMaterial('#', ingot).setGroup("end_metal_boots").build(); TagHelper.addTag(BlockTags.ANVIL, anvil); + TagHelper.addTag(BlockTags.BEACON_BASE_BLOCKS, block); TagHelper.addTag(EndTags.IRON_INGOTS, ingot); + TagHelper.addTag(ItemTags.BEACON_PAYMENT_ITEMS, ingot); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index 6cfa8e76..f2d5f2e6 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -114,6 +114,9 @@ public class EndTags { TagHelper.addTag(FURNACES, Blocks.FURNACE); TagHelper.addTag(BlockTags.ANVIL, EndBlocks.AETERNIUM_ANVIL); + + TagHelper.addTag(BlockTags.BEACON_BASE_BLOCKS, EndBlocks.AETERNIUM_BLOCK); + TagHelper.addTag(ItemTags.BEACON_PAYMENT_ITEMS, EndItems.AETERNIUM_INGOT); } public static void addSurfaceBlock(Block block) { From 2571ab7ba885385ae707669355a66fefecc1363a Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 14 Feb 2021 20:02:02 +0300 Subject: [PATCH 281/463] Bone meal fix --- src/main/java/ru/betterend/util/BonemealUtil.java | 3 +++ src/main/java/ru/betterend/world/biome/EndBiome.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/main/java/ru/betterend/util/BonemealUtil.java b/src/main/java/ru/betterend/util/BonemealUtil.java index ab433e6c..67146c8b 100644 --- a/src/main/java/ru/betterend/util/BonemealUtil.java +++ b/src/main/java/ru/betterend/util/BonemealUtil.java @@ -80,6 +80,9 @@ public class BonemealUtil { GrassList list = null; if (map != null) { list = map.get(terrain); + if (list == null) { + list = GRASS_TYPES.get(terrain); + } } else { list = GRASS_TYPES.get(terrain); diff --git a/src/main/java/ru/betterend/world/biome/EndBiome.java b/src/main/java/ru/betterend/world/biome/EndBiome.java index 48e13736..8c57c4e8 100644 --- a/src/main/java/ru/betterend/world/biome/EndBiome.java +++ b/src/main/java/ru/betterend/world/biome/EndBiome.java @@ -40,6 +40,9 @@ public class EndBiome { public EndBiome(BiomeDefinition definition) { this.mcID = definition.getID(); this.readStructureList(); + if (structuresFeature != null) { + definition.addFeature(structuresFeature); + } this.biome = definition.build(); this.fogDensity = Configs.BIOME_CONFIG.getFloat(mcID, "fog_density", definition.getFodDensity()); this.genChanceUnmutable = Configs.BIOME_CONFIG.getFloat(mcID, "generation_chance", definition.getGenChance()); From 65207701292f0cf898049dccfc2847457cc900fb Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 15 Feb 2021 20:49:33 +0300 Subject: [PATCH 282/463] Sapling drop fix --- src/main/java/ru/betterend/blocks/basis/EndLeavesBlock.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/basis/EndLeavesBlock.java b/src/main/java/ru/betterend/blocks/basis/EndLeavesBlock.java index 37bee30f..cb4e6ee9 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndLeavesBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndLeavesBlock.java @@ -36,7 +36,8 @@ public class EndLeavesBlock extends LeavesBlock implements BlockPatterned, IRend .blockVision((state, world, pos) -> { return false; }) .materialColor(color) .breakByTool(FabricToolTags.HOES) - .breakByTool(FabricToolTags.SHEARS)); + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true)); this.sapling = sapling; } @@ -78,7 +79,7 @@ public class EndLeavesBlock extends LeavesBlock implements BlockPatterned, IRend public List getDroppedStacks(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.get(LootContextParameters.TOOL); if (tool != null) { - if (tool.getItem().isIn(FabricToolTags.SHEARS) || tool.isEffectiveOn(state) || EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { + if (tool.getItem().isIn(FabricToolTags.SHEARS) || EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Collections.singletonList(new ItemStack(this)); } int fortune = EnchantmentHelper.getLevel(Enchantments.FORTUNE, tool); From 120db64500a3e16ac7297dde683199c3ccff5b70 Mon Sep 17 00:00:00 2001 From: Soochaehwa <43947445+laxotor@users.noreply.github.com> Date: Tue, 16 Feb 2021 06:55:23 +0900 Subject: [PATCH 283/463] Add ko_kr.json --- .../assets/betterend/lang/ko_kr.json | 680 ++++++++++++++++++ 1 file changed, 680 insertions(+) create mode 100644 src/main/resources/assets/betterend/lang/ko_kr.json diff --git a/src/main/resources/assets/betterend/lang/ko_kr.json b/src/main/resources/assets/betterend/lang/ko_kr.json new file mode 100644 index 00000000..07515255 --- /dev/null +++ b/src/main/resources/assets/betterend/lang/ko_kr.json @@ -0,0 +1,680 @@ +{ + "itemGroup.betterend.end_items": "Better End: 아이템", + "itemGroup.betterend.end_blocks": "Better End: 블록", + + "item.betterend.guidebook": "엔드 무작정 따라하기", + "book.betterend.landing": "엔드의 극한환경에서 살아남기 위한 짤막한 가이드", + "book.betterend.subtitle": "엔드에서 살아남기", + + "category.rei.damage.amount&dmg": "도구 손상: %s", + "category.rei.infusion.time&val": "주입 시간: %s", + + "biome.betterend.foggy_mushroomland": "안개 낀 버섯 지대", + "biome.betterend.dust_wastelands": "칙칙한 불모지", + "biome.betterend.chorus_forest": "후렴 숲", + "biome.betterend.megalake": "거대한 호수", + "biome.betterend.crystal_mountains": "수정 산맥", + + "entity.betterend.dragonfly": "잠자리", + "item.betterend.spawn_egg_dragonfly": "잠자리 생성 알", + + "entity.betterend.end_slime": "엔드 슬라임", + "item.betterend.spawn_egg_end_slime": "엔드 슬라임 생성 알", + + "block.betterend.end_mycelium": "엔드 균사체", + "block.betterend.end_moss": "엔드 이끼", + "block.betterend.endstone_dust": "엔드 돌 가루", + + "block.betterend.end_mycelium_path": "엔드 균사체 길", + "block.betterend.end_moss_path": "엔드 이끼 길", + + "block.betterend.ender_ore": "엔더 원석", + "block.betterend.terminite_block": "터미나이트 블록", + "block.betterend.aeternium_block": "에테르늄 블록", + "block.betterend.ender_block": "엔더 블록", + "block.betterend.end_stone_smelter": "엔드 돌 용광로", + + "item.betterend.ender_dust": "엔더 가루", + "item.betterend.ender_shard": "엔더 조각", + "item.betterend.terminite_ingot": "터미나이트 주괴", + "item.betterend.aeternium_ingot": "에테르늄 주괴", + "item.betterend.terminite_helmet": "터미나이트 투구", + "item.betterend.terminite_chestplate": "터미나이트 흉갑", + "item.betterend.terminite_leggings": "터미나이트 각반", + "item.betterend.terminite_boots": "터미나이트 부츠", + "item.betterend.terminite_shovel": "터미나이트 삽", + "item.betterend.terminite_sword": "터미나이트 검", + "item.betterend.terminite_pickaxe": "터미나이트 곡괭이", + "item.betterend.terminite_axe": "터미나이트 도끼", + "item.betterend.terminite_hoe": "터미나이트 괭이", + "item.betterend.terminite_hammer": "터미나이트 단조 망치", + "item.betterend.aeternium_helmet": "에테르늄 투구", + "item.betterend.aeternium_chestplate": "에테르늄 흉갑", + "item.betterend.aeternium_leggings": "에테르늄 각반", + "item.betterend.aeternium_boots": "에테르늄 부츠", + "item.betterend.aeternium_shovel": "에테르늄 삽", + "item.betterend.aeternium_sword": "에테르늄 검", + "item.betterend.aeternium_pickaxe": "에테르늄 곡괭이", + "item.betterend.aeternium_axe": "에테르늄 도끼", + "item.betterend.aeternium_hoe": "에테르늄 괭이", + "item.betterend.aeternium_hammer": "에테르늄 단조 망치", + "item.betterend.iron_hammer": "철 단조 망치", + "item.betterend.golden_hammer": "황금 단조 망치", + "item.betterend.diamond_hammer": "다이아몬드 단조 망치", + "item.betterend.netherite_hammer": "네더라이트 단조 망치", + "item.betterend.crystalite_boots": "크리스탈라이트 부츠", + "item.betterend.crystalite_chestplate": "크리스탈라이트 흉갑", + "item.betterend.crystalite_helmet": "크리스탈라이트 투구", + "item.betterend.crystalite_leggings": "크리스탈라이트 각반", + "item.betterend.aeternium_axe_head": "에테르늄 도끼 머리", + "item.betterend.aeternium_hammer_head": "에테르늄 망치 머리", + "item.betterend.aeternium_hoe_head": "에테르늄 괭이 머리", + "item.betterend.aeternium_pickaxe_head": "에테르늄 곡괭이 머리", + "item.betterend.aeternium_shovel_head": "에테르늄 삽 머리", + "item.betterend.aeternium_sword_blade": "에테르늄 검 날", + "item.betterend.aeternium_sword_handle": "에테르늄 검 손잡이", + "item.betterend.leather_stripe": "가죽끈", + "item.betterend.leather_wrapped_stick": "가죽을 감은 막대기", + + "effect.betterend.end_veil": "엔드 베일", + "enchantment.betterend.end_veil": "엔드 베일", + "item.minecraft.potion.effect.end_veil": "엔드 베일의 물약", + "item.minecraft.potion.effect.long_end_veil": "엔드 베일의 물약", + "item.minecraft.splash_potion.effect.end_veil": "투척용 엔드 베일의 물약", + "item.minecraft.splash_potion.effect.long_end_veil": "투척용 엔드 베일의 물약", + "item.minecraft.lingering_potion.effect.end_veil": "잔류형 엔드 베일의 물약", + "item.minecraft.lingering_potion.effect.long_end_veil": "잔류형 엔드 베일의 물약", + "item.minecraft.tipped_arrow.effect.end_veil": "엔드 베일의 화살", + "item.minecraft.tipped_arrow.effect.long_end_veil": "엔드 베일의 화살", + + "block.betterend.mossy_glowshroom_sapling": "이끼 낀 발광버섯 묘목", + "block.betterend.mossy_glowshroom_cap": "이끼 낀 발광버섯 갓", + "block.betterend.mossy_glowshroom_fur": "이끼 낀 발광버섯 털", + "block.betterend.mossy_glowshroom_hymenophore": "이끼 낀 발광버섯 자실층탁", + "block.betterend.mossy_glowshroom_bark": "이끼 낀 발광버섯", + "block.betterend.mossy_glowshroom_barrel": "이끼 낀 발광버섯 통", + "block.betterend.mossy_glowshroom_button": "이끼 낀 발광버섯 버튼", + "block.betterend.mossy_glowshroom_chest": "이끼 낀 발광버섯 상자", + "block.betterend.mossy_glowshroom_crafting_table": "이끼 낀 발광버섯 제작대", + "block.betterend.mossy_glowshroom_door": "이끼 낀 발광버섯 문", + "block.betterend.mossy_glowshroom_fence": "이끼 낀 발광버섯 울타리", + "block.betterend.mossy_glowshroom_gate": "이끼 낀 발광버섯 울타리 문", + "block.betterend.mossy_glowshroom_ladder": "이끼 낀 발광버섯 사다리", + "block.betterend.mossy_glowshroom_log": "이끼 낀 발광버섯 원목", + "block.betterend.mossy_glowshroom_planks": "이끼 낀 발광버섯 판자", + "block.betterend.mossy_glowshroom_plate": "이끼 낀 발광버섯 압력판", + "block.betterend.mossy_glowshroom_sign": "이끼 낀 발광버섯 표지판", + "block.betterend.mossy_glowshroom_slab": "이끼 낀 발광버섯 반 블록", + "block.betterend.mossy_glowshroom_stairs": "이끼 낀 발광버섯 계단", + "block.betterend.mossy_glowshroom_stripped_bark": "껍질 벗긴 이끼 낀 발광버섯", + "block.betterend.mossy_glowshroom_stripped_log": "껍질 벗긴 이끼 낀 발광버섯 원목", + "block.betterend.mossy_glowshroom_trapdoor": "이끼 낀 발광버섯 다락문", + + "block.betterend.umbrella_moss": "우산 이끼", + "block.betterend.umbrella_moss_tall": "긴 우산 이끼", + "block.betterend.creeping_moss": "포복성 이끼", + + "block.betterend.blue_vine_seed": "파란색 덩굴 씨앗", + "block.betterend.blue_vine": "파란색 덩굴", + "block.betterend.blue_vine_lantern": "파란색 덩굴 랜턴", + "block.betterend.blue_vine_fur": "파란색 덩굴 털", + + "block.betterend.dense_vine": "조밀한 덩굴", + "block.betterend.bubble_coral": "거품 산호", + "block.betterend.aurora_crystal": "오로라 수정", + "item.betterend.crystal_shards": "수정 조각", + + "block.betterend.pythadendron_sapling": "피타덴드론 묘목", + "block.betterend.pythadendron_bark": "피타덴드론", + "block.betterend.pythadendron_barrel": "피타덴드론 통", + "block.betterend.pythadendron_button": "피타덴드론 버튼", + "block.betterend.pythadendron_chest": "피타덴드론 상자", + "block.betterend.pythadendron_crafting_table": "피타덴드론 제작대", + "block.betterend.pythadendron_door": "피타덴드론 문", + "block.betterend.pythadendron_fence": "피타덴드론 울타리", + "block.betterend.pythadendron_gate": "피타덴드론 울타리 문", + "block.betterend.pythadendron_ladder": "피타덴드론 사다리", + "block.betterend.pythadendron_log": "피타덴드론 원목", + "block.betterend.pythadendron_planks": "피타덴드론 판자", + "block.betterend.pythadendron_plate": "피타덴드론 압력판", + "block.betterend.pythadendron_sign": "피타덴드론 표지판", + "block.betterend.pythadendron_slab": "피타덴드론 반 블록", + "block.betterend.pythadendron_stairs": "피타덴드론 계단", + "block.betterend.pythadendron_stripped_bark": "껍질 벗긴 피타덴드론", + "block.betterend.pythadendron_stripped_log": "껍질 벗긴 피타덴드론 원목", + "block.betterend.pythadendron_trapdoor": "피타덴드론 다락문", + + "block.betterend.chorus_nylium": "후렴 네사체", + "block.betterend.chorus_nylium_path": "후렴 네사체 길", + "block.betterend.chorus_grass": "후렴 잔디", + + "block.betterend.end_lily": "엔드 수련", + "block.betterend.end_lily_seed": "엔드 수련 씨앗", + "item.betterend.end_lily_leaf": "엔드 수련 잎", + "item.betterend.end_lily_leaf_dried": "말린 엔드 수련 잎", + + "block.betterend.violecite": "바이올사이트", + "block.betterend.violecite_bricks": "바이올사이트 벽돌", + "block.betterend.violecite_bricks_slab": "바이올사이트 벽돌 반 블록", + "block.betterend.violecite_bricks_stairs": "바이올사이트 벽돌 계단", + "block.betterend.violecite_bricks_wall": "바이올사이트 벽돌 담장", + "block.betterend.violecite_button": "바이올사이트 버튼", + "block.betterend.violecite_pillar": "바이올사이트 기둥", + "block.betterend.violecite_plate": "바이올사이트 압력판", + "block.betterend.violecite_slab": "바이올사이트 반 블록", + "block.betterend.violecite_tiles": "바이올사이트 타일", + "block.betterend.violecite_stairs": "바이올사이트 계단", + "block.betterend.violecite_polished": "윤나는 바이올사이트", + "block.betterend.violecite_wall": "바이올사이트 담장", + "block.betterend.violecite_pedestal": "바이올사이트 받침대", + + "block.betterend.flavolite": "플라보라이트", + "block.betterend.flavolite_bricks": "플라보라이트 벽돌", + "block.betterend.flavolite_bricks_slab": "플라보라이트 벽돌 반 블록", + "block.betterend.flavolite_bricks_stairs": "플라보라이트 벽돌 계단", + "block.betterend.flavolite_bricks_wall": "플라보라이트 벽돌 담장", + "block.betterend.flavolite_button": "플라보라이트 버튼", + "block.betterend.flavolite_pillar": "플라보라이트 기둥", + "block.betterend.flavolite_plate": "플라보라이트 압력판", + "block.betterend.flavolite_slab": "플라보라이트 반 블록", + "block.betterend.flavolite_tiles": "플라보라이트 타일", + "block.betterend.flavolite_stairs": "플라보라이트 계단", + "block.betterend.flavolite_polished": "윤나는 플라보라이트", + "block.betterend.flavolite_wall": "플라보라이트 담장", + "block.betterend.flavolite_pedestal": "플라보라이트 받침대", + + "block.betterend.andesite_pedestal": "안산암 받침대", + "block.betterend.diorite_pedestal": "섬록암 받침대", + "block.betterend.granite_pedestal": "화강암 받침대", + "block.betterend.purpur_pedestal": "퍼퍼 받침대", + "block.betterend.quartz_pedestal": "석영 받침대", + "block.betterend.infusion_pedestal": "주입 받침대", + + "block.betterend.end_lotus_seed": "엔드 연꽃 씨앗", + "block.betterend.end_lotus_stem": "엔드 연꽃 줄기", + "block.betterend.end_lotus_leaf": "엔드 연꽃 잎", + "block.betterend.end_lotus_flower": "엔드 연꽃", + + "block.betterend.end_lotus_bark": "엔드 연꽃", + "block.betterend.end_lotus_barrel": "엔드 연꽃 통", + "block.betterend.end_lotus_button": "엔드 연꽃 버튼", + "block.betterend.end_lotus_chest": "엔드 연꽃 상자", + "block.betterend.end_lotus_crafting_table": "엔드 연꽃 제작대", + "block.betterend.end_lotus_door": "엔드 연꽃 문", + "block.betterend.end_lotus_fence": "엔드 연꽃 울타리", + "block.betterend.end_lotus_gate": "엔드 연꽃 울타리 문", + "block.betterend.end_lotus_ladder": "엔드 연꽃 사다리", + "block.betterend.end_lotus_log": "엔드 연꽃 원목", + "block.betterend.end_lotus_planks": "엔드 연꽃 판자", + "block.betterend.end_lotus_plate": "엔드 연꽃 압력판", + "block.betterend.end_lotus_sign": "엔드 연꽃 표지판", + "block.betterend.end_lotus_slab": "엔드 연꽃 반 블록", + "block.betterend.end_lotus_stairs": "엔드 연꽃 계단", + "block.betterend.end_lotus_stripped_bark": "껍질 벗긴 엔드 연꽃", + "block.betterend.end_lotus_stripped_log": "껍질 벗긴 엔드 연꽃 원목", + "block.betterend.end_lotus_trapdoor": "엔드 연꽃 다락문", + + "block.betterend.cave_moss": "동굴 이끼", + "block.betterend.cave_grass": "동굴 잔디", + "block.betterend.cave_bush": "동굴 덤불", + + "block.betterend.cave_moss_path": "동굴 이끼 길", + "block.betterend.crystal_moss": "수정 이끼", + "block.betterend.crystal_moss_path": "수정 이끼 길", + "block.betterend.pythadendron_leaves": "피타덴드론 잎", + "item.betterend.spawn_egg_end_fish": "엔드 물고기 생성 알", + "block.betterend.crystal_grass": "수정 잔디", + + "block.betterend.flavolite_runed": "룬을 새긴 플라보라이트", + "block.betterend.end_portal_block": "엔드 포탈", + "block.betterend.eternal_pedestal": "영원한 받침대", + "block.betterend.flavolite_runed_eternal": "영원한 룬을 새긴 플라보라이트", + "item.betterend.eternal_crystal": "영원한 수정", + + "block.betterend.lacugrove_bark": "라쿠그로브", + "block.betterend.lacugrove_barrel": "라쿠그로브 통", + "block.betterend.lacugrove_button": "라쿠그로브 버튼", + "block.betterend.lacugrove_chest": "라쿠그로브 상자", + "block.betterend.lacugrove_crafting_table": "라쿠그로브 제작대", + "block.betterend.lacugrove_door": "라쿠그로브 문", + "block.betterend.lacugrove_fence": "라쿠그로브 울타리", + "block.betterend.lacugrove_gate": "라쿠그로브 울타리 문", + "block.betterend.lacugrove_ladder": "라쿠그로브 사다리", + "block.betterend.lacugrove_log": "라쿠그로브 원목", + "block.betterend.lacugrove_planks": "라쿠그로브 판자", + "block.betterend.lacugrove_plate": "라쿠그로브 압력판", + "block.betterend.lacugrove_sign": "라쿠그로브 표지판", + "block.betterend.lacugrove_slab": "라쿠그로브 반 블록", + "block.betterend.lacugrove_stairs": "라쿠그로브 계단", + "block.betterend.lacugrove_stripped_bark": "껍질 벗긴 라쿠그로브", + "block.betterend.lacugrove_stripped_log": "껍질 벗긴 라쿠그로브 원목", + "block.betterend.lacugrove_trapdoor": "라쿠그로브 다락문", + + "block.betterend.lacugrove_leaves": "라쿠그로브 잎", + "block.betterend.lacugrove_sapling": "라쿠그로브 묘목", + + "biome.betterend.megalake_grove": "거대한 호수 숲", + "biome.betterend.painted_mountains": "채색 산맥", + + "block.betterend.dragon_tree_bark": "용혈수", + "block.betterend.dragon_tree_barrel": "용혈수 통", + "block.betterend.dragon_tree_button": "용혈수 버튼", + "block.betterend.dragon_tree_chest": "용혈수 상자", + "block.betterend.dragon_tree_crafting_table": "용혈수 제작대", + "block.betterend.dragon_tree_door": "용혈수 문", + "block.betterend.dragon_tree_fence": "용혈수 울타리", + "block.betterend.dragon_tree_gate": "용혈수 울타리 문", + "block.betterend.dragon_tree_ladder": "용혈수 사다리", + "block.betterend.dragon_tree_log": "용혈수 원목", + "block.betterend.dragon_tree_planks": "용혈수 판자", + "block.betterend.dragon_tree_plate": "용혈수 압력판", + "block.betterend.dragon_tree_sign": "용혈수 표지판", + "block.betterend.dragon_tree_slab": "용혈수 반 블록", + "block.betterend.dragon_tree_stairs": "용혈수 계단", + "block.betterend.dragon_tree_stripped_bark": "껍질 벗긴 용혈수", + "block.betterend.dragon_tree_stripped_log": "껍질 벗긴 용혈수 원목", + "block.betterend.dragon_tree_trapdoor": "용혈수 다락문", + + "biome.betterend.shadow_forest": "그림자 숲", + "block.betterend.dragon_tree_leaves": "용혈수 잎", + "block.betterend.dragon_tree_sapling": "용혈수 묘목", + "block.betterend.shadow_grass": "그림자 잔디", + "block.betterend.shadow_grass_path": "그림자 잔디 길", + "block.betterend.shadow_plant": "그림자 식물", + + "block.betterend.dragon_tree_bookshelf": "용혈수 책장", + "block.betterend.end_lotus_bookshelf": "엔드 연꽃 책장", + "block.betterend.lacugrove_bookshelf": "라쿠그로브 책장", + "block.betterend.mossy_glowshroom_bookshelf": "이끼 낀 발광버섯 책장", + "block.betterend.pythadendron_bookshelf": "피타덴드론 책장", + + "block.betterend.murkweed": "컴컴한풀", + "block.betterend.needlegrass": "털수염풀", + "block.betterend.twisted_vine": "뒤틀린 덩굴", + + "block.betterend.shadow_berry": "그림자 열매 씨앗", + "item.betterend.shadow_berry_cooked": "익힌 그림자 열매", + "item.betterend.shadow_berry_raw": "그림자 열매", + "block.betterend.purple_polypore": "보라색 버섯", + + "block.betterend.cyan_moss": "청록색 이끼", + "block.betterend.tail_moss": "꼬리 이끼", + + "block.betterend.flavolite_lantern": "플라보라이트 랜턴", + "block.betterend.end_stone_lantern": "엔드 돌 랜턴", + "block.betterend.violecite_lantern": "바이올사이트 랜턴", + + "entity.betterend.end_fish": "엔드 물고기", + "entity.betterend.shadow_walker": "그림자 워커", + "item.betterend.spawn_egg_shadow_walker": "그림자 워커 생성 알", + + "block.betterend.andesite_lantern": "안산암 랜턴", + "block.betterend.blackstone_lantern": "흑암 랜턴", + "block.betterend.diorite_lantern": "섬록암 랜턴", + "block.betterend.granite_lantern": "화강암 랜턴", + "block.betterend.purpur_lantern": "퍼퍼 랜턴", + "block.betterend.quartz_lantern": "석영 랜턴", + + "item.betterend.bucket_end_fish": "엔드 물고기가 담긴 양동이", + "item.betterend.end_fish_cooked": "익힌 엔드 물고기", + "item.betterend.end_fish_raw": "엔드 물고기", + + "biome.betterend.amber_land": "호박 지대", + "biome.betterend.blossoming_spires": "만발한 첨탑", + "block.betterend.amber_grass": "호박 잔디", + "block.betterend.amber_grass_path": "호박 잔디 길", + "block.betterend.tenanea_bark": "테나네아", + "block.betterend.tenanea_barrel": "테나네아 통", + "block.betterend.tenanea_bookshelf": "테나네아 책장", + "block.betterend.tenanea_button": "테나네아 버튼", + "block.betterend.tenanea_chest": "테나네아 상자", + "block.betterend.tenanea_crafting_table": "테나네아 제작대", + "block.betterend.tenanea_door": "테나네아 문", + "block.betterend.tenanea_fence": "테나네아 울타리", + "block.betterend.tenanea_gate": "테나네아 울타리 문", + "block.betterend.tenanea_ladder": "테나네아 사다리", + "block.betterend.tenanea_leaves": "테나네아 잎", + "block.betterend.tenanea_log": "테나네아 원목", + "block.betterend.tenanea_planks": "테나네아 판자", + "block.betterend.tenanea_plate": "테나네아 압력판", + "block.betterend.tenanea_sapling": "테나네아 묘목", + "block.betterend.tenanea_sign": "테나네아 표지판", + "block.betterend.tenanea_slab": "테나네아 반 블록", + "block.betterend.tenanea_stairs": "테나네아 계단", + "block.betterend.tenanea_stripped_bark": "껍질 벗긴 테나네아", + "block.betterend.tenanea_stripped_log": "껍질 벗긴 테나네아 원목", + "block.betterend.tenanea_trapdoor": "테나네아 다락문", + + "block.betterend.amber_block": "호박 블록", + "block.betterend.amber_ore": "호박 원석", + "item.betterend.amber_gem": "호박", + "item.betterend.raw_amber": "가공하지 않은 호박", + "block.betterend.tenanea_flowers": "테나네아 꽃", + "block.betterend.tenanea_outer_leaves": "테나네아 겉잎", + + "block.betterend.pink_moss": "분홍색 이끼", + "block.betterend.pink_moss_path": "분홍색 이끼 길", + + "block.betterend.twisted_moss": "뒤틀린 이끼", + + "block.betterend.bulb_vine": "구근 덩굴", + "block.betterend.bulb_vine_seed": "구근 덩굴 씨앗", + "item.betterend.glowing_bulb": "발광 구근", + + "block.betterend.iron_bulb_lantern": "철 구근 랜턴", + "block.betterend.iron_bulb_lantern_black": "검은색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_blue": "파란색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_brown": "갈색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_cyan": "청록색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_gray": "회색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_green": "초록색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_light_blue": "하늘색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_light_gray": "회백색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_lime": "연두색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_magenta": "자홍색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_orange": "주황색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_pink": "분홍색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_purple": "보라색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_red": "빨간색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_white": "흰색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_yellow": "노란색 철 구근 랜턴", + + "block.betterend.thallasium_bulb_lantern": "탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_black": "검은색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_blue": "파란색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_brown": "갈색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_cyan": "청록색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_gray": "회색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_green": "초록색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_light_blue": "하늘색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_light_gray": "회백색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_lime": "연두색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_magenta": "자홍색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_orange": "주황색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_pink": "분홍색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_purple": "보라색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_red": "빨간색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_white": "흰색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_yellow": "노란색 탈라슘 구근 랜턴", + + "block.betterend.bushy_grass": "무성한 잔디", + + "block.betterend.brimstone": "유황석", + "block.betterend.sulphuric_rock": "유황암", + "block.betterend.sulphuric_rock_bricks": "유황암 벽돌", + "block.betterend.sulphuric_rock_bricks_slab": "유황암 벽돌 반 블록", + "block.betterend.sulphuric_rock_bricks_stairs": "유황암 벽돌 계단", + "block.betterend.sulphuric_rock_bricks_wall": "유황암 벽돌 담장", + "block.betterend.sulphuric_rock_button": "유황암 버튼", + "block.betterend.sulphuric_rock_lantern": "유황암 랜턴", + "block.betterend.sulphuric_rock_pedestal": "유황암 받침대", + "block.betterend.sulphuric_rock_pillar": "유황암 기둥", + "block.betterend.sulphuric_rock_plate": "유황암 압력판", + "block.betterend.sulphuric_rock_polished": "윤나는 유황암", + "block.betterend.sulphuric_rock_slab": "유황암 반 블록", + "block.betterend.sulphuric_rock_stairs": "유황암 계단", + "block.betterend.sulphuric_rock_tiles": "유황암 타일", + "block.betterend.sulphuric_rock_wall": "유황암 담장", + "block.betterend.sulphur_crystal": "유황 수정", + "item.betterend.crystalline_sulphur": "유황", + + "biome.betterend.sulphur_springs": "유황천", + "block.betterend.hydralux_petal_block": "하이드라럭스 꽃잎 블록", + "block.betterend.hydralux_petal_block_black": "검은색 꽃잎 블록", + "block.betterend.hydralux_petal_block_blue": "파란색 꽃잎 블록", + "block.betterend.hydralux_petal_block_brown": "갈색 꽃잎 블록", + "block.betterend.hydralux_petal_block_cyan": "청록색 꽃잎 블록", + "block.betterend.hydralux_petal_block_gray": "회색 꽃잎 블록", + "block.betterend.hydralux_petal_block_green": "초록색 꽃잎 블록", + "block.betterend.hydralux_petal_block_light_blue": "하늘색 꽃잎 블록", + "block.betterend.hydralux_petal_block_light_gray": "회백색 꽃잎 블록", + "block.betterend.hydralux_petal_block_lime": "연두색 꽃잎 블록", + "block.betterend.hydralux_petal_block_magenta": "자홍색 꽃잎 블록", + "block.betterend.hydralux_petal_block_orange": "주황색 꽃잎 블록", + "block.betterend.hydralux_petal_block_pink": "분홍색 꽃잎 블록", + "block.betterend.hydralux_petal_block_purple": "보라색 꽃잎 블록", + "block.betterend.hydralux_petal_block_red": "빨간색 꽃잎 블록", + "block.betterend.hydralux_petal_block_white": "흰색 꽃잎 블록", + "block.betterend.hydralux_petal_block_yellow": "노란색 꽃잎 블록", + "block.betterend.hydralux_sapling": "하이드라럭스 묘목", + "block.betterend.hydrothermal_vent": "열수구", + "item.betterend.hydralux_petal": "하이드라럭스 꽃잎", + "item.betterend.enchanted_petal": "마법이 부여된 꽃잎", + + "block.betterend.menger_sponge": "멩거 스펀지", + "block.betterend.menger_sponge_wet": "젖은 멩거 스펀지", + "block.betterend.tube_worm": "관벌레", + + "block.betterend.charnia_cyan": "청록색 차니아", + "block.betterend.charnia_light_blue": "하늘색 차니아", + "block.betterend.charnia_orange": "주황색 차니아", + "block.betterend.charnia_purple": "보라색 차니아", + "block.betterend.charnia_red": "빨간색 차니아", + + "entity.betterend.cubozoa": "상자해파리", + "item.betterend.spawn_egg_cubozoa": "상자해파리 생성 알", + + "item.betterend.gelatine": "젤라틴", + "item.betterend.sweet_berry_jelly": "달콤한 열매 젤리", + "item.betterend.shadow_berry_jelly": "그림자 열매 젤리", + + "block.betterend.amber_moss": "호박 이끼", + "block.betterend.amber_moss_path": "호박 이끼 길", + "block.betterend.helix_tree_bark": "나선형 나무", + "block.betterend.helix_tree_barrel": "나선형 나무 통", + "block.betterend.helix_tree_bookshelf": "나선형 나무 책장", + "block.betterend.helix_tree_button": "나선형 나무 버튼", + "block.betterend.helix_tree_chest": "나선형 나무 상자", + "block.betterend.helix_tree_crafting_table": "나선형 나무 제작대", + "block.betterend.helix_tree_door": "나선형 나무 문", + "block.betterend.helix_tree_fence": "나선형 나무 울타리", + "block.betterend.helix_tree_gate": "나선형 나무 울타리 문", + "block.betterend.helix_tree_ladder": "나선형 나무 사다리", + "block.betterend.helix_tree_leaves": "나선형 나무 잎", + "block.betterend.helix_tree_log": "나선형 나무 원목", + "block.betterend.helix_tree_planks": "나선형 나무 판자", + "block.betterend.helix_tree_plate": "나선형 나무 압력판", + "block.betterend.helix_tree_sapling": "나선형 나무 묘목", + "block.betterend.helix_tree_sign": "나선형 나무 표지판", + "block.betterend.helix_tree_slab": "나선형 나무 반 블록", + "block.betterend.helix_tree_stairs": "나선형 나무 계단", + "block.betterend.helix_tree_stripped_bark": "껍질 벗긴 나선형 나무", + "block.betterend.helix_tree_stripped_log": "껍질 벗긴 나선형 나무 원목", + "block.betterend.helix_tree_trapdoor": "나선형 나무 다락문", + "block.betterend.lanceleaf": "창엽", + "block.betterend.lanceleaf_seed": "창엽 씨앗", + "block.betterend.hydralux": "하이드라럭스", + "block.betterend.helix_tree_luminophor": "나선형 나무 발광체", + + "block.betterend.glowing_pillar_leaves": "발광 기둥 잎", + "block.betterend.glowing_pillar_luminophor": "발광 기둥 발광체", + "block.betterend.glowing_pillar_roots": "발광 기둥 뿌리", + "block.betterend.glowing_pillar_seed": "발광 기둥 씨앗", + + "biome.betterend.ice_starfield": "얼음 별", + + "block.betterend.ancient_emerald_ice": "고대의 에메랄드 얼음", + "block.betterend.dense_emerald_ice": "조밀한 에메랄드 얼음", + "block.betterend.dense_snow": "조밀한 눈", + "block.betterend.emerald_ice": "에메랄드 얼음", + + "block.betterend.bulb_moss": "구근 이끼", + + "block.betterend.charnia_green": "초록색 차니아", + "block.betterend.vent_bubble_column": "거품 분출 기둥", + "block.betterend.respawn_obelisk": "리스폰 오벨리스크", + "message.betterend.set_spawn": "\u00A7b\u00A7l리스폰 지점을 설정했습니다", + "message.betterend.fail_spawn": "\u00A7c\u00A7l호박 6개를 가지고 있어야 리스폰 지점을 설정할 수 있습니다", + + "block.betterend.dragon_tree_composter": "용혈수 퇴비통", + "block.betterend.end_lotus_composter": "엔드 연꽃 퇴비통", + "block.betterend.helix_tree_composter": "나선형 나무 퇴비통", + "block.betterend.lacugrove_composter": "라쿠그로브 퇴비통", + "block.betterend.mossy_glowshroom_composter": "이끼 낀 발광버섯 퇴비통", + "block.betterend.pythadendron_composter": "피타덴드론 퇴비통", + "block.betterend.tenanea_composter": "테나네아 퇴비통", + + "biome.betterend.old_bulbis_gardens": "오래된 구근 정원", + "block.betterend.ivis_moss": "이비스 이끼", + "block.betterend.ivis_vine": "이비스 덩굴", + "block.betterend.silk_moth_nest": "비단나방 둥지", + + "block.betterend.umbrella_tree_bark": "우산 나무", + "block.betterend.umbrella_tree_barrel": "우산 나무 통", + "block.betterend.umbrella_tree_bookshelf": "우산 나무 책장", + "block.betterend.umbrella_tree_button": "우산 나무 버튼", + "block.betterend.umbrella_tree_chest": "우산 나무 상자", + "block.betterend.umbrella_tree_composter": "우산 나무 퇴비통", + "block.betterend.umbrella_tree_crafting_table": "우산 나무 제작대", + "block.betterend.umbrella_tree_door": "우산 나무 문", + "block.betterend.umbrella_tree_fence": "우산 나무 울타리", + "block.betterend.umbrella_tree_gate": "우산 나무 울타리 문", + "block.betterend.umbrella_tree_ladder": "우산 나무 사다리", + "block.betterend.umbrella_tree_log": "우산 나무 원목", + "block.betterend.umbrella_tree_planks": "우산 나무 판자", + "block.betterend.umbrella_tree_plate": "우산 나무 압력판", + "block.betterend.umbrella_tree_sign": "우산 나무 표지판", + "block.betterend.umbrella_tree_slab": "우산 나무 반 블록", + "block.betterend.umbrella_tree_stairs": "우산 나무 계단", + "block.betterend.umbrella_tree_stripped_bark": "껍질 벗긴 우산 나무", + "block.betterend.umbrella_tree_stripped_log": "껍질 벗긴 우산 나무 원목", + "block.betterend.umbrella_tree_trapdoor": "우산 나무 다락문", + "block.betterend.umbrella_tree_membrane": "우산 나무 막", + + "biome.betterend.umbrella_jungle": "우산 정글", + "block.betterend.jungle_grass": "정글 잔디", + "block.betterend.jungle_moss": "정글 이끼", + "block.betterend.jungle_moss_path": "정글 이끼 길", + "block.betterend.small_jellyshroom": "작은 젤리버섯", + "block.betterend.twisted_umbrella_moss": "뒤틀린 우산 이끼", + "block.betterend.twisted_umbrella_moss_tall": "긴 뒤틀린 우산 이끼", + "block.betterend.umbrella_tree_cluster": "우산 나무 송이", + "block.betterend.umbrella_tree_cluster_empty": "빈 우산 나무 송이", + "block.betterend.jungle_vine": "정글 덩굴", + "block.betterend.jungle_fern": "정글 고사리", + + "block.betterend.jellyshroom_bark": "젤리버섯", + "block.betterend.jellyshroom_barrel": "젤리버섯 통", + "block.betterend.jellyshroom_bookshelf": "젤리버섯 책장", + "block.betterend.jellyshroom_button": "젤리버섯 버튼", + "block.betterend.jellyshroom_cap_purple": "보라색 젤리버섯 갓", + "block.betterend.jellyshroom_chest": "젤리버섯 상자", + "block.betterend.jellyshroom_composter": "젤리버섯 퇴비통", + "block.betterend.jellyshroom_crafting_table": "젤리버섯 제작대", + "block.betterend.jellyshroom_door": "젤리버섯 문", + "block.betterend.jellyshroom_fence": "젤리버섯 울타리", + "block.betterend.jellyshroom_gate": "젤리버섯 울타리 문", + "block.betterend.jellyshroom_ladder": "젤리버섯 사다리", + "block.betterend.jellyshroom_log": "젤리버섯 원목", + "block.betterend.jellyshroom_planks": "젤리버섯 판자", + "block.betterend.jellyshroom_plate": "젤리버섯 압력판", + "block.betterend.jellyshroom_sign": "젤리버섯 표지판", + "block.betterend.jellyshroom_slab": "젤리버섯 반 블록", + "block.betterend.jellyshroom_stairs": "젤리버섯 계단", + "block.betterend.jellyshroom_stripped_bark": "껍질 벗긴 젤리버섯", + "block.betterend.jellyshroom_stripped_log": "껍질 벗긴 젤리버섯 원목", + "block.betterend.jellyshroom_trapdoor": "젤리버섯 다락문", + + "biome.betterend.eterial_grove": "에테리얼 숲", + "block.betterend.umbrella_tree_sapling": "우산 나무 묘목", + "item.betterend.umbrella_cluster_juice": "우산 송이 주스", + "block.betterend.blossom_berry_seed": "만발한 열매 씨앗", + "item.betterend.blossom_berry": "만발한 열매", + + "biome.betterend.nightshade_redwoods": "밤그림자 삼나무 숲", + "block.betterend.nightshade_moss": "밤그림자 이끼", + + "biome.betterend.glowing_grasslands": "빛나는 초원", + "block.betterend.blooming_cooksonia": "만발한 쿡소니아", + "block.betterend.fracturn": "프랙턴", + "block.betterend.lumecorn": "루메콘", + "block.betterend.salteago": "살테고", + "block.betterend.vaiolush_fern": "바이올루시 고사리", + "entity.betterend.silk_moth": "비단나방", + "item.betterend.silk_fiber": "비단 실", + "item.betterend.spawn_egg_silk_moth": "비단나방 생성 알", + + "block.betterend.thallasium_ore": "탈라슘 광석", + "item.betterend.thallasium_axe": "탈라슘 도끼", + "item.betterend.thallasium_hoe": "탈라슘 괭이", + "item.betterend.thallasium_ingot": "탈라슘 주괴", + "item.betterend.thallasium_pickaxe": "탈라슘 곡괭이", + "item.betterend.thallasium_shovel": "탈라슘 삽", + "item.betterend.thallasium_sword": "탈라슘 검", + "block.betterend.thallasium_block": "탈라슘 블록", + + "block.betterend.thallasium_bars": "탈라슘창", + "block.betterend.thallasium_door": "탈라슘 문", + "block.betterend.thallasium_plate": "탈라슘 압력판", + "block.betterend.thallasium_tile": "탈라슘 타일", + "block.betterend.thallasium_trapdoor": "탈라슘 다락문", + + "block.betterend.lumecorn_seed": "루메콘 씨앗", + "item.betterend.lumecorn_rod": "루메콘 막대기", + "block.betterend.thallasium_chandelier": "탈라슘 샹들리에", + + "block.betterend.thallasium_anvil": "탈라슘 모루", + "block.betterend.thallasium_chain": "탈라슘 사슬", + "block.betterend.thallasium_slab": "탈라슘 반 블록", + "block.betterend.thallasium_stairs": "탈라슘 계단", + + "block.betterend.gold_chandelier": "황금 샹들리에", + "block.betterend.iron_chandelier": "철 샹들리에", + "item.betterend.thallasium_nugget": "탈라슘 조각", + + "block.betterend.terminite_anvil": "터미나이트 모루", + "block.betterend.terminite_bars": "터미나이트창", + + "block.betterend.terminite_bulb_lantern": "터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_black": "검은색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_blue": "파란색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_brown": "갈색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_cyan": "청록색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_gray": "회색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_green": "초록색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_light_blue": "하늘색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_light_gray": "회백색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_lime": "연두색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_magenta": "자홍색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_orange": "주황색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_pink": "분홍색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_purple": "보라색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_red": "빨간색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_white": "흰색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_yellow": "노란색 터미나이트 구근 랜턴", + + "block.betterend.terminite_chain": "터미나이트 사슬", + "block.betterend.terminite_chandelier": "터미나이트 샹들리에", + "block.betterend.terminite_door": "터미나이트 문", + "block.betterend.terminite_plate": "터미나이트 압력판", + "block.betterend.terminite_slab": "터미나이트 반 블록", + "block.betterend.terminite_stairs": "터미나이트 계단", + "block.betterend.terminite_tile": "터미나이트 타일", + "block.betterend.terminite_trapdoor": "터미나이트 다락문", + "item.betterend.terminite_nugget": "터미나이트 조각", + "item.betterend.thallasium_boots": "탈라슘 부츠", + "item.betterend.thallasium_chestplate": "탈라슘 흉갑", + "item.betterend.thallasium_hammer": "탈라슘 망치", + "item.betterend.thallasium_helmet": "탈라슘 투구", + "item.betterend.thallasium_leggings": "탈라슘 각반", + "block.betterend.missing_tile": "누락된 타일", + "block.betterend.charcoal_block": "숯 블록", + "block.betterend.end_stone_furnace": "엔드 돌 화로", + "block.betterend.flavolite_furnace": "플라보라이트 화로", + "block.betterend.sulphuric_rock_furnace": "유황암 화로", + "block.betterend.violecite_furnace": "바이올사이트 화로", + + "item.betterend.terminite_axe_head": "터미나이트 도끼 머리", + "item.betterend.terminite_hoe_head": "터미나이트 괭이 머리", + "item.betterend.terminite_pickaxe_head": "터미나이트 곡괭이 머리", + "item.betterend.terminite_shovel_head": "터미나이트 삽 머리", + "item.betterend.terminite_sword_blade": "터미나이트 검 날", + "item.betterend.terminite_sword_handle": "터미나이트 검 손잡이", + "item.betterend.thallasium_axe_head": "탈라슘 도끼 머리", + "item.betterend.thallasium_hoe_head": "탈라슘 괭이 머리", + "item.betterend.thallasium_pickaxe_head": "탈라슘 곡괭이 머리", + "item.betterend.thallasium_shovel_head": "탈라슘 삽 머리", + "item.betterend.thallasium_sword_blade": "탈라슘 검 날", + "item.betterend.thallasium_sword_handle": "탈라슘 검 손잡이", + "block.betterend.aeternium_anvil": "에테르늄 모루" +} From 7563910589128b21aacea24b5e4847183ffea1ee Mon Sep 17 00:00:00 2001 From: Soochaehwa <43947445+laxotor@users.noreply.github.com> Date: Tue, 16 Feb 2021 06:58:32 +0900 Subject: [PATCH 284/463] Add ko_kr --- .../guidebook/ko_kr/categories/biomes.json | 5 ++ .../guidebook/ko_kr/categories/crafting.json | 6 ++ .../guidebook/ko_kr/categories/end_veil.json | 6 ++ .../guidebook/ko_kr/categories/rituals.json | 6 ++ .../ko_kr/entries/rituals/eternal_ritual.json | 44 +++++++++++++ .../entries/rituals/infusion_ritual.json | 64 +++++++++++++++++++ 6 files changed, 131 insertions(+) create mode 100644 src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/biomes.json create mode 100644 src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/crafting.json create mode 100644 src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/end_veil.json create mode 100644 src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/rituals.json create mode 100644 src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/entries/rituals/eternal_ritual.json create mode 100644 src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/entries/rituals/infusion_ritual.json diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/biomes.json b/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/biomes.json new file mode 100644 index 00000000..40e3c944 --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/biomes.json @@ -0,0 +1,5 @@ +{ + "name": "생물 군계", + "description": "작업 중...", + "icon": "betterend:end_mycelium" +} \ No newline at end of file diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/crafting.json b/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/crafting.json new file mode 100644 index 00000000..24252b73 --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/crafting.json @@ -0,0 +1,6 @@ +{ + "name": "제작", + "description": "", + "icon": "betterend:iron_hammer", + "sortnum": 2 +} \ No newline at end of file diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/end_veil.json b/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/end_veil.json new file mode 100644 index 00000000..81cd0798 --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/end_veil.json @@ -0,0 +1,6 @@ +{ + "name": "엔드 베일", + "description": "엔더맨의 눈을 봐도 공격하지 않습니다.", + "icon": "betterend:textures/mob_effect/end_veil.png", + "sortnum": 3 +} \ No newline at end of file diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/rituals.json b/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/rituals.json new file mode 100644 index 00000000..e53476c0 --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/categories/rituals.json @@ -0,0 +1,6 @@ +{ + "name": "의식", + "description": "엔드의 신비로운 예술, 새로운 길과 기회를 여는 비밀 의식.", + "icon": "betterend:infusion_pedestal", + "sortnum": 1 +} \ No newline at end of file diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/entries/rituals/eternal_ritual.json b/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/entries/rituals/eternal_ritual.json new file mode 100644 index 00000000..526fdde4 --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/entries/rituals/eternal_ritual.json @@ -0,0 +1,44 @@ +{ + "name": "영원한 의식", + "icon": "betterend:eternal_pedestal", + "read_by_default": true, + "category": "rituals", + "pages": [ + { + "type": "text", + "text": "\"오버월드로 돌아가는 일은 쉽지 않습니다.\"$(br2)엔드를 여행하는 동안 고대 유적을 발견할 수 있습니다." + }, + { + "type": "image", + "text": "파괴된 (혹은 멀쩡한) $(bold)룬을 새긴 플라보라이트$() 포탈 틀과 주변에 6개의 받침대가 있습니다.", + "border": false, + "images": [ + "betterend:textures/images/eternal_ritual/portal_structure.png" + ] + }, + { + "type": "text", + "text": "이것은 한때 엔드와 오버월드를 연결했던 웅장한 포탈의 잔해입니다.$(br2)포탈을 활성화하려면 포탈 틀을 복구해야 합니다 (파괴된 경우)." + }, + { + "type": "image", + "text": "그리고 6개의 $(bold)영원한 수정$()을 받침대에 놓습니다.", + "border": false, + "images": [ + "betterend:textures/images/eternal_ritual/portal_frame_full.png" + ] + }, + { + "type": "image", + "text": "마지막 수정을 놓으면 포탈이 활성화됩니다.", + "border": false, + "images": [ + "betterend:textures/images/eternal_ritual/ritual_finished.png" + ] + }, + { + "type": "text", + "text": "$(bold)룬을 새긴 플라보라이트$() (포탈 틀 복구용) 및 $(bold)영원한 수정$()은 $(l:rituals/infusion_ritual)주입 의식$(/l)을 통해 얻을 수 있습니다." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/entries/rituals/infusion_ritual.json b/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/entries/rituals/infusion_ritual.json new file mode 100644 index 00000000..9fd621e1 --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/ko_kr/entries/rituals/infusion_ritual.json @@ -0,0 +1,64 @@ +{ + "name": "주입 의식", + "icon": "betterend:infusion_pedestal", + "read_by_default": true, + "category": "rituals", + "pages": [ + { + "type": "text", + "text": "원소의 힘을 아이템에 주입합니다." + }, + { + "type": "crafting", + "title": "재료 준비", + "text": "먼저 $(bold)주입 받침대$()와 8개의 $(bold)아무$() 받침대를 제작해야합니다.", + "recipe": "betterend:infusion_pedestal" + }, + { + "type": "image", + "text": "그 다음 중앙에 주입 받침대를 설치한 후 주위에 다른 받침대를 설치합니다.", + "border": true, + "images": [ + "betterend:textures/images/infusion_ritual/infusion_ritual_start.png", + "betterend:textures/images/infusion_ritual/infusion_ritual_full.png" + ] + }, + { + "type": "image", + "title": "주입", + "text": "구조물이 완성되면 주입을 할 수 있습니다.", + "border": false, + "images": [ + "betterend:textures/images/infusion_ritual/ritual_structure.png" + ] + }, + { + "type": "image", + "text": "주 재료는 $(bold)주입 받침대$()에 촉매는 다른 받침대에 놓습니다.", + "border": false, + "images": [ + "betterend:textures/images/infusion_ritual/ritual_ready.png" + ] + }, + { + "type": "text", + "text": "$(l:https://www.curseforge.com/minecraft/mc-mods/roughly-enough-items)REI$(/l)를 통해 제작법을 볼 수 있습니다.$(br2)주입을 시작하려면 주 재료를 마지막에 놓거나 $(bold)주입 받침대$()를 우클릭 하세요." + }, + { + "type": "image", + "text": "완료될 때까지 기다려야 합니다.", + "border": false, + "images": [ + "betterend:textures/images/infusion_ritual/ritual_started.png" + ] + }, + { + "type": "image", + "text": "결과물을 가져가세요.", + "border": false, + "images": [ + "betterend:textures/images/infusion_ritual/ritual_finished.png" + ] + } + ] +} \ No newline at end of file From 588444f91196d23b0c71324365ee51044805ec03 Mon Sep 17 00:00:00 2001 From: Soochaehwa <43947445+laxotor@users.noreply.github.com> Date: Tue, 16 Feb 2021 07:07:57 +0900 Subject: [PATCH 285/463] Update eternal_ritual.json --- .../guidebook/en_us/entries/rituals/eternal_ritual.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/en_us/entries/rituals/eternal_ritual.json b/src/main/resources/data/betterend/patchouli_books/guidebook/en_us/entries/rituals/eternal_ritual.json index df008a72..dc587602 100644 --- a/src/main/resources/data/betterend/patchouli_books/guidebook/en_us/entries/rituals/eternal_ritual.json +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/en_us/entries/rituals/eternal_ritual.json @@ -10,7 +10,7 @@ }, { "type": "image", - "text": "There is a destroyed (or not) frame of $(bold)Runed Flavolite$() and eight pedestals around it.", + "text": "There is a destroyed (or not) frame of $(bold)Runed Flavolite$() and six pedestals around it.", "border": false, "images": [ "betterend:textures/images/eternal_ritual/portal_structure.png" @@ -22,7 +22,7 @@ }, { "type": "image", - "text": "And place 8 $(bold)Eternal Crystals$() to pedestals.", + "text": "And place 6 $(bold)Eternal Crystals$() to pedestals.", "border": false, "images": [ "betterend:textures/images/eternal_ritual/portal_frame_full.png" @@ -41,4 +41,4 @@ "text": "$(bold)Runed Flavolite$() (to recover the frame) and $(bold)Eternal Crystals$() can be obtained by $(l:rituals/infusion_ritual)Infusion Rilual$(/l)." } ] -} \ No newline at end of file +} From ee4c4aed738c789a921a1cdb1991ca300da2dd5c Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 19 Feb 2021 17:38:39 +0300 Subject: [PATCH 286/463] End portals storage --- src/main/java/ru/betterend/BetterEnd.java | 2 + .../ru/betterend/registry/EndPortals.java | 111 ++++++++++++++++++ .../java/ru/betterend/util/JsonFactory.java | 5 + 3 files changed, 118 insertions(+) create mode 100644 src/main/java/ru/betterend/registry/EndPortals.java diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index 4cf23d03..47daecc1 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -27,6 +27,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndItems; +import ru.betterend.registry.EndPortals; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; import ru.betterend.registry.EndTags; @@ -63,6 +64,7 @@ public class BetterEnd implements ModInitializer { Integrations.register(); BonemealUtil.init(); GeneratorOptions.init(); + EndPortals.loadPortals(); if (hasGuideBook()) { GuideBookItem.register(); diff --git a/src/main/java/ru/betterend/registry/EndPortals.java b/src/main/java/ru/betterend/registry/EndPortals.java new file mode 100644 index 00000000..d9fdfe5e --- /dev/null +++ b/src/main/java/ru/betterend/registry/EndPortals.java @@ -0,0 +1,111 @@ +package ru.betterend.registry; + +import java.io.File; +import java.util.Iterator; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.Identifier; +import ru.betterend.config.ConfigWriter; +import ru.betterend.util.JsonFactory; +import ru.betterend.util.MHelper; + +public class EndPortals { + private static PortalInfo[] portals; + + public static void loadPortals() { + File file = new File(ConfigWriter.MOD_CONFIG_DIR, "portals.json"); + JsonObject json; + if (!file.exists()) { + file.getParentFile().mkdirs(); + json = makeDefault(file); + } + else { + json = JsonFactory.getJsonObject(file); + } + if (!json.has("portals") || !json.get("portals").isJsonArray()) { + json = makeDefault(file); + } + JsonArray array = json.get("portals").getAsJsonArray(); + if (array.size() == 0) { + json = makeDefault(file); + array = json.get("portals").getAsJsonArray(); + } + portals = new PortalInfo[array.size()]; + for (int i = 0; i < portals.length; i++) { + portals[i] = new PortalInfo(array.get(i).getAsJsonObject()); + } + } + + public static ServerWorld getWorld(MinecraftServer server, int state) { + if (state >= portals.length) { + return server.getOverworld(); + } + return portals[state].getWorld(server); + } + + public static int getColor(int state) { + return portals[state].color; + } + + private static JsonObject makeDefault(File file) { + JsonObject jsonObject = new JsonObject(); + JsonFactory.storeJson(file, jsonObject); + JsonArray array = new JsonArray(); + jsonObject.add("portals", array); + array.add(makeDefault().toJson()); + JsonFactory.storeJson(file, jsonObject); + return jsonObject; + } + + private static PortalInfo makeDefault() { + return new PortalInfo(new Identifier("minecraft:overworld"), 255, 255, 255); + } + + private static class PortalInfo { + private final Identifier dimension; + private final int color; + private ServerWorld world; + + PortalInfo(JsonObject obj) { + this( + new Identifier(JsonFactory.getString(obj, "dimension", "minecraft:overworld")), + JsonFactory.getInt(obj, "colorRed", 255), + JsonFactory.getInt(obj, "colorGreen", 255), + JsonFactory.getInt(obj, "colorBlue", 255) + ); + } + + PortalInfo(Identifier dimension, int r, int g, int b) { + this.dimension = dimension; + this.color = MHelper.color(r, g, b); + } + + ServerWorld getWorld(MinecraftServer server) { + if (world != null) { + return world; + } + Iterator iterator = server.getWorlds().iterator(); + while (iterator.hasNext()) { + ServerWorld world = iterator.next(); + if (world.getRegistryKey().getValue().equals(dimension)) { + this.world = world; + return world; + } + } + return server.getOverworld(); + } + + JsonObject toJson() { + JsonObject obj = new JsonObject(); + obj.addProperty("dimension", dimension.toString()); + obj.addProperty("colorRed", (color >> 16) & 255); + obj.addProperty("colorGreen", (color >> 8) & 255); + obj.addProperty("colorBlue", color & 255); + return obj; + } + } +} diff --git a/src/main/java/ru/betterend/util/JsonFactory.java b/src/main/java/ru/betterend/util/JsonFactory.java index 355f4fa1..c3f24b22 100644 --- a/src/main/java/ru/betterend/util/JsonFactory.java +++ b/src/main/java/ru/betterend/util/JsonFactory.java @@ -69,6 +69,11 @@ public class JsonFactory { } } + public static int getInt(JsonObject object, String member, int def) { + JsonElement elem = object.get(member); + return elem == null ? def : elem.getAsInt(); + } + public static float getFloat(JsonObject object, String member, float def) { JsonElement elem = object.get(member); return elem == null ? def : elem.getAsFloat(); From 269821dee8f1ea00dac5e8749aab70bf06075205 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 19 Feb 2021 17:54:59 +0300 Subject: [PATCH 287/463] Portal property (WIP) --- src/main/java/ru/betterend/BetterEnd.java | 2 +- .../ru/betterend/blocks/BlockProperties.java | 2 ++ .../ru/betterend/blocks/EndPortalBlock.java | 35 +++++++++++++++++-- .../ru/betterend/registry/EndPortals.java | 21 +++++++++-- 4 files changed, 55 insertions(+), 5 deletions(-) diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index 47daecc1..628f2618 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -42,6 +42,7 @@ public class BetterEnd implements ModInitializer { public static final Logger LOGGER = Logger.get(); @Override public void onInitialize() { + EndPortals.loadPortals(); EndSounds.register(); EndItems.register(); EndBlocks.register(); @@ -64,7 +65,6 @@ public class BetterEnd implements ModInitializer { Integrations.register(); BonemealUtil.init(); GeneratorOptions.init(); - EndPortals.loadPortals(); if (hasGuideBook()) { GuideBookItem.register(); diff --git a/src/main/java/ru/betterend/blocks/BlockProperties.java b/src/main/java/ru/betterend/blocks/BlockProperties.java index 4fbf6cbd..34dfb472 100644 --- a/src/main/java/ru/betterend/blocks/BlockProperties.java +++ b/src/main/java/ru/betterend/blocks/BlockProperties.java @@ -4,6 +4,7 @@ import net.minecraft.state.property.BooleanProperty; import net.minecraft.state.property.EnumProperty; import net.minecraft.state.property.IntProperty; import net.minecraft.util.StringIdentifiable; +import ru.betterend.registry.EndPortals; public class BlockProperties { public static final EnumProperty HYDRALUX_SHAPE = EnumProperty.of("shape", HydraluxShape.class); @@ -21,6 +22,7 @@ public class BlockProperties { public static final IntProperty ROTATION = IntProperty.of("rotation", 0, 3); public static final IntProperty FULLNESS = IntProperty.of("fullness", 0, 3); public static final IntProperty COLOR = IntProperty.of("color", 0, 7); + public static final IntProperty PORTAL = IntProperty.of("portal", 0, EndPortals.getCount()); public static enum TripleShape implements StringIdentifiable { TOP("top"), diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index 69fcf6c7..60532d69 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -6,14 +6,20 @@ import java.util.Random; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.NetherPortalBlock; +import net.minecraft.client.color.block.BlockColorProvider; +import net.minecraft.client.color.item.ItemColorProvider; import net.minecraft.entity.Entity; +import net.minecraft.server.MinecraftServer; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvents; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.IntProperty; import net.minecraft.util.BlockRotation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; @@ -26,15 +32,25 @@ import net.minecraft.world.WorldAccess; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.dimension.DimensionType; import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IColorProvider; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.interfaces.TeleportingEntity; import ru.betterend.registry.EndParticles; +import ru.betterend.registry.EndPortals; -public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable { +public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable, IColorProvider { + public static final IntProperty PORTAL = BlockProperties.PORTAL; + public EndPortalBlock() { super(FabricBlockSettings.copyOf(Blocks.NETHER_PORTAL).resistance(Blocks.BEDROCK.getBlastResistance()).luminance(state -> 12)); } + @Override + protected void appendProperties(StateManager.Builder builder) { + super.appendProperties(builder); + builder.add(PORTAL); + } + @Override @Environment(EnvType.CLIENT) public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { @@ -68,7 +84,8 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable if (world instanceof ServerWorld && !entity.hasVehicle() && !entity.hasPassengers() && entity.canUsePortals()) { if (entity.hasNetherPortalCooldown()) return; boolean isOverworld = world.getRegistryKey().equals(World.OVERWORLD); - ServerWorld destination = ((ServerWorld) world).getServer().getWorld(isOverworld ? World.END : World.OVERWORLD); + MinecraftServer server = ((ServerWorld) world).getServer(); + ServerWorld destination = isOverworld ? server.getWorld(World.END) : EndPortals.getWorld(server, state.get(PORTAL)); BlockPos exitPos = this.findExitPos(destination, pos, entity); if (exitPos == null) return; if (entity instanceof ServerPlayerEntity) { @@ -174,4 +191,18 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable } return pos; } + + @Override + public BlockColorProvider getProvider() { + return (state, world, pos, tintIndex) -> { + return EndPortals.getColor(state.get(PORTAL)); + }; + } + + @Override + public ItemColorProvider getItemProvider() { + return (stack, tintIndex) -> { + return EndPortals.getColor(0); + }; + } } diff --git a/src/main/java/ru/betterend/registry/EndPortals.java b/src/main/java/ru/betterend/registry/EndPortals.java index d9fdfe5e..0c5e4733 100644 --- a/src/main/java/ru/betterend/registry/EndPortals.java +++ b/src/main/java/ru/betterend/registry/EndPortals.java @@ -9,6 +9,7 @@ import com.google.gson.JsonObject; import net.minecraft.server.MinecraftServer; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.Identifier; +import ru.betterend.BetterEnd; import ru.betterend.config.ConfigWriter; import ru.betterend.util.JsonFactory; import ru.betterend.util.MHelper; @@ -40,6 +41,10 @@ public class EndPortals { } } + public static int getCount() { + return MHelper.max(portals.length - 1, 1); + } + public static ServerWorld getWorld(MinecraftServer server, int state) { if (state >= portals.length) { return server.getOverworld(); @@ -47,6 +52,15 @@ public class EndPortals { return portals[state].getWorld(server); } + public static int getPortalState(Identifier item) { + for (int i = 0; i < portals.length; i++) { + if (portals[i].item.equals(item)) { + return i; + } + } + return 0; + } + public static int getColor(int state) { return portals[state].color; } @@ -62,25 +76,28 @@ public class EndPortals { } private static PortalInfo makeDefault() { - return new PortalInfo(new Identifier("minecraft:overworld"), 255, 255, 255); + return new PortalInfo(new Identifier("minecraft:overworld"), BetterEnd.makeID("eternal_crystal"), 255, 255, 255); } private static class PortalInfo { private final Identifier dimension; + private final Identifier item; private final int color; private ServerWorld world; PortalInfo(JsonObject obj) { this( new Identifier(JsonFactory.getString(obj, "dimension", "minecraft:overworld")), + new Identifier(JsonFactory.getString(obj, "item", "betterend:eternal_crystal")), JsonFactory.getInt(obj, "colorRed", 255), JsonFactory.getInt(obj, "colorGreen", 255), JsonFactory.getInt(obj, "colorBlue", 255) ); } - PortalInfo(Identifier dimension, int r, int g, int b) { + PortalInfo(Identifier dimension, Identifier item, int r, int g, int b) { this.dimension = dimension; + this.item = item; this.color = MHelper.color(r, g, b); } From 2fabb39f4157e63f3ac9f0985682fe9eb5e3106e Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 19 Feb 2021 18:24:44 +0300 Subject: [PATCH 288/463] Different item keys (WIP) --- .../ru/betterend/blocks/EndPortalBlock.java | 3 +- .../ru/betterend/blocks/EternalPedestal.java | 12 +++-- .../ru/betterend/registry/EndPortals.java | 10 ++++ .../ru/betterend/rituals/EternalRitual.java | 51 ++++++++++++------- 4 files changed, 54 insertions(+), 22 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index 60532d69..ff4ab7d6 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -87,6 +87,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable MinecraftServer server = ((ServerWorld) world).getServer(); ServerWorld destination = isOverworld ? server.getWorld(World.END) : EndPortals.getWorld(server, state.get(PORTAL)); BlockPos exitPos = this.findExitPos(destination, pos, entity); + System.out.println(exitPos); if (exitPos == null) return; if (entity instanceof ServerPlayerEntity) { ServerPlayerEntity player = (ServerPlayerEntity) entity; @@ -124,7 +125,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable Registry registry = world.getRegistryManager().getDimensionTypes(); double mult = Objects.requireNonNull(registry.get(DimensionType.THE_END_ID)).getCoordinateScale(); BlockPos.Mutable basePos; - if (world.getRegistryKey().equals(World.OVERWORLD)) { + if (!world.getRegistryKey().equals(World.END)) { basePos = pos.mutableCopy().set(pos.getX() / mult, pos.getY(), pos.getZ() / mult); } else { basePos = pos.mutableCopy().set(pos.getX() * mult, pos.getY(), pos.getZ() * mult); diff --git a/src/main/java/ru/betterend/blocks/EternalPedestal.java b/src/main/java/ru/betterend/blocks/EternalPedestal.java index 8a5ff3cb..e1a7911e 100644 --- a/src/main/java/ru/betterend/blocks/EternalPedestal.java +++ b/src/main/java/ru/betterend/blocks/EternalPedestal.java @@ -9,13 +9,16 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.entity.BlockEntity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.loot.context.LootContext; import net.minecraft.loot.context.LootContextParameters; import net.minecraft.state.StateManager; import net.minecraft.state.property.BooleanProperty; +import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; +import net.minecraft.util.registry.Registry; import net.minecraft.world.BlockView; import net.minecraft.world.World; import net.minecraft.world.WorldAccess; @@ -23,7 +26,7 @@ import net.minecraft.world.explosion.Explosion; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.entities.EternalPedestalEntity; import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndItems; +import ru.betterend.registry.EndPortals; import ru.betterend.rituals.EternalRitual; public class EternalPedestal extends PedestalBlock { @@ -43,12 +46,15 @@ public class EternalPedestal extends PedestalBlock { if (pedestal.isEmpty() && updatedState.get(ACTIVATED)) { if (pedestal.hasRitual()) { EternalRitual ritual = pedestal.getRitual(); - ritual.removePortal(); + Item item = pedestal.getStack(0).getItem(); + int dim = EndPortals.getPortalState(Registry.ITEM.getId(item)); + ritual.removePortal(dim); } world.setBlockState(pos, updatedState.with(ACTIVATED, false)); } else { ItemStack itemStack = pedestal.getStack(0); - if (itemStack.getItem() == EndItems.ETERNAL_CRYSTAL) { + Identifier id = Registry.ITEM.getId(itemStack.getItem()); + if (EndPortals.isAvailableItem(id)) { world.setBlockState(pos, updatedState.with(ACTIVATED, true)); if (pedestal.hasRitual()) { pedestal.getRitual().checkStructure(); diff --git a/src/main/java/ru/betterend/registry/EndPortals.java b/src/main/java/ru/betterend/registry/EndPortals.java index 0c5e4733..2ff462af 100644 --- a/src/main/java/ru/betterend/registry/EndPortals.java +++ b/src/main/java/ru/betterend/registry/EndPortals.java @@ -65,6 +65,15 @@ public class EndPortals { return portals[state].color; } + public static boolean isAvailableItem(Identifier item) { + for (int i = 0; i < portals.length; i++) { + if (portals[i].item.equals(item)) { + return true; + } + } + return false; + } + private static JsonObject makeDefault(File file) { JsonObject jsonObject = new JsonObject(); JsonFactory.storeJson(file, jsonObject); @@ -119,6 +128,7 @@ public class EndPortals { JsonObject toJson() { JsonObject obj = new JsonObject(); obj.addProperty("dimension", dimension.toString()); + obj.addProperty("item", item.toString()); obj.addProperty("colorRed", (color >> 16) & 255); obj.addProperty("colorGreen", (color >> 8) & 255); obj.addProperty("colorBlue", color & 255); diff --git a/src/main/java/ru/betterend/rituals/EternalRitual.java b/src/main/java/ru/betterend/rituals/EternalRitual.java index e633adea..3d203fc3 100644 --- a/src/main/java/ru/betterend/rituals/EternalRitual.java +++ b/src/main/java/ru/betterend/rituals/EternalRitual.java @@ -10,6 +10,7 @@ import com.google.common.collect.Sets; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Material; +import net.minecraft.item.Item; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtHelper; import net.minecraft.particle.BlockStateParticleEffect; @@ -23,7 +24,6 @@ import net.minecraft.state.property.BooleanProperty; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.util.registry.Registry; -import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.Heightmap; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; @@ -35,6 +35,7 @@ import ru.betterend.blocks.RunedFlavolite; import ru.betterend.blocks.entities.EternalPedestalEntity; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndPortals; public class EternalRitual { private final static Set STRUCTURE_MAP = Sets.newHashSet( @@ -97,13 +98,24 @@ public class EternalRitual { moveY = Direction.EAST; } boolean valid = this.checkFrame(); + Item item = null; for (Point pos : STRUCTURE_MAP) { BlockPos.Mutable checkPos = center.mutableCopy(); checkPos.move(moveX, pos.x).move(moveY, pos.y); valid &= this.isActive(checkPos); + if (valid) { + EternalPedestalEntity pedestal = (EternalPedestalEntity) world.getBlockEntity(checkPos); + Item pItem = pedestal.getStack(0).getItem(); + if (item == null) { + item = pItem; + } + else if (!item.equals(pItem)) { + valid = false; + } + } } - if (valid) { - this.activatePortal(); + if (valid && item != null) { + this.activatePortal(item); } } @@ -126,20 +138,21 @@ public class EternalRitual { return this.active; } - private void activatePortal() { + private void activatePortal(Item item) { if (active) return; - this.activatePortal(world, center); + int state = EndPortals.getPortalState(Registry.ITEM.getId(item)); + this.activatePortal(world, center, state); this.doEffects((ServerWorld) world, center); if (exit == null) { - this.exit = this.findPortalPos(); + this.exit = this.findPortalPos(state); } else { - World targetWorld = this.getTargetWorld(); + World targetWorld = this.getTargetWorld(state); if (targetWorld.getBlockState(exit.up()).isOf(EndBlocks.END_PORTAL_BLOCK)) { - this.exit = this.findPortalPos(); + this.exit = this.findPortalPos(state); } else { - this.activatePortal(targetWorld, exit); + this.activatePortal(targetWorld, exit, state); } } this.active = true; @@ -164,7 +177,7 @@ public class EternalRitual { serverWorld.playSound(null, center, SoundEvents.BLOCK_END_PORTAL_SPAWN, SoundCategory.NEUTRAL, 16, 1); } - private void activatePortal(World world, BlockPos center) { + private void activatePortal(World world, BlockPos center, int dim) { BlockPos framePos = center.down(); Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH : Direction.EAST; BlockState frame = FRAME.getDefaultState().with(ACTIVE, true); @@ -181,7 +194,7 @@ public class EternalRitual { } }); Direction.Axis portalAxis = Direction.Axis.X == axis ? Direction.Axis.Z : Direction.Axis.X; - BlockState portal = PORTAL.getDefaultState().with(EndPortalBlock.AXIS, portalAxis); + BlockState portal = PORTAL.getDefaultState().with(EndPortalBlock.AXIS, portalAxis).with(EndPortalBlock.PORTAL, dim); ParticleEffect effect = new BlockStateParticleEffect(ParticleTypes.BLOCK, portal); ServerWorld serverWorld = (ServerWorld) world; @@ -201,9 +214,9 @@ public class EternalRitual { }); } - public void removePortal() { + public void removePortal(int state) { if (!active || isInvalid()) return; - World targetWorld = this.getTargetWorld(); + World targetWorld = this.getTargetWorld(state); this.removePortal(world, center); this.removePortal(targetWorld, exit); } @@ -236,10 +249,10 @@ public class EternalRitual { this.active = false; } - private BlockPos findPortalPos() { + private BlockPos findPortalPos(int state) { MinecraftServer server = world.getServer(); assert server != null; - ServerWorld targetWorld = (ServerWorld) this.getTargetWorld(); + ServerWorld targetWorld = (ServerWorld) this.getTargetWorld(state); Registry registry = server.getRegistryManager().getDimensionTypes(); double mult = Objects.requireNonNull(registry.get(DimensionType.THE_END_ID)).getCoordinateScale(); BlockPos.Mutable basePos = center.mutableCopy().set(center.getX() / mult, center.getY(), center.getZ() / mult); @@ -281,9 +294,11 @@ public class EternalRitual { return basePos.toImmutable(); } - private World getTargetWorld() { - RegistryKey target = world.getRegistryKey() == World.END ? World.OVERWORLD : World.END; - return Objects.requireNonNull(world.getServer()).getWorld(target); + private World getTargetWorld(int state) { + if (world.getRegistryKey() == World.END) { + return EndPortals.getWorld(world.getServer(), state); + } + return Objects.requireNonNull(world.getServer()).getWorld(World.END); } private boolean checkIsAreaValid(World world, BlockPos pos, Direction.Axis axis) { From f29d69c69b180dcc9fbd747d0c4aa30f930b6f8b Mon Sep 17 00:00:00 2001 From: Aleksey Date: Mon, 22 Feb 2021 10:42:41 +0300 Subject: [PATCH 289/463] - End Stone Smelter REI fuel display - End Furnaces REI fuel and smelting displays --- .../ru/betterend/blocks/CharcoalBlock.java | 2 +- .../entities/EndStoneSmelterBlockEntity.java | 37 ++++---- .../java/ru/betterend/config/Configs.java | 3 +- .../ru/betterend/config/PortalsConfig.java | 19 ++++ .../rei/REIAlloyingFuelCategory.java | 90 +++++++++++++++++++ .../rei/REIAlloyingFuelDisplay.java | 40 +++++++++ .../integration/rei/REIAnvilCategory.java | 5 +- .../betterend/integration/rei/REIPlugin.java | 43 +++++++-- 8 files changed, 205 insertions(+), 34 deletions(-) create mode 100644 src/main/java/ru/betterend/config/PortalsConfig.java create mode 100644 src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java create mode 100644 src/main/java/ru/betterend/integration/rei/REIAlloyingFuelDisplay.java diff --git a/src/main/java/ru/betterend/blocks/CharcoalBlock.java b/src/main/java/ru/betterend/blocks/CharcoalBlock.java index 7097a6e0..8f82f792 100644 --- a/src/main/java/ru/betterend/blocks/CharcoalBlock.java +++ b/src/main/java/ru/betterend/blocks/CharcoalBlock.java @@ -8,6 +8,6 @@ import ru.betterend.blocks.basis.BlockBase; public class CharcoalBlock extends BlockBase { public CharcoalBlock() { super(FabricBlockSettings.copyOf(Blocks.COAL_BLOCK)); - FuelRegistry.INSTANCE.add(this, 6000); + FuelRegistry.INSTANCE.add(this, 16000); } } diff --git a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java index 19c6c0ee..cae5f872 100644 --- a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java @@ -1,17 +1,13 @@ package ru.betterend.blocks.entities; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - import com.google.common.collect.Lists; import com.google.common.collect.Maps; - import it.unimi.dsi.fastutil.objects.Object2IntMap.Entry; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import net.fabricmc.fabric.api.registry.FuelRegistry; +import net.fabricmc.fabric.impl.content.registry.FuelRegistryImpl; import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; +import net.minecraft.block.entity.AbstractFurnaceBlockEntity; import net.minecraft.block.entity.LockableContainerBlockEntity; import net.minecraft.entity.ExperienceOrbEntity; import net.minecraft.entity.player.PlayerEntity; @@ -23,12 +19,7 @@ import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.nbt.CompoundTag; -import net.minecraft.recipe.BlastingRecipe; -import net.minecraft.recipe.Recipe; -import net.minecraft.recipe.RecipeFinder; -import net.minecraft.recipe.RecipeInputProvider; -import net.minecraft.recipe.RecipeType; -import net.minecraft.recipe.RecipeUnlocker; +import net.minecraft.recipe.*; import net.minecraft.screen.PropertyDelegate; import net.minecraft.screen.ScreenHandler; import net.minecraft.text.Text; @@ -46,6 +37,10 @@ import ru.betterend.client.gui.EndStoneSmelterScreenHandler; import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.registry.EndBlockEntities; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity implements SidedInventory, RecipeUnlocker, RecipeInputProvider, Tickable { private static final int[] TOP_SLOTS = new int[] { 0, 1 }; @@ -102,14 +97,6 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp return 4; } }; - - this.registerFuels(); - } - - private void registerFuels() { - registerFuel(Items.LAVA_BUCKET, 16000); - registerFuel(Blocks.COAL_BLOCK, 12000); - registerFuel(Items.BLAZE_ROD, 2000); } private boolean isBurning() { @@ -445,7 +432,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp public static boolean canUseAsFuel(ItemStack stack) { return AVAILABLE_FUELS.containsKey(stack.getItem()) || getFabricFuel(stack) > 2000; } - + public static void registerFuel(ItemConvertible fuel, int time) { AVAILABLE_FUELS.put(fuel.asItem(), time); } @@ -458,4 +445,12 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp Integer ticks = FuelRegistry.INSTANCE.get(stack.getItem()); return ticks == null ? 0 : ticks; } + + static { + AbstractFurnaceBlockEntity.createFuelTimeMap().forEach((item, time) -> { + if (time >= 2000) { + registerFuel(item, time); + } + }); + } } diff --git a/src/main/java/ru/betterend/config/Configs.java b/src/main/java/ru/betterend/config/Configs.java index 0e0590ad..4119842a 100644 --- a/src/main/java/ru/betterend/config/Configs.java +++ b/src/main/java/ru/betterend/config/Configs.java @@ -11,7 +11,8 @@ public class Configs { public static final IdConfig BIOME_CONFIG = new EntryConfig("biomes"); public static final PathConfig GENERATOR_CONFIG = new PathConfig("generator"); public static final PathConfig RECIPE_CONFIG = new PathConfig("recipes"); - + public static final PortalsConfig PORTALS_CONFIG = new PortalsConfig("portals"); + @Environment(value = EnvType.CLIENT) public static final PathConfig CLENT_CONFIG = new PathConfig("client"); diff --git a/src/main/java/ru/betterend/config/PortalsConfig.java b/src/main/java/ru/betterend/config/PortalsConfig.java new file mode 100644 index 00000000..eefe4534 --- /dev/null +++ b/src/main/java/ru/betterend/config/PortalsConfig.java @@ -0,0 +1,19 @@ +package ru.betterend.config; + +import com.google.gson.JsonObject; + +public class PortalsConfig { + + + private final ConfigWriter writer; + private final JsonObject configObject; + + public PortalsConfig(String path) { + this.writer = new ConfigWriter(path); + this.configObject = writer.load(); + } + + public void saveChanges() { + writer.save(); + } +} diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java new file mode 100644 index 00000000..b361096c --- /dev/null +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java @@ -0,0 +1,90 @@ +package ru.betterend.integration.rei; + +import com.google.common.collect.Lists; +import me.shedaniel.math.Point; +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.EntryStack; +import me.shedaniel.rei.api.RecipeCategory; +import me.shedaniel.rei.api.widgets.Slot; +import me.shedaniel.rei.api.widgets.Tooltip; +import me.shedaniel.rei.api.widgets.Widgets; +import me.shedaniel.rei.gui.entries.RecipeEntry; +import me.shedaniel.rei.gui.widget.Widget; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.resource.language.I18n; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.item.Items; +import net.minecraft.text.TranslatableText; +import net.minecraft.util.Identifier; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.text.DecimalFormat; +import java.util.List; + +public class REIAlloyingFuelCategory implements RecipeCategory { + private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#.##"); + + @Override + public @NotNull Identifier getIdentifier() { + return REIPlugin.ALLOYING_FUEL; + } + + @Override + public @NotNull String getCategoryName() { + return I18n.translate("category.rei.fuel"); + } + + @Override + public int getDisplayHeight() { + return 49; + } + + @Override + public @NotNull EntryStack getLogo() { + return EntryStack.create(Items.COAL); + } + + @Override + public @NotNull List setupDisplay(REIAlloyingFuelDisplay recipeDisplay, Rectangle bounds) { + Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 17); + String burnTime = DECIMAL_FORMAT.format(recipeDisplay.getFuelTime()); + List widgets = Lists.newArrayList(); + widgets.add(Widgets.createRecipeBase(bounds)); + widgets.add(Widgets.createLabel(new Point(bounds.x + 26, bounds.getMaxY() - 15), new TranslatableText("category.rei.fuel.time", burnTime)) + .color(0xFF404040, 0xFFBBBBBB).noShadow().leftAligned()); + widgets.add(Widgets.createBurningFire(new Point(bounds.x + 6, startPoint.y + 1)).animationDurationTicks(recipeDisplay.getFuelTime())); + widgets.add(Widgets.createSlot(new Point(bounds.x + 6, startPoint.y + 18)).entries(recipeDisplay.getInputEntries().get(0)).markInput()); + return widgets; + } + + @Override + public @NotNull RecipeEntry getSimpleRenderer(REIAlloyingFuelDisplay recipe) { + Slot slot = Widgets.createSlot(new Point(0, 0)).entries(recipe.getInputEntries().get(0)).disableBackground().disableHighlight(); + String burnItems = DECIMAL_FORMAT.format(recipe.getFuelTime() / 200d); + return new RecipeEntry() { + private TranslatableText text = new TranslatableText("category.rei.fuel.time_short.items", burnItems); + + @Override + public int getHeight() { + return 22; + } + + @Nullable + @Override + public Tooltip getTooltip(Point point) { + if (slot.containsMouse(point)) + return slot.getCurrentTooltip(point); + return null; + } + + @Override + public void render(MatrixStack matrices, Rectangle bounds, int mouseX, int mouseY, float delta) { + slot.setZ(getZ() + 50); + slot.getBounds().setLocation(bounds.x + 4, bounds.y + 2); + slot.render(matrices, mouseX, mouseY, delta); + MinecraftClient.getInstance().textRenderer.drawWithShadow(matrices, text.asOrderedText(), bounds.x + 25, bounds.y + 8, -1); + } + }; + } +} diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelDisplay.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelDisplay.java new file mode 100644 index 00000000..d2bd3ac6 --- /dev/null +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelDisplay.java @@ -0,0 +1,40 @@ +package ru.betterend.integration.rei; + +import me.shedaniel.rei.api.EntryStack; +import me.shedaniel.rei.api.RecipeDisplay; +import me.shedaniel.rei.plugin.DefaultPlugin; +import net.minecraft.util.Identifier; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; + +public class REIAlloyingFuelDisplay implements RecipeDisplay { + private EntryStack fuel; + private int fuelTime; + + public REIAlloyingFuelDisplay(EntryStack fuel, int fuelTime) { + this.fuel = fuel; + this.fuelTime = fuelTime; + } + + @Override + public @NotNull List> getInputEntries() { + return Collections.singletonList(Collections.singletonList(fuel)); + } + + @Override + public @NotNull List> getResultingEntries() { + return Collections.emptyList(); + } + + @Override + public @NotNull Identifier getRecipeCategory() { + return REIPlugin.ALLOYING_FUEL; + } + + public int getFuelTime() { + return fuelTime; + } + +} diff --git a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java index 7ba9e210..6e805b1d 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java @@ -1,5 +1,6 @@ package ru.betterend.integration.rei; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -41,7 +42,7 @@ public class REIAnvilCategory implements TransferRecipeCategory @Override public @NotNull EntryStack getLogo() { - return REIPlugin.ANVILS.get(0); + return REIPlugin.ANVILS[0]; } @Override @@ -55,7 +56,7 @@ public class REIAnvilCategory implements TransferRecipeCategory List> inputEntries = display.getInputEntries(); List materials = inputEntries.get(1); int anvilLevel = display.getAnvilLevel(); - List anvils = REIPlugin.ANVILS.stream().filter(anvil -> { + List anvils = Arrays.stream(REIPlugin.ANVILS).filter(anvil -> { Block block = ((BlockItem) anvil.getItem()).getBlock(); if (block instanceof EndAnvilBlock) { return ((EndAnvilBlock) block).getCraftingLevel() >= anvilLevel; diff --git a/src/main/java/ru/betterend/integration/rei/REIPlugin.java b/src/main/java/ru/betterend/integration/rei/REIPlugin.java index 913b9db7..16e083c2 100644 --- a/src/main/java/ru/betterend/integration/rei/REIPlugin.java +++ b/src/main/java/ru/betterend/integration/rei/REIPlugin.java @@ -1,5 +1,6 @@ package ru.betterend.integration.rei; +import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -8,14 +9,19 @@ import com.google.common.collect.Lists; import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.RecipeHelper; import me.shedaniel.rei.api.plugins.REIPluginV0; +import me.shedaniel.rei.plugin.DefaultPlugin; +import me.shedaniel.rei.plugin.fuel.DefaultFuelDisplay; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.fabricmc.fabric.impl.content.registry.FuelRegistryImpl; import net.minecraft.block.Blocks; import net.minecraft.item.BlockItem; import net.minecraft.recipe.BlastingRecipe; import net.minecraft.util.Identifier; import ru.betterend.BetterEnd; import ru.betterend.blocks.basis.EndAnvilBlock; +import ru.betterend.blocks.basis.EndFurnaceBlock; +import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.recipe.builders.AnvilRecipe; import ru.betterend.recipe.builders.InfusionRecipe; @@ -26,14 +32,16 @@ import ru.betterend.registry.EndItems; public class REIPlugin implements REIPluginV0 { public final static Identifier PLUGIN_ID = BetterEnd.makeID("rei_plugin"); + public final static Identifier ALLOYING_FUEL = BetterEnd.makeID("alloying_fuel"); public final static Identifier ALLOYING = AlloyingRecipe.ID; public final static Identifier SMITHING = AnvilRecipe.ID; public final static Identifier INFUSION = InfusionRecipe.ID; - + public final static EntryStack END_STONE_SMELTER = EntryStack.create(EndBlocks.END_STONE_SMELTER); public final static EntryStack INFUSION_RITUAL = EntryStack.create(EndBlocks.INFUSION_PEDESTAL); - public final static List ANVILS; - + public final static EntryStack[] FURNACES; + public final static EntryStack[] ANVILS; + @Override public Identifier getPluginIdentifier() { return PLUGIN_ID; @@ -45,26 +53,43 @@ public class REIPlugin implements REIPluginV0 { recipeHelper.registerRecipes(ALLOYING, BlastingRecipe.class, REIAlloyingDisplay::new); recipeHelper.registerRecipes(SMITHING, AnvilRecipe.class, REIAnvilDisplay::new); recipeHelper.registerRecipes(INFUSION, InfusionRecipe.class, REIInfusionDisplay::new); + FuelRegistryImpl.INSTANCE.getFuelTimes().forEach((item, time) -> { + if (time >= 2000) { + System.out.println(item); + recipeHelper.registerDisplay(new REIAlloyingFuelDisplay(EntryStack.create(item), time)); + } + }); } @Override public void registerOthers(RecipeHelper recipeHelper) { + recipeHelper.registerWorkingStations(ALLOYING_FUEL, END_STONE_SMELTER); recipeHelper.registerWorkingStations(ALLOYING, END_STONE_SMELTER); recipeHelper.registerWorkingStations(INFUSION, INFUSION_RITUAL); - recipeHelper.registerWorkingStations(SMITHING, ANVILS.toArray(new EntryStack[]{})); + recipeHelper.registerWorkingStations(SMITHING, ANVILS); + recipeHelper.removeAutoCraftButton(ALLOYING_FUEL); recipeHelper.removeAutoCraftButton(SMITHING); + + recipeHelper.registerWorkingStations(DefaultPlugin.SMELTING, FURNACES); + recipeHelper.registerWorkingStations(DefaultPlugin.FUEL, FURNACES); } @Override public void registerPluginCategories(RecipeHelper recipeHelper) { - recipeHelper.registerCategories(new REIAlloyingCategory(), - new REIInfusionCategory(), - new REIAnvilCategory()); + recipeHelper.registerCategories( + new REIAlloyingFuelCategory(), + new REIAlloyingCategory(), + new REIInfusionCategory(), + new REIAnvilCategory()); } static { - ANVILS = Lists.newArrayList(EntryStack.ofItems(EndItems.getModBlocks().stream() + List anvils = Lists.newArrayList(EntryStack.ofItems(EndItems.getModBlocks().stream() .filter(item -> ((BlockItem) item).getBlock() instanceof EndAnvilBlock).collect(Collectors.toList()))); - ANVILS.add(0, EntryStack.create(Blocks.ANVIL)); + anvils.add(0, EntryStack.create(Blocks.ANVIL)); + ANVILS = anvils.toArray(new EntryStack[0]); + FURNACES = Lists.newArrayList(EntryStack.ofItems(EndItems.getModBlocks().stream() + .filter(item -> ((BlockItem) item).getBlock() instanceof EndFurnaceBlock).collect(Collectors.toList()))) + .toArray(new EntryStack[0]); } } From 05b4e80a9d45b199321b80d957cbea7bf07ee52f Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 25 Feb 2021 13:03:45 +0300 Subject: [PATCH 290/463] Mossy glowshroom texture update --- .../entities/EndStoneSmelterBlockEntity.java | 17 +++++++++++------ .../rei/REIAlloyingFuelCategory.java | 12 +++++++----- .../rei/REIAlloyingFuelDisplay.java | 12 ++++++------ .../betterend/integration/rei/REIPlugin.java | 3 --- .../textures/block/mossy_glowshroom_fur.png | Bin 453 -> 235 bytes .../block/mossy_glowshroom_hymenophore_1.png | Bin 659 -> 209 bytes .../block/mossy_glowshroom_hymenophore_2.png | Bin 661 -> 209 bytes .../block/mossy_glowshroom_hymenophore_3.png | Bin 661 -> 207 bytes .../block/mossy_glowshroom_hymenophore_4.png | Bin 659 -> 211 bytes 9 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java index cae5f872..67280b59 100644 --- a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java @@ -1,11 +1,15 @@ package ru.betterend.blocks.entities; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + import com.google.common.collect.Lists; import com.google.common.collect.Maps; + import it.unimi.dsi.fastutil.objects.Object2IntMap.Entry; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import net.fabricmc.fabric.api.registry.FuelRegistry; -import net.fabricmc.fabric.impl.content.registry.FuelRegistryImpl; import net.minecraft.block.BlockState; import net.minecraft.block.entity.AbstractFurnaceBlockEntity; import net.minecraft.block.entity.LockableContainerBlockEntity; @@ -19,7 +23,12 @@ import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.nbt.CompoundTag; -import net.minecraft.recipe.*; +import net.minecraft.recipe.BlastingRecipe; +import net.minecraft.recipe.Recipe; +import net.minecraft.recipe.RecipeFinder; +import net.minecraft.recipe.RecipeInputProvider; +import net.minecraft.recipe.RecipeType; +import net.minecraft.recipe.RecipeUnlocker; import net.minecraft.screen.PropertyDelegate; import net.minecraft.screen.ScreenHandler; import net.minecraft.text.Text; @@ -37,10 +46,6 @@ import ru.betterend.client.gui.EndStoneSmelterScreenHandler; import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.registry.EndBlockEntities; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity implements SidedInventory, RecipeUnlocker, RecipeInputProvider, Tickable { private static final int[] TOP_SLOTS = new int[] { 0, 1 }; diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java index b361096c..1d1856f7 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java @@ -1,6 +1,13 @@ package ru.betterend.integration.rei; +import java.text.DecimalFormat; +import java.util.List; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + import com.google.common.collect.Lists; + import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.EntryStack; @@ -16,11 +23,6 @@ import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.Items; import net.minecraft.text.TranslatableText; import net.minecraft.util.Identifier; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.text.DecimalFormat; -import java.util.List; public class REIAlloyingFuelCategory implements RecipeCategory { private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#.##"); diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelDisplay.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelDisplay.java index d2bd3ac6..40d9edec 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelDisplay.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelDisplay.java @@ -1,14 +1,14 @@ package ru.betterend.integration.rei; -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.RecipeDisplay; -import me.shedaniel.rei.plugin.DefaultPlugin; -import net.minecraft.util.Identifier; -import org.jetbrains.annotations.NotNull; - import java.util.Collections; import java.util.List; +import org.jetbrains.annotations.NotNull; + +import me.shedaniel.rei.api.EntryStack; +import me.shedaniel.rei.api.RecipeDisplay; +import net.minecraft.util.Identifier; + public class REIAlloyingFuelDisplay implements RecipeDisplay { private EntryStack fuel; private int fuelTime; diff --git a/src/main/java/ru/betterend/integration/rei/REIPlugin.java b/src/main/java/ru/betterend/integration/rei/REIPlugin.java index 16e083c2..e4bb29c0 100644 --- a/src/main/java/ru/betterend/integration/rei/REIPlugin.java +++ b/src/main/java/ru/betterend/integration/rei/REIPlugin.java @@ -1,6 +1,5 @@ package ru.betterend.integration.rei; -import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -10,7 +9,6 @@ import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.RecipeHelper; import me.shedaniel.rei.api.plugins.REIPluginV0; import me.shedaniel.rei.plugin.DefaultPlugin; -import me.shedaniel.rei.plugin.fuel.DefaultFuelDisplay; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.impl.content.registry.FuelRegistryImpl; @@ -21,7 +19,6 @@ import net.minecraft.util.Identifier; import ru.betterend.BetterEnd; import ru.betterend.blocks.basis.EndAnvilBlock; import ru.betterend.blocks.basis.EndFurnaceBlock; -import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.recipe.builders.AnvilRecipe; import ru.betterend.recipe.builders.InfusionRecipe; diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_fur.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_fur.png index 3e384e4f948b61b2d915466e6fe244ebd4719d5e..1179db0235af42bf1a006888931ea20dd264dd69 100644 GIT binary patch delta 218 zcmX@g{F-rsWIZzj1A~Sxe=v|@EDmyaVpw-h<|U9L7vK}(3Z%6s{54$o-*)~#%XR;~ zcKwe!_P^-t|Ez2OyPy4cQe83+sDi5`$S;`TKMd4$ii810Q$1ZALnNlI?P?TcHsm;b z$7V;;|JLjx*@wlQhFwPmdKI;Vst0Eo$8#Q*>R delta 438 zcmV;n0ZIPr0mTE58Gi-<001BJ|6u?C0gOpRK~#9!?UK<;lVKFb-+!aa2GymM6*Yo% z7dG*#A}>N1NhxC33~3CJ2pYjBB4V-VMq(i?BG@#d5XK-x=7JP;3RV=YQYi2b_}*XV z-I-gtOS|mi;eF0?zVn>tefbPv4kaz_JaF45n1N%@p(P7}`+sm_5l*D3^aGwx=!xZW zUV6fvX08@6=U&0Vdp?dInY2U};PALl^R(s8nixEVZqZ!d>6h}#&ph@qr=D4^6ybQv zR>ae3%kV0ktky?Ul1O;?jSe+Ek_2y+Ulh&syo1CCXn(C@=!K>Kz4BWnXnhHt^Kdp} z2~MkNq(F_EwtuW8zM%s*WpjAOR#3UxtR=Rtz20T$m{Z;1y3}sgIQM8tKe~{U_?ybd zzCc$|xjSQH6RZX|~R z+4A5gwU~pSV5(YsVjTTg@9o0u6-KKAcefxeTT(mqp)dG%nE3U#NrS0kl#u>b%707*qoM6N<$f);DqxBvhE diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_1.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_1.png index 0fdaa8bcf6f84041f385e4ba8cfa3fd59f4d4f40..480c53175cb4567e57e1f109cb39f38d08f7493f 100644 GIT binary patch delta 192 zcmV;x06+he11NQQXaaIt)gKU^7bPGSwc7G@9 zQkYf&K3cHWa>^S(fe|HZQ1KMle1;sGz$>^JFf_d2vFvY+sW~*&qG4;Bk4uvGjdcqa u>i9q61H=P08xWv-Q6elzckj%6cK#1#F#?yI$mFsB0000dA><-ybhNDQ7O*U3IHHE_e#`iouXGQS7 zm-pWLJe=Qo&TGw`p*w?x3%DX?$d<`c?eJOnv3XN&@1kzm^ndQ7a~A`7xT3I@exrRG zQ{T}Pk)~A>Ea0v!JzJ(BEQ5L6TsEFfajwZ^1^nBV5{o8xO!{)_rf2L3ln&?MOUQTy z%~1&z;NOz@3wUFCw!BFUe1Rt}RJ%6h!C|dbL_$R@{zAY8r7ba;D4{!xnNwI#DhTZ0 z{-Jut%jnqyi+}v}kkh*9aFkMvx(TBgGF>IU> zLl3EDYf9_&89Ho?6yZza=?U6xO#OgsU6@Hn27P(ZIe+;t7&XkFqbrM0Ne%4MpTbxH ztx36efL0s*d3fW(n*N05p$5)@Jy6Qup)#5_#1S!Uk$?1E893KW!>X{ujx_pn|B=!d zEy5j@-kd_$y}6#Ps-YolMh=8J=eiK#){3cre{H=wMN3>*nvHTm9GrJU$mxg(73_o+ z=()2G-P#PJq#ZMl|#lo|rs4 z(dZT~b$;H1dqM%%+{O(UG4IN2qLU=(Lu{C{ymZ*>+ zkjBip-i3fI_3sqYy)MBbJW-uPPgXhWmW=hHiuR-$+LE$#h3SeGbbK&lhsyb|T)P2; fNy$tVH{O~*%D3WLRtg^800000NkvXXu0mjf312m5 diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_2.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_2.png index 37f580af9850e186def59c5d3ff49d39228078a4..4e8ddf42fda0e3b29234a0311a55e994a7126047 100644 GIT binary patch delta 192 zcmV;x06+hg1_Sg^# uZ1t)e#|K=)eqw*w9*gV2_86)9P5J>|;{v0&y3W-A0000 zB-02ZQN|)MLn85qpv*+1A3`h`Him`Bh78#l_CzMia1@EMiDQLRb5Qu-_}$aFBY69` zd+(fk&OP_DdU9ylkh^QC%u77Jtz+2OLr3iW_q1YW5uMTXwF~4 zU!r>#ky9lwl|U9_MYLtaqWkU~T&t!jCUo4nje)!pxPJ%EKq%Wq%4l8}XWTFnB{W6N z$e|GDS`)Usvtk-Q-l(N*jF#X@NMBxuYXy`kx1002ovPDHLkU;%>ta4(4f diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_3.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_3.png index d641e7032166e129a048ef16e6ecca1182c5c9d9..7ef7a402a34bbaea5aa8cb49ddab1879062515a9 100644 GIT binary patch delta 190 zcmV;v073ti1RY8Rd-}D|)+GXBWVoL)a5T@D#=QHLOcsoyqXg2~>H8O6Kh#zoKMHYz}5)FS4%1lK1A;bc)F)UF`<>1=;lB4S z_nq^7=X~dy*>iYe=*yyG58Vf-TC(@|(2$U>GzPwjCt@cG7=LhdGk*yln#F%;-IThp zoj8SiRT>j=cggl=QL`+8b^Fkf(H!`uP zqqLD@5KUN52K8|<-V~H7}zf=a%~coCje z%k}I8-h_6)MSrt=U>{>e5dHWF{vDV%WwdT#rmT91c1LXOvK{;hnjs-nLPr|Ye-tx% zqHpu=TtByl=B^ailSO-4=jK_H$=_&m@bV146o&F>cVOl&l)%=_8(Pnsl-?{_96UNi zOG-v^Xx@a*AcbH7ox3ozl@7fbv~PndYr^7QwVi2o!hbQiBDO9n!J?KRO+8Rj^{1PA zE0zV^YeMGGq0}r}5@t%MdVfPp-5h94hVxp~ye*?IBffQcaG-tIf$GV3MTBa-Q4NlP zasZUtloa#4fZ7$y?w*(sO-@5x#rTr4aK%f2;E6`bSXhEc!-pPbFZ6|B=%9vk>WTnEG)Kvc)v_VMV?C<>s)0~d?}5~Y#T6E!J9aQp1pS!M8LAd7 zy9ahFImBc%kNP#Cfa;Id?+9;}N}8@@^0cVkM~=kxSyK<4 iV(}WSDYev=lK;(h;#x5uDE$Bc002ovPDHLkU;%>VdN}0( diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_4.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_4.png index bf700a50d28cdf6f93df5cb957f16932ca0f38c8..fd4e837b11ff75d5193056daf7315912a69c27ad 100644 GIT binary patch delta 194 zcmV;z06qVc1=9hL8Gi!+001a04^sdD00DDSM?wIu&K&6g000kAOjJcHko`TM{yDDy zO1l4Y&HwIE7bO4y0CGu0K~xx(J&y|t06_>s{dE5`uNJcqOuQO3NRS63%qRtm@bH0* z_APfByPOXM5!Aww76AA`6&OHAG;MzxT^X%i^)o{Tj5@=8SUa)Ei1Y6q&;k}D?dEI{ wrZL&*vr?)DbXV*(NahD7!g0$H^}C(a2U&vxk-Xsv5&!@I07*qoM6N<$f~xFFmH+?% delta 645 zcmV;00($+^0h0xg8Gix*005AYXf^-<0$NE#K~#9!B~t%O(@_+Ce@3RZFQUw;=oAf< zM2#>KWh@diBocoR%1lK1A;bc)F)W5`$dC=OkH|zBjv`Su*|2ca6bk;qkaU z&UyEod#>qBW8j;3BX+!i0Y{7ZOYm{_9NrlEvS{B!_W`Pw?0@||)US)FS(dI1`_PeK z4(_mZM`Yp`TDP$H4=tO*m+@10R;6KG?k?H>EQ~)XgBg%EatxyRYflDsaVuVA7D4pm zBLsHvf=a%~Sbq`TRm=121ip1uYbcI{$r9SrnEr#7Ed)>WepA+armT91_C##$vK{;h z!#Q}PGVvR&4ql$YpTbZcZ4Ta@E8%tkb64QMJz2D+VICc#IVB@GG;M;ONC*|sv5UD2 zB~WTpQv3T7(wjxI14CuB<%(GMnuLn_L>fKJRyy=%(0{fKx~d6_XVrG3D}&Ak=NhMuU9IdmvB%htFe!tTB`4UPeE0Bqfukhf*@WyHTB4-T{s zJJ2op#-EUdD~5{DiAKX%_(koCeO>@>s`bW%XmaY~D&BA)ug=gAmw_KTsNtN>n@d47 zJ Date: Fri, 26 Feb 2021 15:17:47 +0300 Subject: [PATCH 291/463] Dragon Graveyards prototype --- .../ru/betterend/blocks/MossyObsidian.java | 56 +++++++++++++++ .../java/ru/betterend/registry/EndBiomes.java | 2 + .../java/ru/betterend/registry/EndBlocks.java | 3 + .../ru/betterend/registry/EndFeatures.java | 6 ++ src/main/java/ru/betterend/util/MHelper.java | 11 ++- .../world/biome/DragonGraveyardsBiome.java | 24 +++++++ .../features/terrain/FallenPillarFeature.java | 56 +++++++++++++++ .../terrain/ObsidianBoulderFeature.java | 65 ++++++++++++++++++ .../ObsidianPillarBasementFeature.java | 64 +++++++++++++++++ .../features/terrain/RoundCaveFeature.java | 6 +- .../features/terrain/SurfaceVentFeature.java | 2 +- .../betterend/blockstates/mossy_obsidian.json | 10 +++ .../models/block/mossy_obsidian.json | 12 ++++ .../betterend/models/item/mossy_obsidian.json | 3 + .../textures/block/mossy_obsidian_side.png | Bin 0 -> 2183 bytes 15 files changed, 313 insertions(+), 7 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/MossyObsidian.java create mode 100644 src/main/java/ru/betterend/world/biome/DragonGraveyardsBiome.java create mode 100644 src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java create mode 100644 src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java create mode 100644 src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java create mode 100644 src/main/resources/assets/betterend/blockstates/mossy_obsidian.json create mode 100644 src/main/resources/assets/betterend/models/block/mossy_obsidian.json create mode 100644 src/main/resources/assets/betterend/models/item/mossy_obsidian.json create mode 100644 src/main/resources/assets/betterend/textures/block/mossy_obsidian_side.png diff --git a/src/main/java/ru/betterend/blocks/MossyObsidian.java b/src/main/java/ru/betterend/blocks/MossyObsidian.java new file mode 100644 index 00000000..2122c64e --- /dev/null +++ b/src/main/java/ru/betterend/blocks/MossyObsidian.java @@ -0,0 +1,56 @@ +package ru.betterend.blocks; + +import java.util.Collections; +import java.util.List; +import java.util.Random; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.SnowBlock; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.enchantment.Enchantments; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.context.LootContext; +import net.minecraft.loot.context.LootContextParameters; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.WorldView; +import net.minecraft.world.chunk.light.ChunkLightProvider; +import ru.betterend.blocks.basis.BlockBase; + +public class MossyObsidian extends BlockBase { + public MossyObsidian() { + super(FabricBlockSettings.copyOf(Blocks.OBSIDIAN).hardness(3).ticksRandomly()); + } + + @Override + public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.get(LootContextParameters.TOOL); + if (tool != null && EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { + return Collections.singletonList(new ItemStack(this)); + } + return Collections.singletonList(new ItemStack(Blocks.OBSIDIAN)); + } + + @Override + public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + if (random.nextInt(16) == 0 && !canSurvive(state, world, pos)) { + world.setBlockState(pos, Blocks.OBSIDIAN.getDefaultState()); + } + } + + public static boolean canSurvive(BlockState state, WorldView worldView, BlockPos pos) { + BlockPos blockPos = pos.up(); + BlockState blockState = worldView.getBlockState(blockPos); + if (blockState.isOf(Blocks.SNOW) && (Integer)blockState.get(SnowBlock.LAYERS) == 1) { + return true; + } else if (blockState.getFluidState().getLevel() == 8) { + return false; + } else { + int i = ChunkLightProvider.getRealisticOpacity(worldView, state, pos, blockState, blockPos, Direction.UP, blockState.getOpacity(worldView, blockPos)); + return i < 5; + } + } +} diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index 282ee5cc..3cb2de94 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -43,6 +43,7 @@ import ru.betterend.world.biome.BiomePaintedMountains; import ru.betterend.world.biome.BiomeShadowForest; import ru.betterend.world.biome.BiomeSulphurSprings; import ru.betterend.world.biome.BiomeUmbrellaJungle; +import ru.betterend.world.biome.DragonGraveyardsBiome; import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.GlowingGrasslandsBiome; import ru.betterend.world.generator.BELayerRandomSource; @@ -85,6 +86,7 @@ public class EndBiomes { public static final EndBiome SULPHUR_SPRINGS = registerBiome(new BiomeSulphurSprings(), BiomeType.LAND); public static final EndBiome UMBRELLA_JUNGLE = registerBiome(new BiomeUmbrellaJungle(), BiomeType.LAND); public static final EndBiome GLOWING_GRASSLANDS = registerBiome(new GlowingGrasslandsBiome(), BiomeType.LAND); + public static final EndBiome DRAGON_GRAVEYARDS = registerBiome(new DragonGraveyardsBiome(), BiomeType.LAND); // Better End Void public static final EndBiome ICE_STARFIELD = registerBiome(new BiomeIceStarfield(), BiomeType.VOID); diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 5241c8b3..029af24f 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -67,6 +67,7 @@ import ru.betterend.blocks.MissingTileBlock; import ru.betterend.blocks.MossyGlowshroomCapBlock; import ru.betterend.blocks.MossyGlowshroomHymenophoreBlock; import ru.betterend.blocks.MossyGlowshroomSaplingBlock; +import ru.betterend.blocks.MossyObsidian; import ru.betterend.blocks.MurkweedBlock; import ru.betterend.blocks.NeedlegrassBlock; import ru.betterend.blocks.PedestalVanilla; @@ -133,6 +134,8 @@ public class EndBlocks { public static final Block AMBER_MOSS_PATH = registerBlock("amber_moss_path", new EndPathBlock(AMBER_MOSS)); public static final Block JUNGLE_MOSS_PATH = registerBlock("jungle_moss_path", new EndPathBlock(JUNGLE_MOSS)); + public static final Block MOSSY_OBSIDIAN = registerBlock("mossy_obsidian", new MossyObsidian()); + // Rocks // public static final StoneMaterial FLAVOLITE = new StoneMaterial("flavolite", MaterialColor.SAND); public static final StoneMaterial VIOLECITE = new StoneMaterial("violecite", MaterialColor.PURPLE); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 7b69c964..d4af375d 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -37,9 +37,12 @@ import ru.betterend.world.features.bushes.BushFeature; import ru.betterend.world.features.bushes.Lumecorn; import ru.betterend.world.features.bushes.TenaneaBushFeature; import ru.betterend.world.features.terrain.EndLakeFeature; +import ru.betterend.world.features.terrain.FallenPillarFeature; import ru.betterend.world.features.terrain.FloatingSpireFeature; import ru.betterend.world.features.terrain.GeyserFeature; import ru.betterend.world.features.terrain.IceStarFeature; +import ru.betterend.world.features.terrain.ObsidianBoulderFeature; +import ru.betterend.world.features.terrain.ObsidianPillarBasementFeature; import ru.betterend.world.features.terrain.RoundCaveFeature; import ru.betterend.world.features.terrain.SpireFeature; import ru.betterend.world.features.terrain.SulphurHillFeature; @@ -157,6 +160,9 @@ public class EndFeatures { public static final EndFeature ICE_STAR_SMALL = EndFeature.makeRawGenFeature("ice_star_small", new IceStarFeature(3, 5, 7, 12), 8); public static final EndFeature SURFACE_VENT = EndFeature.makeChansedFeature("surface_vent", new SurfaceVentFeature(), 4); public static final EndFeature SULPHUR_HILL = EndFeature.makeChansedFeature("sulphur_hill", new SulphurHillFeature(), 8); + public static final EndFeature OBSIDIAN_PILLAR_BASEMENT = EndFeature.makeChansedFeature("obsidian_pillar_basement", new ObsidianPillarBasementFeature(), 8); + public static final EndFeature OBSIDIAN_BOULDER = EndFeature.makeChansedFeature("obsidian_boulder", new ObsidianBoulderFeature(), 10); + public static final EndFeature FALLEN_PILLAR = EndFeature.makeChansedFeature("fallen_pillar", new FallenPillarFeature(), 20); // Ores // public static final EndFeature THALLASIUM_ORE = EndFeature.makeOreFeature("thallasium_ore", EndBlocks.THALLASIUM.ore, 12, 6, 0, 16, 128); diff --git a/src/main/java/ru/betterend/util/MHelper.java b/src/main/java/ru/betterend/util/MHelper.java index 3d48d8a4..04a9b2e5 100644 --- a/src/main/java/ru/betterend/util/MHelper.java +++ b/src/main/java/ru/betterend/util/MHelper.java @@ -4,6 +4,7 @@ import java.util.Random; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.Vec3d; +import ru.betterend.util.sdf.operator.SDFRotation; public class MHelper { public static final float PI2 = (float) (Math.PI * 2); @@ -325,11 +326,17 @@ public class MHelper { return vec; } - public static float angle(Vector3f vec1, Vector3f vec2) - { + public static float angle(Vector3f vec1, Vector3f vec2) { float dot = vec1.getX() * vec2.getX() + vec1.getY() * vec2.getY() + vec1.getZ() * vec2.getZ(); float length1 = lengthSqr(vec1.getX(), vec1.getY(), vec1.getZ()); float length2 = lengthSqr(vec2.getX(), vec2.getY(), vec2.getZ()); return (float) Math.acos(dot / Math.sqrt(length1 * length2)); } + + public static Vector3f randomHorizontal(Random random) { + float angleY = MHelper.randRange(0, MHelper.PI2, random); + float vx = (float) Math.sin(angleY); + float vz = (float) Math.cos(angleY); + return new Vector3f(vx, 0, vz); + } } diff --git a/src/main/java/ru/betterend/world/biome/DragonGraveyardsBiome.java b/src/main/java/ru/betterend/world/biome/DragonGraveyardsBiome.java new file mode 100644 index 00000000..17fdf531 --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/DragonGraveyardsBiome.java @@ -0,0 +1,24 @@ +package ru.betterend.world.biome; + +import net.minecraft.entity.EntityType; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndSounds; + +public class DragonGraveyardsBiome extends EndBiome { + public DragonGraveyardsBiome() { + super(new BiomeDefinition("dragon_graveyards") + .setGenChance(0.1F) + .setFogColor(244, 46, 79) + .setFogDensity(1.1F) + .setMusic(EndSounds.MUSIC_OPENSPACE) + .setLoop(EndSounds.AMBIENT_GLOWING_GRASSLANDS) + .setSurface(EndBlocks.CAVE_MOSS) + .setWaterAndFogColor(203, 59, 167) + .setPlantsColor(244, 46, 79) + .addFeature(EndFeatures.OBSIDIAN_PILLAR_BASEMENT) + .addFeature(EndFeatures.FALLEN_PILLAR) + .addFeature(EndFeatures.OBSIDIAN_BOULDER) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + } +} diff --git a/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java b/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java new file mode 100644 index 00000000..a0cafa58 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java @@ -0,0 +1,56 @@ +package ru.betterend.world.features.terrain; + +import java.util.Random; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.Material; +import net.minecraft.client.util.math.Vector3f; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.MHelper; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFDisplacement; +import ru.betterend.util.sdf.operator.SDFRotation; +import ru.betterend.util.sdf.operator.SDFTranslate; +import ru.betterend.util.sdf.primitive.SDFCappedCone; +import ru.betterend.world.features.DefaultFeature; + +public class FallenPillarFeature extends DefaultFeature { + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); + if (!world.getBlockState(pos.down(5)).isIn(EndTags.GEN_TERRAIN)) { + return false; + } + + float height = MHelper.randRange(20F, 40F, random); + float radius = MHelper.randRange(2F, 4F, random); + SDF pillar = new SDFCappedCone().setRadius1(radius).setRadius2(radius).setHeight(height * 0.5F).setBlock(Blocks.OBSIDIAN); + pillar = new SDFTranslate().setTranslate(0, radius * 0.5F - 2, 0).setSource(pillar); + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); + pillar = new SDFDisplacement().setFunction((vec) -> { + return (float) (noise.eval(vec.getX() * 0.3, vec.getY() * 0.3, vec.getZ() * 0.3) * 0.5F); + }).setSource(pillar); + Vector3f vec = MHelper.randomHorizontal(random); + float angle = (float) random.nextGaussian() * 0.05F + (float) Math.PI; + pillar = new SDFRotation().setRotation(vec, angle).setSource(pillar); + + BlockState mossy = EndBlocks.MOSSY_OBSIDIAN.getDefaultState(); + pillar.addPostProcess((info) -> { + if (info.getStateUp().isAir() && random.nextFloat() > 0.1F) { + return mossy; + } + return info.getState(); + }).setReplaceFunction((state) -> { + return state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN) || state.getMaterial().equals(Material.PLANT); + }).fillRecursive(world, pos); + + return true; + } +} diff --git a/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java b/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java new file mode 100644 index 00000000..9d00ec71 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java @@ -0,0 +1,65 @@ +package ru.betterend.world.features.terrain; + +import java.util.Random; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.Material; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.MHelper; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFDisplacement; +import ru.betterend.util.sdf.operator.SDFScale3D; +import ru.betterend.util.sdf.primitive.SDFSphere; +import ru.betterend.world.features.DefaultFeature; + +public class ObsidianBoulderFeature extends DefaultFeature { + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); + if (!world.getBlockState(pos.down()).isIn(EndTags.END_GROUND)) { + return false; + } + + int count = MHelper.randRange(1, 5, random); + for (int i = 0; i < count; i++) { + BlockPos p = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16) - 8, pos.getY(), pos.getZ() + random.nextInt(16) - 8)); + makeBoulder(world, p, random); + } + + return true; + } + + private void makeBoulder(StructureWorldAccess world, BlockPos pos, Random random) { + if (!world.getBlockState(pos.down()).isIn(EndTags.END_GROUND)) { + return; + } + + float radius = MHelper.randRange(1F, 5F, random); + SDF sphere = new SDFSphere().setRadius(radius).setBlock(Blocks.OBSIDIAN); + float sx = MHelper.randRange(0.7F, 1.3F, random); + float sy = MHelper.randRange(0.7F, 1.3F, random); + float sz = MHelper.randRange(0.7F, 1.3F, random); + sphere = new SDFScale3D().setScale(sx, sy, sz).setSource(sphere); + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); + sphere = new SDFDisplacement().setFunction((vec) -> { + return (float) (noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 1.5F); + }).setSource(sphere); + + BlockState mossy = EndBlocks.MOSSY_OBSIDIAN.getDefaultState(); + sphere.addPostProcess((info) -> { + if (info.getStateUp().isAir() && random.nextFloat() > 0.1F) { + return mossy; + } + return info.getState(); + }).setReplaceFunction((state) -> { + return state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN) || state.getMaterial().equals(Material.PLANT); + }).fillRecursive(world, pos); + } +} diff --git a/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java b/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java new file mode 100644 index 00000000..00948443 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java @@ -0,0 +1,64 @@ +package ru.betterend.world.features.terrain; + +import java.util.Random; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.Material; +import net.minecraft.client.util.math.Vector3f; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.MHelper; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFDisplacement; +import ru.betterend.util.sdf.operator.SDFRotation; +import ru.betterend.util.sdf.operator.SDFSubtraction; +import ru.betterend.util.sdf.operator.SDFTranslate; +import ru.betterend.util.sdf.primitive.SDFCappedCone; +import ru.betterend.util.sdf.primitive.SDFFlatland; +import ru.betterend.world.features.DefaultFeature; + +public class ObsidianPillarBasementFeature extends DefaultFeature { + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); + if (!world.getBlockState(pos.down(5)).isIn(EndTags.GEN_TERRAIN)) { + return false; + } + + float height = MHelper.randRange(10F, 35F, random); + float radius = MHelper.randRange(2F, 5F, random); + SDF pillar = new SDFCappedCone().setRadius1(radius).setRadius2(radius).setHeight(height * 0.5F).setBlock(Blocks.OBSIDIAN); + pillar = new SDFTranslate().setTranslate(0, height * 0.5F - 3, 0).setSource(pillar); + SDF cut = new SDFFlatland().setBlock(Blocks.OBSIDIAN); + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); + cut = new SDFDisplacement().setFunction((vec) -> { + return (float) (noise.eval(vec.getX() * 0.2, vec.getZ() * 0.2) * 3); + }).setSource(cut); + Vector3f vec = MHelper.randomHorizontal(random); + float angle = random.nextFloat() * 0.5F + (float) Math.PI; + cut = new SDFRotation().setRotation(vec, angle).setSource(cut); + cut = new SDFTranslate().setTranslate(0, height * 0.7F - 3, 0).setSource(cut); + pillar = new SDFSubtraction().setSourceA(pillar).setSourceB(cut); + vec = MHelper.randomHorizontal(random); + angle = random.nextFloat() * 0.2F; + pillar = new SDFRotation().setRotation(vec, angle).setSource(pillar); + + BlockState mossy = EndBlocks.MOSSY_OBSIDIAN.getDefaultState(); + pillar.addPostProcess((info) -> { + if (info.getStateUp().isAir() && random.nextFloat() > 0.1F) { + return mossy; + } + return info.getState(); + }).setReplaceFunction((state) -> { + return state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN) || state.getMaterial().equals(Material.PLANT); + }).fillRecursive(world, pos); + + return true; + } +} diff --git a/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java index 8ef6297a..6c2d53a3 100644 --- a/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java @@ -158,10 +158,8 @@ public class RoundCaveFeature extends DefaultFeature { BlockPos down = pos.down(BlocksHelper.downRay(world, pos, 64) + 2); if (isReplaceable(world.getBlockState(down))) { SDF prism = new SDFHexPrism().setHeight(radius * MHelper.randRange(0.6F, 0.75F, random)).setRadius(MHelper.randRange(1.7F, 3F, random)).setBlock(EndBlocks.AURORA_CRYSTAL); - float angleY = MHelper.randRange(0, MHelper.PI2, random); - float vx = (float) Math.sin(angleY); - float vz = (float) Math.sin(angleY); - prism = new SDFRotation().setRotation(new Vector3f(vx, 0, vz), random.nextFloat()).setSource(prism); + Vector3f vec = MHelper.randomHorizontal(random); + prism = new SDFRotation().setRotation(vec, random.nextFloat()).setSource(prism); prism.setReplaceFunction((bState) -> { return bState.getMaterial().isReplaceable() || bState.isIn(EndTags.GEN_TERRAIN) diff --git a/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java b/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java index 01829f90..ab53b52f 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java @@ -19,7 +19,7 @@ public class SurfaceVentFeature extends DefaultFeature { @Override public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); - if (pos.getY() < 57) { + if (!world.getBlockState(pos.down(3)).isIn(EndTags.GEN_TERRAIN)) { return false; } diff --git a/src/main/resources/assets/betterend/blockstates/mossy_obsidian.json b/src/main/resources/assets/betterend/blockstates/mossy_obsidian.json new file mode 100644 index 00000000..8c8edaf7 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/mossy_obsidian.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/mossy_obsidian" }, + { "model": "betterend:block/mossy_obsidian", "y": 90 }, + { "model": "betterend:block/mossy_obsidian", "y": 180 }, + { "model": "betterend:block/mossy_obsidian", "y": 270 } + ] + } +} diff --git a/src/main/resources/assets/betterend/models/block/mossy_obsidian.json b/src/main/resources/assets/betterend/models/block/mossy_obsidian.json new file mode 100644 index 00000000..78d52422 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/mossy_obsidian.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "block/obsidian", + "east": "betterend:block/mossy_obsidian_side", + "north": "betterend:block/mossy_obsidian_side", + "particle": "betterend:block/mossy_obsidian_side", + "south": "betterend:block/mossy_obsidian_side", + "up": "betterend:block/cave_moss_top", + "west": "betterend:block/mossy_obsidian_side" + } +} diff --git a/src/main/resources/assets/betterend/models/item/mossy_obsidian.json b/src/main/resources/assets/betterend/models/item/mossy_obsidian.json new file mode 100644 index 00000000..199c8c29 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/mossy_obsidian.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/mossy_obsidian" +} diff --git a/src/main/resources/assets/betterend/textures/block/mossy_obsidian_side.png b/src/main/resources/assets/betterend/textures/block/mossy_obsidian_side.png new file mode 100644 index 0000000000000000000000000000000000000000..180693ebbbb9cacba6dac7ed32ca7d1ef4219e2d GIT binary patch literal 2183 zcmbVO2~ZPf7!7n76{PhRwdlIo7NyA^IY?H*8Et}uGaj{C-Ry3Xm1H;UZU~@OQCqe3 zK4uDDqxGoM!D4L%)JkPk#un;H$7*#Dr!z=ZbgF~n)&2`1)ec&xnc3{WyYGMReaC*Y z%d<1ziwqwgu23iZD)P8Fktj04oxB8C%eN62>V!!7MmR+lgr-@up)_7# zAgxNLq%aK*#T!(Z4mIGKcOe|b;t@0+!PH6=BTyZoHb8+N4AcbLLFAey2DHGH5q3$E zmp~A|->>qkRlMLtFoVH>pg4l#N`O#`#hgSIDLFBwo5940l)!o=mggXuk+kzZ$p{0d zT_Je9L0V1>qzNPpDI&cHrb6YAI)OA5#Cd&!yHlK|5XQ}T7)}xa77Jp%E?(kA7ykn4 z;N#~6Kx(blphk~gJf5J0C`~8?VFVJ=BU-c-dl@8`5qY0LF%t@b%@{cvFOeoNq{It0 zo_BW_D!bb;>QTU}MRg>JsYx28x^e>CWC<*I z)kycVtgQq2JkrEk{zU!ygq~g^p`(*nd4s3|n!c;f?yEl?PVf zbH+dJxR5t)ci*t>M@Oue!13e&LZ(dliF)$ioeWh=uSKCskYlO*6Rg{KIUN-i@Ynmo?R`kwOhvZKM%Y;nRzSP-^{syPW3pW4& literal 0 HcmV?d00001 From db2a555ae9d0736b8a351e10ff8d41eb2f7c3620 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Fri, 26 Feb 2021 22:39:43 +0300 Subject: [PATCH 292/463] Fix #102 --- .../mixin/common/AnvilScreenHandlerMixin.java | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java index 89da01cd..016a78b3 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java @@ -35,23 +35,25 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler imple private AnvilRecipe be_currentRecipe; private Property anvilLevel; - public AnvilScreenHandlerMixin(ScreenHandlerType type, int syncId, PlayerInventory playerInventory, - ScreenHandlerContext context) { - super(type, syncId, playerInventory, context); + public AnvilScreenHandlerMixin(int syncId, PlayerInventory playerInventory) { + super(ScreenHandlerType.ANVIL, syncId, playerInventory, ScreenHandlerContext.EMPTY); } - @Inject(method = "*", at = @At("TAIL")) + @Inject(method = "(ILnet/minecraft/entity/player/PlayerInventory;Lnet/minecraft/screen/ScreenHandlerContext;)V", + at = @At("TAIL")) public void be_initAnvilLevel(int syncId, PlayerInventory inventory, ScreenHandlerContext context, CallbackInfo info) { - int anvLevel = context.run((world, blockPos) -> { - Block anvilBlock = world.getBlockState(blockPos).getBlock(); - if (anvilBlock instanceof EndAnvilBlock) { - return ((EndAnvilBlock) anvilBlock).getCraftingLevel(); - } - return 1; - }, 1); - Property anvilLevel = Property.create(); - anvilLevel.set(anvLevel); - this.anvilLevel = addProperty(anvilLevel); + if (context != ScreenHandlerContext.EMPTY) { + int anvLevel = context.run((world, blockPos) -> { + Block anvilBlock = world.getBlockState(blockPos).getBlock(); + if (anvilBlock instanceof EndAnvilBlock) { + return ((EndAnvilBlock) anvilBlock).getCraftingLevel(); + } + return 1; + }, 1); + Property anvilLevel = Property.create(); + anvilLevel.set(anvLevel); + this.anvilLevel = addProperty(anvilLevel); + } } @Shadow From 616c8242572e3c633066b1a1a8595cc628200c21 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sat, 27 Feb 2021 00:39:17 +0300 Subject: [PATCH 293/463] Fix #103 --- .../betterend/blocks/basis/PedestalBlock.java | 90 ++++++++++--------- .../blocks/entities/PedestalBlockEntity.java | 59 ++++++------ .../entities/render/PedestalItemRenderer.java | 12 +-- .../rei/REIAlloyingFuelDisplay.java | 4 +- .../betterend/integration/rei/REIPlugin.java | 1 - .../ru/betterend/rituals/InfusionRitual.java | 82 ++++++++--------- 6 files changed, 123 insertions(+), 125 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index bcf6377e..6ba289ea 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -104,7 +104,7 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid @Override public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { if (world.isClient || !state.isOf(this)) return ActionResult.CONSUME; - if (!this.isPlaceable(state)) { + if (!isPlaceable(state)) { return ActionResult.PASS; } BlockEntity blockEntity = world.getBlockEntity(pos); @@ -114,12 +114,12 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid ItemStack itemStack = player.getStackInHand(hand); if (itemStack.isEmpty()) return ActionResult.CONSUME; pedestal.setStack(0, itemStack.split(1)); - this.checkRitual(world, pos); + checkRitual(world, pos); return ActionResult.SUCCESS; } else { ItemStack itemStack = pedestal.getStack(0); if (player.giveItemStack(itemStack)) { - pedestal.removeStack(world, state); + pedestal.removeStack(0); return ActionResult.SUCCESS; } return ActionResult.FAIL; @@ -151,25 +151,25 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid boolean hasPedestalOver = upState.getBlock() instanceof PedestalBlock; boolean hasPedestalUnder = downState.getBlock() instanceof PedestalBlock; if (!hasPedestalOver && hasPedestalUnder && upSideSolid) { - return this.getDefaultState().with(STATE, PedestalState.COLUMN_TOP); + return getDefaultState().with(STATE, PedestalState.COLUMN_TOP); } else if (!hasPedestalOver && !hasPedestalUnder && upSideSolid) { - return this.getDefaultState().with(STATE, PedestalState.COLUMN); + return getDefaultState().with(STATE, PedestalState.COLUMN); } else if (hasPedestalUnder && hasPedestalOver) { - return this.getDefaultState().with(STATE, PedestalState.PILLAR); + return getDefaultState().with(STATE, PedestalState.PILLAR); } else if (hasPedestalUnder) { - return this.getDefaultState().with(STATE, PedestalState.PEDESTAL_TOP); + return getDefaultState().with(STATE, PedestalState.PEDESTAL_TOP); } else if (hasPedestalOver) { - return this.getDefaultState().with(STATE, PedestalState.BOTTOM); + return getDefaultState().with(STATE, PedestalState.BOTTOM); } - return this.getDefaultState(); + return getDefaultState(); } @Override public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState newState, WorldAccess world, BlockPos pos, BlockPos posFrom) { - BlockState updated = this.getUpdatedState(state, direction, newState, world, pos, posFrom); + BlockState updated = getUpdatedState(state, direction, newState, world, pos, posFrom); if (!updated.isOf(this)) return updated; - if (!this.isPlaceable(updated)) { - this.moveStoredStack(world, updated, pos); + if (!isPlaceable(updated)) { + moveStoredStack(world, updated, pos); } return updated; } @@ -185,21 +185,27 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid if (direction == Direction.UP) { upSideSolid = newState.isSideSolidFullSquare(world, posFrom, Direction.DOWN) || newState.isIn(BlockTags.WALLS); hasPedestalOver = newState.getBlock() instanceof PedestalBlock; - } else if (direction == Direction.DOWN) { + } else { hasPedestalUnder = newState.getBlock() instanceof PedestalBlock; } + BlockState updatedState; if (!hasPedestalOver && hasPedestalUnder && upSideSolid) { - return state.with(STATE, PedestalState.COLUMN_TOP); + updatedState = state.with(STATE, PedestalState.COLUMN_TOP); } else if (!hasPedestalOver && !hasPedestalUnder && upSideSolid) { - return state.with(STATE, PedestalState.COLUMN); + updatedState = state.with(STATE, PedestalState.COLUMN); } else if (hasPedestalUnder && hasPedestalOver) { - return state.with(STATE, PedestalState.PILLAR); + updatedState = state.with(STATE, PedestalState.PILLAR); } else if (hasPedestalUnder) { - return state.with(STATE, PedestalState.PEDESTAL_TOP); + updatedState = state.with(STATE, PedestalState.PEDESTAL_TOP); } else if (hasPedestalOver) { - return state.with(STATE, PedestalState.BOTTOM); + updatedState = state.with(STATE, PedestalState.BOTTOM); + } else { + updatedState = state.with(STATE, PedestalState.DEFAULT); } - return state.with(STATE, PedestalState.DEFAULT); + if (!isPlaceable(updatedState)) { + updatedState = updatedState.with(HAS_ITEM, false).with(HAS_LIGHT, false); + } + return updatedState; } @Override @@ -208,7 +214,7 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid if (state.isOf(this)) { if (isPlaceable(state)) { BlockEntity blockEntity = builder.getNullable(LootContextParameters.BLOCK_ENTITY); - if (blockEntity != null && blockEntity instanceof PedestalBlockEntity) { + if (blockEntity instanceof PedestalBlockEntity) { PedestalBlockEntity pedestal = (PedestalBlockEntity) blockEntity; if (!pedestal.isEmpty()) { drop.add(pedestal.getStack(0)); @@ -222,63 +228,61 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid } private void moveStoredStack(WorldAccess world, BlockState state, BlockPos pos) { - ItemStack stack = ItemStack.EMPTY; BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof PedestalBlockEntity && state.isOf(this)) { PedestalBlockEntity pedestal = (PedestalBlockEntity) blockEntity; - stack = pedestal.getStack(0); - pedestal.clear(); - BlocksHelper.setWithoutUpdate(world, pos, state.with(HAS_ITEM, false)); - } - if (!stack.isEmpty()) { - BlockPos upPos = pos.up(); - this.moveStoredStack(world, stack, world.getBlockState(upPos), upPos); + ItemStack stack = pedestal.removeStack(0); + if (!stack.isEmpty()) { + moveStoredStack(blockEntity, world, stack, pos.up()); + } } } - private void moveStoredStack(WorldAccess world, ItemStack stack, BlockState state, BlockPos pos) { - BlockEntity blockEntity = world.getBlockEntity(pos); + private void moveStoredStack(BlockEntity blockEntity, WorldAccess world, ItemStack stack, BlockPos pos) { + BlockState state = world.getBlockState(pos); if (!state.isOf(this)) { - this.dropStoredStack(blockEntity, stack, pos); + dropStoredStack(blockEntity, stack, pos); } else if (state.get(STATE).equals(PedestalState.PILLAR)) { - BlockPos upPos = pos.up(); - this.moveStoredStack(world, stack, world.getBlockState(upPos), upPos); - } else if (!this.isPlaceable(state)) { - this.dropStoredStack(blockEntity, stack, pos); + moveStoredStack(blockEntity, world, stack, pos.up()); + } else if (!isPlaceable(state)) { + dropStoredStack(blockEntity, stack, pos); } else if (blockEntity instanceof PedestalBlockEntity) { PedestalBlockEntity pedestal = (PedestalBlockEntity) blockEntity; if (pedestal.isEmpty()) { pedestal.setStack(0, stack); } else { - this.dropStoredStack(blockEntity, stack, pos); + dropStoredStack(blockEntity, stack, pos); } } else { - this.dropStoredStack(blockEntity, stack, pos); + dropStoredStack(blockEntity, stack, pos); } } private void dropStoredStack(BlockEntity blockEntity, ItemStack stack, BlockPos pos) { if (blockEntity != null && blockEntity.getWorld() != null) { World world = blockEntity.getWorld(); - Block.dropStack(world, this.getDropPos(world, pos), stack); + Block.dropStack(world, getDropPos(world, pos), stack); } } private BlockPos getDropPos(WorldAccess world, BlockPos pos) { BlockPos dropPos; + if (world.getBlockState(pos).isAir()) { + return pos; + } + if (world.getBlockState(pos.up()).isAir()) { + return pos.up(); + } for(int i = 2; i < Direction.values().length; i++) { dropPos = pos.offset(Direction.byId(i)); if (world.getBlockState(dropPos).isAir()) { return dropPos.toImmutable(); } } - if (world.getBlockState(pos.up()).isAir()) { - return pos.up(); - } - return this.getDropPos(world, pos.up()); + return getDropPos(world, pos.up()); } - protected boolean isPlaceable(BlockState state) { + public boolean isPlaceable(BlockState state) { if (!state.isOf(this)) return false; PedestalState currentState = state.get(STATE); return currentState != PedestalState.BOTTOM && diff --git a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java index a731227a..e772282d 100644 --- a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java @@ -9,7 +9,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket; import net.minecraft.util.Tickable; -import net.minecraft.world.World; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.registry.EndBlockEntities; import ru.betterend.registry.EndItems; @@ -29,17 +28,11 @@ public class PedestalBlockEntity extends BlockEntity implements Inventory, Ticka } public int getAge() { - return this.age; + return age; } public int getMaxAge() { - return this.maxAge; - } - - @Override - public void clear() { - this.activeItem = ItemStack.EMPTY; - this.markDirty(); + return maxAge; } @Override @@ -49,42 +42,41 @@ public class PedestalBlockEntity extends BlockEntity implements Inventory, Ticka @Override public boolean isEmpty() { - return this.activeItem.isEmpty(); + return activeItem.isEmpty(); } @Override public ItemStack getStack(int slot) { - return this.activeItem; + return activeItem; } @Override public ItemStack removeStack(int slot, int amount) { - return this.removeStack(slot); + return removeStack(slot); } @Override public boolean isValid(int slot, ItemStack stack) { - return this.isEmpty(); + return isEmpty(); + } + + @Override + public void clear() { + activeItem = ItemStack.EMPTY; + markDirty(); } @Override public ItemStack removeStack(int slot) { - ItemStack stored = this.activeItem; - this.activeItem = ItemStack.EMPTY; - this.markDirty(); + ItemStack stored = activeItem; + clear(); return stored; } - - public void removeStack(World world, BlockState state) { - world.setBlockState(pos, state.with(PedestalBlock.HAS_ITEM, false) - .with(PedestalBlock.HAS_LIGHT, false)); - this.removeStack(0); - } @Override public void setStack(int slot, ItemStack stack) { - this.activeItem = stack; - this.markDirty(); + activeItem = stack; + markDirty(); } @Override @@ -92,17 +84,18 @@ public class PedestalBlockEntity extends BlockEntity implements Inventory, Ticka if (world != null && !world.isClient) { BlockState state = world.getBlockState(pos); if (state.getBlock() instanceof PedestalBlock) { - state = state.with(PedestalBlock.HAS_ITEM, !isEmpty()); + BlockState trueState = state.with(PedestalBlock.HAS_ITEM, !isEmpty()); if (activeItem.getItem() == EndItems.ETERNAL_CRYSTAL) { - state = state.with(PedestalBlock.HAS_LIGHT, true); + trueState = trueState.with(PedestalBlock.HAS_LIGHT, true); } else { - state = state.with(PedestalBlock.HAS_LIGHT, false); + trueState = trueState.with(PedestalBlock.HAS_LIGHT, false); } - world.setBlockState(pos, state); + world.setBlockState(pos, trueState); } } super.markDirty(); } + @Override public boolean canPlayerUse(PlayerEntity player) { @@ -111,12 +104,12 @@ public class PedestalBlockEntity extends BlockEntity implements Inventory, Ticka @Override public BlockEntityUpdateS2CPacket toUpdatePacket() { - return new BlockEntityUpdateS2CPacket(pos, 32, this.toInitialChunkDataTag()); + return new BlockEntityUpdateS2CPacket(pos, 32, toInitialChunkDataTag()); } @Override public CompoundTag toInitialChunkDataTag() { - return this.toTag(new CompoundTag()); + return toTag(new CompoundTag()); } @Override @@ -124,7 +117,7 @@ public class PedestalBlockEntity extends BlockEntity implements Inventory, Ticka super.fromTag(state, tag); if (tag.contains("active_item")) { CompoundTag itemTag = tag.getCompound("active_item"); - this.activeItem = ItemStack.fromTag(itemTag); + activeItem = ItemStack.fromTag(itemTag); } } @@ -138,9 +131,9 @@ public class PedestalBlockEntity extends BlockEntity implements Inventory, Ticka @Override public void tick() { if (!isEmpty()) { - this.age++; + age++; if (age > maxAge) { - this.age = 0; + age = 0; } } } diff --git a/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java b/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java index 19ca2f88..5da44f25 100644 --- a/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java +++ b/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java @@ -15,6 +15,7 @@ import net.minecraft.item.BlockItem; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.util.math.MathHelper; +import net.minecraft.world.World; import ru.betterend.blocks.EternalPedestal; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.entities.PedestalBlockEntity; @@ -34,16 +35,17 @@ public class PedestalItemRenderer extends BlockEn @Override public void render(T blockEntity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) { - - if (blockEntity.isEmpty()) return; - - BlockState state = blockEntity.getWorld().getBlockState(blockEntity.getPos()); + + World world = blockEntity.getWorld(); + if (blockEntity.isEmpty() || world == null) return; + + BlockState state = world.getBlockState(blockEntity.getPos()); if (!(state.getBlock() instanceof PedestalBlock)) return; ItemStack activeItem = blockEntity.getStack(0); matrices.push(); MinecraftClient minecraft = MinecraftClient.getInstance(); - BakedModel model = minecraft.getItemRenderer().getHeldItemModel(activeItem, blockEntity.getWorld(), null); + BakedModel model = minecraft.getItemRenderer().getHeldItemModel(activeItem, world, null); Vector3f translate = model.getTransformation().ground.translation; PedestalBlock pedestal = (PedestalBlock) state.getBlock(); matrices.translate(translate.getX(), translate.getY(), translate.getZ()); diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelDisplay.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelDisplay.java index 40d9edec..be0dcbfa 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelDisplay.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelDisplay.java @@ -10,8 +10,8 @@ import me.shedaniel.rei.api.RecipeDisplay; import net.minecraft.util.Identifier; public class REIAlloyingFuelDisplay implements RecipeDisplay { - private EntryStack fuel; - private int fuelTime; + private final EntryStack fuel; + private final int fuelTime; public REIAlloyingFuelDisplay(EntryStack fuel, int fuelTime) { this.fuel = fuel; diff --git a/src/main/java/ru/betterend/integration/rei/REIPlugin.java b/src/main/java/ru/betterend/integration/rei/REIPlugin.java index e4bb29c0..1a83a037 100644 --- a/src/main/java/ru/betterend/integration/rei/REIPlugin.java +++ b/src/main/java/ru/betterend/integration/rei/REIPlugin.java @@ -52,7 +52,6 @@ public class REIPlugin implements REIPluginV0 { recipeHelper.registerRecipes(INFUSION, InfusionRecipe.class, REIInfusionDisplay::new); FuelRegistryImpl.INSTANCE.getFuelTimes().forEach((item, time) -> { if (time >= 2000) { - System.out.println(item); recipeHelper.registerDisplay(new REIAlloyingFuelDisplay(EntryStack.create(item), time)); } }); diff --git a/src/main/java/ru/betterend/rituals/InfusionRitual.java b/src/main/java/ru/betterend/rituals/InfusionRitual.java index dbe24bd5..849522ae 100644 --- a/src/main/java/ru/betterend/rituals/InfusionRitual.java +++ b/src/main/java/ru/betterend/rituals/InfusionRitual.java @@ -48,7 +48,7 @@ public class InfusionRitual implements Inventory { if (world == null || world.isClient || worldPos == null) return; BlockEntity inputEntity = world.getBlockEntity(worldPos); if (inputEntity instanceof InfusionPedestalEntity) { - this.input = (InfusionPedestalEntity) inputEntity; + input = (InfusionPedestalEntity) inputEntity; } int i = 0; for(Point point : PEDESTALS_MAP) { @@ -65,59 +65,59 @@ public class InfusionRitual implements Inventory { public boolean checkRecipe() { if (!isValid()) return false; - InfusionRecipe recipe = this.world.getRecipeManager().getFirstMatch(InfusionRecipe.TYPE, this, world).orElse(null); + InfusionRecipe recipe = world.getRecipeManager().getFirstMatch(InfusionRecipe.TYPE, this, world).orElse(null); if (hasRecipe()) { if (recipe == null) { - this.stop(); + stop(); return false; } else if (recipe.getInfusionTime() != time) { - this.activeRecipe = recipe; - this.time = this.activeRecipe.getInfusionTime(); - this.progress = 0; - this.markDirty(); + activeRecipe = recipe; + time = activeRecipe.getInfusionTime(); + progress = 0; + markDirty(); } else if (activeRecipe == null) { - this.activeRecipe = recipe; + activeRecipe = recipe; } return true; } if (recipe != null) { - this.activeRecipe = recipe; - this.time = this.activeRecipe.getInfusionTime(); - this.hasRecipe = true; - this.progress = 0; - this.markDirty(); + activeRecipe = recipe; + time = activeRecipe.getInfusionTime(); + hasRecipe = true; + progress = 0; + markDirty(); return true; } return false; } public void stop() { - this.activeRecipe = null; - this.hasRecipe = false; - this.progress = 0; - this.time = 0; - this.markDirty(); + activeRecipe = null; + hasRecipe = false; + progress = 0; + time = 0; + markDirty(); } public void tick() { if (isDirty) { - this.configure(); - this.isDirty = false; + configure(); + isDirty = false; } if (!isValid() || !hasRecipe()) return; if (!checkRecipe()) return; - this.progress++; + progress++; if (progress == time) { BlockState inputState = world.getBlockState(input.getPos()); - this.input.removeStack(world, inputState); - this.input.setStack(0, activeRecipe.craft(this)); + input.removeStack(0); + input.setStack(0, activeRecipe.craft(this)); for (PedestalBlockEntity catalyst : catalysts) { - catalyst.removeStack(world, world.getBlockState(catalyst.getPos())); + catalyst.removeStack(0); } - this.stop(); + stop(); } else { ServerWorld world = (ServerWorld) this.world; - BlockPos target = this.worldPos.up(); + BlockPos target = worldPos.up(); double tx = target.getX() + 0.5; double ty = target.getY() + 0.5; double tz = target.getZ() + 0.5; @@ -137,7 +137,7 @@ public class InfusionRitual implements Inventory { @Override public boolean isValid(int slot, ItemStack stack) { - return this.isValid(); + return isValid(); } public boolean isValid() { @@ -149,7 +149,7 @@ public class InfusionRitual implements Inventory { } public boolean hasRecipe() { - return this.hasRecipe; + return hasRecipe; } public void setLocation(World world, BlockPos pos) { @@ -161,7 +161,7 @@ public class InfusionRitual implements Inventory { @Override public void clear() { if (!isValid()) return; - this.input.clear(); + input.clear(); for (PedestalBlockEntity catalyst : catalysts) { catalyst.clear(); } @@ -181,24 +181,24 @@ public class InfusionRitual implements Inventory { public ItemStack getStack(int slot) { if (slot > 8) return ItemStack.EMPTY; if (slot == 0) { - return this.input.getStack(0); + return input.getStack(0); } else { - return this.catalysts[slot - 1].getStack(0); + return catalysts[slot - 1].getStack(0); } } @Override public ItemStack removeStack(int slot, int amount) { - return this.removeStack(slot); + return removeStack(slot); } @Override public ItemStack removeStack(int slot) { if (slot > 8) return ItemStack.EMPTY; if (slot == 0) { - return this.input.removeStack(0); + return input.removeStack(0); } else { - return this.catalysts[slot - 1].getStack(0); + return catalysts[slot - 1].getStack(0); } } @@ -206,16 +206,16 @@ public class InfusionRitual implements Inventory { public void setStack(int slot, ItemStack stack) { if (slot > 8) return; if (slot == 0) { - this.input.setStack(0, stack); + input.setStack(0, stack); } else { - this.catalysts[slot - 1].setStack(0, stack); + catalysts[slot - 1].setStack(0, stack); } } @Override public void markDirty() { if (isValid()) { - this.input.markDirty(); + input.markDirty(); for (PedestalBlockEntity catalyst : catalysts) { catalyst.markDirty(); } @@ -229,15 +229,15 @@ public class InfusionRitual implements Inventory { public void fromTag(CompoundTag tag) { if (tag.contains("recipe")) { - this.hasRecipe = tag.getBoolean("recipe"); - this.progress = tag.getInt("progress"); - this.time = tag.getInt("time"); + hasRecipe = tag.getBoolean("recipe"); + progress = tag.getInt("progress"); + time = tag.getInt("time"); } } public CompoundTag toTag(CompoundTag tag) { if (hasRecipe()) { - tag.putBoolean("recipe", this.hasRecipe); + tag.putBoolean("recipe", hasRecipe); tag.putInt("progress", progress); tag.putInt("time", time); } From 8e5996524d9a59723108f149463371e4984d9da0 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 28 Feb 2021 16:24:08 +0300 Subject: [PATCH 294/463] Water plants drop fix --- src/main/java/ru/betterend/blocks/basis/PedestalBlock.java | 1 - .../java/ru/betterend/blocks/basis/UnderwaterPlantBlock.java | 1 + src/main/java/ru/betterend/util/MHelper.java | 1 - 3 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index 6ba289ea..c5d0d4df 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -45,7 +45,6 @@ import ru.betterend.blocks.entities.PedestalBlockEntity; import ru.betterend.patterns.Patterns; import ru.betterend.registry.EndBlocks; import ru.betterend.rituals.InfusionRitual; -import ru.betterend.util.BlocksHelper; public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvider { public final static EnumProperty STATE = BlockProperties.PEDESTAL_STATE; diff --git a/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantBlock.java index b527c7f3..5a16c36e 100644 --- a/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantBlock.java @@ -88,6 +88,7 @@ public class UnderwaterPlantBlock extends BlockBaseNotFull implements IRenderTyp @Override public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { if (!canPlaceAt(state, world, pos)) { + world.breakBlock(pos, true); return Blocks.WATER.getDefaultState(); } else { diff --git a/src/main/java/ru/betterend/util/MHelper.java b/src/main/java/ru/betterend/util/MHelper.java index 04a9b2e5..1132dd22 100644 --- a/src/main/java/ru/betterend/util/MHelper.java +++ b/src/main/java/ru/betterend/util/MHelper.java @@ -4,7 +4,6 @@ import java.util.Random; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.Vec3d; -import ru.betterend.util.sdf.operator.SDFRotation; public class MHelper { public static final float PI2 = (float) (Math.PI * 2); From daf3af06c9bc5869fc727b1f8862b45acc6e4b11 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 28 Feb 2021 18:39:12 +0300 Subject: [PATCH 295/463] Removed terrain json blockstates, plants for "savanna" biome --- .../ru/betterend/blocks/EndPathBlock.java | 20 ++++++++ .../ru/betterend/blocks/EndTerrainBlock.java | 45 +++++++++++++----- .../java/ru/betterend/patterns/Patterns.java | 3 ++ .../java/ru/betterend/registry/EndBlocks.java | 8 +++- .../betterend/blockstates/aeridium.json | 8 ++++ .../betterend/blockstates/cave_moss.json | 21 -------- .../betterend/blockstates/cave_moss_path.json | 10 ---- .../betterend/blockstates/chorus_nylium.json | 10 ---- .../blockstates/chorus_nylium_path.json | 10 ---- .../betterend/blockstates/crystal_moss.json | 10 ---- .../blockstates/crystal_moss_path.json | 10 ---- .../betterend/blockstates/end_moss.json | 21 -------- .../betterend/blockstates/end_moss_path.json | 10 ---- .../betterend/blockstates/end_mycelium.json | 21 -------- .../blockstates/end_mycelium_path.json | 10 ---- .../betterend/blockstates/jungle_moss.json | 21 -------- .../blockstates/jungle_moss_path.json | 10 ---- .../betterend/blockstates/lamellarium.json | 10 ++++ .../assets/betterend/blockstates/lutebus.json | 8 ++++ .../assets/betterend/blockstates/orango.json | 10 ++++ .../betterend/blockstates/pink_moss.json | 21 -------- .../betterend/blockstates/pink_moss_path.json | 10 ---- .../betterend/blockstates/shadow_grass.json | 21 -------- .../blockstates/shadow_grass_path.json | 10 ---- .../betterend/models/block/aeridium_01.json | 6 +++ .../betterend/models/block/aeridium_02.json | 6 +++ .../betterend/models/block/cave_moss.json | 12 ----- .../models/block/cave_moss_path.json | 7 --- .../betterend/models/block/chorus_nylium.json | 12 ----- .../models/block/chorus_nylium_path.json | 7 --- .../betterend/models/block/crystal_moss.json | 12 ----- .../models/block/crystal_moss_path.json | 7 --- .../betterend/models/block/end_moss.json | 12 ----- .../betterend/models/block/end_moss_path.json | 7 --- .../betterend/models/block/end_mycelium.json | 12 ----- .../models/block/end_mycelium_path.json | 7 --- .../betterend/models/block/jungle_moss.json | 12 ----- .../models/block/jungle_moss_path.json | 7 --- .../models/block/lamellarium_01.json | 6 +++ .../models/block/lamellarium_02.json | 6 +++ .../models/block/lamellarium_03.json | 6 +++ .../models/block/lamellarium_04.json | 6 +++ .../betterend/models/block/lutebus_01.json | 6 +++ .../betterend/models/block/lutebus_02.json | 6 +++ .../betterend/models/block/orango_01.json | 6 +++ .../betterend/models/block/orango_02.json | 6 +++ .../betterend/models/block/orango_03.json | 6 +++ .../betterend/models/block/orango_04.json | 6 +++ .../betterend/models/block/pink_moss.json | 12 ----- .../models/block/pink_moss_path.json | 7 --- .../betterend/models/block/shadow_grass.json | 12 ----- .../models/block/shadow_grass_path.json | 7 --- .../betterend/models/item/aeridium.json | 6 +++ .../betterend/models/item/cave_moss.json | 3 -- .../betterend/models/item/cave_moss_path.json | 3 -- .../betterend/models/item/chorus_nylium.json | 3 -- .../models/item/chorus_nylium_path.json | 3 -- .../betterend/models/item/crystal_moss.json | 3 -- .../models/item/crystal_moss_path.json | 3 -- .../betterend/models/item/end_moss.json | 3 -- .../betterend/models/item/end_moss_path.json | 3 -- .../betterend/models/item/end_mycelium.json | 3 -- .../models/item/end_mycelium_path.json | 3 -- .../betterend/models/item/jungle_moss.json | 3 -- .../models/item/jungle_moss_path.json | 3 -- .../betterend/models/item/lamellarium.json | 6 +++ .../assets/betterend/models/item/lutebus.json | 6 +++ .../assets/betterend/models/item/orango.json | 6 +++ .../betterend/models/item/pink_moss.json | 3 -- .../betterend/models/item/pink_moss_path.json | 3 -- .../betterend/models/item/shadow_grass.json | 3 -- .../models/item/shadow_grass_path.json | 3 -- .../assets/betterend/patterns/block/path.json | 7 +++ .../patterns/block/top_side_bottom.json | 8 ++++ .../patterns/blockstate/rotated_top.json | 10 ++++ .../betterend/textures/block/aeridium.png | Bin 0 -> 418 bytes .../betterend/textures/block/lamellarium.png | Bin 0 -> 281 bytes .../betterend/textures/block/lutebus.png | Bin 0 -> 503 bytes .../betterend/textures/block/orango.png | Bin 0 -> 205 bytes .../textures/block/rutiscus_path_top.png | Bin 0 -> 238 bytes .../textures/block/rutiscus_side.png | Bin 0 -> 285 bytes .../betterend/textures/block/rutiscus_top.png | Bin 0 -> 235 bytes 82 files changed, 221 insertions(+), 438 deletions(-) create mode 100644 src/main/resources/assets/betterend/blockstates/aeridium.json delete mode 100644 src/main/resources/assets/betterend/blockstates/cave_moss.json delete mode 100644 src/main/resources/assets/betterend/blockstates/cave_moss_path.json delete mode 100644 src/main/resources/assets/betterend/blockstates/chorus_nylium.json delete mode 100644 src/main/resources/assets/betterend/blockstates/chorus_nylium_path.json delete mode 100644 src/main/resources/assets/betterend/blockstates/crystal_moss.json delete mode 100644 src/main/resources/assets/betterend/blockstates/crystal_moss_path.json delete mode 100644 src/main/resources/assets/betterend/blockstates/end_moss.json delete mode 100644 src/main/resources/assets/betterend/blockstates/end_moss_path.json delete mode 100644 src/main/resources/assets/betterend/blockstates/end_mycelium.json delete mode 100644 src/main/resources/assets/betterend/blockstates/end_mycelium_path.json delete mode 100644 src/main/resources/assets/betterend/blockstates/jungle_moss.json delete mode 100644 src/main/resources/assets/betterend/blockstates/jungle_moss_path.json create mode 100644 src/main/resources/assets/betterend/blockstates/lamellarium.json create mode 100644 src/main/resources/assets/betterend/blockstates/lutebus.json create mode 100644 src/main/resources/assets/betterend/blockstates/orango.json delete mode 100644 src/main/resources/assets/betterend/blockstates/pink_moss.json delete mode 100644 src/main/resources/assets/betterend/blockstates/pink_moss_path.json delete mode 100644 src/main/resources/assets/betterend/blockstates/shadow_grass.json delete mode 100644 src/main/resources/assets/betterend/blockstates/shadow_grass_path.json create mode 100644 src/main/resources/assets/betterend/models/block/aeridium_01.json create mode 100644 src/main/resources/assets/betterend/models/block/aeridium_02.json delete mode 100644 src/main/resources/assets/betterend/models/block/cave_moss.json delete mode 100644 src/main/resources/assets/betterend/models/block/cave_moss_path.json delete mode 100644 src/main/resources/assets/betterend/models/block/chorus_nylium.json delete mode 100644 src/main/resources/assets/betterend/models/block/chorus_nylium_path.json delete mode 100644 src/main/resources/assets/betterend/models/block/crystal_moss.json delete mode 100644 src/main/resources/assets/betterend/models/block/crystal_moss_path.json delete mode 100644 src/main/resources/assets/betterend/models/block/end_moss.json delete mode 100644 src/main/resources/assets/betterend/models/block/end_moss_path.json delete mode 100644 src/main/resources/assets/betterend/models/block/end_mycelium.json delete mode 100644 src/main/resources/assets/betterend/models/block/end_mycelium_path.json delete mode 100644 src/main/resources/assets/betterend/models/block/jungle_moss.json delete mode 100644 src/main/resources/assets/betterend/models/block/jungle_moss_path.json create mode 100644 src/main/resources/assets/betterend/models/block/lamellarium_01.json create mode 100644 src/main/resources/assets/betterend/models/block/lamellarium_02.json create mode 100644 src/main/resources/assets/betterend/models/block/lamellarium_03.json create mode 100644 src/main/resources/assets/betterend/models/block/lamellarium_04.json create mode 100644 src/main/resources/assets/betterend/models/block/lutebus_01.json create mode 100644 src/main/resources/assets/betterend/models/block/lutebus_02.json create mode 100644 src/main/resources/assets/betterend/models/block/orango_01.json create mode 100644 src/main/resources/assets/betterend/models/block/orango_02.json create mode 100644 src/main/resources/assets/betterend/models/block/orango_03.json create mode 100644 src/main/resources/assets/betterend/models/block/orango_04.json delete mode 100644 src/main/resources/assets/betterend/models/block/pink_moss.json delete mode 100644 src/main/resources/assets/betterend/models/block/pink_moss_path.json delete mode 100644 src/main/resources/assets/betterend/models/block/shadow_grass.json delete mode 100644 src/main/resources/assets/betterend/models/block/shadow_grass_path.json create mode 100644 src/main/resources/assets/betterend/models/item/aeridium.json delete mode 100644 src/main/resources/assets/betterend/models/item/cave_moss.json delete mode 100644 src/main/resources/assets/betterend/models/item/cave_moss_path.json delete mode 100644 src/main/resources/assets/betterend/models/item/chorus_nylium.json delete mode 100644 src/main/resources/assets/betterend/models/item/chorus_nylium_path.json delete mode 100644 src/main/resources/assets/betterend/models/item/crystal_moss.json delete mode 100644 src/main/resources/assets/betterend/models/item/crystal_moss_path.json delete mode 100644 src/main/resources/assets/betterend/models/item/end_moss.json delete mode 100644 src/main/resources/assets/betterend/models/item/end_moss_path.json delete mode 100644 src/main/resources/assets/betterend/models/item/end_mycelium.json delete mode 100644 src/main/resources/assets/betterend/models/item/end_mycelium_path.json delete mode 100644 src/main/resources/assets/betterend/models/item/jungle_moss.json delete mode 100644 src/main/resources/assets/betterend/models/item/jungle_moss_path.json create mode 100644 src/main/resources/assets/betterend/models/item/lamellarium.json create mode 100644 src/main/resources/assets/betterend/models/item/lutebus.json create mode 100644 src/main/resources/assets/betterend/models/item/orango.json delete mode 100644 src/main/resources/assets/betterend/models/item/pink_moss.json delete mode 100644 src/main/resources/assets/betterend/models/item/pink_moss_path.json delete mode 100644 src/main/resources/assets/betterend/models/item/shadow_grass.json delete mode 100644 src/main/resources/assets/betterend/models/item/shadow_grass_path.json create mode 100644 src/main/resources/assets/betterend/patterns/block/path.json create mode 100644 src/main/resources/assets/betterend/patterns/block/top_side_bottom.json create mode 100644 src/main/resources/assets/betterend/patterns/blockstate/rotated_top.json create mode 100644 src/main/resources/assets/betterend/textures/block/aeridium.png create mode 100644 src/main/resources/assets/betterend/textures/block/lamellarium.png create mode 100644 src/main/resources/assets/betterend/textures/block/lutebus.png create mode 100644 src/main/resources/assets/betterend/textures/block/orango.png create mode 100644 src/main/resources/assets/betterend/textures/block/rutiscus_path_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/rutiscus_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/rutiscus_top.png diff --git a/src/main/java/ru/betterend/blocks/EndPathBlock.java b/src/main/java/ru/betterend/blocks/EndPathBlock.java index acfb6c53..5d4534d9 100644 --- a/src/main/java/ru/betterend/blocks/EndPathBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPathBlock.java @@ -2,6 +2,9 @@ package ru.betterend.blocks; import java.util.Collections; import java.util.List; +import java.util.Map; + +import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.Block; @@ -13,10 +16,13 @@ import net.minecraft.enchantment.Enchantments; import net.minecraft.item.ItemStack; import net.minecraft.loot.context.LootContext; import net.minecraft.loot.context.LootContextParameters; +import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.registry.Registry; import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.BlockView; import ru.betterend.blocks.basis.BlockBaseNotFull; +import ru.betterend.patterns.Patterns; public class EndPathBlock extends BlockBaseNotFull { private static final VoxelShape SHAPE = Block.createCuboidShape(0, 0, 0, 16, 15, 16); @@ -47,4 +53,18 @@ public class EndPathBlock extends BlockBaseNotFull { public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { return SHAPE; } + + @Override + public String getModelPattern(String block) { + String name = Registry.BLOCK.getId(this).getPath(); + Map map = Maps.newHashMap(); + map.put("%top%", name + "_top"); + map.put("%side%", name.replace("_path", "") + "_side"); + return Patterns.createJson(Patterns.BLOCK_PATH, map); + } + + @Override + public Identifier statePatternId() { + return Patterns.STATE_ROTATED_TOP; + } } diff --git a/src/main/java/ru/betterend/blocks/EndTerrainBlock.java b/src/main/java/ru/betterend/blocks/EndTerrainBlock.java index 3d34f8b3..c1dd4e0b 100644 --- a/src/main/java/ru/betterend/blocks/EndTerrainBlock.java +++ b/src/main/java/ru/betterend/blocks/EndTerrainBlock.java @@ -2,8 +2,11 @@ package ru.betterend.blocks; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Random; +import com.google.common.collect.Maps; + import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.block.Block; @@ -23,13 +26,16 @@ import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvents; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; +import net.minecraft.util.Identifier; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; +import net.minecraft.util.registry.Registry; import net.minecraft.world.World; import net.minecraft.world.WorldView; import net.minecraft.world.chunk.light.ChunkLightProvider; import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.patterns.Patterns; public class EndTerrainBlock extends BlockBase { private Block pathBlock; @@ -74,15 +80,32 @@ public class EndTerrainBlock extends BlockBase { } public static boolean canSurvive(BlockState state, WorldView worldView, BlockPos pos) { - BlockPos blockPos = pos.up(); - BlockState blockState = worldView.getBlockState(blockPos); - if (blockState.isOf(Blocks.SNOW) && (Integer)blockState.get(SnowBlock.LAYERS) == 1) { - return true; - } else if (blockState.getFluidState().getLevel() == 8) { - return false; - } else { - int i = ChunkLightProvider.getRealisticOpacity(worldView, state, pos, blockState, blockPos, Direction.UP, blockState.getOpacity(worldView, blockPos)); - return i < 5; - } - } + BlockPos blockPos = pos.up(); + BlockState blockState = worldView.getBlockState(blockPos); + if (blockState.isOf(Blocks.SNOW) && (Integer) blockState.get(SnowBlock.LAYERS) == 1) { + return true; + } + else if (blockState.getFluidState().getLevel() == 8) { + return false; + } + else { + int i = ChunkLightProvider.getRealisticOpacity(worldView, state, pos, blockState, blockPos, Direction.UP, blockState.getOpacity(worldView, blockPos)); + return i < 5; + } + } + + @Override + public String getModelPattern(String block) { + String name = Registry.BLOCK.getId(this).getPath(); + Map map = Maps.newHashMap(); + map.put("%top%", "betterend:block/" + name + "_top"); + map.put("%side%", "betterend:block/" + name + "_side"); + map.put("%bottom%", "minecraft:block/end_stone"); + return Patterns.createJson(Patterns.BLOCK_TOP_SIDE_BOTTOM, map); + } + + @Override + public Identifier statePatternId() { + return Patterns.STATE_ROTATED_TOP; + } } diff --git a/src/main/java/ru/betterend/patterns/Patterns.java b/src/main/java/ru/betterend/patterns/Patterns.java index 48fbe9ca..e478035c 100644 --- a/src/main/java/ru/betterend/patterns/Patterns.java +++ b/src/main/java/ru/betterend/patterns/Patterns.java @@ -45,6 +45,7 @@ public class Patterns { public final static Identifier STATE_CHAIN = BetterEnd.makeID("patterns/blockstate/chain.json"); public final static Identifier STATE_CHANDELIER = BetterEnd.makeID("patterns/blockstate/chandelier.json"); public final static Identifier STATE_FURNACE = BetterEnd.makeID("patterns/blockstate/furnace.json"); + public final static Identifier STATE_ROTATED_TOP = BetterEnd.makeID("patterns/blockstate/rotated_top.json"); //Models Block public final static Identifier BLOCK_EMPTY = BetterEnd.makeID("patterns/block/empty.json"); @@ -100,6 +101,8 @@ public class Patterns { public final static Identifier BLOCK_CHANDELIER_CEIL = BetterEnd.makeID("patterns/block/chandelier_ceil.json"); public final static Identifier BLOCK_FURNACE = BetterEnd.makeID("patterns/block/furnace.json"); public final static Identifier BLOCK_FURNACE_GLOW = BetterEnd.makeID("patterns/block/furnace_glow.json"); + public final static Identifier BLOCK_TOP_SIDE_BOTTOM = BetterEnd.makeID("patterns/block/top_side_bottom.json"); + public final static Identifier BLOCK_PATH = BetterEnd.makeID("patterns/block/path.json"); //Models Item public final static Identifier ITEM_WALL = BetterEnd.makeID("patterns/item/pattern_wall.json"); diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 029af24f..5b511b3c 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -121,7 +121,8 @@ public class EndBlocks { public static final Block SHADOW_GRASS = registerBlock("shadow_grass", new ShadowGrassBlock()); public static final Block PINK_MOSS = registerBlock("pink_moss", new EndTerrainBlock(MaterialColor.PINK)); public static final Block AMBER_MOSS = registerBlock("amber_moss", new EndTerrainBlock(MaterialColor.ORANGE)); - public static final Block JUNGLE_MOSS = registerBlock("jungle_moss", new EndTerrainBlock(MaterialColor.ORANGE)); + public static final Block JUNGLE_MOSS = registerBlock("jungle_moss", new EndTerrainBlock(MaterialColor.GREEN)); + public static final Block RUTISCUS = registerBlock("rutiscus", new EndTerrainBlock(MaterialColor.ORANGE)); // Roads // public static final Block END_MYCELIUM_PATH = registerBlock("end_mycelium_path", new EndPathBlock(END_MYCELIUM)); @@ -133,6 +134,7 @@ public class EndBlocks { public static final Block PINK_MOSS_PATH = registerBlock("pink_moss_path", new EndPathBlock(PINK_MOSS)); public static final Block AMBER_MOSS_PATH = registerBlock("amber_moss_path", new EndPathBlock(AMBER_MOSS)); public static final Block JUNGLE_MOSS_PATH = registerBlock("jungle_moss_path", new EndPathBlock(JUNGLE_MOSS)); + public static final Block RUTISCUS_PATH = registerBlock("rutiscus_path", new EndPathBlock(RUTISCUS)); public static final Block MOSSY_OBSIDIAN = registerBlock("mossy_obsidian", new MossyObsidian()); @@ -222,6 +224,10 @@ public class EndBlocks { public static final Block SALTEAGO = registerBlock("salteago", new TerrainPlantBlock(END_MOSS)); public static final Block VAIOLUSH_FERN = registerBlock("vaiolush_fern", new TerrainPlantBlock(END_MOSS)); public static final Block FRACTURN = registerBlock("fracturn", new TerrainPlantBlock(END_MOSS)); + public static final Block ORANGO = registerBlock("orango", new TerrainPlantBlock(RUTISCUS)); + public static final Block AERIDIUM = registerBlock("aeridium", new TerrainPlantBlock(RUTISCUS)); + public static final Block LUTEBUS = registerBlock("lutebus", new TerrainPlantBlock(RUTISCUS)); + public static final Block LAMELLARIUM = registerBlock("lamellarium", new TerrainPlantBlock(RUTISCUS)); public static final Block BLUE_VINE_SEED = registerBlock("blue_vine_seed", new BlueVineSeedBlock()); public static final Block BLUE_VINE = registerBlockNI("blue_vine", new BlueVineBlock()); diff --git a/src/main/resources/assets/betterend/blockstates/aeridium.json b/src/main/resources/assets/betterend/blockstates/aeridium.json new file mode 100644 index 00000000..b253a949 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/aeridium.json @@ -0,0 +1,8 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/aeridium_01" }, + { "model": "betterend:block/aeridium_02" } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/cave_moss.json b/src/main/resources/assets/betterend/blockstates/cave_moss.json deleted file mode 100644 index 2850aa74..00000000 --- a/src/main/resources/assets/betterend/blockstates/cave_moss.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "variants": { - "": [ - { - "model": "betterend:block/cave_moss" - }, - { - "model": "betterend:block/cave_moss", - "y": 90 - }, - { - "model": "betterend:block/cave_moss", - "y": 180 - }, - { - "model": "betterend:block/cave_moss", - "y": 270 - } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/cave_moss_path.json b/src/main/resources/assets/betterend/blockstates/cave_moss_path.json deleted file mode 100644 index 41a59367..00000000 --- a/src/main/resources/assets/betterend/blockstates/cave_moss_path.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "": [ - { "model": "betterend:block/cave_moss_path" }, - { "model": "betterend:block/cave_moss_path", "y": 90 }, - { "model": "betterend:block/cave_moss_path", "y": 180 }, - { "model": "betterend:block/cave_moss_path", "y": 270 } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/chorus_nylium.json b/src/main/resources/assets/betterend/blockstates/chorus_nylium.json deleted file mode 100644 index 6c04ddb7..00000000 --- a/src/main/resources/assets/betterend/blockstates/chorus_nylium.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "": [ - { "model": "betterend:block/chorus_nylium" }, - { "model": "betterend:block/chorus_nylium", "y": 90 }, - { "model": "betterend:block/chorus_nylium", "y": 180 }, - { "model": "betterend:block/chorus_nylium", "y": 270 } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/chorus_nylium_path.json b/src/main/resources/assets/betterend/blockstates/chorus_nylium_path.json deleted file mode 100644 index 3e160ef6..00000000 --- a/src/main/resources/assets/betterend/blockstates/chorus_nylium_path.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "": [ - { "model": "betterend:block/chorus_nylium_path" }, - { "model": "betterend:block/chorus_nylium_path", "y": 90 }, - { "model": "betterend:block/chorus_nylium_path", "y": 180 }, - { "model": "betterend:block/chorus_nylium_path", "y": 270 } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/crystal_moss.json b/src/main/resources/assets/betterend/blockstates/crystal_moss.json deleted file mode 100644 index ddf93100..00000000 --- a/src/main/resources/assets/betterend/blockstates/crystal_moss.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "": [ - { "model": "betterend:block/crystal_moss" }, - { "model": "betterend:block/crystal_moss", "y": 90 }, - { "model": "betterend:block/crystal_moss", "y": 180 }, - { "model": "betterend:block/crystal_moss", "y": 270 } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/crystal_moss_path.json b/src/main/resources/assets/betterend/blockstates/crystal_moss_path.json deleted file mode 100644 index 2218e820..00000000 --- a/src/main/resources/assets/betterend/blockstates/crystal_moss_path.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "": [ - { "model": "betterend:block/crystal_moss_path" }, - { "model": "betterend:block/crystal_moss_path", "y": 90 }, - { "model": "betterend:block/crystal_moss_path", "y": 180 }, - { "model": "betterend:block/crystal_moss_path", "y": 270 } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/end_moss.json b/src/main/resources/assets/betterend/blockstates/end_moss.json deleted file mode 100644 index f784924d..00000000 --- a/src/main/resources/assets/betterend/blockstates/end_moss.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "variants": { - "": [ - { - "model": "betterend:block/end_moss" - }, - { - "model": "betterend:block/end_moss", - "y": 90 - }, - { - "model": "betterend:block/end_moss", - "y": 180 - }, - { - "model": "betterend:block/end_moss", - "y": 270 - } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/end_moss_path.json b/src/main/resources/assets/betterend/blockstates/end_moss_path.json deleted file mode 100644 index 336a778d..00000000 --- a/src/main/resources/assets/betterend/blockstates/end_moss_path.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "": [ - { "model": "betterend:block/end_moss_path" }, - { "model": "betterend:block/end_moss_path", "y": 90 }, - { "model": "betterend:block/end_moss_path", "y": 180 }, - { "model": "betterend:block/end_moss_path", "y": 270 } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/end_mycelium.json b/src/main/resources/assets/betterend/blockstates/end_mycelium.json deleted file mode 100644 index 42bb44e3..00000000 --- a/src/main/resources/assets/betterend/blockstates/end_mycelium.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "variants": { - "": [ - { - "model": "betterend:block/end_mycelium" - }, - { - "model": "betterend:block/end_mycelium", - "y": 90 - }, - { - "model": "betterend:block/end_mycelium", - "y": 180 - }, - { - "model": "betterend:block/end_mycelium", - "y": 270 - } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/end_mycelium_path.json b/src/main/resources/assets/betterend/blockstates/end_mycelium_path.json deleted file mode 100644 index 22db9d60..00000000 --- a/src/main/resources/assets/betterend/blockstates/end_mycelium_path.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "": [ - { "model": "betterend:block/end_mycelium_path" }, - { "model": "betterend:block/end_mycelium_path", "y": 90 }, - { "model": "betterend:block/end_mycelium_path", "y": 180 }, - { "model": "betterend:block/end_mycelium_path", "y": 270 } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/jungle_moss.json b/src/main/resources/assets/betterend/blockstates/jungle_moss.json deleted file mode 100644 index f037553e..00000000 --- a/src/main/resources/assets/betterend/blockstates/jungle_moss.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "variants": { - "": [ - { - "model": "betterend:block/jungle_moss" - }, - { - "model": "betterend:block/jungle_moss", - "y": 90 - }, - { - "model": "betterend:block/jungle_moss", - "y": 180 - }, - { - "model": "betterend:block/jungle_moss", - "y": 270 - } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/jungle_moss_path.json b/src/main/resources/assets/betterend/blockstates/jungle_moss_path.json deleted file mode 100644 index 7a5f4580..00000000 --- a/src/main/resources/assets/betterend/blockstates/jungle_moss_path.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "": [ - { "model": "betterend:block/jungle_moss_path" }, - { "model": "betterend:block/jungle_moss_path", "y": 90 }, - { "model": "betterend:block/jungle_moss_path", "y": 180 }, - { "model": "betterend:block/jungle_moss_path", "y": 270 } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/lamellarium.json b/src/main/resources/assets/betterend/blockstates/lamellarium.json new file mode 100644 index 00000000..0e6fcf7b --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/lamellarium.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/lamellarium_01" }, + { "model": "betterend:block/lamellarium_02" }, + { "model": "betterend:block/lamellarium_03" }, + { "model": "betterend:block/lamellarium_04" } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/lutebus.json b/src/main/resources/assets/betterend/blockstates/lutebus.json new file mode 100644 index 00000000..04520359 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/lutebus.json @@ -0,0 +1,8 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/lutebus_01" }, + { "model": "betterend:block/lutebus_02" } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/orango.json b/src/main/resources/assets/betterend/blockstates/orango.json new file mode 100644 index 00000000..c43c82ce --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/orango.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/orango_01" }, + { "model": "betterend:block/orango_02" }, + { "model": "betterend:block/orango_03" }, + { "model": "betterend:block/orango_04" } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/pink_moss.json b/src/main/resources/assets/betterend/blockstates/pink_moss.json deleted file mode 100644 index 27f9613c..00000000 --- a/src/main/resources/assets/betterend/blockstates/pink_moss.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "variants": { - "": [ - { - "model": "betterend:block/pink_moss" - }, - { - "model": "betterend:block/pink_moss", - "y": 90 - }, - { - "model": "betterend:block/pink_moss", - "y": 180 - }, - { - "model": "betterend:block/pink_moss", - "y": 270 - } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/pink_moss_path.json b/src/main/resources/assets/betterend/blockstates/pink_moss_path.json deleted file mode 100644 index 4ca9deab..00000000 --- a/src/main/resources/assets/betterend/blockstates/pink_moss_path.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "": [ - { "model": "betterend:block/pink_moss_path" }, - { "model": "betterend:block/pink_moss_path", "y": 90 }, - { "model": "betterend:block/pink_moss_path", "y": 180 }, - { "model": "betterend:block/pink_moss_path", "y": 270 } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/shadow_grass.json b/src/main/resources/assets/betterend/blockstates/shadow_grass.json deleted file mode 100644 index 37d4a7f0..00000000 --- a/src/main/resources/assets/betterend/blockstates/shadow_grass.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "variants": { - "": [ - { - "model": "betterend:block/shadow_grass" - }, - { - "model": "betterend:block/shadow_grass", - "y": 90 - }, - { - "model": "betterend:block/shadow_grass", - "y": 180 - }, - { - "model": "betterend:block/shadow_grass", - "y": 270 - } - ] - } -} diff --git a/src/main/resources/assets/betterend/blockstates/shadow_grass_path.json b/src/main/resources/assets/betterend/blockstates/shadow_grass_path.json deleted file mode 100644 index e31a8a14..00000000 --- a/src/main/resources/assets/betterend/blockstates/shadow_grass_path.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "": [ - { "model": "betterend:block/shadow_grass_path" }, - { "model": "betterend:block/shadow_grass_path", "y": 90 }, - { "model": "betterend:block/shadow_grass_path", "y": 180 }, - { "model": "betterend:block/shadow_grass_path", "y": 270 } - ] - } -} diff --git a/src/main/resources/assets/betterend/models/block/aeridium_01.json b/src/main/resources/assets/betterend/models/block/aeridium_01.json new file mode 100644 index 00000000..7c2d6701 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/aeridium_01.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/aeridium" + } +} diff --git a/src/main/resources/assets/betterend/models/block/aeridium_02.json b/src/main/resources/assets/betterend/models/block/aeridium_02.json new file mode 100644 index 00000000..37ebd850 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/aeridium_02.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/aeridium" + } +} diff --git a/src/main/resources/assets/betterend/models/block/cave_moss.json b/src/main/resources/assets/betterend/models/block/cave_moss.json deleted file mode 100644 index c5ae0c77..00000000 --- a/src/main/resources/assets/betterend/models/block/cave_moss.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "parent": "block/cube", - "textures": { - "down": "block/end_stone", - "east": "betterend:block/cave_moss_side", - "north": "betterend:block/cave_moss_side", - "particle": "betterend:block/cave_moss_side", - "south": "betterend:block/cave_moss_side", - "up": "betterend:block/cave_moss_top", - "west": "betterend:block/cave_moss_side" - } -} diff --git a/src/main/resources/assets/betterend/models/block/cave_moss_path.json b/src/main/resources/assets/betterend/models/block/cave_moss_path.json deleted file mode 100644 index d46c7c2e..00000000 --- a/src/main/resources/assets/betterend/models/block/cave_moss_path.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "parent": "betterend:block/path", - "textures": { - "top": "betterend:block/cave_moss_path_top", - "side": "betterend:block/cave_moss_side", - "bottom": "block/end_stone" - } -} diff --git a/src/main/resources/assets/betterend/models/block/chorus_nylium.json b/src/main/resources/assets/betterend/models/block/chorus_nylium.json deleted file mode 100644 index 9acf413a..00000000 --- a/src/main/resources/assets/betterend/models/block/chorus_nylium.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "parent": "block/cube", - "textures": { - "down": "block/end_stone", - "east": "betterend:block/chorus_nylium_side", - "north": "betterend:block/chorus_nylium_side", - "particle": "betterend:block/chorus_nylium_side", - "south": "betterend:block/chorus_nylium_side", - "up": "betterend:block/chorus_nylium_top", - "west": "betterend:block/chorus_nylium_side" - } -} diff --git a/src/main/resources/assets/betterend/models/block/chorus_nylium_path.json b/src/main/resources/assets/betterend/models/block/chorus_nylium_path.json deleted file mode 100644 index 34fa8e53..00000000 --- a/src/main/resources/assets/betterend/models/block/chorus_nylium_path.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "parent": "betterend:block/path", - "textures": { - "top": "betterend:block/chorus_nylium_path_top", - "side": "betterend:block/chorus_nylium_side", - "bottom": "block/end_stone" - } -} diff --git a/src/main/resources/assets/betterend/models/block/crystal_moss.json b/src/main/resources/assets/betterend/models/block/crystal_moss.json deleted file mode 100644 index a64db84a..00000000 --- a/src/main/resources/assets/betterend/models/block/crystal_moss.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "parent": "block/cube", - "textures": { - "down": "block/end_stone", - "east": "betterend:block/crystal_moss_side", - "north": "betterend:block/crystal_moss_side", - "particle": "betterend:block/crystal_moss_side", - "south": "betterend:block/crystal_moss_side", - "up": "betterend:block/crystal_moss_top", - "west": "betterend:block/crystal_moss_side" - } -} diff --git a/src/main/resources/assets/betterend/models/block/crystal_moss_path.json b/src/main/resources/assets/betterend/models/block/crystal_moss_path.json deleted file mode 100644 index ae4d6b55..00000000 --- a/src/main/resources/assets/betterend/models/block/crystal_moss_path.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "parent": "betterend:block/path", - "textures": { - "top": "betterend:block/crystal_moss_path_top", - "side": "betterend:block/crystal_moss_side", - "bottom": "block/end_stone" - } -} diff --git a/src/main/resources/assets/betterend/models/block/end_moss.json b/src/main/resources/assets/betterend/models/block/end_moss.json deleted file mode 100644 index ee5cc869..00000000 --- a/src/main/resources/assets/betterend/models/block/end_moss.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "parent": "block/cube", - "textures": { - "down": "block/end_stone", - "east": "betterend:block/end_moss_side", - "north": "betterend:block/end_moss_side", - "particle": "betterend:block/end_moss_side", - "south": "betterend:block/end_moss_side", - "up": "betterend:block/end_moss_top", - "west": "betterend:block/end_moss_side" - } -} diff --git a/src/main/resources/assets/betterend/models/block/end_moss_path.json b/src/main/resources/assets/betterend/models/block/end_moss_path.json deleted file mode 100644 index 39a4c538..00000000 --- a/src/main/resources/assets/betterend/models/block/end_moss_path.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "parent": "betterend:block/path", - "textures": { - "top": "betterend:block/end_moss_path_top", - "side": "betterend:block/end_moss_side", - "bottom": "block/end_stone" - } -} diff --git a/src/main/resources/assets/betterend/models/block/end_mycelium.json b/src/main/resources/assets/betterend/models/block/end_mycelium.json deleted file mode 100644 index 825b3395..00000000 --- a/src/main/resources/assets/betterend/models/block/end_mycelium.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "parent": "block/cube", - "textures": { - "down": "block/end_stone", - "east": "betterend:block/end_mycelium_side", - "north": "betterend:block/end_mycelium_side", - "particle": "betterend:block/end_mycelium_side", - "south": "betterend:block/end_mycelium_side", - "up": "betterend:block/end_mycelium_top", - "west": "betterend:block/end_mycelium_side" - } -} diff --git a/src/main/resources/assets/betterend/models/block/end_mycelium_path.json b/src/main/resources/assets/betterend/models/block/end_mycelium_path.json deleted file mode 100644 index 4fc48331..00000000 --- a/src/main/resources/assets/betterend/models/block/end_mycelium_path.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "parent": "betterend:block/path", - "textures": { - "top": "betterend:block/end_mycelium_path_top", - "side": "betterend:block/end_mycelium_side", - "bottom": "block/end_stone" - } -} diff --git a/src/main/resources/assets/betterend/models/block/jungle_moss.json b/src/main/resources/assets/betterend/models/block/jungle_moss.json deleted file mode 100644 index 1c9272ba..00000000 --- a/src/main/resources/assets/betterend/models/block/jungle_moss.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "parent": "block/cube", - "textures": { - "down": "block/end_stone", - "east": "betterend:block/jungle_moss_side", - "north": "betterend:block/jungle_moss_side", - "particle": "betterend:block/jungle_moss_side", - "south": "betterend:block/jungle_moss_side", - "up": "betterend:block/jungle_moss_top", - "west": "betterend:block/jungle_moss_side" - } -} diff --git a/src/main/resources/assets/betterend/models/block/jungle_moss_path.json b/src/main/resources/assets/betterend/models/block/jungle_moss_path.json deleted file mode 100644 index b9bdda5c..00000000 --- a/src/main/resources/assets/betterend/models/block/jungle_moss_path.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "parent": "betterend:block/path", - "textures": { - "top": "betterend:block/jungle_moss_path_top", - "side": "betterend:block/jungle_moss_side", - "bottom": "block/end_stone" - } -} diff --git a/src/main/resources/assets/betterend/models/block/lamellarium_01.json b/src/main/resources/assets/betterend/models/block/lamellarium_01.json new file mode 100644 index 00000000..0e73b1fd --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lamellarium_01.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/lamellarium" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lamellarium_02.json b/src/main/resources/assets/betterend/models/block/lamellarium_02.json new file mode 100644 index 00000000..8549d1ae --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lamellarium_02.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/lamellarium" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lamellarium_03.json b/src/main/resources/assets/betterend/models/block/lamellarium_03.json new file mode 100644 index 00000000..82d784e4 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lamellarium_03.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/lamellarium" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lamellarium_04.json b/src/main/resources/assets/betterend/models/block/lamellarium_04.json new file mode 100644 index 00000000..94d36cef --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lamellarium_04.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/lamellarium" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lutebus_01.json b/src/main/resources/assets/betterend/models/block/lutebus_01.json new file mode 100644 index 00000000..c30688e8 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lutebus_01.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/lutebus" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lutebus_02.json b/src/main/resources/assets/betterend/models/block/lutebus_02.json new file mode 100644 index 00000000..0df1ef26 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lutebus_02.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/lutebus" + } +} diff --git a/src/main/resources/assets/betterend/models/block/orango_01.json b/src/main/resources/assets/betterend/models/block/orango_01.json new file mode 100644 index 00000000..9b12c38d --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/orango_01.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/orango" + } +} diff --git a/src/main/resources/assets/betterend/models/block/orango_02.json b/src/main/resources/assets/betterend/models/block/orango_02.json new file mode 100644 index 00000000..f1f7ee15 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/orango_02.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/orango" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/orango_03.json b/src/main/resources/assets/betterend/models/block/orango_03.json new file mode 100644 index 00000000..cb4a6076 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/orango_03.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/orango" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/orango_04.json b/src/main/resources/assets/betterend/models/block/orango_04.json new file mode 100644 index 00000000..2625775c --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/orango_04.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/orango" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/pink_moss.json b/src/main/resources/assets/betterend/models/block/pink_moss.json deleted file mode 100644 index 237cb110..00000000 --- a/src/main/resources/assets/betterend/models/block/pink_moss.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "parent": "block/cube", - "textures": { - "down": "block/end_stone", - "east": "betterend:block/pink_moss_side", - "north": "betterend:block/pink_moss_side", - "particle": "betterend:block/pink_moss_side", - "south": "betterend:block/pink_moss_side", - "up": "betterend:block/pink_moss_top", - "west": "betterend:block/pink_moss_side" - } -} diff --git a/src/main/resources/assets/betterend/models/block/pink_moss_path.json b/src/main/resources/assets/betterend/models/block/pink_moss_path.json deleted file mode 100644 index 9f46434e..00000000 --- a/src/main/resources/assets/betterend/models/block/pink_moss_path.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "parent": "betterend:block/path", - "textures": { - "top": "betterend:block/pink_moss_path_top", - "side": "betterend:block/pink_moss_side", - "bottom": "block/end_stone" - } -} diff --git a/src/main/resources/assets/betterend/models/block/shadow_grass.json b/src/main/resources/assets/betterend/models/block/shadow_grass.json deleted file mode 100644 index fff020c9..00000000 --- a/src/main/resources/assets/betterend/models/block/shadow_grass.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "parent": "block/cube", - "textures": { - "down": "block/end_stone", - "east": "betterend:block/shadow_grass_side", - "north": "betterend:block/shadow_grass_side", - "particle": "betterend:block/shadow_grass_side", - "south": "betterend:block/shadow_grass_side", - "up": "betterend:block/shadow_grass_top", - "west": "betterend:block/shadow_grass_side" - } -} diff --git a/src/main/resources/assets/betterend/models/block/shadow_grass_path.json b/src/main/resources/assets/betterend/models/block/shadow_grass_path.json deleted file mode 100644 index 23a7a0ac..00000000 --- a/src/main/resources/assets/betterend/models/block/shadow_grass_path.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "parent": "betterend:block/path", - "textures": { - "top": "betterend:block/shadow_grass_path_top", - "side": "betterend:block/shadow_grass_side", - "bottom": "block/end_stone" - } -} diff --git a/src/main/resources/assets/betterend/models/item/aeridium.json b/src/main/resources/assets/betterend/models/item/aeridium.json new file mode 100644 index 00000000..4ae73819 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/aeridium.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/aeridium" + } +} diff --git a/src/main/resources/assets/betterend/models/item/cave_moss.json b/src/main/resources/assets/betterend/models/item/cave_moss.json deleted file mode 100644 index 56fbfe9f..00000000 --- a/src/main/resources/assets/betterend/models/item/cave_moss.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/cave_moss" -} diff --git a/src/main/resources/assets/betterend/models/item/cave_moss_path.json b/src/main/resources/assets/betterend/models/item/cave_moss_path.json deleted file mode 100644 index 8f2a130f..00000000 --- a/src/main/resources/assets/betterend/models/item/cave_moss_path.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/cave_moss_path" -} diff --git a/src/main/resources/assets/betterend/models/item/chorus_nylium.json b/src/main/resources/assets/betterend/models/item/chorus_nylium.json deleted file mode 100644 index c3e7084c..00000000 --- a/src/main/resources/assets/betterend/models/item/chorus_nylium.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/chorus_nylium" -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/chorus_nylium_path.json b/src/main/resources/assets/betterend/models/item/chorus_nylium_path.json deleted file mode 100644 index da096761..00000000 --- a/src/main/resources/assets/betterend/models/item/chorus_nylium_path.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/chorus_nylium_path" -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/crystal_moss.json b/src/main/resources/assets/betterend/models/item/crystal_moss.json deleted file mode 100644 index 187ee92c..00000000 --- a/src/main/resources/assets/betterend/models/item/crystal_moss.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/crystal_moss" -} diff --git a/src/main/resources/assets/betterend/models/item/crystal_moss_path.json b/src/main/resources/assets/betterend/models/item/crystal_moss_path.json deleted file mode 100644 index fbfcbe61..00000000 --- a/src/main/resources/assets/betterend/models/item/crystal_moss_path.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/crystal_moss_path" -} diff --git a/src/main/resources/assets/betterend/models/item/end_moss.json b/src/main/resources/assets/betterend/models/item/end_moss.json deleted file mode 100644 index 2b859c25..00000000 --- a/src/main/resources/assets/betterend/models/item/end_moss.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/end_moss" -} diff --git a/src/main/resources/assets/betterend/models/item/end_moss_path.json b/src/main/resources/assets/betterend/models/item/end_moss_path.json deleted file mode 100644 index 7d7de48a..00000000 --- a/src/main/resources/assets/betterend/models/item/end_moss_path.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/end_moss_path" -} diff --git a/src/main/resources/assets/betterend/models/item/end_mycelium.json b/src/main/resources/assets/betterend/models/item/end_mycelium.json deleted file mode 100644 index 2dac73a6..00000000 --- a/src/main/resources/assets/betterend/models/item/end_mycelium.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/end_mycelium" -} diff --git a/src/main/resources/assets/betterend/models/item/end_mycelium_path.json b/src/main/resources/assets/betterend/models/item/end_mycelium_path.json deleted file mode 100644 index 44e814c3..00000000 --- a/src/main/resources/assets/betterend/models/item/end_mycelium_path.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/end_mycelium_path" -} diff --git a/src/main/resources/assets/betterend/models/item/jungle_moss.json b/src/main/resources/assets/betterend/models/item/jungle_moss.json deleted file mode 100644 index 321d91e6..00000000 --- a/src/main/resources/assets/betterend/models/item/jungle_moss.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/jungle_moss" -} diff --git a/src/main/resources/assets/betterend/models/item/jungle_moss_path.json b/src/main/resources/assets/betterend/models/item/jungle_moss_path.json deleted file mode 100644 index a061d63b..00000000 --- a/src/main/resources/assets/betterend/models/item/jungle_moss_path.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/jungle_moss_path" -} diff --git a/src/main/resources/assets/betterend/models/item/lamellarium.json b/src/main/resources/assets/betterend/models/item/lamellarium.json new file mode 100644 index 00000000..34cbcff7 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/lamellarium.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/lamellarium" + } +} diff --git a/src/main/resources/assets/betterend/models/item/lutebus.json b/src/main/resources/assets/betterend/models/item/lutebus.json new file mode 100644 index 00000000..335739a8 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/lutebus.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/lutebus" + } +} diff --git a/src/main/resources/assets/betterend/models/item/orango.json b/src/main/resources/assets/betterend/models/item/orango.json new file mode 100644 index 00000000..b0b842a6 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/orango.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/orango" + } +} diff --git a/src/main/resources/assets/betterend/models/item/pink_moss.json b/src/main/resources/assets/betterend/models/item/pink_moss.json deleted file mode 100644 index 275797f5..00000000 --- a/src/main/resources/assets/betterend/models/item/pink_moss.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/pink_moss" -} diff --git a/src/main/resources/assets/betterend/models/item/pink_moss_path.json b/src/main/resources/assets/betterend/models/item/pink_moss_path.json deleted file mode 100644 index de77462e..00000000 --- a/src/main/resources/assets/betterend/models/item/pink_moss_path.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/pink_moss_path" -} diff --git a/src/main/resources/assets/betterend/models/item/shadow_grass.json b/src/main/resources/assets/betterend/models/item/shadow_grass.json deleted file mode 100644 index 2ae401d8..00000000 --- a/src/main/resources/assets/betterend/models/item/shadow_grass.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/shadow_grass" -} diff --git a/src/main/resources/assets/betterend/models/item/shadow_grass_path.json b/src/main/resources/assets/betterend/models/item/shadow_grass_path.json deleted file mode 100644 index 899af266..00000000 --- a/src/main/resources/assets/betterend/models/item/shadow_grass_path.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/shadow_grass_path" -} diff --git a/src/main/resources/assets/betterend/patterns/block/path.json b/src/main/resources/assets/betterend/patterns/block/path.json new file mode 100644 index 00000000..747d9c1b --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/path.json @@ -0,0 +1,7 @@ +{ "parent": "betterend:block/path", + "textures": { + "top": "betterend:block/%top%", + "side": "betterend:block/%side%", + "bottom": "block/end_stone" + } +} diff --git a/src/main/resources/assets/betterend/patterns/block/top_side_bottom.json b/src/main/resources/assets/betterend/patterns/block/top_side_bottom.json new file mode 100644 index 00000000..d0727650 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/top_side_bottom.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/cube_bottom_top", + "textures": { + "bottom": "%bottom%", + "side": "%side%", + "top": "%top%" + } +} diff --git a/src/main/resources/assets/betterend/patterns/blockstate/rotated_top.json b/src/main/resources/assets/betterend/patterns/blockstate/rotated_top.json new file mode 100644 index 00000000..f97c20c9 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/blockstate/rotated_top.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:pattern/%block%" }, + { "model": "betterend:pattern/%block%", "y": 90 }, + { "model": "betterend:pattern/%block%", "y": 180 }, + { "model": "betterend:pattern/%block%", "y": 270 } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/aeridium.png b/src/main/resources/assets/betterend/textures/block/aeridium.png new file mode 100644 index 0000000000000000000000000000000000000000..359798c6468c348f7836da5675eeba6ad4dd9c6d GIT binary patch literal 418 zcmV;T0bTxyP)Px$TuDShR5*==k}+$-Kp2MKD?0R=t%HMNAW#qsPJ%-RDXoJ;gFm2uAcJ)6-v}Kt z_$Nv_i7lanLl=jDT>>Xpsv_bR<6z-Bl!WBc({H@*d!P62{SG)%`vDW&dK0St$uYrV zGQ*lJl?Da*AQlLxF92Zc+o<+*VE6}LOlHuX8xqeG82|vn>5Hw;!RNc=tlq8R%kN>$ zmS_&|^MIIMZ9HS^bMVzS^il-?-~}5Pl%n3Pfmlx&(O2h^g4!;0P^Vy{UCGdk<~l z&SneXx?amJ7q_OL{lBk>Omjd)1hd|n#*ka~x3&viO9&V1d4H-YR<7JWKEm?aGK-BB abJXn==PjDFE4=~eJqAx#KbLh*2~7YcUv5(X literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lutebus.png b/src/main/resources/assets/betterend/textures/block/lutebus.png new file mode 100644 index 0000000000000000000000000000000000000000..0bb4ac518ad49b1d7ce4fc976212c82dea4cb1f2 GIT binary patch literal 503 zcmVPx$u}MThR5*>rl0Q$|Kp4h2M(IqUNKo)6}0SN~30V1(g>QpNo85p}Dv3Ez} z3*-Z|f(gkRk|mZ7VE}cp8>*{O|Ck|G)wq&NOne>SPEOjiV{bd%^LyS$&wKE{kNB5h zu)D5m&BmR0=gn-r>UNascGNVix*avxU01WXiiVRQBnd)#FP<22t=S+6Lj3;lw_y_o zNf5Gha3N%zvDx0>@Tp@2GR|;4Da!Dfe~wNy2e5Q-ApoK@#|c87KWlLaDhWcOG@qD! zblk)Bq|ieu{Bs=JLdF?Un&Wy>l=VVKlW~S)TLwBE6qHS(G^hRe5w&K6 zqvIYci}N_PMfGKU?v-{|qk;!Nzq8s}Z8Qr8_yw{E0V`HaLpA^a002ovPDHLkV1lz{AyYoqdVUxj$8eb>=Y-g`(kMMmh~X(^qV uE%(jlr!+k@6f!D4>l`HZv53J!yMm#opV5rfc(Do43I9@*XhY za60(6{*%M>n_B_}*1TA?OeN^NMdPW5Di6+ZJc$oxbkQ!l%Ds3eFIz9mjVjA-U3UHX z=~v$9y|}{YBeL<7b!A7CegDI%S1MofWepFTAM7pte`8^qm3Hr=!nS)FK1aX&>DSE3 dJ`krGzh8pc`ghUVUqJgAJYD@<);T3K0RWTlS^EG0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/rutiscus_side.png b/src/main/resources/assets/betterend/textures/block/rutiscus_side.png new file mode 100644 index 0000000000000000000000000000000000000000..6c4fcd0f42aeb4e2d9fbd4e807ad134d154f4797 GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~^#Gp`S0KIL zUGr*?(cM_Xr`hIjtDJsx1s&bjefC)Q)mu~UJzMhb+m>&?_U0SU-~lS-EeY}qX84Z; zbXgqN0wuaVT^vIsrpo%Z3or(dd#EUd~8`kn|a7drmg z<`bP1|ub;1c_pPNS)M@*7kCr%F=ldMup)wD6@ksO${sd| zaO@JXW!B}`wfoy)oy}WS?^=6z?rGP&IrHzTf;Hv#3%{F2EZKN@f}YvDvyyNAG6r8| VT^sE-=>X7K44$rjF6*2UngEZJdD8#@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/rutiscus_top.png b/src/main/resources/assets/betterend/textures/block/rutiscus_top.png new file mode 100644 index 0000000000000000000000000000000000000000..916ab99873e6cbe0419c3acea3f5cf8e8091681d GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~p#Yx{S0H^g z$mnjY;nQsMw^dF*x`LQfJvIYH*-C=^f*JmUKvm^~e?XB^PZ!4!iK(jo>_QC&JY0wW z*GDdxSEZ@_g<-;^&%ft96k(A3bgHt?@yh1kmRxQ&ylU1QJdy?{POsSgNr7cu2+O}Y z#+{e%=m{`wU7=L9`sCqHT>8Q158c|i;dYy7V_5CiEqQ0I@a&y%*TExr-)dX6qubiL bHNG=P2r*UPzx8`M&;bmdu6{1-oD!M<>;_py literal 0 HcmV?d00001 From 81fe38ad8d4edec54a3008c47ade362fb166cb77 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 28 Feb 2021 20:35:29 +0300 Subject: [PATCH 296/463] Dry Shrubland biome --- .../java/ru/betterend/registry/EndBiomes.java | 2 ++ .../ru/betterend/registry/EndFeatures.java | 4 +++ .../world/biome/DryShrublandBiome.java | 25 ++++++++++++++++++ .../materialmaps/block/aeridium.json | 3 +++ .../materialmaps/block/lamellarium.json | 3 +++ .../betterend/materialmaps/block/lutebus.json | 3 +++ .../betterend/materialmaps/block/orango.json | 3 +++ .../betterend/textures/block/aeridium_e.png | Bin 0 -> 146 bytes 8 files changed, 43 insertions(+) create mode 100644 src/main/java/ru/betterend/world/biome/DryShrublandBiome.java create mode 100644 src/main/resources/assets/betterend/materialmaps/block/aeridium.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/lamellarium.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/lutebus.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/orango.json create mode 100644 src/main/resources/assets/betterend/textures/block/aeridium_e.png diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index 3cb2de94..a21fbd92 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -44,6 +44,7 @@ import ru.betterend.world.biome.BiomeShadowForest; import ru.betterend.world.biome.BiomeSulphurSprings; import ru.betterend.world.biome.BiomeUmbrellaJungle; import ru.betterend.world.biome.DragonGraveyardsBiome; +import ru.betterend.world.biome.DryShrublandBiome; import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.GlowingGrasslandsBiome; import ru.betterend.world.generator.BELayerRandomSource; @@ -87,6 +88,7 @@ public class EndBiomes { public static final EndBiome UMBRELLA_JUNGLE = registerBiome(new BiomeUmbrellaJungle(), BiomeType.LAND); public static final EndBiome GLOWING_GRASSLANDS = registerBiome(new GlowingGrasslandsBiome(), BiomeType.LAND); public static final EndBiome DRAGON_GRAVEYARDS = registerBiome(new DragonGraveyardsBiome(), BiomeType.LAND); + public static final EndBiome DRY_SHRUBLAND = registerBiome(new DryShrublandBiome(), BiomeType.LAND); // Better End Void public static final EndBiome ICE_STARFIELD = registerBiome(new BiomeIceStarfield(), BiomeType.VOID); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index d4af375d..6ce1e508 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -103,6 +103,10 @@ public class EndFeatures { public static final EndFeature UMBRELLA_MOSS_RARE = new EndFeature("umbrella_moss_rare", new SinglePlantFeature(EndBlocks.UMBRELLA_MOSS, 3), 2); public static final EndFeature CREEPING_MOSS_RARE = new EndFeature("creeping_moss_rare", new SinglePlantFeature(EndBlocks.CREEPING_MOSS, 3), 2); public static final EndFeature TWISTED_UMBRELLA_MOSS_RARE = new EndFeature("twisted_umbrella_moss_rare", new SinglePlantFeature(EndBlocks.TWISTED_UMBRELLA_MOSS, 3), 2); + public static final EndFeature ORANGO = new EndFeature("orango", new SinglePlantFeature(EndBlocks.ORANGO, 5), 6); + public static final EndFeature AERIDIUM = new EndFeature("aeridium", new SinglePlantFeature(EndBlocks.AERIDIUM, 5, 4), 5); + public static final EndFeature LUTEBUS = new EndFeature("lutebus", new SinglePlantFeature(EndBlocks.LUTEBUS, 5, 2), 5); + public static final EndFeature LAMELLARIUM = new EndFeature("lamellarium", new SinglePlantFeature(EndBlocks.LAMELLARIUM, 5), 6); // Vines // public static final EndFeature DENSE_VINE = new EndFeature("dense_vine", new VineFeature(EndBlocks.DENSE_VINE, 24), 3); diff --git a/src/main/java/ru/betterend/world/biome/DryShrublandBiome.java b/src/main/java/ru/betterend/world/biome/DryShrublandBiome.java new file mode 100644 index 00000000..89f4253f --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/DryShrublandBiome.java @@ -0,0 +1,25 @@ +package ru.betterend.world.biome; + +import net.minecraft.entity.EntityType; +import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndSounds; + +public class DryShrublandBiome extends EndBiome { + public DryShrublandBiome() { + super(new BiomeDefinition("dry_shrubland") + .setFogColor(132, 35, 13) + .setFogDensity(1.2F) + .setWaterAndFogColor(113, 88, 53) + .setPlantsColor(237, 122, 66) + .setSurface(EndBlocks.RUTISCUS) + .setMusic(EndSounds.MUSIC_OPENSPACE) + .addFeature(EndFeatures.ORANGO) + .addFeature(EndFeatures.AERIDIUM) + .addFeature(EndFeatures.LUTEBUS) + .addFeature(EndFeatures.LAMELLARIUM) + .addStructureFeature(ConfiguredStructureFeatures.END_CITY) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + } +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/aeridium.json b/src/main/resources/assets/betterend/materialmaps/block/aeridium.json new file mode 100644 index 00000000..83329294 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/aeridium.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_floor_glow_50_blue" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/lamellarium.json b/src/main/resources/assets/betterend/materialmaps/block/lamellarium.json new file mode 100644 index 00000000..352de84b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/lamellarium.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_floor" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/lutebus.json b/src/main/resources/assets/betterend/materialmaps/block/lutebus.json new file mode 100644 index 00000000..352de84b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/lutebus.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_floor" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/orango.json b/src/main/resources/assets/betterend/materialmaps/block/orango.json new file mode 100644 index 00000000..352de84b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/orango.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_floor" +} diff --git a/src/main/resources/assets/betterend/textures/block/aeridium_e.png b/src/main/resources/assets/betterend/textures/block/aeridium_e.png new file mode 100644 index 0000000000000000000000000000000000000000..9a3ee876cf0a5428f55b87fbb9164160832a3cf0 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~o&cW^S0Md+ z_PvLhd(XHp`Qf3U3gokt1o;Is{Qv)dv#vu2kgwwD;us<^H94Vy$xV%og`sf9jEO7@ nWJFv&9_>)|U<@&AabjRlILDxw_Vk<}P(6dEtDnm{r-UW|^!O)V literal 0 HcmV?d00001 From 5e3a3ef6cd49ba2c1ef0dbe238cc95f210d2825a Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 28 Feb 2021 23:19:08 +0300 Subject: [PATCH 297/463] Amaranita mushroom blocks (WIP), Sagnum --- .../betterend/blocks/AmaranitaCapBlock.java | 13 +++ .../blocks/AmaranitaHymenophoreBlock.java | 20 ++++ .../ru/betterend/blocks/BlockProperties.java | 2 + .../betterend/blocks/LargeAmaranitaBlock.java | 44 ++++++++ .../blocks/MossyGlowshroomCapBlock.java | 2 +- .../betterend/blocks/SmallAmaranitaBlock.java | 12 +++ .../blocks/basis/EndLanternBlock.java | 3 +- .../java/ru/betterend/registry/EndBlocks.java | 13 +++ .../java/ru/betterend/util/BonemealUtil.java | 5 + .../world/biome/DragonGraveyardsBiome.java | 2 +- .../betterend/blockstates/amaranita_fur.json | 10 ++ .../blockstates/large_amaranita_mushroom.json | 7 ++ .../blockstates/small_amaranita_mushroom.json | 8 ++ .../betterend/models/block/amaranita_fur.json | 75 ++++++++++++++ .../block/amaranita_hymenophore_fur.json | 81 +++++++++++++++ .../models/block/large_amaranita_cap.json | 96 ++++++++++++++++++ .../models/block/large_amaranita_roots.json | 43 ++++++++ .../models/block/large_amaranita_stem.json | 20 ++++ .../models/block/mossy_obsidian.json | 2 +- .../block/small_amaranita_mushroom_01.json | 6 ++ .../block/small_amaranita_mushroom_02.json | 6 ++ .../betterend/models/item/amaranita_fur.json | 6 ++ .../models/item/small_amaranita_mushroom.json | 6 ++ .../textures/block/amaranita_cap.png | Bin 0 -> 251 bytes .../textures/block/amaranita_fur.png | Bin 0 -> 186 bytes .../textures/block/amaranita_hymenophore.png | Bin 0 -> 231 bytes .../block/amaranita_hymenophore_fur.png | Bin 0 -> 166 bytes .../textures/block/amaranita_hyphae_side.png | Bin 0 -> 218 bytes .../textures/block/amaranita_hyphae_top.png | Bin 0 -> 244 bytes .../textures/block/amaranita_roots.png | Bin 0 -> 178 bytes .../textures/block/amaranita_stem.png | Bin 0 -> 199 bytes .../textures/block/amaranita_stem_top.png | Bin 0 -> 189 bytes .../block/large_amaranita_cap_bottom.png | Bin 0 -> 258 bytes .../block/large_amaranita_cap_side.png | Bin 0 -> 242 bytes .../block/large_amaranita_cap_top.png | Bin 0 -> 384 bytes .../textures/block/mossy_obsidian_side.png | Bin 2183 -> 261 bytes .../textures/block/sangnum_path_top.png | Bin 0 -> 225 bytes .../betterend/textures/block/sangnum_side.png | Bin 0 -> 304 bytes .../betterend/textures/block/sangnum_top.png | Bin 0 -> 243 bytes .../block/small_amaranita_mushroom.png | Bin 0 -> 190 bytes 40 files changed, 478 insertions(+), 4 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/AmaranitaCapBlock.java create mode 100644 src/main/java/ru/betterend/blocks/AmaranitaHymenophoreBlock.java create mode 100644 src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java create mode 100644 src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java create mode 100644 src/main/resources/assets/betterend/blockstates/amaranita_fur.json create mode 100644 src/main/resources/assets/betterend/blockstates/large_amaranita_mushroom.json create mode 100644 src/main/resources/assets/betterend/blockstates/small_amaranita_mushroom.json create mode 100644 src/main/resources/assets/betterend/models/block/amaranita_fur.json create mode 100644 src/main/resources/assets/betterend/models/block/amaranita_hymenophore_fur.json create mode 100644 src/main/resources/assets/betterend/models/block/large_amaranita_cap.json create mode 100644 src/main/resources/assets/betterend/models/block/large_amaranita_roots.json create mode 100644 src/main/resources/assets/betterend/models/block/large_amaranita_stem.json create mode 100644 src/main/resources/assets/betterend/models/block/small_amaranita_mushroom_01.json create mode 100644 src/main/resources/assets/betterend/models/block/small_amaranita_mushroom_02.json create mode 100644 src/main/resources/assets/betterend/models/item/amaranita_fur.json create mode 100644 src/main/resources/assets/betterend/models/item/small_amaranita_mushroom.json create mode 100644 src/main/resources/assets/betterend/textures/block/amaranita_cap.png create mode 100644 src/main/resources/assets/betterend/textures/block/amaranita_fur.png create mode 100644 src/main/resources/assets/betterend/textures/block/amaranita_hymenophore.png create mode 100644 src/main/resources/assets/betterend/textures/block/amaranita_hymenophore_fur.png create mode 100644 src/main/resources/assets/betterend/textures/block/amaranita_hyphae_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/amaranita_hyphae_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/amaranita_roots.png create mode 100644 src/main/resources/assets/betterend/textures/block/amaranita_stem.png create mode 100644 src/main/resources/assets/betterend/textures/block/amaranita_stem_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/large_amaranita_cap_bottom.png create mode 100644 src/main/resources/assets/betterend/textures/block/large_amaranita_cap_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/large_amaranita_cap_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/sangnum_path_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/sangnum_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/sangnum_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/small_amaranita_mushroom.png diff --git a/src/main/java/ru/betterend/blocks/AmaranitaCapBlock.java b/src/main/java/ru/betterend/blocks/AmaranitaCapBlock.java new file mode 100644 index 00000000..2af9deb0 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/AmaranitaCapBlock.java @@ -0,0 +1,13 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.block.Material; +import net.minecraft.sound.BlockSoundGroup; +import ru.betterend.blocks.basis.BlockBase; + +public class AmaranitaCapBlock extends BlockBase { + public AmaranitaCapBlock() { + super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sounds(BlockSoundGroup.WOOD)); + } +} diff --git a/src/main/java/ru/betterend/blocks/AmaranitaHymenophoreBlock.java b/src/main/java/ru/betterend/blocks/AmaranitaHymenophoreBlock.java new file mode 100644 index 00000000..36c8310c --- /dev/null +++ b/src/main/java/ru/betterend/blocks/AmaranitaHymenophoreBlock.java @@ -0,0 +1,20 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.block.Material; +import net.minecraft.sound.BlockSoundGroup; +import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; + +public class AmaranitaHymenophoreBlock extends BlockBase implements IRenderTypeable { + public AmaranitaHymenophoreBlock() { + super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sounds(BlockSoundGroup.WOOD)); + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } +} diff --git a/src/main/java/ru/betterend/blocks/BlockProperties.java b/src/main/java/ru/betterend/blocks/BlockProperties.java index 34dfb472..b3bad26f 100644 --- a/src/main/java/ru/betterend/blocks/BlockProperties.java +++ b/src/main/java/ru/betterend/blocks/BlockProperties.java @@ -12,8 +12,10 @@ public class BlockProperties { public static final EnumProperty TRIPLE_SHAPE = EnumProperty.of("shape", TripleShape.class); public static final EnumProperty PENTA_SHAPE = EnumProperty.of("shape", PentaShape.class); + public static final BooleanProperty TRANSITION = BooleanProperty.of("transition"); public static final BooleanProperty HAS_LIGHT = BooleanProperty.of("has_light"); public static final BooleanProperty HAS_ITEM = BooleanProperty.of("has_item"); + public static final BooleanProperty IS_FLOOR = BooleanProperty.of("is_floor"); public static final BooleanProperty NATURAL = BooleanProperty.of("natural"); public static final BooleanProperty ACTIVE = BooleanProperty.of("active"); diff --git a/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java b/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java new file mode 100644 index 00000000..e8765669 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java @@ -0,0 +1,44 @@ +package ru.betterend.blocks; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.EnumProperty; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.WorldView; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.blocks.basis.EndPlantBlock; +import ru.betterend.registry.EndBlocks; + +public class LargeAmaranitaBlock extends EndPlantBlock { + public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; + + @Override + protected boolean isTerrain(BlockState state) { + return state.getBlock() == EndBlocks.SANGNUM; + } + + @Override + protected void appendProperties(StateManager.Builder stateManager) { + stateManager.add(SHAPE); + } + + @Override + public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + TripleShape shape = state.get(SHAPE); + if (shape == TripleShape.BOTTOM) { + return isTerrain(world.getBlockState(pos.down())) && world.getBlockState(pos.up()).isOf(this); + } + else if (shape == TripleShape.TOP) { + return world.getBlockState(pos.down()).isOf(this); + } + else { + return world.getBlockState(pos.down()).isOf(this) && world.getBlockState(pos.up()).isOf(this); + } + } + + @Override + public OffsetType getOffsetType() { + return OffsetType.NONE; + } +} diff --git a/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java b/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java index af9338a4..7f635583 100644 --- a/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java +++ b/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java @@ -13,7 +13,7 @@ import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; public class MossyGlowshroomCapBlock extends BlockBase { - public static final BooleanProperty TRANSITION = BooleanProperty.of("transition"); + public static final BooleanProperty TRANSITION = BlockProperties.TRANSITION; public MossyGlowshroomCapBlock() { super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sounds(BlockSoundGroup.WOOD)); diff --git a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java new file mode 100644 index 00000000..4b2f6563 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java @@ -0,0 +1,12 @@ +package ru.betterend.blocks; + +import net.minecraft.block.BlockState; +import ru.betterend.blocks.basis.EndPlantBlock; +import ru.betterend.registry.EndBlocks; + +public class SmallAmaranitaBlock extends EndPlantBlock { + @Override + protected boolean isTerrain(BlockState state) { + return state.getBlock() == EndBlocks.SANGNUM; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java index 79992a35..0b876665 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java @@ -18,9 +18,10 @@ import net.minecraft.util.math.Direction; import net.minecraft.world.BlockView; import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; +import ru.betterend.blocks.BlockProperties; public class EndLanternBlock extends BlockBaseNotFull implements Waterloggable, FluidFillable { - public static final BooleanProperty IS_FLOOR = BooleanProperty.of("is_floor"); + public static final BooleanProperty IS_FLOOR = BlockProperties.IS_FLOOR; public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; public EndLanternBlock(Block source) { diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 5b511b3c..4835bf46 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -9,6 +9,8 @@ import net.minecraft.util.registry.Registry; import ru.betterend.BetterEnd; import ru.betterend.blocks.AeterniumAnvil; import ru.betterend.blocks.AeterniumBlock; +import ru.betterend.blocks.AmaranitaCapBlock; +import ru.betterend.blocks.AmaranitaHymenophoreBlock; import ru.betterend.blocks.AmberBlock; import ru.betterend.blocks.AncientEmeraldIceBlock; import ru.betterend.blocks.AuroraCrystalBlock; @@ -59,6 +61,7 @@ import ru.betterend.blocks.JellyshroomCapBlock; import ru.betterend.blocks.LacugroveSaplingBlock; import ru.betterend.blocks.LanceleafBlock; import ru.betterend.blocks.LanceleafSeedBlock; +import ru.betterend.blocks.LargeAmaranitaBlock; import ru.betterend.blocks.LumecornBlock; import ru.betterend.blocks.LumecornSeedBlock; import ru.betterend.blocks.MengerSpongeBlock; @@ -77,6 +80,7 @@ import ru.betterend.blocks.RunedFlavolite; import ru.betterend.blocks.ShadowBerryBlock; import ru.betterend.blocks.ShadowGrassBlock; import ru.betterend.blocks.SilkMothNestBlock; +import ru.betterend.blocks.SmallAmaranitaBlock; import ru.betterend.blocks.SmallJellyshroomBlock; import ru.betterend.blocks.SulphurCrystalBlock; import ru.betterend.blocks.TenaneaFlowersBlock; @@ -122,6 +126,7 @@ public class EndBlocks { public static final Block PINK_MOSS = registerBlock("pink_moss", new EndTerrainBlock(MaterialColor.PINK)); public static final Block AMBER_MOSS = registerBlock("amber_moss", new EndTerrainBlock(MaterialColor.ORANGE)); public static final Block JUNGLE_MOSS = registerBlock("jungle_moss", new EndTerrainBlock(MaterialColor.GREEN)); + public static final Block SANGNUM = registerBlock("sangnum", new EndTerrainBlock(MaterialColor.RED)); public static final Block RUTISCUS = registerBlock("rutiscus", new EndTerrainBlock(MaterialColor.ORANGE)); // Roads // @@ -134,6 +139,7 @@ public class EndBlocks { public static final Block PINK_MOSS_PATH = registerBlock("pink_moss_path", new EndPathBlock(PINK_MOSS)); public static final Block AMBER_MOSS_PATH = registerBlock("amber_moss_path", new EndPathBlock(AMBER_MOSS)); public static final Block JUNGLE_MOSS_PATH = registerBlock("jungle_moss_path", new EndPathBlock(JUNGLE_MOSS)); + public static final Block SANGNUM_PATH = registerBlock("sangnum_path", new EndPathBlock(SANGNUM)); public static final Block RUTISCUS_PATH = registerBlock("rutiscus_path", new EndPathBlock(RUTISCUS)); public static final Block MOSSY_OBSIDIAN = registerBlock("mossy_obsidian", new MossyObsidian()); @@ -247,6 +253,13 @@ public class EndBlocks { public static final Block LUMECORN_SEED = registerBlock("lumecorn_seed", new LumecornSeedBlock()); public static final Block LUMECORN = registerBlockNI("lumecorn", new LumecornBlock()); + public static final Block SMALL_AMARANITA_MUSHROOM = registerBlock("small_amaranita_mushroom", new SmallAmaranitaBlock()); + public static final Block LARGE_AMARANITA_MUSHROOM = registerBlockNI("large_amaranita_mushroom", new LargeAmaranitaBlock()); + public static final Block AMARANITA_HYPHAE = registerBlock("amaranita_hyphae", new AmaranitaCapBlock()); + public static final Block AMARANITA_HYMENOPHORE = registerBlock("amaranita_hymenophore", new AmaranitaHymenophoreBlock()); + public static final Block AMARANITA_FUR = registerBlock("amaranita_fur", new FurBlock(MOSSY_GLOWSHROOM_SAPLING, 15, 4)); + public static final Block AMARANITA_CAP = registerBlock("amaranita_cap", new AmaranitaCapBlock()); + // Crops public static final Block BLOSSOM_BERRY = registerBlock("blossom_berry_seed", new EndCropBlock(EndItems.BLOSSOM_BERRY, PINK_MOSS)); diff --git a/src/main/java/ru/betterend/util/BonemealUtil.java b/src/main/java/ru/betterend/util/BonemealUtil.java index 67146c8b..226235fd 100644 --- a/src/main/java/ru/betterend/util/BonemealUtil.java +++ b/src/main/java/ru/betterend/util/BonemealUtil.java @@ -42,6 +42,11 @@ public class BonemealUtil { addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.CREEPING_MOSS, 0.1F); addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.UMBRELLA_MOSS, 0.1F); addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.TWISTED_UMBRELLA_MOSS, 0.1F); + + addBonemealGrass(EndBlocks.RUTISCUS, EndBlocks.ORANGO); + addBonemealGrass(EndBlocks.RUTISCUS, EndBlocks.AERIDIUM, 0.2F); + addBonemealGrass(EndBlocks.RUTISCUS, EndBlocks.LUTEBUS, 0.2F); + addBonemealGrass(EndBlocks.RUTISCUS, EndBlocks.LAMELLARIUM); } public static void addBonemealGrass(Block terrain, Block plant) { diff --git a/src/main/java/ru/betterend/world/biome/DragonGraveyardsBiome.java b/src/main/java/ru/betterend/world/biome/DragonGraveyardsBiome.java index 17fdf531..41500b94 100644 --- a/src/main/java/ru/betterend/world/biome/DragonGraveyardsBiome.java +++ b/src/main/java/ru/betterend/world/biome/DragonGraveyardsBiome.java @@ -13,7 +13,7 @@ public class DragonGraveyardsBiome extends EndBiome { .setFogDensity(1.1F) .setMusic(EndSounds.MUSIC_OPENSPACE) .setLoop(EndSounds.AMBIENT_GLOWING_GRASSLANDS) - .setSurface(EndBlocks.CAVE_MOSS) + .setSurface(EndBlocks.SANGNUM) .setWaterAndFogColor(203, 59, 167) .setPlantsColor(244, 46, 79) .addFeature(EndFeatures.OBSIDIAN_PILLAR_BASEMENT) diff --git a/src/main/resources/assets/betterend/blockstates/amaranita_fur.json b/src/main/resources/assets/betterend/blockstates/amaranita_fur.json new file mode 100644 index 00000000..88cfa9e0 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/amaranita_fur.json @@ -0,0 +1,10 @@ +{ + "variants": { + "facing=up": { "model": "betterend:block/amaranita_fur" }, + "facing=down": { "model": "betterend:block/amaranita_fur", "x": 180 }, + "facing=north": { "model": "betterend:block/amaranita_fur", "x": 90 }, + "facing=south": { "model": "betterend:block/amaranita_fur", "x": 90, "y": 180 }, + "facing=east": { "model": "betterend:block/amaranita_fur", "x": 90, "y": 90 }, + "facing=west": { "model": "betterend:block/amaranita_fur", "x": 90, "y": 270 } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/large_amaranita_mushroom.json b/src/main/resources/assets/betterend/blockstates/large_amaranita_mushroom.json new file mode 100644 index 00000000..80bbb6c3 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/large_amaranita_mushroom.json @@ -0,0 +1,7 @@ +{ + "variants": { + "shape=top": { "model": "betterend:block/large_amaranita_cap" }, + "shape=middle": { "model": "betterend:block/large_amaranita_stem" }, + "shape=bottom": { "model": "betterend:block/large_amaranita_roots" } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/small_amaranita_mushroom.json b/src/main/resources/assets/betterend/blockstates/small_amaranita_mushroom.json new file mode 100644 index 00000000..84030665 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/small_amaranita_mushroom.json @@ -0,0 +1,8 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/small_amaranita_mushroom_01" }, + { "model": "betterend:block/small_amaranita_mushroom_02" } + ] + } +} diff --git a/src/main/resources/assets/betterend/models/block/amaranita_fur.json b/src/main/resources/assets/betterend/models/block/amaranita_fur.json new file mode 100644 index 00000000..2d30f61f --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amaranita_fur.json @@ -0,0 +1,75 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/amaranita_fur", + "texture": "betterend:block/amaranita_fur" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 0, -0.001, -8 ], + "to": [ 16, 0, 8 ], + "rotation": { "origin": [ 0, 0, 8 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, 0, 8 ], + "to": [ 16, 0.001, 24 ], + "rotation": { "origin": [ 0, 0.000000954, 8 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY4", + "from": [ 8, -0.001, 0 ], + "to": [ 24, 0, 16 ], + "rotation": { "origin": [ 8, 0, 16 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 270 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 270 } + } + }, + { + "__comment": "PlaneY4", + "from": [ -8, 0, 2 ], + "to": [ 8, 0.001, 18 ], + "rotation": { "origin": [ 8, 0, 18 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneX6", + "from": [ 0, 0, -6.5 ], + "to": [ 0.001, 16, 16 ], + "rotation": { "origin": [ 0, 16, 16 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneX6", + "from": [ -6.5, 0, 15.999 ], + "to": [ 16, 16, 16 ], + "rotation": { "origin": [ 16, 16, 16 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/amaranita_hymenophore_fur.json b/src/main/resources/assets/betterend/models/block/amaranita_hymenophore_fur.json new file mode 100644 index 00000000..71b5a46c --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amaranita_hymenophore_fur.json @@ -0,0 +1,81 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/amaranita_hymenophore_fur", + "texture": "betterend:block/amaranita_hymenophore_fur" + }, + "elements": [ + { + "__comment": "PlaneX1", + "from": [ 5, 12, 0 ], + "to": [ 5.001, 16, 16 ], + "faces": { + "west": { "uv": [ 16, 0, 0, 4 ], "texture": "#texture" }, + "east": { "uv": [ 16, 0, 0, 4 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX1", + "from": [ 11, 12, 0 ], + "to": [ 11.001, 16, 16 ], + "faces": { + "west": { "uv": [ 0, 0, 16, 4 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 4 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX1", + "from": [ 16, 12, 0 ], + "to": [ 16.001, 16, 16 ], + "faces": { + "west": { "uv": [ 16, 0, 0, 4 ], "texture": "#texture" }, + "east": { "uv": [ 16, 0, 0, 4 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX1", + "from": [ 0, 12, 0 ], + "to": [ 0.001, 16, 16 ], + "faces": { + "west": { "uv": [ 0, 0, 16, 4 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 4 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneZ11", + "from": [ 0, 12, 0 ], + "to": [ 16, 16, 0.001 ], + "faces": { + "north": { "uv": [ 16, 0, 0, 4 ], "texture": "#texture" }, + "south": { "uv": [ 16, 0, 0, 4 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneZ11", + "from": [ 0, 12, 5 ], + "to": [ 16, 16, 5.001 ], + "faces": { + "north": { "uv": [ 0, 0, 16, 4 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 4 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneZ11", + "from": [ 0, 12, 11 ], + "to": [ 16, 16, 11.001 ], + "faces": { + "north": { "uv": [ 16, 0, 0, 4 ], "texture": "#texture" }, + "south": { "uv": [ 16, 0, 0, 4 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneZ11", + "from": [ 0, 12, 16 ], + "to": [ 16, 16, 16.001 ], + "faces": { + "north": { "uv": [ 0, 0, 16, 4 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 4 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/large_amaranita_cap.json b/src/main/resources/assets/betterend/models/block/large_amaranita_cap.json new file mode 100644 index 00000000..8a5e634b --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/large_amaranita_cap.json @@ -0,0 +1,96 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/large_amaranita_cap_side", + "side": "betterend:block/large_amaranita_cap_side", + "top": "betterend:block/large_amaranita_cap_top", + "bottom": "betterend:block/large_amaranita_cap_bottom", + "stem": "betterend:block/amaranita_stem_top" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 1, 7, 1 ], + "to": [ 15, 14, 15 ], + "faces": { + "down": { "uv": [ 1, 1, 15, 15 ], "texture": "#bottom" }, + "up": { "uv": [ 1, 1, 15, 15 ], "texture": "#top" }, + "north": { "uv": [ 1, 2, 15, 9 ], "texture": "#side" }, + "south": { "uv": [ 1, 2, 15, 9 ], "texture": "#side" }, + "west": { "uv": [ 1, 2, 15, 9 ], "texture": "#side" }, + "east": { "uv": [ 1, 2, 15, 9 ], "texture": "#side" } + } + }, + { + "__comment": "Box1", + "from": [ 3, 14, 3 ], + "to": [ 13, 16, 13 ], + "faces": { + "up": { "uv": [ 3, 3, 13, 13 ], "texture": "#top", "cullface": "up" }, + "north": { "uv": [ 3, 0, 13, 2 ], "texture": "#side" }, + "south": { "uv": [ 3, 0, 13, 2 ], "texture": "#side" }, + "west": { "uv": [ 3, 0, 13, 2 ], "texture": "#side" }, + "east": { "uv": [ 3, 0, 13, 2 ], "texture": "#side" } + } + }, + { + "__comment": "Box4", + "from": [ 6, 0, 6 ], + "to": [ 10, 4, 10 ], + "faces": { + "north": { "uv": [ 6, 12, 10, 16 ], "texture": "#stem" }, + "south": { "uv": [ 6, 12, 10, 16 ], "texture": "#stem" }, + "west": { "uv": [ 6, 12, 10, 16 ], "texture": "#stem" }, + "east": { "uv": [ 6, 12, 10, 16 ], "texture": "#stem" } + } + }, + { + "__comment": "Box4", + "from": [ 5, 4, 5 ], + "to": [ 11, 7, 11 ], + "faces": { + "down": { "uv": [ 5, 2, 11, 8 ], "texture": "#stem" }, + "north": { "uv": [ 5, 9, 11, 12 ], "texture": "#stem" }, + "south": { "uv": [ 5, 9, 11, 12 ], "texture": "#stem" }, + "west": { "uv": [ 5, 9, 11, 12 ], "texture": "#stem" }, + "east": { "uv": [ 5, 9, 11, 12 ], "texture": "#stem" } + } + }, + { + "__comment": "PlaneX6", + "from": [ 2, 3, 1 ], + "to": [ 2.001, 7, 15 ], + "faces": { + "west": { "uv": [ 1, 9, 15, 13 ], "texture": "#side" }, + "east": { "uv": [ 1, 9, 15, 13 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX6", + "from": [ 14, 3, 1 ], + "to": [ 14.001, 7, 15 ], + "faces": { + "west": { "uv": [ 1, 9, 15, 13 ], "texture": "#side" }, + "east": { "uv": [ 1, 9, 15, 13 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneZ8", + "from": [ 1, 3, 2 ], + "to": [ 15, 7, 2.001 ], + "faces": { + "north": { "uv": [ 1, 9, 15, 13 ], "texture": "#side" }, + "south": { "uv": [ 1, 9, 15, 13 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneZ8", + "from": [ 1, 3, 14 ], + "to": [ 15, 7, 14.001 ], + "faces": { + "north": { "uv": [ 1, 9, 15, 13 ], "texture": "#side" }, + "south": { "uv": [ 1, 9, 15, 13 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/large_amaranita_roots.json b/src/main/resources/assets/betterend/models/block/large_amaranita_roots.json new file mode 100644 index 00000000..21b01862 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/large_amaranita_roots.json @@ -0,0 +1,43 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/amaranita_stem", + "texture": "betterend:block/amaranita_stem", + "texture1": "betterend:block/amaranita_roots" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 6, 0, 6 ], + "to": [ 10, 16, 10 ], + "faces": { + "north": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, + "south": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, + "west": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, + "east": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0, 0, 0 ], + "to": [ 0.001, 16, 22.5 ], + "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture1" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture1" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, 0, 0 ], + "to": [ 16.001, 16, 22.5 ], + "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture1" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture1" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/large_amaranita_stem.json b/src/main/resources/assets/betterend/models/block/large_amaranita_stem.json new file mode 100644 index 00000000..5bde4f65 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/large_amaranita_stem.json @@ -0,0 +1,20 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/amaranita_stem", + "texture": "betterend:block/amaranita_stem" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 6, 0, 6 ], + "to": [ 10, 16, 10 ], + "faces": { + "north": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, + "south": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, + "west": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, + "east": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/mossy_obsidian.json b/src/main/resources/assets/betterend/models/block/mossy_obsidian.json index 78d52422..082f4bca 100644 --- a/src/main/resources/assets/betterend/models/block/mossy_obsidian.json +++ b/src/main/resources/assets/betterend/models/block/mossy_obsidian.json @@ -6,7 +6,7 @@ "north": "betterend:block/mossy_obsidian_side", "particle": "betterend:block/mossy_obsidian_side", "south": "betterend:block/mossy_obsidian_side", - "up": "betterend:block/cave_moss_top", + "up": "betterend:block/sangnum_top", "west": "betterend:block/mossy_obsidian_side" } } diff --git a/src/main/resources/assets/betterend/models/block/small_amaranita_mushroom_01.json b/src/main/resources/assets/betterend/models/block/small_amaranita_mushroom_01.json new file mode 100644 index 00000000..ae20c5ad --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/small_amaranita_mushroom_01.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/small_amaranita_mushroom" + } +} diff --git a/src/main/resources/assets/betterend/models/block/small_amaranita_mushroom_02.json b/src/main/resources/assets/betterend/models/block/small_amaranita_mushroom_02.json new file mode 100644 index 00000000..6f917ca4 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/small_amaranita_mushroom_02.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/small_amaranita_mushroom" + } +} diff --git a/src/main/resources/assets/betterend/models/item/amaranita_fur.json b/src/main/resources/assets/betterend/models/item/amaranita_fur.json new file mode 100644 index 00000000..67e96e5e --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/amaranita_fur.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/amaranita_fur" + } +} diff --git a/src/main/resources/assets/betterend/models/item/small_amaranita_mushroom.json b/src/main/resources/assets/betterend/models/item/small_amaranita_mushroom.json new file mode 100644 index 00000000..c6893c41 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/small_amaranita_mushroom.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/small_amaranita_mushroom" + } +} diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_cap.png b/src/main/resources/assets/betterend/textures/block/amaranita_cap.png new file mode 100644 index 0000000000000000000000000000000000000000..d01c8f756eb4cf0960a5f7fdd37ff326319afaf1 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~i2$DvS0KGv zTKcrA>Jvq!FUGbXpImu(V%6zYU5gb8uL0#aN`m}?8U91S)l(rxK(Sg+7sn8Zsk;4+ zObm(~Ost;&|37xU>*vao#BjzZ#cP(gLVW3^Q!)_&Q(gM{H#n5u_OaIy`nWk}h1T4S z41xYt$_cz5-Y+s-b6@64e9xZ7=#({%Ub){&;xer7UP;@1e4Z}r>WP<6e_892eq&$q qUZ-fzJ-0San*Da$gV3FFKNx0gV`g4@%c&da5C%_IKbLh*2~7Z!!eT=J literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_fur.png b/src/main/resources/assets/betterend/textures/block/amaranita_fur.png new file mode 100644 index 0000000000000000000000000000000000000000..57f1b50526baf5d5cfc6f043c2377b2a2032f2ef GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~{s5m4S0LSV zb=TbcXLh~0dHw6le{Fv!0fksgg8YIR{sV!`1vQXK9-c0aAre#9c6swP1aL6_-u-`O z>#rEeasRQ8MzJ^ za4={4{P{mwd~5OsCs#h-M~V}*)Lyh-Dr|icl+-4bQgF=VF8eN%6>Ljc7o6kq%3JMN z*=o3dYOzTNw|&BK)_c+m*p_~*%UxW|QfJ9F<(k;+=Jcvy?pJQ?>ke}-y8gYUnf;wK W^GwwjBIQ7f89ZJ6T-G@yGywqF+f{-9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_hymenophore_fur.png b/src/main/resources/assets/betterend/textures/block/amaranita_hymenophore_fur.png new file mode 100644 index 0000000000000000000000000000000000000000..e3f12d2633379c726f7baac840f8bddf4503f551 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~p#Yx{S0KHu zzi{7-veT=&9-dhB@yV6X0i`d1qHHBWe!&d?L7=Mg!9Spgfv1aOh{V*pU4dK-3L=MU zF2AdP`bPN$4`;H$lnBL-Q=$%?{L%8%iZ^Y?gSZEd_PNXx{26AH#~*wT)XU)M>gTe~ HDWM4fufRNB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_hyphae_side.png b/src/main/resources/assets/betterend/textures/block/amaranita_hyphae_side.png new file mode 100644 index 0000000000000000000000000000000000000000..40d6f6a2716887643c4e054719c1b032ca3e532d GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~p#Yx{S0G)n zac$+{jZIf~&AoqS*PEL^6S!M|qHHBWe!&d?L7=Mg!9So#il>WXh{ROe34vk^iX2RV zFaL$dxyIO68AS$kbgWUz)-t{@=}C2Olv~2nDFI1K!{#0?TOwGvIJL<=_Mh?^x#F9G z$^OS@IK}Yvm-Uq!ww$}x!J2RRE`Rm+PRAg_tlZtjJy+OkZrCsvOxw6a9%vtfr>mdK II;Vst0C0d%@c;k- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_hyphae_top.png b/src/main/resources/assets/betterend/textures/block/amaranita_hyphae_top.png new file mode 100644 index 0000000000000000000000000000000000000000..f41856aa0d50d75d3c2c87def87a8a9279a3816b GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~i2$DvS0J4{ zb85xLwUviAHeKB{_x_n(Z*E@y`cize!W*C*M@f)hFvEWcxOytY2q;$O>Eak7G1b-I zTkMDd$EKPyfAejUmaUHz@lr_$tnTm*n6&$L(uE+_^OE{eeuR?NpF7Mi{O5ke#>g3=MU~5RX_F>-1>fT k&9hj~+s-Q|Ze_1;;AYwCbos{~pbHp0UHx3vIVCg!02$C^sQ>@~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_roots.png b/src/main/resources/assets/betterend/textures/block/amaranita_roots.png new file mode 100644 index 0000000000000000000000000000000000000000..11edd90d64ff525f407211629efe38f6554b7705 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~p#Yx{S0Ej@ zs4rpN?8?I%o38Gfd;iS-c_y2HqHHBWe!&d?L7=Mg!9Spgji-xah{V*hy^LH84lFFG z*Z=RYF`KhXe2!Au@)>_a4ltj1rR~C@vyeeRTcbpNQn`N5rCRw T-U!?ZG>5^{)z4*}Q$iB}XKFkQ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_stem.png b/src/main/resources/assets/betterend/textures/block/amaranita_stem.png new file mode 100644 index 0000000000000000000000000000000000000000..b33c8778377690f541b101bfdbad7ee2d622603e GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|8a-VcLo9l? zPTI)ZV8Fv--=Q`ob7rgLjn1~YH<|@Ag4I+*ro}ukXL)$*yVp7SgfpA+)fukDFfzP0 zY2Ur~9+!XsLsHkZS+WZb7J5AM`_8&dU*LnrPF)9ww~s;_*mp4+yFVdQ&MBb@00Y8EJpcdz literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_stem_top.png b/src/main/resources/assets/betterend/textures/block/amaranita_stem_top.png new file mode 100644 index 0000000000000000000000000000000000000000..afa144c53ed8f221322d67beb9f0156106a8c499 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~p#Yx{S0Ej@ zs4rpN?8?I%o38Gfd;iS-c_y2HqHHBWe!&d?L7=Mg!9SpgyQhm|h{V+1K1-p701oGq zhyJeD5j!Wa^+!qNJvq!Wi`>;`V05XC_BBX>*0x2AD>*wS@WI=sDi5`$S;`TKMd4$ii810Ydl>X zLnNlA_6G_v8*(^>habH2{}Ait_1Df=oaA0)cRt=FEk#3HiRIJUycZ>*Qa^l!Sa$7W zNY7~Vn!do&`Ap(=(Sy_W7%nbp-12J*>%&P5sf^N-#XZ*Uexd6bdE@A@+@rhadC8^R wo_0ISf`6Nw(sAA8?_UVs(=FQ@`%c~N_gChfbL-MboFyt=akR{0K^kz=l}o! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_side.png b/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_side.png new file mode 100644 index 0000000000000000000000000000000000000000..95a1b9af484cac69365be7144dddc252be03f403 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~xd5LKS0KGv zTKcrA>Jvq!FUGdp`V05XC_BBX>*0x2AD>*|agy2%RKZmePx$I!Q!9R5*>TlQB+&P!NVc;02PGY_h=yLT6`VLg6tyi5Ic6@DNru>j5nG0Cd}I zVkKEBveiqLK(ugY9F$HcA$h!+|DXApANXTL054VbQFsqP7XpR%bRhsB_Y!gsaND+# zlcI8*0JthHrBn+g2Y?|5h;6|-uNFbgaH1Jb99#lGoo1SIauD#bZx^-JX$FQ=q{V0000MuC-Gd;BD=~Ms!0E|gQK~xx(9gTq!1267lt9u4pGIjldCyzZD)P8Fktj04oxB8C%eN62>V!!7MmR+lgr-@up)_7# zAgxNLq%aK*#T!(Z4mIGKcOe|b;t@0+!PH6=BTyZoHb8+N4AcbLLFAey2DHGH5q3$E zmp~A|->>qkRlMLtFoVH>pg4l#N`O#`#hgSIDLFBwo5940l)!o=mggXuk+kzZ$p{0d zT_Je9L0V1>qzNPpDI&cHrb6YAI)OA5#Cd&!yHlK|5XQ}T7)}xa77Jp%E?(kA7ykn4 z;N#~6Kx(blphk~gJf5J0C`~8?VFVJ=BU-c-dl@8`5qY0LF%t@b%@{cvFOeoNq{It0 zo_BW_D!bb;>QTU}MRg>JsYx28x^e>CWC<*I z)kycVtgQq2JkrEk{zU!ygq~g^p`(*nd4s3|n!c;f?yEl?PVf zbH+dJxR5t)ci*t>M@Oue!13e&LZ(dliF)$ioeWh=uSKCskYlO*6Rg{KIUN-i@Ynmo?R`kwOhvZKM%Y;nRzSP-^{syPW3pW4& diff --git a/src/main/resources/assets/betterend/textures/block/sangnum_path_top.png b/src/main/resources/assets/betterend/textures/block/sangnum_path_top.png new file mode 100644 index 0000000000000000000000000000000000000000..04ad7f4d93dcc03afbe8e96acbc15c489989b3da GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~i2$Dv*Jcrk zZXlA7m?9xD2Z&@8mH?50!iRQ~TR=7Co-U3d5>r+EqnQpE@F-6E_Rn1IR=y+uSxPIrS>Z zWiNZuyB9LDxqBY-7p@6Y-M1rh@y^MLz5k}?vhW^$(tSj&a?7%g1?JD5uyem)-k>>k S?Fpb07(8A5T-G@yGywpn>rs6G literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/sangnum_side.png b/src/main/resources/assets/betterend/textures/block/sangnum_side.png new file mode 100644 index 0000000000000000000000000000000000000000..feb1aca4735d90fe8e4f7b6b406de0925e058449 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~-2k5uS0KGv zT6&M1{82@fbE=v*H1rHS zkY6yve-!Yvciu9f)HF{Q#}J9BqP^UGu7(^=vR6LVf8T${eRA8h#Q}|(%XU{SbKBuL z>!Q0As8T*&kD?e4_h zd*tMgDyp1Q)x4ph_fW_9mA=InW7`SexlDj+Iz3$+LnNlE_A~M^7;+rC()j29@$ll4 zlU&iWS0Mex z*!GE{(!&$0POGYJ>o0ViSnaW}EqwWuij8Y44{wy)_X1=TcS(?6FvEX1s4c6#3KTZ+ zba4!kn3|j*5z;VmVy9s5`6E3#hfbV1)U>8WkY$F1pwgK&0v$PA($=#~W#(is&4~$M ZV~~EsQ2Ajok3LX8gQu&X%Q~loCICTKLdF09 literal 0 HcmV?d00001 From 4aec8487faad633b02da4c63ee909b537108eaf8 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 1 Mar 2021 01:06:04 +0300 Subject: [PATCH 298/463] Amaranita mushroom blocks (WIP), shaders for new plants --- .../blocks/AmaranitaHyphaeBlock.java | 12 +++++ .../betterend/blocks/SmallAmaranitaBlock.java | 33 +++++++++++++ .../java/ru/betterend/registry/EndBlocks.java | 5 +- .../ru/betterend/registry/EndFeatures.java | 5 ++ .../world/biome/DragonGraveyardsBiome.java | 4 ++ .../bushes/LargeAmaranitaFeature.java | 44 ++++++++++++++++++ .../blockstates/amaranita_hyphae.json | 7 +++ .../betterend/blockstates/clawfern.json | 8 ++++ .../betterend/blockstates/globulagus.json | 10 ++++ .../materialmaps/block/clawfern.json | 3 ++ .../materialmaps/block/globulagus.json | 3 ++ .../betterend/materialmaps/item/aeridium.json | 1 + .../betterend/materialmaps/item/clawfern.json | 1 + .../materialmaps/item/globulagus.json | 1 + .../materialmaps/item/lamellarium.json | 1 + .../betterend/materialmaps/item/lutebus.json | 1 + .../betterend/materialmaps/item/orango.json | 1 + .../materialmaps/item/small_amaranita.json | 1 + .../materials/waving_floor_glow_green.json | 10 ++++ .../models/block/amaranita_hyphae.json | 12 +++++ .../betterend/models/block/clawfern_01.json | 6 +++ .../betterend/models/block/clawfern_02.json | 6 +++ .../betterend/models/block/globulagus_01.json | 6 +++ .../betterend/models/block/globulagus_02.json | 6 +++ .../betterend/models/block/globulagus_03.json | 6 +++ .../betterend/models/block/globulagus_04.json | 6 +++ .../models/item/amaranita_hyphae.json | 3 ++ .../betterend/models/item/clawfern.json | 6 +++ .../betterend/models/item/globulagus.json | 6 +++ .../shaders/material/glow_25_blue_half.frag | 8 ++++ .../shaders/material/glow_green_2.frag | 8 ++++ .../betterend/textures/block/clawfern.png | Bin 0 -> 248 bytes .../betterend/textures/block/globulagus.png | Bin 0 -> 250 bytes 33 files changed, 229 insertions(+), 1 deletion(-) create mode 100644 src/main/java/ru/betterend/blocks/AmaranitaHyphaeBlock.java create mode 100644 src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java create mode 100644 src/main/resources/assets/betterend/blockstates/amaranita_hyphae.json create mode 100644 src/main/resources/assets/betterend/blockstates/clawfern.json create mode 100644 src/main/resources/assets/betterend/blockstates/globulagus.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/clawfern.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/globulagus.json create mode 100644 src/main/resources/assets/betterend/materialmaps/item/aeridium.json create mode 100644 src/main/resources/assets/betterend/materialmaps/item/clawfern.json create mode 100644 src/main/resources/assets/betterend/materialmaps/item/globulagus.json create mode 100644 src/main/resources/assets/betterend/materialmaps/item/lamellarium.json create mode 100644 src/main/resources/assets/betterend/materialmaps/item/lutebus.json create mode 100644 src/main/resources/assets/betterend/materialmaps/item/orango.json create mode 100644 src/main/resources/assets/betterend/materialmaps/item/small_amaranita.json create mode 100644 src/main/resources/assets/betterend/materials/waving_floor_glow_green.json create mode 100644 src/main/resources/assets/betterend/models/block/amaranita_hyphae.json create mode 100644 src/main/resources/assets/betterend/models/block/clawfern_01.json create mode 100644 src/main/resources/assets/betterend/models/block/clawfern_02.json create mode 100644 src/main/resources/assets/betterend/models/block/globulagus_01.json create mode 100644 src/main/resources/assets/betterend/models/block/globulagus_02.json create mode 100644 src/main/resources/assets/betterend/models/block/globulagus_03.json create mode 100644 src/main/resources/assets/betterend/models/block/globulagus_04.json create mode 100644 src/main/resources/assets/betterend/models/item/amaranita_hyphae.json create mode 100644 src/main/resources/assets/betterend/models/item/clawfern.json create mode 100644 src/main/resources/assets/betterend/models/item/globulagus.json create mode 100644 src/main/resources/assets/betterend/shaders/material/glow_25_blue_half.frag create mode 100644 src/main/resources/assets/betterend/shaders/material/glow_green_2.frag create mode 100644 src/main/resources/assets/betterend/textures/block/clawfern.png create mode 100644 src/main/resources/assets/betterend/textures/block/globulagus.png diff --git a/src/main/java/ru/betterend/blocks/AmaranitaHyphaeBlock.java b/src/main/java/ru/betterend/blocks/AmaranitaHyphaeBlock.java new file mode 100644 index 00000000..c8063000 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/AmaranitaHyphaeBlock.java @@ -0,0 +1,12 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.Blocks; +import net.minecraft.block.MaterialColor; +import ru.betterend.blocks.basis.EndPillarBlock; + +public class AmaranitaHyphaeBlock extends EndPillarBlock { + public AmaranitaHyphaeBlock() { + super(FabricBlockSettings.copyOf(Blocks.OAK_PLANKS).materialColor(MaterialColor.LIME)); + } +} diff --git a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java index 4b2f6563..10c6e631 100644 --- a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java +++ b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java @@ -1,12 +1,45 @@ package ru.betterend.blocks; +import java.util.Random; + import net.minecraft.block.BlockState; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; public class SmallAmaranitaBlock extends EndPlantBlock { @Override protected boolean isTerrain(BlockState state) { return state.getBlock() == EndBlocks.SANGNUM; } + + @Override + public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { + BlockPos bigPos = growBig(world, pos); + if (bigPos != null) { + return; + } + EndFeatures.LARGE_AMARANITA.getFeature().generate(world, null, random, pos, null); + } + + private BlockPos growBig(ServerWorld world, BlockPos pos) { + for (int x = -1; x < 2; x++) { + for (int z = -1; z < 2; z++) { + BlockPos p = pos.add(x, 0, z); + if (checkFrame(world, p)) { + return p; + } + } + } + return null; + } + + private boolean checkFrame(ServerWorld world, BlockPos pos) { + return world.getBlockState(pos).isOf(this) || + world.getBlockState(pos.south()).isOf(this) || + world.getBlockState(pos.east()).isOf(this) || + world.getBlockState(pos.south().east()).isOf(this); + } } diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 4835bf46..b3fd0614 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -11,6 +11,7 @@ import ru.betterend.blocks.AeterniumAnvil; import ru.betterend.blocks.AeterniumBlock; import ru.betterend.blocks.AmaranitaCapBlock; import ru.betterend.blocks.AmaranitaHymenophoreBlock; +import ru.betterend.blocks.AmaranitaHyphaeBlock; import ru.betterend.blocks.AmberBlock; import ru.betterend.blocks.AncientEmeraldIceBlock; import ru.betterend.blocks.AuroraCrystalBlock; @@ -230,6 +231,8 @@ public class EndBlocks { public static final Block SALTEAGO = registerBlock("salteago", new TerrainPlantBlock(END_MOSS)); public static final Block VAIOLUSH_FERN = registerBlock("vaiolush_fern", new TerrainPlantBlock(END_MOSS)); public static final Block FRACTURN = registerBlock("fracturn", new TerrainPlantBlock(END_MOSS)); + public static final Block CLAWFERN = registerBlock("clawfern", new TerrainPlantBlock(SANGNUM)); + public static final Block GLOBULAGUS = registerBlock("globulagus", new TerrainPlantBlock(SANGNUM)); public static final Block ORANGO = registerBlock("orango", new TerrainPlantBlock(RUTISCUS)); public static final Block AERIDIUM = registerBlock("aeridium", new TerrainPlantBlock(RUTISCUS)); public static final Block LUTEBUS = registerBlock("lutebus", new TerrainPlantBlock(RUTISCUS)); @@ -255,7 +258,7 @@ public class EndBlocks { public static final Block SMALL_AMARANITA_MUSHROOM = registerBlock("small_amaranita_mushroom", new SmallAmaranitaBlock()); public static final Block LARGE_AMARANITA_MUSHROOM = registerBlockNI("large_amaranita_mushroom", new LargeAmaranitaBlock()); - public static final Block AMARANITA_HYPHAE = registerBlock("amaranita_hyphae", new AmaranitaCapBlock()); + public static final Block AMARANITA_HYPHAE = registerBlock("amaranita_hyphae", new AmaranitaHyphaeBlock()); public static final Block AMARANITA_HYMENOPHORE = registerBlock("amaranita_hymenophore", new AmaranitaHymenophoreBlock()); public static final Block AMARANITA_FUR = registerBlock("amaranita_fur", new FurBlock(MOSSY_GLOWSHROOM_SAPLING, 15, 4)); public static final Block AMARANITA_CAP = registerBlock("amaranita_cap", new AmaranitaCapBlock()); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 6ce1e508..6e1e5b3b 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -34,6 +34,7 @@ import ru.betterend.world.features.VineFeature; import ru.betterend.world.features.WallPlantFeature; import ru.betterend.world.features.WallPlantOnLogFeature; import ru.betterend.world.features.bushes.BushFeature; +import ru.betterend.world.features.bushes.LargeAmaranitaFeature; import ru.betterend.world.features.bushes.Lumecorn; import ru.betterend.world.features.bushes.TenaneaBushFeature; import ru.betterend.world.features.terrain.EndLakeFeature; @@ -75,6 +76,7 @@ public class EndFeatures { public static final EndFeature DRAGON_TREE_BUSH = new EndFeature("dragon_tree_bush", new BushFeature(EndBlocks.DRAGON_TREE_LEAVES, EndBlocks.DRAGON_TREE.bark), 15); public static final EndFeature TENANEA_BUSH = new EndFeature("tenanea_bush", new TenaneaBushFeature(), 10); public static final EndFeature LUMECORN = new EndFeature("lumecorn", new Lumecorn(), 5); + public static final EndFeature LARGE_AMARANITA = new EndFeature("large_amaranita", new LargeAmaranitaFeature(), 5); // Plants // public static final EndFeature UMBRELLA_MOSS = new EndFeature("umbrella_moss", new DoublePlantFeature(EndBlocks.UMBRELLA_MOSS, EndBlocks.UMBRELLA_MOSS_TALL, 5), 5); @@ -107,6 +109,9 @@ public class EndFeatures { public static final EndFeature AERIDIUM = new EndFeature("aeridium", new SinglePlantFeature(EndBlocks.AERIDIUM, 5, 4), 5); public static final EndFeature LUTEBUS = new EndFeature("lutebus", new SinglePlantFeature(EndBlocks.LUTEBUS, 5, 2), 5); public static final EndFeature LAMELLARIUM = new EndFeature("lamellarium", new SinglePlantFeature(EndBlocks.LAMELLARIUM, 5), 6); + public static final EndFeature SMALL_AMARANITA = new EndFeature("small_amaranita", new SinglePlantFeature(EndBlocks.SMALL_AMARANITA_MUSHROOM, 5, 5), 4); + public static final EndFeature GLOBULAGUS = new EndFeature("globulagus", new SinglePlantFeature(EndBlocks.GLOBULAGUS, 5, 3), 6); + public static final EndFeature CLAWFERN = new EndFeature("clawfern", new SinglePlantFeature(EndBlocks.CLAWFERN, 5, 4), 5); // Vines // public static final EndFeature DENSE_VINE = new EndFeature("dense_vine", new VineFeature(EndBlocks.DENSE_VINE, 24), 3); diff --git a/src/main/java/ru/betterend/world/biome/DragonGraveyardsBiome.java b/src/main/java/ru/betterend/world/biome/DragonGraveyardsBiome.java index 41500b94..7535e700 100644 --- a/src/main/java/ru/betterend/world/biome/DragonGraveyardsBiome.java +++ b/src/main/java/ru/betterend/world/biome/DragonGraveyardsBiome.java @@ -19,6 +19,10 @@ public class DragonGraveyardsBiome extends EndBiome { .addFeature(EndFeatures.OBSIDIAN_PILLAR_BASEMENT) .addFeature(EndFeatures.FALLEN_PILLAR) .addFeature(EndFeatures.OBSIDIAN_BOULDER) + .addFeature(EndFeatures.LARGE_AMARANITA) + .addFeature(EndFeatures.SMALL_AMARANITA) + .addFeature(EndFeatures.GLOBULAGUS) + .addFeature(EndFeatures.CLAWFERN) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java b/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java new file mode 100644 index 00000000..58990979 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java @@ -0,0 +1,44 @@ +package ru.betterend.world.features.bushes; + +import java.util.Random; + +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.util.math.Direction; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.blocks.BlockProperties; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; +import ru.betterend.world.features.DefaultFeature; + +public class LargeAmaranitaFeature extends DefaultFeature { + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; + + Mutable mut = new Mutable().set(pos); + int height = MHelper.randRange(2, 3, random); + for (int i = 1; i < height; i++) { + mut.setY(mut.getY() + 1); + if (!world.isAir(mut)) { + return false; + } + } + mut.set(pos); + + BlockState state = EndBlocks.LARGE_AMARANITA_MUSHROOM.getDefaultState(); + BlocksHelper.setWithUpdate(world, mut, state.with(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); + if (height > 2) { + BlocksHelper.setWithUpdate(world, mut.move(Direction.UP), state.with(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); + } + BlocksHelper.setWithUpdate(world, mut.move(Direction.UP), state.with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); + + return true; + } +} diff --git a/src/main/resources/assets/betterend/blockstates/amaranita_hyphae.json b/src/main/resources/assets/betterend/blockstates/amaranita_hyphae.json new file mode 100644 index 00000000..c49368de --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/amaranita_hyphae.json @@ -0,0 +1,7 @@ +{ + "variants": { + "axis=x": { "model": "betterend:block/amaranita_hyphae", "x": 90, "y": 90 }, + "axis=y": { "model": "betterend:block/amaranita_hyphae" }, + "axis=z": { "model": "betterend:block/amaranita_hyphae", "x": 90 } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/clawfern.json b/src/main/resources/assets/betterend/blockstates/clawfern.json new file mode 100644 index 00000000..043b6ae0 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/clawfern.json @@ -0,0 +1,8 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/clawfern_01" }, + { "model": "betterend:block/clawfern_02" } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/globulagus.json b/src/main/resources/assets/betterend/blockstates/globulagus.json new file mode 100644 index 00000000..f818fddc --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/globulagus.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/globulagus_01" }, + { "model": "betterend:block/globulagus_02" }, + { "model": "betterend:block/globulagus_03" }, + { "model": "betterend:block/globulagus_04" } + ] + } +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/clawfern.json b/src/main/resources/assets/betterend/materialmaps/block/clawfern.json new file mode 100644 index 00000000..de846edf --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/clawfern.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_floor_glow_green" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/globulagus.json b/src/main/resources/assets/betterend/materialmaps/block/globulagus.json new file mode 100644 index 00000000..de846edf --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/globulagus.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_floor_glow_green" +} diff --git a/src/main/resources/assets/betterend/materialmaps/item/aeridium.json b/src/main/resources/assets/betterend/materialmaps/item/aeridium.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/aeridium.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materialmaps/item/clawfern.json b/src/main/resources/assets/betterend/materialmaps/item/clawfern.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/clawfern.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materialmaps/item/globulagus.json b/src/main/resources/assets/betterend/materialmaps/item/globulagus.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/globulagus.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materialmaps/item/lamellarium.json b/src/main/resources/assets/betterend/materialmaps/item/lamellarium.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/lamellarium.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materialmaps/item/lutebus.json b/src/main/resources/assets/betterend/materialmaps/item/lutebus.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/lutebus.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materialmaps/item/orango.json b/src/main/resources/assets/betterend/materialmaps/item/orango.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/orango.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materialmaps/item/small_amaranita.json b/src/main/resources/assets/betterend/materialmaps/item/small_amaranita.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/small_amaranita.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materials/waving_floor_glow_green.json b/src/main/resources/assets/betterend/materials/waving_floor_glow_green.json new file mode 100644 index 00000000..25d1427b --- /dev/null +++ b/src/main/resources/assets/betterend/materials/waving_floor_glow_green.json @@ -0,0 +1,10 @@ +{ + "layers": [ + { + "vertexSource": "betterend:shaders/material/wave_floor.vert", + "fragmentSource": "betterend:shaders/material/glow_green_2.frag", + "disableAo": true, + "disableDiffuse": true + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/amaranita_hyphae.json b/src/main/resources/assets/betterend/models/block/amaranita_hyphae.json new file mode 100644 index 00000000..ddef4114 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amaranita_hyphae.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "betterend:block/amaranita_hyphae_top", + "east": "betterend:block/amaranita_hyphae_side", + "north": "betterend:block/amaranita_hyphae_side", + "particle": "betterend:block/amaranita_hyphae_side", + "south": "betterend:block/amaranita_hyphae_side", + "up": "betterend:block/amaranita_hyphae_top", + "west": "betterend:block/amaranita_hyphae_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/clawfern_01.json b/src/main/resources/assets/betterend/models/block/clawfern_01.json new file mode 100644 index 00000000..99c9d784 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/clawfern_01.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/clawfern" + } +} diff --git a/src/main/resources/assets/betterend/models/block/clawfern_02.json b/src/main/resources/assets/betterend/models/block/clawfern_02.json new file mode 100644 index 00000000..d8ea43a5 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/clawfern_02.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/clawfern" + } +} diff --git a/src/main/resources/assets/betterend/models/block/globulagus_01.json b/src/main/resources/assets/betterend/models/block/globulagus_01.json new file mode 100644 index 00000000..8b7eac5b --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/globulagus_01.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/globulagus" + } +} diff --git a/src/main/resources/assets/betterend/models/block/globulagus_02.json b/src/main/resources/assets/betterend/models/block/globulagus_02.json new file mode 100644 index 00000000..cc5ff783 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/globulagus_02.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/globulagus" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/globulagus_03.json b/src/main/resources/assets/betterend/models/block/globulagus_03.json new file mode 100644 index 00000000..db3512a7 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/globulagus_03.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/globulagus" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/globulagus_04.json b/src/main/resources/assets/betterend/models/block/globulagus_04.json new file mode 100644 index 00000000..65d297b6 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/globulagus_04.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/globulagus" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/amaranita_hyphae.json b/src/main/resources/assets/betterend/models/item/amaranita_hyphae.json new file mode 100644 index 00000000..0277110e --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/amaranita_hyphae.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/amaranita_hyphae" +} diff --git a/src/main/resources/assets/betterend/models/item/clawfern.json b/src/main/resources/assets/betterend/models/item/clawfern.json new file mode 100644 index 00000000..973dafb8 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/clawfern.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/clawfern" + } +} diff --git a/src/main/resources/assets/betterend/models/item/globulagus.json b/src/main/resources/assets/betterend/models/item/globulagus.json new file mode 100644 index 00000000..0fd492a6 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/globulagus.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/globulagus" + } +} diff --git a/src/main/resources/assets/betterend/shaders/material/glow_25_blue_half.frag b/src/main/resources/assets/betterend/shaders/material/glow_25_blue_half.frag new file mode 100644 index 00000000..a40e0424 --- /dev/null +++ b/src/main/resources/assets/betterend/shaders/material/glow_25_blue_half.frag @@ -0,0 +1,8 @@ +#include frex:shaders/api/fragment.glsl +#include frex:shaders/lib/math.glsl + +void frx_startFragment(inout frx_FragmentData fragData) { + float a = abs(fragData.spriteColor.b - fragData.spriteColor.r); + float b = abs(fragData.spriteColor.b - fragData.spriteColor.g); + fragData.emissivity = (a > 0.1 && b > 0.1 && fragData.spriteColor.b > 0.1) ? 0.5 : 0; +} diff --git a/src/main/resources/assets/betterend/shaders/material/glow_green_2.frag b/src/main/resources/assets/betterend/shaders/material/glow_green_2.frag new file mode 100644 index 00000000..8a3c3722 --- /dev/null +++ b/src/main/resources/assets/betterend/shaders/material/glow_green_2.frag @@ -0,0 +1,8 @@ +#include frex:shaders/api/fragment.glsl +#include frex:shaders/lib/math.glsl + +void frx_startFragment(inout frx_FragmentData fragData) { + float a = abs(fragData.spriteColor.g - fragData.spriteColor.r); + float b = abs(fragData.spriteColor.g - fragData.spriteColor.b); + fragData.emissivity = (fragData.spriteColor.g > 0.3) ? 0.3 : 0; +} diff --git a/src/main/resources/assets/betterend/textures/block/clawfern.png b/src/main/resources/assets/betterend/textures/block/clawfern.png new file mode 100644 index 0000000000000000000000000000000000000000..edb93e21c324087768840affe2eb2926b37b3a56 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~#Q>iWS0KGl zUGJ!t;aMHiD+ZPit-W8lMt%y)3tv8^V&mG%!yDT!?X(9f;w}mD3ugEa2eoCjSAoKL zo-U3d5>rF_8u^$Nd7P}ZQ}6w+|KPCuZJ$ffyekrdTOR3e3g8dmxTB@=na*S0Ej} zd`jivjZIf~&AoqS*PENyzrH-9p?6u^=&pg)D{Jppu94HXfBXhi$5RsI7tHV<0XUBY zr~$=uJY5_^B&PQEI0`i=@Gx_)P<;6RzbWgL)v_lpq~7j`zxrzW=hC>dm2>%5zSR&+ zeWs@R_t!VYTltTo9!s2Bxp1divccch=WeGfw_LNhl58v`@b6YmM&p%@Gr3=FxxzYY m=|x8)2j&a5f( Date: Mon, 1 Mar 2021 01:21:38 +0300 Subject: [PATCH 299/463] Particles & shader fixes --- .../java/ru/betterend/world/biome/DragonGraveyardsBiome.java | 4 +++- .../world/features/bushes/LargeAmaranitaFeature.java | 2 +- .../assets/betterend/materialmaps/block/amaranita_fur.json | 3 +++ .../assets/betterend/materialmaps/block/clawfern.json | 2 +- .../assets/betterend/shaders/material/glow_green_2.frag | 2 +- 5 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/assets/betterend/materialmaps/block/amaranita_fur.json diff --git a/src/main/java/ru/betterend/world/biome/DragonGraveyardsBiome.java b/src/main/java/ru/betterend/world/biome/DragonGraveyardsBiome.java index 7535e700..765ae2a3 100644 --- a/src/main/java/ru/betterend/world/biome/DragonGraveyardsBiome.java +++ b/src/main/java/ru/betterend/world/biome/DragonGraveyardsBiome.java @@ -3,6 +3,7 @@ package ru.betterend.world.biome; import net.minecraft.entity.EntityType; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; public class DragonGraveyardsBiome extends EndBiome { @@ -10,7 +11,8 @@ public class DragonGraveyardsBiome extends EndBiome { super(new BiomeDefinition("dragon_graveyards") .setGenChance(0.1F) .setFogColor(244, 46, 79) - .setFogDensity(1.1F) + .setFogDensity(1.3F) + .setParticles(EndParticles.FIREFLY, 0.0007F) .setMusic(EndSounds.MUSIC_OPENSPACE) .setLoop(EndSounds.AMBIENT_GLOWING_GRASSLANDS) .setSurface(EndBlocks.SANGNUM) diff --git a/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java b/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java index 58990979..09f5e5ff 100644 --- a/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java @@ -9,8 +9,8 @@ import net.minecraft.util.math.Direction; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.BlockProperties; +import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; diff --git a/src/main/resources/assets/betterend/materialmaps/block/amaranita_fur.json b/src/main/resources/assets/betterend/materialmaps/block/amaranita_fur.json new file mode 100644 index 00000000..5879aa38 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/amaranita_fur.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_wall_inverted_glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/clawfern.json b/src/main/resources/assets/betterend/materialmaps/block/clawfern.json index de846edf..352de84b 100644 --- a/src/main/resources/assets/betterend/materialmaps/block/clawfern.json +++ b/src/main/resources/assets/betterend/materialmaps/block/clawfern.json @@ -1,3 +1,3 @@ { - "defaultMaterial": "betterend:waving_floor_glow_green" + "defaultMaterial": "betterend:waving_floor" } diff --git a/src/main/resources/assets/betterend/shaders/material/glow_green_2.frag b/src/main/resources/assets/betterend/shaders/material/glow_green_2.frag index 8a3c3722..3733aa0d 100644 --- a/src/main/resources/assets/betterend/shaders/material/glow_green_2.frag +++ b/src/main/resources/assets/betterend/shaders/material/glow_green_2.frag @@ -4,5 +4,5 @@ void frx_startFragment(inout frx_FragmentData fragData) { float a = abs(fragData.spriteColor.g - fragData.spriteColor.r); float b = abs(fragData.spriteColor.g - fragData.spriteColor.b); - fragData.emissivity = (fragData.spriteColor.g > 0.3) ? 0.3 : 0; + fragData.emissivity = (fragData.spriteColor.g > 0.3) ? 0.6 : 0; } From d32eae2c0635475dc14d4360bebe465fe2ec331e Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 1 Mar 2021 04:27:21 +0300 Subject: [PATCH 300/463] Mossy bone, multiple terrain plants --- .../ru/betterend/blocks/MossyBoneBlock.java | 56 ++++++++++++++++++ .../betterend/blocks/TerrainPlantBlock.java | 11 +++- .../java/ru/betterend/registry/EndBlocks.java | 6 +- .../betterend/blockstates/mossy_bone.json | 7 +++ .../models/block/mossy_bone_hor.json | 12 ++++ .../models/block/mossy_bone_ver.json | 12 ++++ .../models/item/amaranita_hyphae.json | 3 - .../betterend/models/item/mossy_bone.json | 3 + .../textures/block/mossy_bone_cut.png | Bin 0 -> 268 bytes .../textures/block/mossy_bone_side_hor.png | Bin 0 -> 251 bytes .../textures/block/mossy_bone_side_ver.png | Bin 0 -> 251 bytes 11 files changed, 102 insertions(+), 8 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/MossyBoneBlock.java create mode 100644 src/main/resources/assets/betterend/blockstates/mossy_bone.json create mode 100644 src/main/resources/assets/betterend/models/block/mossy_bone_hor.json create mode 100644 src/main/resources/assets/betterend/models/block/mossy_bone_ver.json delete mode 100644 src/main/resources/assets/betterend/models/item/amaranita_hyphae.json create mode 100644 src/main/resources/assets/betterend/models/item/mossy_bone.json create mode 100644 src/main/resources/assets/betterend/textures/block/mossy_bone_cut.png create mode 100644 src/main/resources/assets/betterend/textures/block/mossy_bone_side_hor.png create mode 100644 src/main/resources/assets/betterend/textures/block/mossy_bone_side_ver.png diff --git a/src/main/java/ru/betterend/blocks/MossyBoneBlock.java b/src/main/java/ru/betterend/blocks/MossyBoneBlock.java new file mode 100644 index 00000000..971f4fd8 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/MossyBoneBlock.java @@ -0,0 +1,56 @@ +package ru.betterend.blocks; + +import java.util.Collections; +import java.util.List; +import java.util.Random; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.SnowBlock; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.enchantment.Enchantments; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.context.LootContext; +import net.minecraft.loot.context.LootContextParameters; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.WorldView; +import net.minecraft.world.chunk.light.ChunkLightProvider; +import ru.betterend.blocks.basis.EndPillarBlock; + +public class MossyBoneBlock extends EndPillarBlock { + public MossyBoneBlock() { + super(FabricBlockSettings.copyOf(Blocks.BONE_BLOCK).hardness(0.5F).ticksRandomly()); + } + + @Override + public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.get(LootContextParameters.TOOL); + if (tool != null && EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { + return Collections.singletonList(new ItemStack(this)); + } + return Collections.singletonList(new ItemStack(Blocks.BONE_BLOCK)); + } + + @Override + public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + if (random.nextInt(16) == 0 && !canSurvive(state, world, pos)) { + world.setBlockState(pos, Blocks.BONE_BLOCK.getDefaultState().with(AXIS, state.get(AXIS))); + } + } + + public static boolean canSurvive(BlockState state, WorldView worldView, BlockPos pos) { + BlockPos blockPos = pos.up(); + BlockState blockState = worldView.getBlockState(blockPos); + if (blockState.isOf(Blocks.SNOW) && (Integer)blockState.get(SnowBlock.LAYERS) == 1) { + return true; + } else if (blockState.getFluidState().getLevel() == 8) { + return false; + } else { + int i = ChunkLightProvider.getRealisticOpacity(worldView, state, pos, blockState, blockPos, Direction.UP, blockState.getOpacity(worldView, blockPos)); + return i < 5; + } + } +} diff --git a/src/main/java/ru/betterend/blocks/TerrainPlantBlock.java b/src/main/java/ru/betterend/blocks/TerrainPlantBlock.java index 53e3b007..f558395d 100644 --- a/src/main/java/ru/betterend/blocks/TerrainPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/TerrainPlantBlock.java @@ -5,15 +5,20 @@ import net.minecraft.block.BlockState; import ru.betterend.blocks.basis.EndPlantBlock; public class TerrainPlantBlock extends EndPlantBlock { - private final Block ground; + private final Block[] ground; - public TerrainPlantBlock(Block ground) { + public TerrainPlantBlock(Block... ground) { super(true); this.ground = ground; } @Override protected boolean isTerrain(BlockState state) { - return state.isOf(ground); + for (Block block: ground) { + if (state.isOf(block)) { + return true; + } + } + return false; } } diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index b3fd0614..22764be5 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -68,6 +68,7 @@ import ru.betterend.blocks.LumecornSeedBlock; import ru.betterend.blocks.MengerSpongeBlock; import ru.betterend.blocks.MengerSpongeWetBlock; import ru.betterend.blocks.MissingTileBlock; +import ru.betterend.blocks.MossyBoneBlock; import ru.betterend.blocks.MossyGlowshroomCapBlock; import ru.betterend.blocks.MossyGlowshroomHymenophoreBlock; import ru.betterend.blocks.MossyGlowshroomSaplingBlock; @@ -144,6 +145,7 @@ public class EndBlocks { public static final Block RUTISCUS_PATH = registerBlock("rutiscus_path", new EndPathBlock(RUTISCUS)); public static final Block MOSSY_OBSIDIAN = registerBlock("mossy_obsidian", new MossyObsidian()); + public static final Block MOSSY_BONE = registerBlock("mossy_bone", new MossyBoneBlock()); // Rocks // public static final StoneMaterial FLAVOLITE = new StoneMaterial("flavolite", MaterialColor.SAND); @@ -231,8 +233,8 @@ public class EndBlocks { public static final Block SALTEAGO = registerBlock("salteago", new TerrainPlantBlock(END_MOSS)); public static final Block VAIOLUSH_FERN = registerBlock("vaiolush_fern", new TerrainPlantBlock(END_MOSS)); public static final Block FRACTURN = registerBlock("fracturn", new TerrainPlantBlock(END_MOSS)); - public static final Block CLAWFERN = registerBlock("clawfern", new TerrainPlantBlock(SANGNUM)); - public static final Block GLOBULAGUS = registerBlock("globulagus", new TerrainPlantBlock(SANGNUM)); + public static final Block CLAWFERN = registerBlock("clawfern", new TerrainPlantBlock(SANGNUM, MOSSY_OBSIDIAN, MOSSY_BONE)); + public static final Block GLOBULAGUS = registerBlock("globulagus", new TerrainPlantBlock(SANGNUM, MOSSY_OBSIDIAN, MOSSY_BONE)); public static final Block ORANGO = registerBlock("orango", new TerrainPlantBlock(RUTISCUS)); public static final Block AERIDIUM = registerBlock("aeridium", new TerrainPlantBlock(RUTISCUS)); public static final Block LUTEBUS = registerBlock("lutebus", new TerrainPlantBlock(RUTISCUS)); diff --git a/src/main/resources/assets/betterend/blockstates/mossy_bone.json b/src/main/resources/assets/betterend/blockstates/mossy_bone.json new file mode 100644 index 00000000..f825d388 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/mossy_bone.json @@ -0,0 +1,7 @@ +{ + "variants": { + "axis=x": { "model": "betterend:block/mossy_bone_hor", "y": 90 }, + "axis=y": { "model": "betterend:block/mossy_bone_ver" }, + "axis=z": { "model": "betterend:block/mossy_bone_hor" } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/mossy_bone_hor.json b/src/main/resources/assets/betterend/models/block/mossy_bone_hor.json new file mode 100644 index 00000000..acc98207 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/mossy_bone_hor.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "block/bone_block_side", + "east": "betterend:block/mossy_bone_side_ver", + "north": "betterend:block/mossy_bone_cut", + "particle": "betterend:block/mossy_bone_side_ver", + "south": "betterend:block/mossy_bone_cut", + "up": "betterend:block/sangnum_top", + "west": "betterend:block/mossy_bone_side_ver" + } +} diff --git a/src/main/resources/assets/betterend/models/block/mossy_bone_ver.json b/src/main/resources/assets/betterend/models/block/mossy_bone_ver.json new file mode 100644 index 00000000..8534387e --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/mossy_bone_ver.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "block/bone_block_top", + "east": "betterend:block/mossy_bone_side_ver", + "north": "betterend:block/mossy_bone_side_ver", + "particle": "betterend:block/mossy_bone_side_ver", + "south": "betterend:block/mossy_bone_side_ver", + "up": "betterend:block/sangnum_top", + "west": "betterend:block/mossy_bone_side_ver" + } +} diff --git a/src/main/resources/assets/betterend/models/item/amaranita_hyphae.json b/src/main/resources/assets/betterend/models/item/amaranita_hyphae.json deleted file mode 100644 index 0277110e..00000000 --- a/src/main/resources/assets/betterend/models/item/amaranita_hyphae.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/amaranita_hyphae" -} diff --git a/src/main/resources/assets/betterend/models/item/mossy_bone.json b/src/main/resources/assets/betterend/models/item/mossy_bone.json new file mode 100644 index 00000000..22aebdb8 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/mossy_bone.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/mossy_bone_ver" +} diff --git a/src/main/resources/assets/betterend/textures/block/mossy_bone_cut.png b/src/main/resources/assets/betterend/textures/block/mossy_bone_cut.png new file mode 100644 index 0000000000000000000000000000000000000000..774c8208ef40ab6720144f7137f9245f71a7abc6 GIT binary patch literal 268 zcmV+n0rUQeP)Px#Do{*RMY9_lydEFLAtcTvDcC43;Vd)iFF5owJ;T4D$;GG6%B|elz~kV`=;hK8 zQ(VXZ0059lL_t&-l_iY}7Q`S30|~Hv?ftL2vGplBV^D!k808Db$kfCRCWSe4;b7#TFQ zdl*4+m+cu$SJ&lz86`GhhmplyzW^Ft{sNxF0VA}tM)rcUGu!-a{mFwb_TDu S-mE470000na**L$~) zKD>MC*`rG@pIzB3Exkuh{-~nLIaSRY8hQ_Pj9=+nd@;7QdS7S*RNw09;us<^HMTcU zh}n?C>7uUJ*MHx2Z~A>->~riyx6p>{aILr3dZcdW+TSj-R(-SO+=bn~wLERM)jujK z7QR}QH+xcy1AE8Wyvns5W(6vHAM_u4;Ci!ZvEuYNM@na**L$~) zKD>MC*`rG@pIzB3Exkuh{-~nLIaSRY8hQ_Pj9=+nd@;7QdS7S*RNw09;us<^HMZAV zh*^QhX>tUU@4Nc@N%pg?W=&L2XxOX0wXE8$M|Ev_=GMzyvae>%Gx=&JQSj~4#!Bb2 zd6yQc_BU{|G)+nFUC^lgu)$ucnLR~Pf_FoKN>pdbZY6>53$!nbUEXaovGmoxXRdNH ypU+6ScKczpq|9sm9~sql3UmIyJZ1l2pZL_(tRjoE52OGc#Ng@b=d#Wzp$PyLXkx Date: Mon, 1 Mar 2021 21:04:34 +0300 Subject: [PATCH 301/463] Amaranita additional blocks & lang, texture refactoring --- ...phaeBlock.java => AmaranitaStemBlock.java} | 4 +- ...lock.java => GlowingHymenophoreBlock.java} | 4 +- .../betterend/blocks/LargeAmaranitaBlock.java | 13 +++++ .../java/ru/betterend/registry/EndBlocks.java | 10 ++-- .../blockstates/amaranita_lantern.json | 5 ++ .../betterend/blockstates/amaranita_stem.json | 7 +++ .../assets/betterend/lang/en_us.json | 25 +++++++++- .../assets/betterend/lang/ru_ru.json | 25 +++++++++- .../materialmaps/block/amaranita_lantern.json | 3 ++ .../block/large_amaranita_mushroom.json | 10 ++++ .../betterend/materials/glow_green_2.json | 10 ++++ .../models/block/amaranita_hyphae.json | 10 +--- .../models/block/amaranita_lantern.json | 6 +++ .../models/block/amaranita_stem.json | 12 +++++ .../models/block/large_amaranita_cap.json | 45 +++++++++--------- .../models/block/large_amaranita_roots.json | 42 ++++++---------- .../models/block/large_amaranita_stem.json | 29 +++++++---- .../models/item/amaranita_hyphae.json | 3 ++ .../models/item/amaranita_lantern.json | 3 ++ .../betterend/models/item/amaranita_stem.json | 3 ++ .../textures/block/amaranita_fur.png | Bin 186 -> 193 bytes .../textures/block/amaranita_lantern.png | Bin 0 -> 248 bytes .../textures/block/amaranita_roots.png | Bin 178 -> 0 bytes .../textures/block/amaranita_stem.png | Bin 199 -> 0 bytes .../textures/block/amaranita_stem_middle.png | Bin 0 -> 199 bytes .../textures/block/amaranita_stem_roots.png | Bin 0 -> 205 bytes .../textures/block/amaranita_stem_top.png | Bin 189 -> 182 bytes .../block/large_amaranita_cap_bottom.png | Bin 258 -> 258 bytes 28 files changed, 192 insertions(+), 77 deletions(-) rename src/main/java/ru/betterend/blocks/{AmaranitaHyphaeBlock.java => AmaranitaStemBlock.java} (75%) rename src/main/java/ru/betterend/blocks/{MossyGlowshroomHymenophoreBlock.java => GlowingHymenophoreBlock.java} (77%) create mode 100644 src/main/resources/assets/betterend/blockstates/amaranita_lantern.json create mode 100644 src/main/resources/assets/betterend/blockstates/amaranita_stem.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/amaranita_lantern.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/large_amaranita_mushroom.json create mode 100644 src/main/resources/assets/betterend/materials/glow_green_2.json create mode 100644 src/main/resources/assets/betterend/models/block/amaranita_lantern.json create mode 100644 src/main/resources/assets/betterend/models/block/amaranita_stem.json create mode 100644 src/main/resources/assets/betterend/models/item/amaranita_hyphae.json create mode 100644 src/main/resources/assets/betterend/models/item/amaranita_lantern.json create mode 100644 src/main/resources/assets/betterend/models/item/amaranita_stem.json create mode 100644 src/main/resources/assets/betterend/textures/block/amaranita_lantern.png delete mode 100644 src/main/resources/assets/betterend/textures/block/amaranita_roots.png delete mode 100644 src/main/resources/assets/betterend/textures/block/amaranita_stem.png create mode 100644 src/main/resources/assets/betterend/textures/block/amaranita_stem_middle.png create mode 100644 src/main/resources/assets/betterend/textures/block/amaranita_stem_roots.png diff --git a/src/main/java/ru/betterend/blocks/AmaranitaHyphaeBlock.java b/src/main/java/ru/betterend/blocks/AmaranitaStemBlock.java similarity index 75% rename from src/main/java/ru/betterend/blocks/AmaranitaHyphaeBlock.java rename to src/main/java/ru/betterend/blocks/AmaranitaStemBlock.java index c8063000..7e0a5702 100644 --- a/src/main/java/ru/betterend/blocks/AmaranitaHyphaeBlock.java +++ b/src/main/java/ru/betterend/blocks/AmaranitaStemBlock.java @@ -5,8 +5,8 @@ import net.minecraft.block.Blocks; import net.minecraft.block.MaterialColor; import ru.betterend.blocks.basis.EndPillarBlock; -public class AmaranitaHyphaeBlock extends EndPillarBlock { - public AmaranitaHyphaeBlock() { +public class AmaranitaStemBlock extends EndPillarBlock { + public AmaranitaStemBlock() { super(FabricBlockSettings.copyOf(Blocks.OAK_PLANKS).materialColor(MaterialColor.LIME)); } } diff --git a/src/main/java/ru/betterend/blocks/MossyGlowshroomHymenophoreBlock.java b/src/main/java/ru/betterend/blocks/GlowingHymenophoreBlock.java similarity index 77% rename from src/main/java/ru/betterend/blocks/MossyGlowshroomHymenophoreBlock.java rename to src/main/java/ru/betterend/blocks/GlowingHymenophoreBlock.java index 5f136023..42dfda2d 100644 --- a/src/main/java/ru/betterend/blocks/MossyGlowshroomHymenophoreBlock.java +++ b/src/main/java/ru/betterend/blocks/GlowingHymenophoreBlock.java @@ -6,8 +6,8 @@ import net.minecraft.block.Material; import net.minecraft.sound.BlockSoundGroup; import ru.betterend.blocks.basis.BlockBase; -public class MossyGlowshroomHymenophoreBlock extends BlockBase { - public MossyGlowshroomHymenophoreBlock() { +public class GlowingHymenophoreBlock extends BlockBase { + public GlowingHymenophoreBlock() { super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sounds(BlockSoundGroup.WART_BLOCK).luminance(15)); } } diff --git a/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java b/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java index e8765669..cfab1b3e 100644 --- a/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java +++ b/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java @@ -1,7 +1,11 @@ package ru.betterend.blocks; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.block.Material; +import net.minecraft.sound.BlockSoundGroup; import net.minecraft.state.StateManager; import net.minecraft.state.property.EnumProperty; import net.minecraft.util.math.BlockPos; @@ -13,6 +17,15 @@ import ru.betterend.registry.EndBlocks; public class LargeAmaranitaBlock extends EndPlantBlock { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; + public LargeAmaranitaBlock() { + super(FabricBlockSettings.of(Material.PLANT) + .luminance((state) -> (state.get(SHAPE) == TripleShape.TOP) ? 15 : 0) + .breakByTool(FabricToolTags.SHEARS) + .sounds(BlockSoundGroup.GRASS) + .breakByHand(true) + .noCollision()); + } + @Override protected boolean isTerrain(BlockState state) { return state.getBlock() == EndBlocks.SANGNUM; diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 22764be5..b8e7ab97 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -11,7 +11,7 @@ import ru.betterend.blocks.AeterniumAnvil; import ru.betterend.blocks.AeterniumBlock; import ru.betterend.blocks.AmaranitaCapBlock; import ru.betterend.blocks.AmaranitaHymenophoreBlock; -import ru.betterend.blocks.AmaranitaHyphaeBlock; +import ru.betterend.blocks.AmaranitaStemBlock; import ru.betterend.blocks.AmberBlock; import ru.betterend.blocks.AncientEmeraldIceBlock; import ru.betterend.blocks.AuroraCrystalBlock; @@ -70,7 +70,7 @@ import ru.betterend.blocks.MengerSpongeWetBlock; import ru.betterend.blocks.MissingTileBlock; import ru.betterend.blocks.MossyBoneBlock; import ru.betterend.blocks.MossyGlowshroomCapBlock; -import ru.betterend.blocks.MossyGlowshroomHymenophoreBlock; +import ru.betterend.blocks.GlowingHymenophoreBlock; import ru.betterend.blocks.MossyGlowshroomSaplingBlock; import ru.betterend.blocks.MossyObsidian; import ru.betterend.blocks.MurkweedBlock; @@ -175,7 +175,7 @@ public class EndBlocks { // Wooden Materials And Trees // public static final Block MOSSY_GLOWSHROOM_SAPLING = registerBlock("mossy_glowshroom_sapling", new MossyGlowshroomSaplingBlock()); public static final Block MOSSY_GLOWSHROOM_CAP = registerBlock("mossy_glowshroom_cap", new MossyGlowshroomCapBlock()); - public static final Block MOSSY_GLOWSHROOM_HYMENOPHORE = registerBlock("mossy_glowshroom_hymenophore", new MossyGlowshroomHymenophoreBlock()); + public static final Block MOSSY_GLOWSHROOM_HYMENOPHORE = registerBlock("mossy_glowshroom_hymenophore", new GlowingHymenophoreBlock()); public static final Block MOSSY_GLOWSHROOM_FUR = registerBlock("mossy_glowshroom_fur", new FurBlock(MOSSY_GLOWSHROOM_SAPLING, 15, 16)); public static final WoodenMaterial MOSSY_GLOWSHROOM = new WoodenMaterial("mossy_glowshroom", MaterialColor.GRAY, MaterialColor.WOOD); @@ -260,8 +260,10 @@ public class EndBlocks { public static final Block SMALL_AMARANITA_MUSHROOM = registerBlock("small_amaranita_mushroom", new SmallAmaranitaBlock()); public static final Block LARGE_AMARANITA_MUSHROOM = registerBlockNI("large_amaranita_mushroom", new LargeAmaranitaBlock()); - public static final Block AMARANITA_HYPHAE = registerBlock("amaranita_hyphae", new AmaranitaHyphaeBlock()); + public static final Block AMARANITA_STEM = registerBlock("amaranita_stem", new AmaranitaStemBlock()); + public static final Block AMARANITA_HYPHAE = registerBlock("amaranita_hyphae", new AmaranitaStemBlock()); public static final Block AMARANITA_HYMENOPHORE = registerBlock("amaranita_hymenophore", new AmaranitaHymenophoreBlock()); + public static final Block AMARANITA_LANTERN = registerBlock("amaranita_lantern", new GlowingHymenophoreBlock()); public static final Block AMARANITA_FUR = registerBlock("amaranita_fur", new FurBlock(MOSSY_GLOWSHROOM_SAPLING, 15, 4)); public static final Block AMARANITA_CAP = registerBlock("amaranita_cap", new AmaranitaCapBlock()); diff --git a/src/main/resources/assets/betterend/blockstates/amaranita_lantern.json b/src/main/resources/assets/betterend/blockstates/amaranita_lantern.json new file mode 100644 index 00000000..183ab6b2 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/amaranita_lantern.json @@ -0,0 +1,5 @@ +{ + "variants": { + "": { "model": "betterend:block/amaranita_lantern" } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/amaranita_stem.json b/src/main/resources/assets/betterend/blockstates/amaranita_stem.json new file mode 100644 index 00000000..654324f3 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/amaranita_stem.json @@ -0,0 +1,7 @@ +{ + "variants": { + "axis=x": { "model": "betterend:block/amaranita_stem", "x": 90, "y": 90 }, + "axis=y": { "model": "betterend:block/amaranita_stem" }, + "axis=z": { "model": "betterend:block/amaranita_stem", "x": 90 } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 8c95e3c0..f866d584 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -676,5 +676,28 @@ "item.betterend.thallasium_shovel_head": "Thallasium Shovel Head", "item.betterend.thallasium_sword_blade": "Thallasium Sword Blade", "item.betterend.thallasium_sword_handle": "Thallasium Sword Handle", - "block.betterend.aeternium_anvil": "Aeternium Anvil" + "block.betterend.aeternium_anvil": "Aeternium Anvil", + + "biome.betterend.dragon_graveyards": "Dragon Graveyards", + "biome.betterend.dry_shrubland": "Dry Shrubland", + "block.betterend.aeridium": "Aeridium", + "block.betterend.amaranita_cap": "Amaranita Cap", + "block.betterend.amaranita_fur": "Amaranita Fur", + "block.betterend.amaranita_hymenophore": "Amaranita Hymenophore", + "block.betterend.amaranita_hyphae": "Amaranita Hyphae", + "block.betterend.amaranita_lantern": "Amaranita Lantern", + "block.betterend.amaranita_stem": "Amaranita Stem", + "block.betterend.clawfern": "Clawfern", + "block.betterend.globulagus": "Globulagus", + "block.betterend.lamellarium": "Lamellarium", + "block.betterend.large_amaranita_mushroom": "Large Amaranita Mushroom", + "block.betterend.lutebus": "Lutebus", + "block.betterend.mossy_bone": "Mossy Bone", + "block.betterend.mossy_obsidian": "Mossy Obsidian", + "block.betterend.orango": "Orango", + "block.betterend.rutiscus": "Rutiscus", + "block.betterend.rutiscus_path": "Rutiscus Path", + "block.betterend.sangnum": "Sangnum", + "block.betterend.sangnum_path": "Sangnum Path", + "block.betterend.small_amaranita_mushroom": "Small Amaranita Mushroom" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 8645338b..2cf2dc7b 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -696,5 +696,28 @@ "item.betterend.thallasium_shovel_head": "Навершие талласиевой лопаты", "item.betterend.thallasium_sword_blade": "Лезвие талласиевого меча", "item.betterend.thallasium_sword_handle": "Рукоятка талласиевого меча", - "block.betterend.aeternium_anvil": "Этериевая наковальня" + "block.betterend.aeternium_anvil": "Этериевая наковальня", + + "biome.betterend.dragon_graveyards": "Драконье кладбище", + "biome.betterend.dry_shrubland": "Сухая степь", + "block.betterend.aeridium": "Аэридиум", + "block.betterend.amaranita_cap": "Шляпка амаранита", + "block.betterend.amaranita_fur": "Волоски амаранита", + "block.betterend.amaranita_hymenophore": "Гименофор амаранита", + "block.betterend.amaranita_hyphae": "Гифа амаранита", + "block.betterend.amaranita_lantern": "Фонарь амаранита", + "block.betterend.amaranita_stem": "Стебель амаранита", + "block.betterend.clawfern": "Когтелист", + "block.betterend.globulagus": "Глобулагус", + "block.betterend.lamellarium": "Ламеллариум", + "block.betterend.large_amaranita_mushroom": "Большой амаранит", + "block.betterend.lutebus": "Лютебус", + "block.betterend.mossy_bone": "Мшистые кости", + "block.betterend.mossy_obsidian": "Мшистый обсидиан", + "block.betterend.orango": "Оранго", + "block.betterend.rutiscus": "Рутискус", + "block.betterend.rutiscus_path": "Тропа из рутискуса", + "block.betterend.sangnum": "Сагнум", + "block.betterend.sangnum_path": "Тропа из сагнума", + "block.betterend.small_amaranita_mushroom": "Маленький амаранит" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/amaranita_lantern.json b/src/main/resources/assets/betterend/materialmaps/block/amaranita_lantern.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/amaranita_lantern.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/large_amaranita_mushroom.json b/src/main/resources/assets/betterend/materialmaps/block/large_amaranita_mushroom.json new file mode 100644 index 00000000..c3f7bd4d --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/large_amaranita_mushroom.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/large_amaranita_cap_bottom", + "material": "betterend:glow_green_2" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materials/glow_green_2.json b/src/main/resources/assets/betterend/materials/glow_green_2.json new file mode 100644 index 00000000..4ce910e1 --- /dev/null +++ b/src/main/resources/assets/betterend/materials/glow_green_2.json @@ -0,0 +1,10 @@ +{ + "layers": [ + { + "vertexSource": "canvas:shaders/material/default.vert", + "fragmentSource": "betterend:shaders/material/glow_green_2.frag", + "disableAo": true, + "disableDiffuse": true + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/amaranita_hyphae.json b/src/main/resources/assets/betterend/models/block/amaranita_hyphae.json index ddef4114..29dec972 100644 --- a/src/main/resources/assets/betterend/models/block/amaranita_hyphae.json +++ b/src/main/resources/assets/betterend/models/block/amaranita_hyphae.json @@ -1,12 +1,6 @@ { - "parent": "block/cube", + "parent": "block/cube_all", "textures": { - "down": "betterend:block/amaranita_hyphae_top", - "east": "betterend:block/amaranita_hyphae_side", - "north": "betterend:block/amaranita_hyphae_side", - "particle": "betterend:block/amaranita_hyphae_side", - "south": "betterend:block/amaranita_hyphae_side", - "up": "betterend:block/amaranita_hyphae_top", - "west": "betterend:block/amaranita_hyphae_side" + "all": "betterend:block/amaranita_hyphae_side" } } diff --git a/src/main/resources/assets/betterend/models/block/amaranita_lantern.json b/src/main/resources/assets/betterend/models/block/amaranita_lantern.json new file mode 100644 index 00000000..ff85ca1a --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amaranita_lantern.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cube_noshade", + "textures": { + "texture": "betterend:block/amaranita_lantern" + } +} diff --git a/src/main/resources/assets/betterend/models/block/amaranita_stem.json b/src/main/resources/assets/betterend/models/block/amaranita_stem.json new file mode 100644 index 00000000..f4b0c637 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amaranita_stem.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "betterend:block/amaranita_hyphae_top", + "east": "betterend:block/amaranita_hyphae_side", + "north": "betterend:block/amaranita_hyphae_side", + "particle": "betterend:block/mossy_bone_side_ver", + "south": "betterend:block/amaranita_hyphae_side", + "up": "betterend:block/amaranita_hyphae_top", + "west": "betterend:block/amaranita_hyphae_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/large_amaranita_cap.json b/src/main/resources/assets/betterend/models/block/large_amaranita_cap.json index 8a5e634b..e9211bee 100644 --- a/src/main/resources/assets/betterend/models/block/large_amaranita_cap.json +++ b/src/main/resources/assets/betterend/models/block/large_amaranita_cap.json @@ -33,29 +33,6 @@ "east": { "uv": [ 3, 0, 13, 2 ], "texture": "#side" } } }, - { - "__comment": "Box4", - "from": [ 6, 0, 6 ], - "to": [ 10, 4, 10 ], - "faces": { - "north": { "uv": [ 6, 12, 10, 16 ], "texture": "#stem" }, - "south": { "uv": [ 6, 12, 10, 16 ], "texture": "#stem" }, - "west": { "uv": [ 6, 12, 10, 16 ], "texture": "#stem" }, - "east": { "uv": [ 6, 12, 10, 16 ], "texture": "#stem" } - } - }, - { - "__comment": "Box4", - "from": [ 5, 4, 5 ], - "to": [ 11, 7, 11 ], - "faces": { - "down": { "uv": [ 5, 2, 11, 8 ], "texture": "#stem" }, - "north": { "uv": [ 5, 9, 11, 12 ], "texture": "#stem" }, - "south": { "uv": [ 5, 9, 11, 12 ], "texture": "#stem" }, - "west": { "uv": [ 5, 9, 11, 12 ], "texture": "#stem" }, - "east": { "uv": [ 5, 9, 11, 12 ], "texture": "#stem" } - } - }, { "__comment": "PlaneX6", "from": [ 2, 3, 1 ], @@ -91,6 +68,28 @@ "north": { "uv": [ 1, 9, 15, 13 ], "texture": "#side" }, "south": { "uv": [ 1, 9, 15, 13 ], "texture": "#side" } } + }, + { + "__comment": "PlaneX9", + "from": [ 2.25, 0, 2.25 ], + "to": [ 2.251, 16, 18.25 ], + "rotation": { "origin": [ 2.25, 0, 2.25 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" } + } + }, + { + "__comment": "PlaneX9", + "from": [ 13.625, 0, 2.375 ], + "to": [ 13.626, 16, 18.375 ], + "rotation": { "origin": [ 13.625, 0, 2.375 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" } + } } ] } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/large_amaranita_roots.json b/src/main/resources/assets/betterend/models/block/large_amaranita_roots.json index 21b01862..5702d0a3 100644 --- a/src/main/resources/assets/betterend/models/block/large_amaranita_roots.json +++ b/src/main/resources/assets/betterend/models/block/large_amaranita_roots.json @@ -1,42 +1,30 @@ { "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", "textures": { - "particle": "betterend:block/amaranita_stem", - "texture": "betterend:block/amaranita_stem", - "texture1": "betterend:block/amaranita_roots" + "particle": "betterend:block/amaranita_stem_roots", + "stem": "betterend:block/amaranita_stem_roots" }, "elements": [ { - "__comment": "Box1", - "from": [ 6, 0, 6 ], - "to": [ 10, 16, 10 ], + "__comment": "PlaneX9", + "from": [ 2.25, 0, 2.25 ], + "to": [ 2.251, 16, 18.25 ], + "rotation": { "origin": [ 2.25, 0, 2.25 ], "axis": "y", "angle": 45 }, + "shade": false, "faces": { - "north": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, - "south": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, - "west": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, - "east": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" } + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" } } }, { - "__comment": "PlaneX2", - "from": [ 0, 0, 0 ], - "to": [ 0.001, 16, 22.5 ], - "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": 45 }, + "__comment": "PlaneX9", + "from": [ 13.625, 0, 2.375 ], + "to": [ 13.626, 16, 18.375 ], + "rotation": { "origin": [ 13.625, 0, 2.375 ], "axis": "y", "angle": -45 }, "shade": false, "faces": { - "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture1" }, - "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture1" } - } - }, - { - "__comment": "PlaneX2", - "from": [ 16, 0, 0 ], - "to": [ 16.001, 16, 22.5 ], - "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": -45 }, - "shade": false, - "faces": { - "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture1" }, - "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture1" } + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" } } } ] diff --git a/src/main/resources/assets/betterend/models/block/large_amaranita_stem.json b/src/main/resources/assets/betterend/models/block/large_amaranita_stem.json index 5bde4f65..14929023 100644 --- a/src/main/resources/assets/betterend/models/block/large_amaranita_stem.json +++ b/src/main/resources/assets/betterend/models/block/large_amaranita_stem.json @@ -1,19 +1,30 @@ { "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", "textures": { - "particle": "betterend:block/amaranita_stem", - "texture": "betterend:block/amaranita_stem" + "particle": "betterend:block/amaranita_stem_middle", + "stem": "betterend:block/amaranita_stem_middle" }, "elements": [ { - "__comment": "Box1", - "from": [ 6, 0, 6 ], - "to": [ 10, 16, 10 ], + "__comment": "PlaneX9", + "from": [ 2.25, 0, 2.25 ], + "to": [ 2.251, 16, 18.25 ], + "rotation": { "origin": [ 2.25, 0, 2.25 ], "axis": "y", "angle": 45 }, + "shade": false, "faces": { - "north": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, - "south": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, - "west": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, - "east": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" } + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" } + } + }, + { + "__comment": "PlaneX9", + "from": [ 13.625, 0, 2.375 ], + "to": [ 13.626, 16, 18.375 ], + "rotation": { "origin": [ 13.625, 0, 2.375 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#stem" } } } ] diff --git a/src/main/resources/assets/betterend/models/item/amaranita_hyphae.json b/src/main/resources/assets/betterend/models/item/amaranita_hyphae.json new file mode 100644 index 00000000..0277110e --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/amaranita_hyphae.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/amaranita_hyphae" +} diff --git a/src/main/resources/assets/betterend/models/item/amaranita_lantern.json b/src/main/resources/assets/betterend/models/item/amaranita_lantern.json new file mode 100644 index 00000000..b7d6254e --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/amaranita_lantern.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/amaranita_lantern" +} diff --git a/src/main/resources/assets/betterend/models/item/amaranita_stem.json b/src/main/resources/assets/betterend/models/item/amaranita_stem.json new file mode 100644 index 00000000..8c1f62b3 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/amaranita_stem.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/amaranita_stem" +} diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_fur.png b/src/main/resources/assets/betterend/textures/block/amaranita_fur.png index 57f1b50526baf5d5cfc6f043c2377b2a2032f2ef..018aa0bff9351b2ca245dd95bdf21bd1494db50d 100644 GIT binary patch delta 107 zcmV-x0F?i_0l@)~U1U#5L_t&-m9>n45x_7A0uk7M<_c-AU7(ml^C5!6nOekwMx5Ff zMVJ9hW(FWq?79aQP0ebX z7-PxsG!#@UBDS*vDq#&O*7r1`DP%u#1WrHV;k-EC_;)VC$pHk_lD~QY0000i}xB!b;{*)KluAzP~a>(ee0N^vFnobey&237S$VugK$kFhy85}Sb4q9e01&QX_a4ltj1rR~C@vyeeRTcbpNQn`N5rCRw T-U!?ZG>5^{)z4*}Q$iB}XKFkQ diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_stem.png b/src/main/resources/assets/betterend/textures/block/amaranita_stem.png deleted file mode 100644 index b33c8778377690f541b101bfdbad7ee2d622603e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|8a-VcLo9l? zPTI)ZV8Fv--=Q`ob7rgLjn1~YH<|@Ag4I+*ro}ukXL)$*yVp7SgfpA+)fukDFfzP0 zY2Ur~9+!XsLsHkZS+WZb7J5AM`_8&dU*LnrPF)9ww~s;_*mp4+yFVdQ&MBb@00Y8EJpcdz diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_stem_middle.png b/src/main/resources/assets/betterend/textures/block/amaranita_stem_middle.png new file mode 100644 index 0000000000000000000000000000000000000000..2a270aca026cfa3f4676c71d5b73cdaac0655eaf GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~p#Yx{S0G)n zac$+{jZIf~&AoqS*PEL^6S!M|qHHBWe!&d?L7=Mg!9So#pr?yth{V*`eowvw3>-|6 zfBw(zez`Cr-??DXfj*lpAAL1uS_#<3M!sWPA-S2UWj90HZh__-ok{_o!5q_FzD-TB q<#u0nU-b70%fs0hI1jzg=Wm_I@b&Svx6grwGkCiCxvX1boFyt=akR{0P^NdSpWb4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_stem_top.png b/src/main/resources/assets/betterend/textures/block/amaranita_stem_top.png index afa144c53ed8f221322d67beb9f0156106a8c499..c8f4f8304a3da37000660a0d49968cc924555df0 100644 GIT binary patch delta 132 zcmdnXxQ%gwWo^aAwUviAHeKB{_x_n(Z*Klf;BH}HU|=f=@(X784+2${5B>o~96Vhd zLnNl2?P26%FyLS^{ri9R^6tNhtU}A!|5z(CeG1uf%-~T>DdVw~4d`1D^fZeZG#)an@XTBE6KEELr>mdKI;Vst07^$YH2?qr delta 140 zcmV;70CWGg0lfi`Ie$^2j$p2vdBd@S)w-SE%)g#AvH$=826R$RQvm<}|NsAbdEov4 z002ixL_t&-m5q)$5`a($L&?JZuPheM5ViPpd6R{zvjaq61KHeQw5=M4nuW6pI=qF0Kp27hBN>G002ovP6b4+LSTYS;6E7v diff --git a/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_bottom.png b/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_bottom.png index 2376260c51aee8b646677067fca98e423db7431d..8db8ed8a20f339ac04e193ef3ba3ed9f2cb5dc77 100644 GIT binary patch delta 32 qcmV+*0N?+D0)hgNLKb+jt$D+-g4Md6-^{w~+1dN Date: Mon, 1 Mar 2021 21:44:17 +0300 Subject: [PATCH 302/463] Fixes, block models --- .../betterend/blocks/LargeAmaranitaBlock.java | 16 +++- .../betterend/blocks/SmallAmaranitaBlock.java | 15 +++- .../java/ru/betterend/util/BonemealUtil.java | 12 +++ .../blockstates/small_amaranita_mushroom.json | 5 +- .../materialmaps/item/amaranita_fur.json | 1 + .../block/small_amaranita_mushroom.json | 81 ++++++++++++++++++ .../block/small_amaranita_mushroom_01.json | 6 -- .../block/small_amaranita_mushroom_02.json | 6 -- .../models/item/small_amaranita_mushroom.json | 2 +- .../block/small_amaranita_mushroom.png | Bin 190 -> 462 bytes .../item/small_amaranita_mushroom.png | Bin 0 -> 190 bytes 11 files changed, 123 insertions(+), 21 deletions(-) create mode 100644 src/main/resources/assets/betterend/materialmaps/item/amaranita_fur.json create mode 100644 src/main/resources/assets/betterend/models/block/small_amaranita_mushroom.json delete mode 100644 src/main/resources/assets/betterend/models/block/small_amaranita_mushroom_01.json delete mode 100644 src/main/resources/assets/betterend/models/block/small_amaranita_mushroom_02.json create mode 100644 src/main/resources/assets/betterend/textures/item/small_amaranita_mushroom.png diff --git a/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java b/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java index cfab1b3e..38ce5610 100644 --- a/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java +++ b/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java @@ -5,10 +5,14 @@ import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Material; +import net.minecraft.block.ShapeContext; import net.minecraft.sound.BlockSoundGroup; import net.minecraft.state.StateManager; import net.minecraft.state.property.EnumProperty; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.BlockView; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.EndPlantBlock; @@ -16,19 +20,25 @@ import ru.betterend.registry.EndBlocks; public class LargeAmaranitaBlock extends EndPlantBlock { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; + private static final VoxelShape SHAPE_BOTTOM = Block.createCuboidShape(4, 0, 4, 12, 14, 12); + private static final VoxelShape SHAPE_TOP = VoxelShapes.union(Block.createCuboidShape(1, 3, 1, 15, 16, 15), SHAPE_BOTTOM); public LargeAmaranitaBlock() { super(FabricBlockSettings.of(Material.PLANT) .luminance((state) -> (state.get(SHAPE) == TripleShape.TOP) ? 15 : 0) .breakByTool(FabricToolTags.SHEARS) .sounds(BlockSoundGroup.GRASS) - .breakByHand(true) - .noCollision()); + .breakByHand(true)); + } + + @Override + public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + return state.get(SHAPE) == TripleShape.TOP ? SHAPE_TOP : SHAPE_BOTTOM; } @Override protected boolean isTerrain(BlockState state) { - return state.getBlock() == EndBlocks.SANGNUM; + return state.isOf(EndBlocks.SANGNUM) || state.isOf(EndBlocks.MOSSY_OBSIDIAN) || state.isOf(EndBlocks.MOSSY_BONE); } @Override diff --git a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java index 10c6e631..2bfecb86 100644 --- a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java +++ b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java @@ -2,17 +2,24 @@ package ru.betterend.blocks; import java.util.Random; +import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.block.ShapeContext; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.BlockView; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; public class SmallAmaranitaBlock extends EndPlantBlock { + private static final VoxelShape SHAPE = Block.createCuboidShape(4, 0, 4, 12, 10, 12); + @Override protected boolean isTerrain(BlockState state) { - return state.getBlock() == EndBlocks.SANGNUM; + return state.isOf(EndBlocks.SANGNUM) || state.isOf(EndBlocks.MOSSY_OBSIDIAN) || state.isOf(EndBlocks.MOSSY_BONE); } @Override @@ -24,6 +31,12 @@ public class SmallAmaranitaBlock extends EndPlantBlock { EndFeatures.LARGE_AMARANITA.getFeature().generate(world, null, random, pos, null); } + @Override + public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + Vec3d vec3d = state.getModelOffset(view, pos); + return SHAPE.offset(vec3d.x, vec3d.y, vec3d.z); + } + private BlockPos growBig(ServerWorld world, BlockPos pos) { for (int x = -1; x < 2; x++) { for (int z = -1; z < 2; z++) { diff --git a/src/main/java/ru/betterend/util/BonemealUtil.java b/src/main/java/ru/betterend/util/BonemealUtil.java index 226235fd..72a6c66f 100644 --- a/src/main/java/ru/betterend/util/BonemealUtil.java +++ b/src/main/java/ru/betterend/util/BonemealUtil.java @@ -47,6 +47,18 @@ public class BonemealUtil { addBonemealGrass(EndBlocks.RUTISCUS, EndBlocks.AERIDIUM, 0.2F); addBonemealGrass(EndBlocks.RUTISCUS, EndBlocks.LUTEBUS, 0.2F); addBonemealGrass(EndBlocks.RUTISCUS, EndBlocks.LAMELLARIUM); + + addBonemealGrass(EndBlocks.SANGNUM, EndBlocks.GLOBULAGUS); + addBonemealGrass(EndBlocks.SANGNUM, EndBlocks.CLAWFERN); + addBonemealGrass(EndBlocks.SANGNUM, EndBlocks.SMALL_AMARANITA_MUSHROOM, 0.1F); + + addBonemealGrass(EndBlocks.MOSSY_BONE, EndBlocks.GLOBULAGUS); + addBonemealGrass(EndBlocks.MOSSY_BONE, EndBlocks.CLAWFERN); + addBonemealGrass(EndBlocks.MOSSY_BONE, EndBlocks.SMALL_AMARANITA_MUSHROOM, 0.1F); + + addBonemealGrass(EndBlocks.MOSSY_OBSIDIAN, EndBlocks.GLOBULAGUS); + addBonemealGrass(EndBlocks.MOSSY_OBSIDIAN, EndBlocks.CLAWFERN); + addBonemealGrass(EndBlocks.MOSSY_OBSIDIAN, EndBlocks.SMALL_AMARANITA_MUSHROOM, 0.1F); } public static void addBonemealGrass(Block terrain, Block plant) { diff --git a/src/main/resources/assets/betterend/blockstates/small_amaranita_mushroom.json b/src/main/resources/assets/betterend/blockstates/small_amaranita_mushroom.json index 84030665..63f7c8c5 100644 --- a/src/main/resources/assets/betterend/blockstates/small_amaranita_mushroom.json +++ b/src/main/resources/assets/betterend/blockstates/small_amaranita_mushroom.json @@ -1,8 +1,5 @@ { "variants": { - "": [ - { "model": "betterend:block/small_amaranita_mushroom_01" }, - { "model": "betterend:block/small_amaranita_mushroom_02" } - ] + "": { "model": "betterend:block/small_amaranita_mushroom" } } } diff --git a/src/main/resources/assets/betterend/materialmaps/item/amaranita_fur.json b/src/main/resources/assets/betterend/materialmaps/item/amaranita_fur.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/amaranita_fur.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/models/block/small_amaranita_mushroom.json b/src/main/resources/assets/betterend/models/block/small_amaranita_mushroom.json new file mode 100644 index 00000000..41e0257c --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/small_amaranita_mushroom.json @@ -0,0 +1,81 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/small_amaranita_mushroom", + "texture": "betterend:block/small_amaranita_mushroom" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 4, 4, 4 ], + "to": [ 12, 8, 12 ], + "faces": { + "down": { "uv": [ 0, 8, 8, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 8, 8 ], "texture": "#texture" }, + "north": { "uv": [ 8, 4, 16, 8 ], "texture": "#texture" }, + "south": { "uv": [ 8, 4, 16, 8 ], "texture": "#texture" }, + "west": { "uv": [ 8, 4, 16, 8 ], "texture": "#texture" }, + "east": { "uv": [ 8, 4, 16, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 7, 0, 7 ], + "to": [ 9, 4, 9 ], + "faces": { + "north": { "uv": [ 14, 8, 16, 12 ], "texture": "#texture" }, + "south": { "uv": [ 14, 8, 16, 12 ], "texture": "#texture" }, + "west": { "uv": [ 14, 8, 16, 12 ], "texture": "#texture" }, + "east": { "uv": [ 14, 8, 16, 12 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 5, 8, 5 ], + "to": [ 11, 10, 11 ], + "faces": { + "up": { "uv": [ 1, 1, 7, 7 ], "texture": "#texture" }, + "north": { "uv": [ 9, 2, 15, 4 ], "texture": "#texture" }, + "south": { "uv": [ 9, 2, 15, 4 ], "texture": "#texture" }, + "west": { "uv": [ 9, 2, 15, 4 ], "texture": "#texture" }, + "east": { "uv": [ 9, 2, 15, 4 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX4", + "from": [ 4.5, 2, 4 ], + "to": [ 4.501, 4, 12 ], + "faces": { + "west": { "uv": [ 8, 13, 16, 15 ], "texture": "#texture" }, + "east": { "uv": [ 8, 13, 16, 15 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX4", + "from": [ 11.5, 2, 4 ], + "to": [ 11.501, 4, 12 ], + "faces": { + "west": { "uv": [ 8, 13, 16, 15 ], "texture": "#texture" }, + "east": { "uv": [ 8, 13, 16, 15 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneZ6", + "from": [ 4, 2, 4.5 ], + "to": [ 12, 4, 4.501 ], + "faces": { + "north": { "uv": [ 8, 13, 16, 15 ], "texture": "#texture" }, + "south": { "uv": [ 8, 13, 16, 15 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneZ6", + "from": [ 4, 2, 11.5 ], + "to": [ 12, 4, 11.501 ], + "faces": { + "north": { "uv": [ 8, 13, 16, 15 ], "texture": "#texture" }, + "south": { "uv": [ 8, 13, 16, 15 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/small_amaranita_mushroom_01.json b/src/main/resources/assets/betterend/models/block/small_amaranita_mushroom_01.json deleted file mode 100644 index ae20c5ad..00000000 --- a/src/main/resources/assets/betterend/models/block/small_amaranita_mushroom_01.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/cross", - "textures": { - "cross": "betterend:block/small_amaranita_mushroom" - } -} diff --git a/src/main/resources/assets/betterend/models/block/small_amaranita_mushroom_02.json b/src/main/resources/assets/betterend/models/block/small_amaranita_mushroom_02.json deleted file mode 100644 index 6f917ca4..00000000 --- a/src/main/resources/assets/betterend/models/block/small_amaranita_mushroom_02.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "betterend:block/cross_inverted", - "textures": { - "cross": "betterend:block/small_amaranita_mushroom" - } -} diff --git a/src/main/resources/assets/betterend/models/item/small_amaranita_mushroom.json b/src/main/resources/assets/betterend/models/item/small_amaranita_mushroom.json index c6893c41..a6088d8f 100644 --- a/src/main/resources/assets/betterend/models/item/small_amaranita_mushroom.json +++ b/src/main/resources/assets/betterend/models/item/small_amaranita_mushroom.json @@ -1,6 +1,6 @@ { "parent": "item/generated", "textures": { - "layer0": "betterend:block/small_amaranita_mushroom" + "layer0": "betterend:item/small_amaranita_mushroom" } } diff --git a/src/main/resources/assets/betterend/textures/block/small_amaranita_mushroom.png b/src/main/resources/assets/betterend/textures/block/small_amaranita_mushroom.png index 2dd0ce703b048f954ef12eef13efa3ad86e186b2..e903055a9f52c181a4b9786669c55bedeaca3fbb 100644 GIT binary patch delta 447 zcmV;w0YLt~0nP)E8Gi-<001BJ|6u?C00DDSM?wIu&K&6g00D?eL_t(IjeU|oOT$1I z#($Rt3oX=8As8x16>-SoB6#0GTpR?UgP%Ygx(V)5aOfcJIu-l?euXGb4joEG5iEs* zB`I`BF~p(0BeiKC2$#E;=g+cOKcBwokwhUH! zqsVcyj#<6bBHxv*MAa06L6?os4`KXw23R}4#V(cgHPW@8yNj7K@m<+Ulm-!QsPo5(OiymhW?8n%5(q# delta 173 zcmX@dypM5$WIZzj1A~Sxe=v|@EDmyaVpw-h<|UA$7~m7)3Z%an+dffLdU#^hX;sy2 z{e_Mbt34LBg)g5{v2ktX;f-?pUIYOZahC-71vC7IgW9s%t3Y8BPZ!4!iK)p65+Mx} zCw2< P4Pfwe^>bP0l+XkKBRoQ% diff --git a/src/main/resources/assets/betterend/textures/item/small_amaranita_mushroom.png b/src/main/resources/assets/betterend/textures/item/small_amaranita_mushroom.png new file mode 100644 index 0000000000000000000000000000000000000000..2dd0ce703b048f954ef12eef13efa3ad86e186b2 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~#Q>iWS0Mex z*!GE{(!&$0POGYJ>o0ViSnaW}EqwWuij8Y44{wy)_X1=TcS(?6FvEX1s4c6#3KTZ+ zba4!kn3|j*5z;VmVy9s5`6E3#hfbV1)U>8WkY$F1pwgK&0v$PA($=#~W#(is&4~$M ZV~~EsQ2Ajok3LX8gQu&X%Q~loCICTKLdF09 literal 0 HcmV?d00001 From 9899492a933b9fb64a1fcd5efd4a2a6328b965a8 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 6 Mar 2021 03:26:33 +0300 Subject: [PATCH 303/463] Gigantic amaranita feature --- .../ru/betterend/registry/EndFeatures.java | 2 + .../world/biome/DragonGraveyardsBiome.java | 1 + .../trees/GiganticAmaranitaFeature.java | 339 ++++++++++++++++++ 3 files changed, 342 insertions(+) create mode 100644 src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 6e1e5b3b..c0f693f2 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -51,6 +51,7 @@ import ru.betterend.world.features.terrain.SulphuricCaveFeature; import ru.betterend.world.features.terrain.SulphuricLakeFeature; import ru.betterend.world.features.terrain.SurfaceVentFeature; import ru.betterend.world.features.trees.DragonTreeFeature; +import ru.betterend.world.features.trees.GiganticAmaranitaFeature; import ru.betterend.world.features.trees.HelixTreeFeature; import ru.betterend.world.features.trees.JellyshroomFeature; import ru.betterend.world.features.trees.LacugroveFeature; @@ -70,6 +71,7 @@ public class EndFeatures { public static final EndFeature HELIX_TREE = new EndFeature("helix_tree", new HelixTreeFeature(), 2); public static final EndFeature UMBRELLA_TREE = new EndFeature("umbrella_tree", new UmbrellaTreeFeature(), 4); public static final EndFeature JELLYSHROOM = new EndFeature("jellyshroom", new JellyshroomFeature(), 3); + public static final EndFeature GIGANTIC_AMARANITA = new EndFeature("gigantic_amaranita", new GiganticAmaranitaFeature(), 1); // Bushes // public static final EndFeature PYTHADENDRON_BUSH = new EndFeature("pythadendron_bush", new BushFeature(EndBlocks.PYTHADENDRON_LEAVES, EndBlocks.PYTHADENDRON.bark), 4); diff --git a/src/main/java/ru/betterend/world/biome/DragonGraveyardsBiome.java b/src/main/java/ru/betterend/world/biome/DragonGraveyardsBiome.java index 765ae2a3..07c0dc74 100644 --- a/src/main/java/ru/betterend/world/biome/DragonGraveyardsBiome.java +++ b/src/main/java/ru/betterend/world/biome/DragonGraveyardsBiome.java @@ -21,6 +21,7 @@ public class DragonGraveyardsBiome extends EndBiome { .addFeature(EndFeatures.OBSIDIAN_PILLAR_BASEMENT) .addFeature(EndFeatures.FALLEN_PILLAR) .addFeature(EndFeatures.OBSIDIAN_BOULDER) + .addFeature(EndFeatures.GIGANTIC_AMARANITA) .addFeature(EndFeatures.LARGE_AMARANITA) .addFeature(EndFeatures.SMALL_AMARANITA) .addFeature(EndFeatures.GLOBULAGUS) diff --git a/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java b/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java new file mode 100644 index 00000000..f91d2d0d --- /dev/null +++ b/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java @@ -0,0 +1,339 @@ +package ru.betterend.world.features.trees; + +import java.util.List; +import java.util.Random; +import java.util.function.Function; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Material; +import net.minecraft.client.util.math.Vector3f; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Direction.Axis; +import net.minecraft.util.math.Direction.AxisDirection; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.blocks.basis.AttachedBlock; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; +import ru.betterend.util.SplineHelper; +import ru.betterend.util.sdf.PosInfo; +import ru.betterend.util.sdf.SDF; +import ru.betterend.world.features.DefaultFeature; + +public class GiganticAmaranitaFeature extends DefaultFeature { + private static final Function REPLACE; + private static final Function IGNORE; + private static final Function POST; + + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; + + float size = MHelper.randRange(5, 10, random); + List spline = SplineHelper.makeSpline(0, 0, 0, 0, size, 0, 5); + SplineHelper.offsetParts(spline, random, 0.7F, 0, 0.7F); + + if (!SplineHelper.canGenerate(spline, pos, world, REPLACE)) { + return false; + } + BlocksHelper.setWithoutUpdate(world, pos, AIR); + + float radius = size * 0.17F;//MHelper.randRange(0.8F, 1.2F, random); + SDF function = SplineHelper.buildSDF(spline, radius, 0.2F, (bpos) -> { + return EndBlocks.AMARANITA_STEM.getDefaultState(); + }); + + Vector3f capPos = spline.get(spline.size() - 1); + makeHead(world, pos.add(capPos.getX() + 0.5F, capPos.getY() + 1.5F ,capPos.getZ() + 0.5F), MathHelper.floor(size / 1.6F)); + + function.setReplaceFunction(REPLACE); + function.addPostProcess(POST); + function.fillRecursiveIgnore(world, pos, IGNORE); + + for (int i = 0; i < 3; i++) { + List copy = SplineHelper.copySpline(spline); + SplineHelper.offsetParts(copy, random, 0.2F, 0, 0.2F); + SplineHelper.fillSplineForce(copy, world, EndBlocks.AMARANITA_HYPHAE.getDefaultState(), pos, REPLACE); + } + + return true; + } + + private void makeHead(StructureWorldAccess world, BlockPos pos, int radius) { + Mutable mut = new Mutable(); + if (radius < 2) { + for (int i = -1; i < 2; i++) { + mut.set(pos).move(Direction.NORTH, 2).move(Direction.EAST, i); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.set(pos).move(Direction.SOUTH, 2).move(Direction.EAST, i); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.set(pos).move(Direction.EAST, 2).move(Direction.NORTH, i); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.set(pos).move(Direction.WEST, 2).move(Direction.NORTH, i); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + } + for (int x = -1; x < 2; x++) { + for (int z = -1; z < 2; z++) { + mut.set(pos).move(x, 0, z); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_LANTERN); + mut.move(Direction.DOWN); + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_LANTERN); + mut.move(Direction.DOWN); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_FUR.getDefaultState().with(AttachedBlock.FACING, Direction.DOWN)); + } + } + } + } + + int h = radius + 1; + for (int y = 0; y < h; y++) { + mut.setY(pos.getY() + y + 1); + for (int x = -1; x < 2; x++) { + mut.setX(pos.getX() + x); + for (int z = -1; z < 2; z++) { + mut.setZ(pos.getZ() + z); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_CAP); + } + } + } + } + + mut.setY(pos.getY() + h + 1); + for (int x = -1; x < 2; x++) { + mut.setX(pos.getX() + x); + for (int z = -1; z < 2; z++) { + mut.setZ(pos.getZ() + z); + if ((x == 0 || z == 0) && world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_CAP); + } + } + } + } + else if (radius < 4) { + pos = pos.add(-1, 0, -1); + for (int i = -2; i < 2; i++) { + mut.set(pos).move(Direction.NORTH, 2).move(Direction.WEST, i); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.set(pos).move(Direction.SOUTH, 3).move(Direction.WEST, i); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.set(pos).move(Direction.EAST, 3).move(Direction.NORTH, i); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.set(pos).move(Direction.WEST, 2).move(Direction.NORTH, i); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + } + for (int x = -1; x < 3; x++) { + for (int z = -1; z < 3; z++) { + mut.set(pos).move(x, 0, z); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_LANTERN); + mut.move(Direction.DOWN); + if ((x >> 1) == 0 || (z >> 1) == 0) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_LANTERN); + Axis axis = x < 0 || x > 1 ? Axis.X : Axis.Z; + int distance = axis == Axis.X ? x < 0 ? -1 : 1 : z < 0 ? -1 : 1; + BlockPos offseted = mut.offset(axis, distance); + if (world.getBlockState(offseted).getMaterial().isReplaceable()) { + Direction dir = Direction.from(axis, distance < 0 ? AxisDirection.NEGATIVE : AxisDirection.POSITIVE); + BlocksHelper.setWithoutUpdate(world, offseted, EndBlocks.AMARANITA_FUR.getDefaultState().with(AttachedBlock.FACING, dir)); + } + mut.move(Direction.DOWN); + } + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_FUR.getDefaultState().with(AttachedBlock.FACING, Direction.DOWN)); + } + } + } + } + + int h = radius - 1; + for (int y = 0; y < h; y++) { + mut.setY(pos.getY() + y + 1); + for (int x = -1; x < 3; x++) { + mut.setX(pos.getX() + x); + for (int z = -1; z < 3; z++) { + mut.setZ(pos.getZ() + z); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_CAP); + } + } + } + } + + mut.setY(pos.getY() + h + 1); + for (int x = -1; x < 3; x++) { + mut.setX(pos.getX() + x); + for (int z = -1; z < 3; z++) { + mut.setZ(pos.getZ() + z); + if (((x >> 1) == 0 || (z >> 1) == 0) && world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_CAP); + } + } + } + } + else { + for (int i = -2; i < 3; i++) { + mut.set(pos).move(Direction.NORTH, 3).move(Direction.EAST, i); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.move(Direction.UP); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.move(Direction.NORTH); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + + mut.set(pos).move(Direction.SOUTH, 3).move(Direction.EAST, i); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.move(Direction.UP); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.move(Direction.SOUTH); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + + mut.set(pos).move(Direction.EAST, 3).move(Direction.NORTH, i); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.move(Direction.UP); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.move(Direction.EAST); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + + mut.set(pos).move(Direction.WEST, 3).move(Direction.NORTH, i); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.move(Direction.UP); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + mut.move(Direction.WEST); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + } + + for (int i = 0; i < 4; i++) { + mut.set(pos).move(Direction.UP).move(BlocksHelper.HORIZONTAL[i], 3).move(BlocksHelper.HORIZONTAL[(i + 1) & 3], 3); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); + } + } + + for (int x = -2; x < 3; x++) { + for (int z = -2; z < 3; z++) { + mut.set(pos).move(x, 0, z); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_LANTERN); + mut.move(Direction.DOWN); + if ((x / 2) == 0 || (z / 2) == 0) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_LANTERN); + Axis axis = x < 0 || x > 1 ? Axis.X : Axis.Z; + int distance = axis == Axis.X ? x < 0 ? -1 : 1 : z < 0 ? -1 : 1; + BlockPos offseted = mut.offset(axis, distance); + if (world.getBlockState(offseted).getMaterial().isReplaceable()) { + Direction dir = Direction.from(axis, distance < 0 ? AxisDirection.NEGATIVE : AxisDirection.POSITIVE); + BlocksHelper.setWithoutUpdate(world, offseted, EndBlocks.AMARANITA_FUR.getDefaultState().with(AttachedBlock.FACING, dir)); + } + mut.move(Direction.DOWN); + } + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_FUR.getDefaultState().with(AttachedBlock.FACING, Direction.DOWN)); + } + } + } + } + + for (int y = 0; y < 3; y++) { + mut.setY(pos.getY() + y + 1); + for (int x = -2; x < 3; x++) { + mut.setX(pos.getX() + x); + for (int z = -2; z < 3; z++) { + mut.setZ(pos.getZ() + z); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_CAP); + } + } + } + } + + int h = radius + 1; + for (int y = 4; y < h; y++) { + mut.setY(pos.getY() + y); + for (int x = -2; x < 3; x++) { + mut.setX(pos.getX() + x); + for (int z = -2; z < 3; z++) { + mut.setZ(pos.getZ() + z); + if (y < 6) { + if (((x / 2) == 0 || (z / 2) == 0) && world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_CAP); + } + } + else { + if ((x == 0 || z == 0) && (Math.abs(x) < 2 && Math.abs(z) < 2) && world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_CAP); + } + } + } + } + } + } + } + + static { + REPLACE = (state) -> { + if (state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT)) { + return true; + } + return state.getMaterial().isReplaceable(); + }; + + IGNORE = (state) -> { + return EndBlocks.DRAGON_TREE.isTreeLog(state); + }; + + POST = (info) -> { + if (!info.getStateUp().isOf(EndBlocks.AMARANITA_STEM) || !info.getStateDown().isOf(EndBlocks.AMARANITA_STEM)) { + return EndBlocks.AMARANITA_HYPHAE.getDefaultState(); + } + return info.getState(); + }; + } +} From 0fe5b9f0b9a13a1d4bd08b76d769bbc3afea0003 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 6 Mar 2021 14:54:36 +0300 Subject: [PATCH 304/463] Gigantic amaranita bonemeal grow --- .../betterend/blocks/LargeAmaranitaBlock.java | 13 ++++++++++ .../betterend/blocks/SmallAmaranitaBlock.java | 26 ++++++++++++++++--- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java b/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java index 38ce5610..65ad65ae 100644 --- a/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java +++ b/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java @@ -1,5 +1,7 @@ package ru.betterend.blocks; +import java.util.Random; + import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.block.Block; @@ -13,6 +15,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; import net.minecraft.world.BlockView; +import net.minecraft.world.World; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.EndPlantBlock; @@ -64,4 +67,14 @@ public class LargeAmaranitaBlock extends EndPlantBlock { public OffsetType getOffsetType() { return OffsetType.NONE; } + + @Override + public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { + return false; + } + + @Override + public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { + return false; + } } diff --git a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java index 2bfecb86..334206f6 100644 --- a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java +++ b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java @@ -4,15 +4,18 @@ import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.block.ShapeContext; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.BlockView; +import net.minecraft.world.World; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; +import ru.betterend.util.BlocksHelper; public class SmallAmaranitaBlock extends EndPlantBlock { private static final VoxelShape SHAPE = Block.createCuboidShape(4, 0, 4, 12, 10, 12); @@ -26,6 +29,12 @@ public class SmallAmaranitaBlock extends EndPlantBlock { public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { BlockPos bigPos = growBig(world, pos); if (bigPos != null) { + if (EndFeatures.GIGANTIC_AMARANITA.getFeature().generate(world, null, random, bigPos, null)) { + replaceMushroom(world, bigPos); + replaceMushroom(world, bigPos.south()); + replaceMushroom(world, bigPos.east()); + replaceMushroom(world, bigPos.south().east()); + } return; } EndFeatures.LARGE_AMARANITA.getFeature().generate(world, null, random, pos, null); @@ -50,9 +59,20 @@ public class SmallAmaranitaBlock extends EndPlantBlock { } private boolean checkFrame(ServerWorld world, BlockPos pos) { - return world.getBlockState(pos).isOf(this) || - world.getBlockState(pos.south()).isOf(this) || - world.getBlockState(pos.east()).isOf(this) || + return world.getBlockState(pos).isOf(this) && + world.getBlockState(pos.south()).isOf(this) && + world.getBlockState(pos.east()).isOf(this) && world.getBlockState(pos.south().east()).isOf(this); } + + private void replaceMushroom(ServerWorld world, BlockPos pos) { + if (world.getBlockState(pos).isOf(this)) { + BlocksHelper.setWithUpdate(world, pos, Blocks.AIR); + } + } + + @Override + public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { + return random.nextInt(8) == 0; + } } From d734826e68eafde5a7dbdf87db32ccbb2722cf33 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 6 Mar 2021 19:51:51 +0300 Subject: [PATCH 305/463] New stone types (WIP) --- .../blocks/SmaragdantCrystalBlock.java | 19 ++++++++++++++++++ .../java/ru/betterend/registry/EndBlocks.java | 5 +++++ .../textures/block/azure_jadestone.png | Bin 0 -> 233 bytes .../textures/block/sandy_jadestone.png | Bin 0 -> 227 bytes .../textures/block/smaragdant_crystal.png | Bin 0 -> 237 bytes .../textures/block/virid_jadestone.png | Bin 0 -> 233 bytes 6 files changed, 24 insertions(+) create mode 100644 src/main/java/ru/betterend/blocks/SmaragdantCrystalBlock.java create mode 100644 src/main/resources/assets/betterend/textures/block/azure_jadestone.png create mode 100644 src/main/resources/assets/betterend/textures/block/sandy_jadestone.png create mode 100644 src/main/resources/assets/betterend/textures/block/smaragdant_crystal.png create mode 100644 src/main/resources/assets/betterend/textures/block/virid_jadestone.png diff --git a/src/main/java/ru/betterend/blocks/SmaragdantCrystalBlock.java b/src/main/java/ru/betterend/blocks/SmaragdantCrystalBlock.java new file mode 100644 index 00000000..5d090bea --- /dev/null +++ b/src/main/java/ru/betterend/blocks/SmaragdantCrystalBlock.java @@ -0,0 +1,19 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.block.Material; +import net.minecraft.sound.BlockSoundGroup; +import ru.betterend.blocks.basis.BlockBase; + +public class SmaragdantCrystalBlock extends BlockBase { + public SmaragdantCrystalBlock() { + super(FabricBlockSettings.of(Material.GLASS) + .breakByTool(FabricToolTags.PICKAXES) + .sounds(BlockSoundGroup.GLASS) + .luminance(15) + .hardness(1F) + .resistance(1F) + .nonOpaque()); + } +} diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index b8e7ab97..8fa9b478 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -84,6 +84,7 @@ import ru.betterend.blocks.ShadowGrassBlock; import ru.betterend.blocks.SilkMothNestBlock; import ru.betterend.blocks.SmallAmaranitaBlock; import ru.betterend.blocks.SmallJellyshroomBlock; +import ru.betterend.blocks.SmaragdantCrystalBlock; import ru.betterend.blocks.SulphurCrystalBlock; import ru.betterend.blocks.TenaneaFlowersBlock; import ru.betterend.blocks.TenaneaSaplingBlock; @@ -151,6 +152,9 @@ public class EndBlocks { public static final StoneMaterial FLAVOLITE = new StoneMaterial("flavolite", MaterialColor.SAND); public static final StoneMaterial VIOLECITE = new StoneMaterial("violecite", MaterialColor.PURPLE); public static final StoneMaterial SULPHURIC_ROCK = new StoneMaterial("sulphuric_rock", MaterialColor.BROWN); + public static final StoneMaterial VIRID_jADESTONE = new StoneMaterial("virid_jadestone", MaterialColor.GREEN); + public static final StoneMaterial AZURE_jADESTONE = new StoneMaterial("azure_jadestone", MaterialColor.LIGHT_BLUE); + public static final StoneMaterial SANDY_jADESTONE = new StoneMaterial("sandy_jadestone", MaterialColor.YELLOW); public static final Block BRIMSTONE = registerBlock("brimstone", new BrimstoneBlock()); public static final Block SULPHUR_CRYSTAL = registerBlock("sulphur_crystal", new SulphurCrystalBlock()); public static final Block MISSING_TILE = registerBlock("missing_tile", new MissingTileBlock()); @@ -329,6 +333,7 @@ public class EndBlocks { public static final Block ENDER_BLOCK = registerBlock("ender_block", new EnderBlock()); public static final Block AURORA_CRYSTAL = registerBlock("aurora_crystal", new AuroraCrystalBlock()); public static final Block AMBER_BLOCK = registerBlock("amber_block", new AmberBlock()); + public static final Block SMARAGDANT_CRYSTAL = registerBlock("smaragdant_crystal", new SmaragdantCrystalBlock()); public static final Block RESPAWN_OBELISK = registerBlock("respawn_obelisk", new RespawnObeliskBlock()); diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone.png new file mode 100644 index 0000000000000000000000000000000000000000..2b5fec55c2f35386948274cbb0d54c84d3a62da8 GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(iS0JtE zAEF%lE0CKaf52PnZ_666=m@E;78)-U@F6w3E>aSV}|>f3)&?0^D? zlVIup|0jjl%>9|L?2v9qxxMi0NgnPi<7fJ~1PCrn5~@mDI@q5uE@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone.png new file mode 100644 index 0000000000000000000000000000000000000000..0b40a3b24191448dc84881758f3659ac3702ec7a GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(iS0J5P zZc^CbP}uHVIl;SaUSQAK=xM*W?*k>+OM?7@8UBO8()wk;L25l+9780g`t~{UxfpUd zT|BV=|3vqLYL5>^iOyTFBwuNz^xFsDc8adLv+`DwkcsiTobqSQp}Q7K%yqwhqe4)9 zZACBp+32||n|UWTmOtdwF$}X>GG`+5$;E8m!H18_U(xTWe%{CZDz-}6{`hfbBQ>!s Q5ul|Ep00i_>zopr00T5sOaK4? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal.png new file mode 100644 index 0000000000000000000000000000000000000000..9b842b30c1e2f79811aecfcafe991e3ce3cabdb0 GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(iS0K&c zlg1F6%TQFs&{@r}xQXG+ROzIQ9YAsRk|4iehW}u&w0_xdpir@=i(`nyRNwQ_d`BHP zm;&4z|LXs2+FNTfxlTrSBGWUIWu<ng9@nj_%M@mM+E2*zf z+9gG8B%8PA%?RG2S-+s1rG{bOgwmh49<0>A#j>x#_bq?Kw>jc!PlHZ+o4;q<&N~0s azNz-F4>EUH?nvJWa;m4RpUXO@geCw5FI0p8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone.png new file mode 100644 index 0000000000000000000000000000000000000000..8532ec8a19ec536937a23c0738e29c3d817cd3d9 GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(iS0F8G z>8R}Bsp{dQ;qR{>7iyB1*tznUJ5YkXB*-tA;XfEGtzY&VD3tH%;us<^)wlnm*Z~C& zC&AMH|4$09nfo(g*&*GKa(m&~lRVs4#?SO|2@qVEBvh5QbY|HzCe5pf>nGZt=-GJj zQI*S@R;?+OmuAkgI1*LCw(fvX@^1c3a~HBt3T@wYW8x*f#fSJ`2_L)rypQ`^{vWfr Y2S1pjKW~uJ1zOGE>FVdQ&MBb@0NM&y5&!@I literal 0 HcmV?d00001 From 344684828795d36f4653f32625bfa8e4e2d903fa Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 7 Mar 2021 01:28:36 +0300 Subject: [PATCH 306/463] Texture update --- .../materialmaps/block/smaragdant_crystal.json | 3 +++ .../textures/block/smaragdant_crystal.png | Bin 237 -> 249 bytes 2 files changed, 3 insertions(+) create mode 100644 src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal.png index 9b842b30c1e2f79811aecfcafe991e3ce3cabdb0..6ee675aa88693e7f049f557b47dc1c0a69e962fc 100644 GIT binary patch delta 208 zcmaFM_>*yhVZB6vPlzi65cs4q#O5*-RWWo{Gc0IjIJ1o5{cK&ynC(C*j*=k1V21w? zaP?G(5m2n!)5S4FVyf@?K)wb89;ORh9jgCJds`>_e0zMEah}R1r63{CBc5t08umfr z5ket%PjNr(e_pch!Sv*u358F1w!LRO&CXWh;~BX*>h_~qx#ee4&NMV?+&A@+DZk9U zZiXjY<;A$n}vK{%6*^C+_{kThd#*Np00i_>zopr E02mNgF8}}l delta 196 zcmey#_?B^kVZCU8Plzi65cs4q#O5*-RWWo{Gc0amI5Sl`DPspvoV_H-FPPy!7%Z({ z_8TZv?CIhdA~DtXd^F!t2M(qH_r|~aKb!W}noO>f5uV8O%w$=q-(;7@MmZ^#1vj__ zET@FjHgY^!$;OeA(eO&@>yvg#Q5(tT?RhhTx7cddFDPfJVc0jJ^yjSyEA?-&>}&9S t%OCM=j=0*>pp)L_@7cDq&i}Pgnp|vd$@?2>^52P+9;0 From 83fd4603accb5f7f6bee71c65418debe19116caa Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sun, 7 Mar 2021 15:06:12 +0300 Subject: [PATCH 307/463] Targeted portals (WIP, bugged) --- .../ru/betterend/blocks/EndPortalBlock.java | 56 +++++++------- .../ru/betterend/blocks/EternalPedestal.java | 6 +- .../betterend/blocks/basis/PedestalBlock.java | 5 +- .../entities/EternalPedestalEntity.java | 12 +-- .../entities/InfusionPedestalEntity.java | 14 ++-- .../ru/betterend/registry/EndPortals.java | 18 ++--- .../ru/betterend/rituals/EternalRitual.java | 73 ++++++++++++------- .../ru/betterend/rituals/InfusionRitual.java | 10 +-- 8 files changed, 102 insertions(+), 92 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index ff4ab7d6..ffd12fdc 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -1,8 +1,5 @@ package ru.betterend.blocks; -import java.util.Objects; -import java.util.Random; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -21,6 +18,7 @@ import net.minecraft.sound.SoundEvents; import net.minecraft.state.StateManager; import net.minecraft.state.property.IntProperty; import net.minecraft.util.BlockRotation; +import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction.Axis; @@ -38,6 +36,9 @@ import ru.betterend.interfaces.TeleportingEntity; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndPortals; +import java.util.Objects; +import java.util.Random; + public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable, IColorProvider { public static final IntProperty PORTAL = BlockProperties.PORTAL; @@ -83,11 +84,12 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) { if (world instanceof ServerWorld && !entity.hasVehicle() && !entity.hasPassengers() && entity.canUsePortals()) { if (entity.hasNetherPortalCooldown()) return; - boolean isOverworld = world.getRegistryKey().equals(World.OVERWORLD); - MinecraftServer server = ((ServerWorld) world).getServer(); - ServerWorld destination = isOverworld ? server.getWorld(World.END) : EndPortals.getWorld(server, state.get(PORTAL)); - BlockPos exitPos = this.findExitPos(destination, pos, entity); - System.out.println(exitPos); + ServerWorld currentWorld = (ServerWorld) world; + MinecraftServer server = currentWorld.getServer(); + ServerWorld targetWorld = EndPortals.getWorld(server, state.get(PORTAL)); + boolean isTarget = world.getRegistryKey().equals(targetWorld.getRegistryKey()); + ServerWorld destination = isTarget ? server.getWorld(World.END) : targetWorld; + BlockPos exitPos = findExitPos(currentWorld, destination, pos, entity); if (exitPos == null) return; if (entity instanceof ServerPlayerEntity) { ServerPlayerEntity player = (ServerPlayerEntity) entity; @@ -119,31 +121,33 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable return ERenderLayer.TRANSLUCENT; } - private BlockPos findExitPos(ServerWorld world, BlockPos pos, Entity entity) { - if (world == null) return null; + private BlockPos findExitPos(ServerWorld current, ServerWorld target, BlockPos pos, Entity entity) { + if (target == null) return null; - Registry registry = world.getRegistryManager().getDimensionTypes(); - double mult = Objects.requireNonNull(registry.get(DimensionType.THE_END_ID)).getCoordinateScale(); - BlockPos.Mutable basePos; - if (!world.getRegistryKey().equals(World.END)) { - basePos = pos.mutableCopy().set(pos.getX() / mult, pos.getY(), pos.getZ() / mult); - } else { - basePos = pos.mutableCopy().set(pos.getX() * mult, pos.getY(), pos.getZ() * mult); - } + Registry registry = target.getRegistryManager().getDimensionTypes(); + Identifier targetWorldId = target.getRegistryKey().getValue(); + Identifier currentWorldId = current.getRegistryKey().getValue(); + double targetMultiplier = Objects.requireNonNull(registry.get(targetWorldId)).getCoordinateScale(); + double currentMultiplier = Objects.requireNonNull(registry.get(currentWorldId)).getCoordinateScale(); + double multiplier = targetMultiplier > currentMultiplier ? currentMultiplier / targetMultiplier : currentMultiplier; + BlockPos.Mutable basePos = pos.mutableCopy().set(pos.getX() * multiplier, pos.getY(), pos.getZ() * multiplier); + System.out.println(basePos); Direction direction = Direction.EAST; BlockPos.Mutable checkPos = basePos.mutableCopy(); for (int step = 1; step < 128; step++) { for (int i = 0; i < (step >> 1); i++) { - Chunk chunk = world.getChunk(checkPos); + Chunk chunk = target.getChunk(checkPos); if (chunk != null) { - int ceil = chunk.sampleHeightmap(Heightmap.Type.WORLD_SURFACE, checkPos.getX() & 15, checkPos.getZ() & 15); + int surfaceY = chunk.sampleHeightmap(Heightmap.Type.WORLD_SURFACE, checkPos.getX() & 15, checkPos.getZ() & 15); + int motionY = chunk.sampleHeightmap(Heightmap.Type.MOTION_BLOCKING, checkPos.getX() & 15, checkPos.getZ() & 15); + int ceil = Math.max(surfaceY, motionY) + 1; if (ceil > 5) { checkPos.setY(ceil); while (checkPos.getY() > 5) { - BlockState state = world.getBlockState(checkPos); + BlockState state = target.getBlockState(checkPos); if (state.isOf(this)) { Axis axis = state.get(AXIS); - checkPos = this.findCenter(world, checkPos, axis); + checkPos = findCenter(target, checkPos, axis); Direction frontDir = Direction.from(axis, AxisDirection.POSITIVE).rotateYClockwise(); Direction entityDir = entity.getMovementDirection(); @@ -195,15 +199,11 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable @Override public BlockColorProvider getProvider() { - return (state, world, pos, tintIndex) -> { - return EndPortals.getColor(state.get(PORTAL)); - }; + return (state, world, pos, tintIndex) -> EndPortals.getColor(state.get(PORTAL)); } @Override public ItemColorProvider getItemProvider() { - return (stack, tintIndex) -> { - return EndPortals.getColor(0); - }; + return (stack, tintIndex) -> EndPortals.getColor(0); } } diff --git a/src/main/java/ru/betterend/blocks/EternalPedestal.java b/src/main/java/ru/betterend/blocks/EternalPedestal.java index e1a7911e..b06ebfb7 100644 --- a/src/main/java/ru/betterend/blocks/EternalPedestal.java +++ b/src/main/java/ru/betterend/blocks/EternalPedestal.java @@ -34,7 +34,7 @@ public class EternalPedestal extends PedestalBlock { public EternalPedestal() { super(EndBlocks.FLAVOLITE_RUNED_ETERNAL); - this.setDefaultState(this.getDefaultState().with(ACTIVATED, false)); + this.setDefaultState(getDefaultState().with(ACTIVATED, false)); } @Override @@ -50,12 +50,12 @@ public class EternalPedestal extends PedestalBlock { int dim = EndPortals.getPortalState(Registry.ITEM.getId(item)); ritual.removePortal(dim); } - world.setBlockState(pos, updatedState.with(ACTIVATED, false)); + world.setBlockState(pos, updatedState.with(ACTIVATED, false).with(HAS_LIGHT, false)); } else { ItemStack itemStack = pedestal.getStack(0); Identifier id = Registry.ITEM.getId(itemStack.getItem()); if (EndPortals.isAvailableItem(id)) { - world.setBlockState(pos, updatedState.with(ACTIVATED, true)); + world.setBlockState(pos, updatedState.with(ACTIVATED, true).with(HAS_LIGHT, true)); if (pedestal.hasRitual()) { pedestal.getRitual().checkStructure(); } else { diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index c5d0d4df..208b4991 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -86,9 +86,7 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid protected float height = 1.0F; public PedestalBlock(Block parent) { - super(FabricBlockSettings.copyOf(parent).luminance(state -> { - return state.get(HAS_LIGHT) ? 12 : 0; - })); + super(FabricBlockSettings.copyOf(parent).luminance(state -> state.get(HAS_LIGHT) ? 12 : 0)); this.setDefaultState(stateManager.getDefaultState().with(STATE, PedestalState.DEFAULT).with(HAS_ITEM, false).with(HAS_LIGHT, false)); this.parent = parent; } @@ -119,6 +117,7 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid ItemStack itemStack = pedestal.getStack(0); if (player.giveItemStack(itemStack)) { pedestal.removeStack(0); + checkRitual(world, pos); return ActionResult.SUCCESS; } return ActionResult.FAIL; diff --git a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java index a17ca46e..f244e71a 100644 --- a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java @@ -15,7 +15,7 @@ public class EternalPedestalEntity extends PedestalBlockEntity { } public boolean hasRitual() { - return this.linkedRitual != null; + return linkedRitual != null; } public void linkRitual(EternalRitual ritual) { @@ -23,14 +23,14 @@ public class EternalPedestalEntity extends PedestalBlockEntity { } public EternalRitual getRitual() { - return this.linkedRitual; + return linkedRitual; } @Override public void setLocation(World world, BlockPos pos) { super.setLocation(world, pos); if (hasRitual()) { - this.linkedRitual.setWorld(world); + linkedRitual.setWorld(world); } } @@ -38,14 +38,14 @@ public class EternalPedestalEntity extends PedestalBlockEntity { public void fromTag(BlockState state, CompoundTag tag) { super.fromTag(state, tag); if (tag.contains("ritual")) { - this.linkedRitual = new EternalRitual(world); - this.linkedRitual.fromTag(tag.getCompound("ritual")); + linkedRitual = new EternalRitual(world); + linkedRitual.fromTag(tag.getCompound("ritual")); } } @Override public CompoundTag toTag(CompoundTag tag) { - if (this.hasRitual()) { + if (hasRitual()) { tag.put("ritual", linkedRitual.toTag(new CompoundTag())); } return super.toTag(tag); diff --git a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java index ee85a5bc..d8a8251b 100644 --- a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java @@ -19,26 +19,26 @@ public class InfusionPedestalEntity extends PedestalBlockEntity { public void setLocation(World world, BlockPos pos) { super.setLocation(world, pos); if (hasRitual()) { - this.linkedRitual.setLocation(world, pos); + linkedRitual.setLocation(world, pos); } } public void linkRitual(InfusionRitual ritual) { - this.linkedRitual = ritual; + linkedRitual = ritual; } public InfusionRitual getRitual() { - return this.linkedRitual; + return linkedRitual; } public boolean hasRitual() { - return this.linkedRitual != null; + return linkedRitual != null; } @Override public void tick() { if (hasRitual()) { - this.linkedRitual.tick(); + linkedRitual.tick(); } super.tick(); } @@ -52,8 +52,8 @@ public class InfusionPedestalEntity extends PedestalBlockEntity { public void fromTag(BlockState state, CompoundTag tag) { super.fromTag(state, tag); if (tag.contains("ritual")) { - this.linkedRitual = new InfusionRitual(world, pos); - this.linkedRitual.fromTag(tag.getCompound("ritual")); + linkedRitual = new InfusionRitual(world, pos); + linkedRitual.fromTag(tag.getCompound("ritual")); } } diff --git a/src/main/java/ru/betterend/registry/EndPortals.java b/src/main/java/ru/betterend/registry/EndPortals.java index 2ff462af..e6841e88 100644 --- a/src/main/java/ru/betterend/registry/EndPortals.java +++ b/src/main/java/ru/betterend/registry/EndPortals.java @@ -1,11 +1,8 @@ package ru.betterend.registry; -import java.io.File; -import java.util.Iterator; - import com.google.gson.JsonArray; import com.google.gson.JsonObject; - +import com.ibm.icu.impl.UResource; import net.minecraft.server.MinecraftServer; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.Identifier; @@ -14,6 +11,8 @@ import ru.betterend.config.ConfigWriter; import ru.betterend.util.JsonFactory; import ru.betterend.util.MHelper; +import java.io.File; + public class EndPortals { private static PortalInfo[] portals; @@ -23,8 +22,7 @@ public class EndPortals { if (!file.exists()) { file.getParentFile().mkdirs(); json = makeDefault(file); - } - else { + } else { json = JsonFactory.getJsonObject(file); } if (!json.has("portals") || !json.get("portals").isJsonArray()) { @@ -66,8 +64,8 @@ public class EndPortals { } public static boolean isAvailableItem(Identifier item) { - for (int i = 0; i < portals.length; i++) { - if (portals[i].item.equals(item)) { + for (PortalInfo portal : portals) { + if (portal.item.equals(item)) { return true; } } @@ -114,9 +112,7 @@ public class EndPortals { if (world != null) { return world; } - Iterator iterator = server.getWorlds().iterator(); - while (iterator.hasNext()) { - ServerWorld world = iterator.next(); + for (ServerWorld world : server.getWorlds()) { if (world.getRegistryKey().getValue().equals(dimension)) { this.world = world; return world; diff --git a/src/main/java/ru/betterend/rituals/EternalRitual.java b/src/main/java/ru/betterend/rituals/EternalRitual.java index 3d203fc3..18cdb6ef 100644 --- a/src/main/java/ru/betterend/rituals/EternalRitual.java +++ b/src/main/java/ru/betterend/rituals/EternalRitual.java @@ -21,6 +21,7 @@ import net.minecraft.server.world.ServerWorld; import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvents; import net.minecraft.state.property.BooleanProperty; +import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.util.registry.Registry; @@ -97,25 +98,26 @@ public class EternalRitual { moveX = Direction.SOUTH; moveY = Direction.EAST; } - boolean valid = this.checkFrame(); + boolean valid = checkFrame(); Item item = null; for (Point pos : STRUCTURE_MAP) { BlockPos.Mutable checkPos = center.mutableCopy(); checkPos.move(moveX, pos.x).move(moveY, pos.y); - valid &= this.isActive(checkPos); + valid &= isActive(checkPos); if (valid) { EternalPedestalEntity pedestal = (EternalPedestalEntity) world.getBlockEntity(checkPos); - Item pItem = pedestal.getStack(0).getItem(); - if (item == null) { - item = pItem; - } - else if (!item.equals(pItem)) { - valid = false; + if (pedestal != null) { + Item pItem = pedestal.getStack(0).getItem(); + if (item == null) { + item = pItem; + } else if (!item.equals(pItem)) { + valid = false; + } } } } if (valid && item != null) { - this.activatePortal(item); + activatePortal(item); } } @@ -141,18 +143,17 @@ public class EternalRitual { private void activatePortal(Item item) { if (active) return; int state = EndPortals.getPortalState(Registry.ITEM.getId(item)); - this.activatePortal(world, center, state); - this.doEffects((ServerWorld) world, center); + System.out.println(state); + activatePortal(world, center, state); + doEffects((ServerWorld) world, center); if (exit == null) { - this.exit = this.findPortalPos(state); - } - else { - World targetWorld = this.getTargetWorld(state); + this.exit = findPortalPos(state); + } else { + World targetWorld = getTargetWorld(state); if (targetWorld.getBlockState(exit.up()).isOf(EndBlocks.END_PORTAL_BLOCK)) { - this.exit = this.findPortalPos(state); - } - else { - this.activatePortal(targetWorld, exit, state); + this.exit = findPortalPos(state); + } else { + activatePortal(targetWorld, exit, state); } } this.active = true; @@ -216,9 +217,8 @@ public class EternalRitual { public void removePortal(int state) { if (!active || isInvalid()) return; - World targetWorld = this.getTargetWorld(state); - this.removePortal(world, center); - this.removePortal(targetWorld, exit); + removePortal(getTargetWorld(state), exit); + removePortal(world, center); } private void removePortal(World world, BlockPos center) { @@ -252,10 +252,11 @@ public class EternalRitual { private BlockPos findPortalPos(int state) { MinecraftServer server = world.getServer(); assert server != null; - ServerWorld targetWorld = (ServerWorld) this.getTargetWorld(state); + ServerWorld targetWorld = (ServerWorld) getTargetWorld(state); + Identifier targetWorldId = targetWorld.getRegistryKey().getValue(); Registry registry = server.getRegistryManager().getDimensionTypes(); - double mult = Objects.requireNonNull(registry.get(DimensionType.THE_END_ID)).getCoordinateScale(); - BlockPos.Mutable basePos = center.mutableCopy().set(center.getX() / mult, center.getY(), center.getZ() / mult); + double multiplier = Objects.requireNonNull(registry.get(targetWorldId)).getCoordinateScale(); + BlockPos.Mutable basePos = center.mutableCopy().set(center.getX() / multiplier, center.getY(), center.getZ() / multiplier); Direction.Axis portalAxis = (Direction.Axis.X == axis) ? Direction.Axis.Z : Direction.Axis.X; if (checkIsAreaValid(targetWorld, basePos, portalAxis)) { EternalRitual.generatePortal(targetWorld, basePos, portalAxis); @@ -465,9 +466,15 @@ public class EternalRitual { BlockState state = world.getBlockState(pos); if (state.isOf(PEDESTAL)) { EternalPedestalEntity pedestal = (EternalPedestalEntity) world.getBlockEntity(pos); - assert pedestal != null; - if (!pedestal.hasRitual()) { - pedestal.linkRitual(this); + if (pedestal != null) { + if (!pedestal.hasRitual()) { + pedestal.linkRitual(this); + } else { + EternalRitual ritual = pedestal.getRitual(); + if (!ritual.equals(this)) { + pedestal.linkRitual(this); + } + } } return state.get(ACTIVE); } @@ -492,4 +499,14 @@ public class EternalRitual { this.exit = NbtHelper.toBlockPos(tag.getCompound("exit")); } } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + EternalRitual ritual = (EternalRitual) o; + return world.equals(ritual.world) && + Objects.equals(center, ritual.center) && + Objects.equals(exit, ritual.exit); + } } diff --git a/src/main/java/ru/betterend/rituals/InfusionRitual.java b/src/main/java/ru/betterend/rituals/InfusionRitual.java index 849522ae..628b5a92 100644 --- a/src/main/java/ru/betterend/rituals/InfusionRitual.java +++ b/src/main/java/ru/betterend/rituals/InfusionRitual.java @@ -1,8 +1,5 @@ package ru.betterend.rituals; -import java.awt.Point; - -import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.Inventory; @@ -17,6 +14,8 @@ import ru.betterend.blocks.entities.PedestalBlockEntity; import ru.betterend.particle.InfusionParticleType; import ru.betterend.recipe.builders.InfusionRecipe; +import java.awt.*; + public class InfusionRitual implements Inventory { private static final Point[] PEDESTALS_MAP = new Point[] { new Point(0, 3), new Point(2, 2), new Point(3, 0), new Point(2, -2), @@ -32,7 +31,7 @@ public class InfusionRitual implements Inventory { private int time = 0; private InfusionPedestalEntity input; - private PedestalBlockEntity[] catalysts = new PedestalBlockEntity[8]; + private final PedestalBlockEntity[] catalysts = new PedestalBlockEntity[8]; public InfusionRitual(World world, BlockPos pos) { this.world = world; @@ -108,7 +107,6 @@ public class InfusionRitual implements Inventory { if (!checkRecipe()) return; progress++; if (progress == time) { - BlockState inputState = world.getBlockState(input.getPos()); input.removeStack(0); input.setStack(0, activeRecipe.craft(this)); for (PedestalBlockEntity catalyst : catalysts) { @@ -198,7 +196,7 @@ public class InfusionRitual implements Inventory { if (slot == 0) { return input.removeStack(0); } else { - return catalysts[slot - 1].getStack(0); + return catalysts[slot - 1].removeStack(0); } } From e12ec53c01bc2c0834902feb97d97afe6481992e Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sun, 7 Mar 2021 22:50:25 +0300 Subject: [PATCH 308/463] Targeted portals (WIP, bugged) --- src/main/java/ru/betterend/blocks/EndPortalBlock.java | 7 +++---- src/main/java/ru/betterend/rituals/EternalRitual.java | 10 ++++++++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index ffd12fdc..f9bcb5a9 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -87,8 +87,8 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable ServerWorld currentWorld = (ServerWorld) world; MinecraftServer server = currentWorld.getServer(); ServerWorld targetWorld = EndPortals.getWorld(server, state.get(PORTAL)); - boolean isTarget = world.getRegistryKey().equals(targetWorld.getRegistryKey()); - ServerWorld destination = isTarget ? server.getWorld(World.END) : targetWorld; + boolean isInEnd = currentWorld.getRegistryKey().equals(World.END); + ServerWorld destination = isInEnd ? targetWorld : server.getWorld(World.END); BlockPos exitPos = findExitPos(currentWorld, destination, pos, entity); if (exitPos == null) return; if (entity instanceof ServerPlayerEntity) { @@ -129,9 +129,8 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable Identifier currentWorldId = current.getRegistryKey().getValue(); double targetMultiplier = Objects.requireNonNull(registry.get(targetWorldId)).getCoordinateScale(); double currentMultiplier = Objects.requireNonNull(registry.get(currentWorldId)).getCoordinateScale(); - double multiplier = targetMultiplier > currentMultiplier ? currentMultiplier / targetMultiplier : currentMultiplier; + double multiplier = targetMultiplier > currentMultiplier ? 1.0 / targetMultiplier : currentMultiplier; BlockPos.Mutable basePos = pos.mutableCopy().set(pos.getX() * multiplier, pos.getY(), pos.getZ() * multiplier); - System.out.println(basePos); Direction direction = Direction.EAST; BlockPos.Mutable checkPos = basePos.mutableCopy(); for (int step = 1; step < 128; step++) { diff --git a/src/main/java/ru/betterend/rituals/EternalRitual.java b/src/main/java/ru/betterend/rituals/EternalRitual.java index 18cdb6ef..61d06ad6 100644 --- a/src/main/java/ru/betterend/rituals/EternalRitual.java +++ b/src/main/java/ru/betterend/rituals/EternalRitual.java @@ -143,7 +143,6 @@ public class EternalRitual { private void activatePortal(Item item) { if (active) return; int state = EndPortals.getPortalState(Registry.ITEM.getId(item)); - System.out.println(state); activatePortal(world, center, state); doEffects((ServerWorld) world, center); if (exit == null) { @@ -217,12 +216,15 @@ public class EternalRitual { public void removePortal(int state) { if (!active || isInvalid()) return; + System.out.println(getTargetWorld(state).getRegistryKey()); + System.out.println(exit); removePortal(getTargetWorld(state), exit); removePortal(world, center); } private void removePortal(World world, BlockPos center) { BlockPos framePos = center.down(); + System.out.println(framePos); Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH : Direction.EAST; FRAME_MAP.forEach(point -> { BlockPos pos = framePos.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); @@ -258,6 +260,7 @@ public class EternalRitual { double multiplier = Objects.requireNonNull(registry.get(targetWorldId)).getCoordinateScale(); BlockPos.Mutable basePos = center.mutableCopy().set(center.getX() / multiplier, center.getY(), center.getZ() / multiplier); Direction.Axis portalAxis = (Direction.Axis.X == axis) ? Direction.Axis.Z : Direction.Axis.X; + int worldCeil = targetWorld.getDimensionHeight() - 1; if (checkIsAreaValid(targetWorld, basePos, portalAxis)) { EternalRitual.generatePortal(targetWorld, basePos, portalAxis); return basePos.toImmutable(); @@ -269,7 +272,8 @@ public class EternalRitual { Chunk chunk = world.getChunk(checkPos); if (chunk != null) { int ceil = chunk.sampleHeightmap(Heightmap.Type.WORLD_SURFACE, checkPos.getX() & 15, checkPos.getZ() & 15) + 1; - if (ceil < 2) continue; + ceil = Math.min(ceil, worldCeil); + if (ceil < 5) continue; checkPos.setY(ceil); while (checkPos.getY() > 2) { if(checkIsAreaValid(targetWorld, checkPos, portalAxis)) { @@ -303,6 +307,8 @@ public class EternalRitual { } private boolean checkIsAreaValid(World world, BlockPos pos, Direction.Axis axis) { + System.out.println(pos.getY()); + if (pos.getY() >= world.getDimensionHeight() - 1) return false; if (!isBaseValid(world, pos, axis)) return false; return EternalRitual.checkArea(world, pos, axis); } From 48c21395a62a6c4b46688963e0573cbdeb3eaed0 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 8 Mar 2021 15:39:42 +0300 Subject: [PATCH 309/463] Smaragdant crystal shards --- .../ru/betterend/blocks/EndPortalBlock.java | 6 +- .../blocks/SmaragdantCrystalShardBlock.java | 107 ++++++++++++++++++ .../java/ru/betterend/registry/EndBlocks.java | 6 +- .../ru/betterend/registry/EndPortals.java | 6 +- .../ru/betterend/rituals/InfusionRitual.java | 4 +- .../trees/GiganticAmaranitaFeature.java | 2 +- .../blockstates/smaragdant_crystal.json | 5 + .../blockstates/smaragdant_crystal_shard.json | 10 ++ .../block/smaragdant_crystal_shard.json | 3 + .../models/block/amaranita_stem.json | 2 +- .../models/block/smaragdant_crystal.json | 12 ++ .../block/smaragdant_crystal_shard.json | 6 + .../models/item/smaragdant_crystal.json | 3 + .../models/item/smaragdant_crystal_shard.json | 6 + .../block/smaragdant_crystal_shard.png | Bin 0 -> 431 bytes .../block/smaragdant_crystal_side.png | Bin 0 -> 249 bytes .../textures/block/smaragdant_crystal_top.png | Bin 0 -> 259 bytes 17 files changed, 166 insertions(+), 12 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java create mode 100644 src/main/resources/assets/betterend/blockstates/smaragdant_crystal.json create mode 100644 src/main/resources/assets/betterend/blockstates/smaragdant_crystal_shard.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_shard.json create mode 100644 src/main/resources/assets/betterend/models/block/smaragdant_crystal.json create mode 100644 src/main/resources/assets/betterend/models/block/smaragdant_crystal_shard.json create mode 100644 src/main/resources/assets/betterend/models/item/smaragdant_crystal.json create mode 100644 src/main/resources/assets/betterend/models/item/smaragdant_crystal_shard.json create mode 100644 src/main/resources/assets/betterend/textures/block/smaragdant_crystal_shard.png create mode 100644 src/main/resources/assets/betterend/textures/block/smaragdant_crystal_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/smaragdant_crystal_top.png diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index f9bcb5a9..f13b0b0d 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -1,5 +1,8 @@ package ru.betterend.blocks; +import java.util.Objects; +import java.util.Random; + import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -36,9 +39,6 @@ import ru.betterend.interfaces.TeleportingEntity; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndPortals; -import java.util.Objects; -import java.util.Random; - public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable, IColorProvider { public static final IntProperty PORTAL = BlockProperties.PORTAL; diff --git a/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java b/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java new file mode 100644 index 00000000..69b88741 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java @@ -0,0 +1,107 @@ +package ru.betterend.blocks; + +import java.util.EnumMap; + +import com.google.common.collect.Maps; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.FluidFillable; +import net.minecraft.block.Material; +import net.minecraft.block.MaterialColor; +import net.minecraft.block.ShapeContext; +import net.minecraft.block.Waterloggable; +import net.minecraft.fluid.Fluid; +import net.minecraft.fluid.FluidState; +import net.minecraft.fluid.Fluids; +import net.minecraft.item.ItemPlacementContext; +import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.BooleanProperty; +import net.minecraft.state.property.Properties; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.BlockView; +import net.minecraft.world.WorldAccess; +import net.minecraft.world.WorldView; +import ru.betterend.blocks.basis.AttachedBlock; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; + +public class SmaragdantCrystalShardBlock extends AttachedBlock implements IRenderTypeable, Waterloggable, FluidFillable { + private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); + public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; + + public SmaragdantCrystalShardBlock() { + super(FabricBlockSettings.of(Material.STONE) + .materialColor(MaterialColor.GREEN) + .breakByTool(FabricToolTags.PICKAXES) + .sounds(BlockSoundGroup.GLASS) + .luminance(15) + .requiresTool() + .noCollision()); + } + + @Override + protected void appendProperties(StateManager.Builder stateManager) { + super.appendProperties(stateManager); + stateManager.add(WATERLOGGED); + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + public boolean canFillWithFluid(BlockView world, BlockPos pos, BlockState state, Fluid fluid) { + return !state.get(WATERLOGGED); + } + + @Override + public boolean tryFillWithFluid(WorldAccess world, BlockPos pos, BlockState state, FluidState fluidState) { + return !state.get(WATERLOGGED); + } + + @Override + public BlockState getPlacementState(ItemPlacementContext ctx) { + BlockState state = super.getPlacementState(ctx); + if (state != null) { + WorldView worldView = ctx.getWorld(); + BlockPos blockPos = ctx.getBlockPos(); + boolean water = worldView.getFluidState(blockPos).getFluid() == Fluids.WATER; + return state.with(WATERLOGGED, water); + } + return null; + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.get(WATERLOGGED) ? Fluids.WATER.getStill(false) : Fluids.EMPTY.getDefaultState(); + } + + @Override + public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + return BOUNDING_SHAPES.get(state.get(FACING)); + } + + @Override + public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + Direction direction = (Direction) state.get(FACING); + BlockPos blockPos = pos.offset(direction.getOpposite()); + return world.getBlockState(blockPos).isSideSolidFullSquare(world, blockPos, direction); + } + + static { + BOUNDING_SHAPES.put(Direction.UP, VoxelShapes.cuboid(0.125, 0.0, 0.125, 0.875F, 0.875F, 0.875F)); + BOUNDING_SHAPES.put(Direction.DOWN, VoxelShapes.cuboid(0.125, 0.125, 0.125, 0.875F, 1.0, 0.875F)); + BOUNDING_SHAPES.put(Direction.NORTH, VoxelShapes.cuboid(0.125, 0.125, 0.125, 0.875F, 0.875F, 1.0)); + BOUNDING_SHAPES.put(Direction.SOUTH, VoxelShapes.cuboid(0.125, 0.125, 0.0, 0.875F, 0.875F, 0.875F)); + BOUNDING_SHAPES.put(Direction.WEST, VoxelShapes.cuboid(0.125, 0.125, 0.125, 1.0, 0.875F, 0.875F)); + BOUNDING_SHAPES.put(Direction.EAST, VoxelShapes.cuboid(0.0, 0.125, 0.125, 0.875F, 0.875F, 0.875F)); + } +} diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 8fa9b478..7b60dd55 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -46,6 +46,7 @@ import ru.betterend.blocks.EnderBlock; import ru.betterend.blocks.EndstoneDustBlock; import ru.betterend.blocks.EternalPedestal; import ru.betterend.blocks.EternalRunedFlavolite; +import ru.betterend.blocks.GlowingHymenophoreBlock; import ru.betterend.blocks.GlowingMossBlock; import ru.betterend.blocks.GlowingPillarLuminophorBlock; import ru.betterend.blocks.GlowingPillarRootsBlock; @@ -70,7 +71,6 @@ import ru.betterend.blocks.MengerSpongeWetBlock; import ru.betterend.blocks.MissingTileBlock; import ru.betterend.blocks.MossyBoneBlock; import ru.betterend.blocks.MossyGlowshroomCapBlock; -import ru.betterend.blocks.GlowingHymenophoreBlock; import ru.betterend.blocks.MossyGlowshroomSaplingBlock; import ru.betterend.blocks.MossyObsidian; import ru.betterend.blocks.MurkweedBlock; @@ -85,6 +85,7 @@ import ru.betterend.blocks.SilkMothNestBlock; import ru.betterend.blocks.SmallAmaranitaBlock; import ru.betterend.blocks.SmallJellyshroomBlock; import ru.betterend.blocks.SmaragdantCrystalBlock; +import ru.betterend.blocks.SmaragdantCrystalShardBlock; import ru.betterend.blocks.SulphurCrystalBlock; import ru.betterend.blocks.TenaneaFlowersBlock; import ru.betterend.blocks.TenaneaSaplingBlock; @@ -333,7 +334,8 @@ public class EndBlocks { public static final Block ENDER_BLOCK = registerBlock("ender_block", new EnderBlock()); public static final Block AURORA_CRYSTAL = registerBlock("aurora_crystal", new AuroraCrystalBlock()); public static final Block AMBER_BLOCK = registerBlock("amber_block", new AmberBlock()); - public static final Block SMARAGDANT_CRYSTAL = registerBlock("smaragdant_crystal", new SmaragdantCrystalBlock()); + public static final Block SMARAGDANT_CRYSTAL = registerBlock("smaragdant_crystal", new SmaragdantCrystalBlock()); + public static final Block SMARAGDANT_CRYSTAL_SHARD = registerBlock("smaragdant_crystal_shard", new SmaragdantCrystalShardBlock()); public static final Block RESPAWN_OBELISK = registerBlock("respawn_obelisk", new RespawnObeliskBlock()); diff --git a/src/main/java/ru/betterend/registry/EndPortals.java b/src/main/java/ru/betterend/registry/EndPortals.java index e6841e88..83ee1472 100644 --- a/src/main/java/ru/betterend/registry/EndPortals.java +++ b/src/main/java/ru/betterend/registry/EndPortals.java @@ -1,8 +1,10 @@ package ru.betterend.registry; +import java.io.File; + import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import com.ibm.icu.impl.UResource; + import net.minecraft.server.MinecraftServer; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.Identifier; @@ -11,8 +13,6 @@ import ru.betterend.config.ConfigWriter; import ru.betterend.util.JsonFactory; import ru.betterend.util.MHelper; -import java.io.File; - public class EndPortals { private static PortalInfo[] portals; diff --git a/src/main/java/ru/betterend/rituals/InfusionRitual.java b/src/main/java/ru/betterend/rituals/InfusionRitual.java index 628b5a92..0ac50e97 100644 --- a/src/main/java/ru/betterend/rituals/InfusionRitual.java +++ b/src/main/java/ru/betterend/rituals/InfusionRitual.java @@ -1,5 +1,7 @@ package ru.betterend.rituals; +import java.awt.Point; + import net.minecraft.block.entity.BlockEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.Inventory; @@ -14,8 +16,6 @@ import ru.betterend.blocks.entities.PedestalBlockEntity; import ru.betterend.particle.InfusionParticleType; import ru.betterend.recipe.builders.InfusionRecipe; -import java.awt.*; - public class InfusionRitual implements Inventory { private static final Point[] PEDESTALS_MAP = new Point[] { new Point(0, 3), new Point(2, 2), new Point(3, 0), new Point(2, -2), diff --git a/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java b/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java index f91d2d0d..01ffa490 100644 --- a/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java @@ -8,11 +8,11 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Material; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockPos.Mutable; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction.Axis; import net.minecraft.util.math.Direction.AxisDirection; import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.BlockPos.Mutable; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; diff --git a/src/main/resources/assets/betterend/blockstates/smaragdant_crystal.json b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal.json new file mode 100644 index 00000000..90802113 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal.json @@ -0,0 +1,5 @@ +{ + "variants": { + "": { "model": "betterend:block/smaragdant_crystal" } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_shard.json b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_shard.json new file mode 100644 index 00000000..a029b55e --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_shard.json @@ -0,0 +1,10 @@ +{ + "variants": { + "facing=up": { "model": "betterend:block/smaragdant_crystal_shard" }, + "facing=down": { "model": "betterend:block/smaragdant_crystal_shard", "x": 180 }, + "facing=north": { "model": "betterend:block/smaragdant_crystal_shard", "x": 90 }, + "facing=south": { "model": "betterend:block/smaragdant_crystal_shard", "x": 90, "y": 180 }, + "facing=east": { "model": "betterend:block/smaragdant_crystal_shard", "x": 90, "y": 90 }, + "facing=west": { "model": "betterend:block/smaragdant_crystal_shard", "x": 90, "y": 270 } + } +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_shard.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_shard.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_shard.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/models/block/amaranita_stem.json b/src/main/resources/assets/betterend/models/block/amaranita_stem.json index f4b0c637..ddef4114 100644 --- a/src/main/resources/assets/betterend/models/block/amaranita_stem.json +++ b/src/main/resources/assets/betterend/models/block/amaranita_stem.json @@ -4,7 +4,7 @@ "down": "betterend:block/amaranita_hyphae_top", "east": "betterend:block/amaranita_hyphae_side", "north": "betterend:block/amaranita_hyphae_side", - "particle": "betterend:block/mossy_bone_side_ver", + "particle": "betterend:block/amaranita_hyphae_side", "south": "betterend:block/amaranita_hyphae_side", "up": "betterend:block/amaranita_hyphae_top", "west": "betterend:block/amaranita_hyphae_side" diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_crystal.json b/src/main/resources/assets/betterend/models/block/smaragdant_crystal.json new file mode 100644 index 00000000..8e5c23a0 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_crystal.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "betterend:block/smaragdant_crystal_top", + "east": "betterend:block/smaragdant_crystal_side", + "north": "betterend:block/smaragdant_crystal_side", + "particle": "betterend:block/smaragdant_crystal_side", + "south": "betterend:block/smaragdant_crystal_side", + "up": "betterend:block/smaragdant_crystal_top", + "west": "betterend:block/smaragdant_crystal_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_crystal_shard.json b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_shard.json new file mode 100644 index 00000000..ed5c42d9 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_shard.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/smaragdant_crystal_shard" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/smaragdant_crystal.json b/src/main/resources/assets/betterend/models/item/smaragdant_crystal.json new file mode 100644 index 00000000..b8e5fa55 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/smaragdant_crystal.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/smaragdant_crystal" +} diff --git a/src/main/resources/assets/betterend/models/item/smaragdant_crystal_shard.json b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_shard.json new file mode 100644 index 00000000..e8dbb27e --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_shard.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/smaragdant_crystal_shard" + } +} diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_shard.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_shard.png new file mode 100644 index 0000000000000000000000000000000000000000..8e0b0c4e30a742bfb85a71e2a61723e338f3c9ec GIT binary patch literal 431 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc4KAK8jv*HQ$$$R;w`W#u;Pjfz%dxA$P>+Az zga3;>djiyC9+)z$xf#iHsPboT$A} z9=NxfhbNOufX9f3*C4k3N9)73+Dr8UY#S39-qgt2EqEKC|135sA)<`+kQ!6K zLhFJRO-uJ_$aehy$gqPkA-sW!Q@r6O-zEl4tH4+WCWY{ZMIm#zAH{!p;mj$|#>TMt XY-OtISLrFhKxXiC^>bP0l+XkKtqz_P literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_side.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_side.png new file mode 100644 index 0000000000000000000000000000000000000000..6ee675aa88693e7f049f557b47dc1c0a69e962fc GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~i2$DvS0K&c zlg1F6%TQFs&{@r}pq1gwGKTlFbtPlA1En}hg8YIR{zJgkQz1q`v1(5j#}J9BzUKq^ z8Vq=tE^KwE{x9uqo$T}N@nyz&Dw~vogglRUs-~%SdoP6tj&o7=ON&nBVv|j$j;69hd Date: Mon, 8 Mar 2021 17:08:59 +0300 Subject: [PATCH 310/463] Smaragdant crystal as a pillar, crystall mos retexture --- .../blocks/SmaragdantCrystalBlock.java | 4 ++-- .../blockstates/smaragdant_crystal.json | 6 ++++-- .../textures/block/crystal_moss_side.png | Bin 549 -> 274 bytes .../textures/block/crystal_moss_top.png | Bin 559 -> 240 bytes 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/SmaragdantCrystalBlock.java b/src/main/java/ru/betterend/blocks/SmaragdantCrystalBlock.java index 5d090bea..8b5fa12e 100644 --- a/src/main/java/ru/betterend/blocks/SmaragdantCrystalBlock.java +++ b/src/main/java/ru/betterend/blocks/SmaragdantCrystalBlock.java @@ -4,9 +4,9 @@ import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.block.Material; import net.minecraft.sound.BlockSoundGroup; -import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.EndPillarBlock; -public class SmaragdantCrystalBlock extends BlockBase { +public class SmaragdantCrystalBlock extends EndPillarBlock { public SmaragdantCrystalBlock() { super(FabricBlockSettings.of(Material.GLASS) .breakByTool(FabricToolTags.PICKAXES) diff --git a/src/main/resources/assets/betterend/blockstates/smaragdant_crystal.json b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal.json index 90802113..2d3e15ba 100644 --- a/src/main/resources/assets/betterend/blockstates/smaragdant_crystal.json +++ b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal.json @@ -1,5 +1,7 @@ { "variants": { - "": { "model": "betterend:block/smaragdant_crystal" } + "axis=x": { "model": "betterend:block/smaragdant_crystal", "x": 90, "y": 90 }, + "axis=y": { "model": "betterend:block/smaragdant_crystal" }, + "axis=z": { "model": "betterend:block/smaragdant_crystal", "x": 90 } } -} +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/crystal_moss_side.png b/src/main/resources/assets/betterend/textures/block/crystal_moss_side.png index 38821abf594960cf4111534afb93fdd380f3e5f5..566678aec4722a7029466f567effe83ba9d7f212 100644 GIT binary patch delta 257 zcmV+c0sj7_1d;-f8Gi!+001a04^sdD00DDSM?wIu&K&6g001gbOjJe1zKhMqi`Ckc z-sYt4_O$l;y&!3ODRqM>eTy-ToH?1SL8Y`>zRi2i-s&w6>i_@%mPtfGR2Y>Nj!6Op zF$e<9G9sA%|91y38Vv=8N-TC2z$$f!YN42=BLO+00000NkvXX Hu0mjf1=et; delta 535 zcmV+y0_gpc0;L3y8Gix*005AYXf^-<0qjXcK~#9!O_EDXLQxcj&o2pzkjgTP-lQd| z5cLzHK?D^Qgo>h6B!!}qlqe=CDXH|JhiDA~YgDsv)TE$c!-fqS_1(5ua5#6Leb!lf z?X|BOiRHW3cgIp^!_ln48}8ZKw-;`^ykUbc(&-9xx`Vy`n1692%F&c4+VeMx2eS_~ zZ|!Y7eL>2WE3^0QBy=n5ZL1r^tqbmSw8*2l%~WJ5+-DHxr5Y!0@l7jvcusA23V0D-pfs0ROw+boNh3&S{FTV zbITe}Uy^BG+kaBM+wswO0VYk)(X};K7ACqhCr_rY9)9Z|fT0<>SM6(lirS7V1EE6* zP~S4=Ac;lNv{*u(mo4+odJp)366%8EJ(=b?hu#%vSfX3@iPwKFQ5PE8#V!P(-jqBM zI%LxZQ!?TbqmiOmgaECd-yUrF8%6|(XPALnQ@nr#)qgazq>&|x+O;pzaEas4?h*Us z=^aim4fDaN*0lCt9G=rCiw80Xpcsu4)Yq0Pzyt-Lu#)KUKEfhkKqy9rP#8D&up8-u zVOJ8pf8;;EDv}!6KmJcaO*slcNyPg4uD-m+1;kDaOXEl^w~Ej6Q@sMQWCbnp|N0<* Z0K5Kx=MXjh27mwn002ovPDHLkV1oH^`Qrcp diff --git a/src/main/resources/assets/betterend/textures/block/crystal_moss_top.png b/src/main/resources/assets/betterend/textures/block/crystal_moss_top.png index a3defda5835b9bf322c74a972044a6f5ad2d14c8..fe47be27b08bfa81c43035d1473e2f9b88fcfe06 100644 GIT binary patch delta 223 zcmV<503iRb1n>cn8Gi!+001a04^sdD00DDSM?wIu&K&6g000Ft|Hv52I?vXUcq3wqF5R9c;7#wqdXO5L87T# zovxtF7TVY+at?bt8M7*FNobaxVtpht6BS_pa3rLT3M>a;HoWEeJ2A1Y&Trv%7Vz!g Z%m=KF0}`kqiwyt(002ovPDHLkV1l*ORaO81 delta 545 zcmV++0^a@b0j~s*8Gix*005AYXf^-<0rp8mK~#9!O_FU&LO~RUXC+ZmQCX=`mXVc| zLevt%9}<*Q5Gsa};U!U26ul@aDJiLBp%s1n2*M?_fHu=JPFOJL%(-XYuQOs*Z<;PL z8wPYinh&RE1M%5lVnNf*kt|1hvF&QU34boQ`(L52@6BqLlC$x` z?_#Vtd2%sz8euj?$P0TPR*Z`Ge2wMU~r1_>9o>(B68lNB0hqghbp zZz)lcO3srC2^n+21Ux{1x)?9b_%zyR7F2Dy#%}i$56h|Q5Q#N@bPhIOS)0`!mFcsn zShy;z6m{|1TnJjm0-oT{2WdXQ-9*PlDXk`r}IG)Ok=&=k*4Ll zxPAbb&sP^mls zGvN)5x=&a0xAdtaW)vq_=v+?M#Q)$VUNjE`x>1D&LL0gwL-{mRaJ&of@WY-c&>*Lw j>1dOWavG2uK>_gtRE=S$)=BG800000NkvXXu0mjfqWSdq From 231794363be95abc432f40639431a12826cd3865 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 9 Mar 2021 02:40:26 +0300 Subject: [PATCH 311/463] Removed old End Caves (temporary), added new Caves and Cave API (WIP) --- .../ru/betterend/interfaces/IBiomeArray.java | 8 ++ .../mixin/common/BiomeArrayMixin.java | 46 ++++++ .../java/ru/betterend/registry/EndBiomes.java | 51 +++++-- .../ru/betterend/registry/EndFeatures.java | 11 +- .../world/biome/BiomeDefinition.java | 10 +- .../world/biome/EmptyEndCaveBiome.java | 18 +++ .../ru/betterend/world/biome/EndBiome.java | 3 +- .../betterend/world/biome/EndCaveBiome.java | 33 +++++ .../features/terrain/RoundCaveFeature.java | 1 + .../terrain/caves/EndCaveFeature.java | 134 ++++++++++++++++++ .../terrain/caves/RoundCaveFeature.java | 85 +++++++++++ .../world/generator/BetterEndBiomeSource.java | 3 +- .../world/generator/BiomePicker.java | 8 +- .../resources/betterend.mixins.common.json | 1 + 14 files changed, 384 insertions(+), 28 deletions(-) create mode 100644 src/main/java/ru/betterend/interfaces/IBiomeArray.java create mode 100644 src/main/java/ru/betterend/mixin/common/BiomeArrayMixin.java create mode 100644 src/main/java/ru/betterend/world/biome/EmptyEndCaveBiome.java create mode 100644 src/main/java/ru/betterend/world/biome/EndCaveBiome.java create mode 100644 src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java create mode 100644 src/main/java/ru/betterend/world/features/terrain/caves/RoundCaveFeature.java diff --git a/src/main/java/ru/betterend/interfaces/IBiomeArray.java b/src/main/java/ru/betterend/interfaces/IBiomeArray.java new file mode 100644 index 00000000..8916cd5c --- /dev/null +++ b/src/main/java/ru/betterend/interfaces/IBiomeArray.java @@ -0,0 +1,8 @@ +package ru.betterend.interfaces; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.biome.Biome; + +public interface IBiomeArray { + public void setBiome(Biome biome, BlockPos pos); +} diff --git a/src/main/java/ru/betterend/mixin/common/BiomeArrayMixin.java b/src/main/java/ru/betterend/mixin/common/BiomeArrayMixin.java new file mode 100644 index 00000000..deb834e7 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/BiomeArrayMixin.java @@ -0,0 +1,46 @@ +package ru.betterend.mixin.common; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.source.BiomeArray; +import ru.betterend.interfaces.IBiomeArray; + +@Mixin(BiomeArray.class) +public class BiomeArrayMixin implements IBiomeArray { + @Final + @Shadow + private Biome[] data; + + @Final + @Shadow + private static int HORIZONTAL_SECTION_COUNT; + + @Final + @Shadow + public static int HORIZONTAL_BIT_MASK; + + @Final + @Shadow + public static int VERTICAL_BIT_MASK; + + @Override + public void setBiome(Biome biome, BlockPos pos) { + int biomeX = pos.getX() >> 2; + int biomeY = pos.getY() >> 2; + int biomeZ = pos.getZ() >> 2; + int index = be_getArrayIndex(biomeX, biomeY, biomeZ); + data[index] = biome; + } + + private int be_getArrayIndex(int biomeX, int biomeY, int biomeZ) { + int i = biomeX & HORIZONTAL_BIT_MASK; + int j = MathHelper.clamp(biomeY, 0, VERTICAL_BIT_MASK); + int k = biomeZ & HORIZONTAL_BIT_MASK; + return j << HORIZONTAL_SECTION_COUNT + HORIZONTAL_SECTION_COUNT | k << HORIZONTAL_SECTION_COUNT | i; + } +} diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index a21fbd92..f961837a 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -4,6 +4,7 @@ import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Random; import java.util.Set; import com.google.common.collect.Lists; @@ -45,7 +46,9 @@ import ru.betterend.world.biome.BiomeSulphurSprings; import ru.betterend.world.biome.BiomeUmbrellaJungle; import ru.betterend.world.biome.DragonGraveyardsBiome; import ru.betterend.world.biome.DryShrublandBiome; +import ru.betterend.world.biome.EmptyEndCaveBiome; import ru.betterend.world.biome.EndBiome; +import ru.betterend.world.biome.EndCaveBiome; import ru.betterend.world.biome.GlowingGrasslandsBiome; import ru.betterend.world.generator.BELayerRandomSource; import ru.betterend.world.generator.BiomePicker; @@ -59,6 +62,7 @@ public class EndBiomes { public static final BiomePicker LAND_BIOMES = new BiomePicker(); public static final BiomePicker VOID_BIOMES = new BiomePicker(); + public static final BiomePicker CAVE_BIOMES = new BiomePicker(); public static final List SUBBIOMES = Lists.newArrayList(); private static final JsonObject EMPTY_JSON = new JsonObject(); @@ -93,6 +97,9 @@ public class EndBiomes { // Better End Void public static final EndBiome ICE_STARFIELD = registerBiome(new BiomeIceStarfield(), BiomeType.VOID); + // Better End Caves + public static final EndCaveBiome EMPTY_CAVE = registerCaveBiome(new EmptyEndCaveBiome()); + public static void register() {} public static void mutateRegistry(Registry biomeRegistry) { @@ -100,6 +107,7 @@ public class EndBiomes { LAND_BIOMES.clearMutables(); VOID_BIOMES.clearMutables(); + CAVE_BIOMES.clearMutables(); if (FABRIC_VOID.isEmpty()) { loadFabricAPIBiomes(); @@ -144,16 +152,9 @@ public class EndBiomes { Integrations.addBiomes(); Configs.BIOME_CONFIG.saveChanges(); - LAND_BIOMES.rebuild(); - VOID_BIOMES.rebuild(); - - LAND_BIOMES.getBiomes().forEach((endBiome) -> { - endBiome.updateActualBiomes(biomeRegistry); - }); - - VOID_BIOMES.getBiomes().forEach((endBiome) -> { - endBiome.updateActualBiomes(biomeRegistry); - }); + rebuildPicker(LAND_BIOMES, biomeRegistry); + rebuildPicker(VOID_BIOMES, biomeRegistry); + rebuildPicker(CAVE_BIOMES, biomeRegistry); SUBBIOMES.forEach((endBiome) -> { endBiome.updateActualBiomes(biomeRegistry); @@ -162,6 +163,13 @@ public class EndBiomes { CLIENT.clear(); } + private static void rebuildPicker(BiomePicker picker, Registry biomeRegistry) { + picker.rebuild(); + picker.getBiomes().forEach((endBiome) -> { + endBiome.updateActualBiomes(biomeRegistry); + }); + } + private static void loadFabricAPIBiomes() { WeightedBiomePicker picker = InternalBiomeData.getEndBiomesMap().get(BiomeKeys.SMALL_END_ISLANDS); LayerRandomnessSource random = new BELayerRandomSource(); @@ -343,10 +351,12 @@ public class EndBiomes { } private static void addToPicker(EndBiome biome, BiomeType type) { - if (type == BiomeType.LAND) + if (type == BiomeType.LAND) { LAND_BIOMES.addBiome(biome); - else + } + else { VOID_BIOMES.addBiome(biome); + } } private static void registerBiomeDirectly(EndBiome biome) { @@ -400,4 +410,21 @@ public class EndBiomes { result.addAll(SUBBIOMES); return result; } + + public static EndCaveBiome registerCaveBiome(EndCaveBiome biome) { + registerBiomeDirectly(biome); + if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { + CAVE_BIOMES.addBiome(biome); + ID_MAP.put(biome.getID(), biome); + } + return biome; + } + + public static EndCaveBiome getCaveBiome(Random random) { + return (EndCaveBiome) CAVE_BIOMES.getBiome(random); + } + + public static boolean hasBiome(Identifier biomeID) { + return ID_MAP.containsKey(biomeID); + } } diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index c0f693f2..060799e6 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -13,7 +13,6 @@ import ru.betterend.BetterEnd; import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; import ru.betterend.world.features.BlueVineFeature; -import ru.betterend.world.features.CavePlantFeature; import ru.betterend.world.features.CharniaFeature; import ru.betterend.world.features.CrashedShipFeature; import ru.betterend.world.features.DoublePlantFeature; @@ -44,12 +43,12 @@ import ru.betterend.world.features.terrain.GeyserFeature; import ru.betterend.world.features.terrain.IceStarFeature; import ru.betterend.world.features.terrain.ObsidianBoulderFeature; import ru.betterend.world.features.terrain.ObsidianPillarBasementFeature; -import ru.betterend.world.features.terrain.RoundCaveFeature; import ru.betterend.world.features.terrain.SpireFeature; import ru.betterend.world.features.terrain.SulphurHillFeature; import ru.betterend.world.features.terrain.SulphuricCaveFeature; import ru.betterend.world.features.terrain.SulphuricLakeFeature; import ru.betterend.world.features.terrain.SurfaceVentFeature; +import ru.betterend.world.features.terrain.caves.RoundCaveFeature; import ru.betterend.world.features.trees.DragonTreeFeature; import ru.betterend.world.features.trees.GiganticAmaranitaFeature; import ru.betterend.world.features.trees.HelixTreeFeature; @@ -85,7 +84,6 @@ public class EndFeatures { public static final EndFeature CREEPING_MOSS = new EndFeature("creeping_moss", new SinglePlantFeature(EndBlocks.CREEPING_MOSS, 5), 5); public static final EndFeature BLUE_VINE = new EndFeature("blue_vine", new BlueVineFeature(), 1); public static final EndFeature CHORUS_GRASS = new EndFeature("chorus_grass", new SinglePlantFeature(EndBlocks.CHORUS_GRASS, 4), 5); - public static final EndFeature CAVE_GRASS = new EndFeature("cave_grass", new CavePlantFeature(EndBlocks.CAVE_GRASS, 7), 7); public static final EndFeature CRYSTAL_GRASS = new EndFeature("crystal_grass", new SinglePlantFeature(EndBlocks.CRYSTAL_GRASS, 8, false), 5); public static final EndFeature SHADOW_PLANT = new EndFeature("shadow_plant", new SinglePlantFeature(EndBlocks.SHADOW_PLANT, 6), 9); public static final EndFeature MURKWEED = new EndFeature("murkweed", new SinglePlantFeature(EndBlocks.MURKWEED, 3), 2); @@ -161,7 +159,6 @@ public class EndFeatures { public static final EndFeature END_LAKE = EndFeature.makeLakeFeature("end_lake", new EndLakeFeature(), 4); public static final EndFeature END_LAKE_RARE = EndFeature.makeLakeFeature("end_lake_rare", new EndLakeFeature(), 40); public static final EndFeature ROUND_CAVE = EndFeature.makeRawGenFeature("round_cave", new RoundCaveFeature(), 2); - public static final EndFeature ROUND_CAVE_RARE = EndFeature.makeRawGenFeature("round_cave_rare", new RoundCaveFeature(), 25); public static final EndFeature SPIRE = EndFeature.makeRawGenFeature("spire", new SpireFeature(), 2); public static final EndFeature FLOATING_SPIRE = EndFeature.makeRawGenFeature("floating_spire", new FloatingSpireFeature(), 8); public static final EndFeature GEYSER = EndFeature.makeRawGenFeature("geyser", new GeyserFeature(), 8); @@ -215,8 +212,7 @@ public class EndFeatures { addFeature(CRASHED_SHIP, features); if (EndBiomes.getBiome(id).hasCaves()) { - addFeature(ROUND_CAVE_RARE, features); - addFeature(CAVE_GRASS, features); + addFeature(ROUND_CAVE, features); } EndBiome endBiome = EndBiomes.getBiome(id); @@ -233,8 +229,7 @@ public class EndFeatures { def.addFeature(CRASHED_SHIP); if (def.hasCaves()) { - def.addFeature(ROUND_CAVE_RARE); - def.addFeature(CAVE_GRASS); + def.addFeature(ROUND_CAVE); } } diff --git a/src/main/java/ru/betterend/world/biome/BiomeDefinition.java b/src/main/java/ru/betterend/world/biome/BiomeDefinition.java index a9547b37..a3ce12fa 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeDefinition.java +++ b/src/main/java/ru/betterend/world/biome/BiomeDefinition.java @@ -67,13 +67,19 @@ public class BiomeDefinition { private final Identifier id; private float genChance = 1F; private boolean hasCaves = true; + private boolean isCaveBiome = false; private ConfiguredSurfaceBuilder surface; public BiomeDefinition(String name) { this.id = BetterEnd.makeID(name); } - + + public BiomeDefinition setCaveBiome() { + isCaveBiome = true; + return this; + } + public BiomeDefinition setSurface(Block block) { setSurface(SurfaceBuilder.DEFAULT.withConfig(new TernarySurfaceConfig( block.getDefaultState(), @@ -249,7 +255,7 @@ public class BiomeDefinition { return new Biome.Builder() .precipitation(Precipitation.NONE) - .category(Category.THEEND) + .category(isCaveBiome ? Category.NONE : Category.THEEND) .depth(0.1F) .scale(0.2F) .temperature(2.0F) diff --git a/src/main/java/ru/betterend/world/biome/EmptyEndCaveBiome.java b/src/main/java/ru/betterend/world/biome/EmptyEndCaveBiome.java new file mode 100644 index 00000000..6ebe900a --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/EmptyEndCaveBiome.java @@ -0,0 +1,18 @@ +package ru.betterend.world.biome; + +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndParticles; +import ru.betterend.registry.EndSounds; + +public class EmptyEndCaveBiome extends EndCaveBiome { + public EmptyEndCaveBiome() { + super(new BiomeDefinition("empty_end_cave") + .setFogColor(255, 184, 71) + .setFogDensity(2.0F) + .setPlantsColor(219, 115, 38) + .setWaterAndFogColor(145, 108, 72) + .setMusic(EndSounds.MUSIC_FOREST) + .setParticles(EndParticles.AMBER_SPHERE, 0.001F) + .setSurface(EndBlocks.AMBER_MOSS)); + } +} diff --git a/src/main/java/ru/betterend/world/biome/EndBiome.java b/src/main/java/ru/betterend/world/biome/EndBiome.java index 8c57c4e8..478bc398 100644 --- a/src/main/java/ru/betterend/world/biome/EndBiome.java +++ b/src/main/java/ru/betterend/world/biome/EndBiome.java @@ -190,8 +190,7 @@ public class EndBiome { if (edge != null) { edge.updateActualBiomes(biomeRegistry); } - Biome biome = biomeRegistry.get(mcID); - this.actualBiome = biome; + this.actualBiome = biomeRegistry.get(mcID); } @Override diff --git a/src/main/java/ru/betterend/world/biome/EndCaveBiome.java b/src/main/java/ru/betterend/world/biome/EndCaveBiome.java new file mode 100644 index 00000000..769398bd --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/EndCaveBiome.java @@ -0,0 +1,33 @@ +package ru.betterend.world.biome; + +import java.util.List; +import java.util.Random; + +import com.google.common.collect.Lists; + +import net.minecraft.world.gen.feature.Feature; + +public class EndCaveBiome extends EndBiome { + private List> floorFeatures = Lists.newArrayList(); + private List> ceilFeatures = Lists.newArrayList(); + + public EndCaveBiome(BiomeDefinition definition) { + super(definition.setCaveBiome()); + } + + public void addFloorFeature(Feature feature) { + floorFeatures.add(feature); + } + + public void addCeilFeature(Feature feature) { + ceilFeatures.add(feature); + } + + public Feature getFloorFeature(Random random) { + return floorFeatures.isEmpty() ? null : floorFeatures.get(random.nextInt(floorFeatures.size())); + } + + public Feature getCeilFeature(Random random) { + return ceilFeatures.isEmpty() ? null : ceilFeatures.get(random.nextInt(ceilFeatures.size())); + } +} diff --git a/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java index 6c2d53a3..0416f267 100644 --- a/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java @@ -32,6 +32,7 @@ import ru.betterend.util.sdf.primitive.SDFSphere; import ru.betterend.world.features.DefaultFeature; import ru.betterend.world.generator.GeneratorOptions; +@Deprecated public class RoundCaveFeature extends DefaultFeature { private static final BlockState CAVE_AIR = Blocks.CAVE_AIR.getDefaultState(); 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 new file mode 100644 index 00000000..a8d59265 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java @@ -0,0 +1,134 @@ +package ru.betterend.world.features.terrain.caves; + +import java.util.Random; +import java.util.Set; + +import com.google.common.collect.Sets; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.world.Heightmap; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.interfaces.IBiomeArray; +import ru.betterend.registry.EndBiomes; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; +import ru.betterend.world.biome.EndCaveBiome; +import ru.betterend.world.features.DefaultFeature; +import ru.betterend.world.generator.GeneratorOptions; + +public abstract class EndCaveFeature extends DefaultFeature { + protected static final BlockState CAVE_AIR = Blocks.CAVE_AIR.getDefaultState(); + protected static final BlockState END_STONE = Blocks.END_STONE.getDefaultState(); + protected static final BlockState WATER = Blocks.WATER.getDefaultState(); + + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + if (!(GeneratorOptions.useNewGenerator() && GeneratorOptions.noRingVoid()) || pos.getX() * pos.getX() + pos.getZ() * pos.getZ() <= 22500) { + return false; + } + + int radius = MHelper.randRange(10, 30, random); + BlockPos center = findPos(world, pos, radius, random); + + if (center == null) { + return false; + } + + EndCaveBiome biome = EndBiomes.getCaveBiome(random); + Set caveBlocks = generate(world, center, radius, random); + if (biome != null && !caveBlocks.isEmpty()) { + setBiomes(world, biome, caveBlocks); + Set floorPositions = Sets.newHashSet(); + Set ceilPositions = Sets.newHashSet(); + Mutable mut = new Mutable(); + caveBlocks.forEach((bpos) -> { + mut.set(bpos); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + mut.setY(bpos.getY() - 1); + if (world.getBlockState(mut).isIn(EndTags.GEN_TERRAIN)) { + floorPositions.add(mut.toImmutable()); + } + mut.setY(bpos.getY() + 1); + if (world.getBlockState(mut).isIn(EndTags.GEN_TERRAIN)) { + ceilPositions.add(mut.toImmutable()); + } + } + }); + BlockState surfaceBlock = biome.getBiome().getGenerationSettings().getSurfaceConfig().getTopMaterial(); + placeFloor(world, biome, floorPositions, random, surfaceBlock); + placeCeil(world, biome, ceilPositions, random); + } + fixBlocks(world, center, radius); + + return true; + } + + protected abstract Set generate(StructureWorldAccess world, BlockPos center, int radius, Random random); + + protected void placeFloor(StructureWorldAccess world, EndCaveBiome biome, Set floorPositions, Random random, BlockState surfaceBlock) { + floorPositions.forEach((pos) -> { + BlocksHelper.setWithoutUpdate(world, pos, surfaceBlock); + }); + } + + protected void placeCeil(StructureWorldAccess world, EndCaveBiome biome, Set ceilPositions, Random random) { + + } + + protected void setBiomes(StructureWorldAccess world, EndCaveBiome biome, Set blocks) { + blocks.forEach((pos) -> setBiome(world, pos, biome)); + } + + private void setBiome(StructureWorldAccess world, BlockPos pos, EndCaveBiome biome) { + IBiomeArray array = (IBiomeArray) world.getChunk(pos).getBiomeArray(); + if (array != null) { + array.setBiome(biome.getActualBiome(), pos); + } + } + + private BlockPos findPos(StructureWorldAccess world, BlockPos pos, int radius, Random random) { + int top = world.getTopY(Heightmap.Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); + Mutable bpos = new Mutable(); + bpos.setX(pos.getX()); + bpos.setZ(pos.getZ()); + bpos.setY(top - 1); + + BlockState state = world.getBlockState(bpos); + while (!state.isIn(EndTags.GEN_TERRAIN) && bpos.getY() > 5) { + bpos.setY(bpos.getY() - 1); + state = world.getBlockState(bpos); + } + if (bpos.getY() < 10) { + return null; + } + top = (int) (bpos.getY() - (radius * 1.3F + 5)); + + while (state.isIn(EndTags.GEN_TERRAIN) || !state.getFluidState().isEmpty() && bpos.getY() > 5) { + bpos.setY(bpos.getY() - 1); + state = world.getBlockState(bpos); + } + int bottom = (int) (bpos.getY() + radius * 1.3F + 5); + + if (top <= bottom) { + return null; + } + + return new BlockPos(pos.getX(), MHelper.randRange(bottom, top, random), pos.getZ()); + } + + private void fixBlocks(StructureWorldAccess world, BlockPos pos, int radius) { + int x1 = pos.getX() - radius - 5; + int y1 = pos.getY() - radius - 5; + int z1 = pos.getZ() - radius - 5; + int x2 = pos.getX() + radius + 5; + int y2 = pos.getY() + radius + 5; + int z2 = pos.getZ() + radius + 5; + BlocksHelper.fixBlocks(world, new BlockPos(x1, y1, z1), new BlockPos(x2, y2, z2)); + } +} 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 new file mode 100644 index 00000000..5f32e5e4 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/caves/RoundCaveFeature.java @@ -0,0 +1,85 @@ +package ru.betterend.world.features.terrain.caves; + +import java.util.Random; +import java.util.Set; + +import com.google.common.collect.Sets; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Material; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.world.StructureWorldAccess; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; + +public class RoundCaveFeature extends EndCaveFeature { + @Override + protected Set generate(StructureWorldAccess world, BlockPos center, int radius, Random random) { + OpenSimplexNoise noise = new OpenSimplexNoise(MHelper.getSeed(534, center.getX(), center.getZ())); + + int x1 = center.getX() - radius - 5; + int z1 = center.getZ() - radius - 5; + int x2 = center.getX() + radius + 5; + int z2 = center.getZ() + radius + 5; + int y1 = MHelper.floor(center.getY() - (radius + 5) / 1.6); + int y2 = MHelper.floor(center.getY() + (radius + 5) / 1.6); + + double hr = radius * 0.75; + double nr = radius * 0.25; + + BlockState state; + Mutable bpos = new Mutable(); + Set blocks = Sets.newHashSet(); + for (int x = x1; x <= x2; x++) { + int xsq = x - center.getX(); + xsq *= xsq; + 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.setY(y); + double r = noise.eval(x * 0.1, y * 0.1, z * 0.1) * nr + hr; + //double r2 = r + 5; + double dist = xsq + ysq + zsq; + if (dist < r * r) { + state = world.getBlockState(bpos); + if (isReplaceable(state)) { + BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR); + blocks.add(bpos.toImmutable()); + + 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); + } + } + } + } + } + } + + return blocks; + } + + private boolean isReplaceable(BlockState state) { + return state.isIn(EndTags.GEN_TERRAIN) + || state.getMaterial().isReplaceable() + || state.getMaterial().equals(Material.PLANT) + || state.getMaterial().equals(Material.LEAVES); + } +} diff --git a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java index 96e98a76..a2eb7c0a 100644 --- a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java +++ b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java @@ -10,7 +10,6 @@ import net.minecraft.util.math.noise.SimplexNoiseSampler; import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryLookupCodec; import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.Biome.Category; import net.minecraft.world.biome.BiomeKeys; import net.minecraft.world.biome.source.BiomeSource; import net.minecraft.world.biome.source.TheEndBiomeSource; @@ -61,7 +60,7 @@ public class BetterEndBiomeSource extends BiomeSource { private static List getBiomes(Registry biomeRegistry) { List list = Lists.newArrayList(); biomeRegistry.forEach((biome) -> { - if (biome.getCategory() == Category.THEEND) { + if (EndBiomes.hasBiome(biomeRegistry.getId(biome))) { list.add(biome); } }); diff --git a/src/main/java/ru/betterend/world/generator/BiomePicker.java b/src/main/java/ru/betterend/world/generator/BiomePicker.java index 4db12d23..050ab133 100644 --- a/src/main/java/ru/betterend/world/generator/BiomePicker.java +++ b/src/main/java/ru/betterend/world/generator/BiomePicker.java @@ -32,12 +32,13 @@ public class BiomePicker { public void clearMutables() { maxChance = maxChanceUnmutable; - for (int i = biomes.size() - 1; i >= biomeCount; i--) + for (int i = biomes.size() - 1; i >= biomeCount; i--) { biomes.remove(i); + } } public EndBiome getBiome(Random random) { - return tree.getBiome(random.nextFloat() * maxChance); + return biomes.isEmpty() ? null : tree.getBiome(random.nextFloat() * maxChance); } public List getBiomes() { @@ -59,6 +60,9 @@ public class BiomePicker { } public void rebuild() { + if (biomes.isEmpty()) { + return; + } maxChance = maxChanceUnmutable; for (int i = biomeCount; i < biomes.size(); i++) { maxChance = biomes.get(i).mutateGenChance(maxChance); diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index 47b3b116..1dc83764 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -33,6 +33,7 @@ "SlimeEntityMixin", "AnvilBlockMixin", "BrewingAccessor", + "BiomeArrayMixin", "EntityMixin" ], "injectors": { From 3daf3421ee0eb05d5a905e5f6eb808d907642d03 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 9 Mar 2021 05:01:40 +0300 Subject: [PATCH 312/463] Biome separation, Smaragdant caves & cave fixes --- .../ru/betterend/entity/EndSlimeEntity.java | 2 +- .../integration/byg/BYGIntegration.java | 2 +- .../integration/byg/biomes/BYGBiomes.java | 2 +- .../integration/byg/biomes/EterialGrove.java | 4 +- .../byg/biomes/NightshadeRedwoods.java | 4 +- .../byg/biomes/OldBulbisGardens.java | 4 +- .../mixin/client/BackgroundRendererMixin.java | 2 +- .../mixin/common/BoneMealItemMixin.java | 2 +- .../java/ru/betterend/registry/EndBiomes.java | 42 +++--- .../ru/betterend/registry/EndFeatures.java | 11 +- .../java/ru/betterend/util/BlocksHelper.java | 11 ++ .../java/ru/betterend/util/BonemealUtil.java | 2 +- .../world/biome/EmptyEndCaveBiome.java | 18 --- .../betterend/world/biome/EndCaveBiome.java | 33 ----- .../biome/{ => air}/BiomeIceStarfield.java | 4 +- .../world/biome/cave/EmptyEndCaveBiome.java | 12 ++ .../biome/cave/EmptySmaragdantCaveBiome.java | 25 ++++ .../world/biome/cave/EndCaveBiome.java | 37 ++++++ .../biome/{ => land}/BiomeAmberLand.java | 2 +- .../{ => land}/BiomeBlossomingSpires.java | 2 +- .../biome/{ => land}/BiomeChorusForest.java | 2 +- .../{ => land}/BiomeCrystalMountains.java | 2 +- .../biome/{ => land}/BiomeDefinition.java | 2 +- .../biome/{ => land}/BiomeDustWastelands.java | 2 +- .../{ => land}/BiomeFoggyMushroomland.java | 2 +- .../world/biome/{ => land}/BiomeMegalake.java | 2 +- .../biome/{ => land}/BiomeMegalakeGrove.java | 2 +- .../{ => land}/BiomePaintedMountains.java | 2 +- .../biome/{ => land}/BiomeShadowForest.java | 2 +- .../biome/{ => land}/BiomeSulphurSprings.java | 2 +- .../biome/{ => land}/BiomeUmbrellaJungle.java | 2 +- .../{ => land}/DragonGraveyardsBiome.java | 2 +- .../biome/{ => land}/DryShrublandBiome.java | 2 +- .../world/biome/{ => land}/EndBiome.java | 2 +- .../{ => land}/GlowingGrasslandsBiome.java | 2 +- .../terrain/SmaragdantCrystalFeature.java | 56 ++++++++ .../SmaragdantCrystalShardFeature.java | 29 +++++ .../terrain/caves/EndCaveFeature.java | 123 +++++++++++++----- .../terrain/caves/RoundCaveFeature.java | 3 +- .../world/generator/BetterEndBiomeSource.java | 2 +- .../betterend/world/generator/BiomeChunk.java | 2 +- .../betterend/world/generator/BiomeMap.java | 2 +- .../world/generator/BiomePicker.java | 2 +- .../betterend/world/generator/WeighTree.java | 2 +- 44 files changed, 332 insertions(+), 140 deletions(-) delete mode 100644 src/main/java/ru/betterend/world/biome/EmptyEndCaveBiome.java delete mode 100644 src/main/java/ru/betterend/world/biome/EndCaveBiome.java rename src/main/java/ru/betterend/world/biome/{ => air}/BiomeIceStarfield.java (80%) create mode 100644 src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java create mode 100644 src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java create mode 100644 src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java rename src/main/java/ru/betterend/world/biome/{ => land}/BiomeAmberLand.java (94%) rename src/main/java/ru/betterend/world/biome/{ => land}/BiomeBlossomingSpires.java (94%) rename src/main/java/ru/betterend/world/biome/{ => land}/BiomeChorusForest.java (95%) rename src/main/java/ru/betterend/world/biome/{ => land}/BiomeCrystalMountains.java (91%) rename src/main/java/ru/betterend/world/biome/{ => land}/BiomeDefinition.java (96%) rename src/main/java/ru/betterend/world/biome/{ => land}/BiomeDustWastelands.java (92%) rename src/main/java/ru/betterend/world/biome/{ => land}/BiomeFoggyMushroomland.java (95%) rename src/main/java/ru/betterend/world/biome/{ => land}/BiomeMegalake.java (94%) rename src/main/java/ru/betterend/world/biome/{ => land}/BiomeMegalakeGrove.java (95%) rename src/main/java/ru/betterend/world/biome/{ => land}/BiomePaintedMountains.java (92%) rename src/main/java/ru/betterend/world/biome/{ => land}/BiomeShadowForest.java (95%) rename src/main/java/ru/betterend/world/biome/{ => land}/BiomeSulphurSprings.java (94%) rename src/main/java/ru/betterend/world/biome/{ => land}/BiomeUmbrellaJungle.java (95%) rename src/main/java/ru/betterend/world/biome/{ => land}/DragonGraveyardsBiome.java (93%) rename src/main/java/ru/betterend/world/biome/{ => land}/DryShrublandBiome.java (92%) rename src/main/java/ru/betterend/world/biome/{ => land}/EndBiome.java (95%) rename src/main/java/ru/betterend/world/biome/{ => land}/GlowingGrasslandsBiome.java (94%) create mode 100644 src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java create mode 100644 src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalShardFeature.java diff --git a/src/main/java/ru/betterend/entity/EndSlimeEntity.java b/src/main/java/ru/betterend/entity/EndSlimeEntity.java index b9b6118c..eef8605b 100644 --- a/src/main/java/ru/betterend/entity/EndSlimeEntity.java +++ b/src/main/java/ru/betterend/entity/EndSlimeEntity.java @@ -42,7 +42,7 @@ import ru.betterend.interfaces.ISlime; import ru.betterend.registry.EndBiomes; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; -import ru.betterend.world.biome.EndBiome; +import ru.betterend.world.biome.land.EndBiome; public class EndSlimeEntity extends SlimeEntity { private static final TrackedData VARIANT = DataTracker.registerData(EndSlimeEntity.class, TrackedDataHandlerRegistry.BYTE); diff --git a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java index ffa7d743..98a7ade2 100644 --- a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java +++ b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java @@ -14,7 +14,7 @@ import ru.betterend.integration.byg.features.BYGFeatures; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndTags; import ru.betterend.util.TagHelper; -import ru.betterend.world.biome.EndBiome; +import ru.betterend.world.biome.land.EndBiome; public class BYGIntegration extends ModIntegration { public BYGIntegration() { diff --git a/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java b/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java index 0211415c..6a47013c 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java @@ -2,7 +2,7 @@ package ru.betterend.integration.byg.biomes; import ru.betterend.integration.Integrations; import ru.betterend.registry.EndBiomes; -import ru.betterend.world.biome.EndBiome; +import ru.betterend.world.biome.land.EndBiome; public class BYGBiomes { // New Biomes diff --git a/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java b/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java index cec4f4c5..8e33136e 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java @@ -10,8 +10,8 @@ import net.minecraft.world.biome.SpawnSettings.SpawnEntry; import ru.betterend.BetterEnd; import ru.betterend.integration.Integrations; import ru.betterend.integration.byg.features.BYGFeatures; -import ru.betterend.world.biome.BiomeDefinition; -import ru.betterend.world.biome.EndBiome; +import ru.betterend.world.biome.land.BiomeDefinition; +import ru.betterend.world.biome.land.EndBiome; public class EterialGrove extends EndBiome { public EterialGrove() { diff --git a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java index 525b433a..af9ac202 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java @@ -13,8 +13,8 @@ import ru.betterend.BetterEnd; import ru.betterend.integration.Integrations; import ru.betterend.integration.byg.features.BYGFeatures; import ru.betterend.registry.EndFeatures; -import ru.betterend.world.biome.BiomeDefinition; -import ru.betterend.world.biome.EndBiome; +import ru.betterend.world.biome.land.BiomeDefinition; +import ru.betterend.world.biome.land.EndBiome; public class NightshadeRedwoods extends EndBiome { public NightshadeRedwoods() { diff --git a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java index ec711c80..ae7eed1d 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java @@ -20,8 +20,8 @@ import ru.betterend.BetterEnd; import ru.betterend.integration.Integrations; import ru.betterend.integration.byg.features.BYGFeatures; import ru.betterend.registry.EndFeatures; -import ru.betterend.world.biome.BiomeDefinition; -import ru.betterend.world.biome.EndBiome; +import ru.betterend.world.biome.land.BiomeDefinition; +import ru.betterend.world.biome.land.EndBiome; public class OldBulbisGardens extends EndBiome { public OldBulbisGardens() { diff --git a/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java b/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java index 26d59d3a..3b24d00f 100644 --- a/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java @@ -25,7 +25,7 @@ import net.minecraft.world.biome.Biome.Category; import ru.betterend.client.ClientOptions; import ru.betterend.registry.EndBiomes; import ru.betterend.util.BackgroundInfo; -import ru.betterend.world.biome.EndBiome; +import ru.betterend.world.biome.land.EndBiome; @Mixin(BackgroundRenderer.class) public class BackgroundRendererMixin { diff --git a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java index 1eff0099..bfba167c 100644 --- a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java +++ b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java @@ -23,7 +23,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; import ru.betterend.util.BonemealUtil; -import ru.betterend.world.biome.EndBiome; +import ru.betterend.world.biome.land.EndBiome; @Mixin(BoneMealItem.class) public class BoneMealItemMixin { diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index f961837a..15e92272 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -31,25 +31,26 @@ import ru.betterend.BetterEnd; import ru.betterend.config.Configs; import ru.betterend.integration.Integrations; import ru.betterend.util.JsonFactory; -import ru.betterend.world.biome.BiomeAmberLand; -import ru.betterend.world.biome.BiomeBlossomingSpires; -import ru.betterend.world.biome.BiomeChorusForest; -import ru.betterend.world.biome.BiomeCrystalMountains; -import ru.betterend.world.biome.BiomeDustWastelands; -import ru.betterend.world.biome.BiomeFoggyMushroomland; -import ru.betterend.world.biome.BiomeIceStarfield; -import ru.betterend.world.biome.BiomeMegalake; -import ru.betterend.world.biome.BiomeMegalakeGrove; -import ru.betterend.world.biome.BiomePaintedMountains; -import ru.betterend.world.biome.BiomeShadowForest; -import ru.betterend.world.biome.BiomeSulphurSprings; -import ru.betterend.world.biome.BiomeUmbrellaJungle; -import ru.betterend.world.biome.DragonGraveyardsBiome; -import ru.betterend.world.biome.DryShrublandBiome; -import ru.betterend.world.biome.EmptyEndCaveBiome; -import ru.betterend.world.biome.EndBiome; -import ru.betterend.world.biome.EndCaveBiome; -import ru.betterend.world.biome.GlowingGrasslandsBiome; +import ru.betterend.world.biome.air.BiomeIceStarfield; +import ru.betterend.world.biome.cave.EmptyEndCaveBiome; +import ru.betterend.world.biome.cave.EmptySmaragdantCaveBiome; +import ru.betterend.world.biome.cave.EndCaveBiome; +import ru.betterend.world.biome.land.BiomeAmberLand; +import ru.betterend.world.biome.land.BiomeBlossomingSpires; +import ru.betterend.world.biome.land.BiomeChorusForest; +import ru.betterend.world.biome.land.BiomeCrystalMountains; +import ru.betterend.world.biome.land.BiomeDustWastelands; +import ru.betterend.world.biome.land.BiomeFoggyMushroomland; +import ru.betterend.world.biome.land.BiomeMegalake; +import ru.betterend.world.biome.land.BiomeMegalakeGrove; +import ru.betterend.world.biome.land.BiomePaintedMountains; +import ru.betterend.world.biome.land.BiomeShadowForest; +import ru.betterend.world.biome.land.BiomeSulphurSprings; +import ru.betterend.world.biome.land.BiomeUmbrellaJungle; +import ru.betterend.world.biome.land.DragonGraveyardsBiome; +import ru.betterend.world.biome.land.DryShrublandBiome; +import ru.betterend.world.biome.land.EndBiome; +import ru.betterend.world.biome.land.GlowingGrasslandsBiome; import ru.betterend.world.generator.BELayerRandomSource; import ru.betterend.world.generator.BiomePicker; import ru.betterend.world.generator.BiomeType; @@ -98,7 +99,8 @@ public class EndBiomes { public static final EndBiome ICE_STARFIELD = registerBiome(new BiomeIceStarfield(), BiomeType.VOID); // Better End Caves - public static final EndCaveBiome EMPTY_CAVE = registerCaveBiome(new EmptyEndCaveBiome()); + public static final EndCaveBiome EMPTY_END_CAVE = registerCaveBiome(new EmptyEndCaveBiome()); + public static final EndCaveBiome EMPTY_SMARAGDANT_CAVE = registerCaveBiome(new EmptySmaragdantCaveBiome()); public static void register() {} diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 060799e6..f66047a4 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -10,11 +10,12 @@ import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.GenerationStep; import net.minecraft.world.gen.feature.ConfiguredFeature; import ru.betterend.BetterEnd; -import ru.betterend.world.biome.BiomeDefinition; -import ru.betterend.world.biome.EndBiome; +import ru.betterend.world.biome.land.BiomeDefinition; +import ru.betterend.world.biome.land.EndBiome; import ru.betterend.world.features.BlueVineFeature; import ru.betterend.world.features.CharniaFeature; import ru.betterend.world.features.CrashedShipFeature; +import ru.betterend.world.features.DefaultFeature; import ru.betterend.world.features.DoublePlantFeature; import ru.betterend.world.features.EndFeature; import ru.betterend.world.features.EndLilyFeature; @@ -43,6 +44,8 @@ import ru.betterend.world.features.terrain.GeyserFeature; import ru.betterend.world.features.terrain.IceStarFeature; import ru.betterend.world.features.terrain.ObsidianBoulderFeature; import ru.betterend.world.features.terrain.ObsidianPillarBasementFeature; +import ru.betterend.world.features.terrain.SmaragdantCrystalFeature; +import ru.betterend.world.features.terrain.SmaragdantCrystalShardFeature; import ru.betterend.world.features.terrain.SpireFeature; import ru.betterend.world.features.terrain.SulphurHillFeature; import ru.betterend.world.features.terrain.SulphuricCaveFeature; @@ -185,6 +188,10 @@ public class EndFeatures { // Mobs public static final EndFeature SILK_MOTH_NEST = EndFeature.makeChansedFeature("silk_moth_nest", new SilkMothNestFeature(), 2); + // Caves + public static final DefaultFeature SMARAGDANT_CRYSTAL = new SmaragdantCrystalFeature(); + public static final DefaultFeature SMARAGDANT_CRYSTAL_SHARD = new SmaragdantCrystalShardFeature(); + public static void registerBiomeFeatures(Identifier id, Biome biome, List>>> features) { if (id.getNamespace().equals(BetterEnd.MOD_ID)) { return; diff --git a/src/main/java/ru/betterend/util/BlocksHelper.java b/src/main/java/ru/betterend/util/BlocksHelper.java index 89006734..2708d51c 100644 --- a/src/main/java/ru/betterend/util/BlocksHelper.java +++ b/src/main/java/ru/betterend/util/BlocksHelper.java @@ -196,6 +196,17 @@ public class BlocksHelper { } } } + else if (state.isOf(EndBlocks.SMARAGDANT_CRYSTAL)) { + POS.setY(POS.getY() - 1); + if (world.isAir(POS)) { + POS.setY(POS.getY() + 1); + while (state.isOf(EndBlocks.SMARAGDANT_CRYSTAL)) { + setWithoutUpdate(world, POS, AIR); + POS.setY(POS.getY() + 1); + state = world.getBlockState(POS); + } + } + } else if (!state.canPlaceAt(world, POS)) { // Chorus if (state.isOf(Blocks.CHORUS_PLANT)) { diff --git a/src/main/java/ru/betterend/util/BonemealUtil.java b/src/main/java/ru/betterend/util/BonemealUtil.java index 72a6c66f..5d288dd0 100644 --- a/src/main/java/ru/betterend/util/BonemealUtil.java +++ b/src/main/java/ru/betterend/util/BonemealUtil.java @@ -11,7 +11,7 @@ import net.minecraft.block.Block; import net.minecraft.util.Identifier; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndBlocks; -import ru.betterend.world.biome.EndBiome; +import ru.betterend.world.biome.land.EndBiome; public class BonemealUtil { private static final Map> GRASS_BIOMES = Maps.newHashMap(); diff --git a/src/main/java/ru/betterend/world/biome/EmptyEndCaveBiome.java b/src/main/java/ru/betterend/world/biome/EmptyEndCaveBiome.java deleted file mode 100644 index 6ebe900a..00000000 --- a/src/main/java/ru/betterend/world/biome/EmptyEndCaveBiome.java +++ /dev/null @@ -1,18 +0,0 @@ -package ru.betterend.world.biome; - -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndParticles; -import ru.betterend.registry.EndSounds; - -public class EmptyEndCaveBiome extends EndCaveBiome { - public EmptyEndCaveBiome() { - super(new BiomeDefinition("empty_end_cave") - .setFogColor(255, 184, 71) - .setFogDensity(2.0F) - .setPlantsColor(219, 115, 38) - .setWaterAndFogColor(145, 108, 72) - .setMusic(EndSounds.MUSIC_FOREST) - .setParticles(EndParticles.AMBER_SPHERE, 0.001F) - .setSurface(EndBlocks.AMBER_MOSS)); - } -} diff --git a/src/main/java/ru/betterend/world/biome/EndCaveBiome.java b/src/main/java/ru/betterend/world/biome/EndCaveBiome.java deleted file mode 100644 index 769398bd..00000000 --- a/src/main/java/ru/betterend/world/biome/EndCaveBiome.java +++ /dev/null @@ -1,33 +0,0 @@ -package ru.betterend.world.biome; - -import java.util.List; -import java.util.Random; - -import com.google.common.collect.Lists; - -import net.minecraft.world.gen.feature.Feature; - -public class EndCaveBiome extends EndBiome { - private List> floorFeatures = Lists.newArrayList(); - private List> ceilFeatures = Lists.newArrayList(); - - public EndCaveBiome(BiomeDefinition definition) { - super(definition.setCaveBiome()); - } - - public void addFloorFeature(Feature feature) { - floorFeatures.add(feature); - } - - public void addCeilFeature(Feature feature) { - ceilFeatures.add(feature); - } - - public Feature getFloorFeature(Random random) { - return floorFeatures.isEmpty() ? null : floorFeatures.get(random.nextInt(floorFeatures.size())); - } - - public Feature getCeilFeature(Random random) { - return ceilFeatures.isEmpty() ? null : ceilFeatures.get(random.nextInt(ceilFeatures.size())); - } -} diff --git a/src/main/java/ru/betterend/world/biome/BiomeIceStarfield.java b/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java similarity index 80% rename from src/main/java/ru/betterend/world/biome/BiomeIceStarfield.java rename to src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java index 36df8654..5f33b989 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeIceStarfield.java +++ b/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java @@ -1,9 +1,11 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.air; import net.minecraft.entity.EntityType; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.land.BiomeDefinition; +import ru.betterend.world.biome.land.EndBiome; public class BiomeIceStarfield extends EndBiome { public BiomeIceStarfield() { diff --git a/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java new file mode 100644 index 00000000..1a99264e --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java @@ -0,0 +1,12 @@ +package ru.betterend.world.biome.cave; + +import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.land.BiomeDefinition; + +public class EmptyEndCaveBiome extends EndCaveBiome { + public EmptyEndCaveBiome() { + super(new BiomeDefinition("empty_end_cave") + .setFogDensity(2.0F) + .setMusic(EndSounds.MUSIC_FOREST)); + } +} diff --git a/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java new file mode 100644 index 00000000..27997f02 --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java @@ -0,0 +1,25 @@ +package ru.betterend.world.biome.cave; + +import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndParticles; +import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.land.BiomeDefinition; + +public class EmptySmaragdantCaveBiome extends EndCaveBiome { + public EmptySmaragdantCaveBiome() { + super(new BiomeDefinition("empty_smaragdant_cave") + .setFogColor(0, 253, 182) + .setFogDensity(2.0F) + .setPlantsColor(0, 131, 145) + .setWaterAndFogColor(31, 167, 212) + .setMusic(EndSounds.MUSIC_FOREST) + .setParticles(EndParticles.FIREFLY, 0.001F)); + this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL, 1); + this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL_SHARD, 20); + } + + @Override + public float getFloorDensity() { + return 0.1F; + } +} diff --git a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java new file mode 100644 index 00000000..f5464047 --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java @@ -0,0 +1,37 @@ +package ru.betterend.world.biome.cave; + +import java.util.Random; + +import net.minecraft.util.collection.WeightedList; +import net.minecraft.world.gen.feature.Feature; +import ru.betterend.world.biome.land.BiomeDefinition; +import ru.betterend.world.biome.land.EndBiome; + +public class EndCaveBiome extends EndBiome { + private WeightedList> floorFeatures = new WeightedList>(); + private WeightedList> ceilFeatures = new WeightedList>(); + + public EndCaveBiome(BiomeDefinition definition) { + super(definition.setCaveBiome()); + } + + public void addFloorFeature(Feature feature, int weight) { + floorFeatures.add(feature, weight); + } + + public void addCeilFeature(Feature feature, int weight) { + ceilFeatures.add(feature, weight); + } + + public Feature getFloorFeature(Random random) { + return floorFeatures.isEmpty() ? null : floorFeatures.pickRandom(random); + } + + public Feature getCeilFeature(Random random) { + return ceilFeatures.isEmpty() ? null : ceilFeatures.pickRandom(random); + } + + public float getFloorDensity() { + return 0; + } +} diff --git a/src/main/java/ru/betterend/world/biome/BiomeAmberLand.java b/src/main/java/ru/betterend/world/biome/land/BiomeAmberLand.java similarity index 94% rename from src/main/java/ru/betterend/world/biome/BiomeAmberLand.java rename to src/main/java/ru/betterend/world/biome/land/BiomeAmberLand.java index 142d9337..f7e28782 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeAmberLand.java +++ b/src/main/java/ru/betterend/world/biome/land/BiomeAmberLand.java @@ -1,4 +1,4 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.land; import net.minecraft.entity.EntityType; import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; diff --git a/src/main/java/ru/betterend/world/biome/BiomeBlossomingSpires.java b/src/main/java/ru/betterend/world/biome/land/BiomeBlossomingSpires.java similarity index 94% rename from src/main/java/ru/betterend/world/biome/BiomeBlossomingSpires.java rename to src/main/java/ru/betterend/world/biome/land/BiomeBlossomingSpires.java index 08630fbf..e61b2ef4 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeBlossomingSpires.java +++ b/src/main/java/ru/betterend/world/biome/land/BiomeBlossomingSpires.java @@ -1,4 +1,4 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.land; import net.minecraft.entity.EntityType; import ru.betterend.registry.EndBlocks; diff --git a/src/main/java/ru/betterend/world/biome/BiomeChorusForest.java b/src/main/java/ru/betterend/world/biome/land/BiomeChorusForest.java similarity index 95% rename from src/main/java/ru/betterend/world/biome/BiomeChorusForest.java rename to src/main/java/ru/betterend/world/biome/land/BiomeChorusForest.java index d9ce594f..64c24aec 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeChorusForest.java +++ b/src/main/java/ru/betterend/world/biome/land/BiomeChorusForest.java @@ -1,4 +1,4 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.land; import net.minecraft.entity.EntityType; import net.minecraft.particle.ParticleTypes; diff --git a/src/main/java/ru/betterend/world/biome/BiomeCrystalMountains.java b/src/main/java/ru/betterend/world/biome/land/BiomeCrystalMountains.java similarity index 91% rename from src/main/java/ru/betterend/world/biome/BiomeCrystalMountains.java rename to src/main/java/ru/betterend/world/biome/land/BiomeCrystalMountains.java index cd6c80f5..7f0a1176 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeCrystalMountains.java +++ b/src/main/java/ru/betterend/world/biome/land/BiomeCrystalMountains.java @@ -1,4 +1,4 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.land; import net.minecraft.entity.EntityType; import ru.betterend.registry.EndBlocks; diff --git a/src/main/java/ru/betterend/world/biome/BiomeDefinition.java b/src/main/java/ru/betterend/world/biome/land/BiomeDefinition.java similarity index 96% rename from src/main/java/ru/betterend/world/biome/BiomeDefinition.java rename to src/main/java/ru/betterend/world/biome/land/BiomeDefinition.java index a3ce12fa..378b1902 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeDefinition.java +++ b/src/main/java/ru/betterend/world/biome/land/BiomeDefinition.java @@ -1,4 +1,4 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.land; import java.util.List; diff --git a/src/main/java/ru/betterend/world/biome/BiomeDustWastelands.java b/src/main/java/ru/betterend/world/biome/land/BiomeDustWastelands.java similarity index 92% rename from src/main/java/ru/betterend/world/biome/BiomeDustWastelands.java rename to src/main/java/ru/betterend/world/biome/land/BiomeDustWastelands.java index c663cf09..8baa3564 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeDustWastelands.java +++ b/src/main/java/ru/betterend/world/biome/land/BiomeDustWastelands.java @@ -1,4 +1,4 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.land; import net.minecraft.entity.EntityType; import net.minecraft.particle.ParticleTypes; diff --git a/src/main/java/ru/betterend/world/biome/BiomeFoggyMushroomland.java b/src/main/java/ru/betterend/world/biome/land/BiomeFoggyMushroomland.java similarity index 95% rename from src/main/java/ru/betterend/world/biome/BiomeFoggyMushroomland.java rename to src/main/java/ru/betterend/world/biome/land/BiomeFoggyMushroomland.java index 4158875e..bffa77dc 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeFoggyMushroomland.java +++ b/src/main/java/ru/betterend/world/biome/land/BiomeFoggyMushroomland.java @@ -1,4 +1,4 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.land; import net.minecraft.entity.EntityType; import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; diff --git a/src/main/java/ru/betterend/world/biome/BiomeMegalake.java b/src/main/java/ru/betterend/world/biome/land/BiomeMegalake.java similarity index 94% rename from src/main/java/ru/betterend/world/biome/BiomeMegalake.java rename to src/main/java/ru/betterend/world/biome/land/BiomeMegalake.java index 9b740291..01853bbe 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeMegalake.java +++ b/src/main/java/ru/betterend/world/biome/land/BiomeMegalake.java @@ -1,4 +1,4 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.land; import net.minecraft.entity.EntityType; import ru.betterend.registry.EndBlocks; diff --git a/src/main/java/ru/betterend/world/biome/BiomeMegalakeGrove.java b/src/main/java/ru/betterend/world/biome/land/BiomeMegalakeGrove.java similarity index 95% rename from src/main/java/ru/betterend/world/biome/BiomeMegalakeGrove.java rename to src/main/java/ru/betterend/world/biome/land/BiomeMegalakeGrove.java index dc6d76f5..03fc5dc3 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeMegalakeGrove.java +++ b/src/main/java/ru/betterend/world/biome/land/BiomeMegalakeGrove.java @@ -1,4 +1,4 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.land; import net.minecraft.entity.EntityType; import ru.betterend.registry.EndBlocks; diff --git a/src/main/java/ru/betterend/world/biome/BiomePaintedMountains.java b/src/main/java/ru/betterend/world/biome/land/BiomePaintedMountains.java similarity index 92% rename from src/main/java/ru/betterend/world/biome/BiomePaintedMountains.java rename to src/main/java/ru/betterend/world/biome/land/BiomePaintedMountains.java index 49aa5c47..bef86311 100644 --- a/src/main/java/ru/betterend/world/biome/BiomePaintedMountains.java +++ b/src/main/java/ru/betterend/world/biome/land/BiomePaintedMountains.java @@ -1,4 +1,4 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.land; import net.minecraft.entity.EntityType; import net.minecraft.particle.ParticleTypes; diff --git a/src/main/java/ru/betterend/world/biome/BiomeShadowForest.java b/src/main/java/ru/betterend/world/biome/land/BiomeShadowForest.java similarity index 95% rename from src/main/java/ru/betterend/world/biome/BiomeShadowForest.java rename to src/main/java/ru/betterend/world/biome/land/BiomeShadowForest.java index a2d917a0..62060cdb 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeShadowForest.java +++ b/src/main/java/ru/betterend/world/biome/land/BiomeShadowForest.java @@ -1,4 +1,4 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.land; import net.minecraft.entity.EntityType; import net.minecraft.particle.ParticleTypes; diff --git a/src/main/java/ru/betterend/world/biome/BiomeSulphurSprings.java b/src/main/java/ru/betterend/world/biome/land/BiomeSulphurSprings.java similarity index 94% rename from src/main/java/ru/betterend/world/biome/BiomeSulphurSprings.java rename to src/main/java/ru/betterend/world/biome/land/BiomeSulphurSprings.java index c2df018e..e370e5e7 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeSulphurSprings.java +++ b/src/main/java/ru/betterend/world/biome/land/BiomeSulphurSprings.java @@ -1,4 +1,4 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.land; import net.minecraft.entity.EntityType; import ru.betterend.registry.EndEntities; diff --git a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java b/src/main/java/ru/betterend/world/biome/land/BiomeUmbrellaJungle.java similarity index 95% rename from src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java rename to src/main/java/ru/betterend/world/biome/land/BiomeUmbrellaJungle.java index a18bc64e..5e969919 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeUmbrellaJungle.java +++ b/src/main/java/ru/betterend/world/biome/land/BiomeUmbrellaJungle.java @@ -1,4 +1,4 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.land; import net.minecraft.entity.EntityType; import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; diff --git a/src/main/java/ru/betterend/world/biome/DragonGraveyardsBiome.java b/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java similarity index 93% rename from src/main/java/ru/betterend/world/biome/DragonGraveyardsBiome.java rename to src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java index 07c0dc74..7688869a 100644 --- a/src/main/java/ru/betterend/world/biome/DragonGraveyardsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java @@ -1,4 +1,4 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.land; import net.minecraft.entity.EntityType; import ru.betterend.registry.EndBlocks; diff --git a/src/main/java/ru/betterend/world/biome/DryShrublandBiome.java b/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java similarity index 92% rename from src/main/java/ru/betterend/world/biome/DryShrublandBiome.java rename to src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java index 89f4253f..be304161 100644 --- a/src/main/java/ru/betterend/world/biome/DryShrublandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java @@ -1,4 +1,4 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.land; import net.minecraft.entity.EntityType; import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; diff --git a/src/main/java/ru/betterend/world/biome/EndBiome.java b/src/main/java/ru/betterend/world/biome/land/EndBiome.java similarity index 95% rename from src/main/java/ru/betterend/world/biome/EndBiome.java rename to src/main/java/ru/betterend/world/biome/land/EndBiome.java index 478bc398..a1266cc3 100644 --- a/src/main/java/ru/betterend/world/biome/EndBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/EndBiome.java @@ -1,4 +1,4 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.land; import java.io.InputStream; import java.util.List; diff --git a/src/main/java/ru/betterend/world/biome/GlowingGrasslandsBiome.java b/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java similarity index 94% rename from src/main/java/ru/betterend/world/biome/GlowingGrasslandsBiome.java rename to src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java index 379b9a45..ab3639f1 100644 --- a/src/main/java/ru/betterend/world/biome/GlowingGrasslandsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java @@ -1,4 +1,4 @@ -package ru.betterend.world.biome; +package ru.betterend.world.biome.land; import net.minecraft.entity.EntityType; import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; diff --git a/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java b/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java new file mode 100644 index 00000000..a4e4f799 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java @@ -0,0 +1,56 @@ +package ru.betterend.world.features.terrain; + +import java.util.Random; + +import net.minecraft.block.BlockState; +import net.minecraft.state.property.Properties; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; +import ru.betterend.world.features.DefaultFeature; + +public class SmaragdantCrystalFeature extends DefaultFeature { + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + if (!world.getBlockState(pos.down()).isIn(EndTags.GEN_TERRAIN)) { + return false; + } + + Mutable mut = new Mutable(); + int count = MHelper.randRange(15, 30, random); + BlockState crystal = EndBlocks.SMARAGDANT_CRYSTAL.getDefaultState(); + BlockState shard = EndBlocks.SMARAGDANT_CRYSTAL_SHARD.getDefaultState(); + 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)); + int dist = MHelper.floor(1.5F - MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ())) + random.nextInt(3); + if (dist > 0) { + BlockState state = world.getBlockState(mut); + for (int n = 0; n < 10 && state.isAir(); n++) { + mut.setY(mut.getY() - 1); + state = world.getBlockState(mut); + } + if (state.isIn(EndTags.GEN_TERRAIN) && !world.getBlockState(mut.up()).isOf(crystal.getBlock())) { + for (int j = 0; j <= dist; j++) { + BlocksHelper.setWithoutUpdate(world, mut, crystal); + mut.setY(mut.getY() + 1); + } + if (random.nextBoolean()) { + boolean waterlogged = !world.getFluidState(mut).isEmpty(); + BlocksHelper.setWithoutUpdate(world, mut, shard.with(Properties.WATERLOGGED, waterlogged)); + } + else { + BlocksHelper.setWithoutUpdate(world, mut, crystal); + } + } + } + } + + return true; + } +} diff --git a/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalShardFeature.java b/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalShardFeature.java new file mode 100644 index 00000000..38b4a5f5 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalShardFeature.java @@ -0,0 +1,29 @@ +package ru.betterend.world.features.terrain; + +import java.util.Random; + +import net.minecraft.block.BlockState; +import net.minecraft.state.property.Properties; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.world.features.DefaultFeature; + +public class SmaragdantCrystalShardFeature extends DefaultFeature { + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + if (!world.getBlockState(pos.down()).isIn(EndTags.GEN_TERRAIN)) { + return false; + } + + BlockState shard = EndBlocks.SMARAGDANT_CRYSTAL_SHARD.getDefaultState(); + boolean waterlogged = !world.getFluidState(pos).isEmpty(); + BlocksHelper.setWithoutUpdate(world, pos, shard.with(Properties.WATERLOGGED, waterlogged)); + + return true; + } +} 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 a8d59265..dc07b6a5 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 @@ -9,16 +9,20 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.util.math.Direction; import net.minecraft.world.Heightmap; import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.gen.feature.Feature; import ru.betterend.interfaces.IBiomeArray; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; -import ru.betterend.world.biome.EndCaveBiome; +import ru.betterend.world.biome.cave.EndCaveBiome; +import ru.betterend.world.biome.land.EndBiome; import ru.betterend.world.features.DefaultFeature; import ru.betterend.world.generator.GeneratorOptions; @@ -33,6 +37,10 @@ public abstract class EndCaveFeature extends DefaultFeature { return false; } + if (biomeMissingCaves(world, pos)) { + return false; + } + int radius = MHelper.randRange(10, 30, random); BlockPos center = findPos(world, pos, radius, random); @@ -42,29 +50,31 @@ public abstract class EndCaveFeature extends DefaultFeature { EndCaveBiome biome = EndBiomes.getCaveBiome(random); Set caveBlocks = generate(world, center, radius, random); - if (biome != null && !caveBlocks.isEmpty()) { - setBiomes(world, biome, caveBlocks); - Set floorPositions = Sets.newHashSet(); - Set ceilPositions = Sets.newHashSet(); - Mutable mut = new Mutable(); - caveBlocks.forEach((bpos) -> { - mut.set(bpos); - if (world.getBlockState(mut).getMaterial().isReplaceable()) { - mut.setY(bpos.getY() - 1); - if (world.getBlockState(mut).isIn(EndTags.GEN_TERRAIN)) { - floorPositions.add(mut.toImmutable()); + if (!caveBlocks.isEmpty()) { + if (biome != null) { + setBiomes(world, biome, caveBlocks); + Set floorPositions = Sets.newHashSet(); + Set ceilPositions = Sets.newHashSet(); + Mutable mut = new Mutable(); + caveBlocks.forEach((bpos) -> { + mut.set(bpos); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + mut.setY(bpos.getY() - 1); + if (world.getBlockState(mut).isIn(EndTags.GEN_TERRAIN)) { + floorPositions.add(mut.toImmutable()); + } + mut.setY(bpos.getY() + 1); + if (world.getBlockState(mut).isIn(EndTags.GEN_TERRAIN)) { + ceilPositions.add(mut.toImmutable()); + } } - mut.setY(bpos.getY() + 1); - if (world.getBlockState(mut).isIn(EndTags.GEN_TERRAIN)) { - ceilPositions.add(mut.toImmutable()); - } - } - }); - BlockState surfaceBlock = biome.getBiome().getGenerationSettings().getSurfaceConfig().getTopMaterial(); - placeFloor(world, biome, floorPositions, random, surfaceBlock); - placeCeil(world, biome, ceilPositions, random); + }); + BlockState surfaceBlock = biome.getBiome().getGenerationSettings().getSurfaceConfig().getTopMaterial(); + placeFloor(world, biome, floorPositions, random, surfaceBlock); + placeCeil(world, biome, ceilPositions, random); + } + fixBlocks(world, caveBlocks); } - fixBlocks(world, center, radius); return true; } @@ -75,6 +85,18 @@ public abstract class EndCaveFeature extends DefaultFeature { floorPositions.forEach((pos) -> { BlocksHelper.setWithoutUpdate(world, pos, surfaceBlock); }); + + float density = biome.getFloorDensity(); + if (density > 0) { + floorPositions.forEach((pos) -> { + if (random.nextFloat() <= density) { + Feature feature = biome.getFloorFeature(random); + if (feature != null) { + feature.generate(world, null, random, pos.up(), null); + } + } + }); + } } protected void placeCeil(StructureWorldAccess world, EndCaveBiome biome, Set ceilPositions, Random random) { @@ -122,13 +144,54 @@ public abstract class EndCaveFeature extends DefaultFeature { return new BlockPos(pos.getX(), MHelper.randRange(bottom, top, random), pos.getZ()); } - private void fixBlocks(StructureWorldAccess world, BlockPos pos, int radius) { - int x1 = pos.getX() - radius - 5; - int y1 = pos.getY() - radius - 5; - int z1 = pos.getZ() - radius - 5; - int x2 = pos.getX() + radius + 5; - int y2 = pos.getY() + radius + 5; - int z2 = pos.getZ() + radius + 5; - BlocksHelper.fixBlocks(world, new BlockPos(x1, y1, z1), new BlockPos(x2, y2, z2)); + private void fixBlocks(StructureWorldAccess world, Set caveBlocks) { + BlockPos pos = caveBlocks.iterator().next(); + Mutable start = new Mutable().set(pos); + Mutable end = new Mutable().set(pos); + caveBlocks.forEach((bpos) -> { + if (bpos.getX() < start.getX()) { + start.setX(bpos.getX()); + } + if (bpos.getX() > end.getX()) { + end.setX(bpos.getX()); + } + + if (bpos.getY() < start.getY()) { + start.setY(bpos.getY()); + } + if (bpos.getY() > end.getY()) { + end.setY(bpos.getY()); + } + + if (bpos.getZ() < start.getZ()) { + start.setZ(bpos.getZ()); + } + if (bpos.getZ() > end.getZ()) { + end.setZ(bpos.getZ()); + } + }); + BlocksHelper.fixBlocks(world, start.add(-5, -5, -5), end.add(5, 5, 5)); + } + + protected boolean isWaterNear(StructureWorldAccess world, BlockPos pos) { + for (Direction dir: BlocksHelper.DIRECTIONS) { + if (!world.getFluidState(pos.offset(dir, 5)).isEmpty()) { + return true; + } + } + return false; + } + + protected boolean biomeMissingCaves(StructureWorldAccess world, BlockPos pos) { + for (int x = -2; x < 3; x++) { + for (int z = -2; z < 3; z++) { + Biome biome = world.getBiome(pos.add(x << 4, 0, z << 4)); + EndBiome endBiome = EndBiomes.getFromBiome(biome); + if (!endBiome.hasCaves()) { + return true; + } + } + } + return false; } } 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 5f32e5e4..55636096 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 @@ -47,11 +47,10 @@ public class RoundCaveFeature extends EndCaveFeature { ysq *= ysq; bpos.setY(y); double r = noise.eval(x * 0.1, y * 0.1, z * 0.1) * nr + hr; - //double r2 = r + 5; double dist = xsq + ysq + zsq; if (dist < r * r) { state = world.getBlockState(bpos); - if (isReplaceable(state)) { + if (isReplaceable(state) && !isWaterNear(world, bpos)) { BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR); blocks.add(bpos.toImmutable()); diff --git a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java index a2eb7c0a..e33ddf6a 100644 --- a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java +++ b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java @@ -19,7 +19,7 @@ import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndTags; import ru.betterend.util.FeaturesHelper; -import ru.betterend.world.biome.EndBiome; +import ru.betterend.world.biome.land.EndBiome; public class BetterEndBiomeSource extends BiomeSource { public static final Codec CODEC = RecordCodecBuilder.create((instance) -> { diff --git a/src/main/java/ru/betterend/world/generator/BiomeChunk.java b/src/main/java/ru/betterend/world/generator/BiomeChunk.java index 96dd258f..a3c3efe7 100644 --- a/src/main/java/ru/betterend/world/generator/BiomeChunk.java +++ b/src/main/java/ru/betterend/world/generator/BiomeChunk.java @@ -2,7 +2,7 @@ package ru.betterend.world.generator; import java.util.Random; -import ru.betterend.world.biome.EndBiome; +import ru.betterend.world.biome.land.EndBiome; public class BiomeChunk { diff --git a/src/main/java/ru/betterend/world/generator/BiomeMap.java b/src/main/java/ru/betterend/world/generator/BiomeMap.java index bcc73d85..b400be59 100644 --- a/src/main/java/ru/betterend/world/generator/BiomeMap.java +++ b/src/main/java/ru/betterend/world/generator/BiomeMap.java @@ -8,7 +8,7 @@ import net.minecraft.util.math.ChunkPos; import net.minecraft.world.gen.ChunkRandom; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; -import ru.betterend.world.biome.EndBiome; +import ru.betterend.world.biome.land.EndBiome; public class BiomeMap { private static final ChunkRandom RANDOM = new ChunkRandom(); diff --git a/src/main/java/ru/betterend/world/generator/BiomePicker.java b/src/main/java/ru/betterend/world/generator/BiomePicker.java index 050ab133..339a0ab6 100644 --- a/src/main/java/ru/betterend/world/generator/BiomePicker.java +++ b/src/main/java/ru/betterend/world/generator/BiomePicker.java @@ -8,7 +8,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Sets; import net.minecraft.util.Identifier; -import ru.betterend.world.biome.EndBiome; +import ru.betterend.world.biome.land.EndBiome; public class BiomePicker { private final Set immutableIDs = Sets.newHashSet(); diff --git a/src/main/java/ru/betterend/world/generator/WeighTree.java b/src/main/java/ru/betterend/world/generator/WeighTree.java index 50cf39aa..2d55c364 100644 --- a/src/main/java/ru/betterend/world/generator/WeighTree.java +++ b/src/main/java/ru/betterend/world/generator/WeighTree.java @@ -2,7 +2,7 @@ package ru.betterend.world.generator; import java.util.List; -import ru.betterend.world.biome.EndBiome; +import ru.betterend.world.biome.land.EndBiome; public class WeighTree { private final Node root; From 2ac1ec8f5a429b99fe5271c5e374cb7cb6f0ec4e Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 9 Mar 2021 05:19:30 +0300 Subject: [PATCH 313/463] Additional cave biomes --- .../java/ru/betterend/registry/EndBiomes.java | 6 +++ .../ru/betterend/registry/EndFeatures.java | 2 + .../biome/cave/EmptyAuroraCaveBiome.java | 24 ++++++++++ .../world/biome/cave/LushAuroraCaveBiome.java | 26 ++++++++++ .../biome/cave/LushSmaragdantCaveBiome.java | 27 +++++++++++ .../terrain/BigAuroraCrystalFeature.java | 48 +++++++++++++++++++ 6 files changed, 133 insertions(+) create mode 100644 src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java create mode 100644 src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java create mode 100644 src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java create mode 100644 src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index 15e92272..b64668e1 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -32,9 +32,12 @@ import ru.betterend.config.Configs; import ru.betterend.integration.Integrations; import ru.betterend.util.JsonFactory; import ru.betterend.world.biome.air.BiomeIceStarfield; +import ru.betterend.world.biome.cave.EmptyAuroraCaveBiome; import ru.betterend.world.biome.cave.EmptyEndCaveBiome; import ru.betterend.world.biome.cave.EmptySmaragdantCaveBiome; import ru.betterend.world.biome.cave.EndCaveBiome; +import ru.betterend.world.biome.cave.LushAuroraCaveBiome; +import ru.betterend.world.biome.cave.LushSmaragdantCaveBiome; import ru.betterend.world.biome.land.BiomeAmberLand; import ru.betterend.world.biome.land.BiomeBlossomingSpires; import ru.betterend.world.biome.land.BiomeChorusForest; @@ -101,6 +104,9 @@ public class EndBiomes { // Better End Caves public static final EndCaveBiome EMPTY_END_CAVE = registerCaveBiome(new EmptyEndCaveBiome()); public static final EndCaveBiome EMPTY_SMARAGDANT_CAVE = registerCaveBiome(new EmptySmaragdantCaveBiome()); + public static final EndCaveBiome LUSH_SMARAGDANT_CAVE = registerCaveBiome(new LushSmaragdantCaveBiome()); + public static final EndCaveBiome EMPTY_AURORA_CAVE = registerCaveBiome(new EmptyAuroraCaveBiome()); + public static final EndCaveBiome LUSH_AURORA_CAVE = registerCaveBiome(new LushAuroraCaveBiome()); public static void register() {} diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index f66047a4..3a6ee8da 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -37,6 +37,7 @@ import ru.betterend.world.features.bushes.BushFeature; import ru.betterend.world.features.bushes.LargeAmaranitaFeature; import ru.betterend.world.features.bushes.Lumecorn; import ru.betterend.world.features.bushes.TenaneaBushFeature; +import ru.betterend.world.features.terrain.BigAuroraCrystalFeature; import ru.betterend.world.features.terrain.EndLakeFeature; import ru.betterend.world.features.terrain.FallenPillarFeature; import ru.betterend.world.features.terrain.FloatingSpireFeature; @@ -191,6 +192,7 @@ public class EndFeatures { // Caves public static final DefaultFeature SMARAGDANT_CRYSTAL = new SmaragdantCrystalFeature(); public static final DefaultFeature SMARAGDANT_CRYSTAL_SHARD = new SmaragdantCrystalShardFeature(); + public static final DefaultFeature BIG_AURORA_CRYSTAL = new BigAuroraCrystalFeature(); public static void registerBiomeFeatures(Identifier id, Biome biome, List>>> features) { if (id.getNamespace().equals(BetterEnd.MOD_ID)) { diff --git a/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java new file mode 100644 index 00000000..333f219e --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java @@ -0,0 +1,24 @@ +package ru.betterend.world.biome.cave; + +import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndParticles; +import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.land.BiomeDefinition; + +public class EmptyAuroraCaveBiome extends EndCaveBiome { + public EmptyAuroraCaveBiome() { + super(new BiomeDefinition("empty_aurora_cave") + .setFogColor(150, 30, 68) + .setFogDensity(2.0F) + .setPlantsColor(108, 25, 46) + .setWaterAndFogColor(186, 77, 237) + .setMusic(EndSounds.MUSIC_FOREST) + .setParticles(EndParticles.GLOWING_SPHERE, 0.001F)); + this.addFloorFeature(EndFeatures.BIG_AURORA_CRYSTAL, 1); + } + + @Override + public float getFloorDensity() { + return 0.01F; + } +} diff --git a/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java new file mode 100644 index 00000000..aca05285 --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java @@ -0,0 +1,26 @@ +package ru.betterend.world.biome.cave; + +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndParticles; +import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.land.BiomeDefinition; + +public class LushAuroraCaveBiome extends EndCaveBiome { + public LushAuroraCaveBiome() { + super(new BiomeDefinition("lush_aurora_cave") + .setFogColor(150, 30, 68) + .setFogDensity(2.0F) + .setPlantsColor(108, 25, 46) + .setWaterAndFogColor(186, 77, 237) + .setMusic(EndSounds.MUSIC_FOREST) + .setParticles(EndParticles.GLOWING_SPHERE, 0.001F) + .setSurface(EndBlocks.CAVE_MOSS)); + this.addFloorFeature(EndFeatures.BIG_AURORA_CRYSTAL, 1); + } + + @Override + public float getFloorDensity() { + return 0.01F; + } +} diff --git a/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java new file mode 100644 index 00000000..ad3d39cd --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java @@ -0,0 +1,27 @@ +package ru.betterend.world.biome.cave; + +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndParticles; +import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.land.BiomeDefinition; + +public class LushSmaragdantCaveBiome extends EndCaveBiome { + public LushSmaragdantCaveBiome() { + super(new BiomeDefinition("lush_smaragdant_cave") + .setFogColor(0, 253, 182) + .setFogDensity(2.0F) + .setPlantsColor(0, 131, 145) + .setWaterAndFogColor(31, 167, 212) + .setMusic(EndSounds.MUSIC_FOREST) + .setParticles(EndParticles.FIREFLY, 0.001F) + .setSurface(EndBlocks.CAVE_MOSS)); + this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL, 1); + this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL_SHARD, 20); + } + + @Override + public float getFloorDensity() { + return 0.1F; + } +} diff --git a/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java b/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java new file mode 100644 index 00000000..687eaf61 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java @@ -0,0 +1,48 @@ +package ru.betterend.world.features.terrain; + +import java.util.Random; + +import net.minecraft.block.Material; +import net.minecraft.client.util.math.Vector3f; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFRotation; +import ru.betterend.util.sdf.primitive.SDFHexPrism; +import ru.betterend.world.features.DefaultFeature; + +public class BigAuroraCrystalFeature extends DefaultFeature { + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + int maxY = pos.getY() + BlocksHelper.upRay(world, pos, 16); + int minY = pos.getY() - BlocksHelper.downRay(world, pos, 16); + + if (maxY - minY < 10) { + return false; + } + + int y = MHelper.randRange(minY, maxY, random); + pos = new BlockPos(pos.getX(), y, pos.getZ()); + + int height = MHelper.randRange(5, 25, random); + SDF prism = new SDFHexPrism().setHeight(height).setRadius(MHelper.randRange(1.7F, 3F, random)).setBlock(EndBlocks.AURORA_CRYSTAL); + Vector3f vec = MHelper.randomHorizontal(random); + prism = new SDFRotation().setRotation(vec, random.nextFloat()).setSource(prism); + prism.setReplaceFunction((bState) -> { + return bState.getMaterial().isReplaceable() + || bState.isIn(EndTags.GEN_TERRAIN) + || bState.getMaterial().equals(Material.PLANT) + || bState.getMaterial().equals(Material.LEAVES); + }); + prism.fillRecursive(world, pos); + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.AURORA_CRYSTAL); + + return true; + } +} From 7e73d9a31c10a178ee54d47f26cbbbf040eafa78 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 9 Mar 2021 07:27:38 +0300 Subject: [PATCH 314/463] Stalactites --- .../ru/betterend/blocks/BlockProperties.java | 1 + .../blocks/basis/StalactiteBlock.java | 133 ++++++++++++++++++ .../particle/SmaragdantParticle.java | 92 ++++++++++++ .../java/ru/betterend/patterns/Patterns.java | 12 ++ .../java/ru/betterend/registry/EndBlocks.java | 3 + .../ru/betterend/registry/EndFeatures.java | 10 +- .../ru/betterend/registry/EndParticles.java | 3 + .../java/ru/betterend/util/BlocksHelper.java | 19 +++ .../biome/cave/EmptyAuroraCaveBiome.java | 8 ++ .../world/biome/cave/EmptyEndCaveBiome.java | 14 ++ .../biome/cave/EmptySmaragdantCaveBiome.java | 10 +- .../world/biome/cave/EndCaveBiome.java | 4 + .../world/biome/cave/LushAuroraCaveBiome.java | 12 +- .../biome/cave/LushSmaragdantCaveBiome.java | 10 +- .../world/features/bushes/BushFeature.java | 7 +- ...rdFeature.java => SingleBlockFeature.java} | 19 ++- .../terrain/SmaragdantCrystalFeature.java | 9 +- .../features/terrain/StalactiteFeature.java | 68 +++++++++ .../terrain/caves/EndCaveFeature.java | 44 ++++-- .../particles/smaragdant_particle.json | 13 ++ .../patterns/block/stalactite_0.json | 23 +++ .../patterns/block/stalactite_1.json | 23 +++ .../patterns/block/stalactite_2.json | 23 +++ .../patterns/block/stalactite_3.json | 23 +++ .../patterns/block/stalactite_4.json | 23 +++ .../patterns/block/stalactite_5.json | 23 +++ .../patterns/block/stalactite_6.json | 23 +++ .../patterns/block/stalactite_7.json | 23 +++ .../patterns/blockstate/stalactite.json | 13 ++ .../textures/block/smaragdant_crystal.png | Bin 249 -> 0 bytes .../particle/smaragdant_particle_1.png | Bin 0 -> 142 bytes .../particle/smaragdant_particle_2.png | Bin 0 -> 146 bytes .../particle/smaragdant_particle_3.png | Bin 0 -> 153 bytes .../particle/smaragdant_particle_4.png | Bin 0 -> 161 bytes .../particle/smaragdant_particle_5.png | Bin 0 -> 161 bytes .../particle/smaragdant_particle_6.png | Bin 0 -> 161 bytes .../particle/smaragdant_particle_7.png | Bin 0 -> 164 bytes .../particle/smaragdant_particle_8.png | Bin 0 -> 157 bytes .../particle/smaragdant_particle_9.png | Bin 0 -> 154 bytes 39 files changed, 657 insertions(+), 31 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java create mode 100644 src/main/java/ru/betterend/particle/SmaragdantParticle.java rename src/main/java/ru/betterend/world/features/terrain/{SmaragdantCrystalShardFeature.java => SingleBlockFeature.java} (59%) create mode 100644 src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java create mode 100644 src/main/resources/assets/betterend/particles/smaragdant_particle.json create mode 100644 src/main/resources/assets/betterend/patterns/block/stalactite_0.json create mode 100644 src/main/resources/assets/betterend/patterns/block/stalactite_1.json create mode 100644 src/main/resources/assets/betterend/patterns/block/stalactite_2.json create mode 100644 src/main/resources/assets/betterend/patterns/block/stalactite_3.json create mode 100644 src/main/resources/assets/betterend/patterns/block/stalactite_4.json create mode 100644 src/main/resources/assets/betterend/patterns/block/stalactite_5.json create mode 100644 src/main/resources/assets/betterend/patterns/block/stalactite_6.json create mode 100644 src/main/resources/assets/betterend/patterns/block/stalactite_7.json create mode 100644 src/main/resources/assets/betterend/patterns/blockstate/stalactite.json delete mode 100644 src/main/resources/assets/betterend/textures/block/smaragdant_crystal.png create mode 100644 src/main/resources/assets/betterend/textures/particle/smaragdant_particle_1.png create mode 100644 src/main/resources/assets/betterend/textures/particle/smaragdant_particle_2.png create mode 100644 src/main/resources/assets/betterend/textures/particle/smaragdant_particle_3.png create mode 100644 src/main/resources/assets/betterend/textures/particle/smaragdant_particle_4.png create mode 100644 src/main/resources/assets/betterend/textures/particle/smaragdant_particle_5.png create mode 100644 src/main/resources/assets/betterend/textures/particle/smaragdant_particle_6.png create mode 100644 src/main/resources/assets/betterend/textures/particle/smaragdant_particle_7.png create mode 100644 src/main/resources/assets/betterend/textures/particle/smaragdant_particle_8.png create mode 100644 src/main/resources/assets/betterend/textures/particle/smaragdant_particle_9.png diff --git a/src/main/java/ru/betterend/blocks/BlockProperties.java b/src/main/java/ru/betterend/blocks/BlockProperties.java index b3bad26f..0e461467 100644 --- a/src/main/java/ru/betterend/blocks/BlockProperties.java +++ b/src/main/java/ru/betterend/blocks/BlockProperties.java @@ -25,6 +25,7 @@ public class BlockProperties { public static final IntProperty FULLNESS = IntProperty.of("fullness", 0, 3); public static final IntProperty COLOR = IntProperty.of("color", 0, 7); public static final IntProperty PORTAL = IntProperty.of("portal", 0, EndPortals.getCount()); + public static final IntProperty SIZE = IntProperty.of("size", 0, 7); public static enum TripleShape implements StringIdentifiable { TOP("top"), diff --git a/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java b/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java new file mode 100644 index 00000000..9a7f60ac --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java @@ -0,0 +1,133 @@ +package ru.betterend.blocks.basis; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.ShapeContext; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.IntProperty; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.util.math.Direction; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.BlockView; +import net.minecraft.world.World; +import net.minecraft.world.WorldAccess; +import net.minecraft.world.WorldView; +import ru.betterend.blocks.BlockProperties; +import ru.betterend.patterns.Patterns; + +public class StalactiteBlock extends BlockBaseNotFull { + public static final IntProperty SIZE = BlockProperties.SIZE; + private static final Mutable POS = new Mutable(); + private static final VoxelShape[] SHAPES; + private final Block source; + + public StalactiteBlock(Block source) { + super(FabricBlockSettings.copy(source).nonOpaque()); + this.setDefaultState(getStateManager().getDefaultState().with(SIZE, 0)); + this.source = source; + } + + @Override + protected void appendProperties(StateManager.Builder stateManager) { + stateManager.add(SIZE); + } + + @Override + public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + return SHAPES[state.get(SIZE)]; + } + + @Override + public void onPlaced(World world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { + if (world.getBlockState(pos.down()).getBlock() instanceof StalactiteBlock) { + POS.setX(pos.getX()); + POS.setZ(pos.getZ()); + for (int i = 1; i < 8; i++) { + POS.setY(pos.getY() - i); + if (world.getBlockState(POS).getBlock() instanceof StalactiteBlock) { + BlockState state2 = world.getBlockState(POS); + int size = state2.get(SIZE); + if (size < i) { + world.setBlockState(POS, state2.with(SIZE, i)); + } + else { + break; + } + } + else { + break; + } + } + } + if (world.getBlockState(pos.up()).getBlock() instanceof StalactiteBlock) { + POS.setX(pos.getX()); + POS.setZ(pos.getZ()); + for (int i = 1; i < 8; i++) { + POS.setY(pos.getY() + i); + if (world.getBlockState(POS).getBlock() instanceof StalactiteBlock) { + BlockState state2 = world.getBlockState(POS); + int size = state2.get(SIZE); + if (size < i) { + world.setBlockState(POS, state2.with(SIZE, i)); + } + else { + break; + } + } + else { + break; + } + } + } + } + + @Override + public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { + if (!canPlaceAt(state, world, pos)) { + return Blocks.AIR.getDefaultState(); + } + else { + return state; + } + } + + @Override + public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + BlockState upState = world.getBlockState(pos.up()); + BlockState downState = world.getBlockState(pos.down()); + int size = state.get(SIZE); + boolean validUp = (upState.isOf(this) && upState.get(SIZE) >= size) || upState.isFullCube(world, pos.up()); + boolean validDown = (downState.isOf(this) && downState.get(SIZE) >= size) || downState.isFullCube(world, pos.down()); + return validUp || validDown; + } + + @Override + public String getModelPattern(String block) { + Identifier blockId = Registry.BLOCK.getId(this); + if (block.contains("item")) { + return Patterns.createJson(Patterns.ITEM_GENERATED, "item/" + blockId.getPath()); + } + blockId = Registry.BLOCK.getId(source); + int shape = Character.getNumericValue(block.charAt(block.lastIndexOf('_') + 1)); + return Patterns.createJson(Patterns.BLOCKS_STALACTITE[shape], blockId.getNamespace() + ":block/" + blockId.getPath()); + } + + @Override + public Identifier statePatternId() { + return Patterns.STATE_STALACTITE; + } + + static { + SHAPES = new VoxelShape[8]; + for (int i = 0; i < 8; i++) { + SHAPES[i] = Block.createCuboidShape(7 - i, 0, 7 - i, 9 + i, 16, 9 + i); + } + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/particle/SmaragdantParticle.java b/src/main/java/ru/betterend/particle/SmaragdantParticle.java new file mode 100644 index 00000000..bf19c400 --- /dev/null +++ b/src/main/java/ru/betterend/particle/SmaragdantParticle.java @@ -0,0 +1,92 @@ +package ru.betterend.particle; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.particle.AnimatedParticle; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleFactory; +import net.minecraft.client.particle.ParticleTextureSheet; +import net.minecraft.client.particle.SpriteProvider; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.particle.DefaultParticleType; +import net.minecraft.util.math.MathHelper; +import ru.betterend.util.MHelper; + +@Environment(EnvType.CLIENT) +public class SmaragdantParticle extends AnimatedParticle { + private double preVX; + private double preVY; + private double preVZ; + private double nextVX; + private double nextVY; + private double nextVZ; + + protected SmaragdantParticle(ClientWorld world, double x, double y, double z, double r, double g, double b, SpriteProvider sprites) { + super(world, x, y, z, sprites, 0); + setSprite(sprites.getSprite(random)); + + this.maxAge = MHelper.randRange(60, 120, random); + this.scale = MHelper.randRange(0.05F, 0.15F, random); + this.setColor(1, 1, 1); + this.setColorAlpha(0); + + preVX = random.nextGaussian() * 0.01; + preVY = random.nextGaussian() * 0.01; + preVZ = random.nextGaussian() * 0.01; + + nextVX = random.nextGaussian() * 0.01; + nextVY = random.nextGaussian() * 0.01; + nextVZ = random.nextGaussian() * 0.01; + } + + @Override + public void tick() { + int ticks = this.age & 31; + if (ticks == 0) { + preVX = nextVX; + preVY = nextVY; + preVZ = nextVZ; + nextVX = random.nextGaussian() * 0.015; + nextVY = random.nextFloat() * 0.02 + 0.01; + nextVZ = random.nextGaussian() * 0.015; + } + double delta = (double) ticks / 31.0; + + if (this.age <= 31) { + this.setColorAlpha(this.age / 31F); + } + else if (this.age >= this.maxAge - 31) { + this.setColorAlpha((this.maxAge - this.age) / 31F); + } + + if (this.age >= this.maxAge) { + this.markDead(); + } + + this.velocityX = MathHelper.lerp(delta, preVX, nextVX); + this.velocityY = MathHelper.lerp(delta, preVY, nextVY); + this.velocityZ = MathHelper.lerp(delta, preVZ, nextVZ); + + super.tick(); + } + + @Override + public ParticleTextureSheet getType() { + return ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT; + } + + @Environment(EnvType.CLIENT) + public static class SmaragdantParticleFactory implements ParticleFactory { + + private final SpriteProvider sprites; + + public SmaragdantParticleFactory(SpriteProvider sprites) { + this.sprites = sprites; + } + + @Override + public Particle createParticle(DefaultParticleType type, ClientWorld world, double x, double y, double z, double vX, double vY, double vZ) { + return new SmaragdantParticle(world, x, y, z, 1, 1, 1, sprites); + } + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/patterns/Patterns.java b/src/main/java/ru/betterend/patterns/Patterns.java index e478035c..d37b63e8 100644 --- a/src/main/java/ru/betterend/patterns/Patterns.java +++ b/src/main/java/ru/betterend/patterns/Patterns.java @@ -46,6 +46,7 @@ public class Patterns { public final static Identifier STATE_CHANDELIER = BetterEnd.makeID("patterns/blockstate/chandelier.json"); public final static Identifier STATE_FURNACE = BetterEnd.makeID("patterns/blockstate/furnace.json"); public final static Identifier STATE_ROTATED_TOP = BetterEnd.makeID("patterns/blockstate/rotated_top.json"); + public final static Identifier STATE_STALACTITE = BetterEnd.makeID("patterns/blockstate/stalactite.json"); //Models Block public final static Identifier BLOCK_EMPTY = BetterEnd.makeID("patterns/block/empty.json"); @@ -104,6 +105,17 @@ public class Patterns { public final static Identifier BLOCK_TOP_SIDE_BOTTOM = BetterEnd.makeID("patterns/block/top_side_bottom.json"); public final static Identifier BLOCK_PATH = BetterEnd.makeID("patterns/block/path.json"); + public final static Identifier[] BLOCKS_STALACTITE = new Identifier[] { + BetterEnd.makeID("patterns/block/stalactite_0.json"), + BetterEnd.makeID("patterns/block/stalactite_1.json"), + BetterEnd.makeID("patterns/block/stalactite_2.json"), + BetterEnd.makeID("patterns/block/stalactite_3.json"), + BetterEnd.makeID("patterns/block/stalactite_4.json"), + BetterEnd.makeID("patterns/block/stalactite_5.json"), + BetterEnd.makeID("patterns/block/stalactite_6.json"), + BetterEnd.makeID("patterns/block/stalactite_7.json") + }; + //Models Item public final static Identifier ITEM_WALL = BetterEnd.makeID("patterns/item/pattern_wall.json"); public final static Identifier ITEM_FENCE = BetterEnd.makeID("patterns/item/pattern_fence.json"); diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 7b60dd55..f205e461 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -107,6 +107,7 @@ import ru.betterend.blocks.basis.EndUnderwaterWallPlantBlock; import ru.betterend.blocks.basis.EndWallPlantBlock; import ru.betterend.blocks.basis.FurBlock; import ru.betterend.blocks.basis.SimpleLeavesBlock; +import ru.betterend.blocks.basis.StalactiteBlock; import ru.betterend.blocks.basis.StoneLanternBlock; import ru.betterend.blocks.basis.VineBlock; import ru.betterend.blocks.basis.WallMushroomBlock; @@ -177,6 +178,8 @@ public class EndBlocks { public static final Block DENSE_EMERALD_ICE = registerBlock("dense_emerald_ice", new DenseEmeraldIceBlock()); public static final Block ANCIENT_EMERALD_ICE = registerBlock("ancient_emerald_ice", new AncientEmeraldIceBlock()); + public static final Block END_STONE_STALACTITE = registerBlock("end_stone_stalactite", new StalactiteBlock(Blocks.END_STONE)); + // Wooden Materials And Trees // public static final Block MOSSY_GLOWSHROOM_SAPLING = registerBlock("mossy_glowshroom_sapling", new MossyGlowshroomSaplingBlock()); public static final Block MOSSY_GLOWSHROOM_CAP = registerBlock("mossy_glowshroom_cap", new MossyGlowshroomCapBlock()); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 3a6ee8da..0e4e1abf 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -5,6 +5,7 @@ import java.util.function.Supplier; import com.google.common.collect.Lists; +import net.minecraft.block.Blocks; import net.minecraft.util.Identifier; import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.GenerationStep; @@ -45,9 +46,10 @@ import ru.betterend.world.features.terrain.GeyserFeature; import ru.betterend.world.features.terrain.IceStarFeature; import ru.betterend.world.features.terrain.ObsidianBoulderFeature; import ru.betterend.world.features.terrain.ObsidianPillarBasementFeature; +import ru.betterend.world.features.terrain.SingleBlockFeature; import ru.betterend.world.features.terrain.SmaragdantCrystalFeature; -import ru.betterend.world.features.terrain.SmaragdantCrystalShardFeature; import ru.betterend.world.features.terrain.SpireFeature; +import ru.betterend.world.features.terrain.StalactiteFeature; import ru.betterend.world.features.terrain.SulphurHillFeature; import ru.betterend.world.features.terrain.SulphuricCaveFeature; import ru.betterend.world.features.terrain.SulphuricLakeFeature; @@ -191,8 +193,12 @@ public class EndFeatures { // Caves public static final DefaultFeature SMARAGDANT_CRYSTAL = new SmaragdantCrystalFeature(); - public static final DefaultFeature SMARAGDANT_CRYSTAL_SHARD = new SmaragdantCrystalShardFeature(); + public static final DefaultFeature SMARAGDANT_CRYSTAL_SHARD = new SingleBlockFeature(EndBlocks.SMARAGDANT_CRYSTAL_SHARD); public static final DefaultFeature BIG_AURORA_CRYSTAL = new BigAuroraCrystalFeature(); + public static final DefaultFeature CAVE_BUSH = new BushFeature(EndBlocks.CAVE_BUSH, EndBlocks.CAVE_BUSH); + public static final DefaultFeature CAVE_GRASS = new SingleBlockFeature(EndBlocks.CAVE_GRASS); + public static final DefaultFeature END_STONE_STALACTITE = new StalactiteFeature(true, EndBlocks.END_STONE_STALACTITE, Blocks.END_STONE); + public static final DefaultFeature END_STONE_STALAGMITE = new StalactiteFeature(false, EndBlocks.END_STONE_STALACTITE, Blocks.END_STONE); public static void registerBiomeFeatures(Identifier id, Biome biome, List>>> features) { if (id.getNamespace().equals(BetterEnd.MOD_ID)) { diff --git a/src/main/java/ru/betterend/registry/EndParticles.java b/src/main/java/ru/betterend/registry/EndParticles.java index 05defbc7..ee8c6a2e 100644 --- a/src/main/java/ru/betterend/registry/EndParticles.java +++ b/src/main/java/ru/betterend/registry/EndParticles.java @@ -18,6 +18,7 @@ import ru.betterend.particle.ParticleSnowflake; import ru.betterend.particle.ParticleSulphur; import ru.betterend.particle.ParticleTenaneaPetal; import ru.betterend.particle.PaticlePortalSphere; +import ru.betterend.particle.SmaragdantParticle; public class EndParticles { public static final DefaultParticleType GLOWING_SPHERE = register("glowing_sphere"); @@ -31,6 +32,7 @@ public class EndParticles { public static final DefaultParticleType TENANEA_PETAL = register("tenanea_petal"); public static final DefaultParticleType JUNGLE_SPORE = register("jungle_spore"); public static final DefaultParticleType FIREFLY = register("firefly"); + public static final DefaultParticleType SMARAGDANT = register("smaragdant_particle"); public static void register() { ParticleFactoryRegistry.getInstance().register(GLOWING_SPHERE, ParticleGlowingSphere.FactoryGlowingSphere::new); @@ -44,6 +46,7 @@ public class EndParticles { ParticleFactoryRegistry.getInstance().register(TENANEA_PETAL, ParticleTenaneaPetal.FactoryTenaneaPetal::new); ParticleFactoryRegistry.getInstance().register(JUNGLE_SPORE, ParticleJungleSpore.FactoryJungleSpore::new); ParticleFactoryRegistry.getInstance().register(FIREFLY, FireflyParticle.FireflyParticleFactory::new); + ParticleFactoryRegistry.getInstance().register(SMARAGDANT, SmaragdantParticle.SmaragdantParticleFactory::new); } private static DefaultParticleType register(String name) { diff --git a/src/main/java/ru/betterend/util/BlocksHelper.java b/src/main/java/ru/betterend/util/BlocksHelper.java index 2708d51c..c26ded02 100644 --- a/src/main/java/ru/betterend/util/BlocksHelper.java +++ b/src/main/java/ru/betterend/util/BlocksHelper.java @@ -24,6 +24,7 @@ import net.minecraft.world.WorldAccess; import ru.betterend.blocks.BlueVineBlock; import ru.betterend.blocks.basis.DoublePlantBlock; import ru.betterend.blocks.basis.FurBlock; +import ru.betterend.blocks.basis.StalactiteBlock; import ru.betterend.blocks.basis.VineBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -207,6 +208,24 @@ public class BlocksHelper { } } } + else if (state.getBlock() instanceof StalactiteBlock) { + if (!state.canPlaceAt(world, POS)) { + if (world.getBlockState(POS.up()).getBlock() instanceof StalactiteBlock) { + while (state.getBlock() instanceof StalactiteBlock) { + setWithoutUpdate(world, POS, AIR); + POS.setY(POS.getY() + 1); + state = world.getBlockState(POS); + } + } + else { + while (state.getBlock() instanceof StalactiteBlock) { + setWithoutUpdate(world, POS, AIR); + POS.setY(POS.getY() - 1); + state = world.getBlockState(POS); + } + } + } + } else if (!state.canPlaceAt(world, POS)) { // Chorus if (state.isOf(Blocks.CHORUS_PLANT)) { diff --git a/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java index 333f219e..2966bcca 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java @@ -14,11 +14,19 @@ public class EmptyAuroraCaveBiome extends EndCaveBiome { .setWaterAndFogColor(186, 77, 237) .setMusic(EndSounds.MUSIC_FOREST) .setParticles(EndParticles.GLOWING_SPHERE, 0.001F)); + this.addFloorFeature(EndFeatures.BIG_AURORA_CRYSTAL, 1); + + this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); } @Override public float getFloorDensity() { return 0.01F; } + + @Override + public float getCeilDensity() { + return 0.1F; + } } diff --git a/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java index 1a99264e..9c5be371 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java @@ -1,5 +1,6 @@ package ru.betterend.world.biome.cave; +import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.land.BiomeDefinition; @@ -8,5 +9,18 @@ public class EmptyEndCaveBiome extends EndCaveBiome { super(new BiomeDefinition("empty_end_cave") .setFogDensity(2.0F) .setMusic(EndSounds.MUSIC_FOREST)); + + this.addFloorFeature(EndFeatures.END_STONE_STALAGMITE, 1); + this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); + } + + @Override + public float getFloorDensity() { + return 0.1F; + } + + @Override + public float getCeilDensity() { + return 0.1F; } } diff --git a/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java index 27997f02..bf73fbeb 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java @@ -13,13 +13,21 @@ public class EmptySmaragdantCaveBiome extends EndCaveBiome { .setPlantsColor(0, 131, 145) .setWaterAndFogColor(31, 167, 212) .setMusic(EndSounds.MUSIC_FOREST) - .setParticles(EndParticles.FIREFLY, 0.001F)); + .setParticles(EndParticles.SMARAGDANT, 0.001F)); + this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL, 1); this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL_SHARD, 20); + + this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); } @Override public float getFloorDensity() { return 0.1F; } + + @Override + public float getCeilDensity() { + return 0.1F; + } } diff --git a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java index f5464047..b9a5b338 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java @@ -34,4 +34,8 @@ public class EndCaveBiome extends EndBiome { public float getFloorDensity() { return 0; } + + public float getCeilDensity() { + return 0; + } } diff --git a/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java index aca05285..dadec7aa 100644 --- a/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java @@ -16,11 +16,21 @@ public class LushAuroraCaveBiome extends EndCaveBiome { .setMusic(EndSounds.MUSIC_FOREST) .setParticles(EndParticles.GLOWING_SPHERE, 0.001F) .setSurface(EndBlocks.CAVE_MOSS)); + this.addFloorFeature(EndFeatures.BIG_AURORA_CRYSTAL, 1); + this.addFloorFeature(EndFeatures.CAVE_BUSH, 10); + this.addFloorFeature(EndFeatures.CAVE_GRASS, 40); + + this.addCeilFeature(EndFeatures.CAVE_BUSH, 1); } @Override public float getFloorDensity() { - return 0.01F; + return 0.1F; + } + + @Override + public float getCeilDensity() { + return 0.03F; } } diff --git a/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java index ad3d39cd..c821f6a5 100644 --- a/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java @@ -14,14 +14,22 @@ public class LushSmaragdantCaveBiome extends EndCaveBiome { .setPlantsColor(0, 131, 145) .setWaterAndFogColor(31, 167, 212) .setMusic(EndSounds.MUSIC_FOREST) - .setParticles(EndParticles.FIREFLY, 0.001F) + .setParticles(EndParticles.SMARAGDANT, 0.001F) .setSurface(EndBlocks.CAVE_MOSS)); + this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL, 1); this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL_SHARD, 20); + + this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); } @Override public float getFloorDensity() { return 0.1F; } + + @Override + public float getCeilDensity() { + return 0.1F; + } } diff --git a/src/main/java/ru/betterend/world/features/bushes/BushFeature.java b/src/main/java/ru/betterend/world/features/bushes/BushFeature.java index 3c6e20bd..c7248e0b 100644 --- a/src/main/java/ru/betterend/world/features/bushes/BushFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/BushFeature.java @@ -63,7 +63,12 @@ public class BushFeature extends DefaultFeature { for (Direction d: Direction.values()) { BlockPos p = pos.offset(d); if (world.isAir(p)) { - BlocksHelper.setWithoutUpdate(world, p, leaves.getDefaultState().with(LeavesBlock.DISTANCE, 1)); + if (leaves instanceof LeavesBlock) { + BlocksHelper.setWithoutUpdate(world, p, leaves.getDefaultState().with(LeavesBlock.DISTANCE, 1)); + } + else { + BlocksHelper.setWithoutUpdate(world, p, leaves.getDefaultState()); + } } } diff --git a/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalShardFeature.java b/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java similarity index 59% rename from src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalShardFeature.java rename to src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java index 38b4a5f5..fd9396ac 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalShardFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java @@ -2,27 +2,36 @@ package ru.betterend.world.features.terrain; import java.util.Random; +import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.state.property.Properties; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; import ru.betterend.world.features.DefaultFeature; -public class SmaragdantCrystalShardFeature extends DefaultFeature { +public class SingleBlockFeature extends DefaultFeature { + private final Block block; + + public SingleBlockFeature(Block block) { + this.block = block; + } + @Override public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { if (!world.getBlockState(pos.down()).isIn(EndTags.GEN_TERRAIN)) { return false; } - BlockState shard = EndBlocks.SMARAGDANT_CRYSTAL_SHARD.getDefaultState(); - boolean waterlogged = !world.getFluidState(pos).isEmpty(); - BlocksHelper.setWithoutUpdate(world, pos, shard.with(Properties.WATERLOGGED, waterlogged)); + BlockState state = block.getDefaultState(); + if (block.getStateManager().getProperty("waterlogged") != null) { + boolean waterlogged = !world.getFluidState(pos).isEmpty(); + state = state.with(Properties.WATERLOGGED, waterlogged); + } + BlocksHelper.setWithoutUpdate(world, pos, state); return true; } diff --git a/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java b/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java index a4e4f799..ef652d54 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java @@ -40,13 +40,8 @@ public class SmaragdantCrystalFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, mut, crystal); mut.setY(mut.getY() + 1); } - if (random.nextBoolean()) { - boolean waterlogged = !world.getFluidState(mut).isEmpty(); - BlocksHelper.setWithoutUpdate(world, mut, shard.with(Properties.WATERLOGGED, waterlogged)); - } - else { - BlocksHelper.setWithoutUpdate(world, mut, crystal); - } + boolean waterlogged = !world.getFluidState(mut).isEmpty(); + BlocksHelper.setWithoutUpdate(world, mut, shard.with(Properties.WATERLOGGED, waterlogged)); } } } diff --git a/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java b/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java new file mode 100644 index 00000000..a8093cc5 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java @@ -0,0 +1,68 @@ +package ru.betterend.world.features.terrain; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.blocks.basis.StalactiteBlock; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.world.features.DefaultFeature; + +public class StalactiteFeature extends DefaultFeature { + private final boolean ceiling; + private final Block[] ground; + private final Block block; + + public StalactiteFeature(boolean ceiling, Block block, Block... ground) { + this.ceiling = ceiling; + this.ground = ground; + this.block = block; + } + + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + if (!isGround(world.getBlockState(ceiling ? pos.up() : pos.down()).getBlock())) { + return false; + } + + Mutable mut = new Mutable().set(pos); + int height = random.nextInt(8); + int dir = ceiling ? -1 : 1; + boolean stalagnate = false; + + for (int i = 1; i <= height; i++) { + mut.setY(pos.getY() + i * dir); + BlockState state = world.getBlockState(mut); + if (!state.isAir()) { + stalagnate = state.isIn(EndTags.GEN_TERRAIN); + height = i - 1; + break; + } + } + + int center = stalagnate ? height >> 1 : 0; + for (int i = 0; i < height; i++) { + mut.setY(pos.getY() + i * dir); + int size = stalagnate ? MathHelper.abs(i - center) + 1 : height - i - 1; + BlocksHelper.setWithoutUpdate(world, mut, block.getDefaultState().with(StalactiteBlock.SIZE, size)); + } + + return true; + } + + private boolean isGround(Block block) { + for (Block b : ground) { + if (b == block) { + return true; + } + } + return false; + } +} 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 dc07b6a5..d41efa0d 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 @@ -52,23 +52,31 @@ public abstract class EndCaveFeature extends DefaultFeature { Set caveBlocks = generate(world, center, radius, random); if (!caveBlocks.isEmpty()) { if (biome != null) { + boolean fillFloor = biome.getFloorDensity() > 0; + boolean fillCeil = biome.getCeilDensity() > 0; setBiomes(world, biome, caveBlocks); Set floorPositions = Sets.newHashSet(); Set ceilPositions = Sets.newHashSet(); Mutable mut = new Mutable(); - caveBlocks.forEach((bpos) -> { - mut.set(bpos); - if (world.getBlockState(mut).getMaterial().isReplaceable()) { - mut.setY(bpos.getY() - 1); - if (world.getBlockState(mut).isIn(EndTags.GEN_TERRAIN)) { - floorPositions.add(mut.toImmutable()); + if (fillFloor || fillCeil) { + caveBlocks.forEach((bpos) -> { + mut.set(bpos); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + if (fillFloor) { + mut.setY(bpos.getY() - 1); + if (world.getBlockState(mut).isIn(EndTags.GEN_TERRAIN)) { + floorPositions.add(mut.toImmutable()); + } + } + if (fillCeil) { + mut.setY(bpos.getY() + 1); + if (world.getBlockState(mut).isIn(EndTags.GEN_TERRAIN)) { + ceilPositions.add(mut.toImmutable()); + } + } } - mut.setY(bpos.getY() + 1); - if (world.getBlockState(mut).isIn(EndTags.GEN_TERRAIN)) { - ceilPositions.add(mut.toImmutable()); - } - } - }); + }); + } BlockState surfaceBlock = biome.getBiome().getGenerationSettings().getSurfaceConfig().getTopMaterial(); placeFloor(world, biome, floorPositions, random, surfaceBlock); placeCeil(world, biome, ceilPositions, random); @@ -100,7 +108,17 @@ public abstract class EndCaveFeature extends DefaultFeature { } protected void placeCeil(StructureWorldAccess world, EndCaveBiome biome, Set ceilPositions, Random random) { - + float density = biome.getCeilDensity(); + if (density > 0) { + ceilPositions.forEach((pos) -> { + if (random.nextFloat() <= density) { + Feature feature = biome.getCeilFeature(random); + if (feature != null) { + feature.generate(world, null, random, pos.down(), null); + } + } + }); + } } protected void setBiomes(StructureWorldAccess world, EndCaveBiome biome, Set blocks) { diff --git a/src/main/resources/assets/betterend/particles/smaragdant_particle.json b/src/main/resources/assets/betterend/particles/smaragdant_particle.json new file mode 100644 index 00000000..774ebb76 --- /dev/null +++ b/src/main/resources/assets/betterend/particles/smaragdant_particle.json @@ -0,0 +1,13 @@ +{ + "textures": [ + "betterend:smaragdant_particle_1", + "betterend:smaragdant_particle_2", + "betterend:smaragdant_particle_3", + "betterend:smaragdant_particle_4", + "betterend:smaragdant_particle_5", + "betterend:smaragdant_particle_6", + "betterend:smaragdant_particle_7", + "betterend:smaragdant_particle_8", + "betterend:smaragdant_particle_9" + ] +} diff --git a/src/main/resources/assets/betterend/patterns/block/stalactite_0.json b/src/main/resources/assets/betterend/patterns/block/stalactite_0.json new file mode 100644 index 00000000..7ab88f13 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/stalactite_0.json @@ -0,0 +1,23 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "%texture%", + "texture": "%texture%" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 7, 0, 7 ], + "to": [ 9, 16, 9 ], + "faces": { + "down": { "uv": [ 7, 7, 9, 9 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 7, 7, 9, 9 ], "texture": "#texture", "cullface": "up" }, + "north": { "uv": [ 7, 0, 9, 16 ], "texture": "#texture" }, + "south": { "uv": [ 7, 0, 9, 16 ], "texture": "#texture" }, + "west": { "uv": [ 7, 0, 9, 16 ], "texture": "#texture" }, + "east": { "uv": [ 7, 0, 9, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/stalactite_1.json b/src/main/resources/assets/betterend/patterns/block/stalactite_1.json new file mode 100644 index 00000000..4dee3472 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/stalactite_1.json @@ -0,0 +1,23 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "%texture%", + "texture": "%texture%" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 6, 0, 6 ], + "to": [ 10, 16, 10 ], + "faces": { + "down": { "uv": [ 6, 6, 10, 10 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 6, 6, 10, 10 ], "texture": "#texture", "cullface": "up" }, + "north": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, + "south": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, + "west": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, + "east": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/stalactite_2.json b/src/main/resources/assets/betterend/patterns/block/stalactite_2.json new file mode 100644 index 00000000..f2ba501e --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/stalactite_2.json @@ -0,0 +1,23 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "%texture%", + "texture": "%texture%" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 5, 0, 5 ], + "to": [ 11, 16, 11 ], + "faces": { + "down": { "uv": [ 5, 5, 11, 11 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 5, 5, 11, 11 ], "texture": "#texture", "cullface": "up" }, + "north": { "uv": [ 5, 0, 11, 16 ], "texture": "#texture" }, + "south": { "uv": [ 5, 0, 11, 16 ], "texture": "#texture" }, + "west": { "uv": [ 5, 0, 11, 16 ], "texture": "#texture" }, + "east": { "uv": [ 5, 0, 11, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/stalactite_3.json b/src/main/resources/assets/betterend/patterns/block/stalactite_3.json new file mode 100644 index 00000000..39bf5888 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/stalactite_3.json @@ -0,0 +1,23 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "%texture%", + "texture": "%texture%" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 4, 0, 4 ], + "to": [ 12, 16, 12 ], + "faces": { + "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#texture", "cullface": "up" }, + "north": { "uv": [ 4, 0, 12, 16 ], "texture": "#texture" }, + "south": { "uv": [ 4, 0, 12, 16 ], "texture": "#texture" }, + "west": { "uv": [ 4, 0, 12, 16 ], "texture": "#texture" }, + "east": { "uv": [ 4, 0, 12, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/stalactite_4.json b/src/main/resources/assets/betterend/patterns/block/stalactite_4.json new file mode 100644 index 00000000..0e4b94ff --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/stalactite_4.json @@ -0,0 +1,23 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "%texture%", + "texture": "%texture%" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 3, 0, 3 ], + "to": [ 13, 16, 13 ], + "faces": { + "down": { "uv": [ 3, 3, 13, 13 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 3, 3, 13, 13 ], "texture": "#texture", "cullface": "up" }, + "north": { "uv": [ 3, 0, 13, 16 ], "texture": "#texture" }, + "south": { "uv": [ 3, 0, 13, 16 ], "texture": "#texture" }, + "west": { "uv": [ 3, 0, 13, 16 ], "texture": "#texture" }, + "east": { "uv": [ 3, 0, 13, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/stalactite_5.json b/src/main/resources/assets/betterend/patterns/block/stalactite_5.json new file mode 100644 index 00000000..ffad125b --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/stalactite_5.json @@ -0,0 +1,23 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "%texture%", + "texture": "%texture%" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 2, 0, 2 ], + "to": [ 14, 16, 14 ], + "faces": { + "down": { "uv": [ 2, 2, 14, 14 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 2, 2, 14, 14 ], "texture": "#texture", "cullface": "up" }, + "north": { "uv": [ 2, 0, 14, 16 ], "texture": "#texture" }, + "south": { "uv": [ 2, 0, 14, 16 ], "texture": "#texture" }, + "west": { "uv": [ 2, 0, 14, 16 ], "texture": "#texture" }, + "east": { "uv": [ 2, 0, 14, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/stalactite_6.json b/src/main/resources/assets/betterend/patterns/block/stalactite_6.json new file mode 100644 index 00000000..75f30db0 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/stalactite_6.json @@ -0,0 +1,23 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "%texture%", + "texture": "%texture%" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 1, 0, 1 ], + "to": [ 15, 16, 15 ], + "faces": { + "down": { "uv": [ 1, 1, 15, 15 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 1, 1, 15, 15 ], "texture": "#texture", "cullface": "up" }, + "north": { "uv": [ 1, 0, 15, 16 ], "texture": "#texture" }, + "south": { "uv": [ 1, 0, 15, 16 ], "texture": "#texture" }, + "west": { "uv": [ 1, 0, 15, 16 ], "texture": "#texture" }, + "east": { "uv": [ 1, 0, 15, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/stalactite_7.json b/src/main/resources/assets/betterend/patterns/block/stalactite_7.json new file mode 100644 index 00000000..9fc0cdd5 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/stalactite_7.json @@ -0,0 +1,23 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "%texture%", + "texture": "%texture%" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "cullface": "up" }, + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "cullface": "north" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "cullface": "south" }, + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "cullface": "west" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "cullface": "east" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/blockstate/stalactite.json b/src/main/resources/assets/betterend/patterns/blockstate/stalactite.json new file mode 100644 index 00000000..9d093574 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/blockstate/stalactite.json @@ -0,0 +1,13 @@ +{ + "variants": + { + "size=0": { "model": "betterend:pattern/%block%/%block%_0" }, + "size=1": { "model": "betterend:pattern/%block%/%block%_1" }, + "size=2": { "model": "betterend:pattern/%block%/%block%_2" }, + "size=3": { "model": "betterend:pattern/%block%/%block%_3" }, + "size=4": { "model": "betterend:pattern/%block%/%block%_4" }, + "size=5": { "model": "betterend:pattern/%block%/%block%_5" }, + "size=6": { "model": "betterend:pattern/%block%/%block%_6" }, + "size=7": { "model": "betterend:pattern/%block%/%block%_7" } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal.png deleted file mode 100644 index 6ee675aa88693e7f049f557b47dc1c0a69e962fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~i2$DvS0K&c zlg1F6%TQFs&{@r}pq1gwGKTlFbtPlA1En}hg8YIR{zJgkQz1q`v1(5j#}J9BzUKq^ z8Vq=tE^KwE{x9uqo$T}N@nyz&Dw~vogglRUs-k44ofy`glX(f`NCfzVxB_Vg zpEQQpT!x}5hR$k+1+5HcmNC4att%O`9Vo?7666=m@E-!Mo(eGniV1kSIEHY{Oinn! cedD9IGSJj?1`d-<(zopr0QZL|f&c&j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_2.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_2.png new file mode 100644 index 0000000000000000000000000000000000000000..b05a98ef2bce9149e2b89c6873a684865915cc05 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^93afW3?x5a^xFxf7>k44ofy`glX(f`NCfzVxB_Vg zpEQQpT!x}5hR$k+1+5HcmNC4att%O`9Vo?7666=m@E-!Mo(eGniivo-IEHY{Oinn! hb|cY5+Ikj;9s>jGE(T?Hgk44ofy`glX(f`NCfzVxB_Vg zpEQQpT!x}5hR$k+1+5HcmNC4att%O`9Vo?7666=m@E-!Mo(eGnib;FAIEHY{OiplM pdSk#QJ>~qdQ^)$0nwGGMGB9vvGFa)QSrmYb^>p=fS?83{1OWGdEcgHb literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_4.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_4.png new file mode 100644 index 0000000000000000000000000000000000000000..40d53e7b463e055b7c200b3f8ca1781da39e85ca GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^93afW3?x5a^xFxf7>k44ofy`glX(f`NCfzVxB_Vg zpEQQpT!x}5hR$k+1+5HcmNC4att%O`9Vo?7666=m@E-!Mo(eGniYa@#IEHY{OiloT w^ads~iL+d38#iyk44ofy`glX(f`NCfzVxB_Vg zpEQQpT!x}5hR$k+1+5HcmNC4att%O`9Vo?7666=m@E-!Mo(eGniYa@#IEHY{OiloT w;8#it;*t}trVyD7N#}`b@47`&WLUgWv3IQ4K>FVdQ&MBb@0HxG1%m4rY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_6.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_6.png new file mode 100644 index 0000000000000000000000000000000000000000..76c7a56f140a087a21dba5e2190d93d0a0dc4ac9 GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^93afW3?x5a^xFxf7>k44ofy`glX(f`NCfzVxB_Vg zpEQQpT!x}5hR$k+1+5HcmNC4att%O`9Vo?7666=m@E-!Mo(eGniYa@#IEHY{OiloT w)CMLoiL*Ru8#fsk8*bj9)Tyx2@dXnz1J^AE=dXTVA3(-?y85}Sb4q9e0E6=}0{{R3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_7.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_7.png new file mode 100644 index 0000000000000000000000000000000000000000..248953f74fc5a5992080c14a65e7d8ffd0ecbac2 GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^93afW3?x5a^xFxf7>k44ofy`glX(f`NCfzVxB_Vg zpEQQpT!x}5hR$k+1+5HcmNC4att%O`9Vo?7666=m@E-!Mo(eGnim7?JIEHY{OiloT zLk44ofy`glX(f`NCfzVxB_Vg zpEQQpT!x}5hR$k+1+5HcmNC4att%O`9Vo?7666=m@E-!Mo(eGniphJrIEHY{OiloT rBnIX*0~aPA1vz8kO#+joL<-p$STh(D-+r%M2{PK#)z4*}Q$iB}V$dwD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_9.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_9.png new file mode 100644 index 0000000000000000000000000000000000000000..6ff4d9811ddd80595e86dd617d284072fc431d1f GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^93afW3?x5a^xFxf7>k44ofy`glX(f`NCfzVxB_Vg zpEQQpT!x}5hR$k+1+5HcmNC4att%O`9Vo?7666=m@E-!Mo(eGniphAoIEHY{OiloT o6b5EBjW%XCl}U`wyj>Q|3``~ryx-qXcnC7r)78&qol`;+0N>{;@&Et; literal 0 HcmV?d00001 From 0739e0580b5018f9135fc44ac397f30d9f470f33 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 9 Mar 2021 15:54:51 +0300 Subject: [PATCH 315/463] Stalactite enhancements (WIP) --- .../betterend/blocks/basis/EndSignBlock.java | 8 +- .../blocks/basis/FeatureSaplingBlock.java | 2 +- .../blocks/basis/StalactiteBlock.java | 100 +++++++++++++++--- .../java/ru/betterend/patterns/Patterns.java | 14 +-- .../features/terrain/StalactiteFeature.java | 10 +- .../block/{sapling.json => cross.json} | 0 .../patterns/block/cross_shaded.json | 25 +++++ .../patterns/block/stone_stalactite_1.json | 44 ++++++++ .../patterns/block/stone_stalactite_2.json | 44 ++++++++ .../patterns/block/stone_stalactite_3.json | 44 ++++++++ .../patterns/blockstate/stalactite.json | 24 +++-- .../textures/block/end_stone_stalactite_0.png | Bin 0 -> 171 bytes .../textures/block/end_stone_stalactite_1.png | Bin 0 -> 181 bytes .../textures/block/end_stone_stalactite_2.png | Bin 0 -> 190 bytes .../textures/block/end_stone_stalactite_3.png | Bin 0 -> 186 bytes .../textures/block/end_stone_stalactite_4.png | Bin 0 -> 199 bytes .../textures/block/end_stone_stalactite_5.png | Bin 0 -> 197 bytes .../textures/block/end_stone_stalactite_6.png | Bin 0 -> 214 bytes .../textures/block/end_stone_stalactite_7.png | Bin 0 -> 213 bytes 19 files changed, 272 insertions(+), 43 deletions(-) rename src/main/resources/assets/betterend/patterns/block/{sapling.json => cross.json} (100%) create mode 100644 src/main/resources/assets/betterend/patterns/block/cross_shaded.json create mode 100644 src/main/resources/assets/betterend/patterns/block/stone_stalactite_1.json create mode 100644 src/main/resources/assets/betterend/patterns/block/stone_stalactite_2.json create mode 100644 src/main/resources/assets/betterend/patterns/block/stone_stalactite_3.json create mode 100644 src/main/resources/assets/betterend/textures/block/end_stone_stalactite_0.png create mode 100644 src/main/resources/assets/betterend/textures/block/end_stone_stalactite_1.png create mode 100644 src/main/resources/assets/betterend/textures/block/end_stone_stalactite_2.png create mode 100644 src/main/resources/assets/betterend/textures/block/end_stone_stalactite_3.png create mode 100644 src/main/resources/assets/betterend/textures/block/end_stone_stalactite_4.png create mode 100644 src/main/resources/assets/betterend/textures/block/end_stone_stalactite_5.png create mode 100644 src/main/resources/assets/betterend/textures/block/end_stone_stalactite_6.png create mode 100644 src/main/resources/assets/betterend/textures/block/end_stone_stalactite_7.png diff --git a/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java b/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java index 0a7c8d6b..ac4b6c4d 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java @@ -102,8 +102,7 @@ public class EndSignBlock extends AbstractSignBlock implements BlockPatterned { } @Override - public void onPlaced(World world, BlockPos pos, BlockState state, LivingEntity placer, - ItemStack itemStack) { + public void onPlaced(World world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { if (placer != null && placer instanceof PlayerEntity) { ESignBlockEntity sign = (ESignBlockEntity) world.getBlockEntity(pos); if (!world.isClient) { @@ -124,7 +123,7 @@ public class EndSignBlock extends AbstractSignBlock implements BlockPatterned { } return super.getStateForNeighborUpdate(state, facing, neighborState, world, pos, neighborPos); } - + @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { if (!state.get(FLOOR)) { @@ -143,7 +142,8 @@ public class EndSignBlock extends AbstractSignBlock implements BlockPatterned { return this.getDefaultState().with(FLOOR, true) .with(ROTATION, MathHelper.floor((180.0 + ctx.getPlayerYaw() * 16.0 / 360.0) + 0.5 - 12) & 15) .with(WATERLOGGED, fluidState.getFluid() == Fluids.WATER); - } else if (ctx.getSide() != Direction.DOWN) { + } + else if (ctx.getSide() != Direction.DOWN) { BlockState blockState = this.getDefaultState(); FluidState fluidState = ctx.getWorld().getFluidState(ctx.getBlockPos()); WorldView worldView = ctx.getWorld(); diff --git a/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java b/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java index 7dcf202e..c5bcb65b 100644 --- a/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java @@ -109,7 +109,7 @@ public abstract class FeatureSaplingBlock extends BlockBaseNotFull implements Fe block = block.split("/")[1]; return Patterns.createJson(Patterns.ITEM_BLOCK, block); } - return Patterns.createJson(Patterns.BLOCK_SAPLING, block); + return Patterns.createJson(Patterns.BLOCK_CROSS, block); } @Override diff --git a/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java b/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java index 9a7f60ac..d4d74dd4 100644 --- a/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java @@ -4,11 +4,19 @@ import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.block.FluidFillable; import net.minecraft.block.ShapeContext; +import net.minecraft.block.Waterloggable; import net.minecraft.entity.LivingEntity; +import net.minecraft.fluid.Fluid; +import net.minecraft.fluid.FluidState; +import net.minecraft.fluid.Fluids; +import net.minecraft.item.ItemPlacementContext; import net.minecraft.item.ItemStack; import net.minecraft.state.StateManager; +import net.minecraft.state.property.BooleanProperty; import net.minecraft.state.property.IntProperty; +import net.minecraft.state.property.Properties; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos.Mutable; @@ -20,29 +28,62 @@ import net.minecraft.world.World; import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.Patterns; -public class StalactiteBlock extends BlockBaseNotFull { +public class StalactiteBlock extends BlockBaseNotFull implements Waterloggable, FluidFillable, IRenderTypeable { + public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; + public static final BooleanProperty IS_FLOOR = BlockProperties.IS_FLOOR; public static final IntProperty SIZE = BlockProperties.SIZE; private static final Mutable POS = new Mutable(); private static final VoxelShape[] SHAPES; - private final Block source; public StalactiteBlock(Block source) { super(FabricBlockSettings.copy(source).nonOpaque()); - this.setDefaultState(getStateManager().getDefaultState().with(SIZE, 0)); - this.source = source; + this.setDefaultState(getStateManager().getDefaultState().with(SIZE, 0).with(IS_FLOOR, true).with(WATERLOGGED, false)); } @Override protected void appendProperties(StateManager.Builder stateManager) { - stateManager.add(SIZE); + stateManager.add(WATERLOGGED, IS_FLOOR, SIZE); } @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { return SHAPES[state.get(SIZE)]; } + + @Override + public BlockState getPlacementState(ItemPlacementContext ctx) { + WorldView worldView = ctx.getWorld(); + BlockPos blockPos = ctx.getBlockPos(); + Direction dir = ctx.getSide(); + boolean water = worldView.getFluidState(blockPos).getFluid() == Fluids.WATER; + + if (dir == Direction.UP) { + if (sideCoversSmallSquare(worldView, blockPos.up(), Direction.DOWN)) { + return getDefaultState().with(IS_FLOOR, false).with(WATERLOGGED, water); + } + else if (sideCoversSmallSquare(worldView, blockPos.down(), Direction.UP)) { + return getDefaultState().with(IS_FLOOR, true).with(WATERLOGGED, water); + } + else { + return null; + } + } + else { + if (sideCoversSmallSquare(worldView, blockPos.up(), Direction.DOWN)) { + return getDefaultState().with(IS_FLOOR, false).with(WATERLOGGED, water); + } + else if (sideCoversSmallSquare(worldView, blockPos.down(), Direction.UP)) { + return getDefaultState().with(IS_FLOOR, true).with(WATERLOGGED, water); + } + else { + return null; + } + } + } @Override public void onPlaced(World world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { @@ -55,7 +96,7 @@ public class StalactiteBlock extends BlockBaseNotFull { BlockState state2 = world.getBlockState(POS); int size = state2.get(SIZE); if (size < i) { - world.setBlockState(POS, state2.with(SIZE, i)); + world.setBlockState(POS, state2.with(SIZE, i).with(IS_FLOOR, true)); } else { break; @@ -75,7 +116,7 @@ public class StalactiteBlock extends BlockBaseNotFull { BlockState state2 = world.getBlockState(POS); int size = state2.get(SIZE); if (size < i) { - world.setBlockState(POS, state2.with(SIZE, i)); + world.setBlockState(POS, state2.with(SIZE, i).with(IS_FLOOR, false)); } else { break; @@ -94,18 +135,29 @@ public class StalactiteBlock extends BlockBaseNotFull { return Blocks.AIR.getDefaultState(); } else { + if (checkUp(world, neighborPos, state.get(SIZE))) { + state = state.with(IS_FLOOR, false); + } return state; } } @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - BlockState upState = world.getBlockState(pos.up()); - BlockState downState = world.getBlockState(pos.down()); int size = state.get(SIZE); - boolean validUp = (upState.isOf(this) && upState.get(SIZE) >= size) || upState.isFullCube(world, pos.up()); - boolean validDown = (downState.isOf(this) && downState.get(SIZE) >= size) || downState.isFullCube(world, pos.down()); - return validUp || validDown; + return checkUp(world, pos, size) || checkDown(world, pos, size); + } + + private boolean checkUp(BlockView world, BlockPos pos, int size) { + BlockPos p = pos.up(); + BlockState state = world.getBlockState(p); + return (state.getBlock() instanceof StalactiteBlock && state.get(SIZE) >= size) || state.isFullCube(world, p); + } + + private boolean checkDown(BlockView world, BlockPos pos, int size) { + BlockPos p = pos.down(); + BlockState state = world.getBlockState(p); + return (state.getBlock() instanceof StalactiteBlock && state.get(SIZE) >= size) || state.isFullCube(world, p); } @Override @@ -114,15 +166,33 @@ public class StalactiteBlock extends BlockBaseNotFull { if (block.contains("item")) { return Patterns.createJson(Patterns.ITEM_GENERATED, "item/" + blockId.getPath()); } - blockId = Registry.BLOCK.getId(source); - int shape = Character.getNumericValue(block.charAt(block.lastIndexOf('_') + 1)); - return Patterns.createJson(Patterns.BLOCKS_STALACTITE[shape], blockId.getNamespace() + ":block/" + blockId.getPath()); + return Patterns.createJson(Patterns.BLOCK_CROSS_SHADED, block); } @Override public Identifier statePatternId() { return Patterns.STATE_STALACTITE; } + + @Override + public boolean canFillWithFluid(BlockView world, BlockPos pos, BlockState state, Fluid fluid) { + return false; + } + + @Override + public boolean tryFillWithFluid(WorldAccess world, BlockPos pos, BlockState state, FluidState fluidState) { + return false; + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.get(WATERLOGGED) ? Fluids.WATER.getStill(false) : Fluids.EMPTY.getDefaultState(); + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } static { SHAPES = new VoxelShape[8]; diff --git a/src/main/java/ru/betterend/patterns/Patterns.java b/src/main/java/ru/betterend/patterns/Patterns.java index d37b63e8..ad73c1a7 100644 --- a/src/main/java/ru/betterend/patterns/Patterns.java +++ b/src/main/java/ru/betterend/patterns/Patterns.java @@ -71,7 +71,8 @@ public class Patterns { public final static Identifier BLOCK_DOOR_TOP_HINGE = BetterEnd.makeID("patterns/block/door_top_hinge.json"); public final static Identifier BLOCK_DOOR_BOTTOM = BetterEnd.makeID("patterns/block/door_bottom.json"); public final static Identifier BLOCK_DOOR_BOTTOM_HINGE = BetterEnd.makeID("patterns/block/door_bottom_hinge.json"); - public final static Identifier BLOCK_SAPLING = BetterEnd.makeID("patterns/block/sapling.json"); + public final static Identifier BLOCK_CROSS = BetterEnd.makeID("patterns/block/cross.json"); + public final static Identifier BLOCK_CROSS_SHADED = BetterEnd.makeID("patterns/block/cross_shaded.json"); public final static Identifier BLOCK_GATE_CLOSED = BetterEnd.makeID("patterns/block/fence_gate_closed.json"); public final static Identifier BLOCK_GATE_CLOSED_WALL = BetterEnd.makeID("patterns/block/wall_gate_closed.json"); public final static Identifier BLOCK_GATE_OPEN = BetterEnd.makeID("patterns/block/fence_gate_open.json"); @@ -105,17 +106,6 @@ public class Patterns { public final static Identifier BLOCK_TOP_SIDE_BOTTOM = BetterEnd.makeID("patterns/block/top_side_bottom.json"); public final static Identifier BLOCK_PATH = BetterEnd.makeID("patterns/block/path.json"); - public final static Identifier[] BLOCKS_STALACTITE = new Identifier[] { - BetterEnd.makeID("patterns/block/stalactite_0.json"), - BetterEnd.makeID("patterns/block/stalactite_1.json"), - BetterEnd.makeID("patterns/block/stalactite_2.json"), - BetterEnd.makeID("patterns/block/stalactite_3.json"), - BetterEnd.makeID("patterns/block/stalactite_4.json"), - BetterEnd.makeID("patterns/block/stalactite_5.json"), - BetterEnd.makeID("patterns/block/stalactite_6.json"), - BetterEnd.makeID("patterns/block/stalactite_7.json") - }; - //Models Item public final static Identifier ITEM_WALL = BetterEnd.makeID("patterns/item/pattern_wall.json"); public final static Identifier ITEM_FENCE = BetterEnd.makeID("patterns/item/pattern_fence.json"); diff --git a/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java b/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java index a8093cc5..6e7438ff 100644 --- a/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java @@ -4,6 +4,7 @@ import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.state.property.Properties; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos.Mutable; import net.minecraft.util.math.MathHelper; @@ -33,14 +34,14 @@ public class StalactiteFeature extends DefaultFeature { } Mutable mut = new Mutable().set(pos); - int height = random.nextInt(8); + int height = random.nextInt(8); int dir = ceiling ? -1 : 1; boolean stalagnate = false; for (int i = 1; i <= height; i++) { mut.setY(pos.getY() + i * dir); BlockState state = world.getBlockState(mut); - if (!state.isAir()) { + if (!state.getMaterial().isReplaceable()) { stalagnate = state.isIn(EndTags.GEN_TERRAIN); height = i - 1; break; @@ -51,7 +52,10 @@ public class StalactiteFeature extends DefaultFeature { for (int i = 0; i < height; i++) { mut.setY(pos.getY() + i * dir); int size = stalagnate ? MathHelper.abs(i - center) + 1 : height - i - 1; - BlocksHelper.setWithoutUpdate(world, mut, block.getDefaultState().with(StalactiteBlock.SIZE, size)); + boolean waterlogged = !world.getFluidState(mut).isEmpty(); + BlockState base = block.getDefaultState().with(StalactiteBlock.SIZE, size).with(Properties.WATERLOGGED, waterlogged); + BlockState state = stalagnate ? base.with(StalactiteBlock.IS_FLOOR, dir > 0 ? i < center : i > center) : base.with(StalactiteBlock.IS_FLOOR, dir > 0); + BlocksHelper.setWithoutUpdate(world, mut, state); } return true; diff --git a/src/main/resources/assets/betterend/patterns/block/sapling.json b/src/main/resources/assets/betterend/patterns/block/cross.json similarity index 100% rename from src/main/resources/assets/betterend/patterns/block/sapling.json rename to src/main/resources/assets/betterend/patterns/block/cross.json diff --git a/src/main/resources/assets/betterend/patterns/block/cross_shaded.json b/src/main/resources/assets/betterend/patterns/block/cross_shaded.json new file mode 100644 index 00000000..7ff90f6b --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/cross_shaded.json @@ -0,0 +1,25 @@ +{ + "ambientocclusion": false, + "textures": { + "cross": "betterend:block/%texture%", + "particle": "#cross" + }, + "elements": [ + { "from": [ 0.8, 0, 8 ], + "to": [ 15.2, 16, 8 ], + "rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": 45, "rescale": true }, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#cross" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#cross" } + } + }, + { "from": [ 8, 0, 0.8 ], + "to": [ 8, 16, 15.2 ], + "rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": 45, "rescale": true }, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#cross" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#cross" } + } + } + ] +} diff --git a/src/main/resources/assets/betterend/patterns/block/stone_stalactite_1.json b/src/main/resources/assets/betterend/patterns/block/stone_stalactite_1.json new file mode 100644 index 00000000..c2ed967d --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/stone_stalactite_1.json @@ -0,0 +1,44 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/%texture%", + "texture": "betterend:block/%texture%" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 6, 0, 6 ], + "to": [ 10, 16, 10 ], + "faces": { + "down": { "uv": [ 6, 6, 10, 10 ], "texture": "#texture" }, + "up": { "uv": [ 6, 6, 10, 10 ], "texture": "#texture" }, + "north": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, + "south": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, + "west": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" }, + "east": { "uv": [ 6, 0, 10, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0.0007, 0, -0.0007 ], + "to": [ 22.5007, 16, 0.0003 ], + "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ -6.5007, 0, -0.0003 ], + "to": [ 15.9993, 16, 0.0007 ], + "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/stone_stalactite_2.json b/src/main/resources/assets/betterend/patterns/block/stone_stalactite_2.json new file mode 100644 index 00000000..f33e1e64 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/stone_stalactite_2.json @@ -0,0 +1,44 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/%texture%", + "texture": "betterend:block/%texture%" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 5, 0, 5 ], + "to": [ 11, 16, 11 ], + "faces": { + "down": { "uv": [ 5, 5, 11, 11 ], "texture": "#texture" }, + "up": { "uv": [ 5, 5, 11, 11 ], "texture": "#texture" }, + "north": { "uv": [ 5, 0, 11, 16 ], "texture": "#texture" }, + "south": { "uv": [ 5, 0, 11, 16 ], "texture": "#texture" }, + "west": { "uv": [ 5, 0, 11, 16 ], "texture": "#texture" }, + "east": { "uv": [ 5, 0, 11, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0.0007, 0, -0.0007 ], + "to": [ 22.5007, 16, 0.0003 ], + "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ -6.5007, 0, -0.0003 ], + "to": [ 15.9993, 16, 0.0007 ], + "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/stone_stalactite_3.json b/src/main/resources/assets/betterend/patterns/block/stone_stalactite_3.json new file mode 100644 index 00000000..145acf77 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/stone_stalactite_3.json @@ -0,0 +1,44 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/%texture%", + "texture": "betterend:block/%texture%" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 4, 0, 4 ], + "to": [ 12, 16, 12 ], + "faces": { + "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#texture" }, + "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#texture" }, + "north": { "uv": [ 4, 0, 12, 16 ], "texture": "#texture" }, + "south": { "uv": [ 4, 0, 12, 16 ], "texture": "#texture" }, + "west": { "uv": [ 4, 0, 12, 16 ], "texture": "#texture" }, + "east": { "uv": [ 4, 0, 12, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0.0007, 0, -0.0007 ], + "to": [ 22.5007, 16, 0.0003 ], + "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ -6.5007, 0, -0.0003 ], + "to": [ 15.9993, 16, 0.0007 ], + "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/blockstate/stalactite.json b/src/main/resources/assets/betterend/patterns/blockstate/stalactite.json index 9d093574..d9e41bcc 100644 --- a/src/main/resources/assets/betterend/patterns/blockstate/stalactite.json +++ b/src/main/resources/assets/betterend/patterns/blockstate/stalactite.json @@ -1,13 +1,21 @@ { "variants": { - "size=0": { "model": "betterend:pattern/%block%/%block%_0" }, - "size=1": { "model": "betterend:pattern/%block%/%block%_1" }, - "size=2": { "model": "betterend:pattern/%block%/%block%_2" }, - "size=3": { "model": "betterend:pattern/%block%/%block%_3" }, - "size=4": { "model": "betterend:pattern/%block%/%block%_4" }, - "size=5": { "model": "betterend:pattern/%block%/%block%_5" }, - "size=6": { "model": "betterend:pattern/%block%/%block%_6" }, - "size=7": { "model": "betterend:pattern/%block%/%block%_7" } + "size=0,is_floor=true": { "model": "betterend:pattern/%block%/%block%_0" }, + "size=1,is_floor=true": { "model": "betterend:pattern/%block%/%block%_1" }, + "size=2,is_floor=true": { "model": "betterend:pattern/%block%/%block%_2" }, + "size=3,is_floor=true": { "model": "betterend:pattern/%block%/%block%_3" }, + "size=4,is_floor=true": { "model": "betterend:pattern/%block%/%block%_4" }, + "size=5,is_floor=true": { "model": "betterend:pattern/%block%/%block%_5" }, + "size=6,is_floor=true": { "model": "betterend:pattern/%block%/%block%_6" }, + "size=7,is_floor=true": { "model": "betterend:pattern/%block%/%block%_7" }, + "size=0,is_floor=false": { "model": "betterend:pattern/%block%/%block%_0", "x": 180 }, + "size=1,is_floor=false": { "model": "betterend:pattern/%block%/%block%_1", "x": 180 }, + "size=2,is_floor=false": { "model": "betterend:pattern/%block%/%block%_2", "x": 180 }, + "size=3,is_floor=false": { "model": "betterend:pattern/%block%/%block%_3", "x": 180 }, + "size=4,is_floor=false": { "model": "betterend:pattern/%block%/%block%_4", "x": 180 }, + "size=5,is_floor=false": { "model": "betterend:pattern/%block%/%block%_5", "x": 180 }, + "size=6,is_floor=false": { "model": "betterend:pattern/%block%/%block%_6", "x": 180 }, + "size=7,is_floor=false": { "model": "betterend:pattern/%block%/%block%_7", "x": 180 } } } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_0.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_0.png new file mode 100644 index 0000000000000000000000000000000000000000..424bbbb75b3074a38840a98f1b3ab7c27f5e535a GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(iS0H_K zU-#K#-B)i-x%X_zyKh^*{n}fdd6pk2!Cn&N7tHV<43^d}`wbK_^mK6yk(kkf|CFBpRTa1O_-=I^f6j%N@EvOLIdX$wzF{zOAZ-oG@9=;U}We$XS~G>sF}gj L)z4*}Q$iB}G2T3_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_1.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_1.png new file mode 100644 index 0000000000000000000000000000000000000000..4e63ebf754c5130f759d7d819a97f1e1741242c1 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(iS0H_K zU-#K#-B)i-x%X_zyKh^*{n}fdd6pk2!Cn&N7tHV<43^d}`wbMb_H=O!k(fI5tRokL zB9HUMTYt{{?bqRG3JXv>?e3)H7F4#zlZz#dJ+OiKT<0n7oz3=tThjJ3yz5m{D=EIs Wa5wbG+POeu7(8A5T-G@yGywq25<*)5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_2.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_2.png new file mode 100644 index 0000000000000000000000000000000000000000..2567f16097ad8f6a75071edf73441d6c266a9941 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(iS0H_K zU-#K#-B)i-x%X_zyKh^*{n}fdd6pk2!Cn&N7tHV<43^d}`wbLw@pN$vk(fI5oF^B9 z0SB`~w$T6oPxJx;sd1k%k@z^kh^$U-mnZQThss;USe-8_8Em8^u1|zRb f*CxXQzi+b4PGNNH59lrin#bVj>gTe~DWM4f3nWCR literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_3.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_3.png new file mode 100644 index 0000000000000000000000000000000000000000..25b05051634a1b430f12c36cbae15d1ce443ce81 GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(iS0H_K zU-#K#-B)i-x%X_zyKh^*{n}fdd6pk2!Cn&N7tHV<43^d}`wbLw@N{tuk(gS0){&1v zfrHsG9Zy6|oZc}-I80c5L2uDPW-F$uP4^cyL}ogCFMD{7&y3mb aWFu>V9>b^Kj{-n$V(@hJb6Mw<&;$VY6GM#v literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_4.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_4.png new file mode 100644 index 0000000000000000000000000000000000000000..61662aba97cce71efc9e805e65bb1486fb33c013 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(iS0H_K zU-#K#-B)i-x%X_zyKh^*{n}fdd6pk2!Cn&N7tHV<43^d}`wbNG^>lFzk(gS0-cjg) z0SA)<_oV;!J58o1@I8IjXBD;eaGvSwBTGdXbXOWCs5TUFv+rO&&nojk<-u-c_iYN( p%}&N=>^ygxcgF$k&!Tb_jE}c4PTIfhiz(1x22WQ%mvv4FO#uA`O4k4Y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_5.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_5.png new file mode 100644 index 0000000000000000000000000000000000000000..280ca7371e1bc5560617dc994f0984a224586817 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(iS0H_K zU-#K#-B)i-x%X_zyKh^*{n}fdd6pk2!Cn&N7tHV<43^d}`wbNG_H=O!k(k69OSyuf+rx<%gTe~DWM4f!ct4) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_6.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_6.png new file mode 100644 index 0000000000000000000000000000000000000000..0c27b76c93bf9b58c149c1ade455a0e2f52dc846 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(iS0H_K zU-#K#-B)i-x%X_zyKh^*{n}fdd6pk2!Cn&N7tHV<43^d}`wbL|@pN$vk(e5L{x)BO z0uS?ri{1bKpA=hUq`2oxiubNnS{J74E||w|p=281@+ZOP!_|g=2PMw5eB*LZHG9Ch zh~Goy;P#s_o(auUQm)-ls4qXC%X!bBdsV!-ek3z@o!Kq+{qw4Vd23Oo4G|# zDN71AoDzr-;9MqJ#i+&4yDCIB_W)b|f_qW62e|p0UNPNb3}OESw1&ac)z4*}Q$iB} D`#Mc# literal 0 HcmV?d00001 From df7220af8671e8687d8bff021876f8bef1a0b628 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 9 Mar 2021 18:04:57 +0300 Subject: [PATCH 316/463] Cave grass retexture, stalactite update --- .../betterend/blocks/basis/StalactiteBlock.java | 6 +++++- .../betterend/textures/block/cave_grass_1.png | Bin 422 -> 219 bytes .../betterend/textures/block/cave_grass_2.png | Bin 368 -> 211 bytes .../betterend/textures/block/cave_moss_side.png | Bin 604 -> 273 bytes .../betterend/textures/block/cave_moss_top.png | Bin 710 -> 243 bytes 5 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java b/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java index d4d74dd4..13e09a69 100644 --- a/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java @@ -21,6 +21,7 @@ import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos.Mutable; import net.minecraft.util.math.Direction; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.registry.Registry; import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.BlockView; @@ -195,9 +196,12 @@ public class StalactiteBlock extends BlockBaseNotFull implements Waterloggable, } static { + float end = 2F / 8F; + float start = 5F / 8F; SHAPES = new VoxelShape[8]; for (int i = 0; i < 8; i++) { - SHAPES[i] = Block.createCuboidShape(7 - i, 0, 7 - i, 9 + i, 16, 9 + i); + int side = MathHelper.floor(MathHelper.lerp(i / 7F, start, end) * 8F + 0.5F); + SHAPES[i] = Block.createCuboidShape(side, 0, side, 16 - side, 16, 16 - side); } } } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/cave_grass_1.png b/src/main/resources/assets/betterend/textures/block/cave_grass_1.png index c5b44c18d02f14a4b0c5dceb03d8932c58cd613a..a1acac74d21fa849c5edaacc25f1365478d7651e 100644 GIT binary patch delta 202 zcmZ3+e4BBCWIZzj1A~Sxe=v|@EDmyaVpw-h<|U9L5#STz3Z&=Ac&#x=n&Z>mow}sB z^=#I{XHna}P|Ah1G zwsj|eIX+z}@$vUFn?EZ)eibZjT0X7kR+W--=pM(`%ReTq+j{KQ-fJgBm)~5eXB;MT xT~O`U`yDDSZ)IELaE>Wl)CLRhT`Ierj?#*8Nzddz1egjIg)}tthoOBn?nH)Lu|Ez=saCuO8c`f~nYCvcD zN)!V?ftTEV;s3n6)&G}eq$(0>JQ;qpcG$50KJq!Ialv2Er5wOPyHiq@Fq{huP|1J(?}g;Vc=n2Wej6RQG?Sb3Frw0lU=V{x1}F z1Zx0^?a@g1KUc&a&IkD&WawOJkN+Dq62TS$09;lBfe_^;pFscs002ovPDHLkV1j_Y B*B<}? diff --git a/src/main/resources/assets/betterend/textures/block/cave_grass_2.png b/src/main/resources/assets/betterend/textures/block/cave_grass_2.png index fa6e0ab9d5ac59435cb2c99d1e36689025c4f90b..493e7c0fece7f4212c9c0ffed932a30e8f813bad 100644 GIT binary patch delta 194 zcmeysbeVC2WIZzj1A~Sxe=v|@EDmyaVpw-h<|U9L5#STz3Z&=Ac&#x=n&Z>mow}sB z^=#I{XHna}z@9780gPVEikYcSw&_U5kmFCA@S zSRC&)ZS9`D3?H^uv43rsv3@bTX7>S6aTsX^EKn{0*> nn~|e0htVIOBP=mT${(bP0l+XkKgAhuO delta 352 zcmV-m0iXWU0q_El8Gi-<001BJ|6u?C0XIoRK~#9!WBC97KLaJ0VVD{K0#QppF+?o> zzz{s|_5bii?-}A&ek08VF;gFaapa`C|5N9^WC)*dn>;U6uX^@Bx&6X_f?fz+@D{5g z&kg?>iW`pqCn^jIr{4RI&47l|UBnsCJpcCpoXP_ziYIj(`G4P=y_PrwK(;lO?S?C! zR=M^6HAZEy1^Ag2CxYI!fEG^maf0}DE z+<>Y2*f!jl}<(wNtdO$m-g zF$lutY3p+T>kj>s7!?r2sk7UCd-u+CVXKH|i-=rfr@HRGF?q|v%$%Bkg2#(K6XV!@84mO_hUo|Ln$&1 zQi_j67h14ofEg&m3=@XG#D$u4!OERUT{LN$7Dj(fZlpgib=*RU zTB}%jGG@fGA=8~!~I+*V>Qc?Tr#E~LbL3yws zeKE)DRI+MG>}n&EK<+B2G-`Ph}}(89%HmQ0tGGp{i4W(%4pB~xtV zlc%Bl4}Z2pr+>E$k%paX)0t1E=)Req1eB{Kg&g1GcQoO$h5M*|`N8nw(8kp)iT;9E zHn9g5c6)B6?%*2~x2+FD$f9nI6im-rj`XQB^^MM)IFj!)p)Gynz5aQ{9NRZX%l7!t zFE-ulH5<353BT1nBA<;AbiHNgd-Gz~EuJ${#lpccxPNQUli9Vd)?A6phsq=%1F&Iy zO3LQM>$xQ$PMv(i8viHK&H5V%X{E4Dzxil{vjFuM6u zgB`BXOGj;iA&5ewj(`B6(&&wK770Sf4W_ys8ja8tw*)h&dHyq2 c@1Q393%AF#yvsBAKL7v#07*qoM6N<$f|D~Jg8%>k diff --git a/src/main/resources/assets/betterend/textures/block/cave_moss_top.png b/src/main/resources/assets/betterend/textures/block/cave_moss_top.png index 1d3698b27d0636d92874efdfda9d20e0492c1a8a..f2857080d3620d338e4a60f909d6afe84bcae42e 100644 GIT binary patch delta 226 zcmV<803H9v1@i%r8Gi!+001a04^sdD00DDSM?wIu&K&6g000Z~sBvQpFTFo$8)i`2SGcja6Pcnlw@0;EqeQ2C^UI5pRR@lA&E9T)_E;g~oKEU##dg4}>d~1Ph`sOGwJ~ cCLbEh2Y0Xpg9D^>qyPW_07*qoM6N<$f~F-{QUCw| delta 697 zcmV;q0!IDw0mcQ88Gix*005AYXf^-<0*y&TK~#9!1;M#)8%F>D(79*!=JJw6QFh|M z7K{KX+#9e9e?rOt`GfpQz9~hDlr93;iDbtjDTx%h=j`mx&XM=v@2mIMVxi3V`f3>o zbi1uaV3jgi9IO{{+mBzjr)P_)_4Yxv%yIPL+4s=XgWO(wd}rZi&Ri= z48ed9m<4pk!lLRPk3D7dZMH@)R>`~kx$$maDZzz9@PBHRo^-b_B!W0&V$ing^q=*& zqH2>^pxvXq>FdS~i!8lqi`MB=(OyL9lN&H56ydwNjzh7=X%YrSrSLEFA74yT+32%L zvIv43Sx#^iGRPs{98OD#63n4^H9+s|utXs5P zgi`5`!(n%9KYrR;=dR}2{juIWm0MYtwTct5K2JEJ6GubF$bXyDUa42X40%uha|xhz zF3gx}>~oPdPJjA#h!{@-dN6PyLbQ|ZDouK4FfxZ{BL2MHe=Z9=0^i%1(~R?tY@o;g fR;4xW)TsXfolkG}kTVW%00000NkvXXu0mjfx-nZ> From ee6dd6f7a81820faee7fe97b9798ad72935e9a2c Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 9 Mar 2021 19:47:45 +0300 Subject: [PATCH 317/463] Cave moss stalactite --- .../java/ru/betterend/registry/EndBlocks.java | 1 + .../java/ru/betterend/registry/EndFeatures.java | 2 ++ .../world/biome/cave/LushAuroraCaveBiome.java | 8 +++++--- .../block/end_stone_stalactite_cavemoss_0.png | Bin 0 -> 250 bytes .../block/end_stone_stalactite_cavemoss_1.png | Bin 0 -> 269 bytes .../block/end_stone_stalactite_cavemoss_2.png | Bin 0 -> 289 bytes .../block/end_stone_stalactite_cavemoss_3.png | Bin 0 -> 286 bytes .../block/end_stone_stalactite_cavemoss_4.png | Bin 0 -> 307 bytes .../block/end_stone_stalactite_cavemoss_5.png | Bin 0 -> 300 bytes .../block/end_stone_stalactite_cavemoss_6.png | Bin 0 -> 327 bytes .../block/end_stone_stalactite_cavemoss_7.png | Bin 0 -> 319 bytes 11 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_0.png create mode 100644 src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_1.png create mode 100644 src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_2.png create mode 100644 src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_3.png create mode 100644 src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_4.png create mode 100644 src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_5.png create mode 100644 src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_6.png create mode 100644 src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_7.png diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index f205e461..e87c9e4b 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -179,6 +179,7 @@ public class EndBlocks { public static final Block ANCIENT_EMERALD_ICE = registerBlock("ancient_emerald_ice", new AncientEmeraldIceBlock()); public static final Block END_STONE_STALACTITE = registerBlock("end_stone_stalactite", new StalactiteBlock(Blocks.END_STONE)); + public static final Block END_STONE_STALACTITE_CAVEMOSS = registerBlock("end_stone_stalactite_cavemoss", new StalactiteBlock(CAVE_MOSS)); // Wooden Materials And Trees // public static final Block MOSSY_GLOWSHROOM_SAPLING = registerBlock("mossy_glowshroom_sapling", new MossyGlowshroomSaplingBlock()); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 0e4e1abf..e6ae3f86 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -199,6 +199,8 @@ public class EndFeatures { public static final DefaultFeature CAVE_GRASS = new SingleBlockFeature(EndBlocks.CAVE_GRASS); public static final DefaultFeature END_STONE_STALACTITE = new StalactiteFeature(true, EndBlocks.END_STONE_STALACTITE, Blocks.END_STONE); public static final DefaultFeature END_STONE_STALAGMITE = new StalactiteFeature(false, EndBlocks.END_STONE_STALACTITE, Blocks.END_STONE); + public static final DefaultFeature END_STONE_STALACTITE_CAVEMOSS = new StalactiteFeature(true, EndBlocks.END_STONE_STALACTITE_CAVEMOSS, Blocks.END_STONE, EndBlocks.CAVE_MOSS); + public static final DefaultFeature END_STONE_STALAGMITE_CAVEMOSS = new StalactiteFeature(false, EndBlocks.END_STONE_STALACTITE_CAVEMOSS, EndBlocks.CAVE_MOSS); public static void registerBiomeFeatures(Identifier id, Biome biome, List>>> features) { if (id.getNamespace().equals(BetterEnd.MOD_ID)) { diff --git a/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java index dadec7aa..284d38de 100644 --- a/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java @@ -18,19 +18,21 @@ public class LushAuroraCaveBiome extends EndCaveBiome { .setSurface(EndBlocks.CAVE_MOSS)); this.addFloorFeature(EndFeatures.BIG_AURORA_CRYSTAL, 1); - this.addFloorFeature(EndFeatures.CAVE_BUSH, 10); + this.addFloorFeature(EndFeatures.CAVE_BUSH, 5); this.addFloorFeature(EndFeatures.CAVE_GRASS, 40); + this.addFloorFeature(EndFeatures.END_STONE_STALAGMITE_CAVEMOSS, 10); this.addCeilFeature(EndFeatures.CAVE_BUSH, 1); + this.addCeilFeature(EndFeatures.END_STONE_STALACTITE_CAVEMOSS, 20); } @Override public float getFloorDensity() { - return 0.1F; + return 0.2F; } @Override public float getCeilDensity() { - return 0.03F; + return 0.1F; } } diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_0.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_0.png new file mode 100644 index 0000000000000000000000000000000000000000..cfbc6925b042de7ad0565600de1da192449cbf2d GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~rvRT2S0H_K zU-#K#-B)i-x%X_zyKh^*{n|T4#&L;^*BTkGEiyrSRf3LcM4dH=x@wU$2PkNeG{>jA zJ9SBM>)EV@&!V<{d$CD)H_#NZk|4iehX2?=NMr9}pb8gH7sn8Zsl8_o@*Pm%VG7uO z%f!NqdQ)yN>M;=@HNNn?+H aZ&_ot87CJ;8&v?!WAJqKb6Mw<&;$VU!fB%b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_1.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_1.png new file mode 100644 index 0000000000000000000000000000000000000000..ed5fe5f275b021c4ca257c403678f351d874246e GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~rvRT2S0H_K zU-#K#-B)i-x%X_zyKh^*{n|T4#&L;^*BTkGEiyrSRf3LcM4dH=x@wU$2PkNeG{>jA zJ9SBM>)EV@&!V<{d$CD)H_#NZk|4iehX2?=NMr9}po(x$7sn8Zsj0n=dckYm#A1@~5aLNDx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_2.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a79c11e5a9753508c821314a191d748399f1c5a7 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~rvRT2S0H_K zU-#K#-B)i-x%X_zyKh^*{n|T4#&L;^*BTkGEiyrSRf3LcM4dH=x@wU$2PkNeG{>jA zJ9SBM>)EV@&!V<{d$CD)H_#NZk|4iehX2?=NMr9}po(ly7sn8ZsiEg0`3@U!umo&A zDUm#9+0Orwt5*bB&pfX_E%Pm3^Q=pMA(=UL&x&W`7OC6fjA zJ9SBM>)EV@&!V<{d$CD)H_#NZk|4iehX2?=NMr9}po$Dn7sn8Zsj26@`3@`aumsdQ zFecyOs`97&G__>@;v>>HNvCKwbUEO@X_94;W*gIo(iPyV^HGJMGto zmG}K`9W~6|7LllAD9x$0U2oFD2c?c}QJ*%~e~5bg`)~iY)%!j$w`ntrtp M>FVdQ&MBb@0DaJXBLDyZ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_4.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_4.png new file mode 100644 index 0000000000000000000000000000000000000000..ce1fbcc5d1c50ae1d8d10b8db18386fd4408cd5a GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~rvRT2S0H_K zU-#K#-B)i-x%X_zyKh^*{n|T4#&L;^*BTkGEiyrSRf3LcM4dH=x@wU$2PkNeG{>jA zJ9SBM>)EV@&!V<{d$CD)H_#NZk|4iehX2?=NMr9}po&^g7sn8Zsjlau`C1G(SOd7s zqIB0^`n$f=#BZWKAEO?_83qfLH1&#Xo)?E~pD~%H3-)zxaEUx8sr)db_uV|9Z+ioF zJdR;l%Cp^TV$+j2?Wq$RUPZfZ=YJz+{&wf0v@9k0oUFO6x0||u@>S2Re4KmzPvboS i;}@Tw-uO8G5BrQBHjaynGHZbjVeoYIb6Mw<&;$TgGKSUw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_5.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_5.png new file mode 100644 index 0000000000000000000000000000000000000000..d6b2498c2b32fe72f3f4b4dec23d76ccdcc816cb GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~rvRT2S0H_K zU-#K#-B)i-x%X_zyKh^*{n|T4#&L;^*BTkGEiyrSRf3LcM4dH=x@wU$2PkNeG{>jA zJ9SBM>)EV@&!V<{d$CD)H_#NZk|4iehX2?=NMr9}po%h27sn8ZsiEgji?u3num&)_ z%39ER^Z)->M;rUk_3RZ8I1t=9L2}`8yQwF09S(k~VYtBcnQLv?%hU}?cF7GM8+RPi z+#YN1B<1h&mT!l{l{u4@K1K)?dC%FvnrUmY&@*UmyVB!jnkN}PtzT4i`u0PMvSq>d bxIVDEF|stil#6f&x`4sc)z4*}Q$iB}jA zJ9SBM>)EV@&!V<{d$CD)H_#NZk|4iehX2?=NMr9}po)o}E{-7*Q*F-&3LRG9U(PChdF>tu}Xtu($;7kvtLRpp-@k*0V@YOK3d9aI|`WinM=r{&XS3j3^P6jA zJ9SBM>)EV@&!V<{d$CD)H_#NZk|4iehX2?=NMr9}po&gU7sn8Zsjlau`Hm=Xum*^7 ze(Jh*?%#E*h_^iQZPkZ-eO}J{Dkb~zpMz)iGtr%4b3PyFxD)b7SNhV6xvo|1;#D2d z$(B=(ELwNUhyBQ%J4*#+0>n*wBg|LKT(yO#Bl^x6*9=A`or3T@%j4G{sT~NhNZ0tl vB=}S)H)4~*MXUM+c@@_t2(6WWAiwYEOxC+~dCVd}M=^N1`njxgN@xNA_$Z9J literal 0 HcmV?d00001 From c8378435bdc3d309e81a92fdcbacadc8d142574d Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 10 Mar 2021 20:18:16 +0300 Subject: [PATCH 318/463] End signs remake --- .../betterend/blocks/basis/EndSignBlock.java | 54 ++---- .../blocks/entities/ESignBlockEntity.java | 166 +----------------- .../client/ClientPlayNetworkHandlerMixin.java | 18 +- .../common/ServerPlayNetworkHandlerMixin.java | 60 ------- .../java/ru/betterend/registry/EndBlocks.java | 4 +- .../resources/betterend.mixins.common.json | 1 - 6 files changed, 25 insertions(+), 278 deletions(-) delete mode 100644 src/main/java/ru/betterend/mixin/common/ServerPlayNetworkHandlerMixin.java diff --git a/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java b/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java index ac4b6c4d..88ec4aa0 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java @@ -15,7 +15,6 @@ import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.fluid.FluidState; import net.minecraft.fluid.Fluids; -import net.minecraft.item.DyeItem; import net.minecraft.item.ItemPlacementContext; import net.minecraft.item.ItemStack; import net.minecraft.loot.context.LootContext; @@ -25,13 +24,10 @@ import net.minecraft.state.StateManager; import net.minecraft.state.property.BooleanProperty; import net.minecraft.state.property.IntProperty; import net.minecraft.state.property.Properties; -import net.minecraft.util.ActionResult; import net.minecraft.util.BlockMirror; import net.minecraft.util.BlockRotation; -import net.minecraft.util.Hand; import net.minecraft.util.Identifier; import net.minecraft.util.SignType; -import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.util.math.MathHelper; @@ -50,16 +46,17 @@ public class EndSignBlock extends AbstractSignBlock implements BlockPatterned { public static final IntProperty ROTATION = Properties.ROTATION; public static final BooleanProperty FLOOR = BooleanProperty.of("floor"); private static final VoxelShape[] WALL_SHAPES = new VoxelShape[] { - Block.createCuboidShape(0.0D, 4.5D, 14.0D, 16.0D, 12.5D, 16.0D), - Block.createCuboidShape(0.0D, 4.5D, 0.0D, 2.0D, 12.5D, 16.0D), - Block.createCuboidShape(0.0D, 4.5D, 0.0D, 16.0D, 12.5D, 2.0D), - Block.createCuboidShape(14.0D, 4.5D, 0.0D, 16.0D, 12.5D, 16.0D) }; + Block.createCuboidShape(0.0D, 4.5D, 14.0D, 16.0D, 12.5D, 16.0D), + Block.createCuboidShape(0.0D, 4.5D, 0.0D, 2.0D, 12.5D, 16.0D), + Block.createCuboidShape(0.0D, 4.5D, 0.0D, 16.0D, 12.5D, 2.0D), + Block.createCuboidShape(14.0D, 4.5D, 0.0D, 16.0D, 12.5D, 16.0D) + }; private final Block parent; public EndSignBlock(Block source) { super(FabricBlockSettings.copyOf(source).strength(1.0F, 1.0F).noCollision().nonOpaque(), SignType.OAK); - this.setDefaultState(this.stateManager.getDefaultState().with(ROTATION, 0).with(FLOOR, true).with(WATERLOGGED, false)); + this.setDefaultState(this.stateManager.getDefaultState().with(ROTATION, 0).with(FLOOR, false).with(WATERLOGGED, false)); this.parent = source; } @@ -77,30 +74,7 @@ public class EndSignBlock extends AbstractSignBlock implements BlockPatterned { public BlockEntity createBlockEntity(BlockView world) { return new ESignBlockEntity(); } - - @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - ItemStack itemStack = player.getStackInHand(hand); - boolean bl = itemStack.getItem() instanceof DyeItem && player.abilities.allowModifyWorld; - if (world.isClient) { - return bl ? ActionResult.SUCCESS : ActionResult.CONSUME; - } else { - BlockEntity blockEntity = world.getBlockEntity(pos); - if (blockEntity instanceof ESignBlockEntity) { - ESignBlockEntity signBlockEntity = (ESignBlockEntity) blockEntity; - if (bl) { - boolean bl2 = signBlockEntity.setTextColor(((DyeItem) itemStack.getItem()).getColor()); - if (bl2 && !player.isCreative()) { - itemStack.decrement(1); - } - } - return signBlockEntity.onActivate(player) ? ActionResult.SUCCESS : ActionResult.PASS; - } else { - return ActionResult.PASS; - } - } - } - + @Override public void onPlaced(World world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { if (placer != null && placer instanceof PlayerEntity) { @@ -108,8 +82,10 @@ public class EndSignBlock extends AbstractSignBlock implements BlockPatterned { if (!world.isClient) { sign.setEditor((PlayerEntity) placer); ((ServerPlayerEntity) placer).networkHandler.sendPacket(new SignEditorOpenS2CPacket(pos)); - } else + } + else { sign.setEditable(true); + } } } @@ -149,14 +125,12 @@ public class EndSignBlock extends AbstractSignBlock implements BlockPatterned { WorldView worldView = ctx.getWorld(); BlockPos blockPos = ctx.getBlockPos(); Direction[] directions = ctx.getPlacementDirections(); - Direction[] var7 = directions; - int var8 = directions.length; - for (int var9 = 0; var9 < var8; ++var9) { - Direction direction = var7[var9]; + for (int i = 0; i < directions.length; ++i) { + Direction direction = directions[i]; if (direction.getAxis().isHorizontal()) { - Direction direction2 = direction.getOpposite(); - int rot = MathHelper.floor((180.0 + direction2.asRotation() * 16.0 / 360.0) + 0.5 + 4) & 15; + Direction dir = direction.getOpposite(); + int rot = MathHelper.floor((180.0 + dir.asRotation() * 16.0 / 360.0) + 0.5 + 4) & 15; blockState = blockState.with(ROTATION, rot); if (blockState.canPlaceAt(worldView, blockPos)) { return blockState.with(FLOOR, false).with(WATERLOGGED, fluidState.getFluid() == Fluids.WATER); diff --git a/src/main/java/ru/betterend/blocks/entities/ESignBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/ESignBlockEntity.java index 763b2122..51e25415 100644 --- a/src/main/java/ru/betterend/blocks/entities/ESignBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/ESignBlockEntity.java @@ -1,168 +1,16 @@ package ru.betterend.blocks.entities; -import java.util.function.Function; - -import com.mojang.brigadier.exceptions.CommandSyntaxException; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket; -import net.minecraft.server.command.CommandOutput; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.text.ClickEvent; -import net.minecraft.text.LiteralText; -import net.minecraft.text.OrderedText; -import net.minecraft.text.Style; -import net.minecraft.text.Text; -import net.minecraft.text.Texts; -import net.minecraft.util.DyeColor; -import net.minecraft.util.math.Vec2f; -import net.minecraft.util.math.Vec3d; +import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.block.entity.SignBlockEntity; import ru.betterend.registry.EndBlockEntities; -public class ESignBlockEntity extends BlockEntity { - private final Text[] text; - private boolean editable; - private PlayerEntity editor; - private final OrderedText[] textBeingEdited; - private DyeColor textColor; - +public class ESignBlockEntity extends SignBlockEntity { public ESignBlockEntity() { - super(EndBlockEntities.SIGN); - this.text = new Text[] { LiteralText.EMPTY, LiteralText.EMPTY, LiteralText.EMPTY, LiteralText.EMPTY }; - this.editable = true; - this.textBeingEdited = new OrderedText[4]; - this.textColor = DyeColor.BLACK; + super(); } - public CompoundTag toTag(CompoundTag tag) { - super.toTag(tag); - - for (int i = 0; i < 4; ++i) { - String string = Text.Serializer.toJson(this.text[i]); - tag.putString("Text" + (i + 1), string); - } - - tag.putString("Color", this.textColor.getName()); - return tag; - } - - public void fromTag(BlockState state, CompoundTag tag) { - this.editable = false; - super.fromTag(state, tag); - this.textColor = DyeColor.byName(tag.getString("Color"), DyeColor.BLACK); - - for (int i = 0; i < 4; ++i) { - String string = tag.getString("Text" + (i + 1)); - Text text = Text.Serializer.fromJson(string.isEmpty() ? "\"\"" : string); - if (this.world instanceof ServerWorld) { - try { - this.text[i] = Texts.parse(this.getCommandSource((ServerPlayerEntity) null), text, (Entity) null, - 0); - } catch (CommandSyntaxException var7) { - this.text[i] = text; - } - } else { - this.text[i] = text; - } - - this.textBeingEdited[i] = null; - } - - } - - public void setTextOnRow(int row, Text text) { - this.text[row] = text; - this.textBeingEdited[row] = null; - } - - @Environment(EnvType.CLIENT) - public OrderedText getTextBeingEditedOnRow(int row, Function function) { - if (this.textBeingEdited[row] == null && this.text[row] != null) { - this.textBeingEdited[row] = (OrderedText) function.apply(this.text[row]); - } - - return this.textBeingEdited[row]; - } - - public BlockEntityUpdateS2CPacket toUpdatePacket() { - return new BlockEntityUpdateS2CPacket(this.pos, 9, this.toInitialChunkDataTag()); - } - - public CompoundTag toInitialChunkDataTag() { - return this.toTag(new CompoundTag()); - } - - public boolean copyItemDataRequiresOperator() { - return true; - } - - public boolean isEditable() { - return this.editable; - } - - @Environment(EnvType.CLIENT) - public void setEditable(boolean bl) { - this.editable = bl; - if (!bl) { - this.editor = null; - } - - } - - public void setEditor(PlayerEntity player) { - this.editor = player; - } - - public PlayerEntity getEditor() { - return this.editor; - } - - public boolean onActivate(PlayerEntity player) { - Text[] var2 = this.text; - int var3 = var2.length; - - for (int var4 = 0; var4 < var3; ++var4) { - Text text = var2[var4]; - Style style = text == null ? null : text.getStyle(); - if (style != null && style.getClickEvent() != null) { - ClickEvent clickEvent = style.getClickEvent(); - if (clickEvent.getAction() == ClickEvent.Action.RUN_COMMAND) { - player.getServer().getCommandManager().execute(this.getCommandSource((ServerPlayerEntity) player), - clickEvent.getValue()); - } - } - } - - return true; - } - - public ServerCommandSource getCommandSource(ServerPlayerEntity player) { - String string = player == null ? "Sign" : player.getName().getString(); - Text text = player == null ? new LiteralText("Sign") : player.getDisplayName(); - return new ServerCommandSource(CommandOutput.DUMMY, Vec3d.ofCenter(this.pos), Vec2f.ZERO, - (ServerWorld) this.world, 2, string, (Text) text, this.world.getServer(), player); - } - - public DyeColor getTextColor() { - return this.textColor; - } - - public boolean setTextColor(DyeColor value) { - if (value != this.getTextColor()) { - this.textColor = value; - this.markDirty(); - this.world.updateListeners(this.getPos(), this.getCachedState(), this.getCachedState(), 3); - return true; - } else { - return false; - } + @Override + public BlockEntityType getType() { + return EndBlockEntities.SIGN; } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java index b4166ed1..09f84c8a 100644 --- a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java @@ -11,12 +11,9 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.client.world.ClientWorld; import net.minecraft.network.NetworkThreadUtils; -import net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket; import net.minecraft.network.packet.s2c.play.SignEditorOpenS2CPacket; -import net.minecraft.util.math.BlockPos; import net.minecraft.util.thread.ThreadExecutor; import ru.betterend.blocks.entities.ESignBlockEntity; -import ru.betterend.blocks.entities.PedestalBlockEntity; import ru.betterend.client.gui.BlockSignEditScreen; @Mixin(ClientPlayNetworkHandler.class) @@ -30,8 +27,7 @@ public class ClientPlayNetworkHandlerMixin @Inject(method = "onSignEditorOpen", at = @At(value = "HEAD"), cancellable = true) public void be_openSignEditor(SignEditorOpenS2CPacket packet, CallbackInfo info) { - NetworkThreadUtils.forceMainThread(packet, (ClientPlayNetworkHandler) (Object) this, - (ThreadExecutor) client); + NetworkThreadUtils.forceMainThread(packet, (ClientPlayNetworkHandler) (Object) this, (ThreadExecutor) client); BlockEntity blockEntity = this.world.getBlockEntity(packet.getPos()); if (blockEntity instanceof ESignBlockEntity) { ESignBlockEntity sign = (ESignBlockEntity) blockEntity; @@ -39,16 +35,4 @@ public class ClientPlayNetworkHandlerMixin info.cancel(); } } - - @Inject(method = "onBlockEntityUpdate", at = @At(value = "HEAD"), cancellable = true) - public void be_onEntityUpdate(BlockEntityUpdateS2CPacket packet, CallbackInfo info) { - NetworkThreadUtils.forceMainThread(packet, (ClientPlayNetworkHandler) (Object) this, - (ThreadExecutor) client); - BlockPos blockPos = packet.getPos(); - BlockEntity blockEntity = this.client.world.getBlockEntity(blockPos); - if (blockEntity instanceof ESignBlockEntity || blockEntity instanceof PedestalBlockEntity) { - blockEntity.fromTag(this.client.world.getBlockState(blockPos), packet.getCompoundTag()); - info.cancel(); - } - } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/mixin/common/ServerPlayNetworkHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/ServerPlayNetworkHandlerMixin.java deleted file mode 100644 index 471ed720..00000000 --- a/src/main/java/ru/betterend/mixin/common/ServerPlayNetworkHandlerMixin.java +++ /dev/null @@ -1,60 +0,0 @@ -package ru.betterend.mixin.common; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.network.NetworkThreadUtils; -import net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket; -import net.minecraft.server.network.ServerPlayNetworkHandler; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.text.LiteralText; -import net.minecraft.util.Formatting; -import net.minecraft.util.math.BlockPos; -import ru.betterend.blocks.entities.ESignBlockEntity; - -@Mixin(ServerPlayNetworkHandler.class) -public class ServerPlayNetworkHandlerMixin { - @Shadow - private static final Logger LOGGER = LogManager.getLogger(); - - @Shadow - public ServerPlayerEntity player; - - @Inject(method = "onSignUpdate", at = @At(value = "HEAD"), cancellable = true) - private void be_signUpdate(UpdateSignC2SPacket packet, CallbackInfo info) { - NetworkThreadUtils.forceMainThread(packet, ServerPlayNetworkHandler.class.cast(this), player.getServerWorld()); - this.player.updateLastActionTime(); - ServerWorld serverWorld = this.player.getServerWorld(); - BlockPos blockPos = packet.getPos(); - if (serverWorld.isChunkLoaded(blockPos)) { - BlockState blockState = serverWorld.getBlockState(blockPos); - BlockEntity blockEntity = serverWorld.getBlockEntity(blockPos); - if (blockEntity instanceof ESignBlockEntity) { - ESignBlockEntity signBlockEntity = (ESignBlockEntity) blockEntity; - if (!signBlockEntity.isEditable() || signBlockEntity.getEditor() != this.player) { - LOGGER.warn("Player {} just tried to change non-editable sign", this.player.getName().getString()); - return; - } - - String[] strings = packet.getText(); - - for (int i = 0; i < strings.length; ++i) { - signBlockEntity.setTextOnRow(i, new LiteralText(Formatting.strip(strings[i]))); - } - - signBlockEntity.markDirty(); - serverWorld.updateListeners(blockPos, blockState, blockState, 3); - - info.cancel(); - } - } - } -} diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index e87c9e4b..b40797a3 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -103,6 +103,7 @@ import ru.betterend.blocks.basis.EndCropBlock; import ru.betterend.blocks.basis.EndFurnaceBlock; import ru.betterend.blocks.basis.EndLeavesBlock; import ru.betterend.blocks.basis.EndOreBlock; +import ru.betterend.blocks.basis.EndSignBlock; import ru.betterend.blocks.basis.EndUnderwaterWallPlantBlock; import ru.betterend.blocks.basis.EndWallPlantBlock; import ru.betterend.blocks.basis.FurBlock; @@ -375,7 +376,8 @@ public class EndBlocks { return block; } Registry.register(Registry.BLOCK, id, block); - EndItems.registerBlockItem(id, new BlockItem(block, EndItems.makeBlockItemSettings())); + int maxCount = block instanceof EndSignBlock ? 16 : 64; + EndItems.registerBlockItem(id, new BlockItem(block, EndItems.makeBlockItemSettings().maxCount(maxCount))); return block; } diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index 1dc83764..625615ac 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -6,7 +6,6 @@ "mixins": [ "EnchantmentScreenHandlerMixin", "PlayerAdvancementTrackerMixin", - "ServerPlayNetworkHandlerMixin", "CraftingScreenHandlerMixin", "GenerationSettingsAccessor", "NoiseChunkGeneratorMixin", From 1b7a52ebb177590f39203228c1dc210046605568 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 10 Mar 2021 20:42:55 +0300 Subject: [PATCH 319/463] Typo fixes --- src/main/resources/assets/betterend/lang/en_us.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index f866d584..fab8ebd6 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -84,8 +84,8 @@ "item.minecraft.splash_potion.effect.long_end_veil": "Splash Potion Of End Veil", "item.minecraft.lingering_potion.effect.end_veil": "Lingering Potion Of End Veil", "item.minecraft.lingering_potion.effect.long_end_veil": "Lingering Potion Of End Veil", - "item.minecraft.tipped_arrow.effect.end_veil": "ARrow Of End Veil", - "item.minecraft.tipped_arrow.effect.long_end_veil": "ARrow Of End Veil", + "item.minecraft.tipped_arrow.effect.end_veil": "Arrow Of End Veil", + "item.minecraft.tipped_arrow.effect.long_end_veil": "Arrow Of End Veil", "block.betterend.mossy_glowshroom_sapling": "Mossy Glowshroom Sapling", "block.betterend.mossy_glowshroom_cap": "Mossy Glowshroom Cap", @@ -315,7 +315,7 @@ "block.betterend.purpur_lantern": "Purpur Lantern", "block.betterend.quartz_lantern": "Quartz Lantern", - "item.betterend.bucket_end_fish": "End Fish Bucket", + "item.betterend.bucket_end_fish": "Bucket of End Fish", "item.betterend.end_fish_cooked": "Cooked End Fish", "item.betterend.end_fish_raw": "End Fish", From 0402394201fff5a3b33f3df49537c9205795222e Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 11 Mar 2021 00:45:28 +0300 Subject: [PATCH 320/463] Biome classes rename --- .../blocks/MengerSpongeWetBlock.java | 8 +++- .../java/ru/betterend/registry/EndBiomes.java | 48 +++++++++---------- ...iomeAmberLand.java => AmberLandBiome.java} | 4 +- ...Spires.java => BlossomingSpiresBiome.java} | 4 +- ...orusForest.java => ChorusForestBiome.java} | 4 +- ...ntains.java => CrystalMountainsBiome.java} | 4 +- ...stelands.java => DustWastelandsBiome.java} | 4 +- ...mland.java => FoggyMushroomlandBiome.java} | 4 +- ...{BiomeMegalake.java => MegalakeBiome.java} | 4 +- ...lakeGrove.java => MegalakeGroveBiome.java} | 4 +- ...ntains.java => PaintedMountainsBiome.java} | 4 +- ...adowForest.java => ShadowForestBiome.java} | 4 +- ...rSprings.java => SulphurSpringsBiome.java} | 4 +- ...laJungle.java => UmbrellaJungleBiome.java} | 4 +- 14 files changed, 55 insertions(+), 49 deletions(-) rename src/main/java/ru/betterend/world/biome/land/{BiomeAmberLand.java => AmberLandBiome.java} (91%) rename src/main/java/ru/betterend/world/biome/land/{BiomeBlossomingSpires.java => BlossomingSpiresBiome.java} (90%) rename src/main/java/ru/betterend/world/biome/land/{BiomeChorusForest.java => ChorusForestBiome.java} (92%) rename src/main/java/ru/betterend/world/biome/land/{BiomeCrystalMountains.java => CrystalMountainsBiome.java} (84%) rename src/main/java/ru/betterend/world/biome/land/{BiomeDustWastelands.java => DustWastelandsBiome.java} (87%) rename src/main/java/ru/betterend/world/biome/land/{BiomeFoggyMushroomland.java => FoggyMushroomlandBiome.java} (92%) rename src/main/java/ru/betterend/world/biome/land/{BiomeMegalake.java => MegalakeBiome.java} (92%) rename src/main/java/ru/betterend/world/biome/land/{BiomeMegalakeGrove.java => MegalakeGroveBiome.java} (92%) rename src/main/java/ru/betterend/world/biome/land/{BiomePaintedMountains.java => PaintedMountainsBiome.java} (86%) rename src/main/java/ru/betterend/world/biome/land/{BiomeShadowForest.java => ShadowForestBiome.java} (92%) rename src/main/java/ru/betterend/world/biome/land/{BiomeSulphurSprings.java => SulphurSpringsBiome.java} (90%) rename src/main/java/ru/betterend/world/biome/land/{BiomeUmbrellaJungle.java => UmbrellaJungleBiome.java} (92%) diff --git a/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java b/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java index a2a5a41c..548e0325 100644 --- a/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java +++ b/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java @@ -16,6 +16,7 @@ import net.minecraft.sound.SoundEvents; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.World; +import net.minecraft.world.WorldAccess; import ru.betterend.blocks.basis.BlockBaseNotFull; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; @@ -79,10 +80,15 @@ public class MengerSpongeWetBlock extends BlockBaseNotFull implements IRenderTyp } } - @Override + /*@Override public void onBreak(World world, BlockPos pos, BlockState state, PlayerEntity player) { world.breakBlock(pos, !player.isCreative()); BlocksHelper.setWithUpdate(world, pos, Blocks.AIR); + }*/ + + @Override + public void onBroken(WorldAccess world, BlockPos pos, BlockState state) { + BlocksHelper.setWithUpdate(world, pos, Blocks.AIR); } @Override diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index b64668e1..158c3d1b 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -38,18 +38,18 @@ import ru.betterend.world.biome.cave.EmptySmaragdantCaveBiome; import ru.betterend.world.biome.cave.EndCaveBiome; import ru.betterend.world.biome.cave.LushAuroraCaveBiome; import ru.betterend.world.biome.cave.LushSmaragdantCaveBiome; -import ru.betterend.world.biome.land.BiomeAmberLand; -import ru.betterend.world.biome.land.BiomeBlossomingSpires; -import ru.betterend.world.biome.land.BiomeChorusForest; -import ru.betterend.world.biome.land.BiomeCrystalMountains; -import ru.betterend.world.biome.land.BiomeDustWastelands; -import ru.betterend.world.biome.land.BiomeFoggyMushroomland; -import ru.betterend.world.biome.land.BiomeMegalake; -import ru.betterend.world.biome.land.BiomeMegalakeGrove; -import ru.betterend.world.biome.land.BiomePaintedMountains; -import ru.betterend.world.biome.land.BiomeShadowForest; -import ru.betterend.world.biome.land.BiomeSulphurSprings; -import ru.betterend.world.biome.land.BiomeUmbrellaJungle; +import ru.betterend.world.biome.land.AmberLandBiome; +import ru.betterend.world.biome.land.BlossomingSpiresBiome; +import ru.betterend.world.biome.land.ChorusForestBiome; +import ru.betterend.world.biome.land.CrystalMountainsBiome; +import ru.betterend.world.biome.land.DustWastelandsBiome; +import ru.betterend.world.biome.land.FoggyMushroomlandBiome; +import ru.betterend.world.biome.land.MegalakeBiome; +import ru.betterend.world.biome.land.MegalakeGroveBiome; +import ru.betterend.world.biome.land.PaintedMountainsBiome; +import ru.betterend.world.biome.land.ShadowForestBiome; +import ru.betterend.world.biome.land.SulphurSpringsBiome; +import ru.betterend.world.biome.land.UmbrellaJungleBiome; import ru.betterend.world.biome.land.DragonGraveyardsBiome; import ru.betterend.world.biome.land.DryShrublandBiome; import ru.betterend.world.biome.land.EndBiome; @@ -82,18 +82,18 @@ public class EndBiomes { public static final EndBiome SMALL_END_ISLANDS = registerBiome(BiomeKeys.SMALL_END_ISLANDS, BiomeType.VOID, 1); // Better End Land - public static final EndBiome FOGGY_MUSHROOMLAND = registerBiome(new BiomeFoggyMushroomland(), BiomeType.LAND); - public static final EndBiome CHORUS_FOREST = registerBiome(new BiomeChorusForest(), BiomeType.LAND); - public static final EndBiome DUST_WASTELANDS = registerBiome(new BiomeDustWastelands(), BiomeType.LAND); - public static final EndBiome MEGALAKE = registerBiome(new BiomeMegalake(), BiomeType.LAND); - public static final EndBiome MEGALAKE_GROVE = registerSubBiome(new BiomeMegalakeGrove(), MEGALAKE); - public static final EndBiome CRYSTAL_MOUNTAINS = registerBiome(new BiomeCrystalMountains(), BiomeType.LAND); - public static final EndBiome PAINTED_MOUNTAINS = registerSubBiome(new BiomePaintedMountains(), DUST_WASTELANDS); - public static final EndBiome SHADOW_FOREST = registerBiome(new BiomeShadowForest(), BiomeType.LAND); - public static final EndBiome AMBER_LAND = registerBiome(new BiomeAmberLand(), BiomeType.LAND); - public static final EndBiome BLOSSOMING_SPIRES = registerBiome(new BiomeBlossomingSpires(), BiomeType.LAND); - public static final EndBiome SULPHUR_SPRINGS = registerBiome(new BiomeSulphurSprings(), BiomeType.LAND); - public static final EndBiome UMBRELLA_JUNGLE = registerBiome(new BiomeUmbrellaJungle(), BiomeType.LAND); + public static final EndBiome FOGGY_MUSHROOMLAND = registerBiome(new FoggyMushroomlandBiome(), BiomeType.LAND); + public static final EndBiome CHORUS_FOREST = registerBiome(new ChorusForestBiome(), BiomeType.LAND); + public static final EndBiome DUST_WASTELANDS = registerBiome(new DustWastelandsBiome(), BiomeType.LAND); + public static final EndBiome MEGALAKE = registerBiome(new MegalakeBiome(), BiomeType.LAND); + public static final EndBiome MEGALAKE_GROVE = registerSubBiome(new MegalakeGroveBiome(), MEGALAKE); + public static final EndBiome CRYSTAL_MOUNTAINS = registerBiome(new CrystalMountainsBiome(), BiomeType.LAND); + public static final EndBiome PAINTED_MOUNTAINS = registerSubBiome(new PaintedMountainsBiome(), DUST_WASTELANDS); + public static final EndBiome SHADOW_FOREST = registerBiome(new ShadowForestBiome(), BiomeType.LAND); + public static final EndBiome AMBER_LAND = registerBiome(new AmberLandBiome(), BiomeType.LAND); + public static final EndBiome BLOSSOMING_SPIRES = registerBiome(new BlossomingSpiresBiome(), BiomeType.LAND); + public static final EndBiome SULPHUR_SPRINGS = registerBiome(new SulphurSpringsBiome(), BiomeType.LAND); + public static final EndBiome UMBRELLA_JUNGLE = registerBiome(new UmbrellaJungleBiome(), BiomeType.LAND); public static final EndBiome GLOWING_GRASSLANDS = registerBiome(new GlowingGrasslandsBiome(), BiomeType.LAND); public static final EndBiome DRAGON_GRAVEYARDS = registerBiome(new DragonGraveyardsBiome(), BiomeType.LAND); public static final EndBiome DRY_SHRUBLAND = registerBiome(new DryShrublandBiome(), BiomeType.LAND); diff --git a/src/main/java/ru/betterend/world/biome/land/BiomeAmberLand.java b/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java similarity index 91% rename from src/main/java/ru/betterend/world/biome/land/BiomeAmberLand.java rename to src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java index f7e28782..d0a23d07 100644 --- a/src/main/java/ru/betterend/world/biome/land/BiomeAmberLand.java +++ b/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java @@ -8,8 +8,8 @@ import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; -public class BiomeAmberLand extends EndBiome { - public BiomeAmberLand() { +public class AmberLandBiome extends EndBiome { + public AmberLandBiome() { super(new BiomeDefinition("amber_land") .setFogColor(255, 184, 71) .setFogDensity(2.0F) diff --git a/src/main/java/ru/betterend/world/biome/land/BiomeBlossomingSpires.java b/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java similarity index 90% rename from src/main/java/ru/betterend/world/biome/land/BiomeBlossomingSpires.java rename to src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java index e61b2ef4..6226c6f5 100644 --- a/src/main/java/ru/betterend/world/biome/land/BiomeBlossomingSpires.java +++ b/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java @@ -6,8 +6,8 @@ import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; -public class BiomeBlossomingSpires extends EndBiome { - public BiomeBlossomingSpires() { +public class BlossomingSpiresBiome extends EndBiome { + public BlossomingSpiresBiome() { super(new BiomeDefinition("blossoming_spires") .setFogColor(241, 146, 229) .setFogDensity(1.7F) diff --git a/src/main/java/ru/betterend/world/biome/land/BiomeChorusForest.java b/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java similarity index 92% rename from src/main/java/ru/betterend/world/biome/land/BiomeChorusForest.java rename to src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java index 64c24aec..ecc5ab16 100644 --- a/src/main/java/ru/betterend/world/biome/land/BiomeChorusForest.java +++ b/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java @@ -10,8 +10,8 @@ import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; -public class BiomeChorusForest extends EndBiome { - public BiomeChorusForest() { +public class ChorusForestBiome extends EndBiome { + public ChorusForestBiome() { super(new BiomeDefinition("chorus_forest") .setFogColor(87, 26, 87) .setFogDensity(1.5F) diff --git a/src/main/java/ru/betterend/world/biome/land/BiomeCrystalMountains.java b/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java similarity index 84% rename from src/main/java/ru/betterend/world/biome/land/BiomeCrystalMountains.java rename to src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java index 7f0a1176..340d865e 100644 --- a/src/main/java/ru/betterend/world/biome/land/BiomeCrystalMountains.java +++ b/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java @@ -6,8 +6,8 @@ import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; -public class BiomeCrystalMountains extends EndBiome { - public BiomeCrystalMountains() { +public class CrystalMountainsBiome extends EndBiome { + public CrystalMountainsBiome() { super(new BiomeDefinition("crystal_mountains") .setPlantsColor(255, 133, 211) .setSurface(EndBlocks.CRYSTAL_MOSS) diff --git a/src/main/java/ru/betterend/world/biome/land/BiomeDustWastelands.java b/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java similarity index 87% rename from src/main/java/ru/betterend/world/biome/land/BiomeDustWastelands.java rename to src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java index 8baa3564..92dd0380 100644 --- a/src/main/java/ru/betterend/world/biome/land/BiomeDustWastelands.java +++ b/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java @@ -6,8 +6,8 @@ import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndSounds; -public class BiomeDustWastelands extends EndBiome { - public BiomeDustWastelands() { +public class DustWastelandsBiome extends EndBiome { + public DustWastelandsBiome() { super(new BiomeDefinition("dust_wastelands") .setFogColor(226, 239, 168) .setFogDensity(2) diff --git a/src/main/java/ru/betterend/world/biome/land/BiomeFoggyMushroomland.java b/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java similarity index 92% rename from src/main/java/ru/betterend/world/biome/land/BiomeFoggyMushroomland.java rename to src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java index bffa77dc..2d6fcc9b 100644 --- a/src/main/java/ru/betterend/world/biome/land/BiomeFoggyMushroomland.java +++ b/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java @@ -9,8 +9,8 @@ import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; -public class BiomeFoggyMushroomland extends EndBiome { - public BiomeFoggyMushroomland() { +public class FoggyMushroomlandBiome extends EndBiome { + public FoggyMushroomlandBiome() { super(new BiomeDefinition("foggy_mushroomland") .setPlantsColor(73, 210, 209) .setFogColor(41, 122, 173) diff --git a/src/main/java/ru/betterend/world/biome/land/BiomeMegalake.java b/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java similarity index 92% rename from src/main/java/ru/betterend/world/biome/land/BiomeMegalake.java rename to src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java index 01853bbe..c9780367 100644 --- a/src/main/java/ru/betterend/world/biome/land/BiomeMegalake.java +++ b/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java @@ -7,8 +7,8 @@ import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; -public class BiomeMegalake extends EndBiome { - public BiomeMegalake() { +public class MegalakeBiome extends EndBiome { + public MegalakeBiome() { super(new BiomeDefinition("megalake") .setPlantsColor(73, 210, 209) .setFogColor(178, 209, 248) diff --git a/src/main/java/ru/betterend/world/biome/land/BiomeMegalakeGrove.java b/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java similarity index 92% rename from src/main/java/ru/betterend/world/biome/land/BiomeMegalakeGrove.java rename to src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java index 03fc5dc3..7e0d0bb1 100644 --- a/src/main/java/ru/betterend/world/biome/land/BiomeMegalakeGrove.java +++ b/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java @@ -8,8 +8,8 @@ import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; -public class BiomeMegalakeGrove extends EndBiome { - public BiomeMegalakeGrove() { +public class MegalakeGroveBiome extends EndBiome { + public MegalakeGroveBiome() { super(new BiomeDefinition("megalake_grove") .setPlantsColor(73, 210, 209) .setFogColor(178, 209, 248) diff --git a/src/main/java/ru/betterend/world/biome/land/BiomePaintedMountains.java b/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java similarity index 86% rename from src/main/java/ru/betterend/world/biome/land/BiomePaintedMountains.java rename to src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java index bef86311..1192d417 100644 --- a/src/main/java/ru/betterend/world/biome/land/BiomePaintedMountains.java +++ b/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java @@ -6,8 +6,8 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; -public class BiomePaintedMountains extends EndBiome { - public BiomePaintedMountains() { +public class PaintedMountainsBiome extends EndBiome { + public PaintedMountainsBiome() { super(new BiomeDefinition("painted_mountains") .setFogColor(226, 239, 168) .setFogDensity(2) diff --git a/src/main/java/ru/betterend/world/biome/land/BiomeShadowForest.java b/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java similarity index 92% rename from src/main/java/ru/betterend/world/biome/land/BiomeShadowForest.java rename to src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java index 62060cdb..b5c28fd9 100644 --- a/src/main/java/ru/betterend/world/biome/land/BiomeShadowForest.java +++ b/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java @@ -8,8 +8,8 @@ import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; -public class BiomeShadowForest extends EndBiome { - public BiomeShadowForest() { +public class ShadowForestBiome extends EndBiome { + public ShadowForestBiome() { super(new BiomeDefinition("shadow_forest") .setFogColor(0, 0, 0) .setFogDensity(2.5F) diff --git a/src/main/java/ru/betterend/world/biome/land/BiomeSulphurSprings.java b/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java similarity index 90% rename from src/main/java/ru/betterend/world/biome/land/BiomeSulphurSprings.java rename to src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java index e370e5e7..34b704aa 100644 --- a/src/main/java/ru/betterend/world/biome/land/BiomeSulphurSprings.java +++ b/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java @@ -7,8 +7,8 @@ import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; import ru.betterend.world.surface.SurfaceBuilders; -public class BiomeSulphurSprings extends EndBiome { - public BiomeSulphurSprings() { +public class SulphurSpringsBiome extends EndBiome { + public SulphurSpringsBiome() { super(new BiomeDefinition("sulphur_springs") .setSurface(SurfaceBuilders.SULPHURIC_SURFACE) .setMusic(EndSounds.MUSIC_OPENSPACE) diff --git a/src/main/java/ru/betterend/world/biome/land/BiomeUmbrellaJungle.java b/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java similarity index 92% rename from src/main/java/ru/betterend/world/biome/land/BiomeUmbrellaJungle.java rename to src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java index 5e969919..60b32cbc 100644 --- a/src/main/java/ru/betterend/world/biome/land/BiomeUmbrellaJungle.java +++ b/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java @@ -7,8 +7,8 @@ import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; -public class BiomeUmbrellaJungle extends EndBiome { - public BiomeUmbrellaJungle() { +public class UmbrellaJungleBiome extends EndBiome { + public UmbrellaJungleBiome() { super(new BiomeDefinition("umbrella_jungle") .setFogColor(87, 223, 221) .setWaterAndFogColor(119, 198, 253) From 293f12de456334b3686049d291cfb1ffbd55e34e Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 11 Mar 2021 01:59:24 +0300 Subject: [PATCH 321/463] Stalactite block fixes --- .../blocks/basis/StalactiteBlock.java | 102 ++++++++++++------ 1 file changed, 69 insertions(+), 33 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java b/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java index 13e09a69..d7d1dc3f 100644 --- a/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java @@ -37,7 +37,6 @@ public class StalactiteBlock extends BlockBaseNotFull implements Waterloggable, public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; public static final BooleanProperty IS_FLOOR = BlockProperties.IS_FLOOR; public static final IntProperty SIZE = BlockProperties.SIZE; - private static final Mutable POS = new Mutable(); private static final VoxelShape[] SHAPES; public StalactiteBlock(Block source) { @@ -57,16 +56,19 @@ public class StalactiteBlock extends BlockBaseNotFull implements Waterloggable, @Override public BlockState getPlacementState(ItemPlacementContext ctx) { - WorldView worldView = ctx.getWorld(); - BlockPos blockPos = ctx.getBlockPos(); + WorldView world = ctx.getWorld(); + BlockPos pos = ctx.getBlockPos(); Direction dir = ctx.getSide(); - boolean water = worldView.getFluidState(blockPos).getFluid() == Fluids.WATER; + boolean water = world.getFluidState(pos).getFluid() == Fluids.WATER; - if (dir == Direction.UP) { - if (sideCoversSmallSquare(worldView, blockPos.up(), Direction.DOWN)) { + if (dir == Direction.DOWN) { + System.out.println("Check up!"); + if (isThis(world, pos.up()) || sideCoversSmallSquare(world, pos.up(), Direction.DOWN)) { + System.out.println("Up true!"); return getDefaultState().with(IS_FLOOR, false).with(WATERLOGGED, water); } - else if (sideCoversSmallSquare(worldView, blockPos.down(), Direction.UP)) { + else if (isThis(world, pos.down()) || sideCoversSmallSquare(world, pos.down(), Direction.UP)) { + System.out.println("Up false!"); return getDefaultState().with(IS_FLOOR, true).with(WATERLOGGED, water); } else { @@ -74,12 +76,15 @@ public class StalactiteBlock extends BlockBaseNotFull implements Waterloggable, } } else { - if (sideCoversSmallSquare(worldView, blockPos.up(), Direction.DOWN)) { - return getDefaultState().with(IS_FLOOR, false).with(WATERLOGGED, water); - } - else if (sideCoversSmallSquare(worldView, blockPos.down(), Direction.UP)) { + System.out.println("Check down!"); + if (isThis(world, pos.down()) || sideCoversSmallSquare(world, pos.down(), Direction.UP)) { + System.out.println("Down true!"); return getDefaultState().with(IS_FLOOR, true).with(WATERLOGGED, water); } + else if (isThis(world, pos.up()) || sideCoversSmallSquare(world, pos.up(), Direction.DOWN)) { + System.out.println("Down false!"); + return getDefaultState().with(IS_FLOOR, false).with(WATERLOGGED, water); + } else { return null; } @@ -88,16 +93,44 @@ public class StalactiteBlock extends BlockBaseNotFull implements Waterloggable, @Override public void onPlaced(World world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { - if (world.getBlockState(pos.down()).getBlock() instanceof StalactiteBlock) { - POS.setX(pos.getX()); - POS.setZ(pos.getZ()); + boolean hasUp = isThis(world, pos.up()); + boolean hasDown = isThis(world, pos.down()); + Mutable mut = new Mutable(); + if (hasUp && hasDown) { + boolean floor = state.get(IS_FLOOR); + BlockPos second = floor ? pos.up() : pos.down(); + BlockState bState = world.getBlockState(second); + world.setBlockState(pos, state.with(SIZE, 1).with(IS_FLOOR, floor)); + world.setBlockState(second, bState.with(SIZE, 1).with(IS_FLOOR, !floor)); + + bState = state; + int startSize = floor ? 1 : 2; + mut.set(pos.getX(), pos.getY() + 1, pos.getZ()); + for (int i = 0; i < 8 && isThis(bState); i++) { + world.setBlockState(mut, bState.with(SIZE, startSize++).with(IS_FLOOR, false)); + mut.setY(mut.getY() + 1); + bState = world.getBlockState(mut); + } + + bState = state; + startSize = floor ? 2 : 1; + mut.set(pos.getX(), pos.getY() - 1, pos.getZ()); + for (int i = 0; i < 8 && isThis(bState); i++) { + world.setBlockState(mut, bState.with(SIZE, startSize++).with(IS_FLOOR, true)); + mut.setY(mut.getY() - 1); + bState = world.getBlockState(mut); + } + } + else if (hasDown) { + mut.setX(pos.getX()); + mut.setZ(pos.getZ()); for (int i = 1; i < 8; i++) { - POS.setY(pos.getY() - i); - if (world.getBlockState(POS).getBlock() instanceof StalactiteBlock) { - BlockState state2 = world.getBlockState(POS); + mut.setY(pos.getY() - i); + if (isThis(world, mut)) { + BlockState state2 = world.getBlockState(mut); int size = state2.get(SIZE); if (size < i) { - world.setBlockState(POS, state2.with(SIZE, i).with(IS_FLOOR, true)); + world.setBlockState(mut, state2.with(SIZE, i).with(IS_FLOOR, true)); } else { break; @@ -108,16 +141,16 @@ public class StalactiteBlock extends BlockBaseNotFull implements Waterloggable, } } } - if (world.getBlockState(pos.up()).getBlock() instanceof StalactiteBlock) { - POS.setX(pos.getX()); - POS.setZ(pos.getZ()); + else if (hasUp) { + mut.setX(pos.getX()); + mut.setZ(pos.getZ()); for (int i = 1; i < 8; i++) { - POS.setY(pos.getY() + i); - if (world.getBlockState(POS).getBlock() instanceof StalactiteBlock) { - BlockState state2 = world.getBlockState(POS); + mut.setY(pos.getY() + i); + if (isThis(world, mut)) { + BlockState state2 = world.getBlockState(mut); int size = state2.get(SIZE); if (size < i) { - world.setBlockState(POS, state2.with(SIZE, i).with(IS_FLOOR, false)); + world.setBlockState(mut, state2.with(SIZE, i).with(IS_FLOOR, false)); } else { break; @@ -130,17 +163,20 @@ public class StalactiteBlock extends BlockBaseNotFull implements Waterloggable, } } + private boolean isThis(WorldView world, BlockPos pos) { + return isThis(world.getBlockState(pos)); + } + + private boolean isThis(BlockState state) { + return state.getBlock() instanceof StalactiteBlock; + } + @Override public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { if (!canPlaceAt(state, world, pos)) { return Blocks.AIR.getDefaultState(); } - else { - if (checkUp(world, neighborPos, state.get(SIZE))) { - state = state.with(IS_FLOOR, false); - } - return state; - } + return state; } @Override @@ -152,13 +188,13 @@ public class StalactiteBlock extends BlockBaseNotFull implements Waterloggable, private boolean checkUp(BlockView world, BlockPos pos, int size) { BlockPos p = pos.up(); BlockState state = world.getBlockState(p); - return (state.getBlock() instanceof StalactiteBlock && state.get(SIZE) >= size) || state.isFullCube(world, p); + return (isThis(state) && state.get(SIZE) >= size) || state.isFullCube(world, p); } private boolean checkDown(BlockView world, BlockPos pos, int size) { BlockPos p = pos.down(); BlockState state = world.getBlockState(p); - return (state.getBlock() instanceof StalactiteBlock && state.get(SIZE) >= size) || state.isFullCube(world, p); + return (isThis(state) && state.get(SIZE) >= size) || state.isFullCube(world, p); } @Override From 311e5f3e4bacd4d236f2d7c21d06f6b2fb36a394 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 11 Mar 2021 02:32:04 +0300 Subject: [PATCH 322/463] Stalactite fixes & issue tracker --- .../features/terrain/RoundCaveFeature.java | 198 ------------------ .../features/terrain/StalactiteFeature.java | 12 +- src/main/resources/fabric.mod.json | 1 + 3 files changed, 9 insertions(+), 202 deletions(-) delete mode 100644 src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java diff --git a/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java deleted file mode 100644 index 0416f267..00000000 --- a/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java +++ /dev/null @@ -1,198 +0,0 @@ -package ru.betterend.world.features.terrain; - -import java.util.Random; -import java.util.Set; - -import com.google.common.collect.Sets; - -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.world.Heightmap; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import ru.betterend.noise.OpenSimplexNoise; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndStructures; -import ru.betterend.registry.EndTags; -import ru.betterend.util.BlocksHelper; -import ru.betterend.util.MHelper; -import ru.betterend.util.sdf.SDF; -import ru.betterend.util.sdf.operator.SDFDisplacement; -import ru.betterend.util.sdf.operator.SDFRotation; -import ru.betterend.util.sdf.operator.SDFScale3D; -import ru.betterend.util.sdf.operator.SDFSubtraction; -import ru.betterend.util.sdf.operator.SDFTranslate; -import ru.betterend.util.sdf.primitive.SDFHexPrism; -import ru.betterend.util.sdf.primitive.SDFSphere; -import ru.betterend.world.features.DefaultFeature; -import ru.betterend.world.generator.GeneratorOptions; - -@Deprecated -public class RoundCaveFeature extends DefaultFeature { - private static final BlockState CAVE_AIR = Blocks.CAVE_AIR.getDefaultState(); - - @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!(GeneratorOptions.useNewGenerator() && GeneratorOptions.noRingVoid()) || pos.getX() * pos.getX() + pos.getZ() * pos.getZ() <= 22500) { - return false; - } - - int radius = MHelper.randRange(10, 30, random); - - int top = world.getTopY(Heightmap.Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); - Mutable bpos = new Mutable(); - bpos.setX(pos.getX()); - bpos.setZ(pos.getZ()); - bpos.setY(top - 1); - - BlockState state = world.getBlockState(bpos); - while (!state.isIn(EndTags.GEN_TERRAIN) && bpos.getY() > 5) { - bpos.setY(bpos.getY() - 1); - state = world.getBlockState(bpos); - } - if (bpos.getY() < 10) { - return false; - } - top = (int) (bpos.getY() - (radius * 1.3F + 5)); - - while (state.isIn(EndTags.GEN_TERRAIN) || !state.getFluidState().isEmpty() && bpos.getY() > 5) { - bpos.setY(bpos.getY() - 1); - state = world.getBlockState(bpos); - } - int bottom = (int) (bpos.getY() + radius * 1.3F + 5); - - if (top <= bottom) { - return false; - } - - pos = new BlockPos(pos.getX(), MHelper.randRange(bottom, top, random), pos.getZ()); - - OpenSimplexNoise noise = new OpenSimplexNoise(MHelper.getSeed(534, pos.getX(), pos.getZ())); - - int x1 = pos.getX() - radius - 5; - int z1 = pos.getZ() - radius - 5; - int x2 = pos.getX() + radius + 5; - int z2 = pos.getZ() + radius + 5; - int y1 = MHelper.floor(pos.getY() - (radius + 5) / 1.6); - int y2 = MHelper.floor(pos.getY() + (radius + 5) / 1.6); - - double hr = radius * 0.75; - double nr = radius * 0.25; - - Set bushes = Sets.newHashSet(); - BlockState terrain = EndBlocks.CAVE_MOSS.getDefaultState(); - for (int x = x1; x <= x2; x++) { - int xsq = x - pos.getX(); - xsq *= xsq; - bpos.setX(x); - for (int z = z1; z <= z2; z++) { - int zsq = z - pos.getZ(); - zsq *= zsq; - bpos.setZ(z); - for (int y = y1; y <= y2; y++) { - int ysq = y - pos.getY(); - ysq *= 1.6; - ysq *= ysq; - bpos.setY(y); - double r = noise.eval(x * 0.1, y * 0.1, z * 0.1) * nr + hr; - double r2 = r + 5; - double dist = xsq + ysq + zsq; - if (dist < r * r) { - state = world.getBlockState(bpos); - if (isReplaceable(state)) { - BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR); - - 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); - } - } - bpos.setY(y - 1); - if (world.getBlockState(bpos).isIn(EndTags.GEN_TERRAIN)) { - BlocksHelper.setWithoutUpdate(world, bpos, terrain); - } - } - else if (dist < r2 * r2) { - state = world.getBlockState(bpos); - if (!state.getFluidState().isEmpty()) { - BlocksHelper.setWithoutUpdate(world, bpos, Blocks.END_STONE.getDefaultState()); - } - else if (world.getBlockState(bpos).isIn(EndTags.GEN_TERRAIN)) { - if (world.isAir(bpos.down())) { - int h = BlocksHelper.downRay(world, bpos.down(), 64); - if (h > 6 && h < 32 && world.getBlockState(bpos.down(h + 3)).isIn(EndTags.GEN_TERRAIN)) { - bushes.add(bpos.down()); - } - } - else if (world.isAir(bpos.up())) { - int h = BlocksHelper.upRay(world, bpos.up(), 64); - if (h > 6 && h < 32 && world.getBlockState(bpos.up(h + 3)).isIn(EndTags.GEN_TERRAIN)) { - bushes.add(bpos.up()); - } - } - } - } - } - } - } - bushes.forEach((cpos) -> { - if (random.nextInt(32) == 0) { - generateBush(world, random, cpos); - } - }); - - if (random.nextBoolean() && world.getBiome(pos).getGenerationSettings().hasStructureFeature(EndStructures.MOUNTAIN.getStructure())) { - pos = pos.add(random.nextGaussian() * 5, random.nextGaussian() * 5, random.nextGaussian() * 5); - BlockPos down = pos.down(BlocksHelper.downRay(world, pos, 64) + 2); - if (isReplaceable(world.getBlockState(down))) { - SDF prism = new SDFHexPrism().setHeight(radius * MHelper.randRange(0.6F, 0.75F, random)).setRadius(MHelper.randRange(1.7F, 3F, random)).setBlock(EndBlocks.AURORA_CRYSTAL); - Vector3f vec = MHelper.randomHorizontal(random); - prism = new SDFRotation().setRotation(vec, random.nextFloat()).setSource(prism); - prism.setReplaceFunction((bState) -> { - return bState.getMaterial().isReplaceable() - || bState.isIn(EndTags.GEN_TERRAIN) - || bState.getMaterial().equals(Material.PLANT) - || bState.getMaterial().equals(Material.LEAVES); - }); - prism.fillRecursive(world, pos); - BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.AURORA_CRYSTAL); - } - } - - BlocksHelper.fixBlocks(world, new BlockPos(x1, y1, z1), new BlockPos(x2, y2, z2)); - - return true; - } - - private boolean isReplaceable(BlockState state) { - return state.isIn(EndTags.GEN_TERRAIN) - || state.getMaterial().isReplaceable() - || state.getMaterial().equals(Material.PLANT) - || state.getMaterial().equals(Material.LEAVES); - } - - private void generateBush(StructureWorldAccess world, Random random, BlockPos blockPos) { - float radius = MHelper.randRange(1.0F, 3.2F, random); - OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt()); - SDF sphere = new SDFSphere().setRadius(radius).setBlock(EndBlocks.CAVE_BUSH); - sphere = new SDFScale3D().setScale(MHelper.randRange(0.8F, 1.2F, random), MHelper.randRange(0.8F, 1.2F, random), MHelper.randRange(0.8F, 1.2F, random)).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; }).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return random.nextFloat() * 3F - 1.5F; }).setSource(sphere); - sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); - sphere.fillRecursive(world, blockPos); - BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.CAVE_BUSH); - } -} diff --git a/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java b/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java index 6e7438ff..0b1f708f 100644 --- a/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java @@ -34,7 +34,7 @@ public class StalactiteFeature extends DefaultFeature { } Mutable mut = new Mutable().set(pos); - int height = random.nextInt(8); + int height = random.nextInt(16); int dir = ceiling ? -1 : 1; boolean stalagnate = false; @@ -43,15 +43,19 @@ public class StalactiteFeature extends DefaultFeature { BlockState state = world.getBlockState(mut); if (!state.getMaterial().isReplaceable()) { stalagnate = state.isIn(EndTags.GEN_TERRAIN); - height = i - 1; + height = i; break; } } - int center = stalagnate ? height >> 1 : 0; + if (!stalagnate && height > 7) { + height = random.nextInt(8); + } + + float center = height * 0.5F; for (int i = 0; i < height; i++) { mut.setY(pos.getY() + i * dir); - int size = stalagnate ? MathHelper.abs(i - center) + 1 : height - i - 1; + int size = stalagnate ? MathHelper.clamp((int) (MathHelper.abs(i - center) + 1), 1, 7) : height - i - 1; boolean waterlogged = !world.getFluidState(mut).isEmpty(); BlockState base = block.getDefaultState().with(StalactiteBlock.SIZE, size).with(Properties.WATERLOGGED, waterlogged); BlockState state = stalagnate ? base.with(StalactiteBlock.IS_FLOOR, dir > 0 ? i < center : i > center) : base.with(StalactiteBlock.IS_FLOOR, dir > 0); diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index a832e8b1..1324e41a 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -11,6 +11,7 @@ ], "contact": { "homepage": "https://www.curseforge.com/minecraft/mc-mods/betterend", + "issues": "https://github.com/paulevsGitch/BetterEnd/issues", "sources": "https://github.com/paulevsGitch/BetterEnd" }, From 9b464bcc06d5ade38c19e47fdd66fcc05258fe03 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 11 Mar 2021 03:55:14 +0300 Subject: [PATCH 323/463] TripleTerrain (WIP) --- .../ru/betterend/blocks/EndTerrainBlock.java | 2 +- .../blocks/basis/TripleTerrainBlock.java | 96 ++++++++++++++++++ .../java/ru/betterend/patterns/Patterns.java | 1 + .../java/ru/betterend/registry/EndBlocks.java | 4 +- .../assets/betterend/blockstates/rubinea.json | 7 ++ .../models/block/rubinea_bottom.json | 6 ++ .../models/block/rubinea_middle.json | 6 ++ .../assets/betterend/models/item/rubinea.json | 6 ++ .../blockstate/triple_rotated_top.json | 22 ++++ .../textures/block/jungle_vine_bottom.png | Bin 324 -> 223 bytes .../betterend/textures/block/rubinea.png | Bin 0 -> 234 bytes .../textures/block/rubinea_bottom.png | Bin 0 -> 223 bytes 12 files changed, 148 insertions(+), 2 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java create mode 100644 src/main/resources/assets/betterend/blockstates/rubinea.json create mode 100644 src/main/resources/assets/betterend/models/block/rubinea_bottom.json create mode 100644 src/main/resources/assets/betterend/models/block/rubinea_middle.json create mode 100644 src/main/resources/assets/betterend/models/item/rubinea.json create mode 100644 src/main/resources/assets/betterend/patterns/blockstate/triple_rotated_top.json create mode 100644 src/main/resources/assets/betterend/textures/block/rubinea.png create mode 100644 src/main/resources/assets/betterend/textures/block/rubinea_bottom.png diff --git a/src/main/java/ru/betterend/blocks/EndTerrainBlock.java b/src/main/java/ru/betterend/blocks/EndTerrainBlock.java index c1dd4e0b..51c6a48f 100644 --- a/src/main/java/ru/betterend/blocks/EndTerrainBlock.java +++ b/src/main/java/ru/betterend/blocks/EndTerrainBlock.java @@ -79,7 +79,7 @@ public class EndTerrainBlock extends BlockBase { } } - public static boolean canSurvive(BlockState state, WorldView worldView, BlockPos pos) { + protected boolean canSurvive(BlockState state, WorldView worldView, BlockPos pos) { BlockPos blockPos = pos.up(); BlockState blockState = worldView.getBlockState(blockPos); if (blockState.isOf(Blocks.SNOW) && (Integer) blockState.get(SnowBlock.LAYERS) == 1) { diff --git a/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java new file mode 100644 index 00000000..21fd221f --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java @@ -0,0 +1,96 @@ +package ru.betterend.blocks.basis; + +import java.util.Map; +import java.util.Random; + +import com.google.common.collect.Maps; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.MaterialColor; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.EnumProperty; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.registry.Registry; +import net.minecraft.world.WorldView; +import ru.betterend.blocks.BlockProperties; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.patterns.Patterns; +import ru.betterend.blocks.EndTerrainBlock; + +public class TripleTerrainBlock extends EndTerrainBlock { + public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; + + public TripleTerrainBlock(MaterialColor color) { + super(color); + this.setDefaultState(this.getDefaultState().with(SHAPE, TripleShape.BOTTOM)); + } + + @Override + protected void appendProperties(StateManager.Builder stateManager) { + stateManager.add(SHAPE); + } + + @Override + public String getModelPattern(String block) { + System.out.println(block); + String name = Registry.BLOCK.getId(this).getPath(); + if (block.endsWith("_middle")) { + return Patterns.createJson(Patterns.BLOCK_BASE, name + "_top"); + } + Map map = Maps.newHashMap(); + map.put("%top%", "betterend:block/" + name + "_top"); + map.put("%side%", "betterend:block/" + name + "_side"); + map.put("%bottom%", "minecraft:block/end_stone"); + return Patterns.createJson(Patterns.BLOCK_TOP_SIDE_BOTTOM, map); + } + + @Override + public Identifier statePatternId() { + return Patterns.STATE_TRIPLE_ROTATED_TOP; + } + + @Override + public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + TripleShape shape = state.get(SHAPE); + if (shape == TripleShape.TOP) { + super.randomTick(state, world, pos, random); + return; + } + else if (random.nextInt(16) == 0) { + boolean bottom = canSurviveBottom(world, pos); + if (shape == TripleShape.BOTTOM) { + if (!bottom) { + world.setBlockState(pos, Blocks.END_STONE.getDefaultState()); + } + } + else { + boolean top = canSurvive(state, world, pos); + if (!top && !bottom) { + world.setBlockState(pos, Blocks.END_STONE.getDefaultState()); + } + else if (top && !bottom) { + world.setBlockState(pos, state.with(SHAPE, TripleShape.TOP)); + } + else if (!top && bottom) { + world.setBlockState(pos, state.with(SHAPE, TripleShape.BOTTOM)); + } + } + } + } + + protected boolean canSurviveBottom(WorldView world, BlockPos pos) { + BlockPos blockPos = pos.down(); + BlockState blockState = world.getBlockState(blockPos); + if (blockState.getFluidState().getLevel() == 8) { + return false; + } + else { + return !blockState.isSideSolidFullSquare(world, blockPos, Direction.UP); + } + } +} diff --git a/src/main/java/ru/betterend/patterns/Patterns.java b/src/main/java/ru/betterend/patterns/Patterns.java index ad73c1a7..67c72d3e 100644 --- a/src/main/java/ru/betterend/patterns/Patterns.java +++ b/src/main/java/ru/betterend/patterns/Patterns.java @@ -46,6 +46,7 @@ public class Patterns { public final static Identifier STATE_CHANDELIER = BetterEnd.makeID("patterns/blockstate/chandelier.json"); public final static Identifier STATE_FURNACE = BetterEnd.makeID("patterns/blockstate/furnace.json"); public final static Identifier STATE_ROTATED_TOP = BetterEnd.makeID("patterns/blockstate/rotated_top.json"); + public final static Identifier STATE_TRIPLE_ROTATED_TOP = BetterEnd.makeID("patterns/blockstate/triple_rotated_top.json"); public final static Identifier STATE_STALACTITE = BetterEnd.makeID("patterns/blockstate/stalactite.json"); //Models Block diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index b40797a3..ed788d7b 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -110,6 +110,7 @@ import ru.betterend.blocks.basis.FurBlock; import ru.betterend.blocks.basis.SimpleLeavesBlock; import ru.betterend.blocks.basis.StalactiteBlock; import ru.betterend.blocks.basis.StoneLanternBlock; +import ru.betterend.blocks.basis.TripleTerrainBlock; import ru.betterend.blocks.basis.VineBlock; import ru.betterend.blocks.basis.WallMushroomBlock; import ru.betterend.blocks.complex.ColoredMaterial; @@ -126,7 +127,7 @@ public class EndBlocks { public static final Block END_MYCELIUM = registerBlock("end_mycelium", new EndTerrainBlock(MaterialColor.LIGHT_BLUE)); public static final Block END_MOSS = registerBlock("end_moss", new EndTerrainBlock(MaterialColor.CYAN)); public static final Block CHORUS_NYLIUM = registerBlock("chorus_nylium", new EndTerrainBlock(MaterialColor.MAGENTA)); - public static final Block CAVE_MOSS = registerBlock("cave_moss", new EndTerrainBlock(MaterialColor.PURPLE)); + public static final Block CAVE_MOSS = registerBlock("cave_moss", new TripleTerrainBlock(MaterialColor.PURPLE)); public static final Block CRYSTAL_MOSS = registerBlock("crystal_moss", new EndTerrainBlock(MaterialColor.PINK)); public static final Block SHADOW_GRASS = registerBlock("shadow_grass", new ShadowGrassBlock()); public static final Block PINK_MOSS = registerBlock("pink_moss", new EndTerrainBlock(MaterialColor.PINK)); @@ -322,6 +323,7 @@ public class EndBlocks { public static final Block BULB_VINE_SEED = registerBlock("bulb_vine_seed", new BulbVineSeedBlock()); public static final Block BULB_VINE = registerBlock("bulb_vine", new BulbVineBlock()); public static final Block JUNGLE_VINE = registerBlock("jungle_vine", new VineBlock()); + public static final Block RUBINEA = registerBlock("rubinea", new VineBlock()); // Mob-Related public static final Block SILK_MOTH_NEST = registerBlock("silk_moth_nest", new SilkMothNestBlock()); diff --git a/src/main/resources/assets/betterend/blockstates/rubinea.json b/src/main/resources/assets/betterend/blockstates/rubinea.json new file mode 100644 index 00000000..4c03ccf6 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/rubinea.json @@ -0,0 +1,7 @@ +{ + "variants": { + "shape=top": { "model": "betterend:block/rubinea_middle" }, + "shape=middle": { "model": "betterend:block/rubinea_middle" }, + "shape=bottom": { "model": "betterend:block/rubinea_bottom" } + } +} diff --git a/src/main/resources/assets/betterend/models/block/rubinea_bottom.json b/src/main/resources/assets/betterend/models/block/rubinea_bottom.json new file mode 100644 index 00000000..37fb8bb5 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/rubinea_bottom.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_no_distortion", + "textures": { + "texture": "betterend:block/rubinea_bottom" + } +} diff --git a/src/main/resources/assets/betterend/models/block/rubinea_middle.json b/src/main/resources/assets/betterend/models/block/rubinea_middle.json new file mode 100644 index 00000000..b99830f1 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/rubinea_middle.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_no_distortion", + "textures": { + "texture": "betterend:block/rubinea" + } +} diff --git a/src/main/resources/assets/betterend/models/item/rubinea.json b/src/main/resources/assets/betterend/models/item/rubinea.json new file mode 100644 index 00000000..d510c6ef --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/rubinea.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/rubinea_bottom" + } +} diff --git a/src/main/resources/assets/betterend/patterns/blockstate/triple_rotated_top.json b/src/main/resources/assets/betterend/patterns/blockstate/triple_rotated_top.json new file mode 100644 index 00000000..7fd583ce --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/blockstate/triple_rotated_top.json @@ -0,0 +1,22 @@ +{ + "variants": { + "shape=bottom": [ + { "model": "betterend:pattern/%block%" }, + { "model": "betterend:pattern/%block%", "y": 90 }, + { "model": "betterend:pattern/%block%", "y": 180 }, + { "model": "betterend:pattern/%block%", "y": 270 } + ], + "shape=middle": [ + { "model": "betterend:pattern/%block%_middle" }, + { "model": "betterend:pattern/%block%_middle", "y": 90 }, + { "model": "betterend:pattern/%block%_middle", "y": 180 }, + { "model": "betterend:pattern/%block%_middle", "y": 270 } + ], + "shape=top": [ + { "model": "betterend:pattern/%block%" }, + { "model": "betterend:pattern/%block%", "x": 180, "y": 90 }, + { "model": "betterend:pattern/%block%", "x": 180, "y": 180 }, + { "model": "betterend:pattern/%block%", "x": 180, "y": 270 } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/jungle_vine_bottom.png b/src/main/resources/assets/betterend/textures/block/jungle_vine_bottom.png index 072702fd512bdd71124ddcc52b93a36fc3d01f28..aec4132b6e5048db241baa572b5d882b72bab551 100644 GIT binary patch delta 206 zcmX@Ybf0m8WIZzj1A~Sxe=v|@EDmyaVpw-h<|U9L5#STz3Z%t-5+tK?!P{$S;`TKLlJo6=DPwOZ0Sc43U^x>gOqRK!GD!MdknhLdLbX zoQo6AI9*s{VB=!#P!Zt1=#Xo`j2I@vB6p{(xOvQ99deiI7ca8i8X&y(#+{Q}92Xv4 zy;ZN)Zd1}OR;h>9A+nJ@XKUr|>^QtWX@3PnxfPRJ+8^}=K-(BRUHx3vIVCg!06+Ck AkN^Mx delta 308 zcmV-40n7g10mK538Gi-<001BJ|6u?C0Sie)K~#9!m6JUR!axv(_Zl`zuuuf8Y%DFk zf`u0_Vi6RPfEcw95&tS%3k!QsA$S#!F#1BC>`xMLVPJPM@0;0~jS>-MTcPVq$)8E( zbdb(%C(ZLl(&Au_qa00QApsBrk_9pj3?_ggK=}>(Q~lWNF~c2Aplsp?|>_Oyqu~4V1i5lA^q#~+ptm)C{6&))gP22W@bRxSO8!g z;Rljk0pEZr)Iz$m*cR#m@|JWNgIChQd*!QCV0000gUk#7YH2HJc7y6PmHwc*(_gwmV}E1m6vp z*s+}P-0UOs8t*GwMIS%)%YyOry${zXF|HFVdU`qiJD>R4=W_dhSs2th2E4!edGS~N Y%A-s>*KIf&4YZWO)78&qol`;+07Q3K3;+NC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/rubinea_bottom.png b/src/main/resources/assets/betterend/textures/block/rubinea_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..5601c26870202c77b32ca43fdceab29e0b6c4a8b GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~i2$DvS0G(3 zV%a9@I8DN9sbbJtwaA@%iKi^{M6(vW1Ilrf1o;Is{D*+6r$UT?Vu_wEjv*3LOZ_~B z4k&OWtEl|{U&y%jmUD5!8K(x9Zi}ZA#k3D)rDhL^iVLY^~g#9f#K^?XO@cw_d2 LtDnm{r-UW|9C1z~ literal 0 HcmV?d00001 From 82c0b121182522014d3f586101befc7e560b9464 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 11 Mar 2021 04:33:22 +0300 Subject: [PATCH 324/463] Ceiling generation --- .../blocks/basis/TripleTerrainBlock.java | 8 +++ .../ru/betterend/registry/EndFeatures.java | 1 + .../world/biome/cave/EndCaveBiome.java | 6 ++ .../world/biome/cave/LushAuroraCaveBiome.java | 14 +++- .../world/features/bushes/BushFeature.java | 2 +- .../terrain/caves/EndCaveFeature.java | 71 ++++++++----------- .../blockstate/triple_rotated_top.json | 2 +- 7 files changed, 59 insertions(+), 45 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java index 21fd221f..25154c94 100644 --- a/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java @@ -9,6 +9,7 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.MaterialColor; +import net.minecraft.item.ItemPlacementContext; import net.minecraft.server.world.ServerWorld; import net.minecraft.state.StateManager; import net.minecraft.state.property.EnumProperty; @@ -35,6 +36,13 @@ public class TripleTerrainBlock extends EndTerrainBlock { stateManager.add(SHAPE); } + @Override + public BlockState getPlacementState(ItemPlacementContext ctx) { + Direction dir = ctx.getSide(); + TripleShape shape = dir == Direction.UP ? TripleShape.BOTTOM : dir == Direction.DOWN ? TripleShape.TOP : TripleShape.MIDDLE; + return this.getDefaultState().with(SHAPE, shape); + } + @Override public String getModelPattern(String block) { System.out.println(block); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index e6ae3f86..e5d18f4f 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -197,6 +197,7 @@ public class EndFeatures { public static final DefaultFeature BIG_AURORA_CRYSTAL = new BigAuroraCrystalFeature(); public static final DefaultFeature CAVE_BUSH = new BushFeature(EndBlocks.CAVE_BUSH, EndBlocks.CAVE_BUSH); public static final DefaultFeature CAVE_GRASS = new SingleBlockFeature(EndBlocks.CAVE_GRASS); + public static final DefaultFeature RUBINEA = new VineFeature(EndBlocks.RUBINEA, 8); public static final DefaultFeature END_STONE_STALACTITE = new StalactiteFeature(true, EndBlocks.END_STONE_STALACTITE, Blocks.END_STONE); public static final DefaultFeature END_STONE_STALAGMITE = new StalactiteFeature(false, EndBlocks.END_STONE_STALACTITE, Blocks.END_STONE); public static final DefaultFeature END_STONE_STALACTITE_CAVEMOSS = new StalactiteFeature(true, EndBlocks.END_STONE_STALACTITE_CAVEMOSS, Blocks.END_STONE, EndBlocks.CAVE_MOSS); diff --git a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java index b9a5b338..4ca1e5a6 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java @@ -2,7 +2,9 @@ package ru.betterend.world.biome.cave; import java.util.Random; +import net.minecraft.block.BlockState; import net.minecraft.util.collection.WeightedList; +import net.minecraft.util.math.BlockPos; import net.minecraft.world.gen.feature.Feature; import ru.betterend.world.biome.land.BiomeDefinition; import ru.betterend.world.biome.land.EndBiome; @@ -38,4 +40,8 @@ public class EndCaveBiome extends EndBiome { public float getCeilDensity() { return 0; } + + public BlockState getCeil(BlockPos pos) { + return null; + } } diff --git a/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java index 284d38de..5d56029a 100644 --- a/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java @@ -1,5 +1,9 @@ package ru.betterend.world.biome.cave; +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; +import ru.betterend.blocks.BlockProperties; +import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; @@ -20,10 +24,11 @@ public class LushAuroraCaveBiome extends EndCaveBiome { this.addFloorFeature(EndFeatures.BIG_AURORA_CRYSTAL, 1); this.addFloorFeature(EndFeatures.CAVE_BUSH, 5); this.addFloorFeature(EndFeatures.CAVE_GRASS, 40); - this.addFloorFeature(EndFeatures.END_STONE_STALAGMITE_CAVEMOSS, 10); + this.addFloorFeature(EndFeatures.END_STONE_STALAGMITE_CAVEMOSS, 5); this.addCeilFeature(EndFeatures.CAVE_BUSH, 1); - this.addCeilFeature(EndFeatures.END_STONE_STALACTITE_CAVEMOSS, 20); + this.addCeilFeature(EndFeatures.RUBINEA, 3); + this.addCeilFeature(EndFeatures.END_STONE_STALACTITE_CAVEMOSS, 10); } @Override @@ -35,4 +40,9 @@ public class LushAuroraCaveBiome extends EndCaveBiome { public float getCeilDensity() { return 0.1F; } + + @Override + public BlockState getCeil(BlockPos pos) { + return EndBlocks.CAVE_MOSS.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP); + } } diff --git a/src/main/java/ru/betterend/world/features/bushes/BushFeature.java b/src/main/java/ru/betterend/world/features/bushes/BushFeature.java index c7248e0b..f06a4f4d 100644 --- a/src/main/java/ru/betterend/world/features/bushes/BushFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/BushFeature.java @@ -36,7 +36,7 @@ public class BushFeature extends DefaultFeature { @Override public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; + if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND) && !world.getBlockState(pos.up()).getBlock().isIn(EndTags.END_GROUND)) return false; float radius = MHelper.randRange(1.8F, 3.5F, random); OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt()); 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 d41efa0d..7b8ff74f 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 @@ -52,31 +52,23 @@ public abstract class EndCaveFeature extends DefaultFeature { Set caveBlocks = generate(world, center, radius, random); if (!caveBlocks.isEmpty()) { if (biome != null) { - boolean fillFloor = biome.getFloorDensity() > 0; - boolean fillCeil = biome.getCeilDensity() > 0; setBiomes(world, biome, caveBlocks); Set floorPositions = Sets.newHashSet(); Set ceilPositions = Sets.newHashSet(); Mutable mut = new Mutable(); - if (fillFloor || fillCeil) { - caveBlocks.forEach((bpos) -> { - mut.set(bpos); - if (world.getBlockState(mut).getMaterial().isReplaceable()) { - if (fillFloor) { - mut.setY(bpos.getY() - 1); - if (world.getBlockState(mut).isIn(EndTags.GEN_TERRAIN)) { - floorPositions.add(mut.toImmutable()); - } - } - if (fillCeil) { - mut.setY(bpos.getY() + 1); - if (world.getBlockState(mut).isIn(EndTags.GEN_TERRAIN)) { - ceilPositions.add(mut.toImmutable()); - } - } + caveBlocks.forEach((bpos) -> { + mut.set(bpos); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + mut.setY(bpos.getY() - 1); + if (world.getBlockState(mut).isIn(EndTags.GEN_TERRAIN)) { + floorPositions.add(mut.toImmutable()); } - }); - } + mut.setY(bpos.getY() + 1); + if (world.getBlockState(mut).isIn(EndTags.GEN_TERRAIN)) { + ceilPositions.add(mut.toImmutable()); + } + } + }); BlockState surfaceBlock = biome.getBiome().getGenerationSettings().getSurfaceConfig().getTopMaterial(); placeFloor(world, biome, floorPositions, random, surfaceBlock); placeCeil(world, biome, ceilPositions, random); @@ -90,35 +82,32 @@ public abstract class EndCaveFeature extends DefaultFeature { protected abstract Set generate(StructureWorldAccess world, BlockPos center, int radius, Random random); protected void placeFloor(StructureWorldAccess world, EndCaveBiome biome, Set floorPositions, Random random, BlockState surfaceBlock) { + float density = biome.getFloorDensity(); floorPositions.forEach((pos) -> { BlocksHelper.setWithoutUpdate(world, pos, surfaceBlock); - }); - - float density = biome.getFloorDensity(); - if (density > 0) { - floorPositions.forEach((pos) -> { - if (random.nextFloat() <= density) { - Feature feature = biome.getFloorFeature(random); - if (feature != null) { - feature.generate(world, null, random, pos.up(), null); - } + if (density > 0 && random.nextFloat() <= density) { + Feature feature = biome.getFloorFeature(random); + if (feature != null) { + feature.generate(world, null, random, pos.up(), null); } - }); - } + } + }); } protected void placeCeil(StructureWorldAccess world, EndCaveBiome biome, Set ceilPositions, Random random) { float density = biome.getCeilDensity(); - if (density > 0) { - ceilPositions.forEach((pos) -> { - if (random.nextFloat() <= density) { - Feature feature = biome.getCeilFeature(random); - if (feature != null) { - feature.generate(world, null, random, pos.down(), null); - } + ceilPositions.forEach((pos) -> { + BlockState ceilBlock = biome.getCeil(pos); + if (ceilBlock != null) { + BlocksHelper.setWithoutUpdate(world, pos, ceilBlock); + } + if (density > 0 && random.nextFloat() <= density) { + Feature feature = biome.getCeilFeature(random); + if (feature != null) { + feature.generate(world, null, random, pos.down(), null); } - }); - } + } + }); } protected void setBiomes(StructureWorldAccess world, EndCaveBiome biome, Set blocks) { diff --git a/src/main/resources/assets/betterend/patterns/blockstate/triple_rotated_top.json b/src/main/resources/assets/betterend/patterns/blockstate/triple_rotated_top.json index 7fd583ce..36ff9261 100644 --- a/src/main/resources/assets/betterend/patterns/blockstate/triple_rotated_top.json +++ b/src/main/resources/assets/betterend/patterns/blockstate/triple_rotated_top.json @@ -13,7 +13,7 @@ { "model": "betterend:pattern/%block%_middle", "y": 270 } ], "shape=top": [ - { "model": "betterend:pattern/%block%" }, + { "model": "betterend:pattern/%block%", "x": 180 }, { "model": "betterend:pattern/%block%", "x": 180, "y": 90 }, { "model": "betterend:pattern/%block%", "x": 180, "y": 180 }, { "model": "betterend:pattern/%block%", "x": 180, "y": 270 } From c245a37de3722f7965eaa96ded4c8354aeff5b36 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 11 Mar 2021 16:26:58 +0300 Subject: [PATCH 325/463] Translations & crops (WIP) --- .../ru/betterend/blocks/ShadowBerryBlock.java | 48 ++------------ .../betterend/blocks/basis/EndCropBlock.java | 12 +++- .../ru/betterend/recipe/FurnaceRecipes.java | 1 + .../java/ru/betterend/registry/EndBlocks.java | 7 +- .../java/ru/betterend/registry/EndItems.java | 3 + .../blockstates/amber_root_seed.json | 20 ++++++ .../blockstates/chorus_mushroom_seed.json | 20 ++++++ .../assets/betterend/lang/en_us.json | 62 +++++++++++++++++- .../assets/betterend/lang/ru_ru.json | 62 +++++++++++++++++- .../betterend/models/block/amber_root_0.json | 6 ++ .../betterend/models/block/amber_root_1.json | 6 ++ .../betterend/models/block/amber_root_2.json | 6 ++ .../betterend/models/block/amber_root_3.json | 6 ++ .../betterend/models/block/amber_root_4.json | 6 ++ .../betterend/models/block/amber_root_5.json | 6 ++ .../betterend/models/block/amber_root_6.json | 6 ++ .../betterend/models/block/amber_root_7.json | 6 ++ .../models/block/chorus_mushroom_0.json | 6 ++ .../models/block/chorus_mushroom_1.json | 6 ++ .../models/block/chorus_mushroom_2.json | 6 ++ .../models/block/chorus_mushroom_3.json | 6 ++ .../models/block/chorus_mushroom_4.json | 6 ++ .../models/block/chorus_mushroom_5.json | 6 ++ .../models/block/chorus_mushroom_6.json | 6 ++ .../models/block/chorus_mushroom_7.json | 6 ++ .../models/item/amber_root_seed.json | 6 ++ .../models/item/chorus_mushroom_seed.json | 6 ++ .../betterend/textures/block/amber_grass.png | Bin 264 -> 220 bytes .../betterend/textures/block/amber_root_0.png | Bin 0 -> 167 bytes .../betterend/textures/block/amber_root_1.png | Bin 0 -> 194 bytes .../betterend/textures/block/amber_root_2.png | Bin 0 -> 229 bytes .../betterend/textures/block/amber_root_3.png | Bin 0 -> 251 bytes .../textures/block/chorus_mushroom_0.png | Bin 0 -> 146 bytes .../textures/block/chorus_mushroom_1.png | Bin 0 -> 165 bytes .../textures/block/chorus_mushroom_2.png | Bin 0 -> 241 bytes .../textures/block/chorus_mushroom_3.png | Bin 0 -> 364 bytes .../textures/item/amber_root_raw.png | Bin 0 -> 188 bytes .../textures/item/amber_root_seed.png | Bin 0 -> 160 bytes .../textures/item/chorus_mushroom_cooked.png | Bin 0 -> 207 bytes .../textures/item/chorus_mushroom_raw.png | Bin 0 -> 211 bytes .../textures/item/chorus_mushroom_seed.png | Bin 0 -> 168 bytes 41 files changed, 292 insertions(+), 51 deletions(-) create mode 100644 src/main/resources/assets/betterend/blockstates/amber_root_seed.json create mode 100644 src/main/resources/assets/betterend/blockstates/chorus_mushroom_seed.json create mode 100644 src/main/resources/assets/betterend/models/block/amber_root_0.json create mode 100644 src/main/resources/assets/betterend/models/block/amber_root_1.json create mode 100644 src/main/resources/assets/betterend/models/block/amber_root_2.json create mode 100644 src/main/resources/assets/betterend/models/block/amber_root_3.json create mode 100644 src/main/resources/assets/betterend/models/block/amber_root_4.json create mode 100644 src/main/resources/assets/betterend/models/block/amber_root_5.json create mode 100644 src/main/resources/assets/betterend/models/block/amber_root_6.json create mode 100644 src/main/resources/assets/betterend/models/block/amber_root_7.json create mode 100644 src/main/resources/assets/betterend/models/block/chorus_mushroom_0.json create mode 100644 src/main/resources/assets/betterend/models/block/chorus_mushroom_1.json create mode 100644 src/main/resources/assets/betterend/models/block/chorus_mushroom_2.json create mode 100644 src/main/resources/assets/betterend/models/block/chorus_mushroom_3.json create mode 100644 src/main/resources/assets/betterend/models/block/chorus_mushroom_4.json create mode 100644 src/main/resources/assets/betterend/models/block/chorus_mushroom_5.json create mode 100644 src/main/resources/assets/betterend/models/block/chorus_mushroom_6.json create mode 100644 src/main/resources/assets/betterend/models/block/chorus_mushroom_7.json create mode 100644 src/main/resources/assets/betterend/models/item/amber_root_seed.json create mode 100644 src/main/resources/assets/betterend/models/item/chorus_mushroom_seed.json create mode 100644 src/main/resources/assets/betterend/textures/block/amber_root_0.png create mode 100644 src/main/resources/assets/betterend/textures/block/amber_root_1.png create mode 100644 src/main/resources/assets/betterend/textures/block/amber_root_2.png create mode 100644 src/main/resources/assets/betterend/textures/block/amber_root_3.png create mode 100644 src/main/resources/assets/betterend/textures/block/chorus_mushroom_0.png create mode 100644 src/main/resources/assets/betterend/textures/block/chorus_mushroom_1.png create mode 100644 src/main/resources/assets/betterend/textures/block/chorus_mushroom_2.png create mode 100644 src/main/resources/assets/betterend/textures/block/chorus_mushroom_3.png create mode 100644 src/main/resources/assets/betterend/textures/item/amber_root_raw.png create mode 100644 src/main/resources/assets/betterend/textures/item/amber_root_seed.png create mode 100644 src/main/resources/assets/betterend/textures/item/chorus_mushroom_cooked.png create mode 100644 src/main/resources/assets/betterend/textures/item/chorus_mushroom_raw.png create mode 100644 src/main/resources/assets/betterend/textures/item/chorus_mushroom_seed.png diff --git a/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java b/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java index 06c06ef8..28851136 100644 --- a/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java +++ b/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java @@ -1,64 +1,24 @@ package ru.betterend.blocks; -import java.util.List; -import java.util.Random; - -import com.google.common.collect.Lists; - -import net.minecraft.block.AbstractBlock; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.ShapeContext; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; import net.minecraft.util.math.BlockPos; import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.BlockView; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.World; -import ru.betterend.blocks.basis.EndPlantWithAgeBlock; +import ru.betterend.blocks.basis.EndCropBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; -import ru.betterend.util.MHelper; -public class ShadowBerryBlock extends EndPlantWithAgeBlock { +public class ShadowBerryBlock extends EndCropBlock { private static final VoxelShape SHAPE = Block.createCuboidShape(1, 0, 1, 15, 8, 15); - @Override - public void growAdult(StructureWorldAccess world, Random random, BlockPos pos) {} - - @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - if (state.get(AGE) < 3) { - return Lists.newArrayList(new ItemStack(this)); - } - else { - return Lists.newArrayList(new ItemStack(this), new ItemStack(EndItems.SHADOW_BERRY_RAW, MHelper.randRange(1, 3, MHelper.RANDOM))); - } - } - - @Override - public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { - return state.get(AGE) < 3; - } - - @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { - return state.get(AGE) < 3; + public ShadowBerryBlock() { + super(EndItems.SHADOW_BERRY_RAW, EndBlocks.SHADOW_GRASS); } @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { return SHAPE; } - - @Override - public AbstractBlock.OffsetType getOffsetType() { - return AbstractBlock.OffsetType.NONE; - } - - @Override - protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.SHADOW_GRASS); - } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndCropBlock.java b/src/main/java/ru/betterend/blocks/basis/EndCropBlock.java index 16d5e8f9..2ff00d6b 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndCropBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndCropBlock.java @@ -12,6 +12,7 @@ import net.minecraft.block.AbstractBlock; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Material; +import net.minecraft.block.ShapeContext; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.enchantment.Enchantments; import net.minecraft.item.Item; @@ -24,12 +25,14 @@ import net.minecraft.state.StateManager; import net.minecraft.state.property.IntProperty; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; +import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.BlockView; import net.minecraft.world.World; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; public class EndCropBlock extends EndPlantBlock { + private static final VoxelShape SHAPE = Block.createCuboidShape(2, 0, 2, 14, 14, 14); public static final IntProperty AGE = IntProperty.of("age", 0, 3); private final Block[] terrain; @@ -101,14 +104,19 @@ public class EndCropBlock extends EndPlantBlock { @Override public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { - return random.nextInt(8) == 0 && state.get(AGE) < 3; + return state.get(AGE) < 3; } @Override public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { super.scheduledTick(state, world, pos, random); - if (canGrow(world, random, pos, state)) { + if (canGrow(world, random, pos, state) && random.nextInt(8) == 0) { grow(world, random, pos, state); } } + + @Override + public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + return SHAPE; + } } diff --git a/src/main/java/ru/betterend/recipe/FurnaceRecipes.java b/src/main/java/ru/betterend/recipe/FurnaceRecipes.java index 8f5546bb..ff5dd528 100644 --- a/src/main/java/ru/betterend/recipe/FurnaceRecipes.java +++ b/src/main/java/ru/betterend/recipe/FurnaceRecipes.java @@ -14,5 +14,6 @@ public class FurnaceRecipes { FurnaceRecipe.make("end_fish", EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED).build(); FurnaceRecipe.make("slime_ball", EndBlocks.JELLYSHROOM_CAP_PURPLE, Items.SLIME_BALL).build(); FurnaceRecipe.make("menger_sponge", EndBlocks.MENGER_SPONGE_WET, EndBlocks.MENGER_SPONGE).build(); + FurnaceRecipe.make("chorus_mushroom", EndItems.CHORUS_MUSHROOM_RAW, EndItems.CHORUS_MUSHROOM_COOKED).build(); } } diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index ed788d7b..d7312cb8 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -279,7 +279,11 @@ public class EndBlocks { public static final Block AMARANITA_CAP = registerBlock("amaranita_cap", new AmaranitaCapBlock()); // Crops + public static final Block SHADOW_BERRY = registerBlock("shadow_berry", new ShadowBerryBlock()); public static final Block BLOSSOM_BERRY = registerBlock("blossom_berry_seed", new EndCropBlock(EndItems.BLOSSOM_BERRY, PINK_MOSS)); + public static final Block AMBER_ROOT = registerBlock("amber_root_seed", new EndCropBlock(EndItems.AMBER_ROOT_RAW, AMBER_MOSS)); + public static final Block CHORUS_MUSHROOM = registerBlock("chorus_mushroom_seed", new EndCropBlock(EndItems.CHORUS_MUSHROOM_RAW, CHORUS_NYLIUM)); + public static final Block PEARLBERRY = registerBlock("pearlberry_seed", new EndCropBlock(EndItems.BLOSSOM_BERRY, END_MOSS, END_MYCELIUM)); // Water plants public static final Block BUBBLE_CORAL = registerBlock("bubble_coral", new BubbleCoralBlock()); @@ -314,9 +318,6 @@ public class EndBlocks { public static final Block BULB_MOSS = registerBlock("bulb_moss", new EndWallPlantBlock(12)); public static final Block JUNGLE_FERN = registerBlock("jungle_fern", new EndWallPlantBlock()); - // Crops // - public static final Block SHADOW_BERRY = registerBlock("shadow_berry", new ShadowBerryBlock()); - // Vines // public static final Block DENSE_VINE = registerBlock("dense_vine", new VineBlock(15, true)); public static final Block TWISTED_VINE = registerBlock("twisted_vine", new VineBlock()); diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index 16e29828..3d142761 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -117,6 +117,9 @@ public class EndItems { public final static Item SWEET_BERRY_JELLY = registerFood("sweet_berry_jelly", 6, 0.75F); public final static Item SHADOW_BERRY_JELLY = registerFood("shadow_berry_jelly", 7, 0.75F, new StatusEffectInstance(StatusEffects.NIGHT_VISION, 400)); public final static Item BLOSSOM_BERRY = registerFood("blossom_berry", FoodComponents.APPLE); + public final static Item AMBER_ROOT_RAW = registerFood("amber_root_raw", 2, 0.8F); + public final static Item CHORUS_MUSHROOM_RAW = registerFood("chorus_mushroom_raw", 3, 0.5F); + public final static Item CHORUS_MUSHROOM_COOKED = registerFood("chorus_mushroom_cooked", FoodComponents.MUSHROOM_STEW); // Drinks // public final static Item UMBRELLA_CLUSTER_JUICE = registerDrink("umbrella_cluster_juice", 5, 0.7F); diff --git a/src/main/resources/assets/betterend/blockstates/amber_root_seed.json b/src/main/resources/assets/betterend/blockstates/amber_root_seed.json new file mode 100644 index 00000000..73ec7c46 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/amber_root_seed.json @@ -0,0 +1,20 @@ +{ + "variants": { + "age=0": [ + { "model": "betterend:block/amber_root_0" }, + { "model": "betterend:block/amber_root_1" } + ], + "age=1": [ + { "model": "betterend:block/amber_root_2" }, + { "model": "betterend:block/amber_root_3" } + ], + "age=2": [ + { "model": "betterend:block/amber_root_4" }, + { "model": "betterend:block/amber_root_5" } + ], + "age=3": [ + { "model": "betterend:block/amber_root_6" }, + { "model": "betterend:block/amber_root_7" } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/chorus_mushroom_seed.json b/src/main/resources/assets/betterend/blockstates/chorus_mushroom_seed.json new file mode 100644 index 00000000..5868fee9 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/chorus_mushroom_seed.json @@ -0,0 +1,20 @@ +{ + "variants": { + "age=0": [ + { "model": "betterend:block/chorus_mushroom_0" }, + { "model": "betterend:block/chorus_mushroom_1" } + ], + "age=1": [ + { "model": "betterend:block/chorus_mushroom_2" }, + { "model": "betterend:block/chorus_mushroom_3" } + ], + "age=2": [ + { "model": "betterend:block/chorus_mushroom_4" }, + { "model": "betterend:block/chorus_mushroom_5" } + ], + "age=3": [ + { "model": "betterend:block/chorus_mushroom_6" }, + { "model": "betterend:block/chorus_mushroom_7" } + ] + } +} diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index fab8ebd6..07d42dd2 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -699,5 +699,65 @@ "block.betterend.rutiscus_path": "Rutiscus Path", "block.betterend.sangnum": "Sangnum", "block.betterend.sangnum_path": "Sangnum Path", - "block.betterend.small_amaranita_mushroom": "Small Amaranita Mushroom" + "block.betterend.small_amaranita_mushroom": "Small Amaranita Mushroom", + + "block.betterend.amber_root_seed": "Amber Root Seed", + "block.betterend.azure_jadestone": "Azure Jadestone", + "block.betterend.azure_jadestone_bricks": "Azure Jadestone Bricks", + "block.betterend.azure_jadestone_bricks_slab": "Azure Jadestone Bricks Slab", + "block.betterend.azure_jadestone_bricks_stairs": "Azure Jadestone Bricks Stairs", + "block.betterend.azure_jadestone_bricks_wall": "Azure Jadestone Bricks Wall", + "block.betterend.azure_jadestone_button": "Azure Jadestone Button", + "block.betterend.azure_jadestone_furnace": "Azure Jadestone Furnace", + "block.betterend.azure_jadestone_lantern": "Azure Jadestone Lantern", + "block.betterend.azure_jadestone_pedestal": "Azure Jadestone Pedestal", + "block.betterend.azure_jadestone_pillar": "Azure Jadestone Pillar", + "block.betterend.azure_jadestone_plate": "Azure Jadestone Pressure Plate", + "block.betterend.azure_jadestone_polished": "Azure Jadestone Polished", + "block.betterend.azure_jadestone_slab": "Azure Jadestone Slab", + "block.betterend.azure_jadestone_stairs": "Azure Jadestone Stairs", + "block.betterend.azure_jadestone_tiles": "Azure Jadestone Tiles", + "block.betterend.azure_jadestone_wall": "Azure Jadestone Wall", + "block.betterend.chorus_mushroom_seed": "Chorus Mushroom Seed", + "block.betterend.end_stone_stalactite": "End Stone Stalactite", + "block.betterend.end_stone_stalactite_cavemoss": "Cave Moss Endstone Stalactite", + "block.betterend.pearlberry_seed": "Pearlberry Seed", + "block.betterend.rubinea": "Rubinea", + "block.betterend.sandy_jadestone": "Sandy Jadestone", + "block.betterend.sandy_jadestone_bricks": "Sandy Jadestone Bricks", + "block.betterend.sandy_jadestone_bricks_slab": "Sandy Jadestone Bricks Slab", + "block.betterend.sandy_jadestone_bricks_stairs": "Sandy Jadestone Bricks Stairs", + "block.betterend.sandy_jadestone_bricks_wall": "Sandy Jadestone Bricks Wall", + "block.betterend.sandy_jadestone_button": "Sandy Jadestone Button", + "block.betterend.sandy_jadestone_furnace": "Sandy Jadestone Furnace", + "block.betterend.sandy_jadestone_lantern": "Sandy Jadestone Lantern", + "block.betterend.sandy_jadestone_pedestal": "Sandy Jadestone Pedestal", + "block.betterend.sandy_jadestone_pillar": "Sandy Jadestone Pillar", + "block.betterend.sandy_jadestone_plate": "Sandy Jadestone Pressure Plate", + "block.betterend.sandy_jadestone_polished": "Sandy Jadestone Polished", + "block.betterend.sandy_jadestone_slab": "Sandy Jadestone Slab", + "block.betterend.sandy_jadestone_stairs": "Sandy Jadestone Stairs", + "block.betterend.sandy_jadestone_tiles": "Sandy Jadestone Tiles", + "block.betterend.sandy_jadestone_wall": "Sandy Jadestone Wall", + "block.betterend.smaragdant_crystal": "Smaragdant Crystal", + "block.betterend.smaragdant_crystal_shard": "Smaragdant Crystal Shard", + "block.betterend.virid_jadestone": "Virid Jadestone", + "block.betterend.virid_jadestone_bricks": "Virid Jadestone Bricks", + "block.betterend.virid_jadestone_bricks_slab": "Virid Jadestone Bricks Slab", + "block.betterend.virid_jadestone_bricks_stairs": "Virid Jadestone Bricks Stairs", + "block.betterend.virid_jadestone_bricks_wall": "Virid Jadestone Bricks Wall", + "block.betterend.virid_jadestone_button": "Virid Jadestone Button", + "block.betterend.virid_jadestone_furnace": "Virid Jadestone Furnace", + "block.betterend.virid_jadestone_lantern": "Virid Jadestone Lantern", + "block.betterend.virid_jadestone_pedestal": "Virid Jadestone Pedestal", + "block.betterend.virid_jadestone_pillar": "Virid Jadestone Pillar", + "block.betterend.virid_jadestone_plate": "Virid Jadestone Pressure Plate", + "block.betterend.virid_jadestone_polished": "Virid Jadestone Polished", + "block.betterend.virid_jadestone_slab": "Virid Jadestone Slab", + "block.betterend.virid_jadestone_stairs": "Virid Jadestone Stairs", + "block.betterend.virid_jadestone_tiles": "Virid Jadestone Tiles", + "block.betterend.virid_jadestone_wall": "Virid Jadestone Wall", + "item.betterend.amber_root_raw": "Raw Amber Root", + "item.betterend.chorus_mushroom_cooked": "Cooked Chorus Mushroom", + "item.betterend.chorus_mushroom_raw": "Raw Chorus Mushroom" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 2cf2dc7b..8ff7218f 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -719,5 +719,65 @@ "block.betterend.rutiscus_path": "Тропа из рутискуса", "block.betterend.sangnum": "Сагнум", "block.betterend.sangnum_path": "Тропа из сагнума", - "block.betterend.small_amaranita_mushroom": "Маленький амаранит" + "block.betterend.small_amaranita_mushroom": "Маленький амаранит", + + "block.betterend.amber_root_seed": "Семена янтарного корня", + "block.betterend.azure_jadestone": "Лазурный нефрит", + "block.betterend.azure_jadestone_bricks": "Кирпичи из лазурного нефрита", + "block.betterend.azure_jadestone_bricks_slab": "Кирпичная плита из лазурного нефрита", + "block.betterend.azure_jadestone_bricks_stairs": "Кирпичные ступени из лазурного нефрита", + "block.betterend.azure_jadestone_bricks_wall": "Кирпичная стена из лазурного нефрита", + "block.betterend.azure_jadestone_button": "Кнопка из лазурного нефрита", + "block.betterend.azure_jadestone_furnace": "Печь из лазурного нефрита", + "block.betterend.azure_jadestone_lantern": "Фонарь из лазурного нефрита", + "block.betterend.azure_jadestone_pedestal": "Пьедестал из лазурного нефрита", + "block.betterend.azure_jadestone_pillar": "Колонна из лазурного нефрита", + "block.betterend.azure_jadestone_plate": "Нажимная плита из лазурного нефрита", + "block.betterend.azure_jadestone_polished": "Полированный лазурный нефрит", + "block.betterend.azure_jadestone_slab": "Плита из лазурного нефрита", + "block.betterend.azure_jadestone_stairs": "Ступени из лазурного нефрита", + "block.betterend.azure_jadestone_tiles": "Плитка из лазурного нефрита", + "block.betterend.azure_jadestone_wall": "Стена из лазурного нефрита", + "block.betterend.chorus_mushroom_seed": "Семена хорусового гриба", + "block.betterend.end_stone_stalactite": "Эндерняковый сталактит", + "block.betterend.end_stone_stalactite_cavemoss": "Замшелый эндерняковый сталактит", + "block.betterend.pearlberry_seed": "Семена жемчужной ягоды", + "block.betterend.rubinea": "Рубинея", + "block.betterend.sandy_jadestone": "Песчаный нефрит", + "block.betterend.sandy_jadestone_bricks": "Кирпичи из песчаного нефрита", + "block.betterend.sandy_jadestone_bricks_slab": "Кирпичная плита из песчаного нефрита", + "block.betterend.sandy_jadestone_bricks_stairs": "Кирпичные ступени из песчаного нефрита", + "block.betterend.sandy_jadestone_bricks_wall": "Кирпичная стена из песчаного нефрита", + "block.betterend.sandy_jadestone_button": "Кнопка из песчаного нефрита", + "block.betterend.sandy_jadestone_furnace": "Печь из песчаного нефрита", + "block.betterend.sandy_jadestone_lantern": "Фонарь из песчаного нефрита", + "block.betterend.sandy_jadestone_pedestal": "Пьедестал из лазурного нефрита", + "block.betterend.sandy_jadestone_pillar": "Колонна из песчаного нефрита", + "block.betterend.sandy_jadestone_plate": "Нажимная плита из песчаного нефрита", + "block.betterend.sandy_jadestone_polished": "Полированный песчаный нефрит", + "block.betterend.sandy_jadestone_slab": "Плита из песчаного нефрита", + "block.betterend.sandy_jadestone_stairs": "Ступени из песчаного нефрита", + "block.betterend.sandy_jadestone_tiles": "Плитка из песчаного нефрита", + "block.betterend.sandy_jadestone_wall": "Стена из песчаного нефрита", + "block.betterend.smaragdant_crystal": "Кристалл смарагданта", + "block.betterend.smaragdant_crystal_shard": "Осколок кристалла смарагданта", + "block.betterend.virid_jadestone": "Зелёный нефрит", + "block.betterend.virid_jadestone_bricks": "Кирпичи из зелёного нефрита", + "block.betterend.virid_jadestone_bricks_slab": "Кирпичная плита из зелёного нефрита", + "block.betterend.virid_jadestone_bricks_stairs": "Кирпичные ступени из зелёного нефрита", + "block.betterend.virid_jadestone_bricks_wall": "Кирпичная стена из зелёного нефрита", + "block.betterend.virid_jadestone_button": "Кнопка из зелёного нефрита", + "block.betterend.virid_jadestone_furnace": "Печь из зелёного нефрита", + "block.betterend.virid_jadestone_lantern": "Фонарь из зелёного нефрита", + "block.betterend.virid_jadestone_pedestal": "Пьедестал из лазурного нефрита", + "block.betterend.virid_jadestone_pillar": "Колонна из зелёного нефрита", + "block.betterend.virid_jadestone_plate": "Нажимная плита из зелёного нефрита", + "block.betterend.virid_jadestone_polished": "Полированный зелёный нефрит", + "block.betterend.virid_jadestone_slab": "Плита из зелёного нефрита", + "block.betterend.virid_jadestone_stairs": "Ступени из зелёного нефрита", + "block.betterend.virid_jadestone_tiles": "Плитка из зелёного нефрита", + "block.betterend.virid_jadestone_wall": "Стена из зелёного нефрита", + "item.betterend.amber_root_raw": "Сырой янтарный корень", + "item.betterend.chorus_mushroom_cooked": "Приготовленный хорусовый гриб", + "item.betterend.chorus_mushroom_raw": "Сырой хорусовый гриб" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/amber_root_0.json b/src/main/resources/assets/betterend/models/block/amber_root_0.json new file mode 100644 index 00000000..b14bcf08 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amber_root_0.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/amber_root_0" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/amber_root_1.json b/src/main/resources/assets/betterend/models/block/amber_root_1.json new file mode 100644 index 00000000..3e64c93c --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amber_root_1.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/amber_root_0" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/amber_root_2.json b/src/main/resources/assets/betterend/models/block/amber_root_2.json new file mode 100644 index 00000000..f8021e7a --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amber_root_2.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/amber_root_1" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/amber_root_3.json b/src/main/resources/assets/betterend/models/block/amber_root_3.json new file mode 100644 index 00000000..b542e478 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amber_root_3.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/amber_root_1" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/amber_root_4.json b/src/main/resources/assets/betterend/models/block/amber_root_4.json new file mode 100644 index 00000000..4edf302e --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amber_root_4.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/amber_root_2" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/amber_root_5.json b/src/main/resources/assets/betterend/models/block/amber_root_5.json new file mode 100644 index 00000000..c40cb933 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amber_root_5.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/amber_root_2" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/amber_root_6.json b/src/main/resources/assets/betterend/models/block/amber_root_6.json new file mode 100644 index 00000000..747cf5bb --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amber_root_6.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/amber_root_3" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/amber_root_7.json b/src/main/resources/assets/betterend/models/block/amber_root_7.json new file mode 100644 index 00000000..23144eda --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amber_root_7.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/amber_root_3" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/chorus_mushroom_0.json b/src/main/resources/assets/betterend/models/block/chorus_mushroom_0.json new file mode 100644 index 00000000..aae1e0d1 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/chorus_mushroom_0.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/chorus_mushroom_0" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/chorus_mushroom_1.json b/src/main/resources/assets/betterend/models/block/chorus_mushroom_1.json new file mode 100644 index 00000000..1367615a --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/chorus_mushroom_1.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/chorus_mushroom_0" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/chorus_mushroom_2.json b/src/main/resources/assets/betterend/models/block/chorus_mushroom_2.json new file mode 100644 index 00000000..ffadfcd9 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/chorus_mushroom_2.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/chorus_mushroom_1" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/chorus_mushroom_3.json b/src/main/resources/assets/betterend/models/block/chorus_mushroom_3.json new file mode 100644 index 00000000..3df87588 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/chorus_mushroom_3.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/chorus_mushroom_1" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/chorus_mushroom_4.json b/src/main/resources/assets/betterend/models/block/chorus_mushroom_4.json new file mode 100644 index 00000000..f0e174e4 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/chorus_mushroom_4.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/chorus_mushroom_2" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/chorus_mushroom_5.json b/src/main/resources/assets/betterend/models/block/chorus_mushroom_5.json new file mode 100644 index 00000000..d5049831 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/chorus_mushroom_5.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/chorus_mushroom_2" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/chorus_mushroom_6.json b/src/main/resources/assets/betterend/models/block/chorus_mushroom_6.json new file mode 100644 index 00000000..5b53ad87 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/chorus_mushroom_6.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block", + "textures": { + "texture": "betterend:block/chorus_mushroom_3" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/chorus_mushroom_7.json b/src/main/resources/assets/betterend/models/block/chorus_mushroom_7.json new file mode 100644 index 00000000..60260713 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/chorus_mushroom_7.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/crop_block_inverted", + "textures": { + "texture": "betterend:block/chorus_mushroom_3" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/amber_root_seed.json b/src/main/resources/assets/betterend/models/item/amber_root_seed.json new file mode 100644 index 00000000..85d4164d --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/amber_root_seed.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/amber_root_seed" + } +} diff --git a/src/main/resources/assets/betterend/models/item/chorus_mushroom_seed.json b/src/main/resources/assets/betterend/models/item/chorus_mushroom_seed.json new file mode 100644 index 00000000..8f724c6b --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/chorus_mushroom_seed.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/chorus_mushroom_seed" + } +} diff --git a/src/main/resources/assets/betterend/textures/block/amber_grass.png b/src/main/resources/assets/betterend/textures/block/amber_grass.png index aa86babf8cf047b8c89d4ae81c116fd2aa9b6d15..c166e3c92770366584963ed57a7306c37a4542ed 100644 GIT binary patch delta 203 zcmeBRy2Cg@vYwfNfk8u;KNv`{q&xaLGB9lHtN9%`8OWCo@Ck7R(xnzMo%Z50J){-{ z2`>%h+>x z^nd>j31iDIap^Gvjt`D^{CQCIs);A{s!MDKcS_oH%N1UcN0uG)<4G<#uKZw&@7Z>R wJEj{-xs(&D4}Nxkeog4tgH-R#yW$_1W@a(AnogR19cTxGr>mdKI;Vst03sz&`Tzg` delta 247 zcmVe2qGRJRmya>)`I7-${}p+>}=A-8+Zge4>aa4yf9&cf)?Vyu$i6x?`I~N zS^6f^{{XH{^#ee=pV{p&w~qi4-%o3MbY(u@0^}r-uO%d30&u(&5CKTtr9PJ7OA`QcA3Q<;EhHAzXJr9U15S8H;Vz_jRF9%L;#e-vieXDqX3YT9sp21 x1)v`Q%*`(Yq^1uv0GfK0AM5lr0N+;vcmm`yf}S>Cs2NW^%ba4!kn3|j*5pbYKu|e<9 zkrurJ9n0oUW%X>}R6EeKWLB%B8f(ht11t;J6jdS{SQtc27!qwY9qt1)GkCiCxvXiWS0Ei` zq>yf}S>eH?=FXMAE4E}lyd8Y`cD}!F zyM^t?nJ3na*S0Ei` zq>yf}S>;D9fPNwouc3~KDm3^v+!_p-K6{|>Z@!PC{x JWt~$(69Ct3LRkO+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/chorus_mushroom_2.png b/src/main/resources/assets/betterend/textures/block/chorus_mushroom_2.png new file mode 100644 index 0000000000000000000000000000000000000000..6f2313fe5ada9015bc6bd3e438b5fcb321a730e0 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|R(rZQhFJ6_ zCrGd^PPowg)inCQ{+T;p=Ifk2{(R2A|8L)Y{|{p9-$$6|| z=kKTg^UL@DuiyDwHKuv%BH3o0`9d*DHJHtEGKRO=1zI~rZ?`fFC ztCDXsX{k4wvOp`d;gwZkfy^~F37!U za=)z2;SVq0#<%@=S=Yk@1e3+{HcP*l_u|NhpZC<;PCtKlDE3Ixo0J($Z7&53 zEfXa{=C_?JR{I-1X?k-tr=?DW1Q6&1`$$Rx>3w(q{`-ILushH3=X3u3|N1t+ZSiqE zqneceY}*g)HefhBTcc4zcJ`qO){6ZPk2Z%FsDJugU>LD%hEZ1AYJ*oDvkXpr(p)HU zpy^DbrR9dBvnMt-HY(oV{^$R3{re9-b=5@ie7BEvHe_IsJXL9%zoI7|7<>$#u6{1- HoD!M<5Idt8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/amber_root_raw.png b/src/main/resources/assets/betterend/textures/item/amber_root_raw.png new file mode 100644 index 0000000000000000000000000000000000000000..b2226f5fc6a86ea828dbc1e9a9120f7f765db5bd GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~=>VS)S0HVz zryS#IQWxX8xX5oyRlvP=_YZ5F{$42SoDmTZl;$i6@(X784+Z8-v#$UJtvp>ELnNm5 z_8Rgr7;rF!YW(^yUVdz$=IvMomp^TN?d*9CFKwkxww9$vt$yGmsNbh_+GWut`=XD^ Z;t7WsR!^B05Ct@a!PC{xWt~$(695m>Kgs|A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/amber_root_seed.png b/src/main/resources/assets/betterend/textures/item/amber_root_seed.png new file mode 100644 index 0000000000000000000000000000000000000000..25ce73b08a42eba62e3bca58d16c8ef878f51468 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~{s5m4S0HVz zr<@<-*IJUfc|zHdoK>%YLaZf0e!&d?fk5Vh8ptF)PZ!4!iK)p63s?+{7k`YL5x^=j zQ{rNXv60Y9DWyXliR{e6+_N~^%-l+nJJ=ai#2FmA%^BtcbuxIm`njxgN@xNA2o);2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/chorus_mushroom_cooked.png b/src/main/resources/assets/betterend/textures/item/chorus_mushroom_cooked.png new file mode 100644 index 0000000000000000000000000000000000000000..2f55abb4942778f92079a01c02a35880e6fb6da2 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~^#Gp`S0HUE z!x5w-kYpiI=dIKcq%<{JeNL?Al2pSbxsI!gT(?&H>}d@0{?Zf!RLWZtW@h4;B2DW}nl*$Q*Xn{yESf22WQ%mvv4FO#p=NN9h0n literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/chorus_mushroom_raw.png b/src/main/resources/assets/betterend/textures/item/chorus_mushroom_raw.png new file mode 100644 index 0000000000000000000000000000000000000000..25450dd585d55fab3be06ee0f5ca876789b6320d GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~^#Gp`S0HVo zV;N`_o#2?8?_1vJKYd~5ru8*j_jDe+zVgn?-7jCCd;RV1_xmB2xPeM}OM?7@8U7;y zT^7f+KnX`r7sn8ZscU;3`3@-X9A2>Gt;f&*)#biBeP`uw)Jg5RZ_yrIF3P;n@nX2i v;lE3|BF~fv&R{!X7XSBZV(bI1eIJ>Y&S#YDRD66LXc&X1tDnm{r-UW|eyCKn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/chorus_mushroom_seed.png b/src/main/resources/assets/betterend/textures/item/chorus_mushroom_seed.png new file mode 100644 index 0000000000000000000000000000000000000000..b1fa828d2aa1ce2c92a09e73a7c3e8776946712c GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~o&cW^S0KH< zX6v5LW5?&5cCaZ}59G6y1o;Is{Qv)dv#vu2kZdeCRp$pH+VHVo#BuTP!_O~xL^@+=V*&hBZG^raM;xu3=CQ(4E}t)p7uaf7(8A5 KT-G@yGywqX@h*S> literal 0 HcmV?d00001 From 1c1329bc29367c9ed96b71363a62046a962a811d Mon Sep 17 00:00:00 2001 From: Aleksey Date: Thu, 11 Mar 2021 16:28:19 +0300 Subject: [PATCH 326/463] 1.16.5 + update dependencies --- build.gradle | 5 +++-- gradle.properties | 12 ++++++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/build.gradle b/build.gradle index 7d1e63c3..c6bbdec8 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'fabric-loom' version '0.5-SNAPSHOT' + id 'fabric-loom' version '0.7-SNAPSHOT' id 'maven-publish' } @@ -15,6 +15,7 @@ repositories { maven { url "http://server.bbkr.space:8081/artifactory/libs-release/" } maven { url "https://maven.fabricmc.net/" } maven { url 'https://maven.blamejared.com' } + maven { url "https://maven.shedaniel.me/" } maven { url 'https://jitpack.io' } jcenter() } @@ -27,7 +28,7 @@ dependencies { modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" - useApi "vazkii.patchouli:Patchouli:${project.minecraft_version}-${project.patchouli_version}" + useApi "vazkii.patchouli:Patchouli:1.16.4-${project.patchouli_version}" useOptional "me.shedaniel:RoughlyEnoughItems:${project.rei_version}" useOptional "me.shedaniel:RoughlyEnoughItems-api:${project.rei_version}" diff --git a/gradle.properties b/gradle.properties index d412b84c..7a4dbdbe 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,9 +3,9 @@ # Fabric Properties # check these on https://fabricmc.net/use - minecraft_version=1.16.4 - yarn_mappings=7 - loader_version=0.10.8 + minecraft_version=1.16.5 + yarn_mappings=5 + loader_version=0.11.2 # Mod Properties mod_version = 0.9.2-pre @@ -14,7 +14,7 @@ # Dependencies # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api - patchouli_version = 48-FABRIC - fabric_version = 0.29.2+1.16 + patchouli_version = 50-FABRIC + fabric_version = 0.32.0+1.16 canvas_version = 1.0.+ - rei_version = 5.8.10 \ No newline at end of file + rei_version = 5.10.184 \ No newline at end of file From 45a9405babe500f876d1be9981dfe187202dc1d9 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Thu, 11 Mar 2021 16:41:29 +0300 Subject: [PATCH 327/463] End Stone Smelter drop fix --- .../ru/betterend/blocks/EndStoneSmelter.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java index 533f653b..cfab2cc8 100644 --- a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java +++ b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java @@ -1,9 +1,11 @@ package ru.betterend.blocks; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Random; +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; @@ -18,6 +20,7 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemPlacementContext; import net.minecraft.item.ItemStack; import net.minecraft.loot.context.LootContext; +import net.minecraft.loot.context.LootContextParameters; import net.minecraft.particle.ParticleTypes; import net.minecraft.screen.ScreenHandler; import net.minecraft.sound.BlockSoundGroup; @@ -83,7 +86,18 @@ public class EndStoneSmelter extends BaseBlockWithEntity { @Override public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - return Collections.singletonList(new ItemStack(this)); + List drop = Lists.newArrayList(new ItemStack(this)); + BlockEntity blockEntity = builder.getNullable(LootContextParameters.BLOCK_ENTITY); + if (blockEntity instanceof EndStoneSmelterBlockEntity) { + EndStoneSmelterBlockEntity smelterBlockEntity = (EndStoneSmelterBlockEntity) blockEntity; + for (int i = 0; i < smelterBlockEntity.size(); i++) { + ItemStack item = smelterBlockEntity.getStack(i); + if (!item.isEmpty()) { + drop.add(item); + } + } + } + return drop; } @Override From 0c26c6f648299a839fee262042c65f352a4891c4 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 11 Mar 2021 20:30:54 +0300 Subject: [PATCH 328/463] Jadestones textures --- gradle.properties | 2 +- .../java/ru/betterend/blocks/EndStoneSmelter.java | 3 +-- .../blocks/basis/TripleTerrainBlock.java | 2 +- .../java/ru/betterend/registry/EndBiomes.java | 8 ++++---- .../block/azure_jadestone_furnace.json | 10 ++++++++++ .../block/azure_jadestone_lantern.json | 10 ++++++++++ .../block/sandy_jadestone_furnace.json | 10 ++++++++++ .../block/sandy_jadestone_lantern.json | 10 ++++++++++ .../block/virid_jadestone_furnace.json | 10 ++++++++++ .../block/virid_jadestone_lantern.json | 10 ++++++++++ .../textures/block/azure_jadestone_bricks.png | Bin 0 -> 262 bytes .../block/azure_jadestone_furnace_front.png | Bin 0 -> 271 bytes .../block/azure_jadestone_furnace_front_on.png | Bin 0 -> 337 bytes .../block/azure_jadestone_furnace_glow.png | Bin 0 -> 291 bytes .../block/azure_jadestone_furnace_glow.png.mcmeta | 12 ++++++++++++ .../block/azure_jadestone_furnace_glow_e.png | Bin 0 -> 291 bytes .../azure_jadestone_furnace_glow_e.png.mcmeta | 12 ++++++++++++ .../block/azure_jadestone_furnace_side.png | Bin 0 -> 244 bytes .../block/azure_jadestone_furnace_top.png | Bin 0 -> 235 bytes .../block/azure_jadestone_lantern_bottom.png | Bin 0 -> 196 bytes .../block/azure_jadestone_lantern_side.png | Bin 0 -> 200 bytes .../block/azure_jadestone_lantern_top.png | Bin 0 -> 197 bytes .../block/azure_jadestone_pillar_side.png | Bin 0 -> 239 bytes .../textures/block/azure_jadestone_pillar_top.png | Bin 0 -> 254 bytes .../textures/block/azure_jadestone_polished.png | Bin 0 -> 270 bytes .../textures/block/azure_jadestone_tiles.png | Bin 0 -> 229 bytes .../textures/block/end_stone_furnace_bottom.png | Bin 614 -> 0 bytes .../textures/block/sandy_jadestone_bricks.png | Bin 0 -> 262 bytes .../block/sandy_jadestone_furnace_front.png | Bin 0 -> 251 bytes .../block/sandy_jadestone_furnace_front_on.png | Bin 0 -> 294 bytes .../block/sandy_jadestone_furnace_glow.png | Bin 0 -> 291 bytes .../block/sandy_jadestone_furnace_glow.png.mcmeta | 12 ++++++++++++ .../block/sandy_jadestone_furnace_glow_e.png | Bin 0 -> 291 bytes .../sandy_jadestone_furnace_glow_e.png.mcmeta | 12 ++++++++++++ .../block/sandy_jadestone_furnace_side.png | Bin 0 -> 244 bytes .../block/sandy_jadestone_furnace_top.png | Bin 0 -> 235 bytes .../block/sandy_jadestone_lantern_bottom.png | Bin 0 -> 196 bytes .../block/sandy_jadestone_lantern_side.png | Bin 0 -> 200 bytes .../block/sandy_jadestone_lantern_top.png | Bin 0 -> 197 bytes .../block/sandy_jadestone_pillar_side.png | Bin 0 -> 239 bytes .../textures/block/sandy_jadestone_pillar_top.png | Bin 0 -> 254 bytes .../textures/block/sandy_jadestone_polished.png | Bin 0 -> 270 bytes .../textures/block/sandy_jadestone_tiles.png | Bin 0 -> 229 bytes .../textures/block/virid_jadestone_bricks.png | Bin 0 -> 262 bytes .../block/virid_jadestone_furnace_front.png | Bin 0 -> 264 bytes .../block/virid_jadestone_furnace_front_on.png | Bin 0 -> 337 bytes .../block/virid_jadestone_furnace_glow.png | Bin 0 -> 291 bytes .../block/virid_jadestone_furnace_glow.png.mcmeta | 12 ++++++++++++ .../block/virid_jadestone_furnace_glow_e.png | Bin 0 -> 291 bytes .../virid_jadestone_furnace_glow_e.png.mcmeta | 12 ++++++++++++ .../block/virid_jadestone_furnace_side.png | Bin 0 -> 244 bytes .../block/virid_jadestone_furnace_top.png | Bin 0 -> 235 bytes .../block/virid_jadestone_lantern_bottom.png | Bin 0 -> 196 bytes .../block/virid_jadestone_lantern_side.png | Bin 0 -> 200 bytes .../block/virid_jadestone_lantern_top.png | Bin 0 -> 197 bytes .../block/virid_jadestone_pillar_side.png | Bin 0 -> 239 bytes .../textures/block/virid_jadestone_pillar_top.png | Bin 0 -> 255 bytes .../textures/block/virid_jadestone_polished.png | Bin 0 -> 270 bytes .../textures/block/virid_jadestone_tiles.png | Bin 0 -> 229 bytes 59 files changed, 139 insertions(+), 8 deletions(-) create mode 100644 src/main/resources/assets/betterend/materialmaps/block/azure_jadestone_furnace.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/azure_jadestone_lantern.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/sandy_jadestone_furnace.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/sandy_jadestone_lantern.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/virid_jadestone_furnace.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/virid_jadestone_lantern.json create mode 100644 src/main/resources/assets/betterend/textures/block/azure_jadestone_bricks.png create mode 100644 src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_front.png create mode 100644 src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_front_on.png create mode 100644 src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_glow.png create mode 100644 src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_glow.png.mcmeta create mode 100644 src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_glow_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_glow_e.png.mcmeta create mode 100644 src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/azure_jadestone_lantern_bottom.png create mode 100644 src/main/resources/assets/betterend/textures/block/azure_jadestone_lantern_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/azure_jadestone_lantern_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/azure_jadestone_pillar_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/azure_jadestone_pillar_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/azure_jadestone_polished.png create mode 100644 src/main/resources/assets/betterend/textures/block/azure_jadestone_tiles.png delete mode 100644 src/main/resources/assets/betterend/textures/block/end_stone_furnace_bottom.png create mode 100644 src/main/resources/assets/betterend/textures/block/sandy_jadestone_bricks.png create mode 100644 src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_front.png create mode 100644 src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_front_on.png create mode 100644 src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_glow.png create mode 100644 src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_glow.png.mcmeta create mode 100644 src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_glow_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_glow_e.png.mcmeta create mode 100644 src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_bottom.png create mode 100644 src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/sandy_jadestone_pillar_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/sandy_jadestone_pillar_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/sandy_jadestone_polished.png create mode 100644 src/main/resources/assets/betterend/textures/block/sandy_jadestone_tiles.png create mode 100644 src/main/resources/assets/betterend/textures/block/virid_jadestone_bricks.png create mode 100644 src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_front.png create mode 100644 src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_front_on.png create mode 100644 src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_glow.png create mode 100644 src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_glow.png.mcmeta create mode 100644 src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_glow_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_glow_e.png.mcmeta create mode 100644 src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_bottom.png create mode 100644 src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/virid_jadestone_pillar_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/virid_jadestone_pillar_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/virid_jadestone_polished.png create mode 100644 src/main/resources/assets/betterend/textures/block/virid_jadestone_tiles.png diff --git a/gradle.properties b/gradle.properties index 7a4dbdbe..a2b058f6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,4 +17,4 @@ patchouli_version = 50-FABRIC fabric_version = 0.32.0+1.16 canvas_version = 1.0.+ - rei_version = 5.10.184 \ No newline at end of file + rei_version = 5.8.10 \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java index cfab2cc8..53d03e42 100644 --- a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java +++ b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java @@ -1,11 +1,10 @@ package ru.betterend.blocks; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Random; 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; diff --git a/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java index 25154c94..a879c22c 100644 --- a/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java @@ -20,8 +20,8 @@ import net.minecraft.util.registry.Registry; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.patterns.Patterns; import ru.betterend.blocks.EndTerrainBlock; +import ru.betterend.patterns.Patterns; public class TripleTerrainBlock extends EndTerrainBlock { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index 158c3d1b..6564b77d 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -42,18 +42,18 @@ import ru.betterend.world.biome.land.AmberLandBiome; import ru.betterend.world.biome.land.BlossomingSpiresBiome; import ru.betterend.world.biome.land.ChorusForestBiome; import ru.betterend.world.biome.land.CrystalMountainsBiome; +import ru.betterend.world.biome.land.DragonGraveyardsBiome; +import ru.betterend.world.biome.land.DryShrublandBiome; import ru.betterend.world.biome.land.DustWastelandsBiome; +import ru.betterend.world.biome.land.EndBiome; import ru.betterend.world.biome.land.FoggyMushroomlandBiome; +import ru.betterend.world.biome.land.GlowingGrasslandsBiome; import ru.betterend.world.biome.land.MegalakeBiome; import ru.betterend.world.biome.land.MegalakeGroveBiome; import ru.betterend.world.biome.land.PaintedMountainsBiome; import ru.betterend.world.biome.land.ShadowForestBiome; import ru.betterend.world.biome.land.SulphurSpringsBiome; import ru.betterend.world.biome.land.UmbrellaJungleBiome; -import ru.betterend.world.biome.land.DragonGraveyardsBiome; -import ru.betterend.world.biome.land.DryShrublandBiome; -import ru.betterend.world.biome.land.EndBiome; -import ru.betterend.world.biome.land.GlowingGrasslandsBiome; import ru.betterend.world.generator.BELayerRandomSource; import ru.betterend.world.generator.BiomePicker; import ru.betterend.world.generator.BiomeType; diff --git a/src/main/resources/assets/betterend/materialmaps/block/azure_jadestone_furnace.json b/src/main/resources/assets/betterend/materialmaps/block/azure_jadestone_furnace.json new file mode 100644 index 00000000..157b99b4 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/azure_jadestone_furnace.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/azure_jadestone_furnace_glow", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/azure_jadestone_lantern.json b/src/main/resources/assets/betterend/materialmaps/block/azure_jadestone_lantern.json new file mode 100644 index 00000000..31a6585c --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/azure_jadestone_lantern.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/aurora_crystal", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/sandy_jadestone_furnace.json b/src/main/resources/assets/betterend/materialmaps/block/sandy_jadestone_furnace.json new file mode 100644 index 00000000..10ce1422 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/sandy_jadestone_furnace.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/sandy_jadestone_furnace_glow", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/sandy_jadestone_lantern.json b/src/main/resources/assets/betterend/materialmaps/block/sandy_jadestone_lantern.json new file mode 100644 index 00000000..31a6585c --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/sandy_jadestone_lantern.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/aurora_crystal", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/virid_jadestone_furnace.json b/src/main/resources/assets/betterend/materialmaps/block/virid_jadestone_furnace.json new file mode 100644 index 00000000..ced57eae --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/virid_jadestone_furnace.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/virid_jadestone_furnace_glow", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/virid_jadestone_lantern.json b/src/main/resources/assets/betterend/materialmaps/block/virid_jadestone_lantern.json new file mode 100644 index 00000000..31a6585c --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/virid_jadestone_lantern.json @@ -0,0 +1,10 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/aurora_crystal", + "material": "betterend:glow_all" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_bricks.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_bricks.png new file mode 100644 index 0000000000000000000000000000000000000000..da7292222269d150c5bffb06c22bdb8f8730eaf8 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFS_YKC10?3#^a7#}J9jvS$toHXHD`9&~4)beTa(RKZk$tvLP6lK)|k=IbWx+!y>_-tFyG ztzLEI=-gv(H%J&ny?x&`_2a1(JrCBry4<*X;|^=9l7-IVRwaM=V_#foiWS0K%2 zU@T-|BWmX;;o_m_AEF%lE0HmUDTJx~#MNswPK!+$uaEvvl>6mIo& zaSV}|YU|%Ebl8By>(Z&i|NlQoyxzOp<)OgjtIKxXZ4}+4)AUEKWzCge$|;&L(-uT{ zN62pf&RI4kt>uy3_1gIK%~Gc|_~f68E|`CK##SAEkr{PH1$xKqmCuQZd$;|WaKSJy!pV(|FUV55i{xYjg&-5dkIv=_${mD?^!&W7jaM=>*AO=rYKbLh* G2~7Z?Cubi3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_front_on.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_front_on.png new file mode 100644 index 0000000000000000000000000000000000000000..df38fe7f96f231d44eb64ed8462890793d93459b GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~?*N|=S0Jr# zYiZzM0_SlYnknDwIfPzN2KnKXycvH`n%!`wkH_AjL>|Ur1>IK_f?+$%REg{ zJ4Z$T5bdZq!{kKEtTcy;9M{&e-@B~m1C5g`3GxeO_>Th^1bf~ED(d%iaSV}|YU|I) z*J8loY@6)!F0b>#q5tt!sk5?gEa07TR_ov@9YxI~PnLrD0*0yoosVdoQ)$jBZJWC5 zbJX_Sy-P$?ET;XHdAwKu1J~&Slm9)Bzj7RWoPEf`s7lvHT13dw_7G2bMV9xL1Ck$S z>|%FrsO}H>=5A2z$G<>6a#u(u%jOT0&iw11=5l+%+K@jCuN;N8awv($0-eU->FVdQ I&MBb@0JAWNasU7T literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_glow.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_glow.png new file mode 100644 index 0000000000000000000000000000000000000000..ad6556936322b7a49c6cc571b6a0d36a279c5b87 GIT binary patch literal 291 zcmV+;0o?wHP)8kbs&6-T^{sp8D&MliIC;s)6AKOaEYh_Hg&< z90Ac^R%C#?2BZl*2gm}<5?Xx0THx&K8!Hcm=8eFq%kO}`K!Ro*O z2DlWkOW-BIKESk9ACv;QI$#pRr{-LsY~q8JgMm6AbMT;fAh0qY7{CCR0~QI)11tkP zg>}Re)FZ!J_s5LMgD(zAt)E_3FI!aFPb? poC=Ke&|?f+g?$LD#eDD|fG;0Z&0xF;iRl0U002ovPDHLkV1kd8f-3+3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_glow.png.mcmeta b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_glow.png.mcmeta new file mode 100644 index 00000000..98b9ae71 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_glow.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_glow_e.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_glow_e.png new file mode 100644 index 0000000000000000000000000000000000000000..ad6556936322b7a49c6cc571b6a0d36a279c5b87 GIT binary patch literal 291 zcmV+;0o?wHP)8kbs&6-T^{sp8D&MliIC;s)6AKOaEYh_Hg&< z90Ac^R%C#?2BZl*2gm}<5?Xx0THx&K8!Hcm=8eFq%kO}`K!Ro*O z2DlWkOW-BIKESk9ACv;QI$#pRr{-LsY~q8JgMm6AbMT;fAh0qY7{CCR0~QI)11tkP zg>}Re)FZ!J_s5LMgD(zAt)E_3FI!aFPb? poC=Ke&|?f+g?$LD#eDD|fG;0Z&0xF;iRl0U002ovPDHLkV1kd8f-3+3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_glow_e.png.mcmeta b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_glow_e.png.mcmeta new file mode 100644 index 00000000..98b9ae71 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_glow_e.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_side.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_side.png new file mode 100644 index 0000000000000000000000000000000000000000..c200ae968a4290774b2ba9074746cbdc826d5f10 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(iS0JtE zAEF%lE0CKaf52PnZ_666=m@E;78)-U@F6sq!caSV}|YU|&~d%%Dr zNZ`MH<%4Mxw`eiuWFNhGRZ5C~sp5(62b_0)=WZbP0l+XkKMkHF@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_top.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_top.png new file mode 100644 index 0000000000000000000000000000000000000000..b6c669bf6a71ebe28a671faaf05392e46908bc11 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(iS0JtE zAEF%lE0CKaf52PnZ_666=m@E;78)-U@F6e{#|aSV}|>gvzQcR+z> zmCWD&lijcS2qi0CSbQsFyY&XAQ%Wa33k3bV-ajE|hmK>CR><+(lE0CKaf52PnZ_666=m@E;78)-U@F6!P+PaSV}|I`>SV5Q88O zb3pEr@AjYE%DewAIoxBjWb10qPq7*ttek(CWgGc+=)Rb#Zt&imlE0CKaf52PnZ_666=m@E;78)-U@F6!P4@})RI+d~J_KXFYk@)pYCh&PnmzGh+OvhNQzi+wh@ pp(Fie|2Dm^P7|h^J^6iy_vBK>MeB2=j{r?(@O1TaS?83{1ORThMhO4_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_lantern_top.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_lantern_top.png new file mode 100644 index 0000000000000000000000000000000000000000..bc8b01ad57836de3563f6ea9110331ee9bc879ad GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(iS0JtE zAEF%lE0CKaf52PnZ_666=m@E;78)-U@F6!P|TaSV}|I=9zT=zs$U z6MMk_|4$~I{WvQ?ZpqSuwehRYRDWsOWGE>AAe5`~#)C5gyg{Oe7(`$G@o`})S$4nc liO$!ojg9Z8zwPU{VmNHb=)r$=W-icJ22WQ%mvv4FO#li8MHv79 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_pillar_side.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_pillar_side.png new file mode 100644 index 0000000000000000000000000000000000000000..5a56e8e46c28e926df4d0b70d7d0e42db02a713d GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFS_YKC10?3#^a79x&i=xhQ?`CW9FRYt`-@f5W-VG}kWg*ON_Z;r7kXLh-SbDN!7SOQ_44$rjF6*2UngGk& BLf8NR literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_pillar_top.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_pillar_top.png new file mode 100644 index 0000000000000000000000000000000000000000..1a8f94d071fe7f03d6391685330ecb92fab293ae GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFS_YKC10?3#^a7S_YKC10?3#^a7ymMW@M!0=MqE*_wP@RB+P#8TZo5XVx2B ge{ncSx@wXrhrFY`h)JV(unx$Xp00i_>zopr07JG-KL7v# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_tiles.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_tiles.png new file mode 100644 index 0000000000000000000000000000000000000000..9f3d014a43184e597f4d868749e40a69227b14ce GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFS_YKC10?3#^a7{C3GJpU8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_furnace_bottom.png b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_bottom.png deleted file mode 100644 index 5b79a56e8fe5ed1a65bb2378e7d4068f57ab10e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 614 zcmV-s0-61ZP)v16ia-2_X;=mAE8sZ zU{(lPFN5jNVA39K+hG_qmg$KF`M!@Z46WXE9sIV3(2U?J)d;AVw1X)tRK*&fkB*@P zNbn$D`(Z#Vk&s{zy{t;~evT$@(G(@Tmj_P=vMx>+m~ZbO*`6T?0vodRDn!&h&$F^A zDoZlm-i4nV{GT(udV^GuzKAa2?miH+2y&w2Nhqe7%A?c_Re_yz`&w z@Y!?BCR6y5eO>_%)r2R7=#&* z=dS<>#(TOrhDcnNJ#$d7*?`COpga4d%M41Q3Z?>V#p!33{11CHUpHarzTo%rZf~z@ z^{OjJ=N@~zLBb&F?fb5&A5X35d9dcy<;L9`cUW7MEOZvPD*4MF`{F_?ACNfOqxP6R Xahhntp))=2LC*7Z^>bP0l+XkKLXA_7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_front.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_front.png new file mode 100644 index 0000000000000000000000000000000000000000..3619bc13d679a564a1314b363db100bf0e2df760 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~xd5LKS0HWe zBIOsU5}T!yS#DC;;857^TsgtJZC+r{+GrjZ*K0r(TqQw%!3_UlpsrIS3@BRa>Eak7 zG1b+dQ;0#4V^bL0pa1RRx%|saBusjRB9X>tY+B=bO3{=tDnm{r-UW|RoP$; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_front_on.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_front_on.png new file mode 100644 index 0000000000000000000000000000000000000000..8a1b09d3d03cdcce987189c75f6aa9f19cf5d6dc GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~vjCqES0J5P zZc^CbP&vW7ZC+r{+UO0jYKLRB&P8i%OV&D;sPi&Hb9a``dz>2$be(9%9X1x)BgXDWS(p6zVHc? zxXz1?1dbLdg8Wp YUluS21V-(=3v>&Er>mdKI;Vst08wXoPXGV_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_glow.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_glow.png new file mode 100644 index 0000000000000000000000000000000000000000..ad6556936322b7a49c6cc571b6a0d36a279c5b87 GIT binary patch literal 291 zcmV+;0o?wHP)8kbs&6-T^{sp8D&MliIC;s)6AKOaEYh_Hg&< z90Ac^R%C#?2BZl*2gm}<5?Xx0THx&K8!Hcm=8eFq%kO}`K!Ro*O z2DlWkOW-BIKESk9ACv;QI$#pRr{-LsY~q8JgMm6AbMT;fAh0qY7{CCR0~QI)11tkP zg>}Re)FZ!J_s5LMgD(zAt)E_3FI!aFPb? poC=Ke&|?f+g?$LD#eDD|fG;0Z&0xF;iRl0U002ovPDHLkV1kd8f-3+3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_glow.png.mcmeta b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_glow.png.mcmeta new file mode 100644 index 00000000..98b9ae71 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_glow.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_glow_e.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_glow_e.png new file mode 100644 index 0000000000000000000000000000000000000000..ad6556936322b7a49c6cc571b6a0d36a279c5b87 GIT binary patch literal 291 zcmV+;0o?wHP)8kbs&6-T^{sp8D&MliIC;s)6AKOaEYh_Hg&< z90Ac^R%C#?2BZl*2gm}<5?Xx0THx&K8!Hcm=8eFq%kO}`K!Ro*O z2DlWkOW-BIKESk9ACv;QI$#pRr{-LsY~q8JgMm6AbMT;fAh0qY7{CCR0~QI)11tkP zg>}Re)FZ!J_s5LMgD(zAt)E_3FI!aFPb? poC=Ke&|?f+g?$LD#eDD|fG;0Z&0xF;iRl0U002ovPDHLkV1kd8f-3+3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_glow_e.png.mcmeta b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_glow_e.png.mcmeta new file mode 100644 index 00000000..98b9ae71 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_glow_e.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_side.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_side.png new file mode 100644 index 0000000000000000000000000000000000000000..ee04c5dc84848dc2828caa5a90889c7cf37c6766 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(iS0J5P zZc^CbP}uHVIl;SaUSQAK=xM*W?*k>+OM?7@8UBO8()wk;fkIWDE{-7*Q*Helc@G$H z1PT1NuY53V;ubB&ob01FuS!YrFI7D8{ebh%Z~XkG^W2RkysHDUx2CK;q~jZLA~EER zD`%nF+OM?7@8UBO8()wk;fkK6zE{-7*Q(gTz`3@-X ztdjZrf3o{kAE9K$3yW`sY`5OvbV}*OXMv!f*ZU^~?a*;d(h51Adt7>AhFizPM>}>% zrTP?AvAKI#ePA%2cH^tq%e#+%sXy}JJX+eZ{J5lzZkSRe&n=<%NzbDH%6(tA_xRrI a&vqAYF{i#(m7WH)oWax8&t;ucLK6U=e_F2q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_bottom.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..2eead6efff741a5f4f84c8c36fd9b238ec69d49e GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(iS0J5P zZc^CbP}uHVIl;SaUSQAK=xM*W?*k>+OM?7@8UBO8()wk;fkIxME{-7*Q|F!u6k-tM zVGhV$^4Z4&4_s)eYX8b3BzdkUy}>WW|f> kmoJPzbN;M-({#9!VQ(6v{fxUVAU862y85}Sb4q9e0Cf38$^ZZW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_side.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_side.png new file mode 100644 index 0000000000000000000000000000000000000000..bc1b380e88762423931572cfcd978e72e472cc77 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(iS0J5P zZc^CbP}uHVIl;SaUSQAK=xM*W?*k>+OM?7@8UBO8()wk;fkJ+sE{-7*Q*-+nxegd` zFrPm2^S}Cet7WgF934IVWFN~IUA`12XnW{j`X{alM&3eM9Px&7+t)12T=xCJX0gu( pH*}=G?BAyM)oH?XvnRjr@Sa@CxM+Q@^bw%R44$rjF6*2UngHpWNa_Fp literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_top.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_top.png new file mode 100644 index 0000000000000000000000000000000000000000..514b30e6aea7b8c94fc68e776b95aa330988085a GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(iS0J5P zZc^CbP}uHVIl;SaUSQAK=xM*W?*k>+OM?7@8UBO8()wk;fkNJ%E{-7*Q|I=23LS9Z zU}6vW|NqH^vma*#$Sqk~ur_|xnd&c1n+yfzAB1vs-gt0EfHz3=5QFH;KRzx@CCl!2 mJ<<7^wXyO2^tXNeRt$#?89n%~&ddcG%i!ti=d#Wzp$PzdMo0Pp literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_pillar_side.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_pillar_side.png new file mode 100644 index 0000000000000000000000000000000000000000..28d19e43c897434af01490d6c904d8779c130d7a GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFO>_%)r2R7=#&* z=dS<>dU(1xhDcn_J-dxpsNK#sr3?52v=Jn_TF+ zd>~RxJxgZ$(f^OXY>^EL(suO7D6JN}=Wut0yqdGb(vuytfR1Hg@O1TaS?83{1OVyv BM700_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_pillar_top.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_pillar_top.png new file mode 100644 index 0000000000000000000000000000000000000000..4714a2666733263a63235e7e04d308f7673bfed0 GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFO>_%)r2R7=#&* z=dS<>hI_g=hDcm?J$sS2!GMG1!fUoWY;zat1gQEY+^rYo_et&(u#2;Z*<7Ts#);=Q zlSx)a<~&u^&3CG2oOv6^Ryo0F;bNa38;sO%rhaM_E4zLt_FK8+EP;gTe~DWM4fr$b3U literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_polished.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_polished.png new file mode 100644 index 0000000000000000000000000000000000000000..7ac6f9403d5c42888f5b1fea5cba12edf9106e58 GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFO>_%)r2R7=#&* z=dS<>rhB?LhDcnN^=;&BP~g%2#c+bzNRFYZ=_7;d|N5inbiH@4y<4zP?tJ4;$+Jb` zik4v$b#$^1PZjvTCo^`H>|~v(IZ9$HC#f+iI!!(lxOLaf*5u=&f|KUYxR+i&v)O>_%)r2R7=#&* z=dS<>+IhM-hDcmaF5uNaHXIGGR$t<8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_bricks.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_bricks.png new file mode 100644 index 0000000000000000000000000000000000000000..fef97487cdfb3e8764fae9f2183c122175b14b37 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF1A2IPCj+H93p^r=85sBugD~Uq z{1quc!FW#>#}J9jvS$toHXHD`9&~4)beTa(RKZk$tvLP6lK)|k=IbWx+!y>_-tFyG ztzLEI=-gv(H%J&ny?x&`_2a1(JrCBry4<*X;|^=9l7-IVRwaM=V_#fo|V)wZT+D+8=KfgBlgMJT)6VwBADY{@XSK9_~3@44hObu zNf*5P;ZO19_ShdPgg&ebxsLQ03cCe Ap#T5? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_front_on.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_front_on.png new file mode 100644 index 0000000000000000000000000000000000000000..1122de9614f4a4a50f0616f88c7a72fa64ab2e35 GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~?*N|=S0Jr# zYiZzM0_SlYnknDwIfPzN2KnKXycvH`n%!`wkH_AjL>|Ur1>IK_f?+$%REg{ zJ4abdM`Z_3RSzExe}DbBP?NmG45!;HK;tA!g8YIR{^I}!!Jc=4iuyfW9780g+WIr{ zwHR*w=zn}w>a6S=3wWoT)jGIJM^Q7$lciw3fMM!?=OY^DRGPC&+otaN z9JM`n?-CIei)nvl9`Duvz;(L7$PRfaJ#+ zyV#u@s{2E}xf>Mw@h^~%+!d0^viZZLGyl4$x!hi`HslY(D@UQN97>|GK<yy85}S Ib4q9e0JC9+3IG5A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_glow.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_glow.png new file mode 100644 index 0000000000000000000000000000000000000000..ad6556936322b7a49c6cc571b6a0d36a279c5b87 GIT binary patch literal 291 zcmV+;0o?wHP)8kbs&6-T^{sp8D&MliIC;s)6AKOaEYh_Hg&< z90Ac^R%C#?2BZl*2gm}<5?Xx0THx&K8!Hcm=8eFq%kO}`K!Ro*O z2DlWkOW-BIKESk9ACv;QI$#pRr{-LsY~q8JgMm6AbMT;fAh0qY7{CCR0~QI)11tkP zg>}Re)FZ!J_s5LMgD(zAt)E_3FI!aFPb? poC=Ke&|?f+g?$LD#eDD|fG;0Z&0xF;iRl0U002ovPDHLkV1kd8f-3+3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_glow.png.mcmeta b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_glow.png.mcmeta new file mode 100644 index 00000000..98b9ae71 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_glow.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_glow_e.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_glow_e.png new file mode 100644 index 0000000000000000000000000000000000000000..ad6556936322b7a49c6cc571b6a0d36a279c5b87 GIT binary patch literal 291 zcmV+;0o?wHP)8kbs&6-T^{sp8D&MliIC;s)6AKOaEYh_Hg&< z90Ac^R%C#?2BZl*2gm}<5?Xx0THx&K8!Hcm=8eFq%kO}`K!Ro*O z2DlWkOW-BIKESk9ACv;QI$#pRr{-LsY~q8JgMm6AbMT;fAh0qY7{CCR0~QI)11tkP zg>}Re)FZ!J_s5LMgD(zAt)E_3FI!aFPb? poC=Ke&|?f+g?$LD#eDD|fG;0Z&0xF;iRl0U002ovPDHLkV1kd8f-3+3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_glow_e.png.mcmeta b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_glow_e.png.mcmeta new file mode 100644 index 00000000..98b9ae71 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_glow_e.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_side.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_side.png new file mode 100644 index 0000000000000000000000000000000000000000..93739a9660f358ea83f693d4903984a9b17601f6 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(iS0F8G z>8R}Bsp{dQ;qR{>7iyB1*tznUJ5YkXB*-tA;XfEGtzY&VC{*R?;us<^)z-g}_kaOM zkidWY$_LXXZqZ`Q$v%4Xs+1J}QpFSB4><4q#?Nm$&)rzUyE-6yYs%U~I=&Gn5<}j& zau%vxuHf9w%X%W}+gJCX=^tMvPu#vB*@|`Fg*+afvg4ahxmScve;EG6bKjkthq9}D j{r^2u_23bH`i$|CDRbo6IUjxkUBTe#>gTe~DWM4f+VWaW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_top.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_top.png new file mode 100644 index 0000000000000000000000000000000000000000..47b8ae0ef908123ef9f336566faf0ea418cf189c GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(iS0F8G z>8R}Bsp{dQ;qR{>7iyB1*tznUJ5YkXB*-tA;XfEGtzY&VC{*a_;us<^)zzPq?|=f& zDw)6kC%a$u5lU9Pu=rNUcIypJr<6{776|%zy?;W`4jsoNt&ron$E7D`xOGf?v}1=< zs!vfBo4beA2L|J5H@=F!y!-f<`Xe9Cqop0ok4xI1jaA89ZJ6T-G@yGywovw^u#@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_bottom.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..e09891f30efb1d390ffdf62b0988e73d847233b3 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(iS0F8G z>8R}Bsp{dQ;qR{>7iyB1*tznUJ5YkXB*-tA;XfEGtzY&VDCFho;us<^b?%u!AqGJn z=78KK-|auSm3RMLa=6E4$=21JpJFvQSULYN%Qo`u(0wse-Qc}B$5VL&`2(v=R=lWw j`NH@!=g-8R}Bsp{dQ;qR{>7iyB1*tznUJ5YkXB*-tA;XfEGtzY&VDCFnq;us<^HMgIU>wp0V z^XW4`|Er(3TJ}21(b3aS_OXo7={bMR@=K literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_top.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_top.png new file mode 100644 index 0000000000000000000000000000000000000000..c35aed10ed9d86a22b13ab55fedbbce1b5a49123 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(iS0F8G z>8R}Bsp{dQ;qR{>7iyB1*tznUJ5YkXB*-tA;XfEGtzY&VDCF(w;us<^b#AYx&;bVy zCiZ~;|DQ}a`*Bu)+>)gQYvWg)ss7Tm$xu-KK`2+}jR$80c!NX_F^InW l6P>SF8ynwGf7{n@#c(M2P?Z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_pillar_side.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_pillar_side.png new file mode 100644 index 0000000000000000000000000000000000000000..07bc8a22f9d732aa79c5eefe5961d1e756d55164 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF1A2IPCj+H93p^r=85sBugD~Uq z{1qucK@U$C#}J9jxo0=>9x&i=xhQ?`CW9FRYt`-@f5W-VG}kWg*ON_Z;r7kXLh-SbDN!7SOQ_44$rjF6*2UngGq4 BK`sCQ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_pillar_top.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_pillar_top.png new file mode 100644 index 0000000000000000000000000000000000000000..0828a0c4478f8968ba76818b4fe5559f6df799a9 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF7iyB12$aMH9@VpX0_8XhJR*x382Ao@ zFyrz36)8Z$2u~Ns5Q)pKXD@OdFyLUhpgj46?*!RL44PB@E|mNitcr576ttI632+`F^i>HXf#=F;u6{1-oD!M<6pBUB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_polished.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_polished.png new file mode 100644 index 0000000000000000000000000000000000000000..0077b7760fc0123895a4d7099ca234c8b28bf8a4 GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF1A2IPCj+H93p^r=85sBugD~Uq z{1quc!E{d-#}J9jvc8SH4GKKkzZgz18_6+LHGO1o{a=6doUZrowRa2l$(?W9DS5U? zT+uRYqK;1X;i&@u_hiPdlAWwGHAhKoymMW@M!0=MqE*_wP@RB+P#8TZo5XVx2B ge{ncSx@wXrhrFY`h)JV(unx$Xp00i_>zopr01@Czl>h($ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_tiles.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_tiles.png new file mode 100644 index 0000000000000000000000000000000000000000..cc5bc0d33a4fea6aa191f00590f305fc29bbf706 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF1A2IPCj+H93p^r=85sBugD~Uq z{1qucK|4{(aFxCJ7 literal 0 HcmV?d00001 From aaea1443668427f9065b7aca5d5fed930ca09b0b Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 11 Mar 2021 20:50:02 +0300 Subject: [PATCH 329/463] Triple terrain fixes --- .../ru/betterend/blocks/basis/TripleTerrainBlock.java | 8 ++++---- .../assets/betterend/materialmaps/block/rubinea.json | 3 +++ 2 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/assets/betterend/materialmaps/block/rubinea.json diff --git a/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java index a879c22c..63d5e2b2 100644 --- a/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java @@ -65,13 +65,13 @@ public class TripleTerrainBlock extends EndTerrainBlock { @Override public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { TripleShape shape = state.get(SHAPE); - if (shape == TripleShape.TOP) { + if (shape == TripleShape.BOTTOM) { super.randomTick(state, world, pos, random); return; } else if (random.nextInt(16) == 0) { boolean bottom = canSurviveBottom(world, pos); - if (shape == TripleShape.BOTTOM) { + if (shape == TripleShape.TOP) { if (!bottom) { world.setBlockState(pos, Blocks.END_STONE.getDefaultState()); } @@ -82,10 +82,10 @@ public class TripleTerrainBlock extends EndTerrainBlock { world.setBlockState(pos, Blocks.END_STONE.getDefaultState()); } else if (top && !bottom) { - world.setBlockState(pos, state.with(SHAPE, TripleShape.TOP)); + world.setBlockState(pos, state.with(SHAPE, TripleShape.BOTTOM)); } else if (!top && bottom) { - world.setBlockState(pos, state.with(SHAPE, TripleShape.BOTTOM)); + world.setBlockState(pos, state.with(SHAPE, TripleShape.TOP)); } } } diff --git a/src/main/resources/assets/betterend/materialmaps/block/rubinea.json b/src/main/resources/assets/betterend/materialmaps/block/rubinea.json new file mode 100644 index 00000000..1fc9123d --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/rubinea.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving" +} From e1122359f1db43cd4b7a2f8e7f837052e5b99268 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 11 Mar 2021 21:21:33 +0300 Subject: [PATCH 330/463] Triple block pattern fix --- .../blocks/basis/TripleTerrainBlock.java | 2 +- .../blockstate/triple_rotated_top.json | 24 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java index 63d5e2b2..1acead20 100644 --- a/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java @@ -48,7 +48,7 @@ public class TripleTerrainBlock extends EndTerrainBlock { System.out.println(block); String name = Registry.BLOCK.getId(this).getPath(); if (block.endsWith("_middle")) { - return Patterns.createJson(Patterns.BLOCK_BASE, name + "_top"); + return Patterns.createJson(Patterns.BLOCK_BASE, name + "_top", name + "_top"); } Map map = Maps.newHashMap(); map.put("%top%", "betterend:block/" + name + "_top"); diff --git a/src/main/resources/assets/betterend/patterns/blockstate/triple_rotated_top.json b/src/main/resources/assets/betterend/patterns/blockstate/triple_rotated_top.json index 36ff9261..377caff4 100644 --- a/src/main/resources/assets/betterend/patterns/blockstate/triple_rotated_top.json +++ b/src/main/resources/assets/betterend/patterns/blockstate/triple_rotated_top.json @@ -1,22 +1,22 @@ { "variants": { "shape=bottom": [ - { "model": "betterend:pattern/%block%" }, - { "model": "betterend:pattern/%block%", "y": 90 }, - { "model": "betterend:pattern/%block%", "y": 180 }, - { "model": "betterend:pattern/%block%", "y": 270 } + { "model": "betterend:pattern/%block%/%block%" }, + { "model": "betterend:pattern/%block%/%block%", "y": 90 }, + { "model": "betterend:pattern/%block%/%block%", "y": 180 }, + { "model": "betterend:pattern/%block%/%block%", "y": 270 } ], "shape=middle": [ - { "model": "betterend:pattern/%block%_middle" }, - { "model": "betterend:pattern/%block%_middle", "y": 90 }, - { "model": "betterend:pattern/%block%_middle", "y": 180 }, - { "model": "betterend:pattern/%block%_middle", "y": 270 } + { "model": "betterend:pattern/%block%/%block%_middle" }, + { "model": "betterend:pattern/%block%/%block%_middle", "y": 90 }, + { "model": "betterend:pattern/%block%/%block%_middle", "y": 180 }, + { "model": "betterend:pattern/%block%/%block%_middle", "y": 270 } ], "shape=top": [ - { "model": "betterend:pattern/%block%", "x": 180 }, - { "model": "betterend:pattern/%block%", "x": 180, "y": 90 }, - { "model": "betterend:pattern/%block%", "x": 180, "y": 180 }, - { "model": "betterend:pattern/%block%", "x": 180, "y": 270 } + { "model": "betterend:pattern/%block%/%block%", "x": 180 }, + { "model": "betterend:pattern/%block%/%block%", "x": 180, "y": 90 }, + { "model": "betterend:pattern/%block%/%block%", "x": 180, "y": 180 }, + { "model": "betterend:pattern/%block%/%block%", "x": 180, "y": 270 } ] } } \ No newline at end of file From b79a86b4308bbe3321e3d6086830c31030677d37 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 11 Mar 2021 21:35:09 +0300 Subject: [PATCH 331/463] Triple grass behaviour enhancement --- .../blocks/basis/TripleTerrainBlock.java | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java index 1acead20..70979594 100644 --- a/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java @@ -9,14 +9,19 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.MaterialColor; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemPlacementContext; import net.minecraft.server.world.ServerWorld; import net.minecraft.state.StateManager; import net.minecraft.state.property.EnumProperty; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; import net.minecraft.util.Identifier; +import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.util.registry.Registry; +import net.minecraft.world.World; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; @@ -62,6 +67,15 @@ public class TripleTerrainBlock extends EndTerrainBlock { return Patterns.STATE_TRIPLE_ROTATED_TOP; } + @Override + public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + TripleShape shape = state.get(SHAPE); + if (shape == TripleShape.BOTTOM) { + return super.onUse(state, world, pos, player, hand, hit); + } + return ActionResult.FAIL; + } + @Override public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { TripleShape shape = state.get(SHAPE); @@ -77,7 +91,7 @@ public class TripleTerrainBlock extends EndTerrainBlock { } } else { - boolean top = canSurvive(state, world, pos); + boolean top = canSurvive(state, world, pos) || isMiddle(world.getBlockState(pos.up())); if (!top && !bottom) { world.setBlockState(pos, Blocks.END_STONE.getDefaultState()); } @@ -94,11 +108,18 @@ public class TripleTerrainBlock extends EndTerrainBlock { protected boolean canSurviveBottom(WorldView world, BlockPos pos) { BlockPos blockPos = pos.down(); BlockState blockState = world.getBlockState(blockPos); - if (blockState.getFluidState().getLevel() == 8) { + if (isMiddle(blockState)) { + return true; + } + else if (blockState.getFluidState().getLevel() == 8) { return false; } else { return !blockState.isSideSolidFullSquare(world, blockPos, Direction.UP); } } + + protected boolean isMiddle(BlockState state) { + return state.isOf(this) && state.get(SHAPE) == TripleShape.MIDDLE; + } } From aae1ac54d51a9a99cea4fa6f410e4c917e4725a8 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 12 Mar 2021 11:54:37 +0300 Subject: [PATCH 332/463] Rubinea textures --- .../assets/betterend/textures/block/rubinea.png | Bin 234 -> 224 bytes .../betterend/textures/block/rubinea_bottom.png | Bin 223 -> 431 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/betterend/textures/block/rubinea.png b/src/main/resources/assets/betterend/textures/block/rubinea.png index b590bfe8f1c0cf7214fd12519cb6e39eb8733230..767cccbfe1638dcd08fe9af2c3871e17d691df3a 100644 GIT binary patch delta 123 zcmV->0EGYQ0pJ0UY;<2qL_t&-l~s>H62Kq`13{AT{~s6HsVFDe*@?mI9Vi7mCX~sO zcq_aVDrw3?VJkyCnrM>gD70hhnOKw9yDm^I6h7b+evq;*6>IMe2>b%8jmX%bKPP4{ d5&>KLvxTgWmo5Y@h-yu3%$IALR0n6U-*OCFQ5pw0zXZH>l nt>+%U`ZzFsK~V42^P}|-dBp;`uCT>h00000NkvXXu0mjfem*@z diff --git a/src/main/resources/assets/betterend/textures/block/rubinea_bottom.png b/src/main/resources/assets/betterend/textures/block/rubinea_bottom.png index 5601c26870202c77b32ca43fdceab29e0b6c4a8b..075ba6d7b16ced8db1fcb3c7ebcf56de5054b1ad 100644 GIT binary patch delta 416 zcmV;R0bl;#0j~p)8Gi-<001BJ|6u?C00DDSM?wIu&K&6g00C)9L_t(IjkQv}PQx%5 zJVT>6YN}B2Hz96ns$dO|9TKfghUWAA&6wb(X=~MzUwIf z*z;Xa>Ho|lBm$)g9E)f6ZO$?7^wrhV9Sb4}-}Mw5clrtddb1JJE;Ql&Q{dw(#<|@F zH%y!z9wYzQT7L>OC{4f(6VvWcX(FWwL`=9mIYmf>=U|D0eG7Wl=37^T`GhfG8=Z)^ zWXIwd%qI*0#+|;>!;~g?4FlY+9t$y6dQgTI+0}zejAis@BL)CREeDRpEB8AEbWFfc zk?ML-+r)gdzU!&QW(7)4I97kmS!j>gwf$u6=00000< KMNUMnLSTX@fwzhP delta 206 zcmZ3_e4lZGWIZzj1A~Sxe=v|@EDmyaVpw-h<|U9L5#STz3Z%6$Gh&zwi`<>E;^r}bb;w<+U%be6Yk=_D8+T4_aa?$G z^;W%FyG=>ESfw6XhsZ|uoUN6+v*Ymkr2Q2Pt+ A9{>OV From e71caa23f1cd620d31493a3225351bf7bf3e37c2 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 12 Mar 2021 20:32:08 +0300 Subject: [PATCH 333/463] Lang update --- src/main/java/ru/betterend/registry/EndBiomes.java | 1 + src/main/resources/assets/betterend/lang/en_us.json | 8 +++++++- src/main/resources/assets/betterend/lang/ru_ru.json | 8 +++++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index 6564b77d..328d2dfc 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -415,6 +415,7 @@ public class EndBiomes { List result = Lists.newArrayList(); result.addAll(EndBiomes.LAND_BIOMES.getBiomes()); result.addAll(EndBiomes.VOID_BIOMES.getBiomes()); + result.addAll(EndBiomes.CAVE_BIOMES.getBiomes()); result.addAll(SUBBIOMES); return result; } diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 07d42dd2..22d85745 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -759,5 +759,11 @@ "block.betterend.virid_jadestone_wall": "Virid Jadestone Wall", "item.betterend.amber_root_raw": "Raw Amber Root", "item.betterend.chorus_mushroom_cooked": "Cooked Chorus Mushroom", - "item.betterend.chorus_mushroom_raw": "Raw Chorus Mushroom" + "item.betterend.chorus_mushroom_raw": "Raw Chorus Mushroom", + + "biome.betterend.empty_aurora_cave": "Empty Aurora Cave", + "biome.betterend.empty_end_cave": "Empty End Cave", + "biome.betterend.empty_smaragdant_cave": "Empty Smaragdant Cave", + "biome.betterend.lush_aurora_cave": "Lush Aurora Cave", + "biome.betterend.lush_smaragdant_cave": "Lush Smaragdant Cave" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 8ff7218f..a7057c3d 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -779,5 +779,11 @@ "block.betterend.virid_jadestone_wall": "Стена из зелёного нефрита", "item.betterend.amber_root_raw": "Сырой янтарный корень", "item.betterend.chorus_mushroom_cooked": "Приготовленный хорусовый гриб", - "item.betterend.chorus_mushroom_raw": "Сырой хорусовый гриб" + "item.betterend.chorus_mushroom_raw": "Сырой хорусовый гриб", + + "biome.betterend.empty_aurora_cave": "Пустая пещера авроры", + "biome.betterend.empty_end_cave": "Пустая пещера Энда", + "biome.betterend.empty_smaragdant_cave": "Пустая смарагдантовая пещера", + "biome.betterend.lush_aurora_cave": "Пышная пещера авроры", + "biome.betterend.lush_smaragdant_cave": "Пышная смарагдантовая пещера" } \ No newline at end of file From 2a4b4f9c5ab67e3d3a50719fa7ff4ec76710b2e6 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 13 Mar 2021 01:37:50 +0300 Subject: [PATCH 334/463] Dragon bones block --- .../ru/betterend/blocks/LargeAmaranitaBlock.java | 2 +- ...syBoneBlock.java => MossyDragonBoneBlock.java} | 7 ++++--- .../ru/betterend/blocks/SmallAmaranitaBlock.java | 2 +- .../ru/betterend/blocks/basis/EndPillarBlock.java | 6 ++++++ .../java/ru/betterend/registry/EndBlocks.java | 14 ++++++++++---- src/main/java/ru/betterend/util/BonemealUtil.java | 6 +++--- .../assets/betterend/blockstates/mossy_bone.json | 7 ------- .../betterend/blockstates/mossy_dragon_bone.json | 7 +++++++ .../resources/assets/betterend/lang/en_us.json | 7 ++++++- .../resources/assets/betterend/lang/ru_ru.json | 7 ++++++- .../betterend/models/block/mossy_bone_hor.json | 12 ------------ .../betterend/models/block/mossy_bone_ver.json | 12 ------------ .../models/block/mossy_dragon_bone_hor.json | 12 ++++++++++++ .../models/block/mossy_dragon_bone_ver.json | 12 ++++++++++++ .../assets/betterend/models/item/mossy_bone.json | 3 --- .../betterend/models/item/mossy_dragon_bone.json | 3 +++ .../textures/block/dragon_bone_block.png | Bin 0 -> 238 bytes .../textures/block/dragon_bone_block_side.png | Bin 0 -> 266 bytes .../textures/block/dragon_bone_block_top.png | Bin 0 -> 277 bytes .../betterend/textures/block/mossy_bone_cut.png | Bin 268 -> 0 bytes .../textures/block/mossy_bone_side_hor.png | Bin 251 -> 0 bytes .../textures/block/mossy_bone_side_ver.png | Bin 251 -> 0 bytes .../textures/block/mossy_dragon_bone_cut.png | Bin 0 -> 269 bytes .../textures/block/mossy_dragon_bone_side_hor.png | Bin 0 -> 552 bytes .../textures/block/mossy_dragon_bone_side_ver.png | Bin 0 -> 292 bytes 25 files changed, 71 insertions(+), 48 deletions(-) rename src/main/java/ru/betterend/blocks/{MossyBoneBlock.java => MossyDragonBoneBlock.java} (88%) delete mode 100644 src/main/resources/assets/betterend/blockstates/mossy_bone.json create mode 100644 src/main/resources/assets/betterend/blockstates/mossy_dragon_bone.json delete mode 100644 src/main/resources/assets/betterend/models/block/mossy_bone_hor.json delete mode 100644 src/main/resources/assets/betterend/models/block/mossy_bone_ver.json create mode 100644 src/main/resources/assets/betterend/models/block/mossy_dragon_bone_hor.json create mode 100644 src/main/resources/assets/betterend/models/block/mossy_dragon_bone_ver.json delete mode 100644 src/main/resources/assets/betterend/models/item/mossy_bone.json create mode 100644 src/main/resources/assets/betterend/models/item/mossy_dragon_bone.json create mode 100644 src/main/resources/assets/betterend/textures/block/dragon_bone_block.png create mode 100644 src/main/resources/assets/betterend/textures/block/dragon_bone_block_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/dragon_bone_block_top.png delete mode 100644 src/main/resources/assets/betterend/textures/block/mossy_bone_cut.png delete mode 100644 src/main/resources/assets/betterend/textures/block/mossy_bone_side_hor.png delete mode 100644 src/main/resources/assets/betterend/textures/block/mossy_bone_side_ver.png create mode 100644 src/main/resources/assets/betterend/textures/block/mossy_dragon_bone_cut.png create mode 100644 src/main/resources/assets/betterend/textures/block/mossy_dragon_bone_side_hor.png create mode 100644 src/main/resources/assets/betterend/textures/block/mossy_dragon_bone_side_ver.png diff --git a/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java b/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java index 65ad65ae..35b14b54 100644 --- a/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java +++ b/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java @@ -41,7 +41,7 @@ public class LargeAmaranitaBlock extends EndPlantBlock { @Override protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.SANGNUM) || state.isOf(EndBlocks.MOSSY_OBSIDIAN) || state.isOf(EndBlocks.MOSSY_BONE); + return state.isOf(EndBlocks.SANGNUM) || state.isOf(EndBlocks.MOSSY_OBSIDIAN) || state.isOf(EndBlocks.MOSSY_DRAGON_BONE); } @Override diff --git a/src/main/java/ru/betterend/blocks/MossyBoneBlock.java b/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java similarity index 88% rename from src/main/java/ru/betterend/blocks/MossyBoneBlock.java rename to src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java index 971f4fd8..35e7f49d 100644 --- a/src/main/java/ru/betterend/blocks/MossyBoneBlock.java +++ b/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java @@ -19,9 +19,10 @@ import net.minecraft.util.math.Direction; import net.minecraft.world.WorldView; import net.minecraft.world.chunk.light.ChunkLightProvider; import ru.betterend.blocks.basis.EndPillarBlock; +import ru.betterend.registry.EndBlocks; -public class MossyBoneBlock extends EndPillarBlock { - public MossyBoneBlock() { +public class MossyDragonBoneBlock extends EndPillarBlock { + public MossyDragonBoneBlock() { super(FabricBlockSettings.copyOf(Blocks.BONE_BLOCK).hardness(0.5F).ticksRandomly()); } @@ -31,7 +32,7 @@ public class MossyBoneBlock extends EndPillarBlock { if (tool != null && EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Collections.singletonList(new ItemStack(this)); } - return Collections.singletonList(new ItemStack(Blocks.BONE_BLOCK)); + return Collections.singletonList(new ItemStack(EndBlocks.DRAGON_BONE_BLOCK)); } @Override diff --git a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java index 334206f6..aff0ad4c 100644 --- a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java +++ b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java @@ -22,7 +22,7 @@ public class SmallAmaranitaBlock extends EndPlantBlock { @Override protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.SANGNUM) || state.isOf(EndBlocks.MOSSY_OBSIDIAN) || state.isOf(EndBlocks.MOSSY_BONE); + return state.isOf(EndBlocks.SANGNUM) || state.isOf(EndBlocks.MOSSY_OBSIDIAN) || state.isOf(EndBlocks.MOSSY_DRAGON_BONE); } @Override diff --git a/src/main/java/ru/betterend/blocks/basis/EndPillarBlock.java b/src/main/java/ru/betterend/blocks/basis/EndPillarBlock.java index 04f9ff4d..92941d8e 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndPillarBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndPillarBlock.java @@ -4,6 +4,8 @@ import java.io.Reader; import java.util.Collections; import java.util.List; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.PillarBlock; import net.minecraft.item.ItemStack; @@ -18,6 +20,10 @@ public class EndPillarBlock extends PillarBlock implements BlockPatterned { super(settings); } + public EndPillarBlock(Block block) { + super(FabricBlockSettings.copyOf(block)); + } + @Override public List getDroppedStacks(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index d7312cb8..2293e7f3 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -69,7 +69,7 @@ import ru.betterend.blocks.LumecornSeedBlock; import ru.betterend.blocks.MengerSpongeBlock; import ru.betterend.blocks.MengerSpongeWetBlock; import ru.betterend.blocks.MissingTileBlock; -import ru.betterend.blocks.MossyBoneBlock; +import ru.betterend.blocks.MossyDragonBoneBlock; import ru.betterend.blocks.MossyGlowshroomCapBlock; import ru.betterend.blocks.MossyGlowshroomSaplingBlock; import ru.betterend.blocks.MossyObsidian; @@ -103,7 +103,10 @@ import ru.betterend.blocks.basis.EndCropBlock; import ru.betterend.blocks.basis.EndFurnaceBlock; import ru.betterend.blocks.basis.EndLeavesBlock; import ru.betterend.blocks.basis.EndOreBlock; +import ru.betterend.blocks.basis.EndPillarBlock; import ru.betterend.blocks.basis.EndSignBlock; +import ru.betterend.blocks.basis.EndSlabBlock; +import ru.betterend.blocks.basis.EndStairsBlock; import ru.betterend.blocks.basis.EndUnderwaterWallPlantBlock; import ru.betterend.blocks.basis.EndWallPlantBlock; import ru.betterend.blocks.basis.FurBlock; @@ -150,7 +153,10 @@ public class EndBlocks { public static final Block RUTISCUS_PATH = registerBlock("rutiscus_path", new EndPathBlock(RUTISCUS)); public static final Block MOSSY_OBSIDIAN = registerBlock("mossy_obsidian", new MossyObsidian()); - public static final Block MOSSY_BONE = registerBlock("mossy_bone", new MossyBoneBlock()); + public static final Block DRAGON_BONE_BLOCK = registerBlock("dragon_bone_block", new EndPillarBlock(Blocks.BONE_BLOCK)); + public static final Block DRAGON_BONE_STAIRS = registerBlock("dragon_bone_stairs", new EndStairsBlock(DRAGON_BONE_BLOCK)); + public static final Block DRAGON_BONE_SLAB = registerBlock("dragon_bone_slab", new EndSlabBlock(DRAGON_BONE_BLOCK)); + public static final Block MOSSY_DRAGON_BONE = registerBlock("mossy_dragon_bone", new MossyDragonBoneBlock()); // Rocks // public static final StoneMaterial FLAVOLITE = new StoneMaterial("flavolite", MaterialColor.SAND); @@ -244,8 +250,8 @@ public class EndBlocks { public static final Block SALTEAGO = registerBlock("salteago", new TerrainPlantBlock(END_MOSS)); public static final Block VAIOLUSH_FERN = registerBlock("vaiolush_fern", new TerrainPlantBlock(END_MOSS)); public static final Block FRACTURN = registerBlock("fracturn", new TerrainPlantBlock(END_MOSS)); - public static final Block CLAWFERN = registerBlock("clawfern", new TerrainPlantBlock(SANGNUM, MOSSY_OBSIDIAN, MOSSY_BONE)); - public static final Block GLOBULAGUS = registerBlock("globulagus", new TerrainPlantBlock(SANGNUM, MOSSY_OBSIDIAN, MOSSY_BONE)); + public static final Block CLAWFERN = registerBlock("clawfern", new TerrainPlantBlock(SANGNUM, MOSSY_OBSIDIAN, MOSSY_DRAGON_BONE)); + public static final Block GLOBULAGUS = registerBlock("globulagus", new TerrainPlantBlock(SANGNUM, MOSSY_OBSIDIAN, MOSSY_DRAGON_BONE)); public static final Block ORANGO = registerBlock("orango", new TerrainPlantBlock(RUTISCUS)); public static final Block AERIDIUM = registerBlock("aeridium", new TerrainPlantBlock(RUTISCUS)); public static final Block LUTEBUS = registerBlock("lutebus", new TerrainPlantBlock(RUTISCUS)); diff --git a/src/main/java/ru/betterend/util/BonemealUtil.java b/src/main/java/ru/betterend/util/BonemealUtil.java index 5d288dd0..178fa951 100644 --- a/src/main/java/ru/betterend/util/BonemealUtil.java +++ b/src/main/java/ru/betterend/util/BonemealUtil.java @@ -52,9 +52,9 @@ public class BonemealUtil { addBonemealGrass(EndBlocks.SANGNUM, EndBlocks.CLAWFERN); addBonemealGrass(EndBlocks.SANGNUM, EndBlocks.SMALL_AMARANITA_MUSHROOM, 0.1F); - addBonemealGrass(EndBlocks.MOSSY_BONE, EndBlocks.GLOBULAGUS); - addBonemealGrass(EndBlocks.MOSSY_BONE, EndBlocks.CLAWFERN); - addBonemealGrass(EndBlocks.MOSSY_BONE, EndBlocks.SMALL_AMARANITA_MUSHROOM, 0.1F); + addBonemealGrass(EndBlocks.MOSSY_DRAGON_BONE, EndBlocks.GLOBULAGUS); + addBonemealGrass(EndBlocks.MOSSY_DRAGON_BONE, EndBlocks.CLAWFERN); + addBonemealGrass(EndBlocks.MOSSY_DRAGON_BONE, EndBlocks.SMALL_AMARANITA_MUSHROOM, 0.1F); addBonemealGrass(EndBlocks.MOSSY_OBSIDIAN, EndBlocks.GLOBULAGUS); addBonemealGrass(EndBlocks.MOSSY_OBSIDIAN, EndBlocks.CLAWFERN); diff --git a/src/main/resources/assets/betterend/blockstates/mossy_bone.json b/src/main/resources/assets/betterend/blockstates/mossy_bone.json deleted file mode 100644 index f825d388..00000000 --- a/src/main/resources/assets/betterend/blockstates/mossy_bone.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "axis=x": { "model": "betterend:block/mossy_bone_hor", "y": 90 }, - "axis=y": { "model": "betterend:block/mossy_bone_ver" }, - "axis=z": { "model": "betterend:block/mossy_bone_hor" } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/blockstates/mossy_dragon_bone.json b/src/main/resources/assets/betterend/blockstates/mossy_dragon_bone.json new file mode 100644 index 00000000..81deb09d --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/mossy_dragon_bone.json @@ -0,0 +1,7 @@ +{ + "variants": { + "axis=x": { "model": "betterend:block/mossy_dragon_bone_hor", "y": 90 }, + "axis=y": { "model": "betterend:block/mossy_dragon_bone_ver" }, + "axis=z": { "model": "betterend:block/mossy_dragon_bone_hor" } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 22d85745..5d3d64ee 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -765,5 +765,10 @@ "biome.betterend.empty_end_cave": "Empty End Cave", "biome.betterend.empty_smaragdant_cave": "Empty Smaragdant Cave", "biome.betterend.lush_aurora_cave": "Lush Aurora Cave", - "biome.betterend.lush_smaragdant_cave": "Lush Smaragdant Cave" + "biome.betterend.lush_smaragdant_cave": "Lush Smaragdant Cave", + + "block.betterend.dragon_bone_block": "Dragon Bone Block", + "block.betterend.dragon_bone_slab": "Dragon Bone Slab", + "block.betterend.dragon_bone_stairs": "Dragon Bone Stairs", + "block.betterend.mossy_dragon_bone": "Mossy Dragon Bone" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index a7057c3d..8ab69546 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -785,5 +785,10 @@ "biome.betterend.empty_end_cave": "Пустая пещера Энда", "biome.betterend.empty_smaragdant_cave": "Пустая смарагдантовая пещера", "biome.betterend.lush_aurora_cave": "Пышная пещера авроры", - "biome.betterend.lush_smaragdant_cave": "Пышная смарагдантовая пещера" + "biome.betterend.lush_smaragdant_cave": "Пышная смарагдантовая пещера", + + "block.betterend.dragon_bone_block": "Блок драконьих костей", + "block.betterend.dragon_bone_slab": "Плита из блока драконьих костей", + "block.betterend.dragon_bone_stairs": "Ступени из блока драконьих костей", + "block.betterend.mossy_dragon_bone": "Замшелые драконьи кости" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/mossy_bone_hor.json b/src/main/resources/assets/betterend/models/block/mossy_bone_hor.json deleted file mode 100644 index acc98207..00000000 --- a/src/main/resources/assets/betterend/models/block/mossy_bone_hor.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "parent": "block/cube", - "textures": { - "down": "block/bone_block_side", - "east": "betterend:block/mossy_bone_side_ver", - "north": "betterend:block/mossy_bone_cut", - "particle": "betterend:block/mossy_bone_side_ver", - "south": "betterend:block/mossy_bone_cut", - "up": "betterend:block/sangnum_top", - "west": "betterend:block/mossy_bone_side_ver" - } -} diff --git a/src/main/resources/assets/betterend/models/block/mossy_bone_ver.json b/src/main/resources/assets/betterend/models/block/mossy_bone_ver.json deleted file mode 100644 index 8534387e..00000000 --- a/src/main/resources/assets/betterend/models/block/mossy_bone_ver.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "parent": "block/cube", - "textures": { - "down": "block/bone_block_top", - "east": "betterend:block/mossy_bone_side_ver", - "north": "betterend:block/mossy_bone_side_ver", - "particle": "betterend:block/mossy_bone_side_ver", - "south": "betterend:block/mossy_bone_side_ver", - "up": "betterend:block/sangnum_top", - "west": "betterend:block/mossy_bone_side_ver" - } -} diff --git a/src/main/resources/assets/betterend/models/block/mossy_dragon_bone_hor.json b/src/main/resources/assets/betterend/models/block/mossy_dragon_bone_hor.json new file mode 100644 index 00000000..fd85f978 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/mossy_dragon_bone_hor.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "betterend:block/dragon_bone_block_side", + "east": "betterend:block/mossy_dragon_bone_side_ver", + "north": "betterend:block/mossy_dragon_bone_cut", + "particle": "betterend:block/mossy_dragon_bone_side_ver", + "south": "betterend:block/mossy_dragon_bone_cut", + "up": "betterend:block/sangnum_top", + "west": "betterend:block/mossy_dragon_bone_side_ver" + } +} diff --git a/src/main/resources/assets/betterend/models/block/mossy_dragon_bone_ver.json b/src/main/resources/assets/betterend/models/block/mossy_dragon_bone_ver.json new file mode 100644 index 00000000..8200c597 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/mossy_dragon_bone_ver.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "betterend:block/dragon_bone_block_top", + "east": "betterend:block/mossy_dragon_bone_side_ver", + "north": "betterend:block/mossy_dragon_bone_side_ver", + "particle": "betterend:block/mossy_dragon_bone_side_ver", + "south": "betterend:block/mossy_dragon_bone_side_ver", + "up": "betterend:block/sangnum_top", + "west": "betterend:block/mossy_dragon_bone_side_ver" + } +} diff --git a/src/main/resources/assets/betterend/models/item/mossy_bone.json b/src/main/resources/assets/betterend/models/item/mossy_bone.json deleted file mode 100644 index 22aebdb8..00000000 --- a/src/main/resources/assets/betterend/models/item/mossy_bone.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "betterend:block/mossy_bone_ver" -} diff --git a/src/main/resources/assets/betterend/models/item/mossy_dragon_bone.json b/src/main/resources/assets/betterend/models/item/mossy_dragon_bone.json new file mode 100644 index 00000000..591f10e5 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/mossy_dragon_bone.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/mossy_dragon_bone_ver" +} diff --git a/src/main/resources/assets/betterend/textures/block/dragon_bone_block.png b/src/main/resources/assets/betterend/textures/block/dragon_bone_block.png new file mode 100644 index 0000000000000000000000000000000000000000..72dedc81de5578ad535908783532f2786c844197 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~p#Yx{S0Jq_ zWuc>BZ>sL$pdaXC5tG~$tql}qD+%%oX7~>RRh19^0Yxf2T^vIsrkeVl6l7N9+06I- zev!)Nhm1Y%ZfM)nD_gRHh(2QIMeQBhBFkMU&4Y`8UlW8h(?k83}jp6T|x zDXF?4>d%1<*Dp=VvsiFS!K32vglPd!tyGiQ_VC>oD3|za&uZevz3V}cQBQbb&O42` dd+hK3F|4#>7HKN)xCwLvgQu&X%Q~loCIG&aRpS5v literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/dragon_bone_block_side.png b/src/main/resources/assets/betterend/textures/block/dragon_bone_block_side.png new file mode 100644 index 0000000000000000000000000000000000000000..77cc55ca26fdef16bc660f44ea8d3660f9aee4fa GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFddaDriYE2)?%u7QS-Zy5^)`sHB&X42#;zm6|vE zv$GeR$?I5VbJuLI^42{YBZ>sL$pdaXC5d)OL1HST@IRT|P3p^r=85sBugD~Uq z{1quc!8}hF#}J9jwtWW$k0|gkr>_&(h5mdi?$bfhS5wSQPijDhT$SQP_CrO45T< p?!A+KFIqJBc7K=uuHV0p*~sV57TeP)d@KUwT2EI$mvv4FO#n=-R(${f literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/mossy_bone_cut.png b/src/main/resources/assets/betterend/textures/block/mossy_bone_cut.png deleted file mode 100644 index 774c8208ef40ab6720144f7137f9245f71a7abc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 268 zcmV+n0rUQeP)Px#Do{*RMY9_lydEFLAtcTvDcC43;Vd)iFF5owJ;T4D$;GG6%B|elz~kV`=;hK8 zQ(VXZ0059lL_t&-l_iY}7Q`S30|~Hv?ftL2vGplBV^D!k808Db$kfCRCWSe4;b7#TFQ zdl*4+m+cu$SJ&lz86`GhhmplyzW^Ft{sNxF0VA}tM)rcUGu!-a{mFwb_TDu S-mE470000na**L$~) zKD>MC*`rG@pIzB3Exkuh{-~nLIaSRY8hQ_Pj9=+nd@;7QdS7S*RNw09;us<^HMTcU zh}n?C>7uUJ*MHx2Z~A>->~riyx6p>{aILr3dZcdW+TSj-R(-SO+=bn~wLERM)jujK z7QR}QH+xcy1AE8Wyvns5W(6vHAM_u4;Ci!ZvEuYNM@na**L$~) zKD>MC*`rG@pIzB3Exkuh{-~nLIaSRY8hQ_Pj9=+nd@;7QdS7S*RNw09;us<^HMZAV zh*^QhX>tUU@4Nc@N%pg?W=&L2XxOX0wXE8$M|Ev_=GMzyvae>%Gx=&JQSj~4#!Bb2 zd6yQc_BU{|G)+nFUC^lgu)$ucnLR~Pf_FoKN>pdbZY6>53$!nbUEXaovGmoxXRdNH ypU+6ScKczpq|9sm9~sql3UmIyJZ1l2pZL_(tRjoE52OGc#Ng@b=d#Wzp$PyLXkx-Xl(M7OJdz)j(yR!86&wRwUbyaO!QMPGgaP2bxiJydg zuDtoUu<~N$%utb=XB!h7-CaYCr!^`iq#7J>b^ajk+c{%i2d`VpZl;`k1s<Px$;z>k7R49>MQax|eP!v7!M_&9K$BylYx(&rk5G+Khgw&CZnLoguEh~F}0RMuS zy$f4cm=G+evJ{~vZr#N9<>lFe;erJ{%hS2{o^wC+dY7k9Vj)#y=5Yp~s4D;)O^J|G zKLqf(T+K!)fKn5+#yX#z0`MHStB!@7#~HPT8bggqgp`iUF4A@_08<%qHMM4=iPMRY z1y!Y{SV*>?jnb(fS^!v6Pz8Xy1MqAYfAQ^pO|4<0-q&X@Hkv%gRgLLp>-4HIiI4!O zHB7C7szgX>yR%W62w7?Z@a1;J-n=@ysK%()SUe&l7LsoOK-%t9hSZv(t`Z@ij#8f1 z0q}jh@ob0tmYSwAd~48>}8djWDSQGWFJVtkf{vF(fW(n(3H zkH&l5t3C~~zT+OJM}xlju*1v4YSCo-!+xjgU%-96?Y)}6;VsuysSg@J6h!{O>mpGQ zJsPLoVH|#jo)4hjD*#+Q^!%ac|GZrT*r~b`^k&EB08S=Z7h+k5yY1b-)QN(KyZ`wS q!o&ZFf=FrAWu1;N9?%C+TKxufOyuEnT;u!z0000bn9B6YQB;nzhH*{ z$ROP7wg^zB&(p;*L}IGzS~4Os%36FJZBlY zO9i*>N||BbALsT|fJy9U#fQSK)hlNiuCV536u00>J2%Uz=fKp2MtRnU{O4|P@GBhj z(tI4!R=#*iz=fOIENQ!z?B*&q-*b2Fw0XJDX3IL&C%m`VZa;(nO3lLW^SBbXKV$#R ZpC78tzV2vObS%(i44$rjF6*2UngC-BZqNV# literal 0 HcmV?d00001 From a3a6b54ebafbc10852c5fde14a1e78da8feda11b Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 13 Mar 2021 01:47:45 +0300 Subject: [PATCH 335/463] Furnace drop fix --- .../blocks/basis/EndFurnaceBlock.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java b/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java index 7920088b..8e1daf69 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java @@ -1,15 +1,21 @@ package ru.betterend.blocks.basis; import java.io.Reader; +import java.util.List; import java.util.Map; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.Block; +import net.minecraft.block.BlockState; import net.minecraft.block.FurnaceBlock; import net.minecraft.block.entity.BlockEntity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.context.LootContext; +import net.minecraft.loot.context.LootContextParameters; import net.minecraft.screen.NamedScreenHandlerFactory; import net.minecraft.stat.Stats; import net.minecraft.util.Identifier; @@ -76,4 +82,17 @@ public class EndFurnaceBlock extends FurnaceBlock implements BlockPatterned, IRe public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } + + @Override + public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + List drop = Lists.newArrayList(new ItemStack(this)); + BlockEntity blockEntity = builder.getNullable(LootContextParameters.BLOCK_ENTITY); + if (blockEntity instanceof EFurnaceBlockEntity) { + EFurnaceBlockEntity entity = (EFurnaceBlockEntity) blockEntity; + for (int i = 0; i < entity.size(); i++) { + drop.add(entity.getStack(i)); + } + } + return drop; + } } From a2605ef3f9759b72e4123e749a1e212adf5539d0 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 13 Mar 2021 05:08:17 +0300 Subject: [PATCH 336/463] Data Fixer (WIP) --- src/main/java/ru/betterend/BetterEnd.java | 2 + .../mixin/common/ServerWorldMixin.java | 69 ++++++++++++++ .../java/ru/betterend/util/DataFixerUtil.java | 90 ++++++++++++++++++ .../models/item/end_stone_stalactite.json | 6 ++ .../item/end_stone_stalactite_cavemoss.json | 6 ++ .../textures/item/end_stone_stalactite.png | Bin 0 -> 1569 bytes .../item/end_stone_stalactite_cavemoss.png | Bin 0 -> 2103 bytes .../resources/betterend.mixins.common.json | 1 + 8 files changed, 174 insertions(+) create mode 100644 src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java create mode 100644 src/main/java/ru/betterend/util/DataFixerUtil.java create mode 100644 src/main/resources/assets/betterend/models/item/end_stone_stalactite.json create mode 100644 src/main/resources/assets/betterend/models/item/end_stone_stalactite_cavemoss.json create mode 100644 src/main/resources/assets/betterend/textures/item/end_stone_stalactite.png create mode 100644 src/main/resources/assets/betterend/textures/item/end_stone_stalactite_cavemoss.png diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index 628f2618..2cf9e6c9 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -32,6 +32,7 @@ import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; import ru.betterend.registry.EndTags; import ru.betterend.util.BonemealUtil; +import ru.betterend.util.DataFixerUtil; import ru.betterend.util.Logger; import ru.betterend.world.generator.BetterEndBiomeSource; import ru.betterend.world.generator.GeneratorOptions; @@ -65,6 +66,7 @@ public class BetterEnd implements ModInitializer { Integrations.register(); BonemealUtil.init(); GeneratorOptions.init(); + DataFixerUtil.init(); if (hasGuideBook()) { GuideBookItem.register(); diff --git a/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java b/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java new file mode 100644 index 00000000..4d2a5df9 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java @@ -0,0 +1,69 @@ +package ru.betterend.mixin.common; + +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.concurrent.Executor; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.fabricmc.loader.api.FabricLoader; +import net.fabricmc.loader.api.metadata.ModMetadata; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtIo; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.WorldGenerationProgressListener; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.registry.RegistryKey; +import net.minecraft.world.World; +import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.gen.Spawner; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.level.ServerWorldProperties; +import net.minecraft.world.level.storage.LevelStorage; +import ru.betterend.BetterEnd; +import ru.betterend.util.DataFixerUtil; + +@Mixin(ServerWorld.class) +public class ServerWorldMixin { + @Inject(method = "*", at = @At("TAIL")) + private void be_onServerWorldInit(MinecraftServer server, Executor workerExecutor, LevelStorage.Session session, ServerWorldProperties properties, RegistryKey registryKey, DimensionType dimensionType, WorldGenerationProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, boolean debugWorld, long l, List list, boolean bl, CallbackInfo info) { + File beData = new File(FabricLoader.getInstance().getGameDir().getParent().toString(), "saves/" + properties.getLevelName() + "/betterend_data.nbt"); + ModMetadata meta = FabricLoader.getInstance().getModContainer(BetterEnd.MOD_ID).get().getMetadata(); + String version = meta.getVersion().toString(); + boolean fix = false; + if (version.equals("${version}")) { + version = "development"; + } + if (beData.exists()) { + CompoundTag root; + try { + root = NbtIo.read(beData); + } + catch (IOException e) { + BetterEnd.LOGGER.error("World data loading failed", e); + return; + } + String dataVersion = root.getString("version"); + fix = !dataVersion.equals(version); + } + else { + CompoundTag root = new CompoundTag(); + root.putString("version", version); + try { + NbtIo.write(root, beData); + } + catch (IOException e) { + BetterEnd.LOGGER.error("World data saving failed", e); + } + fix = true; + } + + if (fix) { + DataFixerUtil.fixData(beData.getParentFile()); + } + } +} diff --git a/src/main/java/ru/betterend/util/DataFixerUtil.java b/src/main/java/ru/betterend/util/DataFixerUtil.java new file mode 100644 index 00000000..99085b14 --- /dev/null +++ b/src/main/java/ru/betterend/util/DataFixerUtil.java @@ -0,0 +1,90 @@ +package ru.betterend.util; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.util.List; +import java.util.Map; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.NbtIo; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.world.storage.RegionFile; + +public class DataFixerUtil { + private static final Map REPLACEMENT = Maps.newHashMap(); + + public static void init() { + addFix("minecraft:stone", "minecraft:glowstone"); + } + + public static void fixData(File dir) { + List regions = getAllRegions(dir, null); + regions.forEach((file) -> { + try { + System.out.println("Fixing " + file); + boolean[] changed = new boolean[1]; + RegionFile region = new RegionFile(file, file.getParentFile(), true); + for (int x = 0; x < 32; x++) { + for (int z = 0; z < 32; z++) { + ChunkPos pos = new ChunkPos(x, z); + changed[0] = false; + if (region.hasChunk(pos)) { + DataInputStream input = region.getChunkInputStream(pos); + CompoundTag root = NbtIo.read(input); + input.close(); + ListTag sections = root.getCompound("Level").getList("Sections", 10); + sections.forEach((tag) -> { + ListTag palette = ((CompoundTag) tag).getList("Palette", 10); + palette.forEach((blockTag) -> { + CompoundTag blockTagCompound = ((CompoundTag) blockTag); + String name = blockTagCompound.getString("Name"); + String replace = REPLACEMENT.get(name); + if (replace != null) { + blockTagCompound.putString("Name", replace); + changed[0] = true; + } + }); + }); + if (changed[0]) { + System.out.println("Write!"); + DataOutputStream output = region.getChunkOutputStream(pos); + NbtIo.write(root, output); + output.close(); + } + } + } + } + region.close(); + } + catch (Exception e) { + e.printStackTrace(); + } + }); + } + + private static void addFix(String result, String... names) { + for (String name: names) { + REPLACEMENT.put(name, result); + } + } + + private static List getAllRegions(File dir, List list) { + if (list == null) { + list = Lists.newArrayList(); + } + for (File file: dir.listFiles()) { + if (file.isDirectory()) { + getAllRegions(file, list); + } + else if (file.isFile() && file.getName().endsWith(".mca")) { + list.add(file); + } + } + return list; + } +} diff --git a/src/main/resources/assets/betterend/models/item/end_stone_stalactite.json b/src/main/resources/assets/betterend/models/item/end_stone_stalactite.json new file mode 100644 index 00000000..0ea40081 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/end_stone_stalactite.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/end_stone_stalactite" + } +} diff --git a/src/main/resources/assets/betterend/models/item/end_stone_stalactite_cavemoss.json b/src/main/resources/assets/betterend/models/item/end_stone_stalactite_cavemoss.json new file mode 100644 index 00000000..642d4c00 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/end_stone_stalactite_cavemoss.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/end_stone_stalactite_cavemoss" + } +} diff --git a/src/main/resources/assets/betterend/textures/item/end_stone_stalactite.png b/src/main/resources/assets/betterend/textures/item/end_stone_stalactite.png new file mode 100644 index 0000000000000000000000000000000000000000..994dd767ca550f662be9050b2c083f14e373d9c7 GIT binary patch literal 1569 zcmbVMTZkJ~7@l-n-R)9|7HyGY#|ed9bnZ!ZGww8GlW0Oa+hrT*F23x^IcJk`Gjqn7 zNs}x>y9&h$io{Dn7JVr7QL3*Mo3$v4f-k=K;024%x?PnbtMN=OgGkldfivg!o$tT@ z=jZ31*thq=y$r+bD;9DKbdCmN^e*~8yxj$K8gmLu9>a|94@QJ}W8)yh?A|s@i~gc< zT!X|C03u~9G%bgs8D=KkbO2n%K3m2W)7H5kuUzF=6Y1QkgdrJD7FW%}nu|}a&6VKV zDoi0ReUzPPYLvjjK46aTx(<#-j_pDGRh`QO0@+1lp3M>$vk4)|LpiRn zQz=1CN+~7&D62^FlqgM!vdT-cCM7jB#ST7>N^{YQwvc;#AdBvFuIl@aCW?(lLujZ1 zaVw&nN~J_e5fz1}2;OViK4|i`7aKCO&2h3JCb%_P_+0E3N;8BB-qp z*838_fsA;t+_NyX!Q3ei;pClM~= zvN8q1@O_TJdJx3nd-OlwpKwiDM4)!(JYkTuEU6LKAc%Td4N|z5N?O76XuMj3qBx14 z9;|96+shsez#zeO4hE6Mh#MT6ckG!yZKH}Q>A!@#5A(>1-vBPoRHzqkC!<8FzZg_w z-xTrhR`%}xQn^DoZ3n?J>_c=Db~0?!_T|z(mHGAj&$P#VS|ibkW$H#^(wGvfPaemZpg*z<+& z>wCt9?#Rf6tv|Leb=O~FuAD>S#$(@%fC))@rh8-E7Y{DIF74cmZ0%YC%nP%|xN+|A znGdcf&ffdv>@KaFe(&mA-!gYkTzn0VZ3#^N;nC-IzSxXB@Y{*@fj85wPG|GOPuaOGf_Jhc3|)V}Y<<&O?=8`FvFeq@qi?tlB(Q@?!t!)DOL Ni}|_SJG0Br{t11P|IYvb literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/end_stone_stalactite_cavemoss.png b/src/main/resources/assets/betterend/textures/item/end_stone_stalactite_cavemoss.png new file mode 100644 index 0000000000000000000000000000000000000000..6d3cdf8b9b9aa0371951c9fd12851edb6379d9e2 GIT binary patch literal 2103 zcmcIle{9rL94`UJfM7t449K9AAR6rT=iRks=bU%Qh8&FB=>`h!-FvThb$4xPd%GJD z6$goi5G6y6bILClTSKlhF8&F~ZLHnA%%!ODxA^A>s(+x4 zqH4Aq$quh0zDR>sE&z~~!hvGWCTNOkXe`1xFYQ{vUg*niD2bP3{hMVKZ(Al(sf zrK6UE>0ltlLO~Ykuo@6Tyei6f(IPK|IX=t@63Yu3AJQb1E*}hu<{({5#O^D{B2N(} z<9W8mafL!5P>=$alja0fRXJYdM3E&3*6lGpP-IPaR)rykUFaCLXILifGlGFrQis1IE!=G^jv}!s#u~@JYIzlOPkA8 z(XKbYn`Bh3ZCJFM?6EPIz^;{dAfDe%BF?HLW@jwVax>Od>ZpFMR%2^X2LsP?l9rXN zG^(}2LPw*1V-)(1cEdzg!M)QDRGx!lz{3$nSPfwYvI z3d$&?vmrUCvx*{zSw$97ECNAZfhj>%fK-_uvtZtDqCbDg&&Yy=qbi*S*VymN*9ar9k#dRzE957(+0`BMC_?#5l-`sw}fABBLM< zA)LY~F$@7i{~b4KWi2OeA)>kD8@gmHt=Vu%_j<~|NE=>N9%T)>Bbw(zAP@x05grr3d%7zUeEQp_8Q&z-|FG~wR6a7 z+`nB|`gX-SOWIj_MHX*=Slupk8ip>ru$TrGNx(r=Wi;t>{FL+Uor37ZG%mg zlBwA~W&Kylmwz_Sjy}}OeRp)t?-wTRy7l>Gb2r{pJG1%wdyG^2f`fvZcqjefAKaLo zA59;4W&H8{`G-E)K)Lx(A>r`5qT-#jp?{>=H0+qQi11I6uMy0$O6fAZE<(|4R+vpatzliQYfv3KmcOykIx zUYmGv${SyvKlAwOU7H`vzk6`fZ%gR?kKR0bFF3gM;l9TDAD_GQS?83Rj-yW$`;N_S zJ$BoQ&dtv(T39#x@VSIizx@4YKV{Y)J=uTmLwjNK%0o4KW*VbTez5cG)RY%L)-%HD h>X^3_eZA^3wMAMNy)f;kjsDi&GJkRGt$RD4{0qk1z3>14 literal 0 HcmV?d00001 diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index 625615ac..82e04940 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -29,6 +29,7 @@ "LivingEntityMixin", "BoneMealItemMixin", "PlayerEntityMixin", + "ServerWorldMixin", "SlimeEntityMixin", "AnvilBlockMixin", "BrewingAccessor", From 2aa08604bd55857b1c68b9198d0a00e7525071c3 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 13 Mar 2021 05:11:16 +0300 Subject: [PATCH 337/463] Small changes --- .../mixin/common/ServerWorldMixin.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java b/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java index 4d2a5df9..07921ee3 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java @@ -51,19 +51,23 @@ public class ServerWorldMixin { fix = !dataVersion.equals(version); } else { - CompoundTag root = new CompoundTag(); - root.putString("version", version); - try { - NbtIo.write(root, beData); - } - catch (IOException e) { - BetterEnd.LOGGER.error("World data saving failed", e); - } fix = true; } if (fix) { DataFixerUtil.fixData(beData.getParentFile()); + be_writeDataFile(beData, version); + } + } + + private void be_writeDataFile(File file, String version) { + CompoundTag root = new CompoundTag(); + root.putString("version", version); + try { + NbtIo.write(root, file); + } + catch (IOException e) { + BetterEnd.LOGGER.error("World data saving failed", e); } } } From 24280e7649f7c9705c28f49e183728d2b8e59abf Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 13 Mar 2021 17:00:52 +0300 Subject: [PATCH 338/463] Data fixer enhancements, new textures --- .../betterend/mixin/common/ServerWorldMixin.java | 5 +---- .../java/ru/betterend/util/DataFixerUtil.java | 8 ++++++-- .../betterend/textures/block/filalux_lantern.png | Bin 0 -> 302 bytes .../textures/block/filalux_lantern_block.png | Bin 0 -> 263 bytes .../betterend/textures/block/filalux_middle.png | Bin 0 -> 227 bytes .../betterend/textures/block/lucernia_leaves.png | Bin 0 -> 241 bytes .../textures/block/lucernia_log_side.png | Bin 0 -> 265 bytes .../textures/block/lucernia_log_stripped_side.png | Bin 0 -> 220 bytes .../textures/block/lucernia_log_stripped_top.png | Bin 0 -> 222 bytes .../betterend/textures/block/lucernia_log_top.png | Bin 0 -> 282 bytes .../betterend/textures/block/lucernia_planks.png | Bin 0 -> 431 bytes 11 files changed, 7 insertions(+), 6 deletions(-) create mode 100644 src/main/resources/assets/betterend/textures/block/filalux_lantern.png create mode 100644 src/main/resources/assets/betterend/textures/block/filalux_lantern_block.png create mode 100644 src/main/resources/assets/betterend/textures/block/filalux_middle.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_leaves.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_log_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_log_stripped_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_log_stripped_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_log_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_planks.png diff --git a/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java b/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java index 07921ee3..afecf839 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java @@ -33,11 +33,8 @@ public class ServerWorldMixin { private void be_onServerWorldInit(MinecraftServer server, Executor workerExecutor, LevelStorage.Session session, ServerWorldProperties properties, RegistryKey registryKey, DimensionType dimensionType, WorldGenerationProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, boolean debugWorld, long l, List list, boolean bl, CallbackInfo info) { File beData = new File(FabricLoader.getInstance().getGameDir().getParent().toString(), "saves/" + properties.getLevelName() + "/betterend_data.nbt"); ModMetadata meta = FabricLoader.getInstance().getModContainer(BetterEnd.MOD_ID).get().getMetadata(); - String version = meta.getVersion().toString(); + String version = BetterEnd.isDevEnvironment() ? "development" : meta.getVersion().toString(); boolean fix = false; - if (version.equals("${version}")) { - version = "development"; - } if (beData.exists()) { CompoundTag root; try { diff --git a/src/main/java/ru/betterend/util/DataFixerUtil.java b/src/main/java/ru/betterend/util/DataFixerUtil.java index 99085b14..d9885a2e 100644 --- a/src/main/java/ru/betterend/util/DataFixerUtil.java +++ b/src/main/java/ru/betterend/util/DataFixerUtil.java @@ -19,12 +19,16 @@ public class DataFixerUtil { private static final Map REPLACEMENT = Maps.newHashMap(); public static void init() { - addFix("minecraft:stone", "minecraft:glowstone"); + //addFix("minecraft:stone", "minecraft:glowstone"); // Example } public static void fixData(File dir) { + if (REPLACEMENT.isEmpty()) { + return; + } + List regions = getAllRegions(dir, null); - regions.forEach((file) -> { + regions.parallelStream().forEach((file) -> { try { System.out.println("Fixing " + file); boolean[] changed = new boolean[1]; diff --git a/src/main/resources/assets/betterend/textures/block/filalux_lantern.png b/src/main/resources/assets/betterend/textures/block/filalux_lantern.png new file mode 100644 index 0000000000000000000000000000000000000000..4a47f30b8e077f142e30cac46e5d1da7f269232c GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~rvRT2S0Ei` zZ&v7Q-yY#s5$nIdt9gHK)7@>e?(Ud*{ql_aw^zS-dg#Nu>mNVd%59s~diMX0C;vNa z?Y4RP?2pN~S>E`nW75Ofg0?_Y#7ctvf*Jl}10jvQi-9UCJY5_^B&L@3oEB;};9#hH zvBgQ5v*rK)t66T*wma0z*cong@Eq%DXr3q6Iq`1&y{fkDUjh&9jr>wjEWb3&c;)QV zcD>Tq&dYUu`Z%RK$@EGQo6yoAkJfV=I96}cNtbx~%HeYNPusuD4}46NV6244$rjF6*2UngB@xi7fyC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/filalux_lantern_block.png b/src/main/resources/assets/betterend/textures/block/filalux_lantern_block.png new file mode 100644 index 0000000000000000000000000000000000000000..824b97f5aa0033e83684a4c700628c1dff0f790d GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~tpJ}8S0Ei` zZ&v7Q-yY%CQxLJVFZ;&1>9?;heDU{?$4yc;1B*-tA z;Xg76_qr_tlqvLdaSV}|n%f`9$E?WVlIV8OtNQ=zGK1Um@9t}Hi4&1@z9_5buqffH z-is5#Sv_A@N+`O$;3%GwyllpYCTWQTy@@Uxj?UN_m-JLd=-i9C_htv@T}kY6yve;BCi6bS>0#(KIq zhDc0}?PKISpuoXgxM=PF{~s94RfL3|s(f?V!@xA@DC>Kdm^l~aKdP(F%{OXWB~X}E z*Iazp^cL&9e=$qGX18xxV00^IrF!#>b<>ZCZ0MOP%W1k+;YwHB@2hdG`bP0l+XkK*aTU+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_leaves.png b/src/main/resources/assets/betterend/textures/block/lucernia_leaves.png new file mode 100644 index 0000000000000000000000000000000000000000..626abc19f676be9b81036807e486ef7f2973221b GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~=>VS)S0G(& z@376&=W>A6ogA;{J@G#_b^JRxv-Rx%gTXpafYO{LL4Lsu|DnK~Y4#PMV7{k|V~E65 z+XaPG=&EV!P{$S;`TKLlJo6=DPw>-KbU43U_s+aJxx zV93F=n(5yEW7cZFFE5#L{L50+%Eet%Pi4ElE%kM~UB{*0dhqtGIRQbZ-zvSVv#FSK zW}5oC>2qIuJhZ&NI7y2`a<}z)j@-PRwu&7KEJGJv?pOPCdP*8&#Vb|j84Grbikj%f z{IvWa|LVl7H~a2rq`q2xb}h#_X~k3jl5cN%|DHS2&g~sbWCCC5C7`nyJYD@<);T3K F0RRiDXbS)U literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_log_stripped_side.png b/src/main/resources/assets/betterend/textures/block/lucernia_log_stripped_side.png new file mode 100644 index 0000000000000000000000000000000000000000..cc3d3b75822fac261383486380f682af1ffbce86 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(i*Bzcd zhx~lb#Q0oH_PLqm^RUqWX?fVjRkad81*M)Yjv*3LUHciiSPXfX9%udfufG14Enied zo5c-DkJERj@*kDlaNx6GCnE>*`j;H?57@7*=QdK`5*FdL{Au;HdV!^1ZWtPt)J8UN zOI@(LXR!TqjIPkd#Z!1EG|pb#kd}LD!EgRW6Pco4I50|gvgY*v747HLzoN;Ubk5ws Q7w7;6Pgg&ebxsLQ0HZxkr2qf` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_log_stripped_top.png b/src/main/resources/assets/betterend/textures/block/lucernia_log_stripped_top.png new file mode 100644 index 0000000000000000000000000000000000000000..bbb0c42854b58f1d5475f10970065e017b9f077b GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(i*Bzcd zhx~lb#Q0oH_PLqm^RUqWX?fVjRkad81?8SDjv*3LeFHp&SPVHP>He?(l%OAc_NWL` zR$79CqYT3}AFkua?}@YJPFTeCDdvdfcCExK9LM;T{EbDf2k$+s>LYzSKh^p8>J2Gt zmoDUYjGwlD(S=>p9<(jmD1X|zO!UQ#?3GXMNWQ#PvoX2+wcPiZa3=kvugZ0MqL_`l T-GpWVoxtGf>gTe~DWM4fVEj>h literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_log_top.png b/src/main/resources/assets/betterend/textures/block/lucernia_log_top.png new file mode 100644 index 0000000000000000000000000000000000000000..d9e4f84a0a954216bd3e77cbb5ac04041a96b36b GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~^#Gp`S0J75 zYFp~*&=lm_6Ye%G+HFCC`yoG{Gci6FlYMSx`8+K2e_9@9$u~(FsFb%P$S;`TKN8So zaa;?O=>K`b^qR5dI0#3*ROVQGw_M-lbIU;GV`FQWh+_YjghTDhjdzRpo-}1z>ma&HSMjK~%DSb_`iddD zLpoprSS?cGINziWKD!y{<*hyU1&+O4N*--@jI^z7c<>A!pAv;T60Dq1d> Q1auRFr>mdKI;Vst0ElOBEdT%j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_planks.png b/src/main/resources/assets/betterend/textures/block/lucernia_planks.png new file mode 100644 index 0000000000000000000000000000000000000000..9d911b725c397dbcfd3b73d216816f0fa46f9869 GIT binary patch literal 431 zcmV;g0Z{&lP)Px$X-PyuR5*=wQ!#GCFbupxOk^01;31webZv+BD}779+CCuYk|3}H7;+$3b%=JL zDa%31g#vXZdFRu^_s9G15E+FvptZ$qTz}%f^`>DE02J0>hz!Jl-UBNO6jtgA9wI}r z0ML2H$^xX*^#YDl!_M$IZ*l&QCtL^daLWS@qCRT{Hti zk!WpEAl~JtAKo?rM4Qet=<72ij_QM4gZwV|>3#%`2N_7OZzb9`pmLcOwT$UJFMQBi z@kRbVNcba(sP@&GHrHA*Q Date: Sat, 13 Mar 2021 17:32:47 +0300 Subject: [PATCH 339/463] Lucernia & Filalux prototypes --- .../betterend/blocks/FilaluxLanternBlock.java | 11 +++++++++++ .../java/ru/betterend/registry/EndBlocks.java | 7 +++++++ .../ru/betterend/registry/FilaluxBlock.java | 15 +++++++++++++++ .../assets/betterend/blockstates/filalux.json | 7 +++++++ .../betterend/materialmaps/block/filalux.json | 14 ++++++++++++++ .../materialmaps/block/filalux_lantern.json | 3 +++ .../materialmaps/block/lucernia_leaves.json | 3 +++ .../materialmaps/block/lucernia_sapling.json | 3 +++ .../betterend/materialmaps/item/filalux.json | 3 +++ .../materialmaps/item/lucernia_leaves.json | 1 + .../betterend/materialmaps/item/rubinea.json | 1 + .../betterend/models/block/filalux_bottom.json | 6 ++++++ .../betterend/models/block/filalux_middle.json | 6 ++++++ .../assets/betterend/models/item/filalux.json | 6 ++++++ .../betterend/textures/block/filalux_bottom.png | Bin 0 -> 302 bytes .../textures/block/filalux_lantern.png | Bin 302 -> 263 bytes .../textures/block/filalux_lantern_block.png | Bin 263 -> 0 bytes .../textures/block/lucernia_leaves.png | Bin 241 -> 258 bytes 18 files changed, 86 insertions(+) create mode 100644 src/main/java/ru/betterend/blocks/FilaluxLanternBlock.java create mode 100644 src/main/java/ru/betterend/registry/FilaluxBlock.java create mode 100644 src/main/resources/assets/betterend/blockstates/filalux.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/filalux.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/filalux_lantern.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/lucernia_leaves.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/lucernia_sapling.json create mode 100644 src/main/resources/assets/betterend/materialmaps/item/filalux.json create mode 100644 src/main/resources/assets/betterend/materialmaps/item/lucernia_leaves.json create mode 100644 src/main/resources/assets/betterend/materialmaps/item/rubinea.json create mode 100644 src/main/resources/assets/betterend/models/block/filalux_bottom.json create mode 100644 src/main/resources/assets/betterend/models/block/filalux_middle.json create mode 100644 src/main/resources/assets/betterend/models/item/filalux.json create mode 100644 src/main/resources/assets/betterend/textures/block/filalux_bottom.png delete mode 100644 src/main/resources/assets/betterend/textures/block/filalux_lantern_block.png diff --git a/src/main/java/ru/betterend/blocks/FilaluxLanternBlock.java b/src/main/java/ru/betterend/blocks/FilaluxLanternBlock.java new file mode 100644 index 00000000..9bb4a323 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/FilaluxLanternBlock.java @@ -0,0 +1,11 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.Material; +import ru.betterend.blocks.basis.BlockBase; + +public class FilaluxLanternBlock extends BlockBase { + public FilaluxLanternBlock() { + super(FabricBlockSettings.of(Material.WOOD).luminance(15)); + } +} diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 2293e7f3..e3ef0248 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -64,6 +64,7 @@ import ru.betterend.blocks.LacugroveSaplingBlock; import ru.betterend.blocks.LanceleafBlock; import ru.betterend.blocks.LanceleafSeedBlock; import ru.betterend.blocks.LargeAmaranitaBlock; +import ru.betterend.blocks.FilaluxLanternBlock; import ru.betterend.blocks.LumecornBlock; import ru.betterend.blocks.LumecornSeedBlock; import ru.betterend.blocks.MengerSpongeBlock; @@ -233,6 +234,10 @@ public class EndBlocks { public static final Block JELLYSHROOM_CAP_PURPLE = registerBlock("jellyshroom_cap_purple", new JellyshroomCapBlock(217, 142, 255, 164, 0, 255)); public static final WoodenMaterial JELLYSHROOM = new WoodenMaterial("jellyshroom", MaterialColor.PURPLE, MaterialColor.LIGHT_BLUE); + public static final Block LUCERNIA_SAPLING = registerBlock("lucernia_sapling", new TenaneaSaplingBlock()); + public static final Block LUCERNIA_LEAVES = registerBlock("lucernia_leaves", new EndLeavesBlock(LUCERNIA_SAPLING, MaterialColor.ORANGE)); + public static final WoodenMaterial LUCERNIA = new WoodenMaterial("lucernia", MaterialColor.ORANGE, MaterialColor.ORANGE); + // Small Plants // public static final Block UMBRELLA_MOSS = registerBlock("umbrella_moss", new UmbrellaMossBlock()); public static final Block UMBRELLA_MOSS_TALL = registerBlock("umbrella_moss_tall", new UmbrellaMossTallBlock()); @@ -331,6 +336,8 @@ public class EndBlocks { public static final Block BULB_VINE = registerBlock("bulb_vine", new BulbVineBlock()); public static final Block JUNGLE_VINE = registerBlock("jungle_vine", new VineBlock()); public static final Block RUBINEA = registerBlock("rubinea", new VineBlock()); + public static final Block FILALUX = registerBlock("filalux", new FilaluxBlock()); + public static final Block FILALUX_LANTERN = registerBlock("filalux_lantern", new FilaluxLanternBlock()); // Mob-Related public static final Block SILK_MOTH_NEST = registerBlock("silk_moth_nest", new SilkMothNestBlock()); diff --git a/src/main/java/ru/betterend/registry/FilaluxBlock.java b/src/main/java/ru/betterend/registry/FilaluxBlock.java new file mode 100644 index 00000000..6b854712 --- /dev/null +++ b/src/main/java/ru/betterend/registry/FilaluxBlock.java @@ -0,0 +1,15 @@ +package ru.betterend.registry; + +import net.minecraft.block.AbstractBlock; +import ru.betterend.blocks.basis.VineBlock; + +public class FilaluxBlock extends VineBlock { + public FilaluxBlock() { + super(15, true); + } + + @Override + public AbstractBlock.OffsetType getOffsetType() { + return AbstractBlock.OffsetType.NONE; + } +} diff --git a/src/main/resources/assets/betterend/blockstates/filalux.json b/src/main/resources/assets/betterend/blockstates/filalux.json new file mode 100644 index 00000000..d077514e --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/filalux.json @@ -0,0 +1,7 @@ +{ + "variants": { + "shape=top": { "model": "betterend:block/filalux_middle" }, + "shape=middle": { "model": "betterend:block/filalux_middle" }, + "shape=bottom": { "model": "betterend:block/filalux_bottom" } + } +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/filalux.json b/src/main/resources/assets/betterend/materialmaps/block/filalux.json new file mode 100644 index 00000000..3b0f7feb --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/filalux.json @@ -0,0 +1,14 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/filalux_bottom", + "material": "betterend:waving_glow_inc" + }, + { + "sprite": "betterend:block/filalux_middle", + "material": "betterend:waving" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/filalux_lantern.json b/src/main/resources/assets/betterend/materialmaps/block/filalux_lantern.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/filalux_lantern.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/lucernia_leaves.json b/src/main/resources/assets/betterend/materialmaps/block/lucernia_leaves.json new file mode 100644 index 00000000..e4224176 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/lucernia_leaves.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:leaves" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/lucernia_sapling.json b/src/main/resources/assets/betterend/materialmaps/block/lucernia_sapling.json new file mode 100644 index 00000000..352de84b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/lucernia_sapling.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_floor" +} diff --git a/src/main/resources/assets/betterend/materialmaps/item/filalux.json b/src/main/resources/assets/betterend/materialmaps/item/filalux.json new file mode 100644 index 00000000..2163812f --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/filalux.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_inc" +} diff --git a/src/main/resources/assets/betterend/materialmaps/item/lucernia_leaves.json b/src/main/resources/assets/betterend/materialmaps/item/lucernia_leaves.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/lucernia_leaves.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materialmaps/item/rubinea.json b/src/main/resources/assets/betterend/materialmaps/item/rubinea.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/rubinea.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/models/block/filalux_bottom.json b/src/main/resources/assets/betterend/models/block/filalux_bottom.json new file mode 100644 index 00000000..5e85afac --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/filalux_bottom.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/filalux_bottom" + } +} diff --git a/src/main/resources/assets/betterend/models/block/filalux_middle.json b/src/main/resources/assets/betterend/models/block/filalux_middle.json new file mode 100644 index 00000000..84ef100c --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/filalux_middle.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/filalux_middle" + } +} diff --git a/src/main/resources/assets/betterend/models/item/filalux.json b/src/main/resources/assets/betterend/models/item/filalux.json new file mode 100644 index 00000000..7df95c23 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/filalux.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/filalux_bottom" + } +} diff --git a/src/main/resources/assets/betterend/textures/block/filalux_bottom.png b/src/main/resources/assets/betterend/textures/block/filalux_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..4a47f30b8e077f142e30cac46e5d1da7f269232c GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~rvRT2S0Ei` zZ&v7Q-yY#s5$nIdt9gHK)7@>e?(Ud*{ql_aw^zS-dg#Nu>mNVd%59s~diMX0C;vNa z?Y4RP?2pN~S>E`nW75Ofg0?_Y#7ctvf*Jl}10jvQi-9UCJY5_^B&L@3oEB;};9#hH zvBgQ5v*rK)t66T*wma0z*cong@Eq%DXr3q6Iq`1&y{fkDUjh&9jr>wjEWb3&c;)QV zcD>Tq&dYUu`Z%RK$@EGQo6yoAkJfV=I96}cNtbx~%HeYNPusuD4}46NV6244$rjF6*2UngB@xi7fyC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/filalux_lantern.png b/src/main/resources/assets/betterend/textures/block/filalux_lantern.png index 4a47f30b8e077f142e30cac46e5d1da7f269232c..824b97f5aa0033e83684a4c700628c1dff0f790d 100644 GIT binary patch delta 222 zcmZ3-)Xp@)uwE;`C&ZP3fg#M^tkBoKJ;JT0AYy4>_KkDXZ(m>d;_0FHZ?Ap-_A-3Z z?$)#aH$V6va?)`fP&HpkkY6yve`FBubz1}|Q|Rg97$Pw>w?B}NS&_pf(e0pD_5asp z2Dj(m-Pht0CnD*5QC81kQNmZf7bk+Vdcwc1lu&eg!BIRVdD)B)P0|txdJ|nX9G$T< zF6pU^(76|N@68U*yO`81cA)gJddKg{_RjM6?ZkJlzxS}B@Q|jR^E!1ql!BAKEVvCb9XUqTpSF_xrZFi`bu`}H0;5pXQ&^%ABbK>3l zdsS`QzXTrI8~LT6Sbk}k@ygk!?RurJotNwS^l?gelIfKqHld|K9lP>Y} ymBZ!kpSFLQANZIk$3%37?FfAPu7QJJI=*Bn8`I`;vp}FD7(8A5T-G@yGywoDScH`T diff --git a/src/main/resources/assets/betterend/textures/block/filalux_lantern_block.png b/src/main/resources/assets/betterend/textures/block/filalux_lantern_block.png deleted file mode 100644 index 824b97f5aa0033e83684a4c700628c1dff0f790d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~tpJ}8S0Ei` zZ&v7Q-yY%CQxLJVFZ;&1>9?;heDU{?$4yc;1B*-tA z;Xg76_qr_tlqvLdaSV}|n%f`9$E?WVlIV8OtNQ=zGK1Um@9t}Hi4&1@z9_5buqffH z-is5#Sv_A@N+`O$;3%GwyllpYCTWQTy@@Uxj?UN_m-JLd=-i9C_htv@T}Tiz5C*sZ(n)s**`Ep&V6{o Q2IvR|Pgg&ebxsLQ0LwdV*#H0l delta 200 zcmZo-`p7uJuwFXAC&ZP3fuY*oVVkGV)HPYgLR$&r8!H2 z{DK+&LxDNd>?=UQd`}n05Q(X_6FB)86gikrtN!_aG&;plsBep8V1-3OUXK$$Inwm!fxa&HpS}9xY0> yoY#Eqsf**ejKhr%#anL5otoaCwrA`9hs<}mnWt;6)L#L#o59o7&t;ucLK6UkTv Date: Sun, 14 Mar 2021 06:55:39 +0300 Subject: [PATCH 340/463] Cave bush textures --- .../java/ru/betterend/registry/EndBlocks.java | 2 +- .../betterend/materialmaps/block/cave_bush.json | 2 +- .../materials/waving_glow_80_blue.json | 8 ++++++++ .../shaders/material/glow_80_blue.frag | 6 ++++++ .../textures/block/cave_bush_leaves_1.png | Bin 283 -> 237 bytes .../textures/block/cave_bush_leaves_2.png | Bin 334 -> 271 bytes .../textures/block/cave_bush_leaves_3.png | Bin 319 -> 278 bytes .../textures/block/cave_bush_leaves_4.png | Bin 299 -> 275 bytes 8 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/assets/betterend/materials/waving_glow_80_blue.json create mode 100644 src/main/resources/assets/betterend/shaders/material/glow_80_blue.frag diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index e3ef0248..b0a4cc23 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -46,6 +46,7 @@ import ru.betterend.blocks.EnderBlock; import ru.betterend.blocks.EndstoneDustBlock; import ru.betterend.blocks.EternalPedestal; import ru.betterend.blocks.EternalRunedFlavolite; +import ru.betterend.blocks.FilaluxLanternBlock; import ru.betterend.blocks.GlowingHymenophoreBlock; import ru.betterend.blocks.GlowingMossBlock; import ru.betterend.blocks.GlowingPillarLuminophorBlock; @@ -64,7 +65,6 @@ import ru.betterend.blocks.LacugroveSaplingBlock; import ru.betterend.blocks.LanceleafBlock; import ru.betterend.blocks.LanceleafSeedBlock; import ru.betterend.blocks.LargeAmaranitaBlock; -import ru.betterend.blocks.FilaluxLanternBlock; import ru.betterend.blocks.LumecornBlock; import ru.betterend.blocks.LumecornSeedBlock; import ru.betterend.blocks.MengerSpongeBlock; diff --git a/src/main/resources/assets/betterend/materialmaps/block/cave_bush.json b/src/main/resources/assets/betterend/materialmaps/block/cave_bush.json index a9fa165f..e1736ac5 100644 --- a/src/main/resources/assets/betterend/materialmaps/block/cave_bush.json +++ b/src/main/resources/assets/betterend/materialmaps/block/cave_bush.json @@ -1,3 +1,3 @@ { - "defaultMaterial": "betterend:waving_glow_50_blue" + "defaultMaterial": "betterend:waving_glow_80_blue" } diff --git a/src/main/resources/assets/betterend/materials/waving_glow_80_blue.json b/src/main/resources/assets/betterend/materials/waving_glow_80_blue.json new file mode 100644 index 00000000..478d4ac3 --- /dev/null +++ b/src/main/resources/assets/betterend/materials/waving_glow_80_blue.json @@ -0,0 +1,8 @@ +{ + "layers": [ + { + "vertexSource": "betterend:shaders/material/wave.vert", + "fragmentSource": "betterend:shaders/material/glow_80_blue.frag" + } + ] +} diff --git a/src/main/resources/assets/betterend/shaders/material/glow_80_blue.frag b/src/main/resources/assets/betterend/shaders/material/glow_80_blue.frag new file mode 100644 index 00000000..85726ede --- /dev/null +++ b/src/main/resources/assets/betterend/shaders/material/glow_80_blue.frag @@ -0,0 +1,6 @@ +#include frex:shaders/api/fragment.glsl +#include frex:shaders/lib/math.glsl + +void frx_startFragment(inout frx_FragmentData fragData) { + fragData.emissivity = (fragData.spriteColor.b > 0.8) ? 1.0 : 0; +} diff --git a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_1.png b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_1.png index b0dfeefda2545a3495cc2c975f8af2c24fff8074..cf43a7852667b82b497f14f8420b93e91457ad5d 100644 GIT binary patch delta 220 zcmbQu^p{Jt(R6cDj>?C7bHayUHx3vIVCg!0C1pHDF6Tf delta 267 zcmV+m0rdXu0h0znK#Q;3SSjkaFEN)QWg zU?q3}!QRHg&O_J=Ucn2-{fmFd{u#5dWJvNeFO%47arDP*@7M9hFQc{HCR=~b4-VUX zhCk*o2K!l^%^>;(arXOk=kMjIw-9tmeIeu^S7W9GI75J9w13Qr#TY9Dz=DItXpu-{ zZKoojPzl&plK@Ushcgya0&Rye!;0;h)QHamk< Rs{jB107*qoL=Bjda<+J@NMnV257y6S^e@}X|GqguHPbPbz@_`do z^5V`KsY@bC&!`nIBe_!m zECPzw2HGLuCHIJ^W{8x9K)2)`X-m1>PTUiVx2T07dVM>=R^zR$F_5nIe&(-NbVQT%bJ(=>G&m$dN#E$TJ}K2SGvth)`5u QRsaA107*qoM6N<$f{?M20RR91 diff --git a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_3.png b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_3.png index b35de9467ccd2f76d610c9ff93ae5af4c9b81091..b94bd4e8522505f8698aaf069a1c1e9cb902a774 100644 GIT binary patch delta 261 zcmdnbG>vJ3WIZzj1A~Sxe=v|@EDmyaVpw-h<|UA$65tc!3Z%=$Os2>l$tMl}{lA}mm1XG?X4fM+Eai1kOMW?OOLlhge16-EPqS(XgY&|USDud*T3cqVm1B^L zcy&FZpojZm(G$fro)wzy*Veo~*#5cw{{HuWto|9TW#N%+JiHO;C1)~8Gi-<001BJ|6u?C0R~A#K~#9!eUc##0znK#D+mxY1}qmqkq}6@ z0g42NA>c6x93G1$;R-9!7_PuIK;X*$34hYw{7LpTj;Sf(_M3<+s07# zt+AfFb44s4!E0-nLo5bs5r}?Cob}M2=(WEL5rVQP7@-EWK7S{k0A~nb#>g6L##|%- z7Cz975rssa-rnJ5E+L@M695^)&Eun|r-pMRfD7Cqv}T?FB8XvvGjqbmz^IM@rfi!1 zg$e;1;|c1TW@`dLZq7bu8_GQqe~U%V*z_r;}xMaTdE002ovPDHLkV1o7Q Bgt`C# diff --git a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_4.png b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_4.png index cae9bdfeb78bbb200f044c5c74f3b042842ea410..d630d233f141540d37ff761ca235a95421b24a12 100644 GIT binary patch delta 258 zcmZ3@G?{6FWIZzj1A~Sxe=v|@EDmyaVpw-h<|UA$65tc!3Z%=$Os2>j7sn8Zsk;5q zVy=oDP9Fo!bN+qaJLCCcmq~kh8mgS;FpEx%V*N661B`MvSgwFe6$)*L>3@cXh2 zqL1wV+-80ucmKeejZbzf9DboR|9gr3|Gf5`NAdz4%&+e)D{%(8h{4m<&t;ucLK6V< Cb$QkR delta 283 zcmV+$0p$LZ0;>X$8Gi-<001BJ|6u?C0P;yhK~#9!eUdQ>0znK#Q;3SSjkaFEN)QEa zU?teu2=+D>b{@i3@CugJ-bnknfAKFdna#qIA<56YWFoiGMlXYv9=kI=bf$9Z&GkB5 zD{S=%ew)J>>|?SQf#?^+S9}`c2Gk*jqM#~&qjIo9QSa7fy zEfR_B+X(~|dIGjpB!Cmu;k3m(fp3Q~;b2e*&fV*+%jZW)06}S>e*|V6p%J002ovPDHLkV1h5rd-?zX From 292c16900734188ceb6f0afae195d8bb654f8941 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 14 Mar 2021 08:22:29 +0300 Subject: [PATCH 341/463] Amber recipes fix --- src/main/java/ru/betterend/recipe/CraftingRecipes.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index 9a41e21a..c4cd844c 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -90,7 +90,8 @@ public class CraftingRecipes { registerLantern("blackstone_lantern", EndBlocks.BLACKSTONE_LANTERN, Blocks.BLACKSTONE_SLAB); GridRecipe.make("amber_gem", EndItems.AMBER_GEM).setShape("##", "##").addMaterial('#', EndItems.RAW_AMBER).build(); - GridRecipe.make("amber_block", EndBlocks.AMBER_BLOCK).setShape("###", "###", "###").addMaterial('#', EndItems.AMBER_GEM).build(); + GridRecipe.make("amber_block", EndBlocks.AMBER_BLOCK).setShape("##", "##").addMaterial('#', EndItems.AMBER_GEM).build(); + GridRecipe.make("amber_gem_block", EndItems.AMBER_GEM).setOutputCount(4).setList("#").addMaterial('#', EndBlocks.AMBER_BLOCK).build(); GridRecipe.make("iron_bulb_lantern", EndBlocks.IRON_BULB_LANTERN).setShape("C", "I", "#").addMaterial('C', Items.CHAIN).addMaterial('I', Items.IRON_INGOT).addMaterial('#', EndItems.GLOWING_BULB).build(); GridRecipe.make("twisted_moss_dye", Items.PINK_DYE).setList("#").addMaterial('#', EndBlocks.TWISTED_MOSS).build(); GridRecipe.make("byshy_grass_dye", Items.MAGENTA_DYE).setList("#").addMaterial('#', EndBlocks.BUSHY_GRASS).build(); From 5b3c8892634fa39bbab96b9e953c235f388f50ef Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 14 Mar 2021 22:07:29 +0300 Subject: [PATCH 342/463] Filalux textures & models --- .../ru/betterend/blocks/basis/FurBlock.java | 2 +- .../java/ru/betterend/registry/EndBlocks.java | 1 + .../betterend/registry/FilaluxWingsBlock.java | 47 +++++++++ .../betterend/blockstates/filalux_wings.json | 10 ++ .../betterend/models/block/filalux_wings.json | 42 ++++++++ .../models/block/filalux_wings_bottom.json | 97 ++++++++++++++++++ .../models/block/filalux_wings_top.json | 77 ++++++++++++++ .../betterend/models/item/filalux_wings.json | 6 ++ .../textures/block/filalux_lantern.png | Bin 263 -> 526 bytes .../textures/block/filalux_wings.png | Bin 0 -> 234 bytes .../textures/block/filalux_wings_large.png | Bin 0 -> 242 bytes .../textures/block/filalux_wings_top.png | Bin 0 -> 462 bytes .../block/filalux_wings_top_bottom.png | Bin 0 -> 214 bytes .../textures/block/filalux_wings_top_side.png | Bin 0 -> 291 bytes .../textures/item/filalux_wings.aseprite | Bin 0 -> 701 bytes 15 files changed, 281 insertions(+), 1 deletion(-) create mode 100644 src/main/java/ru/betterend/registry/FilaluxWingsBlock.java create mode 100644 src/main/resources/assets/betterend/blockstates/filalux_wings.json create mode 100644 src/main/resources/assets/betterend/models/block/filalux_wings.json create mode 100644 src/main/resources/assets/betterend/models/block/filalux_wings_bottom.json create mode 100644 src/main/resources/assets/betterend/models/block/filalux_wings_top.json create mode 100644 src/main/resources/assets/betterend/models/item/filalux_wings.json create mode 100644 src/main/resources/assets/betterend/textures/block/filalux_wings.png create mode 100644 src/main/resources/assets/betterend/textures/block/filalux_wings_large.png create mode 100644 src/main/resources/assets/betterend/textures/block/filalux_wings_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/filalux_wings_top_bottom.png create mode 100644 src/main/resources/assets/betterend/textures/block/filalux_wings_top_side.png create mode 100644 src/main/resources/assets/betterend/textures/item/filalux_wings.aseprite diff --git a/src/main/java/ru/betterend/blocks/basis/FurBlock.java b/src/main/java/ru/betterend/blocks/basis/FurBlock.java index 4ccd3462..5c83224f 100644 --- a/src/main/java/ru/betterend/blocks/basis/FurBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/FurBlock.java @@ -64,7 +64,7 @@ public class FurBlock extends AttachedBlock implements IRenderTypeable { if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) || EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Lists.newArrayList(new ItemStack(this)); } - else if (MHelper.RANDOM.nextInt(dropChance) == 0) { + else if (dropChance < 1 || MHelper.RANDOM.nextInt(dropChance) == 0) { return Lists.newArrayList(new ItemStack(drop)); } else { diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index b0a4cc23..37c254c3 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -337,6 +337,7 @@ public class EndBlocks { public static final Block JUNGLE_VINE = registerBlock("jungle_vine", new VineBlock()); public static final Block RUBINEA = registerBlock("rubinea", new VineBlock()); public static final Block FILALUX = registerBlock("filalux", new FilaluxBlock()); + public static final Block FILALUX_WINGS = registerBlock("filalux_wings", new FilaluxWingsBlock()); public static final Block FILALUX_LANTERN = registerBlock("filalux_lantern", new FilaluxLanternBlock()); // Mob-Related diff --git a/src/main/java/ru/betterend/registry/FilaluxWingsBlock.java b/src/main/java/ru/betterend/registry/FilaluxWingsBlock.java new file mode 100644 index 00000000..6ec82a17 --- /dev/null +++ b/src/main/java/ru/betterend/registry/FilaluxWingsBlock.java @@ -0,0 +1,47 @@ +package ru.betterend.registry; + +import java.util.EnumMap; + +import com.google.common.collect.Maps; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.block.BlockState; +import net.minecraft.block.Material; +import net.minecraft.block.ShapeContext; +import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.BlockView; +import ru.betterend.blocks.basis.AttachedBlock; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; + +public class FilaluxWingsBlock extends AttachedBlock implements IRenderTypeable { + private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); + + public FilaluxWingsBlock() { + super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).sounds(BlockSoundGroup.WET_GRASS).noCollision()); + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + return BOUNDING_SHAPES.get(state.get(FACING)); + } + + static { + BOUNDING_SHAPES.put(Direction.UP, VoxelShapes.cuboid(0.0, 0.0, 0.0, 1.0, 0.5, 1.0)); + BOUNDING_SHAPES.put(Direction.DOWN, VoxelShapes.cuboid(0.0, 0.5, 0.0, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.NORTH, VoxelShapes.cuboid(0.0, 0.0, 0.5, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.SOUTH, VoxelShapes.cuboid(0.0, 0.0, 0.0, 1.0, 1.0, 0.5)); + BOUNDING_SHAPES.put(Direction.WEST, VoxelShapes.cuboid(0.5, 0.0, 0.0, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.EAST, VoxelShapes.cuboid(0.0, 0.0, 0.0, 0.5, 1.0, 1.0)); + } +} diff --git a/src/main/resources/assets/betterend/blockstates/filalux_wings.json b/src/main/resources/assets/betterend/blockstates/filalux_wings.json new file mode 100644 index 00000000..06920a33 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/filalux_wings.json @@ -0,0 +1,10 @@ +{ + "variants": { + "facing=north": { "model": "betterend:block/filalux_wings", "y": 180 }, + "facing=south": { "model": "betterend:block/filalux_wings" }, + "facing=east": { "model": "betterend:block/filalux_wings", "y": 270 }, + "facing=west": { "model": "betterend:block/filalux_wings", "y": 90 }, + "facing=up": { "model": "betterend:block/filalux_wings_top" }, + "facing=down": { "model": "betterend:block/filalux_wings_bottom", "x": 180 } + } +} diff --git a/src/main/resources/assets/betterend/models/block/filalux_wings.json b/src/main/resources/assets/betterend/models/block/filalux_wings.json new file mode 100644 index 00000000..3eedc4e4 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/filalux_wings.json @@ -0,0 +1,42 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/filalux_wings", + "texture": "betterend:block/filalux_wings", + "large": "betterend:block/filalux_wings_large" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 0, 8, 0 ], + "to": [ 16, 8.001, 8 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, 6, 0 ], + "to": [ 16, 6.001, 8 ], + "rotation": { "origin": [ 0, 6, 0 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 8 ], "texture": "#texture" }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, 10, 0 ], + "to": [ 16, 10.001, 16 ], + "rotation": { "origin": [ 0, 10, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#large" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#large" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/filalux_wings_bottom.json b/src/main/resources/assets/betterend/models/block/filalux_wings_bottom.json new file mode 100644 index 00000000..9d2b6fb3 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/filalux_wings_bottom.json @@ -0,0 +1,97 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/filalux_wings", + "texture": "betterend:block/filalux_wings" + }, + "elements": [ + { + "__comment": "PlaneY2", + "from": [ 9, 0, 0 ], + "to": [ 17, 0.001, 16 ], + "rotation": { "origin": [ 9, 0, 0 ], "axis": "z", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture", "rotation": 270 }, + "up": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture", "rotation": 270 } + } + }, + { + "__comment": "PlaneY2", + "from": [ 13, 0, 0 ], + "to": [ 21, 0.001, 16 ], + "rotation": { "origin": [ 13, 0, 0 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "rotation": 270 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "rotation": 270 } + } + }, + { + "__comment": "PlaneY2", + "from": [ -1, -0.001, 0 ], + "to": [ 7, 0, 16 ], + "rotation": { "origin": [ 7, 0, 0 ], "axis": "z", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY2", + "from": [ -5, -0.001, 0 ], + "to": [ 3, 0, 16 ], + "rotation": { "origin": [ 3, 0, 0 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY5", + "from": [ 0, 0, 9 ], + "to": [ 16, 0.001, 17 ], + "rotation": { "origin": [ 0, 0, 9 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY5", + "from": [ 0, 0, 13 ], + "to": [ 16, 0.001, 21 ], + "rotation": { "origin": [ 0, 0, 13 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 8 ], "texture": "#texture" }, + "up": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY5", + "from": [ 0, -0.001, -1 ], + "to": [ 16, 0, 7 ], + "rotation": { "origin": [ 0, 0, 7 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 8 ], "texture": "#texture" }, + "up": { "uv": [ 0, 8, 16, 0 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY5", + "from": [ 0, -0.001, -5 ], + "to": [ 16, 0, 3 ], + "rotation": { "origin": [ 0, 0, 3 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 8, 16, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 16, 16, 8 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/filalux_wings_top.json b/src/main/resources/assets/betterend/models/block/filalux_wings_top.json new file mode 100644 index 00000000..829f573a --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/filalux_wings_top.json @@ -0,0 +1,77 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/filalux_wings_large", + "texture": "betterend:block/filalux_wings_large", + "top": "betterend:block/filalux_wings_top", + "side": "betterend:block/filalux_wings_top_side" + }, + "elements": [ + { + "__comment": "PlaneY9", + "from": [ -8, 0.125, -8 ], + "to": [ 24, 0.126, 24 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" } + } + }, + { + "__comment": "PlaneY10", + "from": [ 10, 0, 0 ], + "to": [ 26, 0.001, 16 ], + "rotation": { "origin": [ 10, 0, 0 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 270 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 270 } + } + }, + { + "__comment": "PlaneY10", + "from": [ -10, -0.001, 0 ], + "to": [ 6, 0, 16 ], + "rotation": { "origin": [ 6, 0, 0 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "PlaneY12", + "from": [ 0, 0, 10 ], + "to": [ 16, 0.001, 26 ], + "rotation": { "origin": [ 0, 0, 10 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY12", + "from": [ 0, -0.001, -10 ], + "to": [ 16, 0, 6 ], + "rotation": { "origin": [ 0, 0, 6 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" } + } + }, + { + "__comment": "Box14", + "from": [ -0.5, -16, -0.5 ], + "to": [ 16.5, 0, 16.5 ], + "shade": false, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/filalux_wings.json b/src/main/resources/assets/betterend/models/item/filalux_wings.json new file mode 100644 index 00000000..a0fa8b85 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/filalux_wings.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/filalux_wings" + } +} diff --git a/src/main/resources/assets/betterend/textures/block/filalux_lantern.png b/src/main/resources/assets/betterend/textures/block/filalux_lantern.png index 824b97f5aa0033e83684a4c700628c1dff0f790d..6382a934d1491d21483e210b2d0dd1abe113e4b6 100644 GIT binary patch delta 511 zcmVn)jt%a;WT+cOWMa>y-T&@yv2GgWD zUoa;c#LdkjHo1yr<`(GnC6k$X^WK~Pz5l(v5A`<>07^#yNPpql^HY+xaRBP)m&_IX z`d9-XCtLvXQm|BdCqOkEF<0=T{TfH>DiPfevP18wm}`GBaRObh_fD@p10xPsD(9L6-u1;5`C-|zzl#4 zz*1?P`$yw#XA{uu28|5>@a5~xj`LIdus;S8>TM0S>H1%gG`$(q5PrM30W}SGTbhj% zAfYjn&SyLC^fK=|wMt)x{V{ndIPJaPNykwOzJ0!8sdzMgyJ+8R5re^$YB)+5Sv&0C zUbBCDZILaNrW%e22Gd8>QnTY62i6`)X2Dd{NP4u>y7b-X{sOq5<}?I*@znqT002ovPDHLkV1n#? B>ka?_ delta 246 zcmeBUX=j=sSHU)zrFVT+sp7tyIarx-~8Zz$Vta_K-GLDL4Lsu|B*qs*KHA?OrfWX zV~E7m-2Om5W)bheZir^K(r)+dIqOw-evJ m{@%li!b6&N)_*m{_Whc`I{W_C^4UP!89ZJ6T-G@yGywn<)^OMW diff --git a/src/main/resources/assets/betterend/textures/block/filalux_wings.png b/src/main/resources/assets/betterend/textures/block/filalux_wings.png new file mode 100644 index 0000000000000000000000000000000000000000..580e1ab275d4bdc4dce7c8023308e77f1beb9570 GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~#Q>iWS0J6R z>Tc`V|2v-ipK4^X%+_I>r_X_i`28^%r!z}#mN&LUdW!%RahC-71vC7IgW9s%t029e zE{-7*Q>XSi3LQ4!VRF?`dGgA9Jl4?1woqttPy+AW?b26Z*7>O*$4o3VNw30t`8i0^~y-RAQazyHKoC(NXz T87co0XcvR0tDnm{r-UW|wLw`) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/filalux_wings_large.png b/src/main/resources/assets/betterend/textures/block/filalux_wings_large.png new file mode 100644 index 0000000000000000000000000000000000000000..98489441a58109d6425b555446d2f2088abf6da7 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~xd5LKS0Fvr z$YhzV!!}Q!0}=73GfQrkHzusQ+j{o@jwk;UBUgU_s^BUK@(X784+C|bB4I$$98VX= z5Q(Wv{T%sN3^_J6Z2kBDaP!%e&EF3mVR123(sEtHs-@jCIbz-IPZ2L>b{}3T=Ux0m zV~n|;`mgB?Nh@h&ORbj{NhNVdXeA4M^jjGv%jsJb9?HyoVPRY&$t}xwf|=A fqt>nV-z53#C722(-SAcc+RNbS>gTe~DWM4fxA9^! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/filalux_wings_top.png b/src/main/resources/assets/betterend/textures/block/filalux_wings_top.png new file mode 100644 index 0000000000000000000000000000000000000000..0ba4a1ab7e54bb6c6ca3cdd0c381b1c30464e3f8 GIT binary patch literal 462 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|6a#!hT!D1L zs=KXc|L=J6f2xtmGFyjjo<0X6;`hg7oX#w{S>D(Z=`8|O#9b2P7tHV<4rtlDeYv^B7sJW|n#yQ1Re`3Mzhr!Jmtt%rM6cz0wR-6x6 zE%ff$37^o<+k;+lPhXSPxODL@FO8Q+E-*Q5zL{8+Vxr7zR_c&Z!Pyaz(_%YG+gl^b zpRI-E{|vK#5_$4ve5#rH#mie9*g}I|uTs3F8W6JDFm>^y8<}%h6~8et6?xeGIFl4n zb9Sk@({;y*78=Vm_jbADC<%s7yu9q>mSdGZvu<#%+vRDuUdE7>bmdLO)qBM-eu2o`D4b6>uEc?mOVctr)z$BL1rYg z+1G?9t*6^wzMS`)f7^XIzWctl)fUxf^>5nGlehoFW1W5Vz!hLHGkCiCxvXw4a-g*?_}|^OENT2$~Kj@~xmTTX(;&&2awH;-FO{%4#a$S4%SZ)O9ulfl!~&t;uc GLK6Uct4B`& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/filalux_wings_top_side.png b/src/main/resources/assets/betterend/textures/block/filalux_wings_top_side.png new file mode 100644 index 0000000000000000000000000000000000000000..e42dbde743fa1ddb2b14b1ba23990bdd1bfa480f GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~tpJ}8S0J75 zZCf4c))DWYu+5bD9{GV!Mvdq?Do2So#i1__68K*N#Zk9Lh)taIURLxfs1<&7pMs|Nh+zvU?^?TgdQ6Fm2ac7dGZiMxTEK zZa)#j)Mw;VySlQ?*yYY%4qZhj78RW`v-P!$ycnVn?#a+eo5dX9&zcePFiJk6C2-m` zmg|uoyGz4ckNs-h%l+=!O1?8Uzf^=Bzp%J|$9?zvtW_<)a%SCQGM_fDFMj>yL$SL~ Z^G~*Cof!I_{{+xs44$rjF6*2Ung9a=b}Ik? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/filalux_wings.aseprite b/src/main/resources/assets/betterend/textures/item/filalux_wings.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..ecf307bf919b3576d354f9abfea3127029a7674d GIT binary patch literal 701 zcmb`E-%FEG7{{M&jR^~@8#7_;5F@$>IxaCJhZcB~1H+4jbkW9a;u!vTSyB@!Ec#&= zdJ(9tAn1n|X%`U%#=?lgFfT?#tiTcs3PLc;s70sGR-u1D&&&Dnyw8F2{hasB*hSvm zu*rHJB{mUhWvvvm!mzl%GW~yDfczhe&SI*QW6M}BRg7E}@|u2=Qhz7jRXfGjh-^_+ zuwh#*jMY@afzWRFwtFkgU5&wo$CqIKb2S`!zaPdQYPjoS2W)KL0h=3r&|g~v>*|tF zhx_2cjyV`j8+d4D9!|gc2@NHZ9={JyA3qD*<8jy$YKA>~`{9`14|4~i@Kx^w92nXM z`#ZIXbAdI5@2+UL1UEn*cf_$q8DC^EMH5E^u|o|nq%cCK;9?9GD3DJ$$;6ULAZbK- z3rWfW{}l@2l3?W6VM|rs<;AH46^9sp%AYC~w;a734c9xz+l+C|d74!D)3! Date: Tue, 16 Mar 2021 05:52:24 +0300 Subject: [PATCH 343/463] Lantern woods biome prototype --- .../java/ru/betterend/registry/EndBiomes.java | 2 + .../java/ru/betterend/registry/EndBlocks.java | 1 + .../ru/betterend/registry/EndFeatures.java | 6 + .../world/biome/land/LanternWoodsBiome.java | 27 +++ .../world/features/FilaluxFeature.java | 39 ++++ .../world/features/SkyScatterFeature.java | 54 +++++ .../features/trees/DragonTreeFeature.java | 12 +- .../world/features/trees/LucerniaFeature.java | 219 ++++++++++++++++++ .../world/features/trees/TenaneaFeature.java | 2 +- .../blockstates/lucernia_leaves.json | 10 + .../blockstates/lucernia_outer_leaves.json | 56 +++++ .../materialmaps/block/lucernia_leaves.json | 2 +- .../block/lucernia_outer_leaves.json | 3 + .../models/block/lucernia_leaves_1.json | 6 + .../models/block/lucernia_leaves_2.json | 6 + .../models/block/lucernia_leaves_3.json | 6 + .../models/block/lucernia_leaves_4.json | 6 + .../models/block/lucernia_outer_leaves_1.json | 97 ++++++++ .../models/block/lucernia_outer_leaves_2.json | 64 +++++ .../models/block/lucernia_outer_leaves_3.json | 64 +++++ .../models/block/lucernia_outer_leaves_4.json | 97 ++++++++ .../models/block/lucernia_outer_leaves_5.json | 64 +++++ .../models/block/lucernia_outer_leaves_6.json | 64 +++++ .../models/block/lucernia_outer_leaves_7.json | 97 ++++++++ .../models/block/lucernia_outer_leaves_8.json | 64 +++++ .../models/block/lucernia_outer_leaves_9.json | 64 +++++ .../block/lucernia_outer_leaves_up_1.json | 120 ++++++++++ .../block/lucernia_outer_leaves_up_2.json | 120 ++++++++++ .../models/item/lucernia_leaves.json | 3 + .../models/item/lucernia_outer_leaves.json | 6 + .../textures/block/lucernia_leaves.png | Bin 258 -> 0 bytes .../textures/block/lucernia_leaves_1.png | Bin 0 -> 241 bytes .../textures/block/lucernia_leaves_2.png | Bin 0 -> 257 bytes .../textures/block/lucernia_leaves_3.png | Bin 0 -> 257 bytes .../textures/block/lucernia_leaves_4.png | Bin 0 -> 284 bytes .../textures/block/lucernia_log_side.png | Bin 265 -> 258 bytes .../block/lucernia_outer_leaves_1.png | Bin 0 -> 195 bytes .../block/lucernia_outer_leaves_2.png | Bin 0 -> 212 bytes .../block/lucernia_outer_leaves_3.png | Bin 0 -> 213 bytes 39 files changed, 1374 insertions(+), 7 deletions(-) create mode 100644 src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java create mode 100644 src/main/java/ru/betterend/world/features/FilaluxFeature.java create mode 100644 src/main/java/ru/betterend/world/features/SkyScatterFeature.java create mode 100644 src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java create mode 100644 src/main/resources/assets/betterend/blockstates/lucernia_leaves.json create mode 100644 src/main/resources/assets/betterend/blockstates/lucernia_outer_leaves.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/lucernia_outer_leaves.json create mode 100644 src/main/resources/assets/betterend/models/block/lucernia_leaves_1.json create mode 100644 src/main/resources/assets/betterend/models/block/lucernia_leaves_2.json create mode 100644 src/main/resources/assets/betterend/models/block/lucernia_leaves_3.json create mode 100644 src/main/resources/assets/betterend/models/block/lucernia_leaves_4.json create mode 100644 src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_1.json create mode 100644 src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_2.json create mode 100644 src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_3.json create mode 100644 src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_4.json create mode 100644 src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_5.json create mode 100644 src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_6.json create mode 100644 src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_7.json create mode 100644 src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_8.json create mode 100644 src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_9.json create mode 100644 src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_up_1.json create mode 100644 src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_up_2.json create mode 100644 src/main/resources/assets/betterend/models/item/lucernia_leaves.json create mode 100644 src/main/resources/assets/betterend/models/item/lucernia_outer_leaves.json delete mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_leaves.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_leaves_1.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_leaves_2.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_leaves_3.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_leaves_4.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_1.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_2.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_3.png diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index 328d2dfc..04f177d8 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -48,6 +48,7 @@ import ru.betterend.world.biome.land.DustWastelandsBiome; import ru.betterend.world.biome.land.EndBiome; import ru.betterend.world.biome.land.FoggyMushroomlandBiome; import ru.betterend.world.biome.land.GlowingGrasslandsBiome; +import ru.betterend.world.biome.land.LanternWoodsBiome; import ru.betterend.world.biome.land.MegalakeBiome; import ru.betterend.world.biome.land.MegalakeGroveBiome; import ru.betterend.world.biome.land.PaintedMountainsBiome; @@ -97,6 +98,7 @@ public class EndBiomes { public static final EndBiome GLOWING_GRASSLANDS = registerBiome(new GlowingGrasslandsBiome(), BiomeType.LAND); public static final EndBiome DRAGON_GRAVEYARDS = registerBiome(new DragonGraveyardsBiome(), BiomeType.LAND); public static final EndBiome DRY_SHRUBLAND = registerBiome(new DryShrublandBiome(), BiomeType.LAND); + public static final EndBiome LANTERN_WOODS = registerBiome(new LanternWoodsBiome(), BiomeType.LAND); // Better End Void public static final EndBiome ICE_STARFIELD = registerBiome(new BiomeIceStarfield(), BiomeType.VOID); diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 37c254c3..c310d53e 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -236,6 +236,7 @@ public class EndBlocks { public static final Block LUCERNIA_SAPLING = registerBlock("lucernia_sapling", new TenaneaSaplingBlock()); public static final Block LUCERNIA_LEAVES = registerBlock("lucernia_leaves", new EndLeavesBlock(LUCERNIA_SAPLING, MaterialColor.ORANGE)); + public static final Block LUCERNIA_OUTER_LEAVES = registerBlock("lucernia_outer_leaves", new FurBlock(LUCERNIA_SAPLING, 32)); public static final WoodenMaterial LUCERNIA = new WoodenMaterial("lucernia", MaterialColor.ORANGE, MaterialColor.ORANGE); // Small Plants // diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index e5d18f4f..6a443abd 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -22,6 +22,7 @@ import ru.betterend.world.features.EndFeature; import ru.betterend.world.features.EndLilyFeature; import ru.betterend.world.features.EndLotusFeature; import ru.betterend.world.features.EndLotusLeafFeature; +import ru.betterend.world.features.FilaluxFeature; import ru.betterend.world.features.GlowPillarFeature; import ru.betterend.world.features.HydraluxFeature; import ru.betterend.world.features.LanceleafFeature; @@ -60,6 +61,7 @@ import ru.betterend.world.features.trees.GiganticAmaranitaFeature; import ru.betterend.world.features.trees.HelixTreeFeature; import ru.betterend.world.features.trees.JellyshroomFeature; import ru.betterend.world.features.trees.LacugroveFeature; +import ru.betterend.world.features.trees.LucerniaFeature; import ru.betterend.world.features.trees.MossyGlowshroomFeature; import ru.betterend.world.features.trees.PythadendronTreeFeature; import ru.betterend.world.features.trees.TenaneaFeature; @@ -77,6 +79,7 @@ public class EndFeatures { public static final EndFeature UMBRELLA_TREE = new EndFeature("umbrella_tree", new UmbrellaTreeFeature(), 4); public static final EndFeature JELLYSHROOM = new EndFeature("jellyshroom", new JellyshroomFeature(), 3); public static final EndFeature GIGANTIC_AMARANITA = new EndFeature("gigantic_amaranita", new GiganticAmaranitaFeature(), 1); + public static final EndFeature LUCERNIA = new EndFeature("lucernia", new LucerniaFeature(), 3); // Bushes // public static final EndFeature PYTHADENDRON_BUSH = new EndFeature("pythadendron_bush", new BushFeature(EndBlocks.PYTHADENDRON_LEAVES, EndBlocks.PYTHADENDRON.bark), 4); @@ -142,6 +145,9 @@ public class EndFeatures { public static final EndFeature SMALL_JELLYSHROOM_WOOD = new EndFeature("small_jellyshroom_wood", new WallPlantOnLogFeature(EndBlocks.SMALL_JELLYSHROOM, 4), 8); public static final EndFeature JUNGLE_FERN_WOOD = new EndFeature("jungle_fern_wood", new WallPlantOnLogFeature(EndBlocks.JUNGLE_FERN, 3), 12); + // Sky plants + public static final EndFeature FILALUX = new EndFeature("filalux", new FilaluxFeature(), 1); + // Water // public static final EndFeature BUBBLE_CORAL = new EndFeature("bubble_coral", new UnderwaterPlantFeature(EndBlocks.BUBBLE_CORAL, 6), 10); public static final EndFeature BUBBLE_CORAL_RARE = new EndFeature("bubble_coral_rare", new UnderwaterPlantFeature(EndBlocks.BUBBLE_CORAL, 3), 4); diff --git a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java new file mode 100644 index 00000000..594b14d4 --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java @@ -0,0 +1,27 @@ +package ru.betterend.world.biome.land; + +import net.minecraft.entity.EntityType; +import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndSounds; + +public class LanternWoodsBiome extends EndBiome { + public LanternWoodsBiome() { + super(new BiomeDefinition("lantern_woods") + .setFogColor(132, 35, 13) + .setFogDensity(1.1F) + .setWaterAndFogColor(113, 88, 53) + .setPlantsColor(237, 122, 66) + .setSurface(EndBlocks.RUTISCUS) + .setMusic(EndSounds.MUSIC_FOREST) + .addFeature(EndFeatures.LUCERNIA) + .addFeature(EndFeatures.FILALUX) + .addFeature(EndFeatures.ORANGO) + .addFeature(EndFeatures.AERIDIUM) + .addFeature(EndFeatures.LUTEBUS) + .addFeature(EndFeatures.LAMELLARIUM) + .addStructureFeature(ConfiguredStructureFeatures.END_CITY) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + } +} diff --git a/src/main/java/ru/betterend/world/features/FilaluxFeature.java b/src/main/java/ru/betterend/world/features/FilaluxFeature.java new file mode 100644 index 00000000..394f0505 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/FilaluxFeature.java @@ -0,0 +1,39 @@ +package ru.betterend.world.features; + +import java.util.Random; + +import net.minecraft.block.BlockState; +import net.minecraft.state.property.Properties; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.StructureWorldAccess; +import ru.betterend.blocks.BlockProperties; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; + +public class FilaluxFeature extends SkyScatterFeature { + public FilaluxFeature() { + super(10); + } + + @Override + public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { + BlockState vine = EndBlocks.FILALUX.getDefaultState(); + BlockState wings = EndBlocks.FILALUX_WINGS.getDefaultState(); + BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.FILALUX_LANTERN); + BlocksHelper.setWithoutUpdate(world, blockPos.up(), wings.with(Properties.FACING, Direction.UP)); + for (Direction dir: BlocksHelper.HORIZONTAL) { + BlocksHelper.setWithoutUpdate(world, blockPos.offset(dir), wings.with(Properties.FACING, dir)); + } + int length = MHelper.randRange(1, 3, random); + for (int i = 1; i <= length; i++) { + TripleShape shape = length > 1 ? TripleShape.TOP : TripleShape.BOTTOM; + if (i > 1) { + shape = i == length ? TripleShape.BOTTOM : TripleShape.MIDDLE; + } + BlocksHelper.setWithoutUpdate(world, blockPos.down(i), vine.with(BlockProperties.TRIPLE_SHAPE, shape)); + } + } +} diff --git a/src/main/java/ru/betterend/world/features/SkyScatterFeature.java b/src/main/java/ru/betterend/world/features/SkyScatterFeature.java new file mode 100644 index 00000000..97e5178a --- /dev/null +++ b/src/main/java/ru/betterend/world/features/SkyScatterFeature.java @@ -0,0 +1,54 @@ +package ru.betterend.world.features; + +import java.util.Random; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.util.math.Direction; +import net.minecraft.world.StructureWorldAccess; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; + +public abstract class SkyScatterFeature extends ScatterFeature { + public SkyScatterFeature(int radius) { + super(radius); + } + + @Override + protected int getChance() { + return 10; + } + + @Override + public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { + if (!world.isAir(blockPos)) { + return false; + } + + for (Direction dir: BlocksHelper.HORIZONTAL) { + if (!world.isAir(blockPos.offset(dir))) { + return false; + } + } + + int maxD = getYOffset() + 2; + int maxV = getYOffset() - 2; + + return BlocksHelper.upRay(world, blockPos, maxD) > maxV && BlocksHelper.downRay(world, blockPos, maxD) > maxV; + } + + @Override + protected boolean canSpawn(StructureWorldAccess world, BlockPos pos) { + return true; + } + + @Override + protected BlockPos getCenterGround(StructureWorldAccess world, BlockPos pos) { + return new BlockPos(pos.getX(), MHelper.randRange(32, 192, world.getRandom()), pos.getZ()); + } + + protected boolean getGroundPlant(StructureWorldAccess world, Mutable pos) { + pos.setY(pos.getY() + MHelper.randRange(-getYOffset(), getYOffset(), world.getRandom())); + return true; + } +} diff --git a/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java index 469c736b..ad8f0951 100644 --- a/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java @@ -227,11 +227,13 @@ public class DragonTreeFeature extends DefaultFeature { SplineHelper.offset(SIDE1, offset2); SplineHelper.offset(SIDE2, offset2); - ROOT = Lists.newArrayList(new Vector3f(0F, 1F, 0), - new Vector3f(0.1F, 0.7F, 0), - new Vector3f(0.3F, 0.3F, 0), - new Vector3f(0.7F, 0.05F, 0), - new Vector3f(0.8F, -0.2F, 0)); + ROOT = Lists.newArrayList( + new Vector3f(0F, 1F, 0), + new Vector3f(0.1F, 0.7F, 0), + new Vector3f(0.3F, 0.3F, 0), + new Vector3f(0.7F, 0.05F, 0), + new Vector3f(0.8F, -0.2F, 0) + ); SplineHelper.offset(ROOT, new Vector3f(0, -0.45F, 0)); } } diff --git a/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java b/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java new file mode 100644 index 00000000..8a452bd7 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java @@ -0,0 +1,219 @@ +package ru.betterend.world.features.trees; + +import java.util.List; +import java.util.Random; +import java.util.function.Function; + +import com.google.common.collect.Lists; + +import net.minecraft.block.BlockState; +import net.minecraft.block.LeavesBlock; +import net.minecraft.block.Material; +import net.minecraft.client.util.math.Vector3f; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.util.math.Direction; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.blocks.BlockProperties; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.blocks.basis.FurBlock; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; +import ru.betterend.util.SplineHelper; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFDisplacement; +import ru.betterend.util.sdf.operator.SDFScale; +import ru.betterend.util.sdf.operator.SDFScale3D; +import ru.betterend.util.sdf.operator.SDFSubtraction; +import ru.betterend.util.sdf.operator.SDFTranslate; +import ru.betterend.util.sdf.primitive.SDFSphere; +import ru.betterend.world.features.DefaultFeature; + +public class LucerniaFeature extends DefaultFeature { + private static final Direction[] DIRECTIONS = Direction.values(); + private static final Function REPLACE; + private static final Function IGNORE; + private static final List SPLINE; + private static final List ROOT; + + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; + + float size = MHelper.randRange(12, 20, random); + int count = (int) (size * 0.3F); + float var = MHelper.PI2 / (float) (count * 3); + float start = MHelper.randRange(0, MHelper.PI2, random); + for (int i = 0; i < count; i++) { + float angle = (float) i / (float) count * MHelper.PI2 + MHelper.randRange(0, var, random) + start; + List spline = SplineHelper.copySpline(SPLINE); + SplineHelper.rotateSpline(spline, angle); + SplineHelper.scale(spline, size * MHelper.randRange(0.5F, 1F, random)); + SplineHelper.offsetParts(spline, random, 1F, 0, 1F); + SplineHelper.fillSpline(spline, world, EndBlocks.LUCERNIA.bark.getDefaultState(), pos, REPLACE); + Vector3f last = spline.get(spline.size() - 1); + float leavesRadius = (size * 0.13F + MHelper.randRange(0.8F, 1.5F, random)) * 1.4F; + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); + leavesBall(world, pos.add(last.getX(), last.getY(), last.getZ()), leavesRadius, random, noise, config != null); + } + + makeRoots(world, pos.add(0, MHelper.randRange(3, 5, random), 0), size * 0.35F, random); + + return true; + } + + private void leavesBall(StructureWorldAccess world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise, boolean natural) { + SDF sphere = new SDFSphere().setRadius(radius).setBlock(EndBlocks.LUCERNIA_LEAVES.getDefaultState().with(LeavesBlock.DISTANCE, 6)); + SDF sub = new SDFScale().setScale(5).setSource(sphere); + sub = new SDFTranslate().setTranslate(0, -radius * 5, 0).setSource(sub); + sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sub); + sphere = new SDFScale3D().setScale(1, 0.75F, 1).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 2F; }).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> { return MHelper.randRange(-1.5F, 1.5F, random); }).setSource(sphere); + + Mutable mut = new Mutable(); + for (Direction d1: BlocksHelper.HORIZONTAL) { + BlockPos p = mut.set(pos).move(Direction.UP).move(d1).toImmutable(); + BlocksHelper.setWithoutUpdate(world, p, EndBlocks.LUCERNIA.bark.getDefaultState()); + for (Direction d2: BlocksHelper.HORIZONTAL) { + mut.set(p).move(Direction.UP).move(d2); + BlocksHelper.setWithoutUpdate(world, p, EndBlocks.LUCERNIA.bark.getDefaultState()); + } + } + + BlockState top = EndBlocks.FILALUX.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP); + BlockState middle = EndBlocks.FILALUX.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE); + BlockState bottom = EndBlocks.FILALUX.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM); + BlockState outer = EndBlocks.LUCERNIA_OUTER_LEAVES.getDefaultState(); + + List support = Lists.newArrayList(); + sphere.addPostProcess((info) -> { + if (natural && random.nextInt(6) == 0 && info.getStateDown().isAir()) { + BlockPos d = info.getPos().down(); + support.add(d); + } + if (random.nextInt(15) == 0) { + for (Direction dir: Direction.values()) { + BlockState state = info.getState(dir, 2); + if (state.isAir()) { + return info.getState(); + } + } + info.setState(EndBlocks.LUCERNIA.bark.getDefaultState()); + } + + MHelper.shuffle(DIRECTIONS, random); + for (Direction d: DIRECTIONS) { + if (info.getState(d).isAir()) { + info.setBlockPos(info.getPos().offset(d), outer.with(FurBlock.FACING, d)); + } + } + + if (EndBlocks.LUCERNIA.isTreeLog(info.getState())) { + for (int x = -6; x < 7; x++) { + int ax = Math.abs(x); + mut.setX(x + info.getPos().getX()); + for (int z = -6; z < 7; z++) { + int az = Math.abs(z); + mut.setZ(z + info.getPos().getZ()); + for (int y = -6; y < 7; y++) { + int ay = Math.abs(y); + int d = ax + ay + az; + if (d < 7) { + mut.setY(y + info.getPos().getY()); + BlockState state = info.getState(mut); + if (state.getBlock() instanceof LeavesBlock) { + int distance = state.get(LeavesBlock.DISTANCE); + if (d < distance) { + info.setState(mut, state.with(LeavesBlock.DISTANCE, d)); + } + } + } + } + } + } + } + return info.getState(); + }); + sphere.fillRecursiveIgnore(world, pos, IGNORE); + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.LUCERNIA.bark); + + support.forEach((bpos) -> { + BlockState state = world.getBlockState(bpos); + if (state.isAir() || state.isOf(EndBlocks.LUCERNIA_OUTER_LEAVES)) { + int count = MHelper.randRange(3, 8, random); + mut.set(bpos); + if (world.getBlockState(mut.up()).isOf(EndBlocks.LUCERNIA_LEAVES)) { + BlocksHelper.setWithoutUpdate(world, mut, top); + for (int i = 1; i < count; i++) { + mut.setY(mut.getY() - 1); + if (world.isAir(mut.down())) { + BlocksHelper.setWithoutUpdate(world, mut, middle); + } + else { + break; + } + } + BlocksHelper.setWithoutUpdate(world, mut, bottom); + } + } + }); + } + + private void makeRoots(StructureWorldAccess world, BlockPos pos, float radius, Random random) { + int count = (int) (radius * 1.5F); + for (int i = 0; i < count; i++) { + float angle = (float) i / (float) count * MHelper.PI2; + float scale = radius * MHelper.randRange(0.85F, 1.15F, random); + + List branch = SplineHelper.copySpline(ROOT); + SplineHelper.rotateSpline(branch, angle); + SplineHelper.scale(branch, scale); + Vector3f last = branch.get(branch.size() - 1); + if (world.getBlockState(pos.add(last.getX(), last.getY(), last.getZ())).isIn(EndTags.GEN_TERRAIN)) { + SplineHelper.fillSplineForce(branch, world, EndBlocks.LUCERNIA.bark.getDefaultState(), pos, REPLACE); + } + } + } + + static { + REPLACE = (state) -> { + if (state.isIn(EndTags.END_GROUND)) { + return true; + } + if (state.getBlock() == EndBlocks.LUCERNIA_LEAVES) { + return true; + } + if (state.getMaterial().equals(Material.PLANT)) { + return true; + } + return state.getMaterial().isReplaceable(); + }; + + IGNORE = (state) -> { + return EndBlocks.LUCERNIA.isTreeLog(state); + }; + + SPLINE = Lists.newArrayList( + new Vector3f(0.00F, 0.00F, 0.00F), + new Vector3f(0.10F, 0.35F, 0.00F), + new Vector3f(0.20F, 0.50F, 0.00F), + new Vector3f(0.30F, 0.55F, 0.00F), + new Vector3f(0.42F, 0.70F, 0.00F), + new Vector3f(0.50F, 1.00F, 0.00F) + ); + + ROOT = Lists.newArrayList( + new Vector3f(0.1F, 0.70F, 0), + new Vector3f(0.3F, 0.30F, 0), + new Vector3f(0.7F, 0.05F, 0), + new Vector3f(0.8F, -0.20F, 0) + ); + SplineHelper.offset(ROOT, new Vector3f(0, -0.45F, 0)); + } +} diff --git a/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java b/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java index 34de3b30..5fba3b10 100644 --- a/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java @@ -35,10 +35,10 @@ import ru.betterend.util.sdf.primitive.SDFSphere; import ru.betterend.world.features.DefaultFeature; public class TenaneaFeature extends DefaultFeature { + private static final Direction[] DIRECTIONS = Direction.values(); private static final Function REPLACE; private static final Function IGNORE; private static final List SPLINE; - private static final Direction[] DIRECTIONS = Direction.values(); @Override public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { diff --git a/src/main/resources/assets/betterend/blockstates/lucernia_leaves.json b/src/main/resources/assets/betterend/blockstates/lucernia_leaves.json new file mode 100644 index 00000000..677b54c1 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/lucernia_leaves.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/lucernia_leaves_1" }, + { "model": "betterend:block/lucernia_leaves_2" }, + { "model": "betterend:block/lucernia_leaves_3" }, + { "model": "betterend:block/lucernia_leaves_4" } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/lucernia_outer_leaves.json b/src/main/resources/assets/betterend/blockstates/lucernia_outer_leaves.json new file mode 100644 index 00000000..9bef26b8 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/lucernia_outer_leaves.json @@ -0,0 +1,56 @@ +{ + "variants": { + "facing=north": [ + { "model": "betterend:block/lucernia_outer_leaves_1", "y": 180 }, + { "model": "betterend:block/lucernia_outer_leaves_2", "y": 180 }, + { "model": "betterend:block/lucernia_outer_leaves_3", "y": 180 }, + { "model": "betterend:block/lucernia_outer_leaves_4", "y": 180 }, + { "model": "betterend:block/lucernia_outer_leaves_5", "y": 180 }, + { "model": "betterend:block/lucernia_outer_leaves_6", "y": 180 }, + { "model": "betterend:block/lucernia_outer_leaves_7", "y": 180 }, + { "model": "betterend:block/lucernia_outer_leaves_8", "y": 180 }, + { "model": "betterend:block/lucernia_outer_leaves_9", "y": 180 } + ], + "facing=south": [ + { "model": "betterend:block/lucernia_outer_leaves_1" }, + { "model": "betterend:block/lucernia_outer_leaves_2" }, + { "model": "betterend:block/lucernia_outer_leaves_3" }, + { "model": "betterend:block/lucernia_outer_leaves_4" }, + { "model": "betterend:block/lucernia_outer_leaves_5" }, + { "model": "betterend:block/lucernia_outer_leaves_6" }, + { "model": "betterend:block/lucernia_outer_leaves_7" }, + { "model": "betterend:block/lucernia_outer_leaves_8" }, + { "model": "betterend:block/lucernia_outer_leaves_9" } + ], + "facing=east": [ + { "model": "betterend:block/lucernia_outer_leaves_1", "y": 270 }, + { "model": "betterend:block/lucernia_outer_leaves_2", "y": 270 }, + { "model": "betterend:block/lucernia_outer_leaves_3", "y": 270 }, + { "model": "betterend:block/lucernia_outer_leaves_4", "y": 270 }, + { "model": "betterend:block/lucernia_outer_leaves_5", "y": 270 }, + { "model": "betterend:block/lucernia_outer_leaves_6", "y": 270 }, + { "model": "betterend:block/lucernia_outer_leaves_7", "y": 270 }, + { "model": "betterend:block/lucernia_outer_leaves_8", "y": 270 }, + { "model": "betterend:block/lucernia_outer_leaves_9", "y": 270 } + ], + "facing=west": [ + { "model": "betterend:block/lucernia_outer_leaves_1", "y": 90 }, + { "model": "betterend:block/lucernia_outer_leaves_2", "y": 90 }, + { "model": "betterend:block/lucernia_outer_leaves_3", "y": 90 }, + { "model": "betterend:block/lucernia_outer_leaves_4", "y": 90 }, + { "model": "betterend:block/lucernia_outer_leaves_5", "y": 90 }, + { "model": "betterend:block/lucernia_outer_leaves_6", "y": 90 }, + { "model": "betterend:block/lucernia_outer_leaves_7", "y": 90 }, + { "model": "betterend:block/lucernia_outer_leaves_8", "y": 90 }, + { "model": "betterend:block/lucernia_outer_leaves_9", "y": 90 } + ], + "facing=up": [ + { "model": "betterend:block/lucernia_outer_leaves_up_1" }, + { "model": "betterend:block/lucernia_outer_leaves_up_2" } + ], + "facing=down": [ + { "model": "betterend:block/lucernia_outer_leaves_up_1", "x": 180 }, + { "model": "betterend:block/lucernia_outer_leaves_up_2", "x": 180 } + ] + } +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/lucernia_leaves.json b/src/main/resources/assets/betterend/materialmaps/block/lucernia_leaves.json index e4224176..11eeb91f 100644 --- a/src/main/resources/assets/betterend/materialmaps/block/lucernia_leaves.json +++ b/src/main/resources/assets/betterend/materialmaps/block/lucernia_leaves.json @@ -1,3 +1,3 @@ { - "defaultMaterial": "betterend:leaves" + "defaultMaterial": "betterend:leaves_noshade" } diff --git a/src/main/resources/assets/betterend/materialmaps/block/lucernia_outer_leaves.json b/src/main/resources/assets/betterend/materialmaps/block/lucernia_outer_leaves.json new file mode 100644 index 00000000..45210670 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/lucernia_outer_leaves.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_wall" +} diff --git a/src/main/resources/assets/betterend/models/block/lucernia_leaves_1.json b/src/main/resources/assets/betterend/models/block/lucernia_leaves_1.json new file mode 100644 index 00000000..ae34d194 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_leaves_1.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cube_noshade", + "textures": { + "texture": "betterend:block/lucernia_leaves_1" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lucernia_leaves_2.json b/src/main/resources/assets/betterend/models/block/lucernia_leaves_2.json new file mode 100644 index 00000000..db14b6cc --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_leaves_2.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cube_noshade", + "textures": { + "texture": "betterend:block/lucernia_leaves_2" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lucernia_leaves_3.json b/src/main/resources/assets/betterend/models/block/lucernia_leaves_3.json new file mode 100644 index 00000000..b0add050 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_leaves_3.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cube_noshade", + "textures": { + "texture": "betterend:block/lucernia_leaves_3" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lucernia_leaves_4.json b/src/main/resources/assets/betterend/models/block/lucernia_leaves_4.json new file mode 100644 index 00000000..6d38ed9a --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_leaves_4.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cube_noshade", + "textures": { + "texture": "betterend:block/lucernia_leaves_4" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_1.json b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_1.json new file mode 100644 index 00000000..28312355 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_1.json @@ -0,0 +1,97 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/lucernia_outer_leaves_1", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 3, 15, 0 ], + "to": [ 19, 15.001, 16 ], + "rotation": { "origin": [ 3, 15, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, 11, 0 ], + "to": [ 17, 11.001, 16 ], + "rotation": { "origin": [ 1, 11, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, -10, 0 ], + "to": [ 17, 6, 0.001 ], + "rotation": { "origin": [ 1, 6, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -3, 13.5, 0 ], + "to": [ 13, 13.501, 16 ], + "rotation": { "origin": [ -3, 13.5, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, 1, 0 ], + "to": [ 17, 1.001, 16 ], + "rotation": { "origin": [ 1, 1, 0 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -1, -9, 0 ], + "to": [ 15, 7, 0.001 ], + "rotation": { "origin": [ -1, 7, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -1.5, 16, 0 ], + "to": [ 14.5, 16.001, 16 ], + "rotation": { "origin": [ -1.5, 16, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -2, 0.5, 0 ], + "to": [ 14, 0.501, 16 ], + "rotation": { "origin": [ -2, 0.5, 0 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_2.json b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_2.json new file mode 100644 index 00000000..593da44e --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_2.json @@ -0,0 +1,64 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/lucernia_outer_leaves_1", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 3, 15, 0 ], + "to": [ 19, 15.001, 16 ], + "rotation": { "origin": [ 3, 15, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -15, 0 ], + "to": [ 16, 1, 0.001 ], + "rotation": { "origin": [ 0, 1, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -2, -12, 0 ], + "to": [ 14, 4, 0.001 ], + "rotation": { "origin": [ -2, 4, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -9, 0 ], + "to": [ 16, 7, 0.001 ], + "rotation": { "origin": [ 0, 7, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -3, 0 ], + "to": [ 16, 13, 0.001 ], + "rotation": { "origin": [ 0, 13, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_3.json b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_3.json new file mode 100644 index 00000000..30b89392 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_3.json @@ -0,0 +1,64 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/lucernia_outer_leaves_1", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ -1, 0, 0 ], + "to": [ 15, 16, 0.001 ], + "rotation": { "origin": [ -1, 16, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 2, -3, 0 ], + "to": [ 18, 13, 0.001 ], + "rotation": { "origin": [ 2, 13, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -8, 0 ], + "to": [ 16, 8, 0.001 ], + "rotation": { "origin": [ 0, 8, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -3, -12, 0 ], + "to": [ 13, 4, 0.001 ], + "rotation": { "origin": [ -3, 4, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 3, -15, 0 ], + "to": [ 19, 1, 0.001 ], + "rotation": { "origin": [ 3, 1, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_4.json b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_4.json new file mode 100644 index 00000000..73575478 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_4.json @@ -0,0 +1,97 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/lucernia_outer_leaves_2", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 3, 15, 0 ], + "to": [ 19, 15.001, 16 ], + "rotation": { "origin": [ 3, 15, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, 11, 0 ], + "to": [ 17, 11.001, 16 ], + "rotation": { "origin": [ 1, 11, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, -10, 0 ], + "to": [ 17, 6, 0.001 ], + "rotation": { "origin": [ 1, 6, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -3, 13.5, 0 ], + "to": [ 13, 13.501, 16 ], + "rotation": { "origin": [ -3, 13.5, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, 1, 0 ], + "to": [ 17, 1.001, 16 ], + "rotation": { "origin": [ 1, 1, 0 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -1, -9, 0 ], + "to": [ 15, 7, 0.001 ], + "rotation": { "origin": [ -1, 7, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -1.5, 16, 0 ], + "to": [ 14.5, 16.001, 16 ], + "rotation": { "origin": [ -1.5, 16, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -2, 0.5, 0 ], + "to": [ 14, 0.501, 16 ], + "rotation": { "origin": [ -2, 0.5, 0 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_5.json b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_5.json new file mode 100644 index 00000000..e3117b51 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_5.json @@ -0,0 +1,64 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/lucernia_outer_leaves_2", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 3, 15, 0 ], + "to": [ 19, 15.001, 16 ], + "rotation": { "origin": [ 3, 15, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -15, 0 ], + "to": [ 16, 1, 0.001 ], + "rotation": { "origin": [ 0, 1, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -2, -12, 0 ], + "to": [ 14, 4, 0.001 ], + "rotation": { "origin": [ -2, 4, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -9, 0 ], + "to": [ 16, 7, 0.001 ], + "rotation": { "origin": [ 0, 7, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -3, 0 ], + "to": [ 16, 13, 0.001 ], + "rotation": { "origin": [ 0, 13, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_6.json b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_6.json new file mode 100644 index 00000000..60fbeb92 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_6.json @@ -0,0 +1,64 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/lucernia_outer_leaves_2", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ -1, 0, 0 ], + "to": [ 15, 16, 0.001 ], + "rotation": { "origin": [ -1, 16, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 2, -3, 0 ], + "to": [ 18, 13, 0.001 ], + "rotation": { "origin": [ 2, 13, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -8, 0 ], + "to": [ 16, 8, 0.001 ], + "rotation": { "origin": [ 0, 8, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -3, -12, 0 ], + "to": [ 13, 4, 0.001 ], + "rotation": { "origin": [ -3, 4, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 3, -15, 0 ], + "to": [ 19, 1, 0.001 ], + "rotation": { "origin": [ 3, 1, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_7.json b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_7.json new file mode 100644 index 00000000..c4690387 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_7.json @@ -0,0 +1,97 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/lucernia_outer_leaves_3", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 3, 15, 0 ], + "to": [ 19, 15.001, 16 ], + "rotation": { "origin": [ 3, 15, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, 11, 0 ], + "to": [ 17, 11.001, 16 ], + "rotation": { "origin": [ 1, 11, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, -10, 0 ], + "to": [ 17, 6, 0.001 ], + "rotation": { "origin": [ 1, 6, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -3, 13.5, 0 ], + "to": [ 13, 13.501, 16 ], + "rotation": { "origin": [ -3, 13.5, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, 1, 0 ], + "to": [ 17, 1.001, 16 ], + "rotation": { "origin": [ 1, 1, 0 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -1, -9, 0 ], + "to": [ 15, 7, 0.001 ], + "rotation": { "origin": [ -1, 7, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -1.5, 16, 0 ], + "to": [ 14.5, 16.001, 16 ], + "rotation": { "origin": [ -1.5, 16, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -2, 0.5, 0 ], + "to": [ 14, 0.501, 16 ], + "rotation": { "origin": [ -2, 0.5, 0 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_8.json b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_8.json new file mode 100644 index 00000000..f52731c9 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_8.json @@ -0,0 +1,64 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/lucernia_outer_leaves_3", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 3, 15, 0 ], + "to": [ 19, 15.001, 16 ], + "rotation": { "origin": [ 3, 15, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -15, 0 ], + "to": [ 16, 1, 0.001 ], + "rotation": { "origin": [ 0, 1, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -2, -12, 0 ], + "to": [ 14, 4, 0.001 ], + "rotation": { "origin": [ -2, 4, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -9, 0 ], + "to": [ 16, 7, 0.001 ], + "rotation": { "origin": [ 0, 7, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -3, 0 ], + "to": [ 16, 13, 0.001 ], + "rotation": { "origin": [ 0, 13, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_9.json b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_9.json new file mode 100644 index 00000000..ebe38a54 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_9.json @@ -0,0 +1,64 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/lucernia_outer_leaves_3", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ -1, 0, 0 ], + "to": [ 15, 16, 0.001 ], + "rotation": { "origin": [ -1, 16, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 2, -3, 0 ], + "to": [ 18, 13, 0.001 ], + "rotation": { "origin": [ 2, 13, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -8, 0 ], + "to": [ 16, 8, 0.001 ], + "rotation": { "origin": [ 0, 8, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -3, -12, 0 ], + "to": [ 13, 4, 0.001 ], + "rotation": { "origin": [ -3, 4, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 3, -15, 0 ], + "to": [ 19, 1, 0.001 ], + "rotation": { "origin": [ 3, 1, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_up_1.json b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_up_1.json new file mode 100644 index 00000000..3ed17feb --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_up_1.json @@ -0,0 +1,120 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/lucernia_outer_leaves_1", + "texture": "betterend:block/lucernia_outer_leaves_1", + "spore": "betterend:block/lucernia_outer_leaves_1" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 0, -0.001, -10 ], + "to": [ 16, 0, 6 ], + "rotation": { "origin": [ 0, 0, 6 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, 0, 10 ], + "to": [ 16, 0.001, 26 ], + "rotation": { "origin": [ 0, 0, 10 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY4", + "from": [ 10, -0.001, 0 ], + "to": [ 26, 0, 16 ], + "rotation": { "origin": [ 10, 0, 16 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 270 } + } + }, + { + "__comment": "PlaneY4", + "from": [ -10, 0, 2 ], + "to": [ 6, 0.001, 18 ], + "rotation": { "origin": [ 6, 0, 18 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 270 }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture", "rotation": 270 } + } + }, + { + "__comment": "PlaneX6", + "from": [ 0, 0, -6.5 ], + "to": [ 0.001, 16, 16 ], + "rotation": { "origin": [ 0, 16, 16 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX6", + "from": [ -6.5, 0, 15.999 ], + "to": [ 16, 16, 16 ], + "rotation": { "origin": [ 16, 16, 16 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -0.001, -9 ], + "to": [ 16, 0, 7 ], + "rotation": { "origin": [ 0, 0, 7 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, 0, 9 ], + "to": [ 16, 0.001, 25 ], + "rotation": { "origin": [ 0, 0, 9 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY4", + "from": [ 9, -0.001, 0 ], + "to": [ 25, 0, 16 ], + "rotation": { "origin": [ 9, 0, 16 ], "axis": "z", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 16, 16, 0, 0 ], "texture": "#texture", "rotation": 270 } + } + }, + { + "__comment": "PlaneY4", + "from": [ -9, 0, 2 ], + "to": [ 7, 0.001, 18 ], + "rotation": { "origin": [ 7, 0, 18 ], "axis": "z", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture", "rotation": 270 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 270 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_up_2.json b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_up_2.json new file mode 100644 index 00000000..83b3dbe1 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_outer_leaves_up_2.json @@ -0,0 +1,120 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/lucernia_outer_leaves_2", + "texture": "betterend:block/lucernia_outer_leaves_2", + "spore": "betterend:block/lucernia_outer_leaves_2" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 0, -0.001, -10 ], + "to": [ 16, 0, 6 ], + "rotation": { "origin": [ 0, 0, 6 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, 0, 10 ], + "to": [ 16, 0.001, 26 ], + "rotation": { "origin": [ 0, 0, 10 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY4", + "from": [ 10, -0.001, 0 ], + "to": [ 26, 0, 16 ], + "rotation": { "origin": [ 10, 0, 16 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 270 } + } + }, + { + "__comment": "PlaneY4", + "from": [ -10, 0, 2 ], + "to": [ 6, 0.001, 18 ], + "rotation": { "origin": [ 6, 0, 18 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 270 }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture", "rotation": 270 } + } + }, + { + "__comment": "PlaneX6", + "from": [ 0, 0, -6.5 ], + "to": [ 0.001, 16, 16 ], + "rotation": { "origin": [ 0, 16, 16 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX6", + "from": [ -6.5, 0, 15.999 ], + "to": [ 16, 16, 16 ], + "rotation": { "origin": [ 16, 16, 16 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -0.001, -9 ], + "to": [ 16, 0, 7 ], + "rotation": { "origin": [ 0, 0, 7 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture", "rotation": 180 }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, 0, 9 ], + "to": [ 16, 0.001, 25 ], + "rotation": { "origin": [ 0, 0, 9 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY4", + "from": [ 9, -0.001, 0 ], + "to": [ 25, 0, 16 ], + "rotation": { "origin": [ 9, 0, 16 ], "axis": "z", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 16, 16, 0, 0 ], "texture": "#texture", "rotation": 270 } + } + }, + { + "__comment": "PlaneY4", + "from": [ -9, 0, 2 ], + "to": [ 7, 0.001, 18 ], + "rotation": { "origin": [ 7, 0, 18 ], "axis": "z", "angle": -45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture", "rotation": 270 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 270 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/lucernia_leaves.json b/src/main/resources/assets/betterend/models/item/lucernia_leaves.json new file mode 100644 index 00000000..7690b3aa --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/lucernia_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/lucernia_leaves_1" +} diff --git a/src/main/resources/assets/betterend/models/item/lucernia_outer_leaves.json b/src/main/resources/assets/betterend/models/item/lucernia_outer_leaves.json new file mode 100644 index 00000000..091108b2 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/lucernia_outer_leaves.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/lucernia_outer_leaves_2" + } +} diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_leaves.png b/src/main/resources/assets/betterend/textures/block/lucernia_leaves.png deleted file mode 100644 index 4fdfc22c9ad0f86ef5763399afa498f3124ea08f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~#Q>iWS0G(& z@376&=W>A6ogA;{J@G#_b^JRxbJO~5t!Mx5IeyVWBisCoT*2iX^O9@Lp#+BNIYm6_Tai5(A?9se+;+mPc-!9B%VvGn_Qi+`8iav0{{I<@i6*WH;lS4FyKtCgK~vOo9o;)~Os3hcW5i{lp` we;lE(dT;S+<(|87+tZ(%-hJ`Rx39eR>>rpP=RQ1P19Ss}r>mdKI;Vst0RGx?U;qFB diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_1.png b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_1.png new file mode 100644 index 0000000000000000000000000000000000000000..c90c827acfbaae559e656fd83e74c83e72420177 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~i2$DvS0G(& z@376&=W>A6ogA;{J@G#_b^JRxQzne}FHnx7B*-tA;XediJr!aE6f5?0aSV}|n%ie6 zbijdwsk7A6ogA;{J@G#_b^JRxQzne}FHnx7B*-tA;XediJr!aE6l?Z$aSV}|s_O5_ z#GuHb#Q6JvKl?1dq?|+BPB4}mRFVdQ&MBb@04Z~3GXMYp literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_3.png b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_3.png new file mode 100644 index 0000000000000000000000000000000000000000..d319dab6e5239aa481bd00db1e192bf3a3fdd469 GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~i2$DvS0G(& z@376&=W>A6ogA;{J@G#_b^JRxQzne}FHnx7B*-tA;XediJr!aE6l?Z$aSV}|s@w0$ z#G=TC+r%%e~H0Uq6)exu58<^LifL z_}KpXL*cByJM^mdKI;Vst0O`bO0{{R3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_4.png b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_4.png new file mode 100644 index 0000000000000000000000000000000000000000..2a931f9767c0dbf44701ed3fbe1f0a6452e88d3d GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~#Q>iWS0G(& z@376&=W>A6ogA+N6Y8G##Q)gT@$cYFuQ_)z&;2*MdgmZe5qC+DUogXeIH)bFy$Teb zn)9%1pmecD*7MxRd-ja1c($&&% z#ks>#C+AAMd$zBC(jOD1N$*Yn|MwTqT4y@BVJ}mYjkEvL7ln(T`g}IJv^8f-F z=SA1vdbm#E{)wxJbH0dO-t=8NWNy!?<>#($Zr#eX?VZb{Sfk5_Z1yrW?t42?uIzw) YJP%8^yYC}Spz9bsUHx3vIVCg!03l3!?*IS* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_log_side.png b/src/main/resources/assets/betterend/textures/block/lucernia_log_side.png index b2f33147388326c3e50c4bc4404ae7ccba604273..50bdeba608a0c9e99f59f96330c04462eceec9ca 100644 GIT binary patch delta 217 zcmeBVYGRsTST7ym6XMFiz~H5>5U#77VWnH(VqNKF*AnP7DbjU*yn7>~%vPW@XGxG> zFvEW+FlU;51t{3y>Eak7G1av{P{>)4gIQjnVat~*^7qNN8=8X(a z2ImwUrA($4F#KwI)^laM`xU>*hOxIzjBkH_C%;0v=tW`j>{kZw^X)AzvRHO3esc`y O7zR&QKbLh*2~7ZYv|HeBe`_rV9$MmHod83Mz z%4qy}_*IA=tDhL_7JI@GhZn-@n zh@d%DqSKEi^2?NF0eI>q1DK$>6%{ltT=_ZhAL_`O?7rM6W$LTVtq9H=AY7b{3!ndr6RAFvEW^SX#gAH&Dpa)5S4FV(QtRgPaVG z9L&9)-{L>1>99v1`Y9lDY~`=B8rg9Nv}R>}XWDdek=y)Byg!~@-k^9cX4}Tx6MeTT kkGTc=oH%)-l1Ze3!8(|cYud>)ZlIwIp00i_>zopr03=UI4gdfE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_2.png b/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_2.png new file mode 100644 index 0000000000000000000000000000000000000000..d52d30d6338db4547377e78b563f9f2fb9a361c4 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~xd5LKS0KI3 z)8}%4)twx#=RNU1Hg)_vIMZv+o#-9!Gtd1$@%NwyPz6^>kY6yve;BCi6bS>0`gyuI zhDc03+jEfjfB^?{Z!XKt`iDZMYptCAIvl#g_($!vth(*#tOdWeT;-V-^Hm|GWzMfZ z9JfyGnR~TZ_RzVBjc=r^G`goT=2m$N-h0X#Y0sFpV%F>xK$96fUHx3vIVCg!0Mjf~ AW&i*H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_3.png b/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_3.png new file mode 100644 index 0000000000000000000000000000000000000000..68a3a16a20a3f03fe35a763415eb39954c7ac9d1 GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~xd5LKS0KI3 z)8}%4)twx#=RNU1Hg)_vIMZv+o#-9!Gtd1$@%NwyPz6^>kY6yve;BCi6bS>0`g^)K zhDc03+jEikfCGn<=!WNS_ZMtDt17#&F5>{Z;C{)ox8j?xy{(R2@2IqK#U;lEpKQ6e z6;4T^w!XXnnkrt+atYDD%-JOndw8Mxl$D109&Z`#Hr~vc2Q-?&)78&qol`;+02Lfl Apa1{> literal 0 HcmV?d00001 From 56a8fa0e3a6dbf00fff9004eb18eaae1bf5b77b2 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 16 Mar 2021 10:06:59 +0300 Subject: [PATCH 344/463] Lantern woods enhancements --- .../ru/betterend/registry/EndFeatures.java | 2 + .../world/biome/land/LanternWoodsBiome.java | 6 +- .../features/bushes/BushWithOuterFeature.java | 100 ++++++++++++++++++ .../features/bushes/CaveBushFeature.java | 56 ---------- .../features/bushes/CaveBushFeatureCeil.java | 59 ----------- .../betterend/blockstates/rutiscus.json | 14 +++ .../betterend/models/block/rutiscus_1.json | 12 +++ .../betterend/models/block/rutiscus_2.json | 12 +++ .../betterend/models/item/rutiscus.json | 3 + .../textures/block/filalux_bottom.png | Bin 302 -> 298 bytes .../textures/block/filalux_middle.png | Bin 227 -> 227 bytes .../textures/block/filalux_wings.png | Bin 234 -> 234 bytes .../textures/block/filalux_wings_top.png | Bin 462 -> 462 bytes .../textures/block/filalux_wings_top_side.png | Bin 291 -> 291 bytes .../textures/block/lucernia_leaves_1.png | Bin 241 -> 241 bytes .../textures/block/lucernia_leaves_2.png | Bin 257 -> 257 bytes .../textures/block/lucernia_leaves_3.png | Bin 257 -> 257 bytes .../textures/block/lucernia_leaves_4.png | Bin 284 -> 278 bytes .../block/lucernia_outer_leaves_1.png | Bin 195 -> 195 bytes .../block/lucernia_outer_leaves_2.png | Bin 212 -> 208 bytes .../block/lucernia_outer_leaves_3.png | Bin 213 -> 213 bytes .../textures/block/rutiscus_side_1.png | Bin 0 -> 300 bytes .../textures/block/rutiscus_side_2.png | Bin 0 -> 300 bytes .../textures/block/rutiscus_top_1.png | Bin 0 -> 248 bytes .../textures/block/rutiscus_top_2.png | Bin 0 -> 248 bytes 25 files changed, 147 insertions(+), 117 deletions(-) create mode 100644 src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java delete mode 100644 src/main/java/ru/betterend/world/features/bushes/CaveBushFeature.java delete mode 100644 src/main/java/ru/betterend/world/features/bushes/CaveBushFeatureCeil.java create mode 100644 src/main/resources/assets/betterend/blockstates/rutiscus.json create mode 100644 src/main/resources/assets/betterend/models/block/rutiscus_1.json create mode 100644 src/main/resources/assets/betterend/models/block/rutiscus_2.json create mode 100644 src/main/resources/assets/betterend/models/item/rutiscus.json create mode 100644 src/main/resources/assets/betterend/textures/block/rutiscus_side_1.png create mode 100644 src/main/resources/assets/betterend/textures/block/rutiscus_side_2.png create mode 100644 src/main/resources/assets/betterend/textures/block/rutiscus_top_1.png create mode 100644 src/main/resources/assets/betterend/textures/block/rutiscus_top_2.png diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 6a443abd..e128b0c5 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -36,6 +36,7 @@ import ru.betterend.world.features.VineFeature; import ru.betterend.world.features.WallPlantFeature; import ru.betterend.world.features.WallPlantOnLogFeature; import ru.betterend.world.features.bushes.BushFeature; +import ru.betterend.world.features.bushes.BushWithOuterFeature; import ru.betterend.world.features.bushes.LargeAmaranitaFeature; import ru.betterend.world.features.bushes.Lumecorn; import ru.betterend.world.features.bushes.TenaneaBushFeature; @@ -87,6 +88,7 @@ public class EndFeatures { public static final EndFeature TENANEA_BUSH = new EndFeature("tenanea_bush", new TenaneaBushFeature(), 10); public static final EndFeature LUMECORN = new EndFeature("lumecorn", new Lumecorn(), 5); public static final EndFeature LARGE_AMARANITA = new EndFeature("large_amaranita", new LargeAmaranitaFeature(), 5); + public static final EndFeature LUCERNIA_BUSH = new EndFeature("lucernia_bush", new BushWithOuterFeature(EndBlocks.LUCERNIA_LEAVES, EndBlocks.LUCERNIA_OUTER_LEAVES, EndBlocks.LUCERNIA.bark), 10); // Plants // public static final EndFeature UMBRELLA_MOSS = new EndFeature("umbrella_moss", new DoublePlantFeature(EndBlocks.UMBRELLA_MOSS, EndBlocks.UMBRELLA_MOSS_TALL, 5), 5); diff --git a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java index 594b14d4..da8dd315 100644 --- a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java @@ -4,6 +4,7 @@ import net.minecraft.entity.EntityType; import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; public class LanternWoodsBiome extends EndBiome { @@ -15,11 +16,12 @@ public class LanternWoodsBiome extends EndBiome { .setPlantsColor(237, 122, 66) .setSurface(EndBlocks.RUTISCUS) .setMusic(EndSounds.MUSIC_FOREST) + .setParticles(EndParticles.GLOWING_SPHERE, 0.0005F) + .addFeature(EndFeatures.END_LAKE_RARE) .addFeature(EndFeatures.LUCERNIA) + .addFeature(EndFeatures.LUCERNIA_BUSH) .addFeature(EndFeatures.FILALUX) - .addFeature(EndFeatures.ORANGO) .addFeature(EndFeatures.AERIDIUM) - .addFeature(EndFeatures.LUTEBUS) .addFeature(EndFeatures.LAMELLARIUM) .addStructureFeature(ConfiguredStructureFeatures.END_CITY) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); diff --git a/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java b/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java new file mode 100644 index 00000000..024fcbe3 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java @@ -0,0 +1,100 @@ +package ru.betterend.world.features.bushes; + +import java.util.Random; +import java.util.function.Function; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.LeavesBlock; +import net.minecraft.block.Material; +import net.minecraft.state.property.Properties; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFDisplacement; +import ru.betterend.util.sdf.operator.SDFScale3D; +import ru.betterend.util.sdf.operator.SDFSubtraction; +import ru.betterend.util.sdf.operator.SDFTranslate; +import ru.betterend.util.sdf.primitive.SDFSphere; +import ru.betterend.world.features.DefaultFeature; + +public class BushWithOuterFeature extends DefaultFeature { + private static final Direction[] DIRECTIONS = Direction.values(); + private static final Function REPLACE; + private final Block outer_leaves; + private final Block leaves; + private final Block stem; + + public BushWithOuterFeature(Block leaves, Block outer_leaves, Block stem) { + this.outer_leaves = outer_leaves; + this.leaves = leaves; + this.stem = stem; + } + + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND) && !world.getBlockState(pos.up()).getBlock().isIn(EndTags.END_GROUND)) return false; + + float radius = MHelper.randRange(1.8F, 3.5F, random); + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt()); + SDF sphere = new SDFSphere().setRadius(radius).setBlock(this.leaves); + sphere = new SDFScale3D().setScale(1, 0.5F, 1).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; }).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> { return MHelper.randRange(-2F, 2F, random); }).setSource(sphere); + sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); + sphere.setReplaceFunction(REPLACE); + sphere.addPostProcess((info) -> { + if (info.getState().getBlock() instanceof LeavesBlock) { + int distance = info.getPos().getManhattanDistance(pos); + if (distance < 7) { + return info.getState().with(LeavesBlock.DISTANCE, distance); + } + else { + return AIR; + } + } + return info.getState(); + }).addPostProcess((info) -> { + if (info.getState().getBlock() instanceof LeavesBlock) { + MHelper.shuffle(DIRECTIONS, random); + for (Direction dir: DIRECTIONS) { + if (info.getState(dir).isAir()) { + info.setBlockPos(info.getPos().offset(dir), outer_leaves.getDefaultState().with(Properties.FACING, dir)); + } + } + } + return info.getState(); + }); + sphere.fillRecursive(world, pos); + BlocksHelper.setWithoutUpdate(world, pos, stem); + for (Direction d: Direction.values()) { + BlockPos p = pos.offset(d); + if (world.isAir(p)) { + if (leaves instanceof LeavesBlock) { + BlocksHelper.setWithoutUpdate(world, p, leaves.getDefaultState().with(LeavesBlock.DISTANCE, 1)); + } + else { + BlocksHelper.setWithoutUpdate(world, p, leaves.getDefaultState()); + } + } + } + + return true; + } + + static { + REPLACE = (state) -> { + if (state.getMaterial().equals(Material.PLANT)) { + return true; + } + return state.getMaterial().isReplaceable(); + }; + } +} diff --git a/src/main/java/ru/betterend/world/features/bushes/CaveBushFeature.java b/src/main/java/ru/betterend/world/features/bushes/CaveBushFeature.java deleted file mode 100644 index 75ace9c2..00000000 --- a/src/main/java/ru/betterend/world/features/bushes/CaveBushFeature.java +++ /dev/null @@ -1,56 +0,0 @@ -package ru.betterend.world.features.bushes; - -import java.util.Random; -import java.util.function.Function; - -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import ru.betterend.noise.OpenSimplexNoise; -import ru.betterend.registry.EndBlocks; -import ru.betterend.util.BlocksHelper; -import ru.betterend.util.MHelper; -import ru.betterend.util.sdf.SDF; -import ru.betterend.util.sdf.operator.SDFDisplacement; -import ru.betterend.util.sdf.operator.SDFScale3D; -import ru.betterend.util.sdf.operator.SDFSubtraction; -import ru.betterend.util.sdf.operator.SDFTranslate; -import ru.betterend.util.sdf.primitive.SDFSphere; -import ru.betterend.world.features.FullHeightScatterFeature; - -public class CaveBushFeature extends FullHeightScatterFeature { - public CaveBushFeature(int radius) { - super(radius); - } - - private static final Function REPLACE; - - @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { - return world.getBlockState(blockPos.down()).isOf(EndBlocks.CAVE_MOSS); - } - - @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { - float radius = MHelper.randRange(0.8F, 2.5F, random); - OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt()); - SDF sphere = new SDFSphere().setRadius(radius).setBlock(EndBlocks.CAVE_BUSH); - sphere = new SDFScale3D().setScale(MHelper.randRange(0.8F, 1.2F, random), MHelper.randRange(0.8F, 1.2F, random), MHelper.randRange(0.8F, 1.2F, random)).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; }).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return random.nextFloat() * 3F - 1.5F; }).setSource(sphere); - sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); - sphere.setReplaceFunction(REPLACE); - sphere.fillRecursive(world, blockPos); - BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.CAVE_BUSH); - } - - static { - REPLACE = (state) -> { - if (state.getMaterial().equals(Material.PLANT)) { - return true; - } - return state.getMaterial().isReplaceable(); - }; - } -} diff --git a/src/main/java/ru/betterend/world/features/bushes/CaveBushFeatureCeil.java b/src/main/java/ru/betterend/world/features/bushes/CaveBushFeatureCeil.java deleted file mode 100644 index fac99a1b..00000000 --- a/src/main/java/ru/betterend/world/features/bushes/CaveBushFeatureCeil.java +++ /dev/null @@ -1,59 +0,0 @@ -package ru.betterend.world.features.bushes; - -import java.util.Random; -import java.util.function.Function; - -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import ru.betterend.noise.OpenSimplexNoise; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndTags; -import ru.betterend.util.BlocksHelper; -import ru.betterend.util.MHelper; -import ru.betterend.util.sdf.SDF; -import ru.betterend.util.sdf.operator.SDFDisplacement; -import ru.betterend.util.sdf.operator.SDFScale3D; -import ru.betterend.util.sdf.operator.SDFSubtraction; -import ru.betterend.util.sdf.operator.SDFTranslate; -import ru.betterend.util.sdf.primitive.SDFSphere; -import ru.betterend.world.features.InvertedScatterFeature; - -public class CaveBushFeatureCeil extends InvertedScatterFeature { - public CaveBushFeatureCeil(int radius) { - super(radius); - } - - private static final Function REPLACE; - - @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { - return world.isAir(blockPos.down()) - && world.getBlockState(blockPos.up()).isIn(EndTags.GEN_TERRAIN) - && world.getBlockState(blockPos.down(BlocksHelper.downRay(world, blockPos.down(), 64) + 2)).isIn(EndTags.GEN_TERRAIN); - } - - @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { - float radius = MHelper.randRange(1.0F, 3.2F, random); - OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt()); - SDF sphere = new SDFSphere().setRadius(radius).setBlock(EndBlocks.CAVE_BUSH); - sphere = new SDFScale3D().setScale(MHelper.randRange(0.8F, 1.2F, random), MHelper.randRange(0.8F, 1.2F, random), MHelper.randRange(0.8F, 1.2F, random)).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; }).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return random.nextFloat() * 3F - 1.5F; }).setSource(sphere); - sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); - sphere.setReplaceFunction(REPLACE); - sphere.fillRecursive(world, blockPos.down()); - BlocksHelper.setWithoutUpdate(world, blockPos.down(), EndBlocks.CAVE_BUSH); - } - - static { - REPLACE = (state) -> { - if (state.getMaterial().equals(Material.PLANT)) { - return true; - } - return state.getMaterial().isReplaceable(); - }; - } -} diff --git a/src/main/resources/assets/betterend/blockstates/rutiscus.json b/src/main/resources/assets/betterend/blockstates/rutiscus.json new file mode 100644 index 00000000..a4aac58f --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/rutiscus.json @@ -0,0 +1,14 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/rutiscus_1" }, + { "model": "betterend:block/rutiscus_1", "y": 90 }, + { "model": "betterend:block/rutiscus_1", "y": 180 }, + { "model": "betterend:block/rutiscus_1", "y": 270 }, + { "model": "betterend:block/rutiscus_2" }, + { "model": "betterend:block/rutiscus_2", "y": 90 }, + { "model": "betterend:block/rutiscus_2", "y": 180 }, + { "model": "betterend:block/rutiscus_2", "y": 270 } + ] + } +} diff --git a/src/main/resources/assets/betterend/models/block/rutiscus_1.json b/src/main/resources/assets/betterend/models/block/rutiscus_1.json new file mode 100644 index 00000000..c49ecd73 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/rutiscus_1.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "block/end_stone", + "east": "betterend:block/rutiscus_side_1", + "north": "betterend:block/rutiscus_side_1", + "particle": "betterend:block/rutiscus_side_1", + "south": "betterend:block/rutiscus_side_1", + "up": "betterend:block/rutiscus_top_1", + "west": "betterend:block/rutiscus_side_1" + } +} diff --git a/src/main/resources/assets/betterend/models/block/rutiscus_2.json b/src/main/resources/assets/betterend/models/block/rutiscus_2.json new file mode 100644 index 00000000..c649a3c2 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/rutiscus_2.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "block/end_stone", + "east": "betterend:block/rutiscus_side_2", + "north": "betterend:block/rutiscus_side_2", + "particle": "betterend:block/rutiscus_side_2", + "south": "betterend:block/rutiscus_side_2", + "up": "betterend:block/rutiscus_top_2", + "west": "betterend:block/rutiscus_side_2" + } +} diff --git a/src/main/resources/assets/betterend/models/item/rutiscus.json b/src/main/resources/assets/betterend/models/item/rutiscus.json new file mode 100644 index 00000000..3a6c5939 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/rutiscus.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/rutiscus_1" +} diff --git a/src/main/resources/assets/betterend/textures/block/filalux_bottom.png b/src/main/resources/assets/betterend/textures/block/filalux_bottom.png index 4a47f30b8e077f142e30cac46e5d1da7f269232c..2f40c5c9d6774f4be3a8c320675653a6d5fb0ca0 100644 GIT binary patch delta 236 zcmVOS*v;4>cUwu^8kPiVlrVOIH-)oLR|6Zr7~e*9EA{z zQzdl7QCf44wt4K+xUu}~p{E^Bt*11X>}SwO?OikU3~N}X#d?NOt`0iA%-+*KfXu41 mz=cJ1fg8>54kGZd@f8KbNd&VD2NIP40000FU1 delta 240 zcmVXJpcdz7Lk1!fB#g0jiUen z0C-76K~xx(b&SgrgD?mHdFZr4BMF56|J7}=5=@h2snZ?cxE5OHdLgLB=r#s!}FTx85^hp?bB v+H9#OgJ`ao#1zntl^qE+tsvBj-uTsC;gbQ8_1WWt00000NkvXXu0mjfi5^2^ delta 141 zcmV;80CNB10pkIXIUmr>mEGB~@$lM(&HuRM|A;+4wn{N-jn;&r-nFNOeKE zCfW>?Fn)Zhe^j`KHU&z=R-vlIP2hXGH=d*K@&SGm0wO6{ANc?P002ovPDHLkV1iAd BLQVhx diff --git a/src/main/resources/assets/betterend/textures/block/filalux_wings_top.png b/src/main/resources/assets/betterend/textures/block/filalux_wings_top.png index 0ba4a1ab7e54bb6c6ca3cdd0c381b1c30464e3f8..8f0cbfd5f4f8d5ce1829da22f2eb7e992c608852 100644 GIT binary patch delta 42 zcmV+_0M-A_1I`1GJRfts?uE_&gextbH#)9CK)y~($yQO+Yhd7laNgm&lCfKJ0knG* A*#H0l delta 42 zcmV+_0M-A_1I`1GJRgP4|G4D;l`=G@JwUceOu$%Qzg%d`X>{3lfrMF06tP=#0mNh! A5&!@I diff --git a/src/main/resources/assets/betterend/textures/block/filalux_wings_top_side.png b/src/main/resources/assets/betterend/textures/block/filalux_wings_top_side.png index e42dbde743fa1ddb2b14b1ba23990bdd1bfa480f..0755a838706e3afcb6eeb63417de5f1cd625e6ab 100644 GIT binary patch delta 41 zcmV+^0M`Gb0;2+uMIUp#?uE_&gextbH#)9CK)y~($yQO+Yhd7laOaX_tC3{CkUSJR delta 41 zcmV+^0M`Gb0;2+uMIVLD|G4D;l`=G@JwUceOu$%Qzg%d`X>{3lfxRk}EspmfrDU;++EgQxdEOJRvG(bOi9z!L{-F<^ delta 35 tcmV+;0Nnra0r3HlIT?FDK(hU-+_!{=u0XRt^1;QlBN15mf*H diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_2.png b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_2.png index 23c38e41e3c290944f5da4a7b7c940507df76062..9cd3b55ddcbaa766f14ee6ff6ad859e7acc2c32c 100644 GIT binary patch delta 35 rcmZovxs~Z&SM$pOR(ErJp7+FStbKZ6V$ga3;WG}< delta 35 rcmZoPCXDy*#Gv&62qqAR diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_3.png b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_3.png index d319dab6e5239aa481bd00db1e192bf3a3fdd469..c72847e27b9b223b91f48cf737a849064f26c529 100644 GIT binary patch delta 35 rcmZovxs~Z&SM$pOR(ErJp7+FStbKZ6V$ga3;WG}< delta 35 rcmZoPCXDy*#Gv&62qqAR diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_4.png b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_4.png index 2a931f9767c0dbf44701ed3fbe1f0a6452e88d3d..fcc3867acdfb2e97176c1a82bfa1ed991c6990dd 100644 GIT binary patch delta 237 zcmbQkG>vJ3VZB^{Plzi614FTj+EgQxdEOJBzT{%&x&OaI7tPgg&ebxsLQ04v#PT>t<8 delta 243 zcmVu|__B!p!I?^&+-c7L zHr3q00000BbW%=J0RR90|NsC0|NsAec74?V005FnL_t&-l_ie>4g?_x11qgX`Tv8j z-Wn5u;0(aF$O5}jeFV#{6rj!{L$qq&Sw%T9sLsP$$(-Caiir-^D@%4Y_x&yxm(W_t=i$PAm7NljT;XdtJ>h2Uy+B@p;}8e}VD1?nM6*0MpwIj{pDw delta 32 qcmV+*0N?+^0mA{1ITp4_Ow&+0+-yqcj9>V&i2lKuh2Uy+B@u|veOb^qWV}^CZ{gl0rm!wDX zhRokK>)@o-axFa*g6GRSM$g>7xoVyB4NId5vCazYsTYkF_~vUK+P#M%@DQW_f}Zki QK%*HvUHx3vIVCg!02*LMhyVZp delta 171 zcmcb>c!hC-VZB^{Plzi61H(2?pUVMOcXGU*_r(9$)ba1&Os_e2qIbN{Joo>^--8}N z6AGO!A z>b9q|7W~?Bm1kPaSA~?8IlumJ+&Z;q?$u)1L+4Z`HolRv(&(PXm|Nv7c<(7|q&;KW UidnN)0F7qwboFyt=akR{0EqQZ;Q#;t diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_3.png b/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_3.png index 68a3a16a20a3f03fe35a763415eb39954c7ac9d1..8c15baec27b9d21cf88902bcf06e31a8c4f7fc48 100644 GIT binary patch delta 41 zcmV+^0M`H20o4JJIUkiWG^aW>y+t?EP&(agOy`VWdTE7cq|s^4{}5Rs%aK@pb667D delta 41 zcmV+^0M`H20o4JJIUlx3Ow&+0+-yqcj9>V&i2lKuN}SwVxbJDs|H%EpNRe25z||L7 diff --git a/src/main/resources/assets/betterend/textures/block/rutiscus_side_1.png b/src/main/resources/assets/betterend/textures/block/rutiscus_side_1.png new file mode 100644 index 0000000000000000000000000000000000000000..de06738acd42acb76657d5fec06b75d04c7e4a44 GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~-2k5uS0KI3 z+xdvU+m%qSCmB9ps(pX=rOch4w|PzN(S6-#k9A+YHRay3CGWm%`SxpX%d7L7fg1Qr zg8YIR{-c1Wz4Mj#1*x6B zRcFm3GF(3}3(n})e3a8U;e^(i1#@RE&kuPYe9>`cEH9S@x8AE&`<}mXyjjb6>uj$= j%ep&L*gMr9vlZF<-(u7JbUe`y=sE^ZS3j3^P6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/rutiscus_side_2.png b/src/main/resources/assets/betterend/textures/block/rutiscus_side_2.png new file mode 100644 index 0000000000000000000000000000000000000000..307f4088f84cd3485620124ad70ca8f982dc3113 GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~-2k5uS0KI3 z+xdvU+m%qSCmB9ps(pX=rOch4w|PzN(S6-#k9A+YHRay3CGWm%`SxpX%d7L7fg1Qr zg8YIR{-c1Wz4Mjy0R(f{r~f}C960a8C7K(X7B!Zog?zr z0p%VQ8<&d;)1oHtV_{BP7CF~NML zS76$$4R4OM-AFn1=+J4CeuwgVvUl$2OiFVdQ&MBb@07x~5QUCw| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/rutiscus_top_1.png b/src/main/resources/assets/betterend/textures/block/rutiscus_top_1.png new file mode 100644 index 0000000000000000000000000000000000000000..9e1cc429549465c7196809e4d2ec9f4ddb39ac6b GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(iS0KI3 z+xdvU+m%qSd#PSeGJL*N`(Emac>VOY4{Y1`5@Ax;TbNOjY&gM{}adQCToNEWY@4ZZF|z1BqTWQXGq*3Xt(otZx@7QWW)tTJ=$q}J7T<=Yq>UsaTT oxUD+*_lNgo*8cY*KkS!hzs0;KDf<5rpi3A$UHx3vIVCg!0H;M^5dZ)H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/rutiscus_top_2.png b/src/main/resources/assets/betterend/textures/block/rutiscus_top_2.png new file mode 100644 index 0000000000000000000000000000000000000000..fe9a86c51bdabf9fdc1ccfd2e7e18013c8f4d1f8 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(iS0KI3 z+xdvU+m%qSCmB9ps(pX=rRaK=xB(^DOM?7@8UBO8()wk;fkJhjE{-7*Q&s&L`4|*A zf&~8kf6|DDr)WNniMabf?osUjgAZSJ9eAL8T-v3J@2tS8hsK7T zpZDxD`?~R(O+h!y6ThxYFAiMscwM+9P9&>qrL0uLrUMh|Wz2ZCO=?}8_it8jtmVJn o@3&Par+3zyzqP4MKNxTSWFK?QGjE&KK$kFhy85}Sb4q9e0H?`hJpcdz literal 0 HcmV?d00001 From dabd62d5b874212234c7b75a9dabc4cd18728a1f Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 16 Mar 2021 14:32:42 +0300 Subject: [PATCH 345/463] Lucernia textures & lang --- .../betterend/blocks/FilaluxLanternBlock.java | 4 ++- .../ru/betterend/registry/EndFeatures.java | 1 + .../world/biome/land/LanternWoodsBiome.java | 10 +++--- .../betterend/blockstates/lucernia_bark.json | 22 +++++++++++++ .../betterend/blockstates/lucernia_log.json | 22 +++++++++++++ .../assets/betterend/lang/en_us.json | 30 +++++++++++++++++- .../assets/betterend/lang/ru_ru.json | 30 +++++++++++++++++- .../betterend/models/block/lucernia_bark.json | 6 ++++ .../models/block/lucernia_bark_2.json | 6 ++++ .../models/block/lucernia_bark_3.json | 6 ++++ .../models/block/lucernia_bark_4.json | 6 ++++ .../betterend/models/block/lucernia_log.json | 12 +++++++ .../models/block/lucernia_log_2.json | 12 +++++++ .../models/block/lucernia_log_3.json | 12 +++++++ .../models/block/lucernia_log_4.json | 12 +++++++ .../textures/block/lucernia_barrel_bottom.png | Bin 0 -> 239 bytes .../textures/block/lucernia_barrel_side.png | Bin 0 -> 249 bytes .../textures/block/lucernia_barrel_top.png | Bin 0 -> 232 bytes .../block/lucernia_barrel_top_open.png | Bin 0 -> 227 bytes .../textures/block/lucernia_bookshelf.png | Bin 0 -> 392 bytes .../block/lucernia_composter_bottom.png | Bin 0 -> 216 bytes .../block/lucernia_composter_side.png | Bin 0 -> 225 bytes .../textures/block/lucernia_composter_top.png | Bin 0 -> 186 bytes .../block/lucernia_crafting_table_bottom.png | Bin 0 -> 279 bytes .../block/lucernia_crafting_table_front.png | Bin 0 -> 329 bytes .../block/lucernia_crafting_table_side.png | Bin 0 -> 319 bytes .../block/lucernia_crafting_table_top.png | Bin 0 -> 258 bytes .../textures/block/lucernia_ladder.png | Bin 0 -> 213 bytes .../textures/block/lucernia_log_side.png | Bin 258 -> 259 bytes .../textures/block/lucernia_log_side_2.png | Bin 0 -> 259 bytes .../textures/block/lucernia_log_top.png | Bin 282 -> 247 bytes .../textures/block/lucernia_planks.png | Bin 431 -> 248 bytes .../block/lucernia_stripped_log_side.png | Bin 0 -> 220 bytes .../block/lucernia_stripped_log_top.png | Bin 0 -> 253 bytes .../betterend/textures/block/rutiscus_top.png | Bin 235 -> 0 bytes .../textures/entity/chest/lucernia_chest.png | Bin 0 -> 777 bytes .../entity/chest/lucernia_chest_left.png | Bin 0 -> 684 bytes .../entity/chest/lucernia_chest_right.png | Bin 0 -> 722 bytes .../textures/entity/sign/lucernia_sign.png | Bin 0 -> 441 bytes .../betterend/textures/item/lucernia_sign.png | Bin 0 -> 212 bytes 40 files changed, 183 insertions(+), 8 deletions(-) create mode 100644 src/main/resources/assets/betterend/blockstates/lucernia_bark.json create mode 100644 src/main/resources/assets/betterend/blockstates/lucernia_log.json create mode 100644 src/main/resources/assets/betterend/models/block/lucernia_bark.json create mode 100644 src/main/resources/assets/betterend/models/block/lucernia_bark_2.json create mode 100644 src/main/resources/assets/betterend/models/block/lucernia_bark_3.json create mode 100644 src/main/resources/assets/betterend/models/block/lucernia_bark_4.json create mode 100644 src/main/resources/assets/betterend/models/block/lucernia_log.json create mode 100644 src/main/resources/assets/betterend/models/block/lucernia_log_2.json create mode 100644 src/main/resources/assets/betterend/models/block/lucernia_log_3.json create mode 100644 src/main/resources/assets/betterend/models/block/lucernia_log_4.json create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_barrel_bottom.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_barrel_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_barrel_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_barrel_top_open.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_bookshelf.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_composter_bottom.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_composter_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_composter_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_bottom.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_front.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_ladder.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_log_side_2.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_stripped_log_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_stripped_log_top.png delete mode 100644 src/main/resources/assets/betterend/textures/block/rutiscus_top.png create mode 100644 src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest.png create mode 100644 src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest_left.png create mode 100644 src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest_right.png create mode 100644 src/main/resources/assets/betterend/textures/entity/sign/lucernia_sign.png create mode 100644 src/main/resources/assets/betterend/textures/item/lucernia_sign.png diff --git a/src/main/java/ru/betterend/blocks/FilaluxLanternBlock.java b/src/main/java/ru/betterend/blocks/FilaluxLanternBlock.java index 9bb4a323..0363bd80 100644 --- a/src/main/java/ru/betterend/blocks/FilaluxLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/FilaluxLanternBlock.java @@ -1,11 +1,13 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.block.Material; +import net.minecraft.sound.BlockSoundGroup; import ru.betterend.blocks.basis.BlockBase; public class FilaluxLanternBlock extends BlockBase { public FilaluxLanternBlock() { - super(FabricBlockSettings.of(Material.WOOD).luminance(15)); + super(FabricBlockSettings.of(Material.WOOD).luminance(15).sounds(BlockSoundGroup.WOOD).breakByTool(FabricToolTags.AXES)); } } diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index e128b0c5..4ca3195c 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -171,6 +171,7 @@ public class EndFeatures { // Terrain // public static final EndFeature END_LAKE = EndFeature.makeLakeFeature("end_lake", new EndLakeFeature(), 4); + public static final EndFeature END_LAKE_NORMAL = EndFeature.makeLakeFeature("end_lake_normal", new EndLakeFeature(), 20); public static final EndFeature END_LAKE_RARE = EndFeature.makeLakeFeature("end_lake_rare", new EndLakeFeature(), 40); public static final EndFeature ROUND_CAVE = EndFeature.makeRawGenFeature("round_cave", new RoundCaveFeature(), 2); public static final EndFeature SPIRE = EndFeature.makeRawGenFeature("spire", new SpireFeature(), 2); diff --git a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java index da8dd315..c2aebccf 100644 --- a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java @@ -10,14 +10,14 @@ import ru.betterend.registry.EndSounds; public class LanternWoodsBiome extends EndBiome { public LanternWoodsBiome() { super(new BiomeDefinition("lantern_woods") - .setFogColor(132, 35, 13) + .setFogColor(189, 82, 70) .setFogDensity(1.1F) - .setWaterAndFogColor(113, 88, 53) - .setPlantsColor(237, 122, 66) + .setWaterAndFogColor(171, 234, 226) + .setPlantsColor(254, 85, 57) .setSurface(EndBlocks.RUTISCUS) .setMusic(EndSounds.MUSIC_FOREST) - .setParticles(EndParticles.GLOWING_SPHERE, 0.0005F) - .addFeature(EndFeatures.END_LAKE_RARE) + .setParticles(EndParticles.GLOWING_SPHERE, 0.001F) + .addFeature(EndFeatures.END_LAKE_NORMAL) .addFeature(EndFeatures.LUCERNIA) .addFeature(EndFeatures.LUCERNIA_BUSH) .addFeature(EndFeatures.FILALUX) diff --git a/src/main/resources/assets/betterend/blockstates/lucernia_bark.json b/src/main/resources/assets/betterend/blockstates/lucernia_bark.json new file mode 100644 index 00000000..57d7d613 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/lucernia_bark.json @@ -0,0 +1,22 @@ +{ + "variants": { + "axis=x": [ + { "model": "betterend:block/lucernia_bark", "x": 90, "y": 90, "weight": 16 }, + { "model": "betterend:block/lucernia_bark_2", "x": 90, "y": 90 }, + { "model": "betterend:block/lucernia_bark_3", "x": 90, "y": 90, "weight": 16 }, + { "model": "betterend:block/lucernia_bark_4", "x": 90, "y": 90 } + ], + "axis=y": [ + { "model": "betterend:block/lucernia_bark", "weight": 16 }, + { "model": "betterend:block/lucernia_bark_2" }, + { "model": "betterend:block/lucernia_bark_3", "weight": 16 }, + { "model": "betterend:block/lucernia_bark_4" } + ], + "axis=z": [ + { "model": "betterend:block/lucernia_bark", "x": 90, "weight": 16 }, + { "model": "betterend:block/lucernia_bark_2", "x": 90 }, + { "model": "betterend:block/lucernia_bark_3", "x": 90, "weight": 16 }, + { "model": "betterend:block/lucernia_bark_4", "x": 90 } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/lucernia_log.json b/src/main/resources/assets/betterend/blockstates/lucernia_log.json new file mode 100644 index 00000000..7052ea7b --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/lucernia_log.json @@ -0,0 +1,22 @@ +{ + "variants": { + "axis=x": [ + { "model": "betterend:block/lucernia_log", "x": 90, "y": 90, "weight": 16 }, + { "model": "betterend:block/lucernia_log_2", "x": 90, "y": 90 }, + { "model": "betterend:block/lucernia_log_3", "x": 90, "y": 90, "weight": 16 }, + { "model": "betterend:block/lucernia_log_4", "x": 90, "y": 90 } + ], + "axis=y": [ + { "model": "betterend:block/lucernia_log", "weight": 16 }, + { "model": "betterend:block/lucernia_log_2" }, + { "model": "betterend:block/lucernia_log_3", "weight": 16 }, + { "model": "betterend:block/lucernia_log_4" } + ], + "axis=z": [ + { "model": "betterend:block/lucernia_log", "x": 90, "weight": 16 }, + { "model": "betterend:block/lucernia_log_2", "x": 90 }, + { "model": "betterend:block/lucernia_log_3", "x": 90, "weight": 16 }, + { "model": "betterend:block/lucernia_log_4", "x": 90 } + ] + } +} diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 5d3d64ee..bd178a0d 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -770,5 +770,33 @@ "block.betterend.dragon_bone_block": "Dragon Bone Block", "block.betterend.dragon_bone_slab": "Dragon Bone Slab", "block.betterend.dragon_bone_stairs": "Dragon Bone Stairs", - "block.betterend.mossy_dragon_bone": "Mossy Dragon Bone" + "block.betterend.mossy_dragon_bone": "Mossy Dragon Bone", + + "biome.betterend.lantern_woods": "Lantern Woods", + "block.betterend.filalux": "Filalux", + "block.betterend.filalux_lantern": "Filalux Lantern", + "block.betterend.filalux_wings": "Filalux Wings", + "block.betterend.lucernia_bark": "Lucernia Bark", + "block.betterend.lucernia_barrel": "Lucernia Barrel", + "block.betterend.lucernia_bookshelf": "Lucernia Bookshelf", + "block.betterend.lucernia_button": "Lucernia Button", + "block.betterend.lucernia_chest": "Lucernia Chest", + "block.betterend.lucernia_composter": "Lucernia Composter", + "block.betterend.lucernia_crafting_table": "Lucernia Crafting Table", + "block.betterend.lucernia_door": "Lucernia Door", + "block.betterend.lucernia_fence": "Lucernia Fence", + "block.betterend.lucernia_gate": "Lucernia Gate", + "block.betterend.lucernia_ladder": "Lucernia Ladder", + "block.betterend.lucernia_leaves": "Lucernia Leaves", + "block.betterend.lucernia_log": "Lucernia Log", + "block.betterend.lucernia_outer_leaves": "Lucernia Outer Leaves", + "block.betterend.lucernia_planks": "Lucernia Planks", + "block.betterend.lucernia_plate": "Lucernia Pressure Plate", + "block.betterend.lucernia_sapling": "Lucernia Sapling", + "block.betterend.lucernia_sign": "Lucernia Sign", + "block.betterend.lucernia_slab": "Lucernia Slab", + "block.betterend.lucernia_stairs": "Lucernia Stairs", + "block.betterend.lucernia_stripped_bark": "Stripped Lucernia Bark", + "block.betterend.lucernia_stripped_log": "Stripped Lucernia Log", + "block.betterend.lucernia_trapdoor": "Lucernia Trapdoor" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 8ab69546..6b7d44db 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -790,5 +790,33 @@ "block.betterend.dragon_bone_block": "Блок драконьих костей", "block.betterend.dragon_bone_slab": "Плита из блока драконьих костей", "block.betterend.dragon_bone_stairs": "Ступени из блока драконьих костей", - "block.betterend.mossy_dragon_bone": "Замшелые драконьи кости" + "block.betterend.mossy_dragon_bone": "Замшелые драконьи кости", + + "biome.betterend.lantern_woods": "Лес фонарей", + "block.betterend.filalux": "Филалюкс", + "block.betterend.filalux_lantern": "Филалюксовый фонарь", + "block.betterend.filalux_wings": "Филалюксовые крылья", + "block.betterend.lucernia_bark": "Кора люцернии", + "block.betterend.lucernia_barrel": "Бочка из люцернии", + "block.betterend.lucernia_bookshelf": "Книжные полки из люцернии", + "block.betterend.lucernia_button": "Кнопка из люцернии", + "block.betterend.lucernia_chest": "Сундук из люцернии", + "block.betterend.lucernia_composter": "Компостер из люцернии", + "block.betterend.lucernia_crafting_table": "Верстак из люцернии", + "block.betterend.lucernia_door": "Дверь из люцернии", + "block.betterend.lucernia_fence": "Забор из люцернии", + "block.betterend.lucernia_gate": "Калитка из люцернии", + "block.betterend.lucernia_ladder": "Лестница из люцернии", + "block.betterend.lucernia_leaves": "Листья люцернии", + "block.betterend.lucernia_log": "Бревно люцернии", + "block.betterend.lucernia_outer_leaves": "Внешние листья люцернии", + "block.betterend.lucernia_planks": "Доски из люцернии", + "block.betterend.lucernia_plate": "Нажимная плита из люцернии", + "block.betterend.lucernia_sapling": "Саженец люцернии", + "block.betterend.lucernia_sign": "Табличка из люцернии", + "block.betterend.lucernia_slab": "Плита из люцернии", + "block.betterend.lucernia_stairs": "Ступени из люцернии", + "block.betterend.lucernia_stripped_bark": "Обтёсанная кора люцернии", + "block.betterend.lucernia_stripped_log": "Обтёсанное бревно люцернии", + "block.betterend.lucernia_trapdoor": "Люцерниевый люк" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lucernia_bark.json b/src/main/resources/assets/betterend/models/block/lucernia_bark.json new file mode 100644 index 00000000..d8d8534f --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_bark.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/lucernia_log_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lucernia_bark_2.json b/src/main/resources/assets/betterend/models/block/lucernia_bark_2.json new file mode 100644 index 00000000..700cf84a --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_bark_2.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/lucernia_log_side_2" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lucernia_bark_3.json b/src/main/resources/assets/betterend/models/block/lucernia_bark_3.json new file mode 100644 index 00000000..1c98b56f --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_bark_3.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_mirrored_all", + "textures": { + "all": "betterend:block/lucernia_log_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lucernia_bark_4.json b/src/main/resources/assets/betterend/models/block/lucernia_bark_4.json new file mode 100644 index 00000000..f9a8a676 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_bark_4.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_mirrored_all", + "textures": { + "all": "betterend:block/lucernia_log_side_2" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lucernia_log.json b/src/main/resources/assets/betterend/models/block/lucernia_log.json new file mode 100644 index 00000000..c1db80eb --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_log.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "betterend:block/lucernia_log_top", + "east": "betterend:block/lucernia_log_side", + "north": "betterend:block/lucernia_log_side", + "particle": "betterend:block/lucernia_log_side", + "south": "betterend:block/lucernia_log_side", + "up": "betterend:block/lucernia_log_top", + "west": "betterend:block/lucernia_log_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lucernia_log_2.json b/src/main/resources/assets/betterend/models/block/lucernia_log_2.json new file mode 100644 index 00000000..27176afb --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_log_2.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "betterend:block/lucernia_log_top", + "east": "betterend:block/lucernia_log_side_2", + "north": "betterend:block/lucernia_log_side_2", + "particle": "betterend:block/lucernia_log_side_2", + "south": "betterend:block/lucernia_log_side_2", + "up": "betterend:block/lucernia_log_top", + "west": "betterend:block/lucernia_log_side_2" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lucernia_log_3.json b/src/main/resources/assets/betterend/models/block/lucernia_log_3.json new file mode 100644 index 00000000..e36e41b0 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_log_3.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube_mirrored", + "textures": { + "down": "betterend:block/lucernia_log_top", + "east": "betterend:block/lucernia_log_side", + "north": "betterend:block/lucernia_log_side", + "particle": "betterend:block/lucernia_log_side", + "south": "betterend:block/lucernia_log_side", + "up": "betterend:block/lucernia_log_top", + "west": "betterend:block/lucernia_log_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lucernia_log_4.json b/src/main/resources/assets/betterend/models/block/lucernia_log_4.json new file mode 100644 index 00000000..2c32bf88 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lucernia_log_4.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube_mirrored", + "textures": { + "down": "betterend:block/lucernia_log_top", + "east": "betterend:block/lucernia_log_side_2", + "north": "betterend:block/lucernia_log_side_2", + "particle": "betterend:block/lucernia_log_side_2", + "south": "betterend:block/lucernia_log_side_2", + "up": "betterend:block/lucernia_log_top", + "west": "betterend:block/lucernia_log_side_2" + } +} diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_barrel_bottom.png b/src/main/resources/assets/betterend/textures/block/lucernia_barrel_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..ebf9c25b5ca2b9ec3e94e008f75f330f980c55c5 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(iS0Fvt z+-jYp!#+RnlVO2ZvJ)OO6+BxP*bkIoFA4GsX7~>VOY4{Y1`3sWx;TbNO!e)L7CUOd z!L)eM@AxA2%fBBqKZ}t0Y9f{L{V~wYX-f_@Ii2NQv&vJ2%jSdciT$6BW%*@Ct-Z48 zsz{kfo`c?nS@8#7oW3EU>#)`0kXz-O`U4jdfA9-CykGV*_7;yg!;?i%jyl=t)JPq_ e_-W^xzjkhyS^UgqOnd-z0E4HipUXO@geCx7d|&7Q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_barrel_side.png b/src/main/resources/assets/betterend/textures/block/lucernia_barrel_side.png new file mode 100644 index 0000000000000000000000000000000000000000..4728ebe12ba7f193e7ca711c2f7e280170bc597c GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~#Q>iWSCE{N zjDe1(tG#uLw(eYWt96bJ`~195h6P^9PI%B%kRdGa3#f>@B*-tA;XfSImepPb3g>&e zIEF|}ZS4!>YcSw&7EBa*SD$cOvbTQHp3;{Q2bZPqi+KJ;{Pm2s6KgkIJ|FvT-Rj#1 zi|p?iv8<94I(p&R{dWuf8Wz6xn}2nNsxrIL#uaa_+_>eohs{g!ccbO9pHa@;FMix? kme{m#WB)2<4FKfmSnky85}Sb4q9e0Mij-n*aa+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_barrel_top.png b/src/main/resources/assets/betterend/textures/block/lucernia_barrel_top.png new file mode 100644 index 0000000000000000000000000000000000000000..06f0efcbc87ba5d26f55eff2c76fc5a6d3f89556 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~i2$DvS0G(g zRTUi_z0T2LpP%>1u)r(X2@jeI_9~Vy1Ilrf1o;Is{D*+6r$UT?Vp*Opjv*3LWBnP0 z8Voo#$$a=PuO9U_tGw!jh@pe0wZN&ZVM#&DoLCvJHAk|oekP!GOm>1dw}7ui#HEu` zm5<|^FTMELK4aqJmOr~YA1mIFYPx%F(X|5_A7Z23?(FTYU85aweCc~9DZ_uyVS)S0J4) zE8n86JJ;N5ouk7(Kkt)afmgB<9yArKWxkRKl;$i6@(X784+Z8-v#$UJ6FprVLnNlA z`f~~~C~|C4diq~KZsXi<9W%WIJn zC>$y(9w#N6rJy|5+-jYp!#+RnlVO2ZvJ)OO6-*Qq+#@Eob?es7&Q4EHPkVd&as&2c z4c5#M;}x^HI_o$}`vl{PctbNd1^cpjvI7jG`?UP343igsX9}7FG+nMF$S;`TKR)oq zLdqPda+9ZvV~E65-#$;FBMKa@y+SHUmvY%WW!}}FJ+@}n(e^6WgT_y6AN6#^aob96 zy2iA}@M@Z9L-Cn&J3klgWt4m}Wl__fygRp>)s8UkI{Vzz!9e7)T=4m#XIEY?Hm@k3 zGwZMV(6=H+d^xnEApbKBfgUg&n$O}ow8U#hL&VRkw= z?P~(-{Pm|&BDY^({N>kArsEqOj}==*iCPMsj-4g<_wt1$@;)LwcZw?RgMya9)78&q Iol`;+0Gpts_y7O^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_composter_bottom.png b/src/main/resources/assets/betterend/textures/block/lucernia_composter_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..ba01caa66b6ceb676d6878bfde2178237a088914 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~{s5m4S0Fvt z+-jYp!^yC~E7=KuXHCro3bB?1`2{ol2LhQ3Y9N!+JY5_^B&NptNAn#p;1GKFFMZyE z+s9{R=sp$nUi7SBcSzQP*b{4&G!FI1v03yy+VS)S0G)k zqSm6VJJ;N5ouk7(Kkt)afmgB<9yAq*TkEv}r8!H2{DK+&LxDNd>?=UQcuyC{5Q(X| zecoaR6nK~}N<8}Of2U^mi)@nv#{^?`+okEU1x0%Ex~BNonFv3T5!^q?k?&hv_S>*{ zjk7(9Qx}}oUTkdFTxlnEKdLV}WJQwm1N-EvDSLRz7^Ejnu|LM#xt68rh1-YaK&u!$ MUHx3vIVCg!0K^|o2mk;8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_composter_top.png b/src/main/resources/assets/betterend/textures/block/lucernia_composter_top.png new file mode 100644 index 0000000000000000000000000000000000000000..d0b7d44942f06e1faa6126f316e54940ce3c427c GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~{s5m4S0Fvt z+-jYp!^yC~E7=KuXHCro3bB?1`2{ol2LhQ3Y9Nz5JY5_^B&PQEb8{Uq;BY?s{9pRI zQwxsrS}AJrcdF!AhOWIXz&P!~<-{X_tQAbJxGt4cbujnn|6;iOkjET{@p%~ulS7tHV< z8H9V?76HmMdb&7Ad%Usrc6Iez*KNq>NH)H>RGP;Xaj_p?jXC zOQM1E@rfJ#wuPjv+1Svr<4l3^S!QpKrP37(K18J}SaV#NuEY8;cZYSPRMMRrdw*6r z9{720S%r*$`?kKdZaSPc4t;koc~=*1DfxBDWI5-;$A7<{-~WR#^bCi&39qFo&@l|2 Lu6{1-oD!M(>AO|KGTAqu5fxLQ%|HTf$M9Pf~5>XyXx`4m3ivB*-tA0cZ*a2-xsTAE;our;B5V#8lhyZLzFZzjg`yus@q_!t45$l&Sf=d#Wz Gp$P!L8G&;E literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_side.png b/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_side.png new file mode 100644 index 0000000000000000000000000000000000000000..6463c47c0d9c2b346dd663dbd51576c8a8713ca5 GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~`v9L1S0H`k z#*M98w@QleNQ?1m$Z@MF2w5nKIV$scYfBVcDtHJA$4SX%DJZvS>&`W|TIcAn&(Hg0 zSm2fHga=Ip3iS(GfJTUx1o;Is{KoU} z&>dF$6Mb{9AHB}_&qPpw!+mbNJ9qo}IeSH}78%|DEnWuT|CGs~f4{qS^cgd0)gvdK8W{7xZrOZJeMK<8hr;G8qd!J}FhXlR? zyCrJ;p)N2XbWQ^_r~;5arY?76W?Z>7AQPI-6DI(z6?Z~)N4Sm~87<2oA&!~Z)PHSu zTj$p8u;eQJJ#ZI!F1!v>9hYyZXfdmKE|Ytl7wPBnElIOt`xj;xe$4IzTuu-i;s5{u M07*qoM6N<$f`_0&5C8xG delta 157 zcmV;O0Al}x0)hgNZGV7CL_t&-l|_$H5e9a z&LBY=G?j1w`hw<+)VD{}PLnZR+cY!V^X?z08*=DzW1H$Q?-p-AIMD<-h@VS)S0L@B zt`M%PoMEL~;9_0rW!DnuG%3<`e!P1lqs&&IG-pYWUogXeC@^Q5eFZ4k=;`7ZA~Dsr zzmd;Xk;6%N;;;YubpiS1r*-`swguQO-t0PGZ;cZ_uLYyQi;EvP8#Gj!L!z!6npU$W zuZ;c6O=07eX_5!-tiLl^ld){q=2SL*ku7(V-&AyMyKVW3VfyEHI@}))Obh1wU#;>e wrS*;!+rN3|1b;T}Zf9QXB=-188M|oR$3*5R`)e`3fsSGDboFyt=akR{0I%*}ZU6uP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_log_top.png b/src/main/resources/assets/betterend/textures/block/lucernia_log_top.png index d9e4f84a0a954216bd3e77cbb5ac04041a96b36b..502c1b70af4d73035288a532f00f5aca953be58f 100644 GIT binary patch delta 206 zcmbQm^qp~nVZC&KPlzi61A~{kLb$H-Tyv{+jt=|$yibM&Udc{)&{W{(bzlilnzJOx zFPPy!6qqy3z5*01^>lFzk(lZm;3&kP$PwiH;=g{})>)ByW-N`76+aZx+IDh@nBQEk zc8y6WlHr>`wft0;otBDm8ZX7XHrgy*eu2eto%_D^l{#w^)ILYZG4`p-1)eCoE0S<^ zv;FCAS=Xa}nwj$>LUV0Oa<;E~`mQW7{q=8l!H-y~_EQr?mvzhH*{NI;jxaV=1y!_&nvL}IF`f1ntPB1cw`_rl-v%Qwz^x?GOw zR7YmozC-g0y4BkP844Tz`3hF2hfSMMnU!Pl-Ew`G&n*L$kBzNiB8vTA5)QR1H{LDY zd(xC?t%K+)UB#o`D(jXy>nn!rmW$lvyge!Ybk@=Ow|5t9{jTxp4v(PKAO2%AYPX)M keJir+)3bYbr~mGe&;H91s%W`j63|f$p00i_>zopr00jMO+yDRo diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_planks.png b/src/main/resources/assets/betterend/textures/block/lucernia_planks.png index 9d911b725c397dbcfd3b73d216816f0fa46f9869..1d58c5a2f93e51e71a640aa34793e64d207b9a75 100644 GIT binary patch delta 231 zcmZ3_{DX0VWIZzj1A~Sxe=v|@EDmyaVpw-h<|U9L5#STz3Zz@Kb?2H}t#fqP=jVMg zEbvNp!h@!Q-JgFt0_8YLg8YIR{zJgkQz1q`u_{j&#}J9By8VoN2MjovHY)x7-_KsA zC%F0TIx(rcSMEz+@+qD&#pBJ2h1&U2wSEcTS6VH<#J!7WPFe?-k<2%yd5KrzmtD^i zbUHrqOoIE3-_tp4O_u*kd~A2++>&b>t1bMPrf=-n-R-_d`bqxVpEF`x{vNrhyu@^G c`O04m4Kgf6^|J+60G+|$>FVdQ&MBb@0L*e?3;+NC delta 416 zcmV;R0bl<30j~p)8Gi-<001BJ|6u?C00DDSM?wIu&K&6g00C)9L_t(IjdfEoZo@DP zyh2Q57>(c|o-%Z8hxRLdOTXGaAn1}Humc!!AXs&XcAzQCLCS>!btZY|)5G`2`|l7L zg*BkH#cf=F;=lE#VGsZm)?kPX#DLxdD+?4>>IxnrL$LtRd4I;r0;JRR0*+I|&huhw zVFATg&d3J62Tl{PbOJniMi}K>t|W(1&Qj-ern)wuokiOQY`3MLcaj#h8!AHto}8H| zAfj>xmp)*Kx+*Y6X;N6FFjG}JG(_d40&xP25vZI=8|2e9=y=GvGD-&okEB6+=7koj zm15}SdH(;(aew20$IZ*l&QCtL^daLWS@qCRT{Htik!WpEAl~JtAKo?rM4Qet z=<72ij_QM4gZwV|>3#%`2N_7OZzb9`pmLcOwT$UJFMQBi@kRbVNcba(sP@&GHrHA* zQh(WmEu3Q9d)9780gy7n`2u^93&J8TfV4_ zHj5jQ9;fe4B`m^g`P1rY^#V)3+%PmOsf}#l zmbzef&tUuK7+s-@i>L5TXq>&eAuadRg5Ug$CNf38aA1_~WX72QN QFVF!Dp00i_>zopr0KPm;{{R30 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_stripped_log_top.png b/src/main/resources/assets/betterend/textures/block/lucernia_stripped_log_top.png new file mode 100644 index 0000000000000000000000000000000000000000..22ef55783242ca60567d501eb96380414d20a7ed GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~=>VS)S0G)k zqSm6VJJ;N5ouk7(Kkt)afmgB<9yAq*TkEv}r8!H2{DK+&LxDNd>?=UQYEKu(5Q(Y2 z{gFZ}h8#|dm7e@lm-8%N)jmJs$-_;Hw2YLDHpi^H(D6tu_NYXt!(#UXdeYVQQ&@ys zet4aYSShA%Y{NQ@bJHJt{glHjyKnZ@uvI7(_6Ax{U2Vg;!noxeYe<_QC&JY0wW z*GDdxSEZ@_g<-;^&%ft96k(A3bgHt?@yh1kmRxQ&ylU1QJdy?{POsSgNr7cu2+O}Y z#+{e%=m{`wU7=L9`sCqHT>8Q158c|i;dYy7V_5CiEqQ0I@a&y%*TExr-)dX6qubiL bHNG=P2r*UPzx8`M&;bmdu6{1-oD!M<>;_py diff --git a/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest.png b/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..008e73c409316c3723001d299ce3166e66245fc2 GIT binary patch literal 777 zcmV+k1NQuhP)Px#KTu3mMF0Q*5DW_w4-Xg=6B!j185I;778M>E8Ae7%TU%RhZf=i{kDi{McO)i+ zD=nQjI<7%LzD`TYR#DVzVBmsqwvKz>0000LbW%=J0RR90|NsC0|NsC0|NsC0|NsC0 z|4^{{F8}}nS4l)cR9J=WR@-*tFbGVK9>}GZ0Q>*Hbq9ehDP6ZpcOS#C-HsCx7+|E! z<$C>mTy{&}*yZnbz20!`h&VIbEy7I1ZuXAp#KG-$$JHDxhZQ)`HB3$&-0u%uM+$ja zvfGkV%0-pg?vl?^csxFF9T5oD7Z@C9LIm5kt(!gg%)w}h!$HXlrz8j-i}6@x&Vg|d zA;3X!fEZStjUcxaj03NN3g=S}o+8l2Ge87NBwICOLC&i16ajk?ECO&)Q>ZRxQ>YwN zAIoBmR2eYS(>{2LAh$*`4v>$vB?6k|fQ3cX9%5C%|BiXK3NRwO$^H!JWXVU&TKzix zh(2Hyby;^tKcY&Gq2?ea4o?*V(!e`%j4C9MVQfhKX6GR0--yDJUJufs2S5_IbVYTB zcAH1vRN+NQ8_g=uo@$k}A_t!9L?7UtwqD?7TiG0J-v2gCP2gsS2?W>quPR7`I?P3& z+o6IANoxW(Eom|T#z7hdZY~1o@V*sP4vrLF;lTC*(*QCKc7e;2RnQ;+cW@8_r>}6} zLMAi{+*}03rwznFyh9(U8E|B_wb;K6B}54symD zl$u@l*hZLZ^H6+dx1&-V51ObNy^AvdbZ?DDKp{*M+xdWEvwz+x>+4u!G8%2rFY)t1 zb-o22M0KD4x}?_wO8xo3-8o(d4vNpe)7I+&4d(+Oqc7X{Ie$$7xBp6{PK#zuueSzs00000NkvXX Hu0mjf5Up1m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest_left.png b/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest_left.png new file mode 100644 index 0000000000000000000000000000000000000000..54b7154b47c8a7f2b02c1ada178cdd7dc42122fa GIT binary patch literal 684 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`*a!H8xB_Vb z9&TZNehCp_Nl{TrQ4uLIQ8_6|H#fKF=;*w>y#D_FdGqF#tEjbT>&`W|TIcAn&(Hg0 zSm2fHga=Ip+xn{S1C0TnyZ1|-QwD*^%i(^Pc>)Wu~eXR;SS3Vrrx#mmL z|Nm=m7af1VInVdoNzV&DQtnZ=E~ZxQna=fD@U+1B5D_J~uFw-#?RJeI?-}_xS;{4 z$X?1ice7N<1$D*{<+l!s)faA0aqzOct}vJBwd|b`E`j^}maPpDtt+K=^gNSD=CzIY zSop0`%y9dmQpWTx3vRW2%t&X6nANuA^`oN!hcmO-|9)7*UKM#@-SZsT)1F^rBOWTO zxv9m!=GgYPYuL^d{;`>C8nM&hk(9a&*O$74>!-9&e_Yt`Hqp+&I`D|4_v>JVq_fe> z-TCCA?XI$)-2X`Q?843Ite5^&|8iO|v);7faE1?u$>;s=QxtwTo1L2?Z}NHlXK5QV zYoJTt{#nhiZ%6NnsYk-x3RQIO+%%YDYA3?b*~Y3M&y+2bCO0Gdv2)|I`UCG@ zb?z&;>;HTIgLbB~{|~%7xh`Y}2S@hf$Fe1L3TCHf8mompa&ElG|K^pJzD`lWW09hN zRTI~oOg|UJysl7&JHclAmvp6mhlc`uTaVoRar(>i{Kvi0=6QF1aMv+@==HU8+N^#C Qm`oTvUHx3vIVCg!04(M>xBvhE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest_right.png b/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest_right.png new file mode 100644 index 0000000000000000000000000000000000000000..01d16c64e796d512b00851f0d36ddcd71b19d343 GIT binary patch literal 722 zcmV;@0xkWCP)Px#KTu3mMF0Q*5DW_w4-Xg=6B!j185I;778M>E8Ae7%TU%RhZf=i{kDi{McO)i+ zD=nQjI<7%LzD`TYR#DVzVBmsqwvKz>0000LbW%=J0RR90|NsC0|NsC0|NsC0|NsC0 z|4^{{F8}}nAW1|)R9J=WR@;)pAP7yy2YcBlVE+GG7eo!(OviTjF-&4hiKlXuLzd?SutNtm#{k}Xbz-G+>B{gD8rvQ(~@-zUU2M9<2M7ogk z6+EAdA;BR}3u-Y02Wj8=;vw3=U;po-9D~06LukG6y_0O|PKiAh?io zCw#-f06@xsq`;S>T^Fx5nL;Ho2#J&`hw~(M=OAhRYBK=iIpEFYV<F!Ext8?QgA#HdiJRKBkdBS5+|qt ztEqSJYp(|b0AkYzXaLSz>pkBC_;y@tJqyt4{~Lf1 zP5skQ8Z!W7>p!tPSbdmE!PfuY6fWj*3V=-gr$b}2M9u&R2e}WRoV&t7_=tmKSP%}1 z!buiWDbz-gJIWW^7`58U;Nr&sy&kx&^Jf6Qku)n*z2{!g*VmxSJ68I)cPb^-?*U3o zc1?Un%jH!e4viWtUxc*=7G{zxP&6REM;t1^@s607*qoM6N<$ Ef-|%}YXATM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/entity/sign/lucernia_sign.png b/src/main/resources/assets/betterend/textures/entity/sign/lucernia_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..e4003bd19109348fe94d421fff7365b3025afed4 GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3-p)I`?e@QjEnx?oJHr&dIz4a%vS8_dBkvaLA<#Zv{ zE{;W0nC7v+d3IoRgY}lJvcH}+AD4}K@a5>`_nNLxUT_Ec(VQ!OePKi2dl)7JY#Ux5w5x5^sF~AE$rl?*K$)eMfRvvcQvfxx( c=YKi-oxXg*fj2^r0|S!5)78&qol`;+04`L&WB>pF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/lucernia_sign.png b/src/main/resources/assets/betterend/textures/item/lucernia_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..36c11d16adc04371f23953db0b428868bd5a3e72 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~=>VS)S0G)k zqSm6VJJ;N5ouk7(Kkt)afmgB<9yAq*TkEv}r8!H2{DK+&LxDNd>?=UQAWs*^5Q(Y1 zeU5ww6gXG}3#R|yzat@dwePGlJ}Gscz$fg2Dhx&(`i`!NT(+!dUZpOp>}N5rRk2(( y^R4H(=RYU?@ao)VRR8>13iCgazurH#zGujsz~m&j-Jlg{I)kUHpUXO@geCw{5=XxP literal 0 HcmV?d00001 From bfbb4a0cff74411f61f9a079bf62798e2829398f Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 16 Mar 2021 18:16:12 +0300 Subject: [PATCH 346/463] Lucernia door & trapdoor, campfire recipes --- .../blocks/complex/MetalMaterial.java | 20 +++++++++--------- .../ru/betterend/recipe/CraftingRecipes.java | 1 + .../recipe/builders/FurnaceRecipe.java | 18 ++++++++++++++-- .../textures/block/lucernia_door_bottom.png | Bin 0 -> 258 bytes .../textures/block/lucernia_door_side.png | Bin 0 -> 212 bytes .../textures/block/lucernia_door_top.png | Bin 0 -> 257 bytes .../textures/block/lucernia_trapdoor.png | Bin 0 -> 249 bytes .../betterend/textures/item/lucernia_door.png | Bin 0 -> 211 bytes 8 files changed, 27 insertions(+), 12 deletions(-) create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_door_bottom.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_door_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_door_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_trapdoor.png create mode 100644 src/main/resources/assets/betterend/textures/item/lucernia_door.png diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index 4c1b5c68..bb7f6041 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -141,7 +141,7 @@ public class MetalMaterial { boots = EndItems.registerItem(name + "_boots", new EndArmorItem(armor, EquipmentSlot.FEET, itemSettings)); if (hasOre) { - FurnaceRecipe.make(name + "_ingot_furnace", ore, ingot).setGroup("end_ingot").build(true); + FurnaceRecipe.make(name + "_ingot_furnace", ore, ingot).setGroup("end_ingot").buildWithBlasting(); AlloyingRecipe.Builder.create(name + "_ingot_alloy").setInput(ore, ore).setOutput(ingot, 3).setExpiriense(2.1F).build(); } @@ -166,15 +166,15 @@ public class MetalMaterial { GridRecipe.make(name + "_chandelier", chandelier).setShape("I#I", " # ").addMaterial('#', ingot).addMaterial('I', EndItems.LUMECORN_ROD).setGroup("end_metal_chandelier").build(); // Tools & armor into nuggets - FurnaceRecipe.make(name + "_axe_nugget", axe, nugget).setGroup("end_nugget").build(true); - FurnaceRecipe.make(name + "_hoe_nugget", hoe, nugget).setGroup("end_nugget").build(true); - FurnaceRecipe.make(name + "_pickaxe_nugget", pickaxe, nugget).setGroup("end_nugget").build(true); - FurnaceRecipe.make(name + "_sword_nugget", sword, nugget).setGroup("end_nugget").build(true); - FurnaceRecipe.make(name + "_hammer_nugget", hammer, nugget).setGroup("end_nugget").build(true); - FurnaceRecipe.make(name + "_helmet_nugget", helmet, nugget).setGroup("end_nugget").build(true); - FurnaceRecipe.make(name + "_chestplate_nugget", chestplate, nugget).setGroup("end_nugget").build(true); - FurnaceRecipe.make(name + "_leggings_nugget", leggings, nugget).setGroup("end_nugget").build(true); - FurnaceRecipe.make(name + "_boots_nugget", boots, nugget).setGroup("end_nugget").build(true); + FurnaceRecipe.make(name + "_axe_nugget", axe, nugget).setGroup("end_nugget").buildWithBlasting(); + FurnaceRecipe.make(name + "_hoe_nugget", hoe, nugget).setGroup("end_nugget").buildWithBlasting(); + FurnaceRecipe.make(name + "_pickaxe_nugget", pickaxe, nugget).setGroup("end_nugget").buildWithBlasting(); + FurnaceRecipe.make(name + "_sword_nugget", sword, nugget).setGroup("end_nugget").buildWithBlasting(); + FurnaceRecipe.make(name + "_hammer_nugget", hammer, nugget).setGroup("end_nugget").buildWithBlasting(); + FurnaceRecipe.make(name + "_helmet_nugget", helmet, nugget).setGroup("end_nugget").buildWithBlasting(); + FurnaceRecipe.make(name + "_chestplate_nugget", chestplate, nugget).setGroup("end_nugget").buildWithBlasting(); + FurnaceRecipe.make(name + "_leggings_nugget", leggings, nugget).setGroup("end_nugget").buildWithBlasting(); + FurnaceRecipe.make(name + "_boots_nugget", boots, nugget).setGroup("end_nugget").buildWithBlasting(); // Tool parts from ingots AnvilRecipe.Builder.create(name + "_shovel_head").setInput(ingot).setOutput(shovelHead).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index c4cd844c..7fe05063 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -188,6 +188,7 @@ public class CraftingRecipes { GridRecipe.make("charcoal_block", EndBlocks.CHARCOAL_BLOCK).setShape("###", "###", "###").addMaterial('#', Items.CHARCOAL).build(); GridRecipe.make("end_stone_furnace", EndBlocks.END_STONE_FURNACE).setShape("###", "# #", "###").addMaterial('#', Blocks.END_STONE).build(); + GridRecipe.make("filalux_lantern", EndBlocks.FILALUX_LANTERN).setShape("###", "###", "###").addMaterial('#', EndBlocks.FILALUX).build(); } private static void registerLantern(String name, Block lantern, Block slab) { diff --git a/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java b/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java index b56d8e9a..1a672be8 100644 --- a/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java @@ -3,6 +3,7 @@ package ru.betterend.recipe.builders; import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; import net.minecraft.recipe.BlastingRecipe; +import net.minecraft.recipe.CampfireCookingRecipe; import net.minecraft.recipe.Ingredient; import net.minecraft.recipe.RecipeType; import net.minecraft.recipe.SmeltingRecipe; @@ -59,10 +60,18 @@ public class FurnaceRecipe { } public void build() { - build(false); + build(false, false); } - public void build(boolean blasting) { + public void buildWithBlasting() { + build(true, false); + } + + public void buildWithCampfire() { + build(false, true); + } + + public void build(boolean blasting, boolean campfire) { if (exist) { Identifier id = BetterEnd.makeID(name); SmeltingRecipe recipe = new SmeltingRecipe(id, group, Ingredient.ofItems(input), new ItemStack(output, count), xp, time); @@ -72,6 +81,11 @@ public class FurnaceRecipe { BlastingRecipe recipe2 = new BlastingRecipe(id, group, Ingredient.ofItems(input), new ItemStack(output, count), xp, time / 2); EndRecipeManager.addRecipe(RecipeType.BLASTING, recipe2); } + + if (campfire) { + CampfireCookingRecipe recipe2 = new CampfireCookingRecipe(id, group, Ingredient.ofItems(input), new ItemStack(output, count), xp, time / 2); + EndRecipeManager.addRecipe(RecipeType.CAMPFIRE_COOKING, recipe2); + } } else { BetterEnd.LOGGER.debug("Smelting recipe {} couldn't be added", name); diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_door_bottom.png b/src/main/resources/assets/betterend/textures/block/lucernia_door_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..8f126ea8b7c6b8fbb98d2ca7414aa7a4a985355c GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~i2$DvS0LS@ ztvlD;YMrCQK0oi1VS!h&6CN}b?Ed`I5h%w|666=m@E-!Mo(eGnsrPho43U_s+Rw?y zpvb|j`Si#C{_+B0<&pzU7iaFC{Ed6AA;a~e>DKDaQ>u8a>K}O9qzYbZ&|dkfMAqZL zj*MN?XUwyIqiJ6db+^A~F=IyIitURftT`U^XemFPa;|wn$eC5=%5Ukt-EjQT>UsmE x28&&{eq56Ce1GllG}GC(A8zjC)P1#*|Gy6N=DxQPw}9?p@O1TaS?83{1OQ>pXN&*< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_door_side.png b/src/main/resources/assets/betterend/textures/block/lucernia_door_side.png new file mode 100644 index 0000000000000000000000000000000000000000..8ecca09ecbd8cf1ed776fb44f01fde1d59c99a24 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|`aE46Lo9le z_e`4m;s3R*>^zqiHSvVY?MqQ$n=yNZ;hw5LvmAZGrZm2M{kq>J^AOv+-jzT zgg~GZ*8&ZxiLs|!WK@?lHFmp+FoQ+6F)m?B31?=A$ko}W@5R>$bQy!EtDnm{r-UW| DR*y=i literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_door_top.png b/src/main/resources/assets/betterend/textures/block/lucernia_door_top.png new file mode 100644 index 0000000000000000000000000000000000000000..53164a59f6687547e9cfc72ce39cf3ef411bab89 GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~i2$DvS0LS@ ztvlD;YMrCQK0oi1VS!h&6CN}b?Ed`I5h%w|666=m@E-!Mo(eGniZy$>IEF|}_3e)o za#7@9R!rRazc>E%nf579g%)&9JT>>t%yW@)3nTMSh80S(o}8@Umzln%dXCbi%l8!G z%Sz|ZofVMvd{1}WDW-cWJ}WFEyS7C?Ojx;DHhEzv3(p#h7tZ?}HSNNDesV9}d+2gg w!)o?j;=g)Wtqw_St2@@P?Tmd)Y5z6$(*?}-Pm|8K0-eL)>FVdQ&MBb@0BD+I?*IS* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_trapdoor.png b/src/main/resources/assets/betterend/textures/block/lucernia_trapdoor.png new file mode 100644 index 0000000000000000000000000000000000000000..286a1f3b5227f8f58b07b431087a6c77aea40ae0 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~i2$DvS0LS@ ztvlD;YMrCQK0oi1VS!h&6CN}b?Ed`I5h%w|666=m@E-!Mo(eGnidB2MIEF|}P4&OX zci4f$N#y5$d%5ddUT&IM?O-Vqpp%~&zSWO;-R;A9eg}jU`6pV%hZdZ+zT_jZRj^LG zD}!lILZFMXzJm8=|GUgS+p{`Kxazf<51iebZm^Yi^7@vKiPx?Neg2>G=h%ZYsXDxR n`?r6ctn~0p+hxx0!vC4id}mIz)haUpI)lN})z4*}Q$iB}8wXz$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/lucernia_door.png b/src/main/resources/assets/betterend/textures/item/lucernia_door.png new file mode 100644 index 0000000000000000000000000000000000000000..9f0a205a98c53945fa58f3495ef455ed2e90a919 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~i2$DvS0LS@ ztvlD;YMrCQK0oi1VS!h&6CN}b?Ed`I5h%w|666=m@E-!Mo(eGniiLW*IEF|}?d^9I zaxi3Z_V##J|9E}u7OT58#|}xW9Qz@fcE;xx<2<|94J9l#<^@h7HyjGi+;Yfvl6F`j zExtl*;Wi=d-CRebm(DR0J-y*n@|&&q=KW^4#L0L>A%b-W&;kZeS3j3^P6 Date: Tue, 16 Mar 2021 18:21:29 +0300 Subject: [PATCH 347/463] Smoker recipes --- .../ru/betterend/recipe/FurnaceRecipes.java | 6 +++--- .../recipe/builders/FurnaceRecipe.java | 20 ++++++++++++------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/main/java/ru/betterend/recipe/FurnaceRecipes.java b/src/main/java/ru/betterend/recipe/FurnaceRecipes.java index ff5dd528..b230c256 100644 --- a/src/main/java/ru/betterend/recipe/FurnaceRecipes.java +++ b/src/main/java/ru/betterend/recipe/FurnaceRecipes.java @@ -10,10 +10,10 @@ public class FurnaceRecipes { public static void register() { FurnaceRecipe.make("end_lily_leaf_dried", EndItems.END_LILY_LEAF, EndItems.END_LILY_LEAF_DRIED).build(); FurnaceRecipe.make("end_glass", EndBlocks.ENDSTONE_DUST, Blocks.GLASS).build(); - FurnaceRecipe.make("end_berry", EndItems.SHADOW_BERRY_RAW, EndItems.SHADOW_BERRY_COOKED).build(); - FurnaceRecipe.make("end_fish", EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED).build(); + FurnaceRecipe.make("end_berry", EndItems.SHADOW_BERRY_RAW, EndItems.SHADOW_BERRY_COOKED).buildFoodlike(); + FurnaceRecipe.make("end_fish", EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED).buildFoodlike(); FurnaceRecipe.make("slime_ball", EndBlocks.JELLYSHROOM_CAP_PURPLE, Items.SLIME_BALL).build(); FurnaceRecipe.make("menger_sponge", EndBlocks.MENGER_SPONGE_WET, EndBlocks.MENGER_SPONGE).build(); - FurnaceRecipe.make("chorus_mushroom", EndItems.CHORUS_MUSHROOM_RAW, EndItems.CHORUS_MUSHROOM_COOKED).build(); + FurnaceRecipe.make("chorus_mushroom", EndItems.CHORUS_MUSHROOM_RAW, EndItems.CHORUS_MUSHROOM_COOKED).buildFoodlike(); } } diff --git a/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java b/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java index 1a672be8..6744a774 100644 --- a/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java @@ -7,6 +7,7 @@ import net.minecraft.recipe.CampfireCookingRecipe; import net.minecraft.recipe.Ingredient; import net.minecraft.recipe.RecipeType; import net.minecraft.recipe.SmeltingRecipe; +import net.minecraft.recipe.SmokingRecipe; import net.minecraft.util.Identifier; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; @@ -60,18 +61,18 @@ public class FurnaceRecipe { } public void build() { - build(false, false); + build(false, false, false); } public void buildWithBlasting() { - build(true, false); + build(true, false, false); } - public void buildWithCampfire() { - build(false, true); + public void buildFoodlike() { + build(false, true, true); } - public void build(boolean blasting, boolean campfire) { + public void build(boolean blasting, boolean campfire, boolean smoker) { if (exist) { Identifier id = BetterEnd.makeID(name); SmeltingRecipe recipe = new SmeltingRecipe(id, group, Ingredient.ofItems(input), new ItemStack(output, count), xp, time); @@ -83,12 +84,17 @@ public class FurnaceRecipe { } if (campfire) { - CampfireCookingRecipe recipe2 = new CampfireCookingRecipe(id, group, Ingredient.ofItems(input), new ItemStack(output, count), xp, time / 2); + CampfireCookingRecipe recipe2 = new CampfireCookingRecipe(id, group, Ingredient.ofItems(input), new ItemStack(output, count), xp, time * 3); EndRecipeManager.addRecipe(RecipeType.CAMPFIRE_COOKING, recipe2); } + + if (smoker) { + SmokingRecipe recipe2 = new SmokingRecipe(id, group, Ingredient.ofItems(input), new ItemStack(output, count), xp, time / 2); + EndRecipeManager.addRecipe(RecipeType.SMOKING, recipe2); + } } else { - BetterEnd.LOGGER.debug("Smelting recipe {} couldn't be added", name); + BetterEnd.LOGGER.debug("Furnace recipe {} couldn't be added", name); } } } From aba683ea0abff699bd83ecaa8fe983550337e108 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 16 Mar 2021 19:30:53 +0300 Subject: [PATCH 348/463] Emissive maps --- .../textures/block/filalux_bottom_e.png | Bin 0 -> 202 bytes .../textures/block/filalux_lantern.png | Bin 526 -> 273 bytes .../textures/block/filalux_lantern_e.png | Bin 0 -> 221 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/assets/betterend/textures/block/filalux_bottom_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/filalux_lantern_e.png diff --git a/src/main/resources/assets/betterend/textures/block/filalux_bottom_e.png b/src/main/resources/assets/betterend/textures/block/filalux_bottom_e.png new file mode 100644 index 0000000000000000000000000000000000000000..a4b863bdae0953d832a53d3dab75a2c34ca24a3b GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~=>VS)S0H`; z@{IepSHF0A=)=3~A3xkmSar8}&%4&M|Fbh1qJh$!B|(0{4F93PoN4wIprD7Ri(`ny z)VbY(Tn7v|oG+*7-TQxJv$O~MUy14t6@J#bM{%yp&aOE(Q*L>3S3rG;kMqSQCzc~( q%@YnZUfuIc{9JX|rQfH|9%b!TWq3Vnz3n@onGBw;elF{r5}E+0mQn@) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/filalux_lantern.png b/src/main/resources/assets/betterend/textures/block/filalux_lantern.png index 6382a934d1491d21483e210b2d0dd1abe113e4b6..04cb29e8135af2446c6c374bdd8ac5f69cb207b9 100644 GIT binary patch delta 256 zcmeBUnaDIjvYwfNfk8u;KNv_c76-XIF|0c$^AgBW3GfMV1=9K6w$-6-9r6A%vm;y2 z{@?uI|AjaIf1hgles$jGhr8atz4o^zBmt<7rzFTPnBhMHa2^Rz1By3$x;TbNO!W;2 z6k=86@G9`W`}=)-~lDH*o;n!{F)a=d#Wzp$P!CL~=X; delta 511 zcmVn)jt%a;WT+cOWMa>y-T&@yv2GgWD zUoa;c#LdkjHo1yr<`(GnC6k$X^WK~Pz5l(v5A`<>07^#yNPpql^HY+xaRBP)m&_IX z`d9-XCtLvXQm|BdCqOkEF<0=T{TfH>DiPfevP18wm}`GBaRObh_fD@p10xPsD(9L6-u1;5`C-|zzl#4 zz*1?P`$yw#XA{uu28|5>@a5~xj`LIdus;S8>TM0S>H1%gG`$(q5PrM30W}SGTbhj% zAfYjn&SyLC^fK=|wMt)x{V{ndIPJaPNykwOzJ0!8sdzMgyJ+8R5re^$YB)+5Sv&0C zUbBCDZILaNrW%e22Gd8>QnTY62i6`)X2Dd{NP4u>y7b-X{sOq5<}?I*@znqT002ovPDHLkV1fXF B>lgq4 diff --git a/src/main/resources/assets/betterend/textures/block/filalux_lantern_e.png b/src/main/resources/assets/betterend/textures/block/filalux_lantern_e.png new file mode 100644 index 0000000000000000000000000000000000000000..d450e3012b8f3c1697841bb181420c9677c243c7 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~i2$DvS0LSb z_W$Mw|1Z4x|NB(a_p9?hKiu{H?X`24(+&gWI7)*2f*Jlpz|~VBMnJK6PZ!4!iK(gm z4}}^Oc$&f)_x+c4pJBcJ$HR^JyArSZU;p{>d7y$;du@f`rp`N8C4`c7jkc;)=LM|v zRoB>+k{80 Date: Tue, 16 Mar 2021 19:36:15 +0300 Subject: [PATCH 349/463] Texture compression --- .../betterend/textures/block/aeridium.png | Bin 418 -> 210 bytes .../betterend/textures/block/aeridium_e.png | Bin 146 -> 132 bytes .../betterend/textures/block/amaranita_cap.png | Bin 251 -> 220 bytes .../betterend/textures/block/amaranita_fur.png | Bin 193 -> 178 bytes .../textures/block/amaranita_hymenophore.png | Bin 231 -> 195 bytes .../block/amaranita_hymenophore_fur.png | Bin 166 -> 150 bytes .../textures/block/amaranita_hyphae_side.png | Bin 218 -> 187 bytes .../textures/block/amaranita_hyphae_top.png | Bin 244 -> 220 bytes .../textures/block/amaranita_lantern.png | Bin 248 -> 219 bytes .../textures/block/amaranita_stem_middle.png | Bin 199 -> 182 bytes .../textures/block/amaranita_stem_roots.png | Bin 205 -> 188 bytes .../textures/block/amaranita_stem_top.png | Bin 182 -> 165 bytes .../betterend/textures/block/amber_grass.png | Bin 220 -> 217 bytes .../textures/block/amber_moss_top.png | Bin 239 -> 239 bytes .../betterend/textures/block/amber_root_0.png | Bin 167 -> 154 bytes .../betterend/textures/block/amber_root_1.png | Bin 194 -> 178 bytes .../betterend/textures/block/amber_root_2.png | Bin 229 -> 214 bytes .../betterend/textures/block/amber_root_3.png | Bin 251 -> 236 bytes .../textures/block/azure_jadestone.png | Bin 233 -> 199 bytes .../textures/block/azure_jadestone_bricks.png | Bin 262 -> 228 bytes .../block/azure_jadestone_furnace_front.png | Bin 271 -> 244 bytes .../block/azure_jadestone_furnace_front_on.png | Bin 337 -> 321 bytes .../block/azure_jadestone_furnace_side.png | Bin 244 -> 213 bytes .../block/azure_jadestone_furnace_top.png | Bin 235 -> 216 bytes .../block/azure_jadestone_lantern_bottom.png | Bin 196 -> 181 bytes .../block/azure_jadestone_lantern_side.png | Bin 200 -> 187 bytes .../block/azure_jadestone_lantern_top.png | Bin 197 -> 181 bytes .../block/azure_jadestone_pillar_side.png | Bin 239 -> 204 bytes .../block/azure_jadestone_pillar_top.png | Bin 254 -> 220 bytes .../block/azure_jadestone_polished.png | Bin 270 -> 236 bytes .../textures/block/azure_jadestone_tiles.png | Bin 229 -> 194 bytes .../textures/block/cave_bush_leaves_1.png | Bin 237 -> 219 bytes .../textures/block/cave_bush_leaves_2.png | Bin 271 -> 254 bytes .../textures/block/cave_bush_leaves_3.png | Bin 278 -> 263 bytes .../textures/block/cave_bush_leaves_4.png | Bin 275 -> 259 bytes .../betterend/textures/block/cave_grass_1.png | Bin 219 -> 201 bytes .../betterend/textures/block/cave_grass_2.png | Bin 211 -> 196 bytes .../textures/block/cave_moss_side.png | Bin 273 -> 256 bytes .../betterend/textures/block/cave_moss_top.png | Bin 243 -> 212 bytes .../textures/block/chorus_mushroom_0.png | Bin 146 -> 133 bytes .../textures/block/chorus_mushroom_1.png | Bin 165 -> 133 bytes .../textures/block/chorus_mushroom_2.png | Bin 241 -> 168 bytes .../textures/block/chorus_mushroom_3.png | Bin 364 -> 211 bytes .../textures/block/chorus_nylium_path_top.png | Bin 711 -> 711 bytes .../betterend/textures/block/clawfern.png | Bin 248 -> 232 bytes .../textures/block/crystal_moss_side.png | Bin 274 -> 254 bytes .../textures/block/crystal_moss_top.png | Bin 240 -> 212 bytes .../betterend/textures/block/dense_snow.png | Bin 215 -> 215 bytes .../textures/block/dragon_bone_block.png | Bin 238 -> 208 bytes .../textures/block/dragon_bone_block_side.png | Bin 266 -> 225 bytes .../textures/block/dragon_bone_block_top.png | Bin 277 -> 241 bytes .../textures/block/end_lotus_log_top.png | Bin 246 -> 246 bytes .../textures/block/end_stone_stalactite_0.png | Bin 171 -> 155 bytes .../textures/block/end_stone_stalactite_1.png | Bin 181 -> 168 bytes .../textures/block/end_stone_stalactite_2.png | Bin 190 -> 177 bytes .../textures/block/end_stone_stalactite_3.png | Bin 186 -> 172 bytes .../textures/block/end_stone_stalactite_4.png | Bin 199 -> 183 bytes .../textures/block/end_stone_stalactite_5.png | Bin 197 -> 180 bytes .../textures/block/end_stone_stalactite_6.png | Bin 214 -> 188 bytes .../textures/block/end_stone_stalactite_7.png | Bin 213 -> 188 bytes .../block/end_stone_stalactite_cavemoss_0.png | Bin 250 -> 234 bytes .../block/end_stone_stalactite_cavemoss_1.png | Bin 269 -> 255 bytes .../block/end_stone_stalactite_cavemoss_2.png | Bin 289 -> 276 bytes .../block/end_stone_stalactite_cavemoss_3.png | Bin 286 -> 272 bytes .../block/end_stone_stalactite_cavemoss_4.png | Bin 307 -> 294 bytes .../block/end_stone_stalactite_cavemoss_5.png | Bin 300 -> 287 bytes .../block/end_stone_stalactite_cavemoss_6.png | Bin 327 -> 310 bytes .../block/end_stone_stalactite_cavemoss_7.png | Bin 319 -> 299 bytes .../textures/block/filalux_bottom.png | Bin 298 -> 284 bytes .../textures/block/filalux_bottom_e.png | Bin 202 -> 187 bytes .../textures/block/filalux_lantern.png | Bin 273 -> 248 bytes .../textures/block/filalux_lantern_e.png | Bin 221 -> 208 bytes .../textures/block/filalux_middle.png | Bin 227 -> 212 bytes .../betterend/textures/block/filalux_wings.png | Bin 234 -> 221 bytes .../textures/block/filalux_wings_large.png | Bin 242 -> 226 bytes .../textures/block/filalux_wings_top.png | Bin 462 -> 425 bytes .../block/filalux_wings_top_bottom.png | Bin 214 -> 185 bytes .../textures/block/filalux_wings_top_side.png | Bin 291 -> 277 bytes .../betterend/textures/block/globulagus.png | Bin 250 -> 237 bytes .../block/glowing_pillar_luminophor.png | Bin 639 -> 639 bytes .../textures/block/jellyshroom_trapdoor.png | Bin 626 -> 626 bytes .../textures/block/jungle_vine_bottom.png | Bin 223 -> 198 bytes .../betterend/textures/block/lamellarium.png | Bin 281 -> 195 bytes .../block/large_amaranita_cap_bottom.png | Bin 258 -> 223 bytes .../block/large_amaranita_cap_side.png | Bin 242 -> 229 bytes .../textures/block/large_amaranita_cap_top.png | Bin 384 -> 243 bytes .../textures/block/lucernia_barrel_bottom.png | Bin 239 -> 216 bytes .../textures/block/lucernia_barrel_side.png | Bin 249 -> 236 bytes .../textures/block/lucernia_barrel_top.png | Bin 232 -> 216 bytes .../block/lucernia_barrel_top_open.png | Bin 227 -> 214 bytes .../textures/block/lucernia_bookshelf.png | Bin 392 -> 370 bytes .../block/lucernia_composter_bottom.png | Bin 216 -> 192 bytes .../textures/block/lucernia_composter_side.png | Bin 225 -> 202 bytes .../textures/block/lucernia_composter_top.png | Bin 186 -> 169 bytes .../block/lucernia_crafting_table_bottom.png | Bin 279 -> 253 bytes .../block/lucernia_crafting_table_front.png | Bin 329 -> 314 bytes .../block/lucernia_crafting_table_side.png | Bin 319 -> 306 bytes .../block/lucernia_crafting_table_top.png | Bin 258 -> 245 bytes .../textures/block/lucernia_door_bottom.png | Bin 258 -> 237 bytes .../textures/block/lucernia_door_side.png | Bin 212 -> 154 bytes .../textures/block/lucernia_door_top.png | Bin 257 -> 235 bytes .../textures/block/lucernia_ladder.png | Bin 213 -> 196 bytes .../textures/block/lucernia_leaves_1.png | Bin 241 -> 223 bytes .../textures/block/lucernia_leaves_2.png | Bin 257 -> 232 bytes .../textures/block/lucernia_leaves_3.png | Bin 257 -> 234 bytes .../textures/block/lucernia_leaves_4.png | Bin 278 -> 252 bytes .../textures/block/lucernia_log_side.png | Bin 259 -> 228 bytes .../textures/block/lucernia_log_side_2.png | Bin 259 -> 232 bytes .../block/lucernia_log_stripped_side.png | Bin 220 -> 187 bytes .../block/lucernia_log_stripped_top.png | Bin 222 -> 192 bytes .../textures/block/lucernia_log_top.png | Bin 247 -> 213 bytes .../textures/block/lucernia_outer_leaves_1.png | Bin 195 -> 179 bytes .../textures/block/lucernia_outer_leaves_2.png | Bin 208 -> 192 bytes .../textures/block/lucernia_outer_leaves_3.png | Bin 213 -> 197 bytes .../textures/block/lucernia_planks.png | Bin 248 -> 217 bytes .../block/lucernia_stripped_log_side.png | Bin 220 -> 187 bytes .../block/lucernia_stripped_log_top.png | Bin 253 -> 218 bytes .../textures/block/lucernia_trapdoor.png | Bin 249 -> 227 bytes .../betterend/textures/block/lutebus.png | Bin 503 -> 228 bytes .../textures/block/mossy_dragon_bone_cut.png | Bin 269 -> 252 bytes .../block/mossy_dragon_bone_side_hor.png | Bin 552 -> 298 bytes .../block/mossy_dragon_bone_side_ver.png | Bin 292 -> 273 bytes .../block/mossy_glowshroom_barrel_bottom.png | Bin 577 -> 577 bytes .../textures/block/mossy_glowshroom_fur.png | Bin 235 -> 220 bytes .../block/mossy_glowshroom_hymenophore_1.png | Bin 209 -> 179 bytes .../block/mossy_glowshroom_hymenophore_2.png | Bin 209 -> 179 bytes .../block/mossy_glowshroom_hymenophore_3.png | Bin 207 -> 173 bytes .../block/mossy_glowshroom_hymenophore_4.png | Bin 211 -> 179 bytes .../block/mossy_glowshroom_log_side_3.png | Bin 272 -> 272 bytes .../mossy_glowshroom_stripped_log_side_2.png | Bin 682 -> 682 bytes .../textures/block/mossy_obsidian_side.png | Bin 261 -> 246 bytes .../assets/betterend/textures/block/orango.png | Bin 205 -> 187 bytes .../textures/block/pythadendron_log_side_2.png | Bin 646 -> 646 bytes .../betterend/textures/block/rubinea.png | Bin 224 -> 222 bytes .../textures/block/rubinea_bottom.png | Bin 431 -> 236 bytes .../textures/block/rutiscus_path_top.png | Bin 238 -> 207 bytes .../betterend/textures/block/rutiscus_side.png | Bin 285 -> 260 bytes .../textures/block/rutiscus_side_1.png | Bin 300 -> 273 bytes .../textures/block/rutiscus_side_2.png | Bin 300 -> 269 bytes .../textures/block/rutiscus_top_1.png | Bin 248 -> 224 bytes .../textures/block/rutiscus_top_2.png | Bin 248 -> 223 bytes .../textures/block/sandy_jadestone.png | Bin 227 -> 200 bytes .../textures/block/sandy_jadestone_bricks.png | Bin 262 -> 228 bytes .../block/sandy_jadestone_furnace_front.png | Bin 251 -> 238 bytes .../block/sandy_jadestone_furnace_front_on.png | Bin 294 -> 278 bytes .../block/sandy_jadestone_furnace_side.png | Bin 244 -> 213 bytes .../block/sandy_jadestone_furnace_top.png | Bin 235 -> 216 bytes .../block/sandy_jadestone_lantern_bottom.png | Bin 196 -> 181 bytes .../block/sandy_jadestone_lantern_side.png | Bin 200 -> 187 bytes .../block/sandy_jadestone_lantern_top.png | Bin 197 -> 181 bytes .../block/sandy_jadestone_pillar_side.png | Bin 239 -> 204 bytes .../block/sandy_jadestone_pillar_top.png | Bin 254 -> 220 bytes .../block/sandy_jadestone_polished.png | Bin 270 -> 236 bytes .../textures/block/sandy_jadestone_tiles.png | Bin 229 -> 194 bytes .../textures/block/sangnum_path_top.png | Bin 225 -> 196 bytes .../betterend/textures/block/sangnum_side.png | Bin 304 -> 283 bytes .../betterend/textures/block/sangnum_top.png | Bin 243 -> 213 bytes .../block/small_amaranita_mushroom.png | Bin 462 -> 271 bytes .../block/smaragdant_crystal_shard.png | Bin 431 -> 258 bytes .../textures/block/smaragdant_crystal_side.png | Bin 249 -> 217 bytes .../textures/block/smaragdant_crystal_top.png | Bin 259 -> 235 bytes .../textures/block/umbrella_tree_cluster.png | Bin 243 -> 243 bytes .../textures/block/violecite_tiles.png | Bin 195 -> 195 bytes .../textures/block/virid_jadestone.png | Bin 233 -> 199 bytes .../textures/block/virid_jadestone_bricks.png | Bin 262 -> 228 bytes .../block/virid_jadestone_furnace_front.png | Bin 264 -> 241 bytes .../block/virid_jadestone_furnace_front_on.png | Bin 337 -> 321 bytes .../block/virid_jadestone_furnace_side.png | Bin 244 -> 213 bytes .../block/virid_jadestone_furnace_top.png | Bin 235 -> 216 bytes .../block/virid_jadestone_lantern_bottom.png | Bin 196 -> 181 bytes .../block/virid_jadestone_lantern_side.png | Bin 200 -> 187 bytes .../block/virid_jadestone_lantern_top.png | Bin 197 -> 181 bytes .../block/virid_jadestone_pillar_side.png | Bin 239 -> 204 bytes .../block/virid_jadestone_pillar_top.png | Bin 255 -> 221 bytes .../block/virid_jadestone_polished.png | Bin 270 -> 236 bytes .../textures/block/virid_jadestone_tiles.png | Bin 229 -> 194 bytes .../textures/entity/chest/lucernia_chest.png | Bin 777 -> 748 bytes .../entity/chest/lucernia_chest_left.png | Bin 684 -> 665 bytes .../entity/chest/lucernia_chest_right.png | Bin 722 -> 699 bytes .../textures/entity/sign/lucernia_sign.png | Bin 441 -> 420 bytes .../betterend/textures/item/amber_root_raw.png | Bin 188 -> 175 bytes .../textures/item/amber_root_seed.png | Bin 160 -> 146 bytes .../textures/item/chorus_mushroom_cooked.png | Bin 207 -> 192 bytes .../textures/item/chorus_mushroom_raw.png | Bin 211 -> 196 bytes .../textures/item/chorus_mushroom_seed.png | Bin 168 -> 154 bytes .../textures/item/end_stone_stalactite.png | Bin 1569 -> 203 bytes .../item/end_stone_stalactite_cavemoss.png | Bin 2103 -> 271 bytes .../betterend/textures/item/lucernia_door.png | Bin 211 -> 193 bytes .../betterend/textures/item/lucernia_sign.png | Bin 212 -> 197 bytes .../textures/item/small_amaranita_mushroom.png | Bin 190 -> 177 bytes .../textures/particle/amber_sphere_7.png | Bin 173 -> 173 bytes .../particle/smaragdant_particle_1.png | Bin 142 -> 128 bytes .../particle/smaragdant_particle_2.png | Bin 146 -> 133 bytes .../particle/smaragdant_particle_3.png | Bin 153 -> 140 bytes .../particle/smaragdant_particle_4.png | Bin 161 -> 148 bytes .../particle/smaragdant_particle_5.png | Bin 161 -> 148 bytes .../particle/smaragdant_particle_6.png | Bin 161 -> 147 bytes .../particle/smaragdant_particle_7.png | Bin 164 -> 147 bytes .../particle/smaragdant_particle_8.png | Bin 157 -> 144 bytes .../particle/smaragdant_particle_9.png | Bin 154 -> 141 bytes 200 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/betterend/textures/block/aeridium.png b/src/main/resources/assets/betterend/textures/block/aeridium.png index 359798c6468c348f7836da5675eeba6ad4dd9c6d..ad97e77876dc0d0518beeca80d1d33ede56c7a25 100644 GIT binary patch delta 182 zcmV;n07?I%1JVJIB!8JnL_t(|+GAiK0DjND_y1w$-v1250(1=^_8Ipj#2Wz9@PB$P z7=Ow11JfkA2Bz_5EgRugbLXaUKHij#Z#BhcK%n#Wk_{kRGjd`g k+h*h#p`T{-v_QxJ00PbBqJ^|aI{*Lx07*qoM6N<$f(ZFd>;M1& delta 392 zcmV;30eAk=0ipwtB!2;OQb$4nuFf3k00048NklAs=7>3^~I`o>YgM(rq zP!J1Fft%E~@KcIgggLLiR2pux`CrUbrEun)$7l(jd0w-6hBH|X~VBtEHgyhoG zZ@lk&pZD(l4meW#0TbMM6RQ5nF~MRo!5Hw;!RNc=tlq8R%kN>$mS_&|^MIIMZ9HS^bMVzS^il-?-~}5Pl%n3P zfmlx&(2fJ=9jy!Wi3!=Mx_iZX!A8si+A z!%-%vcq=T5aQ8YUNGd@>KAJe$=+EmqKE(h002ovPDHLkU;%=d2(<73 diff --git a/src/main/resources/assets/betterend/textures/block/aeridium_e.png b/src/main/resources/assets/betterend/textures/block/aeridium_e.png index 9a3ee876cf0a5428f55b87fbb9164160832a3cf0..e3a7da6fbde188c4ade6bc9343ddfb4a0de5cd06 100644 GIT binary patch delta 66 zcmbQl*upqLWul>mg|erMV@O3@azX=>o0zopr0FLVuMgRZ+ delta 78 zcmZo+oWwXmg^RH`$lZxy-8q?;6BV^BRXklBLnNjqCp0j*sj;yz6wa72k!695h^xn= h9jYFTA%-nZ3=9hA7&OzKo)csM0#8>zmvv4FO#q|n7lZ%+ diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_cap.png b/src/main/resources/assets/betterend/textures/block/amaranita_cap.png index d01c8f756eb4cf0960a5f7fdd37ff326319afaf1..6b7fddd10cacb5252e2816356a92a021cdcfad70 100644 GIT binary patch delta 139 zcmV;60CfNR0o(zQB#|*Ve``rZK~#7F1;K#lk3j+eAqWBmN&o-jMcqzC z3}OJxOk_%$OCVo$(#jlIP?bcEkFY>>+e|+!67jQKs4AVY08vkRBVY~i@1ilR-yGCm zjJ$zcWUN6-ZT56tXgl51X1m9pEd{HQ)64X&L}%E(W4%IK3B1~|lAG diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_fur.png b/src/main/resources/assets/betterend/textures/block/amaranita_fur.png index 018aa0bff9351b2ca245dd95bdf21bd1494db50d..e735e76db1860d6d7415060ea63d5c6655527ea4 100644 GIT binary patch delta 108 zcmV-y0F(d00kQ#*B#|*JVogazK~#9!wT!tDz%T&9gkb-fQ#g0d0--}Z7!zZXB!;G@ zsWDoaHMLf&18Z%qQUOa{OJxN*1_v-;W2`$dY``%ux%dP2>D?LU^AA1JGyxh{<8ZA2 O0000*nj2=&S;4AYi){hqXY)<_^dN2RJy-y~p*~t>O>xC-;8C b+4+Yq(lh}YAqQ*Y00000NkvXXu0mjf(snZL diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_hymenophore.png b/src/main/resources/assets/betterend/textures/block/amaranita_hymenophore.png index 20df36d05e340dc21459e5928acdde008a29a5a4..c25e3b085144cf9556841708aa5edd2aca75d4ff 100644 GIT binary patch delta 117 zcmV-*0E++T0mA{1B#|*RYgS1_K~#7F1;K$0z(5egAX44_BfkrG-oCy1@UBCWuPVo0 zSdaq{;l772V0J-ld)Q?pV%}jO;NUA@+d=S^)={BI4ln`t6{9g+nzhUx7d#7a^dU0* XjS)ODMTSON00000NkvXXu0mjf!ErF@ delta 152 zcmV;J0B8Th0p|gbBnkm@Qb$4nuFf3kks&vKZAnByR2Y?Aj{yq6FbD%{O#J_o7qw%s zLPZWu;vtbLCg_LKafRekVul)IaK<#<2f8$<2Big{&J0R!t3i2%F~5~_G>8j7V8;dC z8=wZI@qTTia|C`l29(won}cV1Qw!=w2d={lqSyC)g9q*#1DPf06n6js002ovPDHK) GLSTX++dP*5 diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_hymenophore_fur.png b/src/main/resources/assets/betterend/textures/block/amaranita_hymenophore_fur.png index e3f12d2633379c726f7baac840f8bddf4503f551..8148cff505f8550140bb658999b14bbde8cd4974 100644 GIT binary patch delta 76 zcmZ3+IE`_F%0xp0CtXh$$B>F!cMl)rJYc}UZ1}t8X8qGWTyqtfRAnxPwyXJAho86N gm413!=z+QZ&I$euGgjVCJInwCp00i_>zopr0DT!9iU0rr delta 90 zcmV-g0Hyzy0j2?vBnkm@Qb$4nuFf3kks&ihFiAu~R2Y@rictyxAQZxU)9!!e>?7z5 w31cvnSRwJ0TEfZrgylL7X1L&9;6Xoa1CUPun0H^n?*IS*07*qoM6N<$f;?{|C;$Ke diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_hyphae_side.png b/src/main/resources/assets/betterend/textures/block/amaranita_hyphae_side.png index 40d6f6a2716887643c4e054719c1b032ca3e532d..2f4f4f6334425ac2f3222feb6d665cc21f763897 100644 GIT binary patch delta 113 zcmV-%0FM9K0lNW^B#|*NXHrQ-K~#7F1;K#Whq-=@c+#x-r7Ao-qlgw;74hF%}W}v?0QNZp1J_ TOF%!z00000NkvXXu0mjf(bz01 delta 142 zcmV;90CE4j0onnOBnkm@Qb$4nuFf3kks&jAWJyFpR2Y>#kWm%@AqWCd>Hb$=;MquTXP-3N4ox^sd5pknsf=6BcBdi{C*%4z;$CyG~43Bn> wcQJ&{)`$gfIqq+(_lZGLF=}nQbBxpneAqk#aF(&S9{>OV07*qoM6N<$g0OQr;s5{u diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_hyphae_top.png b/src/main/resources/assets/betterend/textures/block/amaranita_hyphae_top.png index f41856aa0d50d75d3c2c87def87a8a9279a3816b..e236e4d2c69f467b9ba86a0ff588886b436756fd 100644 GIT binary patch delta 139 zcmV;60CfNK0o(zQB#|*Ve``rZK~#7F1;K#<05A-KFwp-`UR}~QNup_z&|(zO2sVnM z5p_*`C*a=1MqdyVl?I~hf^kDv delta 161 zcmV;S0AByx0rUZoBnkm@Qb$4nuFf3kks&*Oc1c7*R2Y>-PfHfWFbJ}I%>8dXVy3TI z6iOsuQG19>P?EdbV$f0r&l%o}BlICN(?&1?cDh@`do3B@YvENy+OZWTYyJW8dB72f zC3BG~s5d`zvDRYj`QBIy;b+=9u}Sy~_uu1J-a7F$mgkU{S=8W)NTrGieTCQ?|Ie3J!MaTCoC=XgWmD;32h>!wJl5ow5l7 w?8jj;9Glm$QGnzJHcW<7m}zcNMi?u9)Ll8L@7BCI00000NkvXX1g=70f^j=KivR!s delta 169 zcmV;a09OCo0r&xsBnkm@Qb$4nuFf3kks&vKen~_@R2Y>dPeB3zK?ou0|4&|K=Tb=+ z45>Y9cI~-^H0_7C4}~nwh{0PGMrz1e1e0+sq33nC*Z_`5mD3$emOk2zkPWe1SMP1m z={ZK&-a}wDQ_#tR%i6{_kk|e=Z^SdgJ z3#hvab=OGQ>;c)lLOQuZ9leBEPPDGv2>M1!*&F3=1&(Kilkxz{_qPv)o&fcAxXf+< O00000EGXx0mlK5Bnkm@Qb$4nuFf3kks&i?QAtEWR2Y?Ak4X-|00;tE{QsMa>7iI} zLvW(Njy$ySO(>Z<5ItR4?gpqCvjT*>0EW8|gV>28P)Sn=mqhlJWIYQY8 diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_stem_roots.png b/src/main/resources/assets/betterend/textures/block/amaranita_stem_roots.png index c0054b6451994fb6c768aba8fd786b3e74021302..f7317e513d685deef39b37a30f62a9359fa30c12 100644 GIT binary patch delta 114 zcmV-&0FD360lWc_B#|*NXj4fBo#T#?z%w(05@fy$ z2D=2w4+3_>gtjXWtz=~@xq|Kfd-5H%HLMX@;~J$#OefM({EJg|!a UVBteC6#xJL07*qoM6N<$g7l>@LI3~& delta 129 zcmV-{0Dk|x0nGuBBnkm@Qb$4nuFf3kks&i|S4l)cR2Y?2jzJQ@FbDz#{r{T_X*yCT z7uL91rD8Y1W__igH$l|J4}kiRKxAej7u`o>3$Vn3+6^GO8w?`psmoCg}} xpesOXNhNCzOmNj)B(AufaL$~4hpVI(-~%Y(0I0D8Pq+X8002ovPDHLkV1o3hCFKAB delta 106 zcmV-w0G0ox0k#2BXJ=tK=u~4@_62w3Z!enD`{{P|>yOZMjqZ2a%_+y+O-e*6E zA-i9(&zdAAN6T(-3|Dg! diff --git a/src/main/resources/assets/betterend/textures/block/amber_moss_top.png b/src/main/resources/assets/betterend/textures/block/amber_moss_top.png index eabd119cd57d49b3eac14e7d15fac2aea0f71696..f4ca3917a4c2dba136fb56545f896244217b5a22 100644 GIT binary patch delta 28 icmaFQ_?~e>8RM;q86)Gw@(h8Nc_%CwfWXt$&t;ucLK6Uzkh>GZx^prwCn{PnNlcv>tuJ7!>2RL`2s~Z=T-G@yGywo2q74lI diff --git a/src/main/resources/assets/betterend/textures/block/amber_root_1.png b/src/main/resources/assets/betterend/textures/block/amber_root_1.png index 1e597f1b94d0cb6344a8f33aa5ae5a7083d3d423..7ca89b63d6bdd372a63544cee8b29af2daad9886 100644 GIT binary patch delta 100 zcmV-q0Gt290kQ#*B#|*RT181jK~#9!t&BMmz(5SbWEAiJpPXWI%s6c*1qlAj@c|Ct z1j)Fk#(ni`HV@dM6wuz)E^S}Y5;Q0Bnkm@Qb$4nuFf3kks&u-NJ&INR2Y@5jzJQ@AP55`5&r+=8mKx$ zujRNK0%QC)^8?rbI{?}`tgVONX5xS<%CvKbFlcmMzZ diff --git a/src/main/resources/assets/betterend/textures/block/amber_root_2.png b/src/main/resources/assets/betterend/textures/block/amber_root_2.png index 6101e3206269ae4fa29adab3ca7a756a411ddab2..1a05d5f951ef01f2d270138324d5d036f01ea66e 100644 GIT binary patch delta 120 zcmV-;0EhqO0oDPKB#|*hZdpl0K~#7F1;GIhf4yH?qkqA#d-T}BuQ>TS&6`AL?3|ID5v3Zk#SEq@dhv<5u-PUU#mI#P tAdsKZVT9zUt_p>lf-2ftvQ}749~>M4sDZ92LI3~&07*qoM6N<$0fJDwLgxSg delta 152 zcmV;J0B8T~0s8@vBnkm@Qb$4nuFf3kks(WeZAnByR2Y?Aj?or?AP7T|!3zEV{|!m& z6b}~%V@Huyr~K;hk30{z&%n*_Zi~?0_2^IVeLZ^Y;M<&ft!gLH89QgBX2f(2*=7dQ z6@BVr4y;Z(w;4d0;s2fuMhwL002ovPDHK) GLSTZk%tST- diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone.png index 2b5fec55c2f35386948274cbb0d54c84d3a62da8..b77aa3144e2a01f5bd69ebb05b8e13c269d1fe40 100644 GIT binary patch delta 121 zcmV-<0EYkR0mlK5B#|*RZ(2!2K~#7F1;K$~1R($fAx8hwf5mQ~UxbCdbwOgYN-$*f zEi*e|^~cP1W9edgCybJTF#QTl_EtABL-slbh|$N}2^RWna}Hj0qFsdBnkm@Qb$4nuFf3kks&vKZ%IT!R2Y>_kI@#uAP7Pcb^rg#6Re&2 zV5Y(?RChlUo03RJsb85)L{Jf-ViJ00rI~i-0x8vDuaP~-jIq(;dPJ;+DwKKBnVLAn zT6hMoz!GD-53-%12a;8Xy4aD@E~CN^>J!G@=Z*{ZZ~Qi1;P?Yu^RON*00000NkvWt IM6N<$f>qu`(*OVf diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_bricks.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_bricks.png index da7292222269d150c5bffb06c22bdb8f8730eaf8..7dd9d794b3587b59b61eac60c73c2754193add77 100644 GIT binary patch delta 126 zcmZo;dcrtCWul=^NxY|vV@Sm<*)taf4;k>d9GuRlbD4ol)a5#Z&l&s2Jb$-0_3I{7 z)=xK_=Og=S)v?gX*y_i^8%z_*Wci=Yty~?FTI7{nDR}XQ5|jMC4-dKJ_x)?vulaEZ eL?pRBe9fLXO*ElJJe!#T2s~Z=T-G@yGywn~YBZk! delta 159 zcmV;Q0AT;*0fqvQBnkm@Qb$4nuFf3kks(ii32;bRa{vGi!vFvd!vV){sAK>D0AEQ& zK~xyi9n8TIgD?z5!AA#@(*PnBATJik0!osEpvO>eGR{vA8=rbfH5RI&}RHUFgt-4qfQb#f&E72Vs^KV8YCd?*IS_ N002ovPDHLkV1hB|LXQ9d diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_front.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_front.png index ed2140214b132a72e3574295141b0324ee2dae3e..85243b6b63cce257f0810e6c1b2f4b0d4a8d15af 100644 GIT binary patch delta 151 zcmV;I0BHY@0`vipB#|*he|JelK~#7F1;GJs!$1tcFzMoML;wHS7D%j-^KLyPP^X<@ zgM=_B!DNsQG7|=kfQx2|wKmfuB&+Xj3?p}Ku zg0QTR2^tx8TymTcx`-#Pm2=6FbGQ0%ESNv;9=K| zyF}p-lhvlW-GLRdEQ0(Vgsjy1BV;LDmY`TmSRJ?b33ilbgyKHeeP3s@8p|jSALSLG zpTn57EDsczell<_#y=y@78LeTcASkjvJ{1B#|+Ee~d{)K~#9!J&en00s#O6qjp(@whQL@|6kgJ(lB$GL$Eqq zx2;)?#LXFwh)nNqQqi^S?=rpc-&vHX3X^McwX1{aWf}W^zpo|pX>bk1m*k% zfa|Pk)NI=(NnK;60KZ{{i2?!y(C3s?B*|ort=;CWU2DvCVlA;9BB74$a86#PXP{uFbG3EV@&RDiO|CT zUwUPlYuKO-l+7x^sw^QXVo3yWpAa!+|3kzm&Lo3sb%vF?^IErUy`&T*IF|h!40m{HOSHfl@tC>?Lx6jaRQ5+Ob50MSA6dF3 oRA~gW@RH2_it<807*qoM6N<$g423WLI3~& diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_side.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_side.png index c200ae968a4290774b2ba9074746cbdc826d5f10..d6f4c239874e10d407141d4302eeffa5f22dbd48 100644 GIT binary patch delta 135 zcmV;20C@lO0o4JJB#|*ReP~HUK~#7F1;K%F1R($eF_~l1f5Xp4x_`YL4Rw0Ayl7;( zPle#=?&VwFQSa-XY}VE|UD~q-=@x1QTsC7+yY>cQAK p7uSy|Ppq4jJ#ET;Z^Z90`3FADRUxEAR(Svb002ovPDHLkV1kA`J|h4C delta 165 zcmV;W09yam0rUZoBnkm@Qb$4nuFf3kks&vKdPzh#Pk{}l<+0_~v52Yc<_rOEB_74v=o<}nnOM6gjwPdZrEKOL*VN~oz32`RVcnP}=1;|?V z^+!^d@#$lcx1eJ>1-{U33=DS1vdTwzRhQvcmp>H3L}? T&7AQ000000NkvXXu0mjfozX}# diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_top.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_top.png index b6c669bf6a71ebe28a671faaf05392e46908bc11..097f9402d1c7d49a8713597a77d10f6e14a47975 100644 GIT binary patch delta 139 zcmV;60CfNB0oVbMB#|*Re``rZK~#7F1;K%V+%NzHAy%iP|Awu3xc_@Q8tU|JdC|yn zp9;a#-OF!zNALZ*C!4jk)9KQlHAuHmE8wyjgW9zQVdGBU0KL=I(U0KFP4kZ7>+B|{ tZ^x6mXYYOV;9tAtcQjPFPemisAIT$HC=p?AhyVZp07*qoM6N<$0fJqdMV-PYDjdAPlM;{r{6k)l3p& zA<(1RRJS{@Ldqh@^AJ+`*N>1=xGX_pDpbd9#~YDoMu?H(xVRc+Omcb#M@TyG05g`@ z^%m*f3D=>}f&4Mge#cr6I*w<)=sPCtMR>U%0mK22Bnkm@Qb$4nuFf3kks&ukh>GZx^prwCo0-7Nlcv>?<252SNaG85O})!xvX4fItueK^YeQ|6~L8yi_To4&XR`rO8!4 z&?ZUE4XN$1(F<*Y7Q`KEgHFs2nMhcyTLb&3kt7xvB+%OUm=nV>0Z5eDXG#D7002ov JPDHLkV1ku_DaZf- delta 117 zcmV-*0E+*$0mT83Bnkm@Qb$4nuFf3kks&u=OG!jQR2Y?=jY$%~KnMZ{Q2+nrkj?R$ zP#&bEaIIge%zN~LvM~`K;8hBV*x<|%4N?`t02S%{Ohf{7rr(O>EcI%!f$x{?j*mJ3 X!!ZF!57n7%00000NkvXXu0mjfU&}G@ diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_pillar_side.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_pillar_side.png index 5a56e8e46c28e926df4d0b70d7d0e42db02a713d..6905d1b7e34798d3151b117d4d937002585422bd 100644 GIT binary patch delta 102 zcmV-s0Ga>q0n7oAB#|*pTt`VnK~#8NZOyR_z(5ECK#!1Y02_b;{ipE$E5&)**U89* zB|sZ^Y~a2I7?KQd$;$D07ywh zK~xyiZOyR_z%U3z(Hp_p05$*xdb_y&R|+;Mt*4JDkN~COm4;_D(2CQ*Sr#X19Jj^) p7|F1Orm!T!X Y3kk;)xBtvB-2eap07*qoM6N<$f^n%a%K!iX delta 151 zcmV;I0BHZ*0saAyBnkm@Qb$4nuFf3kks(ii32;bRa{vGi!vFvd!vV){sAK>D09Q#w zK~xyiMa|I-fG`LI(CY@=2A!cSP$f=a-G3DiOk<7^K3+InvvMG;LJa!?G-_yRo+Tx- z+y;LER}2m7N`;@0!x54g`?_pv#XDcD`1KK oV)~q1W$s|kk;7UWdX!WTK0!YeGzSkaH~;_u07*qoM6N<$g0iwT{r~^~ delta 167 zcmV;Y09gO*0geKYBnkm@Qb$4nuFf3kks(ii32;bRa{vGi!vFvd!vV){sAK>D0B1== zK~xyi9Zi7^fFKMj`T)oSG9CbWg7E-F|9{2KElazt-Eh7h&w;ra&2kqZIaZM@ENjD+ z5dXYsU8)_EER}2`7O9dZ0U<(@!cn!l*@a`r6%mr3nBHf1nSU_X=)+PQdXg0gA3;A7 V6f}VsQ!D@g002ovPDHLkV1fu8J~aRU diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_tiles.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_tiles.png index 9f3d014a43184e597f4d868749e40a69227b14ce..52ba752aebd69eb05f753daeaad5a2864102de9f 100644 GIT binary patch delta 46 zcmaFLc!+U=%0xpSc3V#u$B>F!6K5JprY)Fc$>3=#{?<{;btVH4c)I$ztaD0e0swa! B4=(@! delta 79 zcmX@a_>^&i3KwH>kh>GZx^prwCo1~Oa29w(7BevL9R^{>zopr0Q68A0RR91 diff --git a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_1.png b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_1.png index cf43a7852667b82b497f14f8420b93e91457ad5d..0270aade2a1dd35a9656e253c90a3a21b52123f5 100644 GIT binary patch delta 142 zcmV;90CE5A0owtPB#|*Re{M-cK~#8NHIKm!06_=>2SoZW`5x}Q5CW43*a2LpngwV| zlg6{donY7A0qlmCub^=avQy72PLs~8ot55J+MyYzTtO>zcsKU!%>MY;(n>#`lvhZT w0-zn~@X#1W;_y#q8@ur_?90#J-;fhNjg120Awg@300000NkvXX1g=70g6{7@b^rhX delta 158 zcmV;P0Ac^z0qp^hBnkm@Qb$4nuFf3kks&vKb4f%&R2Y>lkHG-|AP53M&HYCX)JKI1 zR{@A9Xz!?IK1p=7R&_REU9!?YKk>bX)a#K z@O4fvz9ymc;g!J|CheC(NI3>S?*Lrm413En+G`j-+~0ctJ^dkmjg1205_JmQ00009 M07*qoM6N<$f*_AV4*&oF diff --git a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_2.png b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_2.png index e4b4789c2d06d9563e405d04302d1dd2e2c940fa..232ab77d00a7cd0e6df3d499b3dcae058e6e4670 100644 GIT binary patch delta 157 zcmV;O0Al}-0{#JzB#|*le|;Qxb>fJ7jTojrhBsx^BH z)e1?ITOg@G_3I7PG%(5geRhvn?e68hn}MX?%-m8p7W?_Vog1cFNqui`_ed&WGIKN3 zG=ODq_lVU3Ft;=0+XQN0XW;XD7OZx!ChsMHO~9%NKpG1+7Wf0V69WS>h|q9N00000 LNkvXXu0mjfpddtI delta 172 zcmV;d08{_|0gnQZBnkm@Qb$4nuFf3kks(Wefk{L`R2Y>lk5K}EFbF~sow@FR;86Rh z(7_u4AOm_QBh8N_GEz@u(2rwf`;zRrRg5ie9BZK?z{q+Z7egpzq*!&#CUI$|bcX8` zkdPX`VFAqZp1G5-JGYt;m$ zqyt67EChF2r20WC8HtJv^W%Us8|0-Ku}t^2Jjzkx+9^>ur8zuiXZk~j$x$$@t4kH? z3AccgQtsVd#SnAhUaEuG#a^xYbNq8xT)~xFu h!H4sQ-@ottI{q@P1PmR4!?6GW002ovPDHLkV1f)SO>zJL diff --git a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_4.png b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_4.png index d630d233f141540d37ff761ca235a95421b24a12..99bb6a69c21ea72132b8dee7afc9899e2bddc7d6 100644 GIT binary patch delta 162 zcmV;T0A2r+0)qmOB#|*le}YLwK~#9!HP1l~127B%!8Il{PX7Pj9@5?{ghm*U3@CD{ z7eE|h$ER2GPLQ(iG$6&ie5N2)1SL7@UdXZ2y(F(HkRsJRhq&e7V`uKnsmJd-(mr?3 z`SCNV&zy75<8kPs$^J Qk^lez07*qoM6N<$f?-ffQUCw| delta 176 zcmV;h08jse0+RxeBnkm@Qb$4nuFf3kks(Weg-Jv~R2Y>lk6RW+AqYb8Q8#S<^Szko zqePOu41jw=_x9WtOA4L#Q3DOP#Q3iwucz1dXti~%wEFXZk1+3 zugL1~CCdgcwEL-hSRbBr`?2cQ;GtNo!^6S%rmz*_Km6MR=pNs|tg+;~Aj9Y)pZ9bd eKmTrrY~mjfhy&~1rgTF90000M3C*^y z$@)R%sTlG5<~;nU@%0gPf~S^@+Ik{Yyg`N2_>!)*#@fBs$Q7sAsV*~C9M=&h`tP_T pMC~1f9&KtL)|4i2dnD2d(+iiT0Y5FKY3Tp}002ovPDHLkV1mA4K575} diff --git a/src/main/resources/assets/betterend/textures/block/cave_grass_2.png b/src/main/resources/assets/betterend/textures/block/cave_grass_2.png index 493e7c0fece7f4212c9c0ffed932a30e8f813bad..dde241fea887bd7406355d8f3feacf0c856d388c 100644 GIT binary patch delta 114 zcmV-&0FD3C0mK22B#|*VXj4f1F>EMkEyK(;{Q19dk6 UC#{7*RR91007*qoM6N<$f-C+rs{jB1 delta 127 zcmV-_0D%9*0n-7HBnkm@Qb$4nuFf3kks&*3RY^oaR2Y?&jZqGOFbG3S3wZw--~@Fy0ViNRA7%gm002ovPDHLkV1kb2F-!me diff --git a/src/main/resources/assets/betterend/textures/block/cave_moss_side.png b/src/main/resources/assets/betterend/textures/block/cave_moss_side.png index 1e07e4c29730f5cb009eaf8dd204d66acaf78534..97aabc14c0274eccd386b72bb6a0a9b577e0a311 100644 GIT binary patch delta 177 zcmV;i08amr0)PULB#|*Tf00Q>%=wVPaXCF&n5zCnOk+ENYw@PGteK fCmvKRI)%dzFl|t=9U}DT00000NkvXXu0mjfn*>rQ delta 192 zcmV;x06+hL0+9lcBnkm@Qb$4nuFf3kks&#Ml}SWFR2Y>dO$m-gF$lutY3p+T>kj>s z7!?r2sk7UCd-u+CVXKH|i-=rfr@HRGG0VctoSJ`v$BRA{Sw(QVt1glOokgyBbpu6$ zkwF7PCs7$)*~saM+@J;g70P!FB!I9;10*L!VNeKlS4BY89PA4JjH|FIv2%zMtEm|) uob)Gxht&N8wNIasg4^4Kj-Sj7`u+g3(+0k6Pxpub0000Df zTamXFJG-lfuEl~qKQ2)C6y8N^2)Od@uNj{yz>HnL{#$g(PSE1MI_lkrb|6Q zeM7))YW>Eut&LS)I+`?5-{6i*v<9*t`eP iqAyEG%Jn868p{WFumpnxq;;eK0000}PQ|U{1c}auPQlK@rw$!BbLPa61810?FfcILFvylJOSr}W1fH&b JF6*2UngDG?6^#G@ delta 43 ycmZo=oWwXmg^RH`$lZxy-8q?;6BR9(B&JS`mJ*mVX}>-L5O})!xvXh10fhmOBnM1ML_t(|+L1UNJqOVs{_#1d!F&)6G6>ngJ)Os}8w%3^!XSRW lZ~6Z~tLXp87Qp0S002BIKHk!LZfF1i002ovPDHLkV1gO-AlLu^ delta 111 zcmZo=T*^2>MTD_9$lZxy-8q?;3=9nMo-U3d7QGX-WdrJW{(f4|#>Uq6xY+Oi|FZAD z|AQFu@teQeZ)&Wz>Q6KmS@!V9oXh_uB_t$1)t>&(9_9MqeH()sJ2Qigw%xs~?bE*l PO=R$N^>bP0l+XkKL6a|3 diff --git a/src/main/resources/assets/betterend/textures/block/chorus_mushroom_2.png b/src/main/resources/assets/betterend/textures/block/chorus_mushroom_2.png index 6f2313fe5ada9015bc6bd3e438b5fcb321a730e0..dcd8ddd972d7fac5fe7ada0fb510b064371dec90 100644 GIT binary patch delta 115 zcmV-(0F3|f0jL3xBnNLvL_t(|+L1UMVIUf05Lt$p=ve*-VWJej-2D=4BZ!8H<@=WZ z544K@kM5;CoyV{n3Ue|DgZPd9)Bh(p=Ke>v049eOfNVo{GROrm13&=8Ms^Vh005({ VQZG$g%P9Z=002ovPDHLkV1k27FTVf) delta 189 zcmV;u07Cz$0r3HlBoqO2Qb$4nuFf3k00021Nkloc_PQW-EDynCMvk zH_@@gtCFF(TPFLSdzh|+=>yVj|JH|(XlBEk3ZdGICJGVBLf2i r!@GYE7?3SUa30M4|MBNL6fXb(Nkc^$mCpLa00000NkvXXu0mjfdQn<~ diff --git a/src/main/resources/assets/betterend/textures/block/chorus_mushroom_3.png b/src/main/resources/assets/betterend/textures/block/chorus_mushroom_3.png index deb23ea564e6d87fd28eaf8207082ac8466c9a1a..5cfacd081df93283bc5fee1bb0ee2f6ba6232a85 100644 GIT binary patch delta 183 zcmV;o07(Dr0@DGIB!8MoL_t(|+GAiC1;ZVzui5&4Vdkd)Bx^iA=k))VyI=nQcK17& z2J!cF9{W#{0oPaF0UH3*3~~+0E-}%u{13wDUczt@%*p6}4z!9!F#zTz3>P6g8KeLv zp6^@!A7lt}n1I+goeWa|b7G_a^#2Ktx&L7npnC}ez?=+n9xw=l3;?+TCJ!hB!2;OQb$4nuFf3k0003dNkl)YQ9F6CAj>X~qv{O;Xn1_lNOxaQBF-xKcw z7%3{8ChWP1zj0_A646=Mm z439tEgB$3c=)~~(-Y163=kCH?#DeT(m;#3B5HUGn83qOh28PLVCjD2EmxFr=IV@Nh z7#J8VQ%o5d7#JA7-TnUm-or->$LE~>|Ml%}hNH(WGJItJ2DiYwFaX1wD1jIqo5GMg zA&=q3gI91T@=Eh?F<7RUGHQmaFzSe!Fv#*Lp%}n|%z-&Mu*I8^fq{V`-?#k#$1mUD j@``*~4EH}>LoomV8OnJ*Z>Wr400000NkvXXu0mjfv`3*@ diff --git a/src/main/resources/assets/betterend/textures/block/chorus_nylium_path_top.png b/src/main/resources/assets/betterend/textures/block/chorus_nylium_path_top.png index 459a3d637c68bdcc8559fc11c0ceded27b65341b..dc0ea52d69cb503b32b8556f0a2113af9f32086a 100644 GIT binary patch delta 29 jcmX@kdYpBF7UQjr+C5AHTiL^BGXR07tDnm{r-UW|lWYk{ delta 29 jcmX@kdYpBF7GvB-?H(op-j;G<1|aZs^>bP0l+XkKfNuyn diff --git a/src/main/resources/assets/betterend/textures/block/clawfern.png b/src/main/resources/assets/betterend/textures/block/clawfern.png index edb93e21c324087768840affe2eb2926b37b3a56..802143713694f1f855fa10633b45ab5bddd9915f 100644 GIT binary patch delta 139 zcmV;60CfNO0q6mcB#|*he``rZK~#7F1;K$~1ThQ)AR1fI=k_1CfVM3F+M8Pd^hR0$ zZSa1yZRri)d)j*wn)u$MKW?H4@E#hy0ltSu8^HHyXz&0xG@(GU+$^^s3z?80JCI3s tcV!oL&LlIFon2-}4GA+EK&TF^|Hb5JD{gDpd)vtnIezy_NT=frAQ z{c7|#fN5wu#G^dnyPdNErlhfR)CyoPLudH4XT!vg=7+G0Zh0000J;CLcwd-y*EDaC=Z(u4f+@j(zekY-D}ys{Is>VeGuUN1?=z)>i9^A>ax3#N2`NY; zzt0IZ>EJ{~(r*Zv>9jho{vI>N<5sLyCgl#LlJ~i)c&YHZTe|nRC70Je%j@i|z0TcR d`)ui4tv|9N2g{9^P`LmA002ovPDHLkV1hK)RH6U? delta 193 zcmV;y06zcz0g?icBnkm@Qb$4nuFf3kks&#MmPtfGR2Y>Nj!6OpF$e<9G9sA%|91y3 z8Vv=8N-TC2z$$f!YN42=BLO+00000NkvXXu0mjfw$f9S diff --git a/src/main/resources/assets/betterend/textures/block/crystal_moss_top.png b/src/main/resources/assets/betterend/textures/block/crystal_moss_top.png index fe47be27b08bfa81c43035d1473e2f9b88fcfe06..2e7a92625b7c76b40eefd3982d47144d64575d46 100644 GIT binary patch delta 151 zcmV;I0BHa40n`DIB#|*Be|JelK~#7F1;K#<05A{%F&y9hH*TV)ge5jfr_y#su6S2* zudI$1Zb-ZN9fo2gI=F#oiv`f3bWla^uw|?Fj0CJMGCL(=hiR#xLB8h}ttoCL+T1AJ z(kKmi$7Xv(iHT_wXi@H2YAn4Ah@Ci64IBUf002ovPDHLk FV1k#sJ~99R delta 177 zcmV;i08anZ0q_BkBnkm@Qb$4nuFf3kks&94hDk(0R2Y>VPYDtLAqYYa`~Qy@w;C-} zAea^vaz>;B%XTb`p|=hDtayk}8v)tOTaDxfK#r~=+^h!bDh6J`V7a0h^myMtqN6+& zWkI5;T%E3<%of_%CvpyZI~lVoZAoaBonn0?GZPhH|8OLvjtVRXU^cwv`8zSOuFh{9 f;dU1A?cdA?td0W`s3D6D00000NkvXXu0mjfOtwdv diff --git a/src/main/resources/assets/betterend/textures/block/dense_snow.png b/src/main/resources/assets/betterend/textures/block/dense_snow.png index 6ea9931268bf8c5493c81c0d8821961b54f4c595..efbdb3695b034bd6baf7fe3fab639a787d3fb42c 100644 GIT binary patch delta 28 icmcc4c%5-V8RM;q*xZwamfo?7+Qh*ac3KKd)MU6+C3X0l^Hzoj( otPRS7iAq=w)_uq0Pv*7`Z z?%B0O%3@yc*lWl(!38}Ez|aJ|Bqw4=TuA_FfZCt2QNsf9t@6v6M*D(ddw^Q}z_8cS zl5RMl${K3%cM^GK^PoZ0;yt-Usjg0I5C$6oPjS Rh}i%D002ovPDHLkV1nEUM&keg diff --git a/src/main/resources/assets/betterend/textures/block/dragon_bone_block_side.png b/src/main/resources/assets/betterend/textures/block/dragon_bone_block_side.png index 77cc55ca26fdef16bc660f44ea8d3660f9aee4fa..564ba177814a8eee9482bd128ab7cb4f8074e6fa 100644 GIT binary patch delta 123 zcmV->0EGXF0^tFWB#|*paa>76K~#7F1;McmLNO2pFz4y_gasf-3_!sM>|ZcJ3VLn< z66~Cx_t*1y+`?2;8XLme9a;O*Iz5Udk~!MClHLvmp-iL(pD)o*#%f|Wx(aF(Ve%%s d>DsRc3V$E299Fv+k=y_P002ovPDHLkV1f{KGF<=w delta 163 zcmV;U09^m!0g3{UBnkm@Qb$4nuFf3kks(ii32;bRa{vGi!vFvd!vV){sAK>D0Aoo+ zK~xyiEzZFWz#t4mQB*PjFafj~ASxLE5$``!6V%%~e92B#8A>u71SYAeDcO%}YoN?- zh^9QK(#%XCbD*Q^1B9C&m&VjcOc`;9E)17ngC@~puQ Rp#uN_002ovPDHLkV1gQ>JJSFF diff --git a/src/main/resources/assets/betterend/textures/block/dragon_bone_block_top.png b/src/main/resources/assets/betterend/textures/block/dragon_bone_block_top.png index 8e7c5f8557b270249d43a5ab80e1fe64bad1d940..3b204813991b669914639822ca5bb0dd1fd49811 100644 GIT binary patch delta 140 zcmV;70CWG90`UQmB#|*pe{4xaK~#9!Ma@A0#2^d=zzsD(g8@hl&;kl*6g2DK$~|uk z46c_X-y4%LrgOuiTN)nVu9B}AV29axIYJ@YiX$v5R2`q8BFVyMxk6+i6av(RxEn;O uBZgW|#o@bWX_N36&v|(K)8Zr<&kt{#7QFTAk(dAg002ovPDHLk0$_qu&N;mR delta 174 zcmV;f08#((0hI!fBnkm@Qb$4nuFf3kks(ii32;bRa{vGi!vFvd!vV){sAK>D0B%V{ zK~xyiJ&wT<#2^d6N|aCh+R;d}M!6U7KG4@}-PeH6YN7eW z8cAa5gbK5*IHp20?*xkqRmb0u5ac4n1R=Z~AQ6ttAhF!kV&KY0jgtGKqMh51ich*3 c`}@W`A8(r$yonRWSO5S307*qoM6N<$f{XM?=Kufz diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_log_top.png b/src/main/resources/assets/betterend/textures/block/end_lotus_log_top.png index 20536244377dd98c183e53c76b4e62591791fd4d..e30d7b3b89e519c3deb3b3cc527704d3e93acc98 100644 GIT binary patch delta 136 zcmV;30C)fP0rmlqc7Fi{!NCaxAq+s#F9>_x$jr`JD^QpMB1r=xDaHQxJxXmt`3ld9 zetzqa`&P@tDB?nM8{?fo2Iz#>FNr&lA2IzYB6GP@6WQiC)b;Yt1Hi{yy6P delta 136 zcmV;30C)fP0rmlqc7NI}jll^6F$@IPV7TweoRhb&0t>DH8>s;!REqnLNV1Rl%)p|w zn@~=|dwJilwUN6G$t)F!$w>~(K08<>IJpi;?l_Zh?8>1Itpi6~PRRbhxK&^= hQ!uyitONBL+zk6~F&i0ddY!@m1fH&bF6*2UngDnl9Wwv` delta 91 zcmbQuxSDZ-3KwH>kh>GZx^prwCn}n|8G5=nhDc29J)_9PV8C(MVL{3N`cGF_)+S6; v7y1~jHKnnODWQS$3ESB?h9!p#H5$!#8Za{So-^KJ#sCDKu6{1-oD!M<>(U_5 diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_1.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_1.png index 4e63ebf754c5130f759d7d819a97f1e1741242c1..ef7907656ba3ab909c12512ca79c753fc8ac4904 100644 GIT binary patch delta 32 mcmdnWxPozl%0xp;rixn=b1VhA;*Lo&0D-5gpUXO@geCy8D+*!& delta 43 ycmZ3%xRr5&3KwH>kh>GZx^prwCo0-7Nlcv>Zz&LZWbIrAAnkh>GZx^prwCo0-7Nlcv>?{ A0ssI2 delta 106 zcmV-w0G0o&0lEQ@Bnkm@Qb$4nuFf3kks&u#KuJVFR2Y?g%|Q+TAP56NXyN}~7W801 zLyr?Sh~yMBLhb@sK#;4@E~3E$Is$sK-=ct7X+ZaO;m!^=13t-t1#m6^^84aY0{{R3 M07*qoM6N<$f+0XB-v9sr diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_4.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_4.png index 61662aba97cce71efc9e805e65bb1486fb33c013..141e59ee5b58184568c97e12cf65fabbd26cea89 100644 GIT binary patch delta 105 zcmV-v0G9v90k;8=B#|*RUrI?tK~#7F1;K#HO=5!r z1W;&$B+s})`N|V2Ml-)D?EAkf4Z^6o8R}UnVH!SFfg#KVqorL zVt&qNz`=01IG-0g3=X5dol(Z7xNzu>~l^k|t0f34uZq0hB=kC<$!94?PhBYFIfW%ZXk;SHmzJ4;s5{u07*qoM6N<$f(BeSm;e9( diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_7.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_7.png index 086bb51bb62035719e708a466dc1532a4f6d9e09..e92f5a5a6d514c5fff58bcdea4e2a3423228436b 100644 GIT binary patch delta 110 zcmV-!0FnRI0lWc_B#|*RWKT&%K~#7F1;K$0z(5egAo9BXN3ILUd()&ojzI$)1}QjL z035+I;Sd0vH6U;vW(W>e*?6DR<72FG7+UkKjS QkpKVy07*qoM6N<$fbJudLqrEwpj zqhWT0?cpvF64m}}k!%fS&WL8^n(=0{Mqove1b`1+D*=-RL%r1i0000Ae7$3IxhUGB8$n@X_ztBe_-2b@UrKEN<&j0`bh%7Q4 zXT}&7u|EM}QY#D=sfZn2texIOWcsWkbFbMrmT5id)0AqWO2X|e@pB3Ji931v2JuN= XU0wn#U?iaZ00000NkvXXu0mjfJ_0b$ delta 129 zcmV-{0Dk}f0gVEXBnkm@Qb$4nuFf3kks)(zS4l)cR2Y?IjX@5;AP59OFrWhee{N$B z7VO?;!mkh>GZx^prwCn{DjNlcwMJ5ylocI|csAnwQ$kaARzkf$p+L)t6MM;~p9gwwDvlEhB o7f#6OT=oy1b8L5j+j}PfJccU+7N5#1CjbBd07*qoM6N<$f&v6L)c^nh delta 146 zcmV;D0B!$}0-gepBnkm@Qb$4nuFf3kks)(^Xh}ptR2Y?I&Pxu%APfXhe?S3a+zNdE zvo^`bMxEu;NHYLW5VSV3 zVInab2`aZPlA+*rL55oLvw!efBJ_Lt=J< zcgBD&++!|Ka~9#42uqaZoG}uP*67KUunz+BT+C0|>&zQ(Z16#Eh*|Xa<=FAx{05ke1_=M44sUh<0000iI delta 163 zcmV;U09^m30G)|E} z4goFz%m6qfW+!-S4Cul=<^nZm5srzlL|M)mBjIR`?w%6%y->L0TmYpEw@Q(M*zuqI2bhco2+^Vr RX?*|y002ovPDHLkV1h0GMsNTC diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_5.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_5.png index d6b2498c2b32fe72f3f4b4dec23d76ccdcc816cb..1e387a9f0214ebe95de6be6089f331bc2a0c5245 100644 GIT binary patch delta 32 ncmZ3(G@ogL%0$Cbrixn=SCj~BTDRd70}yz+`njxgN@xNA&vXnx delta 43 ycmbQww1#Pd3KwH>kh>GZx^prwCn{DjNlcwMyF}onT!cFV5O})!xvXB#|+2e~n2*K~#7F1;Noy!cY(ez}dwTc`yj{|38s5#t^l)_c+t& z({f&xw_YD;h!mZP29a`2&=W7Bnkm@Qb$4nuFf3kks)(`kx4{BR2Y>#&ruS?AP59d1&L`DE6DxN zTEw*c`DSN@lu`nui>QFDbOwN2N?G!U;!>8*2l58G^cP4OX@fXeyfb=&+my8QRG5`9 zn5Rgz_;pHhzi diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_7.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_7.png index 18e23b88bb8c04c6c13bff22363c4d7453bf5e88..563537caf07246458f5a043cc6a216febe6af475 100644 GIT binary patch delta 162 zcmV;T0A2sT0;>X$B#|+2e}YLwK~#7F1;GJI13?f3!0Kf%phN`!|3*br%q6#N)p+mM zwf*&)k8VbLZGWT%W2e1cdf6?E&$mi#-(YC^w0q0tRt!h7wm89fUa57q4=|E5dOoBu zFKO(3tcA7Bs&y))VZ?3^X{<7B`)9QQ=FX8-DloUpVF3-seIcrW7y&7Oe{?fZ1gFi) Q?f?J)07*qoM6N<$f}uu9DF6Tf delta 180 zcmV;l089U?0>1)~Bnkm@Qb$4nuFf3kks)(`iAh93R2Y>-&RY(|AP5Ce6$$c+*3SOd zI#}%tABKCvO-$*Y^%@=V{y<4<<`ubCob$kl+*IN%8`9{VMS6!9dWc(NIhDksuF6aY z#N6Da5gbq#HH}y|sF|v?42WCY%tdGc0xWP>ZaK%-;wHdUIA%0 ipl*29kP@vQ;2*xlnFZZ`ZUYnm0000N=QESmHM;AcDs zNbCx@65psJ;MOc!#Ha^KbfX$rg+wi$vi)Cj!nsTQwwcBSizNW-J($pz00000NkvXX Hu0mjfd*LeW delta 114 zcmV-&0FD2<0m=c8Bnkm@Qb$4nuFf3kks&`_NJ&INR2Y?=i%|-|FbG4_WG>$S#IqYn z2mKg(h$IgMe&Sw5rp>I*nI5NOico)4OheIvLIlJXgOI?1)x7!_&U;qU`^(M61&bvB U>zc1U?f?J)07*qoM6N<$f_=0w(EtDd diff --git a/src/main/resources/assets/betterend/textures/block/filalux_lantern.png b/src/main/resources/assets/betterend/textures/block/filalux_lantern.png index 04cb29e8135af2446c6c374bdd8ac5f69cb207b9..d217989cab2d7bc81691b8dc26f5e304c884c2b4 100644 GIT binary patch delta 151 zcmV;I0BHY_0{8)tB#|*le|JelK~#7F1;GIV0w55>unq_Re=mpDqzj1vK%{KHga}Zl zswYkwucmz6b8>*$6B^DWLCiZtT{#KDItWDrLWsn|+lVo8V}pPgF;cTb5P(ifFa)9k z1#S+Y_P*D;EAqYxvOWph5chTO* za~ej;L|TBE&J86CXH($~JlmG-2a!P+K>0G_Fei9GEKs-gzE$Z;)!~^_S947;vZfZB z-h`*hoDRBVNfjDdGsXHzUtZ!4jXP9i{0PZb{mIT^5wn<7c$aa43KwH>kh>GZx^prwCn`EHNlcxX94o-ax<-=$2s~Z=T-G@yGywoG3=I+h diff --git a/src/main/resources/assets/betterend/textures/block/filalux_middle.png b/src/main/resources/assets/betterend/textures/block/filalux_middle.png index 143f9c3b6bf18b01fbef29e3cb146fd141d39d72..2a7dddbb77c47dac62ef37f20d9b8b47f085d30b 100644 GIT binary patch delta 122 zcmV-=0EPeK0n`DIB#|*da9c@4K~#7F1;K#>z} c0Ny^}58;ymk(4g3_5c6?07*qoM6N<$f^mN@761SM delta 135 zcmV;20C@k@0pkIXBnkm@Qb$4nuFf3kks(8JT}ebiR2Y?AjsXt9AP57o)rtTA@BlX? z5)$Pk_C&k@0+PiJ??miu(I4?AC7o}wmZ}hOYJP)r-L=LAp7~s4%xj0RpfcKQsV9SI pu9w6V(2bQH2{o-C)QaBt)n4I~0g?6Dkh>GZx^prwCo1|dNlcxXA14su6(q(01fH&bF6*2UngBVj4Q~Jd diff --git a/src/main/resources/assets/betterend/textures/block/filalux_wings_large.png b/src/main/resources/assets/betterend/textures/block/filalux_wings_large.png index 98489441a58109d6425b555446d2f2088abf6da7..06ba9fd112d7bedf2d8fb2c4d75e92fa144ae2c8 100644 GIT binary patch delta 136 zcmV;30C)fL0pbCWB#|*derZWWK~#9!rN}vs13(PKz&=OP|3AEmv2bo?MF7)Sq?`@_ zY(-I`s4jqu#h9X;1AsGQnxYQ?06MA|@nfZ~{txA-&sHn~Bd2~<%~*q-M0xd#npxnc qPG4TEIRMzZNz=JoeA>G&{oEga7y@wN(Tj)x00000rCNmBnkm@Qb$4nuFf3kks(8WY)M2xR2Y?|PC*U?F$l7Nwf_IZgUw{K z_rb&jL@^>NMXUuXD~yv^uG{ih=$VVdsUAyn_$a(QVo~s(uwD)&6F+5Ek(#dIc#yF#=T6@X{jU6QaS);6^6VANc1~mf4j} zRn|GLEEVV~djvEzGgXaWr5Pe}yd(5LUOT~GrDcgVyViii-E~pMe*>Zjr^ailA=xv| z2J6WnCMBxTji#=Hi=*V-XkY|t2o2ETUDqXH?X4c7g`Nhdlc01pNCXp&?rEqSjad5y zVf~;OJt%g4Av{HjKO)6$je)AM8mUov!jJ!KV$@MmBdo4^uv!1t6 zUuMmW(16B%H|uG)L)aNjf7tyJnB{F?uE?2dn0*_$3<+9u1>c4CRG9K=Mcl>yXK`dX fzAx98+kdP-Kl}_k?x1e%00000NkvXXu0mjfW_F!C delta 368 zcmV-$0gwKv1I`1GBnkm@Qb$4nuFf3kks(KaL`g(JR5*>TQ`wHgKnUw_8TkJXUZWgs zlyo0fJE|%a7~6p7_4?l<$|JvISD~=J)add+qYF_>AMP)dqoW!QtUJcswBP_iLbKU_ zVR~dVBMmlnKxlXgh)`^VJ(4R+C|XYjgarSXHvSlHA9fBUX)kl9gg^#WQtPTA+9gm_ zt1)GxlGtgS1tInV0&++`_{?Hhe9fgdLf1i&I4Gtmy^2I^A`w@S)27L^#(7Md*a@k# z&6hg&H$=@Tk%&=pP^hC|8}*2SkIE!l!e!L^vbZBMI18$-%R1Lhm9prX+qypt)A4AS z*Jinjrsu*QEjQDkX;}j{^Q@x?sl=j-CCQ5pxs()=Nj6r-4)ldX#neXqXDcf8fbL4S%Y027uBFcu{3tj Z2tAk)0TP$tKwba<002ovPDHLkV1hJ$FdhH^ delta 146 zcmV;D0B!%d0oDPKBnkm@Qb$4nuFf3kks&L6Xh}ptR2Y?2j|&b1FbF~g?tka;>6WaC zRiBFO-5p_*gHs|q6Y=G}Y|rKJ3syH^1e}2#t^_4ka6<}$I}znFx0Ip7{1FLVHsuz! z7gpr`5k~%jICu}kTegt)Y+xw)Vb2QL$2%GS0hkd15?Bv5JOBUy07*qoM6N<$fwXE)m^CoCYZ2#rq>VlR>31&vp_YgQr_hO_UvBljtLF`AqWGj2qMS-zq_Do zjFOh20PGQFy6r>;1F|yn_))jWTmp_VOns|)hBHLmy$CHKLIfl%b~dklqDlZ;!MtcJ zW|{*~PX%aH;aVS9gi)5(1lL(eyLDHE#`=Z53+~pb4$Rr~cvi>Iqkp*HN8bf{g!*hF mn%)98mY$AZuhYU^y2}rfKLwFh?+?fT0000kh>GZx^prwCn^RoNlcwsoFz~wuKAP!2s~Z=T-G@yGywodN)9go diff --git a/src/main/resources/assets/betterend/textures/block/glowing_pillar_luminophor.png b/src/main/resources/assets/betterend/textures/block/glowing_pillar_luminophor.png index 37a98b9e9b400d87735da11d74e096604e29e60b..3f70581fb19f552915bb97ba94333c73f2bc6e79 100644 GIT binary patch delta 208 zcmV;>05AXl1pfq(Dgj=xE0O_!1aO99UTuezSBw7s?7+h~-ZbKCt8BQtS+a9J_kiW- zhD(*RT=PUZUe@D&jp|mqu+ojij65I05AXl1pfq(DgoNDE0O_!wm8EvueL+Vt3`i*cHm(gZyNEnRW{t+EZI4qd%$vZ z!==huu6d#yFY9r?Ms+J)Sn0-MMjnubtDxig5QAfAEqiH~#5}K42aZTqD&&RS-1?Pr z`JVGRd#ouWln_ECV=OAaIS+NS=v2V%vBEGllNC;zRWuk?1vX{H!DUlJ!*oneQ0GvX z@lGE`Y^wT4|*>n-~zjC~#+eq|rEWu*K4g{C57QVIVXxBmc1&(!U%5Mnm~0000< KMNUMnLSTXsoMA2i diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_trapdoor.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_trapdoor.png index da335dc492cb1309e002ed75a8aa1907cc748963..0961e9b16a19dcb690e3ce74cb60f22dee59ba6f 100644 GIT binary patch delta 578 zcmV-I0=@n61o8xsDkWY$QF(8g037A>E!(oicKf5pn%QcyOH(V_cFIu&gd!?q4^tr;9YmD zC|}Eb>G8Ik)H;W>B-rjn(@3|B2uVZq=6(bio`6v3k6F_>Vs3M~#oJy|)A3!NEYdCW zATP8YehSVMP{3ZMazuT;#i9H+`&3Zz76yMF-fwQoAe?dvw2RiHG@Rjimbi?NOmKlQ zhX6s9vnCos1_&{}QeS*mrVnAz7w4bRQmSd7Iut|5Bfn_5sYZYI zq@dse?&^(Y4sA!P?*^x>Cksv)S`S9i(h($ delta 578 zcmV-I0=@n61o8xsDka)IQF(8g037x6E!(oicKf5pn%QcyOH(V_b_!AjgaRsft&;(f zPZfVhr0T6CcU88%^M)pStK0FS)OU%FDY;9=_Jom7w2k+Is`#6lzhP`QqWT+l;9YmE z7+cSN>9Mw(QoDzgz}fCa%gD5iC_zE==6(bio`6v5k7?66D&FQbi?zL!s^MFjEHZ8L zpun{sesazfP{3ZM^O44Ui$jHP_9>^}%?*D%yx-hNAe=HXw9D3{GMwRgmb{D-#o$8G z90CMY#+rnLV_JMCsIt3+YIU|Qnhvy&C>}x)b-twxCt3drkT_Y;y-~S8iDszQ>Ji#7 zBYCUmsjFC7CiMZb1(u)+-v=Zw?FezU+E{#-rw?J!7w4bRQo3cJIusKTM}FCI(@lT< zq$J}4?rM*J;23CrH-zxJyfea6Tsr3)dHvD-)6h4wdjbjrxkMnqH`IsrP^WJf?; zqSL#)yAKG;Y<)rt&E*d?7@FD77WaR$MSwz81Vx66mJUD=`lHyq+x|v(ND?*}=c=eU z+ypcXia{#Q6#K;aMg+b^cZm}5MuQ2iR?r8*CgVjoB2+{2zYK^7>%w^c(?$0j=6Y zb70Iu(5x^#L_0uuP)DM|MNpVr0x@zzYF?fL^+0W?k$cmQ`g0!C*1C!hcT002ovPDHLkV1hOxIIsW! diff --git a/src/main/resources/assets/betterend/textures/block/lamellarium.png b/src/main/resources/assets/betterend/textures/block/lamellarium.png index 9f94ab456bd9b36edc6326ccace0f69b1b850404..e4d035b098c16948577d4d5fd6adf1d4afdb13ca 100644 GIT binary patch delta 167 zcmV;Y09gN-0>c52B!7xYL_t(|+U<}r3V<*W1n*}yDFtg=OaI^#?EQpa@gcsz?&Jak zOAr$51OuDmvOBkG_MZ=&Yg-(>0-W>Ys0mVTJBHCiK&s&|5s2BIdRIubF6IybAPQia z>9-LiPy(1~Q&Tcw6tlHUt`KdSJ#lF@%n<~j5M7i#ag{%<1t7q?VWJ-9CxEu({RU~5 V-OVYqsHgw{002ovPDHLkV1lzpM?e4o delta 253 zcmV4lh9>*nGQA%Xn=_ufl@zkV+^WiWZ> z=se%<2Yx;UXe;Gc2zv`KdFDc+R2oug5Bmr(dFI+m;d;KINp=$l0CnGa(3oa%yJQRl zb>CsNSPnXED+S)9iEo)gR5cdeQ&=huE|q?njl#4GYX(pX*L?>bUaXG?|4kGegHTvl z11_wARN6nlDcPr00000NkvXXu0mjf DbpvbO diff --git a/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_bottom.png b/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_bottom.png index 8db8ed8a20f339ac04e193ef3ba3ed9f2cb5dc77..99902f43637ae459861a3b08de4e627b1bf4e88c 100644 GIT binary patch delta 133 zcmV;00DAv|0^b3UB#|*dduB;QK~#7F1;K$~1R($fA=bD5igQlj0svf_mO;9<&06wu zZF8*CI-d(WHEXS_UyIJ(Tdr1W%D6bSdOEF3`_-Bm7sYn!E!SFaE7rP()e>A~$JbI^ nz4LCX^YwD++aHX$A`tioSO`@r@M+@Y00000NkvXXu0mjfg8V%v delta 167 zcmV;Y09gOu0fGXMBnkm@Qb$4nuFf3kks(8Wd`Uz>R2Y?Ik5Li>F$h9eSHax>!UfZ> z*33A`3!*;HUqohPC@Ufa@~v*@bX6MoO%epUz5r)vhDw*9IYZ20w-v#byfLG6fwcOR z1>uqaWdR$L7f7wU=q*WE*u}4b|L@(002ovPDHLkV1fYyM|}VQ diff --git a/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_side.png b/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_side.png index 95a1b9af484cac69365be7144dddc252be03f403..602d4c78abb6a69ec4101a9e4b2bcdc67258f663 100644 GIT binary patch delta 32 mcmeyw_>^&i%0xp~rixn=E3yQHmp%7m00K`}KbLh*2~7aUt_w^6 delta 43 ycmaFL_=$0X3KwH>kh>GZx^prwCn|a{NlcxXoh9J3`u_|DAnlpB!9X|L_t(|+O1Pd3WGot^B%4$cmmhGu-jfj=(ZOSynx_-N(LgC zyjM4MAn3d|FE5!-*WEE*eP7<=SiygMHLiK$BtT+&3>C-ptk5Fn03|sIycpo(Obv2@ zKnt}S2{g`JVQ!%_k~Iokg-Z1tW0#wlN%vehMt?||?DQ@CGrkn%r@-*5 R*nR*2002ovPDHLkV1nZ4VekL| delta 357 zcmV-r0h<2v0e}OLB!2;OQb$4nuFf3k0003xNkl|_+vx> zFIDwXcn?4q0)_W%7xGFBCR0|~sfPWzeh;6|-uNFbgaH1Jb z99#lGoo1SIauD#bZx^-JX$FQ=q{V{So)Z+ z-J6m)TV#QD6WZjQv;T@Zu?vCDCWraxh4(Xa{abtjU$Cj;3Q`j000000NkvXXu0mjf D<$$A| diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_barrel_bottom.png b/src/main/resources/assets/betterend/textures/block/lucernia_barrel_bottom.png index ebf9c25b5ca2b9ec3e94e008f75f330f980c55c5..906c92ed529278484060e8d1bcde1b5b876e1510 100644 GIT binary patch delta 139 zcmV;60CfNF0oVbMB#|*Re``rZK~#7F1;K$~g8&QzFgb+(4_=8U?TetIVe>aG2`ByD zHIIi9OxG0^O?lQN_!f1xnKpHiNS7vZLzVTV!4LFZlR&`PWY9L6wo73UIqO3jpu3$1 teh=T1%fg9{b+s_k6RYSFbD#pqWfQR2h;oD zgXUNq^)wn}_v1`dMV6$(f0R0k7Xaj<CIe O0000M&Z00K`}KbLh*2~7ab#S5*yh3KwH>kh>GZx^prwCo1|dNlcxXpDSP-_+cRf5O})!xvXOV07*qoM6N<$f_KhB)Bpeg delta 148 zcmV;F0Bir)0q6mcBnkm@Qb$4nuFf3kks&*OYDq*vR2Y?APXQ8uFbJ|7@c$ntTJ36g zddL(pKuJ3g%C%NvQl>%$0oH?A2CL=}D#jg`00f?{elF{r5}E+gN(>wT delta 43 xcmcb{_?U5m3KwH>kh>GZx^prwCn~xyNlcxX9xo7PE8D^V1fH&bF6*2UngBQH4SWCq diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_bookshelf.png b/src/main/resources/assets/betterend/textures/block/lucernia_bookshelf.png index 178ef8a2d6f4a6b282dcaddec2fba0c8ddc8f78d..c63e96808ac58ce66540fce3e9634795a04df5cd 100644 GIT binary patch delta 201 zcmV;)05<=K1M&ipB#|+Yf2m1CK~#9!1;Noy!cY)J(S4@lZJYRjK}h8Pe+^y`62;J# zrgK~?2V*P{U@2K4*dW+Wy0j!r&kQ@=!$DTxSPlD00~~Id0yv%N^#n325RFfvhN;B* z8L)02VB{>O=4Ej{#B7{VhzcWP+$F_Ex6^mIV^fz5UcUUIpS9OjKV&J60E|y_)HTxu zENbfre|pP`28Ks3c-K8`mXU$3UXp@T&6=_j!6>4AP7Z`5+q{MZ3amk z?tjh3teVA#dPTuA}jbgW10xDm320G=bb;C!K~! zM`Y+Ni++~d4UcszFNikFQ)cyG1)s0VWLdY@qxAau0>`mI#&bGa6*&^iU78;K)6k?J XOcV^NYkewjB$gaah6d+EOhg?Jkg$= cUqc(3e<{8`KOf&Vc>n+a07*qoM6N<$f)oxot^fc4 delta 144 zcmV;B0B`@m0oVbMBnkm@Qb$4nuFf3kks&X8W=TXrR2Y?APg@SaFbERi{%4+`+sB${ zE#(nQqULbBRBE7I$gLtM!i*jUIE>-7$&iQgg9q>cvF$mH1`tV5n^k@nSkojp=>^t{ yZ|tUMO}`W-`U5P1(p+b%)5R3GUWSqU)_(w*$^!o^6RQgV00006(zQ%jtOEe(F=Arsu3%Q^vW&nw0DwOb Wq$^l{A^VH~00001dcmnDQ(sX)=1B@^F0MqpS<%cOc-V-n{c6`;k0H6K= UE6sh%Q2+n{07*qoM6N<$f*E)&E&u=k diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_bottom.png b/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_bottom.png index 44a4f2cd5cb9d86d5572d54c9b78c1c3ef5d4972..df64f9ef18ba0fd25a5a297336110cf836574293 100644 GIT binary patch delta 148 zcmV;F0Bir30{sDyB#|*te{@MiK~#7F1;K%F1VIb~AmsC;|AK$5z)mv&^PAiLMPoQK zeVa@gWtf+pzNjde_4)WMTF;Ve<{HwmZU%w&tiG3$BDKDxriANT_lY}6)3c^pgB0tD zs;01$Z(O2z-?jVu>y=hq@3+&JImV-A&+QN3ntv$bP%{pc8!`X@3IG5}MNUMnLSTXc Cfk@E+ delta 172 zcmV;d08{_{0ha=hBnkm@Qb$4nuFf3kks(umfk{L`R2Y>#Pzw@7AqXm`DMP*gbr-d_ zPTEfh8Zu>lv1Q4aN0kEri=H_|VK76-k+Dv;RA#KPfQY!va5K#VOGu>~c%blFXCONW z)R!y;;cd7(SsG&8*uD9BLBRRmrg$7rhqjKbMl1TV_TP5@JN}X1TrfhY(_(;Xlo=O}ocV4vP+}Pvj`F86^%ecJP*ez~ot40BTylRsf zv8yt*qvvMa9SVm>Ti+h%6|25}M5{G2Q7T1yp2`w?<@0xH+bFBzD^PR09`3DVWkgar jFDKUS3f+csAVQ00000NkvXXu0mjfbXZgE delta 194 zcmV;z06qV@0?7i9Bnkm@Qb$4nuFf3kks)t?mq|oHR2Y>#k68}HAPhqXD4SZAIJy5> z$E2h22cReH#GeK=%U3B^HmZG^0!wl!8BoOmyc9Wa0k8??Tx-tzp0n0E2~23+W0-aH z*HZcUd4S#>2>A;_2;v$2ml0F)40>T>s1Yau5^q`rl9Gpp6!$(Ehz|aH@J#DWVHfBv w$qVS700f?{elF{r5}E+Vw+oQ~ delta 43 ycmdnQw4Z5$3KwH>kh>GZx^prwCn}aONlcwMy;~sT(+Y0}Anlx^J6hko8r8v__q3kmoTcmZ=y|~=^OYyG>e^E$^a1}Y5(BfV%D}w<0000< KMNUMnLSTYz$w?&u delta 175 zcmV;g08sz!0fGXMBnkm@Qb$4nuFf3kks&*Ogh@m}R2Y>dj|mO{AqWF0<@o=PcW@IU zbijhqnY)wr3!O0l*K(ITCxeuF4LX0|OFU%})_^Oi>U14Qz_@6-mzbVE>?uERTHTL~ zqXB4fsJEjSI|$&6DkJ5T&V!&-%&N|J+Ai&|$KtDhFd~3By4v{C9!c-k{gySGJ@DBY dxd|=msSp1w1GA3pSlR#p002ovPDHLkV1mv#4v!= fSfJPdWLE00000NkvXXu0mjfbQ3YU delta 184 zcmbQmc!hC-NGZx^prw85kJ)JY5_^EP9joOq%=Q|Fx~`JeL+V@r29mOHp8( zF?)sKo~l2y9DTy3G`@WOy5A-95Zk_e|4tlWd0f!_Y4Vbvho7(K0Rj%@6Ratc44=)m zYuJm%IIOy#Xm*%40SE*hJXO0Xz!;ZzB|^d6YNmvQK%f(s;Q|e*iLs|!WK@?lHFmp+ jFoT7+F)m?B31?=A$ko}W@5R>$bQ*)FtDnm{r-UW|O1Ve< diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_door_top.png b/src/main/resources/assets/betterend/textures/block/lucernia_door_top.png index 53164a59f6687547e9cfc72ce39cf3ef411bab89..6ca50c758f9974630b2eb26080deab73bc888a7c 100644 GIT binary patch delta 154 zcmV;L0A>Gy0_y>gB#|*Ve|kwoK~#9!O^!hdL{SXFG`9BsH~x!Z;BAE@%J}MS*F9s= z%MA&0xgu}R*fzedb=k%MPB*8XCz;(z##dpkvpcgru!htm39biivM5r-dZUI-Mw(>Z z=wKsBQkJ5_^B;yohacon<41Z?!;@`PxbDpFSkV$7GXb)E%Wwlf5a>M-0ssI207*qo IM6N<$f&t1#5C8xG delta 174 zcmV;f08#(z0f7RLBnkm@Qb$4nuFf3kks&*OgGod|R2Y>_k698#AqWE@VY&Z}U+c_= zl;skjiIK{k?3vD49-&!p$yRY01<8{jPHAVXdz>QD)7~Ioc6Fbfnow%zyo+AS0^TG{ zs5x1Rwp-y~sk0qpp;ZJ7tT^aHzCkHIR!sQ|rM<$_f`F?Bx)=J41vAu2g`5+KjmW2g#Z8m07*qoM6N<$g6>I7&j0`b diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_ladder.png b/src/main/resources/assets/betterend/textures/block/lucernia_ladder.png index 8cee0918a5d47793c25b7c73e5a703c99b2d92b4..839ba808112777cf2893503726b6b10aa0bc734e 100644 GIT binary patch delta 114 zcmV-&0FD3E0mK22B#|*VXj4f j?_Ho-Y#w5)UH%vsgAxMKkgp@?00000NkvXXu0mjfs2ws6 diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_1.png b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_1.png index 7b66a8454d43293b194e311b769d18923685f2d2..7dc39a1c6b93aeeead9d5eef7bc21e4e64d6aa9a 100644 GIT binary patch delta 142 zcmV;90CE5E0p9_TB#|*Ve{M-cK~#9!ZO*v?0zeQ0u{l5M{yQchA)o>Y+qsf(vmGvU zaNUty*}*_d=>ZeOdU7*0@~ delta 158 zcmV;P0Ac^%0r3HlBnkm@Qb$4nuFf3kks&*Ob4f%&R2Y?QjxiFzKnMbfg8cu-L8}z0 zj^Ts_-OUk5j8|g_85nuu<|{8^lqo10E`VK6wdfMT$QV_`*@*0%bW1$_PwDznC?{+p zl%Tv78%}d{rIgZz4^=6>@SYzE-g-^77nQB)1+P_M>{5T0`e*42)0zWxsqhvG00009 M07*qoM6N<$g1kRNbN~PV diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_2.png b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_2.png index 9cd3b55ddcbaa766f14ee6ff6ad859e7acc2c32c..b1f5cf69982bc15665f9d7d51d816551a747bd6a 100644 GIT binary patch delta 151 zcmV;I0BHY#0_XvdB#|*Ve|JelK~#7F1;K#Nk|-b7^`Mz)-XwrI}eJf5^lID5Qq zqjdPe}p*AqXM?`~QyznoeSD z!nVi(cQJbf%N`7%9gYmqnmOkT<;)PRM+up4FZE{O{BXUYfhW_gr cbH2Ededag=mtwtCfB*mh07*qoM6N<$f(Fk`Jpcdz diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_3.png b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_3.png index c72847e27b9b223b91f48cf737a849064f26c529..09467dde5b9c92d2f1dd2c1857dd970818a8bf8a 100644 GIT binary patch delta 153 zcmV;K0A~Mz0_p*fB#|*Ve|bqnK~#7F1;K#<05A{%F?IO;H*TV~0gFxEMNMm2%8XNm z#(wXaltwTBKhkEX8x2@(Zpcg9fK%U)Nz+!t)~WnW{gRf#6!_nx1xStSMVvyJc>r2zv`Z1Vx)TLWh?4lk4XXqAq)bMCI0`%L+tTn z5GsfymI%#&bB#D52zV$uuwwF@Lpi-e8ujpWjz`FhK1%0Xf#W~d;S*~8xG!sT*bHlj zJ;AzBXR%DZGWPj9QmtAT(e(&Xu?iHy?{B-56ja8ah8OmJ-_yHO^1PAOk RX#M~I002ovPDHLkV1m(cMU?;m delta 187 zcmV;s07U=%0hR)gBnkm@Qb$4nuFf3kks(8WkV!;AR2Y>Vj|&n2AqYZI!SwzYUfib1 zPxLTIVpXELk^Kl!N;klEpuiFnvynwPN3k6$!?m14?PHGO`ZWxqW>o+C*NNN_cb!y+ zL7;X^n_fJwZELq{%BB$#T0r-XrS`HdTjqw5H*&Twp0!z)0N2QT9<|Qeo9AX$7%a{v p+QfhHOo2Un8uG*Mv({7_`~ey|1P20612F&q002ovPDHLkV1hT*QojHI diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_log_side.png b/src/main/resources/assets/betterend/textures/block/lucernia_log_side.png index 5c0665bd51ce6ded0908e1d3d5ac55c3afa78cef..f4866cd5f161007b8d21680cd7beaaa4f79a554f 100644 GIT binary patch delta 143 zcmV;A0C4|<0^|XZB#|*Ze{V@dK~#7F1;K#lk5LXpF$e;mpxFDLc%j{X zG;yMgekk_nw0egGz5=@?YW$%tFd=kK12m`tkUpj^cVuQeZ8t9dSydz=^P=khH{vts)f aW*2_U?gLy-5FFwF0000PyC@$Lto#o^;acDopQ>6 zn#kO`J7#?X!hM^rDMW5F3U!a$jhJ~*+r!== z6?`7acL)ubZ1-&_6^E@jl#1Ei?iPWnhK(dJ|4ooYj3E;L=>Px#2>?k&PDHLkV1lK; BKyd&7 delta 172 zcmV;d08{_y0fPdNBnkm@Qb$4nuFf3kks&{Sfk{L`R2Y>#kAV(FAqYYfk^28Heo$|B z%PmiUwopBzvqhgStU?bBH~}!|(eMd?C?tbaTGYape5`JE2lUw!GpS}7z}&CglPLjq zy0c{l4-~ZBW9)c}w%a-C0GIRbEDP|!mQxP@dnDpyh1?nj{+`Ye`GLEK1EWF~AT;U!7cUMf_kQR5zWaUm+*1Y? zVXxtbF&>2n2rcM@xqh9rLBykg;B8XIunZa?3(j=S3{RPQj15L}6wI@#{SYyGPxru_ i<)IXdp;a1!I^_?N=`mf<#Z*%O0000-j{ynWg}YPB1}53<5_P)QO5F$j_^|9|peFH_CM z6as2yU_e0}0M<+j$H(3m25pd{3i4dUIkzfd)Ck58B2P0E*HgX2B}^OJZ)HQrtFUCP zrJ)Z&UzWe3(7Kl3hN7__%R6=z=-6wi_P(cy^AqY}K=>IQXwVGKj zHUxoLc=#Y@hPet9H`%8q)&de)0QL}jAC&~TIU!ys=@v?{Jf)}51VOI8uX!x3U?%fe z9s!Oe9#P14-4tNevp>s=9Yw`XDQTZrRc$-z^0@d1G-1hZa_n(6=x O00000QEGj%4qzn)C^C+90a3yMPuM-FsQ>@~ M07*qoM6N<$f?PiZf} aySxBV!U0d9jCZyG0000XgVybPU9UkRv8d8PfJ|#1?RY|BRXt6+{WT%gYD82o(+P?YUBjU# bl&LXqNbLbWvDs{%00000NkvXXu0mjfICC=! diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_planks.png b/src/main/resources/assets/betterend/textures/block/lucernia_planks.png index 1d58c5a2f93e51e71a640aa34793e64d207b9a75..7d734474c19112278aee4afdd29f360863237350 100644 GIT binary patch delta 135 zcmV;20C@lS0oehNB#|*VeP~HUK~#7F1;K$~gg^iUA;yb-{{`y?dRDMtZ;$yZCZFzD z8lj{y$AFbD#%BK`l52X-zI zv+b@H8r{_28`4a3l$1#9sG%!w8huXpsXC|93%U%PW{3(h9QFd9Vbouy*J=?$$C1on zN7(z92t72X`eEZf)Xt>Vv3od90++FfyNgG>8{}{8`IudV{lwWLq&2;Fsrmqb90YO@ Tf144g00000NkvXXu0mjfXk1De diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_stripped_log_side.png b/src/main/resources/assets/betterend/textures/block/lucernia_stripped_log_side.png index b861bd9b7d8887c5376f3518c7b13b373db1f27e..cb55b61a72088b23cd7ef75af94d7083c31dd960 100644 GIT binary patch delta 128 zcmV-`0Du470lNW^B#|*8c40|GK~#7F1;K#AT;U!7cUMf_kQR5zWaUm+*1Y? zVXxtbF&>2n2rcM@xqh9rLBykg;B8XIunZa?3(j=S3{RPQj15L}6wI@#{SYyGPxru_ i<)IXdp;a1!I^_?N=`mf<#Z*%O0000-j{ynCiKG^wX*9QhM3n3(t_cZyPZ&UBrP4r3 m7jFs>%V<(_!mRHc0Q>=bEjUNKLa==R0000_k697~F$hAVBIN!j9!Ynq zho4yF;j*GCG9ogwT&~cF;wD|i7*#-{N5C!{dq0!}6NLCm%~+`xCo?<+mI<=_KQCm% z1iRUedk07*qoM6N<$g8PO<;Q#;t diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_trapdoor.png b/src/main/resources/assets/betterend/textures/block/lucernia_trapdoor.png index 286a1f3b5227f8f58b07b431087a6c77aea40ae0..a484e86f5970a867210ede7c9bdae08d0a00eb14 100644 GIT binary patch delta 146 zcmV;D0B!&I0pkIXB#|*Ve{xAgK~#9!WskWH0|5{Mc^2ruV@Id6>=X%x0mYSR!;T`< zc_&*puL9FiBq^>T=B$_8rHhA-rEFU)SBQ#Wz)&ROJ^VZzmrJDz?d9J4;)Vy-3@T>m;%=ZIj(ps%E000002uVdwM6N<$f|JTZ AdH?_b delta 166 zcmV;X09pUz0r>%tBnkm@Qb$4nuFf3kks&*Odr3q=R2Y?IPtgv;KnOw<`Tsv2*R<)f znR`Gv6i_U0X;-yQ1FqY{Zce}wArFx{UsZ6+JJL)TwGnwCYRuOAyMFF1xKrDq$D3;-AjX^+?T*Uj68ma0k!n-;k zj%CIP>6q~0BI?e2ko7~AHLGTBPQitg+$7e7zQ`}7{45fMwNJ7D0000fT&f`B`lsm z7HN|K2?p{3BC%EKR4W}B7`q^`cSqt2!CUPTI6%Z#&)dd)`OSd+@)H_?KX?yRK@@#+`WQ&1}8uc7K%WcGNVix*avxU01WX ziiVRQBnd)#FP<22t=S+6Lj3;lw_y_oNf5Gha3N%zvDx0>@Tp@2GR|;4Da!Dfe~wNy z2e5Q-ApoK@#|c87KWlLaDhWcOG@qD!blk)Bq|ieu@|CZaSq@g3VD zN^`Dms_dOy8vVrA+~2CJ<%O|{C*#b#X&7MdqzRFC8)n?ZiAPI5YK5IMFhfXIiUJHxkl!jpT2;_y*Z ze=GK4e=!?gUF_k6&#%!_#noN_n*&lIv?bukvWl>?F_KfFKsd3PBb0C%Nwy>ec1<88 b0I>ZJ3iw(Wl;1Z}00000NkvXXu0mjfoRUgz delta 188 zcmV;t07L)$0gVEXBnkm@Qb$4nuFf3kks&#Mkx4{BR2Y>tjR}qfF$e?A(aSOL|L?Bp z(L@o7E4D#Y?sjMI=1dp1ih8!FcCxWkeWp*5@)Atc?D3&_(OH>Q6xq#zU_nPkRWp`> zB4A}Oz(qsw7fp$no`?-bgu4Q4Zy*dxmJpSoUCiMs{Fj>o@ds|I)C8hXBY4~lf-{*X qKL?JOir}=r^F{uB;Pw3u3;zL#Tn57{UnE2T0000e zTWb&C3oonz8)5j|ot>H87}xRSUaoGl`McSI$8rs5d1a_ybqion1{6Oa)yyPQM@wN! z*f2IAS3RpnQhye`0eGA2FvY?XI)fLRZK2J=GhA*P1n23z?tk%hL!O5kK4dlI=bDmN z<&nMNQWPpuT1|Hp?oD%PDHLkV1gSUcJTlJ delta 527 zcmV+q0`UE+0;mL#B!2;OQb$4nuFf3k0005vNkl$c|ALvl3tLy15G<&&6rm<=-Ng6h<=KMaf(1Rx)4BJa zb3gQYm#0r+Ays4MaR#8MD*zi!iI7u21n{|B%|0`MHStB!@7#~HPT z8bggqgp`iUF4A@_08<%qHMM4=iPMRY1y!Y{SV*>?jnb(fS^!v6Pz8Xy1MqAYfAQ^p zO|4<0-q&X@Hkv%gRgLLp>-4HIiI4!OHB7C7szgX>yR%W62w7?Z@a1;J-n=@ysK%() zSUe&l7LsoOK!4iqREE@=qOKAlpN>+V)&cN+yYXy?`<9xfGJI?0@99S@q_o{w$g7)c z0PJOznr1<=XfnRqqRDvrrIky^jfE^VEt+g;Er`=&3eukb8px!G0Ts`#sq38d+T?5#u zx)bzf$L9b}CRrC^S%M}Y1L(&jxZk32T)r526as2;d5N$ R`~Uy|00>D%PDHLkV1i#E2E+gW diff --git a/src/main/resources/assets/betterend/textures/block/mossy_dragon_bone_side_ver.png b/src/main/resources/assets/betterend/textures/block/mossy_dragon_bone_side_ver.png index 2816a9cfdfebba99aca0b8ca332c547bd8cb234d..9173717bfe4af311b1fc8b4657814ed7e1d83b26 100644 GIT binary patch delta 168 zcmV;Z09XH{0+9lcB#|*te~3v$K~#7F1;K#!1y$1XOjRBj+5&#A$0MY=a9uWvYq%Z(L0|0+7 W**w_)3S3hF0000-%?XM_F$@Dxk8Icb{jXd7 zcA#JadWjr?X{Nh+rbf6)nlVQjQ--=^m_LtRM&%F!7WsJaaf+*{nlY$54*?fA3}()n zLX5zbV1XY6;SbK(2oE5^N-5)1hIgZ+P|(>c1ZKLVy9#qRyxpCao^9rv9YTL#?>M(4 nKbQ~He4+QA3SqbA2m23iRVxRs#fn>900000NkvXXu0mjfHW*ID diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_barrel_bottom.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_barrel_bottom.png index 8df3c4384b7f7537904767fbd0699785e5650f10..7e09714be35baecfbc795eda26ddc5b69189048b 100644 GIT binary patch delta 420 zcmV;V0bBmT1i=K5DgoM&D?V1_?%8|i+%q%h8gv`ztaG(~e*8QByMs5gMxSs1Q#KMI zBpxI64Dm;Z1ThtWGoj#S#1??Ctwp2jub#v8Axw^AdII;xl;6FEo0s4p_3}{xhEHo{ z2a&%MHr@^IHG0X(;f6#|`5QR9FW>ARrHE#8@x4W_c_drim|QY6j+1{GL&-%hj`9m}YZg&oLOrKM^Kmt}h<)VS zjyH#(50iJa#cL==bf2OyCnxwj7veh*fH2L01(yf)PKHk5;u(xx&?}-<_jKmHy6J;9q9G- z1d+c+e^ggqf8Old(5Ya*gu^Wza#}hpSZCc(2S(0{diXZ-Q8<1iA1D%bKZ)MgRWtzK zh(r&tAQsr-2KhR8BAlC4~KS zO-nf3wz}J>&Xb#{GrqUzHLql=8>eb0NM10SMC`Sa5kz?_}r{E}p^I1-&9#e(Q?9JmOay{FIB zw|!B2Ud(BBCH2>cG;}(xPJutx|Qs6xBKzu!$eW k8~_aVVT|8^{po-D0>=9T>JwT-OaK4?07*qoM6N<$g4r2A{r~^~ delta 143 zcmV;A0C4}@0qX&fBnkm@Qb$4nuFf3kks(8RWl2OqR2Y@5ih&UWF$lxlJh)>2g==yh z;d6;Gip1f#j!&5fe`H)#(*-?cwW)EFe3-U8shl29XGih6(uQ~rP)5GpS7#)=Y||oO xSj)-06)s67I=Uc}uh!jlN$v&ugO&8^`2oiJ1L_28q9gzS002ovPDHLkV1j|aKcxTw diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_1.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_1.png index 480c53175cb4567e57e1f109cb39f38d08f7493f..381f7183a5b863fbaddf562f739dae9388c91b20 100644 GIT binary patch delta 126 zcmV-^0D=F}0kZ*+B#|*2bYDqCK~#7F1;K#<12GT+AoR2U#ytydeD8Vny}s8b0MpY( zScuc98k4lM>tx`d*D)i=C_#wxlOhsw6JHT#G5u)>v#?C#Vs2!t20HmpR@(r`6(oS@ gW=sUqK`N-^51!*OPFK^GrvLx|07*qoM6N<$f@!}s;{X5v delta 155 zcmV;M0A&BO0nq`FBnkm@Qb$4nuFf3kks%&`a7jc#R2Y>tkHG=NKnMa6=)dLz_VS5w zRuI91Y?vu@3qR0ye<$lwm{tKkTCmn~${Rp|5hZI-@f6s6h8&x~E4UdjG`!%k>~D>! zG}WSEYnzWtlJ|{u3l{45KjH(#12r2EpnFjwEJ%0n%zSqK4`nd|mz>DtvH$=807*p# JPDHLkV1l4|K|25d diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_2.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_2.png index 4e8ddf42fda0e3b29234a0311a55e994a7126047..6051bf883311582da1d8d8b5ac9ef0342711cd12 100644 GIT binary patch delta 126 zcmV-^0D=F}0kZ*+B#|*2bYDqCK~#7F1;K#<03Zy*pqlaj&BAJ(xw&Z9%RQGK#?o9G z#-669xwq5K({s}nFKMK$b8!uN>k-%DvXUgy|ikvAsTvY g9WLL_&A70}EqqneI$p8QV07*qoM6N<$f(AW1@&Et; delta 155 zcmV;M0A&BO0nq`FBnkm@Qb$4nuFf3kks%&`a7jc#R2Y>lPYDjdAPg$U|KB{o8Pimt zP>(#yXXVo7iJ*nP2s@N7?da48pe1Tp2QaalXzKRZ5DIMdsvE}#T*H21f7u?3>%sOIsrpU&0bb(*qqw@x)c^nh07*p# JPDHLkV1k2cMScJP diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_3.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_hymenophore_3.png index 7ef7a402a34bbaea5aa8cb49ddab1879062515a9..d85b55ca63a4f54fa6ad496f230969532f3e7e9d 100644 GIT binary patch delta 120 zcmV-;0Ehq20j&X$B#|*2Zdpl0K~#7F1;K$413?f1AT-;5#hLS=t=_r1>s<>}I`6No z#3m@J0Zi+465C`GuM-%XPy@t93kV(B41^dOV-QA}Hw-A#lz~?aMqa!!!uSOpQ-shC aAixJ%o-0q?K7cp?0000#W!_d|O9LJdrrHDNGv*d}J5Ppa z0#r3JZj*=~aE56HyxEd;61_&C&117@0(hT`|M%NY_j&+!7Xrenc3|HC0000#j|&O_K?p+qbpJE27PAmc zyc#t~kOw2oCEq5BboDT#M)WVS#0Qf-_7(hofZGReF8LeIQGeZW9I>UWf zvB-$??;X$r79{QFY!Id~+32%Ust0se>@`T{2PVRC%Mtavozw?eg94Gf;RzA|00008 LNkvXXu0mjfqTW6- diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_side_3.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_side_3.png index da1f616de00b5b10cd698c631ec25b01354e67c6..bdbe83a4d3a11c210993b41844c0e6f71db88c13 100644 GIT binary patch delta 28 icmbQhG=XVC86)Gw@=k$6ZVxgUfWXt$&t;ucLK6Uk<_Qr1 delta 28 icmbQhG=XVC8RM;q<(&e;5v+$8fWXt$&t;ucLK6UlTnNhm diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_side_2.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_side_2.png index 518cee46a7a5fd09a300e4e71690af72baae4e8c..13b2fd818692e23cf962af9d8c01c7e2dc8292a0 100644 GIT binary patch delta 29 jcmZ3*x{7sz7UQjr+WAZZA}k&r3_#%N>gTe~DWM4fd#4BM delta 29 jcmZ3*x{7sz79-gTe~DWM4fe8>n_ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_obsidian_side.png b/src/main/resources/assets/betterend/textures/block/mossy_obsidian_side.png index 9bdf1da3263a1a7612548c10545e158aa1922dbe..0b4b3c7dfe5ca43d214c46070e21bcb3ce492941 100644 GIT binary patch delta 170 zcmV;b09F5m0`>urB#|*Qe~L*&K~#9!1;K%l!$1%M!2!-!cK+GEw99wre)7BdVje!yaFa$$`E*Ss+y^Hlq zlXszD*g&FJ&WkI-HIWOAG0txf!l#Cn=4<5r@Eg;X06TNW^pVcbQPc4&4(X l29@&Hlm>1oZbhj5&kq*L1;Luj*9-sv002ovPDHLkV1oIZP{05H diff --git a/src/main/resources/assets/betterend/textures/block/orango.png b/src/main/resources/assets/betterend/textures/block/orango.png index d974f70bb889a58ae346a1ecff8436cc4a7e5b3a..b4f74bc15c892a2dc9f702c766efa642dd19813c 100644 GIT binary patch delta 113 zcmV-%0FM970lNW^B#|*NXHrQ-K~#9!t&7JEfItAloVNeUJPr^85GfC*z;9}|et6rO z?_ld2Y^6OsAl;yePlwY%PS6H91!6%PgWN&{G=_U(Jq&Wd*0}-LMivhv={9fyjE?~} TJB+R%00000NkvXXu0mjfYA-A_ delta 129 zcmV-{0Dk|w0nGuBBnkm@Qb$4nuFf3kks&i|S4l)cR2Y@5jlmJXFbKo2f&Evm4QVd} zlsg_$lqBM}sp_taTT^)l;!n7(T5fIXR7ocHEGQ$r!X0EB68_5?ESZGgHlJjI;V}|2 jbIn6i7V&ZbI4gJnjE?~}1v8^G00000NkvXXu0mjfNboXf diff --git a/src/main/resources/assets/betterend/textures/block/pythadendron_log_side_2.png b/src/main/resources/assets/betterend/textures/block/pythadendron_log_side_2.png index 53106f2bb203d98e6d5486c5451310f3bae2db74..2d6e6ca663c92f847db227799e96941675062465 100644 GIT binary patch delta 29 jcmZo;ZDXCF#Td6y+nY%sXX6(Z1|aZs^>bP0l+XkKdgTe~DWM4fi*^Y^ diff --git a/src/main/resources/assets/betterend/textures/block/rubinea.png b/src/main/resources/assets/betterend/textures/block/rubinea.png index 767cccbfe1638dcd08fe9af2c3871e17d691df3a..4b9385fdd4101c793789fbd0e19e1b4c9a550300 100644 GIT binary patch delta 121 zcmV-<0EYkI0p0d020EGYE0pJ0UY;<2qL_t&-l~s>H62Kq`13{AT{~s6HsVFDe*@?mI9Vi7mCX~sO zcq_aVDrw3?VJkyCnrM>gD70hhnOKw9yDm^I6h7b+evq;*6>IMe2>b%8jmX%bKPP4{ d5&>KLve3> diff --git a/src/main/resources/assets/betterend/textures/block/rubinea_bottom.png b/src/main/resources/assets/betterend/textures/block/rubinea_bottom.png index 075ba6d7b16ced8db1fcb3c7ebcf56de5054b1ad..e96bbfa38aaad7151ebfe401cc217bfacfeeb665 100644 GIT binary patch delta 208 zcmV;>05AWq1MC5iB!9C>L_t(|+GAkA0+uQU{a>pV`G2Qg;{Q{YdH+HDX%b%l8HfSs znn5%O6Kx1cAxtyO01yo_6eLH`0Cd|ynqX{@99B&*1t2!EW{?JuvyokatOi9hx&bgJ z!@>mJ6>vj90?2|eMKIgjL>(~c-TP&RU46Qvmztt6#Fe5sM_z$4n(eQ7X55UVXp-%0H)QLSK8)c|a8H(B}7$?dXMaT@5L;eaAH%0b$=gW7; zP=ou6YsC!{Hs@$JTXlu?w`9lS7|bUO0LGoZ z(!-P{cnt&Gt{w|9R(eo|7TMKgwf$qp{E00000NkvXXu0mjfPL8!7 diff --git a/src/main/resources/assets/betterend/textures/block/rutiscus_path_top.png b/src/main/resources/assets/betterend/textures/block/rutiscus_path_top.png index ffb1bf7a9bcad70a34769e27e8b807c3ba992d73..e01bc130ad39cc9d98a3afc6d01f8bcc438c99a6 100644 GIT binary patch delta 129 zcmV-{0Dk}O0nY)DB#|*RcVbCIK~#7F1;K#avV|O>gd(YHv zguG{T>EejFHcC!R8$@lplc@JS*WHdd-uKWpPLfE?mUMN(h-00000NkvXXu0mjf1noM@ delta 159 zcmV;Q0AT;m0qy~iBnkm@Qb$4nuFf3kks&vKbV)=(R2Y>#Pk{}lag8c!#T!M>fqh|!w?ex7egS*q?6+ek9Ki_T`EYJV| N002ovPDHLkV1j+YOxyqf delta 182 zcmV;n07?IZ0-XYoBnkm@Qb$4nuFf3kks(iii%CR5R2Y>VO@|Q!Aq;bkTz>y~Bg0Wt zjhLBxMDqG2fdmC3;Ev=HrxM5WPBL+Ym$4U<>*uNN_Jn*@LbvxwgkC*E-v}3XxRX0> zwuPvch4SlBJs_x2gPL~XfD{P26g>ki2)euW!z{D4CEYtqiM)p?*_r*SaIAMfq4zZ* kSfsJjkS;c!%^B?d0aMilty@NtzyJUM07*qoM6N<$f-SvKTmS$7 diff --git a/src/main/resources/assets/betterend/textures/block/rutiscus_side_1.png b/src/main/resources/assets/betterend/textures/block/rutiscus_side_1.png index de06738acd42acb76657d5fec06b75d04c7e4a44..b92237a749bdf9b47b56a5a24e1759603e19fc2b 100644 GIT binary patch delta 164 zcmV;V09*g80+9lcB#|*xe}qXyK~#7F1;K#<#4rd0F`rG^-+$c(cqzw%5CiBWb&VPDcX3AP8et6!8DgZSaC* z5y?$NOwAN8yVJ+Bn7e`$b7GmrKh`1bBYDfiFtdU1PsIIU6(t=v6jK*h2Z0tHh7}M; zRhPjky7<+gWrAM_D$JmrnWt}5?^Dr1nOzMEI14W7s=nta r>_ORm3EIt#AcU^mln03?;|6j+Pud14^2cFL00000NkvXXu0mjfzU)z1 diff --git a/src/main/resources/assets/betterend/textures/block/rutiscus_side_2.png b/src/main/resources/assets/betterend/textures/block/rutiscus_side_2.png index 307f4088f84cd3485620124ad70ca8f982dc3113..b3f35918c6d44cc1124e1e1d4f122f53c29e4cf0 100644 GIT binary patch delta 160 zcmV;R0AK&C0*wNYB#|*xe}G9uK~#7F1;N2#1R)RuLAAtk59c2(FmhEs3qlN_FIg99 z48;gCU}P?Ua10$D8S}CSRgg~O7RNtND?9Z+f|#ZN O0000VP5}}GAqY~`vTX1F&pmXi z34sA69Dtj<@z)4h+Q1`>Bs@gXAeLH_z61kirdgdtEFfZLgNe193VjF*5>A0kU~y#V zgmg55=R!Xz=0|(jzywTs}Jpcdz2>?k&PDHLkV1jZl BL0SL+ delta 169 zcmV;a09OCt0r&xsBnkm@Qb$4nuFf3kks&vKen~_@R2Y>dPYDjdFbGl*{{Q4bmo%+X z4jrrogRq#|vpoMt4;|=^Hl_Z9L!H`z=|zq=9T`?&7N{ZpWQ07AXD^kaDb-Vp1mr$V ziB9XSG#<%_LHGspIkiIr@S_vfi$f%tt&)YSK6kbNLF#yQ@Y^Mm`|$5}J5SzO@V_4v X2igO?Vq5>j00000NkvXXu0mjf+e=Dd diff --git a/src/main/resources/assets/betterend/textures/block/rutiscus_top_2.png b/src/main/resources/assets/betterend/textures/block/rutiscus_top_2.png index fe9a86c51bdabf9fdc1ccfd2e7e18013c8f4d1f8..cb14baa0d6ad82db009940e4746eda1d80e13ba6 100644 GIT binary patch delta 146 zcmV;D0B!&H0p9_TB#|*Re{xAgK~#7F1;K#<05A-Kuqo32PhRqxTd(v+qc3EN# zMcEoHk2$uM=-^$pf*c$0yiybox_dgYmVR6)5l=Cv$XzKE<+8=Gq5r zKvUN6TzV9|lH=*(r8+qGx-qRQ)jXitN@=!!dPXP`9AqY|s{{Q5IZfhAN zpo8_nAbiA1vy>_2Tv*-U9^zg9!QttOz~Cdt8$^l@%@C^LGck$tyuLQ|vDQ3riv;9O ziqh!7)JW@bv|bcyim4qMfU>}le;hUpwvvUbZvL8$T{-@Z_uD0tXNi9|?L2vB!CyZV X#%>V!Z07*qoM6N<$g7>B~s{jB1 delta 147 zcmV;E0Brxr0pkIXBnkm@Qb$4nuFf3kks&vJX-PyuR2Y>_jzJDYF$hA@z`y^IN5LlJ z!dexcprmgisT=L!_PG_R+^O1P5;QaJYd9GuRlbD4ol)a5#Z&l&s2Jb$-0_3I{7 z)=xK_=Og=S)v?gX*y_i^8%z_*Wci=Yty~?FTI7{nDR}XQ5|jMC4-dKJ_x)?vulaEZ eL?pRBe9fLXO*ElJJe!#T2s~Z=T-G@yGywn~YBZk! delta 159 zcmV;Q0AT;*0fqvQBnkm@Qb$4nuFf3kks(ii32;bRa{vGi!vFvd!vV){sAK>D0AEQ& zK~xyi9n8TIgD?z5!AA#@(*PnBATJik0!osEpvO>eGR{vA8=rbfH5RI&}RHUFgt-4qfQb#f&E72Vs^KV8YCd?*IS_ N002ovPDHLkV1hB|LXQ9d diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_front.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_front.png index 3619bc13d679a564a1314b363db100bf0e2df760..64f874ed2b007cb3b1a2c28edf24a31ce8188035 100644 GIT binary patch delta 32 mcmey(_>OUc%0xp~rixn=D~biW-mc+e00K`}KbLh*2~7acoeQb} delta 43 ycmaFI_?vNp3KwH>kh>GZx^prwCn|a{NlcxXT`cfqHOoc@AnBLjh4?42n~`_Y@x zpq<`r^#HW?QUI4tYf_Esbmv6o!8y&GrJ2v<`#j#V#b+P+`tf2(zMsGR|MSkRrSrb4 z{s}hRYp%JbED!>*rHRo|wRtL>N2RPol&i#6TDh8N?JZiT74-{r6NXU{mBe){00000 LNkvXXu0mjfpxsRG delta 171 zcmV;c095~$0;U3xBnkm@Qb$4nuFf3kks)J$fJsC_R2Y>-PXQ9bFbJb0)Ya)`|NmJ7 zoij(F9K4>hLJZm2P+2LV@jlOj^thtS1D63zQ@ex8rfy@{ZR<2~m- zU*jSi+it?#=qv>j5Q@khW>>VEK*evV3@y8@6u~^itCGuDnv6_RYNS4zMp0U{&a0;u Z^abf~15i;~x!nK&002ovPDHLkV1jRcN{j#i diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_side.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_side.png index ee04c5dc84848dc2828caa5a90889c7cf37c6766..e7c23aa78f86c44b9b518d7e42d77758fbfc24ac 100644 GIT binary patch delta 135 zcmV;20C@lO0o4JJB#|*ReP~HUK~#7F1;K%F1R($eF_~l1f5Xp4x_`YL4Rw0Ayl7;( zPle#=?&VwFQSa-XY}VE|UD~q-=@x1QTsC7+yY>cQAK p7uSy|Ppq4jJ#ET;Z^Z90`3FADRUxEAR(Svb002ovPDHLkV1kA`J|h4C delta 165 zcmV;W09yam0rUZoBnkm@Qb$4nuFf3kks&vKdPzh#Pk{}l<+0_~v52Yc<_rOEB_74v=o<}nnOM6gjwPdZrEKOL*VN~oz32`RVcnP}=1;|?V z^+!^d@#$lcx1eJ>1-{U33=DS1vdTwzRhQvcmp>H3L}? T&7AQ000000NkvXXu0mjfozX}# diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_top.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_top.png index 1d0f3620c5e4d3a0af6ca2dadf05d882a036e5d3..219c3cfe2625a6b46934c51913c48679de61969d 100644 GIT binary patch delta 139 zcmV;60CfNB0oVbMB#|*Re``rZK~#7F1;K%V+%NzHAy%iP|Awu3xc_@Q8tU|JdC|yn zp9;a#-OF!zNALZ*C!4jk)9KQlHAuHmE8wyjgW9zQVdGBU0KL=I(U0KFP4kZ7>+B|{ tZ^x6mXYYOV;9tAtcQjPFPemisAIT$HC=p?AhyVZp07*qoM6N<$0fJqdMV-PYDjdAPlM;{r{6k)l3p& zA<(1RRJS{@Ldqh@^AJ+`*N>1=xGX_pDpbd9#~YDoMu?H(xVRc+Omcb#M@TyG05g`@ z^%m*f3D=>}f&4Mge#cr6I*w<)=sPCtMR>U%0mK22Bnkm@Qb$4nuFf3kks&ukh>GZx^prwCo0-7Nlcv>?<252SNaG85O})!xvX4fItueK^YeQ|6~L8yi_To4&XR`rO8!4 z&?ZUE4XN$1(F<*Y7Q`KEgHFs2nMhcyTLb&3kt7xvB+%OUm=nV>0Z5eDXG#D7002ov JPDHLkV1ku_DaZf- delta 117 zcmV-*0E+*$0mT83Bnkm@Qb$4nuFf3kks&u=OG!jQR2Y?=jY$%~KnMZ{Q2+nrkj?R$ zP#&bEaIIge%zN~LvM~`K;8hBV*x<|%4N?`t02S%{Ohf{7rr(O>EcI%!f$x{?j*mJ3 X!!ZF!57n7%00000NkvXXu0mjfU&}G@ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_pillar_side.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_pillar_side.png index 28d19e43c897434af01490d6c904d8779c130d7a..76969a6f82f37e32e0d8bb3ddd970f43bd760ba0 100644 GIT binary patch delta 102 zcmV-s0Ga>q0n7oAB#|*pTt`VnK~#9!ZOy?AfItXD(J4VYfDRzSeLYP7EjfzE&C4eo zNC0i%vVrp$U`R5+B{vr|KD#CVt<8 delta 135 zcmV;20C@k*0q+5jBnkm@Qb$4nuFf3kks(iV32;bRa{vGi!vFvd!vV){sAK>D07ywh zK~xyiZOyR_z%U3z(Hp_p05$*xdb_y&R|+;Mt*4JDkN~COm4;_D(2CQ*Sr#X19Jj^) p7|F1Orm!T!X Y3kk;)xBtvB-2eap07*qoM6N<$f^n%a%K!iX delta 151 zcmV;I0BHZ*0saAyBnkm@Qb$4nuFf3kks(ii32;bRa{vGi!vFvd!vV){sAK>D09Q#w zK~xyiMa|I-fG`LI(CY@=2A!cSP$f=a-G3DiOk<7^K3+InvvMG;LJa!?G-_yRo+Tx- z+y;LER}2m7N`;@0!x54g`?_pv#XDcD`1KK oV)~q1W$s|kk;7UWdX!WTK0!YeGzSkaH~;_u07*qoM6N<$g0iwT{r~^~ delta 167 zcmV;Y09gO*0geKYBnkm@Qb$4nuFf3kks(ii32;bRa{vGi!vFvd!vV){sAK>D0B1== zK~xyi9Zi7^fFKMj`T)oSG9CbWg7E-F|9{2KElazt-Eh7h&w;ra&2kqZIaZM@ENjD+ z5dXYsU8)_EER}2`7O9dZ0U<(@!cn!l*@a`r6%mr3nBHf1nSU_X=)+PQdXg0gA3;A7 V6f}VsQ!D@g002ovPDHLkV1fu8J~aRU diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_tiles.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_tiles.png index 4bcd5e8b9bd71cb9f05767a27462775a289f1846..146e80149a30512179c3c3239dc2140abb70a913 100644 GIT binary patch delta 46 zcmaFLc!+U=%0xpSc3V#u$B>F!6K5JprY)Fc$>3=#{?<{;btVH4c)I$ztaD0e0swa! B4=(@! delta 79 zcmX@a_>^&i3KwH>kh>GZx^prwCo1~Oa29w(7BevL9R^{>zopr0Q68A0RR91 diff --git a/src/main/resources/assets/betterend/textures/block/sangnum_path_top.png b/src/main/resources/assets/betterend/textures/block/sangnum_path_top.png index 04ad7f4d93dcc03afbe8e96acbc15c489989b3da..ad80292c2609a91a71a855d53eb6ea3f3e8d5ade 100644 GIT binary patch delta 134 zcmV;10D1r60mK22B#|*Bd}m2SK~#7F1;K#<12G5yA~WS^xk507*qoM6N<$f_~LIdjJ3c delta 162 zcmV;T0A2sY0pS6VBnkm@Qb$4nuFf3kks&94cS%G+R2Y>dPg?@OFbpA<_Wm~>+K)U; zFhJU~DM#y$%zmfE7_JfNxD~x{LHOH)J>qq&nIjsBNy1P#OFi^L{*w5EulH|FFA3+Mx|DV41a Q$N&HU07*qoM6N<$f<=%=X#fBK diff --git a/src/main/resources/assets/betterend/textures/block/sangnum_side.png b/src/main/resources/assets/betterend/textures/block/sangnum_side.png index feb1aca4735d90fe8e4f7b6b406de0925e058449..62bb58df7c1bb2437a72bfc78e39c636c12f696c 100644 GIT binary patch delta 174 zcmV;f08#(20-FMmB#|*xe~w8+K~#9!1;K$~12GH(F&?SBv;VfuTT+2IoFddy`;?tC zxaACz)lRXy8);-FPRW--T4+U~SK6VqLeo)*hDMHdH$hOd&TQ<7dztI!jr?|XRL}ME zej?`Nck+EdS5?bjZn=^Zaz7FEJC;cq5`>Lma%5%3Twq1M5{yO`Bx{^9^vVL*?L31P ci=Bn$AGgv*{+WfI@&Et;07*qoM6N<$g2wYvi~s-t delta 193 zcmV;y06zbl0NjSG%NF$h8()bW4!zuZTY zhL)pHfoZ0@dZtFWNt)3|8eN9EWSGCDeaWUOs3(#kT;K*C#Fp2LHUK`~@j^sO&hSw4LJ1cju24vrT90000dj{yzfaD_6o{yWPF&%jv`I5Nvx|{nWKr`kJA+#aj^ghACyzXzcLHk*J8$4Q>=b)jdEf=C1i|7p zUcg516oN;vk9-d%ZbE)=VaT$xJDF_Uv+KO@o=gK&bFD}RKeKrx@|OU^;PtqK8a{(KXlV@ECCY&Y$kWr+)N4CXd;uw?*e_JphGhT%002ovPDHLkV1iJHZhZg% delta 436 zcmV;l0Zaam0?q@FB!2;OQb$4nuFf3k0004qNkl1Pd+HP$3v9 zNELC&;v#t8KwKOIp@W}59J&eaQgG-X?m89x0DgriP7WPPMG-88f+Z<*NHN5ry(6`0 z9|)Jbm*>yD?}^u)orEde-&p<9vrGW?I~~Ci7>cOKcBwokwtoy(dZWm3vyNH4)FR)N ztwhxnfm-!QsPo5`P6Ftd{R{W8~rG4QG9uu>DRn-QP1e*t^dJ1YH=~X;6YRMvX ePs$mAEc^jZjLI3?w;J{U0000D0Yphe zK~y+TWBmXBKLaIz2}+X<2)ckVE)TBY|Ds8ZP$nGUH2|#HSpvd&`Hg|$$|o=r*&xDR z&{2eF1_6*^?|(wrP{5=q&%=O>F~Hud3=C-s5DYR54KQ7Q_=VwyebRpr2C-oP?0g-6 zKA`PTFXmlhU|4nq!bSp2aDM_Zqi;I)0J+Nzp>Mrm_`i83NiXl%Z44^i;?GgJTzxB^rIixnUM8vu3%G?8Eh;=phN z$%6tL6kZ^UVo!qu6x9VFg`lW{rM@T~i2v~bxB*~SfC32@fY}bR04X|AT>t_gSAe2a joD1S#^yotg9|i^hqs@6`CG{JW00000NkvXXu0mjf_MVv6 diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_side.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_side.png index 6ee675aa88693e7f049f557b47dc1c0a69e962fc..e2981961edd094ff01eceda716d87fc41b656d2b 100644 GIT binary patch delta 135 zcmV;20C@lT0oehNB#|*VeP~HUK~#7F1;K$~1ThE$FqyFb!tLRgcBb7wd6eGL6gi|8 z$+}M57mI04oB6P4rlk`0)#cqydF|T^^@X~b+Xe@!`CpzEs#qx=fR*Wy(x%pBUi(df pr8oCQp_X<&%E1Nz8jBVL^#k~WNG?$wVyFNB002ovPDHLkV1g4GK79ZH delta 166 zcmV;X09pUp0r>%tBnkm@Qb$4nuFf3kks&*Odr3q=R2Y>_&ruG5Fbo3FwLp9S8%sN5 zO!ni`0iGnXB2p4b#7QP(C_hpcSQ1p-$_wR>=XAc{mt$;@apVlP?*YpP26RkWvs&BY znr(N?WXynpDBm?q9CyG!0_y>gB#|*Ve|kwoK~#7F1;K#<05AxHuql@Q|M8N?$<9*XT;GunO4~ZV zwr&oI+1WP+q3*)!GfZ2fY%Y(>Y`D8P!h>@va1Qmg&Dyr!&h}}5XlA4PSfadk3j+eAqWB$1poiz#kNZ! zI#_W`G`M7*a1FIho15cy-31LzS!u1dBA6;j*cIK^rA(z$#Zg0?8HGUBv3vb8I+F(# z{30gIEeFCR_$F->acXY4IDs~^gs$y&WePrEEN+}}3eU-pj%-%zcLW|Eh2Kf^NpxZx e|I7r1)A|5Modihi(e4od0000=d#Wzp$PzrA_(;W diff --git a/src/main/resources/assets/betterend/textures/block/violecite_tiles.png b/src/main/resources/assets/betterend/textures/block/violecite_tiles.png index 70aa5f30c85fbf26542d95145b9f633a7c6c1db0..ef69ee4cc5a16b4a65acc70f5e29eae79ca2e093 100644 GIT binary patch delta 28 icmX@ic$jfQ8DreUavOnX`E9KXK;Y@>=d#Wzp$Pzy(g~CR delta 28 icmX@ic$jfQ8RM;q0D-5gpUXO@geCx;!3sM7 diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone.png index 8532ec8a19ec536937a23c0738e29c3d817cd3d9..49aa5ad8a737078aff2d07175ded4f8fa3530851 100644 GIT binary patch delta 121 zcmV-<0EYkR0mlK5B#|*RZ(2!2K~#7F1;K$~1R($fAx8hwf5mQ~UxbCdbwOgYN-$*f zEi*e|^~cP1W9edgCybJTF#QTl_EtABL-slbh|$N}2^RWna}Hj0qFsdBnkm@Qb$4nuFf3kks&vKZ%IT!R2Y>_kI@#uAP7Pcb^rg#6Re&2 zV5Y(?RChlUo03RJsb85)L{Jf-ViJ00rI~i-0x8vDuaP~-jIq(;dPJ;+DwKKBnVLAn zT6hMoz!GD-53-%12a;8Xy4aD@E~CN^>J!G@=Z*{ZZ~Qi1;P?Yu^RON*00000NkvWt IM6N<$f>qu`(*OVf diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_bricks.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_bricks.png index fef97487cdfb3e8764fae9f2183c122175b14b37..b385b6c454208e281df792acc0a9506e373d4ce5 100644 GIT binary patch delta 126 zcmZo;dcrtCWul=^NxY|vV@Sm<*)taf4;k>d9GuRlbD4ol)a5#Z&l&s2Jb$-0_3I{7 z)=xK_=Og=S)v?gX*y_i^8%z_*Wci=Yty~?FTI7{nDR}XQ5|jMC4-dKJ_x)?vulaEZ eL?pRBe9fLXO*ElJJe!#T2s~Z=T-G@yGywn~YBZk! delta 159 zcmV;Q0AT;*0fqvQBnkm@Qb$4nuFf3kks(ii32;bRa{vGi!vFvd!vV){sAK>D0AEQ& zK~xyi9n8TIgD?z5!AA#@(*PnBATJik0!osEpvO>eGR{vA8=rbfH5RI&}RHUFgt-4qfQb#f&E72Vs^KV8YCd?*IS_ N002ovPDHLkV1hB|LXQ9d diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_front.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_front.png index 02c769eedfb1f6a53f32e0cce2475c7589378299..2dee0195495f1606892a3bdf77706a4522515e80 100644 GIT binary patch delta 152 zcmV;J0B8S*0`UQmB#|*de|SkmK~#7F1;K$$1V9YLKyPjV(SNm%l$e?RdKnC$<5fAq zfJAzD000D=I~ut`w|1Q56Ij2Qv2gE`1o`_qtU?k902C%dP)Ad;?*|Yd(7f&dy)34w1boO7%0f^MAy%SfF+u6=z`-sI$3H)8S}&PP4xB*%0000#PXQ7HAqc8i5dZ(-!*1`G zN?{apwN>5jz!kDwqV&BCS&8@~WL0>%ij`6nSEt(h1UpJA0<;gF2WJb-WkSP8c?H(5 z!kn>!2NhVp9z4+0=QvXc?o*j@HeXYK#X!Kcv}Y0B=<6ZPCp%BFwCE=2$ThoU2**Yk bW0m9s?xF>My3Sv(00000NkvXXu0mjfAJ$9Y diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_front_on.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_front_on.png index 1122de9614f4a4a50f0616f88c7a72fa64ab2e35..5203c612b123993a0e2b0dcbb856410b34b44fde 100644 GIT binary patch delta 172 zcmV;d08{_b0>J{1B#|+Ee~d{)K~#9!J&en00s#O6qjp(@whQL@|6kgJ(lB$GL$Eqq zx2;)?#LXFwh)nNqQqi^S?=rpc-&vHX3X^McwX1{aWf}W^zpo|pX>bk1m*k% zfa|Pk)NI=(NnK;60KZ{{i2?!y(C3s?B*|ort=;CWU2DvCVlA;9BB74$a86#PXP{uFbG3EV@&RDiO|CT zUwUPlYuKO-l+7x^sw^QXVo3yWpAa!+|3kzm&Lo3sb%vF?^IErUy`&T*IF|h!40m{HOSHfl@tC>?Lx6jaRQ5+Ob50MSA6dF3 oRA~gW@RH2_it<807*qoM6N<$g423WLI3~& diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_side.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_side.png index 93739a9660f358ea83f693d4903984a9b17601f6..3bd81825c85cec184890dd6efcbd4be34ca5fa8e 100644 GIT binary patch delta 135 zcmV;20C@lO0o4JJB#|*ReP~HUK~#7F1;K%F1R($eF_~l1f5Xp4x_`YL4Rw0Ayl7;( zPle#=?&VwFQSa-XY}VE|UD~q-=@x1QTsC7+yY>cQAK p7uSy|Ppq4jJ#ET;Z^Z90`3FADRUxEAR(Svb002ovPDHLkV1kA`J|h4C delta 165 zcmV;W09yam0rUZoBnkm@Qb$4nuFf3kks&vKdPzh#Pk{}l<+0_~v52Yc<_rOEB_74v=o<}nnOM6gjwPdZrEKOL*VN~oz32`RVcnP}=1;|?V z^+!^d@#$lcx1eJ>1-{U33=DS1vdTwzRhQvcmp>H3L}? T&7AQ000000NkvXXu0mjfozX}# diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_top.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_top.png index 47b8ae0ef908123ef9f336566faf0ea418cf189c..e256c6a411d99a0159abb74a2af906ca00a3c475 100644 GIT binary patch delta 139 zcmV;60CfNB0oVbMB#|*Re``rZK~#7F1;K%V+%NzHAy%iP|Awu3xc_@Q8tU|JdC|yn zp9;a#-OF!zNALZ*C!4jk)9KQlHAuHmE8wyjgW9zQVdGBU0KL=I(U0KFP4kZ7>+B|{ tZ^x6mXYYOV;9tAtcQjPFPemisAIT$HC=p?AhyVZp07*qoM6N<$0fJqdMV-PYDjdAPlM;{r{6k)l3p& zA<(1RRJS{@Ldqh@^AJ+`*N>1=xGX_pDpbd9#~YDoMu?H(xVRc+Omcb#M@TyG05g`@ z^%m*f3D=>}f&4Mge#cr6I*w<)=sPCtMR>U%0mK22Bnkm@Qb$4nuFf3kks&ukh>GZx^prwCo0-7Nlcv>?<252SNaG85O})!xvX4fItueK^YeQ|6~L8yi_To4&XR`rO8!4 z&?ZUE4XN$1(F<*Y7Q`KEgHFs2nMhcyTLb&3kt7xvB+%OUm=nV>0Z5eDXG#D7002ov JPDHLkV1ku_DaZf- delta 117 zcmV-*0E+*$0mT83Bnkm@Qb$4nuFf3kks&u=OG!jQR2Y?=jY$%~KnMZ{Q2+nrkj?R$ zP#&bEaIIge%zN~LvM~`K;8hBV*x<|%4N?`t02S%{Ohf{7rr(O>EcI%!f$x{?j*mJ3 X!!ZF!57n7%00000NkvXXu0mjfU&}G@ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_pillar_side.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_pillar_side.png index 07bc8a22f9d732aa79c5eefe5961d1e756d55164..a56e2bfbb7bd8c57dbf668d1f4137a63b826717b 100644 GIT binary patch delta 102 zcmV-s0Ga>q0n7oAB#|*pTt`VnK~#9!ZOy?AfItXD(J4VYfDRzSeLYP7EjfzE&C4eo zNC0i%vVrp$U`R5+B{vr|KD#CVt<8 delta 135 zcmV;20C@k*0q+5jBnkm@Qb$4nuFf3kks(iV32;bRa{vGi!vFvd!vV){sAK>D07ywh zK~xyiZOyR_z%U3z(Hp_p05$*xdb_y&R|+;Mt*4JDkN~COm4;_D(2CQ*Sr#X19Jj^) pD09Z*x zK~xyiMa|I(z%U2|&?A$`O^_Yp04bGD&~*P1dRjs`5kDRtu30${Rw0Ic0U9;5G|!Tf zS?)bd=5{ZGJV=?)Q6_v?nUm}?`9cf3Ywj-ly9`Z;cmXfk8y+XtM<)OP002ovPDHK) GLSTYg=Qp4L diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_polished.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_polished.png index 0077b7760fc0123895a4d7099ca234c8b28bf8a4..beedbb1d1702fa45df653348ff7492665dc57fde 100644 GIT binary patch delta 134 zcmV;10D1q80_*{hB#|*pd}m2SK~#9!9Zi7^fFKO3`T)oSFdhJUg7E-F|9{2KEz7#C zU2(o1&w;rc%~BU2IW~c$UbcoSBK&#Nx>y;LER}2m7N`;@0!x54g`?_pv#XDcD`1KK oV)~q1W$s|kk;7UWdX!WTK0!YeGzSkaH~;_u07*qoM6N<$g0iwT{r~^~ delta 167 zcmV;Y09gO*0geKYBnkm@Qb$4nuFf3kks(ii32;bRa{vGi!vFvd!vV){sAK>D0B1== zK~xyi9Zi7^fFKMj`T)oSG9CbWg7E-F|9{2KElazt-Eh7h&w;ra&2kqZIaZM@ENjD+ z5dXYsU8)_EER}2`7O9dZ0U<(@!cn!l*@a`r6%mr3nBHf1nSU_X=)+PQdXg0gA3;A7 V6f}VsQ!D@g002ovPDHLkV1fu8J~aRU diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_tiles.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_tiles.png index cc5bc0d33a4fea6aa191f00590f305fc29bbf706..f90da9e3bfdc8e984f515c28215f90c9f1c79ef6 100644 GIT binary patch delta 46 zcmaFLc!+U=%0xpSc3V#u$B>F!6K5JprY)Fc$>3=#{?<{;btVH4c)I$ztaD0e0swa! B4=(@! delta 79 zcmX@a_>^&i3KwH>kh>GZx^prwCo1~Oa29w(7BevL9R^{>zopr0Q68A0RR91 diff --git a/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest.png b/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest.png index 008e73c409316c3723001d299ce3166e66245fc2..5c736a988c49ba429d52ee1c9c22719061b6c0f4 100644 GIT binary patch delta 618 zcmV-w0+s!V2J8ipB#|*}e@96~K~#9!?Uv1Q8!-%n?ZJWmiAa#t`#)T_(cF zA%9um@pwKSdk@gowA2((iy$LN(^oA#pC8ZX$G!q@s%B=YEg+2Ee|z@cd-7F*v%pcn zv=Q*k>^(Dk`dR^D+m_IXkwMR%vAP01T2Mf17s9E!xPoZafoTg7@4b%{T-GyCRa0#Q z7@3vfY74^Fw5h7LMiFLa&&#o=9e-!{^>UxrV>sqT}nF@@Fi_CBVBZl8x`Jlif!b#5zp9_rncank= z4{+iENFUy&O|67Bt-CLF;fF~3bPj^mDk(zq-OFNus6aD=G6Qb)C^KsQGm`)hz^x9G zTFpOc3OUhXZ3WSH3I^Z@;Fgg#=07utGvHP;=-X95?1=qge+CgG-Bd&mz^SZekXs5P zg8{hsNd^TnmownjR$w)K5g7z*I!LP-Ov2gyZ={vh-3%1pKvB@};k6JlyzRdgdS)iN z)67`hBdvT<(7k*)v+^e}GZ0Q>*H zbq9ehDP6ZpcOS#C-HsCx7+|E!<$C>mTy{&}*yZnbz20!`h&VIbEy7I1ZuXAp#KG-$ z$JHDxhZQ)`HB3$&-0u%uM+$javfGkV%0-pg?vl?^csxFF9T5oD7Z@C9LIm5kt(!f6 z_{_m*iNit33#TLq9*gl=#WO$zN+eq~ zV?oZU@Du@i5iA05P*bQbW>csfR3FP?jZ_&h)6+h9iXgW}G7gZBwIu?Y<$#4n)gEG1 z!2gbUwhAyJyUG3x=w!)9%v$|A{fIt)U=?*)cSb*=N{*rCASMn^6#~-0J93OFB#>cj zNd0E#Am-nQ!jfJO(x3-G61a3lb%u7EN8eQ8MM)dYD$ky3m9!!Up6f&(;GMQ!;AUId z9BkhIHcU<6W`_v`*ZHq1NP{}eMWEZEf(l7%0yiybG5^Lv8U=1H0_gC*6;uv?juc+u z!1e*t05T4Cfy#SJa1a8guW;Z(CNv7%Tm;3Z4-b%-O4mrU9CVgOG#A0|CCzOf zwcj+E2%&J%kigj`Byc%CbLnXga>g5!nqBwUMwn~!P<&>$qf#6Xny4DRi!%UpZ;eJk zAxsn7`G8`xf8HtU>sVtl8g0;UFY)t1b-o22M0KD4x}?_wO8xo3-8o(d4vNpe)7I+& z4d(+Oqc7X{Ie$$7xBp6{PK#zuueSzs00000NkvXXu0mjf$9gEB diff --git a/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest_left.png b/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest_left.png index 54b7154b47c8a7f2b02c1ada178cdd7dc42122fa..2538d299a2c54d8308d17159827d37cad6eaf822 100644 GIT binary patch delta 535 zcmV+y0_gp$1(^kqB#|*}fAmR2K~#9!?N-@t#2^ez!~=UY#y0%_x7OxP6jr2F`;?JL zG_o>_jXmtLJl;!#`H1Bd&&Q(?i~vL;LNwHIq2~gx=d+Qm2O3|&Ol~0Xe!T_)U=W$p z5^Mv3uXk4j0C2Kld5HkY4nhdJg6?4;u!9o;Sr8S-=!d$Z4$cVZf0xdwM&5x!_MopR zft-A)K|Tf6w}Yt^T>5=iQiw=Z;Mo*%1?n-T8hXBvLhA!9Vrhlz0${YD+J@<9X9QT9 zhNSD#!%)X*Y6tt_Sr7EGfL+IIJ(rW}LtOD7tl1imti`u&R0HNTexAu1Y+M*|ixZv- z?ES#5jW<@}rvi2lfAfLai6YKf+CBv$*1UCkPF{ zS&dKlfnA~T$`W@l_Jh*Sk~R6lS!=*8jxgK-#XCVEpSa3hJk%P8?QibJ8#iv;xbYi& Z1MrPaK99@34PyWR002ovPDHLkV1fmO1@`~| delta 552 zcmV+@0@wYS1*`>-Bnkm@Qb$4nuFf3kks)t?`bk7VR9J=WR@;t+APm&-z`3mSg8%=m z+j7U?37$>%$w|;m8b?~%(PeqOmkRR{%Mj1UqY?~oh(v^FsNq7#0Ae{p19o$q35Z@0ug@9OvsT#P9<``oQJzq$n_JI~Lx59M+ zXSAT&hVf`;1X!Aer0e3vP{V0z2mSD@2YOk+uIFqW%SrWJSm7Y7*(wjL#<%UP2F!8% zJd-t8xiI1yCmag&eqh(iE6eerfbC&_J}^5`#5qgrQy^l^Tc<}39$P-u2g$$U70scu zX9d#yd-_74nSV8a!)QzhH1ogjWFY&4HqMkEH1n_X8$32U+*Atf{Hp+@=cff?2{;@g zmKwNAHSnbhWHf=H)1-k{1B#|*}e-=qZK~#9!?N-6E;~)%6#s}Kh#g=XU|6BK9LQId+YvL0z#=Vy5& z0-gz24KRy^oUh>VSds{&wN?%YGr?Q))>?D-)|P*R5Z{Xkvk0ksfB(2Oe}f=C7YPlT zH^01sNdqPZ0GPhe;6PxZfQYaNleJiU;NliG5t*4_zG-+}#OWS*>_70f29=nF0Tl-1 zng&p)nL^D>ji8q5D+KSGY0Wdr`s#~yp1b{L<*s|>TBuguYn};ejk&cla~%ZTaOQ4W z2xg-`$_@*-yBjuwe>M3XWu5cjK%hGE0fT@_#$1(|pu8IV{1l$V~ zfbQ;xn|+mF`2Q0EmgIjsSmRP2WdA!^&G~R?3)%l|B%Cl`C9vdw-!qm)t`V^GKA=!V z*MQ&Bz>^AOBjH4j-g==yM0xY}!7)m>t^bg`O)%#H)v5kpf034hYOd&seSIDzK+&%* z3PqIYX+Q5{F)kxem{lPnVCF&$$X4TUb08wBF`hEfZ0rAyLh9)~aLB~o=VN@&MD?xz zyOtICJ#c7-F{%HV?x8yT?2hS_;{$5C_%rgAXWu5b2Cg4q6Q!oz=`WD=qg$8Y_ zk9~m=7U`=^FUP3+F-A)`KgJsGl|Ej6t2ch}#TQ?E@q73S_f}0*OE#Os00000NkvXX Hu0mjf`K26T delta 590 zcmV-U0?SutNtm#{k}Xbz-G+> zB{gD8rvQ(~@-zUU2M9<2M7ogk6+EAdA;BR}3u-Y02Wj8=;vw3=U;~ zUY;yK^8h-X0Wt?XHBGOe;~=<@b0>Vm!2m$YfTX~eqg@xTHkm>tF$js2Du?qVcIO~z z{%SJ-<2m5XCPm`cIc|K1cX=5Y#uO#P=r zW3xog00;-U51^d8!a?|mgJf6`4vNA_7E>wIMvyzo7uy)M+REVK#{j(^xUKVlX8^vD zG%HlS=U&j)*PzQgR{FPhDkatL0ZL5cu?b4xk_A2`z-fAEhOzoEoE-U8VsaZzB&z*C z@d_}R_klqZOP|;Hp^2Dk|4+!8Xx|5hW~dL9Kf^;*Tm2^y)lLsySCGp4f>C8Y{k8ss zUwb|10YW90c1?Un%jH!e4viWtUxc c*=7G{zxP&6REM;t1^@s607*qoM6N<$f(S(q&;S4c diff --git a/src/main/resources/assets/betterend/textures/entity/sign/lucernia_sign.png b/src/main/resources/assets/betterend/textures/entity/sign/lucernia_sign.png index e4003bd19109348fe94d421fff7365b3025afed4..0836dd4024b042cf1e2bbcaf2cf15a963dc01ecb 100644 GIT binary patch delta 316 zcmV-C0mJ^e1Ed3xB#|*te;Y|eK~#9!#goC3gdhw=CEb}M1pohc_kc65>|rQ4Y!1q+ z(w02paU7~t0syHh)Ng!@1wa51$a~RmMM{w(A|g`C&BN=eP`xfBbcP=RR3!)j*`Jx< zp#dsM=^p@QcnIj-19B~Xu}CT9x|N#;2Yp{xVTPXpy)^&?0h!@pe+Rq{nFJIwJUT#c z9U=g3zFIGXia!qU>Fr*9;pZGs6(FEWB{{>-0DwwJ7X{4l(}CO$x`H>Ccgyb)`0(&I z9Vz0AXRc2M2SmIESdL`1ABZ0W6LT@GkxSk1N`U~V3@whf6M zHQV|rM1-69y2O{6GP!RIvwMa`t~;nLt9d&&2B~G3ZAh%yT5L%C_xb_3O%79hQFY1y O00009$fIGCc9s1^j#~oVW^u^QfDMjSy3sFpO z@IZjFC=zm7f%eS{JPCk8qRJvoe|&Qk)TVn(s0Fp z@CHv6(Ai|$EyFXOJ&0X;n}B%ZQ@Wq5_~SwRYP(Mlc$@=hGJUa4ti>}P30k9JPCC2% z0*@Yq+k+34&iRvBc&CEGU|A**En=}upjEjR zEz1P;kX*E`6J&;krPO5tG(b?ndKbhx<^V-36MWD@=8a)yR>`949+avjb6p>0Bu5E( h!$h>8%7%&m9zVHF4pULsRmT7T002ovPDHLkV1jkhor(Ye diff --git a/src/main/resources/assets/betterend/textures/item/amber_root_raw.png b/src/main/resources/assets/betterend/textures/item/amber_root_raw.png index b2226f5fc6a86ea828dbc1e9a9120f7f765db5bd..adae9d37aedd37688d8c2f458e8d2518026c0a96 100644 GIT binary patch delta 32 mcmdnPxSnx>%0xp)rixn=ODqKPgv7rw0D-5gpUXO@geCy6mI_4x delta 43 ycmZ3_xQB6q3KwH>kh>GZx^prwCn~xyNlcxXZXqybT0j&75O})!xvXF!$q5Ts42&0ljGPg`Dlt>yVu-Pk&`K$#Lmi3i%);Ep fjJZ8MDZe=wRKyt^xaEXaG5~?6tDnm{r-UW|wDK10 delta 62 zcmbQlxPWnj3KwH>kh>GZx^prwCo1Z*>v_63hDc1E7%nF_i=)lVtt7dFok2yM!J*rn RVLk&8c)I$ztaD0e0sukZ5u^YB diff --git a/src/main/resources/assets/betterend/textures/item/chorus_mushroom_cooked.png b/src/main/resources/assets/betterend/textures/item/chorus_mushroom_cooked.png index 2f55abb4942778f92079a01c02a35880e6fb6da2..ebed2b9b67f11cb4a5a1b0f1d773e5abea912a8c 100644 GIT binary patch delta 90 zcmX@lcz|(&%0xq-0BcVd$B>G+wOxjM3VQ`fOM uzuFRKbXc)K$2ixqMYM*4(OKf~+kBZh4UEhTuE&`ffWXt$&t;ucLK6VpIv=b6 delta 103 zcmV-t0GR*40nY)DBnkm@Qb$4nuFf3kks(h~JxN4CR2Y@5jWG@YAPB?+1O)v5dtEs< z6T7v!53|L^rWc-v%qYg3WmI43uI zRXUu9N}JwF?iCzHWrR_{P=H)*O2eQ%;2FMg0i~Y-8PIKknE(I)07*qoM6N<$f)7k3 AumAu6 delta 107 zcmV-x0F?j40n-7HBnkm@Qb$4nuFf3kks(i3K}keGR2Y@5jX@5;APmExr0q!g|9f{$ zxlNjHu`Feb-#CX`cNGJnLD5$F!6BG0$CjMh$&@y50zutZ72m=s!y85}Sb4q9e094Zs A?*IS* delta 57 zcmbQmxPozl3KwH>kh>GZx^prwCn{>QTY0)ThDc1E7_2WDc69~=gO&+{KOe8BJp&MU My85}Sb4q9e0O;ut@c;k- diff --git a/src/main/resources/assets/betterend/textures/item/end_stone_stalactite.png b/src/main/resources/assets/betterend/textures/item/end_stone_stalactite.png index 994dd767ca550f662be9050b2c083f14e373d9c7..9372b7cf6bb32b0d589ac9fd00e36fc1d0f67852 100644 GIT binary patch delta 175 zcmV;g08sy-49fwKB!7}gL_t(|+NG1R4uBvGMEn1&euAIis+(?(E)I^4jt(xBLz@s2 zj8{o6KuBM&6hu|!kIDye^j)|XB0OLmf=+X#m|cKnt##WQ#q4$fz<#vJ1qHB-xeFQ) zvnCe^#$C7^pbIF$1wb(DLo~pwn*fXA0C{%o0igg0ME%x)xZY(sBR*002ovPDHLkV1mnlNy9&h$io{Dn7JVr7QL3*Mo3$v4f-k=K;024%x?PnbtMN=OgGkldfivg!o$tT@ z=jZ31*thq=y$r+bD;9DKbdCmN^e*~8yxj$K8gmLu9>a|94@QJ}W8)yh?A|s@i~gc< zT!X|C03u~9G%bgs8D=KkbO2n%K3m2W)7H5kuUzF=6Y1QkgdrJD7FW%}nu|}a&6VKV zDoi0ReUzPPYLvjjK46aTx(<#-j_pDGRh`QO0@+1lp3M>$vk4)|LpiRn zQz=1CN+~7&D62^FlqgM!vdT-cCM7jB#ST7>N^{YQwvc;#AdBvFuIl@aCW?(lLujZ1 zaVw&nN~J_e5fz1}2;OViK4|i`7aKCO&2h3JCb%_P_+0E3N;8BB-qp z*838_fsA;t+_NyX!Q3ei;pClM~= zvN8q1@O_TJdJx3nd-OlwpKwiDM4)!(JYkTuEU6LKAc%Td4N|z5N?O76XuMj3qBx14 z9;|96+shsez#zeO4hE6Mh#MT6ckG!yZKH}Q>A!@#5A(>1-vBPoRHzqkC!<8FzZg_w z-xTrhR`%}xQn^DoZ3n?J>_c=Db~0?!_T|z(mHGAj&$P#VS|ibkW$H#^(wGvfPaemZpg*z<+& z>wCt9?#Rf6tv|Leb=O~FuAD>S#$(@%fC))@rh8-E7Y{DIF74cmZ0%YC%nP%|xN+|A znGdcf&ffdv>@KaFe(&mA-!gYkTzn0VZ3#^N;nC-IzSxXB@Y{*@fj85wPG|GOPuaOGf_Jhc3|)V}Y<<&O?=8`FvFeq@qi?tlB(Q@?!t!)DOL Ni}|_SJG0Br{t11P|IYvb diff --git a/src/main/resources/assets/betterend/textures/item/end_stone_stalactite_cavemoss.png b/src/main/resources/assets/betterend/textures/item/end_stone_stalactite_cavemoss.png index 6d3cdf8b9b9aa0371951c9fd12851edb6379d9e2..478e770d1a2bd1a4e4418958ffbc2110200179e3 100644 GIT binary patch delta 243 zcmV~Ofci(j58TsU&1a)jJfOQ7^!EZ>7Xgl! z0nf3r5a~qfA*p3sp=HrrH1gAEE~-RBx43*NbDrWeflS002ovPDHLkV1j?0Y0Urt literal 2103 zcmcIle{9rL94`UJfM7t449K9AAR6rT=iRks=bU%Qh8&FB=>`h!-FvThb$4xPd%GJD z6$goi5G6y6bILClTSKlhF8&F~ZLHnA%%!ODxA^A>s(+x4 zqH4Aq$quh0zDR>sE&z~~!hvGWCTNOkXe`1xFYQ{vUg*niD2bP3{hMVKZ(Al(sf zrK6UE>0ltlLO~Ykuo@6Tyei6f(IPK|IX=t@63Yu3AJQb1E*}hu<{({5#O^D{B2N(} z<9W8mafL!5P>=$alja0fRXJYdM3E&3*6lGpP-IPaR)rykUFaCLXILifGlGFrQis1IE!=G^jv}!s#u~@JYIzlOPkA8 z(XKbYn`Bh3ZCJFM?6EPIz^;{dAfDe%BF?HLW@jwVax>Od>ZpFMR%2^X2LsP?l9rXN zG^(}2LPw*1V-)(1cEdzg!M)QDRGx!lz{3$nSPfwYvI z3d$&?vmrUCvx*{zSw$97ECNAZfhj>%fK-_uvtZtDqCbDg&&Yy=qbi*S*VymN*9ar9k#dRzE957(+0`BMC_?#5l-`sw}fABBLM< zA)LY~F$@7i{~b4KWi2OeA)>kD8@gmHt=Vu%_j<~|NE=>N9%T)>Bbw(zAP@x05grr3d%7zUeEQp_8Q&z-|FG~wR6a7 z+`nB|`gX-SOWIj_MHX*=Slupk8ip>ru$TrGNx(r=Wi;t>{FL+Uor37ZG%mg zlBwA~W&Kylmwz_Sjy}}OeRp)t?-wTRy7l>Gb2r{pJG1%wdyG^2f`fvZcqjefAKaLo zA59;4W&H8{`G-E)K)Lx(A>r`5qT-#jp?{>=H0+qQi11I6uMy0$O6fAZE<(|4R+vpatzliQYfv3KmcOykIx zUYmGv${SyvKlAwOU7H`vzk6`fZ%gR?kKR0bFF3gM;l9TDAD_GQS?83Rj-yW$`;N_S zJ$BoQ&dtv(T39#x@VSIizx@4YKV{Y)J=uTmLwjNK%0o4KW*VbTez5cG)RY%L)-%HD h>X^3_eZA^3wMAMNy)f;kjsDi&GJkRGt$RD4{0qk1z3>14 diff --git a/src/main/resources/assets/betterend/textures/item/lucernia_door.png b/src/main/resources/assets/betterend/textures/item/lucernia_door.png index 9f0a205a98c53945fa58f3495ef455ed2e90a919..5b172d7600df00b48447b4e47e73cd983bf8a28d 100644 GIT binary patch delta 111 zcmV-#0FeLF0l@)~B#|*VWl%{(K~#9!jn6p_05J#yz<{s+|2SPjn$=Q{WZA6s>#8it zb)nVO>I-TRtpjbufd|mb91z4o4j=&W00A%~!Y~sI$8U?I(NbcusE_I6xed|@0mKP4 RA_@Qi002ovPDHLkV1kv9E)W0! delta 127 zcmV-_0D%9&0n-7HBnkm@Qb$4nuFf3kks&*3RY^oaR2Y?wk3kYZF$6wt6wJU4Jc6xcv;%-TR}LK{G+8yBb+p|%n$y9&iyrJObu h%dpC0?6uyW`vB4j0mL9!1-JkJ002ovPDHLkV1mIIGlBpB diff --git a/src/main/resources/assets/betterend/textures/item/lucernia_sign.png b/src/main/resources/assets/betterend/textures/item/lucernia_sign.png index 36c11d16adc04371f23953db0b428868bd5a3e72..5cb550d8259024255cee48433e6382ff600fed6e 100644 GIT binary patch delta 111 zcmV-#0FeLG0mT83B#|*ZWl%{(K~#9!jgG+zgHRB};?A0V|Nq4vN?R35%`q@T-~nsR zs55J9fGJf|)=QX}GN~AV<(C~`EUWZ7NhSW8^cjHd%%`riU32Zb*#C)s{~c+N0z$QL R2Sxw@002ovPDHLkV1grFGG+h( delta 124 zcmV-?0E7R<0n`DIBnkm@Qb$4nuFf3kks&{4Qb|NXR2Y?wjzJEkh>GZx^prwCo1|dNlcxXZzS+xF^@h25O})!xvXxR!B(7GvB*?IM9)2i7_=0D-5gpUXO@geCxmF9{9+ delta 28 icmZ3>xR!B(7UQjn+C>6EZ`(I80D-5gpUXO@geCxw4GEY4 diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_1.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_1.png index d7f38fe772efd800fcdde38100aad03a3f1da0de..1bba4714292d5ee9c2109545fa88c34cddba87cd 100644 GIT binary patch delta 46 zcmeBUY+#(AGSSdNh2PV~F{I*Fa>4=b8mdKI;Vst08G&i A1^@s6 delta 58 zcmZo*>|>mu!o^q|$0-i38AsjQ46Ap0S_~@<7z`&T!z+sYUn#2GE Mp00i_>zopr00RaP-v9sr diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_2.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_2.png index b05a98ef2bce9149e2b89c6873a684865915cc05..24c8cac1d287f6a90cff830b8c5700480a35e1ec 100644 GIT binary patch delta 46 zcmbQl*vdFTWul?2O2w_@gad3h5>2G7XL0B;FtF}oP)^&kXD0&?c)I$ztaD0e0sv&m B4$1%k delta 57 zcmZo=oWwXmg^RH`$lZxy-8q?;6BQj)IA$g%9ALYVXd-Pri$jlrfpr&yvb#br0|KnY<0 delta 43 ycmbQjxR7yz3KwH>kh>GZx^prwCn`EHam<{UtSHcMTGpNc2s~Z=T-G@yGywo3o(&lQ diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_5.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_5.png index 151c38e663e4d03703c47617bcd24ba4f47aeb6f..4e2c8f6a2eee0f13843711438e492b741fb44f18 100644 GIT binary patch delta 32 mcmZ3;IE8V7%0xq3rixn=3ls$&%kD8^00K`}KbLh*2~7a5$qG>b delta 43 ycmbQjxR7yz3KwH>kh>GZx^prwCn`EHam<{UtSF#!^-~A~5O})!xvXkh>GZx^prwCn{Q7D0{j%hH%VGP5^?`1|~6yvpi`VHyIckZr-5O fsj$-V1rsv^*DVI;uYO)17=Xaj)z4*}Q$iB}-LDy$ diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_7.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_7.png index 248953f74fc5a5992080c14a65e7d8ffd0ecbac2..5dbe73a5fc52b357a29207246c0785f175090aad 100644 GIT binary patch delta 65 zcmZ3&IGJ&R%0xp8b0tp~$B+s})`N|_3=ABH6(0Tif0l_Qg=x2=_4Wkw37i}ZHe4MH Uj<(lbw=e*Kr>mdKI;Vst0I4SwV*mgE delta 80 zcmbQtxP)kh>GZx^prwCn{Q7t9iOOhH%VGP5^>L24*p~G>yqKJ0*1voH=sf i$eAXUrX_4{j*JXk9Sn{pvG=VQfWXt$&t;ucLK6Th_8Kh! diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_8.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_8.png index 67582a9c47b388e9a0aed30a946d441e8e6ca4f8..a090655064b3d00746b99377ec14742aaf11df81 100644 GIT binary patch delta 57 zcmbQsIDv73%0xq3{ffBc1R!8aQb=HPRyn}($j~{}@XCS?V+ID+3 K=d#Wzp$Py0Xb|fF delta 68 zcmbQhIG1sP3KwH>kh>GZx^prwCn`GVbIeRm0D>e2<}?ErCLaYkW8qB#lcYon*%(+e V7!==ruU*Li1fH&bF6*2UngF)L6ZZfB diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_9.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_9.png index 6ff4d9811ddd80595e86dd617d284072fc431d1f..86e14dd1b282747b499189d702b609568f41c058 100644 GIT binary patch delta 32 mcmbQm*vmLUWul=iQ^l=`1yTab+?ClGfWXt$&t;ucLK6U>vI%7X delta 65 zcmeBWoW(dng^RH`$lZxy-8q?;6BQkFIA$g%06_`^vzkU5vzy8!MrYnG3uXo;69(Sz S? Date: Wed, 17 Mar 2021 14:26:39 +0300 Subject: [PATCH 350/463] Additional plants --- .../betterend/blocks/BoluxMushroomBlock.java | 57 +++++++ .../ru/betterend/blocks/FlamaeaBlock.java | 63 ++++++++ .../betterend/blocks/basis/EndSignBlock.java | 32 +++- .../ru/betterend/interfaces/ISpetialItem.java | 7 + .../java/ru/betterend/item/DrinkItem.java | 24 +++ .../java/ru/betterend/registry/EndBlocks.java | 29 +++- .../ru/betterend/registry/EndFeatures.java | 4 + .../java/ru/betterend/registry/EndItems.java | 1 + .../world/biome/land/LanternWoodsBiome.java | 6 + .../blockstates/aurant_polypore.json | 24 +++ .../betterend/blockstates/bolux_mushroom.json | 18 +++ .../assets/betterend/blockstates/flamaea.json | 11 ++ .../betterend/blockstates/pond_anemone.json | 10 ++ .../assets/betterend/blockstates/ruscus.json | 24 +++ .../materialmaps/block/aurant_polypore.json | 3 + .../materialmaps/block/bolux_mushroom.json | 3 + .../betterend/materialmaps/block/flamaea.json | 3 + .../materialmaps/block/pond_anemone.json | 3 + .../betterend/materialmaps/block/ruscus.json | 3 + .../item/lucernia_outer_leaves.json | 1 + .../materialmaps/item/lucernia_sapling.json | 1 + .../betterend/materials/glow_80_blue.json | 8 + .../models/block/aurant_polypore_1.json | 153 ++++++++++++++++++ .../models/block/aurant_polypore_2.json | 105 ++++++++++++ .../models/block/aurant_polypore_3.json | 129 +++++++++++++++ .../models/block/bolux_mushroom_1.json | 81 ++++++++++ .../models/block/bolux_mushroom_2.json | 117 ++++++++++++++ .../models/block/bolux_mushroom_3.json | 153 ++++++++++++++++++ .../betterend/models/block/flamaea_1.json | 6 + .../betterend/models/block/flamaea_2.json | 6 + .../betterend/models/block/flamaea_3.json | 6 + .../betterend/models/block/flamaea_4.json | 6 + .../betterend/models/block/flamaea_5.json | 6 + .../betterend/models/block/pond_anemone.json | 111 +++++++++++++ .../betterend/models/block/ruscus_1.json | 97 +++++++++++ .../betterend/models/block/ruscus_2.json | 64 ++++++++ .../betterend/models/block/ruscus_3.json | 64 ++++++++ .../models/item/aurant_polypore.json | 6 + .../betterend/models/item/bolux_mushroom.json | 6 + .../assets/betterend/models/item/flamaea.json | 6 + .../betterend/models/item/pond_anemone.json | 6 + .../assets/betterend/models/item/ruscus.json | 6 + .../shaders/material/glow_80_blue.frag | 4 +- .../textures/block/aurant_polypore.png | Bin 0 -> 247 bytes .../textures/block/bolux_mushroom.png | Bin 0 -> 287 bytes .../betterend/textures/block/flamaea_1.png | Bin 0 -> 253 bytes .../betterend/textures/block/flamaea_2.png | Bin 0 -> 252 bytes .../betterend/textures/block/flamaea_3.png | Bin 0 -> 229 bytes .../betterend/textures/block/flamaea_4.png | Bin 0 -> 219 bytes .../betterend/textures/block/flamaea_5.png | Bin 0 -> 213 bytes .../textures/block/lucernia_sapling.png | Bin 0 -> 245 bytes .../betterend/textures/block/pond_anemone.png | Bin 0 -> 279 bytes .../betterend/textures/block/ruscus.png | Bin 0 -> 186 bytes .../textures/item/aurant_polypore.png | Bin 0 -> 209 bytes .../textures/item/bolux_mushroom.png | Bin 0 -> 236 bytes .../textures/item/bolux_mushroom_cooked.png | Bin 0 -> 213 bytes .../textures/item/filalux_wings.aseprite | Bin 701 -> 0 bytes .../betterend/textures/item/filalux_wings.png | Bin 0 -> 413 bytes .../betterend/textures/item/pond_anemone.png | Bin 0 -> 253 bytes 59 files changed, 1468 insertions(+), 5 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/BoluxMushroomBlock.java create mode 100644 src/main/java/ru/betterend/blocks/FlamaeaBlock.java create mode 100644 src/main/java/ru/betterend/interfaces/ISpetialItem.java create mode 100644 src/main/resources/assets/betterend/blockstates/aurant_polypore.json create mode 100644 src/main/resources/assets/betterend/blockstates/bolux_mushroom.json create mode 100644 src/main/resources/assets/betterend/blockstates/flamaea.json create mode 100644 src/main/resources/assets/betterend/blockstates/pond_anemone.json create mode 100644 src/main/resources/assets/betterend/blockstates/ruscus.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/aurant_polypore.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/bolux_mushroom.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/flamaea.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/pond_anemone.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/ruscus.json create mode 100644 src/main/resources/assets/betterend/materialmaps/item/lucernia_outer_leaves.json create mode 100644 src/main/resources/assets/betterend/materialmaps/item/lucernia_sapling.json create mode 100644 src/main/resources/assets/betterend/materials/glow_80_blue.json create mode 100644 src/main/resources/assets/betterend/models/block/aurant_polypore_1.json create mode 100644 src/main/resources/assets/betterend/models/block/aurant_polypore_2.json create mode 100644 src/main/resources/assets/betterend/models/block/aurant_polypore_3.json create mode 100644 src/main/resources/assets/betterend/models/block/bolux_mushroom_1.json create mode 100644 src/main/resources/assets/betterend/models/block/bolux_mushroom_2.json create mode 100644 src/main/resources/assets/betterend/models/block/bolux_mushroom_3.json create mode 100644 src/main/resources/assets/betterend/models/block/flamaea_1.json create mode 100644 src/main/resources/assets/betterend/models/block/flamaea_2.json create mode 100644 src/main/resources/assets/betterend/models/block/flamaea_3.json create mode 100644 src/main/resources/assets/betterend/models/block/flamaea_4.json create mode 100644 src/main/resources/assets/betterend/models/block/flamaea_5.json create mode 100644 src/main/resources/assets/betterend/models/block/pond_anemone.json create mode 100644 src/main/resources/assets/betterend/models/block/ruscus_1.json create mode 100644 src/main/resources/assets/betterend/models/block/ruscus_2.json create mode 100644 src/main/resources/assets/betterend/models/block/ruscus_3.json create mode 100644 src/main/resources/assets/betterend/models/item/aurant_polypore.json create mode 100644 src/main/resources/assets/betterend/models/item/bolux_mushroom.json create mode 100644 src/main/resources/assets/betterend/models/item/flamaea.json create mode 100644 src/main/resources/assets/betterend/models/item/pond_anemone.json create mode 100644 src/main/resources/assets/betterend/models/item/ruscus.json create mode 100644 src/main/resources/assets/betterend/textures/block/aurant_polypore.png create mode 100644 src/main/resources/assets/betterend/textures/block/bolux_mushroom.png create mode 100644 src/main/resources/assets/betterend/textures/block/flamaea_1.png create mode 100644 src/main/resources/assets/betterend/textures/block/flamaea_2.png create mode 100644 src/main/resources/assets/betterend/textures/block/flamaea_3.png create mode 100644 src/main/resources/assets/betterend/textures/block/flamaea_4.png create mode 100644 src/main/resources/assets/betterend/textures/block/flamaea_5.png create mode 100644 src/main/resources/assets/betterend/textures/block/lucernia_sapling.png create mode 100644 src/main/resources/assets/betterend/textures/block/pond_anemone.png create mode 100644 src/main/resources/assets/betterend/textures/block/ruscus.png create mode 100644 src/main/resources/assets/betterend/textures/item/aurant_polypore.png create mode 100644 src/main/resources/assets/betterend/textures/item/bolux_mushroom.png create mode 100644 src/main/resources/assets/betterend/textures/item/bolux_mushroom_cooked.png delete mode 100644 src/main/resources/assets/betterend/textures/item/filalux_wings.aseprite create mode 100644 src/main/resources/assets/betterend/textures/item/filalux_wings.png create mode 100644 src/main/resources/assets/betterend/textures/item/pond_anemone.png diff --git a/src/main/java/ru/betterend/blocks/BoluxMushroomBlock.java b/src/main/java/ru/betterend/blocks/BoluxMushroomBlock.java new file mode 100644 index 00000000..e59a4283 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/BoluxMushroomBlock.java @@ -0,0 +1,57 @@ +package ru.betterend.blocks; + +import java.util.List; +import java.util.Random; + +import com.google.common.collect.Lists; + +import net.minecraft.block.AbstractBlock; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.ShapeContext; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.context.LootContext; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.BlockView; +import net.minecraft.world.World; +import ru.betterend.blocks.basis.EndPlantBlock; +import ru.betterend.registry.EndBlocks; + +public class BoluxMushroomBlock extends EndPlantBlock { + private static final VoxelShape SHAPE = Block.createCuboidShape(1, 0, 1, 15, 9, 15); + + public BoluxMushroomBlock() { + super(10); + } + + @Override + protected boolean isTerrain(BlockState state) { + return state.isOf(EndBlocks.RUTISCUS); + } + + @Override + public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + return SHAPE; + } + + @Override + public AbstractBlock.OffsetType getOffsetType() { + return AbstractBlock.OffsetType.NONE; + } + + @Override + public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { + return false; + } + + @Override + public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { + return false; + } + + @Override + public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + return Lists.newArrayList(new ItemStack(this)); + } +} diff --git a/src/main/java/ru/betterend/blocks/FlamaeaBlock.java b/src/main/java/ru/betterend/blocks/FlamaeaBlock.java new file mode 100644 index 00000000..183891c3 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/FlamaeaBlock.java @@ -0,0 +1,63 @@ +package ru.betterend.blocks; + +import java.util.List; + +import com.google.common.collect.Lists; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.block.AbstractBlock; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.Material; +import net.minecraft.block.ShapeContext; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.context.LootContext; +import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.BlockView; +import ru.betterend.blocks.basis.EndPlantBlock; +import ru.betterend.interfaces.ISpetialItem; + +public class FlamaeaBlock extends EndPlantBlock implements ISpetialItem { + private static final VoxelShape SHAPE = Block.createCuboidShape(0, 0, 0, 16, 1, 16); + + public FlamaeaBlock() { + super(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.SHEARS) + .sounds(BlockSoundGroup.WET_GRASS) + .breakByHand(true)); + } + + @Override + protected boolean isTerrain(BlockState state) { + return state.isOf(Blocks.WATER); + } + + @Override + public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + return SHAPE; + } + + @Override + public AbstractBlock.OffsetType getOffsetType() { + return AbstractBlock.OffsetType.NONE; + } + + @Override + public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + return Lists.newArrayList(new ItemStack(this)); + } + + @Override + public int getStackSize() { + return 64; + } + + @Override + public boolean canPlaceOnWater() { + return true; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java b/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java index 88ec4aa0..b194dc26 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java @@ -13,6 +13,7 @@ import net.minecraft.block.ShapeContext; import net.minecraft.block.entity.BlockEntity; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.fluid.Fluid; import net.minecraft.fluid.FluidState; import net.minecraft.fluid.Fluids; import net.minecraft.item.ItemPlacementContext; @@ -38,11 +39,12 @@ import net.minecraft.world.World; import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; import ru.betterend.blocks.entities.ESignBlockEntity; +import ru.betterend.interfaces.ISpetialItem; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; import ru.betterend.util.BlocksHelper; -public class EndSignBlock extends AbstractSignBlock implements BlockPatterned { +public class EndSignBlock extends AbstractSignBlock implements BlockPatterned, ISpetialItem { public static final IntProperty ROTATION = Properties.ROTATION; public static final BooleanProperty FLOOR = BooleanProperty.of("floor"); private static final VoxelShape[] WALL_SHAPES = new VoxelShape[] { @@ -177,4 +179,32 @@ public class EndSignBlock extends AbstractSignBlock implements BlockPatterned { public List getDroppedStacks(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } + + @Override + public Fluid tryDrainFluid(WorldAccess world, BlockPos pos, BlockState state) { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean canFillWithFluid(BlockView world, BlockPos pos, BlockState state, Fluid fluid) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean tryFillWithFluid(WorldAccess world, BlockPos pos, BlockState state, FluidState fluidState) { + // TODO Auto-generated method stub + return false; + } + + @Override + public int getStackSize() { + return 16; + } + + @Override + public boolean canPlaceOnWater() { + return false; + } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/interfaces/ISpetialItem.java b/src/main/java/ru/betterend/interfaces/ISpetialItem.java new file mode 100644 index 00000000..ef19bc36 --- /dev/null +++ b/src/main/java/ru/betterend/interfaces/ISpetialItem.java @@ -0,0 +1,7 @@ +package ru.betterend.interfaces; + +public interface ISpetialItem { + public int getStackSize(); + + public boolean canPlaceOnWater(); +} diff --git a/src/main/java/ru/betterend/item/DrinkItem.java b/src/main/java/ru/betterend/item/DrinkItem.java index 27043142..2dd617c8 100644 --- a/src/main/java/ru/betterend/item/DrinkItem.java +++ b/src/main/java/ru/betterend/item/DrinkItem.java @@ -1,8 +1,13 @@ package ru.betterend.item; +import net.minecraft.advancement.criterion.Criteria; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUsage; +import net.minecraft.item.Items; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.stat.Stats; import net.minecraft.util.Hand; import net.minecraft.util.TypedActionResult; import net.minecraft.util.UseAction; @@ -27,4 +32,23 @@ public class DrinkItem extends PatternedItem { public TypedActionResult use(World world, PlayerEntity user, Hand hand) { return ItemUsage.consumeHeldItem(world, user, hand); } + + @Override + public ItemStack finishUsing(ItemStack stack, World world, LivingEntity user) { + if (user instanceof ServerPlayerEntity) { + ServerPlayerEntity serverPlayerEntity = (ServerPlayerEntity) user; + Criteria.CONSUME_ITEM.trigger(serverPlayerEntity, stack); + serverPlayerEntity.incrementStat(Stats.USED.getOrCreateStat(this)); + } + + if (user instanceof PlayerEntity && !((PlayerEntity) user).abilities.creativeMode) { + stack.decrement(1); + } + + if (!world.isClient) { + user.clearStatusEffects(); + } + + return stack.isEmpty() ? new ItemStack(Items.GLASS_BOTTLE) : stack; + } } diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index c310d53e..33dc7e76 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -4,6 +4,8 @@ import net.minecraft.block.Block; import net.minecraft.block.Blocks; import net.minecraft.block.MaterialColor; import net.minecraft.item.BlockItem; +import net.minecraft.item.Item.Settings; +import net.minecraft.item.LilyPadItem; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; import ru.betterend.BetterEnd; @@ -18,6 +20,7 @@ import ru.betterend.blocks.AuroraCrystalBlock; import ru.betterend.blocks.BlueVineBlock; import ru.betterend.blocks.BlueVineLanternBlock; import ru.betterend.blocks.BlueVineSeedBlock; +import ru.betterend.blocks.BoluxMushroomBlock; import ru.betterend.blocks.BrimstoneBlock; import ru.betterend.blocks.BubbleCoralBlock; import ru.betterend.blocks.BulbVineBlock; @@ -47,6 +50,7 @@ import ru.betterend.blocks.EndstoneDustBlock; import ru.betterend.blocks.EternalPedestal; import ru.betterend.blocks.EternalRunedFlavolite; import ru.betterend.blocks.FilaluxLanternBlock; +import ru.betterend.blocks.FlamaeaBlock; import ru.betterend.blocks.GlowingHymenophoreBlock; import ru.betterend.blocks.GlowingMossBlock; import ru.betterend.blocks.GlowingPillarLuminophorBlock; @@ -105,7 +109,6 @@ import ru.betterend.blocks.basis.EndFurnaceBlock; import ru.betterend.blocks.basis.EndLeavesBlock; import ru.betterend.blocks.basis.EndOreBlock; import ru.betterend.blocks.basis.EndPillarBlock; -import ru.betterend.blocks.basis.EndSignBlock; import ru.betterend.blocks.basis.EndSlabBlock; import ru.betterend.blocks.basis.EndStairsBlock; import ru.betterend.blocks.basis.EndUnderwaterWallPlantBlock; @@ -122,6 +125,7 @@ import ru.betterend.blocks.complex.MetalMaterial; import ru.betterend.blocks.complex.StoneMaterial; import ru.betterend.blocks.complex.WoodenMaterial; import ru.betterend.config.Configs; +import ru.betterend.interfaces.ISpetialItem; import ru.betterend.item.material.EndArmorMaterial; import ru.betterend.item.material.EndToolMaterial; @@ -277,6 +281,7 @@ public class EndBlocks { public static final Block GLOWING_PILLAR_LEAVES = registerBlock("glowing_pillar_leaves", new FurBlock(GLOWING_PILLAR_SEED, 15, 3)); public static final Block SMALL_JELLYSHROOM = registerBlock("small_jellyshroom", new SmallJellyshroomBlock()); + public static final Block BOLUX_MUSHROOM = registerBlock("bolux_mushroom", new BoluxMushroomBlock()); public static final Block LUMECORN_SEED = registerBlock("lumecorn_seed", new LumecornSeedBlock()); public static final Block LUMECORN = registerBlockNI("lumecorn", new LumecornBlock()); @@ -316,6 +321,10 @@ public class EndBlocks { public static final Block HYDRALUX_PETAL_BLOCK = registerBlock("hydralux_petal_block", new HydraluxPetalBlock()); public static final ColoredMaterial HYDRALUX_PETAL_BLOCK_COLORED = new ColoredMaterial(HydraluxPetalColoredBlock::new, HYDRALUX_PETAL_BLOCK, true); + public static final Block POND_ANEMONE = registerBlock("pond_anemone", new BubbleCoralBlock()); + + public static final Block FLAMAEA = registerBlock("flamaea", new FlamaeaBlock()); + public static final Block CAVE_BUSH = registerBlock("cave_bush", new SimpleLeavesBlock(MaterialColor.MAGENTA)); public static final Block MURKWEED = registerBlock("murkweed", new MurkweedBlock()); @@ -323,12 +332,14 @@ public class EndBlocks { // Wall Plants // public static final Block PURPLE_POLYPORE = registerBlock("purple_polypore", new WallMushroomBlock(13)); + public static final Block AURANT_POLYPORE = registerBlock("aurant_polypore", new WallMushroomBlock(13)); public static final Block TAIL_MOSS = registerBlock("tail_moss", new EndWallPlantBlock()); public static final Block CYAN_MOSS = registerBlock("cyan_moss", new EndWallPlantBlock()); public static final Block TWISTED_MOSS = registerBlock("twisted_moss", new EndWallPlantBlock()); public static final Block TUBE_WORM = registerBlock("tube_worm", new EndUnderwaterWallPlantBlock()); public static final Block BULB_MOSS = registerBlock("bulb_moss", new EndWallPlantBlock(12)); public static final Block JUNGLE_FERN = registerBlock("jungle_fern", new EndWallPlantBlock()); + public static final Block RUSCUS = registerBlock("ruscus", new EndWallPlantBlock()); // Vines // public static final Block DENSE_VINE = registerBlock("dense_vine", new VineBlock(15, true)); @@ -394,8 +405,20 @@ public class EndBlocks { return block; } Registry.register(Registry.BLOCK, id, block); - int maxCount = block instanceof EndSignBlock ? 16 : 64; - EndItems.registerBlockItem(id, new BlockItem(block, EndItems.makeBlockItemSettings().maxCount(maxCount))); + int maxCount = 64; + boolean placeOnWater = false; + if (block instanceof ISpetialItem) { + ISpetialItem item = (ISpetialItem) block; + maxCount = item.getStackSize(); + placeOnWater = item.canPlaceOnWater(); + } + Settings item = EndItems.makeBlockItemSettings().maxCount(maxCount); + if (placeOnWater) { + EndItems.registerBlockItem(id, new LilyPadItem(block, item)); + } + else { + EndItems.registerBlockItem(id, new BlockItem(block, item)); + } return block; } diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 4ca3195c..8646a7fb 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -123,6 +123,7 @@ public class EndFeatures { public static final EndFeature SMALL_AMARANITA = new EndFeature("small_amaranita", new SinglePlantFeature(EndBlocks.SMALL_AMARANITA_MUSHROOM, 5, 5), 4); public static final EndFeature GLOBULAGUS = new EndFeature("globulagus", new SinglePlantFeature(EndBlocks.GLOBULAGUS, 5, 3), 6); public static final EndFeature CLAWFERN = new EndFeature("clawfern", new SinglePlantFeature(EndBlocks.CLAWFERN, 5, 4), 5); + public static final EndFeature BOLUX_MUSHROOM = new EndFeature("bolux_mushroom", new SinglePlantFeature(EndBlocks.BOLUX_MUSHROOM, 5, 5), 2); // Vines // public static final EndFeature DENSE_VINE = new EndFeature("dense_vine", new VineFeature(EndBlocks.DENSE_VINE, 24), 3); @@ -135,6 +136,7 @@ public class EndFeatures { // Wall Plants // public static final EndFeature PURPLE_POLYPORE = new EndFeature("purple_polypore", new WallPlantOnLogFeature(EndBlocks.PURPLE_POLYPORE, 3), 5); + public static final EndFeature AURANT_POLYPORE = new EndFeature("aurant_polypore", new WallPlantOnLogFeature(EndBlocks.AURANT_POLYPORE, 3), 5); public static final EndFeature TAIL_MOSS = new EndFeature("tail_moss", new WallPlantFeature(EndBlocks.TAIL_MOSS, 3), 15); public static final EndFeature CYAN_MOSS = new EndFeature("cyan_moss", new WallPlantFeature(EndBlocks.CYAN_MOSS, 3), 15); public static final EndFeature TAIL_MOSS_WOOD = new EndFeature("tail_moss_wood", new WallPlantOnLogFeature(EndBlocks.TAIL_MOSS, 4), 25); @@ -158,6 +160,7 @@ public class EndFeatures { public static final EndFeature END_LOTUS = new EndFeature("end_lotus", new EndLotusFeature(7), 5); public static final EndFeature END_LOTUS_LEAF = new EndFeature("end_lotus_leaf", new EndLotusLeafFeature(20), 25); public static final EndFeature HYDRALUX = new EndFeature("hydralux", new HydraluxFeature(5), 5); + public static final EndFeature POND_ANEMONE = new EndFeature("pond_anemone", new UnderwaterPlantFeature(EndBlocks.POND_ANEMONE, 6), 10); public static final EndFeature CHARNIA_RED = new EndFeature("charnia_red", new CharniaFeature(EndBlocks.CHARNIA_RED), 10); public static final EndFeature CHARNIA_PURPLE = new EndFeature("charnia_purple", new CharniaFeature(EndBlocks.CHARNIA_PURPLE), 10); @@ -168,6 +171,7 @@ public class EndFeatures { public static final EndFeature MENGER_SPONGE = new EndFeature("menger_sponge", new MengerSpongeFeature(5), 1); public static final EndFeature CHARNIA_RED_RARE = new EndFeature("charnia_red_rare", new CharniaFeature(EndBlocks.CHARNIA_RED), 2); public static final EndFeature OVERWORLD_ISLAND = EndFeature.makeFetureConfigured("overworld_island", new OverworldIslandFeature()); + public static final EndFeature FLAMAEA = new EndFeature("flamaea", new SinglePlantFeature(EndBlocks.FLAMAEA, 12, false, 5), 20); // Terrain // public static final EndFeature END_LAKE = EndFeature.makeLakeFeature("end_lake", new EndLakeFeature(), 4); diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index 3d142761..9cff5332 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -120,6 +120,7 @@ public class EndItems { public final static Item AMBER_ROOT_RAW = registerFood("amber_root_raw", 2, 0.8F); public final static Item CHORUS_MUSHROOM_RAW = registerFood("chorus_mushroom_raw", 3, 0.5F); public final static Item CHORUS_MUSHROOM_COOKED = registerFood("chorus_mushroom_cooked", FoodComponents.MUSHROOM_STEW); + public final static Item BOLUX_MUSHROOM_COOKED = registerFood("bolux_mushroom_cooked", FoodComponents.MUSHROOM_STEW); // Drinks // public final static Item UMBRELLA_CLUSTER_JUICE = registerDrink("umbrella_cluster_juice", 5, 0.7F); diff --git a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java index c2aebccf..1ed6436b 100644 --- a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java @@ -18,11 +18,17 @@ public class LanternWoodsBiome extends EndBiome { .setMusic(EndSounds.MUSIC_FOREST) .setParticles(EndParticles.GLOWING_SPHERE, 0.001F) .addFeature(EndFeatures.END_LAKE_NORMAL) + .addFeature(EndFeatures.FLAMAEA) .addFeature(EndFeatures.LUCERNIA) .addFeature(EndFeatures.LUCERNIA_BUSH) .addFeature(EndFeatures.FILALUX) .addFeature(EndFeatures.AERIDIUM) .addFeature(EndFeatures.LAMELLARIUM) + .addFeature(EndFeatures.BOLUX_MUSHROOM) + .addFeature(EndFeatures.AURANT_POLYPORE) + .addFeature(EndFeatures.POND_ANEMONE) + .addFeature(EndFeatures.CHARNIA_ORANGE) + .addFeature(EndFeatures.CHARNIA_RED) .addStructureFeature(ConfiguredStructureFeatures.END_CITY) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); } diff --git a/src/main/resources/assets/betterend/blockstates/aurant_polypore.json b/src/main/resources/assets/betterend/blockstates/aurant_polypore.json new file mode 100644 index 00000000..9c816bd6 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/aurant_polypore.json @@ -0,0 +1,24 @@ +{ + "variants": { + "facing=north": [ + { "model": "betterend:block/aurant_polypore_1", "y": 180 }, + { "model": "betterend:block/aurant_polypore_2", "y": 180 }, + { "model": "betterend:block/aurant_polypore_3", "y": 180 } + ], + "facing=south": [ + { "model": "betterend:block/aurant_polypore_1" }, + { "model": "betterend:block/aurant_polypore_2" }, + { "model": "betterend:block/aurant_polypore_3" } + ], + "facing=east": [ + { "model": "betterend:block/aurant_polypore_1", "y": 270 }, + { "model": "betterend:block/aurant_polypore_2", "y": 270 }, + { "model": "betterend:block/aurant_polypore_3", "y": 270 } + ], + "facing=west": [ + { "model": "betterend:block/aurant_polypore_1", "y": 90 }, + { "model": "betterend:block/aurant_polypore_2", "y": 90 }, + { "model": "betterend:block/aurant_polypore_3", "y": 90 } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/bolux_mushroom.json b/src/main/resources/assets/betterend/blockstates/bolux_mushroom.json new file mode 100644 index 00000000..ab881614 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/bolux_mushroom.json @@ -0,0 +1,18 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/bolux_mushroom_1" }, + { "model": "betterend:block/bolux_mushroom_2" }, + { "model": "betterend:block/bolux_mushroom_3" }, + { "model": "betterend:block/bolux_mushroom_1", "y": 90 }, + { "model": "betterend:block/bolux_mushroom_2", "y": 90 }, + { "model": "betterend:block/bolux_mushroom_3", "y": 90 }, + { "model": "betterend:block/bolux_mushroom_1", "y": 180 }, + { "model": "betterend:block/bolux_mushroom_2", "y": 180 }, + { "model": "betterend:block/bolux_mushroom_3", "y": 180 }, + { "model": "betterend:block/bolux_mushroom_1", "y": 270 }, + { "model": "betterend:block/bolux_mushroom_2", "y": 270 }, + { "model": "betterend:block/bolux_mushroom_3", "y": 270 } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/flamaea.json b/src/main/resources/assets/betterend/blockstates/flamaea.json new file mode 100644 index 00000000..6b9238e1 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/flamaea.json @@ -0,0 +1,11 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/flamaea_1" }, + { "model": "betterend:block/flamaea_2" }, + { "model": "betterend:block/flamaea_3" }, + { "model": "betterend:block/flamaea_4" }, + { "model": "betterend:block/flamaea_5" } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/pond_anemone.json b/src/main/resources/assets/betterend/blockstates/pond_anemone.json new file mode 100644 index 00000000..59a741ed --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/pond_anemone.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/pond_anemone" }, + { "model": "betterend:block/pond_anemone", "y": 90 }, + { "model": "betterend:block/pond_anemone", "y": 180 }, + { "model": "betterend:block/pond_anemone", "y": 270 } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/ruscus.json b/src/main/resources/assets/betterend/blockstates/ruscus.json new file mode 100644 index 00000000..99388f2d --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/ruscus.json @@ -0,0 +1,24 @@ +{ + "variants": { + "facing=north": [ + { "model": "betterend:block/ruscus_1", "y": 180 }, + { "model": "betterend:block/ruscus_2", "y": 180 }, + { "model": "betterend:block/ruscus_3", "y": 180 } + ], + "facing=south": [ + { "model": "betterend:block/ruscus_1" }, + { "model": "betterend:block/ruscus_2" }, + { "model": "betterend:block/ruscus_3" } + ], + "facing=east": [ + { "model": "betterend:block/ruscus_1", "y": 270 }, + { "model": "betterend:block/ruscus_2", "y": 270 }, + { "model": "betterend:block/ruscus_3", "y": 270 } + ], + "facing=west": [ + { "model": "betterend:block/ruscus_1", "y": 90 }, + { "model": "betterend:block/ruscus_2", "y": 90 }, + { "model": "betterend:block/ruscus_3", "y": 90 } + ] + } +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/aurant_polypore.json b/src/main/resources/assets/betterend/materialmaps/block/aurant_polypore.json new file mode 100644 index 00000000..2163812f --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/aurant_polypore.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_inc" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/bolux_mushroom.json b/src/main/resources/assets/betterend/materialmaps/block/bolux_mushroom.json new file mode 100644 index 00000000..2163812f --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/bolux_mushroom.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_inc" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/flamaea.json b/src/main/resources/assets/betterend/materialmaps/block/flamaea.json new file mode 100644 index 00000000..2163812f --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/flamaea.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_inc" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/pond_anemone.json b/src/main/resources/assets/betterend/materialmaps/block/pond_anemone.json new file mode 100644 index 00000000..2163812f --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/pond_anemone.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_inc" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/ruscus.json b/src/main/resources/assets/betterend/materialmaps/block/ruscus.json new file mode 100644 index 00000000..45210670 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/ruscus.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:waving_wall" +} diff --git a/src/main/resources/assets/betterend/materialmaps/item/lucernia_outer_leaves.json b/src/main/resources/assets/betterend/materialmaps/item/lucernia_outer_leaves.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/lucernia_outer_leaves.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materialmaps/item/lucernia_sapling.json b/src/main/resources/assets/betterend/materialmaps/item/lucernia_sapling.json new file mode 100644 index 00000000..69a88e3b --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/item/lucernia_sapling.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/betterend/materials/glow_80_blue.json b/src/main/resources/assets/betterend/materials/glow_80_blue.json new file mode 100644 index 00000000..57abfb68 --- /dev/null +++ b/src/main/resources/assets/betterend/materials/glow_80_blue.json @@ -0,0 +1,8 @@ +{ + "layers": [ + { + "vertexSource": "canvas:shaders/material/default.vert", + "fragmentSource": "betterend:shaders/material/glow_80_blue.frag" + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/aurant_polypore_1.json b/src/main/resources/assets/betterend/models/block/aurant_polypore_1.json new file mode 100644 index 00000000..34b18ae5 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/aurant_polypore_1.json @@ -0,0 +1,153 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/aurant_polypore", + "texture": "betterend:block/aurant_polypore" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 0, 4, 0 ], + "to": [ 8, 7, 6 ], + "faces": { + "down": { "uv": [ 8, 10, 16, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 8, 6 ], "texture": "#texture" }, + "south": { "uv": [ 0, 8, 8, 11 ], "texture": "#texture" }, + "west": { "uv": [ 1, 8, 7, 11 ], "texture": "#texture" }, + "east": { "uv": [ 1, 8, 7, 11 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 7, 12, 0 ], + "to": [ 15, 15, 6 ], + "faces": { + "down": { "uv": [ 8, 10, 16, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 8, 6 ], "texture": "#texture" }, + "south": { "uv": [ 0, 8, 8, 11 ], "texture": "#texture" }, + "west": { "uv": [ 1, 8, 7, 11 ], "texture": "#texture" }, + "east": { "uv": [ 1, 8, 7, 11 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 9, 1, 0 ], + "to": [ 15, 3, 6 ], + "faces": { + "down": { "uv": [ 9, 10, 15, 16 ], "texture": "#texture" }, + "up": { "uv": [ 1, 0, 7, 6 ], "texture": "#texture" }, + "south": { "uv": [ 1, 8, 7, 10 ], "texture": "#texture" }, + "west": { "uv": [ 1, 8, 7, 10 ], "texture": "#texture" }, + "east": { "uv": [ 1, 8, 7, 10 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 1, 9, 0 ], + "to": [ 7, 11, 3 ], + "faces": { + "down": { "uv": [ 10, 5, 16, 8 ], "texture": "#texture" }, + "up": { "uv": [ 1, 0, 7, 3 ], "texture": "#texture" }, + "south": { "uv": [ 1, 8, 6, 10 ], "texture": "#texture" }, + "west": { "uv": [ 3, 8, 6, 10 ], "texture": "#texture" }, + "east": { "uv": [ 3, 8, 6, 10 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 11, 6, 0 ], + "to": [ 15, 8, 2 ], + "faces": { + "down": { "uv": [ 11, 6, 15, 8 ], "texture": "#texture" }, + "up": { "uv": [ 2, 0, 6, 2 ], "texture": "#texture" }, + "south": { "uv": [ 2, 8, 6, 10 ], "texture": "#texture" }, + "west": { "uv": [ 3, 8, 5, 10 ], "texture": "#texture" }, + "east": { "uv": [ 3, 8, 5, 10 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 14, 0 ], + "to": [ 6, 16, 2 ], + "faces": { + "down": { "uv": [ 11, 6, 15, 8 ], "texture": "#texture" }, + "up": { "uv": [ 2, 0, 6, 2 ], "texture": "#texture" }, + "south": { "uv": [ 2, 8, 6, 10 ], "texture": "#texture" }, + "west": { "uv": [ 3, 8, 5, 10 ], "texture": "#texture" }, + "east": { "uv": [ 3, 8, 5, 10 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 10, 0, 0 ], + "to": [ 14, 1, 4 ], + "faces": { + "down": { "uv": [ 10, 12, 14, 16 ], "texture": "#texture" }, + "north": { "uv": [ 1, 12, 5, 13 ], "texture": "#texture" }, + "south": { "uv": [ 1, 12, 5, 13 ], "texture": "#texture" }, + "west": { "uv": [ 1, 12, 5, 13 ], "texture": "#texture" }, + "east": { "uv": [ 1, 12, 5, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 12, 5, 0 ], + "to": [ 14, 6, 1 ], + "faces": { + "down": { "uv": [ 12, 15, 14, 16 ], "texture": "#texture" }, + "north": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "south": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "west": { "uv": [ 3, 12, 4, 13 ], "texture": "#texture" }, + "east": { "uv": [ 2, 12, 3, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 2, 8, 0 ], + "to": [ 6, 9, 2 ], + "faces": { + "down": { "uv": [ 10, 12, 14, 14 ], "texture": "#texture" }, + "north": { "uv": [ 1, 14, 5, 15 ], "texture": "#texture" }, + "south": { "uv": [ 1, 14, 5, 15 ], "texture": "#texture" }, + "west": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "east": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 8, 10, 0 ], + "to": [ 14, 12, 5 ], + "faces": { + "down": { "uv": [ 9, 11, 15, 16 ], "texture": "#texture" }, + "north": { "uv": [ 0, 13, 6, 15 ], "texture": "#texture" }, + "south": { "uv": [ 0, 13, 6, 15 ], "texture": "#texture" }, + "west": { "uv": [ 0, 12, 5, 14 ], "texture": "#texture" }, + "east": { "uv": [ 0, 12, 5, 14 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 1, 2, 0 ], + "to": [ 7, 4, 5 ], + "faces": { + "down": { "uv": [ 9, 11, 15, 16 ], "texture": "#texture" }, + "north": { "uv": [ 0, 13, 6, 15 ], "texture": "#texture" }, + "south": { "uv": [ 0, 13, 6, 15 ], "texture": "#texture" }, + "west": { "uv": [ 0, 12, 5, 14 ], "texture": "#texture" }, + "east": { "uv": [ 0, 12, 5, 14 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 3, 13, 0 ], + "to": [ 5, 14, 1 ], + "faces": { + "down": { "uv": [ 12, 15, 14, 16 ], "texture": "#texture" }, + "north": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "south": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "west": { "uv": [ 3, 12, 4, 13 ], "texture": "#texture" }, + "east": { "uv": [ 2, 12, 3, 13 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/aurant_polypore_2.json b/src/main/resources/assets/betterend/models/block/aurant_polypore_2.json new file mode 100644 index 00000000..1072b074 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/aurant_polypore_2.json @@ -0,0 +1,105 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/aurant_polypore", + "texture": "betterend:block/aurant_polypore" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 1, 8, 0 ], + "to": [ 9, 11, 6 ], + "faces": { + "down": { "uv": [ 8, 10, 16, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 8, 6 ], "texture": "#texture" }, + "south": { "uv": [ 0, 8, 8, 11 ], "texture": "#texture" }, + "west": { "uv": [ 1, 8, 7, 11 ], "texture": "#texture" }, + "east": { "uv": [ 1, 8, 7, 11 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 5, 3, 0 ], + "to": [ 11, 5, 6 ], + "faces": { + "down": { "uv": [ 9, 10, 15, 16 ], "texture": "#texture" }, + "up": { "uv": [ 1, 0, 7, 6 ], "texture": "#texture" }, + "south": { "uv": [ 1, 8, 7, 10 ], "texture": "#texture" }, + "west": { "uv": [ 1, 8, 7, 10 ], "texture": "#texture" }, + "east": { "uv": [ 1, 8, 7, 10 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 8, 13, 0 ], + "to": [ 14, 15, 3 ], + "faces": { + "down": { "uv": [ 10, 5, 16, 8 ], "texture": "#texture" }, + "up": { "uv": [ 1, 0, 7, 3 ], "texture": "#texture" }, + "south": { "uv": [ 1, 8, 6, 10 ], "texture": "#texture" }, + "west": { "uv": [ 3, 8, 6, 10 ], "texture": "#texture" }, + "east": { "uv": [ 3, 8, 6, 10 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 11, 7, 0 ], + "to": [ 15, 9, 2 ], + "faces": { + "down": { "uv": [ 11, 6, 15, 8 ], "texture": "#texture" }, + "up": { "uv": [ 2, 0, 6, 2 ], "texture": "#texture" }, + "south": { "uv": [ 2, 8, 6, 10 ], "texture": "#texture" }, + "west": { "uv": [ 3, 8, 5, 10 ], "texture": "#texture" }, + "east": { "uv": [ 3, 8, 5, 10 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 6, 2, 0 ], + "to": [ 10, 3, 4 ], + "faces": { + "down": { "uv": [ 10, 12, 14, 16 ], "texture": "#texture" }, + "north": { "uv": [ 1, 12, 5, 13 ], "texture": "#texture" }, + "south": { "uv": [ 1, 12, 5, 13 ], "texture": "#texture" }, + "west": { "uv": [ 1, 12, 5, 13 ], "texture": "#texture" }, + "east": { "uv": [ 1, 12, 5, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 12, 6, 0 ], + "to": [ 14, 7, 1 ], + "faces": { + "down": { "uv": [ 12, 15, 14, 16 ], "texture": "#texture" }, + "north": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "south": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "west": { "uv": [ 3, 12, 4, 13 ], "texture": "#texture" }, + "east": { "uv": [ 2, 12, 3, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 9, 12, 0 ], + "to": [ 13, 13, 2 ], + "faces": { + "down": { "uv": [ 10, 12, 14, 14 ], "texture": "#texture" }, + "north": { "uv": [ 1, 14, 5, 15 ], "texture": "#texture" }, + "south": { "uv": [ 1, 14, 5, 15 ], "texture": "#texture" }, + "west": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "east": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 2, 6, 0 ], + "to": [ 8, 8, 5 ], + "faces": { + "down": { "uv": [ 9, 11, 15, 16 ], "texture": "#texture" }, + "north": { "uv": [ 0, 13, 6, 15 ], "texture": "#texture" }, + "south": { "uv": [ 0, 13, 6, 15 ], "texture": "#texture" }, + "west": { "uv": [ 0, 12, 5, 14 ], "texture": "#texture" }, + "east": { "uv": [ 0, 12, 5, 14 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/aurant_polypore_3.json b/src/main/resources/assets/betterend/models/block/aurant_polypore_3.json new file mode 100644 index 00000000..ffae55f7 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/aurant_polypore_3.json @@ -0,0 +1,129 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/aurant_polypore", + "texture": "betterend:block/aurant_polypore" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 2, 6, 0 ], + "to": [ 8, 8, 6 ], + "faces": { + "down": { "uv": [ 9, 10, 15, 16 ], "texture": "#texture" }, + "up": { "uv": [ 1, 0, 7, 6 ], "texture": "#texture" }, + "south": { "uv": [ 1, 8, 7, 10 ], "texture": "#texture" }, + "west": { "uv": [ 1, 8, 7, 10 ], "texture": "#texture" }, + "east": { "uv": [ 1, 8, 7, 10 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 8, 13, 0 ], + "to": [ 14, 15, 3 ], + "faces": { + "down": { "uv": [ 10, 5, 16, 8 ], "texture": "#texture" }, + "up": { "uv": [ 1, 0, 7, 3 ], "texture": "#texture" }, + "south": { "uv": [ 1, 8, 6, 10 ], "texture": "#texture" }, + "west": { "uv": [ 3, 8, 6, 10 ], "texture": "#texture" }, + "east": { "uv": [ 3, 8, 6, 10 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 10, 8, 0 ], + "to": [ 14, 10, 2 ], + "faces": { + "down": { "uv": [ 11, 6, 15, 8 ], "texture": "#texture" }, + "up": { "uv": [ 2, 0, 6, 2 ], "texture": "#texture" }, + "south": { "uv": [ 2, 8, 6, 10 ], "texture": "#texture" }, + "west": { "uv": [ 3, 8, 5, 10 ], "texture": "#texture" }, + "east": { "uv": [ 3, 8, 5, 10 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 3, 5, 0 ], + "to": [ 7, 6, 4 ], + "faces": { + "down": { "uv": [ 10, 12, 14, 16 ], "texture": "#texture" }, + "north": { "uv": [ 1, 12, 5, 13 ], "texture": "#texture" }, + "south": { "uv": [ 1, 12, 5, 13 ], "texture": "#texture" }, + "west": { "uv": [ 1, 12, 5, 13 ], "texture": "#texture" }, + "east": { "uv": [ 1, 12, 5, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 11, 7, 0 ], + "to": [ 13, 8, 1 ], + "faces": { + "down": { "uv": [ 12, 15, 14, 16 ], "texture": "#texture" }, + "north": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "south": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "west": { "uv": [ 3, 12, 4, 13 ], "texture": "#texture" }, + "east": { "uv": [ 2, 12, 3, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 9, 12, 0 ], + "to": [ 13, 13, 2 ], + "faces": { + "down": { "uv": [ 10, 12, 14, 14 ], "texture": "#texture" }, + "north": { "uv": [ 1, 14, 5, 15 ], "texture": "#texture" }, + "south": { "uv": [ 1, 14, 5, 15 ], "texture": "#texture" }, + "west": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "east": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 1, 11, 0 ], + "to": [ 5, 13, 2 ], + "faces": { + "down": { "uv": [ 11, 6, 15, 8 ], "texture": "#texture" }, + "up": { "uv": [ 2, 0, 6, 2 ], "texture": "#texture" }, + "south": { "uv": [ 2, 8, 6, 10 ], "texture": "#texture" }, + "west": { "uv": [ 3, 8, 5, 10 ], "texture": "#texture" }, + "east": { "uv": [ 3, 8, 5, 10 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 2, 10, 0 ], + "to": [ 4, 11, 1 ], + "faces": { + "down": { "uv": [ 12, 15, 14, 16 ], "texture": "#texture" }, + "north": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "south": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "west": { "uv": [ 3, 12, 4, 13 ], "texture": "#texture" }, + "east": { "uv": [ 2, 12, 3, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 8, 2, 0 ], + "to": [ 12, 4, 2 ], + "faces": { + "down": { "uv": [ 11, 6, 15, 8 ], "texture": "#texture" }, + "up": { "uv": [ 2, 0, 6, 2 ], "texture": "#texture" }, + "south": { "uv": [ 2, 8, 6, 10 ], "texture": "#texture" }, + "west": { "uv": [ 3, 8, 5, 10 ], "texture": "#texture" }, + "east": { "uv": [ 3, 8, 5, 10 ], "texture": "#texture" } + } + }, + { + "__comment": "Box8", + "from": [ 9, 1, 0 ], + "to": [ 11, 2, 1 ], + "faces": { + "down": { "uv": [ 12, 15, 14, 16 ], "texture": "#texture" }, + "north": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "south": { "uv": [ 2, 12, 4, 13 ], "texture": "#texture" }, + "west": { "uv": [ 3, 12, 4, 13 ], "texture": "#texture" }, + "east": { "uv": [ 2, 12, 3, 13 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/bolux_mushroom_1.json b/src/main/resources/assets/betterend/models/block/bolux_mushroom_1.json new file mode 100644 index 00000000..4c80d918 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/bolux_mushroom_1.json @@ -0,0 +1,81 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/bolux_mushroom", + "texture": "betterend:block/bolux_mushroom" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 1, 3, 1 ], + "to": [ 9, 7, 9 ], + "faces": { + "down": { "uv": [ 0, 8, 8, 16 ], "texture": "#texture" }, + "up": { "uv": [ 8, 0, 16, 8 ], "texture": "#texture" }, + "north": { "uv": [ 8, 12, 16, 16 ], "texture": "#texture" }, + "south": { "uv": [ 8, 12, 16, 16 ], "texture": "#texture" }, + "west": { "uv": [ 8, 12, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 8, 12, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 7, 2 ], + "to": [ 8, 8, 8 ], + "faces": { + "up": { "uv": [ 9, 1, 15, 7 ], "texture": "#texture" }, + "north": { "uv": [ 9, 11, 15, 12 ], "texture": "#texture" }, + "south": { "uv": [ 9, 11, 15, 12 ], "texture": "#texture" }, + "west": { "uv": [ 9, 11, 15, 12 ], "texture": "#texture" }, + "east": { "uv": [ 9, 11, 15, 12 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 4, 0, 4 ], + "to": [ 6, 3, 6 ], + "faces": { + "north": { "uv": [ 0, 0, 2, 3 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 2, 3 ], "texture": "#texture" }, + "west": { "uv": [ 2, 0, 0, 3 ], "texture": "#texture" }, + "east": { "uv": [ 2, 0, 0, 3 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 10, 0, 12 ], + "to": [ 12, 2, 14 ], + "faces": { + "north": { "uv": [ 0, 0, 2, 2 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 2, 2 ], "texture": "#texture" }, + "west": { "uv": [ 0, 0, 2, 2 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 2, 2 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 8, 2, 10 ], + "to": [ 14, 5, 16 ], + "faces": { + "down": { "uv": [ 1, 9, 7, 15 ], "texture": "#texture" }, + "up": { "uv": [ 9, 1, 15, 7 ], "texture": "#texture", "rotation": 90 }, + "north": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" }, + "south": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" }, + "west": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" }, + "east": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 9, 5, 11 ], + "to": [ 13, 6, 15 ], + "faces": { + "up": { "uv": [ 10, 2, 14, 6 ], "texture": "#texture", "rotation": 90 }, + "north": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" }, + "south": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" }, + "west": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" }, + "east": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/bolux_mushroom_2.json b/src/main/resources/assets/betterend/models/block/bolux_mushroom_2.json new file mode 100644 index 00000000..e8b85497 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/bolux_mushroom_2.json @@ -0,0 +1,117 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/bolux_mushroom", + "texture": "betterend:block/bolux_mushroom" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 11, 0, 4 ], + "to": [ 13, 2, 6 ], + "faces": { + "north": { "uv": [ 0, 0, 2, 2 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 2, 2 ], "texture": "#texture" }, + "west": { "uv": [ 0, 0, 2, 2 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 2, 2 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 9, 2, 2 ], + "to": [ 15, 5, 8 ], + "faces": { + "down": { "uv": [ 1, 9, 7, 15 ], "texture": "#texture" }, + "up": { "uv": [ 9, 1, 15, 7 ], "texture": "#texture", "rotation": 90 }, + "north": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" }, + "south": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" }, + "west": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" }, + "east": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 10, 5, 3 ], + "to": [ 14, 6, 7 ], + "faces": { + "up": { "uv": [ 10, 2, 14, 6 ], "texture": "#texture", "rotation": 90 }, + "north": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" }, + "south": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" }, + "west": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" }, + "east": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 3, 0, 6 ], + "to": [ 5, 3, 8 ], + "faces": { + "north": { "uv": [ 0, 0, 2, 3 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 2, 3 ], "texture": "#texture" }, + "west": { "uv": [ 0, 0, 2, 3 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 2, 3 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 1, 3, 4 ], + "to": [ 7, 6, 10 ], + "faces": { + "down": { "uv": [ 1, 9, 7, 15 ], "texture": "#texture" }, + "up": { "uv": [ 9, 1, 15, 7 ], "texture": "#texture", "rotation": 270 }, + "north": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" }, + "south": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" }, + "west": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" }, + "east": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 6, 5 ], + "to": [ 6, 7, 9 ], + "faces": { + "up": { "uv": [ 10, 2, 14, 6 ], "texture": "#texture", "rotation": 270 }, + "north": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" }, + "south": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" }, + "west": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" }, + "east": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 10, 0, 12 ], + "to": [ 12, 2, 14 ], + "faces": { + "north": { "uv": [ 0, 0, 2, 2 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 2, 2 ], "texture": "#texture" }, + "west": { "uv": [ 0, 0, 2, 2 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 2, 2 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 9, 2, 11 ], + "to": [ 13, 4, 15 ], + "faces": { + "down": { "uv": [ 2, 10, 6, 14 ], "texture": "#texture" }, + "up": { "uv": [ 4, 4, 8, 8 ], "texture": "#texture" }, + "north": { "uv": [ 10, 14, 14, 16 ], "texture": "#texture" }, + "south": { "uv": [ 10, 14, 14, 16 ], "texture": "#texture" }, + "west": { "uv": [ 10, 14, 14, 16 ], "texture": "#texture" }, + "east": { "uv": [ 10, 14, 14, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 10, 4, 12 ], + "to": [ 12, 5, 14 ], + "faces": { + "up": { "uv": [ 5, 5, 7, 7 ], "texture": "#texture" }, + "north": { "uv": [ 11, 12, 13, 13 ], "texture": "#texture" }, + "south": { "uv": [ 11, 12, 13, 13 ], "texture": "#texture" }, + "west": { "uv": [ 11, 12, 13, 13 ], "texture": "#texture" }, + "east": { "uv": [ 11, 12, 13, 13 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/bolux_mushroom_3.json b/src/main/resources/assets/betterend/models/block/bolux_mushroom_3.json new file mode 100644 index 00000000..f11b78b7 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/bolux_mushroom_3.json @@ -0,0 +1,153 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/bolux_mushroom", + "texture": "betterend:block/bolux_mushroom" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 7, 3, 6 ], + "to": [ 15, 7, 14 ], + "faces": { + "down": { "uv": [ 0, 8, 8, 16 ], "texture": "#texture" }, + "up": { "uv": [ 8, 0, 16, 8 ], "texture": "#texture" }, + "north": { "uv": [ 8, 12, 16, 16 ], "texture": "#texture" }, + "south": { "uv": [ 8, 12, 16, 16 ], "texture": "#texture" }, + "west": { "uv": [ 8, 12, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 8, 12, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 8, 7, 7 ], + "to": [ 14, 8, 13 ], + "faces": { + "up": { "uv": [ 9, 1, 15, 7 ], "texture": "#texture" }, + "north": { "uv": [ 9, 11, 15, 12 ], "texture": "#texture" }, + "south": { "uv": [ 9, 11, 15, 12 ], "texture": "#texture" }, + "west": { "uv": [ 9, 11, 15, 12 ], "texture": "#texture" }, + "east": { "uv": [ 9, 11, 15, 12 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 10, 0, 9 ], + "to": [ 12, 3, 11 ], + "faces": { + "north": { "uv": [ 0, 0, 2, 3 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 2, 3 ], "texture": "#texture" }, + "west": { "uv": [ 2, 0, 0, 3 ], "texture": "#texture" }, + "east": { "uv": [ 2, 0, 0, 3 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 0, 5 ], + "to": [ 4, 3, 7 ], + "faces": { + "north": { "uv": [ 1, 0, 3, 3 ], "texture": "#texture" }, + "south": { "uv": [ 1, 0, 3, 3 ], "texture": "#texture" }, + "west": { "uv": [ 1, 0, 3, 3 ], "texture": "#texture" }, + "east": { "uv": [ 1, 0, 3, 3 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 0, 3, 3 ], + "to": [ 6, 6, 9 ], + "faces": { + "down": { "uv": [ 1, 9, 7, 15 ], "texture": "#texture" }, + "up": { "uv": [ 9, 1, 15, 7 ], "texture": "#texture" }, + "north": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" }, + "south": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" }, + "west": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" }, + "east": { "uv": [ 9, 13, 15, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 1, 6, 4 ], + "to": [ 5, 7, 8 ], + "faces": { + "up": { "uv": [ 10, 2, 14, 6 ], "texture": "#texture" }, + "north": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" }, + "south": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" }, + "west": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" }, + "east": { "uv": [ 10, 11, 14, 12 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 9, 0, 2 ], + "to": [ 11, 4, 4 ], + "faces": { + "north": { "uv": [ 0, 0, 2, 4 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 2, 4 ], "texture": "#texture" }, + "west": { "uv": [ 0, 0, 2, 4 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 2, 4 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 8, 4, 1 ], + "to": [ 12, 9, 5 ], + "faces": { + "down": { "uv": [ 2, 10, 6, 14 ], "texture": "#texture" }, + "up": { "uv": [ 10, 2, 14, 6 ], "texture": "#texture" }, + "north": { "uv": [ 10, 11, 14, 16 ], "texture": "#texture" }, + "south": { "uv": [ 10, 11, 14, 16 ], "texture": "#texture" }, + "west": { "uv": [ 10, 11, 14, 16 ], "texture": "#texture" }, + "east": { "uv": [ 10, 11, 14, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 9, 9, 2 ], + "to": [ 11, 10, 4 ], + "faces": { + "up": { "uv": [ 11, 3, 13, 5 ], "texture": "#texture" }, + "north": { "uv": [ 11, 10, 13, 11 ], "texture": "#texture" }, + "south": { "uv": [ 11, 10, 13, 11 ], "texture": "#texture" }, + "west": { "uv": [ 11, 10, 13, 11 ], "texture": "#texture" }, + "east": { "uv": [ 11, 10, 13, 11 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 5, 12 ], + "to": [ 4, 6, 14 ], + "faces": { + "up": { "uv": [ 11, 3, 13, 5 ], "texture": "#texture" }, + "north": { "uv": [ 11, 11, 13, 12 ], "texture": "#texture" }, + "south": { "uv": [ 11, 11, 13, 12 ], "texture": "#texture" }, + "west": { "uv": [ 11, 11, 13, 12 ], "texture": "#texture" }, + "east": { "uv": [ 11, 11, 13, 12 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 0, 12 ], + "to": [ 4, 2, 14 ], + "faces": { + "north": { "uv": [ 0, 1, 2, 3 ], "texture": "#texture" }, + "south": { "uv": [ 0, 1, 2, 3 ], "texture": "#texture" }, + "west": { "uv": [ 0, 1, 2, 3 ], "texture": "#texture" }, + "east": { "uv": [ 0, 1, 2, 3 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 1, 2, 11 ], + "to": [ 5, 5, 15 ], + "faces": { + "down": { "uv": [ 2, 10, 6, 14 ], "texture": "#texture" }, + "up": { "uv": [ 4, 4, 8, 8 ], "texture": "#texture" }, + "north": { "uv": [ 10, 13, 14, 16 ], "texture": "#texture" }, + "south": { "uv": [ 10, 13, 14, 16 ], "texture": "#texture" }, + "west": { "uv": [ 10, 13, 14, 16 ], "texture": "#texture" }, + "east": { "uv": [ 10, 13, 14, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/flamaea_1.json b/src/main/resources/assets/betterend/models/block/flamaea_1.json new file mode 100644 index 00000000..ca9b7abd --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/flamaea_1.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/plane_bottom", + "textures": { + "texture": "betterend:block/flamaea_1" + } +} diff --git a/src/main/resources/assets/betterend/models/block/flamaea_2.json b/src/main/resources/assets/betterend/models/block/flamaea_2.json new file mode 100644 index 00000000..f004b7ed --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/flamaea_2.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/plane_bottom", + "textures": { + "texture": "betterend:block/flamaea_2" + } +} diff --git a/src/main/resources/assets/betterend/models/block/flamaea_3.json b/src/main/resources/assets/betterend/models/block/flamaea_3.json new file mode 100644 index 00000000..78752c4c --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/flamaea_3.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/plane_bottom", + "textures": { + "texture": "betterend:block/flamaea_3" + } +} diff --git a/src/main/resources/assets/betterend/models/block/flamaea_4.json b/src/main/resources/assets/betterend/models/block/flamaea_4.json new file mode 100644 index 00000000..659574db --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/flamaea_4.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/plane_bottom", + "textures": { + "texture": "betterend:block/flamaea_4" + } +} diff --git a/src/main/resources/assets/betterend/models/block/flamaea_5.json b/src/main/resources/assets/betterend/models/block/flamaea_5.json new file mode 100644 index 00000000..8c7f8f65 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/flamaea_5.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/plane_bottom", + "textures": { + "texture": "betterend:block/flamaea_5" + } +} diff --git a/src/main/resources/assets/betterend/models/block/pond_anemone.json b/src/main/resources/assets/betterend/models/block/pond_anemone.json new file mode 100644 index 00000000..92cbdbc7 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/pond_anemone.json @@ -0,0 +1,111 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/pond_anemone", + "texture": "betterend:block/pond_anemone" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 1, 0, 1 ], + "to": [ 7, 10, 7 ], + "faces": { + "up": { "uv": [ 10, 9, 16, 15 ], "texture": "#texture" }, + "north": { "uv": [ 3, 6, 9, 16 ], "texture": "#texture" }, + "south": { "uv": [ 3, 6, 9, 16 ], "texture": "#texture" }, + "west": { "uv": [ 3, 6, 9, 16 ], "texture": "#texture" }, + "east": { "uv": [ 3, 6, 9, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ -1, 7, -1 ], + "to": [ -0.999, 15, 13 ], + "rotation": { "origin": [ -1, 7, -1 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 12, 8 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 12, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 9, 7, -1 ], + "to": [ 9.001, 15, 13 ], + "rotation": { "origin": [ 9, 7, -1 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 12, 8 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 12, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 9, 0, 5 ], + "to": [ 15, 8, 11 ], + "faces": { + "up": { "uv": [ 10, 9, 16, 15 ], "texture": "#texture" }, + "north": { "uv": [ 3, 6, 9, 14 ], "texture": "#texture" }, + "south": { "uv": [ 3, 6, 9, 14 ], "texture": "#texture" }, + "west": { "uv": [ 3, 6, 9, 14 ], "texture": "#texture" }, + "east": { "uv": [ 3, 6, 9, 14 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 7, 5, 3 ], + "to": [ 7.001, 13, 17 ], + "rotation": { "origin": [ 7, 5, 3 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 12, 8 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 12, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 17, 5, 3 ], + "to": [ 17.001, 13, 17 ], + "rotation": { "origin": [ 17, 5, 3 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 12, 8 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 12, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 0, 10 ], + "to": [ 6, 7, 14 ], + "faces": { + "up": { "uv": [ 11, 10, 15, 14 ], "texture": "#texture" }, + "north": { "uv": [ 4, 6, 8, 13 ], "texture": "#texture" }, + "south": { "uv": [ 4, 6, 8, 13 ], "texture": "#texture" }, + "west": { "uv": [ 4, 6, 8, 13 ], "texture": "#texture" }, + "east": { "uv": [ 4, 6, 8, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ -1, 4, 7 ], + "to": [ -0.999, 12, 21 ], + "rotation": { "origin": [ -1, 4, 7 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 12, 8 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 12, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 9, 4, 7 ], + "to": [ 9.001, 12, 21 ], + "rotation": { "origin": [ 9, 4, 7 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 12, 8 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 12, 8 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/ruscus_1.json b/src/main/resources/assets/betterend/models/block/ruscus_1.json new file mode 100644 index 00000000..1945a450 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/ruscus_1.json @@ -0,0 +1,97 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/ruscus", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 3, 15, 0 ], + "to": [ 19, 15.001, 16 ], + "rotation": { "origin": [ 3, 15, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, 11, 0 ], + "to": [ 17, 11.001, 16 ], + "rotation": { "origin": [ 1, 11, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, -10, 0 ], + "to": [ 17, 6, 0.001 ], + "rotation": { "origin": [ 1, 6, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -3, 13.5, 0 ], + "to": [ 13, 13.501, 16 ], + "rotation": { "origin": [ -3, 13.5, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 1, 1, 0 ], + "to": [ 17, 1.001, 16 ], + "rotation": { "origin": [ 1, 1, 0 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -1, -9, 0 ], + "to": [ 15, 7, 0.001 ], + "rotation": { "origin": [ -1, 7, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -1.5, 16, 0 ], + "to": [ 14.5, 16.001, 16 ], + "rotation": { "origin": [ -1.5, 16, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -2, 0.5, 0 ], + "to": [ 14, 0.501, 16 ], + "rotation": { "origin": [ -2, 0.5, 0 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/ruscus_2.json b/src/main/resources/assets/betterend/models/block/ruscus_2.json new file mode 100644 index 00000000..1ecd5869 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/ruscus_2.json @@ -0,0 +1,64 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/ruscus", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 3, 15, 0 ], + "to": [ 19, 15.001, 16 ], + "rotation": { "origin": [ 3, 15, 0 ], "axis": "x", "angle": 45 }, + "shade": false, + "faces": { + "down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -15, 0 ], + "to": [ 16, 1, 0.001 ], + "rotation": { "origin": [ 0, 1, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -2, -12, 0 ], + "to": [ 14, 4, 0.001 ], + "rotation": { "origin": [ -2, 4, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -9, 0 ], + "to": [ 16, 7, 0.001 ], + "rotation": { "origin": [ 0, 7, 0 ], "axis": "x", "angle": -45 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -3, 0 ], + "to": [ 16, 13, 0.001 ], + "rotation": { "origin": [ 0, 13, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/ruscus_3.json b/src/main/resources/assets/betterend/models/block/ruscus_3.json new file mode 100644 index 00000000..730d9820 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/ruscus_3.json @@ -0,0 +1,64 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "texture": "betterend:block/ruscus", + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ -1, 0, 0 ], + "to": [ 15, 16, 0.001 ], + "rotation": { "origin": [ -1, 16, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 2, -3, 0 ], + "to": [ 18, 13, 0.001 ], + "rotation": { "origin": [ 2, 13, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 0, -8, 0 ], + "to": [ 16, 8, 0.001 ], + "rotation": { "origin": [ 0, 8, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ -3, -12, 0 ], + "to": [ 13, 4, 0.001 ], + "rotation": { "origin": [ -3, 4, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + }, + { + "__comment": "PlaneY1", + "from": [ 3, -15, 0 ], + "to": [ 19, 1, 0.001 ], + "rotation": { "origin": [ 3, 1, 0 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/aurant_polypore.json b/src/main/resources/assets/betterend/models/item/aurant_polypore.json new file mode 100644 index 00000000..75840642 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/aurant_polypore.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/aurant_polypore" + } +} diff --git a/src/main/resources/assets/betterend/models/item/bolux_mushroom.json b/src/main/resources/assets/betterend/models/item/bolux_mushroom.json new file mode 100644 index 00000000..dd398963 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/bolux_mushroom.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/bolux_mushroom" + } +} diff --git a/src/main/resources/assets/betterend/models/item/flamaea.json b/src/main/resources/assets/betterend/models/item/flamaea.json new file mode 100644 index 00000000..c3752866 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/flamaea.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/flamaea_1" + } +} diff --git a/src/main/resources/assets/betterend/models/item/pond_anemone.json b/src/main/resources/assets/betterend/models/item/pond_anemone.json new file mode 100644 index 00000000..97a6674a --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/pond_anemone.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/pond_anemone" + } +} diff --git a/src/main/resources/assets/betterend/models/item/ruscus.json b/src/main/resources/assets/betterend/models/item/ruscus.json new file mode 100644 index 00000000..5fc191c9 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/ruscus.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/ruscus" + } +} diff --git a/src/main/resources/assets/betterend/shaders/material/glow_80_blue.frag b/src/main/resources/assets/betterend/shaders/material/glow_80_blue.frag index 85726ede..70450f40 100644 --- a/src/main/resources/assets/betterend/shaders/material/glow_80_blue.frag +++ b/src/main/resources/assets/betterend/shaders/material/glow_80_blue.frag @@ -2,5 +2,7 @@ #include frex:shaders/lib/math.glsl void frx_startFragment(inout frx_FragmentData fragData) { - fragData.emissivity = (fragData.spriteColor.b > 0.8) ? 1.0 : 0; + float a = abs(fragData.spriteColor.b - fragData.spriteColor.r); + float b = abs(fragData.spriteColor.b - fragData.spriteColor.g); + fragData.emissivity = (a > 0.1 && b > 0.1 && fragData.spriteColor.b > 0.8) ? 1.0 : 0; } diff --git a/src/main/resources/assets/betterend/textures/block/aurant_polypore.png b/src/main/resources/assets/betterend/textures/block/aurant_polypore.png new file mode 100644 index 0000000000000000000000000000000000000000..f3f94190ea6d3ed4d4f9cd120e18d64e9f85af3f GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~xd5LKS0LS@ zXV7nMxz5pHUx5GZ!nBCxcZ>JDYd!ma(arzQrZ&z7s^BUK@(X784+C|bB4I$$LQfaR z5Q(Y2eVlwp6nL0VUX=O&zkvOPo`lK~l|JJ$@=wg_jM{&&iX4jP4{)w(cri)lL*}#> zHmqkRN>(wReq|z+dY5w-gUY1Df7{oXM!1yiiBV2xmc4uRt`EmOF6mg-DCKgm(4q}z idi-Q1Et+k&yT<7$Gs^~EdGZ8kIfJLGpUXO@geCxQb6YL| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/bolux_mushroom.png b/src/main/resources/assets/betterend/textures/block/bolux_mushroom.png new file mode 100644 index 0000000000000000000000000000000000000000..8b869fa1fdcf73075aa5db267564f66ea7504ef0 GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~g8-ipS0MfH z@Uj=z_r806evgg*2{+Tr0ag!+gWt~1f3~Ch(aBl&Z?6ttax;7Di|WH)ThIPK>)^Z; zs7IhA$S;`TKPos7(CrMAYxHz+43U^>+sDm!K!L;gVq?So-}lR=T6!M&!nt zKx5HmbL<&9FF9#GXGn`%Jv-2gy&{+Q$s6&&hF9z&p%GU1V)X?k$QFl3_`P|N>}T?e zTPo!n_kwFu*#{Pxnya4hO}qFxScl=Po=~LI!iR^2B4w5-%$4NOO)C7h)%`cO2q(K~ TfyfPzV;DSL{an^LB{Ts5`2KeC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/flamaea_1.png b/src/main/resources/assets/betterend/textures/block/flamaea_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d7fb8cefea7dbebed3a00c336e7d262081c192e8 GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~tpJ}8S0Ej} z;a%(5|2v-izZ_t7C&%k?WBBu)__wq3@9voSY?$yd{|Nh_gTR1f;wT9tlPTE@b551m;T|+v> zR(6%d^5mU)X7JLF)$D?!`-i!rfjetij6zbw4z9Q^r2MIi$DsDyJ*Sxb#2@cZRK--y l5&bXq*{m$We*W*{-0YK?FEUPcEdbic;OXk;vd$@?2>_tyX~F;i literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/flamaea_3.png b/src/main/resources/assets/betterend/textures/block/flamaea_3.png new file mode 100644 index 0000000000000000000000000000000000000000..4404b30e7bc5892fdb3f24a4c62bd5b25ff05586 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~tpJ}8S0Ej} z;a%(5|2v-izZ_t7C&%k?WBBu)__wq3@9voSY;9`LQ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/flamaea_4.png b/src/main/resources/assets/betterend/textures/block/flamaea_4.png new file mode 100644 index 0000000000000000000000000000000000000000..098f1fd3188b73e27424e829bc76682a09d8c859 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~tpJ}8S0Ej} z;a%(5|2v-izZ_t7C&%k?WBBu)__wq3@9voSYBKvKA&2XXxR$icg>Q4}-}JKnI>2~+^W6SSpn(jYu6{1-oD!M< DcJyAq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/flamaea_5.png b/src/main/resources/assets/betterend/textures/block/flamaea_5.png new file mode 100644 index 0000000000000000000000000000000000000000..52458b41468e295f945b76728689e05bbfaf6401 GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~tpJ}8S0Ej} z;a%(5|2v-izZ_t7C&%k?WBBu)__wq3@9voSY2?x|sCWJ^;*4}E2eS|a;)>)(y)ye~E|Zsp|btp^&#;OXk;vd$@?2>{(&S!@6R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_sapling.png b/src/main/resources/assets/betterend/textures/block/lucernia_sapling.png new file mode 100644 index 0000000000000000000000000000000000000000..6b8ec8ee82b40b13f170615f6ec00ab9fc507306 GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~xd5LKS0G)i zqBhmYWVw~;URU$W0ajk>3gNoS8CJU0uBPU3yiQm^UmCM++a7u<&8F8`l6kl_h{_Ixm$pD9B-5Hb9PP~)Z)X%e8ZvUrW*G}BM+G_pl?heJ*k~cc- g7xtwu{bVs!++h!sm(dGz8=%z;p00i_>zopr02xeL*8l(j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/pond_anemone.png b/src/main/resources/assets/betterend/textures/block/pond_anemone.png new file mode 100644 index 0000000000000000000000000000000000000000..48fef70ea4925af64c299340d6a4d87ee93bec06 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~-2k5uS0LS` zZok07ZJVdhfr$81X+;+sdalo0c5Cgn=RNV)x6Hh|W9H-2bMD_>{qe)CCg(g^pa%Yu zAirRS|0v*T@4RI|saj7L#}J9Bu6~?C%!(Y{K{2Pl{(mku02)j zyGE?Ne8{u2Q*_zEs|tPs7T-Isa;fUawAaUB_5`{IP1u+UJE5ui28g^CMsKzwJ7F;}DOk9^2(f bl5NZZmJA;QjEsK)&13L%^>bP0l+XkKP#8YF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/aurant_polypore.png b/src/main/resources/assets/betterend/textures/item/aurant_polypore.png new file mode 100644 index 0000000000000000000000000000000000000000..bfdde53215e172037a63aef3129b67dd2c4c34c6 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6zM9{GlYxBc0G|+7 zAf2VG+MsXPZ*IBH(P3YJ|LwxG;yv$L&;HkE-Np!%<}3;F3ugEa1?Eh%uK)#oJY5_^ zB&M$Ibrfna;9-i^Q2AfKab?u&tCHW@R4&}=FIli(Md9|1!h?oqM5~W&&|ADNG9qCP w+fqZp&;K6ii0rgdZVWn6;ilBByT6EG+Ac=FC~m>)Kyw*9UHx3vIVCg!0M|ZA4*&oF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/bolux_mushroom.png b/src/main/resources/assets/betterend/textures/item/bolux_mushroom.png new file mode 100644 index 0000000000000000000000000000000000000000..350ed56b8c63940013bffddc808cf01ecc3c0614 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~-2k5uS0KH| zM*oDH>E!^c2gSi}XXiiL(f#P;toyfDhcCIAz4b-);ja%5FMDx)@4M&c7tB}t57fY4 z666=m@E-*{?VYy_C>7-C;us<^b#A{WAA=$XOQ-|umH+nF=Vhc>M{QrVM402@l%VXB z`sX>eo_MP>sqw=%mmZZfF4{*{I|O%WYj8EZzPDoL?%A0YFV@!bOa7I2v;UXH^kyOB V;lD>59so^e@O1TaS?83{1OS&sW@`Wd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/bolux_mushroom_cooked.png b/src/main/resources/assets/betterend/textures/item/bolux_mushroom_cooked.png new file mode 100644 index 0000000000000000000000000000000000000000..4541a243b9f0f365bbea5d4ffd4bf38869af26bb GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~i2$DvS0L>s zz>*}xRH4DzWx_YhUG8|H`op=tZcp?c0p&PKg8YIR{zJgkQz1q`v2afp#}J9Bz5U)| z2NZaiR8=beON&Qu)k`(EIk9}J^+ZQGnGJm0tF$;b@)V~{+o0rDB%!@1<$6Jx`tDPb ziACo7m(Fb1p3-wlhHKH8dgYq5$t7}CKOZhIxaCJhZcB~1H+4jbkW9a;u!vTSyB@!Ec#&= zdJ(9tAn1n|X%`U%#=?lgFfT?#tiTcs3PLc;s70sGR-u1D&&&Dnyw8F2{hasB*hSvm zu*rHJB{mUhWvvvm!mzl%GW~yDfczhe&SI*QW6M}BRg7E}@|u2=Qhz7jRXfGjh-^_+ zuwh#*jMY@afzWRFwtFkgU5&wo$CqIKb2S`!zaPdQYPjoS2W)KL0h=3r&|g~v>*|tF zhx_2cjyV`j8+d4D9!|gc2@NHZ9={JyA3qD*<8jy$YKA>~`{9`14|4~i@Kx^w92nXM z`#ZIXbAdI5@2+UL1UEn*cf_$q8DC^EMH5E^u|o|nq%cCK;9?9GD3DJ$$;6ULAZbK- z3rWfW{}l@2l3?W6VM|rs<;AH46^9sp%AYC~w;a734c9xz+l+C|d74!D)3!4%P)Px$S4l)cR5*>*kv~g9Q5=S!>zFrFLP7{E<4T~DUMHuv<`!3nHkbCGEfAcgwT}@k zeF1e7B=OIMH02`adOgSWHe9;?E2t&tg~Q?Zp5A;@a|+#FpUTSvO4x*Bag?xmyt>0UO9jx&V;`oiC!XG15Y=_|4h~5qQ@mS! z63G;<$Ol`kpDQU>*w^BJzYAQIUJz>yLqY>Krq-CiGn z5I~_?Vmz`?!bT_=7`I_Y)&yWYvM5wbD?p{y(1enVM;4iM21iQlVTY)$6N&5xFePlp zBMYGn^Z|9gM8Waz5KIZvfUIv9OL%tNNemgXv_$yz!0es^?5E z7S@UCI)mwiOgcmRwY_8h7O)Nhc544v^_=O|bEfxe{qe)CCg(g^pa%Yu zAirRS|0v*T@4RI|sbo(V#}J9Bz5dZ$2Mjnii{AF_{civ6P5aW{5;|Q;Ja!#*jO(X- zP-r+*{<4c>h4|A(hhNhIw&i;VUgbJq+k8#PG}-KO)Z-MR6p6QzChJp=ry5O{brBbP k$9{1~asG32-H#t%Fw0~!*PLwB2YHLZ)78&qol`;+07z(Qu>b%7 literal 0 HcmV?d00001 From 406cc8f9008b1187699632ede2f707b33a7ab520 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 17 Mar 2021 16:16:45 +0300 Subject: [PATCH 351/463] Lantern woods structures, block translations & fixes --- .../java/ru/betterend/registry/EndBlocks.java | 2 +- .../ru/betterend/registry/EndFeatures.java | 2 + .../betterend/registry/PondAnemoneBlock.java | 61 ++++++++++++++++++ .../world/biome/land/LanternWoodsBiome.java | 2 + .../assets/betterend/lang/en_us.json | 9 ++- .../assets/betterend/lang/ru_ru.json | 9 ++- .../structures/biome/lantern_woods/cabin.nbt | Bin 0 -> 1579 bytes .../biome/lantern_woods/light_1.nbt | Bin 0 -> 406 bytes .../structures/biome/lantern_woods/log_1.nbt | Bin 0 -> 477 bytes .../structures/biome/lantern_woods/log_2.nbt | Bin 0 -> 812 bytes .../biome/lantern_woods/ruins_1.nbt | Bin 0 -> 585 bytes .../biome/lantern_woods/ruins_2.nbt | Bin 0 -> 542 bytes .../biome/lantern_woods/structures.json | 13 ++++ .../biome/lantern_woods/stump_1.nbt | Bin 0 -> 234 bytes .../biome/lantern_woods/stump_2.nbt | Bin 0 -> 318 bytes .../biome/lantern_woods/stump_3.nbt | Bin 0 -> 379 bytes 16 files changed, 95 insertions(+), 3 deletions(-) create mode 100644 src/main/java/ru/betterend/registry/PondAnemoneBlock.java create mode 100644 src/main/resources/data/betterend/structures/biome/lantern_woods/cabin.nbt create mode 100644 src/main/resources/data/betterend/structures/biome/lantern_woods/light_1.nbt create mode 100644 src/main/resources/data/betterend/structures/biome/lantern_woods/log_1.nbt create mode 100644 src/main/resources/data/betterend/structures/biome/lantern_woods/log_2.nbt create mode 100644 src/main/resources/data/betterend/structures/biome/lantern_woods/ruins_1.nbt create mode 100644 src/main/resources/data/betterend/structures/biome/lantern_woods/ruins_2.nbt create mode 100644 src/main/resources/data/betterend/structures/biome/lantern_woods/structures.json create mode 100644 src/main/resources/data/betterend/structures/biome/lantern_woods/stump_1.nbt create mode 100644 src/main/resources/data/betterend/structures/biome/lantern_woods/stump_2.nbt create mode 100644 src/main/resources/data/betterend/structures/biome/lantern_woods/stump_3.nbt diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 33dc7e76..28fb95fa 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -321,7 +321,7 @@ public class EndBlocks { public static final Block HYDRALUX_PETAL_BLOCK = registerBlock("hydralux_petal_block", new HydraluxPetalBlock()); public static final ColoredMaterial HYDRALUX_PETAL_BLOCK_COLORED = new ColoredMaterial(HydraluxPetalColoredBlock::new, HYDRALUX_PETAL_BLOCK, true); - public static final Block POND_ANEMONE = registerBlock("pond_anemone", new BubbleCoralBlock()); + public static final Block POND_ANEMONE = registerBlock("pond_anemone", new PondAnemoneBlock()); public static final Block FLAMAEA = registerBlock("flamaea", new FlamaeaBlock()); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 8646a7fb..f02e0fb6 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -148,6 +148,8 @@ public class EndFeatures { public static final EndFeature SMALL_JELLYSHROOM_WALL = new EndFeature("small_jellyshroom_wall", new WallPlantFeature(EndBlocks.SMALL_JELLYSHROOM, 4), 4); public static final EndFeature SMALL_JELLYSHROOM_WOOD = new EndFeature("small_jellyshroom_wood", new WallPlantOnLogFeature(EndBlocks.SMALL_JELLYSHROOM, 4), 8); public static final EndFeature JUNGLE_FERN_WOOD = new EndFeature("jungle_fern_wood", new WallPlantOnLogFeature(EndBlocks.JUNGLE_FERN, 3), 12); + public static final EndFeature RUSCUS = new EndFeature("ruscus", new WallPlantFeature(EndBlocks.RUSCUS, 6), 10); + public static final EndFeature RUSCUS_WOOD = new EndFeature("ruscus_wood", new WallPlantOnLogFeature(EndBlocks.RUSCUS, 6), 10); // Sky plants public static final EndFeature FILALUX = new EndFeature("filalux", new FilaluxFeature(), 1); diff --git a/src/main/java/ru/betterend/registry/PondAnemoneBlock.java b/src/main/java/ru/betterend/registry/PondAnemoneBlock.java new file mode 100644 index 00000000..62d2ef2f --- /dev/null +++ b/src/main/java/ru/betterend/registry/PondAnemoneBlock.java @@ -0,0 +1,61 @@ +package ru.betterend.registry; + +import java.util.Random; + +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.block.AbstractBlock; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Material; +import net.minecraft.block.ShapeContext; +import net.minecraft.particle.ParticleTypes; +import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.BlockView; +import net.minecraft.world.World; +import ru.betterend.blocks.basis.UnderwaterPlantBlock; + +public class PondAnemoneBlock extends UnderwaterPlantBlock { + private static final VoxelShape SHAPE = Block.createCuboidShape(2, 0, 2, 14, 14, 14); + + public PondAnemoneBlock() { + super(FabricBlockSettings.of(Material.UNDERWATER_PLANT) + .breakByTool(FabricToolTags.SHEARS) + .sounds(BlockSoundGroup.CORAL) + .breakByHand(true) + .luminance(13) + .noCollision()); + } + + @Override + public AbstractBlock.OffsetType getOffsetType() { + return AbstractBlock.OffsetType.NONE; + } + + @Environment(EnvType.CLIENT) + public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { + double x = pos.getX() + random.nextDouble(); + double y = pos.getY() + random.nextDouble() * 0.5F + 0.5F; + double z = pos.getZ() + random.nextDouble(); + world.addParticle(ParticleTypes.BUBBLE, x, y, z, 0.0D, 0.0D, 0.0D); + } + + @Override + public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + return SHAPE; + } + + @Override + public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { + return false; + } + + @Override + public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { + return false; + } +} diff --git a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java index 1ed6436b..d87c7adf 100644 --- a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java @@ -29,6 +29,8 @@ public class LanternWoodsBiome extends EndBiome { .addFeature(EndFeatures.POND_ANEMONE) .addFeature(EndFeatures.CHARNIA_ORANGE) .addFeature(EndFeatures.CHARNIA_RED) + .addFeature(EndFeatures.RUSCUS) + .addFeature(EndFeatures.RUSCUS_WOOD) .addStructureFeature(ConfiguredStructureFeatures.END_CITY) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); } diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index bd178a0d..47618bf5 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -798,5 +798,12 @@ "block.betterend.lucernia_stairs": "Lucernia Stairs", "block.betterend.lucernia_stripped_bark": "Stripped Lucernia Bark", "block.betterend.lucernia_stripped_log": "Stripped Lucernia Log", - "block.betterend.lucernia_trapdoor": "Lucernia Trapdoor" + "block.betterend.lucernia_trapdoor": "Lucernia Trapdoor", + + "block.betterend.aurant_polypore": "Aurant Polypore", + "block.betterend.bolux_mushroom": "Bolux Mushroom", + "block.betterend.flamaea": "Flamaea", + "block.betterend.pond_anemone": "Pond Anemone", + "block.betterend.ruscus": "Ruscus", + "item.betterend.bolux_mushroom_cooked": "Cooked Bolux Mushroom" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 6b7d44db..cf6847a2 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -818,5 +818,12 @@ "block.betterend.lucernia_stairs": "Ступени из люцернии", "block.betterend.lucernia_stripped_bark": "Обтёсанная кора люцернии", "block.betterend.lucernia_stripped_log": "Обтёсанное бревно люцернии", - "block.betterend.lucernia_trapdoor": "Люцерниевый люк" + "block.betterend.lucernia_trapdoor": "Люцерниевый люк", + + "block.betterend.aurant_polypore": "Аурантовый трутовик", + "block.betterend.bolux_mushroom": "Болюкс", + "block.betterend.flamaea": "Фламея", + "block.betterend.pond_anemone": "Озёрный анемон", + "block.betterend.ruscus": "Рускус", + "item.betterend.bolux_mushroom_cooked": "Приготовленный болюкс" } \ No newline at end of file diff --git a/src/main/resources/data/betterend/structures/biome/lantern_woods/cabin.nbt b/src/main/resources/data/betterend/structures/biome/lantern_woods/cabin.nbt new file mode 100644 index 0000000000000000000000000000000000000000..a2e1da2b3eab4f37c10c1dd49489849de5ce8702 GIT binary patch literal 1579 zcmV+`2GscG8Y+WrcR84^s^GnvN>B8+4(ios|G zLur-_&A?EafuS@5Lum$v(ySPofuS@5Lum$v(hLlxS@#Sz#xx_&03IHbMHs3+z)-$` z84|fNL=QF&!(0-nVJePhcn5~^t`R*khVniDZww~Yi;U5WjM0lw4>nd)jAr=K3}2ez zOEY{8;F-as>MR*`mW(=wdayAc#=+LQ6r&iq6eEsi)DW0dPg6D2h#st8D$t`MOvYd& zgHa4dGngU4WQZ>vVTJ@F8F3^dj$*`7j5wOnFJP#C0Ymi*7^+{uQ2o+~FRWiW;R_hb z7ci7BU?^X}P`-end`X5c$?zo^z9hq!WcZQ{Uy9*NF?=b8FU9bs7`_z47o0DA&BF*I z8H{2unqc7U;MaK+VMZP^j_l{DI1-67iR`hdI0}g~jqI`gI-f)s$zT+N(F6l~Y(LjG z5k?UV?6G}c4)<4_}du(2wGI8P&tA{aP-rN(oZE5@Y8vt;yL24nSE zgh`FnQ1kN$lNzfj&5EH%A$np=Y8r~vios|G zGh{F$!aJOE{rX`0mM~7pz&SS~dI3yo4unA98$HNT87sW}*Gjxi%b zvqCh7>!Ct4V{}GPl2K4DKOML1%{fZz)kq}K==WAD< zU9ObITL)N~Vku->t;gcz%GI}a(78PmdTENrj$PGPW^KjT1u^;gsvV2r(kz@Kp{#Ku z4-&tL*53VZ^7`}g-aWH!s!hB4($vFw)wb0Ioqg&u*?Lyk<*}W!(qrb!s=g=lC!P5^ z==+uZkNSR;%y+H(&8B0^NS_su2M2xb{jWL*2sOt|dvoIP)9RJG+zQprqfUe_sw-QM z-BP}N_VVA%=5QCM>_6S-eum^etEwZ{`R0hbMVWVl1>#4N?rN#pdb54iHMD=#r41Z= z*;{9-FipO>n7KRlQJ2;`53HTzUO#1c|FX*jFFVV->+j$g9bX%F)4Qkfb%Yz}ZRhYY z?wq%nz+K3G9_<4>J_K0ig()^4zS?rn*NUc5?KPtR6>$$K%={LSw+@dRHr(2sqO)PK zGI<#WgbHSxHMui{&5gOVU-fQzubadB+aLYkwkTh^FGkaSwpw-*sd4WWhvo7)cJ|pF zO(R2-Tzs*)-XBeaaO0I}c1KUR^-Q*J6x+J&Z>`XxR^U_4(l000$>2U-9C literal 0 HcmV?d00001 diff --git a/src/main/resources/data/betterend/structures/biome/lantern_woods/light_1.nbt b/src/main/resources/data/betterend/structures/biome/lantern_woods/light_1.nbt new file mode 100644 index 0000000000000000000000000000000000000000..7b69a0d7bce4db6f62e3b6c119b546c804edda1d GIT binary patch literal 406 zcmV;H0crjpiwFP!000000IgG7Z<{a_{s5B#(H^#^De5ojYx`X7sjtxqISJN`jqF3y z_1DkjLLx+`sT-0dj{V(yY*#=D74$o20EUsokq`eR3bvv}bHMPGSZs`|e}*a+MTx9) z;X=Zhm}JOo>@Re(iB2|yQ4<~Y0p?aGM}^F8q{5PF(XYJL z!fk<6Z}FwomTONtc_8f*?-f|Q)Gk%z4T13oUM`qv-t-q^K z{qU}1KO9W~#S{d}I?Dx?he-0q?f1Mzz9SRjWFA~E%>|NM=dYDI@RgnR9hCT$2 ARsaA1 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/betterend/structures/biome/lantern_woods/log_1.nbt b/src/main/resources/data/betterend/structures/biome/lantern_woods/log_1.nbt new file mode 100644 index 0000000000000000000000000000000000000000..92de71c02f3bdc22d9424934702c8eb3a22f2e8b GIT binary patch literal 477 zcmV<30V4h%iwFP!000000Hu{rPs1P>#@_<%+V0}XL@#~@6HlH!8&6&r*5Pcd&;a$% zKD|`O>g z+zVxk5d3`^hFoc?*}lTZpacddFeHJ=BTQyj0u%FWnV4tG#5`Lj#d9&!d-faRJTrG+ zbG=(;?!M-Fw@j>e%cS(ah%h$Cm}kqxJX>b&zL4WN^LR!HIirM}Q9{lrA!paKkHL

    p#Adhf(xi09rz3`t<7esYgzH^U+@8#vOJWk>=u^|J^t(|k%# zhVC4?y=*t;9I(1;4NhCw$(eY*I`f>Y0`x(j|KZ~Ar zOlvkiuge2NH-5QlfeHWs`Ty)O literal 0 HcmV?d00001 diff --git a/src/main/resources/data/betterend/structures/biome/lantern_woods/log_2.nbt b/src/main/resources/data/betterend/structures/biome/lantern_woods/log_2.nbt new file mode 100644 index 0000000000000000000000000000000000000000..1e8e933982aa283ce32de0b765b6eb323a082301 GIT binary patch literal 812 zcmV+{1JnE;iwFP!000000Iir!Z`3dlh9`;bd=wB|kl?~^fFozlh!fY!yX&?QX%Zz4 zE&T)hZ4#78Q`erc+OA}+HhMhs=AH3}wgM zG~MynSj|8FmXP(`h?6o{KN-l;YHQXRJ|>A^(g-GtU_=BXBN!FIxyLu4oqk)b?9hVl>@%0px*57WgP#vf!Te~_X4L5A`N8Ok4ID1VTl{6U86F;`FG z@!9pqW#r0G>m3=Y7SfX|#89$Z$QMGCm{2 z^?b_sj11TFDdRITT+gSB&&W_d%LosV;d+(x5E-slIS-NHdX@7K8OlTD(c|t3%A?0+ zwsVfzqcWxzTWup4?w*h_wb*=$V7Pli#?%4_RSOZ}4>H^xfb$0#?he5DgA8{E;QT=* z#vg9IyPADxoU7T_^KP8fVG?+J#$^F!A4de3y&f50a)QY`dP2;;H&lSx_eLII_L_?T zlM}h{P6C97$Rvaw;dw7t4>B?$S57d>quG5gWcIZv1I%7e6<|~Zv)6nUUf4$Co z`FhnoPklY_o|Pd+L@?aCaL>3)c%7^PONw3(d_!1d*0pEgN!1W6u*hJgABF*AX5-=q$iiV z-jSj9d1NS`k>Pyi;vl1lUd=uJxIT+@Q0q&s43$d-;^e(@b-v+y`Gcqko%`i1_7YBB~30tlLWvH)gck{I~b>hiN=ck<)f*^)%?#p7&kzr|$+6 zH~*7Ib~nvWIPpe5MZ9dg!CpN(yBufg`C%Tu#FL|(x|{ZewZxZIj#s)jpbnk2-SrmW q-F<+Iy3x&a8%mr`eZ2S#&c11@e=e(_Yv=pXNB9RN30Fk^761VD^^mOq literal 0 HcmV?d00001 diff --git a/src/main/resources/data/betterend/structures/biome/lantern_woods/ruins_1.nbt b/src/main/resources/data/betterend/structures/biome/lantern_woods/ruins_1.nbt new file mode 100644 index 0000000000000000000000000000000000000000..37500bb3a558c2373e28de6d7ad2dccd88f368b8 GIT binary patch literal 585 zcmV-P0=E4hiwFP!000000IiivkJB&^$0yGwDUanLBpwnUfD>@z%!Lcu6W7X3Cta&v zJF=Z!mQRnPHm%9psaqPUs*?QXKjWFd;|idJRM9_}06_mMcK@>y3gntwXS1K9$0gHgvkS#!H4#|a*sD`KhHc& zZZU<&8+H#%k2lf@W|(_CQ8PGtSa}#*XYOIL37x?kc7L9DykW2FsfWoXn0-ErdFElJ zat$7fCu*JrJqXa8gI8B`2u3Pf~zHJjS~6l z+mc9$%wtEpte5A@4b!vbUKwWA64pod2hQsXs%t4)l>LEJKuUg71<`{^k^UsN2yYHa zSXZOulq{H7@87?5yl)xd8?{G1IFO|f8+C)Mfl&d)ikez^jSzh)pfb;ud0t?7p-6qt&kWNAKuD;dvJQ*xN9%m!E?<$EKnjmc@HW~qfVPbZ6c4xVE15g9A;tv)8FuoV0@k|g2^WEWD|Ju378_l;_?QCX z{qZ%k1g7vXWuiZ@hbNEl%mU0-x36cO!1#4l5zV0&vD!l~>V#j1>dJz;nuz95Ppqy` z&my8ZoQ-FR`SEi-Phfn_FCu!vTrVSf!Z|!k%&M>FRRZJdc^%Oc=6XYzx#m4OhvW5s z+dy+}ltweIhYG4r5LC7Z*_R3$I=6H{>jRiG1Jc~E@B9kk{pHADPFiK!EDJ}Ay>dQXx&~GHPA^y{+6Yb%DDCM zG?q}0r(tW}FKK-%=hRgNiw(JIsP+|hP%e3Iv7!`fuE{Ct4Hv7mOV$wckjxh*sh%M} zK`VDz&hA;vVA~-XmJj;W?Vp@`SF+bQJ{T_Dg;xEwRtDpK6;A1dS#zy6#B_hKGqprO zTr#+OA0x$+*Sb^6oKC>)uso@P8?&BL!Hw^_GUx}=zK06Bl0D=+<1^@s6 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/betterend/structures/biome/lantern_woods/structures.json b/src/main/resources/data/betterend/structures/biome/lantern_woods/structures.json new file mode 100644 index 00000000..d33c7b73 --- /dev/null +++ b/src/main/resources/data/betterend/structures/biome/lantern_woods/structures.json @@ -0,0 +1,13 @@ +{ + "structures": [ + { "nbt": "cabin", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "light_1", "offsetY": 0, "terrainMerge": "object" }, + { "nbt": "log_1", "offsetY": 0, "terrainMerge": "object" }, + { "nbt": "log_2", "offsetY": 0, "terrainMerge": "object" }, + { "nbt": "ruins_1", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "ruins_2", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "stump_1", "offsetY": 0, "terrainMerge": "object" }, + { "nbt": "stump_2", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "stump_3", "offsetY": 0, "terrainMerge": "surface" } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/betterend/structures/biome/lantern_woods/stump_1.nbt b/src/main/resources/data/betterend/structures/biome/lantern_woods/stump_1.nbt new file mode 100644 index 0000000000000000000000000000000000000000..655057ab15681fe998e8c216cdc7364a2ec3e17d GIT binary patch literal 234 zcmV&YTe^u9a8JhzLpKB#80! zq`!{FTyJ zrA(RsjX4GrMlCSSglT3Nb@rC7%ta)}IrDEk1M?&yvW)RJXz9x)s6FcSkv9hWl#^nQLdS*#Bc);A^2Ofq<_@) z)7wT_2`MhgHfey#d%rgmrU7c?R(=r&5N|#_YgDA1bdoIMsZnk^-M-o;e4N+dy|#lX z!_Ub$3hRWUUq?#A{?V`n9JYXy4R?WN%*hg2$2cs(Nom*-4iX$T(=#7w_)I?-Y4VAN zC$fq}7Mp0w1ZO%|{ zloabu?=bOITNxr$OUQ03G@))oA*?8JXFMHnS1BBc_prtjV)-musdmUe$hw37CgImU zRE|&z8&of+W0W={%xD_njZkjg>u%p`L$lM67)^8W=QrNAem0l+etGX4XZOO1r}z)F Q0-9@l1F1DcoJs@$0O;3|?EnA( literal 0 HcmV?d00001 diff --git a/src/main/resources/data/betterend/structures/biome/lantern_woods/stump_3.nbt b/src/main/resources/data/betterend/structures/biome/lantern_woods/stump_3.nbt new file mode 100644 index 0000000000000000000000000000000000000000..38f59eac45a76ee1341017cda0554dc91420a9ed GIT binary patch literal 379 zcmV->0fhb^iwFP!000000Hu`8PJ}QNg>PwL05`5Qy7whqyEd-ePC9rUo57Z}B|1L6 zkW6PfNNLTK5JK{uo^x-1YJduu5kE))V0;Vrt)N6{g%xOE92FFsRy8|Q4?hnT&`udA zawDUV8_O*o6h1=^4DlEeV6p^;CNTLzp3H?#V3smFh9xlh0z(tLXo43@=%Hhldgz#? z9_BNdLriRMkjOlaiR}#%sVkfD3Nf)YC6WHn1TUK4#S&}JBFr)O0s}K%S%C5TOap7- zpDz|*{Mz$C?SAGW!1#Gq0mk<#13e^>%-O_in)!IszW_q zu_ZA6Eew$T5Q;tXPlVgeh-#E?k8R(emV&Q0T<;(zyqOWUYCF{x@4OLm3+xMxJ&LbS zV%?jjH)*oFlZ^M8OS|q=yYH07kUp16+mA~oFsk<^NDq$uvf$^w|DWJIKyvO$!~W_h ZTs?8iUr`&O Date: Wed, 17 Mar 2021 16:21:37 +0300 Subject: [PATCH 352/463] Emissive maps --- .../textures/block/aurant_polypore_e.png | Bin 0 -> 179 bytes .../betterend/textures/block/bolux_mushroom_e.png | Bin 0 -> 174 bytes .../betterend/textures/block/flamaea_1_e.png | Bin 0 -> 194 bytes .../betterend/textures/block/flamaea_2_e.png | Bin 0 -> 195 bytes .../betterend/textures/block/flamaea_3_e.png | Bin 0 -> 182 bytes .../betterend/textures/block/flamaea_4_e.png | Bin 0 -> 166 bytes .../betterend/textures/block/flamaea_5_e.png | Bin 0 -> 165 bytes .../betterend/textures/block/pond_anemone_e.png | Bin 0 -> 213 bytes 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/assets/betterend/textures/block/aurant_polypore_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/bolux_mushroom_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/flamaea_1_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/flamaea_2_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/flamaea_3_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/flamaea_4_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/flamaea_5_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/pond_anemone_e.png diff --git a/src/main/resources/assets/betterend/textures/block/aurant_polypore_e.png b/src/main/resources/assets/betterend/textures/block/aurant_polypore_e.png new file mode 100644 index 0000000000000000000000000000000000000000..7d19a8a39d919a592c973e0d00062f10a2e454fa GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~{s5m4S0Ej+ z{BH4{cdcjtFS_~P>Y&*zpb%?GkY6yve;|;#pawF@(bL5-L}KdRUQa#-1rFwgZ~x!V z2^4O=x0HR7=k$*I(;dthxMVwIZ6@yC#8c)mCFH<-R*%JzJHtF8suwd{I%zYJQKODw V<3WqZOMr$kc)I$ztaD0e0suU*JJ|pL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/bolux_mushroom_e.png b/src/main/resources/assets/betterend/textures/block/bolux_mushroom_e.png new file mode 100644 index 0000000000000000000000000000000000000000..d90e929bbbbffa7a810af7ababd235c79749dffe GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~{s5m4S0Ej} z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/flamaea_1_e.png b/src/main/resources/assets/betterend/textures/block/flamaea_1_e.png new file mode 100644 index 0000000000000000000000000000000000000000..e246a96e5356c447e4bbde5e023fa78a7adcb296 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~(Ey(iS0Ej} z;a%(5|2v-ie|&n*{oAWQez8yGR{)N$aN&d?^t<7~L*Xo*B71B31chR|n41)@Ox44$rjF6*2U FngD7OFd6^= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/flamaea_5_e.png b/src/main/resources/assets/betterend/textures/block/flamaea_5_e.png new file mode 100644 index 0000000000000000000000000000000000000000..3d1d907e0d14de5e9efb7fbefb17a1093aa2fac0 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~{s5m4S0Ej} z;a%(5|2v-ie|&n*!h_5;Kq1zWAirRS|3DyfK@DV*v8Rh;h{V+71O;&eLu2EGA0Dzy zInSXaIdj63$O9Z|hj@0e0+M&{oAWQez;Yue(^L=g1scjFPPy!7%Z({_8TY^?djqeA~ChJFOctm z0*AA9?#}-c*}G?b+<45RVww`e Date: Wed, 17 Mar 2021 16:29:27 +0300 Subject: [PATCH 353/463] Ruscus retexture --- .../assets/betterend/textures/block/ruscus.png | Bin 186 -> 192 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/betterend/textures/block/ruscus.png b/src/main/resources/assets/betterend/textures/block/ruscus.png index 50ad99ae91ed4746e675c1395f65e17d003f92db..685896326e5cbc75a97b62c35b269c462c02306d 100644 GIT binary patch delta 102 zcmV-s0Ga=~0l)!}VP8r~L_t&-mAy>K0l+W_QqcWZ4rue~0P(@0V8qku`g;nl`FvF0 za1+y*O*;#&EQ4fipiNs&P6HysKNDWiq@z3OHjL8FP`Xm$08mi@3Z7G_E&u=k07*qo IM6N<$f>l;4>i_@% delta 96 zcmV-m0H6QB0lEQ@VOc~;L_t&-mA#9>4FE6*0u^!pl`ACn(E;j%+!2iUdd=5+Vnwb2 zd&lD?bgk!c80!XN3vXHJ5ABM>*uo4YE(X(*8HNK;IRNocGBf%B0000 Date: Wed, 17 Mar 2021 17:15:36 +0300 Subject: [PATCH 354/463] Fix "megalakes not spawning" bug --- .../ru/betterend/world/structures/piece/LakePiece.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java index 238704ae..ceff886e 100644 --- a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java @@ -219,12 +219,6 @@ public class LakePiece extends BasePiece { return 0; } - /*h = world.getTopY(Type.WORLD_SURFACE, pos.getX(), pos.getZ()); - if (!world.getBlockState(new BlockPos(pos.getX(), h - 1, pos.getZ())).getFluidState().isEmpty()) { - heightmap.put(p, (byte) 0); - return 0; - }*/ - h = world.getTopY(Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); h = MathHelper.abs(h - center.getY()); h = h < 8 ? 1 : 0; @@ -257,7 +251,7 @@ public class LakePiece extends BasePiece { private void makeBoundingBox() { int minX = MHelper.floor(center.getX() - radius - 8); - int minY = MHelper.floor(center.getX() - depth - 8); + int minY = MHelper.floor(center.getY() - depth - 8); int minZ = MHelper.floor(center.getZ() - radius - 8); int maxX = MHelper.floor(center.getX() + radius + 8); int maxY = MHelper.floor(center.getY() + depth); From 58a29704436011329e4cef63dc5083ff44aa142f Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 17 Mar 2021 17:17:54 +0300 Subject: [PATCH 355/463] Missing recipe --- src/main/java/ru/betterend/recipe/FurnaceRecipes.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/ru/betterend/recipe/FurnaceRecipes.java b/src/main/java/ru/betterend/recipe/FurnaceRecipes.java index b230c256..da4f8a7e 100644 --- a/src/main/java/ru/betterend/recipe/FurnaceRecipes.java +++ b/src/main/java/ru/betterend/recipe/FurnaceRecipes.java @@ -15,5 +15,6 @@ public class FurnaceRecipes { FurnaceRecipe.make("slime_ball", EndBlocks.JELLYSHROOM_CAP_PURPLE, Items.SLIME_BALL).build(); FurnaceRecipe.make("menger_sponge", EndBlocks.MENGER_SPONGE_WET, EndBlocks.MENGER_SPONGE).build(); FurnaceRecipe.make("chorus_mushroom", EndItems.CHORUS_MUSHROOM_RAW, EndItems.CHORUS_MUSHROOM_COOKED).buildFoodlike(); + FurnaceRecipe.make("bolux_mushroom", EndBlocks.BOLUX_MUSHROOM, EndItems.BOLUX_MUSHROOM_COOKED).buildFoodlike(); } } From 08afd4fd9723168d4280a43fb176783cc98ea382 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 17 Mar 2021 22:45:23 +0300 Subject: [PATCH 356/463] Island layer options --- .../blocks/basis/TripleTerrainBlock.java | 1 - .../world/generator/BetterEndBiomeSource.java | 12 ++++- .../world/generator/GeneratorOptions.java | 8 +++- .../world/generator/IslandLayer.java | 36 ++++++--------- .../world/generator/LayerOptions.java | 46 +++++++++++++++++++ .../world/generator/TerrainGenerator.java | 6 +-- 6 files changed, 81 insertions(+), 28 deletions(-) create mode 100644 src/main/java/ru/betterend/world/generator/LayerOptions.java diff --git a/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java index 70979594..052f376a 100644 --- a/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java @@ -50,7 +50,6 @@ public class TripleTerrainBlock extends EndTerrainBlock { @Override public String getModelPattern(String block) { - System.out.println(block); String name = Registry.BLOCK.getId(this).getPath(); if (block.endsWith("_middle")) { return Patterns.createJson(Patterns.BLOCK_BASE, name + "_top", name + "_top"); diff --git a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java index e33ddf6a..e3261214 100644 --- a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java +++ b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java @@ -72,7 +72,17 @@ public class BetterEndBiomeSource extends BiomeSource { boolean hasVoid = !GeneratorOptions.useNewGenerator() || !GeneratorOptions.noRingVoid(); long i = (long) biomeX * (long) biomeX; long j = (long) biomeZ * (long) biomeZ; - if (hasVoid && i + j <= 65536L) return this.centerBiome; + + long dist = i + j; + if (hasVoid) { + if (dist <= 65536L) return this.centerBiome; + } + else if (dist <= 625L) { + dist += noise.sample(i * 0.2, j * 0.2) * 10; + if (dist <= 625L) { + return this.centerBiome; + } + } if (biomeX == 0 && biomeZ == 0) { mapLand.clearCache(); diff --git a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java index 3a4ab11a..62d7787a 100644 --- a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java +++ b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java @@ -16,6 +16,9 @@ public class GeneratorOptions { private static boolean generateCentralIsland; private static boolean generateObsidianPlatform; private static int endCityFailChance; + public static LayerOptions bigOptions; + public static LayerOptions mediumOptions; + public static LayerOptions smallOptions; public static void init() { biomeSizeLand = Configs.GENERATOR_CONFIG.getInt("biomeMap", "biomeSizeLand", 256); @@ -26,11 +29,14 @@ public class GeneratorOptions { swapOverworldToEnd = Configs.GENERATOR_CONFIG.getBooleanRoot("swapOverworldToEnd", false); changeChorusPlant = Configs.GENERATOR_CONFIG.getBoolean("chorusPlant", "changeChorusPlant", true); removeChorusFromVanillaBiomes = Configs.GENERATOR_CONFIG.getBoolean("chorusPlant", "removeChorusFromVanillaBiomes", true); - newGenerator = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "useNewGenerator", false); + newGenerator = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "useNewGenerator", true); noRingVoid = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "noRingVoid", false); generateCentralIsland = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "generateCentralIsland", false); endCityFailChance = Configs.GENERATOR_CONFIG.getInt("customGenerator", "endCityFailChance", 5); generateObsidianPlatform = Configs.GENERATOR_CONFIG.getBooleanRoot("generateObsidianPlatform", true); + bigOptions = new LayerOptions("customGenerator.layers.bigIslands", Configs.GENERATOR_CONFIG, 300, 200, 70, 10); + mediumOptions = new LayerOptions("customGenerator.layers.mediumIslands", Configs.GENERATOR_CONFIG, 150, 100, 70, 20); + smallOptions = new LayerOptions("customGenerator.layers.smallIslands", Configs.GENERATOR_CONFIG, 60, 50, 70, 30); } public static int getBiomeSizeLand() { diff --git a/src/main/java/ru/betterend/world/generator/IslandLayer.java b/src/main/java/ru/betterend/world/generator/IslandLayer.java index 18edff44..3e890f11 100644 --- a/src/main/java/ru/betterend/world/generator/IslandLayer.java +++ b/src/main/java/ru/betterend/world/generator/IslandLayer.java @@ -23,25 +23,17 @@ public class IslandLayer { private final List positions = new ArrayList(9); private final Map islands = Maps.newHashMap(); private final OpenSimplexNoise density; - private final double distance; - private final float scale; private final int seed; - private final int minY; - private final int maxY; - private final long center; private final boolean hasCentralIsland; private int lastX = Integer.MIN_VALUE; private int lastZ = Integer.MIN_VALUE; + private final LayerOptions options; - public IslandLayer(int seed, double distance, float scale, int center, int heightVariation, boolean hasCentralIsland) { - this.distance = distance; - this.density = new OpenSimplexNoise(seed); - this.scale = scale; - this.seed = seed; - this.minY = center - heightVariation; - this.maxY = center + heightVariation; - this.center = MHelper.floor(1000 / distance); + public IslandLayer(int seed, LayerOptions options, boolean hasCentralIsland) { this.hasCentralIsland = hasCentralIsland; + this.density = new OpenSimplexNoise(seed); + this.options = options; + this.seed = seed; } private int getSeed(int x, int z) { @@ -51,8 +43,8 @@ public class IslandLayer { } public void updatePositions(double x, double z) { - int ix = MHelper.floor(x / distance); - int iz = MHelper.floor(z / distance); + int ix = MHelper.floor(x / options.distance); + int iz = MHelper.floor(z / options.distance); if (lastX != ix || lastZ != iz) { lastX = ix; lastZ = iz; @@ -61,11 +53,11 @@ public class IslandLayer { int px = pox + ix; for (int poz = -1; poz < 2; poz++) { int pz = poz + iz; - if (GeneratorOptions.noRingVoid() || (long) px + (long) pz > center) { + if (GeneratorOptions.noRingVoid() || (long) px + (long) pz > options.centerDist) { RANDOM.setSeed(getSeed(px, pz)); - double posX = (px + RANDOM.nextFloat()) * distance; - double posY = MHelper.randRange(minY, maxY, RANDOM); - double posZ = (pz + RANDOM.nextFloat()) * distance; + double posX = (px + RANDOM.nextFloat()) * options.distance; + double posY = MHelper.randRange(options.minY, options.maxY, RANDOM); + double posZ = (pz + RANDOM.nextFloat()) * options.distance; if (density.eval(posX * 0.01, posZ * 0.01) > 0) { positions.add(new BlockPos(posX, posY, posZ)); } @@ -94,9 +86,9 @@ public class IslandLayer { } private float getRelativeDistance(SDF sdf, BlockPos center, double px, double py, double pz) { - float x = (float) (px - center.getX()) / scale; - float y = (float) (py - center.getY()) / scale; - float z = (float) (pz - center.getZ()) / scale; + float x = (float) (px - center.getX()) / options.scale; + float y = (float) (py - center.getY()) / options.scale; + float z = (float) (pz - center.getZ()) / options.scale; return sdf.getDistance(x, y, z); } diff --git a/src/main/java/ru/betterend/world/generator/LayerOptions.java b/src/main/java/ru/betterend/world/generator/LayerOptions.java new file mode 100644 index 00000000..7995e4fd --- /dev/null +++ b/src/main/java/ru/betterend/world/generator/LayerOptions.java @@ -0,0 +1,46 @@ +package ru.betterend.world.generator; + +import net.minecraft.util.math.MathHelper; +import ru.betterend.config.PathConfig; + +public class LayerOptions { + public final float distance; + public final float scale; + public final float coverage; + public final int center; + public final int heightVariation; + public final int minY; + public final int maxY; + public final long centerDist; + + public LayerOptions(String name, PathConfig config, float distance, float scale, int center, int heightVariation) { + this.distance = clampDistance(config.getFloat(name, "distance[1-8192]", distance)); + this.scale = clampScale(config.getFloat(name, "scale[0.1-1024]", scale)); + this.center = clampCenter(config.getInt(name, "averageHeight[0-255]", center)); + this.heightVariation = clampVariation(config.getInt(name, "heightVariation[0-255]", heightVariation)); + this.coverage = clampCoverage(config.getFloat(name, "coverage[0-1]", 0.5F)); + this.minY = this.center - this.heightVariation; + this.maxY = this.center + this.heightVariation; + this.centerDist = MathHelper.floor(1000 / this.distance); + } + + private float clampDistance(float value) { + return MathHelper.clamp(value, 1, 8192); + } + + private float clampScale(float value) { + return MathHelper.clamp(value, 0.1F, 1024); + } + + private float clampCoverage(float value) { + return MathHelper.clamp(value, 0, 1) * 2 - 1; + } + + private int clampCenter(int value) { + return MathHelper.clamp(value, 0, 255); + } + + private int clampVariation(int value) { + return MathHelper.clamp(value, 0, 255); + } +} diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index fca78431..99773bf0 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -25,9 +25,9 @@ public class TerrainGenerator { public static void initNoise(long seed) { Random random = new Random(seed); - largeIslands = new IslandLayer(random.nextInt(), 300, 200, 70, 10, false); - mediumIslands = new IslandLayer(random.nextInt(), 150, 100, 70, 20, true); - smallIslands = new IslandLayer(random.nextInt(), 60, 50, 70, 30, false); + largeIslands = new IslandLayer(random.nextInt(), GeneratorOptions.bigOptions, false); + mediumIslands = new IslandLayer(random.nextInt(), GeneratorOptions.mediumOptions, true); + smallIslands = new IslandLayer(random.nextInt(), GeneratorOptions.smallOptions, false); noise1 = new OpenSimplexNoise(random.nextInt()); noise2 = new OpenSimplexNoise(random.nextInt()); } From d90e3523129ad9f4fa315c096ae6d05e518f77e0 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 17 Mar 2021 22:47:08 +0300 Subject: [PATCH 357/463] Small fix --- src/main/java/ru/betterend/world/generator/IslandLayer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/world/generator/IslandLayer.java b/src/main/java/ru/betterend/world/generator/IslandLayer.java index 3e890f11..600219b3 100644 --- a/src/main/java/ru/betterend/world/generator/IslandLayer.java +++ b/src/main/java/ru/betterend/world/generator/IslandLayer.java @@ -58,7 +58,7 @@ public class IslandLayer { double posX = (px + RANDOM.nextFloat()) * options.distance; double posY = MHelper.randRange(options.minY, options.maxY, RANDOM); double posZ = (pz + RANDOM.nextFloat()) * options.distance; - if (density.eval(posX * 0.01, posZ * 0.01) > 0) { + if (density.eval(posX * 0.01, posZ * 0.01) > options.coverage) { positions.add(new BlockPos(posX, posY, posZ)); } } From 6bdc2fa7c7edb4242fa960a8a206c36f550ea62a Mon Sep 17 00:00:00 2001 From: Fourmisain <8464472+Fourmisain@users.noreply.github.com> Date: Wed, 17 Mar 2021 20:33:56 +0100 Subject: [PATCH 358/463] fix knockback resistance not being applied --- .../java/ru/betterend/item/EndArmorItem.java | 34 ++++++++++++++++++- .../mixin/common/ArmorItemAccessor.java | 22 ++++++++++++ .../resources/betterend.mixins.common.json | 1 + 3 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java diff --git a/src/main/java/ru/betterend/item/EndArmorItem.java b/src/main/java/ru/betterend/item/EndArmorItem.java index 67bf3031..4d95d2c4 100644 --- a/src/main/java/ru/betterend/item/EndArmorItem.java +++ b/src/main/java/ru/betterend/item/EndArmorItem.java @@ -1,17 +1,49 @@ package ru.betterend.item; +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Multimap; import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.attribute.EntityAttribute; +import net.minecraft.entity.attribute.EntityAttributeModifier; +import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.item.ArmorItem; import net.minecraft.item.ArmorMaterial; import net.minecraft.item.Item; +import ru.betterend.mixin.common.ArmorItemAccessor; import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; +import java.util.UUID; + public class EndArmorItem extends ArmorItem implements Patterned { public EndArmorItem(ArmorMaterial material, EquipmentSlot slot, Item.Settings settings) { super(material, slot, settings); + + addKnockbackResistance((ArmorItemAccessor) this, slot, this.knockbackResistance); } - + + /** Ensures knockback resistance is actually applied */ + private static void addKnockbackResistance(ArmorItemAccessor accessor, EquipmentSlot slot, double knockbackResistance) { + if (knockbackResistance == 0) { + return; + } + + Multimap attributeModifiers = accessor.getAttributeModifiers(); + + // In case Mojang or anyone else decided to fix this + if (attributeModifiers.keys().contains(EntityAttributes.GENERIC_KNOCKBACK_RESISTANCE)) { + return; + } + + UUID uuid = accessor.getModifiers()[slot.getEntitySlotId()]; + + // Rebuild attributeModifiers to include knockback resistance + ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); + builder.putAll(attributeModifiers); + builder.put(EntityAttributes.GENERIC_KNOCKBACK_RESISTANCE, new EntityAttributeModifier(uuid, "Armor knockback resistance", knockbackResistance, EntityAttributeModifier.Operation.ADDITION)); + accessor.setAttributeModifiers(builder.build()); + } + @Override public String getModelPattern(String name) { return Patterns.createJson(Patterns.ITEM_GENERATED, name); diff --git a/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java b/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java new file mode 100644 index 00000000..5c340f88 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java @@ -0,0 +1,22 @@ +package ru.betterend.mixin.common; + +import com.google.common.collect.Multimap; +import net.minecraft.entity.attribute.EntityAttribute; +import net.minecraft.entity.attribute.EntityAttributeModifier; +import net.minecraft.item.ArmorItem; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.UUID; + +@Mixin(ArmorItem.class) +public interface ArmorItemAccessor { + @Accessor("MODIFIERS") + UUID[] getModifiers(); + + @Accessor("attributeModifiers") + Multimap getAttributeModifiers(); + + @Accessor("attributeModifiers") + void setAttributeModifiers(Multimap attributeModifiers); +} diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index 82e04940..6c7deff1 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -4,6 +4,7 @@ "package": "ru.betterend.mixin.common", "compatibilityLevel": "JAVA_8", "mixins": [ + "ArmorItemAccessor", "EnchantmentScreenHandlerMixin", "PlayerAdvancementTrackerMixin", "CraftingScreenHandlerMixin", From b69ce7f3b2dc459c63949cafde3386c0950003f8 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 17 Mar 2021 23:00:06 +0300 Subject: [PATCH 359/463] Music tracker null pointer check --- .../ru/betterend/mixin/client/MusicTrackerMixin.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java b/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java index afae2d88..fdd8b5ec 100644 --- a/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java @@ -42,7 +42,7 @@ public class MusicTrackerMixin { public void be_onTick(CallbackInfo info) { if (ClientOptions.blendBiomeMusic()) { MusicSound musicSound = client.getMusicType(); - if (volume > 0 && beIsInEnd() && beShouldChangeSound(musicSound)) { + if (be_checkNullSound(musicSound) && volume > 0 && be_isInEnd() && be_shouldChangeSound(musicSound)) { if (volume > 0) { if (srcVolume < 0) { srcVolume = current.getVolume(); @@ -81,14 +81,18 @@ public class MusicTrackerMixin { } } - private boolean beIsInEnd() { + private boolean be_isInEnd() { return client.world != null && client.world.getRegistryKey().equals(World.END); } - private boolean beShouldChangeSound(MusicSound musicSound) { + private boolean be_shouldChangeSound(MusicSound musicSound) { return current != null && !musicSound.getSound().getId().equals(this.current.getId()) && musicSound.shouldReplaceCurrentMusic(); } + private boolean be_checkNullSound(MusicSound musicSound) { + return musicSound != null && musicSound.getSound() != null; + } + @Shadow public void play(MusicSound type) {} } From a89b2d7d1821eb2add34ef28c0d2a4132e1748ec Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 17 Mar 2021 23:14:39 +0300 Subject: [PATCH 360/463] Biome map size clamp --- .../java/ru/betterend/world/generator/GeneratorOptions.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java index 62d7787a..5383c5ba 100644 --- a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java +++ b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java @@ -1,5 +1,6 @@ package ru.betterend.world.generator; +import net.minecraft.util.math.MathHelper; import ru.betterend.config.Configs; public class GeneratorOptions { @@ -40,11 +41,11 @@ public class GeneratorOptions { } public static int getBiomeSizeLand() { - return biomeSizeLand; + return MathHelper.clamp(biomeSizeLand, 1, 8192); } public static int getBiomeSizeVoid() { - return biomeSizeVoid; + return MathHelper.clamp(biomeSizeVoid, 1, 8192); } public static boolean hasPortal() { From abefc062ee81080e85324028ea77a09e2f9bf994 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 18 Mar 2021 01:42:11 +0300 Subject: [PATCH 361/463] Small fixes --- .../ru/betterend/blocks/EndPortalBlock.java | 2 +- .../world/generator/LayerOptions.java | 2 +- .../blockstates/end_portal_block.json | 8 ++------ .../materialmaps/block/end_portal_block.json | 3 +++ .../{end_portal_ax.json => end_portal.json} | 4 ++-- .../betterend/models/block/end_portal_az.json | 16 ---------------- .../models/block/end_portal_grey.json | 16 ++++++++++++++++ .../betterend/textures/block/end_portal.png | Bin 10676 -> 19602 bytes .../textures/block/end_portal_grey.png | Bin 0 -> 13563 bytes 9 files changed, 25 insertions(+), 26 deletions(-) create mode 100644 src/main/resources/assets/betterend/materialmaps/block/end_portal_block.json rename src/main/resources/assets/betterend/models/block/{end_portal_ax.json => end_portal.json} (53%) delete mode 100644 src/main/resources/assets/betterend/models/block/end_portal_az.json create mode 100644 src/main/resources/assets/betterend/models/block/end_portal_grey.json create mode 100644 src/main/resources/assets/betterend/textures/block/end_portal_grey.png diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index f13b0b0d..0af2e3af 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -43,7 +43,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable public static final IntProperty PORTAL = BlockProperties.PORTAL; public EndPortalBlock() { - super(FabricBlockSettings.copyOf(Blocks.NETHER_PORTAL).resistance(Blocks.BEDROCK.getBlastResistance()).luminance(state -> 12)); + super(FabricBlockSettings.copyOf(Blocks.NETHER_PORTAL).resistance(Blocks.BEDROCK.getBlastResistance()).luminance(15)); } @Override diff --git a/src/main/java/ru/betterend/world/generator/LayerOptions.java b/src/main/java/ru/betterend/world/generator/LayerOptions.java index 7995e4fd..ede1ecd9 100644 --- a/src/main/java/ru/betterend/world/generator/LayerOptions.java +++ b/src/main/java/ru/betterend/world/generator/LayerOptions.java @@ -33,7 +33,7 @@ public class LayerOptions { } private float clampCoverage(float value) { - return MathHelper.clamp(value, 0, 1) * 2 - 1; + return 0.9999F - MathHelper.clamp(value, 0, 1) * 2; } private int clampCenter(int value) { diff --git a/src/main/resources/assets/betterend/blockstates/end_portal_block.json b/src/main/resources/assets/betterend/blockstates/end_portal_block.json index 439c2b9d..a9d558f3 100644 --- a/src/main/resources/assets/betterend/blockstates/end_portal_block.json +++ b/src/main/resources/assets/betterend/blockstates/end_portal_block.json @@ -1,10 +1,6 @@ { "variants": { - "axis=x": { - "model": "betterend:block/end_portal_ax" - }, - "axis=z": { - "model": "betterend:block/end_portal_az" - } + "axis=x": { "model": "betterend:block/end_portal" }, + "axis=z": { "model": "betterend:block/end_portal", "y": 90 } } } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/end_portal_block.json b/src/main/resources/assets/betterend/materialmaps/block/end_portal_block.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/end_portal_block.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/models/block/end_portal_ax.json b/src/main/resources/assets/betterend/models/block/end_portal.json similarity index 53% rename from src/main/resources/assets/betterend/models/block/end_portal_ax.json rename to src/main/resources/assets/betterend/models/block/end_portal.json index 8448f5c0..8cdabc6d 100644 --- a/src/main/resources/assets/betterend/models/block/end_portal_ax.json +++ b/src/main/resources/assets/betterend/models/block/end_portal.json @@ -8,8 +8,8 @@ "from": [ 0, 0, 6 ], "to": [ 16, 16, 10 ], "faces": { - "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#portal" }, - "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#portal" } + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#portal", "tintindex": 0 }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#portal", "tintindex": 0 } } } ] diff --git a/src/main/resources/assets/betterend/models/block/end_portal_az.json b/src/main/resources/assets/betterend/models/block/end_portal_az.json deleted file mode 100644 index 35c5f76a..00000000 --- a/src/main/resources/assets/betterend/models/block/end_portal_az.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "textures": { - "particle": "betterend:block/end_portal", - "portal": "betterend:block/end_portal" - }, - "elements": [ - { - "from": [ 6, 0, 0 ], - "to": [ 10, 16, 16 ], - "faces": { - "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#portal" }, - "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#portal" } - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/end_portal_grey.json b/src/main/resources/assets/betterend/models/block/end_portal_grey.json new file mode 100644 index 00000000..41f66eab --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/end_portal_grey.json @@ -0,0 +1,16 @@ +{ + "textures": { + "particle": "betterend:block/end_portal_grey", + "portal": "betterend:block/end_portal_grey" + }, + "elements": [ + { + "from": [ 0, 0, 6 ], + "to": [ 16, 16, 10 ], + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#portal", "tintindex": 0 }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#portal", "tintindex": 0 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/end_portal.png b/src/main/resources/assets/betterend/textures/block/end_portal.png index 2e168bd16cf8c69bbd06786c2ab24c4eaff839bd..4c79d3e2779081b7825ab6a73a98535ca19d9722 100644 GIT binary patch literal 19602 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 literal 10676 zcmV;lDNELgP)yl4*qVdM@VkIh{#*y3CQTpe^Zf`_{k8kck3 zs=;K%PHDVht4yyL5Po9iR0{@>32N;dgDHiKu;2^`!NxQtvl7UHPykiNw%JYqpzH#> z{^WIgBT!ly07kI@3C$$%@V(ts)Iw>%UU|BbyJC9+bfV9Lb%K76 zZ}UHlxRFcZ%$v&5)J74LqKvNE2|6>u-MW%msR^WwFt$c6$A-S?nT zw{Pao*g2QQVTcx0Ohg{oRRRn&A7Z5s&uO|?|G&WzLj`KAHRA5zBWL}dE+_rouBZLp z2O4a*dzW}-Kisd`-u6Fu+SZ{yO}2P*=U==YFTtUHREq@>aCpGE40z;;^BK_23D^MY z$F}~qL=)|XE;byJD}{c8Ov}s2Fmcos0Pbo0ZE4)lbS4;06*?b zE<<22bU45O0D`C;2WrJZS-DFKvBcLHNO2RiPs}Jl-lPq?^!aASIoqAo)DjzYhRkRq zK~;{xodlEtCjcy4&_wjngEL@&NGm6mRRRvsq`nduA6T%fD^`NCik4c*QW-e!ops)r z0E(}4i(MF4*AAHy1jwDUf&gJ>i14=(j9L;?-v(oCW%N6m!PGG{P)nWqO#MbX0Kq^t z+T0i8%{zY5%BeLVQzvIS04r(2S@dmALejl6qpy8T5=(QQzky;#$VMRG8gbL$)p50c z?x1h{tbu!M*IoO|qxShFV-NcIPwve=FOAq|c9vW7;t4b2u<4aEw!i-LA-`hAF$-8Q z{96OShaEe%#bXXe05XBN^TW&LfDr(K-=22VY@FG(-kyHc00DCx$P6k#ENt8fWW7G+ zaNfm)#ISV)@Q49g3c`^9Y;R3HVr*n*#|{$*3Xh`AZoy&4PDv)}#P74P5|ji6z~W)^ zl14k@TxJAJsskcTcyk!3S9P069Wtv!(AK;Bje&H~83%T0g4)z8rV<)32MQE<#F3rA zRkP~MQ9&I`R8q$e=n^1QW#>!+f_T@=yg%<$7Se$x%BR5v-Ek^tlK9lTZE44PY++~vg3B2IPF`zJJ7kTS=Z>tPy5D? zp0LY;$N)HZf?s?4qyZ8HJF#_gx^sWhH85S>?Fo?GsVV0ESLVU?r4oQSG!=Hh{1# zURIYGp_w#s62+K=9i!DAfW-`|ninO>B}fAdl)xi*`psF&vv{Wj>>4yDM6z<$EI`-h zAa!QZ(&LtqdpW(1K(eR|0ZJ^K0OC$LR$A}{#3m63LoNVt1eid|DZ%tEAScB^latP> zSFF_5vRl?hT16lRf&kD=P#*PbUf6k8d!2;QVDLq%$I8Z@r@%EOwfeohs_Rn zT)Qlo1o)Dm|BK-_5-2>*SaUL?bH{1e;)6Nc^wlRa_|Qe)neEjr;ol25PJa7n5gaor zuv-BHfZk)`9p07o+?Pt>;l5NqL1UJE?^UWm@V64Uj9yx6&LsfCNl1xIaLJ4qV=!>; z-lEPOhRmZJ5ma@H0SP#}YF$xf0w)Gd#Dw~xi~2BCNh-tL*G`;W#zsLBvwRn@?8YGW ze}~m9dZtSNlUM}K+tA?EO5Uss5{Rs2`((oz5CG8uA0-6T;XsBmxH^4t#caFs8#`=S zRzg|teF+3mdQS(`PPO@-sbA-$4r&0D{S}~sqlmjQfCQu)j#_COMruSri74fDE)&3x z(wus)!O<5fZTmZ!cXM_a9d#FBoxj9 zAPC2mTQaUu~bBF(1m&%ou~)ieZvyI6|9p$cR4d zni&BbgWsnX0YE05v8!EW2h>h$qw4QiFN>@tyN(NANBt!OJph0Xn!<8Y)iu5gM{6`` z1pYozEDFk2L$!`O^6uJrEHcW%l`RTqO{0J;TftT=+^^FVX39%;WG2d{QO+fm

    QUh-xE&fJ>WF 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 literal 0 HcmV?d00001 From 46c6e9b936342155b997866e6ffd3742693c850e Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 18 Mar 2021 02:42:18 +0300 Subject: [PATCH 362/463] Stack overflow fix --- .../betterend/mixin/common/WeightedBiomePickerAccessor.java | 5 +++++ src/main/java/ru/betterend/world/biome/land/EndBiome.java | 6 ++++-- 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 src/main/java/ru/betterend/mixin/common/WeightedBiomePickerAccessor.java diff --git a/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerAccessor.java b/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerAccessor.java new file mode 100644 index 00000000..f4fc4937 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerAccessor.java @@ -0,0 +1,5 @@ +package ru.betterend.mixin.common; + +public interface WeightedBiomePickerAccessor { + +} diff --git a/src/main/java/ru/betterend/world/biome/land/EndBiome.java b/src/main/java/ru/betterend/world/biome/land/EndBiome.java index a1266cc3..4fb10772 100644 --- a/src/main/java/ru/betterend/world/biome/land/EndBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/EndBiome.java @@ -185,9 +185,11 @@ public class EndBiome { public void updateActualBiomes(Registry biomeRegistry) { subbiomes.forEach((sub) -> { - sub.updateActualBiomes(biomeRegistry); + if (sub != this) { + sub.updateActualBiomes(biomeRegistry); + } }); - if (edge != null) { + if (edge != null && edge != this) { edge.updateActualBiomes(biomeRegistry); } this.actualBiome = biomeRegistry.get(mcID); From 3bc88af0199d437696a16e2ff871d72d3e10d2ab Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 18 Mar 2021 03:36:55 +0300 Subject: [PATCH 363/463] BiomePicker mixin --- .../ru/betterend/interfaces/IBiomeList.java | 10 +++++ .../common/WeightedBiomePickerAccessor.java | 5 --- .../common/WeightedBiomePickerMixin.java | 38 +++++++++++++++++++ .../java/ru/betterend/registry/EndBiomes.java | 29 ++++++-------- .../world/generator/BELayerRandomSource.java | 20 ---------- .../resources/betterend.mixins.common.json | 3 +- 6 files changed, 62 insertions(+), 43 deletions(-) create mode 100644 src/main/java/ru/betterend/interfaces/IBiomeList.java delete mode 100644 src/main/java/ru/betterend/mixin/common/WeightedBiomePickerAccessor.java create mode 100644 src/main/java/ru/betterend/mixin/common/WeightedBiomePickerMixin.java delete mode 100644 src/main/java/ru/betterend/world/generator/BELayerRandomSource.java diff --git a/src/main/java/ru/betterend/interfaces/IBiomeList.java b/src/main/java/ru/betterend/interfaces/IBiomeList.java new file mode 100644 index 00000000..4db7b758 --- /dev/null +++ b/src/main/java/ru/betterend/interfaces/IBiomeList.java @@ -0,0 +1,10 @@ +package ru.betterend.interfaces; + +import java.util.List; + +import net.minecraft.util.registry.RegistryKey; +import net.minecraft.world.biome.Biome; + +public interface IBiomeList { + public List> getBiomes(); +} diff --git a/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerAccessor.java b/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerAccessor.java deleted file mode 100644 index f4fc4937..00000000 --- a/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerAccessor.java +++ /dev/null @@ -1,5 +0,0 @@ -package ru.betterend.mixin.common; - -public interface WeightedBiomePickerAccessor { - -} diff --git a/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerMixin.java b/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerMixin.java new file mode 100644 index 00000000..ecfe1b63 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerMixin.java @@ -0,0 +1,38 @@ +package ru.betterend.mixin.common; + +import java.util.List; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.google.common.collect.Lists; + +import net.fabricmc.fabric.impl.biome.InternalBiomeData; +import net.fabricmc.fabric.impl.biome.WeightedBiomePicker; +import net.minecraft.util.registry.RegistryKey; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.BiomeKeys; +import ru.betterend.interfaces.IBiomeList; + +@Mixin(value = WeightedBiomePicker.class, remap = false) +public class WeightedBiomePickerMixin implements IBiomeList { + private List> biomes = Lists.newArrayList(); + + @Inject(method = "addBiome", at = @At("TAIL")) + private void be_addBiome(final RegistryKey biome, final double weight, CallbackInfo info) { + if (be_isCorrectPicker((WeightedBiomePicker) (Object) this)) { + biomes.add(biome); + } + } + + @Override + public List> getBiomes() { + return biomes; + } + + private boolean be_isCorrectPicker(WeightedBiomePicker picker) { + return picker == InternalBiomeData.getEndBiomesMap().get(BiomeKeys.SMALL_END_ISLANDS) || picker == InternalBiomeData.getEndBarrensMap().get(BiomeKeys.END_BARRENS); + } +} diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index 04f177d8..3def7d36 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -1,6 +1,7 @@ package ru.betterend.registry; import java.io.InputStream; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -26,10 +27,10 @@ import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome.Category; import net.minecraft.world.biome.BiomeKeys; -import net.minecraft.world.biome.layer.util.LayerRandomnessSource; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; import ru.betterend.integration.Integrations; +import ru.betterend.interfaces.IBiomeList; import ru.betterend.util.JsonFactory; import ru.betterend.world.biome.air.BiomeIceStarfield; import ru.betterend.world.biome.cave.EmptyAuroraCaveBiome; @@ -55,7 +56,6 @@ import ru.betterend.world.biome.land.PaintedMountainsBiome; import ru.betterend.world.biome.land.ShadowForestBiome; import ru.betterend.world.biome.land.SulphurSpringsBiome; import ru.betterend.world.biome.land.UmbrellaJungleBiome; -import ru.betterend.world.generator.BELayerRandomSource; import ru.betterend.world.generator.BiomePicker; import ru.betterend.world.generator.BiomeType; @@ -181,21 +181,11 @@ public class EndBiomes { } private static void loadFabricAPIBiomes() { - WeightedBiomePicker picker = InternalBiomeData.getEndBiomesMap().get(BiomeKeys.SMALL_END_ISLANDS); - LayerRandomnessSource random = new BELayerRandomSource(); - if (picker != null) { - for (int i = 0; i < 1000; i++) { - RegistryKey key = picker.pickRandom(random); - FABRIC_VOID.add(key.getValue()); - } - } - picker = InternalBiomeData.getEndBiomesMap().get(BiomeKeys.END_BARRENS); - if (picker != null) { - for (int i = 0; i < 1000; i++) { - RegistryKey key = picker.pickRandom(random); - FABRIC_VOID.add(key.getValue()); - } - } + List> biomes = Lists.newArrayList(); + biomes.addAll(getBiomes(InternalBiomeData.getEndBiomesMap().get(BiomeKeys.SMALL_END_ISLANDS))); + biomes.addAll(getBiomes(InternalBiomeData.getEndBarrensMap().get(BiomeKeys.END_BARRENS))); + biomes.forEach((key) -> FABRIC_VOID.add(key.getValue())); + if (BetterEnd.isDevEnvironment()) { System.out.println("=================================="); System.out.println("Added void biomes from Fabric API:"); @@ -206,6 +196,11 @@ public class EndBiomes { } } + private static List> getBiomes(WeightedBiomePicker picker) { + IBiomeList biomeList = (IBiomeList) (Object) picker; + return biomeList == null ? Collections.emptyList() : biomeList.getBiomes(); + } + private static JsonObject loadJsonConfig(String namespace) { InputStream inputstream = EndBiomes.class.getResourceAsStream("/data/" + namespace + "/end_biome_properties.json"); if (inputstream != null) { diff --git a/src/main/java/ru/betterend/world/generator/BELayerRandomSource.java b/src/main/java/ru/betterend/world/generator/BELayerRandomSource.java deleted file mode 100644 index fada1a7b..00000000 --- a/src/main/java/ru/betterend/world/generator/BELayerRandomSource.java +++ /dev/null @@ -1,20 +0,0 @@ -package ru.betterend.world.generator; - -import java.util.Random; - -import net.minecraft.util.math.noise.PerlinNoiseSampler; -import net.minecraft.world.biome.layer.util.LayerRandomnessSource; - -public class BELayerRandomSource implements LayerRandomnessSource { - private Random random = new Random(0); - - @Override - public int nextInt(int bound) { - return random.nextInt(bound); - } - - @Override - public PerlinNoiseSampler getNoiseSampler() { - return null; - } -} diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index 82e04940..4e2de0ee 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -9,6 +9,7 @@ "CraftingScreenHandlerMixin", "GenerationSettingsAccessor", "NoiseChunkGeneratorMixin", + "WeightedBiomePickerMixin", "AnvilScreenHandlerMixin", "ChorusPlantFeatureMixin", "ServerPlayerEntityMixin", @@ -19,8 +20,8 @@ "RecipeManagerAccessor", "EndSpikeFeatureMixin", "MinecraftServerMixin", - "TagGroupLoaderMixin", "EndermanEntityMixin", + "TagGroupLoaderMixin", "AbstractBlockMixin", "DimensionTypeMixin", "PlayerManagerMixin", From c4d290f94960ccc6adbb651248de6627dbba97fc Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 18 Mar 2021 04:31:32 +0300 Subject: [PATCH 364/463] Vanilla end structures fix --- .../mixin/common/EndPortalFeatureMixin.java | 9 +++ .../mixin/common/EndSpikeFeatureMixin.java | 69 +++++++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java index 32841385..bd8fe824 100644 --- a/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java @@ -5,9 +5,11 @@ import java.util.Random; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.Heightmap.Type; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -20,6 +22,13 @@ public class EndPortalFeatureMixin { private void bePortalGenerate(StructureWorldAccess structureWorldAccess, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, DefaultFeatureConfig defaultFeatureConfig, CallbackInfoReturnable info) { if (!GeneratorOptions.hasPortal()) { info.setReturnValue(false); + info.cancel(); } } + + @ModifyVariable(method = "generate", ordinal = 0, at = @At("HEAD")) + private BlockPos be_setPosOnGround(BlockPos blockPos, StructureWorldAccess structureWorldAccess) { + int y = structureWorldAccess.getChunk(blockPos).sampleHeightmap(Type.WORLD_SURFACE, blockPos.getX() & 15, blockPos.getZ() & 15); + return new BlockPos(blockPos.getX(), y, blockPos.getZ()); + } } diff --git a/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java index 662e3ef4..220a93c3 100644 --- a/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java @@ -5,13 +5,24 @@ import java.util.Random; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.PaneBlock; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.decoration.EndCrystalEntity; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.Heightmap.Type; +import net.minecraft.world.ServerWorldAccess; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.EndSpikeFeature; import net.minecraft.world.gen.feature.EndSpikeFeatureConfig; +import ru.betterend.util.BlocksHelper; import ru.betterend.world.generator.GeneratorOptions; @Mixin(EndSpikeFeature.class) @@ -22,4 +33,62 @@ public class EndSpikeFeatureMixin { info.setReturnValue(false); } } + + @Inject(method = "generateSpike", at = @At("HEAD"), cancellable = true) + private void be_generateSpike(ServerWorldAccess world, Random random, EndSpikeFeatureConfig config, EndSpikeFeature.Spike spike, CallbackInfo info) { + int x = spike.getCenterX(); + int z = spike.getCenterZ(); + int radius = spike.getRadius(); + int minY = world.getChunk(spike.getCenterX() >> 4, spike.getCenterZ() >> 4).sampleHeightmap(Type.WORLD_SURFACE, spike.getCenterX() & 15, spike.getCenterZ() & 15) - 15; + int maxY = minY + spike.getHeight() - 50; + + int r2 = radius * radius + 1; + Mutable mut = new Mutable(); + for (int px = -radius; px <= radius; px++) { + mut.setX(x + px); + int x2 = px * px; + for (int pz = -radius; pz <= radius; pz++) { + mut.setZ(z + pz); + int z2 = pz * pz; + if (x2 + z2 <= r2) { + for (int py = minY; py < maxY; py++) { + mut.setY(py); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, Blocks.OBSIDIAN); + } + } + } + } + } + mut.setX(x); + mut.setZ(z); + mut.setY(maxY); + BlocksHelper.setWithoutUpdate(world, mut, Blocks.BEDROCK); + + EndCrystalEntity crystal = EntityType.END_CRYSTAL.create(world.toServerWorld()); + crystal.setBeamTarget(config.getPos()); + crystal.setInvulnerable(config.isCrystalInvulnerable()); + crystal.refreshPositionAndAngles(x + 0.5D, maxY + 1, z + 0.5D, random.nextFloat() * 360.0F, 0.0F); + world.spawnEntity(crystal); + + if (spike.isGuarded()) { + for (int px = -2; px <= 2; ++px) { + boolean bl = MathHelper.abs(px) == 2; + for (int pz = -2; pz <= 2; ++pz) { + boolean bl2 = MathHelper.abs(pz) == 2; + for (int py = 0; py <= 3; ++py) { + boolean bl3 = py == 3; + if (bl || bl2 || bl3) { + boolean bl4 = px == -2 || px == 2 || bl3; + boolean bl5 = pz == -2 || pz == 2 || bl3; + BlockState blockState = (BlockState) ((BlockState) ((BlockState) ((BlockState) Blocks.IRON_BARS.getDefaultState().with(PaneBlock.NORTH, bl4 && pz != -2)).with(PaneBlock.SOUTH, bl4 && pz != 2)).with(PaneBlock.WEST, bl5 && px != -2)).with(PaneBlock.EAST, bl5 && px != 2); + BlocksHelper.setWithoutUpdate(world, mut.set(spike.getCenterX() + px, maxY + py, spike.getCenterZ() + pz), blockState); + } + } + } + } + } + + info.cancel(); + } } From 47ddc3a07c5d96a06e02dc9ef1acd2727f8f540d Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 18 Mar 2021 04:49:18 +0300 Subject: [PATCH 365/463] Separate central island from others --- .../java/ru/betterend/util/DataFixerUtil.java | 2 +- .../world/generator/GeneratorOptions.java | 6 +++--- .../world/generator/IslandLayer.java | 20 +++++++++++++++---- .../world/generator/LayerOptions.java | 4 +++- .../world/generator/TerrainGenerator.java | 6 +++--- 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/src/main/java/ru/betterend/util/DataFixerUtil.java b/src/main/java/ru/betterend/util/DataFixerUtil.java index d9885a2e..2d864e2a 100644 --- a/src/main/java/ru/betterend/util/DataFixerUtil.java +++ b/src/main/java/ru/betterend/util/DataFixerUtil.java @@ -71,7 +71,7 @@ public class DataFixerUtil { }); } - private static void addFix(String result, String... names) { + protected static void addFix(String result, String... names) { for (String name: names) { REPLACEMENT.put(name, result); } diff --git a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java index 5383c5ba..cdfec463 100644 --- a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java +++ b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java @@ -35,9 +35,9 @@ public class GeneratorOptions { generateCentralIsland = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "generateCentralIsland", false); endCityFailChance = Configs.GENERATOR_CONFIG.getInt("customGenerator", "endCityFailChance", 5); generateObsidianPlatform = Configs.GENERATOR_CONFIG.getBooleanRoot("generateObsidianPlatform", true); - bigOptions = new LayerOptions("customGenerator.layers.bigIslands", Configs.GENERATOR_CONFIG, 300, 200, 70, 10); - mediumOptions = new LayerOptions("customGenerator.layers.mediumIslands", Configs.GENERATOR_CONFIG, 150, 100, 70, 20); - smallOptions = new LayerOptions("customGenerator.layers.smallIslands", Configs.GENERATOR_CONFIG, 60, 50, 70, 30); + bigOptions = new LayerOptions("customGenerator.layers.bigIslands", Configs.GENERATOR_CONFIG, 300, 200, 70, 10, false); + mediumOptions = new LayerOptions("customGenerator.layers.mediumIslands", Configs.GENERATOR_CONFIG, 150, 100, 70, 20, true); + smallOptions = new LayerOptions("customGenerator.layers.smallIslands", Configs.GENERATOR_CONFIG, 60, 50, 70, 30, false); } public static int getBiomeSizeLand() { diff --git a/src/main/java/ru/betterend/world/generator/IslandLayer.java b/src/main/java/ru/betterend/world/generator/IslandLayer.java index 600219b3..a5fff6e2 100644 --- a/src/main/java/ru/betterend/world/generator/IslandLayer.java +++ b/src/main/java/ru/betterend/world/generator/IslandLayer.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Map; import java.util.Random; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; import net.minecraft.util.math.BlockPos; @@ -24,13 +25,11 @@ public class IslandLayer { private final Map islands = Maps.newHashMap(); private final OpenSimplexNoise density; private final int seed; - private final boolean hasCentralIsland; private int lastX = Integer.MIN_VALUE; private int lastZ = Integer.MIN_VALUE; private final LayerOptions options; - public IslandLayer(int seed, LayerOptions options, boolean hasCentralIsland) { - this.hasCentralIsland = hasCentralIsland; + public IslandLayer(int seed, LayerOptions options) { this.density = new OpenSimplexNoise(seed); this.options = options; this.seed = seed; @@ -43,8 +42,10 @@ public class IslandLayer { } public void updatePositions(double x, double z) { + int ix = MHelper.floor(x / options.distance); int iz = MHelper.floor(z / options.distance); + if (lastX != ix || lastZ != iz) { lastX = ix; lastZ = iz; @@ -64,7 +65,18 @@ public class IslandLayer { } } } - if (hasCentralIsland && GeneratorOptions.hasCentralIsland() && ix < 2 && iz < 2 && ix > -2 && iz > -2) { + } + + if (GeneratorOptions.hasCentralIsland() && ix < 4 && iz < 4 && ix > -4 && iz > -4) { + List remove = Lists.newArrayList(); + positions.forEach((pos) -> { + int d = pos.getX() * pos.getX() + pos.getZ() * pos.getZ(); + if (d < 12544) { + remove.add(pos); + } + }); + positions.removeAll(remove); + if (options.hasCentralIsland) { positions.add(new BlockPos(0, 64, 0)); } } diff --git a/src/main/java/ru/betterend/world/generator/LayerOptions.java b/src/main/java/ru/betterend/world/generator/LayerOptions.java index ede1ecd9..8bb35716 100644 --- a/src/main/java/ru/betterend/world/generator/LayerOptions.java +++ b/src/main/java/ru/betterend/world/generator/LayerOptions.java @@ -12,8 +12,9 @@ public class LayerOptions { public final int minY; public final int maxY; public final long centerDist; + public final boolean hasCentralIsland; - public LayerOptions(String name, PathConfig config, float distance, float scale, int center, int heightVariation) { + public LayerOptions(String name, PathConfig config, float distance, float scale, int center, int heightVariation, boolean hasCentral) { this.distance = clampDistance(config.getFloat(name, "distance[1-8192]", distance)); this.scale = clampScale(config.getFloat(name, "scale[0.1-1024]", scale)); this.center = clampCenter(config.getInt(name, "averageHeight[0-255]", center)); @@ -22,6 +23,7 @@ public class LayerOptions { this.minY = this.center - this.heightVariation; this.maxY = this.center + this.heightVariation; this.centerDist = MathHelper.floor(1000 / this.distance); + this.hasCentralIsland = config.getBoolean(name, "hasCentralIsland", hasCentral); } private float clampDistance(float value) { diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index 99773bf0..e055fdaa 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -25,9 +25,9 @@ public class TerrainGenerator { public static void initNoise(long seed) { Random random = new Random(seed); - largeIslands = new IslandLayer(random.nextInt(), GeneratorOptions.bigOptions, false); - mediumIslands = new IslandLayer(random.nextInt(), GeneratorOptions.mediumOptions, true); - smallIslands = new IslandLayer(random.nextInt(), GeneratorOptions.smallOptions, false); + largeIslands = new IslandLayer(random.nextInt(), GeneratorOptions.bigOptions); + mediumIslands = new IslandLayer(random.nextInt(), GeneratorOptions.mediumOptions); + smallIslands = new IslandLayer(random.nextInt(), GeneratorOptions.smallOptions); noise1 = new OpenSimplexNoise(random.nextInt()); noise2 = new OpenSimplexNoise(random.nextInt()); } From 2f2b6dc654d7bb79c5dd1343c2bd23ba7aa650e4 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 18 Mar 2021 15:05:37 +0300 Subject: [PATCH 366/463] Set spawn point option --- .../mixin/common/ServerWorldMixin.java | 15 ++++++++++++++- .../world/generator/GeneratorOptions.java | 17 +++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java b/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java index afecf839..35a1f5e2 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java @@ -9,6 +9,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.metadata.ModMetadata; @@ -17,6 +18,7 @@ import net.minecraft.nbt.NbtIo; import net.minecraft.server.MinecraftServer; import net.minecraft.server.WorldGenerationProgressListener; import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.World; import net.minecraft.world.dimension.DimensionType; @@ -26,6 +28,7 @@ import net.minecraft.world.level.ServerWorldProperties; import net.minecraft.world.level.storage.LevelStorage; import ru.betterend.BetterEnd; import ru.betterend.util.DataFixerUtil; +import ru.betterend.world.generator.GeneratorOptions; @Mixin(ServerWorld.class) public class ServerWorldMixin { @@ -56,7 +59,17 @@ public class ServerWorldMixin { be_writeDataFile(beData, version); } } - + + @Inject(method = "getSpawnPos", at = @At("HEAD"), cancellable = true) + private void be_getSpawnPos(CallbackInfoReturnable info) { + if (GeneratorOptions.changeSpawn()) { + if (((ServerWorld) (Object) this).getRegistryKey() == World.END) { + info.setReturnValue(GeneratorOptions.getSpawn()); + info.cancel(); + } + } + } + private void be_writeDataFile(File file, String version) { CompoundTag root = new CompoundTag(); root.putString("version", version); diff --git a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java index cdfec463..7e5cc0ee 100644 --- a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java +++ b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java @@ -1,5 +1,6 @@ package ru.betterend.world.generator; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import ru.betterend.config.Configs; @@ -20,6 +21,8 @@ public class GeneratorOptions { public static LayerOptions bigOptions; public static LayerOptions mediumOptions; public static LayerOptions smallOptions; + private static boolean changeSpawn; + private static BlockPos spawn; public static void init() { biomeSizeLand = Configs.GENERATOR_CONFIG.getInt("biomeMap", "biomeSizeLand", 256); @@ -38,6 +41,12 @@ public class GeneratorOptions { bigOptions = new LayerOptions("customGenerator.layers.bigIslands", Configs.GENERATOR_CONFIG, 300, 200, 70, 10, false); mediumOptions = new LayerOptions("customGenerator.layers.mediumIslands", Configs.GENERATOR_CONFIG, 150, 100, 70, 20, true); smallOptions = new LayerOptions("customGenerator.layers.smallIslands", Configs.GENERATOR_CONFIG, 60, 50, 70, 30, false); + changeSpawn = Configs.GENERATOR_CONFIG.getBoolean("spawn", "changeSpawn", false); + spawn = new BlockPos( + Configs.GENERATOR_CONFIG.getInt("spawn.point", "x", 20), + Configs.GENERATOR_CONFIG.getInt("spawn.point", "y", 65), + Configs.GENERATOR_CONFIG.getInt("spawn.point", "z", 0) + ); } public static int getBiomeSizeLand() { @@ -91,4 +100,12 @@ public class GeneratorOptions { public static int getEndCityFailChance() { return endCityFailChance; } + + public static boolean changeSpawn() { + return changeSpawn; + } + + public static BlockPos getSpawn() { + return spawn; + } } From 778977a869fdc8f4ccd4827db4f91a27a7fa7f06 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 18 Mar 2021 16:53:25 +0300 Subject: [PATCH 367/463] Silk moth AI upgrade, silk harvesting, hives --- .../betterend/blocks/SilkMothHiveBlock.java | 114 ++++++++++++++++++ .../betterend/blocks/SilkMothNestBlock.java | 34 +++++- .../ru/betterend/entity/SilkMothEntity.java | 47 ++++++-- .../ru/betterend/recipe/CraftingRecipes.java | 2 + .../java/ru/betterend/registry/EndBlocks.java | 4 +- .../ru/betterend/registry/EndEntities.java | 2 +- .../java/ru/betterend/registry/EndItems.java | 1 + .../betterend/blockstates/silk_moth_hive.json | 20 +++ .../models/block/silk_moth_hive.json | 12 ++ .../models/block/silk_moth_hive_silk.json | 12 ++ .../betterend/models/item/silk_moth_hive.json | 3 + .../textures/block/moth_hive_front.png | Bin 0 -> 311 bytes .../textures/block/moth_hive_front_silk.png | Bin 0 -> 319 bytes .../textures/block/moth_hive_side.png | Bin 0 -> 269 bytes .../textures/item/silk_moth_matrix.png | Bin 0 -> 424 bytes 15 files changed, 237 insertions(+), 14 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java create mode 100644 src/main/resources/assets/betterend/blockstates/silk_moth_hive.json create mode 100644 src/main/resources/assets/betterend/models/block/silk_moth_hive.json create mode 100644 src/main/resources/assets/betterend/models/block/silk_moth_hive_silk.json create mode 100644 src/main/resources/assets/betterend/models/item/silk_moth_hive.json create mode 100644 src/main/resources/assets/betterend/textures/block/moth_hive_front.png create mode 100644 src/main/resources/assets/betterend/textures/block/moth_hive_front_silk.png create mode 100644 src/main/resources/assets/betterend/textures/block/moth_hive_side.png create mode 100644 src/main/resources/assets/betterend/textures/item/silk_moth_matrix.png diff --git a/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java b/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java new file mode 100644 index 00000000..a2cc925e --- /dev/null +++ b/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java @@ -0,0 +1,114 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Material; +import net.minecraft.entity.ItemEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemPlacementContext; +import net.minecraft.item.ItemStack; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvents; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.DirectionProperty; +import net.minecraft.state.property.IntProperty; +import net.minecraft.state.property.Properties; +import net.minecraft.util.ActionResult; +import net.minecraft.util.BlockMirror; +import net.minecraft.util.BlockRotation; +import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.entity.SilkMothEntity; +import ru.betterend.registry.EndEntities; +import ru.betterend.registry.EndItems; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; + +public class SilkMothHiveBlock extends BlockBase { + public static final DirectionProperty FACING = Properties.HORIZONTAL_FACING; + public static final IntProperty FULLNESS = BlockProperties.FULLNESS; + + public SilkMothHiveBlock() { + super(FabricBlockSettings.of(Material.WOOD).hardness(0.5F).resistance(0.1F).sounds(BlockSoundGroup.WOOL).nonOpaque().ticksRandomly().breakByHand(true)); + this.setDefaultState(getDefaultState().with(FULLNESS, 0)); + } + + @Override + protected void appendProperties(StateManager.Builder stateManager) { + stateManager.add(FACING, FULLNESS); + } + + @Override + public BlockState getPlacementState(ItemPlacementContext ctx) { + Direction dir = ctx.getPlayerFacing().getOpposite(); + return this.getDefaultState().with(FACING, dir); + } + + @Override + public BlockState rotate(BlockState state, BlockRotation rotation) { + return BlocksHelper.rotateHorizontal(state, rotation, FACING); + } + + @Override + public BlockState mirror(BlockState state, BlockMirror mirror) { + return BlocksHelper.mirrorHorizontal(state, mirror, FACING); + } + + @Override + public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + Direction dir = state.get(FACING); + BlockPos spawn = pos.offset(dir); + if (!world.getBlockState(spawn).isAir()) { + return; + } + int count = world.getEntitiesByType(EndEntities.SILK_MOTH, new Box(pos).expand(16), (entity) -> { return true; }).size(); + if (count > 6) { + return; + } + SilkMothEntity moth = new SilkMothEntity(EndEntities.SILK_MOTH, world); + moth.refreshPositionAndAngles(spawn.getX() + 0.5, spawn.getY() + 0.5, spawn.getZ() + 0.5, dir.asRotation(), 0); + moth.setVelocity(new Vec3d(dir.getOffsetX() * 0.4, 0, dir.getOffsetZ() * 0.4)); + moth.setHive(world, pos); + world.spawnEntity(moth); + world.playSound(null, pos, SoundEvents.BLOCK_BEEHIVE_EXIT, SoundCategory.BLOCKS, 1, 1); + } + + @Override + public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + if (hand == Hand.MAIN_HAND) { + ItemStack stack = player.getMainHandStack(); + if (stack.getItem().isIn(FabricToolTags.SHEARS) && state.get(FULLNESS) == 3) { + BlocksHelper.setWithUpdate(world, pos, state.with(FULLNESS, 0)); + Direction dir = state.get(FACING); + double px = pos.getX() + dir.getOffsetX() + 0.5; + double py = pos.getY() + dir.getOffsetY() + 0.5; + double pz = pos.getZ() + dir.getOffsetZ() + 0.5; + ItemStack drop = new ItemStack(EndItems.SILK_FIBER, MHelper.randRange(8, 16, world.getRandom())); + ItemEntity entity = new ItemEntity(world, px, py, pz, drop); + world.spawnEntity(entity); + if (world.getRandom().nextInt(4) == 0) { + drop = new ItemStack(EndItems.SILK_MOTH_MATRIX); + entity = new ItemEntity(world, px, py, pz, drop); + world.spawnEntity(entity); + } + if (!player.isCreative()) { + stack.setDamage(stack.getDamage() + 1); + } + return ActionResult.SUCCESS; + } + } + return ActionResult.FAIL; + } +} diff --git a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java index 7ed3e427..09a3a197 100644 --- a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java +++ b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java @@ -5,11 +5,13 @@ import java.util.List; import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.Material; import net.minecraft.block.ShapeContext; +import net.minecraft.entity.ItemEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemPlacementContext; import net.minecraft.item.ItemStack; @@ -24,8 +26,11 @@ import net.minecraft.state.property.DirectionProperty; import net.minecraft.state.property.IntProperty; import net.minecraft.state.property.Properties; import net.minecraft.tag.BlockTags; +import net.minecraft.util.ActionResult; import net.minecraft.util.BlockMirror; import net.minecraft.util.BlockRotation; +import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Box; import net.minecraft.util.math.Direction; @@ -39,7 +44,9 @@ import ru.betterend.client.render.ERenderLayer; import ru.betterend.entity.SilkMothEntity; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndEntities; +import ru.betterend.registry.EndItems; import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; public class SilkMothNestBlock extends BlockBase implements IRenderTypeable { public static final BooleanProperty ACTIVE = BlockProperties.ACTIVE; @@ -128,7 +135,7 @@ public class SilkMothNestBlock extends BlockBase implements IRenderTypeable { return; } int count = world.getEntitiesByType(EndEntities.SILK_MOTH, new Box(pos).expand(16), (entity) -> { return true; }).size(); - if (count > 8) { + if (count > 6) { return; } SilkMothEntity moth = new SilkMothEntity(EndEntities.SILK_MOTH, world); @@ -138,4 +145,29 @@ public class SilkMothNestBlock extends BlockBase implements IRenderTypeable { world.spawnEntity(moth); world.playSound(null, pos, SoundEvents.BLOCK_BEEHIVE_EXIT, SoundCategory.BLOCKS, 1, 1); } + + @Override + public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + if (hand == Hand.MAIN_HAND) { + ItemStack stack = player.getMainHandStack(); + if (stack.getItem().isIn(FabricToolTags.SHEARS) && state.get(ACTIVE) && state.get(FULLNESS) == 3) { + BlocksHelper.setWithUpdate(world, pos, state.with(FULLNESS, 0)); + Direction dir = state.get(FACING); + double px = pos.getX() + dir.getOffsetX() + 0.5; + double py = pos.getY() + dir.getOffsetY() + 0.5; + double pz = pos.getZ() + dir.getOffsetZ() + 0.5; + ItemStack drop = new ItemStack(EndItems.SILK_FIBER, MHelper.randRange(1, 4, world.getRandom())); + ItemEntity entity = new ItemEntity(world, px, py, pz, drop); + world.spawnEntity(entity); + drop = new ItemStack(EndItems.SILK_MOTH_MATRIX, MHelper.randRange(1, 3, world.getRandom())); + entity = new ItemEntity(world, px, py, pz, drop); + world.spawnEntity(entity); + if (!player.isCreative()) { + stack.setDamage(stack.getDamage() + 1); + } + return ActionResult.SUCCESS; + } + } + return ActionResult.FAIL; + } } diff --git a/src/main/java/ru/betterend/entity/SilkMothEntity.java b/src/main/java/ru/betterend/entity/SilkMothEntity.java index 96ee96f7..8329821e 100644 --- a/src/main/java/ru/betterend/entity/SilkMothEntity.java +++ b/src/main/java/ru/betterend/entity/SilkMothEntity.java @@ -1,6 +1,7 @@ package ru.betterend.entity; import java.util.EnumSet; +import java.util.List; import java.util.Random; import org.jetbrains.annotations.Nullable; @@ -34,8 +35,10 @@ import net.minecraft.nbt.NbtHelper; import net.minecraft.server.world.ServerWorld; import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvents; +import net.minecraft.state.property.Properties; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; import net.minecraft.util.math.Vec3d; import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryKey; @@ -44,7 +47,6 @@ import net.minecraft.world.ServerWorldAccess; import net.minecraft.world.World; import ru.betterend.BetterEnd; import ru.betterend.blocks.BlockProperties; -import ru.betterend.blocks.SilkMothNestBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndItems; @@ -177,7 +179,13 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { int y = world.getChunk(pos).sampleHeightmap(Type.WORLD_SURFACE, pos.getX() & 15, pos.getY() & 15); - return y > 0 && pos.getY() >= y; + return y > 0 && pos.getY() >= y && notManyEntities(world, pos, 32, 1); + } + + private static boolean notManyEntities(ServerWorldAccess world, BlockPos pos, int radius, int maxCount) { + Box box = new Box(pos).expand(radius); + List list = world.getEntitiesByClass(SilkMothEntity.class, box, (entity) -> true); + return list.size() <= maxCount; } class MothLookControl extends LookControl { @@ -207,7 +215,13 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { @Override public void start() { - Vec3d vec3d = this.getRandomLocation(); + Vec3d vec3d = null; + if (SilkMothEntity.this.hivePos != null && SilkMothEntity.this.hiveWorld == SilkMothEntity.this.world) { + if (SilkMothEntity.this.getPos().squaredDistanceTo(SilkMothEntity.this.hivePos.getX(), SilkMothEntity.this.hivePos.getY(), SilkMothEntity.this.hivePos.getZ()) > 16) { + vec3d = SilkMothEntity.this.getPos().add(random.nextGaussian() * 2, 0, random.nextGaussian() * 2); + } + } + vec3d = vec3d == null ? this.getRandomLocation() : vec3d; if (vec3d != null) { try { SilkMothEntity.this.navigation.startMovingAlong(SilkMothEntity.this.navigation.findPathTo(new BlockPos(vec3d), 1), 1.0D); @@ -235,22 +249,23 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { && SilkMothEntity.this.hiveWorld == SilkMothEntity.this.world && SilkMothEntity.this.navigation.isIdle() && SilkMothEntity.this.random.nextInt(16) == 0 - && SilkMothEntity.this.getPos().squaredDistanceTo(SilkMothEntity.this.hivePos.getX(), SilkMothEntity.this.hivePos.getY(), SilkMothEntity.this.hivePos.getZ()) < 32; + && SilkMothEntity.this.getPos().squaredDistanceTo(SilkMothEntity.this.hivePos.getX(), SilkMothEntity.this.hivePos.getY(), SilkMothEntity.this.hivePos.getZ()) < 64; } @Override public boolean shouldContinue() { - return SilkMothEntity.this.navigation.isFollowingPath() && world.getBlockState(entrance).isAir() && world.getBlockState(hivePos).isOf(EndBlocks.SILK_MOTH_NEST); + return SilkMothEntity.this.navigation.isFollowingPath() && world.getBlockState(entrance).isAir() && (world.getBlockState(hivePos).isOf(EndBlocks.SILK_MOTH_NEST) || world.getBlockState(hivePos).isOf(EndBlocks.SILK_MOTH_HIVE)); } @Override public void start() { BlockState state = SilkMothEntity.this.world.getBlockState(SilkMothEntity.this.hivePos); - if (!state.isOf(EndBlocks.SILK_MOTH_NEST)) { + if (!state.isOf(EndBlocks.SILK_MOTH_NEST) && !state.isOf(EndBlocks.SILK_MOTH_HIVE)) { SilkMothEntity.this.hivePos = null; + return; } try { - SilkMothEntity.this.entrance = SilkMothEntity.this.hivePos.offset(state.get(SilkMothNestBlock.FACING)); + SilkMothEntity.this.entrance = SilkMothEntity.this.hivePos.offset(state.get(Properties.HORIZONTAL_FACING)); SilkMothEntity.this.navigation.startMovingAlong(SilkMothEntity.this.navigation.findPathTo(entrance, 1), 1.0D); } catch (Exception e) {} @@ -259,20 +274,30 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { @Override public void tick() { super.tick(); + if (SilkMothEntity.this.entrance == null) { + return; + } double dx = Math.abs(SilkMothEntity.this.entrance.getX() - SilkMothEntity.this.getX()); double dy = Math.abs(SilkMothEntity.this.entrance.getY() - SilkMothEntity.this.getY()); double dz = Math.abs(SilkMothEntity.this.entrance.getZ() - SilkMothEntity.this.getZ()); if (dx + dy + dz < 1) { BlockState state = SilkMothEntity.this.world.getBlockState(hivePos); - if (state.isOf(EndBlocks.SILK_MOTH_NEST)) { + if (state.isOf(EndBlocks.SILK_MOTH_NEST) || state.isOf(EndBlocks.SILK_MOTH_HIVE)) { int fullness = state.get(BlockProperties.FULLNESS); - if (fullness < 3 && SilkMothEntity.this.random.nextBoolean()) { - fullness ++; - BlocksHelper.setWithUpdate(SilkMothEntity.this.hiveWorld, SilkMothEntity.this.hivePos, state); + boolean isHive = state.isOf(EndBlocks.SILK_MOTH_HIVE); + if (fullness < 3 && (isHive || SilkMothEntity.this.random.nextBoolean())) { + fullness += isHive ? MHelper.randRange(1, 2, random) : 1; + if (fullness > 3) { + fullness = 3; + } + BlocksHelper.setWithUpdate(SilkMothEntity.this.hiveWorld, SilkMothEntity.this.hivePos, state.with(BlockProperties.FULLNESS, fullness)); } SilkMothEntity.this.world.playSound(null, SilkMothEntity.this.entrance, SoundEvents.BLOCK_BEEHIVE_ENTER, SoundCategory.BLOCKS, 1, 1); SilkMothEntity.this.remove(); } + else { + SilkMothEntity.this.hivePos = null; + } } } } diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index 7fe05063..dd3045a0 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -189,6 +189,8 @@ public class CraftingRecipes { GridRecipe.make("charcoal_block", EndBlocks.CHARCOAL_BLOCK).setShape("###", "###", "###").addMaterial('#', Items.CHARCOAL).build(); GridRecipe.make("end_stone_furnace", EndBlocks.END_STONE_FURNACE).setShape("###", "# #", "###").addMaterial('#', Blocks.END_STONE).build(); GridRecipe.make("filalux_lantern", EndBlocks.FILALUX_LANTERN).setShape("###", "###", "###").addMaterial('#', EndBlocks.FILALUX).build(); + + GridRecipe.make("silk_moth_hive", EndBlocks.SILK_MOTH_HIVE).setShape("###", "LML", "###").addMaterial('#', EndBlocks.TENANEA.planks).addMaterial('L', EndBlocks.TENANEA_LEAVES).addMaterial('M', EndItems.SILK_MOTH_MATRIX).build(); } private static void registerLantern(String name, Block lantern, Block slab) { diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 28fb95fa..1fac2cb8 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -86,6 +86,7 @@ import ru.betterend.blocks.RespawnObeliskBlock; import ru.betterend.blocks.RunedFlavolite; import ru.betterend.blocks.ShadowBerryBlock; import ru.betterend.blocks.ShadowGrassBlock; +import ru.betterend.blocks.SilkMothHiveBlock; import ru.betterend.blocks.SilkMothNestBlock; import ru.betterend.blocks.SmallAmaranitaBlock; import ru.betterend.blocks.SmallJellyshroomBlock; @@ -353,7 +354,8 @@ public class EndBlocks { public static final Block FILALUX_LANTERN = registerBlock("filalux_lantern", new FilaluxLanternBlock()); // Mob-Related - public static final Block SILK_MOTH_NEST = registerBlock("silk_moth_nest", new SilkMothNestBlock()); + public static final Block SILK_MOTH_NEST = registerBlock("silk_moth_nest", new SilkMothNestBlock()); + public static final Block SILK_MOTH_HIVE = registerBlock("silk_moth_hive", new SilkMothHiveBlock()); // Ores // public static final Block ENDER_ORE = registerBlock("ender_ore", new EndOreBlock(EndItems.ENDER_SHARD, 1, 3, 5)); diff --git a/src/main/java/ru/betterend/registry/EndEntities.java b/src/main/java/ru/betterend/registry/EndEntities.java index d89d2d46..9863bd9b 100644 --- a/src/main/java/ru/betterend/registry/EndEntities.java +++ b/src/main/java/ru/betterend/registry/EndEntities.java @@ -28,7 +28,7 @@ public class EndEntities { public static final EntityType END_FISH = register("end_fish", SpawnGroup.WATER_AMBIENT, 0.5F, 0.5F, EndFishEntity::new, EndFishEntity.createMobAttributes(), true, MHelper.color(3, 50, 76), MHelper.color(120, 206, 255)); public static final EntityType SHADOW_WALKER = register("shadow_walker", SpawnGroup.MONSTER, 0.6F, 1.95F, ShadowWalkerEntity::new, ShadowWalkerEntity.createMobAttributes(), true, MHelper.color(30, 30, 30), MHelper.color(5, 5, 5)); public static final EntityType CUBOZOA = register("cubozoa", SpawnGroup.WATER_AMBIENT, 0.6F, 1F, CubozoaEntity::new, CubozoaEntity.createMobAttributes(), true, MHelper.color(151, 77, 181), MHelper.color(93, 176, 238)); - public static final EntityType SILK_MOTH = register("silk_moth", SpawnGroup.AMBIENT, 0.6F, 0.6F, SilkMothEntity::new, SilkMothEntity.createMobAttributes(), true, MHelper.color(0, 0, 0), MHelper.color(225, 225, 225)); + public static final EntityType SILK_MOTH = register("silk_moth", SpawnGroup.AMBIENT, 0.6F, 0.6F, SilkMothEntity::new, SilkMothEntity.createMobAttributes(), true, MHelper.color(198, 138, 204), MHelper.color(242, 220, 236)); public static void register() { SpawnHelper.restrictionAir(DRAGONFLY, DragonflyEntity::canSpawn); diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index 9cff5332..d8365766 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -74,6 +74,7 @@ public class EndItems { public final static Item LEATHER_WRAPPED_STICK = registerItem("leather_wrapped_stick"); public final static Item SILK_FIBER = registerItem("silk_fiber"); public final static Item LUMECORN_ROD = registerItem("lumecorn_rod"); + public final static Item SILK_MOTH_MATRIX = registerItem("silk_moth_matrix"); // Armor // public static final Item AETERNIUM_HELMET = registerItem("aeternium_helmet", new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.HEAD, makeItemSettings().fireproof())); diff --git a/src/main/resources/assets/betterend/blockstates/silk_moth_hive.json b/src/main/resources/assets/betterend/blockstates/silk_moth_hive.json new file mode 100644 index 00000000..ea609405 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/silk_moth_hive.json @@ -0,0 +1,20 @@ +{ + "variants": { + "facing=north,fullness=0": { "model": "betterend:block/silk_moth_hive" }, + "facing=south,fullness=0": { "model": "betterend:block/silk_moth_hive", "y": 180 }, + "facing=east,fullness=0": { "model": "betterend:block/silk_moth_hive", "y": 90 }, + "facing=west,fullness=0": { "model": "betterend:block/silk_moth_hive", "y": 270 }, + "facing=north,fullness=1": { "model": "betterend:block/silk_moth_hive" }, + "facing=south,fullness=1": { "model": "betterend:block/silk_moth_hive", "y": 180 }, + "facing=east,fullness=1": { "model": "betterend:block/silk_moth_hive", "y": 90 }, + "facing=west,fullness=1": { "model": "betterend:block/silk_moth_hive", "y": 270 }, + "facing=north,fullness=2": { "model": "betterend:block/silk_moth_hive" }, + "facing=south,fullness=2": { "model": "betterend:block/silk_moth_hive", "y": 180 }, + "facing=east,fullness=2": { "model": "betterend:block/silk_moth_hive", "y": 90 }, + "facing=west,fullness=2": { "model": "betterend:block/silk_moth_hive", "y": 270 }, + "facing=north,fullness=3": { "model": "betterend:block/silk_moth_hive_silk" }, + "facing=south,fullness=3": { "model": "betterend:block/silk_moth_hive_silk", "y": 180 }, + "facing=east,fullness=3": { "model": "betterend:block/silk_moth_hive_silk", "y": 90 }, + "facing=west,fullness=3": { "model": "betterend:block/silk_moth_hive_silk", "y": 270 } + } +} diff --git a/src/main/resources/assets/betterend/models/block/silk_moth_hive.json b/src/main/resources/assets/betterend/models/block/silk_moth_hive.json new file mode 100644 index 00000000..884ce086 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/silk_moth_hive.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "betterend:block/moth_hive_side", + "east": "betterend:block/moth_hive_side", + "north": "betterend:block/moth_hive_front", + "particle": "betterend:block/moth_hive_side", + "south": "betterend:block/moth_hive_side", + "up": "betterend:block/moth_hive_side", + "west": "betterend:block/moth_hive_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/silk_moth_hive_silk.json b/src/main/resources/assets/betterend/models/block/silk_moth_hive_silk.json new file mode 100644 index 00000000..3ca4a0d6 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/silk_moth_hive_silk.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "betterend:block/moth_hive_side", + "east": "betterend:block/moth_hive_side", + "north": "betterend:block/moth_hive_front_silk", + "particle": "betterend:block/moth_hive_side", + "south": "betterend:block/moth_hive_side", + "up": "betterend:block/moth_hive_side", + "west": "betterend:block/moth_hive_side" + } +} diff --git a/src/main/resources/assets/betterend/models/item/silk_moth_hive.json b/src/main/resources/assets/betterend/models/item/silk_moth_hive.json new file mode 100644 index 00000000..64cd5bc7 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/silk_moth_hive.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/silk_moth_hive" +} diff --git a/src/main/resources/assets/betterend/textures/block/moth_hive_front.png b/src/main/resources/assets/betterend/textures/block/moth_hive_front.png new file mode 100644 index 0000000000000000000000000000000000000000..78faf2cb82447f3c304131d927c27db574734156 GIT binary patch literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFj1;yj><+zZGtUZ&C|L{bYuq>I!oLr1f7d-Z|9fix>OCVVf)5S4F;&O7t)~fI8LRZJc zNW{$P-8+Z1wO4Y^^L=v-KmRusZfpJiUvgTe~DWM4fhcn3I$T~Q5GhzyoC zp85^sa~60+7BevL9R^{>5$W?wxu(|GC>i76tirlOJ(tdb(9 zt*vgI4r-N9Thh8qVs~4ik&l5HFE4K?n~_4$93ElCph-NF6@t3J1c&AhJ=PgO)Yv7U q>DcD!;H_?GplO)VbZ4Q81_#64&l)qT-tBG$Im^@4&t;ucLK6UH=25W# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/silk_moth_matrix.png b/src/main/resources/assets/betterend/textures/item/silk_moth_matrix.png new file mode 100644 index 0000000000000000000000000000000000000000..c87a143654302a9c2dcadc8b86699eb40d7896f4 GIT binary patch literal 424 zcmV;Z0ayNsP)Px$Vo5|nR5*>zl08ntKoCYB2*q-+qK%skR4aFppdw95O2iG|2&AG$6eu-SI6`s- zE&**yTCyqDE6YD}hzLcnl|`n8sb)qqZ@!sb_-os1NmYLwS(Qj#1?@5@Dktm0Vs+Bd(gv+ zEz_s*ChQ7lEk{8$U29!8SAN(Plv#p_t)s>Pc!wQC(8j#I)Xl~i`n?u<6>xNVj@Apz zw;BhqOAVs|=Is^PN|9cUUIi$n@O_{D@RBl1(0bwCz{D1<7lhFOr4*njih_@o=5sj* zrD|0+%@IM{1(aC=fRxhN-xvdF?#4~8;2m}lfYur*WnC=R3-+Ty9ZN5#4BFTw&nBDdFH}dW3Lo!B^^vRG|FAEU%g`3U S>rQ Date: Thu, 18 Mar 2021 16:57:09 +0300 Subject: [PATCH 368/463] Lang & recipe correction --- src/main/java/ru/betterend/recipe/CraftingRecipes.java | 2 +- src/main/resources/assets/betterend/lang/en_gb.json | 4 +++- src/main/resources/assets/betterend/lang/en_us.json | 5 ++++- src/main/resources/assets/betterend/lang/ru_ru.json | 5 ++++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index dd3045a0..42e5d801 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -190,7 +190,7 @@ public class CraftingRecipes { GridRecipe.make("end_stone_furnace", EndBlocks.END_STONE_FURNACE).setShape("###", "# #", "###").addMaterial('#', Blocks.END_STONE).build(); GridRecipe.make("filalux_lantern", EndBlocks.FILALUX_LANTERN).setShape("###", "###", "###").addMaterial('#', EndBlocks.FILALUX).build(); - GridRecipe.make("silk_moth_hive", EndBlocks.SILK_MOTH_HIVE).setShape("###", "LML", "###").addMaterial('#', EndBlocks.TENANEA.planks).addMaterial('L', EndBlocks.TENANEA_LEAVES).addMaterial('M', EndItems.SILK_MOTH_MATRIX).build(); + GridRecipe.make("silk_moth_hive", EndBlocks.SILK_MOTH_HIVE).setShape("#L#", "LML", "#L#").addMaterial('#', EndBlocks.TENANEA.planks).addMaterial('L', EndBlocks.TENANEA_LEAVES).addMaterial('M', EndItems.SILK_MOTH_MATRIX).build(); } private static void registerLantern(String name, Block lantern, Block slab) { diff --git a/src/main/resources/assets/betterend/lang/en_gb.json b/src/main/resources/assets/betterend/lang/en_gb.json index b4f84411..86da4ef1 100644 --- a/src/main/resources/assets/betterend/lang/en_gb.json +++ b/src/main/resources/assets/betterend/lang/en_gb.json @@ -36,5 +36,7 @@ "block.betterend.umbrella_tree_stripped_log": "Striped Umbrella Tree Log", "block.betterend.jellyshroom_stripped_bark": "Striped Jellyshroom Bark", "block.betterend.jellyshroom_stripped_log": "Striped Jellyshroom Log", - "block.betterend.sulphuric_rock_furnace": "Sulphuric Rock Furnace" + "block.betterend.sulphuric_rock_furnace": "Sulphuric Rock Furnace", + "block.betterend.lucernia_stripped_bark": "Striped Lucernia Bark", + "block.betterend.lucernia_stripped_log": "Striped Lucernia Log" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 47618bf5..2e0638f2 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -805,5 +805,8 @@ "block.betterend.flamaea": "Flamaea", "block.betterend.pond_anemone": "Pond Anemone", "block.betterend.ruscus": "Ruscus", - "item.betterend.bolux_mushroom_cooked": "Cooked Bolux Mushroom" + "item.betterend.bolux_mushroom_cooked": "Cooked Bolux Mushroom", + + "block.betterend.silk_moth_hive": "Silk Moth Hive", + "item.betterend.silk_moth_matrix": "Silk Moth Matrix" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index cf6847a2..96f79c1f 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -825,5 +825,8 @@ "block.betterend.flamaea": "Фламея", "block.betterend.pond_anemone": "Озёрный анемон", "block.betterend.ruscus": "Рускус", - "item.betterend.bolux_mushroom_cooked": "Приготовленный болюкс" + "item.betterend.bolux_mushroom_cooked": "Приготовленный болюкс", + + "block.betterend.silk_moth_hive": "Улей шелковичной моли", + "item.betterend.silk_moth_matrix": "Матрица шелковичной моли" } \ No newline at end of file From 674d80a3de59fa7a80e900e484e7b53916d3bba4 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 19 Mar 2021 00:11:18 +0300 Subject: [PATCH 369/463] Custom End Portal --- .../mixin/common/EndPortalFeatureMixin.java | 48 ++++++++++++++++-- .../mixin/common/ServerWorldMixin.java | 40 ++++----------- .../java/ru/betterend/util/WorldDataUtil.java | 41 +++++++++++++++ .../world/generator/GeneratorOptions.java | 15 ++++++ .../structures/portal/end_portal_active.nbt | Bin 0 -> 2159 bytes .../structures/portal/end_portal_inactive.nbt | Bin 0 -> 2093 bytes 6 files changed, 109 insertions(+), 35 deletions(-) create mode 100644 src/main/java/ru/betterend/util/WorldDataUtil.java create mode 100644 src/main/resources/data/betterend/structures/portal/end_portal_active.nbt create mode 100644 src/main/resources/data/betterend/structures/portal/end_portal_inactive.nbt diff --git a/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java index bd8fe824..fc69f5a8 100644 --- a/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java @@ -2,33 +2,71 @@ package ru.betterend.mixin.common; import java.util.Random; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import net.minecraft.nbt.NbtHelper; +import net.minecraft.structure.Structure; +import net.minecraft.structure.StructurePlacementData; import net.minecraft.util.math.BlockPos; -import net.minecraft.world.Heightmap.Type; import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.Heightmap.Type; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; import net.minecraft.world.gen.feature.EndPortalFeature; +import ru.betterend.BetterEnd; +import ru.betterend.util.StructureHelper; +import ru.betterend.util.WorldDataUtil; import ru.betterend.world.generator.GeneratorOptions; @Mixin(EndPortalFeature.class) public class EndPortalFeatureMixin { + @Final + @Shadow + private boolean open; + @Inject(method = "generate", at = @At("HEAD"), cancellable = true) - private void bePortalGenerate(StructureWorldAccess structureWorldAccess, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, DefaultFeatureConfig defaultFeatureConfig, CallbackInfoReturnable info) { + private void bePortalGenerate(StructureWorldAccess world, ChunkGenerator generator, Random random, BlockPos blockPos, DefaultFeatureConfig config, CallbackInfoReturnable info) { if (!GeneratorOptions.hasPortal()) { info.setReturnValue(false); info.cancel(); } + else if (GeneratorOptions.replacePortal()) { + blockPos = be_updatePos(blockPos, world); + Structure structure = StructureHelper.readStructure(BetterEnd.makeID(open ? "portal/end_portal_active" : "portal/end_portal_inactive")); + BlockPos size = structure.getSize(); + blockPos = blockPos.add(-(size.getX() >> 1), -3, -(size.getZ() >> 1)); + structure.place(world, blockPos, new StructurePlacementData(), random); + info.setReturnValue(true); + info.cancel(); + } } @ModifyVariable(method = "generate", ordinal = 0, at = @At("HEAD")) - private BlockPos be_setPosOnGround(BlockPos blockPos, StructureWorldAccess structureWorldAccess) { - int y = structureWorldAccess.getChunk(blockPos).sampleHeightmap(Type.WORLD_SURFACE, blockPos.getX() & 15, blockPos.getZ() & 15); - return new BlockPos(blockPos.getX(), y, blockPos.getZ()); + private BlockPos be_setPosOnGround(BlockPos blockPos, StructureWorldAccess world) { + return be_updatePos(blockPos, world); + } + + private BlockPos be_updatePos(BlockPos blockPos, StructureWorldAccess world) { + if (GeneratorOptions.useNewGenerator()) { + BlockPos pos = GeneratorOptions.getPortalPos(); + if (pos.equals(BlockPos.ORIGIN)) { + int y = world.getChunk(blockPos).sampleHeightmap(Type.WORLD_SURFACE, blockPos.getX(), blockPos.getZ()); + if (y < 1) { + y = 65; + } + pos = new BlockPos(pos.getX(), y, pos.getZ()); + GeneratorOptions.setPortalPos(pos); + WorldDataUtil.getRootTag().put("portal", NbtHelper.fromBlockPos(pos)); + WorldDataUtil.saveFile(); + } + return pos; + } + return blockPos; } } diff --git a/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java b/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java index 35a1f5e2..afc357d1 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java @@ -1,7 +1,6 @@ package ru.betterend.mixin.common; import java.io.File; -import java.io.IOException; import java.util.List; import java.util.concurrent.Executor; @@ -14,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.metadata.ModMetadata; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtIo; +import net.minecraft.nbt.NbtHelper; import net.minecraft.server.MinecraftServer; import net.minecraft.server.WorldGenerationProgressListener; import net.minecraft.server.world.ServerWorld; @@ -28,6 +27,7 @@ import net.minecraft.world.level.ServerWorldProperties; import net.minecraft.world.level.storage.LevelStorage; import ru.betterend.BetterEnd; import ru.betterend.util.DataFixerUtil; +import ru.betterend.util.WorldDataUtil; import ru.betterend.world.generator.GeneratorOptions; @Mixin(ServerWorld.class) @@ -37,26 +37,17 @@ public class ServerWorldMixin { File beData = new File(FabricLoader.getInstance().getGameDir().getParent().toString(), "saves/" + properties.getLevelName() + "/betterend_data.nbt"); ModMetadata meta = FabricLoader.getInstance().getModContainer(BetterEnd.MOD_ID).get().getMetadata(); String version = BetterEnd.isDevEnvironment() ? "development" : meta.getVersion().toString(); - boolean fix = false; - if (beData.exists()) { - CompoundTag root; - try { - root = NbtIo.read(beData); - } - catch (IOException e) { - BetterEnd.LOGGER.error("World data loading failed", e); - return; - } - String dataVersion = root.getString("version"); - fix = !dataVersion.equals(version); - } - else { - fix = true; - } + + WorldDataUtil.load(beData); + CompoundTag root = WorldDataUtil.getRootTag(); + String dataVersion = root.getString("version"); + GeneratorOptions.setPortalPos(NbtHelper.toBlockPos(root.getCompound("portal"))); + boolean fix = !dataVersion.equals(version); if (fix) { DataFixerUtil.fixData(beData.getParentFile()); - be_writeDataFile(beData, version); + root.putString("version", version); + WorldDataUtil.saveFile(); } } @@ -69,15 +60,4 @@ public class ServerWorldMixin { } } } - - private void be_writeDataFile(File file, String version) { - CompoundTag root = new CompoundTag(); - root.putString("version", version); - try { - NbtIo.write(root, file); - } - catch (IOException e) { - BetterEnd.LOGGER.error("World data saving failed", e); - } - } } diff --git a/src/main/java/ru/betterend/util/WorldDataUtil.java b/src/main/java/ru/betterend/util/WorldDataUtil.java new file mode 100644 index 00000000..4ba51df2 --- /dev/null +++ b/src/main/java/ru/betterend/util/WorldDataUtil.java @@ -0,0 +1,41 @@ +package ru.betterend.util; + +import java.io.File; +import java.io.IOException; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtIo; +import ru.betterend.BetterEnd; + +public class WorldDataUtil { + private static CompoundTag root; + private static File saveFile; + + public static void load(File file) { + saveFile = file; + if (file.exists()) { + try { + root = NbtIo.read(file); + } + catch (IOException e) { + BetterEnd.LOGGER.error("World data loading failed", e); + root = new CompoundTag(); + } + return; + } + root = new CompoundTag(); + } + + public static CompoundTag getRootTag() { + return root; + } + + public static void saveFile() { + try { + NbtIo.write(root, saveFile); + } + catch (IOException e) { + BetterEnd.LOGGER.error("World data saving failed", e); + } + } +} diff --git a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java index 7e5cc0ee..baee736f 100644 --- a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java +++ b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java @@ -23,6 +23,8 @@ public class GeneratorOptions { public static LayerOptions smallOptions; private static boolean changeSpawn; private static BlockPos spawn; + private static BlockPos portal = BlockPos.ORIGIN; + private static boolean replacePortal; public static void init() { biomeSizeLand = Configs.GENERATOR_CONFIG.getInt("biomeMap", "biomeSizeLand", 256); @@ -47,6 +49,7 @@ public class GeneratorOptions { Configs.GENERATOR_CONFIG.getInt("spawn.point", "y", 65), Configs.GENERATOR_CONFIG.getInt("spawn.point", "z", 0) ); + replacePortal = Configs.GENERATOR_CONFIG.getBooleanRoot("customEndPortal", true); } public static int getBiomeSizeLand() { @@ -108,4 +111,16 @@ public class GeneratorOptions { public static BlockPos getSpawn() { return spawn; } + + public static BlockPos getPortalPos() { + return portal; + } + + public static void setPortalPos(BlockPos portal) { + GeneratorOptions.portal = portal; + } + + public static boolean replacePortal() { + return replacePortal; + } } diff --git a/src/main/resources/data/betterend/structures/portal/end_portal_active.nbt b/src/main/resources/data/betterend/structures/portal/end_portal_active.nbt new file mode 100644 index 0000000000000000000000000000000000000000..27ef1e47fff50c2b685f7e51291bf988f87c588d GIT binary patch literal 2159 zcmaJ>3pA8z7#2s_nWDBB*PLV>I?6CAEymf}wAxWN6*3t2Tx&6?F__L`Ta#V18BXO` zvc%vom)vG(YGMsjuEQ8&YV4SXWl%0N_Wy^~h3!A@Isf~8-}`>g`#sNlUj0-Rg_Vz* z(|*d`WtV-qm_S@kydS)Ucq`3%qN3|B2kaMLkyLEPxigMBd(AQoBveOYx@kd$6`D{k zl1S2vgP4WH1}T9alp}bzFd_;eETIoEWD}POk9c;6o|Oarw8f}p8K2*6DN0}lNM6g* zy+%uhEqQ$J7*1|HpAdlesa7tu=-5t~z3zsfIFf?k7#G|bF|s(Ca#HL|%7(G9xH3hC zBpusih(NX~VXcWCMzw##4&XB2ayQXo zo$EvJIj?Lqf6al0%P^z7g0FM;(aMy%4!2x3x{~5Bid8N0pTR18;LLO_j#!Rbb zHZTk)k*yoMi?07DXT~)fdLdg8nCW${bMwZpT-jwQ%W0@fXf9YpVAlO0lAfOX>S|G4y&S=)2ZG)Y7l3D6a`xF$#YnI5yY2-=q75MqV7!0-m;c)x&- zZsldeDUKAijl_r~0b9lQQX{p}YZHO3?bs&Q(_<(EQl3`Q6eWKF+5e(Ik!fKW zxye^6XEoFi!QBb2i7L}*}u2t(dr z{3H|)$s?$PP;*z6+BgP;mO#{lfi$SR55O?f2i4_01{Dm!E59!`6Uz$3-fl}^{f|Z; zMt;(<;BBcQR27|BFaTCdIMPwOHEjQ6)z{{&edF8su4$Fw)7q+;z1u*<-s#fEU}05^ zv%xiB5PKiy!eLyewv46zNjYoWRf42$P%d;1wf`FbALj$M<|f~Rg0*kV!_zE(lhezm z@Zgdp}|_u=GqYs390s7j&sJ`!((YVIz&WH$!3U&17DE3BJEk7<9t~ z8I7pk{g~syxvJtD<0{%i=Gm6mR@RSA)$?qrcF5?yhq5M)2YW#&a{;9>t_`0&sLmt- z1QONG*&7`>lAQ~WybF&^1|$z{b&%2V)qzUP4t8%KRhyxTGYge55~_X z)h!(E_FojH1Jaq60%??S_rYD`+AzFh5}LuG`Lg$ssVQ@w$m$MmTp5gyMc5%cMzlmQ zb}(Mon#-{&)f=9y6}f;DRSU+_q*NnwtC9K?T2sN1nxrE!foSV;^DvTpmOw*7KC_)k z*-DJN8CO*@A$zpHyGm|72*Kcg#`64a!Dg3W)f&7zirKz-Wq?zkYZ2UtxY@fia69xn zqqbuGSlyW+5ds^zp%4Pb)xbqz8>%S;Gror`uD!#mwKW$;zR(yChU2S} z>IRN_h;_yvGz#B6Xyh&^`4VbCKIg(kYGg65N5&Znv;7HZ~K_4l}0kUj3zCEcr_|bCz=*0_9UPSf2;LLbM=gy@tWF{#(IdgA$V?;?;!j?Fj!C|pZ z{5yV)K8>3Y`zT>~YW_suaC~JwF;+Gvk#H>~m+Bc4ze*W=v6R=RCF@**w|!$EvGh|= F_!r1vFP{Ja literal 0 HcmV?d00001 diff --git a/src/main/resources/data/betterend/structures/portal/end_portal_inactive.nbt b/src/main/resources/data/betterend/structures/portal/end_portal_inactive.nbt new file mode 100644 index 0000000000000000000000000000000000000000..30047c922db30a555bbe5c01d0cc9e940a09825b GIT binary patch literal 2093 zcmZ`)4OCKh6gNApjyP@01gz%SaxT9q{MaOOJI=FlBA2dJ8ulQMnt^6fl8DV*>LyH= zZu-!KBisCFB_jhf1uagrQY5v+GUMv%(grM6}f4xpG^ zwo$IVN~*O(VILug=Qd=oF&`YelSFVO%i_+?yi@K36(k~XsQN;3PBP@pVuyB{+E>DW zEF{>s#+*fIu9LIez&@n?d@@0{#w?n=uoaB@JQeo{Pn@#Iu9n-4V~v|X>)LDUQy5_1 zPW$*YLMJ85xT*8&UgszSft>rsn_ThUNHO%#QA2Keg|uIDgFEcG8*5}nZ;E>Pk7G+2 z;8T6{q<6p2iBjg;l~X8X735NpoR?omD)!#Sg<;yb1nQ^65ILpE#sXI3%>x_~nJY=P zG(R6>a@;^bhyy5L_?H?}#a?&%hA>QCWs)J|SZahTq-D92LBE_rE)re$q#nTuKlK`# zO&W27pWx|08LWFyhK%g&hXb$>+6`3XhC8UfKjQ@cHF07^0;qU=8U(GDL(onN1ckM! zKL}^?Ur&Ek7^(yZAZ}Vj_Ua>GLMY;t*b3g2RqPCn5L{c1lB#o-L1UZrR?eD@gUF%0 zgwspb&^$%vqc4Z6a|)yTq-CzesS7h1YSE4;T%X4d`lwQrBvFav`OMU&ydkG0F$uCNOa zy9{HqST%K<@ruh_YLs4-2{m@nN zHgn3z*z<-bW4wNTobL8~ZEL7XvoVa}lW$4PQxy&jAF5UdRaCBcMF2K%H z3nI{X-}dqiVf~Q_p5&258a*{iL+g*s$8idxqW5Ftio~**blqJSu)l_jEO!7$Q$)BR zy|<($vxn+Dgz1_*Avu~cMXPP?^m$yqCluZO4S)H_VXTB70({%3p3acbe0^{dK975w z-{23>8`Y#~u@ya4l=zVM9s0QCsFX}As9=_{)s+susHz@J`!>~Sy?2~Mr0%wun&DN& z|L`1De;7-@x5HGP80ic?RhJD=k4}r77TTo03qQubU<5(06J27UN>&o-IK)k7772Kz zC6TT}TsBi9;8m9NA9_mPJ#?7>Eiv;5rK#M^@OF3e2M#o@l)-xP`AFO2mab;MbHfC-)xW`4&5<9%}^<_e$o32a>-YCc5q3O?>=6A~msKB(? zZ6Pl`uUMcdEs1wLt)X4h>_d5|{FU@T?P5k=^EFFAo23)@-tJ+#^hUaMms!h(d|``YDyMuT!OjZ+8K?zLV*6-%OYHoa+9LL1VZ3H zX=N1&grx&i$Avt$Od}9h4j@-P7$d}!F!U!FY6nBJTiZ;-BHz#dkW)aQr5@M=xhh&& zaq~hH9%b$9?R? Date: Fri, 19 Mar 2021 10:34:46 +0300 Subject: [PATCH 370/463] Spike feature fixes & custom pillars --- .../blocks/complex/MetalMaterial.java | 2 + .../blocks/complex/StoneMaterial.java | 2 + .../mixin/common/EndSpikeFeatureMixin.java | 126 ++++++++++++------ .../java/ru/betterend/registry/EndTags.java | 9 ++ .../world/generator/GeneratorOptions.java | 6 + .../structures/pillars/pillar_base_1.nbt | Bin 0 -> 1577 bytes .../structures/pillars/pillar_base_2.nbt | Bin 0 -> 3144 bytes .../structures/pillars/pillar_base_3.nbt | Bin 0 -> 2273 bytes .../structures/pillars/pillar_base_4.nbt | Bin 0 -> 2487 bytes .../structures/pillars/pillar_top_1.nbt | Bin 0 -> 2564 bytes .../structures/pillars/pillar_top_1_cage.nbt | Bin 0 -> 2878 bytes .../structures/pillars/pillar_top_2.nbt | Bin 0 -> 6241 bytes .../structures/pillars/pillar_top_2_cage.nbt | Bin 0 -> 8246 bytes .../structures/pillars/pillar_top_3.nbt | Bin 0 -> 4025 bytes .../structures/pillars/pillar_top_3_cage.nbt | Bin 0 -> 4762 bytes .../structures/pillars/pillar_top_4.nbt | Bin 0 -> 8976 bytes .../structures/pillars/pillar_top_4_cage.nbt | Bin 0 -> 10421 bytes 17 files changed, 107 insertions(+), 38 deletions(-) create mode 100644 src/main/resources/data/betterend/structures/pillars/pillar_base_1.nbt create mode 100644 src/main/resources/data/betterend/structures/pillars/pillar_base_2.nbt create mode 100644 src/main/resources/data/betterend/structures/pillars/pillar_base_3.nbt create mode 100644 src/main/resources/data/betterend/structures/pillars/pillar_base_4.nbt create mode 100644 src/main/resources/data/betterend/structures/pillars/pillar_top_1.nbt create mode 100644 src/main/resources/data/betterend/structures/pillars/pillar_top_1_cage.nbt create mode 100644 src/main/resources/data/betterend/structures/pillars/pillar_top_2.nbt create mode 100644 src/main/resources/data/betterend/structures/pillars/pillar_top_2_cage.nbt create mode 100644 src/main/resources/data/betterend/structures/pillars/pillar_top_3.nbt create mode 100644 src/main/resources/data/betterend/structures/pillars/pillar_top_3_cage.nbt create mode 100644 src/main/resources/data/betterend/structures/pillars/pillar_top_4.nbt create mode 100644 src/main/resources/data/betterend/structures/pillars/pillar_top_4_cage.nbt diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index bb7f6041..7356e108 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -202,5 +202,7 @@ public class MetalMaterial { TagHelper.addTag(BlockTags.BEACON_BASE_BLOCKS, block); TagHelper.addTag(EndTags.IRON_INGOTS, ingot); TagHelper.addTag(ItemTags.BEACON_PAYMENT_ITEMS, ingot); + + TagHelper.addTag(EndTags.DRAGON_IMMUNE, ore, bars); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java index 08fde481..782ff4b0 100644 --- a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java @@ -98,5 +98,7 @@ public class StoneMaterial { TagHelper.addTag(BlockTags.SLABS, slab, brick_slab); TagHelper.addTags(pressure_plate, BlockTags.PRESSURE_PLATES, BlockTags.STONE_PRESSURE_PLATES); TagHelper.addTag(EndTags.END_STONES, stone); + + TagHelper.addTag(EndTags.DRAGON_IMMUNE, stone, stairs, slab, wall); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java index 220a93c3..28be0c91 100644 --- a/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java @@ -13,6 +13,8 @@ import net.minecraft.block.Blocks; import net.minecraft.block.PaneBlock; import net.minecraft.entity.EntityType; import net.minecraft.entity.decoration.EndCrystalEntity; +import net.minecraft.structure.Structure; +import net.minecraft.structure.StructurePlacementData; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos.Mutable; import net.minecraft.util.math.MathHelper; @@ -22,7 +24,9 @@ import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.EndSpikeFeature; import net.minecraft.world.gen.feature.EndSpikeFeatureConfig; +import ru.betterend.BetterEnd; import ru.betterend.util.BlocksHelper; +import ru.betterend.util.StructureHelper; import ru.betterend.world.generator.GeneratorOptions; @Mixin(EndSpikeFeature.class) @@ -39,50 +43,92 @@ public class EndSpikeFeatureMixin { int x = spike.getCenterX(); int z = spike.getCenterZ(); int radius = spike.getRadius(); - int minY = world.getChunk(spike.getCenterX() >> 4, spike.getCenterZ() >> 4).sampleHeightmap(Type.WORLD_SURFACE, spike.getCenterX() & 15, spike.getCenterZ() & 15) - 15; - int maxY = minY + spike.getHeight() - 50; + int minY = world.getChunk(x >> 4, z >> 4).sampleHeightmap(Type.WORLD_SURFACE, x & 15, z); + int maxY = minY + spike.getHeight() - 30; - int r2 = radius * radius + 1; - Mutable mut = new Mutable(); - for (int px = -radius; px <= radius; px++) { - mut.setX(x + px); - int x2 = px * px; - for (int pz = -radius; pz <= radius; pz++) { - mut.setZ(z + pz); - int z2 = pz * pz; - if (x2 + z2 <= r2) { - for (int py = minY; py < maxY; py++) { - mut.setY(py); - if (world.getBlockState(mut).getMaterial().isReplaceable()) { - BlocksHelper.setWithoutUpdate(world, mut, Blocks.OBSIDIAN); + if (GeneratorOptions.replacePillars() && be_radiusInRange(radius)) { + radius--; + Structure base = StructureHelper.readStructure(BetterEnd.makeID("pillars/pillar_base_" + radius)); + Structure top = StructureHelper.readStructure(BetterEnd.makeID("pillars/pillar_top_" + radius + (spike.isGuarded() ? "_cage" : ""))); + BlockPos side = base.getSize(); + BlockPos pos1 = new BlockPos(x - (side.getX() >> 1), minY - 3, z - (side.getZ() >> 1)); + minY = pos1.getY() + side.getY(); + side = top.getSize(); + BlockPos pos2 = new BlockPos(x - (side.getX() >> 1), maxY, z - (side.getZ() >> 1)); + maxY = pos2.getY(); + + StructurePlacementData data = new StructurePlacementData(); + base.place(world, pos1, data, random); + top.place(world, pos2, data, random); + + int r2 = radius * radius + 1; + Mutable mut = new Mutable(); + for (int px = -radius; px <= radius; px++) { + mut.setX(x + px); + int x2 = px * px; + for (int pz = -radius; pz <= radius; pz++) { + mut.setZ(z + pz); + int z2 = pz * pz; + if (x2 + z2 <= r2) { + for (int py = minY; py < maxY; py++) { + mut.setY(py); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + if ((px == radius || px == -radius || pz == radius || pz == -radius) && random.nextInt(24) == 0) { + BlocksHelper.setWithoutUpdate(world, mut, Blocks.CRYING_OBSIDIAN); + } + else { + BlocksHelper.setWithoutUpdate(world, mut, Blocks.OBSIDIAN); + } + } } } } } } - mut.setX(x); - mut.setZ(z); - mut.setY(maxY); - BlocksHelper.setWithoutUpdate(world, mut, Blocks.BEDROCK); - - EndCrystalEntity crystal = EntityType.END_CRYSTAL.create(world.toServerWorld()); - crystal.setBeamTarget(config.getPos()); - crystal.setInvulnerable(config.isCrystalInvulnerable()); - crystal.refreshPositionAndAngles(x + 0.5D, maxY + 1, z + 0.5D, random.nextFloat() * 360.0F, 0.0F); - world.spawnEntity(crystal); - - if (spike.isGuarded()) { - for (int px = -2; px <= 2; ++px) { - boolean bl = MathHelper.abs(px) == 2; - for (int pz = -2; pz <= 2; ++pz) { - boolean bl2 = MathHelper.abs(pz) == 2; - for (int py = 0; py <= 3; ++py) { - boolean bl3 = py == 3; - if (bl || bl2 || bl3) { - boolean bl4 = px == -2 || px == 2 || bl3; - boolean bl5 = pz == -2 || pz == 2 || bl3; - BlockState blockState = (BlockState) ((BlockState) ((BlockState) ((BlockState) Blocks.IRON_BARS.getDefaultState().with(PaneBlock.NORTH, bl4 && pz != -2)).with(PaneBlock.SOUTH, bl4 && pz != 2)).with(PaneBlock.WEST, bl5 && px != -2)).with(PaneBlock.EAST, bl5 && px != 2); - BlocksHelper.setWithoutUpdate(world, mut.set(spike.getCenterX() + px, maxY + py, spike.getCenterZ() + pz), blockState); + else { + minY -= 15; + int r2 = radius * radius + 1; + Mutable mut = new Mutable(); + for (int px = -radius; px <= radius; px++) { + mut.setX(x + px); + int x2 = px * px; + for (int pz = -radius; pz <= radius; pz++) { + mut.setZ(z + pz); + int z2 = pz * pz; + if (x2 + z2 <= r2) { + for (int py = minY; py < maxY; py++) { + mut.setY(py); + if (world.getBlockState(mut).getMaterial().isReplaceable()) { + BlocksHelper.setWithoutUpdate(world, mut, Blocks.OBSIDIAN); + } + } + } + } + } + mut.setX(x); + mut.setZ(z); + mut.setY(maxY); + BlocksHelper.setWithoutUpdate(world, mut, Blocks.BEDROCK); + + EndCrystalEntity crystal = EntityType.END_CRYSTAL.create(world.toServerWorld()); + crystal.setBeamTarget(config.getPos()); + crystal.setInvulnerable(config.isCrystalInvulnerable()); + crystal.refreshPositionAndAngles(x + 0.5D, maxY + 1, z + 0.5D, random.nextFloat() * 360.0F, 0.0F); + world.spawnEntity(crystal); + + if (spike.isGuarded()) { + for (int px = -2; px <= 2; ++px) { + boolean bl = MathHelper.abs(px) == 2; + for (int pz = -2; pz <= 2; ++pz) { + boolean bl2 = MathHelper.abs(pz) == 2; + for (int py = 0; py <= 3; ++py) { + boolean bl3 = py == 3; + if (bl || bl2 || bl3) { + boolean bl4 = px == -2 || px == 2 || bl3; + boolean bl5 = pz == -2 || pz == 2 || bl3; + BlockState blockState = (BlockState) ((BlockState) ((BlockState) ((BlockState) Blocks.IRON_BARS.getDefaultState().with(PaneBlock.NORTH, bl4 && pz != -2)).with(PaneBlock.SOUTH, bl4 && pz != 2)).with(PaneBlock.WEST, bl5 && px != -2)).with(PaneBlock.EAST, bl5 && px != 2); + BlocksHelper.setWithoutUpdate(world, mut.set(spike.getCenterX() + px, maxY + py, spike.getCenterZ() + pz), blockState); + } } } } @@ -91,4 +137,8 @@ public class EndSpikeFeatureMixin { info.cancel(); } + + private boolean be_radiusInRange(int radius) { + return radius > 1 && radius < 6; + } } diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index f2d5f2e6..c315e530 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -39,6 +39,7 @@ public class EndTags { public static final Tag.Identified PEDESTALS = makeBlockTag("pedestal"); public static final Tag.Identified BLOCK_CHEST = makeCommonBlockTag("chest"); public static final Tag.Identified END_STONES = makeCommonBlockTag("end_stones"); + public static final Tag.Identified DRAGON_IMMUNE = getMCBlockTag("dragon_immune"); // Item Tags public static final Tag.Identified ITEM_CHEST = makeCommonItemTag("chest"); @@ -70,6 +71,12 @@ public class EndTags { return tag == null ? (Identified) TagRegistry.item(id) : (Identified) tag; } + public static Tag.Identified getMCBlockTag(String name) { + Identifier id = new Identifier(name); + Tag tag = BlockTags.getTagGroup().getTag(id); + return tag == null ? (Identified) TagRegistry.block(id) : (Identified) tag; + } + public static void register() { addSurfaceBlock(Blocks.END_STONE); addSurfaceBlock(EndBlocks.THALLASIUM.ore); @@ -117,6 +124,8 @@ public class EndTags { TagHelper.addTag(BlockTags.BEACON_BASE_BLOCKS, EndBlocks.AETERNIUM_BLOCK); TagHelper.addTag(ItemTags.BEACON_PAYMENT_ITEMS, EndItems.AETERNIUM_INGOT); + + TagHelper.addTag(EndTags.DRAGON_IMMUNE, EndBlocks.ENDER_ORE); } public static void addSurfaceBlock(Block block) { diff --git a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java index baee736f..e166410a 100644 --- a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java +++ b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java @@ -25,6 +25,7 @@ public class GeneratorOptions { private static BlockPos spawn; private static BlockPos portal = BlockPos.ORIGIN; private static boolean replacePortal; + private static boolean replacePillars; public static void init() { biomeSizeLand = Configs.GENERATOR_CONFIG.getInt("biomeMap", "biomeSizeLand", 256); @@ -50,6 +51,7 @@ public class GeneratorOptions { Configs.GENERATOR_CONFIG.getInt("spawn.point", "z", 0) ); replacePortal = Configs.GENERATOR_CONFIG.getBooleanRoot("customEndPortal", true); + replacePillars = Configs.GENERATOR_CONFIG.getBooleanRoot("customObsidianSpikes", true); } public static int getBiomeSizeLand() { @@ -123,4 +125,8 @@ public class GeneratorOptions { public static boolean replacePortal() { return replacePortal; } + + public static boolean replacePillars() { + return replacePillars; + } } diff --git a/src/main/resources/data/betterend/structures/pillars/pillar_base_1.nbt b/src/main/resources/data/betterend/structures/pillars/pillar_base_1.nbt new file mode 100644 index 0000000000000000000000000000000000000000..a1a3869d8515d8cab34f6f033c80a7f82966b97b GIT binary patch literal 1577 zcmYjP3sllq9B!4QqUE#r9}8clHSAQ7uN2LRqovI<4Yk5Fk)_L0G<;h_=dq|p^931N zr>TiTW^Sqfax()|Qky9Al^I|i6;w<~iQFICqkDemp8I>;@B8j|uJslDRiDd zxtw<8>0fk(YKyyr2^~R?D7k#9#}E63_mn;Lagay8IWTrfH!+(CH8GIWVKJutbQDX547pyMAH^GMc*)HeVp-w3V}Oq!mJqAYM{tfe&_Da-iS{ zY~Dh~6*V^R+Feyyjt!}B0SkPwdW~h{_PRm!%AlU2*+kh9N(}?fMIVDMJe=+bB@+Sh z(H1yfflRpn*+2x~ei~D<$8j!Sy1h0?DH+Az4&p-;5YVz%U3l;Oa3;G;tfO@BG7vuTl)gw&fH@gNe?D3c^+} ziVwLtctuG7e~0%GWg%pAF(MdaU*Zqwc1}2y9D%+;eK-kfOx7IRlyaNJOp{L_RH~d} zM=*nrA{_6@(rZPT5HHOb<`5o1Faa`%!Gx%zvdq_B26$$tQ~g>|X2daO2BGY~fVC$m?hKXl0^tSH{W%^m+SJa_NM8 zA7{hVl_%&3{9Y4rc9gAXyd6ap-PN}?Y4nZ6aCcv8IqUvvP?*j+>@1RSZwlD3gB zTKyO%^`KEx=l95@aWZU#B(u~BgnT&hDp!eCnYH@s@3IARW-jB{2W0s;HVcff`Uwvt zwYYr4e#c(Q^-;s+vp8f~`_ZT#cN}vK!`QP|KkMmrQ9dTC#5~(=Fhl#cr!)KK!bEo7)mKkHQOqdI?GeMVPD` zB9B}<6-zUX+HA{zL8ccG4yCxO7s3uIKiuth4f?vwI9$V}H%v1S5ck`;BE!-$F^cq# zdS@=dMQ=Q#^z0b<#azM#-Ejl+@c~VG)27JC8s}hGZR9=)=*7vah!fP^(mW50b8K-{ z*J@H)ydO#g<1rtGkx#M!{>PrC-aG;(yVUD_Mz3?WdL%1DJM%^|J;nP`E6Jp|WiE71 zk|lz3nx~3l^9RX8-q*Cg>7~ooqiv(kBUd@RrG%+zNxXWm9D6~lIIHPf;!f>|X_uqt+EHZM$}zRed|p#dFoF FzX9x%8cqNJ literal 0 HcmV?d00001 diff --git a/src/main/resources/data/betterend/structures/pillars/pillar_base_2.nbt b/src/main/resources/data/betterend/structures/pillars/pillar_base_2.nbt new file mode 100644 index 0000000000000000000000000000000000000000..7f8da56febea0bf41641e488d13c2350940e49ff GIT binary patch literal 3144 zcmZWr3p|wR8gJW^-91Js8zy0CL#5mrGP$IYvZjzi9W$H}Ba?M7$c)VIWSeQQsj#MT z+mAMh#^##KB*%~lgUPIEGId{Pmi5 zzvgVu@Mo=?FYSnEH5lWq6J>_c+8pLx4&* z`J{*DYiS14wz2!7IHuH4_C43a=MB|iy?cdSS?yANj{l?JKOC}SrO)RCevU1-8lLGp zEXwxc9xkUGT{ypQ%<*oPG_@+Mwl^+npmVvP<@>}j#4Q`vR`baxC2B@J+doQ6H|lR# z%Zg;?=MqbgvAFh`%nk7O81;N6xoVRH!_OrVa>L&IC?pikWoeVf*k3X@n)J3(lW2a; zkud6KMC0*mu*%EK#f^h+to~zrL@xRq8b5)5fP=atwr z6x)nu4r7P9T$&4)3W;=oE zawAFsUSkmQr57y8OeT;%7c1IPCwl@qk!j~QR@~@J!XP@FZ@K~ajkBE|oL}Xu13wHw z+H58;-m3x3@l@XteK5?>+XK9rCFo#>UbYuD^06lQAx8Q5%S_5OHQ;igo)xmZQA1&BbXo@dz_x8V1jD?qK>Ofq z%a6lm-pz1;_fNPFL9EuMZon-#EtbiA5_6{hU3Nej1c^(7NS0)r<0dhj`8QLQY$Thx zspRJjPg&dTI60kt_7_)vZzY67bXb0qt7_4$G&K@|R+y%}sM(+a2oa2&IsAk~6RiVW zLv-vIN@bZCgPq|jBc@mK_=w{a-}dp}7;ad&sBmB4WmO=Q5j}VV+;S(l<$wjqpI{b% zsg?4mK=@e~Pzc1q_l5Xwg*5LbFjim74SnqVU{a{Vq|i$O`wi32>SF;4jmB$zAbu)% z^rMBuz*?^kC_oL?rGx!4Vmz7VDLW&uL!$g0(f2a}C3VFllvTR4C^y5iYg|q4p*b0# z%TdD-@=bTr%P2(`m{3VVP(Jrq%Ak6XyeIGU)b6EI1e4-4M*x{hK`;Z%b=F&^KRx?1 zP(237`5s8vltF_a`7W?SKz?Ot(A1!4co&R=gt{s4&iViO^ruByz_FJZ&%?VAKa|86 z7Ht5EAjfyWo&8;a(k5YnE3~B9!`qk!6jz`SWxYjt8QO{u^(UAx(m0QA6D`MYq)<5e z_I^Z=A@%u$v%G{zp9z)lx)y4W%Qj)+Dof&+P`wBvsWd*WxqXsgl6*bJBK?qSopzh2 zdqeqGws&R=#gBL%ou*5tYS#~AL7RuMLj5*tciMbofC;7t{VfK0y${lEyE;^^P2pz7 zYYx7_BCmsEL2>nS=mZCp$pSbA3P|tIY3$)~v zv#Bl$<18Vxm$9I%So8S(M?oLUvlcgEh}9G7InReuwb7Yw zv{31O#Ws3p5PYt?TUR7QR+)WtZFCfD9p$N?(JC0Hr!pP7)7q!jB}fhBzGeZi<H82EJ;rRxkaL<>VT0_1rI!A0CExVIHV!2b_0cW$(e&Up`8cFF|_ z)=qMSi@lILr3=g#y7s@WK}~I^&talu|hTZ$ODPIqjPDC2^W zGlJ}$D52%1r(z^3)}r^X6}_o2iG$yTp-p#&AW8;-?r635er7n39^4?m*!Qs zSe+-?CI0ny~b*Px9DWyf9l6e2$$?E~O0!cAJ;d zMtXcgZ%v#TL91Y)A&msB-;3Xu#fU?H=KGaD&(}^9Wz1|!z%l`YvtT|TR zoT&1LE8ix_UGn-}tXm4nyexC#Fjl`re@XdbOK$Sayy_1w4ar(}iQsVTn?8eTo$8znw>9%S4@4WUU%c{MJn^gMe5NE>eIQr z8SdU;F3-7kHlbDMkh#EO8T>(;Rn~4UX_{FItc>=>7gnurpAhu@v#3~1qbG49C4A~n z;Lheh@KlPSssy9+F+6^`*TBTMdxH2?wNy6umOGD0Q&uU;!j!W?^S>|sODxW#4LHOv z4wD`1&ShnW58xDo!#a+VX`5yAt61r@WN~nQIqv@cNrx$Gbu-C=Y<~K}K4mTS&1}1> zC8}4F%6K&SXZ^F>J&V!~<%6;5^-|f(cD^{iPCymwJ6sSYoU2{vP*&*f+366jXJ+G& zlbZFsuuBS!P21@2@d@jRi9$DsjA^BnuoeyGs^BV-Hh0oqEh_0c6|*486Q0bYYnue&R<2Ex z`54nu)JK+E^%>Pv&9`2Yh!UYHR8*{0V$%2)qdxANvR!un&w0-K{(pJTIlptxd;T#` zes|aABgyN$Wa?>rDprNFJ!WZ&g5j zB3S*(u#Be-8u=_ijiv3sz2@vQx{9zVy6RB<4INUHm-AB#(J5IJdVtzx*XG0scgVzL z!MwMNzqZG!t#`X9T$zcY9a3#TqS)<_d}=7FUq%t;NQh2YHY7Gtq%)#w{U%<7OcWI7 zNP138=MTo5lQ1tY-H1eGm=uyAV|(Z(RJ~wnW#0&%ALfV&Q{Q7L)=}-|C^Jq>`|ddc zga&6@a~)GL#<+u?W=SH9F_rzy6}+*%%#s8cE2xA}aDzv&gGz{IKNrGeU%ad^02mPlVi!vjC9^_5;q@LPh zXU#<$0m^8jCcK2;c?1yj{P$8RZ1T)2^5_g9g=HWis^2aEXIQtPc@!aI)23~XkTNEK zb>dKcciM5NTU%*GzQ?%=Vf{6RpCq_OG z6dlsphH~opImg-riBh;P{mg(F!l_E8tba@5p>yi;nDH$Tf zB?>O#))xR%$~YXCUl`9y$`RN<`A@)pYQEwK3ZE*Hm%%i`B!Mucy4W%6VX~m$@8Hhi zKhjc!u|Z4ucS#V|uHLx%K!kp^=Q>Wc6ZU=tC~s3UD>%fz^mMl?Is&+9z6nNVT0b)G z^l2mI1-COw2@&9t0KWx(8qO#t>(U)-_CO_hu|yiI<9T!e9G5fnHIHJ=plU_-sEj&b zO|u8HkYgH-r(F=9kP^oAgSdrPhH)LUKl4%GF1w4_H~)D?9U|JAdr}?wGdVpQDRpkk0nvxz zc{FhT(HXt%@8|#Lt~V~`D_59CF8qH&y@MZY=eJ3V?;<#n+4*~N-k>Vup9X;(zN?mk zx!fdbb8JP7DV1sCZ9=(o4|!GREp;8Jg@Zrt<#gl-gqEbcIR9UI{LsuylZgj&9+gdt zaVEHcv%u9weTgzfy3Y>44|aH=O)1tN>kE+yZbpY!C3b5AE)LCV*@FAv#_HR4ZCdF$ zS<$EA^=RHbxuBdeF=jXTpd&1}dQ6;FeZ*%gG@AQRWz|<5;g>&=1Kc zHR&L5u)gCa`tR3iWjGH2=kz{51i;`arKuip*Pk!|KpjpQ_(#C~x43U9j3Sy7*kVGE z9l79YDEK6^y`-42J@Y-JnuPf;+?aj_q)eRuSdSm+hvcctpfNj?$`y3gJ#U+;F(6go z{53raG!y(6kMMKwcZ3cP(riN!1-W4)PZ>3A>kpFyG7s*nybTEwGK^0P~gG=*|vqp!?4 zm3>Hxsh}40qwrZowQcLdJ9kFX9>@hS4LnJ-ec{f`c8^?G!mn1n&VDlO8L-5KX;c$% z4HHnPTHHOwC;H1KMikux%ST)DD(538P{Cqg|J3^Hr(2QJkq_Z78G|S(&yvH6tDxTAW#mY`Ps( zusS>DUNi7U(V)2Rc4BG1lX1L(b1}C8i*I+dRqo0~{wNv4*1F@-m3gd4P=FPRz%Ati1_r)oS_|e}6*Qm>bpA?hJ7j>ux z^;3<`M;6zg+gj1voh#?qU@-|X%4^Ye1XW>CG`wFkAa|H{hR(`3s)OUKpfK^gQ!s_w kXqeSaxLzL2qyI{MuJs@45)3xKxA7;|oG$FoA-i_{7gIZd!2kdN literal 0 HcmV?d00001 diff --git a/src/main/resources/data/betterend/structures/pillars/pillar_base_4.nbt b/src/main/resources/data/betterend/structures/pillars/pillar_base_4.nbt new file mode 100644 index 0000000000000000000000000000000000000000..9a1091fb73aefe9f6e9e49ab200a7403e74142fa GIT binary patch literal 2487 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 X9uG`)mrW1*VlDQH{h9X3%a;8QUS064 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/betterend/structures/pillars/pillar_top_1.nbt b/src/main/resources/data/betterend/structures/pillars/pillar_top_1.nbt new file mode 100644 index 0000000000000000000000000000000000000000..05805e9c73b5d8a2317833ee7d36e2a283bc1138 GIT binary patch literal 2564 zcmZ`(eLU0q9#3&RE!1eb$-sf z-6&I@IyxRU)?{fkz1B#K=3(Y>oEb3>_xq#sdfn6Ob@#`6-|y%5`+Pp{&*%O5{E)YF z)~)^6_uE3P_$JA9W5qw*X5O6GaTPwOQF$P9-8FA`9GZ%7-)YaBD760d+h%6yFI|;isjEGqs)^oI!0y&4V)-^y(y{g_8xXo48`T$DUectuX7{G~A?Y~%WcfcX+)ng25f zR|(O<@jYkK!FMZ)voe%TnO1LK>hHYL#mRliKBuz6?QR_{`P|a&)$KQ{QcZ=6i0qp2 zhV2iZB9hgkETKRBH}!mhvzmW&g`!d@8Wy{6A(t2Cu4KPj6m(BYvqDX4UkrUa86Y{I zh%>m=m76aZiSmrpJ|JMH`H%b0DfnZo36&^5_mJY*-!dbF1mDl6#O>o{m>~4FBcwZ+ zJv`D+Zr55yG_ph+j=US#M}yB?UA+w?V}_PnIvyBzc&77Y<;ER%MkXF0Bezsu1nsA90JQBh%}&AZ zV=#lz*fwJOfEJF}ekQ%sWPHrXtE#!dM#dl0>?!s$XT zx11RaK%orD|8isoE60E*Yto$kFPkO&D+C=tq#S-b_h)ZNv; zVj+OjSpHY91h4;O|8YAP1Wf0G#d@{1Rfh-q!LbH!6zw zcI{@Yxvee1=#Z6D`~bDkj!`h>Sbg&!bn#wMh-Ge|`kS@C=BB})jbQ3fvxT$?-ByHY z^^3=xhy!v>e^LZUH1S;soB2tgA0^dlbAEt*Ri0q=-fR>kcr)QOzo^0ExG}R9?c=CR z_?_gLq}P;h zi6oy8W5(;!HwSM*OP!GBM`>>8M~$Y}D%KBZHtXZ>lBdF!unJN{FL$v1ddvL!ETz`Y z;jw?7b0tM^8V8|q#g?Wt4)$X#3>Zul8ViV1>I=2;?uHD%<*O}2hHKWlpY-u>5zx5? zr-6U#$Y4gJu?k<0CP&k1Bz4&OG_2c@r`&8yok+2srbq4#Idq|yTfUSzzn(YiDii2% zXrBZ+6j~u)k5X#H*9`|<(d94;`T9^Y;Ony-!@Y-y_ev@|KINqggj&js)rMTzABOjX z(2Typat1XlUz=Zd(mD?woTQyZ2Hrw44e%Q>WY5K4kI;4-J9M{6# zEiB$VbCs-m8(|J(Ma#AWaI3#gR)yY-Mwj+}2c}P4XWbjVhYm)9s7E>OlCf#V)Pio( zPq3iFK~Lz2e#jdd{9P^{)^ZKr==~ul)3b_JM*#E~ZQdx(33)ewz)l%{cp5}MT0el_ z0Wz_TXYK%2a(jpspk@P6Lp4GEZB>XF&!qh0?Hj-#3St3|9Ec2Vm5dGO8f6Z2^{gU4 zh9CPQ$P{NQx7EUd6~BQwn;MvmaZeq%fgz?s-q1!r(F9d$gVfnd5`n!>0l<6JUs{7H z0GE{E{?p;Bwzo-@6hpSRu8bh`Ng}JvM{}$h1DN64U@=My`MQ)i+z2j!K3PE1x<2y% zQEtvLB%ck9fM=39dOR@&NO!q`2MvJpYNHK>zk>=CQXh^nZ#2QZ{$3KK1ds!4%!jRp zAa=JeBN{zUJ1SpV(j3sF-Zvq0N#ACVl-~bSep4_AsC>cUIsRf)@0ziW0SD?_PTd`%DUt0>y-TFZs z|34$!cF%gy<~2S*2~DP~Ze7^u$h);h%3X7=Vk zTYh8ARn<`>FxP#Oh6MEPp0KeOC#JarDEj0c2NugqvgPx5aYn)U*}i8V^A0L@9O5u6 zXHUebrd74eMZRUt(kZDrqtk!CcS7{MO8PK311V-D)<0r4OxD#E6(m~Ez3%B48+&OW zk(3ggXa);W(UBrQljT}sSZ)~Lt%lvcQAN3L_Ph=mdhK)dSaI~FPI^I2N>D9juDPc#-Sf%{299k0mlG}A-MeC& z-mc4tMWH9tc_l8k*sc-&jil}62#b?famG7g?w!c{{K?xss$y2mVeutvX1!eeYPPd| zr7vq@Fx*4_L<~?cI@L7#5wC`l8NdD)e~ZVpqq(6J+NFu?ttpmxbe& hkUG_b`qGqzj1vt$QI}4&9ULvns_h0<_Nd5o- literal 0 HcmV?d00001 diff --git a/src/main/resources/data/betterend/structures/pillars/pillar_top_1_cage.nbt b/src/main/resources/data/betterend/structures/pillars/pillar_top_1_cage.nbt new file mode 100644 index 0000000000000000000000000000000000000000..eb5a52de0b1e9795ac1e551b8d4e84f80ef33998 GIT binary patch literal 2878 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/betterend/structures/pillars/pillar_top_2_cage.nbt b/src/main/resources/data/betterend/structures/pillars/pillar_top_2_cage.nbt new file mode 100644 index 0000000000000000000000000000000000000000..97d401e6c072204cd82f8ca2432533c6782784cf GIT binary patch literal 8246 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 DSx6ww literal 0 HcmV?d00001 diff --git a/src/main/resources/data/betterend/structures/pillars/pillar_top_3.nbt b/src/main/resources/data/betterend/structures/pillars/pillar_top_3.nbt new file mode 100644 index 0000000000000000000000000000000000000000..81ffb032d13815b80c2e4f7f0b2d9b8f270c156c GIT binary patch literal 4025 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/betterend/structures/pillars/pillar_top_3_cage.nbt b/src/main/resources/data/betterend/structures/pillars/pillar_top_3_cage.nbt new file mode 100644 index 0000000000000000000000000000000000000000..aca9c04f48d45fa3b072a04c0d82da8e41bc3a75 GIT binary patch literal 4762 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/betterend/structures/pillars/pillar_top_4.nbt b/src/main/resources/data/betterend/structures/pillars/pillar_top_4.nbt new file mode 100644 index 0000000000000000000000000000000000000000..8a6c0a05a7af5fe3cc36a40ab2f5c368c341f196 GIT binary patch literal 8976 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 T3*OV9x&ojQ<*{ literal 0 HcmV?d00001 diff --git a/src/main/resources/data/betterend/structures/pillars/pillar_top_4_cage.nbt b/src/main/resources/data/betterend/structures/pillars/pillar_top_4_cage.nbt new file mode 100644 index 0000000000000000000000000000000000000000..fffce784059a4d880a33d12d6a0a4de1740aaa25 GIT binary patch literal 10421 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 nq|(Toy`; Date: Fri, 19 Mar 2021 10:44:43 +0300 Subject: [PATCH 371/463] Options path change --- .../ru/betterend/world/generator/GeneratorOptions.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java index e166410a..0986cb05 100644 --- a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java +++ b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java @@ -30,8 +30,8 @@ public class GeneratorOptions { public static void init() { biomeSizeLand = Configs.GENERATOR_CONFIG.getInt("biomeMap", "biomeSizeLand", 256); biomeSizeVoid = Configs.GENERATOR_CONFIG.getInt("biomeMap", "biomeSizeVoid", 256); - hasPortal = Configs.GENERATOR_CONFIG.getBooleanRoot("hasPortal", true); - hasPillars = Configs.GENERATOR_CONFIG.getBooleanRoot("hasPillars", true); + hasPortal = Configs.GENERATOR_CONFIG.getBoolean("portal", "hasPortal", true); + hasPillars = Configs.GENERATOR_CONFIG.getBoolean("spikes", "hasSpikes", true); hasDragonFights = Configs.GENERATOR_CONFIG.getBooleanRoot("hasDragonFights", true); swapOverworldToEnd = Configs.GENERATOR_CONFIG.getBooleanRoot("swapOverworldToEnd", false); changeChorusPlant = Configs.GENERATOR_CONFIG.getBoolean("chorusPlant", "changeChorusPlant", true); @@ -50,8 +50,8 @@ public class GeneratorOptions { Configs.GENERATOR_CONFIG.getInt("spawn.point", "y", 65), Configs.GENERATOR_CONFIG.getInt("spawn.point", "z", 0) ); - replacePortal = Configs.GENERATOR_CONFIG.getBooleanRoot("customEndPortal", true); - replacePillars = Configs.GENERATOR_CONFIG.getBooleanRoot("customObsidianSpikes", true); + replacePortal = Configs.GENERATOR_CONFIG.getBoolean("portal", "customEndPortal", true); + replacePillars = Configs.GENERATOR_CONFIG.getBoolean("spikes", "customObsidianSpikes", true); } public static int getBiomeSizeLand() { From af673baf1f1e36c2f4d1a6f8c72bd8d3532dbbe4 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 19 Mar 2021 11:01:46 +0300 Subject: [PATCH 372/463] Height fix --- .../java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java index 28be0c91..35d70225 100644 --- a/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java @@ -44,7 +44,7 @@ public class EndSpikeFeatureMixin { int z = spike.getCenterZ(); int radius = spike.getRadius(); int minY = world.getChunk(x >> 4, z >> 4).sampleHeightmap(Type.WORLD_SURFACE, x & 15, z); - int maxY = minY + spike.getHeight() - 30; + int maxY = minY + spike.getHeight() - 64; if (GeneratorOptions.replacePillars() && be_radiusInRange(radius)) { radius--; From 0e077794fc0da6640a624c1ffece06ea6784d1e2 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 19 Mar 2021 11:17:50 +0300 Subject: [PATCH 373/463] Small fixes --- src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java | 4 ++-- src/main/java/ru/betterend/util/BonemealUtil.java | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java b/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java index 85775e93..d3cba539 100644 --- a/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java @@ -15,11 +15,11 @@ public class TenaneaSaplingBlock extends FeatureSaplingBlock { @Override protected Feature getFeature() { - return EndFeatures.TENANEA.getFeature(); + return EndFeatures.LUCERNIA.getFeature(); } @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return world.getBlockState(pos.down()).isOf(EndBlocks.PINK_MOSS); + return world.getBlockState(pos.down()).isOf(EndBlocks.RUTISCUS); } } diff --git a/src/main/java/ru/betterend/util/BonemealUtil.java b/src/main/java/ru/betterend/util/BonemealUtil.java index 178fa951..5c84b3d3 100644 --- a/src/main/java/ru/betterend/util/BonemealUtil.java +++ b/src/main/java/ru/betterend/util/BonemealUtil.java @@ -48,6 +48,10 @@ public class BonemealUtil { addBonemealGrass(EndBlocks.RUTISCUS, EndBlocks.LUTEBUS, 0.2F); addBonemealGrass(EndBlocks.RUTISCUS, EndBlocks.LAMELLARIUM); + addBonemealGrass(EndBiomes.LANTERN_WOODS, EndBlocks.RUTISCUS, EndBlocks.AERIDIUM, 0.2F); + addBonemealGrass(EndBiomes.LANTERN_WOODS, EndBlocks.RUTISCUS, EndBlocks.LAMELLARIUM); + addBonemealGrass(EndBiomes.LANTERN_WOODS, EndBlocks.RUTISCUS, EndBlocks.BOLUX_MUSHROOM, 0.05F); + addBonemealGrass(EndBlocks.SANGNUM, EndBlocks.GLOBULAGUS); addBonemealGrass(EndBlocks.SANGNUM, EndBlocks.CLAWFERN); addBonemealGrass(EndBlocks.SANGNUM, EndBlocks.SMALL_AMARANITA_MUSHROOM, 0.1F); From 72113034eaa5b269beef377fb1e51a1e6861605c Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 19 Mar 2021 20:51:13 +0300 Subject: [PATCH 374/463] Mixin correction --- src/main/java/ru/betterend/item/EndArmorItem.java | 6 +++--- .../betterend/mixin/common/ArmorItemAccessor.java | 6 +++--- .../block/cave_pumpkin_lantern_bottom.png | Bin 0 -> 240 bytes .../textures/block/cave_pumpkin_lantern_side.png | Bin 0 -> 225 bytes .../textures/block/cave_pumpkin_side.png | Bin 0 -> 219 bytes .../betterend/textures/block/cave_pumpkin_top.png | Bin 0 -> 229 bytes src/main/resources/betterend.mixins.common.json | 4 ++-- 7 files changed, 8 insertions(+), 8 deletions(-) create mode 100644 src/main/resources/assets/betterend/textures/block/cave_pumpkin_lantern_bottom.png create mode 100644 src/main/resources/assets/betterend/textures/block/cave_pumpkin_lantern_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/cave_pumpkin_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/cave_pumpkin_top.png diff --git a/src/main/java/ru/betterend/item/EndArmorItem.java b/src/main/java/ru/betterend/item/EndArmorItem.java index 4d95d2c4..58688011 100644 --- a/src/main/java/ru/betterend/item/EndArmorItem.java +++ b/src/main/java/ru/betterend/item/EndArmorItem.java @@ -28,20 +28,20 @@ public class EndArmorItem extends ArmorItem implements Patterned { return; } - Multimap attributeModifiers = accessor.getAttributeModifiers(); + Multimap attributeModifiers = accessor.be_getAttributeModifiers(); // In case Mojang or anyone else decided to fix this if (attributeModifiers.keys().contains(EntityAttributes.GENERIC_KNOCKBACK_RESISTANCE)) { return; } - UUID uuid = accessor.getModifiers()[slot.getEntitySlotId()]; + UUID uuid = accessor.be_getModifiers()[slot.getEntitySlotId()]; // Rebuild attributeModifiers to include knockback resistance ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); builder.putAll(attributeModifiers); builder.put(EntityAttributes.GENERIC_KNOCKBACK_RESISTANCE, new EntityAttributeModifier(uuid, "Armor knockback resistance", knockbackResistance, EntityAttributeModifier.Operation.ADDITION)); - accessor.setAttributeModifiers(builder.build()); + accessor.be_setAttributeModifiers(builder.build()); } @Override diff --git a/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java b/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java index 5c340f88..39046ec7 100644 --- a/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java @@ -12,11 +12,11 @@ import java.util.UUID; @Mixin(ArmorItem.class) public interface ArmorItemAccessor { @Accessor("MODIFIERS") - UUID[] getModifiers(); + UUID[] be_getModifiers(); @Accessor("attributeModifiers") - Multimap getAttributeModifiers(); + Multimap be_getAttributeModifiers(); @Accessor("attributeModifiers") - void setAttributeModifiers(Multimap attributeModifiers); + void be_setAttributeModifiers(Multimap attributeModifiers); } diff --git a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_lantern_bottom.png b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_lantern_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..6c35ab7d695c9bf1678c27f018bb04511826b498 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~xd5LKS0LRU z;kKkG@IX)Wg)PlDPE5afa{B$-t6w}l^zp+jsl^|RfGW63g8YIR{=-0Br$`u3G|SV) zF+^f&YJVVKg8_$gsxITZ`o!+pZn7`gD;*ji-#9c^g6$T=UFne21zZzDc_Wm3JULkx zs7OrW5|Ehqu)y=Azy$dOU7@ndl6Ie~fwoQN4`d#ur_5xtS^jdf+4Wm*H@yAwbIzZ4 b&+7`AoS(C}Twk*liWS0LRU z;kKkGa8rHQfu86KTbgg2n11u*^!vA0zj%7+*mY`2{olhlAR(+N(g} za8DP<5Q(XC&j)ffIB>9BxLP8y_kUyYs{REE8LBoPYT2 z1Y&z$txG87dE&rTq;Q{sSs;NS|AX!0jbR5@Bs`HkQ*xxV`{pgimtHJgYsA$~01 MboFyt=akR{00O^S&j0`b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_side.png b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_side.png new file mode 100644 index 0000000000000000000000000000000000000000..a91ba7500c568b382f03a0f2de09eaf4c3299cab GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~xd5LKS0LRU z;kKkG@IX&=t(e^m1(ySAA$wgSZ}_G@NUsTvU-=uTf~zFRFPPy!4AgasgaJiEJzX3_ zB&M$I_vUIa;BmQZ_W9*s{Tv;q(1PdDzH&1il>DOP7jGABzU&etX5-qnY(fI>1a;AE zMuD>$c*ENTx5ge7)ju$+ewpsOMdJP&>wgNpKV?_NP_cyZjs(ZiKR^o@JYD@<);T3K F0RZ*(O*8-i literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_top.png b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_top.png new file mode 100644 index 0000000000000000000000000000000000000000..821029c3ee0b59b7f7b814b80db9dfd4cf1a1c9f GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~p#Yx{S0G(0 zW;a8@<$zkqUYE!lzNsSB3LQXEwvr&fV21x7P*wThA5bLU)5S4FVrr;=G~WRQo~*`u z|4%jRMPK1xY!jv7 Date: Sat, 20 Mar 2021 06:13:11 +0300 Subject: [PATCH 375/463] Cave pumpkin --- .../ru/betterend/blocks/BlockProperties.java | 2 + .../ru/betterend/blocks/CapsacisCapBlock.java | 35 ------- .../ru/betterend/blocks/CavePumpkinBlock.java | 65 +++++++++++++ .../blocks/CavePumpkinVineBlock.java | 70 ++++++++++++++ .../blocks/basis/EndPlantWithAgeBlock.java | 3 +- .../basis/UnderwaterPlantWithAgeBlock.java | 3 +- .../java/ru/betterend/item/EndArmorItem.java | 5 +- .../mixin/common/ArmorItemAccessor.java | 12 ++- .../mixin/common/EndPortalFeatureMixin.java | 2 +- .../mixin/common/EndSpikeFeatureMixin.java | 21 +++- .../mixin/common/ServerWorldMixin.java | 2 +- .../ru/betterend/recipe/CraftingRecipes.java | 2 + .../java/ru/betterend/registry/EndBlocks.java | 4 + .../java/ru/betterend/registry/EndItems.java | 1 + .../java/ru/betterend/util/WorldDataUtil.java | 16 ++++ .../world/generator/TerrainGenerator.java | 4 +- .../betterend/blockstates/cave_pumpkin.json | 6 ++ .../blockstates/cave_pumpkin_seed.json | 20 ++++ .../materialmaps/block/cave_pumpkin.json | 14 +++ .../betterend/models/block/cave_pumpkin.json | 89 +++++++++++++++++ .../models/block/cave_pumpkin_small.json | 90 ++++++++++++++++++ .../models/block/cave_pumpkin_vine_1.json | 6 ++ .../models/block/cave_pumpkin_vine_2.json | 6 ++ .../models/block/cave_pumpkin_vine_3.json | 6 ++ .../models/block/cave_pumpkin_vine_4.json | 6 ++ .../models/block/cave_pumpkin_vine_5.json | 6 ++ .../models/block/cave_pumpkin_vine_6.json | 6 ++ .../models/block/cave_pumpkin_vine_7.json | 6 ++ .../models/block/cave_pumpkin_vine_8.json | 6 ++ .../betterend/models/item/cave_pumpkin.json | 3 + .../models/item/cave_pumpkin_seed.json | 6 ++ .../block/cave_pumpkin_lantern_side.png | Bin 225 -> 227 bytes .../textures/block/cave_pumpkin_side.png | Bin 219 -> 231 bytes .../textures/block/cave_pumpkin_stem_0.png | Bin 0 -> 388 bytes .../textures/block/cave_pumpkin_stem_1.png | Bin 0 -> 244 bytes .../textures/block/cave_pumpkin_stem_2.png | Bin 0 -> 245 bytes .../textures/block/cave_pumpkin_stem_3.png | Bin 0 -> 248 bytes .../textures/item/cave_pumpkin_pipe.png | Bin 0 -> 240 bytes .../textures/item/cave_pumpkin_seed.png | Bin 0 -> 283 bytes .../textures/item/shadow_berry_seeds.png | Bin 212 -> 199 bytes 40 files changed, 474 insertions(+), 49 deletions(-) delete mode 100644 src/main/java/ru/betterend/blocks/CapsacisCapBlock.java create mode 100644 src/main/java/ru/betterend/blocks/CavePumpkinBlock.java create mode 100644 src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java create mode 100644 src/main/resources/assets/betterend/blockstates/cave_pumpkin.json create mode 100644 src/main/resources/assets/betterend/blockstates/cave_pumpkin_seed.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/cave_pumpkin.json create mode 100644 src/main/resources/assets/betterend/models/block/cave_pumpkin.json create mode 100644 src/main/resources/assets/betterend/models/block/cave_pumpkin_small.json create mode 100644 src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_1.json create mode 100644 src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_2.json create mode 100644 src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_3.json create mode 100644 src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_4.json create mode 100644 src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_5.json create mode 100644 src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_6.json create mode 100644 src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_7.json create mode 100644 src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_8.json create mode 100644 src/main/resources/assets/betterend/models/item/cave_pumpkin.json create mode 100644 src/main/resources/assets/betterend/models/item/cave_pumpkin_seed.json create mode 100644 src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_0.png create mode 100644 src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_1.png create mode 100644 src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_2.png create mode 100644 src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_3.png create mode 100644 src/main/resources/assets/betterend/textures/item/cave_pumpkin_pipe.png create mode 100644 src/main/resources/assets/betterend/textures/item/cave_pumpkin_seed.png diff --git a/src/main/java/ru/betterend/blocks/BlockProperties.java b/src/main/java/ru/betterend/blocks/BlockProperties.java index 0e461467..331980be 100644 --- a/src/main/java/ru/betterend/blocks/BlockProperties.java +++ b/src/main/java/ru/betterend/blocks/BlockProperties.java @@ -18,6 +18,7 @@ public class BlockProperties { public static final BooleanProperty IS_FLOOR = BooleanProperty.of("is_floor"); public static final BooleanProperty NATURAL = BooleanProperty.of("natural"); public static final BooleanProperty ACTIVE = BooleanProperty.of("active"); + public static final BooleanProperty SMALL = BooleanProperty.of("small"); public static final IntProperty DESTRUCTION_LONG = IntProperty.of("destruction", 0, 8); public static final IntProperty DESTRUCTION = IntProperty.of("destruction", 0, 2); @@ -26,6 +27,7 @@ public class BlockProperties { public static final IntProperty COLOR = IntProperty.of("color", 0, 7); public static final IntProperty PORTAL = IntProperty.of("portal", 0, EndPortals.getCount()); public static final IntProperty SIZE = IntProperty.of("size", 0, 7); + public static final IntProperty AGE = IntProperty.of("age", 0, 3); public static enum TripleShape implements StringIdentifiable { TOP("top"), diff --git a/src/main/java/ru/betterend/blocks/CapsacisCapBlock.java b/src/main/java/ru/betterend/blocks/CapsacisCapBlock.java deleted file mode 100644 index a0ed6f46..00000000 --- a/src/main/java/ru/betterend/blocks/CapsacisCapBlock.java +++ /dev/null @@ -1,35 +0,0 @@ -package ru.betterend.blocks; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.MaterialColor; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.IntProperty; -import ru.betterend.blocks.basis.BlockBase; -import ru.betterend.noise.OpenSimplexNoise; -import ru.betterend.util.MHelper; - -public class CapsacisCapBlock extends BlockBase { - private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); - public static final IntProperty COLOR = BlockProperties.COLOR; - - public CapsacisCapBlock() { - super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK).materialColor(MaterialColor.MAGENTA)); - } - - @Override - protected void appendProperties(StateManager.Builder stateManager) { - stateManager.add(COLOR); - } - - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - double px = ctx.getBlockPos().getX() * 0.1; - double py = ctx.getBlockPos().getY() * 0.1; - double pz = ctx.getBlockPos().getZ() * 0.1; - return this.getDefaultState().with(COLOR, MHelper.floor(NOISE.eval(px, py, pz) * 3.5 + 4)); - } -} diff --git a/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java b/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java new file mode 100644 index 00000000..9cc43f34 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java @@ -0,0 +1,65 @@ +package ru.betterend.blocks; + +import java.util.Collections; +import java.util.List; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.ShapeContext; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.context.LootContext; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.BooleanProperty; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.BlockView; +import ru.betterend.blocks.basis.BlockBaseNotFull; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.registry.EndBlocks; + +public class CavePumpkinBlock extends BlockBaseNotFull implements IRenderTypeable { + public static final BooleanProperty SMALL = BlockProperties.SMALL; + private static final VoxelShape SHAPE_SMALL; + private static final VoxelShape SHAPE_BIG; + + public CavePumpkinBlock() { + super(FabricBlockSettings.copyOf(Blocks.PUMPKIN).luminance((state) -> state.get(SMALL) ? 10 : 15)); + setDefaultState(getDefaultState().with(SMALL, false)); + } + + @Override + protected void appendProperties(StateManager.Builder stateManager) { + stateManager.add(SMALL); + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { + return state.get(SMALL) ? SHAPE_SMALL : SHAPE_BIG; + } + + @Override + public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + return state.get(SMALL) ? Collections.singletonList(new ItemStack(EndBlocks.CAVE_PUMPKIN_SEED)) : Collections.singletonList(new ItemStack(this)); + } + + static { + VoxelShape lantern = Block.createCuboidShape(1, 0, 1, 15, 13, 15); + VoxelShape cap = Block.createCuboidShape(0, 12, 0, 16, 15, 16); + VoxelShape top = Block.createCuboidShape(5, 15, 5, 11, 16, 11); + SHAPE_BIG = VoxelShapes.union(lantern, cap, top); + + lantern = Block.createCuboidShape(1, 7, 1, 15, 13, 15); + cap = Block.createCuboidShape(4, 12, 4, 12, 15, 12); + top = Block.createCuboidShape(6, 15, 6, 10, 16, 10); + SHAPE_SMALL = VoxelShapes.union(lantern, cap, top); + } +} diff --git a/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java b/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java new file mode 100644 index 00000000..732497db --- /dev/null +++ b/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java @@ -0,0 +1,70 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.minecraft.block.AbstractBlock; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.ShapeContext; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.BlockView; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.WorldAccess; +import net.minecraft.world.WorldView; +import ru.betterend.blocks.basis.EndPlantWithAgeBlock; +import ru.betterend.registry.EndBlocks; + +public class CavePumpkinVineBlock extends EndPlantWithAgeBlock { + private static final VoxelShape SHAPE = Block.createCuboidShape(4, 0, 4, 12, 16, 12); + + @Override + public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + BlockState down = world.getBlockState(pos.up()); + return isTerrain(down); + } + + @Override + public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { + int age = state.get(AGE); + BlockState down = world.getBlockState(pos.down()); + if (down.getMaterial().isReplaceable() || (down.isOf(EndBlocks.CAVE_PUMPKIN) && down.get(BlockProperties.SMALL))) { + if (age < 3) { + world.setBlockState(pos, state.with(AGE, age + 1)); + } + if (age == 2) { + world.setBlockState(pos.down(), EndBlocks.CAVE_PUMPKIN.getDefaultState().with(BlockProperties.SMALL, true)); + } + else if (age == 3) { + world.setBlockState(pos.down(), EndBlocks.CAVE_PUMPKIN.getDefaultState()); + } + } + } + + @Override + public void growAdult(StructureWorldAccess world, Random random, BlockPos pos) {} + + @Override + public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { + state = super.getStateForNeighborUpdate(state, facing, neighborState, world, pos, neighborPos); + if (state.isOf(this) && state.get(BlockProperties.AGE) > 1) { + BlockState down = world.getBlockState(pos.down()); + if (!down.isOf(EndBlocks.CAVE_PUMPKIN)) { + state = state.with(BlockProperties.AGE, 1); + } + } + return state; + } + + @Override + public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + return SHAPE; + } + + @Override + public AbstractBlock.OffsetType getOffsetType() { + return AbstractBlock.OffsetType.NONE; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java b/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java index 2d370940..b255d50b 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java @@ -14,9 +14,10 @@ import net.minecraft.state.property.IntProperty; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.World; +import ru.betterend.blocks.BlockProperties; public abstract class EndPlantWithAgeBlock extends EndPlantBlock { - public static final IntProperty AGE = IntProperty.of("age", 0, 3); + public static final IntProperty AGE = BlockProperties.AGE; public EndPlantWithAgeBlock() { this(FabricBlockSettings.of(Material.PLANT) diff --git a/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantWithAgeBlock.java b/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantWithAgeBlock.java index 363bad5e..db52390d 100644 --- a/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantWithAgeBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantWithAgeBlock.java @@ -13,9 +13,10 @@ import net.minecraft.state.StateManager; import net.minecraft.state.property.IntProperty; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; +import ru.betterend.blocks.BlockProperties; public abstract class UnderwaterPlantWithAgeBlock extends UnderwaterPlantBlock { - public static final IntProperty AGE = IntProperty.of("age", 0, 3); + public static final IntProperty AGE = BlockProperties.AGE; public UnderwaterPlantWithAgeBlock() { super(FabricBlockSettings.of(Material.UNDERWATER_PLANT) diff --git a/src/main/java/ru/betterend/item/EndArmorItem.java b/src/main/java/ru/betterend/item/EndArmorItem.java index 58688011..dc298f2f 100644 --- a/src/main/java/ru/betterend/item/EndArmorItem.java +++ b/src/main/java/ru/betterend/item/EndArmorItem.java @@ -1,7 +1,10 @@ package ru.betterend.item; +import java.util.UUID; + import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.Multimap; + import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.attribute.EntityAttribute; import net.minecraft.entity.attribute.EntityAttributeModifier; @@ -13,8 +16,6 @@ import ru.betterend.mixin.common.ArmorItemAccessor; import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; -import java.util.UUID; - public class EndArmorItem extends ArmorItem implements Patterned { public EndArmorItem(ArmorMaterial material, EquipmentSlot slot, Item.Settings settings) { super(material, slot, settings); diff --git a/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java b/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java index 39046ec7..8a02ed79 100644 --- a/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java @@ -1,13 +1,15 @@ package ru.betterend.mixin.common; -import com.google.common.collect.Multimap; -import net.minecraft.entity.attribute.EntityAttribute; -import net.minecraft.entity.attribute.EntityAttributeModifier; -import net.minecraft.item.ArmorItem; +import java.util.UUID; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -import java.util.UUID; +import com.google.common.collect.Multimap; + +import net.minecraft.entity.attribute.EntityAttribute; +import net.minecraft.entity.attribute.EntityAttributeModifier; +import net.minecraft.item.ArmorItem; @Mixin(ArmorItem.class) public interface ArmorItemAccessor { diff --git a/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java index fc69f5a8..b874e9b8 100644 --- a/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java @@ -14,8 +14,8 @@ import net.minecraft.nbt.NbtHelper; import net.minecraft.structure.Structure; import net.minecraft.structure.StructurePlacementData; import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.Heightmap.Type; +import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; import net.minecraft.world.gen.feature.EndPortalFeature; diff --git a/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java index 35d70225..44f69e31 100644 --- a/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java @@ -13,6 +13,7 @@ import net.minecraft.block.Blocks; import net.minecraft.block.PaneBlock; import net.minecraft.entity.EntityType; import net.minecraft.entity.decoration.EndCrystalEntity; +import net.minecraft.nbt.CompoundTag; import net.minecraft.structure.Structure; import net.minecraft.structure.StructurePlacementData; import net.minecraft.util.math.BlockPos; @@ -27,6 +28,7 @@ import net.minecraft.world.gen.feature.EndSpikeFeatureConfig; import ru.betterend.BetterEnd; import ru.betterend.util.BlocksHelper; import ru.betterend.util.StructureHelper; +import ru.betterend.util.WorldDataUtil; import ru.betterend.world.generator.GeneratorOptions; @Mixin(EndSpikeFeature.class) @@ -43,7 +45,24 @@ public class EndSpikeFeatureMixin { int x = spike.getCenterX(); int z = spike.getCenterZ(); int radius = spike.getRadius(); - int minY = world.getChunk(x >> 4, z >> 4).sampleHeightmap(Type.WORLD_SURFACE, x & 15, z); + int minY = 0; + + long lx = (long) x; + long lz = (long) z; + if (lx * lx + lz * lz < 10000) { + String pillarID = String.format("%d_%d", x, z); + CompoundTag pillar = WorldDataUtil.getCompoundTag("pillars"); + boolean haveValue = pillar.contains(pillarID); + minY = haveValue ? pillar.getInt(pillarID) : world.getChunk(x >> 4, z >> 4).sampleHeightmap(Type.WORLD_SURFACE, x & 15, z); + if (!haveValue) { + pillar.putInt(pillarID, minY); + WorldDataUtil.saveFile(); + } + } + else { + minY = world.getChunk(x >> 4, z >> 4).sampleHeightmap(Type.WORLD_SURFACE, x & 15, z); + } + int maxY = minY + spike.getHeight() - 64; if (GeneratorOptions.replacePillars() && be_radiusInRange(radius)) { diff --git a/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java b/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java index afc357d1..0aab95ac 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java @@ -34,7 +34,7 @@ import ru.betterend.world.generator.GeneratorOptions; public class ServerWorldMixin { @Inject(method = "*", at = @At("TAIL")) private void be_onServerWorldInit(MinecraftServer server, Executor workerExecutor, LevelStorage.Session session, ServerWorldProperties properties, RegistryKey registryKey, DimensionType dimensionType, WorldGenerationProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, boolean debugWorld, long l, List list, boolean bl, CallbackInfo info) { - File beData = new File(FabricLoader.getInstance().getGameDir().getParent().toString(), "saves/" + properties.getLevelName() + "/betterend_data.nbt"); + File beData = new File(FabricLoader.getInstance().getGameDir().getParent().toString(), "saves/" + properties.getLevelName() + "/data/betterend_data.nbt"); ModMetadata meta = FabricLoader.getInstance().getModContainer(BetterEnd.MOD_ID).get().getMetadata(); String version = BetterEnd.isDevEnvironment() ? "development" : meta.getVersion().toString(); diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index 42e5d801..e510cdc5 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -191,6 +191,8 @@ public class CraftingRecipes { GridRecipe.make("filalux_lantern", EndBlocks.FILALUX_LANTERN).setShape("###", "###", "###").addMaterial('#', EndBlocks.FILALUX).build(); GridRecipe.make("silk_moth_hive", EndBlocks.SILK_MOTH_HIVE).setShape("#L#", "LML", "#L#").addMaterial('#', EndBlocks.TENANEA.planks).addMaterial('L', EndBlocks.TENANEA_LEAVES).addMaterial('M', EndItems.SILK_MOTH_MATRIX).build(); + GridRecipe.make("cave_pumpkin_pie", EndItems.CAVE_PUMPKIN_PIE).setShape(" B ", "BPB", " B ").addMaterial('P', EndBlocks.CAVE_PUMPKIN).addMaterial('B', EndItems.BLOSSOM_BERRY, EndItems.SHADOW_BERRY_RAW).build(); + GridRecipe.make("cave_pumpkin_seeds", EndBlocks.CAVE_PUMPKIN_SEED).setOutputCount(4).setList("#").addMaterial('#', EndBlocks.CAVE_PUMPKIN).build(); } private static void registerLantern(String name, Block lantern, Block slab) { diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 1fac2cb8..f2186f82 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -27,6 +27,8 @@ import ru.betterend.blocks.BulbVineBlock; import ru.betterend.blocks.BulbVineLanternBlock; import ru.betterend.blocks.BulbVineLanternColoredBlock; import ru.betterend.blocks.BulbVineSeedBlock; +import ru.betterend.blocks.CavePumpkinBlock; +import ru.betterend.blocks.CavePumpkinVineBlock; import ru.betterend.blocks.ChandelierBlock; import ru.betterend.blocks.CharcoalBlock; import ru.betterend.blocks.CharniaBlock; @@ -302,6 +304,8 @@ public class EndBlocks { public static final Block AMBER_ROOT = registerBlock("amber_root_seed", new EndCropBlock(EndItems.AMBER_ROOT_RAW, AMBER_MOSS)); public static final Block CHORUS_MUSHROOM = registerBlock("chorus_mushroom_seed", new EndCropBlock(EndItems.CHORUS_MUSHROOM_RAW, CHORUS_NYLIUM)); public static final Block PEARLBERRY = registerBlock("pearlberry_seed", new EndCropBlock(EndItems.BLOSSOM_BERRY, END_MOSS, END_MYCELIUM)); + public static final Block CAVE_PUMPKIN_SEED = registerBlock("cave_pumpkin_seed", new CavePumpkinVineBlock()); + public static final Block CAVE_PUMPKIN = registerBlock("cave_pumpkin", new CavePumpkinBlock()); // Water plants public static final Block BUBBLE_CORAL = registerBlock("bubble_coral", new BubbleCoralBlock()); diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index d8365766..ab3ed31d 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -122,6 +122,7 @@ public class EndItems { public final static Item CHORUS_MUSHROOM_RAW = registerFood("chorus_mushroom_raw", 3, 0.5F); public final static Item CHORUS_MUSHROOM_COOKED = registerFood("chorus_mushroom_cooked", FoodComponents.MUSHROOM_STEW); public final static Item BOLUX_MUSHROOM_COOKED = registerFood("bolux_mushroom_cooked", FoodComponents.MUSHROOM_STEW); + public final static Item CAVE_PUMPKIN_PIE = registerFood("cave_pumpkin_pie", FoodComponents.PUMPKIN_PIE); // Drinks // public final static Item UMBRELLA_CLUSTER_JUICE = registerDrink("umbrella_cluster_juice", 5, 0.7F); diff --git a/src/main/java/ru/betterend/util/WorldDataUtil.java b/src/main/java/ru/betterend/util/WorldDataUtil.java index 4ba51df2..cb6b1816 100644 --- a/src/main/java/ru/betterend/util/WorldDataUtil.java +++ b/src/main/java/ru/betterend/util/WorldDataUtil.java @@ -30,6 +30,22 @@ public class WorldDataUtil { return root; } + public static CompoundTag getCompoundTag(String path) { + String[] parts = path.split("\\."); + CompoundTag tag = root; + for (String part: parts) { + if (tag.contains(part)) { + tag = tag.getCompound(part); + } + else { + CompoundTag t = new CompoundTag(); + tag.put(part, t); + tag = t; + } + } + return tag; + } + public static void saveFile() { try { NbtIo.write(root, saveFile); diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index e055fdaa..6c72f3cf 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -11,7 +11,7 @@ public class TerrainGenerator { private static final ReentrantLock LOCKER = new ReentrantLock(); private static final double SCALE_XZ = 8.0; private static final double SCALE_Y = 4.0; - private static final int CENTER = MHelper.floor(500 / SCALE_XZ); + //private static final int CENTER = MHelper.floor(500 / SCALE_XZ); private static IslandLayer largeIslands; private static IslandLayer mediumIslands; @@ -20,7 +20,7 @@ public class TerrainGenerator { private static OpenSimplexNoise noise2; public static boolean canGenerate(int x, int z) { - return GeneratorOptions.noRingVoid() || (long) x + (long) z > CENTER; + return GeneratorOptions.noRingVoid()/* || (long) x + (long) z > CENTER*/; } public static void initNoise(long seed) { diff --git a/src/main/resources/assets/betterend/blockstates/cave_pumpkin.json b/src/main/resources/assets/betterend/blockstates/cave_pumpkin.json new file mode 100644 index 00000000..a845138f --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/cave_pumpkin.json @@ -0,0 +1,6 @@ +{ + "variants": { + "small=true": { "model": "betterend:block/cave_pumpkin_small" }, + "small=false": { "model": "betterend:block/cave_pumpkin" } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/cave_pumpkin_seed.json b/src/main/resources/assets/betterend/blockstates/cave_pumpkin_seed.json new file mode 100644 index 00000000..05b1ecce --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/cave_pumpkin_seed.json @@ -0,0 +1,20 @@ +{ + "variants": { + "age=0": [ + { "model": "betterend:block/cave_pumpkin_vine_1" }, + { "model": "betterend:block/cave_pumpkin_vine_2" } + ], + "age=1": [ + { "model": "betterend:block/cave_pumpkin_vine_3" }, + { "model": "betterend:block/cave_pumpkin_vine_4" } + ], + "age=2": [ + { "model": "betterend:block/cave_pumpkin_vine_5" }, + { "model": "betterend:block/cave_pumpkin_vine_6" } + ], + "age=3": [ + { "model": "betterend:block/cave_pumpkin_vine_7" }, + { "model": "betterend:block/cave_pumpkin_vine_8" } + ] + } +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/cave_pumpkin.json b/src/main/resources/assets/betterend/materialmaps/block/cave_pumpkin.json new file mode 100644 index 00000000..256acaf2 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/cave_pumpkin.json @@ -0,0 +1,14 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "betterend:block/cave_pumpkin_lantern_side", + "material": "betterend:glow_inc" + }, + { + "sprite": "betterend:block/cave_pumpkin_lantern_bottom", + "material": "betterend:glow_inc" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/cave_pumpkin.json b/src/main/resources/assets/betterend/models/block/cave_pumpkin.json new file mode 100644 index 00000000..aa035548 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/cave_pumpkin.json @@ -0,0 +1,89 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "betterend:block/cave_pumpkin_lantern_side", + "lantern_side": "betterend:block/cave_pumpkin_lantern_side", + "lantern_bottom": "betterend:block/cave_pumpkin_lantern_bottom", + "top": "betterend:block/cave_pumpkin_top", + "side": "betterend:block/cave_pumpkin_side" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 1, 0, 1 ], + "to": [ 15, 13, 15 ], + "shade": false, + "faces": { + "down": { "uv": [ 1, 1, 15, 15 ], "texture": "#lantern_bottom" }, + "north": { "uv": [ 1, 3, 15, 16 ], "texture": "#lantern_side" }, + "south": { "uv": [ 1, 3, 15, 16 ], "texture": "#lantern_side" }, + "west": { "uv": [ 1, 3, 15, 16 ], "texture": "#lantern_side" }, + "east": { "uv": [ 1, 3, 15, 16 ], "texture": "#lantern_side" } + } + }, + { + "__comment": "Box2", + "from": [ 0, 13, 0 ], + "to": [ 16, 15, 16 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 0, 10, 0 ], + "to": [ 0.001, 15, 16 ], + "shade": false, + "faces": { + "west": { "uv": [ 0, 1, 16, 6 ], "texture": "#side" }, + "east": { "uv": [ 0, 1, 16, 6 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 16, 10, 0 ], + "to": [ 16.001, 15, 16 ], + "shade": false, + "faces": { + "west": { "uv": [ 0, 1, 16, 6 ], "texture": "#side" }, + "east": { "uv": [ 0, 1, 16, 6 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneZ5", + "from": [ 0, 10, 16 ], + "to": [ 16, 15, 16.001 ], + "shade": false, + "faces": { + "north": { "uv": [ 0, 1, 16, 6 ], "texture": "#side" }, + "south": { "uv": [ 0, 1, 16, 6 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneZ5", + "from": [ 0, 10, 0 ], + "to": [ 16, 15, 0.001 ], + "shade": false, + "faces": { + "north": { "uv": [ 0, 1, 16, 6 ], "texture": "#side" }, + "south": { "uv": [ 0, 1, 16, 6 ], "texture": "#side" } + } + }, + { + "__comment": "Box7", + "from": [ 5, 15, 5 ], + "to": [ 11, 16, 11 ], + "shade": false, + "faces": { + "up": { "uv": [ 5, 10, 11, 16 ], "texture": "#side" }, + "north": { "uv": [ 5, 0, 11, 1 ], "texture": "#side" }, + "south": { "uv": [ 5, 0, 11, 1 ], "texture": "#side" }, + "west": { "uv": [ 5, 0, 11, 1 ], "texture": "#side" }, + "east": { "uv": [ 5, 0, 11, 1 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/cave_pumpkin_small.json b/src/main/resources/assets/betterend/models/block/cave_pumpkin_small.json new file mode 100644 index 00000000..dc0b57ca --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/cave_pumpkin_small.json @@ -0,0 +1,90 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "betterend:block/cave_pumpkin_lantern_side", + "lantern_side": "betterend:block/cave_pumpkin_lantern_side", + "lantern_bottom": "betterend:block/cave_pumpkin_lantern_bottom", + "top": "betterend:block/cave_pumpkin_top", + "side": "betterend:block/cave_pumpkin_side" + }, + "elements": [ + { + "__comment": "Box8", + "from": [ 5, 7, 5 ], + "to": [ 11, 13, 11 ], + "shade": false, + "faces": { + "down": { "uv": [ 5, 5, 11, 11 ], "texture": "#lantern_bottom" }, + "up": { "uv": [ 5, 5, 11, 11 ], "texture": "#lantern_side" }, + "north": { "uv": [ 5, 10, 11, 16 ], "texture": "#lantern_side" }, + "south": { "uv": [ 5, 10, 11, 16 ], "texture": "#lantern_side" }, + "west": { "uv": [ 5, 10, 11, 16 ], "texture": "#lantern_side" }, + "east": { "uv": [ 5, 10, 11, 16 ], "texture": "#lantern_side" } + } + }, + { + "__comment": "Box9", + "from": [ 4, 13, 4 ], + "to": [ 12, 15, 12 ], + "shade": false, + "faces": { + "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" } + } + }, + { + "__comment": "PlaneX12", + "from": [ 12, 10, 4 ], + "to": [ 12.001, 15, 12 ], + "shade": false, + "faces": { + "west": { "uv": [ 4, 1, 12, 6 ], "texture": "#side" }, + "east": { "uv": [ 4, 1, 12, 6 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX12", + "from": [ 4, 10, 4 ], + "to": [ 4.001, 15, 12 ], + "shade": false, + "faces": { + "west": { "uv": [ 4, 1, 12, 6 ], "texture": "#side" }, + "east": { "uv": [ 4, 1, 12, 6 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneZ14", + "from": [ 4, 10, 4 ], + "to": [ 12, 15, 4.001 ], + "shade": false, + "faces": { + "north": { "uv": [ 4, 1, 12, 6 ], "texture": "#side" }, + "south": { "uv": [ 4, 1, 12, 6 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneZ14", + "from": [ 4, 10, 12 ], + "to": [ 12, 15, 12.001 ], + "shade": false, + "faces": { + "north": { "uv": [ 4, 1, 12, 6 ], "texture": "#side" }, + "south": { "uv": [ 4, 1, 12, 6 ], "texture": "#side" } + } + }, + { + "__comment": "Box16", + "from": [ 6, 15, 6 ], + "to": [ 10, 16, 10 ], + "shade": false, + "faces": { + "up": { "uv": [ 6, 11, 10, 15 ], "texture": "#side" }, + "north": { "uv": [ 6, 0, 10, 1 ], "texture": "#side" }, + "south": { "uv": [ 6, 0, 10, 1 ], "texture": "#side" }, + "west": { "uv": [ 6, 0, 10, 1 ], "texture": "#side" }, + "east": { "uv": [ 6, 0, 10, 1 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_1.json b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_1.json new file mode 100644 index 00000000..9083c228 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_1.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/cave_pumpkin_stem_0" + } +} diff --git a/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_2.json b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_2.json new file mode 100644 index 00000000..8c145e38 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_2.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/cave_pumpkin_stem_0" + } +} diff --git a/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_3.json b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_3.json new file mode 100644 index 00000000..ebc4a4f6 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_3.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/cave_pumpkin_stem_1" + } +} diff --git a/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_4.json b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_4.json new file mode 100644 index 00000000..6d1d460a --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_4.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/cave_pumpkin_stem_1" + } +} diff --git a/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_5.json b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_5.json new file mode 100644 index 00000000..e338603f --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_5.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/cave_pumpkin_stem_2" + } +} diff --git a/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_6.json b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_6.json new file mode 100644 index 00000000..c4d07a60 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_6.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/cave_pumpkin_stem_2" + } +} diff --git a/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_7.json b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_7.json new file mode 100644 index 00000000..bdfc11b9 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_7.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/cave_pumpkin_stem_3" + } +} diff --git a/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_8.json b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_8.json new file mode 100644 index 00000000..7c379921 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/cave_pumpkin_vine_8.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_inverted", + "textures": { + "cross": "betterend:block/cave_pumpkin_stem_3" + } +} diff --git a/src/main/resources/assets/betterend/models/item/cave_pumpkin.json b/src/main/resources/assets/betterend/models/item/cave_pumpkin.json new file mode 100644 index 00000000..30275dee --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/cave_pumpkin.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/cave_pumpkin" +} diff --git a/src/main/resources/assets/betterend/models/item/cave_pumpkin_seed.json b/src/main/resources/assets/betterend/models/item/cave_pumpkin_seed.json new file mode 100644 index 00000000..c285f463 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/cave_pumpkin_seed.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/cave_pumpkin_seed" + } +} diff --git a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_lantern_side.png b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_lantern_side.png index ede349994d40ed2fd16b2103addac5b7eaaefb10..96e2e1f4dd678058ebee20402e3fb7fabc3f4dca 100644 GIT binary patch delta 117 zcmV-*0E++N0pkIXb#7TnL_t&-m7UK^4uCKS1W-VjQ0{+VXEd&CVq#lD`WAf5ejNAE z)r-RgiAHu`Nf5bKGqM>$$kBgBGD#>x35rlV009CJu!HX!ueOmuYtrVVaqkk(F79>$ X_~itkNGhrP00000NkvXXu0mjfD-$qw delta 115 zcmV-(0F3|R0pS6Vb!=BjL_t&-m7UK~3V=We1klxV7`^|2bE=P^AZT3>-iMBB{di`s z()Y~-0U*eu3H%N|5M7Mwu3&Wx7!XVbU;TWZhy9+vd7s0NKnB4BkuJ^ag)F8%e!;raiAm5a UY~$N$K${pmUHx3vIVCg!05r@?Pyhe` delta 178 zcmaFPc$;y8VZB^{Plzi614Da++mfQd13l5TVs~)E};hXv(y(Tn%&%FT38@{5vR zyj`^UvP+PdjcePo2?@Lt)J3-$1V4R06J-Wq#URR6%N`enNB7K!_Btp6$W{*+x6 ZL&XxtI}#j6{{U@Z@O1TaS?83{1OS!PNYnrT diff --git a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_0.png b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_0.png new file mode 100644 index 0000000000000000000000000000000000000000..01b6a719511b6e5a6df12e7e1363b43f4952b4fb GIT binary patch literal 388 zcmV-~0ek+5P)Px$K1oDDR5*?8k-tjMoV`KFbR)&-e2_&-+NYXw=F=Q-h4gHl=z~ zGO9(9(!$(#`y8HMOYVBveX)0PB>@bEHULp2#N)*)xwgV-q99fZP7?*e*_4;z`&_8| z!z8wK^4X+EBD=%7KTJFmA=g$gszm`X+L7tBECOnbd^Wkb11B6%W3azQN(*CDi()Xe zv1WZfdd~ou>5BMO;DkFZi*9cMKu+HRU|NtdZy$KNdn2BS%rifJ)l64}HS2TGxsd=? zZNMY=j!`X&s1ia`gXE7c7uI>U;NXOvQT{C0RDAQ(Jl^%}f2E*QZ%Wbrf~zFRFPPy!4AgasgaJkKJY5_^ zB&Nptaq=B7;8^s^=HLH^f$7uoRC=2{SbZ1_p9-&FOz3xyjZNFt&=VkbK|R}l(IxZc zR~M^?L^Zf?dt~XABDwwL8Hss+CI?P0_Xw+0PZqeH@vErKa-KB5$Nh=~=`SJ``|5m> ezC{bk)-gLqG5&eKP4+#|W(H4JKbLh*2~7aLdReFd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_2.png b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_2.png new file mode 100644 index 0000000000000000000000000000000000000000..7944679baf5ada5c93543fd8ed7f4d6e2f672ecd GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~xd5LKS0Ftx z#cfGZ;O2&~13l5TVsbrf~zFRFPPy!4AgasgaJkKJzX3_ zB&MeJGx9krayV-%9Q_?%!8&>V+kTfucgEIsMzM9t2K}9l`*Kd!hX$tXP`I*X*Qwx} zJC~f~bh#mSQfiXw*|YwuZcb~;T6%{scgr-cE0%Lk-bm?lnp>Xu>D-gro5?%l8Gf+8 h=KVF>{#pMc=9bw^S)wl=OaxlZ;OXk;vd$@?2>|6wU!DK} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_3.png b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_3.png new file mode 100644 index 0000000000000000000000000000000000000000..9b3607bd000b87f4b9a18e8e7f037efd3da855de GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~xd5LKS0Ftx z#cfGZ;O2&~13l5TVsbrf~zFRFPPy!4AgasgaJj1JY5_^ zB&O#2Uld|CVDS#T`2YXI*1YoC8P={U8a6x|3U(f}QDgtLap{kez?2;h9$R*u4!*f{ z#YxYW4a$>DJ*HV~x6|CHt9sR^RrXefuV}#Y0=4AHmOPs84?UUdxyJH+`p*5|?Vi;) je7zR*C10+|{fDbv`!=Sg=9Ak&wljFT`njxgN@xNAOif^F literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/cave_pumpkin_pipe.png b/src/main/resources/assets/betterend/textures/item/cave_pumpkin_pipe.png new file mode 100644 index 0000000000000000000000000000000000000000..d24ce1532a255cea726484dc6842b1d03a0cfcd3 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~^#Gp`S0LRU z;RZxYiUK#)haKpNzObeF#);`SPfovod-aQ_hdzF|1wp00@|Fbo1vC6d0=g`Y zYk?ARo-U3d5>w~)TJs$+;5hop$PXeYj!y z+jTlZ#@?3|yH~myx+J{ZGPiuey_M@MlB5{lF+|tQ669)VdYPZ^ujI35UiR|3LdL#h WOmDin);|T>#Ng@b=d#Wzp$Pz=uwgC$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/cave_pumpkin_seed.png b/src/main/resources/assets/betterend/textures/item/cave_pumpkin_seed.png new file mode 100644 index 0000000000000000000000000000000000000000..f49ede5bb66292f00ab9602eaf6749344eb45a78 GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|u6nvShFJ6_ zCrI3T(3bz|Kl@A5{~uQ-9#Y-7Q}NAz?%(-5_Ve~0$>!wNJG;kb4bS}jf6^?@{S{cx zXc7D2=jr@5ZF4(=kaahXdTe5pxBr{=3EtSo8h1GnZ0zl0@{$#m z5t1@q(-yrr_>whc!@S>$hmZU3m$a+@d3M7R4S}Po5_%RFg#XTOY;1IVq#(}RKE z&>68Evs7Ih|I6F|?h?||VAIj$`g8vL@lyv5FmSR@zOBR~H9P(BSGBg3>XzH}k(zmI eC9~TM85kZ!1~XczPS*f>kipZ{&t;ucLK6UdqIW9* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/shadow_berry_seeds.png b/src/main/resources/assets/betterend/textures/item/shadow_berry_seeds.png index 89c2a68bfb6385152dc62d3f7209a2fcfa902313..20afce5bc35c410b435f4dba9d7a22fe40a1102c 100644 GIT binary patch delta 182 zcmcb@c${&9WIZzj1A~Sxe=v|@EDmyaVpw-h<|U9L6yOu$3Zz@=5<8kwr}h`knO3!I zK`VRunU6qGwvr&fV21x7P*wThA5bLF)5S4FVrpq$ARmJxi}S@@|EEq*HTN;9dop#4 z=uV!BO}CTE6AWH1S;wAKv}aFFM3U6@Ao0cJ`jeV87Mt}6>t0V^b5m*BU&k<8_X3UG dZ7&WM%hgR_cx|aJr3N&e!PC{xWt~$(69A?xMe+au delta 195 zcmV;!06hQ40n`DI8Gi-<001BJ|6u?C0GmlfK~#9!WBC97KLaHgucWoP>VGIE-2jlr zyEhL0KXZIFUPB0K-m`TAX$F84gEYc4uUt@0x&a`K=$c6}06FmBn$g4w8h{O>1S(bo zaM+49P%#XE1s+Htx-(&N$l-$30FVM~hQJKK79%JIfE2(CK|D7AIX&Pq0B#5@9iW8= xO4#5s03{vZ2vFSV09$+`c>`-=VxTlT0|1+}TX6I~Mppm;002ovPDHLkV1gI}NPYkS From 945a322b53c67ebe7bb1e49c0891dd9c7e72f076 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 20 Mar 2021 09:06:55 +0300 Subject: [PATCH 376/463] Cave biome populators --- src/main/java/ru/betterend/BetterEnd.java | 10 -- .../blocks/basis/StalactiteBlock.java | 6 - .../ru/betterend/entity/EndSlimeEntity.java | 2 +- .../integration/byg/BYGIntegration.java | 2 +- .../integration/byg/biomes/BYGBiomes.java | 2 +- .../integration/byg/biomes/EterialGrove.java | 2 +- .../byg/biomes/NightshadeRedwoods.java | 2 +- .../byg/biomes/OldBulbisGardens.java | 2 +- .../mixin/client/BackgroundRendererMixin.java | 2 +- .../mixin/common/BoneMealItemMixin.java | 2 +- .../mixin/common/PlayerManagerMixin.java | 2 - .../java/ru/betterend/registry/EndBiomes.java | 2 +- .../ru/betterend/registry/EndFeatures.java | 2 +- .../java/ru/betterend/tab/CreativeTabs.java | 4 - .../java/ru/betterend/util/BonemealUtil.java | 2 +- .../world/biome/{land => }/EndBiome.java | 3 +- .../world/biome/air/BiomeIceStarfield.java | 2 +- .../world/biome/cave/EndCaveBiome.java | 16 ++- .../world/biome/land/AmberLandBiome.java | 1 + .../biome/land/BlossomingSpiresBiome.java | 1 + .../world/biome/land/ChorusForestBiome.java | 1 + .../biome/land/CrystalMountainsBiome.java | 1 + .../biome/land/DragonGraveyardsBiome.java | 1 + .../world/biome/land/DryShrublandBiome.java | 1 + .../world/biome/land/DustWastelandsBiome.java | 1 + .../biome/land/FoggyMushroomlandBiome.java | 1 + .../biome/land/GlowingGrasslandsBiome.java | 1 + .../world/biome/land/LanternWoodsBiome.java | 1 + .../world/biome/land/MegalakeBiome.java | 1 + .../world/biome/land/MegalakeGroveBiome.java | 1 + .../biome/land/PaintedMountainsBiome.java | 1 + .../world/biome/land/ShadowForestBiome.java | 1 + .../world/biome/land/SulphurSpringsBiome.java | 1 + .../world/biome/land/UmbrellaJungleBiome.java | 1 + .../caves/CaveChunkPopulatorFeature.java | 132 ++++++++++++++++++ .../terrain/caves/EndCaveFeature.java | 2 +- .../world/generator/BetterEndBiomeSource.java | 2 +- .../betterend/world/generator/BiomeChunk.java | 2 +- .../betterend/world/generator/BiomeMap.java | 2 +- .../world/generator/BiomePicker.java | 2 +- .../betterend/world/generator/WeighTree.java | 2 +- .../betterend/textures/block/rubinea.png | Bin 222 -> 234 bytes .../textures/block/rubinea_bottom.png | Bin 236 -> 223 bytes ..._pumpkin_pipe.png => cave_pumpkin_pie.png} | Bin 44 files changed, 182 insertions(+), 43 deletions(-) rename src/main/java/ru/betterend/world/biome/{land => }/EndBiome.java (94%) create mode 100644 src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java rename src/main/resources/assets/betterend/textures/item/{cave_pumpkin_pipe.png => cave_pumpkin_pie.png} (100%) diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index 2cf9e6c9..aa02d22c 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -2,12 +2,9 @@ package ru.betterend; import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; -import net.fabricmc.fabric.api.event.registry.RegistryEntryAddedCallback; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.block.SlabBlock; import net.minecraft.item.ItemStack; import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; import ru.betterend.api.BetterEndPlugin; import ru.betterend.config.Configs; import ru.betterend.effects.EndEnchantments; @@ -83,13 +80,6 @@ public class BetterEnd implements ModInitializer { } }); } - - RegistryEntryAddedCallback.event(Registry.BLOCK).register((i, id, block) -> { - if (block instanceof SlabBlock) { - // Do Some Stuff - System.out.println(id); - } - }); } public static boolean hasGuideBook() { diff --git a/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java b/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java index d7d1dc3f..40f24282 100644 --- a/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java @@ -62,13 +62,10 @@ public class StalactiteBlock extends BlockBaseNotFull implements Waterloggable, boolean water = world.getFluidState(pos).getFluid() == Fluids.WATER; if (dir == Direction.DOWN) { - System.out.println("Check up!"); if (isThis(world, pos.up()) || sideCoversSmallSquare(world, pos.up(), Direction.DOWN)) { - System.out.println("Up true!"); return getDefaultState().with(IS_FLOOR, false).with(WATERLOGGED, water); } else if (isThis(world, pos.down()) || sideCoversSmallSquare(world, pos.down(), Direction.UP)) { - System.out.println("Up false!"); return getDefaultState().with(IS_FLOOR, true).with(WATERLOGGED, water); } else { @@ -76,13 +73,10 @@ public class StalactiteBlock extends BlockBaseNotFull implements Waterloggable, } } else { - System.out.println("Check down!"); if (isThis(world, pos.down()) || sideCoversSmallSquare(world, pos.down(), Direction.UP)) { - System.out.println("Down true!"); return getDefaultState().with(IS_FLOOR, true).with(WATERLOGGED, water); } else if (isThis(world, pos.up()) || sideCoversSmallSquare(world, pos.up(), Direction.DOWN)) { - System.out.println("Down false!"); return getDefaultState().with(IS_FLOOR, false).with(WATERLOGGED, water); } else { diff --git a/src/main/java/ru/betterend/entity/EndSlimeEntity.java b/src/main/java/ru/betterend/entity/EndSlimeEntity.java index eef8605b..b9b6118c 100644 --- a/src/main/java/ru/betterend/entity/EndSlimeEntity.java +++ b/src/main/java/ru/betterend/entity/EndSlimeEntity.java @@ -42,7 +42,7 @@ import ru.betterend.interfaces.ISlime; import ru.betterend.registry.EndBiomes; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; -import ru.betterend.world.biome.land.EndBiome; +import ru.betterend.world.biome.EndBiome; public class EndSlimeEntity extends SlimeEntity { private static final TrackedData VARIANT = DataTracker.registerData(EndSlimeEntity.class, TrackedDataHandlerRegistry.BYTE); diff --git a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java index 98a7ade2..ffa7d743 100644 --- a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java +++ b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java @@ -14,7 +14,7 @@ import ru.betterend.integration.byg.features.BYGFeatures; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndTags; import ru.betterend.util.TagHelper; -import ru.betterend.world.biome.land.EndBiome; +import ru.betterend.world.biome.EndBiome; public class BYGIntegration extends ModIntegration { public BYGIntegration() { diff --git a/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java b/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java index 6a47013c..0211415c 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java @@ -2,7 +2,7 @@ package ru.betterend.integration.byg.biomes; import ru.betterend.integration.Integrations; import ru.betterend.registry.EndBiomes; -import ru.betterend.world.biome.land.EndBiome; +import ru.betterend.world.biome.EndBiome; public class BYGBiomes { // New Biomes diff --git a/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java b/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java index 8e33136e..55f4df4d 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java @@ -10,8 +10,8 @@ import net.minecraft.world.biome.SpawnSettings.SpawnEntry; import ru.betterend.BetterEnd; import ru.betterend.integration.Integrations; import ru.betterend.integration.byg.features.BYGFeatures; +import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.land.BiomeDefinition; -import ru.betterend.world.biome.land.EndBiome; public class EterialGrove extends EndBiome { public EterialGrove() { diff --git a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java index af9ac202..b2bf0654 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java @@ -13,8 +13,8 @@ import ru.betterend.BetterEnd; import ru.betterend.integration.Integrations; import ru.betterend.integration.byg.features.BYGFeatures; import ru.betterend.registry.EndFeatures; +import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.land.BiomeDefinition; -import ru.betterend.world.biome.land.EndBiome; public class NightshadeRedwoods extends EndBiome { public NightshadeRedwoods() { diff --git a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java index ae7eed1d..da349ef9 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java @@ -20,8 +20,8 @@ import ru.betterend.BetterEnd; import ru.betterend.integration.Integrations; import ru.betterend.integration.byg.features.BYGFeatures; import ru.betterend.registry.EndFeatures; +import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.land.BiomeDefinition; -import ru.betterend.world.biome.land.EndBiome; public class OldBulbisGardens extends EndBiome { public OldBulbisGardens() { diff --git a/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java b/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java index 3b24d00f..26d59d3a 100644 --- a/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java @@ -25,7 +25,7 @@ import net.minecraft.world.biome.Biome.Category; import ru.betterend.client.ClientOptions; import ru.betterend.registry.EndBiomes; import ru.betterend.util.BackgroundInfo; -import ru.betterend.world.biome.land.EndBiome; +import ru.betterend.world.biome.EndBiome; @Mixin(BackgroundRenderer.class) public class BackgroundRendererMixin { diff --git a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java index bfba167c..1eff0099 100644 --- a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java +++ b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java @@ -23,7 +23,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; import ru.betterend.util.BonemealUtil; -import ru.betterend.world.biome.land.EndBiome; +import ru.betterend.world.biome.EndBiome; @Mixin(BoneMealItem.class) public class BoneMealItemMixin { diff --git a/src/main/java/ru/betterend/mixin/common/PlayerManagerMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerManagerMixin.java index 7bcb80e6..ed4abddb 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerManagerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerManagerMixin.java @@ -102,8 +102,6 @@ public class PlayerManagerMixin { else { var23 = World.END; } - - System.out.println("World " + this.server.getWorld(World.END)); RegistryKey registryKey = var23; ServerWorld serverWorld = this.server.getWorld(registryKey); diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index 3def7d36..dd649a71 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -32,6 +32,7 @@ import ru.betterend.config.Configs; import ru.betterend.integration.Integrations; import ru.betterend.interfaces.IBiomeList; import ru.betterend.util.JsonFactory; +import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.air.BiomeIceStarfield; import ru.betterend.world.biome.cave.EmptyAuroraCaveBiome; import ru.betterend.world.biome.cave.EmptyEndCaveBiome; @@ -46,7 +47,6 @@ import ru.betterend.world.biome.land.CrystalMountainsBiome; import ru.betterend.world.biome.land.DragonGraveyardsBiome; import ru.betterend.world.biome.land.DryShrublandBiome; import ru.betterend.world.biome.land.DustWastelandsBiome; -import ru.betterend.world.biome.land.EndBiome; import ru.betterend.world.biome.land.FoggyMushroomlandBiome; import ru.betterend.world.biome.land.GlowingGrasslandsBiome; import ru.betterend.world.biome.land.LanternWoodsBiome; diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index f02e0fb6..b94fb3b5 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -11,8 +11,8 @@ import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.GenerationStep; import net.minecraft.world.gen.feature.ConfiguredFeature; import ru.betterend.BetterEnd; +import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.land.BiomeDefinition; -import ru.betterend.world.biome.land.EndBiome; import ru.betterend.world.features.BlueVineFeature; import ru.betterend.world.features.CharniaFeature; import ru.betterend.world.features.CrashedShipFeature; diff --git a/src/main/java/ru/betterend/tab/CreativeTabs.java b/src/main/java/ru/betterend/tab/CreativeTabs.java index 48601843..1ee8eb5d 100644 --- a/src/main/java/ru/betterend/tab/CreativeTabs.java +++ b/src/main/java/ru/betterend/tab/CreativeTabs.java @@ -25,9 +25,5 @@ public class CreativeTabs { stacks.add(new ItemStack(i)); } }).build(); - if (BetterEnd.isDevEnvironment()) { - System.out.println("CREATIVE_TAB_ITEMS: " + TAB_ITEMS.getName()); - System.out.println("CREATIVE_TAB_BLOCKS: " + TAB_BLOCKS.getName()); - } } } diff --git a/src/main/java/ru/betterend/util/BonemealUtil.java b/src/main/java/ru/betterend/util/BonemealUtil.java index 5c84b3d3..035f26c2 100644 --- a/src/main/java/ru/betterend/util/BonemealUtil.java +++ b/src/main/java/ru/betterend/util/BonemealUtil.java @@ -11,7 +11,7 @@ import net.minecraft.block.Block; import net.minecraft.util.Identifier; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndBlocks; -import ru.betterend.world.biome.land.EndBiome; +import ru.betterend.world.biome.EndBiome; public class BonemealUtil { private static final Map> GRASS_BIOMES = Maps.newHashMap(); diff --git a/src/main/java/ru/betterend/world/biome/land/EndBiome.java b/src/main/java/ru/betterend/world/biome/EndBiome.java similarity index 94% rename from src/main/java/ru/betterend/world/biome/land/EndBiome.java rename to src/main/java/ru/betterend/world/biome/EndBiome.java index 4fb10772..81a25b3f 100644 --- a/src/main/java/ru/betterend/world/biome/land/EndBiome.java +++ b/src/main/java/ru/betterend/world/biome/EndBiome.java @@ -1,4 +1,4 @@ -package ru.betterend.world.biome.land; +package ru.betterend.world.biome; import java.io.InputStream; import java.util.List; @@ -14,6 +14,7 @@ import net.minecraft.world.biome.Biome; import ru.betterend.config.Configs; import ru.betterend.util.JsonFactory; import ru.betterend.util.StructureHelper; +import ru.betterend.world.biome.land.BiomeDefinition; import ru.betterend.world.features.EndFeature; import ru.betterend.world.features.ListFeature; import ru.betterend.world.features.ListFeature.StructureInfo; diff --git a/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java b/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java index 5f33b989..b1106d6f 100644 --- a/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java +++ b/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java @@ -4,8 +4,8 @@ import net.minecraft.entity.EntityType; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.land.BiomeDefinition; -import ru.betterend.world.biome.land.EndBiome; public class BiomeIceStarfield extends EndBiome { public BiomeIceStarfield() { diff --git a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java index 4ca1e5a6..5ae1d3c2 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java @@ -6,15 +6,27 @@ import net.minecraft.block.BlockState; import net.minecraft.util.collection.WeightedList; import net.minecraft.util.math.BlockPos; import net.minecraft.world.gen.feature.Feature; +import ru.betterend.registry.EndBiomes; +import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.land.BiomeDefinition; -import ru.betterend.world.biome.land.EndBiome; +import ru.betterend.world.features.EndFeature; +import ru.betterend.world.features.terrain.caves.CaveChunkPopulatorFeature; public class EndCaveBiome extends EndBiome { private WeightedList> floorFeatures = new WeightedList>(); private WeightedList> ceilFeatures = new WeightedList>(); public EndCaveBiome(BiomeDefinition definition) { - super(definition.setCaveBiome()); + super(makeDef(definition)); + } + + private static BiomeDefinition makeDef(BiomeDefinition definition) { + EndFeature feature = EndFeature.makeChunkFeature( + definition.getID().getPath() + "_cave_populator", + new CaveChunkPopulatorFeature(() -> (EndCaveBiome) EndBiomes.getBiome(definition.getID())) + ); + definition.addFeature(feature).setCaveBiome(); + return definition; } public void addFloorFeature(Feature feature, int weight) { diff --git a/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java b/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java index d0a23d07..d50e0ad0 100644 --- a/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java @@ -7,6 +7,7 @@ import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.EndBiome; public class AmberLandBiome extends EndBiome { public AmberLandBiome() { diff --git a/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java b/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java index 6226c6f5..dcbf2f7b 100644 --- a/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java @@ -5,6 +5,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.EndBiome; public class BlossomingSpiresBiome extends EndBiome { public BlossomingSpiresBiome() { diff --git a/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java b/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java index ecc5ab16..1bd3c278 100644 --- a/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java @@ -9,6 +9,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.EndBiome; public class ChorusForestBiome extends EndBiome { public ChorusForestBiome() { diff --git a/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java b/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java index 340d865e..3275fc28 100644 --- a/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java @@ -5,6 +5,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.EndBiome; public class CrystalMountainsBiome extends EndBiome { public CrystalMountainsBiome() { diff --git a/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java b/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java index 7688869a..822c43cf 100644 --- a/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java @@ -5,6 +5,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.EndBiome; public class DragonGraveyardsBiome extends EndBiome { public DragonGraveyardsBiome() { diff --git a/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java b/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java index be304161..dabd1e95 100644 --- a/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java @@ -5,6 +5,7 @@ import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.EndBiome; public class DryShrublandBiome extends EndBiome { public DryShrublandBiome() { diff --git a/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java b/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java index 92dd0380..481ea926 100644 --- a/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java @@ -5,6 +5,7 @@ import net.minecraft.particle.ParticleTypes; import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.EndBiome; public class DustWastelandsBiome extends EndBiome { public DustWastelandsBiome() { diff --git a/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java b/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java index 2d6fcc9b..95a0a821 100644 --- a/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java @@ -8,6 +8,7 @@ import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.EndBiome; public class FoggyMushroomlandBiome extends EndBiome { public FoggyMushroomlandBiome() { diff --git a/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java b/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java index ab3639f1..a4849806 100644 --- a/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java @@ -6,6 +6,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.EndBiome; public class GlowingGrasslandsBiome extends EndBiome { public GlowingGrasslandsBiome() { diff --git a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java index d87c7adf..333dbd86 100644 --- a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java @@ -6,6 +6,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.EndBiome; public class LanternWoodsBiome extends EndBiome { public LanternWoodsBiome() { diff --git a/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java b/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java index c9780367..d81feab2 100644 --- a/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java @@ -6,6 +6,7 @@ import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.EndBiome; public class MegalakeBiome extends EndBiome { public MegalakeBiome() { diff --git a/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java b/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java index 7e0d0bb1..abf34b94 100644 --- a/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java @@ -7,6 +7,7 @@ import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.EndBiome; public class MegalakeGroveBiome extends EndBiome { public MegalakeGroveBiome() { diff --git a/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java b/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java index 1192d417..c4552613 100644 --- a/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java @@ -5,6 +5,7 @@ import net.minecraft.particle.ParticleTypes; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.EndBiome; public class PaintedMountainsBiome extends EndBiome { public PaintedMountainsBiome() { diff --git a/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java b/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java index b5c28fd9..8196e40f 100644 --- a/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java @@ -7,6 +7,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.EndBiome; public class ShadowForestBiome extends EndBiome { public ShadowForestBiome() { diff --git a/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java b/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java index 34b704aa..eb274769 100644 --- a/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java @@ -5,6 +5,7 @@ import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.EndBiome; import ru.betterend.world.surface.SurfaceBuilders; public class SulphurSpringsBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java b/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java index 60b32cbc..f4a07e03 100644 --- a/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java @@ -6,6 +6,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.EndBiome; public class UmbrellaJungleBiome extends EndBiome { public UmbrellaJungleBiome() { diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java new file mode 100644 index 00000000..cbd1f55a --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java @@ -0,0 +1,132 @@ +package ru.betterend.world.features.terrain.caves; + +import java.util.Random; +import java.util.Set; +import java.util.function.Supplier; + +import com.google.common.collect.Sets; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.world.biome.cave.EndCaveBiome; +import ru.betterend.world.features.DefaultFeature; + +public class CaveChunkPopulatorFeature extends DefaultFeature { + private Supplier supplier; + + public CaveChunkPopulatorFeature(Supplier biome) { + this.supplier = biome; + } + + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + Set floorPositions = Sets.newHashSet(); + Set ceilPositions = Sets.newHashSet(); + int sx = (pos.getX() >> 4) << 4; + int sz = (pos.getZ() >> 4) << 4; + Mutable min = new Mutable().set(pos); + Mutable max = new Mutable().set(pos); + fillSets(sx, sz, world.getChunk(pos), floorPositions, ceilPositions, min, max); + EndCaveBiome biome = supplier.get(); + BlockState surfaceBlock = biome.getBiome().getGenerationSettings().getSurfaceConfig().getTopMaterial(); + placeFloor(world, biome, floorPositions, random, surfaceBlock); + placeCeil(world, biome, ceilPositions, random); + BlocksHelper.fixBlocks(world, min, max); + return true; + } + + protected void fillSets(int sx, int sz, Chunk chunk, Set floorPositions, Set ceilPositions, Mutable min, Mutable max) { + Mutable mut = new Mutable(); + Mutable mut2 = new Mutable(); + Mutable mut3 = new Mutable(); + for (int x = 0; x < 16; x++) { + mut.setX(x); + mut2.setX(x); + for (int z = 0; z < 16; z++) { + mut.setZ(z); + mut2.setZ(z); + mut2.setY(0); + for (int y = 1; y < chunk.getHeight(); y++) { + mut.setY(y); + BlockState top = chunk.getBlockState(mut); + BlockState bottom = chunk.getBlockState(mut2); + if (top.isAir() && (bottom.isIn(EndTags.GEN_TERRAIN) || bottom.isOf(Blocks.STONE))) { + mut3.set(mut2).move(sx, 0, sz); + floorPositions.add(mut3.toImmutable()); + updateMin(mut3, min); + updateMax(mut3, max); + } + else if (bottom.isAir() && (top.isIn(EndTags.GEN_TERRAIN)|| top.isOf(Blocks.STONE))) { + mut3.set(mut).move(sx, 0, sz); + ceilPositions.add(mut3.toImmutable()); + updateMin(mut3, min); + updateMax(mut3, max); + } + mut2.setY(y); + } + } + } + } + + private void updateMin(BlockPos pos, Mutable min) { + if (pos.getX() < min.getX()) { + min.setX(pos.getX()); + } + if (pos.getY() < min.getY()) { + min.setY(pos.getY()); + } + if (pos.getZ() < min.getZ()) { + min.setZ(pos.getZ()); + } + } + + private void updateMax(BlockPos pos, Mutable max) { + if (pos.getX() > max.getX()) { + max.setX(pos.getX()); + } + if (pos.getY() > max.getY()) { + max.setY(pos.getY()); + } + if (pos.getZ() > max.getZ()) { + max.setZ(pos.getZ()); + } + } + + protected void placeFloor(StructureWorldAccess world, EndCaveBiome biome, Set floorPositions, Random random, BlockState surfaceBlock) { + float density = biome.getFloorDensity(); + floorPositions.forEach((pos) -> { + BlocksHelper.setWithoutUpdate(world, pos, surfaceBlock); + if (density > 0 && random.nextFloat() <= density) { + Feature feature = biome.getFloorFeature(random); + if (feature != null) { + feature.generate(world, null, random, pos.up(), null); + } + } + }); + } + + protected void placeCeil(StructureWorldAccess world, EndCaveBiome biome, Set ceilPositions, Random random) { + float density = biome.getCeilDensity(); + ceilPositions.forEach((pos) -> { + BlockState ceilBlock = biome.getCeil(pos); + if (ceilBlock != null) { + BlocksHelper.setWithoutUpdate(world, pos, ceilBlock); + } + if (density > 0 && random.nextFloat() <= density) { + Feature feature = biome.getCeilFeature(random); + if (feature != null) { + feature.generate(world, null, random, pos.down(), null); + } + } + }); + } +} 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 7b8ff74f..ad2b088a 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 @@ -21,8 +21,8 @@ import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; +import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.cave.EndCaveBiome; -import ru.betterend.world.biome.land.EndBiome; import ru.betterend.world.features.DefaultFeature; import ru.betterend.world.generator.GeneratorOptions; diff --git a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java index e3261214..503ab264 100644 --- a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java +++ b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java @@ -19,7 +19,7 @@ import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndTags; import ru.betterend.util.FeaturesHelper; -import ru.betterend.world.biome.land.EndBiome; +import ru.betterend.world.biome.EndBiome; public class BetterEndBiomeSource extends BiomeSource { public static final Codec CODEC = RecordCodecBuilder.create((instance) -> { diff --git a/src/main/java/ru/betterend/world/generator/BiomeChunk.java b/src/main/java/ru/betterend/world/generator/BiomeChunk.java index a3c3efe7..96dd258f 100644 --- a/src/main/java/ru/betterend/world/generator/BiomeChunk.java +++ b/src/main/java/ru/betterend/world/generator/BiomeChunk.java @@ -2,7 +2,7 @@ package ru.betterend.world.generator; import java.util.Random; -import ru.betterend.world.biome.land.EndBiome; +import ru.betterend.world.biome.EndBiome; public class BiomeChunk { diff --git a/src/main/java/ru/betterend/world/generator/BiomeMap.java b/src/main/java/ru/betterend/world/generator/BiomeMap.java index b400be59..bcc73d85 100644 --- a/src/main/java/ru/betterend/world/generator/BiomeMap.java +++ b/src/main/java/ru/betterend/world/generator/BiomeMap.java @@ -8,7 +8,7 @@ import net.minecraft.util.math.ChunkPos; import net.minecraft.world.gen.ChunkRandom; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; -import ru.betterend.world.biome.land.EndBiome; +import ru.betterend.world.biome.EndBiome; public class BiomeMap { private static final ChunkRandom RANDOM = new ChunkRandom(); diff --git a/src/main/java/ru/betterend/world/generator/BiomePicker.java b/src/main/java/ru/betterend/world/generator/BiomePicker.java index 339a0ab6..050ab133 100644 --- a/src/main/java/ru/betterend/world/generator/BiomePicker.java +++ b/src/main/java/ru/betterend/world/generator/BiomePicker.java @@ -8,7 +8,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Sets; import net.minecraft.util.Identifier; -import ru.betterend.world.biome.land.EndBiome; +import ru.betterend.world.biome.EndBiome; public class BiomePicker { private final Set immutableIDs = Sets.newHashSet(); diff --git a/src/main/java/ru/betterend/world/generator/WeighTree.java b/src/main/java/ru/betterend/world/generator/WeighTree.java index 2d55c364..50cf39aa 100644 --- a/src/main/java/ru/betterend/world/generator/WeighTree.java +++ b/src/main/java/ru/betterend/world/generator/WeighTree.java @@ -2,7 +2,7 @@ package ru.betterend.world.generator; import java.util.List; -import ru.betterend.world.biome.land.EndBiome; +import ru.betterend.world.biome.EndBiome; public class WeighTree { private final Node root; diff --git a/src/main/resources/assets/betterend/textures/block/rubinea.png b/src/main/resources/assets/betterend/textures/block/rubinea.png index 4b9385fdd4101c793789fbd0e19e1b4c9a550300..b590bfe8f1c0cf7214fd12519cb6e39eb8733230 100644 GIT binary patch delta 133 zcmV;00DAx40qOyeY<_7;L_t&-l}(OO0t6ulLY+jo|BY8{+Qtu)XDShnl_kavR2Fp+ zRVjkP))JVjGo;b(J-J-KQ{7h>xTgWmo5Y@h-yu3%$IALR0n6U-*OCFQ5pw0zXZH>l nt>+%U`ZzFsK~V42^P}|-dBp;`uCT>h00000NkvXXu0mjfeKb8m delta 121 zcmV-<0EYkS0p0d026$Gh&zwi`<>E;^r}bb;w<+U%be6Yk=_D8+T4_aa?$G z^;W%FyG=>ESfw6XhsZ|uoUN6+v*Ymkr2Q2P?5DhXEBuCHyblX9iU~G^aR!uMkAU3jQkOq*m zkzIkT21PTv0Wc@S!UWwFa6>=>$bv9MFx%Ti9We|+4p@{>hg4~Vg*Z$MWC)0lt`;Ta zK?-1s&;t}^D99iNQUS~mk`fa-K=CuN03J Date: Sat, 20 Mar 2021 09:26:23 +0300 Subject: [PATCH 377/463] Cultures spawning --- .../ru/betterend/registry/EndFeatures.java | 5 ++++ .../java/ru/betterend/util/BlocksHelper.java | 5 ++++ .../world/biome/cave/LushAuroraCaveBiome.java | 1 + .../world/biome/land/AmberLandBiome.java | 1 + .../world/biome/land/ChorusForestBiome.java | 1 + .../biome/land/FoggyMushroomlandBiome.java | 1 + .../world/biome/land/MegalakeBiome.java | 1 + .../world/biome/land/MegalakeGroveBiome.java | 1 + .../world/features/CavePumpkinFeature.java | 29 +++++++++++++++++++ 9 files changed, 45 insertions(+) create mode 100644 src/main/java/ru/betterend/world/features/CavePumpkinFeature.java diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index b94fb3b5..85799e54 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -14,6 +14,7 @@ import ru.betterend.BetterEnd; import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.land.BiomeDefinition; import ru.betterend.world.features.BlueVineFeature; +import ru.betterend.world.features.CavePumpkinFeature; import ru.betterend.world.features.CharniaFeature; import ru.betterend.world.features.CrashedShipFeature; import ru.betterend.world.features.DefaultFeature; @@ -124,6 +125,9 @@ public class EndFeatures { public static final EndFeature GLOBULAGUS = new EndFeature("globulagus", new SinglePlantFeature(EndBlocks.GLOBULAGUS, 5, 3), 6); public static final EndFeature CLAWFERN = new EndFeature("clawfern", new SinglePlantFeature(EndBlocks.CLAWFERN, 5, 4), 5); public static final EndFeature BOLUX_MUSHROOM = new EndFeature("bolux_mushroom", new SinglePlantFeature(EndBlocks.BOLUX_MUSHROOM, 5, 5), 2); + public static final EndFeature CHORUS_MUSHROOM = new EndFeature("chorus_mushroom", new SinglePlantFeature(EndBlocks.CHORUS_MUSHROOM, 5, 5), 1); + public static final EndFeature AMBER_ROOT = new EndFeature("amber_root", new SinglePlantFeature(EndBlocks.AMBER_ROOT, 5, 5), 1); + public static final EndFeature PEARLBERRY = new EndFeature("pearlberry", new SinglePlantFeature(EndBlocks.PEARLBERRY, 5, 5), 1); // Vines // public static final EndFeature DENSE_VINE = new EndFeature("dense_vine", new VineFeature(EndBlocks.DENSE_VINE, 24), 3); @@ -217,6 +221,7 @@ public class EndFeatures { public static final DefaultFeature END_STONE_STALAGMITE = new StalactiteFeature(false, EndBlocks.END_STONE_STALACTITE, Blocks.END_STONE); public static final DefaultFeature END_STONE_STALACTITE_CAVEMOSS = new StalactiteFeature(true, EndBlocks.END_STONE_STALACTITE_CAVEMOSS, Blocks.END_STONE, EndBlocks.CAVE_MOSS); public static final DefaultFeature END_STONE_STALAGMITE_CAVEMOSS = new StalactiteFeature(false, EndBlocks.END_STONE_STALACTITE_CAVEMOSS, EndBlocks.CAVE_MOSS); + public static final DefaultFeature CAVE_PUMPKIN = new CavePumpkinFeature(); public static void registerBiomeFeatures(Identifier id, Biome biome, List>>> features) { if (id.getNamespace().equals(BetterEnd.MOD_ID)) { diff --git a/src/main/java/ru/betterend/util/BlocksHelper.java b/src/main/java/ru/betterend/util/BlocksHelper.java index c26ded02..8c39751a 100644 --- a/src/main/java/ru/betterend/util/BlocksHelper.java +++ b/src/main/java/ru/betterend/util/BlocksHelper.java @@ -226,6 +226,11 @@ public class BlocksHelper { } } } + else if (state.isOf(EndBlocks.CAVE_PUMPKIN)) { + if (!world.getBlockState(POS.up()).isOf(EndBlocks.CAVE_PUMPKIN_SEED)) { + setWithoutUpdate(world, POS, AIR); + } + } else if (!state.canPlaceAt(world, POS)) { // Chorus if (state.isOf(Blocks.CHORUS_PLANT)) { diff --git a/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java index 5d56029a..5cf745fa 100644 --- a/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java @@ -27,6 +27,7 @@ public class LushAuroraCaveBiome extends EndCaveBiome { this.addFloorFeature(EndFeatures.END_STONE_STALAGMITE_CAVEMOSS, 5); this.addCeilFeature(EndFeatures.CAVE_BUSH, 1); + this.addCeilFeature(EndFeatures.CAVE_PUMPKIN, 1); this.addCeilFeature(EndFeatures.RUBINEA, 3); this.addCeilFeature(EndFeatures.END_STONE_STALACTITE_CAVEMOSS, 10); } diff --git a/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java b/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java index d50e0ad0..e6ac94c1 100644 --- a/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java @@ -25,6 +25,7 @@ public class AmberLandBiome extends EndBiome { .addFeature(EndFeatures.LANCELEAF) .addFeature(EndFeatures.GLOW_PILLAR) .addFeature(EndFeatures.AMBER_GRASS) + .addFeature(EndFeatures.AMBER_ROOT) .addFeature(EndFeatures.BULB_MOSS) .addFeature(EndFeatures.BULB_MOSS_WOOD) .addFeature(EndFeatures.CHARNIA_ORANGE) diff --git a/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java b/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java index 1bd3c278..8535aa3c 100644 --- a/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java @@ -30,6 +30,7 @@ public class ChorusForestBiome extends EndBiome { .addFeature(Feature.VEGETAL_DECORATION, ConfiguredFeatures.CHORUS_PLANT) .addFeature(Feature.VEGETAL_DECORATION, ConfiguredFeatures.CHORUS_PLANT) .addFeature(EndFeatures.CHORUS_GRASS) + .addFeature(EndFeatures.CHORUS_MUSHROOM) .addFeature(EndFeatures.TAIL_MOSS) .addFeature(EndFeatures.TAIL_MOSS_WOOD) .addFeature(EndFeatures.CHARNIA_PURPLE) diff --git a/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java b/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java index 95a0a821..1240a138 100644 --- a/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java @@ -28,6 +28,7 @@ public class FoggyMushroomlandBiome extends EndBiome { .addFeature(EndFeatures.UMBRELLA_MOSS) .addFeature(EndFeatures.CREEPING_MOSS) .addFeature(EndFeatures.DENSE_VINE) + .addFeature(EndFeatures.PEARLBERRY) .addFeature(EndFeatures.CYAN_MOSS) .addFeature(EndFeatures.CYAN_MOSS_WOOD) .addFeature(EndFeatures.END_LILY) diff --git a/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java b/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java index d81feab2..53921f95 100644 --- a/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java @@ -25,6 +25,7 @@ public class MegalakeBiome extends EndBiome { .addFeature(EndFeatures.END_LILY_RARE) .addFeature(EndFeatures.UMBRELLA_MOSS) .addFeature(EndFeatures.CREEPING_MOSS) + .addFeature(EndFeatures.PEARLBERRY) .addFeature(EndFeatures.CHARNIA_CYAN) .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) .addFeature(EndFeatures.CHARNIA_RED_RARE) diff --git a/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java b/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java index abf34b94..19889a67 100644 --- a/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java @@ -27,6 +27,7 @@ public class MegalakeGroveBiome extends EndBiome { .addFeature(EndFeatures.BUBBLE_CORAL_RARE) .addFeature(EndFeatures.END_LILY_RARE) .addFeature(EndFeatures.UMBRELLA_MOSS) + .addFeature(EndFeatures.PEARLBERRY) .addFeature(EndFeatures.CREEPING_MOSS) .addFeature(EndFeatures.CHARNIA_CYAN) .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) diff --git a/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java b/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java new file mode 100644 index 00000000..de23780c --- /dev/null +++ b/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java @@ -0,0 +1,29 @@ +package ru.betterend.world.features; + +import java.util.Random; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.blocks.BlockProperties; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; + +public class CavePumpkinFeature extends DefaultFeature { + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + if (!world.getBlockState(pos.up()).isIn(EndTags.GEN_TERRAIN) || !world.isAir(pos) || !world.isAir(pos.down())) { + return false; + } + + int age = random.nextInt(4); + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.CAVE_PUMPKIN_SEED.getDefaultState().with(BlockProperties.AGE, age)); + if (age > 1) { + BlocksHelper.setWithoutUpdate(world, pos.down(), EndBlocks.CAVE_PUMPKIN.getDefaultState().with(BlockProperties.SMALL, age < 3)); + } + + return true; + } +} From 4ceda82bfbb5d3d69b344f49a0812aa722083fd6 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 21 Mar 2021 04:13:18 +0300 Subject: [PATCH 378/463] Fixes & textures --- .../ru/betterend/blocks/NeonCactusBlock.java | 116 ++++++++++++++++++ .../java/ru/betterend/registry/EndBlocks.java | 102 +-------------- .../ru/betterend/registry/EndFeatures.java | 1 + .../world/biome/cave/LushAuroraCaveBiome.java | 1 + .../assets/betterend/blockstates/magnula.json | 7 ++ .../betterend/blockstates/neon_cactus.json | 24 ++++ .../materialmaps/block/neon_cactus.json | 3 + .../models/block/magnula_bottom.json | 6 + .../models/block/magnula_middle.json | 6 + .../models/block/neon_cactus_big.json | 7 ++ .../models/block/neon_cactus_medium.json | 58 +++++++++ .../models/block/neon_cactus_small.json | 58 +++++++++ .../models/block/rubinea_bottom.json | 4 +- .../models/block/rubinea_middle.json | 4 +- .../assets/betterend/models/item/magnula.json | 6 + .../betterend/textures/block/chorus_plant.png | Bin 712 -> 2012 bytes .../betterend/textures/block/magnula.png | Bin 0 -> 275 bytes .../textures/block/magnula_bottom.png | Bin 0 -> 251 bytes .../textures/block/neon_cactus_big_side.png | Bin 0 -> 270 bytes .../textures/block/neon_cactus_big_top.png | Bin 0 -> 519 bytes .../block/neon_cactus_medium_side.png | Bin 0 -> 271 bytes .../textures/block/neon_cactus_medium_top.png | Bin 0 -> 222 bytes .../textures/block/neon_cactus_small_side.png | Bin 0 -> 256 bytes .../textures/block/neon_cactus_small_top.png | Bin 0 -> 192 bytes 24 files changed, 301 insertions(+), 102 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/NeonCactusBlock.java create mode 100644 src/main/resources/assets/betterend/blockstates/magnula.json create mode 100644 src/main/resources/assets/betterend/blockstates/neon_cactus.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/neon_cactus.json create mode 100644 src/main/resources/assets/betterend/models/block/magnula_bottom.json create mode 100644 src/main/resources/assets/betterend/models/block/magnula_middle.json create mode 100644 src/main/resources/assets/betterend/models/block/neon_cactus_big.json create mode 100644 src/main/resources/assets/betterend/models/block/neon_cactus_medium.json create mode 100644 src/main/resources/assets/betterend/models/block/neon_cactus_small.json create mode 100644 src/main/resources/assets/betterend/models/item/magnula.json create mode 100644 src/main/resources/assets/betterend/textures/block/magnula.png create mode 100644 src/main/resources/assets/betterend/textures/block/magnula_bottom.png create mode 100644 src/main/resources/assets/betterend/textures/block/neon_cactus_big_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/neon_cactus_big_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/neon_cactus_medium_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/neon_cactus_small_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/neon_cactus_small_top.png diff --git a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java new file mode 100644 index 00000000..b3dab068 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java @@ -0,0 +1,116 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.ShapeContext; +import net.minecraft.block.Waterloggable; +import net.minecraft.fluid.FluidState; +import net.minecraft.fluid.Fluids; +import net.minecraft.item.ItemPlacementContext; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.BooleanProperty; +import net.minecraft.state.property.DirectionProperty; +import net.minecraft.state.property.EnumProperty; +import net.minecraft.state.property.Properties; +import net.minecraft.util.BlockMirror; +import net.minecraft.util.BlockRotation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Direction.Axis; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.BlockView; +import net.minecraft.world.WorldAccess; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.blocks.basis.BlockBaseNotFull; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.util.BlocksHelper; + +public class NeonCactusBlock extends BlockBaseNotFull implements Waterloggable, IRenderTypeable { + public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; + public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; + public static final DirectionProperty FACING = Properties.FACING; + + private static final VoxelShape MEDIUM_X = Block.createCuboidShape(0, 2, 2, 16, 14, 14); + private static final VoxelShape MEDIUM_Y = Block.createCuboidShape(2, 0, 2, 14, 16, 14); + private static final VoxelShape MEDIUM_Z = Block.createCuboidShape(2, 2, 0, 14, 14, 16); + + private static final VoxelShape SMALL_X = Block.createCuboidShape(0, 4, 4, 16, 12, 12); + private static final VoxelShape SMALL_Y = Block.createCuboidShape(4, 0, 4, 12, 16, 12); + private static final VoxelShape SMALL_Z = Block.createCuboidShape(4, 4, 0, 12, 12, 16); + + public NeonCactusBlock() { + super(FabricBlockSettings.copyOf(Blocks.CACTUS).luminance(state -> { + TripleShape shape = state.get(SHAPE); + if (shape == TripleShape.TOP) { + return 15; + } + return shape == TripleShape.MIDDLE ? 13 : 10; + })); + } + + @Override + protected void appendProperties(StateManager.Builder stateManager) { + stateManager.add(SHAPE, WATERLOGGED, FACING); + } + + @Override + public BlockState getPlacementState(ItemPlacementContext ctx) { + WorldAccess worldAccess = ctx.getWorld(); + BlockPos blockPos = ctx.getBlockPos(); + return this.getDefaultState().with(WATERLOGGED, worldAccess.getFluidState(blockPos).getFluid() == Fluids.WATER).with(FACING, ctx.getSide()); + } + + @Override + public BlockState rotate(BlockState state, BlockRotation rotation) { + return BlocksHelper.rotateHorizontal(state, rotation, FACING); + } + + @Override + public BlockState mirror(BlockState state, BlockMirror mirror) { + return BlocksHelper.mirrorHorizontal(state, mirror, FACING); + } + + @Override + public FluidState getFluidState(BlockState state) { + return (Boolean) state.get(WATERLOGGED) ? Fluids.WATER.getStill(false) : super.getFluidState(state); + } + + @Override + public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState newState, WorldAccess world, BlockPos pos, BlockPos posFrom) { + if ((Boolean) state.get(WATERLOGGED)) { + world.getFluidTickScheduler().schedule(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + } + return state; + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + TripleShape shape = state.get(SHAPE); + + if (shape == TripleShape.BOTTOM) { + return VoxelShapes.fullCube(); + } + Axis dir = state.get(FACING).getAxis(); + if (shape == TripleShape.MIDDLE) { + if (dir == Axis.Y) { + return MEDIUM_Y; + } + return dir == Axis.X ? MEDIUM_X : MEDIUM_Z; + } + else { + if (dir == Axis.Y) { + return SMALL_Y; + } + return dir == Axis.X ? SMALL_X : SMALL_Z; + } + } +} diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index f2186f82..0bd65fee 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -9,104 +9,7 @@ import net.minecraft.item.LilyPadItem; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; import ru.betterend.BetterEnd; -import ru.betterend.blocks.AeterniumAnvil; -import ru.betterend.blocks.AeterniumBlock; -import ru.betterend.blocks.AmaranitaCapBlock; -import ru.betterend.blocks.AmaranitaHymenophoreBlock; -import ru.betterend.blocks.AmaranitaStemBlock; -import ru.betterend.blocks.AmberBlock; -import ru.betterend.blocks.AncientEmeraldIceBlock; -import ru.betterend.blocks.AuroraCrystalBlock; -import ru.betterend.blocks.BlueVineBlock; -import ru.betterend.blocks.BlueVineLanternBlock; -import ru.betterend.blocks.BlueVineSeedBlock; -import ru.betterend.blocks.BoluxMushroomBlock; -import ru.betterend.blocks.BrimstoneBlock; -import ru.betterend.blocks.BubbleCoralBlock; -import ru.betterend.blocks.BulbVineBlock; -import ru.betterend.blocks.BulbVineLanternBlock; -import ru.betterend.blocks.BulbVineLanternColoredBlock; -import ru.betterend.blocks.BulbVineSeedBlock; -import ru.betterend.blocks.CavePumpkinBlock; -import ru.betterend.blocks.CavePumpkinVineBlock; -import ru.betterend.blocks.ChandelierBlock; -import ru.betterend.blocks.CharcoalBlock; -import ru.betterend.blocks.CharniaBlock; -import ru.betterend.blocks.ChorusGrassBlock; -import ru.betterend.blocks.DenseEmeraldIceBlock; -import ru.betterend.blocks.DenseSnowBlock; -import ru.betterend.blocks.DragonTreeSaplingBlock; -import ru.betterend.blocks.EmeraldIceBlock; -import ru.betterend.blocks.EndLilyBlock; -import ru.betterend.blocks.EndLilySeedBlock; -import ru.betterend.blocks.EndLotusFlowerBlock; -import ru.betterend.blocks.EndLotusLeafBlock; -import ru.betterend.blocks.EndLotusSeedBlock; -import ru.betterend.blocks.EndLotusStemBlock; -import ru.betterend.blocks.EndPathBlock; -import ru.betterend.blocks.EndPortalBlock; -import ru.betterend.blocks.EndStoneSmelter; -import ru.betterend.blocks.EndTerrainBlock; -import ru.betterend.blocks.EnderBlock; -import ru.betterend.blocks.EndstoneDustBlock; -import ru.betterend.blocks.EternalPedestal; -import ru.betterend.blocks.EternalRunedFlavolite; -import ru.betterend.blocks.FilaluxLanternBlock; -import ru.betterend.blocks.FlamaeaBlock; -import ru.betterend.blocks.GlowingHymenophoreBlock; -import ru.betterend.blocks.GlowingMossBlock; -import ru.betterend.blocks.GlowingPillarLuminophorBlock; -import ru.betterend.blocks.GlowingPillarRootsBlock; -import ru.betterend.blocks.GlowingPillarSeedBlock; -import ru.betterend.blocks.HelixTreeLeavesBlock; -import ru.betterend.blocks.HelixTreeSaplingBlock; -import ru.betterend.blocks.HydraluxBlock; -import ru.betterend.blocks.HydraluxPetalBlock; -import ru.betterend.blocks.HydraluxPetalColoredBlock; -import ru.betterend.blocks.HydraluxSaplingBlock; -import ru.betterend.blocks.HydrothermalVentBlock; -import ru.betterend.blocks.InfusionPedestal; -import ru.betterend.blocks.JellyshroomCapBlock; -import ru.betterend.blocks.LacugroveSaplingBlock; -import ru.betterend.blocks.LanceleafBlock; -import ru.betterend.blocks.LanceleafSeedBlock; -import ru.betterend.blocks.LargeAmaranitaBlock; -import ru.betterend.blocks.LumecornBlock; -import ru.betterend.blocks.LumecornSeedBlock; -import ru.betterend.blocks.MengerSpongeBlock; -import ru.betterend.blocks.MengerSpongeWetBlock; -import ru.betterend.blocks.MissingTileBlock; -import ru.betterend.blocks.MossyDragonBoneBlock; -import ru.betterend.blocks.MossyGlowshroomCapBlock; -import ru.betterend.blocks.MossyGlowshroomSaplingBlock; -import ru.betterend.blocks.MossyObsidian; -import ru.betterend.blocks.MurkweedBlock; -import ru.betterend.blocks.NeedlegrassBlock; -import ru.betterend.blocks.PedestalVanilla; -import ru.betterend.blocks.PythadendronSaplingBlock; -import ru.betterend.blocks.RespawnObeliskBlock; -import ru.betterend.blocks.RunedFlavolite; -import ru.betterend.blocks.ShadowBerryBlock; -import ru.betterend.blocks.ShadowGrassBlock; -import ru.betterend.blocks.SilkMothHiveBlock; -import ru.betterend.blocks.SilkMothNestBlock; -import ru.betterend.blocks.SmallAmaranitaBlock; -import ru.betterend.blocks.SmallJellyshroomBlock; -import ru.betterend.blocks.SmaragdantCrystalBlock; -import ru.betterend.blocks.SmaragdantCrystalShardBlock; -import ru.betterend.blocks.SulphurCrystalBlock; -import ru.betterend.blocks.TenaneaFlowersBlock; -import ru.betterend.blocks.TenaneaSaplingBlock; -import ru.betterend.blocks.TerrainPlantBlock; -import ru.betterend.blocks.TwistedUmbrellaMossBlock; -import ru.betterend.blocks.TwistedUmbrellaMossTallBlock; -import ru.betterend.blocks.UmbrellaMossBlock; -import ru.betterend.blocks.UmbrellaMossTallBlock; -import ru.betterend.blocks.UmbrellaTreeClusterBlock; -import ru.betterend.blocks.UmbrellaTreeClusterEmptyBlock; -import ru.betterend.blocks.UmbrellaTreeMembraneBlock; -import ru.betterend.blocks.UmbrellaTreeSaplingBlock; -import ru.betterend.blocks.VentBubbleColumnBlock; +import ru.betterend.blocks.*; import ru.betterend.blocks.basis.EndCropBlock; import ru.betterend.blocks.basis.EndFurnaceBlock; import ru.betterend.blocks.basis.EndLeavesBlock; @@ -298,6 +201,8 @@ public class EndBlocks { public static final Block AMARANITA_FUR = registerBlock("amaranita_fur", new FurBlock(MOSSY_GLOWSHROOM_SAPLING, 15, 4)); public static final Block AMARANITA_CAP = registerBlock("amaranita_cap", new AmaranitaCapBlock()); + public static final Block NEON_CACTUS = registerBlock("neon_cactus", new NeonCactusBlock()); + // Crops public static final Block SHADOW_BERRY = registerBlock("shadow_berry", new ShadowBerryBlock()); public static final Block BLOSSOM_BERRY = registerBlock("blossom_berry_seed", new EndCropBlock(EndItems.BLOSSOM_BERRY, PINK_MOSS)); @@ -353,6 +258,7 @@ public class EndBlocks { public static final Block BULB_VINE = registerBlock("bulb_vine", new BulbVineBlock()); public static final Block JUNGLE_VINE = registerBlock("jungle_vine", new VineBlock()); public static final Block RUBINEA = registerBlock("rubinea", new VineBlock()); + public static final Block MAGNULA = registerBlock("magnula", new VineBlock()); public static final Block FILALUX = registerBlock("filalux", new FilaluxBlock()); public static final Block FILALUX_WINGS = registerBlock("filalux_wings", new FilaluxWingsBlock()); public static final Block FILALUX_LANTERN = registerBlock("filalux_lantern", new FilaluxLanternBlock()); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 85799e54..44ba276b 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -217,6 +217,7 @@ public class EndFeatures { public static final DefaultFeature CAVE_BUSH = new BushFeature(EndBlocks.CAVE_BUSH, EndBlocks.CAVE_BUSH); public static final DefaultFeature CAVE_GRASS = new SingleBlockFeature(EndBlocks.CAVE_GRASS); public static final DefaultFeature RUBINEA = new VineFeature(EndBlocks.RUBINEA, 8); + public static final DefaultFeature MAGNULA = new VineFeature(EndBlocks.MAGNULA, 8); public static final DefaultFeature END_STONE_STALACTITE = new StalactiteFeature(true, EndBlocks.END_STONE_STALACTITE, Blocks.END_STONE); public static final DefaultFeature END_STONE_STALAGMITE = new StalactiteFeature(false, EndBlocks.END_STONE_STALACTITE, Blocks.END_STONE); public static final DefaultFeature END_STONE_STALACTITE_CAVEMOSS = new StalactiteFeature(true, EndBlocks.END_STONE_STALACTITE_CAVEMOSS, Blocks.END_STONE, EndBlocks.CAVE_MOSS); diff --git a/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java index 5cf745fa..d6052b44 100644 --- a/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java @@ -29,6 +29,7 @@ public class LushAuroraCaveBiome extends EndCaveBiome { this.addCeilFeature(EndFeatures.CAVE_BUSH, 1); this.addCeilFeature(EndFeatures.CAVE_PUMPKIN, 1); this.addCeilFeature(EndFeatures.RUBINEA, 3); + this.addCeilFeature(EndFeatures.MAGNULA, 1); this.addCeilFeature(EndFeatures.END_STONE_STALACTITE_CAVEMOSS, 10); } diff --git a/src/main/resources/assets/betterend/blockstates/magnula.json b/src/main/resources/assets/betterend/blockstates/magnula.json new file mode 100644 index 00000000..327b9ae0 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/magnula.json @@ -0,0 +1,7 @@ +{ + "variants": { + "shape=top": { "model": "betterend:block/magnula_middle" }, + "shape=middle": { "model": "betterend:block/magnula_middle" }, + "shape=bottom": { "model": "betterend:block/magnula_bottom" } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/neon_cactus.json b/src/main/resources/assets/betterend/blockstates/neon_cactus.json new file mode 100644 index 00000000..d72dcb4c --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/neon_cactus.json @@ -0,0 +1,24 @@ +{ + "variants": { + "shape=bottom,facing=up": { "model": "betterend:block/neon_cactus_big" }, + "shape=bottom,facing=down": { "model": "betterend:block/neon_cactus_big", "x": 180 }, + "shape=bottom,facing=north": { "model": "betterend:block/neon_cactus_big", "x": 90 }, + "shape=bottom,facing=south": { "model": "betterend:block/neon_cactus_big", "x": 90, "y": 180 }, + "shape=bottom,facing=east": { "model": "betterend:block/neon_cactus_big", "x": 90, "y": 90 }, + "shape=bottom,facing=west": { "model": "betterend:block/neon_cactus_big", "x": 90, "y": 270 }, + + "shape=middle,facing=up": { "model": "betterend:block/neon_cactus_medium" }, + "shape=middle,facing=down": { "model": "betterend:block/neon_cactus_medium", "x": 180 }, + "shape=middle,facing=north": { "model": "betterend:block/neon_cactus_medium", "x": 90 }, + "shape=middle,facing=south": { "model": "betterend:block/neon_cactus_medium", "x": 90, "y": 180 }, + "shape=middle,facing=east": { "model": "betterend:block/neon_cactus_medium", "x": 90, "y": 90 }, + "shape=middle,facing=west": { "model": "betterend:block/neon_cactus_medium", "x": 90, "y": 270 }, + + "shape=top,facing=up": { "model": "betterend:block/neon_cactus_small" }, + "shape=top,facing=down": { "model": "betterend:block/neon_cactus_small", "x": 180 }, + "shape=top,facing=north": { "model": "betterend:block/neon_cactus_small", "x": 90 }, + "shape=top,facing=south": { "model": "betterend:block/neon_cactus_small", "x": 90, "y": 180 }, + "shape=top,facing=east": { "model": "betterend:block/neon_cactus_small", "x": 90, "y": 90 }, + "shape=top,facing=west": { "model": "betterend:block/neon_cactus_small", "x": 90, "y": 270 } + } +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/neon_cactus.json b/src/main/resources/assets/betterend/materialmaps/block/neon_cactus.json new file mode 100644 index 00000000..36db9946 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/neon_cactus.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_50" +} diff --git a/src/main/resources/assets/betterend/models/block/magnula_bottom.json b/src/main/resources/assets/betterend/models/block/magnula_bottom.json new file mode 100644 index 00000000..7845801a --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/magnula_bottom.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/magnula_bottom" + } +} diff --git a/src/main/resources/assets/betterend/models/block/magnula_middle.json b/src/main/resources/assets/betterend/models/block/magnula_middle.json new file mode 100644 index 00000000..75c4a5f8 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/magnula_middle.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/magnula" + } +} diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_big.json b/src/main/resources/assets/betterend/models/block/neon_cactus_big.json new file mode 100644 index 00000000..1c42b356 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_big.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "betterend:block/neon_cactus_big_top", + "side": "betterend:block/neon_cactus_big_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_medium.json b/src/main/resources/assets/betterend/models/block/neon_cactus_medium.json new file mode 100644 index 00000000..0c8dded1 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_medium.json @@ -0,0 +1,58 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/neon_cactus_small_side", + "side": "betterend:block/neon_cactus_medium_side", + "top": "betterend:block/neon_cactus_medium_top" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 2, 0, 2 ], + "to": [ 14, 16, 14 ], + "shade": false, + "faces": { + "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "north": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, + "south": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, + "west": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, + "east": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0, 0, 0 ], + "to": [ 0.001, 16, 22.5 ], + "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, 0, 0 ], + "to": [ 16.001, 16, 22.5 ], + "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + }, + { + "__comment": "Box1", + "from": [ 2, -2, 2 ], + "to": [ 14, 0, 14 ], + "shade": false, + "faces": { + "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "north": { "uv": [ 2, 0, 14, 2 ], "texture": "#side" }, + "south": { "uv": [ 2, 0, 14, 2 ], "texture": "#side" }, + "west": { "uv": [ 2, 0, 14, 2 ], "texture": "#side" }, + "east": { "uv": [ 2, 0, 14, 2 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_small.json b/src/main/resources/assets/betterend/models/block/neon_cactus_small.json new file mode 100644 index 00000000..91da5dc6 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_small.json @@ -0,0 +1,58 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/neon_cactus_small_side", + "side": "betterend:block/neon_cactus_small_side", + "top": "betterend:block/neon_cactus_small_top" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 4, 0, 4 ], + "to": [ 12, 16, 12 ], + "shade": false, + "faces": { + "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "north": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, + "south": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, + "west": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, + "east": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0, 0, 0 ], + "to": [ 0.001, 16, 22.5 ], + "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, 0, 0 ], + "to": [ 16.001, 16, 22.5 ], + "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + }, + { + "__comment": "Box1", + "from": [ 4, -4, 4 ], + "to": [ 12, 0, 12 ], + "shade": false, + "faces": { + "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "north": { "uv": [ 4, 0, 12, 4 ], "texture": "#side" }, + "south": { "uv": [ 4, 0, 12, 4 ], "texture": "#side" }, + "west": { "uv": [ 4, 0, 12, 4 ], "texture": "#side" }, + "east": { "uv": [ 4, 0, 12, 4 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/rubinea_bottom.json b/src/main/resources/assets/betterend/models/block/rubinea_bottom.json index 37fb8bb5..7a860b43 100644 --- a/src/main/resources/assets/betterend/models/block/rubinea_bottom.json +++ b/src/main/resources/assets/betterend/models/block/rubinea_bottom.json @@ -1,6 +1,6 @@ { - "parent": "betterend:block/cross_no_distortion", + "parent": "block/cross", "textures": { - "texture": "betterend:block/rubinea_bottom" + "cross": "betterend:block/rubinea_bottom" } } diff --git a/src/main/resources/assets/betterend/models/block/rubinea_middle.json b/src/main/resources/assets/betterend/models/block/rubinea_middle.json index b99830f1..9f15fd91 100644 --- a/src/main/resources/assets/betterend/models/block/rubinea_middle.json +++ b/src/main/resources/assets/betterend/models/block/rubinea_middle.json @@ -1,6 +1,6 @@ { - "parent": "betterend:block/cross_no_distortion", + "parent": "block/cross", "textures": { - "texture": "betterend:block/rubinea" + "cross": "betterend:block/rubinea" } } diff --git a/src/main/resources/assets/betterend/models/item/magnula.json b/src/main/resources/assets/betterend/models/item/magnula.json new file mode 100644 index 00000000..f5c0f11c --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/magnula.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/magnula_bottom" + } +} diff --git a/src/main/resources/assets/betterend/textures/block/chorus_plant.png b/src/main/resources/assets/betterend/textures/block/chorus_plant.png index 2bf9e6f223652cd03dfdf7ff91fcef5d9a8bc91c..828b15af00d50b2e74b5e5423733464a0640cdd3 100644 GIT binary patch delta 1346 zcmbVMO>5LZ7>-3j@u1+vYBG~#zcMtIx?Aajsij?Ly*WFX?1mz$l5+0*^dh@s3VK~`njs~WVo3#B6!~6Jf7!jZ|*Z_ zHdSsKVC^tU13oP7pLxStL@-ack!=~sF|2B*L^P2 zgDqzXDk~=-f?Ns?C=Pj^5UDy!NRPoR?dc#Z=YHcRk9jUFOaGjS8@`X*X(32TS-a)w zQn(pK0S>E`kXVjwkcPtyyITni7rE3xtkMXXMI2fu^Y<-I2P(hw_rV|U%fAym%_G@k zB)**J0v^?Qsxt6SRLGQ#XRUF-UQGW=97kYM4VX|>=AKSfc3Gg$j-&sM!IXB`XOi?x z%9k=;%9KxW1rNoL0G|+7 zAZ?N~*R^7I%*3l%3!gP_`yRxlS}tO_R556$USgNDa4Jv*S4ogxFvEWssOuC71B!Ne zx;TbNOx5jo6k;*tU}80$^uNBs(Av_&Q72c~iFsLoXyiu!$1cbDrs|*6u{g8y!SnMx z2T!%^{ryJS_V`Jcl8-938=gFxmZiP;wswXvt4ZOh#Ei>5IT><3%YLeuefUaWj MboFyt=akR{0MSZkcK`qY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/magnula_bottom.png b/src/main/resources/assets/betterend/textures/block/magnula_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..eda6b9633a683f8621eb7ebab274ecd65c6245cd GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~#Q>iWS0HVY zG}pCacg)1ASqq;vZ~Gp^rCKgxxl}P|r(WVI%eEak7F}3%MqmYv!2lE91jfD603C{aVAG?Y9{8nQuXuEh>DT4FN{meIC4zMoD-M-WI zLE`#*u`4q;odVaNGxB25W}3KLAtG;8Mti!m;MVhkNr7)~A7p%GIG0hPY4TR?AFL;H m<}LnlXQsyk>l&H*Gty;lObjL*&({JiXYh3Ob6Mw<&;$T+hhF&r literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side.png new file mode 100644 index 0000000000000000000000000000000000000000..2c681c7d49e17f7e9fafe4b6493bfd72548bec66 GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~l>na*S0Ei5 zSeuj5Q&zd6e!_{473WHJU5LDL@%ZuMSFc`u{P^+5j~@m7&n^S1<0%R93ugF_0Gvkx z)PUj*o-U3d5>sQ(dkQfdaxgn|ALah@fB(ccPbLWmpH=wKa5U!f+RtJ<7W<9XWIg3+ za^3dejp=8`>YU6EjjP4y#N7ONT0vr=*M)@v4Nr46H){P&+@aXCnYGWO>3hS^v-Odo z%pcldh+TZo>Y<<7;e*^#Q4wh@*6=!Y-x`n~h)z4*} HQ$iB}Sl@Qk literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_big_top.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_top.png new file mode 100644 index 0000000000000000000000000000000000000000..f3c4c0a81c4a4720ea36a78a4502ff0a7d158d46 GIT binary patch literal 519 zcmV+i0{H!jP)Px$!AV3xR5*=glfjCcP!xtgjYw|-4QSFx;v#e*lak^K%%){tVAiFNQs{%ptoi~% zrj)EwVp1h4$bb&hiJ3)mZ!|e8@&B*qocsN1-|v4M`gWi0&_#@u_GyrP<%bIKt>REc^ z8ABR`VqY6dne9)O}4}APv)2$BV;gWQ{ z#@KhT`xeHl#`~u;g>o02F^YJK7azOl$x8i=z%dgc^iKOX^*31f3$#@2YLEZ`002ov JPDHLkV1kp1<39iZ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side.png new file mode 100644 index 0000000000000000000000000000000000000000..1323e564aa84ca4dac0f946e533aacaf6ab357b8 GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~l>na*S0J4f znpKouT~jl=ZPJ1MRmZFLoQ%DC`uOqVSFc`u{P^+5j~|=dvO(&3N`m}?8U7;x=aB$4 zpm?LFi(`nyRMY-wp#usW%$3s*{e6GC;i`PQ>>U>+A=CbfL!mRCF?>1mj$6uMHQNl1 zV_Jf>pF0bJS1NfO>pCv9vT(zy-YtwT7-qL>U042laJDdaCf9en#>vM6cVvYvc%b~$ zJU7V4KiEx>;Yf~Ge1pX8WoL_$b7o&-ZJY6@zPh3B3$xEbmhjz)8NYyzVeoYIb6Mw< G&;$TS_i;=B literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_top.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_top.png new file mode 100644 index 0000000000000000000000000000000000000000..74f13b760baba716f41b1fe1aa44eefeae0c9046 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~i2$DvS0J4f znpKouT~jl=ZPJ1MRmZFLoQ%DC+HdJAEub7nNswPK!+!|4dMd;SD3;*q;us<^wYT3> zh{2G9NqNVg|Hqpn)viBDm>SDc(9@pI7Qug()q$y`m$m9+M?sPHi-}V;H#xi)N_lme zQS{3xhINP3E#xMJ$MSFB-ITn+vHe`coTPQF^@dx`HkTeay;7bng7N(te|Be}T@0SC KelF{r5}E)#{!r`y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side.png new file mode 100644 index 0000000000000000000000000000000000000000..a1ea7629c34a39b1c733678cc084f5748b14f2c3 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~l>na*S0J4c z5nG;}+gRVzHD$x(HQVa-h2GSFc`u{P^+5k019b1TO=s<0%R93ugF_0Gvkx z)PUkeo-U3d5>svaJcSq(IhZ3wrvCh2uYROeI(A_*$FViNf_aC2GVJMp@wUNdW0^yp z%IX6hY1)!Axz!mL6yHA)lI}D=<)x+m`HH%JB4qa_eE6S81`UwHTDj_aE^0 r_TySojB~Xr|B*-tA;XediJr!aE6m#-)aSV}|y7s&` zAA=$XbHH2nclF8E(xu-fZK%}rm3VxyVH0c4g4L&O9&Fldbz#}0ox;BkUcdOAQ%Un_ g8|MFVdQ&MBb@0CRCgasU7T literal 0 HcmV?d00001 From 12447f783f5dc533e6cb9ce5f533291f320ab7e5 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 21 Mar 2021 06:37:42 +0300 Subject: [PATCH 379/463] Neon oasis (WIP) --- .../ru/betterend/blocks/NeonCactusBlock.java | 56 ++++++++---- .../java/ru/betterend/registry/EndBiomes.java | 2 + .../ru/betterend/registry/EndFeatures.java | 2 + .../world/biome/land/DustWastelandsBiome.java | 1 - .../world/biome/land/NeonOasisBiome.java | 26 ++++++ .../world/features/NeonCactusFeature.java | 82 ++++++++++++++++++ .../assets/betterend/lang/en_us.json | 9 +- .../assets/betterend/lang/ru_ru.json | 9 +- .../materialmaps/block/neon_cactus.json | 2 +- .../betterend/materials/glow_80_cyan.json | 10 +++ .../models/block/neon_cactus_medium.json | 30 ++----- .../models/block/neon_cactus_small.json | 30 ++----- .../shaders/material/glow_80_cyan.frag | 6 ++ .../textures/block/cave_bush_leaves_2_e.png | Bin 0 -> 148 bytes .../textures/block/cave_bush_leaves_3_e.png | Bin 0 -> 179 bytes .../textures/block/cave_bush_leaves_4_e.png | Bin 0 -> 182 bytes 16 files changed, 202 insertions(+), 63 deletions(-) create mode 100644 src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java create mode 100644 src/main/java/ru/betterend/world/features/NeonCactusFeature.java create mode 100644 src/main/resources/assets/betterend/materials/glow_80_cyan.json create mode 100644 src/main/resources/assets/betterend/shaders/material/glow_80_cyan.frag create mode 100644 src/main/resources/assets/betterend/textures/block/cave_bush_leaves_2_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/cave_bush_leaves_3_e.png create mode 100644 src/main/resources/assets/betterend/textures/block/cave_bush_leaves_4_e.png diff --git a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java index b3dab068..b746f5a6 100644 --- a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java +++ b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java @@ -1,5 +1,9 @@ package ru.betterend.blocks; +import java.util.EnumMap; + +import com.google.common.collect.Maps; + import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -34,13 +38,10 @@ public class NeonCactusBlock extends BlockBaseNotFull implements Waterloggable, public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; public static final DirectionProperty FACING = Properties.FACING; - private static final VoxelShape MEDIUM_X = Block.createCuboidShape(0, 2, 2, 16, 14, 14); - private static final VoxelShape MEDIUM_Y = Block.createCuboidShape(2, 0, 2, 14, 16, 14); - private static final VoxelShape MEDIUM_Z = Block.createCuboidShape(2, 2, 0, 14, 14, 16); - - private static final VoxelShape SMALL_X = Block.createCuboidShape(0, 4, 4, 16, 12, 12); - private static final VoxelShape SMALL_Y = Block.createCuboidShape(4, 0, 4, 12, 16, 12); - private static final VoxelShape SMALL_Z = Block.createCuboidShape(4, 4, 0, 12, 12, 16); + private static final EnumMap MEDIUM_SHAPES_OPEN = Maps.newEnumMap(Direction.class); + private static final EnumMap SMALL_SHAPES_OPEN = Maps.newEnumMap(Direction.class); + private static final EnumMap MEDIUM_SHAPES = Maps.newEnumMap(Axis.class); + private static final EnumMap SMALL_SHAPES = Maps.newEnumMap(Axis.class); public NeonCactusBlock() { super(FabricBlockSettings.copyOf(Blocks.CACTUS).luminance(state -> { @@ -50,6 +51,7 @@ public class NeonCactusBlock extends BlockBaseNotFull implements Waterloggable, } return shape == TripleShape.MIDDLE ? 13 : 10; })); + setDefaultState(getDefaultState().with(WATERLOGGED, false).with(FACING, Direction.UP).with(SHAPE, TripleShape.TOP)); } @Override @@ -99,18 +101,38 @@ public class NeonCactusBlock extends BlockBaseNotFull implements Waterloggable, if (shape == TripleShape.BOTTOM) { return VoxelShapes.fullCube(); } - Axis dir = state.get(FACING).getAxis(); - if (shape == TripleShape.MIDDLE) { - if (dir == Axis.Y) { - return MEDIUM_Y; - } - return dir == Axis.X ? MEDIUM_X : MEDIUM_Z; + Direction dir = state.get(FACING); + BlockState next = view.getBlockState(pos.offset(dir)); + if (next.isOf(this)) { + Axis axis = dir.getAxis(); + return shape == TripleShape.MIDDLE ? MEDIUM_SHAPES.get(axis) : SMALL_SHAPES.get(axis); } else { - if (dir == Axis.Y) { - return SMALL_Y; - } - return dir == Axis.X ? SMALL_X : SMALL_Z; + return shape == TripleShape.MIDDLE ? MEDIUM_SHAPES_OPEN.get(dir) : SMALL_SHAPES_OPEN.get(dir); } } + + static { + MEDIUM_SHAPES.put(Axis.X, Block.createCuboidShape(0, 2, 2, 16, 14, 14)); + MEDIUM_SHAPES.put(Axis.Y, Block.createCuboidShape(2, 0, 2, 14, 16, 14)); + MEDIUM_SHAPES.put(Axis.Z, Block.createCuboidShape(2, 2, 0, 14, 14, 16)); + + SMALL_SHAPES.put(Axis.X, Block.createCuboidShape(0, 4, 4, 16, 12, 12)); + SMALL_SHAPES.put(Axis.Y, Block.createCuboidShape(4, 0, 4, 12, 16, 12)); + SMALL_SHAPES.put(Axis.Z, Block.createCuboidShape(4, 4, 0, 12, 12, 16)); + + MEDIUM_SHAPES_OPEN.put(Direction.UP, Block.createCuboidShape(2, 0, 2, 14, 14, 14)); + MEDIUM_SHAPES_OPEN.put(Direction.DOWN, Block.createCuboidShape(2, 2, 2, 14, 16, 14)); + MEDIUM_SHAPES_OPEN.put(Direction.NORTH, Block.createCuboidShape(2, 2, 2, 14, 14, 16)); + MEDIUM_SHAPES_OPEN.put(Direction.SOUTH, Block.createCuboidShape(2, 2, 0, 14, 14, 14)); + MEDIUM_SHAPES_OPEN.put(Direction.WEST, Block.createCuboidShape(2, 2, 2, 16, 14, 14)); + MEDIUM_SHAPES_OPEN.put(Direction.EAST, Block.createCuboidShape(0, 2, 2, 14, 14, 14)); + + SMALL_SHAPES_OPEN.put(Direction.UP, Block.createCuboidShape(4, 0, 4, 12, 12, 12)); + SMALL_SHAPES_OPEN.put(Direction.DOWN, Block.createCuboidShape(4, 4, 4, 12, 16, 12)); + SMALL_SHAPES_OPEN.put(Direction.NORTH, Block.createCuboidShape(4, 4, 4, 12, 12, 16)); + SMALL_SHAPES_OPEN.put(Direction.SOUTH, Block.createCuboidShape(4, 4, 0, 12, 12, 12)); + SMALL_SHAPES_OPEN.put(Direction.WEST, Block.createCuboidShape(4, 4, 4, 16, 12, 12)); + SMALL_SHAPES_OPEN.put(Direction.EAST, Block.createCuboidShape(0, 4, 4, 12, 12, 12)); + } } diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index dd649a71..c32494ad 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -52,6 +52,7 @@ import ru.betterend.world.biome.land.GlowingGrasslandsBiome; import ru.betterend.world.biome.land.LanternWoodsBiome; import ru.betterend.world.biome.land.MegalakeBiome; import ru.betterend.world.biome.land.MegalakeGroveBiome; +import ru.betterend.world.biome.land.NeonOasisBiome; import ru.betterend.world.biome.land.PaintedMountainsBiome; import ru.betterend.world.biome.land.ShadowForestBiome; import ru.betterend.world.biome.land.SulphurSpringsBiome; @@ -99,6 +100,7 @@ public class EndBiomes { public static final EndBiome DRAGON_GRAVEYARDS = registerBiome(new DragonGraveyardsBiome(), BiomeType.LAND); public static final EndBiome DRY_SHRUBLAND = registerBiome(new DryShrublandBiome(), BiomeType.LAND); public static final EndBiome LANTERN_WOODS = registerBiome(new LanternWoodsBiome(), BiomeType.LAND); + public static final EndBiome NEON_OASIS = registerSubBiome(new NeonOasisBiome(), DUST_WASTELANDS); // Better End Void public static final EndBiome ICE_STARFIELD = registerBiome(new BiomeIceStarfield(), BiomeType.VOID); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 44ba276b..ca213e77 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -28,6 +28,7 @@ import ru.betterend.world.features.GlowPillarFeature; import ru.betterend.world.features.HydraluxFeature; import ru.betterend.world.features.LanceleafFeature; import ru.betterend.world.features.MengerSpongeFeature; +import ru.betterend.world.features.NeonCactusFeature; import ru.betterend.world.features.OverworldIslandFeature; import ru.betterend.world.features.SilkMothNestFeature; import ru.betterend.world.features.SingleInvertedScatterFeature; @@ -90,6 +91,7 @@ public class EndFeatures { public static final EndFeature LUMECORN = new EndFeature("lumecorn", new Lumecorn(), 5); public static final EndFeature LARGE_AMARANITA = new EndFeature("large_amaranita", new LargeAmaranitaFeature(), 5); public static final EndFeature LUCERNIA_BUSH = new EndFeature("lucernia_bush", new BushWithOuterFeature(EndBlocks.LUCERNIA_LEAVES, EndBlocks.LUCERNIA_OUTER_LEAVES, EndBlocks.LUCERNIA.bark), 10); + public static final EndFeature NEON_CACTUS = new EndFeature("neon_cactus", new NeonCactusFeature(), 2); // Plants // public static final EndFeature UMBRELLA_MOSS = new EndFeature("umbrella_moss", new DoublePlantFeature(EndBlocks.UMBRELLA_MOSS, EndBlocks.UMBRELLA_MOSS_TALL, 5), 5); diff --git a/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java b/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java index 481ea926..50d3b5f9 100644 --- a/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java @@ -12,7 +12,6 @@ public class DustWastelandsBiome extends EndBiome { super(new BiomeDefinition("dust_wastelands") .setFogColor(226, 239, 168) .setFogDensity(2) - .setCaves(false) .setWaterAndFogColor(192, 180, 131) .setSurface(EndBlocks.ENDSTONE_DUST) .setParticles(ParticleTypes.WHITE_ASH, 0.01F) diff --git a/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java b/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java new file mode 100644 index 00000000..0b896855 --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java @@ -0,0 +1,26 @@ +package ru.betterend.world.biome.land; + +import net.minecraft.entity.EntityType; +import net.minecraft.particle.ParticleTypes; +import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.EndBiome; + +public class NeonOasisBiome extends EndBiome { + public NeonOasisBiome() { + super(new BiomeDefinition("neon_oasis") + .setGenChance(0.5F) + .setFogColor(226, 239, 168) + .setFogDensity(2) + .setWaterAndFogColor(192, 180, 131) + .setSurface(EndBlocks.ENDSTONE_DUST, EndBlocks.END_MOSS) + .setParticles(ParticleTypes.WHITE_ASH, 0.01F) + .setLoop(EndSounds.AMBIENT_DUST_WASTELANDS) + .setMusic(EndSounds.MUSIC_OPENSPACE) + .addFeature(EndFeatures.NEON_CACTUS) + .addStructureFeature(ConfiguredStructureFeatures.END_CITY) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + } +} diff --git a/src/main/java/ru/betterend/world/features/NeonCactusFeature.java b/src/main/java/ru/betterend/world/features/NeonCactusFeature.java new file mode 100644 index 00000000..f62ae4ab --- /dev/null +++ b/src/main/java/ru/betterend/world/features/NeonCactusFeature.java @@ -0,0 +1,82 @@ +package ru.betterend.world.features; + +import java.util.Random; + +import net.minecraft.state.property.Properties; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.util.math.Direction; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.blocks.BlockProperties; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; + +public class NeonCactusFeature extends DefaultFeature { + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + if (!world.getBlockState(pos.down()).isOf(EndBlocks.ENDSTONE_DUST)) { + return false; + } + + int h = MHelper.randRange(5, 20, random); + Mutable mut = new Mutable().set(pos); + Direction hor = BlocksHelper.randomHorizontal(random); + for (int i = 0; i < h; i++) { + if (!world.getBlockState(mut).getMaterial().isReplaceable()) { + break; + } + int size = (h - i) >> 2; + BlocksHelper.setWithUpdate(world, mut, + EndBlocks.NEON_CACTUS.getDefaultState() + .with(BlockProperties.TRIPLE_SHAPE, getBySize(size)) + .with(Properties.FACING, Direction.UP) + ); + if (i > 2 && i < (h - 1) && random.nextBoolean()) { + int length = h - i - MHelper.randRange(1, 2, random); + if (length > 0) { + Direction dir2 = hor; + hor = hor.rotateYClockwise(); + int bsize = i > ((h << 1) / 3) ? 0 : size > 1 ? 1 : size; + branch(world, mut.offset(dir2), dir2, random, length, bsize); + } + } + mut.move(Direction.UP); + } + + return true; + } + + private void branch(StructureWorldAccess world, BlockPos pos, Direction dir, Random random, int length, int size) { + int rotIndex = length >> 2; + Mutable mut = new Mutable().set(pos); + Direction hor = BlocksHelper.randomHorizontal(random); + for (int i = 0; i < length; i++) { + if (!world.getBlockState(mut).getMaterial().isReplaceable()) { + return; + } + BlocksHelper.setWithUpdate(world, mut, + EndBlocks.NEON_CACTUS.getDefaultState() + .with(BlockProperties.TRIPLE_SHAPE, getBySize(size)) + .with(Properties.FACING, dir) + ); + if (i == rotIndex) { + dir = Direction.UP; + size --; + } + if (i > 1 && i < (length - 1) && random.nextBoolean()) { + Direction dir2 = dir == Direction.UP ? hor : Direction.UP; + hor = hor.rotateYClockwise(); + branch(world, mut.offset(dir2), dir2, random, MHelper.randRange(length / 4, length / 2, random), size > 0 ? size - 1 : size); + } + mut.move(dir); + } + } + + private TripleShape getBySize(int size) { + return size < 1 ? TripleShape.TOP : size == 1 ? TripleShape.MIDDLE : TripleShape.BOTTOM; + } +} diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 2e0638f2..57f42540 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -808,5 +808,12 @@ "item.betterend.bolux_mushroom_cooked": "Cooked Bolux Mushroom", "block.betterend.silk_moth_hive": "Silk Moth Hive", - "item.betterend.silk_moth_matrix": "Silk Moth Matrix" + "item.betterend.silk_moth_matrix": "Silk Moth Matrix", + + "biome.betterend.neon_oasis": "Neon Oasis", + "block.betterend.cave_pumpkin": "Cave Pumpkin", + "block.betterend.cave_pumpkin_seed": "Cave Pumpkin Seed", + "block.betterend.magnula": "Magnula", + "block.betterend.neon_cactus": "Neon Cactus", + "item.betterend.cave_pumpkin_pie": "Cave Pumpkin Pie" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 96f79c1f..490148d2 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -828,5 +828,12 @@ "item.betterend.bolux_mushroom_cooked": "Приготовленный болюкс", "block.betterend.silk_moth_hive": "Улей шелковичной моли", - "item.betterend.silk_moth_matrix": "Матрица шелковичной моли" + "item.betterend.silk_moth_matrix": "Матрица шелковичной моли", + + "biome.betterend.neon_oasis": "Неоновый оазис", + "block.betterend.cave_pumpkin": "Пещерная тыква", + "block.betterend.cave_pumpkin_seed": "Семена пещерной тыквы", + "block.betterend.magnula": "Магнула", + "block.betterend.neon_cactus": "Неоновый кактус", + "item.betterend.cave_pumpkin_pie": "Пирог из пещерной тыквы" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/neon_cactus.json b/src/main/resources/assets/betterend/materialmaps/block/neon_cactus.json index 36db9946..36ea95c2 100644 --- a/src/main/resources/assets/betterend/materialmaps/block/neon_cactus.json +++ b/src/main/resources/assets/betterend/materialmaps/block/neon_cactus.json @@ -1,3 +1,3 @@ { - "defaultMaterial": "betterend:glow_50" + "defaultMaterial": "betterend:glow_80_cyan" } diff --git a/src/main/resources/assets/betterend/materials/glow_80_cyan.json b/src/main/resources/assets/betterend/materials/glow_80_cyan.json new file mode 100644 index 00000000..1a103f39 --- /dev/null +++ b/src/main/resources/assets/betterend/materials/glow_80_cyan.json @@ -0,0 +1,10 @@ +{ + "layers": [ + { + "vertexSource": "canvas:shaders/material/default.vert", + "fragmentSource": "betterend:shaders/material/glow_80_cyan.frag", + "disableAo": true, + "disableDiffuse": true + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_medium.json b/src/main/resources/assets/betterend/models/block/neon_cactus_medium.json index 0c8dded1..56c8107c 100644 --- a/src/main/resources/assets/betterend/models/block/neon_cactus_medium.json +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_medium.json @@ -8,10 +8,11 @@ "elements": [ { "__comment": "Box1", - "from": [ 2, 0, 2 ], - "to": [ 14, 16, 14 ], + "from": [ 2, -2, 2 ], + "to": [ 14, 14, 14 ], "shade": false, "faces": { + "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, "north": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, "south": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, @@ -21,9 +22,9 @@ }, { "__comment": "PlaneX2", - "from": [ 0, 0, 0 ], - "to": [ 0.001, 16, 22.5 ], - "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": 45 }, + "from": [ 0, -2, 0 ], + "to": [ 0.001, 14, 22.5 ], + "rotation": { "origin": [ 0, -2, 0 ], "axis": "y", "angle": 45 }, "shade": false, "faces": { "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, @@ -32,27 +33,14 @@ }, { "__comment": "PlaneX2", - "from": [ 16, 0, 0 ], - "to": [ 16.001, 16, 22.5 ], - "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": -45 }, + "from": [ 16, -2, 0 ], + "to": [ 16.001, 14, 22.5 ], + "rotation": { "origin": [ 16, -2, 0 ], "axis": "y", "angle": -45 }, "shade": false, "faces": { "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } } - }, - { - "__comment": "Box1", - "from": [ 2, -2, 2 ], - "to": [ 14, 0, 14 ], - "shade": false, - "faces": { - "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, - "north": { "uv": [ 2, 0, 14, 2 ], "texture": "#side" }, - "south": { "uv": [ 2, 0, 14, 2 ], "texture": "#side" }, - "west": { "uv": [ 2, 0, 14, 2 ], "texture": "#side" }, - "east": { "uv": [ 2, 0, 14, 2 ], "texture": "#side" } - } } ] } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_small.json b/src/main/resources/assets/betterend/models/block/neon_cactus_small.json index 91da5dc6..c94fa800 100644 --- a/src/main/resources/assets/betterend/models/block/neon_cactus_small.json +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_small.json @@ -8,10 +8,11 @@ "elements": [ { "__comment": "Box1", - "from": [ 4, 0, 4 ], - "to": [ 12, 16, 12 ], + "from": [ 4, -4, 4 ], + "to": [ 12, 12, 12 ], "shade": false, "faces": { + "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, "north": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, "south": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, @@ -21,9 +22,9 @@ }, { "__comment": "PlaneX2", - "from": [ 0, 0, 0 ], - "to": [ 0.001, 16, 22.5 ], - "rotation": { "origin": [ 0, 0, 0 ], "axis": "y", "angle": 45 }, + "from": [ 0, -4, 0 ], + "to": [ 0.001, 12, 22.5 ], + "rotation": { "origin": [ 0, -4, 0 ], "axis": "y", "angle": 45 }, "shade": false, "faces": { "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, @@ -32,27 +33,14 @@ }, { "__comment": "PlaneX2", - "from": [ 16, 0, 0 ], - "to": [ 16.001, 16, 22.5 ], - "rotation": { "origin": [ 16, 0, 0 ], "axis": "y", "angle": -45 }, + "from": [ 16, -4, 0 ], + "to": [ 16.001, 12, 22.5 ], + "rotation": { "origin": [ 16, -4, 0 ], "axis": "y", "angle": -45 }, "shade": false, "faces": { "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } } - }, - { - "__comment": "Box1", - "from": [ 4, -4, 4 ], - "to": [ 12, 0, 12 ], - "shade": false, - "faces": { - "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, - "north": { "uv": [ 4, 0, 12, 4 ], "texture": "#side" }, - "south": { "uv": [ 4, 0, 12, 4 ], "texture": "#side" }, - "west": { "uv": [ 4, 0, 12, 4 ], "texture": "#side" }, - "east": { "uv": [ 4, 0, 12, 4 ], "texture": "#side" } - } } ] } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/shaders/material/glow_80_cyan.frag b/src/main/resources/assets/betterend/shaders/material/glow_80_cyan.frag new file mode 100644 index 00000000..3726e165 --- /dev/null +++ b/src/main/resources/assets/betterend/shaders/material/glow_80_cyan.frag @@ -0,0 +1,6 @@ +#include frex:shaders/api/fragment.glsl +#include frex:shaders/lib/math.glsl + +void frx_startFragment(inout frx_FragmentData fragData) { + fragData.emissivity = (fragData.spriteColor.r < 0.6 && (fragData.spriteColor.b > 0.3 || fragData.spriteColor.g > 0.3)) ? 1.0 : 0; +} diff --git a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_2_e.png b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_2_e.png new file mode 100644 index 0000000000000000000000000000000000000000..e2ebfeaa02e7d8fa211b1a517595c336620da1c3 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~{s5m4S0HWE zcOq)rx7-82r(OKLJb2|ipb%?GkY6yve;|;#pawEY$9nNs3Aq*wViOp&ooi&>fvOoiUHx3vIVCg!08yzdtpET3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_3_e.png b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_3_e.png new file mode 100644 index 0000000000000000000000000000000000000000..f61e82a150034df925e0a2099bcb30e319f26749 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~p#Yx{S0HWE zcOq)rx7-82r(OJg_}PEsB{$-MqHHBWe!&d?L7=Mg!9Spgt*47)h{V+1zMZ@b20To; z^ZthSc~4g2l2sQ7sr4wTy2QiJEgg~cp6j4&MaHU!>0OQr${xjhX(`YCUCWb=Tf?yQ TnWwcE&>#j+S3j3^P66nL1M z=l>0NQ~0>Fqec69SFzG6jk^ZIiEN>3lx2F=#AjxmxRJ6#TGc+j;m6FHZ|^R6BxG5; XmoxNF;d`nDG>gI0)z4*}Q$iB}5Sc(M literal 0 HcmV?d00001 From 22517da4338e6ebda42924a2a05dbb37e7255ca3 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 21 Mar 2021 06:44:50 +0300 Subject: [PATCH 380/463] Javadoc comment --- .../java/ru/betterend/mixin/common/RecipeManagerMixin.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java b/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java index 0528bc52..38497ec6 100644 --- a/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java @@ -41,6 +41,12 @@ public class RecipeManagerMixin { return null; } + /** + * @author paulevs + * @reason Remove conflicts with vanilla tags + * Change recipe order to show mod recipes first, helps when block have vanilla tag + * (example - mod stone with vanilla tags and furnace from that stone) + */ @Overwrite public > Optional getFirstMatch(RecipeType type, C inventory, World world) { Collection> values = getAllOfType(type).values(); From e6542130f09642a8436137d44ec56f009ba4c1a7 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 21 Mar 2021 20:55:49 +0300 Subject: [PATCH 381/463] Music disc (Firel - Strange and Alien), updated description --- .../ru/betterend/item/PatternedDiscItem.java | 17 +++++++++++++++++ .../java/ru/betterend/registry/EndItems.java | 9 +++++++++ .../java/ru/betterend/registry/EndSounds.java | 3 +++ .../assets/betterend/lang/en_us.json | 5 ++++- .../assets/betterend/lang/ru_ru.json | 4 +++- .../resources/assets/betterend/sounds.json | 10 ++++++++++ .../records/firel-strange_and_alien.ogg | Bin 0 -> 2710306 bytes .../item/music_disc_strange_and_alien.png | Bin 0 -> 213 bytes src/main/resources/fabric.mod.json | 10 +++++++--- 9 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 src/main/java/ru/betterend/item/PatternedDiscItem.java create mode 100644 src/main/resources/assets/betterend/sounds/records/firel-strange_and_alien.ogg create mode 100644 src/main/resources/assets/betterend/textures/item/music_disc_strange_and_alien.png diff --git a/src/main/java/ru/betterend/item/PatternedDiscItem.java b/src/main/java/ru/betterend/item/PatternedDiscItem.java new file mode 100644 index 00000000..6f8b9d54 --- /dev/null +++ b/src/main/java/ru/betterend/item/PatternedDiscItem.java @@ -0,0 +1,17 @@ +package ru.betterend.item; + +import net.minecraft.item.MusicDiscItem; +import net.minecraft.sound.SoundEvent; +import ru.betterend.patterns.Patterned; +import ru.betterend.patterns.Patterns; + +public class PatternedDiscItem extends MusicDiscItem implements Patterned { + public PatternedDiscItem(int comparatorOutput, SoundEvent sound, Settings settings) { + super(comparatorOutput, sound, settings); + } + + @Override + public String getModelPattern(String name) { + return Patterns.createJson(Patterns.ITEM_GENERATED, name); + } +} diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index ab3ed31d..11df214c 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -19,6 +19,7 @@ import net.minecraft.item.FoodComponent; import net.minecraft.item.FoodComponents; import net.minecraft.item.Item; import net.minecraft.item.Item.Settings; +import net.minecraft.sound.SoundEvent; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.item.ShovelItem; @@ -45,6 +46,7 @@ import ru.betterend.item.EndShovelItem; import ru.betterend.item.EndSpawnEggItem; import ru.betterend.item.EndSwordItem; import ru.betterend.item.EternalCrystalItem; +import ru.betterend.item.PatternedDiscItem; import ru.betterend.item.PatternedItem; import ru.betterend.item.material.EndArmorMaterial; import ru.betterend.item.material.EndToolMaterial; @@ -76,6 +78,9 @@ public class EndItems { public final static Item LUMECORN_ROD = registerItem("lumecorn_rod"); public final static Item SILK_MOTH_MATRIX = registerItem("silk_moth_matrix"); + // Music Discs + public final static Item MUSIC_DISC_STRANGE_AND_ALIEN = registerDisc("music_disc_strange_and_alien", 0, EndSounds.STRANGE_AND_ALIEN); + // Armor // public static final Item AETERNIUM_HELMET = registerItem("aeternium_helmet", new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.HEAD, makeItemSettings().fireproof())); public static final Item AETERNIUM_CHESTPLATE = registerItem("aeternium_chestplate", new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.CHEST, makeItemSettings().fireproof())); @@ -127,6 +132,10 @@ public class EndItems { // Drinks // public final static Item UMBRELLA_CLUSTER_JUICE = registerDrink("umbrella_cluster_juice", 5, 0.7F); + public static Item registerDisc(String name, int power, SoundEvent sound) { + return registerItem(BetterEnd.makeID(name), new PatternedDiscItem(power, sound, makeItemSettings())); + } + public static Item registerItem(String name) { return registerItem(BetterEnd.makeID(name), new PatternedItem(makeItemSettings())); } diff --git a/src/main/java/ru/betterend/registry/EndSounds.java b/src/main/java/ru/betterend/registry/EndSounds.java index 319df053..fe2e5c71 100644 --- a/src/main/java/ru/betterend/registry/EndSounds.java +++ b/src/main/java/ru/betterend/registry/EndSounds.java @@ -28,6 +28,9 @@ public class EndSounds { public static final SoundEvent ENTITY_SHADOW_WALKER_DAMAGE = register("entity", "shadow_walker_damage"); public static final SoundEvent ENTITY_SHADOW_WALKER_DEATH = register("entity", "shadow_walker_death"); + // Records + public static final SoundEvent STRANGE_AND_ALIEN = register("record", "strange_and_alien"); + public static void register() {} private static SoundEvent register(String type, String id) { diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 57f42540..5845f6b4 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -815,5 +815,8 @@ "block.betterend.cave_pumpkin_seed": "Cave Pumpkin Seed", "block.betterend.magnula": "Magnula", "block.betterend.neon_cactus": "Neon Cactus", - "item.betterend.cave_pumpkin_pie": "Cave Pumpkin Pie" + "item.betterend.cave_pumpkin_pie": "Cave Pumpkin Pie", + + "item.betterend.music_disc_strange_and_alien": "§bMusic Disc§r", + "item.betterend.music_disc_strange_and_alien.desc": "§5Firel§r - §fStrange And Alien§r" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 490148d2..71441920 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -835,5 +835,7 @@ "block.betterend.cave_pumpkin_seed": "Семена пещерной тыквы", "block.betterend.magnula": "Магнула", "block.betterend.neon_cactus": "Неоновый кактус", - "item.betterend.cave_pumpkin_pie": "Пирог из пещерной тыквы" + "item.betterend.cave_pumpkin_pie": "Пирог из пещерной тыквы", + + "item.betterend.music_disc_strange_and_alien": "§bПластинка§r" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/sounds.json b/src/main/resources/assets/betterend/sounds.json index 797e3d1b..03913530 100644 --- a/src/main/resources/assets/betterend/sounds.json +++ b/src/main/resources/assets/betterend/sounds.json @@ -232,5 +232,15 @@ "stream": false } ] + }, + + "betterend.record.strange_and_alien": { + "category": "record", + "sounds": [ + { + "name": "betterend:records/firel-strange_and_alien", + "stream": false + } + ] } } diff --git a/src/main/resources/assets/betterend/sounds/records/firel-strange_and_alien.ogg b/src/main/resources/assets/betterend/sounds/records/firel-strange_and_alien.ogg new file mode 100644 index 0000000000000000000000000000000000000000..558988786c8c4a2cbdc49668db70d953c65f0889 GIT binary patch literal 2710306 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

    MKZ=x`pr)`0XEAuvi^(I_bxGol~hG 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

    36U*#$(X;(Jk3uSqCT=BtG}zM>`Ial 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 WhEg3&=?Yai9EUevtl<{%J%hz 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 @|6S@0c>Wf#8P1$)-zrvmfDe$H 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%0DUpx<%$S5CjTM;|O2o!_Q5SdVvj)_8J9z6A) zTP~dRS$Dd@eqV9ey-r?sVG&n4(`mffUXEsi918yFaf`&@)ZW(kb=N zr@Qnk0rGiO)0BTo`91Ue3TyJ_SF`2J3$y#jXyDN)$4IU`V+1?Rz7cHKeLJSXVL@W2|m!xh%CumC*^S=TmN*(3!Zlm{;^a+X!c zCJJz=Bk|eri^SNl;4KX?4`N)m9tBOTe@{PK<`&p}(on-)>p}L5j5KGtw0_I?YFo{) z+6{mV;UJezHkwychs3$Y3T9!wl!QZD-o(-MA#$zO&;^&1#_F#1bEq*+(LWIZq-Ot> zQ?QZ<68a$F+A~EsCKyhnDk7jtUKAMkzm)TX_vk*RWzUXgHV2C8F}9VJW zI+WM|2E@cmn5jaVKDX(A>HpCeqDTy%Hz}nT0}bQo*r@`Lwj1S^1@~Z<4FGw_lr`M1 zTaVli&zO%2d!$^AImxN!rlq6NcJ-w6$ugpMnOo~+*ewZa9dDu>1EU5hyqbt93d#?E zqF{b;z%m9wuS^fmBxj0ijj4>cV0x%e;_VOuz_x8!u(O$#^2UkOz36=`Wdv#i@Aigb z07+`&G0bpcyWxmnzd8#D$b2(ya2h6OeQgfma}b-*k@2fJvL}k*!oD?YM5w4XQz#uD%2w|?0j@GEs`Co)9*Q)kt zihy<_iN7w?IjTlH`p|Mg5{DF6Do)D7)g@FDy}aO(K!uBgMGaONbGS|6$|L$wVjB!t z5X%GqbqyfbeOmlQ2fGb`Tyik#gP`e-MHd5H{4^8M3lI6!t6{Td3wwd4?y;^vaI>;= z9Wmo&em8lC77r9|qL^l3j0aR0!GnKfc=-~s^EXlEx3e@);q{Byd+zrK2%R|3GKHrI zEaNuL?Y+cM&wWRUE}wn$pq7!fPY)+EkOJ!&ucBPhvM7Wrz1`E!;+uOr#@q6Ilji-i znrPF{+G8;;zI3#dqu8E$YR~k)%;~*FcNQVx0vuKMA$i-(Y0Gkiu7CN)V%!PFB&H1ivLRKI^tV6h zX+bUsz5eArEgIHe^X=1&Te;(eh455X%5LNrjnkx;iAQpjzQvdbyuxtisj5=QvU@OE zGAD*7r9?_rQfiCx1CqMr>VN&r(L7(SO;0IjIAA|iau^?Ni0iqdqRjs%lgMyZ>Jc3d zXhkuQ(0H|z^i;|_#94ylw?#Ft>tDhd2P&Y-PR6vsJr3wXD-K*sdWQ#pVTF-lChf5E=veq<=BN z@i`U?a*9XGDrBoG-O0}G8>!B#M^S56Hb=&m_QqzG{uWC`l9_)diUSJ z)c*b3f-Qo-)>z2@b*RtZwJ&o08QyLXk~DGrX?y9ivf=zn#r+Kaz#nn^Pf{<_73(etnmGpUOfey3?xO#J)~lM7#b z(AN7f`O3*V`xxife$gy(%fyjJ6#-3LMpT*a+{;R?V9%0AceBg-hlD0E0)6QysvGI< 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ȮQOZEz4(hhK#5FMzWvJ; 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

    s26h}?=PFV9LH7`i5Il+WKid3h&5 z=adkblM}To(!U8Gc*X#sfc!I+_j%K8JG+%P|9%fHJ>@`KpNo49-X_Bo25Dfoc;re0jX}{vg|h5id;Q zszY7H0!>;fczM66Cdu)Nv&ixLNusK6v3*#y;tfVxu+|}GiUhZohFa6N7G?+ma-Q3! zHLz5Z_N(Di6Z2o6t_&@1XbZ(2RCva}xhDIFK9gyOi)Ba8hZ~^0w;s14wcz6HVk6%P zVlDpj;mx7lWF$)C4u5dNYJ2~9;bHR!+i+5VW=vg$EKKg0krGsXHmnzEKAg*EPEEw7LMi?_OZa6T2Y zs^>I;<&S4jp}D+Rk1gT2caaQk5s~K$Vh{VUg?;{InwO9A@8{nSeuH3T090<>+Ib+v zsDkyjhOn^I6dC(QQgt^4+nD2Kpz+Ihi&r>{EP7N3g||LYw8^~nx{ zn+lCABfypI>yd99cP1uxd@r9at`x^WjKV%zS2i`$4n-jmZfEKxf|DY+U=I0;(@vQsm*h&|#8#j$5j#u($iE8~2 z`?8`)q&10ZTKj_HgCzC@<=sg^?Hgt{Kk#?q(cplw_c{9D!zu0s4&=Iru>>V$zLY93 zoAh8RO=Q(mYr6VyTmK-RZ=4|y^=l0=&wrG$;4KX*g2^xN#Vl?lE#{*5jPdX*xjtQb z{>$G0Kuupf>0_gH?OD?N+nWY|ZbU$OwwcLq5Fdd6tl1681Yj*jq?Bk-S*qiivNCMy zswHSkn$fq8KKA_%P$5BJy@{AA52w{!^oOjxhqwQ(3dx~8@qAqHkRx8 zBK}ytKH;p)cEzp%(m<7hu!{WOuP&)-Lb9yi#>b41%6Z@L=)mF9;$wR zCQJMW5*z^DcM>zZt(EJ9+WsXU3KlQ-L4?EHZjWTUb^9xtY(H)jdLg5jZo}fAyVy& zUT^+(sa>NFt6<*^f~umlfZgajTDBStzuuC>L>y3 z0)IJXSCKcBVl{qW49WZSb-e6O;-VrW9t$<|sbg{6pQvnZ2H!7x7y%6?sq7^X+5kO; zWT>^EZQJS90^2?F4_3IOV^&E)Jxh5wl$$!drYjeW4My)*ngW0xKuMuXJG^*7DhFnv z%SVY1)$Ec~eDL*K21ez`&8VvOE30Wx5037|Xo=&JeghCUob);z zU?%9X2PVX3^KU;RaPh>4@#99M;&y`!b)Sr&!G(@|;L0-I7*p!r+IsSxz4+aX6)c$?5CmJJdO<$&l23 zG5jXMd6lp5rNObzc)r^)qc4Unl1@ulgACJHwbss>$S`v9`P&6g^6z?Sd+=>bbDqb<-r|0RBzN#QnB3=s zTO86Ws81idn~vqDuUi-H>6U-^0AE)!Hyyfo5Sv0cIK2JF*!MR1`}*kFprD@Y#`HqF z->HHlDT0Vpl?=gU30rz}v7Eeo>p;_-=K>QdAuV9ZdqL8hSTkhm6q3)~B#lPF?ZzWe<;LFfutK*zxi zxF|J99Ej75^YkG@R1(b~wDhDCYE_0Q2U17cu=8*XIca=Z?&JF8eHNWF8;g5ewI|eG zsPUo}O8^#E`n>d|H~(no-t#!DdH6XHeSck9jrEuJAwibA+P6tog?I8*p$fLS>3*{5fX92Ga%9o<=Y=BT<)Vr>P@VL|by!)6>2(58 zYr)Fhn|>-$e>xeMn`nJ-!CufTiJFrtmC`*SY#Z47>Os3W#`XdD{OH(WA$~);TGS>< z=@4@O%k6NaMWB9sR0J|o7P(H@@N3}erToOFiuJZ-g$zM$a-edS1VJyQQZnaG95Tb~ z_ec9j3MnyGFpxEvNr|$t9?=EN#DSZwZxKk7x9c*I>qythR!7(Cp{bm@Kazl|06n^~ z8-Ex?;&6Q3`PbW}^Dko!*oRnO*iajg*)j3iyZ`cTBCi)#l6YK8E|}%=lNOgu<^Hek z4cd0dy_mJOgP~BF=LjYLz|E`SKgavGSuh5vnniDAd|sZ3;t^j4;^IdXmXLMrq(jJe z)%ZF7l09~6Gy-{WtzX9DPjU)B6k|vUeYT)1Bq7vy(EAodoorvKlz=Psma^7wS8VU- z>orzIFA_$UYp2@v^$r$}7I0 z+sgV!)3e6D@ZH^MDTmD(h~a}NS`EdqZdOgy4|DSDBzjI z$%;_KMK7&F03|XlS*_nL_-Yt!q^#0@?z$})PpijWhzHbJH@&weS5*cX#;Cg+MnN4?-;NVaBUWBS;kwpucuuf6$cyZMwCL$gOIE7|$LS&-B z!SrTSP&Kz^g+o6&aBeQnc?w{9s+en>s3+yCHbbxq%!pLU8ikNN^Z8E_SA4|Xy4>k# zg@Mqt`Q?!wToR~B?0dCo1mmy$dH=JPPMKHBEE_~yc08b z0+3v8)P^X5EoQ*3t2{2jS!`#8+_4hK=Y}q`ApAjeABxB8>0>o`blYzA@{N!v-1mX= zc>*ZPxPVuI%Fr*FkH>OCj!gs>; z%OF$RLyem3qP+w{PmB3VRj-49Vi!|}DOfn-_6(zkkQ^Q^c!|j0&W7rX%$u?~Sng6P zjuXkO^AwY9cWm*@2-P&!#_w9R{<0RY5GKdC>>3350VmNZiDN}oyimk7AQvJ=^8qL_ z__r*fBf$n(8NcIAUbfKEO5=Dg~cuY4xKF1H(ITwuYj(?xw!^W{mVvrMVdV7}DKEQ|C z@cmN}7S3g&Pl+FIfLyR>Pk{0`@WbN&|5QZv|D__TpjGYGtE4d1V;cKp#iSP@T@>0*tOrAlA?*bKM|Mje;FZ&3v~C2qAJ;UVE4SEGjs zOaYm!p$nnhOhI${XCJ%rIXoOxc+fR+I11I)K_-d=`W2fpWck6>#$1b-K|T(L`#;pjOcA3HI!^%8In_TDAy@i1*-x?44#$5O-e_Iionr&GH2&c{`^U=> z&h!DEnxMO)=5XZw$wQOzK;a<6%D)2qUu;aZr#~)D5Im)-nJ(h2_$l3JC(Z~$$FZag z@DE}q(~pcF0UcJ-XA(!NbNq_1`HeX!dm9gr-*9{E>e;+;ZdO!8X64;_h`ywnFtQRTSXSlXLCWZVR)7DMya;vLhhGO@hFPRqWu3yH%d<)23x%WLv3Fhk zth+Yje!k+O$|FQUXzwGY?n-I*mOP{%;Y}WxC{x$6_}-4)Z)9&$!1A` zW-zCHWdW*#A)f`(O^n|tr2}6zzV?a-~B|9Q_?5}40f z5<&wnVYYuIXj#WUXhYdA)Z={*eehx@g-H2LHrf2CuZA2fuaD+KwWajuF(v0O<7UNn zFjm2mo^AK&Gqsf9(_GnPA{O~znD6@z+rMMA6qL#kL|%C?grwU3fse*H)|h-M0F5hE zroJqK({qfa7xtdXjwPogOek>MS4tIKDx=S{l zY$enE_lHKmIqvyhL8QxIar2%8)4Qy~iT7+Xq4$NfIFc-!C!Iz7;*`{qV^p8R^iA0I z0v{Tr{_q2P2?qE?Xd;3TfmETPC-etm<08(l^ImDu*@`T=){ES@AuS~u;gArack^b+ zW@P#8bZO>osd&;#>j$*QTXpjq?Tk80a2NUi+BB&3Rw#)%??&N|StvuA9B^#_)){Xq z2fiOAw=&dPa|opZV}H(+Z>fCr-q%lls-CB)@`Tw?(mwvhLn-!e&&<~bY;i~`)zax& zbKice3Q~A;8)ryjY6T)bBQ1#O5b0w58uVt6ysT1rD+n{94+R9L4nt?_iV5bFz~j}CFz+qzpq@ZaN4Te(TljJs-ICk4 zfs`&l`c))0W?3jp1Fso{1g3l~LErgEeT`m3?QBq)l@+Zs8rgkFy3;*EPGDROGp)ni zLy>n!r4sg=I}#&{BJ#K)WvXh#E_>}!Xi}kHshjk@PjBKT3v88Xap5`#f4)MKo8V)4 zE0kyZ#^3~@WZDUob^Si_Ts}0y!{tsrOfrwf|1hLTH}j{K5!I`cRdG15$ei*Ri5|1o zxaF)D7jYa;xMQdfHu044Bm~G1c5s6<4akoXqF|!ZgQ2xOK<^nP(3q)?m;}JYfR`LB z5;5O<-9D+SfCO^rlxJug*qSv?Cxl=vI!*~H?X))TDxw((jIH$@8fc2Yu*Ob4If&JZt~IV!<+QAYiPam+q6v%_^%e!ll&{x_SU>v-xR9Xe zpGrUaIS)YriTsuKFBDll9A9;BCj-e6+s-DnU$__g{YF{2$|%%%Bfc znOqxeeu0CZOETGbtbv_{IYllfMltEWcUjCBI;SAU+5svIBF@q_hHvkc%t>u-t4jf8 zV8gc+8%`W2gC2WhXZ}BEr8XG2)I*ilbmY{4qxVVY*auo%iu&?R3x|W82Rz5vPZ~4_ zc}3ngsk?p@{A-GHAn02u2RPKf;?#v;bQcoDRRAppRTZIEZa%=6lH2c)mQ8Bg+1iT7 z-mAO&C8ZGJvELedqSy(Dn;OOczQrd)JC(!}qmK4)l>q9sjGx$Rwwg(o0>49h7HN85 zd30qAo2v6)lg|&uvg}`ppyUnNhHDsvYA+wnVW-~Fg$mIGY$>siaaC5I8e2wY1<6gh zDBltZ*B$M&v{$Jf-)G1TM)X1l6Gp1MEG{R#thFpS(eHNzUkeDYiGel_N-yh(Yf5p) zckXNB^$qBh)(UH7+?OIXS?E6de)hsXiBLn&7FC_Dh@jl|c@nAo)*;unR;(n|!tctM z?t65|LPnn2j%ANEd?|vigqOE?W%R47-Q_hD@569{ z-#rVavHrr+R1jHds4V@yvesqBp+e(Pe-v%R4f=Q1qj(17X_J=?R3lo=dcFfsTmx*g zip5fY7UnP0`SoxaEIHPYiJXe2EYWDGj24h(n4{i_C zQ6vd?tP81}PiUYWqC#C@ruXr%r3UZ?1$C3v)zUvJdXAey`|1;B#om5`B|IGimZZTv z=6YIn^+J89V6qbkVD75x(lM0UzUJ5)K6->0Z<;@sekWexp@TSMf&mur}cI9)Z_K!gD156GH zPIM-ZVBk@Na4JCrt~=pvLQoF6GYa41t+pK^z`S8rEsae(d$;*WhOE-l7c%AjoyvrV zjE~yz^<_p8z^opQClNvG-ey70WXlMZdWOAz4osA8t58+n?(dkCk7qywRKYjCTqwT! zsKMfSL;UH@n?~1UXnp+57J|sohbbFe2UKj+rgHb`@XjMMdPHQE9MeNQBnohnVHEE6`z{n;cV2+k$!SeL0 zL8Ta_x!+XMF4)?yMr?al5)iY=ddI+u6#la|m==ae!BPoVp7bS@+TMXQKJ;pnn6sOA z{`rRM05KaD7GNeft1qBr4%e9zVugO%yH(dg4&aitm(CqzY5@mU?I4vbLtWPYT)Y(< zsXa}No(fo@Qm@|4Lh9Jh2LsF1PyrDuMF!19BH$w@-VM~%wk(pWh6 z;Ieyc@2P8w2de8qis9i&^tjEvzLMKenR>K56v2uRnU9jK$>0r(l51l46P4i8HJpNd z>k@Un;hk3--@B!Lj8s0WPe-r3B*3spV3dT!EEK=SwS_&VO@^bT{s{!^zB>phCMK_> zgg=w&@Ot=g;=!H$<9>~YlG~N#uW>(xuz?SU)YXvmG2Quaj8HS<sZ+ipEa3=|fkPiQb%vkqNhTW14h>wcvk#cUd1Sm4HTo@Ql0a`_+K{QZE2)00tVs63P!3^!nA*%Gk-s+?sLO|`m?IB@FC~<8|cvrmO-z7aUtSsUm z;T)LWf1CG_GSsmr;1xYq2**G%gyIm?nfPmDiwe4qHrQ(Rk8VXyF633$+`dR62pX;z zIL(Bl*GM_FE1`2H)w~&aus8`_mIC6&*I1H@1y z@jSOtZ4GiL7FEP?C}5% zufvj(PyO<|@|<K^1N*a`qZY2Nf`+fiV1{SOZcfq}Po_n5i_St7| z_o}0&-DrQ#2SKl|97ozw*&5Dun0}52PRDr!9U=`KghnxZ-(v8-y#pC$*|hIS}1F4>-sx;E9)DY+M7RjG?v#F zl-E?X@e7zl7(3qSOyL?67<>DEF8=t;Uh1wst$A|mi~ryWPss}kr4A{OaOI@x3N!Or z2p}er2Okw(u=F(p2e!dKj{fl~ZNxd0iNL>(FdK9l0%HCW@qiV3M>A*>7&F<1co)H- zNK19DIdYkn-7T4goecI(i_&r8jAmzjXU)kos6oQVv!{#vBhN)&TJQ$1di5)|T z!pIJTd>Fm1_Jr{s+R_F9etcn6l${VFb@UWg=1Yf-JIy9e;Y*uly}z7=Q#E%>FOy0i zT-K}ZKWa_*a389)xV*NX1u{}zV06QAe$9&G5U9Y-V=yVF{%NrTeUJbAQe78CUQF*u zv5$VrL*fGHjRI)}Fpo7ev%*Cn_~y^`%?k>to@Y(0tW5X%6rK=6P`|Hb=vTiHO*pib9LZFkp-br+q1UaDo&4N)t;cQB5)hPALXP5+oY>?Gp+>!rERs zOyA{Qa2lWa&r0tkPTIBKI_6Ii-AH=$NH>0iQnr|To(_rveB|^fVDxeqPD5rd@~IO^ z1)#u%5B3#Z$X+g@+8v6QgdeD{dY2T33JvOLNG-upG4-`1UUTxxu(6lo94=q2{!+9m1(C!9QEAk7OF(q^7ZW@DUe>mA4p1p z&GdqVM$29dd;7md{+ElErR*~*nrnF0x9u16_;v1j0RY%d#sQewAc5qInShv)SMiROu%18zGoO_m>FXU3@b5CwxI0`TmBJ{sGy zHhE_f^ILXrPyRat*1^6Am$Ji`BM1$<$Yup0Y)trQi=-P7cqpGhCin!u_x|~v@oOQv z>ZD0#U+E*A*&w`Gz3NIwo|8R!b{H$-z z@UQ2Ug(LV7qK_={jq4KNkQWrU1ByfvJ#8ldq$66>KXN@GV;ML*aK-F;F+C`gXcA6R zV{9eeFhS@M_?Vy<3k`Esh*7qO1j!NsAVT$Dq^UVU;f{OduPi=;)qTQo3*`Q#ULt3L zJj>djqy7m2Spv(>4Z=iC68=5APM}n_jWI86HuNQ%U;At}n3w|v^t#`i_N3G?vq||z z;wQMtH&}uuzJ#6PuSdV_Ugg}g%2RqZN~|{xw6m?iu8sKtbs#{6jqAhc9DIjNSfXM=ka$6^x47LoBCtSeZ%_i z?rVc6V!>vISKd!-|IQ91fA1dMhNmpy4Yt=pW1cNjwJQP|cM@wZ48*K^#ypucc$nzS z*J9yJ9Z-NE5C<15uZdxqC7@pGq;z=!(Sn;fkMgA2hCk;LiHyOC_}egwUJrg5>=@^V zv_i`OA>(IHCRs`X7|2rK{-=#RoV0XqUyA_$Q$hA&L}>$Wj2z8vLl zz`dj{o$ zrrq4oFa9<7?i`*-(e*J?BfIKB-09`c+IZx*4h*2LjSI{u5Q>B>(2MOQ8(-e%yCKlV zkDtGAZDM(95wZNeBFifMQEghCe{K%1qPT6QH1r|~t?};L8zNv3Ahs(u>JL;rSv=^) zrUgRt0s$d_)+itH9p-0XJav~~5l;E1aJ%9j>UYgg9x#K}9laK89SjO@Cc#us2^OVX zIsrPq!Nj1*B{+tn>Wj4yP>bMg$3NQLfbzHSHHCYAZpRtJR^FPjEq!a2QbwqGuf6RB zWMeiZP&He@4ekYelfu}bmgaXDz^CAI{?~oY6cm;0u#_W=}eYR8Ah=-hDbDBJ;Pq)O(Kusv1ysJOdM+`6@;xL?cq{nlf0H5<~xAfJB?e zJGFS7xkcFGLeQJRGl_~waB1(uK?>G0-D|L6SJ3uXO0a6r)yg4h?7-)_PfeWv*rA*B zTs0#VGyRtP6ZB}uD|t+oi=yo2RaSC^BS#kO9CSfN>F3$Z$>jY2k^-WpdDM{2e1IYmlZR~Ov+5~LfOgP zF~v2O?ZR7fdb8?V>0+|KVM=2*k(Wy`N{L-8BDC5g{@c8FawisJ z@TY{i#!JwkD_5#svDp%9ffWdylC;MMkNiS|2j*9I3;Ng-*C9I607gtsblpC7&Ph*m zy$B=fapnv;ihow9mqn|N3r*mOFXj~ZRT>+t|6t*8pz#K7@)FDfbVan3@aySXI7_Gg zo~c^}#kq{S$;p~_E?~Q2s%tNQJ=6wluMC%=(Ktq!Vup{pg5l=iE!V&WlN4ZP{$tWx zlkFN=!sjavSB#QxKH=r|TlRF|YM0*n)l`eW$1FgjTfD=;Ls6Da$VdSA*11)PDHmjN zTGw#l&6G`{;S@}Ib$%nPDRK5>`XVM6%7;{7nIaEND|}pcJajK9nPUlpPkl38Xx9P3 zK!~t+K(Mhemo?BW%m5|O=GB_so@fnSsf(2IXswvOOQ?RN8hhh5p|Q|l;Dk}IvhX=_ z#2u?c*E|-3KQ>7X|=;%z}(DsGKubs-v4-)YA?)>NRrvwoMO;}F?W59Z( zMs(UD^}Q7t(Xsz!hyxIMV$u2V?fKcK6C(=}9mwC0N0upZhhHYmglNq}d4WkQI2nd|eHKWaLu8vHfFcM06Y63GWh2v!dG0vfIgGLE z7d98BsTBYI=>6va3!6vvW+3AbwG==F9z0X+2t|1>YV)IGux5QeOH-_e z9hl`|oUygD?`_9Q{hf2U_6A0Etj}C*2WWS~b@diVO`e3$&E}H;Ve6OYBV?AC2(ts2 zNg7?Wzp!C>=I3Dh!ZH<3x2Ee-$p@C2b+2ZU51;9v%}jRy3dIW=+H6IpLuPQV{CARI zbpgKTifizijbd}!yOBTp^eY)|y>S~1Oo{}6TeGq0zbBS&+N@jAy+x}2?xyfsnGA@l z4Z+gwXz!b7S~^Kp2D+V|wu;O+)ta!4sQLbAJiXaIico-@7MZDc20{K}E2HW>lWHf1 z>1>57j!25l(551qZ$UA6EHiYH6sTOfU~iR|!JOckc%Di^qp&MBOELlYcvQ zbH2`SVuLubg#5inoBfKp4<}w3V;Kirz(jBq*y{p8DiOUOo9kiRe>2pd{t15AdGB$g z?<0)V;=hLO+6-kV0&D6Sh9To6VA|DS2F{%X_x?rDBN~2 zpUeuo74@1>|8k=k#G&_EL!N(0)Px}tk3EKZ6Z1)Kw z#0=c6E%e=y>{Uzot8;Vdm5B#zU|Qa9tbOn(K;Gd_k0ik&ivf_=-^Y6kkp$J2Vq^h6 z6j>i~8SMceGF6Ou?{vI4FC3efbyIa-w%;)PuF1WyxzZ@sGZ{6xzUC)&3c!4=%*-Au z1O_&9qTsJc@a~SrCpc1YrTSn4a6taojVc^Kb?NV7^(W1}Ww7Ue!pr)YR=tP9rm`iqGKpmlbq(RZ3BMPH&0T8x|ibQO><-IbTL3s`$~R8Fm!Vu(wdqU^Kh-;Ht{ttt_yJ4&Y*xs5n!OU-BBwa3Vt)rQH9`6X$A#QBee_cKfwgGtTWlTAm1h%1~%3+VsI zG@vy84_&AQFPwvc$%9kqp}5fG(qPTt13q2>E?x;C@#U?tiWY7G0bxFVF&S}DPBCdw z38|gw>g)0Nij3pHt+8htoo7(xyEIs?a=_G2AVK6BhsM9X)McJXfj#zDMQR+e&av%Q zaQoslF88#in$2mi@T|irFOVAh(-x!XdPuHY;UhCq-ksozOm5GkP3<;P1-EO1HPfk4aK;y5zPv*}!QiX9hIxtR@&uBsDy16EaKwnE`=(=^l>YIB!9 z*76^%S!c_>tA0_qkGOq#WpB)SAYaeJWHM$bWJ#3DQQ0v*)6hWU`JOgeSv7a!kJz*8 zY_8KQL+J>AxBEhN)^2--5OKWM6e4zQC=;_Z%=!l(IZctge1Ac$R+K={5Xz`4J3*H1 zej)@2juob&3M(VTKsQ|uXb-|^KQ+)0OgwO_m}#7Uqa;R~^w|2uJa5JJk#!F{WwXiT zxQjp>fx?4VA+gVdpm#R-!CNS%r!?ocXM9pQ=cUh8M}~;PTTSPWHb02nSMXSDeRy2C zRBiKXb*OcO{VPfz`Dd)uepz5t7JZ&dwRMXL_@zRYIW|*sq7TW;7%c0C>?u^L%-3xp z9*b6O{FNs7P>8a&xp*ppMGXWC3fxNg`E)n5X7?#xyy=~@Nqg;5t0kSap2$8jz^EKRO;rM;YOd%u2q0dey9f%j zj=Q3915USS0W_w^5aa<2RRDh82S$g6RDr(ORA}aQ>+KJrcGryih6j^g(UprsUTWp9 zbq6WxDJIhZdDGT_9thxX7Q2QB|CK<@AC&-JoJwDb%Eb4>*Ej6K$3qW0gouG`H={H_ zx`}R=YVoyStEV^b)mt?5wJSSNb(rM`eSj^gKy7KHBDz3KR{%ptVs#+ek=UL7NDYFYu>4Ho>aC%ZV`H0&NE>6d3#`je~YmulLnW9hQZf9N>I z?q=ed!&&C#54_LJ$jJPm6D&N;DdGRp15L#^P9!3ci!xqOx@kHBMYyG;=RrVd{-ZSw~L-L0CBKx4? ztir4;UBMm2XANa(pA{-NqlSr(3Syc>JRuQ6{cT$$h0?e zo|~$-yeklUdaKA}d{*EXN=CpuOSqqrrESS8C_%V@I|LF`0L0TPXE%-}jT#2uqW*A)fPJmlO9c!OF_+vBZeoA#Gb01rg#e#B-wa=MjhXn7p-F5bSxRGq1;C3qwY zr=7(c9G+&KeKIio$`mlGLIHZ;1KitR1rwh{oP{`g-(B%zM^-IF5`MNCmm~rZlTZ4G z38f02E4WI#GMLFc8Rr(~6v{OQzYhjdr%rJzA{y7D?i%1mVn%xGn( z60=XCT3#yfI3^J8?t3ZGM84}fWV<^hs<%;k{392ievwTsOVsQ(gW^MZrrNvp8U8Q& zJiRP*&vH`Tg(E3=V-islLX-WjrjtT;YEN@)_3}Hd*~KF(Ee(*MdyLv-o|4C>s`#O1 z(ZUP)BDG?>-*$fVihpPZh;(^{QCuh?tdXIiq3aju#p{;U@5xzbw*(!wJuTg1E(jsX z;J>DiVSHniCQoY;2-YlVRZtT;f~ss2IqA?$++Fpg*R;%$GlipvJwH{p?_s>k5qDDR zAT^q4q=#Z%z~L}{;UF-GQ{iG(ru{eO=r@uOCam7u#(ndm;mtF0A@{w4+mga4MvE@N ziH@maHx>uJ ziBW}c6r*CEQ568GMF0_}BueBJ@DARClkExG!;`@Pq_*XC<2}H@6&Ot!W(O+P1a6=J znm;j<76d*XG8O_Jj{sWDH@TnzEmn3f?9Dw+17Ot%8nXsYUI|LU06`l9P;@V&lGWIM zbKY4vg(_c-BAHcM$Gs)eI@0VQ(CzLCFcYB0t}jnT)~`yf;0)G;9e;caYYjfUj6BaQ zCe8^sxiVGPAqP-E!DQpd@Zyx0U;ImGNLFb&hp-cr+31XN06))L4m!+(2&q#esrD}+ z*8Q29)V6W=wqIZI14)JX*Ic7Jxu!S@4_(n7f9Ze}r31b8xO>@o5OGy3To`aTK5bn@ z0Fq@cf#qVzFe^br;Z;5auy&S2m2T5R%;;-;pxBfJy->6bArK|Vh6}VANbTK~%s>Cm zqd1ExLn#xIIQhr#=K1%Bt3A^kO?;Jb=Ni(lzoki+^;V%+0eGRx1GLOwS_(qH|HMTA zr-Kciq!WW{_iuKTB4z$l&Bo@ol&nDb@w=x=;P26~_#m9LIhC(CbHmF|ZK@phZqVRm zbo)JEJj6IhXgl@qLw!r{n+M!}O=sd>3K+|9A6cTyub312vkt|yDDHMg(0CFJK-mGP z7^DvcJbV0h?ymd??sJ0Fwr@p^pL&k7!qsb8{Oh(qbFN_lRevi9SVA6R^Ek0O1;{cp zzL4uQrv%ezFya90iOL+#trrjfv<|<%+o*hgR7+3y>7pN}Oz(v}9|TZ7xr+kNcVg|l z197bUlJSANeDjlE&{D@A*R?@)H*YbywhEEfNZD zEv3MPKD~QeP-UzAS}6_L*zDDo&D&i8#6;p=hO_^c%GB`hGswKK896&{wsLxF$uv{X zaN5^RoFjd_WOuJ%_8ukaAjPw4I6ylM{`Eq-X_vGNyL0Hw;lx`!#lM}@m_4g(xQu4Fi7&>$TBitHRwBMD?-|(C{ADTT8 z?jRi6>)#s!=kA{t9&>G#8knOXwA05W8BZd%slNZah+!<0A}*Q(!tS3-Md#dTG)BA2 zf$Mx!C^V=MH#xlJBTUUa$rYDDC{?nrAyK~v+bn^4fXb38=yn;K68JfTe<5xbIPQHk18DgX5p$o9(V7r7re80e*7zL(fdt7`4<^6;KV zXjgPLUx+)nMlH}Sq&~)Eei{bZILha^m;LU$DFE>H>0uoxRhKBLJQe&tlqTgpHN+Yg zC0K1Ul9pOvC;lwBKc@YzE92(U^8IOX`=}nRCI_oX^k3q{7cY)e+JVl5H&iIRYK)JQ zqqb4@ABvm>@(_XuyEUudj%T&g$AqR&T6UOBg45y<0NE3c=Se(CS{2;BA}0d(N$J9W zAbYw~m@OUCeuz?RI9vDG@}>5qINSbUJ8fXQnk>zFHmci;$=q*1Cv2LOPnx)N`~{h< zDjd8TNF!2h@Oxhi=ah1RxbkhD^74*#^CLXO)0Xun+tsG*TOcuFs|F$?;1X7d>~AVJ z?}?is18!i?5tn6}f`T7dsqXn@Dz?^mbY^`0Ua>YsV^2-R~oCb9J3aItbyk6PiU zsw1DeN_t}+Oh-N&bxl!AQ?yY9L-_ZUsCohxsge`rkS#uXhmYyO#I)*CBW6n4gA2ZB z%p^Tlr`3DECl1y68)z#2cr0>qJ10bv?jO_jn5T_LcDf2ov3^vWDJ4IKaqAK)6+9_< z_GsJ}O&k8%8K{fW`@zqc_3o_J>+#t(i)9KpD`g>o2-AJK|7s~TW!smA zY(!u**CR=mzz1#BpHK?3O`qg8ywCn~qY4>6Z!N@ONo$?<88=pOuXwDAI5Pezwf8pH zwd`sB^dRR5)PUo`w3IL*17YvU3Q4Y38jsS-@eD)6+(ACxN}fTfyyXy?M8&=6oAqca zi8ob>)*H)swun@aTsoSC5U15S-E_te7Ed7e>?}f*_nBJQ%k);PdBu77_Vi%N143{1 zf(q=?;?5lTvBdYUwrAkMTYozvp)tYz*bNOw_LF%sy27Ah*^bmWO^C*2iaX&?LukuiPj7$lwbbM3u+#C&G zjy8nK+&kd~j`0BXbUjn3DgpKe5J$J{F&B}SM@i3_Q7JQ^%0}V;>f=(RgvOiQgyE~g z0rC~>+o_fB#aJp8QP|8O+l)?VhOkuOe4EjCA+qBn?N2NR=37qbhY0XyZH3O=nkWOn z_=Enb5FJv-@U2XpwtluCbeNp->gvy{|G?=^tAO#lv|4h8W`Ju*t`&t`Qub=T7W?x=g zYvab3h{wthZWZ?zVyAN1(uTOv3+DVy2<)yaPIQ?yIuK7o1x|!@H5vu$OMz3_KXcL~ z!&qMaUrq!n^Z!r_P(K$)5yfGlukMu*7GL=}Qrp2N!p|otAR_v3ae2JCwY90bt-jlj zBV+1&VxkJ0<;V^3bYf~k&+jai_V8a>yRbi>jrIf~a78CMrq##epTGtb;X5SQ=0;@9 zDdyq{g81vru@Xg4HabDqTKhFaNEIP+`&_69Q zWN~_g(?y~pK&YJbQ+k<{c~Sby_4;yfP2>L8;Ay z{+-^zrVq+I8nYxS&Hi~@?ARJZhfyFa!9(v2v?J5sLxfH0m$M(^866TtsIK+9hB?|^!~LT2~C7Q`sAR2wS)DE4*3&@7`4k}Lqg$JYhCDSw`kO^SO)0% zEfBn_$>*gva66|;7ZWeA|t(>SmpB3}<>pgyz zUI)hDx6S(X;(~Nvg!=oEo+v6a8LO&Wc_IB392Y6QmK9{Rq!i|L{(cyl%)xNx2*)4E_CqHA_8nN2IGIdJ}lOe=jq9MTvgUz zYvB)|y@0Nh!-m&b!bP~4FwL%Psu1GIe^o;yGvob;w>p^Nww_Cf2@4{-tNJ&26&7X& z28=Zul@8i_RY|HOQYzVe7Ry>&Fq}W_$`gj z3l(K-ydU(g$;nFY)$iUFl@ta_TYn-^PgP%BrR2D~k8v{OKZMU>{eE+HkE#YKu$%;YmGyE>+RB85kkoc@J+h?Z?7sy8zrT^sC1XWn z&8Pyt7tVzz*javm0kH{K`rQiLyT{7@?kftxT4AP<{*@VQikW?w$^}Qe9=6&FdQVVpmWiJjyW2-1OjgMk zIUL!8)YyI0LwQK~`A_ICs+0InPe+F5`O7gc6bEe_g?Eb#g# zHia+x&&lHFO#D8p9C%n_Q?b|d7N;ioAg+)YyQXyS$RF29w4nnCB9Tu)l5~O1&%pnZ z?+(P7oW9{jxG*<&bW0x2J>Cuk(09vy{;%6u=FSb4Nt)$02N$OcyKm|xTOt#)e*YYn zu|9$VWY|?p>?}UJR|#ya&yShCq}o^Kq9@5M_UM~&^o%arDx{HaIW;7}i8}jeHU}D_ zkOt8}5rdHnn(Y(=fjxWpq29mbvd}F`Rsz+|^10`CjpS`Hr?l{^)4Ef%FC7TGXQjVA z(o^9%#{o$0Hw4f!$#&rfBC-E5904>t$s;FQcVF+j-Ls*uLC2yxRzV7JE4N015-(vS zByp>4ous7*7|>DY;s>*P+U#Q4Oi`QaedZM~A9Xy<1uPbO=`SQV0vdgqb7kw3?UzFZ zw5gelvqprF{56q96TIgVGT3C(qV&|+?1>UcxpzgfUjg)2jAc-+f0U1a3=PAW5bPV? z4&QopGJLZu>99k;EJ%(jLFGj`giaRSJlkl*{1!ENQ`%>GMcq}TBL_PfPb|);+|BRh zmpEU*LnbX%&;cBnoO2i#VfCF&ZyV)C))Y7nC>-h6LRd5YZr$Dbsk~wX-|6F`4D|;E z8;KcS-jIeRN1zOvn2N0bn%3bk#$^dMUTHfcqmxIP>UPS5ZLkR-i0R|9jHeOXo|9Tt zTP6TiyD)$(0~*j6_O&ir1kY1baeKAfW@I)6GKSMOQ->gAlXyiL$Kijjb~5go2vL}* z4%~#N=%$RndwoUo<#r9IHS=M=tOnh)^wPUC88_P5F@SdBxHO}lU;=MoxNsNK?7B?? zfIdTO6QgCK3gq<9cm}0?;6MGpPglRKbfk0iwowI`$3ioG9_tLo??bZ5sxgsc5^kRq z?vLa5Hb-0V?n{dpEK02#rUv?^tf>knhSMM3TM^i|Hw6}bub>Be&9w%Kii+YB zZGS3yx~G%l3LZ0k2?`$&vk(w)iSa1+6CF2je?J;&Z^t^DhErb-O_MNjk8PtGThX#r z-Sc>8xo$1r-AyS2piMgXiUSh^*mDIpEkAjItOv_5q-?&-X2U>J)HJCoUICYyB%O%5 zx_b0{V|lPkhP}SvxGrh0K(*>nQ4vD>30?9UDo>6pn)9&~Z(hIan{YE3-~1MFYp=dk z0viGP#N))sp&^<3E*Lry2Y*7jRG~VP+C#i@wKl&N@kNhSN^F?Hss71KY@7?$fa26@ zeAKmoprFrR9o+y)&U!39Q9)CJi53x-8QBr8f&jZ)&!uD!lRqLtD53FB`d@55K|m7> zIIt+;=hsl?3Yo<=-M_dInXP_e7~2hBJI*Ef0D%|@0eG+;Gb=tSunZ{HU}t|<2I@ls zM)J;^nI*0)DywxHZ+|4ezfbheNp(+bUIg}HtXt(IVT8}Fg5||y?AHvzsHz*p%&b-h zDSu>|B1_Zn>X-pGBwi0Qi__T0Z{3oMT4ccJkNHj;875s2fQkcSQRV# zEnptM1wPZIsVm};7B#4&-DK&P);LX>e(GCGqNjAPBfE-FRIDH5)3YJC%4Pthb zLm3SrK&O~01pA>S)UVmsui2F+m$U`qV4pOA@4}2Nxb< z!&b!yXA`uPry^eaH{6dJR(VVIn|E%6Ij&*ePHFQ3Kimx`S^G{R9BmOxCExvF*d8O7 z>|z%Q{25%2m-R3mw2yt%ldsyrn|VQiOoxx>aST|oB0lD1bL7;5=#SN9A~HMPP6$X) z56n3q=i`GC@n%Q?9zhBc#0ept^cyG92(gi`rhgCg&usSbC9ac(?*6 z>){kQyFj(o2ms2R`WpFhsB_$q*bQ1Eb-WgDOXj1!N@bf}^S+w)jD@U?eNA14q~idN z=+Lg}FrL`=+UfOG{9pmKQL6A`P#M>T3{wHKuec8ELfKz&m`kMj|06pm)P1kfJ#H!>!8 zDOAlb`PI%{kE6-WPcc>Nb}dPslh_R833Xk5Y%{0x3$6tAnt}X}&JEg7h9T#-0#If% z;1MP^5H$r2?X(ngT1JDCZ;Kot$t9ujU&bHM|ED3L?#f@qSmD4%Vw0vz-^s@-Z@aw- zj&A;j>9-8GIJRfnL;4WCHwQ<5tp?ua6~L;UeySg5h_$PKFqSVeL&tpZ&y{!xK1@X4 zLCle8t9%&7KSw*1dp!BXK?3lAESGP8>rSZzcPWb1VIGR;KW-~4=_w{O z5>}D%`PzLC@H35@JY})J{t6Wg=$s`upvA(67_9M8@&Uv!jAb;!QVAqqp+R}kR{HjY z$#4=oiTWyze+>4KLf6?jw>2!&=w@O-HFoe=8*LMW*V2LiD+W(ieiKPa9}E_oWvQ`? zS@PvHa_-agb(j(OIkjITHa-S)T%@>+e*G33_3bH|R!v$m7at@q9@G`%0H9f|3DoRB z(gz6s9{RwSOK1HF=U(zmocjHH8C%>H^o$j=wscYVcK$S09a5Iyp3aFr2XZUCf1!ph(AZh`0wlIyY7?rt(Ci8RpPXe z1~I^CvY|s1-42BiA;m;;u)czAcnE+LJG0Dv*-*Y$&eXXfc`exyG?Q*<`~itF3v{zY*#Y5!Vhsq?J2;UotrN&XYvX7wYyYuWzGoFy zV{8wAb@7d<6&(xfoqhCaQ7`!cRQt^sV5C61tf1OejhS7cLqNfw==>8UQ_qaiOWoD}~T6Ry#;7aeDtmzXWQzI=41TcPOVBH4l85 zcNt)NM8YgGW-bQy48gJ;9izz*xJ4o*UDW!-h2Ka|DfY~1!E8+4?MGEScJ_S)+S=xd z1zb%)r63FD!Tf2&iohbak9q+{9oYfNa?GB$-R9fHVFmkQ?>)z+dWKd-*WEc48!~rY zy$lyZrTq+>gu;nYW88qEI2tXysAay;@LULhDLdlqgt9fWB69$3pny8|r-SXBdz#<< zKD=(`ZzudP?slu|puSsyHw*FVqV~~w>0-6{(5cm%0J=;x(6>uGo)yLfz7AK!iIl$u(mc%?$z(btA!~7R)EazP-4OCyBj62TB<$* zsX0zY@WV{gd~Hn0L$wRL^m1?K zcPzY_p~6VEoC7dIWCcdEA@9+^FKa*{rxWm63EC17^CNP2 zS|rWlR5vLr) zt_-{~IUg=(N}A|qaImk(1xxbZ81hLK?$~>^c}#XyVbF4P&`tU5GnXo6T@ououtuUD z(%t_o*rt(aBK!`5n0OL8T;6%|CAWG@8qFKV_acB3R;BRgcf{8FAYNUT2b%kRY$~mr z7wXZJX;byOfA*daCd^I1$et9lq)k|GbjxqMZnN-xkHm;a(wmy~ls)d*s-bDCdo2DP zY*@xJhkeO;+cJ6^eEF$V@p@r99#c}2zj}N#EIc-mDnq{#j_A%t%)QCesnAb*Z~cOH zJT)z{NO){%I)9Sl3x{u%#g>q^T|YpLqbs~Q#T1v;j9PPz)zE$S`Tww+G=OR#0g~x|lw?#XzbigzJ(yHf<@vCMiu$eEe zR~tDS(4z@5t8r4`j9*>~#DDFeLcrhUXn-nO+6)qE;#(Zizp?yphErczW;)j-n%-$= zeQ>?&!XahwZ+Pc@{~D%`9cS>D5VY38i)u6qELAX{7(YODCqstu_U zXZ^a(mCN`2^9NbfQjw)<&YDq~_$~Dk#2gO!Qi9a(Kb~->h39rDogc@--^0Hp6yTwb zWuRU3{gRzN2=0<Fvaoj zflLl5llI9!npXIX-s1H!92u1#OFgs117!@8mrc9h96WUjz_^8y{0by}4=3z2C&B=b zVIK~h+A`?tOf2b%K<|0abWCtyXyT49?Ug{jwJ}wOjQ>#&KCjVerr3i2U!i8F+dB1i zKmQ3LC-G5pX;iT}uQV^9A6eF7Q=*VNVdJ-Bev$wD^VXC{-|Ht&lxu3!1c+77?PcuU zem*ih>f?wor1+pl^n=`wN6w9e4+V!cAc)ZKI=>p&(XtDntpPFMjGZpapUgXfD`bwR zf%BL>apW$~>o#va?YbV;LdA;@mLyXl&q^_|97bpCWxH6(B*hS&VC?=9LnQxxV(FQP zhtmyF8(vGd9HL0sLPRl?Z|k+8w}->5ct-5cG*S1(vsz@=&S=C^<`MunuWv&~>nBVx zz%j1}pyWH?m{>eI^!KOn{#IUUii3-)Nb>r^P4M4>&8;7vZGRVPFy61(m6=!`vE(bU zOuUa?(TMzNMX&}yEs4?}0zq(8r&V@bfE#fA0}R7&Wl!l|+BkYcRj65ek@9UbkX(VYJ%Bw&h$gUlLa14g!ZBfoY@Z%lfuu3>abpFHEi3+>57GyO{!g>t>CEwyZ^<{4%_`3Wq{ZLVxCp zdz~0K#@{-=Sdua_F=Y^ogr1D!Ic?0Fcqz_$?!Kg<*8AF7J_vNgLNUDu74L1)CgslE zstHnk_|2l2>1r$kzdq60*05-;rDBtX0Mu&u)I zNa5(Yuw-C?KG@n6cNilOSsccYe0qTWMx9hLaQ;DVW}M`V!53${1=pRf8h(CPol_l3 zc-Z4yR)=o!>PZ1Q*EHj)fmjyWHa{;)UB2m&q9)(|dsy@f<~rR*GI@W_I1P3-eRPU; zY~yfdKiTC+{`W$BFtQdP`pvFzUj_c&auZC(B1xv}juBcMxvNY?4bF@tUd7Iz(^LsN zT{TkqqaG84^atxi9{&!G4ET~=Oi;-Fsk23^u;li>b&8sJq#Z6@$#UY*wUYbhgM|C3 z^d+u}Jk8z1DN{ORp9U{pH=Qe4273wZ-P~YpX5+N9x95Srd)p#lyG^P+ym{6WhXpSjOS>kvsVL=PF znF?cy$D~JF?P?nokD3@*i1+B_o{05d?*~$Cwij|fdJw-?_9FDF6I9oAJOMSH^*S?d zb{t}6CcgD4jZ9~sHw#FWhXGjE9fCkFj2Bab^ulkY90aygl9bKhK*KW#TBJY_7nt~j zzlsl_5{p;>)GH@I9yl#QNpaz)rxMF}Z?CEWKN%lH8#(_b0 zg5nE$^Cm>xipzZ%CVF!o#xu(Buc!pZ!thXz-q?R|%c*x~n6RYT&I$dre8j2WrT^ZD zH*M4>$Av+LHji~btfVN6lb`qZrh`eyN8O+AzehLu74=Z#N~wS%GKuiJ@k1`)h2Xw{ zL5ar?rRY_PY~jOkvrAo|&o%{)vd}^(7=4?#f55N|diQ~$oje*ykn+%S+IQ}H0t2L6 zBn!c%!bh*9<$>^+FobN#j#6{hsv5!w>{Gt}f zpPoxL`242`oYAuW8XIQu^>-7bE)?dfIK+zcRT|L=qRb$~BG(seU&pr}cXYDf%hV^X z`_o0;n|uJYqo?-d`d3uMCRtzBzal(o?A#NG^S|uj6#|?NlZ$1UIpw}Kdh)nhjEt7A8Ybx_PLc{<*k!Lr64t76Jg6M^B~P` ziS3Pz9I;;(E+?hi+jX#JHswXV+B>j$BO19J2+p0^Kf*E>1DW<9oRaYLOX*wJG8^Mv z=e^_n{q7#IUlVSz`Iyu$dykW=6fiK*A4F5Z?F@Y|Y!8J4cN_8bX_Ohb0<{I&@1Yy& z6c@|itZ|VQuUNBm&es9F&~?7>W>P2F#Bqx@>5>Z&6v>{Paa{e8vEw-YWRP*&#Wilhn|J^Ln6pzF3A0+?eqNkJ1VJ_^x9SL#-9%)N^1H7T>t z*dh>&D1F&A!3P4@(ORDRykP#^;>v)^fg?FJVE2LMbBsjNwRX9~uOC)J4&$z>?;@}7 zwwfOf1i=xLcwxg8a;I_gjrP3gw>M4ofbu7xhy>;PpeV(Z&-#-k9|9N%tLC&w=a*+QI~&u#;}$DB1+@j8$rAs2Vk6z6BmYl*e9jlbIcgD({^W^mSMsjEm{HJhlJx^Rg@ zXEeI@R#LXog0yF=qntD8JYrNea-5R&LF>Nj<9J#-H9I!C-c$$6gByrAO|W>~>Sp>!>H_~^Dd6*vt0g(v2{twup1u80A{_{8$1 z(ZeEz+*;k$^_s?6)k5MuzVAfe87CfF2uuv+P*L^dY%z+xB4&CamHJH{^I8dpx)17m zMQV+ii*NB2Fg|thW~rttAa+G^(stE^ee@NUJQ-az`=&WE_~waz&f22Yy8r1*40hXW z2fx$XC=)nZ)A!1z>;6z_@pl*>!GxrGIwXp17|s`y`s5wSP~~de`D+^Gi4?US9XZH5 zsEPev?_#?4#j&YlM9s|naGo*S;f9PflNc-3Clxdcr5J0kPAUjBa}+v!fq7{ z1KT&sTpyftt&NG`lmbLR6wNp$U=cM)k2W7rWlrQL*N-=HVcSlL>P&h6_^oX~j<`Kk zwrX@|_aga7KJ`7NI7duDI+HN`uf*P_PBRlQDq9fm%#`?OKr{axRGI+@eX*X(zigMC z2nQQyp#dBG86cFE6SwjV$X37v?AY!DoAPqU5Qo}22%3^UpK3G1LyXK!ivWpP2>7X* zM7{EEFRpbbsx%}`>c2Wox_WSpd1&1l@ahc^!KZ=>wvZoX6UKXiD(&8 z$lwS}fJ_%6Qwi8Nvxna+u^(M^GFacj`a1J)qX&8Mv-?4q7_kilatFHdU_`v2mk2Ie z6s8UBV#z@O>xaAmV1)n{-_8NsP4#Ke4dV}wA**}`|LeAiV*O`T3Zi1*hS~sre@6VG znf7Dj;L6Iv#`va;#KWcipNs1fqCz5~!YC=Rt(#lC%;`JL>hRgSI~r5^{4WC-?|N_i zHC+t;4BrKXOefgwc1<#&WmOW<%>R$5ua1iHi@Lrubcb|HNrQBUqJpG^pnyY%(%mzF zf=UX~5(-<(bZt^w8+inLP>`P0V_66fSQiz{l~=TCnu|->)hs- zM^3iB8PXrdFyS-_bNKdRGq(E+XWgo=3eF!-d$?j*{mnd#C6y2mvZPgTLwc;Q25$8l z?;PAJ^rTa!TZMG?Txf~S>7*U+ovrsVnqB$C#j{|j@KuvbayFCmy;UUtKt!t!-)dt4 zklqVD3$#qAyuu$7CeM`Gm7=<*e?$mtN||^+$Af#qM9>m0%}+hsP*d0?Fn0YSOrZFO zGZ_v50g(kT6wYnF=ofY6t-IF_BRhC`5!Zcz`2|uXv1C+eDyd7K>ES5)xU80Q7Zxun z33>HlafA^7BCL53v0h4|@dMsS&oqGiNW{4`a64CO(@uweweOAA?Gwq<IFQupi-i`0c_A08U>KaluNdYr(_BAR#THts?FLU>TN zX#?)CYlr97WhanR#&0}Mxm<=&=}j(5^z=%bJC54rHqvH*;{tZr*E}WqLWCgw+F}3~ z9M3X_kQ6wh+ zS$eU!oO!Vqz1PLK`7qUfn-^swug#I+=%zI^#Aqn#2J^i$$S2QF0Su4@fP z_0O1Gf6q9T>&p+Td*Z)4$Qm)^|26eb7gMy2#Yuz~7iFZB?1Kx?S802<+=qsssuN!D1$-SfU`gg3#Fplg;+_u|py6+&ia2izj^V!@s`_3km+bm=<#}oMfWD z9Q32H9|eA;B5%H4+y(@qb7~rDd-@L-{J%~aqyP0(=>-M1dzT}Sath(DGK?u zb2GC@)utf;q8Kx_9^E@0O0HP62p!v@ikioq(ylbG{QT%SYh$cKM` z2Ndz4m3-kim?vn{rth_0LuZZb=-X`@@5#L!*b~t>xzQtOnGa9oYVj=d0av#w&b9 zUkJpp3!FvGzgc5T?Xo4Zr3$B8m{TM-t4_5&8Y#!mdtOk1nQ(xI&9p1SKr{cAaGe9l zZ=EC}c|^*)ZVlG#p1BvzmR=XE;*DOvy{$C7^U^6fvYWitqy1jTn`;|edm)iq9cK*4;vE7?t4W$dcyI~6Tp8-O$xw1%wQGUu^J?0xlyqJ7?^ z=_HV-)=sW=UQab%x~EHYyQc~4k86H=G{~=rZt-6E z@l|-E+f^hrsuxtB+hJjo4Sd3F)@Q*FYZ2e~2F=j&B@N7p&|lbEGQ6>!9q!#Gh>qu4@S_iIvT=uL&6?-~^)K>4Q|k|xY1g2|WPJbub5d@2fl zu=ZF(AAo4}X6e-LyvxNv(81C(IqP_1jQ(Te7SDCE#pa4HpreF%IOop=*MHjEB7YSW z&heF_HD>5swNNWCxMdduKOEcha&%2$)HAVlepKp5{=)abjnj6VfR)6KJYr851 zT8G+d>1!*9_@vSt81VL+fSR-K{Yp{hci;9JjZ(hzP#GK7CmLTj)J_o2h!$QZ&I5IQ z^2d&~Izp?3Rlyw9Dpg?$>pU)(3rWgvd%KhEMm%LBu`aVm$}HNC+X?jyiZm>QEgox* zh?h3iVB5c7+PHBbh*)!aM!?FJW=CMD?)>l2`Ydt!?gy~~s^MNr=8v6pN#=T^Dd%zP zg!jdIyEs&ryHvPeUTGBcJJLl|)97}MO%)lLI1bJChnuzApKyv58qo2Mev9~`KD6~n zP!un>8LRO9u$l4+03kf@V;5~>hh!T|Qr-zxyF5D@t@$)q5!y}Tp>lRMCn7-2(D;-1 zN?JxQQ|XIpmbU3pv>)&lg|zd%Fh4w|$$3b0!ptUe)D*U;llNMDh$6D|2llY&I~Urp z&fPrAecr@!rOyr2ot%wgLbxS#bbYj|!DTGkg0hPUT)oQCa6Q_T{Bj=RDK?eR-?XTCQJQ?E zJBdW-R{D>ST5WRFupOPoTNik7%2NV>?~gL0Lv`RLV|UR4)`&Pbn3q;j;sl2KFiTPO zJD^;|9R-yRmVZ0!Qy|Jj4oB*LV>7>8)HkGo;&Uv*5mV2vP~|4A353(&(A*8MTzwD8 ze-w@w&c3l!kUQEOI`Ow}ueESG_4_@I*bUH&i!0EAFCD042h%I{XFd=ZA;f0YKUq4Igh3n4+0wxyEwb*){Q-I;Mpbg*^_5wQrwtQk-7E zS4w^*lGpZ$Q}+YLF>MsGMHm~%0qgUXM4m97=ufW~64XAqaOn(pK^r4FOB4tdV6j`t zs$d*TMq&bQy;qz?n6(bJRv>U=!H)v~N1r^XaQI5!iBaw=MXb`Yas)`c34yTR7_OqS zb>#;bm`%~xT79i4eI>ZMX5Qj!QMNH*JUM+Jc)q^f<8t&^E|1;t*ZQiod?XKwqx!DW zZz}9X?{kNJNImku5YsmZiIpZER!#CP4&5dsl-XUM_*Hmc{$bZ{MOXAat5z!@1Ij%UQf75 zP`@s{?HlVIN*cI&)X4gm^&2IJem3P@8QQBdc|Dn)3sFlQatFPU9!>`Z}oWA(y{TF!X+T(4(o>{&8 z6E13N>z96`o6C38B9K@rSWe~-`>E`0`D7t?sVs6x+X6J3?jo*=V?FZ5onsSz+MMg& zEqJ!M@6vvzbk-?q%ET*Y;I&Hcg)wD1!RlXWkx5 zwaL6r3wW5A^ZV9bcGuGi(Y z&FNZ(crcb_n~L$@Ep452I;f9`i%)EM#|RsMIK7mQw};+6wQ7lJ;x`_od5n2CW_z)4AF(*n9h71cRs5%xuq3@S+C~#d_a=M)2$r;1q_o}T;Ygc z_d=eY2Y_6CknP6d0KB6xZE^PM3V^tby-=mX0;ZNq=zNLRVf1m8?fEVzeHe!5t;4$4OPU}9ED*?>qyx8 zNtU7JTuiowMy=$|i#N%le`IZkiMzOow!_Rd##BNg9&)4B4s-7Watc|qVctJER-oUWrY{ShN^fg%}b+q;)-}mz726jox(!;KPbfmxX z!&eeTMQ|@bTVMaF?^*y3s*?F|Ny92>uT`;l?*^h6V}5yLxMik zw74C%`&vbBM@#R7DJw#5lO$9cH==Nq1QOB{6 z<`$yh-}?j?B94RXl#gKyz`Si5)&z{@0UZ_^L(zu9oiHf^fboSVPaUebhaPer6fc(*oGt2 z@^ad|DL|x@&3vz49W!>Qx=HQNPTEM6`wI+^vN^4{^wBOb@Ro5^zws~ZlngzRWs2*!?{}>L*R9J|-shW51T5=oySf1Uj!dR36}p zLq5vS&NGRk^#2oh1E{6H!fL5sWKv2;lIy0vjm!?+c)Z<=yBT`YWMsf>k!6;|&qo6T z*XN;GxNl+IClQ)`G0BYorXPgTDozOeWX+; z1Jpo!eID8*P(EO;ikm5O(BqB0?+J$t+%<+@RPDq9gP3iefn10C?}hrmW1%01bFsFu z^rAPTGRRjV#&RM0?NT^g^WcFRjLVZdekqZh>ih$Gi}lm%L>*VOR`SlHmhqmo7^@7f z&9E|)rW3xSV)=eqd0HnUE9(yPpAGc!C>>mJBSnh^q5tbTr}rS8|Lsh$zKyDHTG3ki zcumywY|2g$o;zL8^T0Z}>}f5h$J;HVt<${9vDab#q+|l;Z5c@Y%#*2V;airIDsI$( zBMu7Qql$=JZrJXg;=T!WSrlFI8gX{p?H_M^b#xgipBo?RdXG1K=i4BrJ+bJk+r?_3 zrz8U7Z%SDO9lJ(OavelD!;Yb{foU@aRk=un3(0>x{2lK4QzV}XD9=fxtL|Mix)@v* zLX<$%XGr%U$qL?of^D5I^cZ`8A-&?_Lc5x!^NS{~{CI&QLLv0eE!GDX=<=U&D_P~A z&a%oe(t!5JiG3~g;gy19yZ;3UUgU}Vin{iJgHlZA22@u&jSoUy%5dNgaUj>w}um)#ybdpt81Uh(JP^Cb;&W%>41!hp-bd*n0I!2X?tW zjjT1GdNoqMfN?!cWFA8DO;up2s3We*Z3luRijJ`i4oQJwho}T&JzfV=<&Jf!NDrO6 z=<03iv-c7|;*>>Y_JOk6K}(!%p6n+L&*!W9aDN?u@x6_CQ!0Z;I883a)&15W-c0Uo z%$a*Fw_>CB*ApM!tIHF+DX0|?cNeB?AYCHjK13<~VzMEPD00i)bQ&h|YcuPk!-Hu` zYw;R8Dw1ExyeJj9O?4eRy6+;~hvDDo#VmTeFnp!@dbL(OTM)ji(r0A`i!Y^!a>G6% zFuiIqq<=y`Z$f}c!rr0#5($e4=@BTtuTNTvhapRc8r1FjVZciZSg?R1U{UR}{MuK6 zC$scAcjLsKKA^=yh-rd0C57>)!@_$)#WC0;m^wBKMqKyr$oKb^W+KDsbt|DsoO%Ic zVML38Pw1^lWupA5o&8zk+#1^{IzWoV;|u&PG*6i$m1`$mF4Nw=CZ&PX<@4D#GjEB9 zQut~9#!$8y7EvZG#!^Yn$X!EN5{eyWnF3Dda80*E%byepgOO|5L0kMULCHw#Qkb+V z25vq`=b@Yy)F83+KT^PK8g0j4m4WP`(S@sz%+NizWY?;UuSKxNX)uWOxu_WM8O*wm zgGjsLaQ|=;?u+6AKK%RR5MT>|^)TSJ`2{6r{#z?;CSxYv(>u3#!M^PBMboNHeb)N= z)e6n@*V#dCmM<=)zbhf=X7k-oYVa-pZ2kon>U=j@sLbcB(xx`9%B8`n7N%mJ*GIxN zQz^A7Gp58k%yu{2`^;`;Zri_JT>ISPZ%Q}#{8+FQGgORd-tha-<`9zp4N|J2%vGgp ziyzY290Igqv_ufm`Q^!4(J7i};JN`bK!@N9(UaHug131!U%8f$fh2cVJfhy^hPG93 zdK1d>IYm%|U@Smd&T@}Sj)Dk|B9iq3ThRUh#VHrYJxTE=kxNz4MxkxaM?04;xu@Lv z6~=#W5`i=`8JUJD#Cg7;8Ib7$QEkUHSGf%yRTotsub6c?z#lIYej7?eDZq*W&NM&X z&w7)(RbJ7T_3LAyYMz=x979w04quoaAarH{)}upk?wcmxxH@Lk;|>>qAETMB4boqF zY~4OTB3~4|wI6c&Iu7#m%dY4C;CwoYo5R>_Bay~%;ctolBck>5?Yya@&O;oUa@-bi zC13~fwi%0w`2GvR`BCWNF+Ooj;T|7;!YZF;(v;yqMlcZW=ZIwlAXBHylJsGfgFBtKI`iXrE=D_We;M}BE z>nNMIi+KMJc3foy3oQn&66&$JQnUi$G)nh>-}%ftr(@Lwc9S8C>UNd-GP1shN$89m z>N6A6d67)JggQvJi11Q}&)cPq7L7k~HDVG*_g}A)L{83Xge!2Ec9wtA{e<@C_MiW$oY+`COcyDaK|2}wxfPz0k z-Ae)!3tuVw2}vc)30C}HO8{u;ye-k9bAhZA+WqXC1k$b|ibAr#4{cGPd=%tL-fzl) zF7D}#76dzLuI^$a>-y?ge&%xqzxD0$H~vr5%zAlzpTPXd2KI?SO2p50O0Po`^l;JC zVMxGB#ks2T<5`DE<6#wRSV>sCCP115a=+zSo^m}{vX{%Ag^@Dk zD#pB>Kb~lFa7Boj(nDn_bV;e*>WFT>B+E}b%x7~wKfT{;ODvFTCsQyEI?TC9!70_D zY3td5S~G*&>*%3cCH8J$DF99W1p8IrDd*EcqXAGj{kn5? z6Xy!|tCTAV)uno40ke!0yu^=alkMpcoqw@`L)c*O;(|I6;Nh7uNE)$@j*68hpVnNU zC*>9&fR~+0meo8mia~lQye{^eztV z{UoIhV8NC6K`_2o155;zZ*oEG?nwHEs@o2 zg0siWlW%E3ofD!^=q|XtGB#W$!AG?-OXfZ|4J1B_Tbb@1sT~irUu=9{**opDQac(w zd|Bf0+Qu!AZd=INv}1Oz1DincTSZn!=a$%1g~PORp}6M{uT;_aa(gV4fg&-0Xn(UX z&~O*Ri9SYNG2f3dc5PLV4)~!H?oIio@-}a#egDoyiL`;f+7~9yJJMXp2iDVqe8Lzz zBz|wUiOD&=^`l+doaw!vLk9_@56LoUo7MXh%icTRc1@2%cKLA-qnOUu6hNDzPBLMUb9C2_2q@ z`?77wlSUoY?$))}V?R@Qo1~6tk3?$eb4vE>pY@2gOP5EV|Loz{$0Pl6Mo%TK%#-S{ zTD>6dB8mDASO5_Hmtr!Iw>ESsP?S9H}89}mD=7kC=zMBKSQXf{eDH@`L?u}F>d^eT|U0-zN*4^7d-~@aO2Yzx<@${ z10&lk_^egc>S;*vD={RwA|~^!H!kod`OMy9BAp@&P4%h#8&2SK;LTw7wgWp_Di!)# z5s(Nxsnru4)B>dYd1HIjCIjy#>KR4uPN+>T~k5`l)HXF~$wF@!J)Nn@Na zK&%#&Are8*&s^5V?}8keNSRN2So6nGUcTYBRv6Wr??yZnFPl0J?np05KB&E>aQpQ9 zU$30m+w*xfVn=3uezPC(>vIEtB2NPz!IX8yEnkUZ;T;XcUC;)7t^9NHm+JogfZHwh zP}L5*u#@75sMHeQf%$~uF?|fifpk~i-5Ah`<-vPRF~4`3X1)r6`~*k zer~*wRPMLO_d(fRHj<=_w`}ag3CoGM=v&q5)~|P6YelkEZ32mETbD$UNeP zgu1s$C4EKYkN_1bEL^&lBK%lOqxC)w%_Gqer7$vDC_O}Rg^<73;qPuU6*0D6eN+F| z@Pn~lfVSLlt!!H0`f>8eGJ2s#VR_r~a(F5ugE90IZI+(Ovo;gAsSe1L|)Fu zpsWl55?Pcx<6{pPsf^F zmei}6#ulT<%9$&^;qXC8f#Q2={N(PxNhuF3UO$EKaZs(Fzj~VJaC&Nga8e|2_}H#& zm>V4DWGM8{7l1DN+nmP=a$<({v**8!68?NWAQjmte*6GypHph)kNQt(k>|=A&DlRg zKBHo+593!&)^M)u5=%k|_WeULc<>vC5d$FQ^n&9!VS%Uq!O zcQ)ushp^1_m!pa8g%p^@icPsJ-zWevLjYqe45*UoHn(x;f8Cqf=CgMHUPNr$M zf+jgbT*+QQ5j&UGT>J@StBOmDrewXJtre@XI)3-jo%!frJpb^2%pV4#kFV3Mt~M7Z z##aj^Mak8yj|NrlpeQn<>#`s}KGV#=67_p*iqgtSxn_({b@g7eUo$s9F*+HCfi|{J1P-`)dj0e=9(aq(E)D*%VuI4#r+WraODH;OfoL#G<^CHC z7Z#U3Yz$dxu>S)?QP`&ehZUezt=6Et!J~Wnc20VZjcV~3kIZe}s($B(%Zl@-KN3ut zh5H|*lEU|81}1f1a*T0l%6TV-ZsJ#GQwfmZdmWk@+`b`@}bm zm*;x?y{WoFXiB5?cQ)r+BN8U|??&j`Kdh79pbxtp7{9-Igz7b|K^qH9V%WcbJ8$2L z5TV9aq_3tk4I%{4oZm9T#;@UUWQ|XsIGaqGO=8=jOjUcrG3=$;3SbmR&+CfrcvvprXsS)$ zt>xs7_}}P&lncjS61Gb`a!3!JnWn&{vF zlFhJJ(qd}}F%p@^uZV`Z#cuMdXZcCD`TB?jrMrOTIoc@#Vm@a}s?*HEEB zM*%K$h4N9uDS{pD1TGT?i|?QCHVc7ZkZEUhm-^_@@tj|VHtuw_mKx9ZIUK<*rE&{b zOw`W5&xYP!mr5WMMyLXRYc<|Evs<1FetQRWMPrv4Fus2nO+C@X3g&%eF0euIi@-ZE z3dPud53-P2!IMmK35A^eHWe*nRCmXBJYOiUumG*yX9eAg)+v?9;peg2?^@7{d9|mj zIJSX7e_&jk;9rFiya-0o3=JTA^f<*Ag|2SRIfdg4^HeTN@lf_4#Of%n5X&}uozCj7 zEyNcoKXw#gvls$kuTE)y)8?GY1+#`>n*rM=l44`>4o)Jc11X7u7bK5EyNa!0;2#EQ z=u&{sn^=O(trr97`Yxx=3kBYXWjNM#XP=siFLrm4d3_J{lJ9|>+C8J0DB^8QmdwZl z-4|weXcb%fPrH^Ld_E>AC)%&t`FQ@Mj9dQgnaII=o*cP;HPNfjSC}BA;0Rrbu`lwq zaWJZ6ujJOkH^*SuC(#M)-d}s^TL5rG89k#hQb4u@AT7Or7X!^rIf961zL!3PX!0L0 z=S}~r2Wh7=)A-!KeOFj7nud*x}u z++aWJGffDd*WwUl@Zi2!x2JT9o{XH(}km#gWCJE&}u%9vg|v%hypJJhZXN~5^2Pv95}#@U^m-xYXi0zwHSl|Vr^H8 zzG{QVv(}WCz>HylY?Q%>6g+XMEjt~dZfFyns=pjhZC@SU`5B9(|LreIZ*_5=BjeVi z_TW9!uKPW}#l4t*xl-v}T+XLh_yjyzV@aPAkHBB*^f~OQCFIc&y!ng!!ew z^^{Fio5t*xCeG`a4bfQdsu-;|$4j{&Vjsj!Q9| zOA#N1!`yrqq)Tf|E4+3js=v7%^@|DQ>(0}2yU^OX*N?_)5ODJS{4&Ty4Q$=d4{nb= zQzy+N9S&un4ppKb#HPVkghu5Da(Jp*)ap52^ox6eR9f+x*@->07KZbAZeK9AA2cd|jtZ87i+3 zpli;XHrtg=XJ|0^{pWp048>xIdP&NH`AOsa6E;RBku8i616s`aT9+#Qt_r)yxgyW+ zU7s?aB~}$C@>bT`W*HMA;58^n9T&yXH(E~wO5-0h(a_Nt?}i!}%*iG9u}wNF1cv@` z6$cN$it|cy|H*)J{ay9-k$A_8TD8vK4A%H)&oDh+`;M;LbLO+uL2CtPEiT$WbmnzC z=Ke=~B1fNy`W@Fbs*R(CHpDCvq%z~gr)QTP4fyC$@9<5cAez#JHaEl zZIEkyC=41TsI$?h&1E_pk`5o+lCqnyvd5OeARne5zuW-^24Ol1#tt^=j+LpMEwxCa zB)gf1Oz$$_f3VkIt}2MD0~|$O6xQ}a=>(e)^-9t7<=g&bcgHP!fyt)qB62(BO9g@8 zub(~dx6cTZIA4}?)|>ddcbr>(6-k;lp&g+$!eNPrz%bk($s=0h~d9 zud8bN*-4bYS^80dl{K83(#sAJ!G>PDEWx8yRab-Z-=!=6rrE$Id9SmR-AlCpbN$|{ z2u%B>Z*F%gBYDr%TF0(h!0Q%a8eF5=H)7*!5=Aw9m#-d_(ut3W7~I!<%;UnLwGm^f zBedi74ZM^|w`Qhf+hIGu%|MdYW-e5Zew-#>k{_05y}dnq4d*kL`~@*Y8eSFQP$lpC z2a!CY!MTG;%Nky4XNk*A@m9$e066$;#g3973EDbmW_0c=6)3f~+;LmymE>*}V|-}LMG4Kg$852+lXUg;K=6h& z_eCdusl<>r7OkNReb*Pv`>Cj2#Xz?f>6bBg$k<6FWzjWd&~Urt_pmlJyTbGzgK%Nrh_a0_B(uS(6UU7;y;-uW9> zJoO3O&%kmR&H^yu;LFF;!aW!m`enx=39tYIWSVF)YvC*N1@YRvLK{2QY!CTI8>F1X50L+%wV8BnCw4Tw2=1oo^Q|9cy>0h=C9bMKh^ zr)IDU+1?;ep8ZZMPQ(F&2LpH8axzZ~2Z=~DO|GHF7}xR&CY-^L%tX}|OfQsU#?Zmt zeGB0L*1Y;1(nW$C*F4se%H&tsYEIUu^+!g{!9Y3O$3Bj?c3qxA9~Z6@qjBgu-v}~QJq6i7FZzYsA()lPllUW3>=JNf30f%GqHLOQxuw zq2vKn84diKIM6Yn38~3Ypa;uZkA!0GGYNqT+GM-M;?cFK-L)r3A|Hr=M3^F=XyhI}8tV7Cc=c%w zdU{Waya@$&o>hl_bW*_n+6J|=pI}_M==jSo4;&cS-N=)eAw|GLHq4f35Ny3=1~10T zgnVx3wc)fvgpf4zWY80;6k&o+UBqq8A1b~unazfV(DCtTSr9P9>VZ|f&_1FWq)`!+ zXZGa3_(IjM(uPS*lQd^!VA#|F7uU$M%bM<1cC10sGLF<_D=mTTnn^b^n?E+&uY41% znlzU*@AIV%D&AVPAsZ#yDY6-oc41 zy`H(7lh@(CoR*{7d9syKS5|?Sx7SAmzFV`T0pqd9F+U=T@hrV*a9a*>a36>-z*PVm zUQA4i?QqBh`yb8ZnDK+RH zm{l9PBClQ_ucZ|9MQb#z@*;LF9gkM3`0XSAzGoG&x|-3i+&bBLWN+nFF8n4UbAvn^ zJ0=nq6Yu~NNJ8c{4Bm2=#Xlzntb+syT zvZ4B-yHnddsN)YaQ-Ao*pG;_+8%L7#4L;Pc11b+KM%BLG4Fc&jCt*zR?9Fy435~^D};+r6uqND3W73f)DIO zcQ6N|B#`%-b(%9Z1V9@!!w9&dbiC-E`xRIR`2D4=V3aE>iA4m?J>+7=&9;fa2P{5o z`z-j{bs}$}D?)oY@_3C!rSuyKA@~(wadj~oT{U38Yi4tT!{x!nn4@pAt8twZml12s z=@}Pr$(3ChRjDQyhrk=Qs+&MgWk~Fa>Fi6=^7rluP=MyElW(|9XPTBmN$cDwRUVKz z0q{vt!TApPuIzD{JUWth8feOFhOo z`ubh7b~XxAIQ+WmUJ^_1s$~ptcLIhWMBIl8+SSl`A9K;`@Z0HaSo=ul?RfKU55kTn z%^7_&DhoqZ`wkSl;sVUtPM+2`IDk}5ETEMou>WhP(3ZI<*+>i#se9m7vpw77 z2wB{&q{1h~=s+a#8yLWRN2m>YM;JPpX;9dKJPy+$L&O6;b5~o`bkka6Mm&()jTp%p zc_4EWO4qNO{pSiD!Mu7E87GS*66=8qCK){^SR*&Y#|=q`FQpPeO9-7o>}H*jmjwA6 zh6o&v9iQH#M!nK*Z^?@hf1H@%;0&8EfIB>LrqSe-ivn?yO^x@h;7TzEIM2WY?wll} zFT*z7kxGrtvgD*t?e=cRH`s*tpb z3i-F{AZ{1!eys=K*)>1ed5zM?Xv9=R)`uo1rGMsGwZej_lE|kU8AJYi?q{*>1kv&4ZR6!Y98TG@U8;3JC8Fq;1`)OCN>` zo#3OZX`k^_4qhbFkA^L$qN%FBhHyvB-`Cp$O+~bT$;rRl2{3^*RHikn%=;0rkEcm& z`t8JR?Zyua{+owM8`6@8gwNuS#E#VapE%3k1Z&n3sk|)EeVVA2e&dR0x#|>Lx85`5 zcltv9G+TYJ`$Lz%156}Zv6Y~eU6bS?OY=w{vjOzUT@att0{?R#X&bQl*^|%lnkm(1 zJ3qGmns)7RvvEzNa%{ncg{iFXF66`mLIWJ6-@}5B+Kik8H!gboio#w*6X1gD3pTX) z91S|L4OBZ8B9Ln`w&$64_t%<8n4NleEWJElL2RX8xjmB}HvNrpX^XVNHyjJ!H!YZUF@3k;M zjC}$PY`{Qk!Ci)dS1HbiXG6DCRAkdk6-R$PY)dW!c1VLlYAX9lP`{!YKKJA70xZ&@ zq9+u`w-&B-@{T8sG}O>!7EqEoxv|tdUK?qiD`&Ls&QVB|J^Q|Ks-CWFu**|Agpk|r zb$}`MPo{^Dt=QZ;4!s(nT)b-Hhc~b7^=voSVq-hw!M_kOG`r4!XojuhHC){IHj?QD zNou0J=K*OmAd;8nUrTQkIO`ceuTj68S07q_r@7>#(btV8+(p)ArDl*vrAmCqj~$GP z)c5&v@SzYj&$6p&d)NDe>6TeAFrK-s!03h3{Dsb2C~?Bp(42es&zG?6!fZ4uf_SoS zVPhPQk!1jk2ds0`?ot5OMs8oGJ6OsjUg7pZ4<(vn(uvdFo=%Q>?gOa9Q}6ZWq4My~ zn>!=z>~;MCVG?V%7Dd!fm)n77llLYZ77LP*FU!SY#X;XL!yhN6l(9U$O|oB<|IQ1} zGe|Sly1^g=DgzUIISiV|l;oTWXgq!=W2YQM9!3Ivq->$P^yDhV2XVT2dwz+e!}xJrbBSgte}dbv-W@4-Q=q9$DchVGTxaAAMuj$o_l6yT?ZM%VsxvU4Nk6V=evV zXUV03#dos6+aA_r5WQ92giNqcR5QDs=!2&L$s6YZXQ<7I8)FBLdDhj8fk&YT%M=B4 zXzs{q5eLTAp4+2S0>nD^v(=qGxL%N;{aEc z+#t|fi+sAehR@ejnFIrwT$xX)v8E_xQ^HrrNrHRQ>Dzr|FXRj1*ocS-%^(1-SX%6Opx7FjKEHT*Wa$#SRz-Ni{*r zUC;~*s#H*K@SOmpSXg7tuuRcZ=Re5^ZH}=SXGIRZbM++FulxjTV zs`kCQEBE?xFD6eMWiF5)b||(MX#PHgWuna^h{w)P^r^s7%gzWUs8oguvb_-q=WOF-hMZ3kV(|h%^eUIyyD|23m^<@ z7w<>P_goz95a8+8M>c59;((xjcF!)Sp|LwY!x2BKQ$9B3(gOxW^)2B`?Q6&f=bMu# z)`5o-(EAb$!;7K8n1>MyqW~so~bok z#o5Ty=?W}$Y?|^9*rt+@^rCk#k-*)vM`4jd~4^52>fdtHx;wGwdt$c znu=I+?O%`!zunHO{)bw*yuM_cz$)G$lH1=6;qRJ|uPI!H^uS)A&tc7UlEF)NF$y1G z+#C7uiXB!86j(^%T-tybDz&&HJH-Mr>J|Ju#|8cCsD^Go*DfX0X!Ymb9(4-(`=u`q z+~>ZCEat#G=cQ&(U%_JG9B#veIiD!-H}j#CQW@w`W~2}Z^2OLXMC3Q)V_s@iN=Okf zD}(PYPUgs2ch8q+Gc?+5Ok;2i0F;%#pA>O{DUxL2J78e7?qY1`d5q4A-yBy(9EKl6}8)m7@b^0Rx5c4uptcy;YP zzrrR~5WWow=Fc&~kVqhDrkx0&7A6{;1B!0XqP77GDj1Fjlpy)Wcb&=pOrAsv3W2aN zYdpHbWUh*{=m{@Zo#nu*cT@pg6hAjefb-u@_kY({`FmogyOxcxRYN6E!ThyUmJRiL zECdr~i@5Ef`7dAxS9R#+EeufJRU-`;4zql8QB`OYT2YtJ!!sVehG%X439S@X?=gyP z&7AQV8+wD@e_W>*uwzAaZ)V)wCnO{cU#(ZY_(d-FQvhU zv2)~808Hg@f!xdTwp7#T=2Jmo_`muWOs_ILGo~v|hPe}cI@sgh#4g=SH75%H`!C?| zhFvf?bSt&M91a3*l~F&)0m}r}JxFuY6nBsmg`WwCAZy6sR5Bcs%BExSCG{7_NrjBT z4>sQuTy0U3GiL_uWjK>vjOhF@yEYiSh*K#3^y`|;JMzkd#1v4Bq;)9un5cW@i>z39 ziHk?Ex5bHxqPjy={4;NSF&H>8(x`wno<`YHV@4)zP?%+8)6@gixOGs={!cs>&m;YU57?- znJ^emWq@z;Q|U)gAcPFY9x-8^WyBSt}IxlifxrGU$QqvyZ4*@n;`{ z`5+B$^=0$%txF8~PPu1Jpf!(YUzYee2f-=V=u{^!dW+MZRBce4G}V%+JKV9NiY>aD|~irTL6 zJu?g)LrDswh|=8>L#ikxE#07Wqr?Fe5fKn+m5>yWmW}~LP>>L5=@tn=x_-y!d!O(9 zeh02={uwTIoxSh9?sc#ASYX)j)-y)J)SI+K_sC)z_=rU7;*MLL1jL5I<^{TY?y!aa zjE$-7UwGj-Zd7!^E+@LG$sEtJV0r~?5IFE);&o+Izd&*1u(*m*M{VsRp^hu@i}lUU zFP}!|*!kbpDbhwPeqV^RjSG#o^`F0Uy)|bv-O+XJB0-xVPE11-t*!TTRXe)9yHMos zu{lDp$owJlx_mqNAG+1DG~v}U(sykgPb8PbTf%We+0ULI6X1yZmzI~8<%k|19v*t{ z2i83?Ncjp>$s%tE+OJ=n5$*}OiQ3(^(VIH>4?TIY9)l1DyynYWYpd?iJbnhUCMgaC`rn^W5%z@!9J#E|0v;1LFU%(kw_AyWYf(aaht#2=+Ys#@!{ zKCu&$DLxZD3$o*on6gk*!u4~TKh!4?qpnQK{`xsZ7=QPc?U`d3*%992k(^%rtWPV4Uj{z8y4SUK60AL>T$gv z86v#F3fP4nb(#V&_jD7{B_$DqAxOwaWLoo$syM_^+o?p)!z&%Ikte?J3=P2r<0Hbyi+6drovaSv@3BV}1UU55V z+~@h1n?Z@f3*;1Xq&LHfSA<}($7T8}TRZCapqCf61W9zD6~k@z6C{4V^%ZiCW(gi~ z!ys5Q1S^0?RXGi!rl49U3wKJ!etDb+}%9CigLJ}eI;m@uWsxk5J zgVET{6&^KT$_FJBtKW!5NiA+>Kf(EJ~h-if``S2NKc~(6A zF*cYigPLjB{HEORznuD=7p>t7Q6LF25y9L;$2UY}J38a!&ypT68}>h+YYgy-bz`yQeKMW@=ZI3^ zs$P~&+S89vOzh1qIASh}m}%t1;KHzk&iJqxf*Jl$D@@5#E4am=)Pe4nPs3Z{e2%

    *Mz!}5AYvUZ(f4&Ih5#67K5I+(64)y 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 z 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%0DEgH?<_Z#Rz>>-`IyH?J0+3WCA1}&4O07LF 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 nVo4*${ln})!o69&R!UZFJVz5Jl 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

    frNzo0x>b0hSK3gE3!Ri^c#qD0 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

    =3Q}^0#pwwGFoSQiK9OeSEA(Pb($+MqrM=ek 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

    wdgx1AB-*}`Rf#W_iO7mz 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

    >-j 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

    R}D%MmJ|<1#(WD-etKi`>s~Ip61T%$A&a}- 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

    lxtP=ig+Po6CNP#_Zf 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

    Z5+D^*K_y>0L@u9vMFOhSd-{lh$65j7!>63r{ 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 z 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%0AwSZKT&OLUZnqr*%dKOyq{voP|#1StkU-tDy4 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

    _aE?wRp|Jf8kmd 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 p? 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

    Rd&X$GdOQ~!2jq= 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

    -6}5QW zZVwjiaB@W{aw(GUhw#A13PHb< zcHZ-|Vei?R$L0kub2gsnoB@h}3S=vVKv#U`6T$k-=i--qH_?RqC)PhKeVleK1w=NY z=s6}f?fWVs4!ml3oUXJfYWLDvNtr<>RPLOtJ*wcn%R*~SrZbLWPAkDZdfrl-xjc&> z6VTueQp`3n4QyVbi0!k9z5PEUdw)Mukx3V zFU801Z-tKz&9cvQ=_gV#hpbKyzk)ymG*E?}6KtBHbUZa+MqOrBGJCWMN?n^;E^Bi5 zHof%iOqh=5$w(f!M`Y*sTnILgP6xa=638Qsvg%^Qvx}7k>S`aW;Fvx8nAi$UC_0NOv`;o(W9KvTvY;*4VnVgn;T(|LZqjBLE}=VLdP{-UyYLPpA8B*} zVhjf$9fQgg1QglX|5Kw#{ofiz4fu!$%van~32_N*?9G&y(lfI$v9YkT6*{@4R1^jH zdIo*3V`pWEakLArAyHVHh%imXmOUkdlDG>hWK+fH3CC7{&})kEk}lvV_~fQ9aMl$$ zkuqVCx4c;^iow@=#RxD{ncMq!m)Ggu<~2<) zc}}AD5b>KNkA=2wjE9ESY)=A0dDd^leq!iXX)!Pt%a4$St-Ru#3?F#QohgJZhzkc6 zNNg7|&u!a%A++kO$?-WTufBDLvI79p`)LTpgWaw31NF$J>PFJY<4%uBoXww`P^+u0 z%*a80|H;7wC#)Kc6Ja64>g1F@Zckp0DMRaS?NEmC(_AL2X{3d%pH45+KW7dWjPtp@Rf-CR3ntl&!*=XGatjP+T1xkOes;1iyIRR1&m_jr2aAZVa&h03fWulE4G6 z! ze8>+rH2$JZk8n2LoSltuK5!8cQ<@2r>eV#QVSZ#jy>VOSrxbXNHd5dyppAwf_I>b2zm)u*g|8%tW52B7l|N=&8$* zjY0+rB)1#qrR$guW>ZpwpH^{HMvkFoevxi)VY66cFK&!ZqBikl;+Wg(k3e&T?Sind z%l^Y&fobz%Bo>5t@%k*uuPI|ZQYtW?&Y2fus#;9G{S$hSA_2`OVA~#PoU`lGtME}j zvFvy=56+lx*E^Wo#{9TYDbpILBZ(-{s3E`FDnwLJVC@lD(KXP>nLYc7-i89(O#l%V zA_mgXsb(*GGWpAO2x>GYAioP77;k<@%#?+#XUaOgX?krlWzWB;vz%ZX9`abrUhlg2 zHcCU&x+JeqoUFQ1vo;8^SaJFDpR6ItpO2Q$QgoyilOl12%^LHpY@) zsnKy^)B#cq`ZGGJKNW{fyqeZ*$nO362Qn_$j7LQ}^5lYTEtRx>IO1CVQTx}VZNm_+B>~28-~u@_vf$G;F`40>kUv^S1A9Urtw?#BgCk17{0f;!O6O@{q?lkGs{-to+t7MtRHjWkDQ2n=W$OL zy=;2bQ>@>YJMt=8!1m#1<2@2T@x!Q6mw5YHV?wpaJDbfhDtBRdn6Xkz=d|R7&>=(HOz7oUw@k?$~&KsK3 z53aKhyeklfMP8C*p2hXjys$~fdjk6O>=x3}?`-tcwv}9v6W4`PfhY(Kq?y;stDzh; z>Y_$pQQCvRIvv=wed>k+i~{J!-6odxACrr!H)L?_ku;=UEC7>-GReZhriculGwSN^?Kex51HX?w1U#{43TB~y<+16E>u}g!kItiV#()6W= zDn*(eCQN?za)cucHAc6Ol81+)8ABNX5>Xrg7a70+>zFgk@yy{uN%c*lDmjYdo5+wGr3T_B@lE55Mae+k>Go@BqsHrv1`nJfv$8HRJC-n|XSVd1;fY ze@J^=PbZ!6*^eUM%6eVjw09J2q~hp~`XA>=?@M z1=>J{4S1s(04<=4;i2`tW|Q~9>5gdeC3&9eGurQ6GZlz-lEdvplAav}=|7|WzpZqD ztK@&YY4oSMZWF4be={$dmp3%hE3F^!GU|FoQDKT@IlW5SWrg>V1-T5TRoEhTB7(%q z+)+wy@*>CnUj6ZldCU`bh)-6uxsVnR5PzR}i%7oo1yQT!@$2+8!-poDwlsMz`PYO^ zlPy9-kg}K%2mqE#{%5czC$&EY2B@dDa5cipsarD-gltf2a3m|*ihS{}<6NUfE_BZi z=ZsE}s>;wd9e3gu-tXHtG`LGVIO+X?!(fIVh3+E&h#+30r#}Upxutdjqw0@eqQtWw zADV57SH|HL5keT4+Np6d+x~$U{cGYPF0Hd)v75nv z)xn4Ok%%njd;ED@GTRSFJbv5zZ6S}&f41Nm1ac=fz1`_^JKZ>>VI4)`R2NEfSJ6MM zfPB+?&g}WUIU>^-Yq^FMr{Kf{*jJbHV(fOZ-ToI{@}kwxFw7)!;kiLJ6(?90t$dH7kJjt_v2G4vpFLb`(K~06*^s4%q2MpK!PfWU9U^MZ z@@$Y!_SwF5D)M^|<9o4nQVP#0ZZe#Gtf`xyX-eXXX2&o+&n;Fh#LL7C-^`mliL}rW zM4hsq4$V-)i`}T60k!|=#Dmerfi_WiA_NL}Q6!MKMO1vNQ&wjgxOB2RsB=hxz%UBa z?U+3&Z@%DKFR~kE#F<#t%5>C=F82#K;kKkh zi>}h^9J@80KMi+DWYxG?>+ihV|I?2I@}PXXjfu&xIH-9TxDaHYqX3#wYrAt|G+fu} zEhR}_zgtrI`q#t!9N@JC9@eMV9zHkxvCVdE`nXWK7A&s4VB3ZT7}SBZ)d0E=4gc|^ zffvn$knox09{g%3P9KgEE4K3$!&}Zjg0&Xp$);V^#+XYwr8>zX&91VCx;%1$`8%WQ@|}~M{}7+VC!EKM`w@0nG51Du=ui&QXH3zr9>}(U2LVvUOr>`C z-BnmFif_;3UV19+w4gnGTf~nk_!o(njVmYti2r)*|Nk-O!~;LpIKKYu(3*~TI5Yky zA{IB{!$NL^U*$=y*#^#$^Zl-9)AF}yy?s+3yF*%{u{oz9;*>x$(7qc&?cin!_>YUQBFU7@zEg;ZJ$5MOxBod)=PuXl z#J-Z?^XEn8>Z-3-Cft+wP9X`3Ql%NOuZ3>^7U2rd4{@FFhyk40pgn3D%uHz9w`=#{ zk2vEcxs}-*%eIe=6duW~Edk{13u0`U=q@iz5>{yqz^-srjMW5Ftm8+X1JWOJayUY}6wH(afb5rg< zPo5cj{_L4iLszcTuuhWFB;zofxgfz<8a z0SHf*xve@0vt$d)m>VMG_nnYQ_1lieQ=0L=GL8*R?! z@*it|ywXYEQFnzP2 zpmt)qd3AxbX5w`Kf)2=LYRj~p$@Yr5H{SR$F;k#+i@`3h3;vq(d+=}hMsFgL7XZ@W zgZ>@U?&rqQ`6rnza*|PTN>zYLdk>AcdR7n3d>h_?3LD5jdX`DF2OsjQ4olysDT#MH zj&&N<2Ck-rK=R`i=2mTk*5T2vL++~ZcMRSSU`?LBPq^^VsoDGN_+oCNPuJ`K1FvEV zRbFXW%KH5KTIixDLH?f%B$#j6%wC3KL0W|kLuVu*2X&yv>oWaTvfFU{%Er52c9N#P zAFH+oGr6kX0c!8dr`Ey)@{ta2F0f-y|1RV+G~z|MNed*`9#rR+>84Ple?>Rse@RVr zD1Ts2m1;#j=bEn;#{|*Qe2xBYCIKa|9gX#?*;{suw{TDs%h0e`c-;9w?oK1wuShbN zhOFEiG@ZN>y;SfP!Q3gbVGb%9?-gUJWInOO@!uUVSZ7L7XqZ0CA60iWg^897-Y>;( zrE2t-Q&LiT3AL$F$fm@{wufTFzvYB4Yu?aiOmL!kUK~wCdgMkkd|ov3^?F=<(U3o{ zq;JWGbc+F;7UmP{1a+_E{q&bO$|?wJ_sTnLT8%|7_SkU zL$8z}z`Y+F=y=Iu3UbUn@JI$nMn(dW+b+h{)h|l2G26Uh+q8)h`LPZP}AF$Y1_Nl zX_Zpj{Pu6_9@>hRTUr~Q?}+)4pDzXuz}C8_(kgg`J^kz)`=wfL8e?--`)Ze4YITcV ziia>06}?jLzybZvlr68FI@WIDF5CyE#Jw3-$#dL(cZ4%nz)29MS`b7RU;uLeUwP)6LXKPx!w&M?z{JtWu`(H8*5TX)KR3}-Ou9$nOvA&1VJ0}m% zeFrL;F%%}$ewA1d#pHvMUZ7DO0fip_q2=X#V^fqeh-YKBKVlC#N5^IGk*V+w%#p6`vy(PM%dVgFH^YL)+0{p^q%boSIw5^^pA*pQinWi!U(-;kpY z#=%l34Kolb1vW)M>`2d^I-Q!%!~C@UKi|iefH;@~>$be3H(5Le&uXzH*TBr>2^kA6 zNaOwf=G-nXyR7sooiElmxg=gt3|$fro6DwowtyVS6%Bv%H6hA^k`|4oS7V=lv*6c3#xC(V(w2! z-_SAQH~O7FYN$sJJ~C}ogcbH&(k|IMYxt&Og^1nXPu(vU5HExXk?!c3$->d5gVa`fb61 zf`LviExvKFKs>VR9e-+gDEgI;aj$_O$}oU|4Im)f)0QK`QKSTkvWmj9+k@@eO^#p2 zOpol#@PIoQZo}~m)KUugl8|s7FFSu(_)SMw=85kPA6bDyE}+pxj&{+Z5dWJAWPn#C zJDtkhp-Fq5QuFsk){)zNP!;H>s-IbFI7VSL|4s-U!a3_lnqt?W)hgZMb$Gb*DkPB; zq{cHPw_x}&Er+NyB-Ck{=Ghoo(g-pGxHHAwXzXf>YihefAln{M6du~VRl27>5!+%i zTh{t<`lSe)%!8n+5SBW#D`iMJAyhKmoo84wmS`ib^Y)>k6j;caLrRfhSA<%@eFpqa`KVV^-Lk=k(ghP0 zdeYu7{nIX1bP0Y^E4?gE9o5a83oa8fEjyU8qiy3m;*L|K4QlGh+-gFBXKb$Bl0EOG zU~Xw_W8vo>rg5W|9F<(JRpU}pQkrS4wasN4ZO{}f+^iBjsZ7m35C#dYaDNkPC1;J^ ziRu5&&LxwtkYJRo@l|H5j_-8}zA2GK{sgV(oi0`kH?9F2bu34ZZvkmFS3Kn9rx$!x zZ-ZC6s_q0BtiZB@~j=Vff+&Y{rVRq|A8 z|9vq&^5u{``-nNaaBUnL+4oMd;GLjMzQ`0z3JlP|)R5oejeCshTBA3Q1ufrc8X-r?LG+)(q=rGgup~MwDagh* zN9-0Q2NL1QNUvGoGf+X<9C&_X=rE`!!VZY$eckyEjE1q1LLFWJisPw->j-TwZ48j> zJ0RPaAm0+CY_21S4*oDmf?_fO6NGR8>j5tyD&U0lL?HJnza*Ud!IF369Y+OSI9UE_ zf`K8sd{<5dsh@*?`<9pT4i2FKE=QW|I~`$2j2IGh{k@jo>*}nD8-vuyTlY5ne>>HUTKaY8hjLxBr%*MzMsnBy%Gf+%>OBP~!v zlRSS4CToTOu;CIR%HL;|ZSbZCZgv`5Q?EqL(&cGBp+b>qo4SPBtZ%}+aBS`z&UOg^ zEy6?HmE@EgGk^@VucKrwW~C!hy?O2)0lx`>-b6nKlKlWry=J1P6=8WmBUU+#+}D~0 zgkwF%N2q`+^Mvb3DQH>kU(mAxZo~tIOsgIZv5~+;Hr&;qU@|><`fw|!QlUqh(EM)G=kdbFB_pnM z%llJ@nTz1u(OZ+B1k|-@XV+#3@R~}G9^8T9`K`uGnXPF|*&bf+9gTC<5prcdW{d^b zrp#c+Md^pyRl%=e$;g_KoqdX{4XGbw|GX52Q5=*ozy)1?`$DUOs1))eKmvj&4`dHR z2uViijlXabz-6NX2oqg@O&Se$JpXEtr#*|VTsdMw#M>N8d?%70+W#QQQ;c-dHu3&k$sM}%|H&%aiUdgf; zMna-G&>G2 zKv(7Q>*J9xGojjCIyt>q=#&jbRl|%v8xd%&u2EaQ+%?foCJb92NgGCHKt@oVxpQrI zuCRV_1puXR*%c<8ts_`lX%UC8Zh>YTFcf^#ZE#o5qI=+{o?*L}*FKaPopiLj1e9e7 zHA$~u+^-*G_P6QJ=;=GPT&o@E&hgK)wDd1o4SNlCE9dojpiwC#tH)439ZL5kD&NrN z`RplD5XbP9BC}w=mizKO&NoE5IKhWRAQgRSH(q63Subtoq=o9R%v?wFc>LT2kwu{u z;B(sk1~69qG)fL8d_Idao*FsfI-0=FzvFD6)}ZLt2OB0sR^XuQOC>DaPvN}XRX_}i z-*)CF1o$qe(oj+8#&(=hdn=YCIgx5AWhCDXYDM-Lv$7M$`zwNOb?BeerlQ_+<)jwb zQrVP~c{}W!B$;?hM6pvQnWr&XB@RZCB_I){w49<`+NBLDUF$4EP8#tVb5Ne?=3D$ zGC>7Em06vKRLQ^Y0O1E_yIZQLnvNZWxT~n|*lCSc>M;Sf zB?lW@`INp+v40#gL7*d1}EA2OLu~V2)@%9I97>=WW$%T2Vpw* zyIad;zYppm08+$_gPs9xo#4(#0wOA6q6c7l`$9(fPsUdS-Mhq!0YF3)Eeq~5vLqy# z2*Bw?0miIB;mUa!&c}X5Z%ZHhgBD!6_3NjfQ#0Hxgfw^MVo_JOQ&}kt(2GRlT?i$y zGb6F!dByBR;f{V_wyE-FaOdDT8qBp?q^xyJltlcsXO*eLj3rZH9TXt&?9XZCy z!Knbh0PzRiRrzcU%`nAsy$ zGe{=I4*|+PBInbBUd;{_-Ak=AvssC?e++5U#>gI|oM^(3H>r0^se`z$L1#Tg|3`(A z!~36t&J(+%4lG*`X+@P&TYFH`QZi6e)AMj29nF1q^>8mp&P^HS7uY&kDg4ez4?1Vk zFmtw`J8d$yF9&HI&uOGp=G z@ZXV-X|#|xH}??}otc@y7*kwugI&bG6U4_ju_2zaXVrY<0G!@N`{T z+}A7coceCweOKO#TMb?iTyTP9y?}jW3FJz&YJ*CTNh9Ku&xKpc5PAJ8re5iP1n}vp!Y?~(C&z81VN56%s^Qmr2ijkPb)mtL^^F{LPzshNA&8c~; z=x6EGttB;xpl%`9-yOKr`i%qwpikYpg~VsvlaA~5Uta64(CYTpmYLA4Pq%>2DiPY zw#WBV8I3$hXE#|l@^kvFva-AgpcTd@+QEd2U4#4;+z$W{&46Q`;&W4jN;dX_rCc*p zf`jKR=S<(TA)w>%VDq-D`Qeva3)9!CI@QKoe`Oy$K-r*9X|GI4CTKX;?O z;V`=#G-YSw1}!I$)igbOKJUsN@j4R^<1>Yt%xNut(ADLSx44_rbTq~N`duFBrd!js zW#;MNb)5 zWydB2;VwWtA@A$l`=QLCCW`e>mDCYS`rPkmwaRr`n<-CB$!+(vUp)rmAC>CWdsrDR zpRD%ElVYvw<+BIpf0r3Cl%Jz1=Yd)Nq8Zp|WX$a22*>nAHwz77?0TM5HMG8&F6G5`_@2s*{3^m0Nnn)#|}=^zS{3YrT9uc`#q zb{)TJyn8N4NQ?76IMSHw$%AH&~z8?({O6#5OBLV+!3{ZLaS)3Y>De^$Z_BxWIzb{j3)h#<9{R>%7x zrs^JQioeGs70nNHpar@pd8f<1BW{~RF$XUTDn&#z*+VNj%XXJ&`Utj3$Rc3Py>XE7n^i&X}UH>rpLu?E|+W7<8eVYG4Am@ zQ{8uh=pf+h^7sl+5XJNWp#KV#{~Sl%dR*81Q1mQ!ThD?TBNafk-JO}E#+Dno{#{|z zE9NVs!?SC@*=+~mvnopm{|H?=S1oJ1GQ-ClL2cCfITK$9Tm(ZpBp%?k2T~zmSDv^| zRzmEkr{eS6VXH~>HDYlYC1O*o<(~}$(j_E%)dVm-|F4m=T4Xvab;?CQM+|S~w)In8 z+ERo=s(`2UE(*i;g>|WQi%>rPR&5KTIt$sIK1(dFM*XkQzwP?RcF)ooYKvZ6)A-7XxfB$gM z@!pqUG2$jf!WJ*g^y;dE<<|FY8JFM#D|UKfqsQ#wFu70-Gy;)1LL!2-2j=xg=D;oX zq|I0vEXBb>eCb~xvWR?{_Mbb*@>JEq^%-@YUK#z??T3xxYNLyZ(UUSDCn2$LAx_J0t63bUzofgso3%Nh; zJ6fQsPo*+nL0@@dDgDfn#R7@Ut}a~PwH|jv){5%y>mWU$jos6}iEv1-{z!&AH7fog zWP`N&5`LxP*ny06p0$N$Pv*d`!#&N8jrw}`i`zH89-Rj(htAb>TT;!8eqAmKH>^5RG`*jG7ZN-9+u|St=zQUrI^BYZ_jPaB zKb_N{e>+#$7mplva1nuCFY~*!%^@t}*FGx}{H_{aNUAXRbITV{K=lf@ZzJ{-B;AVhqiJaJb&fp}|Jblw+pWEe9 zGyD7SMKjB>#X%Bl4b#NZ-w1N;6vR>6Xq?SBa(GBRoPOaSEZyf?74j9*9*BXEK|{e_ zQ0kKw;6!YLNP#6#%SD}qc%yba$9RK;+xg~r)b>ul`Kgb`!Gg~&>$GB&XH_J|C_+O~ z-aI*5fNk8)r_=i(qa|wTr>a?qpGv=|QSi~wZ7Az~$?VEN#Q6A&9L)hg+Yx7kliB3Q zDHht~4a3hk)(pNsE;=@}WD|@bEClMmzHdkk1c=QsDaQbs>`1*XqHCzUgAiU(6cD!t zAg!1K#u{|67_6=$qmyMM`aG61l}LKMSK6CUaDnXWITGHtDoM=ftGyEeGOWd3NG=!> zpo2ULFasE5(z#-|WaaC+sQ%*U>1`$}fImU#z(qdCH+76VAx}=+tiSgyq4Duf?WjF- ziH~}#QV@%T?DAZMwmhwYf)hhjWJSdr8R^PFR(a~VyBbP;b4u4=`Nq6Z3hCD~;nc=a7Lg7skT4lZqfH$oV`x0p!?Y2B zS=LGs*&_wgo6FMi3!;;Mm*H?F%HvF}#oDjOt{J2!!yJ|I6OkwVQXW?#RIfuxY4whu zGbVqB4fFQlArnj|z_Qx*U?gXBVdC}2ynKyo#4wo27qT3Qh}jzl0-A|F5YGjE5x`8; zpBn^>+Q`{nt`7|>tupnJ`kX3w{7p)v_>uJ7Ka=m$b!{m#qdr9AI^=mKP7miSb?4n( z)%n`eWz*kP-tRrKI)A*Py}S_0-%Hg0Z4f$Y;BAAfyun%}1%s6Q>tbrl56gouDT=4C zSgPhEG4|8C;C{c7;7_eI$cul^CUlQ{#+%X2Fodqge4@mEcV2v!St3{}7hMM9di>>9 ze|4e%uoQT*>7+lt>U5Pj;z3@Expma8R2R`ItjWhH=AKF_HEf7(fl5c(z0DpRSr{pm zYY`uEOmZ^LG{w=9s_`Ona=xGc4>oL)v z=7&Rks!$we^!>cXnzH$_p+ALxOi zd-vLFt*0#}#&`FAxx9?{&v~P=dItB-9ti+(isUj!uhOBdp1!b{xOcSw-C?+xBh>Ef zFO>#2)0FGN#wTg^&(6;e0>~9Y?#UO2D~2eZLB_4`c;^D9>o_@YgeBW5+CjHZn)d(R zB>z$m)_blst^Lul*W#T*?hzE0mZum{ty^k?-Ny;h^JlhP2R$v20k05=RM5LnhO9Yu z7XH`oYgfWy&gQ?!R9M@Vk?U%F;#m=gla24<@aY@tK3zPSnq^w?t0(I?u2(bb-rGl| z`n2mNjdxa24Ealze$V6x^F4nb^g+STyu%w|AA=u%eo80;wZ#IEnl8v6RQj?C6N&lV zULU^nZO%(l@e+Q8Szr^z>X}{`sV3zjk*SnIqlFYh^wWQZJOA^a4~Q%ddVkJYE-(7H zcTB%?XX&;2hI-34^X_zcxMIIVntb?9tgs(55%BW<&m4|5NL_5yc)5}Ez9)Oc>W5;4 z=Xm0!jaLTOUZ=+oIBgGOyqS*)_LW8R(wHVGAK7O_cbP>B$Pj{&L{I@(0FG0HuK)xB zuzg?YcqF4BZZgl6@3yaL+C!3%6Q$q$$d)<5-JD>oA#Aqcm9V=y?q_a$vJqj9Ru~+j zC?TN&{MX|KEBc>;2)Mp2ov5nw&6@ zz;3#CZEk|#Ke(IUe(txbyeRz%2s%|s5yyV*-e<(ObYjxK-_j+sEGy#f$w3T80uqV( zK!h{E6d%jjpSTwb8AdR~cOWg-9+49AZLypD{74;X!|r{jbQL?9D1R*&)1&2*rP>es>H`fUnG zc#?A7PM5$V(`ZevYv=ESD;q9kox^{AX1@QbH1hl`Zs%+Bm_C0uTq5@wfdf~VQyIlO zk&{dG+HWaBoRm&d?wT*OU%iny)?EDfmZ@I;_~2Trid)XFy48Mkm1S?@lT$6|e~l7- zUjI*VXoF0>C)!?i6x_VGPaB?KorwaEPzWv}Zlr=PPj6(zrwOVi81 z84w;Vr{=-Q(yB4E2zV1xr)Pl2V zj#n3FTPvm~Yfk!r!Stbo!~-bCnJ({w0cH-R^OZNviK{JvLEcGR;Lo2L81!QmSje8{ z2frX>t53=So(#@V01*oVGgaFF>lE&MiAe?mq@p7BkTRkXkSSB41NixYABft;kWCFW z%ngGn*2BLB(0~1sB^+R&uO1vMrGy0ZRKGe6R61-?Sx8X2Hox1HRw`~$i6Vqu&NzlT za4q&Y^!H|dQC5%j86GPb#89%~=uS;Muir zb<*Kv@p2P0${Yl!*#WW{-pSyEY2#go$=J9rn4DJLy}$PYNMCw=J!FJfJPKZ@Sx@~g zy8Ifioq*|=D+p3@76nLvYjPz-x58TA&g0Dpf-Xyi%dUr9K>yp}Pih`Q>b%{MNj;u= z+tgh&1pOWQ2JaALD43q5-gy;LnZii%QNKXq|B&l#@-&b1uPckWvFN|Y#6yaL!U0A- zH&=wg?E> z0uB~)5r_d$ayTJ_F4&n{_BBbL3l;{=SQ;th*AanJNFHlGzf-Sn>pr%_1)pruid>&E-~9ej<(5KGevpJ{V3o4 zW5Sdh(jlSSHB%sOH?myKr>16oa8WQU^1l;OD0uh+fERib_yVzN9g`rfSgaAStOoo~ z5k3n~+sW>8mL=EQK&vp4tEkb3qbJ>)F3*&-U?|9923wz{(kK~{rI^}yx#~DU|AKXZ zIKAR!du)AoO}**{6O>N!GNE3ZO4bZF{0ADqoUg{u_3yt?4n2h<{RVS&X0v5KvhHDx zf(08CxbJIvPV>RV<@FQKS8Q#KOwNU=4^WKrb_lu7V>ekUH1{xoMG0_F4ej9PY0;}t zdOS{U>{WZ~ed&;|yh7P+Ob{-=WS!RH#`#BexgE}{h&D@Y0VA1Qc_aGsAUlx=-_hXoG-M3c<94pkleg$yk9~} z+Vq0G-!0MS?nCCX<=dYx z)QyT9xe%Wgw}>%J%C{ovf55?rs^%WenW2vCal<{>$tC#}+gf9jOEbZd4gOYxZ#n25 zk#|!luAeuDdS?c}0n!fb!$JmF5kjJG(x!H!sde*+Riq7{}$~vtq5;6_qoN4Oy9rQRj zvZ$K+YwD|h1ay2Jv751E^z7V$2-#9#2C>A)zRk`Q`2`0khJ|oeII8f$3LgOzIXEB- zg6hJAxVyx{?Lci1Ne~J?RmViygqgn(vfu|2=s+wWh`~!8sgE)l14zZ=g9aGoWt&3T z8GURhHiU0|98PiNw*FNpIlZ0^9y;S^&sxmQ{^Yf}DgJ_wU!Qui*jX|$lcP7r$#*+} z2?(lZ+LsHeF6e#dW4IoPH;I}0V=jDL9T<Vd`H zj6!5=gerTkdk&i$0OfI@a!@C6eq2ytjr6{0tKW1REs$V3C^U z+WFJF1`E!Pnt{{?L&C2A)ouWQ3H=vWQ{7lwvgkEMPnH7|E$!9DDx=?;=l2Jiw~xe< zC$FdT_vs8@Bc0M^7uTkCuM+eGCR=(V5&}?2BiyJi2s*huR!+6Id;XxA(+4;>2gwcG zoO1Dl^1?+@Bho>OXHCduj9 zBdY4T7&?z6GM)+w7ks?13zQ-TgTJ*!>DH>V)!7RueK%*vtiUX2hDWhMgtYH~gOTr| zUstCVgD|cjKbtGe>fLtnSNXSvRai(v$%5{tc1{ z0fMW25T>2Zc4#;k|KP3OFNb5I2reIkm%YY1jyDQM427qkPXKfnsNm&s-@K#u$CaC) zK<1RxTnpEq_Ywf%f*okN9^&9yfxwWQO8^}tlLUh5nu92nw|D*bmR+jE#}2=Q7KaY! zu~w(Q&G!G%U>=vb$2zW^4v<6`A=Vqbi+yP6^)q-yuiSN^IP7$Ny?cIt_KfEW(Z6Uc zgBH*ditwT@^U$2z=P!et>Jl<;!P<*#viD;aGcJVP`<^wp)>hMb%QD|2C>q^6^dw}%?4uB9+O84zhO{0sY$C!=btmp;e=4CZ1=_=vTpXR#U}luRWWghCl}ZGbk}VDoGP^X~3?1_Q?@ z(lePtLz@+@5zo&ZEY~+U3Rv~;sRxLun51K(PGi$z`e?%;l%bPXY_BV>1<`9 zC6V4+@%Y&*DlKGV9@?Mc0{auOj4?a}R|Zl~ra+NhI%Ii&S7}+P>$p6sWXN)L$mZhI z+}eKC+PnW|Ki~a_X07WfurcfB+y0N3?|OL>^m8htE=9z|Nl^+D3{c}?(g<8xrikmr z1(Ia$rlc0eS04iFGN!O#fU-TU=J5+Ryf`)`DPXW9f(^iqvb-WSUlAz-Z+4=DRefaY zQ;<>njR*AUK!`C2M1X=6e!)E8Os*)M3-!S1jeJoExT!v30>LDkI4We(a7LgDMKF+9 zc?bX)?T{RQ;M0o@ub+{K7n=`bc%WwnKEVNVrtQ^1I4wt1K8C$d8juI@9 zlp3J2ofzFNGrLaT>HX4k#tY{`-gAnbkQdng+_JyJa`n-(ypyJU%q`(;VOL{+v~>jvr%T>zuf=Ef1>INhhXo%aprMkF`Qg55#{(z)fn3Bc`>G6c&J z0Z_QX|KY9{d0-&!-(@{^PPyLOX3pNC`wh?FK7q!GM?1yK&>^_V-G@Wf+Px0{;_S6X zg6|7}J(&z8JTI?5WWC+jV5K9i$9-F}Ry(~Rd_5)fRK;~X<*ksPC*0e#Bz2xDC|HHH zEcEdvd=Mh)!(1D?C$RKVw~(wZPFs9q;9Vy8{b-+_TNm@`7VWzG{OO{3A=ROs@bW3O z7BTRS2!G7=sYGy2?{3j34yFqg6gJ)z926;6U%#jnyE7+*WT?0d1q~N( zjR4P!jQ)SlhrYi5r$e+u?hDoU4@u|Ix zN-7s-#X%Rwy*{1Omv0(pG32j84)zk|s6B(50Hyk|y8cau(Z}^77T~{8z6|Al>DS=A z<;DFUsa*=B)uUIuPSsxG7XtlO?5kQ;i23VX?v&M|+&J?NCTfgPh2t*xPD?Ur?P|I8 z)t{@kRp8Usqe~l8UiHStIvw8mbjK9Cx8C*wG^Ml*bThWB42t0GNu1vYpp@?4DxwyA zqJ_nH8Wn|XT6Ig@As62wmq*$m<;5-eSeJ2^cT#GFr=Vi_{5&MH>ATJi`uowPrxnYHMW?f6{UZk?~8z45X1kwL735Tj@ zqNRg$H*&0qG+8EZ=SXk5M#9BN-7oIt1h++JK!loS#?0Ngm5wb&f~X_ozLnbQX=96z zF-~vddjZk~&{Rtyh5Jru1?646Bbob#jxDjRXp@2I`$Wi?@`c2awq4!xV$*DNef_0u z?*F-hicY}j0NN)+Ln-zEbJ~i;L8<(42`dNaM6yUXTfff7%1v%~SO!a0T;wq4aBBG^ z46rS~Nig~|Z{dDiedJcSAj)&lARAID=Ab8`-wyTr{pabI?dBgz%b9pPCGwWJi{aMA zBcxd32{!oFb0r7!HJyGK{zBFz1=4Uu(iF7Ra|wkrKk)`U_)OX|Al7>zFHLz_xuB1( z5UT3}9w;1uOF&sb^ltkAUwt75fcX((@fGwS13L^bXT?tkuqtLj?LY%Ga~3Idz@Uyh zJCq07UQ03>5R6o?`7x?FL>n+rhX^`C@c^kV%|`$iax3vqU}fN{c(s(x5G?&9jFXtj zb?`Kv!|LOzo2(K%&i*}(PV%ZC=bNas0wnXXqLjPw(lPwksF81Qsl=D!0VbgXU<1O7scbj^eR>=UIAk?U0LfV9#EOSP8S%dw|E+|k z-@P)=Hr05VcGZMtAns|Yp5J8GxEL_?6y|}}Pn5A26NO+oc#*$A#@x-4U-o|^_aAM- z4s-;pm0ecY=d^Fwg4myLpu)KwY<66z7{b1OG$3?DI(Z6se-9OL!%#3dJwjdA)~q*& zA}B|-oQs@cI*Ot!V%8iF70N%Rp`7I)YjTwpOf~EMc!Qr=vO+@Z()@CSKHEpD*Z|gq zOB`?!frUm!h1wKh52gUpXkSBCqm(bNnl(37p5j_D^386o!4S{Z@eNzgp}BO#B9HBT z&{4Q3yr_f?E;QVrDdeof_<<6Q)v?-}w0pGlpJQhW?8VCs^YOG(NkAP(r122FaKC$m z0&%jO0LywWXnjQ#!e3n@Ho&nuB<$pI^tq-cwd&;VqHL+0m&iNQrVcdu6+hg}Z#b!t z-~RB!OZndOMf=aZf0xRe_?9&SFKz<4_Q*iKxY2A*3&?;KG$k604iQ({I5weXf~6oC zzfIs}jv-FQ=;=C$UhxH;Z~68YZ)fo>xX)lIz@dR5-}_0)hRvfo-}d~GCV2!>?F+!0V#gL*GL58Ugb1$pYFR(k@{Ue z_SmYg#l9{tXsb;F(6gPAPV`ahOup)?OO)zzLhUF##kZfNM-JUY5&dI8`^%Wc=4h)JV9^peNh>z)Rmj*{-Ha5vX8TxY$C~py-ZZ- z_CWHU@I5Ft*;m!HnE{1gJ}_1Kgd(ct@I^D4Drm$mg2E(Y6w*g#)4B?d!$H1$hwSJn z8t|bq zAubPBQeJ+3 zzOvhYWgdaHxsQ*J%zylXf`TFiIgFJU>^Ihhf|bfcNrK&gK>N25H3v%^#UW7I25;FA7d-x-B8(<=W8?(KmG%pDN>hJ8B77AVMfUKWQTNwXMm{JM;JbG8+ETDsgjchUI03&3AEio-ydhD?~729S9Z<$TN6z zI>Qj7lWl;jBx`@!_(KtvNPCA#)z6h_0un$DGqEgrM;io!37o-s!J?`@N3~(Hx{H<^ zwZdNpm2jlE%_r5S*hMo&TbQ-$#fee<7|Tuu@^T_pfH`o9_}3aTyF!_8MEaT}r(M(i|AlE5O5zZfaWn&XDAHnBGl0PS6ue6sTZZR1$DD_DeS%Fnq#4;=c7l9SOaNw`_b zRMXVn+{0I=AqB{1UtBiRC!#!8PrlH-eUkrHBJ5h-!{Xmb@6MK^ZX7U4;7e{QH1O>L zE`K~#!Igr#hQg{?){%W8^4&IvpR4TYs{vjc`XwG~YFG7NOWQgW<|1n#9w4@Vi?qy1 zMWixQ&~zcmem5nd(D**9;Vj@A%%niBqYDvORbyyhLkmW?sn;sDCDI&AHTkx%$$x5& z+ZS=(>8Af2EtvdP6SU__`dm9}kbNC!m_*BWT9`nrhCM5@kRi3JYf`NDl^wT6Y<|~l z#pit0(wI>+@=Tg%E#*@&IUI-3Z>xZ1p@uJi*%{cUN~LOlSTH~}fB$H$f~1Way+AjQ zluW-16_2qO0lU3dvgfufhVN%ZQ_`4s9~f$7qIQ3&Mfk z0ifB97}rnS6xxgDIkj8JbY9Tp6A+6f6f^4#ca9XNK13(#ID8+}z~vRqBX{>5R*q@S zNK`qjm8s>_`|0^mIHL6@_guF$s>6IxFO!uW`|F9p&5eMX6Z>_0xRw#JR!npXYSuUA zV(Qp4!FP%*RBZ8T+m&HiiTXAd ztFXq-r_}rzF4LGD29h%Vbp_vXIx= zZZttsFI0!r`tRJ_poIp+ZhsEU(M+% z<&gg>pcgu2?rFiYUsycN=$fNef+C`Ar@uq5$B3mClz%3m_Vv@>fFrSgRF2{Xcw~F0 zM$s7uEPvUHf>Mk3uKgN!KG~PGv{Szu_>ws@&<%GMgL@b{`P_$VKI?>ry!-d`e|D8%tiSDhly*DIMbm%2Y+cc=%DB{YgkG!8Sf6&Ka=)jh5ZzqrRiyg9yCcxX zcjn)(hW0)S*Ee<>xo%kv?Yta~XAkY?3M|>5i>W?~9pt6qhdN*stjPJ|Dk)|s(pHLp zl}m{+Px+yEqj2ZUPXCRHUP(5)_<+`LI^1!B?HV|r)==a^vPse?p$XEbzgx7|BU zle)5Qru>IgPTp)clIzVGTcIQir(5aoicvwW4SS#A;)I6QdxQy2C6d_d@p zx!~CquOq2DdtDL0`Z?yeYB7?qJNn$sOgMhoOsuH9pSfqUE=o|X6o`tyCZ*W4R#jce zR%U(%u0m|1_i`%F4txL;Guo+J$ccE+(2Ljk;`xU6TwCVkusPix&11_O_eo~CY3>9r zeCiW7`@&IwzJm?43TGJDjTQ_=ih{pM2+8Q>x3@^)H-t42+O@tD+EK9GkXBF5E`TdG zLTV}KH9~%veYt&Sxqj?Yt31u+$E%%dybeqg-SD|uB*q_mk-46#F$1A@W-S4{yQ02u=yKqpAX zqXVLJ2*xqt;@$D{aGn0%{kw5^zIVKT@D9bpBE-MHy|b~n@@mZj11$o~Kn|E7zbD{g zEJt{i)n_7VQID`_^u&tM_C82sYlO;AlxEgRgq@{RxVp-L7}!0Pqw zv$5Bz>aw;W2Wr!#FeIF`p3tF})K-<#Ur=O8Qn+;)bj(tmPG%5!+hDOGt}!2 zD@{KITVR$)sN=X*eZ!8>cNJ*Gc1fW`#M9C$7MrH z>ugFc@sL-t#cR~3D{59FyPF?uQ0buWua9gR842;+aA4|jZsU3MZAmnSr6GR4O3M1% zEc^tJfmg^TawZ%UkB*^2Ld*5<4NUUuxX z!muIN;BWI5Z1WkyRR)T-=R-S%5uCvhYz5v*=pq+SQ(+Q=DS-h64CtC8${jcr8jalBG ziCEd#`NN)Atg_ODd6u8Xuo1Y)x3QGTA?J(lAbx^6q$o)1$fod@iKx8Rnmtjl6{)BR1KJzJ@=@G z=9$LZUIS}@P`#Cv5fK=a3QYKl>Ev=ghiSv_&Mu|d7b0pK{3-%V>uCMO zB8G9y_6=!0&#?|n0U5A=^5Av}tr@sUsUvx8A18`tk8xN~)g|Kbew=l`Nn%l{`bGY? zW=TDK^44vQqsP^1m>2~|n=#wCZj7c?!Xj@$Ln;o>Fl_;y6vo4IPh|lFU_u{~6q-WM ze@2c56snUxAmT5RrtG;J(11knP33+t67_?-Wu;Ytf17h4!3(4rxDX|1AQ+!H#9Z9O z@DikOfFi;G;)c~~w}62rKVwlxi<@krKU^>P-OY7sIiZc%u2)c*y-D0}F)C6A3h^v_ zz8+J#Ou_=*#=C2xPyVqmRfk_U7_)eFQeUO@M!9Y&-0f$GCX}XN$r+@n`%2I~jpmbQ z9Ac#`%+*Lat?#nj{|TyS6tC~a|MaI*br|oM&+o1LY&jSWmLazVHzR1zCZ5z_CbThl!N2+x4Uqi5c-qACSO<8-fV+GihZ zmyMNPW1zKFWh+kqU9vaVM9AMw+5KF5w~E}zZV9s5lE>gIqL}h9PhjrNYoj35{Nl#Z ztxkv)mV8&WR<>lC?X!i-5Vsl0nklCHTM*v@Snm`{i0-mxL8vuWdVF48BYyrl(|{AU z=)*Df%BMBAM=DAWvQUp6XBSf+Rz;U! zs~mcGJeSXx6vuUHs~QF$UQ4qXiU2Ub8EI|AE#eT><;du0zem_}lZI1Q7HjWao|ZhT=fUvcY2*aT*N-J@eL)EaQZ zeyjQX&6hQX)mb&0M$Rup+i^$SAmUI9YKb*WMcie138)>P8-Se$^>lXUQ23O>X|CtY zy>zaOw{V07$mp);=zd~>vJ|m|Ri_)5Lr5(ykDZ7F?R>6|8C}ErCfzlAxxpNV=eUx~ zrpI(15i1*M+CDjDCj)vB%@azDEYz8~xqOQ&2)59%)n?sr_Cqq_+{FVpul<5b#Toc`Xx|oj$(@3a zp$f^YE51reb>R*l`2X>5Ug2FIYc}F^^CTv^CTz!r&7)6g3z^ekE1He;%_&S~YE)_> z!<>%XU{hIk%8_pp-zZ5r^cM!s zda^UJFc_*a_}zkIfdcYe1T6Td92hcE)?8$usn0@Ftpubqvr3MBRkF4bElcs5WHVW# z(Epu|UGEN_{e+6jQg1<~xZ|)YRlA*$;-;3zL9eK`p%i6~-a+Z$G^K4aN~wC_H;i38 z(ivrP_6Dc3SvIVl23v86Ka&r`VWiL{mujG3V*YwS z!2=QH1*4fE@{;_&f=gcfjL!pQPaji7#o)y=jMb`de)cK7)@kPZl_Z!hgt-!m9m1EEV>YFoc^jG^FmkJLjrv);pe9O+_*)-Qy|?#dwZD(Y zB{1!q-3Qg(?^NpUTv_~>sI%aWV?{NAf%-m;g4ig{%P?3_RwENp0D^PR2}b8f6;ecj zf>(?eLm=J7#*Fy88^q*R^!`0F(y$K6+4`{gyDk7c6nBguT%>uBB@*o-{U!E-YaA{ z%+)}?A2$z^Z9_D`yzOTs%)VZe4ZSNuTPD3cQRm$622a-Y@ph;z*zUMPS7n9yv58cy za0jp*&?Az7J4*H|J}MSIdya|-!M8D8F{pSBQ5c&<5`a`guYs6Dg-%M;Ifh+II^(D< zK>Jtc{OqlnCO-m%|s)O+4_Y>KAh@1b-spfuSUOX(_0Lz@A+?rT_{$>zULjoLG3t6XcB{Rh#7V=P

    z5*`ByJh!{@GYeqJZxWX?_yEGTLXX!uyLl1EGA6tNnY6;R(!W?C)=U z%jHbA_|9kH!Ta!wd@8J^LF?r@Q^2S>m{^$)tB)PLRfdQZjzxO_1Z(DX^r24(B!`?H z698cnL875BVdU$jzeROt&ANvWt1{6c@9C!^6^qsP+EDXO5{e^FBqKIXMm=!IrX2FW z3Js50xtjUF>v@tRADA_m4fP|n;OyK_JRP;(GQqc5G&{Ndi4w>f4TmNU8rCyw%_4x- zXQK4X{)Z{r?adTr{m+JF;gmkKH`xJe`)Gj5&#n6wW2FwR6|F2aSyByzlzpiK%))uG z57CTBm-Sk`@#)J)^{VK{BT~q?JfQJk$!Y1C_EqTdEmOsT?TZ1zuX~NzT&v;tcZAl< zYAb|tlj|%=euzs%fXO47K@2~jk-$o*_1hFxYvxNaaG*6KttWzc;QXQhKp|>x`O4@a zAh15tC)((q-}I~sBnRn==`=GPzG<%2c^l5jt)y~~)`rhKoT|M_3rSQr9xI~^w3wHj zC%Sz_Tuli&eaXBKZtKtY(W;h=u`nHpdhFX$RwT8G?r*CpA;sqWZuG_W5;y``ERDG& zIeO%F{p^r14%VpQr3)!s8ureMJKDVXmo91f$(Xq7?Io4DdaT=ga3i_5wu+|~?G2Dv z;?F@SuDYb&6x7WD3o)JBN;`df*c*;@23o8~9cTaTYf^qVhyA9g&XJv)r>e0e%jagK zSe_Jnna9KDhc8n?=1u}DYWeW_&8^)CO&8x4fAQF~-C&C8^#$kB&-l5UWUInq&Gr0G zo*1C8AeVN^%jf5?6PX#nsTpCuzVXi;7l9ij`b6 zdSfE4ggRQ3%*s@OG|HfO{t<)~{48m*X>3j8gn!$_#nKZYUx-fn%_)jmAjhu&IBUyk zgNry|F)EAPKsa!i|r{ zn-x>Y4X!45byX_l4+qKjz<)l7kJdZ$S=9aVnhRRj_dSJGc zYVkcVQtY8!q?)L2gk+23BxKkB$kRW&ZLU z-4`wF6)VMfPCBazGD9dQDL@5oJU|UT3Y(|K(;CG>>8tRfPIir06chu_UwZfp?6x&_ z1thrwkOc`W0FE%XF~^-^Mn|8CaTwFr$!xN%_oGWHK6npYMRn1vz*eSv8}l!v#FIg> zqvb|I&=nPt~j|SF80eEE|0p^ z38YT)zqN;?DArAiHZ<+l|KmXJgi$u9H zwXq4e9=7#OW2#Xb-Wrm1^awPw?-7v`l)uO~NMRPAwG?TQ~-ct(C5O$ipa_mvL_P^)hgfJPZI_}>ExnpE{g=4BQ!=_{-G43 zi>uTIIsE& zx&;==x3gV{gOmuw{>UoVhlM!t`RDhWPo6U;|9@Gh?Eh0lIw6Wkg7Kv{`O(q!<@wD! zA{!Gs2Me<>C)d&ZAw(BpV`OGzW#ffZVf@XLyLF^=`jMe7-{mgjU%iM;;BzpWKuLA% z#sAP9CDP|o&n57|bXgHrbg-GijdtIaf{3;jwJ#S9-$6!( z@;Zza%=)qK$X1&WS1RZCV?EVfym*6zZM40}uIWyGF#zazh3#A6pXdXmh9TR?eKB0L zz&(tt-j|#lsChfAMN=+tlp{Hs&Ila`A8*k9JlRducYF2opUczJGAn(b^)b;ICk=2Z zPYxd5U-CJ9+1x)C4{1)9Id_&VcO4p*`&C6Rt zPI1jeE~_6{obF7lX{Pbf2#aI%nT1P4atWve)e^ppOV(AwNiWT+`8#oIFFPZmc1<^@ zsWmptUnMxdNX=OJ!Qy2G7Wgg0&U;8pta5&7qwXB)=<$uk6E^njbPetwyUeh&`Wzmc zny2SHd_J4?3ak^Xr=Om<7qP}X%5K^6_@6$XU?#zjb+K@El9PQnNUY4Pii1+g3{wj$ zqT@%2Hm@@HsA(LKW$i|8Y({ERi$6E=u^kIa1YmUWQ4e~O487@jXt9oTiIcp64|^1X zLHuO=3DoyUlY=ocLyGwqDX+RwvyenHSj{gRpQRPdRPG0u%Q7~#*$y= z8q`2K!M|4>?+e)vBzueZ#?1yH-AJi?iRm9CE$nOn%Xu;&sy7rx#pdVSz{~E7>=Z*A zlsDrS4~H5U>=}d?OnX}+DPUkXpnvX**5L;+&~2ldgz`g1xlU5c@pv^YaE634_1@AL z8@BF>H6NC#rH4q=*m%<9b+6I+5jNN2bES}>4Ij_Yg(OwaJPJ}c;cA#Sm$Fz*3B7=< z34uJz;FcI;&DhH7hqtsfTxkbFR_=AVQ%kCIhkaDFt&fnQIawFickO7jsDrTLh55_j z$Vbk!xitKWcvuz0Gt9WRlBYTG+J0G5*E`Ih^~`@xW>vxs3Q-hm)aXyK3?cl0L_QZ- z1Tc{K3#kE3*iFaZ=mN#oXXeqVxO5#u0m>V2(80uso!{49m?k=D83FtIMhZ;hmf#C4 zfc1$D8aj-SJPQ$8@)Op}2cT*3*!+5l-;#Zbp!6UYxr5uzN7;-UO2UR}x;w5V&WqB* zZZ^&-CN0svIP??3ua*6D!BDQI@L8+H*42$+K?a?7OI@dgv;Yj>xC`e>_c4OgfE3O0DcR+kQo^It8v_rOqkEVtwuj4CJKpxu!Tk(pGS$(g;~bjj6!& z$3hI>Cj@96cDd%7ud7WdTJ3d{N>$05R{lDYb*6fza1cTcKx*&yuOTwclX{T=k9~?r z(7R{tba**g(i7x%%Z~(ou{VtZY!T%NG_IKK6-(Ls3BMHn0e$}gE?qKaz2q~3F8JzK z--rE&CR-X*Wx_+&5O6Q0NMC?$8~*e_%ERRUu3Ey7YFz4I)#{{4dFoXPPx&x%H1Y1` z&`CY1>~sIDvA%bhFsv{(y{$pL{NzTU@@Q1yieB_ZxHm2-pJ>fDunL*4iQlATH16Ba zSLKJ>l^8e*Kw;K`*(e|ngOuJM5Yuu~?n_3S&*WeX&woy8Z1OsBwoIJ02^(n6&lCC^k7Mz9t zP_H#lO$rqlETMG`T3mmlc?=EF^LaSF&qut!Xniw0Zs0>3qTG<%P{=ddc1eWlZ@&bf4`SJSqjz*St)=dRBe*y zY7lV>y=rSRF$ORjZI9H~%45yZ;70BhifVU#KYVaNITnc+OEldMBm?89v%sR-Yo?)` zEH@y3&=&maBPyk2VkK`7XY)1bd($2I&V)jQsaXo_HS%QQn2P=(o#pzECOxG}9=&Hn z{@_uknfrp;*C`Y+OP&Ki_-07;z!244YQ zGoV8I$3Ay%v01s~bZX|-#%br_uh>&BCBiz3I(%lh#wdj_tq+SO;*qm?iKrhGHzHR^ z?ywMb&vHchW5M+6>8pSL`ADNa5BB`#)SD?-ne+kUMbaNy5Ne%}yovycW#Z|dd5O&gfRLHDU=jZX1%GbNCn5w>ffF7{EZn@_Z zbZ<`Ub}sLXn#64!(dvb^^77(CEDwAl4CI>qiM^|+fc&`b{IG1HPQjM6=~pK+-VMl$ zXJv}2Vh*W4k>NUrP49pX{<5~m6F(S)tIwl|SDTtiz8#0w5yf!XttM&JG4ao3BHDiC z7jN&f{vnLc*;^M_kFkt9Tg2rUFOvy1hYeHlw=4vA5k^gC)>bR*6Tg|8@hcSIz4wCz zUw+IV3+%ji@*=WN6AS#*p0ldq(c>V-6G+SUi1hsTH2DWuAg(qOMs)3;Hvp-Cyv0p( z>I3Ru*TZ4NIE;o>JMo*C(x94T*x;?V1U^ly{aXkj6rTF+cuiW;yM9_sz|M`1a3x9 zDlgbPp7a~}6{fSqRDo>_Vego6Md?O|rq{OrjTAwt4;h;$%?lvXWKSq+zMg0Q9P@+^ z&#@$*eaij3gS7|;B3lV9ezI^gVI=_t_?z}HKct7q4-&`)!!uFdyKgvB6T~9a!5C!= z*@+E1ANQ7Ii$=XQuT&@CLUQrcg0*lj#EUH%H3(@k(DHPgNE8yq>RE3hT3q2uej&Us ze=jCkau!lI87J#=Om|kUjlZ?=ge#~nx;ctUm_sUcZu0u}Xc*unHWix-2HBxtMPM2T zt-*~npzF(d6CQA)Lcn*ROy&Orwm?b05KF*~5PBYgLa=i4s*}n-g8pWwdNlTTQteFl z^+)Q$n2{@5DvdI;mPywBmJB_`Luzn%mmvh+Lg)FOms8TF-zV|eRl=s{*)w@H-#az4 z&J5rTR;qLbOCJ~qp}F9(Lyg%atGdTy54a3gdhNA=X1D$j4>SKMc8m?-_Esmhd6E2m z0{{R3Si;ooz`zK`%|IhW(`h0IMZ%yA1OW0d0Dy`{6D%1Gqf7>*AfOQqm7lTaflCeW z)FU;pvXez=`JBcFNZG}1LqLqsHs(5=ue3;g^o3kvY$%SH?6 zY!p_2wy-&(RaGe3@%m0$ec4>X|K zOnd^%z|+QF2i-EIUp#wfbWo8r!?&H|mZDq|jSGL0N+zlA-%e|>RMw6j>&_}Jcv2rJ ziHS(Iq2+W>w#hKeUmd5< zs$~}XwQKwJR@GWWEL7EE5RX>XB4Fz=|HoS)S;+GZfOjVPxnx@7< z{{yg@S*4ss0?+h#`Yh|FZ|J+7_yUGH-ZW`_+P!Qe`8(P8w;GE72LS0%@92sU}z4WipvpNRvr9vSeiD3ys}9-P7rGMC5IJy}UJHIOY#* zSrFv2Srw##e#_b_gC$d1dnO|m{dj2V*sf%*%`Dw)Dv~lxhWf>#m3bkIRy`*jIfk%G z16mty6NE}1jfyeh|2Etw2$4QeF(&l;0{|S}J?z+r@~{sXJJM2d#9%Tg!lR>82*Xfj zWF++VoiW+bo1eihLocdgUmlY_fbzDO(R%Fp`_Dr}Y%k8DXXP!YtFc&1l8S)S@pL>5 z9mdp{hAwMTq#0w^>)K%)#&p?qm=4W60fv#P@6{kk3sL2G91t(d&vd9XL1Rp*3{X{7 z-~UhORZRGqD4x_r&%6?PmFd(E1NA-ji27kck$fCYY!}@@78~H zt(|;tI6I11oG(>$mDYJ0J4M|ouK%Z^KzngEfHdm{ktBkltEL90G9OmMU3^C9(Cy3} zf|Z7%%*X+jMqQUE{{sIHzRSIj zH7c2B6ABBvmU~U5X_mxyqFD~M`?`{vyITVama5a#Am=a{A;kK>IjsOrmNgmq!&_!! z2d|Y`#a<*ck^Sv#hnr#XKbk(ja^={F<`_naW5(VVqy^i%1N^`I2_U%PjUfTCbRJ9f zz)*|!yg+dRn83ySnFj2Cy&uxWG@vB25vk6dq6Y!%vZjdqR@;1&H`lB~qbZOM)Ag9r zK${2Ph(|9NW*>i4=|%vKcwUz2G~?0;0m6FOARWjyTSpExlgMlt@Z1#U&P2@o_cAh^ z-_h~e1oLn>$o7hRrvM(W^5gZv4SRp%lM4XeYF*2UEgs#Qa9H?Ot+Su8Q#|qyZJQ4z z@c$kH-1p79Zy5TJY3F?kB&KNxUgRX=x&OzKAf{pHL4@M)H9GfPi7EQjFE!?Me;FmX z_SWX;(Y{(?I0FEXp6k)veV+9`pYwURcLD4H@^gZJwFjF}j9`UaHMV!EFC#$2>FeJb}3ySz^IHc>lmJ4E~X-=)@hI7w#8_4wUr zu@0X~C4r6ZCix?biPx{NyzdFBunZ9ASk>lr@sM*Lb`18zs zi!+}0+CM@=-wCe}vCKzq0`%1bF|dp(`eRzpesXcIsn)MUi#!C)}^e)ZP5^ zy`{H2)$($KU$G_7_j{x`-9 zk`Zm{n~BC=NgUprtr{sF$czJs5G9IXMQ6%=5nSi>%Cf})EYTn>$mSWrMdbs~s6OL> zp8F2QmU}fd@;_;HnPuO6|6%gUN6jpsx$pkpGj3fHCL%P;C!XTvyGWjVeHTA;KgI{y-00{w{$(TC^QM{tJk4k+)*i`_4hwyN7_54K25kTJQ(sFr z@{_%L?p8=8zt43OPhX{uO|0*yx3)tuDlS+&OCLC$({m&j?0xb6mzi3r6Ing_c6s%> z_}^uc&A{x#<$u+upQkcA{w!BG#=eS;q{IKLBLgs=i3qwz?K)RX=DZ(CH1k z1YFmSK8kU;`|?$jz%U?OXpq$(+JAFSgl+&H zJ>KNmhr~>J%z`y~{Fqb1Fq1yh&<3H^F$|PKqOqDB6go;X{$Q>z=*snbv#zJs%-k*> zIJc5C9h;cs%q0!eaXEGW&@3uUsUb$9Nyd<5jHbg#O16+*WB{Bw^IW79)}_z_k(`|w zzzG1LF*}7c0p^dR0qBTE6(N^2C^}IEX`pd}6P^Q{@BGm~qoIrt0z&kBjRwu*iA%7f zArQ6wdllQnBT~~SQ6CQ1U#43Tj5z2xI^~JCS9HA*+sV0@<|<+T3SuBnNX>z znG|@|G!Ry%*K}7L9t?gpA2q~@RvcQv8wNk8lrYGk$5pxto(iy1$)`7veE=VNUMZa{kHVc>2AMrm$>$%$&ZeJPy_B>#aMD3P+v0hCL6G)t5 zcv&S}xDz*C1jTc3Kj$6`dL}(=K zlkeGl;j-Cw&Hen8%$YP@gF?J0k{aPPUD{GP29dUG^NQhpQ%*G!HJOkp`+esYn#^@iZqRkv}H*c3;+v@A*!;3J1VG%-idd{50-TZn0IWM-pkn~%7_I>tfKFKVWEc$y zkP1Kna)Qvho&uoWR_p+@6QPC?X7E`S=Qi_fXtTrA7b3l}-y=G{b+(f5{+*Oo_FBjb zr7mZdk{~ae*%77P0W(O(td~aD`ICFgvWoG#P!BcE#)w(B!_C~RR!h+E6K|H?WCgy< zeWekUpHoyUyj<>CcIf(ZC#i7qc`iM0$RzrV2??*{g)R&lMQ5N-!BTCHqdm3ER)*#E zY)3yb%q*N8XphRu7U}@1H)w_3U^wbSH}h2FyTFhQLV-8N6M$NLn&K2CFBIVHStfz; z003~@oWRFXK&=Je3gEPy0bR*?wg^FKBw&32W@J?1wEKck0A1!>OM)jwYelBF!|AyC z?QQf~ma9yRQbMH{mtA%DZEnqWTAh^kB#Z`A6K7w~)hi#+5nU=sG%i)|y;-7J4y ztbZJRbJI4z(e741w8mD;-8nqnjE)n4D%btuObWoq;|f6wIIRVQ2p}FIg+tOwfs98% zj}3q|ACqcJin#BW6~vPY*4}f4R-yf1$G#&ZyYt)&_W+2qJAVK6?Vq z4Eb<)0Z^M43|O{AUIDm&-myT}u7Co1;~6-#0p9TmI10cVAWJ?c&^kb22O9#*(~r#_ zake|#*2mWis?jRBmX?O>X*G$&NMychbh!-r5KJ%1u2Wf5Qve@Rpvemh&l)yY}#4+4*XrTP86QhU{M{mIyJP#^&T zo{N375nO(3+}0JoTkNGS(DY@K3X9X{Vb+m9zIz;rc1`;N$LSj2Emhb8339>+!{*9= z2+gPk-0JtiyT^&+`&KS?L0f!1Tr1e^-xC+1`9c@{pc!()0D#R=8XwNXWu7k^Gg=J$ z6)=H|Kl&Ow5DY&y3OWl=Ex^h*4*_~~QK%Gjz6VH}r@%F1;do~N#n}kZq>>X+?h)nC zTPpG02#rPsQAd*WY^#kw_+M*7-ULyfDOxm%vbIgRW(x$0wM%ZExA^@a0Iilv(CXXM~l00*9X zebo_2A2<0h1=G8|UiyJ``EWBzwRU|ThQX&ko{h-1OEEeJFYrb{tyEPa!gJ|A3f`I{ z3oMgit5}|P?~$JRZuLB)t3q!j#qZl7MEWR|SS|wqq~U4x$lGpcp1Wkmc2+$u0Lui6 zd5#CR0DI2uil|0DfHeRCI0vk_6zJXlTG+-5fX7OJ&3&^77?56o+)}NVd-uxnu$=e! z#HNU#A(-iu%i8AjrQ1xGoxjVUs-#k)!8cUhn`4sn-sdCelw~PtJF>2OJ#E$ZJ-Z~P z^V9}IuWyJypP3DZB-1C_TZ%P1qoLNX)h*XCa1Ak0)Ni)&JN^@KL@|Z2XHW$eN^NEV zA$CSn2k+91@;^##bqC4AY35*d{e6gfS&cGoWDduF{q9#^e|pw?7|XuL%HmB`(@BD2 z$L3<^8sp81000268UO&j0RR94xwU8+JTf%u-`?r%?eX{j0Q&j=1~EfB zIPc@~=`2?bmtL|FqyYK>lA%niPk?U=oin>q#SO#KW|if>V+~7;4C{>3F4t*kGo+{9 zbAqh;qBlscL)T<912j_=1~Ac7kpOd^wq-^@(?RJJT#1axo;_49;lKZa|0mV&YpFhDRjvdyTa_&V%{{GUA;^J3kKW(AN-}fOacm}yp?&r8rC_T6AS$b$O1vx8*F<22z zDNPYfA6b({1Y&9C8qK?P+&i9LM6o7Ei_6M97j0miSM%H5>~?!P;mompCM_gs#$Y%* zu^^q(tfC9eC}fOOmvLAFpm_{os2*o1L3?zdC7PGzD*Gu@0jq>4bAB6R3d ze8&LuC4+RjR6x^o<`DlQWr;(tau`G}%&-E0<{=6^u8MMda}ibMsrfVj{DO6wr_FZ( z*u~7j3{U_!bIb%Xb8%v3{$s*M-=;Lc%x0hgh>)Q<9+{m76n-4u0 z5~`iKENE7_xdsqTsdfpb$0%wDl@_bXCWOF*uhS;~T%H3dseW;o}+($Whn>Cz6hy(z`VB$<1s5 z9?X4p4QxJs2GdAjf4|&U6`0uk@)Hx;{CQ~8MnB6Zki-})RhTA1a-63Bqk!KWnEV24 zU%n@;sPYYQC8_by!(uc)UfRgEITEMM{&Ri4A&#|0EKr5>VA_GNW z`U7ah!KJ`3j=)AJ1dy)H9hjK`$U&hT0bd&XtyUnvv{*E!0YI>sq%x~qHZ8|OLeoqG zK*K+b_t2{%cOWGFw?rdMt;1)#lfH|V`g`EEQeYe}H?vygHOYpFX=jj_;LH{-15*H6 z254Nm)QPYcza2_DTmzn~y%i5Wyt+4TxWC@*qa>*8;gC1@Jg|ZFmTV!(*Vs!-Wm*of z5T=Nx6j6#khFe-T+D$)|IN=)oYFaD%$b0Dk005>Ww%gMl;j|&nJ!&Z4woGn%1{Yp+ zJe*)rz%<~;7>I^e1n{I#mf^erHO!s@of?oi9f0vE1<-^H1M!<3W$A?_jZy?ACt!@x1pvsV*-ng;m&H zX@O12{{K{{yTH;~wOT88xu9z4&lQw}QEgJMk6_M?m1FdLpS)f6s_?&m*7i`=lW~|L z!C_j?K(D{n5s&TQ@QP+D9(%pSit*vr-$g#v?DxlFFRmbGzB6&)?z|z0nH(6pfs3W& zO;bQF(4#*Mnrzke=e4oojs2dlcPl@P9uAU~W^hGg z4mg~^_a-b6SYRgGX zlPP+R!BGLFRfmvD#hEF3NF&AxmBN{?)V}|Tt2{d~Upe0s2I(wAR}-* z%Zlje#m_Dzd1)+v+%p%8O5T2Z=i*Y2^OvDm0s$wc0BtmMXUQIz(e(Mh10l!Nc3@C86Q2?Q7c3_Z5f)P=A`h#lq*<|+T)EieN`!nyZ z=i5}M6X9vF92NI{JB*%QLR~2}0RRA`P5pZFZZ^e=qN4dbyS4iSbcDZu$0q_^k-sX0 z6Dnv1vY&ddaRhx(=L9wtTv{Fr@N~9YompUPK z(OxQ13A>}OCe=ty6ixUcJJkMpl!%d7Iy)P;ORrA7s}P7k)`_HREoM%1U$xN8GCkWO z9~Z$Zb_hZ738!#J9Unwl#r5VnT@IcKfB~L*J@rV6;pHap9^Y%lZe>Mw^XP8s1iwoN zHa|dtrKzS13?#5g;^f?EcrKU%Nz$6F+BQ{t_*-lT>m1^ilq83TZvY4YG}>$k06dEU zfV231-!47?g5D88#vh<9(;ooKa~Z%v zfXn-fC`$99DMVS$kJdrr-1MNU)!7&(CbX{80uj|{^=BdejVRTjyy)pJ$IaJP$s-D_ zfW)+EoP;)kv~8On15;mrJJolYhQfmV)i*U+1$~e}F13)zh@#O|h2Ny=P2Ykx1ArnX zp8k`jCBBlx4^gQ7lJ5 zURID_O$ro#)&SVwektglo}U&4N-luKI1qPh6?p|5{`kIQ6{GQ#Ui=8vN-LrmA zf$md5hX;Op?|{Jbxd>n%&VW&o{yGy6W#G&*&P=hr>`q9L%N%Op~CX&che)EgwykB?u z=)CWkS4msXkF8v7QF&iPnxRXyk)lZ}z26T*^If2H2N%sxNCRf;l~a6 zXr!ttCqpsf4d>DSH?Y1(-K_VvSL@X)-a}Q>D zX4Ytl95cCUmqDj^6-g*I1ODw1GN>*Q%wG4Du-ekst5-{D#|Hq`DV;?Hkq#3R-nLWP z^$2AT(BNx5nO475HoYGJz%qG*L0S-hg#Fhy)bBLj8~k+ORH<6G`xNCF05Ic&yS;v+ ztmy2ZL@?E2g=uX3z~G~wlKT7g(fa!3i??DH4(%ekdt729fa@29`Nhj_4#3}i1@IpB z1mJu51lTV32k^E)1D%;gK;!cpz`x}OK<$9`ui-L8k2{8Oy~)W_+zi)oFCSyVT&2bud@UZVwA>f!^ou_21WL z$;`-I8TW;q^;BSjJ^Za9TN|FpS)UBh`@I#hJrA2K!!tsa3V+!#q(Y||o>vivRjdAuY4m3@@^{9s6f-@dfQN@@X|mrFU)fO@uu4L_&B!$ZLmCLgxP~ zRMBe5PN!*IqWv8o`2T2;RLE4jvD-h#>|Z>W>&Y;6S96A*#)HHp&8XCpeZACLT1ooa z>*zVNE94$bQzOyziE1R`tv5a&uncGJk71u=RtJs;wLGh~F&r5fW~*fAMs?G6&G|Fj zO`9a%>$M^=<8uJIsx7{N^AL&I=%_t>sa)?mlz9oHXj$d+2LPC9eE#*3^+@QMb_B?# zL?=^;<7o8JLx?C7B7f?3lDX5;(8}D2q0&<+X5kX801H{(4OMP;yl_)-@aDT0OD~NK zvd=1?S&1+)qXB+|%gGe~1y z5P*adB3nQRIGczV1Q4JzLMTLB zeE-Rhi>dQRw8Yt~ODo*BU`)F^-7L^FfDYOb5%N|GOvtjWN>}Y=5&&L%Z7Cs}JXT4= z$?|HkEhS{gW0^_9+fANJ8fFr(WEPV^)oU7pK0?tCMyB6Q`64D1E#1%G4}YcFgatN? zqyy;@zX6y59qq)Fl7kHm8j)$)(}#schlAaMP&gA6yGJwhXT(5V2&e3URRAgNDX=DM zCXh4`Fl3lQ06HYlDKJie04YIcPKN>rZLCKS%prReptz>ZwworombQ=uH#ugJHoGb> zCe)kROjAIWU!1Sk>XD?-e(LEwsMNAy{mH%hOgl(P&FRo8H}cl0 ztky#6&sb5B2A*48N`w%L8DPHLRrt+XM_(`{kA8sVqWwb8#r9}>LD(XZs%Mb(06?=* z0=kqqo{>%&=mY*hW;nBVgP{DR(Z2U`&_Qj6SliMXa1m1(W@fQS2QXv@5P^c*SPTGy z7Id>-mxJq1YKKe@0nMuD2^0jV@l1kYCQyI^6VUM`I@Yxk1yFAVKEPQ5fFaOq10@3L z7Z4LAL9&$0C=D%`IC*OMa6FEN?g~Ps7_7ZgEJY&J>Bb-PJHC2XPF|w@Ce3EcRY$bo z#w1$R%(OYTH=V0*PY%HGfUi37N~0G{{JN&xazgMbtfKXfhGZa2ijn~yd!0-}HnS`{ zNVwYOf5o;qB9&!5MZzcYdxKQY05c1uLD+2@7!10Y2+bHF^n(D&Wb+lxC9^!4-lgXi zV#!ntFjITggn>a4Tl&*wP~ey>&n!&pd;8M;US6qL+nftVU}2xx$w zVBPsON+SdWei2A>9|C|6xD1#13;@hr29Sv27IlOtX}o8GZV&9)PSeixJs!2=ww`I1 zNVifq0ruPYy620P_a&`panIk8y6Iw46rGtSghg-J(tpF3dW5=lwW+O=x)u*oYB`00 zvFL9wxCt$<%FyhDYw!^RPiJRS006)degFUf006KW006!L0094P*<>2<`Stnp@&5`j zF)}eSGB+|c<=^n-@9psP_ufivrec~;W>N}oD}=vS>sUHg_|Z>N;F7E4?=sN)*cD($ zfV8a*pxP(^Qxc&mn(;$TanO_LxvFy1czVG7|Fgxa!xEZrGrO!|rJe1_xG;as0UbLv zQv$gJqS_=EfG`U9d-LXYv6o+2=mM5AKzhV!7tEj)z!fMQ4k z8v!lF8W086j1&aj&!NP$V9*@FCyB&QY7;^rx{}nAv$ami(o}?eAl$akn5GdI09IWc zS-BU6YIxh_pi5G02l>n@WNtGx1{HZRNG#h}mU(qzq8R$lOokpkR~=5@w03JE93D%Z zd`C7tx}BuL+il_ZdR<(@xY%{OiL9?cgnn-bQFH;d3tYctdIoWK1^`v3$^Q{TKZq&X zyZt^0=cv)g`yHiKaVu)4|EYJ7e0En*MZjQm^03u6Xr3oZ%(v9yq}W(7oB z(3g9?rUou|MiGbQYPZnmlKND=61LzVLE6^Tz%=OMu_!_a{|6(}7mP;N9SDDF$yBY? z#WU<|OU>7R{Rpt0vuZ4xmUsXnA3*>Bc==+yw={68N-)f>z&=tG;39yh*`usMh!7wF zIRUHAOAAU%U;*ebr$PWc!R^LU(jfqaWPOUjG*&A@lTt1AW_?nz*tXdlc~G!uX)nAL zp>5V=D;nY0aYG&2=cJGy-IfC*vFhY+xwQ#RQesrfy^ip~b+W(yGN-6@eR_7vEv@ut zGu3m7(3T3#md7)e^y%a;WIy);T)zQcOP$jMD-I(_jpG&iTCbCtupYZQCd^mp^ZB3* za_z7-wr^V`v>EGmP=abV2~=ANXgHy{H2Q}$BbwJ(Ag|QsSJcu7Z`w8R%Tf)WW zm01E0!vh1rgfVht05Sl+dtYpak&oNFAmBPFI4t%sj{vv;;8T7rJp~I-Kmqp@2&T7@ zKu#kC3R9@Aw*>c*6T1a^-!6fuv&3g|w~_D@wNz4esQBB$YN zG*9Ss`VR^atn;Uxj6l83*1UrqBCFeiZfjtAqXhj&I)bJM;>#vKzQkmf<6_!FSHk*9 zID*0p+aZVn=$#hek|;vv-v`6KqqzdMfN5C|$bP$upu!Qla$9>@0Z}NJERImdYK62G zNzSKHM4wt`$;`y|@0s0twC!ixDs=u^IwtzE-=yfcWsdIZ@4f!d+r1uI`K51!**-1y z=K_!w8WWvp`4hb5gL|qy$%P3nU)+wNQtP8r!;xwa_&~_iYj#Ho(d#y?lb{B^dL3oQ zbpLd3OinNF^?H;_lKxpI5pA32%7p8L!z5};wY3eVPe0zt{nDWZFpR>)#iRr?dtMXS+! z`M=-E4x=)wRG+g7|Ei?9^v_4={p#NnUsqpMY$UflaH!e8mBv(me}`!0zt*JD;v=7| zs*9G9&)#T6b2NR{;d8mxBQyA{XB-)JEGkW)H^KmGKRi_`%*S-)CGq$Gv7+h$+Wj9G zIi#EAA@ef}MgB(H8>y*bXt0d>hAW>DyhEz?NCQOIBx*u+tpw5spkZ}25I_Z4p_)}a>ks?;Os)9}YerJBb8L``h)i;RIV_s$cvWOG! zq+eR{;gR0q*{ZLYxAkBrwe?R1R8gFwT1_P(uCBL|CQ_fXU|*GtI$Lv}GRMOA(93*W z#eOlplC^5^1qS-W@KJT?SDu#{PQ3G$O!nLXDkig-}k&bm_ z{%^Z`(h!^53Jp%bHzY;93fbR4U@BNu6EP@F8I=A9M3B&I0ZCGIH>MKQX(rQ_9os0} zyma;R4xbti8|3XChe>B5YNVpsq>$xQ3@YW2s2oVEhtMrkZ7ZdjBydU_REnSh7THpe z&OnfMM?L`b%C8KKlUflKF|Wf|AYF$i07$a@H}_qc83PSimkusmO+PAb#QLWItb7X1 z+CQyiD`l~eR_tuYUHD*KiQqPWMI~v?)WnP zeWuR=p3A*74UDh#iNTQX&+TrLLCWE=+(R6;Em7coF0|RM0G29DJ1{VEE~V&?=wK>K zuRl3fV67MX!C__6!QwI$+q)3RgaKfU3yXgdz5dIG#_k;>>MkF-EF*$;79bgr%(K5Y zFxQ|O4t$zuq}ug>S|Cj+L6R*6hOkHd}XXH5|z@%t$LF(?JWg=370(?t}YTR+5S*s|kxmUlgZyjWW=t+@72^4E#CV4_g@HMxEUxe?SEQ58VqeGhY@a@ zj!{;XQ+hwC@LHzWuDot0BiaEP!Ua$U)m1(#xb&c%nTy28t{||Zv`FhR9bl0Jb~^qUgLoBwyPME2`*Co$P5>*@)xG=H zVYt^0^9(!KjNB@xItK&5$i?D|<3y>93Jd~Xf@6a;2=Re{YUm;)So44!g>Zi;jtXdY z1<}?#^Snl>oVwGEhFAhJz^qG{_?TX7%GEGLT9G5#Up0cYi~aw1;giS?g&q!3r3E3H>miIg|$E1kfe^w`G zKp~zuDk+P3-aQTgGX844w1}~3*B@f5#uUHS>uMq<*!A~7hTnx2cPqisR9RJvh|SSQ zipPe*MvvLKJkuSZwXjBd`nk&IlK1caXE4mNO6$vZoX@xnqzjbQYgBYO zm)Kp0y`{jy140yz=6F9MI+CF-Y}9n0zJA^blPyJ zIfOJR^x-8Ay8n^-@#=0iJ!^#Y{O?xm-~xN0|KgHOZ+0qAbiFNX<5J(P>mhYnr=m%k zG@)yy9#fx2AMUmSp>DL%S_dk~g-+D8zR`GJLE5ZC%A#Hf*S#qQ59B_i5Pk|>y+=xW zEH~j)gOL47ts{$=W?uav?7WH`&e-V%98|zoO|2lpM&dJm`n8WHNWD>K8EL;UHG{@| zcRl?5c_ktHdfmVIg6FT!|M;I~Mw1f=i{%K?%z$MP;Z{;&^MBrLZ3W+INJ<1oMVAjv zBRC{MWTvwHT?K}(W`k^o`5dHMw3S|+uygKk^uU3-Nhe~bk*&$2oOW|_r*}D`O`0^( zl&rP4{$vR~FLLYbZ?{32=`)BWQH^oU(P)R9(nhCp$&`%LF{@>cONg`ApaLIS4$7^r zGVDwJ8jmZx>HMLu4bQCJvjjkJ05k(Q$js*806zMhw8scDb#LL?va<)i;e z;^^0WiRy#MyG2Y~DBJg#LnG)70;opQySnVuj1(_>{Xf-y8+$=Enh?aLdv}ri zOD1P@|9q!)=cTfKom#nBzZOl|`Uwp^STn-!8~ZPi`i>%1tyYpGKW(DYURH2#&L|)N zaL^+F*@w(Z-9PSiDruK9PiJRS006*KegFUf006KW006%M008s0)Z-uj4gVG|Ff%YP zFETwhH}%@+>*?s^@c#t-{{I*`Gw^=;T(!YCw|Xb_wiNK4R=bIqE`IAXNO$kJgE{HB zfX|%v6@@1UjVG!>(=d{l3bWVRaW`g`9f~Hq|JJ*9noT@bb+&3V zbJb!?J9hZGXIDC_17@>^o(GbzuYzvFg~CQ8ISQbE3t+W@G+;QKfb18buUqAOL1E$k zzuX71yj%gA+YM9GWCe1UE_aZ{sZ@3(pQ~-lzIRR%jz^L@8&n%HzRH)5Fz>07ejmQ5 z-zNgmR)6h%-h?ipsmMn1%Jx1V6T7&zvApeogODG~ynRTzP1n9_{a1dC zVM*s;b~su-4l-(COGen*z7%=%PGfF)>v4Ve4`z}7i&K7g8U_0t^LL1q9na??%Do6N zV?F}H0C3EJ*{HO#j|n(KkuG2dLiJy)65@V-K$6aGQ)&XuW9sMFJL7`To>OUla4Br2 zDhF)f%y)>XH@nO~+Pd)Nf16d3R;8(trs~aC*`3mRdv$G|i>=jX3}BimN45?KWXPwV zW@zO%Y1*`Cnl{w$Vcaxn(rDAH;@$;9FAJs6fVIK@9hSIC4x4U@B0#{e2&@1^Pk{#2 zXo(@P_vHFC*0xmv+4|pY{jWXLE3&X!yx!D;`ju5TNle>_b5sJ4B@;wTo&sr;1diUL z|M$W+w0ekTwSL$AU+QcyHXFp?dsR;=vi+)LStqY*UO{Uv5)wpD0fM7OOF;y+w|eWJ z3<5A1RQh1qhW__f&dlk}Y0TD7e&&s5PF)HQMsxRf6!jG@3Peo-#Of3k4S_f+@BYtd zlSs&h*?&*!mqGTDxtZQxzGLhCrE;Nk{Aj){R`_=E5+qF&_?n`Sgn|3{-R~UtN~5gj zV_Rz$L!44R(eC%#&lxKGPB#;qc4)HhkYj|DOr^F1L{BwA%M|%Nf0|NEBpQ@iVEmt@OFTH%Bv~>k82hHB7VLF~uGN`P0U8TlodY#Lq8cgl#e!EE zLDPqTq=1yq8`(4$o;&0L;$8h=d5ij2!B4Oy~7jxY2QEMeF>Wlg% zPnB&rgLY-ImBlbpB8hHxm!xYA5+ zVb;)a5Vl)Eah{j2dq35p+8Ht!twq`(f{j?KQ}*92xc+8H`X(1uk?KN4BF|X8@2b93 z4M&F!ca@B$>LIl4N%)h$qUhy8;o<}NaKUbG%iZTb zJquUeod4qk&D20tAU@900 z(K8kQF>}2k%qN3T4YUkummt73&^l8wzKCd>HAy3XzSVj*ru$_rMvjwOURy+rriejA z7Y#KmNSY#Ip(+$Zn&5B{CefymslwzqDkNQ^3=%ed8axrYVKz!p9R|hS;sJrrj@(qI zX?)x55)8Dj*!>;AnF%DZI)c!syGv3N!;qorWav@H(q8Sshu{0Dw(NYL!Ds5RT zxkmfQk=c$-NmkF~sK*7KC2H>b>Op7whAr5-Ghz%1o-E#kxuyY;713Esq_AZ1ZB8ix zku{tjq31=Yq)cGelub^r@qDyK|08aSU_?}%6sPj{$2Lsscy?iN5?wPM;};x5K4Mju zhUe{&ncWL1EM{tOm@hoGfnMNℜ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

    Po?L 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

    De@}|D%`zcnaVs|EFI>4Q{lzOwDEmbO}G+ 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 bbKmn# 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

    ^=wTuUB1&7uMj!< zzUoX#WL7HZlB=zUvnmAP10;F?D{tA6a(Cu5dq(}tj@p_w<11Z1slNvQ>W<~VV{G&Z zpl3I#+tK5_M0e4(lVFhr($oO@j=A7z6_(_3BmC*vHGz6fr}Lt!_td;acrrcE>9$3O z$Z@C`BaDQWF0}Ijp{>B##yyCq36{Z@pw_ka<6j!T7vCSxP*2cFG^D$xuZ`T#);J9r z7Mjuw-w@==!R9FmA0rv_nR)G1G|Ct3$6Hc#q-wHGh}?}bygr;^5Q-9B=6TR#+?&>2 z{=_w(h`0ypr;21E$@RZ`jMW$&VR+;iz!7wblV&vfR)6bhVr4h+75+pQvuU+FIjoAu zgAfRp#|QQ|yqV`n)OxK#$qa_4mtbO3Hxe^_XZ%&y-rRzZ(hF0EqzP=l?ll{Q@Us{N zBFT{5t?7lkVQ>_bbqx;8Tmn~Tbif8d;=UBdS&9;2-K9Wg4k{=|GIyxpV5r19sCP5V?-&gM5RP4hT;dpjh zBb4<&K}g_WP;xs`o-1Lz&rsizUz2g)iL1S?x%3sA*%RTe^FX%sC4EdZ=NKZ&x&|cH z$$=+#h;1(GY#nwdPaCp}5~ha2cKU(H5Z~o=lwH;e9etsc+k$ezjB4g%B0j|7AU*$*HpGQPnqCpd3WQh&yfR)M_G@oymP0i&@}7ly;^B4 zw>rtjNS+^pEee;A9<(+$OqrU#c;EX2jwS7q(Im=GQA;kbuiqb7695;dW%0TurK1e- zXlp`65H4c_ACyzEN}*j7QG2olgm`uw-dAp@+QtYXp$_-zT`vchzb}X1eucsuAv3oM zg!#TKz}0pRv=Tl{^#s7de|V4Wf&b|adr#EW)y!R2llDN51-mC%?!TS5>>0q#5Qq!6QOg)llD${kGJL(QQOC!fE?-J)1x!}+G0(t zBl@XOPWTBR4O*EcZ#GtQ?yJnX|AUKL4#2}eHH5z{t$%`6J}^?lvvC?Q%dSXhhk)<{ z0#30Kb%Xa`{+#mo?FnPv`1?l>>0R5VM&^4=?o`G8>p_tYuI3W}S~4~OCUD<*d1`t4 z#&_Sl5he~alkq(45f(h1-3 zwQ@FDWkTw=kiXWb|Lw+A1mK~_pq>mcDC9E^s0$*^vly3oDNg><#T!W0mqy{{@MbS+ zDpxb6JRcBqTu~>wdc0qxvouUA(rB*@)B1Z3mUQ#9B$YT6S;1HvaF_~UMAxqWjI#yT zUHTU(<@us_W?aiCp3Vk5&ybu90@P~*sJ5(i)})K`{qsOv0Ks2|0a~!y??h3j38@O-TOPqAR}rUfI_H z(uVsYg{%43$M0Q=nIfsAkOJ84PqKM^W{$~XWJF%kYycUrsX`IR~OD_2Du)i+$A zfg3>H{Oi>BwG-a;Rvz#KM;dfL6Wg<(0nD!qkO8t{$$}v_R%!3d>_xncaU=sjt@_|Z zU8OaJNS++po}Ue-I=fQo)$J+dP9-Kk3RP39W)J51Em-$aXKyM9jW?>hD2 z`^1d&KYxw{YOxQg>dSYeIlYY~%_i&6b`w`xFu#5KgX&>D}&+uYUc7oX^( z$&2TVa*ID|3n1+9S70FyM{&fcOm>cn?K<3((tLB?sgfb|eJcb2Z1)%elwa9{1}faX zwp)q{=Y7Y3y+3n4UJg>ATK6Vwjt2ST1V$eC&8C6HS`>!5e_0$~>t>ez;-Shx&2Y=) zQbtbtvZAE3*oQ7&#}0+%5Jk z>iK%Cv22_y6cP5E&zt#8IY**v#A_jEa{8=Dub2#A0#T&9W5x%&BpC=gDMI8p8%Nw`uE@ljR zR)2X)7H3Ar9$tNCGM&Rf?SX%@xjAY1=7U%cryUugVZ0z4E1=XA3^>pEfUQ@FMl`^>}5G z5?kwTx5kkJrc?U;9Yw*g`=aiZt`X@hB>0pR6rcVR3jn}fEj;_Kn)67$6G^jZDc%9w zDK;d4K0ks2SP~q7SZb&_ermCAlqBNC?UBd+=;fmOG6AA9G`c7{1U`f`5^yzFIlaEc z^|#rnxDIKYYkVek&#$Eax7uhCKda%C9WP89LNYfr8{5qO%#l6vKH8?AKAmDC53b}7 z2wu^PLf}d9O?*Q5Pv*=Rh z@|V1gkZgZy#bo%aOEO$AMBO1*KQCK^+^IJFfKXfRc1yBh9IxM9MXRjR5@J5LP(pZc ztlS^~j0y&T5B!~WH;{)xp?AYNB4AaV< zZq_18Mojex;jiHT8r(hg-#=z+*%aWN*cPYmkFytz6-Oy1cPA^>bvdhjviW9@cKWG^ z>qz3s47v?4a}YW+bZHi_IH^6BkI#_a)RL`*7gLmeDLWOR>WVyok)Ll{sY==T(s+Iz zQ-oz8I4CaIa3KI7>o+4^|Ju(+8p7^)9o!mZ)uPz42qB!s%Urk*2xIYq5l~Cycj{ra z-qFz@3s#)xd)&-55Ln#V1HBYjM)|EPiuC~_`D~r;T)D@_9R=kk!Iu1Mii${xQFFF&Wx@G z-wNrZb@~n-d$JF`FwSmFV$aU#$ZLe#Cx$BiA02JI3Bc4bB9bqI$)3X-yQJ&QG zw=E`IP6lZee7}keZMI|!B__+wdslhizIKxd>G_u4RR8!_?D%85s66q%CKEpghjx>A z8MWwJqp$!$l(46fc{UFT{6{-6>wT1cysoJ*f}`?kF*6f_iy;MI42<9{*~Jw4RQ-9Ub)hXcX%1~wRUId=0A*^!YMNx$nn~(*rA_s`g{Rg0+M)}DY1B+Uqc6bn^ ziCRzEJl6f}euv2BVcYUAku_J#YbUbVBKa#yAW$j?$kYYq&+q_vh}65`*S~a8Xwu<5 zDvIJ`t8eFHznp35LRc)M?n};XoBZ;vX?sokTr-rPYKwG>(OdZI%&GQSK&tghtwb4{ z)YcUu5g>u!z#<}Z9*jITaph{z!c}y5rf3f9*Cz%TU}5{t3TnpUSkj6cXFk~#Ua3kE|94JJ{k#=YjGdLg82x>9#NjODPGA*dx}o` zv;>^=iCN{wi12zeo`3I4s$5Q*gZrT8_i->#K}74-FwO`fEJ>=-{pZ`>N7Lo$rg2v( z*Q<_OI^}A7nYr@23qPU-;YvsIIk|mpJQC74E%s3(Z_WvAgkF+~Aj{ZMWN?^@2r@>C zOd6hpM3N$uNzo7}cnTYZrBCX9O^n}(k=lf_O=o=_FLO70g0=ofAo%v?ALRn*rLw>v znYDoz```M7(``Gp!#iYL#y+mM_7;&@r9GDd&!+W$dpa%|2U+_;U3VN?XK z0yHG09Iy66R)O^bUg1v1D$%z&r*2Vc$_!;I_p;uC{}b+!1L zPmcgbfK;A$7gJVdBmok#TpT(wzte*hgke;MEZP3UQ?ior?YUgEbVSg0<#MCh%NUC-e2CI#c3 zFi9E08yI9sK3jpzQhLMVW(~kOH*cVLgaFflb_3I__ zll4myRX8E$Eq!&9jAW6IT6DeJ9({7l>U5F}(=+dP{XtKTLZ`U=RFtPba+r>HiLZcY zuT9Xx++fy)YqpwDVLsDeR0-vdHV?ApmgaY5E44BCBz z#XFjLj~}2kOAhktS~H!)A()PRjuj4sg#w4EII$8?KdiQXqj?l|KC;=|VO zc(#lrh1oa8EZ$FR>U!6P=2cD|PHIDc`IT>WBKR_1qhT+A{@Sa+yN_vd(Qogb0(;Xx zqaK_={=_mT66roz1aSoN4+^G8(p3JI09Vgin<@yc*bZ|<{O47%g>x1O;>>2V?>P>6 zvPYFY9Q+K9YJ0_T=ODmm8O}V$Nmus9$j)vAX#J=Mla8TfH-KYKuM%Rr)1zFAQT{wv zyY4P{& z%NtA_`EO|K@`!6*6E`0UDh|af=ehd@;Kk&D?9=X1;a-V*U#?KPa-8%gJa?;ei#Ei~ z_;aA}Cjfalqq^+f0M4YrKC~uc{-8uoQKb+9GEe|8D_*4CvQY4Nz6F`1k@9z=v8*Bi zrRYtCk14y!2ONEz-2iVOFOvq9Tma;RGobkVB|Anw;_zkQTx=SbYdrY0&~)C!!}CKq zI~`9y?0w=XA*0j`jZ*m3E zwBtCQ`wK8M<+p!OJt~>v;my92;I!Jh=-3aE9bZlBCCOVMG7lyDPX#=$%!rDAscI8w zHMx_uTYG*dSY(U=;4lQl0KrTTVLpOCcckwp@gl`%pa!!gmMP7Y68!mk%T+Ffj!fs5 znCi^cv#Pl|>N{PL?2w(CQ*q`A8{abyVePjF6+M-11T%AtA^=iPBZ5oL2DwbNDE!YA z%I3jlD&r3KAjBNy6fF&st(P8OE=7QqL!7G@)et}xxO+v2!j(2`e20qiZad{`bxdJm z>tK{*`)1fDzO!pI5ga2v1f`D9hV)8A(2{?G773!ngK z4zIyhB6VTj>>f>h{pqnJIo5`&&w-V|NcjTmZujJ)d)6hgpju#qtXr5E zOtqtMFUQ^#=s2MXH=-O!9$UIqVvfJ33!&dEj#pmo?FzrBYnz?K!NCbRCqN#E;`R3} zK!hzZXL(`oY@O9N&DT8^X`-+ue6(H)3IUlR@_ZFRH2?IQMaGxD!PLXGVh{KDc<}>WkvRT%n|w4>mb0O*1m> z0%x9o(l~$+;h*CR`PNn_eAxNo?n@J)Xh+13FL#9i2{FLYa_Je{i$9Nfr$^@o9d9<{ z!?w$b|A?M6kGys;7xLfK)uaG$e%&N0Ej|IRz&@XHbX=n%^`QHOS%>?ViecAz-susc zLzWo_4c}DTG2=o>){@5gVf*yG@N8wIKfY?c3u7)1x9{t+zF4DN0yUw?`)<<0h**?O zmO8cLE&$84VebE!g=QENCe4cg5l5CyO^dIYZ*LPb#Cz0vum0#6E7)ArxIDXkNtSUh zLDd%!$PFr9UQH+U1uY@1>I8L-rdwt*VIy5 z-BR1!4p!$_O$n7YpM$#Bt55ZKEhY`+RNBP)#wDmp(!JoVt3OOjTH<(ZCL<33+dCE8Fr>uPKqG+!I=N}VADP`5zDa|qVK z3W7kk;_(k~ba2G)Q})a)X!MFuswFY_-*b@+Q#i zyY^Bti-GtgEoPyn#%UlU#`KF$UdZX8+ zU}l~wDhks0|5XuBSN+7g93n^^n}{?=3;bobdua~UO#&j1u0yC_i1lApJ4c=`_oN!K zs-bVgaXw<1z=xL!f#AGD=)JuD@*b0~L$wb3(=Ytp8od3T5BO~~29ta&`}<-wUoTeL zvD(_mG&W_@2~_hB3rgwqGLS==A)X^6qzGG2fB}|FBdUs<7i*M9ZtGL!FceBXSAD zr>KrPZTQLZ+3~D8KhvoS4S)z4LU}_WB%WL6+`WPYLS!xlgx`<=2AF#fq+6_Pw(lzL z;s=EAQL+VdiKQJSsPCrjw@xjaPM)$8+IRV@>2{`_aeX3H3wklkp9k@LD+oyUBVmYT z00ffn!pcT{&Y&0+3Lu1oX@=Wb@wVo}{l3RI)1NsTx4jHGNp#IvIlCT~MED&GMXGbb zUxm`cI~B>nB-L}^^w60;$(@td%gjv%*VuoBWFaglu>0St*g}Wb?T@2RUt*s!>sB4O zn@fph32}z#^I-<0Bq1NFT!FBVr@$obyz5O~m(@SDNA?r_^~qcAFIy(IdHjX_Zq+66 zLnB|6O!%sAUdY>yDRE|5iRMl!m+rh8c`dVT8|aB3Va653OHf823l`xoq2kA|&9Mi5pEU^_rNsx5^uPB*I{=Yc%cPL*8;a?-9|3hZh+#Fod z?iYM7$Lcc@y#u$SXRKggFJQZ=jpF>&j|bGUWF5Tj3;NB6B#^T&yDWK?tw7F|Jb+pa z=Zfd47+rOmo=zIdN$2Yn>d85w1-IF~(jcBg-3n%jI4g~@ar2y(yIa*4bl=2><4J(m=yP@TGb<6J! z5annq3-h{!+Ogyk2@&NbpcyaAOs__#67+k<8b~n0&tPinvHIfS!6C z0fZ3~!eJxe)@N@hn>^?KSMO&B`5?Kewcm{3#(4<-H)P`2_y3jAMCb*-m5d@vz zZ#>E25CCnPt$WAx@_twaTI&lOxu#jF(GgeK1Zfm@?Pi+E&APXrz4we9M-Ou_k%juz z4_F@t02vN}9h`rPy(KnedCNB?7v?SRB1_B;biCI@MFxKb=$AKM?|mj;nQCE&zI&jf zt*;8XL-_Ff+i#M|5GH9jR5}*LfiMz<;xhmr#YpiwA$&jtEQg1s*FxW*dB`nEl@FsG zR6SrH?l)mQ-P~-%kp2mBa}o5>E|ZHL!FyyaO#EMUfb{e)4|~}4nkbS6=88|!K9Qyq zmu0mt+1H`qRuA1#3@^6TxTi(LN86Q5R?Sa0blVF@~wdn9#DQA(b~l`+<)1( z!r0FA#W&{lKo!6uy1@4q0YNRL*W`0B}L|Gap0eHvY zHfnV%;`XCp^E?(9?aSekZ})U(Y|JyHHU%nzhzz=Ycb<9NDD}dYWli%!E#t0s+eUFF zBhp_HD8kP>|EJOi^1a5*z_#%jewD0-hj2G;DsLj?ZzJU10bO%naX>)}mb7*H>W1U? zpd>S3!xsu|;6#Oy^eZpcTPi&wPD8L!Pdxpz9E%=)uc4uQOnIYMZ-M>5o%LG&Ql4kZ zE`0g<89p}offf<{I{qJGP!~V3dSO4X9c{XdVOXIlxQ0wK;s~0A*Y3-idjf8+lU=+%z^;r7&j~kY2`ECN>7FSS+t>Baxe7bF*rUBZ@WXT< zczMQ(043rfj{_*)!cT@_qychJVgovxqvD#Kp@M~q3Mzjqz)#Mlx_^D|a^O1ryfx{ZBWK`) zMe=IQuoQsxh}|bdwaB5QfNGoyGz``8;df6PRm%<1e$Cv^U&t%=j`>J9w)c7Y32pvb zRwF#~>iSP^)t%R8-ICh4ublLSpM3f-^3M(lk%mO^tEyE{!31Dtotloz{pN>e6Qp4xS2Opdu{mb@h`e_7XL$s{K?*2=l2z~++L9-3{Jn_zF8%jtr^JbumaF)5Cn+Q9bH4? zFOE5dp0Zp&(w4ug*M@1Bkx&xr6kipzRH^_)N|M2(Lth#Cw9--lW^gyE~`P0|6Ue~UI0N*2L)Z$A1X)l{@d%Y9y z^_bwK&t~@>0R2-69RCi%G6FkI{L{!7ZeFKv`0+c>UZIS8_;fOFYk{FkoxltLj3`NIsg1`?e@7$De%WLP;lRA?< zAyq8T+^Tj~!F1Kdbf!Dj+8*#cIG?c#Y!NcFBceS0kA?(1sk@xt`|~_+gvJu+HoKdM zR5AP9o?OcH%{`=e(Rz6s&i60aTwV&64OswH2fSbeM|D{LT;()>{UY9D>hI=df=!9q z!w$NQkIxhuSE)WU+)*Lxb?kTT=H0SSMX`MFT!V>ME5p}yfFQ+BIK+hPLMTX{gm4}J zVkf(h#pFjoBMkkYdtvESZXuU&YuNp=xxMXS zoX3YTx|7FsxxEqYWU?g_;m&;wsz3obGm0~k5A_4MA6ZZU z+y_wJNL*53@J?DB8@JeUlPJ{R3|3+Pb1iaObGt0=ui=5+>d$0xcTp9qKfa8T(2KuC zeUu~aLWKMWIs^TWxVL_CU-h-d(_-Zpp1f%G4}|=^qR)$zFcy`S(3H7sU4OHO|8O^&zC<$xh&k<>nq5BPE>I`)I!`V!=IEE-22lJFAKY zA8HAtuZ%iv{@1sSH;`8yZA~S^976`yTEIN!H>UmYz2UO)WZJK4S@j1kfw3Fk-Itv} z?C*5pngka&1xkTdFa>_uT0wq6Q92m2o}JOp;ggas1=M~$Klb05^Z1xr=U!<^X3u)l zg&%y7lKpTw&b15MqSg4s+^g|uIVkP3h?{1|XMC4@Yf~N+6!HduqZOmXAqeRaEtn`N z3Z}=(+t%b$Xi`@mH1qJ(fi5t0=&by&N`hplo5(A4p@#;hd`LEB6z8jeI#MTYB(f7! zu7gRq)v!o#NkZ472XtnUZC>Hetv(dADbTdKLalomMxN{b4IjqG!N*Kg5b@dKRDOUZ zH}x*yU-%~m^w{jG$Yw=MYb6lgE4$&M8ng=GkYM;pd7Qi&G!)2Ul=Ae`kqmC9T?T2~(6U);L%MPCS)BVkc3jtis^Vfk_iVga>!WsD5$yI>q zpmvO1zeD&cDquA2Ps$1N%&+8S;T@MRem_*lxsAfdF1*QjKWK8dMGKJHyO4*fzu-o+ zaB_mu#t4PdAcJI^Cy5km&)Vp+&2a#%TL-j!tY>*jUmk%i|9BIOlQ|=UuN*@A&!gNW zso2bNewR6v@lHw+N!m~p%vZ!7%cD>i z9qRnJ2C}rHOdQ5*7LT6t>>YHSAj?bEU_kURKt6{LKh46^&B#4uQMyxU*h2p)#d2a& ztW#3ITFRA1cVf%%@{vvM;RD}KP{vtdapuh8p9xR((I#*UJ?gdont$~bg_SN*hTMJtS5xx+> zLDS4h0fpv?Gt^9blR?xSv-J45w$SH}>Doz$wlyxK z_KyB#YTafbHNxI#MxjrEs(B#Yj^C;kvakTH>K4iQy+K){+^v=VMDjg^nz91td|qw zR7n5F0JL^rUi}L3Ty|xHR>Z!?NN>vTr%8$DuzN+*ZhXRRmo9olb=-bzp)E2#z5GCn zNA!e6)pUxc__xFYEn3wIoZy>+@LelUa%AJCG6fAj5FvPGaNZ|a|L=bLaE%vh0(FI( zZ%oD#D)Js9s)Zoy#icvexiRGoBB-=;&cVS*GcZ(W%}eD)QlsU8j#UWIZD;+vu~~BP zgrL0+gZaI^zU)M?S}2=8NAY#@a$~ z0Wof#s@VAb?<`e&{zJd^`F*b1ln;KGnXv3;ZqOh0C9~!*4aju#sL#M8ju=)V@i+hz z9Lxf|4TkA(C__*HYjr*i-VE2WiE^j%Xnm_@UFI+-+nE z$_GEB5B{&yrlFq9`*lC%f|y3SwWU?H*~|WZ8yFxw2mo;>#pV(YtQDTEKC@x**ukfp zN&!#+d}a$^)*-{JopXi6duuK1`!XJw7OmUd>o^W?&#wTK4Qr()Zz<{ob%(Huj;mXx z=@S280Ej5Wi5&=o+-<^NOjgn2Wshe-w_T$B9SGKub+4yOPHlEmDvVsS6~Hx?CYOA{ zxfi5rhIk0Q4iuFQuEIv*v^dv;&~^|ygqh44%M8E;7x0zH$?P2&tNuYSrC}Ex^gl5I zvsffhS?g`9&HG$waQV6T$J0tLMAEK(0{~?^^afh(iYYA``N@@bQ9i%*YEFJt&yZa* zu@@`5CDNWyS)O@70tS=%o9b6Iq0%dEs_h1;|~0xlXQ` z=R`M3MCpsHW$oFg`6NoE`AL=M{mf<=-eAx*fXMmT93~WsAFHw@rOaPU{f7LL*=D*P z@*X6R;u-N2PG~U#I*k?oh-0tlZ5*s zjv!v$SqRL8u+8SO%`j@zu9;e;@ODVh4mDpY>I|;!XcF@Q-h^ zLIL~^8Zg`*f1q%fiVeR&Ea?nDD)>p_(G+p10d;kdcY_^Cvd;bCFKR@!ITj|vjh!4< zjXf$)`rX{s4~JV>YGjs=zq$%r1sld-Z@2K!F<7}jznH-$@j-%1u#)C4i~`ApPp33T zjR0^$8c1apP;A^uNaeWhL-LM=l-{mb>Z7>N&thUAJq7EgHJ$MPt7P0X7kVjJ$lsLu z9G}YBK?TQ38Co&5CYa0(s&oxF`er@^xb+w;G&`BDCPZ*~@+mx4xXr4M&F4CS;&`0) z3xJoS7~)AP`{+CKV(Q@cxU!h8z}paA1zFehngUOs53wT> zsMQ8vxNb$47C^qidt(lYIYHv4b=KvV;~W>6F?%YHve&NfyN!RbmA(*@N^-m&mqP-kdED ze4b05$ChUy#xo3x>K63HX#&bm+Cy;CR*!$MW;z!=mb0Hif{J#dlggrJhclXd6{KRC zBv1pl=0X38wT#?`*$&87TyRWX75QD@|ALb@j?{J`@>D5I(cKG;0kluEiF#|3uFLW> zF6`N5Q_0&Y6!%5+JnxcD(yO9}L=HZT*o?*=k6(^|?ef#?;kd=-h;|hl)PxxbqhV(% z-JdhV@Itsu=>SC>g_z7}BRgK6Ad9B~bGcEAX6o%LuTO@(8$q;)fk=bg9V2@K5&A%+ zI^cJFP&ICxAE%WPbP-%O$*|EiVF1AN^5km%a2DNL)2q0N_^uHNZv*&m`VyGt)xE4lbaolczt_&4`b_tb3fdls^ETTBzjD7)z z%5G%N%h|4h{=3}*es8voD-w%#OIw6tW5B?01G}x9V9+<#AkCW`p^g6~l^rIjbB7Fx z$LA;Qu_8zjFf7s|BzD)Y6|Lv_d0gyzcX~J&-|QhDe(6OU%i8`5R~qHo%p!o%t*mZ4 z9FWj%b#^RS=`7j#_0sUbm_9#kA>Zxl+|JV7AsI1hszE2(u;kd4pT)7B2@Id~up^+G zJ###jm?WXzaJ&a$4nivydQAd_htLq5z^tgarMimipIU#mc`>t$o@Y{aB3fgK;;h2}}y@H~2jG&Ncf+(li;CLC8UDb!IJ+f>rHK zNKxxsQuF`;s9mSPe{nh1xf0W##rxt^?HlvZPj_5BiTq3an+Z8`n%Iz09)>Lz=$# z^ZU00RVz_kh}_YCa0m`KjsX-g zf;Yg3>}NJNYv$@iFdUa`=dg}s=sPDLd=+{zGR45_g}w;T&q&`gc1Y(H{h|{6>J=TR zCthE-U;x-V@%7$rfK!W=FOb z%VIc1o$!L7$a1tbo{>eeE69h}+ z_=2I(?~)L%ZnCTj$XdnG$>6xT&+5dvyf~HZyo!oE&KK5RAB>wHCgB%M?$mo|7Mu^( zxCi75*lNTMgDKI<$qRkfN8n{{5-<5A9;eF&uty3-0VZj!2BwygnUz(O*m0S01bLOz z(D?a)Z3!5!HD(h01{^J?;~ z^7;$gopj|wp2z$PWlnlmfe#QY2c8Or0@RSA688Wk7Z=fj%bbP?1__u6Z|Fw29Tv52 zJfH;Yl&L;wjw9)0sVJWd&a?Fe@`%Ne>Bj(VDo!n2p17UxVQWNV z+zvujTo9OA9Ax~N$h!BvUurXtR5v(P$p%Omkk{*Ba9#kr3XHH^HN0ezFX+EepzcZQ zUT89i8FQ(!XC-aZ-Bqto{jR+U>A2!=s$Jm_($5?^pYaa0?TctF<7o^hvT#IGzz6_} z7Ad3b0+uaM8T45WA6wAV&^yZVxzdZ<4chQG4vE z2DLI=Hf_=r9RkYZ06+(=J3eelq+CWr*+tFX ze2=Vyy*w{cVG7m#i=kcA76{^~zlbN3ar7!M-e?A}4ty2-mO@a1=Ipan>&4&bAN9A} z{l^bBr%A^Qsd8t;%#BNHrng{(u?cyU?N^B}K|-%yAwYw}&dOfm>t???(cCLmGw*N0 z_eYd;FA8yC7c9E?$-LMd`oI@A4Fgg523E`-j0{dO1lyiJM15JI)_Kr&XuL&VddV|>89D9Nk6e1=6?#iRtQ`B zQ3J>aJt2jgwoGNX&gcVx!VQMD=eDVCnQOC}bn929JBWAg% zFDeV#WOIuR-{&ZNk|=eKLX(j{8p6d!1EB+;Y628E8PuE4038JG1?h-2{3nKp~yxce_i6w1=DwQq@UcsodlgUAt00_=hY2vK*93_Xu^z%OLR=OmH zN6~6>k23MnV~FWnhe_c+!NblS4}qmkzmB5jX8?IwpJ2-9w5m-YwEi=ksd9>-%)cjK zK%Z;38)~t6Feazz!{%V?sP9~s9kEY~S zLIs}%?V}s#xL)N29E`Ii3JKDD|7lYrdy;rzs+&5>N8Urat+nUR{7(M{>uljS5($bI zNp)zv>~tCh07qIFsh-YSg1()ZR3M-SzDXDUdB;L4U!>@QWK-r};BQ-5Y;|Gd%LO3! z+Ht(GBZff{{0$VU!DNzaDDUBLq|6iS;jww z!OHooCkG6co7DjncF?I+f)(gt7=XU*;X0V0Zz^V+D$A@r1CVRg9hr(-)i%diDvuxNEefV1jeO>!SGmu_FJ`n~uB2dwRG#GY(gNuqx!^ZUdH^lTTFC;D>``$6} zvv)R-DZO1V>*e)8qlq*?x?YJ1jIe$yOeDMy!FYRl{kIL`x}+I7Cj0KqmCsIeIvK@X zd1Ia9g{{AhY^l*6KedT-SRt1E>E)d@aCYAR9Oz~yc5wp5fyunD?#NnJpYsqV#cz?G zhnHTNyCgaJwC>*PI3q`r*3I)z0y>x-NM*0?_s(?RgRscSu*&8A%U1sJ?I)Ev0-(x( zKuy0)0^S6)7^v=!27_Ye#cvZuS2vP(ILy8$SDxp%UpR#{&_@w}G0-d0F3~9TYMvc#=nIC_UuZ)f25VVh0VHvob681K*LkE@r+$BU#~tQ z$g=zv#89qVBZ%iTy}qUgF0zivXO$i|5f$~BZzAc!>c1P#EBAhv5@>-Jf8aM`YURNT z75^J-b`yiS4VM%b(eVI|Vo#P{@Z3EI@)aNF&c@7x5JQ8kvBNl{QO4IAKX*S1xC%d- zsc`yR;&{s?Z0xC8$j*D!>%Tt%eHP_fU!LFKM)`|E+0aZt5R8l`fa*6e32+Fm(+0{Z zfP=NUygh+091bMd50&JtvB8Sre$=1x?G6sNXI4d8Sn;QRg*1rs<)&B#1#meFpr0It zwbhpz{lg7xTXM~XsmZ7w7WoAKToneNSaT03_jGmkkq_^UO6n@SOV?5YB8hgDx*+0g z5MK&nAHhMM5Otc&Iwh}+J__oN+m0%coyz`Td*Sfkv~a!OjVTI+9lN3Y&TE%YiOzJR z8{cMus!yK!e#>i)EkfB)0f@@)?q#~yv7iH(O6y#q%S zWB5P$0WZ!CUbyyvzesk6KJ>r5ai7_^;M_%n>4=QQ$Or9p$S}?2Pm{t@y9G*P6TdaC z)iz(9EerF(%dXALK!I{*;wcn5OMBstvCPArQq58E;f?!LW{D-(K}Cb#FT#a{8$Q#& zW^Wf_jDN4TYF(`*tI5^#HSGQ)xy1PSJTY@Q^BVxb2S9D`fE}b82JYaT0J^rb-28F# z#Lp(TzFY}Dp0O&2J=XpAPSZdnQ&}1~eg1Y*(>5Uoy>zp2at#Ce8ol#c`LPL7uldAk zU_05dV;gJCT2wcDdHS_J>D{H()S3A3zngW7TCYFW2tQk$JiGyrPXT;8bPs{4I%g<7 zx^aH6aJagvQsU6vXOryG!fUgu(LcjjlR0Z7VxS{cecGjgrRow1zI6-nPkN=46<6sV z&5}PEWhog!_XQkui&BB39{70_n-f?cA&6!e7~yCKe+9 z6iI$1D@Vb}Q)`>(>vuI#;EDlk4bDy`@R8H0F1b$)RgvV3#h|Rco>nn4-ntdwT|Hzu z3}=Zq!Ln8sH9&xdldEJzJjL2=9hSR6?T(TTb9Psn8GBEfL#{lxW7_-kTYuhSlQRFY zloTcDo1*u}>0Je-ho7{P+LwMOR-Yq6Zd_A*Ys7@JtNtbHUTPb3ygqZLMkKQX<5_P0{=M$)FofbBB51X`J{ILO^ z$t3ylO}#Fr+T|;q!j*5I0S2GUIfhhF=Y@U2_y(P<^Q*;gE~Ujy+b)~`gO!EA*C(rE z;)Vg=U3Qz+dF4fD>NPQzb03MB2ujEA5UN)fg*3O#lyZgsZ~2J!Fl&@lxO~v zj{V8*-8m^crTP%TH8B>a8wlVrt=o!I`IKX zDAaS$eTP$t^@?>6`;j7cP)bq!=*^xX5PnYn<=79my(9AtUspH*c#cU1SkYMY@kl~Z zo&VO*fS}{`a4*A_ev(hYa9v>CZdq?Q_dx&SJYEA+_Q+*n1xUz+3&_y#L}fPgt&6 z<{jZzLpP&AO@6PlVHt+WpMQ(F-W`3K4*A<(s7{@0U)xtO>&Z9M(upN+tnz zIf2)PzDZ4<(t?~b6c^ve2pf2t z{C$%xHyyUW;90Esgf$_H6nBhVTdyi9TD)E(x>_S^WJY(f;AFz`PcJ6V+`d}=UED3` zU%FvgQ8prh2;30h3^ZkOAwarm*}1^V<#@4O+FkMq(fFq|JJ>>OEJ{1{KXE5b*Es?g z>>jheb-=~4fXEKoCJ=*oRx5swet9)ud2>9hzL!s18W5LZc%^%*eDs>q0jah{kmTI8 z``lPnP7fetBMO_2pnEQqL$|{}D{edob)#q_OV7o4elqJdnR%ASQV2|xbwB00C{@5L3S!tYm zDhwJH9||E`S@hY#1%i5Mn@FzwZR3rowct*cHVrm9189T8zDRorp~7Q(F}&817YQ zxiIue)~m-p6lXrzIVvRI6&iRFY{=pLdS%pDjb3z+=`F;n8x86am|ozL(U}Q`h+=RE zA_NSJcgu`=_ML^Qfj^mNGbS7kQqn`0hP=y6os=o!HDv7}32*H1XSPa5__t`q|_dV*Xz9j55 zOQ!Vq`spVfSNjb23CDwp;<&)H(y*;wd0TrnQ(hPjPOh8hM;rxItiCZSySmac(aDIh zL%C?%@J|P>@i9Vhfp4K_*v{kiV*`z44q5}lbTA>to7Df))!QgdQ6>kS`*?J*N&V9y^yqTJ>meT41)vz0Rpa%r$;KPM~Yfm4A`4*V}EU|8>L8a z`^=nVqUW+Gl8alt&78gYGG6n*&Comu2oRkOyx(+SaBXbfBBV7jW;K+??D8hm0pD1?x@&LDQcNm8`fJDgvXO=oo7ijZ~WC@ki zPi3T9AG8@oh;kXMio=C(0KCt5EN(Aeq?EeFL>Gkd{cqcz^My47UJ79sqAflDP-?HB z#_t7sf4IxH4AMM~H4b5$dj^nKWkV_5fH@s82#ezCR4&Y1R$-o3Z4cv;c+qzIyZZN1tZ`Q3(1EFYzm+={;3&Nq%3PO-1- zO}B?o(15CLOk8XjbIdc~q6}}lJN zeg?qzbR2Rea4*Uhfops|JlwcG-&JksJ@l6tMVR(d^5*ggf5M}T%7#fd5aIx!%q0Ua*TD#+Tj;4bT zzXx(E1M7eEk zX~JW%0h^7y2-@Ki%zQ`N7e383xfKSQy_%nUZ2Li>Zxf>{1Ui>?zGD3nI0t;mDUVyHRfY^0 z0$5sbNlj}-j>J)5ZorTL6107wcU9IVq@}b)Dp+Q|phxLi8KYfV5W~scIO8rBJE=7K zrlvC**mE=_ch#G{l8gPk2eo&*wHbHXf7l`KK5ngBGQA) zR02}bK6?HBx?ogof>}jFq2wKppVL43CTwpy{C=~d_kib1Ov-@cNN)f)0eUr0VzRfC z?pGSaXB>`R1`sv3nww1CK%?jk1t`n`I+-&kTO3GN%YC*U+&X!NzH~f8ipsQPeBQyYJz*MX3;*#oM0Ck5j9(6t4i~45dTj6-Uj$32z6m0+g zV@*BsxDCO3(N6*=`M`k$gcaI-O8Rm0)ji>;dhOWDGPP2|so0UndcyjSvvFhE$?-WF z1F_}QjJ!I6D`n?1IW<{Ej}M441UeKBdIxc1nqUT2dCGKR5*&~=fc@;`xlJF+E`+q( zhg0*u`fw7lEq)_~>!N{HIEBI^K(u}1tp)_YUN^GulIc z?^E6&!1*)j#9^aaNBGfg$m=nYsk^LGPhP_K6)(iu8=H0e(qO2$1Zin-KsGG^u}VOS z;Tr*&v(B)2J2`5kxI$>>nb(ICkL~&_x$_?U!AKq&fbI0T3h%WPxnWTJ@+A^`HhiqC zFIVeH<)e`~AERO4>7lTHG?Nz5dU|lBUW^GbIsDYsRCI`auQnJ$+|9=qsPoj*1HIat z|M)38e6pTPNFd|In-D-ic zqX5D1==hInv*0J8PD%hITFO9<4k^(4+YSC>kMAA|8~P+1zq6|eIJ75aMg8{Au1a`T z9NuoRYy2UZ|E|-eyPgk^xLz+M-D^cE9|;)tD4kymvPoBMlp|Qj(ExPaG(cJ!9^g{a zAy9&pC{qw*e6~nDe%m`1pBPDE*p? zo9KD|1OC%oGENK#?UWw&Mjv0+A01!|?!WDIdhmU+pNL=UA7cF|)LB5)5!h-X1;JCT z9i~O=&B-Uscd1I2^LF{aT$s7BTzO^iXzyp)>sHzF^T#w6b*~ zX zjBPH);fiK*)$gMHA*K#UYAOOSr&!y)LdHAA@r79#GkPv~q}-dZCB2AUtab0w+Q^VG z($utUw>fm$P4FITG8u7r^2L7o4R%KFHJc!_j4r3nC0@E>7)sHKRR*9E4HSxov=M-5 zG6&TB%-ieB%Ni+c5(al&UVZRCocD>7;~y#?;&FOxL$;Z^){YShL5KYhK!Mtk6-~KL zar==NeyxjGWbVZ&`*egjZQ|j?z~+lRV4NH?yJm?4F_jQ}4Q^(Wo>-PKUAotABrRUI zI+A5E_*MF@FV(oBrf|7hNbcTGqkdy4?Oet?nm_Bm0QB#k-asjkT~&-J2)eiP%oeTi z`EVU!Q(Pc|-7vQohvCE#y&yOMLI)=1H@zlY7IqbiJcsPHw;M*czNW7f+8ZeRhS5Li z14_dk|5iSU@W-iBmzy$jgo5t{frIET?a?2WFKRj?ZnCI%H5FvCK6-ndz+NKg`j_{K z!``~HBLt{Cg`ncNiTl#T4o#28Coa-xy^)mCJHPE*`{b*Njbb@0A2m; zmwc8tV(5Dq7}g7(%L`JPJ_^|;Ol~kXtjS{$p0N8Z=h1SvFMCpPW}` zx6~4PSXs#lXQL!Bs1Nw*#H}BFARS)2M%Ts4Iv!x`2>_qu@p&>zf|UmxgvsKSIp%G* zyj+tCj|Q}s-TGnGo2?B_cjj{<+cR$(&04j;5gV3A1b^`|d|THFzu)69gJFaOO>?lp zsLW`W+akL;AV^#=vnc=v#~kt7O?g@`YU~-np}I-De~g^9=~+t-bAzpsqSMW{pmM{Y z*h&+5QW;Doc$&Wg8|DF~j&N|wb+bHga%$nkLUEq>F@khD#_gcYMx^lt=Dz}WMTpza zsrTj%t=k%OWS=laSV?1jh^j^xV{_+)UgReY#~_ZG#ZvQZ4EIt>??MAIb=$QfqUmk4 z2{1+Xr@>IfG|mbS69uT)=$M@l1jr>k6pRYCe~#WUYi@R+scx<&4S)KyC=9d=;0j>T ze=^>Bm;DZ(=Cz@V4r`dRN)Ftl`O{CTvjo4md7;mJRW`fUe4nlE_|RX{5V9I@EKT$< zz5+}HP)K+|_Pn566`Xms9|kAXtjVPO+24FAg+w=c3#mFjKx1EIIVxa=!%?N`*GUU#tB*)#^t_MJ}A2cB<49Dth=EFp>4tzDXb zL=_C(GCruBFNiO(hk&mmN=rePA(j5H%iW_+!|Q)O`z$MS`W+tB^GdOLXw1Ki`90|O zaNFMBNT9dGdO}<7#Vb~IrdVo?N(7!2<@f`?c;vyQPRC9UGmRca2O^+|MifBze{m8_ z#h}Cfhm-IDCmKZzH0^9(D~gH=N-7IVN{T-h6yy{X7v*M_WEJQB_tVs_mBC0Xe9gB{ zOLwyRB4GwgSkdn$W%N(%tj}1ih$ajw2>cKKMjP0M>5kLX#xA1IzmGVrnrfQ8b^0+m zf8ca_$r^%HSW{$D`=|(HrTRJMQP9 zy3H{L3LfK0x-T@dha@fhQdOZ5N*k)vNz(ugyRNEiM=u>$U31%&Kr=X$c+JRCX?XYC`VwrbrHA>RHFB5@derp*T6CmRi<#DN=cLY@VG z)f}OS>N*V$(geiq%sO~e*Y6zdG-`p;JgK~Y2WDR_HmF}?d7W-69eK)3`k05`*-q#k z5vwvDU+vqtXK+88LLh&soBm+*u|(^Nqnqv~xZ<}6QI6q_HLbekHZAW9h3m~jvdr*^ zP!@bB0BM^GjBX692?g^X7Zqr>9*HDTHckA`zgpYr`RYRpfeiV#?29sQpFyxp(f=V0 zTo?&J3keA{#dnbiL8FiZe338aTqmz34b-QgEf1W9&9|53wW^-9iPNtu^5|Q zdxI5j(aD(+4ebj5q&7V%`~==nvEFPLu4p-#PPWg?4}-n7?LSJaYzxi)_}bN3_i;ty za|Pj6WEkZ)%6O{ic~1l<6A?!SxPaf2I${#4))N24x*o|uLh^!L8kj^p7grZ-S}6=r zY-aZ-o`BkSl*)7D|K{kpO1+@wpI9uGp6(``KL6UVl%=%c4{}p)+KWKj(^DQ%u?Yxp zjK;HyF_5(g_q=X+#ym4xcRj(K=gW&K^5IzziqP{GMJci_sYWWhHLMPI(+;D zuJ~+iD3G=}O4CN`{%~AoIXU7Cyk(+imEF0Hf^$(Je>5s%BybcQR5ER}0Jwh!J=}j# z6U)Ko!3Wm;y(ELUM2hlm0w@0C-0^F2DpZ~=FMv|oXI$1tW z*Y07%(TwxZ7`O1lMlJf|rHD6=Vp>6l^r=a-n~89Tzmllg4?Q)KCBEH1I~Ipk67oqr zN?nMj?Y}oKC%!vYaq5L5`7ZqF&{wsuY8LS{9l(4f^F<*)DtnQ$Xz9w}!rlA|pF zQ6i)jq7J|?__HZN*^ad4Jp0a_N3T9Oj4v33a-^BITgwtrzw(5%_$m2bA&{UL7I<(m zH^r09?If~#n=}XC2@hV>wGB2sDeBVlaa^sY{N7T65WN;mizjvgRgfcN;c}hx&3acQ zcZiJ4JBgP1w)(3rE9VqS85uc!M5;#hX6xd8#_LauU!Mpb%0fb1!=~OlD4-q>Q&1la z-`ei0S-~VGIal2P2<*wgHxS{5fgpu&2!KNDzj=|-fv2S8A3Lx(tr(~XODr*Kf34Ms zTBJ>1^jY|sqGN#1i+?${J`O!y#5(|%_nP%8LNJud2Tp7>XUPqJr|*;Z;=Z(+ zIZarT%w{(Jx6+CGvR2LXt-!8SUz+ksQNZaGhWY#8+vH)EA0^?ig1PqFRTYm+&3@w( ze;+?XpJAuHniz9l_X&^l7VX-aZ``t9*j>sC+47v>kbw!|7Mw>!)u^9%`96g};bM;) zA!Nh!%hB9xuUo(l78IhO0nL4I@XxJmI!I_BNM=4Yv(8!dx}7x-f5rBbW8I=eI1tNrsE?GttM`XX72%|xR9v-Xh+oh7USW>A{1%tyg zZ}kr|qk)}}X-JoZzPdZ4Is{Whkp>o|U~uS!yn4Cq?d`gE;pi_#=O@^sk2U2u@vOev zbViT9PaXNS$N!tw2oj1$D#37<=k9V}?7nkX&(J}j0mwMl^)Lv2C?tIaS|K;+l{weJ zzqIF&!u_z;sO8qLphOYN2b4(Sfl9J5U9_X|(BKD< zAqzrZtPP6_=BSjg$EKl&DL+mpI8 z0fUmY0sh(ajv;|d@DVlQrSpCXBKb+8F9Z^vlr6fN)O2)qs7^1GVDC-_|7^X)+9s?& zKBh^9uKqSOW&R4d8uK9&l|>omxyQiu0Y-SPLx3P?@GvnPa25gw6_RBJf0kkml|Yw1 zcW|Uv{r(VH4O!AoGtm^JwJSIMfTHE02?mcE@CEuJ;70DmpKCWF*69rz-No5E>7}c?JS{u{nk9V5`G`@zDeF#;_%Ed4`0FHv=alx=m$m286 z$?@1>g$jd&K`1X+qAe|J3aU$)hBWx%G9?Nh7^AsEf}Q?DQ4wy)e^;mX*tP!V?a4)g)V~vsj(Yaj9*XDnro1a!ASix-Y$SMVC;XwF`u>dX*i`8V z73tAnV-)=QM{8)i8ViX<;m<|G_--g~U$A0t?RxJ&J5Pf1wgEq_z=cq z1zdH)!_e?YL1&gqZr2F*FLc|<_P+;jtC~Ve=&da3JJIAn*o81i4%PIriYWlq5xGTsy?Mr$OTwO*I7G4fVr3krVle z%BaTKp|D19@(m`hH~8<~ehjYM-G4GrxhHjn)w@z%`>-qJ8~q2!`V2p63H*LMfZv1| zPL+^;iJK(kRA-%^bs4t1N7BbeEgiU{^X;8&l)te(yVr z{=RbZ*6KZM2viC;3miAC8fx=|^mGHIQMA&1&>^tXd zD#UrY0V&})?ZSvx-m|HJ;I=O}{*JELiV|J@rn{%}e4uV%>3#0;81wL__e^VQ(ySj8 z2X>!iSzG#N*;YJK%dLPXrO+xpO(mRMqB?&?$8p2Dy3Jb@t@b0G8_h9{b0Ui&Vy*#q z5N+%rT?kGA9<_?Wg7`$!++f-HiGljuJ~*eS3Ub@zwp%gSI&*HA?FD1NSirS+pJ=wm z>-){XKHFY&*3JE7Ay+UF#0cD1G?zoq}G;Kr%mM{;5No3^(btIL`GIm{idFMXHaay>!Kbbh;pQ2HzG)@1mUdd{!AM%D~3(l$R{KKuo)#G8gr_`YAToesR*vQ`sRfr>Z}|CLDf1XRQqt+;$n z>IP<7x3~P)BO)Y%|1TJ=84#*y`!jF=(^;k+^t>vmYB$UbR*#>4WlNV)+u=Z^Y;CTC zix+!>nja3|M4r7-24D!xF13|;*KcIdp4_}f6MxK~Bk_IWWRK$dmzkN_+WSxT%9}Lv zbnY%Nwmkfh^EsiQz$$*XW>eFx=GC(XH_HHV>jIOH4<@#pIwLEOn?^lsk+F!aS?E6& zAH|fhE=`#Xw+F?!YXOP353P1xu4>?3Ji|i;a|nX?Kta&gouU$ zVm2;DB23bb8=N4rnc?GI(L5iO0FiUUI-74rPN&9B1U{Rm-tYaG3Nkqj7mHKvXJvaH zW!Ka^)BEk2XjfbU!=RC3Wy<5b4QYVFuvoL<32({G|D9Yl9^KB_o`Q%4=C$l}fwm-j%HQ zQ;n$l>`)&-0aw3DFt&)u72HP!)QAZ9{f+|Vn%4hlx z*z{k8R>caUI54R#5NlC14IsnHCk^NX!@ zsm#jW**eCtvMNIM&PYB+WUoUivZJibjO-%GIQ;JC==1%4f6uEw&L3Vq_jBFXcwg`P zx~^LnoJs%XCA|O3OZWl>rOP5nuoagTrsw3p$j{F${wFuD;AM7kUSV!QUREmjJXtu^ zFee4u(b!~NNFjw`GT>^i%#A>*mqoyn*ua-v7UQfrbejCKYH@ck#h>D~`_8v#b`s$m z)d39#;p0q{=CXv7B&VJkjcl_$x_0fOFv4eEK-{ECnk1>G@&2&=$?}i!w)efX7v5}| z?n##r_GxU}PGI>RRHWQ|!PW28cciYNnT7;asx*tVHI`;cPgA1EE^w~3lTVdo&4p^Co=4t@`-Hk@ANhZm!ATWhZIerAYa2GwWEpd<>$Xu!fpR|{zf zghzj>8|2DJA!aM|#j{}-OfGNwZdONaUcm{F4dd0m-5VRPxkjHlNnypqGE4uaaJ={6 zxnr9kA_LOG>tY#kRHF(T@lRHx50# z0QgK;ZMb6^^ws*C9EFd)&!%R$b@9MnM5N@{U4+@w==ksN^s{Y-160*=6blP)CO05)w}q(;0Vea-(u!2^ zcUv8kN(IAgj<;gK3ZXttN}FWFIksUP&#TM|o6M9mbEU$Ue3&U^&o*DFiaX;rl^ld; z^TkLfi@4ppxRE1l5wzasq?1jj_UEBISGq#;kmlEml@aIjm4j<3%XF1E!y+^oPno$HpfN&r_)(QhnrfeeN}srN3Qi zY0B+L&PDs7LF4?|Ne@Z;v~7}2mLa#NhUcxLBA@f#J4`qjiS&P+!`pF_zo`2#URGSu zl)&<$tSRQ)NsI52p_0g{c8FXH;i3qITqMCv!P@97qCnI}r>1z(JRAtSiVs|s&2B5l zAi0%Sf`RG4#!lO3nl5!^>O$-?#n;W+ot-=?=*7BI@V#&0dT1`)EPsJ@-sHm^tMrkV zPyT7@7xKG7^Xs(B(k!AYO6UV~={1SH*~n>kVZ#IeKE+D=pE-wY`K_PMhM#dOdxx&g zh*(QjY0bpVcIiPIdjaHF)u_A18cV0ImOtED7-Q2}gy{Wgo6QMjbx1h}-)w`6N&Xy&M zd29AUv{W`50vFv3Ep$X1i!&Hq$@;>LdnOD25Y)7Ucz@N_{Gg~+NVVoM>Xh4l6{z18 ztXz$k%g?!u3AvhM+;8*f*c66Ta3k;q3zQIpATtIxakJt<9!BsI;R1pLs~j0iC$5r~ zS-wLuF+t)P#wsrSQ7{cDSmjIQT+zi2|2_QU2akP}$Mej>*4o|!tUbW5s1$4hN7= zuuje$%Uz`T&LHII$=k%@L78+?KhDX96^9zZ;SlDw&~X6_n74c6EdR=KeEEbSEKBqK zDc*adf}r=xoWajq3_b*cAkiwnL38s<48Ev<5fhXd^y3@#ah$Fyn_q?_Gn3J@j0J;~ zUWWbFPg1PcS?|kQy8fYEuE%yi8{OOckxp;8zpE)?b=6U$s;KkXi=8fE=kuwqrv!SN zPFJA#-7D$Cs%{0@J3iu-hUiFp@PVW#F4}g;j?)E-L4*YX(}r=DsAS7cP#@L(uWhq7 zo5Vj*J&y(>qXk&0gN{NFG%Nj_dlD~p;y%Z))gPyoF0a51YyYPXLS&FH!pe|Avn#1{ z)6x9X-m9w-_TR)!hSprS;xkPTt;c@d_m}A2lI)$25K{CsRIu(l_{=-&#~z^IH1H|9 z@can32!gvloyC7@q~}U=j%nskHoMx})TApy7H6_(Nz#tNEEfl;*npL@kV}KO?ez)L zKui0m#4;xKvcD%5E?HEl^C~@L1<5yTLW)Y>a~~9b+hr|l+)AUYug;XJv{_)xx8?yI z@BU5IbVEL(x2ji*gd0;_Y(q08CvCg^O#X4}esZWMOLaLtQuN1K*s@;ZT=32*6SJo4 z7dJWXBsU2M)UPhkN_ncs5t^_1T-=>ft?6F zu#Mj+hoNNBwjq7O^ce|KqcXD8z8|0=76w*iBwdo4#ixb3(w_bD89r6AEX=Z?`mBZ~ z&6$NUgdKD6KsOFGn=+5uHz&2#Oc7-GTJ=GqCAc|gO~S27e_~6J+T(NMO=k0Tt zsB~(bnEGirX!-K?-fVl(SoI%#Qi$jepw{Y>#uwp2WdPal>8TGx=3*)WLj7G#q^b+>!u9shHf?MHsl{7sM9!y)- zJz8ydYI|%sYTk>6?HCL{HQ;_={&U=uNy~3e+AHY~DHkX1!U8oKUxkEll^|#(8C$sgQWyT=h;h00f2*RjH08^@B5o&6lG*b8HxRv;hs+N`! zOLMb%(@PGV9=MQAz^7;{nc=$U)TcP{0rVxSaF!Wy!!s_^(ro9o-r0Y&EIBOjqFH}r zpCOpED)NKdUmdS|a0mTnh1Jc$?aj*T_sNCtEin~sg2wjX6e$+bj#nb(1kL_OMtgWP#UJZ0~l!z5Bc zStx}|W2~%#@u9Av>%Rlsb|`hF_N~U=7IC#m5TZ?gpNRamxtdq&{1-+PN~ z>GdS(9+{0VA~@O~6dYNSljns6KP$IRSgZTmOTJWeGGaOlh9_KCjE5v3>RMqOD|8$* znS+S#Rq70+3Gih-QA^9v5Kg6RB&eJJ7dY@zg4c=fM#bdslS7IhJlHH}iVOCxjct7^ zf-W6QS3ngzoY{EOrJO2`};s>^3pyaZ$<6778M_cM(;zK%&8L<2#HoA;`cYcc?O(ZJ30WCOxGO|whljv^)=L9aTi)we%0I$Ne{m+a|$ zwWwIsOPmj;iX*%#kfHjxUSL$_1JRC!3>Az@yz^8Rs*qBY&=d$c zyUznnzCr3PgkC;Kj5OJ=6St02(5PI;ao3{clhwG_GK^GU6RFc*DtNX^sxH0R3x_R1|jc)^F74EXT}lBcw9@xmoVL zB30Ql>0yuE+J|xrIaun7RYIU`r~XajU)G87uYP#3U&78_e665iykO`#J{S37PPL%+ zaOV#je{~1>pU1vG-hK6!(i$sfL@d!>RALN?_{E%hXH!8&mfl5i9ZY`#2XDA5lsNc| zrG7{jI7^UEaIRhx0QtnUodkU_7>4m0G}9kVIe;M2Z$%ujow^BP_-|Zif3NO1)aYtl zI+(jLh(pYunIBW!l9T3`t~(~>O400lX?~R_xf}bpLn5%pEX#1*#ebH|nLa7C&FhwL5=$LE-0(uPa z2fW|KUPt>aw*&(uH1z=HGlTiDDq3D;P;N=AxP%~c{;bMH?`^ws@!)Z)36e-Ej>@uh z!rccs3#xZp-P7MWG+kS-x_hj*Ue45lp zyOujT0M)@iI5r^bLl%#cKQze_N#Q9S zT|Foq#oS(~yB6@n^pl|4+Yq97`2Js}!4EJEr!>3> zoY{%ViE$ZOsj11&<6{zH(z0R_3oNBkU#mPfM+?5E)_%D0t;r*dODkT( zHpt#0EF?U!^+_x%!9^%qCD)K|L-jE< zW6~BiZc4gz81E2odVe=cxFS8dBJ!4OkuCXDsA<(m>Qa|hSR%gx%T2qx0@MpU?ZbfF7v>=$h?V*MlV<(yx}H18n+(4Y z{*ME+OX#HLzBQi^u7d3SJk_=?Dy76fKAIEPGYyI;pV^*=;PW%;rDyaiB zUS`(02Rvl58bh@#l#i}@4kE|9LN6NEVM#|wG?40N@)DKg*APhQrd;;6 zd}T@e8+O&&sdsrRq;sjrIoY|A1;aa-exY$ zRIZO-3X3lHz8x>5hq-?}uu~ED2q8{&0Xp7?gt#GME%^UzBkX>ViW5)xk)p#f@C`IU z;7`C~E}{BIbi%VyVI8z|R}4lW1Cthl^RM@XG^WcH8RO;s_75+mtPO=^vL*U!uv>X} zFSO6K*4p|G4_KDYT$&Bm6i$`fx_j-bO?`mN>~3dGDOhuWq-GVr6GzudxR+y+O@CbvulD2ySow z`sy`O%)f zZjn(kvY_#+H*d%`b?bYE%vXJ#EkVAkqQ{&!$3Bkwb2%RJ{C27x<)#xCm|y7~bBO!6 zJK8U<1Q|^|Y1S?8c(ZN#^2U{ShCNT%%8pB5Brq-*2t$R2015{N;P#s)4>N)XhcP4a z@vti#{K3l|f&m?1n4|MUkZ-R!pPwtTN4;f~$CMlfrB>Mxl;lRww(}gCykb02Ip5bN z!Y}f=w&9QIBf-r!6TY0WCa=y}`BI-%@9NE&i=UY{o8$9E#0eLSO|UYpD+{evi{tca zbL2Oq7QcDDpRng_M_DU1p%7v?Rvc+N=%aK2mvw-pZNL1B!Q_@x^Kn#VA0_tI?@tiE zrW0y-KYsB_l zvNW|J8&*;jKf5A^)It%55`ZE>fFoez{~LvY&go5)i-J2HwHZ<1PRGB93(6Wu^S5}l zGa7pR7H7-y#UL5+N}-9%_*zxBe$#W+9}maDus!Gn`?*FfaG)vEIn=vp|MiWGPYqNaf|m(>oR3*MtS*UyHIfq|=PQ%}lA z-3+m!sdmcCA?2;9~PxeX%acy34 z_}sx+e>3I0_M}vauXj9FwBgy1Lje8x@v4Y;^bYR_kKQ_ahb7n7MJO>fg@_>E-zzF) z=6cQ#FQ2E$4b5j|w-5(7iWZEG1Zx`K|EpY1{_!*>2vCn8`XmN45MB*2XGH;RVtpDyLtT2IZNhXv)V^fr{$=hlP40sB3C;6!HPD|T+)OqCO+l>nM<6fYU>O|+ zA{f_g!Cnj*R_&jlj5ZA?ha=<>h7bAaHy~L#R1n)zs6`!0lI<7e-!-Sfbms8JSZ>Fc z68YXi%lp!WPEy))Gee$tGu5?fV@}F11Wxvgc8v9S)g~FSyeXZ}4sxk_)BSFaKK}kv z!ZFX^I{bT|7)LSH25)1SbX~wCT3tp6aGPj|=v#sJ0#SPqgvYT&Jv;)9zhUOhJsB6mp&M(TO;V%WDRZQQbq9_+j~ zbGb{|uJfgQa(?|v`$euqlgz{s_m14SWlN*vJH8iJ?vW`;1ipV(MkrEUoHBL~Z?0e;1n-?`$+s10J2T^VPK5V)qL8ISX!cUW2G**( z;Szhqz7+NRA?k)J?Ow_+A#z-x{(vHc?t{p5#Ua>d0oeg7BxVjU z0z;a2q5;(c5XD`%wgqM}z*CmETDw8BJ|)d#adJBdnRh7dnbap-w%&>`ZvS0Yv_g-q z3GXEvUw4ewV$uD;l`!t`QAJ@++_w8}y?4OHg1jMjY#dHZl<|>KviD%Fx5nz_3aq0p z@@%%LEITIxBMpfuqK<>Apd$+;%FD@rP#Qp;7&b6BAlO*i6!`c(Vv;~aUyuvHU9XwY z@>4U%Yh&os4h@He5PF97(YC2tC7V$Pexmb64>|@{S3FXOd@B6fP94ndp3&4A8dG@k z;jGH3#vkiOi;|bzmmW-~2RMRxjWaj!EasjpS&C^8N<`MB6@h^75<`kX-4KeHU;)?8 zha&}II=S@}P|#>|J%5rV7nr?YZ?Q>h zq$x3UZ{Qk1E0F>>gAs-p5lCau;_U(oBftzw7ov0c*MWlS8FNxym?Fzj0t^{M$~1%X7u)K%$A#8TE-SG zB0+xKAo5F#wKS4kPiE@WEl1E?35G_J!}rs`80)WQ6Mg5|=^zXRz*oR;qRfeG(%txc@oyOW3UUkD=KA7W@)5%CO^evuTR}~e(4S2j>5LXm(CJGPpxr;IkILe0VW8k?hv!=1i4rj;JLS7%PU$TI&K>AE_3wLlJM;7ot4$f)>X>98cV{*gu&uDJDU1vg7fx%We`G! zuIIs}`Bx#7l;|vSl#2x@hsG%f!v;q1`%MF!C2&Y!DL|8NwFbdli*iWNUn&r+M+G{o zwD*S#VsDTMi+ z)K9gEMz1tHo=TLja6#fH_VUixY;U~3K7D&KwO8;X6?axPiO96L%u7;6aU3a$h2md( zKcduR_FySTEkyB*R=G?DSUJf3 zj=~7!eUZAO$<^3tPF%j3lab%2%V~|@W+JFaC10I$)KqG3{->iHcb$n;iIKw4Y1dMA zqo=|>1ws_+3PnCCqE~$^{RznwTvbo3GYJzMnb8)mj7shpE>%VwQh^s)ilmGXJD8YP zj=&uUyLE(i0Y@e?3Lkx;@w}HJSc1ZJLAnPUI`P4|RQKMSHm;{<8;5@CB`3`b1@RbPebBpMM&&ux&$&otAhAmcxI(PaK|Sf_`GBX z^g~2&#M9s>&!0y>dgSlx=I8C}=4@vvfG`EH$^lmYBcTH21F#Bnnt~gN1v&oTq!ohN z?Em~Tf0pWfD{3ZaNYL8yglZ4#p-|XoQ^&XS7i9xXTxxmc%oIjWqknGJymv1yb1tf* zZmfB0k;+l%Ml;H3Yy3Wf-YB_fuk!Oe&a`g%z5MwA@1H!^rw5O&Q4QZRel*1ZUZ_O0NZmU+4!o4>$jI#Ea(s?0q)u%Aw$;~wOc(; zI?&eP8M?Of3;8b8>F#1Ik)KC~=dnGJ=9Va4l%e1K3?1ff(2>m&1sLP|V#5P*n&z6qN0f z{MEelj^%T&Vk@NT$xuut&nbtPHm*GA{8Rj7s34sH%75#fJ}e3@s+O`uk!9BVmu*gN zZ)o-F`q(>_wt5cBhWaf$YgqNbDok{ioabUj{7I7j`17Nx{i)DO_H;>I^BjsWGV={3 zQX7aI1U*(#*ju>$md?%^#;1WhEE;UVnUUr&J5THs85mCwAUbjM5Rg>TDrbQ9$nQ58 z!E0rbkwH13t1;1@9~`7SRCBqOCnZ0;%6`~kbdhev#qs-Ntk;Ani_rMozU|N7*7ha5 z1hJM6omSB`P8TD%cCbx;d9iVxXj}*8Pavdd15uGcoS?f3ECgExS6v=u3ovkO#}42Mog`vwt_*^m8bL0K6t(_ZyqK| zB?^3;M4n5n^4t45FS^kXD@7$wCENHV}DP(z3`lC1xA zRUkQ#2FU^D@oO?s5Kn-*fFl=JVeE{MQ*!}_zx$k#EJ?Kp?$!RZ{4H4ES(!08+yQUzi{bjc!US&7`nQIN&6N=+18 zUvR#vHzTGKTA0a|^~ngM<-K5hLOd*8ziW0kDVFW#=X(QOA1WuBb*f@korX3y1JJ(4 zOC7as@7^$o$d|-zyG|J8IEowIazh~BeG7UyXqW}H3*Q%u;lL?@#$=K-aHb4a0|T`q zXao>sOpB4S3ca#Rh$76ipy1+Y_)!%^Z zMhBjax6tvX8NUtpB5K-A8|8r{;wtzI>^{>>IE~cqRtqL+wkmf`wYT?@*h~o^*%eWk zZ+J-YGD4TA9RKC(V1a;}bV*4gu7c@l?tuP2YPN$Q0b8x0r)=UBJumh(XpQ6ewh9T4 zeHs;2xi+`TYmkGPdpccOu8Rsn@8;g6U7U|r=-ub8uq!uTyJRBaU#eeSr6#S-p#M+m zH(KUG`Vcw|h+YOs-4aLzp-7N65V$IYlNt{j@_&-;BQ72}Rl-e?O({i(gmYRvhA0i_ zS^vf-o@e?rf?}eUgI1{BpE1ed8;r+F^x}MXTVb?AU!iyI?!Z6X4!-E3xzYy*Lxc7Y-BXm1v6t|2qS+jXQTm zlI#)_j7us`S1zKlclB8AU!{4N`v7;HR~CPj^f-A80tsq=fuulJ>rvizaWwq}j!IFz z4b0jC4j6Hi*+O{8yoqoa&@=sR*^-%75A{l-1z=g5!4Yy#rxQiqb!8 zT`XGz)+t314ha*vjY$6ViGdwkSM`I~WA|vVrE?D&jrWbU^LHNV49t6;v9#^)Y*iaW zyC`SN41nC0_5vEB{cGPxAPqnfU|+PHBIZHDNG!EY4-qt#v@o^M>oDN;G6HY2VX|-L@s`c5a7uGKap?I)eV^ty7fO6Xc%f7?Vdu z7+d5UZiTg>mOjqcNe*OI>Q!I|tij-=igTxGzh5b1ZferL1$eA(7uw?(D25vkA~vDk z(JY@tN|%U-KoJHG%r$*YMh8x{|85QRgALjlA33}@{LVL7ZRo?94G+o9yFH<7z40?c z4@rL+O7thu_3Ui8r$+R+h!|g;W36qjF!50(;7J#)&KT*xPs)kpYD=iolY-`hyHh2? zqmf`V4niD*A?}0#R|*L%1MC+VtYRS15c4>s^uN?2EC%z0U(FRCGiXVrMXy!~?yFRg zj~KYo@fnNiC~Nx;4pdJ(8Q9V~%n0=o-0E@jtv%ye_w!sLN2-n%7nZ>{$gfE2rg@K~ z$2uB=8xM^oy-kD5x4;FHf-m1bYgR`h1>U_a;0%61OhIkTyvm?OcF`W_ACYUnlYew`YY%u8<7&cpZ25@hwnusuB@4sZU1I^15tL`-pBazW2ZBAC3 z#&<8s)ds9TUY5+6F|=M5DRRK9DShDvqyQcm;kd7;mj*-*>aLp-VQa*zD}!PXS}5p0 zp9=|PefqLe{l!0i;B|Rqjd3{#%uF(g0??YZk!aYcl>>5SGUAxM1QsXd4x`E zhshlMa9w7#@W#zMpeEgr?3}cB?Nw2wr?*>>S@ch*a73WJe%9 z^nZ06f{rO#vRe0ikj2(_KaCCc_H0-r%fEfU37j{TStl=KMe@-KRaot5MVj3E9rkFQ zyrS)j^r6{y!fE+9A-r8==W~(y->cOhdp(^zKVV9gZU-2@AdN)8^Iza^2JeQeH;6xQ z6iPhwDoez*!Y#B#8O1> zJ%d7?9`+1@awlVWzIOL+#trZ0=w@D4cX12?53$+E6P5Q!y08`l48sI&p`d33Na;Th z|7D!F3v(sQsg?%1H|q1p<^qjN$NPJGtln?+&XY(DNsF0PUB>s0lqoeW`x)3NXmleL z7h}As13RQ2 z9hFw?cS}v#&7#~j{a-sD_v!|+&N_Ie3(A(Ml?3oF{+8hnd016SHw&(qbArf$Q37QF c|9954-O1Zc?uf4t8uy>?IQpRoA`12Y0ge`1C;$Ke literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/music_disc_strange_and_alien.png b/src/main/resources/assets/betterend/textures/item/music_disc_strange_and_alien.png new file mode 100644 index 0000000000000000000000000000000000000000..a6c84ad499e162374aa5c18b60e5b1d920740d6f GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~xd5LKS0H_K zU-#K#-B)i-x%X_zyKh_6^Kxz0uJPKvEBMasW2X1gfhxF4g8YIR{=-0Br$`u3)Zf#^ zF+^hO+`d4*0|p#U-50ms`+rC@R=hsEZi;wQU!ms0UBRz5lq^e2d72!*&%?9j@^j<4 zE?Ns`ZZJRCcVlhUVwSgDpLiPnC_nqob>VJ&?wbn66%i4Jl0c&wJYD@<);T3K0RYT? BRxkhn literal 0 HcmV?d00001 diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 1324e41a..315cf94c 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -4,10 +4,14 @@ "version": "${version}", "name": "Better End", - "description": "More content for The End.", + "description": "More content for The End dimension, including new biomes, plants, mobs, mechanics, terrain generation and more.\nMade by:\n- paulevs (code & art)\n- Bulldog83 (code & art)\n- Edos (building)\n- Yuki (art)\n- Seaward (art)\n- Firel (music)\n", "authors": [ - "paulevs", - "Bulldog83" + "paulevs (code & art)", + "Bulldog83 (code & art)", + "Edos (building)", + "Yuki (art)", + "Seaward (art)", + "Firel (music)" ], "contact": { "homepage": "https://www.curseforge.com/minecraft/mc-mods/betterend", From 78b47c858968c1e2c79a3742e40c0db8d9e85944 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 21 Mar 2021 21:07:49 +0300 Subject: [PATCH 382/463] End chest loot table --- src/main/java/ru/betterend/BetterEnd.java | 2 ++ .../java/ru/betterend/util/LootTableUtil.java | 27 +++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 src/main/java/ru/betterend/util/LootTableUtil.java diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index aa02d22c..23ec25d5 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -31,6 +31,7 @@ import ru.betterend.registry.EndTags; import ru.betterend.util.BonemealUtil; import ru.betterend.util.DataFixerUtil; import ru.betterend.util.Logger; +import ru.betterend.util.LootTableUtil; import ru.betterend.world.generator.BetterEndBiomeSource; import ru.betterend.world.generator.GeneratorOptions; import ru.betterend.world.surface.SurfaceBuilders; @@ -64,6 +65,7 @@ public class BetterEnd implements ModInitializer { BonemealUtil.init(); GeneratorOptions.init(); DataFixerUtil.init(); + LootTableUtil.init(); if (hasGuideBook()) { GuideBookItem.register(); diff --git a/src/main/java/ru/betterend/util/LootTableUtil.java b/src/main/java/ru/betterend/util/LootTableUtil.java new file mode 100644 index 00000000..76400df1 --- /dev/null +++ b/src/main/java/ru/betterend/util/LootTableUtil.java @@ -0,0 +1,27 @@ +package ru.betterend.util; + +import net.fabricmc.fabric.api.loot.v1.FabricLootPoolBuilder; +import net.fabricmc.fabric.api.loot.v1.event.LootTableLoadingCallback; +import net.minecraft.item.Items; +import net.minecraft.loot.UniformLootTableRange; +import net.minecraft.loot.condition.RandomChanceLootCondition; +import net.minecraft.loot.entry.ItemEntry; +import net.minecraft.util.Identifier; +import ru.betterend.registry.EndItems; + +public class LootTableUtil { + private static final Identifier END_CITY_TREASURE_ID = new Identifier("chests/end_city_treasure"); + + public static void init() { + LootTableLoadingCallback.EVENT.register((resourceManager, lootManager, id, supplier, setter) -> { + if (END_CITY_TREASURE_ID.equals(id)) { + FabricLootPoolBuilder builder = FabricLootPoolBuilder.builder(); + builder.rolls(UniformLootTableRange.between(0, 5)); + builder.withCondition(RandomChanceLootCondition.builder(0.5f).build()); + builder.withEntry(ItemEntry.builder(Items.GHAST_TEAR).build()); + builder.withEntry(ItemEntry.builder(EndItems.MUSIC_DISC_STRANGE_AND_ALIEN).build()); + supplier.pool(builder); + } + }); + } +} From f2b4f4dc99e3b50d18a819ce93eabc5630b9dab8 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 22 Mar 2021 06:28:59 +0300 Subject: [PATCH 383/463] Pickaxe and crystals fix, pickaxe effective on end stone --- src/main/java/ru/betterend/item/EndPickaxeItem.java | 12 ++++++++++++ src/main/java/ru/betterend/registry/EndItems.java | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/item/EndPickaxeItem.java b/src/main/java/ru/betterend/item/EndPickaxeItem.java index ce27a658..67adfede 100644 --- a/src/main/java/ru/betterend/item/EndPickaxeItem.java +++ b/src/main/java/ru/betterend/item/EndPickaxeItem.java @@ -2,7 +2,10 @@ package ru.betterend.item; import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl; +import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl.Entry; import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.entity.LivingEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -25,6 +28,15 @@ public class EndPickaxeItem extends PickaxeItem implements DynamicAttributeTool, return 0; } + @Override + public float getMiningSpeedMultiplier(ItemStack stack, BlockState state) { + if (this.getMaterial().getMiningLevel() > 2 && state.getMaterial().equals(Blocks.END_STONE.getDefaultState().getMaterial())) { + return this.miningSpeed * 3; + } + Entry entry = ToolManagerImpl.entryNullable(state.getBlock()); + return (entry != null && entry.getMiningLevel(FabricToolTags.PICKAXES) >= 0) ? this.miningSpeed : super.getMiningSpeedMultiplier(stack, state); + } + @Override public String getModelPattern(String name) { return Patterns.createJson(Patterns.ITEM_HANDHELD, name); diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index 11df214c..e35a376b 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -19,7 +19,6 @@ import net.minecraft.item.FoodComponent; import net.minecraft.item.FoodComponents; import net.minecraft.item.Item; import net.minecraft.item.Item.Settings; -import net.minecraft.sound.SoundEvent; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.item.ShovelItem; @@ -27,6 +26,7 @@ import net.minecraft.item.SpawnEggItem; import net.minecraft.item.SwordItem; import net.minecraft.item.ToolItem; import net.minecraft.item.ToolMaterials; +import net.minecraft.sound.SoundEvent; import net.minecraft.tag.Tag; import net.minecraft.util.Identifier; import net.minecraft.util.Rarity; From a2ca5fe3df1147b934cb80a376175a13c02c7b13 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 22 Mar 2021 15:18:24 +0300 Subject: [PATCH 384/463] Eternal portal structure fix --- src/main/java/ru/betterend/registry/EndTags.java | 2 +- .../structures/features/StructureEternalPortal.java | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index c315e530..f73db438 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -125,7 +125,7 @@ public class EndTags { TagHelper.addTag(BlockTags.BEACON_BASE_BLOCKS, EndBlocks.AETERNIUM_BLOCK); TagHelper.addTag(ItemTags.BEACON_PAYMENT_ITEMS, EndItems.AETERNIUM_INGOT); - TagHelper.addTag(EndTags.DRAGON_IMMUNE, EndBlocks.ENDER_ORE); + TagHelper.addTag(EndTags.DRAGON_IMMUNE, EndBlocks.ENDER_ORE, EndBlocks.ETERNAL_PEDESTAL, EndBlocks.FLAVOLITE_RUNED_ETERNAL, EndBlocks.FLAVOLITE_RUNED); } public static void addSurfaceBlock(Block block) { diff --git a/src/main/java/ru/betterend/world/structures/features/StructureEternalPortal.java b/src/main/java/ru/betterend/world/structures/features/StructureEternalPortal.java index d0f4e6b7..8d52e33c 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructureEternalPortal.java +++ b/src/main/java/ru/betterend/world/structures/features/StructureEternalPortal.java @@ -27,13 +27,12 @@ public class StructureEternalPortal extends StructureFeatureBase { @Override protected boolean shouldStartAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, ChunkRandom chunkRandom, int chunkX, int chunkZ, Biome biome, ChunkPos chunkPos, DefaultFeatureConfig featureConfig) { - long x = chunkPos.x * chunkPos.x; - long z = chunkPos.z * chunkPos.z; - long d = x * x + z * z; - if (d < 1024) { + long x = chunkPos.x; + long z = chunkPos.z; + if (x * x + z * z < 10000) { return false; } - if (chunkGenerator.getHeight((chunkX << 4) | 8, (chunkZ << 4) | 8, Heightmap.Type.WORLD_SURFACE_WG) < 58) { + if (chunkGenerator.getHeight((chunkX << 4) | 8, (chunkZ << 4) | 8, Heightmap.Type.WORLD_SURFACE_WG) < 10) { return false; } return super.shouldStartAt(chunkGenerator, biomeSource, worldSeed, chunkRandom, chunkX, chunkZ, biome, chunkPos, featureConfig); @@ -54,7 +53,7 @@ public class StructureEternalPortal extends StructureFeatureBase { int x = (chunkX << 4) | MHelper.randRange(4, 12, random); int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); - if (y > 10) { + if (y > 4) { this.children.add(new NBTPiece(STRUCTURE_ID, STRUCTURE, new BlockPos(x, y - 4, z), random.nextInt(5), true, random)); } this.setBoundingBoxFromChildren(); From b933b0e5223abf71efde64eaac4fe14283228258 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 24 Mar 2021 22:25:34 +0300 Subject: [PATCH 385/463] Flamboyant Refabricated Integration (WIP) --- .../blocks/BulbVineLanternColoredBlock.java | 3 +- .../blocks/HydraluxPetalColoredBlock.java | 5 +- .../blocks/complex/ColoredMaterial.java | 40 ++++++++--- .../FlamboyantRefabricatedIntegration.java | 67 +++++++++++++++++++ .../betterend/integration/Integrations.java | 1 + .../betterend/integration/ModIntegration.java | 8 ++- .../integration/NourishIntegration.java | 3 - .../java/ru/betterend/util/BlocksHelper.java | 11 +++ src/main/java/ru/betterend/util/MHelper.java | 7 ++ 9 files changed, 128 insertions(+), 17 deletions(-) create mode 100644 src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java diff --git a/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java b/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java index cc72d55a..a1c7262f 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java @@ -4,6 +4,7 @@ import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.color.block.BlockColorProvider; import net.minecraft.client.color.item.ItemColorProvider; import ru.betterend.interfaces.IColorProvider; +import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; public class BulbVineLanternColoredBlock extends BulbVineLanternBlock implements IColorProvider { @@ -26,7 +27,7 @@ public class BulbVineLanternColoredBlock extends BulbVineLanternBlock implements } private int getColor() { - int color = this.getDefaultMaterialColor().color; + int color = BlocksHelper.getBlockColor(this); int b = (color & 255); int g = ((color >> 8) & 255); int r = ((color >> 16) & 255); diff --git a/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java b/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java index 4cd1adb1..5e1a0eed 100644 --- a/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java +++ b/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java @@ -8,6 +8,7 @@ import net.minecraft.client.color.item.ItemColorProvider; import net.minecraft.util.Identifier; import ru.betterend.interfaces.IColorProvider; import ru.betterend.patterns.Patterns; +import ru.betterend.util.BlocksHelper; public class HydraluxPetalColoredBlock extends HydraluxPetalBlock implements IColorProvider { public HydraluxPetalColoredBlock(FabricBlockSettings settings) { @@ -17,14 +18,14 @@ public class HydraluxPetalColoredBlock extends HydraluxPetalBlock implements ICo @Override public BlockColorProvider getProvider() { return (state, world, pos, tintIndex) -> { - return this.getDefaultMaterialColor().color; + return BlocksHelper.getBlockColor(this); }; } @Override public ItemColorProvider getItemProvider() { return (stack, tintIndex) -> { - return this.getDefaultMaterialColor().color; + return BlocksHelper.getBlockColor(this); }; } diff --git a/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java b/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java index 33955b27..ab5e9dc9 100644 --- a/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java @@ -7,32 +7,54 @@ import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.Block; +import net.minecraft.block.MaterialColor; import net.minecraft.item.DyeItem; +import net.minecraft.item.ItemConvertible; import net.minecraft.util.DyeColor; import net.minecraft.util.registry.Registry; import ru.betterend.recipe.builders.GridRecipe; import ru.betterend.registry.EndBlocks; +import ru.betterend.util.BlocksHelper; public class ColoredMaterial { - private final Map colors = Maps.newEnumMap(DyeColor.class); + private static final Map DYES = Maps.newHashMap(); + private static final Map COLORS = Maps.newHashMap(); + private final Map colors = Maps.newHashMap(); public ColoredMaterial(Function constructor, Block source, boolean craftEight) { + this(constructor, source, COLORS, DYES, craftEight); + } + + public ColoredMaterial(Function constructor, Block source, Map colors, Map dyes, boolean craftEight) { String id = Registry.BLOCK.getId(source).getPath(); - for (DyeColor color: DyeColor.values()) { - Block block = constructor.apply(FabricBlockSettings.copyOf(source).materialColor(color)); - String blockName = id + "_" + color.getName(); + colors.forEach((color, name) -> { + String blockName = id + "_" + name; + Block block = constructor.apply(FabricBlockSettings.copyOf(source).materialColor(MaterialColor.BLACK)); EndBlocks.registerBlock(blockName, block); if (craftEight) { - GridRecipe.make(blockName, block).setOutputCount(8).setShape("###", "#D#", "###").addMaterial('#', source).addMaterial('D', DyeItem.byColor(color)).build(); + GridRecipe.make(blockName, block).setOutputCount(8).setShape("###", "#D#", "###").addMaterial('#', source).addMaterial('D', dyes.get(color)).build(); } else { - GridRecipe.make(blockName, block).setList("#D").addMaterial('#', source).addMaterial('D', DyeItem.byColor(color)).build(); + GridRecipe.make(blockName, block).setList("#D").addMaterial('#', source).addMaterial('D', dyes.get(color)).build(); } - colors.put(color, block); - } - } + this.colors.put(color, block); + BlocksHelper.addBlockColor(block, color); + }); + } public Block getByColor(DyeColor color) { + return colors.get(color.getMaterialColor().color); + } + + public Block getByColor(int color) { return colors.get(color); } + + static { + for (DyeColor color: DyeColor.values()) { + int colorRGB = color.getMaterialColor().color; + COLORS.put(colorRGB, color.getName()); + DYES.put(colorRGB, DyeItem.byColor(color)); + } + } } diff --git a/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java b/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java new file mode 100644 index 00000000..09255141 --- /dev/null +++ b/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java @@ -0,0 +1,67 @@ +package ru.betterend.integration; + +import java.awt.Color; +import java.util.Map; + +import com.google.common.collect.Maps; + +import net.minecraft.item.ItemConvertible; +import ru.betterend.blocks.HydraluxPetalColoredBlock; +import ru.betterend.blocks.complex.ColoredMaterial; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.MHelper; + +public class FlamboyantRefabricatedIntegration extends ModIntegration { + public FlamboyantRefabricatedIntegration() { + super("flamboyant"); + } + + @Override + public void register() { + /*Class fDyeColor = getClass("com.github.EltrutCo.flamboyant.items.FDyeColor"); + Object[] values = getStaticFieldValue(fDyeColor, "VALUES"); + + if (values == null) { + return; + }*/ + + Map colors = Maps.newHashMap(); + Map dyes = Maps.newHashMap(); + /*for (Object val: values) { + Integer color = (Integer) getFieldValue(fDyeColor, "signColor", val); + String name = (String) getFieldValue(fDyeColor, "name", val); + if (color != null && name != null) { + colors.put(color, name); + System.out.println(name + " " + color + " " + new Color(color)); + dyes.put(color, getItem(name + "_dye")); + } + }*/ + + addColor("fead1d", "amber", colors, dyes); + addColor("bd9a5f", "beige", colors, dyes); + addColor("edeada", "cream", colors, dyes); + addColor("33430e", "dark_green", colors, dyes); + addColor("639920", "forest_green", colors, dyes); + addColor("f0618c", "hot_pink", colors, dyes); + addColor("491c7b", "indigo", colors, dyes); + addColor("65291b", "maroon", colors, dyes); + addColor("2c3969", "navy", colors, dyes); + addColor("827c17", "olive", colors, dyes); + addColor("7bc618", "pale_green", colors, dyes); + addColor("f4a4bd", "pale_pink", colors, dyes); + addColor("f8d45a", "pale_yellow", colors, dyes); + addColor("6bb1cf", "sky_blue", colors, dyes); + addColor("6e8c9c", "slate_gray", colors, dyes); + addColor("b02454", "violet", colors, dyes); + + new ColoredMaterial(HydraluxPetalColoredBlock::new, EndBlocks.HYDRALUX_PETAL_BLOCK, colors, dyes, true); + } + + private void addColor(String hex, String name, Map colors, Map dyes) { + int color = MHelper.color(hex); + colors.put(color, name); + dyes.put(color, getItem(name + "_dye")); + + System.out.println(name + " " + color + " " + new Color(color)); + } +} diff --git a/src/main/java/ru/betterend/integration/Integrations.java b/src/main/java/ru/betterend/integration/Integrations.java index e139c5df..6d7664f1 100644 --- a/src/main/java/ru/betterend/integration/Integrations.java +++ b/src/main/java/ru/betterend/integration/Integrations.java @@ -12,6 +12,7 @@ public class Integrations { public static final ModIntegration NOURISH = register(new NourishIntegration()); //public static final ModIntegration EXTRA_PIECES = register(new ExtraPiecesIntegration()); //public static final ModIntegration ADORN = register(new AdornIntegration()); + public static final ModIntegration FLAMBOYANT_REFABRICATED = register(new FlamboyantRefabricatedIntegration()); public static void register() { INTEGRATIONS.forEach((integration) -> { diff --git a/src/main/java/ru/betterend/integration/ModIntegration.java b/src/main/java/ru/betterend/integration/ModIntegration.java index 07074df6..60d8f80b 100644 --- a/src/main/java/ru/betterend/integration/ModIntegration.java +++ b/src/main/java/ru/betterend/integration/ModIntegration.java @@ -28,9 +28,9 @@ import ru.betterend.world.features.EndFeature; public abstract class ModIntegration { private final String modID; - public abstract void register(); + public void register() {} - public abstract void addBiomes(); + public void addBiomes() {} public ModIntegration(String modID) { this.modID = modID; @@ -43,6 +43,10 @@ public abstract class ModIntegration { public Block getBlock(String name) { return Registry.BLOCK.get(getID(name)); } + + public Item getItem(String name) { + return Registry.ITEM.get(getID(name)); + } public BlockState getDefaultState(String name) { return getBlock(name).getDefaultState(); diff --git a/src/main/java/ru/betterend/integration/NourishIntegration.java b/src/main/java/ru/betterend/integration/NourishIntegration.java index 3e700dbd..de54e081 100644 --- a/src/main/java/ru/betterend/integration/NourishIntegration.java +++ b/src/main/java/ru/betterend/integration/NourishIntegration.java @@ -22,7 +22,4 @@ public class NourishIntegration extends ModIntegration { TagHelper.addTag(protein, EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED); TagHelper.addTag(sweets, EndItems.SHADOW_BERRY_JELLY, EndItems.SWEET_BERRY_JELLY); } - - @Override - public void addBiomes() {} } diff --git a/src/main/java/ru/betterend/util/BlocksHelper.java b/src/main/java/ru/betterend/util/BlocksHelper.java index 8c39751a..87371a24 100644 --- a/src/main/java/ru/betterend/util/BlocksHelper.java +++ b/src/main/java/ru/betterend/util/BlocksHelper.java @@ -2,9 +2,11 @@ package ru.betterend.util; import java.util.HashSet; import java.util.Iterator; +import java.util.Map; import java.util.Random; import java.util.Set; +import com.google.common.collect.Maps; import com.google.common.collect.Sets; import net.minecraft.block.Block; @@ -31,6 +33,7 @@ import ru.betterend.registry.EndTags; public class BlocksHelper { public static final BooleanProperty ROOTS = BooleanProperty.of("roots"); + private static final Map COLOR_BY_BLOCK = Maps.newHashMap(); public static final int FLAG_UPDATE_BLOCK = 1; public static final int FLAG_SEND_CLIENT_CHANGES = 2; @@ -60,6 +63,14 @@ public class BlocksHelper { new Vec3i(1, 0, -1), new Vec3i(1, 0, 0), new Vec3i(1, 0, 1), new Vec3i(1, 1, -1), new Vec3i(1, 1, 0), new Vec3i(1, 1, 1) }; + + public static void addBlockColor(Block block, int color) { + COLOR_BY_BLOCK.put(block, color); + } + + public static int getBlockColor(Block block) { + return COLOR_BY_BLOCK.getOrDefault(block, 0xFF000000); + } public static void setWithoutUpdate(WorldAccess world, BlockPos pos, BlockState state) { world.setBlockState(pos, state, SET_SILENT); diff --git a/src/main/java/ru/betterend/util/MHelper.java b/src/main/java/ru/betterend/util/MHelper.java index 1132dd22..3db1bc5d 100644 --- a/src/main/java/ru/betterend/util/MHelper.java +++ b/src/main/java/ru/betterend/util/MHelper.java @@ -15,6 +15,13 @@ public class MHelper { public static int color(int r, int g, int b) { return ALPHA | (r << 16) | (g << 8) | b; } + + public static int color(String hex) { + int r = Integer.parseInt(hex.substring(0, 2), 16); + int g = Integer.parseInt(hex.substring(2, 4), 16); + int b = Integer.parseInt(hex.substring(4, 6), 16); + return color(r, g, b); + } public static int randRange(int min, int max, Random random) { return min + random.nextInt(max - min + 1); From ffa5d2f816a8a7f9c77986cf11d6427e2bd3b1de Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 27 Mar 2021 16:23:30 +0300 Subject: [PATCH 386/463] World util fix --- .../mixin/common/ServerWorldMixin.java | 55 ++++++++++++++++--- .../ru/betterend/registry/EndFeatures.java | 4 ++ .../java/ru/betterend/util/SplineHelper.java | 23 ++++++++ .../java/ru/betterend/util/WorldDataUtil.java | 4 +- src/main/java/ru/betterend/util/sdf/SDF.java | 34 ++++++++++++ .../terrain/caves/TunelCaveFeature.java | 54 ++++++++++++++++++ 6 files changed, 164 insertions(+), 10 deletions(-) create mode 100644 src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java diff --git a/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java b/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java index 0aab95ac..a48eca97 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java @@ -2,6 +2,7 @@ package ru.betterend.mixin.common; import java.io.File; import java.util.List; +import java.util.Locale; import java.util.concurrent.Executor; import org.spongepowered.asm.mixin.Mixin; @@ -32,21 +33,39 @@ import ru.betterend.world.generator.GeneratorOptions; @Mixin(ServerWorld.class) public class ServerWorldMixin { + private static final int DEV_VERSION = be_getVersionInt("63.63.63"); + private static final int FIX_VERSION = DEV_VERSION; + private static String lastWorld = null; + @Inject(method = "*", at = @At("TAIL")) private void be_onServerWorldInit(MinecraftServer server, Executor workerExecutor, LevelStorage.Session session, ServerWorldProperties properties, RegistryKey registryKey, DimensionType dimensionType, WorldGenerationProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, boolean debugWorld, long l, List list, boolean bl, CallbackInfo info) { - File beData = new File(FabricLoader.getInstance().getGameDir().getParent().toString(), "saves/" + properties.getLevelName() + "/data/betterend_data.nbt"); + if (lastWorld != null && lastWorld.equals(session.getDirectoryName())) { + return; + } + + lastWorld = session.getDirectoryName(); + + @SuppressWarnings("resource") + ServerWorld world = (ServerWorld) (Object) this; + File dir = session.getWorldDirectory(world.getRegistryKey()); + if (!new File(dir, "level.dat").exists()) { + dir = dir.getParentFile(); + } + File data = new File(dir, "data/betterend_data.nbt"); + ModMetadata meta = FabricLoader.getInstance().getModContainer(BetterEnd.MOD_ID).get().getMetadata(); - String version = BetterEnd.isDevEnvironment() ? "development" : meta.getVersion().toString(); + int version = BetterEnd.isDevEnvironment() ? DEV_VERSION : be_getVersionInt(meta.getVersion().toString()); - WorldDataUtil.load(beData); + WorldDataUtil.load(data); CompoundTag root = WorldDataUtil.getRootTag(); - String dataVersion = root.getString("version"); + int dataVersion = be_getVersionInt(root.getString("version")); GeneratorOptions.setPortalPos(NbtHelper.toBlockPos(root.getCompound("portal"))); - boolean fix = !dataVersion.equals(version); - if (fix) { - DataFixerUtil.fixData(beData.getParentFile()); - root.putString("version", version); + if (dataVersion < version) { + if (version < FIX_VERSION) { + DataFixerUtil.fixData(data.getParentFile()); + } + root.putString("version", be_getVersionString(version)); WorldDataUtil.saveFile(); } } @@ -60,4 +79,24 @@ public class ServerWorldMixin { } } } + + private static int be_getVersionInt(String version) { + if (version.isEmpty()) { + return 0; + } + try { + String[] values = version.split("\\."); + return Integer.parseInt(values[0]) << 12 | Integer.parseInt(values[1]) << 6 | Integer.parseInt(values[1]); + } + catch (Exception e) { + return 0; + } + } + + private static String be_getVersionString(int version) { + int a = (version >> 12) & 63; + int b = (version >> 6) & 63; + int c = version & 63; + return String.format(Locale.ROOT, "%d.%d.%d", a, b, c); + } } diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index ca213e77..5adb90c9 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -59,6 +59,7 @@ import ru.betterend.world.features.terrain.SulphuricCaveFeature; import ru.betterend.world.features.terrain.SulphuricLakeFeature; import ru.betterend.world.features.terrain.SurfaceVentFeature; import ru.betterend.world.features.terrain.caves.RoundCaveFeature; +import ru.betterend.world.features.terrain.caves.TunelCaveFeature; import ru.betterend.world.features.trees.DragonTreeFeature; import ru.betterend.world.features.trees.GiganticAmaranitaFeature; import ru.betterend.world.features.trees.HelixTreeFeature; @@ -198,6 +199,7 @@ public class EndFeatures { public static final EndFeature OBSIDIAN_PILLAR_BASEMENT = EndFeature.makeChansedFeature("obsidian_pillar_basement", new ObsidianPillarBasementFeature(), 8); public static final EndFeature OBSIDIAN_BOULDER = EndFeature.makeChansedFeature("obsidian_boulder", new ObsidianBoulderFeature(), 10); public static final EndFeature FALLEN_PILLAR = EndFeature.makeChansedFeature("fallen_pillar", new FallenPillarFeature(), 20); + public static final EndFeature TUNEL_CAVE = EndFeature.makeRawGenFeature("tunel_cave", new TunelCaveFeature(), 2); // Ores // public static final EndFeature THALLASIUM_ORE = EndFeature.makeOreFeature("thallasium_ore", EndBlocks.THALLASIUM.ore, 12, 6, 0, 16, 128); @@ -254,6 +256,7 @@ public class EndFeatures { if (EndBiomes.getBiome(id).hasCaves()) { addFeature(ROUND_CAVE, features); + addFeature(TUNEL_CAVE, features); } EndBiome endBiome = EndBiomes.getBiome(id); @@ -271,6 +274,7 @@ public class EndFeatures { if (def.hasCaves()) { def.addFeature(ROUND_CAVE); + def.addFeature(TUNEL_CAVE); } } diff --git a/src/main/java/ru/betterend/util/SplineHelper.java b/src/main/java/ru/betterend/util/SplineHelper.java index b15ac46b..b5e15f59 100644 --- a/src/main/java/ru/betterend/util/SplineHelper.java +++ b/src/main/java/ru/betterend/util/SplineHelper.java @@ -33,6 +33,29 @@ public class SplineHelper { return spline; } + public static List smoothSpline(List spline, int segmentPoints) { + List result = Lists.newArrayList(); + Vector3f start = spline.get(0); + for (int i = 1; i < spline.size(); i++) { + Vector3f end = spline.get(i); + for (int j = 0; j < segmentPoints; j++) { + float delta = (float) j / segmentPoints; + delta = 0.5F - 0.5F * MathHelper.cos(delta * 3.14159F); + result.add(lerp(start, end, delta)); + } + start = end; + } + result.add(start); + return result; + } + + private static Vector3f lerp(Vector3f start, Vector3f end, float delta) { + float x = MathHelper.lerp(delta, start.getX(), end.getX()); + float y = MathHelper.lerp(delta, start.getY(), end.getY()); + float z = MathHelper.lerp(delta, start.getZ(), end.getZ()); + return new Vector3f(x, y, z); + } + public static void offsetParts(List spline, Random random, float dx, float dy, float dz) { int count = spline.size(); for (int i = 1; i < count; i++) { diff --git a/src/main/java/ru/betterend/util/WorldDataUtil.java b/src/main/java/ru/betterend/util/WorldDataUtil.java index cb6b1816..e881ba09 100644 --- a/src/main/java/ru/betterend/util/WorldDataUtil.java +++ b/src/main/java/ru/betterend/util/WorldDataUtil.java @@ -15,7 +15,7 @@ public class WorldDataUtil { saveFile = file; if (file.exists()) { try { - root = NbtIo.read(file); + root = NbtIo.readCompressed(file); } catch (IOException e) { BetterEnd.LOGGER.error("World data loading failed", e); @@ -48,7 +48,7 @@ public class WorldDataUtil { public static void saveFile() { try { - NbtIo.write(root, saveFile); + NbtIo.writeCompressed(root, saveFile); } catch (IOException e) { BetterEnd.LOGGER.error("World data saving failed", e); diff --git a/src/main/java/ru/betterend/util/sdf/SDF.java b/src/main/java/ru/betterend/util/sdf/SDF.java index c5db2106..74aff385 100644 --- a/src/main/java/ru/betterend/util/sdf/SDF.java +++ b/src/main/java/ru/betterend/util/sdf/SDF.java @@ -273,4 +273,38 @@ public abstract class SDF { world.setBlock(info.getPos(), info.getState()); }); } + + public Set getPositions(ServerWorldAccess world, BlockPos start) { + Set blocks = Sets.newHashSet(); + Set ends = Sets.newHashSet(); + Set add = Sets.newHashSet(); + ends.add(new BlockPos(0, 0, 0)); + boolean run = true; + + Mutable bPos = new Mutable(); + + while (run) { + for (BlockPos center: ends) { + for (Direction dir: Direction.values()) { + bPos.set(center).move(dir); + BlockPos wpos = bPos.add(start); + BlockState state = world.getBlockState(wpos); + if (!blocks.contains(wpos) && canReplace.apply(state)) { + if (this.getDistance(bPos.getX(), bPos.getY(), bPos.getZ()) < 0) { + add.add(bPos.toImmutable()); + } + } + } + } + + ends.forEach((end) -> blocks.add(end.add(start))); + ends.clear(); + ends.addAll(add); + add.clear(); + + run &= !ends.isEmpty(); + } + + 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 new file mode 100644 index 00000000..72826f16 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java @@ -0,0 +1,54 @@ +package ru.betterend.world.features.terrain.caves; + +import java.util.List; +import java.util.Random; +import java.util.Set; +import java.util.function.Function; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.Material; +import net.minecraft.client.util.math.Vector3f; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.StructureWorldAccess; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.SplineHelper; +import ru.betterend.util.sdf.SDF; + +public class TunelCaveFeature extends EndCaveFeature { + private static final Function REPLACE; + + @Override + protected Set generate(StructureWorldAccess world, BlockPos center, int radius, Random random) { + //OpenSimplexNoise noise = new OpenSimplexNoise(MHelper.getSeed(534, center.getX(), center.getZ())); + float rad = radius * 0.15F; + int min = MathHelper.ceil(rad) - 15; + int max = 31 - MathHelper.floor(rad); + List spline = SplineHelper.makeSpline(0, 0, 0, 0, 0, 0, radius / 3); + spline = SplineHelper.smoothSpline(spline, 5); + SplineHelper.offsetParts(spline, random, 5, radius * 0.4F, 5); + for (Vector3f vec: spline) { + float x = MathHelper.clamp(vec.getX(), min, max); + float y = MathHelper.clamp(vec.getY(), -radius, radius); + float z = MathHelper.clamp(vec.getZ(), min, max); + vec.set(x, y, z); + } + SDF sdf = SplineHelper.buildSDF(spline, rad, rad, (vec) -> Blocks.AIR.getDefaultState()); + Set positions = sdf.setReplaceFunction(REPLACE).getPositions(world, center); + for (BlockPos p: positions) { + BlocksHelper.setWithoutUpdate(world, p, CAVE_AIR); + } + return positions; + } + + static { + REPLACE = (state) -> { + return state.isIn(EndTags.GEN_TERRAIN) + || state.getMaterial().isReplaceable() + || state.getMaterial().equals(Material.PLANT) + || state.getMaterial().equals(Material.LEAVES); + }; + } +} From 59190485f344a11c147d4ee39a23240fb5554f6b Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 27 Mar 2021 16:38:33 +0300 Subject: [PATCH 387/463] More compostable items (#128) --- src/main/java/ru/betterend/registry/EndTags.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index f73db438..b2f5f6a2 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -10,6 +10,7 @@ import net.minecraft.block.Blocks; import net.minecraft.block.LeavesBlock; import net.minecraft.block.Material; import net.minecraft.item.BlockItem; +import net.minecraft.item.FoodComponent; import net.minecraft.item.Item; import net.minecraft.tag.BlockTags; import net.minecraft.tag.ItemTags; @@ -99,11 +100,21 @@ public class EndTags { else if (block instanceof PedestalBlock) { TagHelper.addTag(PEDESTALS, block); } - if (block.getDefaultState().getMaterial().equals(Material.PLANT)) { + + Material mat = block.getDefaultState().getMaterial(); + if (mat.equals(Material.PLANT) || mat.equals(Material.REPLACEABLE_PLANT)) { ComposterBlockAccessor.callRegisterCompostableItem(0.1F, block); } }); + EndItems.getModItems().forEach((item) -> { + if (item.isFood()) { + FoodComponent food = item.getFoodComponent(); + float compost = food.getHunger() * food.getSaturationModifier() * 0.18F; + ComposterBlockAccessor.callRegisterCompostableItem(compost, item); + } + }); + TagHelper.addTag(GEN_TERRAIN, EndBlocks.ENDER_ORE, EndBlocks.FLAVOLITE.stone, EndBlocks.VIOLECITE.stone, EndBlocks.SULPHURIC_ROCK.stone, EndBlocks.BRIMSTONE); TagHelper.addTag(END_GROUND, EndBlocks.SULPHURIC_ROCK.stone, EndBlocks.BRIMSTONE); From 941b2ace9f77b260313ae8546503f8852df40832 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 27 Mar 2021 16:44:29 +0300 Subject: [PATCH 388/463] Lumecorn & lanceleaf drop fix (#128) --- .../java/ru/betterend/blocks/LanceleafBlock.java | 14 ++++++++++++++ .../java/ru/betterend/blocks/LumecornBlock.java | 14 ++------------ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/LanceleafBlock.java b/src/main/java/ru/betterend/blocks/LanceleafBlock.java index 1a940095..5c3fec89 100644 --- a/src/main/java/ru/betterend/blocks/LanceleafBlock.java +++ b/src/main/java/ru/betterend/blocks/LanceleafBlock.java @@ -1,8 +1,13 @@ package ru.betterend.blocks; +import java.util.Collections; +import java.util.List; + import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.context.LootContext; import net.minecraft.state.StateManager; import net.minecraft.state.property.EnumProperty; import net.minecraft.state.property.IntProperty; @@ -13,6 +18,7 @@ import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties.PentaShape; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; +import ru.betterend.util.MHelper; public class LanceleafBlock extends EndPlantBlock { public static final EnumProperty SHAPE = BlockProperties.PENTA_SHAPE; @@ -50,4 +56,12 @@ public class LanceleafBlock extends EndPlantBlock { return state; } } + + @Override + public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + if (state.get(SHAPE) == PentaShape.BOTTOM) { + return Collections.singletonList(new ItemStack(EndBlocks.LANCELEAF_SEED)); + } + return MHelper.RANDOM.nextBoolean() ? Collections.emptyList() : Collections.singletonList(new ItemStack(EndBlocks.LANCELEAF_SEED)); + } } diff --git a/src/main/java/ru/betterend/blocks/LumecornBlock.java b/src/main/java/ru/betterend/blocks/LumecornBlock.java index c29c2c95..0fd64805 100644 --- a/src/main/java/ru/betterend/blocks/LumecornBlock.java +++ b/src/main/java/ru/betterend/blocks/LumecornBlock.java @@ -88,19 +88,9 @@ public class LumecornBlock extends BlockBaseNotFull implements IRenderTypeable { public List getDroppedStacks(BlockState state, LootContext.Builder builder) { LumecornShape shape = state.get(SHAPE); if (shape == LumecornShape.BOTTOM_BIG || shape == LumecornShape.BOTTOM_SMALL || shape == LumecornShape.MIDDLE) { - if (MHelper.RANDOM.nextBoolean()) { - return Collections.singletonList(new ItemStack(EndBlocks.LUMECORN_SEED)); - } - else { - return Collections.emptyList(); - } - } - if (MHelper.RANDOM.nextBoolean()) { - return Collections.singletonList(new ItemStack(EndItems.LUMECORN_ROD)); - } - else { - return Collections.emptyList(); + return Collections.singletonList(new ItemStack(EndBlocks.LUMECORN_SEED, MHelper.randRange(1, 2, MHelper.RANDOM))); } + return MHelper.RANDOM.nextBoolean() ? Collections.singletonList(new ItemStack(EndItems.LUMECORN_ROD)) : Collections.emptyList(); } @Override From c381260487413f3464d277aace5b5da8b7b034a9 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 27 Mar 2021 18:01:19 +0300 Subject: [PATCH 389/463] Smaragdant blocks, end tools fixes, fur & leaves blocks sounds fixes, translations, shaders --- .../betterend/blocks/EndstoneDustBlock.java | 5 +- .../ru/betterend/blocks/basis/FurBlock.java | 6 +- .../complex/CrystalSubblocksMaterial.java | 72 ++++++++++++++++++ .../blocks/complex/MetalMaterial.java | 12 +-- .../betterend/item/{ => tool}/EndAxeItem.java | 2 +- .../item/{ => tool}/EndHammerItem.java | 2 +- .../betterend/item/{ => tool}/EndHoeItem.java | 2 +- .../item/{ => tool}/EndPickaxeItem.java | 2 +- .../item/{ => tool}/EndShovelItem.java | 10 ++- .../item/{ => tool}/EndSwordItem.java | 2 +- .../mixin/common/AbstractBlockMixin.java | 2 +- .../java/ru/betterend/registry/EndBlocks.java | 10 ++- .../java/ru/betterend/registry/EndItems.java | 12 +-- .../betterend/blockstates/tenanea_leaves.json | 5 ++ .../assets/betterend/lang/en_us.json | 31 +++++++- .../assets/betterend/lang/ru_ru.json | 31 +++++++- ...rd.json => smaragdant_crystal_bricks.json} | 0 .../block/smaragdant_crystal_bricks_slab.json | 3 + .../smaragdant_crystal_bricks_stairs.json | 3 + .../block/smaragdant_crystal_bricks_wall.json | 3 + .../block/smaragdant_crystal_pedestal.json | 3 + .../block/smaragdant_crystal_pillar.json | 3 + .../block/smaragdant_crystal_polished.json | 3 + .../block/smaragdant_crystal_slab.json | 3 + .../block/smaragdant_crystal_stairs.json | 3 + .../block/smaragdant_crystal_tiles.json | 3 + .../block/smaragdant_crystal_wall.json | 3 + .../materialmaps/block/smaragdant_shard.json | 3 + .../models/block/tenanea_leaves.json | 6 ++ .../textures/block/smaragdant_crystal.png | Bin 0 -> 217 bytes .../block/smaragdant_crystal_bricks.png | Bin 0 -> 244 bytes .../block/smaragdant_crystal_pillar_side.png | Bin 0 -> 246 bytes .../block/smaragdant_crystal_pillar_top.png | Bin 0 -> 250 bytes .../block/smaragdant_crystal_polished.png | Bin 0 -> 238 bytes .../block/smaragdant_crystal_tiles.png | Bin 0 -> 243 bytes 35 files changed, 216 insertions(+), 29 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java rename src/main/java/ru/betterend/item/{ => tool}/EndAxeItem.java (94%) rename src/main/java/ru/betterend/item/{ => tool}/EndHammerItem.java (97%) rename src/main/java/ru/betterend/item/{ => tool}/EndHoeItem.java (91%) rename src/main/java/ru/betterend/item/{ => tool}/EndPickaxeItem.java (95%) rename src/main/java/ru/betterend/item/{ => tool}/EndShovelItem.java (67%) rename src/main/java/ru/betterend/item/{ => tool}/EndSwordItem.java (92%) create mode 100644 src/main/resources/assets/betterend/blockstates/tenanea_leaves.json rename src/main/resources/assets/betterend/materialmaps/block/{smaragdant_crystal_shard.json => smaragdant_crystal_bricks.json} (100%) create mode 100644 src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_bricks_slab.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_bricks_stairs.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_bricks_wall.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_pedestal.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_pillar.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_polished.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_slab.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_stairs.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_tiles.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_wall.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/smaragdant_shard.json create mode 100644 src/main/resources/assets/betterend/models/block/tenanea_leaves.json create mode 100644 src/main/resources/assets/betterend/textures/block/smaragdant_crystal.png create mode 100644 src/main/resources/assets/betterend/textures/block/smaragdant_crystal_bricks.png create mode 100644 src/main/resources/assets/betterend/textures/block/smaragdant_crystal_pillar_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/smaragdant_crystal_pillar_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/smaragdant_crystal_polished.png create mode 100644 src/main/resources/assets/betterend/textures/block/smaragdant_crystal_tiles.png diff --git a/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java b/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java index 81504106..3dae7b77 100644 --- a/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java +++ b/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java @@ -6,6 +6,7 @@ import java.util.List; 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.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.FallingBlock; @@ -20,7 +21,9 @@ public class EndstoneDustBlock extends FallingBlock { private static final int COLOR = MHelper.color(226, 239, 168); public EndstoneDustBlock() { - super(FabricBlockSettings.copyOf(Blocks.SAND).materialColor(Blocks.END_STONE.getDefaultMaterialColor())); + super(FabricBlockSettings.copyOf(Blocks.SAND) + .breakByTool(FabricToolTags.SHOVELS) + .materialColor(Blocks.END_STONE.getDefaultMaterialColor())); } @Override diff --git a/src/main/java/ru/betterend/blocks/basis/FurBlock.java b/src/main/java/ru/betterend/blocks/basis/FurBlock.java index 5c83224f..986d8b05 100644 --- a/src/main/java/ru/betterend/blocks/basis/FurBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/FurBlock.java @@ -32,10 +32,10 @@ public class FurBlock extends AttachedBlock implements IRenderTypeable { private final ItemConvertible drop; private final int dropChance; - public FurBlock(ItemConvertible drop, int light, int dropChance) { + public FurBlock(ItemConvertible drop, int light, int dropChance, boolean wet) { super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT) .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.WET_GRASS) + .sounds(wet ? BlockSoundGroup.WET_GRASS : BlockSoundGroup.GRASS) .luminance(light) .breakByHand(true) .noCollision()); @@ -46,7 +46,7 @@ public class FurBlock extends AttachedBlock implements IRenderTypeable { public FurBlock(ItemConvertible drop, int dropChance) { super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT) .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.WET_GRASS) + .sounds(BlockSoundGroup.GRASS) .breakByHand(true) .noCollision()); this.drop = drop; diff --git a/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java b/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java new file mode 100644 index 00000000..55916dbd --- /dev/null +++ b/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java @@ -0,0 +1,72 @@ +package ru.betterend.blocks.complex; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.Block; +import net.minecraft.tag.BlockTags; +import net.minecraft.tag.ItemTags; +import ru.betterend.blocks.EndPedestal; +import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.EndPillarBlock; +import ru.betterend.blocks.basis.EndSlabBlock; +import ru.betterend.blocks.basis.EndStairsBlock; +import ru.betterend.blocks.basis.EndWallBlock; +import ru.betterend.recipe.CraftingRecipes; +import ru.betterend.recipe.builders.GridRecipe; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.TagHelper; + +public class CrystalSubblocksMaterial { + public final Block polished; + public final Block tiles; + public final Block pillar; + public final Block stairs; + public final Block slab; + public final Block wall; + public final Block pedestal; + public final Block bricks; + public final Block brick_stairs; + public final Block brick_slab; + public final Block brick_wall; + + public CrystalSubblocksMaterial(String name, Block source) { + FabricBlockSettings material = FabricBlockSettings.copyOf(source); + polished = EndBlocks.registerBlock(name + "_polished", new BlockBase(material)); + tiles = EndBlocks.registerBlock(name + "_tiles", new BlockBase(material)); + pillar = EndBlocks.registerBlock(name + "_pillar", new EndPillarBlock(material)); + stairs = EndBlocks.registerBlock(name + "_stairs", new EndStairsBlock(source)); + slab = EndBlocks.registerBlock(name + "_slab", new EndSlabBlock(source)); + wall = EndBlocks.registerBlock(name + "_wall", new EndWallBlock(source)); + pedestal = EndBlocks.registerBlock(name + "_pedestal", new EndPedestal(source)); + bricks = EndBlocks.registerBlock(name + "_bricks", new BlockBase(material)); + brick_stairs = EndBlocks.registerBlock(name + "_bricks_stairs", new EndStairsBlock(bricks)); + brick_slab = EndBlocks.registerBlock(name + "_bricks_slab", new EndSlabBlock(bricks)); + brick_wall = EndBlocks.registerBlock(name + "_bricks_wall", new EndWallBlock(bricks)); + + // Recipes // + GridRecipe.make(name + "_bricks", bricks).setOutputCount(4).setShape("##", "##").addMaterial('#', source).setGroup("end_bricks").build(); + GridRecipe.make(name + "_polished", polished).setOutputCount(4).setShape("##", "##").addMaterial('#', bricks).setGroup("end_tile").build(); + GridRecipe.make(name + "_tiles", tiles).setOutputCount(4).setShape("##", "##").addMaterial('#', polished).setGroup("end_small_tile").build(); + GridRecipe.make(name + "_pillar", pillar).setShape("#", "#").addMaterial('#', slab).setGroup("end_pillar").build(); + + GridRecipe.make(name + "_stairs", stairs).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', source).setGroup("end_stone_stairs").build(); + GridRecipe.make(name + "_slab", slab).setOutputCount(6).setShape("###").addMaterial('#', source).setGroup("end_stone_slabs").build(); + GridRecipe.make(name + "_bricks_stairs", brick_stairs).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', bricks).setGroup("end_stone_stairs").build(); + GridRecipe.make(name + "_bricks_slab", brick_slab).setOutputCount(6).setShape("###").addMaterial('#', bricks).setGroup("end_stone_slabs").build(); + + GridRecipe.make(name + "_wall", wall).setOutputCount(6).setShape("###", "###").addMaterial('#', source).setGroup("end_wall").build(); + GridRecipe.make(name + "_bricks_wall", brick_wall).setOutputCount(6).setShape("###", "###").addMaterial('#', bricks).setGroup("end_wall").build(); + + CraftingRecipes.registerPedestal(name + "_pedestal", pedestal, slab, pillar); + + // Item Tags // + TagHelper.addTag(ItemTags.SLABS, slab, brick_slab); + TagHelper.addTag(ItemTags.STONE_BRICKS, bricks); + TagHelper.addTag(ItemTags.STONE_CRAFTING_MATERIALS, source); + TagHelper.addTag(ItemTags.STONE_TOOL_MATERIALS, source); + + // Block Tags // + TagHelper.addTag(BlockTags.STONE_BRICKS, bricks); + TagHelper.addTag(BlockTags.WALLS, wall, brick_wall); + TagHelper.addTag(BlockTags.SLABS, slab, brick_slab); + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index 7356e108..86acd669 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -26,13 +26,13 @@ import ru.betterend.blocks.basis.EndStairsBlock; import ru.betterend.blocks.basis.EndTrapdoorBlock; import ru.betterend.blocks.basis.EndWoodenPlateBlock; import ru.betterend.item.EndArmorItem; -import ru.betterend.item.EndAxeItem; -import ru.betterend.item.EndHammerItem; -import ru.betterend.item.EndHoeItem; -import ru.betterend.item.EndPickaxeItem; -import ru.betterend.item.EndShovelItem; -import ru.betterend.item.EndSwordItem; import ru.betterend.item.PatternedItem; +import ru.betterend.item.tool.EndAxeItem; +import ru.betterend.item.tool.EndHammerItem; +import ru.betterend.item.tool.EndHoeItem; +import ru.betterend.item.tool.EndPickaxeItem; +import ru.betterend.item.tool.EndShovelItem; +import ru.betterend.item.tool.EndSwordItem; import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.recipe.builders.AnvilRecipe; import ru.betterend.recipe.builders.FurnaceRecipe; diff --git a/src/main/java/ru/betterend/item/EndAxeItem.java b/src/main/java/ru/betterend/item/tool/EndAxeItem.java similarity index 94% rename from src/main/java/ru/betterend/item/EndAxeItem.java rename to src/main/java/ru/betterend/item/tool/EndAxeItem.java index 8c5a4ac7..77e1e53a 100644 --- a/src/main/java/ru/betterend/item/EndAxeItem.java +++ b/src/main/java/ru/betterend/item/tool/EndAxeItem.java @@ -1,4 +1,4 @@ -package ru.betterend.item; +package ru.betterend.item.tool; import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; diff --git a/src/main/java/ru/betterend/item/EndHammerItem.java b/src/main/java/ru/betterend/item/tool/EndHammerItem.java similarity index 97% rename from src/main/java/ru/betterend/item/EndHammerItem.java rename to src/main/java/ru/betterend/item/tool/EndHammerItem.java index c739d346..004e05c4 100644 --- a/src/main/java/ru/betterend/item/EndHammerItem.java +++ b/src/main/java/ru/betterend/item/tool/EndHammerItem.java @@ -1,4 +1,4 @@ -package ru.betterend.item; +package ru.betterend.item.tool; import java.util.UUID; diff --git a/src/main/java/ru/betterend/item/EndHoeItem.java b/src/main/java/ru/betterend/item/tool/EndHoeItem.java similarity index 91% rename from src/main/java/ru/betterend/item/EndHoeItem.java rename to src/main/java/ru/betterend/item/tool/EndHoeItem.java index 55cb135e..ec635fc7 100644 --- a/src/main/java/ru/betterend/item/EndHoeItem.java +++ b/src/main/java/ru/betterend/item/tool/EndHoeItem.java @@ -1,4 +1,4 @@ -package ru.betterend.item; +package ru.betterend.item.tool; import net.minecraft.item.HoeItem; import net.minecraft.item.ToolMaterial; diff --git a/src/main/java/ru/betterend/item/EndPickaxeItem.java b/src/main/java/ru/betterend/item/tool/EndPickaxeItem.java similarity index 95% rename from src/main/java/ru/betterend/item/EndPickaxeItem.java rename to src/main/java/ru/betterend/item/tool/EndPickaxeItem.java index 67adfede..d30eb891 100644 --- a/src/main/java/ru/betterend/item/EndPickaxeItem.java +++ b/src/main/java/ru/betterend/item/tool/EndPickaxeItem.java @@ -1,4 +1,4 @@ -package ru.betterend.item; +package ru.betterend.item.tool; import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; diff --git a/src/main/java/ru/betterend/item/EndShovelItem.java b/src/main/java/ru/betterend/item/tool/EndShovelItem.java similarity index 67% rename from src/main/java/ru/betterend/item/EndShovelItem.java rename to src/main/java/ru/betterend/item/tool/EndShovelItem.java index 2af12d3a..a0b9de67 100644 --- a/src/main/java/ru/betterend/item/EndShovelItem.java +++ b/src/main/java/ru/betterend/item/tool/EndShovelItem.java @@ -1,7 +1,9 @@ -package ru.betterend.item; +package ru.betterend.item.tool; import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl; +import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl.Entry; import net.minecraft.block.BlockState; import net.minecraft.entity.LivingEntity; import net.minecraft.item.Item; @@ -25,6 +27,12 @@ public class EndShovelItem extends ShovelItem implements DynamicAttributeTool, P return 0; } + @Override + public float getMiningSpeedMultiplier(ItemStack stack, BlockState state) { + Entry entry = ToolManagerImpl.entryNullable(state.getBlock()); + return (entry != null && entry.getMiningLevel(FabricToolTags.SHOVELS) >= 0) ? this.miningSpeed : super.getMiningSpeedMultiplier(stack, state); + } + @Override public String getModelPattern(String name) { return Patterns.createJson(Patterns.ITEM_HANDHELD, name); diff --git a/src/main/java/ru/betterend/item/EndSwordItem.java b/src/main/java/ru/betterend/item/tool/EndSwordItem.java similarity index 92% rename from src/main/java/ru/betterend/item/EndSwordItem.java rename to src/main/java/ru/betterend/item/tool/EndSwordItem.java index 46afd39c..45f4f8dc 100644 --- a/src/main/java/ru/betterend/item/EndSwordItem.java +++ b/src/main/java/ru/betterend/item/tool/EndSwordItem.java @@ -1,4 +1,4 @@ -package ru.betterend.item; +package ru.betterend.item.tool; import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; import net.minecraft.item.SwordItem; diff --git a/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java b/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java index 4f00cf95..fd4473ed 100644 --- a/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java @@ -19,7 +19,7 @@ import net.minecraft.item.Items; import net.minecraft.loot.context.LootContext; import net.minecraft.loot.context.LootContextParameters; import net.minecraft.util.math.MathHelper; -import ru.betterend.item.EndHammerItem; +import ru.betterend.item.tool.EndHammerItem; import ru.betterend.util.MHelper; @Mixin(AbstractBlock.class) diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 0bd65fee..ccb6104b 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -27,6 +27,7 @@ import ru.betterend.blocks.basis.TripleTerrainBlock; import ru.betterend.blocks.basis.VineBlock; import ru.betterend.blocks.basis.WallMushroomBlock; import ru.betterend.blocks.complex.ColoredMaterial; +import ru.betterend.blocks.complex.CrystalSubblocksMaterial; import ru.betterend.blocks.complex.MetalMaterial; import ru.betterend.blocks.complex.StoneMaterial; import ru.betterend.blocks.complex.WoodenMaterial; @@ -104,7 +105,7 @@ public class EndBlocks { public static final Block MOSSY_GLOWSHROOM_SAPLING = registerBlock("mossy_glowshroom_sapling", new MossyGlowshroomSaplingBlock()); public static final Block MOSSY_GLOWSHROOM_CAP = registerBlock("mossy_glowshroom_cap", new MossyGlowshroomCapBlock()); public static final Block MOSSY_GLOWSHROOM_HYMENOPHORE = registerBlock("mossy_glowshroom_hymenophore", new GlowingHymenophoreBlock()); - public static final Block MOSSY_GLOWSHROOM_FUR = registerBlock("mossy_glowshroom_fur", new FurBlock(MOSSY_GLOWSHROOM_SAPLING, 15, 16)); + public static final Block MOSSY_GLOWSHROOM_FUR = registerBlock("mossy_glowshroom_fur", new FurBlock(MOSSY_GLOWSHROOM_SAPLING, 15, 16, true)); public static final WoodenMaterial MOSSY_GLOWSHROOM = new WoodenMaterial("mossy_glowshroom", MaterialColor.GRAY, MaterialColor.WOOD); public static final Block PYTHADENDRON_SAPLING = registerBlock("pythadendron_sapling", new PythadendronSaplingBlock()); @@ -176,7 +177,7 @@ public class EndBlocks { public static final Block BLUE_VINE_SEED = registerBlock("blue_vine_seed", new BlueVineSeedBlock()); public static final Block BLUE_VINE = registerBlockNI("blue_vine", new BlueVineBlock()); public static final Block BLUE_VINE_LANTERN = registerBlock("blue_vine_lantern", new BlueVineLanternBlock()); - public static final Block BLUE_VINE_FUR = registerBlock("blue_vine_fur", new FurBlock(BLUE_VINE_SEED, 15, 3)); + public static final Block BLUE_VINE_FUR = registerBlock("blue_vine_fur", new FurBlock(BLUE_VINE_SEED, 15, 3, false)); public static final Block LANCELEAF_SEED = registerBlock("lanceleaf_seed", new LanceleafSeedBlock()); public static final Block LANCELEAF = registerBlockNI("lanceleaf", new LanceleafBlock()); @@ -184,7 +185,7 @@ public class EndBlocks { public static final Block GLOWING_PILLAR_SEED = registerBlock("glowing_pillar_seed", new GlowingPillarSeedBlock()); public static final Block GLOWING_PILLAR_ROOTS = registerBlockNI("glowing_pillar_roots", new GlowingPillarRootsBlock()); public static final Block GLOWING_PILLAR_LUMINOPHOR = registerBlock("glowing_pillar_luminophor", new GlowingPillarLuminophorBlock()); - public static final Block GLOWING_PILLAR_LEAVES = registerBlock("glowing_pillar_leaves", new FurBlock(GLOWING_PILLAR_SEED, 15, 3)); + public static final Block GLOWING_PILLAR_LEAVES = registerBlock("glowing_pillar_leaves", new FurBlock(GLOWING_PILLAR_SEED, 15, 3, false)); public static final Block SMALL_JELLYSHROOM = registerBlock("small_jellyshroom", new SmallJellyshroomBlock()); public static final Block BOLUX_MUSHROOM = registerBlock("bolux_mushroom", new BoluxMushroomBlock()); @@ -198,7 +199,7 @@ public class EndBlocks { public static final Block AMARANITA_HYPHAE = registerBlock("amaranita_hyphae", new AmaranitaStemBlock()); public static final Block AMARANITA_HYMENOPHORE = registerBlock("amaranita_hymenophore", new AmaranitaHymenophoreBlock()); public static final Block AMARANITA_LANTERN = registerBlock("amaranita_lantern", new GlowingHymenophoreBlock()); - public static final Block AMARANITA_FUR = registerBlock("amaranita_fur", new FurBlock(MOSSY_GLOWSHROOM_SAPLING, 15, 4)); + public static final Block AMARANITA_FUR = registerBlock("amaranita_fur", new FurBlock(MOSSY_GLOWSHROOM_SAPLING, 15, 4, true)); public static final Block AMARANITA_CAP = registerBlock("amaranita_cap", new AmaranitaCapBlock()); public static final Block NEON_CACTUS = registerBlock("neon_cactus", new NeonCactusBlock()); @@ -281,6 +282,7 @@ public class EndBlocks { public static final Block AURORA_CRYSTAL = registerBlock("aurora_crystal", new AuroraCrystalBlock()); public static final Block AMBER_BLOCK = registerBlock("amber_block", new AmberBlock()); public static final Block SMARAGDANT_CRYSTAL = registerBlock("smaragdant_crystal", new SmaragdantCrystalBlock()); + public static final CrystalSubblocksMaterial SMARAGDANT_SUBBLOCKS = new CrystalSubblocksMaterial("smaragdant_crystal", SMARAGDANT_CRYSTAL); public static final Block SMARAGDANT_CRYSTAL_SHARD = registerBlock("smaragdant_crystal_shard", new SmaragdantCrystalShardBlock()); public static final Block RESPAWN_OBELISK = registerBlock("respawn_obelisk", new RespawnObeliskBlock()); diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index e35a376b..4e3dc6f3 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -38,18 +38,18 @@ import ru.betterend.config.Configs; import ru.betterend.item.DrinkItem; import ru.betterend.item.EnchantedPetalItem; import ru.betterend.item.EndArmorItem; -import ru.betterend.item.EndAxeItem; -import ru.betterend.item.EndHammerItem; -import ru.betterend.item.EndHoeItem; -import ru.betterend.item.EndPickaxeItem; -import ru.betterend.item.EndShovelItem; import ru.betterend.item.EndSpawnEggItem; -import ru.betterend.item.EndSwordItem; import ru.betterend.item.EternalCrystalItem; import ru.betterend.item.PatternedDiscItem; import ru.betterend.item.PatternedItem; import ru.betterend.item.material.EndArmorMaterial; import ru.betterend.item.material.EndToolMaterial; +import ru.betterend.item.tool.EndAxeItem; +import ru.betterend.item.tool.EndHammerItem; +import ru.betterend.item.tool.EndHoeItem; +import ru.betterend.item.tool.EndPickaxeItem; +import ru.betterend.item.tool.EndShovelItem; +import ru.betterend.item.tool.EndSwordItem; import ru.betterend.tab.CreativeTabs; import ru.betterend.util.TagHelper; diff --git a/src/main/resources/assets/betterend/blockstates/tenanea_leaves.json b/src/main/resources/assets/betterend/blockstates/tenanea_leaves.json new file mode 100644 index 00000000..22dad4a7 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/tenanea_leaves.json @@ -0,0 +1,5 @@ +{ + "variants": { + "": { "model": "betterend:block/tenanea_leaves" } + } +} diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 5845f6b4..2d63c8a3 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -818,5 +818,34 @@ "item.betterend.cave_pumpkin_pie": "Cave Pumpkin Pie", "item.betterend.music_disc_strange_and_alien": "§bMusic Disc§r", - "item.betterend.music_disc_strange_and_alien.desc": "§5Firel§r - §fStrange And Alien§r" + "item.betterend.music_disc_strange_and_alien.desc": "§5Firel§r - §fStrange And Alien§r", + + "block.betterend.hydralux_petal_block_amber": "Amber Petal Block", + "block.betterend.hydralux_petal_block_beige": "Beige Petal Block", + "block.betterend.hydralux_petal_block_cream": "Cream Petal Block", + "block.betterend.hydralux_petal_block_dark_green": "Dark Green Petal Block", + "block.betterend.hydralux_petal_block_forest_green": "Forest Green Petal Block", + "block.betterend.hydralux_petal_block_hot_pink": "Hot Pink Petal Block", + "block.betterend.hydralux_petal_block_indigo": "Indigo Petal Block", + "block.betterend.hydralux_petal_block_maroon": "Maroon Petal Block", + "block.betterend.hydralux_petal_block_navy": "Navy Petal Block", + "block.betterend.hydralux_petal_block_olive": "Olive Petal Block", + "block.betterend.hydralux_petal_block_pale_green": "Pale Green Petal Block", + "block.betterend.hydralux_petal_block_pale_pink": "Pale Pink Petal Block", + "block.betterend.hydralux_petal_block_pale_yellow": "Pale Yellow Petal Block", + "block.betterend.hydralux_petal_block_sky_blue": "Sky Blue Petal Block", + "block.betterend.hydralux_petal_block_slate_gray": "Slate Gray Petal Block", + "block.betterend.hydralux_petal_block_violet": "Violet Petal Block", + + "block.betterend.smaragdant_crystal_bricks": "Smaragdant Bricks", + "block.betterend.smaragdant_crystal_bricks_slab": "Smaragdant Bricks Slab", + "block.betterend.smaragdant_crystal_bricks_stairs": "Smaragdant Bricks Stairs", + "block.betterend.smaragdant_crystal_bricks_wall": "Smaragdant Bricks Wall", + "block.betterend.smaragdant_crystal_pedestal": "Smaragdant Pedestal", + "block.betterend.smaragdant_crystal_pillar": "Smaragdant Pillar", + "block.betterend.smaragdant_crystal_polished": "Smaragdant Polished", + "block.betterend.smaragdant_crystal_slab": "Smaragdant Slab", + "block.betterend.smaragdant_crystal_stairs": "Smaragdant Stairs", + "block.betterend.smaragdant_crystal_tiles": "Smaragdant Tiles", + "block.betterend.smaragdant_crystal_wall": "Smaragdant Wall" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 71441920..d23383e6 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -837,5 +837,34 @@ "block.betterend.neon_cactus": "Неоновый кактус", "item.betterend.cave_pumpkin_pie": "Пирог из пещерной тыквы", - "item.betterend.music_disc_strange_and_alien": "§bПластинка§r" + "item.betterend.music_disc_strange_and_alien": "§bПластинка§r", + + "block.betterend.hydralux_petal_block_amber": "Янтарный блок лепестков", + "block.betterend.hydralux_petal_block_beige": "Бежевый блок лепестков", + "block.betterend.hydralux_petal_block_cream": "Кремовый блок лепестков", + "block.betterend.hydralux_petal_block_dark_green": "Тёмно-зелёный блок лепестков", + "block.betterend.hydralux_petal_block_forest_green": "Лесной зелёный блок лепестков", + "block.betterend.hydralux_petal_block_hot_pink": "Ярко-розовый блок лепестков", + "block.betterend.hydralux_petal_block_indigo": "Индиго блок лепестков", + "block.betterend.hydralux_petal_block_maroon": "Бордовый блок лепестков", + "block.betterend.hydralux_petal_block_navy": "Темно-синий блок лепестков", + "block.betterend.hydralux_petal_block_olive": "Оливковый блок лепестков", + "block.betterend.hydralux_petal_block_pale_green": "Бледно-зеленый блок лепестков", + "block.betterend.hydralux_petal_block_pale_pink": "Бледно-розовый блок лепестков", + "block.betterend.hydralux_petal_block_pale_yellow": "Бледно-жёлтый блок лепестков", + "block.betterend.hydralux_petal_block_sky_blue": "Неьесно-голубой блок лепестков", + "block.betterend.hydralux_petal_block_slate_gray": "Сланцево-серый блок лепестков", + "block.betterend.hydralux_petal_block_violet": "Лиловый блок лепестков", + + "block.betterend.smaragdant_crystal_bricks": "Смарагдантовые кирпичи", + "block.betterend.smaragdant_crystal_bricks_slab": "Плита из смарагдантовых кирпичей", + "block.betterend.smaragdant_crystal_bricks_stairs": "Ступени из смарагдантовых кирпичей", + "block.betterend.smaragdant_crystal_bricks_wall": "Стена из смарагдантовых кирпичей", + "block.betterend.smaragdant_crystal_pedestal": "Смарагдантовый пьедестал", + "block.betterend.smaragdant_crystal_pillar": "Смарагдантовая колонна", + "block.betterend.smaragdant_crystal_polished": "Полированный смарагдант", + "block.betterend.smaragdant_crystal_slab": "Смарагдантовая плита", + "block.betterend.smaragdant_crystal_stairs": "Смарагдантовые ступени", + "block.betterend.smaragdant_crystal_tiles": "Смарагдантовая плитка", + "block.betterend.smaragdant_crystal_wall": "Смарагдантовая стена" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_shard.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_bricks.json similarity index 100% rename from src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_shard.json rename to src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_bricks.json diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_bricks_slab.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_bricks_slab.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_bricks_slab.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_bricks_stairs.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_bricks_stairs.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_bricks_stairs.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_bricks_wall.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_bricks_wall.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_bricks_wall.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_pedestal.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_pedestal.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_pedestal.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_pillar.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_pillar.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_pillar.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_polished.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_polished.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_polished.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_slab.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_slab.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_slab.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_stairs.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_stairs.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_stairs.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_tiles.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_tiles.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_tiles.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_wall.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_wall.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_wall.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_shard.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_shard.json new file mode 100644 index 00000000..a72e6e79 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_shard.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/models/block/tenanea_leaves.json b/src/main/resources/assets/betterend/models/block/tenanea_leaves.json new file mode 100644 index 00000000..c8fd5d5e --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/tenanea_leaves.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cube_noshade", + "textures": { + "texture": "betterend:block/tenanea_leaves" + } +} diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal.png new file mode 100644 index 0000000000000000000000000000000000000000..e2981961edd094ff01eceda716d87fc41b656d2b GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!M1W6-E0AXJNn?o3Whkm*=&WW~ z(8_RT8N>V8x{@*5fl?eLL4Lsu{~_S&sSqQeSca#IV@L%f>%qoE7DEnZgP9xtAA0+6 zdfBqO_LWoaT@tZeB6f0@-yQMpOyAi*H)JeZD)jB@)4RTvZ*OydZQV8VHXHk@pYij= zRz+yaHB5au@zSzusd2x38<(1YcU?HG%gTe~ HDWM4f6O&T? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_bricks.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_bricks.png new file mode 100644 index 0000000000000000000000000000000000000000..956bed0b474094c7e5e201d0ac5537b64b59a1a7 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~i2$DvS0K&c zlg1F6%TQFs&{@r}pq1gwGRF6_b#9wA0Hrueg8YIR{zJgkQz1q`u`*8=#}J9BzI}mw z2MjozLXX`2e~fu{+T}0IYkn}DpP&%q8^*Kx!Mm4f;U1?yO5B}wiy>{P*%#*WEL*d_ z4UcX-&{bWfB{DNUG_TG46NBP3_qp6He5b<_iZTTjWx7w}k)89walX%$y!NjW4ejbR hclFPQ&wA`1r2mzVd5$TAODfO>44$rjF6*2UngAA~SeXC- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_pillar_side.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_pillar_side.png new file mode 100644 index 0000000000000000000000000000000000000000..515053e7589129f8c511b3469d9707e286604e90 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~i2$DvS0K&c zlg1F6%TQFs&{@r}pq1gwGRF6_b#9wA0Hrueg8YIR{zJgkQz1q`u?kNY#}J9BzWtFx zE{Yt?tvdJq9}~V3ZdxC9TXDk?J&u+qc?F!Yx)N9NCZ9IECBXj1knIVh`lSA?>m41| zo%yBYaYVGLQSL=U@adIX`5vqlRh?@8V86$kL(dvI3kuVgl=a9Rw%C5)<`*gEPZt=g kCcf#k{vugyS9yT{+b-tW*KdiZ0^Pvi>FVdQ&MBb@06e-}761SM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_pillar_top.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_pillar_top.png new file mode 100644 index 0000000000000000000000000000000000000000..5bb9b798fb45468c76da0d0dc3601792e65009ea GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~i2$DvS0K&c zlg1F6%TQFs&{@r}pq1gwGRF6_b#9wA0Hrueg8YIR{zJgkQz1q`u^LYo#}J9BvHqS+ z4GtVZV$c8E^DXzQlvHt8Wqe5T_9pQw9THhHA_Ewt666dRuI^u{{H0U;$(M_1EgxpB z@Vlg{X02+zsG#F&a9H!YnB2*I4?=Z5T3ss=eYK|WjL@o@%wMbLUC#WaZ}!q~$L0lX oZgmCc7fs$OdD5@RwyQ#}J9BuKkXD zE`}UVtCjZt?`7X&?|hln|4N14$+Y@Ii9MHAIdR3fO^at_ws>mxg7MRgnu`k-8znpH zN@VkwtWJIY-6uoqeZT zGNM;!q?fH_ji}CEAn|UMukgR5`%LCPq!_tRJdN0pdtIC97~f6y2w}F*9vt&`CY)$j g7P|dJwe%eSo5{?RRabQA03E>K>FVdQ&MBb@08?;PH2?qr literal 0 HcmV?d00001 From 8e368bc3ffbc65f6957daa51c240dd7c75cbdbc4 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 27 Mar 2021 18:11:13 +0300 Subject: [PATCH 390/463] Structure class rename --- .../ru/betterend/registry/EndStructures.java | 28 +++++++++---------- ...ortal.java => EternalPortalStructure.java} | 2 +- ...ureBase.java => FeatureBaseStructure.java} | 4 +-- ...ceStar.java => GiantIceStarStructure.java} | 2 +- ...ava => GiantMossyGlowshroomStructure.java} | 2 +- ...Small.java => MegaLakeSmallStructure.java} | 2 +- ...reMegaLake.java => MegaLakeStructure.java} | 2 +- ...reMountain.java => MountainStructure.java} | 2 +- ...ain.java => PaintedMountainStructure.java} | 2 +- .../features/SDFStructureFeature.java | 2 +- 10 files changed, 24 insertions(+), 24 deletions(-) rename src/main/java/ru/betterend/world/structures/features/{StructureEternalPortal.java => EternalPortalStructure.java} (95%) rename src/main/java/ru/betterend/world/structures/features/{StructureFeatureBase.java => FeatureBaseStructure.java} (93%) rename src/main/java/ru/betterend/world/structures/features/{StructureGiantIceStar.java => GiantIceStarStructure.java} (96%) rename src/main/java/ru/betterend/world/structures/features/{StructureGiantMossyGlowshroom.java => GiantMossyGlowshroomStructure.java} (96%) rename src/main/java/ru/betterend/world/structures/features/{StructureMegaLakeSmall.java => MegaLakeSmallStructure.java} (94%) rename src/main/java/ru/betterend/world/structures/features/{StructureMegaLake.java => MegaLakeStructure.java} (94%) rename src/main/java/ru/betterend/world/structures/features/{StructureMountain.java => MountainStructure.java} (94%) rename src/main/java/ru/betterend/world/structures/features/{StructurePaintedMountain.java => PaintedMountainStructure.java} (94%) diff --git a/src/main/java/ru/betterend/registry/EndStructures.java b/src/main/java/ru/betterend/registry/EndStructures.java index a14fd9f3..1c0292a9 100644 --- a/src/main/java/ru/betterend/registry/EndStructures.java +++ b/src/main/java/ru/betterend/registry/EndStructures.java @@ -11,13 +11,13 @@ import net.minecraft.world.gen.GenerationStep.Feature; import net.minecraft.world.gen.feature.ConfiguredStructureFeature; import ru.betterend.BetterEnd; import ru.betterend.world.structures.EndStructureFeature; -import ru.betterend.world.structures.features.StructureEternalPortal; -import ru.betterend.world.structures.features.StructureGiantIceStar; -import ru.betterend.world.structures.features.StructureGiantMossyGlowshroom; -import ru.betterend.world.structures.features.StructureMegaLake; -import ru.betterend.world.structures.features.StructureMegaLakeSmall; -import ru.betterend.world.structures.features.StructureMountain; -import ru.betterend.world.structures.features.StructurePaintedMountain; +import ru.betterend.world.structures.features.EternalPortalStructure; +import ru.betterend.world.structures.features.GiantIceStarStructure; +import ru.betterend.world.structures.features.GiantMossyGlowshroomStructure; +import ru.betterend.world.structures.features.MegaLakeStructure; +import ru.betterend.world.structures.features.MegaLakeSmallStructure; +import ru.betterend.world.structures.features.MountainStructure; +import ru.betterend.world.structures.features.PaintedMountainStructure; import ru.betterend.world.structures.piece.CavePiece; import ru.betterend.world.structures.piece.CrystalMountainPiece; import ru.betterend.world.structures.piece.LakePiece; @@ -33,13 +33,13 @@ public class EndStructures { public static final StructurePieceType PAINTED_MOUNTAIN_PIECE = register("painted_mountain_piece", PaintedMountainPiece::new); public static final StructurePieceType NBT_PIECE = register("nbt_piece", NBTPiece::new); - public static final EndStructureFeature GIANT_MOSSY_GLOWSHROOM = new EndStructureFeature("giant_mossy_glowshroom", new StructureGiantMossyGlowshroom(), Feature.SURFACE_STRUCTURES, 16, 8); - public static final EndStructureFeature MEGALAKE = new EndStructureFeature("megalake", new StructureMegaLake(), Feature.RAW_GENERATION, 4, 1); - public static final EndStructureFeature MEGALAKE_SMALL = new EndStructureFeature("megalake_small", new StructureMegaLakeSmall(), Feature.RAW_GENERATION, 4, 1); - public static final EndStructureFeature MOUNTAIN = new EndStructureFeature("mountain", new StructureMountain(), Feature.RAW_GENERATION, 3, 2); - public static final EndStructureFeature PAINTED_MOUNTAIN = new EndStructureFeature("painted_mountain", new StructurePaintedMountain(), Feature.RAW_GENERATION, 3, 2); - public static final EndStructureFeature ETERNAL_PORTAL = new EndStructureFeature("eternal_portal", new StructureEternalPortal(), Feature.SURFACE_STRUCTURES, 16, 6); - public static final EndStructureFeature GIANT_ICE_STAR = new EndStructureFeature("giant_ice_star", new StructureGiantIceStar(), Feature.SURFACE_STRUCTURES, 16, 8); + public static final EndStructureFeature GIANT_MOSSY_GLOWSHROOM = new EndStructureFeature("giant_mossy_glowshroom", new GiantMossyGlowshroomStructure(), Feature.SURFACE_STRUCTURES, 16, 8); + public static final EndStructureFeature MEGALAKE = new EndStructureFeature("megalake", new MegaLakeStructure(), Feature.RAW_GENERATION, 4, 1); + public static final EndStructureFeature MEGALAKE_SMALL = new EndStructureFeature("megalake_small", new MegaLakeSmallStructure(), Feature.RAW_GENERATION, 4, 1); + public static final EndStructureFeature MOUNTAIN = new EndStructureFeature("mountain", new MountainStructure(), Feature.RAW_GENERATION, 3, 2); + public static final EndStructureFeature PAINTED_MOUNTAIN = new EndStructureFeature("painted_mountain", new PaintedMountainStructure(), Feature.RAW_GENERATION, 3, 2); + public static final EndStructureFeature ETERNAL_PORTAL = new EndStructureFeature("eternal_portal", new EternalPortalStructure(), Feature.SURFACE_STRUCTURES, 16, 6); + public static final EndStructureFeature GIANT_ICE_STAR = new EndStructureFeature("giant_ice_star", new GiantIceStarStructure(), Feature.SURFACE_STRUCTURES, 16, 8); public static void register() {} diff --git a/src/main/java/ru/betterend/world/structures/features/StructureEternalPortal.java b/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java similarity index 95% rename from src/main/java/ru/betterend/world/structures/features/StructureEternalPortal.java rename to src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java index 8d52e33c..3874615e 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructureEternalPortal.java +++ b/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java @@ -21,7 +21,7 @@ import ru.betterend.util.MHelper; import ru.betterend.util.StructureHelper; import ru.betterend.world.structures.piece.NBTPiece; -public class StructureEternalPortal extends StructureFeatureBase { +public class EternalPortalStructure extends FeatureBaseStructure { private static final Identifier STRUCTURE_ID = BetterEnd.makeID("portal/eternal_portal"); private static final Structure STRUCTURE = StructureHelper.readStructure(STRUCTURE_ID); diff --git a/src/main/java/ru/betterend/world/structures/features/StructureFeatureBase.java b/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java similarity index 93% rename from src/main/java/ru/betterend/world/structures/features/StructureFeatureBase.java rename to src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java index d37fe7af..3be74a16 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructureFeatureBase.java +++ b/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java @@ -14,10 +14,10 @@ import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; import net.minecraft.world.gen.feature.StructureFeature; -public abstract class StructureFeatureBase extends StructureFeature { +public abstract class FeatureBaseStructure extends StructureFeature { protected static final BlockState AIR = Blocks.AIR.getDefaultState(); - public StructureFeatureBase() { + public FeatureBaseStructure() { super(DefaultFeatureConfig.CODEC); } diff --git a/src/main/java/ru/betterend/world/structures/features/StructureGiantIceStar.java b/src/main/java/ru/betterend/world/structures/features/GiantIceStarStructure.java similarity index 96% rename from src/main/java/ru/betterend/world/structures/features/StructureGiantIceStar.java rename to src/main/java/ru/betterend/world/structures/features/GiantIceStarStructure.java index 2aa327df..41c695e4 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructureGiantIceStar.java +++ b/src/main/java/ru/betterend/world/structures/features/GiantIceStarStructure.java @@ -24,7 +24,7 @@ import ru.betterend.util.sdf.operator.SDFUnion; import ru.betterend.util.sdf.primitive.SDFCappedCone; import ru.betterend.world.structures.piece.VoxelPiece; -public class StructureGiantIceStar extends SDFStructureFeature { +public class GiantIceStarStructure extends SDFStructureFeature { private final float minSize = 20; private final float maxSize = 35; private final int minCount = 25; diff --git a/src/main/java/ru/betterend/world/structures/features/StructureGiantMossyGlowshroom.java b/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java similarity index 96% rename from src/main/java/ru/betterend/world/structures/features/StructureGiantMossyGlowshroom.java rename to src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java index fdd7bbeb..11b50168 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructureGiantMossyGlowshroom.java +++ b/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java @@ -28,7 +28,7 @@ import ru.betterend.util.sdf.primitive.SDFCappedCone; import ru.betterend.util.sdf.primitive.SDFPrimitive; import ru.betterend.util.sdf.primitive.SDFSphere; -public class StructureGiantMossyGlowshroom extends SDFStructureFeature { +public class GiantMossyGlowshroomStructure extends SDFStructureFeature { @Override protected SDF getSDF(BlockPos center, Random random) { SDFCappedCone cone1 = new SDFCappedCone().setHeight(2.5F).setRadius1(1.5F).setRadius2(2.5F); diff --git a/src/main/java/ru/betterend/world/structures/features/StructureMegaLakeSmall.java b/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java similarity index 94% rename from src/main/java/ru/betterend/world/structures/features/StructureMegaLakeSmall.java rename to src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java index 966e5dc7..344d92e3 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructureMegaLakeSmall.java +++ b/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java @@ -13,7 +13,7 @@ import net.minecraft.world.gen.feature.StructureFeature; import ru.betterend.util.MHelper; import ru.betterend.world.structures.piece.LakePiece; -public class StructureMegaLakeSmall extends StructureFeatureBase { +public class MegaLakeSmallStructure extends FeatureBaseStructure { @Override public StructureFeature.StructureStartFactory getStructureStartFactory() { return SDFStructureStart::new; diff --git a/src/main/java/ru/betterend/world/structures/features/StructureMegaLake.java b/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java similarity index 94% rename from src/main/java/ru/betterend/world/structures/features/StructureMegaLake.java rename to src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java index e0f5368e..1ae60a72 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructureMegaLake.java +++ b/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java @@ -13,7 +13,7 @@ import net.minecraft.world.gen.feature.StructureFeature; import ru.betterend.util.MHelper; import ru.betterend.world.structures.piece.LakePiece; -public class StructureMegaLake extends StructureFeatureBase { +public class MegaLakeStructure extends FeatureBaseStructure { @Override public StructureFeature.StructureStartFactory getStructureStartFactory() { return SDFStructureStart::new; diff --git a/src/main/java/ru/betterend/world/structures/features/StructureMountain.java b/src/main/java/ru/betterend/world/structures/features/MountainStructure.java similarity index 94% rename from src/main/java/ru/betterend/world/structures/features/StructureMountain.java rename to src/main/java/ru/betterend/world/structures/features/MountainStructure.java index f9ed7476..6efc808c 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructureMountain.java +++ b/src/main/java/ru/betterend/world/structures/features/MountainStructure.java @@ -13,7 +13,7 @@ import net.minecraft.world.gen.feature.StructureFeature; import ru.betterend.util.MHelper; import ru.betterend.world.structures.piece.CrystalMountainPiece; -public class StructureMountain extends StructureFeatureBase { +public class MountainStructure extends FeatureBaseStructure { @Override public StructureFeature.StructureStartFactory getStructureStartFactory() { return SDFStructureStart::new; diff --git a/src/main/java/ru/betterend/world/structures/features/StructurePaintedMountain.java b/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java similarity index 94% rename from src/main/java/ru/betterend/world/structures/features/StructurePaintedMountain.java rename to src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java index 0244cfca..07d262a0 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructurePaintedMountain.java +++ b/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java @@ -16,7 +16,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; import ru.betterend.world.structures.piece.PaintedMountainPiece; -public class StructurePaintedMountain extends StructureFeatureBase { +public class PaintedMountainStructure extends FeatureBaseStructure { private static final BlockState[] VARIANTS; @Override diff --git a/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java b/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java index 42a31a73..21f9edd2 100644 --- a/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java +++ b/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java @@ -16,7 +16,7 @@ import ru.betterend.util.MHelper; import ru.betterend.util.sdf.SDF; import ru.betterend.world.structures.piece.VoxelPiece; -public abstract class SDFStructureFeature extends StructureFeatureBase { +public abstract class SDFStructureFeature extends FeatureBaseStructure { protected abstract SDF getSDF(BlockPos pos, Random random); From cffd1457775a6a085c87d25555f3b108f503f3a6 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 28 Mar 2021 06:56:16 +0300 Subject: [PATCH 391/463] New crystal block textures (WIP) --- .../block/smaragdant_crystal_bricks.png | Bin 244 -> 236 bytes .../block/smaragdant_crystal_polished.png | Bin 238 -> 223 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_bricks.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_bricks.png index 956bed0b474094c7e5e201d0ac5537b64b59a1a7..4ce4e1ff6331886e97ff8ae6bd966047b47a10f4 100644 GIT binary patch delta 139 zcmV;60CfNK0qg;gX@71>L_t&-l}(OW5(7a9LQ%oo|HcuWEcDl-DFO9rsZ delta 147 zcmV;E0Bry40rUZoX@7P}L_t&-l}(OO4!|%7LRG}w|HcEGX4CWotoQ=YkRV)5Rt&4) z?&)S%NXzjU-J03}W~Dat19xgYHjc33*x)TCswxzjUsY~~H}U`>mPefngbvGAU~*{? zqG?B#3>}>CL7z<2Zin?4fQKi1-7n8qn&VGWFZB)soHYPMWeflS002ovPDHLkV1imw BKT7}r diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_polished.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_polished.png index e325a0b3bc810bb3b894f0c8083b3176a2b9a0b7..8e13469c553742482bd29b845a9800fbf3715ce1 100644 GIT binary patch delta 125 zcmV-@0D}MS0p9_TX?9^rL_t&-m1U1n4!|G?LltPf|BY9WO_Mc#_+HWISR_HbiNRU1 zjC+{GQf~&KM+xq_1X3I>f##p68|uiZ#neP&asV@hzXDtMH9(2OmuPGeAA(Cl`<&Gx fmqheKZU1^c%Vz^{Yo6o600000NkvXXu0mjf#Mn22 delta 141 zcmV;80CNA|0qy~iX@77@L_t&-l|_$14n#2sLaQRZ|BVN}56l1uDByO_ v|ASX{!-8>``*;Q5b-q_;UjgLPUL8NtAp?F<;M8#d0000 Date: Sun, 28 Mar 2021 08:58:55 +0300 Subject: [PATCH 392/463] *.psd removed from repository --- psd/aeternium.psd | Bin 24202 -> 0 bytes psd/armor_items.psd | Bin 35141 -> 0 bytes psd/armor_models.psd | Bin 39260 -> 0 bytes psd/end_portal.psd | Bin 89522 -> 0 bytes psd/end_stone_smelter.psd | Bin 24256 -> 0 bytes psd/end_stone_smelter_on.psd | Bin 30812 -> 0 bytes psd/ender_block.psd | Bin 22392 -> 0 bytes psd/ender_dust.psd | Bin 21219 -> 0 bytes psd/ender_ore.psd | Bin 23546 -> 0 bytes psd/ender_vision.psd | Bin 24362 -> 0 bytes psd/flavolite_runed.psd | Bin 89078 -> 0 bytes psd/infusion_pedestal.psd | Bin 23222 -> 0 bytes psd/smelter_gui.psd | Bin 71913 -> 0 bytes psd/stones_pillar.psd | Bin 32244 -> 0 bytes psd/terminite_block.psd | Bin 27392 -> 0 bytes psd/terminite_ingot.psd | Bin 23163 -> 0 bytes psd/tool_items.psd | Bin 49358 -> 0 bytes 17 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 psd/aeternium.psd delete mode 100644 psd/armor_items.psd delete mode 100644 psd/armor_models.psd delete mode 100644 psd/end_portal.psd delete mode 100644 psd/end_stone_smelter.psd delete mode 100644 psd/end_stone_smelter_on.psd delete mode 100644 psd/ender_block.psd delete mode 100644 psd/ender_dust.psd delete mode 100644 psd/ender_ore.psd delete mode 100644 psd/ender_vision.psd delete mode 100644 psd/flavolite_runed.psd delete mode 100644 psd/infusion_pedestal.psd delete mode 100644 psd/smelter_gui.psd delete mode 100644 psd/stones_pillar.psd delete mode 100644 psd/terminite_block.psd delete mode 100644 psd/terminite_ingot.psd delete mode 100644 psd/tool_items.psd diff --git a/psd/aeternium.psd b/psd/aeternium.psd deleted file mode 100644 index 155c2ccdc6dc49e7be54810d7265428f1922a01e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24202 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 E4cM)3t^fc4 diff --git a/psd/end_stone_smelter_on.psd b/psd/end_stone_smelter_on.psd deleted file mode 100644 index 8bec3355c1c818f73e8456b25a2871e118192ff0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30812 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 Th6OtMoPb4oB4VSI!e0Ix&yW=h diff --git a/psd/ender_ore.psd b/psd/ender_ore.psd deleted file mode 100644 index 49e8c9d17c8c700a2fcd355738ef7fd3dad316c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23546 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 diff --git a/psd/ender_vision.psd b/psd/ender_vision.psd deleted file mode 100644 index df47502aa881f72bb8b8d0915f2ca6e5d01da71d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24362 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 Fe*ioKu1Wv^ diff --git a/psd/flavolite_runed.psd b/psd/flavolite_runed.psd deleted file mode 100644 index fca3f7d4c8b7c3717068d85755f732dec46b1e13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89078 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 diff --git a/psd/terminite_ingot.psd b/psd/terminite_ingot.psd deleted file mode 100644 index 94e248157eb6294e4de0965cc17067070880eafd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23163 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 WT1rCPp_GO^Mwif^w-CAnHUAeuR12j5 diff --git a/psd/tool_items.psd b/psd/tool_items.psd deleted file mode 100644 index e3fa9647a6ad30d3f8073faee0670d285e392b0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49358 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 From 14a6803c884c3b5f6fa40f53401a9cd869c481d2 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sun, 28 Mar 2021 15:54:22 +0300 Subject: [PATCH 393/463] PedestalBlockEntity sync fix --- .../betterend/blocks/basis/PedestalBlock.java | 6 ++-- .../blocks/entities/PedestalBlockEntity.java | 31 ++++++++++--------- .../entities/render/PedestalItemRenderer.java | 3 +- .../client/ClientPlayNetworkHandlerMixin.java | 6 ++-- 4 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index 208b4991..a97f947f 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -283,10 +283,8 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid public boolean isPlaceable(BlockState state) { if (!state.isOf(this)) return false; PedestalState currentState = state.get(STATE); - return currentState != PedestalState.BOTTOM && - currentState != PedestalState.COLUMN && - currentState != PedestalState.PILLAR && - currentState != PedestalState.COLUMN_TOP; + return currentState == PedestalState.DEFAULT || + currentState == PedestalState.PEDESTAL_TOP; } @Override diff --git a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java index e772282d..d1ed681f 100644 --- a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java @@ -1,5 +1,6 @@ package ru.betterend.blocks.entities; +import net.fabricmc.fabric.api.block.entity.BlockEntityClientSerializable; import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntityType; @@ -13,7 +14,7 @@ import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.registry.EndBlockEntities; import ru.betterend.registry.EndItems; -public class PedestalBlockEntity extends BlockEntity implements Inventory, Tickable { +public class PedestalBlockEntity extends BlockEntity implements Inventory, Tickable, BlockEntityClientSerializable { private ItemStack activeItem = ItemStack.EMPTY; private final int maxAge = 314; @@ -102,23 +103,10 @@ public class PedestalBlockEntity extends BlockEntity implements Inventory, Ticka return true; } - @Override - public BlockEntityUpdateS2CPacket toUpdatePacket() { - return new BlockEntityUpdateS2CPacket(pos, 32, toInitialChunkDataTag()); - } - - @Override - public CompoundTag toInitialChunkDataTag() { - return toTag(new CompoundTag()); - } - @Override public void fromTag(BlockState state, CompoundTag tag) { super.fromTag(state, tag); - if (tag.contains("active_item")) { - CompoundTag itemTag = tag.getCompound("active_item"); - activeItem = ItemStack.fromTag(itemTag); - } + fromClientTag(tag); } @Override @@ -137,4 +125,17 @@ public class PedestalBlockEntity extends BlockEntity implements Inventory, Ticka } } } + + @Override + public void fromClientTag(CompoundTag tag) { + if (tag.contains("active_item")) { + CompoundTag itemTag = tag.getCompound("active_item"); + activeItem = ItemStack.fromTag(itemTag); + } + } + + @Override + public CompoundTag toClientTag(CompoundTag tag) { + return toTag(tag); + } } diff --git a/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java b/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java index 5da44f25..5d390e4e 100644 --- a/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java +++ b/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java @@ -37,12 +37,13 @@ public class PedestalItemRenderer extends BlockEn VertexConsumerProvider vertexConsumers, int light, int overlay) { World world = blockEntity.getWorld(); - if (blockEntity.isEmpty() || world == null) return; + if (world == null || blockEntity.isEmpty()) return; BlockState state = world.getBlockState(blockEntity.getPos()); if (!(state.getBlock() instanceof PedestalBlock)) return; ItemStack activeItem = blockEntity.getStack(0); + matrices.push(); MinecraftClient minecraft = MinecraftClient.getInstance(); BakedModel model = minecraft.getItemRenderer().getHeldItemModel(activeItem, world, null); diff --git a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java index 09f84c8a..187693d5 100644 --- a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java @@ -1,5 +1,7 @@ package ru.betterend.mixin.client; +import net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket; +import net.minecraft.util.math.BlockPos; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -27,8 +29,8 @@ public class ClientPlayNetworkHandlerMixin @Inject(method = "onSignEditorOpen", at = @At(value = "HEAD"), cancellable = true) public void be_openSignEditor(SignEditorOpenS2CPacket packet, CallbackInfo info) { - NetworkThreadUtils.forceMainThread(packet, (ClientPlayNetworkHandler) (Object) this, (ThreadExecutor) client); - BlockEntity blockEntity = this.world.getBlockEntity(packet.getPos()); + NetworkThreadUtils.forceMainThread(packet, ClientPlayNetworkHandler.class.cast(this), client); + BlockEntity blockEntity = world.getBlockEntity(packet.getPos()); if (blockEntity instanceof ESignBlockEntity) { ESignBlockEntity sign = (ESignBlockEntity) blockEntity; client.openScreen(new BlockSignEditScreen(sign)); From 0a7391a35e21f5f715f70c929426fd08a524e13d Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 28 Mar 2021 16:25:14 +0300 Subject: [PATCH 394/463] Smaragdant textures --- .../block/smaragdant_crystal_bricks.png | Bin 236 -> 253 bytes .../block/smaragdant_crystal_pillar_side.png | Bin 246 -> 244 bytes .../block/smaragdant_crystal_pillar_top.png | Bin 250 -> 256 bytes .../block/smaragdant_crystal_polished.png | Bin 223 -> 264 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_bricks.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_bricks.png index 4ce4e1ff6331886e97ff8ae6bd966047b47a10f4..b6b4336b178b48f5f11132d25239207c7b195c5d 100644 GIT binary patch delta 212 zcmaFE_?K~lVZC&KPlzi65cs4q#O5*-RWWo{Gc0IjIJ1o5&O*lbv%7E4s|3n&mIV0) zGyI1FbEer>fP&SYE{-7*Q%(Iig%}h$oId{g-z}bdO_SGzan8$E_7@GGa%m|^XdW_l zp4gQjcvh7!Ymtdy<%fuEizok9F5}GR`4xEAH+F03p$A`V)5^~pTwnUX?q16^-`jSw z`PFW>FCTx@@yK|F(mJ!$4^Gfy42U^YG>FVdQ&MBb@0D<~a<^TWy diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_pillar_side.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_pillar_side.png index 515053e7589129f8c511b3469d9707e286604e90..6edbb4a2c7e08d34a4e24f4ac54d31914874dec7 100644 GIT binary patch delta 203 zcmeyy_=RzTVZC&KPlzi65cs4q#O5*-RWWo{Gc0IjIJ1o5&O*lbv%7E4s|3n&mIV0) zGyI1FbEer>fPzJyE{-7*Q$za$#f~U&Fi%xE^w)onOk}`pz z^X>(QK-X7^fJ<+&g*kQto@TY8p=% zr|pxCd--bft%>#R%=?NT%zkWjrSJE2;lCDjE-zRdeN>MJgPiQ?>gTe~DWM4f4xdFObVZB6vPlzi65cs4q#O5*-RWWo{Gc0IjIJ1oL{cN4vW(`0oj*=k1V21w? zaP?G(5m2nc)5S4FVybU{q>zgu2Xm{=z5mCAuY{Y{huv1(a72%zOM?7@ z8U90oIn(SbK*2gs7sn8ZskP_4g^oCIFa?MTysv+BQRQ{vwqg-%PK| z-*`?JEzr8E(x~pTFEskRaM|-Say5zy&)=|Q1YCX7w(PrjQ^vEl1yk8neo1lhZSKDA zV75bj4=+bEZ;Zsb;ti`r+s=L76?fzLPxkEj>4`7cuf<7}{b{+x?^VPSqH$2M8svOW LS3j3^P6BezwkSvj(6PM@f)hFvEWc zxOytY2q;$L>Eak7F*VlTlc~XhBS`G|e|x^=ewC6c4y%k0N#5Qhex*YqYer-MgH(c? z0mIe(E0w==ia+^sF|FmptQCHjRMo6i%@-APcwG$+YhD+VJGt*csLn^LYek~3))bx* zT2+(zYxTU#nZNYSUK;M$yr9jkuHgKl$y+5)`ZbxH_{4B9klCYU-^vLOM?7@ z8U90oIn(SbK*2Uo7sn8ZsjB^)d@hC@PTCKO{tNT}@tmchAN4^uKfnBa%=+(<;sFYb z->a^PtehwK>cg7d(Yne>S`NmSiv-2r@41^7(Wz6baQSE8<;|iO<~MKr_0K_Ric+(y z%n|?pjygvE>($sZ!gpK9Y@BIuae0TA!Td>Y%$(LX?tN};^4#xhbfxr delta 182 zcmeBRy3aVluwEj-C&ZNj2z=5QVsjaasu((}85XoMoLR>BezwkSvj(6PM@f)hFvEWc zxOytY2q>25>Eak7F*UV6kney3hqGwL-v7Pf6MQF|*8PaP_##5ZaZl&L$c;VKGmZr1 zvn_Pze7B1wNJg*m+58pKuTHEydc`HVh{3pZzdlp+4^xNE!_zZz1m&B&oqo@`sx;l@ ei*xS(D!bF^%mvx=9v=eQ#^CAd=d#Wzp$Py8Crm;B From 068fa540be607ae0dd1479f11e438522af068814 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sun, 28 Mar 2021 19:18:16 +0300 Subject: [PATCH 395/463] Configured portals --- .../ru/betterend/blocks/EndPortalBlock.java | 55 ++++++----- .../ru/betterend/blocks/EternalPedestal.java | 16 +++- .../ru/betterend/registry/EndPortals.java | 28 +++++- .../ru/betterend/rituals/EternalRitual.java | 93 ++++++++++--------- 4 files changed, 112 insertions(+), 80 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index 0af2e3af..1dc53aee 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -84,6 +84,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) { if (world instanceof ServerWorld && !entity.hasVehicle() && !entity.hasPassengers() && entity.canUsePortals()) { if (entity.hasNetherPortalCooldown()) return; + entity.resetNetherPortalCooldown(); ServerWorld currentWorld = (ServerWorld) world; MinecraftServer server = currentWorld.getServer(); ServerWorld targetWorld = EndPortals.getWorld(server, state.get(PORTAL)); @@ -121,47 +122,45 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable return ERenderLayer.TRANSLUCENT; } - private BlockPos findExitPos(ServerWorld current, ServerWorld target, BlockPos pos, Entity entity) { - if (target == null) return null; - - Registry registry = target.getRegistryManager().getDimensionTypes(); - Identifier targetWorldId = target.getRegistryKey().getValue(); - Identifier currentWorldId = current.getRegistryKey().getValue(); + private BlockPos findExitPos(ServerWorld currentWorld, ServerWorld targetWorld, BlockPos currentPos, Entity entity) { + if (targetWorld == null) return null; + Registry registry = targetWorld.getRegistryManager().getDimensionTypes(); + Identifier targetWorldId = targetWorld.getRegistryKey().getValue(); + Identifier currentWorldId = currentWorld.getRegistryKey().getValue(); double targetMultiplier = Objects.requireNonNull(registry.get(targetWorldId)).getCoordinateScale(); double currentMultiplier = Objects.requireNonNull(registry.get(currentWorldId)).getCoordinateScale(); double multiplier = targetMultiplier > currentMultiplier ? 1.0 / targetMultiplier : currentMultiplier; - BlockPos.Mutable basePos = pos.mutableCopy().set(pos.getX() * multiplier, pos.getY(), pos.getZ() * multiplier); + BlockPos.Mutable basePos = currentPos.mutableCopy().set(currentPos.getX() * multiplier, currentPos.getY(), currentPos.getZ() * multiplier); Direction direction = Direction.EAST; BlockPos.Mutable checkPos = basePos.mutableCopy(); - for (int step = 1; step < 128; step++) { + for (int step = 1; step < 64; step++) { for (int i = 0; i < (step >> 1); i++) { - Chunk chunk = target.getChunk(checkPos); + Chunk chunk = targetWorld.getChunk(checkPos); if (chunk != null) { int surfaceY = chunk.sampleHeightmap(Heightmap.Type.WORLD_SURFACE, checkPos.getX() & 15, checkPos.getZ() & 15); int motionY = chunk.sampleHeightmap(Heightmap.Type.MOTION_BLOCKING, checkPos.getX() & 15, checkPos.getZ() & 15); int ceil = Math.max(surfaceY, motionY) + 1; - if (ceil > 5) { - checkPos.setY(ceil); - while (checkPos.getY() > 5) { - BlockState state = target.getBlockState(checkPos); - if (state.isOf(this)) { - Axis axis = state.get(AXIS); - checkPos = findCenter(target, checkPos, axis); + if (ceil < 5) continue; + checkPos.setY(ceil); + while (checkPos.getY() >= 5) { + BlockState state = targetWorld.getBlockState(checkPos); + if (state.isOf(this)) { + Axis axis = state.get(AXIS); + checkPos = findCenter(targetWorld, checkPos, axis); - Direction frontDir = Direction.from(axis, AxisDirection.POSITIVE).rotateYClockwise(); - Direction entityDir = entity.getMovementDirection(); - if (entityDir.getAxis().isVertical()) { - entityDir = frontDir; - } - - if (frontDir != entityDir && frontDir.getOpposite() != entityDir) { - entity.applyRotation(BlockRotation.CLOCKWISE_90); - entityDir = entityDir.rotateYClockwise(); - } - return checkPos.offset(entityDir); + Direction frontDir = Direction.from(axis, AxisDirection.POSITIVE).rotateYClockwise(); + Direction entityDir = entity.getMovementDirection(); + if (entityDir.getAxis().isVertical()) { + entityDir = frontDir; } - checkPos.move(Direction.DOWN); + + if (frontDir != entityDir && frontDir.getOpposite() != entityDir) { + entity.applyRotation(BlockRotation.CLOCKWISE_90); + entityDir = entityDir.rotateYClockwise(); + } + return checkPos.offset(entityDir); } + checkPos.move(Direction.DOWN); } } checkPos.move(direction); diff --git a/src/main/java/ru/betterend/blocks/EternalPedestal.java b/src/main/java/ru/betterend/blocks/EternalPedestal.java index b06ebfb7..aad5bea7 100644 --- a/src/main/java/ru/betterend/blocks/EternalPedestal.java +++ b/src/main/java/ru/betterend/blocks/EternalPedestal.java @@ -9,7 +9,6 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.entity.BlockEntity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.loot.context.LootContext; import net.minecraft.loot.context.LootContextParameters; @@ -43,12 +42,19 @@ public class EternalPedestal extends PedestalBlock { if (blockEntity instanceof EternalPedestalEntity) { EternalPedestalEntity pedestal = (EternalPedestalEntity) blockEntity; BlockState updatedState = world.getBlockState(pos); - if (pedestal.isEmpty() && updatedState.get(ACTIVATED)) { + if (pedestal.isEmpty()) { if (pedestal.hasRitual()) { EternalRitual ritual = pedestal.getRitual(); - Item item = pedestal.getStack(0).getItem(); - int dim = EndPortals.getPortalState(Registry.ITEM.getId(item)); - ritual.removePortal(dim); + if (ritual.isActive()) { + Identifier targetWorld = ritual.getTargetWorldId(); + int portalId; + if (targetWorld != null) { + portalId = EndPortals.getPortalIdByWorld(targetWorld); + } else { + portalId = EndPortals.getPortalIdByWorld(EndPortals.OVERWORLD_ID); + } + ritual.disablePortal(portalId); + } } world.setBlockState(pos, updatedState.with(ACTIVATED, false).with(HAS_LIGHT, false)); } else { diff --git a/src/main/java/ru/betterend/registry/EndPortals.java b/src/main/java/ru/betterend/registry/EndPortals.java index 83ee1472..697cb21c 100644 --- a/src/main/java/ru/betterend/registry/EndPortals.java +++ b/src/main/java/ru/betterend/registry/EndPortals.java @@ -8,12 +8,17 @@ import com.google.gson.JsonObject; import net.minecraft.server.MinecraftServer; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; +import net.minecraft.world.World; import ru.betterend.BetterEnd; import ru.betterend.config.ConfigWriter; import ru.betterend.util.JsonFactory; import ru.betterend.util.MHelper; public class EndPortals { + + public final static Identifier OVERWORLD_ID = World.OVERWORLD.getValue(); + private static PortalInfo[] portals; public static void loadPortals() { @@ -43,14 +48,21 @@ public class EndPortals { return MHelper.max(portals.length - 1, 1); } - public static ServerWorld getWorld(MinecraftServer server, int state) { - if (state >= portals.length) { + public static ServerWorld getWorld(MinecraftServer server, int portalId) { + if (portalId < 0 || portalId >= portals.length) { return server.getOverworld(); } - return portals[state].getWorld(server); + return portals[portalId].getWorld(server); + } + + public static Identifier getWorldId(int portalId) { + if (portalId < 0 || portalId >= portals.length) { + return OVERWORLD_ID; + } + return portals[portalId].dimension; } - public static int getPortalState(Identifier item) { + public static int getPortalIdByItem(Identifier item) { for (int i = 0; i < portals.length; i++) { if (portals[i].item.equals(item)) { return i; @@ -58,6 +70,14 @@ public class EndPortals { } return 0; } + public static int getPortalIdByWorld(Identifier world) { + for (int i = 0; i < portals.length; i++) { + if (portals[i].dimension.equals(world)) { + return i; + } + } + return 0; + } public static int getColor(int state) { return portals[state].color; diff --git a/src/main/java/ru/betterend/rituals/EternalRitual.java b/src/main/java/ru/betterend/rituals/EternalRitual.java index 61d06ad6..0298e4ba 100644 --- a/src/main/java/ru/betterend/rituals/EternalRitual.java +++ b/src/main/java/ru/betterend/rituals/EternalRitual.java @@ -30,6 +30,7 @@ import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.feature.ConfiguredFeatures; +import org.jetbrains.annotations.Nullable; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.EndPortalBlock; import ru.betterend.blocks.RunedFlavolite; @@ -64,6 +65,7 @@ public class EternalRitual { private World world; private Direction.Axis axis; + private Identifier targetWorldId; private BlockPos center; private BlockPos exit; private boolean active = false; @@ -81,10 +83,14 @@ public class EternalRitual { this.world = world; } + @Nullable + public Identifier getTargetWorldId() { + return targetWorldId; + } + private boolean isInvalid() { return world == null || world.isClient() || - center == null || axis == null || - world.getRegistryKey() == World.NETHER; + center == null || axis == null; } public void checkStructure() { @@ -98,7 +104,7 @@ public class EternalRitual { moveX = Direction.SOUTH; moveY = Direction.EAST; } - boolean valid = checkFrame(); + boolean valid = checkFrame(world, center.down()); Item item = null; for (Point pos : STRUCTURE_MAP) { BlockPos.Mutable checkPos = center.mutableCopy(); @@ -121,8 +127,7 @@ public class EternalRitual { } } - private boolean checkFrame() { - BlockPos framePos = center.down(); + private boolean checkFrame(World world, BlockPos framePos) { Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH : Direction.EAST; boolean valid = true; for (Point point : FRAME_MAP) { @@ -137,23 +142,24 @@ public class EternalRitual { } public boolean isActive() { - return this.active; + return active; } - private void activatePortal(Item item) { + private void activatePortal(Item keyItem) { if (active) return; - int state = EndPortals.getPortalState(Registry.ITEM.getId(item)); - activatePortal(world, center, state); + Identifier itemId = Registry.ITEM.getId(keyItem); + int portalId = EndPortals.getPortalIdByItem(itemId); + activatePortal(world, center, portalId); doEffects((ServerWorld) world, center); if (exit == null) { - this.exit = findPortalPos(state); + exit = findPortalPos(portalId); } else { - World targetWorld = getTargetWorld(state); - if (targetWorld.getBlockState(exit.up()).isOf(EndBlocks.END_PORTAL_BLOCK)) { - this.exit = findPortalPos(state); - } else { - activatePortal(targetWorld, exit, state); + World targetWorld = getTargetWorld(portalId); + if (!checkFrame(targetWorld, exit)) { + Direction.Axis portalAxis = (Direction.Axis.X == axis) ? Direction.Axis.Z : Direction.Axis.X; + generatePortal(targetWorld, exit, portalAxis, portalId); } + activatePortal(targetWorld, exit, portalId); } this.active = true; } @@ -214,17 +220,14 @@ public class EternalRitual { }); } - public void removePortal(int state) { + public void disablePortal(int state) { if (!active || isInvalid()) return; - System.out.println(getTargetWorld(state).getRegistryKey()); - System.out.println(exit); removePortal(getTargetWorld(state), exit); removePortal(world, center); } private void removePortal(World world, BlockPos center) { BlockPos framePos = center.down(); - System.out.println(framePos); Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH : Direction.EAST; FRAME_MAP.forEach(point -> { BlockPos pos = framePos.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); @@ -251,33 +254,33 @@ public class EternalRitual { this.active = false; } - private BlockPos findPortalPos(int state) { + private BlockPos findPortalPos(int portalId) { + targetWorldId = EndPortals.getWorldId(portalId); MinecraftServer server = world.getServer(); - assert server != null; - ServerWorld targetWorld = (ServerWorld) getTargetWorld(state); - Identifier targetWorldId = targetWorld.getRegistryKey().getValue(); - Registry registry = server.getRegistryManager().getDimensionTypes(); + ServerWorld targetWorld = (ServerWorld) getTargetWorld(portalId); + Registry registry = Objects.requireNonNull(server).getRegistryManager().getDimensionTypes(); double multiplier = Objects.requireNonNull(registry.get(targetWorldId)).getCoordinateScale(); BlockPos.Mutable basePos = center.mutableCopy().set(center.getX() / multiplier, center.getY(), center.getZ() / multiplier); Direction.Axis portalAxis = (Direction.Axis.X == axis) ? Direction.Axis.Z : Direction.Axis.X; int worldCeil = targetWorld.getDimensionHeight() - 1; if (checkIsAreaValid(targetWorld, basePos, portalAxis)) { - EternalRitual.generatePortal(targetWorld, basePos, portalAxis); + EternalRitual.generatePortal(targetWorld, basePos, portalAxis, portalId); return basePos.toImmutable(); } else { Direction direction = Direction.EAST; BlockPos.Mutable checkPos = basePos.mutableCopy(); - for (int step = 1; step < 128; step++) { + for (int step = 1; step < 64; step++) { for (int i = 0; i < (step >> 1); i++) { - Chunk chunk = world.getChunk(checkPos); + Chunk chunk = targetWorld.getChunk(checkPos); if (chunk != null) { - int ceil = chunk.sampleHeightmap(Heightmap.Type.WORLD_SURFACE, checkPos.getX() & 15, checkPos.getZ() & 15) + 1; - ceil = Math.min(ceil, worldCeil); + int surfaceY = chunk.sampleHeightmap(Heightmap.Type.WORLD_SURFACE, checkPos.getX() & 15, checkPos.getZ() & 15); + int motionY = chunk.sampleHeightmap(Heightmap.Type.MOTION_BLOCKING, checkPos.getX() & 15, checkPos.getZ() & 15); + int ceil = Math.min(Math.max(surfaceY, motionY) + 1, worldCeil); if (ceil < 5) continue; checkPos.setY(ceil); - while (checkPos.getY() > 2) { + while (checkPos.getY() >= 5) { if(checkIsAreaValid(targetWorld, checkPos, portalAxis)) { - EternalRitual.generatePortal(targetWorld, checkPos, portalAxis); + generatePortal(targetWorld, checkPos, portalAxis, portalId); return checkPos.toImmutable(); } checkPos.move(Direction.DOWN); @@ -290,12 +293,11 @@ public class EternalRitual { } if (targetWorld.getRegistryKey() == World.END) { ConfiguredFeatures.END_ISLAND.generate(targetWorld, targetWorld.getChunkManager().getChunkGenerator(), new Random(basePos.asLong()), basePos.down()); - } - else { + } else if (targetWorld.getRegistryKey() == World.OVERWORLD) { basePos.setY(targetWorld.getChunk(basePos).sampleHeightmap(Heightmap.Type.WORLD_SURFACE, basePos.getX(), basePos.getZ()) + 1); EndFeatures.OVERWORLD_ISLAND.getFeatureConfigured().generate(targetWorld, targetWorld.getChunkManager().getChunkGenerator(), new Random(basePos.asLong()), basePos.down()); } - EternalRitual.generatePortal(targetWorld, basePos, portalAxis); + generatePortal(targetWorld, basePos, portalAxis, portalId); return basePos.toImmutable(); } @@ -307,7 +309,6 @@ public class EternalRitual { } private boolean checkIsAreaValid(World world, BlockPos pos, Direction.Axis axis) { - System.out.println(pos.getY()); if (pos.getY() >= world.getDimensionHeight() - 1) return false; if (!isBaseValid(world, pos, axis)) return false; return EternalRitual.checkArea(world, pos, axis); @@ -338,7 +339,7 @@ public class EternalRitual { return state.isSolidBlock(world, pos) && state.isFullCube(world, pos); } - public static void generatePortal(World world, BlockPos center, Direction.Axis axis) { + public static void generatePortal(World world, BlockPos center, Direction.Axis axis, int portalId) { BlockPos framePos = center.down(); Direction moveDir = Direction.Axis.X == axis ? Direction.EAST : Direction.NORTH; BlockState frame = FRAME.getDefaultState().with(ACTIVE, true); @@ -348,7 +349,7 @@ public class EternalRitual { pos = framePos.mutableCopy().move(moveDir, -point.x).move(Direction.UP, point.y); world.setBlockState(pos, frame); }); - BlockState portal = PORTAL.getDefaultState().with(EndPortalBlock.AXIS, axis); + BlockState portal = PORTAL.getDefaultState().with(EndPortalBlock.AXIS, axis).with(EndPortalBlock.PORTAL, portalId); PORTAL_MAP.forEach(point -> { BlockPos pos = center.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); world.setBlockState(pos, portal); @@ -489,20 +490,26 @@ public class EternalRitual { public CompoundTag toTag(CompoundTag tag) { tag.put("center", NbtHelper.fromBlockPos(center)); + tag.putString("axis", axis.getName()); + tag.putBoolean("active", active); + if (targetWorldId != null) { + tag.putString("key_item", targetWorldId.toString()); + } if (exit != null) { tag.put("exit", NbtHelper.fromBlockPos(exit)); } - tag.putString("axis", axis.getName()); - tag.putBoolean("active", active); return tag; } public void fromTag(CompoundTag tag) { - this.axis = Direction.Axis.fromName(tag.getString("axis")); - this.center = NbtHelper.toBlockPos(tag.getCompound("center")); - this.active = tag.getBoolean("active"); + axis = Direction.Axis.fromName(tag.getString("axis")); + center = NbtHelper.toBlockPos(tag.getCompound("center")); + active = tag.getBoolean("active"); if (tag.contains("exit")) { - this.exit = NbtHelper.toBlockPos(tag.getCompound("exit")); + exit = NbtHelper.toBlockPos(tag.getCompound("exit")); + } + if (tag.contains("key_item")) { + targetWorldId = new Identifier(tag.getString("key_item")); } } From 83f4f923b1bd796285a135e6bf4ab85cfbfd343c Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sun, 28 Mar 2021 19:43:16 +0300 Subject: [PATCH 396/463] Pedestals serialization --- .../entities/EternalPedestalEntity.java | 18 +++++----- .../entities/InfusionPedestalEntity.java | 25 ++++++------- .../blocks/entities/PedestalBlockEntity.java | 35 ++++++++++--------- 3 files changed, 38 insertions(+), 40 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java index f244e71a..1c60518a 100644 --- a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java @@ -33,15 +33,6 @@ public class EternalPedestalEntity extends PedestalBlockEntity { linkedRitual.setWorld(world); } } - - @Override - public void fromTag(BlockState state, CompoundTag tag) { - super.fromTag(state, tag); - if (tag.contains("ritual")) { - linkedRitual = new EternalRitual(world); - linkedRitual.fromTag(tag.getCompound("ritual")); - } - } @Override public CompoundTag toTag(CompoundTag tag) { @@ -50,4 +41,13 @@ public class EternalPedestalEntity extends PedestalBlockEntity { } return super.toTag(tag); } + + @Override + protected void fromTag(CompoundTag tag) { + super.fromTag(tag); + if (tag.contains("ritual")) { + linkedRitual = new EternalRitual(world); + linkedRitual.fromTag(tag.getCompound("ritual")); + } + } } diff --git a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java index d8a8251b..b27bea86 100644 --- a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java @@ -1,6 +1,7 @@ package ru.betterend.blocks.entities; import net.minecraft.block.BlockState; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -42,27 +43,21 @@ public class InfusionPedestalEntity extends PedestalBlockEntity { } super.tick(); } - + @Override - public CompoundTag toInitialChunkDataTag() { - return this.toTag(new CompoundTag()); + public CompoundTag toTag(CompoundTag tag) { + if (hasRitual()) { + tag.put("ritual", linkedRitual.toTag(new CompoundTag())); + } + return super.toTag(tag); } - + @Override - public void fromTag(BlockState state, CompoundTag tag) { - super.fromTag(state, tag); + protected void fromTag(CompoundTag tag) { + super.fromTag(tag); if (tag.contains("ritual")) { linkedRitual = new InfusionRitual(world, pos); linkedRitual.fromTag(tag.getCompound("ritual")); } } - - @Override - public CompoundTag toTag(CompoundTag tag) { - super.toTag(tag); - if (hasRitual()) { - tag.put("ritual", linkedRitual.toTag(new CompoundTag())); - } - return tag; - } } diff --git a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java index d1ed681f..fdba6eff 100644 --- a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java @@ -106,14 +106,30 @@ public class PedestalBlockEntity extends BlockEntity implements Inventory, Ticka @Override public void fromTag(BlockState state, CompoundTag tag) { super.fromTag(state, tag); - fromClientTag(tag); + fromTag(tag); } @Override public CompoundTag toTag(CompoundTag tag) { - super.toTag(tag); tag.put("active_item", activeItem.toTag(new CompoundTag())); - return tag; + return super.toTag(tag); + } + + @Override + public void fromClientTag(CompoundTag tag) { + fromTag(tag); + } + + @Override + public CompoundTag toClientTag(CompoundTag tag) { + return toTag(tag); + } + + protected void fromTag(CompoundTag tag) { + if (tag.contains("active_item")) { + CompoundTag itemTag = tag.getCompound("active_item"); + activeItem = ItemStack.fromTag(itemTag); + } } @Override @@ -125,17 +141,4 @@ public class PedestalBlockEntity extends BlockEntity implements Inventory, Ticka } } } - - @Override - public void fromClientTag(CompoundTag tag) { - if (tag.contains("active_item")) { - CompoundTag itemTag = tag.getCompound("active_item"); - activeItem = ItemStack.fromTag(itemTag); - } - } - - @Override - public CompoundTag toClientTag(CompoundTag tag) { - return toTag(tag); - } } From 21358808e4308664dd9c9d7cc63a1347e11b7e68 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 28 Mar 2021 20:04:52 +0300 Subject: [PATCH 397/463] Different island terrain (WIP) --- .../util/sdf/operator/SDFHeightmap.java | 59 ++++++++++++++++++ .../world/generator/IslandLayer.java | 35 +++++++++-- .../textures/heightmaps/mountain_1.png | Bin 0 -> 19907 bytes 3 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 src/main/java/ru/betterend/util/sdf/operator/SDFHeightmap.java create mode 100644 src/main/resources/assets/betterend/textures/heightmaps/mountain_1.png diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFHeightmap.java b/src/main/java/ru/betterend/util/sdf/operator/SDFHeightmap.java new file mode 100644 index 00000000..82ba749a --- /dev/null +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFHeightmap.java @@ -0,0 +1,59 @@ +package ru.betterend.util.sdf.operator; + +import net.minecraft.client.texture.NativeImage; +import net.minecraft.util.math.MathHelper; + +public class SDFHeightmap extends SDFDisplacement { + private float intensity = 1F; + private NativeImage map; + private float offsetX; + private float offsetZ; + private float angle; + private float scale; + + public SDFHeightmap() { + setFunction((pos) -> { + if (map == null) { + return 0F; + } + float dx = MathHelper.clamp(pos.getX() * scale + offsetX, 0, map.getWidth() - 2); + float dz = MathHelper.clamp(pos.getZ() * scale + offsetZ, 0, map.getHeight() - 2); + int x1 = MathHelper.floor(dx); + int z1 = MathHelper.floor(dz); + int x2 = x1 + 1; + int z2 = z1 + 1; + dx = dx - x1; + dz = dz - z1; + float a = (map.getPixelColor(x1, z1) & 255) / 255F; + float b = (map.getPixelColor(x2, z1) & 255) / 255F; + float c = (map.getPixelColor(x1, z2) & 255) / 255F; + float d = (map.getPixelColor(x2, z2) & 255) / 255F; + a = MathHelper.lerp(dx, a, b); + b = MathHelper.lerp(dx, c, d); + return -MathHelper.lerp(dz, a, b) * intensity; + }); + } + + public SDFHeightmap setMap(NativeImage map) { + this.map = map; + offsetX = map.getWidth() * 0.5F; + offsetZ = map.getHeight() * 0.5F; + scale = map.getWidth(); + return this; + } + + public SDFHeightmap setAngle(float angle) { + this.angle = angle; + return this; + } + + public SDFHeightmap setScale(float scale) { + this.scale = map.getWidth() * scale; + return this; + } + + public SDFHeightmap setIntensity(float intensity) { + this.intensity = intensity; + return this; + } +} diff --git a/src/main/java/ru/betterend/world/generator/IslandLayer.java b/src/main/java/ru/betterend/world/generator/IslandLayer.java index a5fff6e2..bd08ff1c 100644 --- a/src/main/java/ru/betterend/world/generator/IslandLayer.java +++ b/src/main/java/ru/betterend/world/generator/IslandLayer.java @@ -1,5 +1,7 @@ package ru.betterend.world.generator; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -8,10 +10,13 @@ import java.util.Random; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import net.minecraft.client.texture.NativeImage; import net.minecraft.util.math.BlockPos; +import ru.betterend.BetterEnd; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFHeightmap; import ru.betterend.util.sdf.operator.SDFScale; import ru.betterend.util.sdf.operator.SDFSmoothUnion; import ru.betterend.util.sdf.operator.SDFTranslate; @@ -19,7 +24,7 @@ import ru.betterend.util.sdf.primitive.SDFCappedCone; public class IslandLayer { private static final Random RANDOM = new Random(); - private static final SDF ISLAND; + private static final SDF[] ISLAND; private final List positions = new ArrayList(9); private final Map islands = Maps.newHashMap(); @@ -86,11 +91,11 @@ public class IslandLayer { SDF island = islands.get(pos); if (island == null) { if (pos.getX() == 0 && pos.getZ() == 0) { - island = new SDFScale().setScale(1.3F).setSource(ISLAND); + island = new SDFScale().setScale(1.3F).setSource(ISLAND[0]); } else { RANDOM.setSeed(getSeed(pos.getX(), pos.getZ())); - island = new SDFScale().setScale(RANDOM.nextFloat() + 0.5F).setSource(ISLAND); + island = new SDFScale().setScale(RANDOM.nextFloat() + 0.5F).setSource(ISLAND[0]); } islands.put(pos, island); } @@ -130,7 +135,24 @@ public class IslandLayer { return new SDFTranslate().setTranslate(0, minY + hh, 0).setSource(sdf); } + private static NativeImage loadMap(String path) { + InputStream stream = IslandLayer.class.getResourceAsStream(path); + if (stream != null) { + try { + NativeImage map = NativeImage.read(stream); + stream.close(); + return map; + } + catch (IOException e) { + BetterEnd.LOGGER.warning(e.getMessage()); + } + } + return null; + } + static { + NativeImage map = loadMap("/assets/" + BetterEnd.MOD_ID + "/textures/heightmaps/mountain_1.png"); + SDF cone1 = makeCone(0, 0.4F, 0.2F, -0.3F); SDF cone2 = makeCone(0.4F, 0.5F, 0.1F, -0.1F); SDF cone3 = makeCone(0.5F, 0.45F, 0.03F, 0.0F); @@ -139,6 +161,11 @@ public class IslandLayer { SDF coneBottom = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone1).setSourceB(cone2); SDF coneTop = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone3).setSourceB(cone4); - ISLAND = new SDFSmoothUnion().setRadius(0.01F).setSourceA(coneTop).setSourceB(coneBottom); + SDF map1 = new SDFHeightmap().setMap(map).setIntensity(0.3F).setSource(coneTop); + + ISLAND = new SDF[] { + new SDFSmoothUnion().setRadius(0.01F).setSourceA(coneTop).setSourceB(coneBottom), + new SDFSmoothUnion().setRadius(0.01F).setSourceA(map1).setSourceB(coneBottom) + }; } } diff --git a/src/main/resources/assets/betterend/textures/heightmaps/mountain_1.png b/src/main/resources/assets/betterend/textures/heightmaps/mountain_1.png new file mode 100644 index 0000000000000000000000000000000000000000..020f8daa9b814881ee0a877d7aea778827726044 GIT binary patch literal 19907 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 literal 0 HcmV?d00001 From cee5c914f9aa9e8299aab8492c789157f88fd540 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 29 Mar 2021 08:49:40 +0300 Subject: [PATCH 398/463] Biome height support --- .../integration/byg/biomes/EterialGrove.java | 2 +- .../byg/biomes/NightshadeRedwoods.java | 2 +- .../byg/biomes/OldBulbisGardens.java | 2 +- .../common/NoiseChunkGeneratorMixin.java | 10 +++- .../java/ru/betterend/registry/EndBiomes.java | 12 ++-- .../ru/betterend/registry/EndFeatures.java | 2 +- .../util/sdf/operator/SDFRadialNoiseMap.java | 60 +++++++++++++++++++ .../biome/{land => }/BiomeDefinition.java | 10 +++- .../ru/betterend/world/biome/EndBiome.java | 1 - .../world/biome/air/BiomeIceStarfield.java | 2 +- .../biome/cave/EmptyAuroraCaveBiome.java | 2 +- .../world/biome/cave/EmptyEndCaveBiome.java | 2 +- .../biome/cave/EmptySmaragdantCaveBiome.java | 2 +- .../world/biome/cave/EndCaveBiome.java | 2 +- .../world/biome/cave/LushAuroraCaveBiome.java | 2 +- .../biome/cave/LushSmaragdantCaveBiome.java | 2 +- .../world/biome/land/AmberLandBiome.java | 1 + .../biome/land/BlossomingSpiresBiome.java | 1 + .../world/biome/land/ChorusForestBiome.java | 1 + .../biome/land/CrystalMountainsBiome.java | 1 + .../biome/land/DragonGraveyardsBiome.java | 1 + .../world/biome/land/DryShrublandBiome.java | 1 + .../world/biome/land/DustWastelandsBiome.java | 1 + .../biome/land/FoggyMushroomlandBiome.java | 1 + .../biome/land/GlowingGrasslandsBiome.java | 1 + .../world/biome/land/LanternWoodsBiome.java | 1 + .../world/biome/land/MegalakeBiome.java | 2 + .../world/biome/land/MegalakeGroveBiome.java | 2 + .../world/biome/land/NeonOasisBiome.java | 1 + .../biome/land/PaintedMountainsBiome.java | 1 + .../world/biome/land/ShadowForestBiome.java | 1 + .../world/biome/land/SulphurSpringsBiome.java | 2 + .../world/biome/land/UmbrellaJungleBiome.java | 1 + .../world/generator/BetterEndBiomeSource.java | 18 ++++++ .../world/generator/IslandLayer.java | 40 +++++++++---- .../world/generator/TerrainGenerator.java | 60 +++++++++++++++++-- 36 files changed, 212 insertions(+), 41 deletions(-) create mode 100644 src/main/java/ru/betterend/util/sdf/operator/SDFRadialNoiseMap.java rename src/main/java/ru/betterend/world/biome/{land => }/BiomeDefinition.java (95%) diff --git a/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java b/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java index 55f4df4d..cec4f4c5 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java @@ -10,8 +10,8 @@ import net.minecraft.world.biome.SpawnSettings.SpawnEntry; import ru.betterend.BetterEnd; import ru.betterend.integration.Integrations; import ru.betterend.integration.byg.features.BYGFeatures; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; -import ru.betterend.world.biome.land.BiomeDefinition; public class EterialGrove extends EndBiome { public EterialGrove() { diff --git a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java index b2bf0654..525b433a 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java @@ -13,8 +13,8 @@ import ru.betterend.BetterEnd; import ru.betterend.integration.Integrations; import ru.betterend.integration.byg.features.BYGFeatures; import ru.betterend.registry.EndFeatures; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; -import ru.betterend.world.biome.land.BiomeDefinition; public class NightshadeRedwoods extends EndBiome { public NightshadeRedwoods() { diff --git a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java index da349ef9..ec711c80 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java @@ -20,8 +20,8 @@ import ru.betterend.BetterEnd; import ru.betterend.integration.Integrations; import ru.betterend.integration.byg.features.BYGFeatures; import ru.betterend.registry.EndFeatures; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; -import ru.betterend.world.biome.land.BiomeDefinition; public class OldBulbisGardens extends EndBiome { public OldBulbisGardens() { diff --git a/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java b/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java index a41e262b..50b859ab 100644 --- a/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java +++ b/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java @@ -10,17 +10,23 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.minecraft.world.biome.source.BiomeSource; +import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraft.world.gen.chunk.NoiseChunkGenerator; +import net.minecraft.world.gen.chunk.StructuresConfig; import ru.betterend.world.generator.GeneratorOptions; import ru.betterend.world.generator.TerrainGenerator; @Mixin(NoiseChunkGenerator.class) -public abstract class NoiseChunkGeneratorMixin { +public abstract class NoiseChunkGeneratorMixin extends ChunkGenerator { @Final @Shadow protected Supplier settings; + public NoiseChunkGeneratorMixin(BiomeSource populationSource, BiomeSource biomeSource, StructuresConfig structuresConfig, long worldSeed) { + super(populationSource, biomeSource, structuresConfig, worldSeed); + } + @Inject(method = "(Lnet/minecraft/world/biome/source/BiomeSource;Lnet/minecraft/world/biome/source/BiomeSource;JLjava/util/function/Supplier;)V", at = @At("TAIL")) private void beOnInit(BiomeSource populationSource, BiomeSource biomeSource, long seed, Supplier settings, CallbackInfo info) { TerrainGenerator.initNoise(seed); @@ -30,7 +36,7 @@ public abstract class NoiseChunkGeneratorMixin { private void beSampleNoiseColumn(double[] buffer, int x, int z, CallbackInfo info) { if (GeneratorOptions.useNewGenerator() && settings.get().equals(ChunkGeneratorSettings.END)) { if (TerrainGenerator.canGenerate(x, z)) { - TerrainGenerator.fillTerrainDensity(buffer, x, z); + TerrainGenerator.fillTerrainDensity(buffer, x, z, getBiomeSource()); info.cancel(); } } diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index c32494ad..3bf04bb4 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -287,8 +287,8 @@ public class EndBiomes { * @return registered {@link EndBiome} */ public static EndBiome registerSubBiome(EndBiome biome, EndBiome parent) { - registerBiomeDirectly(biome); if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { + registerBiomeDirectly(biome); parent.addSubBiome(biome); SUBBIOMES.add(biome); SUBBIOMES_UNMUTABLES.add(biome.getID()); @@ -305,8 +305,8 @@ public class EndBiomes { * @return registered {@link EndBiome} */ public static EndBiome registerBiome(EndBiome biome, BiomeType type) { - registerBiomeDirectly(biome); if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { + registerBiomeDirectly(biome); addToPicker(biome, type); ID_MAP.put(biome.getID(), biome); if (type == BiomeType.LAND) { @@ -325,8 +325,8 @@ public class EndBiomes { * @return registered {@link EndBiome} */ public static EndBiome registerSubBiomeIntegration(EndBiome biome) { - registerBiomeDirectly(biome); if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { + registerBiomeDirectly(biome); SUBBIOMES.add(biome); SUBBIOMES_UNMUTABLES.add(biome.getID()); ID_MAP.put(biome.getID(), biome); @@ -367,9 +367,7 @@ public class EndBiomes { } private static void registerBiomeDirectly(EndBiome biome) { - if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { - Registry.register(BuiltinRegistries.BIOME, biome.getID(), biome.getBiome()); - } + Registry.register(BuiltinRegistries.BIOME, biome.getID(), biome.getBiome()); } private static void addLandBiomeToFabricApi(EndBiome biome) { @@ -420,8 +418,8 @@ public class EndBiomes { } public static EndCaveBiome registerCaveBiome(EndCaveBiome biome) { - registerBiomeDirectly(biome); if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { + registerBiomeDirectly(biome); CAVE_BIOMES.addBiome(biome); ID_MAP.put(biome.getID(), biome); } diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 5adb90c9..ac5616d2 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -11,8 +11,8 @@ import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.GenerationStep; import net.minecraft.world.gen.feature.ConfiguredFeature; import ru.betterend.BetterEnd; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; -import ru.betterend.world.biome.land.BiomeDefinition; import ru.betterend.world.features.BlueVineFeature; import ru.betterend.world.features.CavePumpkinFeature; import ru.betterend.world.features.CharniaFeature; diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFRadialNoiseMap.java b/src/main/java/ru/betterend/util/sdf/operator/SDFRadialNoiseMap.java new file mode 100644 index 00000000..eeeb6918 --- /dev/null +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFRadialNoiseMap.java @@ -0,0 +1,60 @@ +package ru.betterend.util.sdf.operator; + +import net.minecraft.util.math.MathHelper; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.util.MHelper; + +public class SDFRadialNoiseMap extends SDFDisplacement { + private static final float SIN = MathHelper.sin(0.5F); + private static final float COS = MathHelper.cos(0.5F); + + private OpenSimplexNoise noise; + private float intensity = 1F; + private float radius = 1F; + private short offsetX; + private short offsetZ; + + public SDFRadialNoiseMap() { + setFunction((pos) -> { + if (intensity == 0) { + return 0F; + } + float px = pos.getX() / radius; + float pz = pos.getZ() / radius; + float distance = MHelper.lengthSqr(px, pz); + if (distance > 1) { + return 0F; + } + distance = 1 - MathHelper.sqrt(distance); + float nx = px * COS - pz * SIN; + float nz = pz * COS + px * SIN; + distance *= getNoise(nx * 0.75 + offsetX, nz * 0.75 + offsetZ); + return distance * intensity; + }); + } + + private float getNoise(double x, double z) { + return (float) noise.eval(x, z) + (float) noise.eval(x * 3 + 1000, z * 3) * 0.5F + (float) noise.eval(x * 9 + 1000, z * 9) * 0.2F; + } + + public SDFRadialNoiseMap setSeed(long seed) { + noise = new OpenSimplexNoise(seed); + return this; + } + + public SDFRadialNoiseMap setIntensity(float intensity) { + this.intensity = intensity; + return this; + } + + public SDFRadialNoiseMap setRadius(float radius) { + this.radius = radius; + return this; + } + + public SDFRadialNoiseMap setOffset(int x, int z) { + offsetX = (short) (x & 32767); + offsetZ = (short) (z & 32767); + return this; + } +} diff --git a/src/main/java/ru/betterend/world/biome/land/BiomeDefinition.java b/src/main/java/ru/betterend/world/biome/BiomeDefinition.java similarity index 95% rename from src/main/java/ru/betterend/world/biome/land/BiomeDefinition.java rename to src/main/java/ru/betterend/world/biome/BiomeDefinition.java index 378b1902..49475736 100644 --- a/src/main/java/ru/betterend/world/biome/land/BiomeDefinition.java +++ b/src/main/java/ru/betterend/world/biome/BiomeDefinition.java @@ -1,4 +1,4 @@ -package ru.betterend.world.biome.land; +package ru.betterend.world.biome; import java.util.List; @@ -63,6 +63,7 @@ public class BiomeDefinition { private int foliageColor = DEF_FOLIAGE; private int grassColor = DEF_FOLIAGE; private float fogDensity = 1F; + private float depth = 0.1F; private final Identifier id; private float genChance = 1F; @@ -112,6 +113,11 @@ public class BiomeDefinition { this.genChance = genChance; return this; } + + public BiomeDefinition setDepth(float depth) { + this.depth = depth; + return this; + } public BiomeDefinition addMobSpawn(EntityType type, int weight, int minGroupSize, int maxGroupSize) { Identifier eID = Registry.ENTITY_TYPE.getId(type); @@ -256,7 +262,7 @@ public class BiomeDefinition { return new Biome.Builder() .precipitation(Precipitation.NONE) .category(isCaveBiome ? Category.NONE : Category.THEEND) - .depth(0.1F) + .depth(depth) .scale(0.2F) .temperature(2.0F) .downfall(0.0F) diff --git a/src/main/java/ru/betterend/world/biome/EndBiome.java b/src/main/java/ru/betterend/world/biome/EndBiome.java index 81a25b3f..7b1a5f02 100644 --- a/src/main/java/ru/betterend/world/biome/EndBiome.java +++ b/src/main/java/ru/betterend/world/biome/EndBiome.java @@ -14,7 +14,6 @@ import net.minecraft.world.biome.Biome; import ru.betterend.config.Configs; import ru.betterend.util.JsonFactory; import ru.betterend.util.StructureHelper; -import ru.betterend.world.biome.land.BiomeDefinition; import ru.betterend.world.features.EndFeature; import ru.betterend.world.features.ListFeature; import ru.betterend.world.features.ListFeature.StructureInfo; diff --git a/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java b/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java index b1106d6f..a9b42808 100644 --- a/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java +++ b/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java @@ -4,8 +4,8 @@ import net.minecraft.entity.EntityType; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; -import ru.betterend.world.biome.land.BiomeDefinition; public class BiomeIceStarfield extends EndBiome { public BiomeIceStarfield() { diff --git a/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java index 2966bcca..93fb0624 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java @@ -3,7 +3,7 @@ package ru.betterend.world.biome.cave; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; -import ru.betterend.world.biome.land.BiomeDefinition; +import ru.betterend.world.biome.BiomeDefinition; public class EmptyAuroraCaveBiome extends EndCaveBiome { public EmptyAuroraCaveBiome() { diff --git a/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java index 9c5be371..4976fed1 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java @@ -2,7 +2,7 @@ package ru.betterend.world.biome.cave; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; -import ru.betterend.world.biome.land.BiomeDefinition; +import ru.betterend.world.biome.BiomeDefinition; public class EmptyEndCaveBiome extends EndCaveBiome { public EmptyEndCaveBiome() { diff --git a/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java index bf73fbeb..ed5ed762 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java @@ -3,7 +3,7 @@ package ru.betterend.world.biome.cave; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; -import ru.betterend.world.biome.land.BiomeDefinition; +import ru.betterend.world.biome.BiomeDefinition; public class EmptySmaragdantCaveBiome extends EndCaveBiome { public EmptySmaragdantCaveBiome() { diff --git a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java index 5ae1d3c2..dd2cab46 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java @@ -7,8 +7,8 @@ import net.minecraft.util.collection.WeightedList; import net.minecraft.util.math.BlockPos; import net.minecraft.world.gen.feature.Feature; import ru.betterend.registry.EndBiomes; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; -import ru.betterend.world.biome.land.BiomeDefinition; import ru.betterend.world.features.EndFeature; import ru.betterend.world.features.terrain.caves.CaveChunkPopulatorFeature; diff --git a/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java index d6052b44..4271d50a 100644 --- a/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java @@ -8,7 +8,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; -import ru.betterend.world.biome.land.BiomeDefinition; +import ru.betterend.world.biome.BiomeDefinition; public class LushAuroraCaveBiome extends EndCaveBiome { public LushAuroraCaveBiome() { diff --git a/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java index c821f6a5..c9a40749 100644 --- a/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java @@ -4,7 +4,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; -import ru.betterend.world.biome.land.BiomeDefinition; +import ru.betterend.world.biome.BiomeDefinition; public class LushSmaragdantCaveBiome extends EndCaveBiome { public LushSmaragdantCaveBiome() { diff --git a/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java b/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java index e6ac94c1..768ba362 100644 --- a/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java @@ -7,6 +7,7 @@ import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class AmberLandBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java b/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java index dcbf2f7b..92c95867 100644 --- a/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java @@ -5,6 +5,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class BlossomingSpiresBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java b/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java index 8535aa3c..fb55b03a 100644 --- a/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java @@ -9,6 +9,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class ChorusForestBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java b/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java index 3275fc28..d5c1d1d6 100644 --- a/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java @@ -5,6 +5,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class CrystalMountainsBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java b/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java index 822c43cf..a0f5f500 100644 --- a/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java @@ -5,6 +5,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class DragonGraveyardsBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java b/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java index dabd1e95..97715260 100644 --- a/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java @@ -5,6 +5,7 @@ import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class DryShrublandBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java b/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java index 50d3b5f9..8e26f57a 100644 --- a/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java @@ -5,6 +5,7 @@ import net.minecraft.particle.ParticleTypes; import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class DustWastelandsBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java b/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java index 1240a138..76f2623c 100644 --- a/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java @@ -8,6 +8,7 @@ import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class FoggyMushroomlandBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java b/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java index a4849806..df39d84a 100644 --- a/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java @@ -6,6 +6,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class GlowingGrasslandsBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java index 333dbd86..cad741a0 100644 --- a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java @@ -6,6 +6,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class LanternWoodsBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java b/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java index 53921f95..4c275a1b 100644 --- a/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java @@ -6,6 +6,7 @@ import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class MegalakeBiome extends EndBiome { @@ -18,6 +19,7 @@ public class MegalakeBiome extends EndBiome { .setMusic(EndSounds.MUSIC_WATER) .setLoop(EndSounds.AMBIENT_MEGALAKE) .setSurface(EndBlocks.END_MOSS, EndBlocks.ENDSTONE_DUST) + .setDepth(0F) .addStructureFeature(EndStructures.MEGALAKE) .addFeature(EndFeatures.END_LOTUS) .addFeature(EndFeatures.END_LOTUS_LEAF) diff --git a/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java b/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java index 19889a67..2ff13bbf 100644 --- a/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java @@ -7,6 +7,7 @@ import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class MegalakeGroveBiome extends EndBiome { @@ -20,6 +21,7 @@ public class MegalakeGroveBiome extends EndBiome { .setMusic(EndSounds.MUSIC_WATER) .setLoop(EndSounds.AMBIENT_MEGALAKE_GROVE) .setSurface(EndBlocks.END_MOSS) + .setDepth(0F) .addStructureFeature(EndStructures.MEGALAKE_SMALL) .addFeature(EndFeatures.LACUGROVE) .addFeature(EndFeatures.END_LOTUS) diff --git a/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java b/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java index 0b896855..bc49f6f8 100644 --- a/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java @@ -6,6 +6,7 @@ import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class NeonOasisBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java b/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java index c4552613..a25f388e 100644 --- a/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java @@ -5,6 +5,7 @@ import net.minecraft.particle.ParticleTypes; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class PaintedMountainsBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java b/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java index 8196e40f..ba4e7bed 100644 --- a/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java @@ -7,6 +7,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class ShadowForestBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java b/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java index eb274769..12888729 100644 --- a/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java @@ -5,6 +5,7 @@ import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; import ru.betterend.world.surface.SurfaceBuilders; @@ -19,6 +20,7 @@ public class SulphurSpringsBiome extends EndBiome { .setFogColor(207, 194, 62) .setFogDensity(1.5F) .setCaves(false) + .setDepth(0F) .setParticles(EndParticles.SULPHUR_PARTICLE, 0.001F) .addFeature(EndFeatures.GEYSER) .addFeature(EndFeatures.SURFACE_VENT) diff --git a/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java b/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java index f4a07e03..e14e62cd 100644 --- a/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java @@ -6,6 +6,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class UmbrellaJungleBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java index 503ab264..2c808ebe 100644 --- a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java +++ b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java @@ -108,6 +108,24 @@ public class BetterEndBiomeSource extends BiomeSource { return endBiome.getActualBiome(); } } + + public Biome getLandBiome(int biomeX, int biomeY, int biomeZ) { + boolean hasVoid = !GeneratorOptions.useNewGenerator() || !GeneratorOptions.noRingVoid(); + long i = (long) biomeX * (long) biomeX; + long j = (long) biomeZ * (long) biomeZ; + + long dist = i + j; + if (hasVoid) { + if (dist <= 65536L) return this.centerBiome; + } + else if (dist <= 625L) { + dist += noise.sample(i * 0.2, j * 0.2) * 10; + if (dist <= 625L) { + return this.centerBiome; + } + } + return mapLand.getBiome(biomeX << 2, biomeZ << 2).getActualBiome(); + } @Override public BiomeSource withSeed(long seed) { diff --git a/src/main/java/ru/betterend/world/generator/IslandLayer.java b/src/main/java/ru/betterend/world/generator/IslandLayer.java index bd08ff1c..26858fe9 100644 --- a/src/main/java/ru/betterend/world/generator/IslandLayer.java +++ b/src/main/java/ru/betterend/world/generator/IslandLayer.java @@ -1,7 +1,5 @@ package ru.betterend.world.generator; -import java.io.IOException; -import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -10,13 +8,11 @@ import java.util.Random; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import net.minecraft.client.texture.NativeImage; import net.minecraft.util.math.BlockPos; -import ru.betterend.BetterEnd; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; import ru.betterend.util.sdf.SDF; -import ru.betterend.util.sdf.operator.SDFHeightmap; +import ru.betterend.util.sdf.operator.SDFRadialNoiseMap; import ru.betterend.util.sdf.operator.SDFScale; import ru.betterend.util.sdf.operator.SDFSmoothUnion; import ru.betterend.util.sdf.operator.SDFTranslate; @@ -24,7 +20,8 @@ import ru.betterend.util.sdf.primitive.SDFCappedCone; public class IslandLayer { private static final Random RANDOM = new Random(); - private static final SDF[] ISLAND; + private final SDFRadialNoiseMap noise; + private final SDF island; private final List positions = new ArrayList(9); private final Map islands = Maps.newHashMap(); @@ -38,6 +35,16 @@ public class IslandLayer { this.density = new OpenSimplexNoise(seed); this.options = options; this.seed = seed; + + SDF cone1 = makeCone(0, 0.4F, 0.2F, -0.3F); + SDF cone2 = makeCone(0.4F, 0.5F, 0.1F, -0.1F); + SDF cone3 = makeCone(0.5F, 0.45F, 0.03F, 0.0F); + SDF cone4 = makeCone(0.45F, 0, 0.02F, 0.03F); + + SDF coneBottom = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone1).setSourceB(cone2); + SDF coneTop = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone3).setSourceB(cone4); + noise = (SDFRadialNoiseMap) new SDFRadialNoiseMap().setSeed(seed).setRadius(0.5F).setIntensity(0.2F).setSource(coneTop); + island = new SDFSmoothUnion().setRadius(0.01F).setSourceA(noise).setSourceB(coneBottom); } private int getSeed(int x, int z) { @@ -47,7 +54,6 @@ public class IslandLayer { } public void updatePositions(double x, double z) { - int ix = MHelper.floor(x / options.distance); int iz = MHelper.floor(z / options.distance); @@ -91,14 +97,15 @@ public class IslandLayer { SDF island = islands.get(pos); if (island == null) { if (pos.getX() == 0 && pos.getZ() == 0) { - island = new SDFScale().setScale(1.3F).setSource(ISLAND[0]); + island = new SDFScale().setScale(1.3F).setSource(this.island); } else { RANDOM.setSeed(getSeed(pos.getX(), pos.getZ())); - island = new SDFScale().setScale(RANDOM.nextFloat() + 0.5F).setSource(ISLAND[0]); + island = new SDFScale().setScale(RANDOM.nextFloat() + 0.5F).setSource(this.island); } islands.put(pos, island); } + noise.setOffset(pos.getX(), pos.getZ()); return island; } @@ -123,6 +130,12 @@ public class IslandLayer { return -calculateSDF(x, y, z); } + public float getDensity(double x, double y, double z, float height) { + noise.setIntensity(height); + noise.setRadius(0.5F / (1 + height)); + return -calculateSDF(x, y, z); + } + public void clearCache() { if (islands.size() > 128) { islands.clear(); @@ -135,7 +148,7 @@ public class IslandLayer { return new SDFTranslate().setTranslate(0, minY + hh, 0).setSource(sdf); } - private static NativeImage loadMap(String path) { + /*private static NativeImage loadMap(String path) { InputStream stream = IslandLayer.class.getResourceAsStream(path); if (stream != null) { try { @@ -148,9 +161,9 @@ public class IslandLayer { } } return null; - } + }*/ - static { + /*static { NativeImage map = loadMap("/assets/" + BetterEnd.MOD_ID + "/textures/heightmaps/mountain_1.png"); SDF cone1 = makeCone(0, 0.4F, 0.2F, -0.3F); @@ -162,10 +175,11 @@ public class IslandLayer { SDF coneTop = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone3).setSourceB(cone4); SDF map1 = new SDFHeightmap().setMap(map).setIntensity(0.3F).setSource(coneTop); + NOISE = (SDFRadialNoiseMap) new SDFRadialNoiseMap().setSource(coneTop); ISLAND = new SDF[] { new SDFSmoothUnion().setRadius(0.01F).setSourceA(coneTop).setSourceB(coneBottom), new SDFSmoothUnion().setRadius(0.01F).setSourceA(map1).setSourceB(coneBottom) }; - } + }*/ } diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index 6c72f3cf..39ff228f 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -1,9 +1,15 @@ package ru.betterend.world.generator; +import java.awt.Point; +import java.util.List; import java.util.Random; import java.util.concurrent.locks.ReentrantLock; +import com.google.common.collect.Lists; + import net.minecraft.util.math.MathHelper; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.source.BiomeSource; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; @@ -11,7 +17,8 @@ public class TerrainGenerator { private static final ReentrantLock LOCKER = new ReentrantLock(); private static final double SCALE_XZ = 8.0; private static final double SCALE_Y = 4.0; - //private static final int CENTER = MHelper.floor(500 / SCALE_XZ); + private static final float[] COEF; + private static final Point[] OFFS; private static IslandLayer largeIslands; private static IslandLayer mediumIslands; @@ -32,7 +39,7 @@ public class TerrainGenerator { noise2 = new OpenSimplexNoise(random.nextInt()); } - public static void fillTerrainDensity(double[] buffer, int x, int z) { + public static void fillTerrainDensity(double[] buffer, int x, int z, BiomeSource biomeSource) { LOCKER.lock(); largeIslands.clearCache(); @@ -48,11 +55,13 @@ public class TerrainGenerator { mediumIslands.updatePositions(px, pz); smallIslands.updatePositions(px, pz); + float height = getAverageDepth(biomeSource, x << 1, z << 1) * 0.5F; + for (int y = 0; y < buffer.length; y++) { double py = (double) y * SCALE_Y; - float dist = largeIslands.getDensity(px, py, pz); - dist = dist > 1 ? dist : MHelper.max(dist, mediumIslands.getDensity(px, py, pz)); - dist = dist > 1 ? dist : MHelper.max(dist, smallIslands.getDensity(px, py, pz)); + float dist = largeIslands.getDensity(px, py, pz, height); + dist = dist > 1 ? dist : MHelper.max(dist, mediumIslands.getDensity(px, py, pz, height)); + dist = dist > 1 ? dist : MHelper.max(dist, smallIslands.getDensity(px, py, pz, height)); if (dist > -0.5F) { dist += noise1.eval(px * 0.01, py * 0.01, pz * 0.01) * 0.02 + 0.02; dist += noise2.eval(px * 0.05, py * 0.05, pz * 0.05) * 0.01 + 0.01; @@ -64,6 +73,26 @@ public class TerrainGenerator { LOCKER.unlock(); } + private static float getAverageDepth(BiomeSource biomeSource, int x, int z) { + if (getBiome(biomeSource, x, z).getDepth() < 0.1F) { + return 0F; + } + float depth = 0F; + for (int i = 0; i < OFFS.length; i++) { + int px = x + OFFS[i].x; + int pz = z + OFFS[i].y; + depth += getBiome(biomeSource, px, pz).getDepth() * COEF[i]; + } + return depth; + } + + private static Biome getBiome(BiomeSource biomeSource, int x, int z) { + if (biomeSource instanceof BetterEndBiomeSource) { + return ((BetterEndBiomeSource) biomeSource).getLandBiome(x, 0, z); + } + return biomeSource.getBiomeForNoiseGen(x, 0, z); + } + /** * Check if this is land * @param x - biome pos x @@ -143,4 +172,25 @@ public class TerrainGenerator { LOCKER.unlock(); return 0; } + + static { + float sum = 0; + List coef = Lists.newArrayList(); + List pos = Lists.newArrayList(); + for (int x = -3; x <= 3; x++) { + for (int z = -3; z <= 3; z++) { + float dist = MHelper.length(x, z) / 3F; + if (dist <= 1) { + sum += dist; + coef.add(dist); + pos.add(new Point(x, z)); + } + } + } + OFFS = pos.toArray(new Point[] {}); + COEF = new float[coef.size()]; + for (int i = 0; i < COEF.length; i++) { + COEF[i] = coef.get(i) / sum; + } + } } From 5e1b66190514da0a11b75ca2133bf486dbb0905d Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 29 Mar 2021 08:52:22 +0300 Subject: [PATCH 399/463] Chorus plant shape fix --- .../betterend/mixin/common/ChorusFlowerBlockMixin.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java index 88cec28b..bc394a99 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java @@ -90,8 +90,13 @@ public abstract class ChorusFlowerBlockMixin extends Block { private void die(World world, BlockPos pos) {} @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return state.get(ChorusFlowerBlock.AGE) == 5 ? SHAPE_HALF : SHAPE_FULL; + public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { + if (GeneratorOptions.changeChorusPlant()) { + return state.get(ChorusFlowerBlock.AGE) == 5 ? SHAPE_HALF : SHAPE_FULL; + } + else { + return super.getOutlineShape(state, world, pos, context); + } } @Inject(method = "die", at = @At("HEAD"), cancellable = true) From 9d5957aec6d1044a6e3b718f92341b0d96530a52 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 29 Mar 2021 12:30:31 +0300 Subject: [PATCH 400/463] Menger sponge fix & cleanup --- .../blocks/MengerSpongeWetBlock.java | 21 +++++++++++-------- .../entities/EternalPedestalEntity.java | 1 - .../entities/InfusionPedestalEntity.java | 2 -- .../blocks/entities/PedestalBlockEntity.java | 1 - .../client/ClientPlayNetworkHandlerMixin.java | 3 --- .../ru/betterend/registry/EndPortals.java | 1 - .../ru/betterend/registry/EndStructures.java | 2 +- .../ru/betterend/rituals/EternalRitual.java | 3 ++- 8 files changed, 15 insertions(+), 19 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java b/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java index 548e0325..81ecce04 100644 --- a/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java +++ b/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java @@ -7,16 +7,18 @@ import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.entity.ItemEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.fluid.FluidState; import net.minecraft.fluid.Fluids; +import net.minecraft.item.ItemStack; import net.minecraft.particle.ParticleTypes; import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvents; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; +import net.minecraft.world.GameRules; import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; import ru.betterend.blocks.basis.BlockBaseNotFull; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; @@ -79,16 +81,17 @@ public class MengerSpongeWetBlock extends BlockBaseNotFull implements IRenderTyp } } } - - /*@Override - public void onBreak(World world, BlockPos pos, BlockState state, PlayerEntity player) { - world.breakBlock(pos, !player.isCreative()); - BlocksHelper.setWithUpdate(world, pos, Blocks.AIR); - }*/ - + @Override - public void onBroken(WorldAccess world, BlockPos pos, BlockState state) { + public void onBreak(World world, BlockPos pos, BlockState state, PlayerEntity player) { BlocksHelper.setWithUpdate(world, pos, Blocks.AIR); + if (!world.isClient()) { + world.syncWorldEvent(2001, pos, getRawIdFromState(state)); + } + if (world.getGameRules().getBoolean(GameRules.DO_TILE_DROPS) && (player == null || !player.isCreative())) { + ItemEntity drop = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(this)); + world.spawnEntity(drop); + } } @Override diff --git a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java index 1c60518a..30039b14 100644 --- a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java @@ -1,6 +1,5 @@ package ru.betterend.blocks.entities; -import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; diff --git a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java index b27bea86..66e40fa4 100644 --- a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java @@ -1,7 +1,5 @@ package ru.betterend.blocks.entities; -import net.minecraft.block.BlockState; -import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; diff --git a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java index fdba6eff..7bea10ec 100644 --- a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java @@ -8,7 +8,6 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.Inventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket; import net.minecraft.util.Tickable; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.registry.EndBlockEntities; diff --git a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java index 187693d5..8899eb4d 100644 --- a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java @@ -1,7 +1,5 @@ package ru.betterend.mixin.client; -import net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket; -import net.minecraft.util.math.BlockPos; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -14,7 +12,6 @@ import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.client.world.ClientWorld; import net.minecraft.network.NetworkThreadUtils; import net.minecraft.network.packet.s2c.play.SignEditorOpenS2CPacket; -import net.minecraft.util.thread.ThreadExecutor; import ru.betterend.blocks.entities.ESignBlockEntity; import ru.betterend.client.gui.BlockSignEditScreen; diff --git a/src/main/java/ru/betterend/registry/EndPortals.java b/src/main/java/ru/betterend/registry/EndPortals.java index 697cb21c..b75f1676 100644 --- a/src/main/java/ru/betterend/registry/EndPortals.java +++ b/src/main/java/ru/betterend/registry/EndPortals.java @@ -8,7 +8,6 @@ import com.google.gson.JsonObject; import net.minecraft.server.MinecraftServer; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; import net.minecraft.world.World; import ru.betterend.BetterEnd; import ru.betterend.config.ConfigWriter; diff --git a/src/main/java/ru/betterend/registry/EndStructures.java b/src/main/java/ru/betterend/registry/EndStructures.java index 1c0292a9..bc241280 100644 --- a/src/main/java/ru/betterend/registry/EndStructures.java +++ b/src/main/java/ru/betterend/registry/EndStructures.java @@ -14,8 +14,8 @@ import ru.betterend.world.structures.EndStructureFeature; import ru.betterend.world.structures.features.EternalPortalStructure; import ru.betterend.world.structures.features.GiantIceStarStructure; import ru.betterend.world.structures.features.GiantMossyGlowshroomStructure; -import ru.betterend.world.structures.features.MegaLakeStructure; import ru.betterend.world.structures.features.MegaLakeSmallStructure; +import ru.betterend.world.structures.features.MegaLakeStructure; import ru.betterend.world.structures.features.MountainStructure; import ru.betterend.world.structures.features.PaintedMountainStructure; import ru.betterend.world.structures.piece.CavePiece; diff --git a/src/main/java/ru/betterend/rituals/EternalRitual.java b/src/main/java/ru/betterend/rituals/EternalRitual.java index 0298e4ba..113ab7cc 100644 --- a/src/main/java/ru/betterend/rituals/EternalRitual.java +++ b/src/main/java/ru/betterend/rituals/EternalRitual.java @@ -5,6 +5,8 @@ import java.util.Objects; import java.util.Random; import java.util.Set; +import org.jetbrains.annotations.Nullable; + import com.google.common.collect.Sets; import net.minecraft.block.Block; @@ -30,7 +32,6 @@ import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.feature.ConfiguredFeatures; -import org.jetbrains.annotations.Nullable; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.EndPortalBlock; import ru.betterend.blocks.RunedFlavolite; From 92f1d29211b6a98fb522ab823c9319fdab12e01b Mon Sep 17 00:00:00 2001 From: Aleksey Date: Mon, 29 Mar 2021 14:59:45 +0300 Subject: [PATCH 401/463] Change portal search radius --- src/main/java/ru/betterend/blocks/EndPortalBlock.java | 2 +- src/main/java/ru/betterend/rituals/EternalRitual.java | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index 1dc53aee..659725a6 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -133,7 +133,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable BlockPos.Mutable basePos = currentPos.mutableCopy().set(currentPos.getX() * multiplier, currentPos.getY(), currentPos.getZ() * multiplier); Direction direction = Direction.EAST; BlockPos.Mutable checkPos = basePos.mutableCopy(); - for (int step = 1; step < 64; step++) { + for (int step = 1; step <= 128; step++) { for (int i = 0; i < (step >> 1); i++) { Chunk chunk = targetWorld.getChunk(checkPos); if (chunk != null) { diff --git a/src/main/java/ru/betterend/rituals/EternalRitual.java b/src/main/java/ru/betterend/rituals/EternalRitual.java index 113ab7cc..d0536bb0 100644 --- a/src/main/java/ru/betterend/rituals/EternalRitual.java +++ b/src/main/java/ru/betterend/rituals/EternalRitual.java @@ -184,7 +184,7 @@ public class EternalRitual { serverWorld.playSound(null, center, SoundEvents.BLOCK_END_PORTAL_SPAWN, SoundCategory.NEUTRAL, 16, 1); } - private void activatePortal(World world, BlockPos center, int dim) { + private void activatePortal(World world, BlockPos center, int portalId) { BlockPos framePos = center.down(); Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH : Direction.EAST; BlockState frame = FRAME.getDefaultState().with(ACTIVE, true); @@ -201,7 +201,7 @@ public class EternalRitual { } }); Direction.Axis portalAxis = Direction.Axis.X == axis ? Direction.Axis.Z : Direction.Axis.X; - BlockState portal = PORTAL.getDefaultState().with(EndPortalBlock.AXIS, portalAxis).with(EndPortalBlock.PORTAL, dim); + BlockState portal = PORTAL.getDefaultState().with(EndPortalBlock.AXIS, portalAxis).with(EndPortalBlock.PORTAL, portalId); ParticleEffect effect = new BlockStateParticleEffect(ParticleTypes.BLOCK, portal); ServerWorld serverWorld = (ServerWorld) world; @@ -270,7 +270,7 @@ public class EternalRitual { } else { Direction direction = Direction.EAST; BlockPos.Mutable checkPos = basePos.mutableCopy(); - for (int step = 1; step < 64; step++) { + for (int step = 1; step <= 96; step++) { for (int i = 0; i < (step >> 1); i++) { Chunk chunk = targetWorld.getChunk(checkPos); if (chunk != null) { @@ -322,7 +322,7 @@ public class EternalRitual { for (int i = 0; i < 7; i++) { BlockPos checkPos = pos.add(0, 0, i); BlockState state = world.getBlockState(checkPos); - solid &= this.validBlock(world, checkPos, state); + solid &= validBlock(world, checkPos, state); } } else { @@ -330,7 +330,7 @@ public class EternalRitual { for (int i = 0; i < 7; i++) { BlockPos checkPos = pos.add(i, 0, 0); BlockState state = world.getBlockState(checkPos); - solid &= this.validBlock(world, checkPos, state); + solid &= validBlock(world, checkPos, state); } } return solid; From afc1cd888a7d4c58a6910daf7117ef67bfa4b8a4 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 30 Mar 2021 16:31:45 +0300 Subject: [PATCH 402/463] Small fixes --- .../ru/betterend/util/sdf/operator/SDFHeightmap.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFHeightmap.java b/src/main/java/ru/betterend/util/sdf/operator/SDFHeightmap.java index 82ba749a..c0129ba5 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFHeightmap.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFHeightmap.java @@ -8,16 +8,19 @@ public class SDFHeightmap extends SDFDisplacement { private NativeImage map; private float offsetX; private float offsetZ; - private float angle; private float scale; + private float cos = 1; + private float sin = 0; public SDFHeightmap() { setFunction((pos) -> { if (map == null) { return 0F; } - float dx = MathHelper.clamp(pos.getX() * scale + offsetX, 0, map.getWidth() - 2); - float dz = MathHelper.clamp(pos.getZ() * scale + offsetZ, 0, map.getHeight() - 2); + float px = MathHelper.clamp(pos.getX() * scale + offsetX, 0, map.getWidth() - 2); + float pz = MathHelper.clamp(pos.getZ() * scale + offsetZ, 0, map.getHeight() - 2); + float dx = (px * cos - pz * sin); + float dz = (pz * cos + px * sin); int x1 = MathHelper.floor(dx); int z1 = MathHelper.floor(dz); int x2 = x1 + 1; @@ -43,7 +46,8 @@ public class SDFHeightmap extends SDFDisplacement { } public SDFHeightmap setAngle(float angle) { - this.angle = angle; + sin = MathHelper.sin(angle); + cos = MathHelper.cos(angle); return this; } From 86a57a1bd880424eeeddd5dd6b41acdcaa9fe1a7 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sat, 3 Apr 2021 20:30:29 +0300 Subject: [PATCH 403/463] Portals fixes --- .../ru/betterend/blocks/EndPortalBlock.java | 103 ++++---- .../ru/betterend/rituals/EternalRitual.java | 240 +++++++++++++----- 2 files changed, 222 insertions(+), 121 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index 659725a6..8c39d171 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -27,10 +27,8 @@ import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction.Axis; import net.minecraft.util.math.Direction.AxisDirection; import net.minecraft.util.registry.Registry; -import net.minecraft.world.Heightmap; import net.minecraft.world.World; import net.minecraft.world.WorldAccess; -import net.minecraft.world.chunk.Chunk; import net.minecraft.world.dimension.DimensionType; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IColorProvider; @@ -38,14 +36,15 @@ import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.interfaces.TeleportingEntity; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndPortals; +import ru.betterend.rituals.EternalRitual; public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable, IColorProvider { public static final IntProperty PORTAL = BlockProperties.PORTAL; - + public EndPortalBlock() { super(FabricBlockSettings.copyOf(Blocks.NETHER_PORTAL).resistance(Blocks.BEDROCK.getBlastResistance()).luminance(15)); } - + @Override protected void appendProperties(StateManager.Builder builder) { super.appendProperties(builder); @@ -82,30 +81,33 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable @Override public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) { - if (world instanceof ServerWorld && !entity.hasVehicle() && !entity.hasPassengers() && entity.canUsePortals()) { - if (entity.hasNetherPortalCooldown()) return; - entity.resetNetherPortalCooldown(); - ServerWorld currentWorld = (ServerWorld) world; - MinecraftServer server = currentWorld.getServer(); - ServerWorld targetWorld = EndPortals.getWorld(server, state.get(PORTAL)); - boolean isInEnd = currentWorld.getRegistryKey().equals(World.END); - ServerWorld destination = isInEnd ? targetWorld : server.getWorld(World.END); - BlockPos exitPos = findExitPos(currentWorld, destination, pos, entity); - if (exitPos == null) return; - if (entity instanceof ServerPlayerEntity) { - ServerPlayerEntity player = (ServerPlayerEntity) entity; - this.teleportPlayer(player, destination, exitPos); - } else { - TeleportingEntity teleEntity = (TeleportingEntity) entity; - teleEntity.beSetExitPos(exitPos); - Entity teleported = entity.moveToWorld(destination); - if (teleported != null) { - teleported.resetNetherPortalCooldown(); - } + if (world.isClient || !validate(entity)) return; + entity.resetNetherPortalCooldown(); + ServerWorld currentWorld = (ServerWorld) world; + MinecraftServer server = currentWorld.getServer(); + ServerWorld targetWorld = EndPortals.getWorld(server, state.get(PORTAL)); + boolean isInEnd = currentWorld.getRegistryKey().equals(World.END); + ServerWorld destination = isInEnd ? targetWorld : server.getWorld(World.END); + BlockPos exitPos = findExitPos(currentWorld, destination, pos, entity); + if (exitPos == null) return; + if (entity instanceof ServerPlayerEntity) { + ServerPlayerEntity player = (ServerPlayerEntity) entity; + teleportPlayer(player, destination, exitPos); + } else { + TeleportingEntity teleEntity = (TeleportingEntity) entity; + teleEntity.beSetExitPos(exitPos); + Entity teleported = entity.moveToWorld(destination); + if (teleported != null) { + teleported.resetNetherPortalCooldown(); } } } + private boolean validate(Entity entity) { + return !entity.hasVehicle() && !entity.hasPassengers() && + entity.canUsePortals() && !entity.hasNetherPortalCooldown(); + } + private void teleportPlayer(ServerPlayerEntity player, ServerWorld destination, BlockPos exitPos) { if (player.isCreative()) { player.teleport(destination, exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5, player.yaw, player.pitch); @@ -114,7 +116,6 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable teleEntity.beSetExitPos(exitPos); player.moveToWorld(destination); } - player.resetNetherPortalCooldown(); } @Override @@ -131,47 +132,31 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable double currentMultiplier = Objects.requireNonNull(registry.get(currentWorldId)).getCoordinateScale(); double multiplier = targetMultiplier > currentMultiplier ? 1.0 / targetMultiplier : currentMultiplier; BlockPos.Mutable basePos = currentPos.mutableCopy().set(currentPos.getX() * multiplier, currentPos.getY(), currentPos.getZ() * multiplier); - Direction direction = Direction.EAST; BlockPos.Mutable checkPos = basePos.mutableCopy(); - for (int step = 1; step <= 128; step++) { - for (int i = 0; i < (step >> 1); i++) { - Chunk chunk = targetWorld.getChunk(checkPos); - if (chunk != null) { - int surfaceY = chunk.sampleHeightmap(Heightmap.Type.WORLD_SURFACE, checkPos.getX() & 15, checkPos.getZ() & 15); - int motionY = chunk.sampleHeightmap(Heightmap.Type.MOTION_BLOCKING, checkPos.getX() & 15, checkPos.getZ() & 15); - int ceil = Math.max(surfaceY, motionY) + 1; - if (ceil < 5) continue; - checkPos.setY(ceil); - while (checkPos.getY() >= 5) { - BlockState state = targetWorld.getBlockState(checkPos); - if (state.isOf(this)) { - Axis axis = state.get(AXIS); - checkPos = findCenter(targetWorld, checkPos, axis); - - Direction frontDir = Direction.from(axis, AxisDirection.POSITIVE).rotateYClockwise(); - Direction entityDir = entity.getMovementDirection(); - if (entityDir.getAxis().isVertical()) { - entityDir = frontDir; - } - - if (frontDir != entityDir && frontDir.getOpposite() != entityDir) { - entity.applyRotation(BlockRotation.CLOCKWISE_90); - entityDir = entityDir.rotateYClockwise(); - } - return checkPos.offset(entityDir); - } - checkPos.move(Direction.DOWN); - } - } - checkPos.move(direction); + BlockState currentState = currentWorld.getBlockState(currentPos); + int radius = (EternalRitual.SEARCH_RADIUS >> 4) + 1; + checkPos = EternalRitual.findBlockPos(targetWorld, checkPos, radius, this, state -> state.isOf(this) && + state.get(PORTAL).equals(currentState.get(PORTAL))); + if (checkPos != null) { + BlockState checkState = targetWorld.getBlockState(checkPos); + Axis axis = checkState.get(AXIS); + checkPos = findCenter(targetWorld, checkPos, axis); + Direction frontDir = Direction.from(axis, AxisDirection.POSITIVE).rotateYClockwise(); + Direction entityDir = entity.getMovementDirection(); + if (entityDir.getAxis().isVertical()) { + entityDir = frontDir; } - direction = direction.rotateYClockwise(); + if (frontDir != entityDir && frontDir.getOpposite() != entityDir) { + entity.applyRotation(BlockRotation.CLOCKWISE_90); + entityDir = entityDir.rotateYClockwise(); + } + return checkPos.offset(entityDir); } return null; } private BlockPos.Mutable findCenter(World world, BlockPos.Mutable pos, Direction.Axis axis) { - return this.findCenter(world, pos, axis, 1); + return findCenter(world, pos, axis, 1); } private BlockPos.Mutable findCenter(World world, BlockPos.Mutable pos, Direction.Axis axis, int step) { diff --git a/src/main/java/ru/betterend/rituals/EternalRitual.java b/src/main/java/ru/betterend/rituals/EternalRitual.java index d0536bb0..76afba18 100644 --- a/src/main/java/ru/betterend/rituals/EternalRitual.java +++ b/src/main/java/ru/betterend/rituals/EternalRitual.java @@ -1,10 +1,16 @@ package ru.betterend.rituals; import java.awt.Point; +import java.util.List; import java.util.Objects; import java.util.Random; import java.util.Set; +import java.util.function.Predicate; +import com.google.common.collect.Lists; +import net.minecraft.util.BlockRotation; +import net.minecraft.world.chunk.ChunkSection; +import net.minecraft.world.chunk.WorldChunk; import org.jetbrains.annotations.Nullable; import com.google.common.collect.Sets; @@ -64,6 +70,8 @@ public class EternalRitual { private final static Block PORTAL = EndBlocks.END_PORTAL_BLOCK; private final static BooleanProperty ACTIVE = BlockProperties.ACTIVE; + public final static int SEARCH_RADIUS = calculateSearchSteps(48); + private World world; private Direction.Axis axis; private Identifier targetWorldId; @@ -152,11 +160,14 @@ public class EternalRitual { int portalId = EndPortals.getPortalIdByItem(itemId); activatePortal(world, center, portalId); doEffects((ServerWorld) world, center); + World targetWorld = getTargetWorld(portalId); + Identifier worldId = targetWorld.getRegistryKey().getValue(); if (exit == null) { - exit = findPortalPos(portalId); + initPortal(worldId, portalId); } else { - World targetWorld = getTargetWorld(portalId); - if (!checkFrame(targetWorld, exit)) { + if (!worldId.equals(targetWorldId)) { + initPortal(worldId, portalId); + } else if (!checkFrame(targetWorld, exit.down())) { Direction.Axis portalAxis = (Direction.Axis.X == axis) ? Direction.Axis.Z : Direction.Axis.X; generatePortal(targetWorld, exit, portalAxis, portalId); } @@ -165,6 +176,11 @@ public class EternalRitual { this.active = true; } + private void initPortal(Identifier worldId, int portalId) { + targetWorldId = worldId; + exit = findPortalPos(portalId); + } + private void doEffects(ServerWorld serverWorld, BlockPos center) { Direction moveX, moveY; if (Direction.Axis.X == axis) { @@ -255,22 +271,38 @@ public class EternalRitual { this.active = false; } + @Nullable + private BlockPos findFrame(World world, BlockPos.Mutable startPos) { + List foundPos = findAllBlockPos(world, startPos, (SEARCH_RADIUS >> 4) + 1, FRAME, + blockState -> blockState.isOf(FRAME) && !blockState.get(ACTIVE)); + for(BlockPos.Mutable testPos : foundPos) { + if (checkFrame(world, testPos)) { + return testPos; + } + } + return null; + } + private BlockPos findPortalPos(int portalId) { - targetWorldId = EndPortals.getWorldId(portalId); MinecraftServer server = world.getServer(); ServerWorld targetWorld = (ServerWorld) getTargetWorld(portalId); Registry registry = Objects.requireNonNull(server).getRegistryManager().getDimensionTypes(); double multiplier = Objects.requireNonNull(registry.get(targetWorldId)).getCoordinateScale(); BlockPos.Mutable basePos = center.mutableCopy().set(center.getX() / multiplier, center.getY(), center.getZ() / multiplier); + BlockPos framePos = findFrame(targetWorld, basePos.mutableCopy()); + if (framePos != null) { + return framePos.up(); + } Direction.Axis portalAxis = (Direction.Axis.X == axis) ? Direction.Axis.Z : Direction.Axis.X; int worldCeil = targetWorld.getDimensionHeight() - 1; if (checkIsAreaValid(targetWorld, basePos, portalAxis)) { - EternalRitual.generatePortal(targetWorld, basePos, portalAxis, portalId); + generatePortal(targetWorld, basePos, portalAxis, portalId); return basePos.toImmutable(); } else { Direction direction = Direction.EAST; BlockPos.Mutable checkPos = basePos.mutableCopy(); - for (int step = 1; step <= 96; step++) { + int radius = (int) ((SEARCH_RADIUS / multiplier) + 1); + for (int step = 1; step < radius; step++) { for (int i = 0; i < (step >> 1); i++) { Chunk chunk = targetWorld.getChunk(checkPos); if (chunk != null) { @@ -340,62 +372,6 @@ public class EternalRitual { return state.isSolidBlock(world, pos) && state.isFullCube(world, pos); } - public static void generatePortal(World world, BlockPos center, Direction.Axis axis, int portalId) { - BlockPos framePos = center.down(); - Direction moveDir = Direction.Axis.X == axis ? Direction.EAST : Direction.NORTH; - BlockState frame = FRAME.getDefaultState().with(ACTIVE, true); - FRAME_MAP.forEach(point -> { - BlockPos pos = framePos.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); - world.setBlockState(pos, frame); - pos = framePos.mutableCopy().move(moveDir, -point.x).move(Direction.UP, point.y); - world.setBlockState(pos, frame); - }); - BlockState portal = PORTAL.getDefaultState().with(EndPortalBlock.AXIS, axis).with(EndPortalBlock.PORTAL, portalId); - PORTAL_MAP.forEach(point -> { - BlockPos pos = center.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); - world.setBlockState(pos, portal); - pos = center.mutableCopy().move(moveDir, -point.x).move(Direction.UP, point.y); - world.setBlockState(pos, portal); - }); - generateBase(world, framePos, moveDir); - } - - private static void generateBase(World world, BlockPos center, Direction moveX) { - BlockState base = BASE.getDefaultState(); - Direction moveY = moveX.rotateYClockwise(); - BASE_MAP.forEach(point -> { - BlockPos pos = center.mutableCopy().move(moveX, point.x).move(moveY, point.y); - world.setBlockState(pos, base); - pos = center.mutableCopy().move(moveX, -point.x).move(moveY, point.y); - world.setBlockState(pos, base); - pos = center.mutableCopy().move(moveX, point.x).move(moveY, -point.y); - world.setBlockState(pos, base); - pos = center.mutableCopy().move(moveX, -point.x).move(moveY, -point.y); - world.setBlockState(pos, base); - }); - } - - public static boolean checkArea(World world, BlockPos center, Direction.Axis axis) { - Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH : Direction.EAST; - for (BlockPos checkPos : BlockPos.iterate(center.offset(moveDir.rotateYClockwise()), center.offset(moveDir.rotateYCounterclockwise()))) { - for (Point point : PORTAL_MAP) { - BlockPos pos = checkPos.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); - BlockState state = world.getBlockState(pos); - if (isStateInvalid(state)) return false; - pos = checkPos.mutableCopy().move(moveDir, -point.x).move(Direction.UP, point.y); - state = world.getBlockState(pos); - if (isStateInvalid(state)) return false; - } - } - return true; - } - - private static boolean isStateInvalid(BlockState state) { - if (!state.getFluidState().isEmpty()) return true; - Material material = state.getMaterial(); - return !material.isReplaceable() && !material.equals(Material.PLANT); - } - public void configure(BlockPos initial) { BlockPos checkPos = initial.east(12); if (this.hasPedestal(checkPos)) { @@ -523,4 +499,144 @@ public class EternalRitual { Objects.equals(center, ritual.center) && Objects.equals(exit, ritual.exit); } + + public static void generatePortal(World world, BlockPos center, Direction.Axis axis, int portalId) { + BlockPos framePos = center.down(); + Direction moveDir = Direction.Axis.X == axis ? Direction.EAST : Direction.NORTH; + BlockState frame = FRAME.getDefaultState().with(ACTIVE, true); + FRAME_MAP.forEach(point -> { + BlockPos pos = framePos.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); + world.setBlockState(pos, frame); + pos = framePos.mutableCopy().move(moveDir, -point.x).move(Direction.UP, point.y); + world.setBlockState(pos, frame); + }); + BlockState portal = PORTAL.getDefaultState().with(EndPortalBlock.AXIS, axis).with(EndPortalBlock.PORTAL, portalId); + PORTAL_MAP.forEach(point -> { + BlockPos pos = center.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); + world.setBlockState(pos, portal); + pos = center.mutableCopy().move(moveDir, -point.x).move(Direction.UP, point.y); + world.setBlockState(pos, portal); + }); + generateBase(world, framePos, moveDir); + } + + private static void generateBase(World world, BlockPos center, Direction moveX) { + BlockState base = BASE.getDefaultState(); + Direction moveY = moveX.rotateYClockwise(); + BASE_MAP.forEach(point -> { + BlockPos pos = center.mutableCopy().move(moveX, point.x).move(moveY, point.y); + world.setBlockState(pos, base); + pos = center.mutableCopy().move(moveX, -point.x).move(moveY, point.y); + world.setBlockState(pos, base); + pos = center.mutableCopy().move(moveX, point.x).move(moveY, -point.y); + world.setBlockState(pos, base); + pos = center.mutableCopy().move(moveX, -point.x).move(moveY, -point.y); + world.setBlockState(pos, base); + }); + } + + public static boolean checkArea(World world, BlockPos center, Direction.Axis axis) { + Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH : Direction.EAST; + for (BlockPos checkPos : BlockPos.iterate(center.offset(moveDir.rotateYClockwise()), center.offset(moveDir.rotateYCounterclockwise()))) { + for (Point point : PORTAL_MAP) { + BlockPos pos = checkPos.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); + BlockState state = world.getBlockState(pos); + if (isStateInvalid(state)) return false; + pos = checkPos.mutableCopy().move(moveDir, -point.x).move(Direction.UP, point.y); + state = world.getBlockState(pos); + if (isStateInvalid(state)) return false; + } + } + return true; + } + + private static boolean isStateInvalid(BlockState state) { + if (!state.getFluidState().isEmpty()) return true; + Material material = state.getMaterial(); + return !material.isReplaceable() && !material.equals(Material.PLANT); + } + + /** + * @param world World for search + * @param checkPos Start search position + * @param radius Search radius + * @param searchBlock Target block + * @param condition Predicate for test block states in the chunk section + * + * @return Position of the first found block or null. + */ + @Nullable + public static BlockPos.Mutable findBlockPos(World world, BlockPos.Mutable checkPos, int radius, Block searchBlock, Predicate condition) { + Direction moveDirection = Direction.EAST; + for (int step = 1; step < radius; step++) { + for (int i = 0; i < (step >> 1); i++) { + Chunk chunk = world.getChunk(checkPos); + if (!(chunk instanceof WorldChunk) || ((WorldChunk) chunk).isEmpty()) continue; + for (ChunkSection section : chunk.getSectionArray()) { + if (section == null || !section.getContainer().hasAny(condition)) continue; + for (int x = 0; x < 16; x++) { + for (int y = 0; y < 16; y++) { + for(int z = 0; z < 16; z++) { + BlockState checkState = section.getBlockState(x, y, z); + if (checkState.isOf(searchBlock)) { + int worldX = (chunk.getPos().x << 4) + x; + int worldY = section.getYOffset() + y; + int worldZ = (chunk.getPos().z << 4) + z; + checkPos.set(worldX, worldY, worldZ); + return checkPos; + } + } + } + } + } + checkPos.move(moveDirection, 16); + } + moveDirection = moveDirection.rotateYClockwise(); + } + return null; + } + + /** + * @param world World for search + * @param checkPos Start search position + * @param radius Search radius + * @param searchBlock Target block + * @param condition Predicate for test block states in the chunk section + * + * @return List of positions of the all found blocks or empty list. + */ + public static List findAllBlockPos(World world, BlockPos.Mutable checkPos, int radius, Block searchBlock, Predicate condition) { + List posFound = Lists.newArrayList(); + Direction moveDirection = Direction.EAST; + for (int step = 1; step < radius; step++) { + for (int i = 0; i < (step >> 1); i++) { + Chunk chunk = world.getChunk(checkPos); + if (!(chunk instanceof WorldChunk) || ((WorldChunk) chunk).isEmpty()) continue; + for (ChunkSection section : chunk.getSectionArray()) { + if (section == null || !section.getContainer().hasAny(condition)) continue; + for (int x = 0; x < 16; x++) { + for (int y = 0; y < 16; y++) { + for(int z = 0; z < 16; z++) { + BlockState checkState = section.getBlockState(x, y, z); + if (checkState.isOf(searchBlock)) { + int worldX = (chunk.getPos().x << 4) + x; + int worldY = section.getYOffset() + y; + int worldZ = (chunk.getPos().z << 4) + z; + checkPos.set(worldX, worldY, worldZ); + posFound.add(checkPos.mutableCopy()); + } + } + } + } + } + checkPos.move(moveDirection, 16); + } + moveDirection = moveDirection.rotateYClockwise(); + } + return posFound; + } + + public static int calculateSearchSteps(int radius) { + return radius * 4 - 1; + } } From f76ca1144d4077f0ce929531999f1d03985d3e34 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 4 Apr 2021 12:01:37 +0300 Subject: [PATCH 404/463] Terrain generator fix --- .../ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java | 5 +++-- .../java/ru/betterend/world/generator/GeneratorOptions.java | 2 +- .../java/ru/betterend/world/generator/TerrainGenerator.java | 6 +++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java b/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java index 50b859ab..375d706d 100644 --- a/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java +++ b/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java @@ -35,10 +35,11 @@ public abstract class NoiseChunkGeneratorMixin extends ChunkGenerator { @Inject(method = "sampleNoiseColumn([DII)V", at = @At("HEAD"), cancellable = true, allow = 2) private void beSampleNoiseColumn(double[] buffer, int x, int z, CallbackInfo info) { if (GeneratorOptions.useNewGenerator() && settings.get().equals(ChunkGeneratorSettings.END)) { - if (TerrainGenerator.canGenerate(x, z)) { + //System.out.println(TerrainGenerator.canGenerate(x, z)); + //if (TerrainGenerator.canGenerate(x, z)) { TerrainGenerator.fillTerrainDensity(buffer, x, z, getBiomeSource()); info.cancel(); - } + //} } } } diff --git a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java index 0986cb05..6c0918ff 100644 --- a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java +++ b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java @@ -38,7 +38,7 @@ public class GeneratorOptions { removeChorusFromVanillaBiomes = Configs.GENERATOR_CONFIG.getBoolean("chorusPlant", "removeChorusFromVanillaBiomes", true); newGenerator = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "useNewGenerator", true); noRingVoid = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "noRingVoid", false); - generateCentralIsland = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "generateCentralIsland", false); + generateCentralIsland = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "generateCentralIsland", true); endCityFailChance = Configs.GENERATOR_CONFIG.getInt("customGenerator", "endCityFailChance", 5); generateObsidianPlatform = Configs.GENERATOR_CONFIG.getBooleanRoot("generateObsidianPlatform", true); bigOptions = new LayerOptions("customGenerator.layers.bigIslands", Configs.GENERATOR_CONFIG, 300, 200, 70, 10, false); diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index 39ff228f..f332b4c6 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -26,9 +26,9 @@ public class TerrainGenerator { private static OpenSimplexNoise noise1; private static OpenSimplexNoise noise2; - public static boolean canGenerate(int x, int z) { - return GeneratorOptions.noRingVoid()/* || (long) x + (long) z > CENTER*/; - } + /*public static boolean canGenerate(int x, int z) { + return GeneratorOptions.noRingVoid() || (long) x + (long) z > CENTER; + }*/ public static void initNoise(long seed) { Random random = new Random(seed); From fd093318c64ad8973d93b96fa27ebc9ba3d4c086 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 4 Apr 2021 12:16:00 +0300 Subject: [PATCH 405/463] More fixes --- .../ru/betterend/world/features/CrashedShipFeature.java | 7 ++++++- .../java/ru/betterend/world/generator/IslandLayer.java | 4 +++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/world/features/CrashedShipFeature.java b/src/main/java/ru/betterend/world/features/CrashedShipFeature.java index 457cef56..12f17db3 100644 --- a/src/main/java/ru/betterend/world/features/CrashedShipFeature.java +++ b/src/main/java/ru/betterend/world/features/CrashedShipFeature.java @@ -43,7 +43,12 @@ public class CrashedShipFeature extends NBTStructureFeature { @Override protected boolean canSpawn(StructureWorldAccess world, BlockPos pos, Random random) { - return pos.getY() > 58 && world.getBlockState(pos.down()).isIn(EndTags.GEN_TERRAIN); + long x = pos.getX() >> 4; + long z = pos.getX() >> 4; + if (x * x + z * z < 3600) { + return false; + } + return pos.getY() > 5 && world.getBlockState(pos.down()).isIn(EndTags.GEN_TERRAIN); } @Override diff --git a/src/main/java/ru/betterend/world/generator/IslandLayer.java b/src/main/java/ru/betterend/world/generator/IslandLayer.java index 26858fe9..82a7513f 100644 --- a/src/main/java/ru/betterend/world/generator/IslandLayer.java +++ b/src/main/java/ru/betterend/world/generator/IslandLayer.java @@ -63,9 +63,11 @@ public class IslandLayer { positions.clear(); for (int pox = -1; pox < 2; pox++) { int px = pox + ix; + long px2 = px; for (int poz = -1; poz < 2; poz++) { int pz = poz + iz; - if (GeneratorOptions.noRingVoid() || (long) px + (long) pz > options.centerDist) { + long pz2 = pz; + if (GeneratorOptions.noRingVoid() || px2 * px2 + pz2 * pz2 > options.centerDist) { RANDOM.setSeed(getSeed(px, pz)); double posX = (px + RANDOM.nextFloat()) * options.distance; double posY = MHelper.randRange(options.minY, options.maxY, RANDOM); From 6630ce0cab0c12b44ddb54f6cc7c67864e67a84c Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sun, 4 Apr 2021 14:56:18 +0300 Subject: [PATCH 406/463] Portal islands --- .../ru/betterend/registry/EndFeatures.java | 4 +- .../ru/betterend/rituals/EternalRitual.java | 33 +++++---- .../java/ru/betterend/util/BlocksHelper.java | 8 ++- .../world/features/BiomeIslandFeature.java | 69 +++++++++++++++++++ .../betterend/world/features/EndFeature.java | 2 +- .../features/OverworldIslandFeature.java | 47 ------------- 6 files changed, 98 insertions(+), 65 deletions(-) create mode 100644 src/main/java/ru/betterend/world/features/BiomeIslandFeature.java delete mode 100644 src/main/java/ru/betterend/world/features/OverworldIslandFeature.java diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index ac5616d2..cc003815 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -29,7 +29,7 @@ import ru.betterend.world.features.HydraluxFeature; import ru.betterend.world.features.LanceleafFeature; import ru.betterend.world.features.MengerSpongeFeature; import ru.betterend.world.features.NeonCactusFeature; -import ru.betterend.world.features.OverworldIslandFeature; +import ru.betterend.world.features.BiomeIslandFeature; import ru.betterend.world.features.SilkMothNestFeature; import ru.betterend.world.features.SingleInvertedScatterFeature; import ru.betterend.world.features.SinglePlantFeature; @@ -179,7 +179,7 @@ public class EndFeatures { public static final EndFeature CHARNIA_GREEN = new EndFeature("charnia_green", new CharniaFeature(EndBlocks.CHARNIA_GREEN), 10); public static final EndFeature MENGER_SPONGE = new EndFeature("menger_sponge", new MengerSpongeFeature(5), 1); public static final EndFeature CHARNIA_RED_RARE = new EndFeature("charnia_red_rare", new CharniaFeature(EndBlocks.CHARNIA_RED), 2); - public static final EndFeature OVERWORLD_ISLAND = EndFeature.makeFetureConfigured("overworld_island", new OverworldIslandFeature()); + public static final EndFeature BIOME_ISLAND = EndFeature.makeFeatureConfigured("overworld_island", new BiomeIslandFeature()); public static final EndFeature FLAMAEA = new EndFeature("flamaea", new SinglePlantFeature(EndBlocks.FLAMAEA, 12, false, 5), 20); // Terrain // diff --git a/src/main/java/ru/betterend/rituals/EternalRitual.java b/src/main/java/ru/betterend/rituals/EternalRitual.java index 76afba18..ab031512 100644 --- a/src/main/java/ru/betterend/rituals/EternalRitual.java +++ b/src/main/java/ru/betterend/rituals/EternalRitual.java @@ -8,7 +8,6 @@ import java.util.Set; import java.util.function.Predicate; import com.google.common.collect.Lists; -import net.minecraft.util.BlockRotation; import net.minecraft.world.chunk.ChunkSection; import net.minecraft.world.chunk.WorldChunk; import org.jetbrains.annotations.Nullable; @@ -38,6 +37,7 @@ import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.feature.ConfiguredFeatures; +import ru.betterend.BetterEnd; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.EndPortalBlock; import ru.betterend.blocks.RunedFlavolite; @@ -158,22 +158,29 @@ public class EternalRitual { if (active) return; Identifier itemId = Registry.ITEM.getId(keyItem); int portalId = EndPortals.getPortalIdByItem(itemId); - activatePortal(world, center, portalId); - doEffects((ServerWorld) world, center); World targetWorld = getTargetWorld(portalId); Identifier worldId = targetWorld.getRegistryKey().getValue(); - if (exit == null) { - initPortal(worldId, portalId); - } else { - if (!worldId.equals(targetWorldId)) { + try { + if (exit == null) { initPortal(worldId, portalId); - } else if (!checkFrame(targetWorld, exit.down())) { - Direction.Axis portalAxis = (Direction.Axis.X == axis) ? Direction.Axis.Z : Direction.Axis.X; - generatePortal(targetWorld, exit, portalAxis, portalId); + } else { + if (!worldId.equals(targetWorldId)) { + initPortal(worldId, portalId); + } else if (!checkFrame(targetWorld, exit.down())) { + Direction.Axis portalAxis = (Direction.Axis.X == axis) ? Direction.Axis.Z : Direction.Axis.X; + generatePortal(targetWorld, exit, portalAxis, portalId); + } + activatePortal(targetWorld, exit, portalId); } - activatePortal(targetWorld, exit, portalId); + activatePortal(world, center, portalId); + doEffects((ServerWorld) world, center); + active = true; + } catch (Exception ex) { + BetterEnd.LOGGER.error("Create End portals error.", ex); + removePortal(targetWorld, exit); + removePortal(world, center); + active = false; } - this.active = true; } private void initPortal(Identifier worldId, int portalId) { @@ -328,8 +335,8 @@ public class EternalRitual { ConfiguredFeatures.END_ISLAND.generate(targetWorld, targetWorld.getChunkManager().getChunkGenerator(), new Random(basePos.asLong()), basePos.down()); } else if (targetWorld.getRegistryKey() == World.OVERWORLD) { basePos.setY(targetWorld.getChunk(basePos).sampleHeightmap(Heightmap.Type.WORLD_SURFACE, basePos.getX(), basePos.getZ()) + 1); - EndFeatures.OVERWORLD_ISLAND.getFeatureConfigured().generate(targetWorld, targetWorld.getChunkManager().getChunkGenerator(), new Random(basePos.asLong()), basePos.down()); } + EndFeatures.BIOME_ISLAND.getFeatureConfigured().generate(targetWorld, targetWorld.getChunkManager().getChunkGenerator(), new Random(basePos.asLong()), basePos.down()); generatePortal(targetWorld, basePos, portalAxis, portalId); return basePos.toImmutable(); } diff --git a/src/main/java/ru/betterend/util/BlocksHelper.java b/src/main/java/ru/betterend/util/BlocksHelper.java index 87371a24..fe2601ab 100644 --- a/src/main/java/ru/betterend/util/BlocksHelper.java +++ b/src/main/java/ru/betterend/util/BlocksHelper.java @@ -121,11 +121,11 @@ public class BlocksHelper { } public static BlockState rotateHorizontal(BlockState state, BlockRotation rotation, Property facing) { - return (BlockState) state.with(facing, rotation.rotate((Direction) state.get(facing))); + return state.with(facing, rotation.rotate(state.get(facing))); } public static BlockState mirrorHorizontal(BlockState state, BlockMirror mirror, Property facing) { - return state.rotate(mirror.getRotation((Direction) state.get(facing))); + return state.rotate(mirror.getRotation(state.get(facing))); } public static int getLengthDown(WorldAccess world, BlockPos pos, Block block) { @@ -364,4 +364,8 @@ public class BlocksHelper { public static Direction randomDirection(Random random) { return DIRECTIONS[random.nextInt(6)]; } + + public static boolean isFluid(BlockState blockState) { + return !blockState.getFluidState().isEmpty(); + } } diff --git a/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java b/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java new file mode 100644 index 00000000..e203909d --- /dev/null +++ b/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java @@ -0,0 +1,69 @@ +package ru.betterend.world.features; + +import java.util.Random; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.gen.surfacebuilder.SurfaceConfig; +import net.minecraft.world.gen.surfacebuilder.TernarySurfaceConfig; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFDisplacement; +import ru.betterend.util.sdf.operator.SDFTranslate; +import ru.betterend.util.sdf.primitive.SDFCappedCone; + +public class BiomeIslandFeature extends DefaultFeature { + private static final Mutable CENTER = new Mutable(); + private static final SDF ISLAND; + + private static OpenSimplexNoise simplexNoise = new OpenSimplexNoise(412L); + private static BlockState topBlock = Blocks.GRASS_BLOCK.getDefaultState(); + private static BlockState underBlock = Blocks.DIRT.getDefaultState(); + + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + Biome biome = world.getBiome(pos); + SurfaceConfig surfaceConfig = biome.getGenerationSettings().getSurfaceConfig(); + BlockState topMaterial = surfaceConfig.getTopMaterial(); + if (BlocksHelper.isFluid(topMaterial)) { + topBlock = ((TernarySurfaceConfig) surfaceConfig).getUnderwaterMaterial(); + } else { + topBlock = topMaterial; + } + underBlock = surfaceConfig.getUnderMaterial(); + simplexNoise = new OpenSimplexNoise(world.getSeed()); + CENTER.set(pos); + ISLAND.fillRecursive(world, pos.down()); + return true; + } + + private static SDF createSDFIsland() { + SDF sdfCone = new SDFCappedCone().setRadius1(0).setRadius2(6).setHeight(4).setBlock(pos -> { + if (pos.getY() > CENTER.getY()) return AIR; + if (pos.getY() == CENTER.getY()) return topBlock; + return underBlock; + }); + sdfCone = new SDFTranslate().setTranslate(0, -2, 0).setSource(sdfCone); + sdfCone = new SDFDisplacement().setFunction(pos -> { + float deltaX = Math.abs(pos.getX()); + float deltaY = Math.abs(pos.getY()); + float deltaZ = Math.abs(pos.getZ()); + if (deltaY < 2.0f && (deltaX < 3.0f || deltaZ < 3.0F)) return 0.0f; + return (float) simplexNoise.eval(CENTER.getX() + pos.getX(), + CENTER.getY() + pos.getY(), CENTER.getZ() + pos.getZ()); + }).setSource(sdfCone).setReplaceFunction(state -> BlocksHelper.isFluid(state) || + state.getMaterial().isReplaceable()); + return sdfCone; + } + + static { + ISLAND = createSDFIsland(); + } +} diff --git a/src/main/java/ru/betterend/world/features/EndFeature.java b/src/main/java/ru/betterend/world/features/EndFeature.java index 09a9484b..b1891370 100644 --- a/src/main/java/ru/betterend/world/features/EndFeature.java +++ b/src/main/java/ru/betterend/world/features/EndFeature.java @@ -114,7 +114,7 @@ public class EndFeature { return new EndFeature(name, feature, GenerationStep.Feature.RAW_GENERATION, configured); } - public static EndFeature makeFetureConfigured(String name, Feature feature) { + public static EndFeature makeFeatureConfigured(String name, Feature feature) { ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT); return new EndFeature(name, feature, GenerationStep.Feature.RAW_GENERATION, configured); } diff --git a/src/main/java/ru/betterend/world/features/OverworldIslandFeature.java b/src/main/java/ru/betterend/world/features/OverworldIslandFeature.java deleted file mode 100644 index a9a2ac41..00000000 --- a/src/main/java/ru/betterend/world/features/OverworldIslandFeature.java +++ /dev/null @@ -1,47 +0,0 @@ -package ru.betterend.world.features; - -import java.util.Random; - -import net.minecraft.block.Blocks; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import ru.betterend.noise.OpenSimplexNoise; -import ru.betterend.util.sdf.SDF; -import ru.betterend.util.sdf.operator.SDFDisplacement; -import ru.betterend.util.sdf.operator.SDFTranslate; -import ru.betterend.util.sdf.primitive.SDFCappedCone; - -public class OverworldIslandFeature extends DefaultFeature { - private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(412); - private static final Mutable CENTER = new Mutable(); - private static final SDF ISLAND; - - @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - CENTER.set(pos); - ISLAND.fillRecursive(world, pos.down()); - return true; - } - - static { - SDF cone = new SDFCappedCone().setRadius1(0).setRadius2(6).setHeight(4).setBlock((pos) -> { - if (pos.getY() == CENTER.getY()) return Blocks.GRASS_BLOCK.getDefaultState(); - if (pos.getY() == CENTER.getY() - 1) { - return Blocks.DIRT.getDefaultState(); - } else if (pos.getY() == CENTER.getY() - Math.round(2.0 * Math.random())) { - return Blocks.DIRT.getDefaultState(); - } - return Blocks.STONE.getDefaultState(); - }); - cone = new SDFTranslate().setTranslate(0, -3, 0).setSource(cone); - cone = new SDFDisplacement().setFunction((pos) -> { - return (float) NOISE.eval(CENTER.getX() + pos.getX(), CENTER.getY() + pos.getY(), CENTER.getZ() + pos.getZ()); - }).setSource(cone).setReplaceFunction(state -> { - return state.isOf(Blocks.WATER) || state.getMaterial().isReplaceable(); - }); - ISLAND = cone; - } -} From 47ed59735897129518dfeadd66709cd619ac69f3 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Thu, 8 Apr 2021 21:55:07 +0300 Subject: [PATCH 407/463] Start migration --- build.gradle | 4 +- gradle.properties | 2 +- src/main/java/ru/betterend/BetterEnd.java | 32 +- .../ru/betterend/blocks/AeterniumAnvil.java | 24 +- .../ru/betterend/blocks/AeterniumBlock.java | 21 +- .../betterend/blocks/AmaranitaCapBlock.java | 6 +- .../blocks/AmaranitaHymenophoreBlock.java | 6 +- .../betterend/blocks/AmaranitaStemBlock.java | 6 +- .../java/ru/betterend/blocks/AmberBlock.java | 6 +- .../blocks/AncientEmeraldIceBlock.java | 42 +- .../betterend/blocks/AuroraCrystalBlock.java | 85 +- .../ru/betterend/blocks/BlockProperties.java | 99 +-- .../java/ru/betterend/blocks/BlockSounds.java | 11 +- .../ru/betterend/blocks/BlueVineBlock.java | 12 +- .../blocks/BlueVineLanternBlock.java | 43 +- .../betterend/blocks/BlueVineSeedBlock.java | 38 +- .../betterend/blocks/BoluxMushroomBlock.java | 34 +- .../ru/betterend/blocks/BrimstoneBlock.java | 89 +- .../ru/betterend/blocks/BubbleCoralBlock.java | 39 +- .../ru/betterend/blocks/BulbVineBlock.java | 29 +- .../blocks/BulbVineLanternBlock.java | 58 +- .../blocks/BulbVineLanternColoredBlock.java | 12 +- .../betterend/blocks/BulbVineSeedBlock.java | 15 +- .../ru/betterend/blocks/CavePumpkinBlock.java | 43 +- .../blocks/CavePumpkinVineBlock.java | 61 +- .../ru/betterend/blocks/ChandelierBlock.java | 47 +- .../ru/betterend/blocks/CharcoalBlock.java | 2 +- .../ru/betterend/blocks/CharniaBlock.java | 9 +- .../ru/betterend/blocks/ChorusGrassBlock.java | 4 +- .../blocks/DenseEmeraldIceBlock.java | 2 +- .../ru/betterend/blocks/DenseSnowBlock.java | 6 +- .../blocks/DragonTreeSaplingBlock.java | 8 +- .../ru/betterend/blocks/EmeraldIceBlock.java | 64 +- .../ru/betterend/blocks/EndLilyBlock.java | 95 +- .../ru/betterend/blocks/EndLilySeedBlock.java | 13 +- .../betterend/blocks/EndLotusFlowerBlock.java | 36 +- .../betterend/blocks/EndLotusLeafBlock.java | 44 +- .../betterend/blocks/EndLotusSeedBlock.java | 77 +- .../betterend/blocks/EndLotusStemBlock.java | 62 +- .../ru/betterend/blocks/EndPathBlock.java | 52 +- .../java/ru/betterend/blocks/EndPedestal.java | 12 +- .../ru/betterend/blocks/EndPortalBlock.java | 184 ++-- .../ru/betterend/blocks/EndStoneBlock.java | 8 +- .../ru/betterend/blocks/EndStoneSmelter.java | 99 +-- .../ru/betterend/blocks/EndTerrainBlock.java | 95 +- .../java/ru/betterend/blocks/EnderBlock.java | 19 +- .../betterend/blocks/EndstoneDustBlock.java | 25 +- .../ru/betterend/blocks/EternalPedestal.java | 83 +- .../blocks/EternalRunedFlavolite.java | 24 +- .../betterend/blocks/FilaluxLanternBlock.java | 7 +- .../ru/betterend/blocks/FlamaeaBlock.java | 38 +- .../blocks/GlowingHymenophoreBlock.java | 7 +- .../ru/betterend/blocks/GlowingMossBlock.java | 26 +- .../blocks/GlowingPillarLuminophorBlock.java | 50 +- .../blocks/GlowingPillarRootsBlock.java | 22 +- .../blocks/GlowingPillarSeedBlock.java | 52 +- .../blocks/HelixTreeLeavesBlock.java | 75 +- .../ru/betterend/blocks/HydraluxBlock.java | 72 +- .../betterend/blocks/HydraluxPetalBlock.java | 28 +- .../blocks/HydraluxPetalColoredBlock.java | 20 +- .../blocks/HydraluxSaplingBlock.java | 32 +- .../blocks/HydrothermalVentBlock.java | 118 +-- .../ru/betterend/blocks/InfusionPedestal.java | 48 +- .../betterend/blocks/JellyshroomCapBlock.java | 72 +- .../blocks/LacugroveSaplingBlock.java | 9 +- .../ru/betterend/blocks/LanceleafBlock.java | 63 +- .../betterend/blocks/LanceleafSeedBlock.java | 32 +- .../betterend/blocks/LargeAmaranitaBlock.java | 64 +- .../ru/betterend/blocks/LumecornBlock.java | 84 +- .../betterend/blocks/LumecornSeedBlock.java | 12 +- .../betterend/blocks/MengerSpongeBlock.java | 57 +- .../blocks/MengerSpongeWetBlock.java | 56 +- .../ru/betterend/blocks/MissingTileBlock.java | 2 +- .../blocks/MossyDragonBoneBlock.java | 61 +- .../blocks/MossyGlowshroomCapBlock.java | 29 +- .../blocks/MossyGlowshroomSaplingBlock.java | 9 +- .../ru/betterend/blocks/MossyObsidian.java | 61 +- .../ru/betterend/blocks/MurkweedBlock.java | 32 +- .../ru/betterend/blocks/NeedlegrassBlock.java | 46 +- .../ru/betterend/blocks/NeonCactusBlock.java | 103 +-- .../ru/betterend/blocks/PedestalVanilla.java | 12 +- .../blocks/PythadendronSaplingBlock.java | 8 +- .../betterend/blocks/RespawnObeliskBlock.java | 168 ++-- .../ru/betterend/blocks/RunedFlavolite.java | 21 +- .../ru/betterend/blocks/ShadowBerryBlock.java | 14 +- .../ru/betterend/blocks/ShadowGrassBlock.java | 17 +- .../betterend/blocks/SilkMothHiveBlock.java | 76 +- .../betterend/blocks/SilkMothNestBlock.java | 126 +-- .../betterend/blocks/SmallAmaranitaBlock.java | 53 +- .../blocks/SmallJellyshroomBlock.java | 73 +- .../blocks/SmaragdantCrystalBlock.java | 13 +- .../blocks/SmaragdantCrystalShardBlock.java | 77 +- .../betterend/blocks/SulphurCrystalBlock.java | 98 +-- .../betterend/blocks/TenaneaFlowersBlock.java | 52 +- .../betterend/blocks/TenaneaSaplingBlock.java | 8 +- .../ru/betterend/blocks/TerminiteBlock.java | 13 +- .../betterend/blocks/TerrainPlantBlock.java | 12 +- .../blocks/TwistedUmbrellaMossBlock.java | 48 +- .../blocks/TwistedUmbrellaMossTallBlock.java | 21 +- .../betterend/blocks/UmbrellaMossBlock.java | 48 +- .../blocks/UmbrellaMossTallBlock.java | 21 +- .../blocks/UmbrellaTreeClusterBlock.java | 46 +- .../blocks/UmbrellaTreeClusterEmptyBlock.java | 34 +- .../blocks/UmbrellaTreeMembraneBlock.java | 75 +- .../blocks/UmbrellaTreeSaplingBlock.java | 10 +- .../blocks/VentBubbleColumnBlock.java | 84 +- .../betterend/blocks/basis/AttachedBlock.java | 54 +- .../ru/betterend/blocks/basis/BarkBlock.java | 18 +- .../blocks/basis/BaseBlockWithEntity.java | 18 +- .../ru/betterend/blocks/basis/BlockBase.java | 30 +- .../blocks/basis/BlockBaseNotFull.java | 10 +- .../blocks/basis/DoublePlantBlock.java | 128 ++- .../betterend/blocks/basis/EndAnvilBlock.java | 52 +- .../blocks/basis/EndBarrelBlock.java | 57 +- .../blocks/basis/EndBlockStripableLogLog.java | 36 +- .../blocks/basis/EndBookshelfBlock.java | 46 +- .../betterend/blocks/basis/EndChainBlock.java | 34 +- .../betterend/blocks/basis/EndChestBlock.java | 48 +- .../blocks/basis/EndComposterBlock.java | 30 +- .../blocks/basis/EndCraftingTableBlock.java | 28 +- .../betterend/blocks/basis/EndCropBlock.java | 102 ++- .../betterend/blocks/basis/EndDoorBlock.java | 40 +- .../betterend/blocks/basis/EndFenceBlock.java | 34 +- .../blocks/basis/EndFurnaceBlock.java | 53 +- .../betterend/blocks/basis/EndGateBlock.java | 34 +- .../blocks/basis/EndLadderBlock.java | 72 +- .../blocks/basis/EndLanternBlock.java | 89 +- .../blocks/basis/EndLeavesBlock.java | 83 +- .../blocks/basis/EndMetalPaneBlock.java | 37 +- .../blocks/basis/EndMetalPlateBlock.java | 34 +- .../betterend/blocks/basis/EndOreBlock.java | 65 +- .../blocks/basis/EndPillarBlock.java | 36 +- .../betterend/blocks/basis/EndPlantBlock.java | 95 +- .../blocks/basis/EndPlantWithAgeBlock.java | 57 +- .../betterend/blocks/basis/EndPlateBlock.java | 34 +- .../betterend/blocks/basis/EndSignBlock.java | 144 ++- .../betterend/blocks/basis/EndSlabBlock.java | 34 +- .../blocks/basis/EndStairsBlock.java | 41 +- .../blocks/basis/EndStoneButtonBlock.java | 34 +- .../blocks/basis/EndStonelateBlock.java | 2 +- .../blocks/basis/EndTrapdoorBlock.java | 30 +- .../basis/EndUnderwaterWallPlantBlock.java | 45 +- .../betterend/blocks/basis/EndWallBlock.java | 36 +- .../blocks/basis/EndWallPlantBlock.java | 92 +- .../blocks/basis/EndWoodenButtonBlock.java | 34 +- .../blocks/basis/EndWoodenPlateBlock.java | 2 +- .../blocks/basis/FeatureSaplingBlock.java | 80 +- .../ru/betterend/blocks/basis/FurBlock.java | 66 +- .../betterend/blocks/basis/PedestalBlock.java | 234 ++--- .../blocks/basis/SimpleLeavesBlock.java | 57 +- .../blocks/basis/StalactiteBlock.java | 157 ++-- .../blocks/basis/StoneLanternBlock.java | 58 +- .../blocks/basis/StrippableBarkBlock.java | 36 +- .../blocks/basis/TripleTerrainBlock.java | 96 +- .../blocks/basis/UnderwaterPlantBlock.java | 102 +-- .../basis/UnderwaterPlantWithAgeBlock.java | 49 +- .../blocks/basis/UpDownPlantBlock.java | 80 +- .../ru/betterend/blocks/basis/VineBlock.java | 106 ++- .../blocks/basis/WallMushroomBlock.java | 30 +- .../blocks/complex/ColoredMaterial.java | 39 +- .../complex/CrystalSubblocksMaterial.java | 50 +- .../blocks/complex/MetalMaterial.java | 203 +++-- .../blocks/complex/StoneMaterial.java | 78 +- .../blocks/complex/WoodenMaterial.java | 100 ++- .../entities/BlockEntityHydrothermalVent.java | 13 +- .../blocks/entities/EBarrelBlockEntity.java | 28 +- .../blocks/entities/EChestBlockEntity.java | 2 +- .../blocks/entities/EFurnaceBlockEntity.java | 6 +- .../blocks/entities/ESignBlockEntity.java | 4 +- .../entities/EndStoneSmelterBlockEntity.java | 184 ++-- .../entities/EternalPedestalEntity.java | 16 +- .../entities/InfusionPedestalEntity.java | 18 +- .../blocks/entities/PedestalBlockEntity.java | 31 +- .../render/EndChestBlockEntityRenderer.java | 75 +- .../render/EndSignBlockEntityRenderer.java | 31 +- .../entities/render/PedestalItemRenderer.java | 40 +- .../ru/betterend/client/BetterEndClient.java | 4 +- .../client/gui/BlockSignEditScreen.java | 2 +- .../gui/EndStoneSmelterRecipeBookScreen.java | 21 +- .../client/gui/EndStoneSmelterScreen.java | 39 +- .../gui/EndStoneSmelterScreenHandler.java | 48 +- .../client/gui/slot/SmelterFuelSlot.java | 6 +- .../client/gui/slot/SmelterOutputSlot.java | 6 +- .../betterend/client/render/BeamRenderer.java | 57 +- .../client/render/EndCrystalRenderer.java | 62 +- .../client/render/EternalCrystalRenderer.java | 37 +- .../java/ru/betterend/config/ConfigKey.java | 14 +- .../java/ru/betterend/config/IdConfig.java | 49 +- .../ru/betterend/effects/EndEnchantments.java | 11 +- .../java/ru/betterend/effects/EndPotions.java | 17 +- .../betterend/effects/EndStatusEffects.java | 8 +- .../enchantment/EndVeilEnchantment.java | 8 +- .../effects/status/EndVeilEffect.java | 6 +- .../ru/betterend/entity/CubozoaEntity.java | 93 +- .../ru/betterend/entity/DragonflyEntity.java | 67 +- .../ru/betterend/entity/EndFishEntity.java | 82 +- .../ru/betterend/entity/EndSlimeEntity.java | 197 ++--- .../betterend/entity/ShadowWalkerEntity.java | 107 ++- .../ru/betterend/entity/SilkMothEntity.java | 171 ++-- .../entity/model/BlockBenchModel.java | 10 +- .../entity/model/CubozoaEntityModel.java | 24 +- .../entity/model/SilkMothEntityModel.java | 22 +- .../entity/render/RendererEntityCubozoa.java | 19 +- .../render/RendererEntityDragonfly.java | 20 +- .../entity/render/RendererEntityEndFish.java | 51 +- .../entity/render/RendererEntityEndSlime.java | 67 +- .../render/RendererEntityShadowWalker.java | 11 +- .../entity/render/SilkMothEntityRenderer.java | 10 +- .../events/PlayerAdvancementsEvents.java | 21 +- .../FlamboyantRefabricatedIntegration.java | 41 +- .../betterend/integration/ModIntegration.java | 105 ++- .../integration/NourishIntegration.java | 9 +- .../betterend/integration/byg/BYGBlocks.java | 9 +- .../integration/byg/BYGIntegration.java | 16 +- .../integration/byg/biomes/EterialGrove.java | 14 +- .../byg/biomes/NightshadeRedwoods.java | 32 +- .../byg/biomes/OldBulbisGardens.java | 55 +- .../byg/features/BigEtherTreeFeature.java | 47 +- .../features/GreatNightshadeTreeFeature.java | 87 +- .../NightshadeRedwoodTreeFeature.java | 84 +- .../byg/features/OldBulbisTreeFeature.java | 128 ++- .../integration/rei/REIAlloyingCategory.java | 42 +- .../integration/rei/REIAlloyingDisplay.java | 49 +- .../rei/REIAlloyingFuelCategory.java | 22 +- .../rei/REIAlloyingFuelDisplay.java | 4 +- .../integration/rei/REIAnvilCategory.java | 36 +- .../integration/rei/REIAnvilDisplay.java | 20 +- .../integration/rei/REIInfusionCategory.java | 52 +- .../integration/rei/REIInfusionDisplay.java | 25 +- .../betterend/integration/rei/REIPlugin.java | 37 +- .../ru/betterend/interfaces/IBiomeArray.java | 2 +- .../betterend/interfaces/IColorProvider.java | 9 +- .../betterend/interfaces/IRenderTypeable.java | 2 +- .../interfaces/TeleportingEntity.java | 4 +- .../java/ru/betterend/item/DrinkItem.java | 26 +- .../ru/betterend/item/EnchantedPetalItem.java | 6 +- .../java/ru/betterend/item/EndArmorItem.java | 22 +- .../ru/betterend/item/EndSpawnEggItem.java | 8 +- .../ru/betterend/item/EternalCrystalItem.java | 2 +- .../java/ru/betterend/item/GuideBookItem.java | 42 +- .../ru/betterend/item/PatternedDiscItem.java | 4 +- .../java/ru/betterend/item/PatternedItem.java | 6 +- .../item/material/EndArmorMaterial.java | 32 +- .../item/material/EndToolMaterial.java | 46 +- .../item/model/CrystaliteArmorProvider.java | 88 +- .../item/model/CrystaliteBootsModel.java | 8 +- .../item/model/CrystaliteChestplateModel.java | 14 +- .../item/model/CrystaliteHelmetModel.java | 6 +- .../item/model/CrystaliteLeggingsModel.java | 4 +- .../ru/betterend/item/tool/EndAxeItem.java | 20 +- .../ru/betterend/item/tool/EndHammerItem.java | 105 +-- .../ru/betterend/item/tool/EndHoeItem.java | 8 +- .../betterend/item/tool/EndPickaxeItem.java | 36 +- .../ru/betterend/item/tool/EndShovelItem.java | 29 +- .../ru/betterend/item/tool/EndSwordItem.java | 8 +- .../mixin/client/AnvilScreenMixin.java | 28 +- .../mixin/client/BackgroundRendererMixin.java | 55 +- .../mixin/client/BiomeColorsMixin.java | 18 +- .../client/ClientPlayNetworkHandlerMixin.java | 9 +- .../mixin/client/ClientRecipeBookMixin.java | 2 +- .../client/EnchantingTableBlockMixin.java | 26 +- .../mixin/client/MinecraftClientMixin.java | 33 +- .../mixin/client/ModelLoaderMixin.java | 32 +- .../mixin/client/ModelVariantMapMixin.java | 9 +- .../mixin/client/MusicTrackerMixin.java | 35 +- .../client/NamespaceResourceManagerMixin.java | 23 +- .../mixin/client/WorldRendererMixin.java | 120 +-- .../mixin/common/AbstractBlockMixin.java | 37 +- .../mixin/common/AnvilBlockMixin.java | 8 +- .../mixin/common/AnvilScreenHandlerMixin.java | 54 +- .../mixin/common/ArmorItemAccessor.java | 6 +- .../mixin/common/BiomeArrayMixin.java | 6 +- .../mixin/common/BoneMealItemMixin.java | 85 +- .../mixin/common/BrewingAccessor.java | 4 +- .../mixin/common/ChorusFlowerBlockMixin.java | 87 +- .../mixin/common/ChorusPlantBlockMixin.java | 81 +- .../mixin/common/ChorusPlantFeatureMixin.java | 27 +- .../mixin/common/ComposterBlockAccessor.java | 4 +- .../common/CraftingScreenHandlerMixin.java | 7 +- .../mixin/common/DimensionTypeMixin.java | 10 +- .../common/EnchantmentScreenHandlerMixin.java | 26 +- .../mixin/common/EndPortalFeatureMixin.java | 17 +- .../mixin/common/EndSpikeFeatureMixin.java | 74 +- .../mixin/common/EndermanEntityMixin.java | 14 +- .../betterend/mixin/common/EntityMixin.java | 38 +- .../mixin/common/HostileEntityMixin.java | 18 +- .../mixin/common/LivingEntityMixin.java | 25 +- .../mixin/common/MinecraftServerMixin.java | 42 +- .../common/PlayerAdvancementTrackerMixin.java | 25 +- .../mixin/common/PlayerEntityMixin.java | 30 +- .../mixin/common/PlayerManagerMixin.java | 121 +-- .../mixin/common/RecipeManagerAccessor.java | 12 +- .../mixin/common/RecipeManagerMixin.java | 27 +- .../mixin/common/ServerPlayerEntityMixin.java | 54 +- .../mixin/common/ServerWorldMixin.java | 40 +- .../mixin/common/SlimeEntityMixin.java | 7 +- .../mixin/common/TagGroupLoaderMixin.java | 17 +- .../java/ru/betterend/noise/VoronoiNoise.java | 32 +- .../betterend/particle/FireflyParticle.java | 47 +- .../particle/GlowingSphereParticleEffect.java | 11 +- .../betterend/particle/InfusionParticle.java | 24 +- .../particle/InfusionParticleType.java | 26 +- .../particle/ParticleBlackSpore.java | 53 +- .../ru/betterend/particle/ParticleGeyser.java | 40 +- .../particle/ParticleGlowingSphere.java | 52 +- .../particle/ParticleJungleSpore.java | 41 +- .../betterend/particle/ParticleSnowflake.java | 51 +- .../betterend/particle/ParticleSulphur.java | 51 +- .../particle/ParticleTenaneaPetal.java | 61 +- .../particle/PaticlePortalSphere.java | 41 +- .../particle/SmaragdantParticle.java | 53 +- .../ru/betterend/patterns/BlockPatterned.java | 5 +- .../java/ru/betterend/patterns/Patterns.java | 237 ++--- .../ru/betterend/recipe/AlloyingRecipes.java | 49 +- .../ru/betterend/recipe/AnvilRecipes.java | 80 +- .../ru/betterend/recipe/CraftingRecipes.java | 349 ++++---- .../ru/betterend/recipe/EndRecipeManager.java | 37 +- .../ru/betterend/recipe/FurnaceRecipes.java | 7 +- .../ru/betterend/recipe/InfusionRecipes.java | 827 ++++++------------ .../ru/betterend/recipe/SmithingRecipes.java | 112 +-- .../recipe/builders/AlloyingRecipe.java | 119 +-- .../recipe/builders/AnvilRecipe.java | 132 +-- .../recipe/builders/FurnaceRecipe.java | 69 +- .../betterend/recipe/builders/GridRecipe.java | 72 +- .../recipe/builders/InfusionRecipe.java | 106 +-- .../recipe/builders/SmithingTableRecipe.java | 61 +- .../java/ru/betterend/registry/EndBiomes.java | 187 ++-- .../betterend/registry/EndBlockEntities.java | 45 +- .../java/ru/betterend/registry/EndBlocks.java | 363 +++++--- .../ru/betterend/registry/EndEntities.java | 66 +- .../registry/EndEntitiesRenders.java | 6 +- .../ru/betterend/registry/EndFeatures.java | 333 ++++--- .../java/ru/betterend/registry/EndItems.java | 190 ++-- .../ru/betterend/registry/EndParticles.java | 47 +- .../ru/betterend/registry/EndPortals.java | 75 +- .../java/ru/betterend/registry/EndSounds.java | 15 +- .../ru/betterend/registry/EndStructures.java | 51 +- .../java/ru/betterend/registry/EndTags.java | 106 ++- .../ru/betterend/registry/FilaluxBlock.java | 4 +- .../betterend/registry/FilaluxWingsBlock.java | 25 +- .../betterend/registry/PondAnemoneBlock.java | 40 +- .../ru/betterend/rituals/EternalRitual.java | 405 +++++---- .../ru/betterend/rituals/InfusionRitual.java | 89 +- .../java/ru/betterend/tab/CreativeTabs.java | 10 +- .../java/ru/betterend/util/BlocksHelper.java | 172 ++-- .../java/ru/betterend/util/BonemealUtil.java | 55 +- .../java/ru/betterend/util/ColorUtil.java | 103 +-- .../ru/betterend/util/FeaturesHelper.java | 10 +- src/main/java/ru/betterend/util/ItemUtil.java | 23 +- .../java/ru/betterend/util/LootTableUtil.java | 6 +- .../java/ru/betterend/util/RecipeHelper.java | 10 +- .../java/ru/betterend/util/SpawnHelper.java | 12 +- .../java/ru/betterend/util/SplineHelper.java | 150 ++-- .../ru/betterend/util/StructureHelper.java | 144 ++- .../java/ru/betterend/util/TagHelper.java | 54 +- .../ru/betterend/util/TranslationHelper.java | 30 +- .../java/ru/betterend/util/WorldDataUtil.java | 23 +- .../java/ru/betterend/util/sdf/PosInfo.java | 42 +- src/main/java/ru/betterend/util/sdf/SDF.java | 100 +-- .../util/sdf/operator/SDFBinary.java | 12 +- .../util/sdf/operator/SDFHeightmap.java | 30 +- .../util/sdf/operator/SDFRadialNoiseMap.java | 25 +- .../sdf/operator/SDFSmoothIntersection.java | 8 +- .../sdf/operator/SDFSmoothSubtraction.java | 8 +- .../util/sdf/operator/SDFSmoothUnion.java | 6 +- .../betterend/util/sdf/operator/SDFUnary.java | 8 +- .../util/sdf/primitive/SDFCappedCone.java | 11 +- .../util/sdf/primitive/SDFCapsule.java | 10 +- .../betterend/util/sdf/primitive/SDFLine.java | 10 +- .../betterend/util/sdf/primitive/SDFPie.java | 16 +- .../util/sdf/primitive/SDFPrimitive.java | 26 +- .../world/biome/BiomeDefinition.java | 113 ++- .../ru/betterend/world/biome/EndBiome.java | 28 +- .../world/biome/air/BiomeIceStarfield.java | 16 +- .../world/biome/cave/EndCaveBiome.java | 28 +- .../world/biome/cave/LushAuroraCaveBiome.java | 27 +- .../world/biome/land/AmberLandBiome.java | 34 +- .../biome/land/BlossomingSpiresBiome.java | 32 +- .../world/biome/land/ChorusForestBiome.java | 36 +- .../biome/land/CrystalMountainsBiome.java | 12 +- .../biome/land/DragonGraveyardsBiome.java | 28 +- .../world/biome/land/DryShrublandBiome.java | 20 +- .../world/biome/land/DustWastelandsBiome.java | 17 +- .../biome/land/FoggyMushroomlandBiome.java | 45 +- .../biome/land/GlowingGrasslandsBiome.java | 35 +- .../world/biome/land/LanternWoodsBiome.java | 36 +- .../world/biome/land/MegalakeBiome.java | 38 +- .../world/biome/land/MegalakeGroveBiome.java | 41 +- .../world/biome/land/NeonOasisBiome.java | 21 +- .../biome/land/PaintedMountainsBiome.java | 18 +- .../world/biome/land/ShadowForestBiome.java | 42 +- .../world/biome/land/SulphurSpringsBiome.java | 32 +- .../world/biome/land/UmbrellaJungleBiome.java | 43 +- .../world/features/BiomeIslandFeature.java | 36 +- .../world/features/BlueVineFeature.java | 16 +- .../world/features/CavePlantFeature.java | 9 +- .../world/features/CavePumpkinFeature.java | 18 +- .../world/features/CharniaFeature.java | 4 +- .../world/features/CrashedShipFeature.java | 54 +- .../world/features/DefaultFeature.java | 24 +- .../world/features/DoublePlantFeature.java | 23 +- .../betterend/world/features/EndFeature.java | 113 ++- .../world/features/EndLilyFeature.java | 4 +- .../world/features/EndLotusFeature.java | 4 +- .../world/features/EndLotusLeafFeature.java | 47 +- .../world/features/FilaluxFeature.java | 12 +- .../features/FullHeightScatterFeature.java | 29 +- .../world/features/GlowPillarFeature.java | 7 +- .../world/features/HydraluxFeature.java | 4 +- .../features/InvertedScatterFeature.java | 27 +- .../world/features/LanceleafFeature.java | 7 +- .../betterend/world/features/ListFeature.java | 27 +- .../world/features/MengerSpongeFeature.java | 14 +- .../world/features/NBTStructureFeature.java | 113 ++- .../world/features/NeonCactusFeature.java | 46 +- .../world/features/ScatterFeature.java | 46 +- .../world/features/SilkMothNestFeature.java | 31 +- .../SingleInvertedScatterFeature.java | 17 +- .../world/features/SinglePlantFeature.java | 40 +- .../world/features/SkyScatterFeature.java | 27 +- .../features/UnderwaterPlantFeature.java | 20 +- .../features/UnderwaterPlantScatter.java | 35 +- .../betterend/world/features/VineFeature.java | 28 +- .../world/features/WallPlantFeature.java | 26 +- .../world/features/WallPlantOnLogFeature.java | 12 +- .../world/features/WallScatterFeature.java | 27 +- .../world/features/bushes/BushFeature.java | 54 +- .../features/bushes/BushWithOuterFeature.java | 59 +- .../bushes/LargeAmaranitaFeature.java | 30 +- .../world/features/bushes/Lumecorn.java | 46 +- .../features/bushes/TenaneaBushFeature.java | 86 +- .../terrain/BigAuroraCrystalFeature.java | 24 +- .../features/terrain/EndLakeFeature.java | 105 ++- .../features/terrain/FallenPillarFeature.java | 28 +- .../terrain/FloatingSpireFeature.java | 28 +- .../world/features/terrain/GeyserFeature.java | 87 +- .../features/terrain/IceStarFeature.java | 42 +- .../terrain/ObsidianBoulderFeature.java | 36 +- .../ObsidianPillarBasementFeature.java | 28 +- .../features/terrain/OreLayerFeature.java | 27 +- .../features/terrain/SingleBlockFeature.java | 21 +- .../terrain/SmaragdantCrystalFeature.java | 29 +- .../world/features/terrain/SpireFeature.java | 37 +- .../features/terrain/StalactiteFeature.java | 39 +- .../features/terrain/SulphurHillFeature.java | 28 +- .../terrain/SulphuricCaveFeature.java | 126 +-- .../terrain/SulphuricLakeFeature.java | 92 +- .../features/terrain/SurfaceVentFeature.java | 29 +- .../caves/CaveChunkPopulatorFeature.java | 55 +- .../terrain/caves/EndCaveFeature.java | 86 +- .../terrain/caves/RoundCaveFeature.java | 30 +- .../terrain/caves/TunelCaveFeature.java | 39 +- .../features/trees/DragonTreeFeature.java | 140 +-- .../trees/GiganticAmaranitaFeature.java | 124 +-- .../features/trees/HelixTreeFeature.java | 88 +- .../features/trees/JellyshroomFeature.java | 64 +- .../features/trees/LacugroveFeature.java | 104 ++- .../world/features/trees/LucerniaFeature.java | 137 +-- .../trees/MossyGlowshroomFeature.java | 138 +-- .../trees/PythadendronTreeFeature.java | 106 ++- .../world/features/trees/TenaneaFeature.java | 115 +-- .../features/trees/UmbrellaTreeFeature.java | 140 +-- .../world/generator/BetterEndBiomeSource.java | 46 +- .../world/generator/BiomePicker.java | 26 +- .../world/generator/GeneratorOptions.java | 52 +- .../world/generator/IslandLayer.java | 106 ++- .../world/generator/LayerOptions.java | 29 +- .../world/generator/TerrainGenerator.java | 83 +- .../DestructionStructureProcessor.java | 14 +- .../processors/TerrainStructureProcessor.java | 15 +- .../world/structures/EndStructureFeature.java | 19 +- .../world/structures/StructureWorld.java | 81 +- .../features/EternalPortalStructure.java | 28 +- .../features/FeatureBaseStructure.java | 24 +- .../features/GiantIceStarStructure.java | 51 +- .../GiantMossyGlowshroomStructure.java | 80 +- .../features/MegaLakeSmallStructure.java | 10 +- .../features/MegaLakeStructure.java | 10 +- .../features/MountainStructure.java | 13 +- .../features/PaintedMountainStructure.java | 28 +- .../features/SDFStructureFeature.java | 18 +- .../world/structures/piece/CavePiece.java | 24 +- .../piece/CrystalMountainPiece.java | 48 +- .../world/structures/piece/LakePiece.java | 119 +-- .../world/structures/piece/MountainPiece.java | 42 +- .../world/structures/piece/NBTPiece.java | 29 +- .../piece/PaintedMountainPiece.java | 26 +- .../world/structures/piece/VoxelPiece.java | 7 +- .../surface/DoubleBlockSurfaceBuilder.java | 35 +- .../surface/SulphuricSurfaceBuilder.java | 36 +- .../world/surface/SurfaceBuilders.java | 27 +- 491 files changed, 12045 insertions(+), 11953 deletions(-) diff --git a/build.gradle b/build.gradle index c6bbdec8..fbed7c74 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'fabric-loom' version '0.7-SNAPSHOT' + id 'fabric-loom' version '0.6-SNAPSHOT' id 'maven-publish' } @@ -24,7 +24,7 @@ apply plugin: 'maven' dependencies { minecraft "com.mojang:minecraft:${project.minecraft_version}" - mappings "net.fabricmc:yarn:${project.minecraft_version}+build.${project.yarn_mappings}:v2" + mappings minecraft.officialMojangMappings() modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" diff --git a/gradle.properties b/gradle.properties index a2b058f6..5afb5c05 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,6 +15,6 @@ # Dependencies # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api patchouli_version = 50-FABRIC - fabric_version = 0.32.0+1.16 + fabric_version = 0.32.5+1.16 canvas_version = 1.0.+ rei_version = 5.8.10 \ No newline at end of file diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index 23ec25d5..154a40a3 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -3,8 +3,8 @@ package ru.betterend; import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; import ru.betterend.api.BetterEndPlugin; import ru.betterend.config.Configs; import ru.betterend.effects.EndEnchantments; @@ -39,6 +39,7 @@ import ru.betterend.world.surface.SurfaceBuilders; public class BetterEnd implements ModInitializer { public static final String MOD_ID = "betterend"; public static final Logger LOGGER = Logger.get(); + @Override public void onInitialize() { EndPortals.loadPortals(); @@ -66,40 +67,41 @@ public class BetterEnd implements ModInitializer { GeneratorOptions.init(); DataFixerUtil.init(); LootTableUtil.init(); - + if (hasGuideBook()) { GuideBookItem.register(); } - - FabricLoader.getInstance().getEntrypoints("betterend", BetterEndPlugin.class).forEach(BetterEndPlugin::register); + + FabricLoader.getInstance().getEntrypoints("betterend", BetterEndPlugin.class) + .forEach(BetterEndPlugin::register); Configs.saveConfigs(); - + if (hasGuideBook()) { - PlayerAdvancementsEvents.PLAYER_ADVENCEMENT_COMPLETE.register((player, advancement, criterionName) -> { - Identifier advId = new Identifier("minecraft:end/enter_end_gateway"); + PlayerAdvancementsEvents.PLAYER_ADVANCEMENT_COMPLETE.register((player, advancement, criterionName) -> { + ResourceLocation advId = new ResourceLocation("minecraft:end/enter_end_gateway"); if (advId.equals(advancement.getId())) { player.giveItemStack(new ItemStack(GuideBookItem.GUIDE_BOOK)); } }); } } - + public static boolean hasGuideBook() { return FabricLoader.getInstance().isModLoaded("patchouli"); } - - public static Identifier makeID(String path) { - return new Identifier(MOD_ID, path); + + public static ResourceLocation makeID(String path) { + return new ResourceLocation(MOD_ID, path); } - + public static String getStringId(String id) { return String.format("%s:%s", MOD_ID, id); } - + public static boolean isDevEnvironment() { return FabricLoader.getInstance().isDevelopmentEnvironment(); } - + public static boolean isClient() { return FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT; } diff --git a/src/main/java/ru/betterend/blocks/AeterniumAnvil.java b/src/main/java/ru/betterend/blocks/AeterniumAnvil.java index a57ca9c6..fcebb3eb 100644 --- a/src/main/java/ru/betterend/blocks/AeterniumAnvil.java +++ b/src/main/java/ru/betterend/blocks/AeterniumAnvil.java @@ -1,35 +1,35 @@ package ru.betterend.blocks; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.IntProperty; -import net.minecraft.util.Identifier; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.resources.ResourceLocation; import ru.betterend.blocks.basis.EndAnvilBlock; import ru.betterend.item.material.EndToolMaterial; import ru.betterend.patterns.Patterns; import ru.betterend.registry.EndBlocks; public class AeterniumAnvil extends EndAnvilBlock { - private static final IntProperty DESTRUCTION = BlockProperties.DESTRUCTION_LONG; - + private static final IntegerProperty DESTRUCTION = BlockProperties.DESTRUCTION_LONG; + public AeterniumAnvil() { - super(EndBlocks.AETERNIUM_BLOCK.getDefaultMaterialColor(), EndToolMaterial.AETERNIUM.getMiningLevel()); + super(EndBlocks.AETERNIUM_BLOCK.defaultMaterialColor(), EndToolMaterial.AETERNIUM.getLevel()); } - + @Override - protected void appendProperties(StateManager.Builder builder) { + protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(DESTRUCTION); builder.add(FACING); } @Override - public IntProperty getDestructionProperty() { + public IntegerProperty getDESTRUCTION() { return DESTRUCTION; } @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_ANVIL_LONG; } } diff --git a/src/main/java/ru/betterend/blocks/AeterniumBlock.java b/src/main/java/ru/betterend/blocks/AeterniumBlock.java index e5e11578..32a52412 100644 --- a/src/main/java/ru/betterend/blocks/AeterniumBlock.java +++ b/src/main/java/ru/betterend/blocks/AeterniumBlock.java @@ -3,26 +3,23 @@ package ru.betterend.blocks; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.block.MaterialColor; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.block.SoundType; import ru.betterend.blocks.basis.BlockBase; public class AeterniumBlock extends BlockBase { public AeterniumBlock() { - super(FabricBlockSettings.of(Material.METAL, MaterialColor.GRAY) - .hardness(65F) - .resistance(1200F) - .requiresTool() - .sounds(BlockSoundGroup.NETHERITE)); + super(FabricBlockSettings.of(Material.METAL, MaterialColor.COLOR_GRAY).hardness(65F).resistance(1200F) + .requiresTool().sounds(SoundType.NETHERITE_BLOCK)); } @Environment(EnvType.CLIENT) - public int getColor(BlockState state, BlockView world, BlockPos pos) { + public int getColor(BlockState state, BlockGetter world, BlockPos pos) { return 0xFF657A7A; } } diff --git a/src/main/java/ru/betterend/blocks/AmaranitaCapBlock.java b/src/main/java/ru/betterend/blocks/AmaranitaCapBlock.java index 2af9deb0..717228df 100644 --- a/src/main/java/ru/betterend/blocks/AmaranitaCapBlock.java +++ b/src/main/java/ru/betterend/blocks/AmaranitaCapBlock.java @@ -2,12 +2,12 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Material; -import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.SoundType; import ru.betterend.blocks.basis.BlockBase; public class AmaranitaCapBlock extends BlockBase { public AmaranitaCapBlock() { - super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sounds(BlockSoundGroup.WOOD)); + super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sounds(SoundType.WOOD)); } } diff --git a/src/main/java/ru/betterend/blocks/AmaranitaHymenophoreBlock.java b/src/main/java/ru/betterend/blocks/AmaranitaHymenophoreBlock.java index 36c8310c..100c4d24 100644 --- a/src/main/java/ru/betterend/blocks/AmaranitaHymenophoreBlock.java +++ b/src/main/java/ru/betterend/blocks/AmaranitaHymenophoreBlock.java @@ -2,15 +2,15 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Material; -import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.SoundType; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; public class AmaranitaHymenophoreBlock extends BlockBase implements IRenderTypeable { public AmaranitaHymenophoreBlock() { - super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sounds(BlockSoundGroup.WOOD)); + super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sounds(SoundType.WOOD)); } @Override diff --git a/src/main/java/ru/betterend/blocks/AmaranitaStemBlock.java b/src/main/java/ru/betterend/blocks/AmaranitaStemBlock.java index 7e0a5702..2aa563ae 100644 --- a/src/main/java/ru/betterend/blocks/AmaranitaStemBlock.java +++ b/src/main/java/ru/betterend/blocks/AmaranitaStemBlock.java @@ -1,12 +1,12 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Blocks; -import net.minecraft.block.MaterialColor; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.MaterialColor; import ru.betterend.blocks.basis.EndPillarBlock; public class AmaranitaStemBlock extends EndPillarBlock { public AmaranitaStemBlock() { - super(FabricBlockSettings.copyOf(Blocks.OAK_PLANKS).materialColor(MaterialColor.LIME)); + super(FabricBlockSettings.copyOf(Blocks.OAK_PLANKS).materialColor(MaterialColor.COLOR_LIGHT_GREEN)); } } diff --git a/src/main/java/ru/betterend/blocks/AmberBlock.java b/src/main/java/ru/betterend/blocks/AmberBlock.java index 54e7ee94..6dbef462 100644 --- a/src/main/java/ru/betterend/blocks/AmberBlock.java +++ b/src/main/java/ru/betterend/blocks/AmberBlock.java @@ -1,12 +1,12 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Blocks; -import net.minecraft.block.MaterialColor; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.MaterialColor; import ru.betterend.blocks.basis.BlockBase; public class AmberBlock extends BlockBase { public AmberBlock() { - super(FabricBlockSettings.copyOf(Blocks.DIAMOND_BLOCK).materialColor(MaterialColor.YELLOW)); + super(FabricBlockSettings.copyOf(Blocks.DIAMOND_BLOCK).materialColor(MaterialColor.COLOR_YELLOW)); } } diff --git a/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java index 7c1395d3..616279c7 100644 --- a/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java +++ b/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java @@ -3,11 +3,11 @@ package ru.betterend.blocks; import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndParticles; @@ -18,35 +18,35 @@ public class AncientEmeraldIceBlock extends BlockBase { public AncientEmeraldIceBlock() { super(FabricBlockSettings.copyOf(Blocks.BLUE_ICE).ticksRandomly()); } - + @Override - public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { Direction dir = BlocksHelper.randomDirection(random); - + if (random.nextBoolean()) { int x = MHelper.randRange(-2, 2, random); int y = MHelper.randRange(-2, 2, random); int z = MHelper.randRange(-2, 2, random); - BlockPos p = pos.add(x, y, z); - if (world.getBlockState(p).isOf(Blocks.WATER)) { - world.setBlockState(p, EndBlocks.EMERALD_ICE.getDefaultState()); + BlockPos p = pos.offset(x, y, z); + if (world.getBlockState(p).is(Blocks.WATER)) { + world.setBlockAndUpdate(p, EndBlocks.EMERALD_ICE.defaultBlockState()); makeParticles(world, p, random); } } - - pos = pos.offset(dir); + + pos = pos.relative(dir); state = world.getBlockState(pos); - if (state.isOf(Blocks.WATER)) { - world.setBlockState(pos, EndBlocks.EMERALD_ICE.getDefaultState()); + if (state.is(Blocks.WATER)) { + world.setBlockAndUpdate(pos, EndBlocks.EMERALD_ICE.defaultBlockState()); makeParticles(world, pos, random); - } - else if (state.isOf(EndBlocks.EMERALD_ICE)) { - world.setBlockState(pos, EndBlocks.DENSE_EMERALD_ICE.getDefaultState()); + } else if (state.is(EndBlocks.EMERALD_ICE)) { + world.setBlockAndUpdate(pos, EndBlocks.DENSE_EMERALD_ICE.defaultBlockState()); makeParticles(world, pos, random); } } - - private void makeParticles(ServerWorld world, BlockPos pos, Random random) { - world.spawnParticles(EndParticles.SNOWFLAKE, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 20, 0.5, 0.5, 0.5, 0); + + private void makeParticles(ServerLevel world, BlockPos pos, Random random) { + world.sendParticles(EndParticles.SNOWFLAKE, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 20, 0.5, 0.5, + 0.5, 0); } } diff --git a/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java b/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java index ba5edf0c..73b3580a 100644 --- a/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java +++ b/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java @@ -6,19 +6,19 @@ import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.AbstractGlassBlock; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.client.color.block.BlockColorProvider; -import net.minecraft.client.color.item.ItemColorProvider; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3i; +import net.minecraft.core.Vec3i; +import net.minecraft.util.Mth; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.block.AbstractGlassBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.client.color.block.BlockColor; +import net.minecraft.client.color.item.ItemColor; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.level.block.SoundType; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IColorProvider; import ru.betterend.interfaces.IRenderTypeable; @@ -29,20 +29,15 @@ public class AuroraCrystalBlock extends AbstractGlassBlock implements IRenderTyp public static final Vec3i[] COLORS; private static final int MIN_DROP = 1; private static final int MAX_DROP = 4; - + public AuroraCrystalBlock() { - super(FabricBlockSettings.of(Material.GLASS) - .breakByTool(FabricToolTags.PICKAXES) - .suffocates((state, world, pos) -> { return false; }) - .hardness(1F) - .resistance(1F) - .sounds(BlockSoundGroup.GLASS) - .luminance(15) - .nonOpaque()); + super(FabricBlockSettings.of(Material.GLASS).breakByTool(FabricToolTags.PICKAXES) + .suffocates((state, world, pos) -> false).hardness(1F).resistance(1F).sounds(SoundType.GLASS) + .luminance(15).nonOpaque()); } @Override - public BlockColorProvider getProvider() { + public BlockColor getBlockProvider() { return (state, world, pos, tintIndex) -> { long i = (long) pos.getX() + (long) pos.getY() + (long) pos.getZ(); double delta = i * 0.1; @@ -50,43 +45,41 @@ public class AuroraCrystalBlock extends AbstractGlassBlock implements IRenderTyp int index2 = (index + 1) & 3; delta -= index; index &= 3; - + Vec3i color1 = COLORS[index]; Vec3i color2 = COLORS[index2]; - - int r = MHelper.floor(MathHelper.lerp(delta, color1.getX(), color2.getX())); - int g = MHelper.floor(MathHelper.lerp(delta, color1.getY(), color2.getY())); - int b = MHelper.floor(MathHelper.lerp(delta, color1.getZ(), color2.getZ())); - + + int r = MHelper.floor(Mth.lerp(delta, color1.getX(), color2.getX())); + int g = MHelper.floor(Mth.lerp(delta, color1.getY(), color2.getY())); + int b = MHelper.floor(Mth.lerp(delta, color1.getZ(), color2.getZ())); + return MHelper.color(r, g, b); }; } @Override - public ItemColorProvider getItemProvider() { - return (stack, tintIndex) -> { - return MHelper.color(COLORS[3].getX(), COLORS[3].getY(), COLORS[3].getZ()); - }; + public ItemColor getItemProvider() { + return (stack, tintIndex) -> MHelper.color(COLORS[3].getX(), COLORS[3].getY(), COLORS[3].getZ()); } @Override public ERenderLayer getRenderLayer() { return ERenderLayer.TRANSLUCENT; } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && tool.isEffectiveOn(state)) { + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && tool.isCorrectToolForDrops(state)) { int count = 0; - int enchant = EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool); + int enchant = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool); if (enchant > 0) { return Lists.newArrayList(new ItemStack(this)); } - enchant = EnchantmentHelper.getLevel(Enchantments.FORTUNE, tool); + enchant = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BLOCK_FORTUNE, tool); if (enchant > 0) { - int min = MathHelper.clamp(MIN_DROP + enchant, MIN_DROP, MAX_DROP); - int max = MAX_DROP + (enchant / Enchantments.FORTUNE.getMaxLevel()); + int min = Mth.clamp(MIN_DROP + enchant, MIN_DROP, MAX_DROP); + int max = MAX_DROP + (enchant / Enchantments.BLOCK_FORTUNE.getMaxLevel()); if (min == max) { return Lists.newArrayList(new ItemStack(EndItems.CRYSTAL_SHARDS, max)); } @@ -98,13 +91,9 @@ public class AuroraCrystalBlock extends AbstractGlassBlock implements IRenderTyp } return Lists.newArrayList(); } - + static { - COLORS = new Vec3i[] { - new Vec3i(247, 77, 161), - new Vec3i(120, 184, 255), - new Vec3i(120, 255, 168), - new Vec3i(243, 58, 255) - }; + COLORS = new Vec3i[] { new Vec3i(247, 77, 161), new Vec3i(120, 184, 255), new Vec3i(120, 255, 168), + new Vec3i(243, 58, 255) }; } } diff --git a/src/main/java/ru/betterend/blocks/BlockProperties.java b/src/main/java/ru/betterend/blocks/BlockProperties.java index 331980be..5d153ab1 100644 --- a/src/main/java/ru/betterend/blocks/BlockProperties.java +++ b/src/main/java/ru/betterend/blocks/BlockProperties.java @@ -2,7 +2,7 @@ package ru.betterend.blocks; import net.minecraft.state.property.BooleanProperty; import net.minecraft.state.property.EnumProperty; -import net.minecraft.state.property.IntProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; import net.minecraft.util.StringIdentifiable; import ru.betterend.registry.EndPortals; @@ -11,7 +11,7 @@ public class BlockProperties { public final static EnumProperty PEDESTAL_STATE = EnumProperty.of("state", PedestalState.class); public static final EnumProperty TRIPLE_SHAPE = EnumProperty.of("shape", TripleShape.class); public static final EnumProperty PENTA_SHAPE = EnumProperty.of("shape", PentaShape.class); - + public static final BooleanProperty TRANSITION = BooleanProperty.of("transition"); public static final BooleanProperty HAS_LIGHT = BooleanProperty.of("has_light"); public static final BooleanProperty HAS_ITEM = BooleanProperty.of("has_item"); @@ -19,23 +19,21 @@ public class BlockProperties { public static final BooleanProperty NATURAL = BooleanProperty.of("natural"); public static final BooleanProperty ACTIVE = BooleanProperty.of("active"); public static final BooleanProperty SMALL = BooleanProperty.of("small"); - - public static final IntProperty DESTRUCTION_LONG = IntProperty.of("destruction", 0, 8); - public static final IntProperty DESTRUCTION = IntProperty.of("destruction", 0, 2); - public static final IntProperty ROTATION = IntProperty.of("rotation", 0, 3); - public static final IntProperty FULLNESS = IntProperty.of("fullness", 0, 3); - public static final IntProperty COLOR = IntProperty.of("color", 0, 7); - public static final IntProperty PORTAL = IntProperty.of("portal", 0, EndPortals.getCount()); - public static final IntProperty SIZE = IntProperty.of("size", 0, 7); - public static final IntProperty AGE = IntProperty.of("age", 0, 3); - + + public static final IntegerProperty DESTRUCTION_LONG = IntegerProperty.of("destruction", 0, 8); + public static final IntegerProperty DESTRUCTION = IntegerProperty.of("destruction", 0, 2); + public static final IntegerProperty ROTATION = IntegerProperty.of("rotation", 0, 3); + public static final IntegerProperty FULLNESS = IntegerProperty.of("fullness", 0, 3); + public static final IntegerProperty COLOR = IntegerProperty.of("color", 0, 7); + public static final IntegerProperty PORTAL = IntegerProperty.of("portal", 0, EndPortals.getCount()); + public static final IntegerProperty SIZE = IntegerProperty.of("size", 0, 7); + public static final IntegerProperty AGE = IntegerProperty.of("age", 0, 3); + public static enum TripleShape implements StringIdentifiable { - TOP("top"), - MIDDLE("middle"), - BOTTOM("bottom"); - + TOP("top"), MIDDLE("middle"), BOTTOM("bottom"); + private final String name; - + TripleShape(String name) { this.name = name; } @@ -44,7 +42,7 @@ public class BlockProperties { public String asString() { return name; } - + @Override public String toString() { return name; @@ -52,41 +50,34 @@ public class BlockProperties { } public static enum PedestalState implements StringIdentifiable { - PEDESTAL_TOP("pedestal_top"), - COLUMN_TOP("column_top"), - BOTTOM("bottom"), - PILLAR("pillar"), - COLUMN("column"), + PEDESTAL_TOP("pedestal_top"), COLUMN_TOP("column_top"), BOTTOM("bottom"), PILLAR("pillar"), COLUMN("column"), DEFAULT("default"); - + private final String name; - + PedestalState(String name) { this.name = name; } - + @Override public String asString() { return this.name; } - + @Override public String toString() { return this.name; } } - + public static enum HydraluxShape implements StringIdentifiable { - FLOWER_BIG_BOTTOM("flower_big_bottom", true), - FLOWER_BIG_TOP("flower_big_top", true), - FLOWER_SMALL_BOTTOM("flower_small_bottom", true), - FLOWER_SMALL_TOP("flower_small_top", true), - VINE("vine", false), - ROOTS("roots", false); - + FLOWER_BIG_BOTTOM("flower_big_bottom", true), FLOWER_BIG_TOP("flower_big_top", true), + FLOWER_SMALL_BOTTOM("flower_small_bottom", true), FLOWER_SMALL_TOP("flower_small_top", true), + VINE("vine", false), ROOTS("roots", false); + private final String name; private final boolean glow; - + HydraluxShape(String name, boolean glow) { this.name = name; this.glow = glow; @@ -96,26 +87,22 @@ public class BlockProperties { public String asString() { return name; } - + @Override public String toString() { return name; } - + public boolean hasGlow() { return glow; } } - + public static enum PentaShape implements StringIdentifiable { - BOTTOM("bottom"), - PRE_BOTTOM("pre_bottom"), - MIDDLE("middle"), - PRE_TOP("pre_top"), - TOP("top"); - + BOTTOM("bottom"), PRE_BOTTOM("pre_bottom"), MIDDLE("middle"), PRE_TOP("pre_top"), TOP("top"); + private final String name; - + PentaShape(String name) { this.name = name; } @@ -124,25 +111,21 @@ public class BlockProperties { public String asString() { return name; } - + @Override public String toString() { return name; } } - + public static enum LumecornShape implements StringIdentifiable { - LIGHT_TOP("light_top", 15), - LIGHT_TOP_MIDDLE("light_top_middle", 15), - LIGHT_MIDDLE("light_middle", 15), - LIGHT_BOTTOM("light_bottom", 15), - MIDDLE("middle", 0), - BOTTOM_BIG("bottom_big", 0), + LIGHT_TOP("light_top", 15), LIGHT_TOP_MIDDLE("light_top_middle", 15), LIGHT_MIDDLE("light_middle", 15), + LIGHT_BOTTOM("light_bottom", 15), MIDDLE("middle", 0), BOTTOM_BIG("bottom_big", 0), BOTTOM_SMALL("bottom_small", 0); - + private final String name; private final int light; - + LumecornShape(String name, int light) { this.name = name; this.light = light; @@ -152,12 +135,12 @@ public class BlockProperties { public String asString() { return name; } - + @Override public String toString() { return name; } - + public int getLight() { return light; } diff --git a/src/main/java/ru/betterend/blocks/BlockSounds.java b/src/main/java/ru/betterend/blocks/BlockSounds.java index cf39c972..75c2ac41 100644 --- a/src/main/java/ru/betterend/blocks/BlockSounds.java +++ b/src/main/java/ru/betterend/blocks/BlockSounds.java @@ -1,13 +1,10 @@ package ru.betterend.blocks; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.sound.SoundEvents; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.sounds.SoundEvents; public class BlockSounds { - public static final BlockSoundGroup TERRAIN_SOUND = new BlockSoundGroup(1.0F, 1.0F, - SoundEvents.BLOCK_STONE_BREAK, - SoundEvents.BLOCK_WART_BLOCK_STEP, - SoundEvents.BLOCK_STONE_PLACE, - SoundEvents.BLOCK_STONE_HIT, + public static final SoundType TERRAIN_SOUND = new SoundType(1.0F, 1.0F, SoundEvents.BLOCK_STONE_BREAK, + SoundEvents.BLOCK_WART_BLOCK_STEP, SoundEvents.BLOCK_STONE_PLACE, SoundEvents.BLOCK_STONE_HIT, SoundEvents.BLOCK_STONE_FALL); } diff --git a/src/main/java/ru/betterend/blocks/BlueVineBlock.java b/src/main/java/ru/betterend/blocks/BlueVineBlock.java index 122225ae..0d1b0643 100644 --- a/src/main/java/ru/betterend/blocks/BlueVineBlock.java +++ b/src/main/java/ru/betterend/blocks/BlueVineBlock.java @@ -1,8 +1,8 @@ package ru.betterend.blocks; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.state.StateManager; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.EnumProperty; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.UpDownPlantBlock; @@ -10,12 +10,12 @@ import ru.betterend.registry.EndBlocks; public class BlueVineBlock extends UpDownPlantBlock { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE); } - + @Override protected boolean isTerrain(BlockState state) { return state.getBlock() == EndBlocks.END_MOSS || state.getBlock() == EndBlocks.END_MYCELIUM; diff --git a/src/main/java/ru/betterend/blocks/BlueVineLanternBlock.java b/src/main/java/ru/betterend/blocks/BlueVineLanternBlock.java index a79781a6..44de7d10 100644 --- a/src/main/java/ru/betterend/blocks/BlueVineLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/BlueVineLanternBlock.java @@ -2,45 +2,46 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.BooleanProperty; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.WorldAccess; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; public class BlueVineLanternBlock extends BlockBase { public static final BooleanProperty NATURAL = BlockProperties.NATURAL; - + public BlueVineLanternBlock() { - super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sounds(BlockSoundGroup.WART_BLOCK).luminance(15)); - this.setDefaultState(this.stateManager.getDefaultState().with(NATURAL, false)); + super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sounds(SoundType.WART_BLOCK) + .luminance(15)); + this.setDefaultState(this.stateManager.defaultBlockState().with(NATURAL, false)); } - + @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return state.get(NATURAL) ? world.getBlockState(pos.down()).getBlock() == EndBlocks.BLUE_VINE : true; + return state.getValue(NATURAL) ? world.getBlockState(pos.below()).getBlock() == EndBlocks.BLUE_VINE : true; } - + @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, + BlockPos pos, BlockPos neighborPos) { if (!canPlaceAt(state, world, pos)) { - return Blocks.AIR.getDefaultState(); - } - else { + return Blocks.AIR.defaultBlockState(); + } else { return state; } } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(NATURAL); } } diff --git a/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java b/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java index a4710621..f5ff9a39 100644 --- a/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java @@ -2,10 +2,10 @@ package ru.betterend.blocks; import java.util.Random; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.AbstractBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; @@ -22,32 +22,38 @@ public class BlueVineSeedBlock extends EndPlantWithAgeBlock { if (h < height + 1) { return; } - BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.BLUE_VINE.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); + BlocksHelper.setWithoutUpdate(world, pos, + EndBlocks.BLUE_VINE.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); for (int i = 1; i < height; i++) { - BlocksHelper.setWithoutUpdate(world, pos.up(i), EndBlocks.BLUE_VINE.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); + BlocksHelper.setWithoutUpdate(world, pos.up(i), + EndBlocks.BLUE_VINE.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); } - BlocksHelper.setWithoutUpdate(world, pos.up(height), EndBlocks.BLUE_VINE.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); + BlocksHelper.setWithoutUpdate(world, pos.up(height), + EndBlocks.BLUE_VINE.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); placeLantern(world, pos.up(height + 1)); } - + private void placeLantern(StructureWorldAccess world, BlockPos pos) { - BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.BLUE_VINE_LANTERN.getDefaultState().with(BlueVineLanternBlock.NATURAL, true)); - for (Direction dir: BlocksHelper.HORIZONTAL) { - BlockPos p = pos.offset(dir); + BlocksHelper.setWithoutUpdate(world, pos, + EndBlocks.BLUE_VINE_LANTERN.defaultBlockState().with(BlueVineLanternBlock.NATURAL, true)); + for (Direction dir : BlocksHelper.HORIZONTAL) { + BlockPos p = pos.relative(dir); if (world.isAir(p)) { - BlocksHelper.setWithoutUpdate(world, p, EndBlocks.BLUE_VINE_FUR.getDefaultState().with(FurBlock.FACING, dir)); + BlocksHelper.setWithoutUpdate(world, p, + EndBlocks.BLUE_VINE_FUR.defaultBlockState().with(FurBlock.FACING, dir)); } } if (world.isAir(pos.up())) { - BlocksHelper.setWithoutUpdate(world, pos.up(), EndBlocks.BLUE_VINE_FUR.getDefaultState().with(FurBlock.FACING, Direction.UP)); + BlocksHelper.setWithoutUpdate(world, pos.up(), + EndBlocks.BLUE_VINE_FUR.defaultBlockState().with(FurBlock.FACING, Direction.UP)); } } - + @Override protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.END_MOSS) || state.isOf(EndBlocks.END_MYCELIUM); + return state.is(EndBlocks.END_MOSS) || state.is(EndBlocks.END_MYCELIUM); } - + @Override public AbstractBlock.OffsetType getOffsetType() { return AbstractBlock.OffsetType.NONE; diff --git a/src/main/java/ru/betterend/blocks/BoluxMushroomBlock.java b/src/main/java/ru/betterend/blocks/BoluxMushroomBlock.java index e59a4283..338016be 100644 --- a/src/main/java/ru/betterend/blocks/BoluxMushroomBlock.java +++ b/src/main/java/ru/betterend/blocks/BoluxMushroomBlock.java @@ -5,31 +5,31 @@ import java.util.Random; import com.google.common.collect.Lists; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.ShapeContext; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.AbstractBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.core.BlockPos; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; public class BoluxMushroomBlock extends EndPlantBlock { private static final VoxelShape SHAPE = Block.createCuboidShape(1, 0, 1, 15, 9, 15); - + public BoluxMushroomBlock() { super(10); } - + @Override protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.RUTISCUS); + return state.is(EndBlocks.RUTISCUS); } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { return SHAPE; @@ -39,19 +39,19 @@ public class BoluxMushroomBlock extends EndPlantBlock { public AbstractBlock.OffsetType getOffsetType() { return AbstractBlock.OffsetType.NONE; } - + @Override public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { return false; } @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { + public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { return false; } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Lists.newArrayList(new ItemStack(this)); } } diff --git a/src/main/java/ru/betterend/blocks/BrimstoneBlock.java b/src/main/java/ru/betterend/blocks/BrimstoneBlock.java index 8b832d94..804b2442 100644 --- a/src/main/java/ru/betterend/blocks/BrimstoneBlock.java +++ b/src/main/java/ru/betterend/blocks/BrimstoneBlock.java @@ -5,52 +5,53 @@ import java.util.Random; import org.jetbrains.annotations.Nullable; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.MaterialColor; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.entity.LivingEntity; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.fluid.Fluids; -import net.minecraft.item.ItemStack; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.state.StateManager; +import net.minecraft.world.item.ItemStack; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.BooleanProperty; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; public class BrimstoneBlock extends BlockBase { public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; - + public BrimstoneBlock() { - super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(MaterialColor.BROWN).ticksRandomly()); - setDefaultState(stateManager.getDefaultState().with(ACTIVATED, false)); + super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(MaterialColor.COLOR_BROWN).ticksRandomly()); + setDefaultState(stateManager.defaultBlockState().with(ACTIVATED, false)); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(ACTIVATED); } @Override - public void onPlaced(World world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack itemStack) { - if (world.isClient()) { - updateChunks((ClientWorld) world, pos); + public void onPlaced(Level world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, + ItemStack itemStack) { + if (world.isClientSide()) { + updateChunks((ClientLevel) world, pos); } } - - public void onBroken(WorldAccess world, BlockPos pos, BlockState state) { - if (world.isClient()) { - updateChunks((ClientWorld) world, pos); + + public void onBroken(LevelAccessor world, BlockPos pos, BlockState state) { + if (world.isClientSide()) { + updateChunks((ClientLevel) world, pos); } } - - private void updateChunks(ClientWorld world, BlockPos pos) { + + private void updateChunks(ClientLevel world, BlockPos pos) { int y = pos.getY() >> 4; int x1 = (pos.getX() - 2) >> 4; int z1 = (pos.getZ() - 2) >> 4; @@ -62,41 +63,37 @@ public class BrimstoneBlock extends BlockBase { } } } - + @Override - public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + public void scheduledTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { boolean deactivate = true; - for (Direction dir: BlocksHelper.DIRECTIONS) { - if (world.getFluidState(pos.offset(dir)).getFluid().equals(Fluids.WATER)) { + for (Direction dir : BlocksHelper.DIRECTIONS) { + if (world.getFluidState(pos.relative(dir)).getFluid().equals(Fluids.WATER)) { deactivate = false; break; } } - if (state.get(ACTIVATED)) { + if (state.getValue(ACTIVATED)) { if (deactivate) { - world.setBlockState(pos, getDefaultState().with(ACTIVATED, false)); - } - else if (state.get(ACTIVATED) && random.nextInt(16) == 0) { + world.setBlockAndUpdate(pos, getDefaultState().with(ACTIVATED, false)); + } else if (state.getValue(ACTIVATED) && random.nextInt(16) == 0) { Direction dir = BlocksHelper.randomDirection(random); - BlockPos side = pos.offset(dir); + BlockPos side = pos.relative(dir); BlockState sideState = world.getBlockState(side); if (sideState.getBlock() instanceof SulphurCrystalBlock) { if (sideState.get(SulphurCrystalBlock.AGE) < 2 && sideState.get(SulphurCrystalBlock.WATERLOGGED)) { int age = sideState.get(SulphurCrystalBlock.AGE) + 1; - world.setBlockState(side, sideState.with(SulphurCrystalBlock.AGE, age)); + world.setBlockAndUpdate(side, sideState.with(SulphurCrystalBlock.AGE, age)); } - } - else if (sideState.getFluidState().getFluid() == Fluids.WATER) { - BlockState crystal = EndBlocks.SULPHUR_CRYSTAL.getDefaultState() - .with(SulphurCrystalBlock.FACING, dir) - .with(SulphurCrystalBlock.WATERLOGGED, true) + } else if (sideState.getFluidState().getFluid() == Fluids.WATER) { + BlockState crystal = EndBlocks.SULPHUR_CRYSTAL.defaultBlockState() + .with(SulphurCrystalBlock.FACING, dir).with(SulphurCrystalBlock.WATERLOGGED, true) .with(SulphurCrystalBlock.AGE, 0); - world.setBlockState(side, crystal); + world.setBlockAndUpdate(side, crystal); } } - } - else if (!deactivate && !state.get(ACTIVATED)) { - world.setBlockState(pos, getDefaultState().with(ACTIVATED, true)); + } else if (!deactivate && !state.getValue(ACTIVATED)) { + world.setBlockAndUpdate(pos, getDefaultState().with(ACTIVATED, true)); } } } diff --git a/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java b/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java index 0cab0586..4eed7a40 100644 --- a/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java +++ b/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java @@ -6,55 +6,52 @@ 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.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.AbstractBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.core.BlockPos; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; import ru.betterend.blocks.basis.UnderwaterPlantBlock; public class BubbleCoralBlock extends UnderwaterPlantBlock { private static final VoxelShape SHAPE = Block.createCuboidShape(0, 0, 0, 16, 14, 16); - + public BubbleCoralBlock() { - super(FabricBlockSettings.of(Material.UNDERWATER_PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.CORAL) - .breakByHand(true) - .noCollision()); + super(FabricBlockSettings.of(Material.UNDERWATER_PLANT).breakByTool(FabricToolTags.SHEARS) + .sounds(SoundType.CORAL).breakByHand(true).noCollision()); } - + @Override public AbstractBlock.OffsetType getOffsetType() { return AbstractBlock.OffsetType.NONE; } @Environment(EnvType.CLIENT) - public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { + public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { double x = pos.getX() + random.nextDouble(); double y = pos.getY() + random.nextDouble() * 0.5F + 0.5F; double z = pos.getZ() + random.nextDouble(); world.addParticle(ParticleTypes.BUBBLE, x, y, z, 0.0D, 0.0D, 0.0D); } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { return SHAPE; } - + @Override public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { return false; } @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { + public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { return false; } } diff --git a/src/main/java/ru/betterend/blocks/BulbVineBlock.java b/src/main/java/ru/betterend/blocks/BulbVineBlock.java index d88e55aa..53e2b1cf 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineBlock.java @@ -4,11 +4,11 @@ import java.util.List; import com.google.common.collect.Lists; -import net.minecraft.block.BlockState; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.VineBlock; @@ -20,28 +20,27 @@ public class BulbVineBlock extends VineBlock { public BulbVineBlock() { super(15, true); } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - if (state.get(SHAPE) == TripleShape.BOTTOM) { + public List getDrops(BlockState state, LootContext.Builder builder) { + if (state.getValue(SHAPE) == TripleShape.BOTTOM) { return Lists.newArrayList(new ItemStack(EndItems.GLOWING_BULB)); - } - else if (MHelper.RANDOM.nextInt(8) == 0) { + } else if (MHelper.RANDOM.nextInt(8) == 0) { return Lists.newArrayList(new ItemStack(EndBlocks.BULB_VINE_SEED)); - } - else { + } else { return Lists.newArrayList(); } } - + @Override public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { return false; } - + @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { boolean canPlace = super.canPlaceAt(state, world, pos); - return (state.isOf(this) && state.get(SHAPE) == TripleShape.BOTTOM) ? canPlace : canPlace && world.getBlockState(pos.down()).isOf(this); + return (state.is(this) && state.getValue(SHAPE) == TripleShape.BOTTOM) ? canPlace + : canPlace && world.getBlockState(pos.below()).is(this); } } diff --git a/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java b/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java index 00775b1f..714bb717 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java @@ -7,17 +7,17 @@ import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.block.MaterialColor; -import net.minecraft.block.ShapeContext; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; +import net.minecraft.world.level.BlockGetter; import ru.betterend.blocks.basis.EndLanternBlock; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; @@ -27,64 +27,58 @@ import ru.betterend.patterns.Patterns; public class BulbVineLanternBlock extends EndLanternBlock implements IRenderTypeable, BlockPatterned { private static final VoxelShape SHAPE_CEIL = Block.createCuboidShape(4, 4, 4, 12, 16, 12); private static final VoxelShape SHAPE_FLOOR = Block.createCuboidShape(4, 0, 4, 12, 12, 12); - + public BulbVineLanternBlock() { - this(FabricBlockSettings.of(Material.METAL) - .sounds(BlockSoundGroup.LANTERN) - .hardness(1) - .resistance(1) - .breakByTool(FabricToolTags.PICKAXES) - .materialColor(MaterialColor.LIGHT_GRAY) - .requiresTool() + this(FabricBlockSettings.of(Material.METAL).sounds(SoundType.LANTERN).hardness(1).resistance(1) + .breakByTool(FabricToolTags.PICKAXES).materialColor(MaterialColor.LIGHT_GRAY).requiresTool() .luminance(15)); } - + public BulbVineLanternBlock(FabricBlockSettings settings) { super(settings); } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return state.get(IS_FLOOR) ? SHAPE_FLOOR : SHAPE_CEIL; + return state.getValue(IS_FLOOR) ? SHAPE_FLOOR : SHAPE_CEIL; } @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); Map map = Maps.newHashMap(); map.put("%glow%", getGlowTexture()); map.put("%metal%", getMetalTexture(blockId)); if (block.contains("item") || block.contains("ceil")) { return Patterns.createJson(Patterns.BLOCK_BULB_LANTERN_CEIL, map); - } - else { + } else { return Patterns.createJson(Patterns.BLOCK_BULB_LANTERN_FLOOR, map); } } - - protected String getMetalTexture(Identifier blockId) { + + protected String getMetalTexture(ResourceLocation blockId) { String name = blockId.getPath(); name = name.substring(0, name.indexOf('_')); return name + "_bulb_vine_lantern_metal"; } - + protected String getGlowTexture() { return "bulb_vine_lantern_bulb"; } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_BULB_LANTERN; } } diff --git a/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java b/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java index a1c7262f..80031b50 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java @@ -1,8 +1,8 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.client.color.block.BlockColorProvider; -import net.minecraft.client.color.item.ItemColorProvider; +import net.minecraft.client.color.block.BlockColor; +import net.minecraft.client.color.item.ItemColor; import ru.betterend.interfaces.IColorProvider; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; @@ -13,19 +13,19 @@ public class BulbVineLanternColoredBlock extends BulbVineLanternBlock implements } @Override - public BlockColorProvider getProvider() { + public BlockColor getBlockProvider() { return (state, world, pos, tintIndex) -> { return getColor(); }; } @Override - public ItemColorProvider getItemProvider() { + public ItemColor getItemProvider() { return (stack, tintIndex) -> { return getColor(); }; } - + private int getColor() { int color = BlocksHelper.getBlockColor(this); int b = (color & 255); @@ -34,7 +34,7 @@ public class BulbVineLanternColoredBlock extends BulbVineLanternBlock implements float[] hsv = MHelper.fromRGBtoHSB(r, g, b); return MHelper.fromHSBtoRGB(hsv[0], hsv[1], hsv[1] > 0.2 ? 1 : hsv[2]); } - + @Override protected String getGlowTexture() { return "bulb_vine_lantern_overlay"; diff --git a/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java b/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java index 9df8ecc2..adc98069 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java @@ -2,9 +2,9 @@ package ru.betterend.blocks; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.tag.BlockTags; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.tags.BlockTags; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties.TripleShape; @@ -24,11 +24,14 @@ public class BulbVineSeedBlock extends EndPlantWithAgeBlock { public void growAdult(StructureWorldAccess world, Random random, BlockPos pos) { int h = BlocksHelper.downRay(world, pos, random.nextInt(24)) - 1; if (h > 2) { - BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.BULB_VINE.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); + BlocksHelper.setWithoutUpdate(world, pos, + EndBlocks.BULB_VINE.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); for (int i = 1; i < h; i++) { - BlocksHelper.setWithoutUpdate(world, pos.down(i), EndBlocks.BULB_VINE.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); + BlocksHelper.setWithoutUpdate(world, pos.down(i), + EndBlocks.BULB_VINE.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); } - BlocksHelper.setWithoutUpdate(world, pos.down(h), EndBlocks.BULB_VINE.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); + BlocksHelper.setWithoutUpdate(world, pos.down(h), + EndBlocks.BULB_VINE.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); } } } diff --git a/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java b/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java index 9cc43f34..ce6fe814 100644 --- a/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java +++ b/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java @@ -4,18 +4,18 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.ShapeContext; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.state.StateManager; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.BooleanProperty; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockView; +import net.minecraft.world.level.BlockGetter; import ru.betterend.blocks.basis.BlockBaseNotFull; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; @@ -25,38 +25,39 @@ public class CavePumpkinBlock extends BlockBaseNotFull implements IRenderTypeabl public static final BooleanProperty SMALL = BlockProperties.SMALL; private static final VoxelShape SHAPE_SMALL; private static final VoxelShape SHAPE_BIG; - + public CavePumpkinBlock() { - super(FabricBlockSettings.copyOf(Blocks.PUMPKIN).luminance((state) -> state.get(SMALL) ? 10 : 15)); + super(FabricBlockSettings.copyOf(Blocks.PUMPKIN).luminance((state) -> state.getValue(SMALL) ? 10 : 15)); setDefaultState(getDefaultState().with(SMALL, false)); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SMALL); } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { - return state.get(SMALL) ? SHAPE_SMALL : SHAPE_BIG; + return state.getValue(SMALL) ? SHAPE_SMALL : SHAPE_BIG; } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - return state.get(SMALL) ? Collections.singletonList(new ItemStack(EndBlocks.CAVE_PUMPKIN_SEED)) : Collections.singletonList(new ItemStack(this)); + public List getDrops(BlockState state, LootContext.Builder builder) { + return state.getValue(SMALL) ? Collections.singletonList(new ItemStack(EndBlocks.CAVE_PUMPKIN_SEED)) + : Collections.singletonList(new ItemStack(this)); } - + static { VoxelShape lantern = Block.createCuboidShape(1, 0, 1, 15, 13, 15); VoxelShape cap = Block.createCuboidShape(0, 12, 0, 16, 15, 16); VoxelShape top = Block.createCuboidShape(5, 15, 5, 11, 16, 11); SHAPE_BIG = VoxelShapes.union(lantern, cap, top); - + lantern = Block.createCuboidShape(1, 7, 1, 15, 13, 15); cap = Block.createCuboidShape(4, 12, 4, 12, 15, 12); top = Block.createCuboidShape(6, 15, 6, 10, 16, 10); diff --git a/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java b/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java index 732497db..9402a564 100644 --- a/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java +++ b/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java @@ -2,67 +2,70 @@ package ru.betterend.blocks; import java.util.Random; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.ShapeContext; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.AbstractBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; public class CavePumpkinVineBlock extends EndPlantWithAgeBlock { private static final VoxelShape SHAPE = Block.createCuboidShape(4, 0, 4, 12, 16, 12); - + @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { BlockState down = world.getBlockState(pos.up()); return isTerrain(down); } - + @Override - public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { - int age = state.get(AGE); - BlockState down = world.getBlockState(pos.down()); - if (down.getMaterial().isReplaceable() || (down.isOf(EndBlocks.CAVE_PUMPKIN) && down.get(BlockProperties.SMALL))) { + public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { + int age = state.getValue(AGE); + BlockState down = world.getBlockState(pos.below()); + if (down.getMaterial().isReplaceable() + || (down.is(EndBlocks.CAVE_PUMPKIN) && down.get(BlockProperties.SMALL))) { if (age < 3) { - world.setBlockState(pos, state.with(AGE, age + 1)); + world.setBlockAndUpdate(pos, state.with(AGE, age + 1)); } if (age == 2) { - world.setBlockState(pos.down(), EndBlocks.CAVE_PUMPKIN.getDefaultState().with(BlockProperties.SMALL, true)); - } - else if (age == 3) { - world.setBlockState(pos.down(), EndBlocks.CAVE_PUMPKIN.getDefaultState()); + world.setBlockAndUpdate(pos.below(), + EndBlocks.CAVE_PUMPKIN.defaultBlockState().with(BlockProperties.SMALL, true)); + } else if (age == 3) { + world.setBlockAndUpdate(pos.below(), EndBlocks.CAVE_PUMPKIN.defaultBlockState()); } } } @Override - public void growAdult(StructureWorldAccess world, Random random, BlockPos pos) {} - + public void growAdult(StructureWorldAccess world, Random random, BlockPos pos) { + } + @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { - state = super.getStateForNeighborUpdate(state, facing, neighborState, world, pos, neighborPos); - if (state.isOf(this) && state.get(BlockProperties.AGE) > 1) { - BlockState down = world.getBlockState(pos.down()); - if (!down.isOf(EndBlocks.CAVE_PUMPKIN)) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, + BlockPos pos, BlockPos neighborPos) { + state = super.updateShape(state, facing, neighborState, world, pos, neighborPos); + if (state.is(this) && state.getValue(BlockProperties.AGE) > 1) { + BlockState down = world.getBlockState(pos.below()); + if (!down.is(EndBlocks.CAVE_PUMPKIN)) { state = state.with(BlockProperties.AGE, 1); } } return state; } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { return SHAPE; } - + @Override public AbstractBlock.OffsetType getOffsetType() { return AbstractBlock.OffsetType.NONE; diff --git a/src/main/java/ru/betterend/blocks/ChandelierBlock.java b/src/main/java/ru/betterend/blocks/ChandelierBlock.java index aa711298..7f89ecb2 100644 --- a/src/main/java/ru/betterend/blocks/ChandelierBlock.java +++ b/src/main/java/ru/betterend/blocks/ChandelierBlock.java @@ -6,16 +6,16 @@ import java.util.EnumMap; import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.ShapeContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockView; +import net.minecraft.world.level.BlockGetter; import ru.betterend.blocks.basis.AttachedBlock; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; @@ -24,49 +24,46 @@ import ru.betterend.patterns.Patterns; public class ChandelierBlock extends AttachedBlock implements IRenderTypeable, BlockPatterned { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); - + public ChandelierBlock(Block source) { super(FabricBlockSettings.copyOf(source).noCollision().nonOpaque().requiresTool().luminance(15)); } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return BOUNDING_SHAPES.get(state.get(FACING)); + return BOUNDING_SHAPES.get(state.getValue(FACING)); } - + @Override public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); if (block.contains("item")) { return Patterns.createJson(Patterns.ITEM_GENERATED, "item/" + blockId.getPath()); - } - else if (block.contains("ceil")) { + } else if (block.contains("ceil")) { return Patterns.createJson(Patterns.BLOCK_CHANDELIER_CEIL, blockId.getPath()); - } - else if (block.contains("wall")) { + } else if (block.contains("wall")) { return Patterns.createJson(Patterns.BLOCK_CHANDELIER_WALL, blockId.getPath()); - } - else { + } else { return Patterns.createJson(Patterns.BLOCK_CHANDELIER_FLOOR, blockId.getPath()); } } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_CHANDELIER; } - + static { BOUNDING_SHAPES.put(Direction.UP, Block.createCuboidShape(5, 0, 5, 11, 13, 11)); BOUNDING_SHAPES.put(Direction.DOWN, Block.createCuboidShape(5, 3, 5, 11, 16, 11)); diff --git a/src/main/java/ru/betterend/blocks/CharcoalBlock.java b/src/main/java/ru/betterend/blocks/CharcoalBlock.java index 8f82f792..f9878f5e 100644 --- a/src/main/java/ru/betterend/blocks/CharcoalBlock.java +++ b/src/main/java/ru/betterend/blocks/CharcoalBlock.java @@ -2,7 +2,7 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.registry.FuelRegistry; -import net.minecraft.block.Blocks; +import net.minecraft.world.level.block.Blocks; import ru.betterend.blocks.basis.BlockBase; public class CharcoalBlock extends BlockBase { diff --git a/src/main/java/ru/betterend/blocks/CharniaBlock.java b/src/main/java/ru/betterend/blocks/CharniaBlock.java index e1162d4b..d6279ce6 100644 --- a/src/main/java/ru/betterend/blocks/CharniaBlock.java +++ b/src/main/java/ru/betterend/blocks/CharniaBlock.java @@ -1,15 +1,16 @@ package ru.betterend.blocks; -import net.minecraft.block.BlockState; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.fluid.Fluids; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.WorldView; import ru.betterend.blocks.basis.UnderwaterPlantBlock; public class CharniaBlock extends UnderwaterPlantBlock { @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return sideCoversSmallSquare(world, pos.down(), Direction.UP) && world.getFluidState(pos).getFluid() == Fluids.WATER; + return sideCoversSmallSquare(world, pos.below(), Direction.UP) + && world.getFluidState(pos).getFluid() == Fluids.WATER; } } diff --git a/src/main/java/ru/betterend/blocks/ChorusGrassBlock.java b/src/main/java/ru/betterend/blocks/ChorusGrassBlock.java index 2b603a45..66bb0d7d 100644 --- a/src/main/java/ru/betterend/blocks/ChorusGrassBlock.java +++ b/src/main/java/ru/betterend/blocks/ChorusGrassBlock.java @@ -1,6 +1,6 @@ package ru.betterend.blocks; -import net.minecraft.block.BlockState; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; @@ -8,7 +8,7 @@ public class ChorusGrassBlock extends EndPlantBlock { public ChorusGrassBlock() { super(true); } - + @Override protected boolean isTerrain(BlockState state) { return state.getBlock() == EndBlocks.CHORUS_NYLIUM; diff --git a/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java index 48c1059a..43a13c76 100644 --- a/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java +++ b/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java @@ -1,7 +1,7 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Blocks; +import net.minecraft.world.level.block.Blocks; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; diff --git a/src/main/java/ru/betterend/blocks/DenseSnowBlock.java b/src/main/java/ru/betterend/blocks/DenseSnowBlock.java index d0c9ecf6..f369dd2a 100644 --- a/src/main/java/ru/betterend/blocks/DenseSnowBlock.java +++ b/src/main/java/ru/betterend/blocks/DenseSnowBlock.java @@ -1,12 +1,12 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Material; -import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.SoundType; import ru.betterend.blocks.basis.BlockBase; public class DenseSnowBlock extends BlockBase { public DenseSnowBlock() { - super(FabricBlockSettings.of(Material.SNOW_BLOCK).strength(0.2F).sounds(BlockSoundGroup.SNOW)); + super(FabricBlockSettings.of(Material.SNOW_BLOCK).strength(0.2F).sounds(SoundType.SNOW)); } } diff --git a/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java b/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java index 5fdd924e..258f1733 100644 --- a/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java @@ -1,7 +1,7 @@ package ru.betterend.blocks; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; import net.minecraft.world.WorldView; import net.minecraft.world.gen.feature.Feature; import ru.betterend.blocks.basis.FeatureSaplingBlock; @@ -17,9 +17,9 @@ public class DragonTreeSaplingBlock extends FeatureSaplingBlock { protected Feature getFeature() { return EndFeatures.DRAGON_TREE.getFeature(); } - + @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return world.getBlockState(pos.down()).isOf(EndBlocks.SHADOW_GRASS); + return world.getBlockState(pos.below()).is(EndBlocks.SHADOW_GRASS); } } diff --git a/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java index ee96f6a1..f428f331 100644 --- a/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java +++ b/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java @@ -8,22 +8,22 @@ import java.util.Random; import org.jetbrains.annotations.Nullable; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; -import net.minecraft.block.TransparentBlock; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.TransparentBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; import net.minecraft.world.LightType; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.BlockPatterned; @@ -40,59 +40,59 @@ public class EmeraldIceBlock extends TransparentBlock implements IRenderTypeable } @Override - public void afterBreak(World world, PlayerEntity player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack stack) { + public void afterBreak(Level world, PlayerEntity player, BlockPos pos, BlockState state, + @Nullable BlockEntity blockEntity, ItemStack stack) { super.afterBreak(world, player, pos, state, blockEntity, stack); - if (EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, stack) == 0) { + if (EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, stack) == 0) { if (world.getDimension().isUltrawarm()) { world.removeBlock(pos, false); return; } - Material material = world.getBlockState(pos.down()).getMaterial(); + Material material = world.getBlockState(pos.below()).getMaterial(); if (material.blocksMovement() || material.isLiquid()) { - world.setBlockState(pos, Blocks.WATER.getDefaultState()); + world.setBlockAndUpdate(pos, Blocks.WATER.defaultBlockState()); } } } @Override - public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { if (world.getLightLevel(LightType.BLOCK, pos) > 11 - state.getOpacity(world, pos)) { this.melt(state, world, pos); } } - protected void melt(BlockState state, World world, BlockPos pos) { + protected void melt(BlockState state, Level world, BlockPos pos) { if (world.getDimension().isUltrawarm()) { world.removeBlock(pos, false); - } - else { - world.setBlockState(pos, Blocks.WATER.getDefaultState()); + } else { + world.setBlockAndUpdate(pos, Blocks.WATER.defaultBlockState()); world.updateNeighbor(pos, Blocks.WATER, pos); } } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { - String block = Registry.BLOCK.getId(this).getPath(); + String block = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, block, block); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(Patterns.BLOCK_BASE, blockId.getPath(), block); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_SIMPLE; } } diff --git a/src/main/java/ru/betterend/blocks/EndLilyBlock.java b/src/main/java/ru/betterend/blocks/EndLilyBlock.java index 6d43dd97..3d4a8ae7 100644 --- a/src/main/java/ru/betterend/blocks/EndLilyBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLilyBlock.java @@ -10,25 +10,25 @@ 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.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.ShapeContext; import net.minecraft.fluid.FluidState; import net.minecraft.fluid.Fluids; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.EnumProperty; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.util.math.Vec3d; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.UnderwaterPlantBlock; @@ -40,79 +40,78 @@ public class EndLilyBlock extends UnderwaterPlantBlock { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; private static final VoxelShape SHAPE_BOTTOM = Block.createCuboidShape(4, 0, 4, 12, 16, 12); private static final VoxelShape SHAPE_TOP = Block.createCuboidShape(2, 0, 2, 14, 6, 14); - + public EndLilyBlock() { - super(FabricBlockSettings.of(Material.UNDERWATER_PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.WET_GRASS) - .breakByHand(true) - .luminance((state) -> { return state.get(SHAPE) == TripleShape.TOP ? 13 : 0; }) - .noCollision()); + super(FabricBlockSettings.of(Material.UNDERWATER_PLANT).breakByTool(FabricToolTags.SHEARS) + .sounds(SoundType.WET_GRASS).breakByHand(true).luminance((state) -> { + return state.getValue(SHAPE) == TripleShape.TOP ? 13 : 0; + }).noCollision()); } - + @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, + BlockPos pos, BlockPos neighborPos) { if (!canPlaceAt(state, world, pos)) { - return state.get(SHAPE) == TripleShape.TOP ? Blocks.AIR.getDefaultState() : Blocks.WATER.getDefaultState(); - } - else { + return state.getValue(SHAPE) == TripleShape.TOP ? Blocks.AIR.defaultBlockState() + : Blocks.WATER.defaultBlockState(); + } else { return state; } } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { Vec3d vec3d = state.getModelOffset(view, pos); - VoxelShape shape = state.get(SHAPE) == TripleShape.TOP ? SHAPE_TOP : SHAPE_BOTTOM; + VoxelShape shape = state.getValue(SHAPE) == TripleShape.TOP ? SHAPE_TOP : SHAPE_BOTTOM; return shape.offset(vec3d.x, vec3d.y, vec3d.z); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE); } - + @Override public FluidState getFluidState(BlockState state) { - return state.get(SHAPE) == TripleShape.TOP ? Fluids.EMPTY.getDefaultState() : Fluids.WATER.getStill(false); + return state.getValue(SHAPE) == TripleShape.TOP ? Fluids.EMPTY.defaultBlockState() + : Fluids.WATER.getStill(false); } - + @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - if (state.get(SHAPE) == TripleShape.TOP) { - return world.getBlockState(pos.down()).getBlock() == this; - } - else if (state.get(SHAPE) == TripleShape.BOTTOM) { - return isTerrain(world.getBlockState(pos.down())); - } - else { + if (state.getValue(SHAPE) == TripleShape.TOP) { + return world.getBlockState(pos.below()).getBlock() == this; + } else if (state.getValue(SHAPE) == TripleShape.BOTTOM) { + return isTerrain(world.getBlockState(pos.below())); + } else { BlockState up = world.getBlockState(pos.up()); - BlockState down = world.getBlockState(pos.down()); + BlockState down = world.getBlockState(pos.below()); return up.getBlock() == this && down.getBlock() == this; } } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - if (state.get(SHAPE) == TripleShape.TOP) { - return Lists.newArrayList(new ItemStack(EndItems.END_LILY_LEAF, MHelper.randRange(1, 2, MHelper.RANDOM)), new ItemStack(EndBlocks.END_LILY_SEED, MHelper.randRange(1, 2, MHelper.RANDOM))); + public List getDrops(BlockState state, LootContext.Builder builder) { + if (state.getValue(SHAPE) == TripleShape.TOP) { + return Lists.newArrayList(new ItemStack(EndItems.END_LILY_LEAF, MHelper.randRange(1, 2, MHelper.RANDOM)), + new ItemStack(EndBlocks.END_LILY_SEED, MHelper.randRange(1, 2, MHelper.RANDOM))); } return Collections.emptyList(); } - + @Override @Environment(EnvType.CLIENT) public ItemStack getPickStack(BlockView world, BlockPos pos, BlockState state) { return new ItemStack(EndBlocks.END_LILY_SEED); } - + @Override public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { return false; } @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { + public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { return false; } } diff --git a/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java b/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java index 05226df8..86173da4 100644 --- a/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java @@ -3,7 +3,7 @@ package ru.betterend.blocks; import java.util.Random; import net.minecraft.fluid.Fluids; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.UnderwaterPlantWithAgeBlock; @@ -14,16 +14,19 @@ public class EndLilySeedBlock extends UnderwaterPlantWithAgeBlock { @Override public void grow(StructureWorldAccess world, Random random, BlockPos pos) { if (canGrow(world, pos)) { - BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.END_LILY.getDefaultState().with(EndLilyBlock.SHAPE, TripleShape.BOTTOM)); + BlocksHelper.setWithoutUpdate(world, pos, + EndBlocks.END_LILY.defaultBlockState().with(EndLilyBlock.SHAPE, TripleShape.BOTTOM)); BlockPos up = pos.up(); while (world.getFluidState(up).isStill()) { - BlocksHelper.setWithoutUpdate(world, up, EndBlocks.END_LILY.getDefaultState().with(EndLilyBlock.SHAPE, TripleShape.MIDDLE)); + BlocksHelper.setWithoutUpdate(world, up, + EndBlocks.END_LILY.defaultBlockState().with(EndLilyBlock.SHAPE, TripleShape.MIDDLE)); up = up.up(); } - BlocksHelper.setWithoutUpdate(world, up, EndBlocks.END_LILY.getDefaultState().with(EndLilyBlock.SHAPE, TripleShape.TOP)); + BlocksHelper.setWithoutUpdate(world, up, + EndBlocks.END_LILY.defaultBlockState().with(EndLilyBlock.SHAPE, TripleShape.TOP)); } } - + private boolean canGrow(StructureWorldAccess world, BlockPos pos) { BlockPos up = pos.up(); while (world.getBlockState(up).getFluidState().getFluid().equals(Fluids.WATER.getStill())) { diff --git a/src/main/java/ru/betterend/blocks/EndLotusFlowerBlock.java b/src/main/java/ru/betterend/blocks/EndLotusFlowerBlock.java index 8222111e..71f36555 100644 --- a/src/main/java/ru/betterend/blocks/EndLotusFlowerBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLotusFlowerBlock.java @@ -7,16 +7,16 @@ 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.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.AbstractBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.core.BlockPos; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; +import net.minecraft.world.level.BlockGetter; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; @@ -24,37 +24,37 @@ import ru.betterend.util.MHelper; public class EndLotusFlowerBlock extends EndPlantBlock { private static final VoxelShape SHAPE_OUTLINE = Block.createCuboidShape(2, 0, 2, 14, 14, 14); private static final VoxelShape SHAPE_COLLISION = Block.createCuboidShape(0, 0, 0, 16, 2, 16); - + public EndLotusFlowerBlock() { super(FabricBlockSettings.of(Material.PLANT).nonOpaque().luminance(15)); } - + @Override protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.END_LOTUS_STEM); + return state.is(EndBlocks.END_LOTUS_STEM); } - + @Override public AbstractBlock.OffsetType getOffsetType() { return AbstractBlock.OffsetType.NONE; } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { return SHAPE_OUTLINE; } - + @Override public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { return SHAPE_COLLISION; } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { int count = MHelper.randRange(1, 2, MHelper.RANDOM); return Lists.newArrayList(new ItemStack(EndBlocks.END_LOTUS_SEED, count)); } - + @Override @Environment(EnvType.CLIENT) public ItemStack getPickStack(BlockView world, BlockPos pos, BlockState state) { diff --git a/src/main/java/ru/betterend/blocks/EndLotusLeafBlock.java b/src/main/java/ru/betterend/blocks/EndLotusLeafBlock.java index cb15f1e5..4cf66025 100644 --- a/src/main/java/ru/betterend/blocks/EndLotusLeafBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLotusLeafBlock.java @@ -3,22 +3,22 @@ package ru.betterend.blocks; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.ShapeContext; import net.minecraft.fluid.WaterFluid; -import net.minecraft.item.ItemStack; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.EnumProperty; import net.minecraft.state.property.Properties; import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.BlockBaseNotFull; @@ -31,29 +31,29 @@ public class EndLotusLeafBlock extends BlockBaseNotFull implements IRenderTypeab public static final EnumProperty HORIZONTAL_FACING = Properties.HORIZONTAL_FACING; public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; private static final VoxelShape VSHAPE = Block.createCuboidShape(0, 0, 0, 16, 1, 16); - + public EndLotusLeafBlock() { - super(FabricBlockSettings.of(Material.PLANT).nonOpaque().sounds(BlockSoundGroup.WET_GRASS)); + super(FabricBlockSettings.of(Material.PLANT).nonOpaque().sounds(SoundType.WET_GRASS)); } - + @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - BlockState down = world.getBlockState(pos.down()); + BlockState down = world.getBlockState(pos.below()); return !down.getFluidState().isEmpty() && down.getFluidState().getFluid() instanceof WaterFluid; } - + @Override - protected void appendProperties(StateManager.Builder builder) { + protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(SHAPE, HORIZONTAL_FACING); } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { return VSHAPE; } - + @Override - public BlockState rotate(BlockState state, BlockRotation rotation) { + public BlockState rotate(BlockState state, Rotation rotation) { return BlocksHelper.rotateHorizontal(state, rotation, HORIZONTAL_FACING); } @@ -61,12 +61,12 @@ public class EndLotusLeafBlock extends BlockBaseNotFull implements IRenderTypeab public BlockState mirror(BlockState state, BlockMirror mirror) { return BlocksHelper.mirrorHorizontal(state, mirror, HORIZONTAL_FACING); } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override @Environment(EnvType.CLIENT) public ItemStack getPickStack(BlockView world, BlockPos pos, BlockState state) { diff --git a/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java b/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java index ce8fc56a..ebcfd741 100644 --- a/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java @@ -2,11 +2,11 @@ package ru.betterend.blocks; import java.util.Random; -import net.minecraft.block.BlockState; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.fluid.Fluids; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.UnderwaterPlantWithAgeBlock; @@ -17,31 +17,32 @@ public class EndLotusSeedBlock extends UnderwaterPlantWithAgeBlock { @Override public void grow(StructureWorldAccess world, Random random, BlockPos pos) { if (canGrow(world, pos)) { - BlockState startLeaf = EndBlocks.END_LOTUS_STEM.getDefaultState().with(EndLotusStemBlock.LEAF, true); - BlockState roots = EndBlocks.END_LOTUS_STEM.getDefaultState().with(EndLotusStemBlock.SHAPE, TripleShape.BOTTOM).with(EndLotusStemBlock.WATERLOGGED, true); - BlockState stem = EndBlocks.END_LOTUS_STEM.getDefaultState(); - BlockState flower = EndBlocks.END_LOTUS_FLOWER.getDefaultState(); - + BlockState startLeaf = EndBlocks.END_LOTUS_STEM.defaultBlockState().with(EndLotusStemBlock.LEAF, true); + BlockState roots = EndBlocks.END_LOTUS_STEM.defaultBlockState() + .with(EndLotusStemBlock.SHAPE, TripleShape.BOTTOM).with(EndLotusStemBlock.WATERLOGGED, true); + BlockState stem = EndBlocks.END_LOTUS_STEM.defaultBlockState(); + BlockState flower = EndBlocks.END_LOTUS_FLOWER.defaultBlockState(); + BlocksHelper.setWithoutUpdate(world, pos, roots); - Mutable bpos = new Mutable().set(pos); + MutableBlockPos bpos = new MutableBlockPos().set(pos); bpos.setY(bpos.getY() + 1); while (world.getFluidState(bpos).isStill()) { BlocksHelper.setWithoutUpdate(world, bpos, stem.with(EndLotusStemBlock.WATERLOGGED, true)); bpos.setY(bpos.getY() + 1); } - + int height = random.nextBoolean() ? 0 : random.nextBoolean() ? 1 : random.nextBoolean() ? 1 : -1; TripleShape shape = (height == 0) ? TripleShape.TOP : TripleShape.MIDDLE; Direction dir = BlocksHelper.randomHorizontal(random); BlockPos leafCenter = bpos.toImmutable().offset(dir); if (hasLeaf(world, leafCenter)) { generateLeaf(world, leafCenter); - BlocksHelper.setWithoutUpdate(world, bpos, startLeaf.with(EndLotusStemBlock.SHAPE, shape).with(EndLotusStemBlock.FACING, dir)); - } - else { + BlocksHelper.setWithoutUpdate(world, bpos, + startLeaf.with(EndLotusStemBlock.SHAPE, shape).with(EndLotusStemBlock.FACING, dir)); + } else { BlocksHelper.setWithoutUpdate(world, bpos, stem.with(EndLotusStemBlock.SHAPE, shape)); } - + bpos.setY(bpos.getY() + 1); for (int i = 1; i <= height; i++) { if (!world.isAir(bpos)) { @@ -55,62 +56,64 @@ public class EndLotusSeedBlock extends UnderwaterPlantWithAgeBlock { BlocksHelper.setWithoutUpdate(world, bpos, stem); bpos.setY(bpos.getY() + 1); } - + if (!world.isAir(bpos) || height < 0) { bpos.setY(bpos.getY() - 1); } - + BlocksHelper.setWithoutUpdate(world, bpos, flower); bpos.setY(bpos.getY() - 1); stem = world.getBlockState(bpos); - if (!stem.isOf(EndBlocks.END_LOTUS_STEM)) { - stem = EndBlocks.END_LOTUS_STEM.getDefaultState(); + if (!stem.is(EndBlocks.END_LOTUS_STEM)) { + stem = EndBlocks.END_LOTUS_STEM.defaultBlockState(); if (!world.getBlockState(bpos.north()).getFluidState().isEmpty()) { stem = stem.with(EndLotusStemBlock.WATERLOGGED, true); } } - - if (world.getBlockState(bpos.offset(dir)).isOf(EndBlocks.END_LOTUS_LEAF)) { + + if (world.getBlockState(bpos.offset(dir)).is(EndBlocks.END_LOTUS_LEAF)) { stem = stem.with(EndLotusStemBlock.LEAF, true).with(EndLotusStemBlock.FACING, dir); } - + BlocksHelper.setWithoutUpdate(world, bpos, stem.with(EndLotusStemBlock.SHAPE, TripleShape.TOP)); } } - + private boolean canGrow(StructureWorldAccess world, BlockPos pos) { - Mutable bpos = new Mutable(); + MutableBlockPos bpos = new MutableBlockPos(); bpos.set(pos); while (world.getBlockState(bpos).getFluidState().getFluid().equals(Fluids.WATER.getStill())) { bpos.setY(bpos.getY() + 1); } return world.isAir(bpos) && world.isAir(bpos.up()); } - + private void generateLeaf(StructureWorldAccess world, BlockPos pos) { - Mutable p = new Mutable(); - BlockState leaf = EndBlocks.END_LOTUS_LEAF.getDefaultState(); + MutableBlockPos p = new MutableBlockPos(); + BlockState leaf = EndBlocks.END_LOTUS_LEAF.defaultBlockState(); BlocksHelper.setWithoutUpdate(world, pos, leaf.with(EndLotusLeafBlock.SHAPE, TripleShape.BOTTOM)); - for (Direction move: BlocksHelper.HORIZONTAL) { - BlocksHelper.setWithoutUpdate(world, p.set(pos).move(move), leaf.with(EndLotusLeafBlock.HORIZONTAL_FACING, move).with(EndLotusLeafBlock.SHAPE, TripleShape.MIDDLE)); + for (Direction move : BlocksHelper.HORIZONTAL) { + BlocksHelper.setWithoutUpdate(world, p.set(pos).move(move), leaf + .with(EndLotusLeafBlock.HORIZONTAL_FACING, move).with(EndLotusLeafBlock.SHAPE, TripleShape.MIDDLE)); } - for (int i = 0; i < 4; i ++) { + for (int i = 0; i < 4; i++) { Direction d1 = BlocksHelper.HORIZONTAL[i]; Direction d2 = BlocksHelper.HORIZONTAL[(i + 1) & 3]; - BlocksHelper.setWithoutUpdate(world, p.set(pos).move(d1).move(d2), leaf.with(EndLotusLeafBlock.HORIZONTAL_FACING, d1).with(EndLotusLeafBlock.SHAPE, TripleShape.TOP)); + BlocksHelper.setWithoutUpdate(world, p.set(pos).move(d1).move(d2), + leaf.with(EndLotusLeafBlock.HORIZONTAL_FACING, d1).with(EndLotusLeafBlock.SHAPE, TripleShape.TOP)); } } - + private boolean hasLeaf(StructureWorldAccess world, BlockPos pos) { - Mutable p = new Mutable(); + MutableBlockPos p = new MutableBlockPos(); p.setY(pos.getY()); int count = 0; - for (int x = -1; x < 2; x ++) { + for (int x = -1; x < 2; x++) { p.setX(pos.getX() + x); - for (int z = -1; z < 2; z ++) { + for (int z = -1; z < 2; z++) { p.setZ(pos.getZ() + z); - if (world.isAir(p) && !world.getFluidState(p.down()).isEmpty()) - count ++; + if (world.isAir(p) && !world.getFluidState(p.below()).isEmpty()) + count++; } } return count == 9; diff --git a/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java b/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java index 33a8d215..89506156 100644 --- a/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java @@ -5,26 +5,26 @@ import java.util.Map; import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.Waterloggable; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.level.block.Waterloggable; import net.minecraft.fluid.FluidState; import net.minecraft.fluid.Fluids; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.state.StateManager; +import net.minecraft.world.item.ItemPlacementContext; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.BooleanProperty; import net.minecraft.state.property.EnumProperty; import net.minecraft.state.property.Properties; import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Direction.Axis; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.client.render.ERenderLayer; @@ -37,36 +37,39 @@ public class EndLotusStemBlock extends BlockBase implements Waterloggable, IRend public static final BooleanProperty LEAF = BooleanProperty.of("leaf"); public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; private static final Map SHAPES = Maps.newEnumMap(Axis.class); - + public EndLotusStemBlock() { super(FabricBlockSettings.copyOf(Blocks.OAK_PLANKS)); - this.setDefaultState(getDefaultState().with(WATERLOGGED, false).with(SHAPE, TripleShape.MIDDLE).with(LEAF, false).with(FACING, Direction.UP)); + this.setDefaultState(getDefaultState().with(WATERLOGGED, false).with(SHAPE, TripleShape.MIDDLE) + .with(LEAF, false).with(FACING, Direction.UP)); } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return state.get(LEAF) ? SHAPES.get(Axis.Y) : SHAPES.get(state.get(FACING).getAxis()); + return state.getValue(LEAF) ? SHAPES.get(Axis.Y) : SHAPES.get(state.getValue(FACING).getAxis()); } - + @Override - protected void appendProperties(StateManager.Builder builder) { + protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(FACING, WATERLOGGED, SHAPE, LEAF); } - + @Override public FluidState getFluidState(BlockState state) { - return (Boolean) state.get(WATERLOGGED) ? Fluids.WATER.getStill(false) : super.getFluidState(state); + return (Boolean) state.getValue(WATERLOGGED) ? Fluids.WATER.getStill(false) : super.getFluidState(state); } @Override public BlockState getPlacementState(ItemPlacementContext ctx) { - WorldAccess worldAccess = ctx.getWorld(); + LevelAccessor worldAccess = ctx.getLevel(); BlockPos blockPos = ctx.getBlockPos(); - return this.getDefaultState().with(WATERLOGGED, worldAccess.getFluidState(blockPos).getFluid() == Fluids.WATER).with(FACING, ctx.getSide()); + return this.defaultBlockState() + .with(WATERLOGGED, worldAccess.getFluidState(blockPos).getFluid() == Fluids.WATER) + .with(FACING, ctx.getSide()); } - + @Override - public BlockState rotate(BlockState state, BlockRotation rotation) { + public BlockState rotate(BlockState state, Rotation rotation) { return BlocksHelper.rotateHorizontal(state, rotation, FACING); } @@ -76,18 +79,19 @@ public class EndLotusStemBlock extends BlockBase implements Waterloggable, IRend } @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState newState, WorldAccess world, BlockPos pos, BlockPos posFrom) { - if ((Boolean) state.get(WATERLOGGED)) { + public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, + BlockPos pos, BlockPos posFrom) { + if ((Boolean) state.getValue(WATERLOGGED)) { world.getFluidTickScheduler().schedule(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); } return state; } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + static { SHAPES.put(Axis.X, Block.createCuboidShape(0, 6, 6, 16, 10, 10)); SHAPES.put(Axis.Y, Block.createCuboidShape(6, 0, 6, 10, 16, 10)); diff --git a/src/main/java/ru/betterend/blocks/EndPathBlock.java b/src/main/java/ru/betterend/blocks/EndPathBlock.java index 5d4534d9..5381aa6c 100644 --- a/src/main/java/ru/betterend/blocks/EndPathBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPathBlock.java @@ -7,64 +7,66 @@ import java.util.Map; import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.ShapeContext; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; +import net.minecraft.world.level.BlockGetter; import ru.betterend.blocks.basis.BlockBaseNotFull; import ru.betterend.patterns.Patterns; public class EndPathBlock extends BlockBaseNotFull { private static final VoxelShape SHAPE = Block.createCuboidShape(0, 0, 0, 16, 15, 16); - + public EndPathBlock(Block source) { - super(FabricBlockSettings.copyOf(source).allowsSpawning((state, world, pos, type) -> { return false; })); + super(FabricBlockSettings.copyOf(source).allowsSpawning((state, world, pos, type) -> { + return false; + })); if (source instanceof EndTerrainBlock) { EndTerrainBlock terrain = (EndTerrainBlock) source; terrain.setPathBlock(this); } } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Collections.singletonList(new ItemStack(this)); } return Collections.singletonList(new ItemStack(Blocks.END_STONE)); } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { return SHAPE; } - + @Override public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { return SHAPE; } - + @Override public String getModelPattern(String block) { - String name = Registry.BLOCK.getId(this).getPath(); + String name = Registry.BLOCK.getKey(this).getPath(); Map map = Maps.newHashMap(); map.put("%top%", name + "_top"); map.put("%side%", name.replace("_path", "") + "_side"); return Patterns.createJson(Patterns.BLOCK_PATH, map); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_ROTATED_TOP; } } diff --git a/src/main/java/ru/betterend/blocks/EndPedestal.java b/src/main/java/ru/betterend/blocks/EndPedestal.java index e46e154f..8a157ba4 100644 --- a/src/main/java/ru/betterend/blocks/EndPedestal.java +++ b/src/main/java/ru/betterend/blocks/EndPedestal.java @@ -3,9 +3,9 @@ package ru.betterend.blocks; import java.util.HashMap; import java.util.Map; -import net.minecraft.block.Block; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.BetterEnd; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.patterns.Patterns; @@ -15,15 +15,15 @@ public class EndPedestal extends PedestalBlock { public EndPedestal(Block parent) { super(parent); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(parent); String name = blockId.getPath(); Map textures = new HashMap() { private static final long serialVersionUID = 1L; { - put("%mod%", BetterEnd.MOD_ID ); + put("%mod%", BetterEnd.MOD_ID); put("%top%", name + "_polished"); put("%base%", name + "_polished"); put("%pillar%", name + "_pillar_side"); diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index 8c39d171..dfed2978 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -6,30 +6,30 @@ import java.util.Random; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.NetherPortalBlock; -import net.minecraft.client.color.block.BlockColorProvider; -import net.minecraft.client.color.item.ItemColorProvider; -import net.minecraft.entity.Entity; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.NetherPortalBlock; +import net.minecraft.client.color.block.BlockColor; +import net.minecraft.client.color.item.ItemColor; +import net.minecraft.world.entity.Entity; import net.minecraft.server.MinecraftServer; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.IntProperty; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Direction.Axis; -import net.minecraft.util.math.Direction.AxisDirection; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction.Axis; +import net.minecraft.core.Direction.AxisDirection; +import net.minecraft.world.level.dimension.DimensionType; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IColorProvider; import ru.betterend.interfaces.IRenderTypeable; @@ -39,30 +39,32 @@ import ru.betterend.registry.EndPortals; import ru.betterend.rituals.EternalRitual; public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable, IColorProvider { - public static final IntProperty PORTAL = BlockProperties.PORTAL; + public static final IntegerProperty PORTAL = BlockProperties.PORTAL; public EndPortalBlock() { - super(FabricBlockSettings.copyOf(Blocks.NETHER_PORTAL).resistance(Blocks.BEDROCK.getBlastResistance()).luminance(15)); + super(FabricBlockSettings.copyOf(Blocks.NETHER_PORTAL).resistance(Blocks.BEDROCK.getExplosionResistance()) + .luminance(15)); } @Override - protected void appendProperties(StateManager.Builder builder) { - super.appendProperties(builder); + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); builder.add(PORTAL); } - + @Override @Environment(EnvType.CLIENT) - public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { + public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { if (random.nextInt(100) == 0) { - world.playSound(pos.getX() + 0.5D, pos.getY() + 0.5D, pos.getZ() + 0.5D, SoundEvents.BLOCK_PORTAL_AMBIENT, SoundCategory.BLOCKS, 0.5F, random.nextFloat() * 0.4F + 0.8F, false); + world.playLocalSound(pos.getX() + 0.5D, pos.getY() + 0.5D, pos.getZ() + 0.5D, SoundEvents.PORTAL_AMBIENT, + SoundSource.BLOCKS, 0.5F, random.nextFloat() * 0.4F + 0.8F, false); } double x = pos.getX() + random.nextDouble(); double y = pos.getY() + random.nextDouble(); double z = pos.getZ() + random.nextDouble(); int k = random.nextInt(2) * 2 - 1; - if (!world.getBlockState(pos.west()).isOf(this) && !world.getBlockState(pos.east()).isOf(this)) { + if (!world.getBlockState(pos.west()).is(this) && !world.getBlockState(pos.east()).is(this)) { x = pos.getX() + 0.5D + 0.25D * k; } else { z = pos.getZ() + 0.5D + 0.25D * k; @@ -72,121 +74,127 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable } @Override - public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) {} - - @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState newState, WorldAccess world, BlockPos pos, BlockPos posFrom) { + public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, + BlockPos pos, BlockPos posFrom) { return state; } - + @Override - public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) { - if (world.isClient || !validate(entity)) return; - entity.resetNetherPortalCooldown(); - ServerWorld currentWorld = (ServerWorld) world; + public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { + if (world.isClientSide() || !validate(entity)) + return; + entity.setPortalCooldown(); + ServerLevel currentWorld = (ServerLevel) world; MinecraftServer server = currentWorld.getServer(); - ServerWorld targetWorld = EndPortals.getWorld(server, state.get(PORTAL)); - boolean isInEnd = currentWorld.getRegistryKey().equals(World.END); - ServerWorld destination = isInEnd ? targetWorld : server.getWorld(World.END); + ServerLevel targetWorld = EndPortals.getLevel(server, state.getValue(PORTAL)); + boolean isInEnd = currentWorld.dimension().equals(Level.END); + ServerLevel destination = isInEnd ? targetWorld : server.getLevel(Level.END); BlockPos exitPos = findExitPos(currentWorld, destination, pos, entity); - if (exitPos == null) return; - if (entity instanceof ServerPlayerEntity) { - ServerPlayerEntity player = (ServerPlayerEntity) entity; + if (exitPos == null) + return; + if (entity instanceof ServerPlayer) { + ServerPlayer player = (ServerPlayer) entity; teleportPlayer(player, destination, exitPos); } else { TeleportingEntity teleEntity = (TeleportingEntity) entity; teleEntity.beSetExitPos(exitPos); - Entity teleported = entity.moveToWorld(destination); + Entity teleported = entity.changeDimension(destination); if (teleported != null) { - teleported.resetNetherPortalCooldown(); + teleported.setPortalCooldown(); } } } private boolean validate(Entity entity) { - return !entity.hasVehicle() && !entity.hasPassengers() && - entity.canUsePortals() && !entity.hasNetherPortalCooldown(); + return !entity.isPassenger() && !entity.isVehicle() && entity.canChangeDimensions() + && !entity.isOnPortalCooldown(); } - private void teleportPlayer(ServerPlayerEntity player, ServerWorld destination, BlockPos exitPos) { + private void teleportPlayer(ServerPlayer player, ServerLevel destination, BlockPos exitPos) { if (player.isCreative()) { - player.teleport(destination, exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5, player.yaw, player.pitch); + player.teleportTo(destination, exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5, player.yRot, + player.xRot); } else { TeleportingEntity teleEntity = (TeleportingEntity) player; teleEntity.beSetExitPos(exitPos); - player.moveToWorld(destination); + player.changeDimension(destination); } } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.TRANSLUCENT; } - - private BlockPos findExitPos(ServerWorld currentWorld, ServerWorld targetWorld, BlockPos currentPos, Entity entity) { - if (targetWorld == null) return null; - Registry registry = targetWorld.getRegistryManager().getDimensionTypes(); - Identifier targetWorldId = targetWorld.getRegistryKey().getValue(); - Identifier currentWorldId = currentWorld.getRegistryKey().getValue(); - double targetMultiplier = Objects.requireNonNull(registry.get(targetWorldId)).getCoordinateScale(); - double currentMultiplier = Objects.requireNonNull(registry.get(currentWorldId)).getCoordinateScale(); + + private BlockPos findExitPos(ServerLevel currentWorld, ServerLevel targetWorld, BlockPos currentPos, + Entity entity) { + if (targetWorld == null) + return null; + Registry registry = targetWorld.registryAccess().dimensionTypes(); + ResourceLocation targetWorldId = targetWorld.dimension().location(); + ResourceLocation currentWorldId = currentWorld.dimension().location(); + double targetMultiplier = Objects.requireNonNull(registry.get(targetWorldId)).coordinateScale(); + double currentMultiplier = Objects.requireNonNull(registry.get(currentWorldId)).coordinateScale(); double multiplier = targetMultiplier > currentMultiplier ? 1.0 / targetMultiplier : currentMultiplier; - BlockPos.Mutable basePos = currentPos.mutableCopy().set(currentPos.getX() * multiplier, currentPos.getY(), currentPos.getZ() * multiplier); - BlockPos.Mutable checkPos = basePos.mutableCopy(); + BlockPos.MutableBlockPos basePos = currentPos.mutable().set(currentPos.getX() * multiplier, currentPos.getY(), + currentPos.getZ() * multiplier); + BlockPos.MutableBlockPos checkPos = basePos.mutable(); BlockState currentState = currentWorld.getBlockState(currentPos); int radius = (EternalRitual.SEARCH_RADIUS >> 4) + 1; - checkPos = EternalRitual.findBlockPos(targetWorld, checkPos, radius, this, state -> state.isOf(this) && - state.get(PORTAL).equals(currentState.get(PORTAL))); + checkPos = EternalRitual.findBlockPos(targetWorld, checkPos, radius, this, + state -> state.is(this) && state.getValue(PORTAL).equals(currentState.getValue(PORTAL))); if (checkPos != null) { BlockState checkState = targetWorld.getBlockState(checkPos); - Axis axis = checkState.get(AXIS); + Axis axis = checkState.getValue(AXIS); checkPos = findCenter(targetWorld, checkPos, axis); - Direction frontDir = Direction.from(axis, AxisDirection.POSITIVE).rotateYClockwise(); - Direction entityDir = entity.getMovementDirection(); + Direction frontDir = Direction.fromAxisAndDirection(axis, AxisDirection.POSITIVE).getClockWise(); + Direction entityDir = entity.getMotionDirection(); if (entityDir.getAxis().isVertical()) { entityDir = frontDir; } if (frontDir != entityDir && frontDir.getOpposite() != entityDir) { - entity.applyRotation(BlockRotation.CLOCKWISE_90); - entityDir = entityDir.rotateYClockwise(); + entity.rotate(Rotation.CLOCKWISE_90); + entityDir = entityDir.getClockWise(); } - return checkPos.offset(entityDir); + return checkPos.move(entityDir); } return null; } - - private BlockPos.Mutable findCenter(World world, BlockPos.Mutable pos, Direction.Axis axis) { + + private BlockPos.MutableBlockPos findCenter(Level world, BlockPos.MutableBlockPos pos, Direction.Axis axis) { return findCenter(world, pos, axis, 1); } - - private BlockPos.Mutable findCenter(World world, BlockPos.Mutable pos, Direction.Axis axis, int step) { - if (step > 8) return pos; + + private BlockPos.MutableBlockPos findCenter(Level world, BlockPos.MutableBlockPos pos, Direction.Axis axis, + int step) { + if (step > 8) + return pos; BlockState right, left; Direction rightDir, leftDir; - rightDir = Direction.from(axis, AxisDirection.POSITIVE); + rightDir = Direction.fromAxisAndDirection(axis, AxisDirection.POSITIVE); leftDir = rightDir.getOpposite(); - right = world.getBlockState(pos.offset(rightDir)); - left = world.getBlockState(pos.offset(leftDir)); - BlockState down = world.getBlockState(pos.down()); - if (down.isOf(this)) { + right = world.getBlockState(pos.relative(rightDir)); + left = world.getBlockState(pos.relative(leftDir)); + BlockState down = world.getBlockState(pos.below()); + if (down.is(this)) { return findCenter(world, pos.move(Direction.DOWN), axis, step); - } else if (right.isOf(this) && left.isOf(this)) { + } else if (right.is(this) && left.is(this)) { return pos; - } else if (right.isOf(this)) { + } else if (right.is(this)) { return findCenter(world, pos.move(rightDir), axis, ++step); - } else if (left.isOf(this)) { + } else if (left.is(this)) { return findCenter(world, pos.move(leftDir), axis, ++step); } return pos; } @Override - public BlockColorProvider getProvider() { - return (state, world, pos, tintIndex) -> EndPortals.getColor(state.get(PORTAL)); + public BlockColor getBlockProvider() { + return (state, world, pos, tintIndex) -> EndPortals.getColor(state.getValue(PORTAL)); } @Override - public ItemColorProvider getItemProvider() { + public ItemColor getItemProvider() { return (stack, tintIndex) -> EndPortals.getColor(0); } } diff --git a/src/main/java/ru/betterend/blocks/EndStoneBlock.java b/src/main/java/ru/betterend/blocks/EndStoneBlock.java index 4bfa9cb4..ddc17d9f 100644 --- a/src/main/java/ru/betterend/blocks/EndStoneBlock.java +++ b/src/main/java/ru/betterend/blocks/EndStoneBlock.java @@ -1,13 +1,13 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Blocks; -import net.minecraft.block.MaterialColor; -import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.block.SoundType; import ru.betterend.blocks.basis.BlockBase; public class EndStoneBlock extends BlockBase { public EndStoneBlock(MaterialColor color) { - super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color).sounds(BlockSoundGroup.STONE)); + super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color).sounds(SoundType.STONE)); } } diff --git a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java index 53d03e42..9fb70e5a 100644 --- a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java +++ b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java @@ -8,36 +8,36 @@ 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.block.Block; -import net.minecraft.block.BlockRenderType; -import net.minecraft.block.BlockState; -import net.minecraft.block.HorizontalFacingBlock; -import net.minecraft.block.Material; -import net.minecraft.block.MaterialColor; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.particle.ParticleTypes; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.BlockRenderType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.HorizontalFacingBlock; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.item.ItemPlacementContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.core.particles.ParticleTypes; import net.minecraft.screen.ScreenHandler; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.state.StateManager; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.sounds.SoundSource; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.BooleanProperty; import net.minecraft.state.property.DirectionProperty; import net.minecraft.state.property.Properties; import net.minecraft.util.ActionResult; import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; +import net.minecraft.world.level.block.Rotation; import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; import ru.betterend.blocks.basis.BaseBlockWithEntity; import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; @@ -47,18 +47,14 @@ public class EndStoneSmelter extends BaseBlockWithEntity { public static final String ID = "end_stone_smelter"; public EndStoneSmelter() { - super(FabricBlockSettings.of(Material.STONE, MaterialColor.GRAY) - .hardness(4F) - .resistance(100F) - .requiresTool() - .sounds(BlockSoundGroup.STONE)); - this.setDefaultState(this.stateManager.getDefaultState() - .with(FACING, Direction.NORTH) - .with(LIT, false)); + super(FabricBlockSettings.of(Material.STONE, MaterialColor.COLOR_GRAY).hardness(4F).resistance(100F) + .requiresTool().sounds(SoundType.STONE)); + this.setDefaultState(this.stateManager.defaultBlockState().with(FACING, Direction.NORTH).with(LIT, false)); } - - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - if (world.isClient) { + + public ActionResult onUse(BlockState state, Level world, BlockPos pos, PlayerEntity player, Hand hand, + BlockHitResult hit) { + if (world.isClientSide) { return ActionResult.SUCCESS; } else { this.openScreen(world, pos, player); @@ -66,27 +62,27 @@ public class EndStoneSmelter extends BaseBlockWithEntity { } } - private void openScreen(World world, BlockPos pos, PlayerEntity player) { + private void openScreen(Level world, BlockPos pos, PlayerEntity player) { BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof EndStoneSmelterBlockEntity) { player.openHandledScreen((EndStoneSmelterBlockEntity) blockEntity); } } - + @Override public BlockState getPlacementState(ItemPlacementContext ctx) { - return this.getDefaultState().with(FACING, ctx.getPlayerFacing().getOpposite()); + return this.defaultBlockState().with(FACING, ctx.getPlayerFacing().getOpposite()); } - + @Override public BlockEntity createBlockEntity(BlockView world) { return new EndStoneSmelterBlockEntity(); } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { List drop = Lists.newArrayList(new ItemStack(this)); - BlockEntity blockEntity = builder.getNullable(LootContextParameters.BLOCK_ENTITY); + BlockEntity blockEntity = builder.getNullable(LootContextParams.BLOCK_ENTITY); if (blockEntity instanceof EndStoneSmelterBlockEntity) { EndStoneSmelterBlockEntity smelterBlockEntity = (EndStoneSmelterBlockEntity) blockEntity; for (int i = 0; i < smelterBlockEntity.size(); i++) { @@ -105,8 +101,8 @@ public class EndStoneSmelter extends BaseBlockWithEntity { } @Override - public int getComparatorOutput(BlockState state, World world, BlockPos pos) { - //TODO + public int getComparatorOutput(BlockState state, Level world, BlockPos pos) { + // TODO return ScreenHandler.calculateComparatorOutput(world.getBlockEntity(pos)); } @@ -116,31 +112,32 @@ public class EndStoneSmelter extends BaseBlockWithEntity { } @Override - public BlockState rotate(BlockState state, BlockRotation rotation) { - return (BlockState)state.with(FACING, rotation.rotate((Direction)state.get(FACING))); + public BlockState rotate(BlockState state, Rotation rotation) { + return (BlockState) state.with(FACING, rotation.rotate((Direction) state.getValue(FACING))); } @Override public BlockState mirror(BlockState state, BlockMirror mirror) { - return state.rotate(mirror.getRotation((Direction)state.get(FACING))); + return state.rotate(mirror.getRotation((Direction) state.getValue(FACING))); } @Override - protected void appendProperties(StateManager.Builder builder) { + protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(FACING, LIT); } - + @Environment(EnvType.CLIENT) - public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { - if (state.get(LIT)) { + public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { + if (state.getValue(LIT)) { double x = pos.getX() + 0.5D; double y = pos.getY(); double z = pos.getZ() + 0.5D; if (random.nextDouble() < 0.1D) { - world.playSound(x, y, z, SoundEvents.BLOCK_BLASTFURNACE_FIRE_CRACKLE, SoundCategory.BLOCKS, 1.0F, 1.0F, false); + world.playLocalSound(x, y, z, SoundEvents.BLOCK_BLASTFURNACE_FIRE_CRACKLE, SoundSource.BLOCKS, 1.0F, + 1.0F, false); } - Direction direction = (Direction)state.get(FACING); + Direction direction = (Direction) state.getValue(FACING); Direction.Axis axis = direction.getAxis(); double defOffset = random.nextDouble() * 0.6D - 0.3D; double offX = axis == Direction.Axis.X ? direction.getOffsetX() * 0.52D : defOffset; diff --git a/src/main/java/ru/betterend/blocks/EndTerrainBlock.java b/src/main/java/ru/betterend/blocks/EndTerrainBlock.java index 51c6a48f..6b98418e 100644 --- a/src/main/java/ru/betterend/blocks/EndTerrainBlock.java +++ b/src/main/java/ru/betterend/blocks/EndTerrainBlock.java @@ -9,29 +9,29 @@ import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.MaterialColor; -import net.minecraft.block.SnowBlock; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.block.SnowBlock; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; +import net.minecraft.sounds.SoundEvents; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; +import net.minecraft.world.level.Level; import net.minecraft.world.WorldView; import net.minecraft.world.chunk.light.ChunkLightProvider; import ru.betterend.blocks.basis.BlockBase; @@ -39,73 +39,74 @@ import ru.betterend.patterns.Patterns; public class EndTerrainBlock extends BlockBase { private Block pathBlock; - + public EndTerrainBlock(MaterialColor color) { - super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color).sounds(BlockSounds.TERRAIN_SOUND).ticksRandomly()); + super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color).sounds(BlockSounds.TERRAIN_SOUND) + .ticksRandomly()); } - + public void setPathBlock(Block roadBlock) { this.pathBlock = roadBlock; } - + @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + public ActionResult onUse(BlockState state, Level world, BlockPos pos, PlayerEntity player, Hand hand, + BlockHitResult hit) { if (pathBlock != null && player.getMainHandStack().getItem().isIn(FabricToolTags.SHOVELS)) { - world.playSound(player, pos, SoundEvents.ITEM_SHOVEL_FLATTEN, SoundCategory.BLOCKS, 1.0F, 1.0F); - if (!world.isClient) { - world.setBlockState(pos, pathBlock.getDefaultState()); + world.playLocalSound(player, pos, SoundEvents.ITEM_SHOVEL_FLATTEN, SoundSource.BLOCKS, 1.0F, 1.0F); + if (!world.isClientSide) { + world.setBlockAndUpdate(pos, pathBlock.defaultBlockState()); if (player != null && !player.isCreative()) { - player.getMainHandStack().damage(1, world.random, (ServerPlayerEntity) player); + player.getMainHandStack().damage(1, world.random, (ServerPlayer) player); } } return ActionResult.SUCCESS; } return ActionResult.FAIL; } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Collections.singletonList(new ItemStack(this)); } return Collections.singletonList(new ItemStack(Blocks.END_STONE)); } - + @Override - public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { if (random.nextInt(16) == 0 && !canSurvive(state, world, pos)) { - world.setBlockState(pos, Blocks.END_STONE.getDefaultState()); + world.setBlockAndUpdate(pos, Blocks.END_STONE.defaultBlockState()); } } - + protected boolean canSurvive(BlockState state, WorldView worldView, BlockPos pos) { BlockPos blockPos = pos.up(); BlockState blockState = worldView.getBlockState(blockPos); - if (blockState.isOf(Blocks.SNOW) && (Integer) blockState.get(SnowBlock.LAYERS) == 1) { + if (blockState.is(Blocks.SNOW) && (Integer) blockState.get(SnowBlock.LAYERS) == 1) { return true; - } - else if (blockState.getFluidState().getLevel() == 8) { + } else if (blockState.getFluidState().getLevel() == 8) { return false; - } - else { - int i = ChunkLightProvider.getRealisticOpacity(worldView, state, pos, blockState, blockPos, Direction.UP, blockState.getOpacity(worldView, blockPos)); + } else { + int i = ChunkLightProvider.getRealisticOpacity(worldView, state, pos, blockState, blockPos, Direction.UP, + blockState.getOpacity(worldView, blockPos)); return i < 5; } } - + @Override public String getModelPattern(String block) { - String name = Registry.BLOCK.getId(this).getPath(); + String name = Registry.BLOCK.getKey(this).getPath(); Map map = Maps.newHashMap(); map.put("%top%", "betterend:block/" + name + "_top"); map.put("%side%", "betterend:block/" + name + "_side"); map.put("%bottom%", "minecraft:block/end_stone"); return Patterns.createJson(Patterns.BLOCK_TOP_SIDE_BOTTOM, map); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_ROTATED_TOP; } } diff --git a/src/main/java/ru/betterend/blocks/EnderBlock.java b/src/main/java/ru/betterend/blocks/EnderBlock.java index 1b80fabd..3458aa07 100644 --- a/src/main/java/ru/betterend/blocks/EnderBlock.java +++ b/src/main/java/ru/betterend/blocks/EnderBlock.java @@ -3,22 +3,19 @@ package ru.betterend.blocks; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.block.MaterialColor; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; import ru.betterend.blocks.basis.BlockBase; public class EnderBlock extends BlockBase { public EnderBlock() { - super(FabricBlockSettings.of(Material.STONE, MaterialColor.field_25708) - .hardness(5F) - .resistance(6F) - .requiresTool() - .sounds(BlockSoundGroup.STONE)); + super(FabricBlockSettings.of(Material.STONE, MaterialColor.field_25708).hardness(5F).resistance(6F) + .requiresTool().sounds(SoundType.STONE)); } @Environment(EnvType.CLIENT) diff --git a/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java b/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java index 3dae7b77..51664204 100644 --- a/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java +++ b/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java @@ -7,27 +7,26 @@ 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.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.FallingBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.FallingBlock; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; import ru.betterend.util.MHelper; public class EndstoneDustBlock extends FallingBlock { @Environment(EnvType.CLIENT) private static final int COLOR = MHelper.color(226, 239, 168); - + public EndstoneDustBlock() { - super(FabricBlockSettings.copyOf(Blocks.SAND) - .breakByTool(FabricToolTags.SHOVELS) - .materialColor(Blocks.END_STONE.getDefaultMaterialColor())); + super(FabricBlockSettings.copyOf(Blocks.SAND).breakByTool(FabricToolTags.SHOVELS) + .materialColor(Blocks.END_STONE.defaultMaterialColor())); } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } diff --git a/src/main/java/ru/betterend/blocks/EternalPedestal.java b/src/main/java/ru/betterend/blocks/EternalPedestal.java index aad5bea7..3344dc76 100644 --- a/src/main/java/ru/betterend/blocks/EternalPedestal.java +++ b/src/main/java/ru/betterend/blocks/EternalPedestal.java @@ -4,23 +4,23 @@ import java.util.List; import com.google.common.collect.Lists; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.state.StateManager; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.BooleanProperty; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.explosion.Explosion; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.entities.EternalPedestalEntity; @@ -30,14 +30,14 @@ import ru.betterend.rituals.EternalRitual; public class EternalPedestal extends PedestalBlock { public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; - + public EternalPedestal() { super(EndBlocks.FLAVOLITE_RUNED_ETERNAL); this.setDefaultState(getDefaultState().with(ACTIVATED, false)); } - + @Override - public void checkRitual(World world, BlockPos pos) { + public void checkRitual(Level world, BlockPos pos) { BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof EternalPedestalEntity) { EternalPedestalEntity pedestal = (EternalPedestalEntity) blockEntity; @@ -46,7 +46,7 @@ public class EternalPedestal extends PedestalBlock { if (pedestal.hasRitual()) { EternalRitual ritual = pedestal.getRitual(); if (ritual.isActive()) { - Identifier targetWorld = ritual.getTargetWorldId(); + ResourceLocation targetWorld = ritual.getTargetWorldId(); int portalId; if (targetWorld != null) { portalId = EndPortals.getPortalIdByWorld(targetWorld); @@ -56,12 +56,12 @@ public class EternalPedestal extends PedestalBlock { ritual.disablePortal(portalId); } } - world.setBlockState(pos, updatedState.with(ACTIVATED, false).with(HAS_LIGHT, false)); + world.setBlockAndUpdate(pos, updatedState.with(ACTIVATED, false).with(HAS_LIGHT, false)); } else { ItemStack itemStack = pedestal.getStack(0); - Identifier id = Registry.ITEM.getId(itemStack.getItem()); + ResourceLocation id = Registry.ITEM.getId(itemStack.getItem()); if (EndPortals.isAvailableItem(id)) { - world.setBlockState(pos, updatedState.with(ACTIVATED, true).with(HAS_LIGHT, true)); + world.setBlockAndUpdate(pos, updatedState.with(ACTIVATED, true).with(HAS_LIGHT, true)); if (pedestal.hasRitual()) { pedestal.getRitual().checkStructure(); } else { @@ -72,42 +72,45 @@ public class EternalPedestal extends PedestalBlock { } } } - + @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState newState, WorldAccess world, BlockPos pos, BlockPos posFrom) { - BlockState updated = super.getStateForNeighborUpdate(state, direction, newState, world, pos, posFrom); - if (!updated.isOf(this)) return updated; + public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, + BlockPos pos, BlockPos posFrom) { + BlockState updated = super.updateShape(state, direction, newState, world, pos, posFrom); + if (!updated.is(this)) + return updated; if (!this.isPlaceable(updated)) { return updated.with(ACTIVATED, false); } return updated; } - + @Override public float calcBlockBreakingDelta(BlockState state, PlayerEntity player, BlockView world, BlockPos pos) { return 0.0F; } - + @Override public float getBlastResistance() { - return Blocks.BEDROCK.getBlastResistance(); + return Blocks.BEDROCK.getExplosionResistance(); } - + @Override public boolean shouldDropItemsOnExplosion(Explosion explosion) { return false; } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - if (state.isOf(this)) { - BlockProperties.PedestalState currentState = state.get(BlockProperties.PEDESTAL_STATE); - if (currentState.equals(BlockProperties.PedestalState.BOTTOM) || currentState.equals(BlockProperties.PedestalState.PILLAR)) { + public List getDrops(BlockState state, LootContext.Builder builder) { + if (state.is(this)) { + BlockProperties.PedestalState currentState = state.getValue(BlockProperties.PEDESTAL_STATE); + if (currentState.equals(BlockProperties.PedestalState.BOTTOM) + || currentState.equals(BlockProperties.PedestalState.PILLAR)) { return Lists.newArrayList(); } } List drop = Lists.newArrayList(); - BlockEntity blockEntity = builder.getNullable(LootContextParameters.BLOCK_ENTITY); + BlockEntity blockEntity = builder.getNullable(LootContextParams.BLOCK_ENTITY); if (blockEntity instanceof EternalPedestalEntity) { EternalPedestalEntity pedestal = (EternalPedestalEntity) blockEntity; if (!pedestal.isEmpty()) { @@ -116,10 +119,10 @@ public class EternalPedestal extends PedestalBlock { } return drop; } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { - super.appendProperties(stateManager); + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + super.createBlockStateDefinition(stateManager); stateManager.add(ACTIVATED); } diff --git a/src/main/java/ru/betterend/blocks/EternalRunedFlavolite.java b/src/main/java/ru/betterend/blocks/EternalRunedFlavolite.java index e8fd7644..f1c505d9 100644 --- a/src/main/java/ru/betterend/blocks/EternalRunedFlavolite.java +++ b/src/main/java/ru/betterend/blocks/EternalRunedFlavolite.java @@ -4,13 +4,13 @@ import java.util.List; import com.google.common.collect.Lists; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.explosion.Explosion; public class EternalRunedFlavolite extends RunedFlavolite { @@ -19,19 +19,19 @@ public class EternalRunedFlavolite extends RunedFlavolite { public float calcBlockBreakingDelta(BlockState state, PlayerEntity player, BlockView world, BlockPos pos) { return 0.0F; } - + @Override public float getBlastResistance() { - return Blocks.BEDROCK.getBlastResistance(); + return Blocks.BEDROCK.getExplosionResistance(); } - + @Override public boolean shouldDropItemsOnExplosion(Explosion explosion) { return false; } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Lists.newArrayList(); } } diff --git a/src/main/java/ru/betterend/blocks/FilaluxLanternBlock.java b/src/main/java/ru/betterend/blocks/FilaluxLanternBlock.java index 0363bd80..cb775ead 100644 --- a/src/main/java/ru/betterend/blocks/FilaluxLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/FilaluxLanternBlock.java @@ -2,12 +2,13 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Material; -import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.SoundType; import ru.betterend.blocks.basis.BlockBase; public class FilaluxLanternBlock extends BlockBase { public FilaluxLanternBlock() { - super(FabricBlockSettings.of(Material.WOOD).luminance(15).sounds(BlockSoundGroup.WOOD).breakByTool(FabricToolTags.AXES)); + super(FabricBlockSettings.of(Material.WOOD).luminance(15).sounds(SoundType.WOOD) + .breakByTool(FabricToolTags.AXES)); } } diff --git a/src/main/java/ru/betterend/blocks/FlamaeaBlock.java b/src/main/java/ru/betterend/blocks/FlamaeaBlock.java index 183891c3..4a9b575c 100644 --- a/src/main/java/ru/betterend/blocks/FlamaeaBlock.java +++ b/src/main/java/ru/betterend/blocks/FlamaeaBlock.java @@ -6,36 +6,34 @@ import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.AbstractBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.core.BlockPos; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; +import net.minecraft.world.level.BlockGetter; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.interfaces.ISpetialItem; public class FlamaeaBlock extends EndPlantBlock implements ISpetialItem { private static final VoxelShape SHAPE = Block.createCuboidShape(0, 0, 0, 16, 1, 16); - + public FlamaeaBlock() { - super(FabricBlockSettings.of(Material.PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.WET_GRASS) + super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).sounds(SoundType.WET_GRASS) .breakByHand(true)); } - + @Override protected boolean isTerrain(BlockState state) { - return state.isOf(Blocks.WATER); + return state.is(Blocks.WATER); } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { return SHAPE; @@ -45,9 +43,9 @@ public class FlamaeaBlock extends EndPlantBlock implements ISpetialItem { public AbstractBlock.OffsetType getOffsetType() { return AbstractBlock.OffsetType.NONE; } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Lists.newArrayList(new ItemStack(this)); } diff --git a/src/main/java/ru/betterend/blocks/GlowingHymenophoreBlock.java b/src/main/java/ru/betterend/blocks/GlowingHymenophoreBlock.java index 42dfda2d..ab65538b 100644 --- a/src/main/java/ru/betterend/blocks/GlowingHymenophoreBlock.java +++ b/src/main/java/ru/betterend/blocks/GlowingHymenophoreBlock.java @@ -2,12 +2,13 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Material; -import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.SoundType; import ru.betterend.blocks.basis.BlockBase; public class GlowingHymenophoreBlock extends BlockBase { public GlowingHymenophoreBlock() { - super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sounds(BlockSoundGroup.WART_BLOCK).luminance(15)); + super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sounds(SoundType.WART_BLOCK) + .luminance(15)); } } diff --git a/src/main/java/ru/betterend/blocks/GlowingMossBlock.java b/src/main/java/ru/betterend/blocks/GlowingMossBlock.java index 6b8aee7c..62814731 100644 --- a/src/main/java/ru/betterend/blocks/GlowingMossBlock.java +++ b/src/main/java/ru/betterend/blocks/GlowingMossBlock.java @@ -2,9 +2,9 @@ package ru.betterend.blocks; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; @@ -12,19 +12,19 @@ public class GlowingMossBlock extends EndPlantBlock { public GlowingMossBlock(int light) { super(light); } - + @Override protected boolean isTerrain(BlockState state) { return state.getBlock() == EndBlocks.END_MOSS || state.getBlock() == EndBlocks.END_MYCELIUM; } - - @Environment(EnvType.CLIENT) - public boolean hasEmissiveLighting(BlockView world, BlockPos pos) { - return true; - } - @Environment(EnvType.CLIENT) - public float getAmbientOcclusionLightLevel(BlockView world, BlockPos pos) { - return 1F; - } + @Environment(EnvType.CLIENT) + public boolean hasEmissiveLighting(BlockView world, BlockPos pos) { + return true; + } + + @Environment(EnvType.CLIENT) + public float getAmbientOcclusionLightLevel(BlockView world, BlockPos pos) { + return 1F; + } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java b/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java index ea26f658..ec778642 100644 --- a/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java +++ b/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java @@ -2,51 +2,47 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; -import net.minecraft.block.MaterialColor; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.BooleanProperty; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.WorldAccess; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; public class GlowingPillarLuminophorBlock extends BlockBase { public static final BooleanProperty NATURAL = BlockProperties.NATURAL; - + public GlowingPillarLuminophorBlock() { - super(FabricBlockSettings.of(Material.LEAVES) - .materialColor(MaterialColor.ORANGE) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.GRASS) - .strength(0.2F) - .luminance(15)); - this.setDefaultState(this.stateManager.getDefaultState().with(NATURAL, false)); + super(FabricBlockSettings.of(Material.LEAVES).materialColor(MaterialColor.COLOR_ORANGE) + .breakByTool(FabricToolTags.SHEARS).sounds(SoundType.GRASS).strength(0.2F).luminance(15)); + this.setDefaultState(this.stateManager.defaultBlockState().with(NATURAL, false)); } - + @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return state.get(NATURAL) ? world.getBlockState(pos.down()).isOf(EndBlocks.GLOWING_PILLAR_ROOTS) : true; + return state.getValue(NATURAL) ? world.getBlockState(pos.below()).is(EndBlocks.GLOWING_PILLAR_ROOTS) : true; } - + @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, + BlockPos pos, BlockPos neighborPos) { if (!canPlaceAt(state, world, pos)) { - return Blocks.AIR.getDefaultState(); - } - else { + return Blocks.AIR.defaultBlockState(); + } else { return state; } } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(NATURAL); } } diff --git a/src/main/java/ru/betterend/blocks/GlowingPillarRootsBlock.java b/src/main/java/ru/betterend/blocks/GlowingPillarRootsBlock.java index c6e5d493..ddc4aeb9 100644 --- a/src/main/java/ru/betterend/blocks/GlowingPillarRootsBlock.java +++ b/src/main/java/ru/betterend/blocks/GlowingPillarRootsBlock.java @@ -2,30 +2,30 @@ package ru.betterend.blocks; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.item.ItemStack; -import net.minecraft.state.StateManager; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.EnumProperty; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.UpDownPlantBlock; import ru.betterend.registry.EndBlocks; public class GlowingPillarRootsBlock extends UpDownPlantBlock { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE); } - + @Override protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.AMBER_MOSS); + return state.is(EndBlocks.AMBER_MOSS); } - + @Override @Environment(EnvType.CLIENT) public ItemStack getPickStack(BlockView world, BlockPos pos, BlockState state) { diff --git a/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java b/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java index 3c29919f..bd8fcb81 100644 --- a/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java @@ -4,14 +4,14 @@ import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.world.level.block.AbstractBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.SoundType; import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; @@ -21,15 +21,11 @@ import ru.betterend.util.MHelper; public class GlowingPillarSeedBlock extends EndPlantWithAgeBlock { public GlowingPillarSeedBlock() { - super(FabricBlockSettings.of(Material.PLANT) - .luminance((state) -> { return state.get(AGE) * 3 + 3; }) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.GRASS) - .breakByHand(true) - .ticksRandomly() - .noCollision()); + super(FabricBlockSettings.of(Material.PLANT).luminance((state) -> { + return state.getValue(AGE) * 3 + 3; + }).breakByTool(FabricToolTags.SHEARS).sounds(SoundType.GRASS).breakByHand(true).ticksRandomly().noCollision()); } - + @Override public void growAdult(StructureWorldAccess world, Random random, BlockPos pos) { int height = MHelper.randRange(1, 2, random); @@ -37,37 +33,39 @@ public class GlowingPillarSeedBlock extends EndPlantWithAgeBlock { if (h < height) { return; } - - Mutable mut = new Mutable().set(pos); - BlockState roots = EndBlocks.GLOWING_PILLAR_ROOTS.getDefaultState(); + + MutableBlockPos mut = new MutableBlockPos().set(pos); + BlockState roots = EndBlocks.GLOWING_PILLAR_ROOTS.defaultBlockState(); if (height < 2) { BlocksHelper.setWithUpdate(world, mut, roots.with(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); mut.move(Direction.UP); - } - else { + } else { BlocksHelper.setWithUpdate(world, mut, roots.with(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); mut.move(Direction.UP); BlocksHelper.setWithUpdate(world, mut, roots.with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); mut.move(Direction.UP); } - BlocksHelper.setWithUpdate(world, mut, EndBlocks.GLOWING_PILLAR_LUMINOPHOR.getDefaultState().with(BlueVineLanternBlock.NATURAL, true)); - for (Direction dir: BlocksHelper.DIRECTIONS) { + BlocksHelper.setWithUpdate(world, mut, + EndBlocks.GLOWING_PILLAR_LUMINOPHOR.defaultBlockState().with(BlueVineLanternBlock.NATURAL, true)); + for (Direction dir : BlocksHelper.DIRECTIONS) { pos = mut.offset(dir); if (world.isAir(pos)) { - BlocksHelper.setWithUpdate(world, pos, EndBlocks.GLOWING_PILLAR_LEAVES.getDefaultState().with(Properties.FACING, dir)); + BlocksHelper.setWithUpdate(world, pos, + EndBlocks.GLOWING_PILLAR_LEAVES.defaultBlockState().with(Properties.FACING, dir)); } } mut.move(Direction.UP); if (world.isAir(mut)) { - BlocksHelper.setWithUpdate(world, mut, EndBlocks.GLOWING_PILLAR_LEAVES.getDefaultState().with(Properties.FACING, Direction.UP)); + BlocksHelper.setWithUpdate(world, mut, + EndBlocks.GLOWING_PILLAR_LEAVES.defaultBlockState().with(Properties.FACING, Direction.UP)); } } - + @Override protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.AMBER_MOSS); + return state.is(EndBlocks.AMBER_MOSS); } - + @Override public AbstractBlock.OffsetType getOffsetType() { return AbstractBlock.OffsetType.NONE; diff --git a/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java b/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java index 7d4eaba6..02808f0a 100644 --- a/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java +++ b/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java @@ -7,22 +7,22 @@ import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.block.MaterialColor; -import net.minecraft.client.color.block.BlockColorProvider; -import net.minecraft.client.color.item.ItemColorProvider; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.IntProperty; -import net.minecraft.util.math.MathHelper; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.client.color.block.BlockColor; +import net.minecraft.client.color.item.ItemColor; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.item.ItemPlacementContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.util.Mth; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.interfaces.IColorProvider; import ru.betterend.noise.OpenSimplexNoise; @@ -30,63 +30,62 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; public class HelixTreeLeavesBlock extends BlockBase implements IColorProvider { - public static final IntProperty COLOR = BlockProperties.COLOR; + public static final IntegerProperty COLOR = BlockProperties.COLOR; private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); - + public HelixTreeLeavesBlock() { - super(FabricBlockSettings.of(Material.LEAVES) - .materialColor(MaterialColor.ORANGE) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.WART_BLOCK) - .sounds(BlockSoundGroup.GRASS) + super(FabricBlockSettings.of(Material.LEAVES).materialColor(MaterialColor.COLOR_ORANGE) + .breakByTool(FabricToolTags.SHEARS).sounds(SoundType.WART_BLOCK).sounds(SoundType.GRASS) .strength(0.2F)); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(COLOR); } @Override - public BlockColorProvider getProvider() { + public BlockColor getBlockProvider() { return (state, world, pos, tintIndex) -> { - return MHelper.color(237, getGreen(state.get(COLOR)), 20); + return MHelper.color(237, getGreen(state.getValue(COLOR)), 20); }; } @Override - public ItemColorProvider getItemProvider() { + public ItemColor getItemProvider() { return (stack, tintIndex) -> { return MHelper.color(237, getGreen(4), 20); }; } - + @Override public BlockState getPlacementState(ItemPlacementContext ctx) { double px = ctx.getBlockPos().getX() * 0.1; double py = ctx.getBlockPos().getY() * 0.1; double pz = ctx.getBlockPos().getZ() * 0.1; - return this.getDefaultState().with(COLOR, MHelper.floor(NOISE.eval(px, py, pz) * 3.5 + 4)); + return this.defaultBlockState().with(COLOR, MHelper.floor(NOISE.eval(px, py, pz) * 3.5 + 4)); } - + private int getGreen(int color) { float delta = color / 7F; - return (int) MathHelper.lerp(delta, 80, 158); + return (int) Mth.lerp(delta, 80, 158); } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); if (tool != null) { - if (tool.getItem().isIn(FabricToolTags.SHEARS) || tool.isEffectiveOn(state) || EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { + if (tool.getItem().isIn(FabricToolTags.SHEARS) || tool.isCorrectToolForDrops(state) + || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Collections.singletonList(new ItemStack(this)); } - int fortune = EnchantmentHelper.getLevel(Enchantments.FORTUNE, tool); + int fortune = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BLOCK_FORTUNE, tool); if (MHelper.RANDOM.nextInt(16) <= fortune) { return Lists.newArrayList(new ItemStack(EndBlocks.HELIX_TREE_SAPLING)); } return Lists.newArrayList(); } - return MHelper.RANDOM.nextInt(32) == 0 ? Lists.newArrayList(new ItemStack(EndBlocks.HELIX_TREE_SAPLING)) : Lists.newArrayList(); + return MHelper.RANDOM.nextInt(32) == 0 ? Lists.newArrayList(new ItemStack(EndBlocks.HELIX_TREE_SAPLING)) + : Lists.newArrayList(); } } diff --git a/src/main/java/ru/betterend/blocks/HydraluxBlock.java b/src/main/java/ru/betterend/blocks/HydraluxBlock.java index 53fc0eb2..eff201bb 100644 --- a/src/main/java/ru/betterend/blocks/HydraluxBlock.java +++ b/src/main/java/ru/betterend/blocks/HydraluxBlock.java @@ -10,17 +10,17 @@ 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.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.EnumProperty; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties.HydraluxShape; import ru.betterend.blocks.basis.UnderwaterPlantBlock; @@ -30,60 +30,56 @@ import ru.betterend.util.MHelper; public class HydraluxBlock extends UnderwaterPlantBlock { public static final EnumProperty SHAPE = BlockProperties.HYDRALUX_SHAPE; - + public HydraluxBlock() { - super(FabricBlockSettings.of(Material.UNDERWATER_PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.WET_GRASS) - .breakByHand(true) - .luminance((state) -> { return state.get(SHAPE).hasGlow() ? 15 : 0; }) - .noCollision()); + super(FabricBlockSettings.of(Material.UNDERWATER_PLANT).breakByTool(FabricToolTags.SHEARS) + .sounds(SoundType.WET_GRASS).breakByHand(true).luminance((state) -> { + return state.getValue(SHAPE).hasGlow() ? 15 : 0; + }).noCollision()); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE); } - + @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - BlockState down = world.getBlockState(pos.down()); - HydraluxShape shape = state.get(SHAPE); + BlockState down = world.getBlockState(pos.below()); + HydraluxShape shape = state.getValue(SHAPE); if (shape == HydraluxShape.FLOWER_BIG_TOP || shape == HydraluxShape.FLOWER_SMALL_TOP) { - return down.isOf(this); - } - else if (shape == HydraluxShape.ROOTS) { - return down.isOf(EndBlocks.SULPHURIC_ROCK.stone) && world.getBlockState(pos.up()).isOf(this); - } - else { - return down.isOf(this) && world.getBlockState(pos.up()).isOf(this); + return down.is(this); + } else if (shape == HydraluxShape.ROOTS) { + return down.is(EndBlocks.SULPHURIC_ROCK.stone) && world.getBlockState(pos.up()).is(this); + } else { + return down.is(this) && world.getBlockState(pos.up()).is(this); } } - + @Override public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { return false; } @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { + public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { return false; } - + @Override @Environment(EnvType.CLIENT) public ItemStack getPickStack(BlockView world, BlockPos pos, BlockState state) { return new ItemStack(EndBlocks.HYDRALUX_SAPLING); } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - HydraluxShape shape = state.get(SHAPE); + public List getDrops(BlockState state, LootContext.Builder builder) { + HydraluxShape shape = state.getValue(SHAPE); if (shape == HydraluxShape.FLOWER_BIG_BOTTOM || shape == HydraluxShape.FLOWER_SMALL_BOTTOM) { return Lists.newArrayList(new ItemStack(EndItems.HYDRALUX_PETAL, MHelper.randRange(1, 4, MHelper.RANDOM))); - } - else if (shape == HydraluxShape.ROOTS) { - return Lists.newArrayList(new ItemStack(EndBlocks.HYDRALUX_SAPLING, MHelper.randRange(1, 2, MHelper.RANDOM))); + } else if (shape == HydraluxShape.ROOTS) { + return Lists + .newArrayList(new ItemStack(EndBlocks.HYDRALUX_SAPLING, MHelper.randRange(1, 2, MHelper.RANDOM))); } return Collections.emptyList(); } diff --git a/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java b/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java index b514b7ef..7a111875 100644 --- a/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java +++ b/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java @@ -2,29 +2,25 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Material; -import net.minecraft.block.MaterialColor; -import net.minecraft.entity.Entity; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; import ru.betterend.blocks.basis.BlockBase; public class HydraluxPetalBlock extends BlockBase { public HydraluxPetalBlock() { - this(FabricBlockSettings.of(Material.PLANT) - .materialColor(MaterialColor.SPRUCE) - .sounds(BlockSoundGroup.WART_BLOCK) - .breakByTool(FabricToolTags.AXES) - .hardness(1) - .resistance(1) - .breakByHand(true)); + this(FabricBlockSettings.of(Material.PLANT).materialColor(MaterialColor.SPRUCE).sounds(SoundType.WART_BLOCK) + .breakByTool(FabricToolTags.AXES).hardness(1).resistance(1).breakByHand(true)); } - + public HydraluxPetalBlock(FabricBlockSettings settings) { super(settings); } - + @Override - public void onLandedUpon(World world, BlockPos pos, Entity entity, float distance) {} + public void onLandedUpon(Level world, BlockPos pos, Entity entity, float distance) { + } } diff --git a/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java b/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java index 5e1a0eed..e8c3731f 100644 --- a/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java +++ b/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java @@ -3,9 +3,9 @@ package ru.betterend.blocks; import java.io.Reader; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.client.color.block.BlockColorProvider; -import net.minecraft.client.color.item.ItemColorProvider; -import net.minecraft.util.Identifier; +import net.minecraft.client.color.block.BlockColor; +import net.minecraft.client.color.item.ItemColor; +import net.minecraft.resources.ResourceLocation; import ru.betterend.interfaces.IColorProvider; import ru.betterend.patterns.Patterns; import ru.betterend.util.BlocksHelper; @@ -14,35 +14,35 @@ public class HydraluxPetalColoredBlock extends HydraluxPetalBlock implements ICo public HydraluxPetalColoredBlock(FabricBlockSettings settings) { super(settings); } - + @Override - public BlockColorProvider getProvider() { + public BlockColor getBlockProvider() { return (state, world, pos, tintIndex) -> { return BlocksHelper.getBlockColor(this); }; } @Override - public ItemColorProvider getItemProvider() { + public ItemColor getItemProvider() { return (stack, tintIndex) -> { return BlocksHelper.getBlockColor(this); }; } - + @Override public String getStatesPattern(Reader data) { String path = "betterend:block/block_petal_colored"; return Patterns.createJson(data, path, path); } - + @Override public String getModelPattern(String block) { String path = "betterend:block/block_petal_colored"; return Patterns.createJson(Patterns.BLOCK_PETAL_COLORED, path, path); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_DIRECT; } } diff --git a/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java b/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java index ae1544c0..05b7696e 100644 --- a/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java @@ -2,10 +2,10 @@ package ru.betterend.blocks; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.BlockProperties.HydraluxShape; import ru.betterend.blocks.basis.UnderwaterPlantWithAgeBlock; @@ -17,33 +17,35 @@ public class HydraluxSaplingBlock extends UnderwaterPlantWithAgeBlock { @Override public void grow(StructureWorldAccess world, Random random, BlockPos pos) { int h = MHelper.randRange(4, 8, random); - Mutable mut = new Mutable().set(pos); - + MutableBlockPos mut = new MutableBlockPos().set(pos); + for (int i = 1; i < h; i++) { mut.setY(pos.getY() + i); - if (!world.getBlockState(mut).isOf(Blocks.WATER)) { + if (!world.getBlockState(mut).is(Blocks.WATER)) { return; } } - + mut.setY(pos.getY()); - BlockState state = EndBlocks.HYDRALUX.getDefaultState(); + BlockState state = EndBlocks.HYDRALUX.defaultBlockState(); BlocksHelper.setWithoutUpdate(world, pos, state.with(BlockProperties.HYDRALUX_SHAPE, HydraluxShape.ROOTS)); for (int i = 1; i < h - 2; i++) { mut.setY(pos.getY() + i); BlocksHelper.setWithoutUpdate(world, mut, state.with(BlockProperties.HYDRALUX_SHAPE, HydraluxShape.VINE)); } - + mut.setY(mut.getY() + 1); boolean big = random.nextBoolean(); - BlocksHelper.setWithoutUpdate(world, mut, state.with(BlockProperties.HYDRALUX_SHAPE, big ? HydraluxShape.FLOWER_BIG_BOTTOM : HydraluxShape.FLOWER_SMALL_BOTTOM)); - + BlocksHelper.setWithoutUpdate(world, mut, state.with(BlockProperties.HYDRALUX_SHAPE, + big ? HydraluxShape.FLOWER_BIG_BOTTOM : HydraluxShape.FLOWER_SMALL_BOTTOM)); + mut.setY(mut.getY() + 1); - BlocksHelper.setWithoutUpdate(world, mut, state.with(BlockProperties.HYDRALUX_SHAPE, big ? HydraluxShape.FLOWER_BIG_TOP : HydraluxShape.FLOWER_SMALL_TOP)); + BlocksHelper.setWithoutUpdate(world, mut, state.with(BlockProperties.HYDRALUX_SHAPE, + big ? HydraluxShape.FLOWER_BIG_TOP : HydraluxShape.FLOWER_SMALL_TOP)); } - + @Override protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.SULPHURIC_ROCK.stone); + return state.is(EndBlocks.SULPHURIC_ROCK.stone); } } diff --git a/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java b/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java index 262cad10..999ca172 100644 --- a/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java +++ b/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java @@ -8,33 +8,33 @@ 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.block.Block; -import net.minecraft.block.BlockEntityProvider; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.FluidFillable; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.Waterloggable; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.LivingEntity; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.BlockEntityProvider; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.FluidFillable; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.level.block.Waterloggable; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.FluidState; import net.minecraft.fluid.Fluids; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; +import net.minecraft.world.item.ItemPlacementContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.BooleanProperty; import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; import ru.betterend.blocks.basis.BlockBaseNotFull; import ru.betterend.blocks.entities.BlockEntityHydrothermalVent; @@ -42,67 +42,66 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndParticles; import ru.betterend.util.BlocksHelper; -public class HydrothermalVentBlock extends BlockBaseNotFull implements BlockEntityProvider, FluidFillable, Waterloggable { +public class HydrothermalVentBlock extends BlockBaseNotFull + implements BlockEntityProvider, FluidFillable, Waterloggable { public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; private static final VoxelShape SHAPE = Block.createCuboidShape(1, 1, 1, 15, 16, 15); - + public HydrothermalVentBlock() { - super(FabricBlockSettings.of(Material.STONE) - .breakByTool(FabricToolTags.PICKAXES) - .sounds(BlockSoundGroup.STONE) - .noCollision() - .requiresTool()); + super(FabricBlockSettings.of(Material.STONE).breakByTool(FabricToolTags.PICKAXES).sounds(SoundType.STONE) + .noCollision().requiresTool()); this.setDefaultState(getDefaultState().with(WATERLOGGED, true).with(ACTIVATED, false)); } - + @Override - protected void appendProperties(StateManager.Builder builder) { + protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(WATERLOGGED, ACTIVATED); } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { return SHAPE; } - + @Override public boolean canFillWithFluid(BlockView world, BlockPos pos, BlockState state, Fluid fluid) { return false; } @Override - public boolean tryFillWithFluid(WorldAccess world, BlockPos pos, BlockState state, FluidState fluidState) { + public boolean tryFillWithFluid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { return false; } - + @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - state = world.getBlockState(pos.down()); - return state.isOf(EndBlocks.SULPHURIC_ROCK.stone); + state = world.getBlockState(pos.below()); + return state.is(EndBlocks.SULPHURIC_ROCK.stone); } - + @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, + BlockPos pos, BlockPos neighborPos) { if (!canPlaceAt(state, world, pos)) { - return Blocks.WATER.getDefaultState(); - } - else if (state.get(WATERLOGGED) && facing == Direction.UP && neighborState.isOf(Blocks.WATER)) { + return Blocks.WATER.defaultBlockState(); + } else if (state.getValue(WATERLOGGED) && facing == Direction.UP && neighborState.is(Blocks.WATER)) { world.getBlockTickScheduler().schedule(pos, this, 20); } return state; } - + @Override public BlockState getPlacementState(ItemPlacementContext ctx) { - WorldAccess worldAccess = ctx.getWorld(); + LevelAccessor worldAccess = ctx.getLevel(); BlockPos blockPos = ctx.getBlockPos(); - return this.getDefaultState().with(WATERLOGGED, worldAccess.getFluidState(blockPos).getFluid() == Fluids.WATER); + return this.defaultBlockState().with(WATERLOGGED, + worldAccess.getFluidState(blockPos).getFluid() == Fluids.WATER); } - + @Override public FluidState getFluidState(BlockState state) { - return (Boolean) state.get(WATERLOGGED) ? Fluids.WATER.getStill(false) : super.getFluidState(state); + return (Boolean) state.getValue(WATERLOGGED) ? Fluids.WATER.getStill(false) : super.getFluidState(state); } @Override @@ -111,32 +110,33 @@ public class HydrothermalVentBlock extends BlockBaseNotFull implements BlockEnti } @Override - public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + public void scheduledTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { BlockPos up = pos.up(); - if (world.getBlockState(up).isOf(Blocks.WATER)) { + if (world.getBlockState(up).is(Blocks.WATER)) { BlocksHelper.setWithoutUpdate(world, up, EndBlocks.VENT_BUBBLE_COLUMN); world.getBlockTickScheduler().schedule(up, EndBlocks.VENT_BUBBLE_COLUMN, 5); } } - + @Override - public void onPlaced(World world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack itemStack) { - if (world instanceof ServerWorld && state.get(WATERLOGGED) && world.getBlockState(pos.up()).isOf(Blocks.WATER)) { - scheduledTick(state,(ServerWorld) world, pos, world.random); + public void onPlaced(Level world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, + ItemStack itemStack) { + if (world instanceof ServerLevel && state.getValue(WATERLOGGED) + && world.getBlockState(pos.up()).is(Blocks.WATER)) { + scheduledTick(state, (ServerLevel) world, pos, world.random); } } - + @Environment(EnvType.CLIENT) - public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { - if (!state.get(ACTIVATED) && random.nextBoolean()) { - super.randomDisplayTick(state, world, pos, random); + public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { + if (!state.getValue(ACTIVATED) && random.nextBoolean()) { + super.animateTick(state, world, pos, random); double x = pos.getX() + random.nextDouble(); double y = pos.getY() + 0.9 + random.nextDouble() * 0.3; double z = pos.getZ() + random.nextDouble(); - if (state.get(WATERLOGGED)) { + if (state.getValue(WATERLOGGED)) { world.addParticle(EndParticles.GEYSER_PARTICLE, x, y, z, 0, 0, 0); - } - else { + } else { world.addParticle(ParticleTypes.SMOKE, x, y, z, 0, 0, 0); } } diff --git a/src/main/java/ru/betterend/blocks/InfusionPedestal.java b/src/main/java/ru/betterend/blocks/InfusionPedestal.java index 062cdd8e..081cc4aa 100644 --- a/src/main/java/ru/betterend/blocks/InfusionPedestal.java +++ b/src/main/java/ru/betterend/blocks/InfusionPedestal.java @@ -1,15 +1,15 @@ package ru.betterend.blocks; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.core.BlockPos; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.entities.InfusionPedestalEntity; import ru.betterend.rituals.InfusionRitual; @@ -22,9 +22,9 @@ public class InfusionPedestal extends PedestalBlock { super(Blocks.OBSIDIAN); this.height = 1.08F; } - + @Override - public void checkRitual(World world, BlockPos pos) { + public void checkRitual(Level world, BlockPos pos) { BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof InfusionPedestalEntity) { InfusionPedestalEntity pedestal = (InfusionPedestalEntity) blockEntity; @@ -37,30 +37,30 @@ public class InfusionPedestal extends PedestalBlock { } } } - + @Override public BlockEntity createBlockEntity(BlockView world) { return new InfusionPedestalEntity(); } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { - if (state.isOf(this)) { - switch(state.get(STATE)) { - case PEDESTAL_TOP: { - return SHAPE_PEDESTAL_TOP; - } - case DEFAULT: { - return SHAPE_DEFAULT; - } - default: { - return super.getOutlineShape(state, world, pos, context); - } + if (state.is(this)) { + switch (state.getValue(STATE)) { + case PEDESTAL_TOP: { + return SHAPE_PEDESTAL_TOP; + } + case DEFAULT: { + return SHAPE_DEFAULT; + } + default: { + return super.getOutlineShape(state, world, pos, context); + } } } return super.getOutlineShape(state, world, pos, context); } - + static { VoxelShape basinUp = Block.createCuboidShape(2, 3, 2, 14, 4, 14); VoxelShape basinDown = Block.createCuboidShape(0, 0, 0, 16, 3, 16); diff --git a/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java b/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java index 0812cfb4..411f0598 100644 --- a/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java +++ b/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java @@ -6,21 +6,21 @@ import java.util.List; import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.SlimeBlock; -import net.minecraft.client.color.block.BlockColorProvider; -import net.minecraft.client.color.item.ItemColorProvider; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.IntProperty; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3i; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SlimeBlock; +import net.minecraft.client.color.block.BlockColor; +import net.minecraft.client.color.item.ItemColor; +import net.minecraft.world.item.ItemPlacementContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.core.Vec3i; +import net.minecraft.core.Registry; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IColorProvider; import ru.betterend.interfaces.IRenderTypeable; @@ -30,71 +30,71 @@ import ru.betterend.patterns.Patterns; import ru.betterend.util.MHelper; public class JellyshroomCapBlock extends SlimeBlock implements IRenderTypeable, BlockPatterned, IColorProvider { - public static final IntProperty COLOR = BlockProperties.COLOR; + public static final IntegerProperty COLOR = BlockProperties.COLOR; private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); private final Vec3i colorStart; private final Vec3i colorEnd; private final int coloritem; - + public JellyshroomCapBlock(int r1, int g1, int b1, int r2, int g2, int b2) { super(FabricBlockSettings.copyOf(Blocks.SLIME_BLOCK)); colorStart = new Vec3i(r1, g1, b1); colorEnd = new Vec3i(r2, g2, b2); coloritem = MHelper.color((r1 + r2) >> 1, (g1 + g2) >> 1, (b1 + b2) >> 1); } - + @Override public BlockState getPlacementState(ItemPlacementContext ctx) { double px = ctx.getBlockPos().getX() * 0.1; double py = ctx.getBlockPos().getY() * 0.1; double pz = ctx.getBlockPos().getZ() * 0.1; - return this.getDefaultState().with(COLOR, MHelper.floor(NOISE.eval(px, py, pz) * 3.5 + 4)); + return this.defaultBlockState().with(COLOR, MHelper.floor(NOISE.eval(px, py, pz) * 3.5 + 4)); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(COLOR); } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.TRANSLUCENT; } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Lists.newArrayList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { - String block = Registry.BLOCK.getId(this).getPath(); + String block = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, block, block); } - + @Override public String getModelPattern(String block) { return Patterns.createJson(Patterns.BLOCK_COLORED, "jellyshroom_cap"); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_SIMPLE; } - + @Override - public BlockColorProvider getProvider() { + public BlockColor getBlockProvider() { return (state, world, pos, tintIndex) -> { - float delta = (float) state.get(COLOR) / 7F; - int r = MathHelper.floor(MathHelper.lerp(delta, colorStart.getX() / 255F, colorEnd.getX() / 255F) * 255F); - int g = MathHelper.floor(MathHelper.lerp(delta, colorStart.getY() / 255F, colorEnd.getY() / 255F) * 255F); - int b = MathHelper.floor(MathHelper.lerp(delta, colorStart.getZ() / 255F, colorEnd.getZ() / 255F) * 255F); + float delta = (float) state.getValue(COLOR) / 7F; + int r = Mth.floor(Mth.lerp(delta, colorStart.getX() / 255F, colorEnd.getX() / 255F) * 255F); + int g = Mth.floor(Mth.lerp(delta, colorStart.getY() / 255F, colorEnd.getY() / 255F) * 255F); + int b = Mth.floor(Mth.lerp(delta, colorStart.getZ() / 255F, colorEnd.getZ() / 255F) * 255F); return MHelper.color(r, g, b); }; } @Override - public ItemColorProvider getItemProvider() { + public ItemColor getItemProvider() { return (stack, tintIndex) -> { return coloritem; }; diff --git a/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java b/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java index 7302e964..e737242a 100644 --- a/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java @@ -1,7 +1,7 @@ package ru.betterend.blocks; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; import net.minecraft.world.WorldView; import net.minecraft.world.gen.feature.Feature; import ru.betterend.blocks.basis.FeatureSaplingBlock; @@ -17,9 +17,10 @@ public class LacugroveSaplingBlock extends FeatureSaplingBlock { protected Feature getFeature() { return EndFeatures.LACUGROVE.getFeature(); } - + @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return world.getBlockState(pos.down()).isOf(EndBlocks.END_MOSS) || world.getBlockState(pos.down()).isOf(EndBlocks.ENDSTONE_DUST); + return world.getBlockState(pos.below()).is(EndBlocks.END_MOSS) + || world.getBlockState(pos.below()).is(EndBlocks.ENDSTONE_DUST); } } diff --git a/src/main/java/ru/betterend/blocks/LanceleafBlock.java b/src/main/java/ru/betterend/blocks/LanceleafBlock.java index 5c3fec89..ed5294b3 100644 --- a/src/main/java/ru/betterend/blocks/LanceleafBlock.java +++ b/src/main/java/ru/betterend/blocks/LanceleafBlock.java @@ -3,17 +3,17 @@ package ru.betterend.blocks; import java.util.Collections; import java.util.List; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.state.StateManager; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.EnumProperty; -import net.minecraft.state.property.IntProperty; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties.PentaShape; import ru.betterend.blocks.basis.EndPlantBlock; @@ -22,46 +22,45 @@ import ru.betterend.util.MHelper; public class LanceleafBlock extends EndPlantBlock { public static final EnumProperty SHAPE = BlockProperties.PENTA_SHAPE; - public static final IntProperty ROTATION = BlockProperties.ROTATION; - + public static final IntegerProperty ROTATION = BlockProperties.ROTATION; + public LanceleafBlock() { super(); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE, ROTATION); } - + @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - PentaShape shape = state.get(SHAPE); + PentaShape shape = state.getValue(SHAPE); if (shape == PentaShape.TOP) { - return world.getBlockState(pos.down()).isOf(this); - } - else if (shape == PentaShape.BOTTOM) { - return world.getBlockState(pos.down()).isOf(EndBlocks.AMBER_MOSS) && world.getBlockState(pos.up()).isOf(this); - } - else { - return world.getBlockState(pos.down()).isOf(this) && world.getBlockState(pos.up()).isOf(this); + return world.getBlockState(pos.below()).is(this); + } else if (shape == PentaShape.BOTTOM) { + return world.getBlockState(pos.below()).is(EndBlocks.AMBER_MOSS) && world.getBlockState(pos.up()).is(this); + } else { + return world.getBlockState(pos.below()).is(this) && world.getBlockState(pos.up()).is(this); } } - + @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, + BlockPos pos, BlockPos neighborPos) { if (!canPlaceAt(state, world, pos)) { - return Blocks.AIR.getDefaultState(); - } - else { + return Blocks.AIR.defaultBlockState(); + } else { return state; } } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - if (state.get(SHAPE) == PentaShape.BOTTOM) { + public List getDrops(BlockState state, LootContext.Builder builder) { + if (state.getValue(SHAPE) == PentaShape.BOTTOM) { return Collections.singletonList(new ItemStack(EndBlocks.LANCELEAF_SEED)); } - return MHelper.RANDOM.nextBoolean() ? Collections.emptyList() : Collections.singletonList(new ItemStack(EndBlocks.LANCELEAF_SEED)); + return MHelper.RANDOM.nextBoolean() ? Collections.emptyList() + : Collections.singletonList(new ItemStack(EndBlocks.LANCELEAF_SEED)); } } diff --git a/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java b/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java index 182519aa..8f0ca538 100644 --- a/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java @@ -2,11 +2,11 @@ package ru.betterend.blocks; import java.util.Random; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.AbstractBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.BlockProperties.PentaShape; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; @@ -23,22 +23,26 @@ public class LanceleafSeedBlock extends EndPlantWithAgeBlock { return; } int rotation = random.nextInt(4); - Mutable mut = new Mutable().set(pos); - BlockState plant = EndBlocks.LANCELEAF.getDefaultState().with(BlockProperties.ROTATION, rotation); + MutableBlockPos mut = new MutableBlockPos().set(pos); + BlockState plant = EndBlocks.LANCELEAF.defaultBlockState().with(BlockProperties.ROTATION, rotation); BlocksHelper.setWithoutUpdate(world, mut, plant.with(BlockProperties.PENTA_SHAPE, PentaShape.BOTTOM)); - BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), plant.with(BlockProperties.PENTA_SHAPE, PentaShape.PRE_BOTTOM)); + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), + plant.with(BlockProperties.PENTA_SHAPE, PentaShape.PRE_BOTTOM)); for (int i = 2; i < height - 2; i++) { - BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), plant.with(BlockProperties.PENTA_SHAPE, PentaShape.MIDDLE)); + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), + plant.with(BlockProperties.PENTA_SHAPE, PentaShape.MIDDLE)); } - BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), plant.with(BlockProperties.PENTA_SHAPE, PentaShape.PRE_TOP)); - BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), plant.with(BlockProperties.PENTA_SHAPE, PentaShape.TOP)); + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), + plant.with(BlockProperties.PENTA_SHAPE, PentaShape.PRE_TOP)); + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), + plant.with(BlockProperties.PENTA_SHAPE, PentaShape.TOP)); } - + @Override protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.AMBER_MOSS); + return state.is(EndBlocks.AMBER_MOSS); } - + @Override public AbstractBlock.OffsetType getOffsetType() { return AbstractBlock.OffsetType.NONE; diff --git a/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java b/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java index 35b14b54..fac9f8d2 100644 --- a/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java +++ b/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java @@ -4,18 +4,18 @@ import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.EnumProperty; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.EndPlantBlock; @@ -24,57 +24,55 @@ import ru.betterend.registry.EndBlocks; public class LargeAmaranitaBlock extends EndPlantBlock { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; private static final VoxelShape SHAPE_BOTTOM = Block.createCuboidShape(4, 0, 4, 12, 14, 12); - private static final VoxelShape SHAPE_TOP = VoxelShapes.union(Block.createCuboidShape(1, 3, 1, 15, 16, 15), SHAPE_BOTTOM); - + private static final VoxelShape SHAPE_TOP = VoxelShapes.union(Block.createCuboidShape(1, 3, 1, 15, 16, 15), + SHAPE_BOTTOM); + public LargeAmaranitaBlock() { super(FabricBlockSettings.of(Material.PLANT) - .luminance((state) -> (state.get(SHAPE) == TripleShape.TOP) ? 15 : 0) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.GRASS) - .breakByHand(true)); + .luminance((state) -> (state.getValue(SHAPE) == TripleShape.TOP) ? 15 : 0) + .breakByTool(FabricToolTags.SHEARS).sounds(SoundType.GRASS).breakByHand(true)); } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return state.get(SHAPE) == TripleShape.TOP ? SHAPE_TOP : SHAPE_BOTTOM; + return state.getValue(SHAPE) == TripleShape.TOP ? SHAPE_TOP : SHAPE_BOTTOM; } - + @Override protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.SANGNUM) || state.isOf(EndBlocks.MOSSY_OBSIDIAN) || state.isOf(EndBlocks.MOSSY_DRAGON_BONE); + return state.is(EndBlocks.SANGNUM) || state.is(EndBlocks.MOSSY_OBSIDIAN) + || state.is(EndBlocks.MOSSY_DRAGON_BONE); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE); } - + @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - TripleShape shape = state.get(SHAPE); + TripleShape shape = state.getValue(SHAPE); if (shape == TripleShape.BOTTOM) { - return isTerrain(world.getBlockState(pos.down())) && world.getBlockState(pos.up()).isOf(this); - } - else if (shape == TripleShape.TOP) { - return world.getBlockState(pos.down()).isOf(this); - } - else { - return world.getBlockState(pos.down()).isOf(this) && world.getBlockState(pos.up()).isOf(this); + return isTerrain(world.getBlockState(pos.below())) && world.getBlockState(pos.up()).is(this); + } else if (shape == TripleShape.TOP) { + return world.getBlockState(pos.below()).is(this); + } else { + return world.getBlockState(pos.below()).is(this) && world.getBlockState(pos.up()).is(this); } } - + @Override public OffsetType getOffsetType() { return OffsetType.NONE; } - + @Override public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { return false; } @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { + public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { return false; } } diff --git a/src/main/java/ru/betterend/blocks/LumecornBlock.java b/src/main/java/ru/betterend/blocks/LumecornBlock.java index 0fd64805..a1ccdd25 100644 --- a/src/main/java/ru/betterend/blocks/LumecornBlock.java +++ b/src/main/java/ru/betterend/blocks/LumecornBlock.java @@ -7,20 +7,20 @@ 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.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.state.StateManager; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.EnumProperty; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties.LumecornShape; import ru.betterend.blocks.basis.BlockBaseNotFull; @@ -35,18 +35,16 @@ public class LumecornBlock extends BlockBaseNotFull implements IRenderTypeable { public static final EnumProperty SHAPE = EnumProperty.of("shape", LumecornShape.class); private static final VoxelShape SHAPE_BOTTOM = Block.createCuboidShape(6, 0, 6, 10, 16, 10); private static final VoxelShape SHAPE_TOP = Block.createCuboidShape(6, 0, 6, 10, 8, 10); - + public LumecornBlock() { - super(FabricBlockSettings.of(Material.WOOD) - .breakByTool(FabricToolTags.AXES) - .hardness(0.5F) + super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).hardness(0.5F) .luminance((state) -> { - return state.get(SHAPE).getLight(); - })); + return state.getValue(SHAPE).getLight(); + })); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE); } @@ -54,49 +52,49 @@ public class LumecornBlock extends BlockBaseNotFull implements IRenderTypeable { public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return state.get(SHAPE) == LumecornShape.LIGHT_TOP ? SHAPE_TOP : SHAPE_BOTTOM; + return state.getValue(SHAPE) == LumecornShape.LIGHT_TOP ? SHAPE_TOP : SHAPE_BOTTOM; } - + @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - LumecornShape shape = state.get(SHAPE); + LumecornShape shape = state.getValue(SHAPE); if (shape == LumecornShape.BOTTOM_BIG || shape == LumecornShape.BOTTOM_SMALL) { - return world.getBlockState(pos.down()).isIn(EndTags.END_GROUND); - } - else if (shape == LumecornShape.LIGHT_TOP) { - return world.getBlockState(pos.down()).isOf(this); - } - else { - return world.getBlockState(pos.down()).isOf(this) && world.getBlockState(pos.up()).isOf(this); + return world.getBlockState(pos.below()).isIn(EndTags.END_GROUND); + } else if (shape == LumecornShape.LIGHT_TOP) { + return world.getBlockState(pos.below()).is(this); + } else { + return world.getBlockState(pos.below()).is(this) && world.getBlockState(pos.up()).is(this); } } - + @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, + BlockPos pos, BlockPos neighborPos) { if (!canPlaceAt(state, world, pos)) { - return Blocks.AIR.getDefaultState(); - } - else { + return Blocks.AIR.defaultBlockState(); + } else { return state; } } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - LumecornShape shape = state.get(SHAPE); + public List getDrops(BlockState state, LootContext.Builder builder) { + LumecornShape shape = state.getValue(SHAPE); if (shape == LumecornShape.BOTTOM_BIG || shape == LumecornShape.BOTTOM_SMALL || shape == LumecornShape.MIDDLE) { - return Collections.singletonList(new ItemStack(EndBlocks.LUMECORN_SEED, MHelper.randRange(1, 2, MHelper.RANDOM))); + return Collections + .singletonList(new ItemStack(EndBlocks.LUMECORN_SEED, MHelper.randRange(1, 2, MHelper.RANDOM))); } - return MHelper.RANDOM.nextBoolean() ? Collections.singletonList(new ItemStack(EndItems.LUMECORN_ROD)) : Collections.emptyList(); + return MHelper.RANDOM.nextBoolean() ? Collections.singletonList(new ItemStack(EndItems.LUMECORN_ROD)) + : Collections.emptyList(); } - + @Override @Environment(EnvType.CLIENT) public ItemStack getPickStack(BlockView world, BlockPos pos, BlockState state) { - LumecornShape shape = state.get(SHAPE); + LumecornShape shape = state.getValue(SHAPE); if (shape == LumecornShape.BOTTOM_BIG || shape == LumecornShape.BOTTOM_SMALL || shape == LumecornShape.MIDDLE) { return new ItemStack(EndBlocks.LUMECORN_SEED); } diff --git a/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java b/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java index de06b251..85b05d0e 100644 --- a/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java @@ -2,9 +2,9 @@ package ru.betterend.blocks; import java.util.Random; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.AbstractBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; @@ -15,12 +15,12 @@ public class LumecornSeedBlock extends EndPlantWithAgeBlock { public void growAdult(StructureWorldAccess world, Random random, BlockPos pos) { EndFeatures.LUMECORN.getFeature().generate(world, null, random, pos, null); } - + @Override protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.END_MOSS); + return state.is(EndBlocks.END_MOSS); } - + @Override public AbstractBlock.OffsetType getOffsetType() { return AbstractBlock.OffsetType.NONE; diff --git a/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java b/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java index abefc6e1..9d18449a 100644 --- a/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java +++ b/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java @@ -5,20 +5,20 @@ import java.util.Queue; import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.FluidBlock; -import net.minecraft.block.FluidDrainable; -import net.minecraft.block.Material; -import net.minecraft.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.FluidBlock; +import net.minecraft.world.level.block.FluidDrainable; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.fluid.FluidState; import net.minecraft.fluid.Fluids; -import net.minecraft.tag.FluidTags; +import net.minecraft.tags.FluidTags; import net.minecraft.util.Pair; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import ru.betterend.blocks.basis.BlockBaseNotFull; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; @@ -28,23 +28,24 @@ public class MengerSpongeBlock extends BlockBaseNotFull implements IRenderTypeab public MengerSpongeBlock() { super(FabricBlockSettings.copyOf(Blocks.SPONGE).nonOpaque()); } - + @Override - public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean notify) { + public void onBlockAdded(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean notify) { if (absorbWater(world, pos)) { - world.setBlockState(pos, EndBlocks.MENGER_SPONGE_WET.getDefaultState()); + world.setBlockAndUpdate(pos, EndBlocks.MENGER_SPONGE_WET.defaultBlockState()); } } - + @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, + BlockPos pos, BlockPos neighborPos) { if (absorbWater(world, pos)) { - return EndBlocks.MENGER_SPONGE_WET.getDefaultState(); + return EndBlocks.MENGER_SPONGE_WET.defaultBlockState(); } return state; } - private boolean absorbWater(WorldAccess world, BlockPos pos) { + private boolean absorbWater(LevelAccessor world, BlockPos pos) { Queue> queue = Lists.newLinkedList(); queue.add(new Pair(pos, 0)); int i = 0; @@ -63,23 +64,25 @@ public class MengerSpongeBlock extends BlockBaseNotFull implements IRenderTypeab FluidState fluidState = world.getFluidState(blockPos2); Material material = blockState.getMaterial(); if (fluidState.isIn(FluidTags.WATER)) { - if (blockState.getBlock() instanceof FluidDrainable && ((FluidDrainable) blockState.getBlock()).tryDrainFluid(world, blockPos2, blockState) != Fluids.EMPTY) { + if (blockState.getBlock() instanceof FluidDrainable && ((FluidDrainable) blockState.getBlock()) + .tryDrainFluid(world, blockPos2, blockState) != Fluids.EMPTY) { ++i; if (j < 6) { queue.add(new Pair(blockPos2, j + 1)); } - } - else if (blockState.getBlock() instanceof FluidBlock) { - world.setBlockState(blockPos2, Blocks.AIR.getDefaultState(), 3); + } else if (blockState.getBlock() instanceof FluidBlock) { + world.setBlockAndUpdate(blockPos2, Blocks.AIR.defaultBlockState(), 3); ++i; if (j < 6) { queue.add(new Pair(blockPos2, j + 1)); } - } - else if (material == Material.UNDERWATER_PLANT || material == Material.REPLACEABLE_UNDERWATER_PLANT) { - BlockEntity blockEntity = blockState.getBlock().hasBlockEntity() ? world.getBlockEntity(blockPos2) : null; + } else if (material == Material.UNDERWATER_PLANT + || material == Material.REPLACEABLE_UNDERWATER_PLANT) { + BlockEntity blockEntity = blockState.getBlock().hasBlockEntity() + ? world.getBlockEntity(blockPos2) + : null; dropStacks(blockState, world, blockPos2, blockEntity); - world.setBlockState(blockPos2, Blocks.AIR.getDefaultState(), 3); + world.setBlockAndUpdate(blockPos2, Blocks.AIR.defaultBlockState(), 3); ++i; if (j < 6) { queue.add(new Pair(blockPos2, j + 1)); @@ -95,7 +98,7 @@ public class MengerSpongeBlock extends BlockBaseNotFull implements IRenderTypeab return i > 0; } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; diff --git a/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java b/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java index 81ecce04..98c0e68b 100644 --- a/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java +++ b/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java @@ -5,20 +5,20 @@ import java.util.Random; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.entity.ItemEntity; -import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.entity.ItemEntity; +import net.minecraft.world.entity.player.PlayerEntity; import net.minecraft.fluid.FluidState; import net.minecraft.fluid.Fluids; -import net.minecraft.item.ItemStack; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.world.item.ItemStack; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.sounds.SoundSource; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.GameRules; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; import ru.betterend.blocks.basis.BlockBaseNotFull; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; @@ -31,20 +31,21 @@ public class MengerSpongeWetBlock extends BlockBaseNotFull implements IRenderTyp } @Override - public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean notify) { + public void onBlockAdded(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean notify) { if (world.getDimension().isUltrawarm()) { - world.setBlockState(pos, EndBlocks.MENGER_SPONGE.getDefaultState(), 3); + world.setBlockAndUpdate(pos, EndBlocks.MENGER_SPONGE.defaultBlockState(), 3); world.syncWorldEvent(2009, pos, 0); - world.playSound((PlayerEntity) null, pos, SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.BLOCKS, 1.0F, (1.0F + world.getRandom().nextFloat() * 0.2F) * 0.7F); + world.playLocalSound((PlayerEntity) null, pos, SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundSource.BLOCKS, 1.0F, + (1.0F + world.getRandom().nextFloat() * 0.2F) * 0.7F); } } @Override @Environment(EnvType.CLIENT) - public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { + public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { Direction direction = Direction.random(random); if (direction != Direction.UP) { - BlockPos blockPos = pos.offset(direction); + BlockPos blockPos = pos.relative(direction); BlockState blockState = world.getBlockState(blockPos); if (!state.isOpaque() || !blockState.isSideSolidFullSquare(world, blockPos, direction.getOpposite())) { double x = (double) pos.getX(); @@ -54,24 +55,20 @@ public class MengerSpongeWetBlock extends BlockBaseNotFull implements IRenderTyp y -= 0.05; x += random.nextDouble(); z += random.nextDouble(); - } - else { + } else { y += random.nextDouble() * 0.8; if (direction.getAxis() == Direction.Axis.X) { z += random.nextDouble(); if (direction == Direction.EAST) { ++x; - } - else { + } else { x += 0.05; } - } - else { + } else { x += random.nextDouble(); if (direction == Direction.SOUTH) { ++z; - } - else { + } else { z += 0.05; } } @@ -83,22 +80,23 @@ public class MengerSpongeWetBlock extends BlockBaseNotFull implements IRenderTyp } @Override - public void onBreak(World world, BlockPos pos, BlockState state, PlayerEntity player) { + public void onBreak(Level world, BlockPos pos, BlockState state, PlayerEntity player) { BlocksHelper.setWithUpdate(world, pos, Blocks.AIR); - if (!world.isClient()) { + if (!world.isClientSide()) { world.syncWorldEvent(2001, pos, getRawIdFromState(state)); } if (world.getGameRules().getBoolean(GameRules.DO_TILE_DROPS) && (player == null || !player.isCreative())) { - ItemEntity drop = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(this)); + ItemEntity drop = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, + new ItemStack(this)); world.spawnEntity(drop); } } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override public FluidState getFluidState(BlockState state) { return Fluids.WATER.getStill(false); diff --git a/src/main/java/ru/betterend/blocks/MissingTileBlock.java b/src/main/java/ru/betterend/blocks/MissingTileBlock.java index 1e361549..a9c7eb5e 100644 --- a/src/main/java/ru/betterend/blocks/MissingTileBlock.java +++ b/src/main/java/ru/betterend/blocks/MissingTileBlock.java @@ -1,7 +1,7 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Blocks; +import net.minecraft.world.level.block.Blocks; import ru.betterend.blocks.basis.BlockBase; public class MissingTileBlock extends BlockBase { diff --git a/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java b/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java index 35e7f49d..fe928885 100644 --- a/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java +++ b/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java @@ -5,17 +5,17 @@ import java.util.List; import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.SnowBlock; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SnowBlock; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.WorldView; import net.minecraft.world.chunk.light.ChunkLightProvider; import ru.betterend.blocks.basis.EndPillarBlock; @@ -25,33 +25,34 @@ public class MossyDragonBoneBlock extends EndPillarBlock { public MossyDragonBoneBlock() { super(FabricBlockSettings.copyOf(Blocks.BONE_BLOCK).hardness(0.5F).ticksRandomly()); } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Collections.singletonList(new ItemStack(this)); } return Collections.singletonList(new ItemStack(EndBlocks.DRAGON_BONE_BLOCK)); } - + @Override - public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { if (random.nextInt(16) == 0 && !canSurvive(state, world, pos)) { - world.setBlockState(pos, Blocks.BONE_BLOCK.getDefaultState().with(AXIS, state.get(AXIS))); + world.setBlockAndUpdate(pos, Blocks.BONE_BLOCK.defaultBlockState().with(AXIS, state.getValue(AXIS))); } } - + public static boolean canSurvive(BlockState state, WorldView worldView, BlockPos pos) { - BlockPos blockPos = pos.up(); - BlockState blockState = worldView.getBlockState(blockPos); - if (blockState.isOf(Blocks.SNOW) && (Integer)blockState.get(SnowBlock.LAYERS) == 1) { - return true; - } else if (blockState.getFluidState().getLevel() == 8) { - return false; - } else { - int i = ChunkLightProvider.getRealisticOpacity(worldView, state, pos, blockState, blockPos, Direction.UP, blockState.getOpacity(worldView, blockPos)); - return i < 5; - } - } + BlockPos blockPos = pos.up(); + BlockState blockState = worldView.getBlockState(blockPos); + if (blockState.is(Blocks.SNOW) && (Integer) blockState.get(SnowBlock.LAYERS) == 1) { + return true; + } else if (blockState.getFluidState().getLevel() == 8) { + return false; + } else { + int i = ChunkLightProvider.getRealisticOpacity(worldView, state, pos, blockState, blockPos, Direction.UP, + blockState.getOpacity(worldView, blockPos)); + return i < 5; + } + } } diff --git a/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java b/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java index 7f635583..bec58eb8 100644 --- a/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java +++ b/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java @@ -2,29 +2,30 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.item.ItemPlacementContext; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.BooleanProperty; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; public class MossyGlowshroomCapBlock extends BlockBase { public static final BooleanProperty TRANSITION = BlockProperties.TRANSITION; - + public MossyGlowshroomCapBlock() { - super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sounds(BlockSoundGroup.WOOD)); - this.setDefaultState(this.stateManager.getDefaultState().with(TRANSITION, false)); - } - - public BlockState getPlacementState(ItemPlacementContext ctx) { - return this.getDefaultState().with(TRANSITION, EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(ctx.getWorld().getBlockState(ctx.getBlockPos().down()))); + super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sounds(SoundType.WOOD)); + this.setDefaultState(this.stateManager.defaultBlockState().with(TRANSITION, false)); } - protected void appendProperties(StateManager.Builder builder) { + public BlockState getPlacementState(ItemPlacementContext ctx) { + return this.defaultBlockState().with(TRANSITION, + EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(ctx.getLevel().getBlockState(ctx.getBlockPos().below()))); + } + + protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(TRANSITION); } } diff --git a/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java b/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java index 24c1ffff..e6d6330e 100644 --- a/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java @@ -1,7 +1,7 @@ package ru.betterend.blocks; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; import net.minecraft.world.WorldView; import net.minecraft.world.gen.feature.Feature; import ru.betterend.blocks.basis.FeatureSaplingBlock; @@ -17,9 +17,10 @@ public class MossyGlowshroomSaplingBlock extends FeatureSaplingBlock { protected Feature getFeature() { return EndFeatures.MOSSY_GLOWSHROOM.getFeature(); } - + @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return world.getBlockState(pos.down()).isOf(EndBlocks.END_MOSS) || world.getBlockState(pos.down()).isOf(EndBlocks.END_MYCELIUM); + return world.getBlockState(pos.below()).is(EndBlocks.END_MOSS) + || world.getBlockState(pos.below()).is(EndBlocks.END_MYCELIUM); } } diff --git a/src/main/java/ru/betterend/blocks/MossyObsidian.java b/src/main/java/ru/betterend/blocks/MossyObsidian.java index 2122c64e..ecb15503 100644 --- a/src/main/java/ru/betterend/blocks/MossyObsidian.java +++ b/src/main/java/ru/betterend/blocks/MossyObsidian.java @@ -5,17 +5,17 @@ import java.util.List; import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.SnowBlock; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SnowBlock; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.WorldView; import net.minecraft.world.chunk.light.ChunkLightProvider; import ru.betterend.blocks.basis.BlockBase; @@ -24,33 +24,34 @@ public class MossyObsidian extends BlockBase { public MossyObsidian() { super(FabricBlockSettings.copyOf(Blocks.OBSIDIAN).hardness(3).ticksRandomly()); } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Collections.singletonList(new ItemStack(this)); } return Collections.singletonList(new ItemStack(Blocks.OBSIDIAN)); } - + @Override - public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { if (random.nextInt(16) == 0 && !canSurvive(state, world, pos)) { - world.setBlockState(pos, Blocks.OBSIDIAN.getDefaultState()); + world.setBlockAndUpdate(pos, Blocks.OBSIDIAN.defaultBlockState()); } } - + public static boolean canSurvive(BlockState state, WorldView worldView, BlockPos pos) { - BlockPos blockPos = pos.up(); - BlockState blockState = worldView.getBlockState(blockPos); - if (blockState.isOf(Blocks.SNOW) && (Integer)blockState.get(SnowBlock.LAYERS) == 1) { - return true; - } else if (blockState.getFluidState().getLevel() == 8) { - return false; - } else { - int i = ChunkLightProvider.getRealisticOpacity(worldView, state, pos, blockState, blockPos, Direction.UP, blockState.getOpacity(worldView, blockPos)); - return i < 5; - } - } + BlockPos blockPos = pos.up(); + BlockState blockState = worldView.getBlockState(blockPos); + if (blockState.is(Blocks.SNOW) && (Integer) blockState.get(SnowBlock.LAYERS) == 1) { + return true; + } else if (blockState.getFluidState().getLevel() == 8) { + return false; + } else { + int i = ChunkLightProvider.getRealisticOpacity(worldView, state, pos, blockState, blockPos, Direction.UP, + blockState.getOpacity(worldView, blockPos)); + return i < 5; + } + } } diff --git a/src/main/java/ru/betterend/blocks/MurkweedBlock.java b/src/main/java/ru/betterend/blocks/MurkweedBlock.java index 6dac38de..f2c7f8b8 100644 --- a/src/main/java/ru/betterend/blocks/MurkweedBlock.java +++ b/src/main/java/ru/betterend/blocks/MurkweedBlock.java @@ -4,42 +4,42 @@ import java.util.Random; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.block.BlockState; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.ai.pathing.NavigationType; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.pathing.NavigationType; +import net.minecraft.world.entity.effect.StatusEffectInstance; +import net.minecraft.world.entity.effect.StatusEffects; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; public class MurkweedBlock extends EndPlantBlock { @Override @Environment(EnvType.CLIENT) - public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { + public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { double x = pos.getX() + random.nextDouble(); double y = pos.getY() + random.nextDouble() * 0.5 + 0.5; double z = pos.getZ() + random.nextDouble(); double v = random.nextDouble() * 0.1; world.addParticle(ParticleTypes.ENTITY_EFFECT, x, y, z, v, v, v); } - + @Override - public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) { + public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { if (entity instanceof LivingEntity && !((LivingEntity) entity).hasStatusEffect(StatusEffects.BLINDNESS)) { ((LivingEntity) entity).addStatusEffect(new StatusEffectInstance(StatusEffects.BLINDNESS, 50)); } } - + @Override protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.SHADOW_GRASS); + return state.is(EndBlocks.SHADOW_GRASS); } - + @Override public boolean canPathfindThrough(BlockState state, BlockView world, BlockPos pos, NavigationType type) { return false; diff --git a/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java b/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java index e55699eb..1b5f83dd 100644 --- a/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java +++ b/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java @@ -5,46 +5,46 @@ import java.util.List; import com.google.common.collect.Lists; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.BlockState; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.ai.pathing.NavigationType; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.pathing.NavigationType; +import net.minecraft.world.entity.damage.DamageSource; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; public class NeedlegrassBlock extends EndPlantBlock { @Override - public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) { + public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { if (entity instanceof LivingEntity) { entity.damage(DamageSource.CACTUS, 0.1F); } } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) || EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) + || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Lists.newArrayList(new ItemStack(this)); - } - else { + } else { return Lists.newArrayList(new ItemStack(Items.STICK, MHelper.randRange(0, 2, MHelper.RANDOM))); } } - + @Override protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.SHADOW_GRASS); + return state.is(EndBlocks.SHADOW_GRASS); } @Override diff --git a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java index b746f5a6..eb3cb7e0 100644 --- a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java +++ b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java @@ -5,28 +5,28 @@ import java.util.EnumMap; import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.Waterloggable; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.level.block.Waterloggable; import net.minecraft.fluid.FluidState; import net.minecraft.fluid.Fluids; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.state.StateManager; +import net.minecraft.world.item.ItemPlacementContext; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.BooleanProperty; import net.minecraft.state.property.DirectionProperty; import net.minecraft.state.property.EnumProperty; import net.minecraft.state.property.Properties; import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Direction.Axis; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockView; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.BlockBaseNotFull; import ru.betterend.client.render.ERenderLayer; @@ -37,37 +37,40 @@ public class NeonCactusBlock extends BlockBaseNotFull implements Waterloggable, public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; public static final DirectionProperty FACING = Properties.FACING; - + private static final EnumMap MEDIUM_SHAPES_OPEN = Maps.newEnumMap(Direction.class); private static final EnumMap SMALL_SHAPES_OPEN = Maps.newEnumMap(Direction.class); private static final EnumMap MEDIUM_SHAPES = Maps.newEnumMap(Axis.class); private static final EnumMap SMALL_SHAPES = Maps.newEnumMap(Axis.class); - + public NeonCactusBlock() { super(FabricBlockSettings.copyOf(Blocks.CACTUS).luminance(state -> { - TripleShape shape = state.get(SHAPE); + TripleShape shape = state.getValue(SHAPE); if (shape == TripleShape.TOP) { return 15; } return shape == TripleShape.MIDDLE ? 13 : 10; })); - setDefaultState(getDefaultState().with(WATERLOGGED, false).with(FACING, Direction.UP).with(SHAPE, TripleShape.TOP)); + setDefaultState( + getDefaultState().with(WATERLOGGED, false).with(FACING, Direction.UP).with(SHAPE, TripleShape.TOP)); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE, WATERLOGGED, FACING); } - + @Override public BlockState getPlacementState(ItemPlacementContext ctx) { - WorldAccess worldAccess = ctx.getWorld(); + LevelAccessor worldAccess = ctx.getLevel(); BlockPos blockPos = ctx.getBlockPos(); - return this.getDefaultState().with(WATERLOGGED, worldAccess.getFluidState(blockPos).getFluid() == Fluids.WATER).with(FACING, ctx.getSide()); + return this.defaultBlockState() + .with(WATERLOGGED, worldAccess.getFluidState(blockPos).getFluid() == Fluids.WATER) + .with(FACING, ctx.getSide()); } - + @Override - public BlockState rotate(BlockState state, BlockRotation rotation) { + public BlockState rotate(BlockState state, Rotation rotation) { return BlocksHelper.rotateHorizontal(state, rotation, FACING); } @@ -75,64 +78,64 @@ public class NeonCactusBlock extends BlockBaseNotFull implements Waterloggable, public BlockState mirror(BlockState state, BlockMirror mirror) { return BlocksHelper.mirrorHorizontal(state, mirror, FACING); } - + @Override public FluidState getFluidState(BlockState state) { - return (Boolean) state.get(WATERLOGGED) ? Fluids.WATER.getStill(false) : super.getFluidState(state); + return (Boolean) state.getValue(WATERLOGGED) ? Fluids.WATER.getStill(false) : super.getFluidState(state); } - + @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState newState, WorldAccess world, BlockPos pos, BlockPos posFrom) { - if ((Boolean) state.get(WATERLOGGED)) { + public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, + BlockPos pos, BlockPos posFrom) { + if ((Boolean) state.getValue(WATERLOGGED)) { world.getFluidTickScheduler().schedule(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); } return state; } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - TripleShape shape = state.get(SHAPE); - + TripleShape shape = state.getValue(SHAPE); + if (shape == TripleShape.BOTTOM) { return VoxelShapes.fullCube(); } - Direction dir = state.get(FACING); - BlockState next = view.getBlockState(pos.offset(dir)); - if (next.isOf(this)) { + Direction dir = state.getValue(FACING); + BlockState next = view.getBlockState(pos.relative(dir)); + if (next.is(this)) { Axis axis = dir.getAxis(); return shape == TripleShape.MIDDLE ? MEDIUM_SHAPES.get(axis) : SMALL_SHAPES.get(axis); - } - else { + } else { return shape == TripleShape.MIDDLE ? MEDIUM_SHAPES_OPEN.get(dir) : SMALL_SHAPES_OPEN.get(dir); } } - + static { MEDIUM_SHAPES.put(Axis.X, Block.createCuboidShape(0, 2, 2, 16, 14, 14)); MEDIUM_SHAPES.put(Axis.Y, Block.createCuboidShape(2, 0, 2, 14, 16, 14)); MEDIUM_SHAPES.put(Axis.Z, Block.createCuboidShape(2, 2, 0, 14, 14, 16)); - + SMALL_SHAPES.put(Axis.X, Block.createCuboidShape(0, 4, 4, 16, 12, 12)); SMALL_SHAPES.put(Axis.Y, Block.createCuboidShape(4, 0, 4, 12, 16, 12)); SMALL_SHAPES.put(Axis.Z, Block.createCuboidShape(4, 4, 0, 12, 12, 16)); - - MEDIUM_SHAPES_OPEN.put(Direction.UP, Block.createCuboidShape(2, 0, 2, 14, 14, 14)); - MEDIUM_SHAPES_OPEN.put(Direction.DOWN, Block.createCuboidShape(2, 2, 2, 14, 16, 14)); + + MEDIUM_SHAPES_OPEN.put(Direction.UP, Block.createCuboidShape(2, 0, 2, 14, 14, 14)); + MEDIUM_SHAPES_OPEN.put(Direction.DOWN, Block.createCuboidShape(2, 2, 2, 14, 16, 14)); MEDIUM_SHAPES_OPEN.put(Direction.NORTH, Block.createCuboidShape(2, 2, 2, 14, 14, 16)); MEDIUM_SHAPES_OPEN.put(Direction.SOUTH, Block.createCuboidShape(2, 2, 0, 14, 14, 14)); - MEDIUM_SHAPES_OPEN.put(Direction.WEST, Block.createCuboidShape(2, 2, 2, 16, 14, 14)); - MEDIUM_SHAPES_OPEN.put(Direction.EAST, Block.createCuboidShape(0, 2, 2, 14, 14, 14)); - - SMALL_SHAPES_OPEN.put(Direction.UP, Block.createCuboidShape(4, 0, 4, 12, 12, 12)); - SMALL_SHAPES_OPEN.put(Direction.DOWN, Block.createCuboidShape(4, 4, 4, 12, 16, 12)); + MEDIUM_SHAPES_OPEN.put(Direction.WEST, Block.createCuboidShape(2, 2, 2, 16, 14, 14)); + MEDIUM_SHAPES_OPEN.put(Direction.EAST, Block.createCuboidShape(0, 2, 2, 14, 14, 14)); + + SMALL_SHAPES_OPEN.put(Direction.UP, Block.createCuboidShape(4, 0, 4, 12, 12, 12)); + SMALL_SHAPES_OPEN.put(Direction.DOWN, Block.createCuboidShape(4, 4, 4, 12, 16, 12)); SMALL_SHAPES_OPEN.put(Direction.NORTH, Block.createCuboidShape(4, 4, 4, 12, 12, 16)); SMALL_SHAPES_OPEN.put(Direction.SOUTH, Block.createCuboidShape(4, 4, 0, 12, 12, 12)); - SMALL_SHAPES_OPEN.put(Direction.WEST, Block.createCuboidShape(4, 4, 4, 16, 12, 12)); - SMALL_SHAPES_OPEN.put(Direction.EAST, Block.createCuboidShape(0, 4, 4, 12, 12, 12)); + SMALL_SHAPES_OPEN.put(Direction.WEST, Block.createCuboidShape(4, 4, 4, 16, 12, 12)); + SMALL_SHAPES_OPEN.put(Direction.EAST, Block.createCuboidShape(0, 4, 4, 12, 12, 12)); } } diff --git a/src/main/java/ru/betterend/blocks/PedestalVanilla.java b/src/main/java/ru/betterend/blocks/PedestalVanilla.java index b7848ce1..a25460c1 100644 --- a/src/main/java/ru/betterend/blocks/PedestalVanilla.java +++ b/src/main/java/ru/betterend/blocks/PedestalVanilla.java @@ -3,9 +3,9 @@ package ru.betterend.blocks; import java.util.HashMap; import java.util.Map; -import net.minecraft.block.Block; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.patterns.Patterns; @@ -14,15 +14,15 @@ public class PedestalVanilla extends PedestalBlock { public PedestalVanilla(Block parent) { super(parent); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(parent); String name = blockId.getPath().replace("_block", ""); Map textures = new HashMap() { private static final long serialVersionUID = 1L; { - put("%mod%", blockId.getNamespace() ); + put("%mod%", blockId.getNamespace()); put("%top%", "polished_" + name); put("%base%", "polished_" + name); put("%pillar%", name + "_pillar"); diff --git a/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java b/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java index 40926215..fbb7dddd 100644 --- a/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java @@ -1,7 +1,7 @@ package ru.betterend.blocks; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; import net.minecraft.world.WorldView; import net.minecraft.world.gen.feature.Feature; import ru.betterend.blocks.basis.FeatureSaplingBlock; @@ -17,9 +17,9 @@ public class PythadendronSaplingBlock extends FeatureSaplingBlock { protected Feature getFeature() { return EndFeatures.PYTHADENDRON_TREE.getFeature(); } - + @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return world.getBlockState(pos.down()).isOf(EndBlocks.CHORUS_NYLIUM); + return world.getBlockState(pos.below()).is(EndBlocks.CHORUS_NYLIUM); } } diff --git a/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java b/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java index 269ddc43..c69410ab 100644 --- a/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java +++ b/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java @@ -7,33 +7,33 @@ import org.jetbrains.annotations.Nullable; import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.ShapeContext; -import net.minecraft.client.color.block.BlockColorProvider; -import net.minecraft.client.color.item.ItemColorProvider; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.state.StateManager; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.client.color.block.BlockColor; +import net.minecraft.client.color.item.ItemColor; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.EnumProperty; import net.minecraft.text.TranslatableText; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.BlockBase; @@ -49,25 +49,25 @@ import ru.betterend.util.MHelper; public class RespawnObeliskBlock extends BlockBase implements IColorProvider, IRenderTypeable { private static final VoxelShape VOXEL_SHAPE_BOTTOM = Block.createCuboidShape(1, 0, 1, 15, 16, 15); private static final VoxelShape VOXEL_SHAPE_MIDDLE_TOP = Block.createCuboidShape(2, 0, 2, 14, 16, 14); - + public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; - + public RespawnObeliskBlock() { super(FabricBlockSettings.copyOf(Blocks.END_STONE).luminance((state) -> { - return (state.get(SHAPE) == TripleShape.BOTTOM) ? 0 : 15; + return (state.getValue(SHAPE) == TripleShape.BOTTOM) ? 0 : 15; })); } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return (state.get(SHAPE) == TripleShape.BOTTOM) ? VOXEL_SHAPE_BOTTOM : VOXEL_SHAPE_MIDDLE_TOP; + return (state.getValue(SHAPE) == TripleShape.BOTTOM) ? VOXEL_SHAPE_BOTTOM : VOXEL_SHAPE_MIDDLE_TOP; } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE); } - + @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { for (int i = 0; i < 3; i++) { @@ -77,64 +77,59 @@ public class RespawnObeliskBlock extends BlockBase implements IColorProvider, IR } return true; } - + @Override - public void onPlaced(World world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack itemStack) { - state = this.getDefaultState(); + public void onPlaced(Level world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, + ItemStack itemStack) { + state = this.defaultBlockState(); BlocksHelper.setWithUpdate(world, pos, state.with(SHAPE, TripleShape.BOTTOM)); BlocksHelper.setWithUpdate(world, pos.up(), state.with(SHAPE, TripleShape.MIDDLE)); BlocksHelper.setWithUpdate(world, pos.up(2), state.with(SHAPE, TripleShape.TOP)); } - + @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { - TripleShape shape = state.get(SHAPE); + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, + BlockPos pos, BlockPos neighborPos) { + TripleShape shape = state.getValue(SHAPE); if (shape == TripleShape.BOTTOM) { - if (world.getBlockState(pos.up()).isOf(this)) { + if (world.getBlockState(pos.up()).is(this)) { return state; + } else { + return Blocks.AIR.defaultBlockState(); } - else { - return Blocks.AIR.getDefaultState(); - } - } - else if (shape == TripleShape.MIDDLE) { - if (world.getBlockState(pos.up()).isOf(this) && world.getBlockState(pos.down()).isOf(this)) { + } else if (shape == TripleShape.MIDDLE) { + if (world.getBlockState(pos.up()).is(this) && world.getBlockState(pos.below()).is(this)) { return state; + } else { + return Blocks.AIR.defaultBlockState(); } - else { - return Blocks.AIR.getDefaultState(); - } - } - else { - if (world.getBlockState(pos.down()).isOf(this)) { + } else { + if (world.getBlockState(pos.below()).is(this)) { return state; - } - else { - return Blocks.AIR.getDefaultState(); + } else { + return Blocks.AIR.defaultBlockState(); } } } - + @Override - public void onBreak(World world, BlockPos pos, BlockState state, PlayerEntity player) { + public void onBreak(Level world, BlockPos pos, BlockState state, PlayerEntity player) { if (player.isCreative()) { - TripleShape shape = state.get(SHAPE); + TripleShape shape = state.getValue(SHAPE); if (shape == TripleShape.MIDDLE) { - BlocksHelper.setWithUpdate(world, pos.down(), Blocks.AIR); - } - else if (shape == TripleShape.TOP) { + BlocksHelper.setWithUpdate(world, pos.below(), Blocks.AIR); + } else if (shape == TripleShape.TOP) { BlocksHelper.setWithUpdate(world, pos.down(2), Blocks.AIR); } } super.onBreak(world, pos, state, player); } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - if (state.get(SHAPE) == TripleShape.BOTTOM) { + public List getDrops(BlockState state, LootContext.Builder builder) { + if (state.getValue(SHAPE) == TripleShape.BOTTOM) { return Lists.newArrayList(new ItemStack(this)); - } - else { + } else { return Lists.newArrayList(); } } @@ -143,60 +138,59 @@ public class RespawnObeliskBlock extends BlockBase implements IColorProvider, IR public ERenderLayer getRenderLayer() { return ERenderLayer.TRANSLUCENT; } - + @Override - public BlockColorProvider getProvider() { - return ((IColorProvider) EndBlocks.AURORA_CRYSTAL).getProvider(); + public BlockColor getBlockProvider() { + return ((IColorProvider) EndBlocks.AURORA_CRYSTAL).getBlockProvider(); } - + @Override - public ItemColorProvider getItemProvider() { + public ItemColor getItemProvider() { return (stack, tintIndex) -> { return MHelper.color(255, 255, 255); }; } @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + public ActionResult onUse(BlockState state, Level world, BlockPos pos, PlayerEntity player, Hand hand, + BlockHitResult hit) { ItemStack itemStack = player.getStackInHand(hand); boolean canActivate = itemStack.getItem() == EndItems.AMBER_GEM && itemStack.getCount() > 5; if (hand != Hand.MAIN_HAND || !canActivate) { - if (!world.isClient && !(itemStack.getItem() instanceof BlockItem) && !player.isCreative()) { - ServerPlayerEntity serverPlayerEntity = (ServerPlayerEntity) player; + if (!world.isClientSide && !(itemStack.getItem() instanceof BlockItem) && !player.isCreative()) { + ServerPlayer serverPlayerEntity = (ServerPlayer) player; serverPlayerEntity.sendMessage(new TranslatableText("message.betterend.fail_spawn"), true); } return ActionResult.FAIL; - } - else if (!world.isClient) { - ServerPlayerEntity serverPlayerEntity = (ServerPlayerEntity) player; - serverPlayerEntity.setSpawnPoint(world.getRegistryKey(), pos, 0.0F, false, false); + } else if (!world.isClientSide) { + ServerPlayer serverPlayerEntity = (ServerPlayer) player; + serverPlayerEntity.setSpawnPoint(world.dimension(), pos, 0.0F, false, false); serverPlayerEntity.sendMessage(new TranslatableText("message.betterend.set_spawn"), true); double px = pos.getX() + 0.5; double py = pos.getY() + 0.5; double pz = pos.getZ() + 0.5; InfusionParticleType particle = new InfusionParticleType(new ItemStack(EndItems.AMBER_GEM)); - if (world instanceof ServerWorld) { + if (world instanceof ServerLevel) { double py1 = py; double py2 = py - 0.2; - if (state.get(SHAPE) == TripleShape.BOTTOM) { + if (state.getValue(SHAPE) == TripleShape.BOTTOM) { py1 += 1; py2 += 2; - } - else if (state.get(SHAPE) == TripleShape.MIDDLE) { + } else if (state.getValue(SHAPE) == TripleShape.MIDDLE) { py1 += 0; py2 += 1; - } - else { + } else { py1 -= 2; } - ((ServerWorld) world).spawnParticles(particle, px, py1, pz, 20, 0.14, 0.5, 0.14, 0.1); - ((ServerWorld) world).spawnParticles(particle, px, py2, pz, 20, 0.14, 0.3, 0.14, 0.1); + ((ServerLevel) world).sendParticles(particle, px, py1, pz, 20, 0.14, 0.5, 0.14, 0.1); + ((ServerLevel) world).sendParticles(particle, px, py2, pz, 20, 0.14, 0.3, 0.14, 0.1); + } + world.playLocalSound(null, px, py, py, SoundEvents.BLOCK_RESPAWN_ANCHOR_SET_SPAWN, SoundSource.BLOCKS, 1F, + 1F); + if (!player.isCreative()) { + itemStack.decrement(6); } - world.playSound(null, px, py, py, SoundEvents.BLOCK_RESPAWN_ANCHOR_SET_SPAWN, SoundCategory.BLOCKS, 1F, 1F); - if (!player.isCreative()) { - itemStack.decrement(6); - } } - return player.isCreative() ? ActionResult.PASS : ActionResult.success(world.isClient); + return player.isCreative() ? ActionResult.PASS : ActionResult.success(world.isClientSide); } } diff --git a/src/main/java/ru/betterend/blocks/RunedFlavolite.java b/src/main/java/ru/betterend/blocks/RunedFlavolite.java index 9e4b18d4..d1f66d6a 100644 --- a/src/main/java/ru/betterend/blocks/RunedFlavolite.java +++ b/src/main/java/ru/betterend/blocks/RunedFlavolite.java @@ -1,10 +1,10 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.state.StateManager; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.BooleanProperty; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; @@ -13,14 +13,15 @@ public class RunedFlavolite extends BlockBase { public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; public RunedFlavolite() { - super(FabricBlockSettings.copyOf(EndBlocks.FLAVOLITE.polished).resistance(Blocks.OBSIDIAN.getBlastResistance()).luminance(state -> { - return state.get(ACTIVATED) ? 8 : 0; - })); - this.setDefaultState(stateManager.getDefaultState().with(ACTIVATED, false)); + super(FabricBlockSettings.copyOf(EndBlocks.FLAVOLITE.polished) + .resistance(Blocks.OBSIDIAN.getExplosionResistance()).luminance(state -> { + return state.getValue(ACTIVATED) ? 8 : 0; + })); + this.setDefaultState(stateManager.defaultBlockState().with(ACTIVATED, false)); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(ACTIVATED); } } diff --git a/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java b/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java index 28851136..781fbdf6 100644 --- a/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java +++ b/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java @@ -1,22 +1,22 @@ package ru.betterend.blocks; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.ShapeContext; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.core.BlockPos; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; +import net.minecraft.world.level.BlockGetter; import ru.betterend.blocks.basis.EndCropBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; public class ShadowBerryBlock extends EndCropBlock { private static final VoxelShape SHAPE = Block.createCuboidShape(1, 0, 1, 15, 8, 15); - + public ShadowBerryBlock() { super(EndItems.SHADOW_BERRY_RAW, EndBlocks.SHADOW_GRASS); } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { return SHAPE; diff --git a/src/main/java/ru/betterend/blocks/ShadowGrassBlock.java b/src/main/java/ru/betterend/blocks/ShadowGrassBlock.java index 20ca5978..a9b1c26f 100644 --- a/src/main/java/ru/betterend/blocks/ShadowGrassBlock.java +++ b/src/main/java/ru/betterend/blocks/ShadowGrassBlock.java @@ -4,22 +4,23 @@ import java.util.Random; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.block.BlockState; -import net.minecraft.block.MaterialColor; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; import ru.betterend.registry.EndParticles; public class ShadowGrassBlock extends EndTerrainBlock { public ShadowGrassBlock() { - super(MaterialColor.BLACK); + super(MaterialColor.COLOR_BLACK); } @Environment(EnvType.CLIENT) - public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { - super.randomDisplayTick(state, world, pos, random); + public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { + super.animateTick(state, world, pos, random); if (random.nextInt(32) == 0) { - world.addParticle(EndParticles.BLACK_SPORE, (double) pos.getX() + random.nextDouble(), (double) pos.getY() + 1.1D, (double) pos.getZ() + random.nextDouble(), 0.0D, 0.0D, 0.0D); + world.addParticle(EndParticles.BLACK_SPORE, (double) pos.getX() + random.nextDouble(), + (double) pos.getY() + 1.1D, (double) pos.getZ() + random.nextDouble(), 0.0D, 0.0D, 0.0D); } } } diff --git a/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java b/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java index a2cc925e..2c09ec3e 100644 --- a/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java +++ b/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java @@ -4,31 +4,31 @@ import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.entity.ItemEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.state.StateManager; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.entity.ItemEntity; +import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.item.ItemPlacementContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.sounds.SoundSource; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.DirectionProperty; -import net.minecraft.state.property.IntProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; import net.minecraft.state.property.Properties; import net.minecraft.util.ActionResult; import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; +import net.minecraft.world.level.block.Rotation; import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.util.math.Box; -import net.minecraft.util.math.Direction; +import net.minecraft.core.Direction; import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.entity.SilkMothEntity; import ru.betterend.registry.EndEntities; @@ -38,26 +38,27 @@ import ru.betterend.util.MHelper; public class SilkMothHiveBlock extends BlockBase { public static final DirectionProperty FACING = Properties.HORIZONTAL_FACING; - public static final IntProperty FULLNESS = BlockProperties.FULLNESS; - + public static final IntegerProperty FULLNESS = BlockProperties.FULLNESS; + public SilkMothHiveBlock() { - super(FabricBlockSettings.of(Material.WOOD).hardness(0.5F).resistance(0.1F).sounds(BlockSoundGroup.WOOL).nonOpaque().ticksRandomly().breakByHand(true)); + super(FabricBlockSettings.of(Material.WOOD).hardness(0.5F).resistance(0.1F).sounds(SoundType.WOOL).nonOpaque() + .ticksRandomly().breakByHand(true)); this.setDefaultState(getDefaultState().with(FULLNESS, 0)); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(FACING, FULLNESS); } - + @Override public BlockState getPlacementState(ItemPlacementContext ctx) { Direction dir = ctx.getPlayerFacing().getOpposite(); - return this.getDefaultState().with(FACING, dir); + return this.defaultBlockState().with(FACING, dir); } - + @Override - public BlockState rotate(BlockState state, BlockRotation rotation) { + public BlockState rotate(BlockState state, Rotation rotation) { return BlocksHelper.rotateHorizontal(state, rotation, FACING); } @@ -65,15 +66,17 @@ public class SilkMothHiveBlock extends BlockBase { public BlockState mirror(BlockState state, BlockMirror mirror) { return BlocksHelper.mirrorHorizontal(state, mirror, FACING); } - + @Override - public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { - Direction dir = state.get(FACING); - BlockPos spawn = pos.offset(dir); + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + Direction dir = state.getValue(FACING); + BlockPos spawn = pos.relative(dir); if (!world.getBlockState(spawn).isAir()) { return; } - int count = world.getEntitiesByType(EndEntities.SILK_MOTH, new Box(pos).expand(16), (entity) -> { return true; }).size(); + int count = world.getEntitiesByType(EndEntities.SILK_MOTH, new Box(pos).expand(16), (entity) -> { + return true; + }).size(); if (count > 6) { return; } @@ -82,16 +85,17 @@ public class SilkMothHiveBlock extends BlockBase { moth.setVelocity(new Vec3d(dir.getOffsetX() * 0.4, 0, dir.getOffsetZ() * 0.4)); moth.setHive(world, pos); world.spawnEntity(moth); - world.playSound(null, pos, SoundEvents.BLOCK_BEEHIVE_EXIT, SoundCategory.BLOCKS, 1, 1); + world.playLocalSound(null, pos, SoundEvents.BLOCK_BEEHIVE_EXIT, SoundSource.BLOCKS, 1, 1); } - + @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + public ActionResult onUse(BlockState state, Level world, BlockPos pos, PlayerEntity player, Hand hand, + BlockHitResult hit) { if (hand == Hand.MAIN_HAND) { ItemStack stack = player.getMainHandStack(); - if (stack.getItem().isIn(FabricToolTags.SHEARS) && state.get(FULLNESS) == 3) { + if (stack.getItem().isIn(FabricToolTags.SHEARS) && state.getValue(FULLNESS) == 3) { BlocksHelper.setWithUpdate(world, pos, state.with(FULLNESS, 0)); - Direction dir = state.get(FACING); + Direction dir = state.getValue(FACING); double px = pos.getX() + dir.getOffsetX() + 0.5; double py = pos.getY() + dir.getOffsetY() + 0.5; double pz = pos.getZ() + dir.getOffsetZ() + 0.5; diff --git a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java index 09a3a197..3feee50d 100644 --- a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java +++ b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java @@ -6,39 +6,39 @@ import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.entity.ItemEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.state.StateManager; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.entity.ItemEntity; +import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.item.ItemPlacementContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.sounds.SoundSource; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.BooleanProperty; import net.minecraft.state.property.DirectionProperty; -import net.minecraft.state.property.IntProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; import net.minecraft.state.property.Properties; -import net.minecraft.tag.BlockTags; +import net.minecraft.tags.BlockTags; import net.minecraft.util.ActionResult; import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; +import net.minecraft.world.level.block.Rotation; import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.util.math.Box; -import net.minecraft.util.math.Direction; +import net.minecraft.core.Direction; import net.minecraft.util.math.Vec3d; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.client.render.ERenderLayer; import ru.betterend.entity.SilkMothEntity; @@ -51,51 +51,53 @@ import ru.betterend.util.MHelper; public class SilkMothNestBlock extends BlockBase implements IRenderTypeable { public static final BooleanProperty ACTIVE = BlockProperties.ACTIVE; public static final DirectionProperty FACING = Properties.HORIZONTAL_FACING; - public static final IntProperty FULLNESS = BlockProperties.FULLNESS; + public static final IntegerProperty FULLNESS = BlockProperties.FULLNESS; private static final VoxelShape TOP = createCuboidShape(6, 0, 6, 10, 16, 10); private static final VoxelShape BOTTOM = createCuboidShape(0, 0, 0, 16, 16, 16); - + public SilkMothNestBlock() { - super(FabricBlockSettings.of(Material.WOOL).hardness(0.5F).resistance(0.1F).sounds(BlockSoundGroup.WOOL).nonOpaque().ticksRandomly()); + super(FabricBlockSettings.of(Material.WOOL).hardness(0.5F).resistance(0.1F).sounds(SoundType.WOOL).nonOpaque() + .ticksRandomly()); this.setDefaultState(getDefaultState().with(ACTIVE, true).with(FULLNESS, 0)); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(ACTIVE, FACING, FULLNESS); } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return state.get(ACTIVE) ? BOTTOM : TOP; + return state.getValue(ACTIVE) ? BOTTOM : TOP; } @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override public BlockState getPlacementState(ItemPlacementContext ctx) { Direction dir = ctx.getPlayerFacing().getOpposite(); - return this.getDefaultState().with(FACING, dir); + return this.defaultBlockState().with(FACING, dir); } - + @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { - if (!state.get(ACTIVE)) { - if (sideCoversSmallSquare(world, pos.up(), Direction.DOWN) || world.getBlockState(pos.up()).isIn(BlockTags.LEAVES)) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, + BlockPos pos, BlockPos neighborPos) { + if (!state.getValue(ACTIVE)) { + if (sideCoversSmallSquare(world, pos.up(), Direction.DOWN) + || world.getBlockState(pos.up()).isIn(BlockTags.LEAVES)) { return state; - } - else { - return Blocks.AIR.getDefaultState(); + } else { + return Blocks.AIR.defaultBlockState(); } } return state; } - + @Override - public BlockState rotate(BlockState state, BlockRotation rotation) { + public BlockState rotate(BlockState state, Rotation rotation) { return BlocksHelper.rotateHorizontal(state, rotation, FACING); } @@ -103,38 +105,40 @@ public class SilkMothNestBlock extends BlockBase implements IRenderTypeable { public BlockState mirror(BlockState state, BlockMirror mirror) { return BlocksHelper.mirrorHorizontal(state, mirror, FACING); } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - return state.get(ACTIVE) ? Collections.singletonList(new ItemStack(this)) : Collections.emptyList(); + public List getDrops(BlockState state, LootContext.Builder builder) { + return state.getValue(ACTIVE) ? Collections.singletonList(new ItemStack(this)) : Collections.emptyList(); } - + @Override - public void onBreak(World world, BlockPos pos, BlockState state, PlayerEntity player) { - if (!state.get(ACTIVE) && player.isCreative()) { - BlocksHelper.setWithUpdate(world, pos.down(), Blocks.AIR); + public void onBreak(Level world, BlockPos pos, BlockState state, PlayerEntity player) { + if (!state.getValue(ACTIVE) && player.isCreative()) { + BlocksHelper.setWithUpdate(world, pos.below(), Blocks.AIR); } BlockState up = world.getBlockState(pos.up()); - if (up.isOf(this) && !up.get(ACTIVE)) { + if (up.is(this) && !up.get(ACTIVE)) { BlocksHelper.setWithUpdate(world, pos.up(), Blocks.AIR); } super.onBreak(world, pos, state, player); } - + @Override - public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { - if (!state.get(ACTIVE)) { + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + if (!state.getValue(ACTIVE)) { return; } if (random.nextBoolean()) { return; } - Direction dir = state.get(FACING); - BlockPos spawn = pos.offset(dir); + Direction dir = state.getValue(FACING); + BlockPos spawn = pos.relative(dir); if (!world.getBlockState(spawn).isAir()) { return; } - int count = world.getEntitiesByType(EndEntities.SILK_MOTH, new Box(pos).expand(16), (entity) -> { return true; }).size(); + int count = world.getEntitiesByType(EndEntities.SILK_MOTH, new Box(pos).expand(16), (entity) -> { + return true; + }).size(); if (count > 6) { return; } @@ -143,16 +147,18 @@ public class SilkMothNestBlock extends BlockBase implements IRenderTypeable { moth.setVelocity(new Vec3d(dir.getOffsetX() * 0.4, 0, dir.getOffsetZ() * 0.4)); moth.setHive(world, pos); world.spawnEntity(moth); - world.playSound(null, pos, SoundEvents.BLOCK_BEEHIVE_EXIT, SoundCategory.BLOCKS, 1, 1); + world.playLocalSound(null, pos, SoundEvents.BLOCK_BEEHIVE_EXIT, SoundSource.BLOCKS, 1, 1); } - + @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + public ActionResult onUse(BlockState state, Level world, BlockPos pos, PlayerEntity player, Hand hand, + BlockHitResult hit) { if (hand == Hand.MAIN_HAND) { ItemStack stack = player.getMainHandStack(); - if (stack.getItem().isIn(FabricToolTags.SHEARS) && state.get(ACTIVE) && state.get(FULLNESS) == 3) { + if (stack.getItem().isIn(FabricToolTags.SHEARS) && state.getValue(ACTIVE) + && state.getValue(FULLNESS) == 3) { BlocksHelper.setWithUpdate(world, pos, state.with(FULLNESS, 0)); - Direction dir = state.get(FACING); + Direction dir = state.getValue(FACING); double px = pos.getX() + dir.getOffsetX() + 0.5; double py = pos.getY() + dir.getOffsetY() + 0.5; double pz = pos.getZ() + dir.getOffsetZ() + 0.5; diff --git a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java index aff0ad4c..9d3092fe 100644 --- a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java +++ b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java @@ -2,16 +2,16 @@ package ru.betterend.blocks; import java.util.Random; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.ShapeContext; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.core.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; @@ -19,14 +19,15 @@ import ru.betterend.util.BlocksHelper; public class SmallAmaranitaBlock extends EndPlantBlock { private static final VoxelShape SHAPE = Block.createCuboidShape(4, 0, 4, 12, 10, 12); - + @Override protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.SANGNUM) || state.isOf(EndBlocks.MOSSY_OBSIDIAN) || state.isOf(EndBlocks.MOSSY_DRAGON_BONE); + return state.is(EndBlocks.SANGNUM) || state.is(EndBlocks.MOSSY_OBSIDIAN) + || state.is(EndBlocks.MOSSY_DRAGON_BONE); } - + @Override - public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { + public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { BlockPos bigPos = growBig(world, pos); if (bigPos != null) { if (EndFeatures.GIGANTIC_AMARANITA.getFeature().generate(world, null, random, bigPos, null)) { @@ -39,17 +40,17 @@ public class SmallAmaranitaBlock extends EndPlantBlock { } EndFeatures.LARGE_AMARANITA.getFeature().generate(world, null, random, pos, null); } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { Vec3d vec3d = state.getModelOffset(view, pos); return SHAPE.offset(vec3d.x, vec3d.y, vec3d.z); } - - private BlockPos growBig(ServerWorld world, BlockPos pos) { + + private BlockPos growBig(ServerLevel world, BlockPos pos) { for (int x = -1; x < 2; x++) { for (int z = -1; z < 2; z++) { - BlockPos p = pos.add(x, 0, z); + BlockPos p = pos.offset(x, 0, z); if (checkFrame(world, p)) { return p; } @@ -57,22 +58,20 @@ public class SmallAmaranitaBlock extends EndPlantBlock { } return null; } - - private boolean checkFrame(ServerWorld world, BlockPos pos) { - return world.getBlockState(pos).isOf(this) && - world.getBlockState(pos.south()).isOf(this) && - world.getBlockState(pos.east()).isOf(this) && - world.getBlockState(pos.south().east()).isOf(this); + + private boolean checkFrame(ServerLevel world, BlockPos pos) { + return world.getBlockState(pos).is(this) && world.getBlockState(pos.south()).is(this) + && world.getBlockState(pos.east()).is(this) && world.getBlockState(pos.south().east()).is(this); } - - private void replaceMushroom(ServerWorld world, BlockPos pos) { - if (world.getBlockState(pos).isOf(this)) { + + private void replaceMushroom(ServerLevel world, BlockPos pos) { + if (world.getBlockState(pos).is(this)) { BlocksHelper.setWithUpdate(world, pos, Blocks.AIR); } } - + @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { + public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { return random.nextInt(8) == 0; } } diff --git a/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java b/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java index 01b16b4c..4432dd5c 100644 --- a/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java +++ b/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java @@ -9,25 +9,25 @@ import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Fertilizable; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Fertilizable; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; import net.minecraft.world.WorldView; import ru.betterend.blocks.basis.AttachedBlock; import ru.betterend.client.render.ERenderLayer; @@ -38,44 +38,41 @@ import ru.betterend.util.BlocksHelper; public class SmallJellyshroomBlock extends AttachedBlock implements IRenderTypeable, Fertilizable { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); - + public SmallJellyshroomBlock() { - super(FabricBlockSettings.of(Material.PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.NETHER_WART) - .breakByHand(true) - .noCollision()); + super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).sounds(SoundType.NETHER_WART) + .breakByHand(true).noCollision()); } @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return BOUNDING_SHAPES.get(state.get(FACING)); + return BOUNDING_SHAPES.get(state.getValue(FACING)); } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) || EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) + || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Lists.newArrayList(new ItemStack(this)); - } - else { + } else { return Lists.newArrayList(); } } - + @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - Direction direction = state.get(FACING); - BlockPos blockPos = pos.offset(direction.getOpposite()); + Direction direction = state.getValue(FACING); + BlockPos blockPos = pos.relative(direction.getOpposite()); BlockState support = world.getBlockState(blockPos); return sideCoversSmallSquare(world, blockPos, direction) && support.isOpaque() && support.getLuminance() == 0; } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + static { BOUNDING_SHAPES.put(Direction.UP, Block.createCuboidShape(3, 0, 3, 13, 16, 13)); BOUNDING_SHAPES.put(Direction.DOWN, Block.createCuboidShape(3, 0, 3, 13, 16, 13)); @@ -87,16 +84,16 @@ public class SmallJellyshroomBlock extends AttachedBlock implements IRenderTypea @Override public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { - return state.get(FACING) == Direction.UP && world.getBlockState(pos.down()).isIn(EndTags.END_GROUND); + return state.getValue(FACING) == Direction.UP && world.getBlockState(pos.below()).isIn(EndTags.END_GROUND); } @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { + public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { return random.nextInt(16) == 0; } @Override - public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { + public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { BlocksHelper.setWithUpdate(world, pos, Blocks.AIR); EndFeatures.JELLYSHROOM.getFeature().generate(world, null, random, pos, null); } diff --git a/src/main/java/ru/betterend/blocks/SmaragdantCrystalBlock.java b/src/main/java/ru/betterend/blocks/SmaragdantCrystalBlock.java index 8b5fa12e..cdd80120 100644 --- a/src/main/java/ru/betterend/blocks/SmaragdantCrystalBlock.java +++ b/src/main/java/ru/betterend/blocks/SmaragdantCrystalBlock.java @@ -2,18 +2,13 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Material; -import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.SoundType; import ru.betterend.blocks.basis.EndPillarBlock; public class SmaragdantCrystalBlock extends EndPillarBlock { public SmaragdantCrystalBlock() { - super(FabricBlockSettings.of(Material.GLASS) - .breakByTool(FabricToolTags.PICKAXES) - .sounds(BlockSoundGroup.GLASS) - .luminance(15) - .hardness(1F) - .resistance(1F) - .nonOpaque()); + super(FabricBlockSettings.of(Material.GLASS).breakByTool(FabricToolTags.PICKAXES).sounds(SoundType.GLASS) + .luminance(15).hardness(1F).resistance(1F).nonOpaque()); } } diff --git a/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java b/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java index 69b88741..b15ac81c 100644 --- a/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java +++ b/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java @@ -6,96 +6,93 @@ import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.FluidFillable; -import net.minecraft.block.Material; -import net.minecraft.block.MaterialColor; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.Waterloggable; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.FluidFillable; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.level.block.Waterloggable; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.FluidState; import net.minecraft.fluid.Fluids; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; +import net.minecraft.world.item.ItemPlacementContext; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.BooleanProperty; import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockView; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; import ru.betterend.blocks.basis.AttachedBlock; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; -public class SmaragdantCrystalShardBlock extends AttachedBlock implements IRenderTypeable, Waterloggable, FluidFillable { +public class SmaragdantCrystalShardBlock extends AttachedBlock + implements IRenderTypeable, Waterloggable, FluidFillable { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; - + public SmaragdantCrystalShardBlock() { - super(FabricBlockSettings.of(Material.STONE) - .materialColor(MaterialColor.GREEN) - .breakByTool(FabricToolTags.PICKAXES) - .sounds(BlockSoundGroup.GLASS) - .luminance(15) - .requiresTool() + super(FabricBlockSettings.of(Material.STONE).materialColor(MaterialColor.COLOR_GREEN) + .breakByTool(FabricToolTags.PICKAXES).sounds(SoundType.GLASS).luminance(15).requiresTool() .noCollision()); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { - super.appendProperties(stateManager); + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + super.createBlockStateDefinition(stateManager); stateManager.add(WATERLOGGED); } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override public boolean canFillWithFluid(BlockView world, BlockPos pos, BlockState state, Fluid fluid) { - return !state.get(WATERLOGGED); + return !state.getValue(WATERLOGGED); } @Override - public boolean tryFillWithFluid(WorldAccess world, BlockPos pos, BlockState state, FluidState fluidState) { - return !state.get(WATERLOGGED); + public boolean tryFillWithFluid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { + return !state.getValue(WATERLOGGED); } - + @Override public BlockState getPlacementState(ItemPlacementContext ctx) { BlockState state = super.getPlacementState(ctx); if (state != null) { - WorldView worldView = ctx.getWorld(); + WorldView worldView = ctx.getLevel(); BlockPos blockPos = ctx.getBlockPos(); boolean water = worldView.getFluidState(blockPos).getFluid() == Fluids.WATER; return state.with(WATERLOGGED, water); } return null; } - + @Override public FluidState getFluidState(BlockState state) { - return state.get(WATERLOGGED) ? Fluids.WATER.getStill(false) : Fluids.EMPTY.getDefaultState(); + return state.getValue(WATERLOGGED) ? Fluids.WATER.getStill(false) : Fluids.EMPTY.defaultBlockState(); } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return BOUNDING_SHAPES.get(state.get(FACING)); + return BOUNDING_SHAPES.get(state.getValue(FACING)); } - + @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - Direction direction = (Direction) state.get(FACING); - BlockPos blockPos = pos.offset(direction.getOpposite()); + Direction direction = (Direction) state.getValue(FACING); + BlockPos blockPos = pos.relative(direction.getOpposite()); return world.getBlockState(blockPos).isSideSolidFullSquare(world, blockPos, direction); } - + static { BOUNDING_SHAPES.put(Direction.UP, VoxelShapes.cuboid(0.125, 0.0, 0.125, 0.875F, 0.875F, 0.875F)); BOUNDING_SHAPES.put(Direction.DOWN, VoxelShapes.cuboid(0.125, 0.125, 0.125, 0.875F, 1.0, 0.875F)); diff --git a/src/main/java/ru/betterend/blocks/SulphurCrystalBlock.java b/src/main/java/ru/betterend/blocks/SulphurCrystalBlock.java index 17ba297c..4bc940b3 100644 --- a/src/main/java/ru/betterend/blocks/SulphurCrystalBlock.java +++ b/src/main/java/ru/betterend/blocks/SulphurCrystalBlock.java @@ -9,30 +9,30 @@ import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.FluidFillable; -import net.minecraft.block.Material; -import net.minecraft.block.MaterialColor; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.Waterloggable; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.FluidFillable; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.level.block.Waterloggable; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.FluidState; import net.minecraft.fluid.Fluids; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; +import net.minecraft.world.item.ItemPlacementContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.IntProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockView; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; import ru.betterend.blocks.basis.AttachedBlock; import ru.betterend.client.render.ERenderLayer; @@ -43,73 +43,71 @@ import ru.betterend.util.MHelper; public class SulphurCrystalBlock extends AttachedBlock implements IRenderTypeable, Waterloggable, FluidFillable { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); - public static final IntProperty AGE = IntProperty.of("age", 0, 2); + public static final IntegerProperty AGE = IntegerProperty.of("age", 0, 2); public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; - + public SulphurCrystalBlock() { - super(FabricBlockSettings.of(Material.STONE) - .materialColor(MaterialColor.YELLOW) - .breakByTool(FabricToolTags.PICKAXES) - .sounds(BlockSoundGroup.GLASS) - .requiresTool() - .noCollision()); + super(FabricBlockSettings.of(Material.STONE).materialColor(MaterialColor.COLOR_YELLOW) + .breakByTool(FabricToolTags.PICKAXES).sounds(SoundType.GLASS).requiresTool().noCollision()); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { - super.appendProperties(stateManager); + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + super.createBlockStateDefinition(stateManager); stateManager.add(AGE, WATERLOGGED); } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - return state.get(AGE) < 2 ? Collections.emptyList() : Lists.newArrayList(new ItemStack(EndItems.CRYSTALLINE_SULPHUR, MHelper.randRange(1, 3, MHelper.RANDOM))); - } - - @Override - public boolean canFillWithFluid(BlockView world, BlockPos pos, BlockState state, Fluid fluid) { - return !state.get(WATERLOGGED); + public List getDrops(BlockState state, LootContext.Builder builder) { + return state.getValue(AGE) < 2 ? Collections.emptyList() + : Lists.newArrayList( + new ItemStack(EndItems.CRYSTALLINE_SULPHUR, MHelper.randRange(1, 3, MHelper.RANDOM))); } @Override - public boolean tryFillWithFluid(WorldAccess world, BlockPos pos, BlockState state, FluidState fluidState) { - return !state.get(WATERLOGGED); + public boolean canFillWithFluid(BlockView world, BlockPos pos, BlockState state, Fluid fluid) { + return !state.getValue(WATERLOGGED); } - + + @Override + public boolean tryFillWithFluid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { + return !state.getValue(WATERLOGGED); + } + @Override public BlockState getPlacementState(ItemPlacementContext ctx) { BlockState state = super.getPlacementState(ctx); if (state != null) { - WorldView worldView = ctx.getWorld(); + WorldView worldView = ctx.getLevel(); BlockPos blockPos = ctx.getBlockPos(); boolean water = worldView.getFluidState(blockPos).getFluid() == Fluids.WATER; return state.with(WATERLOGGED, water); } return null; } - + @Override public FluidState getFluidState(BlockState state) { - return state.get(WATERLOGGED) ? Fluids.WATER.getStill(false) : Fluids.EMPTY.getDefaultState(); + return state.getValue(WATERLOGGED) ? Fluids.WATER.getStill(false) : Fluids.EMPTY.defaultBlockState(); } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return BOUNDING_SHAPES.get(state.get(FACING)); + return BOUNDING_SHAPES.get(state.getValue(FACING)); } - + @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - Direction direction = (Direction) state.get(FACING); - BlockPos blockPos = pos.offset(direction.getOpposite()); - return world.getBlockState(blockPos).isOf(EndBlocks.BRIMSTONE); + Direction direction = (Direction) state.getValue(FACING); + BlockPos blockPos = pos.relative(direction.getOpposite()); + return world.getBlockState(blockPos).is(EndBlocks.BRIMSTONE); } - + static { BOUNDING_SHAPES.put(Direction.UP, VoxelShapes.cuboid(0.125, 0.0, 0.125, 0.875F, 0.5, 0.875F)); BOUNDING_SHAPES.put(Direction.DOWN, VoxelShapes.cuboid(0.125, 0.5, 0.125, 0.875F, 1.0, 0.875F)); diff --git a/src/main/java/ru/betterend/blocks/TenaneaFlowersBlock.java b/src/main/java/ru/betterend/blocks/TenaneaFlowersBlock.java index 447f2635..4059ca38 100644 --- a/src/main/java/ru/betterend/blocks/TenaneaFlowersBlock.java +++ b/src/main/java/ru/betterend/blocks/TenaneaFlowersBlock.java @@ -4,14 +4,14 @@ import java.util.Random; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.block.BlockState; -import net.minecraft.client.color.block.BlockColorProvider; -import net.minecraft.client.color.item.ItemColorProvider; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3i; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.client.color.block.BlockColor; +import net.minecraft.client.color.item.ItemColor; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.core.Vec3i; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; import ru.betterend.blocks.basis.VineBlock; import ru.betterend.interfaces.IColorProvider; import ru.betterend.registry.EndParticles; @@ -19,13 +19,13 @@ import ru.betterend.util.MHelper; public class TenaneaFlowersBlock extends VineBlock implements IColorProvider { public static final Vec3i[] COLORS; - + public TenaneaFlowersBlock() { super(15); } @Override - public BlockColorProvider getProvider() { + public BlockColor getBlockProvider() { return (state, world, pos, tintIndex) -> { long i = (MHelper.getRandom(pos.getX(), pos.getZ()) & 63) + pos.getY(); double delta = i * 0.1; @@ -33,34 +33,34 @@ public class TenaneaFlowersBlock extends VineBlock implements IColorProvider { int index2 = (index + 1) & 3; delta -= index; index &= 3; - + Vec3i color1 = COLORS[index]; Vec3i color2 = COLORS[index2]; - - int r = MHelper.floor(MathHelper.lerp(delta, color1.getX(), color2.getX())); - int g = MHelper.floor(MathHelper.lerp(delta, color1.getY(), color2.getY())); - int b = MHelper.floor(MathHelper.lerp(delta, color1.getZ(), color2.getZ())); + + int r = MHelper.floor(Mth.lerp(delta, color1.getX(), color2.getX())); + int g = MHelper.floor(Mth.lerp(delta, color1.getY(), color2.getY())); + int b = MHelper.floor(Mth.lerp(delta, color1.getZ(), color2.getZ())); float[] hsb = MHelper.fromRGBtoHSB(r, g, b); - + return MHelper.fromHSBtoRGB(hsb[0], MHelper.max(0.5F, hsb[1]), hsb[2]); }; } @Override - public ItemColorProvider getItemProvider() { + public ItemColor getItemProvider() { return (stack, tintIndex) -> { return MHelper.color(255, 255, 255); }; } - + @Override public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { return false; } - + @Environment(EnvType.CLIENT) - public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { - super.randomDisplayTick(state, world, pos, random); + public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { + super.animateTick(state, world, pos, random); if (random.nextInt(32) == 0) { double x = (double) pos.getX() + random.nextGaussian() + 0.5; double z = (double) pos.getZ() + random.nextGaussian() + 0.5; @@ -68,13 +68,9 @@ public class TenaneaFlowersBlock extends VineBlock implements IColorProvider { world.addParticle(EndParticles.TENANEA_PETAL, x, y, z, 0, 0, 0); } } - + static { - COLORS = new Vec3i[] { - new Vec3i(250, 111, 222), - new Vec3i(167, 89, 255), - new Vec3i(120, 207, 239), - new Vec3i(255, 87, 182) - }; + COLORS = new Vec3i[] { new Vec3i(250, 111, 222), new Vec3i(167, 89, 255), new Vec3i(120, 207, 239), + new Vec3i(255, 87, 182) }; } } diff --git a/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java b/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java index d3cba539..1ba74736 100644 --- a/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java @@ -1,7 +1,7 @@ package ru.betterend.blocks; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; import net.minecraft.world.WorldView; import net.minecraft.world.gen.feature.Feature; import ru.betterend.blocks.basis.FeatureSaplingBlock; @@ -17,9 +17,9 @@ public class TenaneaSaplingBlock extends FeatureSaplingBlock { protected Feature getFeature() { return EndFeatures.LUCERNIA.getFeature(); } - + @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return world.getBlockState(pos.down()).isOf(EndBlocks.RUTISCUS); + return world.getBlockState(pos.below()).is(EndBlocks.RUTISCUS); } } diff --git a/src/main/java/ru/betterend/blocks/TerminiteBlock.java b/src/main/java/ru/betterend/blocks/TerminiteBlock.java index 204a2e55..a7a1b6eb 100644 --- a/src/main/java/ru/betterend/blocks/TerminiteBlock.java +++ b/src/main/java/ru/betterend/blocks/TerminiteBlock.java @@ -1,17 +1,14 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Material; -import net.minecraft.block.MaterialColor; -import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.block.SoundType; import ru.betterend.blocks.basis.BlockBase; public class TerminiteBlock extends BlockBase { public TerminiteBlock() { - super(FabricBlockSettings.of(Material.METAL, MaterialColor.field_25708) - .hardness(7F) - .resistance(9F) - .requiresTool() - .sounds(BlockSoundGroup.METAL)); + super(FabricBlockSettings.of(Material.METAL, MaterialColor.field_25708).hardness(7F).resistance(9F) + .requiresTool().sounds(SoundType.METAL)); } } diff --git a/src/main/java/ru/betterend/blocks/TerrainPlantBlock.java b/src/main/java/ru/betterend/blocks/TerrainPlantBlock.java index f558395d..3f1ba358 100644 --- a/src/main/java/ru/betterend/blocks/TerrainPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/TerrainPlantBlock.java @@ -1,21 +1,21 @@ package ru.betterend.blocks; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.basis.EndPlantBlock; public class TerrainPlantBlock extends EndPlantBlock { private final Block[] ground; - + public TerrainPlantBlock(Block... ground) { super(true); this.ground = ground; } - + @Override protected boolean isTerrain(BlockState state) { - for (Block block: ground) { - if (state.isOf(block)) { + for (Block block : ground) { + if (state.is(block)) { return true; } } diff --git a/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossBlock.java b/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossBlock.java index af0257a6..fe4d215e 100644 --- a/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossBlock.java +++ b/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossBlock.java @@ -4,11 +4,11 @@ import java.util.Random; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.block.BlockState; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; import ru.betterend.blocks.basis.DoublePlantBlock; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; @@ -18,31 +18,31 @@ public class TwistedUmbrellaMossBlock extends EndPlantBlock { public TwistedUmbrellaMossBlock() { super(11); } - + @Override protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.END_MOSS) || state.isOf(EndBlocks.END_MYCELIUM) || state.isOf(EndBlocks.JUNGLE_MOSS); + return state.is(EndBlocks.END_MOSS) || state.is(EndBlocks.END_MYCELIUM) || state.is(EndBlocks.JUNGLE_MOSS); } - - @Environment(EnvType.CLIENT) - public boolean hasEmissiveLighting(BlockView world, BlockPos pos) { - return true; - } - @Environment(EnvType.CLIENT) - public float getAmbientOcclusionLightLevel(BlockView world, BlockPos pos) { - return 1F; - } - - @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { + @Environment(EnvType.CLIENT) + public boolean hasEmissiveLighting(BlockView world, BlockPos pos) { + return true; + } + + @Environment(EnvType.CLIENT) + public float getAmbientOcclusionLightLevel(BlockView world, BlockPos pos) { + return 1F; + } + + @Override + public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { return world.isAir(pos.up()); } - - @Override - public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { - int rot = world.random.nextInt(4); - BlockState bs = EndBlocks.TWISTED_UMBRELLA_MOSS_TALL.getDefaultState().with(DoublePlantBlock.ROTATION, rot); + + @Override + public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { + int rot = world.random.nextInt(4); + BlockState bs = EndBlocks.TWISTED_UMBRELLA_MOSS_TALL.defaultBlockState().with(DoublePlantBlock.ROTATION, rot); BlocksHelper.setWithoutUpdate(world, pos, bs); BlocksHelper.setWithoutUpdate(world, pos.up(), bs.with(DoublePlantBlock.TOP, true)); } diff --git a/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossTallBlock.java b/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossTallBlock.java index fbad6c9c..b344ba20 100644 --- a/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossTallBlock.java +++ b/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossTallBlock.java @@ -2,11 +2,11 @@ package ru.betterend.blocks; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.entity.ItemEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.entity.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.core.BlockPos; import ru.betterend.blocks.basis.DoublePlantBlock; import ru.betterend.registry.EndBlocks; @@ -14,15 +14,16 @@ public class TwistedUmbrellaMossTallBlock extends DoublePlantBlock { public TwistedUmbrellaMossTallBlock() { super(12); } - + @Override - public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { - ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(EndBlocks.TWISTED_UMBRELLA_MOSS)); + public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { + ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, + new ItemStack(EndBlocks.TWISTED_UMBRELLA_MOSS)); world.spawnEntity(item); } - + @Override protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.END_MOSS) || state.isOf(EndBlocks.END_MYCELIUM) || state.isOf(EndBlocks.JUNGLE_MOSS); + return state.is(EndBlocks.END_MOSS) || state.is(EndBlocks.END_MYCELIUM) || state.is(EndBlocks.JUNGLE_MOSS); } } diff --git a/src/main/java/ru/betterend/blocks/UmbrellaMossBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaMossBlock.java index 90173d0d..bef8a773 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaMossBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaMossBlock.java @@ -4,11 +4,11 @@ import java.util.Random; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.block.BlockState; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; import ru.betterend.blocks.basis.DoublePlantBlock; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; @@ -18,31 +18,31 @@ public class UmbrellaMossBlock extends EndPlantBlock { public UmbrellaMossBlock() { super(11); } - + @Override protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.END_MOSS) || state.isOf(EndBlocks.END_MYCELIUM) || state.isOf(EndBlocks.JUNGLE_MOSS); + return state.is(EndBlocks.END_MOSS) || state.is(EndBlocks.END_MYCELIUM) || state.is(EndBlocks.JUNGLE_MOSS); } - - @Environment(EnvType.CLIENT) - public boolean hasEmissiveLighting(BlockView world, BlockPos pos) { - return true; - } - @Environment(EnvType.CLIENT) - public float getAmbientOcclusionLightLevel(BlockView world, BlockPos pos) { - return 1F; - } - - @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { + @Environment(EnvType.CLIENT) + public boolean hasEmissiveLighting(BlockView world, BlockPos pos) { + return true; + } + + @Environment(EnvType.CLIENT) + public float getAmbientOcclusionLightLevel(BlockView world, BlockPos pos) { + return 1F; + } + + @Override + public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { return world.isAir(pos.up()); } - - @Override - public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { - int rot = world.random.nextInt(4); - BlockState bs = EndBlocks.UMBRELLA_MOSS_TALL.getDefaultState().with(DoublePlantBlock.ROTATION, rot); + + @Override + public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { + int rot = world.random.nextInt(4); + BlockState bs = EndBlocks.UMBRELLA_MOSS_TALL.defaultBlockState().with(DoublePlantBlock.ROTATION, rot); BlocksHelper.setWithoutUpdate(world, pos, bs); BlocksHelper.setWithoutUpdate(world, pos.up(), bs.with(DoublePlantBlock.TOP, true)); } diff --git a/src/main/java/ru/betterend/blocks/UmbrellaMossTallBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaMossTallBlock.java index c3a90063..0ab0434c 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaMossTallBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaMossTallBlock.java @@ -2,11 +2,11 @@ package ru.betterend.blocks; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.entity.ItemEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.entity.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.core.BlockPos; import ru.betterend.blocks.basis.DoublePlantBlock; import ru.betterend.registry.EndBlocks; @@ -14,15 +14,16 @@ public class UmbrellaMossTallBlock extends DoublePlantBlock { public UmbrellaMossTallBlock() { super(12); } - + @Override - public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { - ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(EndBlocks.UMBRELLA_MOSS)); + public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { + ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, + new ItemStack(EndBlocks.UMBRELLA_MOSS)); world.spawnEntity(item); } - + @Override protected boolean isTerrain(BlockState state) { - return state.isOf(EndBlocks.END_MOSS) || state.isOf(EndBlocks.END_MYCELIUM) || state.isOf(EndBlocks.JUNGLE_MOSS); + return state.is(EndBlocks.END_MOSS) || state.is(EndBlocks.END_MYCELIUM) || state.is(EndBlocks.JUNGLE_MOSS); } } diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java index e1a6b8a9..7b2139ec 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java @@ -1,22 +1,22 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.MaterialColor; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.state.StateManager; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.sounds.SoundSource; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.BooleanProperty; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; @@ -24,21 +24,21 @@ import ru.betterend.util.BlocksHelper; public class UmbrellaTreeClusterBlock extends BlockBase { public static final BooleanProperty NATURAL = BlockProperties.NATURAL; - + public UmbrellaTreeClusterBlock() { - super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK) - .materialColor(MaterialColor.PURPLE) + super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK).materialColor(MaterialColor.COLOR_PURPLE) .luminance(15)); - setDefaultState(stateManager.getDefaultState().with(NATURAL, false)); + setDefaultState(stateManager.defaultBlockState().with(NATURAL, false)); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(NATURAL); } - + @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + public ActionResult onUse(BlockState state, Level world, BlockPos pos, PlayerEntity player, Hand hand, + BlockHitResult hit) { ItemStack stack = player.getMainHandStack(); if (stack.getItem() == Items.GLASS_BOTTLE) { if (!player.isCreative()) { @@ -46,8 +46,10 @@ public class UmbrellaTreeClusterBlock extends BlockBase { } stack = new ItemStack(EndItems.UMBRELLA_CLUSTER_JUICE); player.giveItemStack(stack); - world.playSound(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, SoundEvents.ITEM_BOTTLE_FILL, SoundCategory.BLOCKS, 1, 1, false); - BlocksHelper.setWithUpdate(world, pos, EndBlocks.UMBRELLA_TREE_CLUSTER_EMPTY.getDefaultState().with(NATURAL, state.get(NATURAL))); + world.playLocalSound(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, SoundEvents.ITEM_BOTTLE_FILL, + SoundSource.BLOCKS, 1, 1, false); + BlocksHelper.setWithUpdate(world, pos, + EndBlocks.UMBRELLA_TREE_CLUSTER_EMPTY.defaultBlockState().with(NATURAL, state.getValue(NATURAL))); return ActionResult.SUCCESS; } return ActionResult.FAIL; diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java index 29e5ba36..b4f1941a 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java @@ -3,37 +3,37 @@ package ru.betterend.blocks; import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.MaterialColor; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.state.StateManager; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.BooleanProperty; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; public class UmbrellaTreeClusterEmptyBlock extends BlockBase { public static final BooleanProperty NATURAL = BlockProperties.NATURAL; - + public UmbrellaTreeClusterEmptyBlock() { - super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK) - .materialColor(MaterialColor.PURPLE) + super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK).materialColor(MaterialColor.COLOR_PURPLE) .ticksRandomly()); - setDefaultState(stateManager.getDefaultState().with(NATURAL, false)); + setDefaultState(stateManager.defaultBlockState().with(NATURAL, false)); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(NATURAL); } - + @Override - public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { - if (state.get(NATURAL) && random.nextInt(16) == 0) { - BlocksHelper.setWithUpdate(world, pos, EndBlocks.UMBRELLA_TREE_CLUSTER.getDefaultState().with(UmbrellaTreeClusterBlock.NATURAL, true)); + public void scheduledTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + if (state.getValue(NATURAL) && random.nextInt(16) == 0) { + BlocksHelper.setWithUpdate(world, pos, + EndBlocks.UMBRELLA_TREE_CLUSTER.defaultBlockState().with(UmbrellaTreeClusterBlock.NATURAL, true)); } } } diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java index 3fb85637..31844133 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java @@ -9,20 +9,20 @@ 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.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.SlimeBlock; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.IntProperty; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.BlockView; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SlimeBlock; +import net.minecraft.world.item.ItemPlacementContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; +import net.minecraft.world.level.BlockGetter; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.noise.OpenSimplexNoise; @@ -32,69 +32,68 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; public class UmbrellaTreeMembraneBlock extends SlimeBlock implements IRenderTypeable, BlockPatterned { - public static final IntProperty COLOR = BlockProperties.COLOR; + public static final IntegerProperty COLOR = BlockProperties.COLOR; private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); - + public UmbrellaTreeMembraneBlock() { super(FabricBlockSettings.copyOf(Blocks.SLIME_BLOCK)); } - + @Override public BlockState getPlacementState(ItemPlacementContext ctx) { double px = ctx.getBlockPos().getX() * 0.1; double py = ctx.getBlockPos().getY() * 0.1; double pz = ctx.getBlockPos().getZ() * 0.1; - return this.getDefaultState().with(COLOR, MHelper.floor(NOISE.eval(px, py, pz) * 3.5 + 4)); + return this.defaultBlockState().with(COLOR, MHelper.floor(NOISE.eval(px, py, pz) * 3.5 + 4)); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(COLOR); } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.TRANSLUCENT; } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - if (state.get(COLOR) > 0) { + public List getDrops(BlockState state, LootContext.Builder builder) { + if (state.getValue(COLOR) > 0) { return Lists.newArrayList(new ItemStack(this)); - } - else { - return MHelper.RANDOM.nextInt(4) == 0 ? Lists.newArrayList(new ItemStack(EndBlocks.UMBRELLA_TREE_SAPLING)) : Collections.emptyList(); + } else { + return MHelper.RANDOM.nextInt(4) == 0 ? Lists.newArrayList(new ItemStack(EndBlocks.UMBRELLA_TREE_SAPLING)) + : Collections.emptyList(); } } - + @Override public String getStatesPattern(Reader data) { - String block = Registry.BLOCK.getId(this).getPath(); + String block = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, block, block); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(Patterns.BLOCK_BASE, blockId.getPath(), block); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_SIMPLE; } @Override public boolean isTranslucent(BlockState state, BlockView world, BlockPos pos) { - return state.get(COLOR) > 0; + return state.getValue(COLOR) > 0; } - + @Environment(EnvType.CLIENT) public boolean isSideInvisible(BlockState state, BlockState stateFrom, Direction direction) { - if (state.get(COLOR) > 0) { + if (state.getValue(COLOR) > 0) { return super.isSideInvisible(state, stateFrom, direction); - } - else { + } else { return false; } } diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java index eba60eff..fc80eff0 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java @@ -1,7 +1,7 @@ package ru.betterend.blocks; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; import net.minecraft.world.WorldView; import net.minecraft.world.gen.feature.Feature; import ru.betterend.blocks.basis.FeatureSaplingBlock; @@ -18,12 +18,12 @@ public class UmbrellaTreeSaplingBlock extends FeatureSaplingBlock { protected Feature getFeature() { return EndFeatures.UMBRELLA_TREE.getFeature(); } - + @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return world.getBlockState(pos.down()).isOf(EndBlocks.JUNGLE_MOSS); + return world.getBlockState(pos.below()).is(EndBlocks.JUNGLE_MOSS); } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.TRANSLUCENT; diff --git a/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java b/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java index 970d866a..8ce6c201 100644 --- a/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java +++ b/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java @@ -5,29 +5,29 @@ import java.util.Random; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockRenderType; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.FluidDrainable; -import net.minecraft.block.FluidFillable; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.entity.Entity; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.BlockRenderType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.FluidDrainable; +import net.minecraft.world.level.block.FluidFillable; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.entity.Entity; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.FluidState; import net.minecraft.fluid.Fluids; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; @@ -38,11 +38,11 @@ public class VentBubbleColumnBlock extends Block implements FluidDrainable, Flui } @Override - public Fluid tryDrainFluid(WorldAccess world, BlockPos pos, BlockState state) { - world.setBlockState(pos, Blocks.AIR.getDefaultState(), 11); + public Fluid tryDrainFluid(LevelAccessor world, BlockPos pos, BlockState state) { + world.setBlockAndUpdate(pos, Blocks.AIR.defaultBlockState(), 11); return Fluids.WATER; } - + @Override public BlockRenderType getRenderType(BlockState state) { return BlockRenderType.INVISIBLE; @@ -50,8 +50,8 @@ public class VentBubbleColumnBlock extends Block implements FluidDrainable, Flui @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - BlockState blockState = world.getBlockState(pos.down()); - return blockState.isOf(this) || blockState.isOf(EndBlocks.HYDROTHERMAL_VENT); + BlockState blockState = world.getBlockState(pos.below()); + return blockState.is(this) || blockState.is(EndBlocks.HYDROTHERMAL_VENT); } @Override @@ -60,13 +60,13 @@ public class VentBubbleColumnBlock extends Block implements FluidDrainable, Flui } @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState newState, WorldAccess world, BlockPos pos, BlockPos posFrom) { + public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, + BlockPos pos, BlockPos posFrom) { if (!state.canPlaceAt(world, pos)) { - return Blocks.WATER.getDefaultState(); - } - else { + return Blocks.WATER.defaultBlockState(); + } else { BlockPos up = pos.up(); - if (world.getBlockState(up).isOf(Blocks.WATER)) { + if (world.getBlockState(up).is(Blocks.WATER)) { BlocksHelper.setWithoutUpdate(world, up, this); world.getBlockTickScheduler().schedule(up, this, 5); } @@ -75,7 +75,7 @@ public class VentBubbleColumnBlock extends Block implements FluidDrainable, Flui } @Environment(EnvType.CLIENT) - public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { + public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { if (random.nextInt(4) == 0) { double px = pos.getX() + random.nextDouble(); double py = pos.getY() + random.nextDouble(); @@ -83,39 +83,43 @@ public class VentBubbleColumnBlock extends Block implements FluidDrainable, Flui world.addImportantParticle(ParticleTypes.BUBBLE_COLUMN_UP, px, py, pz, 0, 0.04, 0); } if (random.nextInt(200) == 0) { - world.playSound(pos.getX(), pos.getY(), pos.getZ(), SoundEvents.BLOCK_BUBBLE_COLUMN_UPWARDS_AMBIENT, SoundCategory.BLOCKS, 0.2F + random.nextFloat() * 0.2F, 0.9F + random.nextFloat() * 0.15F, false); + world.playLocalSound(pos.getX(), pos.getY(), pos.getZ(), SoundEvents.BLOCK_BUBBLE_COLUMN_UPWARDS_AMBIENT, + SoundSource.BLOCKS, 0.2F + random.nextFloat() * 0.2F, 0.9F + random.nextFloat() * 0.15F, false); } } @Environment(EnvType.CLIENT) - public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) { + public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { BlockState blockState = world.getBlockState(pos.up()); if (blockState.isAir()) { entity.onBubbleColumnSurfaceCollision(false); - if (!world.isClient) { - ServerWorld serverWorld = (ServerWorld) world; + if (!world.isClientSide) { + ServerLevel serverWorld = (ServerLevel) world; for (int i = 0; i < 2; ++i) { - serverWorld.spawnParticles(ParticleTypes.SPLASH, (double) pos.getX() + world.random.nextDouble(), (double) (pos.getY() + 1), (double) pos.getZ() + world.random.nextDouble(), 1, 0.0D, 0.0D, 0.0D, 1.0D); - serverWorld.spawnParticles(ParticleTypes.BUBBLE, (double) pos.getX() + world.random.nextDouble(), (double) (pos.getY() + 1), (double) pos.getZ() + world.random.nextDouble(), 1, 0.0D, 0.01D, 0.0D, 0.2D); + serverWorld.sendParticles(ParticleTypes.SPLASH, (double) pos.getX() + world.random.nextDouble(), + (double) (pos.getY() + 1), (double) pos.getZ() + world.random.nextDouble(), 1, 0.0D, 0.0D, + 0.0D, 1.0D); + serverWorld.sendParticles(ParticleTypes.BUBBLE, (double) pos.getX() + world.random.nextDouble(), + (double) (pos.getY() + 1), (double) pos.getZ() + world.random.nextDouble(), 1, 0.0D, 0.01D, + 0.0D, 0.2D); } } - } - else { + } else { entity.onBubbleColumnCollision(false); } } - + @Override public boolean canFillWithFluid(BlockView world, BlockPos pos, BlockState state, Fluid fluid) { return false; } @Override - public boolean tryFillWithFluid(WorldAccess world, BlockPos pos, BlockState state, FluidState fluidState) { + public boolean tryFillWithFluid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { return false; } - + @Override public FluidState getFluidState(BlockState state) { return Fluids.WATER.getStill(false); diff --git a/src/main/java/ru/betterend/blocks/basis/AttachedBlock.java b/src/main/java/ru/betterend/blocks/basis/AttachedBlock.java index 25b73d13..6c0919cf 100644 --- a/src/main/java/ru/betterend/blocks/basis/AttachedBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/AttachedBlock.java @@ -1,38 +1,38 @@ package ru.betterend.blocks.basis; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.state.StateManager; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.item.ItemPlacementContext; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.DirectionProperty; import net.minecraft.state.property.Properties; -import net.minecraft.tag.BlockTags; +import net.minecraft.tags.BlockTags; import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; import ru.betterend.util.BlocksHelper; public abstract class AttachedBlock extends BlockBaseNotFull { public static final DirectionProperty FACING = Properties.FACING; - - public AttachedBlock(Settings settings) { + + public AttachedBlock(Properties settings) { super(settings); - this.setDefaultState(this.getDefaultState().with(FACING, Direction.UP)); + this.setDefaultState(this.defaultBlockState().with(FACING, Direction.UP)); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(FACING); } - + @Override public BlockState getPlacementState(ItemPlacementContext ctx) { - BlockState blockState = this.getDefaultState(); - WorldView worldView = ctx.getWorld(); + BlockState blockState = this.defaultBlockState(); + WorldView worldView = ctx.getLevel(); BlockPos blockPos = ctx.getBlockPos(); Direction[] directions = ctx.getPlacementDirections(); for (int i = 0; i < directions.length; ++i) { @@ -48,24 +48,24 @@ public abstract class AttachedBlock extends BlockBaseNotFull { @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - Direction direction = (Direction) state.get(FACING); - BlockPos blockPos = pos.offset(direction.getOpposite()); - return sideCoversSmallSquare(world, blockPos, direction) || world.getBlockState(blockPos).isIn(BlockTags.LEAVES); + Direction direction = (Direction) state.getValue(FACING); + BlockPos blockPos = pos.relative(direction.getOpposite()); + return sideCoversSmallSquare(world, blockPos, direction) + || world.getBlockState(blockPos).isIn(BlockTags.LEAVES); } @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, + BlockPos pos, BlockPos neighborPos) { if (!canPlaceAt(state, world, pos)) { - return Blocks.AIR.getDefaultState(); - } - else { + return Blocks.AIR.defaultBlockState(); + } else { return state; } } - @Override - public BlockState rotate(BlockState state, BlockRotation rotation) { + public BlockState rotate(BlockState state, Rotation rotation) { return BlocksHelper.rotateHorizontal(state, rotation, FACING); } diff --git a/src/main/java/ru/betterend/blocks/basis/BarkBlock.java b/src/main/java/ru/betterend/blocks/basis/BarkBlock.java index f6c3587b..36b39146 100644 --- a/src/main/java/ru/betterend/blocks/basis/BarkBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/BarkBlock.java @@ -2,28 +2,28 @@ package ru.betterend.blocks.basis; import java.io.Reader; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.patterns.Patterns; public class BarkBlock extends EndPillarBlock { - public BarkBlock(Settings settings) { + public BarkBlock(Properties settings) { super(settings); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(Patterns.BLOCK_BASE, getName(blockId), blockId.getPath()); } - + @Override public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(data, getName(blockId), blockId.getPath()); } - - private String getName(Identifier blockId) { + + private String getName(ResourceLocation blockId) { String name = blockId.getPath(); return name.replace("_bark", "_log_side"); } diff --git a/src/main/java/ru/betterend/blocks/basis/BaseBlockWithEntity.java b/src/main/java/ru/betterend/blocks/basis/BaseBlockWithEntity.java index b0f49174..9f4ead5f 100644 --- a/src/main/java/ru/betterend/blocks/basis/BaseBlockWithEntity.java +++ b/src/main/java/ru/betterend/blocks/basis/BaseBlockWithEntity.java @@ -3,15 +3,15 @@ package ru.betterend.blocks.basis; import java.util.Collections; import java.util.List; -import net.minecraft.block.BlockState; -import net.minecraft.block.BlockWithEntity; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.world.BlockView; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.BlockWithEntity; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.BlockGetter; public class BaseBlockWithEntity extends BlockWithEntity { - public BaseBlockWithEntity(Settings settings) { + public BaseBlockWithEntity(Properties settings) { super(settings); } @@ -19,9 +19,9 @@ public class BaseBlockWithEntity extends BlockWithEntity { public BlockEntity createBlockEntity(BlockView world) { return null; } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockBase.java b/src/main/java/ru/betterend/blocks/basis/BlockBase.java index cdebbf74..04dddbf3 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockBase.java +++ b/src/main/java/ru/betterend/blocks/basis/BlockBase.java @@ -4,39 +4,39 @@ import java.io.Reader; import java.util.Collections; import java.util.List; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.world.item.ItemStack; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; public class BlockBase extends Block implements BlockPatterned { - public BlockBase(Settings settings) { + public BlockBase(Properties settings) { super(settings); } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState blockState, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { - String block = Registry.BLOCK.getId(this).getPath(); + String block = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, block, block); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(Patterns.BLOCK_BASE, blockId.getPath(), block); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_SIMPLE; } } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockBaseNotFull.java b/src/main/java/ru/betterend/blocks/basis/BlockBaseNotFull.java index dbf23923..34d51d6f 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockBaseNotFull.java +++ b/src/main/java/ru/betterend/blocks/basis/BlockBaseNotFull.java @@ -1,13 +1,13 @@ package ru.betterend.blocks.basis; -import net.minecraft.block.BlockState; -import net.minecraft.entity.EntityType; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.entity.EntityType; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; public class BlockBaseNotFull extends BlockBase { - public BlockBaseNotFull(Settings settings) { + public BlockBaseNotFull(Properties settings) { super(settings); } diff --git a/src/main/java/ru/betterend/blocks/basis/DoublePlantBlock.java b/src/main/java/ru/betterend/blocks/basis/DoublePlantBlock.java index fd8f7570..a997b782 100644 --- a/src/main/java/ru/betterend/blocks/basis/DoublePlantBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/DoublePlantBlock.java @@ -7,32 +7,32 @@ import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Fertilizable; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.entity.ItemEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; +import net.minecraft.world.level.block.AbstractBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Fertilizable; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.entity.ItemEntity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.IntProperty; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.util.math.Vec3d; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties; import ru.betterend.client.render.ERenderLayer; @@ -42,30 +42,25 @@ import ru.betterend.util.BlocksHelper; public class DoublePlantBlock extends BlockBaseNotFull implements IRenderTypeable, Fertilizable { private static final VoxelShape SHAPE = Block.createCuboidShape(4, 2, 4, 12, 16, 12); - public static final IntProperty ROTATION = BlockProperties.ROTATION; + public static final IntegerProperty ROTATION = BlockProperties.ROTATION; public static final BooleanProperty TOP = BooleanProperty.of("top"); - + public DoublePlantBlock() { - super(FabricBlockSettings.of(Material.PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.WET_GRASS) - .breakByHand(true) - .noCollision()); - this.setDefaultState(this.stateManager.getDefaultState().with(TOP, false)); + super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).sounds(SoundType.WET_GRASS) + .breakByHand(true).noCollision()); + this.setDefaultState(this.stateManager.defaultBlockState().with(TOP, false)); } - + public DoublePlantBlock(int light) { - super(FabricBlockSettings.of(Material.PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.WET_GRASS) - .luminance((state) -> { return state.get(TOP) ? light : 0; }) - .breakByHand(true) - .noCollision()); - this.setDefaultState(this.stateManager.getDefaultState().with(TOP, false)); + super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).sounds(SoundType.WET_GRASS) + .luminance((state) -> { + return state.getValue(TOP) ? light : 0; + }).breakByHand(true).noCollision()); + this.setDefaultState(this.stateManager.defaultBlockState().with(TOP, false)); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(TOP, ROTATION); } @@ -82,46 +77,46 @@ public class DoublePlantBlock extends BlockBaseNotFull implements IRenderTypeabl @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - BlockState down = world.getBlockState(pos.down()); + BlockState down = world.getBlockState(pos.below()); BlockState up = world.getBlockState(pos.up()); - return state.get(TOP) ? down.getBlock() == this : isTerrain(down) && (up.getMaterial().isReplaceable()); + return state.getValue(TOP) ? down.getBlock() == this : isTerrain(down) && (up.getMaterial().isReplaceable()); } - + public boolean canStayAt(BlockState state, WorldView world, BlockPos pos) { - BlockState down = world.getBlockState(pos.down()); + BlockState down = world.getBlockState(pos.below()); BlockState up = world.getBlockState(pos.up()); - return state.get(TOP) ? down.getBlock() == this : isTerrain(down) && (up.getBlock() == this); + return state.getValue(TOP) ? down.getBlock() == this : isTerrain(down) && (up.getBlock() == this); } protected boolean isTerrain(BlockState state) { return state.isIn(EndTags.END_GROUND); } - + @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, + BlockPos pos, BlockPos neighborPos) { if (!canStayAt(state, world, pos)) { - return Blocks.AIR.getDefaultState(); - } - else { + return Blocks.AIR.defaultBlockState(); + } else { return state; } } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - if (state.get(TOP)) { + public List getDrops(BlockState state, LootContext.Builder builder) { + if (state.getValue(TOP)) { return Lists.newArrayList(); } - - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) || EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { + + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) + || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Lists.newArrayList(new ItemStack(this)); - } - else { + } else { return Lists.newArrayList(); } } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; @@ -133,20 +128,21 @@ public class DoublePlantBlock extends BlockBaseNotFull implements IRenderTypeabl } @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { + public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { return true; } @Override - public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { - ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(this)); + public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { + ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, + new ItemStack(this)); world.spawnEntity(item); } - + @Override - public void onPlaced(World world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { + public void onPlaced(Level world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { int rot = world.random.nextInt(4); - BlockState bs = this.getDefaultState().with(ROTATION, rot); + BlockState bs = this.defaultBlockState().with(ROTATION, rot); BlocksHelper.setWithoutUpdate(world, pos, bs); BlocksHelper.setWithoutUpdate(world, pos.up(), bs.with(TOP, true)); } diff --git a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java index ca836924..b45bca97 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java @@ -8,74 +8,74 @@ import java.util.Map; import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.AnvilBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.MaterialColor; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.IntProperty; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.AnvilBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.blocks.BlockProperties; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; public class EndAnvilBlock extends AnvilBlock implements BlockPatterned { - private static final IntProperty DESTRUCTION = BlockProperties.DESTRUCTION; + private static final IntegerProperty DESTRUCTION = BlockProperties.DESTRUCTION; protected final int level; - + public EndAnvilBlock(MaterialColor color, int level) { super(FabricBlockSettings.copyOf(Blocks.ANVIL).materialColor(color)); this.level = level; } - + @Override - protected void appendProperties(StateManager.Builder builder) { - super.appendProperties(builder); + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); builder.add(DESTRUCTION); } - public IntProperty getDestructionProperty() { + public IntegerProperty getDESTRUCTION() { return DESTRUCTION; } public int getCraftingLevel() { return level; } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); Map map = Maps.newHashMap(); map.put("%anvil%", blockId.getPath()); map.put("%top%", getTop(blockId, block)); return Patterns.createJson(Patterns.BLOCK_ANVIL, map); } - protected String getTop(Identifier blockId, String block) { + protected String getTop(ResourceLocation blockId, String block) { if (block.contains("item")) { return blockId.getPath() + "_top_0"; } char last = block.charAt(block.length() - 1); return blockId.getPath() + "_top_" + last; } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_ANVIL; } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java b/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java index 7098b82b..63eb7bf7 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java @@ -5,26 +5,26 @@ import java.util.List; import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.BarrelBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockRenderType; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.mob.PiglinBrain; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.server.world.ServerWorld; +import net.minecraft.world.level.block.BarrelBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.BlockRenderType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.mob.PiglinBrain; +import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.server.level.ServerLevel; import net.minecraft.stat.Stats; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; import ru.betterend.blocks.entities.EBarrelBlockEntity; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; @@ -41,16 +41,16 @@ public class EndBarrelBlock extends BarrelBlock implements BlockPatterned { } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - List drop = super.getDroppedStacks(state, builder); + public List getDrops(BlockState state, LootContext.Builder builder) { + List drop = super.getDrops(state, builder); drop.add(new ItemStack(this.asItem())); return drop; } @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, + public ActionResult onUse(BlockState state, Level world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - if (world.isClient) { + if (world.isClientSide) { return ActionResult.SUCCESS; } else { BlockEntity blockEntity = world.getBlockEntity(pos); @@ -65,7 +65,7 @@ public class EndBarrelBlock extends BarrelBlock implements BlockPatterned { } @Override - public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + public void scheduledTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof EBarrelBlockEntity) { ((EBarrelBlockEntity) blockEntity).tick(); @@ -78,8 +78,7 @@ public class EndBarrelBlock extends BarrelBlock implements BlockPatterned { } @Override - public void onPlaced(World world, BlockPos pos, BlockState state, LivingEntity placer, - ItemStack itemStack) { + public void onPlaced(Level world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { if (itemStack.hasCustomName()) { BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof EBarrelBlockEntity) { @@ -87,24 +86,24 @@ public class EndBarrelBlock extends BarrelBlock implements BlockPatterned { } } } - + @Override public String getStatesPattern(Reader data) { - String block = Registry.BLOCK.getId(this).getPath(); + String block = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, block, block); } - + @Override public String getModelPattern(String block) { - String texture = Registry.BLOCK.getId(this).getPath(); + String texture = Registry.BLOCK.getKey(this).getPath(); if (block.contains("open")) { return Patterns.createJson(Patterns.BLOCK_BARREL_OPEN, texture, texture); } return Patterns.createJson(Patterns.BLOCK_BOTTOM_TOP, texture, texture); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_BARREL; } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndBlockStripableLogLog.java b/src/main/java/ru/betterend/blocks/basis/EndBlockStripableLogLog.java index 8813267a..955e3d50 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndBlockStripableLogLog.java +++ b/src/main/java/ru/betterend/blocks/basis/EndBlockStripableLogLog.java @@ -2,36 +2,38 @@ package ru.betterend.blocks.basis; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.MaterialColor; -import net.minecraft.block.PillarBlock; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundSource; +import net.minecraft.sounds.SoundEvents; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; public class EndBlockStripableLogLog extends EndPillarBlock { private final Block striped; - + public EndBlockStripableLogLog(MaterialColor color, Block striped) { super(FabricBlockSettings.copyOf(striped).materialColor(color)); this.striped = striped; } - + @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + public ActionResult onUse(BlockState state, Level world, BlockPos pos, PlayerEntity player, Hand hand, + BlockHitResult hit) { if (player.getMainHandStack().getItem().isIn(FabricToolTags.AXES)) { - world.playSound(player, pos, SoundEvents.ITEM_AXE_STRIP, SoundCategory.BLOCKS, 1.0F, 1.0F); - if (!world.isClient) { - world.setBlockState(pos, striped.getDefaultState().with(PillarBlock.AXIS, state.get(PillarBlock.AXIS)), 11); + world.playLocalSound(player, pos, SoundEvents.ITEM_AXE_STRIP, SoundSource.BLOCKS, 1.0F, 1.0F); + if (!world.isClientSide) { + world.setBlockAndUpdate(pos, striped.defaultBlockState().with(RotatedPillarBlock.AXIS, + state.getValue(RotatedPillarBlock.AXIS)), 11); if (player != null && !player.isCreative()) { - player.getMainHandStack().damage(1, world.random, (ServerPlayerEntity) player); + player.getMainHandStack().damage(1, world.random, (ServerPlayer) player); } } return ActionResult.SUCCESS; diff --git a/src/main/java/ru/betterend/blocks/basis/EndBookshelfBlock.java b/src/main/java/ru/betterend/blocks/basis/EndBookshelfBlock.java index 0916c4b0..82688186 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndBookshelfBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndBookshelfBlock.java @@ -5,53 +5,53 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.patterns.Patterns; public class EndBookshelfBlock extends BlockBase { public EndBookshelfBlock(Block source) { super(FabricBlockSettings.copyOf(source)); } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && tool.isEffectiveOn(state)) { - int silk = EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool); + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && tool.isCorrectToolForDrops(state)) { + int silk = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool); if (silk > 0) { return Collections.singletonList(new ItemStack(this)); } } return Collections.singletonList(new ItemStack(Items.BOOK, 3)); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_SIMPLE; } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(Patterns.BLOCK_BOOKSHELF, getName(blockId), blockId.getPath()); } - + @Override public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(data, getName(blockId), blockId.getPath()); } - - private String getName(Identifier blockId) { + + private String getName(ResourceLocation blockId) { String name = blockId.getPath(); return name.replace("_bookshelf", ""); } diff --git a/src/main/java/ru/betterend/blocks/basis/EndChainBlock.java b/src/main/java/ru/betterend/blocks/basis/EndChainBlock.java index 993d06a2..a28dac5e 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndChainBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndChainBlock.java @@ -5,14 +5,14 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.ChainBlock; -import net.minecraft.block.MaterialColor; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.ChainBlock; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.BlockPatterned; @@ -22,32 +22,32 @@ public class EndChainBlock extends ChainBlock implements BlockPatterned, IRender public EndChainBlock(MaterialColor color) { super(FabricBlockSettings.copyOf(Blocks.CHAIN).materialColor(color)); } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); if (block.contains("item")) { return Patterns.createJson(Patterns.ITEM_GENERATED, "item/" + blockId.getPath()); } return Patterns.createJson(Patterns.BLOCK_CHAIN, blockId.getPath(), blockId.getPath()); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_CHAIN; } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; diff --git a/src/main/java/ru/betterend/blocks/basis/EndChestBlock.java b/src/main/java/ru/betterend/blocks/basis/EndChestBlock.java index 1d4d5582..d146316f 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndChestBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndChestBlock.java @@ -4,62 +4,60 @@ import java.io.Reader; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.ChestBlock; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.BlockView; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.ChestBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; +import net.minecraft.world.level.BlockGetter; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; import ru.betterend.registry.EndBlockEntities; public class EndChestBlock extends ChestBlock implements BlockPatterned { private final Block parent; - + public EndChestBlock(Block source) { super(FabricBlockSettings.copyOf(source).nonOpaque(), () -> { return EndBlockEntities.CHEST; }); this.parent = source; } - + @Override - public BlockEntity createBlockEntity(BlockView world) - { + public BlockEntity createBlockEntity(BlockView world) { return EndBlockEntities.CHEST.instantiate(); } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) - { - List drop = super.getDroppedStacks(state, builder); + public List getDrops(BlockState state, LootContext.Builder builder) { + List drop = super.getDrops(state, builder); drop.add(new ItemStack(this.asItem())); return drop; } - + @Override public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String path) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); if (path.contains("item")) { return Patterns.createJson(Patterns.ITEM_CHEST, blockId.getPath()); } return Patterns.createJson(Patterns.BLOCK_EMPTY, parentId.getPath()); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_SIMPLE; } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndComposterBlock.java b/src/main/java/ru/betterend/blocks/basis/EndComposterBlock.java index 8d8a77f2..db82d4bd 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndComposterBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndComposterBlock.java @@ -5,13 +5,13 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.ComposterBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.ComposterBlock; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; @@ -19,27 +19,27 @@ public class EndComposterBlock extends ComposterBlock implements BlockPatterned public EndComposterBlock(Block source) { super(FabricBlockSettings.copyOf(source)); } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this.asItem())); } - + @Override public String getStatesPattern(Reader data) { - String blockId = Registry.BLOCK.getId(this).getPath(); + String blockId = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, blockId, blockId); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); String blockName = blockId.getPath(); return Patterns.createJson(Patterns.BLOCK_COMPOSTER, blockName); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_COMPOSTER; } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndCraftingTableBlock.java b/src/main/java/ru/betterend/blocks/basis/EndCraftingTableBlock.java index a918ac34..2e8da6d9 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndCraftingTableBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndCraftingTableBlock.java @@ -6,13 +6,13 @@ import java.util.HashMap; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.CraftingTableBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.CraftingTableBlock; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; @@ -22,19 +22,19 @@ public class EndCraftingTableBlock extends CraftingTableBlock implements BlockPa } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this.asItem())); } - + @Override public String getStatesPattern(Reader data) { - String blockId = Registry.BLOCK.getId(this).getPath(); + String blockId = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, blockId, blockId); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); String blockName = blockId.getPath(); return Patterns.createJson(Patterns.BLOCK_SIDED, new HashMap() { private static final long serialVersionUID = 1L; @@ -49,9 +49,9 @@ public class EndCraftingTableBlock extends CraftingTableBlock implements BlockPa } }); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_SIMPLE; } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndCropBlock.java b/src/main/java/ru/betterend/blocks/basis/EndCropBlock.java index 2ff00d6b..e8e75e3c 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndCropBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndCropBlock.java @@ -8,74 +8,70 @@ import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.IntProperty; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; +import net.minecraft.world.level.block.AbstractBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; public class EndCropBlock extends EndPlantBlock { private static final VoxelShape SHAPE = Block.createCuboidShape(2, 0, 2, 14, 14, 14); - public static final IntProperty AGE = IntProperty.of("age", 0, 3); - + public static final IntegerProperty AGE = IntegerProperty.of("age", 0, 3); + private final Block[] terrain; private final Item drop; - + public EndCropBlock(Item drop, Block... terrain) { - super(FabricBlockSettings.of(Material.PLANT) - .breakByTool(FabricToolTags.HOES) - .sounds(BlockSoundGroup.GRASS) - .breakByHand(true) - .ticksRandomly() - .noCollision()); + super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.HOES).sounds(SoundType.GRASS) + .breakByHand(true).ticksRandomly().noCollision()); this.drop = drop; this.terrain = terrain; this.setDefaultState(getDefaultState().with(AGE, 0)); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(AGE); } - + @Override protected boolean isTerrain(BlockState state) { - for (Block block: terrain) { - if (state.isOf(block)) { + for (Block block : terrain) { + if (state.is(block)) { return true; } } return false; } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - if (state.get(AGE) < 3) { + public List getDrops(BlockState state, LootContext.Builder builder) { + if (state.getValue(AGE) < 3) { return Collections.singletonList(new ItemStack(this)); } - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && tool.isEffectiveOn(state)) { - int enchantment = EnchantmentHelper.getLevel(Enchantments.FORTUNE, tool); + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && tool.isCorrectToolForDrops(state)) { + int enchantment = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BLOCK_FORTUNE, tool); if (enchantment > 0) { - int countSeeds = MHelper.randRange(MathHelper.clamp(1 + enchantment, 1, 3), 3, MHelper.RANDOM); - int countDrops = MHelper.randRange(MathHelper.clamp(1 + enchantment, 1, 2), 2, MHelper.RANDOM); + int countSeeds = MHelper.randRange(Mth.clamp(1 + enchantment, 1, 3), 3, MHelper.RANDOM); + int countDrops = MHelper.randRange(Mth.clamp(1 + enchantment, 1, 2), 2, MHelper.RANDOM); return Lists.newArrayList(new ItemStack(this, countSeeds), new ItemStack(drop, countDrops)); } } @@ -83,38 +79,38 @@ public class EndCropBlock extends EndPlantBlock { int countDrops = MHelper.randRange(1, 2, MHelper.RANDOM); return Lists.newArrayList(new ItemStack(this, countSeeds), new ItemStack(drop, countDrops)); } - + @Override public AbstractBlock.OffsetType getOffsetType() { return AbstractBlock.OffsetType.NONE; } - + @Override - public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { - int age = state.get(AGE); + public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { + int age = state.getValue(AGE); if (age < 3) { BlocksHelper.setWithUpdate(world, pos, state.with(AGE, age + 1)); } } - + @Override public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { - return state.get(AGE) < 3; + return state.getValue(AGE) < 3; } - + @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { - return state.get(AGE) < 3; + public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { + return state.getValue(AGE) < 3; } - + @Override - public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + public void scheduledTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { super.scheduledTick(state, world, pos, random); if (canGrow(world, random, pos, state) && random.nextInt(8) == 0) { grow(world, random, pos, state); } } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { return SHAPE; diff --git a/src/main/java/ru/betterend/blocks/basis/EndDoorBlock.java b/src/main/java/ru/betterend/blocks/basis/EndDoorBlock.java index 797eb73d..8d6d21f8 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndDoorBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndDoorBlock.java @@ -1,31 +1,31 @@ package ru.betterend.blocks.basis; - + import java.io.Reader; import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.DoorBlock; -import net.minecraft.block.enums.DoubleBlockHalf; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.DoorBlock; +import net.minecraft.world.level.block.enums.DoubleBlockHalf; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.BlockPatterned; -import ru.betterend.patterns.Patterns; - +import ru.betterend.patterns.Patterns; + public class EndDoorBlock extends DoorBlock implements IRenderTypeable, BlockPatterned { public EndDoorBlock(Block source) { super(FabricBlockSettings.copyOf(source).strength(3F, 3F).nonOpaque()); } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - if (state.get(HALF) == DoubleBlockHalf.LOWER) + public List getDrops(BlockState state, LootContext.Builder builder) { + if (state.getValue(HALF) == DoubleBlockHalf.LOWER) return Collections.singletonList(new ItemStack(this.asItem())); else return Collections.emptyList(); @@ -35,16 +35,16 @@ public class EndDoorBlock extends DoorBlock implements IRenderTypeable, BlockPat public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override public String getStatesPattern(Reader data) { - String blockId = Registry.BLOCK.getId(this).getPath(); + String blockId = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, blockId, blockId); } - + @Override public String getModelPattern(String block) { - String blockId = Registry.BLOCK.getId(this).getPath(); + String blockId = Registry.BLOCK.getKey(this).getPath(); if (block.contains("item")) { return Patterns.createJson(Patterns.ITEM_GENERATED, block); } @@ -59,9 +59,9 @@ public class EndDoorBlock extends DoorBlock implements IRenderTypeable, BlockPat } return Patterns.createJson(Patterns.BLOCK_DOOR_BOTTOM, blockId, blockId); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_DOOR; } -} +} diff --git a/src/main/java/ru/betterend/blocks/basis/EndFenceBlock.java b/src/main/java/ru/betterend/blocks/basis/EndFenceBlock.java index e2c87c5e..30c55f1c 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndFenceBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndFenceBlock.java @@ -5,40 +5,40 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.FenceBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.FenceBlock; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; public class EndFenceBlock extends FenceBlock implements BlockPatterned { private final Block parent; - + public EndFenceBlock(Block source) { super(FabricBlockSettings.copyOf(source).nonOpaque()); this.parent = source; } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); if (block.contains("item")) { return Patterns.createJson(Patterns.ITEM_FENCE, parentId.getPath(), blockId.getPath()); } @@ -47,9 +47,9 @@ public class EndFenceBlock extends FenceBlock implements BlockPatterned { } return Patterns.createJson(Patterns.BLOCK_FENCE_POST, parentId.getPath(), blockId.getPath()); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_FENCE; } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java b/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java index 8e1daf69..5015766d 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java @@ -8,21 +8,21 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.FurnaceBlock; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.FurnaceBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.screen.NamedScreenHandlerFactory; import net.minecraft.stat.Stats; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; import ru.betterend.blocks.entities.EFurnaceBlockEntity; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; @@ -32,7 +32,7 @@ import ru.betterend.patterns.Patterns; public class EndFurnaceBlock extends FurnaceBlock implements BlockPatterned, IRenderTypeable { public EndFurnaceBlock(Block source) { super(FabricBlockSettings.copyOf(source).luminance((state) -> { - return state.get(LIT) ? 13 : 0; + return state.getValue(LIT) ? 13 : 0; })); } @@ -40,25 +40,25 @@ public class EndFurnaceBlock extends FurnaceBlock implements BlockPatterned, IRe public BlockEntity createBlockEntity(BlockView world) { return new EFurnaceBlockEntity(); } - + @Override - protected void openScreen(World world, BlockPos pos, PlayerEntity player) { + protected void openScreen(Level world, BlockPos pos, PlayerEntity player) { BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof EFurnaceBlockEntity) { player.openHandledScreen((NamedScreenHandlerFactory) blockEntity); player.incrementStat(Stats.INTERACT_WITH_FURNACE); } } - + @Override public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); Map map = Maps.newHashMap(); map.put("%top%", blockId.getPath() + "_top"); map.put("%side%", blockId.getPath() + "_side"); @@ -66,15 +66,14 @@ public class EndFurnaceBlock extends FurnaceBlock implements BlockPatterned, IRe map.put("%front%", blockId.getPath() + "_front_on"); map.put("%glow%", blockId.getPath() + "_glow"); return Patterns.createJson(Patterns.BLOCK_FURNACE_GLOW, map); - } - else { + } else { map.put("%front%", blockId.getPath() + "_front"); return Patterns.createJson(Patterns.BLOCK_FURNACE, map); } } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_FURNACE; } @@ -82,11 +81,11 @@ public class EndFurnaceBlock extends FurnaceBlock implements BlockPatterned, IRe public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { List drop = Lists.newArrayList(new ItemStack(this)); - BlockEntity blockEntity = builder.getNullable(LootContextParameters.BLOCK_ENTITY); + BlockEntity blockEntity = builder.getNullable(LootContextParams.BLOCK_ENTITY); if (blockEntity instanceof EFurnaceBlockEntity) { EFurnaceBlockEntity entity = (EFurnaceBlockEntity) blockEntity; for (int i = 0; i < entity.size(); i++) { diff --git a/src/main/java/ru/betterend/blocks/basis/EndGateBlock.java b/src/main/java/ru/betterend/blocks/basis/EndGateBlock.java index f7c8c240..ed2946e7 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndGateBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndGateBlock.java @@ -5,40 +5,40 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.FenceGateBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.FenceGateBlock; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; public class EndGateBlock extends FenceGateBlock implements BlockPatterned { private final Block parent; - + public EndGateBlock(Block source) { super(FabricBlockSettings.copyOf(source).nonOpaque()); this.parent = source; } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); if (block.contains("wall")) { if (block.contains("open")) { return Patterns.createJson(Patterns.BLOCK_GATE_OPEN_WALL, parentId.getPath(), blockId.getPath()); @@ -51,9 +51,9 @@ public class EndGateBlock extends FenceGateBlock implements BlockPatterned { } return Patterns.createJson(Patterns.BLOCK_GATE_CLOSED, parentId.getPath(), blockId.getPath()); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_GATE; } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/basis/EndLadderBlock.java b/src/main/java/ru/betterend/blocks/basis/EndLadderBlock.java index eaade397..f5f264f9 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndLadderBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndLadderBlock.java @@ -3,27 +3,27 @@ package ru.betterend.blocks.basis; import java.io.Reader; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.HorizontalFacingBlock; -import net.minecraft.block.ShapeContext; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.HorizontalFacingBlock; +import net.minecraft.world.level.block.ShapeContext; import net.minecraft.fluid.FluidState; import net.minecraft.fluid.Fluids; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.state.StateManager; +import net.minecraft.world.item.ItemPlacementContext; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.BooleanProperty; import net.minecraft.state.property.DirectionProperty; import net.minecraft.state.property.Properties; import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; @@ -44,13 +44,13 @@ public class EndLadderBlock extends BlockBaseNotFull implements IRenderTypeable, } @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(FACING); stateManager.add(WATERLOGGED); } public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - switch (state.get(FACING)) { + switch (state.getValue(FACING)) { case SOUTH: return SOUTH_SHAPE; case WEST: @@ -69,21 +69,21 @@ public class EndLadderBlock extends BlockBaseNotFull implements IRenderTypeable, @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - Direction direction = (Direction) state.get(FACING); - return this.canPlaceOn(world, pos.offset(direction.getOpposite()), direction); + Direction direction = (Direction) state.getValue(FACING); + return this.canPlaceOn(world, pos.relative(direction.getOpposite()), direction); } @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, - WorldAccess world, BlockPos pos, BlockPos neighborPos) { - if (facing.getOpposite() == state.get(FACING) && !state.canPlaceAt(world, pos)) { - return Blocks.AIR.getDefaultState(); + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, + BlockPos pos, BlockPos neighborPos) { + if (facing.getOpposite() == state.getValue(FACING) && !state.canPlaceAt(world, pos)) { + return Blocks.AIR.defaultBlockState(); } else { - if ((Boolean) state.get(WATERLOGGED)) { + if ((Boolean) state.getValue(WATERLOGGED)) { world.getFluidTickScheduler().schedule(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); } - return super.getStateForNeighborUpdate(state, facing, neighborState, world, pos, neighborPos); + return super.updateShape(state, facing, neighborState, world, pos, neighborPos); } } @@ -91,16 +91,16 @@ public class EndLadderBlock extends BlockBaseNotFull implements IRenderTypeable, public BlockState getPlacementState(ItemPlacementContext ctx) { BlockState blockState2; if (!ctx.canReplaceExisting()) { - blockState2 = ctx.getWorld().getBlockState(ctx.getBlockPos().offset(ctx.getSide().getOpposite())); + blockState2 = ctx.getLevel().getBlockState(ctx.getBlockPos().offset(ctx.getSide().getOpposite())); if (blockState2.getBlock() == this && blockState2.get(FACING) == ctx.getSide()) { return null; } } - blockState2 = this.getDefaultState(); - WorldView worldView = ctx.getWorld(); + blockState2 = this.defaultBlockState(); + WorldView worldView = ctx.getLevel(); BlockPos blockPos = ctx.getBlockPos(); - FluidState fluidState = ctx.getWorld().getFluidState(ctx.getBlockPos()); + FluidState fluidState = ctx.getLevel().getFluidState(ctx.getBlockPos()); Direction[] var6 = ctx.getPlacementDirections(); int var7 = var6.length; @@ -118,7 +118,7 @@ public class EndLadderBlock extends BlockBaseNotFull implements IRenderTypeable, } @Override - public BlockState rotate(BlockState state, BlockRotation rotation) { + public BlockState rotate(BlockState state, Rotation rotation) { return BlocksHelper.rotateHorizontal(state, rotation, FACING); } @@ -129,31 +129,31 @@ public class EndLadderBlock extends BlockBaseNotFull implements IRenderTypeable, @Override public FluidState getFluidState(BlockState state) { - return (Boolean) state.get(WATERLOGGED) ? Fluids.WATER.getStill(false) : super.getFluidState(state); + return (Boolean) state.getValue(WATERLOGGED) ? Fluids.WATER.getStill(false) : super.getFluidState(state); } @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override public String getStatesPattern(Reader data) { - String blockId = Registry.BLOCK.getId(this).getPath(); + String blockId = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, blockId, blockId); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); if (block.contains("item")) { return Patterns.createJson(Patterns.ITEM_BLOCK, blockId.getPath()); } return Patterns.createJson(Patterns.BLOCK_LADDER, blockId.getPath()); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_LADDER; } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java index 0b876665..dbbba91d 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java @@ -1,119 +1,110 @@ package ru.betterend.blocks.basis; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.FluidFillable; -import net.minecraft.block.Waterloggable; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.FluidFillable; +import net.minecraft.world.level.block.Waterloggable; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.FluidState; import net.minecraft.fluid.Fluids; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.state.StateManager; +import net.minecraft.world.item.ItemPlacementContext; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.BooleanProperty; import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.BlockView; -import net.minecraft.world.WorldAccess; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties; public class EndLanternBlock extends BlockBaseNotFull implements Waterloggable, FluidFillable { public static final BooleanProperty IS_FLOOR = BlockProperties.IS_FLOOR; public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; - + public EndLanternBlock(Block source) { this(FabricBlockSettings.copyOf(source).luminance(15).nonOpaque()); } - + public EndLanternBlock(FabricBlockSettings settings) { super(settings.nonOpaque()); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(IS_FLOOR, WATERLOGGED); } - + @Override public BlockState getPlacementState(ItemPlacementContext ctx) { - WorldView worldView = ctx.getWorld(); + WorldView worldView = ctx.getLevel(); BlockPos blockPos = ctx.getBlockPos(); Direction dir = ctx.getSide(); boolean water = worldView.getFluidState(blockPos).getFluid() == Fluids.WATER; if (dir != Direction.DOWN && dir != Direction.UP) { if (sideCoversSmallSquare(worldView, blockPos.up(), Direction.DOWN)) { return getDefaultState().with(IS_FLOOR, false).with(WATERLOGGED, water); - } - else if (sideCoversSmallSquare(worldView, blockPos.down(), Direction.UP)) { + } else if (sideCoversSmallSquare(worldView, blockPos.below(), Direction.UP)) { return getDefaultState().with(IS_FLOOR, true).with(WATERLOGGED, water); - } - else { + } else { return null; } - } - else if (dir == Direction.DOWN) { + } else if (dir == Direction.DOWN) { if (sideCoversSmallSquare(worldView, blockPos.up(), Direction.DOWN)) { return getDefaultState().with(IS_FLOOR, false).with(WATERLOGGED, water); - } - else if (sideCoversSmallSquare(worldView, blockPos.down(), Direction.UP)) { + } else if (sideCoversSmallSquare(worldView, blockPos.below(), Direction.UP)) { return getDefaultState().with(IS_FLOOR, true).with(WATERLOGGED, water); - } - else { + } else { return null; } - } - else { - if (sideCoversSmallSquare(worldView, blockPos.down(), Direction.UP)) { + } else { + if (sideCoversSmallSquare(worldView, blockPos.below(), Direction.UP)) { return getDefaultState().with(IS_FLOOR, true).with(WATERLOGGED, water); - } - else if (sideCoversSmallSquare(worldView, blockPos.up(), Direction.DOWN)) { + } else if (sideCoversSmallSquare(worldView, blockPos.up(), Direction.DOWN)) { return getDefaultState().with(IS_FLOOR, false).with(WATERLOGGED, water); - } - else { + } else { return null; } } } - + @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - if (state.get(IS_FLOOR)) { - return sideCoversSmallSquare(world, pos.down(), Direction.UP); - } - else { + if (state.getValue(IS_FLOOR)) { + return sideCoversSmallSquare(world, pos.below(), Direction.UP); + } else { return sideCoversSmallSquare(world, pos.up(), Direction.DOWN); } } - + @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { - Boolean water = state.get(WATERLOGGED); + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, + BlockPos pos, BlockPos neighborPos) { + Boolean water = state.getValue(WATERLOGGED); if (water) { world.getFluidTickScheduler().schedule(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); } if (!canPlaceAt(state, world, pos)) { - return water ? Blocks.WATER.getDefaultState() : Blocks.AIR.getDefaultState(); - } - else { + return water ? Blocks.WATER.defaultBlockState() : Blocks.AIR.defaultBlockState(); + } else { return state; } } - + @Override public boolean canFillWithFluid(BlockView world, BlockPos pos, BlockState state, Fluid fluid) { return false; } @Override - public boolean tryFillWithFluid(WorldAccess world, BlockPos pos, BlockState state, FluidState fluidState) { + public boolean tryFillWithFluid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { return false; } - + @Override public FluidState getFluidState(BlockState state) { - return state.get(WATERLOGGED) ? Fluids.WATER.getStill(false) : Fluids.EMPTY.getDefaultState(); + return state.getValue(WATERLOGGED) ? Fluids.WATER.getStill(false) : Fluids.EMPTY.defaultBlockState(); } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndLeavesBlock.java b/src/main/java/ru/betterend/blocks/basis/EndLeavesBlock.java index cb4e6ee9..b5b45e92 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndLeavesBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndLeavesBlock.java @@ -8,18 +8,18 @@ import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.LeavesBlock; -import net.minecraft.block.MaterialColor; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.BlockPatterned; @@ -28,61 +28,60 @@ import ru.betterend.util.MHelper; public class EndLeavesBlock extends LeavesBlock implements BlockPatterned, IRenderTypeable { private final Block sapling; - + public EndLeavesBlock(Block sapling, MaterialColor color) { - super(FabricBlockSettings.copyOf(Blocks.OAK_LEAVES) - .allowsSpawning((state, world, pos, type) -> { return false; }) - .suffocates((state, world, pos) -> { return false; }) - .blockVision((state, world, pos) -> { return false; }) - .materialColor(color) - .breakByTool(FabricToolTags.HOES) - .breakByTool(FabricToolTags.SHEARS) - .breakByHand(true)); + super(FabricBlockSettings.copyOf(Blocks.OAK_LEAVES).allowsSpawning((state, world, pos, type) -> { + return false; + }).suffocates((state, world, pos) -> { + return false; + }).blockVision((state, world, pos) -> { + return false; + }).materialColor(color).breakByTool(FabricToolTags.HOES).breakByTool(FabricToolTags.SHEARS).breakByHand(true)); this.sapling = sapling; } - + public EndLeavesBlock(Block sapling, MaterialColor color, int light) { - super(FabricBlockSettings.copyOf(Blocks.OAK_LEAVES) - .allowsSpawning((state, world, pos, type) -> { return false; }) - .suffocates((state, world, pos) -> { return false; }) - .blockVision((state, world, pos) -> { return false; }) - .materialColor(color) - .luminance(light) - .breakByTool(FabricToolTags.HOES) - .breakByTool(FabricToolTags.SHEARS)); + super(FabricBlockSettings.copyOf(Blocks.OAK_LEAVES).allowsSpawning((state, world, pos, type) -> { + return false; + }).suffocates((state, world, pos) -> { + return false; + }).blockVision((state, world, pos) -> { + return false; + }).materialColor(color).luminance(light).breakByTool(FabricToolTags.HOES).breakByTool(FabricToolTags.SHEARS)); this.sapling = sapling; } - + @Override public String getStatesPattern(Reader data) { - String blockId = Registry.BLOCK.getId(this).getPath(); + String blockId = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, blockId, blockId); } - + @Override public String getModelPattern(String block) { - String blockId = Registry.BLOCK.getId(this).getPath(); + String blockId = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(Patterns.BLOCK_BASE, blockId, blockId); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_SIMPLE; } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); if (tool != null) { - if (tool.getItem().isIn(FabricToolTags.SHEARS) || EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { + if (tool.getItem().isIn(FabricToolTags.SHEARS) + || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Collections.singletonList(new ItemStack(this)); } - int fortune = EnchantmentHelper.getLevel(Enchantments.FORTUNE, tool); + int fortune = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BLOCK_FORTUNE, tool); if (MHelper.RANDOM.nextInt(16) <= fortune) { return Lists.newArrayList(new ItemStack(sapling)); } diff --git a/src/main/java/ru/betterend/blocks/basis/EndMetalPaneBlock.java b/src/main/java/ru/betterend/blocks/basis/EndMetalPaneBlock.java index 6ec846cd..a83998c1 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndMetalPaneBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndMetalPaneBlock.java @@ -7,14 +7,14 @@ import java.util.List; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.PaneBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.Direction; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.PaneBlock; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.BlockPatterned; @@ -26,30 +26,29 @@ public class EndMetalPaneBlock extends PaneBlock implements BlockPatterned, IRen } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); if (block.contains("item")) { return Patterns.createJson(Patterns.ITEM_BLOCK, blockId.getPath()); } if (block.contains("post")) { return Patterns.createJson(Patterns.BLOCK_BARS_POST, blockId.getPath(), blockId.getPath()); - } - else { + } else { return Patterns.createJson(Patterns.BLOCK_BARS_SIDE, blockId.getPath(), blockId.getPath()); } } - + @Environment(EnvType.CLIENT) public boolean isSideInvisible(BlockState state, BlockState stateFrom, Direction direction) { if (direction.getAxis().isVertical() && stateFrom.getBlock().is(this) && !stateFrom.equals(state)) { @@ -57,12 +56,12 @@ public class EndMetalPaneBlock extends PaneBlock implements BlockPatterned, IRen } return super.isSideInvisible(state, stateFrom, direction); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_BARS; } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; diff --git a/src/main/java/ru/betterend/blocks/basis/EndMetalPlateBlock.java b/src/main/java/ru/betterend/blocks/basis/EndMetalPlateBlock.java index 8b6808f2..17a54773 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndMetalPlateBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndMetalPlateBlock.java @@ -5,48 +5,48 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.WeightedPressurePlateBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.WeightedPressurePlateBlock; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; public class EndMetalPlateBlock extends WeightedPressurePlateBlock implements BlockPatterned { private final Block parent; - + public EndMetalPlateBlock(Block source) { super(15, FabricBlockSettings.copyOf(source).noCollision().nonOpaque().requiresTool().strength(0.5F)); this.parent = source; } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); if (block.contains("down")) { return Patterns.createJson(Patterns.BLOCK_PLATE_DOWN, parentId.getPath(), blockId.getPath()); } return Patterns.createJson(Patterns.BLOCK_PLATE_UP, parentId.getPath(), blockId.getPath()); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_PLATE; } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndOreBlock.java b/src/main/java/ru/betterend/blocks/basis/EndOreBlock.java index 7ccab8b4..7e9750d0 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndOreBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndOreBlock.java @@ -6,20 +6,20 @@ import java.util.List; import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.block.MaterialColor; -import net.minecraft.block.OreBlock; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.block.OreBlock; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.core.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; import ru.betterend.util.MHelper; @@ -29,36 +29,33 @@ public class EndOreBlock extends OreBlock implements BlockPatterned { private final int minCount; private final int maxCount; private final int expirience; - + public EndOreBlock(Item drop, int minCount, int maxCount, int expirience) { - super(FabricBlockSettings.of(Material.STONE, MaterialColor.SAND) - .hardness(3F) - .resistance(9F) - .requiresTool() - .sounds(BlockSoundGroup.STONE)); + super(FabricBlockSettings.of(Material.STONE, MaterialColor.SAND).hardness(3F).resistance(9F).requiresTool() + .sounds(SoundType.STONE)); this.dropItem = drop; this.minCount = minCount; this.maxCount = maxCount; this.expirience = expirience; } - + @Override protected int getExperienceWhenMined(Random random) { return this.expirience > 0 ? random.nextInt(expirience) + 1 : 0; } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && tool.isEffectiveOn(state)) { - if (EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && tool.isCorrectToolForDrops(state)) { + if (EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Collections.singletonList(new ItemStack(this)); } int count = 0; - int enchantment = EnchantmentHelper.getLevel(Enchantments.FORTUNE, tool); + int enchantment = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BLOCK_FORTUNE, tool); if (enchantment > 0) { - int min = MathHelper.clamp(minCount + enchantment, minCount, maxCount); - int max = maxCount + (enchantment / Enchantments.FORTUNE.getMaxLevel()); + int min = Mth.clamp(minCount + enchantment, minCount, maxCount); + int max = maxCount + (enchantment / Enchantments.BLOCK_FORTUNE.getMaxLevel()); if (min == max) { return Collections.singletonList(new ItemStack(dropItem, max)); } @@ -70,21 +67,21 @@ public class EndOreBlock extends OreBlock implements BlockPatterned { } return Collections.emptyList(); } - + @Override public String getStatesPattern(Reader data) { - String block = Registry.BLOCK.getId(this).getPath(); + String block = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, block, block); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(Patterns.BLOCK_BASE, blockId.getPath(), block); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_SIMPLE; } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndPillarBlock.java b/src/main/java/ru/betterend/blocks/basis/EndPillarBlock.java index 92941d8e..492115fd 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndPillarBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndPillarBlock.java @@ -5,44 +5,44 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.PillarBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class EndPillarBlock extends PillarBlock implements BlockPatterned { - public EndPillarBlock(Settings settings) { +public class EndPillarBlock extends RotatedPillarBlock implements BlockPatterned { + public EndPillarBlock(Properties settings) { super(settings); } - + public EndPillarBlock(Block block) { super(FabricBlockSettings.copyOf(block)); } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { - String texture = Registry.BLOCK.getId(this).getPath(); + String texture = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, texture, texture); } - + @Override public String getModelPattern(String block) { - String texture = Registry.BLOCK.getId(this).getPath(); + String texture = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(Patterns.BLOCK_PILLAR, texture, texture); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_PILLAR; } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/EndPlantBlock.java index b684f604..da0e6a7e 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndPlantBlock.java @@ -7,28 +7,28 @@ import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Fertilizable; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.entity.ItemEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.AbstractBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Fertilizable; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.entity.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.util.math.Vec3d; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; @@ -36,33 +36,27 @@ import ru.betterend.registry.EndTags; public class EndPlantBlock extends BlockBaseNotFull implements IRenderTypeable, Fertilizable { private static final VoxelShape SHAPE = Block.createCuboidShape(4, 0, 4, 12, 14, 12); - + public EndPlantBlock() { this(false); } - + public EndPlantBlock(int light) { this(false, light); } - + public EndPlantBlock(boolean replaceable) { super(FabricBlockSettings.of(replaceable ? Material.REPLACEABLE_PLANT : Material.PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.GRASS) - .breakByHand(true) - .noCollision()); + .breakByTool(FabricToolTags.SHEARS).sounds(SoundType.GRASS).breakByHand(true).noCollision()); } - + public EndPlantBlock(boolean replaceable, int light) { super(FabricBlockSettings.of(replaceable ? Material.REPLACEABLE_PLANT : Material.PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.GRASS) - .luminance(light) - .breakByHand(true) + .breakByTool(FabricToolTags.SHEARS).sounds(SoundType.GRASS).luminance(light).breakByHand(true) .noCollision()); } - - public EndPlantBlock(Settings settings) { + + public EndPlantBlock(Properties settings) { super(settings); } @@ -79,35 +73,35 @@ public class EndPlantBlock extends BlockBaseNotFull implements IRenderTypeable, @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - BlockState down = world.getBlockState(pos.down()); + BlockState down = world.getBlockState(pos.below()); return isTerrain(down); } - + protected boolean isTerrain(BlockState state) { return state.isIn(EndTags.END_GROUND); } @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, + BlockPos pos, BlockPos neighborPos) { if (!canPlaceAt(state, world, pos)) { - return Blocks.AIR.getDefaultState(); - } - else { + return Blocks.AIR.defaultBlockState(); + } else { return state; } } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) || EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) + || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Lists.newArrayList(new ItemStack(this)); - } - else { + } else { return Lists.newArrayList(); } } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; @@ -119,13 +113,14 @@ public class EndPlantBlock extends BlockBaseNotFull implements IRenderTypeable, } @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { + public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { return true; } @Override - public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { - ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(this)); + public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { + ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, + new ItemStack(this)); world.spawnEntity(item); } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java b/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java index b255d50b..fcdd6240 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java @@ -4,59 +4,54 @@ import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.IntProperty; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; import ru.betterend.blocks.BlockProperties; public abstract class EndPlantWithAgeBlock extends EndPlantBlock { - public static final IntProperty AGE = BlockProperties.AGE; - + public static final IntegerProperty AGE = BlockProperties.AGE; + public EndPlantWithAgeBlock() { - this(FabricBlockSettings.of(Material.PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.GRASS) - .breakByHand(true) - .ticksRandomly() - .noCollision()); + this(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).sounds(SoundType.GRASS) + .breakByHand(true).ticksRandomly().noCollision()); } - + public EndPlantWithAgeBlock(FabricBlockSettings settings) { super(settings); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(AGE); } - + public abstract void growAdult(StructureWorldAccess world, Random random, BlockPos pos); - + @Override - public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { - int age = state.get(AGE); + public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { + int age = state.getValue(AGE); if (age < 3) { - world.setBlockState(pos, state.with(AGE, age + 1)); - } - else { + world.setBlockAndUpdate(pos, state.with(AGE, age + 1)); + } else { growAdult(world, random, pos); } } - + @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { + public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { return true; } - + @Override - public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + public void scheduledTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { super.scheduledTick(state, world, pos, random); if (random.nextInt(8) == 0) { grow(world, random, pos, state); diff --git a/src/main/java/ru/betterend/blocks/basis/EndPlateBlock.java b/src/main/java/ru/betterend/blocks/basis/EndPlateBlock.java index c38a3045..9bf2a9b6 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndPlateBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndPlateBlock.java @@ -5,48 +5,48 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.PressurePlateBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.PressurePlateBlock; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; public class EndPlateBlock extends PressurePlateBlock implements BlockPatterned { private final Block parent; - + public EndPlateBlock(ActivationRule rule, Block source) { super(rule, FabricBlockSettings.copyOf(source).noCollision().nonOpaque().strength(0.5F)); this.parent = source; } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); if (block.contains("down")) { return Patterns.createJson(Patterns.BLOCK_PLATE_DOWN, parentId.getPath(), blockId.getPath()); } return Patterns.createJson(Patterns.BLOCK_PLATE_UP, parentId.getPath(), blockId.getPath()); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return this.stateManager.getProperty("facing") != null ? Patterns.STATE_PLATE_ROTATED : Patterns.STATE_PLATE; } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java b/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java index b194dc26..a5687f85 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java @@ -5,38 +5,38 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.AbstractSignBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.world.level.block.AbstractSignBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.PlayerEntity; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.FluidState; import net.minecraft.fluid.Fluids; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; +import net.minecraft.world.item.ItemPlacementContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.network.packet.s2c.play.SignEditorOpenS2CPacket; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.state.StateManager; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.IntProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; import net.minecraft.state.property.Properties; import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.Identifier; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.SignType; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.Mth; +import net.minecraft.core.Registry; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; import ru.betterend.blocks.entities.ESignBlockEntity; import ru.betterend.interfaces.ISpetialItem; @@ -45,86 +45,84 @@ import ru.betterend.patterns.Patterns; import ru.betterend.util.BlocksHelper; public class EndSignBlock extends AbstractSignBlock implements BlockPatterned, ISpetialItem { - public static final IntProperty ROTATION = Properties.ROTATION; + public static final IntegerProperty ROTATION = Properties.ROTATION; public static final BooleanProperty FLOOR = BooleanProperty.of("floor"); private static final VoxelShape[] WALL_SHAPES = new VoxelShape[] { - Block.createCuboidShape(0.0D, 4.5D, 14.0D, 16.0D, 12.5D, 16.0D), - Block.createCuboidShape(0.0D, 4.5D, 0.0D, 2.0D, 12.5D, 16.0D), - Block.createCuboidShape(0.0D, 4.5D, 0.0D, 16.0D, 12.5D, 2.0D), - Block.createCuboidShape(14.0D, 4.5D, 0.0D, 16.0D, 12.5D, 16.0D) - }; + Block.createCuboidShape(0.0D, 4.5D, 14.0D, 16.0D, 12.5D, 16.0D), + Block.createCuboidShape(0.0D, 4.5D, 0.0D, 2.0D, 12.5D, 16.0D), + Block.createCuboidShape(0.0D, 4.5D, 0.0D, 16.0D, 12.5D, 2.0D), + Block.createCuboidShape(14.0D, 4.5D, 0.0D, 16.0D, 12.5D, 16.0D) }; private final Block parent; - + public EndSignBlock(Block source) { super(FabricBlockSettings.copyOf(source).strength(1.0F, 1.0F).noCollision().nonOpaque(), SignType.OAK); - this.setDefaultState(this.stateManager.getDefaultState().with(ROTATION, 0).with(FLOOR, false).with(WATERLOGGED, false)); + this.setDefaultState( + this.stateManager.defaultBlockState().with(ROTATION, 0).with(FLOOR, false).with(WATERLOGGED, false)); this.parent = source; } @Override - protected void appendProperties(StateManager.Builder builder) { + protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(ROTATION, FLOOR, WATERLOGGED); } @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return state.get(FLOOR) ? SHAPE : WALL_SHAPES[state.get(ROTATION) >> 2]; + return state.getValue(FLOOR) ? SHAPE : WALL_SHAPES[state.getValue(ROTATION) >> 2]; } @Override public BlockEntity createBlockEntity(BlockView world) { return new ESignBlockEntity(); } - + @Override - public void onPlaced(World world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { + public void onPlaced(Level world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { if (placer != null && placer instanceof PlayerEntity) { ESignBlockEntity sign = (ESignBlockEntity) world.getBlockEntity(pos); - if (!world.isClient) { + if (!world.isClientSide) { sign.setEditor((PlayerEntity) placer); - ((ServerPlayerEntity) placer).networkHandler.sendPacket(new SignEditorOpenS2CPacket(pos)); - } - else { + ((ServerPlayer) placer).networkHandler.sendPacket(new SignEditorOpenS2CPacket(pos)); + } else { sign.setEditable(true); } } } @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { - if ((Boolean) state.get(WATERLOGGED)) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, + BlockPos pos, BlockPos neighborPos) { + if ((Boolean) state.getValue(WATERLOGGED)) { world.getFluidTickScheduler().schedule(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); } if (!canPlaceAt(state, world, pos)) { - return state.get(WATERLOGGED) ? state.getFluidState().getBlockState() : Blocks.AIR.getDefaultState(); + return state.getValue(WATERLOGGED) ? state.getFluidState().getBlockState() : Blocks.AIR.defaultBlockState(); } - return super.getStateForNeighborUpdate(state, facing, neighborState, world, pos, neighborPos); + return super.updateShape(state, facing, neighborState, world, pos, neighborPos); } @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - if (!state.get(FLOOR)) { - int index = (((state.get(ROTATION) >> 2) + 2)) & 3; - return world.getBlockState(pos.offset(BlocksHelper.HORIZONTAL[index])).getMaterial().isSolid(); - } - else { - return world.getBlockState(pos.down()).getMaterial().isSolid(); + if (!state.getValue(FLOOR)) { + int index = (((state.getValue(ROTATION) >> 2) + 2)) & 3; + return world.getBlockState(pos.relative(BlocksHelper.HORIZONTAL[index])).getMaterial().isSolid(); + } else { + return world.getBlockState(pos.below()).getMaterial().isSolid(); } } @Override public BlockState getPlacementState(ItemPlacementContext ctx) { if (ctx.getSide() == Direction.UP) { - FluidState fluidState = ctx.getWorld().getFluidState(ctx.getBlockPos()); - return this.getDefaultState().with(FLOOR, true) - .with(ROTATION, MathHelper.floor((180.0 + ctx.getPlayerYaw() * 16.0 / 360.0) + 0.5 - 12) & 15) + FluidState fluidState = ctx.getLevel().getFluidState(ctx.getBlockPos()); + return this.defaultBlockState().with(FLOOR, true) + .with(ROTATION, Mth.floor((180.0 + ctx.getPlayerYaw() * 16.0 / 360.0) + 0.5 - 12) & 15) .with(WATERLOGGED, fluidState.getFluid() == Fluids.WATER); - } - else if (ctx.getSide() != Direction.DOWN) { - BlockState blockState = this.getDefaultState(); - FluidState fluidState = ctx.getWorld().getFluidState(ctx.getBlockPos()); - WorldView worldView = ctx.getWorld(); + } else if (ctx.getSide() != Direction.DOWN) { + BlockState blockState = this.defaultBlockState(); + FluidState fluidState = ctx.getLevel().getFluidState(ctx.getBlockPos()); + WorldView worldView = ctx.getLevel(); BlockPos blockPos = ctx.getBlockPos(); Direction[] directions = ctx.getPlacementDirections(); @@ -132,7 +130,7 @@ public class EndSignBlock extends AbstractSignBlock implements BlockPatterned, I Direction direction = directions[i]; if (direction.getAxis().isHorizontal()) { Direction dir = direction.getOpposite(); - int rot = MathHelper.floor((180.0 + dir.asRotation() * 16.0 / 360.0) + 0.5 + 4) & 15; + int rot = Mth.floor((180.0 + dir.asRotation() * 16.0 / 360.0) + 0.5 + 4) & 15; blockState = blockState.with(ROTATION, rot); if (blockState.canPlaceAt(worldView, blockPos)) { return blockState.with(FLOOR, false).with(WATERLOGGED, fluidState.getFluid() == Fluids.WATER); @@ -143,45 +141,45 @@ public class EndSignBlock extends AbstractSignBlock implements BlockPatterned, I return null; } - + @Override public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String path) { - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); if (path.contains("item")) { return Patterns.createJson(Patterns.ITEM_GENERATED, path); } return Patterns.createJson(Patterns.BLOCK_EMPTY, parentId.getPath()); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_SIMPLE; } - + @Override - public BlockState rotate(BlockState state, BlockRotation rotation) { - return (BlockState) state.with(ROTATION, rotation.rotate((Integer) state.get(ROTATION), 16)); + public BlockState rotate(BlockState state, Rotation rotation) { + return (BlockState) state.with(ROTATION, rotation.rotate((Integer) state.getValue(ROTATION), 16)); } @Override public BlockState mirror(BlockState state, BlockMirror mirror) { - return (BlockState) state.with(ROTATION, mirror.mirror((Integer) state.get(ROTATION), 16)); + return (BlockState) state.with(ROTATION, mirror.mirror((Integer) state.getValue(ROTATION), 16)); } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } @Override - public Fluid tryDrainFluid(WorldAccess world, BlockPos pos, BlockState state) { + public Fluid tryDrainFluid(LevelAccessor world, BlockPos pos, BlockState state) { // TODO Auto-generated method stub return null; } @@ -193,7 +191,7 @@ public class EndSignBlock extends AbstractSignBlock implements BlockPatterned, I } @Override - public boolean tryFillWithFluid(WorldAccess world, BlockPos pos, BlockState state, FluidState fluidState) { + public boolean tryFillWithFluid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { // TODO Auto-generated method stub return false; } diff --git a/src/main/java/ru/betterend/blocks/basis/EndSlabBlock.java b/src/main/java/ru/betterend/blocks/basis/EndSlabBlock.java index 102d6966..59139636 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndSlabBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndSlabBlock.java @@ -5,45 +5,45 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.SlabBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.SlabBlock; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; public class EndSlabBlock extends SlabBlock implements BlockPatterned { private final Block parent; - + public EndSlabBlock(Block source) { super(FabricBlockSettings.copyOf(source)); this.parent = source; } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(Patterns.BLOCK_SLAB, parentId.getPath(), blockId.getPath()); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_SLAB; } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndStairsBlock.java b/src/main/java/ru/betterend/blocks/basis/EndStairsBlock.java index cbbaf6b0..def04b1c 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndStairsBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndStairsBlock.java @@ -5,41 +5,42 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.StairsBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.StairsBlock; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; public class EndStairsBlock extends StairsBlock implements BlockPatterned { - + private final Block parent; - + public EndStairsBlock(Block source) { - super(source.getDefaultState(), FabricBlockSettings.copyOf(source)); + super(source.defaultBlockState(), FabricBlockSettings.copyOf(source)); this.parent = source; } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); if (block.contains("inner")) { return Patterns.createJson(Patterns.BLOCK_STAIR_INNER, parentId.getPath(), blockId.getPath()); } @@ -48,9 +49,9 @@ public class EndStairsBlock extends StairsBlock implements BlockPatterned { } return Patterns.createJson(Patterns.BLOCK_STAIR, parentId.getPath(), blockId.getPath()); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_STAIRS; } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndStoneButtonBlock.java b/src/main/java/ru/betterend/blocks/basis/EndStoneButtonBlock.java index 2476bd80..e8e51ec5 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndStoneButtonBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndStoneButtonBlock.java @@ -5,40 +5,40 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.StoneButtonBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.StoneButtonBlock; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; public class EndStoneButtonBlock extends StoneButtonBlock implements BlockPatterned { private final Block parent; - + public EndStoneButtonBlock(Block source) { super(FabricBlockSettings.copyOf(source).nonOpaque()); this.parent = source; } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); if (block.contains("item")) { return Patterns.createJson(Patterns.ITEM_BUTTON, parentId.getPath(), blockId.getPath()); } @@ -47,9 +47,9 @@ public class EndStoneButtonBlock extends StoneButtonBlock implements BlockPatter } return Patterns.createJson(Patterns.BLOCK_BUTTON, parentId.getPath(), blockId.getPath()); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_BUTTON; } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndStonelateBlock.java b/src/main/java/ru/betterend/blocks/basis/EndStonelateBlock.java index 0e8b9dd6..80a39785 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndStonelateBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndStonelateBlock.java @@ -1,6 +1,6 @@ package ru.betterend.blocks.basis; -import net.minecraft.block.Block; +import net.minecraft.world.level.block.Block; public class EndStonelateBlock extends EndPlateBlock { public EndStonelateBlock(Block source) { diff --git a/src/main/java/ru/betterend/blocks/basis/EndTrapdoorBlock.java b/src/main/java/ru/betterend/blocks/basis/EndTrapdoorBlock.java index c8dbf0ed..25330f0a 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndTrapdoorBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndTrapdoorBlock.java @@ -6,13 +6,13 @@ import java.util.HashMap; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.TrapdoorBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.TrapdoorBlock; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.BlockPatterned; @@ -24,24 +24,24 @@ public class EndTrapdoorBlock extends TrapdoorBlock implements IRenderTypeable, } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override public String getStatesPattern(Reader data) { - String block = Registry.BLOCK.getId(this).getPath(); + String block = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, block, block); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); String name = blockId.getPath(); return Patterns.createJson(Patterns.BLOCK_TRAPDOOR, new HashMap() { private static final long serialVersionUID = 1L; @@ -51,9 +51,9 @@ public class EndTrapdoorBlock extends TrapdoorBlock implements IRenderTypeable, } }); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_TRAPDOOR; } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndUnderwaterWallPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/EndUnderwaterWallPlantBlock.java index 3216584d..482c14ca 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndUnderwaterWallPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndUnderwaterWallPlantBlock.java @@ -2,56 +2,49 @@ package ru.betterend.blocks.basis; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.BlockState; -import net.minecraft.block.FluidFillable; -import net.minecraft.block.Material; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.FluidFillable; +import net.minecraft.world.level.material.Material; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.FluidState; import net.minecraft.fluid.Fluids; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; public class EndUnderwaterWallPlantBlock extends EndWallPlantBlock implements FluidFillable { - + public EndUnderwaterWallPlantBlock() { - super(FabricBlockSettings.of(Material.UNDERWATER_PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.WET_GRASS) - .breakByHand(true) - .noCollision()); + super(FabricBlockSettings.of(Material.UNDERWATER_PLANT).breakByTool(FabricToolTags.SHEARS) + .sounds(SoundType.WET_GRASS).breakByHand(true).noCollision()); } - + public EndUnderwaterWallPlantBlock(int light) { - super(FabricBlockSettings.of(Material.UNDERWATER_PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.WET_GRASS) - .luminance(light) - .breakByHand(true) - .noCollision()); + super(FabricBlockSettings.of(Material.UNDERWATER_PLANT).breakByTool(FabricToolTags.SHEARS) + .sounds(SoundType.WET_GRASS).luminance(light).breakByHand(true).noCollision()); } - - public EndUnderwaterWallPlantBlock(Settings settings) { + + public EndUnderwaterWallPlantBlock(Properties settings) { super(settings); } - + @Override public boolean canFillWithFluid(BlockView world, BlockPos pos, BlockState state, Fluid fluid) { return false; } @Override - public boolean tryFillWithFluid(WorldAccess world, BlockPos pos, BlockState state, FluidState fluidState) { + public boolean tryFillWithFluid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { return false; } - + @Override public FluidState getFluidState(BlockState state) { return Fluids.WATER.getStill(false); } - + @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { return world.getFluidState(pos).getFluid() == Fluids.WATER && super.canPlaceAt(state, world, pos); diff --git a/src/main/java/ru/betterend/blocks/basis/EndWallBlock.java b/src/main/java/ru/betterend/blocks/basis/EndWallBlock.java index 3ce75cd6..b95c3c18 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndWallBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndWallBlock.java @@ -5,41 +5,41 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.WallBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.WallBlock; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; public class EndWallBlock extends WallBlock implements BlockPatterned { - + private final Block parent; - + public EndWallBlock(Block source) { super(FabricBlockSettings.copyOf(source).nonOpaque()); this.parent = source; } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); if (block.contains("item")) { return Patterns.createJson(Patterns.ITEM_WALL, parentId.getPath(), blockId.getPath()); } @@ -51,9 +51,9 @@ public class EndWallBlock extends WallBlock implements BlockPatterned { } return Patterns.createJson(Patterns.BLOCK_WALL_POST, parentId.getPath(), blockId.getPath()); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_WALL; } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndWallPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/EndWallPlantBlock.java index 6de67ec3..25848862 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndWallPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndWallPlantBlock.java @@ -7,64 +7,56 @@ import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.HorizontalFacingBlock; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; +import net.minecraft.world.level.block.AbstractBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.HorizontalFacingBlock; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.item.ItemPlacementContext; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.DirectionProperty; import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; import ru.betterend.util.BlocksHelper; public class EndWallPlantBlock extends EndPlantBlock { - private static final EnumMap SHAPES = Maps.newEnumMap(ImmutableMap.of( - Direction.NORTH, Block.createCuboidShape(1, 1, 8, 15, 15, 16), - Direction.SOUTH, Block.createCuboidShape(1, 1, 0, 15, 15, 8), - Direction.WEST, Block.createCuboidShape(8, 1, 1, 16, 15, 15), - Direction.EAST, Block.createCuboidShape(0, 1, 1, 8, 15, 15))); + private static final EnumMap SHAPES = Maps.newEnumMap(ImmutableMap.of(Direction.NORTH, + Block.createCuboidShape(1, 1, 8, 15, 15, 16), Direction.SOUTH, Block.createCuboidShape(1, 1, 0, 15, 15, 8), + Direction.WEST, Block.createCuboidShape(8, 1, 1, 16, 15, 15), Direction.EAST, + Block.createCuboidShape(0, 1, 1, 8, 15, 15))); public static final DirectionProperty FACING = HorizontalFacingBlock.FACING; - + public EndWallPlantBlock() { - this(FabricBlockSettings.of(Material.PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.GRASS) - .breakByHand(true) - .noCollision()); + this(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).sounds(SoundType.GRASS) + .breakByHand(true).noCollision()); } - + public EndWallPlantBlock(int light) { - this(FabricBlockSettings.of(Material.PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.GRASS) - .luminance(light) - .breakByHand(true) - .noCollision()); + this(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).sounds(SoundType.GRASS) + .luminance(light).breakByHand(true).noCollision()); } - - public EndWallPlantBlock(Settings settings) { + + public EndWallPlantBlock(Properties settings) { super(settings); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(FACING); } @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return SHAPES.get(state.get(FACING)); + return SHAPES.get(state.getValue(FACING)); } @Override @@ -74,20 +66,20 @@ public class EndWallPlantBlock extends EndPlantBlock { @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - Direction direction = (Direction) state.get(FACING); - BlockPos blockPos = pos.offset(direction.getOpposite()); + Direction direction = (Direction) state.getValue(FACING); + BlockPos blockPos = pos.relative(direction.getOpposite()); BlockState blockState = world.getBlockState(blockPos); return isSupport(world, blockPos, blockState, direction); } - + public boolean isSupport(WorldView world, BlockPos pos, BlockState blockState, Direction direction) { return blockState.getMaterial().isSolid() && blockState.isSideSolidFullSquare(world, pos, direction); } - + @Override public BlockState getPlacementState(ItemPlacementContext ctx) { - BlockState blockState = this.getDefaultState(); - WorldView worldView = ctx.getWorld(); + BlockState blockState = this.defaultBlockState(); + WorldView worldView = ctx.getLevel(); BlockPos blockPos = ctx.getBlockPos(); Direction[] directions = ctx.getPlacementDirections(); for (int i = 0; i < directions.length; ++i) { @@ -104,17 +96,17 @@ public class EndWallPlantBlock extends EndPlantBlock { } @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, + BlockPos pos, BlockPos neighborPos) { if (!canPlaceAt(state, world, pos)) { - return Blocks.AIR.getDefaultState(); - } - else { + return Blocks.AIR.defaultBlockState(); + } else { return state; } } - + @Override - public BlockState rotate(BlockState state, BlockRotation rotation) { + public BlockState rotate(BlockState state, Rotation rotation) { return BlocksHelper.rotateHorizontal(state, rotation, FACING); } diff --git a/src/main/java/ru/betterend/blocks/basis/EndWoodenButtonBlock.java b/src/main/java/ru/betterend/blocks/basis/EndWoodenButtonBlock.java index d81f8dbc..67493ed2 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndWoodenButtonBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndWoodenButtonBlock.java @@ -5,40 +5,40 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.WoodenButtonBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.WoodenButtonBlock; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; public class EndWoodenButtonBlock extends WoodenButtonBlock implements BlockPatterned { private final Block parent; - + public EndWoodenButtonBlock(Block source) { super(FabricBlockSettings.copyOf(source).strength(0.5F, 0.5F).nonOpaque()); this.parent = source; } @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); - Identifier parentId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); if (block.contains("item")) { return Patterns.createJson(Patterns.ITEM_BUTTON, parentId.getPath(), blockId.getPath()); } @@ -47,9 +47,9 @@ public class EndWoodenButtonBlock extends WoodenButtonBlock implements BlockPatt } return Patterns.createJson(Patterns.BLOCK_BUTTON, parentId.getPath(), blockId.getPath()); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_BUTTON; } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndWoodenPlateBlock.java b/src/main/java/ru/betterend/blocks/basis/EndWoodenPlateBlock.java index e167c109..005eba94 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndWoodenPlateBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndWoodenPlateBlock.java @@ -1,6 +1,6 @@ package ru.betterend.blocks.basis; -import net.minecraft.block.Block; +import net.minecraft.world.level.block.Block; public class EndWoodenPlateBlock extends EndPlateBlock { public EndWoodenPlateBlock(Block source) { diff --git a/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java b/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java index c5bcb65b..3dbe80ba 100644 --- a/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java @@ -4,22 +4,22 @@ import java.io.Reader; import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Fertilizable; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Fertilizable; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; import net.minecraft.world.gen.feature.Feature; import ru.betterend.client.render.ERenderLayer; @@ -29,26 +29,17 @@ import ru.betterend.registry.EndTags; public abstract class FeatureSaplingBlock extends BlockBaseNotFull implements Fertilizable, IRenderTypeable { private static final VoxelShape SHAPE = Block.createCuboidShape(4, 0, 4, 12, 14, 12); - + public FeatureSaplingBlock() { - super(FabricBlockSettings.of(Material.PLANT) - .breakByHand(true) - .collidable(false) - .breakInstantly() - .sounds(BlockSoundGroup.GRASS) - .ticksRandomly()); + super(FabricBlockSettings.of(Material.PLANT).breakByHand(true).collidable(false).breakInstantly() + .sounds(SoundType.GRASS).ticksRandomly()); } - + public FeatureSaplingBlock(int light) { - super(FabricBlockSettings.of(Material.PLANT) - .breakByHand(true) - .collidable(false) - .breakInstantly() - .sounds(BlockSoundGroup.GRASS) - .luminance(light) - .ticksRandomly()); + super(FabricBlockSettings.of(Material.PLANT).breakByHand(true).collidable(false).breakInstantly() + .sounds(SoundType.GRASS).luminance(light).ticksRandomly()); } - + protected abstract Feature getFeature(); @Override @@ -58,13 +49,14 @@ public abstract class FeatureSaplingBlock extends BlockBaseNotFull implements Fe @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return world.getBlockState(pos.down()).isIn(EndTags.END_GROUND); + return world.getBlockState(pos.below()).isIn(EndTags.END_GROUND); } @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, + BlockPos pos, BlockPos neighborPos) { if (!canPlaceAt(state, world, pos)) - return Blocks.AIR.getDefaultState(); + return Blocks.AIR.defaultBlockState(); else return state; } @@ -75,34 +67,34 @@ public abstract class FeatureSaplingBlock extends BlockBaseNotFull implements Fe } @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { + public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { return random.nextInt(16) == 0; } @Override - public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { - getFeature().generate(world, world.getChunkManager().getChunkGenerator(), random, pos, null); + public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { + getFeature().generate(world, world.getChunkManager().getChunkGenerator(), random, pos, null); } @Override - public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + public void scheduledTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { super.scheduledTick(state, world, pos, random); if (canGrow(world, random, pos, state)) { grow(world, random, pos, state); } } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override public String getStatesPattern(Reader data) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { if (block.contains("item")) { @@ -111,9 +103,9 @@ public abstract class FeatureSaplingBlock extends BlockBaseNotFull implements Fe } return Patterns.createJson(Patterns.BLOCK_CROSS, block); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_SAPLING; } } diff --git a/src/main/java/ru/betterend/blocks/basis/FurBlock.java b/src/main/java/ru/betterend/blocks/basis/FurBlock.java index 986d8b05..920717a5 100644 --- a/src/main/java/ru/betterend/blocks/basis/FurBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/FurBlock.java @@ -8,21 +8,21 @@ import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.item.ItemConvertible; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.item.ItemConvertible; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockView; +import net.minecraft.world.level.BlockGetter; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.util.MHelper; @@ -31,52 +31,44 @@ public class FurBlock extends AttachedBlock implements IRenderTypeable { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); private final ItemConvertible drop; private final int dropChance; - + public FurBlock(ItemConvertible drop, int light, int dropChance, boolean wet) { - super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(wet ? BlockSoundGroup.WET_GRASS : BlockSoundGroup.GRASS) - .luminance(light) - .breakByHand(true) - .noCollision()); + super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT).breakByTool(FabricToolTags.SHEARS) + .sounds(wet ? SoundType.WET_GRASS : SoundType.GRASS).luminance(light).breakByHand(true).noCollision()); this.drop = drop; this.dropChance = dropChance; } - + public FurBlock(ItemConvertible drop, int dropChance) { - super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.GRASS) - .breakByHand(true) - .noCollision()); + super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT).breakByTool(FabricToolTags.SHEARS) + .sounds(SoundType.GRASS).breakByHand(true).noCollision()); this.drop = drop; this.dropChance = dropChance; } @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return BOUNDING_SHAPES.get(state.get(FACING)); + return BOUNDING_SHAPES.get(state.getValue(FACING)); } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) || EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) + || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Lists.newArrayList(new ItemStack(this)); - } - else if (dropChance < 1 || MHelper.RANDOM.nextInt(dropChance) == 0) { + } else if (dropChance < 1 || MHelper.RANDOM.nextInt(dropChance) == 0) { return Lists.newArrayList(new ItemStack(drop)); - } - else { + } else { return Lists.newArrayList(); } } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + static { BOUNDING_SHAPES.put(Direction.UP, VoxelShapes.cuboid(0.0, 0.0, 0.0, 1.0, 0.5, 1.0)); BOUNDING_SHAPES.put(Direction.DOWN, VoxelShapes.cuboid(0.0, 0.5, 0.0, 1.0, 1.0, 1.0)); diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index a97f947f..abee8419 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -11,33 +11,33 @@ import org.jetbrains.annotations.Nullable; import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockEntityProvider; -import net.minecraft.block.BlockState; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.state.StateManager; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.BlockEntityProvider; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.item.ItemPlacementContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.BooleanProperty; import net.minecraft.state.property.EnumProperty; -import net.minecraft.tag.BlockTags; +import net.minecraft.tags.BlockTags; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.PedestalState; import ru.betterend.blocks.InfusionPedestal; @@ -50,14 +50,14 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid public final static EnumProperty STATE = BlockProperties.PEDESTAL_STATE; public static final BooleanProperty HAS_ITEM = BlockProperties.HAS_ITEM; public static final BooleanProperty HAS_LIGHT = BlockProperties.HAS_LIGHT; - + private static final VoxelShape SHAPE_DEFAULT; private static final VoxelShape SHAPE_COLUMN; private static final VoxelShape SHAPE_PILLAR; private static final VoxelShape SHAPE_PEDESTAL_TOP; private static final VoxelShape SHAPE_COLUMN_TOP; private static final VoxelShape SHAPE_BOTTOM; - + /** * * Register new Pedestal block with Better End mod id. @@ -69,7 +69,7 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid public static Block registerPedestal(String name, Block source) { return EndBlocks.registerBlock(name, new PedestalBlock(source)); } - + /** * * Register new Pedestal block with specified mod id. @@ -78,29 +78,32 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid * @param source * @return new Pedestal block with specified id. */ - public static Block registerPedestal(Identifier id, Block source) { + public static Block registerPedestal(ResourceLocation id, Block source) { return EndBlocks.registerBlock(id, new PedestalBlock(source)); } - + protected final Block parent; protected float height = 1.0F; - + public PedestalBlock(Block parent) { - super(FabricBlockSettings.copyOf(parent).luminance(state -> state.get(HAS_LIGHT) ? 12 : 0)); - this.setDefaultState(stateManager.getDefaultState().with(STATE, PedestalState.DEFAULT).with(HAS_ITEM, false).with(HAS_LIGHT, false)); + super(FabricBlockSettings.copyOf(parent).luminance(state -> state.getValue(HAS_LIGHT) ? 12 : 0)); + this.setDefaultState(stateManager.defaultBlockState().with(STATE, PedestalState.DEFAULT).with(HAS_ITEM, false) + .with(HAS_LIGHT, false)); this.parent = parent; } - + public float getHeight(BlockState state) { - if (state.getBlock() instanceof PedestalBlock && state.get(STATE) == PedestalState.PEDESTAL_TOP) { + if (state.getBlock() instanceof PedestalBlock && state.getValue(STATE) == PedestalState.PEDESTAL_TOP) { return this.height - 0.2F; } return this.height; } - + @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - if (world.isClient || !state.isOf(this)) return ActionResult.CONSUME; + public ActionResult onUse(BlockState state, Level world, BlockPos pos, PlayerEntity player, Hand hand, + BlockHitResult hit) { + if (world.isClientSide || !state.is(this)) + return ActionResult.CONSUME; if (!isPlaceable(state)) { return ActionResult.PASS; } @@ -109,7 +112,8 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid PedestalBlockEntity pedestal = (PedestalBlockEntity) blockEntity; if (pedestal.isEmpty()) { ItemStack itemStack = player.getStackInHand(hand); - if (itemStack.isEmpty()) return ActionResult.CONSUME; + if (itemStack.isEmpty()) + return ActionResult.CONSUME; pedestal.setStack(0, itemStack.split(1)); checkRitual(world, pos); return ActionResult.SUCCESS; @@ -125,10 +129,10 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid } return ActionResult.PASS; } - - public void checkRitual(World world, BlockPos pos) { - Mutable posMutable = new Mutable(); - for (Point point: InfusionRitual.getMap()) { + + public void checkRitual(Level world, BlockPos pos) { + MutableBlockPos posMutable = new MutableBlockPos(); + for (Point point : InfusionRitual.getMap()) { posMutable.set(pos).move(point.x, 0, point.y); BlockState state = world.getBlockState(posMutable); if (state.getBlock() instanceof InfusionPedestal) { @@ -137,15 +141,16 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid } } } - + @Override @Nullable public BlockState getPlacementState(ItemPlacementContext context) { - World world = context.getWorld(); + Level world = context.getLevel(); BlockPos pos = context.getBlockPos(); BlockState upState = world.getBlockState(pos.up()); - BlockState downState = world.getBlockState(pos.down()); - boolean upSideSolid = upState.isSideSolidFullSquare(world, pos.up(), Direction.DOWN) || upState.isIn(BlockTags.WALLS); + BlockState downState = world.getBlockState(pos.below()); + boolean upSideSolid = upState.isSideSolidFullSquare(world, pos.up(), Direction.DOWN) + || upState.isIn(BlockTags.WALLS); boolean hasPedestalOver = upState.getBlock() instanceof PedestalBlock; boolean hasPedestalUnder = downState.getBlock() instanceof PedestalBlock; if (!hasPedestalOver && hasPedestalUnder && upSideSolid) { @@ -161,27 +166,34 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid } return getDefaultState(); } - + @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState newState, WorldAccess world, BlockPos pos, BlockPos posFrom) { + public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, + BlockPos pos, BlockPos posFrom) { BlockState updated = getUpdatedState(state, direction, newState, world, pos, posFrom); - if (!updated.isOf(this)) return updated; + if (!updated.is(this)) + return updated; if (!isPlaceable(updated)) { moveStoredStack(world, updated, pos); } return updated; } - - private BlockState getUpdatedState(BlockState state, Direction direction, BlockState newState, WorldAccess world, BlockPos pos, BlockPos posFrom) { - if (!state.isOf(this)) return state.getStateForNeighborUpdate(direction, newState, world, pos, posFrom); - if (direction != Direction.UP && direction != Direction.DOWN) return state; + + private BlockState getUpdatedState(BlockState state, Direction direction, BlockState newState, LevelAccessor world, + BlockPos pos, BlockPos posFrom) { + if (!state.is(this)) + return state.updateShape(direction, newState, world, pos, posFrom); + if (direction != Direction.UP && direction != Direction.DOWN) + return state; BlockState upState = world.getBlockState(pos.up()); - BlockState downState = world.getBlockState(pos.down()); - boolean upSideSolid = upState.isSideSolidFullSquare(world, pos.up(), Direction.DOWN) || upState.isIn(BlockTags.WALLS); + BlockState downState = world.getBlockState(pos.below()); + boolean upSideSolid = upState.isSideSolidFullSquare(world, pos.up(), Direction.DOWN) + || upState.isIn(BlockTags.WALLS); boolean hasPedestalOver = upState.getBlock() instanceof PedestalBlock; boolean hasPedestalUnder = downState.getBlock() instanceof PedestalBlock; if (direction == Direction.UP) { - upSideSolid = newState.isSideSolidFullSquare(world, posFrom, Direction.DOWN) || newState.isIn(BlockTags.WALLS); + upSideSolid = newState.isSideSolidFullSquare(world, posFrom, Direction.DOWN) + || newState.isIn(BlockTags.WALLS); hasPedestalOver = newState.getBlock() instanceof PedestalBlock; } else { hasPedestalUnder = newState.getBlock() instanceof PedestalBlock; @@ -205,13 +217,13 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid } return updatedState; } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - List drop = Lists.newArrayList(super.getDroppedStacks(state, builder)); - if (state.isOf(this)) { + public List getDrops(BlockState state, LootContext.Builder builder) { + List drop = Lists.newArrayList(super.getDrops(state, builder)); + if (state.is(this)) { if (isPlaceable(state)) { - BlockEntity blockEntity = builder.getNullable(LootContextParameters.BLOCK_ENTITY); + BlockEntity blockEntity = builder.getNullable(LootContextParams.BLOCK_ENTITY); if (blockEntity instanceof PedestalBlockEntity) { PedestalBlockEntity pedestal = (PedestalBlockEntity) blockEntity; if (!pedestal.isEmpty()) { @@ -224,10 +236,10 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid } return drop; } - - private void moveStoredStack(WorldAccess world, BlockState state, BlockPos pos) { + + private void moveStoredStack(LevelAccessor world, BlockState state, BlockPos pos) { BlockEntity blockEntity = world.getBlockEntity(pos); - if (blockEntity instanceof PedestalBlockEntity && state.isOf(this)) { + if (blockEntity instanceof PedestalBlockEntity && state.is(this)) { PedestalBlockEntity pedestal = (PedestalBlockEntity) blockEntity; ItemStack stack = pedestal.removeStack(0); if (!stack.isEmpty()) { @@ -235,12 +247,12 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid } } } - - private void moveStoredStack(BlockEntity blockEntity, WorldAccess world, ItemStack stack, BlockPos pos) { + + private void moveStoredStack(BlockEntity blockEntity, LevelAccessor world, ItemStack stack, BlockPos pos) { BlockState state = world.getBlockState(pos); - if (!state.isOf(this)) { + if (!state.is(this)) { dropStoredStack(blockEntity, stack, pos); - } else if (state.get(STATE).equals(PedestalState.PILLAR)) { + } else if (state.getValue(STATE).equals(PedestalState.PILLAR)) { moveStoredStack(blockEntity, world, stack, pos.up()); } else if (!isPlaceable(state)) { dropStoredStack(blockEntity, stack, pos); @@ -255,15 +267,15 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid dropStoredStack(blockEntity, stack, pos); } } - + private void dropStoredStack(BlockEntity blockEntity, ItemStack stack, BlockPos pos) { - if (blockEntity != null && blockEntity.getWorld() != null) { - World world = blockEntity.getWorld(); + if (blockEntity != null && blockEntity.getLevel() != null) { + Level world = blockEntity.getLevel(); Block.dropStack(world, getDropPos(world, pos), stack); } } - - private BlockPos getDropPos(WorldAccess world, BlockPos pos) { + + private BlockPos getDropPos(LevelAccessor world, BlockPos pos) { BlockPos dropPos; if (world.getBlockState(pos).isAir()) { return pos; @@ -271,51 +283,51 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid if (world.getBlockState(pos.up()).isAir()) { return pos.up(); } - for(int i = 2; i < Direction.values().length; i++) { - dropPos = pos.offset(Direction.byId(i)); + for (int i = 2; i < Direction.values().length; i++) { + dropPos = pos.relative(Direction.byId(i)); if (world.getBlockState(dropPos).isAir()) { return dropPos.toImmutable(); } } return getDropPos(world, pos.up()); } - + public boolean isPlaceable(BlockState state) { - if (!state.isOf(this)) return false; - PedestalState currentState = state.get(STATE); - return currentState == PedestalState.DEFAULT || - currentState == PedestalState.PEDESTAL_TOP; + if (!state.is(this)) + return false; + PedestalState currentState = state.getValue(STATE); + return currentState == PedestalState.DEFAULT || currentState == PedestalState.PEDESTAL_TOP; } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { - if (state.isOf(this)) { - switch(state.get(STATE)) { - case BOTTOM: { - return SHAPE_BOTTOM; - } - case PEDESTAL_TOP: { - return SHAPE_PEDESTAL_TOP; - } - case COLUMN_TOP: { - return SHAPE_COLUMN_TOP; - } - case PILLAR: { - return SHAPE_PILLAR; - } - case COLUMN: { - return SHAPE_COLUMN; - } - default: { - return SHAPE_DEFAULT; - } + if (state.is(this)) { + switch (state.getValue(STATE)) { + case BOTTOM: { + return SHAPE_BOTTOM; + } + case PEDESTAL_TOP: { + return SHAPE_PEDESTAL_TOP; + } + case COLUMN_TOP: { + return SHAPE_COLUMN_TOP; + } + case PILLAR: { + return SHAPE_PILLAR; + } + case COLUMN: { + return SHAPE_COLUMN; + } + default: { + return SHAPE_DEFAULT; + } } } return super.getOutlineShape(state, world, pos, context); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(STATE, HAS_ITEM, HAS_LIGHT); } @@ -323,31 +335,31 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid public BlockEntity createBlockEntity(BlockView world) { return new PedestalBlockEntity(); } - + @Override public boolean hasComparatorOutput(BlockState state) { return state.getBlock() instanceof PedestalBlock; } - + @Override - public int getComparatorOutput(BlockState state, World world, BlockPos pos) { - return state.get(HAS_ITEM) ? 15 : 0; + public int getComparatorOutput(BlockState state, Level world, BlockPos pos) { + return state.getValue(HAS_ITEM) ? 15 : 0; } - + @Override public String getStatesPattern(Reader data) { - String texture = Registry.BLOCK.getId(this).getPath(); + String texture = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, texture, texture); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(parent); + ResourceLocation blockId = Registry.BLOCK.getKey(parent); String name = blockId.getPath(); Map textures = new HashMap() { private static final long serialVersionUID = 1L; { - put("%mod%", blockId.getNamespace() ); + put("%mod%", blockId.getNamespace()); put("%top%", name + "_top"); put("%base%", name + "_base"); put("%pillar%", name + "_pillar"); @@ -367,12 +379,12 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid } return Patterns.createJson(Patterns.BLOCK_PEDESTAL_DEFAULT, textures); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_PEDESTAL; } - + static { VoxelShape basinUp = Block.createCuboidShape(2, 3, 2, 14, 4, 14); VoxelShape basinDown = Block.createCuboidShape(0, 0, 0, 16, 3, 16); diff --git a/src/main/java/ru/betterend/blocks/basis/SimpleLeavesBlock.java b/src/main/java/ru/betterend/blocks/basis/SimpleLeavesBlock.java index dff29707..145242a3 100644 --- a/src/main/java/ru/betterend/blocks/basis/SimpleLeavesBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/SimpleLeavesBlock.java @@ -3,53 +3,52 @@ package ru.betterend.blocks.basis; import java.io.Reader; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Material; -import net.minecraft.block.MaterialColor; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.Patterns; public class SimpleLeavesBlock extends BlockBaseNotFull implements IRenderTypeable { public SimpleLeavesBlock(MaterialColor color) { - super(FabricBlockSettings.of(Material.LEAVES) - .strength(0.2F) - .sounds(BlockSoundGroup.GRASS) - .nonOpaque() - .allowsSpawning((state, world, pos, type) -> { return false; }) - .suffocates((state, world, pos) -> { return false; }) - .blockVision((state, world, pos) -> { return false; }) - .materialColor(color)); + super(FabricBlockSettings.of(Material.LEAVES).strength(0.2F).sounds(SoundType.GRASS).nonOpaque() + .allowsSpawning((state, world, pos, type) -> { + return false; + }).suffocates((state, world, pos) -> { + return false; + }).blockVision((state, world, pos) -> { + return false; + }).materialColor(color)); } - + public SimpleLeavesBlock(MaterialColor color, int light) { - super(FabricBlockSettings.of(Material.LEAVES) - .strength(0.2F) - .sounds(BlockSoundGroup.GRASS) - .nonOpaque() - .luminance(light) - .allowsSpawning((state, world, pos, type) -> { return false; }) - .suffocates((state, world, pos) -> { return false; }) - .blockVision((state, world, pos) -> { return false; }) - .materialColor(color)); + super(FabricBlockSettings.of(Material.LEAVES).strength(0.2F).sounds(SoundType.GRASS).nonOpaque() + .luminance(light).allowsSpawning((state, world, pos, type) -> { + return false; + }).suffocates((state, world, pos) -> { + return false; + }).blockVision((state, world, pos) -> { + return false; + }).materialColor(color)); } - + @Override public String getStatesPattern(Reader data) { - String texture = Registry.BLOCK.getId(this).getPath(); + String texture = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, texture, texture); } - + @Override public String getModelPattern(String block) { - String texture = Registry.BLOCK.getId(this).getPath(); + String texture = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(Patterns.BLOCK_BASE, texture, texture); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_SIMPLE; } diff --git a/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java b/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java index 40f24282..a3a0c88a 100644 --- a/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java @@ -1,32 +1,32 @@ package ru.betterend.blocks.basis; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.FluidFillable; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.Waterloggable; -import net.minecraft.entity.LivingEntity; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.FluidFillable; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.level.block.Waterloggable; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.FluidState; import net.minecraft.fluid.Fluids; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.state.StateManager; +import net.minecraft.world.item.ItemPlacementContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.IntProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; import net.minecraft.state.property.Properties; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.registry.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.Mth; +import net.minecraft.core.Registry; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties; import ru.betterend.client.render.ERenderLayer; @@ -36,86 +36,81 @@ import ru.betterend.patterns.Patterns; public class StalactiteBlock extends BlockBaseNotFull implements Waterloggable, FluidFillable, IRenderTypeable { public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; public static final BooleanProperty IS_FLOOR = BlockProperties.IS_FLOOR; - public static final IntProperty SIZE = BlockProperties.SIZE; + public static final IntegerProperty SIZE = BlockProperties.SIZE; private static final VoxelShape[] SHAPES; public StalactiteBlock(Block source) { super(FabricBlockSettings.copy(source).nonOpaque()); - this.setDefaultState(getStateManager().getDefaultState().with(SIZE, 0).with(IS_FLOOR, true).with(WATERLOGGED, false)); + this.setDefaultState( + getStateManager().defaultBlockState().with(SIZE, 0).with(IS_FLOOR, true).with(WATERLOGGED, false)); } @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(WATERLOGGED, IS_FLOOR, SIZE); } @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return SHAPES[state.get(SIZE)]; + return SHAPES[state.getValue(SIZE)]; } - + @Override public BlockState getPlacementState(ItemPlacementContext ctx) { - WorldView world = ctx.getWorld(); + WorldView world = ctx.getLevel(); BlockPos pos = ctx.getBlockPos(); Direction dir = ctx.getSide(); boolean water = world.getFluidState(pos).getFluid() == Fluids.WATER; - + if (dir == Direction.DOWN) { if (isThis(world, pos.up()) || sideCoversSmallSquare(world, pos.up(), Direction.DOWN)) { return getDefaultState().with(IS_FLOOR, false).with(WATERLOGGED, water); - } - else if (isThis(world, pos.down()) || sideCoversSmallSquare(world, pos.down(), Direction.UP)) { + } else if (isThis(world, pos.below()) || sideCoversSmallSquare(world, pos.below(), Direction.UP)) { return getDefaultState().with(IS_FLOOR, true).with(WATERLOGGED, water); - } - else { + } else { return null; } - } - else { - if (isThis(world, pos.down()) || sideCoversSmallSquare(world, pos.down(), Direction.UP)) { + } else { + if (isThis(world, pos.below()) || sideCoversSmallSquare(world, pos.below(), Direction.UP)) { return getDefaultState().with(IS_FLOOR, true).with(WATERLOGGED, water); - } - else if (isThis(world, pos.up()) || sideCoversSmallSquare(world, pos.up(), Direction.DOWN)) { + } else if (isThis(world, pos.up()) || sideCoversSmallSquare(world, pos.up(), Direction.DOWN)) { return getDefaultState().with(IS_FLOOR, false).with(WATERLOGGED, water); - } - else { + } else { return null; } } } @Override - public void onPlaced(World world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { + public void onPlaced(Level world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { boolean hasUp = isThis(world, pos.up()); - boolean hasDown = isThis(world, pos.down()); - Mutable mut = new Mutable(); + boolean hasDown = isThis(world, pos.below()); + MutableBlockPos mut = new MutableBlockPos(); if (hasUp && hasDown) { - boolean floor = state.get(IS_FLOOR); - BlockPos second = floor ? pos.up() : pos.down(); + boolean floor = state.getValue(IS_FLOOR); + BlockPos second = floor ? pos.up() : pos.below(); BlockState bState = world.getBlockState(second); - world.setBlockState(pos, state.with(SIZE, 1).with(IS_FLOOR, floor)); - world.setBlockState(second, bState.with(SIZE, 1).with(IS_FLOOR, !floor)); - + world.setBlockAndUpdate(pos, state.with(SIZE, 1).with(IS_FLOOR, floor)); + world.setBlockAndUpdate(second, bState.with(SIZE, 1).with(IS_FLOOR, !floor)); + bState = state; int startSize = floor ? 1 : 2; mut.set(pos.getX(), pos.getY() + 1, pos.getZ()); for (int i = 0; i < 8 && isThis(bState); i++) { - world.setBlockState(mut, bState.with(SIZE, startSize++).with(IS_FLOOR, false)); + world.setBlockAndUpdate(mut, bState.with(SIZE, startSize++).with(IS_FLOOR, false)); mut.setY(mut.getY() + 1); bState = world.getBlockState(mut); } - + bState = state; startSize = floor ? 2 : 1; mut.set(pos.getX(), pos.getY() - 1, pos.getZ()); for (int i = 0; i < 8 && isThis(bState); i++) { - world.setBlockState(mut, bState.with(SIZE, startSize++).with(IS_FLOOR, true)); + world.setBlockAndUpdate(mut, bState.with(SIZE, startSize++).with(IS_FLOOR, true)); mut.setY(mut.getY() - 1); bState = world.getBlockState(mut); } - } - else if (hasDown) { + } else if (hasDown) { mut.setX(pos.getX()); mut.setZ(pos.getZ()); for (int i = 1; i < 8; i++) { @@ -124,18 +119,15 @@ public class StalactiteBlock extends BlockBaseNotFull implements Waterloggable, BlockState state2 = world.getBlockState(mut); int size = state2.get(SIZE); if (size < i) { - world.setBlockState(mut, state2.with(SIZE, i).with(IS_FLOOR, true)); - } - else { + world.setBlockAndUpdate(mut, state2.with(SIZE, i).with(IS_FLOOR, true)); + } else { break; } - } - else { + } else { break; } } - } - else if (hasUp) { + } else if (hasUp) { mut.setX(pos.getX()); mut.setZ(pos.getZ()); for (int i = 1; i < 8; i++) { @@ -144,80 +136,79 @@ public class StalactiteBlock extends BlockBaseNotFull implements Waterloggable, BlockState state2 = world.getBlockState(mut); int size = state2.get(SIZE); if (size < i) { - world.setBlockState(mut, state2.with(SIZE, i).with(IS_FLOOR, false)); - } - else { + world.setBlockAndUpdate(mut, state2.with(SIZE, i).with(IS_FLOOR, false)); + } else { break; } - } - else { + } else { break; } } } } - + private boolean isThis(WorldView world, BlockPos pos) { return isThis(world.getBlockState(pos)); } - + private boolean isThis(BlockState state) { return state.getBlock() instanceof StalactiteBlock; } - + @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, + BlockPos pos, BlockPos neighborPos) { if (!canPlaceAt(state, world, pos)) { - return Blocks.AIR.getDefaultState(); + return Blocks.AIR.defaultBlockState(); } return state; } @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - int size = state.get(SIZE); + int size = state.getValue(SIZE); return checkUp(world, pos, size) || checkDown(world, pos, size); } - + private boolean checkUp(BlockView world, BlockPos pos, int size) { BlockPos p = pos.up(); BlockState state = world.getBlockState(p); - return (isThis(state) && state.get(SIZE) >= size) || state.isFullCube(world, p); + return (isThis(state) && state.getValue(SIZE) >= size) || state.isFullCube(world, p); } - + private boolean checkDown(BlockView world, BlockPos pos, int size) { - BlockPos p = pos.down(); + BlockPos p = pos.below(); BlockState state = world.getBlockState(p); - return (isThis(state) && state.get(SIZE) >= size) || state.isFullCube(world, p); + return (isThis(state) && state.getValue(SIZE) >= size) || state.isFullCube(world, p); } - + @Override public String getModelPattern(String block) { - Identifier blockId = Registry.BLOCK.getId(this); + ResourceLocation blockId = Registry.BLOCK.getKey(this); if (block.contains("item")) { return Patterns.createJson(Patterns.ITEM_GENERATED, "item/" + blockId.getPath()); } return Patterns.createJson(Patterns.BLOCK_CROSS_SHADED, block); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_STALACTITE; } - + @Override public boolean canFillWithFluid(BlockView world, BlockPos pos, BlockState state, Fluid fluid) { return false; } @Override - public boolean tryFillWithFluid(WorldAccess world, BlockPos pos, BlockState state, FluidState fluidState) { + public boolean tryFillWithFluid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { return false; } - + @Override public FluidState getFluidState(BlockState state) { - return state.get(WATERLOGGED) ? Fluids.WATER.getStill(false) : Fluids.EMPTY.getDefaultState(); + return state.getValue(WATERLOGGED) ? Fluids.WATER.getStill(false) : Fluids.EMPTY.defaultBlockState(); } @Override @@ -230,7 +221,7 @@ public class StalactiteBlock extends BlockBaseNotFull implements Waterloggable, float start = 5F / 8F; SHAPES = new VoxelShape[8]; for (int i = 0; i < 8; i++) { - int side = MathHelper.floor(MathHelper.lerp(i / 7F, start, end) * 8F + 0.5F); + int side = Mth.floor(Mth.lerp(i / 7F, start, end) * 8F + 0.5F); SHAPES[i] = Block.createCuboidShape(side, 0, side, 16 - side, 16, 16 - side); } } diff --git a/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java b/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java index 4eb82d08..01afe546 100644 --- a/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java @@ -3,18 +3,18 @@ package ru.betterend.blocks.basis; import java.io.Reader; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.ShapeContext; -import net.minecraft.client.color.block.BlockColorProvider; -import net.minecraft.client.color.item.ItemColorProvider; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3i; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.client.color.block.BlockColor; +import net.minecraft.client.color.item.ItemColor; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.core.Vec3i; +import net.minecraft.core.Registry; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; +import net.minecraft.world.level.BlockGetter; import ru.betterend.blocks.AuroraCrystalBlock; import ru.betterend.interfaces.IColorProvider; import ru.betterend.patterns.Patterns; @@ -24,13 +24,13 @@ public class StoneLanternBlock extends EndLanternBlock implements IColorProvider private static final VoxelShape SHAPE_CEIL = Block.createCuboidShape(3, 1, 3, 13, 16, 13); private static final VoxelShape SHAPE_FLOOR = Block.createCuboidShape(3, 0, 3, 13, 15, 13); private static final Vec3i[] COLORS = AuroraCrystalBlock.COLORS; - + public StoneLanternBlock(Block source) { super(FabricBlockSettings.copyOf(source).luminance(15)); } - + @Override - public BlockColorProvider getProvider() { + public BlockColor getBlockProvider() { return (state, world, pos, tintIndex) -> { long i = (long) pos.getX() + (long) pos.getY() + (long) pos.getZ(); double delta = i * 0.1; @@ -38,47 +38,47 @@ public class StoneLanternBlock extends EndLanternBlock implements IColorProvider int index2 = (index + 1) & 3; delta -= index; index &= 3; - + Vec3i color1 = COLORS[index]; Vec3i color2 = COLORS[index2]; - - int r = MHelper.floor(MathHelper.lerp(delta, color1.getX(), color2.getX())); - int g = MHelper.floor(MathHelper.lerp(delta, color1.getY(), color2.getY())); - int b = MHelper.floor(MathHelper.lerp(delta, color1.getZ(), color2.getZ())); - + + int r = MHelper.floor(Mth.lerp(delta, color1.getX(), color2.getX())); + int g = MHelper.floor(Mth.lerp(delta, color1.getY(), color2.getY())); + int b = MHelper.floor(Mth.lerp(delta, color1.getZ(), color2.getZ())); + return MHelper.color(r, g, b); }; } @Override - public ItemColorProvider getItemProvider() { + public ItemColor getItemProvider() { return (stack, tintIndex) -> { return MHelper.color(COLORS[3].getX(), COLORS[3].getY(), COLORS[3].getZ()); }; } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return state.get(IS_FLOOR) ? SHAPE_FLOOR : SHAPE_CEIL; + return state.getValue(IS_FLOOR) ? SHAPE_FLOOR : SHAPE_CEIL; } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_STONE_LANTERN; } - + @Override public String getModelPattern(String block) { - String texture = Registry.BLOCK.getId(this).getPath(); + String texture = Registry.BLOCK.getKey(this).getPath(); if (block.contains("ceil")) { return Patterns.createJson(Patterns.BLOCK_STONE_LANTERN_CEIL, texture, texture); } return Patterns.createJson(Patterns.BLOCK_STONE_LANTERN_FLOOR, texture, texture); } - + @Override public String getStatesPattern(Reader data) { - String block = Registry.BLOCK.getId(this).getPath(); + String block = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, block, block); } } diff --git a/src/main/java/ru/betterend/blocks/basis/StrippableBarkBlock.java b/src/main/java/ru/betterend/blocks/basis/StrippableBarkBlock.java index 32d651a4..616484ce 100644 --- a/src/main/java/ru/betterend/blocks/basis/StrippableBarkBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/StrippableBarkBlock.java @@ -2,36 +2,38 @@ package ru.betterend.blocks.basis; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.MaterialColor; -import net.minecraft.block.PillarBlock; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundSource; +import net.minecraft.sounds.SoundEvents; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; public class StrippableBarkBlock extends BarkBlock { private final Block striped; - + public StrippableBarkBlock(MaterialColor color, Block striped) { super(FabricBlockSettings.copyOf(striped).materialColor(color)); this.striped = striped; } - + @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + public ActionResult onUse(BlockState state, Level world, BlockPos pos, PlayerEntity player, Hand hand, + BlockHitResult hit) { if (player.getMainHandStack().getItem().isIn(FabricToolTags.AXES)) { - world.playSound(player, pos, SoundEvents.ITEM_AXE_STRIP, SoundCategory.BLOCKS, 1.0F, 1.0F); - if (!world.isClient) { - world.setBlockState(pos, striped.getDefaultState().with(PillarBlock.AXIS, state.get(PillarBlock.AXIS)), 11); + world.playLocalSound(player, pos, SoundEvents.ITEM_AXE_STRIP, SoundSource.BLOCKS, 1.0F, 1.0F); + if (!world.isClientSide) { + world.setBlockAndUpdate(pos, striped.defaultBlockState().with(RotatedPillarBlock.AXIS, + state.getValue(RotatedPillarBlock.AXIS)), 11); if (player != null && !player.isCreative()) { - player.getMainHandStack().damage(1, world.random, (ServerPlayerEntity) player); + player.getMainHandStack().damage(1, world.random, (ServerPlayer) player); } } return ActionResult.SUCCESS; diff --git a/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java index 052f376a..2c585512 100644 --- a/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java @@ -5,23 +5,23 @@ import java.util.Random; import com.google.common.collect.Maps; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.MaterialColor; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.state.StateManager; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.item.ItemPlacementContext; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.EnumProperty; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; +import net.minecraft.world.level.Level; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; @@ -30,27 +30,28 @@ import ru.betterend.patterns.Patterns; public class TripleTerrainBlock extends EndTerrainBlock { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; - + public TripleTerrainBlock(MaterialColor color) { super(color); - this.setDefaultState(this.getDefaultState().with(SHAPE, TripleShape.BOTTOM)); + this.setDefaultState(this.defaultBlockState().with(SHAPE, TripleShape.BOTTOM)); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE); } - + @Override public BlockState getPlacementState(ItemPlacementContext ctx) { Direction dir = ctx.getSide(); - TripleShape shape = dir == Direction.UP ? TripleShape.BOTTOM : dir == Direction.DOWN ? TripleShape.TOP : TripleShape.MIDDLE; - return this.getDefaultState().with(SHAPE, shape); + TripleShape shape = dir == Direction.UP ? TripleShape.BOTTOM + : dir == Direction.DOWN ? TripleShape.TOP : TripleShape.MIDDLE; + return this.defaultBlockState().with(SHAPE, shape); } - + @Override public String getModelPattern(String block) { - String name = Registry.BLOCK.getId(this).getPath(); + String name = Registry.BLOCK.getKey(this).getPath(); if (block.endsWith("_middle")) { return Patterns.createJson(Patterns.BLOCK_BASE, name + "_top", name + "_top"); } @@ -60,65 +61,60 @@ public class TripleTerrainBlock extends EndTerrainBlock { map.put("%bottom%", "minecraft:block/end_stone"); return Patterns.createJson(Patterns.BLOCK_TOP_SIDE_BOTTOM, map); } - + @Override - public Identifier statePatternId() { + public ResourceLocation statePatternId() { return Patterns.STATE_TRIPLE_ROTATED_TOP; } - + @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - TripleShape shape = state.get(SHAPE); + public ActionResult onUse(BlockState state, Level world, BlockPos pos, PlayerEntity player, Hand hand, + BlockHitResult hit) { + TripleShape shape = state.getValue(SHAPE); if (shape == TripleShape.BOTTOM) { return super.onUse(state, world, pos, player, hand, hit); } return ActionResult.FAIL; } - + @Override - public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { - TripleShape shape = state.get(SHAPE); + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + TripleShape shape = state.getValue(SHAPE); if (shape == TripleShape.BOTTOM) { super.randomTick(state, world, pos, random); return; - } - else if (random.nextInt(16) == 0) { + } else if (random.nextInt(16) == 0) { boolean bottom = canSurviveBottom(world, pos); if (shape == TripleShape.TOP) { if (!bottom) { - world.setBlockState(pos, Blocks.END_STONE.getDefaultState()); + world.setBlockAndUpdate(pos, Blocks.END_STONE.defaultBlockState()); } - } - else { + } else { boolean top = canSurvive(state, world, pos) || isMiddle(world.getBlockState(pos.up())); if (!top && !bottom) { - world.setBlockState(pos, Blocks.END_STONE.getDefaultState()); - } - else if (top && !bottom) { - world.setBlockState(pos, state.with(SHAPE, TripleShape.BOTTOM)); - } - else if (!top && bottom) { - world.setBlockState(pos, state.with(SHAPE, TripleShape.TOP)); + world.setBlockAndUpdate(pos, Blocks.END_STONE.defaultBlockState()); + } else if (top && !bottom) { + world.setBlockAndUpdate(pos, state.with(SHAPE, TripleShape.BOTTOM)); + } else if (!top && bottom) { + world.setBlockAndUpdate(pos, state.with(SHAPE, TripleShape.TOP)); } } } } - + protected boolean canSurviveBottom(WorldView world, BlockPos pos) { - BlockPos blockPos = pos.down(); + BlockPos blockPos = pos.below(); BlockState blockState = world.getBlockState(blockPos); if (isMiddle(blockState)) { return true; - } - else if (blockState.getFluidState().getLevel() == 8) { + } else if (blockState.getFluidState().getLevel() == 8) { return false; - } - else { + } else { return !blockState.isSideSolidFullSquare(world, blockPos, Direction.UP); } } - + protected boolean isMiddle(BlockState state) { - return state.isOf(this) && state.get(SHAPE) == TripleShape.MIDDLE; + return state.is(this) && state.getValue(SHAPE) == TripleShape.MIDDLE; } } diff --git a/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantBlock.java index 5a16c36e..524aec13 100644 --- a/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantBlock.java @@ -7,32 +7,32 @@ import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Fertilizable; -import net.minecraft.block.FluidFillable; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.entity.ItemEntity; +import net.minecraft.world.level.block.AbstractBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Fertilizable; +import net.minecraft.world.level.block.FluidFillable; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.entity.ItemEntity; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.FluidState; import net.minecraft.fluid.Fluids; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.util.math.Vec3d; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; @@ -41,25 +41,18 @@ import ru.betterend.registry.EndTags; public class UnderwaterPlantBlock extends BlockBaseNotFull implements IRenderTypeable, Fertilizable, FluidFillable { private static final VoxelShape SHAPE = Block.createCuboidShape(4, 0, 4, 12, 14, 12); - + public UnderwaterPlantBlock() { - super(FabricBlockSettings.of(Material.UNDERWATER_PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.WET_GRASS) - .breakByHand(true) - .noCollision()); + super(FabricBlockSettings.of(Material.UNDERWATER_PLANT).breakByTool(FabricToolTags.SHEARS) + .sounds(SoundType.WET_GRASS).breakByHand(true).noCollision()); } - + public UnderwaterPlantBlock(int light) { - super(FabricBlockSettings.of(Material.UNDERWATER_PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.WET_GRASS) - .luminance(light) - .breakByHand(true) - .noCollision()); + super(FabricBlockSettings.of(Material.UNDERWATER_PLANT).breakByTool(FabricToolTags.SHEARS) + .sounds(SoundType.WET_GRASS).luminance(light).breakByHand(true).noCollision()); } - - public UnderwaterPlantBlock(Settings settings) { + + public UnderwaterPlantBlock(Properties settings) { super(settings); } @@ -76,37 +69,37 @@ public class UnderwaterPlantBlock extends BlockBaseNotFull implements IRenderTyp @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - BlockState down = world.getBlockState(pos.down()); + BlockState down = world.getBlockState(pos.below()); state = world.getBlockState(pos); return isTerrain(down) && state.getFluidState().getFluid().equals(Fluids.WATER.getStill()); } - + protected boolean isTerrain(BlockState state) { return state.isIn(EndTags.END_GROUND) || state.getBlock() == EndBlocks.ENDSTONE_DUST; } @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, + BlockPos pos, BlockPos neighborPos) { if (!canPlaceAt(state, world, pos)) { world.breakBlock(pos, true); - return Blocks.WATER.getDefaultState(); - } - else { + return Blocks.WATER.defaultBlockState(); + } else { return state; } } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) || EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) + || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Lists.newArrayList(new ItemStack(this)); - } - else { + } else { return Lists.newArrayList(); } } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; @@ -118,13 +111,14 @@ public class UnderwaterPlantBlock extends BlockBaseNotFull implements IRenderTyp } @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { + public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { return true; } @Override - public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { - ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(this)); + public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { + ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, + new ItemStack(this)); world.spawnEntity(item); } @@ -134,10 +128,10 @@ public class UnderwaterPlantBlock extends BlockBaseNotFull implements IRenderTyp } @Override - public boolean tryFillWithFluid(WorldAccess world, BlockPos pos, BlockState state, FluidState fluidState) { + public boolean tryFillWithFluid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { return false; } - + @Override public FluidState getFluidState(BlockState state) { return Fluids.WATER.getStill(false); diff --git a/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantWithAgeBlock.java b/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantWithAgeBlock.java index db52390d..c695fda4 100644 --- a/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantWithAgeBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantWithAgeBlock.java @@ -4,51 +4,46 @@ import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.IntProperty; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.BlockProperties; public abstract class UnderwaterPlantWithAgeBlock extends UnderwaterPlantBlock { - public static final IntProperty AGE = BlockProperties.AGE; - + public static final IntegerProperty AGE = BlockProperties.AGE; + public UnderwaterPlantWithAgeBlock() { - super(FabricBlockSettings.of(Material.UNDERWATER_PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.WET_GRASS) - .breakByHand(true) - .ticksRandomly() - .noCollision()); + super(FabricBlockSettings.of(Material.UNDERWATER_PLANT).breakByTool(FabricToolTags.SHEARS) + .sounds(SoundType.WET_GRASS).breakByHand(true).ticksRandomly().noCollision()); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(AGE); } - + public abstract void grow(StructureWorldAccess world, Random random, BlockPos pos); - + @Override - public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { + public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { if (random.nextInt(4) == 0) { - int age = state.get(AGE); + int age = state.getValue(AGE); if (age < 3) { - world.setBlockState(pos, state.with(AGE, age + 1)); - } - else { + world.setBlockAndUpdate(pos, state.with(AGE, age + 1)); + } else { grow(world, random, pos); } } } - + @Override - public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + public void scheduledTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { super.scheduledTick(state, world, pos, random); if (canGrow(world, random, pos, state)) { grow(world, random, pos, state); diff --git a/src/main/java/ru/betterend/blocks/basis/UpDownPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/UpDownPlantBlock.java index ae9e56a2..37dcaa9f 100644 --- a/src/main/java/ru/betterend/blocks/basis/UpDownPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/UpDownPlantBlock.java @@ -6,25 +6,25 @@ import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; @@ -32,13 +32,10 @@ import ru.betterend.registry.EndTags; public class UpDownPlantBlock extends BlockBaseNotFull implements IRenderTypeable { private static final VoxelShape SHAPE = Block.createCuboidShape(4, 0, 4, 12, 16, 12); - + public UpDownPlantBlock() { - super(FabricBlockSettings.of(Material.PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.GRASS) - .breakByHand(true) - .noCollision()); + super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).sounds(SoundType.GRASS) + .breakByHand(true).noCollision()); } @Override @@ -48,48 +45,49 @@ public class UpDownPlantBlock extends BlockBaseNotFull implements IRenderTypeabl @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - BlockState down = world.getBlockState(pos.down()); + BlockState down = world.getBlockState(pos.below()); BlockState up = world.getBlockState(pos.up()); return (isTerrain(down) || down.getBlock() == this) && (isSupport(up, world, pos) || up.getBlock() == this); } - + protected boolean isTerrain(BlockState state) { return state.isIn(EndTags.END_GROUND); } - + protected boolean isSupport(BlockState state, WorldView world, BlockPos pos) { return sideCoversSmallSquare(world, pos.up(), Direction.UP); } @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, + BlockPos pos, BlockPos neighborPos) { if (!canPlaceAt(state, world, pos)) { - return Blocks.AIR.getDefaultState(); - } - else { + return Blocks.AIR.defaultBlockState(); + } else { return state; } } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) || EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) + || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Lists.newArrayList(new ItemStack(this)); - } - else { + } else { return Lists.newArrayList(); } } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override - public void afterBreak(World world, PlayerEntity player, BlockPos pos, BlockState state, BlockEntity blockEntity, ItemStack stack) { + public void afterBreak(Level world, PlayerEntity player, BlockPos pos, BlockState state, BlockEntity blockEntity, + ItemStack stack) { super.afterBreak(world, player, pos, state, blockEntity, stack); - world.updateNeighbor(pos, Blocks.AIR, pos.down()); + world.updateNeighbor(pos, Blocks.AIR, pos.below()); } } diff --git a/src/main/java/ru/betterend/blocks/basis/VineBlock.java b/src/main/java/ru/betterend/blocks/basis/VineBlock.java index f66fcdf8..2de33f06 100644 --- a/src/main/java/ru/betterend/blocks/basis/VineBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/VineBlock.java @@ -7,30 +7,30 @@ import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Fertilizable; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; +import net.minecraft.world.level.block.AbstractBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Fertilizable; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.EnumProperty; -import net.minecraft.tag.BlockTags; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.tags.BlockTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.util.math.Vec3d; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; @@ -41,29 +41,25 @@ import ru.betterend.util.BlocksHelper; public class VineBlock extends BlockBaseNotFull implements IRenderTypeable, Fertilizable { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; private static final VoxelShape VOXEL_SHAPE = Block.createCuboidShape(2, 0, 2, 14, 16, 14); - + public VineBlock() { this(0, false); } - + public VineBlock(int light) { this(light, false); } - + public VineBlock(int light, boolean bottomOnly) { - super(FabricBlockSettings.of(Material.PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.GRASS) + super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).sounds(SoundType.GRASS) .luminance((state) -> { - return bottomOnly ? state.get(SHAPE) == TripleShape.BOTTOM ? light : 0 : light; - }) - .breakByHand(true) - .noCollision()); - this.setDefaultState(this.stateManager.getDefaultState().with(SHAPE, TripleShape.BOTTOM)); + return bottomOnly ? state.getValue(SHAPE) == TripleShape.BOTTOM ? light : 0 : light; + }).breakByHand(true).noCollision()); + this.setDefaultState(this.stateManager.defaultBlockState().with(SHAPE, TripleShape.BOTTOM)); } - + @Override - protected void appendProperties(StateManager.Builder stateManager) { + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE); } @@ -77,7 +73,7 @@ public class VineBlock extends BlockBaseNotFull implements IRenderTypeable, Fert public AbstractBlock.OffsetType getOffsetType() { return AbstractBlock.OffsetType.XZ; } - + public boolean canGenerate(BlockState state, WorldView world, BlockPos pos) { return isSupport(state, world, pos); } @@ -86,37 +82,37 @@ public class VineBlock extends BlockBaseNotFull implements IRenderTypeable, Fert public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { return isSupport(state, world, pos); } - + protected boolean isSupport(BlockState state, WorldView world, BlockPos pos) { BlockState up = world.getBlockState(pos.up()); - return up.isOf(this) || up.isIn(BlockTags.LEAVES) || sideCoversSmallSquare(world, pos.up(), Direction.DOWN); + return up.is(this) || up.isIn(BlockTags.LEAVES) || sideCoversSmallSquare(world, pos.up(), Direction.DOWN); } @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, + BlockPos pos, BlockPos neighborPos) { if (!canPlaceAt(state, world, pos)) { - return Blocks.AIR.getDefaultState(); - } - else { - if (world.getBlockState(pos.down()).getBlock() != this) + return Blocks.AIR.defaultBlockState(); + } else { + if (world.getBlockState(pos.below()).getBlock() != this) return state.with(SHAPE, TripleShape.BOTTOM); else if (world.getBlockState(pos.up()).getBlock() != this) return state.with(SHAPE, TripleShape.TOP); return state.with(SHAPE, TripleShape.MIDDLE); } } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.get(LootContextParameters.TOOL); - if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) || EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) + || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Lists.newArrayList(new ItemStack(this)); - } - else { + } else { return Lists.newArrayList(); } } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; @@ -125,25 +121,25 @@ public class VineBlock extends BlockBaseNotFull implements IRenderTypeable, Fert @Override public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { while (world.getBlockState(pos).getBlock() == this) { - pos = pos.down(); + pos = pos.below(); } return world.getBlockState(pos).isAir(); } @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { + public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { while (world.getBlockState(pos).getBlock() == this) { - pos = pos.down(); + pos = pos.below(); } return world.isAir(pos); } @Override - public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { + public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { while (world.getBlockState(pos).getBlock() == this) { - pos = pos.down(); + pos = pos.below(); } - world.setBlockState(pos, getDefaultState()); + world.setBlockAndUpdate(pos, getDefaultState()); BlocksHelper.setWithoutUpdate(world, pos, getDefaultState()); } } diff --git a/src/main/java/ru/betterend/blocks/basis/WallMushroomBlock.java b/src/main/java/ru/betterend/blocks/basis/WallMushroomBlock.java index 8a3f7c87..55600834 100644 --- a/src/main/java/ru/betterend/blocks/basis/WallMushroomBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/WallMushroomBlock.java @@ -6,32 +6,26 @@ import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.WorldView; public class WallMushroomBlock extends EndWallPlantBlock { public WallMushroomBlock(int light) { - super(FabricBlockSettings.of(Material.PLANT) - .breakByTool(FabricToolTags.AXES) - .sounds(BlockSoundGroup.GRASS) - .luminance(light) - .sounds(BlockSoundGroup.WOOD) - .hardness(0.2F) - .breakByHand(true) - .noCollision()); + super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.AXES).sounds(SoundType.GRASS) + .luminance(light).sounds(SoundType.WOOD).hardness(0.2F).breakByHand(true).noCollision()); } - + @Override - public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Lists.newArrayList(new ItemStack(this)); } - + @Override public boolean isSupport(WorldView world, BlockPos pos, BlockState blockState, Direction direction) { return blockState.getMaterial().isSolid() && blockState.isSideSolidFullSquare(world, pos, direction); diff --git a/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java b/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java index ab5e9dc9..52bad466 100644 --- a/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java @@ -6,12 +6,12 @@ import java.util.function.Function; import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.MaterialColor; -import net.minecraft.item.DyeItem; -import net.minecraft.item.ItemConvertible; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.item.DyeItem; +import net.minecraft.world.item.ItemConvertible; import net.minecraft.util.DyeColor; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; import ru.betterend.recipe.builders.GridRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; @@ -20,38 +20,41 @@ public class ColoredMaterial { private static final Map DYES = Maps.newHashMap(); private static final Map COLORS = Maps.newHashMap(); private final Map colors = Maps.newHashMap(); - + public ColoredMaterial(Function constructor, Block source, boolean craftEight) { this(constructor, source, COLORS, DYES, craftEight); } - - public ColoredMaterial(Function constructor, Block source, Map colors, Map dyes, boolean craftEight) { - String id = Registry.BLOCK.getId(source).getPath(); + + public ColoredMaterial(Function constructor, Block source, Map colors, + Map dyes, boolean craftEight) { + String id = Registry.BLOCK.getKey(source).getPath(); colors.forEach((color, name) -> { String blockName = id + "_" + name; - Block block = constructor.apply(FabricBlockSettings.copyOf(source).materialColor(MaterialColor.BLACK)); + Block block = constructor + .apply(FabricBlockSettings.copyOf(source).materialColor(MaterialColor.COLOR_BLACK)); EndBlocks.registerBlock(blockName, block); if (craftEight) { - GridRecipe.make(blockName, block).setOutputCount(8).setShape("###", "#D#", "###").addMaterial('#', source).addMaterial('D', dyes.get(color)).build(); - } - else { - GridRecipe.make(blockName, block).setList("#D").addMaterial('#', source).addMaterial('D', dyes.get(color)).build(); + GridRecipe.make(blockName, block).setOutputCount(8).setShape("###", "#D#", "###") + .addMaterial('#', source).addMaterial('D', dyes.get(color)).build(); + } else { + GridRecipe.make(blockName, block).setList("#D").addMaterial('#', source) + .addMaterial('D', dyes.get(color)).build(); } this.colors.put(color, block); BlocksHelper.addBlockColor(block, color); }); } - + public Block getByColor(DyeColor color) { return colors.get(color.getMaterialColor().color); } - + public Block getByColor(int color) { return colors.get(color); } - + static { - for (DyeColor color: DyeColor.values()) { + for (DyeColor color : DyeColor.values()) { int colorRGB = color.getMaterialColor().color; COLORS.put(colorRGB, color.getName()); DYES.put(colorRGB, DyeItem.byColor(color)); diff --git a/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java b/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java index 55916dbd..15bf2a3f 100644 --- a/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java @@ -1,9 +1,9 @@ package ru.betterend.blocks.complex; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.tag.BlockTags; -import net.minecraft.tag.ItemTags; +import net.minecraft.world.level.block.Block; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.ItemTags; import ru.betterend.blocks.EndPedestal; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.blocks.basis.EndPillarBlock; @@ -27,7 +27,7 @@ public class CrystalSubblocksMaterial { public final Block brick_stairs; public final Block brick_slab; public final Block brick_wall; - + public CrystalSubblocksMaterial(String name, Block source) { FabricBlockSettings material = FabricBlockSettings.copyOf(source); polished = EndBlocks.registerBlock(name + "_polished", new BlockBase(material)); @@ -41,29 +41,39 @@ public class CrystalSubblocksMaterial { brick_stairs = EndBlocks.registerBlock(name + "_bricks_stairs", new EndStairsBlock(bricks)); brick_slab = EndBlocks.registerBlock(name + "_bricks_slab", new EndSlabBlock(bricks)); brick_wall = EndBlocks.registerBlock(name + "_bricks_wall", new EndWallBlock(bricks)); - + // Recipes // - GridRecipe.make(name + "_bricks", bricks).setOutputCount(4).setShape("##", "##").addMaterial('#', source).setGroup("end_bricks").build(); - GridRecipe.make(name + "_polished", polished).setOutputCount(4).setShape("##", "##").addMaterial('#', bricks).setGroup("end_tile").build(); - GridRecipe.make(name + "_tiles", tiles).setOutputCount(4).setShape("##", "##").addMaterial('#', polished).setGroup("end_small_tile").build(); - GridRecipe.make(name + "_pillar", pillar).setShape("#", "#").addMaterial('#', slab).setGroup("end_pillar").build(); - - GridRecipe.make(name + "_stairs", stairs).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', source).setGroup("end_stone_stairs").build(); - GridRecipe.make(name + "_slab", slab).setOutputCount(6).setShape("###").addMaterial('#', source).setGroup("end_stone_slabs").build(); - GridRecipe.make(name + "_bricks_stairs", brick_stairs).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', bricks).setGroup("end_stone_stairs").build(); - GridRecipe.make(name + "_bricks_slab", brick_slab).setOutputCount(6).setShape("###").addMaterial('#', bricks).setGroup("end_stone_slabs").build(); - - GridRecipe.make(name + "_wall", wall).setOutputCount(6).setShape("###", "###").addMaterial('#', source).setGroup("end_wall").build(); - GridRecipe.make(name + "_bricks_wall", brick_wall).setOutputCount(6).setShape("###", "###").addMaterial('#', bricks).setGroup("end_wall").build(); - + GridRecipe.make(name + "_bricks", bricks).setOutputCount(4).setShape("##", "##").addMaterial('#', source) + .setGroup("end_bricks").build(); + GridRecipe.make(name + "_polished", polished).setOutputCount(4).setShape("##", "##").addMaterial('#', bricks) + .setGroup("end_tile").build(); + GridRecipe.make(name + "_tiles", tiles).setOutputCount(4).setShape("##", "##").addMaterial('#', polished) + .setGroup("end_small_tile").build(); + GridRecipe.make(name + "_pillar", pillar).setShape("#", "#").addMaterial('#', slab).setGroup("end_pillar") + .build(); + + GridRecipe.make(name + "_stairs", stairs).setOutputCount(4).setShape("# ", "## ", "###") + .addMaterial('#', source).setGroup("end_stone_stairs").build(); + GridRecipe.make(name + "_slab", slab).setOutputCount(6).setShape("###").addMaterial('#', source) + .setGroup("end_stone_slabs").build(); + GridRecipe.make(name + "_bricks_stairs", brick_stairs).setOutputCount(4).setShape("# ", "## ", "###") + .addMaterial('#', bricks).setGroup("end_stone_stairs").build(); + GridRecipe.make(name + "_bricks_slab", brick_slab).setOutputCount(6).setShape("###").addMaterial('#', bricks) + .setGroup("end_stone_slabs").build(); + + GridRecipe.make(name + "_wall", wall).setOutputCount(6).setShape("###", "###").addMaterial('#', source) + .setGroup("end_wall").build(); + GridRecipe.make(name + "_bricks_wall", brick_wall).setOutputCount(6).setShape("###", "###") + .addMaterial('#', bricks).setGroup("end_wall").build(); + CraftingRecipes.registerPedestal(name + "_pedestal", pedestal, slab, pillar); - + // Item Tags // TagHelper.addTag(ItemTags.SLABS, slab, brick_slab); TagHelper.addTag(ItemTags.STONE_BRICKS, bricks); TagHelper.addTag(ItemTags.STONE_CRAFTING_MATERIALS, source); TagHelper.addTag(ItemTags.STONE_TOOL_MATERIALS, source); - + // Block Tags // TagHelper.addTag(BlockTags.STONE_BRICKS, bricks); TagHelper.addTag(BlockTags.WALLS, wall, brick_wall); diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index 86acd669..e2ef98dd 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -1,18 +1,17 @@ package ru.betterend.blocks.complex; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.block.MaterialColor; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.item.ArmorMaterial; -import net.minecraft.item.Item; -import net.minecraft.item.Item.Settings; -import net.minecraft.item.Items; -import net.minecraft.item.ToolMaterial; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.tag.BlockTags; -import net.minecraft.tag.ItemTags; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.Tier; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.ItemTags; import ru.betterend.blocks.BulbVineLanternBlock; import ru.betterend.blocks.BulbVineLanternColoredBlock; import ru.betterend.blocks.ChandelierBlock; @@ -55,116 +54,143 @@ public class MetalMaterial { public final Block chain; public final Block stairs; public final Block slab; - + public final Block chandelier; public final Block bulb_lantern; public final ColoredMaterial bulb_lantern_colored; - + public final Item nugget; public final Item ingot; - + public final Item shovelHead; public final Item pickaxeHead; public final Item axeHead; public final Item hoeHead; public final Item swordBlade; public final Item swordHandle; - + public final Item shovel; public final Item sword; public final Item pickaxe; public final Item axe; public final Item hoe; public final Item hammer; - + public final Item helmet; public final Item chestplate; public final Item leggings; public final Item boots; - - public static MetalMaterial makeNormal(String name, MaterialColor color, ToolMaterial material, ArmorMaterial armor) { - return new MetalMaterial(name, true, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color), EndItems.makeItemSettings(), material, armor); + + public static MetalMaterial makeNormal(String name, MaterialColor color, Tier material, ArmorMaterial armor) { + return new MetalMaterial(name, true, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color), + EndItems.makeItemSettings(), material, armor); } - - public static MetalMaterial makeNormal(String name, MaterialColor color, float hardness, float resistance, ToolMaterial material, ArmorMaterial armor) { - return new MetalMaterial(name, true, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color).hardness(hardness).resistance(resistance), EndItems.makeItemSettings(), material, armor); + + public static MetalMaterial makeNormal(String name, MaterialColor color, float hardness, float resistance, + Tier material, ArmorMaterial armor) { + return new MetalMaterial(name, true, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color) + .hardness(hardness).resistance(resistance), EndItems.makeItemSettings(), material, armor); } - - public static MetalMaterial makeOreless(String name, MaterialColor color, ToolMaterial material, ArmorMaterial armor) { - return new MetalMaterial(name, false, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color), EndItems.makeItemSettings(), material, armor); + + public static MetalMaterial makeOreless(String name, MaterialColor color, Tier material, ArmorMaterial armor) { + return new MetalMaterial(name, false, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color), + EndItems.makeItemSettings(), material, armor); } - - public static MetalMaterial makeOreless(String name, MaterialColor color, float hardness, float resistance, ToolMaterial material, ArmorMaterial armor) { - return new MetalMaterial(name, false, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color).hardness(hardness).resistance(resistance), EndItems.makeItemSettings(), material, armor); + + public static MetalMaterial makeOreless(String name, MaterialColor color, float hardness, float resistance, + Tier material, ArmorMaterial armor) { + return new MetalMaterial(name, false, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color) + .hardness(hardness).resistance(resistance), EndItems.makeItemSettings(), material, armor); } - - private MetalMaterial(String name, boolean hasOre, FabricBlockSettings settings, Settings itemSettings, ToolMaterial material, ArmorMaterial armor) { - FabricBlockSettings lantern = FabricBlockSettings.copyOf(settings).sounds(BlockSoundGroup.LANTERN).hardness(1).resistance(1).luminance(15); - final int level = material.getMiningLevel(); - - ore = hasOre ? EndBlocks.registerBlock(name + "_ore", new BlockBase(FabricBlockSettings.copyOf(Blocks.END_STONE))) : null; + + private MetalMaterial(String name, boolean hasOre, FabricBlockSettings settings, Item.Properties itemSettings, + Tier material, ArmorMaterial armor) { + FabricBlockSettings lantern = FabricBlockSettings.copyOf(settings).sounds(SoundType.LANTERN).hardness(1) + .resistance(1).luminance(15); + final int level = material.getLevel(); + + ore = hasOre + ? EndBlocks.registerBlock(name + "_ore", new BlockBase(FabricBlockSettings.copyOf(Blocks.END_STONE))) + : null; block = EndBlocks.registerBlock(name + "_block", new BlockBase(settings)); tile = EndBlocks.registerBlock(name + "_tile", new BlockBase(settings)); stairs = EndBlocks.registerBlock(name + "_stairs", new EndStairsBlock(tile)); slab = EndBlocks.registerBlock(name + "_slab", new EndSlabBlock(tile)); door = EndBlocks.registerBlock(name + "_door", new EndDoorBlock(block)); trapdoor = EndBlocks.registerBlock(name + "_trapdoor", new EndTrapdoorBlock(block)); - anvil = EndBlocks.registerBlock(name + "_anvil", new EndAnvilBlock(block.getDefaultMaterialColor(), level)); + anvil = EndBlocks.registerBlock(name + "_anvil", new EndAnvilBlock(block.defaultMaterialColor(), level)); bars = EndBlocks.registerBlock(name + "_bars", new EndMetalPaneBlock(block)); - chain = EndBlocks.registerBlock(name + "_chain", new EndChainBlock(block.getDefaultMaterialColor())); + chain = EndBlocks.registerBlock(name + "_chain", new EndChainBlock(block.defaultMaterialColor())); plate = EndBlocks.registerBlock(name + "_plate", new EndWoodenPlateBlock(block)); - + chandelier = EndBlocks.registerBlock(name + "_chandelier", new ChandelierBlock(block)); bulb_lantern = EndBlocks.registerBlock(name + "_bulb_lantern", new BulbVineLanternBlock(lantern)); bulb_lantern_colored = new ColoredMaterial(BulbVineLanternColoredBlock::new, bulb_lantern, false); - + nugget = EndItems.registerItem(name + "_nugget", new PatternedItem(itemSettings)); ingot = EndItems.registerItem(name + "_ingot", new PatternedItem(itemSettings)); - + shovelHead = EndItems.registerItem(name + "_shovel_head"); pickaxeHead = EndItems.registerItem(name + "_pickaxe_head"); axeHead = EndItems.registerItem(name + "_axe_head"); hoeHead = EndItems.registerItem(name + "_hoe_head"); swordBlade = EndItems.registerItem(name + "_sword_blade"); swordHandle = EndItems.registerItem(name + "_sword_handle"); - + shovel = EndItems.registerTool(name + "_shovel", new EndShovelItem(material, 1.5F, -3.0F, itemSettings)); sword = EndItems.registerTool(name + "_sword", new EndSwordItem(material, 3, -2.4F, itemSettings)); pickaxe = EndItems.registerTool(name + "_pickaxe", new EndPickaxeItem(material, 1, -2.8F, itemSettings)); axe = EndItems.registerTool(name + "_axe", new EndAxeItem(material, 6.0F, -3.0F, itemSettings)); hoe = EndItems.registerTool(name + "_hoe", new EndHoeItem(material, -3, 0.0F, itemSettings)); hammer = EndItems.registerTool(name + "_hammer", new EndHammerItem(material, 5.0F, -3.2F, 0.3D, itemSettings)); - + helmet = EndItems.registerItem(name + "_helmet", new EndArmorItem(armor, EquipmentSlot.HEAD, itemSettings)); - chestplate = EndItems.registerItem(name + "_chestplate", new EndArmorItem(armor, EquipmentSlot.CHEST, itemSettings)); + chestplate = EndItems.registerItem(name + "_chestplate", + new EndArmorItem(armor, EquipmentSlot.CHEST, itemSettings)); leggings = EndItems.registerItem(name + "_leggings", new EndArmorItem(armor, EquipmentSlot.LEGS, itemSettings)); boots = EndItems.registerItem(name + "_boots", new EndArmorItem(armor, EquipmentSlot.FEET, itemSettings)); - + if (hasOre) { FurnaceRecipe.make(name + "_ingot_furnace", ore, ingot).setGroup("end_ingot").buildWithBlasting(); - AlloyingRecipe.Builder.create(name + "_ingot_alloy").setInput(ore, ore).setOutput(ingot, 3).setExpiriense(2.1F).build(); + AlloyingRecipe.Builder.create(name + "_ingot_alloy").setInput(ore, ore).setOutput(ingot, 3) + .setExpiriense(2.1F).build(); } - + // Basic recipes - GridRecipe.make(name + "_ingot_from_nuggets", ingot).setShape("###", "###", "###").addMaterial('#', nugget).setGroup("end_metal_ingots_nug").build(); - GridRecipe.make(name + "_block", block).setShape("###", "###", "###").addMaterial('#', ingot).setGroup("end_metal_blocks").build(); - GridRecipe.make(name + "_ingot_from_block", ingot).setOutputCount(9).setList("#").addMaterial('#', block).setGroup("end_metal_ingots").build(); - + GridRecipe.make(name + "_ingot_from_nuggets", ingot).setShape("###", "###", "###").addMaterial('#', nugget) + .setGroup("end_metal_ingots_nug").build(); + GridRecipe.make(name + "_block", block).setShape("###", "###", "###").addMaterial('#', ingot) + .setGroup("end_metal_blocks").build(); + GridRecipe.make(name + "_ingot_from_block", ingot).setOutputCount(9).setList("#").addMaterial('#', block) + .setGroup("end_metal_ingots").build(); + // Block recipes - GridRecipe.make(name + "_tile", tile).setOutputCount(4).setShape("##", "##").addMaterial('#', block).setGroup("end_metal_tiles").build(); - GridRecipe.make(name + "_bars", bars).setOutputCount(16).setShape("###", "###").addMaterial('#', ingot).setGroup("end_metal_bars").build(); - GridRecipe.make(name + "_plate", plate).setShape("##").addMaterial('#', ingot).setGroup("end_metal_plates").build(); - GridRecipe.make(name + "_door", door).setOutputCount(3).setShape("##", "##", "##").addMaterial('#', ingot).setGroup("end_metal_doors").build(); - GridRecipe.make(name + "_trapdoor", trapdoor).setShape("##", "##").addMaterial('#', ingot).setGroup("end_metal_trapdoors").build(); - GridRecipe.make(name + "_stairs", stairs).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', block, tile).setGroup("end_metal_stairs").build(); - GridRecipe.make(name + "_slab", slab).setOutputCount(6).setShape("###").addMaterial('#', block, tile).setGroup("end_metal_slabs").build(); - GridRecipe.make(name + "_chain", chain).setShape("N", "#", "N").addMaterial('#', ingot).addMaterial('N', nugget).setGroup("end_metal_chain").build(); - GridRecipe.make(name + "_anvil", anvil).setShape("###", " I ", "III").addMaterial('#', block, tile).addMaterial('I', ingot).setGroup("end_metal_anvil").build(); - GridRecipe.make(name + "bulb_lantern", bulb_lantern).setShape("C", "I", "#").addMaterial('C', chain).addMaterial('I', ingot).addMaterial('#', EndItems.GLOWING_BULB).build(); - - GridRecipe.make(name + "_smith_table", Blocks.SMITHING_TABLE).setShape("II", "##", "##").addMaterial('#', ItemTags.PLANKS).addMaterial('I', ingot).setGroup("smith_table").build(); - GridRecipe.make(name + "_chandelier", chandelier).setShape("I#I", " # ").addMaterial('#', ingot).addMaterial('I', EndItems.LUMECORN_ROD).setGroup("end_metal_chandelier").build(); - + GridRecipe.make(name + "_tile", tile).setOutputCount(4).setShape("##", "##").addMaterial('#', block) + .setGroup("end_metal_tiles").build(); + GridRecipe.make(name + "_bars", bars).setOutputCount(16).setShape("###", "###").addMaterial('#', ingot) + .setGroup("end_metal_bars").build(); + GridRecipe.make(name + "_plate", plate).setShape("##").addMaterial('#', ingot).setGroup("end_metal_plates") + .build(); + GridRecipe.make(name + "_door", door).setOutputCount(3).setShape("##", "##", "##").addMaterial('#', ingot) + .setGroup("end_metal_doors").build(); + GridRecipe.make(name + "_trapdoor", trapdoor).setShape("##", "##").addMaterial('#', ingot) + .setGroup("end_metal_trapdoors").build(); + GridRecipe.make(name + "_stairs", stairs).setOutputCount(4).setShape("# ", "## ", "###") + .addMaterial('#', block, tile).setGroup("end_metal_stairs").build(); + GridRecipe.make(name + "_slab", slab).setOutputCount(6).setShape("###").addMaterial('#', block, tile) + .setGroup("end_metal_slabs").build(); + GridRecipe.make(name + "_chain", chain).setShape("N", "#", "N").addMaterial('#', ingot).addMaterial('N', nugget) + .setGroup("end_metal_chain").build(); + GridRecipe.make(name + "_anvil", anvil).setShape("###", " I ", "III").addMaterial('#', block, tile) + .addMaterial('I', ingot).setGroup("end_metal_anvil").build(); + GridRecipe.make(name + "bulb_lantern", bulb_lantern).setShape("C", "I", "#").addMaterial('C', chain) + .addMaterial('I', ingot).addMaterial('#', EndItems.GLOWING_BULB).build(); + + GridRecipe.make(name + "_smith_table", Blocks.SMITHING_TABLE).setShape("II", "##", "##") + .addMaterial('#', ItemTags.PLANKS).addMaterial('I', ingot).setGroup("smith_table").build(); + GridRecipe.make(name + "_chandelier", chandelier).setShape("I#I", " # ").addMaterial('#', ingot) + .addMaterial('I', EndItems.LUMECORN_ROD).setGroup("end_metal_chandelier").build(); + // Tools & armor into nuggets FurnaceRecipe.make(name + "_axe_nugget", axe, nugget).setGroup("end_nugget").buildWithBlasting(); FurnaceRecipe.make(name + "_hoe_nugget", hoe, nugget).setGroup("end_nugget").buildWithBlasting(); @@ -175,34 +201,47 @@ public class MetalMaterial { FurnaceRecipe.make(name + "_chestplate_nugget", chestplate, nugget).setGroup("end_nugget").buildWithBlasting(); FurnaceRecipe.make(name + "_leggings_nugget", leggings, nugget).setGroup("end_nugget").buildWithBlasting(); FurnaceRecipe.make(name + "_boots_nugget", boots, nugget).setGroup("end_nugget").buildWithBlasting(); - + // Tool parts from ingots - AnvilRecipe.Builder.create(name + "_shovel_head").setInput(ingot).setOutput(shovelHead).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); - AnvilRecipe.Builder.create(name + "_pickaxe_head").setInput(ingot).setInputCount(3).setOutput(pickaxeHead).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); - AnvilRecipe.Builder.create(name + "_axe_head").setInput(ingot).setInputCount(3).setOutput(axeHead).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); - AnvilRecipe.Builder.create(name + "_hoe_head").setInput(ingot).setInputCount(2).setOutput(hoeHead).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); - AnvilRecipe.Builder.create(name + "_sword_blade").setInput(ingot).setOutput(swordBlade).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); - + AnvilRecipe.Builder.create(name + "_shovel_head").setInput(ingot).setOutput(shovelHead).setAnvilLevel(level) + .setToolLevel(level).setDamage(level).build(); + AnvilRecipe.Builder.create(name + "_pickaxe_head").setInput(ingot).setInputCount(3).setOutput(pickaxeHead) + .setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); + AnvilRecipe.Builder.create(name + "_axe_head").setInput(ingot).setInputCount(3).setOutput(axeHead) + .setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); + AnvilRecipe.Builder.create(name + "_hoe_head").setInput(ingot).setInputCount(2).setOutput(hoeHead) + .setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); + AnvilRecipe.Builder.create(name + "_sword_blade").setInput(ingot).setOutput(swordBlade).setAnvilLevel(level) + .setToolLevel(level).setDamage(level).build(); + // Tools from parts SmithingTableRecipe.create(name + "_hammer").setResult(hammer).setBase(block).setAddition(Items.STICK).build(); SmithingTableRecipe.create(name + "_axe").setResult(axe).setBase(axeHead).setAddition(Items.STICK).build(); - SmithingTableRecipe.create(name + "_pickaxe").setResult(pickaxe).setBase(pickaxeHead).setAddition(Items.STICK).build(); + SmithingTableRecipe.create(name + "_pickaxe").setResult(pickaxe).setBase(pickaxeHead).setAddition(Items.STICK) + .build(); SmithingTableRecipe.create(name + "_hoe").setResult(hoe).setBase(hoeHead).setAddition(Items.STICK).build(); - SmithingTableRecipe.create(name + "_sword_handle").setResult(swordHandle).setBase(ingot).setAddition(Items.STICK).build(); - SmithingTableRecipe.create(name + "_sword").setResult(sword).setBase(swordBlade).setAddition(swordHandle).build(); - SmithingTableRecipe.create(name + "_shovel").setResult(shovel).setBase(shovelHead).setAddition(Items.STICK).build(); - + SmithingTableRecipe.create(name + "_sword_handle").setResult(swordHandle).setBase(ingot) + .setAddition(Items.STICK).build(); + SmithingTableRecipe.create(name + "_sword").setResult(sword).setBase(swordBlade).setAddition(swordHandle) + .build(); + SmithingTableRecipe.create(name + "_shovel").setResult(shovel).setBase(shovelHead).setAddition(Items.STICK) + .build(); + // Armor crafting - GridRecipe.make(name + "_helmet", helmet).setShape("###", "# #").addMaterial('#', ingot).setGroup("end_metal_helmets").build(); - GridRecipe.make(name + "_chestplate", chestplate).setShape("# #", "###", "###").addMaterial('#', ingot).setGroup("end_metal_chestplates").build(); - GridRecipe.make(name + "_leggings", leggings).setShape("###", "# #", "# #").addMaterial('#', ingot).setGroup("end_metal_leggings").build(); - GridRecipe.make(name + "_boots", boots).setShape("# #", "# #").addMaterial('#', ingot).setGroup("end_metal_boots").build(); - + GridRecipe.make(name + "_helmet", helmet).setShape("###", "# #").addMaterial('#', ingot) + .setGroup("end_metal_helmets").build(); + GridRecipe.make(name + "_chestplate", chestplate).setShape("# #", "###", "###").addMaterial('#', ingot) + .setGroup("end_metal_chestplates").build(); + GridRecipe.make(name + "_leggings", leggings).setShape("###", "# #", "# #").addMaterial('#', ingot) + .setGroup("end_metal_leggings").build(); + GridRecipe.make(name + "_boots", boots).setShape("# #", "# #").addMaterial('#', ingot) + .setGroup("end_metal_boots").build(); + TagHelper.addTag(BlockTags.ANVIL, anvil); TagHelper.addTag(BlockTags.BEACON_BASE_BLOCKS, block); TagHelper.addTag(EndTags.IRON_INGOTS, ingot); TagHelper.addTag(ItemTags.BEACON_PAYMENT_ITEMS, ingot); - + TagHelper.addTag(EndTags.DRAGON_IMMUNE, ore, bars); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java index 782ff4b0..bae66336 100644 --- a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java @@ -1,11 +1,11 @@ package ru.betterend.blocks.complex; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.block.MaterialColor; -import net.minecraft.tag.BlockTags; -import net.minecraft.tag.ItemTags; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.ItemTags; import ru.betterend.blocks.EndPedestal; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.blocks.basis.EndFurnaceBlock; @@ -25,7 +25,7 @@ import ru.betterend.util.TagHelper; public class StoneMaterial { public final Block stone; - + public final Block polished; public final Block tiles; public final Block pillar; @@ -36,16 +36,16 @@ public class StoneMaterial { public final Block pressure_plate; public final Block pedestal; public final Block lantern; - + public final Block bricks; public final Block brick_stairs; public final Block brick_slab; public final Block brick_wall; public final Block furnace; - + public StoneMaterial(String name, MaterialColor color) { FabricBlockSettings material = FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color); - + stone = EndBlocks.registerBlock(name, new BlockBase(material)); polished = EndBlocks.registerBlock(name + "_polished", new BlockBase(material)); tiles = EndBlocks.registerBlock(name + "_tiles", new BlockBase(material)); @@ -57,48 +57,62 @@ public class StoneMaterial { pressure_plate = EndBlocks.registerBlock(name + "_plate", new EndStonelateBlock(stone)); pedestal = EndBlocks.registerBlock(name + "_pedestal", new EndPedestal(stone)); lantern = EndBlocks.registerBlock(name + "_lantern", new StoneLanternBlock(stone)); - + bricks = EndBlocks.registerBlock(name + "_bricks", new BlockBase(material)); brick_stairs = EndBlocks.registerBlock(name + "_bricks_stairs", new EndStairsBlock(bricks)); brick_slab = EndBlocks.registerBlock(name + "_bricks_slab", new EndSlabBlock(bricks)); brick_wall = EndBlocks.registerBlock(name + "_bricks_wall", new EndWallBlock(bricks)); furnace = EndBlocks.registerBlock(name + "_furnace", new EndFurnaceBlock(bricks)); - + // Recipes // - GridRecipe.make(name + "_bricks", bricks).setOutputCount(4).setShape("##", "##").addMaterial('#', stone).setGroup("end_bricks").build(); - GridRecipe.make(name + "_polished", polished).setOutputCount(4).setShape("##", "##").addMaterial('#', bricks).setGroup("end_tile").build(); - GridRecipe.make(name + "_tiles", tiles).setOutputCount(4).setShape("##", "##").addMaterial('#', polished).setGroup("end_small_tile").build(); - GridRecipe.make(name + "_pillar", pillar).setShape("#", "#").addMaterial('#', slab).setGroup("end_pillar").build(); - - GridRecipe.make(name + "_stairs", stairs).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', stone).setGroup("end_stone_stairs").build(); - GridRecipe.make(name + "_slab", slab).setOutputCount(6).setShape("###").addMaterial('#', stone).setGroup("end_stone_slabs").build(); - GridRecipe.make(name + "_bricks_stairs", brick_stairs).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', bricks).setGroup("end_stone_stairs").build(); - GridRecipe.make(name + "_bricks_slab", brick_slab).setOutputCount(6).setShape("###").addMaterial('#', bricks).setGroup("end_stone_slabs").build(); - - GridRecipe.make(name + "_wall", wall).setOutputCount(6).setShape("###", "###").addMaterial('#', stone).setGroup("end_wall").build(); - GridRecipe.make(name + "_bricks_wall", brick_wall).setOutputCount(6).setShape("###", "###").addMaterial('#', bricks).setGroup("end_wall").build(); - - GridRecipe.make(name + "_button", button).setList("#").addMaterial('#', stone).setGroup("end_stone_buttons").build(); - GridRecipe.make(name + "_pressure_plate", pressure_plate).setShape("##").addMaterial('#', stone).setGroup("end_stone_plates").build(); - GridRecipe.make(name + "_lantern", lantern).setShape("S", "#", "S").addMaterial('#', EndItems.CRYSTAL_SHARDS).addMaterial('S', slab, brick_slab).setGroup("end_stone_lanterns").build(); - GridRecipe.make(name + "_furnace", furnace).setShape("###", "# #", "###").addMaterial('#', stone).setGroup("end_stone_furnaces").build(); - + GridRecipe.make(name + "_bricks", bricks).setOutputCount(4).setShape("##", "##").addMaterial('#', stone) + .setGroup("end_bricks").build(); + GridRecipe.make(name + "_polished", polished).setOutputCount(4).setShape("##", "##").addMaterial('#', bricks) + .setGroup("end_tile").build(); + GridRecipe.make(name + "_tiles", tiles).setOutputCount(4).setShape("##", "##").addMaterial('#', polished) + .setGroup("end_small_tile").build(); + GridRecipe.make(name + "_pillar", pillar).setShape("#", "#").addMaterial('#', slab).setGroup("end_pillar") + .build(); + + GridRecipe.make(name + "_stairs", stairs).setOutputCount(4).setShape("# ", "## ", "###") + .addMaterial('#', stone).setGroup("end_stone_stairs").build(); + GridRecipe.make(name + "_slab", slab).setOutputCount(6).setShape("###").addMaterial('#', stone) + .setGroup("end_stone_slabs").build(); + GridRecipe.make(name + "_bricks_stairs", brick_stairs).setOutputCount(4).setShape("# ", "## ", "###") + .addMaterial('#', bricks).setGroup("end_stone_stairs").build(); + GridRecipe.make(name + "_bricks_slab", brick_slab).setOutputCount(6).setShape("###").addMaterial('#', bricks) + .setGroup("end_stone_slabs").build(); + + GridRecipe.make(name + "_wall", wall).setOutputCount(6).setShape("###", "###").addMaterial('#', stone) + .setGroup("end_wall").build(); + GridRecipe.make(name + "_bricks_wall", brick_wall).setOutputCount(6).setShape("###", "###") + .addMaterial('#', bricks).setGroup("end_wall").build(); + + GridRecipe.make(name + "_button", button).setList("#").addMaterial('#', stone).setGroup("end_stone_buttons") + .build(); + GridRecipe.make(name + "_pressure_plate", pressure_plate).setShape("##").addMaterial('#', stone) + .setGroup("end_stone_plates").build(); + GridRecipe.make(name + "_lantern", lantern).setShape("S", "#", "S").addMaterial('#', EndItems.CRYSTAL_SHARDS) + .addMaterial('S', slab, brick_slab).setGroup("end_stone_lanterns").build(); + GridRecipe.make(name + "_furnace", furnace).setShape("###", "# #", "###").addMaterial('#', stone) + .setGroup("end_stone_furnaces").build(); + CraftingRecipes.registerPedestal(name + "_pedestal", pedestal, slab, pillar); - + // Item Tags // TagHelper.addTag(ItemTags.SLABS, slab, brick_slab); TagHelper.addTag(ItemTags.STONE_BRICKS, bricks); TagHelper.addTag(ItemTags.STONE_CRAFTING_MATERIALS, stone); TagHelper.addTag(ItemTags.STONE_TOOL_MATERIALS, stone); TagHelper.addTag(EndTags.FURNACES, furnace); - + // Block Tags // TagHelper.addTag(BlockTags.STONE_BRICKS, bricks); TagHelper.addTag(BlockTags.WALLS, wall, brick_wall); TagHelper.addTag(BlockTags.SLABS, slab, brick_slab); TagHelper.addTags(pressure_plate, BlockTags.PRESSURE_PLATES, BlockTags.STONE_PRESSURE_PLATES); TagHelper.addTag(EndTags.END_STONES, stone); - + TagHelper.addTag(EndTags.DRAGON_IMMUNE, stone, stairs, slab, wall); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java index fd4f4c17..b9d8b514 100644 --- a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java @@ -1,15 +1,15 @@ package ru.betterend.blocks.complex; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.MaterialColor; -import net.minecraft.item.Item; -import net.minecraft.item.Items; -import net.minecraft.tag.BlockTags; -import net.minecraft.tag.ItemTags; -import net.minecraft.tag.Tag; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.Tag; import ru.betterend.blocks.basis.BarkBlock; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.blocks.basis.EndBarrelBlock; @@ -52,28 +52,28 @@ public class WoodenMaterial { public final Block pressurePlate; public final Block trapdoor; public final Block door; - + public final Block craftingTable; public final Block ladder; public final Block sign; - + public final Block chest; public final Block barrel; public final Block shelf; public final Block composter; - + public final Tag.Identified logBlockTag; public final Tag.Identified logItemTag; - + public WoodenMaterial(String name, MaterialColor woodColor, MaterialColor planksColor) { FabricBlockSettings materialPlanks = FabricBlockSettings.copyOf(Blocks.OAK_PLANKS).materialColor(planksColor); - + log_stripped = EndBlocks.registerBlock(name + "_stripped_log", new EndPillarBlock(materialPlanks)); bark_stripped = EndBlocks.registerBlock(name + "_stripped_bark", new BarkBlock(materialPlanks)); - + log = EndBlocks.registerBlock(name + "_log", new EndBlockStripableLogLog(woodColor, log_stripped)); bark = EndBlocks.registerBlock(name + "_bark", new StrippableBarkBlock(woodColor, bark_stripped)); - + planks = EndBlocks.registerBlock(name + "_planks", new BlockBase(materialPlanks)); stairs = EndBlocks.registerBlock(name + "_stairs", new EndStairsBlock(planks)); slab = EndBlocks.registerBlock(name + "_slab", new EndSlabBlock(planks)); @@ -83,43 +83,59 @@ public class WoodenMaterial { pressurePlate = EndBlocks.registerBlock(name + "_plate", new EndWoodenPlateBlock(planks)); trapdoor = EndBlocks.registerBlock(name + "_trapdoor", new EndTrapdoorBlock(planks)); door = EndBlocks.registerBlock(name + "_door", new EndDoorBlock(planks)); - + craftingTable = EndBlocks.registerBlock(name + "_crafting_table", new EndCraftingTableBlock(planks)); ladder = EndBlocks.registerBlock(name + "_ladder", new EndLadderBlock(planks)); sign = EndBlocks.registerBlock(name + "_sign", new EndSignBlock(planks)); - + chest = EndBlocks.registerBlock(name + "_chest", new EndChestBlock(planks)); barrel = EndBlocks.registerBlock(name + "_barrel", new EndBarrelBlock(planks)); shelf = EndBlocks.registerBlock(name + "_bookshelf", new EndBookshelfBlock(planks)); composter = EndBlocks.registerBlock(name + "_composter", new EndComposterBlock(planks)); - + // Recipes // - GridRecipe.make(name + "_planks", planks).setOutputCount(4).setList("#").addMaterial('#', log, bark, log_stripped, bark_stripped).setGroup("end_planks").build(); - GridRecipe.make(name + "_stairs", stairs).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', planks).setGroup("end_planks_stairs").build(); - GridRecipe.make(name + "_slab", slab).setOutputCount(6).setShape("###").addMaterial('#', planks).setGroup("end_planks_slabs").build(); - GridRecipe.make(name + "_fence", fence).setOutputCount(3).setShape("#I#", "#I#").addMaterial('#', planks).addMaterial('I', Items.STICK).setGroup("end_planks_fences").build(); - GridRecipe.make(name + "_gate", gate).setShape("I#I", "I#I").addMaterial('#', planks).addMaterial('I', Items.STICK).setGroup("end_planks_gates").build(); - GridRecipe.make(name + "_button", button).setList("#").addMaterial('#', planks).setGroup("end_planks_buttons").build(); - GridRecipe.make(name + "_pressure_plate", pressurePlate).setShape("##").addMaterial('#', planks).setGroup("end_planks_plates").build(); - GridRecipe.make(name + "_trapdoor", trapdoor).setOutputCount(2).setShape("###", "###").addMaterial('#', planks).setGroup("end_trapdoors").build(); - GridRecipe.make(name + "_door", door).setOutputCount(3).setShape("##", "##", "##").addMaterial('#', planks).setGroup("end_doors").build(); - GridRecipe.make(name + "_crafting_table", craftingTable).setShape("##", "##").addMaterial('#', planks).setGroup("end_tables").build(); - GridRecipe.make(name + "_ladder", ladder).setOutputCount(3).setShape("I I", "I#I", "I I").addMaterial('#', planks).addMaterial('I', Items.STICK).setGroup("end_ladders").build(); - GridRecipe.make(name + "_sign", sign).setOutputCount(3).setShape("###", "###", " I ").addMaterial('#', planks).addMaterial('I', Items.STICK).setGroup("end_signs").build(); - GridRecipe.make(name + "_chest", chest).setShape("###", "# #", "###").addMaterial('#', planks).setGroup("end_chests").build(); - GridRecipe.make(name + "_barrel", barrel).setShape("#S#", "# #", "#S#").addMaterial('#', planks).addMaterial('S', slab).setGroup("end_barrels").build(); - GridRecipe.make(name + "_bookshelf", shelf).setShape("###", "PPP", "###").addMaterial('#', planks).addMaterial('P', Items.BOOK).setGroup("end_bookshelves").build(); + GridRecipe.make(name + "_planks", planks).setOutputCount(4).setList("#") + .addMaterial('#', log, bark, log_stripped, bark_stripped).setGroup("end_planks").build(); + GridRecipe.make(name + "_stairs", stairs).setOutputCount(4).setShape("# ", "## ", "###") + .addMaterial('#', planks).setGroup("end_planks_stairs").build(); + GridRecipe.make(name + "_slab", slab).setOutputCount(6).setShape("###").addMaterial('#', planks) + .setGroup("end_planks_slabs").build(); + GridRecipe.make(name + "_fence", fence).setOutputCount(3).setShape("#I#", "#I#").addMaterial('#', planks) + .addMaterial('I', Items.STICK).setGroup("end_planks_fences").build(); + GridRecipe.make(name + "_gate", gate).setShape("I#I", "I#I").addMaterial('#', planks) + .addMaterial('I', Items.STICK).setGroup("end_planks_gates").build(); + GridRecipe.make(name + "_button", button).setList("#").addMaterial('#', planks).setGroup("end_planks_buttons") + .build(); + GridRecipe.make(name + "_pressure_plate", pressurePlate).setShape("##").addMaterial('#', planks) + .setGroup("end_planks_plates").build(); + GridRecipe.make(name + "_trapdoor", trapdoor).setOutputCount(2).setShape("###", "###").addMaterial('#', planks) + .setGroup("end_trapdoors").build(); + GridRecipe.make(name + "_door", door).setOutputCount(3).setShape("##", "##", "##").addMaterial('#', planks) + .setGroup("end_doors").build(); + GridRecipe.make(name + "_crafting_table", craftingTable).setShape("##", "##").addMaterial('#', planks) + .setGroup("end_tables").build(); + GridRecipe.make(name + "_ladder", ladder).setOutputCount(3).setShape("I I", "I#I", "I I") + .addMaterial('#', planks).addMaterial('I', Items.STICK).setGroup("end_ladders").build(); + GridRecipe.make(name + "_sign", sign).setOutputCount(3).setShape("###", "###", " I ").addMaterial('#', planks) + .addMaterial('I', Items.STICK).setGroup("end_signs").build(); + GridRecipe.make(name + "_chest", chest).setShape("###", "# #", "###").addMaterial('#', planks) + .setGroup("end_chests").build(); + GridRecipe.make(name + "_barrel", barrel).setShape("#S#", "# #", "#S#").addMaterial('#', planks) + .addMaterial('S', slab).setGroup("end_barrels").build(); + GridRecipe.make(name + "_bookshelf", shelf).setShape("###", "PPP", "###").addMaterial('#', planks) + .addMaterial('P', Items.BOOK).setGroup("end_bookshelves").build(); GridRecipe.make(name + "_bark", bark).setShape("##", "##").addMaterial('#', log).setOutputCount(3).build(); GridRecipe.make(name + "_log", log).setShape("##", "##").addMaterial('#', bark).setOutputCount(3).build(); GridRecipe.make(name + "_composter", composter).setShape("# #", "# #", "###").addMaterial('#', slab).build(); - GridRecipe.make(name + "_shulker", Items.SHULKER_BOX).setShape("S", "#", "S").addMaterial('S', Items.SHULKER_SHELL).addMaterial('#', chest).build(); - + GridRecipe.make(name + "_shulker", Items.SHULKER_BOX).setShape("S", "#", "S") + .addMaterial('S', Items.SHULKER_SHELL).addMaterial('#', chest).build(); + // Item Tags // TagHelper.addTag(ItemTags.PLANKS, planks); TagHelper.addTag(ItemTags.WOODEN_PRESSURE_PLATES, pressurePlate); TagHelper.addTag(ItemTags.LOGS, log, bark, log_stripped, bark_stripped); TagHelper.addTag(ItemTags.LOGS_THAT_BURN, log, bark, log_stripped, bark_stripped); - + TagHelper.addTags(button, ItemTags.WOODEN_BUTTONS, ItemTags.BUTTONS); TagHelper.addTags(door, ItemTags.WOODEN_DOORS, ItemTags.DOORS); TagHelper.addTags(fence, ItemTags.WOODEN_FENCES, ItemTags.FENCES); @@ -127,13 +143,13 @@ public class WoodenMaterial { TagHelper.addTags(stairs, ItemTags.WOODEN_STAIRS, ItemTags.STAIRS); TagHelper.addTags(trapdoor, ItemTags.WOODEN_TRAPDOORS, ItemTags.TRAPDOORS); TagHelper.addTag(EndTags.ITEM_CHEST, chest); - + // Block Tags // TagHelper.addTag(BlockTags.PLANKS, planks); TagHelper.addTag(BlockTags.CLIMBABLE, ladder); TagHelper.addTag(BlockTags.LOGS, log, bark, log_stripped, bark_stripped); TagHelper.addTag(BlockTags.LOGS_THAT_BURN, log, bark, log_stripped, bark_stripped); - + TagHelper.addTags(button, BlockTags.WOODEN_BUTTONS, BlockTags.BUTTONS); TagHelper.addTags(door, BlockTags.WOODEN_DOORS, BlockTags.DOORS); TagHelper.addTags(fence, BlockTags.WOODEN_FENCES, BlockTags.FENCES); @@ -142,17 +158,17 @@ public class WoodenMaterial { TagHelper.addTags(trapdoor, BlockTags.WOODEN_TRAPDOORS, BlockTags.TRAPDOORS); TagHelper.addTag(EndTags.BOOKSHELVES, shelf); TagHelper.addTag(EndTags.BLOCK_CHEST, chest); - + logBlockTag = EndTags.makeBlockTag(name + "_logs"); logItemTag = EndTags.makeItemTag(name + "_logs"); TagHelper.addTag(logBlockTag, log_stripped, bark_stripped, log, bark); TagHelper.addTag(logItemTag, log_stripped, bark_stripped, log, bark); } - + public boolean isTreeLog(Block block) { return block == log || block == bark; } - + public boolean isTreeLog(BlockState state) { return isTreeLog(state.getBlock()); } diff --git a/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java b/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java index f8a2eb68..19306898 100644 --- a/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java +++ b/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java @@ -1,8 +1,8 @@ package ru.betterend.blocks.entities; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.particle.ParticleTypes; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.core.particles.ParticleTypes; import net.minecraft.util.Tickable; import ru.betterend.blocks.HydrothermalVentBlock; import ru.betterend.registry.EndBlockEntities; @@ -21,11 +21,10 @@ public class BlockEntityHydrothermalVent extends BlockEntity implements Tickable double y = pos.getY() + 0.9 + world.random.nextDouble() * 0.3; double z = pos.getZ() + world.random.nextDouble(); BlockState state = getCachedState(); - if (state.isOf(EndBlocks.HYDROTHERMAL_VENT) && state.get(HydrothermalVentBlock.ACTIVATED)) { - if (state.get(HydrothermalVentBlock.WATERLOGGED)) { + if (state.is(EndBlocks.HYDROTHERMAL_VENT) && state.getValue(HydrothermalVentBlock.ACTIVATED)) { + if (state.getValue(HydrothermalVentBlock.WATERLOGGED)) { world.addParticle(EndParticles.GEYSER_PARTICLE, x, y, z, 0, 0, 0); - } - else { + } else { world.addParticle(ParticleTypes.BUBBLE, x, y, z, 0, 0, 0); } } diff --git a/src/main/java/ru/betterend/blocks/entities/EBarrelBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EBarrelBlockEntity.java index ac9a35c2..077ce206 100644 --- a/src/main/java/ru/betterend/blocks/entities/EBarrelBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EBarrelBlockEntity.java @@ -1,25 +1,25 @@ package ru.betterend.blocks.entities; -import net.minecraft.block.BarrelBlock; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.block.entity.ChestBlockEntity; -import net.minecraft.block.entity.LootableContainerBlockEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.world.level.block.BarrelBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.entity.ChestBlockEntity; +import net.minecraft.world.level.block.entity.LootableContainerBlockEntity; +import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.PlayerInventory; import net.minecraft.inventory.Inventories; -import net.minecraft.item.ItemStack; +import net.minecraft.world.item.ItemStack; import net.minecraft.nbt.CompoundTag; import net.minecraft.screen.GenericContainerScreenHandler; import net.minecraft.screen.ScreenHandler; -import net.minecraft.sound.SoundCategory; +import net.minecraft.sounds.SoundSource; import net.minecraft.sound.SoundEvent; -import net.minecraft.sound.SoundEvents; +import net.minecraft.sounds.SoundEvents; import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; import net.minecraft.util.collection.DefaultedList; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3i; +import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; import ru.betterend.blocks.basis.EndBarrelBlock; import ru.betterend.registry.EndBlockEntities; @@ -124,7 +124,7 @@ public class EBarrelBlockEntity extends LootableContainerBlockEntity { } private void setOpen(BlockState state, boolean open) { - this.world.setBlockState(this.getPos(), (BlockState) state.with(BarrelBlock.OPEN, open), 3); + this.world.setBlockAndUpdate(this.getPos(), (BlockState) state.with(BarrelBlock.OPEN, open), 3); } private void playSound(BlockState blockState, SoundEvent soundEvent) { @@ -132,7 +132,7 @@ public class EBarrelBlockEntity extends LootableContainerBlockEntity { double d = (double) this.pos.getX() + 0.5D + (double) vec3i.getX() / 2.0D; double e = (double) this.pos.getY() + 0.5D + (double) vec3i.getY() / 2.0D; double f = (double) this.pos.getZ() + 0.5D + (double) vec3i.getZ() / 2.0D; - this.world.playSound((PlayerEntity) null, d, e, f, soundEvent, SoundCategory.BLOCKS, 0.5F, + this.world.playLocalSound((PlayerEntity) null, d, e, f, soundEvent, SoundSource.BLOCKS, 0.5F, this.world.random.nextFloat() * 0.1F + 0.9F); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/entities/EChestBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EChestBlockEntity.java index 25c5bdc8..48e906d1 100644 --- a/src/main/java/ru/betterend/blocks/entities/EChestBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EChestBlockEntity.java @@ -1,6 +1,6 @@ package ru.betterend.blocks.entities; -import net.minecraft.block.entity.ChestBlockEntity; +import net.minecraft.world.level.block.entity.ChestBlockEntity; import ru.betterend.registry.EndBlockEntities; public class EChestBlockEntity extends ChestBlockEntity { diff --git a/src/main/java/ru/betterend/blocks/entities/EFurnaceBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EFurnaceBlockEntity.java index 8537ae9d..067113b4 100644 --- a/src/main/java/ru/betterend/blocks/entities/EFurnaceBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EFurnaceBlockEntity.java @@ -1,8 +1,8 @@ package ru.betterend.blocks.entities; -import net.minecraft.block.entity.AbstractFurnaceBlockEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.recipe.RecipeType; +import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; +import net.minecraft.world.entity.player.PlayerInventory; +import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.screen.FurnaceScreenHandler; import net.minecraft.screen.ScreenHandler; import net.minecraft.text.Text; diff --git a/src/main/java/ru/betterend/blocks/entities/ESignBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/ESignBlockEntity.java index 51e25415..0c2af7cc 100644 --- a/src/main/java/ru/betterend/blocks/entities/ESignBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/ESignBlockEntity.java @@ -1,7 +1,7 @@ package ru.betterend.blocks.entities; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.block.entity.SignBlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.entity.SignBlockEntity; import ru.betterend.registry.EndBlockEntities; public class ESignBlockEntity extends SignBlockEntity { diff --git a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java index 67280b59..282bfd2c 100644 --- a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java @@ -10,50 +10,51 @@ import com.google.common.collect.Maps; import it.unimi.dsi.fastutil.objects.Object2IntMap.Entry; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import net.fabricmc.fabric.api.registry.FuelRegistry; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.AbstractFurnaceBlockEntity; -import net.minecraft.block.entity.LockableContainerBlockEntity; -import net.minecraft.entity.ExperienceOrbEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; +import net.minecraft.world.level.block.entity.LockableContainerBlockEntity; +import net.minecraft.world.entity.ExperienceOrbEntity; +import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.PlayerInventory; import net.minecraft.inventory.Inventories; import net.minecraft.inventory.SidedInventory; -import net.minecraft.item.Item; -import net.minecraft.item.ItemConvertible; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemConvertible; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.nbt.CompoundTag; -import net.minecraft.recipe.BlastingRecipe; -import net.minecraft.recipe.Recipe; -import net.minecraft.recipe.RecipeFinder; -import net.minecraft.recipe.RecipeInputProvider; -import net.minecraft.recipe.RecipeType; -import net.minecraft.recipe.RecipeUnlocker; +import net.minecraft.world.item.crafting.BlastingRecipe; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeFinder; +import net.minecraft.world.item.crafting.RecipeInputProvider; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.RecipeUnlocker; import net.minecraft.screen.PropertyDelegate; import net.minecraft.screen.ScreenHandler; import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Tickable; import net.minecraft.util.collection.DefaultedList; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.MathHelper; +import net.minecraft.core.Direction; +import net.minecraft.util.Mth; import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; import ru.betterend.BetterEnd; import ru.betterend.blocks.EndStoneSmelter; import ru.betterend.client.gui.EndStoneSmelterScreenHandler; import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.registry.EndBlockEntities; -public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity implements SidedInventory, RecipeUnlocker, RecipeInputProvider, Tickable { +public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity + implements SidedInventory, RecipeUnlocker, RecipeInputProvider, Tickable { private static final int[] TOP_SLOTS = new int[] { 0, 1 }; private static final int[] BOTTOM_SLOTS = new int[] { 2, 3 }; private static final int[] SIDE_SLOTS = new int[] { 1, 2 }; private static final Map AVAILABLE_FUELS = Maps.newHashMap(); - - private final Object2IntOpenHashMap recipesUsed; + + private final Object2IntOpenHashMap recipesUsed; protected DefaultedList inventory; protected final PropertyDelegate propertyDelegate; private Recipe lastRecipe; @@ -61,47 +62,47 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp private int smeltTime; private int burnTime; private int fuelTime; - + public EndStoneSmelterBlockEntity() { super(EndBlockEntities.END_STONE_SMELTER); this.inventory = DefaultedList.ofSize(4, ItemStack.EMPTY); this.recipesUsed = new Object2IntOpenHashMap<>(); - this.propertyDelegate = new PropertyDelegate() { - public int get(int index) { - switch(index) { - case 0: - return EndStoneSmelterBlockEntity.this.burnTime; - case 1: - return EndStoneSmelterBlockEntity.this.fuelTime; - case 2: - return EndStoneSmelterBlockEntity.this.smeltTime; - case 3: - return EndStoneSmelterBlockEntity.this.smeltTimeTotal; - default: - return 0; - } - } + this.propertyDelegate = new PropertyDelegate() { + public int get(int index) { + switch (index) { + case 0: + return EndStoneSmelterBlockEntity.this.burnTime; + case 1: + return EndStoneSmelterBlockEntity.this.fuelTime; + case 2: + return EndStoneSmelterBlockEntity.this.smeltTime; + case 3: + return EndStoneSmelterBlockEntity.this.smeltTimeTotal; + default: + return 0; + } + } - public void set(int index, int value) { - switch(index) { - case 0: - EndStoneSmelterBlockEntity.this.burnTime = value; - break; - case 1: - EndStoneSmelterBlockEntity.this.fuelTime = value; - break; - case 2: - EndStoneSmelterBlockEntity.this.smeltTime = value; - break; - case 3: - EndStoneSmelterBlockEntity.this.smeltTimeTotal = value; - } - } + public void set(int index, int value) { + switch (index) { + case 0: + EndStoneSmelterBlockEntity.this.burnTime = value; + break; + case 1: + EndStoneSmelterBlockEntity.this.fuelTime = value; + break; + case 2: + EndStoneSmelterBlockEntity.this.smeltTime = value; + break; + case 3: + EndStoneSmelterBlockEntity.this.smeltTimeTotal = value; + } + } - public int size() { - return 4; - } - }; + public int size() { + return 4; + } + }; } private boolean isBurning() { @@ -145,7 +146,8 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp @Override public void setStack(int slot, ItemStack stack) { ItemStack itemStack = this.inventory.get(slot); - boolean stackValid = !stack.isEmpty() && stack.isItemEqualIgnoreDamage(itemStack) && ItemStack.areTagsEqual(stack, itemStack); + boolean stackValid = !stack.isEmpty() && stack.isItemEqualIgnoreDamage(itemStack) + && ItemStack.areTagsEqual(stack, itemStack); this.inventory.set(slot, stack); if (stack.getCount() > getMaxCountPerStack()) { stack.setCount(getMaxCountPerStack()); @@ -156,23 +158,23 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp this.markDirty(); } } - + protected int getSmeltTime() { assert this.world != null; int smeltTime = this.world.getRecipeManager().getFirstMatch(AlloyingRecipe.TYPE, this, world) .map(AlloyingRecipe::getSmeltTime).orElse(0); if (smeltTime == 0) { smeltTime = this.world.getRecipeManager().getFirstMatch(RecipeType.BLASTING, this, world) - .map(BlastingRecipe::getCookTime).orElse(200); + .map(BlastingRecipe::getCookTime).orElse(200); smeltTime /= 1.5; } return smeltTime; } - + public void dropExperience(PlayerEntity player) { assert world != null; List> list = Lists.newArrayList(); - for (Entry entry : this.recipesUsed.object2IntEntrySet()) { + for (Entry entry : this.recipesUsed.object2IntEntrySet()) { world.getRecipeManager().get(entry.getKey()).ifPresent((recipe) -> { list.add(recipe); if (recipe instanceof AlloyingRecipe) { @@ -187,15 +189,15 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp player.unlockRecipes(list); this.recipesUsed.clear(); } - - private void dropExperience(World world, Vec3d vec3d, int i, float f) { - int j = MathHelper.floor(i * f); - float g = MathHelper.fractionalPart(i * f); + + private void dropExperience(Level world, Vec3d vec3d, int i, float f) { + int j = Mth.floor(i * f); + float g = Mth.fractionalPart(i * f); if (g != 0.0F && Math.random() < g) { j++; } - while(j > 0) { + while (j > 0) { int k = ExperienceOrbEntity.roundToOrbSize(j); j -= k; world.spawnEntity(new ExperienceOrbEntity(world, vec3d.x, vec3d.y, vec3d.z, k)); @@ -208,7 +210,8 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp if (this.world.getBlockEntity(this.pos) != this) { return false; } - return player.squaredDistanceTo(this.pos.getX() + 0.5D, this.pos.getY() + 0.5D, this.pos.getZ() + 0.5D) <= 64.0D; + return player.squaredDistanceTo(this.pos.getX() + 0.5D, this.pos.getY() + 0.5D, + this.pos.getZ() + 0.5D) <= 64.0D; } @Override @@ -235,14 +238,15 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp boolean burning = this.isBurning(); assert this.world != null; - if (!this.world.isClient) { + if (!this.world.isClientSide) { ItemStack fuel = this.inventory.get(2); if (!burning && (fuel.isEmpty() || inventory.get(0).isEmpty() && inventory.get(1).isEmpty())) { if (smeltTime > 0) { - this.smeltTime = MathHelper.clamp(smeltTime - 2, 0, smeltTimeTotal); + this.smeltTime = Mth.clamp(smeltTime - 2, 0, smeltTimeTotal); } } else { - Recipe recipe = this.world.getRecipeManager().getFirstMatch(AlloyingRecipe.TYPE, this, world).orElse(null); + Recipe recipe = this.world.getRecipeManager().getFirstMatch(AlloyingRecipe.TYPE, this, world) + .orElse(null); if (recipe == null) { recipe = this.world.getRecipeManager().getFirstMatch(RecipeType.BLASTING, this, world).orElse(null); } @@ -278,21 +282,20 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp } if (initialBurning != burning) { - this.world.setBlockState(pos, world.getBlockState(pos).with(EndStoneSmelter.LIT, burning), 3); + this.world.setBlockAndUpdate(pos, world.getBlockState(pos).with(EndStoneSmelter.LIT, burning), 3); this.markDirty(); } } } - + protected boolean canAcceptRecipeOutput(Recipe recipe) { - if (recipe == null) return false; + if (recipe == null) + return false; boolean validInput; if (recipe instanceof AlloyingRecipe) { - validInput = !inventory.get(0).isEmpty() && - !inventory.get(1).isEmpty(); + validInput = !inventory.get(0).isEmpty() && !inventory.get(1).isEmpty(); } else { - validInput = !inventory.get(0).isEmpty() || - !inventory.get(1).isEmpty(); + validInput = !inventory.get(0).isEmpty() || !inventory.get(1).isEmpty(); } if (validInput) { ItemStack result = recipe.getOutput(); @@ -317,8 +320,9 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp } private void craftRecipe(Recipe recipe) { - if (recipe == null || !canAcceptRecipeOutput(recipe)) return; - + if (recipe == null || !canAcceptRecipeOutput(recipe)) + return; + ItemStack result = recipe.getOutput(); ItemStack output = this.inventory.get(3); if (output.isEmpty()) { @@ -328,10 +332,10 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp } assert this.world != null; - if (!this.world.isClient) { + if (!this.world.isClientSide) { this.setLastRecipe(recipe); } - + if (recipe instanceof AlloyingRecipe) { this.inventory.get(0).decrement(1); this.inventory.get(1).decrement(1); @@ -354,7 +358,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp @Override public void setLastRecipe(Recipe recipe) { if (recipe != null) { - Identifier recipeId = recipe.getId(); + ResourceLocation recipeId = recipe.getId(); this.recipesUsed.addTo(recipeId, 1); this.lastRecipe = recipe; } @@ -393,7 +397,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp Item item = fuel.getItem(); return AVAILABLE_FUELS.getOrDefault(item, getFabricFuel(fuel)); } - + @Override public void fromTag(BlockState state, CompoundTag tag) { super.fromTag(state, tag); @@ -405,10 +409,10 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp this.smeltTimeTotal = tag.getShort("SmeltTimeTotal"); CompoundTag compoundTag = tag.getCompound("RecipesUsed"); for (String id : compoundTag.getKeys()) { - this.recipesUsed.put(new Identifier(id), compoundTag.getInt(id)); + this.recipesUsed.put(new ResourceLocation(id), compoundTag.getInt(id)); } } - + @Override public CompoundTag toTag(CompoundTag tag) { super.toTag(tag); @@ -420,10 +424,10 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp CompoundTag usedRecipes = new CompoundTag(); this.recipesUsed.forEach((identifier, integer) -> usedRecipes.putInt(identifier.toString(), integer)); tag.put("RecipesUsed", usedRecipes); - + return tag; } - + public boolean isValid(int slot, ItemStack stack) { if (slot == 3) { return false; @@ -445,7 +449,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp public static Map availableFuels() { return AVAILABLE_FUELS; } - + private static int getFabricFuel(ItemStack stack) { Integer ticks = FuelRegistry.INSTANCE.get(stack.getItem()); return ticks == null ? 0 : ticks; diff --git a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java index 30039b14..f6ab8e2b 100644 --- a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java @@ -1,32 +1,32 @@ package ru.betterend.blocks.entities; import net.minecraft.nbt.CompoundTag; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; import ru.betterend.registry.EndBlockEntities; import ru.betterend.rituals.EternalRitual; public class EternalPedestalEntity extends PedestalBlockEntity { private EternalRitual linkedRitual; - + public EternalPedestalEntity() { super(EndBlockEntities.ETERNAL_PEDESTAL); } - + public boolean hasRitual() { return linkedRitual != null; } - + public void linkRitual(EternalRitual ritual) { this.linkedRitual = ritual; } - + public EternalRitual getRitual() { return linkedRitual; } - + @Override - public void setLocation(World world, BlockPos pos) { + public void setLocation(Level world, BlockPos pos) { super.setLocation(world, pos); if (hasRitual()) { linkedRitual.setWorld(world); diff --git a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java index 66e40fa4..f0151b12 100644 --- a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java @@ -1,39 +1,39 @@ package ru.betterend.blocks.entities; import net.minecraft.nbt.CompoundTag; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; import ru.betterend.registry.EndBlockEntities; import ru.betterend.rituals.InfusionRitual; public class InfusionPedestalEntity extends PedestalBlockEntity { private InfusionRitual linkedRitual; - + public InfusionPedestalEntity() { super(EndBlockEntities.INFUSION_PEDESTAL); } - + @Override - public void setLocation(World world, BlockPos pos) { + public void setLocation(Level world, BlockPos pos) { super.setLocation(world, pos); if (hasRitual()) { linkedRitual.setLocation(world, pos); } } - + public void linkRitual(InfusionRitual ritual) { linkedRitual = ritual; } - + public InfusionRitual getRitual() { return linkedRitual; } - + public boolean hasRitual() { return linkedRitual != null; } - + @Override public void tick() { if (hasRitual()) { diff --git a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java index 7bea10ec..01ffeab2 100644 --- a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java @@ -1,12 +1,12 @@ package ru.betterend.blocks.entities; import net.fabricmc.fabric.api.block.entity.BlockEntityClientSerializable; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.entity.player.PlayerEntity; import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; +import net.minecraft.world.item.ItemStack; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.Tickable; import ru.betterend.blocks.basis.PedestalBlock; @@ -15,22 +15,22 @@ import ru.betterend.registry.EndItems; public class PedestalBlockEntity extends BlockEntity implements Inventory, Tickable, BlockEntityClientSerializable { private ItemStack activeItem = ItemStack.EMPTY; - + private final int maxAge = 314; private int age; - + public PedestalBlockEntity() { super(EndBlockEntities.PEDESTAL); } - + public PedestalBlockEntity(BlockEntityType type) { super(type); } - + public int getAge() { return age; } - + public int getMaxAge() { return maxAge; } @@ -54,7 +54,7 @@ public class PedestalBlockEntity extends BlockEntity implements Inventory, Ticka public ItemStack removeStack(int slot, int amount) { return removeStack(slot); } - + @Override public boolean isValid(int slot, ItemStack stack) { return isEmpty(); @@ -78,10 +78,10 @@ public class PedestalBlockEntity extends BlockEntity implements Inventory, Ticka activeItem = stack; markDirty(); } - + @Override public void markDirty() { - if (world != null && !world.isClient) { + if (world != null && !world.isClientSide) { BlockState state = world.getBlockState(pos); if (state.getBlock() instanceof PedestalBlock) { BlockState trueState = state.with(PedestalBlock.HAS_ITEM, !isEmpty()); @@ -90,18 +90,17 @@ public class PedestalBlockEntity extends BlockEntity implements Inventory, Ticka } else { trueState = trueState.with(PedestalBlock.HAS_LIGHT, false); } - world.setBlockState(pos, trueState); + world.setBlockAndUpdate(pos, trueState); } } super.markDirty(); } - @Override public boolean canPlayerUse(PlayerEntity player) { return true; } - + @Override public void fromTag(BlockState state, CompoundTag tag) { super.fromTag(state, tag); diff --git a/src/main/java/ru/betterend/blocks/entities/render/EndChestBlockEntityRenderer.java b/src/main/java/ru/betterend/blocks/entities/render/EndChestBlockEntityRenderer.java index 2fdfed01..f63fba5f 100644 --- a/src/main/java/ru/betterend/blocks/entities/render/EndChestBlockEntityRenderer.java +++ b/src/main/java/ru/betterend/blocks/entities/render/EndChestBlockEntityRenderer.java @@ -6,15 +6,15 @@ import com.google.common.collect.Maps; import it.unimi.dsi.fastutil.floats.Float2FloatFunction; import it.unimi.dsi.fastutil.ints.Int2IntFunction; -import net.minecraft.block.AbstractChestBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.ChestBlock; -import net.minecraft.block.DoubleBlockProperties; -import net.minecraft.block.DoubleBlockProperties.PropertySource; -import net.minecraft.block.entity.ChestBlockEntity; -import net.minecraft.block.enums.ChestType; +import net.minecraft.world.level.block.AbstractChestBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.ChestBlock; +import net.minecraft.world.level.block.DoubleBlockProperties; +import net.minecraft.world.level.block.DoubleBlockProperties.PropertySource; +import net.minecraft.world.level.block.entity.ChestBlockEntity; +import net.minecraft.world.level.block.enums.ChestType; import net.minecraft.client.block.ChestAnimationProgress; import net.minecraft.client.model.ModelPart; import net.minecraft.client.render.RenderLayer; @@ -25,11 +25,11 @@ import net.minecraft.client.render.block.entity.BlockEntityRenderer; import net.minecraft.client.render.block.entity.LightmapCoordinatesRetriever; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.Vector3f; -import net.minecraft.item.BlockItem; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.Direction; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.World; +import net.minecraft.world.item.BlockItem; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; +import net.minecraft.world.level.Level; import ru.betterend.BetterEnd; import ru.betterend.blocks.basis.EndChestBlock; import ru.betterend.blocks.entities.EChestBlockEntity; @@ -85,11 +85,15 @@ public class EndChestBlockEntityRenderer extends BlockEntityRenderer abstractChestBlock = (AbstractChestBlock) block; @@ -108,19 +112,23 @@ public class EndChestBlockEntityRenderer extends BlockEntityRenderer { if (item instanceof BlockItem) { Block block = ((BlockItem) item).getBlock(); if (block instanceof EndChestBlock) { - String name = Registry.BLOCK.getId(block).getPath(); + String name = Registry.BLOCK.getKey(block).getPath(); LAYERS.put(block, new RenderLayer[] { - RenderLayer.getEntityCutout(BetterEnd.makeID("textures/entity/chest/" + name + ".png")), - RenderLayer.getEntityCutout(BetterEnd.makeID("textures/entity/chest/" + name + "_left.png")), - RenderLayer.getEntityCutout(BetterEnd.makeID("textures/entity/chest/" + name + "_right.png")) - }); + RenderLayer.getEntityCutout(BetterEnd.makeID("textures/entity/chest/" + name + ".png")), + RenderLayer + .getEntityCutout(BetterEnd.makeID("textures/entity/chest/" + name + "_left.png")), + RenderLayer.getEntityCutout( + BetterEnd.makeID("textures/entity/chest/" + name + "_right.png")) }); } } }); diff --git a/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java b/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java index 10507336..39d3e087 100644 --- a/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java +++ b/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java @@ -5,10 +5,10 @@ import java.util.List; import com.google.common.collect.Maps; -import net.minecraft.block.AbstractSignBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.SignBlock; +import net.minecraft.world.level.block.AbstractSignBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.SignBlock; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.TexturedRenderLayers; @@ -22,11 +22,11 @@ import net.minecraft.client.texture.NativeImage; import net.minecraft.client.util.SpriteIdentifier; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.Vector3f; -import net.minecraft.item.BlockItem; +import net.minecraft.world.item.BlockItem; import net.minecraft.text.OrderedText; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.SignType; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; import ru.betterend.BetterEnd; import ru.betterend.blocks.basis.EndSignBlock; import ru.betterend.blocks.entities.ESignBlockEntity; @@ -47,7 +47,7 @@ public class EndSignBlockEntityRenderer extends BlockEntityRenderer { if (item instanceof BlockItem) { Block block = ((BlockItem) item).getBlock(); if (block instanceof EndSignBlock) { - String name = Registry.BLOCK.getId(block).getPath(); - RenderLayer layer = RenderLayer.getEntitySolid(BetterEnd.makeID("textures/entity/sign/" + name + ".png")); + String name = Registry.BLOCK.getKey(block).getPath(); + RenderLayer layer = RenderLayer + .getEntitySolid(BetterEnd.makeID("textures/entity/sign/" + name + ".png")); LAYERS.put(block, layer); } } }); } - } diff --git a/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java b/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java index 5d390e4e..16168716 100644 --- a/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java +++ b/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java @@ -2,7 +2,7 @@ package ru.betterend.blocks.entities.render; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.block.BlockState; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher; @@ -11,11 +11,11 @@ import net.minecraft.client.render.model.BakedModel; import net.minecraft.client.render.model.json.ModelTransformation; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.Vector3f; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.World; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.util.Mth; +import net.minecraft.world.level.Level; import ru.betterend.blocks.EternalPedestal; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.entities.PedestalBlockEntity; @@ -27,21 +27,23 @@ import ru.betterend.registry.EndItems; @Environment(EnvType.CLIENT) public class PedestalItemRenderer extends BlockEntityRenderer { - + public PedestalItemRenderer(BlockEntityRenderDispatcher dispatcher) { super(dispatcher); } @Override - public void render(T blockEntity, float tickDelta, MatrixStack matrices, - VertexConsumerProvider vertexConsumers, int light, int overlay) { + public void render(T blockEntity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, + int light, int overlay) { - World world = blockEntity.getWorld(); - if (world == null || blockEntity.isEmpty()) return; + Level world = blockEntity.getLevel(); + if (world == null || blockEntity.isEmpty()) + return; BlockState state = world.getBlockState(blockEntity.getPos()); - if (!(state.getBlock() instanceof PedestalBlock)) return; - + if (!(state.getBlock() instanceof PedestalBlock)) + return; + ItemStack activeItem = blockEntity.getStack(0); matrices.push(); @@ -57,12 +59,13 @@ public class PedestalItemRenderer extends BlockEn matrices.scale(1.25F, 1.25F, 1.25F); } int age = blockEntity.getAge(); - if (state.isOf(EndBlocks.ETERNAL_PEDESTAL) && state.get(EternalPedestal.ACTIVATED)) { + if (state.is(EndBlocks.ETERNAL_PEDESTAL) && state.getValue(EternalPedestal.ACTIVATED)) { float[] colors = EternalCrystalRenderer.colors(age); int y = blockEntity.getPos().getY(); - - BeamRenderer.renderLightBeam(matrices, vertexConsumers, age, tickDelta, -y, 1024 - y, colors, 0.25F, 0.13F, 0.16F); - float altitude = MathHelper.sin((blockEntity.getAge() + tickDelta) / 10.0F) * 0.1F + 0.1F; + + BeamRenderer.renderLightBeam(matrices, vertexConsumers, age, tickDelta, -y, 1024 - y, colors, 0.25F, 0.13F, + 0.16F); + float altitude = Mth.sin((blockEntity.getAge() + tickDelta) / 10.0F) * 0.1F + 0.1F; matrices.translate(0.0D, altitude, 0.0D); } if (activeItem.getItem() == Items.END_CRYSTAL) { @@ -72,7 +75,8 @@ public class PedestalItemRenderer extends BlockEn } else { float rotation = (age + tickDelta) / 25.0F + 6.0F; matrices.multiply(Vector3f.POSITIVE_Y.getRadialQuaternion(rotation)); - minecraft.getItemRenderer().renderItem(activeItem, ModelTransformation.Mode.GROUND, false, matrices, vertexConsumers, light, overlay, model); + minecraft.getItemRenderer().renderItem(activeItem, ModelTransformation.Mode.GROUND, false, matrices, + vertexConsumers, light, overlay, model); } matrices.pop(); } diff --git a/src/main/java/ru/betterend/client/BetterEndClient.java b/src/main/java/ru/betterend/client/BetterEndClient.java index e9e2881f..bdf5c88c 100644 --- a/src/main/java/ru/betterend/client/BetterEndClient.java +++ b/src/main/java/ru/betterend/client/BetterEndClient.java @@ -3,7 +3,7 @@ package ru.betterend.client; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; import net.minecraft.client.render.RenderLayer; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; import ru.betterend.BetterEnd; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; @@ -24,7 +24,7 @@ public class BetterEndClient implements ClientModInitializer { EndEntitiesRenders.register(); EndModelProviders.register(); ClientOptions.init(); - + if (BetterEnd.isDevEnvironment()) { TranslationHelper.printMissingNames(); } diff --git a/src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java b/src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java index bc394dba..8351c782 100644 --- a/src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java +++ b/src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java @@ -7,7 +7,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.block.BlockState; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.client.gui.DrawableHelper; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ScreenTexts; diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java index 3339920f..5786893f 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java @@ -12,10 +12,10 @@ import net.minecraft.client.gui.DrawableHelper; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.recipebook.BlastFurnaceRecipeBookScreen; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.recipe.Ingredient; -import net.minecraft.recipe.Recipe; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.Recipe; import net.minecraft.screen.slot.Slot; import net.minecraft.util.collection.DefaultedList; import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; @@ -27,12 +27,12 @@ public class EndStoneSmelterRecipeBookScreen extends BlastFurnaceRecipeBookScree private Slot fuelSlot; private Item currentItem; private float frameTime; - + @Override protected Set getAllowedFuels() { return EndStoneSmelterBlockEntity.availableFuels().keySet(); } - + @Override public void slotClicked(Slot slot) { super.slotClicked(slot); @@ -40,7 +40,7 @@ public class EndStoneSmelterRecipeBookScreen extends BlastFurnaceRecipeBookScree this.fuelSlot = null; } } - + @Override public void showGhostRecipe(Recipe recipe, List slots) { this.ghostSlots.reset(); @@ -49,7 +49,7 @@ public class EndStoneSmelterRecipeBookScreen extends BlastFurnaceRecipeBookScree this.ghostSlots.addSlot(Ingredient.ofStacks(result), (slots.get(3)).x, (slots.get(3)).y); DefaultedList inputs = recipe.getPreviewInputs(); Iterator iterator = inputs.iterator(); - for(int i = 0; i < 2; i++) { + for (int i = 0; i < 2; i++) { if (!iterator.hasNext()) { return; } @@ -67,7 +67,7 @@ public class EndStoneSmelterRecipeBookScreen extends BlastFurnaceRecipeBookScree this.fuelIterator = this.fuels.iterator(); this.currentItem = null; } - + @Override public void drawGhostSlots(MatrixStack matrices, int x, int y, boolean bl, float f) { this.ghostSlots.draw(matrices, client, x, y, bl, f); @@ -79,7 +79,8 @@ public class EndStoneSmelterRecipeBookScreen extends BlastFurnaceRecipeBookScree int slotX = this.fuelSlot.x + x; int slotY = this.fuelSlot.y + y; DrawableHelper.fill(matrices, slotX, slotY, slotX + 16, slotY + 16, 822018048); - this.client.getItemRenderer().renderInGuiWithOverrides(client.player, this.getItem().getDefaultStack(), slotX, slotY); + this.client.getItemRenderer().renderInGuiWithOverrides(client.player, this.getItem().getDefaultStack(), + slotX, slotY); RenderSystem.depthFunc(516); DrawableHelper.fill(matrices, slotX, slotY, slotX + 16, slotY + 16, 822083583); RenderSystem.depthFunc(515); diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java index 8c81c7ff..8831c3ef 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java @@ -9,40 +9,42 @@ import net.minecraft.client.gui.screen.recipebook.RecipeBookProvider; import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget; import net.minecraft.client.gui.widget.TexturedButtonWidget; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.world.entity.player.PlayerInventory; import net.minecraft.screen.slot.Slot; import net.minecraft.screen.slot.SlotActionType; import net.minecraft.text.StringVisitable; import net.minecraft.text.Text; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; @Environment(EnvType.CLIENT) public class EndStoneSmelterScreen extends HandledScreen implements RecipeBookProvider { - private final static Identifier RECIPE_BUTTON_TEXTURE = new Identifier("textures/gui/recipe_button.png"); - private final static Identifier BACKGROUND_TEXTURE = BetterEnd.makeID("textures/gui/smelter_gui.png"); - + private final static ResourceLocation RECIPE_BUTTON_TEXTURE = new ResourceLocation( + "textures/gui/recipe_button.png"); + private final static ResourceLocation BACKGROUND_TEXTURE = BetterEnd.makeID("textures/gui/smelter_gui.png"); + public final EndStoneSmelterRecipeBookScreen recipeBook; private boolean narrow; - + public EndStoneSmelterScreen(EndStoneSmelterScreenHandler handler, PlayerInventory inventory, Text title) { super(handler, inventory, title); this.recipeBook = new EndStoneSmelterRecipeBookScreen(); } - + public void init() { super.init(); this.narrow = this.width < 379; this.recipeBook.initialize(width, height, client, narrow, handler); this.x = this.recipeBook.findLeftEdge(narrow, width, backgroundWidth); - this.addButton(new TexturedButtonWidget(x + 20, height / 2 - 49, 20, 18, 0, 0, 19, RECIPE_BUTTON_TEXTURE, (buttonWidget) -> { - this.recipeBook.reset(narrow); - this.recipeBook.toggleOpen(); - this.x = this.recipeBook.findLeftEdge(narrow, width, backgroundWidth); - ((TexturedButtonWidget) buttonWidget).setPos(this.x + 20, height / 2 - 49); - })); - this.titleX = (this.backgroundWidth - this.textRenderer.getWidth((StringVisitable)this.title)) / 2; + this.addButton(new TexturedButtonWidget(x + 20, height / 2 - 49, 20, 18, 0, 0, 19, RECIPE_BUTTON_TEXTURE, + (buttonWidget) -> { + this.recipeBook.reset(narrow); + this.recipeBook.toggleOpen(); + this.x = this.recipeBook.findLeftEdge(narrow, width, backgroundWidth); + ((TexturedButtonWidget) buttonWidget).setPos(this.x + 20, height / 2 - 49); + })); + this.titleX = (this.backgroundWidth - this.textRenderer.getWidth((StringVisitable) this.title)) / 2; } @Override @@ -84,13 +86,16 @@ public class EndStoneSmelterScreen extends HandledScreen= (left + backgroundWidth) || mouseY >= (top + backgroundHeight); - return this.recipeBook.isClickOutsideBounds(mouseX, mouseY, x, y, backgroundWidth, backgroundHeight, button) && isMouseOut; + boolean isMouseOut = mouseX < left || mouseY < top || mouseX >= (left + backgroundWidth) + || mouseY >= (top + backgroundHeight); + return this.recipeBook.isClickOutsideBounds(mouseX, mouseY, x, y, backgroundWidth, backgroundHeight, button) + && isMouseOut; } @Override diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java index f8a00502..d9e084f8 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java @@ -3,21 +3,21 @@ package ru.betterend.client.gui; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.screenhandler.v1.ScreenHandlerRegistry; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.PlayerInventory; import net.minecraft.inventory.Inventory; import net.minecraft.inventory.SimpleInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.recipe.Recipe; -import net.minecraft.recipe.RecipeFinder; -import net.minecraft.recipe.RecipeInputProvider; -import net.minecraft.recipe.book.RecipeBookCategory; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeFinder; +import net.minecraft.world.item.crafting.RecipeInputProvider; +import net.minecraft.world.item.crafting.book.RecipeBookCategory; import net.minecraft.screen.AbstractRecipeScreenHandler; import net.minecraft.screen.ArrayPropertyDelegate; import net.minecraft.screen.PropertyDelegate; import net.minecraft.screen.ScreenHandlerType; import net.minecraft.screen.slot.Slot; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; import ru.betterend.BetterEnd; import ru.betterend.blocks.EndStoneSmelter; import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; @@ -27,39 +27,40 @@ import ru.betterend.recipe.builders.AlloyingRecipe; public class EndStoneSmelterScreenHandler extends AbstractRecipeScreenHandler { - public final static ScreenHandlerType HANDLER_TYPE = ScreenHandlerRegistry.registerSimple( - BetterEnd.makeID(EndStoneSmelter.ID), EndStoneSmelterScreenHandler::new); - + public final static ScreenHandlerType HANDLER_TYPE = ScreenHandlerRegistry + .registerSimple(BetterEnd.makeID(EndStoneSmelter.ID), EndStoneSmelterScreenHandler::new); + private final Inventory inventory; private final PropertyDelegate propertyDelegate; - protected final World world; - + protected final Level world; + public EndStoneSmelterScreenHandler(int syncId, PlayerInventory playerInventory) { this(syncId, playerInventory, new SimpleInventory(4), new ArrayPropertyDelegate(4)); } - - public EndStoneSmelterScreenHandler(int syncId, PlayerInventory playerInventory, Inventory inventory, PropertyDelegate propertyDelegate) { + + public EndStoneSmelterScreenHandler(int syncId, PlayerInventory playerInventory, Inventory inventory, + PropertyDelegate propertyDelegate) { super(HANDLER_TYPE, syncId); this.inventory = inventory; this.propertyDelegate = propertyDelegate; this.world = playerInventory.player.world; - + this.addProperties(propertyDelegate); this.addSlot(new Slot(inventory, 0, 45, 17)); this.addSlot(new Slot(inventory, 1, 67, 17)); this.addSlot(new SmelterFuelSlot(this, inventory, 2, 56, 53)); this.addSlot(new SmelterOutputSlot(playerInventory.player, inventory, 3, 129, 35)); - for(int i = 0; i < 3; ++i) { - for(int j = 0; j < 9; ++j) { + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { this.addSlot(new Slot(playerInventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); } } - for(int i = 0; i < 9; ++i) { + for (int i = 0; i < 9; ++i) { this.addSlot(new Slot(playerInventory, i, 8 + i * 18, 142)); } } - + @Override public ScreenHandlerType getType() { return HANDLER_TYPE; @@ -113,13 +114,14 @@ public class EndStoneSmelterScreenHandler extends AbstractRecipeScreenHandler keyFactory; - - public IdConfig(String group, BiFunction keyFactory) { + + protected final BiFunction keyFactory; + + public IdConfig(String group, BiFunction keyFactory) { super(group); this.keyFactory = keyFactory; } @Override - protected void registerEntries() {} + protected void registerEntries() { + } - protected ConfigKey createKey(Identifier id, String key) { + protected ConfigKey createKey(ResourceLocation id, String key) { return this.keyFactory.apply(id, key); } @Nullable - public > E getEntry(Identifier id, String key, Class type) { + public > E getEntry(ResourceLocation id, String key, Class type) { return this.getEntry(createKey(id, key), type); } @Nullable - public > T getDefault(Identifier id, String key, Class type) { + public > T getDefault(ResourceLocation id, String key, Class type) { return this.getDefault(createKey(id, key), type); } - public String getString(Identifier id, String key, String defaultValue) { + public String getString(ResourceLocation id, String key, String defaultValue) { return this.getString(createKey(id, key), defaultValue); } - public String getString(Identifier id, String key) { + public String getString(ResourceLocation id, String key) { return this.getString(createKey(id, key)); } - public boolean setString(Identifier id, String key, String value) { + public boolean setString(ResourceLocation id, String key, String value) { return this.setString(createKey(id, key), value); } - public int getInt(Identifier id, String key, int defaultValue) { + public int getInt(ResourceLocation id, String key, int defaultValue) { return this.getInt(createKey(id, key), defaultValue); } - public int getInt(Identifier id, String key) { + public int getInt(ResourceLocation id, String key) { return this.getInt(createKey(id, key)); } - public boolean setInt(Identifier id, String key, int value) { + public boolean setInt(ResourceLocation id, String key, int value) { return this.setInt(createKey(id, key), value); } - public boolean setRangedInt(Identifier id, String key, int value) { + public boolean setRangedInt(ResourceLocation id, String key, int value) { return this.setRanged(createKey(id, key), value, IntegerRange.class); } - - public boolean setRangedFloat(Identifier id, String key, float value) { + + public boolean setRangedFloat(ResourceLocation id, String key, float value) { return this.setRanged(createKey(id, key), value, FloatRange.class); } - public float getFloat(Identifier id, String key, float defaultValue) { + public float getFloat(ResourceLocation id, String key, float defaultValue) { return this.getFloat(createKey(id, key), defaultValue); } - public float getFloat(Identifier id, String key) { + public float getFloat(ResourceLocation id, String key) { return this.getFloat(createKey(id, key)); } - public boolean setFloat(Identifier id, String key, float value) { + public boolean setFloat(ResourceLocation id, String key, float value) { return this.setFloat(createKey(id, key), value); } - public boolean getBoolean(Identifier id, String key, boolean defaultValue) { + public boolean getBoolean(ResourceLocation id, String key, boolean defaultValue) { return this.getBoolean(createKey(id, key), defaultValue); } - public boolean getBoolean(Identifier id, String key) { + public boolean getBoolean(ResourceLocation id, String key) { return this.getBoolean(createKey(id, key)); } - public boolean setBoolean(Identifier id, String key, boolean value) { + public boolean setBoolean(ResourceLocation id, String key, boolean value) { return this.setBoolean(createKey(id, key), value); } } diff --git a/src/main/java/ru/betterend/effects/EndEnchantments.java b/src/main/java/ru/betterend/effects/EndEnchantments.java index 08474c88..dd801a02 100644 --- a/src/main/java/ru/betterend/effects/EndEnchantments.java +++ b/src/main/java/ru/betterend/effects/EndEnchantments.java @@ -1,16 +1,17 @@ package ru.betterend.effects; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.core.Registry; import ru.betterend.BetterEnd; import ru.betterend.effects.enchantment.EndVeilEnchantment; public class EndEnchantments { public final static Enchantment END_VEIL = registerEnchantment("end_veil", new EndVeilEnchantment()); - + public static Enchantment registerEnchantment(String name, Enchantment enchantment) { return Registry.register(Registry.ENCHANTMENT, BetterEnd.makeID(name), enchantment); } - - public static void register() {} + + public static void register() { + } } diff --git a/src/main/java/ru/betterend/effects/EndPotions.java b/src/main/java/ru/betterend/effects/EndPotions.java index 521ff92a..2f2d683b 100644 --- a/src/main/java/ru/betterend/effects/EndPotions.java +++ b/src/main/java/ru/betterend/effects/EndPotions.java @@ -1,11 +1,11 @@ package ru.betterend.effects; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.item.Items; +import net.minecraft.world.entity.effect.StatusEffect; +import net.minecraft.world.entity.effect.StatusEffectInstance; +import net.minecraft.world.item.Items; import net.minecraft.potion.Potion; import net.minecraft.potion.Potions; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; import ru.betterend.BetterEnd; import ru.betterend.mixin.common.BrewingAccessor; import ru.betterend.registry.EndBlocks; @@ -14,15 +14,16 @@ import ru.betterend.registry.EndItems; public class EndPotions { public final static Potion END_VEIL = registerPotion("end_veil", EndStatusEffects.END_VEIL, 3600); public final static Potion LONG_END_VEIL = registerPotion("long_end_veil", EndStatusEffects.END_VEIL, 9600); - + public static Potion registerPotion(String name, StatusEffect effect, int duration) { - return registerPotion(name, new Potion(name, new StatusEffectInstance[]{ new StatusEffectInstance(effect, duration) })); + return registerPotion(name, + new Potion(name, new StatusEffectInstance[] { new StatusEffectInstance(effect, duration) })); } - + public static Potion registerPotion(String name, Potion potion) { return Registry.register(Registry.POTION, BetterEnd.makeID(name), potion); } - + public static void register() { BrewingAccessor.callRegisterPotionRecipe(Potions.AWKWARD, EndItems.ENDER_DUST, END_VEIL); BrewingAccessor.callRegisterPotionRecipe(END_VEIL, Items.REDSTONE, LONG_END_VEIL); diff --git a/src/main/java/ru/betterend/effects/EndStatusEffects.java b/src/main/java/ru/betterend/effects/EndStatusEffects.java index 50e049ff..a485814b 100644 --- a/src/main/java/ru/betterend/effects/EndStatusEffects.java +++ b/src/main/java/ru/betterend/effects/EndStatusEffects.java @@ -1,14 +1,14 @@ package ru.betterend.effects; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.entity.effect.StatusEffect; +import net.minecraft.core.Registry; import ru.betterend.BetterEnd; import ru.betterend.effects.status.EndVeilEffect; public class EndStatusEffects { - + public final static StatusEffect END_VEIL = registerEffect("end_veil", new EndVeilEffect()); - + public static StatusEffect registerEffect(String name, E effect) { return Registry.register(Registry.STATUS_EFFECT, BetterEnd.makeID(name), effect); } diff --git a/src/main/java/ru/betterend/effects/enchantment/EndVeilEnchantment.java b/src/main/java/ru/betterend/effects/enchantment/EndVeilEnchantment.java index bdf29bb4..991cdd38 100644 --- a/src/main/java/ru/betterend/effects/enchantment/EndVeilEnchantment.java +++ b/src/main/java/ru/betterend/effects/enchantment/EndVeilEnchantment.java @@ -1,15 +1,15 @@ package ru.betterend.effects.enchantment; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnchantmentTarget; -import net.minecraft.entity.EquipmentSlot; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentTarget; +import net.minecraft.world.entity.EquipmentSlot; public class EndVeilEnchantment extends Enchantment { public EndVeilEnchantment() { super(Enchantment.Rarity.VERY_RARE, EnchantmentTarget.ARMOR_HEAD, new EquipmentSlot[] { EquipmentSlot.HEAD }); } - + @Override public boolean isAvailableForRandomSelection() { return false; diff --git a/src/main/java/ru/betterend/effects/status/EndVeilEffect.java b/src/main/java/ru/betterend/effects/status/EndVeilEffect.java index 98e2d8ee..f0cc5079 100644 --- a/src/main/java/ru/betterend/effects/status/EndVeilEffect.java +++ b/src/main/java/ru/betterend/effects/status/EndVeilEffect.java @@ -1,14 +1,14 @@ package ru.betterend.effects.status; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.entity.effect.StatusEffectType; +import net.minecraft.world.entity.effect.StatusEffect; +import net.minecraft.world.entity.effect.StatusEffectType; public class EndVeilEffect extends StatusEffect { public EndVeilEffect() { super(StatusEffectType.BENEFICIAL, 0x0D554A); } - + @Override public boolean canApplyUpdateEffect(int duration, int amplifier) { return false; diff --git a/src/main/java/ru/betterend/entity/CubozoaEntity.java b/src/main/java/ru/betterend/entity/CubozoaEntity.java index 65a20bb9..d13c8919 100644 --- a/src/main/java/ru/betterend/entity/CubozoaEntity.java +++ b/src/main/java/ru/betterend/entity/CubozoaEntity.java @@ -3,52 +3,55 @@ package ru.betterend.entity; import java.util.List; import java.util.Random; -import net.minecraft.entity.EntityData; -import net.minecraft.entity.EntityDimensions; -import net.minecraft.entity.EntityPose; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.ItemEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.SpawnReason; -import net.minecraft.entity.ai.control.MoveControl; -import net.minecraft.entity.attribute.DefaultAttributeContainer; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.data.DataTracker; -import net.minecraft.entity.data.TrackedData; -import net.minecraft.entity.data.TrackedDataHandlerRegistry; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.entity.passive.SchoolingFishEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; +import net.minecraft.world.entity.EntityData; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.EntityPose; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.ItemEntity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.SpawnReason; +import net.minecraft.world.entity.ai.control.MoveControl; +import net.minecraft.world.entity.attribute.DefaultAttributeContainer; +import net.minecraft.world.entity.attribute.EntityAttributes; +import net.minecraft.world.entity.damage.DamageSource; +import net.minecraft.world.entity.data.DataTracker; +import net.minecraft.world.entity.data.TrackedData; +import net.minecraft.world.entity.data.TrackedDataHandlerRegistry; +import net.minecraft.world.entity.effect.StatusEffectInstance; +import net.minecraft.world.entity.effect.StatusEffects; +import net.minecraft.world.entity.passive.SchoolingFishEntity; +import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.packet.s2c.play.GameStateChangeS2CPacket; -import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.sound.SoundEvent; -import net.minecraft.sound.SoundEvents; -import net.minecraft.tag.FluidTags; -import net.minecraft.util.math.BlockPos; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.tags.FluidTags; +import net.minecraft.core.BlockPos; import net.minecraft.util.math.Box; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; import net.minecraft.world.LocalDifficulty; import net.minecraft.world.ServerWorldAccess; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndItems; public class CubozoaEntity extends SchoolingFishEntity { public static final int VARIANTS = 2; - private static final TrackedData VARIANT = DataTracker.registerData(CubozoaEntity.class, TrackedDataHandlerRegistry.BYTE); - private static final TrackedData SCALE = DataTracker.registerData(CubozoaEntity.class, TrackedDataHandlerRegistry.BYTE); + private static final TrackedData VARIANT = DataTracker.registerData(CubozoaEntity.class, + TrackedDataHandlerRegistry.BYTE); + private static final TrackedData SCALE = DataTracker.registerData(CubozoaEntity.class, + TrackedDataHandlerRegistry.BYTE); - public CubozoaEntity(EntityType entityType, World world) { + public CubozoaEntity(EntityType entityType, Level world) { super(entityType, world); } @Override - public EntityData initialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, EntityData entityData, CompoundTag entityTag) { + public EntityData initialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, + EntityData entityData, CompoundTag entityTag) { EntityData data = super.initialize(world, difficulty, spawnReason, entityData, entityTag); if (EndBiomes.getFromBiome(world.getBiome(getBlockPos())) == EndBiomes.SULPHUR_SPRINGS) { this.dataTracker.set(VARIANT, (byte) 1); @@ -83,10 +86,8 @@ public class CubozoaEntity extends SchoolingFishEntity { } public static DefaultAttributeContainer.Builder createMobAttributes() { - return LivingEntity.createLivingAttributes() - .add(EntityAttributes.GENERIC_MAX_HEALTH, 2.0) - .add(EntityAttributes.GENERIC_FOLLOW_RANGE, 16.0) - .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.5); + return LivingEntity.createLivingAttributes().add(EntityAttributes.GENERIC_MAX_HEALTH, 2.0) + .add(EntityAttributes.GENERIC_FOLLOW_RANGE, 16.0).add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.5); } public int getVariant() { @@ -97,7 +98,8 @@ public class CubozoaEntity extends SchoolingFishEntity { return this.dataTracker.get(SCALE) / 32F + 0.75F; } - public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { + public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, + BlockPos pos, Random random) { Box box = new Box(pos).expand(16); List list = world.getEntitiesByClass(CubozoaEntity.class, box, (entity) -> { return true; @@ -108,7 +110,7 @@ public class CubozoaEntity extends SchoolingFishEntity { protected float getActiveEyeHeight(EntityPose pose, EntityDimensions dimensions) { return dimensions.height * 0.5F; } - + @Override protected void dropLoot(DamageSource source, boolean causedByPlayer) { int count = random.nextInt(3); @@ -127,12 +129,13 @@ public class CubozoaEntity extends SchoolingFishEntity { protected SoundEvent getFlopSound() { return SoundEvents.ENTITY_SALMON_FLOP; } - + @Override public void onPlayerCollision(PlayerEntity player) { - if (player instanceof ServerPlayerEntity && player.damage(DamageSource.mob(this), 0.5F)) { + if (player instanceof ServerPlayer && player.damage(DamageSource.mob(this), 0.5F)) { if (!this.isSilent()) { - ((ServerPlayerEntity) player).networkHandler.sendPacket(new GameStateChangeS2CPacket(GameStateChangeS2CPacket.PUFFERFISH_STING, 0.0F)); + ((ServerPlayer) player).networkHandler + .sendPacket(new GameStateChangeS2CPacket(GameStateChangeS2CPacket.PUFFERFISH_STING, 0.0F)); } if (random.nextBoolean()) { player.addStatusEffect(new StatusEffectInstance(StatusEffects.POISON, 20, 0)); @@ -152,23 +155,23 @@ public class CubozoaEntity extends SchoolingFishEntity { if (this.state == MoveControl.State.MOVE_TO && !this.entity.getNavigation().isIdle()) { float f = (float) (this.speed * this.entity.getAttributeValue(EntityAttributes.GENERIC_MOVEMENT_SPEED)); - this.entity.setMovementSpeed(MathHelper.lerp(0.125F, this.entity.getMovementSpeed(), f)); + this.entity.setMovementSpeed(Mth.lerp(0.125F, this.entity.getMovementSpeed(), f)); double d = this.targetX - this.entity.getX(); double e = this.targetY - this.entity.getY(); double g = this.targetZ - this.entity.getZ(); if (e != 0.0D) { - double h = (double) MathHelper.sqrt(d * d + e * e + g * g); - this.entity.setVelocity(this.entity.getVelocity().add(0.0D, (double) this.entity.getMovementSpeed() * (e / h) * 0.1D, 0.0D)); + double h = (double) Mth.sqrt(d * d + e * e + g * g); + this.entity.setVelocity(this.entity.getVelocity().add(0.0D, + (double) this.entity.getMovementSpeed() * (e / h) * 0.1D, 0.0D)); } if (d != 0.0D || g != 0.0D) { - float i = (float) (MathHelper.atan2(g, d) * 57.2957763671875D) - 90.0F; + float i = (float) (Mth.atan2(g, d) * 57.2957763671875D) - 90.0F; this.entity.yaw = this.changeAngle(this.entity.yaw, i, 90.0F); this.entity.bodyYaw = this.entity.yaw; } - } - else { + } else { this.entity.setMovementSpeed(0.0F); } } diff --git a/src/main/java/ru/betterend/entity/DragonflyEntity.java b/src/main/java/ru/betterend/entity/DragonflyEntity.java index 2cafb340..9394834b 100644 --- a/src/main/java/ru/betterend/entity/DragonflyEntity.java +++ b/src/main/java/ru/betterend/entity/DragonflyEntity.java @@ -3,34 +3,34 @@ package ru.betterend.entity; import java.util.EnumSet; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.Flutterer; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.SpawnReason; -import net.minecraft.entity.ai.TargetFinder; -import net.minecraft.entity.ai.control.FlightMoveControl; -import net.minecraft.entity.ai.control.LookControl; -import net.minecraft.entity.ai.goal.AnimalMateGoal; -import net.minecraft.entity.ai.goal.FollowParentGoal; -import net.minecraft.entity.ai.goal.Goal; -import net.minecraft.entity.ai.goal.SwimGoal; -import net.minecraft.entity.ai.pathing.BirdNavigation; -import net.minecraft.entity.ai.pathing.EntityNavigation; -import net.minecraft.entity.ai.pathing.Path; -import net.minecraft.entity.ai.pathing.PathNodeType; -import net.minecraft.entity.attribute.DefaultAttributeContainer; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.entity.mob.MobEntity; -import net.minecraft.entity.passive.AnimalEntity; -import net.minecraft.entity.passive.PassiveEntity; -import net.minecraft.server.world.ServerWorld; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Flutterer; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.SpawnReason; +import net.minecraft.world.entity.ai.TargetFinder; +import net.minecraft.world.entity.ai.control.FlightMoveControl; +import net.minecraft.world.entity.ai.control.LookControl; +import net.minecraft.world.entity.ai.goal.AnimalMateGoal; +import net.minecraft.world.entity.ai.goal.FollowParentGoal; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.entity.ai.goal.SwimGoal; +import net.minecraft.world.entity.ai.pathing.BirdNavigation; +import net.minecraft.world.entity.ai.pathing.EntityNavigation; +import net.minecraft.world.entity.ai.pathing.Path; +import net.minecraft.world.entity.ai.pathing.PathNodeType; +import net.minecraft.world.entity.attribute.DefaultAttributeContainer; +import net.minecraft.world.entity.attribute.EntityAttributes; +import net.minecraft.world.entity.mob.MobEntity; +import net.minecraft.world.entity.passive.AnimalEntity; +import net.minecraft.world.entity.passive.PassiveEntity; +import net.minecraft.server.level.ServerLevel; import net.minecraft.sound.SoundEvent; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.Heightmap.Type; import net.minecraft.world.ServerWorldAccess; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; import net.minecraft.world.WorldView; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndSounds; @@ -38,7 +38,7 @@ import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; public class DragonflyEntity extends AnimalEntity implements Flutterer { - public DragonflyEntity(EntityType entityType, World world) { + public DragonflyEntity(EntityType entityType, Level world) { super(entityType, world); this.moveControl = new FlightMoveControl(this, 20, true); this.lookControl = new DragonflyLookControl(this); @@ -48,15 +48,13 @@ public class DragonflyEntity extends AnimalEntity implements Flutterer { } public static DefaultAttributeContainer.Builder createMobAttributes() { - return LivingEntity.createLivingAttributes() - .add(EntityAttributes.GENERIC_MAX_HEALTH, 8.0D) - .add(EntityAttributes.GENERIC_FOLLOW_RANGE, 16.0D) - .add(EntityAttributes.GENERIC_FLYING_SPEED, 1.0D) + return LivingEntity.createLivingAttributes().add(EntityAttributes.GENERIC_MAX_HEALTH, 8.0D) + .add(EntityAttributes.GENERIC_FOLLOW_RANGE, 16.0D).add(EntityAttributes.GENERIC_FLYING_SPEED, 1.0D) .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.1D); } @Override - protected EntityNavigation createNavigation(World world) { + protected EntityNavigation createNavigation(Level world) { BirdNavigation birdNavigation = new BirdNavigation(this, world) { public boolean isValidPosition(BlockPos pos) { BlockState state = this.world.getBlockState(pos); @@ -153,8 +151,8 @@ public class DragonflyEntity extends AnimalEntity implements Flutterer { if (path != null) { DragonflyEntity.this.navigation.startMovingAlong(path, 1.0D); } + } catch (Exception e) { } - catch (Exception e) {} } super.start(); } @@ -188,11 +186,12 @@ public class DragonflyEntity extends AnimalEntity implements Flutterer { } @Override - public PassiveEntity createChild(ServerWorld world, PassiveEntity entity) { + public PassiveEntity createChild(ServerLevel world, PassiveEntity entity) { return EndEntities.DRAGONFLY.create(world); } - - public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { + + public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, + BlockPos pos, Random random) { int y = world.getChunk(pos).sampleHeightmap(Type.WORLD_SURFACE, pos.getX() & 15, pos.getY() & 15); return y > 0 && pos.getY() >= y; } diff --git a/src/main/java/ru/betterend/entity/EndFishEntity.java b/src/main/java/ru/betterend/entity/EndFishEntity.java index 4b633a4d..5292ac81 100644 --- a/src/main/java/ru/betterend/entity/EndFishEntity.java +++ b/src/main/java/ru/betterend/entity/EndFishEntity.java @@ -3,29 +3,29 @@ package ru.betterend.entity; import java.util.List; import java.util.Random; -import net.minecraft.block.Blocks; -import net.minecraft.entity.EntityData; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.ItemEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.SpawnReason; -import net.minecraft.entity.attribute.DefaultAttributeContainer; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.data.DataTracker; -import net.minecraft.entity.data.TrackedData; -import net.minecraft.entity.data.TrackedDataHandlerRegistry; -import net.minecraft.entity.passive.SchoolingFishEntity; -import net.minecraft.item.ItemStack; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.entity.EntityData; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.ItemEntity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.SpawnReason; +import net.minecraft.world.entity.attribute.DefaultAttributeContainer; +import net.minecraft.world.entity.attribute.EntityAttributes; +import net.minecraft.world.entity.damage.DamageSource; +import net.minecraft.world.entity.data.DataTracker; +import net.minecraft.world.entity.data.TrackedData; +import net.minecraft.world.entity.data.TrackedDataHandlerRegistry; +import net.minecraft.world.entity.passive.SchoolingFishEntity; +import net.minecraft.world.item.ItemStack; import net.minecraft.nbt.CompoundTag; -import net.minecraft.particle.ParticleTypes; +import net.minecraft.core.particles.ParticleTypes; import net.minecraft.sound.SoundEvent; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.math.BlockPos; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.core.BlockPos; import net.minecraft.util.math.Box; import net.minecraft.world.LocalDifficulty; import net.minecraft.world.ServerWorldAccess; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndItems; @@ -33,15 +33,18 @@ public class EndFishEntity extends SchoolingFishEntity { public static final int VARIANTS_NORMAL = 5; public static final int VARIANTS_SULPHUR = 3; public static final int VARIANTS = VARIANTS_NORMAL + VARIANTS_SULPHUR; - private static final TrackedData VARIANT = DataTracker.registerData(EndFishEntity.class, TrackedDataHandlerRegistry.BYTE); - private static final TrackedData SCALE = DataTracker.registerData(EndFishEntity.class, TrackedDataHandlerRegistry.BYTE); - - public EndFishEntity(EntityType entityType, World world) { + private static final TrackedData VARIANT = DataTracker.registerData(EndFishEntity.class, + TrackedDataHandlerRegistry.BYTE); + private static final TrackedData SCALE = DataTracker.registerData(EndFishEntity.class, + TrackedDataHandlerRegistry.BYTE); + + public EndFishEntity(EntityType entityType, Level world) { super(entityType, world); } - + @Override - public EntityData initialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, EntityData entityData, CompoundTag entityTag) { + public EntityData initialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, + EntityData entityData, CompoundTag entityTag) { EntityData data = super.initialize(world, difficulty, spawnReason, entityData, entityTag); if (EndBiomes.getFromBiome(world.getBiome(getBlockPos())) == EndBiomes.SULPHUR_SPRINGS) { this.dataTracker.set(VARIANT, (byte) (random.nextInt(VARIANTS_SULPHUR) + VARIANTS_NORMAL)); @@ -49,14 +52,14 @@ public class EndFishEntity extends SchoolingFishEntity { this.calculateDimensions(); return data; } - + @Override protected void initDataTracker() { super.initDataTracker(); this.dataTracker.startTracking(VARIANT, (byte) this.getRandom().nextInt(VARIANTS_NORMAL)); this.dataTracker.startTracking(SCALE, (byte) this.getRandom().nextInt(16)); } - + @Override public void writeCustomDataToTag(CompoundTag tag) { super.writeCustomDataToTag(tag); @@ -99,39 +102,40 @@ public class EndFishEntity extends SchoolingFishEntity { protected SoundEvent getHurtSound(DamageSource source) { return SoundEvents.ENTITY_SALMON_HURT; } - + @Override public void tick() { super.tick(); - if (random.nextInt(8) == 0 && getBlockState().isOf(Blocks.WATER)) { + if (random.nextInt(8) == 0 && getBlockState().is(Blocks.WATER)) { double x = getX() + random.nextGaussian() * 0.2; double y = getY() + random.nextGaussian() * 0.2; double z = getZ() + random.nextGaussian() * 0.2; world.addParticle(ParticleTypes.BUBBLE, x, y, z, 0, 0, 0); } } - + public static DefaultAttributeContainer.Builder createMobAttributes() { - return LivingEntity.createLivingAttributes() - .add(EntityAttributes.GENERIC_MAX_HEALTH, 2.0) - .add(EntityAttributes.GENERIC_FOLLOW_RANGE, 16.0) - .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.75); + return LivingEntity.createLivingAttributes().add(EntityAttributes.GENERIC_MAX_HEALTH, 2.0) + .add(EntityAttributes.GENERIC_FOLLOW_RANGE, 16.0).add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.75); } - + public int getVariant() { return (int) this.dataTracker.get(VARIANT); } - + public float getScale() { return this.dataTracker.get(SCALE) / 32F + 0.75F; } - - public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { + + public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, + BlockPos pos, Random random) { Box box = new Box(pos).expand(16); - List list = world.getEntitiesByClass(EndFishEntity.class, box, (entity) -> { return true; }); + List list = world.getEntitiesByClass(EndFishEntity.class, box, (entity) -> { + return true; + }); return list.size() < 9; } - + @Override protected void dropLoot(DamageSource source, boolean causedByPlayer) { ItemEntity drop = new ItemEntity(world, getX(), getY(), getZ(), new ItemStack(EndItems.END_FISH_RAW)); diff --git a/src/main/java/ru/betterend/entity/EndSlimeEntity.java b/src/main/java/ru/betterend/entity/EndSlimeEntity.java index b9b6118c..03264629 100644 --- a/src/main/java/ru/betterend/entity/EndSlimeEntity.java +++ b/src/main/java/ru/betterend/entity/EndSlimeEntity.java @@ -4,39 +4,39 @@ import java.util.EnumSet; import java.util.List; import java.util.Random; -import net.minecraft.block.Blocks; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.EntityData; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.ItemEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.SpawnReason; -import net.minecraft.entity.ai.control.MoveControl; -import net.minecraft.entity.ai.goal.FollowTargetGoal; -import net.minecraft.entity.ai.goal.Goal; -import net.minecraft.entity.attribute.DefaultAttributeContainer; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.data.DataTracker; -import net.minecraft.entity.data.TrackedData; -import net.minecraft.entity.data.TrackedDataHandlerRegistry; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.entity.mob.SlimeEntity; -import net.minecraft.entity.passive.IronGolemEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.entity.EntityData; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.ItemEntity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.SpawnReason; +import net.minecraft.world.entity.ai.control.MoveControl; +import net.minecraft.world.entity.ai.goal.FollowTargetGoal; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.entity.attribute.DefaultAttributeContainer; +import net.minecraft.world.entity.attribute.EntityAttributes; +import net.minecraft.world.entity.damage.DamageSource; +import net.minecraft.world.entity.data.DataTracker; +import net.minecraft.world.entity.data.TrackedData; +import net.minecraft.world.entity.data.TrackedDataHandlerRegistry; +import net.minecraft.world.entity.effect.StatusEffects; +import net.minecraft.world.entity.mob.SlimeEntity; +import net.minecraft.world.entity.passive.IronGolemEntity; +import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.nbt.CompoundTag; -import net.minecraft.particle.ParticleEffect; -import net.minecraft.particle.ParticleTypes; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleTypes; import net.minecraft.text.Text; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.util.math.Box; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; import net.minecraft.world.LocalDifficulty; import net.minecraft.world.ServerWorldAccess; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; import net.minecraft.world.biome.Biome; import ru.betterend.interfaces.ISlime; import ru.betterend.registry.EndBiomes; @@ -45,44 +45,43 @@ import ru.betterend.util.MHelper; import ru.betterend.world.biome.EndBiome; public class EndSlimeEntity extends SlimeEntity { - private static final TrackedData VARIANT = DataTracker.registerData(EndSlimeEntity.class, TrackedDataHandlerRegistry.BYTE); - private static final Mutable POS = new Mutable(); - - public EndSlimeEntity(EntityType entityType, World world) { + private static final TrackedData VARIANT = DataTracker.registerData(EndSlimeEntity.class, + TrackedDataHandlerRegistry.BYTE); + private static final MutableBlockPos POS = new MutableBlockPos(); + + public EndSlimeEntity(EntityType entityType, Level world) { super(entityType, world); this.moveControl = new EndSlimeMoveControl(this); } - + protected void initGoals() { this.goalSelector.add(1, new SwimmingGoal()); this.goalSelector.add(2, new FaceTowardTargetGoal()); this.goalSelector.add(3, new RandomLookGoal()); this.goalSelector.add(5, new MoveGoal()); - this.targetSelector.add(1, new FollowTargetGoal(this, PlayerEntity.class, 10, true, false, (livingEntity) -> { - return Math.abs(livingEntity.getY() - this.getY()) <= 4.0D; - })); + this.targetSelector.add(1, + new FollowTargetGoal(this, PlayerEntity.class, 10, true, false, (livingEntity) -> { + return Math.abs(livingEntity.getY() - this.getY()) <= 4.0D; + })); this.targetSelector.add(3, new FollowTargetGoal(this, IronGolemEntity.class, true)); } - + public static DefaultAttributeContainer.Builder createMobAttributes() { - return LivingEntity.createLivingAttributes() - .add(EntityAttributes.GENERIC_MAX_HEALTH, 1.0D) - .add(EntityAttributes.GENERIC_ATTACK_DAMAGE, 1.0D) - .add(EntityAttributes.GENERIC_FOLLOW_RANGE, 16.0D) + return LivingEntity.createLivingAttributes().add(EntityAttributes.GENERIC_MAX_HEALTH, 1.0D) + .add(EntityAttributes.GENERIC_ATTACK_DAMAGE, 1.0D).add(EntityAttributes.GENERIC_FOLLOW_RANGE, 16.0D) .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.15D); } - + @Override - public EntityData initialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, EntityData entityData, CompoundTag entityTag) { + public EntityData initialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, + EntityData entityData, CompoundTag entityTag) { EntityData data = super.initialize(world, difficulty, spawnReason, entityData, entityTag); EndBiome biome = EndBiomes.getFromBiome(world.getBiome(getBlockPos())); if (biome == EndBiomes.FOGGY_MUSHROOMLAND) { this.setMossy(); - } - else if (biome == EndBiomes.MEGALAKE || biome == EndBiomes.MEGALAKE_GROVE) { + } else if (biome == EndBiomes.MEGALAKE || biome == EndBiomes.MEGALAKE_GROVE) { this.setLake(); - } - else if (biome == EndBiomes.AMBER_LAND) { + } else if (biome == EndBiomes.AMBER_LAND) { this.setAmber(true); } this.calculateDimensions(); @@ -94,7 +93,7 @@ public class EndSlimeEntity extends SlimeEntity { super.initDataTracker(); this.dataTracker.startTracking(VARIANT, (byte) 0); } - + @Override public void writeCustomDataToTag(CompoundTag tag) { super.writeCustomDataToTag(tag); @@ -110,21 +109,21 @@ public class EndSlimeEntity extends SlimeEntity { } @Override - protected ParticleEffect getParticles() { + protected ParticleOptions getParticles() { return ParticleTypes.PORTAL; } - + @Override public void remove() { int i = this.getSize(); - if (!this.world.isClient && i > 1 && this.isDead()) { + if (!this.world.isClientSide && i > 1 && this.isDead()) { Text text = this.getCustomName(); boolean bl = this.isAiDisabled(); float f = (float) i / 4.0F; int j = i / 2; int k = 2 + this.random.nextInt(3); int type = this.getSlimeType(); - + for (int l = 0; l < k; ++l) { float g = ((float) (l % 2) - 0.5F) * f; float h = ((float) (l / 2) - 0.5F) * f; @@ -139,13 +138,14 @@ public class EndSlimeEntity extends SlimeEntity { slimeEntity.setInvulnerable(this.isInvulnerable()); ((ISlime) slimeEntity).beSetSlimeSize(j, true); slimeEntity.calculateDimensions(); - slimeEntity.refreshPositionAndAngles(this.getX() + (double) g, this.getY() + 0.5D, this.getZ() + (double) h, this.random.nextFloat() * 360.0F, 0.0F); + slimeEntity.refreshPositionAndAngles(this.getX() + (double) g, this.getY() + 0.5D, + this.getZ() + (double) h, this.random.nextFloat() * 360.0F, 0.0F); this.world.spawnEntity(slimeEntity); } } this.removed = true; } - + @Override protected void dropLoot(DamageSource source, boolean causedByPlayer) { int maxCount = this.getSize(); @@ -161,15 +161,15 @@ public class EndSlimeEntity extends SlimeEntity { ItemEntity drop = new ItemEntity(world, getX(), getY(), getZ(), new ItemStack(Items.SLIME_BALL, count)); this.world.spawnEntity(drop); } - + public int getSlimeType() { return this.dataTracker.get(VARIANT).intValue(); } - + public void setSlimeType(int value) { this.dataTracker.set(VARIANT, (byte) value); } - + protected void setMossy() { setSlimeType(1); } @@ -177,7 +177,7 @@ public class EndSlimeEntity extends SlimeEntity { public boolean isMossy() { return getSlimeType() == 1; } - + protected void setLake() { setSlimeType(2); } @@ -185,7 +185,7 @@ public class EndSlimeEntity extends SlimeEntity { public boolean isLake() { return getSlimeType() == 2; } - + protected void setAmber(boolean mossy) { this.dataTracker.set(VARIANT, (byte) 3); } @@ -193,26 +193,30 @@ public class EndSlimeEntity extends SlimeEntity { public boolean isAmber() { return this.dataTracker.get(VARIANT) == 3; } - + public boolean isChorus() { return this.dataTracker.get(VARIANT) == 0; } - - public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { - return random.nextInt(16) == 0 || isPermanentBiome(world, pos) || (notManyEntities(world, pos, 32, 3) && isWaterNear(world, pos, 32, 8)); + + public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, + BlockPos pos, Random random) { + return random.nextInt(16) == 0 || isPermanentBiome(world, pos) + || (notManyEntities(world, pos, 32, 3) && isWaterNear(world, pos, 32, 8)); } - + private static boolean isPermanentBiome(ServerWorldAccess world, BlockPos pos) { Biome biome = world.getBiome(pos); return EndBiomes.getFromBiome(biome) == EndBiomes.CHORUS_FOREST; } - + private static boolean notManyEntities(ServerWorldAccess world, BlockPos pos, int radius, int maxCount) { Box box = new Box(pos).expand(radius); - List list = world.getEntitiesByClass(EndSlimeEntity.class, box, (entity) -> { return true; }); + List list = world.getEntitiesByClass(EndSlimeEntity.class, box, (entity) -> { + return true; + }); return list.size() <= maxCount; } - + private static boolean isWaterNear(ServerWorldAccess world, BlockPos pos, int radius, int radius2) { for (int x = pos.getX() - radius; x <= pos.getX() + radius; x++) { POS.setX(x); @@ -228,7 +232,7 @@ public class EndSlimeEntity extends SlimeEntity { } return false; } - + class MoveGoal extends Goal { public MoveGoal() { this.setControls(EnumSet.of(Goal.Control.JUMP, Goal.Control.MOVE)); @@ -238,17 +242,17 @@ public class EndSlimeEntity extends SlimeEntity { if (EndSlimeEntity.this.hasVehicle()) { return false; } - + float yaw = EndSlimeEntity.this.getHeadYaw(); float speed = EndSlimeEntity.this.getMovementSpeed(); if (speed > 0.1) { - float dx = MathHelper.sin(-yaw * 0.017453292F); - float dz = MathHelper.cos(-yaw * 0.017453292F); + float dx = Mth.sin(-yaw * 0.017453292F); + float dz = Mth.cos(-yaw * 0.017453292F); BlockPos pos = EndSlimeEntity.this.getBlockPos().add(dx * speed * 4, 0, dz * speed * 4); int down = BlocksHelper.downRay(EndSlimeEntity.this.world, pos, 16); return down < 5; } - + return true; } @@ -264,8 +268,7 @@ public class EndSlimeEntity extends SlimeEntity { } public boolean canStart() { - return (EndSlimeEntity.this.isTouchingWater() - || EndSlimeEntity.this.isInLava()) + return (EndSlimeEntity.this.isTouchingWater() || EndSlimeEntity.this.isInLava()) && EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl; } @@ -288,8 +291,7 @@ public class EndSlimeEntity extends SlimeEntity { public boolean canStart() { return EndSlimeEntity.this.getTarget() == null - && (EndSlimeEntity.this.onGround - || EndSlimeEntity.this.isTouchingWater() + && (EndSlimeEntity.this.onGround || EndSlimeEntity.this.isTouchingWater() || EndSlimeEntity.this.isInLava() || EndSlimeEntity.this.hasStatusEffect(StatusEffects.LEVITATION)) && EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl; @@ -316,12 +318,12 @@ public class EndSlimeEntity extends SlimeEntity { LivingEntity livingEntity = EndSlimeEntity.this.getTarget(); if (livingEntity == null) { return false; - } - else if (!livingEntity.isAlive()) { + } else if (!livingEntity.isAlive()) { return false; - } - else { - return livingEntity instanceof PlayerEntity && ((PlayerEntity) livingEntity).abilities.invulnerable ? false : EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl; + } else { + return livingEntity instanceof PlayerEntity && ((PlayerEntity) livingEntity).abilities.invulnerable + ? false + : EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl; } } @@ -334,21 +336,19 @@ public class EndSlimeEntity extends SlimeEntity { LivingEntity livingEntity = EndSlimeEntity.this.getTarget(); if (livingEntity == null) { return false; - } - else if (!livingEntity.isAlive()) { + } else if (!livingEntity.isAlive()) { return false; - } - else if (livingEntity instanceof PlayerEntity && ((PlayerEntity) livingEntity).abilities.invulnerable) { + } else if (livingEntity instanceof PlayerEntity && ((PlayerEntity) livingEntity).abilities.invulnerable) { return false; - } - else { + } else { return --this.ticksLeft > 0; } } public void tick() { EndSlimeEntity.this.lookAtEntity(EndSlimeEntity.this.getTarget(), 10.0F, 10.0F); - ((EndSlimeMoveControl) EndSlimeEntity.this.getMoveControl()).look(EndSlimeEntity.this.yaw, EndSlimeEntity.this.canAttack()); + ((EndSlimeMoveControl) EndSlimeEntity.this.getMoveControl()).look(EndSlimeEntity.this.yaw, + EndSlimeEntity.this.canAttack()); } } @@ -378,11 +378,11 @@ public class EndSlimeEntity extends SlimeEntity { this.entity.bodyYaw = this.entity.yaw; if (this.state != MoveControl.State.MOVE_TO) { this.entity.setForwardSpeed(0.0F); - } - else { + } else { this.state = MoveControl.State.WAIT; if (this.entity.isOnGround()) { - this.entity.setMovementSpeed((float) (this.speed * this.entity.getAttributeValue(EntityAttributes.GENERIC_MOVEMENT_SPEED))); + this.entity.setMovementSpeed((float) (this.speed + * this.entity.getAttributeValue(EntityAttributes.GENERIC_MOVEMENT_SPEED))); if (this.ticksUntilJump-- <= 0) { this.ticksUntilJump = EndSlimeEntity.this.getTicksUntilNextJump(); if (this.jumpOften) { @@ -391,17 +391,17 @@ public class EndSlimeEntity extends SlimeEntity { EndSlimeEntity.this.getJumpControl().setActive(); if (EndSlimeEntity.this.makesJumpSound()) { - EndSlimeEntity.this.playSound(EndSlimeEntity.this.getJumpSound(), EndSlimeEntity.this.getSoundVolume(), getJumpSoundPitch()); + EndSlimeEntity.this.playSound(EndSlimeEntity.this.getJumpSound(), + EndSlimeEntity.this.getSoundVolume(), getJumpSoundPitch()); } - } - else { + } else { EndSlimeEntity.this.sidewaysSpeed = 0.0F; EndSlimeEntity.this.forwardSpeed = 0.0F; this.entity.setMovementSpeed(0.0F); } - } - else { - this.entity.setMovementSpeed((float) (this.speed * this.entity.getAttributeValue(EntityAttributes.GENERIC_MOVEMENT_SPEED))); + } else { + this.entity.setMovementSpeed((float) (this.speed + * this.entity.getAttributeValue(EntityAttributes.GENERIC_MOVEMENT_SPEED))); } } @@ -409,7 +409,8 @@ public class EndSlimeEntity extends SlimeEntity { private float getJumpSoundPitch() { float f = EndSlimeEntity.this.isSmall() ? 1.4F : 0.8F; - return ((EndSlimeEntity.this.random.nextFloat() - EndSlimeEntity.this.random.nextFloat()) * 0.2F + 1.0F) * f; + return ((EndSlimeEntity.this.random.nextFloat() - EndSlimeEntity.this.random.nextFloat()) * 0.2F + 1.0F) + * f; } } } diff --git a/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java b/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java index d4108e07..20b2c335 100644 --- a/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java +++ b/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java @@ -3,37 +3,37 @@ package ru.betterend.entity; import java.util.List; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.SpawnReason; -import net.minecraft.entity.ai.goal.FollowTargetGoal; -import net.minecraft.entity.ai.goal.LookAroundGoal; -import net.minecraft.entity.ai.goal.LookAtEntityGoal; -import net.minecraft.entity.ai.goal.MeleeAttackGoal; -import net.minecraft.entity.ai.goal.WanderAroundFarGoal; -import net.minecraft.entity.attribute.DefaultAttributeContainer; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.entity.mob.HostileEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.particle.ParticleTypes; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.SpawnReason; +import net.minecraft.world.entity.ai.goal.FollowTargetGoal; +import net.minecraft.world.entity.ai.goal.LookAroundGoal; +import net.minecraft.world.entity.ai.goal.LookAtEntityGoal; +import net.minecraft.world.entity.ai.goal.MeleeAttackGoal; +import net.minecraft.world.entity.ai.goal.WanderAroundFarGoal; +import net.minecraft.world.entity.attribute.DefaultAttributeContainer; +import net.minecraft.world.entity.attribute.EntityAttributes; +import net.minecraft.world.entity.damage.DamageSource; +import net.minecraft.world.entity.effect.StatusEffectInstance; +import net.minecraft.world.entity.effect.StatusEffects; +import net.minecraft.world.entity.mob.HostileEntity; +import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.core.particles.ParticleTypes; import net.minecraft.sound.SoundEvent; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.util.math.Box; import net.minecraft.world.ServerWorldAccess; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; import ru.betterend.registry.EndSounds; import ru.betterend.util.MHelper; public class ShadowWalkerEntity extends HostileEntity { - public ShadowWalkerEntity(EntityType entityType, World world) { + public ShadowWalkerEntity(EntityType entityType, Level world) { super(entityType, world); } - + @Override protected void initGoals() { this.goalSelector.add(2, new AttackGoal(this, 1.0D, false)); @@ -44,34 +44,22 @@ public class ShadowWalkerEntity extends HostileEntity { } public static DefaultAttributeContainer.Builder createMobAttributes() { - return HostileEntity.createHostileAttributes() - .add(EntityAttributes.GENERIC_FOLLOW_RANGE, 35.0) - .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.15) - .add(EntityAttributes.GENERIC_ATTACK_DAMAGE, 4.5) - .add(EntityAttributes.GENERIC_ARMOR, 2.0) - .add(EntityAttributes.ZOMBIE_SPAWN_REINFORCEMENTS); + return HostileEntity.createHostileAttributes().add(EntityAttributes.GENERIC_FOLLOW_RANGE, 35.0) + .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.15).add(EntityAttributes.GENERIC_ATTACK_DAMAGE, 4.5) + .add(EntityAttributes.GENERIC_ARMOR, 2.0).add(EntityAttributes.ZOMBIE_SPAWN_REINFORCEMENTS); } - + @Override public void tick() { super.tick(); - world.addParticle(ParticleTypes.ASH, - getX() + random.nextGaussian() * 0.2, - getY() + random.nextGaussian() * 0.5 + 1, - getZ() + random.nextGaussian() * 0.2, - 0, 0, 0); - world.addParticle(ParticleTypes.SMOKE, - getX() + random.nextGaussian() * 0.2, - getY() + random.nextGaussian() * 0.5 + 1, - getZ() + random.nextGaussian() * 0.2, - 0, 0, 0); - world.addParticle(ParticleTypes.ENTITY_EFFECT, - getX() + random.nextGaussian() * 0.2, - getY() + random.nextGaussian() * 0.5 + 1, - getZ() + random.nextGaussian() * 0.2, - 0, 0, 0); + world.addParticle(ParticleTypes.ASH, getX() + random.nextGaussian() * 0.2, + getY() + random.nextGaussian() * 0.5 + 1, getZ() + random.nextGaussian() * 0.2, 0, 0, 0); + world.addParticle(ParticleTypes.SMOKE, getX() + random.nextGaussian() * 0.2, + getY() + random.nextGaussian() * 0.5 + 1, getZ() + random.nextGaussian() * 0.2, 0, 0, 0); + world.addParticle(ParticleTypes.ENTITY_EFFECT, getX() + random.nextGaussian() * 0.2, + getY() + random.nextGaussian() * 0.5 + 1, getZ() + random.nextGaussian() * 0.2, 0, 0, 0); } - + @Override protected SoundEvent getAmbientSound() { return EndSounds.ENTITY_SHADOW_WALKER; @@ -88,18 +76,19 @@ public class ShadowWalkerEntity extends HostileEntity { } @Override - protected void playStepSound(BlockPos pos, BlockState state) {} - + protected void playStepSound(BlockPos pos, BlockState state) { + } + @Override protected float getSoundVolume() { return MHelper.randRange(0.25F, 0.5F, random); } - + @Override protected float getSoundPitch() { return MHelper.randRange(0.75F, 1.25F, random); } - + @Override public boolean tryAttack(Entity target) { boolean attack = super.tryAttack(target); @@ -111,24 +100,27 @@ public class ShadowWalkerEntity extends HostileEntity { } return attack; } - - public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { + + public static boolean canSpawn(EntityType type, ServerWorldAccess world, + SpawnReason spawnReason, BlockPos pos, Random random) { if (HostileEntity.canSpawnInDark(type, world, spawnReason, pos, random)) { Box box = new Box(pos).expand(16); - List entities = world.getEntitiesByClass(ShadowWalkerEntity.class, box, (entity) -> { return true; }); + List entities = world.getEntitiesByClass(ShadowWalkerEntity.class, box, (entity) -> { + return true; + }); return entities.size() < 6; } return false; } - + private final class AttackGoal extends MeleeAttackGoal { private final ShadowWalkerEntity walker; private int ticks; public AttackGoal(ShadowWalkerEntity walker, double speed, boolean pauseWhenMobIdle) { - super(walker, speed, pauseWhenMobIdle); - this.walker = walker; - } + super(walker, speed, pauseWhenMobIdle); + this.walker = walker; + } public void start() { super.start(); @@ -145,8 +137,7 @@ public class ShadowWalkerEntity extends HostileEntity { ++this.ticks; if (this.ticks >= 5 && this.method_28348() < this.method_28349() / 2) { this.walker.setAttacking(true); - } - else { + } else { this.walker.setAttacking(false); } } diff --git a/src/main/java/ru/betterend/entity/SilkMothEntity.java b/src/main/java/ru/betterend/entity/SilkMothEntity.java index 8329821e..e5494757 100644 --- a/src/main/java/ru/betterend/entity/SilkMothEntity.java +++ b/src/main/java/ru/betterend/entity/SilkMothEntity.java @@ -6,45 +6,45 @@ import java.util.Random; import org.jetbrains.annotations.Nullable; -import net.minecraft.block.BlockState; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.Flutterer; -import net.minecraft.entity.ItemEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.SpawnReason; -import net.minecraft.entity.ai.TargetFinder; -import net.minecraft.entity.ai.control.FlightMoveControl; -import net.minecraft.entity.ai.control.LookControl; -import net.minecraft.entity.ai.goal.AnimalMateGoal; -import net.minecraft.entity.ai.goal.FollowParentGoal; -import net.minecraft.entity.ai.goal.Goal; -import net.minecraft.entity.ai.goal.SwimGoal; -import net.minecraft.entity.ai.pathing.BirdNavigation; -import net.minecraft.entity.ai.pathing.EntityNavigation; -import net.minecraft.entity.ai.pathing.PathNodeType; -import net.minecraft.entity.attribute.DefaultAttributeContainer; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.mob.MobEntity; -import net.minecraft.entity.passive.AnimalEntity; -import net.minecraft.entity.passive.PassiveEntity; -import net.minecraft.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Flutterer; +import net.minecraft.world.entity.ItemEntity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.SpawnReason; +import net.minecraft.world.entity.ai.TargetFinder; +import net.minecraft.world.entity.ai.control.FlightMoveControl; +import net.minecraft.world.entity.ai.control.LookControl; +import net.minecraft.world.entity.ai.goal.AnimalMateGoal; +import net.minecraft.world.entity.ai.goal.FollowParentGoal; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.entity.ai.goal.SwimGoal; +import net.minecraft.world.entity.ai.pathing.BirdNavigation; +import net.minecraft.world.entity.ai.pathing.EntityNavigation; +import net.minecraft.world.entity.ai.pathing.PathNodeType; +import net.minecraft.world.entity.attribute.DefaultAttributeContainer; +import net.minecraft.world.entity.attribute.EntityAttributes; +import net.minecraft.world.entity.damage.DamageSource; +import net.minecraft.world.entity.mob.MobEntity; +import net.minecraft.world.entity.passive.AnimalEntity; +import net.minecraft.world.entity.passive.PassiveEntity; +import net.minecraft.world.item.ItemStack; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtHelper; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; +import net.minecraft.sounds.SoundEvents; import net.minecraft.state.property.Properties; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.BlockPos; import net.minecraft.util.math.Box; import net.minecraft.util.math.Vec3d; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.Heightmap.Type; import net.minecraft.world.ServerWorldAccess; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; import ru.betterend.BetterEnd; import ru.betterend.blocks.BlockProperties; import ru.betterend.registry.EndBlocks; @@ -56,9 +56,9 @@ import ru.betterend.util.MHelper; public class SilkMothEntity extends AnimalEntity implements Flutterer { private BlockPos hivePos; private BlockPos entrance; - private World hiveWorld; - - public SilkMothEntity(EntityType entityType, World world) { + private Level hiveWorld; + + public SilkMothEntity(EntityType entityType, Level world) { super(entityType, world); this.moveControl = new FlightMoveControl(this, 20, true); this.lookControl = new MothLookControl(this); @@ -66,38 +66,35 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { this.setPathfindingPenalty(PathNodeType.DANGER_FIRE, -1.0F); this.experiencePoints = 1; } - + public static DefaultAttributeContainer.Builder createMobAttributes() { - return LivingEntity.createLivingAttributes() - .add(EntityAttributes.GENERIC_MAX_HEALTH, 2.0D) - .add(EntityAttributes.GENERIC_FOLLOW_RANGE, 16.0D) - .add(EntityAttributes.GENERIC_FLYING_SPEED, 0.4D) + return LivingEntity.createLivingAttributes().add(EntityAttributes.GENERIC_MAX_HEALTH, 2.0D) + .add(EntityAttributes.GENERIC_FOLLOW_RANGE, 16.0D).add(EntityAttributes.GENERIC_FLYING_SPEED, 0.4D) .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.1D); } - - public void setHive(World world, BlockPos hive) { + + public void setHive(Level world, BlockPos hive) { this.hivePos = hive; this.hiveWorld = world; } - + @Override public void writeCustomDataToTag(CompoundTag tag) { if (hivePos != null) { tag.put("HivePos", NbtHelper.fromBlockPos(hivePos)); - tag.putString("HiveWorld", hiveWorld.getRegistryKey().getValue().toString()); + tag.putString("HiveWorld", hiveWorld.dimension().location().toString()); } } - + @Override public void readCustomDataFromTag(CompoundTag tag) { if (tag.contains("HivePos")) { hivePos = NbtHelper.toBlockPos(tag.getCompound("HivePos")); - Identifier worldID = new Identifier(tag.getString("HiveWorld")); + ResourceLocation worldID = new ResourceLocation(tag.getString("HiveWorld")); try { - hiveWorld = world.getServer().getWorld(RegistryKey.of(Registry.DIMENSION, worldID)); - } - catch (Exception e) { - BetterEnd.LOGGER.warning("Silk Moth Hive World {} is missing!", worldID); + hiveWorld = world.getServer().getLevel(RegistryKey.of(Registry.DIMENSION, worldID)); + } catch (Exception e) { + BetterEnd.LOGGER.warning("Silk Moth Hive Level {} is missing!", worldID); hivePos = null; } } @@ -111,9 +108,9 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { this.goalSelector.add(8, new WanderAroundGoal()); this.goalSelector.add(9, new SwimGoal(this)); } - + @Override - protected EntityNavigation createNavigation(World world) { + protected EntityNavigation createNavigation(Level world) { BirdNavigation birdNavigation = new BirdNavigation(this, world) { public boolean isValidPosition(BlockPos pos) { BlockState state = this.world.getBlockState(pos); @@ -156,10 +153,10 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { } @Override - public PassiveEntity createChild(ServerWorld world, PassiveEntity entity) { + public PassiveEntity createChild(ServerLevel world, PassiveEntity entity) { return EndEntities.SILK_MOTH.create(world); } - + @Override protected void dropLoot(DamageSource source, boolean causedByPlayer) { int minCount = 0; @@ -176,18 +173,19 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { ItemEntity drop = new ItemEntity(world, getX(), getY(), getZ(), new ItemStack(EndItems.SILK_FIBER, count)); this.world.spawnEntity(drop); } - - public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { + + public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, + BlockPos pos, Random random) { int y = world.getChunk(pos).sampleHeightmap(Type.WORLD_SURFACE, pos.getX() & 15, pos.getY() & 15); return y > 0 && pos.getY() >= y && notManyEntities(world, pos, 32, 1); } - + private static boolean notManyEntities(ServerWorldAccess world, BlockPos pos, int radius, int maxCount) { Box box = new Box(pos).expand(radius); List list = world.getEntitiesByClass(SilkMothEntity.class, box, (entity) -> true); return list.size() <= maxCount; } - + class MothLookControl extends LookControl { MothLookControl(MobEntity entity) { super(entity); @@ -217,16 +215,18 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { public void start() { Vec3d vec3d = null; if (SilkMothEntity.this.hivePos != null && SilkMothEntity.this.hiveWorld == SilkMothEntity.this.world) { - if (SilkMothEntity.this.getPos().squaredDistanceTo(SilkMothEntity.this.hivePos.getX(), SilkMothEntity.this.hivePos.getY(), SilkMothEntity.this.hivePos.getZ()) > 16) { + if (SilkMothEntity.this.getPos().squaredDistanceTo(SilkMothEntity.this.hivePos.getX(), + SilkMothEntity.this.hivePos.getY(), SilkMothEntity.this.hivePos.getZ()) > 16) { vec3d = SilkMothEntity.this.getPos().add(random.nextGaussian() * 2, 0, random.nextGaussian() * 2); } } vec3d = vec3d == null ? this.getRandomLocation() : vec3d; if (vec3d != null) { try { - SilkMothEntity.this.navigation.startMovingAlong(SilkMothEntity.this.navigation.findPathTo(new BlockPos(vec3d), 1), 1.0D); + SilkMothEntity.this.navigation + .startMovingAlong(SilkMothEntity.this.navigation.findPathTo(new BlockPos(vec3d), 1), 1.0D); + } catch (Exception e) { } - catch (Exception e) {} } } @@ -234,43 +234,47 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { private Vec3d getRandomLocation() { Vec3d vec3d3 = SilkMothEntity.this.getRotationVec(0.0F); Vec3d vec3d4 = TargetFinder.findAirTarget(SilkMothEntity.this, 8, 7, vec3d3, 1.5707964F, 2, 1); - return vec3d4 != null ? vec3d4 : TargetFinder.findGroundTarget(SilkMothEntity.this, 8, 4, -2, vec3d3, 1.5707963705062866D); + return vec3d4 != null ? vec3d4 + : TargetFinder.findGroundTarget(SilkMothEntity.this, 8, 4, -2, vec3d3, 1.5707963705062866D); } } - + class ReturnToHiveGoal extends Goal { ReturnToHiveGoal() { this.setControls(EnumSet.of(Goal.Control.MOVE)); } - + @Override public boolean canStart() { - return SilkMothEntity.this.hivePos != null - && SilkMothEntity.this.hiveWorld == SilkMothEntity.this.world - && SilkMothEntity.this.navigation.isIdle() - && SilkMothEntity.this.random.nextInt(16) == 0 - && SilkMothEntity.this.getPos().squaredDistanceTo(SilkMothEntity.this.hivePos.getX(), SilkMothEntity.this.hivePos.getY(), SilkMothEntity.this.hivePos.getZ()) < 64; + return SilkMothEntity.this.hivePos != null && SilkMothEntity.this.hiveWorld == SilkMothEntity.this.world + && SilkMothEntity.this.navigation.isIdle() && SilkMothEntity.this.random.nextInt(16) == 0 + && SilkMothEntity.this.getPos().squaredDistanceTo(SilkMothEntity.this.hivePos.getX(), + SilkMothEntity.this.hivePos.getY(), SilkMothEntity.this.hivePos.getZ()) < 64; } - + @Override public boolean shouldContinue() { - return SilkMothEntity.this.navigation.isFollowingPath() && world.getBlockState(entrance).isAir() && (world.getBlockState(hivePos).isOf(EndBlocks.SILK_MOTH_NEST) || world.getBlockState(hivePos).isOf(EndBlocks.SILK_MOTH_HIVE)); + return SilkMothEntity.this.navigation.isFollowingPath() && world.getBlockState(entrance).isAir() + && (world.getBlockState(hivePos).is(EndBlocks.SILK_MOTH_NEST) + || world.getBlockState(hivePos).is(EndBlocks.SILK_MOTH_HIVE)); } - + @Override public void start() { BlockState state = SilkMothEntity.this.world.getBlockState(SilkMothEntity.this.hivePos); - if (!state.isOf(EndBlocks.SILK_MOTH_NEST) && !state.isOf(EndBlocks.SILK_MOTH_HIVE)) { + if (!state.is(EndBlocks.SILK_MOTH_NEST) && !state.is(EndBlocks.SILK_MOTH_HIVE)) { SilkMothEntity.this.hivePos = null; return; } try { - SilkMothEntity.this.entrance = SilkMothEntity.this.hivePos.offset(state.get(Properties.HORIZONTAL_FACING)); - SilkMothEntity.this.navigation.startMovingAlong(SilkMothEntity.this.navigation.findPathTo(entrance, 1), 1.0D); + SilkMothEntity.this.entrance = SilkMothEntity.this.hivePos + .offset(state.getValue(Properties.HORIZONTAL_FACING)); + SilkMothEntity.this.navigation.startMovingAlong(SilkMothEntity.this.navigation.findPathTo(entrance, 1), + 1.0D); + } catch (Exception e) { } - catch (Exception e) {} } - + @Override public void tick() { super.tick(); @@ -282,20 +286,21 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { double dz = Math.abs(SilkMothEntity.this.entrance.getZ() - SilkMothEntity.this.getZ()); if (dx + dy + dz < 1) { BlockState state = SilkMothEntity.this.world.getBlockState(hivePos); - if (state.isOf(EndBlocks.SILK_MOTH_NEST) || state.isOf(EndBlocks.SILK_MOTH_HIVE)) { - int fullness = state.get(BlockProperties.FULLNESS); - boolean isHive = state.isOf(EndBlocks.SILK_MOTH_HIVE); + if (state.is(EndBlocks.SILK_MOTH_NEST) || state.is(EndBlocks.SILK_MOTH_HIVE)) { + int fullness = state.getValue(BlockProperties.FULLNESS); + boolean isHive = state.is(EndBlocks.SILK_MOTH_HIVE); if (fullness < 3 && (isHive || SilkMothEntity.this.random.nextBoolean())) { fullness += isHive ? MHelper.randRange(1, 2, random) : 1; if (fullness > 3) { fullness = 3; } - BlocksHelper.setWithUpdate(SilkMothEntity.this.hiveWorld, SilkMothEntity.this.hivePos, state.with(BlockProperties.FULLNESS, fullness)); + BlocksHelper.setWithUpdate(SilkMothEntity.this.hiveWorld, SilkMothEntity.this.hivePos, + state.with(BlockProperties.FULLNESS, fullness)); } - SilkMothEntity.this.world.playSound(null, SilkMothEntity.this.entrance, SoundEvents.BLOCK_BEEHIVE_ENTER, SoundCategory.BLOCKS, 1, 1); + SilkMothEntity.this.world.playLocalSound(null, SilkMothEntity.this.entrance, + SoundEvents.BLOCK_BEEHIVE_ENTER, SoundSource.BLOCKS, 1, 1); SilkMothEntity.this.remove(); - } - else { + } else { SilkMothEntity.this.hivePos = null; } } diff --git a/src/main/java/ru/betterend/entity/model/BlockBenchModel.java b/src/main/java/ru/betterend/entity/model/BlockBenchModel.java index f53dc212..052ade1b 100644 --- a/src/main/java/ru/betterend/entity/model/BlockBenchModel.java +++ b/src/main/java/ru/betterend/entity/model/BlockBenchModel.java @@ -5,18 +5,18 @@ import java.util.function.Function; import net.minecraft.client.model.ModelPart; import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.entity.model.EntityModel; -import net.minecraft.entity.Entity; -import net.minecraft.util.Identifier; +import net.minecraft.world.entity.Entity; +import net.minecraft.resources.ResourceLocation; public abstract class BlockBenchModel extends EntityModel { public BlockBenchModel() { super(); } - - public BlockBenchModel(Function function) { + + public BlockBenchModel(Function function) { super(function); } - + protected void setRotationAngle(ModelPart modelRenderer, float x, float y, float z) { modelRenderer.pitch = x; modelRenderer.yaw = y; diff --git a/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java b/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java index f9b7d5cd..97187ee1 100644 --- a/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java @@ -4,7 +4,7 @@ import net.minecraft.client.model.ModelPart; import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; import ru.betterend.entity.CubozoaEntity; public class CubozoaEntityModel extends BlockBenchModel { @@ -23,10 +23,10 @@ public class CubozoaEntityModel extends BlockBenchModel { public CubozoaEntityModel() { super(RenderLayer::getEntityTranslucent); - + textureWidth = 48; textureHeight = 48; - + model = new ModelPart(this); model.setPivot(0.0F, 24.0F, 0.0F); model.setTextureOffset(0, 17).addCuboid(-2.0F, -12.5F, -2.0F, 4.0F, 4.0F, 4.0F, 0.0F); @@ -40,7 +40,6 @@ public class CubozoaEntityModel extends BlockBenchModel { tentacle_center_1 = new ModelPart(this); tentacle_center_1.setPivot(0.0F, 0.0F, 0.0F); model.addChild(tentacle_center_1); - tentacle_1 = new ModelPart(this); tentacle_1.setPivot(0.0F, -7.0F, 4.5F); @@ -51,7 +50,6 @@ public class CubozoaEntityModel extends BlockBenchModel { tentacle_center_2.setPivot(0.0F, 0.0F, 0.0F); model.addChild(tentacle_center_2); setRotationAngle(tentacle_center_2, 0.0F, -1.5708F, 0.0F); - tentacle_2 = new ModelPart(this); tentacle_2.setPivot(0.0F, -7.0F, 4.5F); @@ -62,7 +60,6 @@ public class CubozoaEntityModel extends BlockBenchModel { tentacle_center_3.setPivot(0.0F, 0.0F, 0.0F); model.addChild(tentacle_center_3); setRotationAngle(tentacle_center_3, 0.0F, 3.1416F, 0.0F); - tentacle_3 = new ModelPart(this); tentacle_3.setPivot(0.0F, -7.0F, 4.5F); @@ -73,20 +70,20 @@ public class CubozoaEntityModel extends BlockBenchModel { tentacle_center_4.setPivot(0.0F, 0.0F, 0.0F); model.addChild(tentacle_center_4); setRotationAngle(tentacle_center_4, 0.0F, 1.5708F, 0.0F); - tentacle_4 = new ModelPart(this); tentacle_4.setPivot(0.0F, -7.0F, 4.5F); tentacle_center_4.addChild(tentacle_4); tentacle_4.setTextureOffset(16, 17).addCuboid(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F); } - + @Override - public void setAngles(CubozoaEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { - float sin = MathHelper.sin(animationProgress * 0.13F); + public void setAngles(CubozoaEntity entity, float limbAngle, float limbDistance, float animationProgress, + float headYaw, float headPitch) { + float sin = Mth.sin(animationProgress * 0.13F); scaleY = sin * 0.1F + 0.9F; - scaleXZ = MathHelper.sin(animationProgress * 0.13F + 3.14F) * 0.1F + 0.9F; - + scaleXZ = Mth.sin(animationProgress * 0.13F + 3.14F) * 0.1F + 0.9F; + tentacle_1.pitch = sin * 0.15F; tentacle_2.pitch = sin * 0.15F; tentacle_3.pitch = sin * 0.15F; @@ -94,7 +91,8 @@ public class CubozoaEntityModel extends BlockBenchModel { } @Override - public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { + public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, + float blue, float alpha) { matrices.push(); matrices.scale(scaleXZ, scaleY, scaleXZ); model.render(matrices, vertices, light, overlay); diff --git a/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java b/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java index c9751121..21579703 100644 --- a/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java @@ -4,7 +4,7 @@ import net.minecraft.client.model.ModelPart; import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; import ru.betterend.entity.SilkMothEntity; public class SilkMothEntityModel extends BlockBenchModel { @@ -26,7 +26,7 @@ public class SilkMothEntityModel extends BlockBenchModel { public SilkMothEntityModel() { super(RenderLayer::getEntityCutout); - + textureWidth = 64; textureHeight = 64; @@ -113,22 +113,22 @@ public class SilkMothEntityModel extends BlockBenchModel { abdomen_r1.setTextureOffset(0, 10).addCuboid(-3.0F, -4.0F, -1.0F, 4.0F, 4.0F, 7.0F, 0.0F); } - @Override - public void setAngles(SilkMothEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { - wingR_r1.roll = MathHelper.sin(animationProgress * 2F) * 0.4F + 0.3927F; + public void setAngles(SilkMothEntity entity, float limbAngle, float limbDistance, float animationProgress, + float headYaw, float headPitch) { + wingR_r1.roll = Mth.sin(animationProgress * 2F) * 0.4F + 0.3927F; wingL_r1.roll = -wingR_r1.roll; - head_pivot.pitch = MathHelper.sin(animationProgress * 0.03F) * 0.1F; - tendril_r_r1.roll = MathHelper.sin(animationProgress * 0.07F) * 0.2F + 0.3927F; + head_pivot.pitch = Mth.sin(animationProgress * 0.03F) * 0.1F; + tendril_r_r1.roll = Mth.sin(animationProgress * 0.07F) * 0.2F + 0.3927F; tendril_r_r2.roll = -tendril_r_r1.roll; - abdomen_r1.pitch = MathHelper.sin(animationProgress * 0.05F) * 0.1F - 0.3927F; - legsR.roll = MathHelper.sin(animationProgress * 0.07F) * 0.1F - 0.6545F; + abdomen_r1.pitch = Mth.sin(animationProgress * 0.05F) * 0.1F - 0.3927F; + legsR.roll = Mth.sin(animationProgress * 0.07F) * 0.1F - 0.6545F; legsL.roll = -legsR.roll; } - @Override - public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { + public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, + float blue, float alpha) { bb_main.render(matrices, vertices, light, overlay); head_pivot.render(matrices, vertices, light, overlay); legsL.render(matrices, vertices, light, overlay); diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java b/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java index cf36a3be..0bb0b984 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java @@ -8,13 +8,13 @@ import net.minecraft.client.render.entity.EntityRenderDispatcher; import net.minecraft.client.render.entity.MobEntityRenderer; import net.minecraft.client.render.entity.feature.EyesFeatureRenderer; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.entity.CubozoaEntity; import ru.betterend.entity.model.CubozoaEntityModel; public class RendererEntityCubozoa extends MobEntityRenderer { - private static final Identifier[] TEXTURE = new Identifier[2]; + private static final ResourceLocation[] TEXTURE = new ResourceLocation[2]; private static final RenderLayer[] GLOW = new RenderLayer[2]; public RendererEntityCubozoa(EntityRenderDispatcher entityRenderDispatcher) { @@ -26,11 +26,14 @@ public class RendererEntityCubozoa extends MobEntityRenderer { - private static final Identifier TEXTURE = BetterEnd.makeID("textures/entity/dragonfly.png"); - private static final RenderLayer GLOW = RenderLayer.getEyes(BetterEnd.makeID("textures/entity/dragonfly_glow.png")); - + private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/dragonfly.png"); + private static final RenderLayer GLOW = RenderLayer.getEyes(BetterEnd.makeID("textures/entity/dragonfly_glow.png")); + public RendererEntityDragonfly(EntityRenderDispatcher entityRenderDispatcher) { super(entityRenderDispatcher, new DragonflyEntityModel(), 0.5f); this.addFeature(new EyesFeatureRenderer(this) { - @Override - public RenderLayer getEyesTexture() { - return GLOW; - } + @Override + public RenderLayer getEyesTexture() { + return GLOW; + } }); } - + @Override - public Identifier getTexture(DragonflyEntity entity) { + public ResourceLocation getTexture(DragonflyEntity entity) { return TEXTURE; } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java b/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java index f5b6ff64..c96ae77d 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java @@ -8,46 +8,49 @@ import net.minecraft.client.render.entity.EntityRenderDispatcher; import net.minecraft.client.render.entity.MobEntityRenderer; import net.minecraft.client.render.entity.feature.EyesFeatureRenderer; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.entity.EndFishEntity; import ru.betterend.entity.model.EndFishEntityModel; public class RendererEntityEndFish extends MobEntityRenderer { - private static final Identifier[] TEXTURE = new Identifier[EndFishEntity.VARIANTS]; + private static final ResourceLocation[] TEXTURE = new ResourceLocation[EndFishEntity.VARIANTS]; private static final RenderLayer[] GLOW = new RenderLayer[EndFishEntity.VARIANTS]; - - public RendererEntityEndFish(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new EndFishEntityModel(), 0.5f); - this.addFeature(new EyesFeatureRenderer(this) { + + public RendererEntityEndFish(EntityRenderDispatcher entityRenderDispatcher) { + super(entityRenderDispatcher, new EndFishEntityModel(), 0.5f); + this.addFeature(new EyesFeatureRenderer(this) { @Override public RenderLayer getEyesTexture() { return GLOW[0]; } @Override - public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, EndFishEntity entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { + public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, + EndFishEntity entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, + float headYaw, float headPitch) { VertexConsumer vertexConsumer = vertexConsumers.getBuffer(GLOW[entity.getVariant()]); - this.getContextModel().render(matrices, vertexConsumer, 15728640, OverlayTexture.DEFAULT_UV, 1.0F, 1.0F, 1.0F, 1.0F); + this.getContextModel().render(matrices, vertexConsumer, 15728640, OverlayTexture.DEFAULT_UV, 1.0F, 1.0F, + 1.0F, 1.0F); } - }); - } - - @Override + }); + } + + @Override protected void scale(EndFishEntity entity, MatrixStack matrixStack, float f) { float scale = entity.getScale(); matrixStack.scale(scale, scale, scale); } - - @Override - public Identifier getTexture(EndFishEntity entity) { - return TEXTURE[entity.getVariant()]; - } - - static { - for (int i = 0; i < EndFishEntity.VARIANTS; i++) { - TEXTURE[i] = BetterEnd.makeID("textures/entity/end_fish/end_fish_" + i + ".png"); - GLOW[i] = RenderLayer.getEyes(BetterEnd.makeID("textures/entity/end_fish/end_fish_" + i + "_glow.png")); - } - } + + @Override + public ResourceLocation getTexture(EndFishEntity entity) { + return TEXTURE[entity.getVariant()]; + } + + static { + for (int i = 0; i < EndFishEntity.VARIANTS; i++) { + TEXTURE[i] = BetterEnd.makeID("textures/entity/end_fish/end_fish_" + i + ".png"); + GLOW[i] = RenderLayer.getEyes(BetterEnd.makeID("textures/entity/end_fish/end_fish_" + i + "_glow.png")); + } + } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java index 403e22b0..6075d9eb 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java @@ -11,43 +11,47 @@ import net.minecraft.client.render.entity.feature.EyesFeatureRenderer; import net.minecraft.client.render.entity.feature.FeatureRenderer; import net.minecraft.client.render.entity.feature.FeatureRendererContext; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.MathHelper; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; import ru.betterend.BetterEnd; import ru.betterend.entity.EndSlimeEntity; import ru.betterend.entity.model.EndSlimeEntityModel; public class RendererEntityEndSlime extends MobEntityRenderer> { - private static final Identifier TEXTURE[] = new Identifier[4]; + private static final ResourceLocation TEXTURE[] = new ResourceLocation[4]; private static final RenderLayer GLOW[] = new RenderLayer[4]; - - public RendererEntityEndSlime(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new EndSlimeEntityModel(false), 0.25F); - this.addFeature(new OverlayFeatureRenderer(this)); - this.addFeature(new EyesFeatureRenderer>(this) { + + public RendererEntityEndSlime(EntityRenderDispatcher entityRenderDispatcher) { + super(entityRenderDispatcher, new EndSlimeEntityModel(false), 0.25F); + this.addFeature(new OverlayFeatureRenderer(this)); + this.addFeature(new EyesFeatureRenderer>(this) { @Override public RenderLayer getEyesTexture() { return GLOW[0]; } - + @Override - public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, EndSlimeEntity entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { + public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, + EndSlimeEntity entity, float limbAngle, float limbDistance, float tickDelta, + float animationProgress, float headYaw, float headPitch) { VertexConsumer vertexConsumer = vertexConsumers.getBuffer(GLOW[entity.getSlimeType()]); - this.getContextModel().render(matrices, vertexConsumer, 15728640, OverlayTexture.DEFAULT_UV, 1.0F, 1.0F, 1.0F, 1.0F); + this.getContextModel().render(matrices, vertexConsumer, 15728640, OverlayTexture.DEFAULT_UV, 1.0F, 1.0F, + 1.0F, 1.0F); if (entity.isLake()) { this.getContextModel().renderFlower(matrices, vertexConsumer, 15728640, OverlayTexture.DEFAULT_UV); } } - }); - } + }); + } @Override - public Identifier getTexture(EndSlimeEntity entity) { + public ResourceLocation getTexture(EndSlimeEntity entity) { return TEXTURE[entity.getSlimeType()]; } @Override - public void render(EndSlimeEntity slimeEntity, float f, float g, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i) { + public void render(EndSlimeEntity slimeEntity, float f, float g, MatrixStack matrixStack, + VertexConsumerProvider vertexConsumerProvider, int i) { this.shadowRadius = 0.25F * (float) slimeEntity.getSize(); super.render(slimeEntity, f, g, matrixStack, vertexConsumerProvider, i); } @@ -57,12 +61,13 @@ public class RendererEntityEndSlime extends MobEntityRenderer extends FeatureRenderer> { + private final class OverlayFeatureRenderer + extends FeatureRenderer> { private final EndSlimeEntityModel modelOrdinal = new EndSlimeEntityModel(true); private final EndSlimeEntityModel modelLake = new EndSlimeEntityModel(true); @@ -70,27 +75,33 @@ public class RendererEntityEndSlime extends MobEntityRenderer model = livingEntity.getSlimeType() == 1 ? modelLake : modelOrdinal; this.getContextModel().copyStateTo(model); model.animateModel(livingEntity, f, g, h); model.setAngles(livingEntity, f, g, j, k, l); - VertexConsumer vertexConsumer = vertexConsumerProvider.getBuffer(RenderLayer.getEntityTranslucent(this.getTexture(livingEntity))); - model.render(matrixStack, vertexConsumer, i, LivingEntityRenderer.getOverlay(livingEntity, 0.0F), 1.0F, 1.0F, 1.0F, 1.0F); + VertexConsumer vertexConsumer = vertexConsumerProvider + .getBuffer(RenderLayer.getEntityTranslucent(this.getTexture(livingEntity))); + model.render(matrixStack, vertexConsumer, i, LivingEntityRenderer.getOverlay(livingEntity, 0.0F), 1.0F, + 1.0F, 1.0F, 1.0F); } } } - + static { TEXTURE[0] = BetterEnd.makeID("textures/entity/end_slime/end_slime.png"); TEXTURE[1] = BetterEnd.makeID("textures/entity/end_slime/end_slime_mossy.png"); diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityShadowWalker.java b/src/main/java/ru/betterend/entity/render/RendererEntityShadowWalker.java index 42ce3685..ca11514a 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityShadowWalker.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityShadowWalker.java @@ -3,19 +3,20 @@ package ru.betterend.entity.render; import net.minecraft.client.render.entity.BipedEntityRenderer; import net.minecraft.client.render.entity.EntityRenderDispatcher; import net.minecraft.client.render.entity.model.PlayerEntityModel; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.entity.ShadowWalkerEntity; -public class RendererEntityShadowWalker extends BipedEntityRenderer> { - private static final Identifier TEXTURE = BetterEnd.makeID("textures/entity/shadow_walker.png"); - +public class RendererEntityShadowWalker + extends BipedEntityRenderer> { + private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/shadow_walker.png"); + public RendererEntityShadowWalker(EntityRenderDispatcher entityRenderDispatcher) { super(entityRenderDispatcher, new PlayerEntityModel(0.0F, false), 0.5F); } @Override - public Identifier getTexture(ShadowWalkerEntity zombieEntity) { + public ResourceLocation getTexture(ShadowWalkerEntity zombieEntity) { return TEXTURE; } } diff --git a/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java b/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java index 818520d6..f6514e5d 100644 --- a/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java +++ b/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java @@ -2,20 +2,20 @@ package ru.betterend.entity.render; import net.minecraft.client.render.entity.EntityRenderDispatcher; import net.minecraft.client.render.entity.MobEntityRenderer; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.entity.SilkMothEntity; import ru.betterend.entity.model.SilkMothEntityModel; public class SilkMothEntityRenderer extends MobEntityRenderer { - private static final Identifier TEXTURE = BetterEnd.makeID("textures/entity/silk_moth.png"); - + private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/silk_moth.png"); + public SilkMothEntityRenderer(EntityRenderDispatcher entityRenderDispatcher) { super(entityRenderDispatcher, new SilkMothEntityModel(), 0.5f); } - + @Override - public Identifier getTexture(SilkMothEntity entity) { + public ResourceLocation getTexture(SilkMothEntity entity) { return TEXTURE; } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/events/PlayerAdvancementsEvents.java b/src/main/java/ru/betterend/events/PlayerAdvancementsEvents.java index 7a90891e..bfb6fcbe 100644 --- a/src/main/java/ru/betterend/events/PlayerAdvancementsEvents.java +++ b/src/main/java/ru/betterend/events/PlayerAdvancementsEvents.java @@ -2,18 +2,19 @@ package ru.betterend.events; import net.fabricmc.fabric.api.event.Event; import net.fabricmc.fabric.api.event.EventFactory; -import net.minecraft.advancement.Advancement; -import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.advancements.Advancement; +import net.minecraft.server.level.ServerPlayer; public final class PlayerAdvancementsEvents { - - public static Event PLAYER_ADVENCEMENT_COMPLETE = EventFactory.createArrayBacked(AdvancementComplete.class, callbacks -> (player, advancement, criterionName) -> { - for (AdvancementComplete event : callbacks) { - event.onAdvancementComplete(player, advancement, criterionName); - } - }); - + + public static Event PLAYER_ADVANCEMENT_COMPLETE = EventFactory + .createArrayBacked(AdvancementComplete.class, callbacks -> (player, advancement, criterionName) -> { + for (AdvancementComplete event : callbacks) { + event.onAdvancementComplete(player, advancement, criterionName); + } + }); + public interface AdvancementComplete { - void onAdvancementComplete(ServerPlayerEntity player, Advancement advancement, String criterionName); + void onAdvancementComplete(ServerPlayer player, Advancement advancement, String criterionName); } } diff --git a/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java b/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java index 09255141..158151ca 100644 --- a/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java +++ b/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java @@ -5,7 +5,7 @@ import java.util.Map; import com.google.common.collect.Maps; -import net.minecraft.item.ItemConvertible; +import net.minecraft.world.item.ItemConvertible; import ru.betterend.blocks.HydraluxPetalColoredBlock; import ru.betterend.blocks.complex.ColoredMaterial; import ru.betterend.registry.EndBlocks; @@ -18,25 +18,24 @@ public class FlamboyantRefabricatedIntegration extends ModIntegration { @Override public void register() { - /*Class fDyeColor = getClass("com.github.EltrutCo.flamboyant.items.FDyeColor"); - Object[] values = getStaticFieldValue(fDyeColor, "VALUES"); - - if (values == null) { - return; - }*/ - + /* + * Class fDyeColor = + * getClass("com.github.EltrutCo.flamboyant.items.FDyeColor"); Object[] values = + * getStaticFieldValue(fDyeColor, "VALUES"); + * + * if (values == null) { return; } + */ + Map colors = Maps.newHashMap(); Map dyes = Maps.newHashMap(); - /*for (Object val: values) { - Integer color = (Integer) getFieldValue(fDyeColor, "signColor", val); - String name = (String) getFieldValue(fDyeColor, "name", val); - if (color != null && name != null) { - colors.put(color, name); - System.out.println(name + " " + color + " " + new Color(color)); - dyes.put(color, getItem(name + "_dye")); - } - }*/ - + /* + * for (Object val: values) { Integer color = (Integer) getFieldValue(fDyeColor, + * "signColor", val); String name = (String) getFieldValue(fDyeColor, "name", + * val); if (color != null && name != null) { colors.put(color, name); + * System.out.println(name + " " + color + " " + new Color(color)); + * dyes.put(color, getItem(name + "_dye")); } } + */ + addColor("fead1d", "amber", colors, dyes); addColor("bd9a5f", "beige", colors, dyes); addColor("edeada", "cream", colors, dyes); @@ -53,15 +52,15 @@ public class FlamboyantRefabricatedIntegration extends ModIntegration { addColor("6bb1cf", "sky_blue", colors, dyes); addColor("6e8c9c", "slate_gray", colors, dyes); addColor("b02454", "violet", colors, dyes); - + new ColoredMaterial(HydraluxPetalColoredBlock::new, EndBlocks.HYDRALUX_PETAL_BLOCK, colors, dyes, true); } - + private void addColor(String hex, String name, Map colors, Map dyes) { int color = MHelper.color(hex); colors.put(color, name); dyes.put(color, getItem(name + "_dye")); - + System.out.println(name + " " + color + " " + new Color(color)); } } diff --git a/src/main/java/ru/betterend/integration/ModIntegration.java b/src/main/java/ru/betterend/integration/ModIntegration.java index 60d8f80b..0ee53e25 100644 --- a/src/main/java/ru/betterend/integration/ModIntegration.java +++ b/src/main/java/ru/betterend/integration/ModIntegration.java @@ -7,16 +7,16 @@ import java.lang.reflect.Method; import net.fabricmc.fabric.api.tag.TagRegistry; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.item.Item; -import net.minecraft.tag.BlockTags; -import net.minecraft.tag.ItemTags; -import net.minecraft.tag.Tag; -import net.minecraft.tag.Tag.Identified; -import net.minecraft.util.Identifier; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.item.Item; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.Tag; +import net.minecraft.tags.Tag.Identified; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.registry.BuiltinRegistries; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.GenerationStep; @@ -27,63 +27,65 @@ import ru.betterend.world.features.EndFeature; public abstract class ModIntegration { private final String modID; - - public void register() {} - - public void addBiomes() {} - + + public void register() { + } + + public void addBiomes() { + } + public ModIntegration(String modID) { this.modID = modID; } - - public Identifier getID(String name) { - return new Identifier(modID, name); + + public ResourceLocation getID(String name) { + return new ResourceLocation(modID, name); } - + public Block getBlock(String name) { return Registry.BLOCK.get(getID(name)); } - + public Item getItem(String name) { return Registry.ITEM.get(getID(name)); } public BlockState getDefaultState(String name) { - return getBlock(name).getDefaultState(); + return getBlock(name).defaultBlockState(); } - + public RegistryKey getKey(String name) { return RegistryKey.of(Registry.BIOME_KEY, getID(name)); } - + public boolean modIsInstalled() { return FabricLoader.getInstance().isModLoaded(modID); } - + public EndFeature getFeature(String featureID, String configuredFeatureID, GenerationStep.Feature featureStep) { Feature feature = Registry.FEATURE.get(getID(featureID)); - ConfiguredFeature featureConfigured = BuiltinRegistries.CONFIGURED_FEATURE.get(getID(configuredFeatureID)); + ConfiguredFeature featureConfigured = BuiltinRegistries.CONFIGURED_FEATURE + .get(getID(configuredFeatureID)); return new EndFeature(feature, featureConfigured, featureStep); } - + public EndFeature getFeature(String name, GenerationStep.Feature featureStep) { return getFeature(name, name, featureStep); } - + public ConfiguredFeature getConfiguredFeature(String name) { return BuiltinRegistries.CONFIGURED_FEATURE.get(getID(name)); } - + public Biome getBiome(String name) { return BuiltinRegistries.BIOME.get(getID(name)); } - + public Class getClass(String path) { Class cl = null; try { cl = Class.forName(path); - } - catch (ClassNotFoundException e) { + } catch (ClassNotFoundException e) { BetterEnd.LOGGER.error(e.getMessage()); if (BetterEnd.isDevEnvironment()) { e.printStackTrace(); @@ -91,7 +93,7 @@ public abstract class ModIntegration { } return cl; } - + @SuppressWarnings("unchecked") public T getStaticFieldValue(Class cl, String name) { if (cl != null) { @@ -100,14 +102,13 @@ public abstract class ModIntegration { if (field != null) { return (T) field.get(null); } - } - catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { + } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); } } return null; } - + public Object getFieldValue(Class cl, String name, Object classInstance) { if (cl != null) { try { @@ -115,20 +116,18 @@ public abstract class ModIntegration { if (field != null) { return field.get(classInstance); } - } - catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { + } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); } } return null; } - + public Method getMethod(Class cl, String functionName, Class... args) { if (cl != null) { try { return cl.getMethod(functionName, args); - } - catch (NoSuchMethodException | SecurityException e) { + } catch (NoSuchMethodException | SecurityException e) { BetterEnd.LOGGER.error(e.getMessage()); if (BetterEnd.isDevEnvironment()) { e.printStackTrace(); @@ -137,13 +136,12 @@ public abstract class ModIntegration { } return null; } - + public Object executeMethod(Object instance, Method method, Object... args) { if (method != null) { try { return method.invoke(instance, args); - } - catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { BetterEnd.LOGGER.error(e.getMessage()); if (BetterEnd.isDevEnvironment()) { e.printStackTrace(); @@ -152,7 +150,7 @@ public abstract class ModIntegration { } return null; } - + public Object getAndExecuteStatic(Class cl, String functionName, Object... args) { if (cl != null) { Class[] classes = new Class[args.length]; @@ -164,9 +162,10 @@ public abstract class ModIntegration { } return null; } - + @SuppressWarnings("unchecked") - public T getAndExecuteRuntime(Class cl, Object instance, String functionName, Object... args) { + public T getAndExecuteRuntime(Class cl, Object instance, String functionName, + Object... args) { if (instance != null) { Class[] classes = new Class[args.length]; for (int i = 0; i < args.length; i++) { @@ -177,15 +176,15 @@ public abstract class ModIntegration { } return null; } - + public Object newInstance(Class cl, Object... args) { if (cl != null) { - for (Constructor constructor: cl.getConstructors()) { + for (Constructor constructor : cl.getConstructors()) { if (constructor.getParameterCount() == args.length) { try { return constructor.newInstance(args); - } - catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + } catch (InstantiationException | IllegalAccessException | IllegalArgumentException + | InvocationTargetException e) { BetterEnd.LOGGER.error(e.getMessage()); if (BetterEnd.isDevEnvironment()) { e.printStackTrace(); @@ -196,15 +195,15 @@ public abstract class ModIntegration { } return null; } - + public Tag.Identified getItemTag(String name) { - Identifier id = getID(name); + ResourceLocation id = getID(name); Tag tag = ItemTags.getTagGroup().getTag(id); return tag == null ? (Identified) TagRegistry.item(id) : (Identified) tag; } - + public Tag.Identified getBlockTag(String name) { - Identifier id = getID(name); + ResourceLocation id = getID(name); Tag tag = BlockTags.getTagGroup().getTag(id); return tag == null ? (Identified) TagRegistry.block(id) : (Identified) tag; } diff --git a/src/main/java/ru/betterend/integration/NourishIntegration.java b/src/main/java/ru/betterend/integration/NourishIntegration.java index de54e081..1c4e8778 100644 --- a/src/main/java/ru/betterend/integration/NourishIntegration.java +++ b/src/main/java/ru/betterend/integration/NourishIntegration.java @@ -1,7 +1,7 @@ package ru.betterend.integration; -import net.minecraft.item.Item; -import net.minecraft.tag.Tag; +import net.minecraft.world.item.Item; +import net.minecraft.tags.Tag; import ru.betterend.registry.EndItems; import ru.betterend.util.TagHelper; @@ -16,9 +16,10 @@ public class NourishIntegration extends ModIntegration { Tag.Identified fruit = getItemTag("fruit"); Tag.Identified protein = getItemTag("protein"); Tag.Identified sweets = getItemTag("sweets"); - + TagHelper.addTag(fats, EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED); - TagHelper.addTag(fruit, EndItems.SHADOW_BERRY_RAW, EndItems.SHADOW_BERRY_COOKED, EndItems.BLOSSOM_BERRY, EndItems.SHADOW_BERRY_JELLY, EndItems.SWEET_BERRY_JELLY); + TagHelper.addTag(fruit, EndItems.SHADOW_BERRY_RAW, EndItems.SHADOW_BERRY_COOKED, EndItems.BLOSSOM_BERRY, + EndItems.SHADOW_BERRY_JELLY, EndItems.SWEET_BERRY_JELLY); TagHelper.addTag(protein, EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED); TagHelper.addTag(sweets, EndItems.SHADOW_BERRY_JELLY, EndItems.SWEET_BERRY_JELLY); } diff --git a/src/main/java/ru/betterend/integration/byg/BYGBlocks.java b/src/main/java/ru/betterend/integration/byg/BYGBlocks.java index 55844e08..3dd5635f 100644 --- a/src/main/java/ru/betterend/integration/byg/BYGBlocks.java +++ b/src/main/java/ru/betterend/integration/byg/BYGBlocks.java @@ -1,6 +1,6 @@ package ru.betterend.integration.byg; -import net.minecraft.block.Block; +import net.minecraft.world.level.block.Block; import ru.betterend.blocks.basis.EndWallPlantBlock; import ru.betterend.blocks.basis.VineBlock; import ru.betterend.registry.EndBlocks; @@ -8,8 +8,9 @@ import ru.betterend.registry.EndBlocks; public class BYGBlocks { public static final Block IVIS_MOSS = EndBlocks.registerBlock("ivis_moss", new EndWallPlantBlock()); public static final Block NIGHTSHADE_MOSS = EndBlocks.registerBlock("nightshade_moss", new EndWallPlantBlock()); - + public static final Block IVIS_VINE = EndBlocks.registerBlock("ivis_vine", new VineBlock()); - - public static void register() {} + + public static void register() { + } } diff --git a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java index ffa7d743..37dffd01 100644 --- a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java +++ b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java @@ -3,7 +3,7 @@ package ru.betterend.integration.byg; import java.util.List; import java.util.stream.Collectors; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.collection.WeightedList; import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.world.biome.Biome; @@ -32,31 +32,31 @@ public class BYGIntegration extends ModIntegration { @Override public void addBiomes() { BYGBiomes.addBiomes(); - + Class biomeClass = this.getClass("corgiaoc.byg.common.world.biome.BYGEndBiome"); List biomes = this.getStaticFieldValue(biomeClass, "BYG_END_BIOMES"); - + if (biomes != null && biomeClass != null) { biomes.forEach((obj) -> { Biome biome = this.getAndExecuteRuntime(biomeClass, obj, "getBiome"); if (biome != null) { - Identifier biomeID = BuiltinRegistries.BIOME.getId(biome); + ResourceLocation biomeID = BuiltinRegistries.BIOME.getId(biome); EndBiome endBiome = EndBiomes.getBiome(biomeID); Biome edge = this.getAndExecuteRuntime(biomeClass, obj, "getEdge"); if (edge != null) { - Identifier edgeID = BuiltinRegistries.BIOME.getId(edge); + ResourceLocation edgeID = BuiltinRegistries.BIOME.getId(edge); EndBiomes.LAND_BIOMES.removeMutableBiome(edgeID); EndBiomes.VOID_BIOMES.removeMutableBiome(edgeID); EndBiome edgeBiome = EndBiomes.getBiome(edgeID); endBiome.setEdge(edgeBiome); - } - else { + } else { Boolean isVoid = this.getAndExecuteRuntime(biomeClass, obj, "isVoid"); if (isVoid != null && isVoid.booleanValue()) { EndBiomes.LAND_BIOMES.removeMutableBiome(biomeID); EndBiomes.VOID_BIOMES.addBiomeMutable(endBiome); } - WeightedList subBiomes = this.getAndExecuteRuntime(biomeClass, obj, "getHills"); + WeightedList subBiomes = this.getAndExecuteRuntime(biomeClass, obj, + "getHills"); if (subBiomes != null) { subBiomes.stream().collect(Collectors.toList()).forEach((id) -> { EndBiome subBiome = EndBiomes.getBiome(id); diff --git a/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java b/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java index cec4f4c5..7ba8407d 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java @@ -2,7 +2,7 @@ package ru.betterend.integration.byg.biomes; import java.util.List; -import net.minecraft.entity.SpawnGroup; +import net.minecraft.world.entity.SpawnGroup; import net.minecraft.sound.SoundEvent; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeEffects; @@ -17,15 +17,15 @@ public class EterialGrove extends EndBiome { public EterialGrove() { super(makeDef()); } - + private static BiomeDefinition makeDef() { Biome biome = Integrations.BYG.getBiome("ethereal_islands"); BiomeEffects effects = biome.getEffects(); - + BiomeDefinition def = new BiomeDefinition("eterial_grove") .setSurface(biome.getGenerationSettings().getSurfaceBuilder().get()) .addFeature(BYGFeatures.BIG_ETHER_TREE); - + if (BetterEnd.isClient()) { SoundEvent loop = effects.getLoopSound().get(); SoundEvent music = effects.getMusic().get().getSound(); @@ -33,14 +33,14 @@ public class EterialGrove extends EndBiome { SoundEvent mood = effects.getMoodSound().get().getSound(); def.setLoop(loop).setMusic(music).setAdditions(additions).setMood(mood); } - - for (SpawnGroup group: SpawnGroup.values()) { + + for (SpawnGroup group : SpawnGroup.values()) { List list = biome.getSpawnSettings().getSpawnEntry(group); list.forEach((entry) -> { def.addMobSpawn(entry); }); } - + return def; } } diff --git a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java index 525b433a..85094e37 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java @@ -2,8 +2,8 @@ package ru.betterend.integration.byg.biomes; import java.util.List; -import net.minecraft.entity.SpawnGroup; -import net.minecraft.particle.ParticleTypes; +import net.minecraft.world.entity.SpawnGroup; +import net.minecraft.core.particles.ParticleTypes; import net.minecraft.sound.SoundEvent; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeEffects; @@ -20,25 +20,19 @@ public class NightshadeRedwoods extends EndBiome { public NightshadeRedwoods() { super(makeDef()); } - + private static BiomeDefinition makeDef() { Biome biome = Integrations.BYG.getBiome("nightshade_forest"); BiomeEffects effects = biome.getEffects(); - - BiomeDefinition def = new BiomeDefinition("nightshade_redwoods") - .setFogColor(140, 108, 47) - .setFogDensity(1.5F) - .setWaterAndFogColor(55, 70, 186) - .setFoliageColor(122, 17, 155) + + BiomeDefinition def = new BiomeDefinition("nightshade_redwoods").setFogColor(140, 108, 47).setFogDensity(1.5F) + .setWaterAndFogColor(55, 70, 186).setFoliageColor(122, 17, 155) .setParticles(ParticleTypes.REVERSE_PORTAL, 0.002F) - .setSurface(biome.getGenerationSettings().getSurfaceBuilder().get()) - .setGrassColor(48, 13, 89) - .setPlantsColor(200, 125, 9) - .addFeature(EndFeatures.END_LAKE_RARE) - .addFeature(BYGFeatures.NIGHTSHADE_REDWOOD_TREE) - .addFeature(BYGFeatures.NIGHTSHADE_MOSS_WOOD) + .setSurface(biome.getGenerationSettings().getSurfaceBuilder().get()).setGrassColor(48, 13, 89) + .setPlantsColor(200, 125, 9).addFeature(EndFeatures.END_LAKE_RARE) + .addFeature(BYGFeatures.NIGHTSHADE_REDWOOD_TREE).addFeature(BYGFeatures.NIGHTSHADE_MOSS_WOOD) .addFeature(BYGFeatures.NIGHTSHADE_MOSS); - + if (BetterEnd.isClient()) { SoundEvent loop = effects.getLoopSound().get(); SoundEvent music = effects.getMusic().get().getSound(); @@ -51,14 +45,14 @@ public class NightshadeRedwoods extends EndBiome { def.addFeature(Feature.VEGETAL_DECORATION, feature.get()); }); }); - - for (SpawnGroup group: SpawnGroup.values()) { + + for (SpawnGroup group : SpawnGroup.values()) { List list = biome.getSpawnSettings().getSpawnEntry(group); list.forEach((entry) -> { def.addMobSpawn(entry); }); } - + return def; } } diff --git a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java index ec711c80..a59f15ed 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java @@ -3,13 +3,13 @@ package ru.betterend.integration.byg.biomes; import java.util.List; import java.util.function.Supplier; -import net.minecraft.block.Block; -import net.minecraft.entity.SpawnGroup; -import net.minecraft.particle.ParticleTypes; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.entity.SpawnGroup; +import net.minecraft.core.particles.ParticleTypes; import net.minecraft.sound.SoundEvent; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.registry.BuiltinRegistries; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeEffects; import net.minecraft.world.biome.SpawnSettings.SpawnEntry; @@ -27,23 +27,18 @@ public class OldBulbisGardens extends EndBiome { public OldBulbisGardens() { super(makeDef()); } - + private static BiomeDefinition makeDef() { Biome biome = Integrations.BYG.getBiome("bulbis_gardens"); BiomeEffects effects = biome.getEffects(); - + Block ivis = Integrations.BYG.getBlock("ivis_phylium"); Block origin = biome.getGenerationSettings().getSurfaceConfig().getTopMaterial().getBlock(); - BiomeDefinition def = new BiomeDefinition("old_bulbis_gardens") - .setFogColor(215, 132, 207) - .setFogDensity(1.8F) - .setWaterAndFogColor(40, 0, 56) - .setFoliageColor(122, 17, 155) - .setParticles(ParticleTypes.REVERSE_PORTAL, 0.002F) - .setSurface(ivis, origin) - .addFeature(EndFeatures.END_LAKE_RARE) - .addFeature(BYGFeatures.OLD_BULBIS_TREE); - + BiomeDefinition def = new BiomeDefinition("old_bulbis_gardens").setFogColor(215, 132, 207).setFogDensity(1.8F) + .setWaterAndFogColor(40, 0, 56).setFoliageColor(122, 17, 155) + .setParticles(ParticleTypes.REVERSE_PORTAL, 0.002F).setSurface(ivis, origin) + .addFeature(EndFeatures.END_LAKE_RARE).addFeature(BYGFeatures.OLD_BULBIS_TREE); + if (BetterEnd.isClient()) { SoundEvent loop = effects.getLoopSound().get(); SoundEvent music = effects.getMusic().get().getSound(); @@ -51,25 +46,27 @@ public class OldBulbisGardens extends EndBiome { SoundEvent mood = effects.getMoodSound().get().getSound(); def.setLoop(loop).setMusic(music).setAdditions(additions).setMood(mood); } - - for (SpawnGroup group: SpawnGroup.values()) { + + for (SpawnGroup group : SpawnGroup.values()) { List list = biome.getSpawnSettings().getSpawnEntry(group); list.forEach((entry) -> { def.addMobSpawn(entry); }); } - + List>>> features = biome.getGenerationSettings().getFeatures(); List>> vegetal = features.get(Feature.VEGETAL_DECORATION.ordinal()); if (vegetal.size() > 2) { Supplier> getter; // Trees (first two features) - // I couldn't process them with conditions, so that's why they are hardcoded (paulevs) + // I couldn't process them with conditions, so that's why they are hardcoded + // (paulevs) for (int i = 0; i < 2; i++) { getter = vegetal.get(i); ConfiguredFeature feature = getter.get(); - Identifier id = BetterEnd.makeID("obg_feature_" + i); - feature = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, feature.decorate(ConfiguredFeatures.Decorators.SQUARE_HEIGHTMAP).repeatRandomly(1)); + ResourceLocation id = BetterEnd.makeID("obg_feature_" + i); + feature = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, + feature.decorate(ConfiguredFeatures.Decorators.SQUARE_HEIGHTMAP).repeatRandomly(1)); def.addFeature(Feature.VEGETAL_DECORATION, feature); } // Grasses and other features @@ -79,13 +76,11 @@ public class OldBulbisGardens extends EndBiome { def.addFeature(Feature.VEGETAL_DECORATION, feature); } } - - def.addFeature(EndFeatures.PURPLE_POLYPORE) - .addFeature(BYGFeatures.IVIS_MOSS_WOOD) - .addFeature(BYGFeatures.IVIS_MOSS) - .addFeature(BYGFeatures.IVIS_VINE) - .addFeature(BYGFeatures.IVIS_SPROUT); - + + def.addFeature(EndFeatures.PURPLE_POLYPORE).addFeature(BYGFeatures.IVIS_MOSS_WOOD) + .addFeature(BYGFeatures.IVIS_MOSS).addFeature(BYGFeatures.IVIS_VINE) + .addFeature(BYGFeatures.IVIS_SPROUT); + return def; } } diff --git a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java index 08c87af3..4e4da866 100644 --- a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java @@ -5,10 +5,10 @@ import java.util.Random; import com.google.common.base.Function; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -21,22 +21,27 @@ import ru.betterend.world.features.DefaultFeature; public class BigEtherTreeFeature extends DefaultFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; - + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + return false; + BlockState log = Integrations.BYG.getDefaultState("ether_log"); BlockState wood = Integrations.BYG.getDefaultState("ether_wood"); - //BlockState leaves = Integrations.BYG.getDefaultState("ether_leaves"); - Function splinePlacer = (bpos) -> { return log; }; - Function replace = (state) -> { - return state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) || state.getMaterial().isReplaceable(); + // BlockState leaves = Integrations.BYG.getDefaultState("ether_leaves"); + Function splinePlacer = (bpos) -> { + return log; }; - + Function replace = (state) -> { + return state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) + || state.getMaterial().isReplaceable(); + }; + int height = MHelper.randRange(40, 60, random); List trunk = SplineHelper.makeSpline(0, 0, 0, 0, height, 0, height / 4); SplineHelper.offsetParts(trunk, random, 2F, 0, 2F); SDF sdf = SplineHelper.buildSDF(trunk, 2.3F, 0.8F, splinePlacer); - + int count = height / 15; for (int i = 1; i < count; i++) { float splinePos = (float) i / (float) count; @@ -46,21 +51,22 @@ public class BigEtherTreeFeature extends DefaultFeature { List branch = SplineHelper.makeSpline(0, 0, 0, length, 0, 0, points < 2 ? 2 : points); SplineHelper.powerOffset(branch, length, 2F); int rotCount = MHelper.randRange(5, 7, random); - //float startRad = MathHelper.lerp(splinePos, 2.3F, 0.8F) * 0.8F; + // float startRad = Mth.lerp(splinePos, 2.3F, 0.8F) * 0.8F; Vector3f start = SplineHelper.getPos(trunk, splinePos * (trunk.size() - 1)); for (int j = 0; j < rotCount; j++) { float angle = startAngle + (float) j / rotCount * MHelper.PI2; List br = SplineHelper.copySpline(branch); SplineHelper.offsetParts(br, random, 0, 1, 1); SplineHelper.rotateSpline(br, angle); - + SplineHelper.offset(br, start); SplineHelper.fillSpline(br, world, wood, pos, replace); } } - + sdf.setReplaceFunction((state) -> { - return state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) || state.getMaterial().isReplaceable(); + return state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) + || state.getMaterial().isReplaceable(); }).addPostProcess((info) -> { if (info.getState().equals(log) && (!info.getStateUp().equals(log) || !info.getStateDown().equals(log))) { return wood; @@ -70,8 +76,9 @@ public class BigEtherTreeFeature extends DefaultFeature { return true; } - - //private void makeLeavesSphere(StructureWorldAccess world, BlockPos pos, BlockState leaves, Function ignore) { - // - //} + + // private void makeLeavesSphere(StructureWorldAccess world, BlockPos pos, + // BlockState leaves, Function ignore) { + // + // } } diff --git a/src/main/java/ru/betterend/integration/byg/features/GreatNightshadeTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/GreatNightshadeTreeFeature.java index b9005f20..bf5e89c0 100644 --- a/src/main/java/ru/betterend/integration/byg/features/GreatNightshadeTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/GreatNightshadeTreeFeature.java @@ -6,14 +6,14 @@ import java.util.Random; import com.google.common.base.Function; import com.google.common.collect.Lists; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.LeavesBlock; -import net.minecraft.block.Material; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.material.Material; import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -33,19 +33,25 @@ import ru.betterend.world.features.DefaultFeature; public class GreatNightshadeTreeFeature extends DefaultFeature { private static final List BRANCH; - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; - + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + return false; + BlockState log = Integrations.BYG.getDefaultState("nightshade_log"); BlockState wood = Integrations.BYG.getDefaultState("nightshade_wood"); BlockState leaves = Integrations.BYG.getDefaultState("nightshade_leaves").with(LeavesBlock.DISTANCE, 1); - BlockState leaves_flower = Integrations.BYG.getDefaultState("flowering_nightshade_leaves").with(LeavesBlock.DISTANCE, 1); - - Function splinePlacer = (bpos) -> { return log; }; + BlockState leaves_flower = Integrations.BYG.getDefaultState("flowering_nightshade_leaves") + .with(LeavesBlock.DISTANCE, 1); + + Function splinePlacer = (bpos) -> { + return log; + }; Function replace = (state) -> { - return state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) || state.getMaterial().isReplaceable(); + return state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) + || state.getMaterial().isReplaceable(); }; Function post = (info) -> { if (info.getState().equals(log) && (!info.getStateUp().equals(log) || !info.getStateDown().equals(log))) { @@ -56,15 +62,15 @@ public class GreatNightshadeTreeFeature extends DefaultFeature { Function ignore = (state) -> { return state.equals(log) || state.equals(wood); }; - + int height = MHelper.randRange(40, 60, random); List trunk = SplineHelper.makeSpline(0, 0, 0, 0, height, 0, height / 4); SplineHelper.offsetParts(trunk, random, 0.8F, 0, 0.8F); - + if (!SplineHelper.canGenerate(trunk, pos, world, replace)) { return false; } - + int count = height >> 2; float start = trunk.size() / 3F; float delta = trunk.size() * 0.6F; @@ -83,20 +89,21 @@ public class GreatNightshadeTreeFeature extends DefaultFeature { SplineHelper.fillSpline(branch, world, wood, pos, replace); } SplineHelper.fillSpline(trunk, world, log, pos, ignore); - + SDF sdf = SplineHelper.buildSDF(trunk, 2.3F, 0.8F, splinePlacer); SDF roots = new SDFSphere().setRadius(2F).setBlock(log); - roots = new SDFFlatWave().setIntensity(2F).setRaysCount(MHelper.randRange(5, 7, random)).setAngle(random.nextFloat() * MHelper.PI2).setSource(roots); + roots = new SDFFlatWave().setIntensity(2F).setRaysCount(MHelper.randRange(5, 7, random)) + .setAngle(random.nextFloat() * MHelper.PI2).setSource(roots); sdf = new SDFSmoothUnion().setRadius(2F).setSourceA(sdf).setSourceB(roots); sdf.setReplaceFunction(replace).addPostProcess(post).fillRecursive(world, pos); Vector3f last = SplineHelper.getPos(trunk, trunk.size() - 1.75F); for (int y = 0; y < 8; y++) { - BlockPos p = pos.add(last.getX() + 0.5, last.getY() + y, last.getZ() + 0.5); + BlockPos p = pos.offset(last.getX() + 0.5, last.getY() + y, last.getZ() + 0.5); BlocksHelper.setWithoutUpdate(world, p, y == 4 ? wood : log); } - + for (int y = 0; y < 16; y++) { - BlockPos p = pos.add(last.getX() + 0.5, last.getY() + y, last.getZ() + 0.5); + BlockPos p = pos.offset(last.getX() + 0.5, last.getY() + y, last.getZ() + 0.5); if (world.isAir(p)) { BlocksHelper.setWithoutUpdate(world, p, leaves); } @@ -116,8 +123,8 @@ public class GreatNightshadeTreeFeature extends DefaultFeature { } } } - - Mutable mut = new Mutable(); + + MutableBlockPos mut = new MutableBlockPos(); Function leavesPost1 = (info) -> { if (info.getState().equals(log) || info.getState().equals(wood)) { for (int x = -6; x < 7; x++) { @@ -133,7 +140,7 @@ public class GreatNightshadeTreeFeature extends DefaultFeature { mut.setY(y + info.getPos().getY()); BlockState state = info.getState(mut); if (state.getBlock() instanceof LeavesBlock) { - int distance = state.get(LeavesBlock.DISTANCE); + int distance = state.getValue(LeavesBlock.DISTANCE); if (d < distance) { info.setState(mut, state.with(LeavesBlock.DISTANCE, d)); } @@ -149,15 +156,15 @@ public class GreatNightshadeTreeFeature extends DefaultFeature { if (info.getState().getBlock() instanceof LeavesBlock) { int distance = info.getState().get(LeavesBlock.DISTANCE); if (distance > MHelper.randRange(2, 4, random)) { - return Blocks.AIR.getDefaultState(); + return Blocks.AIR.defaultBlockState(); } - for (Direction d: BlocksHelper.DIRECTIONS) { + for (Direction d : BlocksHelper.DIRECTIONS) { int airCount = 0; if (info.getState(d).isAir()) { - airCount ++; + airCount++; } if (airCount > 5) { - return Blocks.AIR.getDefaultState(); + return Blocks.AIR.defaultBlockState(); } } if (random.nextInt(8) == 0) { @@ -166,19 +173,19 @@ public class GreatNightshadeTreeFeature extends DefaultFeature { } return info.getState(); }; - + SDF canopy = new SDFCappedCone().setRadius1(12F).setRadius2(1f).setHeight(height * 0.3F).setBlock(leaves); - canopy = new SDFDisplacement().setFunction((vec) -> { return MHelper.randRange(-3F, 3F, random); }).setSource(canopy); - canopy.addPostProcess(leavesPost1).addPostProcess(leavesPost2).fillRecursiveIgnore(world, pos.add(0, height * 0.75, 0), ignore); - + canopy = new SDFDisplacement().setFunction((vec) -> { + return MHelper.randRange(-3F, 3F, random); + }).setSource(canopy); + canopy.addPostProcess(leavesPost1).addPostProcess(leavesPost2).fillRecursiveIgnore(world, + pos.offset(0, height * 0.75, 0), ignore); + return true; } - + static { - BRANCH = Lists.newArrayList(new Vector3f(0, 0, 0), - new Vector3f(0.25F, 0.1F, 0), - new Vector3f(0.40F, 0.2F, 0), - new Vector3f(0.50F, 0.4F, 0), - new Vector3f(0.55F, 0.6F, 0)); + BRANCH = Lists.newArrayList(new Vector3f(0, 0, 0), new Vector3f(0.25F, 0.1F, 0), new Vector3f(0.40F, 0.2F, 0), + new Vector3f(0.50F, 0.4F, 0), new Vector3f(0.55F, 0.6F, 0)); } } diff --git a/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java index e58089d2..e18fdaab 100644 --- a/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java @@ -6,14 +6,14 @@ import java.util.Random; import com.google.common.base.Function; import com.google.common.collect.Lists; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.LeavesBlock; -import net.minecraft.block.Material; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.material.Material; import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -33,19 +33,24 @@ import ru.betterend.world.features.DefaultFeature; public class NightshadeRedwoodTreeFeature extends DefaultFeature { private static final List BRANCH; - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; - + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + return false; + BlockState log = Integrations.BYG.getDefaultState("nightshade_log"); BlockState wood = Integrations.BYG.getDefaultState("nightshade_wood"); BlockState leaves = Integrations.BYG.getDefaultState("nightshade_leaves"); BlockState leaves_flower = Integrations.BYG.getDefaultState("flowering_nightshade_leaves"); - - Function splinePlacer = (bpos) -> { return log; }; + + Function splinePlacer = (bpos) -> { + return log; + }; Function replace = (state) -> { - return state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) || state.getMaterial().isReplaceable(); + return state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) + || state.getMaterial().isReplaceable(); }; Function post = (info) -> { if (info.getState().equals(log) && (!info.getStateUp().equals(log) || !info.getStateDown().equals(log))) { @@ -56,15 +61,15 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { Function ignore = (state) -> { return state.equals(log) || state.equals(wood); }; - + int height = MHelper.randRange(40, 60, random); List trunk = SplineHelper.makeSpline(0, 0, 0, 0, height, 0, height / 4); SplineHelper.offsetParts(trunk, random, 0.8F, 0, 0.8F); - + if (!SplineHelper.canGenerate(trunk, pos, world, replace)) { return false; } - + int count = height >> 2; float start = trunk.size() / 3F; float delta = trunk.size() * 0.6F; @@ -83,20 +88,21 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { SplineHelper.offset(branch, offset); SplineHelper.fillSpline(branch, world, wood, pos, replace); } - + SDF sdf = SplineHelper.buildSDF(trunk, 2.3F, 0.8F, splinePlacer); SDF roots = new SDFSphere().setRadius(2F).setBlock(log); - roots = new SDFFlatWave().setIntensity(2F).setRaysCount(MHelper.randRange(5, 7, random)).setAngle(random.nextFloat() * MHelper.PI2).setSource(roots); + roots = new SDFFlatWave().setIntensity(2F).setRaysCount(MHelper.randRange(5, 7, random)) + .setAngle(random.nextFloat() * MHelper.PI2).setSource(roots); sdf = new SDFSmoothUnion().setRadius(2F).setSourceA(sdf).setSourceB(roots); sdf.setReplaceFunction(replace).addPostProcess(post).fillRecursive(world, pos); Vector3f last = SplineHelper.getPos(trunk, trunk.size() - 1.35F); for (int y = 0; y < 8; y++) { - BlockPos p = pos.add(last.getX() + 0.5, last.getY() + y, last.getZ() + 0.5); + BlockPos p = pos.offset(last.getX() + 0.5, last.getY() + y, last.getZ() + 0.5); BlocksHelper.setWithoutUpdate(world, p, y == 4 ? wood : log); } - + for (int y = 0; y < 16; y++) { - BlockPos p = pos.add(last.getX() + 0.5, last.getY() + y, last.getZ() + 0.5); + BlockPos p = pos.offset(last.getX() + 0.5, last.getY() + y, last.getZ() + 0.5); if (world.isAir(p)) { BlocksHelper.setWithoutUpdate(world, p, leaves); } @@ -116,8 +122,8 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { } } } - - Mutable mut = new Mutable(); + + MutableBlockPos mut = new MutableBlockPos(); Function leavesPost1 = (info) -> { if (info.getState().equals(log) || info.getState().equals(wood)) { for (int x = -6; x < 7; x++) { @@ -133,7 +139,7 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { mut.setY(y + info.getPos().getY()); BlockState state = info.getState(mut); if (state.getBlock() instanceof LeavesBlock) { - int distance = state.get(LeavesBlock.DISTANCE); + int distance = state.getValue(LeavesBlock.DISTANCE); if (d < distance) { info.setState(mut, state.with(LeavesBlock.DISTANCE, d)); } @@ -149,15 +155,15 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { if (info.getState().getBlock() instanceof LeavesBlock) { int distance = info.getState().get(LeavesBlock.DISTANCE); if (distance > MHelper.randRange(2, 4, random)) { - return Blocks.AIR.getDefaultState(); + return Blocks.AIR.defaultBlockState(); } - for (Direction d: BlocksHelper.DIRECTIONS) { + for (Direction d : BlocksHelper.DIRECTIONS) { int airCount = 0; if (info.getState(d).isAir()) { - airCount ++; + airCount++; } if (airCount > 5) { - return Blocks.AIR.getDefaultState(); + return Blocks.AIR.defaultBlockState(); } } if (random.nextInt(8) == 0) { @@ -166,19 +172,19 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { } return info.getState(); }; - + SDF canopy = new SDFCappedCone().setRadius1(12F).setRadius2(1f).setHeight(height * 0.3F).setBlock(leaves); - canopy = new SDFDisplacement().setFunction((vec) -> { return MHelper.randRange(-3F, 3F, random); }).setSource(canopy); - canopy.addPostProcess(leavesPost1).addPostProcess(leavesPost2).fillRecursiveIgnore(world, pos.add(0, height * 0.75, 0), ignore); - + canopy = new SDFDisplacement().setFunction((vec) -> { + return MHelper.randRange(-3F, 3F, random); + }).setSource(canopy); + canopy.addPostProcess(leavesPost1).addPostProcess(leavesPost2).fillRecursiveIgnore(world, + pos.offset(0, height * 0.75, 0), ignore); + return true; } - + static { - BRANCH = Lists.newArrayList(new Vector3f(0, 0, 0), - new Vector3f(0.25F, 0.1F, 0), - new Vector3f(0.40F, 0.2F, 0), - new Vector3f(0.50F, 0.4F, 0), - new Vector3f(0.55F, 0.6F, 0)); + BRANCH = Lists.newArrayList(new Vector3f(0, 0, 0), new Vector3f(0.25F, 0.1F, 0), new Vector3f(0.40F, 0.2F, 0), + new Vector3f(0.50F, 0.4F, 0), new Vector3f(0.55F, 0.6F, 0)); } } diff --git a/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java index a7d93ef7..a0a3b41c 100644 --- a/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java @@ -6,13 +6,13 @@ import java.util.function.Function; import com.google.common.collect.Lists; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.Material; import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.util.math.Box; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -34,30 +34,35 @@ public class OldBulbisTreeFeature extends DefaultFeature { private static final List ROOT; private static final List LEAF; private static final List SIDE; - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; - if (!world.getBlockState(pos.down(4)).getBlock().isIn(EndTags.GEN_TERRAIN)) return false; - + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + return false; + if (!world.getBlockState(pos.down(4)).getBlock().isIn(EndTags.GEN_TERRAIN)) + return false; + BlockState stem = Integrations.BYG.getDefaultState("bulbis_stem"); BlockState wood = Integrations.BYG.getDefaultState("bulbis_wood"); - BlockState cap = Integrations.BYG.getDefaultState(random.nextBoolean() ? "bulbis_shell" : "purple_bulbis_shell"); + BlockState cap = Integrations.BYG + .getDefaultState(random.nextBoolean() ? "bulbis_shell" : "purple_bulbis_shell"); BlockState glow = Integrations.BYG.getDefaultState("purple_shroomlight"); - + Function replacement = (state) -> { - if (state.equals(stem) || state.equals(wood) || state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT)) { + if (state.equals(stem) || state.equals(wood) || state.isIn(EndTags.END_GROUND) + || state.getMaterial().equals(Material.PLANT)) { return true; } return state.getMaterial().isReplaceable(); }; - + float size = MHelper.randRange(10, 20, random); float addSize = MHelper.randRange(1, 1.7F, random); float addRad = addSize * 0.5F + 0.5F; int count = (int) (size * 0.15F); size *= addSize; - float var = MHelper.PI2 / (float) (count * 3); + float var = MHelper.PI2 / (float) (count * 3); float start = MHelper.randRange(0, MHelper.PI2, random); SDF sdf = null; int x1 = ((pos.getX() >> 4) << 4) - 16; @@ -70,53 +75,56 @@ public class OldBulbisTreeFeature extends DefaultFeature { SplineHelper.scale(spline, sizeXZ, sizeXZ * 1.5F + MHelper.randRange(0, size * 0.5F, random), sizeXZ); SplineHelper.offset(spline, new Vector3f(size * random.nextFloat() * 0.3F, 0, 0)); SplineHelper.rotateSpline(spline, angle); - SplineHelper.offsetParts(spline, random, 1F, 0, 1F);//1.3F 0.8F + SplineHelper.offsetParts(spline, random, 1F, 0, 1F);// 1.3F 0.8F SDF branch = SplineHelper.buildSDF(spline, 2.3F * addRad, 1.3F * addRad, (bpos) -> { return stem; }); Vector3f vec = spline.get(spline.size() - 1); float radius = (size + MHelper.randRange(0, size * 0.5F, random)) * 0.35F; - bigSphere(world, pos.add(vec.getX(), vec.getY(), vec.getZ()), radius, cap, glow, wood, replacement, random); + bigSphere(world, pos.offset(vec.getX(), vec.getY(), vec.getZ()), radius, cap, glow, wood, replacement, + random); vec = SplineHelper.getPos(spline, 0.3F); - makeRoots(world, pos.add(vec.getX(), vec.getY(), vec.getZ()), size * 0.4F + 5, random, wood, replacement); + makeRoots(world, pos.offset(vec.getX(), vec.getY(), vec.getZ()), size * 0.4F + 5, random, wood, + replacement); sdf = (sdf == null) ? branch : new SDFUnion().setSourceA(sdf).setSourceB(branch); } - + sdf.setReplaceFunction(replacement).addPostProcess((info) -> { - if (info.getState().equals(stem) && (!info.getStateUp().equals(stem) || !info.getStateDown().equals(stem))) { + if (info.getState().equals(stem) + && (!info.getStateUp().equals(stem) || !info.getStateDown().equals(stem))) { return wood; } return info.getState(); }).fillArea(world, pos, limits); - return true; } - - private void bigSphere(StructureWorldAccess world, BlockPos pos, float radius, BlockState cap, BlockState glow, BlockState wood, Function replacement, Random random) { + + private void bigSphere(StructureWorldAccess world, BlockPos pos, float radius, BlockState cap, BlockState glow, + BlockState wood, Function replacement, Random random) { OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); SDF sphere = new SDFSphere().setRadius(radius).setBlock(cap); - + SDF sphereInner = new SDFSphere().setRadius(radius * 0.53F).setBlock(Blocks.AIR); sphereInner = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.1, vec.getY() * 0.1, vec.getZ() * 0.1); }).setSource(sphereInner); - + SDF sphereGlow = new SDFSphere().setRadius(radius * 0.6F).setBlock(glow); sphereGlow = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.1, vec.getY() * 0.1, vec.getZ() * 0.1) * 2F; }).setSource(sphereGlow); sphereGlow = new SDFSubtraction().setSourceA(sphereGlow).setSourceB(sphereInner); - + sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sphereGlow); sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sphereInner); - + float offsetY = radius * 1.7F; sphere = new SDFUnion().setSourceA(sphere).setSourceB(sphereGlow); sphere = new SDFTranslate().setTranslate(0, offsetY, 0).setSource(sphere); - + int leafCount = (int) (radius * 0.5F) + 2; for (int i = 0; i < 4; i++) { float angle = (float) i / 4 * MHelper.PI2; @@ -124,72 +132,54 @@ public class OldBulbisTreeFeature extends DefaultFeature { SplineHelper.rotateSpline(spline, angle); SplineHelper.scale(spline, radius * 1.4F); SplineHelper.fillSplineForce(spline, world, wood, pos, replacement); - + for (int j = 0; j < leafCount; j++) { float delta = ((float) j / (float) (leafCount - 1)); float scale = (float) Math.sin(delta * Math.PI) * 0.8F + 0.2F; - float index = MathHelper.lerp(delta, 1F, 3.9F); + float index = Mth.lerp(delta, 1F, 3.9F); Vector3f point = SplineHelper.getPos(spline, index); - + List side = SplineHelper.copySpline(SIDE); SplineHelper.rotateSpline(side, angle); SplineHelper.scale(side, scale * radius); - BlockPos p = pos.add(point.getX() + 0.5F, point.getY() + 0.5F, point.getZ() + 0.5F); + BlockPos p = pos.offset(point.getX() + 0.5F, point.getY() + 0.5F, point.getZ() + 0.5F); SplineHelper.fillSplineForce(side, world, wood, p, replacement); } } - + sphere.fillArea(world, pos, new Box(pos.up((int) offsetY)).expand(radius * 1.3F)); } - - private void makeRoots(StructureWorldAccess world, BlockPos pos, float radius, Random random, BlockState wood, Function replacement) { + + private void makeRoots(StructureWorldAccess world, BlockPos pos, float radius, Random random, BlockState wood, + Function replacement) { int count = (int) (radius * 1.5F); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2; float scale = radius * MHelper.randRange(0.85F, 1.15F, random); - + List branch = SplineHelper.copySpline(ROOT); SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); Vector3f last = branch.get(branch.size() - 1); - if (world.getBlockState(pos.add(last.getX(), last.getY(), last.getZ())).isIn(EndTags.GEN_TERRAIN)) { + if (world.getBlockState(pos.offset(last.getX(), last.getY(), last.getZ())).isIn(EndTags.GEN_TERRAIN)) { SplineHelper.fillSpline(branch, world, wood, pos, replacement); } } } - + static { - SPLINE = Lists.newArrayList( - new Vector3f(0.00F, 0.00F, 0.00F), - new Vector3f(0.10F, 0.35F, 0.00F), - new Vector3f(0.20F, 0.50F, 0.00F), - new Vector3f(0.30F, 0.55F, 0.00F), - new Vector3f(0.42F, 0.70F, 0.00F), - new Vector3f(0.50F, 1.00F, 0.00F) - ); - - ROOT = Lists.newArrayList(new Vector3f(0F, 1F, 0), - new Vector3f(0.1F, 0.70F, 0), - new Vector3f(0.3F, 0.30F, 0), - new Vector3f(0.7F, 0.05F, 0), - new Vector3f(0.8F, -0.20F, 0) - ); + SPLINE = Lists.newArrayList(new Vector3f(0.00F, 0.00F, 0.00F), new Vector3f(0.10F, 0.35F, 0.00F), + new Vector3f(0.20F, 0.50F, 0.00F), new Vector3f(0.30F, 0.55F, 0.00F), new Vector3f(0.42F, 0.70F, 0.00F), + new Vector3f(0.50F, 1.00F, 0.00F)); + + ROOT = Lists.newArrayList(new Vector3f(0F, 1F, 0), new Vector3f(0.1F, 0.70F, 0), new Vector3f(0.3F, 0.30F, 0), + new Vector3f(0.7F, 0.05F, 0), new Vector3f(0.8F, -0.20F, 0)); SplineHelper.offset(ROOT, new Vector3f(0, -0.45F, 0)); - - LEAF = Lists.newArrayList( - new Vector3f(0.00F, 0.0F, 0), - new Vector3f(0.10F, 0.4F, 0), - new Vector3f(0.40F, 0.8F, 0), - new Vector3f(0.75F, 0.9F, 0), - new Vector3f(1.00F, 0.8F, 0) - ); - - SIDE = Lists.newArrayList( - new Vector3f(0, -0.3F, -0.5F), - new Vector3f(0, -0.1F, -0.3F), - new Vector3f(0, 0.0F, 0.0F), - new Vector3f(0, -0.1F, 0.3F), - new Vector3f(0, -0.3F, 0.5F) - ); + + LEAF = Lists.newArrayList(new Vector3f(0.00F, 0.0F, 0), new Vector3f(0.10F, 0.4F, 0), + new Vector3f(0.40F, 0.8F, 0), new Vector3f(0.75F, 0.9F, 0), new Vector3f(1.00F, 0.8F, 0)); + + SIDE = Lists.newArrayList(new Vector3f(0, -0.3F, -0.5F), new Vector3f(0, -0.1F, -0.3F), + new Vector3f(0, 0.0F, 0.0F), new Vector3f(0, -0.1F, 0.3F), new Vector3f(0, -0.3F, 0.5F)); } } diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java index 67ddf9ba..fa83d526 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java @@ -19,7 +19,7 @@ import me.shedaniel.rei.gui.widget.Widget; import net.minecraft.client.gui.DrawableHelper; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.TranslatableText; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.util.LangUtil; @@ -27,7 +27,7 @@ import ru.betterend.util.LangUtil; public class REIAlloyingCategory implements TransferRecipeCategory { @Override - public @NotNull Identifier getIdentifier() { + public @NotNull ResourceLocation getIdentifier() { return AlloyingRecipe.ID; } @@ -35,12 +35,12 @@ public class REIAlloyingCategory implements TransferRecipeCategory setupDisplay(REIAlloyingDisplay display, Rectangle bounds) { Point startPoint = new Point(bounds.getCenterX() - 41, bounds.y + 10); @@ -49,18 +49,26 @@ public class REIAlloyingCategory implements TransferRecipeCategory widgets = Lists.newArrayList(); widgets.add(Widgets.createRecipeBase(bounds)); widgets.add(Widgets.createResultSlotBackground(new Point(startPoint.x + 61, startPoint.y + 9))); - widgets.add(Widgets.createBurningFire(new Point(startPoint.x - 9, startPoint.y + 20)).animationDurationMS(10000)); - widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width - 5, bounds.y + 5), - new TranslatableText("category.rei.cooking.time&xp", df.format(display.getXp()), df.format(smeltTime / 20D))).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); - widgets.add(Widgets.createArrow(new Point(startPoint.x + 24, startPoint.y + 8)).animationDurationTicks(smeltTime)); + widgets.add( + Widgets.createBurningFire(new Point(startPoint.x - 9, startPoint.y + 20)).animationDurationMS(10000)); + widgets.add(Widgets + .createLabel(new Point(bounds.x + bounds.width - 5, bounds.y + 5), new TranslatableText( + "category.rei.cooking.time&xp", df.format(display.getXp()), df.format(smeltTime / 20D))) + .noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); + widgets.add( + Widgets.createArrow(new Point(startPoint.x + 24, startPoint.y + 8)).animationDurationTicks(smeltTime)); List> inputEntries = display.getInputEntries(); - widgets.add(Widgets.createSlot(new Point(startPoint.x - 20, startPoint.y + 1)).entries(inputEntries.get(0)).markInput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x - 20, startPoint.y + 1)).entries(inputEntries.get(0)) + .markInput()); if (inputEntries.size() > 1) { - widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(inputEntries.get(1)).markInput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(inputEntries.get(1)) + .markInput()); } else { - widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(Lists.newArrayList()).markInput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(Lists.newArrayList()) + .markInput()); } - widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 9)).entries(display.getResultingEntries().get(0)).disableBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 9)) + .entries(display.getResultingEntries().get(0)).disableBackground().markOutput()); return widgets; } @@ -71,17 +79,19 @@ public class REIAlloyingCategory implements TransferRecipeCategory fuel; - + private Recipe recipe; private List> input; private List output; private float xp; private double smeltTime; - + public REIAlloyingDisplay(AlloyingRecipe recipe) { this.recipe = recipe; this.input = EntryStack.ofIngredients(recipe.getPreviewInputs()); @@ -37,7 +37,7 @@ public class REIAlloyingDisplay implements TransferRecipeDisplay { this.xp = recipe.getExperience(); this.smeltTime = recipe.getSmeltTime(); } - + public REIAlloyingDisplay(BlastingRecipe recipe) { this.recipe = recipe; this.input = EntryStack.ofIngredients(recipe.getPreviewInputs()); @@ -45,44 +45,44 @@ public class REIAlloyingDisplay implements TransferRecipeDisplay { this.xp = recipe.getExperience(); this.smeltTime = recipe.getCookTime(); } - + public static List getFuel() { return fuel; } - + @Override - public @NotNull Optional getRecipeLocation() { + public @NotNull Optional getRecipeLocation() { return Optional.ofNullable(recipe).map(Recipe::getId); } - + @Override public @NotNull List> getInputEntries() { return this.input; } - + @Override public @NotNull List> getResultingEntries() { return Collections.singletonList(output); } @Override - public @NotNull Identifier getRecipeCategory() { + public @NotNull ResourceLocation getRecipeCategory() { return AlloyingRecipe.ID; } - + @Override public @NotNull List> getRequiredEntries() { return this.input; } - + public float getXp() { return this.xp; } - + public double getSmeltTime() { return this.smeltTime; } - + public Optional> getOptionalRecipe() { return Optional.ofNullable(recipe); } @@ -98,14 +98,17 @@ public class REIAlloyingDisplay implements TransferRecipeDisplay { } @Override - public List> getOrganisedInputEntries(ContainerInfo containerInfo, ScreenHandler container) { + public List> getOrganisedInputEntries(ContainerInfo containerInfo, + ScreenHandler container) { return this.input; } - + static { - fuel = EndStoneSmelterBlockEntity.availableFuels().keySet().stream() - .map(Item::getDefaultStack).map(EntryStack::create) - .map(e -> e.setting(EntryStack.Settings.TOOLTIP_APPEND_EXTRA, stack -> Collections.singletonList(new TranslatableText("category.rei.smelting.fuel") - .formatted(Formatting.YELLOW)))).collect(Collectors.toList()); + fuel = EndStoneSmelterBlockEntity.availableFuels().keySet().stream().map(Item::getDefaultStack) + .map(EntryStack::create) + .map(e -> e.setting(EntryStack.Properties.TOOLTIP_APPEND_EXTRA, + stack -> Collections.singletonList( + new TranslatableText("category.rei.smelting.fuel").formatted(Formatting.YELLOW)))) + .collect(Collectors.toList()); } } diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java index 1d1856f7..6869324d 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java @@ -20,15 +20,15 @@ import me.shedaniel.rei.gui.widget.Widget; import net.minecraft.client.MinecraftClient; import net.minecraft.client.resource.language.I18n; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.item.Items; +import net.minecraft.world.item.Items; import net.minecraft.text.TranslatableText; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; public class REIAlloyingFuelCategory implements RecipeCategory { private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#.##"); @Override - public @NotNull Identifier getIdentifier() { + public @NotNull ResourceLocation getIdentifier() { return REIPlugin.ALLOYING_FUEL; } @@ -53,16 +53,21 @@ public class REIAlloyingFuelCategory implements RecipeCategory widgets = Lists.newArrayList(); widgets.add(Widgets.createRecipeBase(bounds)); - widgets.add(Widgets.createLabel(new Point(bounds.x + 26, bounds.getMaxY() - 15), new TranslatableText("category.rei.fuel.time", burnTime)) + widgets.add(Widgets + .createLabel(new Point(bounds.x + 26, bounds.getMaxY() - 15), + new TranslatableText("category.rei.fuel.time", burnTime)) .color(0xFF404040, 0xFFBBBBBB).noShadow().leftAligned()); - widgets.add(Widgets.createBurningFire(new Point(bounds.x + 6, startPoint.y + 1)).animationDurationTicks(recipeDisplay.getFuelTime())); - widgets.add(Widgets.createSlot(new Point(bounds.x + 6, startPoint.y + 18)).entries(recipeDisplay.getInputEntries().get(0)).markInput()); + widgets.add(Widgets.createBurningFire(new Point(bounds.x + 6, startPoint.y + 1)) + .animationDurationTicks(recipeDisplay.getFuelTime())); + widgets.add(Widgets.createSlot(new Point(bounds.x + 6, startPoint.y + 18)) + .entries(recipeDisplay.getInputEntries().get(0)).markInput()); return widgets; } @Override public @NotNull RecipeEntry getSimpleRenderer(REIAlloyingFuelDisplay recipe) { - Slot slot = Widgets.createSlot(new Point(0, 0)).entries(recipe.getInputEntries().get(0)).disableBackground().disableHighlight(); + Slot slot = Widgets.createSlot(new Point(0, 0)).entries(recipe.getInputEntries().get(0)).disableBackground() + .disableHighlight(); String burnItems = DECIMAL_FORMAT.format(recipe.getFuelTime() / 200d); return new RecipeEntry() { private TranslatableText text = new TranslatableText("category.rei.fuel.time_short.items", burnItems); @@ -85,7 +90,8 @@ public class REIAlloyingFuelCategory implements RecipeCategory { @Override - public @NotNull Identifier getIdentifier() { + public @NotNull ResourceLocation getIdentifier() { return REIPlugin.SMITHING; } @@ -39,12 +39,12 @@ public class REIAnvilCategory implements TransferRecipeCategory public @NotNull String getCategoryName() { return LangUtil.translate(Blocks.ANVIL.getTranslationKey()); } - + @Override public @NotNull EntryStack getLogo() { return REIPlugin.ANVILS[0]; } - + @Override public @NotNull List setupDisplay(REIAnvilDisplay display, Rectangle bounds) { Point startPoint = new Point(bounds.getCenterX() - 41, bounds.y + 10); @@ -65,11 +65,14 @@ public class REIAnvilCategory implements TransferRecipeCategory }).collect(Collectors.toList()); materials.forEach(entryStack -> entryStack.setAmount(display.getInputCount())); widgets.add(Widgets.createArrow(new Point(x + 24, y + 4))); - widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width - 7, bounds.y + bounds.height - 15), - new TranslatableText("category.rei.damage.amount&dmg", display.getDamage())).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); + widgets.add(Widgets + .createLabel(new Point(bounds.x + bounds.width - 7, bounds.y + bounds.height - 15), + new TranslatableText("category.rei.damage.amount&dmg", display.getDamage())) + .noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); widgets.add(Widgets.createSlot(new Point(x - 20, y + 4)).entries(materials).markInput()); widgets.add(Widgets.createSlot(new Point(x + 1, y + 4)).entries(inputEntries.get(0)).markInput()); - widgets.add(Widgets.createSlot(new Point(x + 61, y + 5)).entries(display.getResultingEntries().get(0)).disableBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(x + 61, y + 5)).entries(display.getResultingEntries().get(0)) + .disableBackground().markOutput()); widgets.add(Widgets.createSlot(new Point(x - 9, y + 25)).entries(anvils)); return widgets; @@ -82,17 +85,20 @@ public class REIAnvilCategory implements TransferRecipeCategory matrices.push(); matrices.translate(0, 0, 400); if (redSlots.contains(0)) { - DrawableHelper.fill(matrices, startPoint.x - 20, startPoint.y + 3, startPoint.x - 20 + 16, startPoint.y + 3 + 16, 1090453504); - DrawableHelper.fill(matrices, startPoint.x + 1, startPoint.y + 3, startPoint.x + 1 + 16, startPoint.y + 3 + 16, 1090453504); + DrawableHelper.fill(matrices, startPoint.x - 20, startPoint.y + 3, startPoint.x - 20 + 16, + startPoint.y + 3 + 16, 1090453504); + DrawableHelper.fill(matrices, startPoint.x + 1, startPoint.y + 3, startPoint.x + 1 + 16, + startPoint.y + 3 + 16, 1090453504); } matrices.pop(); } - + @Override public @NotNull RecipeEntry getSimpleRenderer(REIAnvilDisplay recipe) { - return SimpleRecipeEntry.from(Collections.singletonList(recipe.getInputEntries().get(0)), recipe.getResultingEntries()); + return SimpleRecipeEntry.from(Collections.singletonList(recipe.getInputEntries().get(0)), + recipe.getResultingEntries()); } - + @Override public int getDisplayHeight() { return 60; diff --git a/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java b/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java index 3381f2fb..2da35b4d 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java @@ -9,23 +9,23 @@ import org.jetbrains.annotations.NotNull; import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.TransferRecipeDisplay; import me.shedaniel.rei.server.ContainerInfo; -import net.minecraft.recipe.Recipe; +import net.minecraft.world.item.crafting.Recipe; import net.minecraft.screen.ScreenHandler; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import ru.betterend.recipe.builders.AnvilRecipe; public class REIAnvilDisplay implements TransferRecipeDisplay { - + private final AnvilRecipe recipe; private final List> input; private final List output; - + public REIAnvilDisplay(AnvilRecipe recipe) { this.recipe = recipe; this.input = EntryStack.ofIngredients(recipe.getPreviewInputs()); this.output = Collections.singletonList(EntryStack.create(recipe.getOutput())); } - + public int getDamage() { return recipe.getDamage(); } @@ -37,9 +37,9 @@ public class REIAnvilDisplay implements TransferRecipeDisplay { public int getAnvilLevel() { return recipe.getAnvilLevel(); } - + @Override - public @NotNull Optional getRecipeLocation() { + public @NotNull Optional getRecipeLocation() { return Optional.ofNullable(recipe).map(Recipe::getId); } @@ -47,17 +47,17 @@ public class REIAnvilDisplay implements TransferRecipeDisplay { public @NotNull List> getInputEntries() { return this.input; } - + @Override public @NotNull List> getResultingEntries() { return Collections.singletonList(output); } @Override - public @NotNull Identifier getRecipeCategory() { + public @NotNull ResourceLocation getRecipeCategory() { return REIPlugin.SMITHING; } - + @Override public @NotNull List> getRequiredEntries() { return input; diff --git a/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java index 6821a790..d7ea7884 100644 --- a/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java @@ -17,18 +17,18 @@ import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; import me.shedaniel.rei.gui.widget.Widget; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.TranslatableText; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.recipe.builders.InfusionRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.util.LangUtil; public class REIInfusionCategory implements TransferRecipeCategory { - - private final static Identifier BACKGROUND = BetterEnd.makeID("textures/gui/rei_infusion.png"); + + private final static ResourceLocation BACKGROUND = BetterEnd.makeID("textures/gui/rei_infusion.png"); @Override - public @NotNull Identifier getIdentifier() { + public @NotNull ResourceLocation getIdentifier() { return InfusionRecipe.ID; } @@ -36,17 +36,17 @@ public class REIInfusionCategory implements TransferRecipeCategory setupDisplay(REIInfusionDisplay display, Rectangle bounds) { Point centerPoint = new Point(bounds.getCenterX() - 34, bounds.getCenterY() - 2); @@ -56,24 +56,36 @@ public class REIInfusionCategory implements TransferRecipeCategory> outputEntries = display.getResultingEntries(); widgets.add(Widgets.createTexturedWidget(BACKGROUND, bounds.x, bounds.y, 0, 0, 150, 104, 150, 104)); widgets.add(Widgets.createSlot(centerPoint).entries(inputEntries.get(0)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x, centerPoint.y - 28)).entries(inputEntries.get(1)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x + 28, centerPoint.y)).entries(inputEntries.get(3)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x, centerPoint.y + 28)).entries(inputEntries.get(5)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x - 28, centerPoint.y)).entries(inputEntries.get(7)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x + 24, centerPoint.y - 24)).entries(inputEntries.get(2)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x + 24, centerPoint.y + 24)).entries(inputEntries.get(4)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x - 24, centerPoint.y + 24)).entries(inputEntries.get(6)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x - 24, centerPoint.y - 24)).entries(inputEntries.get(8)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x + 80, centerPoint.y)).entries(outputEntries.get(0)).disableBackground().markOutput()); - widgets.add(Widgets.createLabel(new Point(bounds.getMaxX() - 5, bounds.y + 6), new TranslatableText("category.rei.infusion.time&val", display.getInfusionTime())) + widgets.add(Widgets.createSlot(new Point(centerPoint.x, centerPoint.y - 28)).entries(inputEntries.get(1)) + .disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x + 28, centerPoint.y)).entries(inputEntries.get(3)) + .disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x, centerPoint.y + 28)).entries(inputEntries.get(5)) + .disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x - 28, centerPoint.y)).entries(inputEntries.get(7)) + .disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x + 24, centerPoint.y - 24)).entries(inputEntries.get(2)) + .disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x + 24, centerPoint.y + 24)).entries(inputEntries.get(4)) + .disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x - 24, centerPoint.y + 24)).entries(inputEntries.get(6)) + .disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x - 24, centerPoint.y - 24)).entries(inputEntries.get(8)) + .disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x + 80, centerPoint.y)).entries(outputEntries.get(0)) + .disableBackground().markOutput()); + widgets.add(Widgets + .createLabel(new Point(bounds.getMaxX() - 5, bounds.y + 6), + new TranslatableText("category.rei.infusion.time&val", display.getInfusionTime())) .noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); return widgets; } @Override - public void renderRedSlots(MatrixStack matrices, List widgets, Rectangle bounds, - REIInfusionDisplay display, IntList redSlots) {} - + public void renderRedSlots(MatrixStack matrices, List widgets, Rectangle bounds, REIInfusionDisplay display, + IntList redSlots) { + } + @Override public int getDisplayHeight() { return 104; diff --git a/src/main/java/ru/betterend/integration/rei/REIInfusionDisplay.java b/src/main/java/ru/betterend/integration/rei/REIInfusionDisplay.java index 9e77e114..86313c99 100644 --- a/src/main/java/ru/betterend/integration/rei/REIInfusionDisplay.java +++ b/src/main/java/ru/betterend/integration/rei/REIInfusionDisplay.java @@ -11,36 +11,36 @@ import com.google.common.collect.Lists; import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.TransferRecipeDisplay; import me.shedaniel.rei.server.ContainerInfo; -import net.minecraft.recipe.Recipe; +import net.minecraft.world.item.crafting.Recipe; import net.minecraft.screen.ScreenHandler; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.recipe.builders.InfusionRecipe; public class REIInfusionDisplay implements TransferRecipeDisplay { - + private final InfusionRecipe recipe; private final List> input; private final List output; private final int time; - + public REIInfusionDisplay(InfusionRecipe recipe) { this.recipe = recipe; this.input = Lists.newArrayList(); this.output = Collections.singletonList(EntryStack.create(recipe.getOutput())); this.time = recipe.getInfusionTime(); - + recipe.getPreviewInputs().forEach(ingredient -> { input.add(EntryStack.ofIngredient(ingredient)); }); } - + public int getInfusionTime() { return this.time; } - + @Override - public @NotNull Optional getRecipeLocation() { + public @NotNull Optional getRecipeLocation() { return Optional.ofNullable(recipe).map(Recipe::getId); } @@ -48,17 +48,17 @@ public class REIInfusionDisplay implements TransferRecipeDisplay { public @NotNull List> getInputEntries() { return this.input; } - + @Override public @NotNull List> getResultingEntries() { return Collections.singletonList(output); } @Override - public @NotNull Identifier getRecipeCategory() { + public @NotNull ResourceLocation getRecipeCategory() { return AlloyingRecipe.ID; } - + @Override public @NotNull List> getRequiredEntries() { return this.input; @@ -75,7 +75,8 @@ public class REIInfusionDisplay implements TransferRecipeDisplay { } @Override - public List> getOrganisedInputEntries(ContainerInfo containerInfo, ScreenHandler container) { + public List> getOrganisedInputEntries(ContainerInfo containerInfo, + ScreenHandler container) { return this.input; } } diff --git a/src/main/java/ru/betterend/integration/rei/REIPlugin.java b/src/main/java/ru/betterend/integration/rei/REIPlugin.java index 1a83a037..3232fd8e 100644 --- a/src/main/java/ru/betterend/integration/rei/REIPlugin.java +++ b/src/main/java/ru/betterend/integration/rei/REIPlugin.java @@ -12,10 +12,10 @@ import me.shedaniel.rei.plugin.DefaultPlugin; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.impl.content.registry.FuelRegistryImpl; -import net.minecraft.block.Blocks; -import net.minecraft.item.BlockItem; -import net.minecraft.recipe.BlastingRecipe; -import net.minecraft.util.Identifier; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.crafting.BlastingRecipe; +import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.blocks.basis.EndAnvilBlock; import ru.betterend.blocks.basis.EndFurnaceBlock; @@ -28,11 +28,11 @@ import ru.betterend.registry.EndItems; @Environment(EnvType.CLIENT) public class REIPlugin implements REIPluginV0 { - public final static Identifier PLUGIN_ID = BetterEnd.makeID("rei_plugin"); - public final static Identifier ALLOYING_FUEL = BetterEnd.makeID("alloying_fuel"); - public final static Identifier ALLOYING = AlloyingRecipe.ID; - public final static Identifier SMITHING = AnvilRecipe.ID; - public final static Identifier INFUSION = InfusionRecipe.ID; + public final static ResourceLocation PLUGIN_ID = BetterEnd.makeID("rei_plugin"); + public final static ResourceLocation ALLOYING_FUEL = BetterEnd.makeID("alloying_fuel"); + public final static ResourceLocation ALLOYING = AlloyingRecipe.ID; + public final static ResourceLocation SMITHING = AnvilRecipe.ID; + public final static ResourceLocation INFUSION = InfusionRecipe.ID; public final static EntryStack END_STONE_SMELTER = EntryStack.create(EndBlocks.END_STONE_SMELTER); public final static EntryStack INFUSION_RITUAL = EntryStack.create(EndBlocks.INFUSION_PEDESTAL); @@ -40,12 +40,12 @@ public class REIPlugin implements REIPluginV0 { public final static EntryStack[] ANVILS; @Override - public Identifier getPluginIdentifier() { + public ResourceLocation getPluginIdentifier() { return PLUGIN_ID; } - + @Override - public void registerRecipeDisplays(RecipeHelper recipeHelper) { + public void registerRecipeDisplays(RecipeHelper recipeHelper) { recipeHelper.registerRecipes(ALLOYING, AlloyingRecipe.class, REIAlloyingDisplay::new); recipeHelper.registerRecipes(ALLOYING, BlastingRecipe.class, REIAlloyingDisplay::new); recipeHelper.registerRecipes(SMITHING, AnvilRecipe.class, REIAnvilDisplay::new); @@ -56,7 +56,7 @@ public class REIPlugin implements REIPluginV0 { } }); } - + @Override public void registerOthers(RecipeHelper recipeHelper) { recipeHelper.registerWorkingStations(ALLOYING_FUEL, END_STONE_SMELTER); @@ -68,15 +68,12 @@ public class REIPlugin implements REIPluginV0 { recipeHelper.registerWorkingStations(DefaultPlugin.SMELTING, FURNACES); recipeHelper.registerWorkingStations(DefaultPlugin.FUEL, FURNACES); - } - + } + @Override public void registerPluginCategories(RecipeHelper recipeHelper) { - recipeHelper.registerCategories( - new REIAlloyingFuelCategory(), - new REIAlloyingCategory(), - new REIInfusionCategory(), - new REIAnvilCategory()); + recipeHelper.registerCategories(new REIAlloyingFuelCategory(), new REIAlloyingCategory(), + new REIInfusionCategory(), new REIAnvilCategory()); } static { diff --git a/src/main/java/ru/betterend/interfaces/IBiomeArray.java b/src/main/java/ru/betterend/interfaces/IBiomeArray.java index 8916cd5c..264a1eba 100644 --- a/src/main/java/ru/betterend/interfaces/IBiomeArray.java +++ b/src/main/java/ru/betterend/interfaces/IBiomeArray.java @@ -1,6 +1,6 @@ package ru.betterend.interfaces; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.world.biome.Biome; public interface IBiomeArray { diff --git a/src/main/java/ru/betterend/interfaces/IColorProvider.java b/src/main/java/ru/betterend/interfaces/IColorProvider.java index ae6d0db5..2c0100da 100644 --- a/src/main/java/ru/betterend/interfaces/IColorProvider.java +++ b/src/main/java/ru/betterend/interfaces/IColorProvider.java @@ -1,10 +1,9 @@ package ru.betterend.interfaces; -import net.minecraft.client.color.block.BlockColorProvider; -import net.minecraft.client.color.item.ItemColorProvider; +import net.minecraft.client.color.block.BlockColor; +import net.minecraft.client.color.item.ItemColor; public interface IColorProvider { - BlockColorProvider getProvider(); - - ItemColorProvider getItemProvider(); + BlockColor getBlockProvider(); + ItemColor getItemProvider(); } diff --git a/src/main/java/ru/betterend/interfaces/IRenderTypeable.java b/src/main/java/ru/betterend/interfaces/IRenderTypeable.java index 1a5c029c..96f961ba 100644 --- a/src/main/java/ru/betterend/interfaces/IRenderTypeable.java +++ b/src/main/java/ru/betterend/interfaces/IRenderTypeable.java @@ -4,5 +4,5 @@ import ru.betterend.client.render.ERenderLayer; public interface IRenderTypeable { - public ERenderLayer getRenderLayer(); + ERenderLayer getRenderLayer(); } diff --git a/src/main/java/ru/betterend/interfaces/TeleportingEntity.java b/src/main/java/ru/betterend/interfaces/TeleportingEntity.java index 76cf8c24..f339e736 100644 --- a/src/main/java/ru/betterend/interfaces/TeleportingEntity.java +++ b/src/main/java/ru/betterend/interfaces/TeleportingEntity.java @@ -1,9 +1,11 @@ package ru.betterend.interfaces; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; public interface TeleportingEntity { void beSetExitPos(BlockPos pos); + void beResetExitPos(); + boolean beCanTeleport(); } diff --git a/src/main/java/ru/betterend/item/DrinkItem.java b/src/main/java/ru/betterend/item/DrinkItem.java index 2dd617c8..78c78eaf 100644 --- a/src/main/java/ru/betterend/item/DrinkItem.java +++ b/src/main/java/ru/betterend/item/DrinkItem.java @@ -1,20 +1,20 @@ package ru.betterend.item; import net.minecraft.advancement.criterion.Criteria; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemUsage; -import net.minecraft.item.Items; -import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ItemUsage; +import net.minecraft.world.item.Items; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.stat.Stats; import net.minecraft.util.Hand; import net.minecraft.util.TypedActionResult; import net.minecraft.util.UseAction; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; public class DrinkItem extends PatternedItem { - public DrinkItem(Settings settings) { + public DrinkItem(Properties settings) { super(settings); } @@ -29,14 +29,14 @@ public class DrinkItem extends PatternedItem { } @Override - public TypedActionResult use(World world, PlayerEntity user, Hand hand) { + public TypedActionResult use(Level world, PlayerEntity user, Hand hand) { return ItemUsage.consumeHeldItem(world, user, hand); } @Override - public ItemStack finishUsing(ItemStack stack, World world, LivingEntity user) { - if (user instanceof ServerPlayerEntity) { - ServerPlayerEntity serverPlayerEntity = (ServerPlayerEntity) user; + public ItemStack finishUsing(ItemStack stack, Level world, LivingEntity user) { + if (user instanceof ServerPlayer) { + ServerPlayer serverPlayerEntity = (ServerPlayer) user; Criteria.CONSUME_ITEM.trigger(serverPlayerEntity, stack); serverPlayerEntity.incrementStat(Stats.USED.getOrCreateStat(this)); } @@ -45,7 +45,7 @@ public class DrinkItem extends PatternedItem { stack.decrement(1); } - if (!world.isClient) { + if (!world.isClientSide) { user.clearStatusEffects(); } diff --git a/src/main/java/ru/betterend/item/EnchantedPetalItem.java b/src/main/java/ru/betterend/item/EnchantedPetalItem.java index 93e75b96..9ede5983 100644 --- a/src/main/java/ru/betterend/item/EnchantedPetalItem.java +++ b/src/main/java/ru/betterend/item/EnchantedPetalItem.java @@ -1,7 +1,7 @@ package ru.betterend.item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Rarity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; import ru.betterend.patterns.Patterns; import ru.betterend.registry.EndItems; @@ -14,7 +14,7 @@ public class EnchantedPetalItem extends PatternedItem { public boolean hasGlint(ItemStack stack) { return true; } - + @Override public String getModelPattern(String name) { return Patterns.createJson(Patterns.ITEM_GENERATED, "item/hydralux_petal"); diff --git a/src/main/java/ru/betterend/item/EndArmorItem.java b/src/main/java/ru/betterend/item/EndArmorItem.java index dc298f2f..0d9bfe05 100644 --- a/src/main/java/ru/betterend/item/EndArmorItem.java +++ b/src/main/java/ru/betterend/item/EndArmorItem.java @@ -5,26 +5,27 @@ import java.util.UUID; import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.Multimap; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.attribute.EntityAttribute; -import net.minecraft.entity.attribute.EntityAttributeModifier; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.item.ArmorItem; -import net.minecraft.item.ArmorMaterial; -import net.minecraft.item.Item; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.attribute.EntityAttribute; +import net.minecraft.world.entity.attribute.EntityAttributeModifier; +import net.minecraft.world.entity.attribute.EntityAttributes; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.Item; import ru.betterend.mixin.common.ArmorItemAccessor; import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; public class EndArmorItem extends ArmorItem implements Patterned { - public EndArmorItem(ArmorMaterial material, EquipmentSlot slot, Item.Settings settings) { + public EndArmorItem(ArmorMaterial material, EquipmentSlot slot, Item.Properties settings) { super(material, slot, settings); addKnockbackResistance((ArmorItemAccessor) this, slot, this.knockbackResistance); } /** Ensures knockback resistance is actually applied */ - private static void addKnockbackResistance(ArmorItemAccessor accessor, EquipmentSlot slot, double knockbackResistance) { + private static void addKnockbackResistance(ArmorItemAccessor accessor, EquipmentSlot slot, + double knockbackResistance) { if (knockbackResistance == 0) { return; } @@ -41,7 +42,8 @@ public class EndArmorItem extends ArmorItem implements Patterned { // Rebuild attributeModifiers to include knockback resistance ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); builder.putAll(attributeModifiers); - builder.put(EntityAttributes.GENERIC_KNOCKBACK_RESISTANCE, new EntityAttributeModifier(uuid, "Armor knockback resistance", knockbackResistance, EntityAttributeModifier.Operation.ADDITION)); + builder.put(EntityAttributes.GENERIC_KNOCKBACK_RESISTANCE, new EntityAttributeModifier(uuid, + "Armor knockback resistance", knockbackResistance, EntityAttributeModifier.Operation.ADDITION)); accessor.be_setAttributeModifiers(builder.build()); } diff --git a/src/main/java/ru/betterend/item/EndSpawnEggItem.java b/src/main/java/ru/betterend/item/EndSpawnEggItem.java index 0987e685..419136ec 100644 --- a/src/main/java/ru/betterend/item/EndSpawnEggItem.java +++ b/src/main/java/ru/betterend/item/EndSpawnEggItem.java @@ -1,15 +1,15 @@ package ru.betterend.item; -import net.minecraft.entity.EntityType; -import net.minecraft.item.SpawnEggItem; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.SpawnEggItem; import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; public class EndSpawnEggItem extends SpawnEggItem implements Patterned { - public EndSpawnEggItem(EntityType type, int primaryColor, int secondaryColor, Settings settings) { + public EndSpawnEggItem(EntityType type, int primaryColor, int secondaryColor, Properties settings) { super(type, primaryColor, secondaryColor, settings); } - + @Override public String getModelPattern(String name) { return Patterns.createJson(Patterns.ITEM_SPAWN_EGG, name); diff --git a/src/main/java/ru/betterend/item/EternalCrystalItem.java b/src/main/java/ru/betterend/item/EternalCrystalItem.java index 1ad6bb40..3466577e 100644 --- a/src/main/java/ru/betterend/item/EternalCrystalItem.java +++ b/src/main/java/ru/betterend/item/EternalCrystalItem.java @@ -1,6 +1,6 @@ package ru.betterend.item; -import net.minecraft.util.Rarity; +import net.minecraft.world.item.Rarity; import ru.betterend.registry.EndItems; public class EternalCrystalItem extends PatternedItem { diff --git a/src/main/java/ru/betterend/item/GuideBookItem.java b/src/main/java/ru/betterend/item/GuideBookItem.java index 17309d80..ad652d22 100644 --- a/src/main/java/ru/betterend/item/GuideBookItem.java +++ b/src/main/java/ru/betterend/item/GuideBookItem.java @@ -3,42 +3,44 @@ package ru.betterend.item; import java.util.List; import net.minecraft.client.item.TooltipContext; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.Hand; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.TypedActionResult; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; import ru.betterend.BetterEnd; import ru.betterend.registry.EndItems; import ru.betterend.util.LangUtil; import vazkii.patchouli.api.PatchouliAPI; public class GuideBookItem extends PatternedItem { - public final static Identifier BOOK_ID = BetterEnd.makeID("guidebook"); - public static final Item GUIDE_BOOK = EndItems.registerItem(BOOK_ID, new GuideBookItem()); - - public static void register() {} - - public GuideBookItem() { - super(EndItems.makeItemSettings().maxCount(1)); - } - + public final static ResourceLocation BOOK_ID = BetterEnd.makeID("guidebook"); + public static final Item GUIDE_BOOK = EndItems.registerItem(BOOK_ID, new GuideBookItem()); + + public static void register() { + } + + public GuideBookItem() { + super(EndItems.makeItemSettings().maxCount(1)); + } + @Override - public TypedActionResult use(World world, PlayerEntity user, Hand hand) { - if (!world.isClient && user instanceof ServerPlayerEntity) { - PatchouliAPI.get().openBookGUI((ServerPlayerEntity) user, BOOK_ID); + public TypedActionResult use(Level world, PlayerEntity user, Hand hand) { + if (!world.isClientSide && user instanceof ServerPlayer) { + PatchouliAPI.get().openBookGUI((ServerPlayer) user, BOOK_ID); return TypedActionResult.success(user.getStackInHand(hand)); } return TypedActionResult.consume(user.getStackInHand(hand)); } @Override - public void appendTooltip(ItemStack stack, World world, List tooltip, TooltipContext context) { - tooltip.add(LangUtil.getText("book.betterend", "subtitle").formatted(Formatting.DARK_PURPLE, Formatting.ITALIC)); + public void appendTooltip(ItemStack stack, Level world, List tooltip, TooltipContext context) { + tooltip.add( + LangUtil.getText("book.betterend", "subtitle").formatted(Formatting.DARK_PURPLE, Formatting.ITALIC)); } } diff --git a/src/main/java/ru/betterend/item/PatternedDiscItem.java b/src/main/java/ru/betterend/item/PatternedDiscItem.java index 6f8b9d54..dca0c763 100644 --- a/src/main/java/ru/betterend/item/PatternedDiscItem.java +++ b/src/main/java/ru/betterend/item/PatternedDiscItem.java @@ -1,12 +1,12 @@ package ru.betterend.item; -import net.minecraft.item.MusicDiscItem; +import net.minecraft.world.item.MusicDiscItem; import net.minecraft.sound.SoundEvent; import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; public class PatternedDiscItem extends MusicDiscItem implements Patterned { - public PatternedDiscItem(int comparatorOutput, SoundEvent sound, Settings settings) { + public PatternedDiscItem(int comparatorOutput, SoundEvent sound, Properties settings) { super(comparatorOutput, sound, settings); } diff --git a/src/main/java/ru/betterend/item/PatternedItem.java b/src/main/java/ru/betterend/item/PatternedItem.java index c2b8eeff..de970bb6 100644 --- a/src/main/java/ru/betterend/item/PatternedItem.java +++ b/src/main/java/ru/betterend/item/PatternedItem.java @@ -1,14 +1,14 @@ package ru.betterend.item; -import net.minecraft.item.Item; +import net.minecraft.world.item.Item; import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; public class PatternedItem extends Item implements Patterned { - public PatternedItem(Settings settings) { + public PatternedItem(Properties settings) { super(settings); } - + @Override public String getModelPattern(String name) { return Patterns.createJson(Patterns.ITEM_GENERATED, name); diff --git a/src/main/java/ru/betterend/item/material/EndArmorMaterial.java b/src/main/java/ru/betterend/item/material/EndArmorMaterial.java index 9916cb8d..c80e094c 100644 --- a/src/main/java/ru/betterend/item/material/EndArmorMaterial.java +++ b/src/main/java/ru/betterend/item/material/EndArmorMaterial.java @@ -4,27 +4,26 @@ import java.util.function.Supplier; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.item.ArmorMaterial; -import net.minecraft.recipe.Ingredient; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.sound.SoundEvent; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.Lazy; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.util.LazyLoadedValue; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; public enum EndArmorMaterial implements ArmorMaterial { THALLASIUM("thallasium", 17, new int[] { 1, 4, 5, 2 }, 12, SoundEvents.ITEM_ARMOR_EQUIP_IRON, 0.0F, 0.0F, () -> { - return Ingredient.ofItems(EndBlocks.THALLASIUM.ingot); - }), - TERMINITE("terminite", 26, new int[] { 3, 6, 7, 3 }, 14, SoundEvents.ITEM_ARMOR_EQUIP_IRON, 1.0F, 0.05F, () -> { - return Ingredient.ofItems(EndBlocks.TERMINITE.ingot); + return Ingredient.of(EndBlocks.THALLASIUM.ingot); + }), TERMINITE("terminite", 26, new int[] { 3, 6, 7, 3 }, 14, SoundEvents.ITEM_ARMOR_EQUIP_IRON, 1.0F, 0.05F, () -> { + return Ingredient.of(EndBlocks.TERMINITE.ingot); }), AETERNIUM("aeternium", 40, new int[] { 4, 7, 9, 4 }, 18, SoundEvents.ITEM_ARMOR_EQUIP_NETHERITE, 3.5F, 0.2F, () -> { - return Ingredient.ofItems(EndItems.AETERNIUM_INGOT); + return Ingredient.of(EndItems.AETERNIUM_INGOT); }), CRYSTALITE("crystalite", 30, new int[] { 3, 6, 8, 3 }, 24, SoundEvents.ITEM_ARMOR_EQUIP_DIAMOND, 1.2F, 0.1F, () -> { - return Ingredient.ofItems(EndBlocks.TERMINITE.ingot); + return Ingredient.of(EndBlocks.TERMINITE.ingot); }); private static final int[] BASE_DURABILITY = new int[] { 13, 15, 16, 11 }; @@ -35,12 +34,11 @@ public enum EndArmorMaterial implements ArmorMaterial { private final SoundEvent equipSound; private final float toughness; private final float knockbackResistance; - private final Lazy repairIngredient; - + private final LazyLoadedValue repairIngredient; + private EndArmorMaterial(String name, int durabilityMultiplier, int[] protectionAmounts, int enchantability, - SoundEvent equipSound, float toughness, float knockbackResistance, - Supplier repairIngredient) { - + SoundEvent equipSound, float toughness, float knockbackResistance, Supplier repairIngredient) { + this.name = name; this.durabilityMultiplier = durabilityMultiplier; this.protectionAmounts = protectionAmounts; @@ -48,7 +46,7 @@ public enum EndArmorMaterial implements ArmorMaterial { this.equipSound = equipSound; this.toughness = toughness; this.knockbackResistance = knockbackResistance; - this.repairIngredient = new Lazy<>(repairIngredient); + this.repairIngredient = new LazyLoadedValue<>(repairIngredient); } @Override diff --git a/src/main/java/ru/betterend/item/material/EndToolMaterial.java b/src/main/java/ru/betterend/item/material/EndToolMaterial.java index de508032..151e683e 100644 --- a/src/main/java/ru/betterend/item/material/EndToolMaterial.java +++ b/src/main/java/ru/betterend/item/material/EndToolMaterial.java @@ -2,21 +2,19 @@ package ru.betterend.item.material; import java.util.function.Supplier; -import net.minecraft.item.ToolMaterial; -import net.minecraft.recipe.Ingredient; -import net.minecraft.util.Lazy; +import net.minecraft.util.LazyLoadedValue; +import net.minecraft.world.item.Tier; +import net.minecraft.world.item.crafting.Ingredient; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; -public enum EndToolMaterial implements ToolMaterial { +public enum EndToolMaterial implements Tier { THALLASIUM(2, 320, 7.0F, 1.5F, 12, () -> { - return Ingredient.ofItems(EndBlocks.THALLASIUM.ingot); - }), - TERMINITE(3, 1230, 8.5F, 3.0F, 14, () -> { - return Ingredient.ofItems(EndBlocks.TERMINITE.ingot); - }), - AETERNIUM(5, 2196, 10.0F, 4.5F, 18, () -> { - return Ingredient.ofItems(EndItems.AETERNIUM_INGOT); + return Ingredient.of(EndBlocks.THALLASIUM.ingot); + }), TERMINITE(3, 1230, 8.5F, 3.0F, 14, () -> { + return Ingredient.of(EndBlocks.TERMINITE.ingot); + }), AETERNIUM(5, 2196, 10.0F, 4.5F, 18, () -> { + return Ingredient.of(EndItems.AETERNIUM_INGOT); }); private final int durability; @@ -24,8 +22,8 @@ public enum EndToolMaterial implements ToolMaterial { private final float attackDamage; private final int miningLevel; private final int enchantability; - private final Lazy repairIngredient; - + private final LazyLoadedValue repairIngredient; + private EndToolMaterial(int miningLevel, int durability, float miningSpeed, float attackDamage, int enchantability, Supplier repairIngredient) { @@ -34,32 +32,32 @@ public enum EndToolMaterial implements ToolMaterial { this.attackDamage = attackDamage; this.miningLevel = miningLevel; this.enchantability = enchantability; - this.repairIngredient = new Lazy<>(repairIngredient); + this.repairIngredient = new LazyLoadedValue<>(repairIngredient); } @Override - public int getDurability() { - return this.durability; + public int getUses() { + return durability; } @Override - public float getMiningSpeedMultiplier() { - return this.miningSpeed; + public float getSpeed() { + return miningSpeed; } @Override - public float getAttackDamage() { - return this.attackDamage; + public float getAttackDamageBonus() { + return attackDamage; } @Override - public int getMiningLevel() { - return this.miningLevel; + public int getLevel() { + return miningLevel; } @Override - public int getEnchantability() { - return this.enchantability; + public int getEnchantmentValue() { + return enchantability; } @Override diff --git a/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java b/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java index c5462c51..4073824f 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java @@ -11,69 +11,73 @@ import net.fabricmc.fabric.api.client.rendering.v1.ArmorRenderingRegistry.ModelP import net.fabricmc.fabric.api.client.rendering.v1.ArmorRenderingRegistry.TextureProvider; import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Identifier; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.resources.ResourceLocation; import ru.betterend.registry.EndItems; @Environment(EnvType.CLIENT) public class CrystaliteArmorProvider implements ModelProvider, TextureProvider { - private final static Identifier FIRST_LAYER = new Identifier("textures/models/armor/crystalite_layer_1.png"); - private final static Identifier SECOND_LAYER = new Identifier("textures/models/armor/crystalite_layer_2.png"); + private final static ResourceLocation FIRST_LAYER = new ResourceLocation( + "textures/models/armor/crystalite_layer_1.png"); + private final static ResourceLocation SECOND_LAYER = new ResourceLocation( + "textures/models/armor/crystalite_layer_2.png"); private final static CrystaliteHelmetModel HELMET_MODEL = new CrystaliteHelmetModel(1.0F); private final static CrystaliteChestplateModel CHEST_MODEL = new CrystaliteChestplateModel(1.0F, false); private final static CrystaliteChestplateModel CHEST_MODEL_SLIM = new CrystaliteChestplateModel(1.0F, true); private final static CrystaliteLeggingsModel LEGGINGS_MODEL = new CrystaliteLeggingsModel(1.0F); private final static CrystaliteBootsModel BOOTS_MODEL = new CrystaliteBootsModel(1.0F); - + @Override - public @NotNull Identifier getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot, - boolean secondLayer, @Nullable String suffix, Identifier defaultTexture) { - if (!isStackValid(stack)) return defaultTexture; - if (secondLayer) return SECOND_LAYER; + public @NotNull ResourceLocation getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot, + boolean secondLayer, @Nullable String suffix, ResourceLocation defaultTexture) { + if (!isStackValid(stack)) + return defaultTexture; + if (secondLayer) + return SECOND_LAYER; return FIRST_LAYER; } @Override public @NotNull BipedEntityModel getArmorModel(LivingEntity entity, ItemStack stack, EquipmentSlot slot, BipedEntityModel defaultModel) { - if (!isStackValid(stack)) return defaultModel; - switch(slot) { - case HEAD: { - return HELMET_MODEL; - } - case CHEST: { - if (entity instanceof AbstractClientPlayerEntity && - ((AbstractClientPlayerEntity) entity).getModel().equals("slim")) { - CHEST_MODEL_SLIM.setAttributes(defaultModel); - return CHEST_MODEL_SLIM; - } - CHEST_MODEL.setAttributes(defaultModel); - return CHEST_MODEL; - } - case LEGS: { - return LEGGINGS_MODEL; - } - case FEET: { - BOOTS_MODEL.setAttributes(defaultModel); - return BOOTS_MODEL; - } - default: { - return defaultModel; + if (!isStackValid(stack)) + return defaultModel; + switch (slot) { + case HEAD: { + return HELMET_MODEL; + } + case CHEST: { + if (entity instanceof AbstractClientPlayerEntity + && ((AbstractClientPlayerEntity) entity).getModel().equals("slim")) { + CHEST_MODEL_SLIM.setAttributes(defaultModel); + return CHEST_MODEL_SLIM; } + CHEST_MODEL.setAttributes(defaultModel); + return CHEST_MODEL; + } + case LEGS: { + return LEGGINGS_MODEL; + } + case FEET: { + BOOTS_MODEL.setAttributes(defaultModel); + return BOOTS_MODEL; + } + default: { + return defaultModel; + } } } - + public Iterable getRenderedItems() { - return Lists.newArrayList(EndItems.CRYSTALITE_HELMET, EndItems.CRYSTALITE_CHESTPLATE, EndItems.CRYSTALITE_LEGGINGS, EndItems.CRYSTALITE_BOOTS); + return Lists.newArrayList(EndItems.CRYSTALITE_HELMET, EndItems.CRYSTALITE_CHESTPLATE, + EndItems.CRYSTALITE_LEGGINGS, EndItems.CRYSTALITE_BOOTS); } - + private boolean isStackValid(ItemStack stack) { - return stack.getItem() == EndItems.CRYSTALITE_HELMET || - stack.getItem() == EndItems.CRYSTALITE_CHESTPLATE || - stack.getItem() == EndItems.CRYSTALITE_LEGGINGS || - stack.getItem() == EndItems.CRYSTALITE_BOOTS; + return stack.getItem() == EndItems.CRYSTALITE_HELMET || stack.getItem() == EndItems.CRYSTALITE_CHESTPLATE + || stack.getItem() == EndItems.CRYSTALITE_LEGGINGS || stack.getItem() == EndItems.CRYSTALITE_BOOTS; } } diff --git a/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java b/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java index c0c05698..7b476aa5 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java @@ -7,13 +7,13 @@ import com.google.common.collect.Lists; import net.minecraft.client.model.ModelPart; import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.entity.LivingEntity; +import net.minecraft.world.entity.LivingEntity; public class CrystaliteBootsModel extends BipedEntityModel { public ModelPart leftBoot; public ModelPart rightBoot; - + public CrystaliteBootsModel(float scale) { super(RenderLayer::getEntityTranslucent, scale, 0.0F, 64, 48); this.leftBoot = new ModelPart(this, 0, 32); @@ -23,7 +23,7 @@ public class CrystaliteBootsModel extends BipedEntityModel { this.rightBoot.addCuboid(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.25F); this.rightBoot.setPivot(-1.9F, 12.0F, 0.0F); } - + @Override public void setAttributes(BipedEntityModel bipedEntityModel) { super.setAttributes(bipedEntityModel); @@ -35,7 +35,7 @@ public class CrystaliteBootsModel extends BipedEntityModel { protected Iterable getHeadParts() { return Collections::emptyIterator; } - + @Override protected Iterable getBodyParts() { return Lists.newArrayList(leftBoot, rightBoot); diff --git a/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java b/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java index 5a08f9d0..51b07d02 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java @@ -8,7 +8,7 @@ import net.minecraft.client.model.ModelPart; import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.entity.model.BipedEntityModel; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.LivingEntity; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.util.Arm; public class CrystaliteChestplateModel extends BipedEntityModel { @@ -16,7 +16,7 @@ public class CrystaliteChestplateModel extends BipedEntityModel { public ModelPart leftShoulder; public ModelPart rightShoulder; private boolean thinArms; - + public CrystaliteChestplateModel(float scale, boolean thinArms) { super(RenderLayer::getEntityTranslucent, scale, 0.0F, 64, 48); this.thinArms = thinArms; @@ -41,29 +41,29 @@ public class CrystaliteChestplateModel extends BipedEntityModel { this.rightShoulder.setPivot(-5.0F, 2.0F, 10.0F); } } - + @Override public void setAttributes(BipedEntityModel bipedEntityModel) { super.setAttributes(bipedEntityModel); this.leftShoulder.copyPositionAndRotation(leftArm); this.rightShoulder.copyPositionAndRotation(rightArm); } - + @Override protected Iterable getHeadParts() { return Collections::emptyIterator; } - + @Override protected Iterable getBodyParts() { return Lists.newArrayList(torso, leftShoulder, rightShoulder); } - + @Override public void setArmAngle(Arm arm, MatrixStack matrices) { ModelPart modelPart = this.getArm(arm); if (this.thinArms) { - float f = 0.5F * (float)(arm == Arm.RIGHT ? 1 : -1); + float f = 0.5F * (float) (arm == Arm.RIGHT ? 1 : -1); modelPart.pivotX += f; modelPart.rotate(matrices); modelPart.pivotX -= f; diff --git a/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java b/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java index 6d759695..fc82b4e7 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java @@ -9,7 +9,7 @@ import net.fabricmc.api.Environment; import net.minecraft.client.model.ModelPart; import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.entity.LivingEntity; +import net.minecraft.world.entity.LivingEntity; @Environment(EnvType.CLIENT) public class CrystaliteHelmetModel extends BipedEntityModel { @@ -20,12 +20,12 @@ public class CrystaliteHelmetModel extends BipedEntityModel { this.helmet.addCuboid(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, scale + 0.5F); this.helmet.setPivot(0.0F, 0.0F, 0.0F); } - + @Override protected Iterable getHeadParts() { return Collections::emptyIterator; } - + @Override protected Iterable getBodyParts() { return Lists.newArrayList(helmet); diff --git a/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java b/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java index ea5d80fe..d4bd17c9 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java @@ -7,7 +7,7 @@ import com.google.common.collect.Lists; import net.minecraft.client.model.ModelPart; import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.entity.LivingEntity; +import net.minecraft.world.entity.LivingEntity; public class CrystaliteLeggingsModel extends BipedEntityModel { @@ -28,7 +28,7 @@ public class CrystaliteLeggingsModel extends BipedEntityModel { protected Iterable getHeadParts() { return Collections::emptyIterator; } - + @Override protected Iterable getBodyParts() { return Lists.newArrayList(torso, rightLeg, leftLeg); diff --git a/src/main/java/ru/betterend/item/tool/EndAxeItem.java b/src/main/java/ru/betterend/item/tool/EndAxeItem.java index 77e1e53a..047683b5 100644 --- a/src/main/java/ru/betterend/item/tool/EndAxeItem.java +++ b/src/main/java/ru/betterend/item/tool/EndAxeItem.java @@ -2,29 +2,29 @@ package ru.betterend.item.tool; import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.BlockState; -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.AxeItem; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ToolMaterial; -import net.minecraft.tag.Tag; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.AxeItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Tier; +import net.minecraft.tags.Tag; import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; public class EndAxeItem extends AxeItem implements DynamicAttributeTool, Patterned { - public EndAxeItem(ToolMaterial material, float attackDamage, float attackSpeed, Settings settings) { + public EndAxeItem(Tier material, float attackDamage, float attackSpeed, Properties settings) { super(material, attackDamage, attackSpeed, settings); } @Override public int getMiningLevel(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { if (tag.equals(FabricToolTags.AXES)) { - return this.getMaterial().getMiningLevel(); + return this.getTier().getLevel(); } return 0; } - + @Override public String getModelPattern(String name) { return Patterns.createJson(Patterns.ITEM_HANDHELD, name); diff --git a/src/main/java/ru/betterend/item/tool/EndHammerItem.java b/src/main/java/ru/betterend/item/tool/EndHammerItem.java index 004e05c4..ca6d5998 100644 --- a/src/main/java/ru/betterend/item/tool/EndHammerItem.java +++ b/src/main/java/ru/betterend/item/tool/EndHammerItem.java @@ -9,50 +9,51 @@ import com.google.common.collect.Sets; import io.netty.util.internal.ThreadLocalRandom; import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.attribute.EntityAttribute; -import net.minecraft.entity.attribute.EntityAttributeModifier; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.MiningToolItem; -import net.minecraft.item.ToolMaterial; -import net.minecraft.tag.Tag; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.World; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.attribute.EntityAttribute; +import net.minecraft.world.entity.attribute.EntityAttributeModifier; +import net.minecraft.world.entity.attribute.EntityAttributes; +import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.MiningToolItem; +import net.minecraft.world.item.Tier; +import net.minecraft.tags.Tag; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.level.Level; import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; import ru.betterend.registry.EndTags; public class EndHammerItem extends MiningToolItem implements DynamicAttributeTool, Patterned { - public final static UUID ATTACK_KNOCKBACK_MODIFIER_ID = MathHelper.randomUuid(ThreadLocalRandom.current()); - + public final static UUID ATTACK_KNOCKBACK_MODIFIER_ID = Mth.randomUuid(ThreadLocalRandom.current()); + private final Multimap attributeModifiers; - public EndHammerItem(ToolMaterial material, float attackDamage, float attackSpeed, double knockback, Settings settings) { + public EndHammerItem(Tier material, float attackDamage, float attackSpeed, double knockback, Properties settings) { super(attackDamage, attackSpeed, material, Sets.newHashSet(), settings); Builder builder = ImmutableMultimap.builder(); - builder.put(EntityAttributes.GENERIC_ATTACK_DAMAGE, new EntityAttributeModifier(ATTACK_DAMAGE_MODIFIER_ID, "Weapon modifier", attackDamage + material.getAttackDamage(), EntityAttributeModifier.Operation.ADDITION)); - builder.put(EntityAttributes.GENERIC_ATTACK_SPEED, new EntityAttributeModifier(ATTACK_SPEED_MODIFIER_ID, "Weapon modifier", attackSpeed, EntityAttributeModifier.Operation.ADDITION)); - builder.put(EntityAttributes.GENERIC_ATTACK_KNOCKBACK, new EntityAttributeModifier(ATTACK_KNOCKBACK_MODIFIER_ID, "Weapon modifier", knockback, EntityAttributeModifier.Operation.ADDITION)); + builder.put(EntityAttributes.GENERIC_ATTACK_DAMAGE, + new EntityAttributeModifier(ATTACK_DAMAGE_MODIFIER_ID, "Weapon modifier", + attackDamage + material.getAttackDamage(), EntityAttributeModifier.Operation.ADDITION)); + builder.put(EntityAttributes.GENERIC_ATTACK_SPEED, new EntityAttributeModifier(ATTACK_SPEED_MODIFIER_ID, + "Weapon modifier", attackSpeed, EntityAttributeModifier.Operation.ADDITION)); + builder.put(EntityAttributes.GENERIC_ATTACK_KNOCKBACK, new EntityAttributeModifier(ATTACK_KNOCKBACK_MODIFIER_ID, + "Weapon modifier", knockback, EntityAttributeModifier.Operation.ADDITION)); this.attributeModifiers = builder.build(); } @Override - public boolean canMine(BlockState state, World world, BlockPos pos, PlayerEntity miner) { - return state.getMaterial().equals(Material.STONE) || - state.getMaterial().equals(Material.GLASS) || - state.isOf(Blocks.DIAMOND_BLOCK) || - state.isOf(Blocks.EMERALD_BLOCK) || - state.isOf(Blocks.LAPIS_BLOCK) || - state.isOf(Blocks.REDSTONE_BLOCK); + public boolean canMine(BlockState state, Level world, BlockPos pos, PlayerEntity miner) { + return state.getMaterial().equals(Material.STONE) || state.getMaterial().equals(Material.GLASS) + || state.is(Blocks.DIAMOND_BLOCK) || state.is(Blocks.EMERALD_BLOCK) || state.is(Blocks.LAPIS_BLOCK) + || state.is(Blocks.REDSTONE_BLOCK); } @Override @@ -60,12 +61,12 @@ public class EndHammerItem extends MiningToolItem implements DynamicAttributeToo stack.damage(1, attacker, ((entity) -> { entity.sendEquipmentBreakStatus(EquipmentSlot.MAINHAND); })); - + return true; } @Override - public boolean postMine(ItemStack stack, World world, BlockState state, BlockPos pos, LivingEntity miner) { + public boolean postMine(ItemStack stack, Level world, BlockState state, BlockPos pos, LivingEntity miner) { if (state.getHardness(world, pos) != 0.0F) { stack.damage(1, miner, ((entity) -> { entity.sendEquipmentBreakStatus(EquipmentSlot.MAINHAND); @@ -76,54 +77,58 @@ public class EndHammerItem extends MiningToolItem implements DynamicAttributeToo } @Override - public float getMiningSpeedMultiplier(ItemStack stack, BlockState state) { + public float getDestroySpeed(ItemStack stack, BlockState state) { if (state.getMaterial().equals(Material.GLASS)) { - return this.getMaterial().getMiningSpeedMultiplier() * 2.0F; + return this.getMaterial().getDestroySpeed() * 2.0F; } - if (isEffectiveOn(state)) { + if (isCorrectToolForDrops(state)) { float mult = 1.0F; - if (state.isOf(Blocks.DIAMOND_BLOCK) || state.isOf(Blocks.EMERALD_BLOCK) || state.isOf(Blocks.LAPIS_BLOCK) || state.isOf(Blocks.REDSTONE_BLOCK)) { - mult = this.getMaterial().getMiningSpeedMultiplier(); + if (state.is(Blocks.DIAMOND_BLOCK) || state.is(Blocks.EMERALD_BLOCK) || state.is(Blocks.LAPIS_BLOCK) + || state.is(Blocks.REDSTONE_BLOCK)) { + mult = this.getMaterial().getDestroySpeed(); } else { - mult = this.getMaterial().getMiningSpeedMultiplier() / 2.0F; + mult = this.getMaterial().getDestroySpeed() / 2.0F; } return mult > 1.0F ? mult : 1.0F; } return 1.0F; } - + @Override - public float getMiningSpeedMultiplier(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { + public float getDestroySpeed(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { if (tag.equals(EndTags.HAMMERS)) { - return this.getMiningSpeedMultiplier(stack, state); + return this.getDestroySpeed(stack, state); } return 1.0F; } - + @Override public int getMiningLevel(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { if (tag.equals(EndTags.HAMMERS)) { - return this.getMaterial().getMiningLevel(); + return this.getTier().getLevel(); } return 0; } @Override - public boolean isEffectiveOn(BlockState state) { + public boolean isCorrectToolForDrops(BlockState state) { if (state.getMaterial().equals(Material.GLASS)) { return true; } - if (!state.isOf(Blocks.REDSTONE_BLOCK) && !state.isOf(Blocks.DIAMOND_BLOCK) && !state.isOf(Blocks.EMERALD_BLOCK) && !state.isOf(Blocks.LAPIS_BLOCK) && !state.getMaterial().equals(Material.STONE)) { + if (!state.is(Blocks.REDSTONE_BLOCK) && !state.is(Blocks.DIAMOND_BLOCK) && !state.is(Blocks.EMERALD_BLOCK) + && !state.is(Blocks.LAPIS_BLOCK) && !state.getMaterial().equals(Material.STONE)) { return false; } - int level = this.getMaterial().getMiningLevel(); - if (state.isOf(Blocks.IRON_ORE) || state.isOf(Blocks.LAPIS_BLOCK) || state.isOf(Blocks.LAPIS_ORE)) { + int level = this.getTier().getLevel(); + if (state.is(Blocks.IRON_ORE) || state.is(Blocks.LAPIS_BLOCK) || state.is(Blocks.LAPIS_ORE)) { return level >= 1; } - if (state.isOf(Blocks.DIAMOND_BLOCK) && !state.isOf(Blocks.DIAMOND_ORE) || state.isOf(Blocks.EMERALD_ORE) || state.isOf(Blocks.EMERALD_BLOCK) || state.isOf(Blocks.GOLD_ORE) || state.isOf(Blocks.REDSTONE_ORE)) { + if (state.is(Blocks.DIAMOND_BLOCK) && !state.is(Blocks.DIAMOND_ORE) || state.is(Blocks.EMERALD_ORE) + || state.is(Blocks.EMERALD_BLOCK) || state.is(Blocks.GOLD_ORE) || state.is(Blocks.REDSTONE_ORE)) { return level >= 2; } - if (state.isOf(Blocks.OBSIDIAN) || state.isOf(Blocks.CRYING_OBSIDIAN) || state.isOf(Blocks.RESPAWN_ANCHOR) || state.isOf(Blocks.ANCIENT_DEBRIS)) { + if (state.is(Blocks.OBSIDIAN) || state.is(Blocks.CRYING_OBSIDIAN) || state.is(Blocks.RESPAWN_ANCHOR) + || state.is(Blocks.ANCIENT_DEBRIS)) { return level >= 3; } return true; @@ -133,7 +138,7 @@ public class EndHammerItem extends MiningToolItem implements DynamicAttributeToo public Multimap getAttributeModifiers(EquipmentSlot slot) { return slot == EquipmentSlot.MAINHAND ? this.attributeModifiers : super.getAttributeModifiers(slot); } - + @Override public String getModelPattern(String name) { return Patterns.createJson(Patterns.ITEM_HANDHELD, name); diff --git a/src/main/java/ru/betterend/item/tool/EndHoeItem.java b/src/main/java/ru/betterend/item/tool/EndHoeItem.java index ec635fc7..ca920b52 100644 --- a/src/main/java/ru/betterend/item/tool/EndHoeItem.java +++ b/src/main/java/ru/betterend/item/tool/EndHoeItem.java @@ -1,15 +1,15 @@ package ru.betterend.item.tool; -import net.minecraft.item.HoeItem; -import net.minecraft.item.ToolMaterial; +import net.minecraft.world.item.HoeItem; +import net.minecraft.world.item.Tier; import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; public class EndHoeItem extends HoeItem implements Patterned { - public EndHoeItem(ToolMaterial material, int attackDamage, float attackSpeed, Settings settings) { + public EndHoeItem(Tier material, int attackDamage, float attackSpeed, Properties settings) { super(material, attackDamage, attackSpeed, settings); } - + @Override public String getModelPattern(String name) { return Patterns.createJson(Patterns.ITEM_HANDHELD, name); diff --git a/src/main/java/ru/betterend/item/tool/EndPickaxeItem.java b/src/main/java/ru/betterend/item/tool/EndPickaxeItem.java index d30eb891..4fa85f5e 100644 --- a/src/main/java/ru/betterend/item/tool/EndPickaxeItem.java +++ b/src/main/java/ru/betterend/item/tool/EndPickaxeItem.java @@ -4,39 +4,41 @@ import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl; import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl.Entry; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.PickaxeItem; -import net.minecraft.item.ToolMaterial; -import net.minecraft.tag.Tag; +import net.minecraft.tags.Tag; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.PickaxeItem; +import net.minecraft.world.item.Tier; import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; public class EndPickaxeItem extends PickaxeItem implements DynamicAttributeTool, Patterned { - public EndPickaxeItem(ToolMaterial material, int attackDamage, float attackSpeed, Settings settings) { + public EndPickaxeItem(Tier material, int attackDamage, float attackSpeed, Properties settings) { super(material, attackDamage, attackSpeed, settings); } - + @Override public int getMiningLevel(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { if (tag.equals(FabricToolTags.PICKAXES)) { - return this.getMaterial().getMiningLevel(); + return this.getTier().getLevel(); } return 0; } - + @Override - public float getMiningSpeedMultiplier(ItemStack stack, BlockState state) { - if (this.getMaterial().getMiningLevel() > 2 && state.getMaterial().equals(Blocks.END_STONE.getDefaultState().getMaterial())) { - return this.miningSpeed * 3; + public float getDestroySpeed(ItemStack stack, BlockState state) { + if (this.getTier().getLevel() > 2 + && state.getMaterial().equals(Blocks.END_STONE.defaultBlockState().getMaterial())) { + return this.speed * 3; } Entry entry = ToolManagerImpl.entryNullable(state.getBlock()); - return (entry != null && entry.getMiningLevel(FabricToolTags.PICKAXES) >= 0) ? this.miningSpeed : super.getMiningSpeedMultiplier(stack, state); + return (entry != null && entry.getMiningLevel(FabricToolTags.PICKAXES) >= 0) ? speed + : super.getDestroySpeed(stack, state); } - + @Override public String getModelPattern(String name) { return Patterns.createJson(Patterns.ITEM_HANDHELD, name); diff --git a/src/main/java/ru/betterend/item/tool/EndShovelItem.java b/src/main/java/ru/betterend/item/tool/EndShovelItem.java index a0b9de67..4d36aa49 100644 --- a/src/main/java/ru/betterend/item/tool/EndShovelItem.java +++ b/src/main/java/ru/betterend/item/tool/EndShovelItem.java @@ -4,35 +4,36 @@ import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl; import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl.Entry; -import net.minecraft.block.BlockState; -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ShovelItem; -import net.minecraft.item.ToolMaterial; -import net.minecraft.tag.Tag; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ShovelItem; +import net.minecraft.world.item.Tier; +import net.minecraft.tags.Tag; import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; public class EndShovelItem extends ShovelItem implements DynamicAttributeTool, Patterned { - public EndShovelItem(ToolMaterial material, float attackDamage, float attackSpeed, Settings settings) { + public EndShovelItem(Tier material, float attackDamage, float attackSpeed, Properties settings) { super(material, attackDamage, attackSpeed, settings); } - + @Override public int getMiningLevel(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { if (tag.equals(FabricToolTags.SHOVELS)) { - return this.getMaterial().getMiningLevel(); + return this.getTier().getLevel(); } return 0; } - + @Override - public float getMiningSpeedMultiplier(ItemStack stack, BlockState state) { + public float getDestroySpeed(ItemStack stack, BlockState state) { Entry entry = ToolManagerImpl.entryNullable(state.getBlock()); - return (entry != null && entry.getMiningLevel(FabricToolTags.SHOVELS) >= 0) ? this.miningSpeed : super.getMiningSpeedMultiplier(stack, state); + return (entry != null && entry.getMiningLevel(FabricToolTags.SHOVELS) >= 0) ? speed + : super.getDestroySpeed(stack, state); } - + @Override public String getModelPattern(String name) { return Patterns.createJson(Patterns.ITEM_HANDHELD, name); diff --git a/src/main/java/ru/betterend/item/tool/EndSwordItem.java b/src/main/java/ru/betterend/item/tool/EndSwordItem.java index 45f4f8dc..679ae06c 100644 --- a/src/main/java/ru/betterend/item/tool/EndSwordItem.java +++ b/src/main/java/ru/betterend/item/tool/EndSwordItem.java @@ -1,16 +1,16 @@ package ru.betterend.item.tool; import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; -import net.minecraft.item.SwordItem; -import net.minecraft.item.ToolMaterial; +import net.minecraft.world.item.SwordItem; +import net.minecraft.world.item.Tier; import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; public class EndSwordItem extends SwordItem implements DynamicAttributeTool, Patterned { - public EndSwordItem(ToolMaterial material, int attackDamage, float attackSpeed, Settings settings) { + public EndSwordItem(Tier material, int attackDamage, float attackSpeed, Properties settings) { super(material, attackDamage, attackSpeed, settings); } - + @Override public String getModelPattern(String name) { return Patterns.createJson(Patterns.ITEM_HANDHELD, name); diff --git a/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java index a47b4c53..a37d7cee 100644 --- a/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java +++ b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java @@ -16,13 +16,13 @@ import net.minecraft.client.gui.widget.AbstractButtonWidget; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.TextFieldWidget; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.item.ItemStack; +import net.minecraft.world.entity.player.PlayerInventory; +import net.minecraft.world.item.ItemStack; import net.minecraft.screen.AnvilScreenHandler; import net.minecraft.screen.ScreenHandler; import net.minecraft.text.LiteralText; import net.minecraft.text.Text; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import ru.betterend.interfaces.AnvilScreenHandlerExtended; @Mixin(AnvilScreen.class) @@ -30,12 +30,12 @@ public class AnvilScreenMixin extends ForgingScreen { @Shadow private TextFieldWidget nameField; - + private final List be_buttons = Lists.newArrayList(); private AnvilScreenHandlerExtended anvilHandler; - + public AnvilScreenMixin(AnvilScreenHandler handler, PlayerInventory playerInventory, Text title, - Identifier texture) { + ResourceLocation texture) { super(handler, playerInventory, title, texture); } @@ -43,19 +43,19 @@ public class AnvilScreenMixin extends ForgingScreen { protected void be_setup(CallbackInfo info) { this.be_buttons.clear(); int x = (width - backgroundWidth) / 2; - int y = (height - backgroundHeight) / 2; - this.anvilHandler = (AnvilScreenHandlerExtended) this.handler; - this.be_buttons.add(new ButtonWidget(x + 8, y + 45, 15, 20, new LiteralText("<"), (b) -> be_previousRecipe())); + int y = (height - backgroundHeight) / 2; + this.anvilHandler = (AnvilScreenHandlerExtended) this.handler; + this.be_buttons.add(new ButtonWidget(x + 8, y + 45, 15, 20, new LiteralText("<"), (b) -> be_previousRecipe())); this.be_buttons.add(new ButtonWidget(x + 154, y + 45, 15, 20, new LiteralText(">"), (b) -> be_nextRecipe())); } - + @Inject(method = "renderForeground", at = @At("TAIL")) protected void be_renderForeground(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo info) { this.be_buttons.forEach(button -> { button.render(matrices, mouseX, mouseY, delta); }); } - + @Inject(method = "onSlotUpdate", at = @At("HEAD"), cancellable = true) public void be_onSlotUpdate(ScreenHandler handler, int slotId, ItemStack stack, CallbackInfo info) { AnvilScreenHandlerExtended anvilHandler = (AnvilScreenHandlerExtended) handler; @@ -71,15 +71,15 @@ public class AnvilScreenMixin extends ForgingScreen { this.be_buttons.forEach(button -> button.visible = false); } } - + private void be_nextRecipe() { this.anvilHandler.be_nextRecipe(); } - + private void be_previousRecipe() { this.anvilHandler.be_previousRecipe(); } - + @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { if (client != null) { diff --git a/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java b/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java index 26d59d3a..aa74a438 100644 --- a/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java @@ -11,15 +11,15 @@ import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.render.BackgroundRenderer; import net.minecraft.client.render.Camera; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.effect.StatusEffectInstance; +import net.minecraft.world.entity.effect.StatusEffects; import net.minecraft.fluid.FluidState; import net.minecraft.util.Util; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.World; +import net.minecraft.util.Mth; +import net.minecraft.world.level.Level; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome.Category; import ru.betterend.client.ClientOptions; @@ -33,23 +33,25 @@ public class BackgroundRendererMixin { private static float fogDensity; private static float lerp; private static long time; - + @Shadow private static float red; @Shadow private static float green; @Shadow private static float blue; - + @Inject(method = "render", at = @At("RETURN")) - private static void be_onRender(Camera camera, float tickDelta, ClientWorld world, int i, float f, CallbackInfo info) { + private static void be_onRender(Camera camera, float tickDelta, ClientLevel world, int i, float f, + CallbackInfo info) { long l = Util.getMeasuringTimeMs() - time; time += l; lerp += l * 0.001F; - if (lerp > 1) lerp = 1; - + if (lerp > 1) + lerp = 1; + FluidState fluidState = camera.getSubmergedFluidState(); - if (fluidState.isEmpty() && world.getRegistryKey().equals(World.END)) { + if (fluidState.isEmpty() && world.dimension().equals(Level.END)) { Entity entity = camera.getFocusedEntity(); boolean skip = false; if (entity instanceof LivingEntity) { @@ -62,20 +64,21 @@ public class BackgroundRendererMixin { blue *= 4; } } - + BackgroundInfo.red = red; BackgroundInfo.green = green; BackgroundInfo.blue = blue; } - + @Inject(method = "applyFog", at = @At("HEAD"), cancellable = true) - private static void be_fogDensity(Camera camera, BackgroundRenderer.FogType fogType, float viewDistance, boolean thickFog, CallbackInfo info) { + private static void be_fogDensity(Camera camera, BackgroundRenderer.FogType fogType, float viewDistance, + boolean thickFog, CallbackInfo info) { Entity entity = camera.getFocusedEntity(); Biome biome = entity.world.getBiome(entity.getBlockPos()); FluidState fluidState = camera.getSubmergedFluidState(); if (ClientOptions.useFogDensity() && biome.getCategory() == Category.THEEND && fluidState.isEmpty()) { EndBiome endBiome = EndBiomes.getRenderBiome(biome); - + if (fogDensity == 0) { fogDensity = endBiome.getFogDensity(); lastFogDensity = fogDensity; @@ -85,12 +88,12 @@ public class BackgroundRendererMixin { fogDensity = endBiome.getFogDensity(); lerp = 0; } - - float fog = MathHelper.lerp(lerp, lastFogDensity, fogDensity); + + float fog = Mth.lerp(lerp, lastFogDensity, fogDensity); BackgroundInfo.fog = fog; float start = viewDistance * 0.75F / fog; float end = viewDistance / fog; - + if (entity instanceof LivingEntity) { LivingEntity le = (LivingEntity) entity; StatusEffectInstance effect = le.getStatusEffect(StatusEffects.BLINDNESS); @@ -100,19 +103,17 @@ public class BackgroundRendererMixin { start = 0; end *= 0.03F; BackgroundInfo.blindness = 1; - } - else { + } else { float delta = (float) duration / 20F; BackgroundInfo.blindness = delta; - start = MathHelper.lerp(delta, start, 0); - end = MathHelper.lerp(delta, end, end * 0.03F); + start = Mth.lerp(delta, start, 0); + end = Mth.lerp(delta, end, end * 0.03F); } - } - else { + } else { BackgroundInfo.blindness = 0; } } - + RenderSystem.fogStart(start); RenderSystem.fogEnd(end); RenderSystem.fogMode(GlStateManager.FogMode.LINEAR); diff --git a/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java b/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java index 33f777be..6e0e074b 100644 --- a/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java +++ b/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java @@ -10,9 +10,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.MinecraftClient; import net.minecraft.client.color.world.BiomeColors; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.BlockRenderView; import ru.betterend.client.ClientOptions; import ru.betterend.registry.EndBlocks; @@ -25,17 +25,17 @@ public class BiomeColorsMixin { private static final int STREAM_COLOR = MHelper.color(105, 213, 244); private static final Point[] OFFSETS; private static final boolean HAS_SODIUM; - + @Inject(method = "getWaterColor", at = @At("RETURN"), cancellable = true) private static void be_getWaterColor(BlockRenderView world, BlockPos pos, CallbackInfoReturnable info) { if (ClientOptions.useSulfurWaterColor()) { BlockRenderView view = HAS_SODIUM ? MinecraftClient.getInstance().world : world; - Mutable mut = new Mutable(); + MutableBlockPos mut = new MutableBlockPos(); mut.setY(pos.getY()); for (int i = 0; i < OFFSETS.length; i++) { mut.setX(pos.getX() + OFFSETS[i].x); mut.setZ(pos.getZ() + OFFSETS[i].y); - if ((view.getBlockState(mut).isOf(EndBlocks.BRIMSTONE))) { + if ((view.getBlockState(mut).is(EndBlocks.BRIMSTONE))) { info.setReturnValue(i < 16 ? STREAM_COLOR : POISON_COLOR); info.cancel(); return; @@ -43,10 +43,10 @@ public class BiomeColorsMixin { } } } - + static { HAS_SODIUM = FabricLoader.getInstance().isModLoaded("sodium"); - + OFFSETS = new Point[20]; for (int i = 0; i < 3; i++) { int p = i - 1; @@ -55,7 +55,7 @@ public class BiomeColorsMixin { OFFSETS[i + 6] = new Point(-2, p); OFFSETS[i + 9] = new Point(2, p); } - + for (int i = 0; i < 4; i++) { int inner = i + 16; Direction dir = BlocksHelper.HORIZONTAL[i]; diff --git a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java index 8899eb4d..bd858608 100644 --- a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java @@ -6,23 +6,22 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.minecraft.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.client.world.ClientWorld; +import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.network.NetworkThreadUtils; import net.minecraft.network.packet.s2c.play.SignEditorOpenS2CPacket; import ru.betterend.blocks.entities.ESignBlockEntity; import ru.betterend.client.gui.BlockSignEditScreen; @Mixin(ClientPlayNetworkHandler.class) -public class ClientPlayNetworkHandlerMixin -{ +public class ClientPlayNetworkHandlerMixin { @Shadow private MinecraftClient client; @Shadow - private ClientWorld world; + private ClientLevel world; @Inject(method = "onSignEditorOpen", at = @At(value = "HEAD"), cancellable = true) public void be_openSignEditor(SignEditorOpenS2CPacket packet, CallbackInfo info) { diff --git a/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java b/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java index d4185133..90797794 100644 --- a/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java @@ -7,7 +7,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.client.recipebook.ClientRecipeBook; import net.minecraft.client.recipebook.RecipeBookGroup; -import net.minecraft.recipe.Recipe; +import net.minecraft.world.item.crafting.Recipe; import ru.betterend.interfaces.BetterEndRecipe; import ru.betterend.recipe.builders.AlloyingRecipe; diff --git a/src/main/java/ru/betterend/mixin/client/EnchantingTableBlockMixin.java b/src/main/java/ru/betterend/mixin/client/EnchantingTableBlockMixin.java index ee3c03aa..dbc78fec 100644 --- a/src/main/java/ru/betterend/mixin/client/EnchantingTableBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/client/EnchantingTableBlockMixin.java @@ -7,22 +7,22 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.EnchantingTableBlock; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.EnchantingTableBlock; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; import ru.betterend.registry.EndTags; @Mixin(EnchantingTableBlock.class) public abstract class EnchantingTableBlockMixin extends Block { - public EnchantingTableBlockMixin(Settings settings) { + public EnchantingTableBlockMixin(Properties settings) { super(settings); } - @Inject(method = "randomDisplayTick", at = @At(value = "TAIL")) - private void be_onRandomDisplayTick(BlockState state, World world, BlockPos pos, Random random, CallbackInfo info) { + @Inject(method = "animateTick", at = @At(value = "TAIL")) + private void be_onRandomDisplayTick(BlockState state, Level world, BlockPos pos, Random random, CallbackInfo info) { for (int px = -2; px <= 2; ++px) { for (int pz = -2; pz <= 2; ++pz) { if (px > -2 && px < 2 && pz == -1) { @@ -30,12 +30,14 @@ public abstract class EnchantingTableBlockMixin extends Block { } if (random.nextInt(16) == 0) { for (int py = 0; py <= 1; ++py) { - BlockPos blockPos = pos.add(px, py, pz); + BlockPos blockPos = pos.offset(px, py, pz); if (world.getBlockState(blockPos).isIn(EndTags.BOOKSHELVES)) { - if (!world.isAir(pos.add(px / 2, 0, pz / 2))) { + if (!world.isAir(pos.offset(px / 2, 0, pz / 2))) { break; } - world.addParticle(ParticleTypes.ENCHANT, pos.getX() + 0.5, pos.getY() + 2.0, pos.getZ() + 0.5, px + random.nextFloat() - 0.5, py - random.nextFloat() - 1.0, pz + random.nextFloat() - 0.5); + world.addParticle(ParticleTypes.ENCHANT, pos.getX() + 0.5, pos.getY() + 2.0, + pos.getZ() + 0.5, px + random.nextFloat() - 0.5, py - random.nextFloat() - 1.0, + pz + random.nextFloat() - 0.5); } } } diff --git a/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java b/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java index 48a734f9..97c63bb2 100644 --- a/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java +++ b/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java @@ -17,10 +17,10 @@ import net.minecraft.client.gui.screen.CreditsScreen; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.sound.MusicType; -import net.minecraft.client.world.ClientWorld; +import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.sound.MusicSound; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.World; +import net.minecraft.core.Registry; +import net.minecraft.world.level.Level; import ru.betterend.interfaces.IColorProvider; import ru.betterend.util.MHelper; @@ -28,17 +28,17 @@ import ru.betterend.util.MHelper; public class MinecraftClientMixin { @Shadow public ClientPlayerEntity player; - + @Shadow public Screen currentScreen; - + @Shadow @Final public InGameHud inGameHud; - + @Shadow - public ClientWorld world; - + public ClientLevel world; + @Shadow @Final private BlockColors blockColors; @@ -46,27 +46,28 @@ public class MinecraftClientMixin { @Shadow @Final private ItemColors itemColors; - + @Inject(method = "*", at = @At("TAIL")) private void be_onInit(RunArgs args, CallbackInfo info) { Registry.BLOCK.forEach(block -> { if (block instanceof IColorProvider) { IColorProvider provider = (IColorProvider) block; - blockColors.registerColorProvider(provider.getProvider(), block); + blockColors.registerColorProvider(provider.getBlockProvider(), block); itemColors.register(provider.getItemProvider(), block.asItem()); } }); } - + @Inject(method = "getMusicType", at = @At("HEAD"), cancellable = true) private void be_getEndMusic(CallbackInfoReturnable info) { if (!(this.currentScreen instanceof CreditsScreen) && this.player != null) { - if (this.player.world.getRegistryKey() == World.END) { - if (this.inGameHud.getBossBarHud().shouldPlayDragonMusic() && MHelper.lengthSqr(this.player.getX(), this.player.getZ()) < 250000) { + if (this.player.world.dimension() == Level.END) { + if (this.inGameHud.getBossBarHud().shouldPlayDragonMusic() + && MHelper.lengthSqr(this.player.getX(), this.player.getZ()) < 250000) { info.setReturnValue(MusicType.DRAGON); - } - else { - MusicSound sound = (MusicSound) this.world.getBiomeAccess().method_27344(this.player.getBlockPos()).getMusic().orElse(MusicType.END); + } else { + MusicSound sound = (MusicSound) this.world.getBiomeAccess().method_27344(this.player.getBlockPos()) + .getMusic().orElse(MusicType.END); info.setReturnValue(sound); } info.cancel(); diff --git a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java index c3f922a4..5e4ed077 100644 --- a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java @@ -13,14 +13,14 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.block.Block; +import net.minecraft.world.level.block.Block; import net.minecraft.client.render.model.ModelLoader; import net.minecraft.client.render.model.json.JsonUnbakedModel; -import net.minecraft.item.Item; +import net.minecraft.world.item.Item; import net.minecraft.resource.Resource; import net.minecraft.resource.ResourceManager; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.BetterEnd; import ru.betterend.patterns.Patterned; import ru.betterend.world.generator.GeneratorOptions; @@ -30,11 +30,11 @@ public class ModelLoaderMixin { @Final @Shadow private ResourceManager resourceManager; - + @Inject(method = "loadModelFromJson", at = @At("HEAD"), cancellable = true) - private void be_loadModelPattern(Identifier id, CallbackInfoReturnable info) { + private void be_loadModelPattern(ResourceLocation id, CallbackInfoReturnable info) { if (id.getNamespace().equals(BetterEnd.MOD_ID)) { - Identifier modelId = new Identifier(id.getNamespace(), "models/" + id.getPath() + ".json"); + ResourceLocation modelId = new ResourceLocation(id.getNamespace(), "models/" + id.getPath() + ".json"); JsonUnbakedModel model; try (Resource resource = this.resourceManager.getResource(modelId)) { Reader reader = new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8); @@ -44,7 +44,7 @@ public class ModelLoaderMixin { } catch (Exception ex) { String data[] = id.getPath().split("/"); if (data.length > 1) { - Identifier itemId = new Identifier(id.getNamespace(), data[1]); + ResourceLocation itemId = new ResourceLocation(id.getNamespace(), data[1]); Optional block = Registry.BLOCK.getOrEmpty(itemId); if (block.isPresent()) { if (block.get() instanceof Patterned) { @@ -64,8 +64,8 @@ public class ModelLoaderMixin { } } } - - private JsonUnbakedModel be_getModel(String data[], Identifier id, Patterned patterned) { + + private JsonUnbakedModel be_getModel(String data[], ResourceLocation id, Patterned patterned) { String pattern; if (id.getPath().contains("item")) { pattern = patterned.getModelPattern(id.getPath()); @@ -78,14 +78,16 @@ public class ModelLoaderMixin { } JsonUnbakedModel model = JsonUnbakedModel.deserialize(pattern); model.id = id.toString(); - + return model; } - + @ModifyVariable(method = "loadModel", ordinal = 2, at = @At(value = "INVOKE")) - public Identifier be_SwitchModel(Identifier id) { - if (GeneratorOptions.changeChorusPlant() && id.getNamespace().equals("minecraft") && id.getPath().startsWith("blockstates/") && id.getPath().contains("chorus") && !id.getPath().contains("custom_")) { - id = new Identifier(id.getPath().replace("chorus", "custom_chorus")); + public ResourceLocation be_SwitchModel(ResourceLocation id) { + if (GeneratorOptions.changeChorusPlant() && id.getNamespace().equals("minecraft") + && id.getPath().startsWith("blockstates/") && id.getPath().contains("chorus") + && !id.getPath().contains("custom_")) { + id = new ResourceLocation(id.getPath().replace("chorus", "custom_chorus")); } return id; } diff --git a/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java b/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java index c742bf18..1754ac85 100644 --- a/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java @@ -10,17 +10,18 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.google.gson.Gson; -import net.minecraft.block.Block; +import net.minecraft.world.level.block.Block; import net.minecraft.client.render.model.json.ModelVariantMap; import net.minecraft.util.JsonHelper; import ru.betterend.patterns.BlockPatterned; @Mixin(ModelVariantMap.class) public abstract class ModelVariantMapMixin { - + @Inject(method = "deserialize", at = @At("HEAD"), cancellable = true) - private static void be_deserializeBlockState(ModelVariantMap.DeserializationContext context, Reader reader, CallbackInfoReturnable info) { - Block block = context.getStateFactory().getDefaultState().getBlock(); + private static void be_deserializeBlockState(ModelVariantMap.DeserializationContext context, Reader reader, + CallbackInfoReturnable info) { + Block block = context.getStateFactory().defaultBlockState().getBlock(); if (block instanceof BlockPatterned) { String pattern = ((BlockPatterned) block).getStatesPattern(reader); Gson gson = ContextGsonAccessor.class.cast(context).getGson(); diff --git a/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java b/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java index fdd8b5ec..587da5f2 100644 --- a/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java @@ -14,8 +14,8 @@ import net.minecraft.client.sound.AbstractSoundInstance; import net.minecraft.client.sound.MusicTracker; import net.minecraft.client.sound.SoundInstance; import net.minecraft.sound.MusicSound; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.World; +import net.minecraft.util.Mth; +import net.minecraft.world.level.Level; import ru.betterend.client.ClientOptions; @Mixin(MusicTracker.class) @@ -23,21 +23,21 @@ public class MusicTrackerMixin { @Shadow @Final private MinecraftClient client; - + @Shadow @Final private Random random; - + @Shadow private SoundInstance current; - + @Shadow private int timeUntilNextSong; - + private static float volume = 1; private static float srcVolume = 0; private static long time; - + @Inject(method = "tick", at = @At("HEAD"), cancellable = true) public void be_onTick(CallbackInfo info) { if (ClientOptions.blendBiomeMusic()) { @@ -67,32 +67,33 @@ public class MusicTrackerMixin { time = 0; srcVolume = -1; this.client.getSoundManager().stop(this.current); - this.timeUntilNextSong = MathHelper.nextInt(this.random, 0, musicSound.getMinDelay() / 2); + this.timeUntilNextSong = Mth.nextInt(this.random, 0, musicSound.getMinDelay() / 2); this.current = null; } if (this.current == null && this.timeUntilNextSong-- <= 0) { this.play(musicSound); } info.cancel(); - } - else { + } else { volume = 1; } } } - + private boolean be_isInEnd() { - return client.world != null && client.world.getRegistryKey().equals(World.END); + return client.world != null && client.world.dimension().equals(Level.END); } - + private boolean be_shouldChangeSound(MusicSound musicSound) { - return current != null && !musicSound.getSound().getId().equals(this.current.getId()) && musicSound.shouldReplaceCurrentMusic(); + return current != null && !musicSound.getSound().getId().equals(this.current.getId()) + && musicSound.shouldReplaceCurrentMusic(); } - + private boolean be_checkNullSound(MusicSound musicSound) { return musicSound != null && musicSound.getSound() != null; } - + @Shadow - public void play(MusicSound type) {} + public void play(MusicSound type) { + } } diff --git a/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java b/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java index a1c5ad08..12a23843 100644 --- a/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java @@ -11,32 +11,29 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.google.common.collect.Lists; -import net.minecraft.block.Block; +import net.minecraft.world.level.block.Block; import net.minecraft.resource.NamespaceResourceManager; import net.minecraft.resource.Resource; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.BetterEnd; import ru.betterend.patterns.BlockPatterned; @Mixin(NamespaceResourceManager.class) public abstract class NamespaceResourceManagerMixin { - + @Shadow - public abstract Resource getResource(Identifier id); - - @Inject(method = "getAllResources", cancellable = true, at = @At( - value = "NEW", - target = "java/io/FileNotFoundException", - shift = Shift.BEFORE)) - public void be_getStatesPattern(Identifier id, CallbackInfoReturnable> info) { + public abstract Resource getResource(ResourceLocation id); + + @Inject(method = "getAllResources", cancellable = true, at = @At(value = "NEW", target = "java/io/FileNotFoundException", shift = Shift.BEFORE)) + public void be_getStatesPattern(ResourceLocation id, CallbackInfoReturnable> info) { if (id.getNamespace().equals(BetterEnd.MOD_ID)) { String[] data = id.getPath().split("/"); if (data.length > 1) { - Identifier blockId = BetterEnd.makeID(data[1].replace(".json", "")); + ResourceLocation blockId = BetterEnd.makeID(data[1].replace(".json", "")); Block block = Registry.BLOCK.get(blockId); if (block instanceof BlockPatterned) { - Identifier stateId = ((BlockPatterned) block).statePatternId(); + ResourceLocation stateId = ((BlockPatterned) block).statePatternId(); try { List resources = Lists.newArrayList(); Resource stateRes = this.getResource(stateId); diff --git a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java index 75f78bca..ebe07df1 100644 --- a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java @@ -26,8 +26,8 @@ import net.minecraft.client.render.WorldRenderer; import net.minecraft.client.texture.TextureManager; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.Vector3f; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.util.Identifier; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.math.Quaternion; import ru.betterend.BetterEnd; import ru.betterend.client.ClientOptions; @@ -36,12 +36,12 @@ import ru.betterend.util.MHelper; @Mixin(WorldRenderer.class) public class WorldRendererMixin { - private static final Identifier NEBULA_1 = BetterEnd.makeID("textures/sky/nebula_2.png"); - private static final Identifier NEBULA_2 = BetterEnd.makeID("textures/sky/nebula_3.png"); - private static final Identifier HORIZON = BetterEnd.makeID("textures/sky/nebula_1.png"); - private static final Identifier STARS = BetterEnd.makeID("textures/sky/stars.png"); - private static final Identifier FOG = BetterEnd.makeID("textures/sky/fog.png"); - + private static final ResourceLocation NEBULA_1 = BetterEnd.makeID("textures/sky/nebula_2.png"); + private static final ResourceLocation NEBULA_2 = BetterEnd.makeID("textures/sky/nebula_3.png"); + private static final ResourceLocation HORIZON = BetterEnd.makeID("textures/sky/nebula_1.png"); + private static final ResourceLocation STARS = BetterEnd.makeID("textures/sky/stars.png"); + private static final ResourceLocation FOG = BetterEnd.makeID("textures/sky/fog.png"); + private static VertexBuffer stars1; private static VertexBuffer stars2; private static VertexBuffer stars3; @@ -60,21 +60,21 @@ public class WorldRendererMixin { private static float blind02; private static float blind06; private static boolean directOpenGL = false; - + @Shadow @Final private MinecraftClient client; - + @Shadow @Final private TextureManager textureManager; - + @Shadow - private ClientWorld world; - + private ClientLevel world; + @Shadow private int ticks; - + @Inject(method = "*", at = @At("TAIL")) private void be_onInit(MinecraftClient client, BufferBuilderStorage bufferBuilders, CallbackInfo info) { be_initStars(); @@ -87,103 +87,106 @@ public class WorldRendererMixin { axis2.normalize(); axis3.normalize(); axis4.normalize(); - - directOpenGL = FabricLoader.getInstance().isModLoaded("optifabric") || FabricLoader.getInstance().isModLoaded("immersive_portals"); + + directOpenGL = FabricLoader.getInstance().isModLoaded("optifabric") + || FabricLoader.getInstance().isModLoaded("immersive_portals"); } - + @Inject(method = "renderSky", at = @At("HEAD"), cancellable = true) private void be_renderBetterEndSky(MatrixStack matrices, float tickDelta, CallbackInfo info) { if (ClientOptions.isCustomSky() && client.world.getSkyProperties().getSkyType() == SkyProperties.SkyType.END) { time = (ticks % 360000) * 0.000017453292F; time2 = time * 2; time3 = time * 3; - + BackgroundRenderer.setFogBlack(); RenderSystem.enableTexture(); - + if (directOpenGL) { GL11.glEnable(GL11.GL_ALPHA_TEST); GL11.glAlphaFunc(516, 0.0F); GL11.glEnable(GL11.GL_BLEND); RenderSystem.depthMask(false); - } - else { + } else { RenderSystem.enableAlphaTest(); RenderSystem.alphaFunc(516, 0.0F); RenderSystem.enableBlend(); } - + float blindA = 1F - BackgroundInfo.blindness; blind02 = blindA * 0.2F; blind06 = blindA * 0.6F; - + if (blindA > 0) { matrices.push(); matrices.multiply(new Quaternion(0, time, 0, false)); textureManager.bindTexture(HORIZON); be_renderBuffer(matrices, horizon, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, 0.7F * blindA); matrices.pop(); - + matrices.push(); matrices.multiply(new Quaternion(0, -time, 0, false)); textureManager.bindTexture(NEBULA_1); be_renderBuffer(matrices, nebulas1, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, blind02); matrices.pop(); - + matrices.push(); matrices.multiply(new Quaternion(0, time2, 0, false)); textureManager.bindTexture(NEBULA_2); be_renderBuffer(matrices, nebulas2, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, blind02); matrices.pop(); - + textureManager.bindTexture(STARS); - + matrices.push(); matrices.multiply(axis3.getRadialQuaternion(time)); be_renderBuffer(matrices, stars3, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, blind06); matrices.pop(); - + matrices.push(); matrices.multiply(axis4.getRadialQuaternion(time2)); be_renderBuffer(matrices, stars4, VertexFormats.POSITION_TEXTURE, 1F, 1F, 1F, blind06); matrices.pop(); } - + float a = (BackgroundInfo.fog - 1F); if (a > 0) { - if (a > 1) a = 1; + if (a > 1) + a = 1; textureManager.bindTexture(FOG); - be_renderBuffer(matrices, fog, VertexFormats.POSITION_TEXTURE, BackgroundInfo.red, BackgroundInfo.green, BackgroundInfo.blue, a); + be_renderBuffer(matrices, fog, VertexFormats.POSITION_TEXTURE, BackgroundInfo.red, BackgroundInfo.green, + BackgroundInfo.blue, a); } RenderSystem.disableTexture(); - + if (blindA > 0) { matrices.push(); matrices.multiply(axis1.getRadialQuaternion(time3)); be_renderBuffer(matrices, stars1, VertexFormats.POSITION, 1, 1, 1, blind06); matrices.pop(); - + matrices.push(); matrices.multiply(axis2.getRadialQuaternion(time2)); be_renderBuffer(matrices, stars2, VertexFormats.POSITION, 0.95F, 0.64F, 0.93F, blind06); matrices.pop(); } - + RenderSystem.enableTexture(); RenderSystem.depthMask(true); - + info.cancel(); } } - - private void be_renderBuffer(MatrixStack matrices, VertexBuffer buffer, VertexFormat format, float r, float g, float b, float a) { + + private void be_renderBuffer(MatrixStack matrices, VertexBuffer buffer, VertexFormat format, float r, float g, + float b, float a) { RenderSystem.color4f(r, g, b, a); buffer.bind(); format.startDrawing(0L); - buffer.draw(matrices.peek().getModel(), 7); - VertexBuffer.unbind(); - format.endDrawing(); + buffer.draw(matrices.peek().getModel(), 7); + VertexBuffer.unbind(); + format.endDrawing(); } private void be_initStars() { @@ -197,8 +200,9 @@ public class WorldRendererMixin { horizon = be_buildBufferHorizon(buffer, horizon); fog = be_buildBufferFog(buffer, fog); } - - private VertexBuffer be_buildBufferStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { + + private VertexBuffer be_buildBufferStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, + double maxSize, int count, long seed) { if (buffer != null) { buffer.close(); } @@ -210,8 +214,9 @@ public class WorldRendererMixin { return buffer; } - - private VertexBuffer be_buildBufferUVStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { + + private VertexBuffer be_buildBufferUVStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, + double maxSize, int count, long seed) { if (buffer != null) { buffer.close(); } @@ -223,8 +228,9 @@ public class WorldRendererMixin { return buffer; } - - private VertexBuffer be_buildBufferFarFog(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { + + private VertexBuffer be_buildBufferFarFog(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, + double maxSize, int count, long seed) { if (buffer != null) { buffer.close(); } @@ -236,7 +242,7 @@ public class WorldRendererMixin { return buffer; } - + private VertexBuffer be_buildBufferHorizon(BufferBuilder bufferBuilder, VertexBuffer buffer) { if (buffer != null) { buffer.close(); @@ -249,7 +255,7 @@ public class WorldRendererMixin { return buffer; } - + private VertexBuffer be_buildBufferFog(BufferBuilder bufferBuilder, VertexBuffer buffer) { if (buffer != null) { buffer.close(); @@ -262,7 +268,7 @@ public class WorldRendererMixin { return buffer; } - + private void be_makeStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { Random random = new Random(seed); buffer.begin(7, VertexFormats.POSITION); @@ -305,7 +311,7 @@ public class WorldRendererMixin { } } } - + private void be_makeUVStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { Random random = new Random(seed); buffer.begin(7, VertexFormats.POSITION_TEXTURE); @@ -347,13 +353,13 @@ public class WorldRendererMixin { double ah = ab * n + ae * o; float texU = (pos >> 1) & 1; float texV = (((pos + 1) >> 1) & 1) / 4F + minV; - pos ++; + pos++; buffer.vertex(j + af, k + ad, l + ah).texture(texU, texV).next(); } } } } - + private void be_makeFarFog(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { Random random = new Random(seed); buffer.begin(7, VertexFormats.POSITION_TEXTURE); @@ -398,26 +404,26 @@ public class WorldRendererMixin { double ah = ab * n + ae * o; float texU = (pos >> 1) & 1; float texV = ((pos + 1) >> 1) & 1; - pos ++; + pos++; buffer.vertex(j + af, k + ad, l + ah).texture(texU, texV).next(); } } } } - + private void be_makeCylinder(BufferBuilder buffer, int segments, double height, double radius) { buffer.begin(7, VertexFormats.POSITION_TEXTURE); - for (int i = 0; i < segments; i ++) { + for (int i = 0; i < segments; i++) { double a1 = (double) i * Math.PI * 2.0 / (double) segments; double a2 = (double) (i + 1) * Math.PI * 2.0 / (double) segments; double px1 = Math.sin(a1) * radius; double pz1 = Math.cos(a1) * radius; double px2 = Math.sin(a2) * radius; double pz2 = Math.cos(a2) * radius; - + float u0 = (float) i / (float) segments; float u1 = (float) (i + 1) / (float) segments; - + buffer.vertex(px1, -height, pz1).texture(u0, 0).next(); buffer.vertex(px1, height, pz1).texture(u0, 1).next(); buffer.vertex(px2, height, pz2).texture(u1, 1).next(); diff --git a/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java b/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java index fd4473ed..6f4f77bb 100644 --- a/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java @@ -9,34 +9,35 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.google.common.collect.Lists; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.util.math.MathHelper; +import net.minecraft.world.level.block.AbstractBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.util.Mth; import ru.betterend.item.tool.EndHammerItem; import ru.betterend.util.MHelper; @Mixin(AbstractBlock.class) public abstract class AbstractBlockMixin { - - @Inject(method = "getDroppedStacks", at = @At("HEAD"), cancellable = true) - public void be_getDroppedStacks(BlockState state, LootContext.Builder builder, CallbackInfoReturnable> info) { - if (state.isOf(Blocks.GLOWSTONE)) { - ItemStack tool = builder.get(LootContextParameters.TOOL); + + @Inject(method = "getDrops", at = @At("HEAD"), cancellable = true) + public void be_getDroppedStacks(BlockState state, LootContext.Builder builder, + CallbackInfoReturnable> info) { + if (state.is(Blocks.GLOWSTONE)) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); if (tool != null && tool.getItem() instanceof EndHammerItem) { int min = 3; int max = 4; int count = 0; - int fortune = EnchantmentHelper.getLevel(Enchantments.FORTUNE, tool); + int fortune = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BLOCK_FORTUNE, tool); if (fortune > 0) { - fortune /= Enchantments.FORTUNE.getMaxLevel(); - min = MathHelper.clamp(min + fortune, min, max); + fortune /= Enchantments.BLOCK_FORTUNE.getMaxLevel(); + min = Mth.clamp(min + fortune, min, max); if (min == max) { info.setReturnValue(Lists.newArrayList(new ItemStack(Items.GLOWSTONE_DUST, max))); } diff --git a/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java index 130df457..28c29eb4 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java @@ -5,9 +5,9 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.block.AnvilBlock; -import net.minecraft.block.BlockState; -import net.minecraft.state.property.IntProperty; +import net.minecraft.world.level.block.AnvilBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.IntegerProperty; import ru.betterend.blocks.basis.EndAnvilBlock; @Mixin(AnvilBlock.class) @@ -15,7 +15,7 @@ public class AnvilBlockMixin { @Inject(method = "getLandingState", at = @At("HEAD"), cancellable = true) private static void be_getLandingState(BlockState fallingState, CallbackInfoReturnable info) { if (fallingState.getBlock() instanceof EndAnvilBlock) { - IntProperty destructionProperty = ((EndAnvilBlock) fallingState.getBlock()).getDestructionProperty(); + IntegerProperty destructionProperty = ((EndAnvilBlock) fallingState.getBlock()).getDESTRUCTION(); int destruction = fallingState.get(destructionProperty); try { BlockState state = fallingState.with(destructionProperty, destruction + 1); diff --git a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java index 016a78b3..2b4c380e 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java @@ -11,19 +11,19 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.block.AnvilBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.recipe.RecipeManager; +import net.minecraft.world.level.block.AnvilBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.PlayerInventory; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeManager; import net.minecraft.screen.AnvilScreenHandler; import net.minecraft.screen.ForgingScreenHandler; import net.minecraft.screen.Property; import net.minecraft.screen.ScreenHandlerContext; import net.minecraft.screen.ScreenHandlerType; -import net.minecraft.tag.BlockTags; +import net.minecraft.tags.BlockTags; import ru.betterend.blocks.basis.EndAnvilBlock; import ru.betterend.interfaces.AnvilScreenHandlerExtended; import ru.betterend.recipe.builders.AnvilRecipe; @@ -39,9 +39,9 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler imple super(ScreenHandlerType.ANVIL, syncId, playerInventory, ScreenHandlerContext.EMPTY); } - @Inject(method = "(ILnet/minecraft/entity/player/PlayerInventory;Lnet/minecraft/screen/ScreenHandlerContext;)V", - at = @At("TAIL")) - public void be_initAnvilLevel(int syncId, PlayerInventory inventory, ScreenHandlerContext context, CallbackInfo info) { + @Inject(method = "(ILnet/minecraft/entity/player/PlayerInventory;Lnet/minecraft/screen/ScreenHandlerContext;)V", at = @At("TAIL")) + public void be_initAnvilLevel(int syncId, PlayerInventory inventory, ScreenHandlerContext context, + CallbackInfo info) { if (context != ScreenHandlerContext.EMPTY) { int anvLevel = context.run((world, blockPos) -> { Block anvilBlock = world.getBlockState(blockPos).getBlock(); @@ -55,17 +55,17 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler imple this.anvilLevel = addProperty(anvilLevel); } } - + @Shadow public abstract void updateResult(); - + @Inject(method = "canTakeOutput", at = @At("HEAD"), cancellable = true) protected void be_canTakeOutput(PlayerEntity player, boolean present, CallbackInfoReturnable info) { if (be_currentRecipe != null) { info.setReturnValue(be_currentRecipe.checkHammerDurability(input, player)); } } - + @Inject(method = "onTakeOutput", at = @At("HEAD"), cancellable = true) protected void be_onTakeOutput(PlayerEntity player, ItemStack stack, CallbackInfoReturnable info) { if (be_currentRecipe != null) { @@ -74,13 +74,14 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler imple this.onContentChanged(input); this.context.run((world, blockPos) -> { BlockState anvilState = world.getBlockState(blockPos); - if (!player.abilities.creativeMode && anvilState.isIn(BlockTags.ANVIL) && player.getRandom().nextFloat() < 0.12F) { + if (!player.abilities.creativeMode && anvilState.isIn(BlockTags.ANVIL) + && player.getRandom().nextFloat() < 0.12F) { BlockState landingState = AnvilBlock.getLandingState(anvilState); if (landingState == null) { world.removeBlock(blockPos, false); world.syncWorldEvent(1029, blockPos, 0); } else { - world.setBlockState(blockPos, landingState, 2); + world.setBlockAndUpdate(blockPos, landingState, 2); world.syncWorldEvent(1030, blockPos, 0); } } else { @@ -90,15 +91,15 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler imple info.setReturnValue(stack); } } - + @Inject(method = "updateResult", at = @At("HEAD"), cancellable = true) public void be_updateOutput(CallbackInfo info) { RecipeManager recipeManager = this.player.world.getRecipeManager(); be_recipes = recipeManager.getAllMatches(AnvilRecipe.TYPE, input, player.world); if (be_recipes.size() > 0) { int anvilLevel = this.anvilLevel.get(); - be_recipes = be_recipes.stream().filter(recipe -> - anvilLevel >= recipe.getAnvilLevel()).collect(Collectors.toList()); + be_recipes = be_recipes.stream().filter(recipe -> anvilLevel >= recipe.getAnvilLevel()) + .collect(Collectors.toList()); if (be_recipes.size() > 0) { if (be_currentRecipe == null || !be_recipes.contains(be_currentRecipe)) { be_currentRecipe = be_recipes.get(0); @@ -110,14 +111,14 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler imple } } } - + @Inject(method = "setNewItemName", at = @At("HEAD"), cancellable = true) public void be_setNewItemName(String string, CallbackInfo info) { if (be_currentRecipe != null) { info.cancel(); } } - + @Override public boolean onButtonClick(PlayerEntity player, int id) { if (id == 0) { @@ -129,24 +130,25 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler imple } return super.onButtonClick(player, id); } - + private void be_updateResult() { - if (be_currentRecipe == null) return; + if (be_currentRecipe == null) + return; this.output.setStack(0, be_currentRecipe.craft(input)); this.sendContentUpdates(); } - + @Override public void be_updateCurrentRecipe(AnvilRecipe recipe) { this.be_currentRecipe = recipe; this.be_updateResult(); } - + @Override public AnvilRecipe be_getCurrentRecipe() { return this.be_currentRecipe; } - + @Override public List be_getRecipes() { return this.be_recipes; diff --git a/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java b/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java index 8a02ed79..08accbe8 100644 --- a/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java @@ -7,9 +7,9 @@ import org.spongepowered.asm.mixin.gen.Accessor; import com.google.common.collect.Multimap; -import net.minecraft.entity.attribute.EntityAttribute; -import net.minecraft.entity.attribute.EntityAttributeModifier; -import net.minecraft.item.ArmorItem; +import net.minecraft.world.entity.attribute.EntityAttribute; +import net.minecraft.world.entity.attribute.EntityAttributeModifier; +import net.minecraft.world.item.ArmorItem; @Mixin(ArmorItem.class) public interface ArmorItemAccessor { diff --git a/src/main/java/ru/betterend/mixin/common/BiomeArrayMixin.java b/src/main/java/ru/betterend/mixin/common/BiomeArrayMixin.java index deb834e7..5ac2ad3d 100644 --- a/src/main/java/ru/betterend/mixin/common/BiomeArrayMixin.java +++ b/src/main/java/ru/betterend/mixin/common/BiomeArrayMixin.java @@ -4,8 +4,8 @@ import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.source.BiomeArray; import ru.betterend.interfaces.IBiomeArray; @@ -39,7 +39,7 @@ public class BiomeArrayMixin implements IBiomeArray { private int be_getArrayIndex(int biomeX, int biomeY, int biomeZ) { int i = biomeX & HORIZONTAL_BIT_MASK; - int j = MathHelper.clamp(biomeY, 0, VERTICAL_BIT_MASK); + int j = Mth.clamp(biomeY, 0, VERTICAL_BIT_MASK); int k = biomeZ & HORIZONTAL_BIT_MASK; return j << HORIZONTAL_SECTION_COUNT + HORIZONTAL_SECTION_COUNT | k << HORIZONTAL_SECTION_COUNT | i; } diff --git a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java index 1eff0099..fa990422 100644 --- a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java +++ b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java @@ -7,16 +7,16 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.item.BoneMealItem; -import net.minecraft.item.ItemUsageContext; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.item.BoneMealItem; +import net.minecraft.world.item.ItemUsageContext; import net.minecraft.util.ActionResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; import net.minecraft.world.biome.Biome.Category; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndBlocks; @@ -28,32 +28,30 @@ import ru.betterend.world.biome.EndBiome; @Mixin(BoneMealItem.class) public class BoneMealItemMixin { private static final Direction[] DIR = BlocksHelper.makeHorizontal(); - private static final Mutable POS = new Mutable(); + private static final MutableBlockPos POS = new MutableBlockPos(); @Inject(method = "useOnBlock", at = @At("HEAD"), cancellable = true) private void be_onUse(ItemUsageContext context, CallbackInfoReturnable info) { - World world = context.getWorld(); + Level world = context.getLevel(); BlockPos blockPos = context.getBlockPos(); - if (!world.isClient) { + if (!world.isClientSide) { BlockPos offseted = blockPos.offset(context.getSide()); boolean endBiome = world.getBiome(offseted).getCategory() == Category.THEEND; - + if (world.getBlockState(blockPos).isIn(EndTags.END_GROUND)) { boolean consume = false; - if (world.getBlockState(blockPos).isOf(Blocks.END_STONE)) { + if (world.getBlockState(blockPos).is(Blocks.END_STONE)) { BlockState nylium = beGetNylium(world, blockPos); if (nylium != null) { BlocksHelper.setWithoutUpdate(world, blockPos, nylium); consume = true; } - } - else { + } else { if (!world.getFluidState(offseted).isEmpty() && endBiome) { if (world.getBlockState(offseted).getBlock().equals(Blocks.WATER)) { consume = beGrowWaterGrass(world, blockPos); } - } - else { + } else { consume = beGrowGrass(world, blockPos); } } @@ -65,8 +63,7 @@ public class BoneMealItemMixin { info.setReturnValue(ActionResult.SUCCESS); info.cancel(); } - } - else if (!world.getFluidState(offseted).isEmpty() && endBiome) { + } else if (!world.getFluidState(offseted).isEmpty() && endBiome) { if (world.getBlockState(offseted).getBlock().equals(Blocks.WATER)) { info.setReturnValue(ActionResult.FAIL); info.cancel(); @@ -74,8 +71,8 @@ public class BoneMealItemMixin { } } } - - private boolean beGrowGrass(World world, BlockPos pos) { + + private boolean beGrowGrass(Level world, BlockPos pos) { int y1 = pos.getY() + 3; int y2 = pos.getY() - 3; boolean result = false; @@ -86,7 +83,7 @@ public class BoneMealItemMixin { POS.setZ(z); for (int y = y1; y >= y2; y--) { POS.setY(y); - BlockPos down = POS.down(); + BlockPos down = POS.below(); if (world.isAir(POS) && !world.isAir(down)) { BlockState grass = beGetGrassState(world, down); if (grass != null) { @@ -99,8 +96,8 @@ public class BoneMealItemMixin { } return result; } - - private boolean beGrowWaterGrass(World world, BlockPos pos) { + + private boolean beGrowWaterGrass(Level world, BlockPos pos) { int y1 = pos.getY() + 3; int y2 = pos.getY() - 3; boolean result = false; @@ -111,8 +108,8 @@ public class BoneMealItemMixin { POS.setZ(z); for (int y = y1; y >= y2; y--) { POS.setY(y); - BlockPos down = POS.down(); - if (world.getBlockState(POS).isOf(Blocks.WATER) && world.getBlockState(down).isIn(EndTags.END_GROUND)) { + BlockPos down = POS.below(); + if (world.getBlockState(POS).is(Blocks.WATER) && world.getBlockState(down).isIn(EndTags.END_GROUND)) { BlockState grass = beGetWaterGrassState(world, down); if (grass != null) { BlocksHelper.setWithoutUpdate(world, POS, grass); @@ -124,27 +121,27 @@ public class BoneMealItemMixin { } return result; } - - private BlockState beGetGrassState(World world, BlockPos pos) { + + private BlockState beGetGrassState(Level world, BlockPos pos) { BlockState state = world.getBlockState(pos); Block block = state.getBlock(); block = BonemealUtil.getGrass(EndBiomes.getBiomeID(world.getBiome(pos)), block, world.getRandom()); - return block == null ? null : block.getDefaultState(); + return block == null ? null : block.defaultBlockState(); } - - private BlockState beGetWaterGrassState(World world, BlockPos pos) { + + private BlockState beGetWaterGrassState(Level world, BlockPos pos) { EndBiome biome = EndBiomes.getFromBiome(world.getBiome(pos)); if (world.random.nextInt(16) == 0) { - return EndBlocks.CHARNIA_RED.getDefaultState(); - } - else if (biome == EndBiomes.FOGGY_MUSHROOMLAND || biome == EndBiomes.MEGALAKE || biome == EndBiomes.MEGALAKE_GROVE) { - return world.random.nextBoolean() ? EndBlocks.CHARNIA_LIGHT_BLUE.getDefaultState() : EndBlocks.CHARNIA_LIGHT_BLUE.getDefaultState(); - } - else if (biome == EndBiomes.AMBER_LAND) { - return world.random.nextBoolean() ? EndBlocks.CHARNIA_ORANGE.getDefaultState() : EndBlocks.CHARNIA_RED.getDefaultState(); - } - else if (biome == EndBiomes.CHORUS_FOREST || biome == EndBiomes.SHADOW_FOREST) { - return EndBlocks.CHARNIA_PURPLE.getDefaultState(); + return EndBlocks.CHARNIA_RED.defaultBlockState(); + } else if (biome == EndBiomes.FOGGY_MUSHROOMLAND || biome == EndBiomes.MEGALAKE + || biome == EndBiomes.MEGALAKE_GROVE) { + return world.random.nextBoolean() ? EndBlocks.CHARNIA_LIGHT_BLUE.defaultBlockState() + : EndBlocks.CHARNIA_LIGHT_BLUE.defaultBlockState(); + } else if (biome == EndBiomes.AMBER_LAND) { + return world.random.nextBoolean() ? EndBlocks.CHARNIA_ORANGE.defaultBlockState() + : EndBlocks.CHARNIA_RED.defaultBlockState(); + } else if (biome == EndBiomes.CHORUS_FOREST || biome == EndBiomes.SHADOW_FOREST) { + return EndBlocks.CHARNIA_PURPLE.defaultBlockState(); } return null; } @@ -158,10 +155,10 @@ public class BoneMealItemMixin { } } - private BlockState beGetNylium(World world, BlockPos pos) { + private BlockState beGetNylium(Level world, BlockPos pos) { beShuffle(world.random); for (Direction dir : DIR) { - BlockState state = world.getBlockState(pos.offset(dir)); + BlockState state = world.getBlockState(pos.relative(dir)); if (BlocksHelper.isEndNylium(state)) return state; } diff --git a/src/main/java/ru/betterend/mixin/common/BrewingAccessor.java b/src/main/java/ru/betterend/mixin/common/BrewingAccessor.java index 17129e52..3c46279d 100644 --- a/src/main/java/ru/betterend/mixin/common/BrewingAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/BrewingAccessor.java @@ -3,9 +3,9 @@ package ru.betterend.mixin.common; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; -import net.minecraft.item.Item; +import net.minecraft.world.item.Item; import net.minecraft.potion.Potion; -import net.minecraft.recipe.BrewingRecipeRegistry; +import net.minecraft.world.item.crafting.BrewingRecipeRegistry; @Mixin(BrewingRecipeRegistry.class) public interface BrewingAccessor { diff --git a/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java index bc394a99..da3255b4 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java @@ -11,20 +11,20 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.ChorusFlowerBlock; -import net.minecraft.block.ChorusPlantBlock; -import net.minecraft.block.ShapeContext; -import net.minecraft.server.world.ServerWorld; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.ChorusFlowerBlock; +import net.minecraft.world.level.block.ChorusPlantBlock; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.server.level.ServerLevel; import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -35,75 +35,80 @@ import ru.betterend.world.generator.GeneratorOptions; public abstract class ChorusFlowerBlockMixin extends Block { private static final VoxelShape SHAPE_FULL = Block.createCuboidShape(0, 0, 0, 16, 16, 16); private static final VoxelShape SHAPE_HALF = Block.createCuboidShape(0, 0, 0, 16, 4, 16); - - public ChorusFlowerBlockMixin(Settings settings) { + + public ChorusFlowerBlockMixin(Properties settings) { super(settings); } @Shadow @Final private ChorusPlantBlock plantBlock; - + @Inject(method = "canPlaceAt", at = @At("HEAD"), cancellable = true) private void beCanPlace(BlockState state, WorldView world, BlockPos pos, CallbackInfoReturnable info) { - if (world.getBlockState(pos.down()).isOf(EndBlocks.CHORUS_NYLIUM)) { + if (world.getBlockState(pos.below()).is(EndBlocks.CHORUS_NYLIUM)) { info.setReturnValue(true); info.cancel(); } } - + @Inject(method = "randomTick", at = @At("HEAD"), cancellable = true) - private void beOnTick(BlockState state, ServerWorld world, BlockPos pos, Random random, CallbackInfo info) { - if (world.getBlockState(pos.down()).isIn(EndTags.END_GROUND)) { + private void beOnTick(BlockState state, ServerLevel world, BlockPos pos, Random random, CallbackInfo info) { + if (world.getBlockState(pos.below()).isIn(EndTags.END_GROUND)) { BlockPos up = pos.up(); if (world.isAir(up) && up.getY() < 256) { - int i = state.get(ChorusFlowerBlock.AGE); + int i = state.getValue(ChorusFlowerBlock.AGE); if (i < 5) { this.grow(world, up, i + 1); if (GeneratorOptions.changeChorusPlant()) { - BlocksHelper.setWithoutUpdate(world, pos, plantBlock.getDefaultState().with(ChorusPlantBlock.UP, true).with(ChorusPlantBlock.DOWN, true).with(BlocksHelper.ROOTS, true)); - } - else { - BlocksHelper.setWithoutUpdate(world, pos, plantBlock.getDefaultState().with(ChorusPlantBlock.UP, true).with(ChorusPlantBlock.DOWN, true)); + BlocksHelper.setWithoutUpdate(world, pos, + plantBlock.defaultBlockState().with(ChorusPlantBlock.UP, true) + .with(ChorusPlantBlock.DOWN, true).with(BlocksHelper.ROOTS, true)); + } else { + BlocksHelper.setWithoutUpdate(world, pos, plantBlock.defaultBlockState() + .with(ChorusPlantBlock.UP, true).with(ChorusPlantBlock.DOWN, true)); } info.cancel(); } } } } - + @Inject(method = "generate", at = @At("RETURN"), cancellable = true) - private static void beOnGenerate(WorldAccess world, BlockPos pos, Random random, int size, CallbackInfo info) { + private static void beOnGenerate(LevelAccessor world, BlockPos pos, Random random, int size, CallbackInfo info) { BlockState state = world.getBlockState(pos); - if (GeneratorOptions.changeChorusPlant() && state.isOf(Blocks.CHORUS_PLANT)) { + if (GeneratorOptions.changeChorusPlant() && state.is(Blocks.CHORUS_PLANT)) { BlocksHelper.setWithoutUpdate(world, pos, state.with(BlocksHelper.ROOTS, true)); } } - + @Shadow - private static boolean isSurroundedByAir(WorldView world, BlockPos pos, @Nullable Direction exceptDirection) { return false; } - + private static boolean isSurroundedByAir(WorldView world, BlockPos pos, @Nullable Direction exceptDirection) { + return false; + } + @Shadow - private void grow(World world, BlockPos pos, int age) {} - + private void grow(Level world, BlockPos pos, int age) { + } + @Shadow - private void die(World world, BlockPos pos) {} - + private void die(Level world, BlockPos pos) { + } + @Override public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { if (GeneratorOptions.changeChorusPlant()) { - return state.get(ChorusFlowerBlock.AGE) == 5 ? SHAPE_HALF : SHAPE_FULL; - } - else { + return state.getValue(ChorusFlowerBlock.AGE) == 5 ? SHAPE_HALF : SHAPE_FULL; + } else { return super.getOutlineShape(state, world, pos, context); } } @Inject(method = "die", at = @At("HEAD"), cancellable = true) - private void beOnDie(World world, BlockPos pos, CallbackInfo info) { - BlockState down = world.getBlockState(pos.down()); - if (down.isOf(Blocks.CHORUS_PLANT) || down.isIn(EndTags.GEN_TERRAIN)) { - world.setBlockState(pos, this.getDefaultState().with(Properties.AGE_5, 5), 2); + private void beOnDie(Level world, BlockPos pos, CallbackInfo info) { + BlockState down = world.getBlockState(pos.below()); + if (down.is(Blocks.CHORUS_PLANT) || down.isIn(EndTags.GEN_TERRAIN)) { + world.setBlockAndUpdate(pos, this.defaultBlockState().with(Properties.AGE_5, 5), 2); world.syncWorldEvent(1034, pos, 0); } info.cancel(); diff --git a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java index 10fcef63..ce3b77ad 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java @@ -6,19 +6,19 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.ChorusPlantBlock; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.state.StateManager; +import net.minecraft.world.level.block.AbstractBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.ChorusPlantBlock; +import net.minecraft.world.item.ItemPlacementContext; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -27,39 +27,37 @@ import ru.betterend.world.generator.GeneratorOptions; @Mixin(value = ChorusPlantBlock.class, priority = 100) public abstract class ChorusPlantBlockMixin extends Block { - public ChorusPlantBlockMixin(Settings settings) { + public ChorusPlantBlockMixin(Properties settings) { super(settings); } @Inject(method = "*", at = @At("TAIL")) - private void beOnInit(AbstractBlock.Settings settings, CallbackInfo info) { + private void beOnInit(AbstractBlock.Properties settings, CallbackInfo info) { if (GeneratorOptions.changeChorusPlant()) { - this.setDefaultState(this.getDefaultState().with(BlocksHelper.ROOTS, false)); + this.setDefaultState(this.defaultBlockState().with(BlocksHelper.ROOTS, false)); } } - - @Inject(method = "appendProperties", at = @At("TAIL")) - private void beAddProperties(StateManager.Builder builder, CallbackInfo info) { + + @Inject(method = "createBlockStateDefinition", at = @At("TAIL")) + private void beAddProperties(StateDefinition.Builder builder, CallbackInfo info) { GeneratorOptions.init(); if (GeneratorOptions.changeChorusPlant()) { builder.add(BlocksHelper.ROOTS); } } - + @Inject(method = "withConnectionProperties", at = @At("RETURN"), cancellable = true) private void beConnectionProperties(BlockView world, BlockPos pos, CallbackInfoReturnable info) { BlockState plant = info.getReturnValue(); - if (plant.isOf(Blocks.CHORUS_PLANT)) { - if (world.getBlockState(pos.down()).isIn(EndTags.END_GROUND)) { + if (plant.is(Blocks.CHORUS_PLANT)) { + if (world.getBlockState(pos.below()).isIn(EndTags.END_GROUND)) { if (GeneratorOptions.changeChorusPlant()) { info.setReturnValue(plant.with(Properties.DOWN, true).with(BlocksHelper.ROOTS, true)); - } - else { + } else { info.setReturnValue(plant.with(Properties.DOWN, true)); } info.cancel(); - } - else { + } else { if (GeneratorOptions.changeChorusPlant()) { info.setReturnValue(plant.with(BlocksHelper.ROOTS, false)); } @@ -67,30 +65,29 @@ public abstract class ChorusPlantBlockMixin extends Block { } } } - + @Inject(method = "canPlaceAt", at = @At("HEAD"), cancellable = true) private void beCanPlace(BlockState state, WorldView world, BlockPos pos, CallbackInfoReturnable info) { - BlockState down = world.getBlockState(pos.down()); - if (down.isOf(EndBlocks.CHORUS_NYLIUM) || down.isOf(Blocks.END_STONE)) { + BlockState down = world.getBlockState(pos.below()); + if (down.is(EndBlocks.CHORUS_NYLIUM) || down.is(Blocks.END_STONE)) { info.setReturnValue(true); info.cancel(); } } - - @Inject(method = "getStateForNeighborUpdate", at = @At("RETURN"), cancellable = true) - private void beStateForNeighborUpdate(BlockState state, Direction direction, BlockState newState, WorldAccess world, BlockPos pos, BlockPos posFrom, CallbackInfoReturnable info) { + + @Inject(method = "updateShape", at = @At("RETURN"), cancellable = true) + private void beStateForNeighborUpdate(BlockState state, Direction direction, BlockState newState, + LevelAccessor world, BlockPos pos, BlockPos posFrom, CallbackInfoReturnable info) { BlockState plant = info.getReturnValue(); - if (plant.isOf(Blocks.CHORUS_PLANT)) { - if (world.getBlockState(pos.down()).isIn(EndTags.END_GROUND)) { + if (plant.is(Blocks.CHORUS_PLANT)) { + if (world.getBlockState(pos.below()).isIn(EndTags.END_GROUND)) { if (GeneratorOptions.changeChorusPlant()) { plant = plant.with(Properties.DOWN, true).with(BlocksHelper.ROOTS, true); - } - else { + } else { plant = plant.with(Properties.DOWN, true); } info.cancel(); - } - else { + } else { if (GeneratorOptions.changeChorusPlant()) { plant = plant.with(BlocksHelper.ROOTS, false); } @@ -100,17 +97,17 @@ public abstract class ChorusPlantBlockMixin extends Block { info.cancel(); } } - + @Inject(method = "getPlacementState", at = @At("RETURN"), cancellable = true) private void beGetPlacementState(ItemPlacementContext ctx, CallbackInfoReturnable info) { BlockPos pos = ctx.getBlockPos(); - World world = ctx.getWorld(); + Level world = ctx.getLevel(); BlockState plant = info.getReturnValue(); - if (ctx.canPlace() && plant.isOf(Blocks.CHORUS_PLANT) && world.getBlockState(pos.down()).isIn(EndTags.END_GROUND)) { + if (ctx.canPlace() && plant.is(Blocks.CHORUS_PLANT) + && world.getBlockState(pos.below()).isIn(EndTags.END_GROUND)) { if (GeneratorOptions.changeChorusPlant()) { info.setReturnValue(plant.with(BlocksHelper.ROOTS, true).with(Properties.DOWN, true)); - } - else { + } else { info.setReturnValue(plant.with(Properties.DOWN, true)); } info.cancel(); diff --git a/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java index 1c11ceca..e55d6160 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java @@ -7,11 +7,11 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.ChorusFlowerBlock; -import net.minecraft.block.ConnectingBlock; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.ChorusFlowerBlock; +import net.minecraft.world.level.block.ConnectingBlock; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.ChorusPlantFeature; @@ -24,16 +24,19 @@ import ru.betterend.world.generator.GeneratorOptions; @Mixin(ChorusPlantFeature.class) public class ChorusPlantFeatureMixin { @Inject(method = "generate", at = @At("HEAD"), cancellable = true) - private void be_onGenerate(StructureWorldAccess structureWorldAccess, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, DefaultFeatureConfig defaultFeatureConfig, CallbackInfoReturnable info) { - if (structureWorldAccess.isAir(blockPos) && structureWorldAccess.getBlockState(blockPos.down()).isOf(EndBlocks.CHORUS_NYLIUM)) { + private void be_onGenerate(StructureWorldAccess structureWorldAccess, ChunkGenerator chunkGenerator, Random random, + BlockPos blockPos, DefaultFeatureConfig defaultFeatureConfig, CallbackInfoReturnable info) { + if (structureWorldAccess.isAir(blockPos) + && structureWorldAccess.getBlockState(blockPos.below()).is(EndBlocks.CHORUS_NYLIUM)) { ChorusFlowerBlock.generate(structureWorldAccess, blockPos, random, MHelper.randRange(8, 16, random)); BlockState bottom = structureWorldAccess.getBlockState(blockPos); - if (bottom.isOf(Blocks.CHORUS_PLANT)) { + if (bottom.is(Blocks.CHORUS_PLANT)) { if ((GeneratorOptions.changeChorusPlant())) { - BlocksHelper.setWithoutUpdate(structureWorldAccess, blockPos, bottom.with(BlocksHelper.ROOTS, true).with(ConnectingBlock.DOWN, true)); - } - else { - BlocksHelper.setWithoutUpdate(structureWorldAccess, blockPos, bottom.with(ConnectingBlock.DOWN, true)); + BlocksHelper.setWithoutUpdate(structureWorldAccess, blockPos, + bottom.with(BlocksHelper.ROOTS, true).with(ConnectingBlock.DOWN, true)); + } else { + BlocksHelper.setWithoutUpdate(structureWorldAccess, blockPos, + bottom.with(ConnectingBlock.DOWN, true)); } } info.setReturnValue(true); diff --git a/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java b/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java index e5bf69a9..d2931d21 100644 --- a/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java @@ -3,8 +3,8 @@ package ru.betterend.mixin.common; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; -import net.minecraft.block.ComposterBlock; -import net.minecraft.item.ItemConvertible; +import net.minecraft.world.level.block.ComposterBlock; +import net.minecraft.world.item.ItemConvertible; @Mixin(ComposterBlock.class) public interface ComposterBlockAccessor { diff --git a/src/main/java/ru/betterend/mixin/common/CraftingScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/CraftingScreenHandlerMixin.java index 7e533fa9..ec38ae5e 100644 --- a/src/main/java/ru/betterend/mixin/common/CraftingScreenHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/CraftingScreenHandlerMixin.java @@ -7,14 +7,13 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.block.CraftingTableBlock; -import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.world.level.block.CraftingTableBlock; +import net.minecraft.world.entity.player.PlayerEntity; import net.minecraft.screen.CraftingScreenHandler; import net.minecraft.screen.ScreenHandlerContext; @Mixin(CraftingScreenHandler.class) -public abstract class CraftingScreenHandlerMixin -{ +public abstract class CraftingScreenHandlerMixin { @Shadow @Final private ScreenHandlerContext context; diff --git a/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java b/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java index a851723c..618d38c8 100644 --- a/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java +++ b/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java @@ -5,9 +5,9 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; import net.minecraft.world.biome.Biome; -import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraft.world.gen.chunk.NoiseChunkGenerator; @@ -17,13 +17,15 @@ import ru.betterend.world.generator.GeneratorOptions; @Mixin(value = DimensionType.class, priority = 100) public class DimensionTypeMixin { @Inject(method = "createEndGenerator", at = @At("HEAD"), cancellable = true) - private static void be_replaceGenerator(Registry biomeRegistry, Registry chunkGeneratorSettingsRegistry, long seed, CallbackInfoReturnable info) { + private static void be_replaceGenerator(Registry biomeRegistry, + Registry chunkGeneratorSettingsRegistry, long seed, + CallbackInfoReturnable info) { info.setReturnValue(new NoiseChunkGenerator(new BetterEndBiomeSource(biomeRegistry, seed), seed, () -> { return (ChunkGeneratorSettings) chunkGeneratorSettingsRegistry.getOrThrow(ChunkGeneratorSettings.END); })); info.cancel(); } - + @Inject(method = "hasEnderDragonFight", at = @At("HEAD"), cancellable = true) private void be_hasEnderDragonFight(CallbackInfoReturnable info) { if (!GeneratorOptions.hasDragonFights()) { diff --git a/src/main/java/ru/betterend/mixin/common/EnchantmentScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/EnchantmentScreenHandlerMixin.java index 669666ea..faba5e67 100644 --- a/src/main/java/ru/betterend/mixin/common/EnchantmentScreenHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EnchantmentScreenHandlerMixin.java @@ -10,16 +10,16 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.EnchantmentLevelEntry; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.EnchantmentLevelEntry; import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; +import net.minecraft.world.item.ItemStack; import net.minecraft.screen.EnchantmentScreenHandler; import net.minecraft.screen.Property; import net.minecraft.screen.ScreenHandler; import net.minecraft.screen.ScreenHandlerContext; import net.minecraft.screen.ScreenHandlerType; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; import ru.betterend.registry.EndTags; @Mixin(EnchantmentScreenHandler.class) @@ -67,7 +67,8 @@ public abstract class EnchantmentScreenHandlerMixin extends ScreenHandler { int j; for (j = -1; j <= 1; ++j) { for (int k = -1; k <= 1; ++k) { - if ((j != 0 || k != 0) && world.isAir(blockPos.add(k, 0, j)) && world.isAir(blockPos.add(k, 1, j))) { + if ((j != 0 || k != 0) && world.isAir(blockPos.add(k, 0, j)) + && world.isAir(blockPos.add(k, 1, j))) { if (world.getBlockState(blockPos.add(k * 2, 0, j * 2)).isIn(EndTags.BOOKSHELVES)) { ++i; } @@ -100,7 +101,8 @@ public abstract class EnchantmentScreenHandlerMixin extends ScreenHandler { this.random.setSeed((long) this.seed.get()); for (j = 0; j < 3; ++j) { - this.enchantmentPower[j] = EnchantmentHelper.calculateRequiredExperienceLevel(this.random, j, i, itemStack); + this.enchantmentPower[j] = EnchantmentHelper.calculateRequiredExperienceLevel(this.random, j, i, + itemStack); this.enchantmentId[j] = -1; this.enchantmentLevel[j] = -1; if (this.enchantmentPower[j] < j + 1) { @@ -110,10 +112,13 @@ public abstract class EnchantmentScreenHandlerMixin extends ScreenHandler { for (j = 0; j < 3; ++j) { if (this.enchantmentPower[j] > 0) { - List list = this.generateEnchantments(itemStack, j, this.enchantmentPower[j]); + List list = this.generateEnchantments(itemStack, j, + this.enchantmentPower[j]); if (list != null && !list.isEmpty()) { - EnchantmentLevelEntry enchantmentLevelEntry = (EnchantmentLevelEntry) list.get(this.random.nextInt(list.size())); - this.enchantmentId[j] = Registry.ENCHANTMENT.getRawId(enchantmentLevelEntry.enchantment); + EnchantmentLevelEntry enchantmentLevelEntry = (EnchantmentLevelEntry) list + .get(this.random.nextInt(list.size())); + this.enchantmentId[j] = Registry.ENCHANTMENT + .getRawId(enchantmentLevelEntry.enchantment); this.enchantmentLevel[j] = enchantmentLevelEntry.level; } } @@ -121,8 +126,7 @@ public abstract class EnchantmentScreenHandlerMixin extends ScreenHandler { this.sendContentUpdates(); }); - } - else { + } else { for (int i = 0; i < 3; ++i) { this.enchantmentPower[i] = 0; this.enchantmentId[i] = -1; diff --git a/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java index b874e9b8..3d4b0f51 100644 --- a/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java @@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.nbt.NbtHelper; import net.minecraft.structure.Structure; import net.minecraft.structure.StructurePlacementData; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.world.Heightmap.Type; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; @@ -29,16 +29,17 @@ public class EndPortalFeatureMixin { @Final @Shadow private boolean open; - + @Inject(method = "generate", at = @At("HEAD"), cancellable = true) - private void bePortalGenerate(StructureWorldAccess world, ChunkGenerator generator, Random random, BlockPos blockPos, DefaultFeatureConfig config, CallbackInfoReturnable info) { + private void bePortalGenerate(StructureWorldAccess world, ChunkGenerator generator, Random random, + BlockPos blockPos, DefaultFeatureConfig config, CallbackInfoReturnable info) { if (!GeneratorOptions.hasPortal()) { info.setReturnValue(false); info.cancel(); - } - else if (GeneratorOptions.replacePortal()) { + } else if (GeneratorOptions.replacePortal()) { blockPos = be_updatePos(blockPos, world); - Structure structure = StructureHelper.readStructure(BetterEnd.makeID(open ? "portal/end_portal_active" : "portal/end_portal_inactive")); + Structure structure = StructureHelper + .readStructure(BetterEnd.makeID(open ? "portal/end_portal_active" : "portal/end_portal_inactive")); BlockPos size = structure.getSize(); blockPos = blockPos.add(-(size.getX() >> 1), -3, -(size.getZ() >> 1)); structure.place(world, blockPos, new StructurePlacementData(), random); @@ -46,12 +47,12 @@ public class EndPortalFeatureMixin { info.cancel(); } } - + @ModifyVariable(method = "generate", ordinal = 0, at = @At("HEAD")) private BlockPos be_setPosOnGround(BlockPos blockPos, StructureWorldAccess world) { return be_updatePos(blockPos, world); } - + private BlockPos be_updatePos(BlockPos blockPos, StructureWorldAccess world) { if (GeneratorOptions.useNewGenerator()) { BlockPos pos = GeneratorOptions.getPortalPos(); diff --git a/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java index 44f69e31..579fc164 100644 --- a/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java @@ -8,17 +8,17 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.PaneBlock; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.decoration.EndCrystalEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.PaneBlock; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.decoration.EndCrystalEntity; import net.minecraft.nbt.CompoundTag; import net.minecraft.structure.Structure; import net.minecraft.structure.StructurePlacementData; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.MathHelper; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.util.Mth; import net.minecraft.world.Heightmap.Type; import net.minecraft.world.ServerWorldAccess; import net.minecraft.world.StructureWorldAccess; @@ -34,54 +34,58 @@ import ru.betterend.world.generator.GeneratorOptions; @Mixin(EndSpikeFeature.class) public class EndSpikeFeatureMixin { @Inject(method = "generate", at = @At("HEAD"), cancellable = true) - private void beSpikeGenerate(StructureWorldAccess structureWorldAccess, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, EndSpikeFeatureConfig endSpikeFeatureConfig, CallbackInfoReturnable info) { + private void beSpikeGenerate(StructureWorldAccess structureWorldAccess, ChunkGenerator chunkGenerator, + Random random, BlockPos blockPos, EndSpikeFeatureConfig endSpikeFeatureConfig, + CallbackInfoReturnable info) { if (!GeneratorOptions.hasPillars()) { info.setReturnValue(false); } } @Inject(method = "generateSpike", at = @At("HEAD"), cancellable = true) - private void be_generateSpike(ServerWorldAccess world, Random random, EndSpikeFeatureConfig config, EndSpikeFeature.Spike spike, CallbackInfo info) { + private void be_generateSpike(ServerWorldAccess world, Random random, EndSpikeFeatureConfig config, + EndSpikeFeature.Spike spike, CallbackInfo info) { int x = spike.getCenterX(); int z = spike.getCenterZ(); int radius = spike.getRadius(); int minY = 0; - + long lx = (long) x; long lz = (long) z; if (lx * lx + lz * lz < 10000) { String pillarID = String.format("%d_%d", x, z); CompoundTag pillar = WorldDataUtil.getCompoundTag("pillars"); boolean haveValue = pillar.contains(pillarID); - minY = haveValue ? pillar.getInt(pillarID) : world.getChunk(x >> 4, z >> 4).sampleHeightmap(Type.WORLD_SURFACE, x & 15, z); + minY = haveValue ? pillar.getInt(pillarID) + : world.getChunk(x >> 4, z >> 4).sampleHeightmap(Type.WORLD_SURFACE, x & 15, z); if (!haveValue) { pillar.putInt(pillarID, minY); WorldDataUtil.saveFile(); } - } - else { + } else { minY = world.getChunk(x >> 4, z >> 4).sampleHeightmap(Type.WORLD_SURFACE, x & 15, z); } - + int maxY = minY + spike.getHeight() - 64; - + if (GeneratorOptions.replacePillars() && be_radiusInRange(radius)) { radius--; Structure base = StructureHelper.readStructure(BetterEnd.makeID("pillars/pillar_base_" + radius)); - Structure top = StructureHelper.readStructure(BetterEnd.makeID("pillars/pillar_top_" + radius + (spike.isGuarded() ? "_cage" : ""))); + Structure top = StructureHelper.readStructure( + BetterEnd.makeID("pillars/pillar_top_" + radius + (spike.isGuarded() ? "_cage" : ""))); BlockPos side = base.getSize(); BlockPos pos1 = new BlockPos(x - (side.getX() >> 1), minY - 3, z - (side.getZ() >> 1)); minY = pos1.getY() + side.getY(); side = top.getSize(); BlockPos pos2 = new BlockPos(x - (side.getX() >> 1), maxY, z - (side.getZ() >> 1)); maxY = pos2.getY(); - + StructurePlacementData data = new StructurePlacementData(); base.place(world, pos1, data, random); top.place(world, pos2, data, random); - + int r2 = radius * radius + 1; - Mutable mut = new Mutable(); + MutableBlockPos mut = new MutableBlockPos(); for (int px = -radius; px <= radius; px++) { mut.setX(x + px); int x2 = px * px; @@ -92,10 +96,10 @@ public class EndSpikeFeatureMixin { for (int py = minY; py < maxY; py++) { mut.setY(py); if (world.getBlockState(mut).getMaterial().isReplaceable()) { - if ((px == radius || px == -radius || pz == radius || pz == -radius) && random.nextInt(24) == 0) { + if ((px == radius || px == -radius || pz == radius || pz == -radius) + && random.nextInt(24) == 0) { BlocksHelper.setWithoutUpdate(world, mut, Blocks.CRYING_OBSIDIAN); - } - else { + } else { BlocksHelper.setWithoutUpdate(world, mut, Blocks.OBSIDIAN); } } @@ -103,11 +107,10 @@ public class EndSpikeFeatureMixin { } } } - } - else { + } else { minY -= 15; int r2 = radius * radius + 1; - Mutable mut = new Mutable(); + MutableBlockPos mut = new MutableBlockPos(); for (int px = -radius; px <= radius; px++) { mut.setX(x + px); int x2 = px * px; @@ -128,25 +131,30 @@ public class EndSpikeFeatureMixin { mut.setZ(z); mut.setY(maxY); BlocksHelper.setWithoutUpdate(world, mut, Blocks.BEDROCK); - + EndCrystalEntity crystal = EntityType.END_CRYSTAL.create(world.toServerWorld()); crystal.setBeamTarget(config.getPos()); crystal.setInvulnerable(config.isCrystalInvulnerable()); crystal.refreshPositionAndAngles(x + 0.5D, maxY + 1, z + 0.5D, random.nextFloat() * 360.0F, 0.0F); world.spawnEntity(crystal); - + if (spike.isGuarded()) { for (int px = -2; px <= 2; ++px) { - boolean bl = MathHelper.abs(px) == 2; + boolean bl = Mth.abs(px) == 2; for (int pz = -2; pz <= 2; ++pz) { - boolean bl2 = MathHelper.abs(pz) == 2; + boolean bl2 = Mth.abs(pz) == 2; for (int py = 0; py <= 3; ++py) { boolean bl3 = py == 3; if (bl || bl2 || bl3) { boolean bl4 = px == -2 || px == 2 || bl3; boolean bl5 = pz == -2 || pz == 2 || bl3; - BlockState blockState = (BlockState) ((BlockState) ((BlockState) ((BlockState) Blocks.IRON_BARS.getDefaultState().with(PaneBlock.NORTH, bl4 && pz != -2)).with(PaneBlock.SOUTH, bl4 && pz != 2)).with(PaneBlock.WEST, bl5 && px != -2)).with(PaneBlock.EAST, bl5 && px != 2); - BlocksHelper.setWithoutUpdate(world, mut.set(spike.getCenterX() + px, maxY + py, spike.getCenterZ() + pz), blockState); + BlockState blockState = (BlockState) ((BlockState) ((BlockState) ((BlockState) Blocks.IRON_BARS + .defaultBlockState().with(PaneBlock.NORTH, bl4 && pz != -2)) + .with(PaneBlock.SOUTH, bl4 && pz != 2)).with(PaneBlock.WEST, + bl5 && px != -2)).with(PaneBlock.EAST, bl5 && px != 2); + BlocksHelper.setWithoutUpdate(world, + mut.set(spike.getCenterX() + px, maxY + py, spike.getCenterZ() + pz), + blockState); } } } @@ -156,7 +164,7 @@ public class EndSpikeFeatureMixin { info.cancel(); } - + private boolean be_radiusInRange(int radius) { return radius > 1 && radius < 6; } diff --git a/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java b/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java index 3abbf94d..8cef9161 100644 --- a/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java @@ -5,20 +5,20 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.mob.EndermanEntity; -import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.mob.EndermanEntity; +import net.minecraft.world.entity.player.PlayerEntity; import ru.betterend.effects.EndEnchantments; import ru.betterend.effects.EndStatusEffects; @Mixin(EndermanEntity.class) public abstract class EndermanEntityMixin { - + @Inject(method = "isPlayerStaring", at = @At("HEAD"), cancellable = true) private void be_isPlayerStaring(PlayerEntity player, CallbackInfoReturnable info) { - if (player.isCreative() || player.hasStatusEffect(EndStatusEffects.END_VEIL) || - EnchantmentHelper.getLevel(EndEnchantments.END_VEIL, player.getEquippedStack(EquipmentSlot.HEAD)) > 0) { + if (player.isCreative() || player.hasStatusEffect(EndStatusEffects.END_VEIL) || EnchantmentHelper + .getLevel(EndEnchantments.END_VEIL, player.getEquippedStack(EquipmentSlot.HEAD)) > 0) { info.setReturnValue(false); } } diff --git a/src/main/java/ru/betterend/mixin/common/EntityMixin.java b/src/main/java/ru/betterend/mixin/common/EntityMixin.java index de405742..3a5f1047 100644 --- a/src/main/java/ru/betterend/mixin/common/EntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EntityMixin.java @@ -7,13 +7,13 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.core.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.TeleportTarget; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; import ru.betterend.interfaces.TeleportingEntity; @Mixin(Entity.class) @@ -26,26 +26,26 @@ public abstract class EntityMixin implements TeleportingEntity { @Shadow public boolean removed; @Shadow - public World world; - + public Level world; + @Final @Shadow public abstract void detach(); - + @Shadow public abstract Vec3d getVelocity(); - + @Shadow public abstract EntityType getType(); - + @Shadow - protected abstract TeleportTarget getTeleportTarget(ServerWorld destination); + protected abstract TeleportTarget getTeleportTarget(ServerLevel destination); private BlockPos exitPos; @Inject(method = "moveToWorld", at = @At("HEAD"), cancellable = true) - public void be_moveToWorld(ServerWorld destination, CallbackInfoReturnable info) { - if (!removed && beCanTeleport() && world instanceof ServerWorld) { + public void be_moveToWorld(ServerLevel destination, CallbackInfoReturnable info) { + if (!removed && beCanTeleport() && world instanceof ServerLevel) { this.detach(); this.world.getProfiler().push("changeDimension"); this.world.getProfiler().push("reposition"); @@ -55,13 +55,14 @@ public abstract class EntityMixin implements TeleportingEntity { Entity entity = this.getType().create(destination); if (entity != null) { entity.copyFrom(Entity.class.cast(this)); - entity.refreshPositionAndAngles(teleportTarget.position.x, teleportTarget.position.y, teleportTarget.position.z, teleportTarget.yaw, entity.pitch); + entity.refreshPositionAndAngles(teleportTarget.position.x, teleportTarget.position.y, + teleportTarget.position.z, teleportTarget.yaw, entity.pitch); entity.setVelocity(teleportTarget.velocity); destination.onDimensionChanged(entity); } this.removed = true; this.world.getProfiler().pop(); - ((ServerWorld) world).resetIdleTimeout(); + ((ServerLevel) world).resetIdleTimeout(); destination.resetIdleTimeout(); this.world.getProfiler().pop(); this.beResetExitPos(); @@ -69,11 +70,12 @@ public abstract class EntityMixin implements TeleportingEntity { } } } - + @Inject(method = "getTeleportTarget", at = @At("HEAD"), cancellable = true) - protected void be_getTeleportTarget(ServerWorld destination, CallbackInfoReturnable info) { + protected void be_getTeleportTarget(ServerLevel destination, CallbackInfoReturnable info) { if (beCanTeleport()) { - info.setReturnValue(new TeleportTarget(new Vec3d(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), getVelocity(), yaw, pitch)); + info.setReturnValue(new TeleportTarget( + new Vec3d(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), getVelocity(), yaw, pitch)); } } diff --git a/src/main/java/ru/betterend/mixin/common/HostileEntityMixin.java b/src/main/java/ru/betterend/mixin/common/HostileEntityMixin.java index 0e2e4bcb..04ab3397 100644 --- a/src/main/java/ru/betterend/mixin/common/HostileEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/HostileEntityMixin.java @@ -8,22 +8,26 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.SpawnReason; -import net.minecraft.entity.mob.EndermanEntity; -import net.minecraft.entity.mob.HostileEntity; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.SpawnReason; +import net.minecraft.world.entity.mob.EndermanEntity; +import net.minecraft.world.entity.mob.HostileEntity; +import net.minecraft.core.BlockPos; import net.minecraft.util.math.Box; import net.minecraft.world.ServerWorldAccess; @Mixin(HostileEntity.class) public class HostileEntityMixin { @Inject(method = "canSpawnInDark", at = @At(value = "RETURN"), cancellable = true) - private static void be_endermenCheck(EntityType type, ServerWorldAccess serverWorldAccess, SpawnReason spawnReason, BlockPos pos, Random random, CallbackInfoReturnable info) { + private static void be_endermenCheck(EntityType type, ServerWorldAccess serverWorldAccess, + SpawnReason spawnReason, BlockPos pos, Random random, CallbackInfoReturnable info) { boolean canSpawn = info.getReturnValue(); if (canSpawn && spawnReason == SpawnReason.NATURAL && type == EntityType.ENDERMAN) { Box box = new Box(pos).expand(16); - List entities = serverWorldAccess.getEntitiesByClass(EndermanEntity.class, box, (entity) -> { return true; }); + List entities = serverWorldAccess.getEntitiesByClass(EndermanEntity.class, box, + (entity) -> { + return true; + }); info.setReturnValue(entities.size() < 6); } } diff --git a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java index 442fdeae..58e071f2 100644 --- a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java @@ -8,24 +8,24 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.attribute.EntityAttributeModifier; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.item.Item; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.attribute.EntityAttributeModifier; +import net.minecraft.world.entity.attribute.EntityAttributes; +import net.minecraft.world.entity.damage.DamageSource; +import net.minecraft.world.item.Item; @Mixin(LivingEntity.class) public abstract class LivingEntityMixin { private Entity lastAttacker; - + @Inject(method = "damage", at = @At("HEAD")) public void be_damage(DamageSource source, float amount, CallbackInfoReturnable info) { this.lastAttacker = source.getAttacker(); } - + @ModifyArg(method = "damage", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;takeKnockback(FDD)V")) private float be_increaseKnockback(float value, double x, double z) { if (lastAttacker != null && lastAttacker instanceof LivingEntity) { @@ -34,11 +34,12 @@ public abstract class LivingEntityMixin { } return value; } - + private double be_getKnockback(Item tool) { - if (tool == null) return 0.0D; + if (tool == null) + return 0.0D; Collection modifiers = tool.getAttributeModifiers(EquipmentSlot.MAINHAND) - .get(EntityAttributes.GENERIC_ATTACK_KNOCKBACK); + .get(EntityAttributes.GENERIC_ATTACK_KNOCKBACK); if (modifiers.size() > 0) { return modifiers.iterator().next().getValue(); } diff --git a/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java b/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java index f739527e..3bdf2c65 100644 --- a/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java @@ -17,10 +17,10 @@ import net.minecraft.resource.ServerResourceManager; import net.minecraft.server.MinecraftServer; import net.minecraft.server.PlayerManager; import net.minecraft.server.WorldGenerationProgressListener; -import net.minecraft.server.world.ServerWorld; +import net.minecraft.server.level.ServerLevel; import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.SaveProperties; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; import net.minecraft.world.level.ServerWorldProperties; import ru.betterend.recipe.EndRecipeManager; import ru.betterend.registry.EndBiomes; @@ -30,11 +30,11 @@ import ru.betterend.world.generator.GeneratorOptions; public class MinecraftServerMixin { @Shadow private ServerResourceManager serverResourceManager; - + @Final @Shadow - private Map, ServerWorld> worlds; - + private Map, ServerLevel> worlds; + @Final @Shadow protected SaveProperties saveProperties; @@ -49,25 +49,26 @@ public class MinecraftServerMixin { beInjectRecipes(); EndBiomes.initRegistry((MinecraftServer) (Object) this); } - + @Inject(method = "getOverworld", at = @At(value = "HEAD"), cancellable = true) - private final void beGetOverworld(CallbackInfoReturnable info) { + private final void beGetOverworld(CallbackInfoReturnable info) { if (GeneratorOptions.swapOverworldToEnd()) { - ServerWorld world = worlds.get(World.END); + ServerLevel world = worlds.get(Level.END); if (world == null) { - world = worlds.get(World.OVERWORLD); + world = worlds.get(Level.OVERWORLD); } info.setReturnValue(world); info.cancel(); } } - + @Inject(method = "createWorlds", at = @At(value = "TAIL")) - private final void be_CreateWorlds(WorldGenerationProgressListener worldGenerationProgressListener, CallbackInfo info) { + private final void be_CreateWorlds(WorldGenerationProgressListener worldGenerationProgressListener, + CallbackInfo info) { if (GeneratorOptions.swapOverworldToEnd()) { - ServerWorld world = worlds.get(World.END); + ServerLevel world = worlds.get(Level.END); if (world == null) { - world = worlds.get(World.OVERWORLD); + world = worlds.get(Level.OVERWORLD); } this.getPlayerManager().setMainWorld(world); ServerWorldProperties serverWorldProperties = saveProperties.getMainWorldProperties(); @@ -76,17 +77,20 @@ public class MinecraftServerMixin { setupSpawn(world, serverWorldProperties, generatorOptions.hasBonusChest(), bl, true); } } - + @Inject(method = "setupSpawn", at = @At(value = "HEAD"), cancellable = true) - private static void be_SetupSpawn(ServerWorld world, ServerWorldProperties serverWorldProperties, boolean bonusChest, boolean debugWorld, boolean bl, CallbackInfo info) { - if (GeneratorOptions.swapOverworldToEnd() && world.getRegistryKey() == World.OVERWORLD) { + private static void be_SetupSpawn(ServerLevel world, ServerWorldProperties serverWorldProperties, + boolean bonusChest, boolean debugWorld, boolean bl, CallbackInfo info) { + if (GeneratorOptions.swapOverworldToEnd() && world.dimension() == Level.OVERWORLD) { info.cancel(); } } - + @Shadow - private static void setupSpawn(ServerWorld world, ServerWorldProperties serverWorldProperties, boolean bonusChest, boolean debugWorld, boolean bl) {} - + private static void setupSpawn(ServerLevel world, ServerWorldProperties serverWorldProperties, boolean bonusChest, + boolean debugWorld, boolean bl) { + } + @Shadow public PlayerManager getPlayerManager() { return null; diff --git a/src/main/java/ru/betterend/mixin/common/PlayerAdvancementTrackerMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerAdvancementTrackerMixin.java index 2acef8ea..035398e3 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerAdvancementTrackerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerAdvancementTrackerMixin.java @@ -1,5 +1,7 @@ package ru.betterend.mixin.common; +import net.minecraft.advancements.Advancement; +import net.minecraft.server.PlayerAdvancements; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -7,22 +9,19 @@ import org.spongepowered.asm.mixin.injection.At.Shift; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.advancement.Advancement; -import net.minecraft.advancement.PlayerAdvancementTracker; -import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.level.ServerPlayer; import ru.betterend.events.PlayerAdvancementsEvents; -@Mixin(PlayerAdvancementTracker.class) +@Mixin(PlayerAdvancements.class) public abstract class PlayerAdvancementTrackerMixin { - + @Shadow - private ServerPlayerEntity owner; - - @Inject(method = "grantCriterion", at = @At( - value = "INVOKE", - target = "Lnet/minecraft/advancement/AdvancementRewards;apply(Lnet/minecraft/server/network/ServerPlayerEntity;)V", - shift = Shift.AFTER)) - public void be_onAdvancementComplete(Advancement advancement, String criterionName, CallbackInfoReturnable info) { - PlayerAdvancementsEvents.PLAYER_ADVENCEMENT_COMPLETE.invoker().onAdvancementComplete(owner, advancement, criterionName); + private ServerPlayer owner; + + @Inject(method = "award", at = @At(value = "INVOKE", target = "Lnet/minecraft/advancements/AdvancementRewards;grant(Lnet/minecraft/server/level/ServerPlayer;)V", shift = Shift.AFTER)) + public void be_onAdvancementComplete(Advancement advancement, String criterionName, + CallbackInfoReturnable info) { + PlayerAdvancementsEvents.PLAYER_ADVANCEMENT_COMPLETE.invoker().onAdvancementComplete(owner, advancement, + criterionName); } } diff --git a/src/main/java/ru/betterend/mixin/common/PlayerEntityMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerEntityMixin.java index e85db22e..af378145 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerEntityMixin.java @@ -7,11 +7,11 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.util.math.Vec3d; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; @@ -22,29 +22,29 @@ import ru.betterend.util.MHelper; @Mixin(PlayerEntity.class) public abstract class PlayerEntityMixin { private static Direction[] HORIZONTAL; - + @Inject(method = "findRespawnPosition", at = @At(value = "HEAD"), cancellable = true) - private static void be_statueRespawn(ServerWorld world, BlockPos pos, float f, boolean bl, boolean bl2, CallbackInfoReturnable> info) { + private static void be_statueRespawn(ServerLevel world, BlockPos pos, float f, boolean bl, boolean bl2, + CallbackInfoReturnable> info) { BlockState blockState = world.getBlockState(pos); - if (blockState.isOf(EndBlocks.RESPAWN_OBELISK)) { + if (blockState.is(EndBlocks.RESPAWN_OBELISK)) { info.setReturnValue(beObeliskRespawnPosition(world, pos, blockState)); info.cancel(); } } - private static Optional beObeliskRespawnPosition(ServerWorld world, BlockPos pos, BlockState state) { - if (state.get(BlockProperties.TRIPLE_SHAPE) == TripleShape.TOP) { + private static Optional beObeliskRespawnPosition(ServerLevel world, BlockPos pos, BlockState state) { + if (state.getValue(BlockProperties.TRIPLE_SHAPE) == TripleShape.TOP) { pos = pos.down(2); - } - else if (state.get(BlockProperties.TRIPLE_SHAPE) == TripleShape.MIDDLE) { - pos = pos.down(); + } else if (state.getValue(BlockProperties.TRIPLE_SHAPE) == TripleShape.MIDDLE) { + pos = pos.below(); } if (HORIZONTAL == null) { HORIZONTAL = BlocksHelper.makeHorizontal(); } MHelper.shuffle(HORIZONTAL, world.getRandom()); - for (Direction dir: HORIZONTAL) { - BlockPos p = pos.offset(dir); + for (Direction dir : HORIZONTAL) { + BlockPos p = pos.relative(dir); BlockState state2 = world.getBlockState(p); if (!state2.getMaterial().blocksMovement() && state2.getCollisionShape(world, pos).isEmpty()) { return Optional.of(Vec3d.of(p).add(0.5, 0, 0.5)); diff --git a/src/main/java/ru/betterend/mixin/common/PlayerManagerMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerManagerMixin.java index ed4abddb..ed21cf4a 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerManagerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerManagerMixin.java @@ -19,9 +19,9 @@ import com.mojang.serialization.DataResult; import com.mojang.serialization.Dynamic; import io.netty.buffer.Unpooled; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.effect.StatusEffectInstance; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.Tag; @@ -42,8 +42,8 @@ import net.minecraft.scoreboard.ServerScoreboard; import net.minecraft.server.MinecraftServer; import net.minecraft.server.PlayerManager; import net.minecraft.server.network.ServerPlayNetworkHandler; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.level.ServerLevel; import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; import net.minecraft.util.Formatting; @@ -52,10 +52,10 @@ import net.minecraft.util.Util; import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.GameRules; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; import net.minecraft.world.WorldProperties; import net.minecraft.world.biome.source.BiomeAccess; -import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.level.dimension.DimensionType; import ru.betterend.world.generator.GeneratorOptions; @Mixin(PlayerManager.class) @@ -77,14 +77,14 @@ public class PlayerManagerMixin { @Final @Shadow - private List players; + private List players; @Final @Shadow - private Map playerMap; + private Map playerMap; @Inject(method = "onPlayerConnect", at = @At(value = "HEAD"), cancellable = true) - public void be_onPlayerConnect(ClientConnection connection, ServerPlayerEntity player, CallbackInfo info) { + public void be_onPlayerConnect(ClientConnection connection, ServerPlayer player, CallbackInfo info) { if (GeneratorOptions.swapOverworldToEnd()) { GameProfile gameProfile = player.getGameProfile(); UserCache userCache = this.server.getUserCache(); @@ -92,50 +92,57 @@ public class PlayerManagerMixin { String string = gameProfile2 == null ? gameProfile.getName() : gameProfile2.getName(); userCache.add(gameProfile); CompoundTag compoundTag = this.loadPlayerData(player); - RegistryKey var23; + RegistryKey var23; if (compoundTag != null) { - DataResult> var10000 = DimensionType.method_28521(new Dynamic(NbtOps.INSTANCE, compoundTag.get("Dimension"))); + DataResult> var10000 = DimensionType + .method_28521(new Dynamic(NbtOps.INSTANCE, compoundTag.get("Dimension"))); Logger var10001 = LOGGER; var10001.getClass(); - var23 = (RegistryKey) var10000.resultOrPartial(var10001::error).orElse(World.END); - } - else { - var23 = World.END; + var23 = (RegistryKey) var10000.resultOrPartial(var10001::error).orElse(Level.END); + } else { + var23 = Level.END; } - RegistryKey registryKey = var23; - ServerWorld serverWorld = this.server.getWorld(registryKey); - ServerWorld serverWorld3; + RegistryKey registryKey = var23; + ServerLevel serverWorld = this.server.getLevel(registryKey); + ServerLevel serverWorld3; if (serverWorld == null) { LOGGER.warn("Unknown respawn dimension {}, defaulting to overworld", registryKey); serverWorld3 = this.server.getOverworld(); - } - else { + } else { serverWorld3 = serverWorld; } player.setWorld(serverWorld3); - player.interactionManager.setWorld((ServerWorld) player.world); + player.interactionManager.setWorld((ServerLevel) player.world); String string2 = "local"; if (connection.getAddress() != null) { string2 = connection.getAddress().toString(); } - LOGGER.info("{}[{}] logged in with entity id {} at ({}, {}, {})", player.getName().getString(), string2, player.getEntityId(), player.getX(), player.getY(), player.getZ()); + LOGGER.info("{}[{}] logged in with entity id {} at ({}, {}, {})", player.getName().getString(), string2, + player.getEntityId(), player.getX(), player.getY(), player.getZ()); WorldProperties worldProperties = serverWorld3.getLevelProperties(); - this.setGameMode(player, (ServerPlayerEntity) null, serverWorld3); - ServerPlayNetworkHandler serverPlayNetworkHandler = new ServerPlayNetworkHandler(this.server, connection, player); + this.setGameMode(player, (ServerPlayer) null, serverWorld3); + ServerPlayNetworkHandler serverPlayNetworkHandler = new ServerPlayNetworkHandler(this.server, connection, + player); GameRules gameRules = serverWorld3.getGameRules(); boolean bl = gameRules.getBoolean(GameRules.DO_IMMEDIATE_RESPAWN); boolean bl2 = gameRules.getBoolean(GameRules.REDUCED_DEBUG_INFO); - serverPlayNetworkHandler.sendPacket(new GameJoinS2CPacket(player.getEntityId(), player.interactionManager.getGameMode(), player.interactionManager.getPreviousGameMode(), BiomeAccess.hashSeed(serverWorld3.getSeed()), - worldProperties.isHardcore(), this.server.getWorldRegistryKeys(), this.registryManager, serverWorld3.getDimension(), serverWorld3.getRegistryKey(), this.getMaxPlayerCount(), this.viewDistance, bl2, !bl, + serverPlayNetworkHandler.sendPacket(new GameJoinS2CPacket(player.getEntityId(), + player.interactionManager.getGameMode(), player.interactionManager.getPreviousGameMode(), + BiomeAccess.hashSeed(serverWorld3.getSeed()), worldProperties.isHardcore(), + this.server.getWorldRegistryKeys(), this.registryManager, serverWorld3.getDimension(), + serverWorld3.dimension(), this.getMaxPlayerCount(), this.viewDistance, bl2, !bl, serverWorld3.isDebugWorld(), serverWorld3.isFlat())); - serverPlayNetworkHandler.sendPacket(new CustomPayloadS2CPacket(CustomPayloadS2CPacket.BRAND, (new PacketByteBuf(Unpooled.buffer())).writeString(this.getServer().getServerModName()))); - serverPlayNetworkHandler.sendPacket(new DifficultyS2CPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); + serverPlayNetworkHandler.sendPacket(new CustomPayloadS2CPacket(CustomPayloadS2CPacket.BRAND, + (new PacketByteBuf(Unpooled.buffer())).writeString(this.getServer().getServerModName()))); + serverPlayNetworkHandler.sendPacket( + new DifficultyS2CPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); serverPlayNetworkHandler.sendPacket(new PlayerAbilitiesS2CPacket(player.abilities)); serverPlayNetworkHandler.sendPacket(new HeldItemChangeS2CPacket(player.inventory.selectedSlot)); - serverPlayNetworkHandler.sendPacket(new SynchronizeRecipesS2CPacket(this.server.getRecipeManager().values())); + serverPlayNetworkHandler + .sendPacket(new SynchronizeRecipesS2CPacket(this.server.getRecipeManager().values())); serverPlayNetworkHandler.sendPacket(new SynchronizeTagsS2CPacket(this.server.getTagManager())); this.sendCommandTree(player); player.getStatHandler().updateStatSet(); @@ -144,20 +151,24 @@ public class PlayerManagerMixin { this.server.forcePlayerSampleUpdate(); TranslatableText mutableText2; if (player.getGameProfile().getName().equalsIgnoreCase(string)) { - mutableText2 = new TranslatableText("multiplayer.player.joined", new Object[] { player.getDisplayName() }); - } - else { - mutableText2 = new TranslatableText("multiplayer.player.joined.renamed", new Object[] { player.getDisplayName(), string }); + mutableText2 = new TranslatableText("multiplayer.player.joined", + new Object[] { player.getDisplayName() }); + } else { + mutableText2 = new TranslatableText("multiplayer.player.joined.renamed", + new Object[] { player.getDisplayName(), string }); } this.broadcastChatMessage(mutableText2.formatted(Formatting.YELLOW), MessageType.SYSTEM, Util.NIL_UUID); - serverPlayNetworkHandler.requestTeleport(player.getX(), player.getY(), player.getZ(), player.yaw, player.pitch); + serverPlayNetworkHandler.requestTeleport(player.getX(), player.getY(), player.getZ(), player.yaw, + player.pitch); this.players.add(player); this.playerMap.put(player.getUuid(), player); - this.sendToAll(new PlayerListS2CPacket(PlayerListS2CPacket.Action.ADD_PLAYER, new ServerPlayerEntity[] { player })); + this.sendToAll( + new PlayerListS2CPacket(PlayerListS2CPacket.Action.ADD_PLAYER, new ServerPlayer[] { player })); for (int i = 0; i < this.players.size(); ++i) { - player.networkHandler.sendPacket(new PlayerListS2CPacket(PlayerListS2CPacket.Action.ADD_PLAYER, new ServerPlayerEntity[] { (ServerPlayerEntity) this.players.get(i) })); + player.networkHandler.sendPacket(new PlayerListS2CPacket(PlayerListS2CPacket.Action.ADD_PLAYER, + new ServerPlayer[] { (ServerPlayer) this.players.get(i) })); } serverWorld3.onPlayerConnected(player); @@ -171,20 +182,21 @@ public class PlayerManagerMixin { while (var24.hasNext()) { StatusEffectInstance statusEffectInstance = (StatusEffectInstance) var24.next(); - serverPlayNetworkHandler.sendPacket(new EntityStatusEffectS2CPacket(player.getEntityId(), statusEffectInstance)); + serverPlayNetworkHandler + .sendPacket(new EntityStatusEffectS2CPacket(player.getEntityId(), statusEffectInstance)); } if (compoundTag != null && compoundTag.contains("RootVehicle", 10)) { CompoundTag compoundTag2 = compoundTag.getCompound("RootVehicle"); - Entity entity = EntityType.loadEntityWithPassengers(compoundTag2.getCompound("Entity"), serverWorld3, (vehicle) -> { - return !serverWorld3.tryLoadEntity(vehicle) ? null : vehicle; - }); + Entity entity = EntityType.loadEntityWithPassengers(compoundTag2.getCompound("Entity"), serverWorld3, + (vehicle) -> { + return !serverWorld3.tryLoadEntity(vehicle) ? null : vehicle; + }); if (entity != null) { UUID uUID2; if (compoundTag2.containsUuid("Attach")) { uUID2 = compoundTag2.getUuid("Attach"); - } - else { + } else { uUID2 = null; } @@ -192,8 +204,7 @@ public class PlayerManagerMixin { Entity entity3; if (entity.getUuid().equals(uUID2)) { player.startRiding(entity, true); - } - else { + } else { var21 = entity.getPassengersDeep().iterator(); while (var21.hasNext()) { @@ -224,15 +235,17 @@ public class PlayerManagerMixin { } @Shadow - public CompoundTag loadPlayerData(ServerPlayerEntity player) { + public CompoundTag loadPlayerData(ServerPlayer player) { return null; } @Shadow - private void setGameMode(ServerPlayerEntity player, @Nullable ServerPlayerEntity oldPlayer, ServerWorld world) {} + private void setGameMode(ServerPlayer player, @Nullable ServerPlayer oldPlayer, ServerLevel world) { + } @Shadow - public void sendCommandTree(ServerPlayerEntity player) {} + public void sendCommandTree(ServerPlayer player) { + } @Shadow public int getMaxPlayerCount() { @@ -245,14 +258,18 @@ public class PlayerManagerMixin { } @Shadow - protected void sendScoreboard(ServerScoreboard scoreboard, ServerPlayerEntity player) {} + protected void sendScoreboard(ServerScoreboard scoreboard, ServerPlayer player) { + } @Shadow - public void broadcastChatMessage(Text message, MessageType type, UUID senderUuid) {} + public void broadcastChatMessage(Text message, MessageType type, UUID senderUuid) { + } @Shadow - public void sendToAll(Packet packet) {} + public void sendToAll(Packet packet) { + } @Shadow - public void sendWorldInfo(ServerPlayerEntity player, ServerWorld world) {} + public void sendWorldInfo(ServerPlayer player, ServerLevel world) { + } } diff --git a/src/main/java/ru/betterend/mixin/common/RecipeManagerAccessor.java b/src/main/java/ru/betterend/mixin/common/RecipeManagerAccessor.java index deaa0d66..759f56f3 100644 --- a/src/main/java/ru/betterend/mixin/common/RecipeManagerAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/RecipeManagerAccessor.java @@ -5,16 +5,16 @@ import java.util.Map; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -import net.minecraft.recipe.Recipe; -import net.minecraft.recipe.RecipeManager; -import net.minecraft.recipe.RecipeType; -import net.minecraft.util.Identifier; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.resources.ResourceLocation; @Mixin(RecipeManager.class) public interface RecipeManagerAccessor { @Accessor("recipes") - Map, Map>> getRecipes(); + Map, Map>> getRecipes(); @Accessor("recipes") - void setRecipes(Map, Map>> recipes); + void setRecipes(Map, Map>> recipes); } \ No newline at end of file diff --git a/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java b/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java index 38497ec6..10dce970 100644 --- a/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java @@ -16,39 +16,42 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.google.gson.JsonElement; import net.minecraft.inventory.Inventory; -import net.minecraft.recipe.Recipe; -import net.minecraft.recipe.RecipeManager; -import net.minecraft.recipe.RecipeType; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.resource.ResourceManager; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Util; import net.minecraft.util.profiler.Profiler; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; import ru.betterend.recipe.EndRecipeManager; @Mixin(RecipeManager.class) public class RecipeManagerMixin { @Shadow - private Map, Map>> recipes; + private Map, Map>> recipes; @Inject(method = "apply", at = @At(value = "RETURN")) - private void beSetRecipes(Map map, ResourceManager resourceManager, Profiler profiler, CallbackInfo info) { + private void beSetRecipes(Map map, ResourceManager resourceManager, + Profiler profiler, CallbackInfo info) { recipes = EndRecipeManager.getMap(recipes); } @Shadow - private > Map> getAllOfType(RecipeType type) { + private > Map> getAllOfType( + RecipeType type) { return null; } /** * @author paulevs - * @reason Remove conflicts with vanilla tags - * Change recipe order to show mod recipes first, helps when block have vanilla tag - * (example - mod stone with vanilla tags and furnace from that stone) + * @reason Remove conflicts with vanilla tags Change recipe order to show mod + * recipes first, helps when block have vanilla tag (example - mod stone + * with vanilla tags and furnace from that stone) */ @Overwrite - public > Optional getFirstMatch(RecipeType type, C inventory, World world) { + public > Optional getFirstMatch(RecipeType type, C inventory, + Level world) { Collection> values = getAllOfType(type).values(); List> list = new ArrayList>(values); list.sort((v1, v2) -> { diff --git a/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java b/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java index 1342b15a..9c95d85e 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java @@ -10,9 +10,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.mojang.authlib.GameProfile; -import net.minecraft.entity.Entity; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.effect.StatusEffectInstance; +import net.minecraft.world.entity.player.PlayerEntity; import net.minecraft.network.packet.s2c.play.DifficultyS2CPacket; import net.minecraft.network.packet.s2c.play.EntityStatusEffectS2CPacket; import net.minecraft.network.packet.s2c.play.PlayerAbilitiesS2CPacket; @@ -21,19 +21,19 @@ import net.minecraft.network.packet.s2c.play.WorldEventS2CPacket; import net.minecraft.server.MinecraftServer; import net.minecraft.server.PlayerManager; import net.minecraft.server.network.ServerPlayNetworkHandler; -import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.ServerPlayerInteractionManager; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.core.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.TeleportTarget; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; import net.minecraft.world.WorldProperties; import net.minecraft.world.biome.source.BiomeAccess; import ru.betterend.interfaces.TeleportingEntity; import ru.betterend.world.generator.GeneratorOptions; -@Mixin(ServerPlayerEntity.class) +@Mixin(ServerPlayer.class) public abstract class ServerPlayerEntityMixin extends PlayerEntity implements TeleportingEntity { @Shadow @@ -55,34 +55,38 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntity implements Te private BlockPos exitPos; - public ServerPlayerEntityMixin(World world, BlockPos pos, float yaw, GameProfile profile) { + public ServerPlayerEntityMixin(Level world, BlockPos pos, float yaw, GameProfile profile) { super(world, pos, yaw, profile); } @Inject(method = "createEndSpawnPlatform", at = @At("HEAD"), cancellable = true) - private void be_createEndSpawnPlatform(ServerWorld world, BlockPos centerPos, CallbackInfo info) { + private void be_createEndSpawnPlatform(ServerLevel world, BlockPos centerPos, CallbackInfo info) { if (!GeneratorOptions.generateObsidianPlatform()) { info.cancel(); } } @Inject(method = "getTeleportTarget", at = @At("HEAD"), cancellable = true) - protected void be_getTeleportTarget(ServerWorld destination, CallbackInfoReturnable info) { + protected void be_getTeleportTarget(ServerLevel destination, CallbackInfoReturnable info) { if (beCanTeleport()) { - info.setReturnValue(new TeleportTarget(new Vec3d(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), getVelocity(), yaw, pitch)); + info.setReturnValue(new TeleportTarget( + new Vec3d(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), getVelocity(), yaw, pitch)); } } @Inject(method = "moveToWorld", at = @At("HEAD"), cancellable = true) - public void be_moveToWorld(ServerWorld destination, CallbackInfoReturnable info) { - if (beCanTeleport() && world instanceof ServerWorld) { + public void be_moveToWorld(ServerLevel destination, CallbackInfoReturnable info) { + if (beCanTeleport() && world instanceof ServerLevel) { this.inTeleportationState = true; - ServerWorld serverWorld = this.getServerWorld(); + ServerLevel serverWorld = this.getServerWorld(); WorldProperties worldProperties = destination.getLevelProperties(); - ServerPlayerEntity player = ServerPlayerEntity.class.cast(this); - this.networkHandler.sendPacket(new PlayerRespawnS2CPacket(destination.getDimension(), destination.getRegistryKey(), BiomeAccess.hashSeed(destination.getSeed()), - interactionManager.getGameMode(),interactionManager.getPreviousGameMode(), destination.isDebugWorld(), destination.isFlat(), true)); - this.networkHandler.sendPacket(new DifficultyS2CPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); + ServerPlayer player = ServerPlayer.class.cast(this); + this.networkHandler.sendPacket(new PlayerRespawnS2CPacket(destination.getDimension(), + destination.dimension(), BiomeAccess.hashSeed(destination.getSeed()), + interactionManager.getGameMode(), interactionManager.getPreviousGameMode(), + destination.isDebugWorld(), destination.isFlat(), true)); + this.networkHandler.sendPacket( + new DifficultyS2CPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); PlayerManager playerManager = this.server.getPlayerManager(); playerManager.sendCommandTree(player); serverWorld.removePlayer(player); @@ -95,7 +99,8 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntity implements Te this.setWorld(destination); destination.onPlayerChangeDimension(player); this.setRotation(teleportTarget.yaw, teleportTarget.pitch); - this.refreshPositionAfterTeleport(teleportTarget.position.x, teleportTarget.position.y, teleportTarget.position.z); + this.refreshPositionAfterTeleport(teleportTarget.position.x, teleportTarget.position.y, + teleportTarget.position.z); serverWorld.getProfiler().pop(); this.worldChanged(serverWorld); this.interactionManager.setWorld(destination); @@ -104,7 +109,8 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntity implements Te playerManager.sendPlayerStatus(player); for (StatusEffectInstance statusEffectInstance : this.getStatusEffects()) { - this.networkHandler.sendPacket(new EntityStatusEffectS2CPacket(getEntityId(), statusEffectInstance)); + this.networkHandler + .sendPacket(new EntityStatusEffectS2CPacket(getEntityId(), statusEffectInstance)); } this.networkHandler.sendPacket(new WorldEventS2CPacket(1032, BlockPos.ORIGIN, 0, false)); @@ -118,14 +124,14 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntity implements Te } @Shadow - abstract ServerWorld getServerWorld(); + abstract ServerLevel getServerWorld(); @Shadow - abstract void worldChanged(ServerWorld origin); + abstract void worldChanged(ServerLevel origin); @Shadow @Override - protected abstract TeleportTarget getTeleportTarget(ServerWorld destination); + protected abstract TeleportTarget getTeleportTarget(ServerLevel destination); @Override public void beSetExitPos(BlockPos pos) { diff --git a/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java b/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java index a48eca97..5ca3794c 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java @@ -17,11 +17,11 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtHelper; import net.minecraft.server.MinecraftServer; import net.minecraft.server.WorldGenerationProgressListener; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.core.BlockPos; import net.minecraft.util.registry.RegistryKey; -import net.minecraft.world.World; -import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.gen.Spawner; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.level.ServerWorldProperties; @@ -31,36 +31,39 @@ import ru.betterend.util.DataFixerUtil; import ru.betterend.util.WorldDataUtil; import ru.betterend.world.generator.GeneratorOptions; -@Mixin(ServerWorld.class) +@Mixin(ServerLevel.class) public class ServerWorldMixin { private static final int DEV_VERSION = be_getVersionInt("63.63.63"); private static final int FIX_VERSION = DEV_VERSION; private static String lastWorld = null; - + @Inject(method = "*", at = @At("TAIL")) - private void be_onServerWorldInit(MinecraftServer server, Executor workerExecutor, LevelStorage.Session session, ServerWorldProperties properties, RegistryKey registryKey, DimensionType dimensionType, WorldGenerationProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, boolean debugWorld, long l, List list, boolean bl, CallbackInfo info) { + private void be_onServerWorldInit(MinecraftServer server, Executor workerExecutor, LevelStorage.Session session, + ServerWorldProperties properties, RegistryKey registryKey, DimensionType dimensionType, + WorldGenerationProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, + boolean debugWorld, long l, List list, boolean bl, CallbackInfo info) { if (lastWorld != null && lastWorld.equals(session.getDirectoryName())) { return; } - + lastWorld = session.getDirectoryName(); - + @SuppressWarnings("resource") - ServerWorld world = (ServerWorld) (Object) this; - File dir = session.getWorldDirectory(world.getRegistryKey()); + ServerLevel world = (ServerLevel) (Object) this; + File dir = session.getWorldDirectory(world.dimension()); if (!new File(dir, "level.dat").exists()) { dir = dir.getParentFile(); } File data = new File(dir, "data/betterend_data.nbt"); - + ModMetadata meta = FabricLoader.getInstance().getModContainer(BetterEnd.MOD_ID).get().getMetadata(); int version = BetterEnd.isDevEnvironment() ? DEV_VERSION : be_getVersionInt(meta.getVersion().toString()); - + WorldDataUtil.load(data); CompoundTag root = WorldDataUtil.getRootTag(); int dataVersion = be_getVersionInt(root.getString("version")); GeneratorOptions.setPortalPos(NbtHelper.toBlockPos(root.getCompound("portal"))); - + if (dataVersion < version) { if (version < FIX_VERSION) { DataFixerUtil.fixData(data.getParentFile()); @@ -73,13 +76,13 @@ public class ServerWorldMixin { @Inject(method = "getSpawnPos", at = @At("HEAD"), cancellable = true) private void be_getSpawnPos(CallbackInfoReturnable info) { if (GeneratorOptions.changeSpawn()) { - if (((ServerWorld) (Object) this).getRegistryKey() == World.END) { + if (((ServerLevel) (Object) this).dimension() == Level.END) { info.setReturnValue(GeneratorOptions.getSpawn()); info.cancel(); } } } - + private static int be_getVersionInt(String version) { if (version.isEmpty()) { return 0; @@ -87,12 +90,11 @@ public class ServerWorldMixin { try { String[] values = version.split("\\."); return Integer.parseInt(values[0]) << 12 | Integer.parseInt(values[1]) << 6 | Integer.parseInt(values[1]); - } - catch (Exception e) { + } catch (Exception e) { return 0; } } - + private static String be_getVersionString(int version) { int a = (version >> 12) & 63; int b = (version >> 6) & 63; diff --git a/src/main/java/ru/betterend/mixin/common/SlimeEntityMixin.java b/src/main/java/ru/betterend/mixin/common/SlimeEntityMixin.java index f4042106..d4874e59 100644 --- a/src/main/java/ru/betterend/mixin/common/SlimeEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/SlimeEntityMixin.java @@ -3,14 +3,15 @@ package ru.betterend.mixin.common; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import net.minecraft.entity.mob.SlimeEntity; +import net.minecraft.world.entity.mob.SlimeEntity; import ru.betterend.interfaces.ISlime; @Mixin(SlimeEntity.class) public class SlimeEntityMixin implements ISlime { @Shadow - protected void setSize(int size, boolean heal) {} - + protected void setSize(int size, boolean heal) { + } + @Override public void beSetSlimeSize(int size, boolean heal) { setSize(size, heal); diff --git a/src/main/java/ru/betterend/mixin/common/TagGroupLoaderMixin.java b/src/main/java/ru/betterend/mixin/common/TagGroupLoaderMixin.java index 21038c9e..8f7c02d2 100644 --- a/src/main/java/ru/betterend/mixin/common/TagGroupLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/common/TagGroupLoaderMixin.java @@ -11,22 +11,23 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.resource.ResourceManager; -import net.minecraft.tag.Tag; -import net.minecraft.tag.TagGroupLoader; -import net.minecraft.util.Identifier; +import net.minecraft.tags.Tag; +import net.minecraft.tags.TagGroupLoader; +import net.minecraft.resources.ResourceLocation; import ru.betterend.util.TagHelper; @Mixin(TagGroupLoader.class) public class TagGroupLoaderMixin { - + @Shadow private String entryType; - + @Inject(method = "prepareReload", at = @At("RETURN"), cancellable = true) - public void be_prepareReload(ResourceManager manager, Executor prepareExecutor, CallbackInfoReturnable>> info) { - CompletableFuture> future = info.getReturnValue(); + public void be_prepareReload(ResourceManager manager, Executor prepareExecutor, + CallbackInfoReturnable>> info) { + CompletableFuture> future = info.getReturnValue(); info.setReturnValue(CompletableFuture.supplyAsync(() -> { - Map map = future.join(); + Map map = future.join(); TagHelper.apply(entryType, map); return map; })); diff --git a/src/main/java/ru/betterend/noise/VoronoiNoise.java b/src/main/java/ru/betterend/noise/VoronoiNoise.java index cddc7b4d..c7735336 100644 --- a/src/main/java/ru/betterend/noise/VoronoiNoise.java +++ b/src/main/java/ru/betterend/noise/VoronoiNoise.java @@ -2,13 +2,13 @@ package ru.betterend.noise; import java.util.Random; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import ru.betterend.util.MHelper; public class VoronoiNoise { private static final Random RANDOM = new Random(); final int seed; - + public VoronoiNoise() { this(0); } @@ -16,7 +16,7 @@ public class VoronoiNoise { public VoronoiNoise(int seed) { this.seed = seed; } - + private int getSeed(int x, int y, int z) { int h = seed + x * 374761393 + y * 668265263 + z; h = (h ^ (h >> 13)) * 1274126177; @@ -27,13 +27,13 @@ public class VoronoiNoise { int ix = MHelper.floor(x); int iy = MHelper.floor(y); int iz = MHelper.floor(z); - + float px = (float) (x - ix); float py = (float) (y - iy); float pz = (float) (z - iz); - + float d = 10; - + for (int pox = -1; pox < 2; pox++) { for (int poy = -1; poy < 2; poy++) { for (int poz = -1; poz < 2; poz++) { @@ -48,19 +48,19 @@ public class VoronoiNoise { } } } - + return Math.sqrt(d); } - + public BlockPos[] getPos(double x, double y, double z, double scale) { int ix = MHelper.floor(x); int iy = MHelper.floor(y); int iz = MHelper.floor(z); - + float px = (float) (x - ix); float py = (float) (y - iy); float pz = (float) (z - iz); - + float d = 10; float selX = 0; float selY = 0; @@ -68,7 +68,7 @@ public class VoronoiNoise { float selXPre = 0; float selYPre = 0; float selZPre = 0; - + for (int pox = -1; pox < 2; pox++) { for (int poy = -1; poy < 2; poy++) { for (int poz = -1; poz < 2; poz++) { @@ -89,9 +89,11 @@ public class VoronoiNoise { } } } - - BlockPos p1 = new BlockPos((ix + (double) selX) * scale, (iy + (double) selY) * scale, (iz + (double) selZ) * scale); - BlockPos p2 = new BlockPos((ix + (double) selXPre) * scale, (iy + (double) selYPre) * scale, (iz + (double) selZPre) * scale); - return new BlockPos[] {p1, p2}; + + BlockPos p1 = new BlockPos((ix + (double) selX) * scale, (iy + (double) selY) * scale, + (iz + (double) selZ) * scale); + BlockPos p2 = new BlockPos((ix + (double) selXPre) * scale, (iy + (double) selYPre) * scale, + (iz + (double) selZPre) * scale); + return new BlockPos[] { p1, p2 }; } } diff --git a/src/main/java/ru/betterend/particle/FireflyParticle.java b/src/main/java/ru/betterend/particle/FireflyParticle.java index 5bb620f4..808d69fc 100644 --- a/src/main/java/ru/betterend/particle/FireflyParticle.java +++ b/src/main/java/ru/betterend/particle/FireflyParticle.java @@ -2,25 +2,26 @@ package ru.betterend.particle; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.particle.AnimatedParticle; +import net.minecraft.client.particle.SimpleAnimatedParticle; import net.minecraft.client.particle.Particle; import net.minecraft.client.particle.ParticleFactory; -import net.minecraft.client.particle.SpriteProvider; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.particle.DefaultParticleType; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.util.Mth; import ru.betterend.util.MHelper; @Environment(EnvType.CLIENT) -public class FireflyParticle extends AnimatedParticle { +public class FireflyParticle extends SimpleAnimatedParticle { private double preVX; private double preVY; private double preVZ; private double nextVX; private double nextVY; private double nextVZ; - - protected FireflyParticle(ClientWorld world, double x, double y, double z, SpriteProvider sprites, double r, double g, double b) { + + protected FireflyParticle(ClientLevel world, double x, double y, double z, SpriteSet sprites, double r, double g, + double b) { super(world, x, y, z, sprites, 0); setSprite(sprites.getSprite(random)); this.maxAge = MHelper.randRange(150, 300, random); @@ -28,16 +29,16 @@ public class FireflyParticle extends AnimatedParticle { this.setTargetColor(15916745); this.setSpriteForAge(spriteProvider); this.setColorAlpha(0); - + preVX = random.nextGaussian() * 0.02; preVY = random.nextGaussian() * 0.02; preVZ = random.nextGaussian() * 0.02; - + nextVX = random.nextGaussian() * 0.02; nextVY = random.nextGaussian() * 0.02; nextVZ = random.nextGaussian() * 0.02; } - + @Override public void tick() { int ticks = this.age & 31; @@ -50,31 +51,31 @@ public class FireflyParticle extends AnimatedParticle { nextVZ = random.nextGaussian() * 0.02; } double delta = (double) ticks / 31.0; - - this.velocityX = MathHelper.lerp(delta, preVX, nextVX); - this.velocityY = MathHelper.lerp(delta, preVY, nextVY); - this.velocityZ = MathHelper.lerp(delta, preVZ, nextVZ); - + + this.velocityX = Mth.lerp(delta, preVX, nextVX); + this.velocityY = Mth.lerp(delta, preVY, nextVY); + this.velocityZ = Mth.lerp(delta, preVZ, nextVZ); + if (this.age <= 60) { this.setColorAlpha(this.age / 60F); - } - else if (this.age > maxAge - 60) { + } else if (this.age > maxAge - 60) { this.setColorAlpha((maxAge - this.age) / 60F); } - + super.tick(); } @Environment(EnvType.CLIENT) - public static class FireflyParticleFactory implements ParticleFactory { - private final SpriteProvider sprites; + public static class FireflyParticleFactory implements ParticleFactory { + private final SpriteSet sprites; - public FireflyParticleFactory(SpriteProvider sprites) { + public FireflyParticleFactory(SpriteSet sprites) { this.sprites = sprites; } @Override - public Particle createParticle(DefaultParticleType type, ClientWorld world, double x, double y, double z, double vX, double vY, double vZ) { + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, + double vX, double vY, double vZ) { return new FireflyParticle(world, x, y, z, sprites, 1, 1, 1); } } diff --git a/src/main/java/ru/betterend/particle/GlowingSphereParticleEffect.java b/src/main/java/ru/betterend/particle/GlowingSphereParticleEffect.java index 6abe69f1..2c971282 100644 --- a/src/main/java/ru/betterend/particle/GlowingSphereParticleEffect.java +++ b/src/main/java/ru/betterend/particle/GlowingSphereParticleEffect.java @@ -3,12 +3,12 @@ package ru.betterend.particle; import java.util.Locale; import net.minecraft.network.PacketByteBuf; -import net.minecraft.particle.ParticleEffect; -import net.minecraft.particle.ParticleType; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleType; +import net.minecraft.core.Registry; import ru.betterend.registry.EndParticles; -public class GlowingSphereParticleEffect implements ParticleEffect { +public class GlowingSphereParticleEffect implements ParticleOptions { private final float red; private final float green; private final float blue; @@ -33,7 +33,8 @@ public class GlowingSphereParticleEffect implements ParticleEffect { @Override public String asString() { - return String.format(Locale.ROOT, "%s %.2f %.2f %.2f", Registry.PARTICLE_TYPE.getId(this.getType()), this.red, this.green, this.blue); + return String.format(Locale.ROOT, "%s %.2f %.2f %.2f", Registry.PARTICLE_TYPE.getId(this.getType()), this.red, + this.green, this.blue); } public float getRed() { diff --git a/src/main/java/ru/betterend/particle/InfusionParticle.java b/src/main/java/ru/betterend/particle/InfusionParticle.java index 3df16b65..e856a4a0 100644 --- a/src/main/java/ru/betterend/particle/InfusionParticle.java +++ b/src/main/java/ru/betterend/particle/InfusionParticle.java @@ -6,14 +6,15 @@ import net.minecraft.client.particle.Particle; import net.minecraft.client.particle.ParticleFactory; import net.minecraft.client.particle.ParticleTextureSheet; import net.minecraft.client.particle.SpriteBillboardParticle; -import net.minecraft.client.particle.SpriteProvider; -import net.minecraft.client.world.ClientWorld; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.multiplayer.ClientLevel; public class InfusionParticle extends SpriteBillboardParticle { - - private final SpriteProvider spriteProvider; - public InfusionParticle(ClientWorld clientWorld, double x, double y, double z, double velocityX, double velocityY, double velocityZ, float[] palette, SpriteProvider spriteProvider) { + private final SpriteSet spriteProvider; + + public InfusionParticle(ClientLevel clientWorld, double x, double y, double z, double velocityX, double velocityY, + double velocityZ, float[] palette, SpriteSet spriteProvider) { super(clientWorld, x, y, z, 0.0, 0.0, 0.0); this.setSpriteForAge(spriteProvider); this.spriteProvider = spriteProvider; @@ -30,7 +31,7 @@ public class InfusionParticle extends SpriteBillboardParticle { public ParticleTextureSheet getType() { return ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT; } - + @Override public void tick() { this.prevPosX = this.x; @@ -49,13 +50,14 @@ public class InfusionParticle extends SpriteBillboardParticle { @Environment(EnvType.CLIENT) public static class InfusionFactory implements ParticleFactory { - private final SpriteProvider spriteProvider; - - public InfusionFactory(SpriteProvider spriteProvider) { + private final SpriteSet spriteProvider; + + public InfusionFactory(SpriteSet spriteProvider) { this.spriteProvider = spriteProvider; } - - public Particle createParticle(InfusionParticleType particleType, ClientWorld clientWorld, double d, double e, double f, double g, double h, double i) { + + public Particle createParticle(InfusionParticleType particleType, ClientLevel clientWorld, double d, double e, + double f, double g, double h, double i) { return new InfusionParticle(clientWorld, d, e, f, g, h, i, particleType.getPalette(), this.spriteProvider); } } diff --git a/src/main/java/ru/betterend/particle/InfusionParticleType.java b/src/main/java/ru/betterend/particle/InfusionParticleType.java index 498dfde8..6d237c06 100644 --- a/src/main/java/ru/betterend/particle/InfusionParticleType.java +++ b/src/main/java/ru/betterend/particle/InfusionParticleType.java @@ -8,25 +8,27 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.command.argument.ItemStackArgument; import net.minecraft.command.argument.ItemStringReader; -import net.minecraft.item.ItemStack; +import net.minecraft.world.item.ItemStack; import net.minecraft.network.PacketByteBuf; -import net.minecraft.particle.ParticleEffect; -import net.minecraft.particle.ParticleType; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleType; +import net.minecraft.core.Registry; import ru.betterend.registry.EndParticles; import ru.betterend.util.ColorUtil; -public class InfusionParticleType extends ParticleType implements ParticleEffect { +public class InfusionParticleType extends ParticleType implements ParticleOptions { public static final Codec CODEC = ItemStack.CODEC.xmap(itemStack -> { return new InfusionParticleType(EndParticles.INFUSION, itemStack); }, infusionParticleType -> { return infusionParticleType.itemStack; }); - public static final ParticleEffect.Factory PARAMETERS_FACTORY = new ParticleEffect.Factory() { - public InfusionParticleType read(ParticleType particleType, StringReader stringReader) throws CommandSyntaxException { + public static final ParticleOptions.Factory PARAMETERS_FACTORY = new ParticleOptions.Factory() { + public InfusionParticleType read(ParticleType particleType, StringReader stringReader) + throws CommandSyntaxException { stringReader.expect(' '); ItemStringReader itemStringReader = new ItemStringReader(stringReader, false).consume(); - ItemStack itemStack = new ItemStackArgument(itemStringReader.getItem(), itemStringReader.getTag()).createStack(1, false); + ItemStack itemStack = new ItemStackArgument(itemStringReader.getItem(), itemStringReader.getTag()) + .createStack(1, false); return new InfusionParticleType(particleType, itemStack); } @@ -34,20 +36,20 @@ public class InfusionParticleType extends ParticleType imp return new InfusionParticleType(particleType, packetByteBuf.readItemStack()); } }; - + private ParticleType type; private ItemStack itemStack; - + public InfusionParticleType(ParticleType particleType, ItemStack stack) { super(true, PARAMETERS_FACTORY); this.type = particleType; this.itemStack = stack; } - + public InfusionParticleType(ItemStack stack) { this(EndParticles.INFUSION, stack); } - + @Environment(EnvType.CLIENT) public float[] getPalette() { int color = ColorUtil.extractColor(itemStack.getItem()); diff --git a/src/main/java/ru/betterend/particle/ParticleBlackSpore.java b/src/main/java/ru/betterend/particle/ParticleBlackSpore.java index be4164ed..2185c4e5 100644 --- a/src/main/java/ru/betterend/particle/ParticleBlackSpore.java +++ b/src/main/java/ru/betterend/particle/ParticleBlackSpore.java @@ -2,43 +2,44 @@ package ru.betterend.particle; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.particle.AnimatedParticle; +import net.minecraft.client.particle.SimpleAnimatedParticle; import net.minecraft.client.particle.Particle; import net.minecraft.client.particle.ParticleFactory; import net.minecraft.client.particle.ParticleTextureSheet; -import net.minecraft.client.particle.SpriteProvider; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.particle.DefaultParticleType; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.util.Mth; import ru.betterend.util.MHelper; @Environment(EnvType.CLIENT) -public class ParticleBlackSpore extends AnimatedParticle { +public class ParticleBlackSpore extends SimpleAnimatedParticle { private double preVX; private double preVY; private double preVZ; private double nextVX; private double nextVY; private double nextVZ; - - protected ParticleBlackSpore(ClientWorld world, double x, double y, double z, double r, double g, double b, SpriteProvider sprites) { + + protected ParticleBlackSpore(ClientLevel world, double x, double y, double z, double r, double g, double b, + SpriteSet sprites) { super(world, x, y, z, sprites, 0); setSprite(sprites.getSprite(random)); - + this.maxAge = MHelper.randRange(30, 60, random); this.scale = MHelper.randRange(0.05F, 0.15F, random); this.setColor(1, 1, 1); this.setColorAlpha(0); - + preVX = random.nextGaussian() * 0.015; preVY = 0; preVZ = random.nextGaussian() * 0.015; - + nextVX = random.nextGaussian() * 0.015; nextVY = random.nextFloat() * 0.02 + 0.01; nextVZ = random.nextGaussian() * 0.015; } - + @Override public void tick() { int ticks = this.age & 15; @@ -51,41 +52,41 @@ public class ParticleBlackSpore extends AnimatedParticle { nextVZ = random.nextGaussian() * 0.015; } double delta = (double) ticks / 15.0; - + if (this.age <= 15) { this.setColorAlpha(this.age / 15F); - } - else if (this.age >= this.maxAge - 15) { + } else if (this.age >= this.maxAge - 15) { this.setColorAlpha((this.maxAge - this.age) / 15F); } - + if (this.age >= this.maxAge) { this.markDead(); } - - this.velocityX = MathHelper.lerp(delta, preVX, nextVX); - this.velocityY = MathHelper.lerp(delta, preVY, nextVY); - this.velocityZ = MathHelper.lerp(delta, preVZ, nextVZ); - + + this.velocityX = Mth.lerp(delta, preVX, nextVX); + this.velocityY = Mth.lerp(delta, preVY, nextVY); + this.velocityZ = Mth.lerp(delta, preVZ, nextVZ); + super.tick(); } - + @Override public ParticleTextureSheet getType() { return ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT; } @Environment(EnvType.CLIENT) - public static class FactoryBlackSpore implements ParticleFactory { + public static class FactoryBlackSpore implements ParticleFactory { - private final SpriteProvider sprites; + private final SpriteSet sprites; - public FactoryBlackSpore(SpriteProvider sprites) { + public FactoryBlackSpore(SpriteSet sprites) { this.sprites = sprites; } @Override - public Particle createParticle(DefaultParticleType type, ClientWorld world, double x, double y, double z, double vX, double vY, double vZ) { + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, + double vX, double vY, double vZ) { return new ParticleBlackSpore(world, x, y, z, 1, 1, 1, sprites); } } diff --git a/src/main/java/ru/betterend/particle/ParticleGeyser.java b/src/main/java/ru/betterend/particle/ParticleGeyser.java index 47df964c..dbe6f814 100644 --- a/src/main/java/ru/betterend/particle/ParticleGeyser.java +++ b/src/main/java/ru/betterend/particle/ParticleGeyser.java @@ -6,19 +6,20 @@ import net.minecraft.client.particle.Particle; import net.minecraft.client.particle.ParticleFactory; import net.minecraft.client.particle.ParticleTextureSheet; import net.minecraft.client.particle.SpriteBillboardParticle; -import net.minecraft.client.particle.SpriteProvider; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.particle.DefaultParticleType; -import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.core.BlockPos.MutableBlockPos; import ru.betterend.util.MHelper; @Environment(EnvType.CLIENT) public class ParticleGeyser extends SpriteBillboardParticle { - private Mutable mut = new Mutable(); + private MutableBlockPos mut = new MutableBlockPos(); private boolean changeDir = false; private boolean check = true; - - protected ParticleGeyser(ClientWorld world, double x, double y, double z, double vx, double vy, double vz, SpriteProvider sprites) { + + protected ParticleGeyser(ClientLevel world, double x, double y, double z, double vx, double vy, double vz, + SpriteSet sprites) { super(world, x, y, z, vx, vy, vz); setSprite(sprites); this.maxAge = MHelper.randRange(400, 800, random); @@ -27,28 +28,26 @@ public class ParticleGeyser extends SpriteBillboardParticle { this.velocityZ = vz; this.prevPosY = y - 0.125; } - + @Override public void tick() { - + if (this.prevPosY == this.y || this.age > this.maxAge) { this.markDead(); - } - else { + } else { if (this.age >= this.maxAge - 200) { this.setColorAlpha((this.maxAge - this.age) / 200F); } - + this.scale += 0.005F; this.velocityY = 0.125; - + if (changeDir) { changeDir = false; check = false; this.velocityX += MHelper.randRange(-0.2, 0.2, random); this.velocityZ += MHelper.randRange(-0.2, 0.2, random); - } - else if (check) { + } else if (check) { changeDir = world.getBlockState(mut.set(x, y, z)).getFluidState().isEmpty(); this.velocityX = 0; this.velocityZ = 0; @@ -56,23 +55,24 @@ public class ParticleGeyser extends SpriteBillboardParticle { } super.tick(); } - + @Override public ParticleTextureSheet getType() { return ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT; } @Environment(EnvType.CLIENT) - public static class FactoryGeyser implements ParticleFactory { + public static class FactoryGeyser implements ParticleFactory { - private final SpriteProvider sprites; + private final SpriteSet sprites; - public FactoryGeyser(SpriteProvider sprites) { + public FactoryGeyser(SpriteSet sprites) { this.sprites = sprites; } @Override - public Particle createParticle(DefaultParticleType type, ClientWorld world, double x, double y, double z, double vX, double vY, double vZ) { + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, + double vX, double vY, double vZ) { return new ParticleGeyser(world, x, y, z, 0, 0.125, 0, sprites); } } diff --git a/src/main/java/ru/betterend/particle/ParticleGlowingSphere.java b/src/main/java/ru/betterend/particle/ParticleGlowingSphere.java index f7ac89bb..2628d725 100644 --- a/src/main/java/ru/betterend/particle/ParticleGlowingSphere.java +++ b/src/main/java/ru/betterend/particle/ParticleGlowingSphere.java @@ -2,17 +2,17 @@ package ru.betterend.particle; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.particle.AnimatedParticle; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.SimpleAnimatedParticle; import net.minecraft.client.particle.Particle; import net.minecraft.client.particle.ParticleFactory; -import net.minecraft.client.particle.SpriteProvider; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.particle.DefaultParticleType; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.util.Mth; import ru.betterend.util.MHelper; @Environment(EnvType.CLIENT) -public class ParticleGlowingSphere extends AnimatedParticle { +public class ParticleGlowingSphere extends SimpleAnimatedParticle { private int ticks; private double preVX; private double preVY; @@ -20,27 +20,28 @@ public class ParticleGlowingSphere extends AnimatedParticle { private double nextVX; private double nextVY; private double nextVZ; - - protected ParticleGlowingSphere(ClientWorld world, double x, double y, double z, SpriteProvider sprites, double r, double g, double b) { + + protected ParticleGlowingSphere(ClientLevel world, double x, double y, double z, SpriteSet sprites, double r, + double g, double b) { super(world, x, y, z, sprites, 0); - setSprite(sprites.getSprite(random)); - this.maxAge = MHelper.randRange(150, 300, random); + setSprite(sprites.get(random)); + this.lifetime = MHelper.randRange(150, 300, random); this.scale = MHelper.randRange(0.05F, 0.15F, random); - this.setTargetColor(15916745); - this.setSpriteForAge(spriteProvider); - + this.setFadeColor(15916745); + this.setSpriteFromAge(sprites); + preVX = random.nextGaussian() * 0.02; preVY = random.nextGaussian() * 0.02; preVZ = random.nextGaussian() * 0.02; - + nextVX = random.nextGaussian() * 0.02; nextVY = random.nextGaussian() * 0.02; nextVZ = random.nextGaussian() * 0.02; } - + @Override public void tick() { - ticks ++; + ticks++; if (ticks > 30) { preVX = nextVX; preVY = nextVY; @@ -51,25 +52,26 @@ public class ParticleGlowingSphere extends AnimatedParticle { ticks = 0; } double delta = (double) ticks / 30.0; - - this.velocityX = MathHelper.lerp(delta, preVX, nextVX); - this.velocityY = MathHelper.lerp(delta, preVY, nextVY); - this.velocityZ = MathHelper.lerp(delta, preVZ, nextVZ); - + + this.velocityX = Mth.lerp(delta, preVX, nextVX); + this.velocityY = Mth.lerp(delta, preVY, nextVY); + this.velocityZ = Mth.lerp(delta, preVZ, nextVZ); + super.tick(); } @Environment(EnvType.CLIENT) - public static class FactoryGlowingSphere implements ParticleFactory { + public static class FactoryGlowingSphere implements ParticleFactory { - private final SpriteProvider sprites; + private final SpriteSet sprites; - public FactoryGlowingSphere(SpriteProvider sprites) { + public FactoryGlowingSphere(SpriteSet sprites) { this.sprites = sprites; } @Override - public Particle createParticle(DefaultParticleType type, ClientWorld world, double x, double y, double z, double vX, double vY, double vZ) { + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, + double vX, double vY, double vZ) { return new ParticleGlowingSphere(world, x, y, z, sprites, 1, 1, 1); } } diff --git a/src/main/java/ru/betterend/particle/ParticleJungleSpore.java b/src/main/java/ru/betterend/particle/ParticleJungleSpore.java index 6028b09e..691ad9e9 100644 --- a/src/main/java/ru/betterend/particle/ParticleJungleSpore.java +++ b/src/main/java/ru/betterend/particle/ParticleJungleSpore.java @@ -2,18 +2,19 @@ package ru.betterend.particle; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.particle.AnimatedParticle; +import net.minecraft.client.particle.SimpleAnimatedParticle; import net.minecraft.client.particle.Particle; import net.minecraft.client.particle.ParticleFactory; -import net.minecraft.client.particle.SpriteProvider; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.particle.DefaultParticleType; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.particles.SimpleParticleType; import ru.betterend.util.MHelper; @Environment(EnvType.CLIENT) -public class ParticleJungleSpore extends AnimatedParticle { - - protected ParticleJungleSpore(ClientWorld world, double x, double y, double z, SpriteProvider sprites, double r, double g, double b) { +public class ParticleJungleSpore extends SimpleAnimatedParticle { + + protected ParticleJungleSpore(ClientLevel world, double x, double y, double z, SpriteSet sprites, double r, + double g, double b) { super(world, x, y, z, sprites, 0); setSprite(sprites.getSprite(random)); this.maxAge = MHelper.randRange(150, 300, random); @@ -22,11 +23,11 @@ public class ParticleJungleSpore extends AnimatedParticle { this.setSpriteForAge(spriteProvider); this.setColorAlpha(0); } - + @Override public void tick() { super.tick(); - + int ticks = this.age % 30; if (ticks == 0) { this.velocityX = random.nextGaussian() * 0.02; @@ -34,36 +35,34 @@ public class ParticleJungleSpore extends AnimatedParticle { this.velocityZ = random.nextGaussian() * 0.02; ticks = 0; } - + if (this.age <= 30) { float delta = ticks / 30F; this.setColorAlpha(delta); - } - else if (this.age >= this.maxAge) { + } else if (this.age >= this.maxAge) { this.setColorAlpha(0); - } - else if (this.age >= this.maxAge - 30) { + } else if (this.age >= this.maxAge - 30) { this.setColorAlpha((this.maxAge - this.age) / 30F); - } - else { + } else { this.setColorAlpha(1); } - + this.velocityY -= 0.001F; this.velocityX *= 0.99F; this.velocityZ *= 0.99F; } @Environment(EnvType.CLIENT) - public static class FactoryJungleSpore implements ParticleFactory { - private final SpriteProvider sprites; + public static class FactoryJungleSpore implements ParticleFactory { + private final SpriteSet sprites; - public FactoryJungleSpore(SpriteProvider sprites) { + public FactoryJungleSpore(SpriteSet sprites) { this.sprites = sprites; } @Override - public Particle createParticle(DefaultParticleType type, ClientWorld world, double x, double y, double z, double vX, double vY, double vZ) { + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, + double vX, double vY, double vZ) { return new ParticleJungleSpore(world, x, y, z, sprites, 1, 1, 1); } } diff --git a/src/main/java/ru/betterend/particle/ParticleSnowflake.java b/src/main/java/ru/betterend/particle/ParticleSnowflake.java index 1cfccec9..1801fada 100644 --- a/src/main/java/ru/betterend/particle/ParticleSnowflake.java +++ b/src/main/java/ru/betterend/particle/ParticleSnowflake.java @@ -6,10 +6,10 @@ import net.minecraft.client.particle.Particle; import net.minecraft.client.particle.ParticleFactory; import net.minecraft.client.particle.ParticleTextureSheet; import net.minecraft.client.particle.SpriteBillboardParticle; -import net.minecraft.client.particle.SpriteProvider; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.particle.DefaultParticleType; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.util.Mth; import ru.betterend.util.MHelper; @Environment(EnvType.CLIENT) @@ -21,27 +21,28 @@ public class ParticleSnowflake extends SpriteBillboardParticle { private double nextVX; private double nextVY; private double nextVZ; - - protected ParticleSnowflake(ClientWorld world, double x, double y, double z, double r, double g, double b, SpriteProvider sprites) { + + protected ParticleSnowflake(ClientLevel world, double x, double y, double z, double r, double g, double b, + SpriteSet sprites) { super(world, x, y, z, r, g, b); setSprite(sprites); - + this.maxAge = MHelper.randRange(150, 300, random); this.scale = MHelper.randRange(0.05F, 0.2F, random); this.setColorAlpha(0F); - + preVX = random.nextGaussian() * 0.015; preVY = random.nextGaussian() * 0.015; preVZ = random.nextGaussian() * 0.015; - + nextVX = random.nextGaussian() * 0.015; nextVY = random.nextGaussian() * 0.015; nextVZ = random.nextGaussian() * 0.015; } - + @Override public void tick() { - ticks ++; + ticks++; if (ticks > 200) { preVX = nextVX; preVY = nextVY; @@ -55,41 +56,41 @@ public class ParticleSnowflake extends SpriteBillboardParticle { ticks = 0; } double delta = (double) ticks / 200.0; - + if (this.age <= 40) { this.setColorAlpha(this.age / 40F); - } - else if (this.age >= this.maxAge - 40) { + } else if (this.age >= this.maxAge - 40) { this.setColorAlpha((this.maxAge - this.age) / 40F); } - + if (this.age >= this.maxAge) { this.markDead(); } - - this.velocityX = MathHelper.lerp(delta, preVX, nextVX); - this.velocityY = MathHelper.lerp(delta, preVY, nextVY); - this.velocityZ = MathHelper.lerp(delta, preVZ, nextVZ); - + + this.velocityX = Mth.lerp(delta, preVX, nextVX); + this.velocityY = Mth.lerp(delta, preVY, nextVY); + this.velocityZ = Mth.lerp(delta, preVZ, nextVZ); + super.tick(); } - + @Override public ParticleTextureSheet getType() { return ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT; } @Environment(EnvType.CLIENT) - public static class FactorySnowflake implements ParticleFactory { + public static class FactorySnowflake implements ParticleFactory { - private final SpriteProvider sprites; + private final SpriteSet sprites; - public FactorySnowflake(SpriteProvider sprites) { + public FactorySnowflake(SpriteSet sprites) { this.sprites = sprites; } @Override - public Particle createParticle(DefaultParticleType type, ClientWorld world, double x, double y, double z, double vX, double vY, double vZ) { + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, + double vX, double vY, double vZ) { return new ParticleSnowflake(world, x, y, z, 1, 1, 1, sprites); } } diff --git a/src/main/java/ru/betterend/particle/ParticleSulphur.java b/src/main/java/ru/betterend/particle/ParticleSulphur.java index 3f0cf51d..74a3d9f7 100644 --- a/src/main/java/ru/betterend/particle/ParticleSulphur.java +++ b/src/main/java/ru/betterend/particle/ParticleSulphur.java @@ -6,10 +6,10 @@ import net.minecraft.client.particle.Particle; import net.minecraft.client.particle.ParticleFactory; import net.minecraft.client.particle.ParticleTextureSheet; import net.minecraft.client.particle.SpriteBillboardParticle; -import net.minecraft.client.particle.SpriteProvider; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.particle.DefaultParticleType; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.util.Mth; import ru.betterend.util.MHelper; @Environment(EnvType.CLIENT) @@ -21,28 +21,29 @@ public class ParticleSulphur extends SpriteBillboardParticle { private double nextVX; private double nextVY; private double nextVZ; - - protected ParticleSulphur(ClientWorld world, double x, double y, double z, double r, double g, double b, SpriteProvider sprites) { + + protected ParticleSulphur(ClientLevel world, double x, double y, double z, double r, double g, double b, + SpriteSet sprites) { super(world, x, y, z, r, g, b); setSprite(sprites); - + this.maxAge = MHelper.randRange(150, 300, random); this.scale = MHelper.randRange(0.05F, 0.15F, random); this.setColor(1, 1, 1); this.setColorAlpha(0); - + preVX = random.nextGaussian() * 0.015; preVY = random.nextGaussian() * 0.015; preVZ = random.nextGaussian() * 0.015; - + nextVX = random.nextGaussian() * 0.015; nextVY = random.nextGaussian() * 0.015; nextVZ = random.nextGaussian() * 0.015; } - + @Override public void tick() { - ticks ++; + ticks++; if (ticks > 200) { preVX = nextVX; preVY = nextVY; @@ -56,41 +57,41 @@ public class ParticleSulphur extends SpriteBillboardParticle { ticks = 0; } double delta = (double) ticks / 200.0; - + if (this.age <= 40) { this.setColorAlpha(this.age / 40F); - } - else if (this.age >= this.maxAge - 40) { + } else if (this.age >= this.maxAge - 40) { this.setColorAlpha((this.maxAge - this.age) / 40F); } - + if (this.age >= this.maxAge) { this.markDead(); } - - this.velocityX = MathHelper.lerp(delta, preVX, nextVX); - this.velocityY = MathHelper.lerp(delta, preVY, nextVY); - this.velocityZ = MathHelper.lerp(delta, preVZ, nextVZ); - + + this.velocityX = Mth.lerp(delta, preVX, nextVX); + this.velocityY = Mth.lerp(delta, preVY, nextVY); + this.velocityZ = Mth.lerp(delta, preVZ, nextVZ); + super.tick(); } - + @Override public ParticleTextureSheet getType() { return ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT; } @Environment(EnvType.CLIENT) - public static class FactorySulphur implements ParticleFactory { + public static class FactorySulphur implements ParticleFactory { - private final SpriteProvider sprites; + private final SpriteSet sprites; - public FactorySulphur(SpriteProvider sprites) { + public FactorySulphur(SpriteSet sprites) { this.sprites = sprites; } @Override - public Particle createParticle(DefaultParticleType type, ClientWorld world, double x, double y, double z, double vX, double vY, double vZ) { + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, + double vX, double vY, double vZ) { return new ParticleSulphur(world, x, y, z, 1, 1, 1, sprites); } } diff --git a/src/main/java/ru/betterend/particle/ParticleTenaneaPetal.java b/src/main/java/ru/betterend/particle/ParticleTenaneaPetal.java index 27e9a496..52e438bb 100644 --- a/src/main/java/ru/betterend/particle/ParticleTenaneaPetal.java +++ b/src/main/java/ru/betterend/particle/ParticleTenaneaPetal.java @@ -2,52 +2,53 @@ package ru.betterend.particle; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.color.block.BlockColorProvider; +import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.particle.Particle; import net.minecraft.client.particle.ParticleFactory; import net.minecraft.client.particle.ParticleTextureSheet; import net.minecraft.client.particle.SpriteBillboardParticle; -import net.minecraft.client.particle.SpriteProvider; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.particle.DefaultParticleType; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; import ru.betterend.interfaces.IColorProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; @Environment(EnvType.CLIENT) public class ParticleTenaneaPetal extends SpriteBillboardParticle { - private static BlockColorProvider provider; - + private static BlockColor provider; + private double preVX; private double preVY; private double preVZ; private double nextVX; private double nextVY; private double nextVZ; - - protected ParticleTenaneaPetal(ClientWorld world, double x, double y, double z, double r, double g, double b, SpriteProvider sprites) { + + protected ParticleTenaneaPetal(ClientLevel world, double x, double y, double z, double r, double g, double b, + SpriteSet sprites) { super(world, x, y, z, r, g, b); setSprite(sprites); - + if (provider == null) { IColorProvider block = (IColorProvider) EndBlocks.TENANEA_FLOWERS; - provider = block.getProvider(); + provider = block.getBlockProvider(); } int color = provider.getColor(null, null, new BlockPos(x, y, z), 0); this.colorRed = ((color >> 16) & 255) / 255F; this.colorGreen = ((color >> 8) & 255) / 255F; this.colorBlue = ((color) & 255) / 255F; - + this.maxAge = MHelper.randRange(120, 200, random); this.scale = MHelper.randRange(0.05F, 0.15F, random); this.setColorAlpha(0); - + preVX = 0; preVY = 0; preVZ = 0; - + nextVX = random.nextGaussian() * 0.02; nextVY = -random.nextDouble() * 0.02 - 0.02; nextVZ = random.nextGaussian() * 0.02; @@ -57,7 +58,7 @@ public class ParticleTenaneaPetal extends SpriteBillboardParticle { public int getColorMultiplier(float tint) { return 15728880; } - + @Override public void tick() { int ticks = this.age & 63; @@ -70,41 +71,41 @@ public class ParticleTenaneaPetal extends SpriteBillboardParticle { nextVZ = random.nextGaussian() * 0.02; } double delta = (double) ticks / 63.0; - + if (this.age <= 40) { this.setColorAlpha(this.age / 40F); - } - else if (this.age >= this.maxAge - 40) { + } else if (this.age >= this.maxAge - 40) { this.setColorAlpha((this.maxAge - this.age) / 40F); } - + if (this.age >= this.maxAge) { this.markDead(); } - - this.velocityX = MathHelper.lerp(delta, preVX, nextVX); - this.velocityY = MathHelper.lerp(delta, preVY, nextVY); - this.velocityZ = MathHelper.lerp(delta, preVZ, nextVZ); - + + this.velocityX = Mth.lerp(delta, preVX, nextVX); + this.velocityY = Mth.lerp(delta, preVY, nextVY); + this.velocityZ = Mth.lerp(delta, preVZ, nextVZ); + super.tick(); } - + @Override public ParticleTextureSheet getType() { return ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT; } @Environment(EnvType.CLIENT) - public static class FactoryTenaneaPetal implements ParticleFactory { + public static class FactoryTenaneaPetal implements ParticleFactory { - private final SpriteProvider sprites; + private final SpriteSet sprites; - public FactoryTenaneaPetal(SpriteProvider sprites) { + public FactoryTenaneaPetal(SpriteSet sprites) { this.sprites = sprites; } @Override - public Particle createParticle(DefaultParticleType type, ClientWorld world, double x, double y, double z, double vX, double vY, double vZ) { + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, + double vX, double vY, double vZ) { return new ParticleTenaneaPetal(world, x, y, z, 1, 1, 1, sprites); } } diff --git a/src/main/java/ru/betterend/particle/PaticlePortalSphere.java b/src/main/java/ru/betterend/particle/PaticlePortalSphere.java index 7268fcf5..7566c67b 100644 --- a/src/main/java/ru/betterend/particle/PaticlePortalSphere.java +++ b/src/main/java/ru/betterend/particle/PaticlePortalSphere.java @@ -2,16 +2,16 @@ package ru.betterend.particle; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.particle.AnimatedParticle; +import net.minecraft.client.particle.SimpleAnimatedParticle; import net.minecraft.client.particle.Particle; import net.minecraft.client.particle.ParticleFactory; -import net.minecraft.client.particle.SpriteProvider; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.particle.DefaultParticleType; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.util.Mth; import ru.betterend.util.MHelper; -public class PaticlePortalSphere extends AnimatedParticle { +public class PaticlePortalSphere extends SimpleAnimatedParticle { private int ticks; private double preVX; private double preVY; @@ -19,8 +19,8 @@ public class PaticlePortalSphere extends AnimatedParticle { private double nextVX; private double nextVY; private double nextVZ; - - public PaticlePortalSphere(ClientWorld world, double x, double y, double z, SpriteProvider spriteProvider) { + + public PaticlePortalSphere(ClientLevel world, double x, double y, double z, SpriteSet spriteProvider) { super(world, x, y, z, spriteProvider, 0); setSprite(spriteProvider.getSprite(random)); this.maxAge = MHelper.randRange(20, 80, random); @@ -28,16 +28,16 @@ public class PaticlePortalSphere extends AnimatedParticle { this.setColor(0xFEBBD5); this.setTargetColor(0xBBFEE4); this.setSpriteForAge(spriteProvider); - + preVX = random.nextGaussian() * 0.02; preVY = random.nextGaussian() * 0.02; preVZ = random.nextGaussian() * 0.02; - + nextVX = random.nextGaussian() * 0.02; nextVY = random.nextGaussian() * 0.02; nextVZ = random.nextGaussian() * 0.02; } - + @Override public void tick() { ticks++; @@ -51,25 +51,26 @@ public class PaticlePortalSphere extends AnimatedParticle { ticks = 0; } double delta = (double) ticks / 30.0; - - this.velocityX = MathHelper.lerp(delta, preVX, nextVX); - this.velocityY = MathHelper.lerp(delta, preVY, nextVY); - this.velocityZ = MathHelper.lerp(delta, preVZ, nextVZ); - + + this.velocityX = Mth.lerp(delta, preVX, nextVX); + this.velocityY = Mth.lerp(delta, preVY, nextVY); + this.velocityZ = Mth.lerp(delta, preVZ, nextVZ); + super.tick(); } @Environment(EnvType.CLIENT) - public static class FactoryPortalSphere implements ParticleFactory { + public static class FactoryPortalSphere implements ParticleFactory { - private final SpriteProvider sprites; + private final SpriteSet sprites; - public FactoryPortalSphere(SpriteProvider sprites) { + public FactoryPortalSphere(SpriteSet sprites) { this.sprites = sprites; } @Override - public Particle createParticle(DefaultParticleType type, ClientWorld world, double x, double y, double z, double vX, double vY, double vZ) { + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, + double vX, double vY, double vZ) { return new PaticlePortalSphere(world, x, y, z, sprites); } } diff --git a/src/main/java/ru/betterend/particle/SmaragdantParticle.java b/src/main/java/ru/betterend/particle/SmaragdantParticle.java index bf19c400..2cb5aac3 100644 --- a/src/main/java/ru/betterend/particle/SmaragdantParticle.java +++ b/src/main/java/ru/betterend/particle/SmaragdantParticle.java @@ -2,43 +2,44 @@ package ru.betterend.particle; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.particle.AnimatedParticle; +import net.minecraft.client.particle.SimpleAnimatedParticle; import net.minecraft.client.particle.Particle; import net.minecraft.client.particle.ParticleFactory; import net.minecraft.client.particle.ParticleTextureSheet; -import net.minecraft.client.particle.SpriteProvider; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.particle.DefaultParticleType; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.util.Mth; import ru.betterend.util.MHelper; @Environment(EnvType.CLIENT) -public class SmaragdantParticle extends AnimatedParticle { +public class SmaragdantParticle extends SimpleAnimatedParticle { private double preVX; private double preVY; private double preVZ; private double nextVX; private double nextVY; private double nextVZ; - - protected SmaragdantParticle(ClientWorld world, double x, double y, double z, double r, double g, double b, SpriteProvider sprites) { + + protected SmaragdantParticle(ClientLevel world, double x, double y, double z, double r, double g, double b, + SpriteSet sprites) { super(world, x, y, z, sprites, 0); setSprite(sprites.getSprite(random)); - + this.maxAge = MHelper.randRange(60, 120, random); this.scale = MHelper.randRange(0.05F, 0.15F, random); this.setColor(1, 1, 1); this.setColorAlpha(0); - + preVX = random.nextGaussian() * 0.01; preVY = random.nextGaussian() * 0.01; preVZ = random.nextGaussian() * 0.01; - + nextVX = random.nextGaussian() * 0.01; nextVY = random.nextGaussian() * 0.01; nextVZ = random.nextGaussian() * 0.01; } - + @Override public void tick() { int ticks = this.age & 31; @@ -51,41 +52,41 @@ public class SmaragdantParticle extends AnimatedParticle { nextVZ = random.nextGaussian() * 0.015; } double delta = (double) ticks / 31.0; - + if (this.age <= 31) { this.setColorAlpha(this.age / 31F); - } - else if (this.age >= this.maxAge - 31) { + } else if (this.age >= this.maxAge - 31) { this.setColorAlpha((this.maxAge - this.age) / 31F); } - + if (this.age >= this.maxAge) { this.markDead(); } - - this.velocityX = MathHelper.lerp(delta, preVX, nextVX); - this.velocityY = MathHelper.lerp(delta, preVY, nextVY); - this.velocityZ = MathHelper.lerp(delta, preVZ, nextVZ); - + + this.velocityX = Mth.lerp(delta, preVX, nextVX); + this.velocityY = Mth.lerp(delta, preVY, nextVY); + this.velocityZ = Mth.lerp(delta, preVZ, nextVZ); + super.tick(); } - + @Override public ParticleTextureSheet getType() { return ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT; } @Environment(EnvType.CLIENT) - public static class SmaragdantParticleFactory implements ParticleFactory { + public static class SmaragdantParticleFactory implements ParticleFactory { - private final SpriteProvider sprites; + private final SpriteSet sprites; - public SmaragdantParticleFactory(SpriteProvider sprites) { + public SmaragdantParticleFactory(SpriteSet sprites) { this.sprites = sprites; } @Override - public Particle createParticle(DefaultParticleType type, ClientWorld world, double x, double y, double z, double vX, double vY, double vZ) { + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, + double vX, double vY, double vZ) { return new SmaragdantParticle(world, x, y, z, 1, 1, 1, sprites); } } diff --git a/src/main/java/ru/betterend/patterns/BlockPatterned.java b/src/main/java/ru/betterend/patterns/BlockPatterned.java index 182b695b..61feee5d 100644 --- a/src/main/java/ru/betterend/patterns/BlockPatterned.java +++ b/src/main/java/ru/betterend/patterns/BlockPatterned.java @@ -2,13 +2,14 @@ package ru.betterend.patterns; import java.io.Reader; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; public interface BlockPatterned extends Patterned { default String getStatesPattern(Reader data) { return null; } - default Identifier statePatternId() { + + default ResourceLocation statePatternId() { return null; } } diff --git a/src/main/java/ru/betterend/patterns/Patterns.java b/src/main/java/ru/betterend/patterns/Patterns.java index 67c72d3e..eba3e869 100644 --- a/src/main/java/ru/betterend/patterns/Patterns.java +++ b/src/main/java/ru/betterend/patterns/Patterns.java @@ -13,121 +13,138 @@ import com.google.common.collect.Maps; import net.minecraft.client.MinecraftClient; import net.minecraft.resource.ResourceManager; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; public class Patterns { - - //Blockstates - public final static Identifier STATE_SIMPLE = BetterEnd.makeID("patterns/blockstate/block.json"); - public final static Identifier STATE_SLAB = BetterEnd.makeID("patterns/blockstate/slab.json"); - public final static Identifier STATE_STAIRS = BetterEnd.makeID("patterns/blockstate/stairs.json"); - public final static Identifier STATE_WALL = BetterEnd.makeID("patterns/blockstate/wall.json"); - public final static Identifier STATE_FENCE = BetterEnd.makeID("patterns/blockstate/fence.json"); - public final static Identifier STATE_BUTTON = BetterEnd.makeID("patterns/blockstate/button.json"); - public final static Identifier STATE_PILLAR = BetterEnd.makeID("patterns/blockstate/pillar.json"); - public final static Identifier STATE_PLATE = BetterEnd.makeID("patterns/blockstate/pressure_plate.json"); - public final static Identifier STATE_PLATE_ROTATED = BetterEnd.makeID("patterns/blockstate/pressure_plate_rotated.json"); - public final static Identifier STATE_DOOR = BetterEnd.makeID("patterns/blockstate/door.json"); - public final static Identifier STATE_SAPLING = BetterEnd.makeID("patterns/blockstate/sapling.json"); - public final static Identifier STATE_GATE = BetterEnd.makeID("patterns/blockstate/fence_gate.json"); - public final static Identifier STATE_TRAPDOOR = BetterEnd.makeID("patterns/blockstate/trapdoor.json"); - public final static Identifier STATE_LADDER = BetterEnd.makeID("patterns/blockstate/ladder.json"); - public final static Identifier STATE_BARREL = BetterEnd.makeID("patterns/blockstate/barrel.json"); - public final static Identifier STATE_PEDESTAL = BetterEnd.makeID("patterns/blockstate/pedestal.json"); - public final static Identifier STATE_STONE_LANTERN = BetterEnd.makeID("patterns/blockstate/stone_lantern.json"); - public final static Identifier STATE_DIRECT = BetterEnd.makeID("patterns/blockstate/direct.json"); - public final static Identifier STATE_BULB_LANTERN = BetterEnd.makeID("patterns/blockstate/bulb_lantern.json"); - public final static Identifier STATE_COMPOSTER = BetterEnd.makeID("patterns/blockstate/composter.json"); - public final static Identifier STATE_BARS = BetterEnd.makeID("patterns/blockstate/bars.json"); - public final static Identifier STATE_ANVIL = BetterEnd.makeID("patterns/blockstate/anvil.json"); - public final static Identifier STATE_ANVIL_LONG = BetterEnd.makeID("patterns/blockstate/anvil_long.json"); - public final static Identifier STATE_CHAIN = BetterEnd.makeID("patterns/blockstate/chain.json"); - public final static Identifier STATE_CHANDELIER = BetterEnd.makeID("patterns/blockstate/chandelier.json"); - public final static Identifier STATE_FURNACE = BetterEnd.makeID("patterns/blockstate/furnace.json"); - public final static Identifier STATE_ROTATED_TOP = BetterEnd.makeID("patterns/blockstate/rotated_top.json"); - public final static Identifier STATE_TRIPLE_ROTATED_TOP = BetterEnd.makeID("patterns/blockstate/triple_rotated_top.json"); - public final static Identifier STATE_STALACTITE = BetterEnd.makeID("patterns/blockstate/stalactite.json"); - - //Models Block - public final static Identifier BLOCK_EMPTY = BetterEnd.makeID("patterns/block/empty.json"); - public final static Identifier BLOCK_BASE = BetterEnd.makeID("patterns/block/block.json"); - public final static Identifier BLOCK_SIDED = BetterEnd.makeID("patterns/block/block_sided.json"); - public final static Identifier BLOCK_BOTTOM_TOP = BetterEnd.makeID("patterns/block/block_bottom_top.json"); - public final static Identifier BLOCK_SLAB = BetterEnd.makeID("patterns/block/slab.json"); - public final static Identifier BLOCK_STAIR = BetterEnd.makeID("patterns/block/stairs.json"); - public final static Identifier BLOCK_STAIR_INNER = BetterEnd.makeID("patterns/block/inner_stairs.json"); - public final static Identifier BLOCK_STAIR_OUTER = BetterEnd.makeID("patterns/block/outer_stairs.json"); - public final static Identifier BLOCK_WALL_POST = BetterEnd.makeID("patterns/block/wall_post.json"); - public final static Identifier BLOCK_WALL_SIDE = BetterEnd.makeID("patterns/block/wall_side.json"); - public final static Identifier BLOCK_WALL_SIDE_TALL = BetterEnd.makeID("patterns/block/wall_side_tall.json"); - public final static Identifier BLOCK_FENCE_POST = BetterEnd.makeID("patterns/block/fence_post.json"); - public final static Identifier BLOCK_FENCE_SIDE = BetterEnd.makeID("patterns/block/fence_side.json"); - public final static Identifier BLOCK_BUTTON = BetterEnd.makeID("patterns/block/button.json"); - public final static Identifier BLOCK_BUTTON_PRESSED = BetterEnd.makeID("patterns/block/button_pressed.json"); - public final static Identifier BLOCK_PILLAR = BetterEnd.makeID("patterns/block/pillar.json"); - public final static Identifier BLOCK_PLATE_UP = BetterEnd.makeID("patterns/block/pressure_plate_up.json"); - public final static Identifier BLOCK_PLATE_DOWN = BetterEnd.makeID("patterns/block/pressure_plate_down.json"); - public final static Identifier BLOCK_DOOR_TOP = BetterEnd.makeID("patterns/block/door_top.json"); - public final static Identifier BLOCK_DOOR_TOP_HINGE = BetterEnd.makeID("patterns/block/door_top_hinge.json"); - public final static Identifier BLOCK_DOOR_BOTTOM = BetterEnd.makeID("patterns/block/door_bottom.json"); - public final static Identifier BLOCK_DOOR_BOTTOM_HINGE = BetterEnd.makeID("patterns/block/door_bottom_hinge.json"); - public final static Identifier BLOCK_CROSS = BetterEnd.makeID("patterns/block/cross.json"); - public final static Identifier BLOCK_CROSS_SHADED = BetterEnd.makeID("patterns/block/cross_shaded.json"); - public final static Identifier BLOCK_GATE_CLOSED = BetterEnd.makeID("patterns/block/fence_gate_closed.json"); - public final static Identifier BLOCK_GATE_CLOSED_WALL = BetterEnd.makeID("patterns/block/wall_gate_closed.json"); - public final static Identifier BLOCK_GATE_OPEN = BetterEnd.makeID("patterns/block/fence_gate_open.json"); - public final static Identifier BLOCK_GATE_OPEN_WALL = BetterEnd.makeID("patterns/block/wall_gate_open.json"); - public final static Identifier BLOCK_TRAPDOOR = BetterEnd.makeID("patterns/block/trapdoor.json"); - public final static Identifier BLOCK_LADDER = BetterEnd.makeID("patterns/block/ladder.json"); - public final static Identifier BLOCK_BARREL_OPEN = BetterEnd.makeID("patterns/block/barrel_open.json"); - public final static Identifier BLOCK_PEDESTAL_DEFAULT = BetterEnd.makeID("patterns/block/pedestal_default.json"); - public final static Identifier BLOKC_PEDESTAL_COLUMN = BetterEnd.makeID("patterns/block/pedestal_column.json"); - public final static Identifier BLOCK_PEDESTAL_COLUMN_TOP = BetterEnd.makeID("patterns/block/pedestal_column_top.json"); - public final static Identifier BLOCK_PEDESTAL_TOP = BetterEnd.makeID("patterns/block/pedestal_top.json"); - public final static Identifier BLOCK_PEDESTAL_BOTTOM = BetterEnd.makeID("patterns/block/pedestal_bottom.json"); - public final static Identifier BLOCK_PEDESTAL_PILLAR = BetterEnd.makeID("patterns/block/pedestal_pillar.json"); - public final static Identifier BLOCK_BOOKSHELF = BetterEnd.makeID("patterns/block/bookshelf.json"); - public final static Identifier BLOCK_STONE_LANTERN_CEIL = BetterEnd.makeID("patterns/block/stone_lantern_ceil.json"); - public final static Identifier BLOCK_STONE_LANTERN_FLOOR = BetterEnd.makeID("patterns/block/stone_lantern_floor.json"); - public final static Identifier BLOCK_BULB_LANTERN_FLOOR = BetterEnd.makeID("patterns/block/bulb_lantern_floor.json"); - public final static Identifier BLOCK_BULB_LANTERN_CEIL = BetterEnd.makeID("patterns/block/bulb_lantern_ceil.json"); - public final static Identifier BLOCK_PETAL_COLORED = BetterEnd.makeID("models/block/block_petal_colored.json"); - public final static Identifier BLOCK_COMPOSTER = BetterEnd.makeID("patterns/block/composter.json"); - public final static Identifier BLOCK_COLORED = BetterEnd.makeID("patterns/block/block_colored.json"); - public final static Identifier BLOCK_BARS_POST = BetterEnd.makeID("patterns/block/bars_post.json"); - public final static Identifier BLOCK_BARS_SIDE = BetterEnd.makeID("patterns/block/bars_side.json"); - public final static Identifier BLOCK_ANVIL = BetterEnd.makeID("patterns/block/anvil.json"); - public final static Identifier BLOCK_CHAIN = BetterEnd.makeID("patterns/block/chain.json"); - public final static Identifier BLOCK_CHANDELIER_FLOOR = BetterEnd.makeID("patterns/block/chandelier_floor.json"); - public final static Identifier BLOCK_CHANDELIER_WALL = BetterEnd.makeID("patterns/block/chandelier_wall.json"); - public final static Identifier BLOCK_CHANDELIER_CEIL = BetterEnd.makeID("patterns/block/chandelier_ceil.json"); - public final static Identifier BLOCK_FURNACE = BetterEnd.makeID("patterns/block/furnace.json"); - public final static Identifier BLOCK_FURNACE_GLOW = BetterEnd.makeID("patterns/block/furnace_glow.json"); - public final static Identifier BLOCK_TOP_SIDE_BOTTOM = BetterEnd.makeID("patterns/block/top_side_bottom.json"); - public final static Identifier BLOCK_PATH = BetterEnd.makeID("patterns/block/path.json"); - - //Models Item - public final static Identifier ITEM_WALL = BetterEnd.makeID("patterns/item/pattern_wall.json"); - public final static Identifier ITEM_FENCE = BetterEnd.makeID("patterns/item/pattern_fence.json"); - public final static Identifier ITEM_BUTTON = BetterEnd.makeID("patterns/item/pattern_button.json"); - public final static Identifier ITEM_CHEST = BetterEnd.makeID("patterns/item/pattern_chest.json"); - public final static Identifier ITEM_BLOCK = BetterEnd.makeID("patterns/item/pattern_block_item.json"); - public final static Identifier ITEM_GENERATED = BetterEnd.makeID("patterns/item/pattern_item_generated.json"); - public final static Identifier ITEM_HANDHELD = BetterEnd.makeID("patterns/item/pattern_item_handheld.json"); - public final static Identifier ITEM_SPAWN_EGG = BetterEnd.makeID("patterns/item/pattern_item_spawn_egg.json"); - + + // Blockstates + public final static ResourceLocation STATE_SIMPLE = BetterEnd.makeID("patterns/blockstate/block.json"); + public final static ResourceLocation STATE_SLAB = BetterEnd.makeID("patterns/blockstate/slab.json"); + public final static ResourceLocation STATE_STAIRS = BetterEnd.makeID("patterns/blockstate/stairs.json"); + public final static ResourceLocation STATE_WALL = BetterEnd.makeID("patterns/blockstate/wall.json"); + public final static ResourceLocation STATE_FENCE = BetterEnd.makeID("patterns/blockstate/fence.json"); + public final static ResourceLocation STATE_BUTTON = BetterEnd.makeID("patterns/blockstate/button.json"); + public final static ResourceLocation STATE_PILLAR = BetterEnd.makeID("patterns/blockstate/pillar.json"); + public final static ResourceLocation STATE_PLATE = BetterEnd.makeID("patterns/blockstate/pressure_plate.json"); + public final static ResourceLocation STATE_PLATE_ROTATED = BetterEnd + .makeID("patterns/blockstate/pressure_plate_rotated.json"); + public final static ResourceLocation STATE_DOOR = BetterEnd.makeID("patterns/blockstate/door.json"); + public final static ResourceLocation STATE_SAPLING = BetterEnd.makeID("patterns/blockstate/sapling.json"); + public final static ResourceLocation STATE_GATE = BetterEnd.makeID("patterns/blockstate/fence_gate.json"); + public final static ResourceLocation STATE_TRAPDOOR = BetterEnd.makeID("patterns/blockstate/trapdoor.json"); + public final static ResourceLocation STATE_LADDER = BetterEnd.makeID("patterns/blockstate/ladder.json"); + public final static ResourceLocation STATE_BARREL = BetterEnd.makeID("patterns/blockstate/barrel.json"); + public final static ResourceLocation STATE_PEDESTAL = BetterEnd.makeID("patterns/blockstate/pedestal.json"); + public final static ResourceLocation STATE_STONE_LANTERN = BetterEnd + .makeID("patterns/blockstate/stone_lantern.json"); + public final static ResourceLocation STATE_DIRECT = BetterEnd.makeID("patterns/blockstate/direct.json"); + public final static ResourceLocation STATE_BULB_LANTERN = BetterEnd.makeID("patterns/blockstate/bulb_lantern.json"); + public final static ResourceLocation STATE_COMPOSTER = BetterEnd.makeID("patterns/blockstate/composter.json"); + public final static ResourceLocation STATE_BARS = BetterEnd.makeID("patterns/blockstate/bars.json"); + public final static ResourceLocation STATE_ANVIL = BetterEnd.makeID("patterns/blockstate/anvil.json"); + public final static ResourceLocation STATE_ANVIL_LONG = BetterEnd.makeID("patterns/blockstate/anvil_long.json"); + public final static ResourceLocation STATE_CHAIN = BetterEnd.makeID("patterns/blockstate/chain.json"); + public final static ResourceLocation STATE_CHANDELIER = BetterEnd.makeID("patterns/blockstate/chandelier.json"); + public final static ResourceLocation STATE_FURNACE = BetterEnd.makeID("patterns/blockstate/furnace.json"); + public final static ResourceLocation STATE_ROTATED_TOP = BetterEnd.makeID("patterns/blockstate/rotated_top.json"); + public final static ResourceLocation STATE_TRIPLE_ROTATED_TOP = BetterEnd + .makeID("patterns/blockstate/triple_rotated_top.json"); + public final static ResourceLocation STATE_STALACTITE = BetterEnd.makeID("patterns/blockstate/stalactite.json"); + + // Models Block + public final static ResourceLocation BLOCK_EMPTY = BetterEnd.makeID("patterns/block/empty.json"); + public final static ResourceLocation BLOCK_BASE = BetterEnd.makeID("patterns/block/block.json"); + public final static ResourceLocation BLOCK_SIDED = BetterEnd.makeID("patterns/block/block_sided.json"); + public final static ResourceLocation BLOCK_BOTTOM_TOP = BetterEnd.makeID("patterns/block/block_bottom_top.json"); + public final static ResourceLocation BLOCK_SLAB = BetterEnd.makeID("patterns/block/slab.json"); + public final static ResourceLocation BLOCK_STAIR = BetterEnd.makeID("patterns/block/stairs.json"); + public final static ResourceLocation BLOCK_STAIR_INNER = BetterEnd.makeID("patterns/block/inner_stairs.json"); + public final static ResourceLocation BLOCK_STAIR_OUTER = BetterEnd.makeID("patterns/block/outer_stairs.json"); + public final static ResourceLocation BLOCK_WALL_POST = BetterEnd.makeID("patterns/block/wall_post.json"); + public final static ResourceLocation BLOCK_WALL_SIDE = BetterEnd.makeID("patterns/block/wall_side.json"); + public final static ResourceLocation BLOCK_WALL_SIDE_TALL = BetterEnd.makeID("patterns/block/wall_side_tall.json"); + public final static ResourceLocation BLOCK_FENCE_POST = BetterEnd.makeID("patterns/block/fence_post.json"); + public final static ResourceLocation BLOCK_FENCE_SIDE = BetterEnd.makeID("patterns/block/fence_side.json"); + public final static ResourceLocation BLOCK_BUTTON = BetterEnd.makeID("patterns/block/button.json"); + public final static ResourceLocation BLOCK_BUTTON_PRESSED = BetterEnd.makeID("patterns/block/button_pressed.json"); + public final static ResourceLocation BLOCK_PILLAR = BetterEnd.makeID("patterns/block/pillar.json"); + public final static ResourceLocation BLOCK_PLATE_UP = BetterEnd.makeID("patterns/block/pressure_plate_up.json"); + public final static ResourceLocation BLOCK_PLATE_DOWN = BetterEnd.makeID("patterns/block/pressure_plate_down.json"); + public final static ResourceLocation BLOCK_DOOR_TOP = BetterEnd.makeID("patterns/block/door_top.json"); + public final static ResourceLocation BLOCK_DOOR_TOP_HINGE = BetterEnd.makeID("patterns/block/door_top_hinge.json"); + public final static ResourceLocation BLOCK_DOOR_BOTTOM = BetterEnd.makeID("patterns/block/door_bottom.json"); + public final static ResourceLocation BLOCK_DOOR_BOTTOM_HINGE = BetterEnd + .makeID("patterns/block/door_bottom_hinge.json"); + public final static ResourceLocation BLOCK_CROSS = BetterEnd.makeID("patterns/block/cross.json"); + public final static ResourceLocation BLOCK_CROSS_SHADED = BetterEnd.makeID("patterns/block/cross_shaded.json"); + public final static ResourceLocation BLOCK_GATE_CLOSED = BetterEnd.makeID("patterns/block/fence_gate_closed.json"); + public final static ResourceLocation BLOCK_GATE_CLOSED_WALL = BetterEnd + .makeID("patterns/block/wall_gate_closed.json"); + public final static ResourceLocation BLOCK_GATE_OPEN = BetterEnd.makeID("patterns/block/fence_gate_open.json"); + public final static ResourceLocation BLOCK_GATE_OPEN_WALL = BetterEnd.makeID("patterns/block/wall_gate_open.json"); + public final static ResourceLocation BLOCK_TRAPDOOR = BetterEnd.makeID("patterns/block/trapdoor.json"); + public final static ResourceLocation BLOCK_LADDER = BetterEnd.makeID("patterns/block/ladder.json"); + public final static ResourceLocation BLOCK_BARREL_OPEN = BetterEnd.makeID("patterns/block/barrel_open.json"); + public final static ResourceLocation BLOCK_PEDESTAL_DEFAULT = BetterEnd + .makeID("patterns/block/pedestal_default.json"); + public final static ResourceLocation BLOKC_PEDESTAL_COLUMN = BetterEnd + .makeID("patterns/block/pedestal_column.json"); + public final static ResourceLocation BLOCK_PEDESTAL_COLUMN_TOP = BetterEnd + .makeID("patterns/block/pedestal_column_top.json"); + public final static ResourceLocation BLOCK_PEDESTAL_TOP = BetterEnd.makeID("patterns/block/pedestal_top.json"); + public final static ResourceLocation BLOCK_PEDESTAL_BOTTOM = BetterEnd + .makeID("patterns/block/pedestal_bottom.json"); + public final static ResourceLocation BLOCK_PEDESTAL_PILLAR = BetterEnd + .makeID("patterns/block/pedestal_pillar.json"); + public final static ResourceLocation BLOCK_BOOKSHELF = BetterEnd.makeID("patterns/block/bookshelf.json"); + public final static ResourceLocation BLOCK_STONE_LANTERN_CEIL = BetterEnd + .makeID("patterns/block/stone_lantern_ceil.json"); + public final static ResourceLocation BLOCK_STONE_LANTERN_FLOOR = BetterEnd + .makeID("patterns/block/stone_lantern_floor.json"); + public final static ResourceLocation BLOCK_BULB_LANTERN_FLOOR = BetterEnd + .makeID("patterns/block/bulb_lantern_floor.json"); + public final static ResourceLocation BLOCK_BULB_LANTERN_CEIL = BetterEnd + .makeID("patterns/block/bulb_lantern_ceil.json"); + public final static ResourceLocation BLOCK_PETAL_COLORED = BetterEnd + .makeID("models/block/block_petal_colored.json"); + public final static ResourceLocation BLOCK_COMPOSTER = BetterEnd.makeID("patterns/block/composter.json"); + public final static ResourceLocation BLOCK_COLORED = BetterEnd.makeID("patterns/block/block_colored.json"); + public final static ResourceLocation BLOCK_BARS_POST = BetterEnd.makeID("patterns/block/bars_post.json"); + public final static ResourceLocation BLOCK_BARS_SIDE = BetterEnd.makeID("patterns/block/bars_side.json"); + public final static ResourceLocation BLOCK_ANVIL = BetterEnd.makeID("patterns/block/anvil.json"); + public final static ResourceLocation BLOCK_CHAIN = BetterEnd.makeID("patterns/block/chain.json"); + public final static ResourceLocation BLOCK_CHANDELIER_FLOOR = BetterEnd + .makeID("patterns/block/chandelier_floor.json"); + public final static ResourceLocation BLOCK_CHANDELIER_WALL = BetterEnd + .makeID("patterns/block/chandelier_wall.json"); + public final static ResourceLocation BLOCK_CHANDELIER_CEIL = BetterEnd + .makeID("patterns/block/chandelier_ceil.json"); + public final static ResourceLocation BLOCK_FURNACE = BetterEnd.makeID("patterns/block/furnace.json"); + public final static ResourceLocation BLOCK_FURNACE_GLOW = BetterEnd.makeID("patterns/block/furnace_glow.json"); + public final static ResourceLocation BLOCK_TOP_SIDE_BOTTOM = BetterEnd + .makeID("patterns/block/top_side_bottom.json"); + public final static ResourceLocation BLOCK_PATH = BetterEnd.makeID("patterns/block/path.json"); + + // Models Item + public final static ResourceLocation ITEM_WALL = BetterEnd.makeID("patterns/item/pattern_wall.json"); + public final static ResourceLocation ITEM_FENCE = BetterEnd.makeID("patterns/item/pattern_fence.json"); + public final static ResourceLocation ITEM_BUTTON = BetterEnd.makeID("patterns/item/pattern_button.json"); + public final static ResourceLocation ITEM_CHEST = BetterEnd.makeID("patterns/item/pattern_chest.json"); + public final static ResourceLocation ITEM_BLOCK = BetterEnd.makeID("patterns/item/pattern_block_item.json"); + public final static ResourceLocation ITEM_GENERATED = BetterEnd.makeID("patterns/item/pattern_item_generated.json"); + public final static ResourceLocation ITEM_HANDHELD = BetterEnd.makeID("patterns/item/pattern_item_handheld.json"); + public final static ResourceLocation ITEM_SPAWN_EGG = BetterEnd.makeID("patterns/item/pattern_item_spawn_egg.json"); + public static String createJson(Reader data, String parent, String block) { try (BufferedReader buffer = new BufferedReader(data)) { - return buffer.lines().collect(Collectors.joining()) - .replace("%parent%", parent) - .replace("%block%", block); + return buffer.lines().collect(Collectors.joining()).replace("%parent%", parent).replace("%block%", block); } catch (Exception ex) { return null; } } - - public static String createJson(Identifier patternId, String parent, String block) { + + public static String createJson(ResourceLocation patternId, String parent, String block) { ResourceManager resourceManager = MinecraftClient.getInstance().getResourceManager(); try (InputStream input = resourceManager.getResource(patternId).getInputStream()) { return createJson(new InputStreamReader(input, StandardCharsets.UTF_8), parent, block); @@ -136,17 +153,17 @@ public class Patterns { } } - public static String createJson(Identifier patternId, String texture) { + public static String createJson(ResourceLocation patternId, String texture) { Map textures = Maps.newHashMap(); textures.put("%texture%", texture); return createJson(patternId, textures); } - public static String createJson(Identifier patternId, Map textures) { + public static String createJson(ResourceLocation patternId, Map textures) { ResourceManager resourceManager = MinecraftClient.getInstance().getResourceManager(); try (InputStream input = resourceManager.getResource(patternId).getInputStream()) { - String json = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8)) - .lines().collect(Collectors.joining()); + String json = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8)).lines() + .collect(Collectors.joining()); for (Entry texture : textures.entrySet()) { json = json.replace(texture.getKey(), texture.getValue()); } diff --git a/src/main/java/ru/betterend/recipe/AlloyingRecipes.java b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java index aade6259..0204b435 100644 --- a/src/main/java/ru/betterend/recipe/AlloyingRecipes.java +++ b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java @@ -1,46 +1,25 @@ package ru.betterend.recipe; -import net.minecraft.block.Blocks; -import net.minecraft.item.Items; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.item.Items; import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; public class AlloyingRecipes { public static void register() { - AlloyingRecipe.Builder.create("additional_iron") - .setInput(Blocks.IRON_ORE, Blocks.IRON_ORE) - .setOutput(Items.IRON_INGOT, 3) - .setExpiriense(2.1F) - .build(); - AlloyingRecipe.Builder.create("additional_gold") - .setInput(Blocks.GOLD_ORE, Blocks.GOLD_ORE) - .setOutput(Items.GOLD_INGOT, 3) - .setExpiriense(3F) - .build(); - AlloyingRecipe.Builder.create("additional_netherite") - .setInput(Blocks.ANCIENT_DEBRIS, Blocks.ANCIENT_DEBRIS) - .setOutput(Items.NETHERITE_SCRAP, 3) - .setExpiriense(6F) - .setSmeltTime(1000) - .build(); - AlloyingRecipe.Builder.create("terminite_ingot") - .setInput(Items.IRON_INGOT, EndItems.ENDER_DUST) - .setOutput(EndBlocks.TERMINITE.ingot, 1) - .setExpiriense(2.5F) - .setSmeltTime(450) - .build(); - AlloyingRecipe.Builder.create("aeternium_ingot") - .setInput(EndBlocks.TERMINITE.ingot, Items.NETHERITE_INGOT) - .setOutput(EndItems.AETERNIUM_INGOT, 1) - .setExpiriense(4.5F) - .setSmeltTime(850) - .build(); + AlloyingRecipe.Builder.create("additional_iron").setInput(Blocks.IRON_ORE, Blocks.IRON_ORE) + .setOutput(Items.IRON_INGOT, 3).setExpiriense(2.1F).build(); + AlloyingRecipe.Builder.create("additional_gold").setInput(Blocks.GOLD_ORE, Blocks.GOLD_ORE) + .setOutput(Items.GOLD_INGOT, 3).setExpiriense(3F).build(); + AlloyingRecipe.Builder.create("additional_netherite").setInput(Blocks.ANCIENT_DEBRIS, Blocks.ANCIENT_DEBRIS) + .setOutput(Items.NETHERITE_SCRAP, 3).setExpiriense(6F).setSmeltTime(1000).build(); + AlloyingRecipe.Builder.create("terminite_ingot").setInput(Items.IRON_INGOT, EndItems.ENDER_DUST) + .setOutput(EndBlocks.TERMINITE.ingot, 1).setExpiriense(2.5F).setSmeltTime(450).build(); + AlloyingRecipe.Builder.create("aeternium_ingot").setInput(EndBlocks.TERMINITE.ingot, Items.NETHERITE_INGOT) + .setOutput(EndItems.AETERNIUM_INGOT, 1).setExpiriense(4.5F).setSmeltTime(850).build(); AlloyingRecipe.Builder.create("terminite_ingot_thallasium") - .setInput(EndBlocks.THALLASIUM.ingot, EndItems.ENDER_DUST) - .setOutput(EndBlocks.TERMINITE.ingot, 1) - .setExpiriense(2.5F) - .setSmeltTime(450) - .build(); + .setInput(EndBlocks.THALLASIUM.ingot, EndItems.ENDER_DUST).setOutput(EndBlocks.TERMINITE.ingot, 1) + .setExpiriense(2.5F).setSmeltTime(450).build(); } } diff --git a/src/main/java/ru/betterend/recipe/AnvilRecipes.java b/src/main/java/ru/betterend/recipe/AnvilRecipes.java index 2a4db6a7..b72ce6d4 100644 --- a/src/main/java/ru/betterend/recipe/AnvilRecipes.java +++ b/src/main/java/ru/betterend/recipe/AnvilRecipes.java @@ -1,67 +1,33 @@ package ru.betterend.recipe; -import net.minecraft.item.Items; +import net.minecraft.world.item.Items; import ru.betterend.item.material.EndToolMaterial; import ru.betterend.recipe.builders.AnvilRecipe; import ru.betterend.registry.EndItems; public class AnvilRecipes { public static void register() { - AnvilRecipe.Builder.create("ender_pearl_to_dust") - .setInput(Items.ENDER_PEARL) - .setOutput(EndItems.ENDER_DUST) - .setToolLevel(4) - .setDamage(5) - .build(); - AnvilRecipe.Builder.create("ender_shard_to_dust") - .setInput(EndItems.ENDER_SHARD) - .setOutput(EndItems.ENDER_DUST) - .setToolLevel(0) - .setDamage(3) - .build(); - - int anvilLevel = EndToolMaterial.AETERNIUM.getMiningLevel(); - AnvilRecipe.Builder.create("aeternium_axe_head") - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_AXE_HEAD) - .setAnvilLevel(anvilLevel) - .setToolLevel(4) - .setDamage(6) - .build(); - AnvilRecipe.Builder.create("aeternium_pickaxe_head") - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_PICKAXE_HEAD) - .setAnvilLevel(anvilLevel) - .setToolLevel(4) - .setDamage(6) - .build(); - AnvilRecipe.Builder.create("aeternium_shovel_head") - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_SHOVEL_HEAD) - .setAnvilLevel(anvilLevel) - .setToolLevel(4) - .setDamage(6) - .build(); - AnvilRecipe.Builder.create("aeternium_hoe_head") - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_HOE_HEAD) - .setAnvilLevel(anvilLevel) - .setToolLevel(4) - .setDamage(6) - .build(); - AnvilRecipe.Builder.create("aeternium_hammer_head") - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_HAMMER_HEAD) - .setAnvilLevel(anvilLevel) - .setToolLevel(4) - .setDamage(6) - .build(); - AnvilRecipe.Builder.create("aeternium_sword_blade") - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_SWORD_BLADE) - .setAnvilLevel(anvilLevel) - .setToolLevel(4) - .setDamage(6) - .build(); + AnvilRecipe.Builder.create("ender_pearl_to_dust").setInput(Items.ENDER_PEARL).setOutput(EndItems.ENDER_DUST) + .setToolLevel(4).setDamage(5).build(); + AnvilRecipe.Builder.create("ender_shard_to_dust").setInput(EndItems.ENDER_SHARD).setOutput(EndItems.ENDER_DUST) + .setToolLevel(0).setDamage(3).build(); + + int anvilLevel = EndToolMaterial.AETERNIUM.getLevel(); + AnvilRecipe.Builder.create("aeternium_axe_head").setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_AXE_HEAD).setAnvilLevel(anvilLevel).setToolLevel(4).setDamage(6).build(); + AnvilRecipe.Builder.create("aeternium_pickaxe_head").setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_PICKAXE_HEAD).setAnvilLevel(anvilLevel).setToolLevel(4).setDamage(6) + .build(); + AnvilRecipe.Builder.create("aeternium_shovel_head").setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_SHOVEL_HEAD).setAnvilLevel(anvilLevel).setToolLevel(4).setDamage(6) + .build(); + AnvilRecipe.Builder.create("aeternium_hoe_head").setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_HOE_HEAD).setAnvilLevel(anvilLevel).setToolLevel(4).setDamage(6).build(); + AnvilRecipe.Builder.create("aeternium_hammer_head").setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_HAMMER_HEAD).setAnvilLevel(anvilLevel).setToolLevel(4).setDamage(6) + .build(); + AnvilRecipe.Builder.create("aeternium_sword_blade").setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_SWORD_BLADE).setAnvilLevel(anvilLevel).setToolLevel(4).setDamage(6) + .build(); } } diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index e510cdc5..bee10313 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -1,10 +1,10 @@ package ru.betterend.recipe; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.potion.PotionUtil; import net.minecraft.potion.Potions; import ru.betterend.BetterEnd; @@ -15,71 +15,66 @@ import ru.betterend.registry.EndItems; import ru.betterend.registry.EndTags; public class CraftingRecipes { - + public static void register() { if (BetterEnd.hasGuideBook()) { - GridRecipe.make("guide_book", GuideBookItem.GUIDE_BOOK) - .setShape("D", "B", "C") - .addMaterial('D', EndItems.ENDER_DUST) - .addMaterial('B', Items.BOOK) - .addMaterial('C', EndItems.CRYSTAL_SHARDS) - .build(); + GridRecipe.make("guide_book", GuideBookItem.GUIDE_BOOK).setShape("D", "B", "C") + .addMaterial('D', EndItems.ENDER_DUST).addMaterial('B', Items.BOOK) + .addMaterial('C', EndItems.CRYSTAL_SHARDS).build(); } - - GridRecipe.make("ender_perl_to_block", EndBlocks.ENDER_BLOCK) - .setShape("OO", "OO") - .addMaterial('O', Items.ENDER_PEARL) - .build(); - GridRecipe.make("ender_block_to_perl", Items.ENDER_PEARL) - .addMaterial('#', EndBlocks.ENDER_BLOCK) - .setOutputCount(4) - .setList("#") - .build(); - - GridRecipe.make("end_stone_smelter", EndBlocks.END_STONE_SMELTER) - .setShape("T#T", "V V", "T#T") - .addMaterial('#', Blocks.END_STONE_BRICKS) - .addMaterial('T', EndBlocks.THALLASIUM.ingot) - .addMaterial('V', EndTags.FURNACES) - .build(); - - registerPedestal("andesite_pedestal", EndBlocks.ANDESITE_PEDESTAL, Blocks.POLISHED_ANDESITE_SLAB, Blocks.POLISHED_ANDESITE); - registerPedestal("diorite_pedestal", EndBlocks.DIORITE_PEDESTAL, Blocks.POLISHED_DIORITE_SLAB, Blocks.POLISHED_DIORITE); - registerPedestal("granite_pedestal", EndBlocks.GRANITE_PEDESTAL, Blocks.POLISHED_GRANITE_SLAB, Blocks.POLISHED_GRANITE); + + GridRecipe.make("ender_perl_to_block", EndBlocks.ENDER_BLOCK).setShape("OO", "OO") + .addMaterial('O', Items.ENDER_PEARL).build(); + GridRecipe.make("ender_block_to_perl", Items.ENDER_PEARL).addMaterial('#', EndBlocks.ENDER_BLOCK) + .setOutputCount(4).setList("#").build(); + + GridRecipe.make("end_stone_smelter", EndBlocks.END_STONE_SMELTER).setShape("T#T", "V V", "T#T") + .addMaterial('#', Blocks.END_STONE_BRICKS).addMaterial('T', EndBlocks.THALLASIUM.ingot) + .addMaterial('V', EndTags.FURNACES).build(); + + registerPedestal("andesite_pedestal", EndBlocks.ANDESITE_PEDESTAL, Blocks.POLISHED_ANDESITE_SLAB, + Blocks.POLISHED_ANDESITE); + registerPedestal("diorite_pedestal", EndBlocks.DIORITE_PEDESTAL, Blocks.POLISHED_DIORITE_SLAB, + Blocks.POLISHED_DIORITE); + registerPedestal("granite_pedestal", EndBlocks.GRANITE_PEDESTAL, Blocks.POLISHED_GRANITE_SLAB, + Blocks.POLISHED_GRANITE); registerPedestal("quartz_pedestal", EndBlocks.QUARTZ_PEDESTAL, Blocks.QUARTZ_SLAB, Blocks.QUARTZ_PILLAR); registerPedestal("purpur_pedestal", EndBlocks.PURPUR_PEDESTAL, Blocks.PURPUR_SLAB, Blocks.PURPUR_PILLAR); - - GridRecipe.make("infusion_pedestal", EndBlocks.INFUSION_PEDESTAL) - .setShape(" Y ", "O#O", " # ") - .addMaterial('O', Items.ENDER_PEARL) - .addMaterial('Y', Items.ENDER_EYE) - .addMaterial('#', Blocks.OBSIDIAN) - .build(); - + + GridRecipe.make("infusion_pedestal", EndBlocks.INFUSION_PEDESTAL).setShape(" Y ", "O#O", " # ") + .addMaterial('O', Items.ENDER_PEARL).addMaterial('Y', Items.ENDER_EYE).addMaterial('#', Blocks.OBSIDIAN) + .build(); + String material = "aeternium"; - GridRecipe.make(material + "_block", EndBlocks.AETERNIUM_BLOCK) - .setShape("III", "III", "III") - .addMaterial('I', EndItems.AETERNIUM_INGOT) - .build(); + GridRecipe.make(material + "_block", EndBlocks.AETERNIUM_BLOCK).setShape("III", "III", "III") + .addMaterial('I', EndItems.AETERNIUM_INGOT).build(); GridRecipe.make(material + "_block_to_ingot", EndItems.AETERNIUM_INGOT) - .addMaterial('#', EndBlocks.AETERNIUM_BLOCK) - .setOutputCount(9) - .setList("#") - .build(); - - GridRecipe.make("blue_vine_seed_dye", Items.BLUE_DYE).setList("#").addMaterial('#', EndBlocks.BLUE_VINE_SEED).build(); - GridRecipe.make("creeping_moss_dye", Items.CYAN_DYE).setList("#").addMaterial('#', EndBlocks.CREEPING_MOSS).build(); - GridRecipe.make("umbrella_moss_dye", Items.YELLOW_DYE).setList("#").addMaterial('#', EndBlocks.UMBRELLA_MOSS).build(); - GridRecipe.make("umbrella_moss_tall_dye", Items.YELLOW_DYE).setOutputCount(2).setList("#").addMaterial('#', EndBlocks.UMBRELLA_MOSS_TALL).build(); - GridRecipe.make("shadow_plant_dye", Items.BLACK_DYE).setList("#").addMaterial('#', EndBlocks.SHADOW_PLANT).build(); - - GridRecipe.make("paper", Items.PAPER).setShape("###").addMaterial('#', EndItems.END_LILY_LEAF_DRIED).setOutputCount(3).build(); - - GridRecipe.make("aurora_block", EndBlocks.AURORA_CRYSTAL).setShape("##", "##").addMaterial('#', EndItems.CRYSTAL_SHARDS).build(); - GridRecipe.make("lotus_block", EndBlocks.END_LOTUS.log).setShape("##", "##").addMaterial('#', EndBlocks.END_LOTUS_STEM).build(); - GridRecipe.make("needlegrass_stick", Items.STICK).setList("#").setOutputCount(2).addMaterial('#', EndBlocks.NEEDLEGRASS).build(); - GridRecipe.make("shadow_berry_seeds", EndBlocks.SHADOW_BERRY).setList("#").setOutputCount(4).addMaterial('#', EndItems.SHADOW_BERRY_RAW).build(); - GridRecipe.make("purple_polypore_dye", Items.PURPLE_DYE).setList("#").addMaterial('#', EndBlocks.PURPLE_POLYPORE).build(); + .addMaterial('#', EndBlocks.AETERNIUM_BLOCK).setOutputCount(9).setList("#").build(); + + GridRecipe.make("blue_vine_seed_dye", Items.BLUE_DYE).setList("#").addMaterial('#', EndBlocks.BLUE_VINE_SEED) + .build(); + GridRecipe.make("creeping_moss_dye", Items.CYAN_DYE).setList("#").addMaterial('#', EndBlocks.CREEPING_MOSS) + .build(); + GridRecipe.make("umbrella_moss_dye", Items.YELLOW_DYE).setList("#").addMaterial('#', EndBlocks.UMBRELLA_MOSS) + .build(); + GridRecipe.make("umbrella_moss_tall_dye", Items.YELLOW_DYE).setOutputCount(2).setList("#") + .addMaterial('#', EndBlocks.UMBRELLA_MOSS_TALL).build(); + GridRecipe.make("shadow_plant_dye", Items.BLACK_DYE).setList("#").addMaterial('#', EndBlocks.SHADOW_PLANT) + .build(); + + GridRecipe.make("paper", Items.PAPER).setShape("###").addMaterial('#', EndItems.END_LILY_LEAF_DRIED) + .setOutputCount(3).build(); + + GridRecipe.make("aurora_block", EndBlocks.AURORA_CRYSTAL).setShape("##", "##") + .addMaterial('#', EndItems.CRYSTAL_SHARDS).build(); + GridRecipe.make("lotus_block", EndBlocks.END_LOTUS.log).setShape("##", "##") + .addMaterial('#', EndBlocks.END_LOTUS_STEM).build(); + GridRecipe.make("needlegrass_stick", Items.STICK).setList("#").setOutputCount(2) + .addMaterial('#', EndBlocks.NEEDLEGRASS).build(); + GridRecipe.make("shadow_berry_seeds", EndBlocks.SHADOW_BERRY).setList("#").setOutputCount(4) + .addMaterial('#', EndItems.SHADOW_BERRY_RAW).build(); + GridRecipe.make("purple_polypore_dye", Items.PURPLE_DYE).setList("#") + .addMaterial('#', EndBlocks.PURPLE_POLYPORE).build(); registerLantern("end_stone_lantern", EndBlocks.END_STONE_LANTERN, Blocks.END_STONE_BRICK_SLAB); registerLantern("andesite_lantern", EndBlocks.ANDESITE_LANTERN, Blocks.ANDESITE_SLAB); @@ -88,136 +83,130 @@ public class CraftingRecipes { registerLantern("quartz_lantern", EndBlocks.QUARTZ_LANTERN, Blocks.QUARTZ_SLAB); registerLantern("purpur_lantern", EndBlocks.PURPUR_LANTERN, Blocks.PURPUR_SLAB); registerLantern("blackstone_lantern", EndBlocks.BLACKSTONE_LANTERN, Blocks.BLACKSTONE_SLAB); - - GridRecipe.make("amber_gem", EndItems.AMBER_GEM).setShape("##", "##").addMaterial('#', EndItems.RAW_AMBER).build(); - GridRecipe.make("amber_block", EndBlocks.AMBER_BLOCK).setShape("##", "##").addMaterial('#', EndItems.AMBER_GEM).build(); - GridRecipe.make("amber_gem_block", EndItems.AMBER_GEM).setOutputCount(4).setList("#").addMaterial('#', EndBlocks.AMBER_BLOCK).build(); - GridRecipe.make("iron_bulb_lantern", EndBlocks.IRON_BULB_LANTERN).setShape("C", "I", "#").addMaterial('C', Items.CHAIN).addMaterial('I', Items.IRON_INGOT).addMaterial('#', EndItems.GLOWING_BULB).build(); - GridRecipe.make("twisted_moss_dye", Items.PINK_DYE).setList("#").addMaterial('#', EndBlocks.TWISTED_MOSS).build(); - GridRecipe.make("byshy_grass_dye", Items.MAGENTA_DYE).setList("#").addMaterial('#', EndBlocks.BUSHY_GRASS).build(); + + GridRecipe.make("amber_gem", EndItems.AMBER_GEM).setShape("##", "##").addMaterial('#', EndItems.RAW_AMBER) + .build(); + GridRecipe.make("amber_block", EndBlocks.AMBER_BLOCK).setShape("##", "##").addMaterial('#', EndItems.AMBER_GEM) + .build(); + GridRecipe.make("amber_gem_block", EndItems.AMBER_GEM).setOutputCount(4).setList("#") + .addMaterial('#', EndBlocks.AMBER_BLOCK).build(); + GridRecipe.make("iron_bulb_lantern", EndBlocks.IRON_BULB_LANTERN).setShape("C", "I", "#") + .addMaterial('C', Items.CHAIN).addMaterial('I', Items.IRON_INGOT) + .addMaterial('#', EndItems.GLOWING_BULB).build(); + GridRecipe.make("twisted_moss_dye", Items.PINK_DYE).setList("#").addMaterial('#', EndBlocks.TWISTED_MOSS) + .build(); + GridRecipe.make("byshy_grass_dye", Items.MAGENTA_DYE).setList("#").addMaterial('#', EndBlocks.BUSHY_GRASS) + .build(); GridRecipe.make("tail_moss_dye", Items.GRAY_DYE).setList("#").addMaterial('#', EndBlocks.TAIL_MOSS).build(); - GridRecipe.make("petal_block", EndBlocks.HYDRALUX_PETAL_BLOCK).setShape("##", "##").addMaterial('#', EndItems.HYDRALUX_PETAL).build(); - GridRecipe.make("petal_white_dye", Items.WHITE_DYE).setList("#").addMaterial('#', EndItems.HYDRALUX_PETAL).build(); - - GridRecipe.make("sweet_berry_jelly", EndItems.SWEET_BERRY_JELLY) - .setList("JWSB") - .addMaterial('J', EndItems.GELATINE) - .addMaterial('W', PotionUtil.setPotion(new ItemStack(Items.POTION), Potions.WATER)) - .addMaterial('S', Items.SUGAR).addMaterial('B', Items.SWEET_BERRIES) - .build(); - - GridRecipe.make("shadow_berry_jelly", EndItems.SHADOW_BERRY_JELLY) - .setList("JWSB") - .addMaterial('J', EndItems.GELATINE) - .addMaterial('W', PotionUtil.setPotion(new ItemStack(Items.POTION), Potions.WATER)) - .addMaterial('S', Items.SUGAR) - .addMaterial('B', EndItems.SHADOW_BERRY_COOKED) - .build(); - - GridRecipe.make("sulphur_gunpowder", Items.GUNPOWDER).setList("SCB").addMaterial('S', EndItems.CRYSTALLINE_SULPHUR).addMaterial('C', Items.COAL, Items.CHARCOAL).addMaterial('B', Items.BONE_MEAL).build(); - - GridRecipe.make("dense_emerald_ice", EndBlocks.DENSE_EMERALD_ICE).setShape("##", "##").addMaterial('#', EndBlocks.EMERALD_ICE).build(); - GridRecipe.make("ancient_emerald_ice", EndBlocks.ANCIENT_EMERALD_ICE).setShape("###", "###", "###").addMaterial('#', EndBlocks.DENSE_EMERALD_ICE).build(); - - GridRecipe.make("charnia_cyan_dye", Items.CYAN_DYE).setList("#").addMaterial('#', EndBlocks.CHARNIA_CYAN).build(); - GridRecipe.make("charnia_green_dye", Items.GREEN_DYE).setList("#").addMaterial('#', EndBlocks.CHARNIA_GREEN).build(); - GridRecipe.make("charnia_light_blue_dye", Items.LIGHT_BLUE_DYE).setList("#").addMaterial('#', EndBlocks.CHARNIA_LIGHT_BLUE).build(); - GridRecipe.make("charnia_orange_dye", Items.ORANGE_DYE).setList("#").addMaterial('#', EndBlocks.CHARNIA_ORANGE).build(); - GridRecipe.make("charnia_purple_dye", Items.PURPLE_DYE).setList("#").addMaterial('#', EndBlocks.CHARNIA_PURPLE).build(); + GridRecipe.make("petal_block", EndBlocks.HYDRALUX_PETAL_BLOCK).setShape("##", "##") + .addMaterial('#', EndItems.HYDRALUX_PETAL).build(); + GridRecipe.make("petal_white_dye", Items.WHITE_DYE).setList("#").addMaterial('#', EndItems.HYDRALUX_PETAL) + .build(); + + GridRecipe.make("sweet_berry_jelly", EndItems.SWEET_BERRY_JELLY).setList("JWSB") + .addMaterial('J', EndItems.GELATINE) + .addMaterial('W', PotionUtil.setPotion(new ItemStack(Items.POTION), Potions.WATER)) + .addMaterial('S', Items.SUGAR).addMaterial('B', Items.SWEET_BERRIES).build(); + + GridRecipe.make("shadow_berry_jelly", EndItems.SHADOW_BERRY_JELLY).setList("JWSB") + .addMaterial('J', EndItems.GELATINE) + .addMaterial('W', PotionUtil.setPotion(new ItemStack(Items.POTION), Potions.WATER)) + .addMaterial('S', Items.SUGAR).addMaterial('B', EndItems.SHADOW_BERRY_COOKED).build(); + + GridRecipe.make("sulphur_gunpowder", Items.GUNPOWDER).setList("SCB") + .addMaterial('S', EndItems.CRYSTALLINE_SULPHUR).addMaterial('C', Items.COAL, Items.CHARCOAL) + .addMaterial('B', Items.BONE_MEAL).build(); + + GridRecipe.make("dense_emerald_ice", EndBlocks.DENSE_EMERALD_ICE).setShape("##", "##") + .addMaterial('#', EndBlocks.EMERALD_ICE).build(); + GridRecipe.make("ancient_emerald_ice", EndBlocks.ANCIENT_EMERALD_ICE).setShape("###", "###", "###") + .addMaterial('#', EndBlocks.DENSE_EMERALD_ICE).build(); + + GridRecipe.make("charnia_cyan_dye", Items.CYAN_DYE).setList("#").addMaterial('#', EndBlocks.CHARNIA_CYAN) + .build(); + GridRecipe.make("charnia_green_dye", Items.GREEN_DYE).setList("#").addMaterial('#', EndBlocks.CHARNIA_GREEN) + .build(); + GridRecipe.make("charnia_light_blue_dye", Items.LIGHT_BLUE_DYE).setList("#") + .addMaterial('#', EndBlocks.CHARNIA_LIGHT_BLUE).build(); + GridRecipe.make("charnia_orange_dye", Items.ORANGE_DYE).setList("#").addMaterial('#', EndBlocks.CHARNIA_ORANGE) + .build(); + GridRecipe.make("charnia_purple_dye", Items.PURPLE_DYE).setList("#").addMaterial('#', EndBlocks.CHARNIA_PURPLE) + .build(); GridRecipe.make("charnia_red_dye", Items.RED_DYE).setList("#").addMaterial('#', EndBlocks.CHARNIA_RED).build(); - - GridRecipe.make("respawn_obelisk", EndBlocks.RESPAWN_OBELISK) - .setShape("CSC", "CSC", "AAA") - .addMaterial('C', EndBlocks.AURORA_CRYSTAL) - .addMaterial('S', EndItems.ETERNAL_CRYSTAL) - .addMaterial('A', EndBlocks.AMBER_BLOCK) - .build(); - - GridRecipe.make("hopper", Blocks.HOPPER) - .setShape("I I", "ICI", " I ") - .addMaterial('I', Items.IRON_INGOT) - .addMaterial('C', EndTags.ITEM_CHEST) - .build(); - - GridRecipe.make("shulker_box", Blocks.SHULKER_BOX) - .setShape("S", "C", "S") - .addMaterial('S', Items.SHULKER_SHELL) - .addMaterial('C', EndTags.ITEM_CHEST) - .build(); - - GridRecipe.make("twisted_umbrella_moss_dye", Items.PURPLE_DYE).setList("#").addMaterial('#', EndBlocks.TWISTED_UMBRELLA_MOSS).build(); - GridRecipe.make("twisted_umbrella_moss_dye_tall", Items.PURPLE_DYE).setOutputCount(2).setList("#").addMaterial('#', EndBlocks.TWISTED_UMBRELLA_MOSS_TALL).build(); - - GridRecipe.make("leather_to_stripes", EndItems.LEATHER_STRIPE) - .setList("L") - .addMaterial('L', Items.LEATHER) - .setOutputCount(3) - .build(); - GridRecipe.make("stripes_to_leather", Items.LEATHER) - .setList("SSS") - .addMaterial('S', EndItems.LEATHER_STRIPE) - .build(); - GridRecipe.make("leather_wrapped_stick", EndItems.LEATHER_WRAPPED_STICK) - .setList("SL") - .addMaterial('S', Items.STICK) - .addMaterial('L', EndItems.LEATHER_STRIPE) - .build(); - - GridRecipe.make("fiber_string", Items.STRING).setOutputCount(6).setShape("#", "#", "#").addMaterial('#', EndItems.SILK_FIBER).build(); - - GridRecipe.make("ender_eye_amber", Items.ENDER_EYE) - .setShape("SAS", "APA", "SAS") - .addMaterial('S', EndItems.CRYSTAL_SHARDS) - .addMaterial('A', EndItems.AMBER_GEM) - .addMaterial('P', Items.ENDER_PEARL) - .build(); - - GridRecipe.make("iron_chandelier", EndBlocks.IRON_CHANDELIER).setShape("I#I", " # ").addMaterial('#', Items.IRON_INGOT).addMaterial('I', EndItems.LUMECORN_ROD).setGroup("end_metal_chandelier").build(); - GridRecipe.make("gold_chandelier", EndBlocks.GOLD_CHANDELIER).setShape("I#I", " # ").addMaterial('#', Items.GOLD_INGOT).addMaterial('I', EndItems.LUMECORN_ROD).setGroup("end_metal_chandelier").build(); - - GridRecipe.make("missing_tile", EndBlocks.MISSING_TILE) - .setOutputCount(4) - .setShape("#P", "P#") - .addMaterial('#', EndBlocks.VIOLECITE.stone, EndBlocks.VIOLECITE.bricks, EndBlocks.VIOLECITE.tiles) - .addMaterial('P', Blocks.PURPUR_BLOCK) - .build(); + + GridRecipe.make("respawn_obelisk", EndBlocks.RESPAWN_OBELISK).setShape("CSC", "CSC", "AAA") + .addMaterial('C', EndBlocks.AURORA_CRYSTAL).addMaterial('S', EndItems.ETERNAL_CRYSTAL) + .addMaterial('A', EndBlocks.AMBER_BLOCK).build(); + + GridRecipe.make("hopper", Blocks.HOPPER).setShape("I I", "ICI", " I ").addMaterial('I', Items.IRON_INGOT) + .addMaterial('C', EndTags.ITEM_CHEST).build(); + + GridRecipe.make("shulker_box", Blocks.SHULKER_BOX).setShape("S", "C", "S").addMaterial('S', Items.SHULKER_SHELL) + .addMaterial('C', EndTags.ITEM_CHEST).build(); + + GridRecipe.make("twisted_umbrella_moss_dye", Items.PURPLE_DYE).setList("#") + .addMaterial('#', EndBlocks.TWISTED_UMBRELLA_MOSS).build(); + GridRecipe.make("twisted_umbrella_moss_dye_tall", Items.PURPLE_DYE).setOutputCount(2).setList("#") + .addMaterial('#', EndBlocks.TWISTED_UMBRELLA_MOSS_TALL).build(); + + GridRecipe.make("leather_to_stripes", EndItems.LEATHER_STRIPE).setList("L").addMaterial('L', Items.LEATHER) + .setOutputCount(3).build(); + GridRecipe.make("stripes_to_leather", Items.LEATHER).setList("SSS").addMaterial('S', EndItems.LEATHER_STRIPE) + .build(); + GridRecipe.make("leather_wrapped_stick", EndItems.LEATHER_WRAPPED_STICK).setList("SL") + .addMaterial('S', Items.STICK).addMaterial('L', EndItems.LEATHER_STRIPE).build(); + + GridRecipe.make("fiber_string", Items.STRING).setOutputCount(6).setShape("#", "#", "#") + .addMaterial('#', EndItems.SILK_FIBER).build(); + + GridRecipe.make("ender_eye_amber", Items.ENDER_EYE).setShape("SAS", "APA", "SAS") + .addMaterial('S', EndItems.CRYSTAL_SHARDS).addMaterial('A', EndItems.AMBER_GEM) + .addMaterial('P', Items.ENDER_PEARL).build(); + + GridRecipe.make("iron_chandelier", EndBlocks.IRON_CHANDELIER).setShape("I#I", " # ") + .addMaterial('#', Items.IRON_INGOT).addMaterial('I', EndItems.LUMECORN_ROD) + .setGroup("end_metal_chandelier").build(); + GridRecipe.make("gold_chandelier", EndBlocks.GOLD_CHANDELIER).setShape("I#I", " # ") + .addMaterial('#', Items.GOLD_INGOT).addMaterial('I', EndItems.LUMECORN_ROD) + .setGroup("end_metal_chandelier").build(); + + GridRecipe.make("missing_tile", EndBlocks.MISSING_TILE).setOutputCount(4).setShape("#P", "P#") + .addMaterial('#', EndBlocks.VIOLECITE.stone, EndBlocks.VIOLECITE.bricks, EndBlocks.VIOLECITE.tiles) + .addMaterial('P', Blocks.PURPUR_BLOCK).build(); registerHammer("iron", Items.IRON_INGOT, EndItems.IRON_HAMMER); registerHammer("golden", Items.GOLD_INGOT, EndItems.GOLDEN_HAMMER); registerHammer("diamond", Items.DIAMOND, EndItems.DIAMOND_HAMMER); - GridRecipe.make("charcoal_block", EndBlocks.CHARCOAL_BLOCK).setShape("###", "###", "###").addMaterial('#', Items.CHARCOAL).build(); - GridRecipe.make("end_stone_furnace", EndBlocks.END_STONE_FURNACE).setShape("###", "# #", "###").addMaterial('#', Blocks.END_STONE).build(); - GridRecipe.make("filalux_lantern", EndBlocks.FILALUX_LANTERN).setShape("###", "###", "###").addMaterial('#', EndBlocks.FILALUX).build(); - - GridRecipe.make("silk_moth_hive", EndBlocks.SILK_MOTH_HIVE).setShape("#L#", "LML", "#L#").addMaterial('#', EndBlocks.TENANEA.planks).addMaterial('L', EndBlocks.TENANEA_LEAVES).addMaterial('M', EndItems.SILK_MOTH_MATRIX).build(); - GridRecipe.make("cave_pumpkin_pie", EndItems.CAVE_PUMPKIN_PIE).setShape(" B ", "BPB", " B ").addMaterial('P', EndBlocks.CAVE_PUMPKIN).addMaterial('B', EndItems.BLOSSOM_BERRY, EndItems.SHADOW_BERRY_RAW).build(); - GridRecipe.make("cave_pumpkin_seeds", EndBlocks.CAVE_PUMPKIN_SEED).setOutputCount(4).setList("#").addMaterial('#', EndBlocks.CAVE_PUMPKIN).build(); + GridRecipe.make("charcoal_block", EndBlocks.CHARCOAL_BLOCK).setShape("###", "###", "###") + .addMaterial('#', Items.CHARCOAL).build(); + GridRecipe.make("end_stone_furnace", EndBlocks.END_STONE_FURNACE).setShape("###", "# #", "###") + .addMaterial('#', Blocks.END_STONE).build(); + GridRecipe.make("filalux_lantern", EndBlocks.FILALUX_LANTERN).setShape("###", "###", "###") + .addMaterial('#', EndBlocks.FILALUX).build(); + + GridRecipe.make("silk_moth_hive", EndBlocks.SILK_MOTH_HIVE).setShape("#L#", "LML", "#L#") + .addMaterial('#', EndBlocks.TENANEA.planks).addMaterial('L', EndBlocks.TENANEA_LEAVES) + .addMaterial('M', EndItems.SILK_MOTH_MATRIX).build(); + GridRecipe.make("cave_pumpkin_pie", EndItems.CAVE_PUMPKIN_PIE).setShape(" B ", "BPB", " B ") + .addMaterial('P', EndBlocks.CAVE_PUMPKIN) + .addMaterial('B', EndItems.BLOSSOM_BERRY, EndItems.SHADOW_BERRY_RAW).build(); + GridRecipe.make("cave_pumpkin_seeds", EndBlocks.CAVE_PUMPKIN_SEED).setOutputCount(4).setList("#") + .addMaterial('#', EndBlocks.CAVE_PUMPKIN).build(); } - + private static void registerLantern(String name, Block lantern, Block slab) { - GridRecipe.make(name, lantern) - .setShape("S", "#", "S") - .addMaterial('#', EndItems.CRYSTAL_SHARDS) - .addMaterial('S', slab) - .setGroup("end_stone_lanterns") - .build(); + GridRecipe.make(name, lantern).setShape("S", "#", "S").addMaterial('#', EndItems.CRYSTAL_SHARDS) + .addMaterial('S', slab).setGroup("end_stone_lanterns").build(); } - + public static void registerPedestal(String name, Block pedestal, Block slab, Block pillar) { - GridRecipe.make(name, pedestal) - .setShape("S", "#", "S") - .addMaterial('S', slab) - .addMaterial('#', pillar) - .setOutputCount(2) - .build(); + GridRecipe.make(name, pedestal).setShape("S", "#", "S").addMaterial('S', slab).addMaterial('#', pillar) + .setOutputCount(2).build(); } private static void registerHammer(String name, Item material, Item result) { - GridRecipe.make(name + "_hammer", result) - .setShape("I I", "I#I", " # ") - .addMaterial('I', material) - .addMaterial('#', Items.STICK) - .build(); + GridRecipe.make(name + "_hammer", result).setShape("I I", "I#I", " # ").addMaterial('I', material) + .addMaterial('#', Items.STICK).build(); } } diff --git a/src/main/java/ru/betterend/recipe/EndRecipeManager.java b/src/main/java/ru/betterend/recipe/EndRecipeManager.java index 8a91076c..4a3eb2ca 100644 --- a/src/main/java/ru/betterend/recipe/EndRecipeManager.java +++ b/src/main/java/ru/betterend/recipe/EndRecipeManager.java @@ -5,52 +5,53 @@ import java.util.Map.Entry; import com.google.common.collect.Maps; -import net.minecraft.recipe.Recipe; -import net.minecraft.recipe.RecipeSerializer; -import net.minecraft.recipe.RecipeType; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.BetterEnd; public class EndRecipeManager { - private static final Map, Map>> RECIPES = Maps.newHashMap(); + private static final Map, Map>> RECIPES = Maps.newHashMap(); public static void addRecipe(RecipeType type, Recipe recipe) { - Map> list = RECIPES.get(type); + Map> list = RECIPES.get(type); if (list == null) { list = Maps.newHashMap(); RECIPES.put(type, list); } list.put(recipe.getId(), recipe); } - + @SuppressWarnings("unchecked") - public static > T getRecipe(RecipeType type, Identifier id) { + public static > T getRecipe(RecipeType type, ResourceLocation id) { if (RECIPES.containsKey(type)) { return (T) RECIPES.get(type).get(id); } return null; } - public static Map, Map>> getMap(Map, Map>> recipes) { - Map, Map>> result = Maps.newHashMap(); + public static Map, Map>> getMap( + Map, Map>> recipes) { + Map, Map>> result = Maps.newHashMap(); for (RecipeType type : recipes.keySet()) { - Map> typeList = Maps.newHashMap(); + Map> typeList = Maps.newHashMap(); typeList.putAll(recipes.get(type)); result.put(type, typeList); } for (RecipeType type : RECIPES.keySet()) { - Map> list = RECIPES.get(type); + Map> list = RECIPES.get(type); if (list != null) { - Map> typeList = result.get(type); + Map> typeList = result.get(type); if (typeList == null) { typeList = Maps.newHashMap(); result.put(type, typeList); } - for (Entry> entry : list.entrySet()) { - Identifier id = entry.getKey(); + for (Entry> entry : list.entrySet()) { + ResourceLocation id = entry.getKey(); if (!typeList.containsKey(id)) typeList.put(id, entry.getValue()); } @@ -65,11 +66,11 @@ public class EndRecipeManager { } public static > RecipeType registerType(String type) { - Identifier recipeTypeId = BetterEnd.makeID(type); + ResourceLocation recipeTypeId = BetterEnd.makeID(type); return Registry.register(Registry.RECIPE_TYPE, recipeTypeId, new RecipeType() { public String toString() { return type; } - }); + }); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/recipe/FurnaceRecipes.java b/src/main/java/ru/betterend/recipe/FurnaceRecipes.java index da4f8a7e..de83076f 100644 --- a/src/main/java/ru/betterend/recipe/FurnaceRecipes.java +++ b/src/main/java/ru/betterend/recipe/FurnaceRecipes.java @@ -1,7 +1,7 @@ package ru.betterend.recipe; -import net.minecraft.block.Blocks; -import net.minecraft.item.Items; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.item.Items; import ru.betterend.recipe.builders.FurnaceRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; @@ -14,7 +14,8 @@ public class FurnaceRecipes { FurnaceRecipe.make("end_fish", EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED).buildFoodlike(); FurnaceRecipe.make("slime_ball", EndBlocks.JELLYSHROOM_CAP_PURPLE, Items.SLIME_BALL).build(); FurnaceRecipe.make("menger_sponge", EndBlocks.MENGER_SPONGE_WET, EndBlocks.MENGER_SPONGE).build(); - FurnaceRecipe.make("chorus_mushroom", EndItems.CHORUS_MUSHROOM_RAW, EndItems.CHORUS_MUSHROOM_COOKED).buildFoodlike(); + FurnaceRecipe.make("chorus_mushroom", EndItems.CHORUS_MUSHROOM_RAW, EndItems.CHORUS_MUSHROOM_COOKED) + .buildFoodlike(); FurnaceRecipe.make("bolux_mushroom", EndBlocks.BOLUX_MUSHROOM, EndItems.BOLUX_MUSHROOM_COOKED).buildFoodlike(); } } diff --git a/src/main/java/ru/betterend/recipe/InfusionRecipes.java b/src/main/java/ru/betterend/recipe/InfusionRecipes.java index 0be70464..6aba6304 100644 --- a/src/main/java/ru/betterend/recipe/InfusionRecipes.java +++ b/src/main/java/ru/betterend/recipe/InfusionRecipes.java @@ -1,588 +1,265 @@ package ru.betterend.recipe; -import net.minecraft.block.Blocks; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnchantmentLevelEntry; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.item.EnchantedBookItem; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentLevelEntry; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.item.EnchantedBookItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import ru.betterend.recipe.builders.InfusionRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; public class InfusionRecipes { public static void register() { - InfusionRecipe.Builder.create("runed_flavolite") - .setInput(EndBlocks.FLAVOLITE.polished) - .setOutput(EndBlocks.FLAVOLITE_RUNED) - .addCatalyst(0, EndItems.CRYSTAL_SHARDS) - .addCatalyst(2, EndItems.CRYSTAL_SHARDS) - .addCatalyst(4, EndItems.CRYSTAL_SHARDS) - .addCatalyst(6, EndItems.CRYSTAL_SHARDS) - .setTime(100) - .build(); - - InfusionRecipe.Builder.create("eternal_crystal") - .setInput(Items.END_CRYSTAL) - .setOutput(EndItems.ETERNAL_CRYSTAL) - .addCatalyst(0, EndItems.CRYSTAL_SHARDS) - .addCatalyst(2, EndItems.CRYSTAL_SHARDS) - .addCatalyst(4, EndItems.CRYSTAL_SHARDS) - .addCatalyst(6, EndItems.CRYSTAL_SHARDS) - .addCatalyst(1, EndItems.ENDER_SHARD) - .addCatalyst(3, EndItems.ENDER_SHARD) - .addCatalyst(5, EndItems.ENDER_SHARD) - .addCatalyst(7, EndItems.ENDER_SHARD) - .setTime(250) - .build(); - - InfusionRecipe.Builder.create("crystalite_helmet") - .setInput(EndBlocks.TERMINITE.helmet) - .setOutput(EndItems.CRYSTALITE_HELMET) - .addCatalyst(0, EndItems.AMBER_GEM) - .addCatalyst(2, EndItems.CRYSTAL_SHARDS) - .addCatalyst(6, EndItems.CRYSTAL_SHARDS) - .setTime(150) - .build(); - InfusionRecipe.Builder.create("crystalite_chestplate") - .setInput(EndBlocks.TERMINITE.chestplate) - .setOutput(EndItems.CRYSTALITE_CHESTPLATE) - .addCatalyst(0, EndItems.AMBER_GEM) - .addCatalyst(1, EndItems.CRYSTAL_SHARDS) - .addCatalyst(3, EndItems.CRYSTAL_SHARDS) - .addCatalyst(5, EndItems.CRYSTAL_SHARDS) - .addCatalyst(7, EndItems.CRYSTAL_SHARDS) - .setTime(300) - .build(); - InfusionRecipe.Builder.create("crystalite_leggings") - .setInput(EndBlocks.TERMINITE.leggings) - .setOutput(EndItems.CRYSTALITE_LEGGINGS) - .addCatalyst(0, EndItems.AMBER_GEM) - .addCatalyst(2, EndItems.CRYSTAL_SHARDS) - .addCatalyst(4, EndItems.CRYSTAL_SHARDS) - .addCatalyst(6, EndItems.CRYSTAL_SHARDS) - .setTime(225) - .build(); - InfusionRecipe.Builder.create("crystalite_boots") - .setInput(EndBlocks.TERMINITE.boots) - .setOutput(EndItems.CRYSTALITE_BOOTS) - .addCatalyst(0, EndItems.AMBER_GEM) - .addCatalyst(2, EndItems.CRYSTAL_SHARDS) - .addCatalyst(6, EndItems.CRYSTAL_SHARDS) - .setTime(150) - .build(); - - InfusionRecipe.Builder.create("enchanted_petal") - .setInput(EndItems.HYDRALUX_PETAL) - .setOutput(EndItems.ENCHANTED_PETAL) - .addCatalyst(0, EndItems.CRYSTAL_SHARDS) - .addCatalyst(2, EndItems.CRYSTAL_SHARDS) - .addCatalyst(4, EndItems.CRYSTAL_SHARDS) - .addCatalyst(6, EndItems.CRYSTAL_SHARDS) - .setTime(75) - .build(); + InfusionRecipe.Builder.create("runed_flavolite").setInput(EndBlocks.FLAVOLITE.polished) + .setOutput(EndBlocks.FLAVOLITE_RUNED).addCatalyst(0, EndItems.CRYSTAL_SHARDS) + .addCatalyst(2, EndItems.CRYSTAL_SHARDS).addCatalyst(4, EndItems.CRYSTAL_SHARDS) + .addCatalyst(6, EndItems.CRYSTAL_SHARDS).setTime(100).build(); - InfusionRecipe.Builder.create("protection_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.PROTECTION, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(4, Items.TURTLE_HELMET) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("fire_protection_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.FIRE_PROTECTION, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.BLAZE_ROD) - .addCatalyst(4, Items.BLAZE_ROD) - .addCatalyst(6, Items.BLAZE_ROD) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("feather_falling_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.FEATHER_FALLING, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.FEATHER) - .addCatalyst(4, Items.FEATHER) - .addCatalyst(6, Items.FEATHER) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("blast_protection_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.BLAST_PROTECTION, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Blocks.OBSIDIAN) - .addCatalyst(4, Blocks.OBSIDIAN) - .addCatalyst(6, Blocks.OBSIDIAN) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("projectile_protection_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.PROJECTILE_PROTECTION, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.SCUTE) - .addCatalyst(4, Items.SHIELD) - .addCatalyst(6, Items.SCUTE) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("respiration_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.RESPIRATION, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.NAUTILUS_SHELL) - .addCatalyst(4, Items.NAUTILUS_SHELL) - .addCatalyst(6, Items.NAUTILUS_SHELL) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("aqua_affinity_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.AQUA_AFFINITY, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.PRISMARINE_CRYSTALS) - .addCatalyst(4, Items.PRISMARINE_CRYSTALS) - .addCatalyst(6, Items.PRISMARINE_CRYSTALS) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("thorns_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.THORNS, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Blocks.CACTUS) - .addCatalyst(4, Blocks.CACTUS) - .addCatalyst(6, Blocks.CACTUS) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("depth_strider_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.DEPTH_STRIDER, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Blocks.LILY_PAD) - .addCatalyst(4, EndBlocks.END_LILY_SEED) - .addCatalyst(6, Blocks.LILY_PAD) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("frost_walker_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.FROST_WALKER, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(4, EndBlocks.ANCIENT_EMERALD_ICE) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("soul_speed_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.SOUL_SPEED, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Blocks.SOUL_SAND, Blocks.SOUL_SOIL) - .addCatalyst(4, Blocks.SOUL_SAND, Blocks.SOUL_SOIL) - .addCatalyst(6, Blocks.SOUL_SAND, Blocks.SOUL_SOIL) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("sharpness_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.SHARPNESS, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(4, Items.NETHERITE_SCRAP) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("smite_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.SMITE, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Blocks.SUNFLOWER) - .addCatalyst(4, Items.GOLD_INGOT) - .addCatalyst(6, Blocks.SUNFLOWER) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("bane_of_arthropods_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.BANE_OF_ARTHROPODS, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.FERMENTED_SPIDER_EYE) - .addCatalyst(4, Items.IRON_INGOT) - .addCatalyst(6, Items.FERMENTED_SPIDER_EYE) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("knockback_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.KNOCKBACK, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.REDSTONE) - .addCatalyst(4, Blocks.PISTON) - .addCatalyst(6, Items.REDSTONE) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("fire_aspect_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.FIRE_ASPECT, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.BLAZE_POWDER) - .addCatalyst(4, Items.MAGMA_CREAM) - .addCatalyst(6, Items.BLAZE_POWDER) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("looting_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.LOOTING, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.EMERALD) - .addCatalyst(4, Items.GOLD_INGOT) - .addCatalyst(6, Items.EMERALD) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("sweeping_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.SWEEPING, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.GOLDEN_SWORD) - .addCatalyst(4, Items.IRON_SWORD) - .addCatalyst(6, Items.GOLDEN_SWORD) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("efficiency_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.EFFICIENCY, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, EndItems.AMBER_GEM) - .addCatalyst(4, EndItems.AMBER_GEM) - .addCatalyst(6, EndItems.AMBER_GEM) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("silk_touch_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.SILK_TOUCH, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Blocks.COBWEB) - .addCatalyst(4, EndItems.ETERNAL_CRYSTAL) - .addCatalyst(6, Blocks.COBWEB) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(375) - .build(); - InfusionRecipe.Builder.create("unbreaking_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.UNBREAKING, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.DIAMOND) - .addCatalyst(4, Items.DIAMOND) - .addCatalyst(6, Items.DIAMOND) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("fortune_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.FORTUNE, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.EMERALD) - .addCatalyst(4, Items.RABBIT_FOOT) - .addCatalyst(6, Items.EMERALD) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("power_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.POWER, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, EndItems.AMBER_GEM) - .addCatalyst(4, Items.DIAMOND_SWORD) - .addCatalyst(6, EndItems.AMBER_GEM) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("punch_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.PUNCH, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.POPPED_CHORUS_FRUIT) - .addCatalyst(4, Items.SPECTRAL_ARROW) - .addCatalyst(6, Items.POPPED_CHORUS_FRUIT) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("flame_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.FLAME, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.BLAZE_POWDER) - .addCatalyst(4, Items.SPECTRAL_ARROW) - .addCatalyst(6, Items.BLAZE_POWDER) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("infinity_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.INFINITY, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.SPECTRAL_ARROW) - .addCatalyst(4, EndItems.ETERNAL_CRYSTAL) - .addCatalyst(6, Items.SPECTRAL_ARROW) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(375) - .build(); - InfusionRecipe.Builder.create("luck_of_sea_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.LUCK_OF_THE_SEA, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.EMERALD) - .addCatalyst(4, Items.FISHING_ROD) - .addCatalyst(6, Items.EMERALD) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("lure_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.LURE, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.GOLD_NUGGET) - .addCatalyst(4, Items.FISHING_ROD) - .addCatalyst(6, Items.GOLD_NUGGET) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("loyalty_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.LOYALTY, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.ENDER_EYE) - .addCatalyst(4, Items.HEART_OF_THE_SEA) - .addCatalyst(6, Items.ENDER_EYE) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(375) - .build(); - InfusionRecipe.Builder.create("impaling_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.IMPALING, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.PRISMARINE_SHARD) - .addCatalyst(4, Items.IRON_SWORD) - .addCatalyst(6, Items.PRISMARINE_SHARD) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("riptide_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.RIPTIDE, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.LEAD) - .addCatalyst(4, Items.HEART_OF_THE_SEA) - .addCatalyst(6, Items.LEAD) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(375) - .build(); - InfusionRecipe.Builder.create("channeling_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.CHANNELING, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.CHAIN) - .addCatalyst(4, Items.HEART_OF_THE_SEA) - .addCatalyst(6, Items.CHAIN) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(375) - .build(); - InfusionRecipe.Builder.create("multishot_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.MULTISHOT, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.ARROW) - .addCatalyst(4, Items.SPECTRAL_ARROW) - .addCatalyst(6, Items.ARROW) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("quick_charge_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.QUICK_CHARGE, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.QUARTZ) - .addCatalyst(4, Items.GLOWSTONE_DUST) - .addCatalyst(6, Items.QUARTZ) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("piercing_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.PIERCING, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.GLOWSTONE_DUST) - .addCatalyst(4, Items.SPECTRAL_ARROW) - .addCatalyst(6, Items.GLOWSTONE_DUST) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); - InfusionRecipe.Builder.create("mending_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.MENDING, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.EXPERIENCE_BOTTLE) - .addCatalyst(4, Blocks.ANVIL) - .addCatalyst(6, Items.EXPERIENCE_BOTTLE) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(375) - .build(); + InfusionRecipe.Builder.create("eternal_crystal").setInput(Items.END_CRYSTAL).setOutput(EndItems.ETERNAL_CRYSTAL) + .addCatalyst(0, EndItems.CRYSTAL_SHARDS).addCatalyst(2, EndItems.CRYSTAL_SHARDS) + .addCatalyst(4, EndItems.CRYSTAL_SHARDS).addCatalyst(6, EndItems.CRYSTAL_SHARDS) + .addCatalyst(1, EndItems.ENDER_SHARD).addCatalyst(3, EndItems.ENDER_SHARD) + .addCatalyst(5, EndItems.ENDER_SHARD).addCatalyst(7, EndItems.ENDER_SHARD).setTime(250).build(); + + InfusionRecipe.Builder.create("crystalite_helmet").setInput(EndBlocks.TERMINITE.helmet) + .setOutput(EndItems.CRYSTALITE_HELMET).addCatalyst(0, EndItems.AMBER_GEM) + .addCatalyst(2, EndItems.CRYSTAL_SHARDS).addCatalyst(6, EndItems.CRYSTAL_SHARDS).setTime(150).build(); + InfusionRecipe.Builder.create("crystalite_chestplate").setInput(EndBlocks.TERMINITE.chestplate) + .setOutput(EndItems.CRYSTALITE_CHESTPLATE).addCatalyst(0, EndItems.AMBER_GEM) + .addCatalyst(1, EndItems.CRYSTAL_SHARDS).addCatalyst(3, EndItems.CRYSTAL_SHARDS) + .addCatalyst(5, EndItems.CRYSTAL_SHARDS).addCatalyst(7, EndItems.CRYSTAL_SHARDS).setTime(300).build(); + InfusionRecipe.Builder.create("crystalite_leggings").setInput(EndBlocks.TERMINITE.leggings) + .setOutput(EndItems.CRYSTALITE_LEGGINGS).addCatalyst(0, EndItems.AMBER_GEM) + .addCatalyst(2, EndItems.CRYSTAL_SHARDS).addCatalyst(4, EndItems.CRYSTAL_SHARDS) + .addCatalyst(6, EndItems.CRYSTAL_SHARDS).setTime(225).build(); + InfusionRecipe.Builder.create("crystalite_boots").setInput(EndBlocks.TERMINITE.boots) + .setOutput(EndItems.CRYSTALITE_BOOTS).addCatalyst(0, EndItems.AMBER_GEM) + .addCatalyst(2, EndItems.CRYSTAL_SHARDS).addCatalyst(6, EndItems.CRYSTAL_SHARDS).setTime(150).build(); + + InfusionRecipe.Builder.create("enchanted_petal").setInput(EndItems.HYDRALUX_PETAL) + .setOutput(EndItems.ENCHANTED_PETAL).addCatalyst(0, EndItems.CRYSTAL_SHARDS) + .addCatalyst(2, EndItems.CRYSTAL_SHARDS).addCatalyst(4, EndItems.CRYSTAL_SHARDS) + .addCatalyst(6, EndItems.CRYSTAL_SHARDS).setTime(75).build(); + + InfusionRecipe.Builder.create("protection_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.PROTECTION, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(4, Items.TURTLE_HELMET).addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); + InfusionRecipe.Builder.create("fire_protection_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FIRE_PROTECTION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL).addCatalyst(2, Items.BLAZE_ROD) + .addCatalyst(4, Items.BLAZE_ROD).addCatalyst(6, Items.BLAZE_ROD).addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); + InfusionRecipe.Builder.create("feather_falling_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FEATHER_FALLING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL).addCatalyst(2, Items.FEATHER).addCatalyst(4, Items.FEATHER) + .addCatalyst(6, Items.FEATHER).addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") + .setTime(300).build(); + InfusionRecipe.Builder.create("blast_protection_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.BLAST_PROTECTION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL).addCatalyst(2, Blocks.OBSIDIAN) + .addCatalyst(4, Blocks.OBSIDIAN).addCatalyst(6, Blocks.OBSIDIAN).addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); + InfusionRecipe.Builder.create("projectile_protection_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.PROJECTILE_PROTECTION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL).addCatalyst(2, Items.SCUTE).addCatalyst(4, Items.SHIELD) + .addCatalyst(6, Items.SCUTE).addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") + .setTime(300).build(); + InfusionRecipe.Builder.create("respiration_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.RESPIRATION, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.NAUTILUS_SHELL).addCatalyst(4, Items.NAUTILUS_SHELL) + .addCatalyst(6, Items.NAUTILUS_SHELL).addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); + InfusionRecipe.Builder.create("aqua_affinity_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.AQUA_AFFINITY, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.PRISMARINE_CRYSTALS).addCatalyst(4, Items.PRISMARINE_CRYSTALS) + .addCatalyst(6, Items.PRISMARINE_CRYSTALS).addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); + InfusionRecipe.Builder.create("thorns_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.THORNS, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.CACTUS).addCatalyst(4, Blocks.CACTUS).addCatalyst(6, Blocks.CACTUS) + .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") + .setTime(300).build(); + InfusionRecipe.Builder.create("depth_strider_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.DEPTH_STRIDER, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.LILY_PAD).addCatalyst(4, EndBlocks.END_LILY_SEED).addCatalyst(6, Blocks.LILY_PAD) + .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") + .setTime(300).build(); + InfusionRecipe.Builder.create("frost_walker_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FROST_WALKER, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(4, EndBlocks.ANCIENT_EMERALD_ICE).addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); + InfusionRecipe.Builder.create("soul_speed_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SOUL_SPEED, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.SOUL_SAND, Blocks.SOUL_SOIL).addCatalyst(4, Blocks.SOUL_SAND, Blocks.SOUL_SOIL) + .addCatalyst(6, Blocks.SOUL_SAND, Blocks.SOUL_SOIL).addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); + InfusionRecipe.Builder.create("sharpness_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SHARPNESS, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(4, Items.NETHERITE_SCRAP).addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); + InfusionRecipe.Builder.create("smite_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SMITE, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.SUNFLOWER).addCatalyst(4, Items.GOLD_INGOT).addCatalyst(6, Blocks.SUNFLOWER) + .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") + .setTime(300).build(); + InfusionRecipe.Builder.create("bane_of_arthropods_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.BANE_OF_ARTHROPODS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL).addCatalyst(2, Items.FERMENTED_SPIDER_EYE) + .addCatalyst(4, Items.IRON_INGOT).addCatalyst(6, Items.FERMENTED_SPIDER_EYE) + .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") + .setTime(300).build(); + InfusionRecipe.Builder.create("knockback_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.KNOCKBACK, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.REDSTONE).addCatalyst(4, Blocks.PISTON).addCatalyst(6, Items.REDSTONE) + .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") + .setTime(300).build(); + InfusionRecipe.Builder.create("fire_aspect_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FIRE_ASPECT, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.BLAZE_POWDER).addCatalyst(4, Items.MAGMA_CREAM).addCatalyst(6, Items.BLAZE_POWDER) + .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") + .setTime(300).build(); + InfusionRecipe.Builder.create("looting_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.LOOTING, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.EMERALD).addCatalyst(4, Items.GOLD_INGOT).addCatalyst(6, Items.EMERALD) + .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") + .setTime(300).build(); + InfusionRecipe.Builder.create("sweeping_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SWEEPING, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.GOLDEN_SWORD).addCatalyst(4, Items.IRON_SWORD).addCatalyst(6, Items.GOLDEN_SWORD) + .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") + .setTime(300).build(); + InfusionRecipe.Builder.create("efficiency_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.EFFICIENCY, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, EndItems.AMBER_GEM).addCatalyst(4, EndItems.AMBER_GEM) + .addCatalyst(6, EndItems.AMBER_GEM).addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); + InfusionRecipe.Builder.create("silk_touch_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SILK_TOUCH, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.COBWEB).addCatalyst(4, EndItems.ETERNAL_CRYSTAL).addCatalyst(6, Blocks.COBWEB) + .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") + .setTime(375).build(); + InfusionRecipe.Builder.create("unbreaking_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.UNBREAKING, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.DIAMOND).addCatalyst(4, Items.DIAMOND).addCatalyst(6, Items.DIAMOND) + .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") + .setTime(300).build(); + InfusionRecipe.Builder.create("fortune_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.BLOCK_FORTUNE, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.EMERALD).addCatalyst(4, Items.RABBIT_FOOT).addCatalyst(6, Items.EMERALD) + .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") + .setTime(300).build(); + InfusionRecipe.Builder.create("power_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.POWER, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, EndItems.AMBER_GEM).addCatalyst(4, Items.DIAMOND_SWORD) + .addCatalyst(6, EndItems.AMBER_GEM).addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); + InfusionRecipe.Builder.create("punch_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.PUNCH, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.POPPED_CHORUS_FRUIT).addCatalyst(4, Items.SPECTRAL_ARROW) + .addCatalyst(6, Items.POPPED_CHORUS_FRUIT).addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); + InfusionRecipe.Builder.create("flame_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FLAME, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.BLAZE_POWDER).addCatalyst(4, Items.SPECTRAL_ARROW) + .addCatalyst(6, Items.BLAZE_POWDER).addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); + InfusionRecipe.Builder.create("infinity_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.INFINITY, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.SPECTRAL_ARROW).addCatalyst(4, EndItems.ETERNAL_CRYSTAL) + .addCatalyst(6, Items.SPECTRAL_ARROW).addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(375).build(); + InfusionRecipe.Builder.create("luck_of_sea_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.LUCK_OF_THE_SEA, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL).addCatalyst(2, Items.EMERALD) + .addCatalyst(4, Items.FISHING_ROD).addCatalyst(6, Items.EMERALD).addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); + InfusionRecipe.Builder.create("lure_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.LURE, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.GOLD_NUGGET).addCatalyst(4, Items.FISHING_ROD).addCatalyst(6, Items.GOLD_NUGGET) + .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") + .setTime(300).build(); + InfusionRecipe.Builder.create("loyalty_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.LOYALTY, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.ENDER_EYE).addCatalyst(4, Items.HEART_OF_THE_SEA).addCatalyst(6, Items.ENDER_EYE) + .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") + .setTime(375).build(); + InfusionRecipe.Builder.create("impaling_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.IMPALING, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.PRISMARINE_SHARD).addCatalyst(4, Items.IRON_SWORD) + .addCatalyst(6, Items.PRISMARINE_SHARD).addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); + InfusionRecipe.Builder.create("riptide_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.RIPTIDE, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.LEAD).addCatalyst(4, Items.HEART_OF_THE_SEA).addCatalyst(6, Items.LEAD) + .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") + .setTime(375).build(); + InfusionRecipe.Builder.create("channeling_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.CHANNELING, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.CHAIN).addCatalyst(4, Items.HEART_OF_THE_SEA).addCatalyst(6, Items.CHAIN) + .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") + .setTime(375).build(); + InfusionRecipe.Builder.create("multishot_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.MULTISHOT, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.ARROW).addCatalyst(4, Items.SPECTRAL_ARROW).addCatalyst(6, Items.ARROW) + .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") + .setTime(300).build(); + InfusionRecipe.Builder.create("quick_charge_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.QUICK_CHARGE, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.QUARTZ).addCatalyst(4, Items.GLOWSTONE_DUST).addCatalyst(6, Items.QUARTZ) + .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") + .setTime(300).build(); + InfusionRecipe.Builder.create("piercing_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.PIERCING, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.GLOWSTONE_DUST).addCatalyst(4, Items.SPECTRAL_ARROW) + .addCatalyst(6, Items.GLOWSTONE_DUST).addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); + InfusionRecipe.Builder.create("mending_book").setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.MENDING, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.EXPERIENCE_BOTTLE).addCatalyst(4, Blocks.ANVIL) + .addCatalyst(6, Items.EXPERIENCE_BOTTLE).addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(375).build(); } - + private static ItemStack createEnchantedBook(Enchantment enchantment, int level) { ItemStack book = new ItemStack(Items.ENCHANTED_BOOK); EnchantedBookItem.addEnchantment(book, new EnchantmentLevelEntry(enchantment, level)); diff --git a/src/main/java/ru/betterend/recipe/SmithingRecipes.java b/src/main/java/ru/betterend/recipe/SmithingRecipes.java index eeac8bc4..a48ce9f0 100644 --- a/src/main/java/ru/betterend/recipe/SmithingRecipes.java +++ b/src/main/java/ru/betterend/recipe/SmithingRecipes.java @@ -1,87 +1,45 @@ package ru.betterend.recipe; -import net.minecraft.item.Items; +import net.minecraft.world.item.Items; import ru.betterend.recipe.builders.SmithingTableRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; public class SmithingRecipes { - - public static void register() { - SmithingTableRecipe.create("aeternium_sword_handle") - .setResult(EndItems.AETERNIUM_SWORD_HANDLE) - .setBase(EndBlocks.TERMINITE.ingot) - .setAddition(EndItems.LEATHER_WRAPPED_STICK) - .build(); - - SmithingTableRecipe.create("aeternium_sword") - .setResult(EndItems.AETERNIUM_SWORD) - .setBase(EndItems.AETERNIUM_SWORD_BLADE) - .setAddition(EndItems.AETERNIUM_SWORD_HANDLE) - .build(); - SmithingTableRecipe.create("aeternium_pickaxe") - .setResult(EndItems.AETERNIUM_PICKAXE) - .setBase(EndItems.AETERNIUM_PICKAXE_HEAD) - .setAddition(EndItems.LEATHER_WRAPPED_STICK) - .build(); - SmithingTableRecipe.create("aeternium_axe") - .setResult(EndItems.AETERNIUM_AXE) - .setBase(EndItems.AETERNIUM_AXE_HEAD) - .setAddition(EndItems.LEATHER_WRAPPED_STICK) - .build(); - SmithingTableRecipe.create("aeternium_shovel") - .setResult(EndItems.AETERNIUM_SHOVEL) - .setBase(EndItems.AETERNIUM_SHOVEL_HEAD) - .setAddition(EndItems.LEATHER_WRAPPED_STICK) - .build(); - SmithingTableRecipe.create("aeternium_hoe") - .setResult(EndItems.AETERNIUM_HOE) - .setBase(EndItems.AETERNIUM_HOE_HEAD) - .setAddition(EndItems.LEATHER_WRAPPED_STICK) - .build(); - SmithingTableRecipe.create("aeternium_hammer") - .setResult(EndItems.AETERNIUM_HAMMER) - .setBase(EndItems.AETERNIUM_HAMMER_HEAD) - .setAddition(EndItems.LEATHER_WRAPPED_STICK) - .build(); - SmithingTableRecipe.create("netherite_hammer") - .setResult(EndItems.NETHERITE_HAMMER) - .setBase(EndItems.DIAMOND_HAMMER) - .setAddition(Items.NETHERITE_INGOT) - .build(); - - SmithingTableRecipe.create("aeternium_helmet") - .setResult(EndItems.AETERNIUM_HELMET) - .setBase(EndBlocks.TERMINITE.helmet) - .setAddition(EndItems.AETERNIUM_INGOT) - .build(); - SmithingTableRecipe.create("aeternium_chestplate") - .setResult(EndItems.AETERNIUM_CHESTPLATE) - .setBase(EndBlocks.TERMINITE.chestplate) - .setAddition(EndItems.AETERNIUM_INGOT) - .build(); - SmithingTableRecipe.create("aeternium_leggings") - .setResult(EndItems.AETERNIUM_LEGGINGS) - .setBase(EndBlocks.TERMINITE.leggings) - .setAddition(EndItems.AETERNIUM_INGOT) - .build(); - SmithingTableRecipe.create("aeternium_boots") - .setResult(EndItems.AETERNIUM_BOOTS) - .setBase(EndBlocks.TERMINITE.boots) - .setAddition(EndItems.AETERNIUM_INGOT) - .build(); - - SmithingTableRecipe.create("thallasium_anvil_updrade") - .setResult(EndBlocks.TERMINITE.anvil) - .setBase(EndBlocks.THALLASIUM.anvil) - .setAddition(EndBlocks.TERMINITE.block) - .build(); - - SmithingTableRecipe.create("terminite_anvil_updrade") - .setResult(EndBlocks.AETERNIUM_ANVIL) - .setBase(EndBlocks.TERMINITE.anvil) - .setAddition(EndBlocks.AETERNIUM_BLOCK) - .build(); + public static void register() { + SmithingTableRecipe.create("aeternium_sword_handle").setResult(EndItems.AETERNIUM_SWORD_HANDLE) + .setBase(EndBlocks.TERMINITE.ingot).setAddition(EndItems.LEATHER_WRAPPED_STICK).build(); + + SmithingTableRecipe.create("aeternium_sword").setResult(EndItems.AETERNIUM_SWORD) + .setBase(EndItems.AETERNIUM_SWORD_BLADE).setAddition(EndItems.AETERNIUM_SWORD_HANDLE).build(); + SmithingTableRecipe.create("aeternium_pickaxe").setResult(EndItems.AETERNIUM_PICKAXE) + .setBase(EndItems.AETERNIUM_PICKAXE_HEAD).setAddition(EndItems.LEATHER_WRAPPED_STICK).build(); + SmithingTableRecipe.create("aeternium_axe").setResult(EndItems.AETERNIUM_AXE) + .setBase(EndItems.AETERNIUM_AXE_HEAD).setAddition(EndItems.LEATHER_WRAPPED_STICK).build(); + SmithingTableRecipe.create("aeternium_shovel").setResult(EndItems.AETERNIUM_SHOVEL) + .setBase(EndItems.AETERNIUM_SHOVEL_HEAD).setAddition(EndItems.LEATHER_WRAPPED_STICK).build(); + SmithingTableRecipe.create("aeternium_hoe").setResult(EndItems.AETERNIUM_HOE) + .setBase(EndItems.AETERNIUM_HOE_HEAD).setAddition(EndItems.LEATHER_WRAPPED_STICK).build(); + SmithingTableRecipe.create("aeternium_hammer").setResult(EndItems.AETERNIUM_HAMMER) + .setBase(EndItems.AETERNIUM_HAMMER_HEAD).setAddition(EndItems.LEATHER_WRAPPED_STICK).build(); + + SmithingTableRecipe.create("netherite_hammer").setResult(EndItems.NETHERITE_HAMMER) + .setBase(EndItems.DIAMOND_HAMMER).setAddition(Items.NETHERITE_INGOT).build(); + + SmithingTableRecipe.create("aeternium_helmet").setResult(EndItems.AETERNIUM_HELMET) + .setBase(EndBlocks.TERMINITE.helmet).setAddition(EndItems.AETERNIUM_INGOT).build(); + SmithingTableRecipe.create("aeternium_chestplate").setResult(EndItems.AETERNIUM_CHESTPLATE) + .setBase(EndBlocks.TERMINITE.chestplate).setAddition(EndItems.AETERNIUM_INGOT).build(); + SmithingTableRecipe.create("aeternium_leggings").setResult(EndItems.AETERNIUM_LEGGINGS) + .setBase(EndBlocks.TERMINITE.leggings).setAddition(EndItems.AETERNIUM_INGOT).build(); + SmithingTableRecipe.create("aeternium_boots").setResult(EndItems.AETERNIUM_BOOTS) + .setBase(EndBlocks.TERMINITE.boots).setAddition(EndItems.AETERNIUM_INGOT).build(); + + SmithingTableRecipe.create("thallasium_anvil_updrade").setResult(EndBlocks.TERMINITE.anvil) + .setBase(EndBlocks.THALLASIUM.anvil).setAddition(EndBlocks.TERMINITE.block).build(); + + SmithingTableRecipe.create("terminite_anvil_updrade").setResult(EndBlocks.AETERNIUM_ANVIL) + .setBase(EndBlocks.TERMINITE.anvil).setAddition(EndBlocks.AETERNIUM_BLOCK).build(); } } diff --git a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java index 1467b497..69874cb2 100644 --- a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java @@ -6,19 +6,19 @@ import com.google.gson.JsonObject; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.inventory.Inventory; -import net.minecraft.item.Item; -import net.minecraft.item.ItemConvertible; -import net.minecraft.item.ItemStack; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemConvertible; +import net.minecraft.world.item.ItemStack; import net.minecraft.network.PacketByteBuf; -import net.minecraft.recipe.Ingredient; -import net.minecraft.recipe.Recipe; -import net.minecraft.recipe.RecipeSerializer; -import net.minecraft.recipe.RecipeType; -import net.minecraft.tag.Tag; -import net.minecraft.util.Identifier; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.tags.Tag; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.JsonHelper; import net.minecraft.util.collection.DefaultedList; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; import ru.betterend.interfaces.BetterEndRecipe; @@ -28,22 +28,23 @@ import ru.betterend.util.ItemUtil; import ru.betterend.util.RecipeHelper; public class AlloyingRecipe implements Recipe, BetterEndRecipe { - + public final static String GROUP = "alloying"; public final static RecipeType TYPE = EndRecipeManager.registerType(GROUP); public final static Serializer SERIALIZER = EndRecipeManager.registerSerializer(GROUP, new Serializer()); - public final static Identifier ID = BetterEnd.makeID(GROUP); - + public final static ResourceLocation ID = BetterEnd.makeID(GROUP); + protected final RecipeType type; - protected final Identifier id; + protected final ResourceLocation id; protected final Ingredient primaryInput; protected final Ingredient secondaryInput; protected final ItemStack output; protected final String group; protected final float experience; protected final int smeltTime; - - public AlloyingRecipe(Identifier id, String group, Ingredient primaryInput, Ingredient secondaryInput, ItemStack output, float experience, int smeltTime) { + + public AlloyingRecipe(ResourceLocation id, String group, Ingredient primaryInput, Ingredient secondaryInput, + ItemStack output, float experience, int smeltTime) { this.group = group; this.id = id; this.primaryInput = primaryInput; @@ -53,11 +54,11 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { this.smeltTime = smeltTime; this.type = TYPE; } - + public float getExperience() { return this.experience; } - + public int getSmeltTime() { return this.smeltTime; } @@ -67,14 +68,14 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { DefaultedList defaultedList = DefaultedList.of(); defaultedList.add(primaryInput); defaultedList.add(secondaryInput); - + return defaultedList; } @Override - public boolean matches(Inventory inv, World world) { - return this.primaryInput.test(inv.getStack(0)) && this.secondaryInput.test(inv.getStack(1)) || - this.primaryInput.test(inv.getStack(1)) && this.secondaryInput.test(inv.getStack(0)); + public boolean matches(Inventory inv, Level world) { + return this.primaryInput.test(inv.getStack(0)) && this.secondaryInput.test(inv.getStack(1)) + || this.primaryInput.test(inv.getStack(1)) && this.secondaryInput.test(inv.getStack(0)); } @Override @@ -93,7 +94,7 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { } @Override - public Identifier getId() { + public ResourceLocation getId() { return this.id; } @@ -106,23 +107,23 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { public RecipeType getType() { return this.type; } - + @Override @Environment(EnvType.CLIENT) public String getGroup() { return this.group; } - + @Environment(EnvType.CLIENT) public ItemStack getRecipeKindIcon() { return new ItemStack(EndBlocks.END_STONE_SMELTER); } - + public static class Builder { private final static Builder INSTANCE = new Builder(); private static boolean exist; - - public static Builder create(Identifier id) { + + public static Builder create(ResourceLocation id) { INSTANCE.id = id; INSTANCE.group = String.format("%s_%s", GROUP, id); INSTANCE.primaryInput = null; @@ -131,15 +132,15 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { INSTANCE.experience = 0.0F; INSTANCE.smeltTime = 350; exist = Configs.RECIPE_CONFIG.getBoolean("alloying", id.getPath(), true); - + return INSTANCE; } - + public static Builder create(String id) { return create(BetterEnd.makeID(id)); } - - private Identifier id; + + private ResourceLocation id; private Ingredient primaryInput; private Ingredient secondaryInput; private ItemStack output; @@ -147,79 +148,82 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { private float experience; private int smeltTime; private boolean alright = true; - - private Builder() {} - + + private Builder() { + } + public Builder setGroup(String group) { this.group = group; return this; } - + public Builder setPrimaryInput(ItemConvertible... inputs) { for (ItemConvertible item : inputs) { this.alright &= RecipeHelper.exists(item); } - this.primaryInput = Ingredient.ofItems(inputs); + this.primaryInput = Ingredient.of(inputs); return this; } - + public Builder setSecondaryInput(ItemConvertible... inputs) { for (ItemConvertible item : inputs) { this.alright &= RecipeHelper.exists(item); } - this.secondaryInput = Ingredient.ofItems(inputs); + this.secondaryInput = Ingredient.of(inputs); return this; } - + public Builder setPrimaryInput(Tag input) { this.primaryInput = Ingredient.fromTag(input); return this; } - + public Builder setSecondaryInput(Tag input) { this.secondaryInput = Ingredient.fromTag(input); return this; } - + public Builder setInput(ItemConvertible primaryInput, ItemConvertible secondaryInput) { this.setPrimaryInput(primaryInput); this.setSecondaryInput(secondaryInput); return this; } - + public Builder setInput(Tag primaryInput, Tag secondaryInput) { this.setPrimaryInput(primaryInput); this.setSecondaryInput(secondaryInput); return this; } - + public Builder setOutput(ItemConvertible output, int amount) { this.alright &= RecipeHelper.exists(output); this.output = new ItemStack(output, amount); return this; } - + public Builder setExpiriense(float amount) { this.experience = amount; return this; } - + public Builder setSmeltTime(int time) { this.smeltTime = time; return this; } - + public void build() { if (exist) { if (primaryInput == null) { - BetterEnd.LOGGER.warning("Primary input for Alloying recipe can't be 'null', recipe {} will be ignored!", id); + BetterEnd.LOGGER.warning( + "Primary input for Alloying recipe can't be 'null', recipe {} will be ignored!", id); return; } - if(secondaryInput == null) { - BetterEnd.LOGGER.warning("Secondary input for Alloying can't be 'null', recipe {} will be ignored!", id); + if (secondaryInput == null) { + BetterEnd.LOGGER.warning("Secondary input for Alloying can't be 'null', recipe {} will be ignored!", + id); return; } - if(output == null) { + if (output == null) { BetterEnd.LOGGER.warning("Output for Alloying can't be 'null', recipe {} will be ignored!", id); return; } @@ -231,14 +235,15 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { BetterEnd.LOGGER.debug("Can't add Alloying recipe {}! Ingeredient or output not exists.", id); return; } - EndRecipeManager.addRecipe(TYPE, new AlloyingRecipe(id, group, primaryInput, secondaryInput, output, experience, smeltTime)); + EndRecipeManager.addRecipe(TYPE, + new AlloyingRecipe(id, group, primaryInput, secondaryInput, output, experience, smeltTime)); } } } - + public static class Serializer implements RecipeSerializer { @Override - public AlloyingRecipe read(Identifier id, JsonObject json) { + public AlloyingRecipe read(ResourceLocation id, JsonObject json) { JsonArray ingredients = JsonHelper.getArray(json, "ingredients"); Ingredient primaryInput = Ingredient.fromJson(ingredients.get(0)); Ingredient secondaryInput = Ingredient.fromJson(ingredients.get(1)); @@ -250,19 +255,19 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { } float experience = JsonHelper.getFloat(json, "experience", 0.0F); int smeltTime = JsonHelper.getInt(json, "smelttime", 350); - + return new AlloyingRecipe(id, group, primaryInput, secondaryInput, output, experience, smeltTime); } @Override - public AlloyingRecipe read(Identifier id, PacketByteBuf packetBuffer) { + public AlloyingRecipe read(ResourceLocation id, PacketByteBuf packetBuffer) { String group = packetBuffer.readString(32767); Ingredient primary = Ingredient.fromPacket(packetBuffer); Ingredient secondary = Ingredient.fromPacket(packetBuffer); ItemStack output = packetBuffer.readItemStack(); float experience = packetBuffer.readFloat(); int smeltTime = packetBuffer.readVarInt(); - + return new AlloyingRecipe(id, group, primary, secondary, output, experience, smeltTime); } diff --git a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java index 13cc06d4..f46d27fe 100644 --- a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java @@ -6,22 +6,22 @@ import com.google.gson.JsonObject; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.PlayerEntity; import net.minecraft.inventory.Inventory; -import net.minecraft.item.Item; -import net.minecraft.item.ItemConvertible; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ToolItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemConvertible; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ToolItem; import net.minecraft.network.PacketByteBuf; -import net.minecraft.recipe.Ingredient; -import net.minecraft.recipe.Recipe; -import net.minecraft.recipe.RecipeSerializer; -import net.minecraft.recipe.RecipeType; -import net.minecraft.tag.Tag; -import net.minecraft.util.Identifier; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.tags.Tag; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.JsonHelper; import net.minecraft.util.collection.DefaultedList; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; import ru.betterend.interfaces.BetterEndRecipe; @@ -31,21 +31,22 @@ import ru.betterend.util.ItemUtil; import ru.betterend.util.RecipeHelper; public class AnvilRecipe implements Recipe, BetterEndRecipe { - + public final static String GROUP = "smithing"; public final static RecipeType TYPE = EndRecipeManager.registerType(GROUP); public final static Serializer SERIALIZER = EndRecipeManager.registerSerializer(GROUP, new Serializer()); - public final static Identifier ID = BetterEnd.makeID(GROUP); - - private final Identifier id; + public final static ResourceLocation ID = BetterEnd.makeID(GROUP); + + private final ResourceLocation id; private final Ingredient input; private final ItemStack output; private final int damage; private final int toolLevel; private final int anvilLevel; private final int inputCount; - - public AnvilRecipe(Identifier identifier, Ingredient input, ItemStack output, int inputCount, int toolLevel, int anvilLevel, int damage) { + + public AnvilRecipe(ResourceLocation identifier, Ingredient input, ItemStack output, int inputCount, int toolLevel, + int anvilLevel, int damage) { this.id = identifier; this.input = input; this.output = output; @@ -64,34 +65,35 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { public ItemStack getOutput() { return this.output; } - + @Override - public boolean matches(Inventory craftingInventory, World world) { + public boolean matches(Inventory craftingInventory, Level world) { return this.matches(craftingInventory); } - + @Override public ItemStack craft(Inventory craftingInventory) { return this.output.copy(); } - + public ItemStack craft(Inventory craftingInventory, PlayerEntity player) { if (!player.isCreative()) { - if (!checkHammerDurability(craftingInventory, player)) return ItemStack.EMPTY; + if (!checkHammerDurability(craftingInventory, player)) + return ItemStack.EMPTY; ItemStack hammer = craftingInventory.getStack(1); - hammer.damage(this.damage, player, entity -> - entity.sendEquipmentBreakStatus(null)); + hammer.damage(this.damage, player, entity -> entity.sendEquipmentBreakStatus(null)); } return this.craft(craftingInventory); } public boolean checkHammerDurability(Inventory craftingInventory, PlayerEntity player) { - if (player.isCreative()) return true; + if (player.isCreative()) + return true; ItemStack hammer = craftingInventory.getStack(1); int damage = hammer.getDamage() + this.damage; return damage < hammer.getMaxDamage(); } - + public boolean matches(Inventory craftingInventory) { ItemStack hammer = craftingInventory.getStack(1); if (hammer.isEmpty() || !EndTags.HAMMERS.contains(hammer.getItem())) { @@ -99,12 +101,11 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { } ItemStack material = craftingInventory.getStack(0); int materialCount = material.getCount(); - int level = ((ToolItem) hammer.getItem()).getMaterial().getMiningLevel(); - return this.input.test(craftingInventory.getStack(0)) && - materialCount >= this.inputCount && - level >= this.toolLevel; + int level = ((ToolItem) hammer.getItem()).getTier().getLevel(); + return this.input.test(craftingInventory.getStack(0)) && materialCount >= this.inputCount + && level >= this.toolLevel; } - + public int getDamage() { return this.damage; } @@ -120,10 +121,10 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { @Override public DefaultedList getPreviewInputs() { DefaultedList defaultedList = DefaultedList.of(); - defaultedList.add(Ingredient.ofStacks(EndTags.HAMMERS.values().stream().filter(hammer -> - ((ToolItem) hammer).getMaterial().getMiningLevel() >= toolLevel).map(ItemStack::new))); + defaultedList.add(Ingredient.ofStacks(EndTags.HAMMERS.values().stream() + .filter(hammer -> ((ToolItem) hammer).getTier().getLevel() >= toolLevel).map(ItemStack::new))); defaultedList.add(input); - + return defaultedList; } @@ -134,7 +135,7 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { } @Override - public Identifier getId() { + public ResourceLocation getId() { return this.id; } @@ -142,7 +143,7 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { public RecipeType getType() { return TYPE; } - + @Override public boolean isIgnoredInRecipeBook() { return true; @@ -150,10 +151,13 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; AnvilRecipe that = (AnvilRecipe) o; - return damage == that.damage && toolLevel == that.toolLevel && id.equals(that.id) && input.equals(that.input) && output.equals(that.output); + return damage == that.damage && toolLevel == that.toolLevel && id.equals(that.id) && input.equals(that.input) + && output.equals(that.output); } @Override @@ -168,12 +172,12 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { public static class Builder { private final static Builder INSTANCE = new Builder(); - + public static Builder create(String id) { return create(BetterEnd.makeID(id)); } - - public static Builder create(Identifier id) { + + public static Builder create(ResourceLocation id) { INSTANCE.id = id; INSTANCE.input = null; INSTANCE.output = null; @@ -182,11 +186,11 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { INSTANCE.anvilLevel = 1; INSTANCE.damage = 1; INSTANCE.alright = true; - + return INSTANCE; } - - private Identifier id; + + private ResourceLocation id; private Ingredient input; private ItemStack output; private int inputCount = 1; @@ -194,20 +198,21 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { private int anvilLevel = 1; private int damage = 1; private boolean alright; - - private Builder() {} - + + private Builder() { + } + public Builder setInput(ItemConvertible... inputItems) { this.alright &= RecipeHelper.exists(inputItems); - this.setInput(Ingredient.ofItems(inputItems)); + this.setInput(Ingredient.of(inputItems)); return this; } - + public Builder setInput(Tag inputTag) { this.setInput(Ingredient.fromTag(inputTag)); return this; } - + public Builder setInput(Ingredient ingredient) { this.input = ingredient; return this; @@ -217,17 +222,17 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { this.inputCount = count; return this; } - + public Builder setOutput(ItemConvertible output) { return this.setOutput(output, 1); } - + public Builder setOutput(ItemConvertible output, int amount) { this.alright &= RecipeHelper.exists(output); this.output = new ItemStack(output, amount); return this; } - + public Builder setToolLevel(int level) { this.toolLevel = level; return this; @@ -237,19 +242,19 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { this.anvilLevel = level; return this; } - + public Builder setDamage(int damage) { this.damage = damage; return this; } - + public void build() { if (Configs.RECIPE_CONFIG.getBoolean("anvil", id.getPath(), true)) { if (input == null) { BetterEnd.LOGGER.warning("Input for Anvil recipe can't be 'null', recipe {} will be ignored!", id); return; } - if(output == null) { + if (output == null) { BetterEnd.LOGGER.warning("Output for Anvil recipe can't be 'null', recipe {} will be ignored!", id); return; } @@ -261,14 +266,15 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { BetterEnd.LOGGER.debug("Can't add Anvil recipe {}! Ingeredient or output not exists.", id); return; } - EndRecipeManager.addRecipe(TYPE, new AnvilRecipe(id, input, output, inputCount, toolLevel, anvilLevel, damage)); + EndRecipeManager.addRecipe(TYPE, + new AnvilRecipe(id, input, output, inputCount, toolLevel, anvilLevel, damage)); } } } public static class Serializer implements RecipeSerializer { @Override - public AnvilRecipe read(Identifier id, JsonObject json) { + public AnvilRecipe read(ResourceLocation id, JsonObject json) { Ingredient input = Ingredient.fromJson(json.get("input")); JsonObject result = JsonHelper.getObject(json, "result"); ItemStack output = ItemUtil.fromJsonRecipe(result); @@ -279,19 +285,19 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { int toolLevel = JsonHelper.getInt(json, "toolLevel", 1); int anvilLevel = JsonHelper.getInt(json, "anvilLevel", 1); int damage = JsonHelper.getInt(json, "damage", 1); - + return new AnvilRecipe(id, input, output, inputCount, toolLevel, anvilLevel, damage); } @Override - public AnvilRecipe read(Identifier id, PacketByteBuf packetBuffer) { + public AnvilRecipe read(ResourceLocation id, PacketByteBuf packetBuffer) { Ingredient input = Ingredient.fromPacket(packetBuffer); ItemStack output = packetBuffer.readItemStack(); int inputCount = packetBuffer.readVarInt(); int toolLevel = packetBuffer.readVarInt(); int anvilLevel = packetBuffer.readVarInt(); int damage = packetBuffer.readVarInt(); - + return new AnvilRecipe(id, input, output, inputCount, toolLevel, anvilLevel, damage); } diff --git a/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java b/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java index 6744a774..cdf09e24 100644 --- a/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java @@ -1,14 +1,14 @@ package ru.betterend.recipe.builders; -import net.minecraft.item.ItemConvertible; -import net.minecraft.item.ItemStack; -import net.minecraft.recipe.BlastingRecipe; -import net.minecraft.recipe.CampfireCookingRecipe; -import net.minecraft.recipe.Ingredient; -import net.minecraft.recipe.RecipeType; -import net.minecraft.recipe.SmeltingRecipe; -import net.minecraft.recipe.SmokingRecipe; -import net.minecraft.util.Identifier; +import net.minecraft.world.item.ItemConvertible; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.BlastingRecipe; +import net.minecraft.world.item.crafting.CampfireCookingRecipe; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.SmeltingRecipe; +import net.minecraft.world.item.crafting.SmokingRecipe; +import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; import ru.betterend.recipe.EndRecipeManager; @@ -16,7 +16,7 @@ import ru.betterend.util.RecipeHelper; public class FurnaceRecipe { private static final FurnaceRecipe INSTANCE = new FurnaceRecipe(); - + private ItemConvertible input; private ItemConvertible output; private boolean exist; @@ -25,9 +25,10 @@ public class FurnaceRecipe { private int count; private int time; private float xp; - - private FurnaceRecipe() {} - + + private FurnaceRecipe() { + } + public static FurnaceRecipe make(String name, ItemConvertible input, ItemConvertible output) { INSTANCE.name = name; INSTANCE.group = ""; @@ -36,64 +37,68 @@ public class FurnaceRecipe { INSTANCE.count = 1; INSTANCE.time = 200; INSTANCE.xp = 0; - INSTANCE.exist = Configs.RECIPE_CONFIG.getBoolean("furnace", name, true) && RecipeHelper.exists(output) && RecipeHelper.exists(input); + INSTANCE.exist = Configs.RECIPE_CONFIG.getBoolean("furnace", name, true) && RecipeHelper.exists(output) + && RecipeHelper.exists(input); return INSTANCE; } - + public FurnaceRecipe setGroup(String group) { this.group = group; return this; } - + public FurnaceRecipe setOutputCount(int count) { this.count = count; return this; } - + public FurnaceRecipe setXP(float xp) { this.xp = xp; return this; } - + public FurnaceRecipe setCookTime(int time) { this.time = time; return this; } - + public void build() { build(false, false, false); } - + public void buildWithBlasting() { build(true, false, false); } - + public void buildFoodlike() { build(false, true, true); } - + public void build(boolean blasting, boolean campfire, boolean smoker) { if (exist) { - Identifier id = BetterEnd.makeID(name); - SmeltingRecipe recipe = new SmeltingRecipe(id, group, Ingredient.ofItems(input), new ItemStack(output, count), xp, time); + ResourceLocation id = BetterEnd.makeID(name); + SmeltingRecipe recipe = new SmeltingRecipe(id, group, Ingredient.of(input), new ItemStack(output, count), + xp, time); EndRecipeManager.addRecipe(RecipeType.SMELTING, recipe); - + if (blasting) { - BlastingRecipe recipe2 = new BlastingRecipe(id, group, Ingredient.ofItems(input), new ItemStack(output, count), xp, time / 2); + BlastingRecipe recipe2 = new BlastingRecipe(id, group, Ingredient.of(input), + new ItemStack(output, count), xp, time / 2); EndRecipeManager.addRecipe(RecipeType.BLASTING, recipe2); } - + if (campfire) { - CampfireCookingRecipe recipe2 = new CampfireCookingRecipe(id, group, Ingredient.ofItems(input), new ItemStack(output, count), xp, time * 3); + CampfireCookingRecipe recipe2 = new CampfireCookingRecipe(id, group, Ingredient.of(input), + new ItemStack(output, count), xp, time * 3); EndRecipeManager.addRecipe(RecipeType.CAMPFIRE_COOKING, recipe2); } - + if (smoker) { - SmokingRecipe recipe2 = new SmokingRecipe(id, group, Ingredient.ofItems(input), new ItemStack(output, count), xp, time / 2); + SmokingRecipe recipe2 = new SmokingRecipe(id, group, Ingredient.of(input), new ItemStack(output, count), + xp, time / 2); EndRecipeManager.addRecipe(RecipeType.SMOKING, recipe2); } - } - else { + } else { BetterEnd.LOGGER.debug("Furnace recipe {} couldn't be added", name); } } diff --git a/src/main/java/ru/betterend/recipe/builders/GridRecipe.java b/src/main/java/ru/betterend/recipe/builders/GridRecipe.java index 3aa19988..c51f2090 100644 --- a/src/main/java/ru/betterend/recipe/builders/GridRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/GridRecipe.java @@ -5,16 +5,16 @@ import java.util.Map; import com.google.common.collect.Maps; -import net.minecraft.item.Item; -import net.minecraft.item.ItemConvertible; -import net.minecraft.item.ItemStack; -import net.minecraft.recipe.CraftingRecipe; -import net.minecraft.recipe.Ingredient; -import net.minecraft.recipe.RecipeType; -import net.minecraft.recipe.ShapedRecipe; -import net.minecraft.recipe.ShapelessRecipe; -import net.minecraft.tag.Tag; -import net.minecraft.util.Identifier; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemConvertible; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingRecipe; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.ShapedRecipe; +import net.minecraft.world.item.crafting.ShapelessRecipe; +import net.minecraft.tags.Tag; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.collection.DefaultedList; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; @@ -23,10 +23,10 @@ import ru.betterend.util.RecipeHelper; public class GridRecipe { private static final GridRecipe INSTANCE = new GridRecipe(); - + private String name; private ItemConvertible output; - + private String group; private RecipeType type; private boolean shaped; @@ -34,22 +34,23 @@ public class GridRecipe { private Map materialKeys = Maps.newHashMap(); private int count; private boolean exist = true; - - private GridRecipe() {} - + + private GridRecipe() { + } + public static GridRecipe make(String name, ItemConvertible output) { INSTANCE.name = name; INSTANCE.output = output; - + INSTANCE.group = ""; INSTANCE.type = RecipeType.CRAFTING; INSTANCE.shaped = true; - INSTANCE.shape = new String[] {"#"}; + INSTANCE.shape = new String[] { "#" }; INSTANCE.materialKeys.clear(); INSTANCE.count = 1; - + INSTANCE.exist = Configs.RECIPE_CONFIG.getBoolean("grid", name, true) && RecipeHelper.exists(output); - + return INSTANCE; } @@ -57,65 +58,66 @@ public class GridRecipe { this.group = group; return this; } - + public GridRecipe setShape(String... shape) { this.shape = shape; return this; } - + public GridRecipe setList(String shape) { this.shape = new String[] { shape }; this.shaped = false; return this; } - + public GridRecipe addMaterial(char key, Tag value) { return addMaterial(key, Ingredient.fromTag(value)); } - + public GridRecipe addMaterial(char key, ItemStack... value) { return addMaterial(key, Ingredient.ofStacks(Arrays.stream(value))); } - + public GridRecipe addMaterial(char key, ItemConvertible... values) { - for (ItemConvertible item: values) { + for (ItemConvertible item : values) { exist &= RecipeHelper.exists(item); } - return addMaterial(key, Ingredient.ofItems(values)); + return addMaterial(key, Ingredient.of(values)); } - + private GridRecipe addMaterial(char key, Ingredient value) { materialKeys.put(key, value); return this; } - + public GridRecipe setOutputCount(int count) { this.count = count; return this; } - + private DefaultedList getMaterials(int width, int height) { DefaultedList materials = DefaultedList.ofSize(width * height, Ingredient.EMPTY); int pos = 0; - for (String line: shape) { + for (String line : shape) { for (int i = 0; i < width; i++) { char c = line.charAt(i); Ingredient material = materialKeys.get(c); - materials.set(pos ++, material == null ? Ingredient.EMPTY : material); + materials.set(pos++, material == null ? Ingredient.EMPTY : material); } } return materials; } - + public void build() { if (exist) { int height = shape.length; int width = shape[0].length(); ItemStack result = new ItemStack(output, count); - Identifier id = BetterEnd.makeID(name); + ResourceLocation id = BetterEnd.makeID(name); DefaultedList materials = this.getMaterials(width, height); - - CraftingRecipe recipe = shaped ? new ShapedRecipe(id, group, width, height, materials, result) : new ShapelessRecipe(id, group, result, materials); + + CraftingRecipe recipe = shaped ? new ShapedRecipe(id, group, width, height, materials, result) + : new ShapelessRecipe(id, group, result, materials); EndRecipeManager.addRecipe(type, recipe); } else { BetterEnd.LOGGER.debug("Recipe {} couldn't be added", name); diff --git a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java index 5a876161..079c0b07 100644 --- a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java @@ -6,17 +6,17 @@ import com.google.gson.JsonObject; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.item.ItemConvertible; -import net.minecraft.item.ItemStack; +import net.minecraft.world.item.ItemConvertible; +import net.minecraft.world.item.ItemStack; import net.minecraft.network.PacketByteBuf; -import net.minecraft.recipe.Ingredient; -import net.minecraft.recipe.Recipe; -import net.minecraft.recipe.RecipeSerializer; -import net.minecraft.recipe.RecipeType; -import net.minecraft.util.Identifier; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.JsonHelper; import net.minecraft.util.collection.DefaultedList; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; import ru.betterend.interfaces.BetterEndRecipe; @@ -25,38 +25,39 @@ import ru.betterend.rituals.InfusionRitual; import ru.betterend.util.ItemUtil; public class InfusionRecipe implements Recipe, BetterEndRecipe { - + public final static String GROUP = "infusion"; public final static RecipeType TYPE = EndRecipeManager.registerType(GROUP); public final static Serializer SERIALIZER = EndRecipeManager.registerSerializer(GROUP, new Serializer()); - public final static Identifier ID = BetterEnd.makeID(GROUP); - - private final Identifier id; + public final static ResourceLocation ID = BetterEnd.makeID(GROUP); + + private final ResourceLocation id; private Ingredient input; private ItemStack output; private int time = 1; private Ingredient[] catalysts = new Ingredient[8]; private String group; - - private InfusionRecipe(Identifier id) { + + private InfusionRecipe(ResourceLocation id) { this(id, null, null); } - - private InfusionRecipe(Identifier id, Ingredient input, ItemStack output) { + + private InfusionRecipe(ResourceLocation id, Ingredient input, ItemStack output) { this.id = id; this.input = input; this.output = output; Arrays.fill(catalysts, Ingredient.EMPTY); } - + public int getInfusionTime() { return this.time; } @Override - public boolean matches(InfusionRitual inv, World world) { + public boolean matches(InfusionRitual inv, Level world) { boolean valid = this.input.test(inv.getStack(0)); - if (!valid) return false; + if (!valid) + return false; for (int i = 0; i < 8; i++) { valid &= this.catalysts[i].test(inv.getStack(i + 1)); } @@ -72,7 +73,7 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { public boolean fits(int width, int height) { return true; } - + @Override public DefaultedList getPreviewInputs() { DefaultedList defaultedList = DefaultedList.of(); @@ -89,10 +90,10 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { } @Override - public Identifier getId() { + public ResourceLocation getId() { return this.id; } - + @Override @Environment(EnvType.CLIENT) public String getGroup() { @@ -108,79 +109,82 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { public RecipeType getType() { return TYPE; } - + public static class Builder { private final static Builder INSTANCE = new Builder(); private static boolean exist; - + public static Builder create(String id) { return create(BetterEnd.makeID(id)); } - - public static Builder create(Identifier id) { + + public static Builder create(ResourceLocation id) { INSTANCE.id = id; INSTANCE.input = null; INSTANCE.output = null; INSTANCE.time = 1; exist = Configs.RECIPE_CONFIG.getBoolean("infusion", id.getPath(), true); - + Arrays.fill(INSTANCE.catalysts, Ingredient.EMPTY); - + return INSTANCE; } - - private Identifier id; + + private ResourceLocation id; private Ingredient input; private ItemStack output; private String group; private int time = 1; private Ingredient[] catalysts = new Ingredient[8]; - + private Builder() { Arrays.fill(catalysts, Ingredient.EMPTY); } - + public Builder setGroup(String group) { this.group = group; return this; } - + public Builder setInput(ItemConvertible input) { - this.input = Ingredient.ofItems(input); + this.input = Ingredient.of(input); return this; } - + public Builder setOutput(ItemConvertible output) { this.output = new ItemStack(output); this.output.setCount(1); return this; } - + public Builder setOutput(ItemStack output) { this.output = output; this.output.setCount(1); return this; } - + public Builder setTime(int time) { this.time = time; return this; } - + public Builder addCatalyst(int slot, ItemConvertible... items) { - if (slot > 7) return this; - this.catalysts[slot] = Ingredient.ofItems(items); + if (slot > 7) + return this; + this.catalysts[slot] = Ingredient.of(items); return this; } - + public void build() { if (exist) { if (input == null) { - BetterEnd.LOGGER.warning("Input for Infusion recipe can't be 'null', recipe {} will be ignored!", id); + BetterEnd.LOGGER.warning("Input for Infusion recipe can't be 'null', recipe {} will be ignored!", + id); return; } if (output == null) { - BetterEnd.LOGGER.warning("Output for Infusion recipe can't be 'null', recipe {} will be ignored!", id); + BetterEnd.LOGGER.warning("Output for Infusion recipe can't be 'null', recipe {} will be ignored!", + id); return; } InfusionRecipe recipe = new InfusionRecipe(id, input, output); @@ -188,8 +192,10 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { recipe.time = time; int empty = 0; for (int i = 0; i < catalysts.length; i++) { - if (catalysts[i].isEmpty()) empty++; - else recipe.catalysts[i] = catalysts[i]; + if (catalysts[i].isEmpty()) + empty++; + else + recipe.catalysts[i] = catalysts[i]; } if (empty == catalysts.length) { BetterEnd.LOGGER.warning("At least one catalyst must be non empty, recipe {} will be ignored!", id); @@ -199,10 +205,10 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { } } } - + public static class Serializer implements RecipeSerializer { @Override - public InfusionRecipe read(Identifier id, JsonObject json) { + public InfusionRecipe read(ResourceLocation id, JsonObject json) { InfusionRecipe recipe = new InfusionRecipe(id); recipe.input = Ingredient.fromJson(json.get("input")); JsonObject result = JsonHelper.getObject(json, "result"); @@ -212,7 +218,7 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { } recipe.group = JsonHelper.getString(json, "group", GROUP); recipe.time = JsonHelper.getInt(json, "time", 1); - + JsonObject catalysts = JsonHelper.asObject(json, "catalysts"); ItemStack catalyst = ItemUtil.fromStackString(JsonHelper.getString(catalysts, "north", "")); recipe.catalysts[0] = Ingredient.ofStacks(Arrays.stream(new ItemStack[] { catalyst })); @@ -230,12 +236,12 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { recipe.catalysts[6] = Ingredient.ofStacks(Arrays.stream(new ItemStack[] { catalyst })); catalyst = ItemUtil.fromStackString(JsonHelper.getString(catalysts, "north_west", "")); recipe.catalysts[7] = Ingredient.ofStacks(Arrays.stream(new ItemStack[] { catalyst })); - + return recipe; } @Override - public InfusionRecipe read(Identifier id, PacketByteBuf buffer) { + public InfusionRecipe read(ResourceLocation id, PacketByteBuf buffer) { InfusionRecipe recipe = new InfusionRecipe(id); recipe.input = Ingredient.fromPacket(buffer); recipe.output = buffer.readItemStack(); diff --git a/src/main/java/ru/betterend/recipe/builders/SmithingTableRecipe.java b/src/main/java/ru/betterend/recipe/builders/SmithingTableRecipe.java index d5935492..d2172a2c 100644 --- a/src/main/java/ru/betterend/recipe/builders/SmithingTableRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/SmithingTableRecipe.java @@ -1,88 +1,91 @@ package ru.betterend.recipe.builders; -import net.minecraft.item.Item; -import net.minecraft.item.ItemConvertible; -import net.minecraft.item.ItemStack; -import net.minecraft.recipe.Ingredient; -import net.minecraft.recipe.RecipeType; -import net.minecraft.recipe.SmithingRecipe; -import net.minecraft.tag.Tag; -import net.minecraft.util.Identifier; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemConvertible; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.SmithingRecipe; +import net.minecraft.tags.Tag; +import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; import ru.betterend.recipe.EndRecipeManager; import ru.betterend.util.RecipeHelper; public class SmithingTableRecipe { - + private final static SmithingTableRecipe BUILDER = new SmithingTableRecipe(); private final static RecipeType TYPE = RecipeType.SMITHING; - + public static SmithingTableRecipe create(String name) { return create(BetterEnd.makeID(name)); } - - public static SmithingTableRecipe create(Identifier id) { + + public static SmithingTableRecipe create(ResourceLocation id) { BUILDER.id = id; BUILDER.base = null; BUILDER.addition = null; BUILDER.result = null; BUILDER.alright = true; - + return BUILDER; } - - private Identifier id; + + private ResourceLocation id; private Ingredient base; private Ingredient addition; private ItemStack result; private boolean alright; - - private SmithingTableRecipe() {} - + + private SmithingTableRecipe() { + } + public SmithingTableRecipe setResult(ItemConvertible item) { return this.setResult(item, 1); } - + public SmithingTableRecipe setResult(ItemConvertible item, int count) { this.alright &= RecipeHelper.exists(item); this.result = new ItemStack(item, count); return this; } - + public SmithingTableRecipe setBase(ItemConvertible... items) { this.alright &= RecipeHelper.exists(items); - this.base = Ingredient.ofItems(items); + this.base = Ingredient.of(items); return this; } - + public SmithingTableRecipe setBase(Tag tag) { this.base = (Ingredient.fromTag(tag)); return this; } - + public SmithingTableRecipe setAddition(ItemConvertible... items) { this.alright &= RecipeHelper.exists(items); - this.addition = Ingredient.ofItems(items); + this.addition = Ingredient.of(items); return this; } - + public SmithingTableRecipe setAddition(Tag tag) { this.addition = (Ingredient.fromTag(tag)); return this; } - + public void build() { if (Configs.RECIPE_CONFIG.getBoolean("smithing", id.getPath(), true)) { if (base == null) { - BetterEnd.LOGGER.warning("Base input for Smithing recipe can't be 'null', recipe {} will be ignored!", id); + BetterEnd.LOGGER.warning("Base input for Smithing recipe can't be 'null', recipe {} will be ignored!", + id); return; } if (addition == null) { - BetterEnd.LOGGER.warning("Addition input for Smithing recipe can't be 'null', recipe {} will be ignored!", id); + BetterEnd.LOGGER + .warning("Addition input for Smithing recipe can't be 'null', recipe {} will be ignored!", id); return; } - if(result == null) { + if (result == null) { BetterEnd.LOGGER.warning("Result for Smithing recipe can't be 'null', recipe {} will be ignored!", id); return; } diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index 3bf04bb4..8b133da5 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -20,9 +20,9 @@ import net.fabricmc.fabric.impl.biome.InternalBiomeData; import net.fabricmc.fabric.impl.biome.WeightedBiomePicker; import net.minecraft.client.MinecraftClient; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.registry.BuiltinRegistries; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome.Category; @@ -61,28 +61,28 @@ import ru.betterend.world.generator.BiomePicker; import ru.betterend.world.generator.BiomeType; public class EndBiomes { - private static final HashMap ID_MAP = Maps.newHashMap(); + private static final HashMap ID_MAP = Maps.newHashMap(); private static final HashMap CLIENT = Maps.newHashMap(); - public static final Set FABRIC_VOID = Sets.newHashSet(); - private static final Set SUBBIOMES_UNMUTABLES = Sets.newHashSet(); - + public static final Set FABRIC_VOID = Sets.newHashSet(); + private static final Set SUBBIOMES_UNMUTABLES = Sets.newHashSet(); + public static final BiomePicker LAND_BIOMES = new BiomePicker(); public static final BiomePicker VOID_BIOMES = new BiomePicker(); public static final BiomePicker CAVE_BIOMES = new BiomePicker(); public static final List SUBBIOMES = Lists.newArrayList(); private static final JsonObject EMPTY_JSON = new JsonObject(); - + private static Registry biomeRegistry; - + // Vanilla Land public static final EndBiome END = registerBiome(BiomeKeys.THE_END, BiomeType.LAND, 1F); public static final EndBiome END_MIDLANDS = registerSubBiome(BiomeKeys.END_MIDLANDS, END, 0.5F); public static final EndBiome END_HIGHLANDS = registerSubBiome(BiomeKeys.END_HIGHLANDS, END, 0.5F); - + // Vanilla Void public static final EndBiome END_BARRENS = registerBiome(BiomeKeys.END_BARRENS, BiomeType.VOID, 1F); public static final EndBiome SMALL_END_ISLANDS = registerBiome(BiomeKeys.SMALL_END_ISLANDS, BiomeType.VOID, 1); - + // Better End Land public static final EndBiome FOGGY_MUSHROOMLAND = registerBiome(new FoggyMushroomlandBiome(), BiomeType.LAND); public static final EndBiome CHORUS_FOREST = registerBiome(new ChorusForestBiome(), BiomeType.LAND); @@ -101,37 +101,39 @@ public class EndBiomes { public static final EndBiome DRY_SHRUBLAND = registerBiome(new DryShrublandBiome(), BiomeType.LAND); public static final EndBiome LANTERN_WOODS = registerBiome(new LanternWoodsBiome(), BiomeType.LAND); public static final EndBiome NEON_OASIS = registerSubBiome(new NeonOasisBiome(), DUST_WASTELANDS); - + // Better End Void public static final EndBiome ICE_STARFIELD = registerBiome(new BiomeIceStarfield(), BiomeType.VOID); - + // Better End Caves public static final EndCaveBiome EMPTY_END_CAVE = registerCaveBiome(new EmptyEndCaveBiome()); public static final EndCaveBiome EMPTY_SMARAGDANT_CAVE = registerCaveBiome(new EmptySmaragdantCaveBiome()); public static final EndCaveBiome LUSH_SMARAGDANT_CAVE = registerCaveBiome(new LushSmaragdantCaveBiome()); public static final EndCaveBiome EMPTY_AURORA_CAVE = registerCaveBiome(new EmptyAuroraCaveBiome()); public static final EndCaveBiome LUSH_AURORA_CAVE = registerCaveBiome(new LushAuroraCaveBiome()); - - public static void register() {} - + + public static void register() { + } + public static void mutateRegistry(Registry biomeRegistry) { EndBiomes.biomeRegistry = biomeRegistry; - + LAND_BIOMES.clearMutables(); VOID_BIOMES.clearMutables(); CAVE_BIOMES.clearMutables(); - + if (FABRIC_VOID.isEmpty()) { loadFabricAPIBiomes(); } - + Map configs = Maps.newHashMap(); - + biomeRegistry.forEach((biome) -> { if (biome.getCategory() == Category.THEEND) { - Identifier id = biomeRegistry.getId(biome); + ResourceLocation id = biomeRegistry.getId(biome); if (Configs.BIOME_CONFIG.getBoolean(id, "enabled", true)) { - if (!LAND_BIOMES.containsImmutable(id) && !VOID_BIOMES.containsImmutable(id) && !SUBBIOMES_UNMUTABLES.contains(id)) { + if (!LAND_BIOMES.containsImmutable(id) && !VOID_BIOMES.containsImmutable(id) + && !SUBBIOMES_UNMUTABLES.contains(id)) { JsonObject config = configs.get(id.getNamespace()); if (config == null) { config = loadJsonConfig(id.getNamespace()); @@ -152,8 +154,7 @@ public class EndBiomes { if (isVoid) { VOID_BIOMES.addBiomeMutable(endBiome); - } - else { + } else { LAND_BIOMES.addBiomeMutable(endBiome); } ID_MAP.put(id, endBiome); @@ -163,31 +164,31 @@ public class EndBiomes { }); Integrations.addBiomes(); Configs.BIOME_CONFIG.saveChanges(); - + rebuildPicker(LAND_BIOMES, biomeRegistry); rebuildPicker(VOID_BIOMES, biomeRegistry); rebuildPicker(CAVE_BIOMES, biomeRegistry); - + SUBBIOMES.forEach((endBiome) -> { endBiome.updateActualBiomes(biomeRegistry); }); - + CLIENT.clear(); } - + private static void rebuildPicker(BiomePicker picker, Registry biomeRegistry) { picker.rebuild(); picker.getBiomes().forEach((endBiome) -> { endBiome.updateActualBiomes(biomeRegistry); }); } - + private static void loadFabricAPIBiomes() { List> biomes = Lists.newArrayList(); biomes.addAll(getBiomes(InternalBiomeData.getEndBiomesMap().get(BiomeKeys.SMALL_END_ISLANDS))); biomes.addAll(getBiomes(InternalBiomeData.getEndBarrensMap().get(BiomeKeys.END_BARRENS))); biomes.forEach((key) -> FABRIC_VOID.add(key.getValue())); - + if (BetterEnd.isDevEnvironment()) { System.out.println("=================================="); System.out.println("Added void biomes from Fabric API:"); @@ -197,49 +198,55 @@ public class EndBiomes { System.out.println("=================================="); } } - + private static List> getBiomes(WeightedBiomePicker picker) { IBiomeList biomeList = (IBiomeList) (Object) picker; return biomeList == null ? Collections.emptyList() : biomeList.getBiomes(); } - + private static JsonObject loadJsonConfig(String namespace) { - InputStream inputstream = EndBiomes.class.getResourceAsStream("/data/" + namespace + "/end_biome_properties.json"); + InputStream inputstream = EndBiomes.class + .getResourceAsStream("/data/" + namespace + "/end_biome_properties.json"); if (inputstream != null) { return JsonFactory.getJsonObject(inputstream); - } - else { + } else { return EMPTY_JSON; } } - + /** - * Initialize registry if it was not initialized in world generation (when using mods/datapacks, that overrides the End generation) + * Initialize registry if it was not initialized in world generation (when using + * mods/datapacks, that overrides the End generation) + * * @param server - {@link MinecraftServer} */ public static void initRegistry(MinecraftServer server) { if (biomeRegistry == null) { - biomeRegistry = server.getRegistryManager().get(Registry.BIOME_KEY); + biomeRegistry = server.registryAccess().get(Registry.BIOME_KEY); } } - + /** - * Registers new {@link EndBiome} and adds it to picker, can be used to add existing mod biomes into the End. - * @param biome - {@link Biome} instance - * @param type - {@link BiomeType} + * Registers new {@link EndBiome} and adds it to picker, can be used to add + * existing mod biomes into the End. + * + * @param biome - {@link Biome} instance + * @param type - {@link BiomeType} * @param genChance - generation chance [0.0F - Infinity] * @return registered {@link EndBiome} */ public static EndBiome registerBiome(Biome biome, BiomeType type, float genChance) { return registerBiome(biome, type, 1, genChance); } - + /** - * Registers new {@link EndBiome} and adds it to picker, can be used to add existing mod biomes into the End. - * @param biome - {@link Biome} instance - * @param type - {@link BiomeType} + * Registers new {@link EndBiome} and adds it to picker, can be used to add + * existing mod biomes into the End. + * + * @param biome - {@link Biome} instance + * @param type - {@link BiomeType} * @param fogDensity - density of fog (def: 1F) [0.0F - Infinity] - * @param genChance - generation chance [0.0F - Infinity] + * @param genChance - generation chance [0.0F - Infinity] * @return registered {@link EndBiome} */ public static EndBiome registerBiome(Biome biome, BiomeType type, float fogDensity, float genChance) { @@ -249,27 +256,32 @@ public class EndBiomes { } return endBiome; } - + /** - * Registers new {@link EndBiome} from existed {@link Biome} and put as a sub-biome into selected parent. - * @param biome - {@link Biome} instance - * @param parent - {@link EndBiome} to be linked with + * Registers new {@link EndBiome} from existed {@link Biome} and put as a + * sub-biome into selected parent. + * + * @param biome - {@link Biome} instance + * @param parent - {@link EndBiome} to be linked with * @param genChance - generation chance [0.0F - Infinity] * @return registered {@link EndBiome} */ public static EndBiome registerSubBiome(Biome biome, EndBiome parent, float genChance, boolean hasCaves) { return registerSubBiome(biome, parent, 1, genChance, hasCaves); } - + /** - * Registers new {@link EndBiome} from existed {@link Biome} and put as a sub-biome into selected parent. - * @param biome - {@link Biome} instance - * @param parent - {@link EndBiome} to be linked with + * Registers new {@link EndBiome} from existed {@link Biome} and put as a + * sub-biome into selected parent. + * + * @param biome - {@link Biome} instance + * @param parent - {@link EndBiome} to be linked with * @param fogDensity - density of fog (def: 1F) [0.0F - Infinity] - * @param genChance - generation chance [0.0F - Infinity] + * @param genChance - generation chance [0.0F - Infinity] * @return registered {@link EndBiome} */ - public static EndBiome registerSubBiome(Biome biome, EndBiome parent, float fogDensity, float genChance, boolean hasCaves) { + public static EndBiome registerSubBiome(Biome biome, EndBiome parent, float fogDensity, float genChance, + boolean hasCaves) { EndBiome endBiome = new EndBiome(BuiltinRegistries.BIOME.getId(biome), biome, fogDensity, genChance, hasCaves); if (Configs.BIOME_CONFIG.getBoolean(endBiome.getID(), "enabled", true)) { parent.addSubBiome(endBiome); @@ -279,10 +291,11 @@ public class EndBiomes { } return endBiome; } - + /** * Put existing {@link EndBiome} as a sub-biome into selected parent. - * @param biome - {@link EndBiome} instance + * + * @param biome - {@link EndBiome} instance * @param parent - {@link EndBiome} to be linked with * @return registered {@link EndBiome} */ @@ -297,11 +310,12 @@ public class EndBiomes { } return biome; } - + /** * Registers {@link EndBiome} and adds it into worldgen. + * * @param biome - {@link EndBiome} instance - * @param type - {@link BiomeType} + * @param type - {@link BiomeType} * @return registered {@link EndBiome} */ public static EndBiome registerBiome(EndBiome biome, BiomeType type) { @@ -311,16 +325,17 @@ public class EndBiomes { ID_MAP.put(biome.getID(), biome); if (type == BiomeType.LAND) { addLandBiomeToFabricApi(biome); - } - else { + } else { addVoidBiomeToFabricApi(biome); } } return biome; } - + /** - * Put integration sub-biome {@link EndBiome} into subbiomes list and registers it. + * Put integration sub-biome {@link EndBiome} into subbiomes list and registers + * it. + * * @param biome - {@link EndBiome} instance * @return registered {@link EndBiome} */ @@ -334,13 +349,14 @@ public class EndBiomes { } return biome; } - + /** * Link integration sub-biome with parent. - * @param biome - {@link EndBiome} instance - * @param parent - {@link Identifier} parent id + * + * @param biome - {@link EndBiome} instance + * @param parent - {@link ResourceLocation} parent id */ - public static void addSubBiomeIntegration(EndBiome biome, Identifier parent) { + public static void addSubBiomeIntegration(EndBiome biome, ResourceLocation parent) { if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { EndBiome parentBiome = ID_MAP.get(parent); if (parentBiome != null && !parentBiome.containsSubBiome(biome)) { @@ -348,20 +364,19 @@ public class EndBiomes { } } } - + public static EndBiome registerBiome(RegistryKey key, BiomeType type, float genChance) { return registerBiome(BuiltinRegistries.BIOME.get(key), type, genChance); } - + public static EndBiome registerSubBiome(RegistryKey key, EndBiome parent, float genChance) { return registerSubBiome(BuiltinRegistries.BIOME.get(key), parent, genChance, true); } - + private static void addToPicker(EndBiome biome, BiomeType type) { if (type == BiomeType.LAND) { LAND_BIOMES.addBiome(biome); - } - else { + } else { VOID_BIOMES.addBiome(biome); } } @@ -369,42 +384,42 @@ public class EndBiomes { private static void registerBiomeDirectly(EndBiome biome) { Registry.register(BuiltinRegistries.BIOME, biome.getID(), biome.getBiome()); } - + private static void addLandBiomeToFabricApi(EndBiome biome) { float weight = biome.getGenChanceImmutable(); RegistryKey key = BuiltinRegistries.BIOME.getKey(biome.getBiome()).get(); InternalBiomeData.addEndBiomeReplacement(BiomeKeys.END_HIGHLANDS, key, weight); InternalBiomeData.addEndBiomeReplacement(BiomeKeys.END_MIDLANDS, key, weight); } - + private static void addVoidBiomeToFabricApi(EndBiome biome) { float weight = biome.getGenChanceImmutable(); RegistryKey key = BuiltinRegistries.BIOME.getKey(biome.getBiome()).get(); InternalBiomeData.addEndBiomeReplacement(BiomeKeys.SMALL_END_ISLANDS, key, weight); } - + public static EndBiome getFromBiome(Biome biome) { return ID_MAP.getOrDefault(biomeRegistry.getId(biome), END); } - + @Environment(EnvType.CLIENT) public static EndBiome getRenderBiome(Biome biome) { EndBiome endBiome = CLIENT.get(biome); if (endBiome == null) { MinecraftClient minecraft = MinecraftClient.getInstance(); - Identifier id = minecraft.world.getRegistryManager().get(Registry.BIOME_KEY).getId(biome); + ResourceLocation id = minecraft.world.registryAccess().get(Registry.BIOME_KEY).getId(biome); endBiome = id == null ? END : ID_MAP.getOrDefault(id, END); CLIENT.put(biome, endBiome); } return endBiome; } - - public static Identifier getBiomeID(Biome biome) { - Identifier id = biomeRegistry.getId(biome); + + public static ResourceLocation getBiomeID(Biome biome) { + ResourceLocation id = biomeRegistry.getId(biome); return id == null ? END.getID() : id; } - public static EndBiome getBiome(Identifier biomeID) { + public static EndBiome getBiome(ResourceLocation biomeID) { return ID_MAP.getOrDefault(biomeID, END); } @@ -416,7 +431,7 @@ public class EndBiomes { result.addAll(SUBBIOMES); return result; } - + public static EndCaveBiome registerCaveBiome(EndCaveBiome biome) { if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { registerBiomeDirectly(biome); @@ -425,12 +440,12 @@ public class EndBiomes { } return biome; } - + public static EndCaveBiome getCaveBiome(Random random) { return (EndCaveBiome) CAVE_BIOMES.getBiome(random); } - - public static boolean hasBiome(Identifier biomeID) { + + public static boolean hasBiome(ResourceLocation biomeID) { return ID_MAP.containsKey(biomeID); } } diff --git a/src/main/java/ru/betterend/registry/EndBlockEntities.java b/src/main/java/ru/betterend/registry/EndBlockEntities.java index 6b74d82c..96116a09 100644 --- a/src/main/java/ru/betterend/registry/EndBlockEntities.java +++ b/src/main/java/ru/betterend/registry/EndBlockEntities.java @@ -4,11 +4,11 @@ import java.util.List; import com.google.common.collect.Lists; -import net.minecraft.block.Block; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.item.BlockItem; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.item.BlockItem; +import net.minecraft.core.Registry; import ru.betterend.BetterEnd; import ru.betterend.blocks.EndStoneSmelter; import ru.betterend.blocks.EternalPedestal; @@ -29,30 +29,35 @@ import ru.betterend.blocks.entities.InfusionPedestalEntity; import ru.betterend.blocks.entities.PedestalBlockEntity; public class EndBlockEntities { - public final static BlockEntityType END_STONE_SMELTER = registerBlockEntity(EndStoneSmelter.ID, + public final static BlockEntityType END_STONE_SMELTER = registerBlockEntity( + EndStoneSmelter.ID, BlockEntityType.Builder.create(EndStoneSmelterBlockEntity::new, EndBlocks.END_STONE_SMELTER)); public final static BlockEntityType PEDESTAL = registerBlockEntity("pedestal", BlockEntityType.Builder.create(PedestalBlockEntity::new, getPedestals())); - public final static BlockEntityType ETERNAL_PEDESTAL = registerBlockEntity("eternal_pedestal", - BlockEntityType.Builder.create(EternalPedestalEntity::new, EndBlocks.ETERNAL_PEDESTAL)); - public final static BlockEntityType INFUSION_PEDESTAL = registerBlockEntity("infusion_pedestal", + public final static BlockEntityType ETERNAL_PEDESTAL = registerBlockEntity( + "eternal_pedestal", BlockEntityType.Builder.create(EternalPedestalEntity::new, EndBlocks.ETERNAL_PEDESTAL)); + public final static BlockEntityType INFUSION_PEDESTAL = registerBlockEntity( + "infusion_pedestal", BlockEntityType.Builder.create(InfusionPedestalEntity::new, EndBlocks.INFUSION_PEDESTAL)); - public static final BlockEntityType CHEST = registerBlockEntity("chest", + public static final BlockEntityType CHEST = registerBlockEntity("chest", BlockEntityType.Builder.create(EChestBlockEntity::new, getChests())); public static final BlockEntityType BARREL = registerBlockEntity("barrel", BlockEntityType.Builder.create(EBarrelBlockEntity::new, getBarrels())); public static final BlockEntityType SIGN = registerBlockEntity("sign", BlockEntityType.Builder.create(ESignBlockEntity::new, getSigns())); - public final static BlockEntityType HYDROTHERMAL_VENT = registerBlockEntity("hydrother_malvent", + public final static BlockEntityType HYDROTHERMAL_VENT = registerBlockEntity( + "hydrother_malvent", BlockEntityType.Builder.create(BlockEntityHydrothermalVent::new, EndBlocks.HYDROTHERMAL_VENT)); public static final BlockEntityType FURNACE = registerBlockEntity("furnace", BlockEntityType.Builder.create(EFurnaceBlockEntity::new, getFurnaces())); - public static BlockEntityType registerBlockEntity(String id, BlockEntityType.Builder builder) { + public static BlockEntityType registerBlockEntity(String id, + BlockEntityType.Builder builder) { return Registry.register(Registry.BLOCK_ENTITY_TYPE, BetterEnd.makeID(id), builder.build(null)); } - - public static void register() {} + + public static void register() { + } static Block[] getChests() { List result = Lists.newArrayList(); @@ -66,7 +71,7 @@ public class EndBlockEntities { }); return result.toArray(new Block[] {}); } - + static Block[] getBarrels() { List result = Lists.newArrayList(); EndItems.getModBlocks().forEach((item) -> { @@ -79,7 +84,7 @@ public class EndBlockEntities { }); return result.toArray(new Block[] {}); } - + static Block[] getSigns() { List result = Lists.newArrayList(); EndItems.getModBlocks().forEach((item) -> { @@ -92,14 +97,14 @@ public class EndBlockEntities { }); return result.toArray(new Block[] {}); } - + static Block[] getPedestals() { List result = Lists.newArrayList(); EndItems.getModBlocks().forEach((item) -> { if (item instanceof BlockItem) { Block block = ((BlockItem) item).getBlock(); - if (block instanceof EternalPedestal || - block instanceof InfusionPedestal) return; + if (block instanceof EternalPedestal || block instanceof InfusionPedestal) + return; if (block instanceof PedestalBlock) { result.add(block); } @@ -107,7 +112,7 @@ public class EndBlockEntities { }); return result.toArray(new Block[] {}); } - + static Block[] getFurnaces() { List result = Lists.newArrayList(); EndItems.getModBlocks().forEach((item) -> { diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index ccb6104b..e4bb5310 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -1,13 +1,13 @@ package ru.betterend.registry; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.block.MaterialColor; -import net.minecraft.item.BlockItem; -import net.minecraft.item.Item.Settings; -import net.minecraft.item.LilyPadItem; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item.Properties; +import net.minecraft.world.item.LilyPadItem; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.BetterEnd; import ru.betterend.blocks.*; import ru.betterend.blocks.basis.EndCropBlock; @@ -39,18 +39,23 @@ import ru.betterend.item.material.EndToolMaterial; public class EndBlocks { // Terrain // public static final Block ENDSTONE_DUST = registerBlock("endstone_dust", new EndstoneDustBlock()); - public static final Block END_MYCELIUM = registerBlock("end_mycelium", new EndTerrainBlock(MaterialColor.LIGHT_BLUE)); - public static final Block END_MOSS = registerBlock("end_moss", new EndTerrainBlock(MaterialColor.CYAN)); - public static final Block CHORUS_NYLIUM = registerBlock("chorus_nylium", new EndTerrainBlock(MaterialColor.MAGENTA)); - public static final Block CAVE_MOSS = registerBlock("cave_moss", new TripleTerrainBlock(MaterialColor.PURPLE)); - public static final Block CRYSTAL_MOSS = registerBlock("crystal_moss", new EndTerrainBlock(MaterialColor.PINK)); + public static final Block END_MYCELIUM = registerBlock("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 CHORUS_NYLIUM = registerBlock("chorus_nylium", + new EndTerrainBlock(MaterialColor.COLOR_MAGENTA)); + public static final Block CAVE_MOSS = registerBlock("cave_moss", + new TripleTerrainBlock(MaterialColor.COLOR_PURPLE)); + public static final Block CRYSTAL_MOSS = registerBlock("crystal_moss", + new EndTerrainBlock(MaterialColor.COLOR_PINK)); public static final Block SHADOW_GRASS = registerBlock("shadow_grass", new ShadowGrassBlock()); - public static final Block PINK_MOSS = registerBlock("pink_moss", new EndTerrainBlock(MaterialColor.PINK)); - public static final Block AMBER_MOSS = registerBlock("amber_moss", new EndTerrainBlock(MaterialColor.ORANGE)); - public static final Block JUNGLE_MOSS = registerBlock("jungle_moss", new EndTerrainBlock(MaterialColor.GREEN)); - public static final Block SANGNUM = registerBlock("sangnum", new EndTerrainBlock(MaterialColor.RED)); - public static final Block RUTISCUS = registerBlock("rutiscus", new EndTerrainBlock(MaterialColor.ORANGE)); - + 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)); + public static final Block SANGNUM = registerBlock("sangnum", new EndTerrainBlock(MaterialColor.COLOR_RED)); + public static final Block RUTISCUS = registerBlock("rutiscus", new EndTerrainBlock(MaterialColor.COLOR_ORANGE)); + // Roads // public static final Block END_MYCELIUM_PATH = registerBlock("end_mycelium_path", new EndPathBlock(END_MYCELIUM)); public static final Block END_MOSS_PATH = registerBlock("end_moss_path", new EndPathBlock(END_MOSS)); @@ -63,93 +68,130 @@ public class EndBlocks { public static final Block JUNGLE_MOSS_PATH = registerBlock("jungle_moss_path", new EndPathBlock(JUNGLE_MOSS)); public static final Block SANGNUM_PATH = registerBlock("sangnum_path", new EndPathBlock(SANGNUM)); public static final Block RUTISCUS_PATH = registerBlock("rutiscus_path", new EndPathBlock(RUTISCUS)); - + public static final Block MOSSY_OBSIDIAN = registerBlock("mossy_obsidian", new MossyObsidian()); - public static final Block DRAGON_BONE_BLOCK = registerBlock("dragon_bone_block", new EndPillarBlock(Blocks.BONE_BLOCK)); - public static final Block DRAGON_BONE_STAIRS = registerBlock("dragon_bone_stairs", new EndStairsBlock(DRAGON_BONE_BLOCK)); + public static final Block DRAGON_BONE_BLOCK = registerBlock("dragon_bone_block", + new EndPillarBlock(Blocks.BONE_BLOCK)); + public static final Block DRAGON_BONE_STAIRS = registerBlock("dragon_bone_stairs", + new EndStairsBlock(DRAGON_BONE_BLOCK)); public static final Block DRAGON_BONE_SLAB = registerBlock("dragon_bone_slab", new EndSlabBlock(DRAGON_BONE_BLOCK)); public static final Block MOSSY_DRAGON_BONE = registerBlock("mossy_dragon_bone", new MossyDragonBoneBlock()); - + // Rocks // public static final StoneMaterial FLAVOLITE = new StoneMaterial("flavolite", MaterialColor.SAND); - public static final StoneMaterial VIOLECITE = new StoneMaterial("violecite", MaterialColor.PURPLE); - public static final StoneMaterial SULPHURIC_ROCK = new StoneMaterial("sulphuric_rock", MaterialColor.BROWN); - public static final StoneMaterial VIRID_jADESTONE = new StoneMaterial("virid_jadestone", MaterialColor.GREEN); - public static final StoneMaterial AZURE_jADESTONE = new StoneMaterial("azure_jadestone", MaterialColor.LIGHT_BLUE); - public static final StoneMaterial SANDY_jADESTONE = new StoneMaterial("sandy_jadestone", MaterialColor.YELLOW); + public static final StoneMaterial VIOLECITE = new StoneMaterial("violecite", MaterialColor.COLOR_PURPLE); + public static final StoneMaterial SULPHURIC_ROCK = new StoneMaterial("sulphuric_rock", MaterialColor.COLOR_BROWN); + public static final StoneMaterial VIRID_jADESTONE = new StoneMaterial("virid_jadestone", MaterialColor.COLOR_GREEN); + public static final StoneMaterial AZURE_jADESTONE = new StoneMaterial("azure_jadestone", + MaterialColor.COLOR_LIGHT_BLUE); + public static final StoneMaterial SANDY_jADESTONE = new StoneMaterial("sandy_jadestone", + MaterialColor.COLOR_YELLOW); public static final Block BRIMSTONE = registerBlock("brimstone", new BrimstoneBlock()); public static final Block SULPHUR_CRYSTAL = registerBlock("sulphur_crystal", new SulphurCrystalBlock()); public static final Block MISSING_TILE = registerBlock("missing_tile", new MissingTileBlock()); - + public static final Block FLAVOLITE_RUNED = registerBlock("flavolite_runed", new RunedFlavolite()); - public static final Block FLAVOLITE_RUNED_ETERNAL = registerBlock("flavolite_runed_eternal", new EternalRunedFlavolite()); - - public static final Block ANDESITE_PEDESTAL = registerBlock("andesite_pedestal", new PedestalVanilla(Blocks.ANDESITE)); + public static final Block FLAVOLITE_RUNED_ETERNAL = registerBlock("flavolite_runed_eternal", + new EternalRunedFlavolite()); + + public static final Block ANDESITE_PEDESTAL = registerBlock("andesite_pedestal", + new PedestalVanilla(Blocks.ANDESITE)); public static final Block DIORITE_PEDESTAL = registerBlock("diorite_pedestal", new PedestalVanilla(Blocks.DIORITE)); public static final Block GRANITE_PEDESTAL = registerBlock("granite_pedestal", new PedestalVanilla(Blocks.GRANITE)); - public static final Block QUARTZ_PEDESTAL = registerBlock("quartz_pedestal", new PedestalVanilla(Blocks.QUARTZ_BLOCK)); - public static final Block PURPUR_PEDESTAL = registerBlock("purpur_pedestal", new PedestalVanilla(Blocks.PURPUR_BLOCK)); - + public static final Block QUARTZ_PEDESTAL = registerBlock("quartz_pedestal", + new PedestalVanilla(Blocks.QUARTZ_BLOCK)); + public static final Block PURPUR_PEDESTAL = registerBlock("purpur_pedestal", + new PedestalVanilla(Blocks.PURPUR_BLOCK)); + public static final Block HYDROTHERMAL_VENT = registerBlock("hydrothermal_vent", new HydrothermalVentBlock()); public static final Block VENT_BUBBLE_COLUMN = registerBlockNI("vent_bubble_column", new VentBubbleColumnBlock()); - + public static final Block DENSE_SNOW = registerBlock("dense_snow", new DenseSnowBlock()); public static final Block EMERALD_ICE = registerBlock("emerald_ice", new EmeraldIceBlock()); public static final Block DENSE_EMERALD_ICE = registerBlock("dense_emerald_ice", new DenseEmeraldIceBlock()); public static final Block ANCIENT_EMERALD_ICE = registerBlock("ancient_emerald_ice", new AncientEmeraldIceBlock()); - - public static final Block END_STONE_STALACTITE = registerBlock("end_stone_stalactite", new StalactiteBlock(Blocks.END_STONE)); - public static final Block END_STONE_STALACTITE_CAVEMOSS = registerBlock("end_stone_stalactite_cavemoss", new StalactiteBlock(CAVE_MOSS)); - + + public static final Block END_STONE_STALACTITE = registerBlock("end_stone_stalactite", + new StalactiteBlock(Blocks.END_STONE)); + public static final Block END_STONE_STALACTITE_CAVEMOSS = registerBlock("end_stone_stalactite_cavemoss", + new StalactiteBlock(CAVE_MOSS)); + // Wooden Materials And Trees // - public static final Block MOSSY_GLOWSHROOM_SAPLING = registerBlock("mossy_glowshroom_sapling", new MossyGlowshroomSaplingBlock()); - public static final Block MOSSY_GLOWSHROOM_CAP = registerBlock("mossy_glowshroom_cap", new MossyGlowshroomCapBlock()); - public static final Block MOSSY_GLOWSHROOM_HYMENOPHORE = registerBlock("mossy_glowshroom_hymenophore", new GlowingHymenophoreBlock()); - public static final Block MOSSY_GLOWSHROOM_FUR = registerBlock("mossy_glowshroom_fur", new FurBlock(MOSSY_GLOWSHROOM_SAPLING, 15, 16, true)); - public static final WoodenMaterial MOSSY_GLOWSHROOM = new WoodenMaterial("mossy_glowshroom", MaterialColor.GRAY, MaterialColor.WOOD); - - public static final Block PYTHADENDRON_SAPLING = registerBlock("pythadendron_sapling", new PythadendronSaplingBlock()); - public static final Block PYTHADENDRON_LEAVES = registerBlock("pythadendron_leaves", new EndLeavesBlock(PYTHADENDRON_SAPLING, MaterialColor.MAGENTA)); - public static final WoodenMaterial PYTHADENDRON = new WoodenMaterial("pythadendron", MaterialColor.MAGENTA, MaterialColor.PURPLE); - + public static final Block MOSSY_GLOWSHROOM_SAPLING = registerBlock("mossy_glowshroom_sapling", + new MossyGlowshroomSaplingBlock()); + public static final Block MOSSY_GLOWSHROOM_CAP = registerBlock("mossy_glowshroom_cap", + new MossyGlowshroomCapBlock()); + public static final Block MOSSY_GLOWSHROOM_HYMENOPHORE = registerBlock("mossy_glowshroom_hymenophore", + new GlowingHymenophoreBlock()); + public static final Block MOSSY_GLOWSHROOM_FUR = registerBlock("mossy_glowshroom_fur", + new FurBlock(MOSSY_GLOWSHROOM_SAPLING, 15, 16, true)); + public static final WoodenMaterial MOSSY_GLOWSHROOM = new WoodenMaterial("mossy_glowshroom", + MaterialColor.COLOR_GRAY, MaterialColor.WOOD); + + public static final Block PYTHADENDRON_SAPLING = registerBlock("pythadendron_sapling", + new PythadendronSaplingBlock()); + public static final Block PYTHADENDRON_LEAVES = registerBlock("pythadendron_leaves", + new EndLeavesBlock(PYTHADENDRON_SAPLING, MaterialColor.COLOR_MAGENTA)); + public static final WoodenMaterial PYTHADENDRON = new WoodenMaterial("pythadendron", MaterialColor.COLOR_MAGENTA, + MaterialColor.COLOR_PURPLE); + public static final Block END_LOTUS_SEED = registerBlock("end_lotus_seed", new EndLotusSeedBlock()); public static final Block END_LOTUS_STEM = registerBlock("end_lotus_stem", new EndLotusStemBlock()); public static final Block END_LOTUS_LEAF = registerBlockNI("end_lotus_leaf", new EndLotusLeafBlock()); public static final Block END_LOTUS_FLOWER = registerBlockNI("end_lotus_flower", new EndLotusFlowerBlock()); - public static final WoodenMaterial END_LOTUS = new WoodenMaterial("end_lotus", MaterialColor.LIGHT_BLUE, MaterialColor.CYAN); - + public static final WoodenMaterial END_LOTUS = new WoodenMaterial("end_lotus", MaterialColor.COLOR_LIGHT_BLUE, + MaterialColor.COLOR_CYAN); + public static final Block LACUGROVE_SAPLING = registerBlock("lacugrove_sapling", new LacugroveSaplingBlock()); - public static final Block LACUGROVE_LEAVES = registerBlock("lacugrove_leaves", new EndLeavesBlock(LACUGROVE_SAPLING, MaterialColor.CYAN)); - public static final WoodenMaterial LACUGROVE = new WoodenMaterial("lacugrove", MaterialColor.BROWN, MaterialColor.YELLOW); - + public static final Block LACUGROVE_LEAVES = registerBlock("lacugrove_leaves", + new EndLeavesBlock(LACUGROVE_SAPLING, MaterialColor.COLOR_CYAN)); + public static final WoodenMaterial LACUGROVE = new WoodenMaterial("lacugrove", MaterialColor.COLOR_BROWN, + MaterialColor.COLOR_YELLOW); + public static final Block DRAGON_TREE_SAPLING = registerBlock("dragon_tree_sapling", new DragonTreeSaplingBlock()); - public static final Block DRAGON_TREE_LEAVES = registerBlock("dragon_tree_leaves", new EndLeavesBlock(DRAGON_TREE_SAPLING, MaterialColor.MAGENTA)); - public static final WoodenMaterial DRAGON_TREE = new WoodenMaterial("dragon_tree", MaterialColor.BLACK, MaterialColor.MAGENTA); - + public static final Block DRAGON_TREE_LEAVES = registerBlock("dragon_tree_leaves", + new EndLeavesBlock(DRAGON_TREE_SAPLING, MaterialColor.COLOR_MAGENTA)); + public static final WoodenMaterial DRAGON_TREE = new WoodenMaterial("dragon_tree", MaterialColor.COLOR_BLACK, + MaterialColor.COLOR_MAGENTA); + public static final Block TENANEA_SAPLING = registerBlock("tenanea_sapling", new TenaneaSaplingBlock()); - public static final Block TENANEA_LEAVES = registerBlock("tenanea_leaves", new EndLeavesBlock(TENANEA_SAPLING, MaterialColor.PINK)); + public static final Block TENANEA_LEAVES = registerBlock("tenanea_leaves", + new EndLeavesBlock(TENANEA_SAPLING, MaterialColor.COLOR_PINK)); public static final Block TENANEA_FLOWERS = registerBlock("tenanea_flowers", new TenaneaFlowersBlock()); - public static final Block TENANEA_OUTER_LEAVES = registerBlock("tenanea_outer_leaves", new FurBlock(TENANEA_SAPLING, 32)); - public static final WoodenMaterial TENANEA = new WoodenMaterial("tenanea", MaterialColor.BROWN, MaterialColor.PINK); - + public static final Block TENANEA_OUTER_LEAVES = registerBlock("tenanea_outer_leaves", + new FurBlock(TENANEA_SAPLING, 32)); + public static final WoodenMaterial TENANEA = new WoodenMaterial("tenanea", MaterialColor.COLOR_BROWN, + MaterialColor.COLOR_PINK); + public static final Block HELIX_TREE_SAPLING = registerBlock("helix_tree_sapling", new HelixTreeSaplingBlock()); public static final Block HELIX_TREE_LEAVES = registerBlock("helix_tree_leaves", new HelixTreeLeavesBlock()); - public static final WoodenMaterial HELIX_TREE = new WoodenMaterial("helix_tree", MaterialColor.GRAY, MaterialColor.ORANGE); - - public static final Block UMBRELLA_TREE_SAPLING = registerBlock("umbrella_tree_sapling", new UmbrellaTreeSaplingBlock()); - public static final Block UMBRELLA_TREE_MEMBRANE = registerBlock("umbrella_tree_membrane", new UmbrellaTreeMembraneBlock()); - public static final Block UMBRELLA_TREE_CLUSTER = registerBlock("umbrella_tree_cluster", new UmbrellaTreeClusterBlock()); - public static final Block UMBRELLA_TREE_CLUSTER_EMPTY = registerBlock("umbrella_tree_cluster_empty", new UmbrellaTreeClusterEmptyBlock()); - public static final WoodenMaterial UMBRELLA_TREE = new WoodenMaterial("umbrella_tree", MaterialColor.BLUE, MaterialColor.GREEN); - - public static final Block JELLYSHROOM_CAP_PURPLE = registerBlock("jellyshroom_cap_purple", new JellyshroomCapBlock(217, 142, 255, 164, 0, 255)); - public static final WoodenMaterial JELLYSHROOM = new WoodenMaterial("jellyshroom", MaterialColor.PURPLE, MaterialColor.LIGHT_BLUE); - + public static final WoodenMaterial HELIX_TREE = new WoodenMaterial("helix_tree", MaterialColor.COLOR_GRAY, + MaterialColor.COLOR_ORANGE); + + public static final Block UMBRELLA_TREE_SAPLING = registerBlock("umbrella_tree_sapling", + new UmbrellaTreeSaplingBlock()); + public static final Block UMBRELLA_TREE_MEMBRANE = registerBlock("umbrella_tree_membrane", + new UmbrellaTreeMembraneBlock()); + public static final Block UMBRELLA_TREE_CLUSTER = registerBlock("umbrella_tree_cluster", + new UmbrellaTreeClusterBlock()); + public static final Block UMBRELLA_TREE_CLUSTER_EMPTY = registerBlock("umbrella_tree_cluster_empty", + new UmbrellaTreeClusterEmptyBlock()); + public static final WoodenMaterial UMBRELLA_TREE = new WoodenMaterial("umbrella_tree", MaterialColor.COLOR_BLUE, + MaterialColor.COLOR_GREEN); + + public static final Block JELLYSHROOM_CAP_PURPLE = registerBlock("jellyshroom_cap_purple", + new JellyshroomCapBlock(217, 142, 255, 164, 0, 255)); + public static final WoodenMaterial JELLYSHROOM = new WoodenMaterial("jellyshroom", MaterialColor.COLOR_PURPLE, + MaterialColor.COLOR_LIGHT_BLUE); + public static final Block LUCERNIA_SAPLING = registerBlock("lucernia_sapling", new TenaneaSaplingBlock()); - public static final Block LUCERNIA_LEAVES = registerBlock("lucernia_leaves", new EndLeavesBlock(LUCERNIA_SAPLING, MaterialColor.ORANGE)); - public static final Block LUCERNIA_OUTER_LEAVES = registerBlock("lucernia_outer_leaves", new FurBlock(LUCERNIA_SAPLING, 32)); - public static final WoodenMaterial LUCERNIA = new WoodenMaterial("lucernia", MaterialColor.ORANGE, MaterialColor.ORANGE); - + public static final Block LUCERNIA_LEAVES = registerBlock("lucernia_leaves", + new EndLeavesBlock(LUCERNIA_SAPLING, MaterialColor.COLOR_ORANGE)); + public static final Block LUCERNIA_OUTER_LEAVES = registerBlock("lucernia_outer_leaves", + new FurBlock(LUCERNIA_SAPLING, 32)); + public static final WoodenMaterial LUCERNIA = new WoodenMaterial("lucernia", MaterialColor.COLOR_ORANGE, + MaterialColor.COLOR_ORANGE); + // Small Plants // public static final Block UMBRELLA_MOSS = registerBlock("umbrella_moss", new UmbrellaMossBlock()); public static final Block UMBRELLA_MOSS_TALL = registerBlock("umbrella_moss_tall", new UmbrellaMossTallBlock()); @@ -160,59 +202,75 @@ public class EndBlocks { public static final Block SHADOW_PLANT = registerBlock("shadow_plant", new TerrainPlantBlock(SHADOW_GRASS)); public static final Block BUSHY_GRASS = registerBlock("bushy_grass", new TerrainPlantBlock(PINK_MOSS)); public static final Block AMBER_GRASS = registerBlock("amber_grass", new TerrainPlantBlock(AMBER_MOSS)); - public static final Block TWISTED_UMBRELLA_MOSS = registerBlock("twisted_umbrella_moss", new TwistedUmbrellaMossBlock()); - public static final Block TWISTED_UMBRELLA_MOSS_TALL = registerBlock("twisted_umbrella_moss_tall", new TwistedUmbrellaMossTallBlock()); + public static final Block TWISTED_UMBRELLA_MOSS = registerBlock("twisted_umbrella_moss", + new TwistedUmbrellaMossBlock()); + public static final Block TWISTED_UMBRELLA_MOSS_TALL = registerBlock("twisted_umbrella_moss_tall", + new TwistedUmbrellaMossTallBlock()); public static final Block JUNGLE_GRASS = registerBlock("jungle_grass", new TerrainPlantBlock(JUNGLE_MOSS)); public static final Block BLOOMING_COOKSONIA = registerBlock("blooming_cooksonia", new TerrainPlantBlock(END_MOSS)); public static final Block SALTEAGO = registerBlock("salteago", new TerrainPlantBlock(END_MOSS)); public static final Block VAIOLUSH_FERN = registerBlock("vaiolush_fern", new TerrainPlantBlock(END_MOSS)); public static final Block FRACTURN = registerBlock("fracturn", new TerrainPlantBlock(END_MOSS)); - public static final Block CLAWFERN = registerBlock("clawfern", new TerrainPlantBlock(SANGNUM, MOSSY_OBSIDIAN, MOSSY_DRAGON_BONE)); - public static final Block GLOBULAGUS = registerBlock("globulagus", new TerrainPlantBlock(SANGNUM, MOSSY_OBSIDIAN, MOSSY_DRAGON_BONE)); + public static final Block CLAWFERN = registerBlock("clawfern", + new TerrainPlantBlock(SANGNUM, MOSSY_OBSIDIAN, MOSSY_DRAGON_BONE)); + public static final Block GLOBULAGUS = registerBlock("globulagus", + new TerrainPlantBlock(SANGNUM, MOSSY_OBSIDIAN, MOSSY_DRAGON_BONE)); public static final Block ORANGO = registerBlock("orango", new TerrainPlantBlock(RUTISCUS)); public static final Block AERIDIUM = registerBlock("aeridium", new TerrainPlantBlock(RUTISCUS)); public static final Block LUTEBUS = registerBlock("lutebus", new TerrainPlantBlock(RUTISCUS)); public static final Block LAMELLARIUM = registerBlock("lamellarium", new TerrainPlantBlock(RUTISCUS)); - + public static final Block BLUE_VINE_SEED = registerBlock("blue_vine_seed", new BlueVineSeedBlock()); public static final Block BLUE_VINE = registerBlockNI("blue_vine", new BlueVineBlock()); public static final Block BLUE_VINE_LANTERN = registerBlock("blue_vine_lantern", new BlueVineLanternBlock()); - public static final Block BLUE_VINE_FUR = registerBlock("blue_vine_fur", new FurBlock(BLUE_VINE_SEED, 15, 3, false)); - + public static final Block BLUE_VINE_FUR = registerBlock("blue_vine_fur", + new FurBlock(BLUE_VINE_SEED, 15, 3, false)); + public static final Block LANCELEAF_SEED = registerBlock("lanceleaf_seed", new LanceleafSeedBlock()); public static final Block LANCELEAF = registerBlockNI("lanceleaf", new LanceleafBlock()); - + public static final Block GLOWING_PILLAR_SEED = registerBlock("glowing_pillar_seed", new GlowingPillarSeedBlock()); - public static final Block GLOWING_PILLAR_ROOTS = registerBlockNI("glowing_pillar_roots", new GlowingPillarRootsBlock()); - public static final Block GLOWING_PILLAR_LUMINOPHOR = registerBlock("glowing_pillar_luminophor", new GlowingPillarLuminophorBlock()); - public static final Block GLOWING_PILLAR_LEAVES = registerBlock("glowing_pillar_leaves", new FurBlock(GLOWING_PILLAR_SEED, 15, 3, false)); - + public static final Block GLOWING_PILLAR_ROOTS = registerBlockNI("glowing_pillar_roots", + new GlowingPillarRootsBlock()); + public static final Block GLOWING_PILLAR_LUMINOPHOR = registerBlock("glowing_pillar_luminophor", + new GlowingPillarLuminophorBlock()); + public static final Block GLOWING_PILLAR_LEAVES = registerBlock("glowing_pillar_leaves", + new FurBlock(GLOWING_PILLAR_SEED, 15, 3, false)); + public static final Block SMALL_JELLYSHROOM = registerBlock("small_jellyshroom", new SmallJellyshroomBlock()); public static final Block BOLUX_MUSHROOM = registerBlock("bolux_mushroom", new BoluxMushroomBlock()); - + public static final Block LUMECORN_SEED = registerBlock("lumecorn_seed", new LumecornSeedBlock()); public static final Block LUMECORN = registerBlockNI("lumecorn", new LumecornBlock()); - - public static final Block SMALL_AMARANITA_MUSHROOM = registerBlock("small_amaranita_mushroom", new SmallAmaranitaBlock()); - public static final Block LARGE_AMARANITA_MUSHROOM = registerBlockNI("large_amaranita_mushroom", new LargeAmaranitaBlock()); + + public static final Block SMALL_AMARANITA_MUSHROOM = registerBlock("small_amaranita_mushroom", + new SmallAmaranitaBlock()); + public static final Block LARGE_AMARANITA_MUSHROOM = registerBlockNI("large_amaranita_mushroom", + new LargeAmaranitaBlock()); public static final Block AMARANITA_STEM = registerBlock("amaranita_stem", new AmaranitaStemBlock()); public static final Block AMARANITA_HYPHAE = registerBlock("amaranita_hyphae", new AmaranitaStemBlock()); - public static final Block AMARANITA_HYMENOPHORE = registerBlock("amaranita_hymenophore", new AmaranitaHymenophoreBlock()); + public static final Block AMARANITA_HYMENOPHORE = registerBlock("amaranita_hymenophore", + new AmaranitaHymenophoreBlock()); public static final Block AMARANITA_LANTERN = registerBlock("amaranita_lantern", new GlowingHymenophoreBlock()); - public static final Block AMARANITA_FUR = registerBlock("amaranita_fur", new FurBlock(MOSSY_GLOWSHROOM_SAPLING, 15, 4, true)); + public static final Block AMARANITA_FUR = registerBlock("amaranita_fur", + new FurBlock(MOSSY_GLOWSHROOM_SAPLING, 15, 4, true)); public static final Block AMARANITA_CAP = registerBlock("amaranita_cap", new AmaranitaCapBlock()); - + public static final Block NEON_CACTUS = registerBlock("neon_cactus", new NeonCactusBlock()); - + // Crops public static final Block SHADOW_BERRY = registerBlock("shadow_berry", new ShadowBerryBlock()); - public static final Block BLOSSOM_BERRY = registerBlock("blossom_berry_seed", new EndCropBlock(EndItems.BLOSSOM_BERRY, PINK_MOSS)); - public static final Block AMBER_ROOT = registerBlock("amber_root_seed", new EndCropBlock(EndItems.AMBER_ROOT_RAW, AMBER_MOSS)); - public static final Block CHORUS_MUSHROOM = registerBlock("chorus_mushroom_seed", new EndCropBlock(EndItems.CHORUS_MUSHROOM_RAW, CHORUS_NYLIUM)); - public static final Block PEARLBERRY = registerBlock("pearlberry_seed", new EndCropBlock(EndItems.BLOSSOM_BERRY, END_MOSS, END_MYCELIUM)); + public static final Block BLOSSOM_BERRY = registerBlock("blossom_berry_seed", + new EndCropBlock(EndItems.BLOSSOM_BERRY, PINK_MOSS)); + public static final Block AMBER_ROOT = registerBlock("amber_root_seed", + new EndCropBlock(EndItems.AMBER_ROOT_RAW, AMBER_MOSS)); + public static final Block CHORUS_MUSHROOM = registerBlock("chorus_mushroom_seed", + new EndCropBlock(EndItems.CHORUS_MUSHROOM_RAW, CHORUS_NYLIUM)); + public static final Block PEARLBERRY = registerBlock("pearlberry_seed", + new EndCropBlock(EndItems.BLOSSOM_BERRY, END_MOSS, END_MYCELIUM)); public static final Block CAVE_PUMPKIN_SEED = registerBlock("cave_pumpkin_seed", new CavePumpkinVineBlock()); public static final Block CAVE_PUMPKIN = registerBlock("cave_pumpkin", new CavePumpkinBlock()); - + // Water plants public static final Block BUBBLE_CORAL = registerBlock("bubble_coral", new BubbleCoralBlock()); public static final Block MENGER_SPONGE = registerBlock("menger_sponge", new MengerSpongeBlock()); @@ -223,24 +281,26 @@ public class EndBlocks { public static final Block CHARNIA_LIGHT_BLUE = registerBlock("charnia_light_blue", new CharniaBlock()); public static final Block CHARNIA_CYAN = registerBlock("charnia_cyan", new CharniaBlock()); public static final Block CHARNIA_GREEN = registerBlock("charnia_green", new CharniaBlock()); - + public static final Block END_LILY = registerBlockNI("end_lily", new EndLilyBlock()); public static final Block END_LILY_SEED = registerBlock("end_lily_seed", new EndLilySeedBlock()); - - public static final Block HYDRALUX_SAPLING = registerBlock("hydralux_sapling", new HydraluxSaplingBlock()); + + public static final Block HYDRALUX_SAPLING = registerBlock("hydralux_sapling", new HydraluxSaplingBlock()); public static final Block HYDRALUX = registerBlockNI("hydralux", new HydraluxBlock()); public static final Block HYDRALUX_PETAL_BLOCK = registerBlock("hydralux_petal_block", new HydraluxPetalBlock()); - public static final ColoredMaterial HYDRALUX_PETAL_BLOCK_COLORED = new ColoredMaterial(HydraluxPetalColoredBlock::new, HYDRALUX_PETAL_BLOCK, true); - + public static final ColoredMaterial HYDRALUX_PETAL_BLOCK_COLORED = new ColoredMaterial( + HydraluxPetalColoredBlock::new, HYDRALUX_PETAL_BLOCK, true); + public static final Block POND_ANEMONE = registerBlock("pond_anemone", new PondAnemoneBlock()); - + public static final Block FLAMAEA = registerBlock("flamaea", new FlamaeaBlock()); - - public static final Block CAVE_BUSH = registerBlock("cave_bush", new SimpleLeavesBlock(MaterialColor.MAGENTA)); - + + public static final Block CAVE_BUSH = registerBlock("cave_bush", + new SimpleLeavesBlock(MaterialColor.COLOR_MAGENTA)); + public static final Block MURKWEED = registerBlock("murkweed", new MurkweedBlock()); public static final Block NEEDLEGRASS = registerBlock("needlegrass", new NeedlegrassBlock()); - + // Wall Plants // public static final Block PURPLE_POLYPORE = registerBlock("purple_polypore", new WallMushroomBlock(13)); public static final Block AURANT_POLYPORE = registerBlock("aurant_polypore", new WallMushroomBlock(13)); @@ -251,7 +311,7 @@ public class EndBlocks { public static final Block BULB_MOSS = registerBlock("bulb_moss", new EndWallPlantBlock(12)); public static final Block JUNGLE_FERN = registerBlock("jungle_fern", new EndWallPlantBlock()); public static final Block RUSCUS = registerBlock("ruscus", new EndWallPlantBlock()); - + // Vines // public static final Block DENSE_VINE = registerBlock("dense_vine", new VineBlock(15, true)); public static final Block TWISTED_VINE = registerBlock("twisted_vine", new VineBlock()); @@ -263,58 +323,72 @@ public class EndBlocks { public static final Block FILALUX = registerBlock("filalux", new FilaluxBlock()); public static final Block FILALUX_WINGS = registerBlock("filalux_wings", new FilaluxWingsBlock()); public static final Block FILALUX_LANTERN = registerBlock("filalux_lantern", new FilaluxLanternBlock()); - + // Mob-Related public static final Block SILK_MOTH_NEST = registerBlock("silk_moth_nest", new SilkMothNestBlock()); public static final Block SILK_MOTH_HIVE = registerBlock("silk_moth_hive", new SilkMothHiveBlock()); - + // Ores // public static final Block ENDER_ORE = registerBlock("ender_ore", new EndOreBlock(EndItems.ENDER_SHARD, 1, 3, 5)); public static final Block AMBER_ORE = registerBlock("amber_ore", new EndOreBlock(EndItems.RAW_AMBER, 1, 2, 4)); - + // Materials // - public static final MetalMaterial THALLASIUM = MetalMaterial.makeNormal("thallasium", MaterialColor.BLUE, EndToolMaterial.THALLASIUM, EndArmorMaterial.THALLASIUM); - public static final MetalMaterial TERMINITE = MetalMaterial.makeOreless("terminite", MaterialColor.field_25708, 7F, 9F, EndToolMaterial.TERMINITE, EndArmorMaterial.TERMINITE); + public static final MetalMaterial THALLASIUM = MetalMaterial.makeNormal("thallasium", MaterialColor.COLOR_BLUE, + EndToolMaterial.THALLASIUM, EndArmorMaterial.THALLASIUM); + public static final MetalMaterial TERMINITE = MetalMaterial.makeOreless("terminite", MaterialColor.field_25708, 7F, + 9F, EndToolMaterial.TERMINITE, EndArmorMaterial.TERMINITE); public static final Block AETERNIUM_BLOCK = registerBlock("aeternium_block", new AeterniumBlock()); public static final Block CHARCOAL_BLOCK = registerBlock("charcoal_block", new CharcoalBlock()); - + public static final Block ENDER_BLOCK = registerBlock("ender_block", new EnderBlock()); public static final Block AURORA_CRYSTAL = registerBlock("aurora_crystal", new AuroraCrystalBlock()); public static final Block AMBER_BLOCK = registerBlock("amber_block", new AmberBlock()); public static final Block SMARAGDANT_CRYSTAL = registerBlock("smaragdant_crystal", new SmaragdantCrystalBlock()); - public static final CrystalSubblocksMaterial SMARAGDANT_SUBBLOCKS = new CrystalSubblocksMaterial("smaragdant_crystal", SMARAGDANT_CRYSTAL); - public static final Block SMARAGDANT_CRYSTAL_SHARD = registerBlock("smaragdant_crystal_shard", new SmaragdantCrystalShardBlock()); - + public static final CrystalSubblocksMaterial SMARAGDANT_SUBBLOCKS = new CrystalSubblocksMaterial( + "smaragdant_crystal", SMARAGDANT_CRYSTAL); + public static final Block SMARAGDANT_CRYSTAL_SHARD = registerBlock("smaragdant_crystal_shard", + new SmaragdantCrystalShardBlock()); + public static final Block RESPAWN_OBELISK = registerBlock("respawn_obelisk", new RespawnObeliskBlock()); - + // Lanterns - public static final Block ANDESITE_LANTERN = registerBlock("andesite_lantern", new StoneLanternBlock(Blocks.ANDESITE)); + public static final Block ANDESITE_LANTERN = registerBlock("andesite_lantern", + new StoneLanternBlock(Blocks.ANDESITE)); public static final Block DIORITE_LANTERN = registerBlock("diorite_lantern", new StoneLanternBlock(Blocks.DIORITE)); public static final Block GRANITE_LANTERN = registerBlock("granite_lantern", new StoneLanternBlock(Blocks.GRANITE)); - public static final Block QUARTZ_LANTERN = registerBlock("quartz_lantern", new StoneLanternBlock(Blocks.QUARTZ_BLOCK)); - public static final Block PURPUR_LANTERN = registerBlock("purpur_lantern", new StoneLanternBlock(Blocks.PURPUR_BLOCK)); - public static final Block END_STONE_LANTERN = registerBlock("end_stone_lantern", new StoneLanternBlock(Blocks.END_STONE)); - public static final Block BLACKSTONE_LANTERN = registerBlock("blackstone_lantern", new StoneLanternBlock(Blocks.BLACKSTONE)); - + public static final Block QUARTZ_LANTERN = registerBlock("quartz_lantern", + new StoneLanternBlock(Blocks.QUARTZ_BLOCK)); + public static final Block PURPUR_LANTERN = registerBlock("purpur_lantern", + new StoneLanternBlock(Blocks.PURPUR_BLOCK)); + public static final Block END_STONE_LANTERN = registerBlock("end_stone_lantern", + new StoneLanternBlock(Blocks.END_STONE)); + public static final Block BLACKSTONE_LANTERN = registerBlock("blackstone_lantern", + new StoneLanternBlock(Blocks.BLACKSTONE)); + public static final Block IRON_BULB_LANTERN = registerBlock("iron_bulb_lantern", new BulbVineLanternBlock()); - public static final ColoredMaterial IRON_BULB_LANTERN_COLORED = new ColoredMaterial(BulbVineLanternColoredBlock::new, IRON_BULB_LANTERN, false); - - public static final Block IRON_CHANDELIER = EndBlocks.registerBlock("iron_chandelier", new ChandelierBlock(Blocks.GOLD_BLOCK)); - public static final Block GOLD_CHANDELIER = EndBlocks.registerBlock("gold_chandelier", new ChandelierBlock(Blocks.GOLD_BLOCK)); - + public static final ColoredMaterial IRON_BULB_LANTERN_COLORED = new ColoredMaterial( + BulbVineLanternColoredBlock::new, IRON_BULB_LANTERN, false); + + public static final Block IRON_CHANDELIER = EndBlocks.registerBlock("iron_chandelier", + new ChandelierBlock(Blocks.GOLD_BLOCK)); + public static final Block GOLD_CHANDELIER = EndBlocks.registerBlock("gold_chandelier", + new ChandelierBlock(Blocks.GOLD_BLOCK)); + // Blocks With Entity // - public static final Block END_STONE_FURNACE = registerBlock("end_stone_furnace", new EndFurnaceBlock(Blocks.END_STONE)); + public static final Block END_STONE_FURNACE = registerBlock("end_stone_furnace", + new EndFurnaceBlock(Blocks.END_STONE)); public static final Block END_STONE_SMELTER = registerBlock("end_stone_smelter", new EndStoneSmelter()); public static final Block ETERNAL_PEDESTAL = registerBlock("eternal_pedestal", new EternalPedestal()); public static final Block INFUSION_PEDESTAL = registerBlock("infusion_pedestal", new InfusionPedestal()); public static final Block AETERNIUM_ANVIL = registerBlock("aeternium_anvil", new AeterniumAnvil()); - + // Technical public static final Block END_PORTAL_BLOCK = registerBlockNI("end_portal_block", new EndPortalBlock()); - - public static void register() {} - - public static Block registerBlock(Identifier id, Block block) { + + public static void register() { + } + + public static Block registerBlock(ResourceLocation id, Block block) { if (!Configs.BLOCK_CONFIG.getBooleanRoot(id.getPath(), true)) { return block; } @@ -326,20 +400,19 @@ public class EndBlocks { maxCount = item.getStackSize(); placeOnWater = item.canPlaceOnWater(); } - Settings item = EndItems.makeBlockItemSettings().maxCount(maxCount); + Properties item = EndItems.makeBlockItemSettings().maxCount(maxCount); if (placeOnWater) { EndItems.registerBlockItem(id, new LilyPadItem(block, item)); - } - else { + } else { EndItems.registerBlockItem(id, new BlockItem(block, item)); } return block; } - + public static Block registerBlock(String name, Block block) { return registerBlock(BetterEnd.makeID(name), block); } - + public static Block registerBlockNI(String name, Block block) { return Registry.register(Registry.BLOCK, BetterEnd.makeID(name), block); } diff --git a/src/main/java/ru/betterend/registry/EndEntities.java b/src/main/java/ru/betterend/registry/EndEntities.java index 9863bd9b..a7864691 100644 --- a/src/main/java/ru/betterend/registry/EndEntities.java +++ b/src/main/java/ru/betterend/registry/EndEntities.java @@ -2,15 +2,15 @@ package ru.betterend.registry; import net.fabricmc.fabric.api.object.builder.v1.entity.FabricDefaultAttributeRegistry; import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityDimensions; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.EntityType.EntityFactory; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.SpawnGroup; -import net.minecraft.entity.attribute.DefaultAttributeContainer.Builder; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EntityType.EntityFactory; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.SpawnGroup; +import net.minecraft.world.entity.attribute.DefaultAttributeContainer.Builder; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; import ru.betterend.entity.CubozoaEntity; @@ -23,13 +23,25 @@ import ru.betterend.util.MHelper; import ru.betterend.util.SpawnHelper; public class EndEntities { - public static final EntityType DRAGONFLY = register("dragonfly", SpawnGroup.AMBIENT, 0.6F, 0.5F, DragonflyEntity::new, DragonflyEntity.createMobAttributes(), true, MHelper.color(32, 42, 176), MHelper.color(115, 225, 249)); - public static final EntityType END_SLIME = register("end_slime", SpawnGroup.MONSTER, 2F, 2F, EndSlimeEntity::new, EndSlimeEntity.createMobAttributes(), false, MHelper.color(28, 28, 28), MHelper.color(99, 11, 99)); - public static final EntityType END_FISH = register("end_fish", SpawnGroup.WATER_AMBIENT, 0.5F, 0.5F, EndFishEntity::new, EndFishEntity.createMobAttributes(), true, MHelper.color(3, 50, 76), MHelper.color(120, 206, 255)); - public static final EntityType SHADOW_WALKER = register("shadow_walker", SpawnGroup.MONSTER, 0.6F, 1.95F, ShadowWalkerEntity::new, ShadowWalkerEntity.createMobAttributes(), true, MHelper.color(30, 30, 30), MHelper.color(5, 5, 5)); - public static final EntityType CUBOZOA = register("cubozoa", SpawnGroup.WATER_AMBIENT, 0.6F, 1F, CubozoaEntity::new, CubozoaEntity.createMobAttributes(), true, MHelper.color(151, 77, 181), MHelper.color(93, 176, 238)); - public static final EntityType SILK_MOTH = register("silk_moth", SpawnGroup.AMBIENT, 0.6F, 0.6F, SilkMothEntity::new, SilkMothEntity.createMobAttributes(), true, MHelper.color(198, 138, 204), MHelper.color(242, 220, 236)); - + public static final EntityType DRAGONFLY = register("dragonfly", SpawnGroup.AMBIENT, 0.6F, 0.5F, + DragonflyEntity::new, DragonflyEntity.createMobAttributes(), true, MHelper.color(32, 42, 176), + MHelper.color(115, 225, 249)); + public static final EntityType END_SLIME = register("end_slime", SpawnGroup.MONSTER, 2F, 2F, + EndSlimeEntity::new, EndSlimeEntity.createMobAttributes(), false, MHelper.color(28, 28, 28), + MHelper.color(99, 11, 99)); + public static final EntityType END_FISH = register("end_fish", SpawnGroup.WATER_AMBIENT, 0.5F, 0.5F, + EndFishEntity::new, EndFishEntity.createMobAttributes(), true, MHelper.color(3, 50, 76), + MHelper.color(120, 206, 255)); + public static final EntityType SHADOW_WALKER = register("shadow_walker", SpawnGroup.MONSTER, + 0.6F, 1.95F, ShadowWalkerEntity::new, ShadowWalkerEntity.createMobAttributes(), true, + MHelper.color(30, 30, 30), MHelper.color(5, 5, 5)); + public static final EntityType CUBOZOA = register("cubozoa", SpawnGroup.WATER_AMBIENT, 0.6F, 1F, + CubozoaEntity::new, CubozoaEntity.createMobAttributes(), true, MHelper.color(151, 77, 181), + MHelper.color(93, 176, 238)); + public static final EntityType SILK_MOTH = register("silk_moth", SpawnGroup.AMBIENT, 0.6F, 0.6F, + SilkMothEntity::new, SilkMothEntity.createMobAttributes(), true, MHelper.color(198, 138, 204), + MHelper.color(242, 220, 236)); + public static void register() { SpawnHelper.restrictionAir(DRAGONFLY, DragonflyEntity::canSpawn); SpawnHelper.restrictionLand(END_SLIME, EndSlimeEntity::canSpawn); @@ -38,19 +50,25 @@ public class EndEntities { SpawnHelper.restrictionWater(CUBOZOA, CubozoaEntity::canSpawn); SpawnHelper.restrictionAir(SILK_MOTH, SilkMothEntity::canSpawn); } - - protected static EntityType register(String name, SpawnGroup group, float width, float height, EntityFactory entity) { - Identifier id = BetterEnd.makeID(name); - EntityType type = FabricEntityTypeBuilder.create(group, entity).dimensions(EntityDimensions.fixed(width, height)).build(); + + protected static EntityType register(String name, SpawnGroup group, float width, float height, + EntityFactory entity) { + ResourceLocation id = BetterEnd.makeID(name); + EntityType type = FabricEntityTypeBuilder.create(group, entity) + .dimensions(EntityDimensions.fixed(width, height)).build(); if (Configs.ENTITY_CONFIG.getBooleanRoot(id.getPath(), true)) { return Registry.register(Registry.ENTITY_TYPE, id, type); } return type; } - - private static EntityType register(String name, SpawnGroup group, float width, float height, EntityFactory entity, Builder attributes, boolean fixedSize, int eggColor, int dotsColor) { - Identifier id = BetterEnd.makeID(name); - EntityType type = FabricEntityTypeBuilder.create(group, entity).dimensions(fixedSize ? EntityDimensions.fixed(width, height) : EntityDimensions.changing(width, height)).build(); + + private static EntityType register(String name, SpawnGroup group, float width, + float height, EntityFactory entity, Builder attributes, boolean fixedSize, int eggColor, int dotsColor) { + ResourceLocation id = BetterEnd.makeID(name); + EntityType type = FabricEntityTypeBuilder.create(group, entity) + .dimensions( + fixedSize ? EntityDimensions.fixed(width, height) : EntityDimensions.changing(width, height)) + .build(); if (Configs.ENTITY_CONFIG.getBooleanRoot(id.getPath(), true)) { FabricDefaultAttributeRegistry.register(type, attributes); EndItems.registerEgg("spawn_egg_" + name, type, eggColor, dotsColor); diff --git a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java index 35d2a367..5719b6f8 100644 --- a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java +++ b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java @@ -5,7 +5,7 @@ import java.util.function.Function; import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry; import net.minecraft.client.render.entity.EntityRenderDispatcher; import net.minecraft.client.render.entity.MobEntityRenderer; -import net.minecraft.entity.EntityType; +import net.minecraft.world.entity.EntityType; import ru.betterend.entity.render.RendererEntityCubozoa; import ru.betterend.entity.render.RendererEntityDragonfly; import ru.betterend.entity.render.RendererEntityEndFish; @@ -14,7 +14,7 @@ import ru.betterend.entity.render.RendererEntityShadowWalker; import ru.betterend.entity.render.SilkMothEntityRenderer; public class EndEntitiesRenders { - + public static void register() { register(EndEntities.DRAGONFLY, RendererEntityDragonfly::new); register(EndEntities.END_SLIME, RendererEntityEndSlime::new); @@ -23,7 +23,7 @@ public class EndEntitiesRenders { register(EndEntities.CUBOZOA, RendererEntityCubozoa::new); register(EndEntities.SILK_MOTH, SilkMothEntityRenderer::new); } - + private static void register(EntityType type, Function> render) { EntityRendererRegistry.INSTANCE.register(type, (entityRenderDispatcher, context) -> { return render.apply(entityRenderDispatcher); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index cc003815..ffb8ef58 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -5,8 +5,8 @@ import java.util.function.Supplier; import com.google.common.collect.Lists; -import net.minecraft.block.Blocks; -import net.minecraft.util.Identifier; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.GenerationStep; import net.minecraft.world.gen.feature.ConfiguredFeature; @@ -74,165 +74,258 @@ import ru.betterend.world.generator.GeneratorOptions; public class EndFeatures { // Trees // - public static final EndFeature MOSSY_GLOWSHROOM = new EndFeature("mossy_glowshroom", new MossyGlowshroomFeature(), 3); - public static final EndFeature PYTHADENDRON_TREE = new EndFeature("pythadendron_tree", new PythadendronTreeFeature(), 2); + public static final EndFeature MOSSY_GLOWSHROOM = new EndFeature("mossy_glowshroom", new MossyGlowshroomFeature(), + 3); + public static final EndFeature PYTHADENDRON_TREE = new EndFeature("pythadendron_tree", + new PythadendronTreeFeature(), 2); public static final EndFeature LACUGROVE = new EndFeature("lacugrove", new LacugroveFeature(), 4); public static final EndFeature DRAGON_TREE = new EndFeature("dragon_tree", new DragonTreeFeature(), 3); public static final EndFeature TENANEA = new EndFeature("tenanea", new TenaneaFeature(), 3); public static final EndFeature HELIX_TREE = new EndFeature("helix_tree", new HelixTreeFeature(), 2); public static final EndFeature UMBRELLA_TREE = new EndFeature("umbrella_tree", new UmbrellaTreeFeature(), 4); public static final EndFeature JELLYSHROOM = new EndFeature("jellyshroom", new JellyshroomFeature(), 3); - public static final EndFeature GIGANTIC_AMARANITA = new EndFeature("gigantic_amaranita", new GiganticAmaranitaFeature(), 1); + public static final EndFeature GIGANTIC_AMARANITA = new EndFeature("gigantic_amaranita", + new GiganticAmaranitaFeature(), 1); public static final EndFeature LUCERNIA = new EndFeature("lucernia", new LucerniaFeature(), 3); - + // Bushes // - public static final EndFeature PYTHADENDRON_BUSH = new EndFeature("pythadendron_bush", new BushFeature(EndBlocks.PYTHADENDRON_LEAVES, EndBlocks.PYTHADENDRON.bark), 4); - public static final EndFeature DRAGON_TREE_BUSH = new EndFeature("dragon_tree_bush", new BushFeature(EndBlocks.DRAGON_TREE_LEAVES, EndBlocks.DRAGON_TREE.bark), 15); + public static final EndFeature PYTHADENDRON_BUSH = new EndFeature("pythadendron_bush", + new BushFeature(EndBlocks.PYTHADENDRON_LEAVES, EndBlocks.PYTHADENDRON.bark), 4); + public static final EndFeature DRAGON_TREE_BUSH = new EndFeature("dragon_tree_bush", + new BushFeature(EndBlocks.DRAGON_TREE_LEAVES, EndBlocks.DRAGON_TREE.bark), 15); public static final EndFeature TENANEA_BUSH = new EndFeature("tenanea_bush", new TenaneaBushFeature(), 10); public static final EndFeature LUMECORN = new EndFeature("lumecorn", new Lumecorn(), 5); public static final EndFeature LARGE_AMARANITA = new EndFeature("large_amaranita", new LargeAmaranitaFeature(), 5); - public static final EndFeature LUCERNIA_BUSH = new EndFeature("lucernia_bush", new BushWithOuterFeature(EndBlocks.LUCERNIA_LEAVES, EndBlocks.LUCERNIA_OUTER_LEAVES, EndBlocks.LUCERNIA.bark), 10); + public static final EndFeature LUCERNIA_BUSH = new EndFeature("lucernia_bush", new BushWithOuterFeature( + EndBlocks.LUCERNIA_LEAVES, EndBlocks.LUCERNIA_OUTER_LEAVES, EndBlocks.LUCERNIA.bark), 10); public static final EndFeature NEON_CACTUS = new EndFeature("neon_cactus", new NeonCactusFeature(), 2); - + // Plants // - public static final EndFeature UMBRELLA_MOSS = new EndFeature("umbrella_moss", new DoublePlantFeature(EndBlocks.UMBRELLA_MOSS, EndBlocks.UMBRELLA_MOSS_TALL, 5), 5); - public static final EndFeature CREEPING_MOSS = new EndFeature("creeping_moss", new SinglePlantFeature(EndBlocks.CREEPING_MOSS, 5), 5); + public static final EndFeature UMBRELLA_MOSS = new EndFeature("umbrella_moss", + new DoublePlantFeature(EndBlocks.UMBRELLA_MOSS, EndBlocks.UMBRELLA_MOSS_TALL, 5), 5); + public static final EndFeature CREEPING_MOSS = new EndFeature("creeping_moss", + new SinglePlantFeature(EndBlocks.CREEPING_MOSS, 5), 5); public static final EndFeature BLUE_VINE = new EndFeature("blue_vine", new BlueVineFeature(), 1); - public static final EndFeature CHORUS_GRASS = new EndFeature("chorus_grass", new SinglePlantFeature(EndBlocks.CHORUS_GRASS, 4), 5); - public static final EndFeature CRYSTAL_GRASS = new EndFeature("crystal_grass", new SinglePlantFeature(EndBlocks.CRYSTAL_GRASS, 8, false), 5); - public static final EndFeature SHADOW_PLANT = new EndFeature("shadow_plant", new SinglePlantFeature(EndBlocks.SHADOW_PLANT, 6), 9); - public static final EndFeature MURKWEED = new EndFeature("murkweed", new SinglePlantFeature(EndBlocks.MURKWEED, 3), 2); - public static final EndFeature NEEDLEGRASS = new EndFeature("needlegrass", new SinglePlantFeature(EndBlocks.NEEDLEGRASS, 3), 2); - public static final EndFeature SHADOW_BERRY = new EndFeature("shadow_berry", new SinglePlantFeature(EndBlocks.SHADOW_BERRY, 2), 1); - public static final EndFeature BUSHY_GRASS = new EndFeature("bushy_grass", new SinglePlantFeature(EndBlocks.BUSHY_GRASS, 8, false), 20); - public static final EndFeature BUSHY_GRASS_WG = new EndFeature("bushy_grass_wg", new SinglePlantFeature(EndBlocks.BUSHY_GRASS, 5), 10); - public static final EndFeature AMBER_GRASS = new EndFeature("amber_grass", new SinglePlantFeature(EndBlocks.AMBER_GRASS, 6), 9); + public static final EndFeature CHORUS_GRASS = new EndFeature("chorus_grass", + new SinglePlantFeature(EndBlocks.CHORUS_GRASS, 4), 5); + public static final EndFeature CRYSTAL_GRASS = new EndFeature("crystal_grass", + new SinglePlantFeature(EndBlocks.CRYSTAL_GRASS, 8, false), 5); + public static final EndFeature SHADOW_PLANT = new EndFeature("shadow_plant", + new SinglePlantFeature(EndBlocks.SHADOW_PLANT, 6), 9); + public static final EndFeature MURKWEED = new EndFeature("murkweed", new SinglePlantFeature(EndBlocks.MURKWEED, 3), + 2); + public static final EndFeature NEEDLEGRASS = new EndFeature("needlegrass", + new SinglePlantFeature(EndBlocks.NEEDLEGRASS, 3), 2); + public static final EndFeature SHADOW_BERRY = new EndFeature("shadow_berry", + new SinglePlantFeature(EndBlocks.SHADOW_BERRY, 2), 1); + public static final EndFeature BUSHY_GRASS = new EndFeature("bushy_grass", + new SinglePlantFeature(EndBlocks.BUSHY_GRASS, 8, false), 20); + public static final EndFeature BUSHY_GRASS_WG = new EndFeature("bushy_grass_wg", + new SinglePlantFeature(EndBlocks.BUSHY_GRASS, 5), 10); + public static final EndFeature AMBER_GRASS = new EndFeature("amber_grass", + new SinglePlantFeature(EndBlocks.AMBER_GRASS, 6), 9); public static final EndFeature LANCELEAF = new EndFeature("lanceleaf", new LanceleafFeature(), 3); public static final EndFeature GLOW_PILLAR = new EndFeature("glow_pillar", new GlowPillarFeature(), 1); - public static final EndFeature TWISTED_UMBRELLA_MOSS = new EndFeature("twisted_umbrella_moss", new DoublePlantFeature(EndBlocks.TWISTED_UMBRELLA_MOSS, EndBlocks.TWISTED_UMBRELLA_MOSS_TALL, 6), 5); - public static final EndFeature JUNGLE_GRASS = new EndFeature("jungle_grass", new SinglePlantFeature(EndBlocks.JUNGLE_GRASS, 7, 3), 8); - public static final EndFeature SMALL_JELLYSHROOM_FLOOR = new EndFeature("small_jellyshroom_floor", new SinglePlantFeature(EndBlocks.SMALL_JELLYSHROOM, 5, 5), 4); - public static final EndFeature BLOSSOM_BERRY = new EndFeature("blossom_berry", new SinglePlantFeature(EndBlocks.BLOSSOM_BERRY, 3, 3), 2); - public static final EndFeature BLOOMING_COOKSONIA = new EndFeature("blooming_cooksonia", new SinglePlantFeature(EndBlocks.BLOOMING_COOKSONIA, 5), 5); - public static final EndFeature SALTEAGO = new EndFeature("salteago", new SinglePlantFeature(EndBlocks.SALTEAGO, 5), 5); - public static final EndFeature VAIOLUSH_FERN = new EndFeature("vaiolush_fern", new SinglePlantFeature(EndBlocks.VAIOLUSH_FERN, 5), 5); - public static final EndFeature FRACTURN = new EndFeature("fracturn", new SinglePlantFeature(EndBlocks.FRACTURN, 5), 5); - public static final EndFeature UMBRELLA_MOSS_RARE = new EndFeature("umbrella_moss_rare", new SinglePlantFeature(EndBlocks.UMBRELLA_MOSS, 3), 2); - public static final EndFeature CREEPING_MOSS_RARE = new EndFeature("creeping_moss_rare", new SinglePlantFeature(EndBlocks.CREEPING_MOSS, 3), 2); - public static final EndFeature TWISTED_UMBRELLA_MOSS_RARE = new EndFeature("twisted_umbrella_moss_rare", new SinglePlantFeature(EndBlocks.TWISTED_UMBRELLA_MOSS, 3), 2); + public static final EndFeature TWISTED_UMBRELLA_MOSS = new EndFeature("twisted_umbrella_moss", + new DoublePlantFeature(EndBlocks.TWISTED_UMBRELLA_MOSS, EndBlocks.TWISTED_UMBRELLA_MOSS_TALL, 6), 5); + public static final EndFeature JUNGLE_GRASS = new EndFeature("jungle_grass", + new SinglePlantFeature(EndBlocks.JUNGLE_GRASS, 7, 3), 8); + public static final EndFeature SMALL_JELLYSHROOM_FLOOR = new EndFeature("small_jellyshroom_floor", + new SinglePlantFeature(EndBlocks.SMALL_JELLYSHROOM, 5, 5), 4); + public static final EndFeature BLOSSOM_BERRY = new EndFeature("blossom_berry", + new SinglePlantFeature(EndBlocks.BLOSSOM_BERRY, 3, 3), 2); + public static final EndFeature BLOOMING_COOKSONIA = new EndFeature("blooming_cooksonia", + new SinglePlantFeature(EndBlocks.BLOOMING_COOKSONIA, 5), 5); + public static final EndFeature SALTEAGO = new EndFeature("salteago", new SinglePlantFeature(EndBlocks.SALTEAGO, 5), + 5); + public static final EndFeature VAIOLUSH_FERN = new EndFeature("vaiolush_fern", + new SinglePlantFeature(EndBlocks.VAIOLUSH_FERN, 5), 5); + public static final EndFeature FRACTURN = new EndFeature("fracturn", new SinglePlantFeature(EndBlocks.FRACTURN, 5), + 5); + public static final EndFeature UMBRELLA_MOSS_RARE = new EndFeature("umbrella_moss_rare", + new SinglePlantFeature(EndBlocks.UMBRELLA_MOSS, 3), 2); + public static final EndFeature CREEPING_MOSS_RARE = new EndFeature("creeping_moss_rare", + new SinglePlantFeature(EndBlocks.CREEPING_MOSS, 3), 2); + public static final EndFeature TWISTED_UMBRELLA_MOSS_RARE = new EndFeature("twisted_umbrella_moss_rare", + new SinglePlantFeature(EndBlocks.TWISTED_UMBRELLA_MOSS, 3), 2); public static final EndFeature ORANGO = new EndFeature("orango", new SinglePlantFeature(EndBlocks.ORANGO, 5), 6); - public static final EndFeature AERIDIUM = new EndFeature("aeridium", new SinglePlantFeature(EndBlocks.AERIDIUM, 5, 4), 5); - public static final EndFeature LUTEBUS = new EndFeature("lutebus", new SinglePlantFeature(EndBlocks.LUTEBUS, 5, 2), 5); - public static final EndFeature LAMELLARIUM = new EndFeature("lamellarium", new SinglePlantFeature(EndBlocks.LAMELLARIUM, 5), 6); - public static final EndFeature SMALL_AMARANITA = new EndFeature("small_amaranita", new SinglePlantFeature(EndBlocks.SMALL_AMARANITA_MUSHROOM, 5, 5), 4); - public static final EndFeature GLOBULAGUS = new EndFeature("globulagus", new SinglePlantFeature(EndBlocks.GLOBULAGUS, 5, 3), 6); - public static final EndFeature CLAWFERN = new EndFeature("clawfern", new SinglePlantFeature(EndBlocks.CLAWFERN, 5, 4), 5); - public static final EndFeature BOLUX_MUSHROOM = new EndFeature("bolux_mushroom", new SinglePlantFeature(EndBlocks.BOLUX_MUSHROOM, 5, 5), 2); - public static final EndFeature CHORUS_MUSHROOM = new EndFeature("chorus_mushroom", new SinglePlantFeature(EndBlocks.CHORUS_MUSHROOM, 5, 5), 1); - public static final EndFeature AMBER_ROOT = new EndFeature("amber_root", new SinglePlantFeature(EndBlocks.AMBER_ROOT, 5, 5), 1); - public static final EndFeature PEARLBERRY = new EndFeature("pearlberry", new SinglePlantFeature(EndBlocks.PEARLBERRY, 5, 5), 1); - + public static final EndFeature AERIDIUM = new EndFeature("aeridium", + new SinglePlantFeature(EndBlocks.AERIDIUM, 5, 4), 5); + public static final EndFeature LUTEBUS = new EndFeature("lutebus", new SinglePlantFeature(EndBlocks.LUTEBUS, 5, 2), + 5); + public static final EndFeature LAMELLARIUM = new EndFeature("lamellarium", + new SinglePlantFeature(EndBlocks.LAMELLARIUM, 5), 6); + public static final EndFeature SMALL_AMARANITA = new EndFeature("small_amaranita", + new SinglePlantFeature(EndBlocks.SMALL_AMARANITA_MUSHROOM, 5, 5), 4); + public static final EndFeature GLOBULAGUS = new EndFeature("globulagus", + new SinglePlantFeature(EndBlocks.GLOBULAGUS, 5, 3), 6); + public static final EndFeature CLAWFERN = new EndFeature("clawfern", + new SinglePlantFeature(EndBlocks.CLAWFERN, 5, 4), 5); + public static final EndFeature BOLUX_MUSHROOM = new EndFeature("bolux_mushroom", + new SinglePlantFeature(EndBlocks.BOLUX_MUSHROOM, 5, 5), 2); + public static final EndFeature CHORUS_MUSHROOM = new EndFeature("chorus_mushroom", + new SinglePlantFeature(EndBlocks.CHORUS_MUSHROOM, 5, 5), 1); + public static final EndFeature AMBER_ROOT = new EndFeature("amber_root", + new SinglePlantFeature(EndBlocks.AMBER_ROOT, 5, 5), 1); + public static final EndFeature PEARLBERRY = new EndFeature("pearlberry", + new SinglePlantFeature(EndBlocks.PEARLBERRY, 5, 5), 1); + // Vines // - public static final EndFeature DENSE_VINE = new EndFeature("dense_vine", new VineFeature(EndBlocks.DENSE_VINE, 24), 3); - public static final EndFeature TWISTED_VINE = new EndFeature("twisted_vine", new VineFeature(EndBlocks.TWISTED_VINE, 24), 3); + public static final EndFeature DENSE_VINE = new EndFeature("dense_vine", new VineFeature(EndBlocks.DENSE_VINE, 24), + 3); + public static final EndFeature TWISTED_VINE = new EndFeature("twisted_vine", + new VineFeature(EndBlocks.TWISTED_VINE, 24), 3); public static final EndFeature BULB_VINE = new EndFeature("bulb_vine", new VineFeature(EndBlocks.BULB_VINE, 24), 5); - public static final EndFeature JUNGLE_VINE = new EndFeature("jungle_vine", new VineFeature(EndBlocks.JUNGLE_VINE, 24), 5); - + public static final EndFeature JUNGLE_VINE = new EndFeature("jungle_vine", + new VineFeature(EndBlocks.JUNGLE_VINE, 24), 5); + // Ceil plants - public static final EndFeature SMALL_JELLYSHROOM_CEIL = new EndFeature("small_jellyshroom_ceil", new SingleInvertedScatterFeature(EndBlocks.SMALL_JELLYSHROOM, 8), 8); - + public static final EndFeature SMALL_JELLYSHROOM_CEIL = new EndFeature("small_jellyshroom_ceil", + new SingleInvertedScatterFeature(EndBlocks.SMALL_JELLYSHROOM, 8), 8); + // Wall Plants // - public static final EndFeature PURPLE_POLYPORE = new EndFeature("purple_polypore", new WallPlantOnLogFeature(EndBlocks.PURPLE_POLYPORE, 3), 5); - public static final EndFeature AURANT_POLYPORE = new EndFeature("aurant_polypore", new WallPlantOnLogFeature(EndBlocks.AURANT_POLYPORE, 3), 5); - public static final EndFeature TAIL_MOSS = new EndFeature("tail_moss", new WallPlantFeature(EndBlocks.TAIL_MOSS, 3), 15); - public static final EndFeature CYAN_MOSS = new EndFeature("cyan_moss", new WallPlantFeature(EndBlocks.CYAN_MOSS, 3), 15); - public static final EndFeature TAIL_MOSS_WOOD = new EndFeature("tail_moss_wood", new WallPlantOnLogFeature(EndBlocks.TAIL_MOSS, 4), 25); - public static final EndFeature CYAN_MOSS_WOOD = new EndFeature("cyan_moss_wood", new WallPlantOnLogFeature(EndBlocks.CYAN_MOSS, 4), 25); - public static final EndFeature TWISTED_MOSS = new EndFeature("twisted_moss", new WallPlantFeature(EndBlocks.TWISTED_MOSS, 6), 15); - public static final EndFeature TWISTED_MOSS_WOOD = new EndFeature("twisted_moss_wood", new WallPlantOnLogFeature(EndBlocks.TWISTED_MOSS, 6), 25); - public static final EndFeature BULB_MOSS = new EndFeature("bulb_moss", new WallPlantFeature(EndBlocks.BULB_MOSS, 6), 1); - public static final EndFeature BULB_MOSS_WOOD = new EndFeature("bulb_moss_wood", new WallPlantOnLogFeature(EndBlocks.BULB_MOSS, 6), 15); - public static final EndFeature SMALL_JELLYSHROOM_WALL = new EndFeature("small_jellyshroom_wall", new WallPlantFeature(EndBlocks.SMALL_JELLYSHROOM, 4), 4); - public static final EndFeature SMALL_JELLYSHROOM_WOOD = new EndFeature("small_jellyshroom_wood", new WallPlantOnLogFeature(EndBlocks.SMALL_JELLYSHROOM, 4), 8); - public static final EndFeature JUNGLE_FERN_WOOD = new EndFeature("jungle_fern_wood", new WallPlantOnLogFeature(EndBlocks.JUNGLE_FERN, 3), 12); + public static final EndFeature PURPLE_POLYPORE = new EndFeature("purple_polypore", + new WallPlantOnLogFeature(EndBlocks.PURPLE_POLYPORE, 3), 5); + public static final EndFeature AURANT_POLYPORE = new EndFeature("aurant_polypore", + new WallPlantOnLogFeature(EndBlocks.AURANT_POLYPORE, 3), 5); + public static final EndFeature TAIL_MOSS = new EndFeature("tail_moss", new WallPlantFeature(EndBlocks.TAIL_MOSS, 3), + 15); + public static final EndFeature CYAN_MOSS = new EndFeature("cyan_moss", new WallPlantFeature(EndBlocks.CYAN_MOSS, 3), + 15); + public static final EndFeature TAIL_MOSS_WOOD = new EndFeature("tail_moss_wood", + new WallPlantOnLogFeature(EndBlocks.TAIL_MOSS, 4), 25); + public static final EndFeature CYAN_MOSS_WOOD = new EndFeature("cyan_moss_wood", + new WallPlantOnLogFeature(EndBlocks.CYAN_MOSS, 4), 25); + public static final EndFeature TWISTED_MOSS = new EndFeature("twisted_moss", + new WallPlantFeature(EndBlocks.TWISTED_MOSS, 6), 15); + public static final EndFeature TWISTED_MOSS_WOOD = new EndFeature("twisted_moss_wood", + new WallPlantOnLogFeature(EndBlocks.TWISTED_MOSS, 6), 25); + public static final EndFeature BULB_MOSS = new EndFeature("bulb_moss", new WallPlantFeature(EndBlocks.BULB_MOSS, 6), + 1); + public static final EndFeature BULB_MOSS_WOOD = new EndFeature("bulb_moss_wood", + new WallPlantOnLogFeature(EndBlocks.BULB_MOSS, 6), 15); + public static final EndFeature SMALL_JELLYSHROOM_WALL = new EndFeature("small_jellyshroom_wall", + new WallPlantFeature(EndBlocks.SMALL_JELLYSHROOM, 4), 4); + public static final EndFeature SMALL_JELLYSHROOM_WOOD = new EndFeature("small_jellyshroom_wood", + new WallPlantOnLogFeature(EndBlocks.SMALL_JELLYSHROOM, 4), 8); + public static final EndFeature JUNGLE_FERN_WOOD = new EndFeature("jungle_fern_wood", + new WallPlantOnLogFeature(EndBlocks.JUNGLE_FERN, 3), 12); public static final EndFeature RUSCUS = new EndFeature("ruscus", new WallPlantFeature(EndBlocks.RUSCUS, 6), 10); - public static final EndFeature RUSCUS_WOOD = new EndFeature("ruscus_wood", new WallPlantOnLogFeature(EndBlocks.RUSCUS, 6), 10); - + public static final EndFeature RUSCUS_WOOD = new EndFeature("ruscus_wood", + new WallPlantOnLogFeature(EndBlocks.RUSCUS, 6), 10); + // Sky plants public static final EndFeature FILALUX = new EndFeature("filalux", new FilaluxFeature(), 1); - + // Water // - public static final EndFeature BUBBLE_CORAL = new EndFeature("bubble_coral", new UnderwaterPlantFeature(EndBlocks.BUBBLE_CORAL, 6), 10); - public static final EndFeature BUBBLE_CORAL_RARE = new EndFeature("bubble_coral_rare", new UnderwaterPlantFeature(EndBlocks.BUBBLE_CORAL, 3), 4); + public static final EndFeature BUBBLE_CORAL = new EndFeature("bubble_coral", + new UnderwaterPlantFeature(EndBlocks.BUBBLE_CORAL, 6), 10); + public static final EndFeature BUBBLE_CORAL_RARE = new EndFeature("bubble_coral_rare", + new UnderwaterPlantFeature(EndBlocks.BUBBLE_CORAL, 3), 4); public static final EndFeature END_LILY = new EndFeature("end_lily", new EndLilyFeature(6), 10); public static final EndFeature END_LILY_RARE = new EndFeature("end_lily_rare", new EndLilyFeature(3), 4); public static final EndFeature END_LOTUS = new EndFeature("end_lotus", new EndLotusFeature(7), 5); public static final EndFeature END_LOTUS_LEAF = new EndFeature("end_lotus_leaf", new EndLotusLeafFeature(20), 25); public static final EndFeature HYDRALUX = new EndFeature("hydralux", new HydraluxFeature(5), 5); - public static final EndFeature POND_ANEMONE = new EndFeature("pond_anemone", new UnderwaterPlantFeature(EndBlocks.POND_ANEMONE, 6), 10); - - public static final EndFeature CHARNIA_RED = new EndFeature("charnia_red", new CharniaFeature(EndBlocks.CHARNIA_RED), 10); - public static final EndFeature CHARNIA_PURPLE = new EndFeature("charnia_purple", new CharniaFeature(EndBlocks.CHARNIA_PURPLE), 10); - public static final EndFeature CHARNIA_CYAN = new EndFeature("charnia_cyan", new CharniaFeature(EndBlocks.CHARNIA_CYAN), 10); - public static final EndFeature CHARNIA_LIGHT_BLUE = new EndFeature("charnia_light_blue", new CharniaFeature(EndBlocks.CHARNIA_LIGHT_BLUE), 10); - public static final EndFeature CHARNIA_ORANGE = new EndFeature("charnia_orange", new CharniaFeature(EndBlocks.CHARNIA_ORANGE), 10); - public static final EndFeature CHARNIA_GREEN = new EndFeature("charnia_green", new CharniaFeature(EndBlocks.CHARNIA_GREEN), 10); + public static final EndFeature POND_ANEMONE = new EndFeature("pond_anemone", + new UnderwaterPlantFeature(EndBlocks.POND_ANEMONE, 6), 10); + + public static final EndFeature CHARNIA_RED = new EndFeature("charnia_red", + new CharniaFeature(EndBlocks.CHARNIA_RED), 10); + public static final EndFeature CHARNIA_PURPLE = new EndFeature("charnia_purple", + new CharniaFeature(EndBlocks.CHARNIA_PURPLE), 10); + public static final EndFeature CHARNIA_CYAN = new EndFeature("charnia_cyan", + new CharniaFeature(EndBlocks.CHARNIA_CYAN), 10); + public static final EndFeature CHARNIA_LIGHT_BLUE = new EndFeature("charnia_light_blue", + new CharniaFeature(EndBlocks.CHARNIA_LIGHT_BLUE), 10); + public static final EndFeature CHARNIA_ORANGE = new EndFeature("charnia_orange", + new CharniaFeature(EndBlocks.CHARNIA_ORANGE), 10); + public static final EndFeature CHARNIA_GREEN = new EndFeature("charnia_green", + new CharniaFeature(EndBlocks.CHARNIA_GREEN), 10); public static final EndFeature MENGER_SPONGE = new EndFeature("menger_sponge", new MengerSpongeFeature(5), 1); - public static final EndFeature CHARNIA_RED_RARE = new EndFeature("charnia_red_rare", new CharniaFeature(EndBlocks.CHARNIA_RED), 2); - public static final EndFeature BIOME_ISLAND = EndFeature.makeFeatureConfigured("overworld_island", new BiomeIslandFeature()); - public static final EndFeature FLAMAEA = new EndFeature("flamaea", new SinglePlantFeature(EndBlocks.FLAMAEA, 12, false, 5), 20); - + public static final EndFeature CHARNIA_RED_RARE = new EndFeature("charnia_red_rare", + new CharniaFeature(EndBlocks.CHARNIA_RED), 2); + public static final EndFeature BIOME_ISLAND = EndFeature.makeFeatureConfigured("overworld_island", + new BiomeIslandFeature()); + public static final EndFeature FLAMAEA = new EndFeature("flamaea", + new SinglePlantFeature(EndBlocks.FLAMAEA, 12, false, 5), 20); + // Terrain // public static final EndFeature END_LAKE = EndFeature.makeLakeFeature("end_lake", new EndLakeFeature(), 4); - public static final EndFeature END_LAKE_NORMAL = EndFeature.makeLakeFeature("end_lake_normal", new EndLakeFeature(), 20); - public static final EndFeature END_LAKE_RARE = EndFeature.makeLakeFeature("end_lake_rare", new EndLakeFeature(), 40); + public static final EndFeature END_LAKE_NORMAL = EndFeature.makeLakeFeature("end_lake_normal", new EndLakeFeature(), + 20); + public static final EndFeature END_LAKE_RARE = EndFeature.makeLakeFeature("end_lake_rare", new EndLakeFeature(), + 40); public static final EndFeature ROUND_CAVE = EndFeature.makeRawGenFeature("round_cave", new RoundCaveFeature(), 2); public static final EndFeature SPIRE = EndFeature.makeRawGenFeature("spire", new SpireFeature(), 2); - public static final EndFeature FLOATING_SPIRE = EndFeature.makeRawGenFeature("floating_spire", new FloatingSpireFeature(), 8); + public static final EndFeature FLOATING_SPIRE = EndFeature.makeRawGenFeature("floating_spire", + new FloatingSpireFeature(), 8); public static final EndFeature GEYSER = EndFeature.makeRawGenFeature("geyser", new GeyserFeature(), 8); - public static final EndFeature SULPHURIC_LAKE = EndFeature.makeLakeFeature("sulphuric_lake", new SulphuricLakeFeature(), 8); - public static final EndFeature SULPHURIC_CAVE = EndFeature.makeCountRawFeature("sulphuric_cave", new SulphuricCaveFeature(), 2); - public static final EndFeature ICE_STAR = EndFeature.makeRawGenFeature("ice_star", new IceStarFeature(5, 15, 10, 25), 15); - public static final EndFeature ICE_STAR_SMALL = EndFeature.makeRawGenFeature("ice_star_small", new IceStarFeature(3, 5, 7, 12), 8); - public static final EndFeature SURFACE_VENT = EndFeature.makeChansedFeature("surface_vent", new SurfaceVentFeature(), 4); - public static final EndFeature SULPHUR_HILL = EndFeature.makeChansedFeature("sulphur_hill", new SulphurHillFeature(), 8); - public static final EndFeature OBSIDIAN_PILLAR_BASEMENT = EndFeature.makeChansedFeature("obsidian_pillar_basement", new ObsidianPillarBasementFeature(), 8); - public static final EndFeature OBSIDIAN_BOULDER = EndFeature.makeChansedFeature("obsidian_boulder", new ObsidianBoulderFeature(), 10); - public static final EndFeature FALLEN_PILLAR = EndFeature.makeChansedFeature("fallen_pillar", new FallenPillarFeature(), 20); + public static final EndFeature SULPHURIC_LAKE = EndFeature.makeLakeFeature("sulphuric_lake", + new SulphuricLakeFeature(), 8); + public static final EndFeature SULPHURIC_CAVE = EndFeature.makeCountRawFeature("sulphuric_cave", + new SulphuricCaveFeature(), 2); + public static final EndFeature ICE_STAR = EndFeature.makeRawGenFeature("ice_star", + new IceStarFeature(5, 15, 10, 25), 15); + public static final EndFeature ICE_STAR_SMALL = EndFeature.makeRawGenFeature("ice_star_small", + new IceStarFeature(3, 5, 7, 12), 8); + public static final EndFeature SURFACE_VENT = EndFeature.makeChansedFeature("surface_vent", + new SurfaceVentFeature(), 4); + public static final EndFeature SULPHUR_HILL = EndFeature.makeChansedFeature("sulphur_hill", + new SulphurHillFeature(), 8); + public static final EndFeature OBSIDIAN_PILLAR_BASEMENT = EndFeature.makeChansedFeature("obsidian_pillar_basement", + new ObsidianPillarBasementFeature(), 8); + public static final EndFeature OBSIDIAN_BOULDER = EndFeature.makeChansedFeature("obsidian_boulder", + new ObsidianBoulderFeature(), 10); + public static final EndFeature FALLEN_PILLAR = EndFeature.makeChansedFeature("fallen_pillar", + new FallenPillarFeature(), 20); public static final EndFeature TUNEL_CAVE = EndFeature.makeRawGenFeature("tunel_cave", new TunelCaveFeature(), 2); - + // Ores // - public static final EndFeature THALLASIUM_ORE = EndFeature.makeOreFeature("thallasium_ore", EndBlocks.THALLASIUM.ore, 12, 6, 0, 16, 128); - public static final EndFeature ENDER_ORE = EndFeature.makeOreFeature("ender_ore", EndBlocks.ENDER_ORE, 8, 3, 0, 16, 128); - public static final EndFeature AMBER_ORE = EndFeature.makeOreFeature("amber_ore", EndBlocks.AMBER_ORE, 12, 6, 0, 16, 128); - public static final EndFeature VIOLECITE_LAYER = EndFeature.makeLayerFeature("violecite_layer", EndBlocks.VIOLECITE, 15, 16, 128, 8); - public static final EndFeature FLAVOLITE_LAYER = EndFeature.makeLayerFeature("flavolite_layer", EndBlocks.FLAVOLITE, 12, 16, 128, 6); - + public static final EndFeature THALLASIUM_ORE = EndFeature.makeOreFeature("thallasium_ore", + EndBlocks.THALLASIUM.ore, 12, 6, 0, 16, 128); + public static final EndFeature ENDER_ORE = EndFeature.makeOreFeature("ender_ore", EndBlocks.ENDER_ORE, 8, 3, 0, 16, + 128); + public static final EndFeature AMBER_ORE = EndFeature.makeOreFeature("amber_ore", EndBlocks.AMBER_ORE, 12, 6, 0, 16, + 128); + public static final EndFeature VIOLECITE_LAYER = EndFeature.makeLayerFeature("violecite_layer", EndBlocks.VIOLECITE, + 15, 16, 128, 8); + public static final EndFeature FLAVOLITE_LAYER = EndFeature.makeLayerFeature("flavolite_layer", EndBlocks.FLAVOLITE, + 12, 16, 128, 6); + // Buildings - public static final EndFeature CRASHED_SHIP = EndFeature.makeChansedFeature("crashed_ship", new CrashedShipFeature(), 500); - + public static final EndFeature CRASHED_SHIP = EndFeature.makeChansedFeature("crashed_ship", + new CrashedShipFeature(), 500); + // Mobs - public static final EndFeature SILK_MOTH_NEST = EndFeature.makeChansedFeature("silk_moth_nest", new SilkMothNestFeature(), 2); - + public static final EndFeature SILK_MOTH_NEST = EndFeature.makeChansedFeature("silk_moth_nest", + new SilkMothNestFeature(), 2); + // Caves public static final DefaultFeature SMARAGDANT_CRYSTAL = new SmaragdantCrystalFeature(); - public static final DefaultFeature SMARAGDANT_CRYSTAL_SHARD = new SingleBlockFeature(EndBlocks.SMARAGDANT_CRYSTAL_SHARD); + public static final DefaultFeature SMARAGDANT_CRYSTAL_SHARD = new SingleBlockFeature( + EndBlocks.SMARAGDANT_CRYSTAL_SHARD); public static final DefaultFeature BIG_AURORA_CRYSTAL = new BigAuroraCrystalFeature(); public static final DefaultFeature CAVE_BUSH = new BushFeature(EndBlocks.CAVE_BUSH, EndBlocks.CAVE_BUSH); public static final DefaultFeature CAVE_GRASS = new SingleBlockFeature(EndBlocks.CAVE_GRASS); public static final DefaultFeature RUBINEA = new VineFeature(EndBlocks.RUBINEA, 8); public static final DefaultFeature MAGNULA = new VineFeature(EndBlocks.MAGNULA, 8); - public static final DefaultFeature END_STONE_STALACTITE = new StalactiteFeature(true, EndBlocks.END_STONE_STALACTITE, Blocks.END_STONE); - public static final DefaultFeature END_STONE_STALAGMITE = new StalactiteFeature(false, EndBlocks.END_STONE_STALACTITE, Blocks.END_STONE); - public static final DefaultFeature END_STONE_STALACTITE_CAVEMOSS = new StalactiteFeature(true, EndBlocks.END_STONE_STALACTITE_CAVEMOSS, Blocks.END_STONE, EndBlocks.CAVE_MOSS); - public static final DefaultFeature END_STONE_STALAGMITE_CAVEMOSS = new StalactiteFeature(false, EndBlocks.END_STONE_STALACTITE_CAVEMOSS, EndBlocks.CAVE_MOSS); + public static final DefaultFeature END_STONE_STALACTITE = new StalactiteFeature(true, + EndBlocks.END_STONE_STALACTITE, Blocks.END_STONE); + public static final DefaultFeature END_STONE_STALAGMITE = new StalactiteFeature(false, + EndBlocks.END_STONE_STALACTITE, Blocks.END_STONE); + public static final DefaultFeature END_STONE_STALACTITE_CAVEMOSS = new StalactiteFeature(true, + EndBlocks.END_STONE_STALACTITE_CAVEMOSS, Blocks.END_STONE, EndBlocks.CAVE_MOSS); + public static final DefaultFeature END_STONE_STALAGMITE_CAVEMOSS = new StalactiteFeature(false, + EndBlocks.END_STONE_STALACTITE_CAVEMOSS, EndBlocks.CAVE_MOSS); public static final DefaultFeature CAVE_PUMPKIN = new CavePumpkinFeature(); - - public static void registerBiomeFeatures(Identifier id, Biome biome, List>>> features) { + + public static void registerBiomeFeatures(ResourceLocation id, Biome biome, + List>>> features) { if (id.getNamespace().equals(BetterEnd.MOD_ID)) { return; } - + if (GeneratorOptions.removeChorusFromVanillaBiomes()) { if (id.getNamespace().equals("minecraft")) { String path = id.getPath(); @@ -248,44 +341,43 @@ public class EndFeatures { } } } - + addFeature(FLAVOLITE_LAYER, features); addFeature(THALLASIUM_ORE, features); addFeature(ENDER_ORE, features); addFeature(CRASHED_SHIP, features); - + if (EndBiomes.getBiome(id).hasCaves()) { addFeature(ROUND_CAVE, features); addFeature(TUNEL_CAVE, features); } - + EndBiome endBiome = EndBiomes.getBiome(id); EndFeature feature = endBiome.getStructuresFeature(); if (feature != null) { addFeature(feature, features); } } - + public static void addDefaultFeatures(BiomeDefinition def) { def.addFeature(FLAVOLITE_LAYER); def.addFeature(THALLASIUM_ORE); def.addFeature(ENDER_ORE); def.addFeature(CRASHED_SHIP); - + if (def.hasCaves()) { def.addFeature(ROUND_CAVE); def.addFeature(TUNEL_CAVE); } } - + private static void addFeature(EndFeature feature, List>>> features) { int index = feature.getFeatureStep().ordinal(); if (features.size() > index) { features.get(index).add(() -> { return feature.getFeatureConfigured(); }); - } - else { + } else { List>> newFeature = Lists.newArrayList(); newFeature.add(() -> { return feature.getFeatureConfigured(); @@ -293,6 +385,7 @@ public class EndFeatures { features.add(newFeature); } } - - public static void register() {} + + public static void register() { + } } diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index 4e3dc6f3..fc5efa72 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -5,34 +5,27 @@ import java.util.List; import com.google.common.collect.Lists; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.dispenser.ItemDispenserBehavior; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.SpawnReason; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.*; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.block.dispenser.ItemDispenserBehavior; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.SpawnReason; +import net.minecraft.world.entity.effect.StatusEffectInstance; +import net.minecraft.world.entity.effect.StatusEffects; import net.minecraft.fluid.Fluids; -import net.minecraft.item.ArmorItem; -import net.minecraft.item.FishBucketItem; -import net.minecraft.item.FoodComponent; -import net.minecraft.item.FoodComponents; -import net.minecraft.item.Item; -import net.minecraft.item.Item.Settings; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.item.ShovelItem; -import net.minecraft.item.SpawnEggItem; -import net.minecraft.item.SwordItem; -import net.minecraft.item.ToolItem; -import net.minecraft.item.ToolMaterials; +import net.minecraft.world.item.FoodComponent; +import net.minecraft.world.item.FoodComponents; +import net.minecraft.world.item.Item.Properties; +import net.minecraft.world.item.ToolItem; +import net.minecraft.world.item.ToolMaterials; import net.minecraft.sound.SoundEvent; -import net.minecraft.tag.Tag; -import net.minecraft.util.Identifier; -import net.minecraft.util.Rarity; +import net.minecraft.tags.Tag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Rarity; import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.Direction; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; import ru.betterend.item.DrinkItem; @@ -56,7 +49,7 @@ import ru.betterend.util.TagHelper; public class EndItems { private static final List MOD_BLOCKS = Lists.newArrayList(); private static final List MOD_ITEMS = Lists.newArrayList(); - + // Materials // public final static Item ENDER_DUST = registerItem("ender_dust"); public final static Item ENDER_SHARD = registerItem("ender_shard"); @@ -77,28 +70,43 @@ public class EndItems { public final static Item SILK_FIBER = registerItem("silk_fiber"); public final static Item LUMECORN_ROD = registerItem("lumecorn_rod"); public final static Item SILK_MOTH_MATRIX = registerItem("silk_moth_matrix"); - + // Music Discs - public final static Item MUSIC_DISC_STRANGE_AND_ALIEN = registerDisc("music_disc_strange_and_alien", 0, EndSounds.STRANGE_AND_ALIEN); - + public final static Item MUSIC_DISC_STRANGE_AND_ALIEN = registerDisc("music_disc_strange_and_alien", 0, + EndSounds.STRANGE_AND_ALIEN); + // Armor // - public static final Item AETERNIUM_HELMET = registerItem("aeternium_helmet", new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.HEAD, makeItemSettings().fireproof())); - public static final Item AETERNIUM_CHESTPLATE = registerItem("aeternium_chestplate", new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.CHEST, makeItemSettings().fireproof())); - public static final Item AETERNIUM_LEGGINGS = registerItem("aeternium_leggings", new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.LEGS, makeItemSettings().fireproof())); - public static final Item AETERNIUM_BOOTS = registerItem("aeternium_boots", new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.FEET, makeItemSettings().fireproof())); - public static final Item CRYSTALITE_HELMET = registerItem("crystalite_helmet", new EndArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.HEAD, makeItemSettings().rarity(Rarity.UNCOMMON))); - public static final Item CRYSTALITE_CHESTPLATE = registerItem("crystalite_chestplate", new EndArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.CHEST, makeItemSettings().rarity(Rarity.UNCOMMON))); - public static final Item CRYSTALITE_LEGGINGS = registerItem("crystalite_leggings", new EndArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.LEGS, makeItemSettings().rarity(Rarity.UNCOMMON))); - public static final Item CRYSTALITE_BOOTS = registerItem("crystalite_boots", new EndArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.FEET, makeItemSettings().rarity(Rarity.UNCOMMON))); - + public static final Item AETERNIUM_HELMET = registerItem("aeternium_helmet", + new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.HEAD, makeItemSettings().fireResistant())); + public static final Item AETERNIUM_CHESTPLATE = registerItem("aeternium_chestplate", + new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.CHEST, makeItemSettings().fireResistant())); + public static final Item AETERNIUM_LEGGINGS = registerItem("aeternium_leggings", + new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.LEGS, makeItemSettings().fireResistant())); + public static final Item AETERNIUM_BOOTS = registerItem("aeternium_boots", + new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.FEET, makeItemSettings().fireResistant())); + public static final Item CRYSTALITE_HELMET = registerItem("crystalite_helmet", new EndArmorItem( + EndArmorMaterial.CRYSTALITE, EquipmentSlot.HEAD, makeItemSettings().rarity(Rarity.UNCOMMON))); + public static final Item CRYSTALITE_CHESTPLATE = registerItem("crystalite_chestplate", new EndArmorItem( + EndArmorMaterial.CRYSTALITE, EquipmentSlot.CHEST, makeItemSettings().rarity(Rarity.UNCOMMON))); + public static final Item CRYSTALITE_LEGGINGS = registerItem("crystalite_leggings", new EndArmorItem( + EndArmorMaterial.CRYSTALITE, EquipmentSlot.LEGS, makeItemSettings().rarity(Rarity.UNCOMMON))); + public static final Item CRYSTALITE_BOOTS = registerItem("crystalite_boots", new EndArmorItem( + EndArmorMaterial.CRYSTALITE, EquipmentSlot.FEET, makeItemSettings().rarity(Rarity.UNCOMMON))); + // Tools // - public static final ToolItem AETERNIUM_SHOVEL = registerTool("aeternium_shovel", new EndShovelItem(EndToolMaterial.AETERNIUM, 1.5F, -3.0F, makeItemSettings().fireproof())); - public static final ToolItem AETERNIUM_SWORD = registerTool("aeternium_sword", new EndSwordItem(EndToolMaterial.AETERNIUM, 3, -2.4F, makeItemSettings().fireproof())); - public static final ToolItem AETERNIUM_PICKAXE = registerTool("aeternium_pickaxe", new EndPickaxeItem(EndToolMaterial.AETERNIUM, 1, -2.8F, makeItemSettings().fireproof())); - public static final ToolItem AETERNIUM_AXE = registerTool("aeternium_axe", new EndAxeItem(EndToolMaterial.AETERNIUM, 5.0F, -3.0F, makeItemSettings().fireproof())); - public static final ToolItem AETERNIUM_HOE = registerTool("aeternium_hoe", new EndHoeItem(EndToolMaterial.AETERNIUM, -3, 0.0F, makeItemSettings().fireproof())); - public static final ToolItem AETERNIUM_HAMMER = registerTool("aeternium_hammer", new EndHammerItem(EndToolMaterial.AETERNIUM, 6.0F, -3.0F, 0.3D, makeItemSettings().fireproof())); - + public static final ToolItem AETERNIUM_SHOVEL = registerTool("aeternium_shovel", + new EndShovelItem(EndToolMaterial.AETERNIUM, 1.5F, -3.0F, makeItemSettings().fireResistant())); + public static final ToolItem AETERNIUM_SWORD = registerTool("aeternium_sword", + new EndSwordItem(EndToolMaterial.AETERNIUM, 3, -2.4F, makeItemSettings().fireResistant())); + public static final ToolItem AETERNIUM_PICKAXE = registerTool("aeternium_pickaxe", + new EndPickaxeItem(EndToolMaterial.AETERNIUM, 1, -2.8F, makeItemSettings().fireResistant())); + public static final ToolItem AETERNIUM_AXE = registerTool("aeternium_axe", + new EndAxeItem(EndToolMaterial.AETERNIUM, 5.0F, -3.0F, makeItemSettings().fireResistant())); + public static final ToolItem AETERNIUM_HOE = registerTool("aeternium_hoe", + new EndHoeItem(EndToolMaterial.AETERNIUM, -3, 0.0F, makeItemSettings().fireResistant())); + public static final ToolItem AETERNIUM_HAMMER = registerTool("aeternium_hammer", + new EndHammerItem(EndToolMaterial.AETERNIUM, 6.0F, -3.0F, 0.3D, makeItemSettings().fireResistant())); + // Toolparts // public final static Item AETERNIUM_SHOVEL_HEAD = registerItem("aeternium_shovel_head"); public final static Item AETERNIUM_PICKAXE_HEAD = registerItem("aeternium_pickaxe_head"); @@ -109,42 +117,50 @@ public class EndItems { public final static Item AETERNIUM_SWORD_HANDLE = registerItem("aeternium_sword_handle"); // Hammers // - public static final ToolItem IRON_HAMMER = registerTool("iron_hammer", new EndHammerItem(ToolMaterials.IRON, 5.0F, -3.2F, 0.2D, makeItemSettings())); - public static final ToolItem GOLDEN_HAMMER = registerTool("golden_hammer", new EndHammerItem(ToolMaterials.GOLD, 4.5F, -3.4F, 0.3D, makeItemSettings())); - public static final ToolItem DIAMOND_HAMMER = registerTool("diamond_hammer", new EndHammerItem(ToolMaterials.DIAMOND, 5.5F, -3.1F, 0.2D, makeItemSettings())); - public static final ToolItem NETHERITE_HAMMER = registerTool("netherite_hammer", new EndHammerItem(ToolMaterials.NETHERITE, 5.0F, -3.0F, 0.2D, makeItemSettings().fireproof())); - + public static final ToolItem IRON_HAMMER = registerTool("iron_hammer", + new EndHammerItem(ToolMaterials.IRON, 5.0F, -3.2F, 0.2D, makeItemSettings())); + public static final ToolItem GOLDEN_HAMMER = registerTool("golden_hammer", + new EndHammerItem(ToolMaterials.GOLD, 4.5F, -3.4F, 0.3D, makeItemSettings())); + public static final ToolItem DIAMOND_HAMMER = registerTool("diamond_hammer", + new EndHammerItem(ToolMaterials.DIAMOND, 5.5F, -3.1F, 0.2D, makeItemSettings())); + public static final ToolItem NETHERITE_HAMMER = registerTool("netherite_hammer", + new EndHammerItem(ToolMaterials.NETHERITE, 5.0F, -3.0F, 0.2D, makeItemSettings().fireResistant())); + // Food // public final static Item SHADOW_BERRY_RAW = registerFood("shadow_berry_raw", 4, 0.5F); public final static Item SHADOW_BERRY_COOKED = registerFood("shadow_berry_cooked", 6, 0.7F); public final static Item END_FISH_RAW = registerFood("end_fish_raw", FoodComponents.SALMON); public final static Item END_FISH_COOKED = registerFood("end_fish_cooked", FoodComponents.COOKED_SALMON); - public final static Item BUCKET_END_FISH = registerItem("bucket_end_fish", new FishBucketItem(EndEntities.END_FISH, Fluids.WATER, makeItemSettings().maxCount(1))); + public final static Item BUCKET_END_FISH = registerItem("bucket_end_fish", + new FishBucketItem(EndEntities.END_FISH, Fluids.WATER, makeItemSettings().maxCount(1))); public final static Item SWEET_BERRY_JELLY = registerFood("sweet_berry_jelly", 6, 0.75F); - public final static Item SHADOW_BERRY_JELLY = registerFood("shadow_berry_jelly", 7, 0.75F, new StatusEffectInstance(StatusEffects.NIGHT_VISION, 400)); + public final static Item SHADOW_BERRY_JELLY = registerFood("shadow_berry_jelly", 7, 0.75F, + new StatusEffectInstance(StatusEffects.NIGHT_VISION, 400)); public final static Item BLOSSOM_BERRY = registerFood("blossom_berry", FoodComponents.APPLE); public final static Item AMBER_ROOT_RAW = registerFood("amber_root_raw", 2, 0.8F); public final static Item CHORUS_MUSHROOM_RAW = registerFood("chorus_mushroom_raw", 3, 0.5F); - public final static Item CHORUS_MUSHROOM_COOKED = registerFood("chorus_mushroom_cooked", FoodComponents.MUSHROOM_STEW); - public final static Item BOLUX_MUSHROOM_COOKED = registerFood("bolux_mushroom_cooked", FoodComponents.MUSHROOM_STEW); + public final static Item CHORUS_MUSHROOM_COOKED = registerFood("chorus_mushroom_cooked", + FoodComponents.MUSHROOM_STEW); + public final static Item BOLUX_MUSHROOM_COOKED = registerFood("bolux_mushroom_cooked", + FoodComponents.MUSHROOM_STEW); public final static Item CAVE_PUMPKIN_PIE = registerFood("cave_pumpkin_pie", FoodComponents.PUMPKIN_PIE); - + // Drinks // public final static Item UMBRELLA_CLUSTER_JUICE = registerDrink("umbrella_cluster_juice", 5, 0.7F); - + public static Item registerDisc(String name, int power, SoundEvent sound) { return registerItem(BetterEnd.makeID(name), new PatternedDiscItem(power, sound, makeItemSettings())); } - + public static Item registerItem(String name) { return registerItem(BetterEnd.makeID(name), new PatternedItem(makeItemSettings())); } - + public static Item registerItem(String name, Item item) { return registerItem(BetterEnd.makeID(name), item); } - - public static Item registerItem(Identifier id, Item item) { + + public static Item registerItem(ResourceLocation id, Item item) { if (item instanceof ArmorItem) { return registerArmor(id, item); } @@ -154,34 +170,34 @@ public class EndItems { registerItem(id, item, MOD_ITEMS); return item; } - - public static Item registerBlockItem(Identifier id, Item item) { + + public static Item registerBlockItem(ResourceLocation id, Item item) { registerItem(id, item, MOD_BLOCKS); return item; } - - private static void registerItem(Identifier id, Item item, List registry) { + + private static void registerItem(ResourceLocation id, Item item, List registry) { if (item != Items.AIR) { Registry.register(Registry.ITEM, id, item); registry.add(item); } } - - private static Item registerArmor(Identifier id, Item item) { + + private static Item registerArmor(ResourceLocation id, Item item) { if (!Configs.ITEM_CONFIG.getBoolean("armor", id.getPath(), true)) { return item; } registerItem(id, item, MOD_ITEMS); return item; } - + public static ToolItem registerTool(String name, ToolItem item) { - Identifier id = BetterEnd.makeID(name); + ResourceLocation id = BetterEnd.makeID(name); if (!Configs.ITEM_CONFIG.getBoolean("tools", id.getPath(), true)) { return item; } registerItem(id, item, MOD_ITEMS); - + if (item instanceof ShovelItem) { TagHelper.addTag((Tag.Identified) FabricToolTags.SHOVELS, item); } else if (item instanceof SwordItem) { @@ -195,17 +211,18 @@ public class EndItems { } else if (item instanceof EndHammerItem) { TagHelper.addTag((Tag.Identified) EndTags.HAMMERS, item); } - + return item; } - + public static Item registerEgg(String name, EntityType type, int background, int dots) { SpawnEggItem item = new EndSpawnEggItem(type, background, dots, makeItemSettings()); ItemDispenserBehavior behavior = new ItemDispenserBehavior() { public ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { Direction direction = pointer.getBlockState().get(DispenserBlock.FACING); EntityType entityType = ((SpawnEggItem) stack.getItem()).getEntityType(stack.getTag()); - entityType.spawnFromItemStack(pointer.getWorld(), stack, null, pointer.getBlockPos().offset(direction), SpawnReason.DISPENSER, direction != Direction.UP, false); + entityType.spawnFromItemStack(pointer.getLevel(), stack, null, pointer.getBlockPos().offset(direction), + SpawnReason.DISPENSER, direction != Direction.UP, false); stack.decrement(1); return stack; } @@ -213,42 +230,43 @@ public class EndItems { DispenserBlock.registerBehavior(item, behavior); return registerItem(name, item); } - + public static Item registerFood(String name, int hunger, float saturation, StatusEffectInstance... effects) { FoodComponent.Builder builder = new FoodComponent.Builder().hunger(hunger).saturationModifier(saturation); - for (StatusEffectInstance effect: effects) { + for (StatusEffectInstance effect : effects) { builder.statusEffect(effect, 1F); } return registerFood(name, builder.build()); } - + public static Item registerFood(String name, FoodComponent foodComponent) { return registerItem(name, new PatternedItem(makeItemSettings().food(foodComponent))); } - + public static Item registerDrink(String name) { return registerItem(name, new DrinkItem(makeItemSettings().maxCount(1))); } - + public static Item registerDrink(String name, FoodComponent foodComponent) { return registerItem(name, new DrinkItem(makeItemSettings().maxCount(1).food(foodComponent))); } - + public static Item registerDrink(String name, int hunger, float saturation) { FoodComponent.Builder builder = new FoodComponent.Builder().hunger(hunger).saturationModifier(saturation); return registerDrink(name, builder.build()); } - public static Settings makeItemSettings() { - return new Item.Settings().group(CreativeTabs.TAB_ITEMS); - } - - public static Settings makeBlockItemSettings() { - return new Item.Settings().group(CreativeTabs.TAB_BLOCKS); + public static Properties makeItemSettings() { + return new Item.Properties().tab(CreativeTabs.TAB_ITEMS); + } + + public static Properties makeBlockItemSettings() { + return new Item.Properties().tab(CreativeTabs.TAB_BLOCKS); + } + + public static void register() { } - public static void register() {} - public static List getModBlocks() { return MOD_BLOCKS; } diff --git a/src/main/java/ru/betterend/registry/EndParticles.java b/src/main/java/ru/betterend/registry/EndParticles.java index ee8c6a2e..b08ef032 100644 --- a/src/main/java/ru/betterend/registry/EndParticles.java +++ b/src/main/java/ru/betterend/registry/EndParticles.java @@ -2,10 +2,10 @@ package ru.betterend.registry; import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry; import net.fabricmc.fabric.api.particle.v1.FabricParticleTypes; -import net.minecraft.particle.DefaultParticleType; -import net.minecraft.particle.ParticleEffect; -import net.minecraft.particle.ParticleType; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleType; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.core.Registry; import ru.betterend.BetterEnd; import ru.betterend.particle.FireflyParticle; import ru.betterend.particle.InfusionParticle; @@ -21,19 +21,20 @@ import ru.betterend.particle.PaticlePortalSphere; import ru.betterend.particle.SmaragdantParticle; public class EndParticles { - public static final DefaultParticleType GLOWING_SPHERE = register("glowing_sphere"); - public static final DefaultParticleType PORTAL_SPHERE = register("portal_sphere"); - public static final ParticleType INFUSION = register("infusion", FabricParticleTypes.complex(InfusionParticleType.PARAMETERS_FACTORY)); - public static final DefaultParticleType SULPHUR_PARTICLE = register("sulphur_particle"); - public static final DefaultParticleType GEYSER_PARTICLE = registerFar("geyser_particle"); - public static final DefaultParticleType SNOWFLAKE = register("snowflake"); - public static final DefaultParticleType AMBER_SPHERE = register("amber_sphere"); - public static final DefaultParticleType BLACK_SPORE = register("black_spore"); - public static final DefaultParticleType TENANEA_PETAL = register("tenanea_petal"); - public static final DefaultParticleType JUNGLE_SPORE = register("jungle_spore"); - public static final DefaultParticleType FIREFLY = register("firefly"); - public static final DefaultParticleType SMARAGDANT = register("smaragdant_particle"); - + public static final SimpleParticleType GLOWING_SPHERE = register("glowing_sphere"); + public static final SimpleParticleType PORTAL_SPHERE = register("portal_sphere"); + public static final ParticleType INFUSION = register("infusion", + FabricParticleTypes.complex(InfusionParticleType.PARAMETERS_FACTORY)); + public static final SimpleParticleType SULPHUR_PARTICLE = register("sulphur_particle"); + public static final SimpleParticleType GEYSER_PARTICLE = registerFar("geyser_particle"); + public static final SimpleParticleType SNOWFLAKE = register("snowflake"); + public static final SimpleParticleType AMBER_SPHERE = register("amber_sphere"); + public static final SimpleParticleType BLACK_SPORE = register("black_spore"); + public static final SimpleParticleType TENANEA_PETAL = register("tenanea_petal"); + public static final SimpleParticleType JUNGLE_SPORE = register("jungle_spore"); + public static final SimpleParticleType FIREFLY = register("firefly"); + public static final SimpleParticleType SMARAGDANT = register("smaragdant_particle"); + public static void register() { ParticleFactoryRegistry.getInstance().register(GLOWING_SPHERE, ParticleGlowingSphere.FactoryGlowingSphere::new); ParticleFactoryRegistry.getInstance().register(PORTAL_SPHERE, PaticlePortalSphere.FactoryPortalSphere::new); @@ -48,16 +49,16 @@ public class EndParticles { ParticleFactoryRegistry.getInstance().register(FIREFLY, FireflyParticle.FireflyParticleFactory::new); ParticleFactoryRegistry.getInstance().register(SMARAGDANT, SmaragdantParticle.SmaragdantParticleFactory::new); } - - private static DefaultParticleType register(String name) { + + private static SimpleParticleType register(String name) { return Registry.register(Registry.PARTICLE_TYPE, BetterEnd.makeID(name), FabricParticleTypes.simple()); } - - private static DefaultParticleType registerFar(String name) { + + private static SimpleParticleType registerFar(String name) { return Registry.register(Registry.PARTICLE_TYPE, BetterEnd.makeID(name), FabricParticleTypes.simple(true)); } - - private static ParticleType register(String name, ParticleType type) { + + private static ParticleType register(String name, ParticleType type) { return Registry.register(Registry.PARTICLE_TYPE, BetterEnd.makeID(name), type); } } diff --git a/src/main/java/ru/betterend/registry/EndPortals.java b/src/main/java/ru/betterend/registry/EndPortals.java index b75f1676..1e7cce4b 100644 --- a/src/main/java/ru/betterend/registry/EndPortals.java +++ b/src/main/java/ru/betterend/registry/EndPortals.java @@ -6,9 +6,9 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; import net.minecraft.server.MinecraftServer; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.Identifier; -import net.minecraft.world.World; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; import ru.betterend.BetterEnd; import ru.betterend.config.ConfigWriter; import ru.betterend.util.JsonFactory; @@ -16,10 +16,10 @@ import ru.betterend.util.MHelper; public class EndPortals { - public final static Identifier OVERWORLD_ID = World.OVERWORLD.getValue(); + public final static ResourceLocation OVERWORLD_ID = Level.OVERWORLD.getValue(); private static PortalInfo[] portals; - + public static void loadPortals() { File file = new File(ConfigWriter.MOD_CONFIG_DIR, "portals.json"); JsonObject json; @@ -42,26 +42,26 @@ public class EndPortals { portals[i] = new PortalInfo(array.get(i).getAsJsonObject()); } } - + public static int getCount() { return MHelper.max(portals.length - 1, 1); } - - public static ServerWorld getWorld(MinecraftServer server, int portalId) { + + public static ServerLevel getLevel(MinecraftServer server, int portalId) { if (portalId < 0 || portalId >= portals.length) { return server.getOverworld(); } - return portals[portalId].getWorld(server); + return portals[portalId].getLevel(server); } - public static Identifier getWorldId(int portalId) { + public static ResourceLocation getWorldId(int portalId) { if (portalId < 0 || portalId >= portals.length) { return OVERWORLD_ID; } return portals[portalId].dimension; } - - public static int getPortalIdByItem(Identifier item) { + + public static int getPortalIdByItem(ResourceLocation item) { for (int i = 0; i < portals.length; i++) { if (portals[i].item.equals(item)) { return i; @@ -69,7 +69,8 @@ public class EndPortals { } return 0; } - public static int getPortalIdByWorld(Identifier world) { + + public static int getPortalIdByWorld(ResourceLocation world) { for (int i = 0; i < portals.length; i++) { if (portals[i].dimension.equals(world)) { return i; @@ -77,12 +78,12 @@ public class EndPortals { } return 0; } - + public static int getColor(int state) { return portals[state].color; } - - public static boolean isAvailableItem(Identifier item) { + + public static boolean isAvailableItem(ResourceLocation item) { for (PortalInfo portal : portals) { if (portal.item.equals(item)) { return true; @@ -90,7 +91,7 @@ public class EndPortals { } return false; } - + private static JsonObject makeDefault(File file) { JsonObject jsonObject = new JsonObject(); JsonFactory.storeJson(file, jsonObject); @@ -100,46 +101,44 @@ public class EndPortals { JsonFactory.storeJson(file, jsonObject); return jsonObject; } - + private static PortalInfo makeDefault() { - return new PortalInfo(new Identifier("minecraft:overworld"), BetterEnd.makeID("eternal_crystal"), 255, 255, 255); + return new PortalInfo(new ResourceLocation("minecraft:overworld"), BetterEnd.makeID("eternal_crystal"), 255, + 255, 255); } - + private static class PortalInfo { - private final Identifier dimension; - private final Identifier item; + private final ResourceLocation dimension; + private final ResourceLocation item; private final int color; - private ServerWorld world; - + private ServerLevel world; + PortalInfo(JsonObject obj) { - this( - new Identifier(JsonFactory.getString(obj, "dimension", "minecraft:overworld")), - new Identifier(JsonFactory.getString(obj, "item", "betterend:eternal_crystal")), - JsonFactory.getInt(obj, "colorRed", 255), - JsonFactory.getInt(obj, "colorGreen", 255), - JsonFactory.getInt(obj, "colorBlue", 255) - ); + this(new ResourceLocation(JsonFactory.getString(obj, "dimension", "minecraft:overworld")), + new ResourceLocation(JsonFactory.getString(obj, "item", "betterend:eternal_crystal")), + JsonFactory.getInt(obj, "colorRed", 255), JsonFactory.getInt(obj, "colorGreen", 255), + JsonFactory.getInt(obj, "colorBlue", 255)); } - - PortalInfo(Identifier dimension, Identifier item, int r, int g, int b) { + + PortalInfo(ResourceLocation dimension, ResourceLocation item, int r, int g, int b) { this.dimension = dimension; this.item = item; this.color = MHelper.color(r, g, b); } - - ServerWorld getWorld(MinecraftServer server) { + + ServerLevel getLevel(MinecraftServer server) { if (world != null) { return world; } - for (ServerWorld world : server.getWorlds()) { - if (world.getRegistryKey().getValue().equals(dimension)) { + for (ServerLevel world : server.getWorlds()) { + if (world.dimension().location().equals(dimension)) { this.world = world; return world; } } return server.getOverworld(); } - + JsonObject toJson() { JsonObject obj = new JsonObject(); obj.addProperty("dimension", dimension.toString()); diff --git a/src/main/java/ru/betterend/registry/EndSounds.java b/src/main/java/ru/betterend/registry/EndSounds.java index fe2e5c71..5acdda1a 100644 --- a/src/main/java/ru/betterend/registry/EndSounds.java +++ b/src/main/java/ru/betterend/registry/EndSounds.java @@ -1,7 +1,7 @@ package ru.betterend.registry; import net.minecraft.sound.SoundEvent; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; import ru.betterend.BetterEnd; public class EndSounds { @@ -10,7 +10,7 @@ public class EndSounds { public static final SoundEvent MUSIC_WATER = register("music", "water"); public static final SoundEvent MUSIC_DARK = register("music", "dark"); public static final SoundEvent MUSIC_OPENSPACE = register("music", "openspace"); - + // Ambient public static final SoundEvent AMBIENT_FOGGY_MUSHROOMLAND = register("ambient", "foggy_mushroomland"); public static final SoundEvent AMBIENT_CHORUS_FOREST = register("ambient", "chorus_forest"); @@ -21,18 +21,19 @@ public class EndSounds { public static final SoundEvent AMBIENT_SULPHUR_SPRINGS = register("ambient", "sulphur_springs"); public static final SoundEvent AMBIENT_UMBRELLA_JUNGLE = register("ambient", "umbrella_jungle"); public static final SoundEvent AMBIENT_GLOWING_GRASSLANDS = register("ambient", "glowing_grasslands"); - + // Entity public static final SoundEvent ENTITY_DRAGONFLY = register("entity", "dragonfly"); public static final SoundEvent ENTITY_SHADOW_WALKER = register("entity", "shadow_walker"); public static final SoundEvent ENTITY_SHADOW_WALKER_DAMAGE = register("entity", "shadow_walker_damage"); public static final SoundEvent ENTITY_SHADOW_WALKER_DEATH = register("entity", "shadow_walker_death"); - + // Records public static final SoundEvent STRANGE_AND_ALIEN = register("record", "strange_and_alien"); - - public static void register() {} - + + public static void register() { + } + private static SoundEvent register(String type, String id) { id = "betterend." + type + "." + id; return Registry.register(Registry.SOUND_EVENT, id, new SoundEvent(BetterEnd.makeID(id))); diff --git a/src/main/java/ru/betterend/registry/EndStructures.java b/src/main/java/ru/betterend/registry/EndStructures.java index bc241280..aba3747f 100644 --- a/src/main/java/ru/betterend/registry/EndStructures.java +++ b/src/main/java/ru/betterend/registry/EndStructures.java @@ -4,8 +4,8 @@ import java.util.Collection; import java.util.function.Supplier; import net.minecraft.structure.StructurePieceType; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.GenerationStep.Feature; import net.minecraft.world.gen.feature.ConfiguredStructureFeature; @@ -30,30 +30,43 @@ public class EndStructures { public static final StructurePieceType MOUNTAIN_PIECE = register("mountain_piece", CrystalMountainPiece::new); public static final StructurePieceType CAVE_PIECE = register("cave_piece", CavePiece::new); public static final StructurePieceType LAKE_PIECE = register("lake_piece", LakePiece::new); - public static final StructurePieceType PAINTED_MOUNTAIN_PIECE = register("painted_mountain_piece", PaintedMountainPiece::new); + public static final StructurePieceType PAINTED_MOUNTAIN_PIECE = register("painted_mountain_piece", + PaintedMountainPiece::new); public static final StructurePieceType NBT_PIECE = register("nbt_piece", NBTPiece::new); - - public static final EndStructureFeature GIANT_MOSSY_GLOWSHROOM = new EndStructureFeature("giant_mossy_glowshroom", new GiantMossyGlowshroomStructure(), Feature.SURFACE_STRUCTURES, 16, 8); - public static final EndStructureFeature MEGALAKE = new EndStructureFeature("megalake", new MegaLakeStructure(), Feature.RAW_GENERATION, 4, 1); - public static final EndStructureFeature MEGALAKE_SMALL = new EndStructureFeature("megalake_small", new MegaLakeSmallStructure(), Feature.RAW_GENERATION, 4, 1); - public static final EndStructureFeature MOUNTAIN = new EndStructureFeature("mountain", new MountainStructure(), Feature.RAW_GENERATION, 3, 2); - public static final EndStructureFeature PAINTED_MOUNTAIN = new EndStructureFeature("painted_mountain", new PaintedMountainStructure(), Feature.RAW_GENERATION, 3, 2); - public static final EndStructureFeature ETERNAL_PORTAL = new EndStructureFeature("eternal_portal", new EternalPortalStructure(), Feature.SURFACE_STRUCTURES, 16, 6); - public static final EndStructureFeature GIANT_ICE_STAR = new EndStructureFeature("giant_ice_star", new GiantIceStarStructure(), Feature.SURFACE_STRUCTURES, 16, 8); - - public static void register() {} - + + public static final EndStructureFeature GIANT_MOSSY_GLOWSHROOM = new EndStructureFeature("giant_mossy_glowshroom", + new GiantMossyGlowshroomStructure(), Feature.SURFACE_STRUCTURES, 16, 8); + public static final EndStructureFeature MEGALAKE = new EndStructureFeature("megalake", new MegaLakeStructure(), + Feature.RAW_GENERATION, 4, 1); + public static final EndStructureFeature MEGALAKE_SMALL = new EndStructureFeature("megalake_small", + new MegaLakeSmallStructure(), Feature.RAW_GENERATION, 4, 1); + public static final EndStructureFeature MOUNTAIN = new EndStructureFeature("mountain", new MountainStructure(), + Feature.RAW_GENERATION, 3, 2); + public static final EndStructureFeature PAINTED_MOUNTAIN = new EndStructureFeature("painted_mountain", + new PaintedMountainStructure(), Feature.RAW_GENERATION, 3, 2); + public static final EndStructureFeature ETERNAL_PORTAL = new EndStructureFeature("eternal_portal", + new EternalPortalStructure(), Feature.SURFACE_STRUCTURES, 16, 6); + public static final EndStructureFeature GIANT_ICE_STAR = new EndStructureFeature("giant_ice_star", + new GiantIceStarStructure(), Feature.SURFACE_STRUCTURES, 16, 8); + + public static void register() { + } + private static StructurePieceType register(String id, StructurePieceType pieceType) { return Registry.register(Registry.STRUCTURE_PIECE, BetterEnd.makeID(id), pieceType); } - - public static void registerBiomeStructures(Identifier id, Biome biome, Collection>> structures) { + + public static void registerBiomeStructures(ResourceLocation id, Biome biome, + Collection>> structures) { if (!id.getPath().contains("mountain") && !id.getPath().contains("lake")) { addStructure(ETERNAL_PORTAL, structures); } } - - private static void addStructure(EndStructureFeature feature, Collection>> structures) { - structures.add(() -> { return feature.getFeatureConfigured(); }); + + private static void addStructure(EndStructureFeature feature, + Collection>> structures) { + structures.add(() -> { + return feature.getFeatureConfigured(); + }); } } diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index b2f5f6a2..1c6cd6e1 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -5,19 +5,19 @@ import java.util.Arrays; 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.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.block.LeavesBlock; -import net.minecraft.block.Material; -import net.minecraft.item.BlockItem; -import net.minecraft.item.FoodComponent; -import net.minecraft.item.Item; -import net.minecraft.tag.BlockTags; -import net.minecraft.tag.ItemTags; -import net.minecraft.tag.Tag; -import net.minecraft.tag.Tag.Identified; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +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.material.Material; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.FoodComponent; +import net.minecraft.world.item.Item; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.Tag; +import net.minecraft.tags.Tag.Identified; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome.Category; import net.minecraft.world.gen.surfacebuilder.SurfaceConfig; @@ -32,7 +32,7 @@ import ru.betterend.util.TagHelper; public class EndTags { // Table with common (c) tags: // https://fabricmc.net/wiki/tutorial:tags - + // Block Tags public static final Tag.Identified BOOKSHELVES = makeCommonBlockTag("bookshelves"); public static final Tag.Identified GEN_TERRAIN = makeBlockTag("gen_terrain"); @@ -41,72 +41,69 @@ public class EndTags { public static final Tag.Identified BLOCK_CHEST = makeCommonBlockTag("chest"); public static final Tag.Identified END_STONES = makeCommonBlockTag("end_stones"); public static final Tag.Identified DRAGON_IMMUNE = getMCBlockTag("dragon_immune"); - + // Item Tags public static final Tag.Identified ITEM_CHEST = makeCommonItemTag("chest"); public static final Tag.Identified IRON_INGOTS = makeCommonItemTag("iron_ingots"); public static final Tag.Identified FURNACES = makeCommonItemTag("furnaces"); public final static Tag HAMMERS = registerFabricItemTag("hammers"); - + public static Tag.Identified makeBlockTag(String name) { - Identifier id = BetterEnd.makeID(name); + ResourceLocation id = BetterEnd.makeID(name); Tag tag = BlockTags.getTagGroup().getTag(id); return tag == null ? (Identified) TagRegistry.block(id) : (Identified) tag; } - + public static Tag.Identified makeItemTag(String name) { - Identifier id = BetterEnd.makeID(name); + ResourceLocation id = BetterEnd.makeID(name); Tag tag = ItemTags.getTagGroup().getTag(id); return tag == null ? (Identified) TagRegistry.item(id) : (Identified) tag; } - + public static Tag.Identified makeCommonBlockTag(String name) { - Identifier id = new Identifier("c", name); + ResourceLocation id = new ResourceLocation("c", name); Tag tag = BlockTags.getTagGroup().getTag(id); return tag == null ? (Identified) TagRegistry.block(id) : (Identified) tag; } - + public static Tag.Identified makeCommonItemTag(String name) { - Identifier id = new Identifier("c", name); + ResourceLocation id = new ResourceLocation("c", name); Tag tag = ItemTags.getTagGroup().getTag(id); return tag == null ? (Identified) TagRegistry.item(id) : (Identified) tag; } - + public static Tag.Identified getMCBlockTag(String name) { - Identifier id = new Identifier(name); + ResourceLocation id = new ResourceLocation(name); Tag tag = BlockTags.getTagGroup().getTag(id); return tag == null ? (Identified) TagRegistry.block(id) : (Identified) tag; } - + public static void register() { addSurfaceBlock(Blocks.END_STONE); addSurfaceBlock(EndBlocks.THALLASIUM.ore); addSurfaceBlock(EndBlocks.ENDSTONE_DUST); addSurfaceBlock(EndBlocks.AMBER_ORE); - + EndItems.getModBlocks().forEach((item) -> { Block block = ((BlockItem) item).getBlock(); if (block instanceof EndTerrainBlock) { addSurfaceBlock(block); TagHelper.addTag(BlockTags.NYLIUM, block); - } - else if (block instanceof LeavesBlock || block instanceof SimpleLeavesBlock) { + } else if (block instanceof LeavesBlock || block instanceof SimpleLeavesBlock) { TagHelper.addTag(BlockTags.LEAVES, block); ComposterBlockAccessor.callRegisterCompostableItem(0.3F, block); - } - else if (block instanceof VineBlock) { + } else if (block instanceof VineBlock) { TagHelper.addTag(BlockTags.CLIMBABLE, block); - } - else if (block instanceof PedestalBlock) { + } else if (block instanceof PedestalBlock) { TagHelper.addTag(PEDESTALS, block); } - - Material mat = block.getDefaultState().getMaterial(); + + Material mat = block.defaultBlockState().getMaterial(); if (mat.equals(Material.PLANT) || mat.equals(Material.REPLACEABLE_PLANT)) { ComposterBlockAccessor.callRegisterCompostableItem(0.1F, block); } }); - + EndItems.getModItems().forEach((item) -> { if (item.isFood()) { FoodComponent food = item.getFoodComponent(); @@ -114,36 +111,31 @@ public class EndTags { ComposterBlockAccessor.callRegisterCompostableItem(compost, item); } }); - - TagHelper.addTag(GEN_TERRAIN, EndBlocks.ENDER_ORE, EndBlocks.FLAVOLITE.stone, EndBlocks.VIOLECITE.stone, EndBlocks.SULPHURIC_ROCK.stone, EndBlocks.BRIMSTONE); + + TagHelper.addTag(GEN_TERRAIN, EndBlocks.ENDER_ORE, EndBlocks.FLAVOLITE.stone, EndBlocks.VIOLECITE.stone, + EndBlocks.SULPHURIC_ROCK.stone, EndBlocks.BRIMSTONE); TagHelper.addTag(END_GROUND, EndBlocks.SULPHURIC_ROCK.stone, EndBlocks.BRIMSTONE); - ToolManagerImpl.tag(HAMMERS).register(new ModdedToolsVanillaBlocksToolHandler( - Arrays.asList( - EndItems.IRON_HAMMER, - EndItems.GOLDEN_HAMMER, - EndItems.DIAMOND_HAMMER, - EndItems.NETHERITE_HAMMER, - EndItems.AETERNIUM_HAMMER, - EndBlocks.THALLASIUM.hammer, - EndBlocks.TERMINITE.hammer - ) - )); - + ToolManagerImpl.tag(HAMMERS) + .register(new ModdedToolsVanillaBlocksToolHandler(Arrays.asList(EndItems.IRON_HAMMER, + EndItems.GOLDEN_HAMMER, EndItems.DIAMOND_HAMMER, EndItems.NETHERITE_HAMMER, + EndItems.AETERNIUM_HAMMER, EndBlocks.THALLASIUM.hammer, EndBlocks.TERMINITE.hammer))); + TagHelper.addTag(FURNACES, Blocks.FURNACE); TagHelper.addTag(BlockTags.ANVIL, EndBlocks.AETERNIUM_ANVIL); - + TagHelper.addTag(BlockTags.BEACON_BASE_BLOCKS, EndBlocks.AETERNIUM_BLOCK); TagHelper.addTag(ItemTags.BEACON_PAYMENT_ITEMS, EndItems.AETERNIUM_INGOT); - - TagHelper.addTag(EndTags.DRAGON_IMMUNE, EndBlocks.ENDER_ORE, EndBlocks.ETERNAL_PEDESTAL, EndBlocks.FLAVOLITE_RUNED_ETERNAL, EndBlocks.FLAVOLITE_RUNED); + + TagHelper.addTag(EndTags.DRAGON_IMMUNE, EndBlocks.ENDER_ORE, EndBlocks.ETERNAL_PEDESTAL, + EndBlocks.FLAVOLITE_RUNED_ETERNAL, EndBlocks.FLAVOLITE_RUNED); } - + public static void addSurfaceBlock(Block block) { TagHelper.addTag(END_GROUND, block); TagHelper.addTag(GEN_TERRAIN, block); } - + public static void addTerrainTags(Registry biomeRegistry) { biomeRegistry.forEach((biome) -> { if (biome.getCategory() == Category.THEEND) { @@ -156,8 +148,8 @@ public class EndTags { }); END_STONES.values().forEach(EndTags::addSurfaceBlock); } - + public static Tag registerFabricItemTag(String name) { - return TagRegistry.item(new Identifier("fabric", name)); + return TagRegistry.item(new ResourceLocation("fabric", name)); } } diff --git a/src/main/java/ru/betterend/registry/FilaluxBlock.java b/src/main/java/ru/betterend/registry/FilaluxBlock.java index 6b854712..eeb40f93 100644 --- a/src/main/java/ru/betterend/registry/FilaluxBlock.java +++ b/src/main/java/ru/betterend/registry/FilaluxBlock.java @@ -1,13 +1,13 @@ package ru.betterend.registry; -import net.minecraft.block.AbstractBlock; +import net.minecraft.world.level.block.AbstractBlock; import ru.betterend.blocks.basis.VineBlock; public class FilaluxBlock extends VineBlock { public FilaluxBlock() { super(15, true); } - + @Override public AbstractBlock.OffsetType getOffsetType() { return AbstractBlock.OffsetType.NONE; diff --git a/src/main/java/ru/betterend/registry/FilaluxWingsBlock.java b/src/main/java/ru/betterend/registry/FilaluxWingsBlock.java index 6ec82a17..12a8e20b 100644 --- a/src/main/java/ru/betterend/registry/FilaluxWingsBlock.java +++ b/src/main/java/ru/betterend/registry/FilaluxWingsBlock.java @@ -6,36 +6,37 @@ import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockView; +import net.minecraft.world.level.BlockGetter; import ru.betterend.blocks.basis.AttachedBlock; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; public class FilaluxWingsBlock extends AttachedBlock implements IRenderTypeable { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); - + public FilaluxWingsBlock() { - super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).sounds(BlockSoundGroup.WET_GRASS).noCollision()); + super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).sounds(SoundType.WET_GRASS) + .noCollision()); } @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - return BOUNDING_SHAPES.get(state.get(FACING)); + return BOUNDING_SHAPES.get(state.getValue(FACING)); } - + static { BOUNDING_SHAPES.put(Direction.UP, VoxelShapes.cuboid(0.0, 0.0, 0.0, 1.0, 0.5, 1.0)); BOUNDING_SHAPES.put(Direction.DOWN, VoxelShapes.cuboid(0.0, 0.5, 0.0, 1.0, 1.0, 1.0)); diff --git a/src/main/java/ru/betterend/registry/PondAnemoneBlock.java b/src/main/java/ru/betterend/registry/PondAnemoneBlock.java index 62d2ef2f..8b6073cb 100644 --- a/src/main/java/ru/betterend/registry/PondAnemoneBlock.java +++ b/src/main/java/ru/betterend/registry/PondAnemoneBlock.java @@ -6,56 +6,52 @@ 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.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.block.ShapeContext; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.AbstractBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.ShapeContext; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.core.BlockPos; import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; import ru.betterend.blocks.basis.UnderwaterPlantBlock; public class PondAnemoneBlock extends UnderwaterPlantBlock { private static final VoxelShape SHAPE = Block.createCuboidShape(2, 0, 2, 14, 14, 14); - + public PondAnemoneBlock() { - super(FabricBlockSettings.of(Material.UNDERWATER_PLANT) - .breakByTool(FabricToolTags.SHEARS) - .sounds(BlockSoundGroup.CORAL) - .breakByHand(true) - .luminance(13) - .noCollision()); + super(FabricBlockSettings.of(Material.UNDERWATER_PLANT).breakByTool(FabricToolTags.SHEARS) + .sounds(SoundType.CORAL).breakByHand(true).luminance(13).noCollision()); } - + @Override public AbstractBlock.OffsetType getOffsetType() { return AbstractBlock.OffsetType.NONE; } @Environment(EnvType.CLIENT) - public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { + public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { double x = pos.getX() + random.nextDouble(); double y = pos.getY() + random.nextDouble() * 0.5F + 0.5F; double z = pos.getZ() + random.nextDouble(); world.addParticle(ParticleTypes.BUBBLE, x, y, z, 0.0D, 0.0D, 0.0D); } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { return SHAPE; } - + @Override public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { return false; } @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { + public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { return false; } } diff --git a/src/main/java/ru/betterend/rituals/EternalRitual.java b/src/main/java/ru/betterend/rituals/EternalRitual.java index ab031512..34430016 100644 --- a/src/main/java/ru/betterend/rituals/EternalRitual.java +++ b/src/main/java/ru/betterend/rituals/EternalRitual.java @@ -14,28 +14,28 @@ import org.jetbrains.annotations.Nullable; import com.google.common.collect.Sets; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.item.Item; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.item.Item; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtHelper; -import net.minecraft.particle.BlockStateParticleEffect; -import net.minecraft.particle.ParticleEffect; -import net.minecraft.particle.ParticleTypes; +import net.minecraft.core.particles.BlockStateParticleEffect; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleTypes; import net.minecraft.server.MinecraftServer; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; +import net.minecraft.sounds.SoundEvents; import net.minecraft.state.property.BooleanProperty; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.registry.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; import net.minecraft.world.Heightmap; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.gen.feature.ConfiguredFeatures; import ru.betterend.BetterEnd; import ru.betterend.blocks.BlockProperties; @@ -47,22 +47,15 @@ import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndPortals; public class EternalRitual { - private final static Set STRUCTURE_MAP = Sets.newHashSet( - new Point(-4, -5), new Point(-4, 5), new Point(-6, 0), - new Point(4, -5), new Point(4, 5), new Point(6, 0)); - private final static Set FRAME_MAP = Sets.newHashSet( - new Point(0, 0), new Point(0, 6), new Point(1, 0), - new Point(1, 6), new Point(2, 1), new Point(2, 5), - new Point(3, 2), new Point(3, 3), new Point(3, 4)); - private final static Set PORTAL_MAP = Sets.newHashSet( - new Point(0, 0), new Point(0, 1), new Point(0, 2), - new Point(0, 3), new Point(0, 4), new Point(1, 0), - new Point(1, 1), new Point(1, 2), new Point(1, 3), - new Point(1, 4), new Point(2, 1), new Point(2, 2), - new Point(2, 3)); - private final static Set BASE_MAP = Sets.newHashSet( - new Point(3, 0), new Point(2, 0), new Point(2, 1), new Point(1, 1), - new Point(1, 2), new Point(0, 1), new Point(0, 2)); + private final static Set STRUCTURE_MAP = Sets.newHashSet(new Point(-4, -5), new Point(-4, 5), + new Point(-6, 0), new Point(4, -5), new Point(4, 5), new Point(6, 0)); + private final static Set FRAME_MAP = Sets.newHashSet(new Point(0, 0), new Point(0, 6), new Point(1, 0), + new Point(1, 6), new Point(2, 1), new Point(2, 5), new Point(3, 2), new Point(3, 3), new Point(3, 4)); + private final static Set PORTAL_MAP = Sets.newHashSet(new Point(0, 0), new Point(0, 1), new Point(0, 2), + new Point(0, 3), new Point(0, 4), new Point(1, 0), new Point(1, 1), new Point(1, 2), new Point(1, 3), + new Point(1, 4), new Point(2, 1), new Point(2, 2), new Point(2, 3)); + private final static Set BASE_MAP = Sets.newHashSet(new Point(3, 0), new Point(2, 0), new Point(2, 1), + new Point(1, 1), new Point(1, 2), new Point(0, 1), new Point(0, 2)); private final static Block BASE = EndBlocks.FLAVOLITE.tiles; private final static Block PEDESTAL = EndBlocks.ETERNAL_PEDESTAL; @@ -72,51 +65,50 @@ public class EternalRitual { public final static int SEARCH_RADIUS = calculateSearchSteps(48); - private World world; + private Level world; private Direction.Axis axis; - private Identifier targetWorldId; + private ResourceLocation targetWorldId; private BlockPos center; private BlockPos exit; private boolean active = false; - public EternalRitual(World world) { + public EternalRitual(Level world) { this.world = world; } - public EternalRitual(World world, BlockPos initial) { + public EternalRitual(Level world, BlockPos initial) { this(world); this.configure(initial); } - public void setWorld(World world) { + public void setWorld(Level world) { this.world = world; } @Nullable - public Identifier getTargetWorldId() { + public ResourceLocation getTargetWorldId() { return targetWorldId; } private boolean isInvalid() { - return world == null || world.isClient() || - center == null || axis == null; + return world == null || world.isClientSide() || center == null || axis == null; } public void checkStructure() { - if (isInvalid()) return; + if (isInvalid()) + return; Direction moveX, moveY; if (Direction.Axis.X == axis) { moveX = Direction.EAST; moveY = Direction.NORTH; - } - else { + } else { moveX = Direction.SOUTH; moveY = Direction.EAST; } - boolean valid = checkFrame(world, center.down()); + boolean valid = checkFrame(world, center.below()); Item item = null; for (Point pos : STRUCTURE_MAP) { - BlockPos.Mutable checkPos = center.mutableCopy(); + BlockPos.MutableBlockPos checkPos = center.mutable(); checkPos.move(moveX, pos.x).move(moveY, pos.y); valid &= isActive(checkPos); if (valid) { @@ -136,14 +128,14 @@ public class EternalRitual { } } - private boolean checkFrame(World world, BlockPos framePos) { + private boolean checkFrame(Level world, BlockPos framePos) { Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH : Direction.EAST; boolean valid = true; for (Point point : FRAME_MAP) { - BlockPos pos = framePos.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); + BlockPos pos = framePos.mutable().move(moveDir, point.x).move(Direction.UP, point.y); BlockState state = world.getBlockState(pos); valid &= state.getBlock() instanceof RunedFlavolite; - pos = framePos.mutableCopy().move(moveDir, -point.x).move(Direction.UP, point.y); + pos = framePos.mutable().move(moveDir, -point.x).move(Direction.UP, point.y); state = world.getBlockState(pos); valid &= state.getBlock() instanceof RunedFlavolite; } @@ -155,25 +147,26 @@ public class EternalRitual { } private void activatePortal(Item keyItem) { - if (active) return; - Identifier itemId = Registry.ITEM.getId(keyItem); + if (active) + return; + ResourceLocation itemId = Registry.ITEM.getId(keyItem); int portalId = EndPortals.getPortalIdByItem(itemId); - World targetWorld = getTargetWorld(portalId); - Identifier worldId = targetWorld.getRegistryKey().getValue(); + Level targetWorld = getTargetWorld(portalId); + ResourceLocation worldId = targetWorld.dimension().location(); try { if (exit == null) { initPortal(worldId, portalId); } else { if (!worldId.equals(targetWorldId)) { initPortal(worldId, portalId); - } else if (!checkFrame(targetWorld, exit.down())) { + } else if (!checkFrame(targetWorld, exit.below())) { Direction.Axis portalAxis = (Direction.Axis.X == axis) ? Direction.Axis.Z : Direction.Axis.X; generatePortal(targetWorld, exit, portalAxis, portalId); } activatePortal(targetWorld, exit, portalId); } activatePortal(world, center, portalId); - doEffects((ServerWorld) world, center); + doEffects((ServerLevel) world, center); active = true; } catch (Exception ex) { BetterEnd.LOGGER.error("Create End portals error.", ex); @@ -183,95 +176,102 @@ public class EternalRitual { } } - private void initPortal(Identifier worldId, int portalId) { + private void initPortal(ResourceLocation worldId, int portalId) { targetWorldId = worldId; exit = findPortalPos(portalId); } - private void doEffects(ServerWorld serverWorld, BlockPos center) { + private void doEffects(ServerLevel serverWorld, BlockPos center) { Direction moveX, moveY; if (Direction.Axis.X == axis) { moveX = Direction.EAST; moveY = Direction.NORTH; - } - else { + } else { moveX = Direction.SOUTH; moveY = Direction.EAST; } for (Point pos : STRUCTURE_MAP) { - BlockPos.Mutable p = center.mutableCopy(); + BlockPos.MutableBlockPos p = center.mutable(); p.move(moveX, pos.x).move(moveY, pos.y); - serverWorld.spawnParticles(ParticleTypes.PORTAL, p.getX() + 0.5, p.getY() + 1.5, p.getZ() + 0.5, 20, 0, 0, 0, 1); - serverWorld.spawnParticles(ParticleTypes.REVERSE_PORTAL, p.getX() + 0.5, p.getY() + 1.5, p.getZ() + 0.5, 20, 0, 0, 0, 0.3); + serverWorld.sendParticles(ParticleTypes.PORTAL, p.getX() + 0.5, p.getY() + 1.5, p.getZ() + 0.5, 20, 0, 0, 0, + 1); + serverWorld.sendParticles(ParticleTypes.REVERSE_PORTAL, p.getX() + 0.5, p.getY() + 1.5, p.getZ() + 0.5, 20, + 0, 0, 0, 0.3); } - serverWorld.playSound(null, center, SoundEvents.BLOCK_END_PORTAL_SPAWN, SoundCategory.NEUTRAL, 16, 1); + serverWorld.playSound(null, center, SoundEvents.BLOCK_END_PORTAL_SPAWN, SoundSource.NEUTRAL, 16, 1); } - private void activatePortal(World world, BlockPos center, int portalId) { - BlockPos framePos = center.down(); + private void activatePortal(Level world, BlockPos center, int portalId) { + BlockPos framePos = center.below(); Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH : Direction.EAST; - BlockState frame = FRAME.getDefaultState().with(ACTIVE, true); + BlockState frame = FRAME.defaultBlockState().with(ACTIVE, true); FRAME_MAP.forEach(point -> { - BlockPos pos = framePos.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); + BlockPos pos = framePos.mutable().move(moveDir, point.x).move(Direction.UP, point.y); BlockState state = world.getBlockState(pos); - if (state.contains(ACTIVE) && !state.get(ACTIVE)) { - world.setBlockState(pos, frame); + if (state.contains(ACTIVE) && !state.getValue(ACTIVE)) { + world.setBlockAndUpdate(pos, frame); } - pos = framePos.mutableCopy().move(moveDir, -point.x).move(Direction.UP, point.y); + pos = framePos.mutable().move(moveDir, -point.x).move(Direction.UP, point.y); state = world.getBlockState(pos); - if (state.contains(ACTIVE) && !state.get(ACTIVE)) { - world.setBlockState(pos, frame); + if (state.contains(ACTIVE) && !state.getValue(ACTIVE)) { + world.setBlockAndUpdate(pos, frame); } }); Direction.Axis portalAxis = Direction.Axis.X == axis ? Direction.Axis.Z : Direction.Axis.X; - BlockState portal = PORTAL.getDefaultState().with(EndPortalBlock.AXIS, portalAxis).with(EndPortalBlock.PORTAL, portalId); - ParticleEffect effect = new BlockStateParticleEffect(ParticleTypes.BLOCK, portal); - ServerWorld serverWorld = (ServerWorld) world; + BlockState portal = PORTAL.defaultBlockState().with(EndPortalBlock.AXIS, portalAxis).with(EndPortalBlock.PORTAL, + portalId); + ParticleOptions effect = new BlockStateParticleEffect(ParticleTypes.BLOCK, portal); + ServerLevel serverWorld = (ServerLevel) world; PORTAL_MAP.forEach(point -> { - BlockPos pos = center.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); - if (!world.getBlockState(pos).isOf(PORTAL)) { - world.setBlockState(pos, portal); - serverWorld.spawnParticles(effect, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 10, 0.5, 0.5, 0.5, 0.1); - serverWorld.spawnParticles(ParticleTypes.REVERSE_PORTAL, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 10, 0.5, 0.5, 0.5, 0.3); + BlockPos pos = center.mutable().move(moveDir, point.x).move(Direction.UP, point.y); + if (!world.getBlockState(pos).is(PORTAL)) { + world.setBlockAndUpdate(pos, portal); + serverWorld.sendParticles(effect, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 10, 0.5, 0.5, + 0.5, 0.1); + serverWorld.sendParticles(ParticleTypes.REVERSE_PORTAL, pos.getX() + 0.5, pos.getY() + 0.5, + pos.getZ() + 0.5, 10, 0.5, 0.5, 0.5, 0.3); } - pos = center.mutableCopy().move(moveDir, -point.x).move(Direction.UP, point.y); - if (!world.getBlockState(pos).isOf(PORTAL)) { - world.setBlockState(pos, portal); - serverWorld.spawnParticles(effect, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 10, 0.5, 0.5, 0.5, 0.1); - serverWorld.spawnParticles(ParticleTypes.REVERSE_PORTAL, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 10, 0.5, 0.5, 0.5, 0.3); + pos = center.mutable().move(moveDir, -point.x).move(Direction.UP, point.y); + if (!world.getBlockState(pos).is(PORTAL)) { + world.setBlockAndUpdate(pos, portal); + serverWorld.sendParticles(effect, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 10, 0.5, 0.5, + 0.5, 0.1); + serverWorld.sendParticles(ParticleTypes.REVERSE_PORTAL, pos.getX() + 0.5, pos.getY() + 0.5, + pos.getZ() + 0.5, 10, 0.5, 0.5, 0.5, 0.3); } }); } public void disablePortal(int state) { - if (!active || isInvalid()) return; + if (!active || isInvalid()) + return; removePortal(getTargetWorld(state), exit); removePortal(world, center); } - private void removePortal(World world, BlockPos center) { - BlockPos framePos = center.down(); + private void removePortal(Level world, BlockPos center) { + BlockPos framePos = center.below(); Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH : Direction.EAST; FRAME_MAP.forEach(point -> { - BlockPos pos = framePos.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); + BlockPos pos = framePos.mutable().move(moveDir, point.x).move(Direction.UP, point.y); BlockState state = world.getBlockState(pos); - if (state.isOf(FRAME) && state.get(ACTIVE)) { - world.setBlockState(pos, state.with(ACTIVE, false)); + if (state.is(FRAME) && state.getValue(ACTIVE)) { + world.setBlockAndUpdate(pos, state.with(ACTIVE, false)); } - pos = framePos.mutableCopy().move(moveDir, -point.x).move(Direction.UP, point.y); + pos = framePos.mutable().move(moveDir, -point.x).move(Direction.UP, point.y); state = world.getBlockState(pos); - if (state.isOf(FRAME) && state.get(ACTIVE)) { - world.setBlockState(pos, state.with(ACTIVE, false)); + if (state.is(FRAME) && state.getValue(ACTIVE)) { + world.setBlockAndUpdate(pos, state.with(ACTIVE, false)); } }); PORTAL_MAP.forEach(point -> { - BlockPos pos = center.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); - if (world.getBlockState(pos).isOf(PORTAL)) { + BlockPos pos = center.mutable().move(moveDir, point.x).move(Direction.UP, point.y); + if (world.getBlockState(pos).is(PORTAL)) { world.removeBlock(pos, false); } - pos = center.mutableCopy().move(moveDir, -point.x).move(Direction.UP, point.y); - if (world.getBlockState(pos).isOf(PORTAL)) { + pos = center.mutable().move(moveDir, -point.x).move(Direction.UP, point.y); + if (world.getBlockState(pos).is(PORTAL)) { world.removeBlock(pos, false); } }); @@ -279,10 +279,10 @@ public class EternalRitual { } @Nullable - private BlockPos findFrame(World world, BlockPos.Mutable startPos) { - List foundPos = findAllBlockPos(world, startPos, (SEARCH_RADIUS >> 4) + 1, FRAME, - blockState -> blockState.isOf(FRAME) && !blockState.get(ACTIVE)); - for(BlockPos.Mutable testPos : foundPos) { + private BlockPos findFrame(Level world, BlockPos.MutableBlockPos startPos) { + List foundPos = findAllBlockPos(world, startPos, (SEARCH_RADIUS >> 4) + 1, FRAME, + blockState -> blockState.is(FRAME) && !blockState.get(ACTIVE)); + for (BlockPos.MutableBlockPos testPos : foundPos) { if (checkFrame(world, testPos)) { return testPos; } @@ -292,11 +292,12 @@ public class EternalRitual { private BlockPos findPortalPos(int portalId) { MinecraftServer server = world.getServer(); - ServerWorld targetWorld = (ServerWorld) getTargetWorld(portalId); - Registry registry = Objects.requireNonNull(server).getRegistryManager().getDimensionTypes(); - double multiplier = Objects.requireNonNull(registry.get(targetWorldId)).getCoordinateScale(); - BlockPos.Mutable basePos = center.mutableCopy().set(center.getX() / multiplier, center.getY(), center.getZ() / multiplier); - BlockPos framePos = findFrame(targetWorld, basePos.mutableCopy()); + ServerLevel targetWorld = (ServerLevel) getTargetWorld(portalId); + Registry registry = Objects.requireNonNull(server).registryAccess().dimensionTypes(); + double multiplier = Objects.requireNonNull(registry.get(targetWorldId)).coordinateScale(); + BlockPos.MutableBlockPos basePos = center.mutable().set(center.getX() / multiplier, center.getY(), + center.getZ() / multiplier); + BlockPos framePos = findFrame(targetWorld, basePos.mutable()); if (framePos != null) { return framePos.up(); } @@ -307,19 +308,22 @@ public class EternalRitual { return basePos.toImmutable(); } else { Direction direction = Direction.EAST; - BlockPos.Mutable checkPos = basePos.mutableCopy(); + BlockPos.MutableBlockPos checkPos = basePos.mutable(); int radius = (int) ((SEARCH_RADIUS / multiplier) + 1); for (int step = 1; step < radius; step++) { for (int i = 0; i < (step >> 1); i++) { Chunk chunk = targetWorld.getChunk(checkPos); if (chunk != null) { - int surfaceY = chunk.sampleHeightmap(Heightmap.Type.WORLD_SURFACE, checkPos.getX() & 15, checkPos.getZ() & 15); - int motionY = chunk.sampleHeightmap(Heightmap.Type.MOTION_BLOCKING, checkPos.getX() & 15, checkPos.getZ() & 15); + int surfaceY = chunk.sampleHeightmap(Heightmap.Type.WORLD_SURFACE, checkPos.getX() & 15, + checkPos.getZ() & 15); + int motionY = chunk.sampleHeightmap(Heightmap.Type.MOTION_BLOCKING, checkPos.getX() & 15, + checkPos.getZ() & 15); int ceil = Math.min(Math.max(surfaceY, motionY) + 1, worldCeil); - if (ceil < 5) continue; + if (ceil < 5) + continue; checkPos.setY(ceil); while (checkPos.getY() >= 5) { - if(checkIsAreaValid(targetWorld, checkPos, portalAxis)) { + if (checkIsAreaValid(targetWorld, checkPos, portalAxis)) { generatePortal(targetWorld, checkPos, portalAxis, portalId); return checkPos.toImmutable(); } @@ -328,46 +332,50 @@ public class EternalRitual { } checkPos.move(direction); } - direction = direction.rotateYClockwise(); + direction = direction.getClockWise(); } } - if (targetWorld.getRegistryKey() == World.END) { - ConfiguredFeatures.END_ISLAND.generate(targetWorld, targetWorld.getChunkManager().getChunkGenerator(), new Random(basePos.asLong()), basePos.down()); - } else if (targetWorld.getRegistryKey() == World.OVERWORLD) { - basePos.setY(targetWorld.getChunk(basePos).sampleHeightmap(Heightmap.Type.WORLD_SURFACE, basePos.getX(), basePos.getZ()) + 1); + if (targetWorld.dimension() == Level.END) { + ConfiguredFeatures.END_ISLAND.generate(targetWorld, targetWorld.getChunkManager().getChunkGenerator(), + new Random(basePos.asLong()), basePos.below()); + } else if (targetWorld.dimension() == Level.OVERWORLD) { + basePos.setY(targetWorld.getChunk(basePos).sampleHeightmap(Heightmap.Type.WORLD_SURFACE, basePos.getX(), + basePos.getZ()) + 1); } - EndFeatures.BIOME_ISLAND.getFeatureConfigured().generate(targetWorld, targetWorld.getChunkManager().getChunkGenerator(), new Random(basePos.asLong()), basePos.down()); + EndFeatures.BIOME_ISLAND.getFeatureConfigured().generate(targetWorld, + targetWorld.getChunkManager().getChunkGenerator(), new Random(basePos.asLong()), basePos.below()); generatePortal(targetWorld, basePos, portalAxis, portalId); return basePos.toImmutable(); } - private World getTargetWorld(int state) { - if (world.getRegistryKey() == World.END) { - return EndPortals.getWorld(world.getServer(), state); + private Level getTargetWorld(int state) { + if (world.dimension() == Level.END) { + return EndPortals.getLevel(world.getServer(), state); } - return Objects.requireNonNull(world.getServer()).getWorld(World.END); + return Objects.requireNonNull(world.getServer()).getLevel(Level.END); } - private boolean checkIsAreaValid(World world, BlockPos pos, Direction.Axis axis) { - if (pos.getY() >= world.getDimensionHeight() - 1) return false; - if (!isBaseValid(world, pos, axis)) return false; + private boolean checkIsAreaValid(Level world, BlockPos pos, Direction.Axis axis) { + if (pos.getY() >= world.getDimensionHeight() - 1) + return false; + if (!isBaseValid(world, pos, axis)) + return false; return EternalRitual.checkArea(world, pos, axis); } - private boolean isBaseValid(World world, BlockPos pos, Direction.Axis axis) { + private boolean isBaseValid(Level world, BlockPos pos, Direction.Axis axis) { boolean solid = true; if (axis.equals(Direction.Axis.X)) { - pos = pos.down().add(0, 0, -3); + pos = pos.below().add(0, 0, -3); for (int i = 0; i < 7; i++) { - BlockPos checkPos = pos.add(0, 0, i); + BlockPos checkPos = pos.offset(0, 0, i); BlockState state = world.getBlockState(checkPos); solid &= validBlock(world, checkPos, state); } - } - else { - pos = pos.down().add(-3, 0, 0); + } else { + pos = pos.below().add(-3, 0, 0); for (int i = 0; i < 7; i++) { - BlockPos checkPos = pos.add(i, 0, 0); + BlockPos checkPos = pos.offset(i, 0, 0); BlockState state = world.getBlockState(checkPos); solid &= validBlock(world, checkPos, state); } @@ -375,7 +383,7 @@ public class EternalRitual { return solid; } - private boolean validBlock(World world, BlockPos pos, BlockState state) { + private boolean validBlock(Level world, BlockPos pos, BlockState state) { return state.isSolidBlock(world, pos) && state.isFullCube(world, pos); } @@ -450,12 +458,12 @@ public class EternalRitual { } private boolean hasPedestal(BlockPos pos) { - return world.getBlockState(pos).isOf(PEDESTAL); + return world.getBlockState(pos).is(PEDESTAL); } private boolean isActive(BlockPos pos) { BlockState state = world.getBlockState(pos); - if (state.isOf(PEDESTAL)) { + if (state.is(PEDESTAL)) { EternalPedestalEntity pedestal = (EternalPedestalEntity) world.getBlockEntity(pos); if (pedestal != null) { if (!pedestal.hasRitual()) { @@ -467,7 +475,7 @@ public class EternalRitual { } } } - return state.get(ACTIVE); + return state.getValue(ACTIVE); } return false; } @@ -493,99 +501,107 @@ public class EternalRitual { exit = NbtHelper.toBlockPos(tag.getCompound("exit")); } if (tag.contains("key_item")) { - targetWorldId = new Identifier(tag.getString("key_item")); + targetWorldId = new ResourceLocation(tag.getString("key_item")); } } @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; EternalRitual ritual = (EternalRitual) o; - return world.equals(ritual.world) && - Objects.equals(center, ritual.center) && - Objects.equals(exit, ritual.exit); + return world.equals(ritual.world) && Objects.equals(center, ritual.center) && Objects.equals(exit, ritual.exit); } - public static void generatePortal(World world, BlockPos center, Direction.Axis axis, int portalId) { - BlockPos framePos = center.down(); + public static void generatePortal(Level world, BlockPos center, Direction.Axis axis, int portalId) { + BlockPos framePos = center.below(); Direction moveDir = Direction.Axis.X == axis ? Direction.EAST : Direction.NORTH; - BlockState frame = FRAME.getDefaultState().with(ACTIVE, true); + BlockState frame = FRAME.defaultBlockState().with(ACTIVE, true); FRAME_MAP.forEach(point -> { - BlockPos pos = framePos.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); - world.setBlockState(pos, frame); - pos = framePos.mutableCopy().move(moveDir, -point.x).move(Direction.UP, point.y); - world.setBlockState(pos, frame); + BlockPos pos = framePos.mutable().move(moveDir, point.x).move(Direction.UP, point.y); + world.setBlockAndUpdate(pos, frame); + pos = framePos.mutable().move(moveDir, -point.x).move(Direction.UP, point.y); + world.setBlockAndUpdate(pos, frame); }); - BlockState portal = PORTAL.getDefaultState().with(EndPortalBlock.AXIS, axis).with(EndPortalBlock.PORTAL, portalId); + BlockState portal = PORTAL.defaultBlockState().with(EndPortalBlock.AXIS, axis).with(EndPortalBlock.PORTAL, + portalId); PORTAL_MAP.forEach(point -> { - BlockPos pos = center.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); - world.setBlockState(pos, portal); - pos = center.mutableCopy().move(moveDir, -point.x).move(Direction.UP, point.y); - world.setBlockState(pos, portal); + BlockPos pos = center.mutable().move(moveDir, point.x).move(Direction.UP, point.y); + world.setBlockAndUpdate(pos, portal); + pos = center.mutable().move(moveDir, -point.x).move(Direction.UP, point.y); + world.setBlockAndUpdate(pos, portal); }); generateBase(world, framePos, moveDir); } - private static void generateBase(World world, BlockPos center, Direction moveX) { - BlockState base = BASE.getDefaultState(); - Direction moveY = moveX.rotateYClockwise(); + private static void generateBase(Level world, BlockPos center, Direction moveX) { + BlockState base = BASE.defaultBlockState(); + Direction moveY = moveX.getClockWise(); BASE_MAP.forEach(point -> { - BlockPos pos = center.mutableCopy().move(moveX, point.x).move(moveY, point.y); - world.setBlockState(pos, base); - pos = center.mutableCopy().move(moveX, -point.x).move(moveY, point.y); - world.setBlockState(pos, base); - pos = center.mutableCopy().move(moveX, point.x).move(moveY, -point.y); - world.setBlockState(pos, base); - pos = center.mutableCopy().move(moveX, -point.x).move(moveY, -point.y); - world.setBlockState(pos, base); + BlockPos pos = center.mutable().move(moveX, point.x).move(moveY, point.y); + world.setBlockAndUpdate(pos, base); + pos = center.mutable().move(moveX, -point.x).move(moveY, point.y); + world.setBlockAndUpdate(pos, base); + pos = center.mutable().move(moveX, point.x).move(moveY, -point.y); + world.setBlockAndUpdate(pos, base); + pos = center.mutable().move(moveX, -point.x).move(moveY, -point.y); + world.setBlockAndUpdate(pos, base); }); } - public static boolean checkArea(World world, BlockPos center, Direction.Axis axis) { + public static boolean checkArea(Level world, BlockPos center, Direction.Axis axis) { Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH : Direction.EAST; - for (BlockPos checkPos : BlockPos.iterate(center.offset(moveDir.rotateYClockwise()), center.offset(moveDir.rotateYCounterclockwise()))) { + for (BlockPos checkPos : BlockPos.iterate(center.offset(moveDir.getClockWise()), + center.offset(moveDir.rotateYCounterclockwise()))) { for (Point point : PORTAL_MAP) { - BlockPos pos = checkPos.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); + BlockPos pos = checkPos.mutable().move(moveDir, point.x).move(Direction.UP, point.y); BlockState state = world.getBlockState(pos); - if (isStateInvalid(state)) return false; - pos = checkPos.mutableCopy().move(moveDir, -point.x).move(Direction.UP, point.y); + if (isStateInvalid(state)) + return false; + pos = checkPos.mutable().move(moveDir, -point.x).move(Direction.UP, point.y); state = world.getBlockState(pos); - if (isStateInvalid(state)) return false; + if (isStateInvalid(state)) + return false; } } return true; } private static boolean isStateInvalid(BlockState state) { - if (!state.getFluidState().isEmpty()) return true; + if (!state.getFluidState().isEmpty()) + return true; Material material = state.getMaterial(); return !material.isReplaceable() && !material.equals(Material.PLANT); } /** - * @param world World for search - * @param checkPos Start search position - * @param radius Search radius + * @param world Level for search + * @param checkPos Start search position + * @param radius Search radius * @param searchBlock Target block - * @param condition Predicate for test block states in the chunk section + * @param condition Predicate for test block states in the chunk section * * @return Position of the first found block or null. */ @Nullable - public static BlockPos.Mutable findBlockPos(World world, BlockPos.Mutable checkPos, int radius, Block searchBlock, Predicate condition) { + public static BlockPos.MutableBlockPos findBlockPos(Level world, BlockPos.MutableBlockPos checkPos, int radius, + Block searchBlock, Predicate condition) { Direction moveDirection = Direction.EAST; for (int step = 1; step < radius; step++) { for (int i = 0; i < (step >> 1); i++) { Chunk chunk = world.getChunk(checkPos); - if (!(chunk instanceof WorldChunk) || ((WorldChunk) chunk).isEmpty()) continue; + if (!(chunk instanceof WorldChunk) || ((WorldChunk) chunk).isEmpty()) + continue; for (ChunkSection section : chunk.getSectionArray()) { - if (section == null || !section.getContainer().hasAny(condition)) continue; + if (section == null || !section.getContainer().hasAny(condition)) + continue; for (int x = 0; x < 16; x++) { for (int y = 0; y < 16; y++) { - for(int z = 0; z < 16; z++) { + for (int z = 0; z < 16; z++) { BlockState checkState = section.getBlockState(x, y, z); - if (checkState.isOf(searchBlock)) { + if (checkState.is(searchBlock)) { int worldX = (chunk.getPos().x << 4) + x; int worldY = section.getYOffset() + y; int worldZ = (chunk.getPos().z << 4) + z; @@ -598,39 +614,42 @@ public class EternalRitual { } checkPos.move(moveDirection, 16); } - moveDirection = moveDirection.rotateYClockwise(); + moveDirection = moveDirection.getClockWise(); } return null; } /** - * @param world World for search - * @param checkPos Start search position - * @param radius Search radius + * @param world Level for search + * @param checkPos Start search position + * @param radius Search radius * @param searchBlock Target block - * @param condition Predicate for test block states in the chunk section + * @param condition Predicate for test block states in the chunk section * * @return List of positions of the all found blocks or empty list. */ - public static List findAllBlockPos(World world, BlockPos.Mutable checkPos, int radius, Block searchBlock, Predicate condition) { - List posFound = Lists.newArrayList(); + public static List findAllBlockPos(Level world, BlockPos.MutableBlockPos checkPos, + int radius, Block searchBlock, Predicate condition) { + List posFound = Lists.newArrayList(); Direction moveDirection = Direction.EAST; for (int step = 1; step < radius; step++) { for (int i = 0; i < (step >> 1); i++) { Chunk chunk = world.getChunk(checkPos); - if (!(chunk instanceof WorldChunk) || ((WorldChunk) chunk).isEmpty()) continue; + if (!(chunk instanceof WorldChunk) || ((WorldChunk) chunk).isEmpty()) + continue; for (ChunkSection section : chunk.getSectionArray()) { - if (section == null || !section.getContainer().hasAny(condition)) continue; + if (section == null || !section.getContainer().hasAny(condition)) + continue; for (int x = 0; x < 16; x++) { for (int y = 0; y < 16; y++) { - for(int z = 0; z < 16; z++) { + for (int z = 0; z < 16; z++) { BlockState checkState = section.getBlockState(x, y, z); - if (checkState.isOf(searchBlock)) { + if (checkState.is(searchBlock)) { int worldX = (chunk.getPos().x << 4) + x; int worldY = section.getYOffset() + y; int worldZ = (chunk.getPos().z << 4) + z; checkPos.set(worldX, worldY, worldZ); - posFound.add(checkPos.mutableCopy()); + posFound.add(checkPos.mutable()); } } } @@ -638,7 +657,7 @@ public class EternalRitual { } checkPos.move(moveDirection, 16); } - moveDirection = moveDirection.rotateYClockwise(); + moveDirection = moveDirection.getClockWise(); } return posFound; } diff --git a/src/main/java/ru/betterend/rituals/InfusionRitual.java b/src/main/java/ru/betterend/rituals/InfusionRitual.java index 0ac50e97..0db4530c 100644 --- a/src/main/java/ru/betterend/rituals/InfusionRitual.java +++ b/src/main/java/ru/betterend/rituals/InfusionRitual.java @@ -2,56 +2,56 @@ package ru.betterend.rituals; import java.awt.Point; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.entity.player.PlayerEntity; import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; +import net.minecraft.world.item.ItemStack; import net.minecraft.nbt.CompoundTag; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; import ru.betterend.blocks.entities.InfusionPedestalEntity; import ru.betterend.blocks.entities.PedestalBlockEntity; import ru.betterend.particle.InfusionParticleType; import ru.betterend.recipe.builders.InfusionRecipe; public class InfusionRitual implements Inventory { - private static final Point[] PEDESTALS_MAP = new Point[] { - new Point(0, 3), new Point(2, 2), new Point(3, 0), new Point(2, -2), - new Point(0, -3), new Point(-2, -2), new Point(-3, 0), new Point(-2, 2) - }; + private static final Point[] PEDESTALS_MAP = new Point[] { new Point(0, 3), new Point(2, 2), new Point(3, 0), + new Point(2, -2), new Point(0, -3), new Point(-2, -2), new Point(-3, 0), new Point(-2, 2) }; - private World world; + private Level world; private BlockPos worldPos; private InfusionRecipe activeRecipe; private boolean isDirty = false; private boolean hasRecipe = false; private int progress = 0; private int time = 0; - + private InfusionPedestalEntity input; private final PedestalBlockEntity[] catalysts = new PedestalBlockEntity[8]; - - public InfusionRitual(World world, BlockPos pos) { + + public InfusionRitual(Level world, BlockPos pos) { this.world = world; this.worldPos = pos; this.configure(); } - + public static Point[] getMap() { return PEDESTALS_MAP; } - + public void configure() { - if (world == null || world.isClient || worldPos == null) return; + if (world == null || world.isClientSide || worldPos == null) + return; BlockEntity inputEntity = world.getBlockEntity(worldPos); if (inputEntity instanceof InfusionPedestalEntity) { input = (InfusionPedestalEntity) inputEntity; } int i = 0; - for(Point point : PEDESTALS_MAP) { - BlockPos.Mutable checkPos = worldPos.mutableCopy().move(Direction.EAST, point.x).move(Direction.NORTH, point.y); + for (Point point : PEDESTALS_MAP) { + BlockPos.MutableBlockPos checkPos = worldPos.mutable().move(Direction.EAST, point.x).move(Direction.NORTH, + point.y); BlockEntity catalystEntity = world.getBlockEntity(checkPos); if (catalystEntity instanceof PedestalBlockEntity) { catalysts[i] = (PedestalBlockEntity) catalystEntity; @@ -61,9 +61,10 @@ public class InfusionRitual implements Inventory { } } } - + public boolean checkRecipe() { - if (!isValid()) return false; + if (!isValid()) + return false; InfusionRecipe recipe = world.getRecipeManager().getFirstMatch(InfusionRecipe.TYPE, this, world).orElse(null); if (hasRecipe()) { if (recipe == null) { @@ -89,7 +90,7 @@ public class InfusionRitual implements Inventory { } return false; } - + public void stop() { activeRecipe = null; hasRecipe = false; @@ -97,14 +98,16 @@ public class InfusionRitual implements Inventory { time = 0; markDirty(); } - + public void tick() { if (isDirty) { configure(); isDirty = false; } - if (!isValid() || !hasRecipe()) return; - if (!checkRecipe()) return; + if (!isValid() || !hasRecipe()) + return; + if (!checkRecipe()) + return; progress++; if (progress == time) { input.removeStack(0); @@ -114,7 +117,7 @@ public class InfusionRitual implements Inventory { } stop(); } else { - ServerWorld world = (ServerWorld) this.world; + ServerLevel world = (ServerLevel) this.world; BlockPos target = worldPos.up(); double tx = target.getX() + 0.5; double ty = target.getY() + 0.5; @@ -126,31 +129,33 @@ public class InfusionRitual implements Inventory { double sx = start.getX() + 0.5; double sy = start.getY() + 1.25; double sz = start.getZ() + 0.5; - world.spawnParticles(new InfusionParticleType(stack), sx, sy, sz, 0, tx - sx, ty - sy, tz - sz, 0.5); + world.sendParticles(new InfusionParticleType(stack), sx, sy, sz, 0, tx - sx, ty - sy, tz - sz, 0.5); } } } - + } - + @Override public boolean isValid(int slot, ItemStack stack) { return isValid(); } - + public boolean isValid() { - if (world == null || world.isClient || worldPos == null || input == null) return false; + if (world == null || world.isClientSide || worldPos == null || input == null) + return false; for (PedestalBlockEntity catalyst : catalysts) { - if (catalyst == null) return false; + if (catalyst == null) + return false; } return true; } - + public boolean hasRecipe() { return hasRecipe; } - public void setLocation(World world, BlockPos pos) { + public void setLocation(Level world, BlockPos pos) { this.world = world; this.worldPos = pos; this.isDirty = true; @@ -158,7 +163,8 @@ public class InfusionRitual implements Inventory { @Override public void clear() { - if (!isValid()) return; + if (!isValid()) + return; input.clear(); for (PedestalBlockEntity catalyst : catalysts) { catalyst.clear(); @@ -177,7 +183,8 @@ public class InfusionRitual implements Inventory { @Override public ItemStack getStack(int slot) { - if (slot > 8) return ItemStack.EMPTY; + if (slot > 8) + return ItemStack.EMPTY; if (slot == 0) { return input.getStack(0); } else { @@ -192,7 +199,8 @@ public class InfusionRitual implements Inventory { @Override public ItemStack removeStack(int slot) { - if (slot > 8) return ItemStack.EMPTY; + if (slot > 8) + return ItemStack.EMPTY; if (slot == 0) { return input.removeStack(0); } else { @@ -202,7 +210,8 @@ public class InfusionRitual implements Inventory { @Override public void setStack(int slot, ItemStack stack) { - if (slot > 8) return; + if (slot > 8) + return; if (slot == 0) { input.setStack(0, stack); } else { @@ -224,7 +233,7 @@ public class InfusionRitual implements Inventory { public boolean canPlayerUse(PlayerEntity player) { return true; } - + public void fromTag(CompoundTag tag) { if (tag.contains("recipe")) { hasRecipe = tag.getBoolean("recipe"); diff --git a/src/main/java/ru/betterend/tab/CreativeTabs.java b/src/main/java/ru/betterend/tab/CreativeTabs.java index 1ee8eb5d..518925f7 100644 --- a/src/main/java/ru/betterend/tab/CreativeTabs.java +++ b/src/main/java/ru/betterend/tab/CreativeTabs.java @@ -1,16 +1,16 @@ package ru.betterend.tab; import net.fabricmc.fabric.api.client.itemgroup.FabricItemGroupBuilder; -import net.minecraft.item.Item; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.ItemStack; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; import ru.betterend.BetterEnd; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; public class CreativeTabs { - public static final ItemGroup TAB_BLOCKS; - public static final ItemGroup TAB_ITEMS; + public static final CreativeModeTab TAB_BLOCKS; + public static final CreativeModeTab TAB_ITEMS; static { TAB_BLOCKS = FabricItemGroupBuilder.create(BetterEnd.makeID("end_blocks")) diff --git a/src/main/java/ru/betterend/util/BlocksHelper.java b/src/main/java/ru/betterend/util/BlocksHelper.java index fe2601ab..094ef837 100644 --- a/src/main/java/ru/betterend/util/BlocksHelper.java +++ b/src/main/java/ru/betterend/util/BlocksHelper.java @@ -9,20 +9,20 @@ import java.util.Set; import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.FallingBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.FallingBlock; import net.minecraft.state.property.BooleanProperty; import net.minecraft.state.property.Property; -import net.minecraft.tag.BlockTags; +import net.minecraft.tags.BlockTags; import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3i; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; +import net.minecraft.world.level.LevelAccessor; import ru.betterend.blocks.BlueVineBlock; import ru.betterend.blocks.basis.DoublePlantBlock; import ru.betterend.blocks.basis.FurBlock; @@ -34,7 +34,7 @@ import ru.betterend.registry.EndTags; public class BlocksHelper { public static final BooleanProperty ROOTS = BooleanProperty.of("roots"); private static final Map COLOR_BY_BLOCK = Maps.newHashMap(); - + public static final int FLAG_UPDATE_BLOCK = 1; public static final int FLAG_SEND_CLIENT_CHANGES = 2; public static final int FLAG_NO_RERENDER = 4; @@ -45,97 +45,92 @@ public class BlocksHelper { public static final int SET_OBSERV = FLAG_UPDATE_BLOCK | FLAG_SEND_CLIENT_CHANGES; public static final Direction[] HORIZONTAL = makeHorizontal(); public static final Direction[] DIRECTIONS = Direction.values(); - - private static final Mutable POS = new Mutable(); - protected static final BlockState AIR = Blocks.AIR.getDefaultState(); - protected static final BlockState WATER = Blocks.WATER.getDefaultState(); - private static final Vec3i[] OFFSETS = new Vec3i[] { - new Vec3i(-1, -1, -1), new Vec3i(-1, -1, 0), new Vec3i(-1, -1, 1), - new Vec3i(-1, 0, -1), new Vec3i(-1, 0, 0), new Vec3i(-1, 0, 1), - new Vec3i(-1, 1, -1), new Vec3i(-1, 1, 0), new Vec3i(-1, 1, 1), + private static final MutableBlockPos POS = new MutableBlockPos(); + protected static final BlockState AIR = Blocks.AIR.defaultBlockState(); + protected static final BlockState WATER = Blocks.WATER.defaultBlockState(); - new Vec3i(0, -1, -1), new Vec3i(0, -1, 0), new Vec3i(0, -1, 1), - new Vec3i(0, 0, -1), new Vec3i(0, 0, 0), new Vec3i(0, 0, 1), - new Vec3i(0, 1, -1), new Vec3i(0, 1, 0), new Vec3i(0, 1, 1), + private static final Vec3i[] OFFSETS = new Vec3i[] { new Vec3i(-1, -1, -1), new Vec3i(-1, -1, 0), + new Vec3i(-1, -1, 1), new Vec3i(-1, 0, -1), new Vec3i(-1, 0, 0), new Vec3i(-1, 0, 1), new Vec3i(-1, 1, -1), + new Vec3i(-1, 1, 0), new Vec3i(-1, 1, 1), + + new Vec3i(0, -1, -1), new Vec3i(0, -1, 0), new Vec3i(0, -1, 1), new Vec3i(0, 0, -1), new Vec3i(0, 0, 0), + new Vec3i(0, 0, 1), new Vec3i(0, 1, -1), new Vec3i(0, 1, 0), new Vec3i(0, 1, 1), + + new Vec3i(1, -1, -1), new Vec3i(1, -1, 0), new Vec3i(1, -1, 1), new Vec3i(1, 0, -1), new Vec3i(1, 0, 0), + new Vec3i(1, 0, 1), new Vec3i(1, 1, -1), new Vec3i(1, 1, 0), new Vec3i(1, 1, 1) }; - new Vec3i(1, -1, -1), new Vec3i(1, -1, 0), new Vec3i(1, -1, 1), - new Vec3i(1, 0, -1), new Vec3i(1, 0, 0), new Vec3i(1, 0, 1), - new Vec3i(1, 1, -1), new Vec3i(1, 1, 0), new Vec3i(1, 1, 1) - }; - public static void addBlockColor(Block block, int color) { COLOR_BY_BLOCK.put(block, color); } - + public static int getBlockColor(Block block) { return COLOR_BY_BLOCK.getOrDefault(block, 0xFF000000); } - public static void setWithoutUpdate(WorldAccess world, BlockPos pos, BlockState state) { - world.setBlockState(pos, state, SET_SILENT); - } - - public static void setWithoutUpdate(WorldAccess world, BlockPos pos, Block block) { - world.setBlockState(pos, block.getDefaultState(), SET_SILENT); - } - - public static void setWithUpdate(WorldAccess world, BlockPos pos, BlockState state) { - world.setBlockState(pos, state, SET_OBSERV); - } - - public static void setWithUpdate(WorldAccess world, BlockPos pos, Block block) { - world.setBlockState(pos, block.getDefaultState(), SET_OBSERV); + public static void setWithoutUpdate(LevelAccessor world, BlockPos pos, BlockState state) { + world.setBlockAndUpdate(pos, state, SET_SILENT); } - public static int upRay(WorldAccess world, BlockPos pos, int maxDist) { + public static void setWithoutUpdate(LevelAccessor world, BlockPos pos, Block block) { + world.setBlockAndUpdate(pos, block.defaultBlockState(), SET_SILENT); + } + + public static void setWithUpdate(LevelAccessor world, BlockPos pos, BlockState state) { + world.setBlockAndUpdate(pos, state, SET_OBSERV); + } + + public static void setWithUpdate(LevelAccessor world, BlockPos pos, Block block) { + world.setBlockAndUpdate(pos, block.defaultBlockState(), SET_OBSERV); + } + + public static int upRay(LevelAccessor world, BlockPos pos, int maxDist) { int length = 0; for (int j = 1; j < maxDist && (world.isAir(pos.up(j))); j++) length++; return length; } - public static int downRay(WorldAccess world, BlockPos pos, int maxDist) { + public static int downRay(LevelAccessor world, BlockPos pos, int maxDist) { int length = 0; for (int j = 1; j < maxDist && (world.isAir(pos.down(j))); j++) length++; return length; } - - public static int downRayRep(WorldAccess world, BlockPos pos, int maxDist) { + + public static int downRayRep(LevelAccessor world, BlockPos pos, int maxDist) { POS.set(pos); - for (int j = 1; j < maxDist && (world.getBlockState(POS)).getMaterial().isReplaceable(); j++) - { + for (int j = 1; j < maxDist && (world.getBlockState(POS)).getMaterial().isReplaceable(); j++) { POS.setY(POS.getY() - 1); } return pos.getY() - POS.getY(); } - - public static int raycastSqr(WorldAccess world, BlockPos pos, int dx, int dy, int dz, int maxDist) { + + public static int raycastSqr(LevelAccessor world, BlockPos pos, int dx, int dy, int dz, int maxDist) { POS.set(pos); - for (int j = 1; j < maxDist && (world.getBlockState(POS)).getMaterial().isReplaceable(); j++) - { + for (int j = 1; j < maxDist && (world.getBlockState(POS)).getMaterial().isReplaceable(); j++) { POS.move(dx, dy, dz); } return (int) pos.getSquaredDistance(POS); } - public static BlockState rotateHorizontal(BlockState state, BlockRotation rotation, Property facing) { - return state.with(facing, rotation.rotate(state.get(facing))); + public static BlockState rotateHorizontal(BlockState state, Rotation rotation, Property facing) { + return state.with(facing, rotation.rotate(state.getValue(facing))); } public static BlockState mirrorHorizontal(BlockState state, BlockMirror mirror, Property facing) { - return state.rotate(mirror.getRotation(state.get(facing))); + return state.rotate(mirror.getRotation(state.getValue(facing))); } - public static int getLengthDown(WorldAccess world, BlockPos pos, Block block) { + public static int getLengthDown(LevelAccessor world, BlockPos pos, Block block) { int count = 1; while (world.getBlockState(pos.down(count)).getBlock() == block) count++; return count; } - public static void cover(WorldAccess world, BlockPos center, Block ground, BlockState cover, int radius, Random random) { + public static void cover(LevelAccessor world, BlockPos center, Block ground, BlockState cover, int radius, + Random random) { HashSet points = new HashSet(); HashSet points2 = new HashSet(); if (world.getBlockState(center).getBlock() == ground) { @@ -147,7 +142,7 @@ public class BlocksHelper { BlockPos pos = iterator.next(); for (Vec3i offset : OFFSETS) { if (random.nextBoolean()) { - BlockPos pos2 = pos.add(offset); + BlockPos pos2 = pos.offset(offset); if (random.nextBoolean() && world.getBlockState(pos2).getBlock() == ground && !points.contains(pos2)) points2.add(pos2); @@ -164,8 +159,8 @@ public class BlocksHelper { } } } - - public static void fixBlocks(WorldAccess world, BlockPos start, BlockPos end) { + + 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++) { @@ -175,7 +170,7 @@ public class BlocksHelper { for (int y = start.getY(); y <= end.getY(); y++) { POS.setY(y); state = world.getBlockState(POS); - + if (state.getBlock() instanceof FurBlock) { doubleCheck.add(POS.toImmutable()); } @@ -207,19 +202,17 @@ public class BlocksHelper { break; } } - } - else if (state.isOf(EndBlocks.SMARAGDANT_CRYSTAL)) { + } else if (state.is(EndBlocks.SMARAGDANT_CRYSTAL)) { POS.setY(POS.getY() - 1); if (world.isAir(POS)) { POS.setY(POS.getY() + 1); - while (state.isOf(EndBlocks.SMARAGDANT_CRYSTAL)) { + 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) { + } else if (state.getBlock() instanceof StalactiteBlock) { if (!state.canPlaceAt(world, POS)) { if (world.getBlockState(POS.up()).getBlock() instanceof StalactiteBlock) { while (state.getBlock() instanceof StalactiteBlock) { @@ -227,8 +220,7 @@ public class BlocksHelper { POS.setY(POS.getY() + 1); state = world.getBlockState(POS); } - } - else { + } else { while (state.getBlock() instanceof StalactiteBlock) { setWithoutUpdate(world, POS, AIR); POS.setY(POS.getY() - 1); @@ -236,15 +228,13 @@ public class BlocksHelper { } } } - } - else if (state.isOf(EndBlocks.CAVE_PUMPKIN)) { - if (!world.getBlockState(POS.up()).isOf(EndBlocks.CAVE_PUMPKIN_SEED)) { + } else if (state.is(EndBlocks.CAVE_PUMPKIN)) { + if (!world.getBlockState(POS.up()).is(EndBlocks.CAVE_PUMPKIN_SEED)) { setWithoutUpdate(world, POS, AIR); } - } - else if (!state.canPlaceAt(world, POS)) { + } else if (!state.canPlaceAt(world, POS)) { // Chorus - if (state.isOf(Blocks.CHORUS_PLANT)) { + if (state.is(Blocks.CHORUS_PLANT)) { Set ends = Sets.newHashSet(); Set add = Sets.newHashSet(); ends.add(POS.toImmutable()); @@ -253,15 +243,17 @@ public class BlocksHelper { ends.forEach((pos) -> { setWithoutUpdate(world, pos, AIR); for (Direction dir : HORIZONTAL) { - BlockPos p = pos.offset(dir); + BlockPos p = pos.relative(dir); BlockState st = world.getBlockState(p); - if ((st.isOf(Blocks.CHORUS_PLANT) || st.isOf(Blocks.CHORUS_FLOWER)) && !st.canPlaceAt(world, p)) { + if ((st.is(Blocks.CHORUS_PLANT) || st.is(Blocks.CHORUS_FLOWER)) + && !st.canPlaceAt(world, p)) { add.add(p); } } BlockPos p = pos.up(); BlockState st = world.getBlockState(p); - if ((st.isOf(Blocks.CHORUS_PLANT) || st.isOf(Blocks.CHORUS_FLOWER)) && !st.canPlaceAt(world, p)) { + if ((st.is(Blocks.CHORUS_PLANT) || st.is(Blocks.CHORUS_FLOWER)) + && !st.canPlaceAt(world, p)) { add.add(p); } }); @@ -286,14 +278,13 @@ public class BlocksHelper { int ray = downRayRep(world, POS.toImmutable(), 64); if (ray > 32) { - BlocksHelper.setWithoutUpdate(world, POS, Blocks.END_STONE.getDefaultState()); + 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.getDefaultState()); + BlocksHelper.setWithoutUpdate(world, POS, Blocks.END_STONE.defaultBlockState()); } - } - else { + } else { POS.setY(y); BlockState replacement = AIR; for (Direction dir : HORIZONTAL) { @@ -312,7 +303,8 @@ public class BlocksHelper { else { // Blue Vine if (state.getBlock() instanceof BlueVineBlock) { - while (state.isOf(EndBlocks.BLUE_VINE) || state.isOf(EndBlocks.BLUE_VINE_LANTERN) || state.isOf(EndBlocks.BLUE_VINE_FUR)) { + 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); @@ -333,34 +325,34 @@ public class BlocksHelper { } } } - + doubleCheck.forEach((pos) -> { if (!world.getBlockState(pos).canPlaceAt(world, pos)) { BlocksHelper.setWithoutUpdate(world, pos, AIR); } }); } - + private static BlockState getAirOrFluid(BlockState state) { return state.getFluidState().isEmpty() ? AIR : state.getFluidState().getBlockState(); } - + public static boolean isEndNylium(Block block) { return block.isIn(BlockTags.NYLIUM) && block.isIn(EndTags.END_GROUND); } - + public static boolean isEndNylium(BlockState state) { return isEndNylium(state.getBlock()); } - + public static Direction[] makeHorizontal() { return new Direction[] { Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST }; } - + public static Direction randomHorizontal(Random random) { return HORIZONTAL[random.nextInt(4)]; } - + public static Direction randomDirection(Random random) { return DIRECTIONS[random.nextInt(6)]; } diff --git a/src/main/java/ru/betterend/util/BonemealUtil.java b/src/main/java/ru/betterend/util/BonemealUtil.java index 035f26c2..cbf685ec 100644 --- a/src/main/java/ru/betterend/util/BonemealUtil.java +++ b/src/main/java/ru/betterend/util/BonemealUtil.java @@ -7,68 +7,68 @@ import java.util.Random; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import net.minecraft.block.Block; -import net.minecraft.util.Identifier; +import net.minecraft.world.level.block.Block; +import net.minecraft.resources.ResourceLocation; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndBlocks; import ru.betterend.world.biome.EndBiome; public class BonemealUtil { - private static final Map> GRASS_BIOMES = Maps.newHashMap(); + private static final Map> GRASS_BIOMES = Maps.newHashMap(); private static final Map GRASS_TYPES = Maps.newHashMap(); - + public static void init() { addBonemealGrass(EndBlocks.END_MOSS, EndBlocks.CREEPING_MOSS); addBonemealGrass(EndBlocks.END_MOSS, EndBlocks.UMBRELLA_MOSS); addBonemealGrass(EndBlocks.END_MYCELIUM, EndBlocks.CREEPING_MOSS); addBonemealGrass(EndBlocks.END_MYCELIUM, EndBlocks.UMBRELLA_MOSS); - + addBonemealGrass(EndBlocks.CAVE_MOSS, EndBlocks.CAVE_GRASS); addBonemealGrass(EndBlocks.CHORUS_NYLIUM, EndBlocks.CHORUS_GRASS); addBonemealGrass(EndBlocks.CRYSTAL_MOSS, EndBlocks.CRYSTAL_GRASS); addBonemealGrass(EndBlocks.SHADOW_GRASS, EndBlocks.SHADOW_PLANT); addBonemealGrass(EndBlocks.PINK_MOSS, EndBlocks.BUSHY_GRASS); addBonemealGrass(EndBlocks.AMBER_MOSS, EndBlocks.AMBER_GRASS); - + addBonemealGrass(EndBlocks.JUNGLE_MOSS, EndBlocks.JUNGLE_GRASS); addBonemealGrass(EndBlocks.JUNGLE_MOSS, EndBlocks.TWISTED_UMBRELLA_MOSS); addBonemealGrass(EndBlocks.JUNGLE_MOSS, EndBlocks.SMALL_JELLYSHROOM, 0.1F); - + addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.BLOOMING_COOKSONIA); addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.VAIOLUSH_FERN); addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.FRACTURN); addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.SALTEAGO); - + addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.CREEPING_MOSS, 0.1F); addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.UMBRELLA_MOSS, 0.1F); addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.TWISTED_UMBRELLA_MOSS, 0.1F); - + addBonemealGrass(EndBlocks.RUTISCUS, EndBlocks.ORANGO); addBonemealGrass(EndBlocks.RUTISCUS, EndBlocks.AERIDIUM, 0.2F); addBonemealGrass(EndBlocks.RUTISCUS, EndBlocks.LUTEBUS, 0.2F); addBonemealGrass(EndBlocks.RUTISCUS, EndBlocks.LAMELLARIUM); - + addBonemealGrass(EndBiomes.LANTERN_WOODS, EndBlocks.RUTISCUS, EndBlocks.AERIDIUM, 0.2F); addBonemealGrass(EndBiomes.LANTERN_WOODS, EndBlocks.RUTISCUS, EndBlocks.LAMELLARIUM); addBonemealGrass(EndBiomes.LANTERN_WOODS, EndBlocks.RUTISCUS, EndBlocks.BOLUX_MUSHROOM, 0.05F); - + addBonemealGrass(EndBlocks.SANGNUM, EndBlocks.GLOBULAGUS); addBonemealGrass(EndBlocks.SANGNUM, EndBlocks.CLAWFERN); addBonemealGrass(EndBlocks.SANGNUM, EndBlocks.SMALL_AMARANITA_MUSHROOM, 0.1F); - + addBonemealGrass(EndBlocks.MOSSY_DRAGON_BONE, EndBlocks.GLOBULAGUS); addBonemealGrass(EndBlocks.MOSSY_DRAGON_BONE, EndBlocks.CLAWFERN); addBonemealGrass(EndBlocks.MOSSY_DRAGON_BONE, EndBlocks.SMALL_AMARANITA_MUSHROOM, 0.1F); - + addBonemealGrass(EndBlocks.MOSSY_OBSIDIAN, EndBlocks.GLOBULAGUS); addBonemealGrass(EndBlocks.MOSSY_OBSIDIAN, EndBlocks.CLAWFERN); addBonemealGrass(EndBlocks.MOSSY_OBSIDIAN, EndBlocks.SMALL_AMARANITA_MUSHROOM, 0.1F); } - + public static void addBonemealGrass(Block terrain, Block plant) { addBonemealGrass(terrain, plant, 1F); } - + public static void addBonemealGrass(Block terrain, Block plant, float chance) { GrassList list = GRASS_TYPES.get(terrain); if (list == null) { @@ -77,11 +77,11 @@ public class BonemealUtil { } list.addGrass(plant, chance); } - + public static void addBonemealGrass(EndBiome biome, Block terrain, Block plant) { addBonemealGrass(biome, terrain, plant, 1F); } - + public static void addBonemealGrass(EndBiome biome, Block terrain, Block plant, float chance) { Map map = GRASS_BIOMES.get(biome.getID()); if (map == null) { @@ -95,8 +95,8 @@ public class BonemealUtil { } list.addGrass(plant, chance); } - - public static Block getGrass(Identifier biomeID, Block terrain, Random random) { + + public static Block getGrass(ResourceLocation biomeID, Block terrain, Random random) { Map map = GRASS_BIOMES.get(biomeID); GrassList list = null; if (map != null) { @@ -104,44 +104,43 @@ public class BonemealUtil { if (list == null) { list = GRASS_TYPES.get(terrain); } - } - else { + } else { list = GRASS_TYPES.get(terrain); } return list == null ? null : list.getGrass(random); } - + private static final class GrassInfo { final Block grass; float chance; - + public GrassInfo(Block grass, float chance) { this.grass = grass; this.chance = chance; } - + public float addChance(float chance) { this.chance += chance; return this.chance; } } - + private static final class GrassList { final List list = Lists.newArrayList(); float maxChance = 0; - + public void addGrass(Block grass, float chance) { GrassInfo info = new GrassInfo(grass, chance); maxChance = info.addChance(maxChance); list.add(info); } - + public Block getGrass(Random random) { if (maxChance == 0 || list.isEmpty()) { return null; } float chance = random.nextFloat() * maxChance; - for (GrassInfo info: list) { + for (GrassInfo info : list) { if (chance <= info.chance) { return info.grass; } diff --git a/src/main/java/ru/betterend/util/ColorUtil.java b/src/main/java/ru/betterend/util/ColorUtil.java index 83ff6882..17c6f39b 100644 --- a/src/main/java/ru/betterend/util/ColorUtil.java +++ b/src/main/java/ru/betterend/util/ColorUtil.java @@ -12,47 +12,44 @@ import net.fabricmc.api.Environment; import net.fabricmc.fabric.impl.client.indigo.renderer.helper.ColorHelper; import net.minecraft.client.MinecraftClient; import net.minecraft.client.texture.NativeImage; -import net.minecraft.item.BlockItem; -import net.minecraft.item.Item; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; import net.minecraft.resource.Resource; import net.minecraft.resource.ResourceManager; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.registry.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.core.Registry; import ru.betterend.BetterEnd; @Environment(EnvType.CLIENT) public class ColorUtil { - + private static float[] floatBuffer = new float[4]; - + public static int[] toIntArray(int color) { - return new int[] { - (color >> 24) & 255, - (color >> 16) & 255, - (color >> 8) & 255, - color & 255 - }; + return new int[] { (color >> 24) & 255, (color >> 16) & 255, (color >> 8) & 255, color & 255 }; } - + public static float[] toFloatArray(int color) { floatBuffer[0] = ((color >> 16 & 255) / 255.0F); floatBuffer[1] = ((color >> 8 & 255) / 255.0F); floatBuffer[2] = ((color & 255) / 255.0F); floatBuffer[3] = ((color >> 24 & 255) / 255.0F); - + return floatBuffer; } - + public static float[] RGBtoHSB(int r, int g, int b, float[] hsbvals) { float hue, saturation, brightness; if (hsbvals == null) { hsbvals = floatBuffer; } int cmax = (r > g) ? r : g; - if (b > cmax) cmax = b; + if (b > cmax) + cmax = b; int cmin = (r < g) ? r : g; - if (b < cmin) cmin = b; + if (b < cmin) + cmin = b; brightness = ((float) cmax) / 255.0F; if (cmax != 0) @@ -80,14 +77,14 @@ public class ColorUtil { hsbvals[2] = brightness; return hsbvals; } - + public static int HSBtoRGB(float hue, float saturation, float brightness) { int r = 0, g = 0, b = 0; if (saturation == 0) { r = g = b = (int) (brightness * 255.0F + 0.5F); } else { - float h = (hue - (float)Math.floor(hue)) * 6.0F; - float f = h - (float)java.lang.Math.floor(h); + float h = (hue - (float) Math.floor(hue)) * 6.0F; + float f = h - (float) java.lang.Math.floor(h); float p = brightness * (1.0F - saturation); float q = brightness * (1.0F - saturation * f); float t = brightness * (1.0F - (saturation * (1.0F - f))); @@ -126,41 +123,43 @@ public class ColorUtil { } return 0xFF000000 | (r << 16) | (g << 8) | (b << 0); } - + public static int parseHex(String hexColor) { int len = hexColor.length(); if (len < 6 || len > 8 || len % 2 > 0) { return -1; } - + int color, shift; - if(len == 6) { - color = 0xFF000000; shift = 16; + if (len == 6) { + color = 0xFF000000; + shift = 16; } else { - color = 0; shift = 24; + color = 0; + shift = 24; } - + try { String[] splited = hexColor.split("(?<=\\G.{2})"); for (String digit : splited) { color |= Integer.valueOf(digit, 16) << shift; shift -= 8; } - } catch(NumberFormatException ex) { + } catch (NumberFormatException ex) { BetterEnd.LOGGER.catching(ex); return -1; } - + return color; } - + public static int toABGR(int color) { int r = (color >> 16) & 255; int g = (color >> 8) & 255; int b = color & 255; return 0xFF000000 | b << 16 | g << 8 | r; } - + public static int ABGRtoARGB(int color) { int a = (color >> 24) & 255; int b = (color >> 16) & 255; @@ -168,18 +167,18 @@ public class ColorUtil { int r = color & 255; return a << 24 | r << 16 | g << 8 | b; } - + public static int colorBrigtness(int color, float val) { RGBtoHSB((color >> 16) & 255, (color >> 8) & 255, color & 255, floatBuffer); floatBuffer[2] += val / 10.0F; - floatBuffer[2] = MathHelper.clamp(floatBuffer[2], 0.0F, 1.0F); + floatBuffer[2] = Mth.clamp(floatBuffer[2], 0.0F, 1.0F); return HSBtoRGB(floatBuffer[0], floatBuffer[1], floatBuffer[2]); } - + public static int applyTint(int color, int tint) { return colorBrigtness(ColorHelper.multiplyColor(color, tint), 1.5F); } - + public static int colorDistance(int color1, int color2) { int r1 = (color1 >> 16) & 255; int g1 = (color1 >> 8) & 255; @@ -189,20 +188,21 @@ public class ColorUtil { int b2 = color2 & 255; return MHelper.pow2(r1 - r2) + MHelper.pow2(g1 - g2) + MHelper.pow2(b1 - b2); } - - private static Map colorPalette = Maps.newHashMap(); - + + private static Map colorPalette = Maps.newHashMap(); + public static int extractColor(Item item) { - Identifier id = Registry.ITEM.getId(item); - if (id.equals(Registry.ITEM.getDefaultId())) return -1; + ResourceLocation id = Registry.ITEM.getId(item); + if (id.equals(Registry.ITEM.getDefaultId())) + return -1; if (colorPalette.containsKey(id)) { return colorPalette.get(id); } - Identifier texture; + ResourceLocation texture; if (item instanceof BlockItem) { - texture = new Identifier(id.getNamespace(), "textures/block/" + id.getPath() + ".png"); + texture = new ResourceLocation(id.getNamespace(), "textures/block/" + id.getPath() + ".png"); } else { - texture = new Identifier(id.getNamespace(), "textures/item/" + id.getPath() + ".png"); + texture = new ResourceLocation(id.getNamespace(), "textures/item/" + id.getPath() + ".png"); } NativeImage image = loadImage(texture, 16, 16); List colors = new ArrayList<>(); @@ -215,27 +215,28 @@ public class ColorUtil { } } image.close(); - - if (colors.size() == 0) return -1; - + + if (colors.size() == 0) + return -1; + ColorExtractor extractor = new ColorExtractor(colors); int color = extractor.analize(); colorPalette.put(id, color); - + return color; } - - public static NativeImage loadImage(Identifier image, int w, int h) { + + public static NativeImage loadImage(ResourceLocation image, int w, int h) { MinecraftClient minecraft = MinecraftClient.getInstance(); ResourceManager resourceManager = minecraft.getResourceManager(); if (resourceManager.containsResource(image)) { try (Resource resource = resourceManager.getResource(image)) { - return NativeImage.read(resource.getInputStream()); + return NativeImage.read(resource.getInputStream()); } catch (IOException e) { BetterEnd.LOGGER.warning("Can't load texture image: {}. Will be created empty image.", image); BetterEnd.LOGGER.warning("Cause: {}.", e.getMessage()); } - } + } return new NativeImage(w, h, false); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/util/FeaturesHelper.java b/src/main/java/ru/betterend/util/FeaturesHelper.java index c43e0d9c..806f8325 100644 --- a/src/main/java/ru/betterend/util/FeaturesHelper.java +++ b/src/main/java/ru/betterend/util/FeaturesHelper.java @@ -8,7 +8,7 @@ import java.util.function.Supplier; import com.google.common.collect.Lists; import com.google.common.collect.Sets; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.feature.ConfiguredFeature; import net.minecraft.world.gen.feature.ConfiguredStructureFeature; @@ -23,9 +23,11 @@ public class FeaturesHelper { biomeRegistry.forEach((biome) -> { if (biome.getCategory() == Biome.Category.THEEND && !INJECTED.contains(biome)) { GenerationSettingsAccessor accessor = (GenerationSettingsAccessor) biome.getGenerationSettings(); - List>> structures = Lists.newArrayList(accessor.beGetStructures()); + List>> structures = Lists + .newArrayList(accessor.beGetStructures()); List>>> preFeatures = accessor.beGetFeatures(); - List>>> features = new ArrayList>>>(preFeatures.size()); + List>>> features = new ArrayList>>>( + preFeatures.size()); preFeatures.forEach((list) -> { features.add(Lists.newArrayList(list)); }); @@ -37,6 +39,6 @@ public class FeaturesHelper { accessor.beSetStructures(structures); INJECTED.add(biome); } - }); + }); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/util/ItemUtil.java b/src/main/java/ru/betterend/util/ItemUtil.java index 16ab37c8..030a47a0 100644 --- a/src/main/java/ru/betterend/util/ItemUtil.java +++ b/src/main/java/ru/betterend/util/ItemUtil.java @@ -5,15 +5,15 @@ import org.jetbrains.annotations.Nullable; import com.google.gson.JsonObject; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Identifier; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.JsonHelper; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; import ru.betterend.BetterEnd; public class ItemUtil { - + public static String toStackString(@NotNull ItemStack stack) { try { if (stack == null) { @@ -26,7 +26,7 @@ public class ItemUtil { } return ""; } - + @Nullable public static ItemStack fromStackString(String stackString) { if (stackString == null || stackString.equals("")) { @@ -34,15 +34,16 @@ public class ItemUtil { } try { String[] parts = stackString.split(":"); - if (parts.length < 2) return null; + if (parts.length < 2) + return null; if (parts.length == 2) { - Identifier itemId = new Identifier(stackString); + ResourceLocation itemId = new ResourceLocation(stackString); Item item = Registry.ITEM.getOrEmpty(itemId).orElseThrow(() -> { return new IllegalStateException("Output item " + itemId + " does not exists!"); }); return new ItemStack(item); } - Identifier itemId = new Identifier(parts[0], parts[1]); + ResourceLocation itemId = new ResourceLocation(parts[0], parts[1]); Item item = Registry.ITEM.getOrEmpty(itemId).orElseThrow(() -> { return new IllegalStateException("Output item " + itemId + " does not exists!"); }); @@ -52,14 +53,14 @@ public class ItemUtil { } return null; } - + @Nullable public static ItemStack fromJsonRecipe(JsonObject recipe) { try { if (!recipe.has("item")) { throw new IllegalStateException("Invalid JsonObject. Entry 'item' does not exists!"); } - Identifier itemId = new Identifier(JsonHelper.getString(recipe, "item")); + ResourceLocation itemId = new ResourceLocation(JsonHelper.getString(recipe, "item")); Item item = Registry.ITEM.getOrEmpty(itemId).orElseThrow(() -> { return new IllegalStateException("Output item " + itemId + " does not exists!"); }); diff --git a/src/main/java/ru/betterend/util/LootTableUtil.java b/src/main/java/ru/betterend/util/LootTableUtil.java index 76400df1..163cec76 100644 --- a/src/main/java/ru/betterend/util/LootTableUtil.java +++ b/src/main/java/ru/betterend/util/LootTableUtil.java @@ -2,15 +2,15 @@ package ru.betterend.util; import net.fabricmc.fabric.api.loot.v1.FabricLootPoolBuilder; import net.fabricmc.fabric.api.loot.v1.event.LootTableLoadingCallback; -import net.minecraft.item.Items; +import net.minecraft.world.item.Items; import net.minecraft.loot.UniformLootTableRange; import net.minecraft.loot.condition.RandomChanceLootCondition; import net.minecraft.loot.entry.ItemEntry; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import ru.betterend.registry.EndItems; public class LootTableUtil { - private static final Identifier END_CITY_TREASURE_ID = new Identifier("chests/end_city_treasure"); + private static final ResourceLocation END_CITY_TREASURE_ID = new ResourceLocation("chests/end_city_treasure"); public static void init() { LootTableLoadingCallback.EVENT.register((resourceManager, lootManager, id, supplier, setter) -> { diff --git a/src/main/java/ru/betterend/util/RecipeHelper.java b/src/main/java/ru/betterend/util/RecipeHelper.java index a95a372c..61bdbb13 100644 --- a/src/main/java/ru/betterend/util/RecipeHelper.java +++ b/src/main/java/ru/betterend/util/RecipeHelper.java @@ -1,18 +1,18 @@ package ru.betterend.util; -import net.minecraft.block.Block; -import net.minecraft.item.ItemConvertible; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.item.ItemConvertible; +import net.minecraft.core.Registry; public class RecipeHelper { public static boolean exists(ItemConvertible item) { if (item instanceof Block) { - return Registry.BLOCK.getId((Block) item) != Registry.BLOCK.getDefaultId(); + return Registry.BLOCK.getKey((Block) item) != Registry.BLOCK.getDefaultId(); } else { return Registry.ITEM.getId(item.asItem()) != Registry.ITEM.getDefaultId(); } } - + public static boolean exists(ItemConvertible... items) { for (ItemConvertible item : items) { if (!exists(item)) { diff --git a/src/main/java/ru/betterend/util/SpawnHelper.java b/src/main/java/ru/betterend/util/SpawnHelper.java index a3d9ba15..fccf56c7 100644 --- a/src/main/java/ru/betterend/util/SpawnHelper.java +++ b/src/main/java/ru/betterend/util/SpawnHelper.java @@ -1,21 +1,21 @@ package ru.betterend.util; import net.fabricmc.fabric.mixin.object.builder.SpawnRestrictionAccessor; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.SpawnRestriction.Location; -import net.minecraft.entity.SpawnRestriction.SpawnPredicate; -import net.minecraft.entity.mob.MobEntity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.SpawnRestriction.Location; +import net.minecraft.world.entity.SpawnRestriction.SpawnPredicate; +import net.minecraft.world.entity.mob.MobEntity; import net.minecraft.world.Heightmap.Type; public class SpawnHelper { public static void restrictionAir(EntityType entity, SpawnPredicate predicate) { SpawnRestrictionAccessor.callRegister(entity, Location.NO_RESTRICTIONS, Type.MOTION_BLOCKING, predicate); } - + public static void restrictionLand(EntityType entity, SpawnPredicate predicate) { SpawnRestrictionAccessor.callRegister(entity, Location.ON_GROUND, Type.MOTION_BLOCKING, predicate); } - + public static void restrictionWater(EntityType entity, SpawnPredicate predicate) { SpawnRestrictionAccessor.callRegister(entity, Location.IN_WATER, Type.MOTION_BLOCKING, predicate); } diff --git a/src/main/java/ru/betterend/util/SplineHelper.java b/src/main/java/ru/betterend/util/SplineHelper.java index b5e15f59..e5e66ef0 100644 --- a/src/main/java/ru/betterend/util/SplineHelper.java +++ b/src/main/java/ru/betterend/util/SplineHelper.java @@ -7,11 +7,11 @@ import java.util.function.Function; import com.google.common.collect.Lists; -import net.minecraft.block.BlockState; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.MathHelper; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.util.Mth; import net.minecraft.world.StructureWorldAccess; import ru.betterend.util.sdf.SDF; import ru.betterend.util.sdf.operator.SDFUnion; @@ -24,15 +24,15 @@ public class SplineHelper { int count = points - 1; for (int i = 1; i < count; i++) { float delta = (float) i / (float) count; - float x = MathHelper.lerp(delta, x1, x2); - float y = MathHelper.lerp(delta, y1, y2); - float z = MathHelper.lerp(delta, z1, z2); + float x = Mth.lerp(delta, x1, x2); + float y = Mth.lerp(delta, y1, y2); + float z = Mth.lerp(delta, z1, z2); spline.add(new Vector3f(x, y, z)); } spline.add(new Vector3f(x2, y2, z2)); return spline; } - + public static List smoothSpline(List spline, int segmentPoints) { List result = Lists.newArrayList(); Vector3f start = spline.get(0); @@ -40,7 +40,7 @@ public class SplineHelper { Vector3f end = spline.get(i); for (int j = 0; j < segmentPoints; j++) { float delta = (float) j / segmentPoints; - delta = 0.5F - 0.5F * MathHelper.cos(delta * 3.14159F); + delta = 0.5F - 0.5F * Mth.cos(delta * 3.14159F); result.add(lerp(start, end, delta)); } start = end; @@ -48,14 +48,14 @@ public class SplineHelper { result.add(start); return result; } - + private static Vector3f lerp(Vector3f start, Vector3f end, float delta) { - float x = MathHelper.lerp(delta, start.getX(), end.getX()); - float y = MathHelper.lerp(delta, start.getY(), end.getY()); - float z = MathHelper.lerp(delta, start.getZ(), end.getZ()); + float x = Mth.lerp(delta, start.getX(), end.getX()); + float y = Mth.lerp(delta, start.getY(), end.getY()); + float z = Mth.lerp(delta, start.getZ(), end.getZ()); return new Vector3f(x, y, z); } - + public static void offsetParts(List spline, Random random, float dx, float dy, float dz) { int count = spline.size(); for (int i = 1; i < count; i++) { @@ -66,7 +66,7 @@ public class SplineHelper { pos.set(x, y, z); } } - + public static void powerOffset(List spline, float distance, float power) { int count = spline.size(); float max = count + 1; @@ -77,8 +77,9 @@ public class SplineHelper { pos.set(pos.getX(), y, pos.getZ()); } } - - public static SDF buildSDF(List spline, float radius1, float radius2, Function placerFunction) { + + public static SDF buildSDF(List spline, float radius1, float radius2, + Function placerFunction) { int count = spline.size(); float max = count - 2; SDF result = null; @@ -86,18 +87,17 @@ public class SplineHelper { for (int i = 1; i < count; i++) { Vector3f pos = spline.get(i); float delta = (float) (i - 1) / max; - SDF line = new SDFLine() - .setRadius(MathHelper.lerp(delta, radius1, radius2)) - .setStart(start.getX(), start.getY(), start.getZ()) - .setEnd(pos.getX(), pos.getY(), pos.getZ()) + SDF line = new SDFLine().setRadius(Mth.lerp(delta, radius1, radius2)) + .setStart(start.getX(), start.getY(), start.getZ()).setEnd(pos.getX(), pos.getY(), pos.getZ()) .setBlock(placerFunction); result = result == null ? line : new SDFUnion().setSourceA(result).setSourceB(line); start = pos; } return result; } - - public static SDF buildSDF(List spline, Function radiusFunction, Function placerFunction) { + + public static SDF buildSDF(List spline, Function radiusFunction, + Function placerFunction) { int count = spline.size(); float max = count - 2; SDF result = null; @@ -105,18 +105,17 @@ public class SplineHelper { for (int i = 1; i < count; i++) { Vector3f pos = spline.get(i); float delta = (float) (i - 1) / max; - SDF line = new SDFLine() - .setRadius(radiusFunction.apply(delta)) - .setStart(start.getX(), start.getY(), start.getZ()) - .setEnd(pos.getX(), pos.getY(), pos.getZ()) + SDF line = new SDFLine().setRadius(radiusFunction.apply(delta)) + .setStart(start.getX(), start.getY(), start.getZ()).setEnd(pos.getX(), pos.getY(), pos.getZ()) .setBlock(placerFunction); result = result == null ? line : new SDFUnion().setSourceA(result).setSourceB(line); start = pos; } return result; } - - public static boolean fillSpline(List spline, StructureWorldAccess world, BlockState state, BlockPos pos, Function replace) { + + public static boolean fillSpline(List spline, StructureWorldAccess world, BlockState state, BlockPos pos, + Function replace) { Vector3f startPos = spline.get(0); for (int i = 1; i < spline.size(); i++) { Vector3f endPos = spline.get(i); @@ -125,11 +124,12 @@ public class SplineHelper { } startPos = endPos; } - + return true; } - - public static void fillSplineForce(List spline, StructureWorldAccess world, BlockState state, BlockPos pos, Function replace) { + + public static void fillSplineForce(List spline, StructureWorldAccess world, BlockState state, + BlockPos pos, Function replace) { Vector3f startPos = spline.get(0); for (int i = 1; i < spline.size(); i++) { Vector3f endPos = spline.get(i); @@ -137,8 +137,9 @@ public class SplineHelper { startPos = endPos; } } - - public static boolean fillLine(Vector3f start, Vector3f end, StructureWorldAccess world, BlockState state, BlockPos pos, Function replace) { + + public static boolean fillLine(Vector3f start, Vector3f end, StructureWorldAccess world, BlockState state, + BlockPos pos, Function replace) { float dx = end.getX() - start.getX(); float dy = end.getY() - start.getY(); float dz = end.getZ() - start.getZ(); @@ -151,9 +152,9 @@ public class SplineHelper { float y = start.getY(); float z = start.getZ(); boolean down = Math.abs(dy) > 0.2; - + BlockState bState; - Mutable bPos = new Mutable(); + MutableBlockPos bPos = new MutableBlockPos(); for (int i = 0; i < count; i++) { bPos.set(x + pos.getX(), y + pos.getY(), z + pos.getZ()); bState = world.getBlockState(bPos); @@ -164,8 +165,7 @@ public class SplineHelper { if (down && bState.equals(state) || replace.apply(bState)) { BlocksHelper.setWithoutUpdate(world, bPos, state); } - } - else { + } else { return false; } x += dx; @@ -182,13 +182,13 @@ public class SplineHelper { BlocksHelper.setWithoutUpdate(world, bPos, state); } return true; - } - else { + } else { return false; } } - - public static void fillLineForce(Vector3f start, Vector3f end, StructureWorldAccess world, BlockState state, BlockPos pos, Function replace) { + + public static void fillLineForce(Vector3f start, Vector3f end, StructureWorldAccess world, BlockState state, + BlockPos pos, Function replace) { float dx = end.getX() - start.getX(); float dy = end.getY() - start.getY(); float dz = end.getZ() - start.getZ(); @@ -201,9 +201,9 @@ public class SplineHelper { float y = start.getY(); float z = start.getZ(); boolean down = Math.abs(dy) > 0.2; - + BlockState bState; - Mutable bPos = new Mutable(); + MutableBlockPos bPos = new MutableBlockPos(); for (int i = 0; i < count; i++) { bPos.set(x + pos.getX(), y + pos.getY(), z + pos.getZ()); bState = world.getBlockState(bPos); @@ -230,11 +230,12 @@ public class SplineHelper { } } } - - public static boolean canGenerate(List spline, float scale, BlockPos start, StructureWorldAccess world, Function canReplace) { + + public static boolean canGenerate(List spline, float scale, BlockPos start, StructureWorldAccess world, + Function canReplace) { int count = spline.size(); Vector3f vec = spline.get(0); - Mutable mut = new Mutable(); + MutableBlockPos mut = new MutableBlockPos(); float x1 = start.getX() + vec.getX() * scale; float y1 = start.getY() + vec.getY() * scale; float z1 = start.getZ() + vec.getZ() * scale; @@ -243,29 +244,31 @@ public class SplineHelper { float x2 = start.getX() + vec.getX() * scale; float y2 = start.getY() + vec.getY() * scale; float z2 = start.getZ() + vec.getZ() * scale; - + for (float py = y1; py < y2; py += 3) { - if (py - start.getY() < 10) continue; + if (py - start.getY() < 10) + continue; float lerp = (py - y1) / (y2 - y1); - float x = MathHelper.lerp(lerp, x1, x2); - float z = MathHelper.lerp(lerp, z1, z2); + float x = Mth.lerp(lerp, x1, x2); + float z = Mth.lerp(lerp, z1, z2); mut.set(x, py, z); if (!canReplace.apply(world.getBlockState(mut))) { return false; } } - + x1 = x2; y1 = y2; z1 = z2; } return true; } - - public static boolean canGenerate(List spline, BlockPos start, StructureWorldAccess world, Function canReplace) { + + public static boolean canGenerate(List spline, BlockPos start, StructureWorldAccess world, + Function canReplace) { int count = spline.size(); Vector3f vec = spline.get(0); - Mutable mut = new Mutable(); + MutableBlockPos mut = new MutableBlockPos(); float x1 = start.getX() + vec.getX(); float y1 = start.getY() + vec.getY(); float z1 = start.getZ() + vec.getZ(); @@ -274,25 +277,26 @@ public class SplineHelper { float x2 = start.getX() + vec.getX(); float y2 = start.getY() + vec.getY(); float z2 = start.getZ() + vec.getZ(); - + for (float py = y1; py < y2; py += 3) { - if (py - start.getY() < 10) continue; + if (py - start.getY() < 10) + continue; float lerp = (py - y1) / (y2 - y1); - float x = MathHelper.lerp(lerp, x1, x2); - float z = MathHelper.lerp(lerp, z1, z2); + float x = Mth.lerp(lerp, x1, x2); + float z = Mth.lerp(lerp, z1, z2); mut.set(x, py, z); if (!canReplace.apply(world.getBlockState(mut))) { return false; } } - + x1 = x2; y1 = y2; z1 = z2; } return true; } - + public static Vector3f getPos(List spline, float index) { int i = (int) index; int last = spline.size() - 1; @@ -302,14 +306,14 @@ public class SplineHelper { float delta = index - i; Vector3f p1 = spline.get(i); Vector3f p2 = spline.get(i + 1); - float x = MathHelper.lerp(delta, p1.getX(), p2.getX()); - float y = MathHelper.lerp(delta, p1.getY(), p2.getY()); - float z = MathHelper.lerp(delta, p1.getZ(), p2.getZ()); + float x = Mth.lerp(delta, p1.getX(), p2.getX()); + float y = Mth.lerp(delta, p1.getY(), p2.getY()); + float z = Mth.lerp(delta, p1.getZ(), p2.getZ()); return new Vector3f(x, y, z); } - + public static void rotateSpline(List spline, float angle) { - for (Vector3f v: spline) { + for (Vector3f v : spline) { float sin = (float) Math.sin(angle); float cos = (float) Math.cos(angle); float x = v.getX() * cos + v.getZ() * sin; @@ -317,27 +321,27 @@ public class SplineHelper { v.set(x, v.getY(), z); } } - + public static List copySpline(List spline) { List result = new ArrayList(spline.size()); - for (Vector3f v: spline) { + for (Vector3f v : spline) { result.add(new Vector3f(v.getX(), v.getY(), v.getZ())); } return result; } - + public static void scale(List spline, float scale) { scale(spline, scale, scale, scale); } - + public static void scale(List spline, float x, float y, float z) { - for (Vector3f v: spline) { + for (Vector3f v : spline) { v.set(v.getX() * x, v.getY() * y, v.getZ() * z); } } - + public static void offset(List spline, Vector3f offset) { - for (Vector3f v: spline) { + for (Vector3f v : spline) { v.set(offset.getX() + v.getX(), offset.getY() + v.getY(), offset.getZ() + v.getZ()); } } diff --git a/src/main/java/ru/betterend/util/StructureHelper.java b/src/main/java/ru/betterend/util/StructureHelper.java index 39879c5d..ec249958 100644 --- a/src/main/java/ru/betterend/util/StructureHelper.java +++ b/src/main/java/ru/betterend/util/StructureHelper.java @@ -11,39 +11,38 @@ import java.util.zip.ZipFile; import com.google.common.collect.Sets; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.Material; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtIo; import net.minecraft.structure.Structure; import net.minecraft.structure.StructurePlacementData; -import net.minecraft.tag.BlockTags; +import net.minecraft.tags.BlockTags; import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.Identifier; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; public class StructureHelper { private static final Direction[] DIR = BlocksHelper.makeHorizontal(); - - public static Structure readStructure(Identifier resource) { + + public static Structure readStructure(ResourceLocation resource) { String ns = resource.getNamespace(); String nm = resource.getPath(); return readStructure("/data/" + ns + "/structures/" + nm + ".nbt"); } - + public static Structure readStructure(File datapack, String path) { if (datapack.isDirectory()) { return readStructure(datapack.toString() + "/" + path); - } - else if (datapack.isFile() && datapack.getName().endsWith(".zip")) { + } else if (datapack.isFile() && datapack.getName().endsWith(".zip")) { try { ZipFile zipFile = new ZipFile(datapack); Enumeration entries = zipFile.entries(); @@ -58,25 +57,23 @@ public class StructureHelper { System.out.format("\t %s - %d - %d\n", type, compressedSize, normalSize); } zipFile.close(); - } - catch (IOException e) { + } catch (IOException e) { e.printStackTrace(); } } return null; } - + public static Structure readStructure(String path) { try { InputStream inputstream = StructureHelper.class.getResourceAsStream(path); return readStructureFromStream(inputstream); - } - catch (IOException e) { + } catch (IOException e) { e.printStackTrace(); } return null; } - + private static Structure readStructureFromStream(InputStream stream) throws IOException { CompoundTag nbttagcompound = NbtIo.readCompressed(stream); @@ -85,22 +82,25 @@ public class StructureHelper { return template; } - - public static BlockPos offsetPos(BlockPos pos, Structure structure, BlockRotation rotation, BlockMirror mirror) { + + public static BlockPos offsetPos(BlockPos pos, Structure structure, Rotation rotation, BlockMirror mirror) { BlockPos offset = Structure.transformAround(structure.getSize(), mirror, rotation, BlockPos.ORIGIN); - return pos.add(-offset.getX() * 0.5, 0, -offset.getZ() * 0.5); + return pos.offset(-offset.getX() * 0.5, 0, -offset.getZ() * 0.5); } - - public static void placeCenteredBottom(StructureWorldAccess world, BlockPos pos, Structure structure, BlockRotation rotation, BlockMirror mirror, Random random) { + + public static void placeCenteredBottom(StructureWorldAccess world, BlockPos pos, Structure structure, + Rotation rotation, BlockMirror mirror, Random random) { placeCenteredBottom(world, pos, structure, rotation, mirror, makeBox(pos), random); } - - public static void placeCenteredBottom(StructureWorldAccess world, BlockPos pos, Structure structure, BlockRotation rotation, BlockMirror mirror, BlockBox bounds, Random random) { + + public static void placeCenteredBottom(StructureWorldAccess world, BlockPos pos, Structure structure, + Rotation rotation, BlockMirror mirror, BlockBox bounds, Random random) { BlockPos offset = offsetPos(pos, structure, rotation, mirror); - StructurePlacementData placementData = new StructurePlacementData().setRotation(rotation).setMirror(mirror).setBoundingBox(bounds); + StructurePlacementData placementData = new StructurePlacementData().setRotation(rotation).setMirror(mirror) + .setBoundingBox(bounds); structure.place(world, offset, placementData, random); } - + private static BlockBox makeBox(BlockPos pos) { int sx = ((pos.getX() >> 4) << 4) - 16; int sz = ((pos.getZ() >> 4) << 4) - 16; @@ -108,28 +108,29 @@ public class StructureHelper { int ez = sz + 47; return BlockBox.create(sx, 0, sz, ex, 255, ez); } - - public static BlockBox getStructureBounds(BlockPos pos, Structure structure, BlockRotation rotation, BlockMirror mirror) { + + public static BlockBox getStructureBounds(BlockPos pos, Structure structure, Rotation rotation, + BlockMirror mirror) { BlockPos max = structure.getSize(); BlockPos min = Structure.transformAround(structure.getSize(), mirror, rotation, BlockPos.ORIGIN); max = max.subtract(min); return new BlockBox(min.add(pos), max.add(pos)); } - + public static BlockBox intersectBoxes(BlockBox box1, BlockBox box2) { int x1 = MHelper.max(box1.minX, box2.minX); int y1 = MHelper.max(box1.minY, box2.minY); int z1 = MHelper.max(box1.minZ, box2.minZ); - + int x2 = MHelper.min(box1.maxX, box2.maxX); int y2 = MHelper.min(box1.maxY, box2.maxY); int z2 = MHelper.min(box1.maxZ, box2.maxZ); - + return BlockBox.create(x1, y1, z1, x2, y2, z2); } - + public static void erode(StructureWorldAccess world, BlockBox bounds, int iterations, Random random) { - Mutable mut = new Mutable(); + MutableBlockPos mut = new MutableBlockPos(); boolean canDestruct = true; for (int i = 0; i < iterations; i++) { for (int x = bounds.minX; x <= bounds.maxX; x++) { @@ -139,7 +140,8 @@ public class StructureHelper { for (int y = bounds.maxY; y >= bounds.minY; y--) { mut.setY(y); BlockState state = world.getBlockState(mut); - if (canDestruct && state.isOf(EndBlocks.FLAVOLITE_RUNED_ETERNAL) && random.nextInt(8) == 0 && world.isAir(mut.down(2))) { + if (canDestruct && state.is(EndBlocks.FLAVOLITE_RUNED_ETERNAL) && random.nextInt(8) == 0 + && world.isAir(mut.down(2))) { int r = MHelper.randRange(1, 4, random); int cx = mut.getX(); int cy = mut.getY(); @@ -162,7 +164,8 @@ public class StructureHelper { int dz = pz - cz; dz *= dz; mut.setZ(pz); - if (dx + dy + dz <= r && world.getBlockState(mut).isOf(EndBlocks.FLAVOLITE_RUNED_ETERNAL)) { + if (dx + dy + dz <= r + && world.getBlockState(mut).is(EndBlocks.FLAVOLITE_RUNED_ETERNAL)) { BlocksHelper.setWithoutUpdate(world, mut, Blocks.AIR); } } @@ -173,14 +176,13 @@ public class StructureHelper { mut.setZ(cz); canDestruct = false; continue; - } - else if (ignore(state)) { + } else if (ignore(state)) { continue; } if (!state.isAir() && random.nextBoolean()) { shuffle(random); - for (Direction dir: DIR) { - if (world.isAir(mut.offset(dir)) && world.isAir(mut.down().offset(dir))) { + for (Direction dir : DIR) { + if (world.isAir(mut.offset(dir)) && world.isAir(mut.below().offset(dir))) { BlocksHelper.setWithoutUpdate(world, mut, Blocks.AIR); mut.move(dir).move(Direction.DOWN); for (int py = mut.getY(); y >= bounds.minY - 10; y--) { @@ -194,8 +196,8 @@ public class StructureHelper { } } break; - } - else if (random.nextInt(8) == 0 && !world.getBlockState(mut.up()).isOf(EndBlocks.ETERNAL_PEDESTAL)) { + } else if (random.nextInt(8) == 0 + && !world.getBlockState(mut.up()).is(EndBlocks.ETERNAL_PEDESTAL)) { BlocksHelper.setWithoutUpdate(world, mut, Blocks.AIR); } } @@ -209,7 +211,7 @@ public class StructureHelper { for (int y = bounds.maxY; y >= bounds.minY; y--) { mut.setY(y); BlockState state = world.getBlockState(mut); - if (!ignore(state) && world.isAir(mut.down())) { + if (!ignore(state) && world.isAir(mut.below())) { BlocksHelper.setWithoutUpdate(world, mut, Blocks.AIR); for (int py = mut.getY(); py >= bounds.minY - 10; py--) { mut.setY(py - 1); @@ -226,8 +228,8 @@ public class StructureHelper { } public static void erodeIntense(StructureWorldAccess world, BlockBox bounds, Random random) { - Mutable mut = new Mutable(); - Mutable mut2 = new Mutable(); + MutableBlockPos mut = new MutableBlockPos(); + MutableBlockPos mut2 = new MutableBlockPos(); int minY = bounds.minY - 10; for (int x = bounds.minX; x <= bounds.maxX; x++) { mut.setX(x); @@ -251,8 +253,7 @@ public class StructureHelper { BlocksHelper.setWithoutUpdate(world, mut2, state); } } - } - else if (random.nextInt(8) == 0) { + } else if (random.nextInt(8) == 0) { BlocksHelper.setWithoutUpdate(world, mut, Blocks.AIR); } } @@ -262,23 +263,23 @@ public class StructureHelper { drop(world, bounds); } - + private static boolean isTerrainNear(StructureWorldAccess world, BlockPos pos) { - for (Direction dir: BlocksHelper.DIRECTIONS) { - if (world.getBlockState(pos.offset(dir)).isIn(EndTags.GEN_TERRAIN)) { + for (Direction dir : BlocksHelper.DIRECTIONS) { + if (world.getBlockState(pos.relative(dir)).isIn(EndTags.GEN_TERRAIN)) { return true; } } return false; } - + private static void drop(StructureWorldAccess world, BlockBox bounds) { - Mutable mut = new Mutable(); - + MutableBlockPos mut = new MutableBlockPos(); + Set blocks = Sets.newHashSet(); Set edge = Sets.newHashSet(); Set add = Sets.newHashSet(); - + for (int x = bounds.minX; x <= bounds.maxX; x++) { mut.setX(x); for (int z = bounds.minZ; z <= bounds.maxZ; z++) { @@ -292,14 +293,14 @@ public class StructureHelper { } } } - + if (edge.isEmpty()) { return; } - + while (!edge.isEmpty()) { - for (BlockPos center: edge) { - for (Direction dir: BlocksHelper.DIRECTIONS) { + for (BlockPos center : edge) { + for (Direction dir : BlocksHelper.DIRECTIONS) { BlockState state = world.getBlockState(center); if (state.isFullCube(world, center)) { mut.set(center).move(dir); @@ -312,13 +313,13 @@ public class StructureHelper { } } } - + blocks.addAll(edge); edge.clear(); edge.addAll(add); add.clear(); } - + int minY = bounds.minY - 10; for (int x = bounds.minX; x <= bounds.maxX; x++) { mut.setX(x); @@ -343,17 +344,12 @@ public class StructureHelper { } private static boolean ignore(BlockState state) { - return state.getMaterial().isReplaceable() - || !state.getFluidState().isEmpty() - || state.isIn(EndTags.END_GROUND) - || state.isOf(EndBlocks.ETERNAL_PEDESTAL) - || state.isOf(EndBlocks.FLAVOLITE_RUNED_ETERNAL) - || state.isIn(BlockTags.LOGS) - || state.isIn(BlockTags.LEAVES) - || state.getMaterial().equals(Material.PLANT) - || state.getMaterial().equals(Material.LEAVES); + return state.getMaterial().isReplaceable() || !state.getFluidState().isEmpty() || state.isIn(EndTags.END_GROUND) + || state.is(EndBlocks.ETERNAL_PEDESTAL) || state.is(EndBlocks.FLAVOLITE_RUNED_ETERNAL) + || state.isIn(BlockTags.LOGS) || state.isIn(BlockTags.LEAVES) + || state.getMaterial().equals(Material.PLANT) || state.getMaterial().equals(Material.LEAVES); } - + private static void shuffle(Random random) { for (int i = 0; i < 4; i++) { int j = random.nextInt(4); @@ -362,9 +358,9 @@ public class StructureHelper { DIR[j] = d; } } - + public static void cover(StructureWorldAccess world, BlockBox bounds, Random random) { - Mutable mut = new Mutable(); + MutableBlockPos mut = new MutableBlockPos(); for (int x = bounds.minX; x <= bounds.maxX; x++) { mut.setX(x); for (int z = bounds.minZ; z <= bounds.maxZ; z++) { diff --git a/src/main/java/ru/betterend/util/TagHelper.java b/src/main/java/ru/betterend/util/TagHelper.java index 1cec51dd..5710e020 100644 --- a/src/main/java/ru/betterend/util/TagHelper.java +++ b/src/main/java/ru/betterend/util/TagHelper.java @@ -6,70 +6,70 @@ import java.util.Set; import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import net.minecraft.block.Block; -import net.minecraft.item.Item; -import net.minecraft.item.ItemConvertible; -import net.minecraft.tag.Tag; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemConvertible; +import net.minecraft.tags.Tag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; public class TagHelper { - private static final Map> TAGS_BLOCK = Maps.newHashMap(); - private static final Map> TAGS_ITEM = Maps.newHashMap(); - + private static final Map> TAGS_BLOCK = Maps.newHashMap(); + private static final Map> TAGS_ITEM = Maps.newHashMap(); + public static void addTag(Tag.Identified tag, Block... blocks) { - Identifier tagID = tag.getId(); - Set set = TAGS_BLOCK.get(tagID); + ResourceLocation tagID = tag.getId(); + Set set = TAGS_BLOCK.get(tagID); if (set == null) { set = Sets.newHashSet(); TAGS_BLOCK.put(tagID, set); } - for (Block block: blocks) { - Identifier id = Registry.BLOCK.getId(block); + for (Block block : blocks) { + ResourceLocation id = Registry.BLOCK.getKey(block); if (id != Registry.BLOCK.getDefaultId()) { set.add(id); } } } - + public static void addTag(Tag.Identified tag, ItemConvertible... items) { - Identifier tagID = tag.getId(); - Set set = TAGS_ITEM.get(tagID); + ResourceLocation tagID = tag.getId(); + Set set = TAGS_ITEM.get(tagID); if (set == null) { set = Sets.newHashSet(); TAGS_ITEM.put(tagID, set); } - for (ItemConvertible item: items) { - Identifier id = Registry.ITEM.getId(item.asItem()); + for (ItemConvertible item : items) { + ResourceLocation id = Registry.ITEM.getId(item.asItem()); if (id != Registry.ITEM.getDefaultId()) { set.add(id); } } } - + @SafeVarargs public static void addTags(ItemConvertible item, Tag.Identified... tags) { - for (Tag.Identified tag: tags) { + for (Tag.Identified tag : tags) { addTag(tag, item); } } - + @SafeVarargs public static void addTags(Block block, Tag.Identified... tags) { - for (Tag.Identified tag: tags) { + for (Tag.Identified tag : tags) { addTag(tag, block); } } - - public static Tag.Builder apply(Tag.Builder builder, Set ids) { + + public static Tag.Builder apply(Tag.Builder builder, Set ids) { ids.forEach((value) -> { builder.add(value, "Better End Code"); }); return builder; } - - public static void apply(String entry, Map tagsMap) { - Map> endTags = null; + + public static void apply(String entry, Map tagsMap) { + Map> endTags = null; if (entry.equals("block")) { endTags = TAGS_BLOCK; } else if (entry.equals("item")) { diff --git a/src/main/java/ru/betterend/util/TranslationHelper.java b/src/main/java/ru/betterend/util/TranslationHelper.java index bc13490f..1911dff5 100644 --- a/src/main/java/ru/betterend/util/TranslationHelper.java +++ b/src/main/java/ru/betterend/util/TranslationHelper.java @@ -9,8 +9,8 @@ import com.google.common.collect.Lists; import com.google.gson.Gson; import com.google.gson.JsonObject; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import ru.betterend.BetterEnd; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndItems; @@ -19,15 +19,15 @@ public class TranslationHelper { public static void printMissingNames() { List missingNamesEn = Lists.newArrayList(); List missingNamesRu = Lists.newArrayList(); - + Gson gson = new Gson(); InputStream streamEn = BetterEnd.class.getResourceAsStream("/assets/betterend/lang/en_us.json"); InputStream streamRu = BetterEnd.class.getResourceAsStream("/assets/betterend/lang/ru_ru.json"); JsonObject translationEn = gson.fromJson(new InputStreamReader(streamEn), JsonObject.class); JsonObject translationRu = gson.fromJson(new InputStreamReader(streamRu), JsonObject.class); - + Registry.BLOCK.forEach((block) -> { - if (Registry.BLOCK.getId(block).getNamespace().equals(BetterEnd.MOD_ID)) { + if (Registry.BLOCK.getKey(block).getNamespace().equals(BetterEnd.MOD_ID)) { String name = block.getName().getString(); if (!translationEn.has(name)) { missingNamesEn.add(name); @@ -37,7 +37,7 @@ public class TranslationHelper { } } }); - + EndItems.getModItems().forEach((item) -> { String name = item.getName().getString(); if (!translationEn.has(name)) { @@ -47,7 +47,7 @@ public class TranslationHelper { missingNamesRu.add(name); } }); - + EndBiomes.getModBiomes().forEach((endBiome) -> { if (endBiome.getID().getNamespace().equals(BetterEnd.MOD_ID)) { String name = "biome." + BetterEnd.MOD_ID + "." + endBiome.getID().getPath(); @@ -59,9 +59,9 @@ public class TranslationHelper { } } }); - + Registry.ENTITY_TYPE.forEach((entity) -> { - Identifier id = Registry.ENTITY_TYPE.getId(entity); + ResourceLocation id = Registry.ENTITY_TYPE.getId(entity); if (id.getNamespace().equals(BetterEnd.MOD_ID)) { String name = "entity." + BetterEnd.MOD_ID + "." + id.getPath(); if (!translationEn.has(name)) { @@ -72,12 +72,12 @@ public class TranslationHelper { } } }); - + if (!missingNamesEn.isEmpty() || !missingNamesRu.isEmpty()) { - + System.out.println("========================================"); System.out.println(" MISSING NAMES LIST"); - + if (!missingNamesEn.isEmpty()) { Collections.sort(missingNamesEn); System.out.println("========================================"); @@ -87,7 +87,7 @@ public class TranslationHelper { System.out.println(" \"" + name + "\": \"" + fastTranslateEn(name) + "\","); }); } - + if (!missingNamesRu.isEmpty()) { Collections.sort(missingNamesRu); System.out.println("========================================"); @@ -97,11 +97,11 @@ public class TranslationHelper { System.out.println(" \"" + name + "\": \"\","); }); } - + System.out.println("========================================"); } } - + public static String fastTranslateEn(String text) { String[] words = text.substring(text.lastIndexOf('.') + 1).split("_"); StringBuilder builder = new StringBuilder(); diff --git a/src/main/java/ru/betterend/util/WorldDataUtil.java b/src/main/java/ru/betterend/util/WorldDataUtil.java index e881ba09..5c99bcab 100644 --- a/src/main/java/ru/betterend/util/WorldDataUtil.java +++ b/src/main/java/ru/betterend/util/WorldDataUtil.java @@ -10,34 +10,32 @@ import ru.betterend.BetterEnd; public class WorldDataUtil { private static CompoundTag root; private static File saveFile; - + public static void load(File file) { saveFile = file; if (file.exists()) { try { root = NbtIo.readCompressed(file); - } - catch (IOException e) { - BetterEnd.LOGGER.error("World data loading failed", e); + } catch (IOException e) { + BetterEnd.LOGGER.error("Level data loading failed", e); root = new CompoundTag(); } return; } root = new CompoundTag(); } - + public static CompoundTag getRootTag() { return root; } - + public static CompoundTag getCompoundTag(String path) { String[] parts = path.split("\\."); CompoundTag tag = root; - for (String part: parts) { + for (String part : parts) { if (tag.contains(part)) { tag = tag.getCompound(part); - } - else { + } else { CompoundTag t = new CompoundTag(); tag.put(part, t); tag = t; @@ -45,13 +43,12 @@ public class WorldDataUtil { } return tag; } - + public static void saveFile() { try { NbtIo.writeCompressed(root, saveFile); - } - catch (IOException e) { - BetterEnd.LOGGER.error("World data saving failed", e); + } catch (IOException e) { + BetterEnd.LOGGER.error("Level data saving failed", e); } } } diff --git a/src/main/java/ru/betterend/util/sdf/PosInfo.java b/src/main/java/ru/betterend/util/sdf/PosInfo.java index bf5483b8..8594141f 100644 --- a/src/main/java/ru/betterend/util/sdf/PosInfo.java +++ b/src/main/java/ru/betterend/util/sdf/PosInfo.java @@ -2,33 +2,33 @@ package ru.betterend.util.sdf; import java.util.Map; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; public class PosInfo implements Comparable { - private static final BlockState AIR = Blocks.AIR.getDefaultState(); + private static final BlockState AIR = Blocks.AIR.defaultBlockState(); private final Map blocks; private final Map add; private final BlockPos pos; private BlockState state; - + public static PosInfo create(Map blocks, Map add, BlockPos pos) { return new PosInfo(blocks, add, pos); } - + private PosInfo(Map blocks, Map add, BlockPos pos) { this.blocks = blocks; this.add = add; this.pos = pos; blocks.put(pos, this); } - + public BlockState getState() { return state; } - + public BlockState getState(BlockPos pos) { PosInfo info = blocks.get(pos); if (info == null) { @@ -37,48 +37,48 @@ public class PosInfo implements Comparable { } return info.getState(); } - + public void setState(BlockState state) { this.state = state; } - + public void setState(BlockPos pos, BlockState state) { PosInfo info = blocks.get(pos); if (info != null) { info.setState(state); } } - + public BlockState getState(Direction dir) { - PosInfo info = blocks.get(pos.offset(dir)); + PosInfo info = blocks.get(pos.relative(dir)); if (info == null) { - info = add.get(pos.offset(dir)); + info = add.get(pos.relative(dir)); return info == null ? AIR : info.getState(); } return info.getState(); } - + public BlockState getState(Direction dir, int distance) { - PosInfo info = blocks.get(pos.offset(dir, distance)); + PosInfo info = blocks.get(pos.relative(dir, distance)); if (info == null) { return AIR; } return info.getState(); } - + public BlockState getStateUp() { return getState(Direction.UP); } - + public BlockState getStateDown() { return getState(Direction.DOWN); } - + @Override public int hashCode() { return pos.hashCode(); } - + @Override public boolean equals(Object obj) { if (!(obj instanceof PosInfo)) { @@ -95,7 +95,7 @@ public class PosInfo implements Comparable { public BlockPos getPos() { return pos; } - + public void setBlockPos(BlockPos pos, BlockState state) { PosInfo info = new PosInfo(blocks, add, pos); info.state = state; diff --git a/src/main/java/ru/betterend/util/sdf/SDF.java b/src/main/java/ru/betterend/util/sdf/SDF.java index 74aff385..a75ff615 100644 --- a/src/main/java/ru/betterend/util/sdf/SDF.java +++ b/src/main/java/ru/betterend/util/sdf/SDF.java @@ -11,11 +11,11 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.util.math.Box; -import net.minecraft.util.math.Direction; +import net.minecraft.core.Direction; import net.minecraft.world.ServerWorldAccess; import ru.betterend.util.BlocksHelper; import ru.betterend.world.structures.StructureWorld; @@ -27,19 +27,19 @@ public abstract class SDF { }; public abstract float getDistance(float x, float y, float z); - + public abstract BlockState getBlockState(BlockPos pos); - + public SDF addPostProcess(Function postProcess) { this.postProcesses.add(postProcess); return this; } - + public SDF setReplaceFunction(Function canReplace) { this.canReplace = canReplace; return this; } - + public void fillRecursive(ServerWorldAccess world, BlockPos start) { Map mapWorld = Maps.newHashMap(); Map addInfo = Maps.newHashMap(); @@ -48,15 +48,15 @@ public abstract class SDF { Set add = Sets.newHashSet(); ends.add(new BlockPos(0, 0, 0)); boolean run = true; - - Mutable bPos = new Mutable(); - + + MutableBlockPos bPos = new MutableBlockPos(); + while (run) { - for (BlockPos center: ends) { - for (Direction dir: Direction.values()) { + for (BlockPos center : ends) { + for (Direction dir : Direction.values()) { bPos.set(center).move(dir); BlockPos wpos = bPos.add(start); - + if (!blocks.contains(bPos) && canReplace.apply(world.getBlockState(wpos))) { if (this.getDistance(bPos.getX(), bPos.getY(), bPos.getZ()) < 0) { BlockState state = getBlockState(wpos); @@ -66,15 +66,15 @@ public abstract class SDF { } } } - + blocks.addAll(ends); ends.clear(); ends.addAll(add); add.clear(); - + run &= !ends.isEmpty(); } - + List infos = new ArrayList(mapWorld.values()); if (infos.size() > 0) { Collections.sort(infos); @@ -102,12 +102,12 @@ public abstract class SDF { }); } } - + public void fillArea(ServerWorldAccess world, BlockPos center, Box box) { Map mapWorld = Maps.newHashMap(); Map addInfo = Maps.newHashMap(); - - Mutable mut = new Mutable(); + + MutableBlockPos mut = new MutableBlockPos(); for (int y = (int) box.minY; y <= box.maxY; y++) { mut.setY(y); for (int x = (int) box.minX; x <= box.maxX; x++) { @@ -123,7 +123,7 @@ public abstract class SDF { } } } - + List infos = new ArrayList(mapWorld.values()); if (infos.size() > 0) { Collections.sort(infos); @@ -151,7 +151,7 @@ public abstract class SDF { }); } } - + public void fillRecursiveIgnore(ServerWorldAccess world, BlockPos start, Function ignore) { Map mapWorld = Maps.newHashMap(); Map addInfo = Maps.newHashMap(); @@ -160,12 +160,12 @@ public abstract class SDF { Set add = Sets.newHashSet(); ends.add(new BlockPos(0, 0, 0)); boolean run = true; - - Mutable bPos = new Mutable(); - + + MutableBlockPos bPos = new MutableBlockPos(); + while (run) { - for (BlockPos center: ends) { - for (Direction dir: Direction.values()) { + for (BlockPos center : ends) { + for (Direction dir : Direction.values()) { bPos.set(center).move(dir); BlockPos wpos = bPos.add(start); BlockState state = world.getBlockState(wpos); @@ -178,15 +178,15 @@ public abstract class SDF { } } } - + blocks.addAll(ends); ends.clear(); ends.addAll(add); add.clear(); - + run &= !ends.isEmpty(); } - + List infos = new ArrayList(mapWorld.values()); if (infos.size() > 0) { Collections.sort(infos); @@ -214,7 +214,7 @@ public abstract class SDF { }); } } - + public void fillRecursive(StructureWorld world, BlockPos start) { Map mapWorld = Maps.newHashMap(); Map addInfo = Maps.newHashMap(); @@ -223,15 +223,15 @@ public abstract class SDF { Set add = Sets.newHashSet(); ends.add(new BlockPos(0, 0, 0)); boolean run = true; - - Mutable bPos = new Mutable(); - + + MutableBlockPos bPos = new MutableBlockPos(); + while (run) { - for (BlockPos center: ends) { - for (Direction dir: Direction.values()) { + for (BlockPos center : ends) { + for (Direction dir : Direction.values()) { bPos.set(center).move(dir); BlockPos wpos = bPos.add(start); - + if (!blocks.contains(bPos)) { if (this.getDistance(bPos.getX(), bPos.getY(), bPos.getZ()) < 0) { BlockState state = getBlockState(wpos); @@ -241,15 +241,15 @@ public abstract class SDF { } } } - + blocks.addAll(ends); ends.clear(); ends.addAll(add); add.clear(); - + run &= !ends.isEmpty(); } - + List infos = new ArrayList(mapWorld.values()); Collections.sort(infos); postProcesses.forEach((postProcess) -> { @@ -260,7 +260,7 @@ public abstract class SDF { infos.forEach((info) -> { world.setBlock(info.getPos(), info.getState()); }); - + infos.clear(); infos.addAll(addInfo.values()); Collections.sort(infos); @@ -273,19 +273,19 @@ public abstract class SDF { world.setBlock(info.getPos(), info.getState()); }); } - + public Set getPositions(ServerWorldAccess world, BlockPos start) { Set blocks = Sets.newHashSet(); Set ends = Sets.newHashSet(); Set add = Sets.newHashSet(); ends.add(new BlockPos(0, 0, 0)); boolean run = true; - - Mutable bPos = new Mutable(); - + + MutableBlockPos bPos = new MutableBlockPos(); + while (run) { - for (BlockPos center: ends) { - for (Direction dir: Direction.values()) { + for (BlockPos center : ends) { + for (Direction dir : Direction.values()) { bPos.set(center).move(dir); BlockPos wpos = bPos.add(start); BlockState state = world.getBlockState(wpos); @@ -296,15 +296,15 @@ public abstract class SDF { } } } - + ends.forEach((end) -> blocks.add(end.add(start))); ends.clear(); ends.addAll(add); add.clear(); - + run &= !ends.isEmpty(); } - + return blocks; } } diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFBinary.java b/src/main/java/ru/betterend/util/sdf/operator/SDFBinary.java index 4c8fd72f..167de382 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFBinary.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFBinary.java @@ -1,28 +1,28 @@ package ru.betterend.util.sdf.operator; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; import ru.betterend.util.sdf.SDF; public abstract class SDFBinary extends SDF { protected SDF sourceA; protected SDF sourceB; protected boolean firstValue; - + public SDFBinary setSourceA(SDF sourceA) { this.sourceA = sourceA; return this; } - + public SDFBinary setSourceB(SDF sourceB) { this.sourceB = sourceB; return this; } - + protected void selectValue(float a, float b) { firstValue = a < b; } - + @Override public BlockState getBlockState(BlockPos pos) { if (firstValue) { diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFHeightmap.java b/src/main/java/ru/betterend/util/sdf/operator/SDFHeightmap.java index c0129ba5..a82b50e4 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFHeightmap.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFHeightmap.java @@ -1,7 +1,7 @@ package ru.betterend.util.sdf.operator; import net.minecraft.client.texture.NativeImage; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; public class SDFHeightmap extends SDFDisplacement { private float intensity = 1F; @@ -11,18 +11,18 @@ public class SDFHeightmap extends SDFDisplacement { private float scale; private float cos = 1; private float sin = 0; - + public SDFHeightmap() { setFunction((pos) -> { if (map == null) { return 0F; } - float px = MathHelper.clamp(pos.getX() * scale + offsetX, 0, map.getWidth() - 2); - float pz = MathHelper.clamp(pos.getZ() * scale + offsetZ, 0, map.getHeight() - 2); + float px = Mth.clamp(pos.getX() * scale + offsetX, 0, map.getWidth() - 2); + float pz = Mth.clamp(pos.getZ() * scale + offsetZ, 0, map.getHeight() - 2); float dx = (px * cos - pz * sin); float dz = (pz * cos + px * sin); - int x1 = MathHelper.floor(dx); - int z1 = MathHelper.floor(dz); + int x1 = Mth.floor(dx); + int z1 = Mth.floor(dz); int x2 = x1 + 1; int z2 = z1 + 1; dx = dx - x1; @@ -31,12 +31,12 @@ public class SDFHeightmap extends SDFDisplacement { float b = (map.getPixelColor(x2, z1) & 255) / 255F; float c = (map.getPixelColor(x1, z2) & 255) / 255F; float d = (map.getPixelColor(x2, z2) & 255) / 255F; - a = MathHelper.lerp(dx, a, b); - b = MathHelper.lerp(dx, c, d); - return -MathHelper.lerp(dz, a, b) * intensity; + a = Mth.lerp(dx, a, b); + b = Mth.lerp(dx, c, d); + return -Mth.lerp(dz, a, b) * intensity; }); } - + public SDFHeightmap setMap(NativeImage map) { this.map = map; offsetX = map.getWidth() * 0.5F; @@ -44,18 +44,18 @@ public class SDFHeightmap extends SDFDisplacement { scale = map.getWidth(); return this; } - + public SDFHeightmap setAngle(float angle) { - sin = MathHelper.sin(angle); - cos = MathHelper.cos(angle); + sin = Mth.sin(angle); + cos = Mth.cos(angle); return this; } - + public SDFHeightmap setScale(float scale) { this.scale = map.getWidth() * scale; return this; } - + public SDFHeightmap setIntensity(float intensity) { this.intensity = intensity; return this; diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFRadialNoiseMap.java b/src/main/java/ru/betterend/util/sdf/operator/SDFRadialNoiseMap.java index eeeb6918..b428973d 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFRadialNoiseMap.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFRadialNoiseMap.java @@ -1,19 +1,19 @@ package ru.betterend.util.sdf.operator; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; public class SDFRadialNoiseMap extends SDFDisplacement { - private static final float SIN = MathHelper.sin(0.5F); - private static final float COS = MathHelper.cos(0.5F); - + private static final float SIN = Mth.sin(0.5F); + private static final float COS = Mth.cos(0.5F); + private OpenSimplexNoise noise; private float intensity = 1F; private float radius = 1F; private short offsetX; private short offsetZ; - + public SDFRadialNoiseMap() { setFunction((pos) -> { if (intensity == 0) { @@ -25,33 +25,34 @@ public class SDFRadialNoiseMap extends SDFDisplacement { if (distance > 1) { return 0F; } - distance = 1 - MathHelper.sqrt(distance); + distance = 1 - Mth.sqrt(distance); float nx = px * COS - pz * SIN; float nz = pz * COS + px * SIN; distance *= getNoise(nx * 0.75 + offsetX, nz * 0.75 + offsetZ); return distance * intensity; }); } - + private float getNoise(double x, double z) { - return (float) noise.eval(x, z) + (float) noise.eval(x * 3 + 1000, z * 3) * 0.5F + (float) noise.eval(x * 9 + 1000, z * 9) * 0.2F; + return (float) noise.eval(x, z) + (float) noise.eval(x * 3 + 1000, z * 3) * 0.5F + + (float) noise.eval(x * 9 + 1000, z * 9) * 0.2F; } - + public SDFRadialNoiseMap setSeed(long seed) { noise = new OpenSimplexNoise(seed); return this; } - + public SDFRadialNoiseMap setIntensity(float intensity) { this.intensity = intensity; return this; } - + public SDFRadialNoiseMap setRadius(float radius) { this.radius = radius; return this; } - + public SDFRadialNoiseMap setOffset(int x, int z) { offsetX = (short) (x & 32767); offsetZ = (short) (z & 32767); diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothIntersection.java b/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothIntersection.java index d8643d64..e9aa513c 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothIntersection.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothIntersection.java @@ -1,6 +1,6 @@ package ru.betterend.util.sdf.operator; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; public class SDFSmoothIntersection extends SDFBinary { private float radius; @@ -9,13 +9,13 @@ public class SDFSmoothIntersection extends SDFBinary { this.radius = radius; return this; } - + @Override public float getDistance(float x, float y, float z) { float a = this.sourceA.getDistance(x, y, z); float b = this.sourceB.getDistance(x, y, z); this.selectValue(a, b); - float h = MathHelper.clamp(0.5F - 0.5F * (b - a) / radius, 0F, 1F); - return MathHelper.lerp(h, b, a) + radius * h * (1F - h); + float h = Mth.clamp(0.5F - 0.5F * (b - a) / radius, 0F, 1F); + return Mth.lerp(h, b, a) + radius * h * (1F - h); } } diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothSubtraction.java b/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothSubtraction.java index 2f24c1b6..98ba21c1 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothSubtraction.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothSubtraction.java @@ -1,6 +1,6 @@ package ru.betterend.util.sdf.operator; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; public class SDFSmoothSubtraction extends SDFBinary { private float radius; @@ -9,13 +9,13 @@ public class SDFSmoothSubtraction extends SDFBinary { this.radius = radius; return this; } - + @Override public float getDistance(float x, float y, float z) { float a = this.sourceA.getDistance(x, y, z); float b = this.sourceB.getDistance(x, y, z); this.selectValue(a, b); - float h = MathHelper.clamp(0.5F - 0.5F * (b + a) / radius, 0F, 1F); - return MathHelper.lerp(h, b, -a) + radius * h * (1F - h); + float h = Mth.clamp(0.5F - 0.5F * (b + a) / radius, 0F, 1F); + return Mth.lerp(h, b, -a) + radius * h * (1F - h); } } diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothUnion.java b/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothUnion.java index 417edc0a..103156fc 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothUnion.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothUnion.java @@ -1,6 +1,6 @@ package ru.betterend.util.sdf.operator; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; public class SDFSmoothUnion extends SDFBinary { private float radius; @@ -15,7 +15,7 @@ public class SDFSmoothUnion extends SDFBinary { float a = this.sourceA.getDistance(x, y, z); float b = this.sourceB.getDistance(x, y, z); this.selectValue(a, b); - float h = MathHelper.clamp(0.5F + 0.5F * (b - a) / radius, 0F, 1F); - return MathHelper.lerp(h, b, a) - radius * h * (1F - h); + float h = Mth.clamp(0.5F + 0.5F * (b - a) / radius, 0F, 1F); + return Mth.lerp(h, b, a) - radius * h * (1F - h); } } diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFUnary.java b/src/main/java/ru/betterend/util/sdf/operator/SDFUnary.java index 83ea8cc4..29286ad5 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFUnary.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFUnary.java @@ -1,17 +1,17 @@ package ru.betterend.util.sdf.operator; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; import ru.betterend.util.sdf.SDF; public abstract class SDFUnary extends SDF { protected SDF source; - + public SDFUnary setSource(SDF source) { this.source = source; return this; } - + @Override public BlockState getBlockState(BlockPos pos) { return source.getBlockState(pos); diff --git a/src/main/java/ru/betterend/util/sdf/primitive/SDFCappedCone.java b/src/main/java/ru/betterend/util/sdf/primitive/SDFCappedCone.java index 206a54de..580c6dfb 100644 --- a/src/main/java/ru/betterend/util/sdf/primitive/SDFCappedCone.java +++ b/src/main/java/ru/betterend/util/sdf/primitive/SDFCappedCone.java @@ -1,23 +1,23 @@ package ru.betterend.util.sdf.primitive; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; import ru.betterend.util.MHelper; public class SDFCappedCone extends SDFPrimitive { private float radius1; private float radius2; private float height; - + public SDFCappedCone setRadius1(float radius) { this.radius1 = radius; return this; } - + public SDFCappedCone setRadius2(float radius) { this.radius2 = radius; return this; } - + public SDFCappedCone setHeight(float height) { this.height = height; return this; @@ -30,7 +30,8 @@ public class SDFCappedCone extends SDFPrimitive { float k2y = 2 * height; float cax = qx - MHelper.min(qx, (y < 0F) ? radius1 : radius2); float cay = Math.abs(y) - height; - float mlt = MathHelper.clamp(MHelper.dot(radius2 - qx, height - y, k2x, k2y) / MHelper.dot(k2x, k2y, k2x, k2y), 0F, 1F); + float mlt = Mth.clamp(MHelper.dot(radius2 - qx, height - y, k2x, k2y) / MHelper.dot(k2x, k2y, k2x, k2y), 0F, + 1F); float cbx = qx - radius2 + k2x * mlt; float cby = y - height + k2y * mlt; float s = (cbx < 0F && cay < 0F) ? -1F : 1F; diff --git a/src/main/java/ru/betterend/util/sdf/primitive/SDFCapsule.java b/src/main/java/ru/betterend/util/sdf/primitive/SDFCapsule.java index 404b9e24..4242d18f 100644 --- a/src/main/java/ru/betterend/util/sdf/primitive/SDFCapsule.java +++ b/src/main/java/ru/betterend/util/sdf/primitive/SDFCapsule.java @@ -1,24 +1,24 @@ package ru.betterend.util.sdf.primitive; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; import ru.betterend.util.MHelper; public class SDFCapsule extends SDFPrimitive { private float radius; private float height; - + public SDFCapsule setRadius(float radius) { this.radius = radius; return this; } - + public SDFCapsule setHeight(float height) { this.height = height; return this; } - + @Override public float getDistance(float x, float y, float z) { - return MHelper.length(x, y - MathHelper.clamp(y, 0, height), z) - radius; + return MHelper.length(x, y - Mth.clamp(y, 0, height), z) - radius; } } diff --git a/src/main/java/ru/betterend/util/sdf/primitive/SDFLine.java b/src/main/java/ru/betterend/util/sdf/primitive/SDFLine.java index 15d46396..e35fc302 100644 --- a/src/main/java/ru/betterend/util/sdf/primitive/SDFLine.java +++ b/src/main/java/ru/betterend/util/sdf/primitive/SDFLine.java @@ -1,6 +1,6 @@ package ru.betterend.util.sdf.primitive; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; import ru.betterend.util.MHelper; public class SDFLine extends SDFPrimitive { @@ -11,19 +11,19 @@ public class SDFLine extends SDFPrimitive { private float x2; private float y2; private float z2; - + public SDFLine setRadius(float radius) { this.radius = radius; return this; } - + public SDFLine setStart(float x, float y, float z) { this.x1 = x; this.y1 = y; this.z1 = z; return this; } - + public SDFLine setEnd(float x, float y, float z) { this.x2 = x; this.y2 = y; @@ -43,7 +43,7 @@ public class SDFLine extends SDFPrimitive { float dpb = MHelper.dot(pax, pay, paz, bax, bay, baz); float dbb = MHelper.dot(bax, bay, baz, bax, bay, baz); - float h = MathHelper.clamp(dpb / dbb, 0F, 1F); + float h = Mth.clamp(dpb / dbb, 0F, 1F); return MHelper.length(pax - bax * h, pay - bay * h, paz - baz * h) - radius; } } diff --git a/src/main/java/ru/betterend/util/sdf/primitive/SDFPie.java b/src/main/java/ru/betterend/util/sdf/primitive/SDFPie.java index 4e728bb1..3fdb2dcf 100644 --- a/src/main/java/ru/betterend/util/sdf/primitive/SDFPie.java +++ b/src/main/java/ru/betterend/util/sdf/primitive/SDFPie.java @@ -1,31 +1,31 @@ package ru.betterend.util.sdf.primitive; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; import ru.betterend.util.MHelper; public class SDFPie extends SDFPrimitive { private float sin; private float cos; private float radius; - + public SDFPie setAngle(float angle) { this.sin = (float) Math.sin(angle); this.cos = (float) Math.cos(angle); return this; } - + public SDFPie setRadius(float radius) { this.radius = radius; return this; } - + @Override public float getDistance(float x, float y, float z) { float px = Math.abs(x); - float l = MHelper.length(px, y, z) - radius; - float m = MHelper.dot(px, z, sin, cos); - m = MathHelper.clamp(m, 0, radius); + float l = MHelper.length(px, y, z) - radius; + float m = MHelper.dot(px, z, sin, cos); + m = Mth.clamp(m, 0, radius); m = MHelper.length(px - sin * m, z - cos * m); - return MHelper.max(l, m * (float) Math.signum(cos * px - sin * z)); + return MHelper.max(l, m * (float) Math.signum(cos * px - sin * z)); } } diff --git a/src/main/java/ru/betterend/util/sdf/primitive/SDFPrimitive.java b/src/main/java/ru/betterend/util/sdf/primitive/SDFPrimitive.java index 5f8cf461..7ee719bf 100644 --- a/src/main/java/ru/betterend/util/sdf/primitive/SDFPrimitive.java +++ b/src/main/java/ru/betterend/util/sdf/primitive/SDFPrimitive.java @@ -2,38 +2,40 @@ package ru.betterend.util.sdf.primitive; import java.util.function.Function; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; import ru.betterend.util.sdf.SDF; public abstract class SDFPrimitive extends SDF { protected Function placerFunction; - + public SDFPrimitive setBlock(Function placerFunction) { this.placerFunction = placerFunction; return this; } - + public SDFPrimitive setBlock(BlockState state) { this.placerFunction = (pos) -> { return state; }; return this; } - + public SDFPrimitive setBlock(Block block) { this.placerFunction = (pos) -> { - return block.getDefaultState(); + return block.defaultBlockState(); }; return this; } - + public BlockState getBlockState(BlockPos pos) { return placerFunction.apply(pos); } - - /*public abstract CompoundTag toNBT(CompoundTag root) { - - }*/ + + /* + * public abstract CompoundTag toNBT(CompoundTag root) { + * + * } + */ } diff --git a/src/main/java/ru/betterend/world/biome/BiomeDefinition.java b/src/main/java/ru/betterend/world/biome/BiomeDefinition.java index 49475736..c3c96e88 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeDefinition.java +++ b/src/main/java/ru/betterend/world/biome/BiomeDefinition.java @@ -4,18 +4,18 @@ import java.util.List; import com.google.common.collect.Lists; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; import net.minecraft.client.sound.MusicType; -import net.minecraft.entity.EntityType; -import net.minecraft.particle.ParticleEffect; +import net.minecraft.world.entity.EntityType; +import net.minecraft.core.particles.ParticleOptions; import net.minecraft.sound.BiomeAdditionsSound; import net.minecraft.sound.BiomeMoodSound; import net.minecraft.sound.MusicSound; import net.minecraft.sound.SoundEvent; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.registry.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.core.Registry; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome.Category; import net.minecraft.world.biome.Biome.Precipitation; @@ -44,7 +44,7 @@ import ru.betterend.world.surface.SurfaceBuilders; public class BiomeDefinition { private static final int DEF_FOLIAGE = MHelper.color(197, 210, 112); - + private final List> structures = Lists.newArrayList(); private final List features = Lists.newArrayList(); private final List carvers = Lists.newArrayList(); @@ -65,62 +65,60 @@ public class BiomeDefinition { private float fogDensity = 1F; private float depth = 0.1F; - private final Identifier id; + private final ResourceLocation id; private float genChance = 1F; private boolean hasCaves = true; private boolean isCaveBiome = false; - + private ConfiguredSurfaceBuilder surface; public BiomeDefinition(String name) { this.id = BetterEnd.makeID(name); } - + public BiomeDefinition setCaveBiome() { isCaveBiome = true; return this; } - + public BiomeDefinition setSurface(Block block) { - setSurface(SurfaceBuilder.DEFAULT.withConfig(new TernarySurfaceConfig( - block.getDefaultState(), - Blocks.END_STONE.getDefaultState(), - Blocks.END_STONE.getDefaultState() - ))); + setSurface(SurfaceBuilder.DEFAULT.withConfig(new TernarySurfaceConfig(block.defaultBlockState(), + Blocks.END_STONE.defaultBlockState(), Blocks.END_STONE.defaultBlockState()))); return this; } - + public BiomeDefinition setSurface(Block block1, Block block2) { - setSurface(DoubleBlockSurfaceBuilder.register("be_" + id.getPath() + "_surface").setBlock1(block1).setBlock2(block2).configured()); + setSurface(DoubleBlockSurfaceBuilder.register("be_" + id.getPath() + "_surface").setBlock1(block1) + .setBlock2(block2).configured()); return this; } - + public BiomeDefinition setSurface(ConfiguredSurfaceBuilder builder) { this.surface = builder; return this; } - + public BiomeDefinition setSurface(SurfaceBuilder builder) { return setSurface(builder.withConfig(SurfaceBuilders.DEFAULT_END_CONFIG)); } - public BiomeDefinition setParticles(ParticleEffect particle, float probability) { + public BiomeDefinition setParticles(ParticleOptions particle, float probability) { this.particleConfig = new BiomeParticleConfig(particle, probability); return this; } - + public BiomeDefinition setGenChance(float genChance) { this.genChance = genChance; return this; } - + public BiomeDefinition setDepth(float depth) { this.depth = depth; return this; } public BiomeDefinition addMobSpawn(EntityType type, int weight, int minGroupSize, int maxGroupSize) { - Identifier eID = Registry.ENTITY_TYPE.getId(type); + ResourceLocation eID = Registry.ENTITY_TYPE.getId(type); if (eID != Registry.ENTITY_TYPE.getDefaultId()) { SpawnInfo info = new SpawnInfo(); info.type = type; @@ -131,7 +129,7 @@ public class BiomeDefinition { } return this; } - + public BiomeDefinition addMobSpawn(SpawnEntry entry) { spawns.add(entry); return this; @@ -141,12 +139,12 @@ public class BiomeDefinition { structures.add(feature); return this; } - + public BiomeDefinition addStructureFeature(EndStructureFeature feature) { structures.add(feature.getFeatureConfigured()); return this; } - + public BiomeDefinition addFeature(EndFeature feature) { FeatureInfo info = new FeatureInfo(); info.featureStep = feature.getFeatureStep(); @@ -162,11 +160,11 @@ public class BiomeDefinition { features.add(info); return this; } - + private int getColor(int r, int g, int b) { - r = MathHelper.clamp(r, 0, 255); - g = MathHelper.clamp(g, 0, 255); - b = MathHelper.clamp(b, 0, 255); + r = Mth.clamp(r, 0, 255); + g = Mth.clamp(g, 0, 255); + b = Mth.clamp(b, 0, 255); return MHelper.color(r, g, b); } @@ -189,21 +187,21 @@ public class BiomeDefinition { this.waterFogColor = getColor(r, g, b); return this; } - + public BiomeDefinition setWaterAndFogColor(int r, int g, int b) { return setWaterColor(r, g, b).setWaterFogColor(r, g, b); } - + public BiomeDefinition setFoliageColor(int r, int g, int b) { this.foliageColor = getColor(r, g, b); return this; } - + public BiomeDefinition setGrassColor(int r, int g, int b) { this.grassColor = getColor(r, g, b); return this; } - + public BiomeDefinition setPlantsColor(int r, int g, int b) { return this.setFoliageColor(r, g, b).setGrassColor(r, g, b); } @@ -227,7 +225,7 @@ public class BiomeDefinition { this.music = music; return this; } - + public BiomeDefinition setCaves(boolean hasCaves) { this.hasCaves = hasCaves; return this; @@ -239,9 +237,10 @@ public class BiomeDefinition { Builder effects = new Builder(); mobs.forEach((spawn) -> { - spawnSettings.spawn(spawn.type.getSpawnGroup(), new SpawnSettings.SpawnEntry(spawn.type, spawn.weight, spawn.minGroupSize, spawn.maxGroupSize)); + spawnSettings.spawn(spawn.type.getSpawnGroup(), + new SpawnSettings.SpawnEntry(spawn.type, spawn.weight, spawn.minGroupSize, spawn.maxGroupSize)); }); - + spawns.forEach((entry) -> { spawnSettings.spawn(entry.type.getSpawnGroup(), entry); }); @@ -252,24 +251,22 @@ public class BiomeDefinition { features.forEach((info) -> generationSettings.feature(info.featureStep, info.feature)); carvers.forEach((info) -> generationSettings.carver(info.carverStep, info.carver)); - effects.skyColor(0).waterColor(waterColor).waterFogColor(waterFogColor).fogColor(fogColor).foliageColor(foliageColor).grassColor(grassColor); - if (loop != null) effects.loopSound(loop); - if (mood != null) effects.moodSound(mood); - if (additions != null) effects.additionsSound(additions); - if (particleConfig != null) effects.particleConfig(particleConfig); + effects.skyColor(0).waterColor(waterColor).waterFogColor(waterFogColor).fogColor(fogColor) + .foliageColor(foliageColor).grassColor(grassColor); + if (loop != null) + effects.loopSound(loop); + if (mood != null) + effects.moodSound(mood); + if (additions != null) + effects.additionsSound(additions); + if (particleConfig != null) + effects.particleConfig(particleConfig); effects.music(music != null ? new MusicSound(music, 600, 2400, true) : MusicType.END); - return new Biome.Builder() - .precipitation(Precipitation.NONE) - .category(isCaveBiome ? Category.NONE : Category.THEEND) - .depth(depth) - .scale(0.2F) - .temperature(2.0F) - .downfall(0.0F) - .effects(effects.build()) - .spawnSettings(spawnSettings.build()) - .generationSettings(generationSettings.build()) - .build(); + return new Biome.Builder().precipitation(Precipitation.NONE) + .category(isCaveBiome ? Category.NONE : Category.THEEND).depth(depth).scale(0.2F).temperature(2.0F) + .downfall(0.0F).effects(effects.build()).spawnSettings(spawnSettings.build()) + .generationSettings(generationSettings.build()).build(); } private static final class SpawnInfo { @@ -283,16 +280,16 @@ public class BiomeDefinition { Feature featureStep; ConfiguredFeature feature; } - + private static final class CarverInfo { Carver carverStep; ConfiguredCarver carver; } - public Identifier getID() { + public ResourceLocation getID() { return id; } - + public float getFodDensity() { return fogDensity; } diff --git a/src/main/java/ru/betterend/world/biome/EndBiome.java b/src/main/java/ru/betterend/world/biome/EndBiome.java index 7b1a5f02..b01d89f0 100644 --- a/src/main/java/ru/betterend/world/biome/EndBiome.java +++ b/src/main/java/ru/betterend/world/biome/EndBiome.java @@ -8,8 +8,8 @@ import com.google.common.collect.Lists; import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Registry; import net.minecraft.world.biome.Biome; import ru.betterend.config.Configs; import ru.betterend.util.JsonFactory; @@ -23,7 +23,7 @@ public class EndBiome { protected List subbiomes = Lists.newArrayList(); protected final Biome biome; - protected final Identifier mcID; + protected final ResourceLocation mcID; protected EndBiome edge; protected int edgeSize; @@ -50,7 +50,7 @@ public class EndBiome { this.edgeSize = Configs.BIOME_CONFIG.getInt(mcID, "edge_size", 32); } - public EndBiome(Identifier id, Biome biome, float fogDensity, float genChance, boolean hasCaves) { + public EndBiome(ResourceLocation id, Biome biome, float fogDensity, float genChance, boolean hasCaves) { this.mcID = id; this.readStructureList(); this.biome = biome; @@ -82,7 +82,7 @@ public class EndBiome { biome.biomeParent = this; subbiomes.add(biome); } - + public boolean containsSubBiome(EndBiome biome) { return subbiomes.contains(biome); } @@ -130,14 +130,14 @@ public class EndBiome { return mcID.toString(); } - public Identifier getID() { + public ResourceLocation getID() { return mcID; } public float getFogDensity() { return fogDensity; } - + protected void readStructureList() { String ns = mcID.getNamespace(); String nm = mcID.getPath(); @@ -162,11 +162,11 @@ public class EndBiome { } } } - + public EndFeature getStructuresFeature() { return structuresFeature; } - + public Biome getActualBiome() { return this.actualBiome; } @@ -174,15 +174,15 @@ public class EndBiome { public float getGenChance() { return this.genChance; } - + public float getGenChanceImmutable() { return this.genChanceUnmutable; } - + public boolean hasCaves() { return hasCaves; } - + public void updateActualBiomes(Registry biomeRegistry) { subbiomes.forEach((sub) -> { if (sub != this) { @@ -194,7 +194,7 @@ public class EndBiome { } this.actualBiome = biomeRegistry.get(mcID); } - + @Override public boolean equals(Object obj) { if (obj == this) { @@ -203,7 +203,7 @@ public class EndBiome { EndBiome biome = (EndBiome) obj; return biome == null ? false : biome.mcID.equals(mcID); } - + @Override public int hashCode() { return mcID.hashCode(); diff --git a/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java b/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java index a9b42808..9e2424c9 100644 --- a/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java +++ b/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java @@ -1,6 +1,6 @@ package ru.betterend.world.biome.air; -import net.minecraft.entity.EntityType; +import net.minecraft.world.entity.EntityType; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndStructures; @@ -9,15 +9,9 @@ import ru.betterend.world.biome.EndBiome; public class BiomeIceStarfield extends EndBiome { public BiomeIceStarfield() { - super(new BiomeDefinition("ice_starfield") - .setFogColor(224, 245, 254) - .setFogDensity(2.2F) - .setFoliageColor(193, 244, 244) - .setGenChance(0.25F) - .setParticles(EndParticles.SNOWFLAKE, 0.002F) - .addStructureFeature(EndStructures.GIANT_ICE_STAR) - .addFeature(EndFeatures.ICE_STAR) - .addFeature(EndFeatures.ICE_STAR_SMALL) - .addMobSpawn(EntityType.ENDERMAN, 20, 1, 4)); + super(new BiomeDefinition("ice_starfield").setFogColor(224, 245, 254).setFogDensity(2.2F) + .setFoliageColor(193, 244, 244).setGenChance(0.25F).setParticles(EndParticles.SNOWFLAKE, 0.002F) + .addStructureFeature(EndStructures.GIANT_ICE_STAR).addFeature(EndFeatures.ICE_STAR) + .addFeature(EndFeatures.ICE_STAR_SMALL).addMobSpawn(EntityType.ENDERMAN, 20, 1, 4)); } } diff --git a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java index dd2cab46..dff525fe 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java @@ -2,9 +2,9 @@ package ru.betterend.world.biome.cave; import java.util.Random; -import net.minecraft.block.BlockState; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.util.collection.WeightedList; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.world.gen.feature.Feature; import ru.betterend.registry.EndBiomes; import ru.betterend.world.biome.BiomeDefinition; @@ -15,44 +15,42 @@ import ru.betterend.world.features.terrain.caves.CaveChunkPopulatorFeature; public class EndCaveBiome extends EndBiome { private WeightedList> floorFeatures = new WeightedList>(); private WeightedList> ceilFeatures = new WeightedList>(); - + public EndCaveBiome(BiomeDefinition definition) { super(makeDef(definition)); } - + private static BiomeDefinition makeDef(BiomeDefinition definition) { - EndFeature feature = EndFeature.makeChunkFeature( - definition.getID().getPath() + "_cave_populator", - new CaveChunkPopulatorFeature(() -> (EndCaveBiome) EndBiomes.getBiome(definition.getID())) - ); + EndFeature feature = EndFeature.makeChunkFeature(definition.getID().getPath() + "_cave_populator", + new CaveChunkPopulatorFeature(() -> (EndCaveBiome) EndBiomes.getBiome(definition.getID()))); definition.addFeature(feature).setCaveBiome(); return definition; } - + public void addFloorFeature(Feature feature, int weight) { floorFeatures.add(feature, weight); } - + public void addCeilFeature(Feature feature, int weight) { ceilFeatures.add(feature, weight); } - + public Feature getFloorFeature(Random random) { return floorFeatures.isEmpty() ? null : floorFeatures.pickRandom(random); } - + public Feature getCeilFeature(Random random) { return ceilFeatures.isEmpty() ? null : ceilFeatures.pickRandom(random); } - + public float getFloorDensity() { return 0; } - + public float getCeilDensity() { return 0; } - + public BlockState getCeil(BlockPos pos) { return null; } diff --git a/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java index 4271d50a..5e8ddcb4 100644 --- a/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java @@ -1,7 +1,7 @@ package ru.betterend.world.biome.cave; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.registry.EndBlocks; @@ -12,39 +12,34 @@ import ru.betterend.world.biome.BiomeDefinition; public class LushAuroraCaveBiome extends EndCaveBiome { public LushAuroraCaveBiome() { - super(new BiomeDefinition("lush_aurora_cave") - .setFogColor(150, 30, 68) - .setFogDensity(2.0F) - .setPlantsColor(108, 25, 46) - .setWaterAndFogColor(186, 77, 237) - .setMusic(EndSounds.MUSIC_FOREST) - .setParticles(EndParticles.GLOWING_SPHERE, 0.001F) - .setSurface(EndBlocks.CAVE_MOSS)); - + super(new BiomeDefinition("lush_aurora_cave").setFogColor(150, 30, 68).setFogDensity(2.0F) + .setPlantsColor(108, 25, 46).setWaterAndFogColor(186, 77, 237).setMusic(EndSounds.MUSIC_FOREST) + .setParticles(EndParticles.GLOWING_SPHERE, 0.001F).setSurface(EndBlocks.CAVE_MOSS)); + this.addFloorFeature(EndFeatures.BIG_AURORA_CRYSTAL, 1); this.addFloorFeature(EndFeatures.CAVE_BUSH, 5); this.addFloorFeature(EndFeatures.CAVE_GRASS, 40); this.addFloorFeature(EndFeatures.END_STONE_STALAGMITE_CAVEMOSS, 5); - + this.addCeilFeature(EndFeatures.CAVE_BUSH, 1); this.addCeilFeature(EndFeatures.CAVE_PUMPKIN, 1); this.addCeilFeature(EndFeatures.RUBINEA, 3); this.addCeilFeature(EndFeatures.MAGNULA, 1); this.addCeilFeature(EndFeatures.END_STONE_STALACTITE_CAVEMOSS, 10); } - + @Override public float getFloorDensity() { return 0.2F; } - + @Override public float getCeilDensity() { return 0.1F; } - + @Override public BlockState getCeil(BlockPos pos) { - return EndBlocks.CAVE_MOSS.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP); + return EndBlocks.CAVE_MOSS.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP); } } diff --git a/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java b/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java index 768ba362..086e1a03 100644 --- a/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java @@ -1,6 +1,6 @@ package ru.betterend.world.biome.land; -import net.minecraft.entity.EntityType; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; @@ -12,27 +12,15 @@ import ru.betterend.world.biome.EndBiome; public class AmberLandBiome extends EndBiome { public AmberLandBiome() { - super(new BiomeDefinition("amber_land") - .setFogColor(255, 184, 71) - .setFogDensity(2.0F) - .setPlantsColor(219, 115, 38) - .setWaterAndFogColor(145, 108, 72) - .setMusic(EndSounds.MUSIC_FOREST) - .setParticles(EndParticles.AMBER_SPHERE, 0.001F) - .setSurface(EndBlocks.AMBER_MOSS) - .addFeature(EndFeatures.AMBER_ORE) - .addFeature(EndFeatures.END_LAKE_RARE) - .addFeature(EndFeatures.HELIX_TREE) - .addFeature(EndFeatures.LANCELEAF) - .addFeature(EndFeatures.GLOW_PILLAR) - .addFeature(EndFeatures.AMBER_GRASS) - .addFeature(EndFeatures.AMBER_ROOT) - .addFeature(EndFeatures.BULB_MOSS) - .addFeature(EndFeatures.BULB_MOSS_WOOD) - .addFeature(EndFeatures.CHARNIA_ORANGE) - .addFeature(EndFeatures.CHARNIA_RED) - .addStructureFeature(ConfiguredStructureFeatures.END_CITY) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4) - .addMobSpawn(EndEntities.END_SLIME, 30, 1, 2)); + super(new BiomeDefinition("amber_land").setFogColor(255, 184, 71).setFogDensity(2.0F) + .setPlantsColor(219, 115, 38).setWaterAndFogColor(145, 108, 72).setMusic(EndSounds.MUSIC_FOREST) + .setParticles(EndParticles.AMBER_SPHERE, 0.001F).setSurface(EndBlocks.AMBER_MOSS) + .addFeature(EndFeatures.AMBER_ORE).addFeature(EndFeatures.END_LAKE_RARE) + .addFeature(EndFeatures.HELIX_TREE).addFeature(EndFeatures.LANCELEAF) + .addFeature(EndFeatures.GLOW_PILLAR).addFeature(EndFeatures.AMBER_GRASS) + .addFeature(EndFeatures.AMBER_ROOT).addFeature(EndFeatures.BULB_MOSS) + .addFeature(EndFeatures.BULB_MOSS_WOOD).addFeature(EndFeatures.CHARNIA_ORANGE) + .addFeature(EndFeatures.CHARNIA_RED).addStructureFeature(ConfiguredStructureFeatures.END_CITY) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4).addMobSpawn(EndEntities.END_SLIME, 30, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java b/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java index 92c95867..546443bb 100644 --- a/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java @@ -1,6 +1,6 @@ package ru.betterend.world.biome.land; -import net.minecraft.entity.EntityType; +import net.minecraft.world.entity.EntityType; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; @@ -10,26 +10,14 @@ import ru.betterend.world.biome.EndBiome; public class BlossomingSpiresBiome extends EndBiome { public BlossomingSpiresBiome() { - super(new BiomeDefinition("blossoming_spires") - .setFogColor(241, 146, 229) - .setFogDensity(1.7F) - .setPlantsColor(122, 45, 122) - .setCaves(false) - .setSurface(EndBlocks.PINK_MOSS) - .setMusic(EndSounds.MUSIC_FOREST) - .setLoop(EndSounds.AMBIENT_BLOSSOMING_SPIRES) - .addFeature(EndFeatures.SPIRE) - .addFeature(EndFeatures.FLOATING_SPIRE) - .addFeature(EndFeatures.TENANEA) - .addFeature(EndFeatures.TENANEA_BUSH) - .addFeature(EndFeatures.BULB_VINE) - .addFeature(EndFeatures.BUSHY_GRASS) - .addFeature(EndFeatures.BUSHY_GRASS_WG) - .addFeature(EndFeatures.BLOSSOM_BERRY) - .addFeature(EndFeatures.TWISTED_MOSS) - .addFeature(EndFeatures.TWISTED_MOSS_WOOD) - .addFeature(EndFeatures.SILK_MOTH_NEST) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4) - .addMobSpawn(EndEntities.SILK_MOTH, 5, 1, 2)); + super(new BiomeDefinition("blossoming_spires").setFogColor(241, 146, 229).setFogDensity(1.7F) + .setPlantsColor(122, 45, 122).setCaves(false).setSurface(EndBlocks.PINK_MOSS) + .setMusic(EndSounds.MUSIC_FOREST).setLoop(EndSounds.AMBIENT_BLOSSOMING_SPIRES) + .addFeature(EndFeatures.SPIRE).addFeature(EndFeatures.FLOATING_SPIRE).addFeature(EndFeatures.TENANEA) + .addFeature(EndFeatures.TENANEA_BUSH).addFeature(EndFeatures.BULB_VINE) + .addFeature(EndFeatures.BUSHY_GRASS).addFeature(EndFeatures.BUSHY_GRASS_WG) + .addFeature(EndFeatures.BLOSSOM_BERRY).addFeature(EndFeatures.TWISTED_MOSS) + .addFeature(EndFeatures.TWISTED_MOSS_WOOD).addFeature(EndFeatures.SILK_MOTH_NEST) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4).addMobSpawn(EndEntities.SILK_MOTH, 5, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java b/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java index fb55b03a..a63f1eba 100644 --- a/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java @@ -1,7 +1,7 @@ package ru.betterend.world.biome.land; -import net.minecraft.entity.EntityType; -import net.minecraft.particle.ParticleTypes; +import net.minecraft.world.entity.EntityType; +import net.minecraft.core.particles.ParticleTypes; import net.minecraft.world.gen.GenerationStep.Feature; import net.minecraft.world.gen.feature.ConfiguredFeatures; import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; @@ -14,30 +14,18 @@ import ru.betterend.world.biome.EndBiome; public class ChorusForestBiome extends EndBiome { public ChorusForestBiome() { - super(new BiomeDefinition("chorus_forest") - .setFogColor(87, 26, 87) - .setFogDensity(1.5F) - .setPlantsColor(122, 45, 122) - .setWaterAndFogColor(73, 30, 73) - .setSurface(EndBlocks.CHORUS_NYLIUM) - .setParticles(ParticleTypes.PORTAL, 0.01F) - .setLoop(EndSounds.AMBIENT_CHORUS_FOREST) - .setMusic(EndSounds.MUSIC_DARK) - .addFeature(EndFeatures.VIOLECITE_LAYER) - .addFeature(EndFeatures.END_LAKE_RARE) - .addFeature(EndFeatures.PYTHADENDRON_TREE) - .addFeature(EndFeatures.PYTHADENDRON_BUSH) - .addFeature(EndFeatures.PURPLE_POLYPORE) + super(new BiomeDefinition("chorus_forest").setFogColor(87, 26, 87).setFogDensity(1.5F) + .setPlantsColor(122, 45, 122).setWaterAndFogColor(73, 30, 73).setSurface(EndBlocks.CHORUS_NYLIUM) + .setParticles(ParticleTypes.PORTAL, 0.01F).setLoop(EndSounds.AMBIENT_CHORUS_FOREST) + .setMusic(EndSounds.MUSIC_DARK).addFeature(EndFeatures.VIOLECITE_LAYER) + .addFeature(EndFeatures.END_LAKE_RARE).addFeature(EndFeatures.PYTHADENDRON_TREE) + .addFeature(EndFeatures.PYTHADENDRON_BUSH).addFeature(EndFeatures.PURPLE_POLYPORE) .addFeature(Feature.VEGETAL_DECORATION, ConfiguredFeatures.CHORUS_PLANT) .addFeature(Feature.VEGETAL_DECORATION, ConfiguredFeatures.CHORUS_PLANT) - .addFeature(EndFeatures.CHORUS_GRASS) - .addFeature(EndFeatures.CHORUS_MUSHROOM) - .addFeature(EndFeatures.TAIL_MOSS) - .addFeature(EndFeatures.TAIL_MOSS_WOOD) - .addFeature(EndFeatures.CHARNIA_PURPLE) - .addFeature(EndFeatures.CHARNIA_RED_RARE) - .addStructureFeature(ConfiguredStructureFeatures.END_CITY) - .addMobSpawn(EndEntities.END_SLIME, 5, 1, 2) + .addFeature(EndFeatures.CHORUS_GRASS).addFeature(EndFeatures.CHORUS_MUSHROOM) + .addFeature(EndFeatures.TAIL_MOSS).addFeature(EndFeatures.TAIL_MOSS_WOOD) + .addFeature(EndFeatures.CHARNIA_PURPLE).addFeature(EndFeatures.CHARNIA_RED_RARE) + .addStructureFeature(ConfiguredStructureFeatures.END_CITY).addMobSpawn(EndEntities.END_SLIME, 5, 1, 2) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java b/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java index d5c1d1d6..06fcc42e 100644 --- a/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java @@ -1,6 +1,6 @@ package ru.betterend.world.biome.land; -import net.minecraft.entity.EntityType; +import net.minecraft.world.entity.EntityType; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; @@ -10,13 +10,9 @@ import ru.betterend.world.biome.EndBiome; public class CrystalMountainsBiome extends EndBiome { public CrystalMountainsBiome() { - super(new BiomeDefinition("crystal_mountains") - .setPlantsColor(255, 133, 211) - .setSurface(EndBlocks.CRYSTAL_MOSS) - .setMusic(EndSounds.MUSIC_OPENSPACE) - .addStructureFeature(EndStructures.MOUNTAIN) - .addFeature(EndFeatures.ROUND_CAVE) - .addFeature(EndFeatures.CRYSTAL_GRASS) + super(new BiomeDefinition("crystal_mountains").setPlantsColor(255, 133, 211).setSurface(EndBlocks.CRYSTAL_MOSS) + .setMusic(EndSounds.MUSIC_OPENSPACE).addStructureFeature(EndStructures.MOUNTAIN) + .addFeature(EndFeatures.ROUND_CAVE).addFeature(EndFeatures.CRYSTAL_GRASS) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java b/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java index a0f5f500..4ac95163 100644 --- a/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java @@ -1,6 +1,6 @@ package ru.betterend.world.biome.land; -import net.minecraft.entity.EntityType; +import net.minecraft.world.entity.EntityType; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; @@ -10,24 +10,14 @@ import ru.betterend.world.biome.EndBiome; public class DragonGraveyardsBiome extends EndBiome { public DragonGraveyardsBiome() { - super(new BiomeDefinition("dragon_graveyards") - .setGenChance(0.1F) - .setFogColor(244, 46, 79) - .setFogDensity(1.3F) - .setParticles(EndParticles.FIREFLY, 0.0007F) - .setMusic(EndSounds.MUSIC_OPENSPACE) - .setLoop(EndSounds.AMBIENT_GLOWING_GRASSLANDS) - .setSurface(EndBlocks.SANGNUM) - .setWaterAndFogColor(203, 59, 167) - .setPlantsColor(244, 46, 79) - .addFeature(EndFeatures.OBSIDIAN_PILLAR_BASEMENT) - .addFeature(EndFeatures.FALLEN_PILLAR) - .addFeature(EndFeatures.OBSIDIAN_BOULDER) - .addFeature(EndFeatures.GIGANTIC_AMARANITA) - .addFeature(EndFeatures.LARGE_AMARANITA) - .addFeature(EndFeatures.SMALL_AMARANITA) - .addFeature(EndFeatures.GLOBULAGUS) - .addFeature(EndFeatures.CLAWFERN) + super(new BiomeDefinition("dragon_graveyards").setGenChance(0.1F).setFogColor(244, 46, 79).setFogDensity(1.3F) + .setParticles(EndParticles.FIREFLY, 0.0007F).setMusic(EndSounds.MUSIC_OPENSPACE) + .setLoop(EndSounds.AMBIENT_GLOWING_GRASSLANDS).setSurface(EndBlocks.SANGNUM) + .setWaterAndFogColor(203, 59, 167).setPlantsColor(244, 46, 79) + .addFeature(EndFeatures.OBSIDIAN_PILLAR_BASEMENT).addFeature(EndFeatures.FALLEN_PILLAR) + .addFeature(EndFeatures.OBSIDIAN_BOULDER).addFeature(EndFeatures.GIGANTIC_AMARANITA) + .addFeature(EndFeatures.LARGE_AMARANITA).addFeature(EndFeatures.SMALL_AMARANITA) + .addFeature(EndFeatures.GLOBULAGUS).addFeature(EndFeatures.CLAWFERN) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java b/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java index 97715260..4e1b32c1 100644 --- a/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java @@ -1,6 +1,6 @@ package ru.betterend.world.biome.land; -import net.minecraft.entity.EntityType; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; @@ -10,18 +10,10 @@ import ru.betterend.world.biome.EndBiome; public class DryShrublandBiome extends EndBiome { public DryShrublandBiome() { - super(new BiomeDefinition("dry_shrubland") - .setFogColor(132, 35, 13) - .setFogDensity(1.2F) - .setWaterAndFogColor(113, 88, 53) - .setPlantsColor(237, 122, 66) - .setSurface(EndBlocks.RUTISCUS) - .setMusic(EndSounds.MUSIC_OPENSPACE) - .addFeature(EndFeatures.ORANGO) - .addFeature(EndFeatures.AERIDIUM) - .addFeature(EndFeatures.LUTEBUS) - .addFeature(EndFeatures.LAMELLARIUM) - .addStructureFeature(ConfiguredStructureFeatures.END_CITY) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + super(new BiomeDefinition("dry_shrubland").setFogColor(132, 35, 13).setFogDensity(1.2F) + .setWaterAndFogColor(113, 88, 53).setPlantsColor(237, 122, 66).setSurface(EndBlocks.RUTISCUS) + .setMusic(EndSounds.MUSIC_OPENSPACE).addFeature(EndFeatures.ORANGO).addFeature(EndFeatures.AERIDIUM) + .addFeature(EndFeatures.LUTEBUS).addFeature(EndFeatures.LAMELLARIUM) + .addStructureFeature(ConfiguredStructureFeatures.END_CITY).addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java b/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java index 8e26f57a..db5b761b 100644 --- a/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java @@ -1,7 +1,7 @@ package ru.betterend.world.biome.land; -import net.minecraft.entity.EntityType; -import net.minecraft.particle.ParticleTypes; +import net.minecraft.world.entity.EntityType; +import net.minecraft.core.particles.ParticleTypes; import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndSounds; @@ -10,15 +10,10 @@ import ru.betterend.world.biome.EndBiome; public class DustWastelandsBiome extends EndBiome { public DustWastelandsBiome() { - super(new BiomeDefinition("dust_wastelands") - .setFogColor(226, 239, 168) - .setFogDensity(2) - .setWaterAndFogColor(192, 180, 131) - .setSurface(EndBlocks.ENDSTONE_DUST) - .setParticles(ParticleTypes.WHITE_ASH, 0.01F) - .setLoop(EndSounds.AMBIENT_DUST_WASTELANDS) - .setMusic(EndSounds.MUSIC_OPENSPACE) - .addStructureFeature(ConfiguredStructureFeatures.END_CITY) + super(new BiomeDefinition("dust_wastelands").setFogColor(226, 239, 168).setFogDensity(2) + .setWaterAndFogColor(192, 180, 131).setSurface(EndBlocks.ENDSTONE_DUST) + .setParticles(ParticleTypes.WHITE_ASH, 0.01F).setLoop(EndSounds.AMBIENT_DUST_WASTELANDS) + .setMusic(EndSounds.MUSIC_OPENSPACE).addStructureFeature(ConfiguredStructureFeatures.END_CITY) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java b/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java index 76f2623c..d599bb94 100644 --- a/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java @@ -1,6 +1,6 @@ package ru.betterend.world.biome.land; -import net.minecraft.entity.EntityType; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; @@ -13,35 +13,20 @@ import ru.betterend.world.biome.EndBiome; public class FoggyMushroomlandBiome extends EndBiome { public FoggyMushroomlandBiome() { - super(new BiomeDefinition("foggy_mushroomland") - .setPlantsColor(73, 210, 209) - .setFogColor(41, 122, 173) - .setFogDensity(3) - .setWaterAndFogColor(119, 227, 250) + super(new BiomeDefinition("foggy_mushroomland").setPlantsColor(73, 210, 209).setFogColor(41, 122, 173) + .setFogDensity(3).setWaterAndFogColor(119, 227, 250) .setSurface(EndBlocks.END_MOSS, EndBlocks.END_MYCELIUM) - .setParticles(EndParticles.GLOWING_SPHERE, 0.001F) - .setLoop(EndSounds.AMBIENT_FOGGY_MUSHROOMLAND) - .setMusic(EndSounds.MUSIC_FOREST) - .addStructureFeature(EndStructures.GIANT_MOSSY_GLOWSHROOM) - .addFeature(EndFeatures.END_LAKE) - .addFeature(EndFeatures.MOSSY_GLOWSHROOM) - .addFeature(EndFeatures.BLUE_VINE) - .addFeature(EndFeatures.UMBRELLA_MOSS) - .addFeature(EndFeatures.CREEPING_MOSS) - .addFeature(EndFeatures.DENSE_VINE) - .addFeature(EndFeatures.PEARLBERRY) - .addFeature(EndFeatures.CYAN_MOSS) - .addFeature(EndFeatures.CYAN_MOSS_WOOD) - .addFeature(EndFeatures.END_LILY) - .addFeature(EndFeatures.BUBBLE_CORAL) - .addFeature(EndFeatures.CHARNIA_CYAN) - .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) - .addFeature(EndFeatures.CHARNIA_RED_RARE) - .addStructureFeature(ConfiguredStructureFeatures.END_CITY) - .addMobSpawn(EndEntities.DRAGONFLY, 80, 2, 5) - .addMobSpawn(EndEntities.END_FISH, 20, 2, 5) - .addMobSpawn(EndEntities.CUBOZOA, 10, 3, 8) - .addMobSpawn(EndEntities.END_SLIME, 10, 1, 2) - .addMobSpawn(EntityType.ENDERMAN, 10, 1, 2)); + .setParticles(EndParticles.GLOWING_SPHERE, 0.001F).setLoop(EndSounds.AMBIENT_FOGGY_MUSHROOMLAND) + .setMusic(EndSounds.MUSIC_FOREST).addStructureFeature(EndStructures.GIANT_MOSSY_GLOWSHROOM) + .addFeature(EndFeatures.END_LAKE).addFeature(EndFeatures.MOSSY_GLOWSHROOM) + .addFeature(EndFeatures.BLUE_VINE).addFeature(EndFeatures.UMBRELLA_MOSS) + .addFeature(EndFeatures.CREEPING_MOSS).addFeature(EndFeatures.DENSE_VINE) + .addFeature(EndFeatures.PEARLBERRY).addFeature(EndFeatures.CYAN_MOSS) + .addFeature(EndFeatures.CYAN_MOSS_WOOD).addFeature(EndFeatures.END_LILY) + .addFeature(EndFeatures.BUBBLE_CORAL).addFeature(EndFeatures.CHARNIA_CYAN) + .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE).addFeature(EndFeatures.CHARNIA_RED_RARE) + .addStructureFeature(ConfiguredStructureFeatures.END_CITY).addMobSpawn(EndEntities.DRAGONFLY, 80, 2, 5) + .addMobSpawn(EndEntities.END_FISH, 20, 2, 5).addMobSpawn(EndEntities.CUBOZOA, 10, 3, 8) + .addMobSpawn(EndEntities.END_SLIME, 10, 1, 2).addMobSpawn(EntityType.ENDERMAN, 10, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java b/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java index df39d84a..79f29743 100644 --- a/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java @@ -1,6 +1,6 @@ package ru.betterend.world.biome.land; -import net.minecraft.entity.EntityType; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; @@ -11,29 +11,16 @@ import ru.betterend.world.biome.EndBiome; public class GlowingGrasslandsBiome extends EndBiome { public GlowingGrasslandsBiome() { - super(new BiomeDefinition("glowing_grasslands") - .setFogColor(99, 228, 247) - .setFogDensity(1.3F) - .setParticles(EndParticles.FIREFLY, 0.001F) - .setMusic(EndSounds.MUSIC_OPENSPACE) - .setLoop(EndSounds.AMBIENT_GLOWING_GRASSLANDS) - .setSurface(EndBlocks.END_MOSS) - .setWaterAndFogColor(92, 250, 230) - .setPlantsColor(73, 210, 209) - .addFeature(EndFeatures.END_LAKE_RARE) - .addFeature(EndFeatures.LUMECORN) - .addFeature(EndFeatures.BLOOMING_COOKSONIA) - .addFeature(EndFeatures.SALTEAGO) - .addFeature(EndFeatures.VAIOLUSH_FERN) - .addFeature(EndFeatures.FRACTURN) - .addFeature(EndFeatures.UMBRELLA_MOSS_RARE) - .addFeature(EndFeatures.CREEPING_MOSS_RARE) - .addFeature(EndFeatures.TWISTED_UMBRELLA_MOSS_RARE) - .addFeature(EndFeatures.CHARNIA_CYAN) - .addFeature(EndFeatures.CHARNIA_GREEN) - .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) - .addFeature(EndFeatures.CHARNIA_RED_RARE) - .addStructureFeature(ConfiguredStructureFeatures.END_CITY) + super(new BiomeDefinition("glowing_grasslands").setFogColor(99, 228, 247).setFogDensity(1.3F) + .setParticles(EndParticles.FIREFLY, 0.001F).setMusic(EndSounds.MUSIC_OPENSPACE) + .setLoop(EndSounds.AMBIENT_GLOWING_GRASSLANDS).setSurface(EndBlocks.END_MOSS) + .setWaterAndFogColor(92, 250, 230).setPlantsColor(73, 210, 209).addFeature(EndFeatures.END_LAKE_RARE) + .addFeature(EndFeatures.LUMECORN).addFeature(EndFeatures.BLOOMING_COOKSONIA) + .addFeature(EndFeatures.SALTEAGO).addFeature(EndFeatures.VAIOLUSH_FERN).addFeature(EndFeatures.FRACTURN) + .addFeature(EndFeatures.UMBRELLA_MOSS_RARE).addFeature(EndFeatures.CREEPING_MOSS_RARE) + .addFeature(EndFeatures.TWISTED_UMBRELLA_MOSS_RARE).addFeature(EndFeatures.CHARNIA_CYAN) + .addFeature(EndFeatures.CHARNIA_GREEN).addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) + .addFeature(EndFeatures.CHARNIA_RED_RARE).addStructureFeature(ConfiguredStructureFeatures.END_CITY) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java index cad741a0..e888b454 100644 --- a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java @@ -1,6 +1,6 @@ package ru.betterend.world.biome.land; -import net.minecraft.entity.EntityType; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; @@ -11,29 +11,15 @@ import ru.betterend.world.biome.EndBiome; public class LanternWoodsBiome extends EndBiome { public LanternWoodsBiome() { - super(new BiomeDefinition("lantern_woods") - .setFogColor(189, 82, 70) - .setFogDensity(1.1F) - .setWaterAndFogColor(171, 234, 226) - .setPlantsColor(254, 85, 57) - .setSurface(EndBlocks.RUTISCUS) - .setMusic(EndSounds.MUSIC_FOREST) - .setParticles(EndParticles.GLOWING_SPHERE, 0.001F) - .addFeature(EndFeatures.END_LAKE_NORMAL) - .addFeature(EndFeatures.FLAMAEA) - .addFeature(EndFeatures.LUCERNIA) - .addFeature(EndFeatures.LUCERNIA_BUSH) - .addFeature(EndFeatures.FILALUX) - .addFeature(EndFeatures.AERIDIUM) - .addFeature(EndFeatures.LAMELLARIUM) - .addFeature(EndFeatures.BOLUX_MUSHROOM) - .addFeature(EndFeatures.AURANT_POLYPORE) - .addFeature(EndFeatures.POND_ANEMONE) - .addFeature(EndFeatures.CHARNIA_ORANGE) - .addFeature(EndFeatures.CHARNIA_RED) - .addFeature(EndFeatures.RUSCUS) - .addFeature(EndFeatures.RUSCUS_WOOD) - .addStructureFeature(ConfiguredStructureFeatures.END_CITY) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + super(new BiomeDefinition("lantern_woods").setFogColor(189, 82, 70).setFogDensity(1.1F) + .setWaterAndFogColor(171, 234, 226).setPlantsColor(254, 85, 57).setSurface(EndBlocks.RUTISCUS) + .setMusic(EndSounds.MUSIC_FOREST).setParticles(EndParticles.GLOWING_SPHERE, 0.001F) + .addFeature(EndFeatures.END_LAKE_NORMAL).addFeature(EndFeatures.FLAMAEA) + .addFeature(EndFeatures.LUCERNIA).addFeature(EndFeatures.LUCERNIA_BUSH).addFeature(EndFeatures.FILALUX) + .addFeature(EndFeatures.AERIDIUM).addFeature(EndFeatures.LAMELLARIUM) + .addFeature(EndFeatures.BOLUX_MUSHROOM).addFeature(EndFeatures.AURANT_POLYPORE) + .addFeature(EndFeatures.POND_ANEMONE).addFeature(EndFeatures.CHARNIA_ORANGE) + .addFeature(EndFeatures.CHARNIA_RED).addFeature(EndFeatures.RUSCUS).addFeature(EndFeatures.RUSCUS_WOOD) + .addStructureFeature(ConfiguredStructureFeatures.END_CITY).addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java b/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java index 4c275a1b..ad87875c 100644 --- a/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java @@ -1,6 +1,6 @@ package ru.betterend.world.biome.land; -import net.minecraft.entity.EntityType; +import net.minecraft.world.entity.EntityType; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; @@ -11,31 +11,17 @@ import ru.betterend.world.biome.EndBiome; public class MegalakeBiome extends EndBiome { public MegalakeBiome() { - super(new BiomeDefinition("megalake") - .setPlantsColor(73, 210, 209) - .setFogColor(178, 209, 248) - .setWaterAndFogColor(96, 163, 255) - .setFogDensity(1.75F) - .setMusic(EndSounds.MUSIC_WATER) - .setLoop(EndSounds.AMBIENT_MEGALAKE) - .setSurface(EndBlocks.END_MOSS, EndBlocks.ENDSTONE_DUST) - .setDepth(0F) - .addStructureFeature(EndStructures.MEGALAKE) - .addFeature(EndFeatures.END_LOTUS) - .addFeature(EndFeatures.END_LOTUS_LEAF) - .addFeature(EndFeatures.BUBBLE_CORAL_RARE) - .addFeature(EndFeatures.END_LILY_RARE) - .addFeature(EndFeatures.UMBRELLA_MOSS) - .addFeature(EndFeatures.CREEPING_MOSS) - .addFeature(EndFeatures.PEARLBERRY) - .addFeature(EndFeatures.CHARNIA_CYAN) - .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) - .addFeature(EndFeatures.CHARNIA_RED_RARE) - .addFeature(EndFeatures.MENGER_SPONGE) - .addMobSpawn(EndEntities.DRAGONFLY, 50, 1, 3) - .addMobSpawn(EndEntities.END_FISH, 50, 3, 8) - .addMobSpawn(EndEntities.CUBOZOA, 50, 3, 8) - .addMobSpawn(EndEntities.END_SLIME, 5, 1, 2) + super(new BiomeDefinition("megalake").setPlantsColor(73, 210, 209).setFogColor(178, 209, 248) + .setWaterAndFogColor(96, 163, 255).setFogDensity(1.75F).setMusic(EndSounds.MUSIC_WATER) + .setLoop(EndSounds.AMBIENT_MEGALAKE).setSurface(EndBlocks.END_MOSS, EndBlocks.ENDSTONE_DUST) + .setDepth(0F).addStructureFeature(EndStructures.MEGALAKE).addFeature(EndFeatures.END_LOTUS) + .addFeature(EndFeatures.END_LOTUS_LEAF).addFeature(EndFeatures.BUBBLE_CORAL_RARE) + .addFeature(EndFeatures.END_LILY_RARE).addFeature(EndFeatures.UMBRELLA_MOSS) + .addFeature(EndFeatures.CREEPING_MOSS).addFeature(EndFeatures.PEARLBERRY) + .addFeature(EndFeatures.CHARNIA_CYAN).addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) + .addFeature(EndFeatures.CHARNIA_RED_RARE).addFeature(EndFeatures.MENGER_SPONGE) + .addMobSpawn(EndEntities.DRAGONFLY, 50, 1, 3).addMobSpawn(EndEntities.END_FISH, 50, 3, 8) + .addMobSpawn(EndEntities.CUBOZOA, 50, 3, 8).addMobSpawn(EndEntities.END_SLIME, 5, 1, 2) .addMobSpawn(EntityType.ENDERMAN, 10, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java b/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java index 2ff13bbf..3380f1da 100644 --- a/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java @@ -1,6 +1,6 @@ package ru.betterend.world.biome.land; -import net.minecraft.entity.EntityType; +import net.minecraft.world.entity.EntityType; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; @@ -12,33 +12,18 @@ import ru.betterend.world.biome.EndBiome; public class MegalakeGroveBiome extends EndBiome { public MegalakeGroveBiome() { - super(new BiomeDefinition("megalake_grove") - .setPlantsColor(73, 210, 209) - .setFogColor(178, 209, 248) - .setWaterAndFogColor(96, 163, 255) - .setFogDensity(2.0F) - .setParticles(EndParticles.GLOWING_SPHERE, 0.001F) - .setMusic(EndSounds.MUSIC_WATER) - .setLoop(EndSounds.AMBIENT_MEGALAKE_GROVE) - .setSurface(EndBlocks.END_MOSS) - .setDepth(0F) - .addStructureFeature(EndStructures.MEGALAKE_SMALL) - .addFeature(EndFeatures.LACUGROVE) - .addFeature(EndFeatures.END_LOTUS) - .addFeature(EndFeatures.END_LOTUS_LEAF) - .addFeature(EndFeatures.BUBBLE_CORAL_RARE) - .addFeature(EndFeatures.END_LILY_RARE) - .addFeature(EndFeatures.UMBRELLA_MOSS) - .addFeature(EndFeatures.PEARLBERRY) - .addFeature(EndFeatures.CREEPING_MOSS) - .addFeature(EndFeatures.CHARNIA_CYAN) - .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) - .addFeature(EndFeatures.CHARNIA_RED_RARE) - .addFeature(EndFeatures.MENGER_SPONGE) - .addMobSpawn(EndEntities.DRAGONFLY, 20, 1, 3) - .addMobSpawn(EndEntities.END_FISH, 20, 3, 8) - .addMobSpawn(EndEntities.CUBOZOA, 50, 3, 8) - .addMobSpawn(EndEntities.END_SLIME, 5, 1, 2) + super(new BiomeDefinition("megalake_grove").setPlantsColor(73, 210, 209).setFogColor(178, 209, 248) + .setWaterAndFogColor(96, 163, 255).setFogDensity(2.0F).setParticles(EndParticles.GLOWING_SPHERE, 0.001F) + .setMusic(EndSounds.MUSIC_WATER).setLoop(EndSounds.AMBIENT_MEGALAKE_GROVE) + .setSurface(EndBlocks.END_MOSS).setDepth(0F).addStructureFeature(EndStructures.MEGALAKE_SMALL) + .addFeature(EndFeatures.LACUGROVE).addFeature(EndFeatures.END_LOTUS) + .addFeature(EndFeatures.END_LOTUS_LEAF).addFeature(EndFeatures.BUBBLE_CORAL_RARE) + .addFeature(EndFeatures.END_LILY_RARE).addFeature(EndFeatures.UMBRELLA_MOSS) + .addFeature(EndFeatures.PEARLBERRY).addFeature(EndFeatures.CREEPING_MOSS) + .addFeature(EndFeatures.CHARNIA_CYAN).addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) + .addFeature(EndFeatures.CHARNIA_RED_RARE).addFeature(EndFeatures.MENGER_SPONGE) + .addMobSpawn(EndEntities.DRAGONFLY, 20, 1, 3).addMobSpawn(EndEntities.END_FISH, 20, 3, 8) + .addMobSpawn(EndEntities.CUBOZOA, 50, 3, 8).addMobSpawn(EndEntities.END_SLIME, 5, 1, 2) .addMobSpawn(EntityType.ENDERMAN, 10, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java b/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java index bc49f6f8..705b18a2 100644 --- a/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java @@ -1,7 +1,7 @@ package ru.betterend.world.biome.land; -import net.minecraft.entity.EntityType; -import net.minecraft.particle.ParticleTypes; +import net.minecraft.world.entity.EntityType; +import net.minecraft.core.particles.ParticleTypes; import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; @@ -11,17 +11,10 @@ import ru.betterend.world.biome.EndBiome; public class NeonOasisBiome extends EndBiome { public NeonOasisBiome() { - super(new BiomeDefinition("neon_oasis") - .setGenChance(0.5F) - .setFogColor(226, 239, 168) - .setFogDensity(2) - .setWaterAndFogColor(192, 180, 131) - .setSurface(EndBlocks.ENDSTONE_DUST, EndBlocks.END_MOSS) - .setParticles(ParticleTypes.WHITE_ASH, 0.01F) - .setLoop(EndSounds.AMBIENT_DUST_WASTELANDS) - .setMusic(EndSounds.MUSIC_OPENSPACE) - .addFeature(EndFeatures.NEON_CACTUS) - .addStructureFeature(ConfiguredStructureFeatures.END_CITY) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + super(new BiomeDefinition("neon_oasis").setGenChance(0.5F).setFogColor(226, 239, 168).setFogDensity(2) + .setWaterAndFogColor(192, 180, 131).setSurface(EndBlocks.ENDSTONE_DUST, EndBlocks.END_MOSS) + .setParticles(ParticleTypes.WHITE_ASH, 0.01F).setLoop(EndSounds.AMBIENT_DUST_WASTELANDS) + .setMusic(EndSounds.MUSIC_OPENSPACE).addFeature(EndFeatures.NEON_CACTUS) + .addStructureFeature(ConfiguredStructureFeatures.END_CITY).addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java b/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java index a25f388e..b158608c 100644 --- a/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java @@ -1,7 +1,7 @@ package ru.betterend.world.biome.land; -import net.minecraft.entity.EntityType; -import net.minecraft.particle.ParticleTypes; +import net.minecraft.world.entity.EntityType; +import net.minecraft.core.particles.ParticleTypes; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; @@ -10,16 +10,10 @@ import ru.betterend.world.biome.EndBiome; public class PaintedMountainsBiome extends EndBiome { public PaintedMountainsBiome() { - super(new BiomeDefinition("painted_mountains") - .setFogColor(226, 239, 168) - .setFogDensity(2) - .setCaves(false) - .setWaterAndFogColor(192, 180, 131) - .setMusic(EndSounds.MUSIC_OPENSPACE) - .setLoop(EndSounds.AMBIENT_DUST_WASTELANDS) - .setSurface(EndBlocks.ENDSTONE_DUST) - .setParticles(ParticleTypes.WHITE_ASH, 0.01F) - .addStructureFeature(EndStructures.PAINTED_MOUNTAIN) + super(new BiomeDefinition("painted_mountains").setFogColor(226, 239, 168).setFogDensity(2).setCaves(false) + .setWaterAndFogColor(192, 180, 131).setMusic(EndSounds.MUSIC_OPENSPACE) + .setLoop(EndSounds.AMBIENT_DUST_WASTELANDS).setSurface(EndBlocks.ENDSTONE_DUST) + .setParticles(ParticleTypes.WHITE_ASH, 0.01F).addStructureFeature(EndStructures.PAINTED_MOUNTAIN) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java b/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java index ba4e7bed..59547453 100644 --- a/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java @@ -1,7 +1,7 @@ package ru.betterend.world.biome.land; -import net.minecraft.entity.EntityType; -import net.minecraft.particle.ParticleTypes; +import net.minecraft.world.entity.EntityType; +import net.minecraft.core.particles.ParticleTypes; import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; @@ -12,32 +12,18 @@ import ru.betterend.world.biome.EndBiome; public class ShadowForestBiome extends EndBiome { public ShadowForestBiome() { - super(new BiomeDefinition("shadow_forest") - .setFogColor(0, 0, 0) - .setFogDensity(2.5F) - .setPlantsColor(45, 45, 45) - .setWaterAndFogColor(42, 45, 80) - .setSurface(EndBlocks.SHADOW_GRASS) - .setParticles(ParticleTypes.MYCELIUM, 0.01F) - .setLoop(EndSounds.AMBIENT_CHORUS_FOREST) - .setMusic(EndSounds.MUSIC_DARK) - .addFeature(EndFeatures.VIOLECITE_LAYER) - .addFeature(EndFeatures.END_LAKE_RARE) - .addFeature(EndFeatures.DRAGON_TREE) - .addFeature(EndFeatures.DRAGON_TREE_BUSH) - .addFeature(EndFeatures.SHADOW_PLANT) - .addFeature(EndFeatures.MURKWEED) - .addFeature(EndFeatures.NEEDLEGRASS) - .addFeature(EndFeatures.SHADOW_BERRY) - .addFeature(EndFeatures.TWISTED_VINE) - .addFeature(EndFeatures.PURPLE_POLYPORE) - .addFeature(EndFeatures.TAIL_MOSS) - .addFeature(EndFeatures.TAIL_MOSS_WOOD) - .addFeature(EndFeatures.CHARNIA_PURPLE) - .addFeature(EndFeatures.CHARNIA_RED_RARE) - .addStructureFeature(ConfiguredStructureFeatures.END_CITY) - .addMobSpawn(EndEntities.SHADOW_WALKER, 80, 2, 4) - .addMobSpawn(EntityType.ENDERMAN, 40, 1, 4) + super(new BiomeDefinition("shadow_forest").setFogColor(0, 0, 0).setFogDensity(2.5F).setPlantsColor(45, 45, 45) + .setWaterAndFogColor(42, 45, 80).setSurface(EndBlocks.SHADOW_GRASS) + .setParticles(ParticleTypes.MYCELIUM, 0.01F).setLoop(EndSounds.AMBIENT_CHORUS_FOREST) + .setMusic(EndSounds.MUSIC_DARK).addFeature(EndFeatures.VIOLECITE_LAYER) + .addFeature(EndFeatures.END_LAKE_RARE).addFeature(EndFeatures.DRAGON_TREE) + .addFeature(EndFeatures.DRAGON_TREE_BUSH).addFeature(EndFeatures.SHADOW_PLANT) + .addFeature(EndFeatures.MURKWEED).addFeature(EndFeatures.NEEDLEGRASS) + .addFeature(EndFeatures.SHADOW_BERRY).addFeature(EndFeatures.TWISTED_VINE) + .addFeature(EndFeatures.PURPLE_POLYPORE).addFeature(EndFeatures.TAIL_MOSS) + .addFeature(EndFeatures.TAIL_MOSS_WOOD).addFeature(EndFeatures.CHARNIA_PURPLE) + .addFeature(EndFeatures.CHARNIA_RED_RARE).addStructureFeature(ConfiguredStructureFeatures.END_CITY) + .addMobSpawn(EndEntities.SHADOW_WALKER, 80, 2, 4).addMobSpawn(EntityType.ENDERMAN, 40, 1, 4) .addMobSpawn(EntityType.PHANTOM, 1, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java b/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java index 12888729..161efd76 100644 --- a/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java @@ -1,6 +1,6 @@ package ru.betterend.world.biome.land; -import net.minecraft.entity.EntityType; +import net.minecraft.world.entity.EntityType; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; @@ -11,27 +11,15 @@ import ru.betterend.world.surface.SurfaceBuilders; public class SulphurSpringsBiome extends EndBiome { public SulphurSpringsBiome() { - super(new BiomeDefinition("sulphur_springs") - .setSurface(SurfaceBuilders.SULPHURIC_SURFACE) - .setMusic(EndSounds.MUSIC_OPENSPACE) - .setLoop(EndSounds.AMBIENT_SULPHUR_SPRINGS) - .setWaterColor(25, 90, 157) - .setWaterFogColor(30, 65, 61) - .setFogColor(207, 194, 62) - .setFogDensity(1.5F) - .setCaves(false) - .setDepth(0F) - .setParticles(EndParticles.SULPHUR_PARTICLE, 0.001F) - .addFeature(EndFeatures.GEYSER) - .addFeature(EndFeatures.SURFACE_VENT) - .addFeature(EndFeatures.SULPHURIC_LAKE) - .addFeature(EndFeatures.SULPHURIC_CAVE) - .addFeature(EndFeatures.HYDRALUX) - .addFeature(EndFeatures.CHARNIA_GREEN) - .addFeature(EndFeatures.CHARNIA_ORANGE) - .addFeature(EndFeatures.CHARNIA_RED_RARE) - .addMobSpawn(EndEntities.END_FISH, 50, 3, 8) - .addMobSpawn(EndEntities.CUBOZOA, 50, 3, 8) + super(new BiomeDefinition("sulphur_springs").setSurface(SurfaceBuilders.SULPHURIC_SURFACE) + .setMusic(EndSounds.MUSIC_OPENSPACE).setLoop(EndSounds.AMBIENT_SULPHUR_SPRINGS) + .setWaterColor(25, 90, 157).setWaterFogColor(30, 65, 61).setFogColor(207, 194, 62).setFogDensity(1.5F) + .setCaves(false).setDepth(0F).setParticles(EndParticles.SULPHUR_PARTICLE, 0.001F) + .addFeature(EndFeatures.GEYSER).addFeature(EndFeatures.SURFACE_VENT) + .addFeature(EndFeatures.SULPHURIC_LAKE).addFeature(EndFeatures.SULPHURIC_CAVE) + .addFeature(EndFeatures.HYDRALUX).addFeature(EndFeatures.CHARNIA_GREEN) + .addFeature(EndFeatures.CHARNIA_ORANGE).addFeature(EndFeatures.CHARNIA_RED_RARE) + .addMobSpawn(EndEntities.END_FISH, 50, 3, 8).addMobSpawn(EndEntities.CUBOZOA, 50, 3, 8) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java b/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java index e14e62cd..2ded7681 100644 --- a/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java @@ -1,6 +1,6 @@ package ru.betterend.world.biome.land; -import net.minecraft.entity.EntityType; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; @@ -11,33 +11,18 @@ import ru.betterend.world.biome.EndBiome; public class UmbrellaJungleBiome extends EndBiome { public UmbrellaJungleBiome() { - super(new BiomeDefinition("umbrella_jungle") - .setFogColor(87, 223, 221) - .setWaterAndFogColor(119, 198, 253) - .setFoliageColor(27, 183, 194) - .setFogDensity(2.3F) - .setParticles(EndParticles.JUNGLE_SPORE, 0.001F) - .setMusic(EndSounds.MUSIC_FOREST) - .setLoop(EndSounds.AMBIENT_UMBRELLA_JUNGLE) - .setSurface(EndBlocks.JUNGLE_MOSS) - .addFeature(EndFeatures.END_LAKE) - .addFeature(EndFeatures.UMBRELLA_TREE) - .addFeature(EndFeatures.JELLYSHROOM) - .addFeature(EndFeatures.TWISTED_UMBRELLA_MOSS) - .addFeature(EndFeatures.SMALL_JELLYSHROOM_FLOOR) - .addFeature(EndFeatures.JUNGLE_GRASS) - .addFeature(EndFeatures.CYAN_MOSS) - .addFeature(EndFeatures.CYAN_MOSS_WOOD) - .addFeature(EndFeatures.JUNGLE_FERN_WOOD) - .addFeature(EndFeatures.SMALL_JELLYSHROOM_WALL) - .addFeature(EndFeatures.SMALL_JELLYSHROOM_WOOD) - .addFeature(EndFeatures.SMALL_JELLYSHROOM_CEIL) - .addFeature(EndFeatures.JUNGLE_VINE) - .addFeature(EndFeatures.CHARNIA_CYAN) - .addFeature(EndFeatures.CHARNIA_GREEN) - .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) - .addFeature(EndFeatures.CHARNIA_RED_RARE) - .addStructureFeature(ConfiguredStructureFeatures.END_CITY) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + super(new BiomeDefinition("umbrella_jungle").setFogColor(87, 223, 221).setWaterAndFogColor(119, 198, 253) + .setFoliageColor(27, 183, 194).setFogDensity(2.3F).setParticles(EndParticles.JUNGLE_SPORE, 0.001F) + .setMusic(EndSounds.MUSIC_FOREST).setLoop(EndSounds.AMBIENT_UMBRELLA_JUNGLE) + .setSurface(EndBlocks.JUNGLE_MOSS).addFeature(EndFeatures.END_LAKE) + .addFeature(EndFeatures.UMBRELLA_TREE).addFeature(EndFeatures.JELLYSHROOM) + .addFeature(EndFeatures.TWISTED_UMBRELLA_MOSS).addFeature(EndFeatures.SMALL_JELLYSHROOM_FLOOR) + .addFeature(EndFeatures.JUNGLE_GRASS).addFeature(EndFeatures.CYAN_MOSS) + .addFeature(EndFeatures.CYAN_MOSS_WOOD).addFeature(EndFeatures.JUNGLE_FERN_WOOD) + .addFeature(EndFeatures.SMALL_JELLYSHROOM_WALL).addFeature(EndFeatures.SMALL_JELLYSHROOM_WOOD) + .addFeature(EndFeatures.SMALL_JELLYSHROOM_CEIL).addFeature(EndFeatures.JUNGLE_VINE) + .addFeature(EndFeatures.CHARNIA_CYAN).addFeature(EndFeatures.CHARNIA_GREEN) + .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE).addFeature(EndFeatures.CHARNIA_RED_RARE) + .addStructureFeature(ConfiguredStructureFeatures.END_CITY).addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java b/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java index e203909d..ad97e5c2 100644 --- a/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java +++ b/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java @@ -2,10 +2,10 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.chunk.ChunkGenerator; @@ -20,15 +20,16 @@ import ru.betterend.util.sdf.operator.SDFTranslate; import ru.betterend.util.sdf.primitive.SDFCappedCone; public class BiomeIslandFeature extends DefaultFeature { - private static final Mutable CENTER = new Mutable(); + private static final MutableBlockPos CENTER = new MutableBlockPos(); private static final SDF ISLAND; private static OpenSimplexNoise simplexNoise = new OpenSimplexNoise(412L); - private static BlockState topBlock = Blocks.GRASS_BLOCK.getDefaultState(); - private static BlockState underBlock = Blocks.DIRT.getDefaultState(); + private static BlockState topBlock = Blocks.GRASS_BLOCK.defaultBlockState(); + private static BlockState underBlock = Blocks.DIRT.defaultBlockState(); @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { Biome biome = world.getBiome(pos); SurfaceConfig surfaceConfig = biome.getGenerationSettings().getSurfaceConfig(); BlockState topMaterial = surfaceConfig.getTopMaterial(); @@ -40,14 +41,16 @@ public class BiomeIslandFeature extends DefaultFeature { underBlock = surfaceConfig.getUnderMaterial(); simplexNoise = new OpenSimplexNoise(world.getSeed()); CENTER.set(pos); - ISLAND.fillRecursive(world, pos.down()); + ISLAND.fillRecursive(world, pos.below()); return true; } private static SDF createSDFIsland() { SDF sdfCone = new SDFCappedCone().setRadius1(0).setRadius2(6).setHeight(4).setBlock(pos -> { - if (pos.getY() > CENTER.getY()) return AIR; - if (pos.getY() == CENTER.getY()) return topBlock; + if (pos.getY() > CENTER.getY()) + return AIR; + if (pos.getY() == CENTER.getY()) + return topBlock; return underBlock; }); sdfCone = new SDFTranslate().setTranslate(0, -2, 0).setSource(sdfCone); @@ -55,11 +58,12 @@ public class BiomeIslandFeature extends DefaultFeature { float deltaX = Math.abs(pos.getX()); float deltaY = Math.abs(pos.getY()); float deltaZ = Math.abs(pos.getZ()); - if (deltaY < 2.0f && (deltaX < 3.0f || deltaZ < 3.0F)) return 0.0f; - return (float) simplexNoise.eval(CENTER.getX() + pos.getX(), - CENTER.getY() + pos.getY(), CENTER.getZ() + pos.getZ()); - }).setSource(sdfCone).setReplaceFunction(state -> BlocksHelper.isFluid(state) || - state.getMaterial().isReplaceable()); + if (deltaY < 2.0f && (deltaX < 3.0f || deltaZ < 3.0F)) + return 0.0f; + return (float) simplexNoise.eval(CENTER.getX() + pos.getX(), CENTER.getY() + pos.getY(), + CENTER.getZ() + pos.getZ()); + }).setSource(sdfCone) + .setReplaceFunction(state -> BlocksHelper.isFluid(state) || state.getMaterial().isReplaceable()); return sdfCone; } diff --git a/src/main/java/ru/betterend/world/features/BlueVineFeature.java b/src/main/java/ru/betterend/world/features/BlueVineFeature.java index 06883bf3..861cc1e2 100644 --- a/src/main/java/ru/betterend/world/features/BlueVineFeature.java +++ b/src/main/java/ru/betterend/world/features/BlueVineFeature.java @@ -2,7 +2,7 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; @@ -11,14 +11,16 @@ import ru.betterend.util.MHelper; public class BlueVineFeature extends ScatterFeature { private boolean small; - + public BlueVineFeature() { super(5); } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { - float d = MHelper.length(center.getX() - blockPos.getX(), center.getZ() - blockPos.getZ()) / radius * 0.6F + random.nextFloat() * 0.4F; + public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, + float radius) { + float d = MHelper.length(center.getX() - blockPos.getX(), center.getZ() - blockPos.getZ()) / radius * 0.6F + + random.nextFloat() * 0.4F; small = d > 0.5F; return EndBlocks.BLUE_VINE_SEED.canPlaceAt(AIR, world, blockPos); } @@ -26,9 +28,9 @@ public class BlueVineFeature extends ScatterFeature { @Override public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { if (small) { - BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.BLUE_VINE_SEED.getDefaultState().with(EndPlantWithAgeBlock.AGE, random.nextInt(4))); - } - else { + BlocksHelper.setWithoutUpdate(world, blockPos, + EndBlocks.BLUE_VINE_SEED.defaultBlockState().with(EndPlantWithAgeBlock.AGE, random.nextInt(4))); + } else { EndPlantWithAgeBlock seed = ((EndPlantWithAgeBlock) EndBlocks.BLUE_VINE_SEED); seed.growAdult(world, random, blockPos); } diff --git a/src/main/java/ru/betterend/world/features/CavePlantFeature.java b/src/main/java/ru/betterend/world/features/CavePlantFeature.java index 59c8a8a7..e3e21ded 100644 --- a/src/main/java/ru/betterend/world/features/CavePlantFeature.java +++ b/src/main/java/ru/betterend/world/features/CavePlantFeature.java @@ -2,21 +2,22 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.block.Block; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.Block; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; import ru.betterend.util.BlocksHelper; public class CavePlantFeature extends FullHeightScatterFeature { private final Block plant; - + public CavePlantFeature(Block plant, int radius) { super(radius); this.plant = plant; } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { + public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, + float radius) { return plant.canPlaceAt(world.getBlockState(blockPos), world, blockPos); } diff --git a/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java b/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java index de23780c..65c5aef3 100644 --- a/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java +++ b/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java @@ -2,7 +2,7 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -13,17 +13,21 @@ import ru.betterend.util.BlocksHelper; public class CavePumpkinFeature extends DefaultFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.up()).isIn(EndTags.GEN_TERRAIN) || !world.isAir(pos) || !world.isAir(pos.down())) { + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + if (!world.getBlockState(pos.up()).isIn(EndTags.GEN_TERRAIN) || !world.isAir(pos) + || !world.isAir(pos.below())) { return false; } - + int age = random.nextInt(4); - BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.CAVE_PUMPKIN_SEED.getDefaultState().with(BlockProperties.AGE, age)); + BlocksHelper.setWithoutUpdate(world, pos, + EndBlocks.CAVE_PUMPKIN_SEED.defaultBlockState().with(BlockProperties.AGE, age)); if (age > 1) { - BlocksHelper.setWithoutUpdate(world, pos.down(), EndBlocks.CAVE_PUMPKIN.getDefaultState().with(BlockProperties.SMALL, age < 3)); + BlocksHelper.setWithoutUpdate(world, pos.below(), + EndBlocks.CAVE_PUMPKIN.defaultBlockState().with(BlockProperties.SMALL, age < 3)); } - + return true; } } diff --git a/src/main/java/ru/betterend/world/features/CharniaFeature.java b/src/main/java/ru/betterend/world/features/CharniaFeature.java index 14102c4f..57636909 100644 --- a/src/main/java/ru/betterend/world/features/CharniaFeature.java +++ b/src/main/java/ru/betterend/world/features/CharniaFeature.java @@ -1,12 +1,12 @@ package ru.betterend.world.features; -import net.minecraft.block.Block; +import net.minecraft.world.level.block.Block; public class CharniaFeature extends UnderwaterPlantFeature { public CharniaFeature(Block plant) { super(plant, 6); } - + @Override protected int getChance() { return 3; diff --git a/src/main/java/ru/betterend/world/features/CrashedShipFeature.java b/src/main/java/ru/betterend/world/features/CrashedShipFeature.java index 12f17db3..0b474328 100644 --- a/src/main/java/ru/betterend/world/features/CrashedShipFeature.java +++ b/src/main/java/ru/betterend/world/features/CrashedShipFeature.java @@ -2,9 +2,9 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.Material; import net.minecraft.structure.Structure; import net.minecraft.structure.Structure.StructureBlockInfo; import net.minecraft.structure.StructurePlacementData; @@ -12,10 +12,10 @@ import net.minecraft.structure.processor.BlockIgnoreStructureProcessor; import net.minecraft.structure.processor.StructureProcessor; import net.minecraft.structure.processor.StructureProcessorType; import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.Identifier; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.WorldView; import net.minecraft.world.gen.chunk.ChunkGenerator; @@ -33,7 +33,8 @@ public class CrashedShipFeature extends NBTStructureFeature { @Override protected Structure getStructure(StructureWorldAccess world, BlockPos pos, Random random) { if (structure == null) { - structure = world.toServerWorld().getStructureManager().getStructureOrBlank(new Identifier("end_city/ship")); + structure = world.toServerWorld().getStructureManager() + .getStructureOrBlank(new ResourceLocation("end_city/ship")); if (structure == null) { structure = StructureHelper.readStructure(STRUCTURE_PATH); } @@ -48,12 +49,12 @@ public class CrashedShipFeature extends NBTStructureFeature { if (x * x + z * z < 3600) { return false; } - return pos.getY() > 5 && world.getBlockState(pos.down()).isIn(EndTags.GEN_TERRAIN); + return pos.getY() > 5 && world.getBlockState(pos.below()).isIn(EndTags.GEN_TERRAIN); } @Override - protected BlockRotation getRotation(StructureWorldAccess world, BlockPos pos, Random random) { - return BlockRotation.random(random); + protected Rotation getRotation(StructureWorldAccess world, BlockPos pos, Random random) { + return Rotation.random(random); } @Override @@ -72,48 +73,53 @@ public class CrashedShipFeature extends NBTStructureFeature { protected TerrainMerge getTerrainMerge(StructureWorldAccess world, BlockPos pos, Random random) { return TerrainMerge.NONE; } - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, DefaultFeatureConfig featureConfig) { + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, + DefaultFeatureConfig featureConfig) { center = new BlockPos(((center.getX() >> 4) << 4) | 8, 128, ((center.getZ() >> 4) << 4) | 8); center = getGround(world, center); BlockBox bounds = makeBox(center); - + if (!canSpawn(world, center, random)) { return false; } - + Structure structure = getStructure(world, center, random); - BlockRotation rotation = getRotation(world, center, random); + Rotation rotation = getRotation(world, center, random); BlockMirror mirror = getMirror(world, center, random); BlockPos offset = Structure.transformAround(structure.getSize(), mirror, rotation, BlockPos.ORIGIN); center = center.add(0, getYOffset(structure, world, center, random) + 0.5, 0); StructurePlacementData placementData = new StructurePlacementData().setRotation(rotation).setMirror(mirror); center = center.add(-offset.getX() * 0.5, 0, -offset.getZ() * 0.5); - + BlockBox structB = structure.calculateBoundingBox(placementData, center); bounds = StructureHelper.intersectBoxes(bounds, structB); - + addStructureData(placementData); structure.place(world, center, placementData.setBoundingBox(bounds), random); - + StructureHelper.erodeIntense(world, bounds, random); - BlocksHelper.fixBlocks(world, new BlockPos(bounds.minX, bounds.minY, bounds.minZ), new BlockPos(bounds.maxX, bounds.maxY, bounds.maxZ)); - + BlocksHelper.fixBlocks(world, new BlockPos(bounds.minX, bounds.minY, bounds.minZ), + new BlockPos(bounds.maxX, bounds.maxY, bounds.maxZ)); + return true; } @Override protected void addStructureData(StructurePlacementData data) { - data.addProcessor(BlockIgnoreStructureProcessor.IGNORE_AIR_AND_STRUCTURE_BLOCKS).addProcessor(REPLACER).setIgnoreEntities(true); + data.addProcessor(BlockIgnoreStructureProcessor.IGNORE_AIR_AND_STRUCTURE_BLOCKS).addProcessor(REPLACER) + .setIgnoreEntities(true); } - + static { REPLACER = new StructureProcessor() { @Override - public StructureBlockInfo process(WorldView worldView, BlockPos pos, BlockPos blockPos, StructureBlockInfo structureBlockInfo, StructureBlockInfo structureBlockInfo2, StructurePlacementData structurePlacementData) { + public StructureBlockInfo process(WorldView worldView, BlockPos pos, BlockPos blockPos, + StructureBlockInfo structureBlockInfo, StructureBlockInfo structureBlockInfo2, + StructurePlacementData structurePlacementData) { BlockState state = structureBlockInfo2.state; - if (state.isOf(Blocks.SPAWNER) || state.getMaterial().equals(Material.WOOL)) { + if (state.is(Blocks.SPAWNER) || state.getMaterial().equals(Material.WOOL)) { return new StructureBlockInfo(structureBlockInfo2.pos, AIR, null); } return structureBlockInfo2; diff --git a/src/main/java/ru/betterend/world/features/DefaultFeature.java b/src/main/java/ru/betterend/world/features/DefaultFeature.java index adf0ff64..1c9dd59e 100644 --- a/src/main/java/ru/betterend/world/features/DefaultFeature.java +++ b/src/main/java/ru/betterend/world/features/DefaultFeature.java @@ -1,8 +1,8 @@ package ru.betterend.world.features; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.core.BlockPos; import net.minecraft.world.Heightmap.Type; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -10,33 +10,33 @@ import net.minecraft.world.gen.feature.Feature; import ru.betterend.util.BlocksHelper; public abstract class DefaultFeature extends Feature { - protected static final BlockState AIR = Blocks.AIR.getDefaultState(); - protected static final BlockState WATER = Blocks.WATER.getDefaultState(); - + protected static final BlockState AIR = Blocks.AIR.defaultBlockState(); + protected static final BlockState WATER = Blocks.WATER.defaultBlockState(); + public DefaultFeature() { super(DefaultFeatureConfig.CODEC); } - + public static int getYOnSurface(StructureWorldAccess world, int x, int z) { return world.getTopY(Type.WORLD_SURFACE, x, z); } - + public static int getYOnSurfaceWG(StructureWorldAccess world, int x, int z) { return world.getTopY(Type.WORLD_SURFACE_WG, x, z); } - + public static BlockPos getPosOnSurface(StructureWorldAccess world, BlockPos pos) { return world.getTopPosition(Type.WORLD_SURFACE, pos); } - + public static BlockPos getPosOnSurfaceWG(StructureWorldAccess world, BlockPos pos) { return world.getTopPosition(Type.WORLD_SURFACE_WG, pos); } - + public static BlockPos getPosOnSurfaceRaycast(StructureWorldAccess world, BlockPos pos) { return getPosOnSurfaceRaycast(world, pos, 256); } - + public static BlockPos getPosOnSurfaceRaycast(StructureWorldAccess world, BlockPos pos, int dist) { int h = BlocksHelper.downRay(world, pos, dist); return pos.down(h); diff --git a/src/main/java/ru/betterend/world/features/DoublePlantFeature.java b/src/main/java/ru/betterend/world/features/DoublePlantFeature.java index 310ecf4b..7dcaba6c 100644 --- a/src/main/java/ru/betterend/world/features/DoublePlantFeature.java +++ b/src/main/java/ru/betterend/world/features/DoublePlantFeature.java @@ -2,9 +2,9 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.basis.DoublePlantBlock; import ru.betterend.util.BlocksHelper; @@ -14,29 +14,30 @@ public class DoublePlantFeature extends ScatterFeature { private final Block smallPlant; private final Block largePlant; private Block plant; - + public DoublePlantFeature(Block smallPlant, Block largePlant, int radius) { super(radius); this.smallPlant = smallPlant; this.largePlant = largePlant; } - + @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { - float d = MHelper.length(center.getX() - blockPos.getX(), center.getZ() - blockPos.getZ()) / radius * 0.6F + random.nextFloat() * 0.4F; + public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, + float radius) { + float d = MHelper.length(center.getX() - blockPos.getX(), center.getZ() - blockPos.getZ()) / radius * 0.6F + + random.nextFloat() * 0.4F; plant = d < 0.5F ? largePlant : smallPlant; - return plant.canPlaceAt(plant.getDefaultState(), world, blockPos); + return plant.canPlaceAt(plant.defaultBlockState(), world, blockPos); } @Override public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { if (plant instanceof DoublePlantBlock) { int rot = random.nextInt(4); - BlockState state = plant.getDefaultState().with(DoublePlantBlock.ROTATION, rot); + BlockState state = plant.defaultBlockState().with(DoublePlantBlock.ROTATION, rot); BlocksHelper.setWithoutUpdate(world, blockPos, state); BlocksHelper.setWithoutUpdate(world, blockPos.up(), state.with(DoublePlantBlock.TOP, true)); - } - else { + } else { BlocksHelper.setWithoutUpdate(world, blockPos, plant); } } diff --git a/src/main/java/ru/betterend/world/features/EndFeature.java b/src/main/java/ru/betterend/world/features/EndFeature.java index b1891370..49a5755c 100644 --- a/src/main/java/ru/betterend/world/features/EndFeature.java +++ b/src/main/java/ru/betterend/world/features/EndFeature.java @@ -1,12 +1,12 @@ package ru.betterend.world.features; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; import net.minecraft.structure.rule.BlockMatchRuleTest; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.registry.BuiltinRegistries; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; import net.minecraft.world.gen.CountConfig; import net.minecraft.world.gen.GenerationStep; import net.minecraft.world.gen.decorator.ChanceDecoratorConfig; @@ -26,99 +26,116 @@ public class EndFeature { private Feature feature; private ConfiguredFeature featureConfigured; private GenerationStep.Feature featureStep; - - protected EndFeature() {} - - public EndFeature(Feature feature, ConfiguredFeature configuredFeature, GenerationStep.Feature featureStep) { + + protected EndFeature() { + } + + public EndFeature(Feature feature, ConfiguredFeature configuredFeature, + GenerationStep.Feature featureStep) { this.featureStep = featureStep; this.feature = feature; this.featureConfigured = configuredFeature; } - - public EndFeature(String name, Feature feature, GenerationStep.Feature featureStep, ConfiguredFeature configuredFeature) { - Identifier id = BetterEnd.makeID(name); + + public EndFeature(String name, Feature feature, GenerationStep.Feature featureStep, + ConfiguredFeature configuredFeature) { + ResourceLocation id = BetterEnd.makeID(name); this.featureStep = featureStep; this.feature = Registry.register(Registry.FEATURE, id, feature); this.featureConfigured = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, configuredFeature); } - + public EndFeature(String name, Feature feature) { - Identifier id = BetterEnd.makeID(name); + ResourceLocation id = BetterEnd.makeID(name); this.featureStep = GenerationStep.Feature.VEGETAL_DECORATION; this.feature = Registry.register(Registry.FEATURE, id, feature); - this.featureConfigured = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, feature.configure(FeatureConfig.DEFAULT).decorate(Decorator.CHANCE.configure(new ChanceDecoratorConfig(100)))); + this.featureConfigured = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, feature + .configure(FeatureConfig.DEFAULT).decorate(Decorator.CHANCE.configure(new ChanceDecoratorConfig(100)))); } - + public EndFeature(String name, Feature feature, int density) { - Identifier id = BetterEnd.makeID(name); + ResourceLocation id = BetterEnd.makeID(name); this.featureStep = GenerationStep.Feature.VEGETAL_DECORATION; this.feature = Registry.register(Registry.FEATURE, id, feature); - this.featureConfigured = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, feature.configure(FeatureConfig.DEFAULT).decorate(ConfiguredFeatures.Decorators.SQUARE_HEIGHTMAP).repeatRandomly(density)); + this.featureConfigured = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, + feature.configure(FeatureConfig.DEFAULT).decorate(ConfiguredFeatures.Decorators.SQUARE_HEIGHTMAP) + .repeatRandomly(density)); } - + public static EndFeature makeRawGenFeature(String name, Feature feature, int chance) { - ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT).decorate(Decorator.CHANCE.configure(new ChanceDecoratorConfig(chance))); + ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT) + .decorate(Decorator.CHANCE.configure(new ChanceDecoratorConfig(chance))); return new EndFeature(name, feature, GenerationStep.Feature.RAW_GENERATION, configured); } - + public static EndFeature makeLakeFeature(String name, Feature feature, int chance) { - ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT).decorate(Decorator.WATER_LAKE.configure(new ChanceDecoratorConfig(chance))); + ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT) + .decorate(Decorator.WATER_LAKE.configure(new ChanceDecoratorConfig(chance))); return new EndFeature(name, feature, GenerationStep.Feature.LAKES, configured); } - - public static EndFeature makeOreFeature(String name, Block blockOre, int veins, int veinSize, int offset, int minY, int maxY) { + + public static EndFeature makeOreFeature(String name, Block blockOre, int veins, int veinSize, int offset, int minY, + int maxY) { EndFeature newFeature = new EndFeature(); - OreFeatureConfig featureConfig = new OreFeatureConfig(new BlockMatchRuleTest(Blocks.END_STONE), blockOre.getDefaultState(), veinSize); + OreFeatureConfig featureConfig = new OreFeatureConfig(new BlockMatchRuleTest(Blocks.END_STONE), + blockOre.defaultBlockState(), veinSize); RangeDecoratorConfig rangeDecorator = new RangeDecoratorConfig(offset, minY, maxY); ConfiguredFeature oreFeature = Feature.ORE.configure(featureConfig) - .decorate(Decorator.RANGE.configure(rangeDecorator)) - .spreadHorizontally() - .repeat(veins); + .decorate(Decorator.RANGE.configure(rangeDecorator)).spreadHorizontally().repeat(veins); newFeature.feature = Feature.ORE; newFeature.featureStep = GenerationStep.Feature.UNDERGROUND_ORES; - newFeature.featureConfigured = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, BetterEnd.makeID(name), oreFeature); - + newFeature.featureConfigured = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, BetterEnd.makeID(name), + oreFeature); + return newFeature; } - - public static EndFeature makeLayerFeature(String name, BlockState state, float radius, int minY, int maxY, int count) { + + public static EndFeature makeLayerFeature(String name, BlockState state, float radius, int minY, int maxY, + int count) { OreLayerFeature layer = new OreLayerFeature(state, radius, minY, maxY); - ConfiguredFeature configured = layer.configure(FeatureConfig.DEFAULT).decorate(Decorator.COUNT.configure(new CountConfig(count))); + ConfiguredFeature configured = layer.configure(FeatureConfig.DEFAULT) + .decorate(Decorator.COUNT.configure(new CountConfig(count))); return new EndFeature(name, layer, GenerationStep.Feature.UNDERGROUND_ORES, configured); } - + public static EndFeature makeLayerFeature(String name, Block block, float radius, int minY, int maxY, int count) { - OreLayerFeature layer = new OreLayerFeature(block.getDefaultState(), radius, minY, maxY); - ConfiguredFeature configured = layer.configure(FeatureConfig.DEFAULT).decorate(Decorator.COUNT.configure(new CountConfig(count))); + OreLayerFeature layer = new OreLayerFeature(block.defaultBlockState(), radius, minY, maxY); + ConfiguredFeature configured = layer.configure(FeatureConfig.DEFAULT) + .decorate(Decorator.COUNT.configure(new CountConfig(count))); return new EndFeature(name, layer, GenerationStep.Feature.UNDERGROUND_ORES, configured); } - - public static EndFeature makeLayerFeature(String name, StoneMaterial material, float radius, int minY, int maxY, int count) { - OreLayerFeature layer = new OreLayerFeature(material.stone.getDefaultState(), radius, minY, maxY); - ConfiguredFeature configured = layer.configure(FeatureConfig.DEFAULT).decorate(Decorator.COUNT.configure(new CountConfig(count))); + + public static EndFeature makeLayerFeature(String name, StoneMaterial material, float radius, int minY, int maxY, + int count) { + OreLayerFeature layer = new OreLayerFeature(material.stone.defaultBlockState(), radius, minY, maxY); + ConfiguredFeature configured = layer.configure(FeatureConfig.DEFAULT) + .decorate(Decorator.COUNT.configure(new CountConfig(count))); return new EndFeature(name, layer, GenerationStep.Feature.UNDERGROUND_ORES, configured); } - + public static EndFeature makeChunkFeature(String name, Feature feature) { - ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT).decorate(Decorator.COUNT.configure(new CountConfig(1))); + ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT) + .decorate(Decorator.COUNT.configure(new CountConfig(1))); return new EndFeature(name, feature, GenerationStep.Feature.LOCAL_MODIFICATIONS, configured); } - + public static EndFeature makeChansedFeature(String name, Feature feature, int chance) { - ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT).decorate(Decorator.CHANCE.configure(new ChanceDecoratorConfig(chance))); + ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT) + .decorate(Decorator.CHANCE.configure(new ChanceDecoratorConfig(chance))); return new EndFeature(name, feature, GenerationStep.Feature.SURFACE_STRUCTURES, configured); } - + public static EndFeature makeCountRawFeature(String name, Feature feature, int chance) { - ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT).decorate(Decorator.COUNT.configure(new CountConfig(chance))); + ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT) + .decorate(Decorator.COUNT.configure(new CountConfig(chance))); return new EndFeature(name, feature, GenerationStep.Feature.RAW_GENERATION, configured); } - + public static EndFeature makeFeatureConfigured(String name, Feature feature) { ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT); return new EndFeature(name, feature, GenerationStep.Feature.RAW_GENERATION, configured); } - + public Feature getFeature() { return feature; } diff --git a/src/main/java/ru/betterend/world/features/EndLilyFeature.java b/src/main/java/ru/betterend/world/features/EndLilyFeature.java index e2556204..a97d377a 100644 --- a/src/main/java/ru/betterend/world/features/EndLilyFeature.java +++ b/src/main/java/ru/betterend/world/features/EndLilyFeature.java @@ -2,7 +2,7 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.EndLilySeedBlock; import ru.betterend.registry.EndBlocks; @@ -17,7 +17,7 @@ public class EndLilyFeature extends UnderwaterPlantScatter { EndLilySeedBlock seed = (EndLilySeedBlock) EndBlocks.END_LILY_SEED; seed.grow(world, random, blockPos); } - + @Override protected int getChance() { return 15; diff --git a/src/main/java/ru/betterend/world/features/EndLotusFeature.java b/src/main/java/ru/betterend/world/features/EndLotusFeature.java index ffa327a4..3cf060e4 100644 --- a/src/main/java/ru/betterend/world/features/EndLotusFeature.java +++ b/src/main/java/ru/betterend/world/features/EndLotusFeature.java @@ -2,7 +2,7 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.EndLotusSeedBlock; import ru.betterend.registry.EndBlocks; @@ -17,7 +17,7 @@ public class EndLotusFeature extends UnderwaterPlantScatter { EndLotusSeedBlock seed = (EndLotusSeedBlock) EndBlocks.END_LOTUS_SEED; seed.grow(world, random, blockPos); } - + @Override protected int getChance() { return 15; diff --git a/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java b/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java index 5c12c62e..0264ccc4 100644 --- a/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java +++ b/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java @@ -2,11 +2,11 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.EndLotusLeafBlock; @@ -24,48 +24,51 @@ public class EndLotusLeafFeature extends ScatterFeature { generateLeaf(world, blockPos); } } - + @Override protected int getChance() { return 15; } - + @Override protected BlockPos getCenterGround(StructureWorldAccess world, BlockPos pos) { return getPosOnSurface(world, pos); } - + private void generateLeaf(StructureWorldAccess world, BlockPos pos) { - Mutable p = new Mutable(); - BlockState leaf = EndBlocks.END_LOTUS_LEAF.getDefaultState(); + MutableBlockPos p = new MutableBlockPos(); + BlockState leaf = EndBlocks.END_LOTUS_LEAF.defaultBlockState(); BlocksHelper.setWithoutUpdate(world, pos, leaf.with(EndLotusLeafBlock.SHAPE, TripleShape.BOTTOM)); - for (Direction move: BlocksHelper.HORIZONTAL) { - BlocksHelper.setWithoutUpdate(world, p.set(pos).move(move), leaf.with(EndLotusLeafBlock.HORIZONTAL_FACING, move).with(EndLotusLeafBlock.SHAPE, TripleShape.MIDDLE)); + for (Direction move : BlocksHelper.HORIZONTAL) { + BlocksHelper.setWithoutUpdate(world, p.set(pos).move(move), leaf + .with(EndLotusLeafBlock.HORIZONTAL_FACING, move).with(EndLotusLeafBlock.SHAPE, TripleShape.MIDDLE)); } - for (int i = 0; i < 4; i ++) { + for (int i = 0; i < 4; i++) { Direction d1 = BlocksHelper.HORIZONTAL[i]; Direction d2 = BlocksHelper.HORIZONTAL[(i + 1) & 3]; - BlocksHelper.setWithoutUpdate(world, p.set(pos).move(d1).move(d2), leaf.with(EndLotusLeafBlock.HORIZONTAL_FACING, d1).with(EndLotusLeafBlock.SHAPE, TripleShape.TOP)); + BlocksHelper.setWithoutUpdate(world, p.set(pos).move(d1).move(d2), + leaf.with(EndLotusLeafBlock.HORIZONTAL_FACING, d1).with(EndLotusLeafBlock.SHAPE, TripleShape.TOP)); } } - + private boolean canGenerate(StructureWorldAccess world, BlockPos pos) { - Mutable p = new Mutable(); + MutableBlockPos p = new MutableBlockPos(); p.setY(pos.getY()); int count = 0; - for (int x = -1; x < 2; x ++) { + for (int x = -1; x < 2; x++) { p.setX(pos.getX() + x); - for (int z = -1; z < 2; z ++) { + for (int z = -1; z < 2; z++) { p.setZ(pos.getZ() + z); - if (world.isAir(p) && world.getBlockState(p.down()).isOf(Blocks.WATER)) - count ++; + if (world.isAir(p) && world.getBlockState(p.below()).is(Blocks.WATER)) + count++; } } return count == 9; } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { - return world.isAir(blockPos) && world.getBlockState(blockPos.down()).isOf(Blocks.WATER); + public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, + float radius) { + return world.isAir(blockPos) && world.getBlockState(blockPos.below()).is(Blocks.WATER); } } diff --git a/src/main/java/ru/betterend/world/features/FilaluxFeature.java b/src/main/java/ru/betterend/world/features/FilaluxFeature.java index 394f0505..80b0505a 100644 --- a/src/main/java/ru/betterend/world/features/FilaluxFeature.java +++ b/src/main/java/ru/betterend/world/features/FilaluxFeature.java @@ -2,10 +2,10 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.block.BlockState; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; @@ -20,11 +20,11 @@ public class FilaluxFeature extends SkyScatterFeature { @Override public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { - BlockState vine = EndBlocks.FILALUX.getDefaultState(); - BlockState wings = EndBlocks.FILALUX_WINGS.getDefaultState(); + BlockState vine = EndBlocks.FILALUX.defaultBlockState(); + BlockState wings = EndBlocks.FILALUX_WINGS.defaultBlockState(); BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.FILALUX_LANTERN); BlocksHelper.setWithoutUpdate(world, blockPos.up(), wings.with(Properties.FACING, Direction.UP)); - for (Direction dir: BlocksHelper.HORIZONTAL) { + for (Direction dir : BlocksHelper.HORIZONTAL) { BlocksHelper.setWithoutUpdate(world, blockPos.offset(dir), wings.with(Properties.FACING, dir)); } int length = MHelper.randRange(1, 3, random); diff --git a/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java b/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java index b5b112f9..a188df4c 100644 --- a/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java @@ -2,8 +2,8 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.Heightmap; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; @@ -12,24 +12,26 @@ import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; public abstract class FullHeightScatterFeature extends DefaultFeature { - private static final Mutable POS = new Mutable(); + private static final MutableBlockPos POS = new MutableBlockPos(); private final int radius; - + public FullHeightScatterFeature(int radius) { this.radius = radius; } - - public abstract boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius); - + + public abstract boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, + float radius); + public abstract void generate(StructureWorldAccess world, Random random, BlockPos blockPos); - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, DefaultFeatureConfig featureConfig) { + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, + DefaultFeatureConfig featureConfig) { int maxY = world.getTopY(Heightmap.Type.WORLD_SURFACE_WG, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); for (int y = maxY; y > minY; y--) { POS.set(center.getX(), y, center.getZ()); - if (world.getBlockState(POS).isAir() && !world.getBlockState(POS.down()).isAir()) { + if (world.getBlockState(POS).isAir() && !world.getBlockState(POS.below()).isAir()) { float r = MHelper.randRange(radius * 0.5F, radius, random); int count = MHelper.floor(r * r * MHelper.randRange(1.5F, 3F, random)); for (int i = 0; i < count; i++) { @@ -37,12 +39,13 @@ public abstract class FullHeightScatterFeature extends DefaultFeature { float theta = random.nextFloat() * MHelper.PI2; float x = pr * (float) Math.cos(theta); float z = pr * (float) Math.sin(theta); - + POS.set(center.getX() + x, y + 5, center.getZ() + z); int down = BlocksHelper.downRay(world, POS, 16); - if (down > 10) continue; + if (down > 10) + continue; POS.setY(POS.getY() - down); - + if (canGenerate(world, random, center, POS, r)) { generate(world, random, POS); } diff --git a/src/main/java/ru/betterend/world/features/GlowPillarFeature.java b/src/main/java/ru/betterend/world/features/GlowPillarFeature.java index d64c9cbb..0afd2944 100644 --- a/src/main/java/ru/betterend/world/features/GlowPillarFeature.java +++ b/src/main/java/ru/betterend/world/features/GlowPillarFeature.java @@ -2,7 +2,7 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; @@ -13,7 +13,8 @@ public class GlowPillarFeature extends ScatterFeature { } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { + public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, + float radius) { return EndBlocks.GLOWING_PILLAR_SEED.canPlaceAt(AIR, world, blockPos); } @@ -22,7 +23,7 @@ public class GlowPillarFeature extends ScatterFeature { EndPlantWithAgeBlock seed = ((EndPlantWithAgeBlock) EndBlocks.GLOWING_PILLAR_SEED); seed.growAdult(world, random, blockPos); } - + @Override protected int getChance() { return 10; diff --git a/src/main/java/ru/betterend/world/features/HydraluxFeature.java b/src/main/java/ru/betterend/world/features/HydraluxFeature.java index 3aad5755..3b27ddf7 100644 --- a/src/main/java/ru/betterend/world/features/HydraluxFeature.java +++ b/src/main/java/ru/betterend/world/features/HydraluxFeature.java @@ -2,7 +2,7 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.HydraluxSaplingBlock; import ru.betterend.registry.EndBlocks; @@ -17,7 +17,7 @@ public class HydraluxFeature extends UnderwaterPlantScatter { HydraluxSaplingBlock seed = (HydraluxSaplingBlock) EndBlocks.HYDRALUX_SAPLING; seed.grow(world, random, blockPos); } - + @Override protected int getChance() { return 15; diff --git a/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java b/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java index 895fdc5a..6f4b3dc0 100644 --- a/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java @@ -2,8 +2,8 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.Heightmap; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; @@ -12,19 +12,21 @@ import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; public abstract class InvertedScatterFeature extends DefaultFeature { - private static final Mutable POS = new Mutable(); + private static final MutableBlockPos POS = new MutableBlockPos(); private final int radius; - + public InvertedScatterFeature(int radius) { this.radius = radius; } - - public abstract boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius); - + + public abstract boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, + float radius); + public abstract void generate(StructureWorldAccess world, Random random, BlockPos blockPos); - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, DefaultFeatureConfig featureConfig) { + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, + DefaultFeatureConfig featureConfig) { int maxY = world.getTopY(Heightmap.Type.WORLD_SURFACE, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); for (int y = maxY; y > minY; y--) { @@ -37,12 +39,13 @@ public abstract class InvertedScatterFeature extends DefaultFeature { float theta = random.nextFloat() * MHelper.PI2; float x = pr * (float) Math.cos(theta); float z = pr * (float) Math.sin(theta); - + POS.set(center.getX() + x, center.getY() - 7, center.getZ() + z); int up = BlocksHelper.upRay(world, POS, 16); - if (up > 14) continue; + if (up > 14) + continue; POS.setY(POS.getY() + up); - + if (canGenerate(world, random, center, POS, r)) { generate(world, random, POS); } diff --git a/src/main/java/ru/betterend/world/features/LanceleafFeature.java b/src/main/java/ru/betterend/world/features/LanceleafFeature.java index 97a63710..2223c3c1 100644 --- a/src/main/java/ru/betterend/world/features/LanceleafFeature.java +++ b/src/main/java/ru/betterend/world/features/LanceleafFeature.java @@ -2,7 +2,7 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; @@ -13,7 +13,8 @@ public class LanceleafFeature extends ScatterFeature { } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { + public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, + float radius) { return EndBlocks.LANCELEAF_SEED.canPlaceAt(AIR, world, blockPos); } @@ -22,7 +23,7 @@ public class LanceleafFeature extends ScatterFeature { EndPlantWithAgeBlock seed = ((EndPlantWithAgeBlock) EndBlocks.LANCELEAF_SEED); seed.growAdult(world, random, blockPos); } - + @Override protected int getChance() { return 5; diff --git a/src/main/java/ru/betterend/world/features/ListFeature.java b/src/main/java/ru/betterend/world/features/ListFeature.java index 42dc6367..bc4dcf0c 100644 --- a/src/main/java/ru/betterend/world/features/ListFeature.java +++ b/src/main/java/ru/betterend/world/features/ListFeature.java @@ -6,8 +6,8 @@ import java.util.Random; import net.minecraft.structure.Structure; import net.minecraft.structure.StructurePlacementData; import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; import ru.betterend.registry.EndTags; import ru.betterend.util.StructureHelper; @@ -15,11 +15,11 @@ import ru.betterend.util.StructureHelper; public class ListFeature extends NBTStructureFeature { private final List list; private StructureInfo selected; - + public ListFeature(List list) { this.list = list; } - + @Override protected Structure getStructure(StructureWorldAccess world, BlockPos pos, Random random) { selected = list.get(random.nextInt(list.size())); @@ -30,12 +30,12 @@ public class ListFeature extends NBTStructureFeature { protected boolean canSpawn(StructureWorldAccess world, BlockPos pos, Random random) { int cx = pos.getX() >> 4; int cz = pos.getZ() >> 4; - return ((cx + cz) & 1) == 0 && pos.getY() > 58 && world.getBlockState(pos.down()).isIn(EndTags.GEN_TERRAIN); + return ((cx + cz) & 1) == 0 && pos.getY() > 58 && world.getBlockState(pos.below()).isIn(EndTags.GEN_TERRAIN); } @Override - protected BlockRotation getRotation(StructureWorldAccess world, BlockPos pos, Random random) { - return BlockRotation.random(random); + protected Rotation getRotation(StructureWorldAccess world, BlockPos pos, Random random) { + return Rotation.random(random); } @Override @@ -52,23 +52,24 @@ public class ListFeature extends NBTStructureFeature { protected TerrainMerge getTerrainMerge(StructureWorldAccess world, BlockPos pos, Random random) { return selected.terrainMerge; } - + @Override - protected void addStructureData(StructurePlacementData data) {} - + protected void addStructureData(StructurePlacementData data) { + } + public static final class StructureInfo { public final TerrainMerge terrainMerge; public final String structurePath; public final int offsetY; - + private Structure structure; - + public StructureInfo(String structurePath, int offsetY, TerrainMerge terrainMerge) { this.terrainMerge = terrainMerge; this.structurePath = structurePath; this.offsetY = offsetY; } - + public Structure getStructure() { if (structure == null) { structure = StructureHelper.readStructure(structurePath); diff --git a/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java b/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java index 186fa664..3347ab66 100644 --- a/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java +++ b/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java @@ -3,16 +3,16 @@ package ru.betterend.world.features; import java.util.Random; import java.util.function.Function; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; public class MengerSpongeFeature extends UnderwaterPlantScatter { private static final Function REPLACE; - + public MengerSpongeFeature(int radius) { super(radius); } @@ -21,7 +21,7 @@ public class MengerSpongeFeature extends UnderwaterPlantScatter { public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.MENGER_SPONGE_WET); if (random.nextBoolean()) { - for (Direction dir: BlocksHelper.DIRECTIONS) { + for (Direction dir : BlocksHelper.DIRECTIONS) { BlockPos pos = blockPos.offset(dir); if (REPLACE.apply(world.getBlockState(pos))) { BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.MENGER_SPONGE_WET); @@ -29,10 +29,10 @@ public class MengerSpongeFeature extends UnderwaterPlantScatter { } } } - + static { REPLACE = (state) -> { - if (state.isOf(EndBlocks.END_LOTUS_STEM)) { + if (state.is(EndBlocks.END_LOTUS_STEM)) { return false; } return !state.getFluidState().isEmpty() || state.getMaterial().isReplaceable(); diff --git a/src/main/java/ru/betterend/world/features/NBTStructureFeature.java b/src/main/java/ru/betterend/world/features/NBTStructureFeature.java index 2bb0dac0..a8ced4bf 100644 --- a/src/main/java/ru/betterend/world/features/NBTStructureFeature.java +++ b/src/main/java/ru/betterend/world/features/NBTStructureFeature.java @@ -4,19 +4,19 @@ import java.io.IOException; import java.io.InputStream; import java.util.Random; -import net.minecraft.block.BlockState; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtIo; import net.minecraft.server.MinecraftServer; import net.minecraft.structure.Structure; import net.minecraft.structure.StructurePlacementData; import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.Identifier; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.chunk.ChunkGenerator; @@ -29,34 +29,33 @@ import ru.betterend.world.processors.DestructionStructureProcessor; public abstract class NBTStructureFeature extends DefaultFeature { protected static final DestructionStructureProcessor DESTRUCTION = new DestructionStructureProcessor(); - + protected abstract Structure getStructure(StructureWorldAccess world, BlockPos pos, Random random); - + protected abstract boolean canSpawn(StructureWorldAccess world, BlockPos pos, Random random); - - protected abstract BlockRotation getRotation(StructureWorldAccess world, BlockPos pos, Random random); - + + protected abstract Rotation getRotation(StructureWorldAccess world, BlockPos pos, Random random); + protected abstract BlockMirror getMirror(StructureWorldAccess world, BlockPos pos, Random random); - + protected abstract int getYOffset(Structure structure, StructureWorldAccess world, BlockPos pos, Random random); - + protected abstract TerrainMerge getTerrainMerge(StructureWorldAccess world, BlockPos pos, Random random); - + protected abstract void addStructureData(StructurePlacementData data); - + protected BlockPos getGround(StructureWorldAccess world, BlockPos center) { Biome biome = world.getBiome(center); - Identifier id = EndBiomes.getBiomeID(biome); + ResourceLocation id = EndBiomes.getBiomeID(biome); if (id.getNamespace().contains("moutain") || id.getNamespace().contains("lake")) { int y = getAverageY(world, center); return new BlockPos(center.getX(), y, center.getZ()); - } - else { + } else { int y = getAverageYWG(world, center); return new BlockPos(center.getX(), y, center.getZ()); } } - + protected int getAverageY(StructureWorldAccess world, BlockPos center) { int y = getYOnSurface(world, center.getX(), center.getZ()); y += getYOnSurface(world, center.getX() - 2, center.getZ() - 2); @@ -65,7 +64,7 @@ public abstract class NBTStructureFeature extends DefaultFeature { y += getYOnSurface(world, center.getX() + 2, center.getZ() + 2); return y / 5; } - + protected int getAverageYWG(StructureWorldAccess world, BlockPos center) { int y = getYOnSurfaceWG(world, center.getX(), center.getZ()); y += getYOnSurfaceWG(world, center.getX() - 2, center.getZ() - 2); @@ -74,49 +73,51 @@ public abstract class NBTStructureFeature extends DefaultFeature { y += getYOnSurfaceWG(world, center.getX() + 2, center.getZ() + 2); return y / 5; } - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, DefaultFeatureConfig featureConfig) { + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, + DefaultFeatureConfig featureConfig) { center = new BlockPos(((center.getX() >> 4) << 4) | 8, 128, ((center.getZ() >> 4) << 4) | 8); center = getGround(world, center); - + if (!canSpawn(world, center, random)) { return false; } - + int posY = center.getY() + 1; Structure structure = getStructure(world, center, random); - BlockRotation rotation = getRotation(world, center, random); + Rotation rotation = getRotation(world, center, random); BlockMirror mirror = getMirror(world, center, random); BlockPos offset = Structure.transformAround(structure.getSize(), mirror, rotation, BlockPos.ORIGIN); center = center.add(0, getYOffset(structure, world, center, random) + 0.5, 0); - + BlockBox bounds = makeBox(center); - StructurePlacementData placementData = new StructurePlacementData().setRotation(rotation).setMirror(mirror).setBoundingBox(bounds); + StructurePlacementData placementData = new StructurePlacementData().setRotation(rotation).setMirror(mirror) + .setBoundingBox(bounds); addStructureData(placementData); center = center.add(-offset.getX() * 0.5, 0, -offset.getZ() * 0.5); structure.place(world, center, placementData, random); - + TerrainMerge merge = getTerrainMerge(world, center, random); int x1 = center.getX(); int z1 = center.getZ(); int x2 = x1 + offset.getX(); int z2 = z1 + offset.getZ(); if (merge != TerrainMerge.NONE) { - Mutable mut = new Mutable(); - + MutableBlockPos mut = new MutableBlockPos(); + if (x2 < x1) { int a = x1; x1 = x2; x2 = a; } - + if (z2 < z1) { int a = z1; z1 = z2; z2 = a; } - + int surfMax = posY - 1; for (int x = x1; x <= x2; x++) { mut.setX(x); @@ -130,22 +131,21 @@ public abstract class NBTStructureFeature extends DefaultFeature { BlockState stateSt = world.getBlockState(mut); if (!stateSt.isIn(EndTags.GEN_TERRAIN)) { if (merge == TerrainMerge.SURFACE) { - SurfaceConfig config = world.getBiome(mut).getGenerationSettings().getSurfaceConfig(); + SurfaceConfig config = world.getBiome(mut).getGenerationSettings() + .getSurfaceConfig(); boolean isTop = mut.getY() == surfMax && state.getMaterial().blocksLight(); BlockState top = isTop ? config.getTopMaterial() : config.getUnderMaterial(); BlocksHelper.setWithoutUpdate(world, mut, top); - } - else { + } else { BlocksHelper.setWithoutUpdate(world, mut, state); } - } - else { + } else { if (stateSt.isIn(EndTags.END_GROUND) && state.getMaterial().blocksLight()) { if (merge == TerrainMerge.SURFACE) { - SurfaceConfig config = world.getBiome(mut).getGenerationSettings().getSurfaceConfig(); + SurfaceConfig config = world.getBiome(mut).getGenerationSettings() + .getSurfaceConfig(); BlocksHelper.setWithoutUpdate(world, mut, config.getUnderMaterial()); - } - else { + } else { BlocksHelper.setWithoutUpdate(world, mut, state); } } @@ -156,11 +156,12 @@ public abstract class NBTStructureFeature extends DefaultFeature { } } } - BlocksHelper.fixBlocks(world, new BlockPos(x1, center.getY(), z1), new BlockPos(x2, center.getY() + offset.getY(), z2)); - + BlocksHelper.fixBlocks(world, new BlockPos(x1, center.getY(), z1), + new BlockPos(x2, center.getY() + offset.getY(), z2)); + return true; } - + protected BlockBox makeBox(BlockPos pos) { int sx = ((pos.getX() >> 4) << 4) - 16; int sz = ((pos.getZ() >> 4) << 4) - 16; @@ -168,22 +169,22 @@ public abstract class NBTStructureFeature extends DefaultFeature { int ez = sz + 47; return BlockBox.create(sx, 0, sz, ex, 255, ez); } - - protected static Structure readStructure(Identifier resource) { + + protected static Structure readStructure(ResourceLocation resource) { String ns = resource.getNamespace(); String nm = resource.getPath(); try { - InputStream inputstream = MinecraftServer.class.getResourceAsStream("/data/" + ns + "/structures/" + nm + ".nbt"); + InputStream inputstream = MinecraftServer.class + .getResourceAsStream("/data/" + ns + "/structures/" + nm + ".nbt"); return readStructureFromStream(inputstream); - } - catch (IOException e) { + } catch (IOException e) { e.printStackTrace(); } return null; } - + private static Structure readStructureFromStream(InputStream stream) throws IOException { CompoundTag nbttagcompound = NbtIo.readCompressed(stream); @@ -192,20 +193,16 @@ public abstract class NBTStructureFeature extends DefaultFeature { return template; } - + public static enum TerrainMerge { - NONE, - SURFACE, - OBJECT; - + NONE, SURFACE, OBJECT; + public static TerrainMerge getFromString(String type) { if (type.equals("surface")) { return SURFACE; - } - else if (type.equals("object")) { + } else if (type.equals("object")) { return OBJECT; - } - else { + } else { return NONE; } } diff --git a/src/main/java/ru/betterend/world/features/NeonCactusFeature.java b/src/main/java/ru/betterend/world/features/NeonCactusFeature.java index f62ae4ab..c38a6ce4 100644 --- a/src/main/java/ru/betterend/world/features/NeonCactusFeature.java +++ b/src/main/java/ru/betterend/world/features/NeonCactusFeature.java @@ -3,9 +3,9 @@ package ru.betterend.world.features; import java.util.Random; import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -17,65 +17,61 @@ import ru.betterend.util.MHelper; public class NeonCactusFeature extends DefaultFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).isOf(EndBlocks.ENDSTONE_DUST)) { + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + if (!world.getBlockState(pos.below()).is(EndBlocks.ENDSTONE_DUST)) { return false; } - + int h = MHelper.randRange(5, 20, random); - Mutable mut = new Mutable().set(pos); + MutableBlockPos mut = new MutableBlockPos().set(pos); Direction hor = BlocksHelper.randomHorizontal(random); for (int i = 0; i < h; i++) { if (!world.getBlockState(mut).getMaterial().isReplaceable()) { break; } int size = (h - i) >> 2; - BlocksHelper.setWithUpdate(world, mut, - EndBlocks.NEON_CACTUS.getDefaultState() - .with(BlockProperties.TRIPLE_SHAPE, getBySize(size)) - .with(Properties.FACING, Direction.UP) - ); + BlocksHelper.setWithUpdate(world, mut, EndBlocks.NEON_CACTUS.defaultBlockState() + .with(BlockProperties.TRIPLE_SHAPE, getBySize(size)).with(Properties.FACING, Direction.UP)); if (i > 2 && i < (h - 1) && random.nextBoolean()) { int length = h - i - MHelper.randRange(1, 2, random); if (length > 0) { Direction dir2 = hor; - hor = hor.rotateYClockwise(); + hor = hor.getClockWise(); int bsize = i > ((h << 1) / 3) ? 0 : size > 1 ? 1 : size; branch(world, mut.offset(dir2), dir2, random, length, bsize); } } mut.move(Direction.UP); } - + return true; } - + private void branch(StructureWorldAccess world, BlockPos pos, Direction dir, Random random, int length, int size) { int rotIndex = length >> 2; - Mutable mut = new Mutable().set(pos); + MutableBlockPos mut = new MutableBlockPos().set(pos); Direction hor = BlocksHelper.randomHorizontal(random); for (int i = 0; i < length; i++) { if (!world.getBlockState(mut).getMaterial().isReplaceable()) { return; } - BlocksHelper.setWithUpdate(world, mut, - EndBlocks.NEON_CACTUS.getDefaultState() - .with(BlockProperties.TRIPLE_SHAPE, getBySize(size)) - .with(Properties.FACING, dir) - ); + BlocksHelper.setWithUpdate(world, mut, EndBlocks.NEON_CACTUS.defaultBlockState() + .with(BlockProperties.TRIPLE_SHAPE, getBySize(size)).with(Properties.FACING, dir)); if (i == rotIndex) { dir = Direction.UP; - size --; + size--; } if (i > 1 && i < (length - 1) && random.nextBoolean()) { Direction dir2 = dir == Direction.UP ? hor : Direction.UP; - hor = hor.rotateYClockwise(); - branch(world, mut.offset(dir2), dir2, random, MHelper.randRange(length / 4, length / 2, random), size > 0 ? size - 1 : size); + hor = hor.getClockWise(); + branch(world, mut.offset(dir2), dir2, random, MHelper.randRange(length / 4, length / 2, random), + size > 0 ? size - 1 : size); } mut.move(dir); } } - + private TripleShape getBySize(int size) { return size < 1 ? TripleShape.TOP : size == 1 ? TripleShape.MIDDLE : TripleShape.BOTTOM; } diff --git a/src/main/java/ru/betterend/world/features/ScatterFeature.java b/src/main/java/ru/betterend/world/features/ScatterFeature.java index 56086199..eed12d70 100644 --- a/src/main/java/ru/betterend/world/features/ScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/ScatterFeature.java @@ -2,8 +2,8 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -12,32 +12,32 @@ import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; public abstract class ScatterFeature extends DefaultFeature { - private static final Mutable POS = new Mutable(); + private static final MutableBlockPos POS = new MutableBlockPos(); private final int radius; - + public ScatterFeature(int radius) { this.radius = radius; } - - public abstract boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius); - + + public abstract boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, + float radius); + public abstract void generate(StructureWorldAccess world, Random random, BlockPos blockPos); - + protected BlockPos getCenterGround(StructureWorldAccess world, BlockPos pos) { return getPosOnSurfaceWG(world, pos); } - + protected boolean canSpawn(StructureWorldAccess world, BlockPos pos) { if (pos.getY() < 5) { return false; - } - else if (!world.getBlockState(pos.down()).isIn(EndTags.END_GROUND)) { + } else if (!world.getBlockState(pos.below()).isIn(EndTags.END_GROUND)) { return false; } return true; } - - protected boolean getGroundPlant(StructureWorldAccess world, Mutable pos) { + + protected boolean getGroundPlant(StructureWorldAccess world, MutableBlockPos pos) { int down = BlocksHelper.downRay(world, pos, 16); if (down > Math.abs(getYOffset() * 2)) { return false; @@ -45,23 +45,24 @@ public abstract class ScatterFeature extends DefaultFeature { pos.setY(pos.getY() - down); return true; } - + protected int getYOffset() { return 5; } - + protected int getChance() { return 1; } - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, DefaultFeatureConfig featureConfig) { + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, + DefaultFeatureConfig featureConfig) { center = getCenterGround(world, center); - + if (!canSpawn(world, center)) { return false; } - + float r = MHelper.randRange(radius * 0.5F, radius, random); int count = MHelper.floor(r * r * MHelper.randRange(1.5F, 3F, random)); for (int i = 0; i < count; i++) { @@ -69,13 +70,14 @@ public abstract class ScatterFeature extends DefaultFeature { float theta = random.nextFloat() * MHelper.PI2; float x = pr * (float) Math.cos(theta); float z = pr * (float) Math.sin(theta); - + POS.set(center.getX() + x, center.getY() + getYOffset(), center.getZ() + z); - if (getGroundPlant(world, POS) && canGenerate(world, random, center, POS, r) && (getChance() < 2 || random.nextInt(getChance()) == 0)) { + if (getGroundPlant(world, POS) && canGenerate(world, random, center, POS, r) + && (getChance() < 2 || random.nextInt(getChance()) == 0)) { generate(world, random, POS); } } - + return true; } } diff --git a/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java b/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java index a66d8862..ba270515 100644 --- a/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java +++ b/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java @@ -2,12 +2,12 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.block.BlockState; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.state.property.Properties; -import net.minecraft.tag.BlockTags; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; +import net.minecraft.tags.BlockTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.Heightmap; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; @@ -17,15 +17,15 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; public class SilkMothNestFeature extends DefaultFeature { - private static final Mutable POS = new Mutable(); - + private static final MutableBlockPos POS = new MutableBlockPos(); + private boolean canGenerate(StructureWorldAccess world, BlockPos pos) { BlockState state = world.getBlockState(pos.up()); if (state.isIn(BlockTags.LEAVES) || state.isIn(BlockTags.LOGS)) { state = world.getBlockState(pos); - if ((state.isAir() || state.isOf(EndBlocks.TENANEA_OUTER_LEAVES)) && world.isAir(pos.down())) { - for (Direction dir: BlocksHelper.HORIZONTAL) { - if (world.getBlockState(pos.down().offset(dir)).getMaterial().blocksMovement()) { + if ((state.isAir() || state.is(EndBlocks.TENANEA_OUTER_LEAVES)) && world.isAir(pos.below())) { + for (Direction dir : BlocksHelper.HORIZONTAL) { + if (world.getBlockState(pos.below().offset(dir)).getMaterial().blocksMovement()) { return false; } return true; @@ -34,9 +34,10 @@ public class SilkMothNestFeature extends DefaultFeature { } return false; } - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, DefaultFeatureConfig featureConfig) { + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, + DefaultFeatureConfig featureConfig) { int maxY = world.getTopY(Heightmap.Type.WORLD_SURFACE, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); POS.set(center); @@ -44,9 +45,11 @@ public class SilkMothNestFeature extends DefaultFeature { POS.setY(y); if (canGenerate(world, POS)) { Direction dir = BlocksHelper.randomHorizontal(random); - BlocksHelper.setWithoutUpdate(world, POS, EndBlocks.SILK_MOTH_NEST.getDefaultState().with(Properties.HORIZONTAL_FACING, dir).with(BlockProperties.ACTIVE, false)); + BlocksHelper.setWithoutUpdate(world, POS, EndBlocks.SILK_MOTH_NEST.defaultBlockState() + .with(Properties.HORIZONTAL_FACING, dir).with(BlockProperties.ACTIVE, false)); POS.setY(y - 1); - BlocksHelper.setWithoutUpdate(world, POS, EndBlocks.SILK_MOTH_NEST.getDefaultState().with(Properties.HORIZONTAL_FACING, dir)); + BlocksHelper.setWithoutUpdate(world, POS, + EndBlocks.SILK_MOTH_NEST.defaultBlockState().with(Properties.HORIZONTAL_FACING, dir)); return true; } } diff --git a/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java b/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java index 82316fd6..77a6bf04 100644 --- a/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java @@ -2,29 +2,30 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.basis.AttachedBlock; import ru.betterend.util.BlocksHelper; public class SingleInvertedScatterFeature extends InvertedScatterFeature { private final Block block; - + public SingleInvertedScatterFeature(Block block, int radius) { super(radius); this.block = block; } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { + public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, + float radius) { if (!world.isAir(blockPos)) { return false; } - BlockState state = block.getDefaultState(); + BlockState state = block.defaultBlockState(); if (block instanceof AttachedBlock) { state = state.with(Properties.FACING, Direction.DOWN); } @@ -33,7 +34,7 @@ public class SingleInvertedScatterFeature extends InvertedScatterFeature { @Override public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { - BlockState state = block.getDefaultState(); + BlockState state = block.defaultBlockState(); if (block instanceof AttachedBlock) { state = state.with(Properties.FACING, Direction.DOWN); } diff --git a/src/main/java/ru/betterend/world/features/SinglePlantFeature.java b/src/main/java/ru/betterend/world/features/SinglePlantFeature.java index 892c3da4..9218691b 100644 --- a/src/main/java/ru/betterend/world/features/SinglePlantFeature.java +++ b/src/main/java/ru/betterend/world/features/SinglePlantFeature.java @@ -2,9 +2,9 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.basis.DoublePlantBlock; import ru.betterend.blocks.basis.EndCropBlock; @@ -15,58 +15,56 @@ public class SinglePlantFeature extends ScatterFeature { private final Block plant; private final boolean rawHeightmap; private final int chance; - + public SinglePlantFeature(Block plant, int radius) { this(plant, radius, true, 1); } - + public SinglePlantFeature(Block plant, int radius, int chance) { this(plant, radius, true, chance); } - + public SinglePlantFeature(Block plant, int radius, boolean rawHeightmap) { this(plant, radius, rawHeightmap, 1); } - + public SinglePlantFeature(Block plant, int radius, boolean rawHeightmap, int chance) { super(radius); this.plant = plant; this.rawHeightmap = rawHeightmap; this.chance = chance; } - + protected int getChance() { return chance; } - + @Override protected BlockPos getCenterGround(StructureWorldAccess world, BlockPos pos) { return rawHeightmap ? getPosOnSurfaceWG(world, pos) : getPosOnSurface(world, pos); } - + @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { - return plant.canPlaceAt(plant.getDefaultState(), world, blockPos); + public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, + float radius) { + return plant.canPlaceAt(plant.defaultBlockState(), world, blockPos); } @Override public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { if (plant instanceof DoublePlantBlock) { int rot = random.nextInt(4); - BlockState state = plant.getDefaultState().with(DoublePlantBlock.ROTATION, rot); + BlockState state = plant.defaultBlockState().with(DoublePlantBlock.ROTATION, rot); BlocksHelper.setWithoutUpdate(world, blockPos, state); BlocksHelper.setWithoutUpdate(world, blockPos.up(), state.with(DoublePlantBlock.TOP, true)); - } - else if (plant instanceof EndCropBlock) { - BlockState state = plant.getDefaultState().with(EndCropBlock.AGE, 3); + } else if (plant instanceof EndCropBlock) { + BlockState state = plant.defaultBlockState().with(EndCropBlock.AGE, 3); BlocksHelper.setWithoutUpdate(world, blockPos, state); - } - else if (plant instanceof EndPlantWithAgeBlock) { + } else if (plant instanceof EndPlantWithAgeBlock) { int age = random.nextInt(4); - BlockState state = plant.getDefaultState().with(EndPlantWithAgeBlock.AGE, age); + BlockState state = plant.defaultBlockState().with(EndPlantWithAgeBlock.AGE, age); BlocksHelper.setWithoutUpdate(world, blockPos, state); - } - else { + } else { BlocksHelper.setWithoutUpdate(world, blockPos, plant); } } diff --git a/src/main/java/ru/betterend/world/features/SkyScatterFeature.java b/src/main/java/ru/betterend/world/features/SkyScatterFeature.java index 97e5178a..090b8314 100644 --- a/src/main/java/ru/betterend/world/features/SkyScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/SkyScatterFeature.java @@ -2,9 +2,9 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; @@ -13,41 +13,42 @@ public abstract class SkyScatterFeature extends ScatterFeature { public SkyScatterFeature(int radius) { super(radius); } - + @Override protected int getChance() { return 10; } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { + public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, + float radius) { if (!world.isAir(blockPos)) { return false; } - - for (Direction dir: BlocksHelper.HORIZONTAL) { + + for (Direction dir : BlocksHelper.HORIZONTAL) { if (!world.isAir(blockPos.offset(dir))) { return false; } } - + int maxD = getYOffset() + 2; int maxV = getYOffset() - 2; - + return BlocksHelper.upRay(world, blockPos, maxD) > maxV && BlocksHelper.downRay(world, blockPos, maxD) > maxV; } - + @Override protected boolean canSpawn(StructureWorldAccess world, BlockPos pos) { return true; } - + @Override protected BlockPos getCenterGround(StructureWorldAccess world, BlockPos pos) { return new BlockPos(pos.getX(), MHelper.randRange(32, 192, world.getRandom()), pos.getZ()); } - - protected boolean getGroundPlant(StructureWorldAccess world, Mutable pos) { + + protected boolean getGroundPlant(StructureWorldAccess world, MutableBlockPos pos) { pos.setY(pos.getY() + MHelper.randRange(-getYOffset(), getYOffset(), world.getRandom())); return true; } diff --git a/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java b/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java index 5013d22c..a62b4a5e 100644 --- a/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java +++ b/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java @@ -2,35 +2,35 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.basis.DoublePlantBlock; import ru.betterend.util.BlocksHelper; public class UnderwaterPlantFeature extends UnderwaterPlantScatter { private final Block plant; - + public UnderwaterPlantFeature(Block plant, int radius) { super(radius); this.plant = plant; } - + @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { - return super.canSpawn(world, blockPos) && plant.canPlaceAt(plant.getDefaultState(), world, blockPos); + public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, + float radius) { + return super.canSpawn(world, blockPos) && plant.canPlaceAt(plant.defaultBlockState(), world, blockPos); } @Override public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { if (plant instanceof DoublePlantBlock) { int rot = random.nextInt(4); - BlockState state = plant.getDefaultState().with(DoublePlantBlock.ROTATION, rot); + BlockState state = plant.defaultBlockState().with(DoublePlantBlock.ROTATION, rot); BlocksHelper.setWithoutUpdate(world, blockPos, state); BlocksHelper.setWithoutUpdate(world, blockPos.up(), state.with(DoublePlantBlock.TOP, true)); - } - else { + } else { BlocksHelper.setWithoutUpdate(world, blockPos, plant); } } diff --git a/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java b/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java index 9af618c4..d38eb537 100644 --- a/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java +++ b/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java @@ -2,18 +2,18 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.block.Blocks; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.StructureWorldAccess; public abstract class UnderwaterPlantScatter extends ScatterFeature { - private static final Mutable POS = new Mutable(); - + private static final MutableBlockPos POS = new MutableBlockPos(); + public UnderwaterPlantScatter(int radius) { super(radius); } - + @Override protected BlockPos getCenterGround(StructureWorldAccess world, BlockPos pos) { POS.setX(pos.getX()); @@ -21,33 +21,34 @@ public abstract class UnderwaterPlantScatter extends ScatterFeature { POS.setY(0); return getGround(world, POS).toImmutable(); } - + @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { - return world.getBlockState(blockPos).isOf(Blocks.WATER); + public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, + float radius) { + return world.getBlockState(blockPos).is(Blocks.WATER); } - + @Override protected boolean canSpawn(StructureWorldAccess world, BlockPos pos) { - return world.getBlockState(pos).isOf(Blocks.WATER); + return world.getBlockState(pos).is(Blocks.WATER); } - + @Override - protected boolean getGroundPlant(StructureWorldAccess world, Mutable pos) { + protected boolean getGroundPlant(StructureWorldAccess world, MutableBlockPos pos) { return getGround(world, pos).getY() < 128; } - + @Override protected int getYOffset() { return -5; } - + @Override protected int getChance() { return 5; } - - private BlockPos getGround(StructureWorldAccess world, Mutable pos) { + + private BlockPos getGround(StructureWorldAccess world, MutableBlockPos pos) { while (pos.getY() < 128 && world.getFluidState(pos).isEmpty()) { pos.setY(pos.getY() + 1); } diff --git a/src/main/java/ru/betterend/world/features/VineFeature.java b/src/main/java/ru/betterend/world/features/VineFeature.java index 535ecd7c..ec3885b2 100644 --- a/src/main/java/ru/betterend/world/features/VineFeature.java +++ b/src/main/java/ru/betterend/world/features/VineFeature.java @@ -2,9 +2,9 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; @@ -15,7 +15,7 @@ public class VineFeature extends InvertedScatterFeature { private final Block vineBlock; private final int maxLength; private final boolean vine; - + public VineFeature(Block vineBlock, int maxLength) { super(6); this.vineBlock = vineBlock; @@ -24,7 +24,8 @@ public class VineFeature extends InvertedScatterFeature { } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { + public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, + float radius) { BlockState state = world.getBlockState(blockPos); return state.getMaterial().isReplaceable() && canPlaceBlock(state, world, blockPos); } @@ -43,28 +44,27 @@ public class VineFeature extends InvertedScatterFeature { BlocksHelper.setWithoutUpdate(world, blockPos.down(h), bottom); } } - + private boolean canPlaceBlock(BlockState state, StructureWorldAccess world, BlockPos blockPos) { if (vine) { return ((VineBlock) vineBlock).canGenerate(state, world, blockPos); - } - else { + } else { return vineBlock.canPlaceAt(state, world, blockPos); } } - + private BlockState getTopState() { - BlockState state = vineBlock.getDefaultState(); + BlockState state = vineBlock.defaultBlockState(); return vine ? state.with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP) : state; } - + private BlockState getMiggleState() { - BlockState state = vineBlock.getDefaultState(); + BlockState state = vineBlock.defaultBlockState(); return vine ? state.with(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE) : state; } - + private BlockState getBottomState() { - BlockState state = vineBlock.getDefaultState(); + BlockState state = vineBlock.defaultBlockState(); return vine ? state.with(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM) : state; } } diff --git a/src/main/java/ru/betterend/world/features/WallPlantFeature.java b/src/main/java/ru/betterend/world/features/WallPlantFeature.java index 7faadad5..24f252d8 100644 --- a/src/main/java/ru/betterend/world/features/WallPlantFeature.java +++ b/src/main/java/ru/betterend/world/features/WallPlantFeature.java @@ -2,11 +2,11 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import ru.betterend.blocks.basis.AttachedBlock; import ru.betterend.blocks.basis.EndWallPlantBlock; @@ -14,7 +14,7 @@ import ru.betterend.util.BlocksHelper; public class WallPlantFeature extends WallScatterFeature { private final Block block; - + public WallPlantFeature(Block block, int radius) { super(radius); this.block = block; @@ -23,23 +23,21 @@ public class WallPlantFeature extends WallScatterFeature { @Override public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos pos, Direction dir) { if (block instanceof EndWallPlantBlock) { - BlockState state = block.getDefaultState().with(EndWallPlantBlock.FACING, dir); + BlockState state = block.defaultBlockState().with(EndWallPlantBlock.FACING, dir); + return block.canPlaceAt(state, world, pos); + } else if (block instanceof AttachedBlock) { + BlockState state = block.defaultBlockState().with(Properties.FACING, dir); return block.canPlaceAt(state, world, pos); } - else if (block instanceof AttachedBlock) { - BlockState state = block.getDefaultState().with(Properties.FACING, dir); - return block.canPlaceAt(state, world, pos); - } - return block.canPlaceAt(block.getDefaultState(), world, pos); + return block.canPlaceAt(block.defaultBlockState(), world, pos); } @Override public void generate(StructureWorldAccess world, Random random, BlockPos pos, Direction dir) { - BlockState state = block.getDefaultState(); + BlockState state = block.defaultBlockState(); if (block instanceof EndWallPlantBlock) { state = state.with(EndWallPlantBlock.FACING, dir); - } - else if (block instanceof AttachedBlock) { + } else if (block instanceof AttachedBlock) { state = state.with(Properties.FACING, dir); } BlocksHelper.setWithoutUpdate(world, pos, state); diff --git a/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java b/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java index c00159f2..6fb1bb71 100644 --- a/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java +++ b/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java @@ -2,11 +2,11 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.tag.BlockTags; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.tags.BlockTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; public class WallPlantOnLogFeature extends WallPlantFeature { @@ -16,7 +16,7 @@ public class WallPlantOnLogFeature extends WallPlantFeature { @Override public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos pos, Direction dir) { - BlockPos blockPos = pos.offset(dir.getOpposite()); + BlockPos blockPos = pos.relative(dir.getOpposite()); BlockState blockState = world.getBlockState(blockPos); return blockState.isIn(BlockTags.LOGS); } diff --git a/src/main/java/ru/betterend/world/features/WallScatterFeature.java b/src/main/java/ru/betterend/world/features/WallScatterFeature.java index 38e63bf4..80f628ad 100644 --- a/src/main/java/ru/betterend/world/features/WallScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/WallScatterFeature.java @@ -2,9 +2,9 @@ package ru.betterend.world.features; import java.util.Random; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.Heightmap; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; @@ -15,25 +15,26 @@ import ru.betterend.util.MHelper; public abstract class WallScatterFeature extends DefaultFeature { private static final Direction[] DIR = BlocksHelper.makeHorizontal(); private final int radius; - + public WallScatterFeature(int radius) { this.radius = radius; } - + public abstract boolean canGenerate(StructureWorldAccess world, Random random, BlockPos pos, Direction dir); - + public abstract void generate(StructureWorldAccess world, Random random, BlockPos pos, Direction dir); - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, DefaultFeatureConfig featureConfig) { + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, + DefaultFeatureConfig featureConfig) { int maxY = world.getTopY(Heightmap.Type.WORLD_SURFACE, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); if (maxY < 10 || maxY < minY) { return false; } int py = MHelper.randRange(minY, maxY, random); - - Mutable mut = new Mutable(); + + MutableBlockPos mut = new MutableBlockPos(); for (int x = -radius; x <= radius; x++) { mut.setX(center.getX() + x); for (int y = -radius; y <= radius; y++) { @@ -42,7 +43,7 @@ public abstract class WallScatterFeature extends DefaultFeature { mut.setZ(center.getZ() + z); if (random.nextInt(4) == 0 && world.isAir(mut)) { shuffle(random); - for (Direction dir: DIR) { + for (Direction dir : DIR) { if (canGenerate(world, random, mut, dir)) { generate(world, random, mut, dir); break; @@ -52,10 +53,10 @@ public abstract class WallScatterFeature extends DefaultFeature { } } } - + return true; } - + private void shuffle(Random random) { for (int i = 0; i < 4; i++) { int j = random.nextInt(4); diff --git a/src/main/java/ru/betterend/world/features/bushes/BushFeature.java b/src/main/java/ru/betterend/world/features/bushes/BushFeature.java index f06a4f4d..ad884473 100644 --- a/src/main/java/ru/betterend/world/features/bushes/BushFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/BushFeature.java @@ -3,12 +3,12 @@ package ru.betterend.world.features.bushes; import java.util.Random; import java.util.function.Function; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.LeavesBlock; -import net.minecraft.block.Material; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.material.Material; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -28,31 +28,38 @@ public class BushFeature extends DefaultFeature { private static final Function REPLACE; private final Block leaves; private final Block stem; - + public BushFeature(Block leaves, Block stem) { this.leaves = leaves; this.stem = stem; } - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND) && !world.getBlockState(pos.up()).getBlock().isIn(EndTags.END_GROUND)) return false; - + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND) + && !world.getBlockState(pos.up()).getBlock().isIn(EndTags.END_GROUND)) + return false; + float radius = MHelper.randRange(1.8F, 3.5F, random); OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt()); SDF sphere = new SDFSphere().setRadius(radius).setBlock(this.leaves); sphere = new SDFScale3D().setScale(1, 0.5F, 1).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; }).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return MHelper.randRange(-2F, 2F, random); }).setSource(sphere); - sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); + sphere = new SDFDisplacement().setFunction((vec) -> { + return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; + }).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> { + return MHelper.randRange(-2F, 2F, random); + }).setSource(sphere); + sphere = new SDFSubtraction().setSourceA(sphere) + .setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); sphere.setReplaceFunction(REPLACE); sphere.addPostProcess((info) -> { if (info.getState().getBlock() instanceof LeavesBlock) { int distance = info.getPos().getManhattanDistance(pos); if (distance < 7) { return info.getState().with(LeavesBlock.DISTANCE, distance); - } - else { + } else { return AIR; } } @@ -60,21 +67,20 @@ public class BushFeature extends DefaultFeature { }); sphere.fillRecursive(world, pos); BlocksHelper.setWithoutUpdate(world, pos, stem); - for (Direction d: Direction.values()) { - BlockPos p = pos.offset(d); + for (Direction d : Direction.values()) { + BlockPos p = pos.relative(d); if (world.isAir(p)) { if (leaves instanceof LeavesBlock) { - BlocksHelper.setWithoutUpdate(world, p, leaves.getDefaultState().with(LeavesBlock.DISTANCE, 1)); - } - else { - BlocksHelper.setWithoutUpdate(world, p, leaves.getDefaultState()); + BlocksHelper.setWithoutUpdate(world, p, leaves.defaultBlockState().with(LeavesBlock.DISTANCE, 1)); + } else { + BlocksHelper.setWithoutUpdate(world, p, leaves.defaultBlockState()); } } } - + return true; } - + static { REPLACE = (state) -> { if (state.getMaterial().equals(Material.PLANT)) { diff --git a/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java b/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java index 024fcbe3..03f54c15 100644 --- a/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java @@ -3,13 +3,13 @@ package ru.betterend.world.features.bushes; import java.util.Random; import java.util.function.Function; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.LeavesBlock; -import net.minecraft.block.Material; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.material.Material; import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -31,32 +31,39 @@ public class BushWithOuterFeature extends DefaultFeature { private final Block outer_leaves; private final Block leaves; private final Block stem; - + public BushWithOuterFeature(Block leaves, Block outer_leaves, Block stem) { this.outer_leaves = outer_leaves; this.leaves = leaves; this.stem = stem; } - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND) && !world.getBlockState(pos.up()).getBlock().isIn(EndTags.END_GROUND)) return false; - + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND) + && !world.getBlockState(pos.up()).getBlock().isIn(EndTags.END_GROUND)) + return false; + float radius = MHelper.randRange(1.8F, 3.5F, random); OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt()); SDF sphere = new SDFSphere().setRadius(radius).setBlock(this.leaves); sphere = new SDFScale3D().setScale(1, 0.5F, 1).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; }).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return MHelper.randRange(-2F, 2F, random); }).setSource(sphere); - sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); + sphere = new SDFDisplacement().setFunction((vec) -> { + return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; + }).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> { + return MHelper.randRange(-2F, 2F, random); + }).setSource(sphere); + sphere = new SDFSubtraction().setSourceA(sphere) + .setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); sphere.setReplaceFunction(REPLACE); sphere.addPostProcess((info) -> { if (info.getState().getBlock() instanceof LeavesBlock) { int distance = info.getPos().getManhattanDistance(pos); if (distance < 7) { return info.getState().with(LeavesBlock.DISTANCE, distance); - } - else { + } else { return AIR; } } @@ -64,9 +71,10 @@ public class BushWithOuterFeature extends DefaultFeature { }).addPostProcess((info) -> { if (info.getState().getBlock() instanceof LeavesBlock) { MHelper.shuffle(DIRECTIONS, random); - for (Direction dir: DIRECTIONS) { + for (Direction dir : DIRECTIONS) { if (info.getState(dir).isAir()) { - info.setBlockPos(info.getPos().offset(dir), outer_leaves.getDefaultState().with(Properties.FACING, dir)); + info.setBlockPos(info.getPos().offset(dir), + outer_leaves.defaultBlockState().with(Properties.FACING, dir)); } } } @@ -74,21 +82,20 @@ public class BushWithOuterFeature extends DefaultFeature { }); sphere.fillRecursive(world, pos); BlocksHelper.setWithoutUpdate(world, pos, stem); - for (Direction d: Direction.values()) { - BlockPos p = pos.offset(d); + for (Direction d : Direction.values()) { + BlockPos p = pos.relative(d); if (world.isAir(p)) { if (leaves instanceof LeavesBlock) { - BlocksHelper.setWithoutUpdate(world, p, leaves.getDefaultState().with(LeavesBlock.DISTANCE, 1)); - } - else { - BlocksHelper.setWithoutUpdate(world, p, leaves.getDefaultState()); + BlocksHelper.setWithoutUpdate(world, p, leaves.defaultBlockState().with(LeavesBlock.DISTANCE, 1)); + } else { + BlocksHelper.setWithoutUpdate(world, p, leaves.defaultBlockState()); } } } - + return true; } - + static { REPLACE = (state) -> { if (state.getMaterial().equals(Material.PLANT)) { diff --git a/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java b/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java index 09f5e5ff..cad1b8c7 100644 --- a/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java @@ -2,10 +2,10 @@ package ru.betterend.world.features.bushes; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -19,10 +19,12 @@ import ru.betterend.world.features.DefaultFeature; public class LargeAmaranitaFeature extends DefaultFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; - - Mutable mut = new Mutable().set(pos); + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + return false; + + MutableBlockPos mut = new MutableBlockPos().set(pos); int height = MHelper.randRange(2, 3, random); for (int i = 1; i < height; i++) { mut.setY(mut.getY() + 1); @@ -31,14 +33,16 @@ public class LargeAmaranitaFeature extends DefaultFeature { } } mut.set(pos); - - BlockState state = EndBlocks.LARGE_AMARANITA_MUSHROOM.getDefaultState(); + + BlockState state = EndBlocks.LARGE_AMARANITA_MUSHROOM.defaultBlockState(); BlocksHelper.setWithUpdate(world, mut, state.with(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); if (height > 2) { - BlocksHelper.setWithUpdate(world, mut.move(Direction.UP), state.with(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); + BlocksHelper.setWithUpdate(world, mut.move(Direction.UP), + state.with(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); } - BlocksHelper.setWithUpdate(world, mut.move(Direction.UP), state.with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); - + BlocksHelper.setWithUpdate(world, mut.move(Direction.UP), + state.with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); + return true; } } diff --git a/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java b/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java index 81bad45d..0dc33584 100644 --- a/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java +++ b/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java @@ -2,10 +2,10 @@ package ru.betterend.world.features.bushes; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -19,11 +19,13 @@ import ru.betterend.world.features.DefaultFeature; public class Lumecorn extends DefaultFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; - + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + return false; + int height = MHelper.randRange(4, 7, random); - Mutable mut = new Mutable().set(pos); + MutableBlockPos mut = new MutableBlockPos().set(pos); for (int i = 1; i < height; i++) { mut.move(Direction.UP); if (!world.isAir(mut)) { @@ -31,24 +33,30 @@ public class Lumecorn extends DefaultFeature { } } mut.set(pos); - BlockState topMiddle = EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.LIGHT_TOP_MIDDLE); - BlockState middle = EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.LIGHT_MIDDLE); - BlockState bottom = EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.LIGHT_BOTTOM); - BlockState top = EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.LIGHT_TOP); + BlockState topMiddle = EndBlocks.LUMECORN.defaultBlockState().with(LumecornBlock.SHAPE, + LumecornShape.LIGHT_TOP_MIDDLE); + BlockState middle = EndBlocks.LUMECORN.defaultBlockState().with(LumecornBlock.SHAPE, + LumecornShape.LIGHT_MIDDLE); + BlockState bottom = EndBlocks.LUMECORN.defaultBlockState().with(LumecornBlock.SHAPE, + LumecornShape.LIGHT_BOTTOM); + BlockState top = EndBlocks.LUMECORN.defaultBlockState().with(LumecornBlock.SHAPE, LumecornShape.LIGHT_TOP); if (height == 4) { - BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.BOTTOM_SMALL)); + BlocksHelper.setWithoutUpdate(world, mut, + EndBlocks.LUMECORN.defaultBlockState().with(LumecornBlock.SHAPE, LumecornShape.BOTTOM_SMALL)); BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), bottom); BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), topMiddle); BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), top); return true; } if (random.nextBoolean()) { - BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.BOTTOM_SMALL)); - } - else { - BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.BOTTOM_BIG)); - BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), EndBlocks.LUMECORN.getDefaultState().with(LumecornBlock.SHAPE, LumecornShape.MIDDLE)); - height --; + BlocksHelper.setWithoutUpdate(world, mut, + EndBlocks.LUMECORN.defaultBlockState().with(LumecornBlock.SHAPE, LumecornShape.BOTTOM_SMALL)); + } else { + BlocksHelper.setWithoutUpdate(world, mut, + EndBlocks.LUMECORN.defaultBlockState().with(LumecornBlock.SHAPE, LumecornShape.BOTTOM_BIG)); + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), + EndBlocks.LUMECORN.defaultBlockState().with(LumecornBlock.SHAPE, LumecornShape.MIDDLE)); + height--; } BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), bottom); for (int i = 4; i < height; i++) { diff --git a/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java index 3f31e6d9..210fce3c 100644 --- a/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java @@ -6,12 +6,12 @@ import java.util.function.Function; import com.google.common.collect.Lists; -import net.minecraft.block.BlockState; -import net.minecraft.block.LeavesBlock; -import net.minecraft.block.Material; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.material.Material; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -34,21 +34,29 @@ import ru.betterend.world.features.DefaultFeature; public class TenaneaBushFeature extends DefaultFeature { private static final Function REPLACE; private static final Direction[] DIRECTIONS = Direction.values(); - - public TenaneaBushFeature() {} - + + public TenaneaBushFeature() { + } + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; - + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + return false; + float radius = MHelper.randRange(1.8F, 3.5F, random); OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt()); - BlockState leaves = EndBlocks.TENANEA_LEAVES.getDefaultState(); + BlockState leaves = EndBlocks.TENANEA_LEAVES.defaultBlockState(); SDF sphere = new SDFSphere().setRadius(radius).setBlock(leaves); sphere = new SDFScale3D().setScale(1, 0.75F, 1).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; }).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return MHelper.randRange(-2F, 2F, random); }).setSource(sphere); - sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); + sphere = new SDFDisplacement().setFunction((vec) -> { + return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; + }).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> { + return MHelper.randRange(-2F, 2F, random); + }).setSource(sphere); + sphere = new SDFSubtraction().setSourceA(sphere) + .setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); sphere.setReplaceFunction(REPLACE); List support = Lists.newArrayList(); sphere.addPostProcess((info) -> { @@ -56,52 +64,54 @@ public class TenaneaBushFeature extends DefaultFeature { int distance = info.getPos().getManhattanDistance(pos); if (distance < 7) { if (random.nextInt(4) == 0 && info.getStateDown().isAir()) { - BlockPos d = info.getPos().down(); + BlockPos d = info.getPos().below(); support.add(d); } - + MHelper.shuffle(DIRECTIONS, random); - for (Direction d: DIRECTIONS) { + for (Direction d : DIRECTIONS) { if (info.getState(d).isAir()) { - info.setBlockPos(info.getPos().offset(d), EndBlocks.TENANEA_OUTER_LEAVES.getDefaultState().with(FurBlock.FACING, d)); + info.setBlockPos(info.getPos().offset(d), + EndBlocks.TENANEA_OUTER_LEAVES.defaultBlockState().with(FurBlock.FACING, d)); } } - + return info.getState().with(LeavesBlock.DISTANCE, distance); - } - else { + } else { return AIR; } } return info.getState(); }); sphere.fillRecursive(world, pos); - BlockState stem = EndBlocks.TENANEA.bark.getDefaultState(); + BlockState stem = EndBlocks.TENANEA.bark.defaultBlockState(); BlocksHelper.setWithoutUpdate(world, pos, stem); - for (Direction d: Direction.values()) { - BlockPos p = pos.offset(d); + for (Direction d : Direction.values()) { + BlockPos p = pos.relative(d); if (world.isAir(p)) { BlocksHelper.setWithoutUpdate(world, p, leaves.with(LeavesBlock.DISTANCE, 1)); } } - - Mutable mut = new Mutable(); - BlockState top = EndBlocks.TENANEA_FLOWERS.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP); - BlockState middle = EndBlocks.TENANEA_FLOWERS.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE); - BlockState bottom = EndBlocks.TENANEA_FLOWERS.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM); + + MutableBlockPos mut = new MutableBlockPos(); + BlockState top = EndBlocks.TENANEA_FLOWERS.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, + TripleShape.TOP); + BlockState middle = EndBlocks.TENANEA_FLOWERS.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, + TripleShape.MIDDLE); + BlockState bottom = EndBlocks.TENANEA_FLOWERS.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, + TripleShape.BOTTOM); support.forEach((bpos) -> { BlockState state = world.getBlockState(bpos); - if (state.isAir() || state.isOf(EndBlocks.TENANEA_OUTER_LEAVES)) { + if (state.isAir() || state.is(EndBlocks.TENANEA_OUTER_LEAVES)) { int count = MHelper.randRange(3, 8, random); mut.set(bpos); - if (world.getBlockState(mut.up()).isOf(EndBlocks.TENANEA_LEAVES)) { + if (world.getBlockState(mut.up()).is(EndBlocks.TENANEA_LEAVES)) { BlocksHelper.setWithoutUpdate(world, mut, top); for (int i = 1; i < count; i++) { mut.setY(mut.getY() - 1); - if (world.isAir(mut.down())) { + if (world.isAir(mut.below())) { BlocksHelper.setWithoutUpdate(world, mut, middle); - } - else { + } else { break; } } @@ -109,10 +119,10 @@ public class TenaneaBushFeature extends DefaultFeature { } } }); - + return true; } - + static { REPLACE = (state) -> { if (state.getMaterial().equals(Material.PLANT)) { diff --git a/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java b/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java index 687eaf61..e7f7b7ba 100644 --- a/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java @@ -2,9 +2,9 @@ package ru.betterend.world.features.terrain; import java.util.Random; -import net.minecraft.block.Material; +import net.minecraft.world.level.material.Material; import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -19,30 +19,30 @@ import ru.betterend.world.features.DefaultFeature; public class BigAuroraCrystalFeature extends DefaultFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { int maxY = pos.getY() + BlocksHelper.upRay(world, pos, 16); int minY = pos.getY() - BlocksHelper.downRay(world, pos, 16); - + if (maxY - minY < 10) { return false; } - + int y = MHelper.randRange(minY, maxY, random); pos = new BlockPos(pos.getX(), y, pos.getZ()); - + int height = MHelper.randRange(5, 25, random); - SDF prism = new SDFHexPrism().setHeight(height).setRadius(MHelper.randRange(1.7F, 3F, random)).setBlock(EndBlocks.AURORA_CRYSTAL); + SDF prism = new SDFHexPrism().setHeight(height).setRadius(MHelper.randRange(1.7F, 3F, random)) + .setBlock(EndBlocks.AURORA_CRYSTAL); Vector3f vec = MHelper.randomHorizontal(random); prism = new SDFRotation().setRotation(vec, random.nextFloat()).setSource(prism); prism.setReplaceFunction((bState) -> { - return bState.getMaterial().isReplaceable() - || bState.isIn(EndTags.GEN_TERRAIN) - || bState.getMaterial().equals(Material.PLANT) - || bState.getMaterial().equals(Material.LEAVES); + return bState.getMaterial().isReplaceable() || bState.isIn(EndTags.GEN_TERRAIN) + || bState.getMaterial().equals(Material.PLANT) || bState.getMaterial().equals(Material.LEAVES); }); prism.fillRecursive(world, pos); BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.AURORA_CRYSTAL); - + return true; } } diff --git a/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java index 8c6bbed3..97d3e3b6 100644 --- a/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java @@ -2,12 +2,12 @@ package ru.betterend.world.features.terrain; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.Material; import net.minecraft.fluid.FluidState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -19,46 +19,52 @@ import ru.betterend.util.MHelper; import ru.betterend.world.features.DefaultFeature; public class EndLakeFeature extends DefaultFeature { - private static final BlockState END_STONE = Blocks.END_STONE.getDefaultState(); + private static final BlockState END_STONE = Blocks.END_STONE.defaultBlockState(); private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(15152); - private static final Mutable POS = new Mutable(); - + private static final MutableBlockPos POS = new MutableBlockPos(); + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, DefaultFeatureConfig featureConfig) { + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, + DefaultFeatureConfig featureConfig) { double radius = MHelper.randRange(10.0, 20.0, random); double depth = radius * 0.5 * MHelper.randRange(0.8, 1.2, random); int dist = MHelper.floor(radius); int dist2 = MHelper.floor(radius * 1.5); int bott = MHelper.floor(depth); blockPos = getPosOnSurfaceWG(world, blockPos); - if (blockPos.getY() < 10) return false; - + if (blockPos.getY() < 10) + return false; + int waterLevel = blockPos.getY(); - + BlockPos pos = getPosOnSurfaceRaycast(world, blockPos.north(dist).up(10), 20); - if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; + if (Math.abs(blockPos.getY() - pos.getY()) > 5) + return false; waterLevel = MHelper.min(pos.getY(), waterLevel); - + pos = getPosOnSurfaceRaycast(world, blockPos.south(dist).up(10), 20); - if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; + if (Math.abs(blockPos.getY() - pos.getY()) > 5) + return false; waterLevel = MHelper.min(pos.getY(), waterLevel); - + pos = getPosOnSurfaceRaycast(world, blockPos.east(dist).up(10), 20); - if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; + if (Math.abs(blockPos.getY() - pos.getY()) > 5) + return false; waterLevel = MHelper.min(pos.getY(), waterLevel); - + pos = getPosOnSurfaceRaycast(world, blockPos.west(dist).up(10), 20); - if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; + if (Math.abs(blockPos.getY() - pos.getY()) > 5) + return false; waterLevel = MHelper.min(pos.getY(), waterLevel); BlockState state; - + int minX = blockPos.getX() - dist2; int maxX = blockPos.getX() + dist2; int minZ = blockPos.getZ() - dist2; int maxZ = blockPos.getZ() + dist2; int maskMinX = minX - 1; int maskMinZ = minZ - 1; - + boolean[][] mask = new boolean[maxX - minX + 3][maxZ - minZ + 3]; for (int x = minX; x <= maxX; x++) { POS.setX(x); @@ -84,7 +90,7 @@ public class EndLakeFeature extends DefaultFeature { } } } - + for (int x = minX; x <= maxX; x++) { POS.setX(x); int x2 = x - blockPos.getX(); @@ -104,7 +110,8 @@ public class EndLakeFeature extends DefaultFeature { size *= 0.8; add = 5; } - double r = (add * 1.8 + radius * (NOISE.eval(x * 0.2, y * 0.2, z * 0.2) * 0.25 + 0.75)) - 1.0 / size; + double r = (add * 1.8 + radius * (NOISE.eval(x * 0.2, y * 0.2, z * 0.2) * 0.25 + 0.75)) + - 1.0 / size; if (r > 0) { r *= r; if (x2 + z2 <= r) { @@ -112,26 +119,28 @@ public class EndLakeFeature extends DefaultFeature { if (state.isIn(EndTags.GEN_TERRAIN)) { BlocksHelper.setWithoutUpdate(world, POS, AIR); } - pos = POS.down(); + pos = POS.below(); if (world.getBlockState(pos).isIn(EndTags.GEN_TERRAIN)) { - state = world.getBiome(pos).getGenerationSettings().getSurfaceConfig().getTopMaterial(); + state = world.getBiome(pos).getGenerationSettings().getSurfaceConfig() + .getTopMaterial(); if (y > waterLevel + 1) BlocksHelper.setWithoutUpdate(world, pos, state); else if (y > waterLevel) - BlocksHelper.setWithoutUpdate(world, pos, random.nextBoolean() ? state : EndBlocks.ENDSTONE_DUST.getDefaultState()); + BlocksHelper.setWithoutUpdate(world, pos, random.nextBoolean() ? state + : EndBlocks.ENDSTONE_DUST.defaultBlockState()); else - BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.ENDSTONE_DUST.getDefaultState()); + BlocksHelper.setWithoutUpdate(world, pos, + EndBlocks.ENDSTONE_DUST.defaultBlockState()); } } - } - else { + } else { break; } } } } } - + double aspect = ((double) radius / (double) depth); for (int x = blockPos.getX() - dist; x <= blockPos.getX() + dist; x++) { @@ -160,12 +169,13 @@ public class EndLakeFeature extends DefaultFeature { state = canReplace(state) ? (y < waterLevel ? WATER : AIR) : state; BlocksHelper.setWithoutUpdate(world, POS, state); } - pos = POS.down(); + pos = POS.below(); if (world.getBlockState(pos).getBlock().isIn(EndTags.GEN_TERRAIN)) { - BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.ENDSTONE_DUST.getDefaultState()); + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.ENDSTONE_DUST.defaultBlockState()); } pos = POS.up(); - while (canReplace(state = world.getBlockState(pos)) && !state.isAir() && state.getFluidState().isEmpty()) { + while (canReplace(state = world.getBlockState(pos)) && !state.isAir() + && state.getFluidState().isEmpty()) { BlocksHelper.setWithoutUpdate(world, pos, pos.getY() < waterLevel ? WATER : AIR); pos = pos.up(); } @@ -174,30 +184,29 @@ public class EndLakeFeature extends DefaultFeature { else if (y < waterLevel && y2 + x2 + z2 <= rb) { if (world.isAir(POS.up())) { state = world.getBiome(POS).getGenerationSettings().getSurfaceConfig().getTopMaterial(); - BlocksHelper.setWithoutUpdate(world, POS, random.nextBoolean() ? state : EndBlocks.ENDSTONE_DUST.getDefaultState()); - BlocksHelper.setWithoutUpdate(world, POS.down(), END_STONE); + BlocksHelper.setWithoutUpdate(world, POS, + random.nextBoolean() ? state : EndBlocks.ENDSTONE_DUST.defaultBlockState()); + BlocksHelper.setWithoutUpdate(world, POS.below(), END_STONE); + } else { + BlocksHelper.setWithoutUpdate(world, POS, EndBlocks.ENDSTONE_DUST.defaultBlockState()); + BlocksHelper.setWithoutUpdate(world, POS.below(), END_STONE); } - else { - BlocksHelper.setWithoutUpdate(world, POS, EndBlocks.ENDSTONE_DUST.getDefaultState()); - BlocksHelper.setWithoutUpdate(world, POS.down(), END_STONE); - } - //} + // } } } } } } - - BlocksHelper.fixBlocks(world, new BlockPos(minX - 2, waterLevel - 2, minZ - 2), new BlockPos(maxX + 2, blockPos.getY() + 20, maxZ + 2)); - + + BlocksHelper.fixBlocks(world, new BlockPos(minX - 2, waterLevel - 2, minZ - 2), + new BlockPos(maxX + 2, blockPos.getY() + 20, maxZ + 2)); + return true; } - + private boolean canReplace(BlockState state) { - return state.getMaterial().isReplaceable() - || state.isIn(EndTags.GEN_TERRAIN) - || state.isOf(EndBlocks.ENDSTONE_DUST) - || state.getMaterial().equals(Material.PLANT) + return state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN) + || state.is(EndBlocks.ENDSTONE_DUST) || state.getMaterial().equals(Material.PLANT) || state.getMaterial().equals(Material.UNDERWATER_PLANT) || state.getMaterial().equals(Material.UNUSED_PLANT); } diff --git a/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java b/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java index a0cafa58..27402490 100644 --- a/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java @@ -2,11 +2,11 @@ package ru.betterend.world.features.terrain; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.Material; import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -23,15 +23,18 @@ import ru.betterend.world.features.DefaultFeature; public class FallenPillarFeature extends DefaultFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + pos = getPosOnSurface(world, + new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); if (!world.getBlockState(pos.down(5)).isIn(EndTags.GEN_TERRAIN)) { return false; } - + float height = MHelper.randRange(20F, 40F, random); float radius = MHelper.randRange(2F, 4F, random); - SDF pillar = new SDFCappedCone().setRadius1(radius).setRadius2(radius).setHeight(height * 0.5F).setBlock(Blocks.OBSIDIAN); + SDF pillar = new SDFCappedCone().setRadius1(radius).setRadius2(radius).setHeight(height * 0.5F) + .setBlock(Blocks.OBSIDIAN); pillar = new SDFTranslate().setTranslate(0, radius * 0.5F - 2, 0).setSource(pillar); OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); pillar = new SDFDisplacement().setFunction((vec) -> { @@ -40,17 +43,18 @@ public class FallenPillarFeature extends DefaultFeature { Vector3f vec = MHelper.randomHorizontal(random); float angle = (float) random.nextGaussian() * 0.05F + (float) Math.PI; pillar = new SDFRotation().setRotation(vec, angle).setSource(pillar); - - BlockState mossy = EndBlocks.MOSSY_OBSIDIAN.getDefaultState(); + + BlockState mossy = EndBlocks.MOSSY_OBSIDIAN.defaultBlockState(); pillar.addPostProcess((info) -> { if (info.getStateUp().isAir() && random.nextFloat() > 0.1F) { return mossy; } return info.getState(); }).setReplaceFunction((state) -> { - return state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN) || state.getMaterial().equals(Material.PLANT); + return state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN) + || state.getMaterial().equals(Material.PLANT); }).fillRecursive(world, pos); - + return true; } } diff --git a/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java index 390e5c09..dde3dc7c 100644 --- a/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java @@ -5,9 +5,9 @@ import java.util.Random; import com.google.common.collect.Lists; -import net.minecraft.block.Blocks; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -21,14 +21,16 @@ import ru.betterend.util.sdf.primitive.SDFSphere; public class FloatingSpireFeature extends SpireFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { int minY = getYOnSurface(world, pos.getX(), pos.getZ()); - int y = minY > 57 ? MHelper.floor(MHelper.randRange(minY, minY * 2, random) * 0.5F + 32) : MHelper.randRange(64, 192, random); + int y = minY > 57 ? MHelper.floor(MHelper.randRange(minY, minY * 2, random) * 0.5F + 32) + : MHelper.randRange(64, 192, random); pos = new BlockPos(pos.getX(), y, pos.getZ()); - + SDF sdf = new SDFSphere().setRadius(MHelper.randRange(2, 3, random)).setBlock(Blocks.END_STONE); int count = MHelper.randRange(3, 5, random); - + for (int i = 0; i < count; i++) { float rMin = (i * 1.3F) + 2.5F; sdf = addSegment(sdf, MHelper.randRange(rMin, rMin + 1.5F, random), random); @@ -37,10 +39,11 @@ public class FloatingSpireFeature extends SpireFeature { float rMin = (i * 1.3F) + 2.5F; sdf = addSegment(sdf, MHelper.randRange(rMin, rMin + 1.5F, random), random); } - + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); sdf = new SDFDisplacement().setFunction((vec) -> { - return (float) (Math.abs(noise.eval(vec.getX() * 0.1, vec.getY() * 0.1, vec.getZ() * 0.1)) * 3F + Math.abs(noise.eval(vec.getX() * 0.3, vec.getY() * 0.3 + 100, vec.getZ() * 0.3)) * 1.3F); + return (float) (Math.abs(noise.eval(vec.getX() * 0.1, vec.getY() * 0.1, vec.getZ() * 0.1)) * 3F + + Math.abs(noise.eval(vec.getX() * 0.3, vec.getY() * 0.3 + 100, vec.getZ() * 0.3)) * 1.3F); }).setSource(sdf); final BlockPos center = pos; List support = Lists.newArrayList(); @@ -50,20 +53,19 @@ public class FloatingSpireFeature extends SpireFeature { support.add(info.getPos().up()); } return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceConfig().getTopMaterial(); - } - else if (info.getState(Direction.UP, 3).isAir()) { + } else if (info.getState(Direction.UP, 3).isAir()) { return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceConfig().getUnderMaterial(); } return info.getState(); }); sdf.fillRecursive(world, center); - + support.forEach((bpos) -> { if (EndBiomes.getFromBiome(world.getBiome(bpos)) == EndBiomes.BLOSSOMING_SPIRES) { EndFeatures.TENANEA_BUSH.getFeature().generate(world, chunkGenerator, random, bpos, null); } }); - + return true; } } diff --git a/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java b/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java index 7334d517..04899d98 100644 --- a/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java @@ -3,15 +3,15 @@ package ru.betterend.world.features.terrain; import java.util.Random; import java.util.function.Function; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.HorizontalFacingBlock; -import net.minecraft.block.Material; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.HorizontalFacingBlock; +import net.minecraft.world.level.material.Material; import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.MathHelper; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.Mth; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -43,23 +43,24 @@ public class GeyserFeature extends DefaultFeature { protected static final Function REPLACE2; private static final Function IGNORE; private static final Direction[] HORIZONTAL = BlocksHelper.makeHorizontal(); - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { pos = getPosOnSurfaceWG(world, pos); - + if (pos.getY() < 10) { return false; } - - Mutable bpos = new Mutable().set(pos); + + MutableBlockPos bpos = new MutableBlockPos().set(pos); bpos.setY(bpos.getY() - 1); BlockState state = world.getBlockState(bpos); while (state.isIn(EndTags.GEN_TERRAIN) || !state.getFluidState().isEmpty() && bpos.getY() > 5) { bpos.setY(bpos.getY() - 1); state = world.getBlockState(bpos); } - + if (pos.getY() - bpos.getY() < 25) { return false; } @@ -67,18 +68,21 @@ public class GeyserFeature extends DefaultFeature { int halfHeight = MHelper.randRange(10, 20, random); float radius1 = halfHeight * 0.5F; float radius2 = halfHeight * 0.1F + 0.5F; - SDF sdf = new SDFCappedCone().setHeight(halfHeight).setRadius1(radius1).setRadius2(radius2).setBlock(EndBlocks.SULPHURIC_ROCK.stone); + SDF sdf = new SDFCappedCone().setHeight(halfHeight).setRadius1(radius1).setRadius2(radius2) + .setBlock(EndBlocks.SULPHURIC_ROCK.stone); sdf = new SDFTranslate().setTranslate(0, halfHeight - 3, 0).setSource(sdf); int count = halfHeight; for (int i = 0; i < count; i++) { int py = i << 1; float delta = (float) i / (float) (count - 1); - float radius = MathHelper.lerp(delta, radius1, radius2) * 1.3F; + float radius = Mth.lerp(delta, radius1, radius2) * 1.3F; - SDF bowl = new SDFCappedCone().setHeight(radius).setRadius1(0).setRadius2(radius).setBlock(EndBlocks.SULPHURIC_ROCK.stone); + SDF bowl = new SDFCappedCone().setHeight(radius).setRadius1(0).setRadius2(radius) + .setBlock(EndBlocks.SULPHURIC_ROCK.stone); - SDF brimstone = new SDFCappedCone().setHeight(radius).setRadius1(0).setRadius2(radius).setBlock(EndBlocks.BRIMSTONE); + SDF brimstone = new SDFCappedCone().setHeight(radius).setRadius1(0).setRadius2(radius) + .setBlock(EndBlocks.BRIMSTONE); brimstone = new SDFTranslate().setTranslate(0, 2F, 0).setSource(brimstone); bowl = new SDFSubtraction().setSourceA(bowl).setSourceB(brimstone); bowl = new SDFUnion().setSourceA(brimstone).setSourceB(bowl); @@ -156,7 +160,7 @@ public class GeyserFeature extends DefaultFeature { }).setSource(cave).setReplaceFunction(REPLACE1).fillRecursiveIgnore(world, pos, IGNORE); BlocksHelper.setWithoutUpdate(world, pos, WATER); - Mutable mut = new Mutable().set(pos); + MutableBlockPos mut = new MutableBlockPos().set(pos); count = getYOnSurface(world, pos.getX(), pos.getZ()) - pos.getY(); for (int i = 0; i < count; i++) { BlocksHelper.setWithoutUpdate(world, mut, WATER); @@ -167,7 +171,8 @@ public class GeyserFeature extends DefaultFeature { } for (int i = 0; i < 150; i++) { - mut.set(pos).move(MHelper.floor(random.nextGaussian() * 4 + 0.5), -halfHeight - 10, MHelper.floor(random.nextGaussian() * 4 + 0.5)); + mut.set(pos).move(MHelper.floor(random.nextGaussian() * 4 + 0.5), -halfHeight - 10, + MHelper.floor(random.nextGaussian() * 4 + 0.5)); float distRaw = MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ()); int dist = MHelper.floor(6 - distRaw) + random.nextInt(2); if (dist >= 0) { @@ -176,24 +181,26 @@ public class GeyserFeature extends DefaultFeature { mut.setY(mut.getY() - 1); state = world.getBlockState(mut); } - if (state.isIn(EndTags.GEN_TERRAIN) && !world.getBlockState(mut.up()).isOf(EndBlocks.HYDROTHERMAL_VENT)) { + if (state.isIn(EndTags.GEN_TERRAIN) && !world.getBlockState(mut.up()).is(EndBlocks.HYDROTHERMAL_VENT)) { for (int j = 0; j <= dist; j++) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.SULPHURIC_ROCK.stone); MHelper.shuffle(HORIZONTAL, random); for (Direction dir : HORIZONTAL) { BlockPos p = mut.offset(dir); - if (random.nextBoolean() && world.getBlockState(p).isOf(Blocks.WATER)) { - BlocksHelper.setWithoutUpdate(world, p, EndBlocks.TUBE_WORM.getDefaultState().with(HorizontalFacingBlock.FACING, dir)); + if (random.nextBoolean() && world.getBlockState(p).is(Blocks.WATER)) { + BlocksHelper.setWithoutUpdate(world, p, EndBlocks.TUBE_WORM.defaultBlockState() + .with(HorizontalFacingBlock.FACING, dir)); } } mut.setY(mut.getY() + 1); } - state = EndBlocks.HYDROTHERMAL_VENT.getDefaultState().with(HydrothermalVentBlock.ACTIVATED, distRaw < 2); + state = EndBlocks.HYDROTHERMAL_VENT.defaultBlockState().with(HydrothermalVentBlock.ACTIVATED, + distRaw < 2); BlocksHelper.setWithoutUpdate(world, mut, state); mut.setY(mut.getY() + 1); state = world.getBlockState(mut); - while (state.isOf(Blocks.WATER)) { - BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.VENT_BUBBLE_COLUMN.getDefaultState()); + while (state.is(Blocks.WATER)) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.VENT_BUBBLE_COLUMN.defaultBlockState()); mut.setY(mut.getY() + 1); state = world.getBlockState(mut); } @@ -202,12 +209,13 @@ public class GeyserFeature extends DefaultFeature { } for (int i = 0; i < 10; i++) { - mut.set(pos).move(MHelper.floor(random.nextGaussian() * 0.7 + 0.5), -halfHeight - 10, MHelper.floor(random.nextGaussian() * 0.7 + 0.5)); + mut.set(pos).move(MHelper.floor(random.nextGaussian() * 0.7 + 0.5), -halfHeight - 10, + MHelper.floor(random.nextGaussian() * 0.7 + 0.5)); float distRaw = MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ()); int dist = MHelper.floor(6 - distRaw) + random.nextInt(2); if (dist >= 0) { state = world.getBlockState(mut); - while (state.isOf(Blocks.WATER)) { + while (state.is(Blocks.WATER)) { mut.setY(mut.getY() - 1); state = world.getBlockState(mut); } @@ -216,12 +224,13 @@ public class GeyserFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.SULPHURIC_ROCK.stone); mut.setY(mut.getY() + 1); } - state = EndBlocks.HYDROTHERMAL_VENT.getDefaultState().with(HydrothermalVentBlock.ACTIVATED, distRaw < 2); + state = EndBlocks.HYDROTHERMAL_VENT.defaultBlockState().with(HydrothermalVentBlock.ACTIVATED, + distRaw < 2); BlocksHelper.setWithoutUpdate(world, mut, state); mut.setY(mut.getY() + 1); state = world.getBlockState(mut); - while (state.isOf(Blocks.WATER)) { - BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.VENT_BUBBLE_COLUMN.getDefaultState()); + while (state.is(Blocks.WATER)) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.VENT_BUBBLE_COLUMN.defaultBlockState()); mut.setY(mut.getY() + 1); state = world.getBlockState(mut); } @@ -232,20 +241,21 @@ public class GeyserFeature extends DefaultFeature { EndFeatures.SULPHURIC_LAKE.getFeature().generate(world, chunkGenerator, random, pos, null); double distance = radius1 * 1.7; - BlockPos start = pos.add(-distance, -halfHeight - 15 - distance, -distance); - BlockPos end = pos.add(distance, -halfHeight - 5 + distance, distance); + BlockPos start = pos.offset(-distance, -halfHeight - 15 - distance, -distance); + BlockPos end = pos.offset(distance, -halfHeight - 5 + distance, distance); BlocksHelper.fixBlocks(world, start, end); return true; } - + static { REPLACE1 = (state) -> { return state.isAir() || (state.isIn(EndTags.GEN_TERRAIN)); }; - + REPLACE2 = (state) -> { - if (state.isIn(EndTags.GEN_TERRAIN) || state.isOf(EndBlocks.HYDROTHERMAL_VENT) || state.isOf(EndBlocks.SULPHUR_CRYSTAL)) { + if (state.isIn(EndTags.GEN_TERRAIN) || state.is(EndBlocks.HYDROTHERMAL_VENT) + || state.is(EndBlocks.SULPHUR_CRYSTAL)) { return true; } if (state.getMaterial().equals(Material.PLANT)) { @@ -253,9 +263,10 @@ public class GeyserFeature extends DefaultFeature { } return state.getMaterial().isReplaceable(); }; - + IGNORE = (state) -> { - return state.isOf(Blocks.WATER) || state.isOf(Blocks.CAVE_AIR) || state.isOf(EndBlocks.SULPHURIC_ROCK.stone) || state.isOf(EndBlocks.BRIMSTONE); + return state.is(Blocks.WATER) || state.is(Blocks.CAVE_AIR) || state.is(EndBlocks.SULPHURIC_ROCK.stone) + || state.is(EndBlocks.BRIMSTONE); }; } } diff --git a/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java b/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java index b7bb5f52..52f6def7 100644 --- a/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java @@ -4,9 +4,9 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; -import net.minecraft.block.BlockState; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -24,64 +24,64 @@ public class IceStarFeature extends DefaultFeature { private final float maxSize; private final int minCount; private final int maxCount; - + public IceStarFeature(float minSize, float maxSize, int minCount, int maxCount) { this.minSize = minSize; this.maxSize = maxSize; this.minCount = minCount; this.maxCount = maxCount; } - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { float size = MHelper.randRange(minSize, maxSize, random); int count = MHelper.randRange(minCount, maxCount, random); List points = getFibonacciPoints(count); SDF sdf = null; - SDF spike = new SDFCappedCone().setRadius1(3 + (size - 5) * 0.2F).setRadius2(0).setHeight(size).setBlock(EndBlocks.DENSE_SNOW); + SDF spike = new SDFCappedCone().setRadius1(3 + (size - 5) * 0.2F).setRadius2(0).setHeight(size) + .setBlock(EndBlocks.DENSE_SNOW); spike = new SDFTranslate().setTranslate(0, size - 0.5F, 0).setSource(spike); - for (Vector3f point: points) { + for (Vector3f point : points) { SDF rotated = spike; point = MHelper.normalize(point); float angle = MHelper.angle(Vector3f.POSITIVE_Y, point); if (angle > 0.01F && angle < 3.14F) { Vector3f axis = MHelper.normalize(MHelper.cross(Vector3f.POSITIVE_Y, point)); rotated = new SDFRotation().setRotation(axis, angle).setSource(spike); - } - else if (angle > 1) { + } else if (angle > 1) { rotated = new SDFRotation().setRotation(Vector3f.POSITIVE_Y, (float) Math.PI).setSource(spike); } sdf = (sdf == null) ? rotated : new SDFUnion().setSourceA(sdf).setSourceB(rotated); } - + int x1 = (pos.getX() >> 4) << 4; int z1 = (pos.getZ() >> 4) << 4; pos = new BlockPos(x1 + random.nextInt(16), MHelper.randRange(32, 128, random), z1 + random.nextInt(16)); - + final float ancientRadius = size * 0.7F; final float denseRadius = size * 0.9F; final float iceRadius = size < 7 ? size * 5 : size * 1.3F; final float randScale = size * 0.3F; - + final BlockPos center = pos; - final BlockState ice = EndBlocks.EMERALD_ICE.getDefaultState(); - final BlockState dense = EndBlocks.DENSE_EMERALD_ICE.getDefaultState(); - final BlockState ancient = EndBlocks.ANCIENT_EMERALD_ICE.getDefaultState(); + final BlockState ice = EndBlocks.EMERALD_ICE.defaultBlockState(); + final BlockState dense = EndBlocks.DENSE_EMERALD_ICE.defaultBlockState(); + final BlockState ancient = EndBlocks.ANCIENT_EMERALD_ICE.defaultBlockState(); final SDF sdfCopy = sdf; - + sdf.addPostProcess((info) -> { BlockPos bpos = info.getPos(); float px = bpos.getX() - center.getX(); float py = bpos.getY() - center.getY(); float pz = bpos.getZ() - center.getZ(); - float distance = MHelper.length(px, py, pz) + sdfCopy.getDistance(px, py, pz) * 0.4F + random.nextFloat() * randScale; + float distance = MHelper.length(px, py, pz) + sdfCopy.getDistance(px, py, pz) * 0.4F + + random.nextFloat() * randScale; if (distance < ancientRadius) { return ancient; - } - else if (distance < denseRadius) { + } else if (distance < denseRadius) { return dense; - } - else if (distance < iceRadius) { + } else if (distance < iceRadius) { return ice; } return info.getState(); diff --git a/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java b/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java index 9d00ec71..0cc228d1 100644 --- a/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java @@ -2,10 +2,10 @@ package ru.betterend.world.features.terrain; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.Material; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -21,26 +21,29 @@ import ru.betterend.world.features.DefaultFeature; public class ObsidianBoulderFeature extends DefaultFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); - if (!world.getBlockState(pos.down()).isIn(EndTags.END_GROUND)) { + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + pos = getPosOnSurface(world, + new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); + if (!world.getBlockState(pos.below()).isIn(EndTags.END_GROUND)) { return false; } - + int count = MHelper.randRange(1, 5, random); for (int i = 0; i < count; i++) { - BlockPos p = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16) - 8, pos.getY(), pos.getZ() + random.nextInt(16) - 8)); + BlockPos p = getPosOnSurface(world, + new BlockPos(pos.getX() + random.nextInt(16) - 8, pos.getY(), pos.getZ() + random.nextInt(16) - 8)); makeBoulder(world, p, random); } - + return true; } - + private void makeBoulder(StructureWorldAccess world, BlockPos pos, Random random) { - if (!world.getBlockState(pos.down()).isIn(EndTags.END_GROUND)) { + if (!world.getBlockState(pos.below()).isIn(EndTags.END_GROUND)) { return; } - + float radius = MHelper.randRange(1F, 5F, random); SDF sphere = new SDFSphere().setRadius(radius).setBlock(Blocks.OBSIDIAN); float sx = MHelper.randRange(0.7F, 1.3F, random); @@ -51,15 +54,16 @@ public class ObsidianBoulderFeature extends DefaultFeature { sphere = new SDFDisplacement().setFunction((vec) -> { return (float) (noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 1.5F); }).setSource(sphere); - - BlockState mossy = EndBlocks.MOSSY_OBSIDIAN.getDefaultState(); + + BlockState mossy = EndBlocks.MOSSY_OBSIDIAN.defaultBlockState(); sphere.addPostProcess((info) -> { if (info.getStateUp().isAir() && random.nextFloat() > 0.1F) { return mossy; } return info.getState(); }).setReplaceFunction((state) -> { - return state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN) || state.getMaterial().equals(Material.PLANT); + return state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN) + || state.getMaterial().equals(Material.PLANT); }).fillRecursive(world, pos); } } diff --git a/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java b/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java index 00948443..75fc5f22 100644 --- a/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java @@ -2,11 +2,11 @@ package ru.betterend.world.features.terrain; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.Material; import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -25,15 +25,18 @@ import ru.betterend.world.features.DefaultFeature; public class ObsidianPillarBasementFeature extends DefaultFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + pos = getPosOnSurface(world, + new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); if (!world.getBlockState(pos.down(5)).isIn(EndTags.GEN_TERRAIN)) { return false; } - + float height = MHelper.randRange(10F, 35F, random); float radius = MHelper.randRange(2F, 5F, random); - SDF pillar = new SDFCappedCone().setRadius1(radius).setRadius2(radius).setHeight(height * 0.5F).setBlock(Blocks.OBSIDIAN); + SDF pillar = new SDFCappedCone().setRadius1(radius).setRadius2(radius).setHeight(height * 0.5F) + .setBlock(Blocks.OBSIDIAN); pillar = new SDFTranslate().setTranslate(0, height * 0.5F - 3, 0).setSource(pillar); SDF cut = new SDFFlatland().setBlock(Blocks.OBSIDIAN); OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); @@ -48,17 +51,18 @@ public class ObsidianPillarBasementFeature extends DefaultFeature { vec = MHelper.randomHorizontal(random); angle = random.nextFloat() * 0.2F; pillar = new SDFRotation().setRotation(vec, angle).setSource(pillar); - - BlockState mossy = EndBlocks.MOSSY_OBSIDIAN.getDefaultState(); + + BlockState mossy = EndBlocks.MOSSY_OBSIDIAN.defaultBlockState(); pillar.addPostProcess((info) -> { if (info.getStateUp().isAir() && random.nextFloat() > 0.1F) { return mossy; } return info.getState(); }).setReplaceFunction((state) -> { - return state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN) || state.getMaterial().equals(Material.PLANT); + return state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN) + || state.getMaterial().equals(Material.PLANT); }).fillRecursive(world, pos); - + return true; } } diff --git a/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java b/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java index d1d1b37f..36766726 100644 --- a/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java @@ -2,9 +2,9 @@ package ru.betterend.world.features.terrain; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -20,32 +20,33 @@ public class OreLayerFeature extends DefaultFeature { private static final SDFSphere SPHERE; private static final SDFCoordModify NOISE; private static final SDF FUNCTION; - + private final BlockState state; private final float radius; private final int minY; private final int maxY; private OpenSimplexNoise noise; - + public OreLayerFeature(BlockState state, float radius, int minY, int maxY) { this.state = state; this.radius = radius; this.minY = minY; this.maxY = maxY; } - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { float radius = this.radius * 0.5F; int r = MHelper.floor(radius + 1); int posX = MHelper.randRange(Math.max(r - 16, 0), Math.min(31 - r, 15), random) + pos.getX(); int posZ = MHelper.randRange(Math.max(r - 16, 0), Math.min(31 - r, 15), random) + pos.getZ(); int posY = MHelper.randRange(minY, maxY, random); - + if (noise == null) { noise = new OpenSimplexNoise(world.getSeed()); } - + SPHERE.setRadius(radius).setBlock(state); NOISE.setFunction((vec) -> { double x = (vec.getX() + pos.getX()) * 0.1; @@ -56,18 +57,18 @@ public class OreLayerFeature extends DefaultFeature { FUNCTION.fillRecursive(world, new BlockPos(posX, posY, posZ)); return true; } - + static { SPHERE = new SDFSphere(); NOISE = new SDFCoordModify(); - + SDF body = SPHERE; body = new SDFScale3D().setScale(1, 0.2F, 1).setSource(body); body = NOISE.setSource(body); body.setReplaceFunction((state) -> { - return state.isOf(Blocks.END_STONE); + return state.is(Blocks.END_STONE); }); - + FUNCTION = body; } } diff --git a/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java b/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java index fd9396ac..a13e5821 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java @@ -2,10 +2,10 @@ package ru.betterend.world.features.terrain; import java.util.Random; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -15,24 +15,25 @@ import ru.betterend.world.features.DefaultFeature; public class SingleBlockFeature extends DefaultFeature { private final Block block; - + public SingleBlockFeature(Block block) { this.block = block; } - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).isIn(EndTags.GEN_TERRAIN)) { + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + if (!world.getBlockState(pos.below()).isIn(EndTags.GEN_TERRAIN)) { return false; } - - BlockState state = block.getDefaultState(); + + BlockState state = block.defaultBlockState(); if (block.getStateManager().getProperty("waterlogged") != null) { boolean waterlogged = !world.getFluidState(pos).isEmpty(); state = state.with(Properties.WATERLOGGED, waterlogged); } BlocksHelper.setWithoutUpdate(world, pos, state); - + return true; } } diff --git a/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java b/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java index ef652d54..466bd242 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java @@ -2,10 +2,10 @@ package ru.betterend.world.features.terrain; import java.util.Random; -import net.minecraft.block.BlockState; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -17,25 +17,28 @@ import ru.betterend.world.features.DefaultFeature; public class SmaragdantCrystalFeature extends DefaultFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).isIn(EndTags.GEN_TERRAIN)) { + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + if (!world.getBlockState(pos.below()).isIn(EndTags.GEN_TERRAIN)) { return false; } - - Mutable mut = new Mutable(); + + MutableBlockPos mut = new MutableBlockPos(); int count = MHelper.randRange(15, 30, random); - BlockState crystal = EndBlocks.SMARAGDANT_CRYSTAL.getDefaultState(); - BlockState shard = EndBlocks.SMARAGDANT_CRYSTAL_SHARD.getDefaultState(); + BlockState crystal = EndBlocks.SMARAGDANT_CRYSTAL.defaultBlockState(); + BlockState shard = EndBlocks.SMARAGDANT_CRYSTAL_SHARD.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)); - int dist = MHelper.floor(1.5F - MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ())) + random.nextInt(3); + mut.set(pos).move(MHelper.floor(random.nextGaussian() * 2 + 0.5), 5, + MHelper.floor(random.nextGaussian() * 2 + 0.5)); + int dist = MHelper.floor(1.5F - MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ())) + + random.nextInt(3); if (dist > 0) { BlockState state = world.getBlockState(mut); for (int n = 0; n < 10 && state.isAir(); n++) { mut.setY(mut.getY() - 1); state = world.getBlockState(mut); } - if (state.isIn(EndTags.GEN_TERRAIN) && !world.getBlockState(mut.up()).isOf(crystal.getBlock())) { + if (state.isIn(EndTags.GEN_TERRAIN) && !world.getBlockState(mut.up()).is(crystal.getBlock())) { for (int j = 0; j <= dist; j++) { BlocksHelper.setWithoutUpdate(world, mut, crystal); mut.setY(mut.getY() + 1); @@ -45,7 +48,7 @@ public class SmaragdantCrystalFeature extends DefaultFeature { } } } - + return true; } } diff --git a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java index f0518d81..6f6824ab 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java @@ -6,12 +6,12 @@ import java.util.function.Function; import com.google.common.collect.Lists; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.LeavesBlock; -import net.minecraft.block.Material; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.material.Material; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -29,14 +29,16 @@ import ru.betterend.world.features.DefaultFeature; public class SpireFeature extends DefaultFeature { protected static final Function REPLACE; - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { pos = getPosOnSurfaceWG(world, pos); - if (pos.getY() < 10 || !world.getBlockState(pos.down(3)).isIn(EndTags.GEN_TERRAIN) || !world.getBlockState(pos.down(6)).isIn(EndTags.GEN_TERRAIN)) { + if (pos.getY() < 10 || !world.getBlockState(pos.down(3)).isIn(EndTags.GEN_TERRAIN) + || !world.getBlockState(pos.down(6)).isIn(EndTags.GEN_TERRAIN)) { return false; } - + SDF sdf = new SDFSphere().setRadius(MHelper.randRange(2, 3, random)).setBlock(Blocks.END_STONE); int count = MHelper.randRange(3, 7, random); for (int i = 0; i < count; i++) { @@ -45,7 +47,8 @@ public class SpireFeature extends DefaultFeature { } OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); sdf = new SDFDisplacement().setFunction((vec) -> { - return (float) (Math.abs(noise.eval(vec.getX() * 0.1, vec.getY() * 0.1, vec.getZ() * 0.1)) * 3F + Math.abs(noise.eval(vec.getX() * 0.3, vec.getY() * 0.3 + 100, vec.getZ() * 0.3)) * 1.3F); + return (float) (Math.abs(noise.eval(vec.getX() * 0.1, vec.getY() * 0.1, vec.getZ() * 0.1)) * 3F + + Math.abs(noise.eval(vec.getX() * 0.3, vec.getY() * 0.3 + 100, vec.getZ() * 0.3)) * 1.3F); }).setSource(sdf); final BlockPos center = pos; List support = Lists.newArrayList(); @@ -55,13 +58,12 @@ public class SpireFeature extends DefaultFeature { support.add(info.getPos().up()); } return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceConfig().getTopMaterial(); - } - else if (info.getState(Direction.UP, 3).isAir()) { + } else if (info.getState(Direction.UP, 3).isAir()) { return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceConfig().getUnderMaterial(); } return info.getState(); }).fillRecursive(world, center); - + support.forEach((bpos) -> { if (EndBiomes.getFromBiome(world.getBiome(bpos)) == EndBiomes.BLOSSOMING_SPIRES) { EndFeatures.TENANEA_BUSH.getFeature().generate(world, chunkGenerator, random, bpos, null); @@ -70,13 +72,14 @@ public class SpireFeature extends DefaultFeature { return true; } - + protected SDF addSegment(SDF sdf, float radius, Random random) { SDF sphere = new SDFSphere().setRadius(radius).setBlock(Blocks.END_STONE); - SDF offseted = new SDFTranslate().setTranslate(0, radius + random.nextFloat() * 0.25F * radius, 0).setSource(sdf); + SDF offseted = new SDFTranslate().setTranslate(0, radius + random.nextFloat() * 0.25F * radius, 0) + .setSource(sdf); return new SDFSmoothUnion().setRadius(radius * 0.5F).setSourceA(sphere).setSourceB(offseted); } - + static { REPLACE = (state) -> { if (state.isIn(EndTags.END_GROUND)) { diff --git a/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java b/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java index 0b1f708f..6c54c59c 100644 --- a/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java @@ -2,12 +2,12 @@ package ru.betterend.world.features.terrain; import java.util.Random; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.MathHelper; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.util.Mth; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -20,24 +20,25 @@ public class StalactiteFeature extends DefaultFeature { private final boolean ceiling; private final Block[] ground; private final Block block; - + public StalactiteFeature(boolean ceiling, Block block, Block... ground) { this.ceiling = ceiling; this.ground = ground; this.block = block; } - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!isGround(world.getBlockState(ceiling ? pos.up() : pos.down()).getBlock())) { + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + if (!isGround(world.getBlockState(ceiling ? pos.up() : pos.below()).getBlock())) { return false; } - - Mutable mut = new Mutable().set(pos); + + MutableBlockPos mut = new MutableBlockPos().set(pos); int height = random.nextInt(16); int dir = ceiling ? -1 : 1; boolean stalagnate = false; - + for (int i = 1; i <= height; i++) { mut.setY(pos.getY() + i * dir); BlockState state = world.getBlockState(mut); @@ -47,21 +48,23 @@ public class StalactiteFeature extends DefaultFeature { break; } } - + if (!stalagnate && height > 7) { height = random.nextInt(8); } - + float center = height * 0.5F; for (int i = 0; i < height; i++) { mut.setY(pos.getY() + i * dir); - int size = stalagnate ? MathHelper.clamp((int) (MathHelper.abs(i - center) + 1), 1, 7) : height - i - 1; + int size = stalagnate ? Mth.clamp((int) (Mth.abs(i - center) + 1), 1, 7) : height - i - 1; boolean waterlogged = !world.getFluidState(mut).isEmpty(); - BlockState base = block.getDefaultState().with(StalactiteBlock.SIZE, size).with(Properties.WATERLOGGED, waterlogged); - BlockState state = stalagnate ? base.with(StalactiteBlock.IS_FLOOR, dir > 0 ? i < center : i > center) : base.with(StalactiteBlock.IS_FLOOR, dir > 0); + BlockState base = block.defaultBlockState().with(StalactiteBlock.SIZE, size).with(Properties.WATERLOGGED, + waterlogged); + BlockState state = stalagnate ? base.with(StalactiteBlock.IS_FLOOR, dir > 0 ? i < center : i > center) + : base.with(StalactiteBlock.IS_FLOOR, dir > 0); BlocksHelper.setWithoutUpdate(world, mut, state); } - + return true; } diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java index 73728a0f..16ebab6f 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java @@ -2,11 +2,11 @@ package ru.betterend.world.features.terrain; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -19,12 +19,13 @@ import ru.betterend.world.features.DefaultFeature; public class SulphurHillFeature extends DefaultFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { pos = getPosOnSurfaceWG(world, pos); if (pos.getY() < 57 || pos.getY() > 70) { return false; } - + int count = MHelper.randRange(5, 13, random); OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); for (int i = 0; i < count; i++) { @@ -38,14 +39,14 @@ public class SulphurHillFeature extends DefaultFeature { } return true; } - + private void makeCircle(StructureWorldAccess world, BlockPos pos, OpenSimplexNoise noise, Random random) { int radius = MHelper.randRange(5, 9, random); int min = -radius - 3; int max = radius + 4; - Mutable mut = new Mutable(); - BlockState rock = EndBlocks.SULPHURIC_ROCK.stone.getDefaultState(); - BlockState brimstone = EndBlocks.BRIMSTONE.getDefaultState().with(BlockProperties.ACTIVE, true); + MutableBlockPos mut = new MutableBlockPos(); + BlockState rock = EndBlocks.SULPHURIC_ROCK.stone.defaultBlockState(); + BlockState brimstone = EndBlocks.BRIMSTONE.defaultBlockState().with(BlockProperties.ACTIVE, true); for (int x = min; x < max; x++) { int x2 = x * x; int px = pos.getX() + x; @@ -60,7 +61,7 @@ public class SulphurHillFeature extends DefaultFeature { int d = x2 + z2; mut.setY(pos.getY()); BlockState state = world.getBlockState(mut); - if (state.getMaterial().isReplaceable() || state.isOf(EndBlocks.HYDROTHERMAL_VENT)) { + if (state.getMaterial().isReplaceable() || state.is(EndBlocks.HYDROTHERMAL_VENT)) { if (d < r2 * r2) { BlocksHelper.setWithoutUpdate(world, mut, Blocks.WATER); mut.move(Direction.DOWN); @@ -76,8 +77,7 @@ public class SulphurHillFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, mut, rock); mut.move(Direction.DOWN); } - } - else if (d < r1 * r1) { + } else if (d < r1 * r1) { BlocksHelper.setWithoutUpdate(world, mut, brimstone); mut.move(Direction.DOWN); state = world.getBlockState(mut); diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java index 36686fb3..6fc09489 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java @@ -5,13 +5,13 @@ import java.util.Set; import com.google.common.collect.Sets; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.HorizontalFacingBlock; -import net.minecraft.block.Material; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.HorizontalFacingBlock; +import net.minecraft.world.level.material.Material; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.Heightmap; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; @@ -26,20 +26,21 @@ import ru.betterend.util.MHelper; import ru.betterend.world.features.DefaultFeature; public class SulphuricCaveFeature extends DefaultFeature { - private static final BlockState CAVE_AIR = Blocks.CAVE_AIR.getDefaultState(); - private static final BlockState WATER = Blocks.WATER.getDefaultState(); + private static final BlockState CAVE_AIR = Blocks.CAVE_AIR.defaultBlockState(); + private static final BlockState WATER = Blocks.WATER.defaultBlockState(); private static final Direction[] HORIZONTAL = BlocksHelper.makeHorizontal(); - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { int radius = MHelper.randRange(10, 30, random); - + int top = world.getTopY(Heightmap.Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); - Mutable bpos = new Mutable(); + MutableBlockPos bpos = new MutableBlockPos(); bpos.setX(pos.getX()); bpos.setZ(pos.getZ()); bpos.setY(top - 1); - + BlockState state = world.getBlockState(bpos); while (!state.isIn(EndTags.GEN_TERRAIN) && bpos.getY() > 5) { bpos.setY(bpos.getY() - 1); @@ -49,34 +50,34 @@ public class SulphuricCaveFeature extends DefaultFeature { return false; } top = (int) (bpos.getY() - (radius * 1.3F + 5)); - + while (state.isIn(EndTags.GEN_TERRAIN) || !state.getFluidState().isEmpty() && bpos.getY() > 5) { bpos.setY(bpos.getY() - 1); state = world.getBlockState(bpos); } int bottom = (int) (bpos.getY() + radius * 1.3F + 5); - + if (top <= bottom) { return false; } - - Mutable mut = new Mutable(); + + MutableBlockPos mut = new MutableBlockPos(); pos = new BlockPos(pos.getX(), MHelper.randRange(bottom, top, random), pos.getZ()); - + OpenSimplexNoise noise = new OpenSimplexNoise(MHelper.getSeed(534, pos.getX(), pos.getZ())); - + int x1 = pos.getX() - radius - 5; int z1 = pos.getZ() - radius - 5; int x2 = pos.getX() + radius + 5; int z2 = pos.getZ() + radius + 5; int y1 = MHelper.floor(pos.getY() - (radius + 5) / 1.6); int y2 = MHelper.floor(pos.getY() + (radius + 5) / 1.6); - + double hr = radius * 0.75; double nr = radius * 0.25; - + Set brimstone = Sets.newHashSet(); - BlockState rock = EndBlocks.SULPHURIC_ROCK.stone.getDefaultState(); + BlockState rock = EndBlocks.SULPHURIC_ROCK.stone.defaultBlockState(); int waterLevel = pos.getY() + MHelper.randRange(MHelper.floor(radius * 0.8), radius, random); for (int x = x1; x <= x2; x++) { int xsq = x - pos.getX(); @@ -99,15 +100,14 @@ public class SulphuricCaveFeature extends DefaultFeature { if (isReplaceable(state)) { BlocksHelper.setWithoutUpdate(world, mut, y < waterLevel ? WATER : CAVE_AIR); } - } - else if (dist < r2 * r2) { + } else if (dist < r2 * r2) { state = world.getBlockState(mut); - if (state.isIn(EndTags.GEN_TERRAIN) || state.isOf(Blocks.AIR)) { - double v = noise.eval(x * 0.1, y * 0.1, z * 0.1) + noise.eval(x * 0.03, y * 0.03, z * 0.03) * 0.5; + if (state.isIn(EndTags.GEN_TERRAIN) || state.is(Blocks.AIR)) { + double v = noise.eval(x * 0.1, y * 0.1, z * 0.1) + + noise.eval(x * 0.03, y * 0.03, z * 0.03) * 0.5; if (v > 0.4) { brimstone.add(mut.toImmutable()); - } - else { + } else { BlocksHelper.setWithoutUpdate(world, mut, rock); } } @@ -118,26 +118,30 @@ public class SulphuricCaveFeature extends DefaultFeature { brimstone.forEach((blockPos) -> { placeBrimstone(world, blockPos, random); }); - + if (random.nextInt(4) == 0) { int count = MHelper.randRange(5, 20, random); for (int i = 0; i < count; i++) { - mut.set(pos).move(MHelper.floor(random.nextGaussian() * 2 + 0.5), 0, MHelper.floor(random.nextGaussian() * 2 + 0.5)); - int dist = MHelper.floor(3 - MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ())) + random.nextInt(2); + mut.set(pos).move(MHelper.floor(random.nextGaussian() * 2 + 0.5), 0, + MHelper.floor(random.nextGaussian() * 2 + 0.5)); + int dist = MHelper.floor(3 - MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ())) + + random.nextInt(2); if (dist > 0) { state = world.getBlockState(mut); while (!state.getFluidState().isEmpty() || state.getMaterial().equals(Material.UNDERWATER_PLANT)) { mut.setY(mut.getY() - 1); state = world.getBlockState(mut); } - if (state.isIn(EndTags.GEN_TERRAIN) && !world.getBlockState(mut.up()).isOf(EndBlocks.HYDROTHERMAL_VENT)) { + if (state.isIn(EndTags.GEN_TERRAIN) + && !world.getBlockState(mut.up()).is(EndBlocks.HYDROTHERMAL_VENT)) { for (int j = 0; j <= dist; j++) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.SULPHURIC_ROCK.stone); MHelper.shuffle(HORIZONTAL, random); - for (Direction dir: HORIZONTAL) { + for (Direction dir : HORIZONTAL) { BlockPos p = mut.offset(dir); - if (random.nextBoolean() && world.getBlockState(p).isOf(Blocks.WATER)) { - BlocksHelper.setWithoutUpdate(world, p, EndBlocks.TUBE_WORM.getDefaultState().with(HorizontalFacingBlock.FACING, dir)); + if (random.nextBoolean() && world.getBlockState(p).is(Blocks.WATER)) { + BlocksHelper.setWithoutUpdate(world, p, EndBlocks.TUBE_WORM.defaultBlockState() + .with(HorizontalFacingBlock.FACING, dir)); } } mut.setY(mut.getY() + 1); @@ -145,9 +149,10 @@ public class SulphuricCaveFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.HYDROTHERMAL_VENT); mut.setY(mut.getY() + 1); state = world.getBlockState(mut); - while (state.isOf(Blocks.WATER)) { - BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.VENT_BUBBLE_COLUMN.getDefaultState()); - world.getBlockTickScheduler().schedule(mut, EndBlocks.VENT_BUBBLE_COLUMN, MHelper.randRange(8, 32, random)); + while (state.is(Blocks.WATER)) { + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.VENT_BUBBLE_COLUMN.defaultBlockState()); + world.getBlockTickScheduler().schedule(mut, EndBlocks.VENT_BUBBLE_COLUMN, + MHelper.randRange(8, 32, random)); mut.setY(mut.getY() + 1); state = world.getBlockState(mut); } @@ -155,47 +160,42 @@ public class SulphuricCaveFeature extends DefaultFeature { } } } - + BlocksHelper.fixBlocks(world, new BlockPos(x1, y1, z1), new BlockPos(x2, y2, z2)); - + return true; } - + private boolean isReplaceable(BlockState state) { - return state.isIn(EndTags.GEN_TERRAIN) - || state.isOf(EndBlocks.HYDROTHERMAL_VENT) - || state.isOf(EndBlocks.VENT_BUBBLE_COLUMN) - || state.isOf(EndBlocks.SULPHUR_CRYSTAL) - || state.getMaterial().isReplaceable() - || state.getMaterial().equals(Material.PLANT) - || state.getMaterial().equals(Material.UNDERWATER_PLANT) - || state.getMaterial().equals(Material.LEAVES); + return state.isIn(EndTags.GEN_TERRAIN) || state.is(EndBlocks.HYDROTHERMAL_VENT) + || state.is(EndBlocks.VENT_BUBBLE_COLUMN) || state.is(EndBlocks.SULPHUR_CRYSTAL) + || state.getMaterial().isReplaceable() || state.getMaterial().equals(Material.PLANT) + || state.getMaterial().equals(Material.UNDERWATER_PLANT) || state.getMaterial().equals(Material.LEAVES); } - + private void placeBrimstone(StructureWorldAccess world, BlockPos pos, Random random) { BlockState state = getBrimstone(world, pos); BlocksHelper.setWithoutUpdate(world, pos, state); - if (state.get(BlockProperties.ACTIVE)) { + if (state.getValue(BlockProperties.ACTIVE)) { makeShards(world, pos, random); } } - + private BlockState getBrimstone(StructureWorldAccess world, BlockPos pos) { - for (Direction dir: BlocksHelper.DIRECTIONS) { - if (world.getBlockState(pos.offset(dir)).isOf(Blocks.WATER)) { - return EndBlocks.BRIMSTONE.getDefaultState().with(BlockProperties.ACTIVE, true); + for (Direction dir : BlocksHelper.DIRECTIONS) { + if (world.getBlockState(pos.relative(dir)).is(Blocks.WATER)) { + return EndBlocks.BRIMSTONE.defaultBlockState().with(BlockProperties.ACTIVE, true); } } - return EndBlocks.BRIMSTONE.getDefaultState(); + return EndBlocks.BRIMSTONE.defaultBlockState(); } - + private void makeShards(StructureWorldAccess world, BlockPos pos, Random random) { - for (Direction dir: BlocksHelper.DIRECTIONS) { + for (Direction dir : BlocksHelper.DIRECTIONS) { BlockPos side; - if (random.nextInt(16) == 0 && world.getBlockState((side = pos.offset(dir))).isOf(Blocks.WATER)) { - BlockState state = EndBlocks.SULPHUR_CRYSTAL.getDefaultState() - .with(SulphurCrystalBlock.WATERLOGGED, true) - .with(SulphurCrystalBlock.FACING, dir) + if (random.nextInt(16) == 0 && world.getBlockState((side = pos.relative(dir))).is(Blocks.WATER)) { + BlockState state = EndBlocks.SULPHUR_CRYSTAL.defaultBlockState() + .with(SulphurCrystalBlock.WATERLOGGED, true).with(SulphurCrystalBlock.FACING, dir) .with(SulphurCrystalBlock.AGE, random.nextInt(3)); BlocksHelper.setWithoutUpdate(world, side, state); } diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java index bd388e81..9428fe66 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java @@ -5,12 +5,12 @@ import java.util.Set; import com.google.common.collect.Sets; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; import net.minecraft.fluid.Fluids; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -25,24 +25,25 @@ import ru.betterend.world.features.DefaultFeature; public class SulphuricLakeFeature extends DefaultFeature { private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(15152); - private static final Mutable POS = new Mutable(); - + private static final MutableBlockPos POS = new MutableBlockPos(); + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, DefaultFeatureConfig featureConfig) { + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, + DefaultFeatureConfig featureConfig) { blockPos = getPosOnSurfaceWG(world, blockPos); - + if (blockPos.getY() < 57) { return false; } - + double radius = MHelper.randRange(10.0, 20.0, random); int dist2 = MHelper.floor(radius * 1.5); - + int minX = blockPos.getX() - dist2; int maxX = blockPos.getX() + dist2; int minZ = blockPos.getZ() - dist2; int maxZ = blockPos.getZ() + dist2; - + Set brimstone = Sets.newHashSet(); for (int x = minX; x <= maxX; x++) { POS.setX(x); @@ -64,36 +65,33 @@ public class SulphuricLakeFeature extends DefaultFeature { if (random.nextInt(8) > 0) { brimstone.add(POS.toImmutable()); if (random.nextBoolean()) { - brimstone.add(POS.down()); + brimstone.add(POS.below()); if (random.nextBoolean()) { brimstone.add(POS.down(2)); } } - } - else { + } else { if (!isAbsoluteBorder(world, POS)) { BlocksHelper.setWithoutUpdate(world, POS, Blocks.WATER); world.getFluidTickScheduler().schedule(POS, Fluids.WATER, 0); - brimstone.add(POS.down()); + brimstone.add(POS.below()); if (random.nextBoolean()) { brimstone.add(POS.down(2)); if (random.nextBoolean()) { brimstone.add(POS.down(3)); } } - } - else { + } else { brimstone.add(POS.toImmutable()); if (random.nextBoolean()) { - brimstone.add(POS.down()); + brimstone.add(POS.below()); } } } - } - else { + } else { BlocksHelper.setWithoutUpdate(world, POS, Blocks.WATER); brimstone.remove(POS); - for (Direction dir: BlocksHelper.HORIZONTAL) { + for (Direction dir : BlocksHelper.HORIZONTAL) { BlockPos offseted = POS.offset(dir); if (world.getBlockState(offseted).isIn(EndTags.GEN_TERRAIN)) { brimstone.add(offseted); @@ -102,14 +100,14 @@ public class SulphuricLakeFeature extends DefaultFeature { if (isDeepWater(world, POS)) { BlocksHelper.setWithoutUpdate(world, POS.move(Direction.DOWN), Blocks.WATER); brimstone.remove(POS); - for (Direction dir: BlocksHelper.HORIZONTAL) { + for (Direction dir : BlocksHelper.HORIZONTAL) { BlockPos offseted = POS.offset(dir); if (world.getBlockState(offseted).isIn(EndTags.GEN_TERRAIN)) { brimstone.add(offseted); } } } - brimstone.add(POS.down()); + brimstone.add(POS.below()); if (random.nextBoolean()) { brimstone.add(POS.down(2)); if (random.nextBoolean()) { @@ -118,13 +116,12 @@ public class SulphuricLakeFeature extends DefaultFeature { } } } - } - else if (dist < r2) { + } else if (dist < r2) { POS.setY(getYOnSurface(world, x, z) - 1); if (world.getBlockState(POS).isIn(EndTags.GEN_TERRAIN)) { brimstone.add(POS.toImmutable()); if (random.nextBoolean()) { - brimstone.add(POS.down()); + brimstone.add(POS.below()); if (random.nextBoolean()) { brimstone.add(POS.down(2)); } @@ -133,37 +130,37 @@ public class SulphuricLakeFeature extends DefaultFeature { } } } - + brimstone.forEach((bpos) -> { placeBrimstone(world, bpos, random); }); - + return true; } - + private boolean isBorder(StructureWorldAccess world, BlockPos pos) { int y = pos.getY() + 1; - for (Direction dir: BlocksHelper.DIRECTIONS) { + for (Direction dir : BlocksHelper.DIRECTIONS) { if (getYOnSurface(world, pos.getX() + dir.getOffsetX(), pos.getZ() + dir.getOffsetZ()) < y) { return true; } } return false; } - + private boolean isAbsoluteBorder(StructureWorldAccess world, BlockPos pos) { int y = pos.getY() - 2; - for (Direction dir: BlocksHelper.DIRECTIONS) { + for (Direction dir : BlocksHelper.DIRECTIONS) { if (getYOnSurface(world, pos.getX() + dir.getOffsetX() * 3, pos.getZ() + dir.getOffsetZ() * 3) < y) { return true; } } return false; } - + private boolean isDeepWater(StructureWorldAccess world, BlockPos pos) { int y = pos.getY() + 1; - for (Direction dir: BlocksHelper.DIRECTIONS) { + for (Direction dir : BlocksHelper.DIRECTIONS) { if (getYOnSurface(world, pos.getX() + dir.getOffsetX(), pos.getZ() + dir.getOffsetZ()) < y || getYOnSurface(world, pos.getX() + dir.getOffsetX() * 2, pos.getZ() + dir.getOffsetZ() * 2) < y || getYOnSurface(world, pos.getX() + dir.getOffsetX() * 3, pos.getZ() + dir.getOffsetZ() * 3) < y) { @@ -172,31 +169,30 @@ public class SulphuricLakeFeature extends DefaultFeature { } return true; } - + private void placeBrimstone(StructureWorldAccess world, BlockPos pos, Random random) { BlockState state = getBrimstone(world, pos); BlocksHelper.setWithoutUpdate(world, pos, state); - if (state.get(BlockProperties.ACTIVE)) { + if (state.getValue(BlockProperties.ACTIVE)) { makeShards(world, pos, random); } } - + private BlockState getBrimstone(StructureWorldAccess world, BlockPos pos) { - for (Direction dir: BlocksHelper.DIRECTIONS) { - if (world.getBlockState(pos.offset(dir)).isOf(Blocks.WATER)) { - return EndBlocks.BRIMSTONE.getDefaultState().with(BlockProperties.ACTIVE, true); + for (Direction dir : BlocksHelper.DIRECTIONS) { + if (world.getBlockState(pos.relative(dir)).is(Blocks.WATER)) { + return EndBlocks.BRIMSTONE.defaultBlockState().with(BlockProperties.ACTIVE, true); } } - return EndBlocks.BRIMSTONE.getDefaultState(); + return EndBlocks.BRIMSTONE.defaultBlockState(); } - + private void makeShards(StructureWorldAccess world, BlockPos pos, Random random) { - for (Direction dir: BlocksHelper.DIRECTIONS) { + for (Direction dir : BlocksHelper.DIRECTIONS) { BlockPos side; - if (random.nextInt(16) == 0 && world.getBlockState((side = pos.offset(dir))).isOf(Blocks.WATER)) { - BlockState state = EndBlocks.SULPHUR_CRYSTAL.getDefaultState() - .with(SulphurCrystalBlock.WATERLOGGED, true) - .with(SulphurCrystalBlock.FACING, dir) + if (random.nextInt(16) == 0 && world.getBlockState((side = pos.relative(dir))).is(Blocks.WATER)) { + BlockState state = EndBlocks.SULPHUR_CRYSTAL.defaultBlockState() + .with(SulphurCrystalBlock.WATERLOGGED, true).with(SulphurCrystalBlock.FACING, dir) .with(SulphurCrystalBlock.AGE, random.nextInt(3)); BlocksHelper.setWithoutUpdate(world, side, state); } diff --git a/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java b/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java index ab53b52f..92148073 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java @@ -2,9 +2,9 @@ package ru.betterend.world.features.terrain; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -17,25 +17,30 @@ import ru.betterend.world.features.DefaultFeature; public class SurfaceVentFeature extends DefaultFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + pos = getPosOnSurface(world, + new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); if (!world.getBlockState(pos.down(3)).isIn(EndTags.GEN_TERRAIN)) { return false; } - - Mutable mut = new Mutable(); + + MutableBlockPos mut = new MutableBlockPos(); int count = MHelper.randRange(15, 30, random); - BlockState vent = EndBlocks.HYDROTHERMAL_VENT.getDefaultState().with(HydrothermalVentBlock.WATERLOGGED, false); + BlockState vent = EndBlocks.HYDROTHERMAL_VENT.defaultBlockState().with(HydrothermalVentBlock.WATERLOGGED, + false); 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)); - int dist = MHelper.floor(2 - MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ())) + random.nextInt(2); + mut.set(pos).move(MHelper.floor(random.nextGaussian() * 2 + 0.5), 5, + MHelper.floor(random.nextGaussian() * 2 + 0.5)); + int dist = MHelper.floor(2 - MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ())) + + random.nextInt(2); if (dist > 0) { BlockState state = world.getBlockState(mut); for (int n = 0; n < 10 && state.isAir(); n++) { mut.setY(mut.getY() - 1); state = world.getBlockState(mut); } - if (state.isIn(EndTags.GEN_TERRAIN) && !world.getBlockState(mut.up()).isOf(EndBlocks.HYDROTHERMAL_VENT)) { + if (state.isIn(EndTags.GEN_TERRAIN) && !world.getBlockState(mut.up()).is(EndBlocks.HYDROTHERMAL_VENT)) { for (int j = 0; j <= dist; j++) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.SULPHURIC_ROCK.stone); mut.setY(mut.getY() + 1); @@ -44,7 +49,7 @@ public class SurfaceVentFeature extends DefaultFeature { } } } - + return true; } } diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java index cbd1f55a..261828c0 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java @@ -6,10 +6,10 @@ import java.util.function.Supplier; import com.google.common.collect.Sets; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.gen.chunk.ChunkGenerator; @@ -22,19 +22,20 @@ import ru.betterend.world.features.DefaultFeature; public class CaveChunkPopulatorFeature extends DefaultFeature { private Supplier supplier; - + public CaveChunkPopulatorFeature(Supplier biome) { this.supplier = biome; } - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { Set floorPositions = Sets.newHashSet(); Set ceilPositions = Sets.newHashSet(); int sx = (pos.getX() >> 4) << 4; int sz = (pos.getZ() >> 4) << 4; - Mutable min = new Mutable().set(pos); - Mutable max = new Mutable().set(pos); + MutableBlockPos min = new MutableBlockPos().set(pos); + MutableBlockPos max = new MutableBlockPos().set(pos); fillSets(sx, sz, world.getChunk(pos), floorPositions, ceilPositions, min, max); EndCaveBiome biome = supplier.get(); BlockState surfaceBlock = biome.getBiome().getGenerationSettings().getSurfaceConfig().getTopMaterial(); @@ -43,11 +44,12 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { BlocksHelper.fixBlocks(world, min, max); return true; } - - protected void fillSets(int sx, int sz, Chunk chunk, Set floorPositions, Set ceilPositions, Mutable min, Mutable max) { - Mutable mut = new Mutable(); - Mutable mut2 = new Mutable(); - Mutable mut3 = new Mutable(); + + protected void fillSets(int sx, int sz, Chunk chunk, Set floorPositions, Set ceilPositions, + MutableBlockPos min, MutableBlockPos max) { + MutableBlockPos mut = new MutableBlockPos(); + MutableBlockPos mut2 = new MutableBlockPos(); + MutableBlockPos mut3 = new MutableBlockPos(); for (int x = 0; x < 16; x++) { mut.setX(x); mut2.setX(x); @@ -59,13 +61,12 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { mut.setY(y); BlockState top = chunk.getBlockState(mut); BlockState bottom = chunk.getBlockState(mut2); - if (top.isAir() && (bottom.isIn(EndTags.GEN_TERRAIN) || bottom.isOf(Blocks.STONE))) { + if (top.isAir() && (bottom.isIn(EndTags.GEN_TERRAIN) || bottom.is(Blocks.STONE))) { mut3.set(mut2).move(sx, 0, sz); floorPositions.add(mut3.toImmutable()); updateMin(mut3, min); updateMax(mut3, max); - } - else if (bottom.isAir() && (top.isIn(EndTags.GEN_TERRAIN)|| top.isOf(Blocks.STONE))) { + } else if (bottom.isAir() && (top.isIn(EndTags.GEN_TERRAIN) || top.is(Blocks.STONE))) { mut3.set(mut).move(sx, 0, sz); ceilPositions.add(mut3.toImmutable()); updateMin(mut3, min); @@ -76,8 +77,8 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { } } } - - private void updateMin(BlockPos pos, Mutable min) { + + private void updateMin(BlockPos pos, MutableBlockPos min) { if (pos.getX() < min.getX()) { min.setX(pos.getX()); } @@ -88,8 +89,8 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { min.setZ(pos.getZ()); } } - - private void updateMax(BlockPos pos, Mutable max) { + + private void updateMax(BlockPos pos, MutableBlockPos max) { if (pos.getX() > max.getX()) { max.setX(pos.getX()); } @@ -100,8 +101,9 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { max.setZ(pos.getZ()); } } - - protected void placeFloor(StructureWorldAccess world, EndCaveBiome biome, Set floorPositions, Random random, BlockState surfaceBlock) { + + protected void placeFloor(StructureWorldAccess world, EndCaveBiome biome, Set floorPositions, + Random random, BlockState surfaceBlock) { float density = biome.getFloorDensity(); floorPositions.forEach((pos) -> { BlocksHelper.setWithoutUpdate(world, pos, surfaceBlock); @@ -113,8 +115,9 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { } }); } - - protected void placeCeil(StructureWorldAccess world, EndCaveBiome biome, Set ceilPositions, Random random) { + + protected void placeCeil(StructureWorldAccess world, EndCaveBiome biome, Set ceilPositions, + Random random) { float density = biome.getCeilDensity(); ceilPositions.forEach((pos) -> { BlockState ceilBlock = biome.getCeil(pos); @@ -124,7 +127,7 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { if (density > 0 && random.nextFloat() <= density) { Feature feature = biome.getCeilFeature(random); if (feature != null) { - feature.generate(world, null, random, pos.down(), null); + feature.generate(world, null, random, pos.below(), null); } } }); 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 ad2b088a..5faf8e26 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 @@ -5,11 +5,11 @@ import java.util.Set; import com.google.common.collect.Sets; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.Heightmap; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.biome.Biome; @@ -27,27 +27,29 @@ import ru.betterend.world.features.DefaultFeature; import ru.betterend.world.generator.GeneratorOptions; public abstract class EndCaveFeature extends DefaultFeature { - protected static final BlockState CAVE_AIR = Blocks.CAVE_AIR.getDefaultState(); - protected static final BlockState END_STONE = Blocks.END_STONE.getDefaultState(); - protected static final BlockState WATER = Blocks.WATER.getDefaultState(); - + protected static final BlockState CAVE_AIR = Blocks.CAVE_AIR.defaultBlockState(); + protected static final BlockState END_STONE = Blocks.END_STONE.defaultBlockState(); + protected static final BlockState WATER = Blocks.WATER.defaultBlockState(); + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!(GeneratorOptions.useNewGenerator() && GeneratorOptions.noRingVoid()) || pos.getX() * pos.getX() + pos.getZ() * pos.getZ() <= 22500) { + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + if (!(GeneratorOptions.useNewGenerator() && GeneratorOptions.noRingVoid()) + || pos.getX() * pos.getX() + pos.getZ() * pos.getZ() <= 22500) { return false; } - + if (biomeMissingCaves(world, pos)) { return false; } - + int radius = MHelper.randRange(10, 30, random); BlockPos center = findPos(world, pos, radius, random); - + if (center == null) { return false; } - + EndCaveBiome biome = EndBiomes.getCaveBiome(random); Set caveBlocks = generate(world, center, radius, random); if (!caveBlocks.isEmpty()) { @@ -55,7 +57,7 @@ public abstract class EndCaveFeature extends DefaultFeature { setBiomes(world, biome, caveBlocks); Set floorPositions = Sets.newHashSet(); Set ceilPositions = Sets.newHashSet(); - Mutable mut = new Mutable(); + MutableBlockPos mut = new MutableBlockPos(); caveBlocks.forEach((bpos) -> { mut.set(bpos); if (world.getBlockState(mut).getMaterial().isReplaceable()) { @@ -75,13 +77,14 @@ public abstract class EndCaveFeature extends DefaultFeature { } fixBlocks(world, caveBlocks); } - + return true; } - + protected abstract Set generate(StructureWorldAccess world, BlockPos center, int radius, Random random); - - protected void placeFloor(StructureWorldAccess world, EndCaveBiome biome, Set floorPositions, Random random, BlockState surfaceBlock) { + + protected void placeFloor(StructureWorldAccess world, EndCaveBiome biome, Set floorPositions, + Random random, BlockState surfaceBlock) { float density = biome.getFloorDensity(); floorPositions.forEach((pos) -> { BlocksHelper.setWithoutUpdate(world, pos, surfaceBlock); @@ -93,8 +96,9 @@ public abstract class EndCaveFeature extends DefaultFeature { } }); } - - protected void placeCeil(StructureWorldAccess world, EndCaveBiome biome, Set ceilPositions, Random random) { + + protected void placeCeil(StructureWorldAccess world, EndCaveBiome biome, Set ceilPositions, + Random random) { float density = biome.getCeilDensity(); ceilPositions.forEach((pos) -> { BlockState ceilBlock = biome.getCeil(pos); @@ -104,30 +108,30 @@ public abstract class EndCaveFeature extends DefaultFeature { if (density > 0 && random.nextFloat() <= density) { Feature feature = biome.getCeilFeature(random); if (feature != null) { - feature.generate(world, null, random, pos.down(), null); + feature.generate(world, null, random, pos.below(), null); } } }); } - + protected void setBiomes(StructureWorldAccess world, EndCaveBiome biome, Set blocks) { blocks.forEach((pos) -> setBiome(world, pos, biome)); } - + private void setBiome(StructureWorldAccess world, BlockPos pos, EndCaveBiome biome) { IBiomeArray array = (IBiomeArray) world.getChunk(pos).getBiomeArray(); if (array != null) { array.setBiome(biome.getActualBiome(), pos); } } - + private BlockPos findPos(StructureWorldAccess world, BlockPos pos, int radius, Random random) { int top = world.getTopY(Heightmap.Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); - Mutable bpos = new Mutable(); + MutableBlockPos bpos = new MutableBlockPos(); bpos.setX(pos.getX()); bpos.setZ(pos.getZ()); bpos.setY(top - 1); - + BlockState state = world.getBlockState(bpos); while (!state.isIn(EndTags.GEN_TERRAIN) && bpos.getY() > 5) { bpos.setY(bpos.getY() - 1); @@ -137,24 +141,24 @@ public abstract class EndCaveFeature extends DefaultFeature { return null; } top = (int) (bpos.getY() - (radius * 1.3F + 5)); - + while (state.isIn(EndTags.GEN_TERRAIN) || !state.getFluidState().isEmpty() && bpos.getY() > 5) { bpos.setY(bpos.getY() - 1); state = world.getBlockState(bpos); } int bottom = (int) (bpos.getY() + radius * 1.3F + 5); - + if (top <= bottom) { return null; } - + return new BlockPos(pos.getX(), MHelper.randRange(bottom, top, random), pos.getZ()); } - + private void fixBlocks(StructureWorldAccess world, Set caveBlocks) { BlockPos pos = caveBlocks.iterator().next(); - Mutable start = new Mutable().set(pos); - Mutable end = new Mutable().set(pos); + MutableBlockPos start = new MutableBlockPos().set(pos); + MutableBlockPos end = new MutableBlockPos().set(pos); caveBlocks.forEach((bpos) -> { if (bpos.getX() < start.getX()) { start.setX(bpos.getX()); @@ -162,14 +166,14 @@ public abstract class EndCaveFeature extends DefaultFeature { if (bpos.getX() > end.getX()) { end.setX(bpos.getX()); } - + if (bpos.getY() < start.getY()) { start.setY(bpos.getY()); } if (bpos.getY() > end.getY()) { end.setY(bpos.getY()); } - + if (bpos.getZ() < start.getZ()) { start.setZ(bpos.getZ()); } @@ -179,20 +183,20 @@ public abstract class EndCaveFeature extends DefaultFeature { }); BlocksHelper.fixBlocks(world, start.add(-5, -5, -5), end.add(5, 5, 5)); } - + protected boolean isWaterNear(StructureWorldAccess world, BlockPos pos) { - for (Direction dir: BlocksHelper.DIRECTIONS) { - if (!world.getFluidState(pos.offset(dir, 5)).isEmpty()) { + for (Direction dir : BlocksHelper.DIRECTIONS) { + if (!world.getFluidState(pos.relative(dir, 5)).isEmpty()) { return true; } } return false; } - + protected boolean biomeMissingCaves(StructureWorldAccess world, BlockPos pos) { for (int x = -2; x < 3; x++) { for (int z = -2; z < 3; z++) { - Biome biome = world.getBiome(pos.add(x << 4, 0, z << 4)); + Biome biome = world.getBiome(pos.offset(x << 4, 0, z << 4)); EndBiome endBiome = EndBiomes.getFromBiome(biome); if (!endBiome.hasCaves()) { return true; 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 55636096..284528cf 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 @@ -5,10 +5,10 @@ import java.util.Set; import com.google.common.collect.Sets; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.StructureWorldAccess; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndTags; @@ -19,19 +19,19 @@ public class RoundCaveFeature extends EndCaveFeature { @Override protected Set generate(StructureWorldAccess world, BlockPos center, int radius, Random random) { OpenSimplexNoise noise = new OpenSimplexNoise(MHelper.getSeed(534, center.getX(), center.getZ())); - + int x1 = center.getX() - radius - 5; int z1 = center.getZ() - radius - 5; int x2 = center.getX() + radius + 5; int z2 = center.getZ() + radius + 5; int y1 = MHelper.floor(center.getY() - (radius + 5) / 1.6); int y2 = MHelper.floor(center.getY() + (radius + 5) / 1.6); - + double hr = radius * 0.75; double nr = radius * 0.25; - + BlockState state; - Mutable bpos = new Mutable(); + MutableBlockPos bpos = new MutableBlockPos(); Set blocks = Sets.newHashSet(); for (int x = x1; x <= x2; x++) { int xsq = x - center.getX(); @@ -53,13 +53,13 @@ public class RoundCaveFeature extends EndCaveFeature { if (isReplaceable(state) && !isWaterNear(world, bpos)) { BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR); blocks.add(bpos.toImmutable()); - + 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); @@ -71,14 +71,12 @@ public class RoundCaveFeature extends EndCaveFeature { } } } - + return blocks; } - + private boolean isReplaceable(BlockState state) { - return state.isIn(EndTags.GEN_TERRAIN) - || state.getMaterial().isReplaceable() - || state.getMaterial().equals(Material.PLANT) - || state.getMaterial().equals(Material.LEAVES); + return state.isIn(EndTags.GEN_TERRAIN) || state.getMaterial().isReplaceable() + || state.getMaterial().equals(Material.PLANT) || state.getMaterial().equals(Material.LEAVES); } } 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 72826f16..96789b66 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 @@ -5,12 +5,12 @@ import java.util.Random; import java.util.Set; import java.util.function.Function; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Material; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.Material; import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; import net.minecraft.world.StructureWorldAccess; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; @@ -19,36 +19,35 @@ import ru.betterend.util.sdf.SDF; public class TunelCaveFeature extends EndCaveFeature { private static final Function REPLACE; - + @Override protected Set generate(StructureWorldAccess world, BlockPos center, int radius, Random random) { - //OpenSimplexNoise noise = new OpenSimplexNoise(MHelper.getSeed(534, center.getX(), center.getZ())); + // OpenSimplexNoise noise = new OpenSimplexNoise(MHelper.getSeed(534, + // center.getX(), center.getZ())); float rad = radius * 0.15F; - int min = MathHelper.ceil(rad) - 15; - int max = 31 - MathHelper.floor(rad); + int min = Mth.ceil(rad) - 15; + int max = 31 - Mth.floor(rad); List spline = SplineHelper.makeSpline(0, 0, 0, 0, 0, 0, radius / 3); spline = SplineHelper.smoothSpline(spline, 5); SplineHelper.offsetParts(spline, random, 5, radius * 0.4F, 5); - for (Vector3f vec: spline) { - float x = MathHelper.clamp(vec.getX(), min, max); - float y = MathHelper.clamp(vec.getY(), -radius, radius); - float z = MathHelper.clamp(vec.getZ(), min, max); + for (Vector3f vec : spline) { + float x = Mth.clamp(vec.getX(), min, max); + float y = Mth.clamp(vec.getY(), -radius, radius); + float z = Mth.clamp(vec.getZ(), min, max); vec.set(x, y, z); } - SDF sdf = SplineHelper.buildSDF(spline, rad, rad, (vec) -> Blocks.AIR.getDefaultState()); + SDF sdf = SplineHelper.buildSDF(spline, rad, rad, (vec) -> Blocks.AIR.defaultBlockState()); Set positions = sdf.setReplaceFunction(REPLACE).getPositions(world, center); - for (BlockPos p: positions) { + for (BlockPos p : positions) { BlocksHelper.setWithoutUpdate(world, p, CAVE_AIR); } return positions; } - + static { REPLACE = (state) -> { - return state.isIn(EndTags.GEN_TERRAIN) - || state.getMaterial().isReplaceable() - || state.getMaterial().equals(Material.PLANT) - || state.getMaterial().equals(Material.LEAVES); + return state.isIn(EndTags.GEN_TERRAIN) || state.getMaterial().isReplaceable() + || state.getMaterial().equals(Material.PLANT) || state.getMaterial().equals(Material.LEAVES); }; } } diff --git a/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java index ad8f0951..bc404708 100644 --- a/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java @@ -6,13 +6,13 @@ import java.util.function.Function; import com.google.common.collect.Lists; -import net.minecraft.block.BlockState; -import net.minecraft.block.LeavesBlock; -import net.minecraft.block.Material; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.material.Material; import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -40,99 +40,108 @@ public class DragonTreeFeature extends DefaultFeature { private static final List SIDE1; private static final List SIDE2; private static final List ROOT; - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; - + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + return false; + float size = MHelper.randRange(10, 25, random); List spline = SplineHelper.makeSpline(0, 0, 0, 0, size, 0, 6); SplineHelper.offsetParts(spline, random, 1F, 0, 1F); - + if (!SplineHelper.canGenerate(spline, pos, world, REPLACE)) { return false; } BlocksHelper.setWithoutUpdate(world, pos, AIR); - + Vector3f last = SplineHelper.getPos(spline, 3.5F); OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); float radius = size * MHelper.randRange(0.5F, 0.7F, random); - makeCap(world, pos.add(last.getX(), last.getY(), last.getZ()), radius, random, noise); - + makeCap(world, pos.offset(last.getX(), last.getY(), last.getZ()), radius, random, noise); + last = spline.get(0); - makeRoots(world, pos.add(last.getX(), last.getY(), last.getZ()), radius, random); - + makeRoots(world, pos.offset(last.getX(), last.getY(), last.getZ()), radius, random); + radius = MHelper.randRange(1.2F, 2.3F, random); SDF function = SplineHelper.buildSDF(spline, radius, 1.2F, (bpos) -> { - return EndBlocks.DRAGON_TREE.bark.getDefaultState(); + return EndBlocks.DRAGON_TREE.bark.defaultBlockState(); }); - + function.setReplaceFunction(REPLACE); function.addPostProcess(POST); function.fillRecursiveIgnore(world, pos, IGNORE); - + return true; } - - private void makeCap(StructureWorldAccess world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) { + + private void makeCap(StructureWorldAccess world, BlockPos pos, float radius, Random random, + OpenSimplexNoise noise) { int count = (int) radius; int offset = (int) (BRANCH.get(BRANCH.size() - 1).getY() * radius); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2; float scale = radius * MHelper.randRange(0.85F, 1.15F, random); - + List branch = SplineHelper.copySpline(BRANCH); SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); - SplineHelper.fillSpline(branch, world, EndBlocks.DRAGON_TREE.bark.getDefaultState(), pos, REPLACE); - + SplineHelper.fillSpline(branch, world, EndBlocks.DRAGON_TREE.bark.defaultBlockState(), pos, REPLACE); + branch = SplineHelper.copySpline(SIDE1); SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); - SplineHelper.fillSpline(branch, world, EndBlocks.DRAGON_TREE.bark.getDefaultState(), pos, REPLACE); - + SplineHelper.fillSpline(branch, world, EndBlocks.DRAGON_TREE.bark.defaultBlockState(), pos, REPLACE); + branch = SplineHelper.copySpline(SIDE2); SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); - SplineHelper.fillSpline(branch, world, EndBlocks.DRAGON_TREE.bark.getDefaultState(), pos, REPLACE); + SplineHelper.fillSpline(branch, world, EndBlocks.DRAGON_TREE.bark.defaultBlockState(), pos, REPLACE); } leavesBall(world, pos.up(offset), radius * 1.15F + 2, random, noise); } - + private void makeRoots(StructureWorldAccess world, BlockPos pos, float radius, Random random) { int count = (int) (radius * 1.5F); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2; float scale = radius * MHelper.randRange(0.85F, 1.15F, random); - + List branch = SplineHelper.copySpline(ROOT); SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); Vector3f last = branch.get(branch.size() - 1); - if (world.getBlockState(pos.add(last.getX(), last.getY(), last.getZ())).isIn(EndTags.GEN_TERRAIN)) { - SplineHelper.fillSpline(branch, world, EndBlocks.DRAGON_TREE.bark.getDefaultState(), pos, REPLACE); + if (world.getBlockState(pos.offset(last.getX(), last.getY(), last.getZ())).isIn(EndTags.GEN_TERRAIN)) { + SplineHelper.fillSpline(branch, world, EndBlocks.DRAGON_TREE.bark.defaultBlockState(), pos, REPLACE); } } } - - private void leavesBall(StructureWorldAccess world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) { - SDF sphere = new SDFSphere().setRadius(radius).setBlock(EndBlocks.DRAGON_TREE_LEAVES.getDefaultState().with(LeavesBlock.DISTANCE, 6)); + + private void leavesBall(StructureWorldAccess world, BlockPos pos, float radius, Random random, + OpenSimplexNoise noise) { + SDF sphere = new SDFSphere().setRadius(radius) + .setBlock(EndBlocks.DRAGON_TREE_LEAVES.defaultBlockState().with(LeavesBlock.DISTANCE, 6)); SDF sub = new SDFScale().setScale(5).setSource(sphere); sub = new SDFTranslate().setTranslate(0, -radius * 5, 0).setSource(sub); sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sub); sphere = new SDFScale3D().setScale(1, 0.5F, 1).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 1.5F; }).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return random.nextFloat() * 3F - 1.5F; }).setSource(sphere); - Mutable mut = new Mutable(); + sphere = new SDFDisplacement().setFunction((vec) -> { + return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 1.5F; + }).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> { + return random.nextFloat() * 3F - 1.5F; + }).setSource(sphere); + MutableBlockPos mut = new MutableBlockPos(); sphere.addPostProcess((info) -> { if (random.nextInt(5) == 0) { - for (Direction dir: Direction.values()) { + for (Direction dir : Direction.values()) { BlockState state = info.getState(dir, 2); if (state.isAir()) { return info.getState(); } } - info.setState(EndBlocks.DRAGON_TREE.bark.getDefaultState()); + info.setState(EndBlocks.DRAGON_TREE.bark.defaultBlockState()); for (int x = -6; x < 7; x++) { int ax = Math.abs(x); mut.setX(x + info.getPos().getX()); @@ -146,7 +155,7 @@ public class DragonTreeFeature extends DefaultFeature { mut.setY(y + info.getPos().getY()); BlockState state = info.getState(mut); if (state.getBlock() instanceof LeavesBlock) { - int distance = state.get(LeavesBlock.DISTANCE); + int distance = state.getValue(LeavesBlock.DISTANCE); if (d < distance) { info.setState(mut, state.with(LeavesBlock.DISTANCE, d)); } @@ -159,16 +168,16 @@ public class DragonTreeFeature extends DefaultFeature { return info.getState(); }); sphere.fillRecursiveIgnore(world, pos, IGNORE); - - + if (radius > 5) { int count = (int) (radius * 2.5F); for (int i = 0; i < count; i++) { - BlockPos p = pos.add(random.nextGaussian() * 1, random.nextGaussian() * 1, random.nextGaussian() * 1); + BlockPos p = pos.offset(random.nextGaussian() * 1, random.nextGaussian() * 1, + random.nextGaussian() * 1); boolean place = true; - for (Direction d: Direction.values()) { + for (Direction d : Direction.values()) { BlockState state = world.getBlockState(p.offset(d)); - if (!EndBlocks.DRAGON_TREE.isTreeLog(state) && !state.isOf(EndBlocks.DRAGON_TREE_LEAVES)) { + if (!EndBlocks.DRAGON_TREE.isTreeLog(state) && !state.is(EndBlocks.DRAGON_TREE_LEAVES)) { place = false; break; } @@ -178,10 +187,10 @@ public class DragonTreeFeature extends DefaultFeature { } } } - + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.DRAGON_TREE.bark); } - + static { REPLACE = (state) -> { if (state.isIn(EndTags.END_GROUND)) { @@ -195,45 +204,36 @@ public class DragonTreeFeature extends DefaultFeature { } return state.getMaterial().isReplaceable(); }; - + IGNORE = (state) -> { return EndBlocks.DRAGON_TREE.isTreeLog(state); }; - + POST = (info) -> { - if (EndBlocks.DRAGON_TREE.isTreeLog(info.getStateUp()) && EndBlocks.DRAGON_TREE.isTreeLog(info.getStateDown())) { - return EndBlocks.DRAGON_TREE.log.getDefaultState(); + if (EndBlocks.DRAGON_TREE.isTreeLog(info.getStateUp()) + && EndBlocks.DRAGON_TREE.isTreeLog(info.getStateDown())) { + return EndBlocks.DRAGON_TREE.log.defaultBlockState(); } return info.getState(); }; - - BRANCH = Lists.newArrayList(new Vector3f(0, 0, 0), - new Vector3f(0.1F, 0.3F, 0), - new Vector3f(0.4F, 0.6F, 0), - new Vector3f(0.8F, 0.8F, 0), - new Vector3f(1, 1, 0)); - SIDE1 = Lists.newArrayList(new Vector3f(0.4F, 0.6F, 0), - new Vector3f(0.8F, 0.8F, 0), - new Vector3f(1, 1, 0)); + + BRANCH = Lists.newArrayList(new Vector3f(0, 0, 0), new Vector3f(0.1F, 0.3F, 0), new Vector3f(0.4F, 0.6F, 0), + new Vector3f(0.8F, 0.8F, 0), new Vector3f(1, 1, 0)); + SIDE1 = Lists.newArrayList(new Vector3f(0.4F, 0.6F, 0), new Vector3f(0.8F, 0.8F, 0), new Vector3f(1, 1, 0)); SIDE2 = SplineHelper.copySpline(SIDE1); - + Vector3f offset1 = new Vector3f(-0.4F, -0.6F, 0); Vector3f offset2 = new Vector3f(0.4F, 0.6F, 0); - + SplineHelper.offset(SIDE1, offset1); SplineHelper.offset(SIDE2, offset1); SplineHelper.rotateSpline(SIDE1, 0.5F); SplineHelper.rotateSpline(SIDE2, -0.5F); SplineHelper.offset(SIDE1, offset2); SplineHelper.offset(SIDE2, offset2); - - ROOT = Lists.newArrayList( - new Vector3f(0F, 1F, 0), - new Vector3f(0.1F, 0.7F, 0), - new Vector3f(0.3F, 0.3F, 0), - new Vector3f(0.7F, 0.05F, 0), - new Vector3f(0.8F, -0.2F, 0) - ); + + ROOT = Lists.newArrayList(new Vector3f(0F, 1F, 0), new Vector3f(0.1F, 0.7F, 0), new Vector3f(0.3F, 0.3F, 0), + new Vector3f(0.7F, 0.05F, 0), new Vector3f(0.8F, -0.2F, 0)); SplineHelper.offset(ROOT, new Vector3f(0, -0.45F, 0)); } } diff --git a/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java b/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java index 01ffa490..de9113dc 100644 --- a/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java @@ -4,15 +4,15 @@ import java.util.List; import java.util.Random; import java.util.function.Function; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Direction.Axis; -import net.minecraft.util.math.Direction.AxisDirection; -import net.minecraft.util.math.MathHelper; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.core.Direction.AxisDirection; +import net.minecraft.util.Mth; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -30,43 +30,46 @@ public class GiganticAmaranitaFeature extends DefaultFeature { private static final Function REPLACE; private static final Function IGNORE; private static final Function POST; - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; - + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + return false; + float size = MHelper.randRange(5, 10, random); List spline = SplineHelper.makeSpline(0, 0, 0, 0, size, 0, 5); SplineHelper.offsetParts(spline, random, 0.7F, 0, 0.7F); - + if (!SplineHelper.canGenerate(spline, pos, world, REPLACE)) { return false; } BlocksHelper.setWithoutUpdate(world, pos, AIR); - - float radius = size * 0.17F;//MHelper.randRange(0.8F, 1.2F, random); + + float radius = size * 0.17F;// MHelper.randRange(0.8F, 1.2F, random); SDF function = SplineHelper.buildSDF(spline, radius, 0.2F, (bpos) -> { - return EndBlocks.AMARANITA_STEM.getDefaultState(); + return EndBlocks.AMARANITA_STEM.defaultBlockState(); }); - + Vector3f capPos = spline.get(spline.size() - 1); - makeHead(world, pos.add(capPos.getX() + 0.5F, capPos.getY() + 1.5F ,capPos.getZ() + 0.5F), MathHelper.floor(size / 1.6F)); - + makeHead(world, pos.offset(capPos.getX() + 0.5F, capPos.getY() + 1.5F, capPos.getZ() + 0.5F), + Mth.floor(size / 1.6F)); + function.setReplaceFunction(REPLACE); function.addPostProcess(POST); function.fillRecursiveIgnore(world, pos, IGNORE); - + for (int i = 0; i < 3; i++) { List copy = SplineHelper.copySpline(spline); SplineHelper.offsetParts(copy, random, 0.2F, 0, 0.2F); - SplineHelper.fillSplineForce(copy, world, EndBlocks.AMARANITA_HYPHAE.getDefaultState(), pos, REPLACE); + SplineHelper.fillSplineForce(copy, world, EndBlocks.AMARANITA_HYPHAE.defaultBlockState(), pos, REPLACE); } - + return true; } - + private void makeHead(StructureWorldAccess world, BlockPos pos, int radius) { - Mutable mut = new Mutable(); + MutableBlockPos mut = new MutableBlockPos(); if (radius < 2) { for (int i = -1; i < 2; i++) { mut.set(pos).move(Direction.NORTH, 2).move(Direction.EAST, i); @@ -95,12 +98,13 @@ public class GiganticAmaranitaFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_LANTERN); mut.move(Direction.DOWN); if (world.getBlockState(mut).getMaterial().isReplaceable()) { - BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_FUR.getDefaultState().with(AttachedBlock.FACING, Direction.DOWN)); + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_FUR.defaultBlockState() + .with(AttachedBlock.FACING, Direction.DOWN)); } } } } - + int h = radius + 1; for (int y = 0; y < h; y++) { mut.setY(pos.getY() + y + 1); @@ -114,7 +118,7 @@ public class GiganticAmaranitaFeature extends DefaultFeature { } } } - + mut.setY(pos.getY() + h + 1); for (int x = -1; x < 2; x++) { mut.setX(pos.getX() + x); @@ -125,9 +129,8 @@ public class GiganticAmaranitaFeature extends DefaultFeature { } } } - } - else if (radius < 4) { - pos = pos.add(-1, 0, -1); + } else if (radius < 4) { + pos = pos.offset(-1, 0, -1); for (int i = -2; i < 2; i++) { mut.set(pos).move(Direction.NORTH, 2).move(Direction.WEST, i); if (world.getBlockState(mut).getMaterial().isReplaceable()) { @@ -158,18 +161,21 @@ public class GiganticAmaranitaFeature extends DefaultFeature { int distance = axis == Axis.X ? x < 0 ? -1 : 1 : z < 0 ? -1 : 1; BlockPos offseted = mut.offset(axis, distance); if (world.getBlockState(offseted).getMaterial().isReplaceable()) { - Direction dir = Direction.from(axis, distance < 0 ? AxisDirection.NEGATIVE : AxisDirection.POSITIVE); - BlocksHelper.setWithoutUpdate(world, offseted, EndBlocks.AMARANITA_FUR.getDefaultState().with(AttachedBlock.FACING, dir)); + Direction dir = Direction.fromAxisAndDirection(axis, + distance < 0 ? AxisDirection.NEGATIVE : AxisDirection.POSITIVE); + BlocksHelper.setWithoutUpdate(world, offseted, + EndBlocks.AMARANITA_FUR.defaultBlockState().with(AttachedBlock.FACING, dir)); } mut.move(Direction.DOWN); } if (world.getBlockState(mut).getMaterial().isReplaceable()) { - BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_FUR.getDefaultState().with(AttachedBlock.FACING, Direction.DOWN)); + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_FUR.defaultBlockState() + .with(AttachedBlock.FACING, Direction.DOWN)); } } } } - + int h = radius - 1; for (int y = 0; y < h; y++) { mut.setY(pos.getY() + y + 1); @@ -183,7 +189,7 @@ public class GiganticAmaranitaFeature extends DefaultFeature { } } } - + mut.setY(pos.getY() + h + 1); for (int x = -1; x < 3; x++) { mut.setX(pos.getX() + x); @@ -194,8 +200,7 @@ public class GiganticAmaranitaFeature extends DefaultFeature { } } } - } - else { + } else { for (int i = -2; i < 3; i++) { mut.set(pos).move(Direction.NORTH, 3).move(Direction.EAST, i); if (world.getBlockState(mut).getMaterial().isReplaceable()) { @@ -209,7 +214,7 @@ public class GiganticAmaranitaFeature extends DefaultFeature { if (world.getBlockState(mut).getMaterial().isReplaceable()) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); } - + mut.set(pos).move(Direction.SOUTH, 3).move(Direction.EAST, i); if (world.getBlockState(mut).getMaterial().isReplaceable()) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); @@ -222,7 +227,7 @@ public class GiganticAmaranitaFeature extends DefaultFeature { if (world.getBlockState(mut).getMaterial().isReplaceable()) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); } - + mut.set(pos).move(Direction.EAST, 3).move(Direction.NORTH, i); if (world.getBlockState(mut).getMaterial().isReplaceable()) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); @@ -235,7 +240,7 @@ public class GiganticAmaranitaFeature extends DefaultFeature { if (world.getBlockState(mut).getMaterial().isReplaceable()) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); } - + mut.set(pos).move(Direction.WEST, 3).move(Direction.NORTH, i); if (world.getBlockState(mut).getMaterial().isReplaceable()) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); @@ -249,14 +254,15 @@ public class GiganticAmaranitaFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); } } - + for (int i = 0; i < 4; i++) { - mut.set(pos).move(Direction.UP).move(BlocksHelper.HORIZONTAL[i], 3).move(BlocksHelper.HORIZONTAL[(i + 1) & 3], 3); + mut.set(pos).move(Direction.UP).move(BlocksHelper.HORIZONTAL[i], 3) + .move(BlocksHelper.HORIZONTAL[(i + 1) & 3], 3); if (world.getBlockState(mut).getMaterial().isReplaceable()) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); } } - + for (int x = -2; x < 3; x++) { for (int z = -2; z < 3; z++) { mut.set(pos).move(x, 0, z); @@ -269,18 +275,21 @@ public class GiganticAmaranitaFeature extends DefaultFeature { int distance = axis == Axis.X ? x < 0 ? -1 : 1 : z < 0 ? -1 : 1; BlockPos offseted = mut.offset(axis, distance); if (world.getBlockState(offseted).getMaterial().isReplaceable()) { - Direction dir = Direction.from(axis, distance < 0 ? AxisDirection.NEGATIVE : AxisDirection.POSITIVE); - BlocksHelper.setWithoutUpdate(world, offseted, EndBlocks.AMARANITA_FUR.getDefaultState().with(AttachedBlock.FACING, dir)); + Direction dir = Direction.fromAxisAndDirection(axis, + distance < 0 ? AxisDirection.NEGATIVE : AxisDirection.POSITIVE); + BlocksHelper.setWithoutUpdate(world, offseted, + EndBlocks.AMARANITA_FUR.defaultBlockState().with(AttachedBlock.FACING, dir)); } mut.move(Direction.DOWN); } if (world.getBlockState(mut).getMaterial().isReplaceable()) { - BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_FUR.getDefaultState().with(AttachedBlock.FACING, Direction.DOWN)); + BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_FUR.defaultBlockState() + .with(AttachedBlock.FACING, Direction.DOWN)); } } } } - + for (int y = 0; y < 3; y++) { mut.setY(pos.getY() + y + 1); for (int x = -2; x < 3; x++) { @@ -293,7 +302,7 @@ public class GiganticAmaranitaFeature extends DefaultFeature { } } } - + int h = radius + 1; for (int y = 4; y < h; y++) { mut.setY(pos.getY() + y); @@ -302,12 +311,13 @@ public class GiganticAmaranitaFeature extends DefaultFeature { for (int z = -2; z < 3; z++) { mut.setZ(pos.getZ() + z); if (y < 6) { - if (((x / 2) == 0 || (z / 2) == 0) && world.getBlockState(mut).getMaterial().isReplaceable()) { + if (((x / 2) == 0 || (z / 2) == 0) + && world.getBlockState(mut).getMaterial().isReplaceable()) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_CAP); } - } - else { - if ((x == 0 || z == 0) && (Math.abs(x) < 2 && Math.abs(z) < 2) && world.getBlockState(mut).getMaterial().isReplaceable()) { + } else { + if ((x == 0 || z == 0) && (Math.abs(x) < 2 && Math.abs(z) < 2) + && world.getBlockState(mut).getMaterial().isReplaceable()) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_CAP); } } @@ -316,7 +326,7 @@ public class GiganticAmaranitaFeature extends DefaultFeature { } } } - + static { REPLACE = (state) -> { if (state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT)) { @@ -324,14 +334,14 @@ public class GiganticAmaranitaFeature extends DefaultFeature { } return state.getMaterial().isReplaceable(); }; - + IGNORE = (state) -> { return EndBlocks.DRAGON_TREE.isTreeLog(state); }; - + POST = (info) -> { - if (!info.getStateUp().isOf(EndBlocks.AMARANITA_STEM) || !info.getStateDown().isOf(EndBlocks.AMARANITA_STEM)) { - return EndBlocks.AMARANITA_HYPHAE.getDefaultState(); + if (!info.getStateUp().is(EndBlocks.AMARANITA_STEM) || !info.getStateDown().is(EndBlocks.AMARANITA_STEM)) { + return EndBlocks.AMARANITA_HYPHAE.defaultBlockState(); } return info.getState(); }; diff --git a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java index d71004cf..3a0c9fcc 100644 --- a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java @@ -5,12 +5,12 @@ import java.util.List; import java.util.Random; import java.util.function.Function; -import net.minecraft.block.BlockState; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.util.math.Box; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -31,16 +31,18 @@ import ru.betterend.world.features.DefaultFeature; public class HelixTreeFeature extends DefaultFeature { private static final Function POST; - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + return false; BlocksHelper.setWithoutUpdate(world, pos, AIR); - + float angle = random.nextFloat() * MHelper.PI2; float radiusRange = MHelper.randRange(4.5F, 6F, random); float scale = MHelper.randRange(0.5F, 1F, random); - + float dx; float dz; List spline = new ArrayList(10); @@ -50,35 +52,40 @@ public class HelixTreeFeature extends DefaultFeature { dz = (float) Math.cos(i + angle) * radius; spline.add(new Vector3f(dx, i * 2, dz)); } - SDF sdf = SplineHelper.buildSDF(spline, 1.7F, 0.5F, (p) -> { return EndBlocks.HELIX_TREE.bark.getDefaultState(); }); + SDF sdf = SplineHelper.buildSDF(spline, 1.7F, 0.5F, (p) -> { + return EndBlocks.HELIX_TREE.bark.defaultBlockState(); + }); SDF rotated = new SDFRotation().setRotation(Vector3f.POSITIVE_Y, (float) Math.PI).setSource(sdf); sdf = new SDFUnion().setSourceA(rotated).setSourceB(sdf); - + Vector3f lastPoint = spline.get(spline.size() - 1); List spline2 = SplineHelper.makeSpline(0, 0, 0, 0, 20, 0, 5); - SDF stem = SplineHelper.buildSDF(spline2, 1.0F, 0.5F, (p) -> { return EndBlocks.HELIX_TREE.bark.getDefaultState(); }); + SDF stem = SplineHelper.buildSDF(spline2, 1.0F, 0.5F, (p) -> { + return EndBlocks.HELIX_TREE.bark.defaultBlockState(); + }); stem = new SDFTranslate().setTranslate(lastPoint.getX(), lastPoint.getY(), lastPoint.getZ()).setSource(stem); sdf = new SDFSmoothUnion().setRadius(3).setSourceA(sdf).setSourceB(stem); - + sdf = new SDFScale().setScale(scale).setSource(sdf); dx = 30 * scale; float dy1 = -20 * scale; float dy2 = 100 * scale; - sdf.addPostProcess(POST).fillArea(world, pos, new Box(pos.add(-dx, dy1, -dx), pos.add(dx, dy2, dx))); + sdf.addPostProcess(POST).fillArea(world, pos, new Box(pos.offset(-dx, dy1, -dx), pos.offset(dx, dy2, dx))); SplineHelper.scale(spline, scale); - SplineHelper.fillSplineForce(spline, world, EndBlocks.HELIX_TREE.bark.getDefaultState(), pos, (state) -> { + SplineHelper.fillSplineForce(spline, world, EndBlocks.HELIX_TREE.bark.defaultBlockState(), pos, (state) -> { return state.getMaterial().isReplaceable(); }); SplineHelper.rotateSpline(spline, (float) Math.PI); - SplineHelper.fillSplineForce(spline, world, EndBlocks.HELIX_TREE.bark.getDefaultState(), pos, (state) -> { + SplineHelper.fillSplineForce(spline, world, EndBlocks.HELIX_TREE.bark.defaultBlockState(), pos, (state) -> { return state.getMaterial().isReplaceable(); }); SplineHelper.scale(spline2, scale); - BlockPos leafStart = pos.add(lastPoint.getX() + 0.5, lastPoint.getY() + 0.5, lastPoint.getZ() + 0.5); - SplineHelper.fillSplineForce(spline2, world, EndBlocks.HELIX_TREE.log.getDefaultState(), leafStart, (state) -> { - return state.getMaterial().isReplaceable(); - }); - + BlockPos leafStart = pos.offset(lastPoint.getX() + 0.5, lastPoint.getY() + 0.5, lastPoint.getZ() + 0.5); + SplineHelper.fillSplineForce(spline2, world, EndBlocks.HELIX_TREE.log.defaultBlockState(), leafStart, + (state) -> { + return state.getMaterial().isReplaceable(); + }); + spline.clear(); float rad = MHelper.randRange(8F, 11F, random); int count = MHelper.randRange(20, 30, random); @@ -93,11 +100,11 @@ public class HelixTreeFeature extends DefaultFeature { dz = (float) Math.cos(i * 0.45F + angle) * radius; spline.add(new Vector3f(dx, i * scaleM, dz)); } - + Vector3f start = new Vector3f(); Vector3f end = new Vector3f(); lastPoint = spline.get(0); - BlockState leaf = EndBlocks.HELIX_TREE_LEAVES.getDefaultState(); + BlockState leaf = EndBlocks.HELIX_TREE_LEAVES.defaultBlockState(); for (int i = 1; i < spline.size(); i++) { Vector3f point = spline.get(i); int minY = MHelper.floor(lastPoint.getY()); @@ -106,8 +113,8 @@ public class HelixTreeFeature extends DefaultFeature { for (float py = minY; py <= maxY; py += 0.2F) { start.set(0, py, 0); float delta = (float) (py - minY) / div; - float px = MathHelper.lerp(delta, lastPoint.getX(), point.getX()); - float pz = MathHelper.lerp(delta, lastPoint.getZ(), point.getZ()); + float px = Mth.lerp(delta, lastPoint.getX(), point.getX()); + float pz = Mth.lerp(delta, lastPoint.getZ(), point.getZ()); end.set(px, py, pz); fillLine(start, end, world, leaf, leafStart, i / 2 - 1); float ax = Math.abs(px); @@ -115,8 +122,7 @@ public class HelixTreeFeature extends DefaultFeature { if (ax > az) { start.set(start.getX(), start.getY(), start.getZ() + az > 0 ? 1 : -1); end.set(end.getX(), end.getY(), end.getZ() + az > 0 ? 1 : -1); - } - else { + } else { start.set(start.getX() + ax > 0 ? 1 : -1, start.getY(), start.getZ()); end.set(end.getX() + ax > 0 ? 1 : -1, end.getY(), end.getZ()); } @@ -124,7 +130,7 @@ public class HelixTreeFeature extends DefaultFeature { } lastPoint = point; } - + leaf = leaf.with(HelixTreeLeavesBlock.COLOR, 7); leafStart = leafStart.add(0, lastPoint.getY(), 0); if (world.getBlockState(leafStart).isAir()) { @@ -133,16 +139,17 @@ public class HelixTreeFeature extends DefaultFeature { if (world.getBlockState(leafStart).isAir()) { BlocksHelper.setWithoutUpdate(world, leafStart, leaf); leafStart = leafStart.up(); - if (world.getBlockState(leafStart).isAir()) { - BlocksHelper.setWithoutUpdate(world, leafStart, leaf); - } + if (world.getBlockState(leafStart).isAir()) { + BlocksHelper.setWithoutUpdate(world, leafStart, leaf); + } } } - + return true; } - - private void fillLine(Vector3f start, Vector3f end, StructureWorldAccess world, BlockState state, BlockPos pos, int offset) { + + private void fillLine(Vector3f start, Vector3f end, StructureWorldAccess world, BlockState state, BlockPos pos, + int offset) { float dx = end.getX() - start.getX(); float dy = end.getY() - start.getY(); float dz = end.getZ() - start.getZ(); @@ -154,12 +161,12 @@ public class HelixTreeFeature extends DefaultFeature { float x = start.getX(); float y = start.getY(); float z = start.getZ(); - - Mutable bPos = new Mutable(); + + MutableBlockPos bPos = new MutableBlockPos(); for (int i = 0; i < count; i++) { bPos.set(x + pos.getX(), y + pos.getY(), z + pos.getZ()); int color = MHelper.floor((float) i / (float) count * 7F + 0.5F) + offset; - color = MathHelper.clamp(color, 0, 7); + color = Mth.clamp(color, 0, 7); if (world.getBlockState(bPos).getMaterial().isReplaceable()) { BlocksHelper.setWithoutUpdate(world, bPos, state.with(HelixTreeLeavesBlock.COLOR, color)); } @@ -172,11 +179,12 @@ public class HelixTreeFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, bPos, state.with(HelixTreeLeavesBlock.COLOR, 7)); } } - + static { POST = (info) -> { - if (EndBlocks.HELIX_TREE.isTreeLog(info.getStateUp()) && EndBlocks.HELIX_TREE.isTreeLog(info.getStateDown())) { - return EndBlocks.HELIX_TREE.log.getDefaultState(); + if (EndBlocks.HELIX_TREE.isTreeLog(info.getStateUp()) + && EndBlocks.HELIX_TREE.isTreeLog(info.getStateDown())) { + return EndBlocks.HELIX_TREE.log.defaultBlockState(); } return info.getState(); }; diff --git a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java index 99912b1c..3b16470a 100644 --- a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java @@ -6,11 +6,11 @@ import java.util.function.Function; import com.google.common.collect.Lists; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -31,14 +31,16 @@ import ru.betterend.world.features.DefaultFeature; public class JellyshroomFeature extends DefaultFeature { private static final Function REPLACE; private static final List ROOT; - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; - - BlockState bark = EndBlocks.JELLYSHROOM.bark.getDefaultState(); - BlockState membrane = EndBlocks.JELLYSHROOM_CAP_PURPLE.getDefaultState(); - + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + return false; + + BlockState bark = EndBlocks.JELLYSHROOM.bark.defaultBlockState(); + BlockState membrane = EndBlocks.JELLYSHROOM_CAP_PURPLE.defaultBlockState(); + int height = MHelper.randRange(5, 8, random); float radius = height * MHelper.randRange(0.15F, 0.25F, random); List spline = SplineHelper.makeSpline(0, -1, 0, 0, height, 0, 3); @@ -46,7 +48,7 @@ public class JellyshroomFeature extends DefaultFeature { SDF sdf = SplineHelper.buildSDF(spline, radius, 0.8F, (bpos) -> { return bark; }); - + radius = height * MHelper.randRange(0.7F, 0.9F, random); if (radius < 1.5F) { radius = 1.5F; @@ -58,67 +60,63 @@ public class JellyshroomFeature extends DefaultFeature { sdf = new SDFSmoothUnion().setRadius(3F).setSourceA(sdf).setSourceB(cap); sdf.setReplaceFunction(REPLACE).addPostProcess((info) -> { if (EndBlocks.JELLYSHROOM.isTreeLog(info.getState())) { - if (EndBlocks.JELLYSHROOM.isTreeLog(info.getStateUp()) && EndBlocks.JELLYSHROOM.isTreeLog(info.getStateDown())) { - return EndBlocks.JELLYSHROOM.log.getDefaultState(); + if (EndBlocks.JELLYSHROOM.isTreeLog(info.getStateUp()) + && EndBlocks.JELLYSHROOM.isTreeLog(info.getStateDown())) { + return EndBlocks.JELLYSHROOM.log.defaultBlockState(); } - } - else if (info.getState().isOf(EndBlocks.JELLYSHROOM_CAP_PURPLE)) { + } else if (info.getState().is(EndBlocks.JELLYSHROOM_CAP_PURPLE)) { float dx = info.getPos().getX() - pos.getX() - last.getX(); float dz = info.getPos().getZ() - pos.getZ() - last.getZ(); float distance = MHelper.length(dx, dz) / membraneRadius * 7F; - int color = MathHelper.clamp(MHelper.floor(distance), 0, 7); + int color = Mth.clamp(MHelper.floor(distance), 0, 7); return info.getState().with(JellyshroomCapBlock.COLOR, color); } return info.getState(); }).fillRecursive(world, pos); radius = height * 0.5F; - makeRoots(world, pos.add(0, 2, 0), radius, random, bark); - + makeRoots(world, pos.offset(0, 2, 0), radius, random, bark); + return true; } - + private void makeRoots(StructureWorldAccess world, BlockPos pos, float radius, Random random, BlockState wood) { int count = (int) (radius * 3.5F); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2; float scale = radius * MHelper.randRange(0.85F, 1.15F, random); - + List branch = SplineHelper.copySpline(ROOT); SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); Vector3f last = branch.get(branch.size() - 1); - if (world.getBlockState(pos.add(last.getX(), last.getY(), last.getZ())).isIn(EndTags.GEN_TERRAIN)) { + if (world.getBlockState(pos.offset(last.getX(), last.getY(), last.getZ())).isIn(EndTags.GEN_TERRAIN)) { SplineHelper.fillSpline(branch, world, wood, pos, REPLACE); } } } - + private SDF makeCap(float radius, Random random, BlockState cap) { SDF sphere = new SDFSphere().setRadius(radius).setBlock(cap); SDF sub = new SDFTranslate().setTranslate(0, -4, 0).setSource(sphere); sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sub); sphere = new SDFScale3D().setScale(1, 0.5F, 1).setSource(sphere); sphere = new SDFTranslate().setTranslate(0, 1 - radius * 0.5F, 0).setSource(sphere); - + float angle = random.nextFloat() * MHelper.PI2; int count = (int) MHelper.randRange(radius * 0.5F, radius, random); if (count < 3) { count = 3; } sphere = new SDFFlatWave().setAngle(angle).setRaysCount(count).setIntensity(0.2F).setSource(sphere); - + return sphere; } - + static { - ROOT = Lists.newArrayList( - new Vector3f(0.1F, 0.70F, 0), - new Vector3f(0.3F, 0.30F, 0), - new Vector3f(0.7F, 0.05F, 0), - new Vector3f(0.8F, -0.20F, 0) - ); + ROOT = Lists.newArrayList(new Vector3f(0.1F, 0.70F, 0), new Vector3f(0.3F, 0.30F, 0), + new Vector3f(0.7F, 0.05F, 0), new Vector3f(0.8F, -0.20F, 0)); SplineHelper.offset(ROOT, new Vector3f(0, -0.45F, 0)); - + REPLACE = (state) -> { if (state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT)) { return true; diff --git a/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java b/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java index 79410baf..9ef75410 100644 --- a/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java @@ -4,13 +4,13 @@ import java.util.List; import java.util.Random; import java.util.function.Function; -import net.minecraft.block.BlockState; -import net.minecraft.block.LeavesBlock; -import net.minecraft.block.Material; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.material.Material; import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -32,39 +32,41 @@ public class LacugroveFeature extends DefaultFeature { private static final Function REPLACE; private static final Function IGNORE; private static final Function POST; - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).isIn(EndTags.END_GROUND)) return false; - + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + if (!world.getBlockState(pos.below()).isIn(EndTags.END_GROUND)) + return false; + float size = MHelper.randRange(15, 25, random); List spline = SplineHelper.makeSpline(0, 0, 0, 0, size, 0, 6); SplineHelper.offsetParts(spline, random, 1F, 0, 1F); - + if (!SplineHelper.canGenerate(spline, pos, world, REPLACE)) { return false; } - + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); - + float radius = MHelper.randRange(6F, 8F, random); radius *= (size - 15F) / 20F + 1F; Vector3f center = spline.get(4); - leavesBall(world, pos.add(center.getX(), center.getY(), center.getZ()), radius, random, noise); - + leavesBall(world, pos.offset(center.getX(), center.getY(), center.getZ()), radius, random, noise); + radius = MHelper.randRange(1.2F, 1.8F, random); SDF function = SplineHelper.buildSDF(spline, radius, 0.7F, (bpos) -> { - return EndBlocks.LACUGROVE.bark.getDefaultState(); + return EndBlocks.LACUGROVE.bark.defaultBlockState(); }); - + function.setReplaceFunction(REPLACE); function.addPostProcess(POST); function.fillRecursive(world, pos); - + spline = spline.subList(4, 6); - SplineHelper.fillSpline(spline, world, EndBlocks.LACUGROVE.bark.getDefaultState(), pos, REPLACE); - - Mutable mut = new Mutable(); + SplineHelper.fillSpline(spline, world, EndBlocks.LACUGROVE.bark.defaultBlockState(), pos, REPLACE); + + MutableBlockPos mut = new MutableBlockPos(); int offset = random.nextInt(2); for (int i = 0; i < 100; i++) { double px = pos.getX() + MHelper.randRange(-5, 5, random); @@ -89,10 +91,11 @@ public class LacugroveFeature extends DefaultFeature { for (int y = top; y >= minY; y--) { mut.setY(y); BlockState state = world.getBlockState(mut); - if (state.getMaterial().isReplaceable() || state.getMaterial().equals(Material.PLANT) || state.isIn(EndTags.END_GROUND)) { - BlocksHelper.setWithoutUpdate(world, mut, y == top ? EndBlocks.LACUGROVE.bark : EndBlocks.LACUGROVE.log); - } - else { + if (state.getMaterial().isReplaceable() || state.getMaterial().equals(Material.PLANT) + || state.isIn(EndTags.END_GROUND)) { + BlocksHelper.setWithoutUpdate(world, mut, + y == top ? EndBlocks.LACUGROVE.bark : EndBlocks.LACUGROVE.log); + } else { break; } } @@ -100,25 +103,32 @@ public class LacugroveFeature extends DefaultFeature { } } } - + return true; } - - private void leavesBall(StructureWorldAccess world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) { - SDF sphere = new SDFSphere().setRadius(radius).setBlock(EndBlocks.LACUGROVE_LEAVES.getDefaultState().with(LeavesBlock.DISTANCE, 6)); - sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; }).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return random.nextFloat() * 3F - 1.5F; }).setSource(sphere); - sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius - 2, 0).setSource(sphere)); - Mutable mut = new Mutable(); + + private void leavesBall(StructureWorldAccess world, BlockPos pos, float radius, Random random, + OpenSimplexNoise noise) { + SDF sphere = new SDFSphere().setRadius(radius) + .setBlock(EndBlocks.LACUGROVE_LEAVES.defaultBlockState().with(LeavesBlock.DISTANCE, 6)); + sphere = new SDFDisplacement().setFunction((vec) -> { + return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; + }).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> { + return random.nextFloat() * 3F - 1.5F; + }).setSource(sphere); + sphere = new SDFSubtraction().setSourceA(sphere) + .setSourceB(new SDFTranslate().setTranslate(0, -radius - 2, 0).setSource(sphere)); + MutableBlockPos mut = new MutableBlockPos(); sphere.addPostProcess((info) -> { if (random.nextInt(5) == 0) { - for (Direction dir: Direction.values()) { + for (Direction dir : Direction.values()) { BlockState state = info.getState(dir, 2); if (state.isAir()) { return info.getState(); } } - info.setState(EndBlocks.LACUGROVE.bark.getDefaultState()); + info.setState(EndBlocks.LACUGROVE.bark.defaultBlockState()); for (int x = -6; x < 7; x++) { int ax = Math.abs(x); mut.setX(x + info.getPos().getX()); @@ -132,7 +142,7 @@ public class LacugroveFeature extends DefaultFeature { mut.setY(y + info.getPos().getY()); BlockState state = info.getState(mut); if (state.getBlock() instanceof LeavesBlock) { - int distance = state.get(LeavesBlock.DISTANCE); + int distance = state.getValue(LeavesBlock.DISTANCE); if (d < distance) { info.setState(mut, state.with(LeavesBlock.DISTANCE, d)); } @@ -145,15 +155,16 @@ public class LacugroveFeature extends DefaultFeature { return info.getState(); }); sphere.fillRecursiveIgnore(world, pos, IGNORE); - + if (radius > 5) { int count = (int) (radius * 2.5F); for (int i = 0; i < count; i++) { - BlockPos p = pos.add(random.nextGaussian() * 1, random.nextGaussian() * 1, random.nextGaussian() * 1); + BlockPos p = pos.offset(random.nextGaussian() * 1, random.nextGaussian() * 1, + random.nextGaussian() * 1); boolean place = true; - for (Direction d: Direction.values()) { + for (Direction d : Direction.values()) { BlockState state = world.getBlockState(p.offset(d)); - if (!EndBlocks.LACUGROVE.isTreeLog(state) && !state.isOf(EndBlocks.LACUGROVE_LEAVES)) { + if (!EndBlocks.LACUGROVE.isTreeLog(state) && !state.is(EndBlocks.LACUGROVE_LEAVES)) { place = false; break; } @@ -163,10 +174,10 @@ public class LacugroveFeature extends DefaultFeature { } } } - + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.LACUGROVE.bark); } - + static { REPLACE = (state) -> { if (state.isIn(EndTags.END_GROUND)) { @@ -183,14 +194,15 @@ public class LacugroveFeature extends DefaultFeature { } return state.getMaterial().isReplaceable(); }; - + IGNORE = (state) -> { return EndBlocks.LACUGROVE.isTreeLog(state); }; - + POST = (info) -> { - if (EndBlocks.LACUGROVE.isTreeLog(info.getStateUp()) && EndBlocks.LACUGROVE.isTreeLog(info.getStateDown())) { - return EndBlocks.LACUGROVE.log.getDefaultState(); + if (EndBlocks.LACUGROVE.isTreeLog(info.getStateUp()) + && EndBlocks.LACUGROVE.isTreeLog(info.getStateDown())) { + return EndBlocks.LACUGROVE.log.defaultBlockState(); } return info.getState(); }; diff --git a/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java b/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java index 8a452bd7..c2eb554e 100644 --- a/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java @@ -6,13 +6,13 @@ import java.util.function.Function; import com.google.common.collect.Lists; -import net.minecraft.block.BlockState; -import net.minecraft.block.LeavesBlock; -import net.minecraft.block.Material; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.material.Material; import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -40,14 +40,16 @@ public class LucerniaFeature extends DefaultFeature { private static final Function IGNORE; private static final List SPLINE; private static final List ROOT; - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; - + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + return false; + float size = MHelper.randRange(12, 20, random); int count = (int) (size * 0.3F); - float var = MHelper.PI2 / (float) (count * 3); + float var = MHelper.PI2 / (float) (count * 3); float start = MHelper.randRange(0, MHelper.PI2, random); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2 + MHelper.randRange(0, var, random) + start; @@ -55,65 +57,74 @@ public class LucerniaFeature extends DefaultFeature { SplineHelper.rotateSpline(spline, angle); SplineHelper.scale(spline, size * MHelper.randRange(0.5F, 1F, random)); SplineHelper.offsetParts(spline, random, 1F, 0, 1F); - SplineHelper.fillSpline(spline, world, EndBlocks.LUCERNIA.bark.getDefaultState(), pos, REPLACE); + SplineHelper.fillSpline(spline, world, EndBlocks.LUCERNIA.bark.defaultBlockState(), pos, REPLACE); Vector3f last = spline.get(spline.size() - 1); float leavesRadius = (size * 0.13F + MHelper.randRange(0.8F, 1.5F, random)) * 1.4F; OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); - leavesBall(world, pos.add(last.getX(), last.getY(), last.getZ()), leavesRadius, random, noise, config != null); + leavesBall(world, pos.offset(last.getX(), last.getY(), last.getZ()), leavesRadius, random, noise, + config != null); } - - makeRoots(world, pos.add(0, MHelper.randRange(3, 5, random), 0), size * 0.35F, random); - + + makeRoots(world, pos.offset(0, MHelper.randRange(3, 5, random), 0), size * 0.35F, random); + return true; } - - private void leavesBall(StructureWorldAccess world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise, boolean natural) { - SDF sphere = new SDFSphere().setRadius(radius).setBlock(EndBlocks.LUCERNIA_LEAVES.getDefaultState().with(LeavesBlock.DISTANCE, 6)); + + private void leavesBall(StructureWorldAccess world, BlockPos pos, float radius, Random random, + OpenSimplexNoise noise, boolean natural) { + SDF sphere = new SDFSphere().setRadius(radius) + .setBlock(EndBlocks.LUCERNIA_LEAVES.defaultBlockState().with(LeavesBlock.DISTANCE, 6)); SDF sub = new SDFScale().setScale(5).setSource(sphere); sub = new SDFTranslate().setTranslate(0, -radius * 5, 0).setSource(sub); sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sub); sphere = new SDFScale3D().setScale(1, 0.75F, 1).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 2F; }).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return MHelper.randRange(-1.5F, 1.5F, random); }).setSource(sphere); - - Mutable mut = new Mutable(); - for (Direction d1: BlocksHelper.HORIZONTAL) { + sphere = new SDFDisplacement().setFunction((vec) -> { + return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 2F; + }).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> { + return MHelper.randRange(-1.5F, 1.5F, random); + }).setSource(sphere); + + MutableBlockPos mut = new MutableBlockPos(); + for (Direction d1 : BlocksHelper.HORIZONTAL) { BlockPos p = mut.set(pos).move(Direction.UP).move(d1).toImmutable(); - BlocksHelper.setWithoutUpdate(world, p, EndBlocks.LUCERNIA.bark.getDefaultState()); - for (Direction d2: BlocksHelper.HORIZONTAL) { + BlocksHelper.setWithoutUpdate(world, p, EndBlocks.LUCERNIA.bark.defaultBlockState()); + for (Direction d2 : BlocksHelper.HORIZONTAL) { mut.set(p).move(Direction.UP).move(d2); - BlocksHelper.setWithoutUpdate(world, p, EndBlocks.LUCERNIA.bark.getDefaultState()); + BlocksHelper.setWithoutUpdate(world, p, EndBlocks.LUCERNIA.bark.defaultBlockState()); } } - - BlockState top = EndBlocks.FILALUX.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP); - BlockState middle = EndBlocks.FILALUX.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE); - BlockState bottom = EndBlocks.FILALUX.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM); - BlockState outer = EndBlocks.LUCERNIA_OUTER_LEAVES.getDefaultState(); - + + BlockState top = EndBlocks.FILALUX.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP); + BlockState middle = EndBlocks.FILALUX.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, + TripleShape.MIDDLE); + BlockState bottom = EndBlocks.FILALUX.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, + TripleShape.BOTTOM); + BlockState outer = EndBlocks.LUCERNIA_OUTER_LEAVES.defaultBlockState(); + List support = Lists.newArrayList(); sphere.addPostProcess((info) -> { if (natural && random.nextInt(6) == 0 && info.getStateDown().isAir()) { - BlockPos d = info.getPos().down(); + BlockPos d = info.getPos().below(); support.add(d); } if (random.nextInt(15) == 0) { - for (Direction dir: Direction.values()) { + for (Direction dir : Direction.values()) { BlockState state = info.getState(dir, 2); if (state.isAir()) { return info.getState(); } } - info.setState(EndBlocks.LUCERNIA.bark.getDefaultState()); + info.setState(EndBlocks.LUCERNIA.bark.defaultBlockState()); } - + MHelper.shuffle(DIRECTIONS, random); - for (Direction d: DIRECTIONS) { + for (Direction d : DIRECTIONS) { if (info.getState(d).isAir()) { info.setBlockPos(info.getPos().offset(d), outer.with(FurBlock.FACING, d)); } } - + if (EndBlocks.LUCERNIA.isTreeLog(info.getState())) { for (int x = -6; x < 7; x++) { int ax = Math.abs(x); @@ -128,7 +139,7 @@ public class LucerniaFeature extends DefaultFeature { mut.setY(y + info.getPos().getY()); BlockState state = info.getState(mut); if (state.getBlock() instanceof LeavesBlock) { - int distance = state.get(LeavesBlock.DISTANCE); + int distance = state.getValue(LeavesBlock.DISTANCE); if (d < distance) { info.setState(mut, state.with(LeavesBlock.DISTANCE, d)); } @@ -142,20 +153,19 @@ public class LucerniaFeature extends DefaultFeature { }); sphere.fillRecursiveIgnore(world, pos, IGNORE); BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.LUCERNIA.bark); - + support.forEach((bpos) -> { BlockState state = world.getBlockState(bpos); - if (state.isAir() || state.isOf(EndBlocks.LUCERNIA_OUTER_LEAVES)) { + if (state.isAir() || state.is(EndBlocks.LUCERNIA_OUTER_LEAVES)) { int count = MHelper.randRange(3, 8, random); mut.set(bpos); - if (world.getBlockState(mut.up()).isOf(EndBlocks.LUCERNIA_LEAVES)) { + if (world.getBlockState(mut.up()).is(EndBlocks.LUCERNIA_LEAVES)) { BlocksHelper.setWithoutUpdate(world, mut, top); for (int i = 1; i < count; i++) { mut.setY(mut.getY() - 1); - if (world.isAir(mut.down())) { + if (world.isAir(mut.below())) { BlocksHelper.setWithoutUpdate(world, mut, middle); - } - else { + } else { break; } } @@ -164,23 +174,23 @@ public class LucerniaFeature extends DefaultFeature { } }); } - + private void makeRoots(StructureWorldAccess world, BlockPos pos, float radius, Random random) { int count = (int) (radius * 1.5F); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2; float scale = radius * MHelper.randRange(0.85F, 1.15F, random); - + List branch = SplineHelper.copySpline(ROOT); SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); Vector3f last = branch.get(branch.size() - 1); - if (world.getBlockState(pos.add(last.getX(), last.getY(), last.getZ())).isIn(EndTags.GEN_TERRAIN)) { - SplineHelper.fillSplineForce(branch, world, EndBlocks.LUCERNIA.bark.getDefaultState(), pos, REPLACE); + if (world.getBlockState(pos.offset(last.getX(), last.getY(), last.getZ())).isIn(EndTags.GEN_TERRAIN)) { + SplineHelper.fillSplineForce(branch, world, EndBlocks.LUCERNIA.bark.defaultBlockState(), pos, REPLACE); } } } - + static { REPLACE = (state) -> { if (state.isIn(EndTags.END_GROUND)) { @@ -194,26 +204,17 @@ public class LucerniaFeature extends DefaultFeature { } return state.getMaterial().isReplaceable(); }; - + IGNORE = (state) -> { return EndBlocks.LUCERNIA.isTreeLog(state); }; - - SPLINE = Lists.newArrayList( - new Vector3f(0.00F, 0.00F, 0.00F), - new Vector3f(0.10F, 0.35F, 0.00F), - new Vector3f(0.20F, 0.50F, 0.00F), - new Vector3f(0.30F, 0.55F, 0.00F), - new Vector3f(0.42F, 0.70F, 0.00F), - new Vector3f(0.50F, 1.00F, 0.00F) - ); - - ROOT = Lists.newArrayList( - new Vector3f(0.1F, 0.70F, 0), - new Vector3f(0.3F, 0.30F, 0), - new Vector3f(0.7F, 0.05F, 0), - new Vector3f(0.8F, -0.20F, 0) - ); + + SPLINE = Lists.newArrayList(new Vector3f(0.00F, 0.00F, 0.00F), new Vector3f(0.10F, 0.35F, 0.00F), + new Vector3f(0.20F, 0.50F, 0.00F), new Vector3f(0.30F, 0.55F, 0.00F), new Vector3f(0.42F, 0.70F, 0.00F), + new Vector3f(0.50F, 1.00F, 0.00F)); + + ROOT = Lists.newArrayList(new Vector3f(0.1F, 0.70F, 0), new Vector3f(0.3F, 0.30F, 0), + new Vector3f(0.7F, 0.05F, 0), new Vector3f(0.8F, -0.20F, 0)); SplineHelper.offset(ROOT, new Vector3f(0, -0.45F, 0)); } } diff --git a/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java index 0a176f2d..499f4ee9 100644 --- a/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java @@ -4,11 +4,11 @@ import java.util.List; import java.util.Random; import java.util.function.Function; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -41,122 +41,128 @@ public class MossyGlowshroomFeature extends DefaultFeature { private static final SDFBinary FUNCTION; private static final SDFTranslate HEAD_POS; private static final SDFFlatWave ROOTS_ROT; - + private static final SDFPrimitive CONE1; private static final SDFPrimitive CONE2; private static final SDFPrimitive CONE_GLOW; private static final SDFPrimitive ROOTS; - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, DefaultFeatureConfig featureConfig) { - BlockState down = world.getBlockState(blockPos.down()); - if (!down.isOf(EndBlocks.END_MYCELIUM) && !down.isOf(EndBlocks.END_MOSS)) return false; - + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, + DefaultFeatureConfig featureConfig) { + BlockState down = world.getBlockState(blockPos.below()); + if (!down.is(EndBlocks.END_MYCELIUM) && !down.is(EndBlocks.END_MOSS)) + return false; + CONE1.setBlock(EndBlocks.MOSSY_GLOWSHROOM_CAP); CONE2.setBlock(EndBlocks.MOSSY_GLOWSHROOM_CAP); CONE_GLOW.setBlock(EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE); ROOTS.setBlock(EndBlocks.MOSSY_GLOWSHROOM.bark); - + float height = MHelper.randRange(10F, 25F, random); int count = MHelper.floor(height / 4); List spline = SplineHelper.makeSpline(0, 0, 0, 0, height, 0, count); SplineHelper.offsetParts(spline, random, 1F, 0, 1F); SDF sdf = SplineHelper.buildSDF(spline, 2.1F, 1.5F, (pos) -> { - return EndBlocks.MOSSY_GLOWSHROOM.log.getDefaultState(); + return EndBlocks.MOSSY_GLOWSHROOM.log.defaultBlockState(); }); Vector3f pos = spline.get(spline.size() - 1); float scale = MHelper.randRange(0.75F, 1.1F, random); - + if (!SplineHelper.canGenerate(spline, scale, blockPos, world, REPLACE)) { return false; } BlocksHelper.setWithoutUpdate(world, blockPos, AIR); - + CENTER.set(blockPos.getX(), 0, blockPos.getZ()); HEAD_POS.setTranslate(pos.getX(), pos.getY(), pos.getZ()); ROOTS_ROT.setAngle(random.nextFloat() * MHelper.PI2); FUNCTION.setSourceA(sdf); - - new SDFScale().setScale(scale) - .setSource(FUNCTION) - .setReplaceFunction(REPLACE) - .addPostProcess((info) -> { - if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getState())) { - if (random.nextBoolean() && info.getStateUp().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { - info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.getDefaultState().with(MossyGlowshroomCapBlock.TRANSITION, true)); - return info.getState(); - } - else if (!EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateUp()) || !EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateDown())) { - info.setState(EndBlocks.MOSSY_GLOWSHROOM.bark.getDefaultState()); - return info.getState(); - } - } - else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { - if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateDown().getBlock())) { - info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.getDefaultState().with(MossyGlowshroomCapBlock.TRANSITION, true)); - return info.getState(); - } - - info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.getDefaultState()); - return info.getState(); - } - else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { - for (Direction dir: BlocksHelper.HORIZONTAL) { - if (info.getState(dir) == AIR) { - info.setBlockPos(info.getPos().offset(dir), EndBlocks.MOSSY_GLOWSHROOM_FUR.getDefaultState().with(FurBlock.FACING, dir)); - } - } - - if (info.getStateDown().getBlock() != EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { - info.setBlockPos(info.getPos().down(), EndBlocks.MOSSY_GLOWSHROOM_FUR.getDefaultState().with(FurBlock.FACING, Direction.DOWN)); - } - } + + new SDFScale().setScale(scale).setSource(FUNCTION).setReplaceFunction(REPLACE).addPostProcess((info) -> { + if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getState())) { + if (random.nextBoolean() && info.getStateUp().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { + info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState() + .with(MossyGlowshroomCapBlock.TRANSITION, true)); return info.getState(); - }) - .fillRecursive(world, blockPos); - + } else if (!EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateUp()) + || !EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateDown())) { + info.setState(EndBlocks.MOSSY_GLOWSHROOM.bark.defaultBlockState()); + return info.getState(); + } + } else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { + if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateDown().getBlock())) { + info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState() + .with(MossyGlowshroomCapBlock.TRANSITION, true)); + return info.getState(); + } + + info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState()); + return info.getState(); + } else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { + for (Direction dir : BlocksHelper.HORIZONTAL) { + if (info.getState(dir) == AIR) { + info.setBlockPos(info.getPos().offset(dir), + EndBlocks.MOSSY_GLOWSHROOM_FUR.defaultBlockState().with(FurBlock.FACING, dir)); + } + } + + if (info.getStateDown().getBlock() != EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { + info.setBlockPos(info.getPos().below(), + EndBlocks.MOSSY_GLOWSHROOM_FUR.defaultBlockState().with(FurBlock.FACING, Direction.DOWN)); + } + } + return info.getState(); + }).fillRecursive(world, blockPos); + return true; } - + static { SDFCappedCone cone1 = new SDFCappedCone().setHeight(2.5F).setRadius1(1.5F).setRadius2(2.5F); SDFCappedCone cone2 = new SDFCappedCone().setHeight(3F).setRadius1(2.5F).setRadius2(13F); SDF posedCone2 = new SDFTranslate().setTranslate(0, 5, 0).setSource(cone2); - SDF posedCone3 = new SDFTranslate().setTranslate(0, 12F, 0).setSource(new SDFScale().setScale(2).setSource(cone2)); + SDF posedCone3 = new SDFTranslate().setTranslate(0, 12F, 0) + .setSource(new SDFScale().setScale(2).setSource(cone2)); SDF upCone = new SDFSubtraction().setSourceA(posedCone2).setSourceB(posedCone3); SDF wave = new SDFFlatWave().setRaysCount(12).setIntensity(1.3F).setSource(upCone); SDF cones = new SDFSmoothUnion().setRadius(3).setSourceA(cone1).setSourceB(wave); - + CONE1 = cone1; CONE2 = cone2; - + SDF innerCone = new SDFTranslate().setTranslate(0, 1.25F, 0).setSource(upCone); innerCone = new SDFScale3D().setScale(1.2F, 1F, 1.2F).setSource(innerCone); cones = new SDFUnion().setSourceA(cones).setSourceB(innerCone); - + SDF glowCone = new SDFCappedCone().setHeight(3F).setRadius1(2F).setRadius2(12.5F); CONE_GLOW = (SDFPrimitive) glowCone; glowCone = new SDFTranslate().setTranslate(0, 4.25F, 0).setSource(glowCone); glowCone = new SDFSubtraction().setSourceA(glowCone).setSourceB(posedCone3); - + cones = new SDFUnion().setSourceA(cones).setSourceB(glowCone); - + OpenSimplexNoise noise = new OpenSimplexNoise(1234); cones = new SDFCoordModify().setFunction((pos) -> { float dist = MHelper.length(pos.getX(), pos.getZ()); - float y = pos.getY() + (float) noise.eval(pos.getX() * 0.1 + CENTER.getX(), pos.getZ() * 0.1 + CENTER.getZ()) * dist * 0.3F - dist * 0.15F; + float y = pos.getY() + + (float) noise.eval(pos.getX() * 0.1 + CENTER.getX(), pos.getZ() * 0.1 + CENTER.getZ()) * dist + * 0.3F + - dist * 0.15F; pos.set(pos.getX(), y, pos.getZ()); }).setSource(cones); - - HEAD_POS = (SDFTranslate) new SDFTranslate().setSource(new SDFTranslate().setTranslate(0, 2.5F, 0).setSource(cones)); - + + HEAD_POS = (SDFTranslate) new SDFTranslate() + .setSource(new SDFTranslate().setTranslate(0, 2.5F, 0).setSource(cones)); + SDF roots = new SDFSphere().setRadius(4F); ROOTS = (SDFPrimitive) roots; roots = new SDFScale3D().setScale(1, 0.7F, 1).setSource(roots); ROOTS_ROT = (SDFFlatWave) new SDFFlatWave().setRaysCount(5).setIntensity(1.5F).setSource(roots); - - FUNCTION = new SDFSmoothUnion().setRadius(4).setSourceB(new SDFUnion().setSourceA(HEAD_POS).setSourceB(ROOTS_ROT)); - + + FUNCTION = new SDFSmoothUnion().setRadius(4) + .setSourceB(new SDFUnion().setSourceA(HEAD_POS).setSourceB(ROOTS_ROT)); + REPLACE = (state) -> { if (state.isIn(EndTags.END_GROUND)) { return true; diff --git a/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java index 5e946403..d3e9ddf0 100644 --- a/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java @@ -4,13 +4,13 @@ import java.util.List; import java.util.Random; import java.util.function.Function; -import net.minecraft.block.BlockState; -import net.minecraft.block.LeavesBlock; -import net.minecraft.block.Material; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.material.Material; import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -33,71 +33,78 @@ public class PythadendronTreeFeature extends DefaultFeature { private static final Function REPLACE; private static final Function IGNORE; private static final Function POST; - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (world.getBlockState(pos.down()).getBlock() != EndBlocks.CHORUS_NYLIUM) return false; + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + if (world.getBlockState(pos.below()).getBlock() != EndBlocks.CHORUS_NYLIUM) + return false; BlocksHelper.setWithoutUpdate(world, pos, AIR); - + float size = MHelper.randRange(10, 20, random); List spline = SplineHelper.makeSpline(0, 0, 0, 0, size, 0, 4); SplineHelper.offsetParts(spline, random, 0.7F, 0, 0.7F); Vector3f last = spline.get(spline.size() - 1); - + int depth = MHelper.floor((size - 10F) * 3F / 10F + 1F); float bsize = (10F - (size - 10F)) / 10F + 1.5F; - branch(last.getX(), last.getY(), last.getZ(), size * bsize, MHelper.randRange(0, MHelper.PI2, random), random, depth, world, pos); - + branch(last.getX(), last.getY(), last.getZ(), size * bsize, MHelper.randRange(0, MHelper.PI2, random), random, + depth, world, pos); + SDF function = SplineHelper.buildSDF(spline, 1.7F, 1.1F, (bpos) -> { - return EndBlocks.PYTHADENDRON.bark.getDefaultState(); + return EndBlocks.PYTHADENDRON.bark.defaultBlockState(); }); function.setReplaceFunction(REPLACE); function.addPostProcess(POST); function.fillRecursive(world, pos); - + return true; } - - private void branch(float x, float y, float z, float size, float angle, Random random, int depth, StructureWorldAccess world, BlockPos pos) { - if (depth == 0) return; - + + private void branch(float x, float y, float z, float size, float angle, Random random, int depth, + StructureWorldAccess world, BlockPos pos) { + if (depth == 0) + return; + float dx = (float) Math.cos(angle) * size * 0.15F; float dz = (float) Math.sin(angle) * size * 0.15F; - + float x1 = x + dx; float z1 = z + dz; float x2 = x - dx; float z2 = z - dz; - + List spline = SplineHelper.makeSpline(x, y, z, x1, y, z1, 5); SplineHelper.powerOffset(spline, size * MHelper.randRange(1.0F, 2.0F, random), 4); SplineHelper.offsetParts(spline, random, 0.3F, 0, 0.3F); Vector3f pos1 = spline.get(spline.size() - 1); - - boolean s1 = SplineHelper.fillSpline(spline, world, EndBlocks.PYTHADENDRON.bark.getDefaultState(), pos, REPLACE); - + + boolean s1 = SplineHelper.fillSpline(spline, world, EndBlocks.PYTHADENDRON.bark.defaultBlockState(), pos, + REPLACE); + spline = SplineHelper.makeSpline(x, y, z, x2, y, z2, 5); SplineHelper.powerOffset(spline, size * MHelper.randRange(1.0F, 2.0F, random), 4); SplineHelper.offsetParts(spline, random, 0.3F, 0, 0.3F); Vector3f pos2 = spline.get(spline.size() - 1); - - boolean s2 = SplineHelper.fillSpline(spline, world, EndBlocks.PYTHADENDRON.bark.getDefaultState(), pos, REPLACE); - + + boolean s2 = SplineHelper.fillSpline(spline, world, EndBlocks.PYTHADENDRON.bark.defaultBlockState(), pos, + REPLACE); + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt()); if (depth < 3) { if (s1) { - leavesBall(world, pos.add(pos1.getX(), pos1.getY(), pos1.getZ()), random, noise); + leavesBall(world, pos.offset(pos1.getX(), pos1.getY(), pos1.getZ()), random, noise); } if (s2) { - leavesBall(world, pos.add(pos2.getX(), pos2.getY(), pos2.getZ()), random, noise); + leavesBall(world, pos.offset(pos2.getX(), pos2.getY(), pos2.getZ()), random, noise); } } - + float size1 = size * MHelper.randRange(0.75F, 0.95F, random); float size2 = size * MHelper.randRange(0.75F, 0.95F, random); float angle1 = angle + (float) Math.PI * 0.5F + MHelper.randRange(-0.1F, 0.1F, random); float angle2 = angle + (float) Math.PI * 0.5F + MHelper.randRange(-0.1F, 0.1F, random); - + if (s1) { branch(pos1.getX(), pos1.getY(), pos1.getZ(), size1, angle1, random, depth - 1, world, pos); } @@ -105,25 +112,31 @@ public class PythadendronTreeFeature extends DefaultFeature { branch(pos2.getX(), pos2.getY(), pos2.getZ(), size2, angle2, random, depth - 1, world, pos); } } - + private void leavesBall(StructureWorldAccess world, BlockPos pos, Random random, OpenSimplexNoise noise) { float radius = MHelper.randRange(4.5F, 6.5F, random); - - SDF sphere = new SDFSphere().setRadius(radius).setBlock(EndBlocks.PYTHADENDRON_LEAVES.getDefaultState().with(LeavesBlock.DISTANCE, 6)); + + SDF sphere = new SDFSphere().setRadius(radius) + .setBlock(EndBlocks.PYTHADENDRON_LEAVES.defaultBlockState().with(LeavesBlock.DISTANCE, 6)); sphere = new SDFScale3D().setScale(1, 0.6F, 1).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; }).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return random.nextFloat() * 3F - 1.5F; }).setSource(sphere); - sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); - Mutable mut = new Mutable(); + sphere = new SDFDisplacement().setFunction((vec) -> { + return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; + }).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> { + return random.nextFloat() * 3F - 1.5F; + }).setSource(sphere); + sphere = new SDFSubtraction().setSourceA(sphere) + .setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); + MutableBlockPos mut = new MutableBlockPos(); sphere.addPostProcess((info) -> { if (random.nextInt(5) == 0) { - for (Direction dir: Direction.values()) { + for (Direction dir : Direction.values()) { BlockState state = info.getState(dir, 2); if (state.isAir()) { return info.getState(); } } - info.setState(EndBlocks.PYTHADENDRON.bark.getDefaultState()); + info.setState(EndBlocks.PYTHADENDRON.bark.defaultBlockState()); for (int x = -6; x < 7; x++) { int ax = Math.abs(x); mut.setX(x + info.getPos().getX()); @@ -137,7 +150,7 @@ public class PythadendronTreeFeature extends DefaultFeature { mut.setY(y + info.getPos().getY()); BlockState state = info.getState(mut); if (state.getBlock() instanceof LeavesBlock) { - int distance = state.get(LeavesBlock.DISTANCE); + int distance = state.getValue(LeavesBlock.DISTANCE); if (d < distance) { info.setState(mut, state.with(LeavesBlock.DISTANCE, d)); } @@ -151,7 +164,7 @@ public class PythadendronTreeFeature extends DefaultFeature { }); sphere.fillRecursiveIgnore(world, pos, IGNORE); } - + static { REPLACE = (state) -> { if (state.isIn(EndTags.END_GROUND)) { @@ -165,14 +178,15 @@ public class PythadendronTreeFeature extends DefaultFeature { } return state.getMaterial().isReplaceable(); }; - + IGNORE = (state) -> { return EndBlocks.PYTHADENDRON.isTreeLog(state); }; - + POST = (info) -> { - if (EndBlocks.PYTHADENDRON.isTreeLog(info.getStateUp()) && EndBlocks.PYTHADENDRON.isTreeLog(info.getStateDown())) { - return EndBlocks.PYTHADENDRON.log.getDefaultState(); + if (EndBlocks.PYTHADENDRON.isTreeLog(info.getStateUp()) + && EndBlocks.PYTHADENDRON.isTreeLog(info.getStateDown())) { + return EndBlocks.PYTHADENDRON.log.defaultBlockState(); } return info.getState(); }; diff --git a/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java b/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java index 5fba3b10..1ebf07b3 100644 --- a/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java @@ -6,13 +6,13 @@ import java.util.function.Function; import com.google.common.collect.Lists; -import net.minecraft.block.BlockState; -import net.minecraft.block.LeavesBlock; -import net.minecraft.block.Material; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.material.Material; import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -39,14 +39,16 @@ public class TenaneaFeature extends DefaultFeature { private static final Function REPLACE; private static final Function IGNORE; private static final List SPLINE; - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; - + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + return false; + float size = MHelper.randRange(7, 10, random); int count = (int) (size * 0.45F); - float var = MHelper.PI2 / (float) (count * 3); + float var = MHelper.PI2 / (float) (count * 3); float start = MHelper.randRange(0, MHelper.PI2, random); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2 + MHelper.randRange(0, var, random) + start; @@ -54,63 +56,72 @@ public class TenaneaFeature extends DefaultFeature { SplineHelper.rotateSpline(spline, angle); SplineHelper.scale(spline, size + MHelper.randRange(0, size * 0.5F, random)); SplineHelper.offsetParts(spline, random, 1F, 0, 1F); - SplineHelper.fillSpline(spline, world, EndBlocks.TENANEA.bark.getDefaultState(), pos, REPLACE); + SplineHelper.fillSpline(spline, world, EndBlocks.TENANEA.bark.defaultBlockState(), pos, REPLACE); Vector3f last = spline.get(spline.size() - 1); float leavesRadius = (size * 0.3F + MHelper.randRange(0.8F, 1.5F, random)) * 1.4F; OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); - leavesBall(world, pos.add(last.getX(), last.getY(), last.getZ()), leavesRadius, random, noise); + leavesBall(world, pos.offset(last.getX(), last.getY(), last.getZ()), leavesRadius, random, noise); } - + return true; } - - private void leavesBall(StructureWorldAccess world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) { - SDF sphere = new SDFSphere().setRadius(radius).setBlock(EndBlocks.TENANEA_LEAVES.getDefaultState().with(LeavesBlock.DISTANCE, 6)); + + private void leavesBall(StructureWorldAccess world, BlockPos pos, float radius, Random random, + OpenSimplexNoise noise) { + SDF sphere = new SDFSphere().setRadius(radius) + .setBlock(EndBlocks.TENANEA_LEAVES.defaultBlockState().with(LeavesBlock.DISTANCE, 6)); SDF sub = new SDFScale().setScale(5).setSource(sphere); sub = new SDFTranslate().setTranslate(0, -radius * 5, 0).setSource(sub); sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sub); sphere = new SDFScale3D().setScale(1, 0.75F, 1).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 2F; }).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> { return MHelper.randRange(-1.5F, 1.5F, random); }).setSource(sphere); - - Mutable mut = new Mutable(); - for (Direction d1: BlocksHelper.HORIZONTAL) { + sphere = new SDFDisplacement().setFunction((vec) -> { + return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 2F; + }).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> { + return MHelper.randRange(-1.5F, 1.5F, random); + }).setSource(sphere); + + MutableBlockPos mut = new MutableBlockPos(); + for (Direction d1 : BlocksHelper.HORIZONTAL) { BlockPos p = mut.set(pos).move(Direction.UP).move(d1).toImmutable(); - BlocksHelper.setWithoutUpdate(world, p, EndBlocks.TENANEA.bark.getDefaultState()); - for (Direction d2: BlocksHelper.HORIZONTAL) { + BlocksHelper.setWithoutUpdate(world, p, EndBlocks.TENANEA.bark.defaultBlockState()); + for (Direction d2 : BlocksHelper.HORIZONTAL) { mut.set(p).move(Direction.UP).move(d2); - BlocksHelper.setWithoutUpdate(world, p, EndBlocks.TENANEA.bark.getDefaultState()); + BlocksHelper.setWithoutUpdate(world, p, EndBlocks.TENANEA.bark.defaultBlockState()); } } - - BlockState top = EndBlocks.TENANEA_FLOWERS.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP); - BlockState middle = EndBlocks.TENANEA_FLOWERS.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE); - BlockState bottom = EndBlocks.TENANEA_FLOWERS.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM); - BlockState outer = EndBlocks.TENANEA_OUTER_LEAVES.getDefaultState(); - + + BlockState top = EndBlocks.TENANEA_FLOWERS.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, + TripleShape.TOP); + BlockState middle = EndBlocks.TENANEA_FLOWERS.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, + TripleShape.MIDDLE); + BlockState bottom = EndBlocks.TENANEA_FLOWERS.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, + TripleShape.BOTTOM); + BlockState outer = EndBlocks.TENANEA_OUTER_LEAVES.defaultBlockState(); + List support = Lists.newArrayList(); sphere.addPostProcess((info) -> { if (random.nextInt(6) == 0 && info.getStateDown().isAir()) { - BlockPos d = info.getPos().down(); + BlockPos d = info.getPos().below(); support.add(d); } if (random.nextInt(5) == 0) { - for (Direction dir: Direction.values()) { + for (Direction dir : Direction.values()) { BlockState state = info.getState(dir, 2); if (state.isAir()) { return info.getState(); } } - info.setState(EndBlocks.TENANEA.bark.getDefaultState()); + info.setState(EndBlocks.TENANEA.bark.defaultBlockState()); } - + MHelper.shuffle(DIRECTIONS, random); - for (Direction d: DIRECTIONS) { + for (Direction d : DIRECTIONS) { if (info.getState(d).isAir()) { info.setBlockPos(info.getPos().offset(d), outer.with(FurBlock.FACING, d)); } } - + if (EndBlocks.TENANEA.isTreeLog(info.getState())) { for (int x = -6; x < 7; x++) { int ax = Math.abs(x); @@ -125,7 +136,7 @@ public class TenaneaFeature extends DefaultFeature { mut.setY(y + info.getPos().getY()); BlockState state = info.getState(mut); if (state.getBlock() instanceof LeavesBlock) { - int distance = state.get(LeavesBlock.DISTANCE); + int distance = state.getValue(LeavesBlock.DISTANCE); if (d < distance) { info.setState(mut, state.with(LeavesBlock.DISTANCE, d)); } @@ -139,20 +150,19 @@ public class TenaneaFeature extends DefaultFeature { }); sphere.fillRecursiveIgnore(world, pos, IGNORE); BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.TENANEA.bark); - + support.forEach((bpos) -> { BlockState state = world.getBlockState(bpos); - if (state.isAir() || state.isOf(EndBlocks.TENANEA_OUTER_LEAVES)) { + if (state.isAir() || state.is(EndBlocks.TENANEA_OUTER_LEAVES)) { int count = MHelper.randRange(3, 8, random); mut.set(bpos); - if (world.getBlockState(mut.up()).isOf(EndBlocks.TENANEA_LEAVES)) { + if (world.getBlockState(mut.up()).is(EndBlocks.TENANEA_LEAVES)) { BlocksHelper.setWithoutUpdate(world, mut, top); for (int i = 1; i < count; i++) { mut.setY(mut.getY() - 1); - if (world.isAir(mut.down())) { + if (world.isAir(mut.below())) { BlocksHelper.setWithoutUpdate(world, mut, middle); - } - else { + } else { break; } } @@ -161,7 +171,7 @@ public class TenaneaFeature extends DefaultFeature { } }); } - + static { REPLACE = (state) -> { if (state.isIn(EndTags.END_GROUND)) { @@ -175,18 +185,13 @@ public class TenaneaFeature extends DefaultFeature { } return state.getMaterial().isReplaceable(); }; - + IGNORE = (state) -> { return EndBlocks.TENANEA.isTreeLog(state); }; - - SPLINE = Lists.newArrayList( - new Vector3f(0.00F, 0.00F, 0.00F), - new Vector3f(0.10F, 0.35F, 0.00F), - new Vector3f(0.20F, 0.50F, 0.00F), - new Vector3f(0.30F, 0.55F, 0.00F), - new Vector3f(0.42F, 0.70F, 0.00F), - new Vector3f(0.50F, 1.00F, 0.00F) - ); + + SPLINE = Lists.newArrayList(new Vector3f(0.00F, 0.00F, 0.00F), new Vector3f(0.10F, 0.35F, 0.00F), + new Vector3f(0.20F, 0.50F, 0.00F), new Vector3f(0.30F, 0.55F, 0.00F), new Vector3f(0.42F, 0.70F, 0.00F), + new Vector3f(0.50F, 1.00F, 0.00F)); } } diff --git a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java index afd979bd..fe0351db 100644 --- a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java @@ -6,13 +6,13 @@ import java.util.function.Function; import com.google.common.collect.Lists; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.MathHelper; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.Mth; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -38,77 +38,83 @@ public class UmbrellaTreeFeature extends DefaultFeature { private static final Function REPLACE; private static final List SPLINE; private static final List ROOT; - + @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; - - BlockState wood = EndBlocks.UMBRELLA_TREE.bark.getDefaultState(); - BlockState membrane = EndBlocks.UMBRELLA_TREE_MEMBRANE.getDefaultState().with(UmbrellaTreeMembraneBlock.COLOR, 1); - BlockState center = EndBlocks.UMBRELLA_TREE_MEMBRANE.getDefaultState().with(UmbrellaTreeMembraneBlock.COLOR, 0); - BlockState fruit = EndBlocks.UMBRELLA_TREE_CLUSTER.getDefaultState().with(UmbrellaTreeClusterBlock.NATURAL, true); - + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + DefaultFeatureConfig config) { + if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + return false; + + BlockState wood = EndBlocks.UMBRELLA_TREE.bark.defaultBlockState(); + BlockState membrane = EndBlocks.UMBRELLA_TREE_MEMBRANE.defaultBlockState().with(UmbrellaTreeMembraneBlock.COLOR, + 1); + BlockState center = EndBlocks.UMBRELLA_TREE_MEMBRANE.defaultBlockState().with(UmbrellaTreeMembraneBlock.COLOR, + 0); + BlockState fruit = EndBlocks.UMBRELLA_TREE_CLUSTER.defaultBlockState().with(UmbrellaTreeClusterBlock.NATURAL, + true); + float size = MHelper.randRange(10, 20, random); int count = (int) (size * 0.15F); - float var = MHelper.PI2 / (float) (count * 3); + float var = MHelper.PI2 / (float) (count * 3); float start = MHelper.randRange(0, MHelper.PI2, random); SDF sdf = null; List
    centers = Lists.newArrayList(); - + float scale = 1; if (config != null) { scale = MHelper.randRange(1F, 1.7F, random); } - + for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2 + MHelper.randRange(0, var, random) + start; List spline = SplineHelper.copySpline(SPLINE); float sizeXZ = (size + MHelper.randRange(0, size * 0.5F, random)) * 0.7F; SplineHelper.scale(spline, sizeXZ, sizeXZ * MHelper.randRange(1F, 2F, random), sizeXZ); - //SplineHelper.offset(spline, new Vector3f((20 - size) * 0.2F, 0, 0)); + // SplineHelper.offset(spline, new Vector3f((20 - size) * 0.2F, 0, 0)); SplineHelper.rotateSpline(spline, angle); SplineHelper.offsetParts(spline, random, 0.5F, 0, 0.5F); - + if (SplineHelper.canGenerate(spline, pos, world, REPLACE)) { float rScale = (scale - 1) * 0.4F + 1; SDF branch = SplineHelper.buildSDF(spline, 1.2F * rScale, 0.8F * rScale, (bpos) -> { return wood; }); - + Vector3f vec = spline.get(spline.size() - 1); float radius = (size + MHelper.randRange(0, size * 0.5F, random)) * 0.4F; - + sdf = (sdf == null) ? branch : new SDFUnion().setSourceA(sdf).setSourceB(branch); SDF mem = makeMembrane(world, radius, random, membrane, center); - + float px = MHelper.floor(vec.getX()) + 0.5F; float py = MHelper.floor(vec.getY()) + 0.5F; float pz = MHelper.floor(vec.getZ()) + 0.5F; mem = new SDFTranslate().setTranslate(px, py, pz).setSource(mem); sdf = new SDFSmoothUnion().setRadius(2).setSourceA(sdf).setSourceB(mem); - centers.add(new Center(pos.getX() + (double) (px * scale), pos.getY() + (double) (py * scale), pos.getZ() + (double) (pz * scale), radius * scale)); - + centers.add(new Center(pos.getX() + (double) (px * scale), pos.getY() + (double) (py * scale), + pos.getZ() + (double) (pz * scale), radius * scale)); + vec = spline.get(0); } } - + if (sdf == null) { return false; } - + if (scale > 1) { sdf = new SDFScale().setScale(scale).setSource(sdf); } - + sdf.setReplaceFunction(REPLACE).addPostProcess((info) -> { - if (EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateUp()) && EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateDown())) { - return EndBlocks.UMBRELLA_TREE.log.getDefaultState(); - } - else if (info.getState().equals(membrane)) { + if (EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateUp()) + && EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateDown())) { + return EndBlocks.UMBRELLA_TREE.log.defaultBlockState(); + } else if (info.getState().equals(membrane)) { Center min = centers.get(0); double d = Double.MAX_VALUE; BlockPos bpos = info.getPos(); - for (Center c: centers) { + for (Center c : centers) { double d2 = c.distance(bpos.getX(), bpos.getZ()); if (d2 < d) { d = d2; @@ -116,14 +122,14 @@ public class UmbrellaTreeFeature extends DefaultFeature { } } int color = MHelper.floor(d / min.radius * 7); - color = MathHelper.clamp(color, 1, 7); + color = Mth.clamp(color, 1, 7); return info.getState().with(UmbrellaTreeMembraneBlock.COLOR, color); } return info.getState(); }).fillRecursive(world, pos); makeRoots(world, pos, (size * 0.5F + 3) * scale, random, wood); - - for (Center c: centers) { + + for (Center c : centers) { if (!world.getBlockState(new BlockPos(c.px, c.py, c.pz)).isAir()) { count = MHelper.floor(MHelper.randRange(5F, 10F, random) * scale); float startAngle = random.nextFloat() * MHelper.PI2; @@ -136,99 +142,93 @@ public class UmbrellaTreeFeature extends DefaultFeature { } } } - + return true; } - + private void makeRoots(StructureWorldAccess world, BlockPos pos, float radius, Random random, BlockState wood) { int count = (int) (radius * 1.5F); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2; float scale = radius * MHelper.randRange(0.85F, 1.15F, random); - + List branch = SplineHelper.copySpline(ROOT); SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); Vector3f last = branch.get(branch.size() - 1); - if (world.getBlockState(pos.add(last.getX(), last.getY(), last.getZ())).isIn(EndTags.GEN_TERRAIN)) { + if (world.getBlockState(pos.offset(last.getX(), last.getY(), last.getZ())).isIn(EndTags.GEN_TERRAIN)) { SplineHelper.fillSplineForce(branch, world, wood, pos, REPLACE); } } } - - private SDF makeMembrane(StructureWorldAccess world, float radius, Random random, BlockState membrane, BlockState center) { + + private SDF makeMembrane(StructureWorldAccess world, float radius, Random random, BlockState membrane, + BlockState center) { SDF sphere = new SDFSphere().setRadius(radius).setBlock(membrane); SDF sub = new SDFTranslate().setTranslate(0, -4, 0).setSource(sphere); sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sub); sphere = new SDFScale3D().setScale(1, 0.5F, 1).setSource(sphere); sphere = new SDFTranslate().setTranslate(0, 1 - radius * 0.5F, 0).setSource(sphere); - + float angle = random.nextFloat() * MHelper.PI2; int count = (int) MHelper.randRange(radius, radius * 2, random); if (count < 5) { count = 5; } sphere = new SDFFlatWave().setAngle(angle).setRaysCount(count).setIntensity(0.6F).setSource(sphere); - + SDF cent = new SDFSphere().setRadius(2.5F).setBlock(center); sphere = new SDFUnion().setSourceA(sphere).setSourceB(cent); - + return sphere; } - - private void makeFruits(StructureWorldAccess world, double px, double py, double pz, BlockState fruit, float scale) { - Mutable mut = new Mutable().set(px, py, pz); + + private void makeFruits(StructureWorldAccess world, double px, double py, double pz, BlockState fruit, + float scale) { + MutableBlockPos mut = new MutableBlockPos().set(px, py, pz); for (int i = 0; i < 8; i++) { mut.move(Direction.DOWN); if (world.isAir(mut)) { BlockState state = world.getBlockState(mut.up()); - if (state.isOf(EndBlocks.UMBRELLA_TREE_MEMBRANE) && state.get(UmbrellaTreeMembraneBlock.COLOR) < 2) { + if (state.is(EndBlocks.UMBRELLA_TREE_MEMBRANE) && state.getValue(UmbrellaTreeMembraneBlock.COLOR) < 2) { BlocksHelper.setWithoutUpdate(world, mut, fruit); } break; } } } - + static { - SPLINE = Lists.newArrayList( - new Vector3f(0.00F, 0.00F, 0.00F), - new Vector3f(0.10F, 0.35F, 0.00F), - new Vector3f(0.20F, 0.50F, 0.00F), - new Vector3f(0.30F, 0.55F, 0.00F), - new Vector3f(0.42F, 0.70F, 0.00F), - new Vector3f(0.50F, 1.00F, 0.00F) - ); - - ROOT = Lists.newArrayList( - new Vector3f(0.1F, 0.70F, 0), - new Vector3f(0.3F, 0.30F, 0), - new Vector3f(0.7F, 0.05F, 0), - new Vector3f(0.8F, -0.20F, 0) - ); + SPLINE = Lists.newArrayList(new Vector3f(0.00F, 0.00F, 0.00F), new Vector3f(0.10F, 0.35F, 0.00F), + new Vector3f(0.20F, 0.50F, 0.00F), new Vector3f(0.30F, 0.55F, 0.00F), new Vector3f(0.42F, 0.70F, 0.00F), + new Vector3f(0.50F, 1.00F, 0.00F)); + + ROOT = Lists.newArrayList(new Vector3f(0.1F, 0.70F, 0), new Vector3f(0.3F, 0.30F, 0), + new Vector3f(0.7F, 0.05F, 0), new Vector3f(0.8F, -0.20F, 0)); SplineHelper.offset(ROOT, new Vector3f(0, -0.45F, 0)); - + REPLACE = (state) -> { - if (state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) || state.isOf(EndBlocks.UMBRELLA_TREE_MEMBRANE)) { + if (state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) + || state.is(EndBlocks.UMBRELLA_TREE_MEMBRANE)) { return true; } return state.getMaterial().isReplaceable(); }; } - + private class Center { final double px; final double py; final double pz; final float radius; - + Center(double x, double y, double z, float radius) { this.px = x; this.py = y; this.pz = z; this.radius = radius; } - + double distance(float x, float z) { return MHelper.length(px - x, pz - z); } diff --git a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java index 2c808ebe..b8ef0b75 100644 --- a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java +++ b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java @@ -7,7 +7,7 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.util.math.noise.SimplexNoiseSampler; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; import net.minecraft.util.registry.RegistryLookupCodec; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeKeys; @@ -40,14 +40,14 @@ public class BetterEndBiomeSource extends BiomeSource { public BetterEndBiomeSource(Registry biomeRegistry, long seed) { super(getBiomes(biomeRegistry)); - + this.mapLand = new BiomeMap(seed, GeneratorOptions.getBiomeSizeLand(), EndBiomes.LAND_BIOMES); this.mapVoid = new BiomeMap(seed, GeneratorOptions.getBiomeSizeVoid(), EndBiomes.VOID_BIOMES); this.centerBiome = biomeRegistry.getOrThrow(BiomeKeys.THE_END); this.barrens = biomeRegistry.getOrThrow(BiomeKeys.END_BARRENS); this.biomeRegistry = biomeRegistry; this.seed = seed; - + ChunkRandom chunkRandom = new ChunkRandom(seed); chunkRandom.consume(17292); this.noise = new SimplexNoiseSampler(chunkRandom); @@ -56,7 +56,7 @@ public class BetterEndBiomeSource extends BiomeSource { EndTags.addTerrainTags(biomeRegistry); FeaturesHelper.addFeatures(biomeRegistry); } - + private static List getBiomes(Registry biomeRegistry) { List list = Lists.newArrayList(); biomeRegistry.forEach((biome) -> { @@ -72,53 +72,53 @@ public class BetterEndBiomeSource extends BiomeSource { boolean hasVoid = !GeneratorOptions.useNewGenerator() || !GeneratorOptions.noRingVoid(); long i = (long) biomeX * (long) biomeX; long j = (long) biomeZ * (long) biomeZ; - + long dist = i + j; if (hasVoid) { - if (dist <= 65536L) return this.centerBiome; - } - else if (dist <= 625L) { + if (dist <= 65536L) + return this.centerBiome; + } else if (dist <= 625L) { dist += noise.sample(i * 0.2, j * 0.2) * 10; if (dist <= 625L) { return this.centerBiome; } } - + if (biomeX == 0 && biomeZ == 0) { mapLand.clearCache(); mapVoid.clearCache(); } - + if (GeneratorOptions.useNewGenerator()) { if (TerrainGenerator.isLand(biomeX, biomeZ)) { return mapLand.getBiome(biomeX << 2, biomeZ << 2).getActualBiome(); - } - else { + } else { return mapVoid.getBiome(biomeX << 2, biomeZ << 2).getActualBiome(); } - } - else { - float height = TheEndBiomeSource.getNoiseAt(noise, (biomeX >> 1) + 1, (biomeZ >> 1) + 1) + (float) SMALL_NOISE.eval(biomeX, biomeZ) * 5; - + } else { + float height = TheEndBiomeSource.getNoiseAt(noise, (biomeX >> 1) + 1, (biomeZ >> 1) + 1) + + (float) SMALL_NOISE.eval(biomeX, biomeZ) * 5; + if (height > -20F && height < -5F) { return barrens; } - - EndBiome endBiome = height < -10F ? mapVoid.getBiome(biomeX << 2, biomeZ << 2) : mapLand.getBiome(biomeX << 2, biomeZ << 2); + + EndBiome endBiome = height < -10F ? mapVoid.getBiome(biomeX << 2, biomeZ << 2) + : mapLand.getBiome(biomeX << 2, biomeZ << 2); return endBiome.getActualBiome(); } } - + public Biome getLandBiome(int biomeX, int biomeY, int biomeZ) { boolean hasVoid = !GeneratorOptions.useNewGenerator() || !GeneratorOptions.noRingVoid(); long i = (long) biomeX * (long) biomeX; long j = (long) biomeZ * (long) biomeZ; - + long dist = i + j; if (hasVoid) { - if (dist <= 65536L) return this.centerBiome; - } - else if (dist <= 625L) { + if (dist <= 65536L) + return this.centerBiome; + } else if (dist <= 625L) { dist += noise.sample(i * 0.2, j * 0.2) * 10; if (dist <= 625L) { return this.centerBiome; diff --git a/src/main/java/ru/betterend/world/generator/BiomePicker.java b/src/main/java/ru/betterend/world/generator/BiomePicker.java index 050ab133..159f4a53 100644 --- a/src/main/java/ru/betterend/world/generator/BiomePicker.java +++ b/src/main/java/ru/betterend/world/generator/BiomePicker.java @@ -7,49 +7,49 @@ import java.util.Set; import com.google.common.collect.Lists; import com.google.common.collect.Sets; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import ru.betterend.world.biome.EndBiome; public class BiomePicker { - private final Set immutableIDs = Sets.newHashSet(); + private final Set immutableIDs = Sets.newHashSet(); private final List biomes = Lists.newArrayList(); private float maxChanceUnmutable = 0; private float maxChance = 0; private int biomeCount = 0; private WeighTree tree; - + public void addBiome(EndBiome biome) { maxChance = biome.mutateGenChance(maxChance); immutableIDs.add(biome.getID()); maxChanceUnmutable = maxChance; biomes.add(biome); - biomeCount ++; + biomeCount++; } - + public void addBiomeMutable(EndBiome biome) { biomes.add(biome); } - + public void clearMutables() { maxChance = maxChanceUnmutable; for (int i = biomes.size() - 1; i >= biomeCount; i--) { biomes.remove(i); } } - + public EndBiome getBiome(Random random) { return biomes.isEmpty() ? null : tree.getBiome(random.nextFloat() * maxChance); } - + public List getBiomes() { return biomes; } - - public boolean containsImmutable(Identifier id) { + + public boolean containsImmutable(ResourceLocation id) { return immutableIDs.contains(id); } - - public void removeMutableBiome(Identifier id) { + + public void removeMutableBiome(ResourceLocation id) { for (int i = biomeCount; i < biomes.size(); i++) { EndBiome biome = biomes.get(i); if (biome.getID().equals(id)) { @@ -58,7 +58,7 @@ public class BiomePicker { } } } - + public void rebuild() { if (biomes.isEmpty()) { return; diff --git a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java index 6c0918ff..7db78346 100644 --- a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java +++ b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java @@ -1,7 +1,7 @@ package ru.betterend.world.generator; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; import ru.betterend.config.Configs; public class GeneratorOptions { @@ -26,7 +26,7 @@ public class GeneratorOptions { private static BlockPos portal = BlockPos.ORIGIN; private static boolean replacePortal; private static boolean replacePillars; - + public static void init() { biomeSizeLand = Configs.GENERATOR_CONFIG.getInt("biomeMap", "biomeSizeLand", 256); biomeSizeVoid = Configs.GENERATOR_CONFIG.getInt("biomeMap", "biomeSizeVoid", 256); @@ -35,45 +35,47 @@ public class GeneratorOptions { hasDragonFights = Configs.GENERATOR_CONFIG.getBooleanRoot("hasDragonFights", true); swapOverworldToEnd = Configs.GENERATOR_CONFIG.getBooleanRoot("swapOverworldToEnd", false); changeChorusPlant = Configs.GENERATOR_CONFIG.getBoolean("chorusPlant", "changeChorusPlant", true); - removeChorusFromVanillaBiomes = Configs.GENERATOR_CONFIG.getBoolean("chorusPlant", "removeChorusFromVanillaBiomes", true); + removeChorusFromVanillaBiomes = Configs.GENERATOR_CONFIG.getBoolean("chorusPlant", + "removeChorusFromVanillaBiomes", true); newGenerator = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "useNewGenerator", true); noRingVoid = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "noRingVoid", false); generateCentralIsland = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "generateCentralIsland", true); endCityFailChance = Configs.GENERATOR_CONFIG.getInt("customGenerator", "endCityFailChance", 5); generateObsidianPlatform = Configs.GENERATOR_CONFIG.getBooleanRoot("generateObsidianPlatform", true); - bigOptions = new LayerOptions("customGenerator.layers.bigIslands", Configs.GENERATOR_CONFIG, 300, 200, 70, 10, false); - mediumOptions = new LayerOptions("customGenerator.layers.mediumIslands", Configs.GENERATOR_CONFIG, 150, 100, 70, 20, true); - smallOptions = new LayerOptions("customGenerator.layers.smallIslands", Configs.GENERATOR_CONFIG, 60, 50, 70, 30, false); + bigOptions = new LayerOptions("customGenerator.layers.bigIslands", Configs.GENERATOR_CONFIG, 300, 200, 70, 10, + false); + mediumOptions = new LayerOptions("customGenerator.layers.mediumIslands", Configs.GENERATOR_CONFIG, 150, 100, 70, + 20, true); + smallOptions = new LayerOptions("customGenerator.layers.smallIslands", Configs.GENERATOR_CONFIG, 60, 50, 70, 30, + false); changeSpawn = Configs.GENERATOR_CONFIG.getBoolean("spawn", "changeSpawn", false); - spawn = new BlockPos( - Configs.GENERATOR_CONFIG.getInt("spawn.point", "x", 20), - Configs.GENERATOR_CONFIG.getInt("spawn.point", "y", 65), - Configs.GENERATOR_CONFIG.getInt("spawn.point", "z", 0) - ); + spawn = new BlockPos(Configs.GENERATOR_CONFIG.getInt("spawn.point", "x", 20), + Configs.GENERATOR_CONFIG.getInt("spawn.point", "y", 65), + Configs.GENERATOR_CONFIG.getInt("spawn.point", "z", 0)); replacePortal = Configs.GENERATOR_CONFIG.getBoolean("portal", "customEndPortal", true); replacePillars = Configs.GENERATOR_CONFIG.getBoolean("spikes", "customObsidianSpikes", true); } public static int getBiomeSizeLand() { - return MathHelper.clamp(biomeSizeLand, 1, 8192); + return Mth.clamp(biomeSizeLand, 1, 8192); } - + public static int getBiomeSizeVoid() { - return MathHelper.clamp(biomeSizeVoid, 1, 8192); + return Mth.clamp(biomeSizeVoid, 1, 8192); } public static boolean hasPortal() { return hasPortal; } - + public static boolean hasPillars() { return hasPillars; } - + public static boolean hasDragonFights() { return hasDragonFights; } - + public static boolean swapOverworldToEnd() { return swapOverworldToEnd; } @@ -85,23 +87,23 @@ public class GeneratorOptions { public static boolean removeChorusFromVanillaBiomes() { return removeChorusFromVanillaBiomes; } - + public static boolean noRingVoid() { return noRingVoid; } - + public static boolean useNewGenerator() { return newGenerator; } - + public static boolean hasCentralIsland() { return generateCentralIsland; } - + public static boolean generateObsidianPlatform() { return generateObsidianPlatform; } - + public static int getEndCityFailChance() { return endCityFailChance; } @@ -121,11 +123,11 @@ public class GeneratorOptions { public static void setPortalPos(BlockPos portal) { GeneratorOptions.portal = portal; } - + public static boolean replacePortal() { return replacePortal; } - + public static boolean replacePillars() { return replacePillars; } diff --git a/src/main/java/ru/betterend/world/generator/IslandLayer.java b/src/main/java/ru/betterend/world/generator/IslandLayer.java index 82a7513f..16ea3d49 100644 --- a/src/main/java/ru/betterend/world/generator/IslandLayer.java +++ b/src/main/java/ru/betterend/world/generator/IslandLayer.java @@ -8,7 +8,7 @@ import java.util.Random; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; import ru.betterend.util.sdf.SDF; @@ -22,7 +22,7 @@ public class IslandLayer { private static final Random RANDOM = new Random(); private final SDFRadialNoiseMap noise; private final SDF island; - + private final List positions = new ArrayList(9); private final Map islands = Maps.newHashMap(); private final OpenSimplexNoise density; @@ -30,33 +30,34 @@ public class IslandLayer { private int lastX = Integer.MIN_VALUE; private int lastZ = Integer.MIN_VALUE; private final LayerOptions options; - + public IslandLayer(int seed, LayerOptions options) { this.density = new OpenSimplexNoise(seed); this.options = options; this.seed = seed; - + SDF cone1 = makeCone(0, 0.4F, 0.2F, -0.3F); SDF cone2 = makeCone(0.4F, 0.5F, 0.1F, -0.1F); SDF cone3 = makeCone(0.5F, 0.45F, 0.03F, 0.0F); SDF cone4 = makeCone(0.45F, 0, 0.02F, 0.03F); - + SDF coneBottom = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone1).setSourceB(cone2); SDF coneTop = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone3).setSourceB(cone4); - noise = (SDFRadialNoiseMap) new SDFRadialNoiseMap().setSeed(seed).setRadius(0.5F).setIntensity(0.2F).setSource(coneTop); + noise = (SDFRadialNoiseMap) new SDFRadialNoiseMap().setSeed(seed).setRadius(0.5F).setIntensity(0.2F) + .setSource(coneTop); island = new SDFSmoothUnion().setRadius(0.01F).setSourceA(noise).setSourceB(coneBottom); } - + private int getSeed(int x, int z) { int h = seed + x * 374761393 + z * 668265263; h = (h ^ (h >> 13)) * 1274126177; return h ^ (h >> 16); } - + public void updatePositions(double x, double z) { int ix = MHelper.floor(x / options.distance); int iz = MHelper.floor(z / options.distance); - + if (lastX != ix || lastZ != iz) { lastX = ix; lastZ = iz; @@ -79,7 +80,7 @@ public class IslandLayer { } } } - + if (GeneratorOptions.hasCentralIsland() && ix < 4 && iz < 4 && ix > -4 && iz > -4) { List remove = Lists.newArrayList(); positions.forEach((pos) -> { @@ -94,14 +95,13 @@ public class IslandLayer { } } } - + private SDF getIsland(BlockPos pos) { SDF island = islands.get(pos); if (island == null) { if (pos.getX() == 0 && pos.getZ() == 0) { island = new SDFScale().setScale(1.3F).setSource(this.island); - } - else { + } else { RANDOM.setSeed(getSeed(pos.getX(), pos.getZ())); island = new SDFScale().setScale(RANDOM.nextFloat() + 0.5F).setSource(this.island); } @@ -110,78 +110,74 @@ public class IslandLayer { noise.setOffset(pos.getX(), pos.getZ()); return island; } - + private float getRelativeDistance(SDF sdf, BlockPos center, double px, double py, double pz) { float x = (float) (px - center.getX()) / options.scale; float y = (float) (py - center.getY()) / options.scale; float z = (float) (pz - center.getZ()) / options.scale; return sdf.getDistance(x, y, z); } - + private float calculateSDF(double x, double y, double z) { float distance = 10; - for (BlockPos pos: positions) { + for (BlockPos pos : positions) { SDF island = getIsland(pos); float dist = getRelativeDistance(island, pos, x, y, z); distance = MHelper.min(distance, dist); } return distance; } - + public float getDensity(double x, double y, double z) { return -calculateSDF(x, y, z); } - + public float getDensity(double x, double y, double z, float height) { noise.setIntensity(height); noise.setRadius(0.5F / (1 + height)); return -calculateSDF(x, y, z); } - + public void clearCache() { if (islands.size() > 128) { islands.clear(); } } - + private static SDF makeCone(float radiusBottom, float radiusTop, float height, float minY) { float hh = height * 0.5F; SDF sdf = new SDFCappedCone().setHeight(hh).setRadius1(radiusBottom).setRadius2(radiusTop); return new SDFTranslate().setTranslate(0, minY + hh, 0).setSource(sdf); } - - /*private static NativeImage loadMap(String path) { - InputStream stream = IslandLayer.class.getResourceAsStream(path); - if (stream != null) { - try { - NativeImage map = NativeImage.read(stream); - stream.close(); - return map; - } - catch (IOException e) { - BetterEnd.LOGGER.warning(e.getMessage()); - } - } - return null; - }*/ - - /*static { - NativeImage map = loadMap("/assets/" + BetterEnd.MOD_ID + "/textures/heightmaps/mountain_1.png"); - - SDF cone1 = makeCone(0, 0.4F, 0.2F, -0.3F); - SDF cone2 = makeCone(0.4F, 0.5F, 0.1F, -0.1F); - SDF cone3 = makeCone(0.5F, 0.45F, 0.03F, 0.0F); - SDF cone4 = makeCone(0.45F, 0, 0.02F, 0.03F); - - SDF coneBottom = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone1).setSourceB(cone2); - SDF coneTop = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone3).setSourceB(cone4); - - SDF map1 = new SDFHeightmap().setMap(map).setIntensity(0.3F).setSource(coneTop); - NOISE = (SDFRadialNoiseMap) new SDFRadialNoiseMap().setSource(coneTop); - - ISLAND = new SDF[] { - new SDFSmoothUnion().setRadius(0.01F).setSourceA(coneTop).setSourceB(coneBottom), - new SDFSmoothUnion().setRadius(0.01F).setSourceA(map1).setSourceB(coneBottom) - }; - }*/ + + /* + * private static NativeImage loadMap(String path) { InputStream stream = + * IslandLayer.class.getResourceAsStream(path); if (stream != null) { try { + * NativeImage map = NativeImage.read(stream); stream.close(); return map; } + * catch (IOException e) { BetterEnd.LOGGER.warning(e.getMessage()); } } return + * null; } + */ + + /* + * static { NativeImage map = loadMap("/assets/" + BetterEnd.MOD_ID + + * "/textures/heightmaps/mountain_1.png"); + * + * SDF cone1 = makeCone(0, 0.4F, 0.2F, -0.3F); SDF cone2 = makeCone(0.4F, 0.5F, + * 0.1F, -0.1F); SDF cone3 = makeCone(0.5F, 0.45F, 0.03F, 0.0F); SDF cone4 = + * makeCone(0.45F, 0, 0.02F, 0.03F); + * + * SDF coneBottom = new + * SDFSmoothUnion().setRadius(0.02F).setSourceA(cone1).setSourceB(cone2); SDF + * coneTop = new + * SDFSmoothUnion().setRadius(0.02F).setSourceA(cone3).setSourceB(cone4); + * + * SDF map1 = new + * SDFHeightmap().setMap(map).setIntensity(0.3F).setSource(coneTop); NOISE = + * (SDFRadialNoiseMap) new SDFRadialNoiseMap().setSource(coneTop); + * + * ISLAND = new SDF[] { new + * SDFSmoothUnion().setRadius(0.01F).setSourceA(coneTop).setSourceB(coneBottom), + * new SDFSmoothUnion().setRadius(0.01F).setSourceA(map1).setSourceB(coneBottom) + * }; } + */ } diff --git a/src/main/java/ru/betterend/world/generator/LayerOptions.java b/src/main/java/ru/betterend/world/generator/LayerOptions.java index 8bb35716..95371497 100644 --- a/src/main/java/ru/betterend/world/generator/LayerOptions.java +++ b/src/main/java/ru/betterend/world/generator/LayerOptions.java @@ -1,6 +1,6 @@ package ru.betterend.world.generator; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; import ru.betterend.config.PathConfig; public class LayerOptions { @@ -13,8 +13,9 @@ public class LayerOptions { public final int maxY; public final long centerDist; public final boolean hasCentralIsland; - - public LayerOptions(String name, PathConfig config, float distance, float scale, int center, int heightVariation, boolean hasCentral) { + + public LayerOptions(String name, PathConfig config, float distance, float scale, int center, int heightVariation, + boolean hasCentral) { this.distance = clampDistance(config.getFloat(name, "distance[1-8192]", distance)); this.scale = clampScale(config.getFloat(name, "scale[0.1-1024]", scale)); this.center = clampCenter(config.getInt(name, "averageHeight[0-255]", center)); @@ -22,27 +23,27 @@ public class LayerOptions { this.coverage = clampCoverage(config.getFloat(name, "coverage[0-1]", 0.5F)); this.minY = this.center - this.heightVariation; this.maxY = this.center + this.heightVariation; - this.centerDist = MathHelper.floor(1000 / this.distance); + this.centerDist = Mth.floor(1000 / this.distance); this.hasCentralIsland = config.getBoolean(name, "hasCentralIsland", hasCentral); } - + private float clampDistance(float value) { - return MathHelper.clamp(value, 1, 8192); + return Mth.clamp(value, 1, 8192); } - + private float clampScale(float value) { - return MathHelper.clamp(value, 0.1F, 1024); + return Mth.clamp(value, 0.1F, 1024); } - + private float clampCoverage(float value) { - return 0.9999F - MathHelper.clamp(value, 0, 1) * 2; + return 0.9999F - Mth.clamp(value, 0, 1) * 2; } - + private int clampCenter(int value) { - return MathHelper.clamp(value, 0, 255); + return Mth.clamp(value, 0, 255); } - + private int clampVariation(int value) { - return MathHelper.clamp(value, 0, 255); + return Mth.clamp(value, 0, 255); } } diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index f332b4c6..00d518c7 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -7,7 +7,7 @@ import java.util.concurrent.locks.ReentrantLock; import com.google.common.collect.Lists; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.source.BiomeSource; import ru.betterend.noise.OpenSimplexNoise; @@ -19,17 +19,18 @@ public class TerrainGenerator { private static final double SCALE_Y = 4.0; private static final float[] COEF; private static final Point[] OFFS; - + private static IslandLayer largeIslands; private static IslandLayer mediumIslands; private static IslandLayer smallIslands; private static OpenSimplexNoise noise1; private static OpenSimplexNoise noise2; - - /*public static boolean canGenerate(int x, int z) { - return GeneratorOptions.noRingVoid() || (long) x + (long) z > CENTER; - }*/ - + + /* + * public static boolean canGenerate(int x, int z) { return + * GeneratorOptions.noRingVoid() || (long) x + (long) z > CENTER; } + */ + public static void initNoise(long seed) { Random random = new Random(seed); largeIslands = new IslandLayer(random.nextInt(), GeneratorOptions.bigOptions); @@ -38,25 +39,27 @@ public class TerrainGenerator { noise1 = new OpenSimplexNoise(random.nextInt()); noise2 = new OpenSimplexNoise(random.nextInt()); } - + public static void fillTerrainDensity(double[] buffer, int x, int z, BiomeSource biomeSource) { LOCKER.lock(); - + largeIslands.clearCache(); mediumIslands.clearCache(); smallIslands.clearCache(); - - double distortion1 = noise1.eval(x * 0.1, z * 0.1) * 20 + noise2.eval(x * 0.2, z * 0.2) * 10 + noise1.eval(x * 0.4, z * 0.4) * 5; - double distortion2 = noise2.eval(x * 0.1, z * 0.1) * 20 + noise1.eval(x * 0.2, z * 0.2) * 10 + noise2.eval(x * 0.4, z * 0.4) * 5; + + double distortion1 = noise1.eval(x * 0.1, z * 0.1) * 20 + noise2.eval(x * 0.2, z * 0.2) * 10 + + noise1.eval(x * 0.4, z * 0.4) * 5; + double distortion2 = noise2.eval(x * 0.1, z * 0.1) * 20 + noise1.eval(x * 0.2, z * 0.2) * 10 + + noise2.eval(x * 0.4, z * 0.4) * 5; double px = (double) x * SCALE_XZ + distortion1; double pz = (double) z * SCALE_XZ + distortion2; - + largeIslands.updatePositions(px, pz); mediumIslands.updatePositions(px, pz); smallIslands.updatePositions(px, pz); - + float height = getAverageDepth(biomeSource, x << 1, z << 1) * 0.5F; - + for (int y = 0; y < buffer.length; y++) { double py = (double) y * SCALE_Y; float dist = largeIslands.getDensity(px, py, pz, height); @@ -69,10 +72,10 @@ public class TerrainGenerator { } buffer[y] = dist; } - + LOCKER.unlock(); } - + private static float getAverageDepth(BiomeSource biomeSource, int x, int z) { if (getBiome(biomeSource, x, z).getDepth() < 0.1F) { return 0F; @@ -85,34 +88,37 @@ public class TerrainGenerator { } return depth; } - + private static Biome getBiome(BiomeSource biomeSource, int x, int z) { if (biomeSource instanceof BetterEndBiomeSource) { return ((BetterEndBiomeSource) biomeSource).getLandBiome(x, 0, z); } return biomeSource.getBiomeForNoiseGen(x, 0, z); } - + /** * Check if this is land + * * @param x - biome pos x * @param z - biome pos z */ public static boolean isLand(int x, int z) { LOCKER.lock(); - + double px = (x >> 1) + 0.5; double pz = (z >> 1) + 0.5; - - double distortion1 = noise1.eval(px * 0.1, pz * 0.1) * 20 + noise2.eval(px * 0.2, pz * 0.2) * 10 + noise1.eval(px * 0.4, pz * 0.4) * 5; - double distortion2 = noise2.eval(px * 0.1, pz * 0.1) * 20 + noise1.eval(px * 0.2, pz * 0.2) * 10 + noise2.eval(px * 0.4, pz * 0.4) * 5; + + double distortion1 = noise1.eval(px * 0.1, pz * 0.1) * 20 + noise2.eval(px * 0.2, pz * 0.2) * 10 + + noise1.eval(px * 0.4, pz * 0.4) * 5; + double distortion2 = noise2.eval(px * 0.1, pz * 0.1) * 20 + noise1.eval(px * 0.2, pz * 0.2) * 10 + + noise2.eval(px * 0.4, pz * 0.4) * 5; px = px * SCALE_XZ + distortion1; pz = pz * SCALE_XZ + distortion2; - + largeIslands.updatePositions(px, pz); mediumIslands.updatePositions(px, pz); smallIslands.updatePositions(px, pz); - + for (int y = 0; y < 32; y++) { double py = (double) y * SCALE_Y; float dist = largeIslands.getDensity(px, py, pz); @@ -128,31 +134,34 @@ public class TerrainGenerator { return true; } } - + LOCKER.unlock(); return false; } - + /** * Get something like height + * * @param x - block pos x * @param z - block pos z */ public static int getHeight(int x, int z) { LOCKER.lock(); - + double px = (double) x / 8.0; double pz = (double) z / 8.0; - - double distortion1 = noise1.eval(px * 0.1, pz * 0.1) * 20 + noise2.eval(px * 0.2, pz * 0.2) * 10 + noise1.eval(px * 0.4, pz * 0.4) * 5; - double distortion2 = noise2.eval(px * 0.1, pz * 0.1) * 20 + noise1.eval(px * 0.2, pz * 0.2) * 10 + noise2.eval(px * 0.4, pz * 0.4) * 5; + + double distortion1 = noise1.eval(px * 0.1, pz * 0.1) * 20 + noise2.eval(px * 0.2, pz * 0.2) * 10 + + noise1.eval(px * 0.4, pz * 0.4) * 5; + double distortion2 = noise2.eval(px * 0.1, pz * 0.1) * 20 + noise1.eval(px * 0.2, pz * 0.2) * 10 + + noise2.eval(px * 0.4, pz * 0.4) * 5; px = (double) x * SCALE_XZ + distortion1; pz = (double) z * SCALE_XZ + distortion2; - + largeIslands.updatePositions(px, pz); mediumIslands.updatePositions(px, pz); smallIslands.updatePositions(px, pz); - + for (int y = 32; y >= 0; y--) { double py = (double) y * SCALE_Y; float dist = largeIslands.getDensity(px, py, pz); @@ -165,14 +174,14 @@ public class TerrainGenerator { } if (dist > 0) { LOCKER.unlock(); - return MathHelper.floor(MathHelper.clamp(y + dist, y, y + 1) * SCALE_Y); + return Mth.floor(Mth.clamp(y + dist, y, y + 1) * SCALE_Y); } } - + LOCKER.unlock(); return 0; } - + static { float sum = 0; List coef = Lists.newArrayList(); @@ -183,7 +192,7 @@ public class TerrainGenerator { if (dist <= 1) { sum += dist; coef.add(dist); - pos.add(new Point(x, z)); + pos.offset(new Point(x, z)); } } } diff --git a/src/main/java/ru/betterend/world/processors/DestructionStructureProcessor.java b/src/main/java/ru/betterend/world/processors/DestructionStructureProcessor.java index 16e386a4..2ff4898c 100644 --- a/src/main/java/ru/betterend/world/processors/DestructionStructureProcessor.java +++ b/src/main/java/ru/betterend/world/processors/DestructionStructureProcessor.java @@ -4,21 +4,25 @@ import net.minecraft.structure.Structure.StructureBlockInfo; import net.minecraft.structure.StructurePlacementData; import net.minecraft.structure.processor.StructureProcessor; import net.minecraft.structure.processor.StructureProcessorType; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.world.WorldView; import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; public class DestructionStructureProcessor extends StructureProcessor { private int chance = 4; - + public void setChance(int chance) { this.chance = chance; } - + @Override - public StructureBlockInfo process(WorldView worldView, BlockPos pos, BlockPos blockPos, StructureBlockInfo structureBlockInfo, StructureBlockInfo structureBlockInfo2, StructurePlacementData structurePlacementData) { - if (!structureBlockInfo2.state.isOf(EndBlocks.ETERNAL_PEDESTAL) && !structureBlockInfo2.state.isOf(EndBlocks.FLAVOLITE_RUNED_ETERNAL) && MHelper.RANDOM.nextInt(chance) == 0) { + public StructureBlockInfo process(WorldView worldView, BlockPos pos, BlockPos blockPos, + StructureBlockInfo structureBlockInfo, StructureBlockInfo structureBlockInfo2, + StructurePlacementData structurePlacementData) { + if (!structureBlockInfo2.state.is(EndBlocks.ETERNAL_PEDESTAL) + && !structureBlockInfo2.state.is(EndBlocks.FLAVOLITE_RUNED_ETERNAL) + && MHelper.RANDOM.nextInt(chance) == 0) { return null; } return structureBlockInfo2; diff --git a/src/main/java/ru/betterend/world/processors/TerrainStructureProcessor.java b/src/main/java/ru/betterend/world/processors/TerrainStructureProcessor.java index a809249a..ca87776f 100644 --- a/src/main/java/ru/betterend/world/processors/TerrainStructureProcessor.java +++ b/src/main/java/ru/betterend/world/processors/TerrainStructureProcessor.java @@ -1,20 +1,23 @@ package ru.betterend.world.processors; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; import net.minecraft.structure.Structure.StructureBlockInfo; import net.minecraft.structure.StructurePlacementData; import net.minecraft.structure.processor.StructureProcessor; import net.minecraft.structure.processor.StructureProcessorType; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.world.WorldView; public class TerrainStructureProcessor extends StructureProcessor { @Override - public StructureBlockInfo process(WorldView worldView, BlockPos pos, BlockPos blockPos, StructureBlockInfo structureBlockInfo, StructureBlockInfo structureBlockInfo2, StructurePlacementData structurePlacementData) { + public StructureBlockInfo process(WorldView worldView, BlockPos pos, BlockPos blockPos, + StructureBlockInfo structureBlockInfo, StructureBlockInfo structureBlockInfo2, + StructurePlacementData structurePlacementData) { BlockPos bpos = structureBlockInfo2.pos; - if (structureBlockInfo2.state.isOf(Blocks.END_STONE) && worldView.isAir(bpos.up())) { - BlockState top = worldView.getBiome(structureBlockInfo2.pos).getGenerationSettings().getSurfaceConfig().getTopMaterial(); + if (structureBlockInfo2.state.is(Blocks.END_STONE) && worldView.isAir(bpos.up())) { + BlockState top = worldView.getBiome(structureBlockInfo2.pos).getGenerationSettings().getSurfaceConfig() + .getTopMaterial(); return new StructureBlockInfo(bpos, top, structureBlockInfo2.tag); } return structureBlockInfo2; diff --git a/src/main/java/ru/betterend/world/structures/EndStructureFeature.java b/src/main/java/ru/betterend/world/structures/EndStructureFeature.java index 5e10a5fa..bf545278 100644 --- a/src/main/java/ru/betterend/world/structures/EndStructureFeature.java +++ b/src/main/java/ru/betterend/world/structures/EndStructureFeature.java @@ -3,7 +3,7 @@ package ru.betterend.world.structures; import java.util.Random; import net.fabricmc.fabric.api.structure.v1.FabricStructureBuilder; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.world.gen.GenerationStep; import net.minecraft.world.gen.feature.ConfiguredStructureFeature; @@ -16,18 +16,17 @@ public class EndStructureFeature { private final StructureFeature structure; private final ConfiguredStructureFeature featureConfigured; private final GenerationStep.Feature featureStep; - - public EndStructureFeature(String name, StructureFeature structure, GenerationStep.Feature step, int spacing, int separation) { - Identifier id = BetterEnd.makeID(name); - + + public EndStructureFeature(String name, StructureFeature structure, + GenerationStep.Feature step, int spacing, int separation) { + ResourceLocation id = BetterEnd.makeID(name); + this.featureStep = step; - this.structure = FabricStructureBuilder.create(id, structure) - .step(step) - .defaultConfig(spacing, separation, RANDOM.nextInt(8192)) - .register(); + this.structure = FabricStructureBuilder.create(id, structure).step(step) + .defaultConfig(spacing, separation, RANDOM.nextInt(8192)).register(); this.featureConfigured = this.structure.configure(DefaultFeatureConfig.DEFAULT); - + BuiltinRegistries.add(BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE, id, this.featureConfigured); } diff --git a/src/main/java/ru/betterend/world/structures/StructureWorld.java b/src/main/java/ru/betterend/world/structures/StructureWorld.java index ef736c8f..6c42d831 100644 --- a/src/main/java/ru/betterend/world/structures/StructureWorld.java +++ b/src/main/java/ru/betterend/world/structures/StructureWorld.java @@ -4,13 +4,13 @@ import java.util.Map; import com.google.common.collect.Maps; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.NbtHelper; import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.util.math.ChunkPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.chunk.Chunk; @@ -25,9 +25,10 @@ public class StructureWorld { private int maxX = Integer.MIN_VALUE; private int maxY = Integer.MIN_VALUE; private int maxZ = Integer.MIN_VALUE; - - public StructureWorld() {} - + + public StructureWorld() { + } + public StructureWorld(CompoundTag tag) { minX = tag.getInt("minX"); maxX = tag.getInt("maxX"); @@ -35,7 +36,7 @@ public class StructureWorld { maxY = tag.getInt("maxY"); minZ = tag.getInt("minZ"); maxZ = tag.getInt("maxZ"); - + ListTag map = tag.getList("parts", 10); map.forEach((element) -> { CompoundTag compound = (CompoundTag) element; @@ -45,33 +46,39 @@ public class StructureWorld { parts.put(new ChunkPos(x, z), part); }); } - + public void setBlock(BlockPos pos, BlockState state) { ChunkPos cPos = new ChunkPos(pos); - + if (cPos.equals(lastPos)) { lastPart.addBlock(pos, state); return; } - + Part part = parts.get(cPos); if (part == null) { part = new Part(); parts.put(cPos, part); - - if (cPos.x < minX) minX = cPos.x; - if (cPos.x > maxX) maxX = cPos.x; - if (cPos.z < minZ) minZ = cPos.z; - if (cPos.z > maxZ) maxZ = cPos.z; + + if (cPos.x < minX) + minX = cPos.x; + if (cPos.x > maxX) + maxX = cPos.x; + if (cPos.z < minZ) + minZ = cPos.z; + if (cPos.z > maxZ) + maxZ = cPos.z; } - if (pos.getY() < minY) minY = pos.getY(); - if (pos.getY() > maxY) maxY = pos.getY(); + if (pos.getY() < minY) + minY = pos.getY(); + if (pos.getY() > maxY) + maxY = pos.getY(); part.addBlock(pos, state); - + lastPos = cPos; lastPart = part; } - + public boolean placeChunk(StructureWorldAccess world, ChunkPos chunkPos) { Part part = parts.get(chunkPos); if (part != null) { @@ -81,7 +88,7 @@ public class StructureWorld { } return false; } - + public CompoundTag toBNT() { CompoundTag tag = new CompoundTag(); tag.putInt("minX", minX); @@ -97,19 +104,21 @@ public class StructureWorld { }); return tag; } - + public BlockBox getBounds() { - if (minX == Integer.MAX_VALUE || maxX == Integer.MIN_VALUE || minZ == Integer.MAX_VALUE || maxZ == Integer.MIN_VALUE) { + if (minX == Integer.MAX_VALUE || maxX == Integer.MIN_VALUE || minZ == Integer.MAX_VALUE + || maxZ == Integer.MIN_VALUE) { return BlockBox.empty(); } return new BlockBox(minX << 4, minY, minZ << 4, (maxX << 4) | 15, maxY, (maxZ << 4) | 15); } - + private static final class Part { Map blocks = Maps.newHashMap(); - - public Part() {} - + + public Part() { + } + public Part(CompoundTag tag) { ListTag map = tag.getList("blocks", 10); ListTag map2 = tag.getList("states", 10); @@ -117,7 +126,7 @@ public class StructureWorld { for (int i = 0; i < states.length; i++) { states[i] = NbtHelper.toBlockState((CompoundTag) map2.get(i)); } - + map.forEach((element) -> { CompoundTag block = (CompoundTag) element; BlockPos pos = NbtHelper.toBlockPos(block.getCompound("pos")); @@ -126,18 +135,18 @@ public class StructureWorld { blocks.put(pos, state); }); } - + void addBlock(BlockPos pos, BlockState state) { BlockPos inner = new BlockPos(pos.getX() & 15, pos.getY(), pos.getZ() & 15); blocks.put(inner, state); } - + void placeChunk(Chunk chunk) { blocks.forEach((pos, state) -> { - chunk.setBlockState(pos, state, false); + chunk.setBlockAndUpdate(pos, state, false); }); } - + CompoundTag toNBT(int x, int z) { CompoundTag tag = new CompoundTag(); tag.putInt("x", x); @@ -146,24 +155,24 @@ public class StructureWorld { tag.put("blocks", map); ListTag stateMap = new ListTag(); tag.put("states", stateMap); - + int[] id = new int[1]; Map states = Maps.newHashMap(); - + blocks.forEach((pos, state) -> { int stateID = states.getOrDefault(states, -1); if (stateID < 0) { - stateID = id[0] ++; + stateID = id[0]++; states.put(state, stateID); stateMap.add(NbtHelper.fromBlockState(state)); } - + CompoundTag block = new CompoundTag(); block.put("pos", NbtHelper.fromBlockPos(pos)); block.putInt("state", stateID); map.add(block); }); - + return tag; } } diff --git a/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java b/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java index 3874615e..1ce2a06e 100644 --- a/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java @@ -3,9 +3,9 @@ package ru.betterend.world.structures.features; import net.minecraft.structure.Structure; import net.minecraft.structure.StructureManager; import net.minecraft.structure.StructureStart; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.util.math.ChunkPos; import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.world.Heightmap; @@ -22,11 +22,13 @@ import ru.betterend.util.StructureHelper; import ru.betterend.world.structures.piece.NBTPiece; public class EternalPortalStructure extends FeatureBaseStructure { - private static final Identifier STRUCTURE_ID = BetterEnd.makeID("portal/eternal_portal"); + private static final ResourceLocation STRUCTURE_ID = BetterEnd.makeID("portal/eternal_portal"); private static final Structure STRUCTURE = StructureHelper.readStructure(STRUCTURE_ID); - + @Override - protected boolean shouldStartAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, ChunkRandom chunkRandom, int chunkX, int chunkZ, Biome biome, ChunkPos chunkPos, DefaultFeatureConfig featureConfig) { + protected boolean shouldStartAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, + ChunkRandom chunkRandom, int chunkX, int chunkZ, Biome biome, ChunkPos chunkPos, + DefaultFeatureConfig featureConfig) { long x = chunkPos.x; long z = chunkPos.z; if (x * x + z * z < 10000) { @@ -35,26 +37,30 @@ public class EternalPortalStructure extends FeatureBaseStructure { if (chunkGenerator.getHeight((chunkX << 4) | 8, (chunkZ << 4) | 8, Heightmap.Type.WORLD_SURFACE_WG) < 10) { return false; } - return super.shouldStartAt(chunkGenerator, biomeSource, worldSeed, chunkRandom, chunkX, chunkZ, biome, chunkPos, featureConfig); + return super.shouldStartAt(chunkGenerator, biomeSource, worldSeed, chunkRandom, chunkX, chunkZ, biome, chunkPos, + featureConfig); } - + @Override public StructureFeature.StructureStartFactory getStructureStartFactory() { return SDFStructureStart::new; } - + public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, int references, long seed) { + public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, + int references, long seed) { super(feature, chunkX, chunkZ, box, references, seed); } @Override - public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { + public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, + StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { int x = (chunkX << 4) | MHelper.randRange(4, 12, random); int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); if (y > 4) { - this.children.add(new NBTPiece(STRUCTURE_ID, STRUCTURE, new BlockPos(x, y - 4, z), random.nextInt(5), true, random)); + this.children.add(new NBTPiece(STRUCTURE_ID, STRUCTURE, new BlockPos(x, y - 4, z), random.nextInt(5), + true, random)); } this.setBoundingBoxFromChildren(); } diff --git a/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java b/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java index 3be74a16..83fbb458 100644 --- a/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java @@ -2,9 +2,9 @@ package ru.betterend.world.structures.features; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.util.BlockRotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; import net.minecraft.util.math.ChunkPos; import net.minecraft.world.Heightmap; import net.minecraft.world.biome.Biome; @@ -15,27 +15,29 @@ import net.minecraft.world.gen.feature.DefaultFeatureConfig; import net.minecraft.world.gen.feature.StructureFeature; public abstract class FeatureBaseStructure extends StructureFeature { - protected static final BlockState AIR = Blocks.AIR.getDefaultState(); - + protected static final BlockState AIR = Blocks.AIR.defaultBlockState(); + public FeatureBaseStructure() { super(DefaultFeatureConfig.CODEC); } - - protected boolean shouldStartAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, ChunkRandom chunkRandom, int chunkX, int chunkZ, Biome biome, ChunkPos chunkPos, DefaultFeatureConfig featureConfig) { + + protected boolean shouldStartAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, + ChunkRandom chunkRandom, int chunkX, int chunkZ, Biome biome, ChunkPos chunkPos, + DefaultFeatureConfig featureConfig) { return getGenerationHeight(chunkX, chunkZ, chunkGenerator) >= 20; } private static int getGenerationHeight(int chunkX, int chunkZ, ChunkGenerator chunkGenerator) { Random random = new Random((long) (chunkX + chunkZ * 10387313)); - BlockRotation blockRotation = BlockRotation.random(random); + Rotation blockRotation = Rotation.random(random); int i = 5; int j = 5; - if (blockRotation == BlockRotation.CLOCKWISE_90) { + if (blockRotation == Rotation.CLOCKWISE_90) { i = -5; - } else if (blockRotation == BlockRotation.CLOCKWISE_180) { + } else if (blockRotation == Rotation.CLOCKWISE_180) { i = -5; j = -5; - } else if (blockRotation == BlockRotation.COUNTERCLOCKWISE_90) { + } else if (blockRotation == Rotation.COUNTERCLOCKWISE_90) { j = -5; } diff --git a/src/main/java/ru/betterend/world/structures/features/GiantIceStarStructure.java b/src/main/java/ru/betterend/world/structures/features/GiantIceStarStructure.java index 41c695e4..2abb0015 100644 --- a/src/main/java/ru/betterend/world/structures/features/GiantIceStarStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/GiantIceStarStructure.java @@ -4,12 +4,12 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; -import net.minecraft.block.BlockState; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.client.util.math.Vector3f; import net.minecraft.structure.StructureManager; import net.minecraft.structure.StructureStart; import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.chunk.ChunkGenerator; @@ -29,59 +29,58 @@ public class GiantIceStarStructure extends SDFStructureFeature { private final float maxSize = 35; private final int minCount = 25; private final int maxCount = 40; - + @Override protected SDF getSDF(BlockPos pos, Random random) { float size = MHelper.randRange(minSize, maxSize, random); int count = MHelper.randRange(minCount, maxCount, random); List points = getFibonacciPoints(count); SDF sdf = null; - SDF spike = new SDFCappedCone().setRadius1(3 + (size - 5) * 0.2F).setRadius2(0).setHeight(size).setBlock(EndBlocks.DENSE_SNOW); + SDF spike = new SDFCappedCone().setRadius1(3 + (size - 5) * 0.2F).setRadius2(0).setHeight(size) + .setBlock(EndBlocks.DENSE_SNOW); spike = new SDFTranslate().setTranslate(0, size - 0.5F, 0).setSource(spike); - for (Vector3f point: points) { + for (Vector3f point : points) { SDF rotated = spike; point = MHelper.normalize(point); float angle = MHelper.angle(Vector3f.POSITIVE_Y, point); if (angle > 0.01F && angle < 3.14F) { Vector3f axis = MHelper.normalize(MHelper.cross(Vector3f.POSITIVE_Y, point)); rotated = new SDFRotation().setRotation(axis, angle).setSource(spike); - } - else if (angle > 1) { + } else if (angle > 1) { rotated = new SDFRotation().setRotation(Vector3f.POSITIVE_Y, (float) Math.PI).setSource(spike); } sdf = (sdf == null) ? rotated : new SDFUnion().setSourceA(sdf).setSourceB(rotated); } - + final float ancientRadius = size * 0.7F; final float denseRadius = size * 0.9F; final float iceRadius = size < 7 ? size * 5 : size * 1.3F; final float randScale = size * 0.3F; - + final BlockPos center = pos; - final BlockState ice = EndBlocks.EMERALD_ICE.getDefaultState(); - final BlockState dense = EndBlocks.DENSE_EMERALD_ICE.getDefaultState(); - final BlockState ancient = EndBlocks.ANCIENT_EMERALD_ICE.getDefaultState(); + final BlockState ice = EndBlocks.EMERALD_ICE.defaultBlockState(); + final BlockState dense = EndBlocks.DENSE_EMERALD_ICE.defaultBlockState(); + final BlockState ancient = EndBlocks.ANCIENT_EMERALD_ICE.defaultBlockState(); final SDF sdfCopy = sdf; - + return sdf.addPostProcess((info) -> { BlockPos bpos = info.getPos(); float px = bpos.getX() - center.getX(); float py = bpos.getY() - center.getY(); float pz = bpos.getZ() - center.getZ(); - float distance = MHelper.length(px, py, pz) + sdfCopy.getDistance(px, py, pz) * 0.4F + random.nextFloat() * randScale; + float distance = MHelper.length(px, py, pz) + sdfCopy.getDistance(px, py, pz) * 0.4F + + random.nextFloat() * randScale; if (distance < ancientRadius) { return ancient; - } - else if (distance < denseRadius) { + } else if (distance < denseRadius) { return dense; - } - else if (distance < iceRadius) { + } else if (distance < iceRadius) { return ice; } return info.getState(); }); } - + private List getFibonacciPoints(int count) { float max = count - 1; List result = new ArrayList(count); @@ -95,23 +94,27 @@ public class GiantIceStarStructure extends SDFStructureFeature { } return result; } - + @Override public StructureFeature.StructureStartFactory getStructureStartFactory() { return StarStructureStart::new; } - + public static class StarStructureStart extends StructureStart { - public StarStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, int references, long seed) { + public StarStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, + int references, long seed) { super(feature, chunkX, chunkZ, box, references, seed); } @Override - public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { + public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, + StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { int x = (chunkX << 4) | MHelper.randRange(4, 12, random); int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); BlockPos start = new BlockPos(x, MHelper.randRange(32, 128, random), z); - VoxelPiece piece = new VoxelPiece((world) -> { ((SDFStructureFeature) this.getFeature()).getSDF(start, this.random).fillRecursive(world, start); }, random.nextInt()); + VoxelPiece piece = new VoxelPiece((world) -> { + ((SDFStructureFeature) this.getFeature()).getSDF(start, this.random).fillRecursive(world, start); + }, random.nextInt()); this.children.add(piece); this.setBoundingBoxFromChildren(); } diff --git a/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java b/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java index 11b50168..36148bea 100644 --- a/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java @@ -4,8 +4,8 @@ import java.util.List; import java.util.Random; import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import ru.betterend.blocks.MossyGlowshroomCapBlock; import ru.betterend.blocks.basis.FurBlock; import ru.betterend.noise.OpenSimplexNoise; @@ -34,89 +34,95 @@ public class GiantMossyGlowshroomStructure extends SDFStructureFeature { SDFCappedCone cone1 = new SDFCappedCone().setHeight(2.5F).setRadius1(1.5F).setRadius2(2.5F); SDFCappedCone cone2 = new SDFCappedCone().setHeight(3F).setRadius1(2.5F).setRadius2(13F); SDF posedCone2 = new SDFTranslate().setTranslate(0, 5, 0).setSource(cone2); - SDF posedCone3 = new SDFTranslate().setTranslate(0, 12F, 0).setSource(new SDFScale().setScale(2).setSource(cone2)); + SDF posedCone3 = new SDFTranslate().setTranslate(0, 12F, 0) + .setSource(new SDFScale().setScale(2).setSource(cone2)); SDF upCone = new SDFSubtraction().setSourceA(posedCone2).setSourceB(posedCone3); SDF wave = new SDFFlatWave().setRaysCount(12).setIntensity(1.3F).setSource(upCone); SDF cones = new SDFSmoothUnion().setRadius(3).setSourceA(cone1).setSourceB(wave); - + SDF innerCone = new SDFTranslate().setTranslate(0, 1.25F, 0).setSource(upCone); innerCone = new SDFScale3D().setScale(1.2F, 1F, 1.2F).setSource(innerCone); cones = new SDFUnion().setSourceA(cones).setSourceB(innerCone); - + SDF glowCone = new SDFCappedCone().setHeight(3F).setRadius1(2F).setRadius2(12.5F); SDFPrimitive priGlowCone = (SDFPrimitive) glowCone; glowCone = new SDFTranslate().setTranslate(0, 4.25F, 0).setSource(glowCone); glowCone = new SDFSubtraction().setSourceA(glowCone).setSourceB(posedCone3); - + cones = new SDFUnion().setSourceA(cones).setSourceB(glowCone); - + OpenSimplexNoise noise = new OpenSimplexNoise(1234); cones = new SDFCoordModify().setFunction((pos) -> { float dist = MHelper.length(pos.getX(), pos.getZ()); - float y = pos.getY() + (float) noise.eval(pos.getX() * 0.1 + center.getX(), pos.getZ() * 0.1 + center.getZ()) * dist * 0.3F - dist * 0.15F; + float y = pos.getY() + + (float) noise.eval(pos.getX() * 0.1 + center.getX(), pos.getZ() * 0.1 + center.getZ()) * dist + * 0.3F + - dist * 0.15F; pos.set(pos.getX(), y, pos.getZ()); }).setSource(cones); - - SDFTranslate HEAD_POS = (SDFTranslate) new SDFTranslate().setSource(new SDFTranslate().setTranslate(0, 2.5F, 0).setSource(cones)); - + + SDFTranslate HEAD_POS = (SDFTranslate) new SDFTranslate() + .setSource(new SDFTranslate().setTranslate(0, 2.5F, 0).setSource(cones)); + SDF roots = new SDFSphere().setRadius(4F); SDFPrimitive primRoots = (SDFPrimitive) roots; roots = new SDFScale3D().setScale(1, 0.7F, 1).setSource(roots); SDFFlatWave rotRoots = (SDFFlatWave) new SDFFlatWave().setRaysCount(5).setIntensity(1.5F).setSource(roots); - - SDFBinary function = new SDFSmoothUnion().setRadius(4).setSourceB(new SDFUnion().setSourceA(HEAD_POS).setSourceB(rotRoots)); - + + SDFBinary function = new SDFSmoothUnion().setRadius(4) + .setSourceB(new SDFUnion().setSourceA(HEAD_POS).setSourceB(rotRoots)); + cone1.setBlock(EndBlocks.MOSSY_GLOWSHROOM_CAP); cone2.setBlock(EndBlocks.MOSSY_GLOWSHROOM_CAP); priGlowCone.setBlock(EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE); primRoots.setBlock(EndBlocks.MOSSY_GLOWSHROOM.bark); - + float height = MHelper.randRange(10F, 25F, random); int count = MHelper.floor(height / 4); List spline = SplineHelper.makeSpline(0, 0, 0, 0, height, 0, count); SplineHelper.offsetParts(spline, random, 1F, 0, 1F); SDF sdf = SplineHelper.buildSDF(spline, 2.1F, 1.5F, (pos) -> { - return EndBlocks.MOSSY_GLOWSHROOM.log.getDefaultState(); + return EndBlocks.MOSSY_GLOWSHROOM.log.defaultBlockState(); }); Vector3f pos = spline.get(spline.size() - 1); float scale = MHelper.randRange(2F, 3.5F, random); - + HEAD_POS.setTranslate(pos.getX(), pos.getY(), pos.getZ()); rotRoots.setAngle(random.nextFloat() * MHelper.PI2); function.setSourceA(sdf); - - return new SDFRound().setRadius(1.5F).setSource(new SDFScale() - .setScale(scale) - .setSource(function)) + + return new SDFRound().setRadius(1.5F).setSource(new SDFScale().setScale(scale).setSource(function)) .addPostProcess((info) -> { if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getState())) { if (random.nextBoolean() && info.getStateUp().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { - info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.getDefaultState().with(MossyGlowshroomCapBlock.TRANSITION, true)); + info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState() + .with(MossyGlowshroomCapBlock.TRANSITION, true)); + return info.getState(); + } else if (!EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateUp()) + || !EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateDown())) { + info.setState(EndBlocks.MOSSY_GLOWSHROOM.bark.defaultBlockState()); return info.getState(); } - else if (!EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateUp()) || !EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateDown())) { - info.setState(EndBlocks.MOSSY_GLOWSHROOM.bark.getDefaultState()); - return info.getState(); - } - } - else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { + } else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateDown().getBlock())) { - info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.getDefaultState().with(MossyGlowshroomCapBlock.TRANSITION, true)); + info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState() + .with(MossyGlowshroomCapBlock.TRANSITION, true)); return info.getState(); } - - info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.getDefaultState()); + + info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState()); return info.getState(); - } - else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { - for (Direction dir: BlocksHelper.HORIZONTAL) { + } else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { + for (Direction dir : BlocksHelper.HORIZONTAL) { if (info.getState(dir) == AIR) { - info.setBlockPos(info.getPos().offset(dir), EndBlocks.MOSSY_GLOWSHROOM_FUR.getDefaultState().with(FurBlock.FACING, dir)); + info.setBlockPos(info.getPos().offset(dir), + EndBlocks.MOSSY_GLOWSHROOM_FUR.defaultBlockState().with(FurBlock.FACING, dir)); } } - + if (info.getStateDown().getBlock() != EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { - info.setBlockPos(info.getPos().down(), EndBlocks.MOSSY_GLOWSHROOM_FUR.getDefaultState().with(FurBlock.FACING, Direction.DOWN)); + info.setBlockPos(info.getPos().below(), EndBlocks.MOSSY_GLOWSHROOM_FUR.defaultBlockState() + .with(FurBlock.FACING, Direction.DOWN)); } } return info.getState(); diff --git a/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java b/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java index 344d92e3..21bf867a 100644 --- a/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java @@ -3,7 +3,7 @@ package ru.betterend.world.structures.features; import net.minecraft.structure.StructureManager; import net.minecraft.structure.StructureStart; import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.world.Heightmap.Type; import net.minecraft.world.biome.Biome; @@ -18,14 +18,16 @@ public class MegaLakeSmallStructure extends FeatureBaseStructure { public StructureFeature.StructureStartFactory getStructureStartFactory() { return SDFStructureStart::new; } - + public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, int references, long seed) { + public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, + int references, long seed) { super(feature, chunkX, chunkZ, box, references, seed); } @Override - public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { + public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, + StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { int x = (chunkX << 4) | MHelper.randRange(4, 12, random); int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); diff --git a/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java b/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java index 1ae60a72..1ff03a96 100644 --- a/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java @@ -3,7 +3,7 @@ package ru.betterend.world.structures.features; import net.minecraft.structure.StructureManager; import net.minecraft.structure.StructureStart; import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.world.Heightmap.Type; import net.minecraft.world.biome.Biome; @@ -18,14 +18,16 @@ public class MegaLakeStructure extends FeatureBaseStructure { public StructureFeature.StructureStartFactory getStructureStartFactory() { return SDFStructureStart::new; } - + public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, int references, long seed) { + public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, + int references, long seed) { super(feature, chunkX, chunkZ, box, references, seed); } @Override - public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { + public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, + StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { int x = (chunkX << 4) | MHelper.randRange(4, 12, random); int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); diff --git a/src/main/java/ru/betterend/world/structures/features/MountainStructure.java b/src/main/java/ru/betterend/world/structures/features/MountainStructure.java index 6efc808c..136e647e 100644 --- a/src/main/java/ru/betterend/world/structures/features/MountainStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/MountainStructure.java @@ -3,7 +3,7 @@ package ru.betterend.world.structures.features; import net.minecraft.structure.StructureManager; import net.minecraft.structure.StructureStart; import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.world.Heightmap.Type; import net.minecraft.world.biome.Biome; @@ -18,21 +18,24 @@ public class MountainStructure extends FeatureBaseStructure { public StructureFeature.StructureStartFactory getStructureStartFactory() { return SDFStructureStart::new; } - + public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, int references, long seed) { + public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, + int references, long seed) { super(feature, chunkX, chunkZ, box, references, seed); } @Override - public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { + public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, + StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { int x = (chunkX << 4) | MHelper.randRange(4, 12, random); int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); if (y > 5) { float radius = MHelper.randRange(50, 100, random); float height = radius * MHelper.randRange(0.8F, 1.2F, random); - CrystalMountainPiece piece = new CrystalMountainPiece(new BlockPos(x, y, z), radius, height, random, biome); + CrystalMountainPiece piece = new CrystalMountainPiece(new BlockPos(x, y, z), radius, height, random, + biome); this.children.add(piece); } this.setBoundingBoxFromChildren(); diff --git a/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java b/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java index 07d262a0..ac2e1ac4 100644 --- a/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java @@ -1,11 +1,11 @@ package ru.betterend.world.structures.features; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; import net.minecraft.structure.StructureManager; import net.minecraft.structure.StructureStart; import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.world.Heightmap.Type; import net.minecraft.world.biome.Biome; @@ -18,19 +18,21 @@ import ru.betterend.world.structures.piece.PaintedMountainPiece; public class PaintedMountainStructure extends FeatureBaseStructure { private static final BlockState[] VARIANTS; - + @Override public StructureFeature.StructureStartFactory getStructureStartFactory() { return SDFStructureStart::new; } - + public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, int references, long seed) { + public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, + int references, long seed) { super(feature, chunkX, chunkZ, box, references, seed); } @Override - public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { + public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, + StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { int x = (chunkX << 4) | MHelper.randRange(4, 12, random); int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); @@ -42,17 +44,15 @@ public class PaintedMountainStructure extends FeatureBaseStructure { for (int i = 0; i < count; i++) { slises[i] = VARIANTS[random.nextInt(VARIANTS.length)]; } - this.children.add(new PaintedMountainPiece(new BlockPos(x, y, z), radius, height, random, biome, slises )); + this.children + .add(new PaintedMountainPiece(new BlockPos(x, y, z), radius, height, random, biome, slises)); } this.setBoundingBoxFromChildren(); } } - + static { - VARIANTS = new BlockState[] { - Blocks.END_STONE.getDefaultState(), - EndBlocks.FLAVOLITE.stone.getDefaultState(), - EndBlocks.VIOLECITE.stone.getDefaultState(), - }; + VARIANTS = new BlockState[] { Blocks.END_STONE.defaultBlockState(), + EndBlocks.FLAVOLITE.stone.defaultBlockState(), EndBlocks.VIOLECITE.stone.defaultBlockState(), }; } } diff --git a/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java b/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java index 21f9edd2..8baee4bc 100644 --- a/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java +++ b/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java @@ -5,7 +5,7 @@ import java.util.Random; import net.minecraft.structure.StructureManager; import net.minecraft.structure.StructureStart; import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.world.Heightmap.Type; import net.minecraft.world.biome.Biome; @@ -17,27 +17,31 @@ import ru.betterend.util.sdf.SDF; import ru.betterend.world.structures.piece.VoxelPiece; public abstract class SDFStructureFeature extends FeatureBaseStructure { - + protected abstract SDF getSDF(BlockPos pos, Random random); - + @Override public StructureFeature.StructureStartFactory getStructureStartFactory() { return SDFStructureStart::new; } - + public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, int references, long seed) { + public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, + int references, long seed) { super(feature, chunkX, chunkZ, box, references, seed); } @Override - public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { + public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, + StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { int x = (chunkX << 4) | MHelper.randRange(4, 12, random); int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); if (y > 5) { BlockPos start = new BlockPos(x, y, z); - VoxelPiece piece = new VoxelPiece((world) -> { ((SDFStructureFeature) this.getFeature()).getSDF(start, this.random).fillRecursive(world, start); }, random.nextInt()); + VoxelPiece piece = new VoxelPiece((world) -> { + ((SDFStructureFeature) this.getFeature()).getSDF(start, this.random).fillRecursive(world, start); + }, random.nextInt()); this.children.add(piece); } this.setBoundingBoxFromChildren(); diff --git a/src/main/java/ru/betterend/world/structures/piece/CavePiece.java b/src/main/java/ru/betterend/world/structures/piece/CavePiece.java index 52a3da9e..37e893fc 100644 --- a/src/main/java/ru/betterend/world/structures/piece/CavePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/CavePiece.java @@ -2,13 +2,13 @@ package ru.betterend.world.structures.piece; import java.util.Random; -import net.minecraft.block.Blocks; +import net.minecraft.world.level.block.Blocks; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtHelper; import net.minecraft.structure.StructureManager; import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.util.math.ChunkPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.StructureAccessor; @@ -23,7 +23,7 @@ public class CavePiece extends BasePiece { private OpenSimplexNoise noise; private BlockPos center; private float radius; - + public CavePiece(BlockPos center, float radius, int id) { super(EndStructures.CAVE_PIECE, id); this.center = center; @@ -36,19 +36,20 @@ public class CavePiece extends BasePiece { super(EndStructures.CAVE_PIECE, tag); makeBoundingBox(); } - + @Override - public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, + Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { int x1 = MHelper.max(this.boundingBox.minX, blockBox.minX); int z1 = MHelper.max(this.boundingBox.minZ, blockBox.minZ); int x2 = MHelper.min(this.boundingBox.maxX, blockBox.maxX); int z2 = MHelper.min(this.boundingBox.maxZ, blockBox.maxZ); int y1 = this.boundingBox.minY; int y2 = this.boundingBox.maxY; - + double hr = radius * 0.75; double nr = radius * 0.25; - Mutable pos = new Mutable(); + MutableBlockPos pos = new MutableBlockPos(); for (int x = x1; x <= x2; x++) { int xsq = x - center.getX(); xsq *= xsq; @@ -69,8 +70,7 @@ public class CavePiece extends BasePiece { if (world.getBlockState(pos).isIn(EndTags.END_GROUND)) { BlocksHelper.setWithoutUpdate(world, pos, AIR); } - } - else if (dist < r * r) { + } else if (dist < r * r) { if (world.getBlockState(pos).getMaterial().isReplaceable()) { BlocksHelper.setWithoutUpdate(world, pos, Blocks.END_STONE); } @@ -78,7 +78,7 @@ public class CavePiece extends BasePiece { } } } - + return true; } @@ -94,7 +94,7 @@ public class CavePiece extends BasePiece { radius = tag.getFloat("radius"); noise = new OpenSimplexNoise(MHelper.getSeed(534, center.getX(), center.getZ())); } - + private void makeBoundingBox() { int minX = MHelper.floor(center.getX() - radius); int minY = MHelper.floor(center.getY() - radius); diff --git a/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java index 5267cc2c..7b56ad66 100644 --- a/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java @@ -2,15 +2,15 @@ package ru.betterend.world.structures.piece; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; import net.minecraft.nbt.CompoundTag; import net.minecraft.structure.StructureManager; import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.util.math.ChunkPos; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; import net.minecraft.world.Heightmap; import net.minecraft.world.Heightmap.Type; import net.minecraft.world.StructureWorldAccess; @@ -26,7 +26,7 @@ import ru.betterend.util.MHelper; public class CrystalMountainPiece extends MountainPiece { private BlockState top; - + public CrystalMountainPiece(BlockPos center, float radius, float height, Random random, Biome biome) { super(EndStructures.MOUNTAIN_PIECE, center, radius, height, random, biome); top = biome.getGenerationSettings().getSurfaceConfig().getTopMaterial(); @@ -43,10 +43,11 @@ public class CrystalMountainPiece extends MountainPiece { } @Override - public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, + Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { int sx = chunkPos.getStartX(); int sz = chunkPos.getStartZ(); - Mutable pos = new Mutable(); + MutableBlockPos pos = new MutableBlockPos(); Chunk chunk = world.getChunk(chunkPos.x, chunkPos.z); Heightmap map = chunk.getHeightmap(Type.WORLD_SURFACE); Heightmap map2 = chunk.getHeightmap(Type.WORLD_SURFACE_WG); @@ -68,7 +69,8 @@ public class CrystalMountainPiece extends MountainPiece { continue; } pos.setY(minY); - while (!chunk.getBlockState(pos).isIn(EndTags.GEN_TERRAIN) && pos.getY() > 56 && !chunk.getBlockState(pos.down()).isOf(Blocks.CAVE_AIR)) { + while (!chunk.getBlockState(pos).isIn(EndTags.GEN_TERRAIN) && pos.getY() > 56 + && !chunk.getBlockState(pos.below()).is(Blocks.CAVE_AIR)) { pos.setY(pos.getY() - 1); } minY = pos.getY(); @@ -81,22 +83,24 @@ public class CrystalMountainPiece extends MountainPiece { maxY += center.getY(); int maxYI = (int) (maxY); int cover = maxYI - 1; - boolean needCover = (noise1.eval(px * 0.1, pz * 0.1) + MHelper.randRange(-0.4, 0.4, random) - (center.getY() + 14) * 0.1) > 0; + boolean needCover = (noise1.eval(px * 0.1, pz * 0.1) + MHelper.randRange(-0.4, 0.4, random) + - (center.getY() + 14) * 0.1) > 0; for (int y = minY - 1; y < maxYI; y++) { pos.setY(y); - chunk.setBlockState(pos, needCover && y == cover ? top : Blocks.END_STONE.getDefaultState(), false); + chunk.setBlockAndUpdate(pos, + needCover && y == cover ? top : Blocks.END_STONE.defaultBlockState(), false); } } } } } } - + map = chunk.getHeightmap(Type.WORLD_SURFACE); - + // Big crystals int count = (map.get(8, 8) - (center.getY() + 24)) / 7; - count = MathHelper.clamp(count, 0, 8); + count = Mth.clamp(count, 0, 8); for (int i = 0; i < count; i++) { int radius = MHelper.randRange(2, 3, random); float fill = MHelper.randRange(0F, 1F, random); @@ -105,16 +109,16 @@ public class CrystalMountainPiece extends MountainPiece { int y = map.get(x, z); if (y > 80) { pos.set(x, y, z); - if (chunk.getBlockState(pos.down()).isOf(Blocks.END_STONE)) { + if (chunk.getBlockState(pos.below()).is(Blocks.END_STONE)) { int height = MHelper.floor(radius * MHelper.randRange(1.5F, 3F, random) + (y - 80) * 0.3F); crystal(chunk, pos, radius, height, fill, random); } } } - + // Small crystals count = (map.get(8, 8) - (center.getY() + 24)) / 2; - count = MathHelper.clamp(count, 4, 8); + count = Mth.clamp(count, 4, 8); for (int i = 0; i < count; i++) { int radius = MHelper.randRange(1, 2, random); float fill = random.nextBoolean() ? 0 : 1; @@ -123,18 +127,18 @@ public class CrystalMountainPiece extends MountainPiece { int y = map.get(x, z); if (y > 80) { pos.set(x, y, z); - if (chunk.getBlockState(pos.down()).getBlock() == Blocks.END_STONE) { + if (chunk.getBlockState(pos.below()).getBlock() == Blocks.END_STONE) { int height = MHelper.floor(radius * MHelper.randRange(1.5F, 3F, random) + (y - 80) * 0.3F); crystal(chunk, pos, radius, height, fill, random); } } } - + return true; } - + private void crystal(Chunk chunk, BlockPos pos, int radius, int height, float fill, Random random) { - Mutable mut = new Mutable(); + MutableBlockPos mut = new MutableBlockPos(); int max = MHelper.floor(fill * radius + radius + 0.5F); height += pos.getY(); Heightmap map = chunk.getHeightmap(Type.WORLD_SURFACE); @@ -156,7 +160,7 @@ public class CrystalMountainPiece extends MountainPiece { int h = coefX * x + coefZ * z + height; for (int y = minY; y < h; y++) { mut.setY(y); - chunk.setBlockState(mut, EndBlocks.AURORA_CRYSTAL.getDefaultState(), false); + chunk.setBlockAndUpdate(mut, EndBlocks.AURORA_CRYSTAL.defaultBlockState(), false); } } } diff --git a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java index ceff886e..386794ac 100644 --- a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java @@ -5,19 +5,19 @@ import java.util.Random; import com.google.common.collect.Maps; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; import net.minecraft.fluid.FluidState; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtHelper; import net.minecraft.structure.StructureManager; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.util.math.ChunkPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.MathHelper; +import net.minecraft.core.Direction; +import net.minecraft.util.Mth; import net.minecraft.world.Heightmap.Type; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.biome.Biome; @@ -33,8 +33,8 @@ import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; public class LakePiece extends BasePiece { - private static final BlockState ENDSTONE = Blocks.END_STONE.getDefaultState(); - private static final BlockState WATER = Blocks.WATER.getDefaultState(); + private static final BlockState ENDSTONE = Blocks.END_STONE.defaultBlockState(); + private static final BlockState WATER = Blocks.WATER.defaultBlockState(); private Map heightmap = Maps.newHashMap(); private OpenSimplexNoise noise; private BlockPos center; @@ -42,9 +42,9 @@ public class LakePiece extends BasePiece { private float aspect; private float depth; private int seed; - - private Identifier biomeID; - + + private ResourceLocation biomeID; + public LakePiece(BlockPos center, float radius, float depth, Random random, Biome biome) { super(EndStructures.LAKE_PIECE, random.nextInt()); this.center = center; @@ -79,16 +79,17 @@ public class LakePiece extends BasePiece { seed = tag.getInt("seed"); noise = new OpenSimplexNoise(seed); aspect = radius / depth; - biomeID = new Identifier(tag.getString("biome")); + biomeID = new ResourceLocation(tag.getString("biome")); } @Override - public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, + Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { int minY = this.boundingBox.minY; int maxY = this.boundingBox.maxY; int sx = chunkPos.x << 4; int sz = chunkPos.z << 4; - Mutable mut = new Mutable(); + MutableBlockPos mut = new MutableBlockPos(); Chunk chunk = world.getChunk(chunkPos.x, chunkPos.z); for (int x = 0; x < 16; x++) { mut.setX(x); @@ -101,12 +102,13 @@ public class LakePiece extends BasePiece { double nz = wz * 0.1; int z2 = wz - center.getZ(); float clamp = getHeightClamp(world, 8, wx, wz); - if (clamp < 0.01) continue; - + if (clamp < 0.01) + continue; + double n = noise.eval(nx, nz) * 1.5 + 1.5; double x3 = MHelper.pow2(x2 + noise.eval(nx, nz, 100) * 10); double z3 = MHelper.pow2(z2 + noise.eval(nx, nz, -100) * 10); - + for (int y = minY; y <= maxY; y++) { mut.setY((int) (y + n)); double y2 = MHelper.pow2((y - center.getY()) * aspect); @@ -119,21 +121,22 @@ public class LakePiece extends BasePiece { BlockState state = chunk.getBlockState(mut); if (state.isIn(EndTags.GEN_TERRAIN) || state.isAir()) { state = mut.getY() < center.getY() ? WATER : AIR; - chunk.setBlockState(mut, state, false); + chunk.setBlockAndUpdate(mut, state, false); } - } - else if (dist <= r3 && mut.getY() < center.getY()) { + } else if (dist <= r3 && mut.getY() < center.getY()) { BlockState state = chunk.getBlockState(mut); BlockPos worldPos = mut.add(sx, 0, sz); if (!state.isFullCube(world, worldPos) && !state.isSolidBlock(world, worldPos)) { state = chunk.getBlockState(mut.up()); if (state.isAir()) { - state = random.nextBoolean() ? ENDSTONE : world.getBiome(worldPos).getGenerationSettings().getSurfaceConfig().getTopMaterial(); + state = random.nextBoolean() ? ENDSTONE + : world.getBiome(worldPos).getGenerationSettings().getSurfaceConfig() + .getTopMaterial(); + } else { + state = state.getFluidState().isEmpty() ? ENDSTONE + : EndBlocks.ENDSTONE_DUST.defaultBlockState(); } - else { - state = state.getFluidState().isEmpty() ? ENDSTONE : EndBlocks.ENDSTONE_DUST.getDefaultState(); - } - chunk.setBlockState(mut, state, false); + chunk.setBlockAndUpdate(mut, state, false); } } } @@ -142,8 +145,8 @@ public class LakePiece extends BasePiece { fixWater(world, chunk, mut, random, sx, sz); return true; } - - private void fixWater(StructureWorldAccess world, Chunk chunk, Mutable mut, Random random, int sx, int sz) { + + private void fixWater(StructureWorldAccess world, Chunk chunk, MutableBlockPos mut, Random random, int sx, int sz) { int minY = this.boundingBox.minY; int maxY = this.boundingBox.maxY; for (int x = 0; x < 16; x++) { @@ -157,39 +160,41 @@ public class LakePiece extends BasePiece { mut.setY(y - 1); if (chunk.getBlockState(mut).isAir()) { mut.setY(y + 1); - + BlockState bState = chunk.getBlockState(mut); if (bState.isAir()) { - bState = random.nextBoolean() ? ENDSTONE : world.getBiome(mut.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getTopMaterial(); + bState = random.nextBoolean() ? ENDSTONE + : world.getBiome(mut.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig() + .getTopMaterial(); + } else { + bState = bState.getFluidState().isEmpty() ? ENDSTONE + : EndBlocks.ENDSTONE_DUST.defaultBlockState(); } - else { - bState = bState.getFluidState().isEmpty() ? ENDSTONE : EndBlocks.ENDSTONE_DUST.getDefaultState(); - } - + mut.setY(y); - + makeEndstonePillar(chunk, mut, bState); - } - else if (x > 1 && x < 15 && z > 1 && z < 15) { + } else if (x > 1 && x < 15 && z > 1 && z < 15) { mut.setY(y); - for (Direction dir: BlocksHelper.HORIZONTAL) { + for (Direction dir : BlocksHelper.HORIZONTAL) { BlockPos wPos = mut.add(dir.getOffsetX(), 0, dir.getOffsetZ()); if (chunk.getBlockState(wPos).isAir()) { mut.setY(y + 1); BlockState bState = chunk.getBlockState(mut); if (bState.isAir()) { - bState = random.nextBoolean() ? ENDSTONE : world.getBiome(mut.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig().getTopMaterial(); - } - else { - bState = bState.getFluidState().isEmpty() ? ENDSTONE : EndBlocks.ENDSTONE_DUST.getDefaultState(); + bState = random.nextBoolean() ? ENDSTONE + : world.getBiome(mut.add(sx, 0, sz)).getGenerationSettings() + .getSurfaceConfig().getTopMaterial(); + } else { + bState = bState.getFluidState().isEmpty() ? ENDSTONE + : EndBlocks.ENDSTONE_DUST.defaultBlockState(); } mut.setY(y); makeEndstonePillar(chunk, mut, bState); break; } } - } - else if (chunk.getBlockState(mut.move(Direction.UP)).isAir()) { + } else if (chunk.getBlockState(mut.move(Direction.UP)).isAir()) { chunk.getFluidTickScheduler().schedule(mut.move(Direction.DOWN), state.getFluid(), 0); } } @@ -197,38 +202,38 @@ public class LakePiece extends BasePiece { } } } - - private void makeEndstonePillar(Chunk chunk, Mutable mut, BlockState terrain) { - chunk.setBlockState(mut, terrain, false); + + private void makeEndstonePillar(Chunk chunk, MutableBlockPos mut, BlockState terrain) { + chunk.setBlockAndUpdate(mut, terrain, false); mut.setY(mut.getY() - 1); while (!chunk.getFluidState(mut).isEmpty()) { - chunk.setBlockState(mut, ENDSTONE, false); + chunk.setBlockAndUpdate(mut, ENDSTONE, false); mut.setY(mut.getY() - 1); } } - + private int getHeight(StructureWorldAccess world, BlockPos pos) { int p = ((pos.getX() & 2047) << 11) | (pos.getZ() & 2047); int h = heightmap.getOrDefault(p, Byte.MIN_VALUE); if (h > Byte.MIN_VALUE) { return h; } - + if (!EndBiomes.getBiomeID(world.getBiome(pos)).equals(biomeID)) { heightmap.put(p, (byte) 0); return 0; } - + h = world.getTopY(Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); - h = MathHelper.abs(h - center.getY()); + h = Mth.abs(h - center.getY()); h = h < 8 ? 1 : 0; - + heightmap.put(p, (byte) h); return h; } - + private float getHeightClamp(StructureWorldAccess world, int radius, int posX, int posZ) { - Mutable mut = new Mutable(); + MutableBlockPos mut = new MutableBlockPos(); int r2 = radius * radius; float height = 0; float max = 0; @@ -246,9 +251,9 @@ public class LakePiece extends BasePiece { } } height /= max; - return MathHelper.clamp(height, 0, 1); + return Mth.clamp(height, 0, 1); } - + private void makeBoundingBox() { int minX = MHelper.floor(center.getX() - radius - 8); int minY = MHelper.floor(center.getY() - depth - 8); diff --git a/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java index 22ce829e..fa4cf082 100644 --- a/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java @@ -9,11 +9,11 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtHelper; import net.minecraft.structure.StructureManager; import net.minecraft.structure.StructurePieceType; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; -import net.minecraft.util.math.MathHelper; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.util.Mth; import net.minecraft.world.Heightmap.Type; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.biome.Biome; @@ -29,11 +29,12 @@ public abstract class MountainPiece extends BasePiece { protected float radius; protected float height; protected float r2; - protected Identifier biomeID; + protected ResourceLocation biomeID; protected int seed1; protected int seed2; - - public MountainPiece(StructurePieceType type, BlockPos center, float radius, float height, Random random, Biome biome) { + + public MountainPiece(StructurePieceType type, BlockPos center, float radius, float height, Random random, + Biome biome) { super(type, random.nextInt()); this.center = center; this.radius = radius; @@ -67,47 +68,48 @@ public abstract class MountainPiece extends BasePiece { center = NbtHelper.toBlockPos(tag.getCompound("center")); radius = tag.getFloat("radius"); height = tag.getFloat("height"); - biomeID = new Identifier(tag.getString("biome")); + biomeID = new ResourceLocation(tag.getString("biome")); r2 = radius * radius; seed1 = tag.getInt("seed1"); seed2 = tag.getInt("seed2"); noise1 = new OpenSimplexNoise(seed1); noise2 = new OpenSimplexNoise(seed2); } - + private int getHeight(StructureWorldAccess world, BlockPos pos) { int p = ((pos.getX() & 2047) << 11) | (pos.getZ() & 2047); int h = heightmap.getOrDefault(p, Integer.MIN_VALUE); if (h > Integer.MIN_VALUE) { return h; } - + if (!EndBiomes.getBiomeID(world.getBiome(pos)).equals(biomeID)) { heightmap.put(p, -10); return -10; } h = world.getTopY(Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); - h = MathHelper.abs(h - center.getY()); + h = Mth.abs(h - center.getY()); if (h > 4) { h = 4 - h; heightmap.put(p, h); return h; } - - h = MHelper.floor(noise2.eval(pos.getX() * 0.01, pos.getZ() * 0.01) * noise2.eval(pos.getX() * 0.002, pos.getZ() * 0.002) * 8 + 8); - + + h = MHelper.floor(noise2.eval(pos.getX() * 0.01, pos.getZ() * 0.01) + * noise2.eval(pos.getX() * 0.002, pos.getZ() * 0.002) * 8 + 8); + if (h < 0) { heightmap.put(p, 0); return 0; } - + heightmap.put(p, h); - + return h; } - + protected float getHeightClamp(StructureWorldAccess world, int radius, int posX, int posZ) { - Mutable mut = new Mutable(); + MutableBlockPos mut = new MutableBlockPos(); float height = 0; float max = 0; for (int x = -radius; x <= radius; x++) { @@ -124,9 +126,9 @@ public abstract class MountainPiece extends BasePiece { } } height /= max; - return MathHelper.clamp(height / radius, 0, 1); + return Mth.clamp(height / radius, 0, 1); } - + private void makeBoundingBox() { int minX = MHelper.floor(center.getX() - radius); int minZ = MHelper.floor(center.getZ() - radius); diff --git a/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java b/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java index 5e768f60..4ba6ab13 100644 --- a/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java @@ -8,10 +8,10 @@ import net.minecraft.structure.Structure; import net.minecraft.structure.StructureManager; import net.minecraft.structure.StructurePlacementData; import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.Identifier; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.util.math.ChunkPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.StructureAccessor; @@ -21,19 +21,20 @@ import ru.betterend.util.MHelper; import ru.betterend.util.StructureHelper; public class NBTPiece extends BasePiece { - private Identifier structureID; - private BlockRotation rotation; + private ResourceLocation structureID; + private Rotation rotation; private BlockMirror mirror; private Structure structure; private BlockPos pos; private int erosion; private boolean cover; - - public NBTPiece(Identifier structureID, Structure structure, BlockPos pos, int erosion, boolean cover, Random random) { + + public NBTPiece(ResourceLocation structureID, Structure structure, BlockPos pos, int erosion, boolean cover, + Random random) { super(EndStructures.NBT_PIECE, random.nextInt()); this.structureID = structureID; this.structure = structure; - this.rotation = BlockRotation.random(random); + this.rotation = Rotation.random(random); this.mirror = BlockMirror.values()[random.nextInt(3)]; this.pos = StructureHelper.offsetPos(pos, structure, rotation, mirror); this.erosion = erosion; @@ -58,8 +59,8 @@ public class NBTPiece extends BasePiece { @Override protected void fromNbt(CompoundTag tag) { - structureID = new Identifier(tag.getString("id")); - rotation = BlockRotation.values()[tag.getInt("rotation")]; + structureID = new ResourceLocation(tag.getString("id")); + rotation = Rotation.values()[tag.getInt("rotation")]; mirror = BlockMirror.values()[tag.getInt("mirror")]; erosion = tag.getInt("erosion"); pos = NbtHelper.toBlockPos(tag.getCompound("pos")); @@ -68,11 +69,13 @@ public class NBTPiece extends BasePiece { } @Override - public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, + Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { BlockBox bounds = new BlockBox(blockBox); bounds.maxY = this.boundingBox.maxY; bounds.minY = this.boundingBox.minY; - StructurePlacementData placementData = new StructurePlacementData().setRotation(rotation).setMirror(mirror).setBoundingBox(bounds); + StructurePlacementData placementData = new StructurePlacementData().setRotation(rotation).setMirror(mirror) + .setBoundingBox(bounds); structure.place(world, pos, placementData, random); if (erosion > 0) { bounds.maxX = MHelper.min(bounds.maxX, boundingBox.maxX); @@ -86,7 +89,7 @@ public class NBTPiece extends BasePiece { } return true; } - + private void makeBoundingBox() { this.boundingBox = StructureHelper.getStructureBounds(pos, structure, rotation, mirror); } diff --git a/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java index 3176cf11..ce0a802b 100644 --- a/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java @@ -2,14 +2,14 @@ package ru.betterend.world.structures.piece; import java.util.Random; -import net.minecraft.block.BlockState; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.NbtHelper; import net.minecraft.structure.StructureManager; import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.util.math.ChunkPos; import net.minecraft.world.Heightmap; import net.minecraft.world.Heightmap.Type; @@ -23,7 +23,9 @@ import ru.betterend.util.MHelper; public class PaintedMountainPiece extends MountainPiece { private BlockState[] slises; - public PaintedMountainPiece(BlockPos center, float radius, float height, Random random, Biome biome, BlockState[] slises) { + + public PaintedMountainPiece(BlockPos center, float radius, float height, Random random, Biome biome, + BlockState[] slises) { super(EndStructures.PAINTED_MOUNTAIN_PIECE, center, radius, height, random, biome); this.slises = slises; } @@ -36,7 +38,7 @@ public class PaintedMountainPiece extends MountainPiece { protected void toNbt(CompoundTag tag) { super.toNbt(tag); ListTag slise = new ListTag(); - for (BlockState state: slises) { + for (BlockState state : slises) { slise.add(NbtHelper.fromBlockState(state)); } tag.put("slises", slise); @@ -53,10 +55,11 @@ public class PaintedMountainPiece extends MountainPiece { } @Override - public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, + Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { int sx = chunkPos.getStartX(); int sz = chunkPos.getStartZ(); - Mutable pos = new Mutable(); + MutableBlockPos pos = new MutableBlockPos(); Chunk chunk = world.getChunk(chunkPos.x, chunkPos.z); Heightmap map = chunk.getHeightmap(Type.WORLD_SURFACE); Heightmap map2 = chunk.getHeightmap(Type.WORLD_SURFACE_WG); @@ -76,7 +79,7 @@ public class PaintedMountainPiece extends MountainPiece { int minY = map.get(x, z); pos.setY(minY - 1); while (chunk.getBlockState(pos).isAir() && pos.getY() > 50) { - pos.setY(minY --); + pos.setY(minY--); } minY = pos.getY(); minY = Math.max(minY, map2.get(x, z)); @@ -86,18 +89,19 @@ public class PaintedMountainPiece extends MountainPiece { maxY *= (float) noise1.eval(px * 0.05, pz * 0.05) * 0.3F + 0.7F; maxY *= (float) noise1.eval(px * 0.1, pz * 0.1) * 0.1F + 0.9F; maxY += center.getY(); - float offset = (float) (noise1.eval(px * 0.07, pz * 0.07) * 5 + noise1.eval(px * 0.2, pz * 0.2) * 2 + 7); + float offset = (float) (noise1.eval(px * 0.07, pz * 0.07) * 5 + + noise1.eval(px * 0.2, pz * 0.2) * 2 + 7); for (int y = minY - 1; y < maxY; y++) { pos.setY(y); int index = MHelper.floor((y + offset) * 0.65F) % slises.length; - chunk.setBlockState(pos, slises[index], false); + chunk.setBlockAndUpdate(pos, slises[index], false); } } } } } } - + return true; } } diff --git a/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java b/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java index f9b6f676..fa3451ea 100644 --- a/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java @@ -6,7 +6,7 @@ import java.util.function.Consumer; import net.minecraft.nbt.CompoundTag; import net.minecraft.structure.StructureManager; import net.minecraft.util.math.BlockBox; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import net.minecraft.util.math.ChunkPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.StructureAccessor; @@ -16,7 +16,7 @@ import ru.betterend.world.structures.StructureWorld; public class VoxelPiece extends BasePiece { private StructureWorld world; - + public VoxelPiece(Consumer function, int id) { super(EndStructures.VOXEL_PIECE, id); world = new StructureWorld(); @@ -40,7 +40,8 @@ public class VoxelPiece extends BasePiece { } @Override - public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, + Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { this.world.placeChunk(world, chunkPos); return true; } diff --git a/src/main/java/ru/betterend/world/surface/DoubleBlockSurfaceBuilder.java b/src/main/java/ru/betterend/world/surface/DoubleBlockSurfaceBuilder.java index 01b48a5c..94d25ebe 100644 --- a/src/main/java/ru/betterend/world/surface/DoubleBlockSurfaceBuilder.java +++ b/src/main/java/ru/betterend/world/surface/DoubleBlockSurfaceBuilder.java @@ -2,10 +2,10 @@ package ru.betterend.world.surface; import java.util.Random; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.core.Registry; import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.gen.surfacebuilder.ConfiguredSurfaceBuilder; @@ -18,35 +18,38 @@ public class DoubleBlockSurfaceBuilder extends SurfaceBuilder 0 ? config1 : config2); + SurfaceBuilder.DEFAULT.generate(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, seaLevel, + seed, noise > 0 ? config1 : config2); } - + public static DoubleBlockSurfaceBuilder register(String name) { return Registry.register(Registry.SURFACE_BUILDER, name, new DoubleBlockSurfaceBuilder()); } - + public ConfiguredSurfaceBuilder configured() { - BlockState stone = Blocks.END_STONE.getDefaultState(); + BlockState stone = Blocks.END_STONE.defaultBlockState(); return this.withConfig(new TernarySurfaceConfig(config1.getTopMaterial(), stone, stone)); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java b/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java index 7c75ea39..746a4b38 100644 --- a/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java +++ b/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java @@ -2,8 +2,8 @@ package ru.betterend.world.surface; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.Registry; import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.gen.surfacebuilder.SurfaceBuilder; @@ -13,28 +13,32 @@ import ru.betterend.util.MHelper; public class SulphuricSurfaceBuilder extends SurfaceBuilder { private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(5123); - + public SulphuricSurfaceBuilder() { super(TernarySurfaceConfig.CODEC); } @Override - public void generate(Random random, Chunk chunk, Biome biome, int x, int z, int height, double noise, BlockState defaultBlock, BlockState defaultFluid, int seaLevel, long seed, TernarySurfaceConfig surfaceBlocks) { - double value = NOISE.eval(x * 0.03, z * 0.03) + NOISE.eval(x * 0.1, z * 0.1) * 0.3 + MHelper.randRange(-0.1, 0.1, MHelper.RANDOM); + public void generate(Random random, Chunk chunk, Biome biome, int x, int z, int height, double noise, + BlockState defaultBlock, BlockState defaultFluid, int seaLevel, long seed, + TernarySurfaceConfig surfaceBlocks) { + double value = NOISE.eval(x * 0.03, z * 0.03) + NOISE.eval(x * 0.1, z * 0.1) * 0.3 + + MHelper.randRange(-0.1, 0.1, MHelper.RANDOM); if (value < -0.6) { - SurfaceBuilder.DEFAULT.generate(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, seaLevel, seed, SurfaceBuilders.DEFAULT_END_CONFIG); - } - else if (value < -0.3) { - SurfaceBuilder.DEFAULT.generate(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, seaLevel, seed, SurfaceBuilders.FLAVOLITE_CONFIG); - } - else if (value < 0.5) { - SurfaceBuilder.DEFAULT.generate(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, seaLevel, seed, SurfaceBuilders.SULFURIC_ROCK_CONFIG); - } - else { - SurfaceBuilder.DEFAULT.generate(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, seaLevel, seed, SurfaceBuilders.BRIMSTONE_CONFIG); + SurfaceBuilder.DEFAULT.generate(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, + seaLevel, seed, SurfaceBuilders.DEFAULT_END_CONFIG); + } else if (value < -0.3) { + SurfaceBuilder.DEFAULT.generate(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, + seaLevel, seed, SurfaceBuilders.FLAVOLITE_CONFIG); + } else if (value < 0.5) { + SurfaceBuilder.DEFAULT.generate(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, + seaLevel, seed, SurfaceBuilders.SULFURIC_ROCK_CONFIG); + } else { + SurfaceBuilder.DEFAULT.generate(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, + seaLevel, seed, SurfaceBuilders.BRIMSTONE_CONFIG); } } - + public static SulphuricSurfaceBuilder register(String name) { return Registry.register(Registry.SURFACE_BUILDER, name, new SulphuricSurfaceBuilder()); } diff --git a/src/main/java/ru/betterend/world/surface/SurfaceBuilders.java b/src/main/java/ru/betterend/world/surface/SurfaceBuilders.java index 90c200ef..2246f34a 100644 --- a/src/main/java/ru/betterend/world/surface/SurfaceBuilders.java +++ b/src/main/java/ru/betterend/world/surface/SurfaceBuilders.java @@ -1,9 +1,9 @@ package ru.betterend.world.surface; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.core.Registry; import net.minecraft.world.gen.surfacebuilder.SurfaceBuilder; import net.minecraft.world.gen.surfacebuilder.TernarySurfaceConfig; import ru.betterend.registry.EndBlocks; @@ -13,17 +13,20 @@ public class SurfaceBuilders { public static final TernarySurfaceConfig FLAVOLITE_CONFIG = makeSimpleConfig(EndBlocks.FLAVOLITE.stone); public static final TernarySurfaceConfig BRIMSTONE_CONFIG = makeSimpleConfig(EndBlocks.BRIMSTONE); public static final TernarySurfaceConfig SULFURIC_ROCK_CONFIG = makeSimpleConfig(EndBlocks.SULPHURIC_ROCK.stone); - - public static final SurfaceBuilder SULPHURIC_SURFACE = register("sulphuric_surface", new SulphuricSurfaceBuilder()); - - private static SurfaceBuilder register(String name, SurfaceBuilder builder) { + + public static final SurfaceBuilder SULPHURIC_SURFACE = register("sulphuric_surface", + new SulphuricSurfaceBuilder()); + + private static SurfaceBuilder register(String name, + SurfaceBuilder builder) { return Registry.register(Registry.SURFACE_BUILDER, name, builder); } - + private static TernarySurfaceConfig makeSimpleConfig(Block block) { - BlockState state = block.getDefaultState(); + BlockState state = block.defaultBlockState(); return new TernarySurfaceConfig(state, state, state); } - - public static void register() {} + + public static void register() { + } } From 33dbfbe633d8ec70381e6f43b5b0ac05d42f1dd2 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Mon, 12 Apr 2021 16:34:13 +0300 Subject: [PATCH 408/463] Continue migration --- .../betterend/blocks/BlueVineSeedBlock.java | 6 +- .../ru/betterend/blocks/BrimstoneBlock.java | 2 +- .../betterend/blocks/BulbVineSeedBlock.java | 4 +- .../blocks/CavePumpkinVineBlock.java | 4 +- .../ru/betterend/blocks/CharniaBlock.java | 2 +- .../blocks/DragonTreeSaplingBlock.java | 2 +- .../ru/betterend/blocks/EmeraldIceBlock.java | 4 +- .../ru/betterend/blocks/EndLilyBlock.java | 2 +- .../ru/betterend/blocks/EndLilySeedBlock.java | 8 +- .../betterend/blocks/EndLotusSeedBlock.java | 14 +- .../betterend/blocks/EndLotusStemBlock.java | 2 +- .../ru/betterend/blocks/EndStoneSmelter.java | 6 +- .../ru/betterend/blocks/EndTerrainBlock.java | 4 +- .../ru/betterend/blocks/EternalPedestal.java | 4 +- .../blocks/EternalRunedFlavolite.java | 4 +- .../blocks/GlowingPillarSeedBlock.java | 4 +- .../blocks/HelixTreeSaplingBlock.java | 2 +- .../blocks/HydraluxSaplingBlock.java | 4 +- .../blocks/HydrothermalVentBlock.java | 2 +- .../blocks/LacugroveSaplingBlock.java | 2 +- .../betterend/blocks/LanceleafSeedBlock.java | 4 +- .../betterend/blocks/LumecornSeedBlock.java | 6 +- .../betterend/blocks/MengerSpongeBlock.java | 2 +- .../blocks/MengerSpongeWetBlock.java | 8 +- .../blocks/MossyGlowshroomSaplingBlock.java | 2 +- .../ru/betterend/blocks/MurkweedBlock.java | 8 +- .../ru/betterend/blocks/NeonCactusBlock.java | 2 +- .../blocks/PythadendronSaplingBlock.java | 2 +- .../betterend/blocks/RespawnObeliskBlock.java | 6 +- .../betterend/blocks/SilkMothHiveBlock.java | 4 +- .../betterend/blocks/SilkMothNestBlock.java | 6 +- .../betterend/blocks/SmallAmaranitaBlock.java | 4 +- .../blocks/SmallJellyshroomBlock.java | 2 +- .../blocks/SmaragdantCrystalShardBlock.java | 2 +- .../betterend/blocks/SulphurCrystalBlock.java | 2 +- .../betterend/blocks/TenaneaSaplingBlock.java | 2 +- .../blocks/UmbrellaTreeClusterBlock.java | 4 +- .../blocks/UmbrellaTreeSaplingBlock.java | 2 +- .../blocks/VentBubbleColumnBlock.java | 2 +- .../blocks/basis/EndBarrelBlock.java | 4 +- .../blocks/basis/EndBlockStripableLogLog.java | 4 +- .../blocks/basis/EndFurnaceBlock.java | 4 +- .../blocks/basis/EndLadderBlock.java | 2 +- .../blocks/basis/EndLanternBlock.java | 2 +- .../blocks/basis/EndPlantWithAgeBlock.java | 4 +- .../betterend/blocks/basis/EndSignBlock.java | 8 +- .../basis/EndUnderwaterWallPlantBlock.java | 2 +- .../blocks/basis/FeatureSaplingBlock.java | 4 +- .../ru/betterend/blocks/basis/FurBlock.java | 8 +- .../betterend/blocks/basis/PedestalBlock.java | 6 +- .../blocks/basis/StalactiteBlock.java | 2 +- .../blocks/basis/StrippableBarkBlock.java | 4 +- .../blocks/basis/TripleTerrainBlock.java | 4 +- .../blocks/basis/UnderwaterPlantBlock.java | 2 +- .../basis/UnderwaterPlantWithAgeBlock.java | 4 +- .../blocks/basis/UpDownPlantBlock.java | 4 +- .../blocks/complex/ColoredMaterial.java | 6 +- .../blocks/complex/WoodenMaterial.java | 4 +- .../blocks/entities/EBarrelBlockEntity.java | 10 +- .../entities/EndStoneSmelterBlockEntity.java | 10 +- .../blocks/entities/PedestalBlockEntity.java | 4 +- .../render/EndChestBlockEntityRenderer.java | 2 +- .../render/EndSignBlockEntityRenderer.java | 2 +- .../entities/render/PedestalItemRenderer.java | 6 +- .../gui/EndStoneSmelterScreenHandler.java | 6 +- .../client/gui/slot/SmelterOutputSlot.java | 8 +- .../betterend/client/render/BeamRenderer.java | 2 +- .../client/render/EndCrystalRenderer.java | 2 +- .../client/render/EternalCrystalRenderer.java | 2 +- .../java/ru/betterend/effects/EndPotions.java | 16 +- .../betterend/effects/EndStatusEffects.java | 8 +- .../effects/status/EndVeilEffect.java | 8 +- .../ru/betterend/entity/CubozoaEntity.java | 26 ++-- .../ru/betterend/entity/DragonflyEntity.java | 14 +- .../ru/betterend/entity/EndFishEntity.java | 14 +- .../ru/betterend/entity/EndSlimeEntity.java | 48 +++--- .../betterend/entity/ShadowWalkerEntity.java | 28 ++-- .../ru/betterend/entity/SilkMothEntity.java | 18 +-- .../FlamboyantRefabricatedIntegration.java | 6 +- .../betterend/integration/ModIntegration.java | 20 +-- .../integration/NourishIntegration.java | 8 +- .../integration/byg/BYGIntegration.java | 4 +- .../integration/byg/biomes/EterialGrove.java | 4 +- .../byg/biomes/NightshadeRedwoods.java | 4 +- .../byg/biomes/OldBulbisGardens.java | 12 +- .../byg/features/BigEtherTreeFeature.java | 14 +- .../features/GreatNightshadeTreeFeature.java | 12 +- .../NightshadeRedwoodTreeFeature.java | 12 +- .../byg/features/OldBulbisTreeFeature.java | 26 ++-- .../rei/REIAlloyingFuelCategory.java | 4 +- .../ru/betterend/interfaces/IBiomeArray.java | 2 +- .../ru/betterend/interfaces/IBiomeList.java | 6 +- .../java/ru/betterend/item/DrinkItem.java | 8 +- .../ru/betterend/item/EnchantedPetalItem.java | 2 +- .../java/ru/betterend/item/EndArmorItem.java | 16 +- .../ru/betterend/item/EternalCrystalItem.java | 2 +- .../java/ru/betterend/item/GuideBookItem.java | 6 +- .../ru/betterend/item/PatternedDiscItem.java | 9 +- .../item/material/EndArmorMaterial.java | 2 +- .../ru/betterend/item/tool/EndHammerItem.java | 63 ++++---- .../mixin/client/BackgroundRendererMixin.java | 12 +- .../mixin/client/BiomeColorsMixin.java | 4 +- .../client/ClientPlayNetworkHandlerMixin.java | 4 +- .../mixin/client/MinecraftClientMixin.java | 4 +- .../mixin/client/MusicTrackerMixin.java | 4 +- .../mixin/client/WorldRendererMixin.java | 8 +- .../mixin/common/AnvilScreenHandlerMixin.java | 8 +- .../mixin/common/ArmorItemAccessor.java | 8 +- .../mixin/common/BiomeArrayMixin.java | 2 +- .../mixin/common/BoneMealItemMixin.java | 2 +- .../mixin/common/BrewingAccessor.java | 2 +- .../mixin/common/ChorusPlantFeatureMixin.java | 12 +- .../mixin/common/ComposterBlockAccessor.java | 4 +- .../common/CraftingScreenHandlerMixin.java | 4 +- .../mixin/common/DimensionTypeMixin.java | 4 +- .../mixin/common/EndCityFeatureMixin.java | 20 +-- .../mixin/common/EndPortalFeatureMixin.java | 16 +- .../mixin/common/EndSpikeFeatureMixin.java | 17 +- .../mixin/common/EndermanEntityMixin.java | 8 +- .../betterend/mixin/common/EntityMixin.java | 2 +- .../common/GenerationSettingsAccessor.java | 10 +- .../mixin/common/HostileEntityMixin.java | 7 +- .../mixin/common/LivingEntityMixin.java | 20 +-- .../mixin/common/MinecraftServerMixin.java | 4 +- .../common/NoiseChunkGeneratorMixin.java | 24 +-- .../mixin/common/PlayerEntityMixin.java | 4 +- .../mixin/common/PlayerManagerMixin.java | 20 +-- .../mixin/common/ServerPlayerEntityMixin.java | 15 +- .../mixin/common/ServerWorldMixin.java | 6 +- .../common/WeightedBiomePickerMixin.java | 21 +-- .../java/ru/betterend/patterns/Patterns.java | 6 +- .../ru/betterend/recipe/CraftingRecipes.java | 2 +- .../recipe/builders/AlloyingRecipe.java | 14 +- .../recipe/builders/AnvilRecipe.java | 20 +-- .../recipe/builders/FurnaceRecipe.java | 8 +- .../betterend/recipe/builders/GridRecipe.java | 10 +- .../recipe/builders/InfusionRecipe.java | 8 +- .../recipe/builders/SmithingTableRecipe.java | 10 +- .../java/ru/betterend/registry/EndBiomes.java | 66 ++++---- .../java/ru/betterend/registry/EndBlocks.java | 2 +- .../ru/betterend/registry/EndFeatures.java | 4 +- .../java/ru/betterend/registry/EndItems.java | 115 +++++++------- .../java/ru/betterend/registry/EndSounds.java | 2 +- .../ru/betterend/registry/EndStructures.java | 4 +- .../java/ru/betterend/registry/EndTags.java | 42 ++--- .../ru/betterend/rituals/EternalRitual.java | 8 +- .../ru/betterend/rituals/InfusionRitual.java | 4 +- .../java/ru/betterend/util/BlocksHelper.java | 6 +- .../java/ru/betterend/util/ColorUtil.java | 6 +- .../ru/betterend/util/FeaturesHelper.java | 6 +- src/main/java/ru/betterend/util/MHelper.java | 145 +++++++++--------- .../java/ru/betterend/util/RecipeHelper.java | 12 +- .../java/ru/betterend/util/SplineHelper.java | 46 +++--- .../ru/betterend/util/StructureHelper.java | 26 ++-- .../java/ru/betterend/util/TagHelper.java | 44 +++--- src/main/java/ru/betterend/util/sdf/SDF.java | 30 ++-- .../util/sdf/operator/SDFCoordModify.java | 6 +- .../util/sdf/operator/SDFDisplacement.java | 6 +- .../util/sdf/operator/SDFRotation.java | 6 +- .../world/biome/BiomeDefinition.java | 14 +- .../ru/betterend/world/biome/EndBiome.java | 2 +- .../world/biome/cave/EndCaveBiome.java | 2 +- .../world/biome/land/AmberLandBiome.java | 2 +- .../world/biome/land/ChorusForestBiome.java | 4 +- .../world/biome/land/DryShrublandBiome.java | 2 +- .../world/biome/land/DustWastelandsBiome.java | 2 +- .../biome/land/FoggyMushroomlandBiome.java | 2 +- .../biome/land/GlowingGrasslandsBiome.java | 2 +- .../world/biome/land/LanternWoodsBiome.java | 2 +- .../world/biome/land/NeonOasisBiome.java | 2 +- .../world/biome/land/ShadowForestBiome.java | 2 +- .../world/biome/land/UmbrellaJungleBiome.java | 2 +- .../world/features/BiomeIslandFeature.java | 14 +- .../world/features/BlueVineFeature.java | 7 +- .../world/features/CavePlantFeature.java | 7 +- .../world/features/CavePumpkinFeature.java | 10 +- .../world/features/CrashedShipFeature.java | 22 +-- .../world/features/DefaultFeature.java | 34 ++-- .../world/features/DoublePlantFeature.java | 7 +- .../betterend/world/features/EndFeature.java | 32 ++-- .../world/features/EndLilyFeature.java | 4 +- .../world/features/EndLotusFeature.java | 4 +- .../world/features/EndLotusLeafFeature.java | 13 +- .../world/features/FilaluxFeature.java | 4 +- .../features/FullHeightScatterFeature.java | 14 +- .../world/features/GlowPillarFeature.java | 7 +- .../world/features/HydraluxFeature.java | 4 +- .../features/InvertedScatterFeature.java | 14 +- .../world/features/LanceleafFeature.java | 7 +- .../betterend/world/features/ListFeature.java | 14 +- .../world/features/MengerSpongeFeature.java | 4 +- .../world/features/NBTStructureFeature.java | 34 ++-- .../world/features/NeonCactusFeature.java | 12 +- .../world/features/ScatterFeature.java | 20 +-- .../world/features/SilkMothNestFeature.java | 12 +- .../SingleInvertedScatterFeature.java | 7 +- .../world/features/SinglePlantFeature.java | 9 +- .../world/features/SkyScatterFeature.java | 11 +- .../features/UnderwaterPlantFeature.java | 7 +- .../features/UnderwaterPlantScatter.java | 15 +- .../betterend/world/features/VineFeature.java | 9 +- .../world/features/WallPlantFeature.java | 6 +- .../world/features/WallPlantOnLogFeature.java | 4 +- .../world/features/WallScatterFeature.java | 14 +- .../world/features/bushes/BushFeature.java | 12 +- .../features/bushes/BushWithOuterFeature.java | 12 +- .../bushes/LargeAmaranitaFeature.java | 10 +- .../world/features/bushes/Lumecorn.java | 10 +- .../features/bushes/TenaneaBushFeature.java | 12 +- .../terrain/BigAuroraCrystalFeature.java | 12 +- .../features/terrain/EndLakeFeature.java | 15 +- .../features/terrain/FallenPillarFeature.java | 14 +- .../terrain/FloatingSpireFeature.java | 21 +-- .../world/features/terrain/GeyserFeature.java | 24 +-- .../features/terrain/IceStarFeature.java | 12 +- .../terrain/ObsidianBoulderFeature.java | 14 +- .../ObsidianPillarBasementFeature.java | 14 +- .../features/terrain/OreLayerFeature.java | 16 +- .../features/terrain/SingleBlockFeature.java | 10 +- .../terrain/SmaragdantCrystalFeature.java | 10 +- .../world/features/terrain/SpireFeature.java | 31 ++-- .../features/terrain/StalactiteFeature.java | 10 +- .../features/terrain/SulphurHillFeature.java | 12 +- .../terrain/SulphuricCaveFeature.java | 18 +-- .../terrain/SulphuricLakeFeature.java | 30 ++-- .../features/terrain/SurfaceVentFeature.java | 10 +- .../caves/CaveChunkPopulatorFeature.java | 29 ++-- .../terrain/caves/EndCaveFeature.java | 46 +++--- .../terrain/caves/RoundCaveFeature.java | 6 +- .../terrain/caves/TunelCaveFeature.java | 12 +- .../features/trees/DragonTreeFeature.java | 22 ++- .../trees/GiganticAmaranitaFeature.java | 14 +- .../features/trees/HelixTreeFeature.java | 14 +- .../features/trees/JellyshroomFeature.java | 14 +- .../features/trees/LacugroveFeature.java | 17 +- .../world/features/trees/LucerniaFeature.java | 22 +-- .../trees/MossyGlowshroomFeature.java | 12 +- .../trees/PythadendronTreeFeature.java | 18 +-- .../world/features/trees/TenaneaFeature.java | 19 ++- .../features/trees/UmbrellaTreeFeature.java | 26 ++-- .../world/generator/BetterEndBiomeSource.java | 8 +- .../world/generator/TerrainGenerator.java | 2 +- .../processors/TerrainStructureProcessor.java | 4 +- .../world/structures/EndStructureFeature.java | 16 +- .../world/structures/StructureWorld.java | 4 +- .../features/EternalPortalStructure.java | 20 +-- .../features/FeatureBaseStructure.java | 14 +- .../features/GiantIceStarStructure.java | 20 +-- .../GiantMossyGlowshroomStructure.java | 2 +- .../features/MegaLakeSmallStructure.java | 18 +-- .../features/MegaLakeStructure.java | 18 +-- .../features/MountainStructure.java | 18 +-- .../features/PaintedMountainStructure.java | 18 +-- .../features/SDFStructureFeature.java | 18 +-- .../world/structures/piece/CavePiece.java | 8 +- .../piece/CrystalMountainPiece.java | 14 +- .../world/structures/piece/LakePiece.java | 26 ++-- .../world/structures/piece/MountainPiece.java | 10 +- .../world/structures/piece/NBTPiece.java | 8 +- .../piece/PaintedMountainPiece.java | 10 +- .../world/structures/piece/VoxelPiece.java | 8 +- .../surface/DoubleBlockSurfaceBuilder.java | 2 +- .../surface/SulphuricSurfaceBuilder.java | 2 +- 263 files changed, 1450 insertions(+), 1486 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java b/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java index f5ff9a39..5c8e3b99 100644 --- a/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java @@ -6,7 +6,7 @@ import net.minecraft.world.level.block.AbstractBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.blocks.basis.FurBlock; @@ -16,7 +16,7 @@ import ru.betterend.util.MHelper; public class BlueVineSeedBlock extends EndPlantWithAgeBlock { @Override - public void growAdult(StructureWorldAccess world, Random random, BlockPos pos) { + public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { int height = MHelper.randRange(2, 5, random); int h = BlocksHelper.upRay(world, pos, height + 2); if (h < height + 1) { @@ -33,7 +33,7 @@ public class BlueVineSeedBlock extends EndPlantWithAgeBlock { placeLantern(world, pos.up(height + 1)); } - private void placeLantern(StructureWorldAccess world, BlockPos pos) { + private void placeLantern(WorldGenLevel world, BlockPos pos) { BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.BLUE_VINE_LANTERN.defaultBlockState().with(BlueVineLanternBlock.NATURAL, true)); for (Direction dir : BlocksHelper.HORIZONTAL) { diff --git a/src/main/java/ru/betterend/blocks/BrimstoneBlock.java b/src/main/java/ru/betterend/blocks/BrimstoneBlock.java index 804b2442..50f5439a 100644 --- a/src/main/java/ru/betterend/blocks/BrimstoneBlock.java +++ b/src/main/java/ru/betterend/blocks/BrimstoneBlock.java @@ -11,7 +11,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.MaterialColor; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.fluid.Fluids; +import net.minecraft.world.level.material.Fluids; import net.minecraft.world.item.ItemStack; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.block.state.StateDefinition; diff --git a/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java b/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java index adc98069..bbcb470e 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java @@ -5,7 +5,7 @@ import java.util.Random; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.tags.BlockTags; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.WorldView; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; @@ -21,7 +21,7 @@ public class BulbVineSeedBlock extends EndPlantWithAgeBlock { } @Override - public void growAdult(StructureWorldAccess world, Random random, BlockPos pos) { + public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { int h = BlocksHelper.downRay(world, pos, random.nextInt(24)) - 1; if (h > 2) { BlocksHelper.setWithoutUpdate(world, pos, diff --git a/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java b/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java index 9402a564..592f5de0 100644 --- a/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java +++ b/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java @@ -11,7 +11,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; @@ -45,7 +45,7 @@ public class CavePumpkinVineBlock extends EndPlantWithAgeBlock { } @Override - public void growAdult(StructureWorldAccess world, Random random, BlockPos pos) { + public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { } @Override diff --git a/src/main/java/ru/betterend/blocks/CharniaBlock.java b/src/main/java/ru/betterend/blocks/CharniaBlock.java index d6279ce6..ca03ed0b 100644 --- a/src/main/java/ru/betterend/blocks/CharniaBlock.java +++ b/src/main/java/ru/betterend/blocks/CharniaBlock.java @@ -1,7 +1,7 @@ package ru.betterend.blocks; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.fluid.Fluids; +import net.minecraft.world.level.material.Fluids; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.WorldView; diff --git a/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java b/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java index 258f1733..7d909473 100644 --- a/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java @@ -3,7 +3,7 @@ package ru.betterend.blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; import net.minecraft.world.WorldView; -import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.blocks.basis.FeatureSaplingBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; diff --git a/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java index f428f331..dabdbeca 100644 --- a/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java +++ b/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java @@ -15,7 +15,7 @@ import net.minecraft.world.level.block.TransparentBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.Enchantments; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.server.level.ServerLevel; @@ -40,7 +40,7 @@ public class EmeraldIceBlock extends TransparentBlock implements IRenderTypeable } @Override - public void afterBreak(Level world, PlayerEntity player, BlockPos pos, BlockState state, + public void afterBreak(Level world, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack stack) { super.afterBreak(world, player, pos, state, blockEntity, stack); if (EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, stack) == 0) { diff --git a/src/main/java/ru/betterend/blocks/EndLilyBlock.java b/src/main/java/ru/betterend/blocks/EndLilyBlock.java index 3d4a8ae7..e6f300ee 100644 --- a/src/main/java/ru/betterend/blocks/EndLilyBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLilyBlock.java @@ -16,7 +16,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.Material; import net.minecraft.world.level.block.ShapeContext; import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; +import net.minecraft.world.level.material.Fluids; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.block.SoundType; diff --git a/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java b/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java index 86173da4..aa158218 100644 --- a/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java @@ -2,9 +2,9 @@ package ru.betterend.blocks; import java.util.Random; -import net.minecraft.fluid.Fluids; +import net.minecraft.world.level.material.Fluids; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.UnderwaterPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; @@ -12,7 +12,7 @@ import ru.betterend.util.BlocksHelper; public class EndLilySeedBlock extends UnderwaterPlantWithAgeBlock { @Override - public void grow(StructureWorldAccess world, Random random, BlockPos pos) { + public void grow(WorldGenLevel world, Random random, BlockPos pos) { if (canGrow(world, pos)) { BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.END_LILY.defaultBlockState().with(EndLilyBlock.SHAPE, TripleShape.BOTTOM)); @@ -27,7 +27,7 @@ public class EndLilySeedBlock extends UnderwaterPlantWithAgeBlock { } } - private boolean canGrow(StructureWorldAccess world, BlockPos pos) { + private boolean canGrow(WorldGenLevel world, BlockPos pos) { BlockPos up = pos.up(); while (world.getBlockState(up).getFluidState().getFluid().equals(Fluids.WATER.getStill())) { up = up.up(); diff --git a/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java b/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java index ebcfd741..c812c3b4 100644 --- a/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java @@ -3,11 +3,11 @@ package ru.betterend.blocks; import java.util.Random; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.fluid.Fluids; +import net.minecraft.world.level.material.Fluids; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.UnderwaterPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; @@ -15,7 +15,7 @@ import ru.betterend.util.BlocksHelper; public class EndLotusSeedBlock extends UnderwaterPlantWithAgeBlock { @Override - public void grow(StructureWorldAccess world, Random random, BlockPos pos) { + public void grow(WorldGenLevel world, Random random, BlockPos pos) { if (canGrow(world, pos)) { BlockState startLeaf = EndBlocks.END_LOTUS_STEM.defaultBlockState().with(EndLotusStemBlock.LEAF, true); BlockState roots = EndBlocks.END_LOTUS_STEM.defaultBlockState() @@ -34,7 +34,7 @@ public class EndLotusSeedBlock extends UnderwaterPlantWithAgeBlock { int height = random.nextBoolean() ? 0 : random.nextBoolean() ? 1 : random.nextBoolean() ? 1 : -1; TripleShape shape = (height == 0) ? TripleShape.TOP : TripleShape.MIDDLE; Direction dir = BlocksHelper.randomHorizontal(random); - BlockPos leafCenter = bpos.toImmutable().offset(dir); + BlockPos leafCenter = bpos.immutable().offset(dir); if (hasLeaf(world, leafCenter)) { generateLeaf(world, leafCenter); BlocksHelper.setWithoutUpdate(world, bpos, @@ -79,7 +79,7 @@ public class EndLotusSeedBlock extends UnderwaterPlantWithAgeBlock { } } - private boolean canGrow(StructureWorldAccess world, BlockPos pos) { + private boolean canGrow(WorldGenLevel world, BlockPos pos) { MutableBlockPos bpos = new MutableBlockPos(); bpos.set(pos); while (world.getBlockState(bpos).getFluidState().getFluid().equals(Fluids.WATER.getStill())) { @@ -88,7 +88,7 @@ public class EndLotusSeedBlock extends UnderwaterPlantWithAgeBlock { return world.isAir(bpos) && world.isAir(bpos.up()); } - private void generateLeaf(StructureWorldAccess world, BlockPos pos) { + private void generateLeaf(WorldGenLevel world, BlockPos pos) { MutableBlockPos p = new MutableBlockPos(); BlockState leaf = EndBlocks.END_LOTUS_LEAF.defaultBlockState(); BlocksHelper.setWithoutUpdate(world, pos, leaf.with(EndLotusLeafBlock.SHAPE, TripleShape.BOTTOM)); @@ -104,7 +104,7 @@ public class EndLotusSeedBlock extends UnderwaterPlantWithAgeBlock { } } - private boolean hasLeaf(StructureWorldAccess world, BlockPos pos) { + private boolean hasLeaf(WorldGenLevel world, BlockPos pos) { MutableBlockPos p = new MutableBlockPos(); p.setY(pos.getY()); int count = 0; diff --git a/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java b/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java index 89506156..5e0e06eb 100644 --- a/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java @@ -11,7 +11,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.ShapeContext; import net.minecraft.world.level.block.Waterloggable; import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; +import net.minecraft.world.level.material.Fluids; import net.minecraft.world.item.ItemPlacementContext; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.BooleanProperty; diff --git a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java index 9fb70e5a..bdcf1674 100644 --- a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java +++ b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java @@ -15,7 +15,7 @@ import net.minecraft.world.level.block.HorizontalFacingBlock; import net.minecraft.world.level.material.Material; import net.minecraft.world.level.material.MaterialColor; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemPlacementContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; @@ -52,7 +52,7 @@ public class EndStoneSmelter extends BaseBlockWithEntity { this.setDefaultState(this.stateManager.defaultBlockState().with(FACING, Direction.NORTH).with(LIT, false)); } - public ActionResult onUse(BlockState state, Level world, BlockPos pos, PlayerEntity player, Hand hand, + public ActionResult onUse(BlockState state, Level world, BlockPos pos, Player player, Hand hand, BlockHitResult hit) { if (world.isClientSide) { return ActionResult.SUCCESS; @@ -62,7 +62,7 @@ public class EndStoneSmelter extends BaseBlockWithEntity { } } - private void openScreen(Level world, BlockPos pos, PlayerEntity player) { + private void openScreen(Level world, BlockPos pos, Player player) { BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof EndStoneSmelterBlockEntity) { player.openHandledScreen((EndStoneSmelterBlockEntity) blockEntity); diff --git a/src/main/java/ru/betterend/blocks/EndTerrainBlock.java b/src/main/java/ru/betterend/blocks/EndTerrainBlock.java index 6b98418e..765f1a27 100644 --- a/src/main/java/ru/betterend/blocks/EndTerrainBlock.java +++ b/src/main/java/ru/betterend/blocks/EndTerrainBlock.java @@ -16,7 +16,7 @@ import net.minecraft.world.level.material.MaterialColor; import net.minecraft.world.level.block.SnowBlock; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.Enchantments; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; @@ -50,7 +50,7 @@ public class EndTerrainBlock extends BlockBase { } @Override - public ActionResult onUse(BlockState state, Level world, BlockPos pos, PlayerEntity player, Hand hand, + public ActionResult onUse(BlockState state, Level world, BlockPos pos, Player player, Hand hand, BlockHitResult hit) { if (pathBlock != null && player.getMainHandStack().getItem().isIn(FabricToolTags.SHOVELS)) { world.playLocalSound(player, pos, SoundEvents.ITEM_SHOVEL_FLATTEN, SoundSource.BLOCKS, 1.0F, 1.0F); diff --git a/src/main/java/ru/betterend/blocks/EternalPedestal.java b/src/main/java/ru/betterend/blocks/EternalPedestal.java index 3344dc76..fb17fd27 100644 --- a/src/main/java/ru/betterend/blocks/EternalPedestal.java +++ b/src/main/java/ru/betterend/blocks/EternalPedestal.java @@ -8,7 +8,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; @@ -86,7 +86,7 @@ public class EternalPedestal extends PedestalBlock { } @Override - public float calcBlockBreakingDelta(BlockState state, PlayerEntity player, BlockView world, BlockPos pos) { + public float calcBlockBreakingDelta(BlockState state, Player player, BlockView world, BlockPos pos) { return 0.0F; } diff --git a/src/main/java/ru/betterend/blocks/EternalRunedFlavolite.java b/src/main/java/ru/betterend/blocks/EternalRunedFlavolite.java index f1c505d9..a4590b69 100644 --- a/src/main/java/ru/betterend/blocks/EternalRunedFlavolite.java +++ b/src/main/java/ru/betterend/blocks/EternalRunedFlavolite.java @@ -6,7 +6,7 @@ import com.google.common.collect.Lists; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.core.BlockPos; @@ -16,7 +16,7 @@ import net.minecraft.world.explosion.Explosion; public class EternalRunedFlavolite extends RunedFlavolite { @Override - public float calcBlockBreakingDelta(BlockState state, PlayerEntity player, BlockView world, BlockPos pos) { + public float calcBlockBreakingDelta(BlockState state, Player player, BlockView world, BlockPos pos) { return 0.0F; } diff --git a/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java b/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java index bd8fcb81..e3c2e41d 100644 --- a/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java @@ -12,7 +12,7 @@ import net.minecraft.state.property.Properties; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; @@ -27,7 +27,7 @@ public class GlowingPillarSeedBlock extends EndPlantWithAgeBlock { } @Override - public void growAdult(StructureWorldAccess world, Random random, BlockPos pos) { + public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { int height = MHelper.randRange(1, 2, random); int h = BlocksHelper.upRay(world, pos, height + 2); if (h < height) { diff --git a/src/main/java/ru/betterend/blocks/HelixTreeSaplingBlock.java b/src/main/java/ru/betterend/blocks/HelixTreeSaplingBlock.java index 0bce2c4c..283cd3dc 100644 --- a/src/main/java/ru/betterend/blocks/HelixTreeSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/HelixTreeSaplingBlock.java @@ -1,6 +1,6 @@ package ru.betterend.blocks; -import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.blocks.basis.FeatureSaplingBlock; import ru.betterend.registry.EndFeatures; diff --git a/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java b/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java index 05b7696e..2e1171c3 100644 --- a/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java @@ -6,7 +6,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.BlockProperties.HydraluxShape; import ru.betterend.blocks.basis.UnderwaterPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; @@ -15,7 +15,7 @@ import ru.betterend.util.MHelper; public class HydraluxSaplingBlock extends UnderwaterPlantWithAgeBlock { @Override - public void grow(StructureWorldAccess world, Random random, BlockPos pos) { + public void grow(WorldGenLevel world, Random random, BlockPos pos) { int h = MHelper.randRange(4, 8, random); MutableBlockPos mut = new MutableBlockPos().set(pos); diff --git a/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java b/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java index 999ca172..917db1b1 100644 --- a/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java +++ b/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java @@ -20,7 +20,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; +import net.minecraft.world.level.material.Fluids; import net.minecraft.world.item.ItemPlacementContext; import net.minecraft.world.item.ItemStack; import net.minecraft.core.particles.ParticleTypes; diff --git a/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java b/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java index e737242a..403485c1 100644 --- a/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java @@ -3,7 +3,7 @@ package ru.betterend.blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; import net.minecraft.world.WorldView; -import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.blocks.basis.FeatureSaplingBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; diff --git a/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java b/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java index 8f0ca538..4cf6142f 100644 --- a/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java @@ -7,7 +7,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.BlockProperties.PentaShape; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; @@ -16,7 +16,7 @@ import ru.betterend.util.MHelper; public class LanceleafSeedBlock extends EndPlantWithAgeBlock { @Override - public void growAdult(StructureWorldAccess world, Random random, BlockPos pos) { + public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { int height = MHelper.randRange(4, 6, random); int h = BlocksHelper.upRay(world, pos, height + 2); if (h < height + 1) { diff --git a/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java b/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java index 85b05d0e..9046228d 100644 --- a/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java @@ -5,15 +5,15 @@ import java.util.Random; import net.minecraft.world.level.block.AbstractBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; public class LumecornSeedBlock extends EndPlantWithAgeBlock { @Override - public void growAdult(StructureWorldAccess world, Random random, BlockPos pos) { - EndFeatures.LUMECORN.getFeature().generate(world, null, random, pos, null); + public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { + EndFeatures.LUMECORN.getFeature().place(world, null, random, pos, null); } @Override diff --git a/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java b/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java index 9d18449a..5454173d 100644 --- a/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java +++ b/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java @@ -12,7 +12,7 @@ import net.minecraft.world.level.block.FluidDrainable; import net.minecraft.world.level.material.Material; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; +import net.minecraft.world.level.material.Fluids; import net.minecraft.tags.FluidTags; import net.minecraft.util.Pair; import net.minecraft.core.BlockPos; diff --git a/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java b/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java index 98c0e68b..4cab2fbc 100644 --- a/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java +++ b/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java @@ -8,9 +8,9 @@ import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.entity.ItemEntity; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; +import net.minecraft.world.level.material.Fluids; import net.minecraft.world.item.ItemStack; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.sounds.SoundSource; @@ -35,7 +35,7 @@ public class MengerSpongeWetBlock extends BlockBaseNotFull implements IRenderTyp if (world.getDimension().isUltrawarm()) { world.setBlockAndUpdate(pos, EndBlocks.MENGER_SPONGE.defaultBlockState(), 3); world.syncWorldEvent(2009, pos, 0); - world.playLocalSound((PlayerEntity) null, pos, SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundSource.BLOCKS, 1.0F, + world.playLocalSound((Player) null, pos, SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundSource.BLOCKS, 1.0F, (1.0F + world.getRandom().nextFloat() * 0.2F) * 0.7F); } } @@ -80,7 +80,7 @@ public class MengerSpongeWetBlock extends BlockBaseNotFull implements IRenderTyp } @Override - public void onBreak(Level world, BlockPos pos, BlockState state, PlayerEntity player) { + public void onBreak(Level world, BlockPos pos, BlockState state, Player player) { BlocksHelper.setWithUpdate(world, pos, Blocks.AIR); if (!world.isClientSide()) { world.syncWorldEvent(2001, pos, getRawIdFromState(state)); diff --git a/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java b/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java index e6d6330e..3359b6be 100644 --- a/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java @@ -3,7 +3,7 @@ package ru.betterend.blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; import net.minecraft.world.WorldView; -import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.blocks.basis.FeatureSaplingBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; diff --git a/src/main/java/ru/betterend/blocks/MurkweedBlock.java b/src/main/java/ru/betterend/blocks/MurkweedBlock.java index f2c7f8b8..893fc86d 100644 --- a/src/main/java/ru/betterend/blocks/MurkweedBlock.java +++ b/src/main/java/ru/betterend/blocks/MurkweedBlock.java @@ -8,8 +8,8 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.pathing.NavigationType; -import net.minecraft.world.entity.effect.StatusEffectInstance; -import net.minecraft.world.entity.effect.StatusEffects; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.core.BlockPos; import net.minecraft.world.level.BlockGetter; @@ -30,8 +30,8 @@ public class MurkweedBlock extends EndPlantBlock { @Override public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { - if (entity instanceof LivingEntity && !((LivingEntity) entity).hasStatusEffect(StatusEffects.BLINDNESS)) { - ((LivingEntity) entity).addStatusEffect(new StatusEffectInstance(StatusEffects.BLINDNESS, 50)); + if (entity instanceof LivingEntity && !((LivingEntity) entity).hasMobEffect(MobEffects.BLINDNESS)) { + ((LivingEntity) entity).addMobEffect(new MobEffectInstance(MobEffects.BLINDNESS, 50)); } } diff --git a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java index eb3cb7e0..f0a95711 100644 --- a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java +++ b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java @@ -11,7 +11,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.ShapeContext; import net.minecraft.world.level.block.Waterloggable; import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; +import net.minecraft.world.level.material.Fluids; import net.minecraft.world.item.ItemPlacementContext; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.BooleanProperty; diff --git a/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java b/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java index fbb7dddd..55f92caa 100644 --- a/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java @@ -3,7 +3,7 @@ package ru.betterend.blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; import net.minecraft.world.WorldView; -import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.blocks.basis.FeatureSaplingBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; diff --git a/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java b/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java index c69410ab..46579bd6 100644 --- a/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java +++ b/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java @@ -14,7 +14,7 @@ import net.minecraft.world.level.block.ShapeContext; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; @@ -113,7 +113,7 @@ public class RespawnObeliskBlock extends BlockBase implements IColorProvider, IR } @Override - public void onBreak(Level world, BlockPos pos, BlockState state, PlayerEntity player) { + public void onBreak(Level world, BlockPos pos, BlockState state, Player player) { if (player.isCreative()) { TripleShape shape = state.getValue(SHAPE); if (shape == TripleShape.MIDDLE) { @@ -152,7 +152,7 @@ public class RespawnObeliskBlock extends BlockBase implements IColorProvider, IR } @Override - public ActionResult onUse(BlockState state, Level world, BlockPos pos, PlayerEntity player, Hand hand, + public ActionResult onUse(BlockState state, Level world, BlockPos pos, Player player, Hand hand, BlockHitResult hit) { ItemStack itemStack = player.getStackInHand(hand); boolean canActivate = itemStack.getItem() == EndItems.AMBER_GEM && itemStack.getCount() > 5; diff --git a/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java b/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java index 2c09ec3e..fa827811 100644 --- a/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java +++ b/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java @@ -8,7 +8,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; import net.minecraft.world.entity.ItemEntity; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemPlacementContext; import net.minecraft.world.item.ItemStack; import net.minecraft.server.level.ServerLevel; @@ -89,7 +89,7 @@ public class SilkMothHiveBlock extends BlockBase { } @Override - public ActionResult onUse(BlockState state, Level world, BlockPos pos, PlayerEntity player, Hand hand, + public ActionResult onUse(BlockState state, Level world, BlockPos pos, Player player, Hand hand, BlockHitResult hit) { if (hand == Hand.MAIN_HAND) { ItemStack stack = player.getMainHandStack(); diff --git a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java index 3feee50d..7d1eda7b 100644 --- a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java +++ b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java @@ -12,7 +12,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.Material; import net.minecraft.world.level.block.ShapeContext; import net.minecraft.world.entity.ItemEntity; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemPlacementContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; @@ -112,7 +112,7 @@ public class SilkMothNestBlock extends BlockBase implements IRenderTypeable { } @Override - public void onBreak(Level world, BlockPos pos, BlockState state, PlayerEntity player) { + public void onBreak(Level world, BlockPos pos, BlockState state, Player player) { if (!state.getValue(ACTIVE) && player.isCreative()) { BlocksHelper.setWithUpdate(world, pos.below(), Blocks.AIR); } @@ -151,7 +151,7 @@ public class SilkMothNestBlock extends BlockBase implements IRenderTypeable { } @Override - public ActionResult onUse(BlockState state, Level world, BlockPos pos, PlayerEntity player, Hand hand, + public ActionResult onUse(BlockState state, Level world, BlockPos pos, Player player, Hand hand, BlockHitResult hit) { if (hand == Hand.MAIN_HAND) { ItemStack stack = player.getMainHandStack(); diff --git a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java index 9d3092fe..a3c23dfc 100644 --- a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java +++ b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java @@ -30,7 +30,7 @@ public class SmallAmaranitaBlock extends EndPlantBlock { public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { BlockPos bigPos = growBig(world, pos); if (bigPos != null) { - if (EndFeatures.GIGANTIC_AMARANITA.getFeature().generate(world, null, random, bigPos, null)) { + if (EndFeatures.GIGANTIC_AMARANITA.getFeature().place(world, null, random, bigPos, null)) { replaceMushroom(world, bigPos); replaceMushroom(world, bigPos.south()); replaceMushroom(world, bigPos.east()); @@ -38,7 +38,7 @@ public class SmallAmaranitaBlock extends EndPlantBlock { } return; } - EndFeatures.LARGE_AMARANITA.getFeature().generate(world, null, random, pos, null); + EndFeatures.LARGE_AMARANITA.getFeature().place(world, null, random, pos, null); } @Override diff --git a/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java b/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java index 4432dd5c..66213bb0 100644 --- a/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java +++ b/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java @@ -95,6 +95,6 @@ public class SmallJellyshroomBlock extends AttachedBlock implements IRenderTypea @Override public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { BlocksHelper.setWithUpdate(world, pos, Blocks.AIR); - EndFeatures.JELLYSHROOM.getFeature().generate(world, null, random, pos, null); + EndFeatures.JELLYSHROOM.getFeature().place(world, null, random, pos, null); } } diff --git a/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java b/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java index b15ac81c..3edebc7c 100644 --- a/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java +++ b/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java @@ -15,7 +15,7 @@ import net.minecraft.world.level.block.ShapeContext; import net.minecraft.world.level.block.Waterloggable; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; +import net.minecraft.world.level.material.Fluids; import net.minecraft.world.item.ItemPlacementContext; import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.StateDefinition; diff --git a/src/main/java/ru/betterend/blocks/SulphurCrystalBlock.java b/src/main/java/ru/betterend/blocks/SulphurCrystalBlock.java index 4bc940b3..ea73eb86 100644 --- a/src/main/java/ru/betterend/blocks/SulphurCrystalBlock.java +++ b/src/main/java/ru/betterend/blocks/SulphurCrystalBlock.java @@ -18,7 +18,7 @@ import net.minecraft.world.level.block.ShapeContext; import net.minecraft.world.level.block.Waterloggable; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; +import net.minecraft.world.level.material.Fluids; import net.minecraft.world.item.ItemPlacementContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; diff --git a/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java b/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java index 1ba74736..77b0de8a 100644 --- a/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java @@ -3,7 +3,7 @@ package ru.betterend.blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; import net.minecraft.world.WorldView; -import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.blocks.basis.FeatureSaplingBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java index 7b2139ec..d9d48e22 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java @@ -5,7 +5,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.MaterialColor; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.sounds.SoundSource; @@ -37,7 +37,7 @@ public class UmbrellaTreeClusterBlock extends BlockBase { } @Override - public ActionResult onUse(BlockState state, Level world, BlockPos pos, PlayerEntity player, Hand hand, + public ActionResult onUse(BlockState state, Level world, BlockPos pos, Player player, Hand hand, BlockHitResult hit) { ItemStack stack = player.getMainHandStack(); if (stack.getItem() == Items.GLASS_BOTTLE) { diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java index fc80eff0..47608d81 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java @@ -3,7 +3,7 @@ package ru.betterend.blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; import net.minecraft.world.WorldView; -import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.blocks.basis.FeatureSaplingBlock; import ru.betterend.client.render.ERenderLayer; import ru.betterend.registry.EndBlocks; diff --git a/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java b/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java index 8ce6c201..8664b136 100644 --- a/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java +++ b/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java @@ -16,7 +16,7 @@ import net.minecraft.world.level.block.ShapeContext; import net.minecraft.world.entity.Entity; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; +import net.minecraft.world.level.material.Fluids; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundSource; diff --git a/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java b/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java index 63eb7bf7..6c00c5b5 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java @@ -12,7 +12,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.mob.PiglinBrain; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.server.level.ServerLevel; @@ -48,7 +48,7 @@ public class EndBarrelBlock extends BarrelBlock implements BlockPatterned { } @Override - public ActionResult onUse(BlockState state, Level world, BlockPos pos, PlayerEntity player, Hand hand, + public ActionResult onUse(BlockState state, Level world, BlockPos pos, Player player, Hand hand, BlockHitResult hit) { if (world.isClientSide) { return ActionResult.SUCCESS; diff --git a/src/main/java/ru/betterend/blocks/basis/EndBlockStripableLogLog.java b/src/main/java/ru/betterend/blocks/basis/EndBlockStripableLogLog.java index 955e3d50..d7a62f60 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndBlockStripableLogLog.java +++ b/src/main/java/ru/betterend/blocks/basis/EndBlockStripableLogLog.java @@ -6,7 +6,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.MaterialColor; import net.minecraft.world.level.block.RotatedPillarBlock; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundSource; import net.minecraft.sounds.SoundEvents; @@ -25,7 +25,7 @@ public class EndBlockStripableLogLog extends EndPillarBlock { } @Override - public ActionResult onUse(BlockState state, Level world, BlockPos pos, PlayerEntity player, Hand hand, + public ActionResult onUse(BlockState state, Level world, BlockPos pos, Player player, Hand hand, BlockHitResult hit) { if (player.getMainHandStack().getItem().isIn(FabricToolTags.AXES)) { world.playLocalSound(player, pos, SoundEvents.ITEM_AXE_STRIP, SoundSource.BLOCKS, 1.0F, 1.0F); diff --git a/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java b/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java index 5015766d..a4666eb8 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java @@ -12,7 +12,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.FurnaceBlock; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; @@ -42,7 +42,7 @@ public class EndFurnaceBlock extends FurnaceBlock implements BlockPatterned, IRe } @Override - protected void openScreen(Level world, BlockPos pos, PlayerEntity player) { + protected void openScreen(Level world, BlockPos pos, Player player) { BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof EFurnaceBlockEntity) { player.openHandledScreen((NamedScreenHandlerFactory) blockEntity); diff --git a/src/main/java/ru/betterend/blocks/basis/EndLadderBlock.java b/src/main/java/ru/betterend/blocks/basis/EndLadderBlock.java index f5f264f9..acc5ca29 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndLadderBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndLadderBlock.java @@ -9,7 +9,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.HorizontalFacingBlock; import net.minecraft.world.level.block.ShapeContext; import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; +import net.minecraft.world.level.material.Fluids; import net.minecraft.world.item.ItemPlacementContext; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.BooleanProperty; diff --git a/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java index dbbba91d..28505b8f 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java @@ -8,7 +8,7 @@ import net.minecraft.world.level.block.FluidFillable; import net.minecraft.world.level.block.Waterloggable; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; +import net.minecraft.world.level.material.Fluids; import net.minecraft.world.item.ItemPlacementContext; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.state.property.BooleanProperty; diff --git a/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java b/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java index fcdd6240..f02774d4 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java @@ -12,7 +12,7 @@ import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.IntegerProperty; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.Level; import ru.betterend.blocks.BlockProperties; @@ -33,7 +33,7 @@ public abstract class EndPlantWithAgeBlock extends EndPlantBlock { stateManager.add(AGE); } - public abstract void growAdult(StructureWorldAccess world, Random random, BlockPos pos); + public abstract void growAdult(WorldGenLevel world, Random random, BlockPos pos); @Override public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { diff --git a/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java b/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java index a5687f85..91b59a98 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java @@ -12,10 +12,10 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.ShapeContext; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; +import net.minecraft.world.level.material.Fluids; import net.minecraft.world.item.ItemPlacementContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; @@ -79,10 +79,10 @@ public class EndSignBlock extends AbstractSignBlock implements BlockPatterned, I @Override public void onPlaced(Level world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { - if (placer != null && placer instanceof PlayerEntity) { + if (placer != null && placer instanceof Player) { ESignBlockEntity sign = (ESignBlockEntity) world.getBlockEntity(pos); if (!world.isClientSide) { - sign.setEditor((PlayerEntity) placer); + sign.setEditor((Player) placer); ((ServerPlayer) placer).networkHandler.sendPacket(new SignEditorOpenS2CPacket(pos)); } else { sign.setEditable(true); diff --git a/src/main/java/ru/betterend/blocks/basis/EndUnderwaterWallPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/EndUnderwaterWallPlantBlock.java index 482c14ca..e838ac46 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndUnderwaterWallPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndUnderwaterWallPlantBlock.java @@ -7,7 +7,7 @@ import net.minecraft.world.level.block.FluidFillable; import net.minecraft.world.level.material.Material; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; +import net.minecraft.world.level.material.Fluids; import net.minecraft.world.level.block.SoundType; import net.minecraft.core.BlockPos; import net.minecraft.world.level.BlockGetter; diff --git a/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java b/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java index 3dbe80ba..d0527ed8 100644 --- a/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java @@ -21,7 +21,7 @@ import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.WorldView; -import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.Patterns; @@ -73,7 +73,7 @@ public abstract class FeatureSaplingBlock extends BlockBaseNotFull implements Fe @Override public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { - getFeature().generate(world, world.getChunkManager().getChunkGenerator(), random, pos, null); + getFeature().place(world, world.getChunkManager().getChunkGenerator(), random, pos, null); } @Override diff --git a/src/main/java/ru/betterend/blocks/basis/FurBlock.java b/src/main/java/ru/betterend/blocks/basis/FurBlock.java index 920717a5..bc516a93 100644 --- a/src/main/java/ru/betterend/blocks/basis/FurBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/FurBlock.java @@ -13,7 +13,7 @@ import net.minecraft.world.level.material.Material; import net.minecraft.world.level.block.ShapeContext; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.Enchantments; -import net.minecraft.world.item.ItemConvertible; +import net.minecraft.world.level.ItemLike; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; @@ -29,17 +29,17 @@ import ru.betterend.util.MHelper; public class FurBlock extends AttachedBlock implements IRenderTypeable { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); - private final ItemConvertible drop; + private final ItemLike drop; private final int dropChance; - public FurBlock(ItemConvertible drop, int light, int dropChance, boolean wet) { + public FurBlock(ItemLike drop, int light, int dropChance, boolean wet) { super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT).breakByTool(FabricToolTags.SHEARS) .sounds(wet ? SoundType.WET_GRASS : SoundType.GRASS).luminance(light).breakByHand(true).noCollision()); this.drop = drop; this.dropChance = dropChance; } - public FurBlock(ItemConvertible drop, int dropChance) { + public FurBlock(ItemLike drop, int dropChance) { super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT).breakByTool(FabricToolTags.SHEARS) .sounds(SoundType.GRASS).breakByHand(true).noCollision()); this.drop = drop; diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index abee8419..f884d6ef 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -16,7 +16,7 @@ import net.minecraft.world.level.block.BlockEntityProvider; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.ShapeContext; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemPlacementContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; @@ -100,7 +100,7 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid } @Override - public ActionResult onUse(BlockState state, Level world, BlockPos pos, PlayerEntity player, Hand hand, + public ActionResult onUse(BlockState state, Level world, BlockPos pos, Player player, Hand hand, BlockHitResult hit) { if (world.isClientSide || !state.is(this)) return ActionResult.CONSUME; @@ -286,7 +286,7 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid for (int i = 2; i < Direction.values().length; i++) { dropPos = pos.relative(Direction.byId(i)); if (world.getBlockState(dropPos).isAir()) { - return dropPos.toImmutable(); + return dropPos.immutable(); } } return getDropPos(world, pos.up()); diff --git a/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java b/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java index a3a0c88a..0de3cf81 100644 --- a/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java @@ -10,7 +10,7 @@ import net.minecraft.world.level.block.Waterloggable; import net.minecraft.world.entity.LivingEntity; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; +import net.minecraft.world.level.material.Fluids; import net.minecraft.world.item.ItemPlacementContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.StateDefinition; diff --git a/src/main/java/ru/betterend/blocks/basis/StrippableBarkBlock.java b/src/main/java/ru/betterend/blocks/basis/StrippableBarkBlock.java index 616484ce..f913b3d4 100644 --- a/src/main/java/ru/betterend/blocks/basis/StrippableBarkBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/StrippableBarkBlock.java @@ -6,7 +6,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.MaterialColor; import net.minecraft.world.level.block.RotatedPillarBlock; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundSource; import net.minecraft.sounds.SoundEvents; @@ -25,7 +25,7 @@ public class StrippableBarkBlock extends BarkBlock { } @Override - public ActionResult onUse(BlockState state, Level world, BlockPos pos, PlayerEntity player, Hand hand, + public ActionResult onUse(BlockState state, Level world, BlockPos pos, Player player, Hand hand, BlockHitResult hit) { if (player.getMainHandStack().getItem().isIn(FabricToolTags.AXES)) { world.playLocalSound(player, pos, SoundEvents.ITEM_AXE_STRIP, SoundSource.BLOCKS, 1.0F, 1.0F); diff --git a/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java index 2c585512..2ecdbee6 100644 --- a/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java @@ -9,7 +9,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.MaterialColor; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemPlacementContext; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.block.state.StateDefinition; @@ -68,7 +68,7 @@ public class TripleTerrainBlock extends EndTerrainBlock { } @Override - public ActionResult onUse(BlockState state, Level world, BlockPos pos, PlayerEntity player, Hand hand, + public ActionResult onUse(BlockState state, Level world, BlockPos pos, Player player, Hand hand, BlockHitResult hit) { TripleShape shape = state.getValue(SHAPE); if (shape == TripleShape.BOTTOM) { diff --git a/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantBlock.java index 524aec13..51eb7fd6 100644 --- a/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantBlock.java @@ -20,7 +20,7 @@ import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.entity.ItemEntity; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; +import net.minecraft.world.level.material.Fluids; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; diff --git a/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantWithAgeBlock.java b/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantWithAgeBlock.java index c695fda4..405daee8 100644 --- a/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantWithAgeBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantWithAgeBlock.java @@ -12,7 +12,7 @@ import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.IntegerProperty; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.BlockProperties; public abstract class UnderwaterPlantWithAgeBlock extends UnderwaterPlantBlock { @@ -28,7 +28,7 @@ public abstract class UnderwaterPlantWithAgeBlock extends UnderwaterPlantBlock { stateManager.add(AGE); } - public abstract void grow(StructureWorldAccess world, Random random, BlockPos pos); + public abstract void grow(WorldGenLevel world, Random random, BlockPos pos); @Override public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { diff --git a/src/main/java/ru/betterend/blocks/basis/UpDownPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/UpDownPlantBlock.java index 37dcaa9f..b8ab9330 100644 --- a/src/main/java/ru/betterend/blocks/basis/UpDownPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/UpDownPlantBlock.java @@ -14,7 +14,7 @@ import net.minecraft.world.level.block.ShapeContext; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.Enchantments; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; @@ -85,7 +85,7 @@ public class UpDownPlantBlock extends BlockBaseNotFull implements IRenderTypeabl } @Override - public void afterBreak(Level world, PlayerEntity player, BlockPos pos, BlockState state, BlockEntity blockEntity, + public void afterBreak(Level world, Player player, BlockPos pos, BlockState state, BlockEntity blockEntity, ItemStack stack) { super.afterBreak(world, player, pos, state, blockEntity, stack); world.updateNeighbor(pos, Blocks.AIR, pos.below()); diff --git a/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java b/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java index 52bad466..57f496dc 100644 --- a/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java @@ -9,7 +9,7 @@ import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.material.MaterialColor; import net.minecraft.world.item.DyeItem; -import net.minecraft.world.item.ItemConvertible; +import net.minecraft.world.level.ItemLike; import net.minecraft.util.DyeColor; import net.minecraft.core.Registry; import ru.betterend.recipe.builders.GridRecipe; @@ -17,7 +17,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; public class ColoredMaterial { - private static final Map DYES = Maps.newHashMap(); + private static final Map DYES = Maps.newHashMap(); private static final Map COLORS = Maps.newHashMap(); private final Map colors = Maps.newHashMap(); @@ -26,7 +26,7 @@ public class ColoredMaterial { } public ColoredMaterial(Function constructor, Block source, Map colors, - Map dyes, boolean craftEight) { + Map dyes, boolean craftEight) { String id = Registry.BLOCK.getKey(source).getPath(); colors.forEach((color, name) -> { String blockName = id + "_" + name; diff --git a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java index b9d8b514..fc426b78 100644 --- a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java @@ -62,8 +62,8 @@ public class WoodenMaterial { public final Block shelf; public final Block composter; - public final Tag.Identified logBlockTag; - public final Tag.Identified logItemTag; + public final Tag.Named logBlockTag; + public final Tag.Named logItemTag; public WoodenMaterial(String name, MaterialColor woodColor, MaterialColor planksColor) { FabricBlockSettings materialPlanks = FabricBlockSettings.copyOf(Blocks.OAK_PLANKS).materialColor(planksColor); diff --git a/src/main/java/ru/betterend/blocks/entities/EBarrelBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EBarrelBlockEntity.java index 077ce206..1857c409 100644 --- a/src/main/java/ru/betterend/blocks/entities/EBarrelBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EBarrelBlockEntity.java @@ -5,7 +5,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.ChestBlockEntity; import net.minecraft.world.level.block.entity.LootableContainerBlockEntity; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.PlayerInventory; import net.minecraft.inventory.Inventories; import net.minecraft.world.item.ItemStack; @@ -13,7 +13,7 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.screen.GenericContainerScreenHandler; import net.minecraft.screen.ScreenHandler; import net.minecraft.sounds.SoundSource; -import net.minecraft.sound.SoundEvent; +import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; @@ -73,7 +73,7 @@ public class EBarrelBlockEntity extends LootableContainerBlockEntity { return GenericContainerScreenHandler.createGeneric9x3(syncId, playerInventory, this); } - public void onOpen(PlayerEntity player) { + public void onOpen(Player player) { if (!player.isSpectator()) { if (this.viewerCount < 0) { this.viewerCount = 0; @@ -117,7 +117,7 @@ public class EBarrelBlockEntity extends LootableContainerBlockEntity { } } - public void onClose(PlayerEntity player) { + public void onClose(Player player) { if (!player.isSpectator()) { --this.viewerCount; } @@ -132,7 +132,7 @@ public class EBarrelBlockEntity extends LootableContainerBlockEntity { double d = (double) this.pos.getX() + 0.5D + (double) vec3i.getX() / 2.0D; double e = (double) this.pos.getY() + 0.5D + (double) vec3i.getY() / 2.0D; double f = (double) this.pos.getZ() + 0.5D + (double) vec3i.getZ() / 2.0D; - this.world.playLocalSound((PlayerEntity) null, d, e, f, soundEvent, SoundSource.BLOCKS, 0.5F, + this.world.playLocalSound((Player) null, d, e, f, soundEvent, SoundSource.BLOCKS, 0.5F, this.world.random.nextFloat() * 0.1F + 0.9F); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java index 282bfd2c..9661b381 100644 --- a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java @@ -14,12 +14,12 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; import net.minecraft.world.level.block.entity.LockableContainerBlockEntity; import net.minecraft.world.entity.ExperienceOrbEntity; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.PlayerInventory; import net.minecraft.inventory.Inventories; import net.minecraft.inventory.SidedInventory; import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemConvertible; +import net.minecraft.world.level.ItemLike; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.nbt.CompoundTag; @@ -171,7 +171,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity return smeltTime; } - public void dropExperience(PlayerEntity player) { + public void dropExperience(Player player) { assert world != null; List> list = Lists.newArrayList(); for (Entry entry : this.recipesUsed.object2IntEntrySet()) { @@ -205,7 +205,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity } @Override - public boolean canPlayerUse(PlayerEntity player) { + public boolean canPlayerUse(Player player) { assert this.world != null; if (this.world.getBlockEntity(this.pos) != this) { return false; @@ -442,7 +442,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity return AVAILABLE_FUELS.containsKey(stack.getItem()) || getFabricFuel(stack) > 2000; } - public static void registerFuel(ItemConvertible fuel, int time) { + public static void registerFuel(ItemLike fuel, int time) { AVAILABLE_FUELS.put(fuel.asItem(), time); } diff --git a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java index 01ffeab2..a8e6a7e9 100644 --- a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java @@ -4,7 +4,7 @@ import net.fabricmc.fabric.api.block.entity.BlockEntityClientSerializable; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.inventory.Inventory; import net.minecraft.world.item.ItemStack; import net.minecraft.nbt.CompoundTag; @@ -97,7 +97,7 @@ public class PedestalBlockEntity extends BlockEntity implements Inventory, Ticka } @Override - public boolean canPlayerUse(PlayerEntity player) { + public boolean canPlayerUse(Player player) { return true; } diff --git a/src/main/java/ru/betterend/blocks/entities/render/EndChestBlockEntityRenderer.java b/src/main/java/ru/betterend/blocks/entities/render/EndChestBlockEntityRenderer.java index f63fba5f..24bc27b9 100644 --- a/src/main/java/ru/betterend/blocks/entities/render/EndChestBlockEntityRenderer.java +++ b/src/main/java/ru/betterend/blocks/entities/render/EndChestBlockEntityRenderer.java @@ -24,7 +24,7 @@ import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher; import net.minecraft.client.render.block.entity.BlockEntityRenderer; import net.minecraft.client.render.block.entity.LightmapCoordinatesRetriever; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.world.item.BlockItem; import net.minecraft.resources.ResourceLocation; import net.minecraft.core.Direction; diff --git a/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java b/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java index 39d3e087..53eb67ee 100644 --- a/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java +++ b/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java @@ -21,7 +21,7 @@ import net.minecraft.client.render.block.entity.SignBlockEntityRenderer.SignMode import net.minecraft.client.texture.NativeImage; import net.minecraft.client.util.SpriteIdentifier; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.world.item.BlockItem; import net.minecraft.text.OrderedText; import net.minecraft.resources.ResourceLocation; diff --git a/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java b/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java index 16168716..9f876575 100644 --- a/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java +++ b/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java @@ -3,14 +3,14 @@ package ru.betterend.blocks.entities.render; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher; import net.minecraft.client.render.block.entity.BlockEntityRenderer; import net.minecraft.client.render.model.BakedModel; import net.minecraft.client.render.model.json.ModelTransformation; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; @@ -47,7 +47,7 @@ public class PedestalItemRenderer extends BlockEn ItemStack activeItem = blockEntity.getStack(0); matrices.push(); - MinecraftClient minecraft = MinecraftClient.getInstance(); + Minecraft minecraft = Minecraft.getInstance(); BakedModel model = minecraft.getItemRenderer().getHeldItemModel(activeItem, world, null); Vector3f translate = model.getTransformation().ground.translation; PedestalBlock pedestal = (PedestalBlock) state.getBlock(); diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java index d9e084f8..c16100b6 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java @@ -3,7 +3,7 @@ package ru.betterend.client.gui; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.screenhandler.v1.ScreenHandlerRegistry; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.PlayerInventory; import net.minecraft.inventory.Inventory; import net.minecraft.inventory.SimpleInventory; @@ -109,7 +109,7 @@ public class EndStoneSmelterScreenHandler extends AbstractRecipeScreenHandler StatusEffect registerEffect(String name, E effect) { + public static MobEffect registerEffect(String name, E effect) { return Registry.register(Registry.STATUS_EFFECT, BetterEnd.makeID(name), effect); } } diff --git a/src/main/java/ru/betterend/effects/status/EndVeilEffect.java b/src/main/java/ru/betterend/effects/status/EndVeilEffect.java index f0cc5079..b9dfce0f 100644 --- a/src/main/java/ru/betterend/effects/status/EndVeilEffect.java +++ b/src/main/java/ru/betterend/effects/status/EndVeilEffect.java @@ -1,12 +1,12 @@ package ru.betterend.effects.status; -import net.minecraft.world.entity.effect.StatusEffect; -import net.minecraft.world.entity.effect.StatusEffectType; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectType; -public class EndVeilEffect extends StatusEffect { +public class EndVeilEffect extends MobEffect { public EndVeilEffect() { - super(StatusEffectType.BENEFICIAL, 0x0D554A); + super(MobEffectType.BENEFICIAL, 0x0D554A); } @Override diff --git a/src/main/java/ru/betterend/entity/CubozoaEntity.java b/src/main/java/ru/betterend/entity/CubozoaEntity.java index d13c8919..c68d0cee 100644 --- a/src/main/java/ru/betterend/entity/CubozoaEntity.java +++ b/src/main/java/ru/betterend/entity/CubozoaEntity.java @@ -12,28 +12,28 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.SpawnReason; import net.minecraft.world.entity.ai.control.MoveControl; import net.minecraft.world.entity.attribute.DefaultAttributeContainer; -import net.minecraft.world.entity.attribute.EntityAttributes; +import net.minecraft.world.entity.attribute.Attributes; import net.minecraft.world.entity.damage.DamageSource; import net.minecraft.world.entity.data.DataTracker; import net.minecraft.world.entity.data.TrackedData; import net.minecraft.world.entity.data.TrackedDataHandlerRegistry; -import net.minecraft.world.entity.effect.StatusEffectInstance; -import net.minecraft.world.entity.effect.StatusEffects; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.passive.SchoolingFishEntity; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.packet.s2c.play.GameStateChangeS2CPacket; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.sound.SoundEvent; +import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.tags.FluidTags; import net.minecraft.core.BlockPos; import net.minecraft.util.math.Box; import net.minecraft.util.Mth; import net.minecraft.world.LocalDifficulty; -import net.minecraft.world.ServerWorldAccess; +import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.Level; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndItems; @@ -50,7 +50,7 @@ public class CubozoaEntity extends SchoolingFishEntity { } @Override - public EntityData initialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, + public EntityData initialize(ServerLevelAccessor world, LocalDifficulty difficulty, SpawnReason spawnReason, EntityData entityData, CompoundTag entityTag) { EntityData data = super.initialize(world, difficulty, spawnReason, entityData, entityTag); if (EndBiomes.getFromBiome(world.getBiome(getBlockPos())) == EndBiomes.SULPHUR_SPRINGS) { @@ -86,8 +86,8 @@ public class CubozoaEntity extends SchoolingFishEntity { } public static DefaultAttributeContainer.Builder createMobAttributes() { - return LivingEntity.createLivingAttributes().add(EntityAttributes.GENERIC_MAX_HEALTH, 2.0) - .add(EntityAttributes.GENERIC_FOLLOW_RANGE, 16.0).add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.5); + return LivingEntity.createLivingAttributes().add(Attributes.MAX_HEALTH, 2.0).add(Attributes.FOLLOW_RANGE, 16.0) + .add(Attributes.MOVEMENT_SPEED, 0.5); } public int getVariant() { @@ -98,7 +98,7 @@ public class CubozoaEntity extends SchoolingFishEntity { return this.dataTracker.get(SCALE) / 32F + 0.75F; } - public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, + public static boolean canSpawn(EntityType type, ServerLevelAccessor world, SpawnReason spawnReason, BlockPos pos, Random random) { Box box = new Box(pos).expand(16); List list = world.getEntitiesByClass(CubozoaEntity.class, box, (entity) -> { @@ -131,14 +131,14 @@ public class CubozoaEntity extends SchoolingFishEntity { } @Override - public void onPlayerCollision(PlayerEntity player) { + public void onPlayerCollision(Player player) { if (player instanceof ServerPlayer && player.damage(DamageSource.mob(this), 0.5F)) { if (!this.isSilent()) { ((ServerPlayer) player).networkHandler .sendPacket(new GameStateChangeS2CPacket(GameStateChangeS2CPacket.PUFFERFISH_STING, 0.0F)); } if (random.nextBoolean()) { - player.addStatusEffect(new StatusEffectInstance(StatusEffects.POISON, 20, 0)); + player.addMobEffect(new MobEffectInstance(MobEffects.POISON, 20, 0)); } } } @@ -154,7 +154,7 @@ public class CubozoaEntity extends SchoolingFishEntity { } if (this.state == MoveControl.State.MOVE_TO && !this.entity.getNavigation().isIdle()) { - float f = (float) (this.speed * this.entity.getAttributeValue(EntityAttributes.GENERIC_MOVEMENT_SPEED)); + float f = (float) (this.speed * this.entity.getAttributeValue(Attributes.MOVEMENT_SPEED)); this.entity.setMovementSpeed(Mth.lerp(0.125F, this.entity.getMovementSpeed(), f)); double d = this.targetX - this.entity.getX(); double e = this.targetY - this.entity.getY(); diff --git a/src/main/java/ru/betterend/entity/DragonflyEntity.java b/src/main/java/ru/betterend/entity/DragonflyEntity.java index 9394834b..8e31c418 100644 --- a/src/main/java/ru/betterend/entity/DragonflyEntity.java +++ b/src/main/java/ru/betterend/entity/DragonflyEntity.java @@ -20,16 +20,16 @@ import net.minecraft.world.entity.ai.pathing.EntityNavigation; import net.minecraft.world.entity.ai.pathing.Path; import net.minecraft.world.entity.ai.pathing.PathNodeType; import net.minecraft.world.entity.attribute.DefaultAttributeContainer; -import net.minecraft.world.entity.attribute.EntityAttributes; +import net.minecraft.world.entity.attribute.Attributes; import net.minecraft.world.entity.mob.MobEntity; import net.minecraft.world.entity.passive.AnimalEntity; import net.minecraft.world.entity.passive.PassiveEntity; import net.minecraft.server.level.ServerLevel; -import net.minecraft.sound.SoundEvent; +import net.minecraft.sounds.SoundEvent; import net.minecraft.core.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.ServerWorldAccess; +import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.Level; import net.minecraft.world.WorldView; import ru.betterend.registry.EndEntities; @@ -48,9 +48,9 @@ public class DragonflyEntity extends AnimalEntity implements Flutterer { } public static DefaultAttributeContainer.Builder createMobAttributes() { - return LivingEntity.createLivingAttributes().add(EntityAttributes.GENERIC_MAX_HEALTH, 8.0D) - .add(EntityAttributes.GENERIC_FOLLOW_RANGE, 16.0D).add(EntityAttributes.GENERIC_FLYING_SPEED, 1.0D) - .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.1D); + return LivingEntity.createLivingAttributes().add(Attributes.MAX_HEALTH, 8.0D) + .add(Attributes.FOLLOW_RANGE, 16.0D).add(Attributes.FLYING_SPEED, 1.0D) + .add(Attributes.MOVEMENT_SPEED, 0.1D); } @Override @@ -190,7 +190,7 @@ public class DragonflyEntity extends AnimalEntity implements Flutterer { return EndEntities.DRAGONFLY.create(world); } - public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, + public static boolean canSpawn(EntityType type, ServerLevelAccessor world, SpawnReason spawnReason, BlockPos pos, Random random) { int y = world.getChunk(pos).sampleHeightmap(Type.WORLD_SURFACE, pos.getX() & 15, pos.getY() & 15); return y > 0 && pos.getY() >= y; diff --git a/src/main/java/ru/betterend/entity/EndFishEntity.java b/src/main/java/ru/betterend/entity/EndFishEntity.java index 5292ac81..cddc8537 100644 --- a/src/main/java/ru/betterend/entity/EndFishEntity.java +++ b/src/main/java/ru/betterend/entity/EndFishEntity.java @@ -10,7 +10,7 @@ import net.minecraft.world.entity.ItemEntity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.SpawnReason; import net.minecraft.world.entity.attribute.DefaultAttributeContainer; -import net.minecraft.world.entity.attribute.EntityAttributes; +import net.minecraft.world.entity.attribute.Attributes; import net.minecraft.world.entity.damage.DamageSource; import net.minecraft.world.entity.data.DataTracker; import net.minecraft.world.entity.data.TrackedData; @@ -19,12 +19,12 @@ import net.minecraft.world.entity.passive.SchoolingFishEntity; import net.minecraft.world.item.ItemStack; import net.minecraft.nbt.CompoundTag; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.sound.SoundEvent; +import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.core.BlockPos; import net.minecraft.util.math.Box; import net.minecraft.world.LocalDifficulty; -import net.minecraft.world.ServerWorldAccess; +import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.Level; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndItems; @@ -43,7 +43,7 @@ public class EndFishEntity extends SchoolingFishEntity { } @Override - public EntityData initialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, + public EntityData initialize(ServerLevelAccessor world, LocalDifficulty difficulty, SpawnReason spawnReason, EntityData entityData, CompoundTag entityTag) { EntityData data = super.initialize(world, difficulty, spawnReason, entityData, entityTag); if (EndBiomes.getFromBiome(world.getBiome(getBlockPos())) == EndBiomes.SULPHUR_SPRINGS) { @@ -115,8 +115,8 @@ public class EndFishEntity extends SchoolingFishEntity { } public static DefaultAttributeContainer.Builder createMobAttributes() { - return LivingEntity.createLivingAttributes().add(EntityAttributes.GENERIC_MAX_HEALTH, 2.0) - .add(EntityAttributes.GENERIC_FOLLOW_RANGE, 16.0).add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.75); + return LivingEntity.createLivingAttributes().add(Attributes.MAX_HEALTH, 2.0).add(Attributes.FOLLOW_RANGE, 16.0) + .add(Attributes.MOVEMENT_SPEED, 0.75); } public int getVariant() { @@ -127,7 +127,7 @@ public class EndFishEntity extends SchoolingFishEntity { return this.dataTracker.get(SCALE) / 32F + 0.75F; } - public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, + public static boolean canSpawn(EntityType type, ServerLevelAccessor world, SpawnReason spawnReason, BlockPos pos, Random random) { Box box = new Box(pos).expand(16); List list = world.getEntitiesByClass(EndFishEntity.class, box, (entity) -> { diff --git a/src/main/java/ru/betterend/entity/EndSlimeEntity.java b/src/main/java/ru/betterend/entity/EndSlimeEntity.java index 03264629..a8e32d47 100644 --- a/src/main/java/ru/betterend/entity/EndSlimeEntity.java +++ b/src/main/java/ru/betterend/entity/EndSlimeEntity.java @@ -15,15 +15,15 @@ import net.minecraft.world.entity.ai.control.MoveControl; import net.minecraft.world.entity.ai.goal.FollowTargetGoal; import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.entity.attribute.DefaultAttributeContainer; -import net.minecraft.world.entity.attribute.EntityAttributes; +import net.minecraft.world.entity.attribute.Attributes; import net.minecraft.world.entity.damage.DamageSource; import net.minecraft.world.entity.data.DataTracker; import net.minecraft.world.entity.data.TrackedData; import net.minecraft.world.entity.data.TrackedDataHandlerRegistry; -import net.minecraft.world.entity.effect.StatusEffects; +import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.mob.SlimeEntity; import net.minecraft.world.entity.passive.IronGolemEntity; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.nbt.CompoundTag; @@ -35,9 +35,9 @@ import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.util.math.Box; import net.minecraft.util.Mth; import net.minecraft.world.LocalDifficulty; -import net.minecraft.world.ServerWorldAccess; +import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.Level; -import net.minecraft.world.biome.Biome; +import net.minecraft.world.level.biome.Biome; import ru.betterend.interfaces.ISlime; import ru.betterend.registry.EndBiomes; import ru.betterend.util.BlocksHelper; @@ -59,21 +59,20 @@ public class EndSlimeEntity extends SlimeEntity { this.goalSelector.add(2, new FaceTowardTargetGoal()); this.goalSelector.add(3, new RandomLookGoal()); this.goalSelector.add(5, new MoveGoal()); - this.targetSelector.add(1, - new FollowTargetGoal(this, PlayerEntity.class, 10, true, false, (livingEntity) -> { - return Math.abs(livingEntity.getY() - this.getY()) <= 4.0D; - })); + this.targetSelector.add(1, new FollowTargetGoal(this, Player.class, 10, true, false, (livingEntity) -> { + return Math.abs(livingEntity.getY() - this.getY()) <= 4.0D; + })); this.targetSelector.add(3, new FollowTargetGoal(this, IronGolemEntity.class, true)); } public static DefaultAttributeContainer.Builder createMobAttributes() { - return LivingEntity.createLivingAttributes().add(EntityAttributes.GENERIC_MAX_HEALTH, 1.0D) - .add(EntityAttributes.GENERIC_ATTACK_DAMAGE, 1.0D).add(EntityAttributes.GENERIC_FOLLOW_RANGE, 16.0D) - .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.15D); + return LivingEntity.createLivingAttributes().add(Attributes.MAX_HEALTH, 1.0D) + .add(Attributes.ATTACK_DAMAGE, 1.0D).add(Attributes.FOLLOW_RANGE, 16.0D) + .add(Attributes.MOVEMENT_SPEED, 0.15D); } @Override - public EntityData initialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, + public EntityData initialize(ServerLevelAccessor world, LocalDifficulty difficulty, SpawnReason spawnReason, EntityData entityData, CompoundTag entityTag) { EntityData data = super.initialize(world, difficulty, spawnReason, entityData, entityTag); EndBiome biome = EndBiomes.getFromBiome(world.getBiome(getBlockPos())); @@ -198,18 +197,18 @@ public class EndSlimeEntity extends SlimeEntity { return this.dataTracker.get(VARIANT) == 0; } - public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, + public static boolean canSpawn(EntityType type, ServerLevelAccessor world, SpawnReason spawnReason, BlockPos pos, Random random) { return random.nextInt(16) == 0 || isPermanentBiome(world, pos) || (notManyEntities(world, pos, 32, 3) && isWaterNear(world, pos, 32, 8)); } - private static boolean isPermanentBiome(ServerWorldAccess world, BlockPos pos) { + private static boolean isPermanentBiome(ServerLevelAccessor world, BlockPos pos) { Biome biome = world.getBiome(pos); return EndBiomes.getFromBiome(biome) == EndBiomes.CHORUS_FOREST; } - private static boolean notManyEntities(ServerWorldAccess world, BlockPos pos, int radius, int maxCount) { + private static boolean notManyEntities(ServerLevelAccessor world, BlockPos pos, int radius, int maxCount) { Box box = new Box(pos).expand(radius); List list = world.getEntitiesByClass(EndSlimeEntity.class, box, (entity) -> { return true; @@ -217,7 +216,7 @@ public class EndSlimeEntity extends SlimeEntity { return list.size() <= maxCount; } - private static boolean isWaterNear(ServerWorldAccess world, BlockPos pos, int radius, int radius2) { + private static boolean isWaterNear(ServerLevelAccessor world, BlockPos pos, int radius, int radius2) { for (int x = pos.getX() - radius; x <= pos.getX() + radius; x++) { POS.setX(x); for (int z = pos.getZ() - radius; z <= pos.getZ() + radius; z++) { @@ -293,7 +292,7 @@ public class EndSlimeEntity extends SlimeEntity { return EndSlimeEntity.this.getTarget() == null && (EndSlimeEntity.this.onGround || EndSlimeEntity.this.isTouchingWater() || EndSlimeEntity.this.isInLava() - || EndSlimeEntity.this.hasStatusEffect(StatusEffects.LEVITATION)) + || EndSlimeEntity.this.hasMobEffect(MobEffects.LEVITATION)) && EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl; } @@ -321,8 +320,7 @@ public class EndSlimeEntity extends SlimeEntity { } else if (!livingEntity.isAlive()) { return false; } else { - return livingEntity instanceof PlayerEntity && ((PlayerEntity) livingEntity).abilities.invulnerable - ? false + return livingEntity instanceof Player && ((Player) livingEntity).abilities.invulnerable ? false : EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl; } } @@ -338,7 +336,7 @@ public class EndSlimeEntity extends SlimeEntity { return false; } else if (!livingEntity.isAlive()) { return false; - } else if (livingEntity instanceof PlayerEntity && ((PlayerEntity) livingEntity).abilities.invulnerable) { + } else if (livingEntity instanceof Player && ((Player) livingEntity).abilities.invulnerable) { return false; } else { return --this.ticksLeft > 0; @@ -381,8 +379,8 @@ public class EndSlimeEntity extends SlimeEntity { } else { this.state = MoveControl.State.WAIT; if (this.entity.isOnGround()) { - this.entity.setMovementSpeed((float) (this.speed - * this.entity.getAttributeValue(EntityAttributes.GENERIC_MOVEMENT_SPEED))); + this.entity.setMovementSpeed( + (float) (this.speed * this.entity.getAttributeValue(Attributes.MOVEMENT_SPEED))); if (this.ticksUntilJump-- <= 0) { this.ticksUntilJump = EndSlimeEntity.this.getTicksUntilNextJump(); if (this.jumpOften) { @@ -400,8 +398,8 @@ public class EndSlimeEntity extends SlimeEntity { this.entity.setMovementSpeed(0.0F); } } else { - this.entity.setMovementSpeed((float) (this.speed - * this.entity.getAttributeValue(EntityAttributes.GENERIC_MOVEMENT_SPEED))); + this.entity.setMovementSpeed( + (float) (this.speed * this.entity.getAttributeValue(Attributes.MOVEMENT_SPEED))); } } diff --git a/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java b/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java index 20b2c335..50b62612 100644 --- a/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java +++ b/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java @@ -14,17 +14,17 @@ import net.minecraft.world.entity.ai.goal.LookAtEntityGoal; import net.minecraft.world.entity.ai.goal.MeleeAttackGoal; import net.minecraft.world.entity.ai.goal.WanderAroundFarGoal; import net.minecraft.world.entity.attribute.DefaultAttributeContainer; -import net.minecraft.world.entity.attribute.EntityAttributes; +import net.minecraft.world.entity.attribute.Attributes; import net.minecraft.world.entity.damage.DamageSource; -import net.minecraft.world.entity.effect.StatusEffectInstance; -import net.minecraft.world.entity.effect.StatusEffects; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.mob.HostileEntity; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.sound.SoundEvent; +import net.minecraft.sounds.SoundEvent; import net.minecraft.core.BlockPos; import net.minecraft.util.math.Box; -import net.minecraft.world.ServerWorldAccess; +import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.Level; import ru.betterend.registry.EndSounds; import ru.betterend.util.MHelper; @@ -38,15 +38,15 @@ public class ShadowWalkerEntity extends HostileEntity { protected void initGoals() { this.goalSelector.add(2, new AttackGoal(this, 1.0D, false)); this.goalSelector.add(7, new WanderAroundFarGoal(this, 1.0D)); - this.goalSelector.add(8, new LookAtEntityGoal(this, PlayerEntity.class, 8.0F)); + this.goalSelector.add(8, new LookAtEntityGoal(this, Player.class, 8.0F)); this.goalSelector.add(8, new LookAroundGoal(this)); - this.targetSelector.add(2, new FollowTargetGoal(this, PlayerEntity.class, true)); + this.targetSelector.add(2, new FollowTargetGoal(this, Player.class, true)); } public static DefaultAttributeContainer.Builder createMobAttributes() { - return HostileEntity.createHostileAttributes().add(EntityAttributes.GENERIC_FOLLOW_RANGE, 35.0) - .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.15).add(EntityAttributes.GENERIC_ATTACK_DAMAGE, 4.5) - .add(EntityAttributes.GENERIC_ARMOR, 2.0).add(EntityAttributes.ZOMBIE_SPAWN_REINFORCEMENTS); + return HostileEntity.createHostileAttributes().add(Attributes.FOLLOW_RANGE, 35.0) + .add(Attributes.MOVEMENT_SPEED, 0.15).add(Attributes.ATTACK_DAMAGE, 4.5).add(Attributes.ARMOR, 2.0) + .add(Attributes.ZOMBIE_SPAWN_REINFORCEMENTS); } @Override @@ -94,14 +94,14 @@ public class ShadowWalkerEntity extends HostileEntity { boolean attack = super.tryAttack(target); if (attack && target instanceof LivingEntity) { LivingEntity living = (LivingEntity) target; - if (!(living.hasStatusEffect(StatusEffects.BLINDNESS))) { - living.addStatusEffect(new StatusEffectInstance(StatusEffects.BLINDNESS, 60)); + if (!(living.hasMobEffect(MobEffects.BLINDNESS))) { + living.addMobEffect(new MobEffectInstance(MobEffects.BLINDNESS, 60)); } } return attack; } - public static boolean canSpawn(EntityType type, ServerWorldAccess world, + public static boolean canSpawn(EntityType type, ServerLevelAccessor world, SpawnReason spawnReason, BlockPos pos, Random random) { if (HostileEntity.canSpawnInDark(type, world, spawnReason, pos, random)) { Box box = new Box(pos).expand(16); diff --git a/src/main/java/ru/betterend/entity/SilkMothEntity.java b/src/main/java/ru/betterend/entity/SilkMothEntity.java index e5494757..a54ef959 100644 --- a/src/main/java/ru/betterend/entity/SilkMothEntity.java +++ b/src/main/java/ru/betterend/entity/SilkMothEntity.java @@ -24,7 +24,7 @@ import net.minecraft.world.entity.ai.pathing.BirdNavigation; import net.minecraft.world.entity.ai.pathing.EntityNavigation; import net.minecraft.world.entity.ai.pathing.PathNodeType; import net.minecraft.world.entity.attribute.DefaultAttributeContainer; -import net.minecraft.world.entity.attribute.EntityAttributes; +import net.minecraft.world.entity.attribute.Attributes; import net.minecraft.world.entity.damage.DamageSource; import net.minecraft.world.entity.mob.MobEntity; import net.minecraft.world.entity.passive.AnimalEntity; @@ -41,9 +41,9 @@ import net.minecraft.core.BlockPos; import net.minecraft.util.math.Box; import net.minecraft.util.math.Vec3d; import net.minecraft.core.Registry; -import net.minecraft.util.registry.RegistryKey; +import net.minecraft.resources.ResourceKey; import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.ServerWorldAccess; +import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.Level; import ru.betterend.BetterEnd; import ru.betterend.blocks.BlockProperties; @@ -68,9 +68,9 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { } public static DefaultAttributeContainer.Builder createMobAttributes() { - return LivingEntity.createLivingAttributes().add(EntityAttributes.GENERIC_MAX_HEALTH, 2.0D) - .add(EntityAttributes.GENERIC_FOLLOW_RANGE, 16.0D).add(EntityAttributes.GENERIC_FLYING_SPEED, 0.4D) - .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.1D); + return LivingEntity.createLivingAttributes().add(Attributes.MAX_HEALTH, 2.0D) + .add(Attributes.FOLLOW_RANGE, 16.0D).add(Attributes.FLYING_SPEED, 0.4D) + .add(Attributes.MOVEMENT_SPEED, 0.1D); } public void setHive(Level world, BlockPos hive) { @@ -92,7 +92,7 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { hivePos = NbtHelper.toBlockPos(tag.getCompound("HivePos")); ResourceLocation worldID = new ResourceLocation(tag.getString("HiveWorld")); try { - hiveWorld = world.getServer().getLevel(RegistryKey.of(Registry.DIMENSION, worldID)); + hiveWorld = world.getServer().getLevel(ResourceKey.of(Registry.DIMENSION, worldID)); } catch (Exception e) { BetterEnd.LOGGER.warning("Silk Moth Hive Level {} is missing!", worldID); hivePos = null; @@ -174,13 +174,13 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { this.world.spawnEntity(drop); } - public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, + public static boolean canSpawn(EntityType type, ServerLevelAccessor world, SpawnReason spawnReason, BlockPos pos, Random random) { int y = world.getChunk(pos).sampleHeightmap(Type.WORLD_SURFACE, pos.getX() & 15, pos.getY() & 15); return y > 0 && pos.getY() >= y && notManyEntities(world, pos, 32, 1); } - private static boolean notManyEntities(ServerWorldAccess world, BlockPos pos, int radius, int maxCount) { + private static boolean notManyEntities(ServerLevelAccessor world, BlockPos pos, int radius, int maxCount) { Box box = new Box(pos).expand(radius); List list = world.getEntitiesByClass(SilkMothEntity.class, box, (entity) -> true); return list.size() <= maxCount; diff --git a/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java b/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java index 158151ca..8a910df0 100644 --- a/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java +++ b/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java @@ -5,7 +5,7 @@ import java.util.Map; import com.google.common.collect.Maps; -import net.minecraft.world.item.ItemConvertible; +import net.minecraft.world.level.ItemLike; import ru.betterend.blocks.HydraluxPetalColoredBlock; import ru.betterend.blocks.complex.ColoredMaterial; import ru.betterend.registry.EndBlocks; @@ -27,7 +27,7 @@ public class FlamboyantRefabricatedIntegration extends ModIntegration { */ Map colors = Maps.newHashMap(); - Map dyes = Maps.newHashMap(); + Map dyes = Maps.newHashMap(); /* * for (Object val: values) { Integer color = (Integer) getFieldValue(fDyeColor, * "signColor", val); String name = (String) getFieldValue(fDyeColor, "name", @@ -56,7 +56,7 @@ public class FlamboyantRefabricatedIntegration extends ModIntegration { new ColoredMaterial(HydraluxPetalColoredBlock::new, EndBlocks.HYDRALUX_PETAL_BLOCK, colors, dyes, true); } - private void addColor(String hex, String name, Map colors, Map dyes) { + private void addColor(String hex, String name, Map colors, Map dyes) { int color = MHelper.color(hex); colors.put(color, name); dyes.put(color, getItem(name + "_dye")); diff --git a/src/main/java/ru/betterend/integration/ModIntegration.java b/src/main/java/ru/betterend/integration/ModIntegration.java index 0ee53e25..9489940a 100644 --- a/src/main/java/ru/betterend/integration/ModIntegration.java +++ b/src/main/java/ru/betterend/integration/ModIntegration.java @@ -13,15 +13,15 @@ import net.minecraft.world.item.Item; import net.minecraft.tags.BlockTags; import net.minecraft.tags.ItemTags; import net.minecraft.tags.Tag; -import net.minecraft.tags.Tag.Identified; +import net.minecraft.tags.Tag.Named; import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.registry.BuiltinRegistries; +import net.minecraft.data.BuiltinRegistries; import net.minecraft.core.Registry; -import net.minecraft.util.registry.RegistryKey; -import net.minecraft.world.biome.Biome; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.gen.GenerationStep; -import net.minecraft.world.gen.feature.ConfiguredFeature; -import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.BetterEnd; import ru.betterend.world.features.EndFeature; @@ -54,8 +54,8 @@ public abstract class ModIntegration { return getBlock(name).defaultBlockState(); } - public RegistryKey getKey(String name) { - return RegistryKey.of(Registry.BIOME_KEY, getID(name)); + public ResourceKey getKey(String name) { + return ResourceKey.of(Registry.BIOME_KEY, getID(name)); } public boolean modIsInstalled() { @@ -196,13 +196,13 @@ public abstract class ModIntegration { return null; } - public Tag.Identified getItemTag(String name) { + public Tag.Named getItemTag(String name) { ResourceLocation id = getID(name); Tag tag = ItemTags.getTagGroup().getTag(id); return tag == null ? (Identified) TagRegistry.item(id) : (Identified) tag; } - public Tag.Identified getBlockTag(String name) { + public Tag.Named getBlockTag(String name) { ResourceLocation id = getID(name); Tag tag = BlockTags.getTagGroup().getTag(id); return tag == null ? (Identified) TagRegistry.block(id) : (Identified) tag; diff --git a/src/main/java/ru/betterend/integration/NourishIntegration.java b/src/main/java/ru/betterend/integration/NourishIntegration.java index 1c4e8778..0697e356 100644 --- a/src/main/java/ru/betterend/integration/NourishIntegration.java +++ b/src/main/java/ru/betterend/integration/NourishIntegration.java @@ -12,10 +12,10 @@ public class NourishIntegration extends ModIntegration { @Override public void register() { - Tag.Identified fats = getItemTag("fats"); - Tag.Identified fruit = getItemTag("fruit"); - Tag.Identified protein = getItemTag("protein"); - Tag.Identified sweets = getItemTag("sweets"); + Tag.Named fats = getItemTag("fats"); + Tag.Named fruit = getItemTag("fruit"); + Tag.Named protein = getItemTag("protein"); + Tag.Named sweets = getItemTag("sweets"); TagHelper.addTag(fats, EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED); TagHelper.addTag(fruit, EndItems.SHADOW_BERRY_RAW, EndItems.SHADOW_BERRY_COOKED, EndItems.BLOSSOM_BERRY, diff --git a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java index 37dffd01..b7250223 100644 --- a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java +++ b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java @@ -5,8 +5,8 @@ import java.util.stream.Collectors; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.collection.WeightedList; -import net.minecraft.util.registry.BuiltinRegistries; -import net.minecraft.world.biome.Biome; +import net.minecraft.data.BuiltinRegistries; +import net.minecraft.world.level.biome.Biome; import ru.betterend.integration.Integrations; import ru.betterend.integration.ModIntegration; import ru.betterend.integration.byg.biomes.BYGBiomes; diff --git a/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java b/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java index 7ba8407d..3db0b3ef 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java @@ -3,8 +3,8 @@ package ru.betterend.integration.byg.biomes; import java.util.List; import net.minecraft.world.entity.SpawnGroup; -import net.minecraft.sound.SoundEvent; -import net.minecraft.world.biome.Biome; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.biome.BiomeEffects; import net.minecraft.world.biome.SpawnSettings.SpawnEntry; import ru.betterend.BetterEnd; diff --git a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java index 85094e37..0567deb4 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java @@ -4,8 +4,8 @@ import java.util.List; import net.minecraft.world.entity.SpawnGroup; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.sound.SoundEvent; -import net.minecraft.world.biome.Biome; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.biome.BiomeEffects; import net.minecraft.world.biome.SpawnSettings.SpawnEntry; import net.minecraft.world.gen.GenerationStep.Feature; diff --git a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java index a59f15ed..d8816e4b 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java @@ -6,16 +6,16 @@ import java.util.function.Supplier; import net.minecraft.world.level.block.Block; import net.minecraft.world.entity.SpawnGroup; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.sound.SoundEvent; +import net.minecraft.sounds.SoundEvent; import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.registry.BuiltinRegistries; +import net.minecraft.data.BuiltinRegistries; import net.minecraft.core.Registry; -import net.minecraft.world.biome.Biome; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.biome.BiomeEffects; import net.minecraft.world.biome.SpawnSettings.SpawnEntry; import net.minecraft.world.gen.GenerationStep.Feature; -import net.minecraft.world.gen.feature.ConfiguredFeature; -import net.minecraft.world.gen.feature.ConfiguredFeatures; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeatures; import ru.betterend.BetterEnd; import ru.betterend.integration.Integrations; import ru.betterend.integration.byg.features.BYGFeatures; @@ -33,7 +33,7 @@ public class OldBulbisGardens extends EndBiome { BiomeEffects effects = biome.getEffects(); Block ivis = Integrations.BYG.getBlock("ivis_phylium"); - Block origin = biome.getGenerationSettings().getSurfaceConfig().getTopMaterial().getBlock(); + Block origin = biome.getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial().getBlock(); BiomeDefinition def = new BiomeDefinition("old_bulbis_gardens").setFogColor(215, 132, 207).setFogDensity(1.8F) .setWaterAndFogColor(40, 0, 56).setFoliageColor(122, 17, 155) .setParticles(ParticleTypes.REVERSE_PORTAL, 0.002F).setSurface(ivis, origin) diff --git a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java index 4e4da866..9e9d790f 100644 --- a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java @@ -7,11 +7,11 @@ import com.google.common.base.Function; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.integration.Integrations; import ru.betterend.registry.EndTags; import ru.betterend.util.MHelper; @@ -21,8 +21,8 @@ import ru.betterend.world.features.DefaultFeature; public class BigEtherTreeFeature extends DefaultFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) return false; @@ -77,7 +77,7 @@ public class BigEtherTreeFeature extends DefaultFeature { return true; } - // private void makeLeavesSphere(StructureWorldAccess world, BlockPos pos, + // private void makeLeavesSphere(WorldGenLevel world, BlockPos pos, // BlockState leaves, Function ignore) { // // } diff --git a/src/main/java/ru/betterend/integration/byg/features/GreatNightshadeTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/GreatNightshadeTreeFeature.java index bf5e89c0..91501993 100644 --- a/src/main/java/ru/betterend/integration/byg/features/GreatNightshadeTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/GreatNightshadeTreeFeature.java @@ -10,13 +10,13 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.material.Material; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.integration.Integrations; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; @@ -35,8 +35,8 @@ public class GreatNightshadeTreeFeature extends DefaultFeature { private static final List BRANCH; @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) return false; diff --git a/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java index e18fdaab..069e0f9b 100644 --- a/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java @@ -10,13 +10,13 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.material.Material; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.integration.Integrations; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; @@ -35,8 +35,8 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { private static final List BRANCH; @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) return false; diff --git a/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java index a0a3b41c..064de144 100644 --- a/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java @@ -9,13 +9,13 @@ import com.google.common.collect.Lists; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.Material; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.util.math.Box; import net.minecraft.util.Mth; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.integration.Integrations; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndTags; @@ -36,8 +36,8 @@ public class OldBulbisTreeFeature extends DefaultFeature { private static final List SIDE; @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) return false; if (!world.getBlockState(pos.down(4)).getBlock().isIn(EndTags.GEN_TERRAIN)) @@ -82,11 +82,9 @@ public class OldBulbisTreeFeature extends DefaultFeature { Vector3f vec = spline.get(spline.size() - 1); float radius = (size + MHelper.randRange(0, size * 0.5F, random)) * 0.35F; - bigSphere(world, pos.offset(vec.getX(), vec.getY(), vec.getZ()), radius, cap, glow, wood, replacement, - random); + bigSphere(world, pos.offset(vec.x(), vec.y(), vec.z()), radius, cap, glow, wood, replacement, random); vec = SplineHelper.getPos(spline, 0.3F); - makeRoots(world, pos.offset(vec.getX(), vec.getY(), vec.getZ()), size * 0.4F + 5, random, wood, - replacement); + makeRoots(world, pos.offset(vec.x(), vec.y(), vec.z()), size * 0.4F + 5, random, wood, replacement); sdf = (sdf == null) ? branch : new SDFUnion().setSourceA(sdf).setSourceB(branch); } @@ -102,19 +100,19 @@ public class OldBulbisTreeFeature extends DefaultFeature { return true; } - private void bigSphere(StructureWorldAccess world, BlockPos pos, float radius, BlockState cap, BlockState glow, + private void bigSphere(WorldGenLevel world, BlockPos pos, float radius, BlockState cap, BlockState glow, BlockState wood, Function replacement, Random random) { OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); SDF sphere = new SDFSphere().setRadius(radius).setBlock(cap); SDF sphereInner = new SDFSphere().setRadius(radius * 0.53F).setBlock(Blocks.AIR); sphereInner = new SDFDisplacement().setFunction((vec) -> { - return (float) noise.eval(vec.getX() * 0.1, vec.getY() * 0.1, vec.getZ() * 0.1); + return (float) noise.eval(vec.x() * 0.1, vec.y() * 0.1, vec.z() * 0.1); }).setSource(sphereInner); SDF sphereGlow = new SDFSphere().setRadius(radius * 0.6F).setBlock(glow); sphereGlow = new SDFDisplacement().setFunction((vec) -> { - return (float) noise.eval(vec.getX() * 0.1, vec.getY() * 0.1, vec.getZ() * 0.1) * 2F; + return (float) noise.eval(vec.x() * 0.1, vec.y() * 0.1, vec.z() * 0.1) * 2F; }).setSource(sphereGlow); sphereGlow = new SDFSubtraction().setSourceA(sphereGlow).setSourceB(sphereInner); @@ -150,7 +148,7 @@ public class OldBulbisTreeFeature extends DefaultFeature { sphere.fillArea(world, pos, new Box(pos.up((int) offsetY)).expand(radius * 1.3F)); } - private void makeRoots(StructureWorldAccess world, BlockPos pos, float radius, Random random, BlockState wood, + private void makeRoots(WorldGenLevel world, BlockPos pos, float radius, Random random, BlockState wood, Function replacement) { int count = (int) (radius * 1.5F); for (int i = 0; i < count; i++) { diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java index 6869324d..7b5b8195 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java @@ -17,7 +17,7 @@ import me.shedaniel.rei.api.widgets.Tooltip; import me.shedaniel.rei.api.widgets.Widgets; import me.shedaniel.rei.gui.entries.RecipeEntry; import me.shedaniel.rei.gui.widget.Widget; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import net.minecraft.client.resource.language.I18n; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.world.item.Items; @@ -90,7 +90,7 @@ public class REIAlloyingFuelCategory implements RecipeCategory> getBiomes(); + public List> getBiomes(); } diff --git a/src/main/java/ru/betterend/item/DrinkItem.java b/src/main/java/ru/betterend/item/DrinkItem.java index 78c78eaf..8969fb96 100644 --- a/src/main/java/ru/betterend/item/DrinkItem.java +++ b/src/main/java/ru/betterend/item/DrinkItem.java @@ -2,7 +2,7 @@ package ru.betterend.item; import net.minecraft.advancement.criterion.Criteria; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemUsage; import net.minecraft.world.item.Items; @@ -29,7 +29,7 @@ public class DrinkItem extends PatternedItem { } @Override - public TypedActionResult use(Level world, PlayerEntity user, Hand hand) { + public TypedActionResult use(Level world, Player user, Hand hand) { return ItemUsage.consumeHeldItem(world, user, hand); } @@ -41,12 +41,12 @@ public class DrinkItem extends PatternedItem { serverPlayerEntity.incrementStat(Stats.USED.getOrCreateStat(this)); } - if (user instanceof PlayerEntity && !((PlayerEntity) user).abilities.creativeMode) { + if (user instanceof Player && !((Player) user).abilities.creativeMode) { stack.decrement(1); } if (!world.isClientSide) { - user.clearStatusEffects(); + user.clearMobEffects(); } return stack.isEmpty() ? new ItemStack(Items.GLASS_BOTTLE) : stack; diff --git a/src/main/java/ru/betterend/item/EnchantedPetalItem.java b/src/main/java/ru/betterend/item/EnchantedPetalItem.java index 9ede5983..c34d07d2 100644 --- a/src/main/java/ru/betterend/item/EnchantedPetalItem.java +++ b/src/main/java/ru/betterend/item/EnchantedPetalItem.java @@ -7,7 +7,7 @@ import ru.betterend.registry.EndItems; public class EnchantedPetalItem extends PatternedItem { public EnchantedPetalItem() { - super(EndItems.makeItemSettings().rarity(Rarity.RARE).maxCount(16)); + super(EndItems.makeItemSettings().rarity(Rarity.RARE).stacksTo(16)); } @Override diff --git a/src/main/java/ru/betterend/item/EndArmorItem.java b/src/main/java/ru/betterend/item/EndArmorItem.java index 0d9bfe05..3c56b9b6 100644 --- a/src/main/java/ru/betterend/item/EndArmorItem.java +++ b/src/main/java/ru/betterend/item/EndArmorItem.java @@ -6,9 +6,9 @@ import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.Multimap; import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.attribute.EntityAttribute; -import net.minecraft.world.entity.attribute.EntityAttributeModifier; -import net.minecraft.world.entity.attribute.EntityAttributes; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.attribute.Attributes; import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ArmorMaterial; import net.minecraft.world.item.Item; @@ -30,20 +30,20 @@ public class EndArmorItem extends ArmorItem implements Patterned { return; } - Multimap attributeModifiers = accessor.be_getAttributeModifiers(); + Multimap attributeModifiers = accessor.be_getAttributeModifiers(); // In case Mojang or anyone else decided to fix this - if (attributeModifiers.keys().contains(EntityAttributes.GENERIC_KNOCKBACK_RESISTANCE)) { + if (attributeModifiers.keys().contains(Attributes.KNOCKBACK_RESISTANCE)) { return; } UUID uuid = accessor.be_getModifiers()[slot.getEntitySlotId()]; // Rebuild attributeModifiers to include knockback resistance - ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); + ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); builder.putAll(attributeModifiers); - builder.put(EntityAttributes.GENERIC_KNOCKBACK_RESISTANCE, new EntityAttributeModifier(uuid, - "Armor knockback resistance", knockbackResistance, EntityAttributeModifier.Operation.ADDITION)); + builder.put(Attributes.KNOCKBACK_RESISTANCE, new AttributeModifier(uuid, "Armor knockback resistance", + knockbackResistance, AttributeModifier.Operation.ADDITION)); accessor.be_setAttributeModifiers(builder.build()); } diff --git a/src/main/java/ru/betterend/item/EternalCrystalItem.java b/src/main/java/ru/betterend/item/EternalCrystalItem.java index 3466577e..8a547347 100644 --- a/src/main/java/ru/betterend/item/EternalCrystalItem.java +++ b/src/main/java/ru/betterend/item/EternalCrystalItem.java @@ -5,6 +5,6 @@ import ru.betterend.registry.EndItems; public class EternalCrystalItem extends PatternedItem { public EternalCrystalItem() { - super(EndItems.makeItemSettings().maxCount(16).rarity(Rarity.EPIC)); + super(EndItems.makeItemSettings().stacksTo(16).rarity(Rarity.EPIC)); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/item/GuideBookItem.java b/src/main/java/ru/betterend/item/GuideBookItem.java index ad652d22..bb137c11 100644 --- a/src/main/java/ru/betterend/item/GuideBookItem.java +++ b/src/main/java/ru/betterend/item/GuideBookItem.java @@ -3,7 +3,7 @@ package ru.betterend.item; import java.util.List; import net.minecraft.client.item.TooltipContext; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.server.level.ServerPlayer; @@ -26,11 +26,11 @@ public class GuideBookItem extends PatternedItem { } public GuideBookItem() { - super(EndItems.makeItemSettings().maxCount(1)); + super(EndItems.makeItemSettings().stacksTo(1)); } @Override - public TypedActionResult use(Level world, PlayerEntity user, Hand hand) { + public TypedActionResult use(Level world, Player user, Hand hand) { if (!world.isClientSide && user instanceof ServerPlayer) { PatchouliAPI.get().openBookGUI((ServerPlayer) user, BOOK_ID); return TypedActionResult.success(user.getStackInHand(hand)); diff --git a/src/main/java/ru/betterend/item/PatternedDiscItem.java b/src/main/java/ru/betterend/item/PatternedDiscItem.java index dca0c763..0abf6154 100644 --- a/src/main/java/ru/betterend/item/PatternedDiscItem.java +++ b/src/main/java/ru/betterend/item/PatternedDiscItem.java @@ -1,12 +1,13 @@ package ru.betterend.item; -import net.minecraft.world.item.MusicDiscItem; -import net.minecraft.sound.SoundEvent; +import net.minecraft.world.item.Item; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.item.RecordItem; import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; -public class PatternedDiscItem extends MusicDiscItem implements Patterned { - public PatternedDiscItem(int comparatorOutput, SoundEvent sound, Properties settings) { +public class PatternedDiscItem extends RecordItem implements Patterned { + public PatternedDiscItem(int comparatorOutput, SoundEvent sound, Item.Properties settings) { super(comparatorOutput, sound, settings); } diff --git a/src/main/java/ru/betterend/item/material/EndArmorMaterial.java b/src/main/java/ru/betterend/item/material/EndArmorMaterial.java index c80e094c..78bb7352 100644 --- a/src/main/java/ru/betterend/item/material/EndArmorMaterial.java +++ b/src/main/java/ru/betterend/item/material/EndArmorMaterial.java @@ -7,7 +7,7 @@ import net.fabricmc.api.Environment; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.ArmorMaterial; import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.sound.SoundEvent; +import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.util.LazyLoadedValue; import ru.betterend.registry.EndBlocks; diff --git a/src/main/java/ru/betterend/item/tool/EndHammerItem.java b/src/main/java/ru/betterend/item/tool/EndHammerItem.java index ca6d5998..8ce0818a 100644 --- a/src/main/java/ru/betterend/item/tool/EndHammerItem.java +++ b/src/main/java/ru/betterend/item/tool/EndHammerItem.java @@ -9,18 +9,19 @@ import com.google.common.collect.Sets; import io.netty.util.internal.ThreadLocalRandom; import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.DiggerItem; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.Material; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.attribute.EntityAttribute; -import net.minecraft.world.entity.attribute.EntityAttributeModifier; -import net.minecraft.world.entity.attribute.EntityAttributes; -import net.minecraft.world.entity.player.PlayerEntity; + import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.MiningToolItem; import net.minecraft.world.item.Tier; import net.minecraft.tags.Tag; import net.minecraft.core.BlockPos; @@ -30,72 +31,70 @@ import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; import ru.betterend.registry.EndTags; -public class EndHammerItem extends MiningToolItem implements DynamicAttributeTool, Patterned { - public final static UUID ATTACK_KNOCKBACK_MODIFIER_ID = Mth.randomUuid(ThreadLocalRandom.current()); +public class EndHammerItem extends DiggerItem implements DynamicAttributeTool, Patterned { + public final static UUID ATTACK_KNOCKBACK_MODIFIER_ID = Mth.createInsecureUUID(ThreadLocalRandom.current()); - private final Multimap attributeModifiers; + private final Multimap attributeModifiers; public EndHammerItem(Tier material, float attackDamage, float attackSpeed, double knockback, Properties settings) { super(attackDamage, attackSpeed, material, Sets.newHashSet(), settings); - Builder builder = ImmutableMultimap.builder(); - builder.put(EntityAttributes.GENERIC_ATTACK_DAMAGE, - new EntityAttributeModifier(ATTACK_DAMAGE_MODIFIER_ID, "Weapon modifier", - attackDamage + material.getAttackDamage(), EntityAttributeModifier.Operation.ADDITION)); - builder.put(EntityAttributes.GENERIC_ATTACK_SPEED, new EntityAttributeModifier(ATTACK_SPEED_MODIFIER_ID, - "Weapon modifier", attackSpeed, EntityAttributeModifier.Operation.ADDITION)); - builder.put(EntityAttributes.GENERIC_ATTACK_KNOCKBACK, new EntityAttributeModifier(ATTACK_KNOCKBACK_MODIFIER_ID, - "Weapon modifier", knockback, EntityAttributeModifier.Operation.ADDITION)); + Builder builder = ImmutableMultimap.builder(); + builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Weapon modifier", + attackDamage + material.getAttackDamageBonus(), AttributeModifier.Operation.ADDITION)); + builder.put(Attributes.ATTACK_SPEED, new AttributeModifier(BASE_ATTACK_SPEED_UUID, "Weapon modifier", + attackSpeed, AttributeModifier.Operation.ADDITION)); + builder.put(Attributes.ATTACK_KNOCKBACK, new AttributeModifier(ATTACK_KNOCKBACK_MODIFIER_ID, "Weapon modifier", + knockback, AttributeModifier.Operation.ADDITION)); this.attributeModifiers = builder.build(); } @Override - public boolean canMine(BlockState state, Level world, BlockPos pos, PlayerEntity miner) { + public boolean canAttackBlock(BlockState state, Level world, BlockPos pos, Player miner) { return state.getMaterial().equals(Material.STONE) || state.getMaterial().equals(Material.GLASS) || state.is(Blocks.DIAMOND_BLOCK) || state.is(Blocks.EMERALD_BLOCK) || state.is(Blocks.LAPIS_BLOCK) || state.is(Blocks.REDSTONE_BLOCK); } @Override - public boolean postHit(ItemStack stack, LivingEntity target, LivingEntity attacker) { - stack.damage(1, attacker, ((entity) -> { - entity.sendEquipmentBreakStatus(EquipmentSlot.MAINHAND); + public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { + stack.hurtAndBreak(1, attacker, (entity -> { + entity.broadcastBreakEvent(EquipmentSlot.MAINHAND); })); return true; } @Override - public boolean postMine(ItemStack stack, Level world, BlockState state, BlockPos pos, LivingEntity miner) { - if (state.getHardness(world, pos) != 0.0F) { - stack.damage(1, miner, ((entity) -> { - entity.sendEquipmentBreakStatus(EquipmentSlot.MAINHAND); + public boolean mineBlock(ItemStack stack, Level world, BlockState state, BlockPos pos, LivingEntity miner) { + if (state.getDestroySpeed(world, pos) != 0.0F) { + stack.hurtAndBreak(1, miner, (entity -> { + entity.broadcastBreakEvent(EquipmentSlot.MAINHAND); })); } - return true; } @Override public float getDestroySpeed(ItemStack stack, BlockState state) { if (state.getMaterial().equals(Material.GLASS)) { - return this.getMaterial().getDestroySpeed() * 2.0F; + return getTier().getSpeed() * 2.0F; } if (isCorrectToolForDrops(state)) { float mult = 1.0F; if (state.is(Blocks.DIAMOND_BLOCK) || state.is(Blocks.EMERALD_BLOCK) || state.is(Blocks.LAPIS_BLOCK) || state.is(Blocks.REDSTONE_BLOCK)) { - mult = this.getMaterial().getDestroySpeed(); + mult = getTier().getSpeed(); } else { - mult = this.getMaterial().getDestroySpeed() / 2.0F; + mult = getTier().getSpeed() / 2.0F; } - return mult > 1.0F ? mult : 1.0F; + return Math.max(mult, 1.0F); } return 1.0F; } @Override - public float getDestroySpeed(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { + public float getMiningSpeedMultiplier(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { if (tag.equals(EndTags.HAMMERS)) { return this.getDestroySpeed(stack, state); } @@ -135,8 +134,8 @@ public class EndHammerItem extends MiningToolItem implements DynamicAttributeToo } @Override - public Multimap getAttributeModifiers(EquipmentSlot slot) { - return slot == EquipmentSlot.MAINHAND ? this.attributeModifiers : super.getAttributeModifiers(slot); + public Multimap getDefaultAttributeModifiers(EquipmentSlot slot) { + return slot == EquipmentSlot.MAINHAND ? this.attributeModifiers : super.getDefaultAttributeModifiers(slot); } @Override diff --git a/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java b/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java index aa74a438..e85b8ef2 100644 --- a/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java @@ -14,14 +14,14 @@ import net.minecraft.client.render.Camera; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.effect.StatusEffectInstance; -import net.minecraft.world.entity.effect.StatusEffects; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; import net.minecraft.fluid.FluidState; import net.minecraft.util.Util; import net.minecraft.util.Mth; import net.minecraft.world.level.Level; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.Biome.Category; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Biome.Category; import ru.betterend.client.ClientOptions; import ru.betterend.registry.EndBiomes; import ru.betterend.util.BackgroundInfo; @@ -55,7 +55,7 @@ public class BackgroundRendererMixin { Entity entity = camera.getFocusedEntity(); boolean skip = false; if (entity instanceof LivingEntity) { - StatusEffectInstance effect = ((LivingEntity) entity).getStatusEffect(StatusEffects.NIGHT_VISION); + MobEffectInstance effect = ((LivingEntity) entity).getMobEffect(MobEffects.NIGHT_VISION); skip = effect != null && effect.getDuration() > 0; } if (!skip) { @@ -96,7 +96,7 @@ public class BackgroundRendererMixin { if (entity instanceof LivingEntity) { LivingEntity le = (LivingEntity) entity; - StatusEffectInstance effect = le.getStatusEffect(StatusEffects.BLINDNESS); + MobEffectInstance effect = le.getMobEffect(MobEffects.BLINDNESS); if (effect != null) { int duration = effect.getDuration(); if (duration > 20) { diff --git a/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java b/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java index 6e0e074b..1a897f04 100644 --- a/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java +++ b/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java @@ -8,7 +8,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import net.minecraft.client.color.world.BiomeColors; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; @@ -29,7 +29,7 @@ public class BiomeColorsMixin { @Inject(method = "getWaterColor", at = @At("RETURN"), cancellable = true) private static void be_getWaterColor(BlockRenderView world, BlockPos pos, CallbackInfoReturnable info) { if (ClientOptions.useSulfurWaterColor()) { - BlockRenderView view = HAS_SODIUM ? MinecraftClient.getInstance().world : world; + BlockRenderView view = HAS_SODIUM ? Minecraft.getInstance().world : world; MutableBlockPos mut = new MutableBlockPos(); mut.setY(pos.getY()); for (int i = 0; i < OFFSETS.length; i++) { diff --git a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java index bd858608..32e0fd75 100644 --- a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java @@ -7,7 +7,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.network.NetworkThreadUtils; @@ -18,7 +18,7 @@ import ru.betterend.client.gui.BlockSignEditScreen; @Mixin(ClientPlayNetworkHandler.class) public class ClientPlayNetworkHandlerMixin { @Shadow - private MinecraftClient client; + private Minecraft client; @Shadow private ClientLevel world; diff --git a/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java b/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java index 97c63bb2..d6a6a9b4 100644 --- a/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java +++ b/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java @@ -8,7 +8,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import net.minecraft.client.RunArgs; import net.minecraft.client.color.block.BlockColors; import net.minecraft.client.color.item.ItemColors; @@ -24,7 +24,7 @@ import net.minecraft.world.level.Level; import ru.betterend.interfaces.IColorProvider; import ru.betterend.util.MHelper; -@Mixin(MinecraftClient.class) +@Mixin(Minecraft.class) public class MinecraftClientMixin { @Shadow public ClientPlayerEntity player; diff --git a/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java b/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java index 587da5f2..f65bce48 100644 --- a/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java @@ -9,7 +9,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import net.minecraft.client.sound.AbstractSoundInstance; import net.minecraft.client.sound.MusicTracker; import net.minecraft.client.sound.SoundInstance; @@ -22,7 +22,7 @@ import ru.betterend.client.ClientOptions; public class MusicTrackerMixin { @Shadow @Final - private MinecraftClient client; + private Minecraft client; @Shadow @Final diff --git a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java index ebe07df1..760409ea 100644 --- a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java @@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.mojang.blaze3d.systems.RenderSystem; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import net.minecraft.client.gl.VertexBuffer; import net.minecraft.client.render.BackgroundRenderer; import net.minecraft.client.render.BufferBuilder; @@ -25,7 +25,7 @@ import net.minecraft.client.render.VertexFormats; import net.minecraft.client.render.WorldRenderer; import net.minecraft.client.texture.TextureManager; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.math.Quaternion; @@ -63,7 +63,7 @@ public class WorldRendererMixin { @Shadow @Final - private MinecraftClient client; + private Minecraft client; @Shadow @Final @@ -76,7 +76,7 @@ public class WorldRendererMixin { private int ticks; @Inject(method = "*", at = @At("TAIL")) - private void be_onInit(MinecraftClient client, BufferBuilderStorage bufferBuilders, CallbackInfo info) { + private void be_onInit(Minecraft client, BufferBuilderStorage bufferBuilders, CallbackInfo info) { be_initStars(); Random random = new Random(131); axis1 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); diff --git a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java index 2b4c380e..9f393acc 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java @@ -14,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.world.level.block.AnvilBlock; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.PlayerInventory; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.RecipeManager; @@ -60,14 +60,14 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler imple public abstract void updateResult(); @Inject(method = "canTakeOutput", at = @At("HEAD"), cancellable = true) - protected void be_canTakeOutput(PlayerEntity player, boolean present, CallbackInfoReturnable info) { + protected void be_canTakeOutput(Player player, boolean present, CallbackInfoReturnable info) { if (be_currentRecipe != null) { info.setReturnValue(be_currentRecipe.checkHammerDurability(input, player)); } } @Inject(method = "onTakeOutput", at = @At("HEAD"), cancellable = true) - protected void be_onTakeOutput(PlayerEntity player, ItemStack stack, CallbackInfoReturnable info) { + protected void be_onTakeOutput(Player player, ItemStack stack, CallbackInfoReturnable info) { if (be_currentRecipe != null) { this.input.getStack(0).decrement(be_currentRecipe.getInputCount()); stack = be_currentRecipe.craft(input, player); @@ -120,7 +120,7 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler imple } @Override - public boolean onButtonClick(PlayerEntity player, int id) { + public boolean onButtonClick(Player player, int id) { if (id == 0) { this.be_previousRecipe(); return true; diff --git a/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java b/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java index 08accbe8..3f55c6ef 100644 --- a/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java @@ -7,8 +7,8 @@ import org.spongepowered.asm.mixin.gen.Accessor; import com.google.common.collect.Multimap; -import net.minecraft.world.entity.attribute.EntityAttribute; -import net.minecraft.world.entity.attribute.EntityAttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.item.ArmorItem; @Mixin(ArmorItem.class) @@ -17,8 +17,8 @@ public interface ArmorItemAccessor { UUID[] be_getModifiers(); @Accessor("attributeModifiers") - Multimap be_getAttributeModifiers(); + Multimap be_getAttributeModifiers(); @Accessor("attributeModifiers") - void be_setAttributeModifiers(Multimap attributeModifiers); + void be_setAttributeModifiers(Multimap attributeModifiers); } diff --git a/src/main/java/ru/betterend/mixin/common/BiomeArrayMixin.java b/src/main/java/ru/betterend/mixin/common/BiomeArrayMixin.java index 5ac2ad3d..409ca5b6 100644 --- a/src/main/java/ru/betterend/mixin/common/BiomeArrayMixin.java +++ b/src/main/java/ru/betterend/mixin/common/BiomeArrayMixin.java @@ -6,7 +6,7 @@ import org.spongepowered.asm.mixin.Shadow; import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; -import net.minecraft.world.biome.Biome; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.biome.source.BiomeArray; import ru.betterend.interfaces.IBiomeArray; diff --git a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java index fa990422..0eff76c9 100644 --- a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java +++ b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java @@ -17,7 +17,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.Level; -import net.minecraft.world.biome.Biome.Category; +import net.minecraft.world.level.biome.Biome.Category; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; diff --git a/src/main/java/ru/betterend/mixin/common/BrewingAccessor.java b/src/main/java/ru/betterend/mixin/common/BrewingAccessor.java index 3c46279d..b198c6c1 100644 --- a/src/main/java/ru/betterend/mixin/common/BrewingAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/BrewingAccessor.java @@ -4,7 +4,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; import net.minecraft.world.item.Item; -import net.minecraft.potion.Potion; +import net.minecraft.world.item.alchemy.Potion; import net.minecraft.world.item.crafting.BrewingRecipeRegistry; @Mixin(BrewingRecipeRegistry.class) diff --git a/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java index e55d6160..7c1e2638 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java @@ -12,10 +12,10 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.ChorusFlowerBlock; import net.minecraft.world.level.block.ConnectingBlock; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.ChorusPlantFeature; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.ChorusPlantFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; @@ -24,8 +24,8 @@ import ru.betterend.world.generator.GeneratorOptions; @Mixin(ChorusPlantFeature.class) public class ChorusPlantFeatureMixin { @Inject(method = "generate", at = @At("HEAD"), cancellable = true) - private void be_onGenerate(StructureWorldAccess structureWorldAccess, ChunkGenerator chunkGenerator, Random random, - BlockPos blockPos, DefaultFeatureConfig defaultFeatureConfig, CallbackInfoReturnable info) { + private void be_onGenerate(WorldGenLevel structureWorldAccess, ChunkGenerator chunkGenerator, Random random, + BlockPos blockPos, NoneFeatureConfiguration defaultFeatureConfig, CallbackInfoReturnable info) { if (structureWorldAccess.isAir(blockPos) && structureWorldAccess.getBlockState(blockPos.below()).is(EndBlocks.CHORUS_NYLIUM)) { ChorusFlowerBlock.generate(structureWorldAccess, blockPos, random, MHelper.randRange(8, 16, random)); diff --git a/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java b/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java index d2931d21..bf506f0c 100644 --- a/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java @@ -4,12 +4,12 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; import net.minecraft.world.level.block.ComposterBlock; -import net.minecraft.world.item.ItemConvertible; +import net.minecraft.world.level.ItemLike; @Mixin(ComposterBlock.class) public interface ComposterBlockAccessor { @Invoker - static void callRegisterCompostableItem(float levelIncreaseChance, ItemConvertible item) { + static void callRegisterCompostableItem(float levelIncreaseChance, ItemLike item) { throw new AssertionError("@Invoker dummy body called"); } } diff --git a/src/main/java/ru/betterend/mixin/common/CraftingScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/CraftingScreenHandlerMixin.java index ec38ae5e..426ca0c4 100644 --- a/src/main/java/ru/betterend/mixin/common/CraftingScreenHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/CraftingScreenHandlerMixin.java @@ -8,7 +8,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.world.level.block.CraftingTableBlock; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.screen.CraftingScreenHandler; import net.minecraft.screen.ScreenHandlerContext; @@ -19,7 +19,7 @@ public abstract class CraftingScreenHandlerMixin { private ScreenHandlerContext context; @Inject(method = "canUse", at = @At("HEAD"), cancellable = true) - private void be_canUse(PlayerEntity player, CallbackInfoReturnable info) { + private void be_canUse(Player player, CallbackInfoReturnable info) { if (context.run((world, pos) -> { return world.getBlockState(pos).getBlock() instanceof CraftingTableBlock; }, true)) { diff --git a/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java b/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java index 618d38c8..8a974c38 100644 --- a/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java +++ b/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java @@ -6,9 +6,9 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.core.Registry; -import net.minecraft.world.biome.Biome; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.dimension.DimensionType; -import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraft.world.gen.chunk.NoiseChunkGenerator; import ru.betterend.world.generator.BetterEndBiomeSource; diff --git a/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java index 0e4629d6..6faa563f 100644 --- a/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java @@ -7,35 +7,35 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.biome.Biome; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.biome.source.BiomeSource; import net.minecraft.world.gen.ChunkRandom; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.EndCityFeature; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.EndCityFeature; import ru.betterend.world.generator.GeneratorOptions; @Mixin(EndCityFeature.class) public class EndCityFeatureMixin { @Inject(method = "shouldStartAt", at = @At("HEAD"), cancellable = true) - private void be_shouldStartAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long l, ChunkRandom chunkRandom, int i, int j, Biome biome, ChunkPos chunkPos, DefaultFeatureConfig defaultFeatureConfig, CallbackInfoReturnable info) { + private void be_shouldStartAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long l, + ChunkRandom chunkRandom, int i, int j, Biome biome, ChunkPos chunkPos, + NoneFeatureConfiguration defaultFeatureConfig, CallbackInfoReturnable info) { if (GeneratorOptions.useNewGenerator()) { int chance = GeneratorOptions.getEndCityFailChance(); if (chance == 0) { info.setReturnValue(getGenerationHeight(i, j, chunkGenerator) >= 60); info.cancel(); - } - else if (chunkRandom.nextInt(chance) == 0){ + } else if (chunkRandom.nextInt(chance) == 0) { info.setReturnValue(getGenerationHeight(i, j, chunkGenerator) >= 60); info.cancel(); - } - else { + } else { info.setReturnValue(false); info.cancel(); } } } - + @Shadow private static int getGenerationHeight(int chunkX, int chunkZ, ChunkGenerator chunkGenerator) { return 0; diff --git a/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java index 3d4b0f51..851439bd 100644 --- a/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java @@ -15,10 +15,10 @@ import net.minecraft.structure.Structure; import net.minecraft.structure.StructurePlacementData; import net.minecraft.core.BlockPos; import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.EndPortalFeature; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.EndPortalFeature; import ru.betterend.BetterEnd; import ru.betterend.util.StructureHelper; import ru.betterend.util.WorldDataUtil; @@ -31,8 +31,8 @@ public class EndPortalFeatureMixin { private boolean open; @Inject(method = "generate", at = @At("HEAD"), cancellable = true) - private void bePortalGenerate(StructureWorldAccess world, ChunkGenerator generator, Random random, - BlockPos blockPos, DefaultFeatureConfig config, CallbackInfoReturnable info) { + private void bePortalGenerate(WorldGenLevel world, ChunkGenerator generator, Random random, BlockPos blockPos, + NoneFeatureConfiguration config, CallbackInfoReturnable info) { if (!GeneratorOptions.hasPortal()) { info.setReturnValue(false); info.cancel(); @@ -49,11 +49,11 @@ public class EndPortalFeatureMixin { } @ModifyVariable(method = "generate", ordinal = 0, at = @At("HEAD")) - private BlockPos be_setPosOnGround(BlockPos blockPos, StructureWorldAccess world) { + private BlockPos be_setPosOnGround(BlockPos blockPos, WorldGenLevel world) { return be_updatePos(blockPos, world); } - private BlockPos be_updatePos(BlockPos blockPos, StructureWorldAccess world) { + private BlockPos be_updatePos(BlockPos blockPos, WorldGenLevel world) { if (GeneratorOptions.useNewGenerator()) { BlockPos pos = GeneratorOptions.getPortalPos(); if (pos.equals(BlockPos.ORIGIN)) { diff --git a/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java index 579fc164..592906c2 100644 --- a/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java @@ -20,11 +20,11 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.util.Mth; import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.ServerWorldAccess; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.EndSpikeFeature; -import net.minecraft.world.gen.feature.EndSpikeFeatureConfig; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.EndSpikeFeature; +import net.minecraft.world.level.levelgen.feature.EndSpikeFeatureConfig; import ru.betterend.BetterEnd; import ru.betterend.util.BlocksHelper; import ru.betterend.util.StructureHelper; @@ -34,16 +34,15 @@ import ru.betterend.world.generator.GeneratorOptions; @Mixin(EndSpikeFeature.class) public class EndSpikeFeatureMixin { @Inject(method = "generate", at = @At("HEAD"), cancellable = true) - private void beSpikeGenerate(StructureWorldAccess structureWorldAccess, ChunkGenerator chunkGenerator, - Random random, BlockPos blockPos, EndSpikeFeatureConfig endSpikeFeatureConfig, - CallbackInfoReturnable info) { + private void beSpikeGenerate(WorldGenLevel structureWorldAccess, ChunkGenerator chunkGenerator, Random random, + BlockPos blockPos, EndSpikeFeatureConfig endSpikeFeatureConfig, CallbackInfoReturnable info) { if (!GeneratorOptions.hasPillars()) { info.setReturnValue(false); } } @Inject(method = "generateSpike", at = @At("HEAD"), cancellable = true) - private void be_generateSpike(ServerWorldAccess world, Random random, EndSpikeFeatureConfig config, + private void be_generateSpike(ServerLevelAccessor world, Random random, EndSpikeFeatureConfig config, EndSpikeFeature.Spike spike, CallbackInfo info) { int x = spike.getCenterX(); int z = spike.getCenterZ(); diff --git a/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java b/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java index 8cef9161..6656836e 100644 --- a/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java @@ -8,16 +8,16 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.mob.EndermanEntity; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import ru.betterend.effects.EndEnchantments; -import ru.betterend.effects.EndStatusEffects; +import ru.betterend.effects.EndMobEffects; @Mixin(EndermanEntity.class) public abstract class EndermanEntityMixin { @Inject(method = "isPlayerStaring", at = @At("HEAD"), cancellable = true) - private void be_isPlayerStaring(PlayerEntity player, CallbackInfoReturnable info) { - if (player.isCreative() || player.hasStatusEffect(EndStatusEffects.END_VEIL) || EnchantmentHelper + private void be_isPlayerStaring(Player player, CallbackInfoReturnable info) { + if (player.isCreative() || player.hasMobEffect(EndMobEffects.END_VEIL) || EnchantmentHelper .getLevel(EndEnchantments.END_VEIL, player.getEquippedStack(EquipmentSlot.HEAD)) > 0) { info.setReturnValue(false); } diff --git a/src/main/java/ru/betterend/mixin/common/EntityMixin.java b/src/main/java/ru/betterend/mixin/common/EntityMixin.java index 3a5f1047..980b9750 100644 --- a/src/main/java/ru/betterend/mixin/common/EntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EntityMixin.java @@ -81,7 +81,7 @@ public abstract class EntityMixin implements TeleportingEntity { @Override public void beSetExitPos(BlockPos pos) { - this.exitPos = pos.toImmutable(); + this.exitPos = pos.immutable(); } @Override diff --git a/src/main/java/ru/betterend/mixin/common/GenerationSettingsAccessor.java b/src/main/java/ru/betterend/mixin/common/GenerationSettingsAccessor.java index 07ba1b66..1e139594 100644 --- a/src/main/java/ru/betterend/mixin/common/GenerationSettingsAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/GenerationSettingsAccessor.java @@ -7,20 +7,20 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; import net.minecraft.world.biome.GenerationSettings; -import net.minecraft.world.gen.feature.ConfiguredFeature; -import net.minecraft.world.gen.feature.ConfiguredStructureFeature; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; @Mixin(GenerationSettings.class) public interface GenerationSettingsAccessor { @Accessor("features") List>>> beGetFeatures(); - + @Accessor("features") void beSetFeatures(List>>> features); - + @Accessor("structureFeatures") List>> beGetStructures(); - + @Accessor("structureFeatures") void beSetStructures(List>> structures); } diff --git a/src/main/java/ru/betterend/mixin/common/HostileEntityMixin.java b/src/main/java/ru/betterend/mixin/common/HostileEntityMixin.java index 04ab3397..2251e0dd 100644 --- a/src/main/java/ru/betterend/mixin/common/HostileEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/HostileEntityMixin.java @@ -14,13 +14,14 @@ import net.minecraft.world.entity.mob.EndermanEntity; import net.minecraft.world.entity.mob.HostileEntity; import net.minecraft.core.BlockPos; import net.minecraft.util.math.Box; -import net.minecraft.world.ServerWorldAccess; +import net.minecraft.world.level.ServerLevelAccessor; @Mixin(HostileEntity.class) public class HostileEntityMixin { @Inject(method = "canSpawnInDark", at = @At(value = "RETURN"), cancellable = true) - private static void be_endermenCheck(EntityType type, ServerWorldAccess serverWorldAccess, - SpawnReason spawnReason, BlockPos pos, Random random, CallbackInfoReturnable info) { + private static void be_endermenCheck(EntityType type, + ServerLevelAccessor serverWorldAccess, SpawnReason spawnReason, BlockPos pos, Random random, + CallbackInfoReturnable info) { boolean canSpawn = info.getReturnValue(); if (canSpawn && spawnReason == SpawnReason.NATURAL && type == EntityType.ENDERMAN) { Box box = new Box(pos).expand(16); diff --git a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java index 58e071f2..d6a23643 100644 --- a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java @@ -2,6 +2,8 @@ package ru.betterend.mixin.common; import java.util.Collection; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.ai.attributes.Attributes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -11,9 +13,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.attribute.EntityAttributeModifier; -import net.minecraft.world.entity.attribute.EntityAttributes; -import net.minecraft.world.entity.damage.DamageSource; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.item.Item; @Mixin(LivingEntity.class) @@ -21,16 +21,16 @@ public abstract class LivingEntityMixin { private Entity lastAttacker; - @Inject(method = "damage", at = @At("HEAD")) + @Inject(method = "hurt", at = @At("HEAD")) public void be_damage(DamageSource source, float amount, CallbackInfoReturnable info) { - this.lastAttacker = source.getAttacker(); + this.lastAttacker = source.getEntity(); } - @ModifyArg(method = "damage", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;takeKnockback(FDD)V")) + @ModifyArg(method = "hurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;knockback(FDD)V")) private float be_increaseKnockback(float value, double x, double z) { if (lastAttacker != null && lastAttacker instanceof LivingEntity) { LivingEntity attacker = (LivingEntity) lastAttacker; - value += this.be_getKnockback(attacker.getMainHandStack().getItem()); + value += this.be_getKnockback(attacker.getMainHandItem().getItem()); } return value; } @@ -38,10 +38,10 @@ public abstract class LivingEntityMixin { private double be_getKnockback(Item tool) { if (tool == null) return 0.0D; - Collection modifiers = tool.getAttributeModifiers(EquipmentSlot.MAINHAND) - .get(EntityAttributes.GENERIC_ATTACK_KNOCKBACK); + Collection modifiers = tool.getDefaultAttributeModifiers(EquipmentSlot.MAINHAND) + .get(Attributes.ATTACK_KNOCKBACK); if (modifiers.size() > 0) { - return modifiers.iterator().next().getValue(); + return modifiers.iterator().next().getAmount(); } return 0.0D; } diff --git a/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java b/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java index 3bdf2c65..7b7fbef6 100644 --- a/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java @@ -18,7 +18,7 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.PlayerManager; import net.minecraft.server.WorldGenerationProgressListener; import net.minecraft.server.level.ServerLevel; -import net.minecraft.util.registry.RegistryKey; +import net.minecraft.resources.ResourceKey; import net.minecraft.world.SaveProperties; import net.minecraft.world.level.Level; import net.minecraft.world.level.ServerWorldProperties; @@ -33,7 +33,7 @@ public class MinecraftServerMixin { @Final @Shadow - private Map, ServerLevel> worlds; + private Map, ServerLevel> worlds; @Final @Shadow diff --git a/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java b/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java index 375d706d..20934b4b 100644 --- a/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java +++ b/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java @@ -10,7 +10,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.minecraft.world.biome.source.BiomeSource; -import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraft.world.gen.chunk.NoiseChunkGenerator; import net.minecraft.world.gen.chunk.StructuresConfig; @@ -22,24 +22,26 @@ public abstract class NoiseChunkGeneratorMixin extends ChunkGenerator { @Final @Shadow protected Supplier settings; - - public NoiseChunkGeneratorMixin(BiomeSource populationSource, BiomeSource biomeSource, StructuresConfig structuresConfig, long worldSeed) { + + public NoiseChunkGeneratorMixin(BiomeSource populationSource, BiomeSource biomeSource, + StructuresConfig structuresConfig, long worldSeed) { super(populationSource, biomeSource, structuresConfig, worldSeed); } - + @Inject(method = "(Lnet/minecraft/world/biome/source/BiomeSource;Lnet/minecraft/world/biome/source/BiomeSource;JLjava/util/function/Supplier;)V", at = @At("TAIL")) - private void beOnInit(BiomeSource populationSource, BiomeSource biomeSource, long seed, Supplier settings, CallbackInfo info) { + private void beOnInit(BiomeSource populationSource, BiomeSource biomeSource, long seed, + Supplier settings, CallbackInfo info) { TerrainGenerator.initNoise(seed); } - + @Inject(method = "sampleNoiseColumn([DII)V", at = @At("HEAD"), cancellable = true, allow = 2) private void beSampleNoiseColumn(double[] buffer, int x, int z, CallbackInfo info) { if (GeneratorOptions.useNewGenerator() && settings.get().equals(ChunkGeneratorSettings.END)) { - //System.out.println(TerrainGenerator.canGenerate(x, z)); - //if (TerrainGenerator.canGenerate(x, z)) { - TerrainGenerator.fillTerrainDensity(buffer, x, z, getBiomeSource()); - info.cancel(); - //} + // System.out.println(TerrainGenerator.canGenerate(x, z)); + // if (TerrainGenerator.canGenerate(x, z)) { + TerrainGenerator.fillTerrainDensity(buffer, x, z, getBiomeSource()); + info.cancel(); + // } } } } diff --git a/src/main/java/ru/betterend/mixin/common/PlayerEntityMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerEntityMixin.java index af378145..3363b548 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerEntityMixin.java @@ -8,7 +8,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.server.level.ServerLevel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -19,7 +19,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; -@Mixin(PlayerEntity.class) +@Mixin(Player.class) public abstract class PlayerEntityMixin { private static Direction[] HORIZONTAL; diff --git a/src/main/java/ru/betterend/mixin/common/PlayerManagerMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerManagerMixin.java index ed21cf4a..18482905 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerManagerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerManagerMixin.java @@ -21,7 +21,7 @@ import com.mojang.serialization.Dynamic; import io.netty.buffer.Unpooled; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.effect.StatusEffectInstance; +import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.Tag; @@ -31,7 +31,7 @@ import net.minecraft.network.Packet; import net.minecraft.network.PacketByteBuf; import net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket; import net.minecraft.network.packet.s2c.play.DifficultyS2CPacket; -import net.minecraft.network.packet.s2c.play.EntityStatusEffectS2CPacket; +import net.minecraft.network.packet.s2c.play.EntityMobEffectS2CPacket; import net.minecraft.network.packet.s2c.play.GameJoinS2CPacket; import net.minecraft.network.packet.s2c.play.HeldItemChangeS2CPacket; import net.minecraft.network.packet.s2c.play.PlayerAbilitiesS2CPacket; @@ -50,7 +50,7 @@ import net.minecraft.util.Formatting; import net.minecraft.util.UserCache; import net.minecraft.util.Util; import net.minecraft.util.registry.DynamicRegistryManager; -import net.minecraft.util.registry.RegistryKey; +import net.minecraft.resources.ResourceKey; import net.minecraft.world.GameRules; import net.minecraft.world.level.Level; import net.minecraft.world.WorldProperties; @@ -92,18 +92,18 @@ public class PlayerManagerMixin { String string = gameProfile2 == null ? gameProfile.getName() : gameProfile2.getName(); userCache.add(gameProfile); CompoundTag compoundTag = this.loadPlayerData(player); - RegistryKey var23; + ResourceKey var23; if (compoundTag != null) { - DataResult> var10000 = DimensionType + DataResult> var10000 = DimensionType .method_28521(new Dynamic(NbtOps.INSTANCE, compoundTag.get("Dimension"))); Logger var10001 = LOGGER; var10001.getClass(); - var23 = (RegistryKey) var10000.resultOrPartial(var10001::error).orElse(Level.END); + var23 = (ResourceKey) var10000.resultOrPartial(var10001::error).orElse(Level.END); } else { var23 = Level.END; } - RegistryKey registryKey = var23; + ResourceKey registryKey = var23; ServerLevel serverWorld = this.server.getLevel(registryKey); ServerLevel serverWorld3; if (serverWorld == null) { @@ -178,12 +178,12 @@ public class PlayerManagerMixin { player.sendResourcePackUrl(this.server.getResourcePackUrl(), this.server.getResourcePackHash()); } - Iterator var24 = player.getStatusEffects().iterator(); + Iterator var24 = player.getMobEffects().iterator(); while (var24.hasNext()) { - StatusEffectInstance statusEffectInstance = (StatusEffectInstance) var24.next(); + MobEffectInstance statusEffectInstance = (MobEffectInstance) var24.next(); serverPlayNetworkHandler - .sendPacket(new EntityStatusEffectS2CPacket(player.getEntityId(), statusEffectInstance)); + .sendPacket(new EntityMobEffectS2CPacket(player.getEntityId(), statusEffectInstance)); } if (compoundTag != null && compoundTag.contains("RootVehicle", 10)) { diff --git a/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java b/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java index 9c95d85e..f592d94d 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java @@ -11,10 +11,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.mojang.authlib.GameProfile; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.effect.StatusEffectInstance; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.player.Player; import net.minecraft.network.packet.s2c.play.DifficultyS2CPacket; -import net.minecraft.network.packet.s2c.play.EntityStatusEffectS2CPacket; +import net.minecraft.network.packet.s2c.play.EntityMobEffectS2CPacket; import net.minecraft.network.packet.s2c.play.PlayerAbilitiesS2CPacket; import net.minecraft.network.packet.s2c.play.PlayerRespawnS2CPacket; import net.minecraft.network.packet.s2c.play.WorldEventS2CPacket; @@ -34,7 +34,7 @@ import ru.betterend.interfaces.TeleportingEntity; import ru.betterend.world.generator.GeneratorOptions; @Mixin(ServerPlayer.class) -public abstract class ServerPlayerEntityMixin extends PlayerEntity implements TeleportingEntity { +public abstract class ServerPlayerEntityMixin extends Player implements TeleportingEntity { @Shadow public ServerPlayNetworkHandler networkHandler; @@ -108,9 +108,8 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntity implements Te playerManager.sendWorldInfo(player, destination); playerManager.sendPlayerStatus(player); - for (StatusEffectInstance statusEffectInstance : this.getStatusEffects()) { - this.networkHandler - .sendPacket(new EntityStatusEffectS2CPacket(getEntityId(), statusEffectInstance)); + for (MobEffectInstance statusEffectInstance : this.getMobEffects()) { + this.networkHandler.sendPacket(new EntityMobEffectS2CPacket(getEntityId(), statusEffectInstance)); } this.networkHandler.sendPacket(new WorldEventS2CPacket(1032, BlockPos.ORIGIN, 0, false)); @@ -135,7 +134,7 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntity implements Te @Override public void beSetExitPos(BlockPos pos) { - this.exitPos = pos.toImmutable(); + this.exitPos = pos.immutable(); } @Override diff --git a/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java b/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java index 5ca3794c..944990c0 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java @@ -19,11 +19,11 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.WorldGenerationProgressListener; import net.minecraft.server.level.ServerLevel; import net.minecraft.core.BlockPos; -import net.minecraft.util.registry.RegistryKey; +import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.Level; import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.gen.Spawner; -import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.ServerWorldProperties; import net.minecraft.world.level.storage.LevelStorage; import ru.betterend.BetterEnd; @@ -39,7 +39,7 @@ public class ServerWorldMixin { @Inject(method = "*", at = @At("TAIL")) private void be_onServerWorldInit(MinecraftServer server, Executor workerExecutor, LevelStorage.Session session, - ServerWorldProperties properties, RegistryKey registryKey, DimensionType dimensionType, + ServerWorldProperties properties, ResourceKey registryKey, DimensionType dimensionType, WorldGenerationProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, boolean debugWorld, long l, List list, boolean bl, CallbackInfo info) { if (lastWorld != null && lastWorld.equals(session.getDirectoryName())) { diff --git a/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerMixin.java b/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerMixin.java index ecfe1b63..f8f3830e 100644 --- a/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerMixin.java @@ -11,28 +11,29 @@ import com.google.common.collect.Lists; import net.fabricmc.fabric.impl.biome.InternalBiomeData; import net.fabricmc.fabric.impl.biome.WeightedBiomePicker; -import net.minecraft.util.registry.RegistryKey; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.BiomeKeys; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Biomes; import ru.betterend.interfaces.IBiomeList; @Mixin(value = WeightedBiomePicker.class, remap = false) public class WeightedBiomePickerMixin implements IBiomeList { - private List> biomes = Lists.newArrayList(); - + private List> biomes = Lists.newArrayList(); + @Inject(method = "addBiome", at = @At("TAIL")) - private void be_addBiome(final RegistryKey biome, final double weight, CallbackInfo info) { + private void be_addBiome(final ResourceKey biome, final double weight, CallbackInfo info) { if (be_isCorrectPicker((WeightedBiomePicker) (Object) this)) { biomes.add(biome); } } - + @Override - public List> getBiomes() { + public List> getBiomes() { return biomes; } - + private boolean be_isCorrectPicker(WeightedBiomePicker picker) { - return picker == InternalBiomeData.getEndBiomesMap().get(BiomeKeys.SMALL_END_ISLANDS) || picker == InternalBiomeData.getEndBarrensMap().get(BiomeKeys.END_BARRENS); + return picker == InternalBiomeData.getEndBiomesMap().get(Biomes.SMALL_END_ISLANDS) + || picker == InternalBiomeData.getEndBarrensMap().get(Biomes.END_BARRENS); } } diff --git a/src/main/java/ru/betterend/patterns/Patterns.java b/src/main/java/ru/betterend/patterns/Patterns.java index eba3e869..d4f5b7da 100644 --- a/src/main/java/ru/betterend/patterns/Patterns.java +++ b/src/main/java/ru/betterend/patterns/Patterns.java @@ -11,7 +11,7 @@ import java.util.stream.Collectors; import com.google.common.collect.Maps; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import net.minecraft.resource.ResourceManager; import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; @@ -145,7 +145,7 @@ public class Patterns { } public static String createJson(ResourceLocation patternId, String parent, String block) { - ResourceManager resourceManager = MinecraftClient.getInstance().getResourceManager(); + ResourceManager resourceManager = Minecraft.getInstance().getResourceManager(); try (InputStream input = resourceManager.getResource(patternId).getInputStream()) { return createJson(new InputStreamReader(input, StandardCharsets.UTF_8), parent, block); } catch (Exception ex) { @@ -160,7 +160,7 @@ public class Patterns { } public static String createJson(ResourceLocation patternId, Map textures) { - ResourceManager resourceManager = MinecraftClient.getInstance().getResourceManager(); + ResourceManager resourceManager = Minecraft.getInstance().getResourceManager(); try (InputStream input = resourceManager.getResource(patternId).getInputStream()) { String json = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8)).lines() .collect(Collectors.joining()); diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index bee10313..841be2e2 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -6,7 +6,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.potion.PotionUtil; -import net.minecraft.potion.Potions; +import net.minecraft.world.item.alchemy.Potions; import ru.betterend.BetterEnd; import ru.betterend.item.GuideBookItem; import ru.betterend.recipe.builders.GridRecipe; diff --git a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java index 69874cb2..fc5876a1 100644 --- a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java @@ -7,7 +7,7 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.inventory.Inventory; import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemConvertible; +import net.minecraft.world.level.ItemLike; import net.minecraft.world.item.ItemStack; import net.minecraft.network.PacketByteBuf; import net.minecraft.world.item.crafting.Ingredient; @@ -157,16 +157,16 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { return this; } - public Builder setPrimaryInput(ItemConvertible... inputs) { - for (ItemConvertible item : inputs) { + public Builder setPrimaryInput(ItemLike... inputs) { + for (ItemLike item : inputs) { this.alright &= RecipeHelper.exists(item); } this.primaryInput = Ingredient.of(inputs); return this; } - public Builder setSecondaryInput(ItemConvertible... inputs) { - for (ItemConvertible item : inputs) { + public Builder setSecondaryInput(ItemLike... inputs) { + for (ItemLike item : inputs) { this.alright &= RecipeHelper.exists(item); } this.secondaryInput = Ingredient.of(inputs); @@ -183,7 +183,7 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { return this; } - public Builder setInput(ItemConvertible primaryInput, ItemConvertible secondaryInput) { + public Builder setInput(ItemLike primaryInput, ItemLike secondaryInput) { this.setPrimaryInput(primaryInput); this.setSecondaryInput(secondaryInput); return this; @@ -195,7 +195,7 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { return this; } - public Builder setOutput(ItemConvertible output, int amount) { + public Builder setOutput(ItemLike output, int amount) { this.alright &= RecipeHelper.exists(output); this.output = new ItemStack(output, amount); return this; diff --git a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java index f46d27fe..498d55f5 100644 --- a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java @@ -6,12 +6,12 @@ import com.google.gson.JsonObject; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.inventory.Inventory; import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemConvertible; +import net.minecraft.world.level.ItemLike; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.ToolItem; +import net.minecraft.world.item.TieredItem; import net.minecraft.network.PacketByteBuf; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Recipe; @@ -76,7 +76,7 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { return this.output.copy(); } - public ItemStack craft(Inventory craftingInventory, PlayerEntity player) { + public ItemStack craft(Inventory craftingInventory, Player player) { if (!player.isCreative()) { if (!checkHammerDurability(craftingInventory, player)) return ItemStack.EMPTY; @@ -86,7 +86,7 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { return this.craft(craftingInventory); } - public boolean checkHammerDurability(Inventory craftingInventory, PlayerEntity player) { + public boolean checkHammerDurability(Inventory craftingInventory, Player player) { if (player.isCreative()) return true; ItemStack hammer = craftingInventory.getStack(1); @@ -101,7 +101,7 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { } ItemStack material = craftingInventory.getStack(0); int materialCount = material.getCount(); - int level = ((ToolItem) hammer.getItem()).getTier().getLevel(); + int level = ((TieredItem) hammer.getItem()).getTier().getLevel(); return this.input.test(craftingInventory.getStack(0)) && materialCount >= this.inputCount && level >= this.toolLevel; } @@ -122,7 +122,7 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { public DefaultedList getPreviewInputs() { DefaultedList defaultedList = DefaultedList.of(); defaultedList.add(Ingredient.ofStacks(EndTags.HAMMERS.values().stream() - .filter(hammer -> ((ToolItem) hammer).getTier().getLevel() >= toolLevel).map(ItemStack::new))); + .filter(hammer -> ((TieredItem) hammer).getTier().getLevel() >= toolLevel).map(ItemStack::new))); defaultedList.add(input); return defaultedList; @@ -202,7 +202,7 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { private Builder() { } - public Builder setInput(ItemConvertible... inputItems) { + public Builder setInput(ItemLike... inputItems) { this.alright &= RecipeHelper.exists(inputItems); this.setInput(Ingredient.of(inputItems)); return this; @@ -223,11 +223,11 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { return this; } - public Builder setOutput(ItemConvertible output) { + public Builder setOutput(ItemLike output) { return this.setOutput(output, 1); } - public Builder setOutput(ItemConvertible output, int amount) { + public Builder setOutput(ItemLike output, int amount) { this.alright &= RecipeHelper.exists(output); this.output = new ItemStack(output, amount); return this; diff --git a/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java b/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java index cdf09e24..928a533e 100644 --- a/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java @@ -1,6 +1,6 @@ package ru.betterend.recipe.builders; -import net.minecraft.world.item.ItemConvertible; +import net.minecraft.world.level.ItemLike; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.BlastingRecipe; import net.minecraft.world.item.crafting.CampfireCookingRecipe; @@ -17,8 +17,8 @@ import ru.betterend.util.RecipeHelper; public class FurnaceRecipe { private static final FurnaceRecipe INSTANCE = new FurnaceRecipe(); - private ItemConvertible input; - private ItemConvertible output; + private ItemLike input; + private ItemLike output; private boolean exist; private String group; private String name; @@ -29,7 +29,7 @@ public class FurnaceRecipe { private FurnaceRecipe() { } - public static FurnaceRecipe make(String name, ItemConvertible input, ItemConvertible output) { + public static FurnaceRecipe make(String name, ItemLike input, ItemLike output) { INSTANCE.name = name; INSTANCE.group = ""; INSTANCE.input = input; diff --git a/src/main/java/ru/betterend/recipe/builders/GridRecipe.java b/src/main/java/ru/betterend/recipe/builders/GridRecipe.java index c51f2090..d3991074 100644 --- a/src/main/java/ru/betterend/recipe/builders/GridRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/GridRecipe.java @@ -6,7 +6,7 @@ import java.util.Map; import com.google.common.collect.Maps; import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemConvertible; +import net.minecraft.world.level.ItemLike; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.CraftingRecipe; import net.minecraft.world.item.crafting.Ingredient; @@ -25,7 +25,7 @@ public class GridRecipe { private static final GridRecipe INSTANCE = new GridRecipe(); private String name; - private ItemConvertible output; + private ItemLike output; private String group; private RecipeType type; @@ -38,7 +38,7 @@ public class GridRecipe { private GridRecipe() { } - public static GridRecipe make(String name, ItemConvertible output) { + public static GridRecipe make(String name, ItemLike output) { INSTANCE.name = name; INSTANCE.output = output; @@ -78,8 +78,8 @@ public class GridRecipe { return addMaterial(key, Ingredient.ofStacks(Arrays.stream(value))); } - public GridRecipe addMaterial(char key, ItemConvertible... values) { - for (ItemConvertible item : values) { + public GridRecipe addMaterial(char key, ItemLike... values) { + for (ItemLike item : values) { exist &= RecipeHelper.exists(item); } return addMaterial(key, Ingredient.of(values)); diff --git a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java index 079c0b07..8864b200 100644 --- a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java @@ -6,7 +6,7 @@ import com.google.gson.JsonObject; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.world.item.ItemConvertible; +import net.minecraft.world.level.ItemLike; import net.minecraft.world.item.ItemStack; import net.minecraft.network.PacketByteBuf; import net.minecraft.world.item.crafting.Ingredient; @@ -146,12 +146,12 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { return this; } - public Builder setInput(ItemConvertible input) { + public Builder setInput(ItemLike input) { this.input = Ingredient.of(input); return this; } - public Builder setOutput(ItemConvertible output) { + public Builder setOutput(ItemLike output) { this.output = new ItemStack(output); this.output.setCount(1); return this; @@ -168,7 +168,7 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { return this; } - public Builder addCatalyst(int slot, ItemConvertible... items) { + public Builder addCatalyst(int slot, ItemLike... items) { if (slot > 7) return this; this.catalysts[slot] = Ingredient.of(items); diff --git a/src/main/java/ru/betterend/recipe/builders/SmithingTableRecipe.java b/src/main/java/ru/betterend/recipe/builders/SmithingTableRecipe.java index d2172a2c..bed7b508 100644 --- a/src/main/java/ru/betterend/recipe/builders/SmithingTableRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/SmithingTableRecipe.java @@ -1,7 +1,7 @@ package ru.betterend.recipe.builders; import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemConvertible; +import net.minecraft.world.level.ItemLike; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.RecipeType; @@ -41,17 +41,17 @@ public class SmithingTableRecipe { private SmithingTableRecipe() { } - public SmithingTableRecipe setResult(ItemConvertible item) { + public SmithingTableRecipe setResult(ItemLike item) { return this.setResult(item, 1); } - public SmithingTableRecipe setResult(ItemConvertible item, int count) { + public SmithingTableRecipe setResult(ItemLike item, int count) { this.alright &= RecipeHelper.exists(item); this.result = new ItemStack(item, count); return this; } - public SmithingTableRecipe setBase(ItemConvertible... items) { + public SmithingTableRecipe setBase(ItemLike... items) { this.alright &= RecipeHelper.exists(items); this.base = Ingredient.of(items); return this; @@ -62,7 +62,7 @@ public class SmithingTableRecipe { return this; } - public SmithingTableRecipe setAddition(ItemConvertible... items) { + public SmithingTableRecipe setAddition(ItemLike... items) { this.alright &= RecipeHelper.exists(items); this.addition = Ingredient.of(items); return this; diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index 8b133da5..9526810c 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -18,15 +18,14 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.impl.biome.InternalBiomeData; import net.fabricmc.fabric.impl.biome.WeightedBiomePicker; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; +import net.minecraft.data.BuiltinRegistries; +import net.minecraft.resources.ResourceKey; import net.minecraft.server.MinecraftServer; import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.core.Registry; -import net.minecraft.util.registry.RegistryKey; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.Biome.Category; -import net.minecraft.world.biome.BiomeKeys; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Biomes; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; import ru.betterend.integration.Integrations; @@ -75,13 +74,13 @@ public class EndBiomes { private static Registry biomeRegistry; // Vanilla Land - public static final EndBiome END = registerBiome(BiomeKeys.THE_END, BiomeType.LAND, 1F); - public static final EndBiome END_MIDLANDS = registerSubBiome(BiomeKeys.END_MIDLANDS, END, 0.5F); - public static final EndBiome END_HIGHLANDS = registerSubBiome(BiomeKeys.END_HIGHLANDS, END, 0.5F); + public static final EndBiome END = registerBiome(Biomes.THE_END, BiomeType.LAND, 1F); + public static final EndBiome END_MIDLANDS = registerSubBiome(Biomes.END_MIDLANDS, END, 0.5F); + public static final EndBiome END_HIGHLANDS = registerSubBiome(Biomes.END_HIGHLANDS, END, 0.5F); // Vanilla Void - public static final EndBiome END_BARRENS = registerBiome(BiomeKeys.END_BARRENS, BiomeType.VOID, 1F); - public static final EndBiome SMALL_END_ISLANDS = registerBiome(BiomeKeys.SMALL_END_ISLANDS, BiomeType.VOID, 1); + public static final EndBiome END_BARRENS = registerBiome(Biomes.END_BARRENS, BiomeType.VOID, 1F); + public static final EndBiome SMALL_END_ISLANDS = registerBiome(Biomes.SMALL_END_ISLANDS, BiomeType.VOID, 1); // Better End Land public static final EndBiome FOGGY_MUSHROOMLAND = registerBiome(new FoggyMushroomlandBiome(), BiomeType.LAND); @@ -129,8 +128,8 @@ public class EndBiomes { Map configs = Maps.newHashMap(); biomeRegistry.forEach((biome) -> { - if (biome.getCategory() == Category.THEEND) { - ResourceLocation id = biomeRegistry.getId(biome); + if (biome.getBiomeCategory() == Biome.BiomeCategory.THEEND) { + ResourceLocation id = biomeRegistry.getKey(biome); if (Configs.BIOME_CONFIG.getBoolean(id, "enabled", true)) { if (!LAND_BIOMES.containsImmutable(id) && !VOID_BIOMES.containsImmutable(id) && !SUBBIOMES_UNMUTABLES.contains(id)) { @@ -184,22 +183,20 @@ public class EndBiomes { } private static void loadFabricAPIBiomes() { - List> biomes = Lists.newArrayList(); - biomes.addAll(getBiomes(InternalBiomeData.getEndBiomesMap().get(BiomeKeys.SMALL_END_ISLANDS))); - biomes.addAll(getBiomes(InternalBiomeData.getEndBarrensMap().get(BiomeKeys.END_BARRENS))); - biomes.forEach((key) -> FABRIC_VOID.add(key.getValue())); + List> biomes = Lists.newArrayList(); + biomes.addAll(getBiomes(InternalBiomeData.getEndBiomesMap().get(Biomes.SMALL_END_ISLANDS))); + biomes.addAll(getBiomes(InternalBiomeData.getEndBarrensMap().get(Biomes.END_BARRENS))); + biomes.forEach((key) -> FABRIC_VOID.add(key.location())); if (BetterEnd.isDevEnvironment()) { System.out.println("=================================="); System.out.println("Added void biomes from Fabric API:"); - FABRIC_VOID.forEach((id) -> { - System.out.println(id); - }); + FABRIC_VOID.forEach(System.out::println); System.out.println("=================================="); } } - private static List> getBiomes(WeightedBiomePicker picker) { + private static List> getBiomes(WeightedBiomePicker picker) { IBiomeList biomeList = (IBiomeList) (Object) picker; return biomeList == null ? Collections.emptyList() : biomeList.getBiomes(); } @@ -222,7 +219,7 @@ public class EndBiomes { */ public static void initRegistry(MinecraftServer server) { if (biomeRegistry == null) { - biomeRegistry = server.registryAccess().get(Registry.BIOME_KEY); + biomeRegistry = server.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY); } } @@ -250,7 +247,7 @@ public class EndBiomes { * @return registered {@link EndBiome} */ public static EndBiome registerBiome(Biome biome, BiomeType type, float fogDensity, float genChance) { - EndBiome endBiome = new EndBiome(BuiltinRegistries.BIOME.getId(biome), biome, fogDensity, genChance, true); + EndBiome endBiome = new EndBiome(BuiltinRegistries.BIOME.getKey(biome), biome, fogDensity, genChance, true); if (Configs.BIOME_CONFIG.getBoolean(endBiome.getID(), "enabled", true)) { addToPicker(endBiome, type); } @@ -282,7 +279,7 @@ public class EndBiomes { */ public static EndBiome registerSubBiome(Biome biome, EndBiome parent, float fogDensity, float genChance, boolean hasCaves) { - EndBiome endBiome = new EndBiome(BuiltinRegistries.BIOME.getId(biome), biome, fogDensity, genChance, hasCaves); + EndBiome endBiome = new EndBiome(BuiltinRegistries.BIOME.getKey(biome), biome, fogDensity, genChance, hasCaves); if (Configs.BIOME_CONFIG.getBoolean(endBiome.getID(), "enabled", true)) { parent.addSubBiome(endBiome); SUBBIOMES.add(endBiome); @@ -365,11 +362,11 @@ public class EndBiomes { } } - public static EndBiome registerBiome(RegistryKey key, BiomeType type, float genChance) { + public static EndBiome registerBiome(ResourceKey key, BiomeType type, float genChance) { return registerBiome(BuiltinRegistries.BIOME.get(key), type, genChance); } - public static EndBiome registerSubBiome(RegistryKey key, EndBiome parent, float genChance) { + public static EndBiome registerSubBiome(ResourceKey key, EndBiome parent, float genChance) { return registerSubBiome(BuiltinRegistries.BIOME.get(key), parent, genChance, true); } @@ -387,15 +384,15 @@ public class EndBiomes { private static void addLandBiomeToFabricApi(EndBiome biome) { float weight = biome.getGenChanceImmutable(); - RegistryKey key = BuiltinRegistries.BIOME.getKey(biome.getBiome()).get(); - InternalBiomeData.addEndBiomeReplacement(BiomeKeys.END_HIGHLANDS, key, weight); - InternalBiomeData.addEndBiomeReplacement(BiomeKeys.END_MIDLANDS, key, weight); + ResourceKey key = BuiltinRegistries.BIOME.getResourceKey(biome.getBiome()).get(); + InternalBiomeData.addEndBiomeReplacement(Biomes.END_HIGHLANDS, key, weight); + InternalBiomeData.addEndBiomeReplacement(Biomes.END_MIDLANDS, key, weight); } private static void addVoidBiomeToFabricApi(EndBiome biome) { float weight = biome.getGenChanceImmutable(); - RegistryKey key = BuiltinRegistries.BIOME.getKey(biome.getBiome()).get(); - InternalBiomeData.addEndBiomeReplacement(BiomeKeys.SMALL_END_ISLANDS, key, weight); + ResourceKey key = BuiltinRegistries.BIOME.getResourceKey(biome.getBiome()).get(); + InternalBiomeData.addEndBiomeReplacement(Biomes.SMALL_END_ISLANDS, key, weight); } public static EndBiome getFromBiome(Biome biome) { @@ -406,8 +403,9 @@ public class EndBiomes { public static EndBiome getRenderBiome(Biome biome) { EndBiome endBiome = CLIENT.get(biome); if (endBiome == null) { - MinecraftClient minecraft = MinecraftClient.getInstance(); - ResourceLocation id = minecraft.world.registryAccess().get(Registry.BIOME_KEY).getId(biome); + Minecraft minecraft = Minecraft.getInstance(); + ResourceLocation id = minecraft.level.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY) + .getKey(biome); endBiome = id == null ? END : ID_MAP.getOrDefault(id, END); CLIENT.put(biome, endBiome); } @@ -415,7 +413,7 @@ public class EndBiomes { } public static ResourceLocation getBiomeID(Biome biome) { - ResourceLocation id = biomeRegistry.getId(biome); + ResourceLocation id = biomeRegistry.getKey(biome); return id == null ? END.getID() : id; } diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index e4bb5310..b21a480a 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -400,7 +400,7 @@ public class EndBlocks { maxCount = item.getStackSize(); placeOnWater = item.canPlaceOnWater(); } - Properties item = EndItems.makeBlockItemSettings().maxCount(maxCount); + Properties item = EndItems.makeBlockItemSettings().stacksTo(maxCount); if (placeOnWater) { EndItems.registerBlockItem(id, new LilyPadItem(block, item)); } else { diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index ffb8ef58..1003ed6f 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -7,9 +7,9 @@ import com.google.common.collect.Lists; import net.minecraft.world.level.block.Blocks; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.biome.Biome; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.gen.GenerationStep; -import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import ru.betterend.BetterEnd; import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index fc5efa72..7e8f1f1e 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -5,25 +5,24 @@ import java.util.List; import com.google.common.collect.Lists; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.dispenser.DispenseItemBehavior; +import net.minecraft.sounds.SoundEvent; import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.food.FoodProperties; +import net.minecraft.world.food.Foods; import net.minecraft.world.item.*; import net.minecraft.world.level.block.DispenserBlock; -import net.minecraft.world.level.block.dispenser.ItemDispenserBehavior; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.SpawnReason; -import net.minecraft.world.entity.effect.StatusEffectInstance; -import net.minecraft.world.entity.effect.StatusEffects; -import net.minecraft.fluid.Fluids; -import net.minecraft.world.item.FoodComponent; -import net.minecraft.world.item.FoodComponents; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.level.material.Fluids; import net.minecraft.world.item.Item.Properties; -import net.minecraft.world.item.ToolItem; -import net.minecraft.world.item.ToolMaterials; -import net.minecraft.sound.SoundEvent; +import net.minecraft.world.item.TieredItem; +import net.minecraft.world.item.Tiers; import net.minecraft.tags.Tag; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Rarity; -import net.minecraft.util.math.BlockPointer; import net.minecraft.core.Direction; import net.minecraft.core.Registry; import ru.betterend.BetterEnd; @@ -94,17 +93,17 @@ public class EndItems { EndArmorMaterial.CRYSTALITE, EquipmentSlot.FEET, makeItemSettings().rarity(Rarity.UNCOMMON))); // Tools // - public static final ToolItem AETERNIUM_SHOVEL = registerTool("aeternium_shovel", + public static final TieredItem AETERNIUM_SHOVEL = registerTool("aeternium_shovel", new EndShovelItem(EndToolMaterial.AETERNIUM, 1.5F, -3.0F, makeItemSettings().fireResistant())); - public static final ToolItem AETERNIUM_SWORD = registerTool("aeternium_sword", + public static final TieredItem AETERNIUM_SWORD = registerTool("aeternium_sword", new EndSwordItem(EndToolMaterial.AETERNIUM, 3, -2.4F, makeItemSettings().fireResistant())); - public static final ToolItem AETERNIUM_PICKAXE = registerTool("aeternium_pickaxe", + public static final TieredItem AETERNIUM_PICKAXE = registerTool("aeternium_pickaxe", new EndPickaxeItem(EndToolMaterial.AETERNIUM, 1, -2.8F, makeItemSettings().fireResistant())); - public static final ToolItem AETERNIUM_AXE = registerTool("aeternium_axe", + public static final TieredItem AETERNIUM_AXE = registerTool("aeternium_axe", new EndAxeItem(EndToolMaterial.AETERNIUM, 5.0F, -3.0F, makeItemSettings().fireResistant())); - public static final ToolItem AETERNIUM_HOE = registerTool("aeternium_hoe", + public static final TieredItem AETERNIUM_HOE = registerTool("aeternium_hoe", new EndHoeItem(EndToolMaterial.AETERNIUM, -3, 0.0F, makeItemSettings().fireResistant())); - public static final ToolItem AETERNIUM_HAMMER = registerTool("aeternium_hammer", + public static final TieredItem AETERNIUM_HAMMER = registerTool("aeternium_hammer", new EndHammerItem(EndToolMaterial.AETERNIUM, 6.0F, -3.0F, 0.3D, makeItemSettings().fireResistant())); // Toolparts // @@ -117,33 +116,31 @@ public class EndItems { public final static Item AETERNIUM_SWORD_HANDLE = registerItem("aeternium_sword_handle"); // Hammers // - public static final ToolItem IRON_HAMMER = registerTool("iron_hammer", - new EndHammerItem(ToolMaterials.IRON, 5.0F, -3.2F, 0.2D, makeItemSettings())); - public static final ToolItem GOLDEN_HAMMER = registerTool("golden_hammer", - new EndHammerItem(ToolMaterials.GOLD, 4.5F, -3.4F, 0.3D, makeItemSettings())); - public static final ToolItem DIAMOND_HAMMER = registerTool("diamond_hammer", - new EndHammerItem(ToolMaterials.DIAMOND, 5.5F, -3.1F, 0.2D, makeItemSettings())); - public static final ToolItem NETHERITE_HAMMER = registerTool("netherite_hammer", - new EndHammerItem(ToolMaterials.NETHERITE, 5.0F, -3.0F, 0.2D, makeItemSettings().fireResistant())); + public static final TieredItem IRON_HAMMER = registerTool("iron_hammer", + new EndHammerItem(Tiers.IRON, 5.0F, -3.2F, 0.2D, makeItemSettings())); + public static final TieredItem GOLDEN_HAMMER = registerTool("golden_hammer", + new EndHammerItem(Tiers.GOLD, 4.5F, -3.4F, 0.3D, makeItemSettings())); + public static final TieredItem DIAMOND_HAMMER = registerTool("diamond_hammer", + new EndHammerItem(Tiers.DIAMOND, 5.5F, -3.1F, 0.2D, makeItemSettings())); + public static final TieredItem NETHERITE_HAMMER = registerTool("netherite_hammer", + new EndHammerItem(Tiers.NETHERITE, 5.0F, -3.0F, 0.2D, makeItemSettings().fireResistant())); // Food // public final static Item SHADOW_BERRY_RAW = registerFood("shadow_berry_raw", 4, 0.5F); public final static Item SHADOW_BERRY_COOKED = registerFood("shadow_berry_cooked", 6, 0.7F); - public final static Item END_FISH_RAW = registerFood("end_fish_raw", FoodComponents.SALMON); - public final static Item END_FISH_COOKED = registerFood("end_fish_cooked", FoodComponents.COOKED_SALMON); + public final static Item END_FISH_RAW = registerFood("end_fish_raw", Foods.SALMON); + public final static Item END_FISH_COOKED = registerFood("end_fish_cooked", Foods.COOKED_SALMON); public final static Item BUCKET_END_FISH = registerItem("bucket_end_fish", - new FishBucketItem(EndEntities.END_FISH, Fluids.WATER, makeItemSettings().maxCount(1))); + new FishBucketItem(EndEntities.END_FISH, Fluids.WATER, makeItemSettings().stacksTo(1))); public final static Item SWEET_BERRY_JELLY = registerFood("sweet_berry_jelly", 6, 0.75F); public final static Item SHADOW_BERRY_JELLY = registerFood("shadow_berry_jelly", 7, 0.75F, - new StatusEffectInstance(StatusEffects.NIGHT_VISION, 400)); - public final static Item BLOSSOM_BERRY = registerFood("blossom_berry", FoodComponents.APPLE); + new MobEffectInstance(MobEffects.NIGHT_VISION, 400)); + public final static Item BLOSSOM_BERRY = registerFood("blossom_berry", Foods.APPLE); public final static Item AMBER_ROOT_RAW = registerFood("amber_root_raw", 2, 0.8F); public final static Item CHORUS_MUSHROOM_RAW = registerFood("chorus_mushroom_raw", 3, 0.5F); - public final static Item CHORUS_MUSHROOM_COOKED = registerFood("chorus_mushroom_cooked", - FoodComponents.MUSHROOM_STEW); - public final static Item BOLUX_MUSHROOM_COOKED = registerFood("bolux_mushroom_cooked", - FoodComponents.MUSHROOM_STEW); - public final static Item CAVE_PUMPKIN_PIE = registerFood("cave_pumpkin_pie", FoodComponents.PUMPKIN_PIE); + public final static Item CHORUS_MUSHROOM_COOKED = registerFood("chorus_mushroom_cooked", Foods.MUSHROOM_STEW); + public final static Item BOLUX_MUSHROOM_COOKED = registerFood("bolux_mushroom_cooked", Foods.MUSHROOM_STEW); + public final static Item CAVE_PUMPKIN_PIE = registerFood("cave_pumpkin_pie", Foods.PUMPKIN_PIE); // Drinks // public final static Item UMBRELLA_CLUSTER_JUICE = registerDrink("umbrella_cluster_juice", 5, 0.7F); @@ -191,7 +188,7 @@ public class EndItems { return item; } - public static ToolItem registerTool(String name, ToolItem item) { + public static TieredItem registerTool(String name, TieredItem item) { ResourceLocation id = BetterEnd.makeID(name); if (!Configs.ITEM_CONFIG.getBoolean("tools", id.getPath(), true)) { return item; @@ -199,17 +196,17 @@ public class EndItems { registerItem(id, item, MOD_ITEMS); if (item instanceof ShovelItem) { - TagHelper.addTag((Tag.Identified) FabricToolTags.SHOVELS, item); + TagHelper.addTag((Tag.Named) FabricToolTags.SHOVELS, item); } else if (item instanceof SwordItem) { - TagHelper.addTag((Tag.Identified) FabricToolTags.SWORDS, item); + TagHelper.addTag((Tag.Named) FabricToolTags.SWORDS, item); } else if (item instanceof EndPickaxeItem) { - TagHelper.addTag((Tag.Identified) FabricToolTags.PICKAXES, item); + TagHelper.addTag((Tag.Named) FabricToolTags.PICKAXES, item); } else if (item instanceof EndAxeItem) { - TagHelper.addTag((Tag.Identified) FabricToolTags.AXES, item); + TagHelper.addTag((Tag.Named) FabricToolTags.AXES, item); } else if (item instanceof EndHoeItem) { - TagHelper.addTag((Tag.Identified) FabricToolTags.HOES, item); + TagHelper.addTag((Tag.Named) FabricToolTags.HOES, item); } else if (item instanceof EndHammerItem) { - TagHelper.addTag((Tag.Identified) EndTags.HAMMERS, item); + TagHelper.addTag((Tag.Named) EndTags.HAMMERS, item); } return item; @@ -217,42 +214,40 @@ public class EndItems { public static Item registerEgg(String name, EntityType type, int background, int dots) { SpawnEggItem item = new EndSpawnEggItem(type, background, dots, makeItemSettings()); - ItemDispenserBehavior behavior = new ItemDispenserBehavior() { - public ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { - Direction direction = pointer.getBlockState().get(DispenserBlock.FACING); - EntityType entityType = ((SpawnEggItem) stack.getItem()).getEntityType(stack.getTag()); - entityType.spawnFromItemStack(pointer.getLevel(), stack, null, pointer.getBlockPos().offset(direction), - SpawnReason.DISPENSER, direction != Direction.UP, false); - stack.decrement(1); - return stack; - } + DispenseItemBehavior behavior = (pointer, stack) -> { + Direction direction = pointer.getBlockState().getValue(DispenserBlock.FACING); + EntityType entityType = ((SpawnEggItem) stack.getItem()).getType(stack.getTag()); + entityType.spawn(pointer.getLevel(), stack, null, pointer.getPos().relative(direction), + MobSpawnType.DISPENSER, direction != Direction.UP, false); + stack.shrink(1); + return stack; }; DispenserBlock.registerBehavior(item, behavior); return registerItem(name, item); } - public static Item registerFood(String name, int hunger, float saturation, StatusEffectInstance... effects) { - FoodComponent.Builder builder = new FoodComponent.Builder().hunger(hunger).saturationModifier(saturation); - for (StatusEffectInstance effect : effects) { - builder.statusEffect(effect, 1F); + public static Item registerFood(String name, int hunger, float saturation, MobEffectInstance... effects) { + FoodProperties.Builder builder = new FoodProperties.Builder().nutrition(hunger).saturationMod(saturation); + for (MobEffectInstance effect : effects) { + builder.effect(effect, 1F); } return registerFood(name, builder.build()); } - public static Item registerFood(String name, FoodComponent foodComponent) { + public static Item registerFood(String name, FoodProperties foodComponent) { return registerItem(name, new PatternedItem(makeItemSettings().food(foodComponent))); } public static Item registerDrink(String name) { - return registerItem(name, new DrinkItem(makeItemSettings().maxCount(1))); + return registerItem(name, new DrinkItem(makeItemSettings().stacksTo(1))); } - public static Item registerDrink(String name, FoodComponent foodComponent) { - return registerItem(name, new DrinkItem(makeItemSettings().maxCount(1).food(foodComponent))); + public static Item registerDrink(String name, FoodProperties foodComponent) { + return registerItem(name, new DrinkItem(makeItemSettings().stacksTo(1).food(foodComponent))); } public static Item registerDrink(String name, int hunger, float saturation) { - FoodComponent.Builder builder = new FoodComponent.Builder().hunger(hunger).saturationModifier(saturation); + FoodProperties.Builder builder = new FoodProperties.Builder().nutrition(hunger).saturationMod(saturation); return registerDrink(name, builder.build()); } diff --git a/src/main/java/ru/betterend/registry/EndSounds.java b/src/main/java/ru/betterend/registry/EndSounds.java index 5acdda1a..b5962beb 100644 --- a/src/main/java/ru/betterend/registry/EndSounds.java +++ b/src/main/java/ru/betterend/registry/EndSounds.java @@ -1,6 +1,6 @@ package ru.betterend.registry; -import net.minecraft.sound.SoundEvent; +import net.minecraft.sounds.SoundEvent; import net.minecraft.core.Registry; import ru.betterend.BetterEnd; diff --git a/src/main/java/ru/betterend/registry/EndStructures.java b/src/main/java/ru/betterend/registry/EndStructures.java index aba3747f..bc11e4da 100644 --- a/src/main/java/ru/betterend/registry/EndStructures.java +++ b/src/main/java/ru/betterend/registry/EndStructures.java @@ -6,9 +6,9 @@ import java.util.function.Supplier; import net.minecraft.structure.StructurePieceType; import net.minecraft.resources.ResourceLocation; import net.minecraft.core.Registry; -import net.minecraft.world.biome.Biome; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.gen.GenerationStep.Feature; -import net.minecraft.world.gen.feature.ConfiguredStructureFeature; +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import ru.betterend.BetterEnd; import ru.betterend.world.structures.EndStructureFeature; import ru.betterend.world.structures.features.EternalPortalStructure; diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index 1c6cd6e1..46f7283f 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -10,16 +10,16 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.material.Material; import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.FoodComponent; +import net.minecraft.world.food.FoodProperties; import net.minecraft.world.item.Item; import net.minecraft.tags.BlockTags; import net.minecraft.tags.ItemTags; import net.minecraft.tags.Tag; -import net.minecraft.tags.Tag.Identified; +import net.minecraft.tags.Tag.Named; import net.minecraft.resources.ResourceLocation; import net.minecraft.core.Registry; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.Biome.Category; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Biome.Category; import net.minecraft.world.gen.surfacebuilder.SurfaceConfig; import ru.betterend.BetterEnd; import ru.betterend.blocks.EndTerrainBlock; @@ -34,45 +34,45 @@ public class EndTags { // https://fabricmc.net/wiki/tutorial:tags // Block Tags - public static final Tag.Identified BOOKSHELVES = makeCommonBlockTag("bookshelves"); - public static final Tag.Identified GEN_TERRAIN = makeBlockTag("gen_terrain"); - public static final Tag.Identified END_GROUND = makeBlockTag("end_ground"); - public static final Tag.Identified PEDESTALS = makeBlockTag("pedestal"); - public static final Tag.Identified BLOCK_CHEST = makeCommonBlockTag("chest"); - public static final Tag.Identified END_STONES = makeCommonBlockTag("end_stones"); - public static final Tag.Identified DRAGON_IMMUNE = getMCBlockTag("dragon_immune"); + public static final Tag.Named BOOKSHELVES = makeCommonBlockTag("bookshelves"); + public static final Tag.Named GEN_TERRAIN = makeBlockTag("gen_terrain"); + public static final Tag.Named END_GROUND = makeBlockTag("end_ground"); + public static final Tag.Named PEDESTALS = makeBlockTag("pedestal"); + public static final Tag.Named BLOCK_CHEST = makeCommonBlockTag("chest"); + public static final Tag.Named END_STONES = makeCommonBlockTag("end_stones"); + public static final Tag.Named DRAGON_IMMUNE = getMCBlockTag("dragon_immune"); // Item Tags - public static final Tag.Identified ITEM_CHEST = makeCommonItemTag("chest"); - public static final Tag.Identified IRON_INGOTS = makeCommonItemTag("iron_ingots"); - public static final Tag.Identified FURNACES = makeCommonItemTag("furnaces"); + public static final Tag.Named ITEM_CHEST = makeCommonItemTag("chest"); + public static final Tag.Named IRON_INGOTS = makeCommonItemTag("iron_ingots"); + public static final Tag.Named FURNACES = makeCommonItemTag("furnaces"); public final static Tag HAMMERS = registerFabricItemTag("hammers"); - public static Tag.Identified makeBlockTag(String name) { + public static Tag.Named makeBlockTag(String name) { ResourceLocation id = BetterEnd.makeID(name); Tag tag = BlockTags.getTagGroup().getTag(id); return tag == null ? (Identified) TagRegistry.block(id) : (Identified) tag; } - public static Tag.Identified makeItemTag(String name) { + public static Tag.Named makeItemTag(String name) { ResourceLocation id = BetterEnd.makeID(name); Tag tag = ItemTags.getTagGroup().getTag(id); return tag == null ? (Identified) TagRegistry.item(id) : (Identified) tag; } - public static Tag.Identified makeCommonBlockTag(String name) { + public static Tag.Named makeCommonBlockTag(String name) { ResourceLocation id = new ResourceLocation("c", name); Tag tag = BlockTags.getTagGroup().getTag(id); return tag == null ? (Identified) TagRegistry.block(id) : (Identified) tag; } - public static Tag.Identified makeCommonItemTag(String name) { + public static Tag.Named makeCommonItemTag(String name) { ResourceLocation id = new ResourceLocation("c", name); Tag tag = ItemTags.getTagGroup().getTag(id); return tag == null ? (Identified) TagRegistry.item(id) : (Identified) tag; } - public static Tag.Identified getMCBlockTag(String name) { + public static Tag.Named getMCBlockTag(String name) { ResourceLocation id = new ResourceLocation(name); Tag tag = BlockTags.getTagGroup().getTag(id); return tag == null ? (Identified) TagRegistry.block(id) : (Identified) tag; @@ -106,7 +106,7 @@ public class EndTags { EndItems.getModItems().forEach((item) -> { if (item.isFood()) { - FoodComponent food = item.getFoodComponent(); + FoodProperties food = item.getFoodComponent(); float compost = food.getHunger() * food.getSaturationModifier() * 0.18F; ComposterBlockAccessor.callRegisterCompostableItem(compost, item); } @@ -139,7 +139,7 @@ public class EndTags { public static void addTerrainTags(Registry biomeRegistry) { biomeRegistry.forEach((biome) -> { if (biome.getCategory() == Category.THEEND) { - SurfaceConfig config = biome.getGenerationSettings().getSurfaceConfig(); + SurfaceConfig config = biome.getGenerationSettings().getSurfaceBuilderConfig(); Block under = config.getUnderMaterial().getBlock(); Block surface = config.getTopMaterial().getBlock(); TagHelper.addTag(GEN_TERRAIN, under, surface); diff --git a/src/main/java/ru/betterend/rituals/EternalRitual.java b/src/main/java/ru/betterend/rituals/EternalRitual.java index 34430016..964cef7c 100644 --- a/src/main/java/ru/betterend/rituals/EternalRitual.java +++ b/src/main/java/ru/betterend/rituals/EternalRitual.java @@ -36,7 +36,7 @@ import net.minecraft.world.Heightmap; import net.minecraft.world.level.Level; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.level.dimension.DimensionType; -import net.minecraft.world.gen.feature.ConfiguredFeatures; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeatures; import ru.betterend.BetterEnd; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.EndPortalBlock; @@ -305,7 +305,7 @@ public class EternalRitual { int worldCeil = targetWorld.getDimensionHeight() - 1; if (checkIsAreaValid(targetWorld, basePos, portalAxis)) { generatePortal(targetWorld, basePos, portalAxis, portalId); - return basePos.toImmutable(); + return basePos.immutable(); } else { Direction direction = Direction.EAST; BlockPos.MutableBlockPos checkPos = basePos.mutable(); @@ -325,7 +325,7 @@ public class EternalRitual { while (checkPos.getY() >= 5) { if (checkIsAreaValid(targetWorld, checkPos, portalAxis)) { generatePortal(targetWorld, checkPos, portalAxis, portalId); - return checkPos.toImmutable(); + return checkPos.immutable(); } checkPos.move(Direction.DOWN); } @@ -345,7 +345,7 @@ public class EternalRitual { EndFeatures.BIOME_ISLAND.getFeatureConfigured().generate(targetWorld, targetWorld.getChunkManager().getChunkGenerator(), new Random(basePos.asLong()), basePos.below()); generatePortal(targetWorld, basePos, portalAxis, portalId); - return basePos.toImmutable(); + return basePos.immutable(); } private Level getTargetWorld(int state) { diff --git a/src/main/java/ru/betterend/rituals/InfusionRitual.java b/src/main/java/ru/betterend/rituals/InfusionRitual.java index 0db4530c..fc589e14 100644 --- a/src/main/java/ru/betterend/rituals/InfusionRitual.java +++ b/src/main/java/ru/betterend/rituals/InfusionRitual.java @@ -3,7 +3,7 @@ package ru.betterend.rituals; import java.awt.Point; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.inventory.Inventory; import net.minecraft.world.item.ItemStack; import net.minecraft.nbt.CompoundTag; @@ -230,7 +230,7 @@ public class InfusionRitual implements Inventory { } @Override - public boolean canPlayerUse(PlayerEntity player) { + public boolean canPlayerUse(Player player) { return true; } diff --git a/src/main/java/ru/betterend/util/BlocksHelper.java b/src/main/java/ru/betterend/util/BlocksHelper.java index 094ef837..580a5b7e 100644 --- a/src/main/java/ru/betterend/util/BlocksHelper.java +++ b/src/main/java/ru/betterend/util/BlocksHelper.java @@ -172,7 +172,7 @@ public class BlocksHelper { state = world.getBlockState(POS); if (state.getBlock() instanceof FurBlock) { - doubleCheck.add(POS.toImmutable()); + doubleCheck.add(POS.immutable()); } // Liquids else if (!state.getFluidState().isEmpty()) { @@ -237,7 +237,7 @@ public class BlocksHelper { if (state.is(Blocks.CHORUS_PLANT)) { Set ends = Sets.newHashSet(); Set add = Sets.newHashSet(); - ends.add(POS.toImmutable()); + ends.add(POS.immutable()); for (int i = 0; i < 64 && !ends.isEmpty(); i++) { ends.forEach((pos) -> { @@ -276,7 +276,7 @@ public class BlocksHelper { POS.setY(POS.getY() - 1); state = world.getBlockState(POS); - int ray = downRayRep(world, POS.toImmutable(), 64); + int ray = downRayRep(world, POS.immutable(), 64); if (ray > 32) { BlocksHelper.setWithoutUpdate(world, POS, Blocks.END_STONE.defaultBlockState()); if (world.getRandom().nextBoolean()) { diff --git a/src/main/java/ru/betterend/util/ColorUtil.java b/src/main/java/ru/betterend/util/ColorUtil.java index 17c6f39b..e2031cbd 100644 --- a/src/main/java/ru/betterend/util/ColorUtil.java +++ b/src/main/java/ru/betterend/util/ColorUtil.java @@ -10,7 +10,7 @@ import com.google.common.collect.Maps; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.impl.client.indigo.renderer.helper.ColorHelper; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import net.minecraft.client.texture.NativeImage; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; @@ -193,7 +193,7 @@ public class ColorUtil { public static int extractColor(Item item) { ResourceLocation id = Registry.ITEM.getId(item); - if (id.equals(Registry.ITEM.getDefaultId())) + if (id.equals(Registry.ITEM.getDefaultKey())) return -1; if (colorPalette.containsKey(id)) { return colorPalette.get(id); @@ -227,7 +227,7 @@ public class ColorUtil { } public static NativeImage loadImage(ResourceLocation image, int w, int h) { - MinecraftClient minecraft = MinecraftClient.getInstance(); + Minecraft minecraft = Minecraft.getInstance(); ResourceManager resourceManager = minecraft.getResourceManager(); if (resourceManager.containsResource(image)) { try (Resource resource = resourceManager.getResource(image)) { diff --git a/src/main/java/ru/betterend/util/FeaturesHelper.java b/src/main/java/ru/betterend/util/FeaturesHelper.java index 806f8325..c00e2452 100644 --- a/src/main/java/ru/betterend/util/FeaturesHelper.java +++ b/src/main/java/ru/betterend/util/FeaturesHelper.java @@ -9,9 +9,9 @@ import com.google.common.collect.Lists; import com.google.common.collect.Sets; import net.minecraft.core.Registry; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.feature.ConfiguredFeature; -import net.minecraft.world.gen.feature.ConfiguredStructureFeature; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import ru.betterend.mixin.common.GenerationSettingsAccessor; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndStructures; diff --git a/src/main/java/ru/betterend/util/MHelper.java b/src/main/java/ru/betterend/util/MHelper.java index 3db1bc5d..156333b8 100644 --- a/src/main/java/ru/betterend/util/MHelper.java +++ b/src/main/java/ru/betterend/util/MHelper.java @@ -2,7 +2,7 @@ package ru.betterend.util; import java.util.Random; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.util.math.Vec3d; public class MHelper { @@ -15,7 +15,7 @@ public class MHelper { public static int color(int r, int g, int b) { return ALPHA | (r << 16) | (g << 8) | b; } - + public static int color(String hex) { int r = Integer.parseInt(hex.substring(0, 2), 16); int g = Integer.parseInt(hex.substring(2, 4), 16); @@ -26,7 +26,7 @@ public class MHelper { public static int randRange(int min, int max, Random random) { return min + random.nextInt(max - min + 1); } - + public static double randRange(double min, double max, Random random) { return min + random.nextDouble() * (max - min); } @@ -68,81 +68,81 @@ public class MHelper { public static int min(int a, int b) { return a < b ? a : b; } - + public static int min(int a, int b, int c) { return min(a, min(b, c)); } - + public static int max(int a, int b) { return a > b ? a : b; } - + public static float min(float a, float b) { return a < b ? a : b; } - + public static float max(float a, float b) { return a > b ? a : b; } - + public static float max(float a, float b, float c) { return max(a, max(b, c)); } - + public static int max(int a, int b, int c) { return max(a, max(b, c)); } - + public static boolean isEven(int num) { return (num & 1) == 0; } - + public static float lengthSqr(float x, float y, float z) { return x * x + y * y + z * z; } - + public static double lengthSqr(double x, double y, double z) { return x * x + y * y + z * z; } - + public static float length(float x, float y, float z) { return (float) Math.sqrt(lengthSqr(x, y, z)); } - + public static double length(double x, double y, double z) { return Math.sqrt(lengthSqr(x, y, z)); } - + public static float lengthSqr(float x, float y) { return x * x + y * y; } - + public static double lengthSqr(double x, double y) { return x * x + y * y; } - + public static float length(float x, float y) { return (float) Math.sqrt(lengthSqr(x, y)); } - + public static double length(double x, double y) { return Math.sqrt(lengthSqr(x, y)); } - + public static float dot(float x1, float y1, float z1, float x2, float y2, float z2) { return x1 * x2 + y1 * y2 + z1 * z2; } - + public static float dot(float x1, float y1, float x2, float y2) { return x1 * x2 + y1 * y2; } - + public static int getRandom(int x, int z) { int h = x * 374761393 + z * 668265263; h = (h ^ (h >> 13)) * 1274126177; return h ^ (h >> 16); } - + public static int getSeed(int seed, int x, int y) { int h = seed + x * 374761393 + y * 668265263; h = (h ^ (h >> 13)) * 1274126177; @@ -154,7 +154,7 @@ public class MHelper { h = (h ^ (h >> 13)) * 1274126177; return h ^ (h >> 16); } - + public static void shuffle(T[] array, Random random) { for (int i = 0; i < array.length; i++) { int i2 = random.nextInt(array.length); @@ -167,15 +167,15 @@ public class MHelper { public static int pow2(int i) { return i * i; } - + public static float pow2(float f) { return f * f; } - + public static double pow2(double d) { return d * d; } - + public static int fromHSBtoRGB(float hue, float saturation, float brightness) { int red = 0; int green = 0; @@ -189,35 +189,35 @@ public class MHelper { float var9 = brightness * (1.0F - saturation * var7); float var10 = brightness * (1.0F - saturation * (1.0F - var7)); switch ((int) var6) { - case 0 : - red = (int) (brightness * 255.0F + 0.5F); - green = (int) (var10 * 255.0F + 0.5F); - blue = (int) (var8 * 255.0F + 0.5F); - break; - case 1 : - red = (int) (var9 * 255.0F + 0.5F); - green = (int) (brightness * 255.0F + 0.5F); - blue = (int) (var8 * 255.0F + 0.5F); - break; - case 2 : - red = (int) (var8 * 255.0F + 0.5F); - green = (int) (brightness * 255.0F + 0.5F); - blue = (int) (var10 * 255.0F + 0.5F); - break; - case 3 : - red = (int) (var8 * 255.0F + 0.5F); - green = (int) (var9 * 255.0F + 0.5F); - blue = (int) (brightness * 255.0F + 0.5F); - break; - case 4 : - red = (int) (var10 * 255.0F + 0.5F); - green = (int) (var8 * 255.0F + 0.5F); - blue = (int) (brightness * 255.0F + 0.5F); - break; - case 5 : - red = (int) (brightness * 255.0F + 0.5F); - green = (int) (var8 * 255.0F + 0.5F); - blue = (int) (var9 * 255.0F + 0.5F); + case 0: + red = (int) (brightness * 255.0F + 0.5F); + green = (int) (var10 * 255.0F + 0.5F); + blue = (int) (var8 * 255.0F + 0.5F); + break; + case 1: + red = (int) (var9 * 255.0F + 0.5F); + green = (int) (brightness * 255.0F + 0.5F); + blue = (int) (var8 * 255.0F + 0.5F); + break; + case 2: + red = (int) (var8 * 255.0F + 0.5F); + green = (int) (brightness * 255.0F + 0.5F); + blue = (int) (var10 * 255.0F + 0.5F); + break; + case 3: + red = (int) (var8 * 255.0F + 0.5F); + green = (int) (var9 * 255.0F + 0.5F); + blue = (int) (brightness * 255.0F + 0.5F); + break; + case 4: + red = (int) (var10 * 255.0F + 0.5F); + green = (int) (var8 * 255.0F + 0.5F); + blue = (int) (brightness * 255.0F + 0.5F); + break; + case 5: + red = (int) (brightness * 255.0F + 0.5F); + green = (int) (var8 * 255.0F + 0.5F); + blue = (int) (var9 * 255.0F + 0.5F); } } @@ -241,8 +241,7 @@ public class MHelper { float hue; if (saturation == 0.0F) { hue = 0.0F; - } - else { + } else { float var9 = (float) (max - r) / (float) (max - min); float var10 = (float) (max - g) / (float) (max - min); float var11 = (float) (max - b) / (float) (max - min); @@ -263,10 +262,10 @@ public class MHelper { values[0] = hue; values[1] = saturation; values[2] = brightness; - + return values; } - + public static Vec3d fromRGBtoHSBV(int r, int g, int b) { int max = max(r, g, b); int min = min(r, g, b); @@ -282,8 +281,7 @@ public class MHelper { float hue; if (saturation == 0.0F) { hue = 0.0F; - } - else { + } else { float var9 = (float) (max - r) / (float) (max - min); float var10 = (float) (max - g) / (float) (max - min); float var11 = (float) (max - b) / (float) (max - min); @@ -300,45 +298,44 @@ public class MHelper { ++hue; } } - + return new Vec3d(hue, saturation, brightness); } - + public static final float radiansToDegrees(float value) { return value * RAD_TO_DEG; } - + public static final float degreesToRadians(float value) { return value / RAD_TO_DEG; } - - public static Vector3f cross(Vector3f vec1, Vector3f vec2) - { + + public static Vector3f cross(Vector3f vec1, Vector3f vec2) { float cx = vec1.getY() * vec2.getZ() - vec1.getZ() * vec2.getY(); float cy = vec1.getZ() * vec2.getX() - vec1.getX() * vec2.getZ(); float cz = vec1.getX() * vec2.getY() - vec1.getY() * vec2.getX(); return new Vector3f(cx, cy, cz); } - + public static Vector3f normalize(Vector3f vec) { - float length = lengthSqr(vec.getX(), vec.getY(), vec.getZ()); + float length = lengthSqr(vec.x(), vec.y(), vec.z()); if (length > 0) { length = (float) Math.sqrt(length); - float x = vec.getX() / length; - float y = vec.getY() / length; - float z = vec.getZ() / length; + float x = vec.x() / length; + float y = vec.y() / length; + float z = vec.z() / length; vec.set(x, y, z); } return vec; } - + public static float angle(Vector3f vec1, Vector3f vec2) { float dot = vec1.getX() * vec2.getX() + vec1.getY() * vec2.getY() + vec1.getZ() * vec2.getZ(); float length1 = lengthSqr(vec1.getX(), vec1.getY(), vec1.getZ()); float length2 = lengthSqr(vec2.getX(), vec2.getY(), vec2.getZ()); return (float) Math.acos(dot / Math.sqrt(length1 * length2)); } - + public static Vector3f randomHorizontal(Random random) { float angleY = MHelper.randRange(0, MHelper.PI2, random); float vx = (float) Math.sin(angleY); diff --git a/src/main/java/ru/betterend/util/RecipeHelper.java b/src/main/java/ru/betterend/util/RecipeHelper.java index 61bdbb13..e0b9b2a0 100644 --- a/src/main/java/ru/betterend/util/RecipeHelper.java +++ b/src/main/java/ru/betterend/util/RecipeHelper.java @@ -1,20 +1,20 @@ package ru.betterend.util; import net.minecraft.world.level.block.Block; -import net.minecraft.world.item.ItemConvertible; +import net.minecraft.world.level.ItemLike; import net.minecraft.core.Registry; public class RecipeHelper { - public static boolean exists(ItemConvertible item) { + public static boolean exists(ItemLike item) { if (item instanceof Block) { - return Registry.BLOCK.getKey((Block) item) != Registry.BLOCK.getDefaultId(); + return Registry.BLOCK.getKey((Block) item) != Registry.BLOCK.getDefaultKey(); } else { - return Registry.ITEM.getId(item.asItem()) != Registry.ITEM.getDefaultId(); + return Registry.ITEM.getId(item.asItem()) != Registry.ITEM.getDefaultKey(); } } - public static boolean exists(ItemConvertible... items) { - for (ItemConvertible item : items) { + public static boolean exists(ItemLike... items) { + for (ItemLike item : items) { if (!exists(item)) { return false; } diff --git a/src/main/java/ru/betterend/util/SplineHelper.java b/src/main/java/ru/betterend/util/SplineHelper.java index e5e66ef0..d0ad187f 100644 --- a/src/main/java/ru/betterend/util/SplineHelper.java +++ b/src/main/java/ru/betterend/util/SplineHelper.java @@ -8,11 +8,11 @@ import java.util.function.Function; import com.google.common.collect.Lists; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.util.Mth; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.util.sdf.SDF; import ru.betterend.util.sdf.operator.SDFUnion; import ru.betterend.util.sdf.primitive.SDFLine; @@ -114,7 +114,7 @@ public class SplineHelper { return result; } - public static boolean fillSpline(List spline, StructureWorldAccess world, BlockState state, BlockPos pos, + public static boolean fillSpline(List spline, WorldGenLevel world, BlockState state, BlockPos pos, Function replace) { Vector3f startPos = spline.get(0); for (int i = 1; i < spline.size(); i++) { @@ -128,8 +128,8 @@ public class SplineHelper { return true; } - public static void fillSplineForce(List spline, StructureWorldAccess world, BlockState state, - BlockPos pos, Function replace) { + public static void fillSplineForce(List spline, WorldGenLevel world, BlockState state, BlockPos pos, + Function replace) { Vector3f startPos = spline.get(0); for (int i = 1; i < spline.size(); i++) { Vector3f endPos = spline.get(i); @@ -138,8 +138,8 @@ public class SplineHelper { } } - public static boolean fillLine(Vector3f start, Vector3f end, StructureWorldAccess world, BlockState state, - BlockPos pos, Function replace) { + public static boolean fillLine(Vector3f start, Vector3f end, WorldGenLevel world, BlockState state, BlockPos pos, + Function replace) { float dx = end.getX() - start.getX(); float dy = end.getY() - start.getY(); float dz = end.getZ() - start.getZ(); @@ -187,8 +187,8 @@ public class SplineHelper { } } - public static void fillLineForce(Vector3f start, Vector3f end, StructureWorldAccess world, BlockState state, - BlockPos pos, Function replace) { + public static void fillLineForce(Vector3f start, Vector3f end, WorldGenLevel world, BlockState state, BlockPos pos, + Function replace) { float dx = end.getX() - start.getX(); float dy = end.getY() - start.getY(); float dz = end.getZ() - start.getZ(); @@ -231,19 +231,19 @@ public class SplineHelper { } } - public static boolean canGenerate(List spline, float scale, BlockPos start, StructureWorldAccess world, + public static boolean canGenerate(List spline, float scale, BlockPos start, WorldGenLevel world, Function canReplace) { int count = spline.size(); Vector3f vec = spline.get(0); MutableBlockPos mut = new MutableBlockPos(); - float x1 = start.getX() + vec.getX() * scale; - float y1 = start.getY() + vec.getY() * scale; - float z1 = start.getZ() + vec.getZ() * scale; + float x1 = start.getX() + vec.x() * scale; + float y1 = start.getY() + vec.y() * scale; + float z1 = start.getZ() + vec.z() * scale; for (int i = 1; i < count; i++) { vec = spline.get(i); - float x2 = start.getX() + vec.getX() * scale; - float y2 = start.getY() + vec.getY() * scale; - float z2 = start.getZ() + vec.getZ() * scale; + float x2 = start.getX() + vec.x() * scale; + float y2 = start.getY() + vec.y() * scale; + float z2 = start.getZ() + vec.z() * scale; for (float py = y1; py < y2; py += 3) { if (py - start.getY() < 10) @@ -264,19 +264,19 @@ public class SplineHelper { return true; } - public static boolean canGenerate(List spline, BlockPos start, StructureWorldAccess world, + public static boolean canGenerate(List spline, BlockPos start, WorldGenLevel world, Function canReplace) { int count = spline.size(); Vector3f vec = spline.get(0); MutableBlockPos mut = new MutableBlockPos(); - float x1 = start.getX() + vec.getX(); - float y1 = start.getY() + vec.getY(); - float z1 = start.getZ() + vec.getZ(); + float x1 = start.getX() + vec.x(); + float y1 = start.getY() + vec.y(); + float z1 = start.getZ() + vec.z(); for (int i = 1; i < count; i++) { vec = spline.get(i); - float x2 = start.getX() + vec.getX(); - float y2 = start.getY() + vec.getY(); - float z2 = start.getZ() + vec.getZ(); + float x2 = start.getX() + vec.x(); + float y2 = start.getY() + vec.y(); + float z2 = start.getZ() + vec.z(); for (float py = y1; py < y2; py += 3) { if (py - start.getY() < 10) diff --git a/src/main/java/ru/betterend/util/StructureHelper.java b/src/main/java/ru/betterend/util/StructureHelper.java index ec249958..8ec9dbc5 100644 --- a/src/main/java/ru/betterend/util/StructureHelper.java +++ b/src/main/java/ru/betterend/util/StructureHelper.java @@ -26,7 +26,7 @@ import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -88,13 +88,13 @@ public class StructureHelper { return pos.offset(-offset.getX() * 0.5, 0, -offset.getZ() * 0.5); } - public static void placeCenteredBottom(StructureWorldAccess world, BlockPos pos, Structure structure, - Rotation rotation, BlockMirror mirror, Random random) { + public static void placeCenteredBottom(WorldGenLevel world, BlockPos pos, Structure structure, Rotation rotation, + BlockMirror mirror, Random random) { placeCenteredBottom(world, pos, structure, rotation, mirror, makeBox(pos), random); } - public static void placeCenteredBottom(StructureWorldAccess world, BlockPos pos, Structure structure, - Rotation rotation, BlockMirror mirror, BlockBox bounds, Random random) { + public static void placeCenteredBottom(WorldGenLevel world, BlockPos pos, Structure structure, Rotation rotation, + BlockMirror mirror, BlockBox bounds, Random random) { BlockPos offset = offsetPos(pos, structure, rotation, mirror); StructurePlacementData placementData = new StructurePlacementData().setRotation(rotation).setMirror(mirror) .setBoundingBox(bounds); @@ -129,7 +129,7 @@ public class StructureHelper { return BlockBox.create(x1, y1, z1, x2, y2, z2); } - public static void erode(StructureWorldAccess world, BlockBox bounds, int iterations, Random random) { + public static void erode(WorldGenLevel world, BlockBox bounds, int iterations, Random random) { MutableBlockPos mut = new MutableBlockPos(); boolean canDestruct = true; for (int i = 0; i < iterations; i++) { @@ -227,7 +227,7 @@ public class StructureHelper { } } - public static void erodeIntense(StructureWorldAccess world, BlockBox bounds, Random random) { + public static void erodeIntense(WorldGenLevel world, BlockBox bounds, Random random) { MutableBlockPos mut = new MutableBlockPos(); MutableBlockPos mut2 = new MutableBlockPos(); int minY = bounds.minY - 10; @@ -264,7 +264,7 @@ public class StructureHelper { drop(world, bounds); } - private static boolean isTerrainNear(StructureWorldAccess world, BlockPos pos) { + private static boolean isTerrainNear(WorldGenLevel world, BlockPos pos) { for (Direction dir : BlocksHelper.DIRECTIONS) { if (world.getBlockState(pos.relative(dir)).isIn(EndTags.GEN_TERRAIN)) { return true; @@ -273,7 +273,7 @@ public class StructureHelper { return false; } - private static void drop(StructureWorldAccess world, BlockBox bounds) { + private static void drop(WorldGenLevel world, BlockBox bounds) { MutableBlockPos mut = new MutableBlockPos(); Set blocks = Sets.newHashSet(); @@ -288,7 +288,7 @@ public class StructureHelper { mut.setY(y); BlockState state = world.getBlockState(mut); if (!ignore(state) && isTerrainNear(world, mut)) { - edge.add(mut.toImmutable()); + edge.add(mut.immutable()); } } } @@ -307,7 +307,7 @@ public class StructureHelper { if (bounds.contains(mut)) { state = world.getBlockState(mut); if (!ignore(state) && !blocks.contains(mut)) { - add.add(mut.toImmutable()); + add.add(mut.immutable()); } } } @@ -359,13 +359,13 @@ public class StructureHelper { } } - public static void cover(StructureWorldAccess world, BlockBox bounds, Random random) { + public static void cover(WorldGenLevel world, BlockBox bounds, Random random) { MutableBlockPos mut = new MutableBlockPos(); for (int x = bounds.minX; x <= bounds.maxX; x++) { mut.setX(x); for (int z = bounds.minZ; z <= bounds.maxZ; z++) { mut.setZ(z); - BlockState top = world.getBiome(mut).getGenerationSettings().getSurfaceConfig().getTopMaterial(); + BlockState top = world.getBiome(mut).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); for (int y = bounds.maxY; y >= bounds.minY; y--) { mut.setY(y); BlockState state = world.getBlockState(mut); diff --git a/src/main/java/ru/betterend/util/TagHelper.java b/src/main/java/ru/betterend/util/TagHelper.java index 5710e020..2f962089 100644 --- a/src/main/java/ru/betterend/util/TagHelper.java +++ b/src/main/java/ru/betterend/util/TagHelper.java @@ -6,9 +6,9 @@ import java.util.Set; import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Block; import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemConvertible; import net.minecraft.tags.Tag; import net.minecraft.resources.ResourceLocation; import net.minecraft.core.Registry; @@ -17,53 +17,45 @@ public class TagHelper { private static final Map> TAGS_BLOCK = Maps.newHashMap(); private static final Map> TAGS_ITEM = Maps.newHashMap(); - public static void addTag(Tag.Identified tag, Block... blocks) { - ResourceLocation tagID = tag.getId(); - Set set = TAGS_BLOCK.get(tagID); - if (set == null) { - set = Sets.newHashSet(); - TAGS_BLOCK.put(tagID, set); - } + public static void addTag(Tag.Named tag, Block... blocks) { + ResourceLocation tagID = tag.getName(); + Set set = TAGS_BLOCK.computeIfAbsent(tagID, k -> Sets.newHashSet()); for (Block block : blocks) { ResourceLocation id = Registry.BLOCK.getKey(block); - if (id != Registry.BLOCK.getDefaultId()) { + if (id != Registry.BLOCK.getDefaultKey()) { set.add(id); } } } - public static void addTag(Tag.Identified tag, ItemConvertible... items) { - ResourceLocation tagID = tag.getId(); - Set set = TAGS_ITEM.get(tagID); - if (set == null) { - set = Sets.newHashSet(); - TAGS_ITEM.put(tagID, set); - } - for (ItemConvertible item : items) { - ResourceLocation id = Registry.ITEM.getId(item.asItem()); - if (id != Registry.ITEM.getDefaultId()) { + public static void addTag(Tag.Named tag, ItemLike... items) { + ResourceLocation tagID = tag.getName(); + Set set = TAGS_ITEM.computeIfAbsent(tagID, k -> Sets.newHashSet()); + for (ItemLike item : items) { + ResourceLocation id = Registry.ITEM.getKey(item.asItem()); + if (id != Registry.ITEM.getDefaultKey()) { set.add(id); } } } @SafeVarargs - public static void addTags(ItemConvertible item, Tag.Identified... tags) { - for (Tag.Identified tag : tags) { + public static void addTags(ItemLike item, Tag.Named... tags) { + for (Tag.Named tag : tags) { addTag(tag, item); } } @SafeVarargs - public static void addTags(Block block, Tag.Identified... tags) { - for (Tag.Identified tag : tags) { + public static void addTags(Block block, Tag.Named... tags) { + for (Tag.Named tag : tags) { addTag(tag, block); } } public static Tag.Builder apply(Tag.Builder builder, Set ids) { - ids.forEach((value) -> { - builder.add(value, "Better End Code"); + ids.forEach(value -> { + builder.addTag(value, "Better End Code"); }); return builder; } @@ -80,7 +72,7 @@ public class TagHelper { if (tagsMap.containsKey(id)) { apply(tagsMap.get(id), ids); } else { - tagsMap.put(id, apply(Tag.Builder.create(), ids)); + tagsMap.put(id, apply(Tag.Builder.tag(), ids)); } }); } diff --git a/src/main/java/ru/betterend/util/sdf/SDF.java b/src/main/java/ru/betterend/util/sdf/SDF.java index a75ff615..fce2d575 100644 --- a/src/main/java/ru/betterend/util/sdf/SDF.java +++ b/src/main/java/ru/betterend/util/sdf/SDF.java @@ -11,12 +11,12 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.util.math.Box; import net.minecraft.core.Direction; -import net.minecraft.world.ServerWorldAccess; import ru.betterend.util.BlocksHelper; import ru.betterend.world.structures.StructureWorld; @@ -40,7 +40,7 @@ public abstract class SDF { return this; } - public void fillRecursive(ServerWorldAccess world, BlockPos start) { + public void fillRecursive(ServerLevelAccessor world, BlockPos start) { Map mapWorld = Maps.newHashMap(); Map addInfo = Maps.newHashMap(); Set blocks = Sets.newHashSet(); @@ -55,13 +55,13 @@ public abstract class SDF { for (BlockPos center : ends) { for (Direction dir : Direction.values()) { bPos.set(center).move(dir); - BlockPos wpos = bPos.add(start); + BlockPos wpos = bPos.offset(start); if (!blocks.contains(bPos) && canReplace.apply(world.getBlockState(wpos))) { if (this.getDistance(bPos.getX(), bPos.getY(), bPos.getZ()) < 0) { BlockState state = getBlockState(wpos); PosInfo.create(mapWorld, addInfo, wpos).setState(state); - add.add(bPos.toImmutable()); + add.add(bPos.immutable()); } } } @@ -103,7 +103,7 @@ public abstract class SDF { } } - public void fillArea(ServerWorldAccess world, BlockPos center, Box box) { + public void fillArea(ServerLevelAccessor world, BlockPos center, Box box) { Map mapWorld = Maps.newHashMap(); Map addInfo = Maps.newHashMap(); @@ -117,7 +117,7 @@ public abstract class SDF { if (canReplace.apply(world.getBlockState(mut))) { BlockPos fpos = mut.subtract(center); if (this.getDistance(fpos.getX(), fpos.getY(), fpos.getZ()) < 0) { - PosInfo.create(mapWorld, addInfo, mut.toImmutable()).setState(getBlockState(mut)); + PosInfo.create(mapWorld, addInfo, mut.immutable()).setState(getBlockState(mut)); } } } @@ -152,7 +152,7 @@ public abstract class SDF { } } - public void fillRecursiveIgnore(ServerWorldAccess world, BlockPos start, Function ignore) { + public void fillRecursiveIgnore(ServerLevelAccessor world, BlockPos start, Function ignore) { Map mapWorld = Maps.newHashMap(); Map addInfo = Maps.newHashMap(); Set blocks = Sets.newHashSet(); @@ -167,13 +167,13 @@ public abstract class SDF { for (BlockPos center : ends) { for (Direction dir : Direction.values()) { bPos.set(center).move(dir); - BlockPos wpos = bPos.add(start); + BlockPos wpos = bPos.offset(start); BlockState state = world.getBlockState(wpos); boolean ign = ignore.apply(state); if (!blocks.contains(bPos) && (ign || canReplace.apply(state))) { if (this.getDistance(bPos.getX(), bPos.getY(), bPos.getZ()) < 0) { PosInfo.create(mapWorld, addInfo, wpos).setState(ign ? state : getBlockState(bPos)); - add.add(bPos.toImmutable()); + add.add(bPos.immutable()); } } } @@ -230,13 +230,13 @@ public abstract class SDF { for (BlockPos center : ends) { for (Direction dir : Direction.values()) { bPos.set(center).move(dir); - BlockPos wpos = bPos.add(start); + BlockPos wpos = bPos.offset(start); if (!blocks.contains(bPos)) { if (this.getDistance(bPos.getX(), bPos.getY(), bPos.getZ()) < 0) { BlockState state = getBlockState(wpos); PosInfo.create(mapWorld, addInfo, wpos).setState(state); - add.add(bPos.toImmutable()); + add.add(bPos.immutable()); } } } @@ -274,7 +274,7 @@ public abstract class SDF { }); } - public Set getPositions(ServerWorldAccess world, BlockPos start) { + public Set getPositions(ServerLevelAccessor world, BlockPos start) { Set blocks = Sets.newHashSet(); Set ends = Sets.newHashSet(); Set add = Sets.newHashSet(); @@ -287,17 +287,17 @@ public abstract class SDF { for (BlockPos center : ends) { for (Direction dir : Direction.values()) { bPos.set(center).move(dir); - BlockPos wpos = bPos.add(start); + BlockPos wpos = bPos.offset(start); BlockState state = world.getBlockState(wpos); if (!blocks.contains(wpos) && canReplace.apply(state)) { if (this.getDistance(bPos.getX(), bPos.getY(), bPos.getZ()) < 0) { - add.add(bPos.toImmutable()); + add.add(bPos.immutable()); } } } } - ends.forEach((end) -> blocks.add(end.add(start))); + ends.forEach((end) -> blocks.add(end.offset(start))); ends.clear(); ends.addAll(add); add.clear(); diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFCoordModify.java b/src/main/java/ru/betterend/util/sdf/operator/SDFCoordModify.java index ea04ace9..280cd223 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFCoordModify.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFCoordModify.java @@ -2,17 +2,17 @@ package ru.betterend.util.sdf.operator; import java.util.function.Consumer; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; public class SDFCoordModify extends SDFUnary { private static final Vector3f POS = new Vector3f(); private Consumer function; - + public SDFCoordModify setFunction(Consumer function) { this.function = function; return this; } - + @Override public float getDistance(float x, float y, float z) { POS.set(x, y, z); diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFDisplacement.java b/src/main/java/ru/betterend/util/sdf/operator/SDFDisplacement.java index 652c02f8..32b9474d 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFDisplacement.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFDisplacement.java @@ -2,17 +2,17 @@ package ru.betterend.util.sdf.operator; import java.util.function.Function; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; public class SDFDisplacement extends SDFUnary { private static final Vector3f POS = new Vector3f(); private Function displace; - + public SDFDisplacement setFunction(Function displace) { this.displace = displace; return this; } - + @Override public float getDistance(float x, float y, float z) { POS.set(x, y, z); diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFRotation.java b/src/main/java/ru/betterend/util/sdf/operator/SDFRotation.java index 3452c255..38112670 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFRotation.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFRotation.java @@ -1,17 +1,17 @@ package ru.betterend.util.sdf.operator; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.util.math.Quaternion; public class SDFRotation extends SDFUnary { private static final Vector3f POS = new Vector3f(); private Quaternion rotation; - + public SDFRotation setRotation(Vector3f axis, float rotationAngle) { rotation = new Quaternion(axis, rotationAngle, false); return this; } - + @Override public float getDistance(float x, float y, float z) { POS.set(x, y, z); diff --git a/src/main/java/ru/betterend/world/biome/BiomeDefinition.java b/src/main/java/ru/betterend/world/biome/BiomeDefinition.java index c3c96e88..8a02e4a9 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeDefinition.java +++ b/src/main/java/ru/betterend/world/biome/BiomeDefinition.java @@ -12,13 +12,13 @@ import net.minecraft.core.particles.ParticleOptions; import net.minecraft.sound.BiomeAdditionsSound; import net.minecraft.sound.BiomeMoodSound; import net.minecraft.sound.MusicSound; -import net.minecraft.sound.SoundEvent; +import net.minecraft.sounds.SoundEvent; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import net.minecraft.core.Registry; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.Biome.Category; -import net.minecraft.world.biome.Biome.Precipitation; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Biome.Category; +import net.minecraft.world.level.biome.Biome.Precipitation; import net.minecraft.world.biome.BiomeEffects.Builder; import net.minecraft.world.biome.BiomeParticleConfig; import net.minecraft.world.biome.GenerationSettings; @@ -28,8 +28,8 @@ import net.minecraft.world.gen.GenerationStep.Carver; import net.minecraft.world.gen.GenerationStep.Feature; import net.minecraft.world.gen.ProbabilityConfig; import net.minecraft.world.gen.carver.ConfiguredCarver; -import net.minecraft.world.gen.feature.ConfiguredFeature; -import net.minecraft.world.gen.feature.ConfiguredStructureFeature; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import net.minecraft.world.gen.surfacebuilder.ConfiguredSurfaceBuilder; import net.minecraft.world.gen.surfacebuilder.ConfiguredSurfaceBuilders; import net.minecraft.world.gen.surfacebuilder.SurfaceBuilder; @@ -119,7 +119,7 @@ public class BiomeDefinition { public BiomeDefinition addMobSpawn(EntityType type, int weight, int minGroupSize, int maxGroupSize) { ResourceLocation eID = Registry.ENTITY_TYPE.getId(type); - if (eID != Registry.ENTITY_TYPE.getDefaultId()) { + if (eID != Registry.ENTITY_TYPE.getDefaultKey()) { SpawnInfo info = new SpawnInfo(); info.type = type; info.weight = weight; diff --git a/src/main/java/ru/betterend/world/biome/EndBiome.java b/src/main/java/ru/betterend/world/biome/EndBiome.java index b01d89f0..94c553a7 100644 --- a/src/main/java/ru/betterend/world/biome/EndBiome.java +++ b/src/main/java/ru/betterend/world/biome/EndBiome.java @@ -10,7 +10,7 @@ import com.google.gson.JsonObject; import net.minecraft.resources.ResourceLocation; import net.minecraft.core.Registry; -import net.minecraft.world.biome.Biome; +import net.minecraft.world.level.biome.Biome; import ru.betterend.config.Configs; import ru.betterend.util.JsonFactory; import ru.betterend.util.StructureHelper; diff --git a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java index dff525fe..94368757 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java @@ -5,7 +5,7 @@ import java.util.Random; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.util.collection.WeightedList; import net.minecraft.core.BlockPos; -import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.registry.EndBiomes; import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; diff --git a/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java b/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java index 086e1a03..ea5ad1ce 100644 --- a/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java @@ -1,7 +1,7 @@ package ru.betterend.world.biome.land; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; diff --git a/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java b/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java index a63f1eba..343211dd 100644 --- a/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java @@ -3,8 +3,8 @@ package ru.betterend.world.biome.land; import net.minecraft.world.entity.EntityType; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.world.gen.GenerationStep.Feature; -import net.minecraft.world.gen.feature.ConfiguredFeatures; -import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeatures; +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; diff --git a/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java b/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java index 4e1b32c1..77f81198 100644 --- a/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java @@ -1,7 +1,7 @@ package ru.betterend.world.biome.land; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; diff --git a/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java b/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java index db5b761b..cc46c7db 100644 --- a/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java @@ -2,7 +2,7 @@ package ru.betterend.world.biome.land; import net.minecraft.world.entity.EntityType; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.BiomeDefinition; diff --git a/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java b/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java index d599bb94..9f2f2184 100644 --- a/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java @@ -1,7 +1,7 @@ package ru.betterend.world.biome.land; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; diff --git a/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java b/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java index 79f29743..69521075 100644 --- a/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java @@ -1,7 +1,7 @@ package ru.betterend.world.biome.land; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; diff --git a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java index e888b454..5ffd7775 100644 --- a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java @@ -1,7 +1,7 @@ package ru.betterend.world.biome.land; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; diff --git a/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java b/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java index 705b18a2..9332aa0e 100644 --- a/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java @@ -2,7 +2,7 @@ package ru.betterend.world.biome.land; import net.minecraft.world.entity.EntityType; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; diff --git a/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java b/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java index 59547453..0ee6a1f5 100644 --- a/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java @@ -2,7 +2,7 @@ package ru.betterend.world.biome.land; import net.minecraft.world.entity.EntityType; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; diff --git a/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java b/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java index 2ded7681..29c8e5eb 100644 --- a/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java @@ -1,7 +1,7 @@ package ru.betterend.world.biome.land; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; diff --git a/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java b/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java index ad97e5c2..16658b53 100644 --- a/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java +++ b/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java @@ -6,10 +6,10 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.gen.surfacebuilder.SurfaceConfig; import net.minecraft.world.gen.surfacebuilder.TernarySurfaceConfig; import ru.betterend.noise.OpenSimplexNoise; @@ -28,10 +28,10 @@ public class BiomeIslandFeature extends DefaultFeature { private static BlockState underBlock = Blocks.DIRT.defaultBlockState(); @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { Biome biome = world.getBiome(pos); - SurfaceConfig surfaceConfig = biome.getGenerationSettings().getSurfaceConfig(); + SurfaceConfig surfaceConfig = biome.getGenerationSettings().getSurfaceBuilderConfig(); BlockState topMaterial = surfaceConfig.getTopMaterial(); if (BlocksHelper.isFluid(topMaterial)) { topBlock = ((TernarySurfaceConfig) surfaceConfig).getUnderwaterMaterial(); diff --git a/src/main/java/ru/betterend/world/features/BlueVineFeature.java b/src/main/java/ru/betterend/world/features/BlueVineFeature.java index 861cc1e2..b74d5057 100644 --- a/src/main/java/ru/betterend/world/features/BlueVineFeature.java +++ b/src/main/java/ru/betterend/world/features/BlueVineFeature.java @@ -3,7 +3,7 @@ package ru.betterend.world.features; import java.util.Random; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; @@ -17,8 +17,7 @@ public class BlueVineFeature extends ScatterFeature { } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, - float radius) { + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { float d = MHelper.length(center.getX() - blockPos.getX(), center.getZ() - blockPos.getZ()) / radius * 0.6F + random.nextFloat() * 0.4F; small = d > 0.5F; @@ -26,7 +25,7 @@ public class BlueVineFeature extends ScatterFeature { } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { + public void place(WorldGenLevel world, Random random, BlockPos blockPos) { if (small) { BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.BLUE_VINE_SEED.defaultBlockState().with(EndPlantWithAgeBlock.AGE, random.nextInt(4))); diff --git a/src/main/java/ru/betterend/world/features/CavePlantFeature.java b/src/main/java/ru/betterend/world/features/CavePlantFeature.java index e3e21ded..63c6b393 100644 --- a/src/main/java/ru/betterend/world/features/CavePlantFeature.java +++ b/src/main/java/ru/betterend/world/features/CavePlantFeature.java @@ -4,7 +4,7 @@ import java.util.Random; import net.minecraft.world.level.block.Block; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.util.BlocksHelper; public class CavePlantFeature extends FullHeightScatterFeature { @@ -16,13 +16,12 @@ public class CavePlantFeature extends FullHeightScatterFeature { } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, - float radius) { + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { return plant.canPlaceAt(world.getBlockState(blockPos), world, blockPos); } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { + public void place(WorldGenLevel world, Random random, BlockPos blockPos) { BlocksHelper.setWithoutUpdate(world, blockPos, plant); } } diff --git a/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java b/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java index 65c5aef3..83e477e7 100644 --- a/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java +++ b/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java @@ -3,9 +3,9 @@ package ru.betterend.world.features; import java.util.Random; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.BlockProperties; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -13,8 +13,8 @@ import ru.betterend.util.BlocksHelper; public class CavePumpkinFeature extends DefaultFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { if (!world.getBlockState(pos.up()).isIn(EndTags.GEN_TERRAIN) || !world.isAir(pos) || !world.isAir(pos.below())) { return false; diff --git a/src/main/java/ru/betterend/world/features/CrashedShipFeature.java b/src/main/java/ru/betterend/world/features/CrashedShipFeature.java index 0b474328..4ac58a3b 100644 --- a/src/main/java/ru/betterend/world/features/CrashedShipFeature.java +++ b/src/main/java/ru/betterend/world/features/CrashedShipFeature.java @@ -16,10 +16,10 @@ import net.minecraft.world.level.block.Rotation; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.WorldView; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; @@ -31,7 +31,7 @@ public class CrashedShipFeature extends NBTStructureFeature { private Structure structure; @Override - protected Structure getStructure(StructureWorldAccess world, BlockPos pos, Random random) { + protected Structure getStructure(WorldGenLevel world, BlockPos pos, Random random) { if (structure == null) { structure = world.toServerWorld().getStructureManager() .getStructureOrBlank(new ResourceLocation("end_city/ship")); @@ -43,7 +43,7 @@ public class CrashedShipFeature extends NBTStructureFeature { } @Override - protected boolean canSpawn(StructureWorldAccess world, BlockPos pos, Random random) { + protected boolean canSpawn(WorldGenLevel world, BlockPos pos, Random random) { long x = pos.getX() >> 4; long z = pos.getX() >> 4; if (x * x + z * z < 3600) { @@ -53,30 +53,30 @@ public class CrashedShipFeature extends NBTStructureFeature { } @Override - protected Rotation getRotation(StructureWorldAccess world, BlockPos pos, Random random) { + protected Rotation getRotation(WorldGenLevel world, BlockPos pos, Random random) { return Rotation.random(random); } @Override - protected BlockMirror getMirror(StructureWorldAccess world, BlockPos pos, Random random) { + protected BlockMirror getMirror(WorldGenLevel world, BlockPos pos, Random random) { return BlockMirror.values()[random.nextInt(3)]; } @Override - protected int getYOffset(Structure structure, StructureWorldAccess world, BlockPos pos, Random random) { + protected int getYOffset(Structure structure, WorldGenLevel world, BlockPos pos, Random random) { int min = structure.getSize().getY() >> 3; int max = structure.getSize().getY() >> 2; return -MHelper.randRange(min, max, random); } @Override - protected TerrainMerge getTerrainMerge(StructureWorldAccess world, BlockPos pos, Random random) { + protected TerrainMerge getTerrainMerge(WorldGenLevel world, BlockPos pos, Random random) { return TerrainMerge.NONE; } @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, - DefaultFeatureConfig featureConfig) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, + NoneFeatureConfiguration featureConfig) { center = new BlockPos(((center.getX() >> 4) << 4) | 8, 128, ((center.getZ() >> 4) << 4) | 8); center = getGround(world, center); BlockBox bounds = makeBox(center); diff --git a/src/main/java/ru/betterend/world/features/DefaultFeature.java b/src/main/java/ru/betterend/world/features/DefaultFeature.java index 1c9dd59e..ede487d5 100644 --- a/src/main/java/ru/betterend/world/features/DefaultFeature.java +++ b/src/main/java/ru/betterend/world/features/DefaultFeature.java @@ -1,44 +1,44 @@ package ru.betterend.world.features; +import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; import net.minecraft.core.BlockPos; -import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.util.BlocksHelper; -public abstract class DefaultFeature extends Feature { +public abstract class DefaultFeature extends Feature { protected static final BlockState AIR = Blocks.AIR.defaultBlockState(); protected static final BlockState WATER = Blocks.WATER.defaultBlockState(); public DefaultFeature() { - super(DefaultFeatureConfig.CODEC); + super(NoneFeatureConfiguration.CODEC); } - public static int getYOnSurface(StructureWorldAccess world, int x, int z) { - return world.getTopY(Type.WORLD_SURFACE, x, z); + public static int getYOnSurface(WorldGenLevel world, int x, int z) { + return world.getHeight(Types.WORLD_SURFACE, x, z); } - public static int getYOnSurfaceWG(StructureWorldAccess world, int x, int z) { - return world.getTopY(Type.WORLD_SURFACE_WG, x, z); + public static int getYOnSurfaceWG(WorldGenLevel world, int x, int z) { + return world.getHeight(Types.WORLD_SURFACE_WG, x, z); } - public static BlockPos getPosOnSurface(StructureWorldAccess world, BlockPos pos) { - return world.getTopPosition(Type.WORLD_SURFACE, pos); + public static BlockPos getPosOnSurface(WorldGenLevel world, BlockPos pos) { + return world.getHeightmapPos(Types.WORLD_SURFACE, pos); } - public static BlockPos getPosOnSurfaceWG(StructureWorldAccess world, BlockPos pos) { - return world.getTopPosition(Type.WORLD_SURFACE_WG, pos); + public static BlockPos getPosOnSurfaceWG(WorldGenLevel world, BlockPos pos) { + return world.getHeightmapPos(Types.WORLD_SURFACE_WG, pos); } - public static BlockPos getPosOnSurfaceRaycast(StructureWorldAccess world, BlockPos pos) { + public static BlockPos getPosOnSurfaceRaycast(WorldGenLevel world, BlockPos pos) { return getPosOnSurfaceRaycast(world, pos, 256); } - public static BlockPos getPosOnSurfaceRaycast(StructureWorldAccess world, BlockPos pos, int dist) { + public static BlockPos getPosOnSurfaceRaycast(WorldGenLevel world, BlockPos pos, int dist) { int h = BlocksHelper.downRay(world, pos, dist); - return pos.down(h); + return pos.below(h); } } diff --git a/src/main/java/ru/betterend/world/features/DoublePlantFeature.java b/src/main/java/ru/betterend/world/features/DoublePlantFeature.java index 7dcaba6c..38bdabb6 100644 --- a/src/main/java/ru/betterend/world/features/DoublePlantFeature.java +++ b/src/main/java/ru/betterend/world/features/DoublePlantFeature.java @@ -5,7 +5,7 @@ import java.util.Random; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.basis.DoublePlantBlock; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; @@ -22,8 +22,7 @@ public class DoublePlantFeature extends ScatterFeature { } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, - float radius) { + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { float d = MHelper.length(center.getX() - blockPos.getX(), center.getZ() - blockPos.getZ()) / radius * 0.6F + random.nextFloat() * 0.4F; plant = d < 0.5F ? largePlant : smallPlant; @@ -31,7 +30,7 @@ public class DoublePlantFeature extends ScatterFeature { } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { + public void place(WorldGenLevel world, Random random, BlockPos blockPos) { if (plant instanceof DoublePlantBlock) { int rot = random.nextInt(4); BlockState state = plant.defaultBlockState().with(DoublePlantBlock.ROTATION, rot); diff --git a/src/main/java/ru/betterend/world/features/EndFeature.java b/src/main/java/ru/betterend/world/features/EndFeature.java index 49a5755c..ac26405d 100644 --- a/src/main/java/ru/betterend/world/features/EndFeature.java +++ b/src/main/java/ru/betterend/world/features/EndFeature.java @@ -5,19 +5,19 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; import net.minecraft.structure.rule.BlockMatchRuleTest; import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.registry.BuiltinRegistries; +import net.minecraft.data.BuiltinRegistries; import net.minecraft.core.Registry; import net.minecraft.world.gen.CountConfig; import net.minecraft.world.gen.GenerationStep; import net.minecraft.world.gen.decorator.ChanceDecoratorConfig; import net.minecraft.world.gen.decorator.Decorator; import net.minecraft.world.gen.decorator.RangeDecoratorConfig; -import net.minecraft.world.gen.feature.ConfiguredFeature; -import net.minecraft.world.gen.feature.ConfiguredFeatures; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.Feature; -import net.minecraft.world.gen.feature.FeatureConfig; -import net.minecraft.world.gen.feature.OreFeatureConfig; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeatures; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeatureConfig; +import net.minecraft.world.level.levelgen.feature.OreFeatureConfig; import ru.betterend.BetterEnd; import ru.betterend.blocks.complex.StoneMaterial; import ru.betterend.world.features.terrain.OreLayerFeature; @@ -37,7 +37,7 @@ public class EndFeature { this.featureConfigured = configuredFeature; } - public EndFeature(String name, Feature feature, GenerationStep.Feature featureStep, + public EndFeature(String name, Feature feature, GenerationStep.Feature featureStep, ConfiguredFeature configuredFeature) { ResourceLocation id = BetterEnd.makeID(name); this.featureStep = featureStep; @@ -45,7 +45,7 @@ public class EndFeature { this.featureConfigured = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, configuredFeature); } - public EndFeature(String name, Feature feature) { + public EndFeature(String name, Feature feature) { ResourceLocation id = BetterEnd.makeID(name); this.featureStep = GenerationStep.Feature.VEGETAL_DECORATION; this.feature = Registry.register(Registry.FEATURE, id, feature); @@ -53,7 +53,7 @@ public class EndFeature { .configure(FeatureConfig.DEFAULT).decorate(Decorator.CHANCE.configure(new ChanceDecoratorConfig(100)))); } - public EndFeature(String name, Feature feature, int density) { + public EndFeature(String name, Feature feature, int density) { ResourceLocation id = BetterEnd.makeID(name); this.featureStep = GenerationStep.Feature.VEGETAL_DECORATION; this.feature = Registry.register(Registry.FEATURE, id, feature); @@ -62,13 +62,13 @@ public class EndFeature { .repeatRandomly(density)); } - public static EndFeature makeRawGenFeature(String name, Feature feature, int chance) { + public static EndFeature makeRawGenFeature(String name, Feature feature, int chance) { ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT) .decorate(Decorator.CHANCE.configure(new ChanceDecoratorConfig(chance))); return new EndFeature(name, feature, GenerationStep.Feature.RAW_GENERATION, configured); } - public static EndFeature makeLakeFeature(String name, Feature feature, int chance) { + public static EndFeature makeLakeFeature(String name, Feature feature, int chance) { ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT) .decorate(Decorator.WATER_LAKE.configure(new ChanceDecoratorConfig(chance))); return new EndFeature(name, feature, GenerationStep.Feature.LAKES, configured); @@ -113,25 +113,25 @@ public class EndFeature { return new EndFeature(name, layer, GenerationStep.Feature.UNDERGROUND_ORES, configured); } - public static EndFeature makeChunkFeature(String name, Feature feature) { + public static EndFeature makeChunkFeature(String name, Feature feature) { ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT) .decorate(Decorator.COUNT.configure(new CountConfig(1))); return new EndFeature(name, feature, GenerationStep.Feature.LOCAL_MODIFICATIONS, configured); } - public static EndFeature makeChansedFeature(String name, Feature feature, int chance) { + public static EndFeature makeChansedFeature(String name, Feature feature, int chance) { ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT) .decorate(Decorator.CHANCE.configure(new ChanceDecoratorConfig(chance))); return new EndFeature(name, feature, GenerationStep.Feature.SURFACE_STRUCTURES, configured); } - public static EndFeature makeCountRawFeature(String name, Feature feature, int chance) { + public static EndFeature makeCountRawFeature(String name, Feature feature, int chance) { ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT) .decorate(Decorator.COUNT.configure(new CountConfig(chance))); return new EndFeature(name, feature, GenerationStep.Feature.RAW_GENERATION, configured); } - public static EndFeature makeFeatureConfigured(String name, Feature feature) { + public static EndFeature makeFeatureConfigured(String name, Feature feature) { ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT); return new EndFeature(name, feature, GenerationStep.Feature.RAW_GENERATION, configured); } diff --git a/src/main/java/ru/betterend/world/features/EndLilyFeature.java b/src/main/java/ru/betterend/world/features/EndLilyFeature.java index a97d377a..598a3afc 100644 --- a/src/main/java/ru/betterend/world/features/EndLilyFeature.java +++ b/src/main/java/ru/betterend/world/features/EndLilyFeature.java @@ -3,7 +3,7 @@ package ru.betterend.world.features; import java.util.Random; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.EndLilySeedBlock; import ru.betterend.registry.EndBlocks; @@ -13,7 +13,7 @@ public class EndLilyFeature extends UnderwaterPlantScatter { } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { + public void place(WorldGenLevel world, Random random, BlockPos blockPos) { EndLilySeedBlock seed = (EndLilySeedBlock) EndBlocks.END_LILY_SEED; seed.grow(world, random, blockPos); } diff --git a/src/main/java/ru/betterend/world/features/EndLotusFeature.java b/src/main/java/ru/betterend/world/features/EndLotusFeature.java index 3cf060e4..6de29310 100644 --- a/src/main/java/ru/betterend/world/features/EndLotusFeature.java +++ b/src/main/java/ru/betterend/world/features/EndLotusFeature.java @@ -3,7 +3,7 @@ package ru.betterend.world.features; import java.util.Random; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.EndLotusSeedBlock; import ru.betterend.registry.EndBlocks; @@ -13,7 +13,7 @@ public class EndLotusFeature extends UnderwaterPlantScatter { } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { + public void place(WorldGenLevel world, Random random, BlockPos blockPos) { EndLotusSeedBlock seed = (EndLotusSeedBlock) EndBlocks.END_LOTUS_SEED; seed.grow(world, random, blockPos); } diff --git a/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java b/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java index 0264ccc4..3ea237c6 100644 --- a/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java +++ b/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java @@ -7,7 +7,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.EndLotusLeafBlock; import ru.betterend.registry.EndBlocks; @@ -19,7 +19,7 @@ public class EndLotusLeafFeature extends ScatterFeature { } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { + public void place(WorldGenLevel world, Random random, BlockPos blockPos) { if (canGenerate(world, blockPos)) { generateLeaf(world, blockPos); } @@ -31,11 +31,11 @@ public class EndLotusLeafFeature extends ScatterFeature { } @Override - protected BlockPos getCenterGround(StructureWorldAccess world, BlockPos pos) { + protected BlockPos getCenterGround(WorldGenLevel world, BlockPos pos) { return getPosOnSurface(world, pos); } - private void generateLeaf(StructureWorldAccess world, BlockPos pos) { + private void generateLeaf(WorldGenLevel world, BlockPos pos) { MutableBlockPos p = new MutableBlockPos(); BlockState leaf = EndBlocks.END_LOTUS_LEAF.defaultBlockState(); BlocksHelper.setWithoutUpdate(world, pos, leaf.with(EndLotusLeafBlock.SHAPE, TripleShape.BOTTOM)); @@ -51,7 +51,7 @@ public class EndLotusLeafFeature extends ScatterFeature { } } - private boolean canGenerate(StructureWorldAccess world, BlockPos pos) { + private boolean canGenerate(WorldGenLevel world, BlockPos pos) { MutableBlockPos p = new MutableBlockPos(); p.setY(pos.getY()); int count = 0; @@ -67,8 +67,7 @@ public class EndLotusLeafFeature extends ScatterFeature { } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, - float radius) { + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { return world.isAir(blockPos) && world.getBlockState(blockPos.below()).is(Blocks.WATER); } } diff --git a/src/main/java/ru/betterend/world/features/FilaluxFeature.java b/src/main/java/ru/betterend/world/features/FilaluxFeature.java index 80b0505a..e263c2f5 100644 --- a/src/main/java/ru/betterend/world/features/FilaluxFeature.java +++ b/src/main/java/ru/betterend/world/features/FilaluxFeature.java @@ -6,7 +6,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.state.property.Properties; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.registry.EndBlocks; @@ -19,7 +19,7 @@ public class FilaluxFeature extends SkyScatterFeature { } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { + public void place(WorldGenLevel world, Random random, BlockPos blockPos) { BlockState vine = EndBlocks.FILALUX.defaultBlockState(); BlockState wings = EndBlocks.FILALUX_WINGS.defaultBlockState(); BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.FILALUX_LANTERN); diff --git a/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java b/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java index a188df4c..7253dd35 100644 --- a/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java @@ -5,9 +5,9 @@ import java.util.Random; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.Heightmap; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; @@ -19,14 +19,14 @@ public abstract class FullHeightScatterFeature extends DefaultFeature { this.radius = radius; } - public abstract boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, + public abstract boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius); - public abstract void generate(StructureWorldAccess world, Random random, BlockPos blockPos); + public abstract void place(WorldGenLevel world, Random random, BlockPos blockPos); @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, - DefaultFeatureConfig featureConfig) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, + NoneFeatureConfiguration featureConfig) { int maxY = world.getTopY(Heightmap.Type.WORLD_SURFACE_WG, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); for (int y = maxY; y > minY; y--) { diff --git a/src/main/java/ru/betterend/world/features/GlowPillarFeature.java b/src/main/java/ru/betterend/world/features/GlowPillarFeature.java index 0afd2944..f63576e4 100644 --- a/src/main/java/ru/betterend/world/features/GlowPillarFeature.java +++ b/src/main/java/ru/betterend/world/features/GlowPillarFeature.java @@ -3,7 +3,7 @@ package ru.betterend.world.features; import java.util.Random; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; @@ -13,13 +13,12 @@ public class GlowPillarFeature extends ScatterFeature { } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, - float radius) { + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { return EndBlocks.GLOWING_PILLAR_SEED.canPlaceAt(AIR, world, blockPos); } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { + public void place(WorldGenLevel world, Random random, BlockPos blockPos) { EndPlantWithAgeBlock seed = ((EndPlantWithAgeBlock) EndBlocks.GLOWING_PILLAR_SEED); seed.growAdult(world, random, blockPos); } diff --git a/src/main/java/ru/betterend/world/features/HydraluxFeature.java b/src/main/java/ru/betterend/world/features/HydraluxFeature.java index 3b27ddf7..a4004fee 100644 --- a/src/main/java/ru/betterend/world/features/HydraluxFeature.java +++ b/src/main/java/ru/betterend/world/features/HydraluxFeature.java @@ -3,7 +3,7 @@ package ru.betterend.world.features; import java.util.Random; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.HydraluxSaplingBlock; import ru.betterend.registry.EndBlocks; @@ -13,7 +13,7 @@ public class HydraluxFeature extends UnderwaterPlantScatter { } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { + public void place(WorldGenLevel world, Random random, BlockPos blockPos) { HydraluxSaplingBlock seed = (HydraluxSaplingBlock) EndBlocks.HYDRALUX_SAPLING; seed.grow(world, random, blockPos); } diff --git a/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java b/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java index 6f4b3dc0..fd900d57 100644 --- a/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java @@ -5,9 +5,9 @@ import java.util.Random; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.Heightmap; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; @@ -19,14 +19,14 @@ public abstract class InvertedScatterFeature extends DefaultFeature { this.radius = radius; } - public abstract boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, + public abstract boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius); - public abstract void generate(StructureWorldAccess world, Random random, BlockPos blockPos); + public abstract void place(WorldGenLevel world, Random random, BlockPos blockPos); @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, - DefaultFeatureConfig featureConfig) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, + NoneFeatureConfiguration featureConfig) { int maxY = world.getTopY(Heightmap.Type.WORLD_SURFACE, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); for (int y = maxY; y > minY; y--) { diff --git a/src/main/java/ru/betterend/world/features/LanceleafFeature.java b/src/main/java/ru/betterend/world/features/LanceleafFeature.java index 2223c3c1..aaff0656 100644 --- a/src/main/java/ru/betterend/world/features/LanceleafFeature.java +++ b/src/main/java/ru/betterend/world/features/LanceleafFeature.java @@ -3,7 +3,7 @@ package ru.betterend.world.features; import java.util.Random; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; @@ -13,13 +13,12 @@ public class LanceleafFeature extends ScatterFeature { } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, - float radius) { + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { return EndBlocks.LANCELEAF_SEED.canPlaceAt(AIR, world, blockPos); } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { + public void place(WorldGenLevel world, Random random, BlockPos blockPos) { EndPlantWithAgeBlock seed = ((EndPlantWithAgeBlock) EndBlocks.LANCELEAF_SEED); seed.growAdult(world, random, blockPos); } diff --git a/src/main/java/ru/betterend/world/features/ListFeature.java b/src/main/java/ru/betterend/world/features/ListFeature.java index bc4dcf0c..69c2dd13 100644 --- a/src/main/java/ru/betterend/world/features/ListFeature.java +++ b/src/main/java/ru/betterend/world/features/ListFeature.java @@ -8,7 +8,7 @@ import net.minecraft.structure.StructurePlacementData; import net.minecraft.util.BlockMirror; import net.minecraft.world.level.block.Rotation; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.registry.EndTags; import ru.betterend.util.StructureHelper; @@ -21,35 +21,35 @@ public class ListFeature extends NBTStructureFeature { } @Override - protected Structure getStructure(StructureWorldAccess world, BlockPos pos, Random random) { + protected Structure getStructure(WorldGenLevel world, BlockPos pos, Random random) { selected = list.get(random.nextInt(list.size())); return selected.getStructure(); } @Override - protected boolean canSpawn(StructureWorldAccess world, BlockPos pos, Random random) { + protected boolean canSpawn(WorldGenLevel world, BlockPos pos, Random random) { int cx = pos.getX() >> 4; int cz = pos.getZ() >> 4; return ((cx + cz) & 1) == 0 && pos.getY() > 58 && world.getBlockState(pos.below()).isIn(EndTags.GEN_TERRAIN); } @Override - protected Rotation getRotation(StructureWorldAccess world, BlockPos pos, Random random) { + protected Rotation getRotation(WorldGenLevel world, BlockPos pos, Random random) { return Rotation.random(random); } @Override - protected BlockMirror getMirror(StructureWorldAccess world, BlockPos pos, Random random) { + protected BlockMirror getMirror(WorldGenLevel world, BlockPos pos, Random random) { return BlockMirror.values()[random.nextInt(3)]; } @Override - protected int getYOffset(Structure structure, StructureWorldAccess world, BlockPos pos, Random random) { + protected int getYOffset(Structure structure, WorldGenLevel world, BlockPos pos, Random random) { return selected.offsetY; } @Override - protected TerrainMerge getTerrainMerge(StructureWorldAccess world, BlockPos pos, Random random) { + protected TerrainMerge getTerrainMerge(WorldGenLevel world, BlockPos pos, Random random) { return selected.terrainMerge; } diff --git a/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java b/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java index 3347ab66..5a20b737 100644 --- a/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java +++ b/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java @@ -6,7 +6,7 @@ import java.util.function.Function; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; @@ -18,7 +18,7 @@ public class MengerSpongeFeature extends UnderwaterPlantScatter { } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { + public void place(WorldGenLevel world, Random random, BlockPos blockPos) { BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.MENGER_SPONGE_WET); if (random.nextBoolean()) { for (Direction dir : BlocksHelper.DIRECTIONS) { diff --git a/src/main/java/ru/betterend/world/features/NBTStructureFeature.java b/src/main/java/ru/betterend/world/features/NBTStructureFeature.java index a8ced4bf..f3020bb6 100644 --- a/src/main/java/ru/betterend/world/features/NBTStructureFeature.java +++ b/src/main/java/ru/betterend/world/features/NBTStructureFeature.java @@ -17,10 +17,10 @@ import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.gen.surfacebuilder.SurfaceConfig; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndTags; @@ -30,21 +30,21 @@ import ru.betterend.world.processors.DestructionStructureProcessor; public abstract class NBTStructureFeature extends DefaultFeature { protected static final DestructionStructureProcessor DESTRUCTION = new DestructionStructureProcessor(); - protected abstract Structure getStructure(StructureWorldAccess world, BlockPos pos, Random random); + protected abstract Structure getStructure(WorldGenLevel world, BlockPos pos, Random random); - protected abstract boolean canSpawn(StructureWorldAccess world, BlockPos pos, Random random); + protected abstract boolean canSpawn(WorldGenLevel world, BlockPos pos, Random random); - protected abstract Rotation getRotation(StructureWorldAccess world, BlockPos pos, Random random); + protected abstract Rotation getRotation(WorldGenLevel world, BlockPos pos, Random random); - protected abstract BlockMirror getMirror(StructureWorldAccess world, BlockPos pos, Random random); + protected abstract BlockMirror getMirror(WorldGenLevel world, BlockPos pos, Random random); - protected abstract int getYOffset(Structure structure, StructureWorldAccess world, BlockPos pos, Random random); + protected abstract int getYOffset(Structure structure, WorldGenLevel world, BlockPos pos, Random random); - protected abstract TerrainMerge getTerrainMerge(StructureWorldAccess world, BlockPos pos, Random random); + protected abstract TerrainMerge getTerrainMerge(WorldGenLevel world, BlockPos pos, Random random); protected abstract void addStructureData(StructurePlacementData data); - protected BlockPos getGround(StructureWorldAccess world, BlockPos center) { + protected BlockPos getGround(WorldGenLevel world, BlockPos center) { Biome biome = world.getBiome(center); ResourceLocation id = EndBiomes.getBiomeID(biome); if (id.getNamespace().contains("moutain") || id.getNamespace().contains("lake")) { @@ -56,7 +56,7 @@ public abstract class NBTStructureFeature extends DefaultFeature { } } - protected int getAverageY(StructureWorldAccess world, BlockPos center) { + protected int getAverageY(WorldGenLevel world, BlockPos center) { int y = getYOnSurface(world, center.getX(), center.getZ()); y += getYOnSurface(world, center.getX() - 2, center.getZ() - 2); y += getYOnSurface(world, center.getX() + 2, center.getZ() - 2); @@ -65,7 +65,7 @@ public abstract class NBTStructureFeature extends DefaultFeature { return y / 5; } - protected int getAverageYWG(StructureWorldAccess world, BlockPos center) { + protected int getAverageYWG(WorldGenLevel world, BlockPos center) { int y = getYOnSurfaceWG(world, center.getX(), center.getZ()); y += getYOnSurfaceWG(world, center.getX() - 2, center.getZ() - 2); y += getYOnSurfaceWG(world, center.getX() + 2, center.getZ() - 2); @@ -75,8 +75,8 @@ public abstract class NBTStructureFeature extends DefaultFeature { } @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, - DefaultFeatureConfig featureConfig) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, + NoneFeatureConfiguration featureConfig) { center = new BlockPos(((center.getX() >> 4) << 4) | 8, 128, ((center.getZ() >> 4) << 4) | 8); center = getGround(world, center); @@ -132,7 +132,7 @@ public abstract class NBTStructureFeature extends DefaultFeature { if (!stateSt.isIn(EndTags.GEN_TERRAIN)) { if (merge == TerrainMerge.SURFACE) { SurfaceConfig config = world.getBiome(mut).getGenerationSettings() - .getSurfaceConfig(); + .getSurfaceBuilderConfig(); boolean isTop = mut.getY() == surfMax && state.getMaterial().blocksLight(); BlockState top = isTop ? config.getTopMaterial() : config.getUnderMaterial(); BlocksHelper.setWithoutUpdate(world, mut, top); @@ -143,7 +143,7 @@ public abstract class NBTStructureFeature extends DefaultFeature { if (stateSt.isIn(EndTags.END_GROUND) && state.getMaterial().blocksLight()) { if (merge == TerrainMerge.SURFACE) { SurfaceConfig config = world.getBiome(mut).getGenerationSettings() - .getSurfaceConfig(); + .getSurfaceBuilderConfig(); BlocksHelper.setWithoutUpdate(world, mut, config.getUnderMaterial()); } else { BlocksHelper.setWithoutUpdate(world, mut, state); diff --git a/src/main/java/ru/betterend/world/features/NeonCactusFeature.java b/src/main/java/ru/betterend/world/features/NeonCactusFeature.java index c38a6ce4..845e1008 100644 --- a/src/main/java/ru/betterend/world/features/NeonCactusFeature.java +++ b/src/main/java/ru/betterend/world/features/NeonCactusFeature.java @@ -6,9 +6,9 @@ import net.minecraft.state.property.Properties; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.registry.EndBlocks; @@ -17,8 +17,8 @@ import ru.betterend.util.MHelper; public class NeonCactusFeature extends DefaultFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { if (!world.getBlockState(pos.below()).is(EndBlocks.ENDSTONE_DUST)) { return false; } @@ -48,7 +48,7 @@ public class NeonCactusFeature extends DefaultFeature { return true; } - private void branch(StructureWorldAccess world, BlockPos pos, Direction dir, Random random, int length, int size) { + private void branch(WorldGenLevel world, BlockPos pos, Direction dir, Random random, int length, int size) { int rotIndex = length >> 2; MutableBlockPos mut = new MutableBlockPos().set(pos); Direction hor = BlocksHelper.randomHorizontal(random); diff --git a/src/main/java/ru/betterend/world/features/ScatterFeature.java b/src/main/java/ru/betterend/world/features/ScatterFeature.java index eed12d70..ddd6b540 100644 --- a/src/main/java/ru/betterend/world/features/ScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/ScatterFeature.java @@ -4,9 +4,9 @@ import java.util.Random; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; @@ -19,16 +19,16 @@ public abstract class ScatterFeature extends DefaultFeature { this.radius = radius; } - public abstract boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, + public abstract boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius); - public abstract void generate(StructureWorldAccess world, Random random, BlockPos blockPos); + public abstract void place(WorldGenLevel world, Random random, BlockPos blockPos); - protected BlockPos getCenterGround(StructureWorldAccess world, BlockPos pos) { + protected BlockPos getCenterGround(WorldGenLevel world, BlockPos pos) { return getPosOnSurfaceWG(world, pos); } - protected boolean canSpawn(StructureWorldAccess world, BlockPos pos) { + protected boolean canSpawn(WorldGenLevel world, BlockPos pos) { if (pos.getY() < 5) { return false; } else if (!world.getBlockState(pos.below()).isIn(EndTags.END_GROUND)) { @@ -37,7 +37,7 @@ public abstract class ScatterFeature extends DefaultFeature { return true; } - protected boolean getGroundPlant(StructureWorldAccess world, MutableBlockPos pos) { + protected boolean getGroundPlant(WorldGenLevel world, MutableBlockPos pos) { int down = BlocksHelper.downRay(world, pos, 16); if (down > Math.abs(getYOffset() * 2)) { return false; @@ -55,8 +55,8 @@ public abstract class ScatterFeature extends DefaultFeature { } @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, - DefaultFeatureConfig featureConfig) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, + NoneFeatureConfiguration featureConfig) { center = getCenterGround(world, center); if (!canSpawn(world, center)) { diff --git a/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java b/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java index ba270515..20f00833 100644 --- a/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java +++ b/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java @@ -9,9 +9,9 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.Heightmap; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.BlockProperties; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; @@ -19,7 +19,7 @@ import ru.betterend.util.BlocksHelper; public class SilkMothNestFeature extends DefaultFeature { private static final MutableBlockPos POS = new MutableBlockPos(); - private boolean canGenerate(StructureWorldAccess world, BlockPos pos) { + private boolean canGenerate(WorldGenLevel world, BlockPos pos) { BlockState state = world.getBlockState(pos.up()); if (state.isIn(BlockTags.LEAVES) || state.isIn(BlockTags.LOGS)) { state = world.getBlockState(pos); @@ -36,8 +36,8 @@ public class SilkMothNestFeature extends DefaultFeature { } @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, - DefaultFeatureConfig featureConfig) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, + NoneFeatureConfiguration featureConfig) { int maxY = world.getTopY(Heightmap.Type.WORLD_SURFACE, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); POS.set(center); diff --git a/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java b/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java index 77a6bf04..8923635a 100644 --- a/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java @@ -7,7 +7,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.state.property.Properties; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.basis.AttachedBlock; import ru.betterend.util.BlocksHelper; @@ -20,8 +20,7 @@ public class SingleInvertedScatterFeature extends InvertedScatterFeature { } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, - float radius) { + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { if (!world.isAir(blockPos)) { return false; } @@ -33,7 +32,7 @@ public class SingleInvertedScatterFeature extends InvertedScatterFeature { } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { + public void place(WorldGenLevel world, Random random, BlockPos blockPos) { BlockState state = block.defaultBlockState(); if (block instanceof AttachedBlock) { state = state.with(Properties.FACING, Direction.DOWN); diff --git a/src/main/java/ru/betterend/world/features/SinglePlantFeature.java b/src/main/java/ru/betterend/world/features/SinglePlantFeature.java index 9218691b..ef8d6fa5 100644 --- a/src/main/java/ru/betterend/world/features/SinglePlantFeature.java +++ b/src/main/java/ru/betterend/world/features/SinglePlantFeature.java @@ -5,7 +5,7 @@ import java.util.Random; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.basis.DoublePlantBlock; import ru.betterend.blocks.basis.EndCropBlock; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; @@ -40,18 +40,17 @@ public class SinglePlantFeature extends ScatterFeature { } @Override - protected BlockPos getCenterGround(StructureWorldAccess world, BlockPos pos) { + protected BlockPos getCenterGround(WorldGenLevel world, BlockPos pos) { return rawHeightmap ? getPosOnSurfaceWG(world, pos) : getPosOnSurface(world, pos); } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, - float radius) { + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { return plant.canPlaceAt(plant.defaultBlockState(), world, blockPos); } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { + public void place(WorldGenLevel world, Random random, BlockPos blockPos) { if (plant instanceof DoublePlantBlock) { int rot = random.nextInt(4); BlockState state = plant.defaultBlockState().with(DoublePlantBlock.ROTATION, rot); diff --git a/src/main/java/ru/betterend/world/features/SkyScatterFeature.java b/src/main/java/ru/betterend/world/features/SkyScatterFeature.java index 090b8314..37160826 100644 --- a/src/main/java/ru/betterend/world/features/SkyScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/SkyScatterFeature.java @@ -5,7 +5,7 @@ import java.util.Random; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; @@ -20,8 +20,7 @@ public abstract class SkyScatterFeature extends ScatterFeature { } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, - float radius) { + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { if (!world.isAir(blockPos)) { return false; } @@ -39,16 +38,16 @@ public abstract class SkyScatterFeature extends ScatterFeature { } @Override - protected boolean canSpawn(StructureWorldAccess world, BlockPos pos) { + protected boolean canSpawn(WorldGenLevel world, BlockPos pos) { return true; } @Override - protected BlockPos getCenterGround(StructureWorldAccess world, BlockPos pos) { + protected BlockPos getCenterGround(WorldGenLevel world, BlockPos pos) { return new BlockPos(pos.getX(), MHelper.randRange(32, 192, world.getRandom()), pos.getZ()); } - protected boolean getGroundPlant(StructureWorldAccess world, MutableBlockPos pos) { + protected boolean getGroundPlant(WorldGenLevel world, MutableBlockPos pos) { pos.setY(pos.getY() + MHelper.randRange(-getYOffset(), getYOffset(), world.getRandom())); return true; } diff --git a/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java b/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java index a62b4a5e..a2886e60 100644 --- a/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java +++ b/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java @@ -5,7 +5,7 @@ import java.util.Random; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.basis.DoublePlantBlock; import ru.betterend.util.BlocksHelper; @@ -18,13 +18,12 @@ public class UnderwaterPlantFeature extends UnderwaterPlantScatter { } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, - float radius) { + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { return super.canSpawn(world, blockPos) && plant.canPlaceAt(plant.defaultBlockState(), world, blockPos); } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { + public void place(WorldGenLevel world, Random random, BlockPos blockPos) { if (plant instanceof DoublePlantBlock) { int rot = random.nextInt(4); BlockState state = plant.defaultBlockState().with(DoublePlantBlock.ROTATION, rot); diff --git a/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java b/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java index d38eb537..35bf1de9 100644 --- a/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java +++ b/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java @@ -5,7 +5,7 @@ import java.util.Random; import net.minecraft.world.level.block.Blocks; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; public abstract class UnderwaterPlantScatter extends ScatterFeature { private static final MutableBlockPos POS = new MutableBlockPos(); @@ -15,26 +15,25 @@ public abstract class UnderwaterPlantScatter extends ScatterFeature { } @Override - protected BlockPos getCenterGround(StructureWorldAccess world, BlockPos pos) { + protected BlockPos getCenterGround(WorldGenLevel world, BlockPos pos) { POS.setX(pos.getX()); POS.setZ(pos.getZ()); POS.setY(0); - return getGround(world, POS).toImmutable(); + return getGround(world, POS).immutable(); } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, - float radius) { + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { return world.getBlockState(blockPos).is(Blocks.WATER); } @Override - protected boolean canSpawn(StructureWorldAccess world, BlockPos pos) { + protected boolean canSpawn(WorldGenLevel world, BlockPos pos) { return world.getBlockState(pos).is(Blocks.WATER); } @Override - protected boolean getGroundPlant(StructureWorldAccess world, MutableBlockPos pos) { + protected boolean getGroundPlant(WorldGenLevel world, MutableBlockPos pos) { return getGround(world, pos).getY() < 128; } @@ -48,7 +47,7 @@ public abstract class UnderwaterPlantScatter extends ScatterFeature { return 5; } - private BlockPos getGround(StructureWorldAccess world, MutableBlockPos pos) { + private BlockPos getGround(WorldGenLevel world, MutableBlockPos pos) { while (pos.getY() < 128 && world.getFluidState(pos).isEmpty()) { pos.setY(pos.getY() + 1); } diff --git a/src/main/java/ru/betterend/world/features/VineFeature.java b/src/main/java/ru/betterend/world/features/VineFeature.java index ec3885b2..18c8e7c7 100644 --- a/src/main/java/ru/betterend/world/features/VineFeature.java +++ b/src/main/java/ru/betterend/world/features/VineFeature.java @@ -5,7 +5,7 @@ import java.util.Random; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.VineBlock; @@ -24,14 +24,13 @@ public class VineFeature extends InvertedScatterFeature { } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, - float radius) { + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { BlockState state = world.getBlockState(blockPos); return state.getMaterial().isReplaceable() && canPlaceBlock(state, world, blockPos); } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { + public void place(WorldGenLevel world, Random random, BlockPos blockPos) { int h = BlocksHelper.downRay(world, blockPos, random.nextInt(maxLength)) - 1; if (h > 2) { BlockState top = getTopState(); @@ -45,7 +44,7 @@ public class VineFeature extends InvertedScatterFeature { } } - private boolean canPlaceBlock(BlockState state, StructureWorldAccess world, BlockPos blockPos) { + private boolean canPlaceBlock(BlockState state, WorldGenLevel world, BlockPos blockPos) { if (vine) { return ((VineBlock) vineBlock).canGenerate(state, world, blockPos); } else { diff --git a/src/main/java/ru/betterend/world/features/WallPlantFeature.java b/src/main/java/ru/betterend/world/features/WallPlantFeature.java index 24f252d8..0f34f39f 100644 --- a/src/main/java/ru/betterend/world/features/WallPlantFeature.java +++ b/src/main/java/ru/betterend/world/features/WallPlantFeature.java @@ -7,7 +7,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.state.property.Properties; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.basis.AttachedBlock; import ru.betterend.blocks.basis.EndWallPlantBlock; import ru.betterend.util.BlocksHelper; @@ -21,7 +21,7 @@ public class WallPlantFeature extends WallScatterFeature { } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos pos, Direction dir) { + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos pos, Direction dir) { if (block instanceof EndWallPlantBlock) { BlockState state = block.defaultBlockState().with(EndWallPlantBlock.FACING, dir); return block.canPlaceAt(state, world, pos); @@ -33,7 +33,7 @@ public class WallPlantFeature extends WallScatterFeature { } @Override - public void generate(StructureWorldAccess world, Random random, BlockPos pos, Direction dir) { + public void place(WorldGenLevel world, Random random, BlockPos pos, Direction dir) { BlockState state = block.defaultBlockState(); if (block instanceof EndWallPlantBlock) { state = state.with(EndWallPlantBlock.FACING, dir); diff --git a/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java b/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java index 6fb1bb71..72855bab 100644 --- a/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java +++ b/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java @@ -7,7 +7,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.tags.BlockTags; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; public class WallPlantOnLogFeature extends WallPlantFeature { public WallPlantOnLogFeature(Block block, int radius) { @@ -15,7 +15,7 @@ public class WallPlantOnLogFeature extends WallPlantFeature { } @Override - public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos pos, Direction dir) { + public boolean canGenerate(WorldGenLevel world, Random random, BlockPos pos, Direction dir) { BlockPos blockPos = pos.relative(dir.getOpposite()); BlockState blockState = world.getBlockState(blockPos); return blockState.isIn(BlockTags.LOGS); diff --git a/src/main/java/ru/betterend/world/features/WallScatterFeature.java b/src/main/java/ru/betterend/world/features/WallScatterFeature.java index 80f628ad..7528bf86 100644 --- a/src/main/java/ru/betterend/world/features/WallScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/WallScatterFeature.java @@ -6,9 +6,9 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.Heightmap; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; @@ -20,13 +20,13 @@ public abstract class WallScatterFeature extends DefaultFeature { this.radius = radius; } - public abstract boolean canGenerate(StructureWorldAccess world, Random random, BlockPos pos, Direction dir); + public abstract boolean canGenerate(WorldGenLevel world, Random random, BlockPos pos, Direction dir); - public abstract void generate(StructureWorldAccess world, Random random, BlockPos pos, Direction dir); + public abstract void place(WorldGenLevel world, Random random, BlockPos pos, Direction dir); @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, - DefaultFeatureConfig featureConfig) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, + NoneFeatureConfiguration featureConfig) { int maxY = world.getTopY(Heightmap.Type.WORLD_SURFACE, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); if (maxY < 10 || maxY < minY) { diff --git a/src/main/java/ru/betterend/world/features/bushes/BushFeature.java b/src/main/java/ru/betterend/world/features/bushes/BushFeature.java index ad884473..dbd7c83c 100644 --- a/src/main/java/ru/betterend/world/features/bushes/BushFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/BushFeature.java @@ -9,9 +9,9 @@ import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.material.Material; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; @@ -35,8 +35,8 @@ public class BushFeature extends DefaultFeature { } @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND) && !world.getBlockState(pos.up()).getBlock().isIn(EndTags.END_GROUND)) return false; @@ -46,7 +46,7 @@ public class BushFeature extends DefaultFeature { SDF sphere = new SDFSphere().setRadius(radius).setBlock(this.leaves); sphere = new SDFScale3D().setScale(1, 0.5F, 1).setSource(sphere); sphere = new SDFDisplacement().setFunction((vec) -> { - return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; + return (float) noise.eval(vec.x() * 0.2, vec.y() * 0.2, vec.z() * 0.2) * 3; }).setSource(sphere); sphere = new SDFDisplacement().setFunction((vec) -> { return MHelper.randRange(-2F, 2F, random); diff --git a/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java b/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java index 03f54c15..9f088dba 100644 --- a/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java @@ -10,9 +10,9 @@ import net.minecraft.world.level.material.Material; import net.minecraft.state.property.Properties; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; @@ -39,8 +39,8 @@ public class BushWithOuterFeature extends DefaultFeature { } @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND) && !world.getBlockState(pos.up()).getBlock().isIn(EndTags.END_GROUND)) return false; @@ -50,7 +50,7 @@ public class BushWithOuterFeature extends DefaultFeature { SDF sphere = new SDFSphere().setRadius(radius).setBlock(this.leaves); sphere = new SDFScale3D().setScale(1, 0.5F, 1).setSource(sphere); sphere = new SDFDisplacement().setFunction((vec) -> { - return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; + return (float) noise.eval(vec.x() * 0.2, vec.y() * 0.2, vec.z() * 0.2) * 3; }).setSource(sphere); sphere = new SDFDisplacement().setFunction((vec) -> { return MHelper.randRange(-2F, 2F, random); diff --git a/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java b/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java index cad1b8c7..b4794ae8 100644 --- a/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java @@ -6,9 +6,9 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.registry.EndBlocks; @@ -19,8 +19,8 @@ import ru.betterend.world.features.DefaultFeature; public class LargeAmaranitaFeature extends DefaultFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) return false; diff --git a/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java b/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java index 0dc33584..5d323765 100644 --- a/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java +++ b/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java @@ -6,9 +6,9 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.BlockProperties.LumecornShape; import ru.betterend.blocks.LumecornBlock; import ru.betterend.registry.EndBlocks; @@ -19,8 +19,8 @@ import ru.betterend.world.features.DefaultFeature; public class Lumecorn extends DefaultFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) return false; diff --git a/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java index 210fce3c..3e6edc03 100644 --- a/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java @@ -12,9 +12,9 @@ import net.minecraft.world.level.material.Material; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.FurBlock; @@ -39,8 +39,8 @@ public class TenaneaBushFeature extends DefaultFeature { } @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) return false; @@ -50,7 +50,7 @@ public class TenaneaBushFeature extends DefaultFeature { SDF sphere = new SDFSphere().setRadius(radius).setBlock(leaves); sphere = new SDFScale3D().setScale(1, 0.75F, 1).setSource(sphere); sphere = new SDFDisplacement().setFunction((vec) -> { - return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; + return (float) noise.eval(vec.x() * 0.2, vec.y() * 0.2, vec.z() * 0.2) * 3; }).setSource(sphere); sphere = new SDFDisplacement().setFunction((vec) -> { return MHelper.randRange(-2F, 2F, random); diff --git a/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java b/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java index e7f7b7ba..ec22a61f 100644 --- a/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java @@ -3,11 +3,11 @@ package ru.betterend.world.features.terrain; import java.util.Random; import net.minecraft.world.level.material.Material; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; @@ -19,8 +19,8 @@ import ru.betterend.world.features.DefaultFeature; public class BigAuroraCrystalFeature extends DefaultFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { int maxY = pos.getY() + BlocksHelper.upRay(world, pos, 16); int minY = pos.getY() - BlocksHelper.downRay(world, pos, 16); diff --git a/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java index 97d3e3b6..3231fbb6 100644 --- a/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java @@ -8,9 +8,9 @@ import net.minecraft.world.level.material.Material; import net.minecraft.fluid.FluidState; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -24,8 +24,8 @@ public class EndLakeFeature extends DefaultFeature { private static final MutableBlockPos POS = new MutableBlockPos(); @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, - DefaultFeatureConfig featureConfig) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, + NoneFeatureConfiguration featureConfig) { double radius = MHelper.randRange(10.0, 20.0, random); double depth = radius * 0.5 * MHelper.randRange(0.8, 1.2, random); int dist = MHelper.floor(radius); @@ -121,7 +121,7 @@ public class EndLakeFeature extends DefaultFeature { } pos = POS.below(); if (world.getBlockState(pos).isIn(EndTags.GEN_TERRAIN)) { - state = world.getBiome(pos).getGenerationSettings().getSurfaceConfig() + state = world.getBiome(pos).getGenerationSettings().getSurfaceBuilderConfig() .getTopMaterial(); if (y > waterLevel + 1) BlocksHelper.setWithoutUpdate(world, pos, state); @@ -183,7 +183,8 @@ public class EndLakeFeature extends DefaultFeature { // Make border else if (y < waterLevel && y2 + x2 + z2 <= rb) { if (world.isAir(POS.up())) { - state = world.getBiome(POS).getGenerationSettings().getSurfaceConfig().getTopMaterial(); + state = world.getBiome(POS).getGenerationSettings().getSurfaceBuilderConfig() + .getTopMaterial(); BlocksHelper.setWithoutUpdate(world, POS, random.nextBoolean() ? state : EndBlocks.ENDSTONE_DUST.defaultBlockState()); BlocksHelper.setWithoutUpdate(world, POS.below(), END_STONE); diff --git a/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java b/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java index 27402490..53f60237 100644 --- a/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java @@ -5,11 +5,11 @@ import java.util.Random; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.Material; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -23,8 +23,8 @@ import ru.betterend.world.features.DefaultFeature; public class FallenPillarFeature extends DefaultFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); if (!world.getBlockState(pos.down(5)).isIn(EndTags.GEN_TERRAIN)) { @@ -38,7 +38,7 @@ public class FallenPillarFeature extends DefaultFeature { pillar = new SDFTranslate().setTranslate(0, radius * 0.5F - 2, 0).setSource(pillar); OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); pillar = new SDFDisplacement().setFunction((vec) -> { - return (float) (noise.eval(vec.getX() * 0.3, vec.getY() * 0.3, vec.getZ() * 0.3) * 0.5F); + return (float) (noise.eval(vec.x() * 0.3, vec.y() * 0.3, vec.z() * 0.3) * 0.5F); }).setSource(pillar); Vector3f vec = MHelper.randomHorizontal(random); float angle = (float) random.nextGaussian() * 0.05F + (float) Math.PI; diff --git a/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java index dde3dc7c..108edf17 100644 --- a/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java @@ -8,9 +8,9 @@ import com.google.common.collect.Lists; import net.minecraft.world.level.block.Blocks; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndFeatures; @@ -21,8 +21,8 @@ import ru.betterend.util.sdf.primitive.SDFSphere; public class FloatingSpireFeature extends SpireFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { int minY = getYOnSurface(world, pos.getX(), pos.getZ()); int y = minY > 57 ? MHelper.floor(MHelper.randRange(minY, minY * 2, random) * 0.5F + 32) : MHelper.randRange(64, 192, random); @@ -42,8 +42,8 @@ public class FloatingSpireFeature extends SpireFeature { OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); sdf = new SDFDisplacement().setFunction((vec) -> { - return (float) (Math.abs(noise.eval(vec.getX() * 0.1, vec.getY() * 0.1, vec.getZ() * 0.1)) * 3F - + Math.abs(noise.eval(vec.getX() * 0.3, vec.getY() * 0.3 + 100, vec.getZ() * 0.3)) * 1.3F); + return (float) (Math.abs(noise.eval(vec.x() * 0.1, vec.y() * 0.1, vec.z() * 0.1)) * 3F + + Math.abs(noise.eval(vec.x() * 0.3, vec.y() * 0.3 + 100, vec.z() * 0.3)) * 1.3F); }).setSource(sdf); final BlockPos center = pos; List support = Lists.newArrayList(); @@ -52,9 +52,10 @@ public class FloatingSpireFeature extends SpireFeature { if (random.nextInt(16) == 0) { support.add(info.getPos().up()); } - return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceConfig().getTopMaterial(); + return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); } else if (info.getState(Direction.UP, 3).isAir()) { - return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceConfig().getUnderMaterial(); + return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceBuilderConfig() + .getUnderMaterial(); } return info.getState(); }); @@ -62,7 +63,7 @@ public class FloatingSpireFeature extends SpireFeature { support.forEach((bpos) -> { if (EndBiomes.getFromBiome(world.getBiome(bpos)) == EndBiomes.BLOSSOMING_SPIRES) { - EndFeatures.TENANEA_BUSH.getFeature().generate(world, chunkGenerator, random, bpos, null); + EndFeatures.TENANEA_BUSH.getFeature().place(world, chunkGenerator, random, bpos, null); } }); diff --git a/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java b/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java index 04899d98..4ee5f97f 100644 --- a/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java @@ -7,14 +7,14 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.HorizontalFacingBlock; import net.minecraft.world.level.material.Material; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.util.Mth; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.HydrothermalVentBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; @@ -45,8 +45,8 @@ public class GeyserFeature extends DefaultFeature { private static final Direction[] HORIZONTAL = BlocksHelper.makeHorizontal(); @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { pos = getPosOnSurfaceWG(world, pos); if (pos.getY() < 10) { @@ -96,9 +96,9 @@ public class GeyserFeature extends DefaultFeature { final OpenSimplexNoise noise2 = new OpenSimplexNoise(random.nextLong()); bowl = new SDFCoordModify().setFunction((vec) -> { - float dx = (float) noise1.eval(vec.getX() * 0.1, vec.getY() * 0.1, vec.getZ() * 0.1); - float dz = (float) noise2.eval(vec.getX() * 0.1, vec.getY() * 0.1, vec.getZ() * 0.1); - vec.set(vec.getX() + dx, vec.getY(), vec.getZ() + dz); + float dx = (float) noise1.eval(vec.x() * 0.1, vec.y() * 0.1, vec.z() * 0.1); + float dz = (float) noise2.eval(vec.x() * 0.1, vec.y() * 0.1, vec.z() * 0.1); + vec.set(vec.x() + dx, vec.y(), vec.z() + dz); }).setSource(bowl); SDF cut = new SDFFlatland().setBlock(Blocks.AIR); @@ -124,13 +124,13 @@ public class GeyserFeature extends DefaultFeature { obj1 = new SDFCappedCone().setHeight(halfHeight + 5).setRadius1(radius1 * 0.5F).setRadius2(radius2); sdf = new SDFTranslate().setTranslate(0, halfHeight - 13, 0).setSource(obj1); sdf = new SDFDisplacement().setFunction((vec) -> { - return (float) noise.eval(vec.getX() * 0.3F, vec.getY() * 0.3F, vec.getZ() * 0.3F) * 0.5F; + return (float) noise.eval(vec.x() * 0.3F, vec.y() * 0.3F, vec.z() * 0.3F) * 0.5F; }).setSource(sdf); obj2 = new SDFSphere().setRadius(radius1); SDF cave = new SDFScale3D().setScale(1.5F, 1, 1.5F).setSource(obj2); cave = new SDFDisplacement().setFunction((vec) -> { - return (float) noise.eval(vec.getX() * 0.1F, vec.getY() * 0.1F, vec.getZ() * 0.1F) * 2F; + return (float) noise.eval(vec.x() * 0.1F, vec.y() * 0.1F, vec.z() * 0.1F) * 2F; }).setSource(cave); cave = new SDFTranslate().setTranslate(0, -halfHeight - 10, 0).setSource(cave); @@ -238,7 +238,7 @@ public class GeyserFeature extends DefaultFeature { } } - EndFeatures.SULPHURIC_LAKE.getFeature().generate(world, chunkGenerator, random, pos, null); + EndFeatures.SULPHURIC_LAKE.getFeature().place(world, chunkGenerator, random, pos, null); double distance = radius1 * 1.7; BlockPos start = pos.offset(-distance, -halfHeight - 15 - distance, -distance); diff --git a/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java b/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java index 52f6def7..a1db3934 100644 --- a/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java @@ -5,11 +5,11 @@ import java.util.List; import java.util.Random; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; import ru.betterend.util.sdf.SDF; @@ -33,8 +33,8 @@ public class IceStarFeature extends DefaultFeature { } @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { float size = MHelper.randRange(minSize, maxSize, random); int count = MHelper.randRange(minCount, maxCount, random); List points = getFibonacciPoints(count); diff --git a/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java b/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java index 0cc228d1..815e810c 100644 --- a/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java @@ -6,9 +6,9 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.Material; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -21,8 +21,8 @@ import ru.betterend.world.features.DefaultFeature; public class ObsidianBoulderFeature extends DefaultFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); if (!world.getBlockState(pos.below()).isIn(EndTags.END_GROUND)) { @@ -39,7 +39,7 @@ public class ObsidianBoulderFeature extends DefaultFeature { return true; } - private void makeBoulder(StructureWorldAccess world, BlockPos pos, Random random) { + private void makeBoulder(WorldGenLevel world, BlockPos pos, Random random) { if (!world.getBlockState(pos.below()).isIn(EndTags.END_GROUND)) { return; } @@ -52,7 +52,7 @@ public class ObsidianBoulderFeature extends DefaultFeature { sphere = new SDFScale3D().setScale(sx, sy, sz).setSource(sphere); OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); sphere = new SDFDisplacement().setFunction((vec) -> { - return (float) (noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 1.5F); + return (float) (noise.eval(vec.x() * 0.2, vec.y() * 0.2, vec.z() * 0.2) * 1.5F); }).setSource(sphere); BlockState mossy = EndBlocks.MOSSY_OBSIDIAN.defaultBlockState(); diff --git a/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java b/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java index 75fc5f22..08067b32 100644 --- a/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java @@ -5,11 +5,11 @@ import java.util.Random; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.Material; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -25,8 +25,8 @@ import ru.betterend.world.features.DefaultFeature; public class ObsidianPillarBasementFeature extends DefaultFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); if (!world.getBlockState(pos.down(5)).isIn(EndTags.GEN_TERRAIN)) { @@ -41,7 +41,7 @@ public class ObsidianPillarBasementFeature extends DefaultFeature { SDF cut = new SDFFlatland().setBlock(Blocks.OBSIDIAN); OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); cut = new SDFDisplacement().setFunction((vec) -> { - return (float) (noise.eval(vec.getX() * 0.2, vec.getZ() * 0.2) * 3); + return (float) (noise.eval(vec.x() * 0.2, vec.z() * 0.2) * 3); }).setSource(cut); Vector3f vec = MHelper.randomHorizontal(random); float angle = random.nextFloat() * 0.5F + (float) Math.PI; diff --git a/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java b/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java index 36766726..cd73b096 100644 --- a/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java @@ -5,9 +5,9 @@ import java.util.Random; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; import ru.betterend.util.sdf.SDF; @@ -35,8 +35,8 @@ public class OreLayerFeature extends DefaultFeature { } @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { float radius = this.radius * 0.5F; int r = MHelper.floor(radius + 1); int posX = MHelper.randRange(Math.max(r - 16, 0), Math.min(31 - r, 15), random) + pos.getX(); @@ -49,10 +49,10 @@ public class OreLayerFeature extends DefaultFeature { SPHERE.setRadius(radius).setBlock(state); NOISE.setFunction((vec) -> { - double x = (vec.getX() + pos.getX()) * 0.1; - double z = (vec.getZ() + pos.getZ()) * 0.1; + double x = (vec.x() + pos.getX()) * 0.1; + double z = (vec.z() + pos.getZ()) * 0.1; double offset = noise.eval(x, z); - vec.set(vec.getX(), vec.getY() + (float) offset * 8, vec.getZ()); + vec.set(vec.x(), vec.y() + (float) offset * 8, vec.z()); }); FUNCTION.fillRecursive(world, new BlockPos(posX, posY, posZ)); return true; diff --git a/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java b/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java index a13e5821..08f7c648 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java @@ -6,9 +6,9 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.state.property.Properties; import net.minecraft.core.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; import ru.betterend.world.features.DefaultFeature; @@ -21,8 +21,8 @@ public class SingleBlockFeature extends DefaultFeature { } @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { if (!world.getBlockState(pos.below()).isIn(EndTags.GEN_TERRAIN)) { return false; } diff --git a/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java b/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java index 466bd242..6397ca07 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java @@ -6,9 +6,9 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.state.property.Properties; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; @@ -17,8 +17,8 @@ import ru.betterend.world.features.DefaultFeature; public class SmaragdantCrystalFeature extends DefaultFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { if (!world.getBlockState(pos.below()).isIn(EndTags.GEN_TERRAIN)) { return false; } diff --git a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java index 6f6824ab..30617675 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java @@ -9,12 +9,12 @@ import com.google.common.collect.Lists; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.material.Material; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndFeatures; @@ -31,11 +31,11 @@ public class SpireFeature extends DefaultFeature { protected static final Function REPLACE; @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { pos = getPosOnSurfaceWG(world, pos); - if (pos.getY() < 10 || !world.getBlockState(pos.down(3)).isIn(EndTags.GEN_TERRAIN) - || !world.getBlockState(pos.down(6)).isIn(EndTags.GEN_TERRAIN)) { + if (pos.getY() < 10 || !world.getBlockState(pos.below(3)).is(EndTags.GEN_TERRAIN) + || !world.getBlockState(pos.below(6)).is(EndTags.GEN_TERRAIN)) { return false; } @@ -46,27 +46,28 @@ public class SpireFeature extends DefaultFeature { sdf = addSegment(sdf, MHelper.randRange(rMin, rMin + 1.5F, random), random); } OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); - sdf = new SDFDisplacement().setFunction((vec) -> { - return (float) (Math.abs(noise.eval(vec.getX() * 0.1, vec.getY() * 0.1, vec.getZ() * 0.1)) * 3F - + Math.abs(noise.eval(vec.getX() * 0.3, vec.getY() * 0.3 + 100, vec.getZ() * 0.3)) * 1.3F); + sdf = new SDFDisplacement().setFunction(vec -> { + return (float) (Math.abs(noise.eval(vec.x() * 0.1, vec.y() * 0.1, vec.z() * 0.1)) * 3F + + Math.abs(noise.eval(vec.x() * 0.3, vec.y() * 0.3 + 100, vec.z() * 0.3)) * 1.3F); }).setSource(sdf); final BlockPos center = pos; List support = Lists.newArrayList(); sdf.setReplaceFunction(REPLACE).addPostProcess((info) -> { if (info.getStateUp().isAir()) { if (random.nextInt(16) == 0) { - support.add(info.getPos().up()); + support.add(info.getPos().above()); } - return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceConfig().getTopMaterial(); + return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); } else if (info.getState(Direction.UP, 3).isAir()) { - return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceConfig().getUnderMaterial(); + return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceBuilderConfig() + .getUnderMaterial(); } return info.getState(); }).fillRecursive(world, center); support.forEach((bpos) -> { if (EndBiomes.getFromBiome(world.getBiome(bpos)) == EndBiomes.BLOSSOMING_SPIRES) { - EndFeatures.TENANEA_BUSH.getFeature().generate(world, chunkGenerator, random, bpos, null); + EndFeatures.TENANEA_BUSH.getFeature().place(world, chunkGenerator, random, bpos, null); } }); @@ -82,7 +83,7 @@ public class SpireFeature extends DefaultFeature { static { REPLACE = (state) -> { - if (state.isIn(EndTags.END_GROUND)) { + if (state.is(EndTags.END_GROUND)) { return true; } if (state.getBlock() instanceof LeavesBlock) { diff --git a/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java b/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java index 6c54c59c..3a336a23 100644 --- a/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java @@ -8,9 +8,9 @@ import net.minecraft.state.property.Properties; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.util.Mth; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.basis.StalactiteBlock; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; @@ -28,8 +28,8 @@ public class StalactiteFeature extends DefaultFeature { } @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { if (!isGround(world.getBlockState(ceiling ? pos.up() : pos.below()).getBlock())) { return false; } diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java index 16ebab6f..d75ea8ed 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java @@ -7,9 +7,9 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.BlockProperties; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; @@ -19,8 +19,8 @@ import ru.betterend.world.features.DefaultFeature; public class SulphurHillFeature extends DefaultFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { pos = getPosOnSurfaceWG(world, pos); if (pos.getY() < 57 || pos.getY() > 70) { return false; @@ -40,7 +40,7 @@ public class SulphurHillFeature extends DefaultFeature { return true; } - private void makeCircle(StructureWorldAccess world, BlockPos pos, OpenSimplexNoise noise, Random random) { + private void makeCircle(WorldGenLevel world, BlockPos pos, OpenSimplexNoise noise, Random random) { int radius = MHelper.randRange(5, 9, random); int min = -radius - 3; int max = radius + 4; diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java index 6fc09489..35aa9add 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java @@ -13,9 +13,9 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.Heightmap; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.SulphurCrystalBlock; import ru.betterend.noise.OpenSimplexNoise; @@ -31,8 +31,8 @@ public class SulphuricCaveFeature extends DefaultFeature { private static final Direction[] HORIZONTAL = BlocksHelper.makeHorizontal(); @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { int radius = MHelper.randRange(10, 30, random); int top = world.getTopY(Heightmap.Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); @@ -106,7 +106,7 @@ public class SulphuricCaveFeature extends DefaultFeature { double v = noise.eval(x * 0.1, y * 0.1, z * 0.1) + noise.eval(x * 0.03, y * 0.03, z * 0.03) * 0.5; if (v > 0.4) { - brimstone.add(mut.toImmutable()); + brimstone.add(mut.immutable()); } else { BlocksHelper.setWithoutUpdate(world, mut, rock); } @@ -173,7 +173,7 @@ public class SulphuricCaveFeature extends DefaultFeature { || state.getMaterial().equals(Material.UNDERWATER_PLANT) || state.getMaterial().equals(Material.LEAVES); } - private void placeBrimstone(StructureWorldAccess world, BlockPos pos, Random random) { + private void placeBrimstone(WorldGenLevel world, BlockPos pos, Random random) { BlockState state = getBrimstone(world, pos); BlocksHelper.setWithoutUpdate(world, pos, state); if (state.getValue(BlockProperties.ACTIVE)) { @@ -181,7 +181,7 @@ public class SulphuricCaveFeature extends DefaultFeature { } } - private BlockState getBrimstone(StructureWorldAccess world, BlockPos pos) { + private BlockState getBrimstone(WorldGenLevel world, BlockPos pos) { for (Direction dir : BlocksHelper.DIRECTIONS) { if (world.getBlockState(pos.relative(dir)).is(Blocks.WATER)) { return EndBlocks.BRIMSTONE.defaultBlockState().with(BlockProperties.ACTIVE, true); @@ -190,7 +190,7 @@ public class SulphuricCaveFeature extends DefaultFeature { return EndBlocks.BRIMSTONE.defaultBlockState(); } - private void makeShards(StructureWorldAccess world, BlockPos pos, Random random) { + private void makeShards(WorldGenLevel world, BlockPos pos, Random random) { for (Direction dir : BlocksHelper.DIRECTIONS) { BlockPos side; if (random.nextInt(16) == 0 && world.getBlockState((side = pos.relative(dir))).is(Blocks.WATER)) { diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java index 9428fe66..5f1948a4 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java @@ -7,13 +7,13 @@ import com.google.common.collect.Sets; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; -import net.minecraft.fluid.Fluids; +import net.minecraft.world.level.material.Fluids; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.SulphurCrystalBlock; import ru.betterend.noise.OpenSimplexNoise; @@ -28,8 +28,8 @@ public class SulphuricLakeFeature extends DefaultFeature { private static final MutableBlockPos POS = new MutableBlockPos(); @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, - DefaultFeatureConfig featureConfig) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, + NoneFeatureConfiguration featureConfig) { blockPos = getPosOnSurfaceWG(world, blockPos); if (blockPos.getY() < 57) { @@ -63,7 +63,7 @@ public class SulphuricLakeFeature extends DefaultFeature { if (world.getBlockState(POS).isIn(EndTags.GEN_TERRAIN)) { if (isBorder(world, POS)) { if (random.nextInt(8) > 0) { - brimstone.add(POS.toImmutable()); + brimstone.add(POS.immutable()); if (random.nextBoolean()) { brimstone.add(POS.below()); if (random.nextBoolean()) { @@ -82,7 +82,7 @@ public class SulphuricLakeFeature extends DefaultFeature { } } } else { - brimstone.add(POS.toImmutable()); + brimstone.add(POS.immutable()); if (random.nextBoolean()) { brimstone.add(POS.below()); } @@ -119,7 +119,7 @@ public class SulphuricLakeFeature extends DefaultFeature { } else if (dist < r2) { POS.setY(getYOnSurface(world, x, z) - 1); if (world.getBlockState(POS).isIn(EndTags.GEN_TERRAIN)) { - brimstone.add(POS.toImmutable()); + brimstone.add(POS.immutable()); if (random.nextBoolean()) { brimstone.add(POS.below()); if (random.nextBoolean()) { @@ -138,7 +138,7 @@ public class SulphuricLakeFeature extends DefaultFeature { return true; } - private boolean isBorder(StructureWorldAccess world, BlockPos pos) { + private boolean isBorder(WorldGenLevel world, BlockPos pos) { int y = pos.getY() + 1; for (Direction dir : BlocksHelper.DIRECTIONS) { if (getYOnSurface(world, pos.getX() + dir.getOffsetX(), pos.getZ() + dir.getOffsetZ()) < y) { @@ -148,7 +148,7 @@ public class SulphuricLakeFeature extends DefaultFeature { return false; } - private boolean isAbsoluteBorder(StructureWorldAccess world, BlockPos pos) { + private boolean isAbsoluteBorder(WorldGenLevel world, BlockPos pos) { int y = pos.getY() - 2; for (Direction dir : BlocksHelper.DIRECTIONS) { if (getYOnSurface(world, pos.getX() + dir.getOffsetX() * 3, pos.getZ() + dir.getOffsetZ() * 3) < y) { @@ -158,7 +158,7 @@ public class SulphuricLakeFeature extends DefaultFeature { return false; } - private boolean isDeepWater(StructureWorldAccess world, BlockPos pos) { + private boolean isDeepWater(WorldGenLevel world, BlockPos pos) { int y = pos.getY() + 1; for (Direction dir : BlocksHelper.DIRECTIONS) { if (getYOnSurface(world, pos.getX() + dir.getOffsetX(), pos.getZ() + dir.getOffsetZ()) < y @@ -170,7 +170,7 @@ public class SulphuricLakeFeature extends DefaultFeature { return true; } - private void placeBrimstone(StructureWorldAccess world, BlockPos pos, Random random) { + private void placeBrimstone(WorldGenLevel world, BlockPos pos, Random random) { BlockState state = getBrimstone(world, pos); BlocksHelper.setWithoutUpdate(world, pos, state); if (state.getValue(BlockProperties.ACTIVE)) { @@ -178,7 +178,7 @@ public class SulphuricLakeFeature extends DefaultFeature { } } - private BlockState getBrimstone(StructureWorldAccess world, BlockPos pos) { + private BlockState getBrimstone(WorldGenLevel world, BlockPos pos) { for (Direction dir : BlocksHelper.DIRECTIONS) { if (world.getBlockState(pos.relative(dir)).is(Blocks.WATER)) { return EndBlocks.BRIMSTONE.defaultBlockState().with(BlockProperties.ACTIVE, true); @@ -187,7 +187,7 @@ public class SulphuricLakeFeature extends DefaultFeature { return EndBlocks.BRIMSTONE.defaultBlockState(); } - private void makeShards(StructureWorldAccess world, BlockPos pos, Random random) { + private void makeShards(WorldGenLevel world, BlockPos pos, Random random) { for (Direction dir : BlocksHelper.DIRECTIONS) { BlockPos side; if (random.nextInt(16) == 0 && world.getBlockState((side = pos.relative(dir))).is(Blocks.WATER)) { diff --git a/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java b/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java index 92148073..1e75d2ca 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java @@ -5,9 +5,9 @@ import java.util.Random; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.HydrothermalVentBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -17,8 +17,8 @@ import ru.betterend.world.features.DefaultFeature; public class SurfaceVentFeature extends DefaultFeature { @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); if (!world.getBlockState(pos.down(3)).isIn(EndTags.GEN_TERRAIN)) { diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java index 261828c0..96397bb2 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java @@ -10,11 +10,11 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; import ru.betterend.world.biome.cave.EndCaveBiome; @@ -28,8 +28,8 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { } @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { Set floorPositions = Sets.newHashSet(); Set ceilPositions = Sets.newHashSet(); int sx = (pos.getX() >> 4) << 4; @@ -38,7 +38,7 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { MutableBlockPos max = new MutableBlockPos().set(pos); fillSets(sx, sz, world.getChunk(pos), floorPositions, ceilPositions, min, max); EndCaveBiome biome = supplier.get(); - BlockState surfaceBlock = biome.getBiome().getGenerationSettings().getSurfaceConfig().getTopMaterial(); + BlockState surfaceBlock = biome.getBiome().getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); placeFloor(world, biome, floorPositions, random, surfaceBlock); placeCeil(world, biome, ceilPositions, random); BlocksHelper.fixBlocks(world, min, max); @@ -63,12 +63,12 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { BlockState bottom = chunk.getBlockState(mut2); if (top.isAir() && (bottom.isIn(EndTags.GEN_TERRAIN) || bottom.is(Blocks.STONE))) { mut3.set(mut2).move(sx, 0, sz); - floorPositions.add(mut3.toImmutable()); + floorPositions.add(mut3.immutable()); updateMin(mut3, min); updateMax(mut3, max); } else if (bottom.isAir() && (top.isIn(EndTags.GEN_TERRAIN) || top.is(Blocks.STONE))) { mut3.set(mut).move(sx, 0, sz); - ceilPositions.add(mut3.toImmutable()); + ceilPositions.add(mut3.immutable()); updateMin(mut3, min); updateMax(mut3, max); } @@ -102,22 +102,21 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { } } - protected void placeFloor(StructureWorldAccess world, EndCaveBiome biome, Set floorPositions, - Random random, BlockState surfaceBlock) { + protected void placeFloor(WorldGenLevel world, EndCaveBiome biome, Set floorPositions, Random random, + BlockState surfaceBlock) { float density = biome.getFloorDensity(); floorPositions.forEach((pos) -> { BlocksHelper.setWithoutUpdate(world, pos, surfaceBlock); if (density > 0 && random.nextFloat() <= density) { Feature feature = biome.getFloorFeature(random); if (feature != null) { - feature.generate(world, null, random, pos.up(), null); + feature.place(world, null, random, pos.up(), null); } } }); } - protected void placeCeil(StructureWorldAccess world, EndCaveBiome biome, Set ceilPositions, - Random random) { + protected void placeCeil(WorldGenLevel world, EndCaveBiome biome, Set ceilPositions, Random random) { float density = biome.getCeilDensity(); ceilPositions.forEach((pos) -> { BlockState ceilBlock = biome.getCeil(pos); @@ -127,7 +126,7 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { if (density > 0 && random.nextFloat() <= density) { Feature feature = biome.getCeilFeature(random); if (feature != null) { - feature.generate(world, null, random, pos.below(), null); + feature.place(world, null, random, pos.below(), null); } } }); 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 5faf8e26..b1787b6c 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 @@ -11,11 +11,11 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.Heightmap; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.interfaces.IBiomeArray; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndTags; @@ -32,8 +32,8 @@ public abstract class EndCaveFeature extends DefaultFeature { protected static final BlockState WATER = Blocks.WATER.defaultBlockState(); @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { if (!(GeneratorOptions.useNewGenerator() && GeneratorOptions.noRingVoid()) || pos.getX() * pos.getX() + pos.getZ() * pos.getZ() <= 22500) { return false; @@ -63,15 +63,16 @@ public abstract class EndCaveFeature extends DefaultFeature { if (world.getBlockState(mut).getMaterial().isReplaceable()) { mut.setY(bpos.getY() - 1); if (world.getBlockState(mut).isIn(EndTags.GEN_TERRAIN)) { - floorPositions.add(mut.toImmutable()); + floorPositions.add(mut.immutable()); } mut.setY(bpos.getY() + 1); if (world.getBlockState(mut).isIn(EndTags.GEN_TERRAIN)) { - ceilPositions.add(mut.toImmutable()); + ceilPositions.add(mut.immutable()); } } }); - BlockState surfaceBlock = biome.getBiome().getGenerationSettings().getSurfaceConfig().getTopMaterial(); + BlockState surfaceBlock = biome.getBiome().getGenerationSettings().getSurfaceBuilderConfig() + .getTopMaterial(); placeFloor(world, biome, floorPositions, random, surfaceBlock); placeCeil(world, biome, ceilPositions, random); } @@ -81,24 +82,23 @@ public abstract class EndCaveFeature extends DefaultFeature { return true; } - protected abstract Set generate(StructureWorldAccess world, BlockPos center, int radius, Random random); + protected abstract Set place(WorldGenLevel world, BlockPos center, int radius, Random random); - protected void placeFloor(StructureWorldAccess world, EndCaveBiome biome, Set floorPositions, - Random random, BlockState surfaceBlock) { + protected void placeFloor(WorldGenLevel world, EndCaveBiome biome, Set floorPositions, Random random, + BlockState surfaceBlock) { float density = biome.getFloorDensity(); floorPositions.forEach((pos) -> { BlocksHelper.setWithoutUpdate(world, pos, surfaceBlock); if (density > 0 && random.nextFloat() <= density) { Feature feature = biome.getFloorFeature(random); if (feature != null) { - feature.generate(world, null, random, pos.up(), null); + feature.place(world, null, random, pos.up(), null); } } }); } - protected void placeCeil(StructureWorldAccess world, EndCaveBiome biome, Set ceilPositions, - Random random) { + protected void placeCeil(WorldGenLevel world, EndCaveBiome biome, Set ceilPositions, Random random) { float density = biome.getCeilDensity(); ceilPositions.forEach((pos) -> { BlockState ceilBlock = biome.getCeil(pos); @@ -108,24 +108,24 @@ public abstract class EndCaveFeature extends DefaultFeature { if (density > 0 && random.nextFloat() <= density) { Feature feature = biome.getCeilFeature(random); if (feature != null) { - feature.generate(world, null, random, pos.below(), null); + feature.place(world, null, random, pos.below(), null); } } }); } - protected void setBiomes(StructureWorldAccess world, EndCaveBiome biome, Set blocks) { + protected void setBiomes(WorldGenLevel world, EndCaveBiome biome, Set blocks) { blocks.forEach((pos) -> setBiome(world, pos, biome)); } - private void setBiome(StructureWorldAccess world, BlockPos pos, EndCaveBiome biome) { + private void setBiome(WorldGenLevel world, BlockPos pos, EndCaveBiome biome) { IBiomeArray array = (IBiomeArray) world.getChunk(pos).getBiomeArray(); if (array != null) { array.setBiome(biome.getActualBiome(), pos); } } - private BlockPos findPos(StructureWorldAccess world, BlockPos pos, int radius, Random random) { + private BlockPos findPos(WorldGenLevel world, BlockPos pos, int radius, Random random) { int top = world.getTopY(Heightmap.Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); MutableBlockPos bpos = new MutableBlockPos(); bpos.setX(pos.getX()); @@ -155,7 +155,7 @@ public abstract class EndCaveFeature extends DefaultFeature { return new BlockPos(pos.getX(), MHelper.randRange(bottom, top, random), pos.getZ()); } - private void fixBlocks(StructureWorldAccess world, Set caveBlocks) { + private void fixBlocks(WorldGenLevel world, Set caveBlocks) { BlockPos pos = caveBlocks.iterator().next(); MutableBlockPos start = new MutableBlockPos().set(pos); MutableBlockPos end = new MutableBlockPos().set(pos); @@ -184,7 +184,7 @@ public abstract class EndCaveFeature extends DefaultFeature { BlocksHelper.fixBlocks(world, start.add(-5, -5, -5), end.add(5, 5, 5)); } - protected boolean isWaterNear(StructureWorldAccess world, BlockPos pos) { + protected boolean isWaterNear(WorldGenLevel world, BlockPos pos) { for (Direction dir : BlocksHelper.DIRECTIONS) { if (!world.getFluidState(pos.relative(dir, 5)).isEmpty()) { return true; @@ -193,7 +193,7 @@ public abstract class EndCaveFeature extends DefaultFeature { return false; } - protected boolean biomeMissingCaves(StructureWorldAccess world, BlockPos pos) { + protected boolean biomeMissingCaves(WorldGenLevel world, BlockPos pos) { for (int x = -2; x < 3; x++) { for (int z = -2; z < 3; z++) { Biome biome = world.getBiome(pos.offset(x << 4, 0, z << 4)); 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 284528cf..54c96c39 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 @@ -9,7 +9,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; @@ -17,7 +17,7 @@ import ru.betterend.util.MHelper; public class RoundCaveFeature extends EndCaveFeature { @Override - protected Set generate(StructureWorldAccess world, BlockPos center, int radius, Random random) { + protected Set place(WorldGenLevel world, BlockPos center, int radius, Random random) { OpenSimplexNoise noise = new OpenSimplexNoise(MHelper.getSeed(534, center.getX(), center.getZ())); int x1 = center.getX() - radius - 5; @@ -52,7 +52,7 @@ public class RoundCaveFeature extends EndCaveFeature { state = world.getBlockState(bpos); if (isReplaceable(state) && !isWaterNear(world, bpos)) { BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR); - blocks.add(bpos.toImmutable()); + blocks.add(bpos.immutable()); while (state.getMaterial().equals(Material.LEAVES)) { BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR); 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 96789b66..d428fc45 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 @@ -8,10 +8,10 @@ import java.util.function.Function; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.Material; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; import ru.betterend.util.SplineHelper; @@ -21,7 +21,7 @@ public class TunelCaveFeature extends EndCaveFeature { private static final Function REPLACE; @Override - protected Set generate(StructureWorldAccess world, BlockPos center, int radius, Random random) { + protected Set place(WorldGenLevel world, BlockPos center, int radius, Random random) { // OpenSimplexNoise noise = new OpenSimplexNoise(MHelper.getSeed(534, // center.getX(), center.getZ())); float rad = radius * 0.15F; @@ -31,9 +31,9 @@ public class TunelCaveFeature extends EndCaveFeature { spline = SplineHelper.smoothSpline(spline, 5); SplineHelper.offsetParts(spline, random, 5, radius * 0.4F, 5); for (Vector3f vec : spline) { - float x = Mth.clamp(vec.getX(), min, max); - float y = Mth.clamp(vec.getY(), -radius, radius); - float z = Mth.clamp(vec.getZ(), min, max); + float x = Mth.clamp(vec.x(), min, max); + float y = Mth.clamp(vec.y(), -radius, radius); + float z = Mth.clamp(vec.z(), min, max); vec.set(x, y, z); } SDF sdf = SplineHelper.buildSDF(spline, rad, rad, (vec) -> Blocks.AIR.defaultBlockState()); diff --git a/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java index bc404708..1a890aa4 100644 --- a/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java @@ -9,13 +9,13 @@ import com.google.common.collect.Lists; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.material.Material; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -42,8 +42,8 @@ public class DragonTreeFeature extends DefaultFeature { private static final List ROOT; @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) return false; @@ -76,8 +76,7 @@ public class DragonTreeFeature extends DefaultFeature { return true; } - private void makeCap(StructureWorldAccess world, BlockPos pos, float radius, Random random, - OpenSimplexNoise noise) { + private void makeCap(WorldGenLevel world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) { int count = (int) radius; int offset = (int) (BRANCH.get(BRANCH.size() - 1).getY() * radius); for (int i = 0; i < count; i++) { @@ -102,7 +101,7 @@ public class DragonTreeFeature extends DefaultFeature { leavesBall(world, pos.up(offset), radius * 1.15F + 2, random, noise); } - private void makeRoots(StructureWorldAccess world, BlockPos pos, float radius, Random random) { + private void makeRoots(WorldGenLevel world, BlockPos pos, float radius, Random random) { int count = (int) (radius * 1.5F); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2; @@ -118,8 +117,7 @@ public class DragonTreeFeature extends DefaultFeature { } } - private void leavesBall(StructureWorldAccess world, BlockPos pos, float radius, Random random, - OpenSimplexNoise noise) { + private void leavesBall(WorldGenLevel world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) { SDF sphere = new SDFSphere().setRadius(radius) .setBlock(EndBlocks.DRAGON_TREE_LEAVES.defaultBlockState().with(LeavesBlock.DISTANCE, 6)); SDF sub = new SDFScale().setScale(5).setSource(sphere); @@ -127,7 +125,7 @@ public class DragonTreeFeature extends DefaultFeature { sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sub); sphere = new SDFScale3D().setScale(1, 0.5F, 1).setSource(sphere); sphere = new SDFDisplacement().setFunction((vec) -> { - return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 1.5F; + return (float) noise.eval(vec.x() * 0.2, vec.y() * 0.2, vec.z() * 0.2) * 1.5F; }).setSource(sphere); sphere = new SDFDisplacement().setFunction((vec) -> { return random.nextFloat() * 3F - 1.5F; diff --git a/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java b/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java index de9113dc..24eb7553 100644 --- a/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java @@ -6,16 +6,16 @@ import java.util.function.Function; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.core.Direction.AxisDirection; import net.minecraft.util.Mth; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.basis.AttachedBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -32,8 +32,8 @@ public class GiganticAmaranitaFeature extends DefaultFeature { private static final Function POST; @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) return false; @@ -68,7 +68,7 @@ public class GiganticAmaranitaFeature extends DefaultFeature { return true; } - private void makeHead(StructureWorldAccess world, BlockPos pos, int radius) { + private void makeHead(WorldGenLevel world, BlockPos pos, int radius) { MutableBlockPos mut = new MutableBlockPos(); if (radius < 2) { for (int i = -1; i < 2; i++) { diff --git a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java index 3a0c9fcc..28ab3a7f 100644 --- a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java @@ -6,14 +6,14 @@ import java.util.Random; import java.util.function.Function; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.util.math.Box; import net.minecraft.util.Mth; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.HelixTreeLeavesBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -33,8 +33,8 @@ public class HelixTreeFeature extends DefaultFeature { private static final Function POST; @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) return false; BlocksHelper.setWithoutUpdate(world, pos, AIR); @@ -148,7 +148,7 @@ public class HelixTreeFeature extends DefaultFeature { return true; } - private void fillLine(Vector3f start, Vector3f end, StructureWorldAccess world, BlockState state, BlockPos pos, + private void fillLine(Vector3f start, Vector3f end, WorldGenLevel world, BlockState state, BlockPos pos, int offset) { float dx = end.getX() - start.getX(); float dy = end.getY() - start.getY(); diff --git a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java index 3b16470a..94bedc0d 100644 --- a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java @@ -8,12 +8,12 @@ import com.google.common.collect.Lists; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.JellyshroomCapBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -33,8 +33,8 @@ public class JellyshroomFeature extends DefaultFeature { private static final List ROOT; @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) return false; @@ -79,7 +79,7 @@ public class JellyshroomFeature extends DefaultFeature { return true; } - private void makeRoots(StructureWorldAccess world, BlockPos pos, float radius, Random random, BlockState wood) { + private void makeRoots(WorldGenLevel world, BlockPos pos, float radius, Random random, BlockState wood) { int count = (int) (radius * 3.5F); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2; diff --git a/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java b/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java index 9ef75410..d71d222e 100644 --- a/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java @@ -7,13 +7,13 @@ import java.util.function.Function; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.material.Material; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -34,8 +34,8 @@ public class LacugroveFeature extends DefaultFeature { private static final Function POST; @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { if (!world.getBlockState(pos.below()).isIn(EndTags.END_GROUND)) return false; @@ -107,12 +107,11 @@ public class LacugroveFeature extends DefaultFeature { return true; } - private void leavesBall(StructureWorldAccess world, BlockPos pos, float radius, Random random, - OpenSimplexNoise noise) { + private void leavesBall(WorldGenLevel world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) { SDF sphere = new SDFSphere().setRadius(radius) .setBlock(EndBlocks.LACUGROVE_LEAVES.defaultBlockState().with(LeavesBlock.DISTANCE, 6)); sphere = new SDFDisplacement().setFunction((vec) -> { - return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; + return (float) noise.eval(vec.x() * 0.2, vec.y() * 0.2, vec.z() * 0.2) * 3; }).setSource(sphere); sphere = new SDFDisplacement().setFunction((vec) -> { return random.nextFloat() * 3F - 1.5F; diff --git a/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java b/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java index c2eb554e..cbf386bb 100644 --- a/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java @@ -9,13 +9,13 @@ import com.google.common.collect.Lists; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.material.Material; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.FurBlock; @@ -42,8 +42,8 @@ public class LucerniaFeature extends DefaultFeature { private static final List ROOT; @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) return false; @@ -70,8 +70,8 @@ public class LucerniaFeature extends DefaultFeature { return true; } - private void leavesBall(StructureWorldAccess world, BlockPos pos, float radius, Random random, - OpenSimplexNoise noise, boolean natural) { + private void leavesBall(WorldGenLevel world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise, + boolean natural) { SDF sphere = new SDFSphere().setRadius(radius) .setBlock(EndBlocks.LUCERNIA_LEAVES.defaultBlockState().with(LeavesBlock.DISTANCE, 6)); SDF sub = new SDFScale().setScale(5).setSource(sphere); @@ -79,7 +79,7 @@ public class LucerniaFeature extends DefaultFeature { sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sub); sphere = new SDFScale3D().setScale(1, 0.75F, 1).setSource(sphere); sphere = new SDFDisplacement().setFunction((vec) -> { - return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 2F; + return (float) noise.eval(vec.x() * 0.2, vec.y() * 0.2, vec.z() * 0.2) * 2F; }).setSource(sphere); sphere = new SDFDisplacement().setFunction((vec) -> { return MHelper.randRange(-1.5F, 1.5F, random); @@ -87,7 +87,7 @@ public class LucerniaFeature extends DefaultFeature { MutableBlockPos mut = new MutableBlockPos(); for (Direction d1 : BlocksHelper.HORIZONTAL) { - BlockPos p = mut.set(pos).move(Direction.UP).move(d1).toImmutable(); + BlockPos p = mut.set(pos).move(Direction.UP).move(d1).immutable(); BlocksHelper.setWithoutUpdate(world, p, EndBlocks.LUCERNIA.bark.defaultBlockState()); for (Direction d2 : BlocksHelper.HORIZONTAL) { mut.set(p).move(Direction.UP).move(d2); @@ -175,7 +175,7 @@ public class LucerniaFeature extends DefaultFeature { }); } - private void makeRoots(StructureWorldAccess world, BlockPos pos, float radius, Random random) { + private void makeRoots(WorldGenLevel world, BlockPos pos, float radius, Random random) { int count = (int) (radius * 1.5F); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2; diff --git a/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java index 499f4ee9..453ed3e9 100644 --- a/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java @@ -6,12 +6,12 @@ import java.util.function.Function; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.MossyGlowshroomCapBlock; import ru.betterend.blocks.basis.FurBlock; import ru.betterend.noise.OpenSimplexNoise; @@ -48,8 +48,8 @@ public class MossyGlowshroomFeature extends DefaultFeature { private static final SDFPrimitive ROOTS; @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, - DefaultFeatureConfig featureConfig) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, + NoneFeatureConfiguration featureConfig) { BlockState down = world.getBlockState(blockPos.below()); if (!down.is(EndBlocks.END_MYCELIUM) && !down.is(EndBlocks.END_MOSS)) return false; diff --git a/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java index d3e9ddf0..ac727c80 100644 --- a/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java @@ -7,13 +7,13 @@ import java.util.function.Function; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.material.Material; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -35,8 +35,8 @@ public class PythadendronTreeFeature extends DefaultFeature { private static final Function POST; @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { if (world.getBlockState(pos.below()).getBlock() != EndBlocks.CHORUS_NYLIUM) return false; BlocksHelper.setWithoutUpdate(world, pos, AIR); @@ -62,7 +62,7 @@ public class PythadendronTreeFeature extends DefaultFeature { } private void branch(float x, float y, float z, float size, float angle, Random random, int depth, - StructureWorldAccess world, BlockPos pos) { + WorldGenLevel world, BlockPos pos) { if (depth == 0) return; @@ -113,14 +113,14 @@ public class PythadendronTreeFeature extends DefaultFeature { } } - private void leavesBall(StructureWorldAccess world, BlockPos pos, Random random, OpenSimplexNoise noise) { + private void leavesBall(WorldGenLevel world, BlockPos pos, Random random, OpenSimplexNoise noise) { float radius = MHelper.randRange(4.5F, 6.5F, random); SDF sphere = new SDFSphere().setRadius(radius) .setBlock(EndBlocks.PYTHADENDRON_LEAVES.defaultBlockState().with(LeavesBlock.DISTANCE, 6)); sphere = new SDFScale3D().setScale(1, 0.6F, 1).setSource(sphere); sphere = new SDFDisplacement().setFunction((vec) -> { - return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; + return (float) noise.eval(vec.x() * 0.2, vec.y() * 0.2, vec.z() * 0.2) * 3; }).setSource(sphere); sphere = new SDFDisplacement().setFunction((vec) -> { return random.nextFloat() * 3F - 1.5F; diff --git a/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java b/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java index 1ebf07b3..627989c6 100644 --- a/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java @@ -9,13 +9,13 @@ import com.google.common.collect.Lists; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.material.Material; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.FurBlock; @@ -41,8 +41,8 @@ public class TenaneaFeature extends DefaultFeature { private static final List SPLINE; @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) return false; @@ -66,8 +66,7 @@ public class TenaneaFeature extends DefaultFeature { return true; } - private void leavesBall(StructureWorldAccess world, BlockPos pos, float radius, Random random, - OpenSimplexNoise noise) { + private void leavesBall(WorldGenLevel world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) { SDF sphere = new SDFSphere().setRadius(radius) .setBlock(EndBlocks.TENANEA_LEAVES.defaultBlockState().with(LeavesBlock.DISTANCE, 6)); SDF sub = new SDFScale().setScale(5).setSource(sphere); @@ -75,7 +74,7 @@ public class TenaneaFeature extends DefaultFeature { sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sub); sphere = new SDFScale3D().setScale(1, 0.75F, 1).setSource(sphere); sphere = new SDFDisplacement().setFunction((vec) -> { - return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 2F; + return (float) noise.eval(vec.x() * 0.2, vec.y() * 0.2, vec.z() * 0.2) * 2F; }).setSource(sphere); sphere = new SDFDisplacement().setFunction((vec) -> { return MHelper.randRange(-1.5F, 1.5F, random); @@ -83,7 +82,7 @@ public class TenaneaFeature extends DefaultFeature { MutableBlockPos mut = new MutableBlockPos(); for (Direction d1 : BlocksHelper.HORIZONTAL) { - BlockPos p = mut.set(pos).move(Direction.UP).move(d1).toImmutable(); + BlockPos p = mut.set(pos).move(Direction.UP).move(d1).immutable(); BlocksHelper.setWithoutUpdate(world, p, EndBlocks.TENANEA.bark.defaultBlockState()); for (Direction d2 : BlocksHelper.HORIZONTAL) { mut.set(p).move(Direction.UP).move(d2); diff --git a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java index fe0351db..dc7ba0e8 100644 --- a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java @@ -8,14 +8,14 @@ import com.google.common.collect.Lists; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.util.Mth; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.UmbrellaTreeClusterBlock; import ru.betterend.blocks.UmbrellaTreeMembraneBlock; import ru.betterend.registry.EndBlocks; @@ -40,8 +40,8 @@ public class UmbrellaTreeFeature extends DefaultFeature { private static final List ROOT; @Override - public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - DefaultFeatureConfig config) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) return false; @@ -86,9 +86,9 @@ public class UmbrellaTreeFeature extends DefaultFeature { sdf = (sdf == null) ? branch : new SDFUnion().setSourceA(sdf).setSourceB(branch); SDF mem = makeMembrane(world, radius, random, membrane, center); - float px = MHelper.floor(vec.getX()) + 0.5F; - float py = MHelper.floor(vec.getY()) + 0.5F; - float pz = MHelper.floor(vec.getZ()) + 0.5F; + float px = MHelper.floor(vec.x()) + 0.5F; + float py = MHelper.floor(vec.y()) + 0.5F; + float pz = MHelper.floor(vec.z()) + 0.5F; mem = new SDFTranslate().setTranslate(px, py, pz).setSource(mem); sdf = new SDFSmoothUnion().setRadius(2).setSourceA(sdf).setSourceB(mem); centers.add(new Center(pos.getX() + (double) (px * scale), pos.getY() + (double) (py * scale), @@ -146,7 +146,7 @@ public class UmbrellaTreeFeature extends DefaultFeature { return true; } - private void makeRoots(StructureWorldAccess world, BlockPos pos, float radius, Random random, BlockState wood) { + private void makeRoots(WorldGenLevel world, BlockPos pos, float radius, Random random, BlockState wood) { int count = (int) (radius * 1.5F); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2; @@ -162,8 +162,7 @@ public class UmbrellaTreeFeature extends DefaultFeature { } } - private SDF makeMembrane(StructureWorldAccess world, float radius, Random random, BlockState membrane, - BlockState center) { + private SDF makeMembrane(WorldGenLevel world, float radius, Random random, BlockState membrane, BlockState center) { SDF sphere = new SDFSphere().setRadius(radius).setBlock(membrane); SDF sub = new SDFTranslate().setTranslate(0, -4, 0).setSource(sphere); sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sub); @@ -183,8 +182,7 @@ public class UmbrellaTreeFeature extends DefaultFeature { return sphere; } - private void makeFruits(StructureWorldAccess world, double px, double py, double pz, BlockState fruit, - float scale) { + private void makeFruits(WorldGenLevel world, double px, double py, double pz, BlockState fruit, float scale) { MutableBlockPos mut = new MutableBlockPos().set(px, py, pz); for (int i = 0; i < 8; i++) { mut.move(Direction.DOWN); diff --git a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java index b8ef0b75..ef6ce5a8 100644 --- a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java +++ b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java @@ -9,8 +9,8 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.util.math.noise.SimplexNoiseSampler; import net.minecraft.core.Registry; import net.minecraft.util.registry.RegistryLookupCodec; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.BiomeKeys; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Biomes; import net.minecraft.world.biome.source.BiomeSource; import net.minecraft.world.biome.source.TheEndBiomeSource; import net.minecraft.world.gen.ChunkRandom; @@ -43,8 +43,8 @@ public class BetterEndBiomeSource extends BiomeSource { this.mapLand = new BiomeMap(seed, GeneratorOptions.getBiomeSizeLand(), EndBiomes.LAND_BIOMES); this.mapVoid = new BiomeMap(seed, GeneratorOptions.getBiomeSizeVoid(), EndBiomes.VOID_BIOMES); - this.centerBiome = biomeRegistry.getOrThrow(BiomeKeys.THE_END); - this.barrens = biomeRegistry.getOrThrow(BiomeKeys.END_BARRENS); + this.centerBiome = biomeRegistry.getOrThrow(Biomes.THE_END); + this.barrens = biomeRegistry.getOrThrow(Biomes.END_BARRENS); this.biomeRegistry = biomeRegistry; this.seed = seed; diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index 00d518c7..151a6a58 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -8,7 +8,7 @@ import java.util.concurrent.locks.ReentrantLock; import com.google.common.collect.Lists; import net.minecraft.util.Mth; -import net.minecraft.world.biome.Biome; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.biome.source.BiomeSource; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; diff --git a/src/main/java/ru/betterend/world/processors/TerrainStructureProcessor.java b/src/main/java/ru/betterend/world/processors/TerrainStructureProcessor.java index ca87776f..be56fcf7 100644 --- a/src/main/java/ru/betterend/world/processors/TerrainStructureProcessor.java +++ b/src/main/java/ru/betterend/world/processors/TerrainStructureProcessor.java @@ -16,8 +16,8 @@ public class TerrainStructureProcessor extends StructureProcessor { StructurePlacementData structurePlacementData) { BlockPos bpos = structureBlockInfo2.pos; if (structureBlockInfo2.state.is(Blocks.END_STONE) && worldView.isAir(bpos.up())) { - BlockState top = worldView.getBiome(structureBlockInfo2.pos).getGenerationSettings().getSurfaceConfig() - .getTopMaterial(); + BlockState top = worldView.getBiome(structureBlockInfo2.pos).getGenerationSettings() + .getSurfaceBuilderConfig().getTopMaterial(); return new StructureBlockInfo(bpos, top, structureBlockInfo2.tag); } return structureBlockInfo2; diff --git a/src/main/java/ru/betterend/world/structures/EndStructureFeature.java b/src/main/java/ru/betterend/world/structures/EndStructureFeature.java index bf545278..05377e2c 100644 --- a/src/main/java/ru/betterend/world/structures/EndStructureFeature.java +++ b/src/main/java/ru/betterend/world/structures/EndStructureFeature.java @@ -4,20 +4,20 @@ import java.util.Random; import net.fabricmc.fabric.api.structure.v1.FabricStructureBuilder; import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.registry.BuiltinRegistries; +import net.minecraft.data.BuiltinRegistries; import net.minecraft.world.gen.GenerationStep; -import net.minecraft.world.gen.feature.ConfiguredStructureFeature; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.StructureFeature; +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.StructureFeature; import ru.betterend.BetterEnd; public class EndStructureFeature { private static final Random RANDOM = new Random(354); - private final StructureFeature structure; + private final StructureFeature structure; private final ConfiguredStructureFeature featureConfigured; private final GenerationStep.Feature featureStep; - public EndStructureFeature(String name, StructureFeature structure, + public EndStructureFeature(String name, StructureFeature structure, GenerationStep.Feature step, int spacing, int separation) { ResourceLocation id = BetterEnd.makeID(name); @@ -25,12 +25,12 @@ public class EndStructureFeature { this.structure = FabricStructureBuilder.create(id, structure).step(step) .defaultConfig(spacing, separation, RANDOM.nextInt(8192)).register(); - this.featureConfigured = this.structure.configure(DefaultFeatureConfig.DEFAULT); + this.featureConfigured = this.structure.configure(NoneFeatureConfiguration.DEFAULT); BuiltinRegistries.add(BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE, id, this.featureConfigured); } - public StructureFeature getStructure() { + public StructureFeature getStructure() { return structure; } diff --git a/src/main/java/ru/betterend/world/structures/StructureWorld.java b/src/main/java/ru/betterend/world/structures/StructureWorld.java index 6c42d831..b6cf310c 100644 --- a/src/main/java/ru/betterend/world/structures/StructureWorld.java +++ b/src/main/java/ru/betterend/world/structures/StructureWorld.java @@ -12,7 +12,7 @@ import net.minecraft.nbt.NbtHelper; import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.chunk.Chunk; public class StructureWorld { @@ -79,7 +79,7 @@ public class StructureWorld { lastPart = part; } - public boolean placeChunk(StructureWorldAccess world, ChunkPos chunkPos) { + public boolean placeChunk(WorldGenLevel world, ChunkPos chunkPos) { Part part = parts.get(chunkPos); if (part != null) { Chunk chunk = world.getChunk(chunkPos.x, chunkPos.z); diff --git a/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java b/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java index 1ce2a06e..a40bd45c 100644 --- a/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java @@ -10,12 +10,12 @@ import net.minecraft.util.math.ChunkPos; import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.world.Heightmap; import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.biome.Biome; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.biome.source.BiomeSource; import net.minecraft.world.gen.ChunkRandom; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.StructureFeature; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.StructureFeature; import ru.betterend.BetterEnd; import ru.betterend.util.MHelper; import ru.betterend.util.StructureHelper; @@ -28,7 +28,7 @@ public class EternalPortalStructure extends FeatureBaseStructure { @Override protected boolean shouldStartAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, ChunkRandom chunkRandom, int chunkX, int chunkZ, Biome biome, ChunkPos chunkPos, - DefaultFeatureConfig featureConfig) { + NoneFeatureConfiguration featureConfig) { long x = chunkPos.x; long z = chunkPos.z; if (x * x + z * z < 10000) { @@ -42,19 +42,19 @@ public class EternalPortalStructure extends FeatureBaseStructure { } @Override - public StructureFeature.StructureStartFactory getStructureStartFactory() { + public StructureFeature.StructureStartFactory getStructureStartFactory() { return SDFStructureStart::new; } - public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, - int references, long seed) { + public static class SDFStructureStart extends StructureStart { + public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, + BlockBox box, int references, long seed) { super(feature, chunkX, chunkZ, box, references, seed); } @Override public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, - StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { + StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { int x = (chunkX << 4) | MHelper.randRange(4, 12, random); int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); diff --git a/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java b/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java index 83fbb458..a670c02e 100644 --- a/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java @@ -7,23 +7,23 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Rotation; import net.minecraft.util.math.ChunkPos; import net.minecraft.world.Heightmap; -import net.minecraft.world.biome.Biome; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.biome.source.BiomeSource; import net.minecraft.world.gen.ChunkRandom; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.StructureFeature; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.StructureFeature; -public abstract class FeatureBaseStructure extends StructureFeature { +public abstract class FeatureBaseStructure extends StructureFeature { protected static final BlockState AIR = Blocks.AIR.defaultBlockState(); public FeatureBaseStructure() { - super(DefaultFeatureConfig.CODEC); + super(NoneFeatureConfiguration.CODEC); } protected boolean shouldStartAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, ChunkRandom chunkRandom, int chunkX, int chunkZ, Biome biome, ChunkPos chunkPos, - DefaultFeatureConfig featureConfig) { + NoneFeatureConfiguration featureConfig) { return getGenerationHeight(chunkX, chunkZ, chunkGenerator) >= 20; } diff --git a/src/main/java/ru/betterend/world/structures/features/GiantIceStarStructure.java b/src/main/java/ru/betterend/world/structures/features/GiantIceStarStructure.java index 2abb0015..eb530a69 100644 --- a/src/main/java/ru/betterend/world/structures/features/GiantIceStarStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/GiantIceStarStructure.java @@ -5,16 +5,16 @@ import java.util.List; import java.util.Random; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.structure.StructureManager; import net.minecraft.structure.StructureStart; import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; import net.minecraft.util.registry.DynamicRegistryManager; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.StructureFeature; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.StructureFeature; import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; import ru.betterend.util.sdf.SDF; @@ -96,19 +96,19 @@ public class GiantIceStarStructure extends SDFStructureFeature { } @Override - public StructureFeature.StructureStartFactory getStructureStartFactory() { + public StructureFeature.StructureStartFactory getStructureStartFactory() { return StarStructureStart::new; } - public static class StarStructureStart extends StructureStart { - public StarStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, - int references, long seed) { + public static class StarStructureStart extends StructureStart { + public StarStructureStart(StructureFeature feature, int chunkX, int chunkZ, + BlockBox box, int references, long seed) { super(feature, chunkX, chunkZ, box, references, seed); } @Override public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, - StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { + StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { int x = (chunkX << 4) | MHelper.randRange(4, 12, random); int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); BlockPos start = new BlockPos(x, MHelper.randRange(32, 128, random), z); diff --git a/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java b/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java index 36148bea..c1082948 100644 --- a/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java @@ -3,7 +3,7 @@ package ru.betterend.world.structures.features; import java.util.List; import java.util.Random; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import ru.betterend.blocks.MossyGlowshroomCapBlock; diff --git a/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java b/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java index 21bf867a..5ec17e48 100644 --- a/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java @@ -6,28 +6,28 @@ import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.StructureFeature; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.StructureFeature; import ru.betterend.util.MHelper; import ru.betterend.world.structures.piece.LakePiece; public class MegaLakeSmallStructure extends FeatureBaseStructure { @Override - public StructureFeature.StructureStartFactory getStructureStartFactory() { + public StructureFeature.StructureStartFactory getStructureStartFactory() { return SDFStructureStart::new; } - public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, - int references, long seed) { + public static class SDFStructureStart extends StructureStart { + public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, + BlockBox box, int references, long seed) { super(feature, chunkX, chunkZ, box, references, seed); } @Override public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, - StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { + StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { int x = (chunkX << 4) | MHelper.randRange(4, 12, random); int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); diff --git a/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java b/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java index 1ff03a96..c5ff0335 100644 --- a/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java @@ -6,28 +6,28 @@ import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.StructureFeature; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.StructureFeature; import ru.betterend.util.MHelper; import ru.betterend.world.structures.piece.LakePiece; public class MegaLakeStructure extends FeatureBaseStructure { @Override - public StructureFeature.StructureStartFactory getStructureStartFactory() { + public StructureFeature.StructureStartFactory getStructureStartFactory() { return SDFStructureStart::new; } - public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, - int references, long seed) { + public static class SDFStructureStart extends StructureStart { + public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, + BlockBox box, int references, long seed) { super(feature, chunkX, chunkZ, box, references, seed); } @Override public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, - StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { + StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { int x = (chunkX << 4) | MHelper.randRange(4, 12, random); int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); diff --git a/src/main/java/ru/betterend/world/structures/features/MountainStructure.java b/src/main/java/ru/betterend/world/structures/features/MountainStructure.java index 136e647e..686d64b6 100644 --- a/src/main/java/ru/betterend/world/structures/features/MountainStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/MountainStructure.java @@ -6,28 +6,28 @@ import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.StructureFeature; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.StructureFeature; import ru.betterend.util.MHelper; import ru.betterend.world.structures.piece.CrystalMountainPiece; public class MountainStructure extends FeatureBaseStructure { @Override - public StructureFeature.StructureStartFactory getStructureStartFactory() { + public StructureFeature.StructureStartFactory getStructureStartFactory() { return SDFStructureStart::new; } - public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, - int references, long seed) { + public static class SDFStructureStart extends StructureStart { + public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, + BlockBox box, int references, long seed) { super(feature, chunkX, chunkZ, box, references, seed); } @Override public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, - StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { + StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { int x = (chunkX << 4) | MHelper.randRange(4, 12, random); int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); diff --git a/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java b/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java index ac2e1ac4..4bb136ba 100644 --- a/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java @@ -8,10 +8,10 @@ import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.StructureFeature; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.StructureFeature; import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; import ru.betterend.world.structures.piece.PaintedMountainPiece; @@ -20,19 +20,19 @@ public class PaintedMountainStructure extends FeatureBaseStructure { private static final BlockState[] VARIANTS; @Override - public StructureFeature.StructureStartFactory getStructureStartFactory() { + public StructureFeature.StructureStartFactory getStructureStartFactory() { return SDFStructureStart::new; } - public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, - int references, long seed) { + public static class SDFStructureStart extends StructureStart { + public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, + BlockBox box, int references, long seed) { super(feature, chunkX, chunkZ, box, references, seed); } @Override public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, - StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { + StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { int x = (chunkX << 4) | MHelper.randRange(4, 12, random); int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); diff --git a/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java b/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java index 8baee4bc..bfbb613b 100644 --- a/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java +++ b/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java @@ -8,10 +8,10 @@ import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.StructureFeature; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.StructureFeature; import ru.betterend.util.MHelper; import ru.betterend.util.sdf.SDF; import ru.betterend.world.structures.piece.VoxelPiece; @@ -21,19 +21,19 @@ public abstract class SDFStructureFeature extends FeatureBaseStructure { protected abstract SDF getSDF(BlockPos pos, Random random); @Override - public StructureFeature.StructureStartFactory getStructureStartFactory() { + public StructureFeature.StructureStartFactory getStructureStartFactory() { return SDFStructureStart::new; } - public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BlockBox box, - int references, long seed) { + public static class SDFStructureStart extends StructureStart { + public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, + BlockBox box, int references, long seed) { super(feature, chunkX, chunkZ, box, references, seed); } @Override public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, - StructureManager manager, int chunkX, int chunkZ, Biome biome, DefaultFeatureConfig config) { + StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { int x = (chunkX << 4) | MHelper.randRange(4, 12, random); int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); diff --git a/src/main/java/ru/betterend/world/structures/piece/CavePiece.java b/src/main/java/ru/betterend/world/structures/piece/CavePiece.java index 37e893fc..a8042879 100644 --- a/src/main/java/ru/betterend/world/structures/piece/CavePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/CavePiece.java @@ -10,9 +10,9 @@ import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.gen.StructureAccessor; -import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.level.chunk.ChunkGenerator; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndStructures; import ru.betterend.registry.EndTags; @@ -38,8 +38,8 @@ public class CavePiece extends BasePiece { } @Override - public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, - Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + public boolean place(WorldGenLevel world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, + BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { int x1 = MHelper.max(this.boundingBox.minX, blockBox.minX); int z1 = MHelper.max(this.boundingBox.minZ, blockBox.minZ); int x2 = MHelper.min(this.boundingBox.maxX, blockBox.maxX); diff --git a/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java index 7b56ad66..82d08f40 100644 --- a/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java @@ -13,11 +13,11 @@ import net.minecraft.util.math.ChunkPos; import net.minecraft.util.Mth; import net.minecraft.world.Heightmap; import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.biome.Biome; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.gen.StructureAccessor; -import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.level.chunk.ChunkGenerator; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndStructures; @@ -29,7 +29,7 @@ public class CrystalMountainPiece extends MountainPiece { public CrystalMountainPiece(BlockPos center, float radius, float height, Random random, Biome biome) { super(EndStructures.MOUNTAIN_PIECE, center, radius, height, random, biome); - top = biome.getGenerationSettings().getSurfaceConfig().getTopMaterial(); + top = biome.getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); } public CrystalMountainPiece(StructureManager manager, CompoundTag tag) { @@ -39,12 +39,12 @@ public class CrystalMountainPiece extends MountainPiece { @Override protected void fromNbt(CompoundTag tag) { super.fromNbt(tag); - top = EndBiomes.getBiome(biomeID).getBiome().getGenerationSettings().getSurfaceConfig().getTopMaterial(); + top = EndBiomes.getBiome(biomeID).getBiome().getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); } @Override - public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, - Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + public boolean place(WorldGenLevel world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, + BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { int sx = chunkPos.getStartX(); int sz = chunkPos.getStartZ(); MutableBlockPos pos = new MutableBlockPos(); diff --git a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java index 386794ac..12939c6f 100644 --- a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java @@ -19,11 +19,11 @@ import net.minecraft.util.math.ChunkPos; import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.biome.Biome; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.gen.StructureAccessor; -import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.level.chunk.ChunkGenerator; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndBlocks; @@ -83,8 +83,8 @@ public class LakePiece extends BasePiece { } @Override - public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, - Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + public boolean place(WorldGenLevel world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, + BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { int minY = this.boundingBox.minY; int maxY = this.boundingBox.maxY; int sx = chunkPos.x << 4; @@ -130,7 +130,7 @@ public class LakePiece extends BasePiece { state = chunk.getBlockState(mut.up()); if (state.isAir()) { state = random.nextBoolean() ? ENDSTONE - : world.getBiome(worldPos).getGenerationSettings().getSurfaceConfig() + : world.getBiome(worldPos).getGenerationSettings().getSurfaceBuilderConfig() .getTopMaterial(); } else { state = state.getFluidState().isEmpty() ? ENDSTONE @@ -146,7 +146,7 @@ public class LakePiece extends BasePiece { return true; } - private void fixWater(StructureWorldAccess world, Chunk chunk, MutableBlockPos mut, Random random, int sx, int sz) { + private void fixWater(WorldGenLevel world, Chunk chunk, MutableBlockPos mut, Random random, int sx, int sz) { int minY = this.boundingBox.minY; int maxY = this.boundingBox.maxY; for (int x = 0; x < 16; x++) { @@ -164,8 +164,8 @@ public class LakePiece extends BasePiece { BlockState bState = chunk.getBlockState(mut); if (bState.isAir()) { bState = random.nextBoolean() ? ENDSTONE - : world.getBiome(mut.add(sx, 0, sz)).getGenerationSettings().getSurfaceConfig() - .getTopMaterial(); + : world.getBiome(mut.add(sx, 0, sz)).getGenerationSettings() + .getSurfaceBuilderConfig().getTopMaterial(); } else { bState = bState.getFluidState().isEmpty() ? ENDSTONE : EndBlocks.ENDSTONE_DUST.defaultBlockState(); @@ -184,7 +184,7 @@ public class LakePiece extends BasePiece { if (bState.isAir()) { bState = random.nextBoolean() ? ENDSTONE : world.getBiome(mut.add(sx, 0, sz)).getGenerationSettings() - .getSurfaceConfig().getTopMaterial(); + .getSurfaceBuilderConfig().getTopMaterial(); } else { bState = bState.getFluidState().isEmpty() ? ENDSTONE : EndBlocks.ENDSTONE_DUST.defaultBlockState(); @@ -212,7 +212,7 @@ public class LakePiece extends BasePiece { } } - private int getHeight(StructureWorldAccess world, BlockPos pos) { + private int getHeight(WorldGenLevel world, BlockPos pos) { int p = ((pos.getX() & 2047) << 11) | (pos.getZ() & 2047); int h = heightmap.getOrDefault(p, Byte.MIN_VALUE); if (h > Byte.MIN_VALUE) { @@ -224,7 +224,7 @@ public class LakePiece extends BasePiece { return 0; } - h = world.getTopY(Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); + h = world.getHeight(Types.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); h = Mth.abs(h - center.getY()); h = h < 8 ? 1 : 0; @@ -232,7 +232,7 @@ public class LakePiece extends BasePiece { return h; } - private float getHeightClamp(StructureWorldAccess world, int radius, int posX, int posZ) { + private float getHeightClamp(WorldGenLevel world, int radius, int posX, int posZ) { MutableBlockPos mut = new MutableBlockPos(); int r2 = radius * radius; float height = 0; diff --git a/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java index fa4cf082..a066e38b 100644 --- a/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java @@ -15,8 +15,8 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.util.Mth; import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.biome.Biome; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.Biome; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; import ru.betterend.util.MHelper; @@ -76,7 +76,7 @@ public abstract class MountainPiece extends BasePiece { noise2 = new OpenSimplexNoise(seed2); } - private int getHeight(StructureWorldAccess world, BlockPos pos) { + private int getHeight(WorldGenLevel world, BlockPos pos) { int p = ((pos.getX() & 2047) << 11) | (pos.getZ() & 2047); int h = heightmap.getOrDefault(p, Integer.MIN_VALUE); if (h > Integer.MIN_VALUE) { @@ -87,7 +87,7 @@ public abstract class MountainPiece extends BasePiece { heightmap.put(p, -10); return -10; } - h = world.getTopY(Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); + h = world.getHeight(Types.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); h = Mth.abs(h - center.getY()); if (h > 4) { h = 4 - h; @@ -108,7 +108,7 @@ public abstract class MountainPiece extends BasePiece { return h; } - protected float getHeightClamp(StructureWorldAccess world, int radius, int posX, int posZ) { + protected float getHeightClamp(WorldGenLevel world, int radius, int posX, int posZ) { MutableBlockPos mut = new MutableBlockPos(); float height = 0; float max = 0; diff --git a/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java b/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java index 4ba6ab13..29e87287 100644 --- a/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java @@ -13,9 +13,9 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.gen.StructureAccessor; -import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.level.chunk.ChunkGenerator; import ru.betterend.registry.EndStructures; import ru.betterend.util.MHelper; import ru.betterend.util.StructureHelper; @@ -69,8 +69,8 @@ public class NBTPiece extends BasePiece { } @Override - public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, - Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + public boolean place(WorldGenLevel world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, + BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { BlockBox bounds = new BlockBox(blockBox); bounds.maxY = this.boundingBox.maxY; bounds.minY = this.boundingBox.minY; diff --git a/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java index ce0a802b..b6c3c9c8 100644 --- a/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java @@ -13,11 +13,11 @@ import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.util.math.ChunkPos; import net.minecraft.world.Heightmap; import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.biome.Biome; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.gen.StructureAccessor; -import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.level.chunk.ChunkGenerator; import ru.betterend.registry.EndStructures; import ru.betterend.util.MHelper; @@ -55,8 +55,8 @@ public class PaintedMountainPiece extends MountainPiece { } @Override - public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, - Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + public boolean place(WorldGenLevel world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, + BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { int sx = chunkPos.getStartX(); int sz = chunkPos.getStartZ(); MutableBlockPos pos = new MutableBlockPos(); diff --git a/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java b/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java index fa3451ea..a2be51f9 100644 --- a/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java @@ -8,9 +8,9 @@ import net.minecraft.structure.StructureManager; import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.gen.StructureAccessor; -import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.level.chunk.ChunkGenerator; import ru.betterend.registry.EndStructures; import ru.betterend.world.structures.StructureWorld; @@ -40,8 +40,8 @@ public class VoxelPiece extends BasePiece { } @Override - public boolean generate(StructureWorldAccess world, StructureAccessor arg, ChunkGenerator chunkGenerator, - Random random, BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + public boolean place(WorldGenLevel world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, + BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { this.world.placeChunk(world, chunkPos); return true; } diff --git a/src/main/java/ru/betterend/world/surface/DoubleBlockSurfaceBuilder.java b/src/main/java/ru/betterend/world/surface/DoubleBlockSurfaceBuilder.java index 94d25ebe..053d7798 100644 --- a/src/main/java/ru/betterend/world/surface/DoubleBlockSurfaceBuilder.java +++ b/src/main/java/ru/betterend/world/surface/DoubleBlockSurfaceBuilder.java @@ -6,7 +6,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; import net.minecraft.core.Registry; -import net.minecraft.world.biome.Biome; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.gen.surfacebuilder.ConfiguredSurfaceBuilder; import net.minecraft.world.gen.surfacebuilder.SurfaceBuilder; diff --git a/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java b/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java index 746a4b38..bbe78a14 100644 --- a/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java +++ b/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java @@ -4,7 +4,7 @@ import java.util.Random; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.Registry; -import net.minecraft.world.biome.Biome; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.gen.surfacebuilder.SurfaceBuilder; import net.minecraft.world.gen.surfacebuilder.TernarySurfaceConfig; From df94a0d12f1c095f91eee2c5fbdf69eb4caf867d Mon Sep 17 00:00:00 2001 From: Aleksey Date: Mon, 12 Apr 2021 16:41:36 +0300 Subject: [PATCH 409/463] Continue --- src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java | 2 +- src/main/java/ru/betterend/blocks/SilkMothNestBlock.java | 2 +- src/main/java/ru/betterend/blocks/basis/EndSignBlock.java | 4 ++-- .../blocks/entities/render/EndSignBlockEntityRenderer.java | 6 +++--- src/main/java/ru/betterend/entity/CubozoaEntity.java | 2 +- src/main/java/ru/betterend/entity/EndFishEntity.java | 2 +- src/main/java/ru/betterend/entity/EndSlimeEntity.java | 2 +- src/main/java/ru/betterend/entity/ShadowWalkerEntity.java | 2 +- src/main/java/ru/betterend/entity/SilkMothEntity.java | 2 +- .../integration/byg/features/OldBulbisTreeFeature.java | 2 +- .../java/ru/betterend/mixin/common/HostileEntityMixin.java | 2 +- src/main/java/ru/betterend/util/sdf/SDF.java | 4 ++-- .../ru/betterend/world/features/trees/HelixTreeFeature.java | 2 +- 13 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java b/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java index fa827811..cc53adf6 100644 --- a/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java +++ b/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java @@ -25,7 +25,7 @@ import net.minecraft.world.level.block.Rotation; import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.core.BlockPos; -import net.minecraft.util.math.Box; +import net.minecraft.world.phys.AABB; import net.minecraft.core.Direction; import net.minecraft.util.math.Vec3d; import net.minecraft.world.level.Level; diff --git a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java index 7d1eda7b..281e7d2e 100644 --- a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java +++ b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java @@ -32,7 +32,7 @@ import net.minecraft.world.level.block.Rotation; import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.core.BlockPos; -import net.minecraft.util.math.Box; +import net.minecraft.world.phys.AABB; import net.minecraft.core.Direction; import net.minecraft.util.math.Vec3d; import net.minecraft.util.shape.VoxelShape; diff --git a/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java b/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java index 91b59a98..539ba8f9 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java @@ -5,7 +5,7 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.AbstractSignBlock; +import net.minecraft.world.level.block.SignBlock; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; @@ -44,7 +44,7 @@ import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; import ru.betterend.util.BlocksHelper; -public class EndSignBlock extends AbstractSignBlock implements BlockPatterned, ISpetialItem { +public class EndSignBlock extends SignBlock implements BlockPatterned, ISpetialItem { public static final IntegerProperty ROTATION = Properties.ROTATION; public static final BooleanProperty FLOOR = BooleanProperty.of("floor"); private static final VoxelShape[] WALL_SHAPES = new VoxelShape[] { diff --git a/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java b/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java index 53eb67ee..287f9ec6 100644 --- a/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java +++ b/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java @@ -5,7 +5,7 @@ import java.util.List; import com.google.common.collect.Maps; -import net.minecraft.world.level.block.AbstractSignBlock; +import net.minecraft.world.level.block.SignBlock; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.SignBlock; @@ -91,8 +91,8 @@ public class EndSignBlockEntityRenderer extends BlockEntityRenderer mapWorld = Maps.newHashMap(); Map addInfo = Maps.newHashMap(); diff --git a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java index 28ab3a7f..5f43fa48 100644 --- a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java @@ -9,7 +9,7 @@ import net.minecraft.world.level.block.state.BlockState; import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; -import net.minecraft.util.math.Box; +import net.minecraft.world.phys.AABB; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.chunk.ChunkGenerator; From 99ade39404ac59ec9b698dbefc46e2dcd1a5f1dc Mon Sep 17 00:00:00 2001 From: Aleksey Date: Mon, 12 Apr 2021 18:05:06 +0300 Subject: [PATCH 410/463] Continue --- src/main/java/ru/betterend/blocks/basis/AttachedBlock.java | 2 +- src/main/java/ru/betterend/entity/DragonflyEntity.java | 2 ++ src/main/java/ru/betterend/entity/EndSlimeEntity.java | 5 +++++ src/main/java/ru/betterend/entity/SilkMothEntity.java | 3 +++ .../ru/betterend/mixin/common/ChorusFlowerBlockMixin.java | 2 +- .../ru/betterend/mixin/common/ChorusPlantBlockMixin.java | 2 +- src/main/java/ru/betterend/registry/EndItems.java | 3 --- 7 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/basis/AttachedBlock.java b/src/main/java/ru/betterend/blocks/basis/AttachedBlock.java index 6c0919cf..64f1f99a 100644 --- a/src/main/java/ru/betterend/blocks/basis/AttachedBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/AttachedBlock.java @@ -19,7 +19,7 @@ import ru.betterend.util.BlocksHelper; public abstract class AttachedBlock extends BlockBaseNotFull { public static final DirectionProperty FACING = Properties.FACING; - public AttachedBlock(Properties settings) { + public AttachedBlock(net.minecraft.world.level.block.state.BlockBehaviour.Properties settings) { super(settings); this.setDefaultState(this.defaultBlockState().with(FACING, Direction.UP)); } diff --git a/src/main/java/ru/betterend/entity/DragonflyEntity.java b/src/main/java/ru/betterend/entity/DragonflyEntity.java index 8e31c418..c8519aa4 100644 --- a/src/main/java/ru/betterend/entity/DragonflyEntity.java +++ b/src/main/java/ru/betterend/entity/DragonflyEntity.java @@ -32,6 +32,8 @@ import net.minecraft.world.Heightmap.Type; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.Level; import net.minecraft.world.WorldView; +import ru.betterend.entity.DragonflyEntity.DragonflyLookControl; +import ru.betterend.entity.DragonflyEntity.WanderAroundGoal; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndSounds; import ru.betterend.util.BlocksHelper; diff --git a/src/main/java/ru/betterend/entity/EndSlimeEntity.java b/src/main/java/ru/betterend/entity/EndSlimeEntity.java index aee640da..a8fcf67e 100644 --- a/src/main/java/ru/betterend/entity/EndSlimeEntity.java +++ b/src/main/java/ru/betterend/entity/EndSlimeEntity.java @@ -38,6 +38,11 @@ import net.minecraft.world.LocalDifficulty; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.Level; import net.minecraft.world.level.biome.Biome; +import ru.betterend.entity.EndSlimeEntity.EndSlimeMoveControl; +import ru.betterend.entity.EndSlimeEntity.FaceTowardTargetGoal; +import ru.betterend.entity.EndSlimeEntity.MoveGoal; +import ru.betterend.entity.EndSlimeEntity.RandomLookGoal; +import ru.betterend.entity.EndSlimeEntity.SwimmingGoal; import ru.betterend.interfaces.ISlime; import ru.betterend.registry.EndBiomes; import ru.betterend.util.BlocksHelper; diff --git a/src/main/java/ru/betterend/entity/SilkMothEntity.java b/src/main/java/ru/betterend/entity/SilkMothEntity.java index 27309827..967f496c 100644 --- a/src/main/java/ru/betterend/entity/SilkMothEntity.java +++ b/src/main/java/ru/betterend/entity/SilkMothEntity.java @@ -47,6 +47,9 @@ import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.Level; import ru.betterend.BetterEnd; import ru.betterend.blocks.BlockProperties; +import ru.betterend.entity.SilkMothEntity.MothLookControl; +import ru.betterend.entity.SilkMothEntity.ReturnToHiveGoal; +import ru.betterend.entity.SilkMothEntity.WanderAroundGoal; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndItems; diff --git a/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java index da3255b4..ac47da86 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java @@ -36,7 +36,7 @@ public abstract class ChorusFlowerBlockMixin extends Block { private static final VoxelShape SHAPE_FULL = Block.createCuboidShape(0, 0, 0, 16, 16, 16); private static final VoxelShape SHAPE_HALF = Block.createCuboidShape(0, 0, 0, 16, 4, 16); - public ChorusFlowerBlockMixin(Properties settings) { + public ChorusFlowerBlockMixin(net.minecraft.world.level.block.state.BlockBehaviour.Properties settings) { super(settings); } diff --git a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java index ce3b77ad..99535afb 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java @@ -27,7 +27,7 @@ import ru.betterend.world.generator.GeneratorOptions; @Mixin(value = ChorusPlantBlock.class, priority = 100) public abstract class ChorusPlantBlockMixin extends Block { - public ChorusPlantBlockMixin(Properties settings) { + public ChorusPlantBlockMixin(net.minecraft.world.level.block.state.BlockBehaviour.Properties settings) { super(settings); } diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index 7e8f1f1e..cae4b4ed 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -18,11 +18,8 @@ import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.level.material.Fluids; import net.minecraft.world.item.Item.Properties; -import net.minecraft.world.item.TieredItem; -import net.minecraft.world.item.Tiers; import net.minecraft.tags.Tag; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.Rarity; import net.minecraft.core.Direction; import net.minecraft.core.Registry; import ru.betterend.BetterEnd; From f03fd03bd04b5d0601333818416484e1234a6316 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Mon, 12 Apr 2021 21:38:22 +0300 Subject: [PATCH 411/463] Continue mapping migration --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- src/main/java/ru/betterend/BetterEnd.java | 24 +- .../ru/betterend/blocks/AeterniumAnvil.java | 8 +- .../ru/betterend/blocks/AeterniumBlock.java | 9 +- .../betterend/blocks/AmaranitaCapBlock.java | 4 +- .../blocks/AmaranitaHymenophoreBlock.java | 4 +- .../blocks/AncientEmeraldIceBlock.java | 22 +- .../betterend/blocks/AuroraCrystalBlock.java | 48 +- .../ru/betterend/blocks/BlockProperties.java | 145 +-- .../java/ru/betterend/blocks/BlockSounds.java | 11 +- .../ru/betterend/blocks/BlueVineBlock.java | 6 +- .../blocks/BlueVineLanternBlock.java | 41 +- .../betterend/blocks/BlueVineSeedBlock.java | 41 +- .../betterend/blocks/BoluxMushroomBlock.java | 40 +- .../ru/betterend/blocks/BrimstoneBlock.java | 71 +- .../ru/betterend/blocks/BubbleCoralBlock.java | 43 +- .../ru/betterend/blocks/BulbVineBlock.java | 33 +- .../blocks/BulbVineLanternBlock.java | 52 +- .../blocks/BulbVineLanternColoredBlock.java | 6 +- .../betterend/blocks/BulbVineSeedBlock.java | 22 +- .../ru/betterend/blocks/CavePumpkinBlock.java | 59 +- .../blocks/CavePumpkinVineBlock.java | 60 +- .../ru/betterend/blocks/ChandelierBlock.java | 51 +- .../ru/betterend/blocks/CharniaBlock.java | 11 +- .../ru/betterend/blocks/ChorusGrassBlock.java | 2 +- .../ru/betterend/blocks/DenseSnowBlock.java | 4 +- .../blocks/DragonTreeSaplingBlock.java | 8 +- .../ru/betterend/blocks/EmeraldIceBlock.java | 54 +- .../ru/betterend/blocks/EndLilyBlock.java | 101 +-- .../ru/betterend/blocks/EndLilySeedBlock.java | 28 +- .../betterend/blocks/EndLotusFlowerBlock.java | 42 +- .../betterend/blocks/EndLotusLeafBlock.java | 58 +- .../betterend/blocks/EndLotusSeedBlock.java | 82 +- .../betterend/blocks/EndLotusStemBlock.java | 80 +- .../ru/betterend/blocks/EndPathBlock.java | 44 +- .../java/ru/betterend/blocks/EndPedestal.java | 9 +- .../ru/betterend/blocks/EndPortalBlock.java | 82 +- .../ru/betterend/blocks/EndStoneBlock.java | 4 +- .../ru/betterend/blocks/EndStoneSmelter.java | 125 +-- .../ru/betterend/blocks/EndTerrainBlock.java | 90 +- .../java/ru/betterend/blocks/EnderBlock.java | 15 +- .../betterend/blocks/EndstoneDustBlock.java | 17 +- .../ru/betterend/blocks/EternalPedestal.java | 77 +- .../blocks/EternalRunedFlavolite.java | 26 +- .../betterend/blocks/FilaluxLanternBlock.java | 5 +- .../ru/betterend/blocks/FlamaeaBlock.java | 42 +- .../blocks/GlowingHymenophoreBlock.java | 5 +- .../ru/betterend/blocks/GlowingMossBlock.java | 20 +- .../blocks/GlowingPillarLuminophorBlock.java | 48 +- .../blocks/GlowingPillarRootsBlock.java | 16 +- .../blocks/GlowingPillarSeedBlock.java | 62 +- .../blocks/HelixTreeLeavesBlock.java | 53 +- .../ru/betterend/blocks/HydraluxBlock.java | 64 +- .../betterend/blocks/HydraluxPetalBlock.java | 26 +- .../blocks/HydraluxPetalColoredBlock.java | 10 +- .../blocks/HydraluxSaplingBlock.java | 25 +- .../blocks/HydrothermalVentBlock.java | 128 +-- .../ru/betterend/blocks/InfusionPedestal.java | 70 +- .../betterend/blocks/JellyshroomCapBlock.java | 52 +- .../blocks/LacugroveSaplingBlock.java | 11 +- .../ru/betterend/blocks/LanceleafBlock.java | 52 +- .../betterend/blocks/LanceleafSeedBlock.java | 29 +- .../betterend/blocks/LargeAmaranitaBlock.java | 66 +- .../ru/betterend/blocks/LumecornBlock.java | 82 +- .../betterend/blocks/LumecornSeedBlock.java | 13 +- .../betterend/blocks/MengerSpongeBlock.java | 73 +- .../blocks/MengerSpongeWetBlock.java | 68 +- .../blocks/MossyDragonBoneBlock.java | 56 +- .../blocks/MossyGlowshroomCapBlock.java | 21 +- .../blocks/MossyGlowshroomSaplingBlock.java | 11 +- .../ru/betterend/blocks/MossyObsidian.java | 55 +- .../ru/betterend/blocks/MurkweedBlock.java | 24 +- .../ru/betterend/blocks/NeedlegrassBlock.java | 30 +- .../ru/betterend/blocks/NeonCactusBlock.java | 133 ++- .../ru/betterend/blocks/PedestalVanilla.java | 9 +- .../blocks/PythadendronSaplingBlock.java | 8 +- .../betterend/blocks/RespawnObeliskBlock.java | 154 ++-- .../ru/betterend/blocks/RunedFlavolite.java | 15 +- .../ru/betterend/blocks/ShadowBerryBlock.java | 16 +- .../ru/betterend/blocks/ShadowGrassBlock.java | 7 +- .../betterend/blocks/SilkMothHiveBlock.java | 110 ++- .../betterend/blocks/SilkMothNestBlock.java | 156 ++-- .../betterend/blocks/SmallAmaranitaBlock.java | 50 +- .../blocks/SmallJellyshroomBlock.java | 83 +- .../blocks/SmaragdantCrystalBlock.java | 11 +- .../blocks/SmaragdantCrystalShardBlock.java | 105 +-- .../betterend/blocks/SulphurCrystalBlock.java | 114 +-- .../betterend/blocks/TenaneaFlowersBlock.java | 30 +- .../betterend/blocks/TenaneaSaplingBlock.java | 8 +- .../ru/betterend/blocks/TerminiteBlock.java | 9 +- .../betterend/blocks/TerrainPlantBlock.java | 6 +- .../blocks/TwistedUmbrellaMossBlock.java | 42 +- .../blocks/TwistedUmbrellaMossTallBlock.java | 20 +- .../betterend/blocks/UmbrellaMossBlock.java | 42 +- .../blocks/UmbrellaMossTallBlock.java | 20 +- .../blocks/UmbrellaTreeClusterBlock.java | 54 +- .../blocks/UmbrellaTreeClusterEmptyBlock.java | 32 +- .../blocks/UmbrellaTreeMembraneBlock.java | 63 +- .../blocks/UmbrellaTreeSaplingBlock.java | 10 +- .../blocks/VentBubbleColumnBlock.java | 102 ++- .../betterend/blocks/basis/AttachedBlock.java | 62 +- .../ru/betterend/blocks/basis/BarkBlock.java | 9 +- .../blocks/basis/BaseBlockWithEntity.java | 15 +- .../ru/betterend/blocks/basis/BlockBase.java | 13 +- .../blocks/basis/BlockBaseNotFull.java | 10 +- .../blocks/basis/DoublePlantBlock.java | 138 +-- .../betterend/blocks/basis/EndAnvilBlock.java | 26 +- .../blocks/basis/EndBarrelBlock.java | 69 +- .../blocks/basis/EndBlockStripableLogLog.java | 40 +- .../blocks/basis/EndBookshelfBlock.java | 22 +- .../betterend/blocks/basis/EndChainBlock.java | 18 +- .../betterend/blocks/basis/EndChestBlock.java | 32 +- .../blocks/basis/EndComposterBlock.java | 20 +- .../blocks/basis/EndCraftingTableBlock.java | 18 +- .../betterend/blocks/basis/EndCropBlock.java | 92 +- .../betterend/blocks/basis/EndDoorBlock.java | 22 +- .../betterend/blocks/basis/EndFenceBlock.java | 22 +- .../blocks/basis/EndFurnaceBlock.java | 51 +- .../betterend/blocks/basis/EndGateBlock.java | 22 +- .../blocks/basis/EndLadderBlock.java | 96 +- .../blocks/basis/EndLanternBlock.java | 129 +-- .../blocks/basis/EndLeavesBlock.java | 63 +- .../blocks/basis/EndMetalPaneBlock.java | 33 +- .../blocks/basis/EndMetalPlateBlock.java | 22 +- .../betterend/blocks/basis/EndOreBlock.java | 37 +- .../blocks/basis/EndPillarBlock.java | 22 +- .../betterend/blocks/basis/EndPlantBlock.java | 107 +-- .../blocks/basis/EndPlantWithAgeBlock.java | 51 +- .../betterend/blocks/basis/EndPlateBlock.java | 26 +- .../betterend/blocks/basis/EndSignBlock.java | 156 ++-- .../betterend/blocks/basis/EndSlabBlock.java | 20 +- .../blocks/basis/EndStairsBlock.java | 27 +- .../blocks/basis/EndStoneButtonBlock.java | 22 +- .../blocks/basis/EndStonelateBlock.java | 2 +- .../blocks/basis/EndTrapdoorBlock.java | 24 +- .../basis/EndUnderwaterWallPlantBlock.java | 55 +- .../betterend/blocks/basis/EndWallBlock.java | 24 +- .../blocks/basis/EndWallPlantBlock.java | 104 ++- .../blocks/basis/EndWoodenButtonBlock.java | 24 +- .../blocks/basis/EndWoodenPlateBlock.java | 2 +- .../blocks/basis/FeatureSaplingBlock.java | 84 +- .../ru/betterend/blocks/basis/FurBlock.java | 72 +- .../betterend/blocks/basis/PedestalBlock.java | 298 +++---- .../blocks/basis/SimpleLeavesBlock.java | 47 +- .../blocks/basis/StalactiteBlock.java | 181 ++-- .../blocks/basis/StoneLanternBlock.java | 40 +- .../blocks/basis/StrippableBarkBlock.java | 40 +- .../blocks/basis/TripleTerrainBlock.java | 96 +- .../blocks/basis/UnderwaterPlantBlock.java | 126 +-- .../basis/UnderwaterPlantWithAgeBlock.java | 43 +- .../blocks/basis/UpDownPlantBlock.java | 84 +- .../ru/betterend/blocks/basis/VineBlock.java | 126 +-- .../blocks/basis/WallMushroomBlock.java | 30 +- .../blocks/complex/ColoredMaterial.java | 39 +- .../complex/CrystalSubblocksMaterial.java | 46 +- .../blocks/complex/MetalMaterial.java | 192 ++-- .../blocks/complex/StoneMaterial.java | 72 +- .../blocks/complex/WoodenMaterial.java | 94 +- .../entities/BlockEntityHydrothermalVent.java | 25 +- .../blocks/entities/EBarrelBlockEntity.java | 114 +-- .../blocks/entities/EFurnaceBlockEntity.java | 20 +- .../entities/EndStoneSmelterBlockEntity.java | 312 ++++--- .../entities/EternalPedestalEntity.java | 22 +- .../entities/InfusionPedestalEntity.java | 24 +- .../blocks/entities/PedestalBlockEntity.java | 85 +- .../render/EndChestBlockEntityRenderer.java | 161 ++-- .../render/EndSignBlockEntityRenderer.java | 129 ++- .../entities/render/PedestalItemRenderer.java | 58 +- .../ru/betterend/client/BetterEndClient.java | 8 +- .../client/gui/BlockSignEditScreen.java | 167 ++-- .../gui/EndStoneSmelterRecipeBookScreen.java | 60 +- .../client/gui/EndStoneSmelterScreen.java | 108 ++- .../gui/EndStoneSmelterScreenHandler.java | 122 ++- .../client/gui/slot/SmelterFuelSlot.java | 18 +- .../client/gui/slot/SmelterOutputSlot.java | 34 +- .../betterend/client/render/BeamRenderer.java | 75 +- .../client/render/EndCrystalRenderer.java | 114 ++- .../client/render/EternalCrystalRenderer.java | 63 +- .../ru/betterend/config/ConfigKeeper.java | 16 +- .../java/ru/betterend/config/ConfigKey.java | 10 +- .../java/ru/betterend/config/IdConfig.java | 13 +- .../ru/betterend/effects/EndEnchantments.java | 9 +- .../java/ru/betterend/effects/EndPotions.java | 15 +- .../betterend/effects/EndStatusEffects.java | 10 +- .../enchantment/EndVeilEnchantment.java | 10 +- .../effects/status/EndVeilEffect.java | 8 +- .../ru/betterend/entity/CubozoaEntity.java | 160 ++-- .../ru/betterend/entity/DragonflyEntity.java | 158 ++-- .../ru/betterend/entity/EndFishEntity.java | 137 ++- .../ru/betterend/entity/EndSlimeEntity.java | 330 +++---- .../betterend/entity/ShadowWalkerEntity.java | 138 +-- .../ru/betterend/entity/SilkMothEntity.java | 262 +++--- .../entity/model/BlockBenchModel.java | 21 +- .../entity/model/CubozoaEntityModel.java | 77 +- .../entity/model/DragonflyEntityModel.java | 85 +- .../entity/model/EndFishEntityModel.java | 57 +- .../entity/model/EndSlimeEntityModel.java | 74 +- .../entity/model/SilkMothEntityModel.java | 92 +- .../entity/render/RendererEntityCubozoa.java | 45 +- .../render/RendererEntityDragonfly.java | 18 +- .../entity/render/RendererEntityEndFish.java | 40 +- .../entity/render/RendererEntityEndSlime.java | 92 +- .../render/RendererEntityShadowWalker.java | 12 +- .../entity/render/SilkMothEntityRenderer.java | 8 +- .../events/PlayerAdvancementsEvents.java | 15 +- .../FlamboyantRefabricatedIntegration.java | 43 +- .../betterend/integration/ModIntegration.java | 107 +-- .../integration/NourishIntegration.java | 7 +- .../betterend/integration/byg/BYGBlocks.java | 7 +- .../integration/byg/BYGIntegration.java | 19 +- .../integration/byg/biomes/EterialGrove.java | 31 +- .../byg/biomes/NightshadeRedwoods.java | 53 +- .../byg/biomes/OldBulbisGardens.java | 84 +- .../byg/features/BigEtherTreeFeature.java | 20 +- .../features/GreatNightshadeTreeFeature.java | 42 +- .../NightshadeRedwoodTreeFeature.java | 38 +- .../byg/features/OldBulbisTreeFeature.java | 28 +- .../integration/rei/REIAlloyingCategory.java | 53 +- .../integration/rei/REIAlloyingDisplay.java | 55 +- .../rei/REIAlloyingFuelCategory.java | 31 +- .../integration/rei/REIAnvilCategory.java | 45 +- .../integration/rei/REIAnvilDisplay.java | 24 +- .../integration/rei/REIInfusionCategory.java | 53 +- .../integration/rei/REIInfusionDisplay.java | 25 +- .../betterend/integration/rei/REIPlugin.java | 21 +- .../ru/betterend/interfaces/IBiomeList.java | 1 - .../betterend/interfaces/IColorProvider.java | 3 +- .../betterend/interfaces/IRenderTypeable.java | 2 +- .../interfaces/TeleportingEntity.java | 2 - .../java/ru/betterend/item/DrinkItem.java | 36 +- .../ru/betterend/item/EnchantedPetalItem.java | 4 +- .../java/ru/betterend/item/EndArmorItem.java | 16 +- .../ru/betterend/item/EndSpawnEggItem.java | 2 +- .../java/ru/betterend/item/GuideBookItem.java | 47 +- .../ru/betterend/item/PatternedDiscItem.java | 3 +- .../java/ru/betterend/item/PatternedItem.java | 2 +- .../item/material/EndArmorMaterial.java | 32 +- .../item/material/EndToolMaterial.java | 19 +- .../item/model/CrystaliteArmorProvider.java | 84 +- .../item/model/CrystaliteBootsModel.java | 44 +- .../item/model/CrystaliteChestplateModel.java | 76 +- .../item/model/CrystaliteHelmetModel.java | 26 +- .../item/model/CrystaliteLeggingsModel.java | 36 +- .../ru/betterend/item/tool/EndAxeItem.java | 6 +- .../ru/betterend/item/tool/EndHammerItem.java | 70 +- .../ru/betterend/item/tool/EndHoeItem.java | 2 +- .../betterend/item/tool/EndPickaxeItem.java | 16 +- .../ru/betterend/item/tool/EndShovelItem.java | 13 +- .../ru/betterend/item/tool/EndSwordItem.java | 2 +- .../client/AbstractSoundInstanceAccessor.java | 3 +- .../mixin/client/AnvilScreenMixin.java | 74 +- .../mixin/client/BackgroundRendererMixin.java | 70 +- .../mixin/client/BiomeColorsMixin.java | 20 +- .../client/ClientPlayNetworkHandlerMixin.java | 24 +- .../mixin/client/ClientRecipeBookMixin.java | 13 +- .../mixin/client/ContextGsonAccessor.java | 5 +- .../client/EnchantingTableBlockMixin.java | 26 +- .../mixin/client/MinecraftClientMixin.java | 52 +- .../mixin/client/ModelLoaderMixin.java | 50 +- .../mixin/client/ModelVariantMapMixin.java | 19 +- .../mixin/client/MusicTrackerMixin.java | 57 +- .../client/NamespaceResourceManagerMixin.java | 23 +- .../mixin/client/WorldRendererMixin.java | 243 +++--- .../mixin/common/AbstractBlockMixin.java | 31 +- .../mixin/common/AnvilBlockMixin.java | 15 +- .../mixin/common/AnvilScreenHandlerMixin.java | 116 ++- .../mixin/common/ArmorItemAccessor.java | 8 +- .../mixin/common/BiomeArrayMixin.java | 11 +- .../mixin/common/BoneMealItemMixin.java | 81 +- .../mixin/common/BrewingAccessor.java | 9 +- .../mixin/common/ChorusFlowerBlockMixin.java | 97 +-- .../mixin/common/ChorusPlantBlockMixin.java | 98 ++- .../mixin/common/ChorusPlantFeatureMixin.java | 37 +- .../mixin/common/ComposterBlockAccessor.java | 5 +- .../common/CraftingScreenHandlerMixin.java | 18 +- .../mixin/common/DimensionTypeMixin.java | 23 +- .../common/EnchantmentScreenHandlerMixin.java | 74 +- .../mixin/common/EndCityFeatureMixin.java | 27 +- .../mixin/common/EndPortalFeatureMixin.java | 47 +- .../mixin/common/EndSpikeFeatureMixin.java | 92 +- .../mixin/common/EndermanEntityMixin.java | 19 +- .../betterend/mixin/common/EntityMixin.java | 51 +- .../common/GenerationSettingsAccessor.java | 16 +- .../mixin/common/HostileEntityMixin.java | 31 +- .../mixin/common/LivingEntityMixin.java | 27 +- .../mixin/common/MinecraftServerMixin.java | 54 +- .../common/NoiseChunkGeneratorMixin.java | 40 +- .../common/PlayerAdvancementTrackerMixin.java | 18 +- .../mixin/common/PlayerEntityMixin.java | 32 +- .../mixin/common/PlayerManagerMixin.java | 221 +++-- .../mixin/common/RecipeManagerAccessor.java | 8 +- .../mixin/common/RecipeManagerMixin.java | 37 +- .../mixin/common/ServerPlayerEntityMixin.java | 92 +- .../mixin/common/ServerWorldMixin.java | 50 +- .../mixin/common/SlimeEntityMixin.java | 10 +- .../mixin/common/TagGroupLoaderMixin.java | 19 +- .../common/WeightedBiomePickerMixin.java | 9 +- .../java/ru/betterend/noise/VoronoiNoise.java | 31 +- .../betterend/particle/FireflyParticle.java | 55 +- .../particle/GlowingSphereParticleEffect.java | 12 +- .../betterend/particle/InfusionParticle.java | 64 +- .../particle/InfusionParticleType.java | 42 +- .../particle/ParticleBlackSpore.java | 67 +- .../ru/betterend/particle/ParticleGeyser.java | 78 +- .../particle/ParticleGlowingSphere.java | 34 +- .../particle/ParticleJungleSpore.java | 67 +- .../betterend/particle/ParticleSnowflake.java | 71 +- .../betterend/particle/ParticleSulphur.java | 71 +- .../particle/ParticleTenaneaPetal.java | 85 +- .../particle/PaticlePortalSphere.java | 41 +- .../particle/SmaragdantParticle.java | 67 +- .../ru/betterend/patterns/BlockPatterned.java | 2 - .../java/ru/betterend/patterns/Patterns.java | 87 +- .../ru/betterend/recipe/AlloyingRecipes.java | 47 +- .../ru/betterend/recipe/AnvilRecipes.java | 76 +- .../ru/betterend/recipe/CraftingRecipes.java | 345 ++++---- .../ru/betterend/recipe/EndRecipeManager.java | 15 +- .../ru/betterend/recipe/FurnaceRecipes.java | 5 +- .../ru/betterend/recipe/InfusionRecipes.java | 823 ++++++++++++------ .../ru/betterend/recipe/SmithingRecipes.java | 108 ++- .../recipe/builders/AlloyingRecipe.java | 145 ++- .../recipe/builders/AnvilRecipe.java | 163 ++-- .../recipe/builders/FurnaceRecipe.java | 53 +- .../betterend/recipe/builders/GridRecipe.java | 70 +- .../recipe/builders/InfusionRecipe.java | 159 ++-- .../recipe/builders/SmithingTableRecipe.java | 53 +- .../java/ru/betterend/registry/EndBiomes.java | 175 ++-- .../betterend/registry/EndBlockEntities.java | 59 +- .../java/ru/betterend/registry/EndBlocks.java | 339 +++----- .../ru/betterend/registry/EndEntities.java | 52 +- .../registry/EndEntitiesRenders.java | 10 +- .../ru/betterend/registry/EndFeatures.java | 339 +++----- .../java/ru/betterend/registry/EndItems.java | 166 ++-- .../ru/betterend/registry/EndParticles.java | 13 +- .../ru/betterend/registry/EndPortals.java | 58 +- .../java/ru/betterend/registry/EndSounds.java | 15 +- .../ru/betterend/registry/EndStructures.java | 54 +- .../java/ru/betterend/registry/EndTags.java | 120 +-- .../ru/betterend/registry/FilaluxBlock.java | 8 +- .../betterend/registry/FilaluxWingsBlock.java | 35 +- .../betterend/registry/PondAnemoneBlock.java | 44 +- .../ru/betterend/rituals/EternalRitual.java | 260 +++--- .../ru/betterend/rituals/InfusionRitual.java | 140 ++- .../java/ru/betterend/util/BlocksHelper.java | 164 ++-- .../java/ru/betterend/util/BonemealUtil.java | 53 +- .../java/ru/betterend/util/ColorUtil.java | 98 +-- .../java/ru/betterend/util/DataFixerUtil.java | 8 +- .../ru/betterend/util/FeaturesHelper.java | 20 +- src/main/java/ru/betterend/util/ItemUtil.java | 28 +- src/main/java/ru/betterend/util/LangUtil.java | 12 +- .../java/ru/betterend/util/LootTableUtil.java | 18 +- src/main/java/ru/betterend/util/MHelper.java | 156 ++-- .../java/ru/betterend/util/RecipeHelper.java | 8 +- .../java/ru/betterend/util/SpawnHelper.java | 24 +- .../java/ru/betterend/util/SplineHelper.java | 176 ++-- .../ru/betterend/util/StructureHelper.java | 241 ++--- .../java/ru/betterend/util/TagHelper.java | 50 +- .../ru/betterend/util/TranslationHelper.java | 32 +- .../java/ru/betterend/util/WorldDataUtil.java | 23 +- .../java/ru/betterend/util/sdf/PosInfo.java | 31 +- src/main/java/ru/betterend/util/sdf/SDF.java | 96 +- .../util/sdf/operator/SDFBinary.java | 10 +- .../util/sdf/operator/SDFCoordModify.java | 9 +- .../util/sdf/operator/SDFDisplacement.java | 7 +- .../util/sdf/operator/SDFFlatWave.java | 2 +- .../util/sdf/operator/SDFHeightmap.java | 24 +- .../util/sdf/operator/SDFRadialNoiseMap.java | 21 +- .../util/sdf/operator/SDFRotation.java | 10 +- .../sdf/operator/SDFSmoothIntersection.java | 2 +- .../sdf/operator/SDFSmoothSubtraction.java | 2 +- .../betterend/util/sdf/operator/SDFUnary.java | 6 +- .../util/sdf/primitive/SDFCappedCone.java | 9 +- .../util/sdf/primitive/SDFCapsule.java | 6 +- .../betterend/util/sdf/primitive/SDFLine.java | 6 +- .../betterend/util/sdf/primitive/SDFPie.java | 14 +- .../util/sdf/primitive/SDFPrimitive.java | 21 +- .../world/biome/BiomeDefinition.java | 188 ++-- .../ru/betterend/world/biome/EndBiome.java | 26 +- .../world/biome/air/BiomeIceStarfield.java | 14 +- .../world/biome/cave/EndCaveBiome.java | 33 +- .../world/biome/cave/LushAuroraCaveBiome.java | 25 +- .../world/biome/land/AmberLandBiome.java | 34 +- .../biome/land/BlossomingSpiresBiome.java | 30 +- .../world/biome/land/ChorusForestBiome.java | 44 +- .../biome/land/CrystalMountainsBiome.java | 10 +- .../biome/land/DragonGraveyardsBiome.java | 26 +- .../world/biome/land/DryShrublandBiome.java | 20 +- .../world/biome/land/DustWastelandsBiome.java | 17 +- .../biome/land/FoggyMushroomlandBiome.java | 45 +- .../biome/land/GlowingGrasslandsBiome.java | 35 +- .../world/biome/land/LanternWoodsBiome.java | 36 +- .../world/biome/land/MegalakeBiome.java | 36 +- .../world/biome/land/MegalakeGroveBiome.java | 39 +- .../world/biome/land/NeonOasisBiome.java | 21 +- .../biome/land/PaintedMountainsBiome.java | 16 +- .../world/biome/land/ShadowForestBiome.java | 42 +- .../world/biome/land/SulphurSpringsBiome.java | 30 +- .../world/biome/land/UmbrellaJungleBiome.java | 43 +- .../world/features/BiomeIslandFeature.java | 22 +- .../world/features/BlueVineFeature.java | 16 +- .../world/features/CavePlantFeature.java | 9 +- .../world/features/CavePumpkinFeature.java | 9 +- .../world/features/CharniaFeature.java | 2 +- .../world/features/CrashedShipFeature.java | 77 +- .../world/features/DefaultFeature.java | 22 +- .../world/features/DoublePlantFeature.java | 23 +- .../betterend/world/features/EndFeature.java | 157 ++-- .../world/features/EndLilyFeature.java | 5 +- .../world/features/EndLotusFeature.java | 5 +- .../world/features/EndLotusLeafFeature.java | 37 +- .../world/features/FilaluxFeature.java | 15 +- .../features/FullHeightScatterFeature.java | 7 +- .../world/features/GlowPillarFeature.java | 7 +- .../world/features/HydraluxFeature.java | 5 +- .../features/InvertedScatterFeature.java | 9 +- .../world/features/LanceleafFeature.java | 7 +- .../betterend/world/features/ListFeature.java | 42 +- .../world/features/MengerSpongeFeature.java | 13 +- .../world/features/NBTStructureFeature.java | 71 +- .../world/features/NeonCactusFeature.java | 17 +- .../world/features/ScatterFeature.java | 5 +- .../world/features/SilkMothNestFeature.java | 25 +- .../SingleInvertedScatterFeature.java | 19 +- .../world/features/SinglePlantFeature.java | 40 +- .../world/features/SkyScatterFeature.java | 21 +- .../features/UnderwaterPlantFeature.java | 20 +- .../features/UnderwaterPlantScatter.java | 19 +- .../betterend/world/features/VineFeature.java | 32 +- .../world/features/WallPlantFeature.java | 31 +- .../world/features/WallPlantOnLogFeature.java | 9 +- .../world/features/WallScatterFeature.java | 9 +- .../world/features/bushes/BushFeature.java | 22 +- .../features/bushes/BushWithOuterFeature.java | 28 +- .../bushes/LargeAmaranitaFeature.java | 13 +- .../world/features/bushes/Lumecorn.java | 23 +- .../features/bushes/TenaneaBushFeature.java | 34 +- .../terrain/BigAuroraCrystalFeature.java | 7 +- .../features/terrain/EndLakeFeature.java | 38 +- .../features/terrain/FallenPillarFeature.java | 13 +- .../terrain/FloatingSpireFeature.java | 8 +- .../world/features/terrain/GeyserFeature.java | 36 +- .../features/terrain/IceStarFeature.java | 11 +- .../terrain/ObsidianBoulderFeature.java | 13 +- .../ObsidianPillarBasementFeature.java | 13 +- .../features/terrain/OreLayerFeature.java | 5 +- .../features/terrain/SingleBlockFeature.java | 13 +- .../terrain/SmaragdantCrystalFeature.java | 12 +- .../world/features/terrain/SpireFeature.java | 16 +- .../features/terrain/StalactiteFeature.java | 19 +- .../features/terrain/SulphurHillFeature.java | 7 +- .../terrain/SulphuricCaveFeature.java | 44 +- .../terrain/SulphuricLakeFeature.java | 52 +- .../features/terrain/SurfaceVentFeature.java | 10 +- .../caves/CaveChunkPopulatorFeature.java | 24 +- .../terrain/caves/EndCaveFeature.java | 30 +- .../terrain/caves/RoundCaveFeature.java | 30 +- .../terrain/caves/TunelCaveFeature.java | 28 +- .../features/trees/DragonTreeFeature.java | 32 +- .../trees/GiganticAmaranitaFeature.java | 32 +- .../features/trees/HelixTreeFeature.java | 61 +- .../features/trees/JellyshroomFeature.java | 24 +- .../features/trees/LacugroveFeature.java | 25 +- .../world/features/trees/LucerniaFeature.java | 37 +- .../trees/MossyGlowshroomFeature.java | 31 +- .../trees/PythadendronTreeFeature.java | 27 +- .../world/features/trees/TenaneaFeature.java | 34 +- .../features/trees/UmbrellaTreeFeature.java | 34 +- .../world/generator/BetterEndBiomeSource.java | 82 +- .../betterend/world/generator/BiomeMap.java | 10 +- .../world/generator/BiomePicker.java | 22 +- .../world/generator/GeneratorOptions.java | 46 +- .../world/generator/IslandLayer.java | 108 +-- .../world/generator/LayerOptions.java | 15 +- .../world/generator/TerrainGenerator.java | 87 +- .../DestructionStructureProcessor.java | 22 +- .../processors/TerrainStructureProcessor.java | 25 +- .../world/structures/EndStructureFeature.java | 29 +- .../world/structures/StructureWorld.java | 110 ++- .../features/EternalPortalStructure.java | 56 +- .../features/FeatureBaseStructure.java | 33 +- .../features/GiantIceStarStructure.java | 68 +- .../GiantMossyGlowshroomStructure.java | 77 +- .../features/MegaLakeSmallStructure.java | 28 +- .../features/MegaLakeStructure.java | 28 +- .../features/MountainStructure.java | 31 +- .../features/PaintedMountainStructure.java | 44 +- .../features/SDFStructureFeature.java | 37 +- .../world/structures/piece/BasePiece.java | 4 +- .../world/structures/piece/CavePiece.java | 55 +- .../piece/CrystalMountainPiece.java | 77 +- .../world/structures/piece/LakePiece.java | 146 ++-- .../world/structures/piece/MountainPiece.java | 47 +- .../world/structures/piece/NBTPiece.java | 68 +- .../piece/PaintedMountainPiece.java | 63 +- .../world/structures/piece/VoxelPiece.java | 18 +- .../surface/DoubleBlockSurfaceBuilder.java | 48 +- .../surface/SulphuricSurfaceBuilder.java | 45 +- .../world/surface/SurfaceBuilders.java | 39 +- 499 files changed, 12567 insertions(+), 12723 deletions(-) diff --git a/build.gradle b/build.gradle index fbed7c74..b1895389 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'fabric-loom' version '0.6-SNAPSHOT' + id 'fabric-loom' version '0.7-SNAPSHOT' id 'maven-publish' } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 99c200fc..a760d0e7 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index 154a40a3..5ee920a1 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -39,7 +39,6 @@ import ru.betterend.world.surface.SurfaceBuilders; public class BetterEnd implements ModInitializer { public static final String MOD_ID = "betterend"; public static final Logger LOGGER = Logger.get(); - @Override public void onInitialize() { EndPortals.loadPortals(); @@ -67,41 +66,40 @@ public class BetterEnd implements ModInitializer { GeneratorOptions.init(); DataFixerUtil.init(); LootTableUtil.init(); - + if (hasGuideBook()) { GuideBookItem.register(); } - - FabricLoader.getInstance().getEntrypoints("betterend", BetterEndPlugin.class) - .forEach(BetterEndPlugin::register); + + FabricLoader.getInstance().getEntrypoints("betterend", BetterEndPlugin.class).forEach(BetterEndPlugin::register); Configs.saveConfigs(); - + if (hasGuideBook()) { - PlayerAdvancementsEvents.PLAYER_ADVANCEMENT_COMPLETE.register((player, advancement, criterionName) -> { + PlayerAdvancementsEvents.PLAYER_ADVENCEMENT_COMPLETE.register((player, advancement, criterionName) -> { ResourceLocation advId = new ResourceLocation("minecraft:end/enter_end_gateway"); if (advId.equals(advancement.getId())) { - player.giveItemStack(new ItemStack(GuideBookItem.GUIDE_BOOK)); + player.addItem(new ItemStack(GuideBookItem.GUIDE_BOOK)); } }); } } - + public static boolean hasGuideBook() { return FabricLoader.getInstance().isModLoaded("patchouli"); } - + public static ResourceLocation makeID(String path) { return new ResourceLocation(MOD_ID, path); } - + public static String getStringId(String id) { return String.format("%s:%s", MOD_ID, id); } - + public static boolean isDevEnvironment() { return FabricLoader.getInstance().isDevelopmentEnvironment(); } - + public static boolean isClient() { return FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT; } diff --git a/src/main/java/ru/betterend/blocks/AeterniumAnvil.java b/src/main/java/ru/betterend/blocks/AeterniumAnvil.java index fcebb3eb..5ce6eb48 100644 --- a/src/main/java/ru/betterend/blocks/AeterniumAnvil.java +++ b/src/main/java/ru/betterend/blocks/AeterniumAnvil.java @@ -1,10 +1,10 @@ package ru.betterend.blocks; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.IntegerProperty; -import net.minecraft.resources.ResourceLocation; import ru.betterend.blocks.basis.EndAnvilBlock; import ru.betterend.item.material.EndToolMaterial; import ru.betterend.patterns.Patterns; @@ -12,11 +12,11 @@ import ru.betterend.registry.EndBlocks; public class AeterniumAnvil extends EndAnvilBlock { private static final IntegerProperty DESTRUCTION = BlockProperties.DESTRUCTION_LONG; - + public AeterniumAnvil() { super(EndBlocks.AETERNIUM_BLOCK.defaultMaterialColor(), EndToolMaterial.AETERNIUM.getLevel()); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(DESTRUCTION); @@ -24,7 +24,7 @@ public class AeterniumAnvil extends EndAnvilBlock { } @Override - public IntegerProperty getDESTRUCTION() { + public IntegerProperty getDestructionProperty() { return DESTRUCTION; } diff --git a/src/main/java/ru/betterend/blocks/AeterniumBlock.java b/src/main/java/ru/betterend/blocks/AeterniumBlock.java index 32a52412..a8d98b32 100644 --- a/src/main/java/ru/betterend/blocks/AeterniumBlock.java +++ b/src/main/java/ru/betterend/blocks/AeterniumBlock.java @@ -5,17 +5,20 @@ import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; import net.minecraft.world.level.material.MaterialColor; -import net.minecraft.world.level.block.SoundType; import ru.betterend.blocks.basis.BlockBase; public class AeterniumBlock extends BlockBase { public AeterniumBlock() { - super(FabricBlockSettings.of(Material.METAL, MaterialColor.COLOR_GRAY).hardness(65F).resistance(1200F) - .requiresTool().sounds(SoundType.NETHERITE_BLOCK)); + super(FabricBlockSettings.of(Material.METAL, MaterialColor.COLOR_GRAY) + .hardness(65F) + .resistance(1200F) + .requiresCorrectToolForDrops() + .sound(SoundType.NETHERITE_BLOCK)); } @Environment(EnvType.CLIENT) diff --git a/src/main/java/ru/betterend/blocks/AmaranitaCapBlock.java b/src/main/java/ru/betterend/blocks/AmaranitaCapBlock.java index 717228df..173134db 100644 --- a/src/main/java/ru/betterend/blocks/AmaranitaCapBlock.java +++ b/src/main/java/ru/betterend/blocks/AmaranitaCapBlock.java @@ -2,12 +2,12 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.material.Material; import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.material.Material; import ru.betterend.blocks.basis.BlockBase; public class AmaranitaCapBlock extends BlockBase { public AmaranitaCapBlock() { - super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sounds(SoundType.WOOD)); + super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sound(SoundType.WOOD)); } } diff --git a/src/main/java/ru/betterend/blocks/AmaranitaHymenophoreBlock.java b/src/main/java/ru/betterend/blocks/AmaranitaHymenophoreBlock.java index 100c4d24..9aa743c7 100644 --- a/src/main/java/ru/betterend/blocks/AmaranitaHymenophoreBlock.java +++ b/src/main/java/ru/betterend/blocks/AmaranitaHymenophoreBlock.java @@ -2,15 +2,15 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.material.Material; import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.material.Material; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; public class AmaranitaHymenophoreBlock extends BlockBase implements IRenderTypeable { public AmaranitaHymenophoreBlock() { - super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sounds(SoundType.WOOD)); + super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sound(SoundType.WOOD)); } @Override diff --git a/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java index 616279c7..61516a0a 100644 --- a/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java +++ b/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java @@ -3,11 +3,11 @@ package ru.betterend.blocks; import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.server.level.ServerLevel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndParticles; @@ -16,13 +16,13 @@ import ru.betterend.util.MHelper; public class AncientEmeraldIceBlock extends BlockBase { public AncientEmeraldIceBlock() { - super(FabricBlockSettings.copyOf(Blocks.BLUE_ICE).ticksRandomly()); + super(FabricBlockSettings.copyOf(Blocks.BLUE_ICE).randomTicks()); } - + @Override public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { Direction dir = BlocksHelper.randomDirection(random); - + if (random.nextBoolean()) { int x = MHelper.randRange(-2, 2, random); int y = MHelper.randRange(-2, 2, random); @@ -33,20 +33,20 @@ public class AncientEmeraldIceBlock extends BlockBase { makeParticles(world, p, random); } } - + pos = pos.relative(dir); state = world.getBlockState(pos); if (state.is(Blocks.WATER)) { world.setBlockAndUpdate(pos, EndBlocks.EMERALD_ICE.defaultBlockState()); makeParticles(world, pos, random); - } else if (state.is(EndBlocks.EMERALD_ICE)) { + } + else if (state.is(EndBlocks.EMERALD_ICE)) { world.setBlockAndUpdate(pos, EndBlocks.DENSE_EMERALD_ICE.defaultBlockState()); makeParticles(world, pos, random); } } - + private void makeParticles(ServerLevel world, BlockPos pos, Random random) { - world.sendParticles(EndParticles.SNOWFLAKE, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 20, 0.5, 0.5, - 0.5, 0); + world.sendParticles(EndParticles.SNOWFLAKE, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 20, 0.5, 0.5, 0.5, 0); } } diff --git a/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java b/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java index 73b3580a..9533b296 100644 --- a/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java +++ b/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java @@ -5,39 +5,47 @@ import java.util.List; import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tag.TagRegistry; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.client.color.block.BlockColor; +import net.minecraft.client.color.item.ItemColor; import net.minecraft.core.Vec3i; import net.minecraft.util.Mth; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.block.AbstractGlassBlock; +import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; -import net.minecraft.client.color.block.BlockColor; -import net.minecraft.client.color.item.ItemColor; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.world.level.block.SoundType; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IColorProvider; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndItems; +import ru.betterend.registry.EndTags; import ru.betterend.util.MHelper; public class AuroraCrystalBlock extends AbstractGlassBlock implements IRenderTypeable, IColorProvider { public static final Vec3i[] COLORS; private static final int MIN_DROP = 1; private static final int MAX_DROP = 4; - + public AuroraCrystalBlock() { - super(FabricBlockSettings.of(Material.GLASS).breakByTool(FabricToolTags.PICKAXES) - .suffocates((state, world, pos) -> false).hardness(1F).resistance(1F).sounds(SoundType.GLASS) - .luminance(15).nonOpaque()); + super(FabricBlockSettings.of(Material.GLASS) + .breakByTool(FabricToolTags.PICKAXES) + .breakByTool(EndTags.HAMMERS) + .hardness(1F) + .resistance(1F) + .luminance(15) + .noOcclusion() + .isSuffocating((state, world, pos) -> false) + .sound(SoundType.GLASS)); } @Override - public BlockColor getBlockProvider() { + public BlockColor getProvider() { return (state, world, pos, tintIndex) -> { long i = (long) pos.getX() + (long) pos.getY() + (long) pos.getZ(); double delta = i * 0.1; @@ -45,28 +53,30 @@ public class AuroraCrystalBlock extends AbstractGlassBlock implements IRenderTyp int index2 = (index + 1) & 3; delta -= index; index &= 3; - + Vec3i color1 = COLORS[index]; Vec3i color2 = COLORS[index2]; - + int r = MHelper.floor(Mth.lerp(delta, color1.getX(), color2.getX())); int g = MHelper.floor(Mth.lerp(delta, color1.getY(), color2.getY())); int b = MHelper.floor(Mth.lerp(delta, color1.getZ(), color2.getZ())); - + return MHelper.color(r, g, b); }; } @Override public ItemColor getItemProvider() { - return (stack, tintIndex) -> MHelper.color(COLORS[3].getX(), COLORS[3].getY(), COLORS[3].getZ()); + return (stack, tintIndex) -> { + return MHelper.color(COLORS[3].getX(), COLORS[3].getY(), COLORS[3].getZ()); + }; } @Override public ERenderLayer getRenderLayer() { return ERenderLayer.TRANSLUCENT; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); @@ -91,9 +101,13 @@ public class AuroraCrystalBlock extends AbstractGlassBlock implements IRenderTyp } return Lists.newArrayList(); } - + static { - COLORS = new Vec3i[] { new Vec3i(247, 77, 161), new Vec3i(120, 184, 255), new Vec3i(120, 255, 168), - new Vec3i(243, 58, 255) }; + COLORS = new Vec3i[] { + new Vec3i(247, 77, 161), + new Vec3i(120, 184, 255), + new Vec3i(120, 255, 168), + new Vec3i(243, 58, 255) + }; } } diff --git a/src/main/java/ru/betterend/blocks/BlockProperties.java b/src/main/java/ru/betterend/blocks/BlockProperties.java index 5d153ab1..5a7df101 100644 --- a/src/main/java/ru/betterend/blocks/BlockProperties.java +++ b/src/main/java/ru/betterend/blocks/BlockProperties.java @@ -1,146 +1,163 @@ package ru.betterend.blocks; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.EnumProperty; +import net.minecraft.util.StringRepresentable; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.EnumProperty; import net.minecraft.world.level.block.state.properties.IntegerProperty; -import net.minecraft.util.StringIdentifiable; import ru.betterend.registry.EndPortals; public class BlockProperties { - public static final EnumProperty HYDRALUX_SHAPE = EnumProperty.of("shape", HydraluxShape.class); - public final static EnumProperty PEDESTAL_STATE = EnumProperty.of("state", PedestalState.class); - public static final EnumProperty TRIPLE_SHAPE = EnumProperty.of("shape", TripleShape.class); - public static final EnumProperty PENTA_SHAPE = EnumProperty.of("shape", PentaShape.class); - - public static final BooleanProperty TRANSITION = BooleanProperty.of("transition"); - public static final BooleanProperty HAS_LIGHT = BooleanProperty.of("has_light"); - public static final BooleanProperty HAS_ITEM = BooleanProperty.of("has_item"); - public static final BooleanProperty IS_FLOOR = BooleanProperty.of("is_floor"); - public static final BooleanProperty NATURAL = BooleanProperty.of("natural"); - public static final BooleanProperty ACTIVE = BooleanProperty.of("active"); - public static final BooleanProperty SMALL = BooleanProperty.of("small"); - - public static final IntegerProperty DESTRUCTION_LONG = IntegerProperty.of("destruction", 0, 8); - public static final IntegerProperty DESTRUCTION = IntegerProperty.of("destruction", 0, 2); - public static final IntegerProperty ROTATION = IntegerProperty.of("rotation", 0, 3); - public static final IntegerProperty FULLNESS = IntegerProperty.of("fullness", 0, 3); - public static final IntegerProperty COLOR = IntegerProperty.of("color", 0, 7); - public static final IntegerProperty PORTAL = IntegerProperty.of("portal", 0, EndPortals.getCount()); - public static final IntegerProperty SIZE = IntegerProperty.of("size", 0, 7); - public static final IntegerProperty AGE = IntegerProperty.of("age", 0, 3); - - public static enum TripleShape implements StringIdentifiable { - TOP("top"), MIDDLE("middle"), BOTTOM("bottom"); - + public static final EnumProperty HYDRALUX_SHAPE = EnumProperty.create("shape", HydraluxShape.class); + public final static EnumProperty PEDESTAL_STATE = EnumProperty.create("state", PedestalState.class); + public static final EnumProperty TRIPLE_SHAPE = EnumProperty.create("shape", TripleShape.class); + public static final EnumProperty PENTA_SHAPE = EnumProperty.create("shape", PentaShape.class); + + public static final BooleanProperty TRANSITION = BooleanProperty.create("transition"); + public static final BooleanProperty HAS_LIGHT = BooleanProperty.create("has_light"); + public static final BooleanProperty HAS_ITEM = BooleanProperty.create("has_item"); + public static final BooleanProperty IS_FLOOR = BooleanProperty.create("is_floor"); + public static final BooleanProperty NATURAL = BooleanProperty.create("natural"); + public static final BooleanProperty ACTIVE = BooleanProperty.create("active"); + public static final BooleanProperty SMALL = BooleanProperty.create("small"); + + public static final IntegerProperty DESTRUCTION_LONG = IntegerProperty.create("destruction", 0, 8); + public static final IntegerProperty DESTRUCTION = IntegerProperty.create("destruction", 0, 2); + public static final IntegerProperty ROTATION = IntegerProperty.create("rotation", 0, 3); + public static final IntegerProperty FULLNESS = IntegerProperty.create("fullness", 0, 3); + public static final IntegerProperty COLOR = IntegerProperty.create("color", 0, 7); + public static final IntegerProperty PORTAL = IntegerProperty.create("portal", 0, EndPortals.getCount()); + public static final IntegerProperty SIZE = IntegerProperty.create("size", 0, 7); + public static final IntegerProperty AGE = IntegerProperty.create("age", 0, 3); + + public static enum TripleShape implements StringRepresentable { + TOP("top"), + MIDDLE("middle"), + BOTTOM("bottom"); + private final String name; - + TripleShape(String name) { this.name = name; } @Override - public String asString() { + public String getSerializedName() { return name; } - + @Override public String toString() { return name; } } - public static enum PedestalState implements StringIdentifiable { - PEDESTAL_TOP("pedestal_top"), COLUMN_TOP("column_top"), BOTTOM("bottom"), PILLAR("pillar"), COLUMN("column"), + public static enum PedestalState implements StringRepresentable { + PEDESTAL_TOP("pedestal_top"), + COLUMN_TOP("column_top"), + BOTTOM("bottom"), + PILLAR("pillar"), + COLUMN("column"), DEFAULT("default"); - + private final String name; - + PedestalState(String name) { this.name = name; } - + @Override - public String asString() { + public String getSerializedName() { return this.name; } - + @Override public String toString() { return this.name; } } - - public static enum HydraluxShape implements StringIdentifiable { - FLOWER_BIG_BOTTOM("flower_big_bottom", true), FLOWER_BIG_TOP("flower_big_top", true), - FLOWER_SMALL_BOTTOM("flower_small_bottom", true), FLOWER_SMALL_TOP("flower_small_top", true), - VINE("vine", false), ROOTS("roots", false); - + + public static enum HydraluxShape implements StringRepresentable { + FLOWER_BIG_BOTTOM("flower_big_bottom", true), + FLOWER_BIG_TOP("flower_big_top", true), + FLOWER_SMALL_BOTTOM("flower_small_bottom", true), + FLOWER_SMALL_TOP("flower_small_top", true), + VINE("vine", false), + ROOTS("roots", false); + private final String name; private final boolean glow; - + HydraluxShape(String name, boolean glow) { this.name = name; this.glow = glow; } @Override - public String asString() { + public String getSerializedName() { return name; } - + @Override public String toString() { return name; } - + public boolean hasGlow() { return glow; } } - - public static enum PentaShape implements StringIdentifiable { - BOTTOM("bottom"), PRE_BOTTOM("pre_bottom"), MIDDLE("middle"), PRE_TOP("pre_top"), TOP("top"); - + + public static enum PentaShape implements StringRepresentable { + BOTTOM("bottom"), + PRE_BOTTOM("pre_bottom"), + MIDDLE("middle"), + PRE_TOP("pre_top"), + TOP("top"); + private final String name; - + PentaShape(String name) { this.name = name; } @Override - public String asString() { + public String getSerializedName() { return name; } - + @Override public String toString() { return name; } } - - public static enum LumecornShape implements StringIdentifiable { - LIGHT_TOP("light_top", 15), LIGHT_TOP_MIDDLE("light_top_middle", 15), LIGHT_MIDDLE("light_middle", 15), - LIGHT_BOTTOM("light_bottom", 15), MIDDLE("middle", 0), BOTTOM_BIG("bottom_big", 0), + + public static enum LumecornShape implements StringRepresentable { + LIGHT_TOP("light_top", 15), + LIGHT_TOP_MIDDLE("light_top_middle", 15), + LIGHT_MIDDLE("light_middle", 15), + LIGHT_BOTTOM("light_bottom", 15), + MIDDLE("middle", 0), + BOTTOM_BIG("bottom_big", 0), BOTTOM_SMALL("bottom_small", 0); - + private final String name; private final int light; - + LumecornShape(String name, int light) { this.name = name; this.light = light; } @Override - public String asString() { + public String getSerializedName() { return name; } - + @Override public String toString() { return name; } - + public int getLight() { return light; } diff --git a/src/main/java/ru/betterend/blocks/BlockSounds.java b/src/main/java/ru/betterend/blocks/BlockSounds.java index 75c2ac41..21f89213 100644 --- a/src/main/java/ru/betterend/blocks/BlockSounds.java +++ b/src/main/java/ru/betterend/blocks/BlockSounds.java @@ -1,10 +1,13 @@ package ru.betterend.blocks; -import net.minecraft.world.level.block.SoundType; import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.level.block.SoundType; public class BlockSounds { - public static final SoundType TERRAIN_SOUND = new SoundType(1.0F, 1.0F, SoundEvents.BLOCK_STONE_BREAK, - SoundEvents.BLOCK_WART_BLOCK_STEP, SoundEvents.BLOCK_STONE_PLACE, SoundEvents.BLOCK_STONE_HIT, - SoundEvents.BLOCK_STONE_FALL); + public static final SoundType TERRAIN_SOUND = new SoundType(1.0F, 1.0F, + SoundEvents.STONE_BREAK, + SoundEvents.WART_BLOCK_STEP, + SoundEvents.STONE_PLACE, + SoundEvents.STONE_HIT, + SoundEvents.STONE_FALL); } diff --git a/src/main/java/ru/betterend/blocks/BlueVineBlock.java b/src/main/java/ru/betterend/blocks/BlueVineBlock.java index 0d1b0643..9187d92b 100644 --- a/src/main/java/ru/betterend/blocks/BlueVineBlock.java +++ b/src/main/java/ru/betterend/blocks/BlueVineBlock.java @@ -3,19 +3,19 @@ package ru.betterend.blocks; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.EnumProperty; +import net.minecraft.world.level.block.state.properties.EnumProperty; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.UpDownPlantBlock; import ru.betterend.registry.EndBlocks; public class BlueVineBlock extends UpDownPlantBlock { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE); } - + @Override protected boolean isTerrain(BlockState state) { return state.getBlock() == EndBlocks.END_MOSS || state.getBlock() == EndBlocks.END_MYCELIUM; diff --git a/src/main/java/ru/betterend/blocks/BlueVineLanternBlock.java b/src/main/java/ru/betterend/blocks/BlueVineLanternBlock.java index 44de7d10..ac6671dd 100644 --- a/src/main/java/ru/betterend/blocks/BlueVineLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/BlueVineLanternBlock.java @@ -2,44 +2,43 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.BooleanProperty; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +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.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.Material; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; public class BlueVineLanternBlock extends BlockBase { public static final BooleanProperty NATURAL = BlockProperties.NATURAL; - + public BlueVineLanternBlock() { - super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sounds(SoundType.WART_BLOCK) - .luminance(15)); - this.setDefaultState(this.stateManager.defaultBlockState().with(NATURAL, false)); + super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).luminance(15).sound(SoundType.WART_BLOCK)); + this.registerDefaultState(this.stateDefinition.any().setValue(NATURAL, false)); } - + @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return state.getValue(NATURAL) ? world.getBlockState(pos.below()).getBlock() == EndBlocks.BLUE_VINE : true; + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + return !state.getValue(NATURAL) || world.getBlockState(pos.below()).getBlock() == EndBlocks.BLUE_VINE; } - + @Override - public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, - BlockPos pos, BlockPos neighborPos) { - if (!canPlaceAt(state, world, pos)) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) { return Blocks.AIR.defaultBlockState(); - } else { + } + else { return state; } } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(NATURAL); diff --git a/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java b/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java index 5c8e3b99..0d5d63a4 100644 --- a/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java @@ -1,12 +1,11 @@ package ru.betterend.blocks; import java.util.Random; - -import net.minecraft.world.level.block.AbstractBlock; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.blocks.basis.FurBlock; @@ -22,40 +21,34 @@ public class BlueVineSeedBlock extends EndPlantWithAgeBlock { if (h < height + 1) { return; } - BlocksHelper.setWithoutUpdate(world, pos, - EndBlocks.BLUE_VINE.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.BLUE_VINE.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); for (int i = 1; i < height; i++) { - BlocksHelper.setWithoutUpdate(world, pos.up(i), - EndBlocks.BLUE_VINE.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); + BlocksHelper.setWithoutUpdate(world, pos.above(i), EndBlocks.BLUE_VINE.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); } - BlocksHelper.setWithoutUpdate(world, pos.up(height), - EndBlocks.BLUE_VINE.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); - placeLantern(world, pos.up(height + 1)); + BlocksHelper.setWithoutUpdate(world, pos.above(height), EndBlocks.BLUE_VINE.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); + placeLantern(world, pos.above(height + 1)); } - + private void placeLantern(WorldGenLevel world, BlockPos pos) { - BlocksHelper.setWithoutUpdate(world, pos, - EndBlocks.BLUE_VINE_LANTERN.defaultBlockState().with(BlueVineLanternBlock.NATURAL, true)); - for (Direction dir : BlocksHelper.HORIZONTAL) { + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.BLUE_VINE_LANTERN.defaultBlockState().setValue(BlueVineLanternBlock.NATURAL, true)); + for (Direction dir: BlocksHelper.HORIZONTAL) { BlockPos p = pos.relative(dir); - if (world.isAir(p)) { - BlocksHelper.setWithoutUpdate(world, p, - EndBlocks.BLUE_VINE_FUR.defaultBlockState().with(FurBlock.FACING, dir)); + if (world.isEmptyBlock(p)) { + BlocksHelper.setWithoutUpdate(world, p, EndBlocks.BLUE_VINE_FUR.defaultBlockState().setValue(FurBlock.FACING, dir)); } } - if (world.isAir(pos.up())) { - BlocksHelper.setWithoutUpdate(world, pos.up(), - EndBlocks.BLUE_VINE_FUR.defaultBlockState().with(FurBlock.FACING, Direction.UP)); + if (world.isEmptyBlock(pos.above())) { + BlocksHelper.setWithoutUpdate(world, pos.above(), EndBlocks.BLUE_VINE_FUR.defaultBlockState().setValue(FurBlock.FACING, Direction.UP)); } } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.END_MOSS) || state.is(EndBlocks.END_MYCELIUM); } - + @Override - public AbstractBlock.OffsetType getOffsetType() { - return AbstractBlock.OffsetType.NONE; + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.NONE; } } diff --git a/src/main/java/ru/betterend/blocks/BoluxMushroomBlock.java b/src/main/java/ru/betterend/blocks/BoluxMushroomBlock.java index 338016be..fb512f7d 100644 --- a/src/main/java/ru/betterend/blocks/BoluxMushroomBlock.java +++ b/src/main/java/ru/betterend/blocks/BoluxMushroomBlock.java @@ -2,54 +2,52 @@ package ru.betterend.blocks; import java.util.List; import java.util.Random; - -import com.google.common.collect.Lists; - -import net.minecraft.world.level.block.AbstractBlock; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.core.BlockPos; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import com.google.common.collect.Lists; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; public class BoluxMushroomBlock extends EndPlantBlock { - private static final VoxelShape SHAPE = Block.createCuboidShape(1, 0, 1, 15, 9, 15); - + private static final VoxelShape SHAPE = Block.box(1, 0, 1, 15, 9, 15); + public BoluxMushroomBlock() { super(10); } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.RUTISCUS); } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPE; } @Override - public AbstractBlock.OffsetType getOffsetType() { - return AbstractBlock.OffsetType.NONE; + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.NONE; } - + @Override - public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { return false; } @Override - public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return false; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { return Lists.newArrayList(new ItemStack(this)); diff --git a/src/main/java/ru/betterend/blocks/BrimstoneBlock.java b/src/main/java/ru/betterend/blocks/BrimstoneBlock.java index 50f5439a..92e34923 100644 --- a/src/main/java/ru/betterend/blocks/BrimstoneBlock.java +++ b/src/main/java/ru/betterend/blocks/BrimstoneBlock.java @@ -5,52 +5,51 @@ import java.util.Random; import org.jetbrains.annotations.Nullable; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.MaterialColor; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.item.ItemStack; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.BooleanProperty; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.MaterialColor; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; public class BrimstoneBlock extends BlockBase { public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; - + public BrimstoneBlock() { - super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(MaterialColor.COLOR_BROWN).ticksRandomly()); - setDefaultState(stateManager.defaultBlockState().with(ACTIVATED, false)); + super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(MaterialColor.COLOR_BROWN).randomTicks()); + registerDefaultState(stateDefinition.any().setValue(ACTIVATED, false)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(ACTIVATED); } @Override - public void onPlaced(Level world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, - ItemStack itemStack) { + public void setPlacedBy(Level world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack itemStack) { if (world.isClientSide()) { updateChunks((ClientLevel) world, pos); } } - - public void onBroken(LevelAccessor world, BlockPos pos, BlockState state) { + + public void destroy(LevelAccessor world, BlockPos pos, BlockState state) { if (world.isClientSide()) { updateChunks((ClientLevel) world, pos); } } - + private void updateChunks(ClientLevel world, BlockPos pos) { int y = pos.getY() >> 4; int x1 = (pos.getX() - 2) >> 4; @@ -59,41 +58,45 @@ public class BrimstoneBlock extends BlockBase { int z2 = (pos.getZ() + 2) >> 4; for (int x = x1; x <= x2; x++) { for (int z = z1; z <= z2; z++) { - world.scheduleBlockRenders(x, y, z); + world.setSectionDirtyWithNeighbors(x, y, z); } } } - + @Override - public void scheduledTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + public void tick(BlockState state, ServerLevel world, BlockPos pos, Random random) { boolean deactivate = true; - for (Direction dir : BlocksHelper.DIRECTIONS) { - if (world.getFluidState(pos.relative(dir)).getFluid().equals(Fluids.WATER)) { + for (Direction dir: BlocksHelper.DIRECTIONS) { + if (world.getFluidState(pos.relative(dir)).getType().equals(Fluids.WATER)) { deactivate = false; break; } } if (state.getValue(ACTIVATED)) { if (deactivate) { - world.setBlockAndUpdate(pos, getDefaultState().with(ACTIVATED, false)); - } else if (state.getValue(ACTIVATED) && random.nextInt(16) == 0) { + world.setBlockAndUpdate(pos, defaultBlockState().setValue(ACTIVATED, false)); + } + else if (state.getValue(ACTIVATED) && random.nextInt(16) == 0) { Direction dir = BlocksHelper.randomDirection(random); BlockPos side = pos.relative(dir); BlockState sideState = world.getBlockState(side); if (sideState.getBlock() instanceof SulphurCrystalBlock) { - if (sideState.get(SulphurCrystalBlock.AGE) < 2 && sideState.get(SulphurCrystalBlock.WATERLOGGED)) { - int age = sideState.get(SulphurCrystalBlock.AGE) + 1; - world.setBlockAndUpdate(side, sideState.with(SulphurCrystalBlock.AGE, age)); + if (sideState.getValue(SulphurCrystalBlock.AGE) < 2 && sideState.getValue(SulphurCrystalBlock.WATERLOGGED)) { + int age = sideState.getValue(SulphurCrystalBlock.AGE) + 1; + world.setBlockAndUpdate(side, sideState.setValue(SulphurCrystalBlock.AGE, age)); } - } else if (sideState.getFluidState().getFluid() == Fluids.WATER) { + } + else if (sideState.getFluidState().getType() == Fluids.WATER) { BlockState crystal = EndBlocks.SULPHUR_CRYSTAL.defaultBlockState() - .with(SulphurCrystalBlock.FACING, dir).with(SulphurCrystalBlock.WATERLOGGED, true) - .with(SulphurCrystalBlock.AGE, 0); + .setValue(SulphurCrystalBlock.FACING, dir) + .setValue(SulphurCrystalBlock.WATERLOGGED, true) + .setValue(SulphurCrystalBlock.AGE, 0); world.setBlockAndUpdate(side, crystal); } } - } else if (!deactivate && !state.getValue(ACTIVATED)) { - world.setBlockAndUpdate(pos, getDefaultState().with(ACTIVATED, true)); + } + else if (!deactivate && !state.getValue(ACTIVATED)) { + world.setBlockAndUpdate(pos, defaultBlockState().setValue(ACTIVATED, true)); } } } diff --git a/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java b/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java index 4eed7a40..6ffc1849 100644 --- a/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java +++ b/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java @@ -6,30 +6,33 @@ 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.world.level.block.AbstractBlock; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.world.level.block.SoundType; import net.minecraft.core.BlockPos; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.core.particles.ParticleTypes; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.basis.UnderwaterPlantBlock; public class BubbleCoralBlock extends UnderwaterPlantBlock { - private static final VoxelShape SHAPE = Block.createCuboidShape(0, 0, 0, 16, 14, 16); - + private static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 14, 16); + public BubbleCoralBlock() { - super(FabricBlockSettings.of(Material.UNDERWATER_PLANT).breakByTool(FabricToolTags.SHEARS) - .sounds(SoundType.CORAL).breakByHand(true).noCollision()); + super(FabricBlockSettings.of(Material.WATER_PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.CORAL_BLOCK) + .noCollission()); } - + @Override - public AbstractBlock.OffsetType getOffsetType() { - return AbstractBlock.OffsetType.NONE; + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.NONE; } @Environment(EnvType.CLIENT) @@ -39,19 +42,19 @@ public class BubbleCoralBlock extends UnderwaterPlantBlock { double z = pos.getZ() + random.nextDouble(); world.addParticle(ParticleTypes.BUBBLE, x, y, z, 0.0D, 0.0D, 0.0D); } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPE; } - + @Override - public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { return false; } @Override - public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return false; } } diff --git a/src/main/java/ru/betterend/blocks/BulbVineBlock.java b/src/main/java/ru/betterend/blocks/BulbVineBlock.java index 53e2b1cf..50846ebc 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineBlock.java @@ -1,15 +1,13 @@ package ru.betterend.blocks; import java.util.List; - -import com.google.common.collect.Lists; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.core.BlockPos; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import com.google.common.collect.Lists; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.VineBlock; import ru.betterend.registry.EndBlocks; @@ -20,27 +18,28 @@ public class BulbVineBlock extends VineBlock { public BulbVineBlock() { super(15, true); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { if (state.getValue(SHAPE) == TripleShape.BOTTOM) { return Lists.newArrayList(new ItemStack(EndItems.GLOWING_BULB)); - } else if (MHelper.RANDOM.nextInt(8) == 0) { + } + else if (MHelper.RANDOM.nextInt(8) == 0) { return Lists.newArrayList(new ItemStack(EndBlocks.BULB_VINE_SEED)); - } else { + } + else { return Lists.newArrayList(); } } - + @Override - public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { return false; } - + @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - boolean canPlace = super.canPlaceAt(state, world, pos); - return (state.is(this) && state.getValue(SHAPE) == TripleShape.BOTTOM) ? canPlace - : canPlace && world.getBlockState(pos.below()).is(this); + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + boolean canPlace = super.canSurvive(state, world, pos); + return (state.is(this) && state.getValue(SHAPE) == TripleShape.BOTTOM) ? canPlace : canPlace && world.getBlockState(pos.below()).is(this); } } diff --git a/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java b/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java index 714bb717..d9d19915 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java @@ -7,17 +7,17 @@ import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; import net.minecraft.world.level.material.MaterialColor; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Registry; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.basis.EndLanternBlock; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; @@ -25,21 +25,26 @@ import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; public class BulbVineLanternBlock extends EndLanternBlock implements IRenderTypeable, BlockPatterned { - private static final VoxelShape SHAPE_CEIL = Block.createCuboidShape(4, 4, 4, 12, 16, 12); - private static final VoxelShape SHAPE_FLOOR = Block.createCuboidShape(4, 0, 4, 12, 12, 12); - + private static final VoxelShape SHAPE_CEIL = Block.box(4, 4, 4, 12, 16, 12); + private static final VoxelShape SHAPE_FLOOR = Block.box(4, 0, 4, 12, 12, 12); + public BulbVineLanternBlock() { - this(FabricBlockSettings.of(Material.METAL).sounds(SoundType.LANTERN).hardness(1).resistance(1) - .breakByTool(FabricToolTags.PICKAXES).materialColor(MaterialColor.LIGHT_GRAY).requiresTool() - .luminance(15)); + this(FabricBlockSettings.of(Material.METAL) + .hardness(1) + .resistance(1) + .breakByTool(FabricToolTags.PICKAXES) + .materialColor(MaterialColor.COLOR_LIGHT_GRAY) + .luminance(15) + .requiresCorrectToolForDrops() + .sound(SoundType.LANTERN)); } - - public BulbVineLanternBlock(FabricBlockSettings settings) { + + public BulbVineLanternBlock(Properties settings) { super(settings); } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return state.getValue(IS_FLOOR) ? SHAPE_FLOOR : SHAPE_CEIL; } @@ -47,13 +52,13 @@ public class BulbVineLanternBlock extends EndLanternBlock implements IRenderType public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override public String getStatesPattern(Reader data) { ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(this); @@ -62,21 +67,22 @@ public class BulbVineLanternBlock extends EndLanternBlock implements IRenderType map.put("%metal%", getMetalTexture(blockId)); if (block.contains("item") || block.contains("ceil")) { return Patterns.createJson(Patterns.BLOCK_BULB_LANTERN_CEIL, map); - } else { + } + else { return Patterns.createJson(Patterns.BLOCK_BULB_LANTERN_FLOOR, map); } } - + protected String getMetalTexture(ResourceLocation blockId) { String name = blockId.getPath(); name = name.substring(0, name.indexOf('_')); return name + "_bulb_vine_lantern_metal"; } - + protected String getGlowTexture() { return "bulb_vine_lantern_bulb"; } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_BULB_LANTERN; diff --git a/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java b/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java index 80031b50..90d414b8 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java @@ -13,7 +13,7 @@ public class BulbVineLanternColoredBlock extends BulbVineLanternBlock implements } @Override - public BlockColor getBlockProvider() { + public BlockColor getProvider() { return (state, world, pos, tintIndex) -> { return getColor(); }; @@ -25,7 +25,7 @@ public class BulbVineLanternColoredBlock extends BulbVineLanternBlock implements return getColor(); }; } - + private int getColor() { int color = BlocksHelper.getBlockColor(this); int b = (color & 255); @@ -34,7 +34,7 @@ public class BulbVineLanternColoredBlock extends BulbVineLanternBlock implements float[] hsv = MHelper.fromRGBtoHSB(r, g, b); return MHelper.fromHSBtoRGB(hsv[0], hsv[1], hsv[1] > 0.2 ? 1 : hsv[2]); } - + @Override protected String getGlowTexture() { return "bulb_vine_lantern_overlay"; diff --git a/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java b/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java index bbcb470e..9ce91135 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java @@ -1,12 +1,11 @@ package ru.betterend.blocks; import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.tags.BlockTags; import net.minecraft.core.BlockPos; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; @@ -15,23 +14,20 @@ import ru.betterend.util.BlocksHelper; public class BulbVineSeedBlock extends EndPlantWithAgeBlock { @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - BlockState up = world.getBlockState(pos.up()); - return up.isIn(EndTags.GEN_TERRAIN) || up.isIn(BlockTags.LOGS) || up.isIn(BlockTags.LEAVES); + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + BlockState up = world.getBlockState(pos.above()); + return up.is(EndTags.GEN_TERRAIN) || up.is(BlockTags.LOGS) || up.is(BlockTags.LEAVES); } @Override public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { int h = BlocksHelper.downRay(world, pos, random.nextInt(24)) - 1; if (h > 2) { - BlocksHelper.setWithoutUpdate(world, pos, - EndBlocks.BULB_VINE.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.BULB_VINE.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); for (int i = 1; i < h; i++) { - BlocksHelper.setWithoutUpdate(world, pos.down(i), - EndBlocks.BULB_VINE.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); + BlocksHelper.setWithoutUpdate(world, pos.below(i), EndBlocks.BULB_VINE.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); } - BlocksHelper.setWithoutUpdate(world, pos.down(h), - EndBlocks.BULB_VINE.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); + BlocksHelper.setWithoutUpdate(world, pos.below(h), EndBlocks.BULB_VINE.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); } } } diff --git a/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java b/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java index ce6fe814..5121e6c4 100644 --- a/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java +++ b/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java @@ -4,18 +4,18 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.BooleanProperty; import net.minecraft.core.BlockPos; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.basis.BlockBaseNotFull; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; @@ -25,42 +25,41 @@ public class CavePumpkinBlock extends BlockBaseNotFull implements IRenderTypeabl public static final BooleanProperty SMALL = BlockProperties.SMALL; private static final VoxelShape SHAPE_SMALL; private static final VoxelShape SHAPE_BIG; - + public CavePumpkinBlock() { - super(FabricBlockSettings.copyOf(Blocks.PUMPKIN).luminance((state) -> state.getValue(SMALL) ? 10 : 15)); - setDefaultState(getDefaultState().with(SMALL, false)); + super(FabricBlockSettings.copyOf(Blocks.PUMPKIN).lightLevel((state) -> state.getValue(SMALL) ? 10 : 15)); + registerDefaultState(defaultBlockState().setValue(SMALL, false)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SMALL); } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { + public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { return state.getValue(SMALL) ? SHAPE_SMALL : SHAPE_BIG; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { - return state.getValue(SMALL) ? Collections.singletonList(new ItemStack(EndBlocks.CAVE_PUMPKIN_SEED)) - : Collections.singletonList(new ItemStack(this)); + return state.getValue(SMALL) ? Collections.singletonList(new ItemStack(EndBlocks.CAVE_PUMPKIN_SEED)) : Collections.singletonList(new ItemStack(this)); } - + static { - VoxelShape lantern = Block.createCuboidShape(1, 0, 1, 15, 13, 15); - VoxelShape cap = Block.createCuboidShape(0, 12, 0, 16, 15, 16); - VoxelShape top = Block.createCuboidShape(5, 15, 5, 11, 16, 11); - SHAPE_BIG = VoxelShapes.union(lantern, cap, top); - - lantern = Block.createCuboidShape(1, 7, 1, 15, 13, 15); - cap = Block.createCuboidShape(4, 12, 4, 12, 15, 12); - top = Block.createCuboidShape(6, 15, 6, 10, 16, 10); - SHAPE_SMALL = VoxelShapes.union(lantern, cap, top); + VoxelShape lantern = Block.box(1, 0, 1, 15, 13, 15); + VoxelShape cap = Block.box(0, 12, 0, 16, 15, 16); + VoxelShape top = Block.box(5, 15, 5, 11, 16, 11); + SHAPE_BIG = Shapes.or(lantern, cap, top); + + lantern = Block.box(1, 7, 1, 15, 13, 15); + cap = Block.box(4, 12, 4, 12, 15, 12); + top = Block.box(6, 15, 6, 10, 16, 10); + SHAPE_SMALL = Shapes.or(lantern, cap, top); } } diff --git a/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java b/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java index 592f5de0..e5754327 100644 --- a/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java +++ b/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java @@ -1,73 +1,69 @@ package ru.betterend.blocks; import java.util.Random; - -import net.minecraft.world.level.block.AbstractBlock; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.server.level.ServerLevel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; public class CavePumpkinVineBlock extends EndPlantWithAgeBlock { - private static final VoxelShape SHAPE = Block.createCuboidShape(4, 0, 4, 12, 16, 12); - + private static final VoxelShape SHAPE = Block.box(4, 0, 4, 12, 16, 12); + @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - BlockState down = world.getBlockState(pos.up()); + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + BlockState down = world.getBlockState(pos.above()); return isTerrain(down); } - + @Override - public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { int age = state.getValue(AGE); BlockState down = world.getBlockState(pos.below()); - if (down.getMaterial().isReplaceable() - || (down.is(EndBlocks.CAVE_PUMPKIN) && down.get(BlockProperties.SMALL))) { + if (down.getMaterial().isReplaceable() || (down.is(EndBlocks.CAVE_PUMPKIN) && down.getValue(BlockProperties.SMALL))) { if (age < 3) { - world.setBlockAndUpdate(pos, state.with(AGE, age + 1)); + world.setBlockAndUpdate(pos, state.setValue(AGE, age + 1)); } if (age == 2) { - world.setBlockAndUpdate(pos.below(), - EndBlocks.CAVE_PUMPKIN.defaultBlockState().with(BlockProperties.SMALL, true)); - } else if (age == 3) { + world.setBlockAndUpdate(pos.below(), EndBlocks.CAVE_PUMPKIN.defaultBlockState().setValue(BlockProperties.SMALL, true)); + } + else if (age == 3) { world.setBlockAndUpdate(pos.below(), EndBlocks.CAVE_PUMPKIN.defaultBlockState()); } } } @Override - public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { - } - + public void growAdult(WorldGenLevel world, Random random, BlockPos pos) {} + @Override - public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, - BlockPos pos, BlockPos neighborPos) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { state = super.updateShape(state, facing, neighborState, world, pos, neighborPos); if (state.is(this) && state.getValue(BlockProperties.AGE) > 1) { BlockState down = world.getBlockState(pos.below()); if (!down.is(EndBlocks.CAVE_PUMPKIN)) { - state = state.with(BlockProperties.AGE, 1); + state = state.setValue(BlockProperties.AGE, 1); } } return state; } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPE; } - + @Override - public AbstractBlock.OffsetType getOffsetType() { - return AbstractBlock.OffsetType.NONE; + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.NONE; } } diff --git a/src/main/java/ru/betterend/blocks/ChandelierBlock.java b/src/main/java/ru/betterend/blocks/ChandelierBlock.java index 7f89ecb2..36d883df 100644 --- a/src/main/java/ru/betterend/blocks/ChandelierBlock.java +++ b/src/main/java/ru/betterend/blocks/ChandelierBlock.java @@ -6,16 +6,16 @@ import java.util.EnumMap; import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Registry; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.basis.AttachedBlock; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; @@ -24,52 +24,55 @@ import ru.betterend.patterns.Patterns; public class ChandelierBlock extends AttachedBlock implements IRenderTypeable, BlockPatterned { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); - + public ChandelierBlock(Block source) { - super(FabricBlockSettings.copyOf(source).noCollision().nonOpaque().requiresTool().luminance(15)); + super(FabricBlockSettings.copyOf(source).luminance(15).noCollission().noOcclusion().requiresCorrectToolForDrops()); } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return BOUNDING_SHAPES.get(state.getValue(FACING)); } - + @Override public String getStatesPattern(Reader data) { ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(this); if (block.contains("item")) { return Patterns.createJson(Patterns.ITEM_GENERATED, "item/" + blockId.getPath()); - } else if (block.contains("ceil")) { + } + else if (block.contains("ceil")) { return Patterns.createJson(Patterns.BLOCK_CHANDELIER_CEIL, blockId.getPath()); - } else if (block.contains("wall")) { + } + else if (block.contains("wall")) { return Patterns.createJson(Patterns.BLOCK_CHANDELIER_WALL, blockId.getPath()); - } else { + } + else { return Patterns.createJson(Patterns.BLOCK_CHANDELIER_FLOOR, blockId.getPath()); } } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_CHANDELIER; } - + static { - BOUNDING_SHAPES.put(Direction.UP, Block.createCuboidShape(5, 0, 5, 11, 13, 11)); - BOUNDING_SHAPES.put(Direction.DOWN, Block.createCuboidShape(5, 3, 5, 11, 16, 11)); - BOUNDING_SHAPES.put(Direction.NORTH, VoxelShapes.cuboid(0.0, 0.0, 0.5, 1.0, 1.0, 1.0)); - BOUNDING_SHAPES.put(Direction.SOUTH, VoxelShapes.cuboid(0.0, 0.0, 0.0, 1.0, 1.0, 0.5)); - BOUNDING_SHAPES.put(Direction.WEST, VoxelShapes.cuboid(0.5, 0.0, 0.0, 1.0, 1.0, 1.0)); - BOUNDING_SHAPES.put(Direction.EAST, VoxelShapes.cuboid(0.0, 0.0, 0.0, 0.5, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.UP, Block.box(5, 0, 5, 11, 13, 11)); + BOUNDING_SHAPES.put(Direction.DOWN, Block.box(5, 3, 5, 11, 16, 11)); + BOUNDING_SHAPES.put(Direction.NORTH, Shapes.box(0.0, 0.0, 0.5, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.SOUTH, Shapes.box(0.0, 0.0, 0.0, 1.0, 1.0, 0.5)); + BOUNDING_SHAPES.put(Direction.WEST, Shapes.box(0.5, 0.0, 0.0, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.EAST, Shapes.box(0.0, 0.0, 0.0, 0.5, 1.0, 1.0)); } } diff --git a/src/main/java/ru/betterend/blocks/CharniaBlock.java b/src/main/java/ru/betterend/blocks/CharniaBlock.java index ca03ed0b..86d510d6 100644 --- a/src/main/java/ru/betterend/blocks/CharniaBlock.java +++ b/src/main/java/ru/betterend/blocks/CharniaBlock.java @@ -1,16 +1,15 @@ package ru.betterend.blocks; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Fluids; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Fluids; import ru.betterend.blocks.basis.UnderwaterPlantBlock; public class CharniaBlock extends UnderwaterPlantBlock { @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return sideCoversSmallSquare(world, pos.below(), Direction.UP) - && world.getFluidState(pos).getFluid() == Fluids.WATER; + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + return canSupportCenter(world, pos.below(), Direction.UP) && world.getFluidState(pos).getType() == Fluids.WATER; } } diff --git a/src/main/java/ru/betterend/blocks/ChorusGrassBlock.java b/src/main/java/ru/betterend/blocks/ChorusGrassBlock.java index 66bb0d7d..71635d36 100644 --- a/src/main/java/ru/betterend/blocks/ChorusGrassBlock.java +++ b/src/main/java/ru/betterend/blocks/ChorusGrassBlock.java @@ -8,7 +8,7 @@ public class ChorusGrassBlock extends EndPlantBlock { public ChorusGrassBlock() { super(true); } - + @Override protected boolean isTerrain(BlockState state) { return state.getBlock() == EndBlocks.CHORUS_NYLIUM; diff --git a/src/main/java/ru/betterend/blocks/DenseSnowBlock.java b/src/main/java/ru/betterend/blocks/DenseSnowBlock.java index f369dd2a..f124f539 100644 --- a/src/main/java/ru/betterend/blocks/DenseSnowBlock.java +++ b/src/main/java/ru/betterend/blocks/DenseSnowBlock.java @@ -1,12 +1,12 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.material.Material; import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.material.Material; import ru.betterend.blocks.basis.BlockBase; public class DenseSnowBlock extends BlockBase { public DenseSnowBlock() { - super(FabricBlockSettings.of(Material.SNOW_BLOCK).strength(0.2F).sounds(SoundType.SNOW)); + super(FabricBlockSettings.of(Material.SNOW).strength(0.2F).sound(SoundType.SNOW)); } } diff --git a/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java b/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java index 7d909473..30494c1f 100644 --- a/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java @@ -1,8 +1,8 @@ package ru.betterend.blocks; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.blocks.basis.FeatureSaplingBlock; import ru.betterend.registry.EndBlocks; @@ -17,9 +17,9 @@ public class DragonTreeSaplingBlock extends FeatureSaplingBlock { protected Feature getFeature() { return EndFeatures.DRAGON_TREE.getFeature(); } - + @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { return world.getBlockState(pos.below()).is(EndBlocks.SHADOW_GRASS); } } diff --git a/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java index dabdbeca..04b93080 100644 --- a/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java +++ b/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java @@ -8,28 +8,28 @@ import java.util.Random; import org.jetbrains.annotations.Nullable; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.block.TransparentBlock; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.item.enchantment.Enchantments; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; -import net.minecraft.world.LightType; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.Level; +import net.minecraft.world.level.LightLayer; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.HalfTransparentBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class EmeraldIceBlock extends TransparentBlock implements IRenderTypeable, BlockPatterned { +public class EmeraldIceBlock extends HalfTransparentBlock implements IRenderTypeable, BlockPatterned { public EmeraldIceBlock() { super(FabricBlockSettings.copyOf(Blocks.ICE)); } @@ -40,17 +40,16 @@ public class EmeraldIceBlock extends TransparentBlock implements IRenderTypeable } @Override - public void afterBreak(Level world, Player player, BlockPos pos, BlockState state, - @Nullable BlockEntity blockEntity, ItemStack stack) { - super.afterBreak(world, player, pos, state, blockEntity, stack); + public void playerDestroy(Level world, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack stack) { + super.playerDestroy(world, player, pos, state, blockEntity, stack); if (EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, stack) == 0) { - if (world.getDimension().isUltrawarm()) { + if (world.dimensionType().ultraWarm()) { world.removeBlock(pos, false); return; } Material material = world.getBlockState(pos.below()).getMaterial(); - if (material.blocksMovement() || material.isLiquid()) { + if (material.blocksMotion() || material.isLiquid()) { world.setBlockAndUpdate(pos, Blocks.WATER.defaultBlockState()); } } @@ -59,38 +58,39 @@ public class EmeraldIceBlock extends TransparentBlock implements IRenderTypeable @Override public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { - if (world.getLightLevel(LightType.BLOCK, pos) > 11 - state.getOpacity(world, pos)) { + if (world.getBrightness(LightLayer.BLOCK, pos) > 11 - state.getLightBlock(world, pos)) { this.melt(state, world, pos); } } protected void melt(BlockState state, Level world, BlockPos pos) { - if (world.getDimension().isUltrawarm()) { + if (world.dimensionType().ultraWarm()) { world.removeBlock(pos, false); - } else { + } + else { world.setBlockAndUpdate(pos, Blocks.WATER.defaultBlockState()); - world.updateNeighbor(pos, Blocks.WATER, pos); + world.neighborChanged(pos, Blocks.WATER, pos); } } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { String block = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, block, block); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(Patterns.BLOCK_BASE, blockId.getPath(), block); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_SIMPLE; diff --git a/src/main/java/ru/betterend/blocks/EndLilyBlock.java b/src/main/java/ru/betterend/blocks/EndLilyBlock.java index e6f300ee..0988db53 100644 --- a/src/main/java/ru/betterend/blocks/EndLilyBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLilyBlock.java @@ -10,26 +10,26 @@ 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.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.fluid.FluidState; -import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.EnumProperty; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +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.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.UnderwaterPlantBlock; import ru.betterend.registry.EndBlocks; @@ -38,80 +38,81 @@ import ru.betterend.util.MHelper; public class EndLilyBlock extends UnderwaterPlantBlock { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; - private static final VoxelShape SHAPE_BOTTOM = Block.createCuboidShape(4, 0, 4, 12, 16, 12); - private static final VoxelShape SHAPE_TOP = Block.createCuboidShape(2, 0, 2, 14, 6, 14); - + private static final VoxelShape SHAPE_BOTTOM = Block.box(4, 0, 4, 12, 16, 12); + private static final VoxelShape SHAPE_TOP = Block.box(2, 0, 2, 14, 6, 14); + public EndLilyBlock() { - super(FabricBlockSettings.of(Material.UNDERWATER_PLANT).breakByTool(FabricToolTags.SHEARS) - .sounds(SoundType.WET_GRASS).breakByHand(true).luminance((state) -> { - return state.getValue(SHAPE) == TripleShape.TOP ? 13 : 0; - }).noCollision()); + super(FabricBlockSettings.of(Material.WATER_PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.WET_GRASS) + .lightLevel((state) -> state.getValue(SHAPE) == TripleShape.TOP ? 13 : 0) + .noCollission()); } - + @Override - public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, - BlockPos pos, BlockPos neighborPos) { - if (!canPlaceAt(state, world, pos)) { - return state.getValue(SHAPE) == TripleShape.TOP ? Blocks.AIR.defaultBlockState() - : Blocks.WATER.defaultBlockState(); - } else { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) { + return state.getValue(SHAPE) == TripleShape.TOP ? Blocks.AIR.defaultBlockState() : Blocks.WATER.defaultBlockState(); + } + else { return state; } } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - Vec3d vec3d = state.getModelOffset(view, pos); + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + Vec3 vec3d = state.getOffset(view, pos); VoxelShape shape = state.getValue(SHAPE) == TripleShape.TOP ? SHAPE_TOP : SHAPE_BOTTOM; - return shape.offset(vec3d.x, vec3d.y, vec3d.z); + return shape.move(vec3d.x, vec3d.y, vec3d.z); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE); } - + @Override public FluidState getFluidState(BlockState state) { - return state.getValue(SHAPE) == TripleShape.TOP ? Fluids.EMPTY.defaultBlockState() - : Fluids.WATER.getStill(false); + return state.getValue(SHAPE) == TripleShape.TOP ? Fluids.EMPTY.defaultFluidState() : Fluids.WATER.getSource(false); } - + @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { if (state.getValue(SHAPE) == TripleShape.TOP) { return world.getBlockState(pos.below()).getBlock() == this; - } else if (state.getValue(SHAPE) == TripleShape.BOTTOM) { + } + else if (state.getValue(SHAPE) == TripleShape.BOTTOM) { return isTerrain(world.getBlockState(pos.below())); - } else { - BlockState up = world.getBlockState(pos.up()); + } + else { + BlockState up = world.getBlockState(pos.above()); BlockState down = world.getBlockState(pos.below()); return up.getBlock() == this && down.getBlock() == this; } } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { if (state.getValue(SHAPE) == TripleShape.TOP) { - return Lists.newArrayList(new ItemStack(EndItems.END_LILY_LEAF, MHelper.randRange(1, 2, MHelper.RANDOM)), - new ItemStack(EndBlocks.END_LILY_SEED, MHelper.randRange(1, 2, MHelper.RANDOM))); + return Lists.newArrayList(new ItemStack(EndItems.END_LILY_LEAF, MHelper.randRange(1, 2, MHelper.RANDOM)), new ItemStack(EndBlocks.END_LILY_SEED, MHelper.randRange(1, 2, MHelper.RANDOM))); } return Collections.emptyList(); } - + @Override @Environment(EnvType.CLIENT) - public ItemStack getPickStack(BlockView world, BlockPos pos, BlockState state) { + public ItemStack getCloneItemStack(BlockGetter world, BlockPos pos, BlockState state) { return new ItemStack(EndBlocks.END_LILY_SEED); } - + @Override - public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { return false; } @Override - public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return false; } } diff --git a/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java b/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java index aa158218..f2f67d4c 100644 --- a/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java @@ -1,10 +1,9 @@ package ru.betterend.blocks; import java.util.Random; - -import net.minecraft.world.level.material.Fluids; import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.material.Fluids; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.UnderwaterPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; @@ -14,24 +13,21 @@ public class EndLilySeedBlock extends UnderwaterPlantWithAgeBlock { @Override public void grow(WorldGenLevel world, Random random, BlockPos pos) { if (canGrow(world, pos)) { - BlocksHelper.setWithoutUpdate(world, pos, - EndBlocks.END_LILY.defaultBlockState().with(EndLilyBlock.SHAPE, TripleShape.BOTTOM)); - BlockPos up = pos.up(); - while (world.getFluidState(up).isStill()) { - BlocksHelper.setWithoutUpdate(world, up, - EndBlocks.END_LILY.defaultBlockState().with(EndLilyBlock.SHAPE, TripleShape.MIDDLE)); - up = up.up(); + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.END_LILY.defaultBlockState().setValue(EndLilyBlock.SHAPE, TripleShape.BOTTOM)); + BlockPos up = pos.above(); + while (world.getFluidState(up).isSource()) { + BlocksHelper.setWithoutUpdate(world, up, EndBlocks.END_LILY.defaultBlockState().setValue(EndLilyBlock.SHAPE, TripleShape.MIDDLE)); + up = up.above(); } - BlocksHelper.setWithoutUpdate(world, up, - EndBlocks.END_LILY.defaultBlockState().with(EndLilyBlock.SHAPE, TripleShape.TOP)); + BlocksHelper.setWithoutUpdate(world, up, EndBlocks.END_LILY.defaultBlockState().setValue(EndLilyBlock.SHAPE, TripleShape.TOP)); } } - + private boolean canGrow(WorldGenLevel world, BlockPos pos) { - BlockPos up = pos.up(); - while (world.getBlockState(up).getFluidState().getFluid().equals(Fluids.WATER.getStill())) { - up = up.up(); + BlockPos up = pos.above(); + while (world.getBlockState(up).getFluidState().getType().equals(Fluids.WATER.getSource())) { + up = up.above(); } - return world.isAir(up); + return world.isEmptyBlock(up); } } diff --git a/src/main/java/ru/betterend/blocks/EndLotusFlowerBlock.java b/src/main/java/ru/betterend/blocks/EndLotusFlowerBlock.java index 71f36555..58a56cc7 100644 --- a/src/main/java/ru/betterend/blocks/EndLotusFlowerBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLotusFlowerBlock.java @@ -7,57 +7,57 @@ 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.world.level.block.AbstractBlock; +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.core.BlockPos; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; public class EndLotusFlowerBlock extends EndPlantBlock { - private static final VoxelShape SHAPE_OUTLINE = Block.createCuboidShape(2, 0, 2, 14, 14, 14); - private static final VoxelShape SHAPE_COLLISION = Block.createCuboidShape(0, 0, 0, 16, 2, 16); - + private static final VoxelShape SHAPE_OUTLINE = Block.box(2, 0, 2, 14, 14, 14); + private static final VoxelShape SHAPE_COLLISION = Block.box(0, 0, 0, 16, 2, 16); + public EndLotusFlowerBlock() { - super(FabricBlockSettings.of(Material.PLANT).nonOpaque().luminance(15)); + super(FabricBlockSettings.of(Material.PLANT).luminance(15).noOcclusion()); } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.END_LOTUS_STEM); } - + @Override - public AbstractBlock.OffsetType getOffsetType() { - return AbstractBlock.OffsetType.NONE; + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.NONE; } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPE_OUTLINE; } - + @Override - public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getCollisionShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPE_COLLISION; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { int count = MHelper.randRange(1, 2, MHelper.RANDOM); return Lists.newArrayList(new ItemStack(EndBlocks.END_LOTUS_SEED, count)); } - + @Override @Environment(EnvType.CLIENT) - public ItemStack getPickStack(BlockView world, BlockPos pos, BlockState state) { + public ItemStack getCloneItemStack(BlockGetter world, BlockPos pos, BlockState state) { return new ItemStack(EndBlocks.END_LOTUS_SEED); } } diff --git a/src/main/java/ru/betterend/blocks/EndLotusLeafBlock.java b/src/main/java/ru/betterend/blocks/EndLotusLeafBlock.java index 4cf66025..f2167e6a 100644 --- a/src/main/java/ru/betterend/blocks/EndLotusLeafBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLotusLeafBlock.java @@ -3,23 +3,23 @@ package ru.betterend.blocks; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.fluid.WaterFluid; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.EnumProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.util.BlockMirror; -import net.minecraft.world.level.block.Rotation; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.WaterFluid; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.BlockBaseNotFull; import ru.betterend.client.render.ERenderLayer; @@ -28,48 +28,48 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; public class EndLotusLeafBlock extends BlockBaseNotFull implements IRenderTypeable { - public static final EnumProperty HORIZONTAL_FACING = Properties.HORIZONTAL_FACING; + public static final EnumProperty HORIZONTAL_FACING = BlockStateProperties.HORIZONTAL_FACING; public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; - private static final VoxelShape VSHAPE = Block.createCuboidShape(0, 0, 0, 16, 1, 16); - + private static final VoxelShape VSHAPE = Block.box(0, 0, 0, 16, 1, 16); + public EndLotusLeafBlock() { - super(FabricBlockSettings.of(Material.PLANT).nonOpaque().sounds(SoundType.WET_GRASS)); + super(FabricBlockSettings.of(Material.PLANT).noOcclusion().sound(SoundType.WET_GRASS)); } - + @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { BlockState down = world.getBlockState(pos.below()); - return !down.getFluidState().isEmpty() && down.getFluidState().getFluid() instanceof WaterFluid; + return !down.getFluidState().isEmpty() && down.getFluidState().getType() instanceof WaterFluid; } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(SHAPE, HORIZONTAL_FACING); } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return VSHAPE; } - + @Override public BlockState rotate(BlockState state, Rotation rotation) { return BlocksHelper.rotateHorizontal(state, rotation, HORIZONTAL_FACING); } @Override - public BlockState mirror(BlockState state, BlockMirror mirror) { + public BlockState mirror(BlockState state, Mirror mirror) { return BlocksHelper.mirrorHorizontal(state, mirror, HORIZONTAL_FACING); } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override @Environment(EnvType.CLIENT) - public ItemStack getPickStack(BlockView world, BlockPos pos, BlockState state) { + public ItemStack getCloneItemStack(BlockGetter world, BlockPos pos, BlockState state) { return new ItemStack(EndBlocks.END_LOTUS_SEED); } } diff --git a/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java b/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java index c812c3b4..40111055 100644 --- a/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java @@ -1,13 +1,12 @@ package ru.betterend.blocks; import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Fluids; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Fluids; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.UnderwaterPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; @@ -17,103 +16,100 @@ public class EndLotusSeedBlock extends UnderwaterPlantWithAgeBlock { @Override public void grow(WorldGenLevel world, Random random, BlockPos pos) { if (canGrow(world, pos)) { - BlockState startLeaf = EndBlocks.END_LOTUS_STEM.defaultBlockState().with(EndLotusStemBlock.LEAF, true); - BlockState roots = EndBlocks.END_LOTUS_STEM.defaultBlockState() - .with(EndLotusStemBlock.SHAPE, TripleShape.BOTTOM).with(EndLotusStemBlock.WATERLOGGED, true); + BlockState startLeaf = EndBlocks.END_LOTUS_STEM.defaultBlockState().setValue(EndLotusStemBlock.LEAF, true); + BlockState roots = EndBlocks.END_LOTUS_STEM.defaultBlockState().setValue(EndLotusStemBlock.SHAPE, TripleShape.BOTTOM).setValue(EndLotusStemBlock.WATERLOGGED, true); BlockState stem = EndBlocks.END_LOTUS_STEM.defaultBlockState(); BlockState flower = EndBlocks.END_LOTUS_FLOWER.defaultBlockState(); - + BlocksHelper.setWithoutUpdate(world, pos, roots); MutableBlockPos bpos = new MutableBlockPos().set(pos); bpos.setY(bpos.getY() + 1); - while (world.getFluidState(bpos).isStill()) { - BlocksHelper.setWithoutUpdate(world, bpos, stem.with(EndLotusStemBlock.WATERLOGGED, true)); + while (world.getFluidState(bpos).isSource()) { + BlocksHelper.setWithoutUpdate(world, bpos, stem.setValue(EndLotusStemBlock.WATERLOGGED, true)); bpos.setY(bpos.getY() + 1); } - + int height = random.nextBoolean() ? 0 : random.nextBoolean() ? 1 : random.nextBoolean() ? 1 : -1; TripleShape shape = (height == 0) ? TripleShape.TOP : TripleShape.MIDDLE; Direction dir = BlocksHelper.randomHorizontal(random); - BlockPos leafCenter = bpos.immutable().offset(dir); + BlockPos leafCenter = bpos.immutable().relative(dir); if (hasLeaf(world, leafCenter)) { generateLeaf(world, leafCenter); - BlocksHelper.setWithoutUpdate(world, bpos, - startLeaf.with(EndLotusStemBlock.SHAPE, shape).with(EndLotusStemBlock.FACING, dir)); - } else { - BlocksHelper.setWithoutUpdate(world, bpos, stem.with(EndLotusStemBlock.SHAPE, shape)); + BlocksHelper.setWithoutUpdate(world, bpos, startLeaf.setValue(EndLotusStemBlock.SHAPE, shape).setValue(EndLotusStemBlock.FACING, dir)); } - + else { + BlocksHelper.setWithoutUpdate(world, bpos, stem.setValue(EndLotusStemBlock.SHAPE, shape)); + } + bpos.setY(bpos.getY() + 1); for (int i = 1; i <= height; i++) { - if (!world.isAir(bpos)) { + if (!world.isEmptyBlock(bpos)) { bpos.setY(bpos.getY() - 1); BlocksHelper.setWithoutUpdate(world, bpos, flower); bpos.setY(bpos.getY() - 1); stem = world.getBlockState(bpos); - BlocksHelper.setWithoutUpdate(world, bpos, stem.with(EndLotusStemBlock.SHAPE, TripleShape.TOP)); + BlocksHelper.setWithoutUpdate(world, bpos, stem.setValue(EndLotusStemBlock.SHAPE, TripleShape.TOP)); return; } BlocksHelper.setWithoutUpdate(world, bpos, stem); bpos.setY(bpos.getY() + 1); } - - if (!world.isAir(bpos) || height < 0) { + + if (!world.isEmptyBlock(bpos) || height < 0) { bpos.setY(bpos.getY() - 1); } - + BlocksHelper.setWithoutUpdate(world, bpos, flower); bpos.setY(bpos.getY() - 1); stem = world.getBlockState(bpos); if (!stem.is(EndBlocks.END_LOTUS_STEM)) { stem = EndBlocks.END_LOTUS_STEM.defaultBlockState(); if (!world.getBlockState(bpos.north()).getFluidState().isEmpty()) { - stem = stem.with(EndLotusStemBlock.WATERLOGGED, true); + stem = stem.setValue(EndLotusStemBlock.WATERLOGGED, true); } } - - if (world.getBlockState(bpos.offset(dir)).is(EndBlocks.END_LOTUS_LEAF)) { - stem = stem.with(EndLotusStemBlock.LEAF, true).with(EndLotusStemBlock.FACING, dir); + + if (world.getBlockState(bpos.relative(dir)).is(EndBlocks.END_LOTUS_LEAF)) { + stem = stem.setValue(EndLotusStemBlock.LEAF, true).setValue(EndLotusStemBlock.FACING, dir); } - - BlocksHelper.setWithoutUpdate(world, bpos, stem.with(EndLotusStemBlock.SHAPE, TripleShape.TOP)); + + BlocksHelper.setWithoutUpdate(world, bpos, stem.setValue(EndLotusStemBlock.SHAPE, TripleShape.TOP)); } } - + private boolean canGrow(WorldGenLevel world, BlockPos pos) { MutableBlockPos bpos = new MutableBlockPos(); bpos.set(pos); - while (world.getBlockState(bpos).getFluidState().getFluid().equals(Fluids.WATER.getStill())) { + while (world.getBlockState(bpos).getFluidState().getType().equals(Fluids.WATER.getSource())) { bpos.setY(bpos.getY() + 1); } - return world.isAir(bpos) && world.isAir(bpos.up()); + return world.isEmptyBlock(bpos) && world.isEmptyBlock(bpos.above()); } - + private void generateLeaf(WorldGenLevel world, BlockPos pos) { MutableBlockPos p = new MutableBlockPos(); BlockState leaf = EndBlocks.END_LOTUS_LEAF.defaultBlockState(); - BlocksHelper.setWithoutUpdate(world, pos, leaf.with(EndLotusLeafBlock.SHAPE, TripleShape.BOTTOM)); - for (Direction move : BlocksHelper.HORIZONTAL) { - BlocksHelper.setWithoutUpdate(world, p.set(pos).move(move), leaf - .with(EndLotusLeafBlock.HORIZONTAL_FACING, move).with(EndLotusLeafBlock.SHAPE, TripleShape.MIDDLE)); + BlocksHelper.setWithoutUpdate(world, pos, leaf.setValue(EndLotusLeafBlock.SHAPE, TripleShape.BOTTOM)); + for (Direction move: BlocksHelper.HORIZONTAL) { + BlocksHelper.setWithoutUpdate(world, p.set(pos).move(move), leaf.setValue(EndLotusLeafBlock.HORIZONTAL_FACING, move).setValue(EndLotusLeafBlock.SHAPE, TripleShape.MIDDLE)); } - for (int i = 0; i < 4; i++) { + for (int i = 0; i < 4; i ++) { Direction d1 = BlocksHelper.HORIZONTAL[i]; Direction d2 = BlocksHelper.HORIZONTAL[(i + 1) & 3]; - BlocksHelper.setWithoutUpdate(world, p.set(pos).move(d1).move(d2), - leaf.with(EndLotusLeafBlock.HORIZONTAL_FACING, d1).with(EndLotusLeafBlock.SHAPE, TripleShape.TOP)); + BlocksHelper.setWithoutUpdate(world, p.set(pos).move(d1).move(d2), leaf.setValue(EndLotusLeafBlock.HORIZONTAL_FACING, d1).setValue(EndLotusLeafBlock.SHAPE, TripleShape.TOP)); } } - + private boolean hasLeaf(WorldGenLevel world, BlockPos pos) { MutableBlockPos p = new MutableBlockPos(); p.setY(pos.getY()); int count = 0; - for (int x = -1; x < 2; x++) { + for (int x = -1; x < 2; x ++) { p.setX(pos.getX() + x); - for (int z = -1; z < 2; z++) { + for (int z = -1; z < 2; z ++) { p.setZ(pos.getZ() + z); - if (world.isAir(p) && !world.getFluidState(p.below()).isEmpty()) - count++; + if (world.isEmptyBlock(p) && !world.getFluidState(p.below()).isEmpty()) + count ++; } } return count == 9; diff --git a/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java b/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java index 5e0e06eb..f007e202 100644 --- a/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java @@ -5,96 +5,92 @@ import java.util.Map; import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.level.block.Waterloggable; -import net.minecraft.fluid.FluidState; -import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.item.ItemPlacementContext; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.EnumProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.util.BlockMirror; -import net.minecraft.world.level.block.Rotation; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.util.BlocksHelper; -public class EndLotusStemBlock extends BlockBase implements Waterloggable, IRenderTypeable { - public static final EnumProperty FACING = Properties.FACING; - public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; - public static final BooleanProperty LEAF = BooleanProperty.of("leaf"); +public class EndLotusStemBlock extends BlockBase implements SimpleWaterloggedBlock, IRenderTypeable { + public static final EnumProperty FACING = BlockStateProperties.FACING; + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + public static final BooleanProperty LEAF = BooleanProperty.create("leaf"); public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; private static final Map SHAPES = Maps.newEnumMap(Axis.class); - + public EndLotusStemBlock() { super(FabricBlockSettings.copyOf(Blocks.OAK_PLANKS)); - this.setDefaultState(getDefaultState().with(WATERLOGGED, false).with(SHAPE, TripleShape.MIDDLE) - .with(LEAF, false).with(FACING, Direction.UP)); + this.registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false).setValue(SHAPE, TripleShape.MIDDLE).setValue(LEAF, false).setValue(FACING, Direction.UP)); } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return state.getValue(LEAF) ? SHAPES.get(Axis.Y) : SHAPES.get(state.getValue(FACING).getAxis()); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(FACING, WATERLOGGED, SHAPE, LEAF); } - + @Override public FluidState getFluidState(BlockState state) { - return (Boolean) state.getValue(WATERLOGGED) ? Fluids.WATER.getStill(false) : super.getFluidState(state); + return (Boolean) state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); } @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { + public BlockState getStateForPlacement(BlockPlaceContext ctx) { LevelAccessor worldAccess = ctx.getLevel(); - BlockPos blockPos = ctx.getBlockPos(); - return this.defaultBlockState() - .with(WATERLOGGED, worldAccess.getFluidState(blockPos).getFluid() == Fluids.WATER) - .with(FACING, ctx.getSide()); + BlockPos blockPos = ctx.getClickedPos(); + return this.defaultBlockState().setValue(WATERLOGGED, worldAccess.getFluidState(blockPos).getType() == Fluids.WATER).setValue(FACING, ctx.getClickedFace()); } - + @Override public BlockState rotate(BlockState state, Rotation rotation) { return BlocksHelper.rotateHorizontal(state, rotation, FACING); } @Override - public BlockState mirror(BlockState state, BlockMirror mirror) { + public BlockState mirror(BlockState state, Mirror mirror) { return BlocksHelper.mirrorHorizontal(state, mirror, FACING); } @Override - public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, - BlockPos pos, BlockPos posFrom) { + public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { if ((Boolean) state.getValue(WATERLOGGED)) { - world.getFluidTickScheduler().schedule(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + world.getLiquidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); } return state; } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + static { - SHAPES.put(Axis.X, Block.createCuboidShape(0, 6, 6, 16, 10, 10)); - SHAPES.put(Axis.Y, Block.createCuboidShape(6, 0, 6, 10, 16, 10)); - SHAPES.put(Axis.Z, Block.createCuboidShape(6, 6, 0, 10, 10, 16)); + SHAPES.put(Axis.X, Block.box(0, 6, 6, 16, 10, 10)); + SHAPES.put(Axis.Y, Block.box(6, 0, 6, 10, 16, 10)); + SHAPES.put(Axis.Z, Block.box(6, 6, 0, 10, 10, 16)); } } diff --git a/src/main/java/ru/betterend/blocks/EndPathBlock.java b/src/main/java/ru/betterend/blocks/EndPathBlock.java index 5381aa6c..0f24bb7f 100644 --- a/src/main/java/ru/betterend/blocks/EndPathBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPathBlock.java @@ -7,36 +7,34 @@ import java.util.Map; import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.item.enchantment.Enchantments; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.basis.BlockBaseNotFull; import ru.betterend.patterns.Patterns; public class EndPathBlock extends BlockBaseNotFull { - private static final VoxelShape SHAPE = Block.createCuboidShape(0, 0, 0, 16, 15, 16); - + private static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 15, 16); + public EndPathBlock(Block source) { - super(FabricBlockSettings.copyOf(source).allowsSpawning((state, world, pos, type) -> { - return false; - })); + super(FabricBlockSettings.copyOf(source).isValidSpawn((state, world, pos, type) -> { return false; })); if (source instanceof EndTerrainBlock) { EndTerrainBlock terrain = (EndTerrainBlock) source; terrain.setPathBlock(this); } } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); @@ -45,17 +43,17 @@ public class EndPathBlock extends BlockBaseNotFull { } return Collections.singletonList(new ItemStack(Blocks.END_STONE)); } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPE; } - + @Override - public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getCollisionShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPE; } - + @Override public String getModelPattern(String block) { String name = Registry.BLOCK.getKey(this).getPath(); @@ -64,7 +62,7 @@ public class EndPathBlock extends BlockBaseNotFull { map.put("%side%", name.replace("_path", "") + "_side"); return Patterns.createJson(Patterns.BLOCK_PATH, map); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_ROTATED_TOP; diff --git a/src/main/java/ru/betterend/blocks/EndPedestal.java b/src/main/java/ru/betterend/blocks/EndPedestal.java index 8a157ba4..d5756e44 100644 --- a/src/main/java/ru/betterend/blocks/EndPedestal.java +++ b/src/main/java/ru/betterend/blocks/EndPedestal.java @@ -2,10 +2,9 @@ package ru.betterend.blocks; import java.util.HashMap; import java.util.Map; - -import net.minecraft.world.level.block.Block; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; import ru.betterend.BetterEnd; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.patterns.Patterns; @@ -15,7 +14,7 @@ public class EndPedestal extends PedestalBlock { public EndPedestal(Block parent) { super(parent); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(parent); @@ -23,7 +22,7 @@ public class EndPedestal extends PedestalBlock { Map textures = new HashMap() { private static final long serialVersionUID = 1L; { - put("%mod%", BetterEnd.MOD_ID); + put("%mod%", BetterEnd.MOD_ID ); put("%top%", name + "_polished"); put("%base%", name + "_polished"); put("%pillar%", name + "_pillar_side"); diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index dfed2978..3fc80413 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -6,29 +6,29 @@ import java.util.Random; 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; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.core.Direction.AxisDirection; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Rotation; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.NetherPortalBlock; -import net.minecraft.client.color.block.BlockColor; -import net.minecraft.client.color.item.ItemColor; -import net.minecraft.world.entity.Entity; -import net.minecraft.server.MinecraftServer; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.IntegerProperty; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction.Axis; -import net.minecraft.core.Direction.AxisDirection; import net.minecraft.world.level.dimension.DimensionType; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IColorProvider; @@ -42,8 +42,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable public static final IntegerProperty PORTAL = BlockProperties.PORTAL; public EndPortalBlock() { - super(FabricBlockSettings.copyOf(Blocks.NETHER_PORTAL).resistance(Blocks.BEDROCK.getExplosionResistance()) - .luminance(15)); + super(FabricBlockSettings.copyOf(Blocks.NETHER_PORTAL).resistance(Blocks.BEDROCK.getExplosionResistance()).luminance(15)); } @Override @@ -51,13 +50,12 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable super.createBlockStateDefinition(builder); builder.add(PORTAL); } - + @Override @Environment(EnvType.CLIENT) public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { if (random.nextInt(100) == 0) { - world.playLocalSound(pos.getX() + 0.5D, pos.getY() + 0.5D, pos.getZ() + 0.5D, SoundEvents.PORTAL_AMBIENT, - SoundSource.BLOCKS, 0.5F, random.nextFloat() * 0.4F + 0.8F, false); + world.playLocalSound(pos.getX() + 0.5D, pos.getY() + 0.5D, pos.getZ() + 0.5D, SoundEvents.PORTAL_AMBIENT, SoundSource.BLOCKS, 0.5F, random.nextFloat() * 0.4F + 0.8F, false); } double x = pos.getX() + random.nextDouble(); @@ -74,24 +72,24 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable } @Override - public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, - BlockPos pos, BlockPos posFrom) { + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) {} + + @Override + public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { return state; } - + @Override public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { - if (world.isClientSide() || !validate(entity)) - return; + if (world.isClientSide || !validate(entity)) return; entity.setPortalCooldown(); ServerLevel currentWorld = (ServerLevel) world; MinecraftServer server = currentWorld.getServer(); - ServerLevel targetWorld = EndPortals.getLevel(server, state.getValue(PORTAL)); + ServerLevel targetWorld = EndPortals.getWorld(server, state.getValue(PORTAL)); boolean isInEnd = currentWorld.dimension().equals(Level.END); ServerLevel destination = isInEnd ? targetWorld : server.getLevel(Level.END); BlockPos exitPos = findExitPos(currentWorld, destination, pos, entity); - if (exitPos == null) - return; + if (exitPos == null) return; if (entity instanceof ServerPlayer) { ServerPlayer player = (ServerPlayer) entity; teleportPlayer(player, destination, exitPos); @@ -106,43 +104,39 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable } private boolean validate(Entity entity) { - return !entity.isPassenger() && !entity.isVehicle() && entity.canChangeDimensions() - && !entity.isOnPortalCooldown(); + return !entity.isPassenger() && !entity.isVehicle() && + entity.canChangeDimensions() && !entity.isOnPortalCooldown(); } private void teleportPlayer(ServerPlayer player, ServerLevel destination, BlockPos exitPos) { if (player.isCreative()) { - player.teleportTo(destination, exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5, player.yRot, - player.xRot); + player.teleportTo(destination, exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5, player.yRot, player.xRot); } else { TeleportingEntity teleEntity = (TeleportingEntity) player; teleEntity.beSetExitPos(exitPos); player.changeDimension(destination); } } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.TRANSLUCENT; } - - private BlockPos findExitPos(ServerLevel currentWorld, ServerLevel targetWorld, BlockPos currentPos, - Entity entity) { - if (targetWorld == null) - return null; + + private BlockPos findExitPos(ServerLevel currentWorld, ServerLevel targetWorld, BlockPos currentPos, Entity entity) { + if (targetWorld == null) return null; Registry registry = targetWorld.registryAccess().dimensionTypes(); ResourceLocation targetWorldId = targetWorld.dimension().location(); ResourceLocation currentWorldId = currentWorld.dimension().location(); double targetMultiplier = Objects.requireNonNull(registry.get(targetWorldId)).coordinateScale(); double currentMultiplier = Objects.requireNonNull(registry.get(currentWorldId)).coordinateScale(); double multiplier = targetMultiplier > currentMultiplier ? 1.0 / targetMultiplier : currentMultiplier; - BlockPos.MutableBlockPos basePos = currentPos.mutable().set(currentPos.getX() * multiplier, currentPos.getY(), - currentPos.getZ() * multiplier); + BlockPos.MutableBlockPos basePos = currentPos.mutable().set(currentPos.getX() * multiplier, currentPos.getY(), currentPos.getZ() * multiplier); BlockPos.MutableBlockPos checkPos = basePos.mutable(); BlockState currentState = currentWorld.getBlockState(currentPos); int radius = (EternalRitual.SEARCH_RADIUS >> 4) + 1; - checkPos = EternalRitual.findBlockPos(targetWorld, checkPos, radius, this, - state -> state.is(this) && state.getValue(PORTAL).equals(currentState.getValue(PORTAL))); + checkPos = EternalRitual.findBlockPos(targetWorld, checkPos, radius, this, state -> state.is(this) && + state.getValue(PORTAL).equals(currentState.getValue(PORTAL))); if (checkPos != null) { BlockState checkState = targetWorld.getBlockState(checkPos); Axis axis = checkState.getValue(AXIS); @@ -156,19 +150,17 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable entity.rotate(Rotation.CLOCKWISE_90); entityDir = entityDir.getClockWise(); } - return checkPos.move(entityDir); + return checkPos.relative(entityDir); } return null; } - + private BlockPos.MutableBlockPos findCenter(Level world, BlockPos.MutableBlockPos pos, Direction.Axis axis) { return findCenter(world, pos, axis, 1); } - - private BlockPos.MutableBlockPos findCenter(Level world, BlockPos.MutableBlockPos pos, Direction.Axis axis, - int step) { - if (step > 8) - return pos; + + private BlockPos.MutableBlockPos findCenter(Level world, BlockPos.MutableBlockPos pos, Direction.Axis axis, int step) { + if (step > 8) return pos; BlockState right, left; Direction rightDir, leftDir; rightDir = Direction.fromAxisAndDirection(axis, AxisDirection.POSITIVE); @@ -189,7 +181,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable } @Override - public BlockColor getBlockProvider() { + public BlockColor getProvider() { return (state, world, pos, tintIndex) -> EndPortals.getColor(state.getValue(PORTAL)); } diff --git a/src/main/java/ru/betterend/blocks/EndStoneBlock.java b/src/main/java/ru/betterend/blocks/EndStoneBlock.java index ddc17d9f..db65cd45 100644 --- a/src/main/java/ru/betterend/blocks/EndStoneBlock.java +++ b/src/main/java/ru/betterend/blocks/EndStoneBlock.java @@ -2,12 +2,12 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.MaterialColor; import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.material.MaterialColor; import ru.betterend.blocks.basis.BlockBase; public class EndStoneBlock extends BlockBase { public EndStoneBlock(MaterialColor color) { - super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color).sounds(SoundType.STONE)); + super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color).sound(SoundType.STONE)); } } diff --git a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java index bdcf1674..4e326c72 100644 --- a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java +++ b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java @@ -8,85 +8,89 @@ 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.world.level.block.Block; -import net.minecraft.world.level.block.BlockRenderType; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.HorizontalFacingBlock; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.material.MaterialColor; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemPlacementContext; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.sounds.SoundSource; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.DirectionProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.util.ActionResult; -import net.minecraft.util.BlockMirror; -import net.minecraft.world.level.block.Rotation; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.BlockHitResult; import ru.betterend.blocks.basis.BaseBlockWithEntity; import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; public class EndStoneSmelter extends BaseBlockWithEntity { - public static final DirectionProperty FACING = HorizontalFacingBlock.FACING; - public static final BooleanProperty LIT = Properties.LIT; + public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING; + public static final BooleanProperty LIT = BlockStateProperties.LIT; public static final String ID = "end_stone_smelter"; public EndStoneSmelter() { - super(FabricBlockSettings.of(Material.STONE, MaterialColor.COLOR_GRAY).hardness(4F).resistance(100F) - .requiresTool().sounds(SoundType.STONE)); - this.setDefaultState(this.stateManager.defaultBlockState().with(FACING, Direction.NORTH).with(LIT, false)); + super(FabricBlockSettings.of(Material.STONE, MaterialColor.COLOR_GRAY) + .hardness(4F) + .resistance(100F) + .requiresCorrectToolForDrops() + .sound(SoundType.STONE)); + this.registerDefaultState(this.stateDefinition.any() + .setValue(FACING, Direction.NORTH) + .setValue(LIT, false)); } - - public ActionResult onUse(BlockState state, Level world, BlockPos pos, Player player, Hand hand, - BlockHitResult hit) { + + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { if (world.isClientSide) { - return ActionResult.SUCCESS; + return InteractionResult.SUCCESS; } else { this.openScreen(world, pos, player); - return ActionResult.CONSUME; + return InteractionResult.CONSUME; } } private void openScreen(Level world, BlockPos pos, Player player) { BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof EndStoneSmelterBlockEntity) { - player.openHandledScreen((EndStoneSmelterBlockEntity) blockEntity); + player.openMenu((EndStoneSmelterBlockEntity) blockEntity); } } - + @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - return this.defaultBlockState().with(FACING, ctx.getPlayerFacing().getOpposite()); + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + return this.defaultBlockState().setValue(FACING, ctx.getHorizontalDirection().getOpposite()); } - + @Override - public BlockEntity createBlockEntity(BlockView world) { + public BlockEntity newBlockEntity(BlockGetter world) { return new EndStoneSmelterBlockEntity(); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { List drop = Lists.newArrayList(new ItemStack(this)); - BlockEntity blockEntity = builder.getNullable(LootContextParams.BLOCK_ENTITY); + BlockEntity blockEntity = builder.getOptionalParameter(LootContextParams.BLOCK_ENTITY); if (blockEntity instanceof EndStoneSmelterBlockEntity) { EndStoneSmelterBlockEntity smelterBlockEntity = (EndStoneSmelterBlockEntity) blockEntity; - for (int i = 0; i < smelterBlockEntity.size(); i++) { - ItemStack item = smelterBlockEntity.getStack(i); + for (int i = 0; i < smelterBlockEntity.getContainerSize(); i++) { + ItemStack item = smelterBlockEntity.getItem(i); if (!item.isEmpty()) { drop.add(item); } @@ -96,36 +100,36 @@ public class EndStoneSmelter extends BaseBlockWithEntity { } @Override - public boolean hasComparatorOutput(BlockState state) { + public boolean hasAnalogOutputSignal(BlockState state) { return true; } @Override - public int getComparatorOutput(BlockState state, Level world, BlockPos pos) { - // TODO - return ScreenHandler.calculateComparatorOutput(world.getBlockEntity(pos)); + public int getAnalogOutputSignal(BlockState state, Level world, BlockPos pos) { + //TODO + return AbstractContainerMenu.getRedstoneSignalFromBlockEntity(world.getBlockEntity(pos)); } @Override - public BlockRenderType getRenderType(BlockState state) { - return BlockRenderType.MODEL; + public RenderShape getRenderShape(BlockState state) { + return RenderShape.MODEL; } @Override public BlockState rotate(BlockState state, Rotation rotation) { - return (BlockState) state.with(FACING, rotation.rotate((Direction) state.getValue(FACING))); + return (BlockState)state.setValue(FACING, rotation.rotate((Direction)state.getValue(FACING))); } @Override - public BlockState mirror(BlockState state, BlockMirror mirror) { - return state.rotate(mirror.getRotation((Direction) state.getValue(FACING))); + public BlockState mirror(BlockState state, Mirror mirror) { + return state.rotate(mirror.getRotation((Direction)state.getValue(FACING))); } @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(FACING, LIT); } - + @Environment(EnvType.CLIENT) public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { if (state.getValue(LIT)) { @@ -133,16 +137,15 @@ public class EndStoneSmelter extends BaseBlockWithEntity { double y = pos.getY(); double z = pos.getZ() + 0.5D; if (random.nextDouble() < 0.1D) { - world.playLocalSound(x, y, z, SoundEvents.BLOCK_BLASTFURNACE_FIRE_CRACKLE, SoundSource.BLOCKS, 1.0F, - 1.0F, false); + world.playLocalSound(x, y, z, SoundEvents.BLASTFURNACE_FIRE_CRACKLE, SoundSource.BLOCKS, 1.0F, 1.0F, false); } - Direction direction = (Direction) state.getValue(FACING); + Direction direction = (Direction)state.getValue(FACING); Direction.Axis axis = direction.getAxis(); double defOffset = random.nextDouble() * 0.6D - 0.3D; - double offX = axis == Direction.Axis.X ? direction.getOffsetX() * 0.52D : defOffset; + double offX = axis == Direction.Axis.X ? direction.getStepX() * 0.52D : defOffset; double offY = random.nextDouble() * 9.0D / 16.0D; - double offZ = axis == Direction.Axis.Z ? direction.getOffsetZ() * 0.52D : defOffset; + double offZ = axis == Direction.Axis.Z ? direction.getStepZ() * 0.52D : defOffset; world.addParticle(ParticleTypes.SMOKE, x + offX, y + offY, z + offZ, 0.0D, 0.0D, 0.0D); } } diff --git a/src/main/java/ru/betterend/blocks/EndTerrainBlock.java b/src/main/java/ru/betterend/blocks/EndTerrainBlock.java index 765f1a27..2c378e88 100644 --- a/src/main/java/ru/betterend/blocks/EndTerrainBlock.java +++ b/src/main/java/ru/betterend/blocks/EndTerrainBlock.java @@ -9,62 +9,60 @@ import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.MaterialColor; -import net.minecraft.world.level.block.SnowBlock; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.item.enchantment.Enchantments; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.sounds.SoundSource; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.hit.BlockHitResult; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.Level; -import net.minecraft.world.WorldView; -import net.minecraft.world.chunk.light.ChunkLightProvider; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SnowLayerBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.lighting.LayerLightEngine; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.BlockHitResult; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.patterns.Patterns; public class EndTerrainBlock extends BlockBase { private Block pathBlock; - + public EndTerrainBlock(MaterialColor color) { - super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color).sounds(BlockSounds.TERRAIN_SOUND) - .ticksRandomly()); + super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color).sound(BlockSounds.TERRAIN_SOUND).randomTicks()); } - + public void setPathBlock(Block roadBlock) { this.pathBlock = roadBlock; } - + @Override - public ActionResult onUse(BlockState state, Level world, BlockPos pos, Player player, Hand hand, - BlockHitResult hit) { - if (pathBlock != null && player.getMainHandStack().getItem().isIn(FabricToolTags.SHOVELS)) { - world.playLocalSound(player, pos, SoundEvents.ITEM_SHOVEL_FLATTEN, SoundSource.BLOCKS, 1.0F, 1.0F); + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + if (pathBlock != null && player.getMainHandItem().getItem().is(FabricToolTags.SHOVELS)) { + world.playSound(player, pos, SoundEvents.SHOVEL_FLATTEN, SoundSource.BLOCKS, 1.0F, 1.0F); if (!world.isClientSide) { world.setBlockAndUpdate(pos, pathBlock.defaultBlockState()); - if (player != null && !player.isCreative()) { - player.getMainHandStack().damage(1, world.random, (ServerPlayer) player); + if (!player.isCreative()) { + player.getMainHandItem().hurt(1, world.random, (ServerPlayer) player); } } - return ActionResult.SUCCESS; + return InteractionResult.SUCCESS; } - return ActionResult.FAIL; + return InteractionResult.FAIL; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); @@ -73,7 +71,7 @@ public class EndTerrainBlock extends BlockBase { } return Collections.singletonList(new ItemStack(Blocks.END_STONE)); } - + @Override public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { if (random.nextInt(16) == 0 && !canSurvive(state, world, pos)) { @@ -81,20 +79,22 @@ public class EndTerrainBlock extends BlockBase { } } - protected boolean canSurvive(BlockState state, WorldView worldView, BlockPos pos) { - BlockPos blockPos = pos.up(); + @Override + public boolean canSurvive(BlockState state, LevelReader worldView, BlockPos pos) { + BlockPos blockPos = pos.above(); BlockState blockState = worldView.getBlockState(blockPos); - if (blockState.is(Blocks.SNOW) && (Integer) blockState.get(SnowBlock.LAYERS) == 1) { + if (blockState.is(Blocks.SNOW) && (Integer) blockState.getValue(SnowLayerBlock.LAYERS) == 1) { return true; - } else if (blockState.getFluidState().getLevel() == 8) { + } + else if (blockState.getFluidState().getAmount() == 8) { return false; - } else { - int i = ChunkLightProvider.getRealisticOpacity(worldView, state, pos, blockState, blockPos, Direction.UP, - blockState.getOpacity(worldView, blockPos)); + } + else { + int i = LayerLightEngine.getLightBlockInto(worldView, state, pos, blockState, blockPos, Direction.UP, blockState.getLightBlock(worldView, blockPos)); return i < 5; } } - + @Override public String getModelPattern(String block) { String name = Registry.BLOCK.getKey(this).getPath(); @@ -104,7 +104,7 @@ public class EndTerrainBlock extends BlockBase { map.put("%bottom%", "minecraft:block/end_stone"); return Patterns.createJson(Patterns.BLOCK_TOP_SIDE_BOTTOM, map); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_ROTATED_TOP; diff --git a/src/main/java/ru/betterend/blocks/EnderBlock.java b/src/main/java/ru/betterend/blocks/EnderBlock.java index 3458aa07..bb20eb58 100644 --- a/src/main/java/ru/betterend/blocks/EnderBlock.java +++ b/src/main/java/ru/betterend/blocks/EnderBlock.java @@ -3,23 +3,26 @@ package ru.betterend.blocks; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; import net.minecraft.world.level.material.MaterialColor; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.BlockGetter; import ru.betterend.blocks.basis.BlockBase; public class EnderBlock extends BlockBase { public EnderBlock() { - super(FabricBlockSettings.of(Material.STONE, MaterialColor.field_25708).hardness(5F).resistance(6F) - .requiresTool().sounds(SoundType.STONE)); + super(FabricBlockSettings.of(Material.STONE, MaterialColor.WARPED_WART_BLOCK) + .hardness(5F) + .resistance(6F) + .requiresCorrectToolForDrops() + .sound(SoundType.STONE)); } @Environment(EnvType.CLIENT) - public int getColor(BlockState state, BlockView world, BlockPos pos) { + public int getColor(BlockState state, BlockGetter world, BlockPos pos) { return 0xFF005548; } } diff --git a/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java b/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java index 51664204..ef5b51cc 100644 --- a/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java +++ b/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java @@ -7,31 +7,32 @@ 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.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.FallingBlock; -import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.BlockGetter; import ru.betterend.util.MHelper; public class EndstoneDustBlock extends FallingBlock { @Environment(EnvType.CLIENT) private static final int COLOR = MHelper.color(226, 239, 168); - + public EndstoneDustBlock() { - super(FabricBlockSettings.copyOf(Blocks.SAND).breakByTool(FabricToolTags.SHOVELS) + super(FabricBlockSettings.copyOf(Blocks.SAND) + .breakByTool(FabricToolTags.SHOVELS) .materialColor(Blocks.END_STONE.defaultMaterialColor())); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } @Environment(EnvType.CLIENT) - public int getColor(BlockState state, BlockView world, BlockPos pos) { + public int getDustColor(BlockState state, BlockGetter world, BlockPos pos) { return COLOR; } } diff --git a/src/main/java/ru/betterend/blocks/EternalPedestal.java b/src/main/java/ru/betterend/blocks/EternalPedestal.java index fb17fd27..b857ac4c 100644 --- a/src/main/java/ru/betterend/blocks/EternalPedestal.java +++ b/src/main/java/ru/betterend/blocks/EternalPedestal.java @@ -1,27 +1,25 @@ package ru.betterend.blocks; import java.util.List; - -import com.google.common.collect.Lists; - -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.explosion.Explosion; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import com.google.common.collect.Lists; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.entities.EternalPedestalEntity; import ru.betterend.registry.EndBlocks; @@ -30,12 +28,12 @@ import ru.betterend.rituals.EternalRitual; public class EternalPedestal extends PedestalBlock { public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; - + public EternalPedestal() { super(EndBlocks.FLAVOLITE_RUNED_ETERNAL); - this.setDefaultState(getDefaultState().with(ACTIVATED, false)); + this.registerDefaultState(defaultBlockState().setValue(ACTIVATED, false)); } - + @Override public void checkRitual(Level world, BlockPos pos) { BlockEntity blockEntity = world.getBlockEntity(pos); @@ -56,12 +54,12 @@ public class EternalPedestal extends PedestalBlock { ritual.disablePortal(portalId); } } - world.setBlockAndUpdate(pos, updatedState.with(ACTIVATED, false).with(HAS_LIGHT, false)); + world.setBlockAndUpdate(pos, updatedState.setValue(ACTIVATED, false).setValue(HAS_LIGHT, false)); } else { - ItemStack itemStack = pedestal.getStack(0); - ResourceLocation id = Registry.ITEM.getId(itemStack.getItem()); + ItemStack itemStack = pedestal.getItem(0); + ResourceLocation id = Registry.ITEM.getKey(itemStack.getItem()); if (EndPortals.isAvailableItem(id)) { - world.setBlockAndUpdate(pos, updatedState.with(ACTIVATED, true).with(HAS_LIGHT, true)); + world.setBlockAndUpdate(pos, updatedState.setValue(ACTIVATED, true).setValue(HAS_LIGHT, true)); if (pedestal.hasRitual()) { pedestal.getRitual().checkStructure(); } else { @@ -72,54 +70,51 @@ public class EternalPedestal extends PedestalBlock { } } } - + @Override - public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, - BlockPos pos, BlockPos posFrom) { + public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { BlockState updated = super.updateShape(state, direction, newState, world, pos, posFrom); - if (!updated.is(this)) - return updated; + if (!updated.is(this)) return updated; if (!this.isPlaceable(updated)) { - return updated.with(ACTIVATED, false); + return updated.setValue(ACTIVATED, false); } return updated; } - + @Override - public float calcBlockBreakingDelta(BlockState state, Player player, BlockView world, BlockPos pos) { + public float getDestroyProgress(BlockState state, Player player, BlockGetter world, BlockPos pos) { return 0.0F; } - + @Override - public float getBlastResistance() { + public float getExplosionResistance() { return Blocks.BEDROCK.getExplosionResistance(); } - + @Override - public boolean shouldDropItemsOnExplosion(Explosion explosion) { + public boolean dropFromExplosion(Explosion explosion) { return false; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { if (state.is(this)) { BlockProperties.PedestalState currentState = state.getValue(BlockProperties.PEDESTAL_STATE); - if (currentState.equals(BlockProperties.PedestalState.BOTTOM) - || currentState.equals(BlockProperties.PedestalState.PILLAR)) { + if (currentState.equals(BlockProperties.PedestalState.BOTTOM) || currentState.equals(BlockProperties.PedestalState.PILLAR)) { return Lists.newArrayList(); } } List drop = Lists.newArrayList(); - BlockEntity blockEntity = builder.getNullable(LootContextParams.BLOCK_ENTITY); + BlockEntity blockEntity = builder.getOptionalParameter(LootContextParams.BLOCK_ENTITY); if (blockEntity instanceof EternalPedestalEntity) { EternalPedestalEntity pedestal = (EternalPedestalEntity) blockEntity; if (!pedestal.isEmpty()) { - drop.add(pedestal.getStack(0)); + drop.add(pedestal.getItem(0)); } } return drop; } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { super.createBlockStateDefinition(stateManager); @@ -127,7 +122,7 @@ public class EternalPedestal extends PedestalBlock { } @Override - public BlockEntity createBlockEntity(BlockView world) { + public BlockEntity newBlockEntity(BlockGetter world) { return new EternalPedestalEntity(); } } diff --git a/src/main/java/ru/betterend/blocks/EternalRunedFlavolite.java b/src/main/java/ru/betterend/blocks/EternalRunedFlavolite.java index a4590b69..a139eafb 100644 --- a/src/main/java/ru/betterend/blocks/EternalRunedFlavolite.java +++ b/src/main/java/ru/betterend/blocks/EternalRunedFlavolite.java @@ -1,35 +1,33 @@ package ru.betterend.blocks; import java.util.List; - -import com.google.common.collect.Lists; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; +import net.minecraft.core.BlockPos; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.core.BlockPos; import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.explosion.Explosion; +import net.minecraft.world.level.Explosion; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import com.google.common.collect.Lists; public class EternalRunedFlavolite extends RunedFlavolite { @Override - public float calcBlockBreakingDelta(BlockState state, Player player, BlockView world, BlockPos pos) { + public float getDestroyProgress(BlockState state, Player player, BlockGetter world, BlockPos pos) { return 0.0F; } - + @Override - public float getBlastResistance() { + public float getExplosionResistance() { return Blocks.BEDROCK.getExplosionResistance(); } - + @Override - public boolean shouldDropItemsOnExplosion(Explosion explosion) { + public boolean dropFromExplosion(Explosion explosion) { return false; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { return Lists.newArrayList(); diff --git a/src/main/java/ru/betterend/blocks/FilaluxLanternBlock.java b/src/main/java/ru/betterend/blocks/FilaluxLanternBlock.java index cb775ead..692ae394 100644 --- a/src/main/java/ru/betterend/blocks/FilaluxLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/FilaluxLanternBlock.java @@ -2,13 +2,12 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.material.Material; import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.material.Material; import ru.betterend.blocks.basis.BlockBase; public class FilaluxLanternBlock extends BlockBase { public FilaluxLanternBlock() { - super(FabricBlockSettings.of(Material.WOOD).luminance(15).sounds(SoundType.WOOD) - .breakByTool(FabricToolTags.AXES)); + super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).luminance(15).sound(SoundType.WOOD)); } } diff --git a/src/main/java/ru/betterend/blocks/FlamaeaBlock.java b/src/main/java/ru/betterend/blocks/FlamaeaBlock.java index 4a9b575c..bba1a69d 100644 --- a/src/main/java/ru/betterend/blocks/FlamaeaBlock.java +++ b/src/main/java/ru/betterend/blocks/FlamaeaBlock.java @@ -6,44 +6,46 @@ import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.AbstractBlock; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.block.SoundType; import net.minecraft.core.BlockPos; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +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.betterend.blocks.basis.EndPlantBlock; import ru.betterend.interfaces.ISpetialItem; public class FlamaeaBlock extends EndPlantBlock implements ISpetialItem { - private static final VoxelShape SHAPE = Block.createCuboidShape(0, 0, 0, 16, 1, 16); - + private static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 1, 16); + public FlamaeaBlock() { - super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).sounds(SoundType.WET_GRASS) - .breakByHand(true)); + super(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.WET_GRASS)); } - + @Override protected boolean isTerrain(BlockState state) { return state.is(Blocks.WATER); } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPE; } @Override - public AbstractBlock.OffsetType getOffsetType() { - return AbstractBlock.OffsetType.NONE; + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.NONE; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { return Lists.newArrayList(new ItemStack(this)); diff --git a/src/main/java/ru/betterend/blocks/GlowingHymenophoreBlock.java b/src/main/java/ru/betterend/blocks/GlowingHymenophoreBlock.java index ab65538b..c6a01f77 100644 --- a/src/main/java/ru/betterend/blocks/GlowingHymenophoreBlock.java +++ b/src/main/java/ru/betterend/blocks/GlowingHymenophoreBlock.java @@ -2,13 +2,12 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.material.Material; import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.material.Material; import ru.betterend.blocks.basis.BlockBase; public class GlowingHymenophoreBlock extends BlockBase { public GlowingHymenophoreBlock() { - super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sounds(SoundType.WART_BLOCK) - .luminance(15)); + super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).luminance(15).sound(SoundType.WART_BLOCK)); } } diff --git a/src/main/java/ru/betterend/blocks/GlowingMossBlock.java b/src/main/java/ru/betterend/blocks/GlowingMossBlock.java index 62814731..22191437 100644 --- a/src/main/java/ru/betterend/blocks/GlowingMossBlock.java +++ b/src/main/java/ru/betterend/blocks/GlowingMossBlock.java @@ -2,9 +2,9 @@ package ru.betterend.blocks; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; @@ -12,19 +12,19 @@ public class GlowingMossBlock extends EndPlantBlock { public GlowingMossBlock(int light) { super(light); } - + @Override protected boolean isTerrain(BlockState state) { return state.getBlock() == EndBlocks.END_MOSS || state.getBlock() == EndBlocks.END_MYCELIUM; } - + @Environment(EnvType.CLIENT) - public boolean hasEmissiveLighting(BlockView world, BlockPos pos) { - return true; - } + public boolean hasEmissiveLighting(BlockGetter world, BlockPos pos) { + return true; + } - @Environment(EnvType.CLIENT) - public float getAmbientOcclusionLightLevel(BlockView world, BlockPos pos) { - return 1F; - } + @Environment(EnvType.CLIENT) + public float getAmbientOcclusionLightLevel(BlockGetter world, BlockPos pos) { + return 1F; + } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java b/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java index ec778642..3eeb97ce 100644 --- a/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java +++ b/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java @@ -2,45 +2,49 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.material.MaterialColor; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.BooleanProperty; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +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.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; public class GlowingPillarLuminophorBlock extends BlockBase { public static final BooleanProperty NATURAL = BlockProperties.NATURAL; - + public GlowingPillarLuminophorBlock() { - super(FabricBlockSettings.of(Material.LEAVES).materialColor(MaterialColor.COLOR_ORANGE) - .breakByTool(FabricToolTags.SHEARS).sounds(SoundType.GRASS).strength(0.2F).luminance(15)); - this.setDefaultState(this.stateManager.defaultBlockState().with(NATURAL, false)); + super(FabricBlockSettings.of(Material.LEAVES) + .materialColor(MaterialColor.COLOR_ORANGE) + .breakByTool(FabricToolTags.SHEARS) + .strength(0.2F) + .luminance(15) + .sound(SoundType.GRASS)); + this.registerDefaultState(this.stateDefinition.any().setValue(NATURAL, false)); } - + @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return state.getValue(NATURAL) ? world.getBlockState(pos.below()).is(EndBlocks.GLOWING_PILLAR_ROOTS) : true; + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + return !state.getValue(NATURAL) || world.getBlockState(pos.below()).is(EndBlocks.GLOWING_PILLAR_ROOTS); } - + @Override - public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, - BlockPos pos, BlockPos neighborPos) { - if (!canPlaceAt(state, world, pos)) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) { return Blocks.AIR.defaultBlockState(); - } else { + } + else { return state; } } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(NATURAL); diff --git a/src/main/java/ru/betterend/blocks/GlowingPillarRootsBlock.java b/src/main/java/ru/betterend/blocks/GlowingPillarRootsBlock.java index ddc4aeb9..4057fa93 100644 --- a/src/main/java/ru/betterend/blocks/GlowingPillarRootsBlock.java +++ b/src/main/java/ru/betterend/blocks/GlowingPillarRootsBlock.java @@ -2,33 +2,33 @@ package ru.betterend.blocks; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.EnumProperty; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.state.properties.EnumProperty; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.UpDownPlantBlock; import ru.betterend.registry.EndBlocks; public class GlowingPillarRootsBlock extends UpDownPlantBlock { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE); } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.AMBER_MOSS); } - + @Override @Environment(EnvType.CLIENT) - public ItemStack getPickStack(BlockView world, BlockPos pos, BlockState state) { + public ItemStack getCloneItemStack(BlockGetter world, BlockPos pos, BlockState state) { return new ItemStack(EndBlocks.GLOWING_PILLAR_SEED); } } diff --git a/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java b/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java index e3c2e41d..8a239f8a 100644 --- a/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java @@ -4,15 +4,15 @@ import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.AbstractBlock; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.state.property.Properties; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.material.Material; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; @@ -21,11 +21,15 @@ import ru.betterend.util.MHelper; public class GlowingPillarSeedBlock extends EndPlantWithAgeBlock { public GlowingPillarSeedBlock() { - super(FabricBlockSettings.of(Material.PLANT).luminance((state) -> { - return state.getValue(AGE) * 3 + 3; - }).breakByTool(FabricToolTags.SHEARS).sounds(SoundType.GRASS).breakByHand(true).ticksRandomly().noCollision()); + super(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.GRASS) + .lightLevel(state -> state.getValue(AGE) * 3 + 3) + .randomTicks() + .noCollission()); } - + @Override public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { int height = MHelper.randRange(1, 2, random); @@ -33,41 +37,39 @@ public class GlowingPillarSeedBlock extends EndPlantWithAgeBlock { if (h < height) { return; } - + MutableBlockPos mut = new MutableBlockPos().set(pos); BlockState roots = EndBlocks.GLOWING_PILLAR_ROOTS.defaultBlockState(); if (height < 2) { - BlocksHelper.setWithUpdate(world, mut, roots.with(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); - mut.move(Direction.UP); - } else { - BlocksHelper.setWithUpdate(world, mut, roots.with(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); - mut.move(Direction.UP); - BlocksHelper.setWithUpdate(world, mut, roots.with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); + BlocksHelper.setWithUpdate(world, mut, roots.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); mut.move(Direction.UP); } - BlocksHelper.setWithUpdate(world, mut, - EndBlocks.GLOWING_PILLAR_LUMINOPHOR.defaultBlockState().with(BlueVineLanternBlock.NATURAL, true)); - for (Direction dir : BlocksHelper.DIRECTIONS) { - pos = mut.offset(dir); - if (world.isAir(pos)) { - BlocksHelper.setWithUpdate(world, pos, - EndBlocks.GLOWING_PILLAR_LEAVES.defaultBlockState().with(Properties.FACING, dir)); + else { + BlocksHelper.setWithUpdate(world, mut, roots.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); + mut.move(Direction.UP); + BlocksHelper.setWithUpdate(world, mut, roots.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); + mut.move(Direction.UP); + } + BlocksHelper.setWithUpdate(world, mut, EndBlocks.GLOWING_PILLAR_LUMINOPHOR.defaultBlockState().setValue(BlueVineLanternBlock.NATURAL, true)); + for (Direction dir: BlocksHelper.DIRECTIONS) { + pos = mut.relative(dir); + if (world.isEmptyBlock(pos)) { + BlocksHelper.setWithUpdate(world, pos, EndBlocks.GLOWING_PILLAR_LEAVES.defaultBlockState().setValue(BlockStateProperties.FACING, dir)); } } mut.move(Direction.UP); - if (world.isAir(mut)) { - BlocksHelper.setWithUpdate(world, mut, - EndBlocks.GLOWING_PILLAR_LEAVES.defaultBlockState().with(Properties.FACING, Direction.UP)); + if (world.isEmptyBlock(mut)) { + BlocksHelper.setWithUpdate(world, mut, EndBlocks.GLOWING_PILLAR_LEAVES.defaultBlockState().setValue(BlockStateProperties.FACING, Direction.UP)); } } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.AMBER_MOSS); } - + @Override - public AbstractBlock.OffsetType getOffsetType() { - return AbstractBlock.OffsetType.NONE; + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.NONE; } } diff --git a/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java b/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java index 02808f0a..453af173 100644 --- a/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java +++ b/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java @@ -7,22 +7,22 @@ import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.material.MaterialColor; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; +import net.minecraft.util.Mth; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.Enchantments; -import net.minecraft.world.item.ItemPlacementContext; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.IntegerProperty; -import net.minecraft.util.Mth; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.interfaces.IColorProvider; import ru.betterend.noise.OpenSimplexNoise; @@ -32,20 +32,23 @@ import ru.betterend.util.MHelper; public class HelixTreeLeavesBlock extends BlockBase implements IColorProvider { public static final IntegerProperty COLOR = BlockProperties.COLOR; private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); - + public HelixTreeLeavesBlock() { - super(FabricBlockSettings.of(Material.LEAVES).materialColor(MaterialColor.COLOR_ORANGE) - .breakByTool(FabricToolTags.SHEARS).sounds(SoundType.WART_BLOCK).sounds(SoundType.GRASS) + super(FabricBlockSettings.of(Material.LEAVES) + .materialColor(MaterialColor.COLOR_ORANGE) + .breakByTool(FabricToolTags.SHEARS) + .sound(SoundType.WART_BLOCK) + .sound(SoundType.GRASS) .strength(0.2F)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(COLOR); } @Override - public BlockColor getBlockProvider() { + public BlockColor getProvider() { return (state, world, pos, tintIndex) -> { return MHelper.color(237, getGreen(state.getValue(COLOR)), 20); }; @@ -57,26 +60,25 @@ public class HelixTreeLeavesBlock extends BlockBase implements IColorProvider { return MHelper.color(237, getGreen(4), 20); }; } - + @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - double px = ctx.getBlockPos().getX() * 0.1; - double py = ctx.getBlockPos().getY() * 0.1; - double pz = ctx.getBlockPos().getZ() * 0.1; - return this.defaultBlockState().with(COLOR, MHelper.floor(NOISE.eval(px, py, pz) * 3.5 + 4)); + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + double px = ctx.getClickedPos().getX() * 0.1; + double py = ctx.getClickedPos().getY() * 0.1; + double pz = ctx.getClickedPos().getZ() * 0.1; + return this.defaultBlockState().setValue(COLOR, MHelper.floor(NOISE.eval(px, py, pz) * 3.5 + 4)); } - + private int getGreen(int color) { float delta = color / 7F; return (int) Mth.lerp(delta, 80, 158); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); if (tool != null) { - if (tool.getItem().isIn(FabricToolTags.SHEARS) || tool.isCorrectToolForDrops(state) - || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + if (tool.getItem().is(FabricToolTags.SHEARS) || tool.isCorrectToolForDrops(state) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Collections.singletonList(new ItemStack(this)); } int fortune = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BLOCK_FORTUNE, tool); @@ -85,7 +87,6 @@ public class HelixTreeLeavesBlock extends BlockBase implements IColorProvider { } return Lists.newArrayList(); } - return MHelper.RANDOM.nextInt(32) == 0 ? Lists.newArrayList(new ItemStack(EndBlocks.HELIX_TREE_SAPLING)) - : Lists.newArrayList(); + return MHelper.RANDOM.nextInt(32) == 0 ? Lists.newArrayList(new ItemStack(EndBlocks.HELIX_TREE_SAPLING)) : Lists.newArrayList(); } } diff --git a/src/main/java/ru/betterend/blocks/HydraluxBlock.java b/src/main/java/ru/betterend/blocks/HydraluxBlock.java index eff201bb..17d64d4e 100644 --- a/src/main/java/ru/betterend/blocks/HydraluxBlock.java +++ b/src/main/java/ru/betterend/blocks/HydraluxBlock.java @@ -10,18 +10,18 @@ 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.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.EnumProperty; import net.minecraft.core.BlockPos; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.blocks.BlockProperties.HydraluxShape; import ru.betterend.blocks.basis.UnderwaterPlantBlock; import ru.betterend.registry.EndBlocks; @@ -30,56 +30,60 @@ import ru.betterend.util.MHelper; public class HydraluxBlock extends UnderwaterPlantBlock { public static final EnumProperty SHAPE = BlockProperties.HYDRALUX_SHAPE; - + public HydraluxBlock() { - super(FabricBlockSettings.of(Material.UNDERWATER_PLANT).breakByTool(FabricToolTags.SHEARS) - .sounds(SoundType.WET_GRASS).breakByHand(true).luminance((state) -> { - return state.getValue(SHAPE).hasGlow() ? 15 : 0; - }).noCollision()); + super(FabricBlockSettings.of(Material.WATER_PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.WET_GRASS) + .lightLevel((state) -> state.getValue(SHAPE).hasGlow() ? 15 : 0) + .noCollission()); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE); } - + @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { BlockState down = world.getBlockState(pos.below()); HydraluxShape shape = state.getValue(SHAPE); if (shape == HydraluxShape.FLOWER_BIG_TOP || shape == HydraluxShape.FLOWER_SMALL_TOP) { return down.is(this); - } else if (shape == HydraluxShape.ROOTS) { - return down.is(EndBlocks.SULPHURIC_ROCK.stone) && world.getBlockState(pos.up()).is(this); - } else { - return down.is(this) && world.getBlockState(pos.up()).is(this); + } + else if (shape == HydraluxShape.ROOTS) { + return down.is(EndBlocks.SULPHURIC_ROCK.stone) && world.getBlockState(pos.above()).is(this); + } + else { + return down.is(this) && world.getBlockState(pos.above()).is(this); } } - + @Override - public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { return false; } @Override - public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return false; } - + @Override @Environment(EnvType.CLIENT) - public ItemStack getPickStack(BlockView world, BlockPos pos, BlockState state) { + public ItemStack getCloneItemStack(BlockGetter world, BlockPos pos, BlockState state) { return new ItemStack(EndBlocks.HYDRALUX_SAPLING); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { HydraluxShape shape = state.getValue(SHAPE); if (shape == HydraluxShape.FLOWER_BIG_BOTTOM || shape == HydraluxShape.FLOWER_SMALL_BOTTOM) { return Lists.newArrayList(new ItemStack(EndItems.HYDRALUX_PETAL, MHelper.randRange(1, 4, MHelper.RANDOM))); - } else if (shape == HydraluxShape.ROOTS) { - return Lists - .newArrayList(new ItemStack(EndBlocks.HYDRALUX_SAPLING, MHelper.randRange(1, 2, MHelper.RANDOM))); + } + else if (shape == HydraluxShape.ROOTS) { + return Lists.newArrayList(new ItemStack(EndBlocks.HYDRALUX_SAPLING, MHelper.randRange(1, 2, MHelper.RANDOM))); } return Collections.emptyList(); } diff --git a/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java b/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java index 7a111875..0d5ded08 100644 --- a/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java +++ b/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java @@ -2,25 +2,29 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.material.Material; import net.minecraft.world.level.material.MaterialColor; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.Level; import ru.betterend.blocks.basis.BlockBase; public class HydraluxPetalBlock extends BlockBase { public HydraluxPetalBlock() { - this(FabricBlockSettings.of(Material.PLANT).materialColor(MaterialColor.SPRUCE).sounds(SoundType.WART_BLOCK) - .breakByTool(FabricToolTags.AXES).hardness(1).resistance(1).breakByHand(true)); + this(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.AXES) + .breakByHand(true) + .hardness(1) + .resistance(1) + .materialColor(MaterialColor.PODZOL) + .sound(SoundType.WART_BLOCK)); } - - public HydraluxPetalBlock(FabricBlockSettings settings) { + + public HydraluxPetalBlock(Properties settings) { super(settings); } - + @Override - public void onLandedUpon(Level world, BlockPos pos, Entity entity, float distance) { - } + public void fallOn(Level world, BlockPos pos, Entity entity, float distance) {} } diff --git a/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java b/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java index e8c3731f..89cb5897 100644 --- a/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java +++ b/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java @@ -14,9 +14,9 @@ public class HydraluxPetalColoredBlock extends HydraluxPetalBlock implements ICo public HydraluxPetalColoredBlock(FabricBlockSettings settings) { super(settings); } - + @Override - public BlockColor getBlockProvider() { + public BlockColor getProvider() { return (state, world, pos, tintIndex) -> { return BlocksHelper.getBlockColor(this); }; @@ -28,19 +28,19 @@ public class HydraluxPetalColoredBlock extends HydraluxPetalBlock implements ICo return BlocksHelper.getBlockColor(this); }; } - + @Override public String getStatesPattern(Reader data) { String path = "betterend:block/block_petal_colored"; return Patterns.createJson(data, path, path); } - + @Override public String getModelPattern(String block) { String path = "betterend:block/block_petal_colored"; return Patterns.createJson(Patterns.BLOCK_PETAL_COLORED, path, path); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_DIRECT; diff --git a/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java b/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java index 2e1171c3..9afb2681 100644 --- a/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java @@ -1,12 +1,11 @@ package ru.betterend.blocks; import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.BlockProperties.HydraluxShape; import ru.betterend.blocks.basis.UnderwaterPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; @@ -18,32 +17,30 @@ public class HydraluxSaplingBlock extends UnderwaterPlantWithAgeBlock { public void grow(WorldGenLevel world, Random random, BlockPos pos) { int h = MHelper.randRange(4, 8, random); MutableBlockPos mut = new MutableBlockPos().set(pos); - + for (int i = 1; i < h; i++) { mut.setY(pos.getY() + i); if (!world.getBlockState(mut).is(Blocks.WATER)) { return; } } - + mut.setY(pos.getY()); BlockState state = EndBlocks.HYDRALUX.defaultBlockState(); - BlocksHelper.setWithoutUpdate(world, pos, state.with(BlockProperties.HYDRALUX_SHAPE, HydraluxShape.ROOTS)); + BlocksHelper.setWithoutUpdate(world, pos, state.setValue(BlockProperties.HYDRALUX_SHAPE, HydraluxShape.ROOTS)); for (int i = 1; i < h - 2; i++) { mut.setY(pos.getY() + i); - BlocksHelper.setWithoutUpdate(world, mut, state.with(BlockProperties.HYDRALUX_SHAPE, HydraluxShape.VINE)); + BlocksHelper.setWithoutUpdate(world, mut, state.setValue(BlockProperties.HYDRALUX_SHAPE, HydraluxShape.VINE)); } - + mut.setY(mut.getY() + 1); boolean big = random.nextBoolean(); - BlocksHelper.setWithoutUpdate(world, mut, state.with(BlockProperties.HYDRALUX_SHAPE, - big ? HydraluxShape.FLOWER_BIG_BOTTOM : HydraluxShape.FLOWER_SMALL_BOTTOM)); - + BlocksHelper.setWithoutUpdate(world, mut, state.setValue(BlockProperties.HYDRALUX_SHAPE, big ? HydraluxShape.FLOWER_BIG_BOTTOM : HydraluxShape.FLOWER_SMALL_BOTTOM)); + mut.setY(mut.getY() + 1); - BlocksHelper.setWithoutUpdate(world, mut, state.with(BlockProperties.HYDRALUX_SHAPE, - big ? HydraluxShape.FLOWER_BIG_TOP : HydraluxShape.FLOWER_SMALL_TOP)); + BlocksHelper.setWithoutUpdate(world, mut, state.setValue(BlockProperties.HYDRALUX_SHAPE, big ? HydraluxShape.FLOWER_BIG_TOP : HydraluxShape.FLOWER_SMALL_TOP)); } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.SULPHURIC_ROCK.stone); diff --git a/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java b/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java index 917db1b1..e8b39590 100644 --- a/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java +++ b/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java @@ -8,125 +8,124 @@ 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.world.level.block.Block; -import net.minecraft.world.level.block.BlockEntityProvider; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.FluidFillable; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.level.block.Waterloggable; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.fluid.Fluid; -import net.minecraft.fluid.FluidState; -import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.item.ItemPlacementContext; -import net.minecraft.world.item.ItemStack; -import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.Properties; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.LiquidBlockContainer; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.basis.BlockBaseNotFull; import ru.betterend.blocks.entities.BlockEntityHydrothermalVent; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndParticles; import ru.betterend.util.BlocksHelper; -public class HydrothermalVentBlock extends BlockBaseNotFull - implements BlockEntityProvider, FluidFillable, Waterloggable { - public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; +public class HydrothermalVentBlock extends BlockBaseNotFull implements EntityBlock, LiquidBlockContainer, SimpleWaterloggedBlock { + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; - private static final VoxelShape SHAPE = Block.createCuboidShape(1, 1, 1, 15, 16, 15); - + private static final VoxelShape SHAPE = Block.box(1, 1, 1, 15, 16, 15); + public HydrothermalVentBlock() { - super(FabricBlockSettings.of(Material.STONE).breakByTool(FabricToolTags.PICKAXES).sounds(SoundType.STONE) - .noCollision().requiresTool()); - this.setDefaultState(getDefaultState().with(WATERLOGGED, true).with(ACTIVATED, false)); + super(FabricBlockSettings.of(Material.STONE) + .breakByTool(FabricToolTags.PICKAXES) + .sound(SoundType.STONE) + .noCollission() + .requiresCorrectToolForDrops()); + this.registerDefaultState(defaultBlockState().setValue(WATERLOGGED, true).setValue(ACTIVATED, false)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(WATERLOGGED, ACTIVATED); } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPE; } - + @Override - public boolean canFillWithFluid(BlockView world, BlockPos pos, BlockState state, Fluid fluid) { + public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { return false; } @Override - public boolean tryFillWithFluid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { + public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { return false; } - + @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { state = world.getBlockState(pos.below()); return state.is(EndBlocks.SULPHURIC_ROCK.stone); } - + @Override - public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, - BlockPos pos, BlockPos neighborPos) { - if (!canPlaceAt(state, world, pos)) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) { return Blocks.WATER.defaultBlockState(); - } else if (state.getValue(WATERLOGGED) && facing == Direction.UP && neighborState.is(Blocks.WATER)) { - world.getBlockTickScheduler().schedule(pos, this, 20); + } + else if (state.getValue(WATERLOGGED) && facing == Direction.UP && neighborState.is(Blocks.WATER)) { + world.getBlockTicks().scheduleTick(pos, this, 20); } return state; } - + @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { + public BlockState getStateForPlacement(BlockPlaceContext ctx) { LevelAccessor worldAccess = ctx.getLevel(); - BlockPos blockPos = ctx.getBlockPos(); - return this.defaultBlockState().with(WATERLOGGED, - worldAccess.getFluidState(blockPos).getFluid() == Fluids.WATER); + BlockPos blockPos = ctx.getClickedPos(); + return this.defaultBlockState().setValue(WATERLOGGED, worldAccess.getFluidState(blockPos).getType() == Fluids.WATER); } - + @Override public FluidState getFluidState(BlockState state) { - return (Boolean) state.getValue(WATERLOGGED) ? Fluids.WATER.getStill(false) : super.getFluidState(state); + return (Boolean) state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); } @Override - public BlockEntity createBlockEntity(BlockView world) { + public BlockEntity newBlockEntity(BlockGetter world) { return new BlockEntityHydrothermalVent(); } @Override - public void scheduledTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { - BlockPos up = pos.up(); + public void tick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + BlockPos up = pos.above(); if (world.getBlockState(up).is(Blocks.WATER)) { BlocksHelper.setWithoutUpdate(world, up, EndBlocks.VENT_BUBBLE_COLUMN); - world.getBlockTickScheduler().schedule(up, EndBlocks.VENT_BUBBLE_COLUMN, 5); + world.getBlockTicks().scheduleTick(up, EndBlocks.VENT_BUBBLE_COLUMN, 5); } } - + @Override - public void onPlaced(Level world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, - ItemStack itemStack) { - if (world instanceof ServerLevel && state.getValue(WATERLOGGED) - && world.getBlockState(pos.up()).is(Blocks.WATER)) { - scheduledTick(state, (ServerLevel) world, pos, world.random); + public void setPlacedBy(Level world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack itemStack) { + if (world instanceof ServerLevel && state.getValue(WATERLOGGED) && world.getBlockState(pos.above()).is(Blocks.WATER)) { + tick(state,(ServerLevel) world, pos, world.random); } } - + @Environment(EnvType.CLIENT) public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { if (!state.getValue(ACTIVATED) && random.nextBoolean()) { @@ -136,7 +135,8 @@ public class HydrothermalVentBlock extends BlockBaseNotFull double z = pos.getZ() + random.nextDouble(); if (state.getValue(WATERLOGGED)) { world.addParticle(EndParticles.GEYSER_PARTICLE, x, y, z, 0, 0, 0); - } else { + } + else { world.addParticle(ParticleTypes.SMOKE, x, y, z, 0, 0, 0); } } diff --git a/src/main/java/ru/betterend/blocks/InfusionPedestal.java b/src/main/java/ru/betterend/blocks/InfusionPedestal.java index 081cc4aa..2cfd9506 100644 --- a/src/main/java/ru/betterend/blocks/InfusionPedestal.java +++ b/src/main/java/ru/betterend/blocks/InfusionPedestal.java @@ -1,15 +1,15 @@ package ru.betterend.blocks; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.core.BlockPos; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.entities.InfusionPedestalEntity; import ru.betterend.rituals.InfusionRitual; @@ -22,7 +22,7 @@ public class InfusionPedestal extends PedestalBlock { super(Blocks.OBSIDIAN); this.height = 1.08F; } - + @Override public void checkRitual(Level world, BlockPos pos) { BlockEntity blockEntity = world.getBlockEntity(pos); @@ -37,41 +37,41 @@ public class InfusionPedestal extends PedestalBlock { } } } - + @Override - public BlockEntity createBlockEntity(BlockView world) { + public BlockEntity newBlockEntity(BlockGetter world) { return new InfusionPedestalEntity(); } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { + public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { if (state.is(this)) { - switch (state.getValue(STATE)) { - case PEDESTAL_TOP: { - return SHAPE_PEDESTAL_TOP; - } - case DEFAULT: { - return SHAPE_DEFAULT; - } - default: { - return super.getOutlineShape(state, world, pos, context); - } + switch(state.getValue(STATE)) { + case PEDESTAL_TOP: { + return SHAPE_PEDESTAL_TOP; + } + case DEFAULT: { + return SHAPE_DEFAULT; + } + default: { + return super.getShape(state, world, pos, context); + } } } - return super.getOutlineShape(state, world, pos, context); + return super.getShape(state, world, pos, context); } - + static { - VoxelShape basinUp = Block.createCuboidShape(2, 3, 2, 14, 4, 14); - VoxelShape basinDown = Block.createCuboidShape(0, 0, 0, 16, 3, 16); - VoxelShape pedestalTop = Block.createCuboidShape(1, 9, 1, 15, 11, 15); - VoxelShape pedestalDefault = Block.createCuboidShape(1, 13, 1, 15, 15, 15); - VoxelShape pillar = Block.createCuboidShape(3, 0, 3, 13, 9, 13); - VoxelShape pillarDefault = Block.createCuboidShape(3, 4, 3, 13, 13, 13); - VoxelShape eyeDefault = Block.createCuboidShape(4, 15, 4, 12, 16, 12); - VoxelShape eyeTop = Block.createCuboidShape(4, 11, 4, 12, 12, 12); - VoxelShape basin = VoxelShapes.union(basinDown, basinUp); - SHAPE_DEFAULT = VoxelShapes.union(basin, pillarDefault, pedestalDefault, eyeDefault); - SHAPE_PEDESTAL_TOP = VoxelShapes.union(pillar, pedestalTop, eyeTop); + VoxelShape basinUp = Block.box(2, 3, 2, 14, 4, 14); + VoxelShape basinDown = Block.box(0, 0, 0, 16, 3, 16); + VoxelShape pedestalTop = Block.box(1, 9, 1, 15, 11, 15); + VoxelShape pedestalDefault = Block.box(1, 13, 1, 15, 15, 15); + VoxelShape pillar = Block.box(3, 0, 3, 13, 9, 13); + VoxelShape pillarDefault = Block.box(3, 4, 3, 13, 13, 13); + VoxelShape eyeDefault = Block.box(4, 15, 4, 12, 16, 12); + VoxelShape eyeTop = Block.box(4, 11, 4, 12, 12, 12); + VoxelShape basin = Shapes.or(basinDown, basinUp); + SHAPE_DEFAULT = Shapes.or(basin, pillarDefault, pedestalDefault, eyeDefault); + SHAPE_PEDESTAL_TOP = Shapes.or(pillar, pedestalTop, eyeTop); } } diff --git a/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java b/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java index 411f0598..3e105494 100644 --- a/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java +++ b/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java @@ -6,21 +6,21 @@ import java.util.List; import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.SlimeBlock; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; -import net.minecraft.world.item.ItemPlacementContext; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.core.Registry; +import net.minecraft.core.Vec3i; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; -import net.minecraft.core.Vec3i; -import net.minecraft.core.Registry; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SlimeBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IColorProvider; import ru.betterend.interfaces.IRenderTypeable; @@ -35,55 +35,55 @@ public class JellyshroomCapBlock extends SlimeBlock implements IRenderTypeable, private final Vec3i colorStart; private final Vec3i colorEnd; private final int coloritem; - + public JellyshroomCapBlock(int r1, int g1, int b1, int r2, int g2, int b2) { super(FabricBlockSettings.copyOf(Blocks.SLIME_BLOCK)); colorStart = new Vec3i(r1, g1, b1); colorEnd = new Vec3i(r2, g2, b2); coloritem = MHelper.color((r1 + r2) >> 1, (g1 + g2) >> 1, (b1 + b2) >> 1); } - + @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - double px = ctx.getBlockPos().getX() * 0.1; - double py = ctx.getBlockPos().getY() * 0.1; - double pz = ctx.getBlockPos().getZ() * 0.1; - return this.defaultBlockState().with(COLOR, MHelper.floor(NOISE.eval(px, py, pz) * 3.5 + 4)); + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + double px = ctx.getClickedPos().getX() * 0.1; + double py = ctx.getClickedPos().getY() * 0.1; + double pz = ctx.getClickedPos().getZ() * 0.1; + return this.defaultBlockState().setValue(COLOR, MHelper.floor(NOISE.eval(px, py, pz) * 3.5 + 4)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(COLOR); } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.TRANSLUCENT; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { return Lists.newArrayList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { String block = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, block, block); } - + @Override public String getModelPattern(String block) { return Patterns.createJson(Patterns.BLOCK_COLORED, "jellyshroom_cap"); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_SIMPLE; } - + @Override - public BlockColor getBlockProvider() { + public BlockColor getProvider() { return (state, world, pos, tintIndex) -> { float delta = (float) state.getValue(COLOR) / 7F; int r = Mth.floor(Mth.lerp(delta, colorStart.getX() / 255F, colorEnd.getX() / 255F) * 255F); diff --git a/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java b/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java index 403485c1..72063a4c 100644 --- a/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java @@ -1,8 +1,8 @@ package ru.betterend.blocks; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.blocks.basis.FeatureSaplingBlock; import ru.betterend.registry.EndBlocks; @@ -17,10 +17,9 @@ public class LacugroveSaplingBlock extends FeatureSaplingBlock { protected Feature getFeature() { return EndFeatures.LACUGROVE.getFeature(); } - + @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return world.getBlockState(pos.below()).is(EndBlocks.END_MOSS) - || world.getBlockState(pos.below()).is(EndBlocks.ENDSTONE_DUST); + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + return world.getBlockState(pos.below()).is(EndBlocks.END_MOSS) || world.getBlockState(pos.below()).is(EndBlocks.ENDSTONE_DUST); } } diff --git a/src/main/java/ru/betterend/blocks/LanceleafBlock.java b/src/main/java/ru/betterend/blocks/LanceleafBlock.java index ed5294b3..c6378032 100644 --- a/src/main/java/ru/betterend/blocks/LanceleafBlock.java +++ b/src/main/java/ru/betterend/blocks/LanceleafBlock.java @@ -2,19 +2,18 @@ package ru.betterend.blocks; import java.util.Collections; import java.util.List; - -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.EnumProperty; -import net.minecraft.world.level.block.state.properties.IntegerProperty; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.blocks.BlockProperties.PentaShape; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; @@ -23,44 +22,45 @@ import ru.betterend.util.MHelper; public class LanceleafBlock extends EndPlantBlock { public static final EnumProperty SHAPE = BlockProperties.PENTA_SHAPE; public static final IntegerProperty ROTATION = BlockProperties.ROTATION; - + public LanceleafBlock() { super(); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE, ROTATION); } - + @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { PentaShape shape = state.getValue(SHAPE); if (shape == PentaShape.TOP) { return world.getBlockState(pos.below()).is(this); - } else if (shape == PentaShape.BOTTOM) { - return world.getBlockState(pos.below()).is(EndBlocks.AMBER_MOSS) && world.getBlockState(pos.up()).is(this); - } else { - return world.getBlockState(pos.below()).is(this) && world.getBlockState(pos.up()).is(this); + } + else if (shape == PentaShape.BOTTOM) { + return world.getBlockState(pos.below()).is(EndBlocks.AMBER_MOSS) && world.getBlockState(pos.above()).is(this); + } + else { + return world.getBlockState(pos.below()).is(this) && world.getBlockState(pos.above()).is(this); } } - + @Override - public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, - BlockPos pos, BlockPos neighborPos) { - if (!canPlaceAt(state, world, pos)) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) { return Blocks.AIR.defaultBlockState(); - } else { + } + else { return state; } } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { if (state.getValue(SHAPE) == PentaShape.BOTTOM) { return Collections.singletonList(new ItemStack(EndBlocks.LANCELEAF_SEED)); } - return MHelper.RANDOM.nextBoolean() ? Collections.emptyList() - : Collections.singletonList(new ItemStack(EndBlocks.LANCELEAF_SEED)); + return MHelper.RANDOM.nextBoolean() ? Collections.emptyList() : Collections.singletonList(new ItemStack(EndBlocks.LANCELEAF_SEED)); } } diff --git a/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java b/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java index 4cf6142f..3f631b57 100644 --- a/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java @@ -1,13 +1,12 @@ package ru.betterend.blocks; import java.util.Random; - -import net.minecraft.world.level.block.AbstractBlock; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.BlockProperties.PentaShape; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; @@ -24,27 +23,23 @@ public class LanceleafSeedBlock extends EndPlantWithAgeBlock { } int rotation = random.nextInt(4); MutableBlockPos mut = new MutableBlockPos().set(pos); - BlockState plant = EndBlocks.LANCELEAF.defaultBlockState().with(BlockProperties.ROTATION, rotation); - BlocksHelper.setWithoutUpdate(world, mut, plant.with(BlockProperties.PENTA_SHAPE, PentaShape.BOTTOM)); - BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), - plant.with(BlockProperties.PENTA_SHAPE, PentaShape.PRE_BOTTOM)); + BlockState plant = EndBlocks.LANCELEAF.defaultBlockState().setValue(BlockProperties.ROTATION, rotation); + BlocksHelper.setWithoutUpdate(world, mut, plant.setValue(BlockProperties.PENTA_SHAPE, PentaShape.BOTTOM)); + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), plant.setValue(BlockProperties.PENTA_SHAPE, PentaShape.PRE_BOTTOM)); for (int i = 2; i < height - 2; i++) { - BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), - plant.with(BlockProperties.PENTA_SHAPE, PentaShape.MIDDLE)); + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), plant.setValue(BlockProperties.PENTA_SHAPE, PentaShape.MIDDLE)); } - BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), - plant.with(BlockProperties.PENTA_SHAPE, PentaShape.PRE_TOP)); - BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), - plant.with(BlockProperties.PENTA_SHAPE, PentaShape.TOP)); + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), plant.setValue(BlockProperties.PENTA_SHAPE, PentaShape.PRE_TOP)); + BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), plant.setValue(BlockProperties.PENTA_SHAPE, PentaShape.TOP)); } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.AMBER_MOSS); } - + @Override - public AbstractBlock.OffsetType getOffsetType() { - return AbstractBlock.OffsetType.NONE; + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.NONE; } } diff --git a/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java b/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java index fac9f8d2..befeb7c9 100644 --- a/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java +++ b/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java @@ -4,75 +4,77 @@ import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.EnumProperty; import net.minecraft.core.BlockPos; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; public class LargeAmaranitaBlock extends EndPlantBlock { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; - private static final VoxelShape SHAPE_BOTTOM = Block.createCuboidShape(4, 0, 4, 12, 14, 12); - private static final VoxelShape SHAPE_TOP = VoxelShapes.union(Block.createCuboidShape(1, 3, 1, 15, 16, 15), - SHAPE_BOTTOM); - + private static final VoxelShape SHAPE_BOTTOM = Block.box(4, 0, 4, 12, 14, 12); + private static final VoxelShape SHAPE_TOP = Shapes.or(Block.box(1, 3, 1, 15, 16, 15), SHAPE_BOTTOM); + public LargeAmaranitaBlock() { super(FabricBlockSettings.of(Material.PLANT) - .luminance((state) -> (state.getValue(SHAPE) == TripleShape.TOP) ? 15 : 0) - .breakByTool(FabricToolTags.SHEARS).sounds(SoundType.GRASS).breakByHand(true)); + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.GRASS) + .lightLevel((state) -> (state.getValue(SHAPE) == TripleShape.TOP) ? 15 : 0)); } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return state.getValue(SHAPE) == TripleShape.TOP ? SHAPE_TOP : SHAPE_BOTTOM; } - + @Override protected boolean isTerrain(BlockState state) { - return state.is(EndBlocks.SANGNUM) || state.is(EndBlocks.MOSSY_OBSIDIAN) - || state.is(EndBlocks.MOSSY_DRAGON_BONE); + return state.is(EndBlocks.SANGNUM) || state.is(EndBlocks.MOSSY_OBSIDIAN) || state.is(EndBlocks.MOSSY_DRAGON_BONE); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE); } - + @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { TripleShape shape = state.getValue(SHAPE); if (shape == TripleShape.BOTTOM) { - return isTerrain(world.getBlockState(pos.below())) && world.getBlockState(pos.up()).is(this); - } else if (shape == TripleShape.TOP) { + return isTerrain(world.getBlockState(pos.below())) && world.getBlockState(pos.above()).is(this); + } + else if (shape == TripleShape.TOP) { return world.getBlockState(pos.below()).is(this); - } else { - return world.getBlockState(pos.below()).is(this) && world.getBlockState(pos.up()).is(this); + } + else { + return world.getBlockState(pos.below()).is(this) && world.getBlockState(pos.above()).is(this); } } - + @Override public OffsetType getOffsetType() { return OffsetType.NONE; } - + @Override - public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { return false; } @Override - public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return false; } } diff --git a/src/main/java/ru/betterend/blocks/LumecornBlock.java b/src/main/java/ru/betterend/blocks/LumecornBlock.java index a1ccdd25..9f782340 100644 --- a/src/main/java/ru/betterend/blocks/LumecornBlock.java +++ b/src/main/java/ru/betterend/blocks/LumecornBlock.java @@ -7,21 +7,21 @@ 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.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.EnumProperty; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.EnumProperty; +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.betterend.blocks.BlockProperties.LumecornShape; import ru.betterend.blocks.basis.BlockBaseNotFull; import ru.betterend.client.render.ERenderLayer; @@ -32,17 +32,19 @@ import ru.betterend.registry.EndTags; import ru.betterend.util.MHelper; public class LumecornBlock extends BlockBaseNotFull implements IRenderTypeable { - public static final EnumProperty SHAPE = EnumProperty.of("shape", LumecornShape.class); - private static final VoxelShape SHAPE_BOTTOM = Block.createCuboidShape(6, 0, 6, 10, 16, 10); - private static final VoxelShape SHAPE_TOP = Block.createCuboidShape(6, 0, 6, 10, 8, 10); - + public static final EnumProperty SHAPE = EnumProperty.create("shape", LumecornShape.class); + private static final VoxelShape SHAPE_BOTTOM = Block.box(6, 0, 6, 10, 16, 10); + private static final VoxelShape SHAPE_TOP = Block.box(6, 0, 6, 10, 8, 10); + public LumecornBlock() { - super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).hardness(0.5F) - .luminance((state) -> { - return state.getValue(SHAPE).getLight(); - })); + super(FabricBlockSettings.of(Material.WOOD) + .breakByTool(FabricToolTags.AXES) + .hardness(0.5F) + .lightLevel((state) -> { + return state.getValue(SHAPE).getLight(); + })); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE); @@ -52,48 +54,48 @@ public class LumecornBlock extends BlockBaseNotFull implements IRenderTypeable { public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return state.getValue(SHAPE) == LumecornShape.LIGHT_TOP ? SHAPE_TOP : SHAPE_BOTTOM; } - + @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { LumecornShape shape = state.getValue(SHAPE); if (shape == LumecornShape.BOTTOM_BIG || shape == LumecornShape.BOTTOM_SMALL) { - return world.getBlockState(pos.below()).isIn(EndTags.END_GROUND); - } else if (shape == LumecornShape.LIGHT_TOP) { + return world.getBlockState(pos.below()).is(EndTags.END_GROUND); + } + else if (shape == LumecornShape.LIGHT_TOP) { return world.getBlockState(pos.below()).is(this); - } else { - return world.getBlockState(pos.below()).is(this) && world.getBlockState(pos.up()).is(this); + } + else { + return world.getBlockState(pos.below()).is(this) && world.getBlockState(pos.above()).is(this); } } - + @Override - public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, - BlockPos pos, BlockPos neighborPos) { - if (!canPlaceAt(state, world, pos)) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) { return Blocks.AIR.defaultBlockState(); - } else { + } + else { return state; } } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { LumecornShape shape = state.getValue(SHAPE); if (shape == LumecornShape.BOTTOM_BIG || shape == LumecornShape.BOTTOM_SMALL || shape == LumecornShape.MIDDLE) { - return Collections - .singletonList(new ItemStack(EndBlocks.LUMECORN_SEED, MHelper.randRange(1, 2, MHelper.RANDOM))); + return Collections.singletonList(new ItemStack(EndBlocks.LUMECORN_SEED, MHelper.randRange(1, 2, MHelper.RANDOM))); } - return MHelper.RANDOM.nextBoolean() ? Collections.singletonList(new ItemStack(EndItems.LUMECORN_ROD)) - : Collections.emptyList(); + return MHelper.RANDOM.nextBoolean() ? Collections.singletonList(new ItemStack(EndItems.LUMECORN_ROD)) : Collections.emptyList(); } - + @Override @Environment(EnvType.CLIENT) - public ItemStack getPickStack(BlockView world, BlockPos pos, BlockState state) { + public ItemStack getCloneItemStack(BlockGetter world, BlockPos pos, BlockState state) { LumecornShape shape = state.getValue(SHAPE); if (shape == LumecornShape.BOTTOM_BIG || shape == LumecornShape.BOTTOM_SMALL || shape == LumecornShape.MIDDLE) { return new ItemStack(EndBlocks.LUMECORN_SEED); diff --git a/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java b/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java index 9046228d..c3e6a14c 100644 --- a/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java @@ -1,11 +1,10 @@ package ru.betterend.blocks; import java.util.Random; - -import net.minecraft.world.level.block.AbstractBlock; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; @@ -15,14 +14,14 @@ public class LumecornSeedBlock extends EndPlantWithAgeBlock { public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { EndFeatures.LUMECORN.getFeature().place(world, null, random, pos, null); } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.END_MOSS); } - + @Override - public AbstractBlock.OffsetType getOffsetType() { - return AbstractBlock.OffsetType.NONE; + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.NONE; } } diff --git a/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java b/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java index 5454173d..b2958584 100644 --- a/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java +++ b/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java @@ -5,20 +5,20 @@ import java.util.Queue; import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.FluidBlock; -import net.minecraft.world.level.block.FluidDrainable; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.fluid.FluidState; -import net.minecraft.world.level.material.Fluids; -import net.minecraft.tags.FluidTags; -import net.minecraft.util.Pair; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.tags.FluidTags; +import net.minecraft.util.Tuple; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.BucketPickup; +import net.minecraft.world.level.block.LiquidBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.Material; import ru.betterend.blocks.basis.BlockBaseNotFull; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; @@ -26,19 +26,18 @@ import ru.betterend.registry.EndBlocks; public class MengerSpongeBlock extends BlockBaseNotFull implements IRenderTypeable { public MengerSpongeBlock() { - super(FabricBlockSettings.copyOf(Blocks.SPONGE).nonOpaque()); + super(FabricBlockSettings.copyOf(Blocks.SPONGE).noOcclusion()); } - + @Override - public void onBlockAdded(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean notify) { + public void onPlace(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean notify) { if (absorbWater(world, pos)) { world.setBlockAndUpdate(pos, EndBlocks.MENGER_SPONGE_WET.defaultBlockState()); } } - + @Override - public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, - BlockPos pos, BlockPos neighborPos) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { if (absorbWater(world, pos)) { return EndBlocks.MENGER_SPONGE_WET.defaultBlockState(); } @@ -46,46 +45,44 @@ public class MengerSpongeBlock extends BlockBaseNotFull implements IRenderTypeab } private boolean absorbWater(LevelAccessor world, BlockPos pos) { - Queue> queue = Lists.newLinkedList(); - queue.add(new Pair(pos, 0)); + Queue> queue = Lists.newLinkedList(); + queue.add(new Tuple(pos, 0)); int i = 0; while (!queue.isEmpty()) { - Pair pair = queue.poll(); - BlockPos blockPos = (BlockPos) pair.getLeft(); - int j = (Integer) pair.getRight(); + Tuple pair = queue.poll(); + BlockPos blockPos = (BlockPos) pair.getA(); + int j = (Integer) pair.getB(); Direction[] var8 = Direction.values(); int var9 = var8.length; for (int var10 = 0; var10 < var9; ++var10) { Direction direction = var8[var10]; - BlockPos blockPos2 = blockPos.offset(direction); + BlockPos blockPos2 = blockPos.relative(direction); BlockState blockState = world.getBlockState(blockPos2); FluidState fluidState = world.getFluidState(blockPos2); Material material = blockState.getMaterial(); - if (fluidState.isIn(FluidTags.WATER)) { - if (blockState.getBlock() instanceof FluidDrainable && ((FluidDrainable) blockState.getBlock()) - .tryDrainFluid(world, blockPos2, blockState) != Fluids.EMPTY) { + if (fluidState.is(FluidTags.WATER)) { + if (blockState.getBlock() instanceof BucketPickup && ((BucketPickup) blockState.getBlock()).takeLiquid(world, blockPos2, blockState) != Fluids.EMPTY) { ++i; if (j < 6) { - queue.add(new Pair(blockPos2, j + 1)); + queue.add(new Tuple(blockPos2, j + 1)); } - } else if (blockState.getBlock() instanceof FluidBlock) { - world.setBlockAndUpdate(blockPos2, Blocks.AIR.defaultBlockState(), 3); + } + else if (blockState.getBlock() instanceof LiquidBlock) { + world.setBlock(blockPos2, Blocks.AIR.defaultBlockState(), 3); ++i; if (j < 6) { - queue.add(new Pair(blockPos2, j + 1)); + queue.add(new Tuple(blockPos2, j + 1)); } - } else if (material == Material.UNDERWATER_PLANT - || material == Material.REPLACEABLE_UNDERWATER_PLANT) { - BlockEntity blockEntity = blockState.getBlock().hasBlockEntity() - ? world.getBlockEntity(blockPos2) - : null; - dropStacks(blockState, world, blockPos2, blockEntity); - world.setBlockAndUpdate(blockPos2, Blocks.AIR.defaultBlockState(), 3); + } + else if (material == Material.WATER_PLANT || material == Material.REPLACEABLE_WATER_PLANT) { + BlockEntity blockEntity = blockState.getBlock().isEntityBlock() ? world.getBlockEntity(blockPos2) : null; + dropResources(blockState, world, blockPos2, blockEntity); + world.setBlock(blockPos2, Blocks.AIR.defaultBlockState(), 3); ++i; if (j < 6) { - queue.add(new Pair(blockPos2, j + 1)); + queue.add(new Tuple(blockPos2, j + 1)); } } } @@ -98,7 +95,7 @@ public class MengerSpongeBlock extends BlockBaseNotFull implements IRenderTypeab return i > 0; } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; diff --git a/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java b/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java index 4cab2fbc..90d219eb 100644 --- a/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java +++ b/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java @@ -5,20 +5,20 @@ import java.util.Random; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.entity.ItemEntity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.fluid.FluidState; -import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.item.ItemStack; -import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.sounds.SoundSource; -import net.minecraft.sounds.SoundEvents; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.GameRules; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.GameRules; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; import ru.betterend.blocks.basis.BlockBaseNotFull; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; @@ -27,27 +27,26 @@ import ru.betterend.util.BlocksHelper; public class MengerSpongeWetBlock extends BlockBaseNotFull implements IRenderTypeable { public MengerSpongeWetBlock() { - super(FabricBlockSettings.copyOf(Blocks.WET_SPONGE).nonOpaque()); + super(FabricBlockSettings.copyOf(Blocks.WET_SPONGE).noOcclusion()); } @Override - public void onBlockAdded(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean notify) { - if (world.getDimension().isUltrawarm()) { - world.setBlockAndUpdate(pos, EndBlocks.MENGER_SPONGE.defaultBlockState(), 3); - world.syncWorldEvent(2009, pos, 0); - world.playLocalSound((Player) null, pos, SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundSource.BLOCKS, 1.0F, - (1.0F + world.getRandom().nextFloat() * 0.2F) * 0.7F); + public void onPlace(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean notify) { + if (world.dimensionType().ultraWarm()) { + world.setBlock(pos, EndBlocks.MENGER_SPONGE.defaultBlockState(), 3); + world.levelEvent(2009, pos, 0); + world.playSound((Player) null, pos, SoundEvents.FIRE_EXTINGUISH, SoundSource.BLOCKS, 1.0F, (1.0F + world.getRandom().nextFloat() * 0.2F) * 0.7F); } } @Override @Environment(EnvType.CLIENT) public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { - Direction direction = Direction.random(random); + Direction direction = Direction.getRandom(random); if (direction != Direction.UP) { BlockPos blockPos = pos.relative(direction); BlockState blockState = world.getBlockState(blockPos); - if (!state.isOpaque() || !blockState.isSideSolidFullSquare(world, blockPos, direction.getOpposite())) { + if (!state.canOcclude() || !blockState.isFaceSturdy(world, blockPos, direction.getOpposite())) { double x = (double) pos.getX(); double y = (double) pos.getY(); double z = (double) pos.getZ(); @@ -55,20 +54,24 @@ public class MengerSpongeWetBlock extends BlockBaseNotFull implements IRenderTyp y -= 0.05; x += random.nextDouble(); z += random.nextDouble(); - } else { + } + else { y += random.nextDouble() * 0.8; if (direction.getAxis() == Direction.Axis.X) { z += random.nextDouble(); if (direction == Direction.EAST) { ++x; - } else { + } + else { x += 0.05; } - } else { + } + else { x += random.nextDouble(); if (direction == Direction.SOUTH) { ++z; - } else { + } + else { z += 0.05; } } @@ -80,25 +83,24 @@ public class MengerSpongeWetBlock extends BlockBaseNotFull implements IRenderTyp } @Override - public void onBreak(Level world, BlockPos pos, BlockState state, Player player) { + public void playerWillDestroy(Level world, BlockPos pos, BlockState state, Player player) { BlocksHelper.setWithUpdate(world, pos, Blocks.AIR); if (!world.isClientSide()) { - world.syncWorldEvent(2001, pos, getRawIdFromState(state)); + world.levelEvent(2001, pos, getId(state)); } - if (world.getGameRules().getBoolean(GameRules.DO_TILE_DROPS) && (player == null || !player.isCreative())) { - ItemEntity drop = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, - new ItemStack(this)); - world.spawnEntity(drop); + if (world.getGameRules().getBoolean(GameRules.RULE_DOBLOCKDROPS) && (player == null || !player.isCreative())) { + ItemEntity drop = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(this)); + world.addFreshEntity(drop); } } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override public FluidState getFluidState(BlockState state) { - return Fluids.WATER.getStill(false); + return Fluids.WATER.getSource(false); } } diff --git a/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java b/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java index fe928885..662481cc 100644 --- a/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java +++ b/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java @@ -5,27 +5,27 @@ import java.util.List; import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.SnowBlock; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.item.enchantment.Enchantments; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.server.level.ServerLevel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.WorldView; -import net.minecraft.world.chunk.light.ChunkLightProvider; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SnowLayerBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.lighting.LayerLightEngine; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import ru.betterend.blocks.basis.EndPillarBlock; import ru.betterend.registry.EndBlocks; public class MossyDragonBoneBlock extends EndPillarBlock { public MossyDragonBoneBlock() { - super(FabricBlockSettings.copyOf(Blocks.BONE_BLOCK).hardness(0.5F).ticksRandomly()); + super(FabricBlockSettings.copyOf(Blocks.BONE_BLOCK).hardness(0.5F).randomTicks()); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); @@ -34,25 +34,25 @@ public class MossyDragonBoneBlock extends EndPillarBlock { } return Collections.singletonList(new ItemStack(EndBlocks.DRAGON_BONE_BLOCK)); } - + @Override public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { if (random.nextInt(16) == 0 && !canSurvive(state, world, pos)) { - world.setBlockAndUpdate(pos, Blocks.BONE_BLOCK.defaultBlockState().with(AXIS, state.getValue(AXIS))); + world.setBlockAndUpdate(pos, Blocks.BONE_BLOCK.defaultBlockState().setValue(AXIS, state.getValue(AXIS))); } } - public static boolean canSurvive(BlockState state, WorldView worldView, BlockPos pos) { - BlockPos blockPos = pos.up(); - BlockState blockState = worldView.getBlockState(blockPos); - if (blockState.is(Blocks.SNOW) && (Integer) blockState.get(SnowBlock.LAYERS) == 1) { - return true; - } else if (blockState.getFluidState().getLevel() == 8) { - return false; - } else { - int i = ChunkLightProvider.getRealisticOpacity(worldView, state, pos, blockState, blockPos, Direction.UP, - blockState.getOpacity(worldView, blockPos)); - return i < 5; - } - } + @Override + public boolean canSurvive(BlockState state, LevelReader worldView, BlockPos pos) { + BlockPos blockPos = pos.above(); + BlockState blockState = worldView.getBlockState(blockPos); + if (blockState.is(Blocks.SNOW) && blockState.getValue(SnowLayerBlock.LAYERS) == 1) { + return true; + } else if (blockState.getFluidState().getAmount() == 8) { + return false; + } else { + int i = LayerLightEngine.getLightBlockInto(worldView, state, pos, blockState, blockPos, Direction.UP, blockState.getLightBlock(worldView, blockPos)); + return i < 5; + } + } } diff --git a/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java b/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java index bec58eb8..8ba518da 100644 --- a/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java +++ b/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java @@ -2,27 +2,26 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.item.ItemPlacementContext; import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.BooleanProperty; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.Material; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; public class MossyGlowshroomCapBlock extends BlockBase { public static final BooleanProperty TRANSITION = BlockProperties.TRANSITION; - + public MossyGlowshroomCapBlock() { - super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sounds(SoundType.WOOD)); - this.setDefaultState(this.stateManager.defaultBlockState().with(TRANSITION, false)); + super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sound(SoundType.WOOD)); + this.registerDefaultState(this.stateDefinition.any().setValue(TRANSITION, false)); } - - public BlockState getPlacementState(ItemPlacementContext ctx) { - return this.defaultBlockState().with(TRANSITION, - EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(ctx.getLevel().getBlockState(ctx.getBlockPos().below()))); + + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + return this.defaultBlockState().setValue(TRANSITION, EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(ctx.getLevel().getBlockState(ctx.getClickedPos().below()))); } protected void createBlockStateDefinition(StateDefinition.Builder builder) { diff --git a/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java b/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java index 3359b6be..3781d6ba 100644 --- a/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java @@ -1,8 +1,8 @@ package ru.betterend.blocks; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.blocks.basis.FeatureSaplingBlock; import ru.betterend.registry.EndBlocks; @@ -17,10 +17,9 @@ public class MossyGlowshroomSaplingBlock extends FeatureSaplingBlock { protected Feature getFeature() { return EndFeatures.MOSSY_GLOWSHROOM.getFeature(); } - + @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return world.getBlockState(pos.below()).is(EndBlocks.END_MOSS) - || world.getBlockState(pos.below()).is(EndBlocks.END_MYCELIUM); + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + return world.getBlockState(pos.below()).is(EndBlocks.END_MOSS) || world.getBlockState(pos.below()).is(EndBlocks.END_MYCELIUM); } } diff --git a/src/main/java/ru/betterend/blocks/MossyObsidian.java b/src/main/java/ru/betterend/blocks/MossyObsidian.java index ecb15503..4d2e3a12 100644 --- a/src/main/java/ru/betterend/blocks/MossyObsidian.java +++ b/src/main/java/ru/betterend/blocks/MossyObsidian.java @@ -5,26 +5,26 @@ import java.util.List; import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.SnowBlock; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.item.enchantment.Enchantments; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.server.level.ServerLevel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.WorldView; -import net.minecraft.world.chunk.light.ChunkLightProvider; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SnowLayerBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.lighting.LayerLightEngine; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import ru.betterend.blocks.basis.BlockBase; public class MossyObsidian extends BlockBase { public MossyObsidian() { - super(FabricBlockSettings.copyOf(Blocks.OBSIDIAN).hardness(3).ticksRandomly()); + super(FabricBlockSettings.copyOf(Blocks.OBSIDIAN).hardness(3).randomTicks()); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); @@ -33,25 +33,24 @@ public class MossyObsidian extends BlockBase { } return Collections.singletonList(new ItemStack(Blocks.OBSIDIAN)); } - + @Override public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { if (random.nextInt(16) == 0 && !canSurvive(state, world, pos)) { world.setBlockAndUpdate(pos, Blocks.OBSIDIAN.defaultBlockState()); } } - - public static boolean canSurvive(BlockState state, WorldView worldView, BlockPos pos) { - BlockPos blockPos = pos.up(); - BlockState blockState = worldView.getBlockState(blockPos); - if (blockState.is(Blocks.SNOW) && (Integer) blockState.get(SnowBlock.LAYERS) == 1) { - return true; - } else if (blockState.getFluidState().getLevel() == 8) { - return false; - } else { - int i = ChunkLightProvider.getRealisticOpacity(worldView, state, pos, blockState, blockPos, Direction.UP, - blockState.getOpacity(worldView, blockPos)); - return i < 5; - } - } + + public boolean canSurvive(BlockState state, LevelReader worldView, BlockPos pos) { + BlockPos blockPos = pos.above(); + BlockState blockState = worldView.getBlockState(blockPos); + if (blockState.is(Blocks.SNOW) && (Integer)blockState.getValue(SnowLayerBlock.LAYERS) == 1) { + return true; + } else if (blockState.getFluidState().getAmount() == 8) { + return false; + } else { + int i = LayerLightEngine.getLightBlockInto(worldView, state, pos, blockState, blockPos, Direction.UP, blockState.getLightBlock(worldView, blockPos)); + return i < 5; + } + } } diff --git a/src/main/java/ru/betterend/blocks/MurkweedBlock.java b/src/main/java/ru/betterend/blocks/MurkweedBlock.java index 893fc86d..cd7ec961 100644 --- a/src/main/java/ru/betterend/blocks/MurkweedBlock.java +++ b/src/main/java/ru/betterend/blocks/MurkweedBlock.java @@ -4,16 +4,16 @@ import java.util.Random; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.ai.pathing.NavigationType; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; -import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.pathfinder.PathComputationType; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; @@ -27,21 +27,21 @@ public class MurkweedBlock extends EndPlantBlock { double v = random.nextDouble() * 0.1; world.addParticle(ParticleTypes.ENTITY_EFFECT, x, y, z, v, v, v); } - + @Override public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { - if (entity instanceof LivingEntity && !((LivingEntity) entity).hasMobEffect(MobEffects.BLINDNESS)) { - ((LivingEntity) entity).addMobEffect(new MobEffectInstance(MobEffects.BLINDNESS, 50)); + if (entity instanceof LivingEntity && !((LivingEntity) entity).hasEffect(MobEffects.BLINDNESS)) { + ((LivingEntity) entity).addEffect(new MobEffectInstance(MobEffects.BLINDNESS, 50)); } } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.SHADOW_GRASS); } - + @Override - public boolean canPathfindThrough(BlockState state, BlockView world, BlockPos pos, NavigationType type) { + public boolean isPathfindable(BlockState state, BlockGetter world, BlockPos pos, PathComputationType type) { return false; } } diff --git a/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java b/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java index 1b5f83dd..00abb588 100644 --- a/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java +++ b/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java @@ -5,20 +5,20 @@ import java.util.List; import com.google.common.collect.Lists; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.core.BlockPos; +import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.ai.pathing.NavigationType; -import net.minecraft.world.entity.damage.DamageSource; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.core.BlockPos; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.pathfinder.PathComputationType; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; @@ -27,28 +27,28 @@ public class NeedlegrassBlock extends EndPlantBlock { @Override public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { if (entity instanceof LivingEntity) { - entity.damage(DamageSource.CACTUS, 0.1F); + entity.hurt(DamageSource.CACTUS, 0.1F); } } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); - if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) - || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Lists.newArrayList(new ItemStack(this)); - } else { + } + else { return Lists.newArrayList(new ItemStack(Items.STICK, MHelper.randRange(0, 2, MHelper.RANDOM))); } } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.SHADOW_GRASS); } @Override - public boolean canPathfindThrough(BlockState state, BlockView world, BlockPos pos, NavigationType type) { + public boolean isPathfindable(BlockState state, BlockGetter world, BlockPos pos, PathComputationType type) { return false; } } diff --git a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java index f0a95711..58fc1ac1 100644 --- a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java +++ b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java @@ -5,137 +5,134 @@ import java.util.EnumMap; import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.level.block.Waterloggable; -import net.minecraft.fluid.FluidState; -import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.item.ItemPlacementContext; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.DirectionProperty; -import net.minecraft.state.property.EnumProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.util.BlockMirror; -import net.minecraft.world.level.block.Rotation; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.BlockBaseNotFull; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.util.BlocksHelper; -public class NeonCactusBlock extends BlockBaseNotFull implements Waterloggable, IRenderTypeable { +public class NeonCactusBlock extends BlockBaseNotFull implements SimpleWaterloggedBlock, IRenderTypeable { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; - public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; - public static final DirectionProperty FACING = Properties.FACING; - + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + public static final DirectionProperty FACING = BlockStateProperties.FACING; + private static final EnumMap MEDIUM_SHAPES_OPEN = Maps.newEnumMap(Direction.class); private static final EnumMap SMALL_SHAPES_OPEN = Maps.newEnumMap(Direction.class); private static final EnumMap MEDIUM_SHAPES = Maps.newEnumMap(Axis.class); private static final EnumMap SMALL_SHAPES = Maps.newEnumMap(Axis.class); - + public NeonCactusBlock() { - super(FabricBlockSettings.copyOf(Blocks.CACTUS).luminance(state -> { + super(FabricBlockSettings.copyOf(Blocks.CACTUS).lightLevel(state -> { TripleShape shape = state.getValue(SHAPE); if (shape == TripleShape.TOP) { return 15; } return shape == TripleShape.MIDDLE ? 13 : 10; })); - setDefaultState( - getDefaultState().with(WATERLOGGED, false).with(FACING, Direction.UP).with(SHAPE, TripleShape.TOP)); + registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false).setValue(FACING, Direction.UP).setValue(SHAPE, TripleShape.TOP)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE, WATERLOGGED, FACING); } - + @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { + public BlockState getStateForPlacement(BlockPlaceContext ctx) { LevelAccessor worldAccess = ctx.getLevel(); - BlockPos blockPos = ctx.getBlockPos(); - return this.defaultBlockState() - .with(WATERLOGGED, worldAccess.getFluidState(blockPos).getFluid() == Fluids.WATER) - .with(FACING, ctx.getSide()); + BlockPos blockPos = ctx.getClickedPos(); + return this.defaultBlockState().setValue(WATERLOGGED, worldAccess.getFluidState(blockPos).getType() == Fluids.WATER).setValue(FACING, ctx.getClickedFace()); } - + @Override public BlockState rotate(BlockState state, Rotation rotation) { return BlocksHelper.rotateHorizontal(state, rotation, FACING); } @Override - public BlockState mirror(BlockState state, BlockMirror mirror) { + public BlockState mirror(BlockState state, Mirror mirror) { return BlocksHelper.mirrorHorizontal(state, mirror, FACING); } - + @Override public FluidState getFluidState(BlockState state) { - return (Boolean) state.getValue(WATERLOGGED) ? Fluids.WATER.getStill(false) : super.getFluidState(state); + return (Boolean) state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); } - + @Override - public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, - BlockPos pos, BlockPos posFrom) { + public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { if ((Boolean) state.getValue(WATERLOGGED)) { - world.getFluidTickScheduler().schedule(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + world.getLiquidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); } return state; } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { TripleShape shape = state.getValue(SHAPE); - + if (shape == TripleShape.BOTTOM) { - return VoxelShapes.fullCube(); + return Shapes.block(); } Direction dir = state.getValue(FACING); BlockState next = view.getBlockState(pos.relative(dir)); if (next.is(this)) { Axis axis = dir.getAxis(); return shape == TripleShape.MIDDLE ? MEDIUM_SHAPES.get(axis) : SMALL_SHAPES.get(axis); - } else { + } + else { return shape == TripleShape.MIDDLE ? MEDIUM_SHAPES_OPEN.get(dir) : SMALL_SHAPES_OPEN.get(dir); } } - + static { - MEDIUM_SHAPES.put(Axis.X, Block.createCuboidShape(0, 2, 2, 16, 14, 14)); - MEDIUM_SHAPES.put(Axis.Y, Block.createCuboidShape(2, 0, 2, 14, 16, 14)); - MEDIUM_SHAPES.put(Axis.Z, Block.createCuboidShape(2, 2, 0, 14, 14, 16)); - - SMALL_SHAPES.put(Axis.X, Block.createCuboidShape(0, 4, 4, 16, 12, 12)); - SMALL_SHAPES.put(Axis.Y, Block.createCuboidShape(4, 0, 4, 12, 16, 12)); - SMALL_SHAPES.put(Axis.Z, Block.createCuboidShape(4, 4, 0, 12, 12, 16)); - - MEDIUM_SHAPES_OPEN.put(Direction.UP, Block.createCuboidShape(2, 0, 2, 14, 14, 14)); - MEDIUM_SHAPES_OPEN.put(Direction.DOWN, Block.createCuboidShape(2, 2, 2, 14, 16, 14)); - MEDIUM_SHAPES_OPEN.put(Direction.NORTH, Block.createCuboidShape(2, 2, 2, 14, 14, 16)); - MEDIUM_SHAPES_OPEN.put(Direction.SOUTH, Block.createCuboidShape(2, 2, 0, 14, 14, 14)); - MEDIUM_SHAPES_OPEN.put(Direction.WEST, Block.createCuboidShape(2, 2, 2, 16, 14, 14)); - MEDIUM_SHAPES_OPEN.put(Direction.EAST, Block.createCuboidShape(0, 2, 2, 14, 14, 14)); - - SMALL_SHAPES_OPEN.put(Direction.UP, Block.createCuboidShape(4, 0, 4, 12, 12, 12)); - SMALL_SHAPES_OPEN.put(Direction.DOWN, Block.createCuboidShape(4, 4, 4, 12, 16, 12)); - SMALL_SHAPES_OPEN.put(Direction.NORTH, Block.createCuboidShape(4, 4, 4, 12, 12, 16)); - SMALL_SHAPES_OPEN.put(Direction.SOUTH, Block.createCuboidShape(4, 4, 0, 12, 12, 12)); - SMALL_SHAPES_OPEN.put(Direction.WEST, Block.createCuboidShape(4, 4, 4, 16, 12, 12)); - SMALL_SHAPES_OPEN.put(Direction.EAST, Block.createCuboidShape(0, 4, 4, 12, 12, 12)); + MEDIUM_SHAPES.put(Axis.X, Block.box(0, 2, 2, 16, 14, 14)); + MEDIUM_SHAPES.put(Axis.Y, Block.box(2, 0, 2, 14, 16, 14)); + MEDIUM_SHAPES.put(Axis.Z, Block.box(2, 2, 0, 14, 14, 16)); + + SMALL_SHAPES.put(Axis.X, Block.box(0, 4, 4, 16, 12, 12)); + SMALL_SHAPES.put(Axis.Y, Block.box(4, 0, 4, 12, 16, 12)); + SMALL_SHAPES.put(Axis.Z, Block.box(4, 4, 0, 12, 12, 16)); + + MEDIUM_SHAPES_OPEN.put(Direction.UP, Block.box(2, 0, 2, 14, 14, 14)); + MEDIUM_SHAPES_OPEN.put(Direction.DOWN, Block.box(2, 2, 2, 14, 16, 14)); + MEDIUM_SHAPES_OPEN.put(Direction.NORTH, Block.box(2, 2, 2, 14, 14, 16)); + MEDIUM_SHAPES_OPEN.put(Direction.SOUTH, Block.box(2, 2, 0, 14, 14, 14)); + MEDIUM_SHAPES_OPEN.put(Direction.WEST, Block.box(2, 2, 2, 16, 14, 14)); + MEDIUM_SHAPES_OPEN.put(Direction.EAST, Block.box(0, 2, 2, 14, 14, 14)); + + SMALL_SHAPES_OPEN.put(Direction.UP, Block.box(4, 0, 4, 12, 12, 12)); + SMALL_SHAPES_OPEN.put(Direction.DOWN, Block.box(4, 4, 4, 12, 16, 12)); + SMALL_SHAPES_OPEN.put(Direction.NORTH, Block.box(4, 4, 4, 12, 12, 16)); + SMALL_SHAPES_OPEN.put(Direction.SOUTH, Block.box(4, 4, 0, 12, 12, 12)); + SMALL_SHAPES_OPEN.put(Direction.WEST, Block.box(4, 4, 4, 16, 12, 12)); + SMALL_SHAPES_OPEN.put(Direction.EAST, Block.box(0, 4, 4, 12, 12, 12)); } } diff --git a/src/main/java/ru/betterend/blocks/PedestalVanilla.java b/src/main/java/ru/betterend/blocks/PedestalVanilla.java index a25460c1..292303fb 100644 --- a/src/main/java/ru/betterend/blocks/PedestalVanilla.java +++ b/src/main/java/ru/betterend/blocks/PedestalVanilla.java @@ -2,10 +2,9 @@ package ru.betterend.blocks; import java.util.HashMap; import java.util.Map; - -import net.minecraft.world.level.block.Block; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.patterns.Patterns; @@ -14,7 +13,7 @@ public class PedestalVanilla extends PedestalBlock { public PedestalVanilla(Block parent) { super(parent); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(parent); @@ -22,7 +21,7 @@ public class PedestalVanilla extends PedestalBlock { Map textures = new HashMap() { private static final long serialVersionUID = 1L; { - put("%mod%", blockId.getNamespace()); + put("%mod%", blockId.getNamespace() ); put("%top%", "polished_" + name); put("%base%", "polished_" + name); put("%pillar%", name + "_pillar"); diff --git a/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java b/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java index 55f92caa..2455e3b8 100644 --- a/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java @@ -1,8 +1,8 @@ package ru.betterend.blocks; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.blocks.basis.FeatureSaplingBlock; import ru.betterend.registry.EndBlocks; @@ -17,9 +17,9 @@ public class PythadendronSaplingBlock extends FeatureSaplingBlock { protected Feature getFeature() { return EndFeatures.PYTHADENDRON_TREE.getFeature(); } - + @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { return world.getBlockState(pos.below()).is(EndBlocks.CHORUS_NYLIUM); } } diff --git a/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java b/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java index 46579bd6..74208609 100644 --- a/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java +++ b/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java @@ -7,34 +7,34 @@ import org.jetbrains.annotations.Nullable; import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.ShapeContext; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.sounds.SoundSource; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.EnumProperty; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.client.render.ERenderLayer; @@ -47,89 +47,94 @@ import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; public class RespawnObeliskBlock extends BlockBase implements IColorProvider, IRenderTypeable { - private static final VoxelShape VOXEL_SHAPE_BOTTOM = Block.createCuboidShape(1, 0, 1, 15, 16, 15); - private static final VoxelShape VOXEL_SHAPE_MIDDLE_TOP = Block.createCuboidShape(2, 0, 2, 14, 16, 14); - + private static final VoxelShape VOXEL_SHAPE_BOTTOM = Block.box(1, 0, 1, 15, 16, 15); + private static final VoxelShape VOXEL_SHAPE_MIDDLE_TOP = Block.box(2, 0, 2, 14, 16, 14); + public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; - + public RespawnObeliskBlock() { - super(FabricBlockSettings.copyOf(Blocks.END_STONE).luminance((state) -> { + super(FabricBlockSettings.copyOf(Blocks.END_STONE).lightLevel((state) -> { return (state.getValue(SHAPE) == TripleShape.BOTTOM) ? 0 : 15; })); } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return (state.getValue(SHAPE) == TripleShape.BOTTOM) ? VOXEL_SHAPE_BOTTOM : VOXEL_SHAPE_MIDDLE_TOP; } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE); } - + @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { for (int i = 0; i < 3; i++) { - if (!world.getBlockState(pos.up(i)).getMaterial().isReplaceable()) { + if (!world.getBlockState(pos.above(i)).getMaterial().isReplaceable()) { return false; } } return true; } - + @Override - public void onPlaced(Level world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, - ItemStack itemStack) { + public void setPlacedBy(Level world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack itemStack) { state = this.defaultBlockState(); - BlocksHelper.setWithUpdate(world, pos, state.with(SHAPE, TripleShape.BOTTOM)); - BlocksHelper.setWithUpdate(world, pos.up(), state.with(SHAPE, TripleShape.MIDDLE)); - BlocksHelper.setWithUpdate(world, pos.up(2), state.with(SHAPE, TripleShape.TOP)); + BlocksHelper.setWithUpdate(world, pos, state.setValue(SHAPE, TripleShape.BOTTOM)); + BlocksHelper.setWithUpdate(world, pos.above(), state.setValue(SHAPE, TripleShape.MIDDLE)); + BlocksHelper.setWithUpdate(world, pos.above(2), state.setValue(SHAPE, TripleShape.TOP)); } - + @Override - public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, - BlockPos pos, BlockPos neighborPos) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { TripleShape shape = state.getValue(SHAPE); if (shape == TripleShape.BOTTOM) { - if (world.getBlockState(pos.up()).is(this)) { + if (world.getBlockState(pos.above()).is(this)) { return state; - } else { + } + else { return Blocks.AIR.defaultBlockState(); } - } else if (shape == TripleShape.MIDDLE) { - if (world.getBlockState(pos.up()).is(this) && world.getBlockState(pos.below()).is(this)) { + } + else if (shape == TripleShape.MIDDLE) { + if (world.getBlockState(pos.above()).is(this) && world.getBlockState(pos.below()).is(this)) { return state; - } else { + } + else { return Blocks.AIR.defaultBlockState(); } - } else { + } + else { if (world.getBlockState(pos.below()).is(this)) { return state; - } else { + } + else { return Blocks.AIR.defaultBlockState(); } } } - + @Override - public void onBreak(Level world, BlockPos pos, BlockState state, Player player) { + public void playerWillDestroy(Level world, BlockPos pos, BlockState state, Player player) { if (player.isCreative()) { TripleShape shape = state.getValue(SHAPE); if (shape == TripleShape.MIDDLE) { BlocksHelper.setWithUpdate(world, pos.below(), Blocks.AIR); - } else if (shape == TripleShape.TOP) { - BlocksHelper.setWithUpdate(world, pos.down(2), Blocks.AIR); + } + else if (shape == TripleShape.TOP) { + BlocksHelper.setWithUpdate(world, pos.below(2), Blocks.AIR); } } - super.onBreak(world, pos, state, player); + super.playerWillDestroy(world, pos, state, player); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { if (state.getValue(SHAPE) == TripleShape.BOTTOM) { return Lists.newArrayList(new ItemStack(this)); - } else { + } + else { return Lists.newArrayList(); } } @@ -138,12 +143,12 @@ public class RespawnObeliskBlock extends BlockBase implements IColorProvider, IR public ERenderLayer getRenderLayer() { return ERenderLayer.TRANSLUCENT; } - + @Override - public BlockColor getBlockProvider() { - return ((IColorProvider) EndBlocks.AURORA_CRYSTAL).getBlockProvider(); + public BlockColor getProvider() { + return ((IColorProvider) EndBlocks.AURORA_CRYSTAL).getProvider(); } - + @Override public ItemColor getItemProvider() { return (stack, tintIndex) -> { @@ -152,20 +157,20 @@ public class RespawnObeliskBlock extends BlockBase implements IColorProvider, IR } @Override - public ActionResult onUse(BlockState state, Level world, BlockPos pos, Player player, Hand hand, - BlockHitResult hit) { - ItemStack itemStack = player.getStackInHand(hand); + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + ItemStack itemStack = player.getItemInHand(hand); boolean canActivate = itemStack.getItem() == EndItems.AMBER_GEM && itemStack.getCount() > 5; - if (hand != Hand.MAIN_HAND || !canActivate) { + if (hand != InteractionHand.MAIN_HAND || !canActivate) { if (!world.isClientSide && !(itemStack.getItem() instanceof BlockItem) && !player.isCreative()) { ServerPlayer serverPlayerEntity = (ServerPlayer) player; - serverPlayerEntity.sendMessage(new TranslatableText("message.betterend.fail_spawn"), true); + serverPlayerEntity.displayClientMessage(new TranslatableComponent("message.betterend.fail_spawn"), true); } - return ActionResult.FAIL; - } else if (!world.isClientSide) { + return InteractionResult.FAIL; + } + else if (!world.isClientSide) { ServerPlayer serverPlayerEntity = (ServerPlayer) player; - serverPlayerEntity.setSpawnPoint(world.dimension(), pos, 0.0F, false, false); - serverPlayerEntity.sendMessage(new TranslatableText("message.betterend.set_spawn"), true); + serverPlayerEntity.setRespawnPosition(world.dimension(), pos, 0.0F, false, false); + serverPlayerEntity.displayClientMessage(new TranslatableComponent("message.betterend.set_spawn"), true); double px = pos.getX() + 0.5; double py = pos.getY() + 0.5; double pz = pos.getZ() + 0.5; @@ -176,21 +181,22 @@ public class RespawnObeliskBlock extends BlockBase implements IColorProvider, IR if (state.getValue(SHAPE) == TripleShape.BOTTOM) { py1 += 1; py2 += 2; - } else if (state.getValue(SHAPE) == TripleShape.MIDDLE) { + } + else if (state.getValue(SHAPE) == TripleShape.MIDDLE) { py1 += 0; py2 += 1; - } else { + } + else { py1 -= 2; } ((ServerLevel) world).sendParticles(particle, px, py1, pz, 20, 0.14, 0.5, 0.14, 0.1); ((ServerLevel) world).sendParticles(particle, px, py2, pz, 20, 0.14, 0.3, 0.14, 0.1); } - world.playLocalSound(null, px, py, py, SoundEvents.BLOCK_RESPAWN_ANCHOR_SET_SPAWN, SoundSource.BLOCKS, 1F, - 1F); - if (!player.isCreative()) { - itemStack.decrement(6); - } + world.playSound(null, px, py, py, SoundEvents.RESPAWN_ANCHOR_SET_SPAWN, SoundSource.BLOCKS, 1F, 1F); + if (!player.isCreative()) { + itemStack.shrink(6); + } } - return player.isCreative() ? ActionResult.PASS : ActionResult.success(world.isClientSide); + return player.isCreative() ? InteractionResult.PASS : InteractionResult.sidedSuccess(world.isClientSide); } } diff --git a/src/main/java/ru/betterend/blocks/RunedFlavolite.java b/src/main/java/ru/betterend/blocks/RunedFlavolite.java index d1f66d6a..9cefae39 100644 --- a/src/main/java/ru/betterend/blocks/RunedFlavolite.java +++ b/src/main/java/ru/betterend/blocks/RunedFlavolite.java @@ -2,10 +2,10 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.BooleanProperty; +import net.minecraft.world.level.block.state.properties.BooleanProperty; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; @@ -13,13 +13,12 @@ public class RunedFlavolite extends BlockBase { public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; public RunedFlavolite() { - super(FabricBlockSettings.copyOf(EndBlocks.FLAVOLITE.polished) - .resistance(Blocks.OBSIDIAN.getExplosionResistance()).luminance(state -> { - return state.getValue(ACTIVATED) ? 8 : 0; - })); - this.setDefaultState(stateManager.defaultBlockState().with(ACTIVATED, false)); + super(FabricBlockSettings.copyOf(EndBlocks.FLAVOLITE.polished).resistance(Blocks.OBSIDIAN.getExplosionResistance()).lightLevel(state -> { + return state.getValue(ACTIVATED) ? 8 : 0; + })); + this.registerDefaultState(stateDefinition.any().setValue(ACTIVATED, false)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(ACTIVATED); diff --git a/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java b/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java index 781fbdf6..0bbe5d06 100644 --- a/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java +++ b/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java @@ -1,24 +1,24 @@ package ru.betterend.blocks; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.core.BlockPos; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.basis.EndCropBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; public class ShadowBerryBlock extends EndCropBlock { - private static final VoxelShape SHAPE = Block.createCuboidShape(1, 0, 1, 15, 8, 15); - + private static final VoxelShape SHAPE = Block.box(1, 0, 1, 15, 8, 15); + public ShadowBerryBlock() { super(EndItems.SHADOW_BERRY_RAW, EndBlocks.SHADOW_GRASS); } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPE; } } diff --git a/src/main/java/ru/betterend/blocks/ShadowGrassBlock.java b/src/main/java/ru/betterend/blocks/ShadowGrassBlock.java index a9b1c26f..955c4688 100644 --- a/src/main/java/ru/betterend/blocks/ShadowGrassBlock.java +++ b/src/main/java/ru/betterend/blocks/ShadowGrassBlock.java @@ -4,10 +4,10 @@ import java.util.Random; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.MaterialColor; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.MaterialColor; import ru.betterend.registry.EndParticles; public class ShadowGrassBlock extends EndTerrainBlock { @@ -19,8 +19,7 @@ public class ShadowGrassBlock extends EndTerrainBlock { public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { super.animateTick(state, world, pos, random); if (random.nextInt(32) == 0) { - world.addParticle(EndParticles.BLACK_SPORE, (double) pos.getX() + random.nextDouble(), - (double) pos.getY() + 1.1D, (double) pos.getZ() + random.nextDouble(), 0.0D, 0.0D, 0.0D); + world.addParticle(EndParticles.BLACK_SPORE, (double) pos.getX() + random.nextDouble(), (double) pos.getY() + 1.1D, (double) pos.getZ() + random.nextDouble(), 0.0D, 0.0D, 0.0D); } } } diff --git a/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java b/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java index cc53adf6..ea66f3ca 100644 --- a/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java +++ b/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java @@ -4,31 +4,31 @@ import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.entity.ItemEntity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemPlacementContext; -import net.minecraft.world.item.ItemStack; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.sounds.SoundSource; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.DirectionProperty; -import net.minecraft.world.level.block.state.properties.IntegerProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.util.ActionResult; -import net.minecraft.util.BlockMirror; -import net.minecraft.world.level.block.Rotation; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; import net.minecraft.core.BlockPos; -import net.minecraft.world.phys.AABB; import net.minecraft.core.Direction; -import net.minecraft.util.math.Vec3d; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.entity.SilkMothEntity; import ru.betterend.registry.EndEntities; @@ -37,36 +37,35 @@ import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; public class SilkMothHiveBlock extends BlockBase { - public static final DirectionProperty FACING = Properties.HORIZONTAL_FACING; + public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; public static final IntegerProperty FULLNESS = BlockProperties.FULLNESS; - + public SilkMothHiveBlock() { - super(FabricBlockSettings.of(Material.WOOD).hardness(0.5F).resistance(0.1F).sounds(SoundType.WOOL).nonOpaque() - .ticksRandomly().breakByHand(true)); - this.setDefaultState(getDefaultState().with(FULLNESS, 0)); + super(FabricBlockSettings.of(Material.WOOD).breakByHand(true).hardness(0.5F).resistance(0.1F).sound(SoundType.WOOL).noOcclusion().randomTicks()); + this.registerDefaultState(defaultBlockState().setValue(FULLNESS, 0)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(FACING, FULLNESS); } - + @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - Direction dir = ctx.getPlayerFacing().getOpposite(); - return this.defaultBlockState().with(FACING, dir); + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + Direction dir = ctx.getHorizontalDirection().getOpposite(); + return this.defaultBlockState().setValue(FACING, dir); } - + @Override public BlockState rotate(BlockState state, Rotation rotation) { return BlocksHelper.rotateHorizontal(state, rotation, FACING); } @Override - public BlockState mirror(BlockState state, BlockMirror mirror) { + public BlockState mirror(BlockState state, Mirror mirror) { return BlocksHelper.mirrorHorizontal(state, mirror, FACING); } - + @Override public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { Direction dir = state.getValue(FACING); @@ -74,45 +73,42 @@ public class SilkMothHiveBlock extends BlockBase { if (!world.getBlockState(spawn).isAir()) { return; } - int count = world.getEntitiesByType(EndEntities.SILK_MOTH, new Box(pos).expand(16), (entity) -> { - return true; - }).size(); + int count = world.getEntities(EndEntities.SILK_MOTH, new AABB(pos).inflate(16), (entity) -> { return true; }).size(); if (count > 6) { return; } SilkMothEntity moth = new SilkMothEntity(EndEntities.SILK_MOTH, world); - moth.refreshPositionAndAngles(spawn.getX() + 0.5, spawn.getY() + 0.5, spawn.getZ() + 0.5, dir.asRotation(), 0); - moth.setVelocity(new Vec3d(dir.getOffsetX() * 0.4, 0, dir.getOffsetZ() * 0.4)); + 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); - world.spawnEntity(moth); - world.playLocalSound(null, pos, SoundEvents.BLOCK_BEEHIVE_EXIT, SoundSource.BLOCKS, 1, 1); + world.addFreshEntity(moth); + world.playSound(null, pos, SoundEvents.BEEHIVE_EXIT, SoundSource.BLOCKS, 1, 1); } - + @Override - public ActionResult onUse(BlockState state, Level world, BlockPos pos, Player player, Hand hand, - BlockHitResult hit) { - if (hand == Hand.MAIN_HAND) { - ItemStack stack = player.getMainHandStack(); - if (stack.getItem().isIn(FabricToolTags.SHEARS) && state.getValue(FULLNESS) == 3) { - BlocksHelper.setWithUpdate(world, pos, state.with(FULLNESS, 0)); + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + if (hand == InteractionHand.MAIN_HAND) { + ItemStack stack = player.getMainHandItem(); + if (stack.getItem().is(FabricToolTags.SHEARS) && state.getValue(FULLNESS) == 3) { + BlocksHelper.setWithUpdate(world, pos, state.setValue(FULLNESS, 0)); Direction dir = state.getValue(FACING); - double px = pos.getX() + dir.getOffsetX() + 0.5; - double py = pos.getY() + dir.getOffsetY() + 0.5; - double pz = pos.getZ() + dir.getOffsetZ() + 0.5; + double px = pos.getX() + dir.getStepX() + 0.5; + double py = pos.getY() + dir.getStepY() + 0.5; + double pz = pos.getZ() + dir.getStepZ() + 0.5; ItemStack drop = new ItemStack(EndItems.SILK_FIBER, MHelper.randRange(8, 16, world.getRandom())); ItemEntity entity = new ItemEntity(world, px, py, pz, drop); - world.spawnEntity(entity); + world.addFreshEntity(entity); if (world.getRandom().nextInt(4) == 0) { drop = new ItemStack(EndItems.SILK_MOTH_MATRIX); entity = new ItemEntity(world, px, py, pz, drop); - world.spawnEntity(entity); + world.addFreshEntity(entity); } if (!player.isCreative()) { - stack.setDamage(stack.getDamage() + 1); + stack.setDamageValue(stack.getDamageValue() + 1); } - return ActionResult.SUCCESS; + return InteractionResult.SUCCESS; } } - return ActionResult.FAIL; + return InteractionResult.FAIL; } } diff --git a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java index 281e7d2e..358d8cbc 100644 --- a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java +++ b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java @@ -6,39 +6,39 @@ import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.entity.ItemEntity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemPlacementContext; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.sounds.SoundSource; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.DirectionProperty; -import net.minecraft.world.level.block.state.properties.IntegerProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.tags.BlockTags; -import net.minecraft.util.ActionResult; -import net.minecraft.util.BlockMirror; -import net.minecraft.world.level.block.Rotation; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; import net.minecraft.core.BlockPos; -import net.minecraft.world.phys.AABB; import net.minecraft.core.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.client.render.ERenderLayer; import ru.betterend.entity.SilkMothEntity; @@ -50,24 +50,23 @@ import ru.betterend.util.MHelper; public class SilkMothNestBlock extends BlockBase implements IRenderTypeable { public static final BooleanProperty ACTIVE = BlockProperties.ACTIVE; - public static final DirectionProperty FACING = Properties.HORIZONTAL_FACING; + public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; public static final IntegerProperty FULLNESS = BlockProperties.FULLNESS; - private static final VoxelShape TOP = createCuboidShape(6, 0, 6, 10, 16, 10); - private static final VoxelShape BOTTOM = createCuboidShape(0, 0, 0, 16, 16, 16); - + private static final VoxelShape TOP = box(6, 0, 6, 10, 16, 10); + private static final VoxelShape BOTTOM = box(0, 0, 0, 16, 16, 16); + public SilkMothNestBlock() { - super(FabricBlockSettings.of(Material.WOOL).hardness(0.5F).resistance(0.1F).sounds(SoundType.WOOL).nonOpaque() - .ticksRandomly()); - this.setDefaultState(getDefaultState().with(ACTIVE, true).with(FULLNESS, 0)); + super(FabricBlockSettings.of(Material.WOOL).hardness(0.5F).resistance(0.1F).sound(SoundType.WOOL).noOcclusion().randomTicks()); + this.registerDefaultState(defaultBlockState().setValue(ACTIVE, true).setValue(FULLNESS, 0)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(ACTIVE, FACING, FULLNESS); } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return state.getValue(ACTIVE) ? BOTTOM : TOP; } @@ -75,54 +74,53 @@ public class SilkMothNestBlock extends BlockBase implements IRenderTypeable { public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - Direction dir = ctx.getPlayerFacing().getOpposite(); - return this.defaultBlockState().with(FACING, dir); + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + Direction dir = ctx.getHorizontalDirection().getOpposite(); + return this.defaultBlockState().setValue(FACING, dir); } - + @Override - public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, - BlockPos pos, BlockPos neighborPos) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { if (!state.getValue(ACTIVE)) { - if (sideCoversSmallSquare(world, pos.up(), Direction.DOWN) - || world.getBlockState(pos.up()).isIn(BlockTags.LEAVES)) { + if (canSupportCenter(world, pos.above(), Direction.DOWN) || world.getBlockState(pos.above()).is(BlockTags.LEAVES)) { return state; - } else { + } + else { return Blocks.AIR.defaultBlockState(); } } return state; } - + @Override public BlockState rotate(BlockState state, Rotation rotation) { return BlocksHelper.rotateHorizontal(state, rotation, FACING); } @Override - public BlockState mirror(BlockState state, BlockMirror mirror) { + public BlockState mirror(BlockState state, Mirror mirror) { return BlocksHelper.mirrorHorizontal(state, mirror, FACING); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { return state.getValue(ACTIVE) ? Collections.singletonList(new ItemStack(this)) : Collections.emptyList(); } - + @Override - public void onBreak(Level world, BlockPos pos, BlockState state, Player player) { + public void playerWillDestroy(Level world, BlockPos pos, BlockState state, Player player) { if (!state.getValue(ACTIVE) && player.isCreative()) { BlocksHelper.setWithUpdate(world, pos.below(), Blocks.AIR); } - BlockState up = world.getBlockState(pos.up()); - if (up.is(this) && !up.get(ACTIVE)) { - BlocksHelper.setWithUpdate(world, pos.up(), Blocks.AIR); + BlockState up = world.getBlockState(pos.above()); + if (up.is(this) && !up.getValue(ACTIVE)) { + BlocksHelper.setWithUpdate(world, pos.above(), Blocks.AIR); } - super.onBreak(world, pos, state, player); + super.playerWillDestroy(world, pos, state, player); } - + @Override public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { if (!state.getValue(ACTIVE)) { @@ -136,44 +134,40 @@ public class SilkMothNestBlock extends BlockBase implements IRenderTypeable { if (!world.getBlockState(spawn).isAir()) { return; } - int count = world.getEntitiesByType(EndEntities.SILK_MOTH, new Box(pos).expand(16), (entity) -> { - return true; - }).size(); + int count = world.getEntities(EndEntities.SILK_MOTH, new AABB(pos).inflate(16), (entity) -> { return true; }).size(); if (count > 6) { return; } SilkMothEntity moth = new SilkMothEntity(EndEntities.SILK_MOTH, world); - moth.refreshPositionAndAngles(spawn.getX() + 0.5, spawn.getY() + 0.5, spawn.getZ() + 0.5, dir.asRotation(), 0); - moth.setVelocity(new Vec3d(dir.getOffsetX() * 0.4, 0, dir.getOffsetZ() * 0.4)); + 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); - world.spawnEntity(moth); - world.playLocalSound(null, pos, SoundEvents.BLOCK_BEEHIVE_EXIT, SoundSource.BLOCKS, 1, 1); + world.addFreshEntity(moth); + world.playSound(null, pos, SoundEvents.BEEHIVE_EXIT, SoundSource.BLOCKS, 1, 1); } - + @Override - public ActionResult onUse(BlockState state, Level world, BlockPos pos, Player player, Hand hand, - BlockHitResult hit) { - if (hand == Hand.MAIN_HAND) { - ItemStack stack = player.getMainHandStack(); - if (stack.getItem().isIn(FabricToolTags.SHEARS) && state.getValue(ACTIVE) - && state.getValue(FULLNESS) == 3) { - BlocksHelper.setWithUpdate(world, pos, state.with(FULLNESS, 0)); + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + if (hand == InteractionHand.MAIN_HAND) { + ItemStack stack = player.getMainHandItem(); + if (stack.getItem().is(FabricToolTags.SHEARS) && state.getValue(ACTIVE) && state.getValue(FULLNESS) == 3) { + BlocksHelper.setWithUpdate(world, pos, state.setValue(FULLNESS, 0)); Direction dir = state.getValue(FACING); - double px = pos.getX() + dir.getOffsetX() + 0.5; - double py = pos.getY() + dir.getOffsetY() + 0.5; - double pz = pos.getZ() + dir.getOffsetZ() + 0.5; + double px = pos.getX() + dir.getStepX() + 0.5; + double py = pos.getY() + dir.getStepY() + 0.5; + double pz = pos.getZ() + dir.getStepZ() + 0.5; ItemStack drop = new ItemStack(EndItems.SILK_FIBER, MHelper.randRange(1, 4, world.getRandom())); ItemEntity entity = new ItemEntity(world, px, py, pz, drop); - world.spawnEntity(entity); + world.addFreshEntity(entity); drop = new ItemStack(EndItems.SILK_MOTH_MATRIX, MHelper.randRange(1, 3, world.getRandom())); entity = new ItemEntity(world, px, py, pz, drop); - world.spawnEntity(entity); + world.addFreshEntity(entity); if (!player.isCreative()) { - stack.setDamage(stack.getDamage() + 1); + stack.setDamageValue(stack.getDamageValue() + 1); } - return ActionResult.SUCCESS; + return InteractionResult.SUCCESS; } } - return ActionResult.FAIL; + return InteractionResult.FAIL; } } diff --git a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java index a3c23dfc..9bf881c3 100644 --- a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java +++ b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java @@ -1,33 +1,31 @@ package ru.betterend.blocks; import java.util.Random; - -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.server.level.ServerLevel; import net.minecraft.core.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.util.BlocksHelper; public class SmallAmaranitaBlock extends EndPlantBlock { - private static final VoxelShape SHAPE = Block.createCuboidShape(4, 0, 4, 12, 10, 12); - + private static final VoxelShape SHAPE = Block.box(4, 0, 4, 12, 10, 12); + @Override protected boolean isTerrain(BlockState state) { - return state.is(EndBlocks.SANGNUM) || state.is(EndBlocks.MOSSY_OBSIDIAN) - || state.is(EndBlocks.MOSSY_DRAGON_BONE); + return state.is(EndBlocks.SANGNUM) || state.is(EndBlocks.MOSSY_OBSIDIAN) || state.is(EndBlocks.MOSSY_DRAGON_BONE); } - + @Override - public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { BlockPos bigPos = growBig(world, pos); if (bigPos != null) { if (EndFeatures.GIGANTIC_AMARANITA.getFeature().place(world, null, random, bigPos, null)) { @@ -40,13 +38,13 @@ public class SmallAmaranitaBlock extends EndPlantBlock { } EndFeatures.LARGE_AMARANITA.getFeature().place(world, null, random, pos, null); } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - Vec3d vec3d = state.getModelOffset(view, pos); - return SHAPE.offset(vec3d.x, vec3d.y, vec3d.z); + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + Vec3 vec3d = state.getOffset(view, pos); + return SHAPE.move(vec3d.x, vec3d.y, vec3d.z); } - + private BlockPos growBig(ServerLevel world, BlockPos pos) { for (int x = -1; x < 2; x++) { for (int z = -1; z < 2; z++) { @@ -58,20 +56,22 @@ public class SmallAmaranitaBlock extends EndPlantBlock { } return null; } - + private boolean checkFrame(ServerLevel world, BlockPos pos) { - return world.getBlockState(pos).is(this) && world.getBlockState(pos.south()).is(this) - && world.getBlockState(pos.east()).is(this) && world.getBlockState(pos.south().east()).is(this); + return world.getBlockState(pos).is(this) && + world.getBlockState(pos.south()).is(this) && + world.getBlockState(pos.east()).is(this) && + world.getBlockState(pos.south().east()).is(this); } - + private void replaceMushroom(ServerLevel world, BlockPos pos) { if (world.getBlockState(pos).is(this)) { BlocksHelper.setWithUpdate(world, pos, Blocks.AIR); } } - + @Override - public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return random.nextInt(8) == 0; } } diff --git a/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java b/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java index 66213bb0..f9f6b212 100644 --- a/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java +++ b/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java @@ -9,26 +9,26 @@ import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.Fertilizable; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.item.enchantment.Enchantments; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.block.SoundType; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.BonemealableBlock; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.basis.AttachedBlock; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; @@ -36,64 +36,67 @@ import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; -public class SmallJellyshroomBlock extends AttachedBlock implements IRenderTypeable, Fertilizable { +public class SmallJellyshroomBlock extends AttachedBlock implements IRenderTypeable, BonemealableBlock { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); - + public SmallJellyshroomBlock() { - super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).sounds(SoundType.NETHER_WART) - .breakByHand(true).noCollision()); + super(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.NETHER_WART) + .noCollission()); } @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return BOUNDING_SHAPES.get(state.getValue(FACING)); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); - if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) - || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Lists.newArrayList(new ItemStack(this)); - } else { + } + else { return Lists.newArrayList(); } } - + @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { Direction direction = state.getValue(FACING); BlockPos blockPos = pos.relative(direction.getOpposite()); BlockState support = world.getBlockState(blockPos); - return sideCoversSmallSquare(world, blockPos, direction) && support.isOpaque() && support.getLuminance() == 0; + return canSupportCenter(world, blockPos, direction) && support.canOcclude() && support.getLightEmission() == 0; } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + static { - BOUNDING_SHAPES.put(Direction.UP, Block.createCuboidShape(3, 0, 3, 13, 16, 13)); - BOUNDING_SHAPES.put(Direction.DOWN, Block.createCuboidShape(3, 0, 3, 13, 16, 13)); - BOUNDING_SHAPES.put(Direction.NORTH, VoxelShapes.cuboid(0.0, 0.0, 0.5, 1.0, 1.0, 1.0)); - BOUNDING_SHAPES.put(Direction.SOUTH, VoxelShapes.cuboid(0.0, 0.0, 0.0, 1.0, 1.0, 0.5)); - BOUNDING_SHAPES.put(Direction.WEST, VoxelShapes.cuboid(0.5, 0.0, 0.0, 1.0, 1.0, 1.0)); - BOUNDING_SHAPES.put(Direction.EAST, VoxelShapes.cuboid(0.0, 0.0, 0.0, 0.5, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.UP, Block.box(3, 0, 3, 13, 16, 13)); + BOUNDING_SHAPES.put(Direction.DOWN, Block.box(3, 0, 3, 13, 16, 13)); + BOUNDING_SHAPES.put(Direction.NORTH, Shapes.box(0.0, 0.0, 0.5, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.SOUTH, Shapes.box(0.0, 0.0, 0.0, 1.0, 1.0, 0.5)); + BOUNDING_SHAPES.put(Direction.WEST, Shapes.box(0.5, 0.0, 0.0, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.EAST, Shapes.box(0.0, 0.0, 0.0, 0.5, 1.0, 1.0)); } @Override - public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { - return state.getValue(FACING) == Direction.UP && world.getBlockState(pos.below()).isIn(EndTags.END_GROUND); + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { + return state.getValue(FACING) == Direction.UP && world.getBlockState(pos.below()).is(EndTags.END_GROUND); } @Override - public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return random.nextInt(16) == 0; } @Override - public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { BlocksHelper.setWithUpdate(world, pos, Blocks.AIR); EndFeatures.JELLYSHROOM.getFeature().place(world, null, random, pos, null); } diff --git a/src/main/java/ru/betterend/blocks/SmaragdantCrystalBlock.java b/src/main/java/ru/betterend/blocks/SmaragdantCrystalBlock.java index cdd80120..6572cbf2 100644 --- a/src/main/java/ru/betterend/blocks/SmaragdantCrystalBlock.java +++ b/src/main/java/ru/betterend/blocks/SmaragdantCrystalBlock.java @@ -2,13 +2,18 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.material.Material; import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.material.Material; import ru.betterend.blocks.basis.EndPillarBlock; public class SmaragdantCrystalBlock extends EndPillarBlock { public SmaragdantCrystalBlock() { - super(FabricBlockSettings.of(Material.GLASS).breakByTool(FabricToolTags.PICKAXES).sounds(SoundType.GLASS) - .luminance(15).hardness(1F).resistance(1F).nonOpaque()); + super(FabricBlockSettings.of(Material.GLASS) + .breakByTool(FabricToolTags.PICKAXES) + .luminance(15) + .hardness(1F) + .resistance(1F) + .noOcclusion() + .sound(SoundType.GLASS)); } } diff --git a/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java b/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java index 3edebc7c..2e8626a8 100644 --- a/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java +++ b/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java @@ -6,99 +6,102 @@ import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.FluidFillable; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.material.MaterialColor; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.level.block.Waterloggable; -import net.minecraft.fluid.Fluid; -import net.minecraft.fluid.FluidState; -import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.item.ItemPlacementContext; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.Properties; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.LiquidBlockContainer; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.basis.AttachedBlock; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; -public class SmaragdantCrystalShardBlock extends AttachedBlock - implements IRenderTypeable, Waterloggable, FluidFillable { +public class SmaragdantCrystalShardBlock extends AttachedBlock implements IRenderTypeable, SimpleWaterloggedBlock, LiquidBlockContainer { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); - public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; - + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + public SmaragdantCrystalShardBlock() { - super(FabricBlockSettings.of(Material.STONE).materialColor(MaterialColor.COLOR_GREEN) - .breakByTool(FabricToolTags.PICKAXES).sounds(SoundType.GLASS).luminance(15).requiresTool() - .noCollision()); + super(FabricBlockSettings.of(Material.STONE) + .materialColor(MaterialColor.COLOR_GREEN) + .breakByTool(FabricToolTags.PICKAXES) + .luminance(15) + .sound(SoundType.GLASS) + .requiresCorrectToolForDrops() + .noCollission()); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { super.createBlockStateDefinition(stateManager); stateManager.add(WATERLOGGED); } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override - public boolean canFillWithFluid(BlockView world, BlockPos pos, BlockState state, Fluid fluid) { + public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { return !state.getValue(WATERLOGGED); } @Override - public boolean tryFillWithFluid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { + public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { return !state.getValue(WATERLOGGED); } - + @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - BlockState state = super.getPlacementState(ctx); + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + BlockState state = super.getStateForPlacement(ctx); if (state != null) { - WorldView worldView = ctx.getLevel(); - BlockPos blockPos = ctx.getBlockPos(); - boolean water = worldView.getFluidState(blockPos).getFluid() == Fluids.WATER; - return state.with(WATERLOGGED, water); + LevelReader worldView = ctx.getLevel(); + BlockPos blockPos = ctx.getClickedPos(); + boolean water = worldView.getFluidState(blockPos).getType() == Fluids.WATER; + return state.setValue(WATERLOGGED, water); } return null; } - + @Override public FluidState getFluidState(BlockState state) { - return state.getValue(WATERLOGGED) ? Fluids.WATER.getStill(false) : Fluids.EMPTY.defaultBlockState(); + return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : Fluids.EMPTY.defaultFluidState(); } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return BOUNDING_SHAPES.get(state.getValue(FACING)); } - + @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { Direction direction = (Direction) state.getValue(FACING); BlockPos blockPos = pos.relative(direction.getOpposite()); - return world.getBlockState(blockPos).isSideSolidFullSquare(world, blockPos, direction); + return world.getBlockState(blockPos).isFaceSturdy(world, blockPos, direction); } - + static { - BOUNDING_SHAPES.put(Direction.UP, VoxelShapes.cuboid(0.125, 0.0, 0.125, 0.875F, 0.875F, 0.875F)); - BOUNDING_SHAPES.put(Direction.DOWN, VoxelShapes.cuboid(0.125, 0.125, 0.125, 0.875F, 1.0, 0.875F)); - BOUNDING_SHAPES.put(Direction.NORTH, VoxelShapes.cuboid(0.125, 0.125, 0.125, 0.875F, 0.875F, 1.0)); - BOUNDING_SHAPES.put(Direction.SOUTH, VoxelShapes.cuboid(0.125, 0.125, 0.0, 0.875F, 0.875F, 0.875F)); - BOUNDING_SHAPES.put(Direction.WEST, VoxelShapes.cuboid(0.125, 0.125, 0.125, 1.0, 0.875F, 0.875F)); - BOUNDING_SHAPES.put(Direction.EAST, VoxelShapes.cuboid(0.0, 0.125, 0.125, 0.875F, 0.875F, 0.875F)); + BOUNDING_SHAPES.put(Direction.UP, Shapes.box(0.125, 0.0, 0.125, 0.875F, 0.875F, 0.875F)); + BOUNDING_SHAPES.put(Direction.DOWN, Shapes.box(0.125, 0.125, 0.125, 0.875F, 1.0, 0.875F)); + BOUNDING_SHAPES.put(Direction.NORTH, Shapes.box(0.125, 0.125, 0.125, 0.875F, 0.875F, 1.0)); + BOUNDING_SHAPES.put(Direction.SOUTH, Shapes.box(0.125, 0.125, 0.0, 0.875F, 0.875F, 0.875F)); + BOUNDING_SHAPES.put(Direction.WEST, Shapes.box(0.125, 0.125, 0.125, 1.0, 0.875F, 0.875F)); + BOUNDING_SHAPES.put(Direction.EAST, Shapes.box(0.0, 0.125, 0.125, 0.875F, 0.875F, 0.875F)); } } diff --git a/src/main/java/ru/betterend/blocks/SulphurCrystalBlock.java b/src/main/java/ru/betterend/blocks/SulphurCrystalBlock.java index ea73eb86..d0becc90 100644 --- a/src/main/java/ru/betterend/blocks/SulphurCrystalBlock.java +++ b/src/main/java/ru/betterend/blocks/SulphurCrystalBlock.java @@ -9,31 +9,31 @@ import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.FluidFillable; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.material.MaterialColor; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.level.block.Waterloggable; -import net.minecraft.fluid.Fluid; -import net.minecraft.fluid.FluidState; -import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.item.ItemPlacementContext; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.world.level.block.state.properties.IntegerProperty; -import net.minecraft.state.property.Properties; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.LiquidBlockContainer; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.basis.AttachedBlock; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; @@ -41,79 +41,81 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; import ru.betterend.util.MHelper; -public class SulphurCrystalBlock extends AttachedBlock implements IRenderTypeable, Waterloggable, FluidFillable { +public class SulphurCrystalBlock extends AttachedBlock implements IRenderTypeable, SimpleWaterloggedBlock, LiquidBlockContainer { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); - public static final IntegerProperty AGE = IntegerProperty.of("age", 0, 2); - public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; - + public static final IntegerProperty AGE = IntegerProperty.create("age", 0, 2); + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + public SulphurCrystalBlock() { - super(FabricBlockSettings.of(Material.STONE).materialColor(MaterialColor.COLOR_YELLOW) - .breakByTool(FabricToolTags.PICKAXES).sounds(SoundType.GLASS).requiresTool().noCollision()); + super(FabricBlockSettings.of(Material.STONE) + .materialColor(MaterialColor.COLOR_YELLOW) + .breakByTool(FabricToolTags.PICKAXES) + .sound(SoundType.GLASS) + .requiresCorrectToolForDrops() + .noCollission()); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { super.createBlockStateDefinition(stateManager); stateManager.add(AGE, WATERLOGGED); } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { - return state.getValue(AGE) < 2 ? Collections.emptyList() - : Lists.newArrayList( - new ItemStack(EndItems.CRYSTALLINE_SULPHUR, MHelper.randRange(1, 3, MHelper.RANDOM))); + return state.getValue(AGE) < 2 ? Collections.emptyList() : Lists.newArrayList(new ItemStack(EndItems.CRYSTALLINE_SULPHUR, MHelper.randRange(1, 3, MHelper.RANDOM))); } - + @Override - public boolean canFillWithFluid(BlockView world, BlockPos pos, BlockState state, Fluid fluid) { + public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { return !state.getValue(WATERLOGGED); } @Override - public boolean tryFillWithFluid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { + public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { return !state.getValue(WATERLOGGED); } - + @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - BlockState state = super.getPlacementState(ctx); + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + BlockState state = super.getStateForPlacement(ctx); if (state != null) { - WorldView worldView = ctx.getLevel(); - BlockPos blockPos = ctx.getBlockPos(); - boolean water = worldView.getFluidState(blockPos).getFluid() == Fluids.WATER; - return state.with(WATERLOGGED, water); + LevelReader worldView = ctx.getLevel(); + BlockPos blockPos = ctx.getClickedPos(); + boolean water = worldView.getFluidState(blockPos).getType() == Fluids.WATER; + return state.setValue(WATERLOGGED, water); } return null; } - + @Override public FluidState getFluidState(BlockState state) { - return state.getValue(WATERLOGGED) ? Fluids.WATER.getStill(false) : Fluids.EMPTY.defaultBlockState(); + return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : Fluids.EMPTY.defaultFluidState(); } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return BOUNDING_SHAPES.get(state.getValue(FACING)); } - + @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { Direction direction = (Direction) state.getValue(FACING); BlockPos blockPos = pos.relative(direction.getOpposite()); return world.getBlockState(blockPos).is(EndBlocks.BRIMSTONE); } - + static { - BOUNDING_SHAPES.put(Direction.UP, VoxelShapes.cuboid(0.125, 0.0, 0.125, 0.875F, 0.5, 0.875F)); - BOUNDING_SHAPES.put(Direction.DOWN, VoxelShapes.cuboid(0.125, 0.5, 0.125, 0.875F, 1.0, 0.875F)); - BOUNDING_SHAPES.put(Direction.NORTH, VoxelShapes.cuboid(0.125, 0.125, 0.5, 0.875F, 0.875F, 1.0)); - BOUNDING_SHAPES.put(Direction.SOUTH, VoxelShapes.cuboid(0.125, 0.125, 0.0, 0.875F, 0.875F, 0.5)); - BOUNDING_SHAPES.put(Direction.WEST, VoxelShapes.cuboid(0.5, 0.125, 0.125, 1.0, 0.875F, 0.875F)); - BOUNDING_SHAPES.put(Direction.EAST, VoxelShapes.cuboid(0.0, 0.125, 0.125, 0.5, 0.875F, 0.875F)); + BOUNDING_SHAPES.put(Direction.UP, Shapes.box(0.125, 0.0, 0.125, 0.875F, 0.5, 0.875F)); + BOUNDING_SHAPES.put(Direction.DOWN, Shapes.box(0.125, 0.5, 0.125, 0.875F, 1.0, 0.875F)); + BOUNDING_SHAPES.put(Direction.NORTH, Shapes.box(0.125, 0.125, 0.5, 0.875F, 0.875F, 1.0)); + BOUNDING_SHAPES.put(Direction.SOUTH, Shapes.box(0.125, 0.125, 0.0, 0.875F, 0.875F, 0.5)); + BOUNDING_SHAPES.put(Direction.WEST, Shapes.box(0.5, 0.125, 0.125, 1.0, 0.875F, 0.875F)); + BOUNDING_SHAPES.put(Direction.EAST, Shapes.box(0.0, 0.125, 0.125, 0.5, 0.875F, 0.875F)); } } diff --git a/src/main/java/ru/betterend/blocks/TenaneaFlowersBlock.java b/src/main/java/ru/betterend/blocks/TenaneaFlowersBlock.java index 4059ca38..82238857 100644 --- a/src/main/java/ru/betterend/blocks/TenaneaFlowersBlock.java +++ b/src/main/java/ru/betterend/blocks/TenaneaFlowersBlock.java @@ -4,14 +4,14 @@ import java.util.Random; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; import net.minecraft.core.BlockPos; -import net.minecraft.util.Mth; import net.minecraft.core.Vec3i; +import net.minecraft.util.Mth; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.basis.VineBlock; import ru.betterend.interfaces.IColorProvider; import ru.betterend.registry.EndParticles; @@ -19,13 +19,13 @@ import ru.betterend.util.MHelper; public class TenaneaFlowersBlock extends VineBlock implements IColorProvider { public static final Vec3i[] COLORS; - + public TenaneaFlowersBlock() { super(15); } @Override - public BlockColor getBlockProvider() { + public BlockColor getProvider() { return (state, world, pos, tintIndex) -> { long i = (MHelper.getRandom(pos.getX(), pos.getZ()) & 63) + pos.getY(); double delta = i * 0.1; @@ -33,15 +33,15 @@ public class TenaneaFlowersBlock extends VineBlock implements IColorProvider { int index2 = (index + 1) & 3; delta -= index; index &= 3; - + Vec3i color1 = COLORS[index]; Vec3i color2 = COLORS[index2]; - + int r = MHelper.floor(Mth.lerp(delta, color1.getX(), color2.getX())); int g = MHelper.floor(Mth.lerp(delta, color1.getY(), color2.getY())); int b = MHelper.floor(Mth.lerp(delta, color1.getZ(), color2.getZ())); float[] hsb = MHelper.fromRGBtoHSB(r, g, b); - + return MHelper.fromHSBtoRGB(hsb[0], MHelper.max(0.5F, hsb[1]), hsb[2]); }; } @@ -52,12 +52,12 @@ public class TenaneaFlowersBlock extends VineBlock implements IColorProvider { return MHelper.color(255, 255, 255); }; } - + @Override - public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { return false; } - + @Environment(EnvType.CLIENT) public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { super.animateTick(state, world, pos, random); @@ -68,9 +68,13 @@ public class TenaneaFlowersBlock extends VineBlock implements IColorProvider { world.addParticle(EndParticles.TENANEA_PETAL, x, y, z, 0, 0, 0); } } - + static { - COLORS = new Vec3i[] { new Vec3i(250, 111, 222), new Vec3i(167, 89, 255), new Vec3i(120, 207, 239), - new Vec3i(255, 87, 182) }; + COLORS = new Vec3i[] { + new Vec3i(250, 111, 222), + new Vec3i(167, 89, 255), + new Vec3i(120, 207, 239), + new Vec3i(255, 87, 182) + }; } } diff --git a/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java b/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java index 77b0de8a..c4e8393f 100644 --- a/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java @@ -1,8 +1,8 @@ package ru.betterend.blocks; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.blocks.basis.FeatureSaplingBlock; import ru.betterend.registry.EndBlocks; @@ -17,9 +17,9 @@ public class TenaneaSaplingBlock extends FeatureSaplingBlock { protected Feature getFeature() { return EndFeatures.LUCERNIA.getFeature(); } - + @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { return world.getBlockState(pos.below()).is(EndBlocks.RUTISCUS); } } diff --git a/src/main/java/ru/betterend/blocks/TerminiteBlock.java b/src/main/java/ru/betterend/blocks/TerminiteBlock.java index a7a1b6eb..19c031c3 100644 --- a/src/main/java/ru/betterend/blocks/TerminiteBlock.java +++ b/src/main/java/ru/betterend/blocks/TerminiteBlock.java @@ -1,14 +1,17 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.material.Material; import net.minecraft.world.level.material.MaterialColor; -import net.minecraft.world.level.block.SoundType; import ru.betterend.blocks.basis.BlockBase; public class TerminiteBlock extends BlockBase { public TerminiteBlock() { - super(FabricBlockSettings.of(Material.METAL, MaterialColor.field_25708).hardness(7F).resistance(9F) - .requiresTool().sounds(SoundType.METAL)); + super(FabricBlockSettings.of(Material.METAL, MaterialColor.WARPED_WART_BLOCK) + .hardness(7F) + .resistance(9F) + .requiresCorrectToolForDrops() + .sound(SoundType.METAL)); } } diff --git a/src/main/java/ru/betterend/blocks/TerrainPlantBlock.java b/src/main/java/ru/betterend/blocks/TerrainPlantBlock.java index 3f1ba358..090b3b15 100644 --- a/src/main/java/ru/betterend/blocks/TerrainPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/TerrainPlantBlock.java @@ -6,15 +6,15 @@ import ru.betterend.blocks.basis.EndPlantBlock; public class TerrainPlantBlock extends EndPlantBlock { private final Block[] ground; - + public TerrainPlantBlock(Block... ground) { super(true); this.ground = ground; } - + @Override protected boolean isTerrain(BlockState state) { - for (Block block : ground) { + for (Block block: ground) { if (state.is(block)) { return true; } diff --git a/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossBlock.java b/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossBlock.java index fe4d215e..08fe2dbf 100644 --- a/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossBlock.java +++ b/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossBlock.java @@ -4,11 +4,11 @@ import java.util.Random; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.server.level.ServerLevel; import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.basis.DoublePlantBlock; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; @@ -18,32 +18,32 @@ public class TwistedUmbrellaMossBlock extends EndPlantBlock { public TwistedUmbrellaMossBlock() { super(11); } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.END_MOSS) || state.is(EndBlocks.END_MYCELIUM) || state.is(EndBlocks.JUNGLE_MOSS); } - + @Environment(EnvType.CLIENT) - public boolean hasEmissiveLighting(BlockView world, BlockPos pos) { - return true; - } + public boolean hasEmissiveLighting(BlockGetter world, BlockPos pos) { + return true; + } - @Environment(EnvType.CLIENT) - public float getAmbientOcclusionLightLevel(BlockView world, BlockPos pos) { - return 1F; + @Environment(EnvType.CLIENT) + public float getAmbientOcclusionLightLevel(BlockGetter world, BlockPos pos) { + return 1F; + } + + @Override + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { + return world.isEmptyBlock(pos.above()); } - - @Override - public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { - return world.isAir(pos.up()); - } - - @Override - public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { - int rot = world.random.nextInt(4); - BlockState bs = EndBlocks.TWISTED_UMBRELLA_MOSS_TALL.defaultBlockState().with(DoublePlantBlock.ROTATION, rot); + + @Override + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { + int rot = world.random.nextInt(4); + BlockState bs = EndBlocks.TWISTED_UMBRELLA_MOSS_TALL.defaultBlockState().setValue(DoublePlantBlock.ROTATION, rot); BlocksHelper.setWithoutUpdate(world, pos, bs); - BlocksHelper.setWithoutUpdate(world, pos.up(), bs.with(DoublePlantBlock.TOP, true)); + BlocksHelper.setWithoutUpdate(world, pos.above(), bs.setValue(DoublePlantBlock.TOP, true)); } } diff --git a/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossTallBlock.java b/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossTallBlock.java index b344ba20..843aa4a3 100644 --- a/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossTallBlock.java +++ b/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossTallBlock.java @@ -1,12 +1,11 @@ package ru.betterend.blocks; import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.entity.ItemEntity; -import net.minecraft.world.item.ItemStack; -import net.minecraft.server.level.ServerLevel; import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.basis.DoublePlantBlock; import ru.betterend.registry.EndBlocks; @@ -14,14 +13,13 @@ public class TwistedUmbrellaMossTallBlock extends DoublePlantBlock { public TwistedUmbrellaMossTallBlock() { super(12); } - + @Override - public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { - ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, - new ItemStack(EndBlocks.TWISTED_UMBRELLA_MOSS)); - world.spawnEntity(item); + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { + ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(EndBlocks.TWISTED_UMBRELLA_MOSS)); + world.addFreshEntity(item); } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.END_MOSS) || state.is(EndBlocks.END_MYCELIUM) || state.is(EndBlocks.JUNGLE_MOSS); diff --git a/src/main/java/ru/betterend/blocks/UmbrellaMossBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaMossBlock.java index bef8a773..e9fb7790 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaMossBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaMossBlock.java @@ -4,11 +4,11 @@ import java.util.Random; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.server.level.ServerLevel; import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.basis.DoublePlantBlock; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; @@ -18,32 +18,32 @@ public class UmbrellaMossBlock extends EndPlantBlock { public UmbrellaMossBlock() { super(11); } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.END_MOSS) || state.is(EndBlocks.END_MYCELIUM) || state.is(EndBlocks.JUNGLE_MOSS); } - + @Environment(EnvType.CLIENT) - public boolean hasEmissiveLighting(BlockView world, BlockPos pos) { - return true; - } + public boolean hasEmissiveLighting(BlockGetter world, BlockPos pos) { + return true; + } - @Environment(EnvType.CLIENT) - public float getAmbientOcclusionLightLevel(BlockView world, BlockPos pos) { - return 1F; + @Environment(EnvType.CLIENT) + public float getAmbientOcclusionLightLevel(BlockGetter world, BlockPos pos) { + return 1F; + } + + @Override + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { + return world.isEmptyBlock(pos.above()); } - - @Override - public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { - return world.isAir(pos.up()); - } - - @Override - public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { - int rot = world.random.nextInt(4); - BlockState bs = EndBlocks.UMBRELLA_MOSS_TALL.defaultBlockState().with(DoublePlantBlock.ROTATION, rot); + + @Override + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { + int rot = world.random.nextInt(4); + BlockState bs = EndBlocks.UMBRELLA_MOSS_TALL.defaultBlockState().setValue(DoublePlantBlock.ROTATION, rot); BlocksHelper.setWithoutUpdate(world, pos, bs); - BlocksHelper.setWithoutUpdate(world, pos.up(), bs.with(DoublePlantBlock.TOP, true)); + BlocksHelper.setWithoutUpdate(world, pos.above(), bs.setValue(DoublePlantBlock.TOP, true)); } } diff --git a/src/main/java/ru/betterend/blocks/UmbrellaMossTallBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaMossTallBlock.java index 0ab0434c..7e15e99a 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaMossTallBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaMossTallBlock.java @@ -1,12 +1,11 @@ package ru.betterend.blocks; import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.entity.ItemEntity; -import net.minecraft.world.item.ItemStack; -import net.minecraft.server.level.ServerLevel; import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.basis.DoublePlantBlock; import ru.betterend.registry.EndBlocks; @@ -14,14 +13,13 @@ public class UmbrellaMossTallBlock extends DoublePlantBlock { public UmbrellaMossTallBlock() { super(12); } - + @Override - public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { - ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, - new ItemStack(EndBlocks.UMBRELLA_MOSS)); - world.spawnEntity(item); + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { + ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(EndBlocks.UMBRELLA_MOSS)); + world.addFreshEntity(item); } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.END_MOSS) || state.is(EndBlocks.END_MYCELIUM) || state.is(EndBlocks.JUNGLE_MOSS); diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java index d9d48e22..2565ca21 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java @@ -1,22 +1,22 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.sounds.SoundSource; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.phys.BlockHitResult; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; @@ -24,34 +24,32 @@ import ru.betterend.util.BlocksHelper; public class UmbrellaTreeClusterBlock extends BlockBase { public static final BooleanProperty NATURAL = BlockProperties.NATURAL; - + public UmbrellaTreeClusterBlock() { - super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK).materialColor(MaterialColor.COLOR_PURPLE) + super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK) + .materialColor(MaterialColor.COLOR_PURPLE) .luminance(15)); - setDefaultState(stateManager.defaultBlockState().with(NATURAL, false)); + registerDefaultState(stateDefinition.any().setValue(NATURAL, false)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(NATURAL); } - + @Override - public ActionResult onUse(BlockState state, Level world, BlockPos pos, Player player, Hand hand, - BlockHitResult hit) { - ItemStack stack = player.getMainHandStack(); + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + ItemStack stack = player.getMainHandItem(); if (stack.getItem() == Items.GLASS_BOTTLE) { if (!player.isCreative()) { - stack.decrement(1); + stack.shrink(1); } stack = new ItemStack(EndItems.UMBRELLA_CLUSTER_JUICE); - player.giveItemStack(stack); - world.playLocalSound(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, SoundEvents.ITEM_BOTTLE_FILL, - SoundSource.BLOCKS, 1, 1, false); - BlocksHelper.setWithUpdate(world, pos, - EndBlocks.UMBRELLA_TREE_CLUSTER_EMPTY.defaultBlockState().with(NATURAL, state.getValue(NATURAL))); - return ActionResult.SUCCESS; + player.addItem(stack); + world.playLocalSound(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, SoundEvents.BOTTLE_FILL, SoundSource.BLOCKS, 1, 1, false); + BlocksHelper.setWithUpdate(world, pos, EndBlocks.UMBRELLA_TREE_CLUSTER_EMPTY.defaultBlockState().setValue(NATURAL, state.getValue(NATURAL))); + return InteractionResult.SUCCESS; } - return ActionResult.FAIL; + return InteractionResult.FAIL; } } diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java index b4f1941a..a8805689 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java @@ -3,37 +3,37 @@ package ru.betterend.blocks; import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.MaterialColor; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.BooleanProperty; import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.MaterialColor; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; public class UmbrellaTreeClusterEmptyBlock extends BlockBase { public static final BooleanProperty NATURAL = BlockProperties.NATURAL; - + public UmbrellaTreeClusterEmptyBlock() { - super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK).materialColor(MaterialColor.COLOR_PURPLE) - .ticksRandomly()); - setDefaultState(stateManager.defaultBlockState().with(NATURAL, false)); + super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK) + .materialColor(MaterialColor.COLOR_PURPLE) + .randomTicks()); + registerDefaultState(stateDefinition.any().setValue(NATURAL, false)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(NATURAL); } - + @Override - public void scheduledTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + public void tick(BlockState state, ServerLevel world, BlockPos pos, Random random) { if (state.getValue(NATURAL) && random.nextInt(16) == 0) { - BlocksHelper.setWithUpdate(world, pos, - EndBlocks.UMBRELLA_TREE_CLUSTER.defaultBlockState().with(UmbrellaTreeClusterBlock.NATURAL, true)); + BlocksHelper.setWithUpdate(world, pos, EndBlocks.UMBRELLA_TREE_CLUSTER.defaultBlockState().setValue(UmbrellaTreeClusterBlock.NATURAL, true)); } } } diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java index 31844133..215bb8a2 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java @@ -9,20 +9,20 @@ 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.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.SlimeBlock; -import net.minecraft.world.item.ItemPlacementContext; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.world.level.block.state.properties.IntegerProperty; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SlimeBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.noise.OpenSimplexNoise; @@ -34,66 +34,67 @@ import ru.betterend.util.MHelper; public class UmbrellaTreeMembraneBlock extends SlimeBlock implements IRenderTypeable, BlockPatterned { public static final IntegerProperty COLOR = BlockProperties.COLOR; private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); - + public UmbrellaTreeMembraneBlock() { super(FabricBlockSettings.copyOf(Blocks.SLIME_BLOCK)); } - + @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - double px = ctx.getBlockPos().getX() * 0.1; - double py = ctx.getBlockPos().getY() * 0.1; - double pz = ctx.getBlockPos().getZ() * 0.1; - return this.defaultBlockState().with(COLOR, MHelper.floor(NOISE.eval(px, py, pz) * 3.5 + 4)); + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + double px = ctx.getClickedPos().getX() * 0.1; + double py = ctx.getClickedPos().getY() * 0.1; + double pz = ctx.getClickedPos().getZ() * 0.1; + return this.defaultBlockState().setValue(COLOR, MHelper.floor(NOISE.eval(px, py, pz) * 3.5 + 4)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(COLOR); } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.TRANSLUCENT; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { if (state.getValue(COLOR) > 0) { return Lists.newArrayList(new ItemStack(this)); - } else { - return MHelper.RANDOM.nextInt(4) == 0 ? Lists.newArrayList(new ItemStack(EndBlocks.UMBRELLA_TREE_SAPLING)) - : Collections.emptyList(); + } + else { + return MHelper.RANDOM.nextInt(4) == 0 ? Lists.newArrayList(new ItemStack(EndBlocks.UMBRELLA_TREE_SAPLING)) : Collections.emptyList(); } } - + @Override public String getStatesPattern(Reader data) { String block = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, block, block); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(Patterns.BLOCK_BASE, blockId.getPath(), block); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_SIMPLE; } @Override - public boolean isTranslucent(BlockState state, BlockView world, BlockPos pos) { + public boolean propagatesSkylightDown(BlockState state, BlockGetter world, BlockPos pos) { return state.getValue(COLOR) > 0; } - + @Environment(EnvType.CLIENT) - public boolean isSideInvisible(BlockState state, BlockState stateFrom, Direction direction) { + public boolean skipRendering(BlockState state, BlockState stateFrom, Direction direction) { if (state.getValue(COLOR) > 0) { - return super.isSideInvisible(state, stateFrom, direction); - } else { + return super.skipRendering(state, stateFrom, direction); + } + else { return false; } } diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java index 47608d81..cc01c356 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java @@ -1,8 +1,8 @@ package ru.betterend.blocks; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.blocks.basis.FeatureSaplingBlock; import ru.betterend.client.render.ERenderLayer; @@ -18,12 +18,12 @@ public class UmbrellaTreeSaplingBlock extends FeatureSaplingBlock { protected Feature getFeature() { return EndFeatures.UMBRELLA_TREE.getFeature(); } - + @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { return world.getBlockState(pos.below()).is(EndBlocks.JUNGLE_MOSS); } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.TRANSLUCENT; diff --git a/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java b/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java index 8664b136..e01729ef 100644 --- a/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java +++ b/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java @@ -5,70 +5,70 @@ import java.util.Random; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.BlockRenderType; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.FluidDrainable; -import net.minecraft.world.level.block.FluidFillable; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.entity.Entity; -import net.minecraft.fluid.Fluid; -import net.minecraft.fluid.FluidState; -import net.minecraft.world.level.material.Fluids; -import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.sounds.SoundSource; -import net.minecraft.sounds.SoundEvents; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.Entity; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.BucketPickup; +import net.minecraft.world.level.block.LiquidBlockContainer; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; -public class VentBubbleColumnBlock extends Block implements FluidDrainable, FluidFillable { +public class VentBubbleColumnBlock extends Block implements BucketPickup, LiquidBlockContainer { public VentBubbleColumnBlock() { - super(FabricBlockSettings.of(Material.BUBBLE_COLUMN).nonOpaque().noCollision().dropsNothing()); + super(FabricBlockSettings.of(Material.BUBBLE_COLUMN).noOcclusion().noCollission().noDrops()); } @Override - public Fluid tryDrainFluid(LevelAccessor world, BlockPos pos, BlockState state) { - world.setBlockAndUpdate(pos, Blocks.AIR.defaultBlockState(), 11); + public Fluid takeLiquid(LevelAccessor world, BlockPos pos, BlockState state) { + world.setBlock(pos, Blocks.AIR.defaultBlockState(), 11); return Fluids.WATER; } - + @Override - public BlockRenderType getRenderType(BlockState state) { - return BlockRenderType.INVISIBLE; + public RenderShape getRenderShape(BlockState state) { + return RenderShape.INVISIBLE; } @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { BlockState blockState = world.getBlockState(pos.below()); return blockState.is(this) || blockState.is(EndBlocks.HYDROTHERMAL_VENT); } @Override - public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { - return VoxelShapes.empty(); + public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { + return Shapes.empty(); } @Override - public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, - BlockPos pos, BlockPos posFrom) { - if (!state.canPlaceAt(world, pos)) { + public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { + if (!state.canSurvive(world, pos)) { return Blocks.WATER.defaultBlockState(); - } else { - BlockPos up = pos.up(); + } + else { + BlockPos up = pos.above(); if (world.getBlockState(up).is(Blocks.WATER)) { BlocksHelper.setWithoutUpdate(world, up, this); - world.getBlockTickScheduler().schedule(up, this, 5); + world.getBlockTicks().scheduleTick(up, this, 5); } } return state; @@ -80,48 +80,44 @@ public class VentBubbleColumnBlock extends Block implements FluidDrainable, Flui double px = pos.getX() + random.nextDouble(); double py = pos.getY() + random.nextDouble(); double pz = pos.getZ() + random.nextDouble(); - world.addImportantParticle(ParticleTypes.BUBBLE_COLUMN_UP, px, py, pz, 0, 0.04, 0); + world.addAlwaysVisibleParticle(ParticleTypes.BUBBLE_COLUMN_UP, px, py, pz, 0, 0.04, 0); } if (random.nextInt(200) == 0) { - world.playLocalSound(pos.getX(), pos.getY(), pos.getZ(), SoundEvents.BLOCK_BUBBLE_COLUMN_UPWARDS_AMBIENT, - SoundSource.BLOCKS, 0.2F + random.nextFloat() * 0.2F, 0.9F + random.nextFloat() * 0.15F, false); + world.playLocalSound(pos.getX(), pos.getY(), pos.getZ(), SoundEvents.BUBBLE_COLUMN_UPWARDS_AMBIENT, SoundSource.BLOCKS, 0.2F + random.nextFloat() * 0.2F, 0.9F + random.nextFloat() * 0.15F, false); } } @Environment(EnvType.CLIENT) public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { - BlockState blockState = world.getBlockState(pos.up()); + BlockState blockState = world.getBlockState(pos.above()); if (blockState.isAir()) { - entity.onBubbleColumnSurfaceCollision(false); + entity.onAboveBubbleCol(false); if (!world.isClientSide) { ServerLevel serverWorld = (ServerLevel) world; for (int i = 0; i < 2; ++i) { - serverWorld.sendParticles(ParticleTypes.SPLASH, (double) pos.getX() + world.random.nextDouble(), - (double) (pos.getY() + 1), (double) pos.getZ() + world.random.nextDouble(), 1, 0.0D, 0.0D, - 0.0D, 1.0D); - serverWorld.sendParticles(ParticleTypes.BUBBLE, (double) pos.getX() + world.random.nextDouble(), - (double) (pos.getY() + 1), (double) pos.getZ() + world.random.nextDouble(), 1, 0.0D, 0.01D, - 0.0D, 0.2D); + serverWorld.sendParticles(ParticleTypes.SPLASH, (double) pos.getX() + world.random.nextDouble(), (double) (pos.getY() + 1), (double) pos.getZ() + world.random.nextDouble(), 1, 0.0D, 0.0D, 0.0D, 1.0D); + serverWorld.sendParticles(ParticleTypes.BUBBLE, (double) pos.getX() + world.random.nextDouble(), (double) (pos.getY() + 1), (double) pos.getZ() + world.random.nextDouble(), 1, 0.0D, 0.01D, 0.0D, 0.2D); } } - } else { - entity.onBubbleColumnCollision(false); + } + else { + entity.onInsideBubbleColumn(false); } } - + @Override - public boolean canFillWithFluid(BlockView world, BlockPos pos, BlockState state, Fluid fluid) { + public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { return false; } @Override - public boolean tryFillWithFluid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { + public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { return false; } - + @Override public FluidState getFluidState(BlockState state) { - return Fluids.WATER.getStill(false); + return Fluids.WATER.getSource(false); } } diff --git a/src/main/java/ru/betterend/blocks/basis/AttachedBlock.java b/src/main/java/ru/betterend/blocks/basis/AttachedBlock.java index 64f1f99a..474859ff 100644 --- a/src/main/java/ru/betterend/blocks/basis/AttachedBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/AttachedBlock.java @@ -1,45 +1,45 @@ package ru.betterend.blocks.basis; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.item.ItemPlacementContext; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.DirectionProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.tags.BlockTags; -import net.minecraft.util.BlockMirror; -import net.minecraft.world.level.block.Rotation; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.DirectionProperty; import ru.betterend.util.BlocksHelper; public abstract class AttachedBlock extends BlockBaseNotFull { - public static final DirectionProperty FACING = Properties.FACING; - - public AttachedBlock(net.minecraft.world.level.block.state.BlockBehaviour.Properties settings) { + public static final DirectionProperty FACING = BlockStateProperties.FACING; + + public AttachedBlock(Properties settings) { super(settings); - this.setDefaultState(this.defaultBlockState().with(FACING, Direction.UP)); + this.registerDefaultState(this.defaultBlockState().setValue(FACING, Direction.UP)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(FACING); } - + @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { + public BlockState getStateForPlacement(BlockPlaceContext ctx) { BlockState blockState = this.defaultBlockState(); - WorldView worldView = ctx.getLevel(); - BlockPos blockPos = ctx.getBlockPos(); - Direction[] directions = ctx.getPlacementDirections(); + LevelReader worldView = ctx.getLevel(); + BlockPos blockPos = ctx.getClickedPos(); + Direction[] directions = ctx.getNearestLookingDirections(); for (int i = 0; i < directions.length; ++i) { Direction direction = directions[i]; Direction direction2 = direction.getOpposite(); - blockState = (BlockState) blockState.with(FACING, direction2); - if (blockState.canPlaceAt(worldView, blockPos)) { + blockState = (BlockState) blockState.setValue(FACING, direction2); + if (blockState.canSurvive(worldView, blockPos)) { return blockState; } } @@ -47,30 +47,30 @@ public abstract class AttachedBlock extends BlockBaseNotFull { } @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { Direction direction = (Direction) state.getValue(FACING); BlockPos blockPos = pos.relative(direction.getOpposite()); - return sideCoversSmallSquare(world, blockPos, direction) - || world.getBlockState(blockPos).isIn(BlockTags.LEAVES); + return canSupportCenter(world, blockPos, direction) || world.getBlockState(blockPos).is(BlockTags.LEAVES); } @Override - public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, - BlockPos pos, BlockPos neighborPos) { - if (!canPlaceAt(state, world, pos)) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) { return Blocks.AIR.defaultBlockState(); - } else { + } + else { return state; } } + @Override public BlockState rotate(BlockState state, Rotation rotation) { return BlocksHelper.rotateHorizontal(state, rotation, FACING); } @Override - public BlockState mirror(BlockState state, BlockMirror mirror) { + public BlockState mirror(BlockState state, Mirror mirror) { return BlocksHelper.mirrorHorizontal(state, mirror, FACING); } } diff --git a/src/main/java/ru/betterend/blocks/basis/BarkBlock.java b/src/main/java/ru/betterend/blocks/basis/BarkBlock.java index 36b39146..1b82913c 100644 --- a/src/main/java/ru/betterend/blocks/basis/BarkBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/BarkBlock.java @@ -1,28 +1,27 @@ package ru.betterend.blocks.basis; import java.io.Reader; - -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; import ru.betterend.patterns.Patterns; public class BarkBlock extends EndPillarBlock { public BarkBlock(Properties settings) { super(settings); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(Patterns.BLOCK_BASE, getName(blockId), blockId.getPath()); } - + @Override public String getStatesPattern(Reader data) { ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(data, getName(blockId), blockId.getPath()); } - + private String getName(ResourceLocation blockId) { String name = blockId.getPath(); return name.replace("_bark", "_log_side"); diff --git a/src/main/java/ru/betterend/blocks/basis/BaseBlockWithEntity.java b/src/main/java/ru/betterend/blocks/basis/BaseBlockWithEntity.java index 9f4ead5f..f8a8b656 100644 --- a/src/main/java/ru/betterend/blocks/basis/BaseBlockWithEntity.java +++ b/src/main/java/ru/betterend/blocks/basis/BaseBlockWithEntity.java @@ -2,24 +2,23 @@ package ru.betterend.blocks.basis; import java.util.Collections; import java.util.List; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.BlockWithEntity; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.BaseEntityBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; -public class BaseBlockWithEntity extends BlockWithEntity { +public class BaseBlockWithEntity extends BaseEntityBlock { public BaseBlockWithEntity(Properties settings) { super(settings); } @Override - public BlockEntity createBlockEntity(BlockView world) { + public BlockEntity newBlockEntity(BlockGetter world) { return null; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); diff --git a/src/main/java/ru/betterend/blocks/basis/BlockBase.java b/src/main/java/ru/betterend/blocks/basis/BlockBase.java index 04dddbf3..05f59723 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockBase.java +++ b/src/main/java/ru/betterend/blocks/basis/BlockBase.java @@ -3,10 +3,9 @@ package ru.betterend.blocks.basis; import java.io.Reader; import java.util.Collections; import java.util.List; - import net.minecraft.core.Registry; -import net.minecraft.world.item.ItemStack; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.storage.loot.LootContext; @@ -17,24 +16,24 @@ public class BlockBase extends Block implements BlockPatterned { public BlockBase(Properties settings) { super(settings); } - + @Override - public List getDrops(BlockState blockState, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { String block = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, block, block); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(Patterns.BLOCK_BASE, blockId.getPath(), block); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_SIMPLE; diff --git a/src/main/java/ru/betterend/blocks/basis/BlockBaseNotFull.java b/src/main/java/ru/betterend/blocks/basis/BlockBaseNotFull.java index 34d51d6f..754b09b0 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockBaseNotFull.java +++ b/src/main/java/ru/betterend/blocks/basis/BlockBaseNotFull.java @@ -1,9 +1,9 @@ package ru.betterend.blocks.basis; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.entity.EntityType; import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.state.BlockState; public class BlockBaseNotFull extends BlockBase { @@ -11,15 +11,15 @@ public class BlockBaseNotFull extends BlockBase { super(settings); } - public boolean canSuffocate(BlockState state, BlockView view, BlockPos pos) { + public boolean canSuffocate(BlockState state, BlockGetter view, BlockPos pos) { return false; } - public boolean isSimpleFullBlock(BlockState state, BlockView view, BlockPos pos) { + public boolean isSimpleFullBlock(BlockState state, BlockGetter view, BlockPos pos) { return false; } - public boolean allowsSpawning(BlockState state, BlockView view, BlockPos pos, EntityType type) { + public boolean allowsSpawning(BlockState state, BlockGetter view, BlockPos pos, EntityType type) { return false; } } diff --git a/src/main/java/ru/betterend/blocks/basis/DoublePlantBlock.java b/src/main/java/ru/betterend/blocks/basis/DoublePlantBlock.java index a997b782..a1c09b06 100644 --- a/src/main/java/ru/betterend/blocks/basis/DoublePlantBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/DoublePlantBlock.java @@ -7,143 +7,147 @@ import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.AbstractBlock; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.Fertilizable; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.item.enchantment.Enchantments; -import net.minecraft.world.entity.ItemEntity; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.world.level.block.state.properties.IntegerProperty; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.BonemealableBlock; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.BlockProperties; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; -public class DoublePlantBlock extends BlockBaseNotFull implements IRenderTypeable, Fertilizable { - private static final VoxelShape SHAPE = Block.createCuboidShape(4, 2, 4, 12, 16, 12); +public class DoublePlantBlock extends BlockBaseNotFull implements IRenderTypeable, BonemealableBlock { + private static final VoxelShape SHAPE = Block.box(4, 2, 4, 12, 16, 12); public static final IntegerProperty ROTATION = BlockProperties.ROTATION; - public static final BooleanProperty TOP = BooleanProperty.of("top"); - + public static final BooleanProperty TOP = BooleanProperty.create("top"); + public DoublePlantBlock() { - super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).sounds(SoundType.WET_GRASS) - .breakByHand(true).noCollision()); - this.setDefaultState(this.stateManager.defaultBlockState().with(TOP, false)); + super(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.WET_GRASS) + .noCollission()); + this.registerDefaultState(this.stateDefinition.any().setValue(TOP, false)); } - + public DoublePlantBlock(int light) { - super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).sounds(SoundType.WET_GRASS) - .luminance((state) -> { - return state.getValue(TOP) ? light : 0; - }).breakByHand(true).noCollision()); - this.setDefaultState(this.stateManager.defaultBlockState().with(TOP, false)); + super(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.WET_GRASS) + .lightLevel((state) -> state.getValue(TOP) ? light : 0) + .noCollission()); + this.registerDefaultState(this.stateDefinition.any().setValue(TOP, false)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(TOP, ROTATION); } @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - Vec3d vec3d = state.getModelOffset(view, pos); - return SHAPE.offset(vec3d.x, vec3d.y, vec3d.z); + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + Vec3 vec3d = state.getOffset(view, pos); + return SHAPE.move(vec3d.x, vec3d.y, vec3d.z); } @Override - public AbstractBlock.OffsetType getOffsetType() { - return AbstractBlock.OffsetType.XZ; + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.XZ; } @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { BlockState down = world.getBlockState(pos.below()); - BlockState up = world.getBlockState(pos.up()); + BlockState up = world.getBlockState(pos.above()); return state.getValue(TOP) ? down.getBlock() == this : isTerrain(down) && (up.getMaterial().isReplaceable()); } - - public boolean canStayAt(BlockState state, WorldView world, BlockPos pos) { + + public boolean canStayAt(BlockState state, LevelReader world, BlockPos pos) { BlockState down = world.getBlockState(pos.below()); - BlockState up = world.getBlockState(pos.up()); + BlockState up = world.getBlockState(pos.above()); return state.getValue(TOP) ? down.getBlock() == this : isTerrain(down) && (up.getBlock() == this); } protected boolean isTerrain(BlockState state) { - return state.isIn(EndTags.END_GROUND); + return state.is(EndTags.END_GROUND); } - + @Override - public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, - BlockPos pos, BlockPos neighborPos) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { if (!canStayAt(state, world, pos)) { return Blocks.AIR.defaultBlockState(); - } else { + } + else { return state; } } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { if (state.getValue(TOP)) { return Lists.newArrayList(); } - + ItemStack tool = builder.getParameter(LootContextParams.TOOL); - if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) - || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Lists.newArrayList(new ItemStack(this)); - } else { + } + else { return Lists.newArrayList(); } } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } @Override - public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { return true; } @Override - public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return true; } @Override - public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { - ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, - new ItemStack(this)); - world.spawnEntity(item); + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { + ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(this)); + world.addFreshEntity(item); } - + @Override - public void onPlaced(Level world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { + public void setPlacedBy(Level world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { int rot = world.random.nextInt(4); - BlockState bs = this.defaultBlockState().with(ROTATION, rot); + BlockState bs = this.defaultBlockState().setValue(ROTATION, rot); BlocksHelper.setWithoutUpdate(world, pos, bs); - BlocksHelper.setWithoutUpdate(world, pos.up(), bs.with(TOP, true)); + BlocksHelper.setWithoutUpdate(world, pos.above(), bs.setValue(TOP, true)); } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java index b45bca97..2cc44850 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java @@ -8,17 +8,17 @@ import java.util.Map; import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.AnvilBlock; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.material.MaterialColor; -import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.IntegerProperty; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.Registry; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.blocks.BlockProperties; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; @@ -26,37 +26,37 @@ import ru.betterend.patterns.Patterns; public class EndAnvilBlock extends AnvilBlock implements BlockPatterned { private static final IntegerProperty DESTRUCTION = BlockProperties.DESTRUCTION; protected final int level; - + public EndAnvilBlock(MaterialColor color, int level) { super(FabricBlockSettings.copyOf(Blocks.ANVIL).materialColor(color)); this.level = level; } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { super.createBlockStateDefinition(builder); builder.add(DESTRUCTION); } - public IntegerProperty getDESTRUCTION() { + public IntegerProperty getDestructionProperty() { return DESTRUCTION; } public int getCraftingLevel() { return level; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(this); @@ -73,7 +73,7 @@ public class EndAnvilBlock extends AnvilBlock implements BlockPatterned { char last = block.charAt(block.length() - 1); return blockId.getPath() + "_top_" + last; } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_ANVIL; diff --git a/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java b/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java index 6c00c5b5..96e02235 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java @@ -5,26 +5,26 @@ import java.util.List; import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.BarrelBlock; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.BlockRenderType; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.mob.PiglinBrain; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.stat.Stats; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.hit.BlockHitResult; import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.stats.Stats; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.monster.piglin.PiglinAi; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BarrelBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.phys.BlockHitResult; import ru.betterend.blocks.entities.EBarrelBlockEntity; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; @@ -32,12 +32,12 @@ import ru.betterend.registry.EndBlockEntities; public class EndBarrelBlock extends BarrelBlock implements BlockPatterned { public EndBarrelBlock(Block source) { - super(FabricBlockSettings.copyOf(source).nonOpaque()); + super(FabricBlockSettings.copyOf(source).noOcclusion()); } @Override - public BlockEntity createBlockEntity(BlockView world) { - return EndBlockEntities.BARREL.instantiate(); + public BlockEntity newBlockEntity(BlockGetter world) { + return EndBlockEntities.BARREL.create(); } @Override @@ -48,24 +48,24 @@ public class EndBarrelBlock extends BarrelBlock implements BlockPatterned { } @Override - public ActionResult onUse(BlockState state, Level world, BlockPos pos, Player player, Hand hand, + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { if (world.isClientSide) { - return ActionResult.SUCCESS; + return InteractionResult.SUCCESS; } else { BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof EBarrelBlockEntity) { - player.openHandledScreen((EBarrelBlockEntity) blockEntity); - player.incrementStat(Stats.OPEN_BARREL); - PiglinBrain.onGuardedBlockInteracted(player, true); + player.openMenu((EBarrelBlockEntity) blockEntity); + player.awardStat(Stats.OPEN_BARREL); + PiglinAi.angerNearbyPiglins(player, true); } - return ActionResult.CONSUME; + return InteractionResult.CONSUME; } } @Override - public void scheduledTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + public void tick(BlockState state, ServerLevel world, BlockPos pos, Random random) { BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof EBarrelBlockEntity) { ((EBarrelBlockEntity) blockEntity).tick(); @@ -73,26 +73,27 @@ public class EndBarrelBlock extends BarrelBlock implements BlockPatterned { } @Override - public BlockRenderType getRenderType(BlockState state) { - return BlockRenderType.MODEL; + public RenderShape getRenderShape(BlockState state) { + return RenderShape.MODEL; } @Override - public void onPlaced(Level world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { - if (itemStack.hasCustomName()) { + public void setPlacedBy(Level world, BlockPos pos, BlockState state, LivingEntity placer, + ItemStack itemStack) { + if (itemStack.hasCustomHoverName()) { BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof EBarrelBlockEntity) { - ((EBarrelBlockEntity) blockEntity).setCustomName(itemStack.getName()); + ((EBarrelBlockEntity) blockEntity).setCustomName(itemStack.getHoverName()); } } } - + @Override public String getStatesPattern(Reader data) { String block = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, block, block); } - + @Override public String getModelPattern(String block) { String texture = Registry.BLOCK.getKey(this).getPath(); @@ -101,7 +102,7 @@ public class EndBarrelBlock extends BarrelBlock implements BlockPatterned { } return Patterns.createJson(Patterns.BLOCK_BOTTOM_TOP, texture, texture); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_BARREL; diff --git a/src/main/java/ru/betterend/blocks/basis/EndBlockStripableLogLog.java b/src/main/java/ru/betterend/blocks/basis/EndBlockStripableLogLog.java index d7a62f60..99d73b01 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndBlockStripableLogLog.java +++ b/src/main/java/ru/betterend/blocks/basis/EndBlockStripableLogLog.java @@ -2,42 +2,40 @@ package ru.betterend.blocks.basis; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.RotatedPillarBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.MaterialColor; -import net.minecraft.world.level.block.RotatedPillarBlock; -import net.minecraft.world.entity.player.Player; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.sounds.SoundSource; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; public class EndBlockStripableLogLog extends EndPillarBlock { private final Block striped; - + public EndBlockStripableLogLog(MaterialColor color, Block striped) { super(FabricBlockSettings.copyOf(striped).materialColor(color)); this.striped = striped; } - + @Override - public ActionResult onUse(BlockState state, Level world, BlockPos pos, Player player, Hand hand, - BlockHitResult hit) { - if (player.getMainHandStack().getItem().isIn(FabricToolTags.AXES)) { - world.playLocalSound(player, pos, SoundEvents.ITEM_AXE_STRIP, SoundSource.BLOCKS, 1.0F, 1.0F); + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + if (player.getMainHandItem().getItem().is(FabricToolTags.AXES)) { + world.playSound(player, pos, SoundEvents.AXE_STRIP, SoundSource.BLOCKS, 1.0F, 1.0F); if (!world.isClientSide) { - world.setBlockAndUpdate(pos, striped.defaultBlockState().with(RotatedPillarBlock.AXIS, - state.getValue(RotatedPillarBlock.AXIS)), 11); + world.setBlock(pos, striped.defaultBlockState().setValue(RotatedPillarBlock.AXIS, state.getValue(RotatedPillarBlock.AXIS)), 11); if (player != null && !player.isCreative()) { - player.getMainHandStack().damage(1, world.random, (ServerPlayer) player); + player.getMainHandItem().hurt(1, world.random, (ServerPlayer) player); } } - return ActionResult.SUCCESS; + return InteractionResult.SUCCESS; } - return ActionResult.FAIL; + return InteractionResult.FAIL; } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndBookshelfBlock.java b/src/main/java/ru/betterend/blocks/basis/EndBookshelfBlock.java index 82688186..cbe352f3 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndBookshelfBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndBookshelfBlock.java @@ -5,23 +5,23 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.Registry; import ru.betterend.patterns.Patterns; public class EndBookshelfBlock extends BlockBase { public EndBookshelfBlock(Block source) { super(FabricBlockSettings.copyOf(source)); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); @@ -33,24 +33,24 @@ public class EndBookshelfBlock extends BlockBase { } return Collections.singletonList(new ItemStack(Items.BOOK, 3)); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_SIMPLE; } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(Patterns.BLOCK_BOOKSHELF, getName(blockId), blockId.getPath()); } - + @Override public String getStatesPattern(Reader data) { ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(data, getName(blockId), blockId.getPath()); } - + private String getName(ResourceLocation blockId) { String name = blockId.getPath(); return name.replace("_bookshelf", ""); diff --git a/src/main/java/ru/betterend/blocks/basis/EndChainBlock.java b/src/main/java/ru/betterend/blocks/basis/EndChainBlock.java index a28dac5e..1b03516c 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndChainBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndChainBlock.java @@ -5,14 +5,14 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.ChainBlock; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.MaterialColor; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.Registry; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.BlockPatterned; @@ -22,18 +22,18 @@ public class EndChainBlock extends ChainBlock implements BlockPatterned, IRender public EndChainBlock(MaterialColor color) { super(FabricBlockSettings.copyOf(Blocks.CHAIN).materialColor(color)); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(this); @@ -42,12 +42,12 @@ public class EndChainBlock extends ChainBlock implements BlockPatterned, IRender } return Patterns.createJson(Patterns.BLOCK_CHAIN, blockId.getPath(), blockId.getPath()); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_CHAIN; } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; diff --git a/src/main/java/ru/betterend/blocks/basis/EndChestBlock.java b/src/main/java/ru/betterend/blocks/basis/EndChestBlock.java index d146316f..a7d6344a 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndChestBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndChestBlock.java @@ -4,48 +4,50 @@ import java.io.Reader; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.ChestBlock; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.Registry; -import net.minecraft.world.level.BlockGetter; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; import ru.betterend.registry.EndBlockEntities; public class EndChestBlock extends ChestBlock implements BlockPatterned { private final Block parent; - + public EndChestBlock(Block source) { - super(FabricBlockSettings.copyOf(source).nonOpaque(), () -> { + super(FabricBlockSettings.copyOf(source).noOcclusion(), () -> { return EndBlockEntities.CHEST; }); this.parent = source; } - + @Override - public BlockEntity createBlockEntity(BlockView world) { - return EndBlockEntities.CHEST.instantiate(); + public BlockEntity newBlockEntity(BlockGetter world) + { + return EndBlockEntities.CHEST.create(); } - + @Override - public List getDrops(BlockState state, LootContext.Builder builder) { + public List getDrops(BlockState state, LootContext.Builder builder) + { List drop = super.getDrops(state, builder); drop.add(new ItemStack(this.asItem())); return drop; } - + @Override public String getStatesPattern(Reader data) { ResourceLocation blockId = Registry.BLOCK.getKey(this); ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String path) { ResourceLocation blockId = Registry.BLOCK.getKey(this); @@ -55,7 +57,7 @@ public class EndChestBlock extends ChestBlock implements BlockPatterned { } return Patterns.createJson(Patterns.BLOCK_EMPTY, parentId.getPath()); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_SIMPLE; diff --git a/src/main/java/ru/betterend/blocks/basis/EndComposterBlock.java b/src/main/java/ru/betterend/blocks/basis/EndComposterBlock.java index db82d4bd..fdf45dff 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndComposterBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndComposterBlock.java @@ -5,13 +5,13 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.ComposterBlock; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.ComposterBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; @@ -19,25 +19,25 @@ public class EndComposterBlock extends ComposterBlock implements BlockPatterned public EndComposterBlock(Block source) { super(FabricBlockSettings.copyOf(source)); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this.asItem())); } - + @Override public String getStatesPattern(Reader data) { String blockId = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, blockId, blockId); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(this); String blockName = blockId.getPath(); return Patterns.createJson(Patterns.BLOCK_COMPOSTER, blockName); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_COMPOSTER; diff --git a/src/main/java/ru/betterend/blocks/basis/EndCraftingTableBlock.java b/src/main/java/ru/betterend/blocks/basis/EndCraftingTableBlock.java index 2e8da6d9..0f930b7f 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndCraftingTableBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndCraftingTableBlock.java @@ -6,13 +6,13 @@ import java.util.HashMap; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.CraftingTableBlock; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.CraftingTableBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; @@ -25,13 +25,13 @@ public class EndCraftingTableBlock extends CraftingTableBlock implements BlockPa public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this.asItem())); } - + @Override public String getStatesPattern(Reader data) { String blockId = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, blockId, blockId); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(this); @@ -49,7 +49,7 @@ public class EndCraftingTableBlock extends CraftingTableBlock implements BlockPa } }); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_SIMPLE; diff --git a/src/main/java/ru/betterend/blocks/basis/EndCropBlock.java b/src/main/java/ru/betterend/blocks/basis/EndCropBlock.java index e8e75e3c..8413c649 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndCropBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndCropBlock.java @@ -8,59 +8,63 @@ import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.AbstractBlock; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.Mth; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.world.level.block.state.properties.IntegerProperty; -import net.minecraft.core.BlockPos; -import net.minecraft.util.Mth; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; public class EndCropBlock extends EndPlantBlock { - private static final VoxelShape SHAPE = Block.createCuboidShape(2, 0, 2, 14, 14, 14); - public static final IntegerProperty AGE = IntegerProperty.of("age", 0, 3); - + private static final VoxelShape SHAPE = Block.box(2, 0, 2, 14, 14, 14); + public static final IntegerProperty AGE = IntegerProperty.create("age", 0, 3); + private final Block[] terrain; private final Item drop; - + public EndCropBlock(Item drop, Block... terrain) { - super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.HOES).sounds(SoundType.GRASS) - .breakByHand(true).ticksRandomly().noCollision()); + super(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.HOES) + .breakByHand(true) + .sound(SoundType.GRASS) + .randomTicks() + .noCollission()); this.drop = drop; this.terrain = terrain; - this.setDefaultState(getDefaultState().with(AGE, 0)); + this.registerDefaultState(defaultBlockState().setValue(AGE, 0)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(AGE); } - + @Override protected boolean isTerrain(BlockState state) { - for (Block block : terrain) { + for (Block block: terrain) { if (state.is(block)) { return true; } } return false; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { if (state.getValue(AGE) < 3) { @@ -79,40 +83,40 @@ public class EndCropBlock extends EndPlantBlock { int countDrops = MHelper.randRange(1, 2, MHelper.RANDOM); return Lists.newArrayList(new ItemStack(this, countSeeds), new ItemStack(drop, countDrops)); } - + @Override - public AbstractBlock.OffsetType getOffsetType() { - return AbstractBlock.OffsetType.NONE; + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.NONE; } - + @Override - public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { int age = state.getValue(AGE); if (age < 3) { - BlocksHelper.setWithUpdate(world, pos, state.with(AGE, age + 1)); + BlocksHelper.setWithUpdate(world, pos, state.setValue(AGE, age + 1)); } } - + @Override - public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { return state.getValue(AGE) < 3; } - + @Override - public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return state.getValue(AGE) < 3; } - + @Override - public void scheduledTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { - super.scheduledTick(state, world, pos, random); - if (canGrow(world, random, pos, state) && random.nextInt(8) == 0) { - grow(world, random, pos, state); + public void tick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + super.tick(state, world, pos, random); + if (isBonemealSuccess(world, random, pos, state) && random.nextInt(8) == 0) { + performBonemeal(world, random, pos, state); } } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPE; } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndDoorBlock.java b/src/main/java/ru/betterend/blocks/basis/EndDoorBlock.java index 8d6d21f8..edd17f80 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndDoorBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndDoorBlock.java @@ -5,14 +5,14 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.DoorBlock; -import net.minecraft.world.level.block.enums.DoubleBlockHalf; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.DoorBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.BlockPatterned; @@ -20,7 +20,7 @@ import ru.betterend.patterns.Patterns; public class EndDoorBlock extends DoorBlock implements IRenderTypeable, BlockPatterned { public EndDoorBlock(Block source) { - super(FabricBlockSettings.copyOf(source).strength(3F, 3F).nonOpaque()); + super(FabricBlockSettings.copyOf(source).strength(3F, 3F).noOcclusion()); } @Override @@ -35,13 +35,13 @@ public class EndDoorBlock extends DoorBlock implements IRenderTypeable, BlockPat public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override public String getStatesPattern(Reader data) { String blockId = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, blockId, blockId); } - + @Override public String getModelPattern(String block) { String blockId = Registry.BLOCK.getKey(this).getPath(); @@ -59,7 +59,7 @@ public class EndDoorBlock extends DoorBlock implements IRenderTypeable, BlockPat } return Patterns.createJson(Patterns.BLOCK_DOOR_BOTTOM, blockId, blockId); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_DOOR; diff --git a/src/main/java/ru/betterend/blocks/basis/EndFenceBlock.java b/src/main/java/ru/betterend/blocks/basis/EndFenceBlock.java index 30c55f1c..513214fd 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndFenceBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndFenceBlock.java @@ -5,21 +5,21 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.FenceBlock; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.FenceBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; public class EndFenceBlock extends FenceBlock implements BlockPatterned { private final Block parent; - + public EndFenceBlock(Block source) { - super(FabricBlockSettings.copyOf(source).nonOpaque()); + super(FabricBlockSettings.copyOf(source).noOcclusion()); this.parent = source; } @@ -27,14 +27,14 @@ public class EndFenceBlock extends FenceBlock implements BlockPatterned { public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { ResourceLocation blockId = Registry.BLOCK.getKey(this); ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(this); @@ -47,7 +47,7 @@ public class EndFenceBlock extends FenceBlock implements BlockPatterned { } return Patterns.createJson(Patterns.BLOCK_FENCE_POST, parentId.getPath(), blockId.getPath()); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_FENCE; diff --git a/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java b/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java index a4666eb8..dee166a3 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java @@ -8,21 +8,21 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.FurnaceBlock; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.screen.NamedScreenHandlerFactory; -import net.minecraft.stat.Stats; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.stats.Stats; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.FurnaceBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import ru.betterend.blocks.entities.EFurnaceBlockEntity; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; @@ -31,31 +31,31 @@ import ru.betterend.patterns.Patterns; public class EndFurnaceBlock extends FurnaceBlock implements BlockPatterned, IRenderTypeable { public EndFurnaceBlock(Block source) { - super(FabricBlockSettings.copyOf(source).luminance((state) -> { + super(FabricBlockSettings.copyOf(source).lightLevel((state) -> { return state.getValue(LIT) ? 13 : 0; })); } @Override - public BlockEntity createBlockEntity(BlockView world) { + public BlockEntity newBlockEntity(BlockGetter world) { return new EFurnaceBlockEntity(); } - + @Override - protected void openScreen(Level world, BlockPos pos, Player player) { + protected void openContainer(Level world, BlockPos pos, Player player) { BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof EFurnaceBlockEntity) { - player.openHandledScreen((NamedScreenHandlerFactory) blockEntity); - player.incrementStat(Stats.INTERACT_WITH_FURNACE); + player.openMenu((MenuProvider) blockEntity); + player.awardStat(Stats.INTERACT_WITH_FURNACE); } } - + @Override public String getStatesPattern(Reader data) { ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(this); @@ -66,12 +66,13 @@ public class EndFurnaceBlock extends FurnaceBlock implements BlockPatterned, IRe map.put("%front%", blockId.getPath() + "_front_on"); map.put("%glow%", blockId.getPath() + "_glow"); return Patterns.createJson(Patterns.BLOCK_FURNACE_GLOW, map); - } else { + } + else { map.put("%front%", blockId.getPath() + "_front"); return Patterns.createJson(Patterns.BLOCK_FURNACE, map); } } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_FURNACE; @@ -81,15 +82,15 @@ public class EndFurnaceBlock extends FurnaceBlock implements BlockPatterned, IRe public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { List drop = Lists.newArrayList(new ItemStack(this)); - BlockEntity blockEntity = builder.getNullable(LootContextParams.BLOCK_ENTITY); + BlockEntity blockEntity = builder.getOptionalParameter(LootContextParams.BLOCK_ENTITY); if (blockEntity instanceof EFurnaceBlockEntity) { EFurnaceBlockEntity entity = (EFurnaceBlockEntity) blockEntity; - for (int i = 0; i < entity.size(); i++) { - drop.add(entity.getStack(i)); + for (int i = 0; i < entity.getContainerSize(); i++) { + drop.add(entity.getItem(i)); } } return drop; diff --git a/src/main/java/ru/betterend/blocks/basis/EndGateBlock.java b/src/main/java/ru/betterend/blocks/basis/EndGateBlock.java index ed2946e7..156407c2 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndGateBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndGateBlock.java @@ -5,21 +5,21 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.FenceGateBlock; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.FenceGateBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; public class EndGateBlock extends FenceGateBlock implements BlockPatterned { private final Block parent; - + public EndGateBlock(Block source) { - super(FabricBlockSettings.copyOf(source).nonOpaque()); + super(FabricBlockSettings.copyOf(source).noOcclusion()); this.parent = source; } @@ -27,14 +27,14 @@ public class EndGateBlock extends FenceGateBlock implements BlockPatterned { public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { ResourceLocation blockId = Registry.BLOCK.getKey(this); ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(this); @@ -51,7 +51,7 @@ public class EndGateBlock extends FenceGateBlock implements BlockPatterned { } return Patterns.createJson(Patterns.BLOCK_GATE_CLOSED, parentId.getPath(), blockId.getPath()); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_GATE; diff --git a/src/main/java/ru/betterend/blocks/basis/EndLadderBlock.java b/src/main/java/ru/betterend/blocks/basis/EndLadderBlock.java index acc5ca29..505b3ae9 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndLadderBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndLadderBlock.java @@ -3,28 +3,28 @@ package ru.betterend.blocks.basis; import java.io.Reader; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.HorizontalFacingBlock; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.fluid.FluidState; -import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.item.ItemPlacementContext; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.DirectionProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.util.BlockMirror; -import net.minecraft.world.level.block.Rotation; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Registry; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.BlockPatterned; @@ -32,15 +32,15 @@ import ru.betterend.patterns.Patterns; import ru.betterend.util.BlocksHelper; public class EndLadderBlock extends BlockBaseNotFull implements IRenderTypeable, BlockPatterned { - public static final DirectionProperty FACING = HorizontalFacingBlock.FACING; - public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; - protected static final VoxelShape EAST_SHAPE = Block.createCuboidShape(0.0D, 0.0D, 0.0D, 3.0D, 16.0D, 16.0D); - protected static final VoxelShape WEST_SHAPE = Block.createCuboidShape(13.0D, 0.0D, 0.0D, 16.0D, 16.0D, 16.0D); - protected static final VoxelShape SOUTH_SHAPE = Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 16.0D, 3.0D); - protected static final VoxelShape NORTH_SHAPE = Block.createCuboidShape(0.0D, 0.0D, 13.0D, 16.0D, 16.0D, 16.0D); + public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING; + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + protected static final VoxelShape EAST_SHAPE = Block.box(0.0D, 0.0D, 0.0D, 3.0D, 16.0D, 16.0D); + protected static final VoxelShape WEST_SHAPE = Block.box(13.0D, 0.0D, 0.0D, 16.0D, 16.0D, 16.0D); + protected static final VoxelShape SOUTH_SHAPE = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 16.0D, 3.0D); + protected static final VoxelShape NORTH_SHAPE = Block.box(0.0D, 0.0D, 13.0D, 16.0D, 16.0D, 16.0D); public EndLadderBlock(Block block) { - super(FabricBlockSettings.copyOf(block).nonOpaque()); + super(FabricBlockSettings.copyOf(block).noOcclusion()); } @Override @@ -49,7 +49,7 @@ public class EndLadderBlock extends BlockBaseNotFull implements IRenderTypeable, stateManager.add(WATERLOGGED); } - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { switch (state.getValue(FACING)) { case SOUTH: return SOUTH_SHAPE; @@ -62,25 +62,25 @@ public class EndLadderBlock extends BlockBaseNotFull implements IRenderTypeable, } } - private boolean canPlaceOn(BlockView world, BlockPos pos, Direction side) { + private boolean canPlaceOn(BlockGetter world, BlockPos pos, Direction side) { BlockState blockState = world.getBlockState(pos); - return !blockState.emitsRedstonePower() && blockState.isSideSolidFullSquare(world, pos, side); + return !blockState.isSignalSource() && blockState.isFaceSturdy(world, pos, side); } @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { Direction direction = (Direction) state.getValue(FACING); return this.canPlaceOn(world, pos.relative(direction.getOpposite()), direction); } @Override - public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, - BlockPos pos, BlockPos neighborPos) { - if (facing.getOpposite() == state.getValue(FACING) && !state.canPlaceAt(world, pos)) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, + LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (facing.getOpposite() == state.getValue(FACING) && !state.canSurvive(world, pos)) { return Blocks.AIR.defaultBlockState(); } else { if ((Boolean) state.getValue(WATERLOGGED)) { - world.getFluidTickScheduler().schedule(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + world.getLiquidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); } return super.updateShape(state, facing, neighborState, world, pos, neighborPos); @@ -88,28 +88,28 @@ public class EndLadderBlock extends BlockBaseNotFull implements IRenderTypeable, } @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { + public BlockState getStateForPlacement(BlockPlaceContext ctx) { BlockState blockState2; - if (!ctx.canReplaceExisting()) { - blockState2 = ctx.getLevel().getBlockState(ctx.getBlockPos().offset(ctx.getSide().getOpposite())); - if (blockState2.getBlock() == this && blockState2.get(FACING) == ctx.getSide()) { + if (!ctx.replacingClickedOnBlock()) { + blockState2 = ctx.getLevel().getBlockState(ctx.getClickedPos().relative(ctx.getClickedFace().getOpposite())); + if (blockState2.getBlock() == this && blockState2.getValue(FACING) == ctx.getClickedFace()) { return null; } } blockState2 = this.defaultBlockState(); - WorldView worldView = ctx.getLevel(); - BlockPos blockPos = ctx.getBlockPos(); - FluidState fluidState = ctx.getLevel().getFluidState(ctx.getBlockPos()); - Direction[] var6 = ctx.getPlacementDirections(); + LevelReader worldView = ctx.getLevel(); + BlockPos blockPos = ctx.getClickedPos(); + FluidState fluidState = ctx.getLevel().getFluidState(ctx.getClickedPos()); + Direction[] var6 = ctx.getNearestLookingDirections(); int var7 = var6.length; for (int var8 = 0; var8 < var7; ++var8) { Direction direction = var6[var8]; if (direction.getAxis().isHorizontal()) { - blockState2 = (BlockState) blockState2.with(FACING, direction.getOpposite()); - if (blockState2.canPlaceAt(worldView, blockPos)) { - return (BlockState) blockState2.with(WATERLOGGED, fluidState.getFluid() == Fluids.WATER); + blockState2 = (BlockState) blockState2.setValue(FACING, direction.getOpposite()); + if (blockState2.canSurvive(worldView, blockPos)) { + return (BlockState) blockState2.setValue(WATERLOGGED, fluidState.getType() == Fluids.WATER); } } } @@ -123,26 +123,26 @@ public class EndLadderBlock extends BlockBaseNotFull implements IRenderTypeable, } @Override - public BlockState mirror(BlockState state, BlockMirror mirror) { + public BlockState mirror(BlockState state, Mirror mirror) { return BlocksHelper.mirrorHorizontal(state, mirror, FACING); } @Override public FluidState getFluidState(BlockState state) { - return (Boolean) state.getValue(WATERLOGGED) ? Fluids.WATER.getStill(false) : super.getFluidState(state); + return (Boolean) state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); } @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override public String getStatesPattern(Reader data) { String blockId = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, blockId, blockId); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(this); @@ -151,7 +151,7 @@ public class EndLadderBlock extends BlockBaseNotFull implements IRenderTypeable, } return Patterns.createJson(Patterns.BLOCK_LADDER, blockId.getPath()); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_LADDER; diff --git a/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java index 28505b8f..136a9e17 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java @@ -1,110 +1,119 @@ package ru.betterend.blocks.basis; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.FluidFillable; -import net.minecraft.world.level.block.Waterloggable; -import net.minecraft.fluid.Fluid; -import net.minecraft.fluid.FluidState; -import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.item.ItemPlacementContext; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.Properties; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LiquidBlockContainer; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; import ru.betterend.blocks.BlockProperties; -public class EndLanternBlock extends BlockBaseNotFull implements Waterloggable, FluidFillable { +public class EndLanternBlock extends BlockBaseNotFull implements SimpleWaterloggedBlock, LiquidBlockContainer { public static final BooleanProperty IS_FLOOR = BlockProperties.IS_FLOOR; - public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; - + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + public EndLanternBlock(Block source) { - this(FabricBlockSettings.copyOf(source).luminance(15).nonOpaque()); + this(FabricBlockSettings.copyOf(source).luminance(15).noOcclusion()); } - - public EndLanternBlock(FabricBlockSettings settings) { - super(settings.nonOpaque()); + + public EndLanternBlock(Properties settings) { + super(settings.noOcclusion()); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(IS_FLOOR, WATERLOGGED); } - + @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - WorldView worldView = ctx.getLevel(); - BlockPos blockPos = ctx.getBlockPos(); - Direction dir = ctx.getSide(); - boolean water = worldView.getFluidState(blockPos).getFluid() == Fluids.WATER; + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + LevelReader worldView = ctx.getLevel(); + BlockPos blockPos = ctx.getClickedPos(); + Direction dir = ctx.getClickedFace(); + boolean water = worldView.getFluidState(blockPos).getType() == Fluids.WATER; if (dir != Direction.DOWN && dir != Direction.UP) { - if (sideCoversSmallSquare(worldView, blockPos.up(), Direction.DOWN)) { - return getDefaultState().with(IS_FLOOR, false).with(WATERLOGGED, water); - } else if (sideCoversSmallSquare(worldView, blockPos.below(), Direction.UP)) { - return getDefaultState().with(IS_FLOOR, true).with(WATERLOGGED, water); - } else { + if (canSupportCenter(worldView, blockPos.above(), Direction.DOWN)) { + return defaultBlockState().setValue(IS_FLOOR, false).setValue(WATERLOGGED, water); + } + else if (canSupportCenter(worldView, blockPos.below(), Direction.UP)) { + return defaultBlockState().setValue(IS_FLOOR, true).setValue(WATERLOGGED, water); + } + else { return null; } - } else if (dir == Direction.DOWN) { - if (sideCoversSmallSquare(worldView, blockPos.up(), Direction.DOWN)) { - return getDefaultState().with(IS_FLOOR, false).with(WATERLOGGED, water); - } else if (sideCoversSmallSquare(worldView, blockPos.below(), Direction.UP)) { - return getDefaultState().with(IS_FLOOR, true).with(WATERLOGGED, water); - } else { + } + else if (dir == Direction.DOWN) { + if (canSupportCenter(worldView, blockPos.above(), Direction.DOWN)) { + return defaultBlockState().setValue(IS_FLOOR, false).setValue(WATERLOGGED, water); + } + else if (canSupportCenter(worldView, blockPos.below(), Direction.UP)) { + return defaultBlockState().setValue(IS_FLOOR, true).setValue(WATERLOGGED, water); + } + else { return null; } - } else { - if (sideCoversSmallSquare(worldView, blockPos.below(), Direction.UP)) { - return getDefaultState().with(IS_FLOOR, true).with(WATERLOGGED, water); - } else if (sideCoversSmallSquare(worldView, blockPos.up(), Direction.DOWN)) { - return getDefaultState().with(IS_FLOOR, false).with(WATERLOGGED, water); - } else { + } + else { + if (canSupportCenter(worldView, blockPos.below(), Direction.UP)) { + return defaultBlockState().setValue(IS_FLOOR, true).setValue(WATERLOGGED, water); + } + else if (canSupportCenter(worldView, blockPos.above(), Direction.DOWN)) { + return defaultBlockState().setValue(IS_FLOOR, false).setValue(WATERLOGGED, water); + } + else { return null; } } } - + @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { if (state.getValue(IS_FLOOR)) { - return sideCoversSmallSquare(world, pos.below(), Direction.UP); - } else { - return sideCoversSmallSquare(world, pos.up(), Direction.DOWN); + return canSupportCenter(world, pos.below(), Direction.UP); + } + else { + return canSupportCenter(world, pos.above(), Direction.DOWN); } } - + @Override - public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, - BlockPos pos, BlockPos neighborPos) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { Boolean water = state.getValue(WATERLOGGED); if (water) { - world.getFluidTickScheduler().schedule(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + world.getLiquidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); } - if (!canPlaceAt(state, world, pos)) { + if (!canSurvive(state, world, pos)) { return water ? Blocks.WATER.defaultBlockState() : Blocks.AIR.defaultBlockState(); - } else { + } + else { return state; } } - + @Override - public boolean canFillWithFluid(BlockView world, BlockPos pos, BlockState state, Fluid fluid) { + public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { return false; } @Override - public boolean tryFillWithFluid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { + public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { return false; } - + @Override public FluidState getFluidState(BlockState state) { - return state.getValue(WATERLOGGED) ? Fluids.WATER.getStill(false) : Fluids.EMPTY.defaultBlockState(); + return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : Fluids.EMPTY.defaultFluidState(); } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndLeavesBlock.java b/src/main/java/ru/betterend/blocks/basis/EndLeavesBlock.java index b5b45e92..4e9509ca 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndLeavesBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndLeavesBlock.java @@ -8,18 +8,18 @@ import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.LeavesBlock; -import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.Enchantments; -import net.minecraft.world.item.ItemStack; +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.BlockState; +import net.minecraft.world.level.material.MaterialColor; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.Registry; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.BlockPatterned; @@ -28,57 +28,58 @@ import ru.betterend.util.MHelper; public class EndLeavesBlock extends LeavesBlock implements BlockPatterned, IRenderTypeable { private final Block sapling; - + public EndLeavesBlock(Block sapling, MaterialColor color) { - super(FabricBlockSettings.copyOf(Blocks.OAK_LEAVES).allowsSpawning((state, world, pos, type) -> { - return false; - }).suffocates((state, world, pos) -> { - return false; - }).blockVision((state, world, pos) -> { - return false; - }).materialColor(color).breakByTool(FabricToolTags.HOES).breakByTool(FabricToolTags.SHEARS).breakByHand(true)); + super(FabricBlockSettings.copyOf(Blocks.OAK_LEAVES) + .materialColor(color) + .breakByTool(FabricToolTags.HOES) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .isValidSpawn((state, world, pos, type) -> false) + .isSuffocating((state, world, pos) -> false) + .isViewBlocking((state, world, pos) -> false)); this.sapling = sapling; } - + public EndLeavesBlock(Block sapling, MaterialColor color, int light) { - super(FabricBlockSettings.copyOf(Blocks.OAK_LEAVES).allowsSpawning((state, world, pos, type) -> { - return false; - }).suffocates((state, world, pos) -> { - return false; - }).blockVision((state, world, pos) -> { - return false; - }).materialColor(color).luminance(light).breakByTool(FabricToolTags.HOES).breakByTool(FabricToolTags.SHEARS)); + super(FabricBlockSettings.copyOf(Blocks.OAK_LEAVES) + .materialColor(color) + .luminance(light) + .breakByTool(FabricToolTags.HOES) + .breakByTool(FabricToolTags.SHEARS) + .isValidSpawn((state, world, pos, type) -> false) + .isSuffocating((state, world, pos) -> false) + .isViewBlocking((state, world, pos) -> false)); this.sapling = sapling; } - + @Override public String getStatesPattern(Reader data) { String blockId = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, blockId, blockId); } - + @Override public String getModelPattern(String block) { String blockId = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(Patterns.BLOCK_BASE, blockId, blockId); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_SIMPLE; } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); if (tool != null) { - if (tool.getItem().isIn(FabricToolTags.SHEARS) - || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + if (tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Collections.singletonList(new ItemStack(this)); } int fortune = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BLOCK_FORTUNE, tool); diff --git a/src/main/java/ru/betterend/blocks/basis/EndMetalPaneBlock.java b/src/main/java/ru/betterend/blocks/basis/EndMetalPaneBlock.java index a83998c1..a10f97ff 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndMetalPaneBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndMetalPaneBlock.java @@ -7,35 +7,35 @@ import java.util.List; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.PaneBlock; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.Direction; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.IronBarsBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class EndMetalPaneBlock extends PaneBlock implements BlockPatterned, IRenderTypeable { +public class EndMetalPaneBlock extends IronBarsBlock implements BlockPatterned, IRenderTypeable { public EndMetalPaneBlock(Block source) { - super(FabricBlockSettings.copyOf(source).strength(5.0F, 6.0F).nonOpaque()); + super(FabricBlockSettings.copyOf(source).strength(5.0F, 6.0F).noOcclusion()); } @Override public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(this); @@ -44,24 +44,25 @@ public class EndMetalPaneBlock extends PaneBlock implements BlockPatterned, IRen } if (block.contains("post")) { return Patterns.createJson(Patterns.BLOCK_BARS_POST, blockId.getPath(), blockId.getPath()); - } else { + } + else { return Patterns.createJson(Patterns.BLOCK_BARS_SIDE, blockId.getPath(), blockId.getPath()); } } - + @Environment(EnvType.CLIENT) - public boolean isSideInvisible(BlockState state, BlockState stateFrom, Direction direction) { + public boolean skipRendering(BlockState state, BlockState stateFrom, Direction direction) { if (direction.getAxis().isVertical() && stateFrom.getBlock().is(this) && !stateFrom.equals(state)) { return false; } - return super.isSideInvisible(state, stateFrom, direction); + return super.skipRendering(state, stateFrom, direction); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_BARS; } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; diff --git a/src/main/java/ru/betterend/blocks/basis/EndMetalPlateBlock.java b/src/main/java/ru/betterend/blocks/basis/EndMetalPlateBlock.java index 17a54773..307dda00 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndMetalPlateBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndMetalPlateBlock.java @@ -5,21 +5,21 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.WeightedPressurePlateBlock; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.WeightedPressurePlateBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; public class EndMetalPlateBlock extends WeightedPressurePlateBlock implements BlockPatterned { private final Block parent; - + public EndMetalPlateBlock(Block source) { - super(15, FabricBlockSettings.copyOf(source).noCollision().nonOpaque().requiresTool().strength(0.5F)); + super(15, FabricBlockSettings.copyOf(source).noCollission().noOcclusion().requiresCorrectToolForDrops().strength(0.5F)); this.parent = source; } @@ -27,14 +27,14 @@ public class EndMetalPlateBlock extends WeightedPressurePlateBlock implements Bl public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { ResourceLocation blockId = Registry.BLOCK.getKey(this); ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(this); @@ -44,7 +44,7 @@ public class EndMetalPlateBlock extends WeightedPressurePlateBlock implements Bl } return Patterns.createJson(Patterns.BLOCK_PLATE_UP, parentId.getPath(), blockId.getPath()); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_PLATE; diff --git a/src/main/java/ru/betterend/blocks/basis/EndOreBlock.java b/src/main/java/ru/betterend/blocks/basis/EndOreBlock.java index 7e9750d0..74c0bbb7 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndOreBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndOreBlock.java @@ -6,20 +6,20 @@ import java.util.List; import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.block.OreBlock; +import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; import net.minecraft.world.level.material.MaterialColor; -import net.minecraft.world.level.block.OreBlock; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.item.enchantment.Enchantments; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.Mth; -import net.minecraft.core.Registry; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; import ru.betterend.util.MHelper; @@ -29,18 +29,21 @@ public class EndOreBlock extends OreBlock implements BlockPatterned { private final int minCount; private final int maxCount; private final int expirience; - + public EndOreBlock(Item drop, int minCount, int maxCount, int expirience) { - super(FabricBlockSettings.of(Material.STONE, MaterialColor.SAND).hardness(3F).resistance(9F).requiresTool() - .sounds(SoundType.STONE)); + super(FabricBlockSettings.of(Material.STONE, MaterialColor.SAND) + .hardness(3F) + .resistance(9F) + .requiresCorrectToolForDrops() + .sound(SoundType.STONE)); this.dropItem = drop; this.minCount = minCount; this.maxCount = maxCount; this.expirience = expirience; } - + @Override - protected int getExperienceWhenMined(Random random) { + protected int xpOnDrop(Random random) { return this.expirience > 0 ? random.nextInt(expirience) + 1 : 0; } @@ -67,19 +70,19 @@ public class EndOreBlock extends OreBlock implements BlockPatterned { } return Collections.emptyList(); } - + @Override public String getStatesPattern(Reader data) { String block = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, block, block); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(Patterns.BLOCK_BASE, blockId.getPath(), block); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_SIMPLE; diff --git a/src/main/java/ru/betterend/blocks/basis/EndPillarBlock.java b/src/main/java/ru/betterend/blocks/basis/EndPillarBlock.java index 492115fd..82e02e7a 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndPillarBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndPillarBlock.java @@ -5,13 +5,13 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.RotatedPillarBlock; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; @@ -19,28 +19,28 @@ public class EndPillarBlock extends RotatedPillarBlock implements BlockPatterned public EndPillarBlock(Properties settings) { super(settings); } - + public EndPillarBlock(Block block) { super(FabricBlockSettings.copyOf(block)); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { String texture = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, texture, texture); } - + @Override public String getModelPattern(String block) { String texture = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(Patterns.BLOCK_PILLAR, texture, texture); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_PILLAR; diff --git a/src/main/java/ru/betterend/blocks/basis/EndPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/EndPlantBlock.java index da0e6a7e..bf785d30 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndPlantBlock.java @@ -7,120 +7,125 @@ import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.AbstractBlock; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.Fertilizable; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.item.enchantment.Enchantments; -import net.minecraft.world.entity.ItemEntity; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.block.SoundType; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.BonemealableBlock; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndTags; -public class EndPlantBlock extends BlockBaseNotFull implements IRenderTypeable, Fertilizable { - private static final VoxelShape SHAPE = Block.createCuboidShape(4, 0, 4, 12, 14, 12); - +public class EndPlantBlock extends BlockBaseNotFull implements IRenderTypeable, BonemealableBlock { + private static final VoxelShape SHAPE = Block.box(4, 0, 4, 12, 14, 12); + public EndPlantBlock() { this(false); } - + public EndPlantBlock(int light) { this(false, light); } - + public EndPlantBlock(boolean replaceable) { super(FabricBlockSettings.of(replaceable ? Material.REPLACEABLE_PLANT : Material.PLANT) - .breakByTool(FabricToolTags.SHEARS).sounds(SoundType.GRASS).breakByHand(true).noCollision()); + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.GRASS) + .noCollission()); } - + public EndPlantBlock(boolean replaceable, int light) { super(FabricBlockSettings.of(replaceable ? Material.REPLACEABLE_PLANT : Material.PLANT) - .breakByTool(FabricToolTags.SHEARS).sounds(SoundType.GRASS).luminance(light).breakByHand(true) - .noCollision()); + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .luminance(light) + .sound(SoundType.GRASS) + .noCollission()); } - + public EndPlantBlock(Properties settings) { super(settings); } @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - Vec3d vec3d = state.getModelOffset(view, pos); - return SHAPE.offset(vec3d.x, vec3d.y, vec3d.z); + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + Vec3 vec3d = state.getOffset(view, pos); + return SHAPE.move(vec3d.x, vec3d.y, vec3d.z); } @Override - public AbstractBlock.OffsetType getOffsetType() { - return AbstractBlock.OffsetType.XZ; + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.XZ; } @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { BlockState down = world.getBlockState(pos.below()); return isTerrain(down); } - + protected boolean isTerrain(BlockState state) { - return state.isIn(EndTags.END_GROUND); + return state.is(EndTags.END_GROUND); } @Override - public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, - BlockPos pos, BlockPos neighborPos) { - if (!canPlaceAt(state, world, pos)) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) { return Blocks.AIR.defaultBlockState(); - } else { + } + else { return state; } } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); - if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) - || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Lists.newArrayList(new ItemStack(this)); - } else { + } + else { return Lists.newArrayList(); } } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } @Override - public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { return true; } @Override - public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return true; } @Override - public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { - ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, - new ItemStack(this)); - world.spawnEntity(item); + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { + ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(this)); + world.addFreshEntity(item); } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java b/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java index f02774d4..ed6bc623 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java @@ -4,57 +4,62 @@ import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; +import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.IntegerProperty; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.Level; +import net.minecraft.world.level.material.Material; import ru.betterend.blocks.BlockProperties; public abstract class EndPlantWithAgeBlock extends EndPlantBlock { public static final IntegerProperty AGE = BlockProperties.AGE; - + public EndPlantWithAgeBlock() { - this(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).sounds(SoundType.GRASS) - .breakByHand(true).ticksRandomly().noCollision()); + this(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.GRASS) + .randomTicks() + .noCollission()); } - - public EndPlantWithAgeBlock(FabricBlockSettings settings) { + + public EndPlantWithAgeBlock(Properties settings) { super(settings); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(AGE); } - + public abstract void growAdult(WorldGenLevel world, Random random, BlockPos pos); - + @Override - public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { int age = state.getValue(AGE); if (age < 3) { - world.setBlockAndUpdate(pos, state.with(AGE, age + 1)); - } else { + world.setBlockAndUpdate(pos, state.setValue(AGE, age + 1)); + } + else { growAdult(world, random, pos); } } - + @Override - public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return true; } - + @Override - public void scheduledTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { - super.scheduledTick(state, world, pos, random); + public void tick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + super.tick(state, world, pos, random); if (random.nextInt(8) == 0) { - grow(world, random, pos, state); + performBonemeal(world, random, pos, state); } } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndPlateBlock.java b/src/main/java/ru/betterend/blocks/basis/EndPlateBlock.java index 9bf2a9b6..a178faad 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndPlateBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndPlateBlock.java @@ -5,21 +5,21 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.PressurePlateBlock; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.PressurePlateBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; public class EndPlateBlock extends PressurePlateBlock implements BlockPatterned { private final Block parent; - - public EndPlateBlock(ActivationRule rule, Block source) { - super(rule, FabricBlockSettings.copyOf(source).noCollision().nonOpaque().strength(0.5F)); + + public EndPlateBlock(Sensitivity rule, Block source) { + super(rule, FabricBlockSettings.copyOf(source).noCollission().noOcclusion().strength(0.5F)); this.parent = source; } @@ -27,14 +27,14 @@ public class EndPlateBlock extends PressurePlateBlock implements BlockPatterned public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { ResourceLocation blockId = Registry.BLOCK.getKey(this); ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(this); @@ -44,9 +44,9 @@ public class EndPlateBlock extends PressurePlateBlock implements BlockPatterned } return Patterns.createJson(Patterns.BLOCK_PLATE_UP, parentId.getPath(), blockId.getPath()); } - + @Override public ResourceLocation statePatternId() { - return this.stateManager.getProperty("facing") != null ? Patterns.STATE_PLATE_ROTATED : Patterns.STATE_PLATE; + return this.stateDefinition.getProperty("facing") != null ? Patterns.STATE_PLATE_ROTATED : Patterns.STATE_PLATE; } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java b/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java index 539ba8f9..eca5c594 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java @@ -5,39 +5,39 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.SignBlock; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.fluid.Fluid; -import net.minecraft.fluid.FluidState; -import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.item.ItemPlacementContext; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.network.packet.s2c.play.SignEditorOpenS2CPacket; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.world.level.block.state.properties.IntegerProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.util.BlockMirror; -import net.minecraft.world.level.block.Rotation; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.SignType; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.util.Mth; import net.minecraft.core.Registry; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.network.protocol.game.ClientboundOpenSignEditorPacket; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SignBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.block.state.properties.WoodType; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.entities.ESignBlockEntity; import ru.betterend.interfaces.ISpetialItem; import ru.betterend.patterns.BlockPatterned; @@ -45,20 +45,20 @@ import ru.betterend.patterns.Patterns; import ru.betterend.util.BlocksHelper; public class EndSignBlock extends SignBlock implements BlockPatterned, ISpetialItem { - public static final IntegerProperty ROTATION = Properties.ROTATION; - public static final BooleanProperty FLOOR = BooleanProperty.of("floor"); + public static final IntegerProperty ROTATION = BlockStateProperties.ROTATION_16; + public static final BooleanProperty FLOOR = BooleanProperty.create("floor"); private static final VoxelShape[] WALL_SHAPES = new VoxelShape[] { - Block.createCuboidShape(0.0D, 4.5D, 14.0D, 16.0D, 12.5D, 16.0D), - Block.createCuboidShape(0.0D, 4.5D, 0.0D, 2.0D, 12.5D, 16.0D), - Block.createCuboidShape(0.0D, 4.5D, 0.0D, 16.0D, 12.5D, 2.0D), - Block.createCuboidShape(14.0D, 4.5D, 0.0D, 16.0D, 12.5D, 16.0D) }; + Block.box(0.0D, 4.5D, 14.0D, 16.0D, 12.5D, 16.0D), + Block.box(0.0D, 4.5D, 0.0D, 2.0D, 12.5D, 16.0D), + Block.box(0.0D, 4.5D, 0.0D, 16.0D, 12.5D, 2.0D), + Block.box(14.0D, 4.5D, 0.0D, 16.0D, 12.5D, 16.0D) + }; private final Block parent; - + public EndSignBlock(Block source) { - super(FabricBlockSettings.copyOf(source).strength(1.0F, 1.0F).noCollision().nonOpaque(), SignType.OAK); - this.setDefaultState( - this.stateManager.defaultBlockState().with(ROTATION, 0).with(FLOOR, false).with(WATERLOGGED, false)); + super(FabricBlockSettings.copyOf(source).strength(1.0F, 1.0F).noCollission().noOcclusion(), WoodType.OAK); + this.registerDefaultState(this.stateDefinition.any().setValue(ROTATION, 0).setValue(FLOOR, false).setValue(WATERLOGGED, false)); this.parent = source; } @@ -68,72 +68,74 @@ public class EndSignBlock extends SignBlock implements BlockPatterned, ISpetialI } @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return state.getValue(FLOOR) ? SHAPE : WALL_SHAPES[state.getValue(ROTATION) >> 2]; } @Override - public BlockEntity createBlockEntity(BlockView world) { + public BlockEntity newBlockEntity(BlockGetter world) { return new ESignBlockEntity(); } - + @Override - public void onPlaced(Level world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { + public void setPlacedBy(Level world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { if (placer != null && placer instanceof Player) { ESignBlockEntity sign = (ESignBlockEntity) world.getBlockEntity(pos); if (!world.isClientSide) { - sign.setEditor((Player) placer); - ((ServerPlayer) placer).networkHandler.sendPacket(new SignEditorOpenS2CPacket(pos)); - } else { + sign.setAllowedPlayerEditor((Player) placer); + ((ServerPlayer) placer).connection.send(new ClientboundOpenSignEditorPacket(pos)); + } + else { sign.setEditable(true); } } } @Override - public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, - BlockPos pos, BlockPos neighborPos) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { if ((Boolean) state.getValue(WATERLOGGED)) { - world.getFluidTickScheduler().schedule(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + world.getLiquidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); } - if (!canPlaceAt(state, world, pos)) { - return state.getValue(WATERLOGGED) ? state.getFluidState().getBlockState() : Blocks.AIR.defaultBlockState(); + if (!canSurvive(state, world, pos)) { + return state.getValue(WATERLOGGED) ? state.getFluidState().createLegacyBlock() : Blocks.AIR.defaultBlockState(); } return super.updateShape(state, facing, neighborState, world, pos, neighborPos); } @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { if (!state.getValue(FLOOR)) { int index = (((state.getValue(ROTATION) >> 2) + 2)) & 3; return world.getBlockState(pos.relative(BlocksHelper.HORIZONTAL[index])).getMaterial().isSolid(); - } else { + } + else { return world.getBlockState(pos.below()).getMaterial().isSolid(); } } @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - if (ctx.getSide() == Direction.UP) { - FluidState fluidState = ctx.getLevel().getFluidState(ctx.getBlockPos()); - return this.defaultBlockState().with(FLOOR, true) - .with(ROTATION, Mth.floor((180.0 + ctx.getPlayerYaw() * 16.0 / 360.0) + 0.5 - 12) & 15) - .with(WATERLOGGED, fluidState.getFluid() == Fluids.WATER); - } else if (ctx.getSide() != Direction.DOWN) { + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + if (ctx.getClickedFace() == Direction.UP) { + FluidState fluidState = ctx.getLevel().getFluidState(ctx.getClickedPos()); + return this.defaultBlockState().setValue(FLOOR, true) + .setValue(ROTATION, Mth.floor((180.0 + ctx.getRotation() * 16.0 / 360.0) + 0.5 - 12) & 15) + .setValue(WATERLOGGED, fluidState.getType() == Fluids.WATER); + } + else if (ctx.getClickedFace() != Direction.DOWN) { BlockState blockState = this.defaultBlockState(); - FluidState fluidState = ctx.getLevel().getFluidState(ctx.getBlockPos()); - WorldView worldView = ctx.getLevel(); - BlockPos blockPos = ctx.getBlockPos(); - Direction[] directions = ctx.getPlacementDirections(); + FluidState fluidState = ctx.getLevel().getFluidState(ctx.getClickedPos()); + LevelReader worldView = ctx.getLevel(); + BlockPos blockPos = ctx.getClickedPos(); + Direction[] directions = ctx.getNearestLookingDirections(); for (int i = 0; i < directions.length; ++i) { Direction direction = directions[i]; if (direction.getAxis().isHorizontal()) { Direction dir = direction.getOpposite(); - int rot = Mth.floor((180.0 + dir.asRotation() * 16.0 / 360.0) + 0.5 + 4) & 15; - blockState = blockState.with(ROTATION, rot); - if (blockState.canPlaceAt(worldView, blockPos)) { - return blockState.with(FLOOR, false).with(WATERLOGGED, fluidState.getFluid() == Fluids.WATER); + int rot = Mth.floor((180.0 + dir.toYRot() * 16.0 / 360.0) + 0.5 + 4) & 15; + blockState = blockState.setValue(ROTATION, rot); + if (blockState.canSurvive(worldView, blockPos)) { + return blockState.setValue(FLOOR, false).setValue(WATERLOGGED, fluidState.getType() == Fluids.WATER); } } } @@ -141,14 +143,14 @@ public class EndSignBlock extends SignBlock implements BlockPatterned, ISpetialI return null; } - + @Override public String getStatesPattern(Reader data) { ResourceLocation blockId = Registry.BLOCK.getKey(this); ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String path) { ResourceLocation parentId = Registry.BLOCK.getKey(parent); @@ -157,41 +159,41 @@ public class EndSignBlock extends SignBlock implements BlockPatterned, ISpetialI } return Patterns.createJson(Patterns.BLOCK_EMPTY, parentId.getPath()); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_SIMPLE; } - + @Override public BlockState rotate(BlockState state, Rotation rotation) { - return (BlockState) state.with(ROTATION, rotation.rotate((Integer) state.getValue(ROTATION), 16)); + return (BlockState) state.setValue(ROTATION, rotation.rotate((Integer) state.getValue(ROTATION), 16)); } @Override - public BlockState mirror(BlockState state, BlockMirror mirror) { - return (BlockState) state.with(ROTATION, mirror.mirror((Integer) state.getValue(ROTATION), 16)); + public BlockState mirror(BlockState state, Mirror mirror) { + return (BlockState) state.setValue(ROTATION, mirror.mirror((Integer) state.getValue(ROTATION), 16)); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } @Override - public Fluid tryDrainFluid(LevelAccessor world, BlockPos pos, BlockState state) { + public Fluid takeLiquid(LevelAccessor world, BlockPos pos, BlockState state) { // TODO Auto-generated method stub return null; } @Override - public boolean canFillWithFluid(BlockView world, BlockPos pos, BlockState state, Fluid fluid) { + public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { // TODO Auto-generated method stub return false; } @Override - public boolean tryFillWithFluid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { + public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { // TODO Auto-generated method stub return false; } diff --git a/src/main/java/ru/betterend/blocks/basis/EndSlabBlock.java b/src/main/java/ru/betterend/blocks/basis/EndSlabBlock.java index 59139636..ef75cac8 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndSlabBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndSlabBlock.java @@ -5,19 +5,19 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.SlabBlock; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SlabBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; public class EndSlabBlock extends SlabBlock implements BlockPatterned { private final Block parent; - + public EndSlabBlock(Block source) { super(FabricBlockSettings.copyOf(source)); this.parent = source; @@ -27,21 +27,21 @@ public class EndSlabBlock extends SlabBlock implements BlockPatterned { public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { ResourceLocation blockId = Registry.BLOCK.getKey(this); ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(this); ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(Patterns.BLOCK_SLAB, parentId.getPath(), blockId.getPath()); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_SLAB; diff --git a/src/main/java/ru/betterend/blocks/basis/EndStairsBlock.java b/src/main/java/ru/betterend/blocks/basis/EndStairsBlock.java index def04b1c..98d020cd 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndStairsBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndStairsBlock.java @@ -5,38 +5,37 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.StairsBlock; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.StairBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class EndStairsBlock extends StairsBlock implements BlockPatterned { - +public class EndStairsBlock extends StairBlock implements BlockPatterned { + private final Block parent; - + public EndStairsBlock(Block source) { super(source.defaultBlockState(), FabricBlockSettings.copyOf(source)); this.parent = source; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { ResourceLocation blockId = Registry.BLOCK.getKey(this); ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(this); @@ -49,7 +48,7 @@ public class EndStairsBlock extends StairsBlock implements BlockPatterned { } return Patterns.createJson(Patterns.BLOCK_STAIR, parentId.getPath(), blockId.getPath()); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_STAIRS; diff --git a/src/main/java/ru/betterend/blocks/basis/EndStoneButtonBlock.java b/src/main/java/ru/betterend/blocks/basis/EndStoneButtonBlock.java index e8e51ec5..538d06f8 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndStoneButtonBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndStoneButtonBlock.java @@ -5,21 +5,21 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.StoneButtonBlock; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.StoneButtonBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; public class EndStoneButtonBlock extends StoneButtonBlock implements BlockPatterned { private final Block parent; - + public EndStoneButtonBlock(Block source) { - super(FabricBlockSettings.copyOf(source).nonOpaque()); + super(FabricBlockSettings.copyOf(source).noOcclusion()); this.parent = source; } @@ -27,14 +27,14 @@ public class EndStoneButtonBlock extends StoneButtonBlock implements BlockPatter public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { ResourceLocation blockId = Registry.BLOCK.getKey(this); ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(this); @@ -47,7 +47,7 @@ public class EndStoneButtonBlock extends StoneButtonBlock implements BlockPatter } return Patterns.createJson(Patterns.BLOCK_BUTTON, parentId.getPath(), blockId.getPath()); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_BUTTON; diff --git a/src/main/java/ru/betterend/blocks/basis/EndStonelateBlock.java b/src/main/java/ru/betterend/blocks/basis/EndStonelateBlock.java index 80a39785..16b16f0e 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndStonelateBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndStonelateBlock.java @@ -4,6 +4,6 @@ import net.minecraft.world.level.block.Block; public class EndStonelateBlock extends EndPlateBlock { public EndStonelateBlock(Block source) { - super(ActivationRule.MOBS, source); + super(Sensitivity.MOBS, source); } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndTrapdoorBlock.java b/src/main/java/ru/betterend/blocks/basis/EndTrapdoorBlock.java index 25330f0a..626beccd 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndTrapdoorBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndTrapdoorBlock.java @@ -6,39 +6,39 @@ import java.util.HashMap; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.TrapdoorBlock; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.TrapDoorBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class EndTrapdoorBlock extends TrapdoorBlock implements IRenderTypeable, BlockPatterned { +public class EndTrapdoorBlock extends TrapDoorBlock implements IRenderTypeable, BlockPatterned { public EndTrapdoorBlock(Block source) { - super(FabricBlockSettings.copyOf(source).strength(3.0F, 3.0F).nonOpaque()); + super(FabricBlockSettings.copyOf(source).strength(3.0F, 3.0F).noOcclusion()); } @Override public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override public String getStatesPattern(Reader data) { String block = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, block, block); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(this); @@ -51,7 +51,7 @@ public class EndTrapdoorBlock extends TrapdoorBlock implements IRenderTypeable, } }); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_TRAPDOOR; diff --git a/src/main/java/ru/betterend/blocks/basis/EndUnderwaterWallPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/EndUnderwaterWallPlantBlock.java index e838ac46..656e7898 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndUnderwaterWallPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndUnderwaterWallPlantBlock.java @@ -2,51 +2,58 @@ package ru.betterend.blocks.basis; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.FluidFillable; -import net.minecraft.world.level.material.Material; -import net.minecraft.fluid.Fluid; -import net.minecraft.fluid.FluidState; -import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.level.block.SoundType; import net.minecraft.core.BlockPos; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.WorldView; - -public class EndUnderwaterWallPlantBlock extends EndWallPlantBlock implements FluidFillable { +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.LiquidBlockContainer; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.Material; +public class EndUnderwaterWallPlantBlock extends EndWallPlantBlock implements LiquidBlockContainer { + public EndUnderwaterWallPlantBlock() { - super(FabricBlockSettings.of(Material.UNDERWATER_PLANT).breakByTool(FabricToolTags.SHEARS) - .sounds(SoundType.WET_GRASS).breakByHand(true).noCollision()); + super(FabricBlockSettings.of(Material.WATER_PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.WET_GRASS) + .noCollission()); } - + public EndUnderwaterWallPlantBlock(int light) { - super(FabricBlockSettings.of(Material.UNDERWATER_PLANT).breakByTool(FabricToolTags.SHEARS) - .sounds(SoundType.WET_GRASS).luminance(light).breakByHand(true).noCollision()); + super(FabricBlockSettings.of(Material.WATER_PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .luminance(light) + .sound(SoundType.WET_GRASS) + .noCollission()); } - + public EndUnderwaterWallPlantBlock(Properties settings) { super(settings); } - + @Override - public boolean canFillWithFluid(BlockView world, BlockPos pos, BlockState state, Fluid fluid) { + public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { return false; } @Override - public boolean tryFillWithFluid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { + public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { return false; } - + @Override public FluidState getFluidState(BlockState state) { - return Fluids.WATER.getStill(false); + return Fluids.WATER.getSource(false); } - + @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return world.getFluidState(pos).getFluid() == Fluids.WATER && super.canPlaceAt(state, world, pos); + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + return world.getFluidState(pos).getType() == Fluids.WATER && super.canSurvive(state, world, pos); } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndWallBlock.java b/src/main/java/ru/betterend/blocks/basis/EndWallBlock.java index b95c3c18..c8e51c77 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndWallBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndWallBlock.java @@ -5,22 +5,22 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.WallBlock; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.WallBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; public class EndWallBlock extends WallBlock implements BlockPatterned { - + private final Block parent; - + public EndWallBlock(Block source) { - super(FabricBlockSettings.copyOf(source).nonOpaque()); + super(FabricBlockSettings.copyOf(source).noOcclusion()); this.parent = source; } @@ -28,14 +28,14 @@ public class EndWallBlock extends WallBlock implements BlockPatterned { public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { ResourceLocation blockId = Registry.BLOCK.getKey(this); ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(this); @@ -51,7 +51,7 @@ public class EndWallBlock extends WallBlock implements BlockPatterned { } return Patterns.createJson(Patterns.BLOCK_WALL_POST, parentId.getPath(), blockId.getPath()); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_WALL; diff --git a/src/main/java/ru/betterend/blocks/basis/EndWallPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/EndWallPlantBlock.java index 25848862..69357296 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndWallPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndWallPlantBlock.java @@ -7,87 +7,95 @@ import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.AbstractBlock; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.HorizontalFacingBlock; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.item.ItemPlacementContext; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.DirectionProperty; -import net.minecraft.util.BlockMirror; -import net.minecraft.world.level.block.Rotation; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.util.BlocksHelper; public class EndWallPlantBlock extends EndPlantBlock { - private static final EnumMap SHAPES = Maps.newEnumMap(ImmutableMap.of(Direction.NORTH, - Block.createCuboidShape(1, 1, 8, 15, 15, 16), Direction.SOUTH, Block.createCuboidShape(1, 1, 0, 15, 15, 8), - Direction.WEST, Block.createCuboidShape(8, 1, 1, 16, 15, 15), Direction.EAST, - Block.createCuboidShape(0, 1, 1, 8, 15, 15))); - public static final DirectionProperty FACING = HorizontalFacingBlock.FACING; - + private static final EnumMap SHAPES = Maps.newEnumMap(ImmutableMap.of( + Direction.NORTH, Block.box(1, 1, 8, 15, 15, 16), + Direction.SOUTH, Block.box(1, 1, 0, 15, 15, 8), + Direction.WEST, Block.box(8, 1, 1, 16, 15, 15), + Direction.EAST, Block.box(0, 1, 1, 8, 15, 15))); + public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING; + public EndWallPlantBlock() { - this(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).sounds(SoundType.GRASS) - .breakByHand(true).noCollision()); + this(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.GRASS) + .noCollission()); } - + public EndWallPlantBlock(int light) { - this(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).sounds(SoundType.GRASS) - .luminance(light).breakByHand(true).noCollision()); + this(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .luminance(light) + .sound(SoundType.GRASS) + .noCollission()); } - + public EndWallPlantBlock(Properties settings) { super(settings); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(FACING); } @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPES.get(state.getValue(FACING)); } @Override - public AbstractBlock.OffsetType getOffsetType() { - return AbstractBlock.OffsetType.NONE; + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.NONE; } @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { Direction direction = (Direction) state.getValue(FACING); BlockPos blockPos = pos.relative(direction.getOpposite()); BlockState blockState = world.getBlockState(blockPos); return isSupport(world, blockPos, blockState, direction); } - - public boolean isSupport(WorldView world, BlockPos pos, BlockState blockState, Direction direction) { - return blockState.getMaterial().isSolid() && blockState.isSideSolidFullSquare(world, pos, direction); + + public boolean isSupport(LevelReader world, BlockPos pos, BlockState blockState, Direction direction) { + return blockState.getMaterial().isSolid() && blockState.isFaceSturdy(world, pos, direction); } - + @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { + public BlockState getStateForPlacement(BlockPlaceContext ctx) { BlockState blockState = this.defaultBlockState(); - WorldView worldView = ctx.getLevel(); - BlockPos blockPos = ctx.getBlockPos(); - Direction[] directions = ctx.getPlacementDirections(); + LevelReader worldView = ctx.getLevel(); + BlockPos blockPos = ctx.getClickedPos(); + Direction[] directions = ctx.getNearestLookingDirections(); for (int i = 0; i < directions.length; ++i) { Direction direction = directions[i]; if (direction.getAxis().isHorizontal()) { Direction direction2 = direction.getOpposite(); - blockState = blockState.with(FACING, direction2); - if (blockState.canPlaceAt(worldView, blockPos)) { + blockState = blockState.setValue(FACING, direction2); + if (blockState.canSurvive(worldView, blockPos)) { return blockState; } } @@ -96,22 +104,22 @@ public class EndWallPlantBlock extends EndPlantBlock { } @Override - public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, - BlockPos pos, BlockPos neighborPos) { - if (!canPlaceAt(state, world, pos)) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) { return Blocks.AIR.defaultBlockState(); - } else { + } + else { return state; } } - + @Override public BlockState rotate(BlockState state, Rotation rotation) { return BlocksHelper.rotateHorizontal(state, rotation, FACING); } @Override - public BlockState mirror(BlockState state, BlockMirror mirror) { + public BlockState mirror(BlockState state, Mirror mirror) { return BlocksHelper.mirrorHorizontal(state, mirror, FACING); } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndWoodenButtonBlock.java b/src/main/java/ru/betterend/blocks/basis/EndWoodenButtonBlock.java index 67493ed2..a2455f6d 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndWoodenButtonBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndWoodenButtonBlock.java @@ -5,21 +5,21 @@ import java.util.Collections; import java.util.List; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.WoodenButtonBlock; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.WoodButtonBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -public class EndWoodenButtonBlock extends WoodenButtonBlock implements BlockPatterned { +public class EndWoodenButtonBlock extends WoodButtonBlock implements BlockPatterned { private final Block parent; - + public EndWoodenButtonBlock(Block source) { - super(FabricBlockSettings.copyOf(source).strength(0.5F, 0.5F).nonOpaque()); + super(FabricBlockSettings.copyOf(source).strength(0.5F, 0.5F).noOcclusion()); this.parent = source; } @@ -27,14 +27,14 @@ public class EndWoodenButtonBlock extends WoodenButtonBlock implements BlockPatt public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Override public String getStatesPattern(Reader data) { ResourceLocation blockId = Registry.BLOCK.getKey(this); ResourceLocation parentId = Registry.BLOCK.getKey(parent); return Patterns.createJson(data, parentId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(this); @@ -47,7 +47,7 @@ public class EndWoodenButtonBlock extends WoodenButtonBlock implements BlockPatt } return Patterns.createJson(Patterns.BLOCK_BUTTON, parentId.getPath(), blockId.getPath()); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_BUTTON; diff --git a/src/main/java/ru/betterend/blocks/basis/EndWoodenPlateBlock.java b/src/main/java/ru/betterend/blocks/basis/EndWoodenPlateBlock.java index 005eba94..90454903 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndWoodenPlateBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndWoodenPlateBlock.java @@ -4,6 +4,6 @@ import net.minecraft.world.level.block.Block; public class EndWoodenPlateBlock extends EndPlateBlock { public EndWoodenPlateBlock(Block source) { - super(ActivationRule.EVERYTHING, source); + super(Sensitivity.EVERYTHING, source); } } diff --git a/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java b/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java index d0527ed8..b5b4b11c 100644 --- a/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java @@ -4,97 +4,105 @@ import java.io.Reader; import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.Fertilizable; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Registry; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.BonemealableBlock; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.Patterns; import ru.betterend.registry.EndTags; -public abstract class FeatureSaplingBlock extends BlockBaseNotFull implements Fertilizable, IRenderTypeable { - private static final VoxelShape SHAPE = Block.createCuboidShape(4, 0, 4, 12, 14, 12); - +public abstract class FeatureSaplingBlock extends BlockBaseNotFull implements BonemealableBlock, IRenderTypeable { + private static final VoxelShape SHAPE = Block.box(4, 0, 4, 12, 14, 12); + public FeatureSaplingBlock() { - super(FabricBlockSettings.of(Material.PLANT).breakByHand(true).collidable(false).breakInstantly() - .sounds(SoundType.GRASS).ticksRandomly()); + super(FabricBlockSettings.of(Material.PLANT) + .breakByHand(true) + .collidable(false) + .instabreak() + .sound(SoundType.GRASS) + .randomTicks()); } - + public FeatureSaplingBlock(int light) { - super(FabricBlockSettings.of(Material.PLANT).breakByHand(true).collidable(false).breakInstantly() - .sounds(SoundType.GRASS).luminance(light).ticksRandomly()); + super(FabricBlockSettings.of(Material.PLANT) + .breakByHand(true) + .collidable(false) + .luminance(light) + .instabreak() + .sound(SoundType.GRASS) + .randomTicks()); } - + protected abstract Feature getFeature(); @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPE; } @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return world.getBlockState(pos.below()).isIn(EndTags.END_GROUND); + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + return world.getBlockState(pos.below()).is(EndTags.END_GROUND); } @Override - public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, - BlockPos pos, BlockPos neighborPos) { - if (!canPlaceAt(state, world, pos)) + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) return Blocks.AIR.defaultBlockState(); else return state; } @Override - public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { return true; } @Override - public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return random.nextInt(16) == 0; } @Override - public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { - getFeature().place(world, world.getChunkManager().getChunkGenerator(), random, pos, null); + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { + getFeature().place(world, world.getChunkSource().getGenerator(), random, pos, null); } @Override - public void scheduledTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { - super.scheduledTick(state, world, pos, random); - if (canGrow(world, random, pos, state)) { - grow(world, random, pos, state); + public void tick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + super.tick(state, world, pos, random); + if (isBonemealSuccess(world, random, pos, state)) { + performBonemeal(world, random, pos, state); } } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override public String getStatesPattern(Reader data) { ResourceLocation blockId = Registry.BLOCK.getKey(this); return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); } - + @Override public String getModelPattern(String block) { if (block.contains("item")) { @@ -103,7 +111,7 @@ public abstract class FeatureSaplingBlock extends BlockBaseNotFull implements Fe } return Patterns.createJson(Patterns.BLOCK_CROSS, block); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_SAPLING; diff --git a/src/main/java/ru/betterend/blocks/basis/FurBlock.java b/src/main/java/ru/betterend/blocks/basis/FurBlock.java index bc516a93..01e4ef2c 100644 --- a/src/main/java/ru/betterend/blocks/basis/FurBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/FurBlock.java @@ -8,21 +8,21 @@ import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.item.enchantment.Enchantments; -import net.minecraft.world.level.ItemLike; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.world.level.block.SoundType; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.util.MHelper; @@ -31,50 +31,58 @@ public class FurBlock extends AttachedBlock implements IRenderTypeable { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); private final ItemLike drop; private final int dropChance; - + public FurBlock(ItemLike drop, int light, int dropChance, boolean wet) { - super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT).breakByTool(FabricToolTags.SHEARS) - .sounds(wet ? SoundType.WET_GRASS : SoundType.GRASS).luminance(light).breakByHand(true).noCollision()); + super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .luminance(light) + .sound(wet ? SoundType.WET_GRASS : SoundType.GRASS) + .noCollission()); this.drop = drop; this.dropChance = dropChance; } - + public FurBlock(ItemLike drop, int dropChance) { - super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT).breakByTool(FabricToolTags.SHEARS) - .sounds(SoundType.GRASS).breakByHand(true).noCollision()); + super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.GRASS) + .noCollission()); this.drop = drop; this.dropChance = dropChance; } @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return BOUNDING_SHAPES.get(state.getValue(FACING)); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); - if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) - || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Lists.newArrayList(new ItemStack(this)); - } else if (dropChance < 1 || MHelper.RANDOM.nextInt(dropChance) == 0) { + } + else if (dropChance < 1 || MHelper.RANDOM.nextInt(dropChance) == 0) { return Lists.newArrayList(new ItemStack(drop)); - } else { + } + else { return Lists.newArrayList(); } } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + static { - BOUNDING_SHAPES.put(Direction.UP, VoxelShapes.cuboid(0.0, 0.0, 0.0, 1.0, 0.5, 1.0)); - BOUNDING_SHAPES.put(Direction.DOWN, VoxelShapes.cuboid(0.0, 0.5, 0.0, 1.0, 1.0, 1.0)); - BOUNDING_SHAPES.put(Direction.NORTH, VoxelShapes.cuboid(0.0, 0.0, 0.5, 1.0, 1.0, 1.0)); - BOUNDING_SHAPES.put(Direction.SOUTH, VoxelShapes.cuboid(0.0, 0.0, 0.0, 1.0, 1.0, 0.5)); - BOUNDING_SHAPES.put(Direction.WEST, VoxelShapes.cuboid(0.5, 0.0, 0.0, 1.0, 1.0, 1.0)); - BOUNDING_SHAPES.put(Direction.EAST, VoxelShapes.cuboid(0.0, 0.0, 0.0, 0.5, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.UP, Shapes.box(0.0, 0.0, 0.0, 1.0, 0.5, 1.0)); + BOUNDING_SHAPES.put(Direction.DOWN, Shapes.box(0.0, 0.5, 0.0, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.NORTH, Shapes.box(0.0, 0.0, 0.5, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.SOUTH, Shapes.box(0.0, 0.0, 0.0, 1.0, 1.0, 0.5)); + BOUNDING_SHAPES.put(Direction.WEST, Shapes.box(0.5, 0.0, 0.0, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.EAST, Shapes.box(0.0, 0.0, 0.0, 0.5, 1.0, 1.0)); } } diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index f884d6ef..cf0dbfd8 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -11,33 +11,33 @@ import org.jetbrains.annotations.Nullable; import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.BlockEntityProvider; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemPlacementContext; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.EnumProperty; -import net.minecraft.tags.BlockTags; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.hit.BlockHitResult; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Registry; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.PedestalState; import ru.betterend.blocks.InfusionPedestal; @@ -46,18 +46,18 @@ import ru.betterend.patterns.Patterns; import ru.betterend.registry.EndBlocks; import ru.betterend.rituals.InfusionRitual; -public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvider { +public class PedestalBlock extends BlockBaseNotFull implements EntityBlock { public final static EnumProperty STATE = BlockProperties.PEDESTAL_STATE; public static final BooleanProperty HAS_ITEM = BlockProperties.HAS_ITEM; public static final BooleanProperty HAS_LIGHT = BlockProperties.HAS_LIGHT; - + private static final VoxelShape SHAPE_DEFAULT; private static final VoxelShape SHAPE_COLUMN; private static final VoxelShape SHAPE_PILLAR; private static final VoxelShape SHAPE_PEDESTAL_TOP; private static final VoxelShape SHAPE_COLUMN_TOP; private static final VoxelShape SHAPE_BOTTOM; - + /** * * Register new Pedestal block with Better End mod id. @@ -69,7 +69,7 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid public static Block registerPedestal(String name, Block source) { return EndBlocks.registerBlock(name, new PedestalBlock(source)); } - + /** * * Register new Pedestal block with specified mod id. @@ -81,58 +81,54 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid public static Block registerPedestal(ResourceLocation id, Block source) { return EndBlocks.registerBlock(id, new PedestalBlock(source)); } - + protected final Block parent; protected float height = 1.0F; - + public PedestalBlock(Block parent) { - super(FabricBlockSettings.copyOf(parent).luminance(state -> state.getValue(HAS_LIGHT) ? 12 : 0)); - this.setDefaultState(stateManager.defaultBlockState().with(STATE, PedestalState.DEFAULT).with(HAS_ITEM, false) - .with(HAS_LIGHT, false)); + super(FabricBlockSettings.copyOf(parent).lightLevel(state -> state.getValue(HAS_LIGHT) ? 12 : 0)); + this.registerDefaultState(stateDefinition.any().setValue(STATE, PedestalState.DEFAULT).setValue(HAS_ITEM, false).setValue(HAS_LIGHT, false)); this.parent = parent; } - + public float getHeight(BlockState state) { if (state.getBlock() instanceof PedestalBlock && state.getValue(STATE) == PedestalState.PEDESTAL_TOP) { return this.height - 0.2F; } return this.height; } - + @Override - public ActionResult onUse(BlockState state, Level world, BlockPos pos, Player player, Hand hand, - BlockHitResult hit) { - if (world.isClientSide || !state.is(this)) - return ActionResult.CONSUME; + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + if (world.isClientSide || !state.is(this)) return InteractionResult.CONSUME; if (!isPlaceable(state)) { - return ActionResult.PASS; + return InteractionResult.PASS; } BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof PedestalBlockEntity) { PedestalBlockEntity pedestal = (PedestalBlockEntity) blockEntity; if (pedestal.isEmpty()) { - ItemStack itemStack = player.getStackInHand(hand); - if (itemStack.isEmpty()) - return ActionResult.CONSUME; - pedestal.setStack(0, itemStack.split(1)); + ItemStack itemStack = player.getItemInHand(hand); + if (itemStack.isEmpty()) return InteractionResult.CONSUME; + pedestal.setItem(0, itemStack.split(1)); checkRitual(world, pos); - return ActionResult.SUCCESS; + return InteractionResult.SUCCESS; } else { - ItemStack itemStack = pedestal.getStack(0); - if (player.giveItemStack(itemStack)) { - pedestal.removeStack(0); + ItemStack itemStack = pedestal.getItem(0); + if (player.addItem(itemStack)) { + pedestal.removeItemNoUpdate(0); checkRitual(world, pos); - return ActionResult.SUCCESS; + return InteractionResult.SUCCESS; } - return ActionResult.FAIL; + return InteractionResult.FAIL; } } - return ActionResult.PASS; + return InteractionResult.PASS; } - + public void checkRitual(Level world, BlockPos pos) { MutableBlockPos posMutable = new MutableBlockPos(); - for (Point point : InfusionRitual.getMap()) { + for (Point point: InfusionRitual.getMap()) { posMutable.set(pos).move(point.x, 0, point.y); BlockState state = world.getBlockState(posMutable); if (state.getBlock() instanceof InfusionPedestal) { @@ -141,93 +137,85 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid } } } - + @Override @Nullable - public BlockState getPlacementState(ItemPlacementContext context) { + public BlockState getStateForPlacement(BlockPlaceContext context) { Level world = context.getLevel(); - BlockPos pos = context.getBlockPos(); - BlockState upState = world.getBlockState(pos.up()); + BlockPos pos = context.getClickedPos(); + BlockState upState = world.getBlockState(pos.above()); BlockState downState = world.getBlockState(pos.below()); - boolean upSideSolid = upState.isSideSolidFullSquare(world, pos.up(), Direction.DOWN) - || upState.isIn(BlockTags.WALLS); + boolean upSideSolid = upState.isFaceSturdy(world, pos.above(), Direction.DOWN) || upState.is(BlockTags.WALLS); boolean hasPedestalOver = upState.getBlock() instanceof PedestalBlock; boolean hasPedestalUnder = downState.getBlock() instanceof PedestalBlock; if (!hasPedestalOver && hasPedestalUnder && upSideSolid) { - return getDefaultState().with(STATE, PedestalState.COLUMN_TOP); + return defaultBlockState().setValue(STATE, PedestalState.COLUMN_TOP); } else if (!hasPedestalOver && !hasPedestalUnder && upSideSolid) { - return getDefaultState().with(STATE, PedestalState.COLUMN); + return defaultBlockState().setValue(STATE, PedestalState.COLUMN); } else if (hasPedestalUnder && hasPedestalOver) { - return getDefaultState().with(STATE, PedestalState.PILLAR); + return defaultBlockState().setValue(STATE, PedestalState.PILLAR); } else if (hasPedestalUnder) { - return getDefaultState().with(STATE, PedestalState.PEDESTAL_TOP); + return defaultBlockState().setValue(STATE, PedestalState.PEDESTAL_TOP); } else if (hasPedestalOver) { - return getDefaultState().with(STATE, PedestalState.BOTTOM); + return defaultBlockState().setValue(STATE, PedestalState.BOTTOM); } - return getDefaultState(); + return defaultBlockState(); } - + @Override - public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, - BlockPos pos, BlockPos posFrom) { + public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { BlockState updated = getUpdatedState(state, direction, newState, world, pos, posFrom); - if (!updated.is(this)) - return updated; + if (!updated.is(this)) return updated; if (!isPlaceable(updated)) { moveStoredStack(world, updated, pos); } return updated; } - - private BlockState getUpdatedState(BlockState state, Direction direction, BlockState newState, LevelAccessor world, - BlockPos pos, BlockPos posFrom) { - if (!state.is(this)) - return state.updateShape(direction, newState, world, pos, posFrom); - if (direction != Direction.UP && direction != Direction.DOWN) - return state; - BlockState upState = world.getBlockState(pos.up()); + + private BlockState getUpdatedState(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { + if (!state.is(this)) return state.updateShape(direction, newState, world, pos, posFrom); + if (direction != Direction.UP && direction != Direction.DOWN) return state; + BlockState upState = world.getBlockState(pos.above()); BlockState downState = world.getBlockState(pos.below()); - boolean upSideSolid = upState.isSideSolidFullSquare(world, pos.up(), Direction.DOWN) - || upState.isIn(BlockTags.WALLS); + boolean upSideSolid = upState.isFaceSturdy(world, pos.above(), Direction.DOWN) || upState.is(BlockTags.WALLS); boolean hasPedestalOver = upState.getBlock() instanceof PedestalBlock; boolean hasPedestalUnder = downState.getBlock() instanceof PedestalBlock; if (direction == Direction.UP) { - upSideSolid = newState.isSideSolidFullSquare(world, posFrom, Direction.DOWN) - || newState.isIn(BlockTags.WALLS); + upSideSolid = newState.isFaceSturdy(world, posFrom, Direction.DOWN) || newState.is(BlockTags.WALLS); hasPedestalOver = newState.getBlock() instanceof PedestalBlock; } else { hasPedestalUnder = newState.getBlock() instanceof PedestalBlock; } BlockState updatedState; if (!hasPedestalOver && hasPedestalUnder && upSideSolid) { - updatedState = state.with(STATE, PedestalState.COLUMN_TOP); + updatedState = state.setValue(STATE, PedestalState.COLUMN_TOP); } else if (!hasPedestalOver && !hasPedestalUnder && upSideSolid) { - updatedState = state.with(STATE, PedestalState.COLUMN); + updatedState = state.setValue(STATE, PedestalState.COLUMN); } else if (hasPedestalUnder && hasPedestalOver) { - updatedState = state.with(STATE, PedestalState.PILLAR); + updatedState = state.setValue(STATE, PedestalState.PILLAR); } else if (hasPedestalUnder) { - updatedState = state.with(STATE, PedestalState.PEDESTAL_TOP); + updatedState = state.setValue(STATE, PedestalState.PEDESTAL_TOP); } else if (hasPedestalOver) { - updatedState = state.with(STATE, PedestalState.BOTTOM); + updatedState = state.setValue(STATE, PedestalState.BOTTOM); } else { - updatedState = state.with(STATE, PedestalState.DEFAULT); + updatedState = state.setValue(STATE, PedestalState.DEFAULT); } if (!isPlaceable(updatedState)) { - updatedState = updatedState.with(HAS_ITEM, false).with(HAS_LIGHT, false); + updatedState = updatedState.setValue(HAS_ITEM, false).setValue(HAS_LIGHT, false); } return updatedState; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { List drop = Lists.newArrayList(super.getDrops(state, builder)); if (state.is(this)) { if (isPlaceable(state)) { - BlockEntity blockEntity = builder.getNullable(LootContextParams.BLOCK_ENTITY); + BlockEntity blockEntity = builder.getOptionalParameter(LootContextParams.BLOCK_ENTITY); if (blockEntity instanceof PedestalBlockEntity) { PedestalBlockEntity pedestal = (PedestalBlockEntity) blockEntity; if (!pedestal.isEmpty()) { - drop.add(pedestal.getStack(0)); + drop.add(pedestal.getItem(0)); } } } else { @@ -236,30 +224,30 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid } return drop; } - + private void moveStoredStack(LevelAccessor world, BlockState state, BlockPos pos) { BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof PedestalBlockEntity && state.is(this)) { PedestalBlockEntity pedestal = (PedestalBlockEntity) blockEntity; - ItemStack stack = pedestal.removeStack(0); + ItemStack stack = pedestal.removeItemNoUpdate(0); if (!stack.isEmpty()) { - moveStoredStack(blockEntity, world, stack, pos.up()); + moveStoredStack(blockEntity, world, stack, pos.above()); } } } - + private void moveStoredStack(BlockEntity blockEntity, LevelAccessor world, ItemStack stack, BlockPos pos) { BlockState state = world.getBlockState(pos); if (!state.is(this)) { dropStoredStack(blockEntity, stack, pos); } else if (state.getValue(STATE).equals(PedestalState.PILLAR)) { - moveStoredStack(blockEntity, world, stack, pos.up()); + moveStoredStack(blockEntity, world, stack, pos.above()); } else if (!isPlaceable(state)) { dropStoredStack(blockEntity, stack, pos); } else if (blockEntity instanceof PedestalBlockEntity) { PedestalBlockEntity pedestal = (PedestalBlockEntity) blockEntity; if (pedestal.isEmpty()) { - pedestal.setStack(0, stack); + pedestal.setItem(0, stack); } else { dropStoredStack(blockEntity, stack, pos); } @@ -267,91 +255,91 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid dropStoredStack(blockEntity, stack, pos); } } - + private void dropStoredStack(BlockEntity blockEntity, ItemStack stack, BlockPos pos) { if (blockEntity != null && blockEntity.getLevel() != null) { Level world = blockEntity.getLevel(); - Block.dropStack(world, getDropPos(world, pos), stack); + Block.popResource(world, getDropPos(world, pos), stack); } } - + private BlockPos getDropPos(LevelAccessor world, BlockPos pos) { BlockPos dropPos; if (world.getBlockState(pos).isAir()) { return pos; } - if (world.getBlockState(pos.up()).isAir()) { - return pos.up(); + if (world.getBlockState(pos.above()).isAir()) { + return pos.above(); } - for (int i = 2; i < Direction.values().length; i++) { - dropPos = pos.relative(Direction.byId(i)); + for(int i = 2; i < Direction.values().length; i++) { + dropPos = pos.relative(Direction.from3DDataValue(i)); if (world.getBlockState(dropPos).isAir()) { return dropPos.immutable(); } } - return getDropPos(world, pos.up()); + return getDropPos(world, pos.above()); } - + public boolean isPlaceable(BlockState state) { - if (!state.is(this)) - return false; + if (!state.is(this)) return false; PedestalState currentState = state.getValue(STATE); - return currentState == PedestalState.DEFAULT || currentState == PedestalState.PEDESTAL_TOP; + return currentState == PedestalState.DEFAULT || + currentState == PedestalState.PEDESTAL_TOP; } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { + public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { if (state.is(this)) { - switch (state.getValue(STATE)) { - case BOTTOM: { - return SHAPE_BOTTOM; - } - case PEDESTAL_TOP: { - return SHAPE_PEDESTAL_TOP; - } - case COLUMN_TOP: { - return SHAPE_COLUMN_TOP; - } - case PILLAR: { - return SHAPE_PILLAR; - } - case COLUMN: { - return SHAPE_COLUMN; - } - default: { - return SHAPE_DEFAULT; - } + switch(state.getValue(STATE)) { + case BOTTOM: { + return SHAPE_BOTTOM; + } + case PEDESTAL_TOP: { + return SHAPE_PEDESTAL_TOP; + } + case COLUMN_TOP: { + return SHAPE_COLUMN_TOP; + } + case PILLAR: { + return SHAPE_PILLAR; + } + case COLUMN: { + return SHAPE_COLUMN; + } + default: { + return SHAPE_DEFAULT; + } } } - return super.getOutlineShape(state, world, pos, context); + return super.getShape(state, world, pos, context); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(STATE, HAS_ITEM, HAS_LIGHT); } @Override - public BlockEntity createBlockEntity(BlockView world) { + public BlockEntity newBlockEntity(BlockGetter world) { return new PedestalBlockEntity(); } - + @Override - public boolean hasComparatorOutput(BlockState state) { + public boolean hasAnalogOutputSignal(BlockState state) { return state.getBlock() instanceof PedestalBlock; } - + @Override - public int getComparatorOutput(BlockState state, Level world, BlockPos pos) { + public int getAnalogOutputSignal(BlockState state, Level world, BlockPos pos) { return state.getValue(HAS_ITEM) ? 15 : 0; } - + @Override public String getStatesPattern(Reader data) { String texture = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, texture, texture); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(parent); @@ -359,7 +347,7 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid Map textures = new HashMap() { private static final long serialVersionUID = 1L; { - put("%mod%", blockId.getNamespace()); + put("%mod%", blockId.getNamespace() ); put("%top%", name + "_top"); put("%base%", name + "_base"); put("%pillar%", name + "_pillar"); @@ -379,28 +367,28 @@ public class PedestalBlock extends BlockBaseNotFull implements BlockEntityProvid } return Patterns.createJson(Patterns.BLOCK_PEDESTAL_DEFAULT, textures); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_PEDESTAL; } - + static { - VoxelShape basinUp = Block.createCuboidShape(2, 3, 2, 14, 4, 14); - VoxelShape basinDown = Block.createCuboidShape(0, 0, 0, 16, 3, 16); - VoxelShape columnTopUp = Block.createCuboidShape(1, 14, 1, 15, 16, 15); - VoxelShape columnTopDown = Block.createCuboidShape(2, 13, 2, 14, 14, 14); - VoxelShape pedestalTop = Block.createCuboidShape(1, 8, 1, 15, 10, 15); - VoxelShape pedestalDefault = Block.createCuboidShape(1, 12, 1, 15, 14, 15); - VoxelShape pillar = Block.createCuboidShape(3, 0, 3, 13, 8, 13); - VoxelShape pillarDefault = Block.createCuboidShape(3, 0, 3, 13, 12, 13); - VoxelShape columnTop = VoxelShapes.union(columnTopDown, columnTopUp); - VoxelShape basin = VoxelShapes.union(basinDown, basinUp); - SHAPE_PILLAR = Block.createCuboidShape(3, 0, 3, 13, 16, 13); - SHAPE_DEFAULT = VoxelShapes.union(basin, pillarDefault, pedestalDefault); - SHAPE_PEDESTAL_TOP = VoxelShapes.union(pillar, pedestalTop); - SHAPE_COLUMN_TOP = VoxelShapes.union(SHAPE_PILLAR, columnTop); - SHAPE_COLUMN = VoxelShapes.union(basin, SHAPE_PILLAR, columnTop); - SHAPE_BOTTOM = VoxelShapes.union(basin, SHAPE_PILLAR); + VoxelShape basinUp = Block.box(2, 3, 2, 14, 4, 14); + VoxelShape basinDown = Block.box(0, 0, 0, 16, 3, 16); + VoxelShape columnTopUp = Block.box(1, 14, 1, 15, 16, 15); + VoxelShape columnTopDown = Block.box(2, 13, 2, 14, 14, 14); + VoxelShape pedestalTop = Block.box(1, 8, 1, 15, 10, 15); + VoxelShape pedestalDefault = Block.box(1, 12, 1, 15, 14, 15); + VoxelShape pillar = Block.box(3, 0, 3, 13, 8, 13); + VoxelShape pillarDefault = Block.box(3, 0, 3, 13, 12, 13); + VoxelShape columnTop = Shapes.or(columnTopDown, columnTopUp); + VoxelShape basin = Shapes.or(basinDown, basinUp); + SHAPE_PILLAR = Block.box(3, 0, 3, 13, 16, 13); + SHAPE_DEFAULT = Shapes.or(basin, pillarDefault, pedestalDefault); + SHAPE_PEDESTAL_TOP = Shapes.or(pillar, pedestalTop); + SHAPE_COLUMN_TOP = Shapes.or(SHAPE_PILLAR, columnTop); + SHAPE_COLUMN = Shapes.or(basin, SHAPE_PILLAR, columnTop); + SHAPE_BOTTOM = Shapes.or(basin, SHAPE_PILLAR); } } diff --git a/src/main/java/ru/betterend/blocks/basis/SimpleLeavesBlock.java b/src/main/java/ru/betterend/blocks/basis/SimpleLeavesBlock.java index 145242a3..8fc9a20b 100644 --- a/src/main/java/ru/betterend/blocks/basis/SimpleLeavesBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/SimpleLeavesBlock.java @@ -3,50 +3,51 @@ package ru.betterend.blocks.basis; import java.io.Reader; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.material.Material; import net.minecraft.world.level.material.MaterialColor; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.Registry; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.Patterns; public class SimpleLeavesBlock extends BlockBaseNotFull implements IRenderTypeable { public SimpleLeavesBlock(MaterialColor color) { - super(FabricBlockSettings.of(Material.LEAVES).strength(0.2F).sounds(SoundType.GRASS).nonOpaque() - .allowsSpawning((state, world, pos, type) -> { - return false; - }).suffocates((state, world, pos) -> { - return false; - }).blockVision((state, world, pos) -> { - return false; - }).materialColor(color)); + super(FabricBlockSettings.of(Material.LEAVES) + .strength(0.2F) + .materialColor(color) + .sound(SoundType.GRASS) + .noOcclusion() + .isValidSpawn((state, world, pos, type) -> false) + .isSuffocating((state, world, pos) -> false) + .isViewBlocking((state, world, pos) -> false)); } - + public SimpleLeavesBlock(MaterialColor color, int light) { - super(FabricBlockSettings.of(Material.LEAVES).strength(0.2F).sounds(SoundType.GRASS).nonOpaque() - .luminance(light).allowsSpawning((state, world, pos, type) -> { - return false; - }).suffocates((state, world, pos) -> { - return false; - }).blockVision((state, world, pos) -> { - return false; - }).materialColor(color)); + super(FabricBlockSettings.of(Material.LEAVES) + .luminance(light) + .materialColor(color) + .strength(0.2F) + .sound(SoundType.GRASS) + .noOcclusion() + .isValidSpawn((state, world, pos, type) -> false) + .isSuffocating((state, world, pos) -> false) + .isViewBlocking((state, world, pos) -> false)); } - + @Override public String getStatesPattern(Reader data) { String texture = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(data, texture, texture); } - + @Override public String getModelPattern(String block) { String texture = Registry.BLOCK.getKey(this).getPath(); return Patterns.createJson(Patterns.BLOCK_BASE, texture, texture); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_SIMPLE; diff --git a/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java b/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java index 0de3cf81..4bcf8179 100644 --- a/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/StalactiteBlock.java @@ -1,48 +1,47 @@ package ru.betterend.blocks.basis; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.FluidFillable; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.level.block.Waterloggable; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.fluid.Fluid; -import net.minecraft.fluid.FluidState; -import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.item.ItemPlacementContext; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.world.level.block.state.properties.IntegerProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; -import net.minecraft.util.Mth; import net.minecraft.core.Registry; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LiquidBlockContainer; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.BlockProperties; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.Patterns; -public class StalactiteBlock extends BlockBaseNotFull implements Waterloggable, FluidFillable, IRenderTypeable { - public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; +public class StalactiteBlock extends BlockBaseNotFull implements SimpleWaterloggedBlock, LiquidBlockContainer, IRenderTypeable { + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; public static final BooleanProperty IS_FLOOR = BlockProperties.IS_FLOOR; public static final IntegerProperty SIZE = BlockProperties.SIZE; private static final VoxelShape[] SHAPES; public StalactiteBlock(Block source) { - super(FabricBlockSettings.copy(source).nonOpaque()); - this.setDefaultState( - getStateManager().defaultBlockState().with(SIZE, 0).with(IS_FLOOR, true).with(WATERLOGGED, false)); + super(FabricBlockSettings.copy(source).noOcclusion()); + this.registerDefaultState(getStateDefinition().any().setValue(SIZE, 0).setValue(IS_FLOOR, true).setValue(WATERLOGGED, false)); } @Override @@ -51,137 +50,147 @@ public class StalactiteBlock extends BlockBaseNotFull implements Waterloggable, } @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPES[state.getValue(SIZE)]; } - + @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - WorldView world = ctx.getLevel(); - BlockPos pos = ctx.getBlockPos(); - Direction dir = ctx.getSide(); - boolean water = world.getFluidState(pos).getFluid() == Fluids.WATER; - + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + LevelReader world = ctx.getLevel(); + BlockPos pos = ctx.getClickedPos(); + Direction dir = ctx.getClickedFace(); + boolean water = world.getFluidState(pos).getType() == Fluids.WATER; + if (dir == Direction.DOWN) { - if (isThis(world, pos.up()) || sideCoversSmallSquare(world, pos.up(), Direction.DOWN)) { - return getDefaultState().with(IS_FLOOR, false).with(WATERLOGGED, water); - } else if (isThis(world, pos.below()) || sideCoversSmallSquare(world, pos.below(), Direction.UP)) { - return getDefaultState().with(IS_FLOOR, true).with(WATERLOGGED, water); - } else { + if (isThis(world, pos.above()) || canSupportCenter(world, pos.above(), Direction.DOWN)) { + return defaultBlockState().setValue(IS_FLOOR, false).setValue(WATERLOGGED, water); + } + else if (isThis(world, pos.below()) || canSupportCenter(world, pos.below(), Direction.UP)) { + return defaultBlockState().setValue(IS_FLOOR, true).setValue(WATERLOGGED, water); + } + else { return null; } - } else { - if (isThis(world, pos.below()) || sideCoversSmallSquare(world, pos.below(), Direction.UP)) { - return getDefaultState().with(IS_FLOOR, true).with(WATERLOGGED, water); - } else if (isThis(world, pos.up()) || sideCoversSmallSquare(world, pos.up(), Direction.DOWN)) { - return getDefaultState().with(IS_FLOOR, false).with(WATERLOGGED, water); - } else { + } + else { + if (isThis(world, pos.below()) || canSupportCenter(world, pos.below(), Direction.UP)) { + return defaultBlockState().setValue(IS_FLOOR, true).setValue(WATERLOGGED, water); + } + else if (isThis(world, pos.above()) || canSupportCenter(world, pos.above(), Direction.DOWN)) { + return defaultBlockState().setValue(IS_FLOOR, false).setValue(WATERLOGGED, water); + } + else { return null; } } } @Override - public void onPlaced(Level world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { - boolean hasUp = isThis(world, pos.up()); + public void setPlacedBy(Level world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { + boolean hasUp = isThis(world, pos.above()); boolean hasDown = isThis(world, pos.below()); MutableBlockPos mut = new MutableBlockPos(); if (hasUp && hasDown) { boolean floor = state.getValue(IS_FLOOR); - BlockPos second = floor ? pos.up() : pos.below(); + BlockPos second = floor ? pos.above() : pos.below(); BlockState bState = world.getBlockState(second); - world.setBlockAndUpdate(pos, state.with(SIZE, 1).with(IS_FLOOR, floor)); - world.setBlockAndUpdate(second, bState.with(SIZE, 1).with(IS_FLOOR, !floor)); - + world.setBlockAndUpdate(pos, state.setValue(SIZE, 1).setValue(IS_FLOOR, floor)); + world.setBlockAndUpdate(second, bState.setValue(SIZE, 1).setValue(IS_FLOOR, !floor)); + bState = state; int startSize = floor ? 1 : 2; mut.set(pos.getX(), pos.getY() + 1, pos.getZ()); for (int i = 0; i < 8 && isThis(bState); i++) { - world.setBlockAndUpdate(mut, bState.with(SIZE, startSize++).with(IS_FLOOR, false)); + world.setBlockAndUpdate(mut, bState.setValue(SIZE, startSize++).setValue(IS_FLOOR, false)); mut.setY(mut.getY() + 1); bState = world.getBlockState(mut); } - + bState = state; startSize = floor ? 2 : 1; mut.set(pos.getX(), pos.getY() - 1, pos.getZ()); for (int i = 0; i < 8 && isThis(bState); i++) { - world.setBlockAndUpdate(mut, bState.with(SIZE, startSize++).with(IS_FLOOR, true)); + world.setBlockAndUpdate(mut, bState.setValue(SIZE, startSize++).setValue(IS_FLOOR, true)); mut.setY(mut.getY() - 1); bState = world.getBlockState(mut); } - } else if (hasDown) { + } + else if (hasDown) { mut.setX(pos.getX()); mut.setZ(pos.getZ()); for (int i = 1; i < 8; i++) { mut.setY(pos.getY() - i); if (isThis(world, mut)) { BlockState state2 = world.getBlockState(mut); - int size = state2.get(SIZE); + int size = state2.getValue(SIZE); if (size < i) { - world.setBlockAndUpdate(mut, state2.with(SIZE, i).with(IS_FLOOR, true)); - } else { + world.setBlockAndUpdate(mut, state2.setValue(SIZE, i).setValue(IS_FLOOR, true)); + } + else { break; } - } else { + } + else { break; } } - } else if (hasUp) { + } + else if (hasUp) { mut.setX(pos.getX()); mut.setZ(pos.getZ()); for (int i = 1; i < 8; i++) { mut.setY(pos.getY() + i); if (isThis(world, mut)) { BlockState state2 = world.getBlockState(mut); - int size = state2.get(SIZE); + int size = state2.getValue(SIZE); if (size < i) { - world.setBlockAndUpdate(mut, state2.with(SIZE, i).with(IS_FLOOR, false)); - } else { + world.setBlockAndUpdate(mut, state2.setValue(SIZE, i).setValue(IS_FLOOR, false)); + } + else { break; } - } else { + } + else { break; } } } } - - private boolean isThis(WorldView world, BlockPos pos) { + + private boolean isThis(LevelReader world, BlockPos pos) { return isThis(world.getBlockState(pos)); } - + private boolean isThis(BlockState state) { return state.getBlock() instanceof StalactiteBlock; } - + @Override - public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, - BlockPos pos, BlockPos neighborPos) { - if (!canPlaceAt(state, world, pos)) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) { return Blocks.AIR.defaultBlockState(); } return state; } @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { int size = state.getValue(SIZE); return checkUp(world, pos, size) || checkDown(world, pos, size); } - - private boolean checkUp(BlockView world, BlockPos pos, int size) { - BlockPos p = pos.up(); + + private boolean checkUp(BlockGetter world, BlockPos pos, int size) { + BlockPos p = pos.above(); BlockState state = world.getBlockState(p); - return (isThis(state) && state.getValue(SIZE) >= size) || state.isFullCube(world, p); + return (isThis(state) && state.getValue(SIZE) >= size) || state.isCollisionShapeFullBlock(world, p); } - - private boolean checkDown(BlockView world, BlockPos pos, int size) { + + private boolean checkDown(BlockGetter world, BlockPos pos, int size) { BlockPos p = pos.below(); BlockState state = world.getBlockState(p); - return (isThis(state) && state.getValue(SIZE) >= size) || state.isFullCube(world, p); + return (isThis(state) && state.getValue(SIZE) >= size) || state.isCollisionShapeFullBlock(world, p); } - + @Override public String getModelPattern(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(this); @@ -190,25 +199,25 @@ public class StalactiteBlock extends BlockBaseNotFull implements Waterloggable, } return Patterns.createJson(Patterns.BLOCK_CROSS_SHADED, block); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_STALACTITE; } - + @Override - public boolean canFillWithFluid(BlockView world, BlockPos pos, BlockState state, Fluid fluid) { + public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { return false; } @Override - public boolean tryFillWithFluid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { + public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { return false; } - + @Override public FluidState getFluidState(BlockState state) { - return state.getValue(WATERLOGGED) ? Fluids.WATER.getStill(false) : Fluids.EMPTY.defaultBlockState(); + return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : Fluids.EMPTY.defaultFluidState(); } @Override @@ -222,7 +231,7 @@ public class StalactiteBlock extends BlockBaseNotFull implements Waterloggable, SHAPES = new VoxelShape[8]; for (int i = 0; i < 8; i++) { int side = Mth.floor(Mth.lerp(i / 7F, start, end) * 8F + 0.5F); - SHAPES[i] = Block.createCuboidShape(side, 0, side, 16 - side, 16, 16 - side); + SHAPES[i] = Block.box(side, 0, side, 16 - side, 16, 16 - side); } } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java b/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java index 01afe546..8488dca9 100644 --- a/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java @@ -3,34 +3,34 @@ package ru.betterend.blocks.basis; import java.io.Reader; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.ShapeContext; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.BlockPos; -import net.minecraft.util.Mth; -import net.minecraft.core.Vec3i; import net.minecraft.core.Registry; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.core.Vec3i; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.AuroraCrystalBlock; import ru.betterend.interfaces.IColorProvider; import ru.betterend.patterns.Patterns; import ru.betterend.util.MHelper; public class StoneLanternBlock extends EndLanternBlock implements IColorProvider { - private static final VoxelShape SHAPE_CEIL = Block.createCuboidShape(3, 1, 3, 13, 16, 13); - private static final VoxelShape SHAPE_FLOOR = Block.createCuboidShape(3, 0, 3, 13, 15, 13); + private static final VoxelShape SHAPE_CEIL = Block.box(3, 1, 3, 13, 16, 13); + private static final VoxelShape SHAPE_FLOOR = Block.box(3, 0, 3, 13, 15, 13); private static final Vec3i[] COLORS = AuroraCrystalBlock.COLORS; - + public StoneLanternBlock(Block source) { super(FabricBlockSettings.copyOf(source).luminance(15)); } - + @Override - public BlockColor getBlockProvider() { + public BlockColor getProvider() { return (state, world, pos, tintIndex) -> { long i = (long) pos.getX() + (long) pos.getY() + (long) pos.getZ(); double delta = i * 0.1; @@ -38,14 +38,14 @@ public class StoneLanternBlock extends EndLanternBlock implements IColorProvider int index2 = (index + 1) & 3; delta -= index; index &= 3; - + Vec3i color1 = COLORS[index]; Vec3i color2 = COLORS[index2]; - + int r = MHelper.floor(Mth.lerp(delta, color1.getX(), color2.getX())); int g = MHelper.floor(Mth.lerp(delta, color1.getY(), color2.getY())); int b = MHelper.floor(Mth.lerp(delta, color1.getZ(), color2.getZ())); - + return MHelper.color(r, g, b); }; } @@ -56,17 +56,17 @@ public class StoneLanternBlock extends EndLanternBlock implements IColorProvider return MHelper.color(COLORS[3].getX(), COLORS[3].getY(), COLORS[3].getZ()); }; } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return state.getValue(IS_FLOOR) ? SHAPE_FLOOR : SHAPE_CEIL; } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_STONE_LANTERN; } - + @Override public String getModelPattern(String block) { String texture = Registry.BLOCK.getKey(this).getPath(); @@ -75,7 +75,7 @@ public class StoneLanternBlock extends EndLanternBlock implements IColorProvider } return Patterns.createJson(Patterns.BLOCK_STONE_LANTERN_FLOOR, texture, texture); } - + @Override public String getStatesPattern(Reader data) { String block = Registry.BLOCK.getKey(this).getPath(); diff --git a/src/main/java/ru/betterend/blocks/basis/StrippableBarkBlock.java b/src/main/java/ru/betterend/blocks/basis/StrippableBarkBlock.java index f913b3d4..d70f0d5f 100644 --- a/src/main/java/ru/betterend/blocks/basis/StrippableBarkBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/StrippableBarkBlock.java @@ -2,42 +2,40 @@ package ru.betterend.blocks.basis; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.RotatedPillarBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.MaterialColor; -import net.minecraft.world.level.block.RotatedPillarBlock; -import net.minecraft.world.entity.player.Player; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.sounds.SoundSource; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; public class StrippableBarkBlock extends BarkBlock { private final Block striped; - + public StrippableBarkBlock(MaterialColor color, Block striped) { super(FabricBlockSettings.copyOf(striped).materialColor(color)); this.striped = striped; } - + @Override - public ActionResult onUse(BlockState state, Level world, BlockPos pos, Player player, Hand hand, - BlockHitResult hit) { - if (player.getMainHandStack().getItem().isIn(FabricToolTags.AXES)) { - world.playLocalSound(player, pos, SoundEvents.ITEM_AXE_STRIP, SoundSource.BLOCKS, 1.0F, 1.0F); + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + if (player.getMainHandItem().getItem().is(FabricToolTags.AXES)) { + world.playSound(player, pos, SoundEvents.AXE_STRIP, SoundSource.BLOCKS, 1.0F, 1.0F); if (!world.isClientSide) { - world.setBlockAndUpdate(pos, striped.defaultBlockState().with(RotatedPillarBlock.AXIS, - state.getValue(RotatedPillarBlock.AXIS)), 11); + world.setBlock(pos, striped.defaultBlockState().setValue(RotatedPillarBlock.AXIS, state.getValue(RotatedPillarBlock.AXIS)), 11); if (player != null && !player.isCreative()) { - player.getMainHandStack().damage(1, world.random, (ServerPlayer) player); + player.getMainHandItem().hurt(1, world.random, (ServerPlayer) player); } } - return ActionResult.SUCCESS; + return InteractionResult.SUCCESS; } - return ActionResult.FAIL; + return InteractionResult.FAIL; } } diff --git a/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java index 2ecdbee6..3144d336 100644 --- a/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java @@ -2,27 +2,25 @@ package ru.betterend.blocks.basis; import java.util.Map; import java.util.Random; - -import com.google.common.collect.Maps; - -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.MaterialColor; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemPlacementContext; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.EnumProperty; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.hit.BlockHitResult; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.Level; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.phys.BlockHitResult; +import com.google.common.collect.Maps; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.EndTerrainBlock; @@ -30,25 +28,24 @@ import ru.betterend.patterns.Patterns; public class TripleTerrainBlock extends EndTerrainBlock { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; - + public TripleTerrainBlock(MaterialColor color) { super(color); - this.setDefaultState(this.defaultBlockState().with(SHAPE, TripleShape.BOTTOM)); + this.registerDefaultState(this.defaultBlockState().setValue(SHAPE, TripleShape.BOTTOM)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE); } - + @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - Direction dir = ctx.getSide(); - TripleShape shape = dir == Direction.UP ? TripleShape.BOTTOM - : dir == Direction.DOWN ? TripleShape.TOP : TripleShape.MIDDLE; - return this.defaultBlockState().with(SHAPE, shape); + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + Direction dir = ctx.getClickedFace(); + TripleShape shape = dir == Direction.UP ? TripleShape.BOTTOM : dir == Direction.DOWN ? TripleShape.TOP : TripleShape.MIDDLE; + return this.defaultBlockState().setValue(SHAPE, shape); } - + @Override public String getModelPattern(String block) { String name = Registry.BLOCK.getKey(this).getPath(); @@ -61,59 +58,64 @@ public class TripleTerrainBlock extends EndTerrainBlock { map.put("%bottom%", "minecraft:block/end_stone"); return Patterns.createJson(Patterns.BLOCK_TOP_SIDE_BOTTOM, map); } - + @Override public ResourceLocation statePatternId() { return Patterns.STATE_TRIPLE_ROTATED_TOP; } - + @Override - public ActionResult onUse(BlockState state, Level world, BlockPos pos, Player player, Hand hand, - BlockHitResult hit) { + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { TripleShape shape = state.getValue(SHAPE); if (shape == TripleShape.BOTTOM) { - return super.onUse(state, world, pos, player, hand, hit); + return super.use(state, world, pos, player, hand, hit); } - return ActionResult.FAIL; + return InteractionResult.FAIL; } - + @Override public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { TripleShape shape = state.getValue(SHAPE); if (shape == TripleShape.BOTTOM) { super.randomTick(state, world, pos, random); return; - } else if (random.nextInt(16) == 0) { + } + else if (random.nextInt(16) == 0) { boolean bottom = canSurviveBottom(world, pos); if (shape == TripleShape.TOP) { if (!bottom) { world.setBlockAndUpdate(pos, Blocks.END_STONE.defaultBlockState()); } - } else { - boolean top = canSurvive(state, world, pos) || isMiddle(world.getBlockState(pos.up())); + } + else { + boolean top = canSurvive(state, world, pos) || isMiddle(world.getBlockState(pos.above())); if (!top && !bottom) { world.setBlockAndUpdate(pos, Blocks.END_STONE.defaultBlockState()); - } else if (top && !bottom) { - world.setBlockAndUpdate(pos, state.with(SHAPE, TripleShape.BOTTOM)); - } else if (!top && bottom) { - world.setBlockAndUpdate(pos, state.with(SHAPE, TripleShape.TOP)); + } + else if (top && !bottom) { + world.setBlockAndUpdate(pos, state.setValue(SHAPE, TripleShape.BOTTOM)); + } + else if (!top && bottom) { + world.setBlockAndUpdate(pos, state.setValue(SHAPE, TripleShape.TOP)); } } } } - - protected boolean canSurviveBottom(WorldView world, BlockPos pos) { + + protected boolean canSurviveBottom(LevelReader world, BlockPos pos) { BlockPos blockPos = pos.below(); BlockState blockState = world.getBlockState(blockPos); if (isMiddle(blockState)) { return true; - } else if (blockState.getFluidState().getLevel() == 8) { + } + else if (blockState.getFluidState().getAmount() == 8) { return false; - } else { - return !blockState.isSideSolidFullSquare(world, blockPos, Direction.UP); + } + else { + return !blockState.isFaceSturdy(world, blockPos, Direction.UP); } } - + protected boolean isMiddle(BlockState state) { return state.is(this) && state.getValue(SHAPE) == TripleShape.MIDDLE; } diff --git a/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantBlock.java index 51eb7fd6..39e94ec2 100644 --- a/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantBlock.java @@ -7,133 +7,139 @@ import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.AbstractBlock; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.Fertilizable; -import net.minecraft.world.level.block.FluidFillable; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.item.enchantment.Enchantments; -import net.minecraft.world.entity.ItemEntity; -import net.minecraft.fluid.Fluid; -import net.minecraft.fluid.FluidState; -import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.block.SoundType; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.BonemealableBlock; +import net.minecraft.world.level.block.LiquidBlockContainer; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; -public class UnderwaterPlantBlock extends BlockBaseNotFull implements IRenderTypeable, Fertilizable, FluidFillable { - private static final VoxelShape SHAPE = Block.createCuboidShape(4, 0, 4, 12, 14, 12); - +public class UnderwaterPlantBlock extends BlockBaseNotFull implements IRenderTypeable, BonemealableBlock, LiquidBlockContainer { + private static final VoxelShape SHAPE = Block.box(4, 0, 4, 12, 14, 12); + public UnderwaterPlantBlock() { - super(FabricBlockSettings.of(Material.UNDERWATER_PLANT).breakByTool(FabricToolTags.SHEARS) - .sounds(SoundType.WET_GRASS).breakByHand(true).noCollision()); + super(FabricBlockSettings.of(Material.WATER_PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.WET_GRASS) + .noCollission()); } - + public UnderwaterPlantBlock(int light) { - super(FabricBlockSettings.of(Material.UNDERWATER_PLANT).breakByTool(FabricToolTags.SHEARS) - .sounds(SoundType.WET_GRASS).luminance(light).breakByHand(true).noCollision()); + super(FabricBlockSettings.of(Material.WATER_PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .luminance(light) + .sound(SoundType.WET_GRASS) + .noCollission()); } - + public UnderwaterPlantBlock(Properties settings) { super(settings); } @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - Vec3d vec3d = state.getModelOffset(view, pos); - return SHAPE.offset(vec3d.x, vec3d.y, vec3d.z); + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + Vec3 vec3d = state.getOffset(view, pos); + return SHAPE.move(vec3d.x, vec3d.y, vec3d.z); } @Override - public AbstractBlock.OffsetType getOffsetType() { - return AbstractBlock.OffsetType.XZ; + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.XZ; } @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { BlockState down = world.getBlockState(pos.below()); state = world.getBlockState(pos); - return isTerrain(down) && state.getFluidState().getFluid().equals(Fluids.WATER.getStill()); + return isTerrain(down) && state.getFluidState().getType().equals(Fluids.WATER.getSource()); } - + protected boolean isTerrain(BlockState state) { - return state.isIn(EndTags.END_GROUND) || state.getBlock() == EndBlocks.ENDSTONE_DUST; + return state.is(EndTags.END_GROUND) || state.getBlock() == EndBlocks.ENDSTONE_DUST; } @Override - public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, - BlockPos pos, BlockPos neighborPos) { - if (!canPlaceAt(state, world, pos)) { - world.breakBlock(pos, true); + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) { + world.destroyBlock(pos, true); return Blocks.WATER.defaultBlockState(); - } else { + } + else { return state; } } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); - if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) - || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Lists.newArrayList(new ItemStack(this)); - } else { + } + else { return Lists.newArrayList(); } } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } @Override - public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { return true; } @Override - public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return true; } @Override - public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { - ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, - new ItemStack(this)); - world.spawnEntity(item); + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { + ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(this)); + world.addFreshEntity(item); } @Override - public boolean canFillWithFluid(BlockView world, BlockPos pos, BlockState state, Fluid fluid) { + public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { return false; } @Override - public boolean tryFillWithFluid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { + public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { return false; } - + @Override public FluidState getFluidState(BlockState state) { - return Fluids.WATER.getStill(false); + return Fluids.WATER.getSource(false); } } diff --git a/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantWithAgeBlock.java b/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantWithAgeBlock.java index 405daee8..4ba46a39 100644 --- a/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantWithAgeBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/UnderwaterPlantWithAgeBlock.java @@ -4,49 +4,54 @@ import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; +import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.IntegerProperty; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.material.Material; import ru.betterend.blocks.BlockProperties; public abstract class UnderwaterPlantWithAgeBlock extends UnderwaterPlantBlock { public static final IntegerProperty AGE = BlockProperties.AGE; - + public UnderwaterPlantWithAgeBlock() { - super(FabricBlockSettings.of(Material.UNDERWATER_PLANT).breakByTool(FabricToolTags.SHEARS) - .sounds(SoundType.WET_GRASS).breakByHand(true).ticksRandomly().noCollision()); + super(FabricBlockSettings.of(Material.WATER_PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.WET_GRASS) + .randomTicks() + .noCollission()); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(AGE); } - + public abstract void grow(WorldGenLevel world, Random random, BlockPos pos); - + @Override - public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { if (random.nextInt(4) == 0) { int age = state.getValue(AGE); if (age < 3) { - world.setBlockAndUpdate(pos, state.with(AGE, age + 1)); - } else { + world.setBlockAndUpdate(pos, state.setValue(AGE, age + 1)); + } + else { grow(world, random, pos); } } } - + @Override - public void scheduledTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { - super.scheduledTick(state, world, pos, random); - if (canGrow(world, random, pos, state)) { - grow(world, random, pos, state); + public void tick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + super.tick(state, world, pos, random); + if (isBonemealSuccess(world, random, pos, state)) { + performBonemeal(world, random, pos, state); } } } diff --git a/src/main/java/ru/betterend/blocks/basis/UpDownPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/UpDownPlantBlock.java index b8ab9330..d53fbb34 100644 --- a/src/main/java/ru/betterend/blocks/basis/UpDownPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/UpDownPlantBlock.java @@ -6,88 +6,90 @@ import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.item.enchantment.Enchantments; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.world.level.block.SoundType; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndTags; public class UpDownPlantBlock extends BlockBaseNotFull implements IRenderTypeable { - private static final VoxelShape SHAPE = Block.createCuboidShape(4, 0, 4, 12, 16, 12); - + private static final VoxelShape SHAPE = Block.box(4, 0, 4, 12, 16, 12); + public UpDownPlantBlock() { - super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).sounds(SoundType.GRASS) - .breakByHand(true).noCollision()); + super(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.GRASS) + .noCollission()); } @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPE; } @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { BlockState down = world.getBlockState(pos.below()); - BlockState up = world.getBlockState(pos.up()); + BlockState up = world.getBlockState(pos.above()); return (isTerrain(down) || down.getBlock() == this) && (isSupport(up, world, pos) || up.getBlock() == this); } - + protected boolean isTerrain(BlockState state) { - return state.isIn(EndTags.END_GROUND); + return state.is(EndTags.END_GROUND); } - - protected boolean isSupport(BlockState state, WorldView world, BlockPos pos) { - return sideCoversSmallSquare(world, pos.up(), Direction.UP); + + protected boolean isSupport(BlockState state, LevelReader world, BlockPos pos) { + return canSupportCenter(world, pos.above(), Direction.UP); } @Override - public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, - BlockPos pos, BlockPos neighborPos) { - if (!canPlaceAt(state, world, pos)) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) { return Blocks.AIR.defaultBlockState(); - } else { + } + else { return state; } } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); - if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) - || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Lists.newArrayList(new ItemStack(this)); - } else { + } + else { return Lists.newArrayList(); } } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override - public void afterBreak(Level world, Player player, BlockPos pos, BlockState state, BlockEntity blockEntity, - ItemStack stack) { - super.afterBreak(world, player, pos, state, blockEntity, stack); - world.updateNeighbor(pos, Blocks.AIR, pos.below()); + public void playerDestroy(Level world, Player player, BlockPos pos, BlockState state, BlockEntity blockEntity, ItemStack stack) { + super.playerDestroy(world, player, pos, state, blockEntity, stack); + world.neighborChanged(pos, Blocks.AIR, pos.below()); } } diff --git a/src/main/java/ru/betterend/blocks/basis/VineBlock.java b/src/main/java/ru/betterend/blocks/basis/VineBlock.java index 2de33f06..45875dff 100644 --- a/src/main/java/ru/betterend/blocks/basis/VineBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/VineBlock.java @@ -7,119 +7,121 @@ import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.AbstractBlock; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.Fertilizable; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.item.enchantment.Enchantments; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.EnumProperty; -import net.minecraft.tags.BlockTags; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.BonemealableBlock; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.util.BlocksHelper; -public class VineBlock extends BlockBaseNotFull implements IRenderTypeable, Fertilizable { +public class VineBlock extends BlockBaseNotFull implements IRenderTypeable, BonemealableBlock { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; - private static final VoxelShape VOXEL_SHAPE = Block.createCuboidShape(2, 0, 2, 14, 16, 14); - + private static final VoxelShape VOXEL_SHAPE = Block.box(2, 0, 2, 14, 16, 14); + public VineBlock() { this(0, false); } - + public VineBlock(int light) { this(light, false); } - + public VineBlock(int light, boolean bottomOnly) { - super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).sounds(SoundType.GRASS) - .luminance((state) -> { - return bottomOnly ? state.getValue(SHAPE) == TripleShape.BOTTOM ? light : 0 : light; - }).breakByHand(true).noCollision()); - this.setDefaultState(this.stateManager.defaultBlockState().with(SHAPE, TripleShape.BOTTOM)); + super(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.GRASS) + .lightLevel((state) -> bottomOnly ? state.getValue(SHAPE) == TripleShape.BOTTOM ? light : 0 : light) + .noCollission()); + this.registerDefaultState(this.stateDefinition.any().setValue(SHAPE, TripleShape.BOTTOM)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE); } @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { - Vec3d vec3d = state.getModelOffset(view, pos); - return VOXEL_SHAPE.offset(vec3d.x, vec3d.y, vec3d.z); + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + Vec3 vec3d = state.getOffset(view, pos); + return VOXEL_SHAPE.move(vec3d.x, vec3d.y, vec3d.z); } @Override - public AbstractBlock.OffsetType getOffsetType() { - return AbstractBlock.OffsetType.XZ; + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.XZ; } - - public boolean canGenerate(BlockState state, WorldView world, BlockPos pos) { + + public boolean canGenerate(BlockState state, LevelReader world, BlockPos pos) { return isSupport(state, world, pos); } @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { return isSupport(state, world, pos); } - - protected boolean isSupport(BlockState state, WorldView world, BlockPos pos) { - BlockState up = world.getBlockState(pos.up()); - return up.is(this) || up.isIn(BlockTags.LEAVES) || sideCoversSmallSquare(world, pos.up(), Direction.DOWN); + + protected boolean isSupport(BlockState state, LevelReader world, BlockPos pos) { + BlockState up = world.getBlockState(pos.above()); + return up.is(this) || up.is(BlockTags.LEAVES) || canSupportCenter(world, pos.above(), Direction.DOWN); } @Override - public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, - BlockPos pos, BlockPos neighborPos) { - if (!canPlaceAt(state, world, pos)) { + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (!canSurvive(state, world, pos)) { return Blocks.AIR.defaultBlockState(); - } else { + } + else { if (world.getBlockState(pos.below()).getBlock() != this) - return state.with(SHAPE, TripleShape.BOTTOM); - else if (world.getBlockState(pos.up()).getBlock() != this) - return state.with(SHAPE, TripleShape.TOP); - return state.with(SHAPE, TripleShape.MIDDLE); + return state.setValue(SHAPE, TripleShape.BOTTOM); + else if (world.getBlockState(pos.above()).getBlock() != this) + return state.setValue(SHAPE, TripleShape.TOP); + return state.setValue(SHAPE, TripleShape.MIDDLE); } } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); - if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) - || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Lists.newArrayList(new ItemStack(this)); - } else { + } + else { return Lists.newArrayList(); } } - + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } @Override - public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { while (world.getBlockState(pos).getBlock() == this) { pos = pos.below(); } @@ -127,19 +129,19 @@ public class VineBlock extends BlockBaseNotFull implements IRenderTypeable, Fert } @Override - public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { while (world.getBlockState(pos).getBlock() == this) { pos = pos.below(); } - return world.isAir(pos); + return world.isEmptyBlock(pos); } @Override - public void grow(ServerLevel world, Random random, BlockPos pos, BlockState state) { + public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { while (world.getBlockState(pos).getBlock() == this) { pos = pos.below(); } - world.setBlockAndUpdate(pos, getDefaultState()); - BlocksHelper.setWithoutUpdate(world, pos, getDefaultState()); + world.setBlockAndUpdate(pos, defaultBlockState()); + BlocksHelper.setWithoutUpdate(world, pos, defaultBlockState()); } } diff --git a/src/main/java/ru/betterend/blocks/basis/WallMushroomBlock.java b/src/main/java/ru/betterend/blocks/basis/WallMushroomBlock.java index 55600834..7e6a2ac4 100644 --- a/src/main/java/ru/betterend/blocks/basis/WallMushroomBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/WallMushroomBlock.java @@ -6,28 +6,34 @@ import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.block.SoundType; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.WorldView; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; public class WallMushroomBlock extends EndWallPlantBlock { public WallMushroomBlock(int light) { - super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.AXES).sounds(SoundType.GRASS) - .luminance(light).sounds(SoundType.WOOD).hardness(0.2F).breakByHand(true).noCollision()); + super(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.AXES) + .breakByHand(true) + .luminance(light) + .hardness(0.2F) + .sound(SoundType.GRASS) + .sound(SoundType.WOOD) + .noCollission()); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { return Lists.newArrayList(new ItemStack(this)); } - + @Override - public boolean isSupport(WorldView world, BlockPos pos, BlockState blockState, Direction direction) { - return blockState.getMaterial().isSolid() && blockState.isSideSolidFullSquare(world, pos, direction); + public boolean isSupport(LevelReader world, BlockPos pos, BlockState blockState, Direction direction) { + return blockState.getMaterial().isSolid() && blockState.isFaceSturdy(world, pos, direction); } } diff --git a/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java b/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java index 57f496dc..22274872 100644 --- a/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java @@ -6,12 +6,12 @@ import java.util.function.Function; import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.core.Registry; +import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.DyeItem; import net.minecraft.world.level.ItemLike; -import net.minecraft.util.DyeColor; -import net.minecraft.core.Registry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.material.MaterialColor; import ru.betterend.recipe.builders.GridRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; @@ -20,42 +20,39 @@ public class ColoredMaterial { private static final Map DYES = Maps.newHashMap(); private static final Map COLORS = Maps.newHashMap(); private final Map colors = Maps.newHashMap(); - + public ColoredMaterial(Function constructor, Block source, boolean craftEight) { this(constructor, source, COLORS, DYES, craftEight); } - - public ColoredMaterial(Function constructor, Block source, Map colors, - Map dyes, boolean craftEight) { + + public ColoredMaterial(Function constructor, Block source, Map colors, Map dyes, boolean craftEight) { String id = Registry.BLOCK.getKey(source).getPath(); colors.forEach((color, name) -> { String blockName = id + "_" + name; - Block block = constructor - .apply(FabricBlockSettings.copyOf(source).materialColor(MaterialColor.COLOR_BLACK)); + Block block = constructor.apply(FabricBlockSettings.copyOf(source).materialColor(MaterialColor.COLOR_BLACK)); EndBlocks.registerBlock(blockName, block); if (craftEight) { - GridRecipe.make(blockName, block).setOutputCount(8).setShape("###", "#D#", "###") - .addMaterial('#', source).addMaterial('D', dyes.get(color)).build(); - } else { - GridRecipe.make(blockName, block).setList("#D").addMaterial('#', source) - .addMaterial('D', dyes.get(color)).build(); + GridRecipe.make(blockName, block).setOutputCount(8).setShape("###", "#D#", "###").addMaterial('#', source).addMaterial('D', dyes.get(color)).build(); + } + else { + GridRecipe.make(blockName, block).setList("#D").addMaterial('#', source).addMaterial('D', dyes.get(color)).build(); } this.colors.put(color, block); BlocksHelper.addBlockColor(block, color); }); } - + public Block getByColor(DyeColor color) { - return colors.get(color.getMaterialColor().color); + return colors.get(color.getMaterialColor().col); } - + public Block getByColor(int color) { return colors.get(color); } - + static { - for (DyeColor color : DyeColor.values()) { - int colorRGB = color.getMaterialColor().color; + for (DyeColor color: DyeColor.values()) { + int colorRGB = color.getMaterialColor().col; COLORS.put(colorRGB, color.getName()); DYES.put(colorRGB, DyeItem.byColor(color)); } diff --git a/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java b/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java index 15bf2a3f..352909ea 100644 --- a/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java @@ -1,9 +1,9 @@ package ru.betterend.blocks.complex; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; import net.minecraft.tags.BlockTags; import net.minecraft.tags.ItemTags; +import net.minecraft.world.level.block.Block; import ru.betterend.blocks.EndPedestal; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.blocks.basis.EndPillarBlock; @@ -27,7 +27,7 @@ public class CrystalSubblocksMaterial { public final Block brick_stairs; public final Block brick_slab; public final Block brick_wall; - + public CrystalSubblocksMaterial(String name, Block source) { FabricBlockSettings material = FabricBlockSettings.copyOf(source); polished = EndBlocks.registerBlock(name + "_polished", new BlockBase(material)); @@ -41,39 +41,29 @@ public class CrystalSubblocksMaterial { brick_stairs = EndBlocks.registerBlock(name + "_bricks_stairs", new EndStairsBlock(bricks)); brick_slab = EndBlocks.registerBlock(name + "_bricks_slab", new EndSlabBlock(bricks)); brick_wall = EndBlocks.registerBlock(name + "_bricks_wall", new EndWallBlock(bricks)); - + // Recipes // - GridRecipe.make(name + "_bricks", bricks).setOutputCount(4).setShape("##", "##").addMaterial('#', source) - .setGroup("end_bricks").build(); - GridRecipe.make(name + "_polished", polished).setOutputCount(4).setShape("##", "##").addMaterial('#', bricks) - .setGroup("end_tile").build(); - GridRecipe.make(name + "_tiles", tiles).setOutputCount(4).setShape("##", "##").addMaterial('#', polished) - .setGroup("end_small_tile").build(); - GridRecipe.make(name + "_pillar", pillar).setShape("#", "#").addMaterial('#', slab).setGroup("end_pillar") - .build(); - - GridRecipe.make(name + "_stairs", stairs).setOutputCount(4).setShape("# ", "## ", "###") - .addMaterial('#', source).setGroup("end_stone_stairs").build(); - GridRecipe.make(name + "_slab", slab).setOutputCount(6).setShape("###").addMaterial('#', source) - .setGroup("end_stone_slabs").build(); - GridRecipe.make(name + "_bricks_stairs", brick_stairs).setOutputCount(4).setShape("# ", "## ", "###") - .addMaterial('#', bricks).setGroup("end_stone_stairs").build(); - GridRecipe.make(name + "_bricks_slab", brick_slab).setOutputCount(6).setShape("###").addMaterial('#', bricks) - .setGroup("end_stone_slabs").build(); - - GridRecipe.make(name + "_wall", wall).setOutputCount(6).setShape("###", "###").addMaterial('#', source) - .setGroup("end_wall").build(); - GridRecipe.make(name + "_bricks_wall", brick_wall).setOutputCount(6).setShape("###", "###") - .addMaterial('#', bricks).setGroup("end_wall").build(); - + GridRecipe.make(name + "_bricks", bricks).setOutputCount(4).setShape("##", "##").addMaterial('#', source).setGroup("end_bricks").build(); + GridRecipe.make(name + "_polished", polished).setOutputCount(4).setShape("##", "##").addMaterial('#', bricks).setGroup("end_tile").build(); + GridRecipe.make(name + "_tiles", tiles).setOutputCount(4).setShape("##", "##").addMaterial('#', polished).setGroup("end_small_tile").build(); + GridRecipe.make(name + "_pillar", pillar).setShape("#", "#").addMaterial('#', slab).setGroup("end_pillar").build(); + + GridRecipe.make(name + "_stairs", stairs).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', source).setGroup("end_stone_stairs").build(); + GridRecipe.make(name + "_slab", slab).setOutputCount(6).setShape("###").addMaterial('#', source).setGroup("end_stone_slabs").build(); + GridRecipe.make(name + "_bricks_stairs", brick_stairs).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', bricks).setGroup("end_stone_stairs").build(); + GridRecipe.make(name + "_bricks_slab", brick_slab).setOutputCount(6).setShape("###").addMaterial('#', bricks).setGroup("end_stone_slabs").build(); + + GridRecipe.make(name + "_wall", wall).setOutputCount(6).setShape("###", "###").addMaterial('#', source).setGroup("end_wall").build(); + GridRecipe.make(name + "_bricks_wall", brick_wall).setOutputCount(6).setShape("###", "###").addMaterial('#', bricks).setGroup("end_wall").build(); + CraftingRecipes.registerPedestal(name + "_pedestal", pedestal, slab, pillar); - + // Item Tags // TagHelper.addTag(ItemTags.SLABS, slab, brick_slab); TagHelper.addTag(ItemTags.STONE_BRICKS, bricks); TagHelper.addTag(ItemTags.STONE_CRAFTING_MATERIALS, source); TagHelper.addTag(ItemTags.STONE_TOOL_MATERIALS, source); - + // Block Tags // TagHelper.addTag(BlockTags.STONE_BRICKS, bricks); TagHelper.addTag(BlockTags.WALLS, wall, brick_wall); diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index e2ef98dd..a0f73d54 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -1,17 +1,19 @@ package ru.betterend.blocks.complex; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.item.Item; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.MaterialColor; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.item.ArmorMaterial; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.Tier; -import net.minecraft.world.level.block.SoundType; import net.minecraft.tags.BlockTags; import net.minecraft.tags.ItemTags; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Item.Properties; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.Tier; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.material.MaterialColor; import ru.betterend.blocks.BulbVineLanternBlock; import ru.betterend.blocks.BulbVineLanternColoredBlock; import ru.betterend.blocks.ChandelierBlock; @@ -54,64 +56,54 @@ public class MetalMaterial { public final Block chain; public final Block stairs; public final Block slab; - + public final Block chandelier; public final Block bulb_lantern; public final ColoredMaterial bulb_lantern_colored; - + public final Item nugget; public final Item ingot; - + public final Item shovelHead; public final Item pickaxeHead; public final Item axeHead; public final Item hoeHead; public final Item swordBlade; public final Item swordHandle; - + public final Item shovel; public final Item sword; public final Item pickaxe; public final Item axe; public final Item hoe; public final Item hammer; - + public final Item helmet; public final Item chestplate; public final Item leggings; public final Item boots; - + public static MetalMaterial makeNormal(String name, MaterialColor color, Tier material, ArmorMaterial armor) { - return new MetalMaterial(name, true, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color), - EndItems.makeItemSettings(), material, armor); + return new MetalMaterial(name, true, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color), EndItems.makeItemSettings(), material, armor); } - - public static MetalMaterial makeNormal(String name, MaterialColor color, float hardness, float resistance, - Tier material, ArmorMaterial armor) { - return new MetalMaterial(name, true, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color) - .hardness(hardness).resistance(resistance), EndItems.makeItemSettings(), material, armor); + + public static MetalMaterial makeNormal(String name, MaterialColor color, float hardness, float resistance, Tier material, ArmorMaterial armor) { + return new MetalMaterial(name, true, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color).hardness(hardness).resistance(resistance), EndItems.makeItemSettings(), material, armor); } - + public static MetalMaterial makeOreless(String name, MaterialColor color, Tier material, ArmorMaterial armor) { - return new MetalMaterial(name, false, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color), - EndItems.makeItemSettings(), material, armor); + return new MetalMaterial(name, false, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color), EndItems.makeItemSettings(), material, armor); } - - public static MetalMaterial makeOreless(String name, MaterialColor color, float hardness, float resistance, - Tier material, ArmorMaterial armor) { - return new MetalMaterial(name, false, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color) - .hardness(hardness).resistance(resistance), EndItems.makeItemSettings(), material, armor); + + public static MetalMaterial makeOreless(String name, MaterialColor color, float hardness, float resistance, Tier material, ArmorMaterial armor) { + return new MetalMaterial(name, false, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color).hardness(hardness).resistance(resistance), EndItems.makeItemSettings(), material, armor); } - - private MetalMaterial(String name, boolean hasOre, FabricBlockSettings settings, Item.Properties itemSettings, - Tier material, ArmorMaterial armor) { - FabricBlockSettings lantern = FabricBlockSettings.copyOf(settings).sounds(SoundType.LANTERN).hardness(1) - .resistance(1).luminance(15); + + private MetalMaterial(String name, boolean hasOre, FabricBlockSettings settings, Properties itemSettings, Tier material, ArmorMaterial armor) { + BlockBehaviour.Properties lanternProperties = FabricBlockSettings.copyOf(settings).hardness(1).resistance(1).luminance(15).sound(SoundType.LANTERN); final int level = material.getLevel(); - - ore = hasOre - ? EndBlocks.registerBlock(name + "_ore", new BlockBase(FabricBlockSettings.copyOf(Blocks.END_STONE))) - : null; + + ore = hasOre ? EndBlocks.registerBlock(name + "_ore", new BlockBase(FabricBlockSettings.copyOf(Blocks.END_STONE))) : null; block = EndBlocks.registerBlock(name + "_block", new BlockBase(settings)); tile = EndBlocks.registerBlock(name + "_tile", new BlockBase(settings)); stairs = EndBlocks.registerBlock(name + "_stairs", new EndStairsBlock(tile)); @@ -122,75 +114,58 @@ public class MetalMaterial { bars = EndBlocks.registerBlock(name + "_bars", new EndMetalPaneBlock(block)); chain = EndBlocks.registerBlock(name + "_chain", new EndChainBlock(block.defaultMaterialColor())); plate = EndBlocks.registerBlock(name + "_plate", new EndWoodenPlateBlock(block)); - + chandelier = EndBlocks.registerBlock(name + "_chandelier", new ChandelierBlock(block)); - bulb_lantern = EndBlocks.registerBlock(name + "_bulb_lantern", new BulbVineLanternBlock(lantern)); + bulb_lantern = EndBlocks.registerBlock(name + "_bulb_lantern", new BulbVineLanternBlock(lanternProperties)); bulb_lantern_colored = new ColoredMaterial(BulbVineLanternColoredBlock::new, bulb_lantern, false); - + nugget = EndItems.registerItem(name + "_nugget", new PatternedItem(itemSettings)); ingot = EndItems.registerItem(name + "_ingot", new PatternedItem(itemSettings)); - + shovelHead = EndItems.registerItem(name + "_shovel_head"); pickaxeHead = EndItems.registerItem(name + "_pickaxe_head"); axeHead = EndItems.registerItem(name + "_axe_head"); hoeHead = EndItems.registerItem(name + "_hoe_head"); swordBlade = EndItems.registerItem(name + "_sword_blade"); swordHandle = EndItems.registerItem(name + "_sword_handle"); - + shovel = EndItems.registerTool(name + "_shovel", new EndShovelItem(material, 1.5F, -3.0F, itemSettings)); sword = EndItems.registerTool(name + "_sword", new EndSwordItem(material, 3, -2.4F, itemSettings)); pickaxe = EndItems.registerTool(name + "_pickaxe", new EndPickaxeItem(material, 1, -2.8F, itemSettings)); axe = EndItems.registerTool(name + "_axe", new EndAxeItem(material, 6.0F, -3.0F, itemSettings)); hoe = EndItems.registerTool(name + "_hoe", new EndHoeItem(material, -3, 0.0F, itemSettings)); hammer = EndItems.registerTool(name + "_hammer", new EndHammerItem(material, 5.0F, -3.2F, 0.3D, itemSettings)); - + helmet = EndItems.registerItem(name + "_helmet", new EndArmorItem(armor, EquipmentSlot.HEAD, itemSettings)); - chestplate = EndItems.registerItem(name + "_chestplate", - new EndArmorItem(armor, EquipmentSlot.CHEST, itemSettings)); + chestplate = EndItems.registerItem(name + "_chestplate", new EndArmorItem(armor, EquipmentSlot.CHEST, itemSettings)); leggings = EndItems.registerItem(name + "_leggings", new EndArmorItem(armor, EquipmentSlot.LEGS, itemSettings)); boots = EndItems.registerItem(name + "_boots", new EndArmorItem(armor, EquipmentSlot.FEET, itemSettings)); - + if (hasOre) { FurnaceRecipe.make(name + "_ingot_furnace", ore, ingot).setGroup("end_ingot").buildWithBlasting(); - AlloyingRecipe.Builder.create(name + "_ingot_alloy").setInput(ore, ore).setOutput(ingot, 3) - .setExpiriense(2.1F).build(); + AlloyingRecipe.Builder.create(name + "_ingot_alloy").setInput(ore, ore).setOutput(ingot, 3).setExpiriense(2.1F).build(); } - + // Basic recipes - GridRecipe.make(name + "_ingot_from_nuggets", ingot).setShape("###", "###", "###").addMaterial('#', nugget) - .setGroup("end_metal_ingots_nug").build(); - GridRecipe.make(name + "_block", block).setShape("###", "###", "###").addMaterial('#', ingot) - .setGroup("end_metal_blocks").build(); - GridRecipe.make(name + "_ingot_from_block", ingot).setOutputCount(9).setList("#").addMaterial('#', block) - .setGroup("end_metal_ingots").build(); - + GridRecipe.make(name + "_ingot_from_nuggets", ingot).setShape("###", "###", "###").addMaterial('#', nugget).setGroup("end_metal_ingots_nug").build(); + GridRecipe.make(name + "_block", block).setShape("###", "###", "###").addMaterial('#', ingot).setGroup("end_metal_blocks").build(); + GridRecipe.make(name + "_ingot_from_block", ingot).setOutputCount(9).setList("#").addMaterial('#', block).setGroup("end_metal_ingots").build(); + // Block recipes - GridRecipe.make(name + "_tile", tile).setOutputCount(4).setShape("##", "##").addMaterial('#', block) - .setGroup("end_metal_tiles").build(); - GridRecipe.make(name + "_bars", bars).setOutputCount(16).setShape("###", "###").addMaterial('#', ingot) - .setGroup("end_metal_bars").build(); - GridRecipe.make(name + "_plate", plate).setShape("##").addMaterial('#', ingot).setGroup("end_metal_plates") - .build(); - GridRecipe.make(name + "_door", door).setOutputCount(3).setShape("##", "##", "##").addMaterial('#', ingot) - .setGroup("end_metal_doors").build(); - GridRecipe.make(name + "_trapdoor", trapdoor).setShape("##", "##").addMaterial('#', ingot) - .setGroup("end_metal_trapdoors").build(); - GridRecipe.make(name + "_stairs", stairs).setOutputCount(4).setShape("# ", "## ", "###") - .addMaterial('#', block, tile).setGroup("end_metal_stairs").build(); - GridRecipe.make(name + "_slab", slab).setOutputCount(6).setShape("###").addMaterial('#', block, tile) - .setGroup("end_metal_slabs").build(); - GridRecipe.make(name + "_chain", chain).setShape("N", "#", "N").addMaterial('#', ingot).addMaterial('N', nugget) - .setGroup("end_metal_chain").build(); - GridRecipe.make(name + "_anvil", anvil).setShape("###", " I ", "III").addMaterial('#', block, tile) - .addMaterial('I', ingot).setGroup("end_metal_anvil").build(); - GridRecipe.make(name + "bulb_lantern", bulb_lantern).setShape("C", "I", "#").addMaterial('C', chain) - .addMaterial('I', ingot).addMaterial('#', EndItems.GLOWING_BULB).build(); - - GridRecipe.make(name + "_smith_table", Blocks.SMITHING_TABLE).setShape("II", "##", "##") - .addMaterial('#', ItemTags.PLANKS).addMaterial('I', ingot).setGroup("smith_table").build(); - GridRecipe.make(name + "_chandelier", chandelier).setShape("I#I", " # ").addMaterial('#', ingot) - .addMaterial('I', EndItems.LUMECORN_ROD).setGroup("end_metal_chandelier").build(); - + GridRecipe.make(name + "_tile", tile).setOutputCount(4).setShape("##", "##").addMaterial('#', block).setGroup("end_metal_tiles").build(); + GridRecipe.make(name + "_bars", bars).setOutputCount(16).setShape("###", "###").addMaterial('#', ingot).setGroup("end_metal_bars").build(); + GridRecipe.make(name + "_plate", plate).setShape("##").addMaterial('#', ingot).setGroup("end_metal_plates").build(); + GridRecipe.make(name + "_door", door).setOutputCount(3).setShape("##", "##", "##").addMaterial('#', ingot).setGroup("end_metal_doors").build(); + GridRecipe.make(name + "_trapdoor", trapdoor).setShape("##", "##").addMaterial('#', ingot).setGroup("end_metal_trapdoors").build(); + GridRecipe.make(name + "_stairs", stairs).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', block, tile).setGroup("end_metal_stairs").build(); + GridRecipe.make(name + "_slab", slab).setOutputCount(6).setShape("###").addMaterial('#', block, tile).setGroup("end_metal_slabs").build(); + GridRecipe.make(name + "_chain", chain).setShape("N", "#", "N").addMaterial('#', ingot).addMaterial('N', nugget).setGroup("end_metal_chain").build(); + GridRecipe.make(name + "_anvil", anvil).setShape("###", " I ", "III").addMaterial('#', block, tile).addMaterial('I', ingot).setGroup("end_metal_anvil").build(); + GridRecipe.make(name + "bulb_lantern", bulb_lantern).setShape("C", "I", "#").addMaterial('C', chain).addMaterial('I', ingot).addMaterial('#', EndItems.GLOWING_BULB).build(); + + GridRecipe.make(name + "_smith_table", Blocks.SMITHING_TABLE).setShape("II", "##", "##").addMaterial('#', ItemTags.PLANKS).addMaterial('I', ingot).setGroup("smith_table").build(); + GridRecipe.make(name + "_chandelier", chandelier).setShape("I#I", " # ").addMaterial('#', ingot).addMaterial('I', EndItems.LUMECORN_ROD).setGroup("end_metal_chandelier").build(); + // Tools & armor into nuggets FurnaceRecipe.make(name + "_axe_nugget", axe, nugget).setGroup("end_nugget").buildWithBlasting(); FurnaceRecipe.make(name + "_hoe_nugget", hoe, nugget).setGroup("end_nugget").buildWithBlasting(); @@ -201,47 +176,34 @@ public class MetalMaterial { FurnaceRecipe.make(name + "_chestplate_nugget", chestplate, nugget).setGroup("end_nugget").buildWithBlasting(); FurnaceRecipe.make(name + "_leggings_nugget", leggings, nugget).setGroup("end_nugget").buildWithBlasting(); FurnaceRecipe.make(name + "_boots_nugget", boots, nugget).setGroup("end_nugget").buildWithBlasting(); - + // Tool parts from ingots - AnvilRecipe.Builder.create(name + "_shovel_head").setInput(ingot).setOutput(shovelHead).setAnvilLevel(level) - .setToolLevel(level).setDamage(level).build(); - AnvilRecipe.Builder.create(name + "_pickaxe_head").setInput(ingot).setInputCount(3).setOutput(pickaxeHead) - .setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); - AnvilRecipe.Builder.create(name + "_axe_head").setInput(ingot).setInputCount(3).setOutput(axeHead) - .setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); - AnvilRecipe.Builder.create(name + "_hoe_head").setInput(ingot).setInputCount(2).setOutput(hoeHead) - .setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); - AnvilRecipe.Builder.create(name + "_sword_blade").setInput(ingot).setOutput(swordBlade).setAnvilLevel(level) - .setToolLevel(level).setDamage(level).build(); - + AnvilRecipe.Builder.create(name + "_shovel_head").setInput(ingot).setOutput(shovelHead).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); + AnvilRecipe.Builder.create(name + "_pickaxe_head").setInput(ingot).setInputCount(3).setOutput(pickaxeHead).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); + AnvilRecipe.Builder.create(name + "_axe_head").setInput(ingot).setInputCount(3).setOutput(axeHead).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); + AnvilRecipe.Builder.create(name + "_hoe_head").setInput(ingot).setInputCount(2).setOutput(hoeHead).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); + AnvilRecipe.Builder.create(name + "_sword_blade").setInput(ingot).setOutput(swordBlade).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); + // Tools from parts SmithingTableRecipe.create(name + "_hammer").setResult(hammer).setBase(block).setAddition(Items.STICK).build(); SmithingTableRecipe.create(name + "_axe").setResult(axe).setBase(axeHead).setAddition(Items.STICK).build(); - SmithingTableRecipe.create(name + "_pickaxe").setResult(pickaxe).setBase(pickaxeHead).setAddition(Items.STICK) - .build(); + SmithingTableRecipe.create(name + "_pickaxe").setResult(pickaxe).setBase(pickaxeHead).setAddition(Items.STICK).build(); SmithingTableRecipe.create(name + "_hoe").setResult(hoe).setBase(hoeHead).setAddition(Items.STICK).build(); - SmithingTableRecipe.create(name + "_sword_handle").setResult(swordHandle).setBase(ingot) - .setAddition(Items.STICK).build(); - SmithingTableRecipe.create(name + "_sword").setResult(sword).setBase(swordBlade).setAddition(swordHandle) - .build(); - SmithingTableRecipe.create(name + "_shovel").setResult(shovel).setBase(shovelHead).setAddition(Items.STICK) - .build(); - + SmithingTableRecipe.create(name + "_sword_handle").setResult(swordHandle).setBase(ingot).setAddition(Items.STICK).build(); + SmithingTableRecipe.create(name + "_sword").setResult(sword).setBase(swordBlade).setAddition(swordHandle).build(); + SmithingTableRecipe.create(name + "_shovel").setResult(shovel).setBase(shovelHead).setAddition(Items.STICK).build(); + // Armor crafting - GridRecipe.make(name + "_helmet", helmet).setShape("###", "# #").addMaterial('#', ingot) - .setGroup("end_metal_helmets").build(); - GridRecipe.make(name + "_chestplate", chestplate).setShape("# #", "###", "###").addMaterial('#', ingot) - .setGroup("end_metal_chestplates").build(); - GridRecipe.make(name + "_leggings", leggings).setShape("###", "# #", "# #").addMaterial('#', ingot) - .setGroup("end_metal_leggings").build(); - GridRecipe.make(name + "_boots", boots).setShape("# #", "# #").addMaterial('#', ingot) - .setGroup("end_metal_boots").build(); - + GridRecipe.make(name + "_helmet", helmet).setShape("###", "# #").addMaterial('#', ingot).setGroup("end_metal_helmets").build(); + GridRecipe.make(name + "_chestplate", chestplate).setShape("# #", "###", "###").addMaterial('#', ingot).setGroup("end_metal_chestplates").build(); + GridRecipe.make(name + "_leggings", leggings).setShape("###", "# #", "# #").addMaterial('#', ingot).setGroup("end_metal_leggings").build(); + GridRecipe.make(name + "_boots", boots).setShape("# #", "# #").addMaterial('#', ingot).setGroup("end_metal_boots").build(); + TagHelper.addTag(BlockTags.ANVIL, anvil); TagHelper.addTag(BlockTags.BEACON_BASE_BLOCKS, block); TagHelper.addTag(EndTags.IRON_INGOTS, ingot); TagHelper.addTag(ItemTags.BEACON_PAYMENT_ITEMS, ingot); - + TagHelper.addTag(EndTags.DRAGON_IMMUNE, ore, bars); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java index bae66336..8a06d206 100644 --- a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java @@ -1,11 +1,11 @@ package ru.betterend.blocks.complex; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.ItemTags; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.MaterialColor; -import net.minecraft.tags.BlockTags; -import net.minecraft.tags.ItemTags; import ru.betterend.blocks.EndPedestal; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.blocks.basis.EndFurnaceBlock; @@ -25,7 +25,7 @@ import ru.betterend.util.TagHelper; public class StoneMaterial { public final Block stone; - + public final Block polished; public final Block tiles; public final Block pillar; @@ -36,16 +36,16 @@ public class StoneMaterial { public final Block pressure_plate; public final Block pedestal; public final Block lantern; - + public final Block bricks; public final Block brick_stairs; public final Block brick_slab; public final Block brick_wall; public final Block furnace; - + public StoneMaterial(String name, MaterialColor color) { FabricBlockSettings material = FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color); - + stone = EndBlocks.registerBlock(name, new BlockBase(material)); polished = EndBlocks.registerBlock(name + "_polished", new BlockBase(material)); tiles = EndBlocks.registerBlock(name + "_tiles", new BlockBase(material)); @@ -57,62 +57,48 @@ public class StoneMaterial { pressure_plate = EndBlocks.registerBlock(name + "_plate", new EndStonelateBlock(stone)); pedestal = EndBlocks.registerBlock(name + "_pedestal", new EndPedestal(stone)); lantern = EndBlocks.registerBlock(name + "_lantern", new StoneLanternBlock(stone)); - + bricks = EndBlocks.registerBlock(name + "_bricks", new BlockBase(material)); brick_stairs = EndBlocks.registerBlock(name + "_bricks_stairs", new EndStairsBlock(bricks)); brick_slab = EndBlocks.registerBlock(name + "_bricks_slab", new EndSlabBlock(bricks)); brick_wall = EndBlocks.registerBlock(name + "_bricks_wall", new EndWallBlock(bricks)); furnace = EndBlocks.registerBlock(name + "_furnace", new EndFurnaceBlock(bricks)); - + // Recipes // - GridRecipe.make(name + "_bricks", bricks).setOutputCount(4).setShape("##", "##").addMaterial('#', stone) - .setGroup("end_bricks").build(); - GridRecipe.make(name + "_polished", polished).setOutputCount(4).setShape("##", "##").addMaterial('#', bricks) - .setGroup("end_tile").build(); - GridRecipe.make(name + "_tiles", tiles).setOutputCount(4).setShape("##", "##").addMaterial('#', polished) - .setGroup("end_small_tile").build(); - GridRecipe.make(name + "_pillar", pillar).setShape("#", "#").addMaterial('#', slab).setGroup("end_pillar") - .build(); - - GridRecipe.make(name + "_stairs", stairs).setOutputCount(4).setShape("# ", "## ", "###") - .addMaterial('#', stone).setGroup("end_stone_stairs").build(); - GridRecipe.make(name + "_slab", slab).setOutputCount(6).setShape("###").addMaterial('#', stone) - .setGroup("end_stone_slabs").build(); - GridRecipe.make(name + "_bricks_stairs", brick_stairs).setOutputCount(4).setShape("# ", "## ", "###") - .addMaterial('#', bricks).setGroup("end_stone_stairs").build(); - GridRecipe.make(name + "_bricks_slab", brick_slab).setOutputCount(6).setShape("###").addMaterial('#', bricks) - .setGroup("end_stone_slabs").build(); - - GridRecipe.make(name + "_wall", wall).setOutputCount(6).setShape("###", "###").addMaterial('#', stone) - .setGroup("end_wall").build(); - GridRecipe.make(name + "_bricks_wall", brick_wall).setOutputCount(6).setShape("###", "###") - .addMaterial('#', bricks).setGroup("end_wall").build(); - - GridRecipe.make(name + "_button", button).setList("#").addMaterial('#', stone).setGroup("end_stone_buttons") - .build(); - GridRecipe.make(name + "_pressure_plate", pressure_plate).setShape("##").addMaterial('#', stone) - .setGroup("end_stone_plates").build(); - GridRecipe.make(name + "_lantern", lantern).setShape("S", "#", "S").addMaterial('#', EndItems.CRYSTAL_SHARDS) - .addMaterial('S', slab, brick_slab).setGroup("end_stone_lanterns").build(); - GridRecipe.make(name + "_furnace", furnace).setShape("###", "# #", "###").addMaterial('#', stone) - .setGroup("end_stone_furnaces").build(); - + GridRecipe.make(name + "_bricks", bricks).setOutputCount(4).setShape("##", "##").addMaterial('#', stone).setGroup("end_bricks").build(); + GridRecipe.make(name + "_polished", polished).setOutputCount(4).setShape("##", "##").addMaterial('#', bricks).setGroup("end_tile").build(); + GridRecipe.make(name + "_tiles", tiles).setOutputCount(4).setShape("##", "##").addMaterial('#', polished).setGroup("end_small_tile").build(); + GridRecipe.make(name + "_pillar", pillar).setShape("#", "#").addMaterial('#', slab).setGroup("end_pillar").build(); + + GridRecipe.make(name + "_stairs", stairs).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', stone).setGroup("end_stone_stairs").build(); + GridRecipe.make(name + "_slab", slab).setOutputCount(6).setShape("###").addMaterial('#', stone).setGroup("end_stone_slabs").build(); + GridRecipe.make(name + "_bricks_stairs", brick_stairs).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', bricks).setGroup("end_stone_stairs").build(); + GridRecipe.make(name + "_bricks_slab", brick_slab).setOutputCount(6).setShape("###").addMaterial('#', bricks).setGroup("end_stone_slabs").build(); + + GridRecipe.make(name + "_wall", wall).setOutputCount(6).setShape("###", "###").addMaterial('#', stone).setGroup("end_wall").build(); + GridRecipe.make(name + "_bricks_wall", brick_wall).setOutputCount(6).setShape("###", "###").addMaterial('#', bricks).setGroup("end_wall").build(); + + GridRecipe.make(name + "_button", button).setList("#").addMaterial('#', stone).setGroup("end_stone_buttons").build(); + GridRecipe.make(name + "_pressure_plate", pressure_plate).setShape("##").addMaterial('#', stone).setGroup("end_stone_plates").build(); + GridRecipe.make(name + "_lantern", lantern).setShape("S", "#", "S").addMaterial('#', EndItems.CRYSTAL_SHARDS).addMaterial('S', slab, brick_slab).setGroup("end_stone_lanterns").build(); + GridRecipe.make(name + "_furnace", furnace).setShape("###", "# #", "###").addMaterial('#', stone).setGroup("end_stone_furnaces").build(); + CraftingRecipes.registerPedestal(name + "_pedestal", pedestal, slab, pillar); - + // Item Tags // TagHelper.addTag(ItemTags.SLABS, slab, brick_slab); TagHelper.addTag(ItemTags.STONE_BRICKS, bricks); TagHelper.addTag(ItemTags.STONE_CRAFTING_MATERIALS, stone); TagHelper.addTag(ItemTags.STONE_TOOL_MATERIALS, stone); TagHelper.addTag(EndTags.FURNACES, furnace); - + // Block Tags // TagHelper.addTag(BlockTags.STONE_BRICKS, bricks); TagHelper.addTag(BlockTags.WALLS, wall, brick_wall); TagHelper.addTag(BlockTags.SLABS, slab, brick_slab); TagHelper.addTags(pressure_plate, BlockTags.PRESSURE_PLATES, BlockTags.STONE_PRESSURE_PLATES); TagHelper.addTag(EndTags.END_STONES, stone); - + TagHelper.addTag(EndTags.DRAGON_IMMUNE, stone, stairs, slab, wall); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java index fc426b78..f545c6b0 100644 --- a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java @@ -1,15 +1,15 @@ package ru.betterend.blocks.complex; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.MaterialColor; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.Items; import net.minecraft.tags.BlockTags; import net.minecraft.tags.ItemTags; import net.minecraft.tags.Tag; +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.state.BlockState; +import net.minecraft.world.level.material.MaterialColor; import ru.betterend.blocks.basis.BarkBlock; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.blocks.basis.EndBarrelBlock; @@ -52,28 +52,28 @@ public class WoodenMaterial { public final Block pressurePlate; public final Block trapdoor; public final Block door; - + public final Block craftingTable; public final Block ladder; public final Block sign; - + public final Block chest; public final Block barrel; public final Block shelf; public final Block composter; - + public final Tag.Named logBlockTag; public final Tag.Named logItemTag; - + public WoodenMaterial(String name, MaterialColor woodColor, MaterialColor planksColor) { FabricBlockSettings materialPlanks = FabricBlockSettings.copyOf(Blocks.OAK_PLANKS).materialColor(planksColor); - + log_stripped = EndBlocks.registerBlock(name + "_stripped_log", new EndPillarBlock(materialPlanks)); bark_stripped = EndBlocks.registerBlock(name + "_stripped_bark", new BarkBlock(materialPlanks)); - + log = EndBlocks.registerBlock(name + "_log", new EndBlockStripableLogLog(woodColor, log_stripped)); bark = EndBlocks.registerBlock(name + "_bark", new StrippableBarkBlock(woodColor, bark_stripped)); - + planks = EndBlocks.registerBlock(name + "_planks", new BlockBase(materialPlanks)); stairs = EndBlocks.registerBlock(name + "_stairs", new EndStairsBlock(planks)); slab = EndBlocks.registerBlock(name + "_slab", new EndSlabBlock(planks)); @@ -83,59 +83,43 @@ public class WoodenMaterial { pressurePlate = EndBlocks.registerBlock(name + "_plate", new EndWoodenPlateBlock(planks)); trapdoor = EndBlocks.registerBlock(name + "_trapdoor", new EndTrapdoorBlock(planks)); door = EndBlocks.registerBlock(name + "_door", new EndDoorBlock(planks)); - + craftingTable = EndBlocks.registerBlock(name + "_crafting_table", new EndCraftingTableBlock(planks)); ladder = EndBlocks.registerBlock(name + "_ladder", new EndLadderBlock(planks)); sign = EndBlocks.registerBlock(name + "_sign", new EndSignBlock(planks)); - + chest = EndBlocks.registerBlock(name + "_chest", new EndChestBlock(planks)); barrel = EndBlocks.registerBlock(name + "_barrel", new EndBarrelBlock(planks)); shelf = EndBlocks.registerBlock(name + "_bookshelf", new EndBookshelfBlock(planks)); composter = EndBlocks.registerBlock(name + "_composter", new EndComposterBlock(planks)); - + // Recipes // - GridRecipe.make(name + "_planks", planks).setOutputCount(4).setList("#") - .addMaterial('#', log, bark, log_stripped, bark_stripped).setGroup("end_planks").build(); - GridRecipe.make(name + "_stairs", stairs).setOutputCount(4).setShape("# ", "## ", "###") - .addMaterial('#', planks).setGroup("end_planks_stairs").build(); - GridRecipe.make(name + "_slab", slab).setOutputCount(6).setShape("###").addMaterial('#', planks) - .setGroup("end_planks_slabs").build(); - GridRecipe.make(name + "_fence", fence).setOutputCount(3).setShape("#I#", "#I#").addMaterial('#', planks) - .addMaterial('I', Items.STICK).setGroup("end_planks_fences").build(); - GridRecipe.make(name + "_gate", gate).setShape("I#I", "I#I").addMaterial('#', planks) - .addMaterial('I', Items.STICK).setGroup("end_planks_gates").build(); - GridRecipe.make(name + "_button", button).setList("#").addMaterial('#', planks).setGroup("end_planks_buttons") - .build(); - GridRecipe.make(name + "_pressure_plate", pressurePlate).setShape("##").addMaterial('#', planks) - .setGroup("end_planks_plates").build(); - GridRecipe.make(name + "_trapdoor", trapdoor).setOutputCount(2).setShape("###", "###").addMaterial('#', planks) - .setGroup("end_trapdoors").build(); - GridRecipe.make(name + "_door", door).setOutputCount(3).setShape("##", "##", "##").addMaterial('#', planks) - .setGroup("end_doors").build(); - GridRecipe.make(name + "_crafting_table", craftingTable).setShape("##", "##").addMaterial('#', planks) - .setGroup("end_tables").build(); - GridRecipe.make(name + "_ladder", ladder).setOutputCount(3).setShape("I I", "I#I", "I I") - .addMaterial('#', planks).addMaterial('I', Items.STICK).setGroup("end_ladders").build(); - GridRecipe.make(name + "_sign", sign).setOutputCount(3).setShape("###", "###", " I ").addMaterial('#', planks) - .addMaterial('I', Items.STICK).setGroup("end_signs").build(); - GridRecipe.make(name + "_chest", chest).setShape("###", "# #", "###").addMaterial('#', planks) - .setGroup("end_chests").build(); - GridRecipe.make(name + "_barrel", barrel).setShape("#S#", "# #", "#S#").addMaterial('#', planks) - .addMaterial('S', slab).setGroup("end_barrels").build(); - GridRecipe.make(name + "_bookshelf", shelf).setShape("###", "PPP", "###").addMaterial('#', planks) - .addMaterial('P', Items.BOOK).setGroup("end_bookshelves").build(); + GridRecipe.make(name + "_planks", planks).setOutputCount(4).setList("#").addMaterial('#', log, bark, log_stripped, bark_stripped).setGroup("end_planks").build(); + GridRecipe.make(name + "_stairs", stairs).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', planks).setGroup("end_planks_stairs").build(); + GridRecipe.make(name + "_slab", slab).setOutputCount(6).setShape("###").addMaterial('#', planks).setGroup("end_planks_slabs").build(); + GridRecipe.make(name + "_fence", fence).setOutputCount(3).setShape("#I#", "#I#").addMaterial('#', planks).addMaterial('I', Items.STICK).setGroup("end_planks_fences").build(); + GridRecipe.make(name + "_gate", gate).setShape("I#I", "I#I").addMaterial('#', planks).addMaterial('I', Items.STICK).setGroup("end_planks_gates").build(); + GridRecipe.make(name + "_button", button).setList("#").addMaterial('#', planks).setGroup("end_planks_buttons").build(); + GridRecipe.make(name + "_pressure_plate", pressurePlate).setShape("##").addMaterial('#', planks).setGroup("end_planks_plates").build(); + GridRecipe.make(name + "_trapdoor", trapdoor).setOutputCount(2).setShape("###", "###").addMaterial('#', planks).setGroup("end_trapdoors").build(); + GridRecipe.make(name + "_door", door).setOutputCount(3).setShape("##", "##", "##").addMaterial('#', planks).setGroup("end_doors").build(); + GridRecipe.make(name + "_crafting_table", craftingTable).setShape("##", "##").addMaterial('#', planks).setGroup("end_tables").build(); + GridRecipe.make(name + "_ladder", ladder).setOutputCount(3).setShape("I I", "I#I", "I I").addMaterial('#', planks).addMaterial('I', Items.STICK).setGroup("end_ladders").build(); + GridRecipe.make(name + "_sign", sign).setOutputCount(3).setShape("###", "###", " I ").addMaterial('#', planks).addMaterial('I', Items.STICK).setGroup("end_signs").build(); + GridRecipe.make(name + "_chest", chest).setShape("###", "# #", "###").addMaterial('#', planks).setGroup("end_chests").build(); + GridRecipe.make(name + "_barrel", barrel).setShape("#S#", "# #", "#S#").addMaterial('#', planks).addMaterial('S', slab).setGroup("end_barrels").build(); + GridRecipe.make(name + "_bookshelf", shelf).setShape("###", "PPP", "###").addMaterial('#', planks).addMaterial('P', Items.BOOK).setGroup("end_bookshelves").build(); GridRecipe.make(name + "_bark", bark).setShape("##", "##").addMaterial('#', log).setOutputCount(3).build(); GridRecipe.make(name + "_log", log).setShape("##", "##").addMaterial('#', bark).setOutputCount(3).build(); GridRecipe.make(name + "_composter", composter).setShape("# #", "# #", "###").addMaterial('#', slab).build(); - GridRecipe.make(name + "_shulker", Items.SHULKER_BOX).setShape("S", "#", "S") - .addMaterial('S', Items.SHULKER_SHELL).addMaterial('#', chest).build(); - + GridRecipe.make(name + "_shulker", Items.SHULKER_BOX).setShape("S", "#", "S").addMaterial('S', Items.SHULKER_SHELL).addMaterial('#', chest).build(); + // Item Tags // TagHelper.addTag(ItemTags.PLANKS, planks); TagHelper.addTag(ItemTags.WOODEN_PRESSURE_PLATES, pressurePlate); TagHelper.addTag(ItemTags.LOGS, log, bark, log_stripped, bark_stripped); TagHelper.addTag(ItemTags.LOGS_THAT_BURN, log, bark, log_stripped, bark_stripped); - + TagHelper.addTags(button, ItemTags.WOODEN_BUTTONS, ItemTags.BUTTONS); TagHelper.addTags(door, ItemTags.WOODEN_DOORS, ItemTags.DOORS); TagHelper.addTags(fence, ItemTags.WOODEN_FENCES, ItemTags.FENCES); @@ -143,13 +127,13 @@ public class WoodenMaterial { TagHelper.addTags(stairs, ItemTags.WOODEN_STAIRS, ItemTags.STAIRS); TagHelper.addTags(trapdoor, ItemTags.WOODEN_TRAPDOORS, ItemTags.TRAPDOORS); TagHelper.addTag(EndTags.ITEM_CHEST, chest); - + // Block Tags // TagHelper.addTag(BlockTags.PLANKS, planks); TagHelper.addTag(BlockTags.CLIMBABLE, ladder); TagHelper.addTag(BlockTags.LOGS, log, bark, log_stripped, bark_stripped); TagHelper.addTag(BlockTags.LOGS_THAT_BURN, log, bark, log_stripped, bark_stripped); - + TagHelper.addTags(button, BlockTags.WOODEN_BUTTONS, BlockTags.BUTTONS); TagHelper.addTags(door, BlockTags.WOODEN_DOORS, BlockTags.DOORS); TagHelper.addTags(fence, BlockTags.WOODEN_FENCES, BlockTags.FENCES); @@ -158,17 +142,17 @@ public class WoodenMaterial { TagHelper.addTags(trapdoor, BlockTags.WOODEN_TRAPDOORS, BlockTags.TRAPDOORS); TagHelper.addTag(EndTags.BOOKSHELVES, shelf); TagHelper.addTag(EndTags.BLOCK_CHEST, chest); - + logBlockTag = EndTags.makeBlockTag(name + "_logs"); logItemTag = EndTags.makeItemTag(name + "_logs"); TagHelper.addTag(logBlockTag, log_stripped, bark_stripped, log, bark); TagHelper.addTag(logItemTag, log_stripped, bark_stripped, log, bark); } - + public boolean isTreeLog(Block block) { return block == log || block == bark; } - + public boolean isTreeLog(BlockState state) { return isTreeLog(state.getBlock()); } diff --git a/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java b/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java index 19306898..79f78183 100644 --- a/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java +++ b/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java @@ -1,31 +1,32 @@ package ru.betterend.blocks.entities; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.util.Tickable; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.TickableBlockEntity; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.HydrothermalVentBlock; import ru.betterend.registry.EndBlockEntities; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndParticles; -public class BlockEntityHydrothermalVent extends BlockEntity implements Tickable { +public class BlockEntityHydrothermalVent extends BlockEntity implements TickableBlockEntity { public BlockEntityHydrothermalVent() { super(EndBlockEntities.HYDROTHERMAL_VENT); } @Override public void tick() { - if (world.random.nextInt(20) == 0) { - double x = pos.getX() + world.random.nextDouble(); - double y = pos.getY() + 0.9 + world.random.nextDouble() * 0.3; - double z = pos.getZ() + world.random.nextDouble(); - BlockState state = getCachedState(); + if (level.random.nextInt(20) == 0) { + double x = worldPosition.getX() + level.random.nextDouble(); + double y = worldPosition.getY() + 0.9 + level.random.nextDouble() * 0.3; + double z = worldPosition.getZ() + level.random.nextDouble(); + BlockState state = getBlockState(); if (state.is(EndBlocks.HYDROTHERMAL_VENT) && state.getValue(HydrothermalVentBlock.ACTIVATED)) { if (state.getValue(HydrothermalVentBlock.WATERLOGGED)) { - world.addParticle(EndParticles.GEYSER_PARTICLE, x, y, z, 0, 0, 0); - } else { - world.addParticle(ParticleTypes.BUBBLE, x, y, z, 0, 0, 0); + level.addParticle(EndParticles.GEYSER_PARTICLE, x, y, z, 0, 0, 0); + } + else { + level.addParticle(ParticleTypes.BUBBLE, x, y, z, 0, 0, 0); } } } diff --git a/src/main/java/ru/betterend/blocks/entities/EBarrelBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EBarrelBlockEntity.java index 1857c409..1f349112 100644 --- a/src/main/java/ru/betterend/blocks/entities/EBarrelBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EBarrelBlockEntity.java @@ -1,89 +1,89 @@ package ru.betterend.blocks.entities; -import net.minecraft.world.level.block.BarrelBlock; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.level.block.entity.ChestBlockEntity; -import net.minecraft.world.level.block.entity.LootableContainerBlockEntity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.player.PlayerInventory; -import net.minecraft.inventory.Inventories; -import net.minecraft.world.item.ItemStack; +import net.minecraft.core.Direction; +import net.minecraft.core.NonNullList; +import net.minecraft.core.Vec3i; import net.minecraft.nbt.CompoundTag; -import net.minecraft.screen.GenericContainerScreenHandler; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.sounds.SoundSource; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; -import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.collection.DefaultedList; -import net.minecraft.core.Direction; -import net.minecraft.core.Vec3i; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.ContainerHelper; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ChestMenu; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.BarrelBlock; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.entity.ChestBlockEntity; +import net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.basis.EndBarrelBlock; import ru.betterend.registry.EndBlockEntities; -public class EBarrelBlockEntity extends LootableContainerBlockEntity { - private DefaultedList inventory; +public class EBarrelBlockEntity extends RandomizableContainerBlockEntity { + private NonNullList inventory; private int viewerCount; private EBarrelBlockEntity(BlockEntityType type) { super(type); - this.inventory = DefaultedList.ofSize(27, ItemStack.EMPTY); + this.inventory = NonNullList.withSize(27, ItemStack.EMPTY); } public EBarrelBlockEntity() { this(EndBlockEntities.BARREL); } - public CompoundTag toTag(CompoundTag tag) { - super.toTag(tag); - if (!this.serializeLootTable(tag)) { - Inventories.toTag(tag, this.inventory); + public CompoundTag save(CompoundTag tag) { + super.save(tag); + if (!this.trySaveLootTable(tag)) { + ContainerHelper.saveAllItems(tag, this.inventory); } return tag; } - public void fromTag(BlockState state, CompoundTag tag) { - super.fromTag(state, tag); - this.inventory = DefaultedList.ofSize(this.size(), ItemStack.EMPTY); - if (!this.deserializeLootTable(tag)) { - Inventories.fromTag(tag, this.inventory); + public void load(BlockState state, CompoundTag tag) { + super.load(state, tag); + this.inventory = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); + if (!this.tryLoadLootTable(tag)) { + ContainerHelper.loadAllItems(tag, this.inventory); } } - public int size() { + public int getContainerSize() { return 27; } - protected DefaultedList getInvStackList() { + protected NonNullList getItems() { return this.inventory; } - protected void setInvStackList(DefaultedList list) { + protected void setItems(NonNullList list) { this.inventory = list; } - protected Text getContainerName() { - return new TranslatableText("container.barrel"); + protected Component getDefaultName() { + return new TranslatableComponent("container.barrel"); } - protected ScreenHandler createScreenHandler(int syncId, PlayerInventory playerInventory) { - return GenericContainerScreenHandler.createGeneric9x3(syncId, playerInventory, this); + protected AbstractContainerMenu createMenu(int syncId, Inventory playerInventory) { + return ChestMenu.threeRows(syncId, playerInventory, this); } - public void onOpen(Player player) { + public void startOpen(Player player) { if (!player.isSpectator()) { if (this.viewerCount < 0) { this.viewerCount = 0; } ++this.viewerCount; - BlockState blockState = this.getCachedState(); - boolean bl = (Boolean) blockState.get(BarrelBlock.OPEN); + BlockState blockState = this.getBlockState(); + boolean bl = (Boolean) blockState.getValue(BarrelBlock.OPEN); if (!bl) { - this.playSound(blockState, SoundEvents.BLOCK_BARREL_OPEN); + this.playSound(blockState, SoundEvents.BARREL_OPEN); this.setOpen(blockState, true); } @@ -92,47 +92,47 @@ public class EBarrelBlockEntity extends LootableContainerBlockEntity { } private void scheduleUpdate() { - this.world.getBlockTickScheduler().schedule(this.getPos(), this.getCachedState().getBlock(), 5); + this.level.getBlockTicks().scheduleTick(this.getBlockPos(), this.getBlockState().getBlock(), 5); } public void tick() { - int i = this.pos.getX(); - int j = this.pos.getY(); - int k = this.pos.getZ(); - this.viewerCount = ChestBlockEntity.countViewers(this.world, this, i, j, k); + int i = this.worldPosition.getX(); + int j = this.worldPosition.getY(); + int k = this.worldPosition.getZ(); + this.viewerCount = ChestBlockEntity.getOpenCount(this.level, this, i, j, k); if (this.viewerCount > 0) { this.scheduleUpdate(); } else { - BlockState blockState = this.getCachedState(); + BlockState blockState = this.getBlockState(); if (!(blockState.getBlock() instanceof EndBarrelBlock)) { - this.markRemoved(); + this.setRemoved(); return; } - boolean bl = (Boolean) blockState.get(BarrelBlock.OPEN); + boolean bl = (Boolean) blockState.getValue(BarrelBlock.OPEN); if (bl) { - this.playSound(blockState, SoundEvents.BLOCK_BARREL_CLOSE); + this.playSound(blockState, SoundEvents.BARREL_CLOSE); this.setOpen(blockState, false); } } } - public void onClose(Player player) { + public void stopOpen(Player player) { if (!player.isSpectator()) { --this.viewerCount; } } private void setOpen(BlockState state, boolean open) { - this.world.setBlockAndUpdate(this.getPos(), (BlockState) state.with(BarrelBlock.OPEN, open), 3); + this.level.setBlock(this.getBlockPos(), (BlockState) state.setValue(BarrelBlock.OPEN, open), 3); } private void playSound(BlockState blockState, SoundEvent soundEvent) { - Vec3i vec3i = ((Direction) blockState.get(BarrelBlock.FACING)).getVector(); - double d = (double) this.pos.getX() + 0.5D + (double) vec3i.getX() / 2.0D; - double e = (double) this.pos.getY() + 0.5D + (double) vec3i.getY() / 2.0D; - double f = (double) this.pos.getZ() + 0.5D + (double) vec3i.getZ() / 2.0D; - this.world.playLocalSound((Player) null, d, e, f, soundEvent, SoundSource.BLOCKS, 0.5F, - this.world.random.nextFloat() * 0.1F + 0.9F); + Vec3i vec3i = ((Direction) blockState.getValue(BarrelBlock.FACING)).getNormal(); + double d = (double) this.worldPosition.getX() + 0.5D + (double) vec3i.getX() / 2.0D; + double e = (double) this.worldPosition.getY() + 0.5D + (double) vec3i.getY() / 2.0D; + double f = (double) this.worldPosition.getZ() + 0.5D + (double) vec3i.getZ() / 2.0D; + this.level.playSound((Player) null, d, e, f, soundEvent, SoundSource.BLOCKS, 0.5F, + this.level.random.nextFloat() * 0.1F + 0.9F); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/entities/EFurnaceBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EFurnaceBlockEntity.java index 067113b4..de59525e 100644 --- a/src/main/java/ru/betterend/blocks/entities/EFurnaceBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EFurnaceBlockEntity.java @@ -1,12 +1,12 @@ package ru.betterend.blocks.entities; -import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; -import net.minecraft.world.entity.player.PlayerInventory; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.FurnaceMenu; import net.minecraft.world.item.crafting.RecipeType; -import net.minecraft.screen.FurnaceScreenHandler; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; +import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; import ru.betterend.registry.EndBlockEntities; public class EFurnaceBlockEntity extends AbstractFurnaceBlockEntity { @@ -14,11 +14,11 @@ public class EFurnaceBlockEntity extends AbstractFurnaceBlockEntity { super(EndBlockEntities.FURNACE, RecipeType.SMELTING); } - protected Text getContainerName() { - return new TranslatableText("container.furnace"); + protected Component getDefaultName() { + return new TranslatableComponent("container.furnace"); } - protected ScreenHandler createScreenHandler(int syncId, PlayerInventory playerInventory) { - return new FurnaceScreenHandler(syncId, playerInventory, this, this.propertyDelegate); + protected AbstractContainerMenu createMenu(int syncId, Inventory playerInventory) { + return new FurnaceMenu(syncId, playerInventory, this, this.dataAccess); } } diff --git a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java index 9661b381..7f3672d2 100644 --- a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java @@ -10,99 +10,98 @@ import com.google.common.collect.Maps; import it.unimi.dsi.fastutil.objects.Object2IntMap.Entry; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import net.fabricmc.fabric.api.registry.FuelRegistry; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; -import net.minecraft.world.level.block.entity.LockableContainerBlockEntity; -import net.minecraft.world.entity.ExperienceOrbEntity; +import net.minecraft.core.Direction; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.ContainerHelper; +import net.minecraft.world.WorldlyContainer; +import net.minecraft.world.entity.ExperienceOrb; +import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.player.PlayerInventory; -import net.minecraft.inventory.Inventories; -import net.minecraft.inventory.SidedInventory; +import net.minecraft.world.entity.player.StackedContents; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ContainerData; +import net.minecraft.world.inventory.RecipeHolder; +import net.minecraft.world.inventory.StackedContentsCompatible; import net.minecraft.world.item.Item; -import net.minecraft.world.level.ItemLike; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.crafting.BlastingRecipe; import net.minecraft.world.item.crafting.Recipe; -import net.minecraft.world.item.crafting.RecipeFinder; -import net.minecraft.world.item.crafting.RecipeInputProvider; import net.minecraft.world.item.crafting.RecipeType; -import net.minecraft.world.item.crafting.RecipeUnlocker; -import net.minecraft.screen.PropertyDelegate; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.Tickable; -import net.minecraft.util.collection.DefaultedList; -import net.minecraft.core.Direction; -import net.minecraft.util.Mth; -import net.minecraft.util.math.Vec3d; +import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; +import net.minecraft.world.level.block.entity.BaseContainerBlockEntity; +import net.minecraft.world.level.block.entity.TickableBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; import ru.betterend.BetterEnd; import ru.betterend.blocks.EndStoneSmelter; import ru.betterend.client.gui.EndStoneSmelterScreenHandler; import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.registry.EndBlockEntities; -public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity - implements SidedInventory, RecipeUnlocker, RecipeInputProvider, Tickable { +public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity implements WorldlyContainer, RecipeHolder, StackedContentsCompatible, TickableBlockEntity { private static final int[] TOP_SLOTS = new int[] { 0, 1 }; private static final int[] BOTTOM_SLOTS = new int[] { 2, 3 }; private static final int[] SIDE_SLOTS = new int[] { 1, 2 }; private static final Map AVAILABLE_FUELS = Maps.newHashMap(); - + private final Object2IntOpenHashMap recipesUsed; - protected DefaultedList inventory; - protected final PropertyDelegate propertyDelegate; + protected NonNullList inventory; + protected final ContainerData propertyDelegate; private Recipe lastRecipe; private int smeltTimeTotal; private int smeltTime; private int burnTime; private int fuelTime; - + public EndStoneSmelterBlockEntity() { super(EndBlockEntities.END_STONE_SMELTER); - this.inventory = DefaultedList.ofSize(4, ItemStack.EMPTY); + this.inventory = NonNullList.withSize(4, ItemStack.EMPTY); this.recipesUsed = new Object2IntOpenHashMap<>(); - this.propertyDelegate = new PropertyDelegate() { - public int get(int index) { - switch (index) { - case 0: - return EndStoneSmelterBlockEntity.this.burnTime; - case 1: - return EndStoneSmelterBlockEntity.this.fuelTime; - case 2: - return EndStoneSmelterBlockEntity.this.smeltTime; - case 3: - return EndStoneSmelterBlockEntity.this.smeltTimeTotal; - default: - return 0; - } - } + this.propertyDelegate = new ContainerData() { + public int get(int index) { + switch(index) { + case 0: + return EndStoneSmelterBlockEntity.this.burnTime; + case 1: + return EndStoneSmelterBlockEntity.this.fuelTime; + case 2: + return EndStoneSmelterBlockEntity.this.smeltTime; + case 3: + return EndStoneSmelterBlockEntity.this.smeltTimeTotal; + default: + return 0; + } + } - public void set(int index, int value) { - switch (index) { - case 0: - EndStoneSmelterBlockEntity.this.burnTime = value; - break; - case 1: - EndStoneSmelterBlockEntity.this.fuelTime = value; - break; - case 2: - EndStoneSmelterBlockEntity.this.smeltTime = value; - break; - case 3: - EndStoneSmelterBlockEntity.this.smeltTimeTotal = value; - } - } + public void set(int index, int value) { + switch(index) { + case 0: + EndStoneSmelterBlockEntity.this.burnTime = value; + break; + case 1: + EndStoneSmelterBlockEntity.this.fuelTime = value; + break; + case 2: + EndStoneSmelterBlockEntity.this.smeltTime = value; + break; + case 3: + EndStoneSmelterBlockEntity.this.smeltTimeTotal = value; + } + } - public int size() { - return 4; - } - }; + public int getCount() { + return 4; + } + }; } private boolean isBurning() { @@ -110,7 +109,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity } @Override - public int size() { + public int getContainerSize() { return this.inventory.size(); } @@ -129,103 +128,101 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity } @Override - public ItemStack getStack(int slot) { + public ItemStack getItem(int slot) { return this.inventory.get(slot); } @Override - public ItemStack removeStack(int slot, int amount) { - return Inventories.splitStack(this.inventory, slot, amount); + public ItemStack removeItem(int slot, int amount) { + return ContainerHelper.removeItem(this.inventory, slot, amount); } @Override - public ItemStack removeStack(int slot) { - return Inventories.removeStack(this.inventory, slot); + public ItemStack removeItemNoUpdate(int slot) { + return ContainerHelper.takeItem(this.inventory, slot); } @Override - public void setStack(int slot, ItemStack stack) { + public void setItem(int slot, ItemStack stack) { ItemStack itemStack = this.inventory.get(slot); - boolean stackValid = !stack.isEmpty() && stack.isItemEqualIgnoreDamage(itemStack) - && ItemStack.areTagsEqual(stack, itemStack); + boolean stackValid = !stack.isEmpty() && stack.sameItem(itemStack) && ItemStack.tagMatches(stack, itemStack); this.inventory.set(slot, stack); - if (stack.getCount() > getMaxCountPerStack()) { - stack.setCount(getMaxCountPerStack()); + if (stack.getCount() > getMaxStackSize()) { + stack.setCount(getMaxStackSize()); } if ((slot == 0 || slot == 1) && !stackValid) { this.smeltTimeTotal = this.getSmeltTime(); this.smeltTime = 0; - this.markDirty(); + this.setChanged(); } } - + protected int getSmeltTime() { - assert this.world != null; - int smeltTime = this.world.getRecipeManager().getFirstMatch(AlloyingRecipe.TYPE, this, world) + assert this.level != null; + int smeltTime = this.level.getRecipeManager().getRecipeFor(AlloyingRecipe.TYPE, this, level) .map(AlloyingRecipe::getSmeltTime).orElse(0); if (smeltTime == 0) { - smeltTime = this.world.getRecipeManager().getFirstMatch(RecipeType.BLASTING, this, world) - .map(BlastingRecipe::getCookTime).orElse(200); + smeltTime = this.level.getRecipeManager().getRecipeFor(RecipeType.BLASTING, this, level) + .map(BlastingRecipe::getCookingTime).orElse(200); smeltTime /= 1.5; } return smeltTime; } - + public void dropExperience(Player player) { - assert world != null; + assert level != null; List> list = Lists.newArrayList(); for (Entry entry : this.recipesUsed.object2IntEntrySet()) { - world.getRecipeManager().get(entry.getKey()).ifPresent((recipe) -> { + level.getRecipeManager().byKey(entry.getKey()).ifPresent((recipe) -> { list.add(recipe); if (recipe instanceof AlloyingRecipe) { AlloyingRecipe alloying = (AlloyingRecipe) recipe; - this.dropExperience(player.world, player.getPos(), entry.getIntValue(), alloying.getExperience()); + this.dropExperience(player.level, player.position(), entry.getIntValue(), alloying.getExperience()); } else { BlastingRecipe blasting = (BlastingRecipe) recipe; - this.dropExperience(player.world, player.getPos(), entry.getIntValue(), blasting.getExperience()); + this.dropExperience(player.level, player.position(), entry.getIntValue(), blasting.getExperience()); } }); } - player.unlockRecipes(list); + player.awardRecipes(list); this.recipesUsed.clear(); } - - private void dropExperience(Level world, Vec3d vec3d, int i, float f) { + + private void dropExperience(Level world, Vec3 vec3d, int i, float f) { int j = Mth.floor(i * f); - float g = Mth.fractionalPart(i * f); + float g = Mth.frac(i * f); if (g != 0.0F && Math.random() < g) { j++; } - while (j > 0) { - int k = ExperienceOrbEntity.roundToOrbSize(j); + while(j > 0) { + int k = ExperienceOrb.getExperienceValue(j); j -= k; - world.spawnEntity(new ExperienceOrbEntity(world, vec3d.x, vec3d.y, vec3d.z, k)); + world.addFreshEntity(new ExperienceOrb(world, vec3d.x, vec3d.y, vec3d.z, k)); } } @Override - public boolean canPlayerUse(Player player) { - assert this.world != null; - if (this.world.getBlockEntity(this.pos) != this) { + public boolean stillValid(Player player) { + assert this.level != null; + if (this.level.getBlockEntity(this.worldPosition) != this) { return false; } - return player.squaredDistanceTo(this.pos.getX() + 0.5D, this.pos.getY() + 0.5D, - this.pos.getZ() + 0.5D) <= 64.0D; + return player.distanceToSqr(this.worldPosition.getX() + 0.5D, this.worldPosition.getY() + 0.5D, this.worldPosition.getZ() + 0.5D) <= 64.0D; } @Override - public void clear() { + public void clearContent() { this.inventory.clear(); } @Override - protected Text getContainerName() { - return new TranslatableText(String.format("block.%s.%s", BetterEnd.MOD_ID, EndStoneSmelter.ID)); + protected Component getDefaultName() { + return new TranslatableComponent(String.format("block.%s.%s", BetterEnd.MOD_ID, EndStoneSmelter.ID)); } @Override - protected ScreenHandler createScreenHandler(int syncId, PlayerInventory playerInventory) { + protected AbstractContainerMenu createMenu(int syncId, Inventory playerInventory) { return new EndStoneSmelterScreenHandler(syncId, playerInventory, this, propertyDelegate); } @@ -237,18 +234,17 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity } boolean burning = this.isBurning(); - assert this.world != null; - if (!this.world.isClientSide) { + assert this.level != null; + if (!this.level.isClientSide) { ItemStack fuel = this.inventory.get(2); if (!burning && (fuel.isEmpty() || inventory.get(0).isEmpty() && inventory.get(1).isEmpty())) { if (smeltTime > 0) { this.smeltTime = Mth.clamp(smeltTime - 2, 0, smeltTimeTotal); } } else { - Recipe recipe = this.world.getRecipeManager().getFirstMatch(AlloyingRecipe.TYPE, this, world) - .orElse(null); + Recipe recipe = this.level.getRecipeManager().getRecipeFor(AlloyingRecipe.TYPE, this, level).orElse(null); if (recipe == null) { - recipe = this.world.getRecipeManager().getFirstMatch(RecipeType.BLASTING, this, world).orElse(null); + recipe = this.level.getRecipeManager().getRecipeFor(RecipeType.BLASTING, this, level).orElse(null); } boolean accepted = this.canAcceptRecipeOutput(recipe); if (!burning && accepted) { @@ -258,13 +254,13 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity if (burning) { if (!fuel.isEmpty()) { Item item = fuel.getItem(); - fuel.decrement(1); + fuel.shrink(1); if (fuel.isEmpty()) { - Item remainFuel = item.getRecipeRemainder(); + Item remainFuel = item.getCraftingRemainingItem(); this.inventory.set(2, remainFuel == null ? ItemStack.EMPTY : new ItemStack(remainFuel)); } } - this.markDirty(); + this.setChanged(); } } @@ -274,7 +270,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity this.smeltTime = 0; this.smeltTimeTotal = this.getSmeltTime(); this.craftRecipe(recipe); - this.markDirty(); + this.setChanged(); } } else { this.smeltTime = 0; @@ -282,23 +278,24 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity } if (initialBurning != burning) { - this.world.setBlockAndUpdate(pos, world.getBlockState(pos).with(EndStoneSmelter.LIT, burning), 3); - this.markDirty(); + this.level.setBlock(worldPosition, level.getBlockState(worldPosition).setValue(EndStoneSmelter.LIT, burning), 3); + this.setChanged(); } } } - + protected boolean canAcceptRecipeOutput(Recipe recipe) { - if (recipe == null) - return false; + if (recipe == null) return false; boolean validInput; if (recipe instanceof AlloyingRecipe) { - validInput = !inventory.get(0).isEmpty() && !inventory.get(1).isEmpty(); + validInput = !inventory.get(0).isEmpty() && + !inventory.get(1).isEmpty(); } else { - validInput = !inventory.get(0).isEmpty() || !inventory.get(1).isEmpty(); + validInput = !inventory.get(0).isEmpty() || + !inventory.get(1).isEmpty(); } if (validInput) { - ItemStack result = recipe.getOutput(); + ItemStack result = recipe.getResultItem(); if (result.isEmpty()) { return false; } @@ -308,55 +305,54 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity if (output.isEmpty()) { return true; } - if (!output.isItemEqualIgnoreDamage(result)) { + if (!output.sameItem(result)) { return false; } - if (outCount < this.getMaxCountPerStack() && outCount < output.getMaxCount()) { - return this.getMaxCountPerStack() >= total; + if (outCount < this.getMaxStackSize() && outCount < output.getMaxStackSize()) { + return this.getMaxStackSize() >= total; } - return output.getCount() < result.getMaxCount(); + return output.getCount() < result.getMaxStackSize(); } return false; } private void craftRecipe(Recipe recipe) { - if (recipe == null || !canAcceptRecipeOutput(recipe)) - return; - - ItemStack result = recipe.getOutput(); + if (recipe == null || !canAcceptRecipeOutput(recipe)) return; + + ItemStack result = recipe.getResultItem(); ItemStack output = this.inventory.get(3); if (output.isEmpty()) { this.inventory.set(3, result.copy()); } else if (output.getItem() == result.getItem()) { - output.increment(result.getCount()); + output.grow(result.getCount()); } - assert this.world != null; - if (!this.world.isClientSide) { - this.setLastRecipe(recipe); + assert this.level != null; + if (!this.level.isClientSide) { + this.setRecipeUsed(recipe); } - + if (recipe instanceof AlloyingRecipe) { - this.inventory.get(0).decrement(1); - this.inventory.get(1).decrement(1); + this.inventory.get(0).shrink(1); + this.inventory.get(1).shrink(1); } else { if (!this.inventory.get(0).isEmpty()) { - this.inventory.get(0).decrement(1); + this.inventory.get(0).shrink(1); } else { - this.inventory.get(1).decrement(1); + this.inventory.get(1).shrink(1); } } } @Override - public void provideRecipeInputs(RecipeFinder finder) { + public void fillStackedContents(StackedContents finder) { for (ItemStack itemStack : this.inventory) { - finder.addItem(itemStack); + finder.accountStack(itemStack); } } @Override - public void setLastRecipe(Recipe recipe) { + public void setRecipeUsed(Recipe recipe) { if (recipe != null) { ResourceLocation recipeId = recipe.getId(); this.recipesUsed.addTo(recipeId, 1); @@ -365,12 +361,12 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity } @Override - public Recipe getLastRecipe() { + public Recipe getRecipeUsed() { return this.lastRecipe; } @Override - public int[] getAvailableSlots(Direction side) { + public int[] getSlotsForFace(Direction side) { if (side == Direction.DOWN) { return BOTTOM_SLOTS; } @@ -378,12 +374,12 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity } @Override - public boolean canInsert(int slot, ItemStack stack, Direction dir) { - return this.isValid(slot, stack); + public boolean canPlaceItemThroughFace(int slot, ItemStack stack, Direction dir) { + return this.canPlaceItem(slot, stack); } @Override - public boolean canExtract(int slot, ItemStack stack, Direction dir) { + public boolean canTakeItemThroughFace(int slot, ItemStack stack, Direction dir) { if (dir == Direction.DOWN && slot == 2) { return stack.getItem() == Items.BUCKET; } @@ -397,38 +393,38 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity Item item = fuel.getItem(); return AVAILABLE_FUELS.getOrDefault(item, getFabricFuel(fuel)); } - + @Override - public void fromTag(BlockState state, CompoundTag tag) { - super.fromTag(state, tag); - this.inventory = DefaultedList.ofSize(size(), ItemStack.EMPTY); - Inventories.fromTag(tag, inventory); + public void load(BlockState state, CompoundTag tag) { + super.load(state, tag); + this.inventory = NonNullList.withSize(getContainerSize(), ItemStack.EMPTY); + ContainerHelper.loadAllItems(tag, inventory); this.burnTime = tag.getShort("BurnTime"); this.fuelTime = tag.getShort("FuelTime"); this.smeltTime = tag.getShort("SmeltTime"); this.smeltTimeTotal = tag.getShort("SmeltTimeTotal"); CompoundTag compoundTag = tag.getCompound("RecipesUsed"); - for (String id : compoundTag.getKeys()) { + for (String id : compoundTag.getAllKeys()) { this.recipesUsed.put(new ResourceLocation(id), compoundTag.getInt(id)); } } - + @Override - public CompoundTag toTag(CompoundTag tag) { - super.toTag(tag); + public CompoundTag save(CompoundTag tag) { + super.save(tag); tag.putShort("BurnTime", (short) burnTime); tag.putShort("FuelTime", (short) fuelTime); tag.putShort("SmeltTime", (short) smeltTime); tag.putShort("SmeltTimeTotal", (short) smeltTimeTotal); - Inventories.toTag(tag, inventory); + ContainerHelper.saveAllItems(tag, inventory); CompoundTag usedRecipes = new CompoundTag(); this.recipesUsed.forEach((identifier, integer) -> usedRecipes.putInt(identifier.toString(), integer)); tag.put("RecipesUsed", usedRecipes); - + return tag; } - - public boolean isValid(int slot, ItemStack stack) { + + public boolean canPlaceItem(int slot, ItemStack stack) { if (slot == 3) { return false; } else if (slot != 2) { @@ -449,14 +445,14 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity public static Map availableFuels() { return AVAILABLE_FUELS; } - + private static int getFabricFuel(ItemStack stack) { Integer ticks = FuelRegistry.INSTANCE.get(stack.getItem()); return ticks == null ? 0 : ticks; } static { - AbstractFurnaceBlockEntity.createFuelTimeMap().forEach((item, time) -> { + AbstractFurnaceBlockEntity.getFuel().forEach((item, time) -> { if (time >= 2000) { registerFuel(item, time); } diff --git a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java index f6ab8e2b..d4da8a18 100644 --- a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java @@ -1,51 +1,51 @@ package ru.betterend.blocks.entities; -import net.minecraft.nbt.CompoundTag; import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.Level; import ru.betterend.registry.EndBlockEntities; import ru.betterend.rituals.EternalRitual; public class EternalPedestalEntity extends PedestalBlockEntity { private EternalRitual linkedRitual; - + public EternalPedestalEntity() { super(EndBlockEntities.ETERNAL_PEDESTAL); } - + public boolean hasRitual() { return linkedRitual != null; } - + public void linkRitual(EternalRitual ritual) { this.linkedRitual = ritual; } - + public EternalRitual getRitual() { return linkedRitual; } - + @Override - public void setLocation(Level world, BlockPos pos) { - super.setLocation(world, pos); + public void setLevelAndPosition(Level world, BlockPos pos) { + super.setLevelAndPosition(world, pos); if (hasRitual()) { linkedRitual.setWorld(world); } } @Override - public CompoundTag toTag(CompoundTag tag) { + public CompoundTag save(CompoundTag tag) { if (hasRitual()) { tag.put("ritual", linkedRitual.toTag(new CompoundTag())); } - return super.toTag(tag); + return super.save(tag); } @Override protected void fromTag(CompoundTag tag) { super.fromTag(tag); if (tag.contains("ritual")) { - linkedRitual = new EternalRitual(world); + linkedRitual = new EternalRitual(level); linkedRitual.fromTag(tag.getCompound("ritual")); } } diff --git a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java index f0151b12..51e1aac7 100644 --- a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java @@ -1,7 +1,7 @@ package ru.betterend.blocks.entities; -import net.minecraft.nbt.CompoundTag; import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.Level; import ru.betterend.registry.EndBlockEntities; import ru.betterend.rituals.InfusionRitual; @@ -9,31 +9,31 @@ import ru.betterend.rituals.InfusionRitual; public class InfusionPedestalEntity extends PedestalBlockEntity { private InfusionRitual linkedRitual; - + public InfusionPedestalEntity() { super(EndBlockEntities.INFUSION_PEDESTAL); } - + @Override - public void setLocation(Level world, BlockPos pos) { - super.setLocation(world, pos); + public void setLevelAndPosition(Level world, BlockPos pos) { + super.setLevelAndPosition(world, pos); if (hasRitual()) { linkedRitual.setLocation(world, pos); } } - + public void linkRitual(InfusionRitual ritual) { linkedRitual = ritual; } - + public InfusionRitual getRitual() { return linkedRitual; } - + public boolean hasRitual() { return linkedRitual != null; } - + @Override public void tick() { if (hasRitual()) { @@ -43,18 +43,18 @@ public class InfusionPedestalEntity extends PedestalBlockEntity { } @Override - public CompoundTag toTag(CompoundTag tag) { + public CompoundTag save(CompoundTag tag) { if (hasRitual()) { tag.put("ritual", linkedRitual.toTag(new CompoundTag())); } - return super.toTag(tag); + return super.save(tag); } @Override protected void fromTag(CompoundTag tag) { super.fromTag(tag); if (tag.contains("ritual")) { - linkedRitual = new InfusionRitual(world, pos); + linkedRitual = new InfusionRitual(level, worldPosition); linkedRitual.fromTag(tag.getCompound("ritual")); } } diff --git a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java index a8e6a7e9..f9e475be 100644 --- a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java @@ -1,42 +1,42 @@ package ru.betterend.blocks.entities; import net.fabricmc.fabric.api.block.entity.BlockEntityClientSerializable; -import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.Container; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.entity.player.Player; -import net.minecraft.inventory.Inventory; -import net.minecraft.world.item.ItemStack; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.util.Tickable; +import net.minecraft.world.level.block.entity.TickableBlockEntity; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.registry.EndBlockEntities; import ru.betterend.registry.EndItems; -public class PedestalBlockEntity extends BlockEntity implements Inventory, Tickable, BlockEntityClientSerializable { +public class PedestalBlockEntity extends BlockEntity implements Container, TickableBlockEntity, BlockEntityClientSerializable { private ItemStack activeItem = ItemStack.EMPTY; - + private final int maxAge = 314; private int age; - + public PedestalBlockEntity() { super(EndBlockEntities.PEDESTAL); } - + public PedestalBlockEntity(BlockEntityType type) { super(type); } - + public int getAge() { return age; } - + public int getMaxAge() { return maxAge; } @Override - public int size() { + public int getContainerSize() { return 1; } @@ -46,71 +46,72 @@ public class PedestalBlockEntity extends BlockEntity implements Inventory, Ticka } @Override - public ItemStack getStack(int slot) { + public ItemStack getItem(int slot) { return activeItem; } @Override - public ItemStack removeStack(int slot, int amount) { - return removeStack(slot); + public ItemStack removeItem(int slot, int amount) { + return removeItemNoUpdate(slot); } - + @Override - public boolean isValid(int slot, ItemStack stack) { + public boolean canPlaceItem(int slot, ItemStack stack) { return isEmpty(); } @Override - public void clear() { + public void clearContent() { activeItem = ItemStack.EMPTY; - markDirty(); + setChanged(); } @Override - public ItemStack removeStack(int slot) { + public ItemStack removeItemNoUpdate(int slot) { ItemStack stored = activeItem; - clear(); + clearContent(); return stored; } @Override - public void setStack(int slot, ItemStack stack) { + public void setItem(int slot, ItemStack stack) { activeItem = stack; - markDirty(); + setChanged(); } - + @Override - public void markDirty() { - if (world != null && !world.isClientSide) { - BlockState state = world.getBlockState(pos); + public void setChanged() { + if (level != null && !level.isClientSide) { + BlockState state = level.getBlockState(worldPosition); if (state.getBlock() instanceof PedestalBlock) { - BlockState trueState = state.with(PedestalBlock.HAS_ITEM, !isEmpty()); + BlockState trueState = state.setValue(PedestalBlock.HAS_ITEM, !isEmpty()); if (activeItem.getItem() == EndItems.ETERNAL_CRYSTAL) { - trueState = trueState.with(PedestalBlock.HAS_LIGHT, true); + trueState = trueState.setValue(PedestalBlock.HAS_LIGHT, true); } else { - trueState = trueState.with(PedestalBlock.HAS_LIGHT, false); + trueState = trueState.setValue(PedestalBlock.HAS_LIGHT, false); } - world.setBlockAndUpdate(pos, trueState); + level.setBlockAndUpdate(worldPosition, trueState); } } - super.markDirty(); + super.setChanged(); } + @Override - public boolean canPlayerUse(Player player) { + public boolean stillValid(Player player) { return true; } - + @Override - public void fromTag(BlockState state, CompoundTag tag) { - super.fromTag(state, tag); + public void load(BlockState state, CompoundTag tag) { + super.load(state, tag); fromTag(tag); } @Override - public CompoundTag toTag(CompoundTag tag) { - tag.put("active_item", activeItem.toTag(new CompoundTag())); - return super.toTag(tag); + public CompoundTag save(CompoundTag tag) { + tag.put("active_item", activeItem.save(new CompoundTag())); + return super.save(tag); } @Override @@ -120,13 +121,13 @@ public class PedestalBlockEntity extends BlockEntity implements Inventory, Ticka @Override public CompoundTag toClientTag(CompoundTag tag) { - return toTag(tag); + return save(tag); } protected void fromTag(CompoundTag tag) { if (tag.contains("active_item")) { CompoundTag itemTag = tag.getCompound("active_item"); - activeItem = ItemStack.fromTag(itemTag); + activeItem = ItemStack.of(itemTag); } } diff --git a/src/main/java/ru/betterend/blocks/entities/render/EndChestBlockEntityRenderer.java b/src/main/java/ru/betterend/blocks/entities/render/EndChestBlockEntityRenderer.java index 24bc27b9..2b6b7838 100644 --- a/src/main/java/ru/betterend/blocks/entities/render/EndChestBlockEntityRenderer.java +++ b/src/main/java/ru/betterend/blocks/entities/render/EndChestBlockEntityRenderer.java @@ -1,43 +1,41 @@ package ru.betterend.blocks.entities.render; import java.util.HashMap; - -import com.google.common.collect.Maps; - -import it.unimi.dsi.fastutil.floats.Float2FloatFunction; -import it.unimi.dsi.fastutil.ints.Int2IntFunction; -import net.minecraft.world.level.block.AbstractChestBlock; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.ChestBlock; -import net.minecraft.world.level.block.DoubleBlockProperties; -import net.minecraft.world.level.block.DoubleBlockProperties.PropertySource; -import net.minecraft.world.level.block.entity.ChestBlockEntity; -import net.minecraft.world.level.block.enums.ChestType; -import net.minecraft.client.block.ChestAnimationProgress; -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher; -import net.minecraft.client.render.block.entity.BlockEntityRenderer; -import net.minecraft.client.render.block.entity.LightmapCoordinatesRetriever; -import net.minecraft.client.util.math.MatrixStack; -import com.mojang.math.Vector3f; -import net.minecraft.world.item.BlockItem; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.BrightnessCombiner; import net.minecraft.core.Direction; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.BlockItem; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.AbstractChestBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.ChestBlock; +import net.minecraft.world.level.block.DoubleBlockCombiner; +import net.minecraft.world.level.block.DoubleBlockCombiner.NeighborCombineResult; +import net.minecraft.world.level.block.entity.ChestBlockEntity; +import net.minecraft.world.level.block.entity.LidBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.ChestType; +import com.google.common.collect.Maps; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Vector3f; +import it.unimi.dsi.fastutil.floats.Float2FloatFunction; +import it.unimi.dsi.fastutil.ints.Int2IntFunction; import ru.betterend.BetterEnd; import ru.betterend.blocks.basis.EndChestBlock; import ru.betterend.blocks.entities.EChestBlockEntity; import ru.betterend.registry.EndItems; public class EndChestBlockEntityRenderer extends BlockEntityRenderer { - private static final HashMap LAYERS = Maps.newHashMap(); - private static RenderLayer[] defaultLayer; + private static final HashMap LAYERS = Maps.newHashMap(); + private static RenderType[] defaultLayer; private static final int ID_NORMAL = 0; private static final int ID_LEFT = 1; @@ -57,97 +55,88 @@ public class EndChestBlockEntityRenderer extends BlockEntityRenderer abstractChestBlock = (AbstractChestBlock) block; boolean isDouble = chestType != ChestType.SINGLE; - float f = ((Direction) blockState.get(ChestBlock.FACING)).asRotation(); - PropertySource propertySource; + float f = ((Direction) blockState.getValue(ChestBlock.FACING)).toYRot(); + NeighborCombineResult propertySource; - matrices.push(); + matrices.pushPose(); matrices.translate(0.5D, 0.5D, 0.5D); - matrices.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(-f)); + matrices.mulPose(Vector3f.YP.rotationDegrees(-f)); matrices.translate(-0.5D, -0.5D, -0.5D); if (worldExists) { - propertySource = abstractChestBlock.getBlockEntitySource(blockState, world, entity.getPos(), true); + propertySource = abstractChestBlock.combine(blockState, world, entity.getBlockPos(), true); } else { - propertySource = DoubleBlockProperties.PropertyRetriever::getFallback; + propertySource = DoubleBlockCombiner.Combiner::acceptNone; } - float pitch = ((Float2FloatFunction) propertySource - .apply(ChestBlock.getAnimationProgressRetriever((ChestAnimationProgress) entity))).get(tickDelta); + float pitch = ((Float2FloatFunction) propertySource.apply(ChestBlock.opennessCombiner((LidBlockEntity) entity))).get(tickDelta); pitch = 1.0F - pitch; pitch = 1.0F - pitch * pitch * pitch; @SuppressWarnings({ "unchecked", "rawtypes" }) - int blockLight = ((Int2IntFunction) propertySource.apply(new LightmapCoordinatesRetriever())) - .applyAsInt(light); + int blockLight = ((Int2IntFunction) propertySource.apply(new BrightnessCombiner())).applyAsInt(light); VertexConsumer vertexConsumer = getConsumer(vertexConsumers, block, chestType); if (isDouble) { if (chestType == ChestType.LEFT) { - renderParts(matrices, vertexConsumer, this.partLeftA, this.partLeftB, this.partLeftC, pitch, - blockLight, overlay); + renderParts(matrices, vertexConsumer, this.partLeftA, this.partLeftB, this.partLeftC, pitch, blockLight, overlay); } else { - renderParts(matrices, vertexConsumer, this.partRightA, this.partRightB, this.partRightC, pitch, - blockLight, overlay); + renderParts(matrices, vertexConsumer, this.partRightA, this.partRightB, this.partRightC, pitch, blockLight, overlay); } } else { renderParts(matrices, vertexConsumer, this.partA, this.partB, this.partC, pitch, blockLight, overlay); } - matrices.pop(); + matrices.popPose(); } } - private void renderParts(MatrixStack matrices, VertexConsumer vertices, ModelPart modelPart, ModelPart modelPart2, - ModelPart modelPart3, float pitch, int light, int overlay) { - modelPart.pitch = -(pitch * 1.5707964F); - modelPart2.pitch = modelPart.pitch; + private void renderParts(PoseStack matrices, VertexConsumer vertices, ModelPart modelPart, ModelPart modelPart2, ModelPart modelPart3, float pitch, int light, int overlay) { + modelPart.xRot = -(pitch * 1.5707964F); + modelPart2.xRot = modelPart.xRot; modelPart.render(matrices, vertices, light, overlay); modelPart2.render(matrices, vertices, light, overlay); modelPart3.render(matrices, vertices, light, overlay); } - private static RenderLayer getChestTexture(ChestType type, RenderLayer[] layers) { + private static RenderType getChestTexture(ChestType type, RenderType[] layers) { switch (type) { case LEFT: return layers[ID_LEFT]; @@ -159,28 +148,28 @@ public class EndChestBlockEntityRenderer extends BlockEntityRenderer { if (item instanceof BlockItem) { Block block = ((BlockItem) item).getBlock(); if (block instanceof EndChestBlock) { String name = Registry.BLOCK.getKey(block).getPath(); - LAYERS.put(block, new RenderLayer[] { - RenderLayer.getEntityCutout(BetterEnd.makeID("textures/entity/chest/" + name + ".png")), - RenderLayer - .getEntityCutout(BetterEnd.makeID("textures/entity/chest/" + name + "_left.png")), - RenderLayer.getEntityCutout( - BetterEnd.makeID("textures/entity/chest/" + name + "_right.png")) }); + LAYERS.put(block, new RenderType[] { + RenderType.entityCutout(BetterEnd.makeID("textures/entity/chest/" + name + ".png")), + RenderType.entityCutout(BetterEnd.makeID("textures/entity/chest/" + name + "_left.png")), + RenderType.entityCutout(BetterEnd.makeID("textures/entity/chest/" + name + "_right.png")) + }); } } }); diff --git a/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java b/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java index 287f9ec6..9c979617 100644 --- a/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java +++ b/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java @@ -2,122 +2,119 @@ package ru.betterend.blocks.entities.render; import java.util.HashMap; import java.util.List; - -import com.google.common.collect.Maps; - -import net.minecraft.world.level.block.SignBlock; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.SignBlock; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.TexturedRenderLayers; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher; -import net.minecraft.client.render.block.entity.BlockEntityRenderer; -import net.minecraft.client.render.block.entity.SignBlockEntityRenderer; -import net.minecraft.client.render.block.entity.SignBlockEntityRenderer.SignModel; -import net.minecraft.client.texture.NativeImage; -import net.minecraft.client.util.SpriteIdentifier; -import net.minecraft.client.util.math.MatrixStack; -import com.mojang.math.Vector3f; -import net.minecraft.world.item.BlockItem; -import net.minecraft.text.OrderedText; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.SignType; +import net.minecraft.client.gui.Font; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.SignRenderer; +import net.minecraft.client.renderer.blockentity.SignRenderer.SignModel; +import net.minecraft.client.resources.model.Material; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.FormattedCharSequence; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SignBlock; +import net.minecraft.world.level.block.StandingSignBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.WoodType; +import com.google.common.collect.Maps; +import com.mojang.blaze3d.platform.NativeImage; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Vector3f; import ru.betterend.BetterEnd; import ru.betterend.blocks.basis.EndSignBlock; import ru.betterend.blocks.entities.ESignBlockEntity; import ru.betterend.registry.EndItems; public class EndSignBlockEntityRenderer extends BlockEntityRenderer { - private static final HashMap LAYERS = Maps.newHashMap(); - private static RenderLayer defaultLayer; - private final SignModel model = new SignBlockEntityRenderer.SignModel(); + private static final HashMap LAYERS = Maps.newHashMap(); + private static RenderType defaultLayer; + private final SignModel model = new SignRenderer.SignModel(); public EndSignBlockEntityRenderer(BlockEntityRenderDispatcher dispatcher) { super(dispatcher); } - public void render(ESignBlockEntity signBlockEntity, float tickDelta, MatrixStack matrixStack, - VertexConsumerProvider provider, int light, int overlay) { - BlockState state = signBlockEntity.getCachedState(); - matrixStack.push(); + public void render(ESignBlockEntity signBlockEntity, float tickDelta, PoseStack matrixStack, + MultiBufferSource provider, int light, int overlay) { + BlockState state = signBlockEntity.getBlockState(); + matrixStack.pushPose(); matrixStack.translate(0.5D, 0.5D, 0.5D); - float angle = -((float) ((Integer) state.getValue(SignBlock.ROTATION) * 360) / 16.0F); + float angle = -((float) ((Integer) state.getValue(StandingSignBlock.ROTATION) * 360) / 16.0F); - BlockState blockState = signBlockEntity.getCachedState(); - if (blockState.get(EndSignBlock.FLOOR)) { - matrixStack.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(angle)); - this.model.foot.visible = true; + BlockState blockState = signBlockEntity.getBlockState(); + if (blockState.getValue(EndSignBlock.FLOOR)) { + matrixStack.mulPose(Vector3f.YP.rotationDegrees(angle)); + this.model.stick.visible = true; } else { - matrixStack.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(angle + 180)); + matrixStack.mulPose(Vector3f.YP.rotationDegrees(angle + 180)); matrixStack.translate(0.0D, -0.3125D, -0.4375D); - this.model.foot.visible = false; + this.model.stick.visible = false; } - matrixStack.push(); + matrixStack.pushPose(); matrixStack.scale(0.6666667F, -0.6666667F, -0.6666667F); VertexConsumer vertexConsumer = getConsumer(provider, state.getBlock()); - model.field.render(matrixStack, vertexConsumer, light, overlay); - model.foot.render(matrixStack, vertexConsumer, light, overlay); - matrixStack.pop(); - TextRenderer textRenderer = dispatcher.getTextRenderer(); + model.sign.render(matrixStack, vertexConsumer, light, overlay); + model.stick.render(matrixStack, vertexConsumer, light, overlay); + matrixStack.popPose(); + Font textRenderer = renderer.getFont(); matrixStack.translate(0.0D, 0.3333333432674408D, 0.046666666865348816D); matrixStack.scale(0.010416667F, -0.010416667F, 0.010416667F); - int m = signBlockEntity.getTextColor().getSignColor(); - int n = (int) (NativeImage.getRed(m) * 0.4D); - int o = (int) (NativeImage.getGreen(m) * 0.4D); - int p = (int) (NativeImage.getBlue(m) * 0.4D); - int q = NativeImage.getAbgrColor(0, p, o, n); + int m = signBlockEntity.getColor().getTextColor(); + int n = (int) (NativeImage.getR(m) * 0.4D); + int o = (int) (NativeImage.getG(m) * 0.4D); + int p = (int) (NativeImage.getB(m) * 0.4D); + int q = NativeImage.combine(0, p, o, n); for (int s = 0; s < 4; ++s) { - OrderedText orderedText = signBlockEntity.getTextBeingEditedOnRow(s, (text) -> { - List list = textRenderer.wrapLines(text, 90); - return list.isEmpty() ? OrderedText.EMPTY : (OrderedText) list.get(0); + FormattedCharSequence orderedText = signBlockEntity.getRenderMessage(s, (text) -> { + List list = textRenderer.split(text, 90); + return list.isEmpty() ? FormattedCharSequence.EMPTY : (FormattedCharSequence) list.get(0); }); if (orderedText != null) { - float t = (float) (-textRenderer.getWidth(orderedText) / 2); - textRenderer.draw((OrderedText) orderedText, t, (float) (s * 10 - 20), q, false, - matrixStack.peek().getModel(), provider, false, 0, light); + float t = (float) (-textRenderer.width(orderedText) / 2); + textRenderer.drawInBatch((FormattedCharSequence) orderedText, t, (float) (s * 10 - 20), q, false, matrixStack.last().pose(), provider, false, 0, light); } } - matrixStack.pop(); + matrixStack.popPose(); } - public static SpriteIdentifier getModelTexture(Block block) { - SignType signType2; + public static Material getModelTexture(Block block) { + WoodType signType2; if (block instanceof SignBlock) { - signType2 = ((SignBlock) block).getSignType(); + signType2 = ((SignBlock) block).type(); } else { - signType2 = SignType.OAK; + signType2 = WoodType.OAK; } - return TexturedRenderLayers.getSignTextureId(signType2); + return Sheets.signTexture(signType2); } - - public static VertexConsumer getConsumer(VertexConsumerProvider provider, Block block) { + + public static VertexConsumer getConsumer(MultiBufferSource provider, Block block) { return provider.getBuffer(LAYERS.getOrDefault(block, defaultLayer)); } static { - defaultLayer = RenderLayer.getEntitySolid(new ResourceLocation("textures/entity/sign/oak.png")); - + defaultLayer = RenderType.entitySolid(new ResourceLocation("textures/entity/sign/oak.png")); + EndItems.getModBlocks().forEach((item) -> { if (item instanceof BlockItem) { Block block = ((BlockItem) item).getBlock(); if (block instanceof EndSignBlock) { String name = Registry.BLOCK.getKey(block).getPath(); - RenderLayer layer = RenderLayer - .getEntitySolid(BetterEnd.makeID("textures/entity/sign/" + name + ".png")); + RenderType layer = RenderType.entitySolid(BetterEnd.makeID("textures/entity/sign/" + name + ".png")); LAYERS.put(block, layer); } } }); } + } diff --git a/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java b/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java index 9f876575..d989e57d 100644 --- a/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java +++ b/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java @@ -1,21 +1,21 @@ package ru.betterend.blocks.entities.render; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Vector3f; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.client.Minecraft; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher; -import net.minecraft.client.render.block.entity.BlockEntityRenderer; -import net.minecraft.client.render.model.BakedModel; -import net.minecraft.client.render.model.json.ModelTransformation; -import net.minecraft.client.util.math.MatrixStack; -import com.mojang.math.Vector3f; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.model.ItemTransforms; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.util.Mth; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.util.Mth; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.EternalPedestal; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.entities.PedestalBlockEntity; @@ -27,31 +27,29 @@ import ru.betterend.registry.EndItems; @Environment(EnvType.CLIENT) public class PedestalItemRenderer extends BlockEntityRenderer { - + public PedestalItemRenderer(BlockEntityRenderDispatcher dispatcher) { super(dispatcher); } @Override - public void render(T blockEntity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, - int light, int overlay) { + public void render(T blockEntity, float tickDelta, PoseStack matrices, + MultiBufferSource vertexConsumers, int light, int overlay) { Level world = blockEntity.getLevel(); - if (world == null || blockEntity.isEmpty()) - return; + if (world == null || blockEntity.isEmpty()) return; - BlockState state = world.getBlockState(blockEntity.getPos()); - if (!(state.getBlock() instanceof PedestalBlock)) - return; + BlockState state = world.getBlockState(blockEntity.getBlockPos()); + if (!(state.getBlock() instanceof PedestalBlock)) return; + + ItemStack activeItem = blockEntity.getItem(0); - ItemStack activeItem = blockEntity.getStack(0); - - matrices.push(); + matrices.pushPose(); Minecraft minecraft = Minecraft.getInstance(); - BakedModel model = minecraft.getItemRenderer().getHeldItemModel(activeItem, world, null); - Vector3f translate = model.getTransformation().ground.translation; + BakedModel model = minecraft.getItemRenderer().getModel(activeItem, world, null); + Vector3f translate = model.getTransforms().ground.translation; PedestalBlock pedestal = (PedestalBlock) state.getBlock(); - matrices.translate(translate.getX(), translate.getY(), translate.getZ()); + matrices.translate(translate.x(), translate.y(), translate.z()); matrices.translate(0.5, pedestal.getHeight(state), 0.5); if (activeItem.getItem() instanceof BlockItem) { matrices.scale(1.5F, 1.5F, 1.5F); @@ -61,10 +59,9 @@ public class PedestalItemRenderer extends BlockEn int age = blockEntity.getAge(); if (state.is(EndBlocks.ETERNAL_PEDESTAL) && state.getValue(EternalPedestal.ACTIVATED)) { float[] colors = EternalCrystalRenderer.colors(age); - int y = blockEntity.getPos().getY(); - - BeamRenderer.renderLightBeam(matrices, vertexConsumers, age, tickDelta, -y, 1024 - y, colors, 0.25F, 0.13F, - 0.16F); + int y = blockEntity.getBlockPos().getY(); + + BeamRenderer.renderLightBeam(matrices, vertexConsumers, age, tickDelta, -y, 1024 - y, colors, 0.25F, 0.13F, 0.16F); float altitude = Mth.sin((blockEntity.getAge() + tickDelta) / 10.0F) * 0.1F + 0.1F; matrices.translate(0.0D, altitude, 0.0D); } @@ -74,10 +71,9 @@ public class PedestalItemRenderer extends BlockEn EternalCrystalRenderer.render(age, tickDelta, matrices, vertexConsumers, light); } else { float rotation = (age + tickDelta) / 25.0F + 6.0F; - matrices.multiply(Vector3f.POSITIVE_Y.getRadialQuaternion(rotation)); - minecraft.getItemRenderer().renderItem(activeItem, ModelTransformation.Mode.GROUND, false, matrices, - vertexConsumers, light, overlay, model); + matrices.mulPose(Vector3f.YP.rotation(rotation)); + minecraft.getItemRenderer().render(activeItem, ItemTransforms.TransformType.GROUND, false, matrices, vertexConsumers, light, overlay, model); } - matrices.pop(); + matrices.popPose(); } } diff --git a/src/main/java/ru/betterend/client/BetterEndClient.java b/src/main/java/ru/betterend/client/BetterEndClient.java index bdf5c88c..b9ba6104 100644 --- a/src/main/java/ru/betterend/client/BetterEndClient.java +++ b/src/main/java/ru/betterend/client/BetterEndClient.java @@ -2,7 +2,7 @@ package ru.betterend.client; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; -import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.renderer.RenderType; import net.minecraft.core.Registry; import ru.betterend.BetterEnd; import ru.betterend.client.render.ERenderLayer; @@ -24,15 +24,15 @@ public class BetterEndClient implements ClientModInitializer { EndEntitiesRenders.register(); EndModelProviders.register(); ClientOptions.init(); - + if (BetterEnd.isDevEnvironment()) { TranslationHelper.printMissingNames(); } } private void registerRenderLayers() { - RenderLayer cutout = RenderLayer.getCutout(); - RenderLayer translucent = RenderLayer.getTranslucent(); + RenderType cutout = RenderType.cutout(); + RenderType translucent = RenderType.translucent(); Registry.BLOCK.forEach(block -> { if (block instanceof IRenderTypeable) { ERenderLayer layer = ((IRenderTypeable) block).getRenderLayer(); diff --git a/src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java b/src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java index 8351c782..797438f7 100644 --- a/src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java +++ b/src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java @@ -3,32 +3,31 @@ package ru.betterend.client.gui; import java.util.Arrays; import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.platform.Lighting; import com.mojang.blaze3d.systems.RenderSystem; - +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Matrix4f; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.Util; +import net.minecraft.client.gui.GuiComponent; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.font.TextFieldHelper; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.multiplayer.ClientPacketListener; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.blockentity.SignRenderer.SignModel; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.network.chat.CommonComponents; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.network.protocol.game.ServerboundSignUpdatePacket; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.client.gui.DrawableHelper; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.ScreenTexts; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.client.render.BufferBuilder; -import net.minecraft.client.render.BufferRenderer; -import net.minecraft.client.render.DiffuseLighting; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.Tessellator; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.VertexFormats; -import net.minecraft.client.render.block.entity.SignBlockEntityRenderer.SignModel; -import net.minecraft.client.util.SelectionManager; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket; -import net.minecraft.text.LiteralText; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.Util; -import net.minecraft.util.math.Matrix4f; import ru.betterend.blocks.basis.EndSignBlock; import ru.betterend.blocks.entities.ESignBlockEntity; import ru.betterend.blocks.entities.render.EndSignBlockEntityRenderer; @@ -39,39 +38,39 @@ public class BlockSignEditScreen extends Screen { private final ESignBlockEntity sign; private int ticksSinceOpened; private int currentRow; - private SelectionManager selectionManager; + private TextFieldHelper selectionManager; private final String[] text = (String[]) Util.make(new String[4], (strings) -> { Arrays.fill(strings, ""); }); public BlockSignEditScreen(ESignBlockEntity sign) { - super(new TranslatableText("sign.edit")); + super(new TranslatableComponent("sign.edit")); this.sign = sign; } protected void init() { - this.client.keyboard.setRepeatEvents(true); - this.addButton(new ButtonWidget(this.width / 2 - 100, this.height / 4 + 120, 200, 20, ScreenTexts.DONE, + this.minecraft.keyboardHandler.setSendRepeatsToGui(true); + this.addButton(new Button(this.width / 2 - 100, this.height / 4 + 120, 200, 20, CommonComponents.GUI_DONE, (buttonWidget) -> { this.finishEditing(); })); this.sign.setEditable(false); - this.selectionManager = new SelectionManager(() -> { + this.selectionManager = new TextFieldHelper(() -> { return this.text[this.currentRow]; }, (string) -> { this.text[this.currentRow] = string; - this.sign.setTextOnRow(this.currentRow, new LiteralText(string)); - }, SelectionManager.makeClipboardGetter(this.client), SelectionManager.makeClipboardSetter(this.client), + this.sign.setMessage(this.currentRow, new TextComponent(string)); + }, TextFieldHelper.createClipboardGetter(this.minecraft), TextFieldHelper.createClipboardSetter(this.minecraft), (string) -> { - return this.client.textRenderer.getWidth(string) <= 90; + return this.minecraft.font.width(string) <= 90; }); } public void removed() { - this.client.keyboard.setRepeatEvents(false); - ClientPlayNetworkHandler clientPlayNetworkHandler = this.client.getNetworkHandler(); + this.minecraft.keyboardHandler.setSendRepeatsToGui(false); + ClientPacketListener clientPlayNetworkHandler = this.minecraft.getConnection(); if (clientPlayNetworkHandler != null) { - clientPlayNetworkHandler.sendPacket(new UpdateSignC2SPacket(this.sign.getPos(), this.text[0], this.text[1], + clientPlayNetworkHandler.send(new ServerboundSignUpdatePacket(this.sign.getBlockPos(), this.text[0], this.text[1], this.text[2], this.text[3])); } @@ -80,18 +79,18 @@ public class BlockSignEditScreen extends Screen { public void tick() { ++this.ticksSinceOpened; - if (!this.sign.getType().supports(this.sign.getCachedState().getBlock())) { + if (!this.sign.getType().isValid(this.sign.getBlockState().getBlock())) { this.finishEditing(); } } private void finishEditing() { - this.sign.markDirty(); - this.client.openScreen((Screen) null); + this.sign.setChanged(); + this.minecraft.setScreen((Screen) null); } public boolean charTyped(char chr, int keyCode) { - this.selectionManager.insert(chr); + this.selectionManager.charTyped(chr); return true; } @@ -102,29 +101,29 @@ public class BlockSignEditScreen extends Screen { public boolean keyPressed(int keyCode, int scanCode, int modifiers) { if (keyCode == 265) { this.currentRow = this.currentRow - 1 & 3; - this.selectionManager.moveCaretToEnd(); + this.selectionManager.setCursorToEnd(); return true; } else if (keyCode != 264 && keyCode != 257 && keyCode != 335) { - return this.selectionManager.handleSpecialKey(keyCode) ? true + return this.selectionManager.keyPressed(keyCode) ? true : super.keyPressed(keyCode, scanCode, modifiers); } else { this.currentRow = this.currentRow + 1 & 3; - this.selectionManager.moveCaretToEnd(); + this.selectionManager.setCursorToEnd(); return true; } } - public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { - DiffuseLighting.disableGuiDepthLighting(); + public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { + Lighting.setupForFlatItems(); this.renderBackground(matrices); - DrawableHelper.drawCenteredText(matrices, this.textRenderer, this.title, this.width / 2, 40, 16777215); - matrices.push(); + GuiComponent.drawCenteredString(matrices, this.font, this.title, this.width / 2, 40, 16777215); + matrices.pushPose(); matrices.translate((double) (this.width / 2), 0.0D, 50.0D); matrices.scale(93.75F, -93.75F, 93.75F); matrices.translate(0.0D, -1.3125D, 0.0D); - BlockState blockState = this.sign.getCachedState(); - boolean bl = blockState.get(EndSignBlock.FLOOR); + BlockState blockState = this.sign.getBlockState(); + boolean bl = blockState.getValue(EndSignBlock.FLOOR); if (!bl) { matrices.translate(0.0D, -0.3125D, 0.0D); @@ -132,25 +131,25 @@ public class BlockSignEditScreen extends Screen { boolean bl2 = this.ticksSinceOpened / 6 % 2 == 0; - matrices.push(); + matrices.pushPose(); matrices.scale(0.6666667F, -0.6666667F, -0.6666667F); - VertexConsumerProvider.Immediate immediate = this.client.getBufferBuilders().getEntityVertexConsumers(); + MultiBufferSource.BufferSource immediate = this.minecraft.renderBuffers().bufferSource(); VertexConsumer vertexConsumer = EndSignBlockEntityRenderer.getConsumer(immediate, blockState.getBlock()); - this.model.field.render(matrices, vertexConsumer, 15728880, OverlayTexture.DEFAULT_UV); + this.model.sign.render(matrices, vertexConsumer, 15728880, OverlayTexture.NO_OVERLAY); if (bl) { - this.model.foot.render(matrices, vertexConsumer, 15728880, OverlayTexture.DEFAULT_UV); + this.model.stick.render(matrices, vertexConsumer, 15728880, OverlayTexture.NO_OVERLAY); } - matrices.pop(); + matrices.popPose(); matrices.translate(0.0D, 0.3333333432674408D, 0.046666666865348816D); matrices.scale(0.010416667F, -0.010416667F, 0.010416667F); - int i = this.sign.getTextColor().getSignColor(); - int j = this.selectionManager.getSelectionStart(); - int k = this.selectionManager.getSelectionEnd(); + int i = this.sign.getColor().getTextColor(); + int j = this.selectionManager.getCursorPos(); + int k = this.selectionManager.getSelectionPos(); int l = this.currentRow * 10 - this.text.length * 5; - Matrix4f matrix4f = matrices.peek().getModel(); + Matrix4f matrix4f = matrices.last().pose(); int m; String string2; @@ -159,73 +158,73 @@ public class BlockSignEditScreen extends Screen { for (m = 0; m < this.text.length; ++m) { string2 = this.text[m]; if (string2 != null) { - if (this.textRenderer.isRightToLeft()) { - string2 = this.textRenderer.mirror(string2); + if (this.font.isBidirectional()) { + string2 = this.font.bidirectionalShaping(string2); } - float n = (float) (-this.client.textRenderer.getWidth(string2) / 2); - this.client.textRenderer.draw(string2, n, (float) (m * 10 - this.text.length * 5), i, false, matrix4f, + float n = (float) (-this.minecraft.font.width(string2) / 2); + this.minecraft.font.drawInBatch(string2, n, (float) (m * 10 - this.text.length * 5), i, false, matrix4f, immediate, false, 0, 15728880, false); if (m == this.currentRow && j >= 0 && bl2) { - s = this.client.textRenderer - .getWidth(string2.substring(0, Math.max(Math.min(j, string2.length()), 0))); - t = s - this.client.textRenderer.getWidth(string2) / 2; + s = this.minecraft.font + .width(string2.substring(0, Math.max(Math.min(j, string2.length()), 0))); + t = s - this.minecraft.font.width(string2) / 2; if (j >= string2.length()) { - this.client.textRenderer.draw("_", (float) t, (float) l, i, false, matrix4f, immediate, false, + this.minecraft.font.drawInBatch("_", (float) t, (float) l, i, false, matrix4f, immediate, false, 0, 15728880, false); } } } } - immediate.draw(); + immediate.endBatch(); for (m = 0; m < this.text.length; ++m) { string2 = this.text[m]; if (string2 != null && m == this.currentRow && j >= 0) { - int r = this.client.textRenderer - .getWidth(string2.substring(0, Math.max(Math.min(j, string2.length()), 0))); - s = r - this.client.textRenderer.getWidth(string2) / 2; + int r = this.minecraft.font + .width(string2.substring(0, Math.max(Math.min(j, string2.length()), 0))); + s = r - this.minecraft.font.width(string2) / 2; if (bl2 && j < string2.length()) { int var31 = l - 1; int var10003 = s + 1; - this.client.textRenderer.getClass(); + this.minecraft.font.getClass(); fill(matrices, s, var31, var10003, l + 9, -16777216 | i); } if (k != j) { t = Math.min(j, k); int u = Math.max(j, k); - int v = this.client.textRenderer.getWidth(string2.substring(0, t)) - - this.client.textRenderer.getWidth(string2) / 2; - int w = this.client.textRenderer.getWidth(string2.substring(0, u)) - - this.client.textRenderer.getWidth(string2) / 2; + int v = this.minecraft.font.width(string2.substring(0, t)) + - this.minecraft.font.width(string2) / 2; + int w = this.minecraft.font.width(string2.substring(0, u)) + - this.minecraft.font.width(string2) / 2; int x = Math.min(v, w); int y = Math.max(v, w); - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder bufferBuilder = tessellator.getBuffer(); + Tesselator tessellator = Tesselator.getInstance(); + BufferBuilder bufferBuilder = tessellator.getBuilder(); RenderSystem.disableTexture(); RenderSystem.enableColorLogicOp(); RenderSystem.logicOp(GlStateManager.LogicOp.OR_REVERSE); - bufferBuilder.begin(7, VertexFormats.POSITION_COLOR); + bufferBuilder.begin(7, DefaultVertexFormat.POSITION_COLOR); float var32 = (float) x; - this.client.textRenderer.getClass(); - bufferBuilder.vertex(matrix4f, var32, (float) (l + 9), 0.0F).color(0, 0, 255, 255).next(); + this.minecraft.font.getClass(); + bufferBuilder.vertex(matrix4f, var32, (float) (l + 9), 0.0F).color(0, 0, 255, 255).endVertex(); var32 = (float) y; - this.client.textRenderer.getClass(); - bufferBuilder.vertex(matrix4f, var32, (float) (l + 9), 0.0F).color(0, 0, 255, 255).next(); - bufferBuilder.vertex(matrix4f, (float) y, (float) l, 0.0F).color(0, 0, 255, 255).next(); - bufferBuilder.vertex(matrix4f, (float) x, (float) l, 0.0F).color(0, 0, 255, 255).next(); + this.minecraft.font.getClass(); + bufferBuilder.vertex(matrix4f, var32, (float) (l + 9), 0.0F).color(0, 0, 255, 255).endVertex(); + bufferBuilder.vertex(matrix4f, (float) y, (float) l, 0.0F).color(0, 0, 255, 255).endVertex(); + bufferBuilder.vertex(matrix4f, (float) x, (float) l, 0.0F).color(0, 0, 255, 255).endVertex(); bufferBuilder.end(); - BufferRenderer.draw(bufferBuilder); + BufferUploader.end(bufferBuilder); RenderSystem.disableColorLogicOp(); RenderSystem.enableTexture(); } } } - matrices.pop(); - DiffuseLighting.enableGuiDepthLighting(); + matrices.popPose(); + Lighting.setupFor3DItems(); super.render(matrices, mouseX, mouseY, delta); } } diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java index 5786893f..30cc0260 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java @@ -5,72 +5,71 @@ import java.util.List; import java.util.Set; import com.mojang.blaze3d.systems.RenderSystem; - +import com.mojang.blaze3d.vertex.PoseStack; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.gui.DrawableHelper; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.recipebook.BlastFurnaceRecipeBookScreen; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.gui.GuiComponent; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.recipebook.BlastingRecipeBookComponent; +import net.minecraft.core.NonNullList; +import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Recipe; -import net.minecraft.screen.slot.Slot; -import net.minecraft.util.collection.DefaultedList; import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; @Environment(EnvType.CLIENT) -public class EndStoneSmelterRecipeBookScreen extends BlastFurnaceRecipeBookScreen { +public class EndStoneSmelterRecipeBookScreen extends BlastingRecipeBookComponent { private Iterator fuelIterator; private Set fuels; private Slot fuelSlot; private Item currentItem; private float frameTime; - + @Override - protected Set getAllowedFuels() { + protected Set getFuelItems() { return EndStoneSmelterBlockEntity.availableFuels().keySet(); } - + @Override public void slotClicked(Slot slot) { super.slotClicked(slot); - if (slot != null && slot.id < this.craftingScreenHandler.getCraftingSlotCount()) { + if (slot != null && slot.index < this.menu.getSize()) { this.fuelSlot = null; } } - + @Override - public void showGhostRecipe(Recipe recipe, List slots) { - this.ghostSlots.reset(); - ItemStack result = recipe.getOutput(); - this.ghostSlots.setRecipe(recipe); - this.ghostSlots.addSlot(Ingredient.ofStacks(result), (slots.get(3)).x, (slots.get(3)).y); - DefaultedList inputs = recipe.getPreviewInputs(); + public void setupGhostRecipe(Recipe recipe, List slots) { + this.ghostRecipe.clear(); + ItemStack result = recipe.getResultItem(); + this.ghostRecipe.setRecipe(recipe); + this.ghostRecipe.addIngredient(Ingredient.of(result), (slots.get(3)).x, (slots.get(3)).y); + NonNullList inputs = recipe.getIngredients(); Iterator iterator = inputs.iterator(); - for (int i = 0; i < 2; i++) { + for(int i = 0; i < 2; i++) { if (!iterator.hasNext()) { return; } Ingredient ingredient = iterator.next(); if (!ingredient.isEmpty()) { Slot slot = slots.get(i); - this.ghostSlots.addSlot(ingredient, slot.x, slot.y); + this.ghostRecipe.addIngredient(ingredient, slot.x, slot.y); } } this.fuelSlot = slots.get(2); if (this.fuels == null) { - this.fuels = this.getAllowedFuels(); + this.fuels = this.getFuelItems(); } this.fuelIterator = this.fuels.iterator(); this.currentItem = null; } - + @Override - public void drawGhostSlots(MatrixStack matrices, int x, int y, boolean bl, float f) { - this.ghostSlots.draw(matrices, client, x, y, bl, f); + public void renderGhostRecipe(PoseStack matrices, int x, int y, boolean bl, float f) { + this.ghostRecipe.render(matrices, minecraft, x, y, bl, f); if (fuelSlot != null) { if (!Screen.hasControlDown()) { this.frameTime += f; @@ -78,21 +77,20 @@ public class EndStoneSmelterRecipeBookScreen extends BlastFurnaceRecipeBookScree int slotX = this.fuelSlot.x + x; int slotY = this.fuelSlot.y + y; - DrawableHelper.fill(matrices, slotX, slotY, slotX + 16, slotY + 16, 822018048); - this.client.getItemRenderer().renderInGuiWithOverrides(client.player, this.getItem().getDefaultStack(), - slotX, slotY); + GuiComponent.fill(matrices, slotX, slotY, slotX + 16, slotY + 16, 822018048); + this.minecraft.getItemRenderer().renderAndDecorateItem(minecraft.player, this.getFuel().getDefaultInstance(), slotX, slotY); RenderSystem.depthFunc(516); - DrawableHelper.fill(matrices, slotX, slotY, slotX + 16, slotY + 16, 822083583); + GuiComponent.fill(matrices, slotX, slotY, slotX + 16, slotY + 16, 822083583); RenderSystem.depthFunc(515); } } - private Item getItem() { + private Item getFuel() { if (this.currentItem == null || this.frameTime > 30.0F) { this.frameTime = 0.0F; if (this.fuelIterator == null || !this.fuelIterator.hasNext()) { if (this.fuels == null) { - this.fuels = this.getAllowedFuels(); + this.fuels = this.getFuelItems(); } this.fuelIterator = this.fuels.iterator(); } diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java index 8831c3ef..6aba3065 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java @@ -1,72 +1,69 @@ package ru.betterend.client.gui; import com.mojang.blaze3d.systems.RenderSystem; - +import com.mojang.blaze3d.vertex.PoseStack; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.gui.screen.recipebook.RecipeBookProvider; -import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget; -import net.minecraft.client.gui.widget.TexturedButtonWidget; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.world.entity.player.PlayerInventory; -import net.minecraft.screen.slot.Slot; -import net.minecraft.screen.slot.SlotActionType; -import net.minecraft.text.StringVisitable; -import net.minecraft.text.Text; +import net.minecraft.client.gui.components.ImageButton; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.gui.screens.recipebook.RecipeBookComponent; +import net.minecraft.client.gui.screens.recipebook.RecipeUpdateListener; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.FormattedText; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.ClickType; +import net.minecraft.world.inventory.Slot; import ru.betterend.BetterEnd; @Environment(EnvType.CLIENT) -public class EndStoneSmelterScreen extends HandledScreen implements RecipeBookProvider { +public class EndStoneSmelterScreen extends AbstractContainerScreen implements RecipeUpdateListener { - private final static ResourceLocation RECIPE_BUTTON_TEXTURE = new ResourceLocation( - "textures/gui/recipe_button.png"); + private final static ResourceLocation RECIPE_BUTTON_TEXTURE = new ResourceLocation("textures/gui/recipe_button.png"); private final static ResourceLocation BACKGROUND_TEXTURE = BetterEnd.makeID("textures/gui/smelter_gui.png"); - + public final EndStoneSmelterRecipeBookScreen recipeBook; private boolean narrow; - - public EndStoneSmelterScreen(EndStoneSmelterScreenHandler handler, PlayerInventory inventory, Text title) { + + public EndStoneSmelterScreen(EndStoneSmelterScreenHandler handler, Inventory inventory, Component title) { super(handler, inventory, title); this.recipeBook = new EndStoneSmelterRecipeBookScreen(); } - + public void init() { super.init(); this.narrow = this.width < 379; - this.recipeBook.initialize(width, height, client, narrow, handler); - this.x = this.recipeBook.findLeftEdge(narrow, width, backgroundWidth); - this.addButton(new TexturedButtonWidget(x + 20, height / 2 - 49, 20, 18, 0, 0, 19, RECIPE_BUTTON_TEXTURE, - (buttonWidget) -> { - this.recipeBook.reset(narrow); - this.recipeBook.toggleOpen(); - this.x = this.recipeBook.findLeftEdge(narrow, width, backgroundWidth); - ((TexturedButtonWidget) buttonWidget).setPos(this.x + 20, height / 2 - 49); - })); - this.titleX = (this.backgroundWidth - this.textRenderer.getWidth((StringVisitable) this.title)) / 2; + this.recipeBook.init(width, height, minecraft, narrow, menu); + this.leftPos = this.recipeBook.updateScreenPosition(narrow, width, imageWidth); + this.addButton(new ImageButton(leftPos + 20, height / 2 - 49, 20, 18, 0, 0, 19, RECIPE_BUTTON_TEXTURE, (buttonWidget) -> { + this.recipeBook.initVisuals(narrow); + this.recipeBook.toggleVisibility(); + this.leftPos = this.recipeBook.updateScreenPosition(narrow, width, imageWidth); + ((ImageButton) buttonWidget).setPosition(this.leftPos + 20, height / 2 - 49); + })); + this.titleLabelX = (this.imageWidth - this.font.width((FormattedText)this.title)) / 2; } @Override public void tick() { super.tick(); - this.recipeBook.update(); + this.recipeBook.tick(); } @Override - public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { + public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { this.renderBackground(matrices); - if (this.recipeBook.isOpen() && this.narrow) { - this.drawBackground(matrices, delta, mouseX, mouseY); + if (this.recipeBook.isVisible() && this.narrow) { + this.renderBg(matrices, delta, mouseX, mouseY); this.recipeBook.render(matrices, mouseX, mouseY, delta); } else { this.recipeBook.render(matrices, mouseX, mouseY, delta); super.render(matrices, mouseX, mouseY, delta); - this.recipeBook.drawGhostSlots(matrices, x, y, true, delta); + this.recipeBook.renderGhostRecipe(matrices, leftPos, topPos, true, delta); } - this.drawMouseoverTooltip(matrices, mouseX, mouseY); - this.recipeBook.drawTooltip(matrices, x, y, mouseX, mouseY); + this.renderTooltip(matrices, mouseX, mouseY); + this.recipeBook.renderTooltip(matrices, leftPos, topPos, mouseX, mouseY); } @Override @@ -74,28 +71,25 @@ public class EndStoneSmelterScreen extends HandledScreen= (left + backgroundWidth) - || mouseY >= (top + backgroundHeight); - return this.recipeBook.isClickOutsideBounds(mouseX, mouseY, x, y, backgroundWidth, backgroundHeight, button) - && isMouseOut; + protected boolean hasClickedOutside(double mouseX, double mouseY, int left, int top, int button) { + boolean isMouseOut = mouseX < left || mouseY < top || mouseX >= (left + imageWidth) || mouseY >= (top + imageHeight); + return this.recipeBook.hasClickedOutside(mouseX, mouseY, leftPos, topPos, imageWidth, imageHeight, button) && isMouseOut; } @Override @@ -104,32 +98,32 @@ public class EndStoneSmelterScreen extends HandledScreen { +public class EndStoneSmelterScreenHandler extends RecipeBookMenu { - public final static ScreenHandlerType HANDLER_TYPE = ScreenHandlerRegistry - .registerSimple(BetterEnd.makeID(EndStoneSmelter.ID), EndStoneSmelterScreenHandler::new); - - private final Inventory inventory; - private final PropertyDelegate propertyDelegate; + public final static MenuType HANDLER_TYPE = ScreenHandlerRegistry.registerSimple( + BetterEnd.makeID(EndStoneSmelter.ID), EndStoneSmelterScreenHandler::new); + + private final Container inventory; + private final ContainerData propertyDelegate; protected final Level world; - - public EndStoneSmelterScreenHandler(int syncId, PlayerInventory playerInventory) { - this(syncId, playerInventory, new SimpleInventory(4), new ArrayPropertyDelegate(4)); + + public EndStoneSmelterScreenHandler(int syncId, Inventory playerInventory) { + this(syncId, playerInventory, new SimpleContainer(4), new SimpleContainerData(4)); } - - public EndStoneSmelterScreenHandler(int syncId, PlayerInventory playerInventory, Inventory inventory, - PropertyDelegate propertyDelegate) { + + public EndStoneSmelterScreenHandler(int syncId, Inventory playerInventory, Container inventory, ContainerData propertyDelegate) { super(HANDLER_TYPE, syncId); this.inventory = inventory; this.propertyDelegate = propertyDelegate; - this.world = playerInventory.player.world; - - this.addProperties(propertyDelegate); + this.world = playerInventory.player.level; + + this.addDataSlots(propertyDelegate); this.addSlot(new Slot(inventory, 0, 45, 17)); this.addSlot(new Slot(inventory, 1, 67, 17)); this.addSlot(new SmelterFuelSlot(this, inventory, 2, 56, 53)); this.addSlot(new SmelterOutputSlot(playerInventory.player, inventory, 3, 129, 35)); - for (int i = 0; i < 3; ++i) { - for (int j = 0; j < 9; ++j) { + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 9; ++j) { this.addSlot(new Slot(playerInventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); } } - for (int i = 0; i < 9; ++i) { + for(int i = 0; i < 9; ++i) { this.addSlot(new Slot(playerInventory, i, 8 + i * 18, 142)); } } - + @Override - public ScreenHandlerType getType() { + public MenuType getType() { return HANDLER_TYPE; } @Override - public void populateRecipeFinder(RecipeFinder finder) { - if (inventory instanceof RecipeInputProvider) { - ((RecipeInputProvider) inventory).provideRecipeInputs(finder); + public void fillCraftSlotsStackedContents(StackedContents finder) { + if (inventory instanceof StackedContentsCompatible) { + ((StackedContentsCompatible) inventory).fillStackedContents(finder); } } @Override - public void clearCraftingSlots() { - this.inventory.clear(); + public void clearCraftingContent() { + this.inventory.clearContent(); } @Override - public boolean matches(Recipe recipe) { + public boolean recipeMatches(Recipe recipe) { return recipe.matches(this.inventory, this.world); } @Override - public int getCraftingResultSlotIndex() { + public int getResultSlotIndex() { return 3; } @Override - public int getCraftingWidth() { + public int getGridWidth() { return 2; } @Override - public int getCraftingHeight() { + public int getGridHeight() { return 1; } @Override - public int getCraftingSlotCount() { + public int getSize() { return 4; } @Override - public RecipeBookCategory getCategory() { - return RecipeBookCategory.BLAST_FURNACE; + public RecipeBookType getRecipeBookType() { + return RecipeBookType.BLAST_FURNACE; } @Override - public boolean canUse(Player player) { - return this.inventory.canPlayerUse(player); + public boolean stillValid(Player player) { + return this.inventory.stillValid(player); } protected boolean isSmeltable(ItemStack itemStack) { - return this.world.getRecipeManager() - .getFirstMatch(AlloyingRecipe.TYPE, new SimpleInventory(itemStack), this.world).isPresent(); + return this.world.getRecipeManager().getRecipeFor(AlloyingRecipe.TYPE, new SimpleContainer(itemStack), this.world).isPresent(); } public boolean isFuel(ItemStack itemStack) { return EndStoneSmelterBlockEntity.canUseAsFuel(itemStack); } - + @Override - public ItemStack transferSlot(Player player, int index) { + public ItemStack quickMoveStack(Player player, int index) { ItemStack itemStack = ItemStack.EMPTY; Slot slot = this.slots.get(index); - if (slot != null && slot.hasStack()) { - ItemStack itemStack2 = slot.getStack(); + if (slot != null && slot.hasItem()) { + ItemStack itemStack2 = slot.getItem(); itemStack = itemStack2.copy(); if (index == 3) { - if (insertItem(itemStack2, 4, 40, true)) { + if (moveItemStackTo(itemStack2, 4, 40, true)) { return ItemStack.EMPTY; } - slot.onStackChanged(itemStack2, itemStack); + slot.onQuickCraft(itemStack2, itemStack); } else if (index != 2 && index != 1 && index != 0) { if (isSmeltable(itemStack2)) { - if (!insertItem(itemStack2, 0, 2, false)) { + if (!moveItemStackTo(itemStack2, 0, 2, false)) { return ItemStack.EMPTY; } } else if (isFuel(itemStack2)) { - if (!this.insertItem(itemStack2, 2, 3, false)) { + if (!this.moveItemStackTo(itemStack2, 2, 3, false)) { return ItemStack.EMPTY; } } else if (index < 31) { - if (!insertItem(itemStack2, 31, 40, false)) { + if (!moveItemStackTo(itemStack2, 31, 40, false)) { return ItemStack.EMPTY; } - } else if (index < 40 && !insertItem(itemStack2, 4, 31, false)) { + } else if (index < 40 && !moveItemStackTo(itemStack2, 4, 31, false)) { return ItemStack.EMPTY; } - } else if (!insertItem(itemStack2, 4, 40, false)) { + } else if (!moveItemStackTo(itemStack2, 4, 40, false)) { return ItemStack.EMPTY; } if (itemStack2.isEmpty()) { - slot.setStack(ItemStack.EMPTY); + slot.set(ItemStack.EMPTY); } else { - slot.markDirty(); + slot.setChanged(); } if (itemStack2.getCount() == itemStack.getCount()) { return ItemStack.EMPTY; } - slot.onTakeItem(player, itemStack2); + slot.onTake(player, itemStack2); } return itemStack; } - + @Environment(EnvType.CLIENT) public int getSmeltProgress() { int time = this.propertyDelegate.get(2); diff --git a/src/main/java/ru/betterend/client/gui/slot/SmelterFuelSlot.java b/src/main/java/ru/betterend/client/gui/slot/SmelterFuelSlot.java index 9ee6b8ba..06ec70a5 100644 --- a/src/main/java/ru/betterend/client/gui/slot/SmelterFuelSlot.java +++ b/src/main/java/ru/betterend/client/gui/slot/SmelterFuelSlot.java @@ -1,25 +1,25 @@ package ru.betterend.client.gui.slot; -import net.minecraft.inventory.Inventory; +import net.minecraft.world.Container; +import net.minecraft.world.inventory.FurnaceFuelSlot; +import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; -import net.minecraft.screen.slot.FurnaceFuelSlot; -import net.minecraft.screen.slot.Slot; import ru.betterend.client.gui.EndStoneSmelterScreenHandler; public class SmelterFuelSlot extends Slot { private final EndStoneSmelterScreenHandler handler; - - public SmelterFuelSlot(EndStoneSmelterScreenHandler handler, Inventory inventory, int index, int x, int y) { + + public SmelterFuelSlot(EndStoneSmelterScreenHandler handler, Container inventory, int index, int x, int y) { super(inventory, index, x, y); this.handler = handler; } - - public boolean canInsert(ItemStack stack) { + + public boolean mayPlace(ItemStack stack) { return this.handler.isFuel(stack) || FurnaceFuelSlot.isBucket(stack); } - public int getMaxItemCount(ItemStack stack) { - return FurnaceFuelSlot.isBucket(stack) ? 1 : super.getMaxItemCount(stack); + public int getMaxStackSize(ItemStack stack) { + return FurnaceFuelSlot.isBucket(stack) ? 1 : super.getMaxStackSize(stack); } } diff --git a/src/main/java/ru/betterend/client/gui/slot/SmelterOutputSlot.java b/src/main/java/ru/betterend/client/gui/slot/SmelterOutputSlot.java index 1eec6448..212eb179 100644 --- a/src/main/java/ru/betterend/client/gui/slot/SmelterOutputSlot.java +++ b/src/main/java/ru/betterend/client/gui/slot/SmelterOutputSlot.java @@ -1,9 +1,9 @@ package ru.betterend.client.gui.slot; +import net.minecraft.world.Container; import net.minecraft.world.entity.player.Player; -import net.minecraft.inventory.Inventory; +import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; -import net.minecraft.screen.slot.Slot; import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; public class SmelterOutputSlot extends Slot { @@ -11,38 +11,38 @@ public class SmelterOutputSlot extends Slot { private Player player; private int amount; - public SmelterOutputSlot(Player player, Inventory inventory, int index, int x, int y) { + public SmelterOutputSlot(Player player, Container inventory, int index, int x, int y) { super(inventory, index, x, y); this.player = player; } - public boolean canInsert(ItemStack stack) { + public boolean mayPlace(ItemStack stack) { return false; } - public ItemStack takeStack(int amount) { - if (this.hasStack()) { - this.amount += Math.min(amount, this.getStack().getCount()); + public ItemStack remove(int amount) { + if (this.hasItem()) { + this.amount += Math.min(amount, this.getItem().getCount()); } - return super.takeStack(amount); + return super.remove(amount); } - public ItemStack onTakeItem(Player player, ItemStack stack) { - this.onCrafted(stack); - super.onTakeItem(player, stack); + public ItemStack onTake(Player player, ItemStack stack) { + this.checkTakeAchievements(stack); + super.onTake(player, stack); return stack; } - protected void onCrafted(ItemStack stack, int amount) { + protected void onQuickCraft(ItemStack stack, int amount) { this.amount += amount; - this.onCrafted(stack); + this.checkTakeAchievements(stack); } - protected void onCrafted(ItemStack stack) { - stack.onCraft(this.player.world, this.player, this.amount); - if (!this.player.world.isClientSide && this.inventory instanceof EndStoneSmelterBlockEntity) { - ((EndStoneSmelterBlockEntity) this.inventory).dropExperience(player); + protected void checkTakeAchievements(ItemStack stack) { + stack.onCraftedBy(this.player.level, this.player, this.amount); + if (!this.player.level.isClientSide && this.container instanceof EndStoneSmelterBlockEntity) { + ((EndStoneSmelterBlockEntity) this.container).dropExperience(player); } this.amount = 0; } diff --git a/src/main/java/ru/betterend/client/render/BeamRenderer.java b/src/main/java/ru/betterend/client/render/BeamRenderer.java index ada57911..fe8f8e3a 100644 --- a/src/main/java/ru/betterend/client/render/BeamRenderer.java +++ b/src/main/java/ru/betterend/client/render/BeamRenderer.java @@ -1,75 +1,62 @@ package ru.betterend.client.render; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.util.math.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Matrix3f; +import com.mojang.math.Matrix4f; import com.mojang.math.Vector3f; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; -import net.minecraft.util.math.Matrix3f; -import net.minecraft.util.math.Matrix4f; public class BeamRenderer { private static final ResourceLocation BEAM_TEXTURE = new ResourceLocation("textures/entity/end_gateway_beam.png"); - - public static void renderLightBeam(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int age, - float tick, int minY, int maxY, float[] colors, float alpha, float beamIn, float beamOut) { + + public static void renderLightBeam(PoseStack matrices, MultiBufferSource vertexConsumers, int age, float tick, int minY, int maxY, float[] colors, float alpha, float beamIn, float beamOut) { float red = colors[0]; float green = colors[1]; float blue = colors[2]; - + int maxBY = minY + maxY; float delta = maxY < 0 ? tick : -tick; - float fractDelta = Mth.fractionalPart(delta * 0.2F - (float) Mth.floor(delta * 0.1F)); + float fractDelta = Mth.frac(delta * 0.2F - (float) Mth.floor(delta * 0.1F)); float xIn = -beamIn; float minV = Mth.clamp(fractDelta - 1.0F, 0.0F, 1.0F); float maxV = (float) maxY * (0.5F / beamIn) + minV; float rotation = (age + tick) / 25.0F + 6.0F; - - VertexConsumer vertexConsumer = vertexConsumers.getBuffer(RenderLayer.getBeaconBeam(BEAM_TEXTURE, true)); - - matrices.push(); - matrices.multiply(Vector3f.POSITIVE_Y.getRadialQuaternion(-rotation)); - renderBeam(matrices, vertexConsumer, red, green, blue, alpha, minY, maxBY, beamIn, 0.0F, 0.0F, beamIn, 0.0F, - xIn, xIn, 0.0F, 0.0F, 1.0F, minV, maxV); - + + VertexConsumer vertexConsumer = vertexConsumers.getBuffer(RenderType.beaconBeam(BEAM_TEXTURE, true)); + + matrices.pushPose(); + matrices.mulPose(Vector3f.YP.rotation(-rotation)); + renderBeam(matrices, vertexConsumer, red, green, blue, alpha, minY, maxBY, beamIn, 0.0F, 0.0F, beamIn, 0.0F, xIn, xIn, 0.0F, 0.0F, 1.0F, minV, maxV); + float xOut = -beamOut; maxV = (float) maxY + minV; - renderBeam(matrices, vertexConsumer, red, green, blue, alpha, minY, maxBY, xOut, xOut, beamOut, xOut, xOut, - beamOut, beamOut, beamOut, 0.0F, 1.0F, minV, maxV); - matrices.pop(); + renderBeam(matrices, vertexConsumer, red, green, blue, alpha, minY, maxBY, xOut, xOut, beamOut, xOut, xOut, beamOut, beamOut, beamOut, 0.0F, 1.0F, minV, maxV); + matrices.popPose(); } - private static void renderBeam(MatrixStack matrices, VertexConsumer vertexConsumer, float red, float green, - float blue, float alpha, int minY, int maxY, float x1, float d1, float x2, float d2, float x3, float d3, - float x4, float d4, float minU, float maxU, float minV, float maxV) { - MatrixStack.Entry entry = matrices.peek(); - Matrix4f matrix4f = entry.getModel(); - Matrix3f matrix3f = entry.getNormal(); - renderBeam(matrix4f, matrix3f, vertexConsumer, red, green, blue, alpha, maxY, minY, x1, d1, x2, d2, minU, maxU, - minV, maxV); - renderBeam(matrix4f, matrix3f, vertexConsumer, red, green, blue, alpha, maxY, minY, x4, d4, x3, d3, minU, maxU, - minV, maxV); - renderBeam(matrix4f, matrix3f, vertexConsumer, red, green, blue, alpha, maxY, minY, x2, d2, x4, d4, minU, maxU, - minV, maxV); - renderBeam(matrix4f, matrix3f, vertexConsumer, red, green, blue, alpha, maxY, minY, x3, d3, x1, d1, minU, maxU, - minV, maxV); + private static void renderBeam(PoseStack matrices, VertexConsumer vertexConsumer, float red, float green, float blue, float alpha, int minY, int maxY, float x1, float d1, float x2, float d2, float x3, float d3, float x4, float d4, float minU, float maxU, float minV, float maxV) { + PoseStack.Pose entry = matrices.last(); + Matrix4f matrix4f = entry.pose(); + Matrix3f matrix3f = entry.normal(); + renderBeam(matrix4f, matrix3f, vertexConsumer, red, green, blue, alpha, maxY, minY, x1, d1, x2, d2, minU, maxU, minV, maxV); + renderBeam(matrix4f, matrix3f, vertexConsumer, red, green, blue, alpha, maxY, minY, x4, d4, x3, d3, minU, maxU, minV, maxV); + renderBeam(matrix4f, matrix3f, vertexConsumer, red, green, blue, alpha, maxY, minY, x2, d2, x4, d4, minU, maxU, minV, maxV); + renderBeam(matrix4f, matrix3f, vertexConsumer, red, green, blue, alpha, maxY, minY, x3, d3, x1, d1, minU, maxU, minV, maxV); } - private static void renderBeam(Matrix4f matrix4f, Matrix3f matrix3f, VertexConsumer vertexConsumer, float red, - float green, float blue, float alpha, int minY, int maxY, float minX, float minD, float maxX, float maxD, - float minU, float maxU, float minV, float maxV) { + private static void renderBeam(Matrix4f matrix4f, Matrix3f matrix3f, VertexConsumer vertexConsumer, float red, float green, float blue, float alpha, int minY, int maxY, float minX, float minD, float maxX, float maxD, float minU, float maxU, float minV, float maxV) { addVertex(matrix4f, matrix3f, vertexConsumer, red, green, blue, alpha, maxX, minY, maxD, maxU, minV); addVertex(matrix4f, matrix3f, vertexConsumer, red, green, blue, alpha, maxX, maxY, maxD, maxU, maxV); addVertex(matrix4f, matrix3f, vertexConsumer, red, green, blue, alpha, minX, maxY, minD, minU, maxV); addVertex(matrix4f, matrix3f, vertexConsumer, red, green, blue, alpha, minX, minY, minD, minU, minV); } - private static void addVertex(Matrix4f matrix4f, Matrix3f matrix3f, VertexConsumer vertexConsumer, float red, - float green, float blue, float alpha, float x, float y, float d, float u, float v) { - vertexConsumer.vertex(matrix4f, x, y, d).color(red, green, blue, alpha).texture(u, v) - .overlay(OverlayTexture.DEFAULT_UV).light(15728880).normal(matrix3f, 0.0F, 1.0F, 0.0F).next(); + private static void addVertex(Matrix4f matrix4f, Matrix3f matrix3f, VertexConsumer vertexConsumer, float red, float green, float blue, float alpha, float x, float y, float d, float u, float v) { + vertexConsumer.vertex(matrix4f, x, y, d).color(red, green, blue, alpha).uv(u, v).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(15728880).normal(matrix3f, 0.0F, 1.0F, 0.0F).endVertex(); } } diff --git a/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java b/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java index 1a4bf81b..9c559914 100644 --- a/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java +++ b/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java @@ -1,104 +1,94 @@ package ru.betterend.client.render; -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.util.math.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Matrix3f; +import com.mojang.math.Matrix4f; +import com.mojang.math.Quaternion; import com.mojang.math.Vector3f; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; -import net.minecraft.util.math.Matrix3f; -import net.minecraft.util.math.Matrix4f; -import net.minecraft.util.math.Quaternion; public class EndCrystalRenderer { - private static final ResourceLocation CRYSTAL_TEXTURE = new ResourceLocation( - "textures/entity/end_crystal/end_crystal.png"); - private static final ResourceLocation CRYSTAL_BEAM_TEXTURE = new ResourceLocation( - "textures/entity/end_crystal/end_crystal_beam.png"); - private static final RenderLayer CRYSTAL_BEAM_LAYER; - private static final RenderLayer END_CRYSTAL; + private static final ResourceLocation CRYSTAL_TEXTURE = new ResourceLocation("textures/entity/end_crystal/end_crystal.png"); + private static final ResourceLocation CRYSTAL_BEAM_TEXTURE = new ResourceLocation("textures/entity/end_crystal/end_crystal_beam.png"); + private static final RenderType CRYSTAL_BEAM_LAYER; + private static final RenderType END_CRYSTAL; private static final ModelPart CORE; private static final ModelPart FRAME; private static final int AGE_CYCLE = 240; private static final float SINE_45_DEGREES; - - public static void render(int age, int maxAge, float tickDelta, MatrixStack matrices, - VertexConsumerProvider vertexConsumerProvider, int light) { + + public static void render(int age, int maxAge, float tickDelta, PoseStack matrices, MultiBufferSource vertexConsumerProvider, int light) { float k = (float) AGE_CYCLE / maxAge; float rotation = (age * k + tickDelta) * 3.0F; VertexConsumer vertexConsumer = vertexConsumerProvider.getBuffer(END_CRYSTAL); - matrices.push(); + matrices.pushPose(); matrices.scale(0.8F, 0.8F, 0.8F); matrices.translate(0.0D, -0.5D, 0.0D); - matrices.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(rotation)); + matrices.mulPose(Vector3f.YP.rotationDegrees(rotation)); matrices.translate(0.0D, 0.8F, 0.0D); - matrices.multiply(new Quaternion(new Vector3f(SINE_45_DEGREES, 0.0F, SINE_45_DEGREES), 60.0F, true)); - FRAME.render(matrices, vertexConsumer, light, OverlayTexture.DEFAULT_UV); + matrices.mulPose(new Quaternion(new Vector3f(SINE_45_DEGREES, 0.0F, SINE_45_DEGREES), 60.0F, true)); + FRAME.render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY); matrices.scale(0.875F, 0.875F, 0.875F); - matrices.multiply(new Quaternion(new Vector3f(SINE_45_DEGREES, 0.0F, SINE_45_DEGREES), 60.0F, true)); - matrices.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(rotation)); - FRAME.render(matrices, vertexConsumer, light, OverlayTexture.DEFAULT_UV); + matrices.mulPose(new Quaternion(new Vector3f(SINE_45_DEGREES, 0.0F, SINE_45_DEGREES), 60.0F, true)); + matrices.mulPose(Vector3f.YP.rotationDegrees(rotation)); + FRAME.render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY); matrices.scale(0.875F, 0.875F, 0.875F); - matrices.multiply(new Quaternion(new Vector3f(SINE_45_DEGREES, 0.0F, SINE_45_DEGREES), 60.0F, true)); - matrices.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(rotation)); - CORE.render(matrices, vertexConsumer, light, OverlayTexture.DEFAULT_UV); - matrices.pop(); + matrices.mulPose(new Quaternion(new Vector3f(SINE_45_DEGREES, 0.0F, SINE_45_DEGREES), 60.0F, true)); + matrices.mulPose(Vector3f.YP.rotationDegrees(rotation)); + CORE.render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY); + matrices.popPose(); } - - public static void renderBeam(BlockPos start, BlockPos end, float tickDelta, int age, MatrixStack matrices, - VertexConsumerProvider vertexConsumers, int light) { + + public static void renderBeam(BlockPos start, BlockPos end, float tickDelta, int age, PoseStack matrices, MultiBufferSource vertexConsumers, int light) { float dx = start.getX() - end.getX() + 1.0F; float dy = start.getY() - end.getY() + 1.0F; float dz = start.getZ() - end.getZ() + 1.0F; float f = Mth.sqrt(dx * dx + dz * dz); float g = Mth.sqrt(dx * dx + dy * dy + dz * dz); - matrices.push(); + matrices.pushPose(); matrices.translate(0.0D, 2.0D, 0.0D); - matrices.multiply( - Vector3f.POSITIVE_Y.getRadialQuaternion((float) (-Math.atan2((double) dz, (double) dx)) - 1.5707964F)); - matrices.multiply( - Vector3f.POSITIVE_X.getRadialQuaternion((float) (-Math.atan2((double) f, (double) dy)) - 1.5707964F)); + matrices.mulPose(Vector3f.YP.rotation((float)(-Math.atan2((double) dz, (double) dx)) - 1.5707964F)); + matrices.mulPose(Vector3f.XP.rotation((float)(-Math.atan2((double) f, (double) dy)) - 1.5707964F)); VertexConsumer vertexConsumer = vertexConsumers.getBuffer(CRYSTAL_BEAM_LAYER); float h = 0.0F - ((float) age + tickDelta) * 0.01F; float i = Mth.sqrt(dx * dx + dy * dy + dz * dz) / 32.0F - ((float) age + tickDelta) * 0.01F; float k = 0.0F; float l = 0.75F; float m = 0.0F; - MatrixStack.Entry entry = matrices.peek(); - Matrix4f matrix4f = entry.getModel(); - Matrix3f matrix3f = entry.getNormal(); + PoseStack.Pose entry = matrices.last(); + Matrix4f matrix4f = entry.pose(); + Matrix3f matrix3f = entry.normal(); - for (int n = 1; n <= 8; ++n) { - float o = Mth.sin((float) n * 6.2831855F / 8.0F) * 0.75F; - float p = Mth.cos((float) n * 6.2831855F / 8.0F) * 0.75F; - float q = (float) n / 8.0F; - vertexConsumer.vertex(matrix4f, k * 0.2F, l * 0.2F, 0.0F).color(0, 0, 0, 255).texture(m, h) - .overlay(OverlayTexture.DEFAULT_UV).light(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).next(); - vertexConsumer.vertex(matrix4f, k, l, g).color(255, 255, 255, 255).texture(m, i) - .overlay(OverlayTexture.DEFAULT_UV).light(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).next(); - vertexConsumer.vertex(matrix4f, o, p, g).color(255, 255, 255, 255).texture(q, i) - .overlay(OverlayTexture.DEFAULT_UV).light(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).next(); - vertexConsumer.vertex(matrix4f, o * 0.2F, p * 0.2F, 0.0F).color(0, 0, 0, 255).texture(q, h) - .overlay(OverlayTexture.DEFAULT_UV).light(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).next(); - k = o; - l = p; - m = q; + for(int n = 1; n <= 8; ++n) { + float o = Mth.sin((float) n * 6.2831855F / 8.0F) * 0.75F; + float p = Mth.cos((float) n * 6.2831855F / 8.0F) * 0.75F; + float q = (float) n / 8.0F; + vertexConsumer.vertex(matrix4f, k * 0.2F, l * 0.2F, 0.0F).color(0, 0, 0, 255).uv(m, h).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).endVertex(); + vertexConsumer.vertex(matrix4f, k, l, g).color(255, 255, 255, 255).uv(m, i).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).endVertex(); + vertexConsumer.vertex(matrix4f, o, p, g).color(255, 255, 255, 255).uv(q, i).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).endVertex(); + vertexConsumer.vertex(matrix4f, o * 0.2F, p * 0.2F, 0.0F).color(0, 0, 0, 255).uv(q, h).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).endVertex(); + k = o; + l = p; + m = q; } - matrices.pop(); + matrices.popPose(); } - + static { - END_CRYSTAL = RenderLayer.getEntityCutoutNoCull(CRYSTAL_TEXTURE); - CRYSTAL_BEAM_LAYER = RenderLayer.getEntitySmoothCutout(CRYSTAL_BEAM_TEXTURE); + END_CRYSTAL = RenderType.entityCutoutNoCull(CRYSTAL_TEXTURE); + CRYSTAL_BEAM_LAYER = RenderType.entitySmoothCutout(CRYSTAL_BEAM_TEXTURE); SINE_45_DEGREES = (float) Math.sin(0.7853981633974483D); FRAME = new ModelPart(64, 32, 0, 0); - FRAME.addCuboid(-4.0F, -4.0F, -4.0F, 8.0F, 8.0F, 8.0F); + FRAME.addBox(-4.0F, -4.0F, -4.0F, 8.0F, 8.0F, 8.0F); CORE = new ModelPart(64, 32, 32, 0); - CORE.addCuboid(-4.0F, -4.0F, -4.0F, 8.0F, 8.0F, 8.0F); + CORE.addBox(-4.0F, -4.0F, -4.0F, 8.0F, 8.0F, 8.0F); } } diff --git a/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java b/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java index 505cf87c..a64ecc94 100644 --- a/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java +++ b/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java @@ -1,72 +1,69 @@ package ru.betterend.client.render; -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.util.math.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Vector3f; -import net.minecraft.util.Mth; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.core.Vec3i; +import net.minecraft.util.Mth; import ru.betterend.BetterEnd; import ru.betterend.blocks.AuroraCrystalBlock; import ru.betterend.util.ColorUtil; import ru.betterend.util.MHelper; public class EternalCrystalRenderer { - private static final RenderLayer RENDER_LAYER; + private static final RenderType RENDER_LAYER; private static final ModelPart[] SHARDS; private static final ModelPart CORE; - - public static void render(int age, float tickDelta, MatrixStack matrices, - VertexConsumerProvider vertexConsumerProvider, int light) { + + public static void render(int age, float tickDelta, PoseStack matrices, MultiBufferSource vertexConsumerProvider, int light) { VertexConsumer vertexConsumer = vertexConsumerProvider.getBuffer(RENDER_LAYER); float[] colors = colors(age); float rotation = (age + tickDelta) / 25.0F + 6.0F; - matrices.push(); + matrices.pushPose(); matrices.scale(0.6F, 0.6F, 0.6F); - matrices.multiply(Vector3f.POSITIVE_Y.getRadialQuaternion(rotation)); - CORE.render(matrices, vertexConsumer, light, OverlayTexture.DEFAULT_UV, colors[0], colors[1], colors[2], - colors[3]); - + matrices.mulPose(Vector3f.YP.rotation(rotation)); + CORE.render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY, colors[0], colors[1], colors[2], colors[3]); + for (int i = 0; i < 4; i++) { - matrices.push(); + matrices.pushPose(); float offset = Mth.sin(rotation * 2 + i) * 0.15F; matrices.translate(0, offset, 0); - SHARDS[i].render(matrices, vertexConsumer, light, OverlayTexture.DEFAULT_UV, colors[0], colors[1], - colors[2], colors[3]); - matrices.pop(); + SHARDS[i].render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY, colors[0], colors[1], colors[2], colors[3]); + matrices.popPose(); } - - matrices.pop(); + + matrices.popPose(); } - + public static float[] colors(int age) { double delta = age * 0.01; int index = MHelper.floor(delta); int index2 = (index + 1) & 3; delta -= index; index &= 3; - + Vec3i color1 = AuroraCrystalBlock.COLORS[index]; Vec3i color2 = AuroraCrystalBlock.COLORS[index2]; - + int r = MHelper.floor(Mth.lerp(delta, color1.getX(), color2.getX())); int g = MHelper.floor(Mth.lerp(delta, color1.getY(), color2.getY())); int b = MHelper.floor(Mth.lerp(delta, color1.getZ(), color2.getZ())); - + return ColorUtil.toFloatArray(MHelper.color(r, g, b)); } - + static { - RENDER_LAYER = RenderLayer.getBeaconBeam(BetterEnd.makeID("textures/entity/eternal_crystal.png"), true); + RENDER_LAYER = RenderType.beaconBeam(BetterEnd.makeID("textures/entity/eternal_crystal.png"), true); SHARDS = new ModelPart[4]; - SHARDS[0] = new ModelPart(16, 16, 2, 4).addCuboid(-5.0F, 1.0F, -3.0F, 2.0F, 8.0F, 2.0F); - SHARDS[1] = new ModelPart(16, 16, 2, 4).addCuboid(3.0F, -1.0F, -1.0F, 2.0F, 8.0F, 2.0F); - SHARDS[2] = new ModelPart(16, 16, 2, 4).addCuboid(-1.0F, 0.0F, -5.0F, 2.0F, 4.0F, 2.0F); - SHARDS[3] = new ModelPart(16, 16, 2, 4).addCuboid(0.0F, 3.0F, 4.0F, 2.0F, 6.0F, 2.0F); + SHARDS[0] = new ModelPart(16, 16, 2, 4).addBox(-5.0F, 1.0F, -3.0F, 2.0F, 8.0F, 2.0F); + SHARDS[1] = new ModelPart(16, 16, 2, 4).addBox(3.0F, -1.0F, -1.0F, 2.0F, 8.0F, 2.0F); + SHARDS[2] = new ModelPart(16, 16, 2, 4).addBox(-1.0F, 0.0F, -5.0F, 2.0F, 4.0F, 2.0F); + SHARDS[3] = new ModelPart(16, 16, 2, 4).addBox(0.0F, 3.0F, 4.0F, 2.0F, 6.0F, 2.0F); CORE = new ModelPart(16, 16, 0, 0); - CORE.addCuboid(-2.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F); + CORE.addBox(-2.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F); } } diff --git a/src/main/java/ru/betterend/config/ConfigKeeper.java b/src/main/java/ru/betterend/config/ConfigKeeper.java index 84133efc..b98c942e 100644 --- a/src/main/java/ru/betterend/config/ConfigKeeper.java +++ b/src/main/java/ru/betterend/config/ConfigKeeper.java @@ -4,15 +4,13 @@ import java.lang.reflect.Type; import java.util.Map; import java.util.function.Consumer; import java.util.function.Supplier; - +import net.minecraft.util.GsonHelper; import org.jetbrains.annotations.Nullable; import com.google.common.collect.Maps; import com.google.common.reflect.TypeToken; import com.google.gson.JsonElement; import com.google.gson.JsonObject; - -import net.minecraft.util.JsonHelper; import ru.betterend.util.JsonFactory; public final class ConfigKeeper { @@ -109,7 +107,7 @@ public final class ConfigKeeper { @Override public Boolean fromJson() { - return JsonHelper.getBoolean(location, key, defaultValue); + return GsonHelper.getAsBoolean(location, key, defaultValue); } @Override @@ -126,7 +124,7 @@ public final class ConfigKeeper { @Override public Float fromJson() { - return JsonHelper.getFloat(location, key, defaultValue); + return GsonHelper.getAsFloat(location, key, defaultValue); } @Override @@ -143,7 +141,7 @@ public final class ConfigKeeper { @Override public Float fromJson() { - return JsonHelper.getFloat(location, key, defaultValue); + return GsonHelper.getAsFloat(location, key, defaultValue); } @Override @@ -165,7 +163,7 @@ public final class ConfigKeeper { @Override public Integer fromJson() { - return JsonHelper.getInt(location, key, defaultValue); + return GsonHelper.getAsInt(location, key, defaultValue); } @Override @@ -182,7 +180,7 @@ public final class ConfigKeeper { @Override public Integer fromJson() { - return JsonHelper.getInt(location, key, defaultValue); + return GsonHelper.getAsInt(location, key, defaultValue); } @Override @@ -199,7 +197,7 @@ public final class ConfigKeeper { @Override public String fromJson() { - return JsonHelper.getString(location, key, defaultValue); + return GsonHelper.getAsString(location, key, defaultValue); } @Override diff --git a/src/main/java/ru/betterend/config/ConfigKey.java b/src/main/java/ru/betterend/config/ConfigKey.java index ab6ce6dd..de970d51 100644 --- a/src/main/java/ru/betterend/config/ConfigKey.java +++ b/src/main/java/ru/betterend/config/ConfigKey.java @@ -6,14 +6,14 @@ public class ConfigKey { private final String path[]; private final String entry; private final boolean root; - + public ConfigKey(String entry, String... path) { this.validate(entry); this.path = path; this.entry = entry; this.root = path.length == 0 || (path.length == 1 && path[0].isEmpty()); } - + public ConfigKey(String entry, ResourceLocation path) { this(entry, path.getNamespace(), path.getPath()); } @@ -25,7 +25,7 @@ public class ConfigKey { public String getEntry() { return entry; } - + public boolean isRoot() { return root; } @@ -61,7 +61,7 @@ public class ConfigKey { } return true; } - + @Override public String toString() { if (root) { @@ -73,7 +73,7 @@ public class ConfigKey { } return String.format("%s:%s", p, entry); } - + private void validate(String entry) { if (entry == null) { throw new NullPointerException("Config key must be not null!"); diff --git a/src/main/java/ru/betterend/config/IdConfig.java b/src/main/java/ru/betterend/config/IdConfig.java index 734c7aaf..e6e84f7f 100644 --- a/src/main/java/ru/betterend/config/IdConfig.java +++ b/src/main/java/ru/betterend/config/IdConfig.java @@ -1,26 +1,23 @@ package ru.betterend.config; import java.util.function.BiFunction; - -import org.jetbrains.annotations.Nullable; - import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.Nullable; import ru.betterend.config.ConfigKeeper.Entry; import ru.betterend.config.ConfigKeeper.FloatRange; import ru.betterend.config.ConfigKeeper.IntegerRange; public class IdConfig extends Config { - + protected final BiFunction keyFactory; - + public IdConfig(String group, BiFunction keyFactory) { super(group); this.keyFactory = keyFactory; } @Override - protected void registerEntries() { - } + protected void registerEntries() {} protected ConfigKey createKey(ResourceLocation id, String key) { return this.keyFactory.apply(id, key); @@ -63,7 +60,7 @@ public class IdConfig extends Config { public boolean setRangedInt(ResourceLocation id, String key, int value) { return this.setRanged(createKey(id, key), value, IntegerRange.class); } - + public boolean setRangedFloat(ResourceLocation id, String key, float value) { return this.setRanged(createKey(id, key), value, FloatRange.class); } diff --git a/src/main/java/ru/betterend/effects/EndEnchantments.java b/src/main/java/ru/betterend/effects/EndEnchantments.java index dd801a02..6755a3de 100644 --- a/src/main/java/ru/betterend/effects/EndEnchantments.java +++ b/src/main/java/ru/betterend/effects/EndEnchantments.java @@ -1,17 +1,16 @@ package ru.betterend.effects; -import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.core.Registry; +import net.minecraft.world.item.enchantment.Enchantment; import ru.betterend.BetterEnd; import ru.betterend.effects.enchantment.EndVeilEnchantment; public class EndEnchantments { public final static Enchantment END_VEIL = registerEnchantment("end_veil", new EndVeilEnchantment()); - + public static Enchantment registerEnchantment(String name, Enchantment enchantment) { return Registry.register(Registry.ENCHANTMENT, BetterEnd.makeID(name), enchantment); } - - public static void register() { - } + + public static void register() {} } diff --git a/src/main/java/ru/betterend/effects/EndPotions.java b/src/main/java/ru/betterend/effects/EndPotions.java index ca53fca4..e0a91270 100644 --- a/src/main/java/ru/betterend/effects/EndPotions.java +++ b/src/main/java/ru/betterend/effects/EndPotions.java @@ -1,29 +1,28 @@ package ru.betterend.effects; +import net.minecraft.core.Registry; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.item.Items; import net.minecraft.world.item.alchemy.Potion; import net.minecraft.world.item.alchemy.Potions; -import net.minecraft.core.Registry; import ru.betterend.BetterEnd; import ru.betterend.mixin.common.BrewingAccessor; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; public class EndPotions { - public final static Potion END_VEIL = registerPotion("end_veil", EndMobEffects.END_VEIL, 3600); - public final static Potion LONG_END_VEIL = registerPotion("long_end_veil", EndMobEffects.END_VEIL, 9600); - + public final static Potion END_VEIL = registerPotion("end_veil", EndStatusEffects.END_VEIL, 3600); + public final static Potion LONG_END_VEIL = registerPotion("long_end_veil", EndStatusEffects.END_VEIL, 9600); + public static Potion registerPotion(String name, MobEffect effect, int duration) { - return registerPotion(name, - new Potion(name, new MobEffectInstance(effect, duration))); + return registerPotion(name, new Potion(name, new MobEffectInstance[]{ new MobEffectInstance(effect, duration) })); } - + public static Potion registerPotion(String name, Potion potion) { return Registry.register(Registry.POTION, BetterEnd.makeID(name), potion); } - + public static void register() { BrewingAccessor.callRegisterPotionRecipe(Potions.AWKWARD, EndItems.ENDER_DUST, END_VEIL); BrewingAccessor.callRegisterPotionRecipe(END_VEIL, Items.REDSTONE, LONG_END_VEIL); diff --git a/src/main/java/ru/betterend/effects/EndStatusEffects.java b/src/main/java/ru/betterend/effects/EndStatusEffects.java index 9ad50a28..b5176126 100644 --- a/src/main/java/ru/betterend/effects/EndStatusEffects.java +++ b/src/main/java/ru/betterend/effects/EndStatusEffects.java @@ -1,15 +1,15 @@ package ru.betterend.effects; -import net.minecraft.world.effect.MobEffect; import net.minecraft.core.Registry; +import net.minecraft.world.effect.MobEffect; import ru.betterend.BetterEnd; import ru.betterend.effects.status.EndVeilEffect; -public class EndMobEffects { - +public class EndStatusEffects { + public final static MobEffect END_VEIL = registerEffect("end_veil", new EndVeilEffect()); - + public static MobEffect registerEffect(String name, E effect) { - return Registry.register(Registry.STATUS_EFFECT, BetterEnd.makeID(name), effect); + return Registry.register(Registry.MOB_EFFECT, BetterEnd.makeID(name), effect); } } diff --git a/src/main/java/ru/betterend/effects/enchantment/EndVeilEnchantment.java b/src/main/java/ru/betterend/effects/enchantment/EndVeilEnchantment.java index 991cdd38..57d040e9 100644 --- a/src/main/java/ru/betterend/effects/enchantment/EndVeilEnchantment.java +++ b/src/main/java/ru/betterend/effects/enchantment/EndVeilEnchantment.java @@ -1,17 +1,17 @@ package ru.betterend.effects.enchantment; -import net.minecraft.world.item.enchantment.Enchantment; -import net.minecraft.world.item.enchantment.EnchantmentTarget; import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentCategory; public class EndVeilEnchantment extends Enchantment { public EndVeilEnchantment() { - super(Enchantment.Rarity.VERY_RARE, EnchantmentTarget.ARMOR_HEAD, new EquipmentSlot[] { EquipmentSlot.HEAD }); + super(Enchantment.Rarity.VERY_RARE, EnchantmentCategory.ARMOR_HEAD, new EquipmentSlot[] { EquipmentSlot.HEAD }); } - + @Override - public boolean isAvailableForRandomSelection() { + public boolean isDiscoverable() { return false; } } diff --git a/src/main/java/ru/betterend/effects/status/EndVeilEffect.java b/src/main/java/ru/betterend/effects/status/EndVeilEffect.java index b9dfce0f..eff6cbb3 100644 --- a/src/main/java/ru/betterend/effects/status/EndVeilEffect.java +++ b/src/main/java/ru/betterend/effects/status/EndVeilEffect.java @@ -1,16 +1,16 @@ package ru.betterend.effects.status; import net.minecraft.world.effect.MobEffect; -import net.minecraft.world.effect.MobEffectType; +import net.minecraft.world.effect.MobEffectCategory; public class EndVeilEffect extends MobEffect { public EndVeilEffect() { - super(MobEffectType.BENEFICIAL, 0x0D554A); + super(MobEffectCategory.BENEFICIAL, 0x0D554A); } - + @Override - public boolean canApplyUpdateEffect(int duration, int amplifier) { + public boolean isDurationEffectTick(int duration, int amplifier) { return false; } } diff --git a/src/main/java/ru/betterend/entity/CubozoaEntity.java b/src/main/java/ru/betterend/entity/CubozoaEntity.java index 5010e020..067e9226 100644 --- a/src/main/java/ru/betterend/entity/CubozoaEntity.java +++ b/src/main/java/ru/betterend/entity/CubozoaEntity.java @@ -2,143 +2,139 @@ package ru.betterend.entity; import java.util.List; import java.util.Random; - -import net.minecraft.world.entity.EntityData; -import net.minecraft.world.entity.EntityDimensions; -import net.minecraft.world.entity.EntityPose; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.ItemEntity; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.SpawnReason; -import net.minecraft.world.entity.ai.control.MoveControl; -import net.minecraft.world.entity.attribute.DefaultAttributeContainer; -import net.minecraft.world.entity.attribute.Attributes; -import net.minecraft.world.entity.damage.DamageSource; -import net.minecraft.world.entity.data.DataTracker; -import net.minecraft.world.entity.data.TrackedData; -import net.minecraft.world.entity.data.TrackedDataHandlerRegistry; -import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.effect.MobEffects; -import net.minecraft.world.entity.passive.SchoolingFishEntity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.packet.s2c.play.GameStateChangeS2CPacket; +import net.minecraft.network.protocol.game.ClientboundGameEventPacket; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.tags.FluidTags; -import net.minecraft.core.BlockPos; -import net.minecraft.world.phys.AABB; import net.minecraft.util.Mth; -import net.minecraft.world.LocalDifficulty; -import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.SpawnGroupData; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.control.MoveControl; +import net.minecraft.world.entity.animal.AbstractSchoolingFish; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.phys.AABB; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndItems; -public class CubozoaEntity extends SchoolingFishEntity { +public class CubozoaEntity extends AbstractSchoolingFish { public static final int VARIANTS = 2; - private static final TrackedData VARIANT = DataTracker.registerData(CubozoaEntity.class, - TrackedDataHandlerRegistry.BYTE); - private static final TrackedData SCALE = DataTracker.registerData(CubozoaEntity.class, - TrackedDataHandlerRegistry.BYTE); + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(CubozoaEntity.class, EntityDataSerializers.BYTE); + private static final EntityDataAccessor SCALE = SynchedEntityData.defineId(CubozoaEntity.class, EntityDataSerializers.BYTE); public CubozoaEntity(EntityType entityType, Level world) { super(entityType, world); } @Override - public EntityData initialize(ServerLevelAccessor world, LocalDifficulty difficulty, SpawnReason spawnReason, - EntityData entityData, CompoundTag entityTag) { - EntityData data = super.initialize(world, difficulty, spawnReason, entityData, entityTag); - if (EndBiomes.getFromBiome(world.getBiome(getBlockPos())) == EndBiomes.SULPHUR_SPRINGS) { - this.dataTracker.set(VARIANT, (byte) 1); + public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, SpawnGroupData entityData, CompoundTag entityTag) { + SpawnGroupData data = super.finalizeSpawn(world, difficulty, spawnReason, entityData, entityTag); + if (EndBiomes.getFromBiome(world.getBiome(blockPosition())) == EndBiomes.SULPHUR_SPRINGS) { + this.entityData.set(VARIANT, (byte) 1); } - this.calculateDimensions(); + this.refreshDimensions(); return data; } @Override - protected void initDataTracker() { - super.initDataTracker(); - this.dataTracker.startTracking(VARIANT, (byte) 0); - this.dataTracker.startTracking(SCALE, (byte) this.getRandom().nextInt(16)); + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(VARIANT, (byte) 0); + this.entityData.define(SCALE, (byte) this.getRandom().nextInt(16)); } @Override - public void writeCustomDataToTag(CompoundTag tag) { - super.writeCustomDataToTag(tag); + public void addAdditionalSaveData(CompoundTag tag) { + super.addAdditionalSaveData(tag); tag.putByte("Variant", (byte) getVariant()); tag.putByte("Scale", (byte) getScale()); } @Override - public void readCustomDataFromTag(CompoundTag tag) { - super.readCustomDataFromTag(tag); + public void readAdditionalSaveData(CompoundTag tag) { + super.readAdditionalSaveData(tag); if (tag.contains("Variant")) { - this.dataTracker.set(VARIANT, tag.getByte("Variant")); + this.entityData.set(VARIANT, tag.getByte("Variant")); } if (tag.contains("Scale")) { - this.dataTracker.set(SCALE, tag.getByte("Scale")); + this.entityData.set(SCALE, tag.getByte("Scale")); } } - public static DefaultAttributeContainer.Builder createMobAttributes() { - return LivingEntity.createLivingAttributes().add(Attributes.MAX_HEALTH, 2.0).add(Attributes.FOLLOW_RANGE, 16.0) + public static AttributeSupplier.Builder createMobAttributes() { + return LivingEntity.createLivingAttributes() + .add(Attributes.MAX_HEALTH, 2.0) + .add(Attributes.FOLLOW_RANGE, 16.0) .add(Attributes.MOVEMENT_SPEED, 0.5); } public int getVariant() { - return (int) this.dataTracker.get(VARIANT); + return (int) this.entityData.get(VARIANT); } public float getScale() { - return this.dataTracker.get(SCALE) / 32F + 0.75F; + return this.entityData.get(SCALE) / 32F + 0.75F; } - public static boolean canSpawn(EntityType type, ServerLevelAccessor world, SpawnReason spawnReason, - BlockPos pos, Random random) { - Box box = new Box(pos).expand(16); - List list = world.getEntitiesByClass(CubozoaEntity.class, box, (entity) -> { + public static boolean canSpawn(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { + AABB box = new AABB(pos).inflate(16); + List list = world.getEntitiesOfClass(CubozoaEntity.class, box, (entity) -> { return true; }); return list.size() < 9; } - protected float getActiveEyeHeight(EntityPose pose, EntityDimensions dimensions) { + protected float getStandingEyeHeight(Pose pose, EntityDimensions dimensions) { return dimensions.height * 0.5F; } - + @Override - protected void dropLoot(DamageSource source, boolean causedByPlayer) { + protected void dropFromLootTable(DamageSource source, boolean causedByPlayer) { int count = random.nextInt(3); if (count > 0) { - ItemEntity drop = new ItemEntity(world, getX(), getY(), getZ(), new ItemStack(EndItems.GELATINE, count)); - this.world.spawnEntity(drop); + ItemEntity drop = new ItemEntity(level, getX(), getY(), getZ(), new ItemStack(EndItems.GELATINE, count)); + this.level.addFreshEntity(drop); } } @Override - protected ItemStack getFishBucketItem() { + protected ItemStack getBucketItemStack() { return new ItemStack(Items.WATER_BUCKET); } @Override protected SoundEvent getFlopSound() { - return SoundEvents.ENTITY_SALMON_FLOP; + return SoundEvents.SALMON_FLOP; } - + @Override - public void onPlayerCollision(Player player) { - if (player instanceof ServerPlayer && player.damage(DamageSource.mob(this), 0.5F)) { + public void playerTouch(Player player) { + if (player instanceof ServerPlayer && player.hurt(DamageSource.mobAttack(this), 0.5F)) { if (!this.isSilent()) { - ((ServerPlayer) player).networkHandler - .sendPacket(new GameStateChangeS2CPacket(GameStateChangeS2CPacket.PUFFERFISH_STING, 0.0F)); + ((ServerPlayer) player).connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.PUFFER_FISH_STING, 0.0F)); } if (random.nextBoolean()) { - player.addMobEffect(new MobEffectInstance(MobEffects.POISON, 20, 0)); + player.addEffect(new MobEffectInstance(MobEffects.POISON, 20, 0)); } } } @@ -149,30 +145,30 @@ public class CubozoaEntity extends SchoolingFishEntity { } public void tick() { - if (this.entity.isSubmergedIn(FluidTags.WATER)) { - this.entity.setVelocity(this.entity.getVelocity().add(0.0D, 0.005D, 0.0D)); + if (this.mob.isEyeInFluid(FluidTags.WATER)) { + this.mob.setDeltaMovement(this.mob.getDeltaMovement().add(0.0D, 0.005D, 0.0D)); } - if (this.state == MoveControl.State.MOVE_TO && !this.entity.getNavigation().isIdle()) { - float f = (float) (this.speed * this.entity.getAttributeValue(Attributes.MOVEMENT_SPEED)); - this.entity.setMovementSpeed(Mth.lerp(0.125F, this.entity.getMovementSpeed(), f)); - double d = this.targetX - this.entity.getX(); - double e = this.targetY - this.entity.getY(); - double g = this.targetZ - this.entity.getZ(); + if (this.operation == MoveControl.Operation.MOVE_TO && !this.mob.getNavigation().isDone()) { + float f = (float) (this.speedModifier * this.mob.getAttributeValue(Attributes.MOVEMENT_SPEED)); + this.mob.setSpeed(Mth.lerp(0.125F, this.mob.getSpeed(), f)); + double d = this.wantedX - this.mob.getX(); + double e = this.wantedY - this.mob.getY(); + double g = this.wantedZ - this.mob.getZ(); if (e != 0.0D) { double h = (double) Mth.sqrt(d * d + e * e + g * g); - this.entity.setVelocity(this.entity.getVelocity().add(0.0D, - (double) this.entity.getMovementSpeed() * (e / h) * 0.1D, 0.0D)); + this.mob.setDeltaMovement(this.mob.getDeltaMovement().add(0.0D, (double) this.mob.getSpeed() * (e / h) * 0.1D, 0.0D)); } if (d != 0.0D || g != 0.0D) { float i = (float) (Mth.atan2(g, d) * 57.2957763671875D) - 90.0F; - this.entity.yaw = this.changeAngle(this.entity.yaw, i, 90.0F); - this.entity.bodyYaw = this.entity.yaw; + this.mob.yRot = this.rotlerp(this.mob.yRot, i, 90.0F); + this.mob.yBodyRot = this.mob.yRot; } - } else { - this.entity.setMovementSpeed(0.0F); + } + else { + this.mob.setSpeed(0.0F); } } } diff --git a/src/main/java/ru/betterend/entity/DragonflyEntity.java b/src/main/java/ru/betterend/entity/DragonflyEntity.java index c8519aa4..a105912e 100644 --- a/src/main/java/ru/betterend/entity/DragonflyEntity.java +++ b/src/main/java/ru/betterend/entity/DragonflyEntity.java @@ -2,36 +2,35 @@ package ru.betterend.entity; import java.util.EnumSet; import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.Flutterer; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.SpawnReason; -import net.minecraft.world.entity.ai.TargetFinder; -import net.minecraft.world.entity.ai.control.FlightMoveControl; -import net.minecraft.world.entity.ai.control.LookControl; -import net.minecraft.world.entity.ai.goal.AnimalMateGoal; -import net.minecraft.world.entity.ai.goal.FollowParentGoal; -import net.minecraft.world.entity.ai.goal.Goal; -import net.minecraft.world.entity.ai.goal.SwimGoal; -import net.minecraft.world.entity.ai.pathing.BirdNavigation; -import net.minecraft.world.entity.ai.pathing.EntityNavigation; -import net.minecraft.world.entity.ai.pathing.Path; -import net.minecraft.world.entity.ai.pathing.PathNodeType; -import net.minecraft.world.entity.attribute.DefaultAttributeContainer; -import net.minecraft.world.entity.attribute.Attributes; -import net.minecraft.world.entity.mob.MobEntity; -import net.minecraft.world.entity.passive.AnimalEntity; -import net.minecraft.world.entity.passive.PassiveEntity; +import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; -import net.minecraft.core.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.entity.AgableMob; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.control.FlyingMoveControl; +import net.minecraft.world.entity.ai.control.LookControl; +import net.minecraft.world.entity.ai.goal.BreedGoal; +import net.minecraft.world.entity.ai.goal.FloatGoal; +import net.minecraft.world.entity.ai.goal.FollowParentGoal; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.entity.ai.navigation.FlyingPathNavigation; +import net.minecraft.world.entity.ai.navigation.PathNavigation; +import net.minecraft.world.entity.ai.util.RandomPos; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.animal.FlyingAnimal; import net.minecraft.world.level.Level; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.pathfinder.BlockPathTypes; +import net.minecraft.world.level.pathfinder.Path; +import net.minecraft.world.phys.Vec3; import ru.betterend.entity.DragonflyEntity.DragonflyLookControl; import ru.betterend.entity.DragonflyEntity.WanderAroundGoal; import ru.betterend.registry.EndEntities; @@ -39,51 +38,53 @@ import ru.betterend.registry.EndSounds; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; -public class DragonflyEntity extends AnimalEntity implements Flutterer { +public class DragonflyEntity extends Animal implements FlyingAnimal { public DragonflyEntity(EntityType entityType, Level world) { super(entityType, world); - this.moveControl = new FlightMoveControl(this, 20, true); + this.moveControl = new FlyingMoveControl(this, 20, true); this.lookControl = new DragonflyLookControl(this); - this.setPathfindingPenalty(PathNodeType.WATER, -1.0F); - this.setPathfindingPenalty(PathNodeType.DANGER_FIRE, -1.0F); - this.experiencePoints = 1; + this.setPathfindingMalus(BlockPathTypes.WATER, -1.0F); + this.setPathfindingMalus(BlockPathTypes.DANGER_FIRE, -1.0F); + this.xpReward = 1; } - public static DefaultAttributeContainer.Builder createMobAttributes() { - return LivingEntity.createLivingAttributes().add(Attributes.MAX_HEALTH, 8.0D) - .add(Attributes.FOLLOW_RANGE, 16.0D).add(Attributes.FLYING_SPEED, 1.0D) + public static AttributeSupplier.Builder createMobAttributes() { + return LivingEntity.createLivingAttributes() + .add(Attributes.MAX_HEALTH, 8.0D) + .add(Attributes.FOLLOW_RANGE, 16.0D) + .add(Attributes.FLYING_SPEED, 1.0D) .add(Attributes.MOVEMENT_SPEED, 0.1D); } @Override - protected EntityNavigation createNavigation(Level world) { - BirdNavigation birdNavigation = new BirdNavigation(this, world) { - public boolean isValidPosition(BlockPos pos) { - BlockState state = this.world.getBlockState(pos); - return state.isAir() || !state.getMaterial().blocksMovement(); + protected PathNavigation createNavigation(Level world) { + FlyingPathNavigation birdNavigation = new FlyingPathNavigation(this, world) { + public boolean isStableDestination(BlockPos pos) { + BlockState state = this.level.getBlockState(pos); + return state.isAir() || !state.getMaterial().blocksMotion(); } public void tick() { super.tick(); } }; - birdNavigation.setCanPathThroughDoors(false); - birdNavigation.setCanSwim(false); - birdNavigation.setCanEnterOpenDoors(true); + birdNavigation.setCanOpenDoors(false); + birdNavigation.setCanFloat(false); + birdNavigation.setCanPassDoors(true); return birdNavigation; } @Override - public float getPathfindingFavor(BlockPos pos, WorldView world) { + public float getWalkTargetValue(BlockPos pos, LevelReader world) { return world.getBlockState(pos).isAir() ? 10.0F : 0.0F; } @Override - protected void initGoals() { - this.goalSelector.add(1, new SwimGoal(this)); - this.goalSelector.add(2, new AnimalMateGoal(this, 1.0D)); - this.goalSelector.add(3, new FollowParentGoal(this, 1.0D)); - this.goalSelector.add(4, new WanderAroundGoal()); + protected void registerGoals() { + this.goalSelector.addGoal(1, new FloatGoal(this)); + this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); + this.goalSelector.addGoal(3, new FollowParentGoal(this, 1.0D)); + this.goalSelector.addGoal(4, new WanderAroundGoal()); } @Override @@ -92,22 +93,22 @@ public class DragonflyEntity extends AnimalEntity implements Flutterer { } @Override - protected boolean hasWings() { + protected boolean makeFlySound() { return true; } @Override - public boolean handleFallDamage(float fallDistance, float damageMultiplier) { + public boolean causeFallDamage(float fallDistance, float damageMultiplier) { return false; } @Override - public boolean canClimb() { + public boolean isMovementNoisy() { return false; } @Override - public boolean hasNoGravity() { + public boolean isNoGravity() { return true; } @@ -122,79 +123,78 @@ public class DragonflyEntity extends AnimalEntity implements Flutterer { } class DragonflyLookControl extends LookControl { - DragonflyLookControl(MobEntity entity) { + DragonflyLookControl(Mob entity) { super(entity); } - protected boolean shouldStayHorizontal() { + protected boolean resetXRotOnTick() { return true; } } class WanderAroundGoal extends Goal { WanderAroundGoal() { - this.setControls(EnumSet.of(Goal.Control.MOVE)); + this.setFlags(EnumSet.of(Goal.Flag.MOVE)); } - public boolean canStart() { - return DragonflyEntity.this.navigation.isIdle() && DragonflyEntity.this.random.nextInt(10) == 0; + public boolean canUse() { + return DragonflyEntity.this.navigation.isDone() && DragonflyEntity.this.random.nextInt(10) == 0; } - public boolean shouldContinue() { - return DragonflyEntity.this.navigation.isFollowingPath(); + public boolean canContinueToUse() { + return DragonflyEntity.this.navigation.isInProgress(); } public void start() { - Vec3d vec3d = this.getRandomLocation(); + Vec3 vec3d = this.getRandomLocation(); if (vec3d != null) { BlockPos pos = new BlockPos(vec3d); try { - Path path = DragonflyEntity.this.navigation.findPathTo(pos, 1); + Path path = DragonflyEntity.this.navigation.createPath(pos, 1); if (path != null) { - DragonflyEntity.this.navigation.startMovingAlong(path, 1.0D); + DragonflyEntity.this.navigation.moveTo(path, 1.0D); } - } catch (Exception e) { } + catch (Exception e) {} } super.start(); } - private Vec3d getRandomLocation() { - int h = BlocksHelper.downRay(DragonflyEntity.this.world, DragonflyEntity.this.getBlockPos(), 16); - Vec3d rotation = DragonflyEntity.this.getRotationVec(0.0F); - Vec3d airPos = TargetFinder.findAirTarget(DragonflyEntity.this, 8, 7, rotation, 1.5707964F, 2, 1); + private Vec3 getRandomLocation() { + int h = BlocksHelper.downRay(DragonflyEntity.this.level, DragonflyEntity.this.blockPosition(), 16); + Vec3 rotation = DragonflyEntity.this.getViewVector(0.0F); + Vec3 airPos = RandomPos.getAboveLandPos(DragonflyEntity.this, 8, 7, rotation, 1.5707964F, 2, 1); if (airPos != null) { if (isInVoid(airPos)) { for (int i = 0; i < 8; i++) { - airPos = TargetFinder.findAirTarget(DragonflyEntity.this, 16, 7, rotation, MHelper.PI2, 2, 1); + airPos = RandomPos.getAboveLandPos(DragonflyEntity.this, 16, 7, rotation, MHelper.PI2, 2, 1); if (airPos != null && !isInVoid(airPos)) { return airPos; } } return null; } - if (h > 5 && airPos.getY() >= DragonflyEntity.this.getBlockPos().getY()) { - airPos = new Vec3d(airPos.x, airPos.y - h * 0.5, airPos.z); + if (h > 5 && airPos.y() >= DragonflyEntity.this.blockPosition().getY()) { + airPos = new Vec3(airPos.x, airPos.y - h * 0.5, airPos.z); } return airPos; } - return TargetFinder.findGroundTarget(DragonflyEntity.this, 8, 4, -2, rotation, 1.5707963705062866D); + return RandomPos.getAirPos(DragonflyEntity.this, 8, 4, -2, rotation, 1.5707963705062866D); } - private boolean isInVoid(Vec3d pos) { - int h = BlocksHelper.downRay(DragonflyEntity.this.world, new BlockPos(pos), 128); + private boolean isInVoid(Vec3 pos) { + int h = BlocksHelper.downRay(DragonflyEntity.this.level, new BlockPos(pos), 128); return h > 100; } } @Override - public PassiveEntity createChild(ServerLevel world, PassiveEntity entity) { + public AgableMob getBreedOffspring(ServerLevel world, AgableMob entity) { return EndEntities.DRAGONFLY.create(world); } - - public static boolean canSpawn(EntityType type, ServerLevelAccessor world, SpawnReason spawnReason, - BlockPos pos, Random random) { - int y = world.getChunk(pos).sampleHeightmap(Type.WORLD_SURFACE, pos.getX() & 15, pos.getY() & 15); + + public static boolean canSpawn(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { + int y = world.getChunk(pos).getHeight(Types.WORLD_SURFACE, pos.getX() & 15, pos.getY() & 15); return y > 0 && pos.getY() >= y; } } diff --git a/src/main/java/ru/betterend/entity/EndFishEntity.java b/src/main/java/ru/betterend/entity/EndFishEntity.java index eef8815f..a37d3854 100644 --- a/src/main/java/ru/betterend/entity/EndFishEntity.java +++ b/src/main/java/ru/betterend/entity/EndFishEntity.java @@ -2,143 +2,138 @@ package ru.betterend.entity; import java.util.List; import java.util.Random; - -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.entity.EntityData; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.ItemEntity; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.SpawnReason; -import net.minecraft.world.entity.attribute.DefaultAttributeContainer; -import net.minecraft.world.entity.attribute.Attributes; -import net.minecraft.world.entity.damage.DamageSource; -import net.minecraft.world.entity.data.DataTracker; -import net.minecraft.world.entity.data.TrackedData; -import net.minecraft.world.entity.data.TrackedDataHandlerRegistry; -import net.minecraft.world.entity.passive.SchoolingFishEntity; -import net.minecraft.world.item.ItemStack; -import net.minecraft.nbt.CompoundTag; +import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; -import net.minecraft.core.BlockPos; -import net.minecraft.world.phys.AABB; -import net.minecraft.world.LocalDifficulty; -import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.SpawnGroupData; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.animal.AbstractSchoolingFish; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.phys.AABB; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndItems; -public class EndFishEntity extends SchoolingFishEntity { +public class EndFishEntity extends AbstractSchoolingFish { public static final int VARIANTS_NORMAL = 5; public static final int VARIANTS_SULPHUR = 3; public static final int VARIANTS = VARIANTS_NORMAL + VARIANTS_SULPHUR; - private static final TrackedData VARIANT = DataTracker.registerData(EndFishEntity.class, - TrackedDataHandlerRegistry.BYTE); - private static final TrackedData SCALE = DataTracker.registerData(EndFishEntity.class, - TrackedDataHandlerRegistry.BYTE); - + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(EndFishEntity.class, EntityDataSerializers.BYTE); + private static final EntityDataAccessor SCALE = SynchedEntityData.defineId(EndFishEntity.class, EntityDataSerializers.BYTE); + public EndFishEntity(EntityType entityType, Level world) { super(entityType, world); } - + @Override - public EntityData initialize(ServerLevelAccessor world, LocalDifficulty difficulty, SpawnReason spawnReason, - EntityData entityData, CompoundTag entityTag) { - EntityData data = super.initialize(world, difficulty, spawnReason, entityData, entityTag); - if (EndBiomes.getFromBiome(world.getBiome(getBlockPos())) == EndBiomes.SULPHUR_SPRINGS) { - this.dataTracker.set(VARIANT, (byte) (random.nextInt(VARIANTS_SULPHUR) + VARIANTS_NORMAL)); + public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, SpawnGroupData entityData, CompoundTag entityTag) { + SpawnGroupData data = super.finalizeSpawn(world, difficulty, spawnReason, entityData, entityTag); + if (EndBiomes.getFromBiome(world.getBiome(blockPosition())) == EndBiomes.SULPHUR_SPRINGS) { + this.entityData.set(VARIANT, (byte) (random.nextInt(VARIANTS_SULPHUR) + VARIANTS_NORMAL)); } - this.calculateDimensions(); + this.refreshDimensions(); return data; } - + @Override - protected void initDataTracker() { - super.initDataTracker(); - this.dataTracker.startTracking(VARIANT, (byte) this.getRandom().nextInt(VARIANTS_NORMAL)); - this.dataTracker.startTracking(SCALE, (byte) this.getRandom().nextInt(16)); + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(VARIANT, (byte) this.getRandom().nextInt(VARIANTS_NORMAL)); + this.entityData.define(SCALE, (byte) this.getRandom().nextInt(16)); } - + @Override - public void writeCustomDataToTag(CompoundTag tag) { - super.writeCustomDataToTag(tag); + public void addAdditionalSaveData(CompoundTag tag) { + super.addAdditionalSaveData(tag); tag.putByte("Variant", (byte) getVariant()); tag.putByte("Scale", (byte) getScale()); } @Override - public void readCustomDataFromTag(CompoundTag tag) { - super.readCustomDataFromTag(tag); + public void readAdditionalSaveData(CompoundTag tag) { + super.readAdditionalSaveData(tag); if (tag.contains("Variant")) { - this.dataTracker.set(VARIANT, tag.getByte("Variant")); + this.entityData.set(VARIANT, tag.getByte("Variant")); } if (tag.contains("Scale")) { - this.dataTracker.set(SCALE, tag.getByte("Scale")); + this.entityData.set(SCALE, tag.getByte("Scale")); } } @Override - protected ItemStack getFishBucketItem() { + protected ItemStack getBucketItemStack() { return new ItemStack(EndItems.BUCKET_END_FISH); } @Override protected SoundEvent getFlopSound() { - return SoundEvents.ENTITY_TROPICAL_FISH_FLOP; + return SoundEvents.TROPICAL_FISH_FLOP; } @Override protected SoundEvent getAmbientSound() { - return SoundEvents.ENTITY_SALMON_AMBIENT; + return SoundEvents.SALMON_AMBIENT; } @Override protected SoundEvent getDeathSound() { - return SoundEvents.ENTITY_SALMON_DEATH; + return SoundEvents.SALMON_DEATH; } @Override protected SoundEvent getHurtSound(DamageSource source) { - return SoundEvents.ENTITY_SALMON_HURT; + return SoundEvents.SALMON_HURT; } - + @Override public void tick() { super.tick(); - if (random.nextInt(8) == 0 && getBlockState().is(Blocks.WATER)) { + if (random.nextInt(8) == 0 && getFeetBlockState().is(Blocks.WATER)) { double x = getX() + random.nextGaussian() * 0.2; double y = getY() + random.nextGaussian() * 0.2; double z = getZ() + random.nextGaussian() * 0.2; - world.addParticle(ParticleTypes.BUBBLE, x, y, z, 0, 0, 0); + level.addParticle(ParticleTypes.BUBBLE, x, y, z, 0, 0, 0); } } - - public static DefaultAttributeContainer.Builder createMobAttributes() { - return LivingEntity.createLivingAttributes().add(Attributes.MAX_HEALTH, 2.0).add(Attributes.FOLLOW_RANGE, 16.0) + + public static AttributeSupplier.Builder createMobAttributes() { + return LivingEntity.createLivingAttributes() + .add(Attributes.MAX_HEALTH, 2.0) + .add(Attributes.FOLLOW_RANGE, 16.0) .add(Attributes.MOVEMENT_SPEED, 0.75); } - + public int getVariant() { - return (int) this.dataTracker.get(VARIANT); + return (int) this.entityData.get(VARIANT); } - + public float getScale() { - return this.dataTracker.get(SCALE) / 32F + 0.75F; + return this.entityData.get(SCALE) / 32F + 0.75F; } - - public static boolean canSpawn(EntityType type, ServerLevelAccessor world, SpawnReason spawnReason, - BlockPos pos, Random random) { - Box box = new Box(pos).expand(16); - List list = world.getEntitiesByClass(EndFishEntity.class, box, (entity) -> { - return true; - }); + + public static boolean canSpawn(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { + AABB box = new AABB(pos).inflate(16); + List list = world.getEntitiesOfClass(EndFishEntity.class, box, (entity) -> { return true; }); return list.size() < 9; } - + @Override - protected void dropLoot(DamageSource source, boolean causedByPlayer) { - ItemEntity drop = new ItemEntity(world, getX(), getY(), getZ(), new ItemStack(EndItems.END_FISH_RAW)); - this.world.spawnEntity(drop); + protected void dropFromLootTable(DamageSource source, boolean causedByPlayer) { + ItemEntity drop = new ItemEntity(level, getX(), getY(), getZ(), new ItemStack(EndItems.END_FISH_RAW)); + this.level.addFreshEntity(drop); } } diff --git a/src/main/java/ru/betterend/entity/EndSlimeEntity.java b/src/main/java/ru/betterend/entity/EndSlimeEntity.java index a8fcf67e..f23f8c99 100644 --- a/src/main/java/ru/betterend/entity/EndSlimeEntity.java +++ b/src/main/java/ru/betterend/entity/EndSlimeEntity.java @@ -3,41 +3,40 @@ package ru.betterend.entity; import java.util.EnumSet; import java.util.List; import java.util.Random; - -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.entity.EntityData; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.ItemEntity; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.SpawnReason; -import net.minecraft.world.entity.ai.control.MoveControl; -import net.minecraft.world.entity.ai.goal.FollowTargetGoal; -import net.minecraft.world.entity.ai.goal.Goal; -import net.minecraft.world.entity.attribute.DefaultAttributeContainer; -import net.minecraft.world.entity.attribute.Attributes; -import net.minecraft.world.entity.damage.DamageSource; -import net.minecraft.world.entity.data.DataTracker; -import net.minecraft.world.entity.data.TrackedData; -import net.minecraft.world.entity.data.TrackedDataHandlerRegistry; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.util.Mth; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.effect.MobEffects; -import net.minecraft.world.entity.mob.SlimeEntity; -import net.minecraft.world.entity.passive.IronGolemEntity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.SpawnGroupData; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.control.MoveControl; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.animal.IronGolem; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.monster.Slime; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.core.particles.ParticleOptions; -import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.text.Text; -import net.minecraft.core.BlockPos; -import net.minecraft.core.BlockPos.MutableBlockPos; -import net.minecraft.world.phys.AABB; -import net.minecraft.util.Mth; -import net.minecraft.world.LocalDifficulty; -import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.phys.AABB; import ru.betterend.entity.EndSlimeEntity.EndSlimeMoveControl; import ru.betterend.entity.EndSlimeEntity.FaceTowardTargetGoal; import ru.betterend.entity.EndSlimeEntity.MoveGoal; @@ -49,131 +48,132 @@ import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; import ru.betterend.world.biome.EndBiome; -public class EndSlimeEntity extends SlimeEntity { - private static final TrackedData VARIANT = DataTracker.registerData(EndSlimeEntity.class, - TrackedDataHandlerRegistry.BYTE); +public class EndSlimeEntity extends Slime { + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(EndSlimeEntity.class, EntityDataSerializers.BYTE); private static final MutableBlockPos POS = new MutableBlockPos(); - + public EndSlimeEntity(EntityType entityType, Level world) { super(entityType, world); this.moveControl = new EndSlimeMoveControl(this); } - - protected void initGoals() { - this.goalSelector.add(1, new SwimmingGoal()); - this.goalSelector.add(2, new FaceTowardTargetGoal()); - this.goalSelector.add(3, new RandomLookGoal()); - this.goalSelector.add(5, new MoveGoal()); - this.targetSelector.add(1, new FollowTargetGoal(this, Player.class, 10, true, false, (livingEntity) -> { + + protected void registerGoals() { + this.goalSelector.addGoal(1, new SwimmingGoal()); + this.goalSelector.addGoal(2, new FaceTowardTargetGoal()); + this.goalSelector.addGoal(3, new RandomLookGoal()); + this.goalSelector.addGoal(5, new MoveGoal()); + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal(this, Player.class, 10, true, false, (livingEntity) -> { return Math.abs(livingEntity.getY() - this.getY()) <= 4.0D; })); - this.targetSelector.add(3, new FollowTargetGoal(this, IronGolemEntity.class, true)); + this.targetSelector.addGoal(3, new NearestAttackableTargetGoal(this, IronGolem.class, true)); } - - public static DefaultAttributeContainer.Builder createMobAttributes() { - return LivingEntity.createLivingAttributes().add(Attributes.MAX_HEALTH, 1.0D) - .add(Attributes.ATTACK_DAMAGE, 1.0D).add(Attributes.FOLLOW_RANGE, 16.0D) + + public static AttributeSupplier.Builder createMobAttributes() { + return LivingEntity.createLivingAttributes() + .add(Attributes.MAX_HEALTH, 1.0D) + .add(Attributes.ATTACK_DAMAGE, 1.0D) + .add(Attributes.FOLLOW_RANGE, 16.0D) .add(Attributes.MOVEMENT_SPEED, 0.15D); } - + @Override - public EntityData initialize(ServerLevelAccessor world, LocalDifficulty difficulty, SpawnReason spawnReason, - EntityData entityData, CompoundTag entityTag) { - EntityData data = super.initialize(world, difficulty, spawnReason, entityData, entityTag); - EndBiome biome = EndBiomes.getFromBiome(world.getBiome(getBlockPos())); + public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, SpawnGroupData entityData, CompoundTag entityTag) { + SpawnGroupData data = super.finalizeSpawn(world, difficulty, spawnReason, entityData, entityTag); + EndBiome biome = EndBiomes.getFromBiome(world.getBiome(blockPosition())); if (biome == EndBiomes.FOGGY_MUSHROOMLAND) { this.setMossy(); - } else if (biome == EndBiomes.MEGALAKE || biome == EndBiomes.MEGALAKE_GROVE) { + } + else if (biome == EndBiomes.MEGALAKE || biome == EndBiomes.MEGALAKE_GROVE) { this.setLake(); - } else if (biome == EndBiomes.AMBER_LAND) { + } + else if (biome == EndBiomes.AMBER_LAND) { this.setAmber(true); } - this.calculateDimensions(); + this.refreshDimensions(); return data; } @Override - protected void initDataTracker() { - super.initDataTracker(); - this.dataTracker.startTracking(VARIANT, (byte) 0); + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(VARIANT, (byte) 0); } - + @Override - public void writeCustomDataToTag(CompoundTag tag) { - super.writeCustomDataToTag(tag); + public void addAdditionalSaveData(CompoundTag tag) { + super.addAdditionalSaveData(tag); tag.putByte("Variant", (byte) getSlimeType()); } @Override - public void readCustomDataFromTag(CompoundTag tag) { - super.readCustomDataFromTag(tag); + public void readAdditionalSaveData(CompoundTag tag) { + super.readAdditionalSaveData(tag); if (tag.contains("Variant")) { - this.dataTracker.set(VARIANT, tag.getByte("Variant")); + this.entityData.set(VARIANT, tag.getByte("Variant")); } } @Override - protected ParticleOptions getParticles() { + protected ParticleOptions getParticleType() { return ParticleTypes.PORTAL; } - + @Override public void remove() { int i = this.getSize(); - if (!this.world.isClientSide && i > 1 && this.isDead()) { - Text text = this.getCustomName(); - boolean bl = this.isAiDisabled(); + if (!this.level.isClientSide && i > 1 && this.isDeadOrDying()) { + Component text = this.getCustomName(); + boolean bl = this.isNoAi(); float f = (float) i / 4.0F; int j = i / 2; int k = 2 + this.random.nextInt(3); int type = this.getSlimeType(); - + for (int l = 0; l < k; ++l) { float g = ((float) (l % 2) - 0.5F) * f; float h = ((float) (l / 2) - 0.5F) * f; - EndSlimeEntity slimeEntity = (EndSlimeEntity) this.getType().create(this.world); - if (this.isPersistent()) { - slimeEntity.setPersistent(); + EndSlimeEntity slimeEntity = (EndSlimeEntity) this.getType().create(this.level); + if (this.isPersistenceRequired()) { + slimeEntity.setPersistenceRequired(); } slimeEntity.setSlimeType(type); slimeEntity.setCustomName(text); - slimeEntity.setAiDisabled(bl); + slimeEntity.setNoAi(bl); slimeEntity.setInvulnerable(this.isInvulnerable()); ((ISlime) slimeEntity).beSetSlimeSize(j, true); - slimeEntity.calculateDimensions(); - slimeEntity.refreshPositionAndAngles(this.getX() + (double) g, this.getY() + 0.5D, - this.getZ() + (double) h, this.random.nextFloat() * 360.0F, 0.0F); - this.world.spawnEntity(slimeEntity); + slimeEntity.refreshDimensions(); + slimeEntity.moveTo(this.getX() + (double) g, this.getY() + 0.5D, this.getZ() + (double) h, this.random.nextFloat() * 360.0F, 0.0F); + this.level.addFreshEntity(slimeEntity); } } this.removed = true; } - + @Override - protected void dropLoot(DamageSource source, boolean causedByPlayer) { + protected void dropFromLootTable(DamageSource source, boolean causedByPlayer) { int maxCount = this.getSize(); int minCount = maxCount >> 1; if (minCount < 1) { minCount = 1; } - if (causedByPlayer && this.attackingPlayer != null) { - int looting = EnchantmentHelper.getLooting(this.attackingPlayer); + if (causedByPlayer && this.lastHurtByPlayer != null) { + int looting = EnchantmentHelper.getMobLooting(this.lastHurtByPlayer); minCount += looting; } int count = minCount < maxCount ? MHelper.randRange(minCount, maxCount, random) : maxCount; - ItemEntity drop = new ItemEntity(world, getX(), getY(), getZ(), new ItemStack(Items.SLIME_BALL, count)); - this.world.spawnEntity(drop); + ItemEntity drop = new ItemEntity(level, getX(), getY(), getZ(), new ItemStack(Items.SLIME_BALL, count)); + this.level.addFreshEntity(drop); } - + public int getSlimeType() { - return this.dataTracker.get(VARIANT).intValue(); + return this.entityData.get(VARIANT).intValue(); } - + public void setSlimeType(int value) { - this.dataTracker.set(VARIANT, (byte) value); + this.entityData.set(VARIANT, (byte) value); } - + protected void setMossy() { setSlimeType(1); } @@ -181,7 +181,7 @@ public class EndSlimeEntity extends SlimeEntity { public boolean isMossy() { return getSlimeType() == 1; } - + protected void setLake() { setSlimeType(2); } @@ -189,38 +189,34 @@ public class EndSlimeEntity extends SlimeEntity { public boolean isLake() { return getSlimeType() == 2; } - + protected void setAmber(boolean mossy) { - this.dataTracker.set(VARIANT, (byte) 3); + this.entityData.set(VARIANT, (byte) 3); } public boolean isAmber() { - return this.dataTracker.get(VARIANT) == 3; + return this.entityData.get(VARIANT) == 3; } - + public boolean isChorus() { - return this.dataTracker.get(VARIANT) == 0; + return this.entityData.get(VARIANT) == 0; } - - public static boolean canSpawn(EntityType type, ServerLevelAccessor world, SpawnReason spawnReason, - BlockPos pos, Random random) { - return random.nextInt(16) == 0 || isPermanentBiome(world, pos) - || (notManyEntities(world, pos, 32, 3) && isWaterNear(world, pos, 32, 8)); + + public static boolean canSpawn(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { + return random.nextInt(16) == 0 || isPermanentBiome(world, pos) || (notManyEntities(world, pos, 32, 3) && isWaterNear(world, pos, 32, 8)); } - + private static boolean isPermanentBiome(ServerLevelAccessor world, BlockPos pos) { Biome biome = world.getBiome(pos); return EndBiomes.getFromBiome(biome) == EndBiomes.CHORUS_FOREST; } - + private static boolean notManyEntities(ServerLevelAccessor world, BlockPos pos, int radius, int maxCount) { - Box box = new Box(pos).expand(radius); - List list = world.getEntitiesByClass(EndSlimeEntity.class, box, (entity) -> { - return true; - }); + AABB box = new AABB(pos).inflate(radius); + List list = world.getEntitiesOfClass(EndSlimeEntity.class, box, (entity) -> { return true; }); return list.size() <= maxCount; } - + private static boolean isWaterNear(ServerLevelAccessor world, BlockPos pos, int radius, int radius2) { for (int x = pos.getX() - radius; x <= pos.getX() + radius; x++) { POS.setX(x); @@ -236,27 +232,27 @@ public class EndSlimeEntity extends SlimeEntity { } return false; } - + class MoveGoal extends Goal { public MoveGoal() { - this.setControls(EnumSet.of(Goal.Control.JUMP, Goal.Control.MOVE)); + this.setFlags(EnumSet.of(Goal.Flag.JUMP, Goal.Flag.MOVE)); } - public boolean canStart() { - if (EndSlimeEntity.this.hasVehicle()) { + public boolean canUse() { + if (EndSlimeEntity.this.isPassenger()) { return false; } - - float yaw = EndSlimeEntity.this.getHeadYaw(); - float speed = EndSlimeEntity.this.getMovementSpeed(); + + float yaw = EndSlimeEntity.this.getYHeadRot(); + float speed = EndSlimeEntity.this.getSpeed(); if (speed > 0.1) { float dx = Mth.sin(-yaw * 0.017453292F); float dz = Mth.cos(-yaw * 0.017453292F); - BlockPos pos = EndSlimeEntity.this.getBlockPos().add(dx * speed * 4, 0, dz * speed * 4); - int down = BlocksHelper.downRay(EndSlimeEntity.this.world, pos, 16); + BlockPos pos = EndSlimeEntity.this.blockPosition().offset(dx * speed * 4, 0, dz * speed * 4); + int down = BlocksHelper.downRay(EndSlimeEntity.this.level, pos, 16); return down < 5; } - + return true; } @@ -267,18 +263,19 @@ public class EndSlimeEntity extends SlimeEntity { class SwimmingGoal extends Goal { public SwimmingGoal() { - this.setControls(EnumSet.of(Goal.Control.JUMP, Goal.Control.MOVE)); - EndSlimeEntity.this.getNavigation().setCanSwim(true); + this.setFlags(EnumSet.of(Goal.Flag.JUMP, Goal.Flag.MOVE)); + EndSlimeEntity.this.getNavigation().setCanFloat(true); } - public boolean canStart() { - return (EndSlimeEntity.this.isTouchingWater() || EndSlimeEntity.this.isInLava()) + public boolean canUse() { + return (EndSlimeEntity.this.isInWater() + || EndSlimeEntity.this.isInLava()) && EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl; } public void tick() { if (EndSlimeEntity.this.getRandom().nextFloat() < 0.8F) { - EndSlimeEntity.this.getJumpControl().setActive(); + EndSlimeEntity.this.getJumpControl().jump(); } ((EndSlimeMoveControl) EndSlimeEntity.this.getMoveControl()).move(1.2D); @@ -290,14 +287,15 @@ public class EndSlimeEntity extends SlimeEntity { private int timer; public RandomLookGoal() { - this.setControls(EnumSet.of(Goal.Control.LOOK)); + this.setFlags(EnumSet.of(Goal.Flag.LOOK)); } - public boolean canStart() { + public boolean canUse() { return EndSlimeEntity.this.getTarget() == null - && (EndSlimeEntity.this.onGround || EndSlimeEntity.this.isTouchingWater() + && (EndSlimeEntity.this.onGround + || EndSlimeEntity.this.isInWater() || EndSlimeEntity.this.isInLava() - || EndSlimeEntity.this.hasMobEffect(MobEffects.LEVITATION)) + || EndSlimeEntity.this.hasEffect(MobEffects.LEVITATION)) && EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl; } @@ -315,18 +313,19 @@ public class EndSlimeEntity extends SlimeEntity { private int ticksLeft; public FaceTowardTargetGoal() { - this.setControls(EnumSet.of(Goal.Control.LOOK)); + this.setFlags(EnumSet.of(Goal.Flag.LOOK)); } - public boolean canStart() { + public boolean canUse() { LivingEntity livingEntity = EndSlimeEntity.this.getTarget(); if (livingEntity == null) { return false; - } else if (!livingEntity.isAlive()) { + } + else if (!livingEntity.isAlive()) { return false; - } else { - return livingEntity instanceof Player && ((Player) livingEntity).abilities.invulnerable ? false - : EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl; + } + else { + return livingEntity instanceof Player && ((Player) livingEntity).abilities.invulnerable ? false : EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl; } } @@ -335,23 +334,25 @@ public class EndSlimeEntity extends SlimeEntity { super.start(); } - public boolean shouldContinue() { + public boolean canContinueToUse() { LivingEntity livingEntity = EndSlimeEntity.this.getTarget(); if (livingEntity == null) { return false; - } else if (!livingEntity.isAlive()) { + } + else if (!livingEntity.isAlive()) { return false; - } else if (livingEntity instanceof Player && ((Player) livingEntity).abilities.invulnerable) { + } + else if (livingEntity instanceof Player && ((Player) livingEntity).abilities.invulnerable) { return false; - } else { + } + else { return --this.ticksLeft > 0; } } public void tick() { - EndSlimeEntity.this.lookAtEntity(EndSlimeEntity.this.getTarget(), 10.0F, 10.0F); - ((EndSlimeMoveControl) EndSlimeEntity.this.getMoveControl()).look(EndSlimeEntity.this.yaw, - EndSlimeEntity.this.canAttack()); + EndSlimeEntity.this.lookAt(EndSlimeEntity.this.getTarget(), 10.0F, 10.0F); + ((EndSlimeMoveControl) EndSlimeEntity.this.getMoveControl()).look(EndSlimeEntity.this.yRot, EndSlimeEntity.this.isDealsDamage()); } } @@ -362,7 +363,7 @@ public class EndSlimeEntity extends SlimeEntity { public EndSlimeMoveControl(EndSlimeEntity slime) { super(slime); - this.targetYaw = 180.0F * slime.yaw / 3.1415927F; + this.targetYaw = 180.0F * slime.yRot / 3.1415927F; } public void look(float targetYaw, boolean jumpOften) { @@ -371,49 +372,48 @@ public class EndSlimeEntity extends SlimeEntity { } public void move(double speed) { - this.speed = speed; - this.state = MoveControl.State.MOVE_TO; + this.speedModifier = speed; + this.operation = MoveControl.Operation.MOVE_TO; } public void tick() { - this.entity.yaw = this.changeAngle(this.entity.yaw, this.targetYaw, 90.0F); - this.entity.headYaw = this.entity.yaw; - this.entity.bodyYaw = this.entity.yaw; - if (this.state != MoveControl.State.MOVE_TO) { - this.entity.setForwardSpeed(0.0F); - } else { - this.state = MoveControl.State.WAIT; - if (this.entity.isOnGround()) { - this.entity.setMovementSpeed( - (float) (this.speed * this.entity.getAttributeValue(Attributes.MOVEMENT_SPEED))); + this.mob.yRot = this.rotlerp(this.mob.yRot, this.targetYaw, 90.0F); + this.mob.yHeadRot = this.mob.yRot; + this.mob.yBodyRot = this.mob.yRot; + if (this.operation != MoveControl.Operation.MOVE_TO) { + this.mob.setZza(0.0F); + } + else { + this.operation = MoveControl.Operation.WAIT; + if (this.mob.isOnGround()) { + this.mob.setSpeed((float) (this.speedModifier * this.mob.getAttributeValue(Attributes.MOVEMENT_SPEED))); if (this.ticksUntilJump-- <= 0) { - this.ticksUntilJump = EndSlimeEntity.this.getTicksUntilNextJump(); + this.ticksUntilJump = EndSlimeEntity.this.getJumpDelay(); if (this.jumpOften) { this.ticksUntilJump /= 3; } - EndSlimeEntity.this.getJumpControl().setActive(); - if (EndSlimeEntity.this.makesJumpSound()) { - EndSlimeEntity.this.playSound(EndSlimeEntity.this.getJumpSound(), - EndSlimeEntity.this.getSoundVolume(), getJumpSoundPitch()); + EndSlimeEntity.this.getJumpControl().jump(); + if (EndSlimeEntity.this.doPlayJumpSound()) { + EndSlimeEntity.this.playSound(EndSlimeEntity.this.getJumpSound(), EndSlimeEntity.this.getSoundVolume(), getJumpSoundPitch()); } - } else { - EndSlimeEntity.this.sidewaysSpeed = 0.0F; - EndSlimeEntity.this.forwardSpeed = 0.0F; - this.entity.setMovementSpeed(0.0F); } - } else { - this.entity.setMovementSpeed( - (float) (this.speed * this.entity.getAttributeValue(Attributes.MOVEMENT_SPEED))); + else { + EndSlimeEntity.this.xxa = 0.0F; + EndSlimeEntity.this.zza = 0.0F; + this.mob.setSpeed(0.0F); + } + } + else { + this.mob.setSpeed((float) (this.speedModifier * this.mob.getAttributeValue(Attributes.MOVEMENT_SPEED))); } } } private float getJumpSoundPitch() { - float f = EndSlimeEntity.this.isSmall() ? 1.4F : 0.8F; - return ((EndSlimeEntity.this.random.nextFloat() - EndSlimeEntity.this.random.nextFloat()) * 0.2F + 1.0F) - * f; + float f = EndSlimeEntity.this.isTiny() ? 1.4F : 0.8F; + return ((EndSlimeEntity.this.random.nextFloat() - EndSlimeEntity.this.random.nextFloat()) * 0.2F + 1.0F) * f; } } } diff --git a/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java b/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java index e9f28bea..9e466de1 100644 --- a/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java +++ b/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java @@ -2,64 +2,75 @@ package ru.betterend.entity; import java.util.List; import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.SpawnReason; -import net.minecraft.world.entity.ai.goal.FollowTargetGoal; -import net.minecraft.world.entity.ai.goal.LookAroundGoal; -import net.minecraft.world.entity.ai.goal.LookAtEntityGoal; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; import net.minecraft.world.entity.ai.goal.MeleeAttackGoal; -import net.minecraft.world.entity.ai.goal.WanderAroundFarGoal; -import net.minecraft.world.entity.attribute.DefaultAttributeContainer; -import net.minecraft.world.entity.attribute.Attributes; -import net.minecraft.world.entity.damage.DamageSource; -import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.effect.MobEffects; -import net.minecraft.world.entity.mob.HostileEntity; +import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; +import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; import net.minecraft.world.entity.player.Player; -import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.core.BlockPos; -import net.minecraft.world.phys.AABB; -import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; import ru.betterend.registry.EndSounds; import ru.betterend.util.MHelper; -public class ShadowWalkerEntity extends HostileEntity { +public class ShadowWalkerEntity extends Monster { public ShadowWalkerEntity(EntityType entityType, Level world) { super(entityType, world); } - + @Override - protected void initGoals() { - this.goalSelector.add(2, new AttackGoal(this, 1.0D, false)); - this.goalSelector.add(7, new WanderAroundFarGoal(this, 1.0D)); - this.goalSelector.add(8, new LookAtEntityGoal(this, Player.class, 8.0F)); - this.goalSelector.add(8, new LookAroundGoal(this)); - this.targetSelector.add(2, new FollowTargetGoal(this, Player.class, true)); + protected void registerGoals() { + this.goalSelector.addGoal(2, new AttackGoal(this, 1.0D, false)); + this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(8, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal(this, Player.class, true)); } - public static DefaultAttributeContainer.Builder createMobAttributes() { - return HostileEntity.createHostileAttributes().add(Attributes.FOLLOW_RANGE, 35.0) - .add(Attributes.MOVEMENT_SPEED, 0.15).add(Attributes.ATTACK_DAMAGE, 4.5).add(Attributes.ARMOR, 2.0) - .add(Attributes.ZOMBIE_SPAWN_REINFORCEMENTS); + public static AttributeSupplier.Builder createMobAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.FOLLOW_RANGE, 35.0) + .add(Attributes.MOVEMENT_SPEED, 0.15) + .add(Attributes.ATTACK_DAMAGE, 4.5) + .add(Attributes.ARMOR, 2.0) + .add(Attributes.SPAWN_REINFORCEMENTS_CHANCE); } - + @Override public void tick() { super.tick(); - world.addParticle(ParticleTypes.ASH, getX() + random.nextGaussian() * 0.2, - getY() + random.nextGaussian() * 0.5 + 1, getZ() + random.nextGaussian() * 0.2, 0, 0, 0); - world.addParticle(ParticleTypes.SMOKE, getX() + random.nextGaussian() * 0.2, - getY() + random.nextGaussian() * 0.5 + 1, getZ() + random.nextGaussian() * 0.2, 0, 0, 0); - world.addParticle(ParticleTypes.ENTITY_EFFECT, getX() + random.nextGaussian() * 0.2, - getY() + random.nextGaussian() * 0.5 + 1, getZ() + random.nextGaussian() * 0.2, 0, 0, 0); + level.addParticle(ParticleTypes.ASH, + getX() + random.nextGaussian() * 0.2, + getY() + random.nextGaussian() * 0.5 + 1, + getZ() + random.nextGaussian() * 0.2, + 0, 0, 0); + level.addParticle(ParticleTypes.SMOKE, + getX() + random.nextGaussian() * 0.2, + getY() + random.nextGaussian() * 0.5 + 1, + getZ() + random.nextGaussian() * 0.2, + 0, 0, 0); + level.addParticle(ParticleTypes.ENTITY_EFFECT, + getX() + random.nextGaussian() * 0.2, + getY() + random.nextGaussian() * 0.5 + 1, + getZ() + random.nextGaussian() * 0.2, + 0, 0, 0); } - + @Override protected SoundEvent getAmbientSound() { return EndSounds.ENTITY_SHADOW_WALKER; @@ -76,51 +87,47 @@ public class ShadowWalkerEntity extends HostileEntity { } @Override - protected void playStepSound(BlockPos pos, BlockState state) { - } - + protected void playStepSound(BlockPos pos, BlockState state) {} + @Override protected float getSoundVolume() { return MHelper.randRange(0.25F, 0.5F, random); } - + @Override - protected float getSoundPitch() { + protected float getVoicePitch() { return MHelper.randRange(0.75F, 1.25F, random); } - + @Override - public boolean tryAttack(Entity target) { - boolean attack = super.tryAttack(target); + public boolean doHurtTarget(Entity target) { + boolean attack = super.doHurtTarget(target); if (attack && target instanceof LivingEntity) { LivingEntity living = (LivingEntity) target; - if (!(living.hasMobEffect(MobEffects.BLINDNESS))) { - living.addMobEffect(new MobEffectInstance(MobEffects.BLINDNESS, 60)); + if (!(living.hasEffect(MobEffects.BLINDNESS))) { + living.addEffect(new MobEffectInstance(MobEffects.BLINDNESS, 60)); } } return attack; } - - public static boolean canSpawn(EntityType type, ServerLevelAccessor world, - SpawnReason spawnReason, BlockPos pos, Random random) { - if (HostileEntity.canSpawnInDark(type, world, spawnReason, pos, random)) { - Box box = new Box(pos).expand(16); - List entities = world.getEntitiesByClass(ShadowWalkerEntity.class, box, (entity) -> { - return true; - }); + + public static boolean canSpawn(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { + if (Monster.checkMonsterSpawnRules(type, world, spawnReason, pos, random)) { + AABB box = new AABB(pos).inflate(16); + List entities = world.getEntitiesOfClass(ShadowWalkerEntity.class, box, (entity) -> { return true; }); return entities.size() < 6; } return false; } - + private final class AttackGoal extends MeleeAttackGoal { private final ShadowWalkerEntity walker; private int ticks; public AttackGoal(ShadowWalkerEntity walker, double speed, boolean pauseWhenMobIdle) { - super(walker, speed, pauseWhenMobIdle); - this.walker = walker; - } + super(walker, speed, pauseWhenMobIdle); + this.walker = walker; + } public void start() { super.start(); @@ -129,16 +136,17 @@ public class ShadowWalkerEntity extends HostileEntity { public void stop() { super.stop(); - this.walker.setAttacking(false); + this.walker.setAggressive(false); } public void tick() { super.tick(); ++this.ticks; - if (this.ticks >= 5 && this.method_28348() < this.method_28349() / 2) { - this.walker.setAttacking(true); - } else { - this.walker.setAttacking(false); + if (this.ticks >= 5 && this.getTicksUntilNextAttack() < this.getAttackInterval() / 2) { + this.walker.setAggressive(true); + } + else { + this.walker.setAggressive(false); } } } diff --git a/src/main/java/ru/betterend/entity/SilkMothEntity.java b/src/main/java/ru/betterend/entity/SilkMothEntity.java index 967f496c..a88a78e8 100644 --- a/src/main/java/ru/betterend/entity/SilkMothEntity.java +++ b/src/main/java/ru/betterend/entity/SilkMothEntity.java @@ -5,46 +5,45 @@ import java.util.List; import java.util.Random; import org.jetbrains.annotations.Nullable; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.AgableMob; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.Flutterer; -import net.minecraft.world.entity.ItemEntity; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.SpawnReason; -import net.minecraft.world.entity.ai.TargetFinder; -import net.minecraft.world.entity.ai.control.FlightMoveControl; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.control.FlyingMoveControl; import net.minecraft.world.entity.ai.control.LookControl; -import net.minecraft.world.entity.ai.goal.AnimalMateGoal; +import net.minecraft.world.entity.ai.goal.BreedGoal; +import net.minecraft.world.entity.ai.goal.FloatGoal; import net.minecraft.world.entity.ai.goal.FollowParentGoal; import net.minecraft.world.entity.ai.goal.Goal; -import net.minecraft.world.entity.ai.goal.SwimGoal; -import net.minecraft.world.entity.ai.pathing.BirdNavigation; -import net.minecraft.world.entity.ai.pathing.EntityNavigation; -import net.minecraft.world.entity.ai.pathing.PathNodeType; -import net.minecraft.world.entity.attribute.DefaultAttributeContainer; -import net.minecraft.world.entity.attribute.Attributes; -import net.minecraft.world.entity.damage.DamageSource; -import net.minecraft.world.entity.mob.MobEntity; -import net.minecraft.world.entity.passive.AnimalEntity; -import net.minecraft.world.entity.passive.PassiveEntity; +import net.minecraft.world.entity.ai.navigation.FlyingPathNavigation; +import net.minecraft.world.entity.ai.navigation.PathNavigation; +import net.minecraft.world.entity.ai.util.RandomPos; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.animal.FlyingAnimal; +import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.item.ItemStack; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtHelper; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.sounds.SoundSource; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.state.property.Properties; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.BlockPos; -import net.minecraft.world.phys.AABB; -import net.minecraft.util.math.Vec3d; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceKey; -import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.pathfinder.BlockPathTypes; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; import ru.betterend.BetterEnd; import ru.betterend.blocks.BlockProperties; import ru.betterend.entity.SilkMothEntity.MothLookControl; @@ -56,77 +55,80 @@ import ru.betterend.registry.EndItems; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; -public class SilkMothEntity extends AnimalEntity implements Flutterer { +public class SilkMothEntity extends Animal implements FlyingAnimal { private BlockPos hivePos; private BlockPos entrance; private Level hiveWorld; - + public SilkMothEntity(EntityType entityType, Level world) { super(entityType, world); - this.moveControl = new FlightMoveControl(this, 20, true); + this.moveControl = new FlyingMoveControl(this, 20, true); this.lookControl = new MothLookControl(this); - this.setPathfindingPenalty(PathNodeType.WATER, -1.0F); - this.setPathfindingPenalty(PathNodeType.DANGER_FIRE, -1.0F); - this.experiencePoints = 1; + this.setPathfindingMalus(BlockPathTypes.WATER, -1.0F); + this.setPathfindingMalus(BlockPathTypes.DANGER_FIRE, -1.0F); + this.xpReward = 1; } - - public static DefaultAttributeContainer.Builder createMobAttributes() { - return LivingEntity.createLivingAttributes().add(Attributes.MAX_HEALTH, 2.0D) - .add(Attributes.FOLLOW_RANGE, 16.0D).add(Attributes.FLYING_SPEED, 0.4D) + + public static AttributeSupplier.Builder createMobAttributes() { + return LivingEntity.createLivingAttributes() + .add(Attributes.MAX_HEALTH, 2.0D) + .add(Attributes.FOLLOW_RANGE, 16.0D) + .add(Attributes.FLYING_SPEED, 0.4D) .add(Attributes.MOVEMENT_SPEED, 0.1D); } - + public void setHive(Level world, BlockPos hive) { this.hivePos = hive; this.hiveWorld = world; } - + @Override - public void writeCustomDataToTag(CompoundTag tag) { + public void addAdditionalSaveData(CompoundTag tag) { if (hivePos != null) { - tag.put("HivePos", NbtHelper.fromBlockPos(hivePos)); + tag.put("HivePos", NbtUtils.writeBlockPos(hivePos)); tag.putString("HiveWorld", hiveWorld.dimension().location().toString()); } } - + @Override - public void readCustomDataFromTag(CompoundTag tag) { + public void readAdditionalSaveData(CompoundTag tag) { if (tag.contains("HivePos")) { - hivePos = NbtHelper.toBlockPos(tag.getCompound("HivePos")); + hivePos = NbtUtils.readBlockPos(tag.getCompound("HivePos")); ResourceLocation worldID = new ResourceLocation(tag.getString("HiveWorld")); try { - hiveWorld = world.getServer().getLevel(ResourceKey.of(Registry.DIMENSION, worldID)); - } catch (Exception e) { - BetterEnd.LOGGER.warning("Silk Moth Hive Level {} is missing!", worldID); + hiveWorld = level.getServer().getLevel(ResourceKey.create(Registry.DIMENSION_REGISTRY, worldID)); + } + catch (Exception e) { + BetterEnd.LOGGER.warning("Silk Moth Hive World {} is missing!", worldID); hivePos = null; } } } @Override - protected void initGoals() { - this.goalSelector.add(1, new ReturnToHiveGoal()); - this.goalSelector.add(2, new AnimalMateGoal(this, 1.0D)); - this.goalSelector.add(5, new FollowParentGoal(this, 1.25D)); - this.goalSelector.add(8, new WanderAroundGoal()); - this.goalSelector.add(9, new SwimGoal(this)); + protected void registerGoals() { + this.goalSelector.addGoal(1, new ReturnToHiveGoal()); + this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); + this.goalSelector.addGoal(5, new FollowParentGoal(this, 1.25D)); + this.goalSelector.addGoal(8, new WanderAroundGoal()); + this.goalSelector.addGoal(9, new FloatGoal(this)); } - + @Override - protected EntityNavigation createNavigation(Level world) { - BirdNavigation birdNavigation = new BirdNavigation(this, world) { - public boolean isValidPosition(BlockPos pos) { - BlockState state = this.world.getBlockState(pos); - return state.isAir() || !state.getMaterial().blocksMovement(); + protected PathNavigation createNavigation(Level world) { + FlyingPathNavigation birdNavigation = new FlyingPathNavigation(this, world) { + public boolean isStableDestination(BlockPos pos) { + BlockState state = this.level.getBlockState(pos); + return state.isAir() || !state.getMaterial().blocksMotion(); } public void tick() { super.tick(); } }; - birdNavigation.setCanPathThroughDoors(false); - birdNavigation.setCanSwim(false); - birdNavigation.setCanEnterOpenDoors(true); + birdNavigation.setCanOpenDoors(false); + birdNavigation.setCanFloat(false); + birdNavigation.setCanPassDoors(true); return birdNavigation; } @@ -136,36 +138,36 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { } @Override - protected boolean hasWings() { + protected boolean makeFlySound() { return true; } @Override - public boolean handleFallDamage(float fallDistance, float damageMultiplier) { + public boolean causeFallDamage(float fallDistance, float damageMultiplier) { return false; } @Override - public boolean canClimb() { + public boolean isMovementNoisy() { return false; } @Override - public boolean hasNoGravity() { + public boolean isNoGravity() { return true; } @Override - public PassiveEntity createChild(ServerLevel world, PassiveEntity entity) { + public AgableMob getBreedOffspring(ServerLevel world, AgableMob entity) { return EndEntities.SILK_MOTH.create(world); } - + @Override - protected void dropLoot(DamageSource source, boolean causedByPlayer) { + protected void dropFromLootTable(DamageSource source, boolean causedByPlayer) { int minCount = 0; int maxCount = 1; - if (causedByPlayer && this.attackingPlayer != null) { - int looting = EnchantmentHelper.getLooting(this.attackingPlayer); + if (causedByPlayer && this.lastHurtByPlayer != null) { + int looting = EnchantmentHelper.getMobLooting(this.lastHurtByPlayer); minCount += looting; maxCount += looting; if (maxCount > 2) { @@ -173,111 +175,104 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { } } int count = minCount < maxCount ? MHelper.randRange(minCount, maxCount, random) : maxCount; - ItemEntity drop = new ItemEntity(world, getX(), getY(), getZ(), new ItemStack(EndItems.SILK_FIBER, count)); - this.world.spawnEntity(drop); + ItemEntity drop = new ItemEntity(level, getX(), getY(), getZ(), new ItemStack(EndItems.SILK_FIBER, count)); + this.level.addFreshEntity(drop); } - - public static boolean canSpawn(EntityType type, ServerLevelAccessor world, SpawnReason spawnReason, - BlockPos pos, Random random) { - int y = world.getChunk(pos).sampleHeightmap(Type.WORLD_SURFACE, pos.getX() & 15, pos.getY() & 15); + + public static boolean canSpawn(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { + int y = world.getChunk(pos).getHeight(Types.WORLD_SURFACE, pos.getX() & 15, pos.getY() & 15); return y > 0 && pos.getY() >= y && notManyEntities(world, pos, 32, 1); } - + private static boolean notManyEntities(ServerLevelAccessor world, BlockPos pos, int radius, int maxCount) { - Box box = new Box(pos).expand(radius); - List list = world.getEntitiesByClass(SilkMothEntity.class, box, (entity) -> true); + AABB box = new AABB(pos).inflate(radius); + List list = world.getEntitiesOfClass(SilkMothEntity.class, box, (entity) -> true); return list.size() <= maxCount; } - + class MothLookControl extends LookControl { - MothLookControl(MobEntity entity) { + MothLookControl(Mob entity) { super(entity); } - protected boolean shouldStayHorizontal() { + protected boolean resetXRotOnTick() { return true; } } class WanderAroundGoal extends Goal { WanderAroundGoal() { - this.setControls(EnumSet.of(Goal.Control.MOVE)); + this.setFlags(EnumSet.of(Goal.Flag.MOVE)); } @Override - public boolean canStart() { - return SilkMothEntity.this.navigation.isIdle() && SilkMothEntity.this.random.nextInt(10) == 0; + public boolean canUse() { + return SilkMothEntity.this.navigation.isDone() && SilkMothEntity.this.random.nextInt(10) == 0; } @Override - public boolean shouldContinue() { - return SilkMothEntity.this.navigation.isFollowingPath(); + public boolean canContinueToUse() { + return SilkMothEntity.this.navigation.isInProgress(); } @Override public void start() { - Vec3d vec3d = null; - if (SilkMothEntity.this.hivePos != null && SilkMothEntity.this.hiveWorld == SilkMothEntity.this.world) { - if (SilkMothEntity.this.getPos().squaredDistanceTo(SilkMothEntity.this.hivePos.getX(), - SilkMothEntity.this.hivePos.getY(), SilkMothEntity.this.hivePos.getZ()) > 16) { - vec3d = SilkMothEntity.this.getPos().add(random.nextGaussian() * 2, 0, random.nextGaussian() * 2); + Vec3 vec3d = null; + if (SilkMothEntity.this.hivePos != null && SilkMothEntity.this.hiveWorld == SilkMothEntity.this.level) { + if (SilkMothEntity.this.position().distanceToSqr(SilkMothEntity.this.hivePos.getX(), SilkMothEntity.this.hivePos.getY(), SilkMothEntity.this.hivePos.getZ()) > 16) { + vec3d = SilkMothEntity.this.position().add(random.nextGaussian() * 2, 0, random.nextGaussian() * 2); } } vec3d = vec3d == null ? this.getRandomLocation() : vec3d; if (vec3d != null) { try { - SilkMothEntity.this.navigation - .startMovingAlong(SilkMothEntity.this.navigation.findPathTo(new BlockPos(vec3d), 1), 1.0D); - } catch (Exception e) { + SilkMothEntity.this.navigation.moveTo(SilkMothEntity.this.navigation.createPath(new BlockPos(vec3d), 1), 1.0D); } + catch (Exception e) {} } } @Nullable - private Vec3d getRandomLocation() { - Vec3d vec3d3 = SilkMothEntity.this.getRotationVec(0.0F); - Vec3d vec3d4 = TargetFinder.findAirTarget(SilkMothEntity.this, 8, 7, vec3d3, 1.5707964F, 2, 1); - return vec3d4 != null ? vec3d4 - : TargetFinder.findGroundTarget(SilkMothEntity.this, 8, 4, -2, vec3d3, 1.5707963705062866D); + private Vec3 getRandomLocation() { + Vec3 vec3d3 = SilkMothEntity.this.getViewVector(0.0F); + Vec3 vec3d4 = RandomPos.getAboveLandPos(SilkMothEntity.this, 8, 7, vec3d3, 1.5707964F, 2, 1); + return vec3d4 != null ? vec3d4 : RandomPos.getAirPos(SilkMothEntity.this, 8, 4, -2, vec3d3, 1.5707963705062866D); } } - + class ReturnToHiveGoal extends Goal { ReturnToHiveGoal() { - this.setControls(EnumSet.of(Goal.Control.MOVE)); + this.setFlags(EnumSet.of(Goal.Flag.MOVE)); } - + @Override - public boolean canStart() { - return SilkMothEntity.this.hivePos != null && SilkMothEntity.this.hiveWorld == SilkMothEntity.this.world - && SilkMothEntity.this.navigation.isIdle() && SilkMothEntity.this.random.nextInt(16) == 0 - && SilkMothEntity.this.getPos().squaredDistanceTo(SilkMothEntity.this.hivePos.getX(), - SilkMothEntity.this.hivePos.getY(), SilkMothEntity.this.hivePos.getZ()) < 64; + public boolean canUse() { + return SilkMothEntity.this.hivePos != null + && SilkMothEntity.this.hiveWorld == SilkMothEntity.this.level + && SilkMothEntity.this.navigation.isDone() + && SilkMothEntity.this.random.nextInt(16) == 0 + && SilkMothEntity.this.position().distanceToSqr(SilkMothEntity.this.hivePos.getX(), SilkMothEntity.this.hivePos.getY(), SilkMothEntity.this.hivePos.getZ()) < 64; } - + @Override - public boolean shouldContinue() { - return SilkMothEntity.this.navigation.isFollowingPath() && world.getBlockState(entrance).isAir() - && (world.getBlockState(hivePos).is(EndBlocks.SILK_MOTH_NEST) - || world.getBlockState(hivePos).is(EndBlocks.SILK_MOTH_HIVE)); + public boolean canContinueToUse() { + return SilkMothEntity.this.navigation.isInProgress() && level.getBlockState(entrance).isAir() && (level.getBlockState(hivePos).is(EndBlocks.SILK_MOTH_NEST) || level.getBlockState(hivePos).is(EndBlocks.SILK_MOTH_HIVE)); } - + @Override public void start() { - BlockState state = SilkMothEntity.this.world.getBlockState(SilkMothEntity.this.hivePos); + BlockState state = SilkMothEntity.this.level.getBlockState(SilkMothEntity.this.hivePos); if (!state.is(EndBlocks.SILK_MOTH_NEST) && !state.is(EndBlocks.SILK_MOTH_HIVE)) { SilkMothEntity.this.hivePos = null; return; } try { - SilkMothEntity.this.entrance = SilkMothEntity.this.hivePos - .offset(state.getValue(Properties.HORIZONTAL_FACING)); - SilkMothEntity.this.navigation.startMovingAlong(SilkMothEntity.this.navigation.findPathTo(entrance, 1), - 1.0D); - } catch (Exception e) { + SilkMothEntity.this.entrance = SilkMothEntity.this.hivePos.relative(state.getValue(BlockStateProperties.HORIZONTAL_FACING)); + SilkMothEntity.this.navigation.moveTo(SilkMothEntity.this.navigation.createPath(entrance, 1), 1.0D); } + catch (Exception e) {} } - + @Override public void tick() { super.tick(); @@ -288,7 +283,7 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { double dy = Math.abs(SilkMothEntity.this.entrance.getY() - SilkMothEntity.this.getY()); double dz = Math.abs(SilkMothEntity.this.entrance.getZ() - SilkMothEntity.this.getZ()); if (dx + dy + dz < 1) { - BlockState state = SilkMothEntity.this.world.getBlockState(hivePos); + BlockState state = SilkMothEntity.this.level.getBlockState(hivePos); if (state.is(EndBlocks.SILK_MOTH_NEST) || state.is(EndBlocks.SILK_MOTH_HIVE)) { int fullness = state.getValue(BlockProperties.FULLNESS); boolean isHive = state.is(EndBlocks.SILK_MOTH_HIVE); @@ -297,13 +292,12 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { if (fullness > 3) { fullness = 3; } - BlocksHelper.setWithUpdate(SilkMothEntity.this.hiveWorld, SilkMothEntity.this.hivePos, - state.with(BlockProperties.FULLNESS, fullness)); + BlocksHelper.setWithUpdate(SilkMothEntity.this.hiveWorld, SilkMothEntity.this.hivePos, state.setValue(BlockProperties.FULLNESS, fullness)); } - SilkMothEntity.this.world.playLocalSound(null, SilkMothEntity.this.entrance, - SoundEvents.BLOCK_BEEHIVE_ENTER, SoundSource.BLOCKS, 1, 1); + SilkMothEntity.this.level.playSound(null, SilkMothEntity.this.entrance, SoundEvents.BEEHIVE_ENTER, SoundSource.BLOCKS, 1, 1); SilkMothEntity.this.remove(); - } else { + } + else { SilkMothEntity.this.hivePos = null; } } diff --git a/src/main/java/ru/betterend/entity/model/BlockBenchModel.java b/src/main/java/ru/betterend/entity/model/BlockBenchModel.java index 052ade1b..de949560 100644 --- a/src/main/java/ru/betterend/entity/model/BlockBenchModel.java +++ b/src/main/java/ru/betterend/entity/model/BlockBenchModel.java @@ -1,25 +1,24 @@ package ru.betterend.entity.model; import java.util.function.Function; - -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.entity.model.EntityModel; -import net.minecraft.world.entity.Entity; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.RenderType; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; public abstract class BlockBenchModel extends EntityModel { public BlockBenchModel() { super(); } - - public BlockBenchModel(Function function) { + + public BlockBenchModel(Function function) { super(function); } - + protected void setRotationAngle(ModelPart modelRenderer, float x, float y, float z) { - modelRenderer.pitch = x; - modelRenderer.yaw = y; - modelRenderer.roll = z; + modelRenderer.xRot = x; + modelRenderer.yRot = y; + modelRenderer.zRot = z; } } diff --git a/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java b/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java index 97187ee1..68d9021b 100644 --- a/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java @@ -1,9 +1,9 @@ package ru.betterend.entity.model; -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.util.math.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.RenderType; import net.minecraft.util.Mth; import ru.betterend.entity.CubozoaEntity; @@ -22,81 +22,82 @@ public class CubozoaEntityModel extends BlockBenchModel { private float scaleXZ; public CubozoaEntityModel() { - super(RenderLayer::getEntityTranslucent); - - textureWidth = 48; - textureHeight = 48; - + super(RenderType::entityTranslucent); + + texWidth = 48; + texHeight = 48; + model = new ModelPart(this); - model.setPivot(0.0F, 24.0F, 0.0F); - model.setTextureOffset(0, 17).addCuboid(-2.0F, -12.5F, -2.0F, 4.0F, 4.0F, 4.0F, 0.0F); + model.setPos(0.0F, 24.0F, 0.0F); + model.texOffs(0, 17).addBox(-2.0F, -12.5F, -2.0F, 4.0F, 4.0F, 4.0F, 0.0F); main_cube_r1 = new ModelPart(this); - main_cube_r1.setPivot(0.0F, -14.0F, 0.0F); + main_cube_r1.setPos(0.0F, -14.0F, 0.0F); model.addChild(main_cube_r1); setRotationAngle(main_cube_r1, 0.0F, 0.0F, -3.1416F); - main_cube_r1.setTextureOffset(0, 0).addCuboid(-5.0F, -7.0F, -5.0F, 10.0F, 7.0F, 10.0F, 0.0F); + main_cube_r1.texOffs(0, 0).addBox(-5.0F, -7.0F, -5.0F, 10.0F, 7.0F, 10.0F, 0.0F); tentacle_center_1 = new ModelPart(this); - tentacle_center_1.setPivot(0.0F, 0.0F, 0.0F); + tentacle_center_1.setPos(0.0F, 0.0F, 0.0F); model.addChild(tentacle_center_1); + tentacle_1 = new ModelPart(this); - tentacle_1.setPivot(0.0F, -7.0F, 4.5F); + tentacle_1.setPos(0.0F, -7.0F, 4.5F); tentacle_center_1.addChild(tentacle_1); - tentacle_1.setTextureOffset(16, 17).addCuboid(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F); + tentacle_1.texOffs(16, 17).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F); tentacle_center_2 = new ModelPart(this); - tentacle_center_2.setPivot(0.0F, 0.0F, 0.0F); + tentacle_center_2.setPos(0.0F, 0.0F, 0.0F); model.addChild(tentacle_center_2); setRotationAngle(tentacle_center_2, 0.0F, -1.5708F, 0.0F); + tentacle_2 = new ModelPart(this); - tentacle_2.setPivot(0.0F, -7.0F, 4.5F); + tentacle_2.setPos(0.0F, -7.0F, 4.5F); tentacle_center_2.addChild(tentacle_2); - tentacle_2.setTextureOffset(16, 17).addCuboid(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F); + tentacle_2.texOffs(16, 17).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F); tentacle_center_3 = new ModelPart(this); - tentacle_center_3.setPivot(0.0F, 0.0F, 0.0F); + tentacle_center_3.setPos(0.0F, 0.0F, 0.0F); model.addChild(tentacle_center_3); setRotationAngle(tentacle_center_3, 0.0F, 3.1416F, 0.0F); + tentacle_3 = new ModelPart(this); - tentacle_3.setPivot(0.0F, -7.0F, 4.5F); + tentacle_3.setPos(0.0F, -7.0F, 4.5F); tentacle_center_3.addChild(tentacle_3); - tentacle_3.setTextureOffset(16, 17).addCuboid(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F); + tentacle_3.texOffs(16, 17).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F); tentacle_center_4 = new ModelPart(this); - tentacle_center_4.setPivot(0.0F, 0.0F, 0.0F); + tentacle_center_4.setPos(0.0F, 0.0F, 0.0F); model.addChild(tentacle_center_4); setRotationAngle(tentacle_center_4, 0.0F, 1.5708F, 0.0F); + tentacle_4 = new ModelPart(this); - tentacle_4.setPivot(0.0F, -7.0F, 4.5F); + tentacle_4.setPos(0.0F, -7.0F, 4.5F); tentacle_center_4.addChild(tentacle_4); - tentacle_4.setTextureOffset(16, 17).addCuboid(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F); + tentacle_4.texOffs(16, 17).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F); } - + @Override - public void setAngles(CubozoaEntity entity, float limbAngle, float limbDistance, float animationProgress, - float headYaw, float headPitch) { + public void setupAnim(CubozoaEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { float sin = Mth.sin(animationProgress * 0.13F); scaleY = sin * 0.1F + 0.9F; scaleXZ = Mth.sin(animationProgress * 0.13F + 3.14F) * 0.1F + 0.9F; - - tentacle_1.pitch = sin * 0.15F; - tentacle_2.pitch = sin * 0.15F; - tentacle_3.pitch = sin * 0.15F; - tentacle_4.pitch = sin * 0.15F; + + tentacle_1.xRot = sin * 0.15F; + tentacle_2.xRot = sin * 0.15F; + tentacle_3.xRot = sin * 0.15F; + tentacle_4.xRot = sin * 0.15F; } @Override - public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, - float blue, float alpha) { - matrices.push(); + public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { + matrices.pushPose(); matrices.scale(scaleXZ, scaleY, scaleXZ); model.render(matrices, vertices, light, overlay); - matrices.pop(); + matrices.popPose(); } - } diff --git a/src/main/java/ru/betterend/entity/model/DragonflyEntityModel.java b/src/main/java/ru/betterend/entity/model/DragonflyEntityModel.java index 47acf4a6..08b04474 100644 --- a/src/main/java/ru/betterend/entity/model/DragonflyEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/DragonflyEntityModel.java @@ -1,9 +1,9 @@ package ru.betterend.entity.model; -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.util.math.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.RenderType; import ru.betterend.entity.DragonflyEntity; public class DragonflyEntityModel extends BlockBenchModel { @@ -19,86 +19,87 @@ public class DragonflyEntityModel extends BlockBenchModel { private final ModelPart legs_2; public DragonflyEntityModel() { - super(RenderLayer::getEntityCutout); - - textureWidth = 64; - textureHeight = 64; + super(RenderType::entityCutout); + + texWidth = 64; + texHeight = 64; model = new ModelPart(this); - model.setPivot(2.0F, 21.5F, -4.0F); - model.setTextureOffset(0, 0).addCuboid(-4.0F, -4.0F, 0.0F, 4.0F, 4.0F, 9.0F, 0.0F); + model.setPos(2.0F, 21.5F, -4.0F); + model.texOffs(0, 0).addBox(-4.0F, -4.0F, 0.0F, 4.0F, 4.0F, 9.0F, 0.0F); head = new ModelPart(this); - head.setPivot(-2.0F, -2.0F, 0.0F); + head.setPos(-2.0F, -2.0F, 0.0F); model.addChild(head); setRotationAngle(head, 0.3491F, 0.0F, 0.0F); - head.setTextureOffset(17, 0).addCuboid(-1.5F, -1.5F, -2.5F, 3.0F, 3.0F, 3.0F, 0.0F); + head.texOffs(17, 0).addBox(-1.5F, -1.5F, -2.5F, 3.0F, 3.0F, 3.0F, 0.0F); tail = new ModelPart(this); - tail.setPivot(-2.0F, -2.0F, 9.0F); + tail.setPos(-2.0F, -2.0F, 9.0F); model.addChild(tail); - tail.setTextureOffset(26, 0).addCuboid(-1.5F, -1.5F, 0.0F, 3.0F, 3.0F, 7.0F, 0.0F); + tail.texOffs(26, 0).addBox(-1.5F, -1.5F, 0.0F, 3.0F, 3.0F, 7.0F, 0.0F); tail_2 = new ModelPart(this); - tail_2.setPivot(0.0F, 0.0F, 7.0F); + tail_2.setPos(0.0F, 0.0F, 7.0F); tail.addChild(tail_2); - tail_2.setTextureOffset(36, 0).addCuboid(-1.0F, -1.0F, 0.0F, 2.0F, 2.0F, 10.0F, 0.0F); + tail_2.texOffs(36, 0).addBox(-1.0F, -1.0F, 0.0F, 2.0F, 2.0F, 10.0F, 0.0F); wing_1 = new ModelPart(this); - wing_1.setPivot(-2.0F, -4.0F, 4.0F); + wing_1.setPos(-2.0F, -4.0F, 4.0F); model.addChild(wing_1); - wing_1.setTextureOffset(0, 13).addCuboid(-15.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F); + wing_1.texOffs(0, 13).addBox(-15.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F); wing_2 = new ModelPart(this); - wing_2.setPivot(-2.0F, -4.0F, 4.0F); + wing_2.setPos(-2.0F, -4.0F, 4.0F); model.addChild(wing_2); wing_2.mirror = true; - wing_2.setTextureOffset(0, 13).addCuboid(0.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F); + wing_2.texOffs(0, 13).addBox(0.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F); wing_3 = new ModelPart(this); - wing_3.setPivot(-2.0F, -4.0F, 8.0F); + wing_3.setPos(-2.0F, -4.0F, 8.0F); model.addChild(wing_3); - wing_3.setTextureOffset(4, 17).addCuboid(-12.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.0F); + wing_3.texOffs(4, 17).addBox(-12.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.0F); wing_4 = new ModelPart(this); - wing_4.setPivot(-2.0F, -4.0F, 8.0F); + wing_4.setPos(-2.0F, -4.0F, 8.0F); model.addChild(wing_4); wing_4.mirror = true; - wing_4.setTextureOffset(4, 17).addCuboid(0.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.0F); + wing_4.texOffs(4, 17).addBox(0.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.0F); legs_1 = new ModelPart(this); - legs_1.setPivot(-1.0F, 0.0F, 1.0F); + legs_1.setPos(-1.0F, 0.0F, 1.0F); model.addChild(legs_1); setRotationAngle(legs_1, 0.0F, 0.0F, -0.5236F); - legs_1.setTextureOffset(50, 1).addCuboid(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F); + legs_1.texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F); legs_2 = new ModelPart(this); - legs_2.setPivot(-3.0F, 0.0F, 1.0F); + legs_2.setPos(-3.0F, 0.0F, 1.0F); model.addChild(legs_2); setRotationAngle(legs_2, 0.0F, 0.0F, 0.5236F); - legs_2.setTextureOffset(50, 1).addCuboid(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F); + legs_2.texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F); } - @Override - public void setAngles(DragonflyEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { + public void setupAnim(DragonflyEntity entity, float limbAngle, float limbDistance, float animationProgress, + float headYaw, float headPitch) { float progress = animationProgress * 2F; - - wing_1.roll = 0.3491F + (float) Math.sin(progress) * 0.3491F; - wing_2.roll = -wing_1.roll; - - wing_3.roll = 0.3491F + (float) Math.cos(progress) * 0.3491F; - wing_4.roll = -wing_3.roll; - + + wing_1.zRot = 0.3491F + (float) Math.sin(progress) * 0.3491F; + wing_2.zRot = -wing_1.zRot; + + wing_3.zRot = 0.3491F + (float) Math.cos(progress) * 0.3491F; + wing_4.zRot = -wing_3.zRot; + progress = animationProgress * 0.05F; - - head.pitch = 0.3491F + (float) Math.sin(progress * 0.7F) * 0.1F; - tail.pitch = (float) Math.cos(progress) * 0.05F - 0.05F; - tail_2.pitch = -tail.pitch * 1.5F; + + head.xRot = 0.3491F + (float) Math.sin(progress * 0.7F) * 0.1F; + tail.xRot = (float) Math.cos(progress) * 0.05F - 0.05F; + tail_2.xRot = -tail.xRot * 1.5F; } @Override - public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { + public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, + float green, float blue, float alpha) { model.render(matrices, vertices, light, overlay); } } diff --git a/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java b/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java index c2a75cec..20357336 100644 --- a/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java @@ -1,9 +1,9 @@ package ru.betterend.entity.model; -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.util.math.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.RenderType; import ru.betterend.entity.EndFishEntity; public class EndFishEntityModel extends BlockBenchModel { @@ -15,60 +15,61 @@ public class EndFishEntityModel extends BlockBenchModel { private final ModelPart fin_left; public EndFishEntityModel() { - super(RenderLayer::getEntityCutout); - - textureWidth = 32; - textureHeight = 32; + super(RenderType::entityCutout); + + texWidth = 32; + texHeight = 32; model = new ModelPart(this); - model.setPivot(0.0F, 20.0F, 0.0F); - model.setTextureOffset(0, 0).addCuboid(-1.0F, -2.0F, -4.0F, 2.0F, 4.0F, 8.0F, 0.0F); + model.setPos(0.0F, 20.0F, 0.0F); + model.texOffs(0, 0).addBox(-1.0F, -2.0F, -4.0F, 2.0F, 4.0F, 8.0F, 0.0F); fin_top = new ModelPart(this); - fin_top.setPivot(0.0F, -2.0F, -4.0F); + fin_top.setPos(0.0F, -2.0F, -4.0F); model.addChild(fin_top); setRotationAngle(fin_top, -0.6981F, 0.0F, 0.0F); - fin_top.setTextureOffset(0, 6).addCuboid(0.0F, -8.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F); + fin_top.texOffs(0, 6).addBox(0.0F, -8.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F); fin_bottom = new ModelPart(this); - fin_bottom.setPivot(0.0F, 2.0F, -4.0F); + fin_bottom.setPos(0.0F, 2.0F, -4.0F); model.addChild(fin_bottom); setRotationAngle(fin_bottom, 0.6981F, 0.0F, 0.0F); - fin_bottom.setTextureOffset(0, 6).addCuboid(0.0F, 0.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F); + fin_bottom.texOffs(0, 6).addBox(0.0F, 0.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F); flipper = new ModelPart(this); - flipper.setPivot(0.0F, 0.0F, 2.0F); + flipper.setPos(0.0F, 0.0F, 2.0F); model.addChild(flipper); setRotationAngle(flipper, -0.7854F, 0.0F, 0.0F); - flipper.setTextureOffset(0, 15).addCuboid(0.0F, -5.0F, 0.0F, 0.0F, 5.0F, 5.0F, 0.0F); + flipper.texOffs(0, 15).addBox(0.0F, -5.0F, 0.0F, 0.0F, 5.0F, 5.0F, 0.0F); fin_right = new ModelPart(this); - fin_right.setPivot(-1.0F, 0.0F, -1.0F); + fin_right.setPos(-1.0F, 0.0F, -1.0F); model.addChild(fin_right); setRotationAngle(fin_right, 1.5708F, 0.7854F, 0.0F); - fin_right.setTextureOffset(0, 25).addCuboid(-3.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F); + fin_right.texOffs(0, 25).addBox(-3.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F); fin_left = new ModelPart(this); - fin_left.setPivot(1.0F, 0.0F, -1.0F); + fin_left.setPos(1.0F, 0.0F, -1.0F); model.addChild(fin_left); setRotationAngle(fin_left, 1.5708F, -0.7854F, 0.0F); - fin_left.setTextureOffset(0, 25).addCuboid(0.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F, true); + fin_left.texOffs(0, 25).addBox(0.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F, true); } - @Override - public void setAngles(EndFishEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { + public void setupAnim(EndFishEntity entity, float limbAngle, float limbDistance, float animationProgress, + float headYaw, float headPitch) { float s1 = (float) Math.sin(animationProgress * 0.1); float s2 = (float) Math.sin(animationProgress * 0.05); - flipper.yaw = s1 * 0.3F; - fin_top.pitch = s2 * 0.02F - 0.6981F; - fin_bottom.pitch = 0.6981F - s2 * 0.02F; - fin_left.yaw = s1 * 0.3F - 0.7854F; - fin_right.yaw = 0.7854F - s1 * 0.3F; + flipper.yRot = s1 * 0.3F; + fin_top.xRot = s2 * 0.02F - 0.6981F; + fin_bottom.xRot = 0.6981F - s2 * 0.02F; + fin_left.yRot = s1 * 0.3F - 0.7854F; + fin_right.yRot = 0.7854F - s1 * 0.3F; } @Override - public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { + public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, + float green, float blue, float alpha) { model.render(matrices, vertices, light, overlay); } } diff --git a/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java index 6725e790..2f07e710 100644 --- a/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java @@ -1,26 +1,25 @@ package ru.betterend.entity.model; import com.google.common.collect.ImmutableList; - -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.entity.model.CompositeEntityModel; -import net.minecraft.client.util.math.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.ListModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.RenderType; import ru.betterend.entity.EndSlimeEntity; import ru.betterend.util.MHelper; -public class EndSlimeEntityModel extends CompositeEntityModel { +public class EndSlimeEntityModel extends ListModel { private final ModelPart flower; private final ModelPart crop; private final ModelPart innerCube; private final ModelPart rightEye; private final ModelPart leftEye; private final ModelPart mouth; - + public EndSlimeEntityModel(boolean onlyShell) { - super(RenderLayer::getEntityCutout); - + super(RenderType::entityCutout); + this.innerCube = new ModelPart(this, 0, 16); this.rightEye = new ModelPart(this, 32, 0); this.leftEye = new ModelPart(this, 32, 4); @@ -29,54 +28,55 @@ public class EndSlimeEntityModel extends CompositeEnti this.crop = new ModelPart(this); if (onlyShell) { - this.innerCube.setTextureOffset(0, 0); - this.innerCube.addCuboid(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F); - } - else { - this.innerCube.addCuboid(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F); - this.rightEye.addCuboid(-3.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); - this.leftEye.addCuboid(1.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); - this.mouth.addCuboid(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.0F); - + this.innerCube.texOffs(0, 0); + this.innerCube.addBox(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F); + } else { + this.innerCube.addBox(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F); + this.rightEye.addBox(-3.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); + this.leftEye.addBox(1.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); + this.mouth.addBox(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.0F); + for (int i = 0; i < 4; i++) { ModelPart petalRot = new ModelPart(this); - petalRot.yaw = MHelper.degreesToRadians(i * 45F); - + petalRot.yRot = MHelper.degreesToRadians(i * 45F); + ModelPart petal = new ModelPart(this, 40, 0); - petal.setPivot(-4, 8, 0); - petal.addCuboid(0.0F, 0.0F, 0.0F, 8.0F, 8.0F, 0.0F, 0.0F); - + petal.setPos(-4, 8, 0); + petal.addBox(0.0F, 0.0F, 0.0F, 8.0F, 8.0F, 0.0F, 0.0F); + this.flower.addChild(petalRot); petalRot.addChild(petal); } - + for (int i = 0; i < 2; i++) { ModelPart petalRot = new ModelPart(this); - petalRot.yaw = MHelper.degreesToRadians(i * 90F + 45F); - + petalRot.yRot = MHelper.degreesToRadians(i * 90F + 45F); + ModelPart petal = new ModelPart(this, 40, 0); - petal.setPivot(-4, 8, 0); - petal.addCuboid(0.0F, 0.0F, 0.0F, 8.0F, 8.0F, 0.0F, 0.0F); - + petal.setPos(-4, 8, 0); + petal.addBox(0.0F, 0.0F, 0.0F, 8.0F, 8.0F, 0.0F, 0.0F); + this.crop.addChild(petalRot); petalRot.addChild(petal); } } } - + @Override - public void setAngles(T entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) {} - - public void renderFlower(MatrixStack matrices, VertexConsumer vertices, int light, int overlay) { + public void setupAnim(T entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, + float headPitch) { + } + + public void renderFlower(PoseStack matrices, VertexConsumer vertices, int light, int overlay) { flower.render(matrices, vertices, light, overlay); } - - public void renderCrop(MatrixStack matrices, VertexConsumer vertices, int light, int overlay) { + + public void renderCrop(PoseStack matrices, VertexConsumer vertices, int light, int overlay) { crop.render(matrices, vertices, light, overlay); } @Override - public Iterable getParts() { + public Iterable parts() { return ImmutableList.of(this.innerCube, this.rightEye, this.leftEye, this.mouth); } } diff --git a/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java b/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java index 21579703..55766a70 100644 --- a/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java @@ -1,9 +1,9 @@ package ru.betterend.entity.model; -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.util.math.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.RenderType; import net.minecraft.util.Mth; import ru.betterend.entity.SilkMothEntity; @@ -25,110 +25,110 @@ public class SilkMothEntityModel extends BlockBenchModel { private final ModelPart abdomen_r1; public SilkMothEntityModel() { - super(RenderLayer::getEntityCutout); + super(RenderType::entityCutout); - textureWidth = 64; - textureHeight = 64; + texWidth = 64; + texHeight = 64; legsL = new ModelPart(this); - legsL.setPivot(1.5F, 19.9F, -0.45F); + legsL.setPos(1.5F, 19.9F, -0.45F); setRotationAngle(legsL, 0.0F, 0.0F, 0.6981F); cube_r1 = new ModelPart(this); - cube_r1.setPivot(0.0F, 0.0F, -1.0F); + cube_r1.setPos(0.0F, 0.0F, -1.0F); legsL.addChild(cube_r1); setRotationAngle(cube_r1, 0.0F, 0.2182F, 0.3927F); - cube_r1.setTextureOffset(0, 13).addCuboid(0.0216F, 0.0F, -0.5976F, 3.0F, 0.0F, 1.0F, 0.0F); + cube_r1.texOffs(0, 13).addBox(0.0216F, 0.0F, -0.5976F, 3.0F, 0.0F, 1.0F, 0.0F); cube_r2 = new ModelPart(this); - cube_r2.setPivot(0.5F, 0.1F, -0.05F); + cube_r2.setPos(0.5F, 0.1F, -0.05F); legsL.addChild(cube_r2); setRotationAngle(cube_r2, 0.0F, 0.0F, 0.3927F); - cube_r2.setTextureOffset(0, 15).addCuboid(0.0F, 0.0F, -0.6F, 3.0F, 0.0F, 1.0F, 0.0F); + cube_r2.texOffs(0, 15).addBox(0.0F, 0.0F, -0.6F, 3.0F, 0.0F, 1.0F, 0.0F); cube_r3 = new ModelPart(this); - cube_r3.setPivot(0.0F, 0.0F, 0.9F); + cube_r3.setPos(0.0F, 0.0F, 0.9F); legsL.addChild(cube_r3); setRotationAngle(cube_r3, 0.0F, -0.2182F, 0.3927F); - cube_r3.setTextureOffset(0, 14).addCuboid(0.0F, 0.0F, -0.5F, 3.0F, 0.0F, 1.0F, 0.0F); + cube_r3.texOffs(0, 14).addBox(0.0F, 0.0F, -0.5F, 3.0F, 0.0F, 1.0F, 0.0F); legsR = new ModelPart(this); - legsR.setPivot(-1.5F, 19.9F, -0.55F); + legsR.setPos(-1.5F, 19.9F, -0.55F); setRotationAngle(legsR, 0.0F, 3.1416F, -0.6545F); cube_r4 = new ModelPart(this); - cube_r4.setPivot(0.0F, 0.0F, -1.0F); + cube_r4.setPos(0.0F, 0.0F, -1.0F); legsR.addChild(cube_r4); setRotationAngle(cube_r4, 0.0F, 0.2182F, 0.3927F); - cube_r4.setTextureOffset(0, 10).addCuboid(0.0F, 0.0F, -0.5F, 3.0F, 0.0F, 1.0F, 0.0F); + cube_r4.texOffs(0, 10).addBox(0.0F, 0.0F, -0.5F, 3.0F, 0.0F, 1.0F, 0.0F); cube_r5 = new ModelPart(this); - cube_r5.setPivot(0.5F, 0.1F, -0.05F); + cube_r5.setPos(0.5F, 0.1F, -0.05F); legsR.addChild(cube_r5); setRotationAngle(cube_r5, 0.0F, 0.0F, 0.3927F); - cube_r5.setTextureOffset(0, 11).addCuboid(0.0F, 0.0F, -0.4F, 3.0F, 0.0F, 1.0F, 0.0F); + cube_r5.texOffs(0, 11).addBox(0.0F, 0.0F, -0.4F, 3.0F, 0.0F, 1.0F, 0.0F); cube_r6 = new ModelPart(this); - cube_r6.setPivot(0.0F, 0.0F, 0.9F); + cube_r6.setPos(0.0F, 0.0F, 0.9F); legsR.addChild(cube_r6); setRotationAngle(cube_r6, 0.0F, -0.2182F, 0.3927F); - cube_r6.setTextureOffset(0, 12).addCuboid(0.0216F, 0.0F, -0.4024F, 3.0F, 0.0F, 1.0F, 0.0F); + cube_r6.texOffs(0, 12).addBox(0.0216F, 0.0F, -0.4024F, 3.0F, 0.0F, 1.0F, 0.0F); head_pivot = new ModelPart(this); - head_pivot.setPivot(0.0F, 18.0F, -3.0F); - head_pivot.setTextureOffset(15, 10).addCuboid(-1.5F, -1.5F, -2.0F, 3.0F, 3.0F, 3.0F, 0.0F); + head_pivot.setPos(0.0F, 18.0F, -3.0F); + head_pivot.texOffs(15, 10).addBox(-1.5F, -1.5F, -2.0F, 3.0F, 3.0F, 3.0F, 0.0F); tendril_r_r1 = new ModelPart(this); - tendril_r_r1.setPivot(1.0F, -1.15F, -1.0F); + tendril_r_r1.setPos(1.0F, -1.15F, -1.0F); head_pivot.addChild(tendril_r_r1); setRotationAngle(tendril_r_r1, 0.0F, 0.0F, 0.3927F); - tendril_r_r1.setTextureOffset(23, 0).addCuboid(-1.5F, -5.0F, 0.0F, 3.0F, 5.0F, 0.0F, 0.0F, true); + tendril_r_r1.texOffs(23, 0).addBox(-1.5F, -5.0F, 0.0F, 3.0F, 5.0F, 0.0F, 0.0F, true); tendril_r_r2 = new ModelPart(this); - tendril_r_r2.setPivot(-1.0F, -1.15F, -1.0F); + tendril_r_r2.setPos(-1.0F, -1.15F, -1.0F); head_pivot.addChild(tendril_r_r2); setRotationAngle(tendril_r_r2, 0.0F, 0.0F, -0.3927F); - tendril_r_r2.setTextureOffset(23, 0).addCuboid(-1.5F, -5.0F, 0.0F, 3.0F, 5.0F, 0.0F, 0.0F); + tendril_r_r2.texOffs(23, 0).addBox(-1.5F, -5.0F, 0.0F, 3.0F, 5.0F, 0.0F, 0.0F); bb_main = new ModelPart(this); - bb_main.setPivot(0.0F, 24.0F, 0.0F); - bb_main.setTextureOffset(19, 19).addCuboid(-2.5F, -8.5F, -3.0F, 5.0F, 5.0F, 3.0F, 0.0F); + bb_main.setPos(0.0F, 24.0F, 0.0F); + bb_main.texOffs(19, 19).addBox(-2.5F, -8.5F, -3.0F, 5.0F, 5.0F, 3.0F, 0.0F); wingR_r1 = new ModelPart(this); - wingR_r1.setPivot(-1.5F, -6.5F, 0.5F); + wingR_r1.setPos(-1.5F, -6.5F, 0.5F); bb_main.addChild(wingR_r1); setRotationAngle(wingR_r1, 0.0F, 0.0F, 0.3927F); - wingR_r1.setTextureOffset(0, 5).addCuboid(-7.0F, 0.0F, -3.0F, 9.0F, 0.0F, 5.0F, 0.0F, true); + wingR_r1.texOffs(0, 5).addBox(-7.0F, 0.0F, -3.0F, 9.0F, 0.0F, 5.0F, 0.0F, true); wingL_r1 = new ModelPart(this); - wingL_r1.setPivot(1.5F, -6.5F, 0.5F); + wingL_r1.setPos(1.5F, -6.5F, 0.5F); bb_main.addChild(wingL_r1); setRotationAngle(wingL_r1, 0.0F, 0.0F, -0.3927F); - wingL_r1.setTextureOffset(0, 5).addCuboid(-2.0F, 0.0F, -3.0F, 9.0F, 0.0F, 5.0F, 0.0F); + wingL_r1.texOffs(0, 5).addBox(-2.0F, 0.0F, -3.0F, 9.0F, 0.0F, 5.0F, 0.0F); abdomen_r1 = new ModelPart(this); - abdomen_r1.setPivot(1.0F, -3.9F, 0.0F); + abdomen_r1.setPos(1.0F, -3.9F, 0.0F); bb_main.addChild(abdomen_r1); setRotationAngle(abdomen_r1, -0.3927F, 0.0F, 0.0F); - abdomen_r1.setTextureOffset(0, 10).addCuboid(-3.0F, -4.0F, -1.0F, 4.0F, 4.0F, 7.0F, 0.0F); + abdomen_r1.texOffs(0, 10).addBox(-3.0F, -4.0F, -1.0F, 4.0F, 4.0F, 7.0F, 0.0F); } @Override - public void setAngles(SilkMothEntity entity, float limbAngle, float limbDistance, float animationProgress, + public void setupAnim(SilkMothEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { - wingR_r1.roll = Mth.sin(animationProgress * 2F) * 0.4F + 0.3927F; - wingL_r1.roll = -wingR_r1.roll; - head_pivot.pitch = Mth.sin(animationProgress * 0.03F) * 0.1F; - tendril_r_r1.roll = Mth.sin(animationProgress * 0.07F) * 0.2F + 0.3927F; - tendril_r_r2.roll = -tendril_r_r1.roll; - abdomen_r1.pitch = Mth.sin(animationProgress * 0.05F) * 0.1F - 0.3927F; - legsR.roll = Mth.sin(animationProgress * 0.07F) * 0.1F - 0.6545F; - legsL.roll = -legsR.roll; + wingR_r1.zRot = Mth.sin(animationProgress * 2F) * 0.4F + 0.3927F; + wingL_r1.zRot = -wingR_r1.zRot; + head_pivot.xRot = Mth.sin(animationProgress * 0.03F) * 0.1F; + tendril_r_r1.zRot = Mth.sin(animationProgress * 0.07F) * 0.2F + 0.3927F; + tendril_r_r2.zRot = -tendril_r_r1.zRot; + abdomen_r1.xRot = Mth.sin(animationProgress * 0.05F) * 0.1F - 0.3927F; + legsR.zRot = Mth.sin(animationProgress * 0.07F) * 0.1F - 0.6545F; + legsL.zRot = -legsR.zRot; } @Override - public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, - float blue, float alpha) { + public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, + float green, float blue, float alpha) { bb_main.render(matrices, vertices, light, overlay); head_pivot.render(matrices, vertices, light, overlay); legsL.render(matrices, vertices, light, overlay); diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java b/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java index 0bb0b984..0e23ffed 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java @@ -1,57 +1,54 @@ package ru.betterend.entity.render; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.client.render.entity.MobEntityRenderer; -import net.minecraft.client.render.entity.feature.EyesFeatureRenderer; -import net.minecraft.client.util.math.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.client.renderer.entity.layers.EyesLayer; +import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.entity.CubozoaEntity; import ru.betterend.entity.model.CubozoaEntityModel; -public class RendererEntityCubozoa extends MobEntityRenderer { +public class RendererEntityCubozoa extends MobRenderer { private static final ResourceLocation[] TEXTURE = new ResourceLocation[2]; - private static final RenderLayer[] GLOW = new RenderLayer[2]; + private static final RenderType[] GLOW = new RenderType[2]; public RendererEntityCubozoa(EntityRenderDispatcher entityRenderDispatcher) { super(entityRenderDispatcher, new CubozoaEntityModel(), 0.5f); - this.addFeature(new EyesFeatureRenderer(this) { + this.addLayer(new EyesLayer(this) { @Override - public RenderLayer getEyesTexture() { + public RenderType renderType() { return GLOW[0]; } @Override - public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, - CubozoaEntity entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, - float headYaw, float headPitch) { + public void render(PoseStack matrices, MultiBufferSource vertexConsumers, int light, CubozoaEntity entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { VertexConsumer vertexConsumer = vertexConsumers.getBuffer(GLOW[entity.getVariant()]); - this.getContextModel().render(matrices, vertexConsumer, 15728640, OverlayTexture.DEFAULT_UV, 1.0F, 1.0F, - 1.0F, 1.0F); + this.getParentModel().renderToBuffer(matrices, vertexConsumer, 15728640, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); } - }); + }); } @Override - protected void scale(CubozoaEntity entity, MatrixStack matrixStack, float f) { + protected void scale(CubozoaEntity entity, PoseStack matrixStack, float f) { float scale = entity.getScale(); matrixStack.scale(scale, scale, scale); } @Override - public ResourceLocation getTexture(CubozoaEntity entity) { + public ResourceLocation getTextureLocation(CubozoaEntity entity) { return TEXTURE[entity.getVariant()]; } - + static { TEXTURE[0] = BetterEnd.makeID("textures/entity/cubozoa/cubozoa.png"); TEXTURE[1] = BetterEnd.makeID("textures/entity/cubozoa/cubozoa_sulphur.png"); - - GLOW[0] = RenderLayer.getEyes(BetterEnd.makeID("textures/entity/cubozoa/cubozoa_glow.png")); - GLOW[1] = RenderLayer.getEyes(BetterEnd.makeID("textures/entity/cubozoa/cubozoa_sulphur_glow.png")); + + GLOW[0] = RenderType.eyes(BetterEnd.makeID("textures/entity/cubozoa/cubozoa_glow.png")); + GLOW[1] = RenderType.eyes(BetterEnd.makeID("textures/entity/cubozoa/cubozoa_sulphur_glow.png")); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityDragonfly.java b/src/main/java/ru/betterend/entity/render/RendererEntityDragonfly.java index 64901b1b..37e82160 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityDragonfly.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityDragonfly.java @@ -1,30 +1,30 @@ package ru.betterend.entity.render; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.client.render.entity.MobEntityRenderer; -import net.minecraft.client.render.entity.feature.EyesFeatureRenderer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.client.renderer.entity.layers.EyesLayer; import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.entity.DragonflyEntity; import ru.betterend.entity.model.DragonflyEntityModel; -public class RendererEntityDragonfly extends MobEntityRenderer { +public class RendererEntityDragonfly extends MobRenderer { private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/dragonfly.png"); - private static final RenderLayer GLOW = RenderLayer.getEyes(BetterEnd.makeID("textures/entity/dragonfly_glow.png")); + private static final RenderType GLOW = RenderType.eyes(BetterEnd.makeID("textures/entity/dragonfly_glow.png")); public RendererEntityDragonfly(EntityRenderDispatcher entityRenderDispatcher) { super(entityRenderDispatcher, new DragonflyEntityModel(), 0.5f); - this.addFeature(new EyesFeatureRenderer(this) { + this.addLayer(new EyesLayer(this) { @Override - public RenderLayer getEyesTexture() { + public RenderType renderType() { return GLOW; } }); } @Override - public ResourceLocation getTexture(DragonflyEntity entity) { + public ResourceLocation getTextureLocation(DragonflyEntity entity) { return TEXTURE; } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java b/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java index c96ae77d..e37fe63d 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java @@ -1,56 +1,56 @@ package ru.betterend.entity.render; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.client.render.entity.MobEntityRenderer; -import net.minecraft.client.render.entity.feature.EyesFeatureRenderer; -import net.minecraft.client.util.math.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.client.renderer.entity.layers.EyesLayer; +import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.entity.EndFishEntity; import ru.betterend.entity.model.EndFishEntityModel; -public class RendererEntityEndFish extends MobEntityRenderer { +public class RendererEntityEndFish extends MobRenderer { private static final ResourceLocation[] TEXTURE = new ResourceLocation[EndFishEntity.VARIANTS]; - private static final RenderLayer[] GLOW = new RenderLayer[EndFishEntity.VARIANTS]; + private static final RenderType[] GLOW = new RenderType[EndFishEntity.VARIANTS]; public RendererEntityEndFish(EntityRenderDispatcher entityRenderDispatcher) { super(entityRenderDispatcher, new EndFishEntityModel(), 0.5f); - this.addFeature(new EyesFeatureRenderer(this) { + this.addLayer(new EyesLayer(this) { @Override - public RenderLayer getEyesTexture() { + public RenderType renderType() { return GLOW[0]; } @Override - public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, - EndFishEntity entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, - float headYaw, float headPitch) { + public void render(PoseStack matrices, MultiBufferSource vertexConsumers, int light, EndFishEntity entity, + float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, + float headPitch) { VertexConsumer vertexConsumer = vertexConsumers.getBuffer(GLOW[entity.getVariant()]); - this.getContextModel().render(matrices, vertexConsumer, 15728640, OverlayTexture.DEFAULT_UV, 1.0F, 1.0F, - 1.0F, 1.0F); + this.getParentModel().renderToBuffer(matrices, vertexConsumer, 15728640, OverlayTexture.NO_OVERLAY, + 1.0F, 1.0F, 1.0F, 1.0F); } }); } @Override - protected void scale(EndFishEntity entity, MatrixStack matrixStack, float f) { + protected void scale(EndFishEntity entity, PoseStack matrixStack, float f) { float scale = entity.getScale(); matrixStack.scale(scale, scale, scale); } @Override - public ResourceLocation getTexture(EndFishEntity entity) { + public ResourceLocation getTextureLocation(EndFishEntity entity) { return TEXTURE[entity.getVariant()]; } static { for (int i = 0; i < EndFishEntity.VARIANTS; i++) { TEXTURE[i] = BetterEnd.makeID("textures/entity/end_fish/end_fish_" + i + ".png"); - GLOW[i] = RenderLayer.getEyes(BetterEnd.makeID("textures/entity/end_fish/end_fish_" + i + "_glow.png")); + GLOW[i] = RenderType.eyes(BetterEnd.makeID("textures/entity/end_fish/end_fish_" + i + "_glow.png")); } } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java index 6075d9eb..fa3de633 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java @@ -1,103 +1,103 @@ package ru.betterend.entity.render; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.client.render.entity.LivingEntityRenderer; -import net.minecraft.client.render.entity.MobEntityRenderer; -import net.minecraft.client.render.entity.feature.EyesFeatureRenderer; -import net.minecraft.client.render.entity.feature.FeatureRenderer; -import net.minecraft.client.render.entity.feature.FeatureRendererContext; -import net.minecraft.client.util.math.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.EyesLayer; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import ru.betterend.BetterEnd; import ru.betterend.entity.EndSlimeEntity; import ru.betterend.entity.model.EndSlimeEntityModel; -public class RendererEntityEndSlime extends MobEntityRenderer> { +public class RendererEntityEndSlime extends MobRenderer> { private static final ResourceLocation TEXTURE[] = new ResourceLocation[4]; - private static final RenderLayer GLOW[] = new RenderLayer[4]; + private static final RenderType GLOW[] = new RenderType[4]; public RendererEntityEndSlime(EntityRenderDispatcher entityRenderDispatcher) { super(entityRenderDispatcher, new EndSlimeEntityModel(false), 0.25F); - this.addFeature(new OverlayFeatureRenderer(this)); - this.addFeature(new EyesFeatureRenderer>(this) { + this.addLayer(new OverlayFeatureRenderer(this)); + this.addLayer(new EyesLayer>(this) { @Override - public RenderLayer getEyesTexture() { + public RenderType renderType() { return GLOW[0]; } @Override - public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, - EndSlimeEntity entity, float limbAngle, float limbDistance, float tickDelta, - float animationProgress, float headYaw, float headPitch) { + public void render(PoseStack matrices, MultiBufferSource vertexConsumers, int light, EndSlimeEntity entity, + float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, + float headPitch) { VertexConsumer vertexConsumer = vertexConsumers.getBuffer(GLOW[entity.getSlimeType()]); - this.getContextModel().render(matrices, vertexConsumer, 15728640, OverlayTexture.DEFAULT_UV, 1.0F, 1.0F, - 1.0F, 1.0F); + this.getParentModel().renderToBuffer(matrices, vertexConsumer, 15728640, OverlayTexture.NO_OVERLAY, + 1.0F, 1.0F, 1.0F, 1.0F); if (entity.isLake()) { - this.getContextModel().renderFlower(matrices, vertexConsumer, 15728640, OverlayTexture.DEFAULT_UV); + this.getParentModel().renderFlower(matrices, vertexConsumer, 15728640, OverlayTexture.NO_OVERLAY); } } }); } @Override - public ResourceLocation getTexture(EndSlimeEntity entity) { + public ResourceLocation getTextureLocation(EndSlimeEntity entity) { return TEXTURE[entity.getSlimeType()]; } @Override - public void render(EndSlimeEntity slimeEntity, float f, float g, MatrixStack matrixStack, - VertexConsumerProvider vertexConsumerProvider, int i) { + public void render(EndSlimeEntity slimeEntity, float f, float g, PoseStack matrixStack, + MultiBufferSource vertexConsumerProvider, int i) { this.shadowRadius = 0.25F * (float) slimeEntity.getSize(); super.render(slimeEntity, f, g, matrixStack, vertexConsumerProvider, i); } @Override - protected void scale(EndSlimeEntity slimeEntity, MatrixStack matrixStack, float f) { + protected void scale(EndSlimeEntity slimeEntity, PoseStack matrixStack, float f) { matrixStack.scale(0.999F, 0.999F, 0.999F); matrixStack.translate(0.0D, 0.0010000000474974513D, 0.0D); float h = (float) slimeEntity.getSize(); - float i = Mth.lerp(f, slimeEntity.lastStretch, slimeEntity.stretch) / (h * 0.5F + 1.0F); + float i = Mth.lerp(f, slimeEntity.oSquish, slimeEntity.squish) / (h * 0.5F + 1.0F); float j = 1.0F / (i + 1.0F); matrixStack.scale(j * h, 1.0F / j * h, j * h); } private final class OverlayFeatureRenderer - extends FeatureRenderer> { + extends RenderLayer> { private final EndSlimeEntityModel modelOrdinal = new EndSlimeEntityModel(true); private final EndSlimeEntityModel modelLake = new EndSlimeEntityModel(true); - public OverlayFeatureRenderer(FeatureRendererContext> featureRendererContext) { + public OverlayFeatureRenderer(RenderLayerParent> featureRendererContext) { super(featureRendererContext); } - public void render(MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, - T livingEntity, float f, float g, float h, float j, float k, float l) { + public void render(PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i, T livingEntity, + float f, float g, float h, float j, float k, float l) { if (!livingEntity.isInvisible()) { if (livingEntity.isLake()) { VertexConsumer vertexConsumer = vertexConsumerProvider - .getBuffer(RenderLayer.getEntityCutout(this.getTexture(livingEntity))); - this.getContextModel().renderFlower(matrixStack, vertexConsumer, i, - LivingEntityRenderer.getOverlay(livingEntity, 0.0F)); + .getBuffer(RenderType.entityCutout(this.getTextureLocation(livingEntity))); + this.getParentModel().renderFlower(matrixStack, vertexConsumer, i, + LivingEntityRenderer.getOverlayCoords(livingEntity, 0.0F)); } else if (livingEntity.isAmber() || livingEntity.isChorus()) { VertexConsumer vertexConsumer = vertexConsumerProvider - .getBuffer(RenderLayer.getEntityCutout(this.getTexture(livingEntity))); - this.getContextModel().renderCrop(matrixStack, vertexConsumer, i, - LivingEntityRenderer.getOverlay(livingEntity, 0.0F)); + .getBuffer(RenderType.entityCutout(this.getTextureLocation(livingEntity))); + this.getParentModel().renderCrop(matrixStack, vertexConsumer, i, + LivingEntityRenderer.getOverlayCoords(livingEntity, 0.0F)); } EndSlimeEntityModel model = livingEntity.getSlimeType() == 1 ? modelLake : modelOrdinal; - this.getContextModel().copyStateTo(model); - model.animateModel(livingEntity, f, g, h); - model.setAngles(livingEntity, f, g, j, k, l); + this.getParentModel().copyPropertiesTo(model); + model.prepareMobModel(livingEntity, f, g, h); + model.setupAnim(livingEntity, f, g, j, k, l); VertexConsumer vertexConsumer = vertexConsumerProvider - .getBuffer(RenderLayer.getEntityTranslucent(this.getTexture(livingEntity))); - model.render(matrixStack, vertexConsumer, i, LivingEntityRenderer.getOverlay(livingEntity, 0.0F), 1.0F, - 1.0F, 1.0F, 1.0F); + .getBuffer(RenderType.entityTranslucent(this.getTextureLocation(livingEntity))); + model.renderToBuffer(matrixStack, vertexConsumer, i, + LivingEntityRenderer.getOverlayCoords(livingEntity, 0.0F), 1.0F, 1.0F, 1.0F, 1.0F); } } } @@ -107,9 +107,9 @@ public class RendererEntityEndSlime extends MobEntityRenderer> { + extends HumanoidMobRenderer> { private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/shadow_walker.png"); public RendererEntityShadowWalker(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new PlayerEntityModel(0.0F, false), 0.5F); + super(entityRenderDispatcher, new PlayerModel(0.0F, false), 0.5F); } @Override - public ResourceLocation getTexture(ShadowWalkerEntity zombieEntity) { + public ResourceLocation getTextureLocation(ShadowWalkerEntity zombieEntity) { return TEXTURE; } } diff --git a/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java b/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java index f6514e5d..7d3a2745 100644 --- a/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java +++ b/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java @@ -1,13 +1,13 @@ package ru.betterend.entity.render; -import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.client.render.entity.MobEntityRenderer; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.MobRenderer; import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.entity.SilkMothEntity; import ru.betterend.entity.model.SilkMothEntityModel; -public class SilkMothEntityRenderer extends MobEntityRenderer { +public class SilkMothEntityRenderer extends MobRenderer { private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/silk_moth.png"); public SilkMothEntityRenderer(EntityRenderDispatcher entityRenderDispatcher) { @@ -15,7 +15,7 @@ public class SilkMothEntityRenderer extends MobEntityRenderer PLAYER_ADVANCEMENT_COMPLETE = EventFactory - .createArrayBacked(AdvancementComplete.class, callbacks -> (player, advancement, criterionName) -> { - for (AdvancementComplete event : callbacks) { - event.onAdvancementComplete(player, advancement, criterionName); - } - }); - + + public static Event PLAYER_ADVENCEMENT_COMPLETE = EventFactory.createArrayBacked(AdvancementComplete.class, callbacks -> (player, advancement, criterionName) -> { + for (AdvancementComplete event : callbacks) { + event.onAdvancementComplete(player, advancement, criterionName); + } + }); + public interface AdvancementComplete { void onAdvancementComplete(ServerPlayer player, Advancement advancement, String criterionName); } diff --git a/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java b/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java index 8a910df0..d5f6e224 100644 --- a/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java +++ b/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java @@ -2,10 +2,8 @@ package ru.betterend.integration; import java.awt.Color; import java.util.Map; - -import com.google.common.collect.Maps; - import net.minecraft.world.level.ItemLike; +import com.google.common.collect.Maps; import ru.betterend.blocks.HydraluxPetalColoredBlock; import ru.betterend.blocks.complex.ColoredMaterial; import ru.betterend.registry.EndBlocks; @@ -18,24 +16,25 @@ public class FlamboyantRefabricatedIntegration extends ModIntegration { @Override public void register() { - /* - * Class fDyeColor = - * getClass("com.github.EltrutCo.flamboyant.items.FDyeColor"); Object[] values = - * getStaticFieldValue(fDyeColor, "VALUES"); - * - * if (values == null) { return; } - */ - + /*Class fDyeColor = getClass("com.github.EltrutCo.flamboyant.items.FDyeColor"); + Object[] values = getStaticFieldValue(fDyeColor, "VALUES"); + + if (values == null) { + return; + }*/ + Map colors = Maps.newHashMap(); Map dyes = Maps.newHashMap(); - /* - * for (Object val: values) { Integer color = (Integer) getFieldValue(fDyeColor, - * "signColor", val); String name = (String) getFieldValue(fDyeColor, "name", - * val); if (color != null && name != null) { colors.put(color, name); - * System.out.println(name + " " + color + " " + new Color(color)); - * dyes.put(color, getItem(name + "_dye")); } } - */ - + /*for (Object val: values) { + Integer color = (Integer) getFieldValue(fDyeColor, "signColor", val); + String name = (String) getFieldValue(fDyeColor, "name", val); + if (color != null && name != null) { + colors.put(color, name); + System.out.println(name + " " + color + " " + new Color(color)); + dyes.put(color, getItem(name + "_dye")); + } + }*/ + addColor("fead1d", "amber", colors, dyes); addColor("bd9a5f", "beige", colors, dyes); addColor("edeada", "cream", colors, dyes); @@ -52,15 +51,15 @@ public class FlamboyantRefabricatedIntegration extends ModIntegration { addColor("6bb1cf", "sky_blue", colors, dyes); addColor("6e8c9c", "slate_gray", colors, dyes); addColor("b02454", "violet", colors, dyes); - + new ColoredMaterial(HydraluxPetalColoredBlock::new, EndBlocks.HYDRALUX_PETAL_BLOCK, colors, dyes, true); } - + private void addColor(String hex, String name, Map colors, Map dyes) { int color = MHelper.color(hex); colors.put(color, name); dyes.put(color, getItem(name + "_dye")); - + System.out.println(name + " " + color + " " + new Color(color)); } } diff --git a/src/main/java/ru/betterend/integration/ModIntegration.java b/src/main/java/ru/betterend/integration/ModIntegration.java index 9489940a..24c01e58 100644 --- a/src/main/java/ru/betterend/integration/ModIntegration.java +++ b/src/main/java/ru/betterend/integration/ModIntegration.java @@ -7,19 +7,19 @@ import java.lang.reflect.Method; import net.fabricmc.fabric.api.tag.TagRegistry; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.item.Item; +import net.minecraft.core.Registry; +import net.minecraft.data.BuiltinRegistries; +import net.minecraft.resources.ResourceKey; +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.resources.ResourceLocation; -import net.minecraft.data.BuiltinRegistries; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceKey; +import net.minecraft.world.item.Item; import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.gen.GenerationStep; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.GenerationStep; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.BetterEnd; @@ -27,25 +27,23 @@ import ru.betterend.world.features.EndFeature; public abstract class ModIntegration { private final String modID; - - public void register() { - } - - public void addBiomes() { - } - + + public void register() {} + + public void addBiomes() {} + public ModIntegration(String modID) { this.modID = modID; } - + public ResourceLocation getID(String name) { return new ResourceLocation(modID, name); } - + public Block getBlock(String name) { return Registry.BLOCK.get(getID(name)); } - + public Item getItem(String name) { return Registry.ITEM.get(getID(name)); } @@ -53,39 +51,39 @@ public abstract class ModIntegration { public BlockState getDefaultState(String name) { return getBlock(name).defaultBlockState(); } - + public ResourceKey getKey(String name) { - return ResourceKey.of(Registry.BIOME_KEY, getID(name)); + return ResourceKey.create(Registry.BIOME_REGISTRY, getID(name)); } - + public boolean modIsInstalled() { return FabricLoader.getInstance().isModLoaded(modID); } - - public EndFeature getFeature(String featureID, String configuredFeatureID, GenerationStep.Feature featureStep) { + + public EndFeature getFeature(String featureID, String configuredFeatureID, GenerationStep.Decoration featureStep) { Feature feature = Registry.FEATURE.get(getID(featureID)); - ConfiguredFeature featureConfigured = BuiltinRegistries.CONFIGURED_FEATURE - .get(getID(configuredFeatureID)); + ConfiguredFeature featureConfigured = BuiltinRegistries.CONFIGURED_FEATURE.get(getID(configuredFeatureID)); return new EndFeature(feature, featureConfigured, featureStep); } - - public EndFeature getFeature(String name, GenerationStep.Feature featureStep) { + + public EndFeature getFeature(String name, GenerationStep.Decoration featureStep) { return getFeature(name, name, featureStep); } - + public ConfiguredFeature getConfiguredFeature(String name) { return BuiltinRegistries.CONFIGURED_FEATURE.get(getID(name)); } - + public Biome getBiome(String name) { return BuiltinRegistries.BIOME.get(getID(name)); } - + public Class getClass(String path) { Class cl = null; try { cl = Class.forName(path); - } catch (ClassNotFoundException e) { + } + catch (ClassNotFoundException e) { BetterEnd.LOGGER.error(e.getMessage()); if (BetterEnd.isDevEnvironment()) { e.printStackTrace(); @@ -93,7 +91,7 @@ public abstract class ModIntegration { } return cl; } - + @SuppressWarnings("unchecked") public T getStaticFieldValue(Class cl, String name) { if (cl != null) { @@ -102,13 +100,14 @@ public abstract class ModIntegration { if (field != null) { return (T) field.get(null); } - } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { + } + catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); } } return null; } - + public Object getFieldValue(Class cl, String name, Object classInstance) { if (cl != null) { try { @@ -116,18 +115,20 @@ public abstract class ModIntegration { if (field != null) { return field.get(classInstance); } - } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { + } + catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); } } return null; } - + public Method getMethod(Class cl, String functionName, Class... args) { if (cl != null) { try { return cl.getMethod(functionName, args); - } catch (NoSuchMethodException | SecurityException e) { + } + catch (NoSuchMethodException | SecurityException e) { BetterEnd.LOGGER.error(e.getMessage()); if (BetterEnd.isDevEnvironment()) { e.printStackTrace(); @@ -136,12 +137,13 @@ public abstract class ModIntegration { } return null; } - + public Object executeMethod(Object instance, Method method, Object... args) { if (method != null) { try { return method.invoke(instance, args); - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + } + catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { BetterEnd.LOGGER.error(e.getMessage()); if (BetterEnd.isDevEnvironment()) { e.printStackTrace(); @@ -150,7 +152,7 @@ public abstract class ModIntegration { } return null; } - + public Object getAndExecuteStatic(Class cl, String functionName, Object... args) { if (cl != null) { Class[] classes = new Class[args.length]; @@ -162,10 +164,9 @@ public abstract class ModIntegration { } return null; } - + @SuppressWarnings("unchecked") - public T getAndExecuteRuntime(Class cl, Object instance, String functionName, - Object... args) { + public T getAndExecuteRuntime(Class cl, Object instance, String functionName, Object... args) { if (instance != null) { Class[] classes = new Class[args.length]; for (int i = 0; i < args.length; i++) { @@ -176,15 +177,15 @@ public abstract class ModIntegration { } return null; } - + public Object newInstance(Class cl, Object... args) { if (cl != null) { - for (Constructor constructor : cl.getConstructors()) { + for (Constructor constructor: cl.getConstructors()) { if (constructor.getParameterCount() == args.length) { try { return constructor.newInstance(args); - } catch (InstantiationException | IllegalAccessException | IllegalArgumentException - | InvocationTargetException e) { + } + catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { BetterEnd.LOGGER.error(e.getMessage()); if (BetterEnd.isDevEnvironment()) { e.printStackTrace(); @@ -195,16 +196,16 @@ public abstract class ModIntegration { } return null; } - + public Tag.Named getItemTag(String name) { ResourceLocation id = getID(name); - Tag tag = ItemTags.getTagGroup().getTag(id); - return tag == null ? (Identified) TagRegistry.item(id) : (Identified) tag; + Tag tag = ItemTags.getAllTags().getTag(id); + return tag == null ? (Named) TagRegistry.item(id) : (Named) tag; } - + public Tag.Named getBlockTag(String name) { ResourceLocation id = getID(name); - Tag tag = BlockTags.getTagGroup().getTag(id); - return tag == null ? (Identified) TagRegistry.block(id) : (Identified) tag; + Tag tag = BlockTags.getAllTags().getTag(id); + return tag == null ? (Named) TagRegistry.block(id) : (Named) tag; } } diff --git a/src/main/java/ru/betterend/integration/NourishIntegration.java b/src/main/java/ru/betterend/integration/NourishIntegration.java index 0697e356..37a92fa6 100644 --- a/src/main/java/ru/betterend/integration/NourishIntegration.java +++ b/src/main/java/ru/betterend/integration/NourishIntegration.java @@ -1,7 +1,7 @@ package ru.betterend.integration; -import net.minecraft.world.item.Item; import net.minecraft.tags.Tag; +import net.minecraft.world.item.Item; import ru.betterend.registry.EndItems; import ru.betterend.util.TagHelper; @@ -16,10 +16,9 @@ public class NourishIntegration extends ModIntegration { Tag.Named fruit = getItemTag("fruit"); Tag.Named protein = getItemTag("protein"); Tag.Named sweets = getItemTag("sweets"); - + TagHelper.addTag(fats, EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED); - TagHelper.addTag(fruit, EndItems.SHADOW_BERRY_RAW, EndItems.SHADOW_BERRY_COOKED, EndItems.BLOSSOM_BERRY, - EndItems.SHADOW_BERRY_JELLY, EndItems.SWEET_BERRY_JELLY); + TagHelper.addTag(fruit, EndItems.SHADOW_BERRY_RAW, EndItems.SHADOW_BERRY_COOKED, EndItems.BLOSSOM_BERRY, EndItems.SHADOW_BERRY_JELLY, EndItems.SWEET_BERRY_JELLY); TagHelper.addTag(protein, EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED); TagHelper.addTag(sweets, EndItems.SHADOW_BERRY_JELLY, EndItems.SWEET_BERRY_JELLY); } diff --git a/src/main/java/ru/betterend/integration/byg/BYGBlocks.java b/src/main/java/ru/betterend/integration/byg/BYGBlocks.java index 3dd5635f..911ea1ea 100644 --- a/src/main/java/ru/betterend/integration/byg/BYGBlocks.java +++ b/src/main/java/ru/betterend/integration/byg/BYGBlocks.java @@ -8,9 +8,8 @@ import ru.betterend.registry.EndBlocks; public class BYGBlocks { public static final Block IVIS_MOSS = EndBlocks.registerBlock("ivis_moss", new EndWallPlantBlock()); public static final Block NIGHTSHADE_MOSS = EndBlocks.registerBlock("nightshade_moss", new EndWallPlantBlock()); - + public static final Block IVIS_VINE = EndBlocks.registerBlock("ivis_vine", new VineBlock()); - - public static void register() { - } + + public static void register() {} } diff --git a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java index b7250223..4e18f028 100644 --- a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java +++ b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java @@ -2,10 +2,9 @@ package ru.betterend.integration.byg; import java.util.List; import java.util.stream.Collectors; - -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.collection.WeightedList; import net.minecraft.data.BuiltinRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.ai.behavior.WeightedList; import net.minecraft.world.level.biome.Biome; import ru.betterend.integration.Integrations; import ru.betterend.integration.ModIntegration; @@ -32,31 +31,31 @@ public class BYGIntegration extends ModIntegration { @Override public void addBiomes() { BYGBiomes.addBiomes(); - + Class biomeClass = this.getClass("corgiaoc.byg.common.world.biome.BYGEndBiome"); List biomes = this.getStaticFieldValue(biomeClass, "BYG_END_BIOMES"); - + if (biomes != null && biomeClass != null) { biomes.forEach((obj) -> { Biome biome = this.getAndExecuteRuntime(biomeClass, obj, "getBiome"); if (biome != null) { - ResourceLocation biomeID = BuiltinRegistries.BIOME.getId(biome); + ResourceLocation biomeID = BuiltinRegistries.BIOME.getKey(biome); EndBiome endBiome = EndBiomes.getBiome(biomeID); Biome edge = this.getAndExecuteRuntime(biomeClass, obj, "getEdge"); if (edge != null) { - ResourceLocation edgeID = BuiltinRegistries.BIOME.getId(edge); + ResourceLocation edgeID = BuiltinRegistries.BIOME.getKey(edge); EndBiomes.LAND_BIOMES.removeMutableBiome(edgeID); EndBiomes.VOID_BIOMES.removeMutableBiome(edgeID); EndBiome edgeBiome = EndBiomes.getBiome(edgeID); endBiome.setEdge(edgeBiome); - } else { + } + else { Boolean isVoid = this.getAndExecuteRuntime(biomeClass, obj, "isVoid"); if (isVoid != null && isVoid.booleanValue()) { EndBiomes.LAND_BIOMES.removeMutableBiome(biomeID); EndBiomes.VOID_BIOMES.addBiomeMutable(endBiome); } - WeightedList subBiomes = this.getAndExecuteRuntime(biomeClass, obj, - "getHills"); + WeightedList subBiomes = this.getAndExecuteRuntime(biomeClass, obj, "getHills"); if (subBiomes != null) { subBiomes.stream().collect(Collectors.toList()).forEach((id) -> { EndBiome subBiome = EndBiomes.getBiome(id); diff --git a/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java b/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java index 3db0b3ef..42442df7 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java @@ -1,12 +1,11 @@ package ru.betterend.integration.byg.biomes; import java.util.List; - -import net.minecraft.world.entity.SpawnGroup; import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.entity.MobCategory; import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.biome.BiomeEffects; -import net.minecraft.world.biome.SpawnSettings.SpawnEntry; +import net.minecraft.world.level.biome.BiomeSpecialEffects; +import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; import ru.betterend.BetterEnd; import ru.betterend.integration.Integrations; import ru.betterend.integration.byg.features.BYGFeatures; @@ -17,30 +16,30 @@ public class EterialGrove extends EndBiome { public EterialGrove() { super(makeDef()); } - + private static BiomeDefinition makeDef() { Biome biome = Integrations.BYG.getBiome("ethereal_islands"); - BiomeEffects effects = biome.getEffects(); - + BiomeSpecialEffects effects = biome.getSpecialEffects(); + BiomeDefinition def = new BiomeDefinition("eterial_grove") .setSurface(biome.getGenerationSettings().getSurfaceBuilder().get()) .addFeature(BYGFeatures.BIG_ETHER_TREE); - + if (BetterEnd.isClient()) { - SoundEvent loop = effects.getLoopSound().get(); - SoundEvent music = effects.getMusic().get().getSound(); - SoundEvent additions = effects.getAdditionsSound().get().getSound(); - SoundEvent mood = effects.getMoodSound().get().getSound(); + SoundEvent loop = effects.getAmbientLoopSoundEvent().get(); + SoundEvent music = effects.getBackgroundMusic().get().getEvent(); + SoundEvent additions = effects.getAmbientAdditionsSettings().get().getSoundEvent(); + SoundEvent mood = effects.getAmbientMoodSettings().get().getSoundEvent(); def.setLoop(loop).setMusic(music).setAdditions(additions).setMood(mood); } - - for (SpawnGroup group : SpawnGroup.values()) { - List list = biome.getSpawnSettings().getSpawnEntry(group); + + for (MobCategory group: MobCategory.values()) { + List list = biome.getMobSettings().getMobs(group); list.forEach((entry) -> { def.addMobSpawn(entry); }); } - + return def; } } diff --git a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java index 0567deb4..69122484 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java @@ -1,14 +1,13 @@ package ru.betterend.integration.byg.biomes; import java.util.List; - -import net.minecraft.world.entity.SpawnGroup; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.entity.MobCategory; import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.biome.BiomeEffects; -import net.minecraft.world.biome.SpawnSettings.SpawnEntry; -import net.minecraft.world.gen.GenerationStep.Feature; +import net.minecraft.world.level.biome.BiomeSpecialEffects; +import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; +import net.minecraft.world.level.levelgen.GenerationStep.Decoration; import ru.betterend.BetterEnd; import ru.betterend.integration.Integrations; import ru.betterend.integration.byg.features.BYGFeatures; @@ -20,39 +19,45 @@ public class NightshadeRedwoods extends EndBiome { public NightshadeRedwoods() { super(makeDef()); } - + private static BiomeDefinition makeDef() { Biome biome = Integrations.BYG.getBiome("nightshade_forest"); - BiomeEffects effects = biome.getEffects(); - - BiomeDefinition def = new BiomeDefinition("nightshade_redwoods").setFogColor(140, 108, 47).setFogDensity(1.5F) - .setWaterAndFogColor(55, 70, 186).setFoliageColor(122, 17, 155) + BiomeSpecialEffects effects = biome.getSpecialEffects(); + + BiomeDefinition def = new BiomeDefinition("nightshade_redwoods") + .setFogColor(140, 108, 47) + .setFogDensity(1.5F) + .setWaterAndFogColor(55, 70, 186) + .setFoliageColor(122, 17, 155) .setParticles(ParticleTypes.REVERSE_PORTAL, 0.002F) - .setSurface(biome.getGenerationSettings().getSurfaceBuilder().get()).setGrassColor(48, 13, 89) - .setPlantsColor(200, 125, 9).addFeature(EndFeatures.END_LAKE_RARE) - .addFeature(BYGFeatures.NIGHTSHADE_REDWOOD_TREE).addFeature(BYGFeatures.NIGHTSHADE_MOSS_WOOD) + .setSurface(biome.getGenerationSettings().getSurfaceBuilder().get()) + .setGrassColor(48, 13, 89) + .setPlantsColor(200, 125, 9) + .addFeature(EndFeatures.END_LAKE_RARE) + .addFeature(BYGFeatures.NIGHTSHADE_REDWOOD_TREE) + .addFeature(BYGFeatures.NIGHTSHADE_MOSS_WOOD) .addFeature(BYGFeatures.NIGHTSHADE_MOSS); - + if (BetterEnd.isClient()) { - SoundEvent loop = effects.getLoopSound().get(); - SoundEvent music = effects.getMusic().get().getSound(); - SoundEvent additions = effects.getAdditionsSound().get().getSound(); - SoundEvent mood = effects.getMoodSound().get().getSound(); + SoundEvent loop = effects.getAmbientLoopSoundEvent().get(); + SoundEvent music = effects.getBackgroundMusic().get().getEvent(); + SoundEvent additions = effects.getAmbientAdditionsSettings().get().getSoundEvent(); + SoundEvent mood = effects.getAmbientMoodSettings().get().getSoundEvent(); def.setLoop(loop).setMusic(music).setAdditions(additions).setMood(mood); } - biome.getGenerationSettings().getFeatures().forEach((list) -> { + biome.getGenerationSettings().features().forEach((list) -> { list.forEach((feature) -> { - def.addFeature(Feature.VEGETAL_DECORATION, feature.get()); + def.addFeature(Decoration.VEGETAL_DECORATION, feature.get()); }); }); - - for (SpawnGroup group : SpawnGroup.values()) { - List list = biome.getSpawnSettings().getSpawnEntry(group); + + for (MobCategory group: MobCategory.values()) { + List list = biome.getMobSettings().getMobs(group); list.forEach((entry) -> { def.addMobSpawn(entry); }); } - + return def; } } diff --git a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java index d8816e4b..469c6609 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java @@ -2,20 +2,19 @@ package ru.betterend.integration.byg.biomes; import java.util.List; import java.util.function.Supplier; - -import net.minecraft.world.level.block.Block; -import net.minecraft.world.entity.SpawnGroup; -import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.data.BuiltinRegistries; import net.minecraft.core.Registry; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.data.BuiltinRegistries; +import net.minecraft.data.worldgen.Features; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.entity.MobCategory; import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.biome.BiomeEffects; -import net.minecraft.world.biome.SpawnSettings.SpawnEntry; -import net.minecraft.world.gen.GenerationStep.Feature; +import net.minecraft.world.level.biome.BiomeSpecialEffects; +import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.levelgen.GenerationStep.Decoration; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; -import net.minecraft.world.level.levelgen.feature.ConfiguredFeatures; import ru.betterend.BetterEnd; import ru.betterend.integration.Integrations; import ru.betterend.integration.byg.features.BYGFeatures; @@ -27,60 +26,65 @@ public class OldBulbisGardens extends EndBiome { public OldBulbisGardens() { super(makeDef()); } - + private static BiomeDefinition makeDef() { Biome biome = Integrations.BYG.getBiome("bulbis_gardens"); - BiomeEffects effects = biome.getEffects(); - + BiomeSpecialEffects effects = biome.getSpecialEffects(); + Block ivis = Integrations.BYG.getBlock("ivis_phylium"); Block origin = biome.getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial().getBlock(); - BiomeDefinition def = new BiomeDefinition("old_bulbis_gardens").setFogColor(215, 132, 207).setFogDensity(1.8F) - .setWaterAndFogColor(40, 0, 56).setFoliageColor(122, 17, 155) - .setParticles(ParticleTypes.REVERSE_PORTAL, 0.002F).setSurface(ivis, origin) - .addFeature(EndFeatures.END_LAKE_RARE).addFeature(BYGFeatures.OLD_BULBIS_TREE); - + BiomeDefinition def = new BiomeDefinition("old_bulbis_gardens") + .setFogColor(215, 132, 207) + .setFogDensity(1.8F) + .setWaterAndFogColor(40, 0, 56) + .setFoliageColor(122, 17, 155) + .setParticles(ParticleTypes.REVERSE_PORTAL, 0.002F) + .setSurface(ivis, origin) + .addFeature(EndFeatures.END_LAKE_RARE) + .addFeature(BYGFeatures.OLD_BULBIS_TREE); + if (BetterEnd.isClient()) { - SoundEvent loop = effects.getLoopSound().get(); - SoundEvent music = effects.getMusic().get().getSound(); - SoundEvent additions = effects.getAdditionsSound().get().getSound(); - SoundEvent mood = effects.getMoodSound().get().getSound(); + SoundEvent loop = effects.getAmbientLoopSoundEvent().get(); + SoundEvent music = effects.getBackgroundMusic().get().getEvent(); + SoundEvent additions = effects.getAmbientAdditionsSettings().get().getSoundEvent(); + SoundEvent mood = effects.getAmbientMoodSettings().get().getSoundEvent(); def.setLoop(loop).setMusic(music).setAdditions(additions).setMood(mood); } - - for (SpawnGroup group : SpawnGroup.values()) { - List list = biome.getSpawnSettings().getSpawnEntry(group); + + for (MobCategory group: MobCategory.values()) { + List list = biome.getMobSettings().getMobs(group); list.forEach((entry) -> { def.addMobSpawn(entry); }); } - - List>>> features = biome.getGenerationSettings().getFeatures(); - List>> vegetal = features.get(Feature.VEGETAL_DECORATION.ordinal()); + + List>>> features = biome.getGenerationSettings().features(); + List>> vegetal = features.get(Decoration.VEGETAL_DECORATION.ordinal()); if (vegetal.size() > 2) { Supplier> getter; // Trees (first two features) - // I couldn't process them with conditions, so that's why they are hardcoded - // (paulevs) + // I couldn't process them with conditions, so that's why they are hardcoded (paulevs) for (int i = 0; i < 2; i++) { getter = vegetal.get(i); ConfiguredFeature feature = getter.get(); ResourceLocation id = BetterEnd.makeID("obg_feature_" + i); - feature = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, - feature.decorate(ConfiguredFeatures.Decorators.SQUARE_HEIGHTMAP).repeatRandomly(1)); - def.addFeature(Feature.VEGETAL_DECORATION, feature); + feature = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, feature.decorated(Features.Decorators.HEIGHTMAP_SQUARE).countRandom(1)); + def.addFeature(Decoration.VEGETAL_DECORATION, feature); } // Grasses and other features for (int i = 2; i < vegetal.size(); i++) { getter = vegetal.get(i); ConfiguredFeature feature = getter.get(); - def.addFeature(Feature.VEGETAL_DECORATION, feature); + def.addFeature(Decoration.VEGETAL_DECORATION, feature); } } - - def.addFeature(EndFeatures.PURPLE_POLYPORE).addFeature(BYGFeatures.IVIS_MOSS_WOOD) - .addFeature(BYGFeatures.IVIS_MOSS).addFeature(BYGFeatures.IVIS_VINE) - .addFeature(BYGFeatures.IVIS_SPROUT); - + + def.addFeature(EndFeatures.PURPLE_POLYPORE) + .addFeature(BYGFeatures.IVIS_MOSS_WOOD) + .addFeature(BYGFeatures.IVIS_MOSS) + .addFeature(BYGFeatures.IVIS_VINE) + .addFeature(BYGFeatures.IVIS_SPROUT); + return def; } } diff --git a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java index 9e9d790f..ee76db67 100644 --- a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java @@ -2,16 +2,14 @@ package ru.betterend.integration.byg.features; import java.util.List; import java.util.Random; - -import com.google.common.base.Function; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; -import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; +import com.google.common.base.Function; +import com.mojang.math.Vector3f; import ru.betterend.integration.Integrations; import ru.betterend.registry.EndTags; import ru.betterend.util.MHelper; @@ -23,7 +21,7 @@ public class BigEtherTreeFeature extends DefaultFeature { @Override public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) return false; BlockState log = Integrations.BYG.getDefaultState("ether_log"); @@ -33,7 +31,7 @@ public class BigEtherTreeFeature extends DefaultFeature { return log; }; Function replace = (state) -> { - return state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) + return state.is(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) || state.getMaterial().isReplaceable(); }; @@ -51,7 +49,7 @@ public class BigEtherTreeFeature extends DefaultFeature { List branch = SplineHelper.makeSpline(0, 0, 0, length, 0, 0, points < 2 ? 2 : points); SplineHelper.powerOffset(branch, length, 2F); int rotCount = MHelper.randRange(5, 7, random); - // float startRad = Mth.lerp(splinePos, 2.3F, 0.8F) * 0.8F; + // float startRad = MathHelper.lerp(splinePos, 2.3F, 0.8F) * 0.8F; Vector3f start = SplineHelper.getPos(trunk, splinePos * (trunk.size() - 1)); for (int j = 0; j < rotCount; j++) { float angle = startAngle + (float) j / rotCount * MHelper.PI2; @@ -65,7 +63,7 @@ public class BigEtherTreeFeature extends DefaultFeature { } sdf.setReplaceFunction((state) -> { - return state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) + return state.is(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) || state.getMaterial().isReplaceable(); }).addPostProcess((info) -> { if (info.getState().equals(log) && (!info.getStateUp().equals(log) || !info.getStateDown().equals(log))) { @@ -77,7 +75,7 @@ public class BigEtherTreeFeature extends DefaultFeature { return true; } - // private void makeLeavesSphere(WorldGenLevel world, BlockPos pos, + // private void makeLeavesSphere(StructureWorldAccess world, BlockPos pos, // BlockState leaves, Function ignore) { // // } diff --git a/src/main/java/ru/betterend/integration/byg/features/GreatNightshadeTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/GreatNightshadeTreeFeature.java index 91501993..fc0b8bf4 100644 --- a/src/main/java/ru/betterend/integration/byg/features/GreatNightshadeTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/GreatNightshadeTreeFeature.java @@ -2,21 +2,19 @@ package ru.betterend.integration.byg.features; import java.util.List; import java.util.Random; - -import com.google.common.base.Function; -import com.google.common.collect.Lists; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.LeavesBlock; -import net.minecraft.world.level.material.Material; -import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; +import com.google.common.base.Function; +import com.google.common.collect.Lists; +import com.mojang.math.Vector3f; import ru.betterend.integration.Integrations; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; @@ -37,20 +35,20 @@ public class GreatNightshadeTreeFeature extends DefaultFeature { @Override public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) return false; BlockState log = Integrations.BYG.getDefaultState("nightshade_log"); BlockState wood = Integrations.BYG.getDefaultState("nightshade_wood"); - BlockState leaves = Integrations.BYG.getDefaultState("nightshade_leaves").with(LeavesBlock.DISTANCE, 1); + BlockState leaves = Integrations.BYG.getDefaultState("nightshade_leaves").setValue(LeavesBlock.DISTANCE, 1); BlockState leaves_flower = Integrations.BYG.getDefaultState("flowering_nightshade_leaves") - .with(LeavesBlock.DISTANCE, 1); + .setValue(LeavesBlock.DISTANCE, 1); Function splinePlacer = (bpos) -> { return log; }; Function replace = (state) -> { - return state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) + return state.is(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) || state.getMaterial().isReplaceable(); }; Function post = (info) -> { @@ -78,7 +76,7 @@ public class GreatNightshadeTreeFeature extends DefaultFeature { for (int i = 0; i < count; i++) { float scale = (float) (count - i) / count * 15; Vector3f offset = SplineHelper.getPos(trunk, (float) i / count * delta + start); - if (offset.getY() > max) { + if (offset.y() > max) { break; } List branch = SplineHelper.copySpline(BRANCH); @@ -98,13 +96,13 @@ public class GreatNightshadeTreeFeature extends DefaultFeature { sdf.setReplaceFunction(replace).addPostProcess(post).fillRecursive(world, pos); Vector3f last = SplineHelper.getPos(trunk, trunk.size() - 1.75F); for (int y = 0; y < 8; y++) { - BlockPos p = pos.offset(last.getX() + 0.5, last.getY() + y, last.getZ() + 0.5); + BlockPos p = pos.offset(last.x() + 0.5, last.y() + y, last.z() + 0.5); BlocksHelper.setWithoutUpdate(world, p, y == 4 ? wood : log); } for (int y = 0; y < 16; y++) { - BlockPos p = pos.offset(last.getX() + 0.5, last.getY() + y, last.getZ() + 0.5); - if (world.isAir(p)) { + BlockPos p = pos.offset(last.x() + 0.5, last.y() + y, last.z() + 0.5); + if (world.isEmptyBlock(p)) { BlocksHelper.setWithoutUpdate(world, p, leaves); } float radius = (1 - y / 16F) * 3F; @@ -115,8 +113,8 @@ public class GreatNightshadeTreeFeature extends DefaultFeature { for (int z = -rad; z <= rad; z++) { int z2 = z * z; if (x2 + z2 < radius - random.nextFloat() * rad) { - BlockPos lp = p.add(x, 0, z); - if (world.isAir(lp)) { + BlockPos lp = p.offset(x, 0, z); + if (world.isEmptyBlock(lp)) { BlocksHelper.setWithoutUpdate(world, lp, leaves); } } @@ -142,7 +140,7 @@ public class GreatNightshadeTreeFeature extends DefaultFeature { if (state.getBlock() instanceof LeavesBlock) { int distance = state.getValue(LeavesBlock.DISTANCE); if (d < distance) { - info.setState(mut, state.with(LeavesBlock.DISTANCE, d)); + info.setState(mut, state.setValue(LeavesBlock.DISTANCE, d)); } } } @@ -154,7 +152,7 @@ public class GreatNightshadeTreeFeature extends DefaultFeature { }; Function leavesPost2 = (info) -> { if (info.getState().getBlock() instanceof LeavesBlock) { - int distance = info.getState().get(LeavesBlock.DISTANCE); + int distance = info.getState().getValue(LeavesBlock.DISTANCE); if (distance > MHelper.randRange(2, 4, random)) { return Blocks.AIR.defaultBlockState(); } @@ -168,7 +166,7 @@ public class GreatNightshadeTreeFeature extends DefaultFeature { } } if (random.nextInt(8) == 0) { - return leaves_flower.with(LeavesBlock.DISTANCE, distance); + return leaves_flower.setValue(LeavesBlock.DISTANCE, distance); } } return info.getState(); diff --git a/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java index 069e0f9b..f4e03327 100644 --- a/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java @@ -2,21 +2,19 @@ package ru.betterend.integration.byg.features; import java.util.List; import java.util.Random; - -import com.google.common.base.Function; -import com.google.common.collect.Lists; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.LeavesBlock; -import net.minecraft.world.level.material.Material; -import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; +import com.google.common.base.Function; +import com.google.common.collect.Lists; +import com.mojang.math.Vector3f; import ru.betterend.integration.Integrations; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; @@ -37,7 +35,7 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { @Override public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) return false; BlockState log = Integrations.BYG.getDefaultState("nightshade_log"); @@ -49,7 +47,7 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { return log; }; Function replace = (state) -> { - return state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) + return state.is(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) || state.getMaterial().isReplaceable(); }; Function post = (info) -> { @@ -78,7 +76,7 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { for (int i = 0; i < count; i++) { float scale = (float) (count - i) / count * 15; Vector3f offset = SplineHelper.getPos(trunk, (float) i / count * delta + start); - if (offset.getY() > max) { + if (offset.y() > max) { break; } List branch = SplineHelper.copySpline(BRANCH); @@ -97,13 +95,13 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { sdf.setReplaceFunction(replace).addPostProcess(post).fillRecursive(world, pos); Vector3f last = SplineHelper.getPos(trunk, trunk.size() - 1.35F); for (int y = 0; y < 8; y++) { - BlockPos p = pos.offset(last.getX() + 0.5, last.getY() + y, last.getZ() + 0.5); + BlockPos p = pos.offset(last.x() + 0.5, last.y() + y, last.z() + 0.5); BlocksHelper.setWithoutUpdate(world, p, y == 4 ? wood : log); } for (int y = 0; y < 16; y++) { - BlockPos p = pos.offset(last.getX() + 0.5, last.getY() + y, last.getZ() + 0.5); - if (world.isAir(p)) { + BlockPos p = pos.offset(last.x() + 0.5, last.y() + y, last.z() + 0.5); + if (world.isEmptyBlock(p)) { BlocksHelper.setWithoutUpdate(world, p, leaves); } float radius = (1 - y / 16F) * 3F; @@ -114,8 +112,8 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { for (int z = -rad; z <= rad; z++) { int z2 = z * z; if (x2 + z2 < radius - random.nextFloat() * rad) { - BlockPos lp = p.add(x, 0, z); - if (world.isAir(lp)) { + BlockPos lp = p.offset(x, 0, z); + if (world.isEmptyBlock(lp)) { BlocksHelper.setWithoutUpdate(world, lp, leaves); } } @@ -141,7 +139,7 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { if (state.getBlock() instanceof LeavesBlock) { int distance = state.getValue(LeavesBlock.DISTANCE); if (d < distance) { - info.setState(mut, state.with(LeavesBlock.DISTANCE, d)); + info.setState(mut, state.setValue(LeavesBlock.DISTANCE, d)); } } } @@ -153,7 +151,7 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { }; Function leavesPost2 = (info) -> { if (info.getState().getBlock() instanceof LeavesBlock) { - int distance = info.getState().get(LeavesBlock.DISTANCE); + int distance = info.getState().getValue(LeavesBlock.DISTANCE); if (distance > MHelper.randRange(2, 4, random)) { return Blocks.AIR.defaultBlockState(); } @@ -167,7 +165,7 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { } } if (random.nextInt(8) == 0) { - return leaves_flower.with(LeavesBlock.DISTANCE, distance); + return leaves_flower.setValue(LeavesBlock.DISTANCE, distance); } } return info.getState(); diff --git a/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java index 0252921e..e7ed034a 100644 --- a/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java @@ -3,19 +3,17 @@ package ru.betterend.integration.byg.features; import java.util.List; import java.util.Random; import java.util.function.Function; - -import com.google.common.collect.Lists; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.Material; -import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; -import net.minecraft.world.phys.AABB; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; +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.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.AABB; +import com.google.common.collect.Lists; +import com.mojang.math.Vector3f; import ru.betterend.integration.Integrations; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndTags; @@ -38,9 +36,9 @@ public class OldBulbisTreeFeature extends DefaultFeature { @Override public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) return false; - if (!world.getBlockState(pos.down(4)).getBlock().isIn(EndTags.GEN_TERRAIN)) + if (!world.getBlockState(pos.below(4)).getBlock().is(EndTags.GEN_TERRAIN)) return false; BlockState stem = Integrations.BYG.getDefaultState("bulbis_stem"); @@ -50,7 +48,7 @@ public class OldBulbisTreeFeature extends DefaultFeature { BlockState glow = Integrations.BYG.getDefaultState("purple_shroomlight"); Function replacement = (state) -> { - if (state.equals(stem) || state.equals(wood) || state.isIn(EndTags.END_GROUND) + if (state.equals(stem) || state.equals(wood) || state.is(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT)) { return true; } @@ -67,7 +65,7 @@ public class OldBulbisTreeFeature extends DefaultFeature { SDF sdf = null; int x1 = ((pos.getX() >> 4) << 4) - 16; int z1 = ((pos.getZ() >> 4) << 4) - 16; - Box limits = new Box(x1, pos.getY() - 5, z1, x1 + 47, pos.getY() + size * 2, z1 + 47); + AABB limits = new AABB(x1, pos.getY() - 5, z1, x1 + 47, pos.getY() + size * 2, z1 + 47); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2 + MHelper.randRange(0, var, random) + start; List spline = SplineHelper.copySpline(SPLINE); @@ -140,12 +138,12 @@ public class OldBulbisTreeFeature extends DefaultFeature { List side = SplineHelper.copySpline(SIDE); SplineHelper.rotateSpline(side, angle); SplineHelper.scale(side, scale * radius); - BlockPos p = pos.offset(point.getX() + 0.5F, point.getY() + 0.5F, point.getZ() + 0.5F); + BlockPos p = pos.offset(point.x() + 0.5F, point.y() + 0.5F, point.z() + 0.5F); SplineHelper.fillSplineForce(side, world, wood, p, replacement); } } - sphere.fillArea(world, pos, new Box(pos.up((int) offsetY)).expand(radius * 1.3F)); + sphere.fillArea(world, pos, new AABB(pos.above((int) offsetY)).inflate(radius * 1.3F)); } private void makeRoots(WorldGenLevel world, BlockPos pos, float radius, Random random, BlockState wood, @@ -159,7 +157,7 @@ public class OldBulbisTreeFeature extends DefaultFeature { SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); Vector3f last = branch.get(branch.size() - 1); - if (world.getBlockState(pos.offset(last.getX(), last.getY(), last.getZ())).isIn(EndTags.GEN_TERRAIN)) { + if (world.getBlockState(pos.offset(last.x(), last.y(), last.z())).is(EndTags.GEN_TERRAIN)) { SplineHelper.fillSpline(branch, world, wood, pos, replacement); } } diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java index fa83d526..285f0be4 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java @@ -6,7 +6,7 @@ import java.util.List; import org.jetbrains.annotations.NotNull; import com.google.common.collect.Lists; - +import com.mojang.blaze3d.vertex.PoseStack; import it.unimi.dsi.fastutil.ints.IntList; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; @@ -16,9 +16,8 @@ import me.shedaniel.rei.api.widgets.Widgets; import me.shedaniel.rei.gui.entries.RecipeEntry; import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; import me.shedaniel.rei.gui.widget.Widget; -import net.minecraft.client.gui.DrawableHelper; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.TranslatableText; +import net.minecraft.client.gui.GuiComponent; +import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.registry.EndBlocks; @@ -33,14 +32,14 @@ public class REIAlloyingCategory implements TransferRecipeCategory setupDisplay(REIAlloyingDisplay display, Rectangle bounds) { Point startPoint = new Point(bounds.getCenterX() - 41, bounds.y + 10); @@ -49,49 +48,39 @@ public class REIAlloyingCategory implements TransferRecipeCategory widgets = Lists.newArrayList(); widgets.add(Widgets.createRecipeBase(bounds)); widgets.add(Widgets.createResultSlotBackground(new Point(startPoint.x + 61, startPoint.y + 9))); - widgets.add( - Widgets.createBurningFire(new Point(startPoint.x - 9, startPoint.y + 20)).animationDurationMS(10000)); - widgets.add(Widgets - .createLabel(new Point(bounds.x + bounds.width - 5, bounds.y + 5), new TranslatableText( - "category.rei.cooking.time&xp", df.format(display.getXp()), df.format(smeltTime / 20D))) - .noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); - widgets.add( - Widgets.createArrow(new Point(startPoint.x + 24, startPoint.y + 8)).animationDurationTicks(smeltTime)); + widgets.add(Widgets.createBurningFire(new Point(startPoint.x - 9, startPoint.y + 20)).animationDurationMS(10000)); + widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width - 5, bounds.y + 5), + new TranslatableComponent("category.rei.cooking.time&xp", df.format(display.getXp()), df.format(smeltTime / 20D))).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); + widgets.add(Widgets.createArrow(new Point(startPoint.x + 24, startPoint.y + 8)).animationDurationTicks(smeltTime)); List> inputEntries = display.getInputEntries(); - widgets.add(Widgets.createSlot(new Point(startPoint.x - 20, startPoint.y + 1)).entries(inputEntries.get(0)) - .markInput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x - 20, startPoint.y + 1)).entries(inputEntries.get(0)).markInput()); if (inputEntries.size() > 1) { - widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(inputEntries.get(1)) - .markInput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(inputEntries.get(1)).markInput()); } else { - widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(Lists.newArrayList()) - .markInput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(Lists.newArrayList()).markInput()); } - widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 9)) - .entries(display.getResultingEntries().get(0)).disableBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 9)).entries(display.getResultingEntries().get(0)).disableBackground().markOutput()); return widgets; } @Override - public void renderRedSlots(MatrixStack matrices, List widgets, Rectangle bounds, REIAlloyingDisplay display, + public void renderRedSlots(PoseStack matrices, List widgets, Rectangle bounds, REIAlloyingDisplay display, IntList redSlots) { Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 27); - matrices.push(); + matrices.pushPose(); matrices.translate(0, 0, 400); if (redSlots.contains(0)) { - DrawableHelper.fill(matrices, startPoint.x - 20, startPoint.y + 1, startPoint.x - 20 + 16, - startPoint.y + 1 + 16, 1090453504); - DrawableHelper.fill(matrices, startPoint.x + 1, startPoint.y + 1, startPoint.x + 1 + 16, - startPoint.y + 1 + 16, 1090453504); + GuiComponent.fill(matrices, startPoint.x - 20, startPoint.y + 1, startPoint.x - 20 + 16, startPoint.y + 1 + 16, 1090453504); + GuiComponent.fill(matrices, startPoint.x + 1, startPoint.y + 1, startPoint.x + 1 + 16, startPoint.y + 1 + 16, 1090453504); } - matrices.pop(); + matrices.popPose(); } - + @Override public @NotNull RecipeEntry getSimpleRenderer(REIAlloyingDisplay recipe) { return SimpleRecipeEntry.from(recipe.getInputEntries(), recipe.getResultingEntries()); } - + @Override public int getDisplayHeight() { return 49; diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingDisplay.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingDisplay.java index 4e3f5f22..5937c021 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAlloyingDisplay.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingDisplay.java @@ -10,56 +10,56 @@ import org.jetbrains.annotations.NotNull; import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.TransferRecipeDisplay; import me.shedaniel.rei.server.ContainerInfo; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.Item; import net.minecraft.world.item.crafting.BlastingRecipe; import net.minecraft.world.item.crafting.Recipe; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.Formatting; -import net.minecraft.resources.ResourceLocation; import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; import ru.betterend.recipe.builders.AlloyingRecipe; public class REIAlloyingDisplay implements TransferRecipeDisplay { private static List fuel; - + private Recipe recipe; private List> input; private List output; private float xp; private double smeltTime; - + public REIAlloyingDisplay(AlloyingRecipe recipe) { this.recipe = recipe; - this.input = EntryStack.ofIngredients(recipe.getPreviewInputs()); - this.output = Collections.singletonList(EntryStack.create(recipe.getOutput())); + this.input = EntryStack.ofIngredients(recipe.getIngredients()); + this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem())); this.xp = recipe.getExperience(); this.smeltTime = recipe.getSmeltTime(); } - + public REIAlloyingDisplay(BlastingRecipe recipe) { this.recipe = recipe; - this.input = EntryStack.ofIngredients(recipe.getPreviewInputs()); - this.output = Collections.singletonList(EntryStack.create(recipe.getOutput())); + this.input = EntryStack.ofIngredients(recipe.getIngredients()); + this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem())); this.xp = recipe.getExperience(); - this.smeltTime = recipe.getCookTime(); + this.smeltTime = recipe.getCookingTime(); } - + public static List getFuel() { return fuel; } - + @Override public @NotNull Optional getRecipeLocation() { return Optional.ofNullable(recipe).map(Recipe::getId); } - + @Override public @NotNull List> getInputEntries() { return this.input; } - + @Override public @NotNull List> getResultingEntries() { return Collections.singletonList(output); @@ -69,20 +69,20 @@ public class REIAlloyingDisplay implements TransferRecipeDisplay { public @NotNull ResourceLocation getRecipeCategory() { return AlloyingRecipe.ID; } - + @Override public @NotNull List> getRequiredEntries() { return this.input; } - + public float getXp() { return this.xp; } - + public double getSmeltTime() { return this.smeltTime; } - + public Optional> getOptionalRecipe() { return Optional.ofNullable(recipe); } @@ -98,17 +98,14 @@ public class REIAlloyingDisplay implements TransferRecipeDisplay { } @Override - public List> getOrganisedInputEntries(ContainerInfo containerInfo, - ScreenHandler container) { + public List> getOrganisedInputEntries(ContainerInfo containerInfo, AbstractContainerMenu container) { return this.input; } - + static { - fuel = EndStoneSmelterBlockEntity.availableFuels().keySet().stream().map(Item::getDefaultStack) - .map(EntryStack::create) - .map(e -> e.setting(EntryStack.Properties.TOOLTIP_APPEND_EXTRA, - stack -> Collections.singletonList( - new TranslatableText("category.rei.smelting.fuel").formatted(Formatting.YELLOW)))) - .collect(Collectors.toList()); + fuel = EndStoneSmelterBlockEntity.availableFuels().keySet().stream() + .map(Item::getDefaultInstance).map(EntryStack::create) + .map(e -> e.setting(EntryStack.Settings.TOOLTIP_APPEND_EXTRA, stack -> Collections.singletonList(new TranslatableComponent("category.rei.smelting.fuel") + .withStyle(ChatFormatting.YELLOW)))).collect(Collectors.toList()); } } diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java index 7b5b8195..10c7564c 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java @@ -7,7 +7,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import com.google.common.collect.Lists; - +import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.EntryStack; @@ -18,11 +18,10 @@ import me.shedaniel.rei.api.widgets.Widgets; import me.shedaniel.rei.gui.entries.RecipeEntry; import me.shedaniel.rei.gui.widget.Widget; import net.minecraft.client.Minecraft; -import net.minecraft.client.resource.language.I18n; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.world.item.Items; -import net.minecraft.text.TranslatableText; +import net.minecraft.client.resources.language.I18n; +import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Items; public class REIAlloyingFuelCategory implements RecipeCategory { private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#.##"); @@ -34,7 +33,7 @@ public class REIAlloyingFuelCategory implements RecipeCategory widgets = Lists.newArrayList(); widgets.add(Widgets.createRecipeBase(bounds)); - widgets.add(Widgets - .createLabel(new Point(bounds.x + 26, bounds.getMaxY() - 15), - new TranslatableText("category.rei.fuel.time", burnTime)) + widgets.add(Widgets.createLabel(new Point(bounds.x + 26, bounds.getMaxY() - 15), new TranslatableComponent("category.rei.fuel.time", burnTime)) .color(0xFF404040, 0xFFBBBBBB).noShadow().leftAligned()); - widgets.add(Widgets.createBurningFire(new Point(bounds.x + 6, startPoint.y + 1)) - .animationDurationTicks(recipeDisplay.getFuelTime())); - widgets.add(Widgets.createSlot(new Point(bounds.x + 6, startPoint.y + 18)) - .entries(recipeDisplay.getInputEntries().get(0)).markInput()); + widgets.add(Widgets.createBurningFire(new Point(bounds.x + 6, startPoint.y + 1)).animationDurationTicks(recipeDisplay.getFuelTime())); + widgets.add(Widgets.createSlot(new Point(bounds.x + 6, startPoint.y + 18)).entries(recipeDisplay.getInputEntries().get(0)).markInput()); return widgets; } @Override public @NotNull RecipeEntry getSimpleRenderer(REIAlloyingFuelDisplay recipe) { - Slot slot = Widgets.createSlot(new Point(0, 0)).entries(recipe.getInputEntries().get(0)).disableBackground() - .disableHighlight(); + Slot slot = Widgets.createSlot(new Point(0, 0)).entries(recipe.getInputEntries().get(0)).disableBackground().disableHighlight(); String burnItems = DECIMAL_FORMAT.format(recipe.getFuelTime() / 200d); return new RecipeEntry() { - private TranslatableText text = new TranslatableText("category.rei.fuel.time_short.items", burnItems); + private TranslatableComponent text = new TranslatableComponent("category.rei.fuel.time_short.items", burnItems); @Override public int getHeight() { @@ -86,12 +80,11 @@ public class REIAlloyingFuelCategory implements RecipeCategory @Override public @NotNull String getCategoryName() { - return LangUtil.translate(Blocks.ANVIL.getTranslationKey()); + return LangUtil.translate(Blocks.ANVIL.getDescriptionId()); } - + @Override public @NotNull EntryStack getLogo() { return REIPlugin.ANVILS[0]; } - + @Override public @NotNull List setupDisplay(REIAnvilDisplay display, Rectangle bounds) { Point startPoint = new Point(bounds.getCenterX() - 41, bounds.y + 10); @@ -65,40 +64,34 @@ public class REIAnvilCategory implements TransferRecipeCategory }).collect(Collectors.toList()); materials.forEach(entryStack -> entryStack.setAmount(display.getInputCount())); widgets.add(Widgets.createArrow(new Point(x + 24, y + 4))); - widgets.add(Widgets - .createLabel(new Point(bounds.x + bounds.width - 7, bounds.y + bounds.height - 15), - new TranslatableText("category.rei.damage.amount&dmg", display.getDamage())) - .noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); + widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width - 7, bounds.y + bounds.height - 15), + new TranslatableComponent("category.rei.damage.amount&dmg", display.getDamage())).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); widgets.add(Widgets.createSlot(new Point(x - 20, y + 4)).entries(materials).markInput()); widgets.add(Widgets.createSlot(new Point(x + 1, y + 4)).entries(inputEntries.get(0)).markInput()); - widgets.add(Widgets.createSlot(new Point(x + 61, y + 5)).entries(display.getResultingEntries().get(0)) - .disableBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(x + 61, y + 5)).entries(display.getResultingEntries().get(0)).disableBackground().markOutput()); widgets.add(Widgets.createSlot(new Point(x - 9, y + 25)).entries(anvils)); return widgets; } @Override - public void renderRedSlots(MatrixStack matrices, List widgets, Rectangle bounds, REIAnvilDisplay display, + public void renderRedSlots(PoseStack matrices, List widgets, Rectangle bounds, REIAnvilDisplay display, IntList redSlots) { Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 27); - matrices.push(); + matrices.pushPose(); matrices.translate(0, 0, 400); if (redSlots.contains(0)) { - DrawableHelper.fill(matrices, startPoint.x - 20, startPoint.y + 3, startPoint.x - 20 + 16, - startPoint.y + 3 + 16, 1090453504); - DrawableHelper.fill(matrices, startPoint.x + 1, startPoint.y + 3, startPoint.x + 1 + 16, - startPoint.y + 3 + 16, 1090453504); + GuiComponent.fill(matrices, startPoint.x - 20, startPoint.y + 3, startPoint.x - 20 + 16, startPoint.y + 3 + 16, 1090453504); + GuiComponent.fill(matrices, startPoint.x + 1, startPoint.y + 3, startPoint.x + 1 + 16, startPoint.y + 3 + 16, 1090453504); } - matrices.pop(); + matrices.popPose(); } - + @Override public @NotNull RecipeEntry getSimpleRenderer(REIAnvilDisplay recipe) { - return SimpleRecipeEntry.from(Collections.singletonList(recipe.getInputEntries().get(0)), - recipe.getResultingEntries()); + return SimpleRecipeEntry.from(Collections.singletonList(recipe.getInputEntries().get(0)), recipe.getResultingEntries()); } - + @Override public int getDisplayHeight() { return 60; diff --git a/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java b/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java index 2da35b4d..3ca2f929 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java @@ -9,23 +9,23 @@ import org.jetbrains.annotations.NotNull; import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.TransferRecipeDisplay; import me.shedaniel.rei.server.ContainerInfo; -import net.minecraft.world.item.crafting.Recipe; -import net.minecraft.screen.ScreenHandler; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.crafting.Recipe; import ru.betterend.recipe.builders.AnvilRecipe; public class REIAnvilDisplay implements TransferRecipeDisplay { - + private final AnvilRecipe recipe; private final List> input; private final List output; - + public REIAnvilDisplay(AnvilRecipe recipe) { this.recipe = recipe; - this.input = EntryStack.ofIngredients(recipe.getPreviewInputs()); - this.output = Collections.singletonList(EntryStack.create(recipe.getOutput())); + this.input = EntryStack.ofIngredients(recipe.getIngredients()); + this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem())); } - + public int getDamage() { return recipe.getDamage(); } @@ -37,7 +37,7 @@ public class REIAnvilDisplay implements TransferRecipeDisplay { public int getAnvilLevel() { return recipe.getAnvilLevel(); } - + @Override public @NotNull Optional getRecipeLocation() { return Optional.ofNullable(recipe).map(Recipe::getId); @@ -47,7 +47,7 @@ public class REIAnvilDisplay implements TransferRecipeDisplay { public @NotNull List> getInputEntries() { return this.input; } - + @Override public @NotNull List> getResultingEntries() { return Collections.singletonList(output); @@ -57,7 +57,7 @@ public class REIAnvilDisplay implements TransferRecipeDisplay { public @NotNull ResourceLocation getRecipeCategory() { return REIPlugin.SMITHING; } - + @Override public @NotNull List> getRequiredEntries() { return input; @@ -74,8 +74,8 @@ public class REIAnvilDisplay implements TransferRecipeDisplay { } @Override - public List> getOrganisedInputEntries(ContainerInfo containerInfo, - ScreenHandler container) { + public List> getOrganisedInputEntries(ContainerInfo containerInfo, + AbstractContainerMenu container) { return input; } } diff --git a/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java index d7ea7884..210d838f 100644 --- a/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java @@ -5,7 +5,7 @@ import java.util.List; import org.jetbrains.annotations.NotNull; import com.google.common.collect.Lists; - +import com.mojang.blaze3d.vertex.PoseStack; import it.unimi.dsi.fastutil.ints.IntList; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; @@ -15,8 +15,7 @@ import me.shedaniel.rei.api.widgets.Widgets; import me.shedaniel.rei.gui.entries.RecipeEntry; import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; import me.shedaniel.rei.gui.widget.Widget; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.TranslatableText; +import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.recipe.builders.InfusionRecipe; @@ -24,7 +23,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.util.LangUtil; public class REIInfusionCategory implements TransferRecipeCategory { - + private final static ResourceLocation BACKGROUND = BetterEnd.makeID("textures/gui/rei_infusion.png"); @Override @@ -34,19 +33,19 @@ public class REIInfusionCategory implements TransferRecipeCategory setupDisplay(REIInfusionDisplay display, Rectangle bounds) { Point centerPoint = new Point(bounds.getCenterX() - 34, bounds.getCenterY() - 2); @@ -56,36 +55,24 @@ public class REIInfusionCategory implements TransferRecipeCategory> outputEntries = display.getResultingEntries(); widgets.add(Widgets.createTexturedWidget(BACKGROUND, bounds.x, bounds.y, 0, 0, 150, 104, 150, 104)); widgets.add(Widgets.createSlot(centerPoint).entries(inputEntries.get(0)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x, centerPoint.y - 28)).entries(inputEntries.get(1)) - .disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x + 28, centerPoint.y)).entries(inputEntries.get(3)) - .disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x, centerPoint.y + 28)).entries(inputEntries.get(5)) - .disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x - 28, centerPoint.y)).entries(inputEntries.get(7)) - .disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x + 24, centerPoint.y - 24)).entries(inputEntries.get(2)) - .disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x + 24, centerPoint.y + 24)).entries(inputEntries.get(4)) - .disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x - 24, centerPoint.y + 24)).entries(inputEntries.get(6)) - .disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x - 24, centerPoint.y - 24)).entries(inputEntries.get(8)) - .disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x + 80, centerPoint.y)).entries(outputEntries.get(0)) - .disableBackground().markOutput()); - widgets.add(Widgets - .createLabel(new Point(bounds.getMaxX() - 5, bounds.y + 6), - new TranslatableText("category.rei.infusion.time&val", display.getInfusionTime())) + widgets.add(Widgets.createSlot(new Point(centerPoint.x, centerPoint.y - 28)).entries(inputEntries.get(1)).disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x + 28, centerPoint.y)).entries(inputEntries.get(3)).disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x, centerPoint.y + 28)).entries(inputEntries.get(5)).disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x - 28, centerPoint.y)).entries(inputEntries.get(7)).disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x + 24, centerPoint.y - 24)).entries(inputEntries.get(2)).disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x + 24, centerPoint.y + 24)).entries(inputEntries.get(4)).disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x - 24, centerPoint.y + 24)).entries(inputEntries.get(6)).disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x - 24, centerPoint.y - 24)).entries(inputEntries.get(8)).disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x + 80, centerPoint.y)).entries(outputEntries.get(0)).disableBackground().markOutput()); + widgets.add(Widgets.createLabel(new Point(bounds.getMaxX() - 5, bounds.y + 6), new TranslatableComponent("category.rei.infusion.time&val", display.getInfusionTime())) .noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); return widgets; } @Override - public void renderRedSlots(MatrixStack matrices, List widgets, Rectangle bounds, REIInfusionDisplay display, - IntList redSlots) { - } - + public void renderRedSlots(PoseStack matrices, List widgets, Rectangle bounds, + REIInfusionDisplay display, IntList redSlots) {} + @Override public int getDisplayHeight() { return 104; diff --git a/src/main/java/ru/betterend/integration/rei/REIInfusionDisplay.java b/src/main/java/ru/betterend/integration/rei/REIInfusionDisplay.java index 86313c99..d8411bc9 100644 --- a/src/main/java/ru/betterend/integration/rei/REIInfusionDisplay.java +++ b/src/main/java/ru/betterend/integration/rei/REIInfusionDisplay.java @@ -11,34 +11,34 @@ import com.google.common.collect.Lists; import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.TransferRecipeDisplay; import me.shedaniel.rei.server.ContainerInfo; -import net.minecraft.world.item.crafting.Recipe; -import net.minecraft.screen.ScreenHandler; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.crafting.Recipe; import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.recipe.builders.InfusionRecipe; public class REIInfusionDisplay implements TransferRecipeDisplay { - + private final InfusionRecipe recipe; private final List> input; private final List output; private final int time; - + public REIInfusionDisplay(InfusionRecipe recipe) { this.recipe = recipe; this.input = Lists.newArrayList(); - this.output = Collections.singletonList(EntryStack.create(recipe.getOutput())); + this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem())); this.time = recipe.getInfusionTime(); - - recipe.getPreviewInputs().forEach(ingredient -> { + + recipe.getIngredients().forEach(ingredient -> { input.add(EntryStack.ofIngredient(ingredient)); }); } - + public int getInfusionTime() { return this.time; } - + @Override public @NotNull Optional getRecipeLocation() { return Optional.ofNullable(recipe).map(Recipe::getId); @@ -48,7 +48,7 @@ public class REIInfusionDisplay implements TransferRecipeDisplay { public @NotNull List> getInputEntries() { return this.input; } - + @Override public @NotNull List> getResultingEntries() { return Collections.singletonList(output); @@ -58,7 +58,7 @@ public class REIInfusionDisplay implements TransferRecipeDisplay { public @NotNull ResourceLocation getRecipeCategory() { return AlloyingRecipe.ID; } - + @Override public @NotNull List> getRequiredEntries() { return this.input; @@ -75,8 +75,7 @@ public class REIInfusionDisplay implements TransferRecipeDisplay { } @Override - public List> getOrganisedInputEntries(ContainerInfo containerInfo, - ScreenHandler container) { + public List> getOrganisedInputEntries(ContainerInfo containerInfo, AbstractContainerMenu container) { return this.input; } } diff --git a/src/main/java/ru/betterend/integration/rei/REIPlugin.java b/src/main/java/ru/betterend/integration/rei/REIPlugin.java index 3232fd8e..8ac01152 100644 --- a/src/main/java/ru/betterend/integration/rei/REIPlugin.java +++ b/src/main/java/ru/betterend/integration/rei/REIPlugin.java @@ -12,10 +12,10 @@ import me.shedaniel.rei.plugin.DefaultPlugin; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.impl.content.registry.FuelRegistryImpl; -import net.minecraft.world.level.block.Blocks; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.crafting.BlastingRecipe; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Blocks; import ru.betterend.BetterEnd; import ru.betterend.blocks.basis.EndAnvilBlock; import ru.betterend.blocks.basis.EndFurnaceBlock; @@ -43,9 +43,9 @@ public class REIPlugin implements REIPluginV0 { public ResourceLocation getPluginIdentifier() { return PLUGIN_ID; } - + @Override - public void registerRecipeDisplays(RecipeHelper recipeHelper) { + public void registerRecipeDisplays(RecipeHelper recipeHelper) { recipeHelper.registerRecipes(ALLOYING, AlloyingRecipe.class, REIAlloyingDisplay::new); recipeHelper.registerRecipes(ALLOYING, BlastingRecipe.class, REIAlloyingDisplay::new); recipeHelper.registerRecipes(SMITHING, AnvilRecipe.class, REIAnvilDisplay::new); @@ -56,7 +56,7 @@ public class REIPlugin implements REIPluginV0 { } }); } - + @Override public void registerOthers(RecipeHelper recipeHelper) { recipeHelper.registerWorkingStations(ALLOYING_FUEL, END_STONE_SMELTER); @@ -68,12 +68,15 @@ public class REIPlugin implements REIPluginV0 { recipeHelper.registerWorkingStations(DefaultPlugin.SMELTING, FURNACES); recipeHelper.registerWorkingStations(DefaultPlugin.FUEL, FURNACES); - } - + } + @Override public void registerPluginCategories(RecipeHelper recipeHelper) { - recipeHelper.registerCategories(new REIAlloyingFuelCategory(), new REIAlloyingCategory(), - new REIInfusionCategory(), new REIAnvilCategory()); + recipeHelper.registerCategories( + new REIAlloyingFuelCategory(), + new REIAlloyingCategory(), + new REIInfusionCategory(), + new REIAnvilCategory()); } static { diff --git a/src/main/java/ru/betterend/interfaces/IBiomeList.java b/src/main/java/ru/betterend/interfaces/IBiomeList.java index 4dbbfde4..e7546aa6 100644 --- a/src/main/java/ru/betterend/interfaces/IBiomeList.java +++ b/src/main/java/ru/betterend/interfaces/IBiomeList.java @@ -1,7 +1,6 @@ package ru.betterend.interfaces; import java.util.List; - import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.biome.Biome; diff --git a/src/main/java/ru/betterend/interfaces/IColorProvider.java b/src/main/java/ru/betterend/interfaces/IColorProvider.java index 2c0100da..f8b5ba51 100644 --- a/src/main/java/ru/betterend/interfaces/IColorProvider.java +++ b/src/main/java/ru/betterend/interfaces/IColorProvider.java @@ -4,6 +4,7 @@ import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; public interface IColorProvider { - BlockColor getBlockProvider(); + BlockColor getProvider(); + ItemColor getItemProvider(); } diff --git a/src/main/java/ru/betterend/interfaces/IRenderTypeable.java b/src/main/java/ru/betterend/interfaces/IRenderTypeable.java index 96f961ba..1a5c029c 100644 --- a/src/main/java/ru/betterend/interfaces/IRenderTypeable.java +++ b/src/main/java/ru/betterend/interfaces/IRenderTypeable.java @@ -4,5 +4,5 @@ import ru.betterend.client.render.ERenderLayer; public interface IRenderTypeable { - ERenderLayer getRenderLayer(); + public ERenderLayer getRenderLayer(); } diff --git a/src/main/java/ru/betterend/interfaces/TeleportingEntity.java b/src/main/java/ru/betterend/interfaces/TeleportingEntity.java index f339e736..29a6c466 100644 --- a/src/main/java/ru/betterend/interfaces/TeleportingEntity.java +++ b/src/main/java/ru/betterend/interfaces/TeleportingEntity.java @@ -4,8 +4,6 @@ import net.minecraft.core.BlockPos; public interface TeleportingEntity { void beSetExitPos(BlockPos pos); - void beResetExitPos(); - boolean beCanTeleport(); } diff --git a/src/main/java/ru/betterend/item/DrinkItem.java b/src/main/java/ru/betterend/item/DrinkItem.java index 8969fb96..50e4ad1a 100644 --- a/src/main/java/ru/betterend/item/DrinkItem.java +++ b/src/main/java/ru/betterend/item/DrinkItem.java @@ -1,16 +1,16 @@ package ru.betterend.item; -import net.minecraft.advancement.criterion.Criteria; +import net.minecraft.advancements.CriteriaTriggers; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.stats.Stats; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.ItemUsage; +import net.minecraft.world.item.ItemUtils; import net.minecraft.world.item.Items; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.stat.Stats; -import net.minecraft.util.Hand; -import net.minecraft.util.TypedActionResult; -import net.minecraft.util.UseAction; +import net.minecraft.world.item.UseAnim; import net.minecraft.world.level.Level; public class DrinkItem extends PatternedItem { @@ -19,34 +19,34 @@ public class DrinkItem extends PatternedItem { } @Override - public int getMaxUseTime(ItemStack stack) { + public int getUseDuration(ItemStack stack) { return 32; } @Override - public UseAction getUseAction(ItemStack stack) { - return UseAction.DRINK; + public UseAnim getUseAnimation(ItemStack stack) { + return UseAnim.DRINK; } @Override - public TypedActionResult use(Level world, Player user, Hand hand) { - return ItemUsage.consumeHeldItem(world, user, hand); + public InteractionResultHolder use(Level world, Player user, InteractionHand hand) { + return ItemUtils.useDrink(world, user, hand); } @Override - public ItemStack finishUsing(ItemStack stack, Level world, LivingEntity user) { + public ItemStack finishUsingItem(ItemStack stack, Level world, LivingEntity user) { if (user instanceof ServerPlayer) { ServerPlayer serverPlayerEntity = (ServerPlayer) user; - Criteria.CONSUME_ITEM.trigger(serverPlayerEntity, stack); - serverPlayerEntity.incrementStat(Stats.USED.getOrCreateStat(this)); + CriteriaTriggers.CONSUME_ITEM.trigger(serverPlayerEntity, stack); + serverPlayerEntity.awardStat(Stats.ITEM_USED.get(this)); } - if (user instanceof Player && !((Player) user).abilities.creativeMode) { - stack.decrement(1); + if (user instanceof Player && !((Player) user).abilities.instabuild) { + stack.shrink(1); } if (!world.isClientSide) { - user.clearMobEffects(); + user.removeAllEffects(); } return stack.isEmpty() ? new ItemStack(Items.GLASS_BOTTLE) : stack; diff --git a/src/main/java/ru/betterend/item/EnchantedPetalItem.java b/src/main/java/ru/betterend/item/EnchantedPetalItem.java index c34d07d2..27d04935 100644 --- a/src/main/java/ru/betterend/item/EnchantedPetalItem.java +++ b/src/main/java/ru/betterend/item/EnchantedPetalItem.java @@ -11,10 +11,10 @@ public class EnchantedPetalItem extends PatternedItem { } @Override - public boolean hasGlint(ItemStack stack) { + public boolean isFoil(ItemStack stack) { return true; } - + @Override public String getModelPattern(String name) { return Patterns.createJson(Patterns.ITEM_GENERATED, "item/hydralux_petal"); diff --git a/src/main/java/ru/betterend/item/EndArmorItem.java b/src/main/java/ru/betterend/item/EndArmorItem.java index 3c56b9b6..4c98eb68 100644 --- a/src/main/java/ru/betterend/item/EndArmorItem.java +++ b/src/main/java/ru/betterend/item/EndArmorItem.java @@ -1,17 +1,15 @@ package ru.betterend.item; import java.util.UUID; - -import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.Multimap; - import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.AttributeModifier; -import net.minecraft.world.entity.attribute.Attributes; +import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ArmorMaterial; import net.minecraft.world.item.Item; +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Multimap; import ru.betterend.mixin.common.ArmorItemAccessor; import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; @@ -24,8 +22,7 @@ public class EndArmorItem extends ArmorItem implements Patterned { } /** Ensures knockback resistance is actually applied */ - private static void addKnockbackResistance(ArmorItemAccessor accessor, EquipmentSlot slot, - double knockbackResistance) { + private static void addKnockbackResistance(ArmorItemAccessor accessor, EquipmentSlot slot, double knockbackResistance) { if (knockbackResistance == 0) { return; } @@ -37,13 +34,12 @@ public class EndArmorItem extends ArmorItem implements Patterned { return; } - UUID uuid = accessor.be_getModifiers()[slot.getEntitySlotId()]; + UUID uuid = accessor.be_getModifiers()[slot.getIndex()]; // Rebuild attributeModifiers to include knockback resistance ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); builder.putAll(attributeModifiers); - builder.put(Attributes.KNOCKBACK_RESISTANCE, new AttributeModifier(uuid, "Armor knockback resistance", - knockbackResistance, AttributeModifier.Operation.ADDITION)); + builder.put(Attributes.KNOCKBACK_RESISTANCE, new AttributeModifier(uuid, "Armor knockback resistance", knockbackResistance, AttributeModifier.Operation.ADDITION)); accessor.be_setAttributeModifiers(builder.build()); } diff --git a/src/main/java/ru/betterend/item/EndSpawnEggItem.java b/src/main/java/ru/betterend/item/EndSpawnEggItem.java index 419136ec..cf2d2e35 100644 --- a/src/main/java/ru/betterend/item/EndSpawnEggItem.java +++ b/src/main/java/ru/betterend/item/EndSpawnEggItem.java @@ -9,7 +9,7 @@ public class EndSpawnEggItem extends SpawnEggItem implements Patterned { public EndSpawnEggItem(EntityType type, int primaryColor, int secondaryColor, Properties settings) { super(type, primaryColor, secondaryColor, settings); } - + @Override public String getModelPattern(String name) { return Patterns.createJson(Patterns.ITEM_SPAWN_EGG, name); diff --git a/src/main/java/ru/betterend/item/GuideBookItem.java b/src/main/java/ru/betterend/item/GuideBookItem.java index bb137c11..e60d441c 100644 --- a/src/main/java/ru/betterend/item/GuideBookItem.java +++ b/src/main/java/ru/betterend/item/GuideBookItem.java @@ -1,17 +1,16 @@ package ru.betterend.item; import java.util.List; - -import net.minecraft.client.item.TooltipContext; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.minecraft.util.Hand; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.TypedActionResult; +import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import ru.betterend.BetterEnd; import ru.betterend.registry.EndItems; @@ -19,28 +18,26 @@ import ru.betterend.util.LangUtil; import vazkii.patchouli.api.PatchouliAPI; public class GuideBookItem extends PatternedItem { - public final static ResourceLocation BOOK_ID = BetterEnd.makeID("guidebook"); - public static final Item GUIDE_BOOK = EndItems.registerItem(BOOK_ID, new GuideBookItem()); - - public static void register() { - } - - public GuideBookItem() { - super(EndItems.makeItemSettings().stacksTo(1)); - } - + public final static ResourceLocation BOOK_ID = BetterEnd.makeID("guidebook"); + public static final Item GUIDE_BOOK = EndItems.registerItem(BOOK_ID, new GuideBookItem()); + + public static void register() {} + + public GuideBookItem() { + super(EndItems.makeItemSettings().stacksTo(1)); + } + @Override - public TypedActionResult use(Level world, Player user, Hand hand) { - if (!world.isClientSide && user instanceof ServerPlayer) { + public InteractionResultHolder use(Level world, Player user, InteractionHand hand) { + if (!world.isClientSide && user instanceof ServerPlayer) { PatchouliAPI.get().openBookGUI((ServerPlayer) user, BOOK_ID); - return TypedActionResult.success(user.getStackInHand(hand)); + return InteractionResultHolder.success(user.getItemInHand(hand)); } - return TypedActionResult.consume(user.getStackInHand(hand)); + return InteractionResultHolder.consume(user.getItemInHand(hand)); } @Override - public void appendTooltip(ItemStack stack, Level world, List tooltip, TooltipContext context) { - tooltip.add( - LangUtil.getText("book.betterend", "subtitle").formatted(Formatting.DARK_PURPLE, Formatting.ITALIC)); + public void appendHoverText(ItemStack stack, Level world, List tooltip, TooltipFlag context) { + tooltip.add(LangUtil.getText("book.betterend", "subtitle").withStyle(ChatFormatting.DARK_PURPLE, ChatFormatting.ITALIC)); } } diff --git a/src/main/java/ru/betterend/item/PatternedDiscItem.java b/src/main/java/ru/betterend/item/PatternedDiscItem.java index 0abf6154..44a32123 100644 --- a/src/main/java/ru/betterend/item/PatternedDiscItem.java +++ b/src/main/java/ru/betterend/item/PatternedDiscItem.java @@ -1,13 +1,12 @@ package ru.betterend.item; -import net.minecraft.world.item.Item; import net.minecraft.sounds.SoundEvent; import net.minecraft.world.item.RecordItem; import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; public class PatternedDiscItem extends RecordItem implements Patterned { - public PatternedDiscItem(int comparatorOutput, SoundEvent sound, Item.Properties settings) { + public PatternedDiscItem(int comparatorOutput, SoundEvent sound, Properties settings) { super(comparatorOutput, sound, settings); } diff --git a/src/main/java/ru/betterend/item/PatternedItem.java b/src/main/java/ru/betterend/item/PatternedItem.java index de970bb6..c25d9c6d 100644 --- a/src/main/java/ru/betterend/item/PatternedItem.java +++ b/src/main/java/ru/betterend/item/PatternedItem.java @@ -8,7 +8,7 @@ public class PatternedItem extends Item implements Patterned { public PatternedItem(Properties settings) { super(settings); } - + @Override public String getModelPattern(String name) { return Patterns.createJson(Patterns.ITEM_GENERATED, name); diff --git a/src/main/java/ru/betterend/item/material/EndArmorMaterial.java b/src/main/java/ru/betterend/item/material/EndArmorMaterial.java index 78bb7352..13358a76 100644 --- a/src/main/java/ru/betterend/item/material/EndArmorMaterial.java +++ b/src/main/java/ru/betterend/item/material/EndArmorMaterial.java @@ -4,25 +4,26 @@ import java.util.function.Supplier; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.item.ArmorMaterial; -import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.util.LazyLoadedValue; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.crafting.Ingredient; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; public enum EndArmorMaterial implements ArmorMaterial { - THALLASIUM("thallasium", 17, new int[] { 1, 4, 5, 2 }, 12, SoundEvents.ITEM_ARMOR_EQUIP_IRON, 0.0F, 0.0F, () -> { + THALLASIUM("thallasium", 17, new int[] { 1, 4, 5, 2 }, 12, SoundEvents.ARMOR_EQUIP_IRON, 0.0F, 0.0F, () -> { return Ingredient.of(EndBlocks.THALLASIUM.ingot); - }), TERMINITE("terminite", 26, new int[] { 3, 6, 7, 3 }, 14, SoundEvents.ITEM_ARMOR_EQUIP_IRON, 1.0F, 0.05F, () -> { + }), + TERMINITE("terminite", 26, new int[] { 3, 6, 7, 3 }, 14, SoundEvents.ARMOR_EQUIP_IRON, 1.0F, 0.05F, () -> { return Ingredient.of(EndBlocks.TERMINITE.ingot); }), - AETERNIUM("aeternium", 40, new int[] { 4, 7, 9, 4 }, 18, SoundEvents.ITEM_ARMOR_EQUIP_NETHERITE, 3.5F, 0.2F, () -> { + AETERNIUM("aeternium", 40, new int[] { 4, 7, 9, 4 }, 18, SoundEvents.ARMOR_EQUIP_NETHERITE, 3.5F, 0.2F, () -> { return Ingredient.of(EndItems.AETERNIUM_INGOT); }), - CRYSTALITE("crystalite", 30, new int[] { 3, 6, 8, 3 }, 24, SoundEvents.ITEM_ARMOR_EQUIP_DIAMOND, 1.2F, 0.1F, () -> { + CRYSTALITE("crystalite", 30, new int[] { 3, 6, 8, 3 }, 24, SoundEvents.ARMOR_EQUIP_DIAMOND, 1.2F, 0.1F, () -> { return Ingredient.of(EndBlocks.TERMINITE.ingot); }); @@ -35,10 +36,11 @@ public enum EndArmorMaterial implements ArmorMaterial { private final float toughness; private final float knockbackResistance; private final LazyLoadedValue repairIngredient; - + private EndArmorMaterial(String name, int durabilityMultiplier, int[] protectionAmounts, int enchantability, - SoundEvent equipSound, float toughness, float knockbackResistance, Supplier repairIngredient) { - + SoundEvent equipSound, float toughness, float knockbackResistance, + Supplier repairIngredient) { + this.name = name; this.durabilityMultiplier = durabilityMultiplier; this.protectionAmounts = protectionAmounts; @@ -50,17 +52,17 @@ public enum EndArmorMaterial implements ArmorMaterial { } @Override - public int getDurability(EquipmentSlot slot) { - return BASE_DURABILITY[slot.getEntitySlotId()] * this.durabilityMultiplier; + public int getDurabilityForSlot(EquipmentSlot slot) { + return BASE_DURABILITY[slot.getIndex()] * this.durabilityMultiplier; } @Override - public int getProtectionAmount(EquipmentSlot slot) { - return this.protectionAmounts[slot.getEntitySlotId()]; + public int getDefenseForSlot(EquipmentSlot slot) { + return this.protectionAmounts[slot.getIndex()]; } @Override - public int getEnchantability() { + public int getEnchantmentValue() { return this.enchantability; } diff --git a/src/main/java/ru/betterend/item/material/EndToolMaterial.java b/src/main/java/ru/betterend/item/material/EndToolMaterial.java index 151e683e..b132224c 100644 --- a/src/main/java/ru/betterend/item/material/EndToolMaterial.java +++ b/src/main/java/ru/betterend/item/material/EndToolMaterial.java @@ -1,7 +1,6 @@ package ru.betterend.item.material; import java.util.function.Supplier; - import net.minecraft.util.LazyLoadedValue; import net.minecraft.world.item.Tier; import net.minecraft.world.item.crafting.Ingredient; @@ -11,9 +10,11 @@ import ru.betterend.registry.EndItems; public enum EndToolMaterial implements Tier { THALLASIUM(2, 320, 7.0F, 1.5F, 12, () -> { return Ingredient.of(EndBlocks.THALLASIUM.ingot); - }), TERMINITE(3, 1230, 8.5F, 3.0F, 14, () -> { + }), + TERMINITE(3, 1230, 8.5F, 3.0F, 14, () -> { return Ingredient.of(EndBlocks.TERMINITE.ingot); - }), AETERNIUM(5, 2196, 10.0F, 4.5F, 18, () -> { + }), + AETERNIUM(5, 2196, 10.0F, 4.5F, 18, () -> { return Ingredient.of(EndItems.AETERNIUM_INGOT); }); @@ -23,7 +24,7 @@ public enum EndToolMaterial implements Tier { private final int miningLevel; private final int enchantability; private final LazyLoadedValue repairIngredient; - + private EndToolMaterial(int miningLevel, int durability, float miningSpeed, float attackDamage, int enchantability, Supplier repairIngredient) { @@ -37,27 +38,27 @@ public enum EndToolMaterial implements Tier { @Override public int getUses() { - return durability; + return this.durability; } @Override public float getSpeed() { - return miningSpeed; + return this.miningSpeed; } @Override public float getAttackDamageBonus() { - return attackDamage; + return this.attackDamage; } @Override public int getLevel() { - return miningLevel; + return this.miningLevel; } @Override public int getEnchantmentValue() { - return enchantability; + return this.enchantability; } @Override diff --git a/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java b/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java index 4073824f..28e02a03 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java @@ -9,75 +9,71 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.client.rendering.v1.ArmorRenderingRegistry.ModelProvider; import net.fabricmc.fabric.api.client.rendering.v1.ArmorRenderingRegistry.TextureProvider; -import net.minecraft.client.network.AbstractClientPlayerEntity; -import net.minecraft.client.render.entity.model.BipedEntityModel; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraft.resources.ResourceLocation; import ru.betterend.registry.EndItems; @Environment(EnvType.CLIENT) public class CrystaliteArmorProvider implements ModelProvider, TextureProvider { - private final static ResourceLocation FIRST_LAYER = new ResourceLocation( - "textures/models/armor/crystalite_layer_1.png"); - private final static ResourceLocation SECOND_LAYER = new ResourceLocation( - "textures/models/armor/crystalite_layer_2.png"); + private final static ResourceLocation FIRST_LAYER = new ResourceLocation("textures/models/armor/crystalite_layer_1.png"); + private final static ResourceLocation SECOND_LAYER = new ResourceLocation("textures/models/armor/crystalite_layer_2.png"); private final static CrystaliteHelmetModel HELMET_MODEL = new CrystaliteHelmetModel(1.0F); private final static CrystaliteChestplateModel CHEST_MODEL = new CrystaliteChestplateModel(1.0F, false); private final static CrystaliteChestplateModel CHEST_MODEL_SLIM = new CrystaliteChestplateModel(1.0F, true); private final static CrystaliteLeggingsModel LEGGINGS_MODEL = new CrystaliteLeggingsModel(1.0F); private final static CrystaliteBootsModel BOOTS_MODEL = new CrystaliteBootsModel(1.0F); - + @Override public @NotNull ResourceLocation getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot, boolean secondLayer, @Nullable String suffix, ResourceLocation defaultTexture) { - if (!isStackValid(stack)) - return defaultTexture; - if (secondLayer) - return SECOND_LAYER; + if (!isStackValid(stack)) return defaultTexture; + if (secondLayer) return SECOND_LAYER; return FIRST_LAYER; } @Override - public @NotNull BipedEntityModel getArmorModel(LivingEntity entity, ItemStack stack, - EquipmentSlot slot, BipedEntityModel defaultModel) { - if (!isStackValid(stack)) - return defaultModel; - switch (slot) { - case HEAD: { - return HELMET_MODEL; - } - case CHEST: { - if (entity instanceof AbstractClientPlayerEntity - && ((AbstractClientPlayerEntity) entity).getModel().equals("slim")) { - CHEST_MODEL_SLIM.setAttributes(defaultModel); - return CHEST_MODEL_SLIM; + public @NotNull HumanoidModel getArmorModel(LivingEntity entity, ItemStack stack, + EquipmentSlot slot, HumanoidModel defaultModel) { + if (!isStackValid(stack)) return defaultModel; + switch(slot) { + case HEAD: { + return HELMET_MODEL; + } + case CHEST: { + if (entity instanceof AbstractClientPlayer && + ((AbstractClientPlayer) entity).getModelName().equals("slim")) { + CHEST_MODEL_SLIM.copyPropertiesTo(defaultModel); + return CHEST_MODEL_SLIM; + } + CHEST_MODEL.copyPropertiesTo(defaultModel); + return CHEST_MODEL; + } + case LEGS: { + return LEGGINGS_MODEL; + } + case FEET: { + BOOTS_MODEL.copyPropertiesTo(defaultModel); + return BOOTS_MODEL; + } + default: { + return defaultModel; } - CHEST_MODEL.setAttributes(defaultModel); - return CHEST_MODEL; - } - case LEGS: { - return LEGGINGS_MODEL; - } - case FEET: { - BOOTS_MODEL.setAttributes(defaultModel); - return BOOTS_MODEL; - } - default: { - return defaultModel; - } } } - + public Iterable getRenderedItems() { - return Lists.newArrayList(EndItems.CRYSTALITE_HELMET, EndItems.CRYSTALITE_CHESTPLATE, - EndItems.CRYSTALITE_LEGGINGS, EndItems.CRYSTALITE_BOOTS); + return Lists.newArrayList(EndItems.CRYSTALITE_HELMET, EndItems.CRYSTALITE_CHESTPLATE, EndItems.CRYSTALITE_LEGGINGS, EndItems.CRYSTALITE_BOOTS); } - + private boolean isStackValid(ItemStack stack) { - return stack.getItem() == EndItems.CRYSTALITE_HELMET || stack.getItem() == EndItems.CRYSTALITE_CHESTPLATE - || stack.getItem() == EndItems.CRYSTALITE_LEGGINGS || stack.getItem() == EndItems.CRYSTALITE_BOOTS; + return stack.getItem() == EndItems.CRYSTALITE_HELMET || + stack.getItem() == EndItems.CRYSTALITE_CHESTPLATE || + stack.getItem() == EndItems.CRYSTALITE_LEGGINGS || + stack.getItem() == EndItems.CRYSTALITE_BOOTS; } } diff --git a/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java b/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java index 7b476aa5..82ef8a4b 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java @@ -1,43 +1,41 @@ package ru.betterend.item.model; import java.util.Collections; - +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.world.entity.LivingEntity; import com.google.common.collect.Lists; -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.world.entity.LivingEntity; - -public class CrystaliteBootsModel extends BipedEntityModel { +public class CrystaliteBootsModel extends HumanoidModel { public ModelPart leftBoot; public ModelPart rightBoot; - + public CrystaliteBootsModel(float scale) { - super(RenderLayer::getEntityTranslucent, scale, 0.0F, 64, 48); + super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); this.leftBoot = new ModelPart(this, 0, 32); - this.leftBoot.addCuboid(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.25F); - this.leftBoot.setPivot(1.9F, 12.0F, 0.0F); + this.leftBoot.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.25F); + this.leftBoot.setPos(1.9F, 12.0F, 0.0F); this.rightBoot = new ModelPart(this, 0, 16); - this.rightBoot.addCuboid(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.25F); - this.rightBoot.setPivot(-1.9F, 12.0F, 0.0F); + this.rightBoot.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.25F); + this.rightBoot.setPos(-1.9F, 12.0F, 0.0F); + } + + @Override + public void copyPropertiesTo(HumanoidModel bipedEntityModel) { + super.copyPropertiesTo(bipedEntityModel); + this.leftBoot.copyFrom(leftLeg); + this.rightBoot.copyFrom(rightLeg); } @Override - public void setAttributes(BipedEntityModel bipedEntityModel) { - super.setAttributes(bipedEntityModel); - this.leftBoot.copyPositionAndRotation(leftLeg); - this.rightBoot.copyPositionAndRotation(rightLeg); - } - - @Override - protected Iterable getHeadParts() { + protected Iterable headParts() { return Collections::emptyIterator; } - + @Override - protected Iterable getBodyParts() { + protected Iterable bodyParts() { return Lists.newArrayList(leftBoot, rightBoot); } } diff --git a/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java b/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java index 51b07d02..f33a27ef 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java @@ -1,74 +1,72 @@ package ru.betterend.item.model; import java.util.Collections; - -import com.google.common.collect.Lists; - -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.world.entity.HumanoidArm; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.util.Arm; +import com.google.common.collect.Lists; +import com.mojang.blaze3d.vertex.PoseStack; -public class CrystaliteChestplateModel extends BipedEntityModel { +public class CrystaliteChestplateModel extends HumanoidModel { public ModelPart leftShoulder; public ModelPart rightShoulder; private boolean thinArms; - + public CrystaliteChestplateModel(float scale, boolean thinArms) { - super(RenderLayer::getEntityTranslucent, scale, 0.0F, 64, 48); + super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); this.thinArms = thinArms; - this.torso = new ModelPart(this, 16, 16); - this.torso.addCuboid(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale + 0.25F); - this.torso.setPivot(0.0F, 0.0F, 0.0F); + this.body = new ModelPart(this, 16, 16); + this.body.addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale + 0.25F); + this.body.setPos(0.0F, 0.0F, 0.0F); if (thinArms) { this.leftShoulder = new ModelPart(this, 41, 32); - this.leftShoulder.addCuboid(-1.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F); - this.leftShoulder.setPivot(5.0F, 2.5F, 0.0F); + this.leftShoulder.addBox(-1.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F); + this.leftShoulder.setPos(5.0F, 2.5F, 0.0F); this.leftShoulder.mirror = true; this.rightShoulder = new ModelPart(this, 41, 16); - this.rightShoulder.addCuboid(-2.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F); - this.rightShoulder.setPivot(-5.0F, 2.5F, 10.0F); + this.rightShoulder.addBox(-2.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F); + this.rightShoulder.setPos(-5.0F, 2.5F, 10.0F); } else { this.leftShoulder = new ModelPart(this, 40, 32); - this.leftShoulder.addCuboid(-1.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F); - this.leftShoulder.setPivot(5.0F, 2.0F, 0.0F); + this.leftShoulder.addBox(-1.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F); + this.leftShoulder.setPos(5.0F, 2.0F, 0.0F); this.leftShoulder.mirror = true; this.rightShoulder = new ModelPart(this, 40, 16); - this.rightShoulder.addCuboid(-3.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F); - this.rightShoulder.setPivot(-5.0F, 2.0F, 10.0F); + this.rightShoulder.addBox(-3.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F); + this.rightShoulder.setPos(-5.0F, 2.0F, 10.0F); } } - + @Override - public void setAttributes(BipedEntityModel bipedEntityModel) { - super.setAttributes(bipedEntityModel); - this.leftShoulder.copyPositionAndRotation(leftArm); - this.rightShoulder.copyPositionAndRotation(rightArm); + public void copyPropertiesTo(HumanoidModel bipedEntityModel) { + super.copyPropertiesTo(bipedEntityModel); + this.leftShoulder.copyFrom(leftArm); + this.rightShoulder.copyFrom(rightArm); } - + @Override - protected Iterable getHeadParts() { + protected Iterable headParts() { return Collections::emptyIterator; } - + @Override - protected Iterable getBodyParts() { - return Lists.newArrayList(torso, leftShoulder, rightShoulder); + protected Iterable bodyParts() { + return Lists.newArrayList(body, leftShoulder, rightShoulder); } - + @Override - public void setArmAngle(Arm arm, MatrixStack matrices) { + public void translateToHand(HumanoidArm arm, PoseStack matrices) { ModelPart modelPart = this.getArm(arm); if (this.thinArms) { - float f = 0.5F * (float) (arm == Arm.RIGHT ? 1 : -1); - modelPart.pivotX += f; - modelPart.rotate(matrices); - modelPart.pivotX -= f; + float f = 0.5F * (float)(arm == HumanoidArm.RIGHT ? 1 : -1); + modelPart.x += f; + modelPart.translateAndRotate(matrices); + modelPart.x -= f; } else { - modelPart.rotate(matrices); + modelPart.translateAndRotate(matrices); } } } diff --git a/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java b/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java index fc82b4e7..3513c2f4 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java @@ -6,28 +6,28 @@ import com.google.common.collect.Lists; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.entity.model.BipedEntityModel; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.RenderType; import net.minecraft.world.entity.LivingEntity; @Environment(EnvType.CLIENT) -public class CrystaliteHelmetModel extends BipedEntityModel { +public class CrystaliteHelmetModel extends HumanoidModel { public CrystaliteHelmetModel(float scale) { - super(RenderLayer::getEntityTranslucent, scale, 0.0F, 64, 48); - this.helmet = new ModelPart(this, 0, 0); - this.helmet.addCuboid(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, scale + 0.5F); - this.helmet.setPivot(0.0F, 0.0F, 0.0F); + super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); + this.hat = new ModelPart(this, 0, 0); + this.hat.addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, scale + 0.5F); + this.hat.setPos(0.0F, 0.0F, 0.0F); } - + @Override - protected Iterable getHeadParts() { + protected Iterable headParts() { return Collections::emptyIterator; } - + @Override - protected Iterable getBodyParts() { - return Lists.newArrayList(helmet); + protected Iterable bodyParts() { + return Lists.newArrayList(hat); } } diff --git a/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java b/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java index d4bd17c9..acbbd1bb 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java @@ -1,36 +1,34 @@ package ru.betterend.item.model; import java.util.Collections; - +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.world.entity.LivingEntity; import com.google.common.collect.Lists; -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.world.entity.LivingEntity; - -public class CrystaliteLeggingsModel extends BipedEntityModel { +public class CrystaliteLeggingsModel extends HumanoidModel { public CrystaliteLeggingsModel(float scale) { - super(RenderLayer::getEntityTranslucent, scale, 0.0F, 64, 48); - this.torso = new ModelPart(this, 16, 16); - this.torso.addCuboid(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale); - this.torso.setPivot(0.0F, 0.0F, 0.0F); + super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); + this.body = new ModelPart(this, 16, 16); + this.body.addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale); + this.body.setPos(0.0F, 0.0F, 0.0F); this.leftLeg = new ModelPart(this, 0, 32); - this.leftLeg.addCuboid(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale); - this.leftLeg.setPivot(1.9F, 12.0F, 0.0F); + this.leftLeg.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale); + this.leftLeg.setPos(1.9F, 12.0F, 0.0F); this.rightLeg = new ModelPart(this, 0, 16); - this.rightLeg.addCuboid(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale); - this.rightLeg.setPivot(-1.9F, 12.0F, 0.0F); + this.rightLeg.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale); + this.rightLeg.setPos(-1.9F, 12.0F, 0.0F); } @Override - protected Iterable getHeadParts() { + protected Iterable headParts() { return Collections::emptyIterator; } - + @Override - protected Iterable getBodyParts() { - return Lists.newArrayList(torso, rightLeg, leftLeg); + protected Iterable bodyParts() { + return Lists.newArrayList(body, rightLeg, leftLeg); } } diff --git a/src/main/java/ru/betterend/item/tool/EndAxeItem.java b/src/main/java/ru/betterend/item/tool/EndAxeItem.java index 047683b5..0720695c 100644 --- a/src/main/java/ru/betterend/item/tool/EndAxeItem.java +++ b/src/main/java/ru/betterend/item/tool/EndAxeItem.java @@ -2,13 +2,13 @@ package ru.betterend.item.tool; import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.tags.Tag; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.AxeItem; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Tier; -import net.minecraft.tags.Tag; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; @@ -24,7 +24,7 @@ public class EndAxeItem extends AxeItem implements DynamicAttributeTool, Pattern } return 0; } - + @Override public String getModelPattern(String name) { return Patterns.createJson(Patterns.ITEM_HANDHELD, name); diff --git a/src/main/java/ru/betterend/item/tool/EndHammerItem.java b/src/main/java/ru/betterend/item/tool/EndHammerItem.java index 8ce0818a..2fe92f82 100644 --- a/src/main/java/ru/betterend/item/tool/EndHammerItem.java +++ b/src/main/java/ru/betterend/item/tool/EndHammerItem.java @@ -9,90 +9,89 @@ import com.google.common.collect.Sets; import io.netty.util.internal.ThreadLocalRandom; import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; +import net.minecraft.core.BlockPos; +import net.minecraft.tags.Tag; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.DiggerItem; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.LivingEntity; - import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Tier; -import net.minecraft.tags.Tag; -import net.minecraft.core.BlockPos; -import net.minecraft.util.Mth; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; import ru.betterend.registry.EndTags; public class EndHammerItem extends DiggerItem implements DynamicAttributeTool, Patterned { public final static UUID ATTACK_KNOCKBACK_MODIFIER_ID = Mth.createInsecureUUID(ThreadLocalRandom.current()); - + private final Multimap attributeModifiers; public EndHammerItem(Tier material, float attackDamage, float attackSpeed, double knockback, Properties settings) { super(attackDamage, attackSpeed, material, Sets.newHashSet(), settings); Builder builder = ImmutableMultimap.builder(); - builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Weapon modifier", - attackDamage + material.getAttackDamageBonus(), AttributeModifier.Operation.ADDITION)); - builder.put(Attributes.ATTACK_SPEED, new AttributeModifier(BASE_ATTACK_SPEED_UUID, "Weapon modifier", - attackSpeed, AttributeModifier.Operation.ADDITION)); - builder.put(Attributes.ATTACK_KNOCKBACK, new AttributeModifier(ATTACK_KNOCKBACK_MODIFIER_ID, "Weapon modifier", - knockback, AttributeModifier.Operation.ADDITION)); + builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Weapon modifier", attackDamage + material.getAttackDamageBonus(), AttributeModifier.Operation.ADDITION)); + builder.put(Attributes.ATTACK_SPEED, new AttributeModifier(BASE_ATTACK_SPEED_UUID, "Weapon modifier", attackSpeed, AttributeModifier.Operation.ADDITION)); + builder.put(Attributes.ATTACK_KNOCKBACK, new AttributeModifier(ATTACK_KNOCKBACK_MODIFIER_ID, "Weapon modifier", knockback, AttributeModifier.Operation.ADDITION)); this.attributeModifiers = builder.build(); } @Override public boolean canAttackBlock(BlockState state, Level world, BlockPos pos, Player miner) { - return state.getMaterial().equals(Material.STONE) || state.getMaterial().equals(Material.GLASS) - || state.is(Blocks.DIAMOND_BLOCK) || state.is(Blocks.EMERALD_BLOCK) || state.is(Blocks.LAPIS_BLOCK) - || state.is(Blocks.REDSTONE_BLOCK); + return state.getMaterial().equals(Material.STONE) || + state.getMaterial().equals(Material.GLASS) || + state.is(Blocks.DIAMOND_BLOCK) || + state.is(Blocks.EMERALD_BLOCK) || + state.is(Blocks.LAPIS_BLOCK) || + state.is(Blocks.REDSTONE_BLOCK); } @Override public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { - stack.hurtAndBreak(1, attacker, (entity -> { + stack.hurtAndBreak(1, attacker, ((entity) -> { entity.broadcastBreakEvent(EquipmentSlot.MAINHAND); })); - + return true; } @Override public boolean mineBlock(ItemStack stack, Level world, BlockState state, BlockPos pos, LivingEntity miner) { if (state.getDestroySpeed(world, pos) != 0.0F) { - stack.hurtAndBreak(1, miner, (entity -> { + stack.hurtAndBreak(1, miner, ((entity) -> { entity.broadcastBreakEvent(EquipmentSlot.MAINHAND); })); } + return true; } @Override public float getDestroySpeed(ItemStack stack, BlockState state) { if (state.getMaterial().equals(Material.GLASS)) { - return getTier().getSpeed() * 2.0F; + return this.getTier().getSpeed() * 2.0F; } if (isCorrectToolForDrops(state)) { float mult = 1.0F; - if (state.is(Blocks.DIAMOND_BLOCK) || state.is(Blocks.EMERALD_BLOCK) || state.is(Blocks.LAPIS_BLOCK) - || state.is(Blocks.REDSTONE_BLOCK)) { - mult = getTier().getSpeed(); + if (state.is(Blocks.DIAMOND_BLOCK) || state.is(Blocks.EMERALD_BLOCK) || state.is(Blocks.LAPIS_BLOCK) || state.is(Blocks.REDSTONE_BLOCK)) { + mult = this.getTier().getSpeed(); } else { - mult = getTier().getSpeed() / 2.0F; + mult = this.getTier().getSpeed() / 2.0F; } - return Math.max(mult, 1.0F); + return mult > 1.0F ? mult : 1.0F; } return 1.0F; } - + @Override public float getMiningSpeedMultiplier(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { if (tag.equals(EndTags.HAMMERS)) { @@ -100,7 +99,7 @@ public class EndHammerItem extends DiggerItem implements DynamicAttributeTool, P } return 1.0F; } - + @Override public int getMiningLevel(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { if (tag.equals(EndTags.HAMMERS)) { @@ -114,20 +113,17 @@ public class EndHammerItem extends DiggerItem implements DynamicAttributeTool, P if (state.getMaterial().equals(Material.GLASS)) { return true; } - if (!state.is(Blocks.REDSTONE_BLOCK) && !state.is(Blocks.DIAMOND_BLOCK) && !state.is(Blocks.EMERALD_BLOCK) - && !state.is(Blocks.LAPIS_BLOCK) && !state.getMaterial().equals(Material.STONE)) { + if (!state.is(Blocks.REDSTONE_BLOCK) && !state.is(Blocks.DIAMOND_BLOCK) && !state.is(Blocks.EMERALD_BLOCK) && !state.is(Blocks.LAPIS_BLOCK) && !state.getMaterial().equals(Material.STONE)) { return false; } int level = this.getTier().getLevel(); if (state.is(Blocks.IRON_ORE) || state.is(Blocks.LAPIS_BLOCK) || state.is(Blocks.LAPIS_ORE)) { return level >= 1; } - if (state.is(Blocks.DIAMOND_BLOCK) && !state.is(Blocks.DIAMOND_ORE) || state.is(Blocks.EMERALD_ORE) - || state.is(Blocks.EMERALD_BLOCK) || state.is(Blocks.GOLD_ORE) || state.is(Blocks.REDSTONE_ORE)) { + if (state.is(Blocks.DIAMOND_BLOCK) && !state.is(Blocks.DIAMOND_ORE) || state.is(Blocks.EMERALD_ORE) || state.is(Blocks.EMERALD_BLOCK) || state.is(Blocks.GOLD_ORE) || state.is(Blocks.REDSTONE_ORE)) { return level >= 2; } - if (state.is(Blocks.OBSIDIAN) || state.is(Blocks.CRYING_OBSIDIAN) || state.is(Blocks.RESPAWN_ANCHOR) - || state.is(Blocks.ANCIENT_DEBRIS)) { + if (state.is(Blocks.OBSIDIAN) || state.is(Blocks.CRYING_OBSIDIAN) || state.is(Blocks.RESPAWN_ANCHOR) || state.is(Blocks.ANCIENT_DEBRIS)) { return level >= 3; } return true; @@ -137,7 +133,7 @@ public class EndHammerItem extends DiggerItem implements DynamicAttributeTool, P public Multimap getDefaultAttributeModifiers(EquipmentSlot slot) { return slot == EquipmentSlot.MAINHAND ? this.attributeModifiers : super.getDefaultAttributeModifiers(slot); } - + @Override public String getModelPattern(String name) { return Patterns.createJson(Patterns.ITEM_HANDHELD, name); diff --git a/src/main/java/ru/betterend/item/tool/EndHoeItem.java b/src/main/java/ru/betterend/item/tool/EndHoeItem.java index ca920b52..07fa387e 100644 --- a/src/main/java/ru/betterend/item/tool/EndHoeItem.java +++ b/src/main/java/ru/betterend/item/tool/EndHoeItem.java @@ -9,7 +9,7 @@ public class EndHoeItem extends HoeItem implements Patterned { public EndHoeItem(Tier material, int attackDamage, float attackSpeed, Properties settings) { super(material, attackDamage, attackSpeed, settings); } - + @Override public String getModelPattern(String name) { return Patterns.createJson(Patterns.ITEM_HANDHELD, name); diff --git a/src/main/java/ru/betterend/item/tool/EndPickaxeItem.java b/src/main/java/ru/betterend/item/tool/EndPickaxeItem.java index 4fa85f5e..a7aac37c 100644 --- a/src/main/java/ru/betterend/item/tool/EndPickaxeItem.java +++ b/src/main/java/ru/betterend/item/tool/EndPickaxeItem.java @@ -5,13 +5,13 @@ import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl; import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl.Entry; import net.minecraft.tags.Tag; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.PickaxeItem; import net.minecraft.world.item.Tier; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; @@ -19,7 +19,7 @@ public class EndPickaxeItem extends PickaxeItem implements DynamicAttributeTool, public EndPickaxeItem(Tier material, int attackDamage, float attackSpeed, Properties settings) { super(material, attackDamage, attackSpeed, settings); } - + @Override public int getMiningLevel(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { if (tag.equals(FabricToolTags.PICKAXES)) { @@ -27,18 +27,16 @@ public class EndPickaxeItem extends PickaxeItem implements DynamicAttributeTool, } return 0; } - + @Override public float getDestroySpeed(ItemStack stack, BlockState state) { - if (this.getTier().getLevel() > 2 - && state.getMaterial().equals(Blocks.END_STONE.defaultBlockState().getMaterial())) { + if (this.getTier().getLevel() > 2 && state.getMaterial().equals(Blocks.END_STONE.defaultBlockState().getMaterial())) { return this.speed * 3; } Entry entry = ToolManagerImpl.entryNullable(state.getBlock()); - return (entry != null && entry.getMiningLevel(FabricToolTags.PICKAXES) >= 0) ? speed - : super.getDestroySpeed(stack, state); + return (entry != null && entry.getMiningLevel(FabricToolTags.PICKAXES) >= 0) ? this.speed : super.getDestroySpeed(stack, state); } - + @Override public String getModelPattern(String name) { return Patterns.createJson(Patterns.ITEM_HANDHELD, name); diff --git a/src/main/java/ru/betterend/item/tool/EndShovelItem.java b/src/main/java/ru/betterend/item/tool/EndShovelItem.java index 4d36aa49..5a59a2bc 100644 --- a/src/main/java/ru/betterend/item/tool/EndShovelItem.java +++ b/src/main/java/ru/betterend/item/tool/EndShovelItem.java @@ -4,13 +4,13 @@ import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl; import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl.Entry; -import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.tags.Tag; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ShovelItem; import net.minecraft.world.item.Tier; -import net.minecraft.tags.Tag; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; @@ -18,7 +18,7 @@ public class EndShovelItem extends ShovelItem implements DynamicAttributeTool, P public EndShovelItem(Tier material, float attackDamage, float attackSpeed, Properties settings) { super(material, attackDamage, attackSpeed, settings); } - + @Override public int getMiningLevel(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { if (tag.equals(FabricToolTags.SHOVELS)) { @@ -26,14 +26,13 @@ public class EndShovelItem extends ShovelItem implements DynamicAttributeTool, P } return 0; } - + @Override public float getDestroySpeed(ItemStack stack, BlockState state) { Entry entry = ToolManagerImpl.entryNullable(state.getBlock()); - return (entry != null && entry.getMiningLevel(FabricToolTags.SHOVELS) >= 0) ? speed - : super.getDestroySpeed(stack, state); + return (entry != null && entry.getMiningLevel(FabricToolTags.SHOVELS) >= 0) ? this.speed : super.getDestroySpeed(stack, state); } - + @Override public String getModelPattern(String name) { return Patterns.createJson(Patterns.ITEM_HANDHELD, name); diff --git a/src/main/java/ru/betterend/item/tool/EndSwordItem.java b/src/main/java/ru/betterend/item/tool/EndSwordItem.java index 679ae06c..43aa6761 100644 --- a/src/main/java/ru/betterend/item/tool/EndSwordItem.java +++ b/src/main/java/ru/betterend/item/tool/EndSwordItem.java @@ -10,7 +10,7 @@ public class EndSwordItem extends SwordItem implements DynamicAttributeTool, Pat public EndSwordItem(Tier material, int attackDamage, float attackSpeed, Properties settings) { super(material, attackDamage, attackSpeed, settings); } - + @Override public String getModelPattern(String name) { return Patterns.createJson(Patterns.ITEM_HANDHELD, name); diff --git a/src/main/java/ru/betterend/mixin/client/AbstractSoundInstanceAccessor.java b/src/main/java/ru/betterend/mixin/client/AbstractSoundInstanceAccessor.java index c925808e..9c94ed93 100644 --- a/src/main/java/ru/betterend/mixin/client/AbstractSoundInstanceAccessor.java +++ b/src/main/java/ru/betterend/mixin/client/AbstractSoundInstanceAccessor.java @@ -1,10 +1,9 @@ package ru.betterend.mixin.client; +import net.minecraft.client.resources.sounds.AbstractSoundInstance; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -import net.minecraft.client.sound.AbstractSoundInstance; - @Mixin(AbstractSoundInstance.class) public interface AbstractSoundInstanceAccessor { @Accessor("volume") diff --git a/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java index a37d7cee..1bbed601 100644 --- a/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java +++ b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java @@ -1,7 +1,18 @@ package ru.betterend.mixin.client; import java.util.List; - +import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.screens.inventory.AnvilScreen; +import net.minecraft.client.gui.screens.inventory.ItemCombinerScreen; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.AnvilMenu; +import net.minecraft.world.item.ItemStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -9,32 +20,19 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.google.common.collect.Lists; - -import net.minecraft.client.gui.screen.ingame.AnvilScreen; -import net.minecraft.client.gui.screen.ingame.ForgingScreen; -import net.minecraft.client.gui.widget.AbstractButtonWidget; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.gui.widget.TextFieldWidget; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.world.entity.player.PlayerInventory; -import net.minecraft.world.item.ItemStack; -import net.minecraft.screen.AnvilScreenHandler; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.text.LiteralText; -import net.minecraft.text.Text; -import net.minecraft.resources.ResourceLocation; +import com.mojang.blaze3d.vertex.PoseStack; import ru.betterend.interfaces.AnvilScreenHandlerExtended; @Mixin(AnvilScreen.class) -public class AnvilScreenMixin extends ForgingScreen { +public class AnvilScreenMixin extends ItemCombinerScreen { @Shadow - private TextFieldWidget nameField; - - private final List be_buttons = Lists.newArrayList(); + private EditBox nameField; + + private final List be_buttons = Lists.newArrayList(); private AnvilScreenHandlerExtended anvilHandler; - - public AnvilScreenMixin(AnvilScreenHandler handler, PlayerInventory playerInventory, Text title, + + public AnvilScreenMixin(AnvilMenu handler, Inventory playerInventory, Component title, ResourceLocation texture) { super(handler, playerInventory, title, texture); } @@ -42,22 +40,22 @@ public class AnvilScreenMixin extends ForgingScreen { @Inject(method = "setup", at = @At("TAIL")) protected void be_setup(CallbackInfo info) { this.be_buttons.clear(); - int x = (width - backgroundWidth) / 2; - int y = (height - backgroundHeight) / 2; - this.anvilHandler = (AnvilScreenHandlerExtended) this.handler; - this.be_buttons.add(new ButtonWidget(x + 8, y + 45, 15, 20, new LiteralText("<"), (b) -> be_previousRecipe())); - this.be_buttons.add(new ButtonWidget(x + 154, y + 45, 15, 20, new LiteralText(">"), (b) -> be_nextRecipe())); + int x = (width - imageWidth) / 2; + int y = (height - imageHeight) / 2; + this.anvilHandler = (AnvilScreenHandlerExtended) this.menu; + this.be_buttons.add(new Button(x + 8, y + 45, 15, 20, new TextComponent("<"), (b) -> be_previousRecipe())); + this.be_buttons.add(new Button(x + 154, y + 45, 15, 20, new TextComponent(">"), (b) -> be_nextRecipe())); } - + @Inject(method = "renderForeground", at = @At("TAIL")) - protected void be_renderForeground(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo info) { + protected void be_renderForeground(PoseStack matrices, int mouseX, int mouseY, float delta, CallbackInfo info) { this.be_buttons.forEach(button -> { button.render(matrices, mouseX, mouseY, delta); }); } - + @Inject(method = "onSlotUpdate", at = @At("HEAD"), cancellable = true) - public void be_onSlotUpdate(ScreenHandler handler, int slotId, ItemStack stack, CallbackInfo info) { + public void be_onSlotUpdate(AbstractContainerMenu handler, int slotId, ItemStack stack, CallbackInfo info) { AnvilScreenHandlerExtended anvilHandler = (AnvilScreenHandlerExtended) handler; if (anvilHandler.be_getCurrentRecipe() != null) { if (anvilHandler.be_getRecipes().size() > 1) { @@ -65,29 +63,29 @@ public class AnvilScreenMixin extends ForgingScreen { } else { this.be_buttons.forEach(button -> button.visible = false); } - this.nameField.setText(""); + this.nameField.setValue(""); info.cancel(); } else { this.be_buttons.forEach(button -> button.visible = false); } } - + private void be_nextRecipe() { this.anvilHandler.be_nextRecipe(); } - + private void be_previousRecipe() { this.anvilHandler.be_previousRecipe(); } - + @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (client != null) { - for (AbstractButtonWidget elem : be_buttons) { + if (minecraft != null) { + for (AbstractWidget elem : be_buttons) { if (elem.visible && elem.mouseClicked(mouseX, mouseY, button)) { - if (client.interactionManager != null) { + if (minecraft.gameMode != null) { int i = be_buttons.indexOf(elem); - this.client.interactionManager.clickButton(handler.syncId, i); + this.minecraft.gameMode.handleInventoryButtonClick(menu.containerId, i); return true; } } diff --git a/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java b/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java index e85b8ef2..993c4b51 100644 --- a/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java @@ -8,54 +8,51 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; - -import net.minecraft.client.render.BackgroundRenderer; -import net.minecraft.client.render.Camera; +import net.minecraft.Util; +import net.minecraft.client.Camera; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.LivingEntity; +import net.minecraft.client.renderer.FogRenderer; +import net.minecraft.util.Mth; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; -import net.minecraft.fluid.FluidState; -import net.minecraft.util.Util; -import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.Biome.Category; +import net.minecraft.world.level.biome.Biome.BiomeCategory; +import net.minecraft.world.level.material.FluidState; import ru.betterend.client.ClientOptions; import ru.betterend.registry.EndBiomes; import ru.betterend.util.BackgroundInfo; import ru.betterend.world.biome.EndBiome; -@Mixin(BackgroundRenderer.class) +@Mixin(FogRenderer.class) public class BackgroundRendererMixin { private static float lastFogDensity; private static float fogDensity; private static float lerp; private static long time; - + @Shadow private static float red; @Shadow private static float green; @Shadow private static float blue; - + @Inject(method = "render", at = @At("RETURN")) - private static void be_onRender(Camera camera, float tickDelta, ClientLevel world, int i, float f, - CallbackInfo info) { - long l = Util.getMeasuringTimeMs() - time; + private static void be_onRender(Camera camera, float tickDelta, ClientLevel world, int i, float f, CallbackInfo info) { + long l = Util.getMillis() - time; time += l; lerp += l * 0.001F; - if (lerp > 1) - lerp = 1; - - FluidState fluidState = camera.getSubmergedFluidState(); + if (lerp > 1) lerp = 1; + + FluidState fluidState = camera.getFluidInCamera(); if (fluidState.isEmpty() && world.dimension().equals(Level.END)) { - Entity entity = camera.getFocusedEntity(); + Entity entity = camera.getEntity(); boolean skip = false; if (entity instanceof LivingEntity) { - MobEffectInstance effect = ((LivingEntity) entity).getMobEffect(MobEffects.NIGHT_VISION); + MobEffectInstance effect = ((LivingEntity) entity).getEffect(MobEffects.NIGHT_VISION); skip = effect != null && effect.getDuration() > 0; } if (!skip) { @@ -64,21 +61,20 @@ public class BackgroundRendererMixin { blue *= 4; } } - + BackgroundInfo.red = red; BackgroundInfo.green = green; BackgroundInfo.blue = blue; } - + @Inject(method = "applyFog", at = @At("HEAD"), cancellable = true) - private static void be_fogDensity(Camera camera, BackgroundRenderer.FogType fogType, float viewDistance, - boolean thickFog, CallbackInfo info) { - Entity entity = camera.getFocusedEntity(); - Biome biome = entity.world.getBiome(entity.getBlockPos()); - FluidState fluidState = camera.getSubmergedFluidState(); - if (ClientOptions.useFogDensity() && biome.getCategory() == Category.THEEND && fluidState.isEmpty()) { + private static void be_fogDensity(Camera camera, FogRenderer.FogMode fogType, float viewDistance, boolean thickFog, CallbackInfo info) { + Entity entity = camera.getEntity(); + Biome biome = entity.level.getBiome(entity.blockPosition()); + FluidState fluidState = camera.getFluidInCamera(); + if (ClientOptions.useFogDensity() && biome.getBiomeCategory() == BiomeCategory.THEEND && fluidState.isEmpty()) { EndBiome endBiome = EndBiomes.getRenderBiome(biome); - + if (fogDensity == 0) { fogDensity = endBiome.getFogDensity(); lastFogDensity = fogDensity; @@ -88,32 +84,34 @@ public class BackgroundRendererMixin { fogDensity = endBiome.getFogDensity(); lerp = 0; } - + float fog = Mth.lerp(lerp, lastFogDensity, fogDensity); BackgroundInfo.fog = fog; float start = viewDistance * 0.75F / fog; float end = viewDistance / fog; - + if (entity instanceof LivingEntity) { LivingEntity le = (LivingEntity) entity; - MobEffectInstance effect = le.getMobEffect(MobEffects.BLINDNESS); + MobEffectInstance effect = le.getEffect(MobEffects.BLINDNESS); if (effect != null) { int duration = effect.getDuration(); if (duration > 20) { start = 0; end *= 0.03F; BackgroundInfo.blindness = 1; - } else { + } + else { float delta = (float) duration / 20F; BackgroundInfo.blindness = delta; start = Mth.lerp(delta, start, 0); end = Mth.lerp(delta, end, end * 0.03F); } - } else { + } + else { BackgroundInfo.blindness = 0; } } - + RenderSystem.fogStart(start); RenderSystem.fogEnd(end); RenderSystem.fogMode(GlStateManager.FogMode.LINEAR); diff --git a/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java b/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java index 1a897f04..4d18dda8 100644 --- a/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java +++ b/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java @@ -9,11 +9,11 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.Minecraft; -import net.minecraft.client.color.world.BiomeColors; +import net.minecraft.client.renderer.BiomeColors; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.BlockRenderView; +import net.minecraft.world.level.BlockAndTintGetter; import ru.betterend.client.ClientOptions; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; @@ -25,11 +25,11 @@ public class BiomeColorsMixin { private static final int STREAM_COLOR = MHelper.color(105, 213, 244); private static final Point[] OFFSETS; private static final boolean HAS_SODIUM; - + @Inject(method = "getWaterColor", at = @At("RETURN"), cancellable = true) - private static void be_getWaterColor(BlockRenderView world, BlockPos pos, CallbackInfoReturnable info) { + private static void be_getWaterColor(BlockAndTintGetter world, BlockPos pos, CallbackInfoReturnable info) { if (ClientOptions.useSulfurWaterColor()) { - BlockRenderView view = HAS_SODIUM ? Minecraft.getInstance().world : world; + BlockAndTintGetter view = HAS_SODIUM ? Minecraft.getInstance().level : world; MutableBlockPos mut = new MutableBlockPos(); mut.setY(pos.getY()); for (int i = 0; i < OFFSETS.length; i++) { @@ -43,10 +43,10 @@ public class BiomeColorsMixin { } } } - + static { HAS_SODIUM = FabricLoader.getInstance().isModLoaded("sodium"); - + OFFSETS = new Point[20]; for (int i = 0; i < 3; i++) { int p = i - 1; @@ -55,13 +55,13 @@ public class BiomeColorsMixin { OFFSETS[i + 6] = new Point(-2, p); OFFSETS[i + 9] = new Point(2, p); } - + for (int i = 0; i < 4; i++) { int inner = i + 16; Direction dir = BlocksHelper.HORIZONTAL[i]; - OFFSETS[inner] = new Point(dir.getOffsetX(), dir.getOffsetZ()); + OFFSETS[inner] = new Point(dir.getStepX(), dir.getStepZ()); dir = BlocksHelper.HORIZONTAL[(i + 1) & 3]; - OFFSETS[i + 12] = new Point(OFFSETS[inner].x + dir.getOffsetX(), OFFSETS[inner].y + dir.getOffsetZ()); + OFFSETS[i + 12] = new Point(OFFSETS[inner].x + dir.getStepX(), OFFSETS[inner].y + dir.getStepZ()); } } } diff --git a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java index 32e0fd75..9fd6850c 100644 --- a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java @@ -1,22 +1,22 @@ package ru.betterend.mixin.client; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.multiplayer.ClientPacketListener; +import net.minecraft.network.protocol.PacketUtils; +import net.minecraft.network.protocol.game.ClientboundOpenSignEditorPacket; +import net.minecraft.world.level.block.entity.BlockEntity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.client.Minecraft; -import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.network.NetworkThreadUtils; -import net.minecraft.network.packet.s2c.play.SignEditorOpenS2CPacket; import ru.betterend.blocks.entities.ESignBlockEntity; import ru.betterend.client.gui.BlockSignEditScreen; -@Mixin(ClientPlayNetworkHandler.class) -public class ClientPlayNetworkHandlerMixin { +@Mixin(ClientPacketListener.class) +public class ClientPlayNetworkHandlerMixin +{ @Shadow private Minecraft client; @@ -24,12 +24,12 @@ public class ClientPlayNetworkHandlerMixin { private ClientLevel world; @Inject(method = "onSignEditorOpen", at = @At(value = "HEAD"), cancellable = true) - public void be_openSignEditor(SignEditorOpenS2CPacket packet, CallbackInfo info) { - NetworkThreadUtils.forceMainThread(packet, ClientPlayNetworkHandler.class.cast(this), client); + public void be_openSignEditor(ClientboundOpenSignEditorPacket packet, CallbackInfo info) { + PacketUtils.ensureRunningOnSameThread(packet, ClientPacketListener.class.cast(this), client); BlockEntity blockEntity = world.getBlockEntity(packet.getPos()); if (blockEntity instanceof ESignBlockEntity) { ESignBlockEntity sign = (ESignBlockEntity) blockEntity; - client.openScreen(new BlockSignEditScreen(sign)); + client.setScreen(new BlockSignEditScreen(sign)); info.cancel(); } } diff --git a/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java b/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java index 90797794..873da6b2 100644 --- a/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java @@ -1,24 +1,23 @@ package ru.betterend.mixin.client; +import net.minecraft.client.ClientRecipeBook; +import net.minecraft.client.RecipeBookCategories; +import net.minecraft.world.item.crafting.Recipe; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.client.recipebook.ClientRecipeBook; -import net.minecraft.client.recipebook.RecipeBookGroup; -import net.minecraft.world.item.crafting.Recipe; import ru.betterend.interfaces.BetterEndRecipe; import ru.betterend.recipe.builders.AlloyingRecipe; @Mixin(ClientRecipeBook.class) public abstract class ClientRecipeBookMixin { @Inject(method = "getGroupForRecipe", at = @At("HEAD"), cancellable = true) - private static void be_getGroupForRecipe(Recipe recipe, CallbackInfoReturnable cinfo) { + private static void be_getGroupForRecipe(Recipe recipe, CallbackInfoReturnable cinfo) { if (recipe instanceof AlloyingRecipe) { - cinfo.setReturnValue(RecipeBookGroup.BLAST_FURNACE_MISC); + cinfo.setReturnValue(RecipeBookCategories.BLAST_FURNACE_MISC); } else if (recipe instanceof BetterEndRecipe) { - cinfo.setReturnValue(RecipeBookGroup.UNKNOWN); + cinfo.setReturnValue(RecipeBookCategories.UNKNOWN); } } } diff --git a/src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java b/src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java index d635bdbc..300486c2 100644 --- a/src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java +++ b/src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java @@ -4,10 +4,9 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; import com.google.gson.Gson; +import net.minecraft.client.renderer.block.model.BlockModelDefinition; -import net.minecraft.client.render.model.json.ModelVariantMap; - -@Mixin(ModelVariantMap.DeserializationContext.class) +@Mixin(BlockModelDefinition.Context.class) public interface ContextGsonAccessor { @Accessor public Gson getGson(); diff --git a/src/main/java/ru/betterend/mixin/client/EnchantingTableBlockMixin.java b/src/main/java/ru/betterend/mixin/client/EnchantingTableBlockMixin.java index dbc78fec..55ce721d 100644 --- a/src/main/java/ru/betterend/mixin/client/EnchantingTableBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/client/EnchantingTableBlockMixin.java @@ -1,27 +1,25 @@ package ru.betterend.mixin.client; import java.util.Random; - +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.EnchantmentTableBlock; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.EnchantingTableBlock; -import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.Level; import ru.betterend.registry.EndTags; -@Mixin(EnchantingTableBlock.class) +@Mixin(EnchantmentTableBlock.class) public abstract class EnchantingTableBlockMixin extends Block { public EnchantingTableBlockMixin(Properties settings) { super(settings); } - @Inject(method = "animateTick", at = @At(value = "TAIL")) + @Inject(method = "randomDisplayTick", at = @At(value = "TAIL")) private void be_onRandomDisplayTick(BlockState state, Level world, BlockPos pos, Random random, CallbackInfo info) { for (int px = -2; px <= 2; ++px) { for (int pz = -2; pz <= 2; ++pz) { @@ -31,13 +29,11 @@ public abstract class EnchantingTableBlockMixin extends Block { if (random.nextInt(16) == 0) { for (int py = 0; py <= 1; ++py) { BlockPos blockPos = pos.offset(px, py, pz); - if (world.getBlockState(blockPos).isIn(EndTags.BOOKSHELVES)) { - if (!world.isAir(pos.offset(px / 2, 0, pz / 2))) { + if (world.getBlockState(blockPos).is(EndTags.BOOKSHELVES)) { + if (!world.isEmptyBlock(pos.offset(px / 2, 0, pz / 2))) { break; } - world.addParticle(ParticleTypes.ENCHANT, pos.getX() + 0.5, pos.getY() + 2.0, - pos.getZ() + 0.5, px + random.nextFloat() - 0.5, py - random.nextFloat() - 1.0, - pz + random.nextFloat() - 0.5); + world.addParticle(ParticleTypes.ENCHANT, pos.getX() + 0.5, pos.getY() + 2.0, pos.getZ() + 0.5, px + random.nextFloat() - 0.5, py - random.nextFloat() - 1.0, pz + random.nextFloat() - 0.5); } } } diff --git a/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java b/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java index d6a6a9b4..06ac5e6a 100644 --- a/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java +++ b/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java @@ -7,19 +7,18 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.minecraft.client.Minecraft; -import net.minecraft.client.RunArgs; import net.minecraft.client.color.block.BlockColors; import net.minecraft.client.color.item.ItemColors; -import net.minecraft.client.gui.hud.InGameHud; -import net.minecraft.client.gui.screen.CreditsScreen; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.client.sound.MusicType; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.WinScreen; +import net.minecraft.client.main.GameConfig; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.sound.MusicSound; +import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.Registry; +import net.minecraft.sounds.Music; +import net.minecraft.sounds.Musics; import net.minecraft.world.level.Level; import ru.betterend.interfaces.IColorProvider; import ru.betterend.util.MHelper; @@ -27,18 +26,18 @@ import ru.betterend.util.MHelper; @Mixin(Minecraft.class) public class MinecraftClientMixin { @Shadow - public ClientPlayerEntity player; - + public LocalPlayer player; + @Shadow public Screen currentScreen; - + @Shadow @Final - public InGameHud inGameHud; - + public Gui inGameHud; + @Shadow public ClientLevel world; - + @Shadow @Final private BlockColors blockColors; @@ -46,28 +45,27 @@ public class MinecraftClientMixin { @Shadow @Final private ItemColors itemColors; - + @Inject(method = "*", at = @At("TAIL")) - private void be_onInit(RunArgs args, CallbackInfo info) { + private void be_onInit(GameConfig args, CallbackInfo info) { Registry.BLOCK.forEach(block -> { if (block instanceof IColorProvider) { IColorProvider provider = (IColorProvider) block; - blockColors.registerColorProvider(provider.getBlockProvider(), block); + blockColors.register(provider.getProvider(), block); itemColors.register(provider.getItemProvider(), block.asItem()); } }); } - + @Inject(method = "getMusicType", at = @At("HEAD"), cancellable = true) - private void be_getEndMusic(CallbackInfoReturnable info) { - if (!(this.currentScreen instanceof CreditsScreen) && this.player != null) { - if (this.player.world.dimension() == Level.END) { - if (this.inGameHud.getBossBarHud().shouldPlayDragonMusic() - && MHelper.lengthSqr(this.player.getX(), this.player.getZ()) < 250000) { - info.setReturnValue(MusicType.DRAGON); - } else { - MusicSound sound = (MusicSound) this.world.getBiomeAccess().method_27344(this.player.getBlockPos()) - .getMusic().orElse(MusicType.END); + private void be_getEndMusic(CallbackInfoReturnable info) { + if (!(this.currentScreen instanceof WinScreen) && this.player != null) { + if (this.player.level.dimension() == Level.END) { + if (this.inGameHud.getBossOverlay().shouldPlayMusic() && MHelper.lengthSqr(this.player.getX(), this.player.getZ()) < 250000) { + info.setReturnValue(Musics.END_BOSS); + } + else { + Music sound = (Music) this.world.getBiomeManager().getNoiseBiomeAtPosition(this.player.blockPosition()).getBackgroundMusic().orElse(Musics.END); info.setReturnValue(sound); } info.cancel(); diff --git a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java index 5e4ed077..687e9475 100644 --- a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java @@ -4,7 +4,14 @@ import java.io.InputStreamReader; import java.io.Reader; import java.nio.charset.StandardCharsets; import java.util.Optional; - +import net.minecraft.client.renderer.block.model.BlockModel; +import net.minecraft.client.resources.model.ModelBakery; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.Resource; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -12,40 +19,31 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.world.level.block.Block; -import net.minecraft.client.render.model.ModelLoader; -import net.minecraft.client.render.model.json.JsonUnbakedModel; -import net.minecraft.world.item.Item; -import net.minecraft.resource.Resource; -import net.minecraft.resource.ResourceManager; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.Registry; import ru.betterend.BetterEnd; import ru.betterend.patterns.Patterned; import ru.betterend.world.generator.GeneratorOptions; -@Mixin(ModelLoader.class) +@Mixin(ModelBakery.class) public class ModelLoaderMixin { @Final @Shadow private ResourceManager resourceManager; - + @Inject(method = "loadModelFromJson", at = @At("HEAD"), cancellable = true) - private void be_loadModelPattern(ResourceLocation id, CallbackInfoReturnable info) { + private void be_loadModelPattern(ResourceLocation id, CallbackInfoReturnable info) { if (id.getNamespace().equals(BetterEnd.MOD_ID)) { ResourceLocation modelId = new ResourceLocation(id.getNamespace(), "models/" + id.getPath() + ".json"); - JsonUnbakedModel model; + BlockModel model; try (Resource resource = this.resourceManager.getResource(modelId)) { Reader reader = new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8); - model = JsonUnbakedModel.deserialize(reader); - model.id = id.toString(); + model = BlockModel.fromStream(reader); + model.name = id.toString(); info.setReturnValue(model); } catch (Exception ex) { String data[] = id.getPath().split("/"); if (data.length > 1) { ResourceLocation itemId = new ResourceLocation(id.getNamespace(), data[1]); - Optional block = Registry.BLOCK.getOrEmpty(itemId); + Optional block = Registry.BLOCK.getOptional(itemId); if (block.isPresent()) { if (block.get() instanceof Patterned) { Patterned patterned = (Patterned) block.get(); @@ -53,7 +51,7 @@ public class ModelLoaderMixin { info.setReturnValue(model); } } else { - Optional item = Registry.ITEM.getOrEmpty(itemId); + Optional item = Registry.ITEM.getOptional(itemId); if (item.isPresent() && item.get() instanceof Patterned) { Patterned patterned = (Patterned) item.get(); model = this.be_getModel(data, id, patterned); @@ -64,8 +62,8 @@ public class ModelLoaderMixin { } } } - - private JsonUnbakedModel be_getModel(String data[], ResourceLocation id, Patterned patterned) { + + private BlockModel be_getModel(String data[], ResourceLocation id, Patterned patterned) { String pattern; if (id.getPath().contains("item")) { pattern = patterned.getModelPattern(id.getPath()); @@ -76,17 +74,15 @@ public class ModelLoaderMixin { pattern = patterned.getModelPattern(data[1]); } } - JsonUnbakedModel model = JsonUnbakedModel.deserialize(pattern); - model.id = id.toString(); - + BlockModel model = BlockModel.fromString(pattern); + model.name = id.toString(); + return model; } - + @ModifyVariable(method = "loadModel", ordinal = 2, at = @At(value = "INVOKE")) public ResourceLocation be_SwitchModel(ResourceLocation id) { - if (GeneratorOptions.changeChorusPlant() && id.getNamespace().equals("minecraft") - && id.getPath().startsWith("blockstates/") && id.getPath().contains("chorus") - && !id.getPath().contains("custom_")) { + if (GeneratorOptions.changeChorusPlant() && id.getNamespace().equals("minecraft") && id.getPath().startsWith("blockstates/") && id.getPath().contains("chorus") && !id.getPath().contains("custom_")) { id = new ResourceLocation(id.getPath().replace("chorus", "custom_chorus")); } return id; diff --git a/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java b/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java index 1754ac85..60c4e394 100644 --- a/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java @@ -2,30 +2,27 @@ package ru.betterend.mixin.client; import java.io.Reader; import java.io.StringReader; - +import net.minecraft.client.renderer.block.model.BlockModelDefinition; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.level.block.Block; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.google.gson.Gson; - -import net.minecraft.world.level.block.Block; -import net.minecraft.client.render.model.json.ModelVariantMap; -import net.minecraft.util.JsonHelper; import ru.betterend.patterns.BlockPatterned; -@Mixin(ModelVariantMap.class) +@Mixin(BlockModelDefinition.class) public abstract class ModelVariantMapMixin { - + @Inject(method = "deserialize", at = @At("HEAD"), cancellable = true) - private static void be_deserializeBlockState(ModelVariantMap.DeserializationContext context, Reader reader, - CallbackInfoReturnable info) { - Block block = context.getStateFactory().defaultBlockState().getBlock(); + private static void be_deserializeBlockState(BlockModelDefinition.Context context, Reader reader, CallbackInfoReturnable info) { + Block block = context.getDefinition().any().getBlock(); if (block instanceof BlockPatterned) { String pattern = ((BlockPatterned) block).getStatesPattern(reader); Gson gson = ContextGsonAccessor.class.cast(context).getGson(); - ModelVariantMap map = JsonHelper.deserialize(gson, new StringReader(pattern), ModelVariantMap.class); + BlockModelDefinition map = GsonHelper.fromJson(gson, new StringReader(pattern), BlockModelDefinition.class); info.setReturnValue(map); } } diff --git a/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java b/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java index f65bce48..d28a8e45 100644 --- a/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java @@ -1,47 +1,45 @@ package ru.betterend.mixin.client; import java.util.Random; - +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.sounds.AbstractSoundInstance; +import net.minecraft.client.resources.sounds.SoundInstance; +import net.minecraft.client.sounds.MusicManager; +import net.minecraft.sounds.Music; +import net.minecraft.util.Mth; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.sound.AbstractSoundInstance; -import net.minecraft.client.sound.MusicTracker; -import net.minecraft.client.sound.SoundInstance; -import net.minecraft.sound.MusicSound; -import net.minecraft.util.Mth; -import net.minecraft.world.level.Level; import ru.betterend.client.ClientOptions; -@Mixin(MusicTracker.class) +@Mixin(MusicManager.class) public class MusicTrackerMixin { @Shadow @Final private Minecraft client; - + @Shadow @Final private Random random; - + @Shadow private SoundInstance current; - + @Shadow private int timeUntilNextSong; - + private static float volume = 1; private static float srcVolume = 0; private static long time; - + @Inject(method = "tick", at = @At("HEAD"), cancellable = true) public void be_onTick(CallbackInfo info) { if (ClientOptions.blendBiomeMusic()) { - MusicSound musicSound = client.getMusicType(); + Music musicSound = client.getSituationalMusic(); if (be_checkNullSound(musicSound) && volume > 0 && be_isInEnd() && be_shouldChangeSound(musicSound)) { if (volume > 0) { if (srcVolume < 0) { @@ -50,7 +48,7 @@ public class MusicTrackerMixin { if (current instanceof AbstractSoundInstance) { ((AbstractSoundInstanceAccessor) current).setVolume(volume); } - client.getSoundManager().updateSoundVolume(current.getCategory(), current.getVolume() * volume); + client.getSoundManager().updateSourceVolume(current.getSource(), current.getVolume() * volume); long t = System.currentTimeMillis(); if (volume == 1 && time == 0) { time = t; @@ -74,26 +72,25 @@ public class MusicTrackerMixin { this.play(musicSound); } info.cancel(); - } else { + } + else { volume = 1; } } } - + private boolean be_isInEnd() { - return client.world != null && client.world.dimension().equals(Level.END); + return client.level != null && client.level.dimension().equals(Level.END); } - - private boolean be_shouldChangeSound(MusicSound musicSound) { - return current != null && !musicSound.getSound().getId().equals(this.current.getId()) - && musicSound.shouldReplaceCurrentMusic(); + + private boolean be_shouldChangeSound(Music musicSound) { + return current != null && !musicSound.getEvent().getLocation().equals(this.current.getLocation()) && musicSound.replaceCurrentMusic(); } - - private boolean be_checkNullSound(MusicSound musicSound) { - return musicSound != null && musicSound.getSound() != null; + + private boolean be_checkNullSound(Music musicSound) { + return musicSound != null && musicSound.getEvent() != null; } - + @Shadow - public void play(MusicSound type) { - } + public void play(Music type) {} } diff --git a/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java b/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java index 12a23843..0320e2fb 100644 --- a/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java @@ -1,7 +1,11 @@ package ru.betterend.mixin.client; import java.util.List; - +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.FallbackResourceManager; +import net.minecraft.server.packs.resources.Resource; +import net.minecraft.world.level.block.Block; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -10,22 +14,19 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.google.common.collect.Lists; - -import net.minecraft.world.level.block.Block; -import net.minecraft.resource.NamespaceResourceManager; -import net.minecraft.resource.Resource; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.Registry; import ru.betterend.BetterEnd; import ru.betterend.patterns.BlockPatterned; -@Mixin(NamespaceResourceManager.class) +@Mixin(FallbackResourceManager.class) public abstract class NamespaceResourceManagerMixin { - + @Shadow public abstract Resource getResource(ResourceLocation id); - - @Inject(method = "getAllResources", cancellable = true, at = @At(value = "NEW", target = "java/io/FileNotFoundException", shift = Shift.BEFORE)) + + @Inject(method = "getAllResources", cancellable = true, at = @At( + value = "NEW", + target = "java/io/FileNotFoundException", + shift = Shift.BEFORE)) public void be_getStatesPattern(ResourceLocation id, CallbackInfoReturnable> info) { if (id.getNamespace().equals(BetterEnd.MOD_ID)) { String[] data = id.getPath().split("/"); diff --git a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java index 760409ea..fd02404f 100644 --- a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java @@ -11,37 +11,36 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.mojang.blaze3d.systems.RenderSystem; - +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexBuffer; +import com.mojang.blaze3d.vertex.VertexFormat; +import com.mojang.math.Quaternion; +import com.mojang.math.Vector3f; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.Minecraft; -import net.minecraft.client.gl.VertexBuffer; -import net.minecraft.client.render.BackgroundRenderer; -import net.minecraft.client.render.BufferBuilder; -import net.minecraft.client.render.BufferBuilderStorage; -import net.minecraft.client.render.SkyProperties; -import net.minecraft.client.render.Tessellator; -import net.minecraft.client.render.VertexFormat; -import net.minecraft.client.render.VertexFormats; -import net.minecraft.client.render.WorldRenderer; -import net.minecraft.client.texture.TextureManager; -import net.minecraft.client.util.math.MatrixStack; -import com.mojang.math.Vector3f; import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.DimensionSpecialEffects; +import net.minecraft.client.renderer.FogRenderer; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.RenderBuffers; +import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.math.Quaternion; import ru.betterend.BetterEnd; import ru.betterend.client.ClientOptions; import ru.betterend.util.BackgroundInfo; import ru.betterend.util.MHelper; -@Mixin(WorldRenderer.class) +@Mixin(LevelRenderer.class) public class WorldRendererMixin { private static final ResourceLocation NEBULA_1 = BetterEnd.makeID("textures/sky/nebula_2.png"); private static final ResourceLocation NEBULA_2 = BetterEnd.makeID("textures/sky/nebula_3.png"); private static final ResourceLocation HORIZON = BetterEnd.makeID("textures/sky/nebula_1.png"); private static final ResourceLocation STARS = BetterEnd.makeID("textures/sky/stars.png"); private static final ResourceLocation FOG = BetterEnd.makeID("textures/sky/fog.png"); - + private static VertexBuffer stars1; private static VertexBuffer stars2; private static VertexBuffer stars3; @@ -60,23 +59,23 @@ public class WorldRendererMixin { private static float blind02; private static float blind06; private static boolean directOpenGL = false; - + @Shadow @Final private Minecraft client; - + @Shadow @Final private TextureManager textureManager; - + @Shadow private ClientLevel world; - + @Shadow private int ticks; - + @Inject(method = "*", at = @At("TAIL")) - private void be_onInit(Minecraft client, BufferBuilderStorage bufferBuilders, CallbackInfo info) { + private void be_onInit(Minecraft client, RenderBuffers bufferBuilders, CallbackInfo info) { be_initStars(); Random random = new Random(131); axis1 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); @@ -87,110 +86,107 @@ public class WorldRendererMixin { axis2.normalize(); axis3.normalize(); axis4.normalize(); - - directOpenGL = FabricLoader.getInstance().isModLoaded("optifabric") - || FabricLoader.getInstance().isModLoaded("immersive_portals"); + + directOpenGL = FabricLoader.getInstance().isModLoaded("optifabric") || FabricLoader.getInstance().isModLoaded("immersive_portals"); } - + @Inject(method = "renderSky", at = @At("HEAD"), cancellable = true) - private void be_renderBetterEndSky(MatrixStack matrices, float tickDelta, CallbackInfo info) { - if (ClientOptions.isCustomSky() && client.world.getSkyProperties().getSkyType() == SkyProperties.SkyType.END) { + private void be_renderBetterEndSky(PoseStack matrices, float tickDelta, CallbackInfo info) { + if (ClientOptions.isCustomSky() && client.level.effects().skyType() == DimensionSpecialEffects.SkyType.END) { time = (ticks % 360000) * 0.000017453292F; time2 = time * 2; time3 = time * 3; - - BackgroundRenderer.setFogBlack(); + + FogRenderer.levelFogColor(); RenderSystem.enableTexture(); - + if (directOpenGL) { GL11.glEnable(GL11.GL_ALPHA_TEST); GL11.glAlphaFunc(516, 0.0F); GL11.glEnable(GL11.GL_BLEND); RenderSystem.depthMask(false); - } else { + } + else { RenderSystem.enableAlphaTest(); RenderSystem.alphaFunc(516, 0.0F); RenderSystem.enableBlend(); } - + float blindA = 1F - BackgroundInfo.blindness; blind02 = blindA * 0.2F; blind06 = blindA * 0.6F; - + if (blindA > 0) { - matrices.push(); - matrices.multiply(new Quaternion(0, time, 0, false)); - textureManager.bindTexture(HORIZON); - be_renderBuffer(matrices, horizon, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, 0.7F * blindA); - matrices.pop(); - - matrices.push(); - matrices.multiply(new Quaternion(0, -time, 0, false)); - textureManager.bindTexture(NEBULA_1); - be_renderBuffer(matrices, nebulas1, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, blind02); - matrices.pop(); - - matrices.push(); - matrices.multiply(new Quaternion(0, time2, 0, false)); - textureManager.bindTexture(NEBULA_2); - be_renderBuffer(matrices, nebulas2, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, blind02); - matrices.pop(); - - textureManager.bindTexture(STARS); - - matrices.push(); - matrices.multiply(axis3.getRadialQuaternion(time)); - be_renderBuffer(matrices, stars3, VertexFormats.POSITION_TEXTURE, 0.77F, 0.31F, 0.73F, blind06); - matrices.pop(); - - matrices.push(); - matrices.multiply(axis4.getRadialQuaternion(time2)); - be_renderBuffer(matrices, stars4, VertexFormats.POSITION_TEXTURE, 1F, 1F, 1F, blind06); - matrices.pop(); + matrices.pushPose(); + matrices.mulPose(new Quaternion(0, time, 0, false)); + textureManager.bind(HORIZON); + be_renderBuffer(matrices, horizon, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, 0.7F * blindA); + matrices.popPose(); + + matrices.pushPose(); + matrices.mulPose(new Quaternion(0, -time, 0, false)); + textureManager.bind(NEBULA_1); + be_renderBuffer(matrices, nebulas1, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02); + matrices.popPose(); + + matrices.pushPose(); + matrices.mulPose(new Quaternion(0, time2, 0, false)); + textureManager.bind(NEBULA_2); + be_renderBuffer(matrices, nebulas2, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02); + matrices.popPose(); + + textureManager.bind(STARS); + + matrices.pushPose(); + matrices.mulPose(axis3.rotation(time)); + be_renderBuffer(matrices, stars3, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind06); + matrices.popPose(); + + matrices.pushPose(); + matrices.mulPose(axis4.rotation(time2)); + be_renderBuffer(matrices, stars4, DefaultVertexFormat.POSITION_TEX, 1F, 1F, 1F, blind06); + matrices.popPose(); } - + float a = (BackgroundInfo.fog - 1F); if (a > 0) { - if (a > 1) - a = 1; - textureManager.bindTexture(FOG); - be_renderBuffer(matrices, fog, VertexFormats.POSITION_TEXTURE, BackgroundInfo.red, BackgroundInfo.green, - BackgroundInfo.blue, a); + if (a > 1) a = 1; + textureManager.bind(FOG); + be_renderBuffer(matrices, fog, DefaultVertexFormat.POSITION_TEX, BackgroundInfo.red, BackgroundInfo.green, BackgroundInfo.blue, a); } RenderSystem.disableTexture(); - + if (blindA > 0) { - matrices.push(); - matrices.multiply(axis1.getRadialQuaternion(time3)); - be_renderBuffer(matrices, stars1, VertexFormats.POSITION, 1, 1, 1, blind06); - matrices.pop(); - - matrices.push(); - matrices.multiply(axis2.getRadialQuaternion(time2)); - be_renderBuffer(matrices, stars2, VertexFormats.POSITION, 0.95F, 0.64F, 0.93F, blind06); - matrices.pop(); + matrices.pushPose(); + matrices.mulPose(axis1.rotation(time3)); + be_renderBuffer(matrices, stars1, DefaultVertexFormat.POSITION, 1, 1, 1, blind06); + matrices.popPose(); + + matrices.pushPose(); + matrices.mulPose(axis2.rotation(time2)); + be_renderBuffer(matrices, stars2, DefaultVertexFormat.POSITION, 0.95F, 0.64F, 0.93F, blind06); + matrices.popPose(); } - + RenderSystem.enableTexture(); RenderSystem.depthMask(true); - + info.cancel(); } } - - private void be_renderBuffer(MatrixStack matrices, VertexBuffer buffer, VertexFormat format, float r, float g, - float b, float a) { + + private void be_renderBuffer(PoseStack matrices, VertexBuffer buffer, VertexFormat format, float r, float g, float b, float a) { RenderSystem.color4f(r, g, b, a); buffer.bind(); - format.startDrawing(0L); - buffer.draw(matrices.peek().getModel(), 7); - VertexBuffer.unbind(); - format.endDrawing(); + format.setupBufferState(0L); + buffer.draw(matrices.last().pose(), 7); + VertexBuffer.unbind(); + format.clearBufferState(); } private void be_initStars() { - BufferBuilder buffer = Tessellator.getInstance().getBuffer(); + BufferBuilder buffer = Tesselator.getInstance().getBuilder(); stars1 = be_buildBufferStars(buffer, stars1, 0.1, 0.30, 3500, 41315); stars2 = be_buildBufferStars(buffer, stars2, 0.1, 0.35, 2000, 35151); stars3 = be_buildBufferUVStars(buffer, stars3, 0.4, 1.2, 1000, 61354); @@ -200,78 +196,75 @@ public class WorldRendererMixin { horizon = be_buildBufferHorizon(buffer, horizon); fog = be_buildBufferFog(buffer, fog); } - - private VertexBuffer be_buildBufferStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, - double maxSize, int count, long seed) { + + private VertexBuffer be_buildBufferStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { if (buffer != null) { buffer.close(); } - buffer = new VertexBuffer(VertexFormats.POSITION); + buffer = new VertexBuffer(DefaultVertexFormat.POSITION); be_makeStars(bufferBuilder, minSize, maxSize, count, seed); bufferBuilder.end(); buffer.upload(bufferBuilder); return buffer; } - - private VertexBuffer be_buildBufferUVStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, - double maxSize, int count, long seed) { + + private VertexBuffer be_buildBufferUVStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { if (buffer != null) { buffer.close(); } - buffer = new VertexBuffer(VertexFormats.POSITION_TEXTURE); + buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); be_makeUVStars(bufferBuilder, minSize, maxSize, count, seed); bufferBuilder.end(); buffer.upload(bufferBuilder); return buffer; } - - private VertexBuffer be_buildBufferFarFog(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, - double maxSize, int count, long seed) { + + private VertexBuffer be_buildBufferFarFog(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { if (buffer != null) { buffer.close(); } - buffer = new VertexBuffer(VertexFormats.POSITION_TEXTURE); + buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); be_makeFarFog(bufferBuilder, minSize, maxSize, count, seed); bufferBuilder.end(); buffer.upload(bufferBuilder); return buffer; } - + private VertexBuffer be_buildBufferHorizon(BufferBuilder bufferBuilder, VertexBuffer buffer) { if (buffer != null) { buffer.close(); } - buffer = new VertexBuffer(VertexFormats.POSITION_TEXTURE); + buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); be_makeCylinder(bufferBuilder, 16, 50, 100); bufferBuilder.end(); buffer.upload(bufferBuilder); return buffer; } - + private VertexBuffer be_buildBufferFog(BufferBuilder bufferBuilder, VertexBuffer buffer) { if (buffer != null) { buffer.close(); } - buffer = new VertexBuffer(VertexFormats.POSITION_TEXTURE); + buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); be_makeCylinder(bufferBuilder, 16, 50, 70); bufferBuilder.end(); buffer.upload(bufferBuilder); return buffer; } - + private void be_makeStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { Random random = new Random(seed); - buffer.begin(7, VertexFormats.POSITION); + buffer.begin(7, DefaultVertexFormat.POSITION); for (int i = 0; i < count; ++i) { double posX = random.nextDouble() * 2.0 - 1.0; @@ -306,15 +299,15 @@ public class WorldRendererMixin { double ae = 0.0 * q - aa * r; double af = ae * n - ab * o; double ah = ab * n + ae * o; - buffer.vertex(j + af, k + ad, l + ah).next(); + buffer.vertex(j + af, k + ad, l + ah).endVertex(); } } } } - + private void be_makeUVStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { Random random = new Random(seed); - buffer.begin(7, VertexFormats.POSITION_TEXTURE); + buffer.begin(7, DefaultVertexFormat.POSITION_TEX); for (int i = 0; i < count; ++i) { double posX = random.nextDouble() * 2.0 - 1.0; @@ -353,16 +346,16 @@ public class WorldRendererMixin { double ah = ab * n + ae * o; float texU = (pos >> 1) & 1; float texV = (((pos + 1) >> 1) & 1) / 4F + minV; - pos++; - buffer.vertex(j + af, k + ad, l + ah).texture(texU, texV).next(); + pos ++; + buffer.vertex(j + af, k + ad, l + ah).uv(texU, texV).endVertex(); } } } } - + private void be_makeFarFog(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { Random random = new Random(seed); - buffer.begin(7, VertexFormats.POSITION_TEXTURE); + buffer.begin(7, DefaultVertexFormat.POSITION_TEX); for (int i = 0; i < count; ++i) { double posX = random.nextDouble() * 2.0 - 1.0; @@ -404,30 +397,30 @@ public class WorldRendererMixin { double ah = ab * n + ae * o; float texU = (pos >> 1) & 1; float texV = ((pos + 1) >> 1) & 1; - pos++; - buffer.vertex(j + af, k + ad, l + ah).texture(texU, texV).next(); + pos ++; + buffer.vertex(j + af, k + ad, l + ah).uv(texU, texV).endVertex(); } } } } - + private void be_makeCylinder(BufferBuilder buffer, int segments, double height, double radius) { - buffer.begin(7, VertexFormats.POSITION_TEXTURE); - for (int i = 0; i < segments; i++) { + buffer.begin(7, DefaultVertexFormat.POSITION_TEX); + for (int i = 0; i < segments; i ++) { double a1 = (double) i * Math.PI * 2.0 / (double) segments; double a2 = (double) (i + 1) * Math.PI * 2.0 / (double) segments; double px1 = Math.sin(a1) * radius; double pz1 = Math.cos(a1) * radius; double px2 = Math.sin(a2) * radius; double pz2 = Math.cos(a2) * radius; - + float u0 = (float) i / (float) segments; float u1 = (float) (i + 1) / (float) segments; - - buffer.vertex(px1, -height, pz1).texture(u0, 0).next(); - buffer.vertex(px1, height, pz1).texture(u0, 1).next(); - buffer.vertex(px2, height, pz2).texture(u1, 1).next(); - buffer.vertex(px2, -height, pz2).texture(u1, 0).next(); + + buffer.vertex(px1, -height, pz1).uv(u0, 0).endVertex(); + buffer.vertex(px1, height, pz1).uv(u0, 1).endVertex(); + buffer.vertex(px2, height, pz2).uv(u1, 1).endVertex(); + buffer.vertex(px2, -height, pz2).uv(u1, 0).endVertex(); } } } diff --git a/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java b/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java index 6f4f77bb..c7f32c8d 100644 --- a/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java @@ -1,33 +1,30 @@ package ru.betterend.mixin.common; import java.util.List; - +import net.minecraft.util.Mth; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.google.common.collect.Lists; - -import net.minecraft.world.level.block.AbstractBlock; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.item.enchantment.Enchantments; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.util.Mth; import ru.betterend.item.tool.EndHammerItem; import ru.betterend.util.MHelper; -@Mixin(AbstractBlock.class) +@Mixin(BlockBehaviour.class) public abstract class AbstractBlockMixin { - - @Inject(method = "getDrops", at = @At("HEAD"), cancellable = true) - public void be_getDroppedStacks(BlockState state, LootContext.Builder builder, - CallbackInfoReturnable> info) { + + @Inject(method = "getDroppedStacks", at = @At("HEAD"), cancellable = true) + public void be_getDroppedStacks(BlockState state, LootContext.Builder builder, CallbackInfoReturnable> info) { if (state.is(Blocks.GLOWSTONE)) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); if (tool != null && tool.getItem() instanceof EndHammerItem) { diff --git a/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java index 28c29eb4..19b4f081 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java @@ -1,13 +1,12 @@ package ru.betterend.mixin.common; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.minecraft.world.level.block.AnvilBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.IntegerProperty; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.betterend.blocks.basis.EndAnvilBlock; @Mixin(AnvilBlock.class) @@ -15,10 +14,10 @@ public class AnvilBlockMixin { @Inject(method = "getLandingState", at = @At("HEAD"), cancellable = true) private static void be_getLandingState(BlockState fallingState, CallbackInfoReturnable info) { if (fallingState.getBlock() instanceof EndAnvilBlock) { - IntegerProperty destructionProperty = ((EndAnvilBlock) fallingState.getBlock()).getDESTRUCTION(); - int destruction = fallingState.get(destructionProperty); + IntegerProperty destructionProperty = ((EndAnvilBlock) fallingState.getBlock()).getDestructionProperty(); + int destruction = fallingState.getValue(destructionProperty); try { - BlockState state = fallingState.with(destructionProperty, destruction + 1); + BlockState state = fallingState.setValue(destructionProperty, destruction + 1); info.setReturnValue(state); info.cancel(); } catch (Exception ex) { diff --git a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java index 9f393acc..28ad1cf7 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java @@ -3,103 +3,100 @@ package ru.betterend.mixin.common; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; - +import net.minecraft.tags.BlockTags; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AnvilMenu; +import net.minecraft.world.inventory.ContainerLevelAccess; +import net.minecraft.world.inventory.DataSlot; +import net.minecraft.world.inventory.ItemCombinerMenu; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.level.block.AnvilBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.world.level.block.AnvilBlock; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.player.PlayerInventory; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.RecipeManager; -import net.minecraft.screen.AnvilScreenHandler; -import net.minecraft.screen.ForgingScreenHandler; -import net.minecraft.screen.Property; -import net.minecraft.screen.ScreenHandlerContext; -import net.minecraft.screen.ScreenHandlerType; -import net.minecraft.tags.BlockTags; import ru.betterend.blocks.basis.EndAnvilBlock; import ru.betterend.interfaces.AnvilScreenHandlerExtended; import ru.betterend.recipe.builders.AnvilRecipe; -@Mixin(AnvilScreenHandler.class) -public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler implements AnvilScreenHandlerExtended { +@Mixin(AnvilMenu.class) +public abstract class AnvilScreenHandlerMixin extends ItemCombinerMenu implements AnvilScreenHandlerExtended { private List be_recipes = Collections.emptyList(); private AnvilRecipe be_currentRecipe; - private Property anvilLevel; + private DataSlot anvilLevel; - public AnvilScreenHandlerMixin(int syncId, PlayerInventory playerInventory) { - super(ScreenHandlerType.ANVIL, syncId, playerInventory, ScreenHandlerContext.EMPTY); + public AnvilScreenHandlerMixin(int syncId, Inventory playerInventory) { + super(MenuType.ANVIL, syncId, playerInventory, ContainerLevelAccess.NULL); } - @Inject(method = "(ILnet/minecraft/entity/player/PlayerInventory;Lnet/minecraft/screen/ScreenHandlerContext;)V", at = @At("TAIL")) - public void be_initAnvilLevel(int syncId, PlayerInventory inventory, ScreenHandlerContext context, - CallbackInfo info) { - if (context != ScreenHandlerContext.EMPTY) { - int anvLevel = context.run((world, blockPos) -> { + @Inject(method = "(ILnet/minecraft/entity/player/PlayerInventory;Lnet/minecraft/screen/ScreenHandlerContext;)V", + at = @At("TAIL")) + public void be_initAnvilLevel(int syncId, Inventory inventory, ContainerLevelAccess context, CallbackInfo info) { + if (context != ContainerLevelAccess.NULL) { + int anvLevel = context.evaluate((world, blockPos) -> { Block anvilBlock = world.getBlockState(blockPos).getBlock(); if (anvilBlock instanceof EndAnvilBlock) { return ((EndAnvilBlock) anvilBlock).getCraftingLevel(); } return 1; }, 1); - Property anvilLevel = Property.create(); + DataSlot anvilLevel = DataSlot.standalone(); anvilLevel.set(anvLevel); - this.anvilLevel = addProperty(anvilLevel); + this.anvilLevel = addDataSlot(anvilLevel); } } - + @Shadow - public abstract void updateResult(); - + public abstract void createResult(); + @Inject(method = "canTakeOutput", at = @At("HEAD"), cancellable = true) protected void be_canTakeOutput(Player player, boolean present, CallbackInfoReturnable info) { if (be_currentRecipe != null) { - info.setReturnValue(be_currentRecipe.checkHammerDurability(input, player)); + info.setReturnValue(be_currentRecipe.checkHammerDurability(inputSlots, player)); } } - + @Inject(method = "onTakeOutput", at = @At("HEAD"), cancellable = true) protected void be_onTakeOutput(Player player, ItemStack stack, CallbackInfoReturnable info) { if (be_currentRecipe != null) { - this.input.getStack(0).decrement(be_currentRecipe.getInputCount()); - stack = be_currentRecipe.craft(input, player); - this.onContentChanged(input); - this.context.run((world, blockPos) -> { + this.inputSlots.getItem(0).shrink(be_currentRecipe.getInputCount()); + stack = be_currentRecipe.craft(inputSlots, player); + this.slotsChanged(inputSlots); + this.access.execute((world, blockPos) -> { BlockState anvilState = world.getBlockState(blockPos); - if (!player.abilities.creativeMode && anvilState.isIn(BlockTags.ANVIL) - && player.getRandom().nextFloat() < 0.12F) { - BlockState landingState = AnvilBlock.getLandingState(anvilState); + if (!player.abilities.instabuild && anvilState.is(BlockTags.ANVIL) && player.getRandom().nextFloat() < 0.12F) { + BlockState landingState = AnvilBlock.damage(anvilState); if (landingState == null) { world.removeBlock(blockPos, false); - world.syncWorldEvent(1029, blockPos, 0); + world.levelEvent(1029, blockPos, 0); } else { - world.setBlockAndUpdate(blockPos, landingState, 2); - world.syncWorldEvent(1030, blockPos, 0); + world.setBlock(blockPos, landingState, 2); + world.levelEvent(1030, blockPos, 0); } } else { - world.syncWorldEvent(1030, blockPos, 0); + world.levelEvent(1030, blockPos, 0); } }); info.setReturnValue(stack); } } - + @Inject(method = "updateResult", at = @At("HEAD"), cancellable = true) public void be_updateOutput(CallbackInfo info) { - RecipeManager recipeManager = this.player.world.getRecipeManager(); - be_recipes = recipeManager.getAllMatches(AnvilRecipe.TYPE, input, player.world); + RecipeManager recipeManager = this.player.level.getRecipeManager(); + be_recipes = recipeManager.getRecipesFor(AnvilRecipe.TYPE, inputSlots, player.level); if (be_recipes.size() > 0) { int anvilLevel = this.anvilLevel.get(); - be_recipes = be_recipes.stream().filter(recipe -> anvilLevel >= recipe.getAnvilLevel()) - .collect(Collectors.toList()); + be_recipes = be_recipes.stream().filter(recipe -> + anvilLevel >= recipe.getAnvilLevel()).collect(Collectors.toList()); if (be_recipes.size() > 0) { if (be_currentRecipe == null || !be_recipes.contains(be_currentRecipe)) { be_currentRecipe = be_recipes.get(0); @@ -111,16 +108,16 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler imple } } } - + @Inject(method = "setNewItemName", at = @At("HEAD"), cancellable = true) public void be_setNewItemName(String string, CallbackInfo info) { if (be_currentRecipe != null) { info.cancel(); } } - + @Override - public boolean onButtonClick(Player player, int id) { + public boolean clickMenuButton(Player player, int id) { if (id == 0) { this.be_previousRecipe(); return true; @@ -128,27 +125,26 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler imple this.be_nextRecipe(); return true; } - return super.onButtonClick(player, id); + return super.clickMenuButton(player, id); } - + private void be_updateResult() { - if (be_currentRecipe == null) - return; - this.output.setStack(0, be_currentRecipe.craft(input)); - this.sendContentUpdates(); + if (be_currentRecipe == null) return; + this.resultSlots.setItem(0, be_currentRecipe.assemble(inputSlots)); + this.broadcastChanges(); } - + @Override public void be_updateCurrentRecipe(AnvilRecipe recipe) { this.be_currentRecipe = recipe; this.be_updateResult(); } - + @Override public AnvilRecipe be_getCurrentRecipe() { return this.be_currentRecipe; } - + @Override public List be_getRecipes() { return this.be_recipes; diff --git a/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java b/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java index 3f55c6ef..ce903a6e 100644 --- a/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java @@ -1,16 +1,14 @@ package ru.betterend.mixin.common; import java.util.UUID; - +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.item.ArmorItem; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; import com.google.common.collect.Multimap; -import net.minecraft.world.entity.ai.attributes.Attribute; -import net.minecraft.world.entity.ai.attributes.AttributeModifier; -import net.minecraft.world.item.ArmorItem; - @Mixin(ArmorItem.class) public interface ArmorItemAccessor { @Accessor("MODIFIERS") diff --git a/src/main/java/ru/betterend/mixin/common/BiomeArrayMixin.java b/src/main/java/ru/betterend/mixin/common/BiomeArrayMixin.java index 409ca5b6..13da34e7 100644 --- a/src/main/java/ru/betterend/mixin/common/BiomeArrayMixin.java +++ b/src/main/java/ru/betterend/mixin/common/BiomeArrayMixin.java @@ -1,16 +1,15 @@ package ru.betterend.mixin.common; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; - import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.biome.source.BiomeArray; +import net.minecraft.world.level.chunk.ChunkBiomeContainer; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import ru.betterend.interfaces.IBiomeArray; -@Mixin(BiomeArray.class) +@Mixin(ChunkBiomeContainer.class) public class BiomeArrayMixin implements IBiomeArray { @Final @Shadow diff --git a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java index 0eff76c9..aaf77045 100644 --- a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java +++ b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java @@ -1,23 +1,21 @@ package ru.betterend.mixin.common; import java.util.Random; - +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.BoneMealItem; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.biome.Biome.BiomeCategory; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.item.BoneMealItem; -import net.minecraft.world.item.ItemUsageContext; -import net.minecraft.util.ActionResult; -import net.minecraft.core.BlockPos; -import net.minecraft.core.BlockPos.MutableBlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.biome.Biome.Category; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -31,14 +29,14 @@ public class BoneMealItemMixin { private static final MutableBlockPos POS = new MutableBlockPos(); @Inject(method = "useOnBlock", at = @At("HEAD"), cancellable = true) - private void be_onUse(ItemUsageContext context, CallbackInfoReturnable info) { + private void be_onUse(UseOnContext context, CallbackInfoReturnable info) { Level world = context.getLevel(); - BlockPos blockPos = context.getBlockPos(); + BlockPos blockPos = context.getClickedPos(); if (!world.isClientSide) { - BlockPos offseted = blockPos.offset(context.getSide()); - boolean endBiome = world.getBiome(offseted).getCategory() == Category.THEEND; - - if (world.getBlockState(blockPos).isIn(EndTags.END_GROUND)) { + BlockPos offseted = blockPos.relative(context.getClickedFace()); + boolean endBiome = world.getBiome(offseted).getBiomeCategory() == BiomeCategory.THEEND; + + if (world.getBlockState(blockPos).is(EndTags.END_GROUND)) { boolean consume = false; if (world.getBlockState(blockPos).is(Blocks.END_STONE)) { BlockState nylium = beGetNylium(world, blockPos); @@ -46,32 +44,35 @@ public class BoneMealItemMixin { BlocksHelper.setWithoutUpdate(world, blockPos, nylium); consume = true; } - } else { + } + else { if (!world.getFluidState(offseted).isEmpty() && endBiome) { if (world.getBlockState(offseted).getBlock().equals(Blocks.WATER)) { consume = beGrowWaterGrass(world, blockPos); } - } else { + } + else { consume = beGrowGrass(world, blockPos); } } if (consume) { if (!context.getPlayer().isCreative()) { - context.getStack().decrement(1); + context.getItemInHand().shrink(1); } - world.syncWorldEvent(2005, blockPos, 0); - info.setReturnValue(ActionResult.SUCCESS); + world.levelEvent(2005, blockPos, 0); + info.setReturnValue(InteractionResult.SUCCESS); info.cancel(); } - } else if (!world.getFluidState(offseted).isEmpty() && endBiome) { + } + else if (!world.getFluidState(offseted).isEmpty() && endBiome) { if (world.getBlockState(offseted).getBlock().equals(Blocks.WATER)) { - info.setReturnValue(ActionResult.FAIL); + info.setReturnValue(InteractionResult.FAIL); info.cancel(); } } } } - + private boolean beGrowGrass(Level world, BlockPos pos) { int y1 = pos.getY() + 3; int y2 = pos.getY() - 3; @@ -84,7 +85,7 @@ public class BoneMealItemMixin { for (int y = y1; y >= y2; y--) { POS.setY(y); BlockPos down = POS.below(); - if (world.isAir(POS) && !world.isAir(down)) { + if (world.isEmptyBlock(POS) && !world.isEmptyBlock(down)) { BlockState grass = beGetGrassState(world, down); if (grass != null) { BlocksHelper.setWithoutUpdate(world, POS, grass); @@ -96,7 +97,7 @@ public class BoneMealItemMixin { } return result; } - + private boolean beGrowWaterGrass(Level world, BlockPos pos) { int y1 = pos.getY() + 3; int y2 = pos.getY() - 3; @@ -109,7 +110,7 @@ public class BoneMealItemMixin { for (int y = y1; y >= y2; y--) { POS.setY(y); BlockPos down = POS.below(); - if (world.getBlockState(POS).is(Blocks.WATER) && world.getBlockState(down).isIn(EndTags.END_GROUND)) { + if (world.getBlockState(POS).is(Blocks.WATER) && world.getBlockState(down).is(EndTags.END_GROUND)) { BlockState grass = beGetWaterGrassState(world, down); if (grass != null) { BlocksHelper.setWithoutUpdate(world, POS, grass); @@ -121,26 +122,26 @@ public class BoneMealItemMixin { } return result; } - + private BlockState beGetGrassState(Level world, BlockPos pos) { BlockState state = world.getBlockState(pos); Block block = state.getBlock(); block = BonemealUtil.getGrass(EndBiomes.getBiomeID(world.getBiome(pos)), block, world.getRandom()); return block == null ? null : block.defaultBlockState(); } - + private BlockState beGetWaterGrassState(Level world, BlockPos pos) { EndBiome biome = EndBiomes.getFromBiome(world.getBiome(pos)); if (world.random.nextInt(16) == 0) { return EndBlocks.CHARNIA_RED.defaultBlockState(); - } else if (biome == EndBiomes.FOGGY_MUSHROOMLAND || biome == EndBiomes.MEGALAKE - || biome == EndBiomes.MEGALAKE_GROVE) { - return world.random.nextBoolean() ? EndBlocks.CHARNIA_LIGHT_BLUE.defaultBlockState() - : EndBlocks.CHARNIA_LIGHT_BLUE.defaultBlockState(); - } else if (biome == EndBiomes.AMBER_LAND) { - return world.random.nextBoolean() ? EndBlocks.CHARNIA_ORANGE.defaultBlockState() - : EndBlocks.CHARNIA_RED.defaultBlockState(); - } else if (biome == EndBiomes.CHORUS_FOREST || biome == EndBiomes.SHADOW_FOREST) { + } + else if (biome == EndBiomes.FOGGY_MUSHROOMLAND || biome == EndBiomes.MEGALAKE || biome == EndBiomes.MEGALAKE_GROVE) { + return world.random.nextBoolean() ? EndBlocks.CHARNIA_LIGHT_BLUE.defaultBlockState() : EndBlocks.CHARNIA_LIGHT_BLUE.defaultBlockState(); + } + else if (biome == EndBiomes.AMBER_LAND) { + return world.random.nextBoolean() ? EndBlocks.CHARNIA_ORANGE.defaultBlockState() : EndBlocks.CHARNIA_RED.defaultBlockState(); + } + else if (biome == EndBiomes.CHORUS_FOREST || biome == EndBiomes.SHADOW_FOREST) { return EndBlocks.CHARNIA_PURPLE.defaultBlockState(); } return null; diff --git a/src/main/java/ru/betterend/mixin/common/BrewingAccessor.java b/src/main/java/ru/betterend/mixin/common/BrewingAccessor.java index b198c6c1..0093c018 100644 --- a/src/main/java/ru/betterend/mixin/common/BrewingAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/BrewingAccessor.java @@ -1,13 +1,12 @@ package ru.betterend.mixin.common; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - import net.minecraft.world.item.Item; import net.minecraft.world.item.alchemy.Potion; -import net.minecraft.world.item.crafting.BrewingRecipeRegistry; +import net.minecraft.world.item.alchemy.PotionBrewing; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; -@Mixin(BrewingRecipeRegistry.class) +@Mixin(PotionBrewing.class) public interface BrewingAccessor { @Invoker static void callRegisterPotionRecipe(Potion input, Item item, Potion output) { diff --git a/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java index ac47da86..570963f9 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java @@ -1,7 +1,21 @@ package ru.betterend.mixin.common; import java.util.Random; - +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.ChorusFlowerBlock; +import net.minecraft.world.level.block.ChorusPlantBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -10,22 +24,6 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.ChorusFlowerBlock; -import net.minecraft.world.level.block.ChorusPlantBlock; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.state.property.Properties; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.WorldView; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; @@ -33,83 +31,78 @@ import ru.betterend.world.generator.GeneratorOptions; @Mixin(value = ChorusFlowerBlock.class, priority = 100) public abstract class ChorusFlowerBlockMixin extends Block { - private static final VoxelShape SHAPE_FULL = Block.createCuboidShape(0, 0, 0, 16, 16, 16); - private static final VoxelShape SHAPE_HALF = Block.createCuboidShape(0, 0, 0, 16, 4, 16); - - public ChorusFlowerBlockMixin(net.minecraft.world.level.block.state.BlockBehaviour.Properties settings) { + private static final VoxelShape SHAPE_FULL = Block.box(0, 0, 0, 16, 16, 16); + private static final VoxelShape SHAPE_HALF = Block.box(0, 0, 0, 16, 4, 16); + + public ChorusFlowerBlockMixin(Properties settings) { super(settings); } @Shadow @Final private ChorusPlantBlock plantBlock; - + @Inject(method = "canPlaceAt", at = @At("HEAD"), cancellable = true) - private void beCanPlace(BlockState state, WorldView world, BlockPos pos, CallbackInfoReturnable info) { + private void beCanPlace(BlockState state, LevelReader world, BlockPos pos, CallbackInfoReturnable info) { if (world.getBlockState(pos.below()).is(EndBlocks.CHORUS_NYLIUM)) { info.setReturnValue(true); info.cancel(); } } - + @Inject(method = "randomTick", at = @At("HEAD"), cancellable = true) private void beOnTick(BlockState state, ServerLevel world, BlockPos pos, Random random, CallbackInfo info) { - if (world.getBlockState(pos.below()).isIn(EndTags.END_GROUND)) { - BlockPos up = pos.up(); - if (world.isAir(up) && up.getY() < 256) { + if (world.getBlockState(pos.below()).is(EndTags.END_GROUND)) { + BlockPos up = pos.above(); + if (world.isEmptyBlock(up) && up.getY() < 256) { int i = state.getValue(ChorusFlowerBlock.AGE); if (i < 5) { this.grow(world, up, i + 1); if (GeneratorOptions.changeChorusPlant()) { - BlocksHelper.setWithoutUpdate(world, pos, - plantBlock.defaultBlockState().with(ChorusPlantBlock.UP, true) - .with(ChorusPlantBlock.DOWN, true).with(BlocksHelper.ROOTS, true)); - } else { - BlocksHelper.setWithoutUpdate(world, pos, plantBlock.defaultBlockState() - .with(ChorusPlantBlock.UP, true).with(ChorusPlantBlock.DOWN, true)); + BlocksHelper.setWithoutUpdate(world, pos, plantBlock.defaultBlockState().setValue(ChorusPlantBlock.UP, true).setValue(ChorusPlantBlock.DOWN, true).setValue(BlocksHelper.ROOTS, true)); + } + else { + BlocksHelper.setWithoutUpdate(world, pos, plantBlock.defaultBlockState().setValue(ChorusPlantBlock.UP, true).setValue(ChorusPlantBlock.DOWN, true)); } info.cancel(); } } } } - + @Inject(method = "generate", at = @At("RETURN"), cancellable = true) private static void beOnGenerate(LevelAccessor world, BlockPos pos, Random random, int size, CallbackInfo info) { BlockState state = world.getBlockState(pos); if (GeneratorOptions.changeChorusPlant() && state.is(Blocks.CHORUS_PLANT)) { - BlocksHelper.setWithoutUpdate(world, pos, state.with(BlocksHelper.ROOTS, true)); + BlocksHelper.setWithoutUpdate(world, pos, state.setValue(BlocksHelper.ROOTS, true)); } } - + @Shadow - private static boolean isSurroundedByAir(WorldView world, BlockPos pos, @Nullable Direction exceptDirection) { - return false; - } - + private static boolean isSurroundedByAir(LevelReader world, BlockPos pos, @Nullable Direction exceptDirection) { return false; } + @Shadow - private void grow(Level world, BlockPos pos, int age) { - } - + private void grow(Level world, BlockPos pos, int age) {} + @Shadow - private void die(Level world, BlockPos pos) { - } - + private void die(Level world, BlockPos pos) {} + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { + public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { if (GeneratorOptions.changeChorusPlant()) { return state.getValue(ChorusFlowerBlock.AGE) == 5 ? SHAPE_HALF : SHAPE_FULL; - } else { - return super.getOutlineShape(state, world, pos, context); + } + else { + return super.getShape(state, world, pos, context); } } @Inject(method = "die", at = @At("HEAD"), cancellable = true) private void beOnDie(Level world, BlockPos pos, CallbackInfo info) { BlockState down = world.getBlockState(pos.below()); - if (down.is(Blocks.CHORUS_PLANT) || down.isIn(EndTags.GEN_TERRAIN)) { - world.setBlockAndUpdate(pos, this.defaultBlockState().with(Properties.AGE_5, 5), 2); - world.syncWorldEvent(1034, pos, 0); + if (down.is(Blocks.CHORUS_PLANT) || down.is(EndTags.GEN_TERRAIN)) { + world.setBlock(pos, this.defaultBlockState().setValue(BlockStateProperties.AGE_5, 5), 2); + world.levelEvent(1034, pos, 0); } info.cancel(); } diff --git a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java index 99535afb..8b5e0fd7 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java @@ -1,25 +1,24 @@ package ru.betterend.mixin.common; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.ChorusPlantBlock; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.world.level.block.AbstractBlock; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.ChorusPlantBlock; -import net.minecraft.world.item.ItemPlacementContext; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.state.property.Properties; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.WorldView; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; @@ -27,69 +26,72 @@ import ru.betterend.world.generator.GeneratorOptions; @Mixin(value = ChorusPlantBlock.class, priority = 100) public abstract class ChorusPlantBlockMixin extends Block { - public ChorusPlantBlockMixin(net.minecraft.world.level.block.state.BlockBehaviour.Properties settings) { + public ChorusPlantBlockMixin(Properties settings) { super(settings); } @Inject(method = "*", at = @At("TAIL")) - private void beOnInit(AbstractBlock.Properties settings, CallbackInfo info) { + private void beOnInit(BlockBehaviour.Properties settings, CallbackInfo info) { if (GeneratorOptions.changeChorusPlant()) { - this.setDefaultState(this.defaultBlockState().with(BlocksHelper.ROOTS, false)); + this.registerDefaultState(this.defaultBlockState().setValue(BlocksHelper.ROOTS, false)); } } - - @Inject(method = "createBlockStateDefinition", at = @At("TAIL")) + + @Inject(method = "appendProperties", at = @At("TAIL")) private void beAddProperties(StateDefinition.Builder builder, CallbackInfo info) { GeneratorOptions.init(); if (GeneratorOptions.changeChorusPlant()) { builder.add(BlocksHelper.ROOTS); } } - + @Inject(method = "withConnectionProperties", at = @At("RETURN"), cancellable = true) - private void beConnectionProperties(BlockView world, BlockPos pos, CallbackInfoReturnable info) { + private void beConnectionProperties(BlockGetter world, BlockPos pos, CallbackInfoReturnable info) { BlockState plant = info.getReturnValue(); if (plant.is(Blocks.CHORUS_PLANT)) { - if (world.getBlockState(pos.below()).isIn(EndTags.END_GROUND)) { + if (world.getBlockState(pos.below()).is(EndTags.END_GROUND)) { if (GeneratorOptions.changeChorusPlant()) { - info.setReturnValue(plant.with(Properties.DOWN, true).with(BlocksHelper.ROOTS, true)); - } else { - info.setReturnValue(plant.with(Properties.DOWN, true)); + info.setReturnValue(plant.setValue(BlockStateProperties.DOWN, true).setValue(BlocksHelper.ROOTS, true)); + } + else { + info.setReturnValue(plant.setValue(BlockStateProperties.DOWN, true)); } info.cancel(); - } else { + } + else { if (GeneratorOptions.changeChorusPlant()) { - info.setReturnValue(plant.with(BlocksHelper.ROOTS, false)); + info.setReturnValue(plant.setValue(BlocksHelper.ROOTS, false)); } info.cancel(); } } } - + @Inject(method = "canPlaceAt", at = @At("HEAD"), cancellable = true) - private void beCanPlace(BlockState state, WorldView world, BlockPos pos, CallbackInfoReturnable info) { + private void beCanPlace(BlockState state, LevelReader world, BlockPos pos, CallbackInfoReturnable info) { BlockState down = world.getBlockState(pos.below()); if (down.is(EndBlocks.CHORUS_NYLIUM) || down.is(Blocks.END_STONE)) { info.setReturnValue(true); info.cancel(); } } - - @Inject(method = "updateShape", at = @At("RETURN"), cancellable = true) - private void beStateForNeighborUpdate(BlockState state, Direction direction, BlockState newState, - LevelAccessor world, BlockPos pos, BlockPos posFrom, CallbackInfoReturnable info) { + + @Inject(method = "getStateForNeighborUpdate", at = @At("RETURN"), cancellable = true) + private void beStateForNeighborUpdate(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom, CallbackInfoReturnable info) { BlockState plant = info.getReturnValue(); if (plant.is(Blocks.CHORUS_PLANT)) { - if (world.getBlockState(pos.below()).isIn(EndTags.END_GROUND)) { + if (world.getBlockState(pos.below()).is(EndTags.END_GROUND)) { if (GeneratorOptions.changeChorusPlant()) { - plant = plant.with(Properties.DOWN, true).with(BlocksHelper.ROOTS, true); - } else { - plant = plant.with(Properties.DOWN, true); + plant = plant.setValue(BlockStateProperties.DOWN, true).setValue(BlocksHelper.ROOTS, true); + } + else { + plant = plant.setValue(BlockStateProperties.DOWN, true); } info.cancel(); - } else { + } + else { if (GeneratorOptions.changeChorusPlant()) { - plant = plant.with(BlocksHelper.ROOTS, false); + plant = plant.setValue(BlocksHelper.ROOTS, false); } info.cancel(); } @@ -97,18 +99,18 @@ public abstract class ChorusPlantBlockMixin extends Block { info.cancel(); } } - + @Inject(method = "getPlacementState", at = @At("RETURN"), cancellable = true) - private void beGetPlacementState(ItemPlacementContext ctx, CallbackInfoReturnable info) { - BlockPos pos = ctx.getBlockPos(); + private void beGetPlacementState(BlockPlaceContext ctx, CallbackInfoReturnable info) { + BlockPos pos = ctx.getClickedPos(); Level world = ctx.getLevel(); BlockState plant = info.getReturnValue(); - if (ctx.canPlace() && plant.is(Blocks.CHORUS_PLANT) - && world.getBlockState(pos.below()).isIn(EndTags.END_GROUND)) { + if (ctx.canPlace() && plant.is(Blocks.CHORUS_PLANT) && world.getBlockState(pos.below()).is(EndTags.END_GROUND)) { if (GeneratorOptions.changeChorusPlant()) { - info.setReturnValue(plant.with(BlocksHelper.ROOTS, true).with(Properties.DOWN, true)); - } else { - info.setReturnValue(plant.with(Properties.DOWN, true)); + info.setReturnValue(plant.setValue(BlocksHelper.ROOTS, true).setValue(BlockStateProperties.DOWN, true)); + } + else { + info.setReturnValue(plant.setValue(BlockStateProperties.DOWN, true)); } info.cancel(); } diff --git a/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java index 7c1e2638..fee8e1f9 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java @@ -1,21 +1,19 @@ package ru.betterend.mixin.common; import java.util.Random; - +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.ChorusFlowerBlock; +import net.minecraft.world.level.block.PipeBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.ChorusPlantFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.ChorusFlowerBlock; -import net.minecraft.world.level.block.ConnectingBlock; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.levelgen.feature.ChorusPlantFeature; -import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; @@ -24,19 +22,16 @@ import ru.betterend.world.generator.GeneratorOptions; @Mixin(ChorusPlantFeature.class) public class ChorusPlantFeatureMixin { @Inject(method = "generate", at = @At("HEAD"), cancellable = true) - private void be_onGenerate(WorldGenLevel structureWorldAccess, ChunkGenerator chunkGenerator, Random random, - BlockPos blockPos, NoneFeatureConfiguration defaultFeatureConfig, CallbackInfoReturnable info) { - if (structureWorldAccess.isAir(blockPos) - && structureWorldAccess.getBlockState(blockPos.below()).is(EndBlocks.CHORUS_NYLIUM)) { - ChorusFlowerBlock.generate(structureWorldAccess, blockPos, random, MHelper.randRange(8, 16, random)); + private void be_onGenerate(WorldGenLevel structureWorldAccess, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, NoneFeatureConfiguration defaultFeatureConfig, CallbackInfoReturnable info) { + if (structureWorldAccess.isEmptyBlock(blockPos) && structureWorldAccess.getBlockState(blockPos.below()).is(EndBlocks.CHORUS_NYLIUM)) { + ChorusFlowerBlock.generatePlant(structureWorldAccess, blockPos, random, MHelper.randRange(8, 16, random)); BlockState bottom = structureWorldAccess.getBlockState(blockPos); if (bottom.is(Blocks.CHORUS_PLANT)) { if ((GeneratorOptions.changeChorusPlant())) { - BlocksHelper.setWithoutUpdate(structureWorldAccess, blockPos, - bottom.with(BlocksHelper.ROOTS, true).with(ConnectingBlock.DOWN, true)); - } else { - BlocksHelper.setWithoutUpdate(structureWorldAccess, blockPos, - bottom.with(ConnectingBlock.DOWN, true)); + BlocksHelper.setWithoutUpdate(structureWorldAccess, blockPos, bottom.setValue(BlocksHelper.ROOTS, true).setValue(PipeBlock.DOWN, true)); + } + else { + BlocksHelper.setWithoutUpdate(structureWorldAccess, blockPos, bottom.setValue(PipeBlock.DOWN, true)); } } info.setReturnValue(true); diff --git a/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java b/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java index bf506f0c..9152b3fd 100644 --- a/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java @@ -1,11 +1,10 @@ package ru.betterend.mixin.common; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.ComposterBlock; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; -import net.minecraft.world.level.block.ComposterBlock; -import net.minecraft.world.level.ItemLike; - @Mixin(ComposterBlock.class) public interface ComposterBlockAccessor { @Invoker diff --git a/src/main/java/ru/betterend/mixin/common/CraftingScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/CraftingScreenHandlerMixin.java index 426ca0c4..6b4f898a 100644 --- a/src/main/java/ru/betterend/mixin/common/CraftingScreenHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/CraftingScreenHandlerMixin.java @@ -1,5 +1,9 @@ package ru.betterend.mixin.common; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.ContainerLevelAccess; +import net.minecraft.world.inventory.CraftingMenu; +import net.minecraft.world.level.block.CraftingTableBlock; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -7,20 +11,16 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.world.level.block.CraftingTableBlock; -import net.minecraft.world.entity.player.Player; -import net.minecraft.screen.CraftingScreenHandler; -import net.minecraft.screen.ScreenHandlerContext; - -@Mixin(CraftingScreenHandler.class) -public abstract class CraftingScreenHandlerMixin { +@Mixin(CraftingMenu.class) +public abstract class CraftingScreenHandlerMixin +{ @Shadow @Final - private ScreenHandlerContext context; + private ContainerLevelAccess context; @Inject(method = "canUse", at = @At("HEAD"), cancellable = true) private void be_canUse(Player player, CallbackInfoReturnable info) { - if (context.run((world, pos) -> { + if (context.evaluate((world, pos) -> { return world.getBlockState(pos).getBlock() instanceof CraftingTableBlock; }, true)) { info.setReturnValue(true); diff --git a/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java b/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java index 8a974c38..b25e55cc 100644 --- a/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java +++ b/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java @@ -1,31 +1,28 @@ package ru.betterend.mixin.common; +import net.minecraft.core.Registry; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.dimension.DimensionType; +import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; +import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.core.Registry; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.dimension.DimensionType; -import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; -import net.minecraft.world.gen.chunk.NoiseChunkGenerator; import ru.betterend.world.generator.BetterEndBiomeSource; import ru.betterend.world.generator.GeneratorOptions; @Mixin(value = DimensionType.class, priority = 100) public class DimensionTypeMixin { @Inject(method = "createEndGenerator", at = @At("HEAD"), cancellable = true) - private static void be_replaceGenerator(Registry biomeRegistry, - Registry chunkGeneratorSettingsRegistry, long seed, - CallbackInfoReturnable info) { - info.setReturnValue(new NoiseChunkGenerator(new BetterEndBiomeSource(biomeRegistry, seed), seed, () -> { - return (ChunkGeneratorSettings) chunkGeneratorSettingsRegistry.getOrThrow(ChunkGeneratorSettings.END); + private static void be_replaceGenerator(Registry biomeRegistry, Registry chunkGeneratorSettingsRegistry, long seed, CallbackInfoReturnable info) { + info.setReturnValue(new NoiseBasedChunkGenerator(new BetterEndBiomeSource(biomeRegistry, seed), seed, () -> { + return (NoiseGeneratorSettings) chunkGeneratorSettingsRegistry.getOrThrow(NoiseGeneratorSettings.END); })); info.cancel(); } - + @Inject(method = "hasEnderDragonFight", at = @At("HEAD"), cancellable = true) private void be_hasEnderDragonFight(CallbackInfoReturnable info) { if (!GeneratorOptions.hasDragonFights()) { diff --git a/src/main/java/ru/betterend/mixin/common/EnchantmentScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/EnchantmentScreenHandlerMixin.java index faba5e67..2b0e27e3 100644 --- a/src/main/java/ru/betterend/mixin/common/EnchantmentScreenHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EnchantmentScreenHandlerMixin.java @@ -2,35 +2,33 @@ package ru.betterend.mixin.common; import java.util.List; import java.util.Random; - +import net.minecraft.core.Registry; +import net.minecraft.world.Container; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ContainerLevelAccess; +import net.minecraft.world.inventory.DataSlot; +import net.minecraft.world.inventory.EnchantmentMenu; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.EnchantmentInstance; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.item.enchantment.EnchantmentLevelEntry; -import net.minecraft.inventory.Inventory; -import net.minecraft.world.item.ItemStack; -import net.minecraft.screen.EnchantmentScreenHandler; -import net.minecraft.screen.Property; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.screen.ScreenHandlerContext; -import net.minecraft.screen.ScreenHandlerType; -import net.minecraft.core.Registry; import ru.betterend.registry.EndTags; -@Mixin(EnchantmentScreenHandler.class) -public abstract class EnchantmentScreenHandlerMixin extends ScreenHandler { +@Mixin(EnchantmentMenu.class) +public abstract class EnchantmentScreenHandlerMixin extends AbstractContainerMenu { @Shadow @Final - private Inventory inventory; + private Container inventory; @Shadow @Final - private ScreenHandlerContext context; + private ContainerLevelAccess context; @Shadow @Final @@ -38,7 +36,7 @@ public abstract class EnchantmentScreenHandlerMixin extends ScreenHandler { @Shadow @Final - private Property seed; + private DataSlot seed; @Shadow @Final @@ -52,45 +50,44 @@ public abstract class EnchantmentScreenHandlerMixin extends ScreenHandler { @Final public int[] enchantmentLevel; - protected EnchantmentScreenHandlerMixin(ScreenHandlerType type, int syncId) { + protected EnchantmentScreenHandlerMixin(MenuType type, int syncId) { super(type, syncId); } @Inject(method = "onContentChanged", at = @At("HEAD"), cancellable = true) - private void beOnContentChanged(Inventory inventory, CallbackInfo info) { + private void beOnContentChanged(Container inventory, CallbackInfo info) { if (inventory == this.inventory) { - ItemStack itemStack = inventory.getStack(0); + ItemStack itemStack = inventory.getItem(0); if (!itemStack.isEmpty() && itemStack.isEnchantable()) { - this.context.run((world, blockPos) -> { + this.context.execute((world, blockPos) -> { int i = 0; int j; for (j = -1; j <= 1; ++j) { for (int k = -1; k <= 1; ++k) { - if ((j != 0 || k != 0) && world.isAir(blockPos.add(k, 0, j)) - && world.isAir(blockPos.add(k, 1, j))) { - if (world.getBlockState(blockPos.add(k * 2, 0, j * 2)).isIn(EndTags.BOOKSHELVES)) { + if ((j != 0 || k != 0) && world.isEmptyBlock(blockPos.offset(k, 0, j)) && world.isEmptyBlock(blockPos.offset(k, 1, j))) { + if (world.getBlockState(blockPos.offset(k * 2, 0, j * 2)).is(EndTags.BOOKSHELVES)) { ++i; } - if (world.getBlockState(blockPos.add(k * 2, 1, j * 2)).isIn(EndTags.BOOKSHELVES)) { + if (world.getBlockState(blockPos.offset(k * 2, 1, j * 2)).is(EndTags.BOOKSHELVES)) { ++i; } if (k != 0 && j != 0) { - if (world.getBlockState(blockPos.add(k * 2, 0, j)).isIn(EndTags.BOOKSHELVES)) { + if (world.getBlockState(blockPos.offset(k * 2, 0, j)).is(EndTags.BOOKSHELVES)) { ++i; } - if (world.getBlockState(blockPos.add(k * 2, 1, j)).isIn(EndTags.BOOKSHELVES)) { + if (world.getBlockState(blockPos.offset(k * 2, 1, j)).is(EndTags.BOOKSHELVES)) { ++i; } - if (world.getBlockState(blockPos.add(k, 0, j * 2)).isIn(EndTags.BOOKSHELVES)) { + if (world.getBlockState(blockPos.offset(k, 0, j * 2)).is(EndTags.BOOKSHELVES)) { ++i; } - if (world.getBlockState(blockPos.add(k, 1, j * 2)).isIn(EndTags.BOOKSHELVES)) { + if (world.getBlockState(blockPos.offset(k, 1, j * 2)).is(EndTags.BOOKSHELVES)) { ++i; } } @@ -101,8 +98,7 @@ public abstract class EnchantmentScreenHandlerMixin extends ScreenHandler { this.random.setSeed((long) this.seed.get()); for (j = 0; j < 3; ++j) { - this.enchantmentPower[j] = EnchantmentHelper.calculateRequiredExperienceLevel(this.random, j, i, - itemStack); + this.enchantmentPower[j] = EnchantmentHelper.getEnchantmentCost(this.random, j, i, itemStack); this.enchantmentId[j] = -1; this.enchantmentLevel[j] = -1; if (this.enchantmentPower[j] < j + 1) { @@ -112,21 +108,19 @@ public abstract class EnchantmentScreenHandlerMixin extends ScreenHandler { for (j = 0; j < 3; ++j) { if (this.enchantmentPower[j] > 0) { - List list = this.generateEnchantments(itemStack, j, - this.enchantmentPower[j]); + List list = this.generateEnchantments(itemStack, j, this.enchantmentPower[j]); if (list != null && !list.isEmpty()) { - EnchantmentLevelEntry enchantmentLevelEntry = (EnchantmentLevelEntry) list - .get(this.random.nextInt(list.size())); - this.enchantmentId[j] = Registry.ENCHANTMENT - .getRawId(enchantmentLevelEntry.enchantment); + EnchantmentInstance enchantmentLevelEntry = (EnchantmentInstance) list.get(this.random.nextInt(list.size())); + this.enchantmentId[j] = Registry.ENCHANTMENT.getId(enchantmentLevelEntry.enchantment); this.enchantmentLevel[j] = enchantmentLevelEntry.level; } } } - this.sendContentUpdates(); + this.broadcastChanges(); }); - } else { + } + else { for (int i = 0; i < 3; ++i) { this.enchantmentPower[i] = 0; this.enchantmentId[i] = -1; @@ -138,7 +132,7 @@ public abstract class EnchantmentScreenHandlerMixin extends ScreenHandler { } @Shadow - private List generateEnchantments(ItemStack stack, int slot, int level) { + private List generateEnchantments(ItemStack stack, int slot, int level) { return null; } } diff --git a/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java index 6faa563f..55d6b7c5 100644 --- a/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java @@ -1,41 +1,40 @@ package ru.betterend.mixin.common; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.WorldgenRandom; +import net.minecraft.world.level.levelgen.feature.EndCityFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.biome.source.BiomeSource; -import net.minecraft.world.gen.ChunkRandom; -import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.feature.EndCityFeature; import ru.betterend.world.generator.GeneratorOptions; @Mixin(EndCityFeature.class) public class EndCityFeatureMixin { @Inject(method = "shouldStartAt", at = @At("HEAD"), cancellable = true) - private void be_shouldStartAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long l, - ChunkRandom chunkRandom, int i, int j, Biome biome, ChunkPos chunkPos, - NoneFeatureConfiguration defaultFeatureConfig, CallbackInfoReturnable info) { + private void be_shouldStartAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long l, WorldgenRandom chunkRandom, int i, int j, Biome biome, ChunkPos chunkPos, NoneFeatureConfiguration defaultFeatureConfig, CallbackInfoReturnable info) { if (GeneratorOptions.useNewGenerator()) { int chance = GeneratorOptions.getEndCityFailChance(); if (chance == 0) { info.setReturnValue(getGenerationHeight(i, j, chunkGenerator) >= 60); info.cancel(); - } else if (chunkRandom.nextInt(chance) == 0) { + } + else if (chunkRandom.nextInt(chance) == 0){ info.setReturnValue(getGenerationHeight(i, j, chunkGenerator) >= 60); info.cancel(); - } else { + } + else { info.setReturnValue(false); info.cancel(); } } } - + @Shadow private static int getGenerationHeight(int chunkX, int chunkZ, ChunkGenerator chunkGenerator) { return 0; diff --git a/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java index 851439bd..6f544079 100644 --- a/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java @@ -1,7 +1,15 @@ package ru.betterend.mixin.common; import java.util.Random; - +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.levelgen.feature.EndPodiumFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -9,61 +17,50 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.nbt.NbtHelper; -import net.minecraft.structure.Structure; -import net.minecraft.structure.StructurePlacementData; -import net.minecraft.core.BlockPos; -import net.minecraft.world.Heightmap.Type; -import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.feature.EndPortalFeature; import ru.betterend.BetterEnd; import ru.betterend.util.StructureHelper; import ru.betterend.util.WorldDataUtil; import ru.betterend.world.generator.GeneratorOptions; -@Mixin(EndPortalFeature.class) +@Mixin(EndPodiumFeature.class) public class EndPortalFeatureMixin { @Final @Shadow private boolean open; - + @Inject(method = "generate", at = @At("HEAD"), cancellable = true) - private void bePortalGenerate(WorldGenLevel world, ChunkGenerator generator, Random random, BlockPos blockPos, - NoneFeatureConfiguration config, CallbackInfoReturnable info) { + private void bePortalGenerate(WorldGenLevel world, ChunkGenerator generator, Random random, BlockPos blockPos, NoneFeatureConfiguration config, CallbackInfoReturnable info) { if (!GeneratorOptions.hasPortal()) { info.setReturnValue(false); info.cancel(); - } else if (GeneratorOptions.replacePortal()) { + } + else if (GeneratorOptions.replacePortal()) { blockPos = be_updatePos(blockPos, world); - Structure structure = StructureHelper - .readStructure(BetterEnd.makeID(open ? "portal/end_portal_active" : "portal/end_portal_inactive")); + StructureTemplate structure = StructureHelper.readStructure(BetterEnd.makeID(open ? "portal/end_portal_active" : "portal/end_portal_inactive")); BlockPos size = structure.getSize(); - blockPos = blockPos.add(-(size.getX() >> 1), -3, -(size.getZ() >> 1)); - structure.place(world, blockPos, new StructurePlacementData(), random); + blockPos = blockPos.offset(-(size.getX() >> 1), -3, -(size.getZ() >> 1)); + structure.placeInWorldChunk(world, blockPos, new StructurePlaceSettings(), random); info.setReturnValue(true); info.cancel(); } } - + @ModifyVariable(method = "generate", ordinal = 0, at = @At("HEAD")) private BlockPos be_setPosOnGround(BlockPos blockPos, WorldGenLevel world) { return be_updatePos(blockPos, world); } - + private BlockPos be_updatePos(BlockPos blockPos, WorldGenLevel world) { if (GeneratorOptions.useNewGenerator()) { BlockPos pos = GeneratorOptions.getPortalPos(); - if (pos.equals(BlockPos.ORIGIN)) { - int y = world.getChunk(blockPos).sampleHeightmap(Type.WORLD_SURFACE, blockPos.getX(), blockPos.getZ()); + if (pos.equals(BlockPos.ZERO)) { + int y = world.getChunk(blockPos).getHeight(Types.WORLD_SURFACE, blockPos.getX(), blockPos.getZ()); if (y < 1) { y = 65; } pos = new BlockPos(pos.getX(), y, pos.getZ()); GeneratorOptions.setPortalPos(pos); - WorldDataUtil.getRootTag().put("portal", NbtHelper.fromBlockPos(pos)); + WorldDataUtil.getRootTag().put("portal", NbtUtils.writeBlockPos(pos)); WorldDataUtil.saveFile(); } return pos; diff --git a/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java index 592906c2..10489789 100644 --- a/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java @@ -7,82 +7,78 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.PaneBlock; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.decoration.EndCrystalEntity; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.structure.Structure; -import net.minecraft.structure.StructurePlacementData; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.nbt.CompoundTag; import net.minecraft.util.Mth; -import net.minecraft.world.Heightmap.Type; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.boss.enderdragon.EndCrystal; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.IronBarsBlock; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.levelgen.feature.EndSpikeFeature; -import net.minecraft.world.level.levelgen.feature.EndSpikeFeatureConfig; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.levelgen.feature.SpikeFeature; +import net.minecraft.world.level.levelgen.feature.configurations.SpikeConfiguration; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import ru.betterend.BetterEnd; import ru.betterend.util.BlocksHelper; import ru.betterend.util.StructureHelper; import ru.betterend.util.WorldDataUtil; import ru.betterend.world.generator.GeneratorOptions; -@Mixin(EndSpikeFeature.class) +@Mixin(SpikeFeature.class) public class EndSpikeFeatureMixin { @Inject(method = "generate", at = @At("HEAD"), cancellable = true) - private void beSpikeGenerate(WorldGenLevel structureWorldAccess, ChunkGenerator chunkGenerator, Random random, - BlockPos blockPos, EndSpikeFeatureConfig endSpikeFeatureConfig, CallbackInfoReturnable info) { + private void beSpikeGenerate(WorldGenLevel structureWorldAccess, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, SpikeConfiguration endSpikeFeatureConfig, CallbackInfoReturnable info) { if (!GeneratorOptions.hasPillars()) { info.setReturnValue(false); } } @Inject(method = "generateSpike", at = @At("HEAD"), cancellable = true) - private void be_generateSpike(ServerLevelAccessor world, Random random, EndSpikeFeatureConfig config, - EndSpikeFeature.Spike spike, CallbackInfo info) { + private void be_generateSpike(ServerLevelAccessor world, Random random, SpikeConfiguration config, SpikeFeature.EndSpike spike, CallbackInfo info) { int x = spike.getCenterX(); int z = spike.getCenterZ(); int radius = spike.getRadius(); int minY = 0; - + long lx = (long) x; long lz = (long) z; if (lx * lx + lz * lz < 10000) { String pillarID = String.format("%d_%d", x, z); CompoundTag pillar = WorldDataUtil.getCompoundTag("pillars"); boolean haveValue = pillar.contains(pillarID); - minY = haveValue ? pillar.getInt(pillarID) - : world.getChunk(x >> 4, z >> 4).sampleHeightmap(Type.WORLD_SURFACE, x & 15, z); + minY = haveValue ? pillar.getInt(pillarID) : world.getChunk(x >> 4, z >> 4).getHeight(Types.WORLD_SURFACE, x & 15, z); if (!haveValue) { pillar.putInt(pillarID, minY); WorldDataUtil.saveFile(); } - } else { - minY = world.getChunk(x >> 4, z >> 4).sampleHeightmap(Type.WORLD_SURFACE, x & 15, z); } - + else { + minY = world.getChunk(x >> 4, z >> 4).getHeight(Types.WORLD_SURFACE, x & 15, z); + } + int maxY = minY + spike.getHeight() - 64; - + if (GeneratorOptions.replacePillars() && be_radiusInRange(radius)) { radius--; - Structure base = StructureHelper.readStructure(BetterEnd.makeID("pillars/pillar_base_" + radius)); - Structure top = StructureHelper.readStructure( - BetterEnd.makeID("pillars/pillar_top_" + radius + (spike.isGuarded() ? "_cage" : ""))); + StructureTemplate base = StructureHelper.readStructure(BetterEnd.makeID("pillars/pillar_base_" + radius)); + StructureTemplate top = StructureHelper.readStructure(BetterEnd.makeID("pillars/pillar_top_" + radius + (spike.isGuarded() ? "_cage" : ""))); BlockPos side = base.getSize(); BlockPos pos1 = new BlockPos(x - (side.getX() >> 1), minY - 3, z - (side.getZ() >> 1)); minY = pos1.getY() + side.getY(); side = top.getSize(); BlockPos pos2 = new BlockPos(x - (side.getX() >> 1), maxY, z - (side.getZ() >> 1)); maxY = pos2.getY(); - - StructurePlacementData data = new StructurePlacementData(); - base.place(world, pos1, data, random); - top.place(world, pos2, data, random); - + + StructurePlaceSettings data = new StructurePlaceSettings(); + base.placeInWorldChunk(world, pos1, data, random); + top.placeInWorldChunk(world, pos2, data, random); + int r2 = radius * radius + 1; MutableBlockPos mut = new MutableBlockPos(); for (int px = -radius; px <= radius; px++) { @@ -95,10 +91,10 @@ public class EndSpikeFeatureMixin { for (int py = minY; py < maxY; py++) { mut.setY(py); if (world.getBlockState(mut).getMaterial().isReplaceable()) { - if ((px == radius || px == -radius || pz == radius || pz == -radius) - && random.nextInt(24) == 0) { + if ((px == radius || px == -radius || pz == radius || pz == -radius) && random.nextInt(24) == 0) { BlocksHelper.setWithoutUpdate(world, mut, Blocks.CRYING_OBSIDIAN); - } else { + } + else { BlocksHelper.setWithoutUpdate(world, mut, Blocks.OBSIDIAN); } } @@ -106,7 +102,8 @@ public class EndSpikeFeatureMixin { } } } - } else { + } + else { minY -= 15; int r2 = radius * radius + 1; MutableBlockPos mut = new MutableBlockPos(); @@ -130,13 +127,13 @@ public class EndSpikeFeatureMixin { mut.setZ(z); mut.setY(maxY); BlocksHelper.setWithoutUpdate(world, mut, Blocks.BEDROCK); - - EndCrystalEntity crystal = EntityType.END_CRYSTAL.create(world.toServerWorld()); - crystal.setBeamTarget(config.getPos()); + + EndCrystal crystal = EntityType.END_CRYSTAL.create(world.getLevel()); + crystal.setBeamTarget(config.getCrystalBeamTarget()); crystal.setInvulnerable(config.isCrystalInvulnerable()); - crystal.refreshPositionAndAngles(x + 0.5D, maxY + 1, z + 0.5D, random.nextFloat() * 360.0F, 0.0F); - world.spawnEntity(crystal); - + crystal.moveTo(x + 0.5D, maxY + 1, z + 0.5D, random.nextFloat() * 360.0F, 0.0F); + world.addFreshEntity(crystal); + if (spike.isGuarded()) { for (int px = -2; px <= 2; ++px) { boolean bl = Mth.abs(px) == 2; @@ -147,13 +144,8 @@ public class EndSpikeFeatureMixin { if (bl || bl2 || bl3) { boolean bl4 = px == -2 || px == 2 || bl3; boolean bl5 = pz == -2 || pz == 2 || bl3; - BlockState blockState = (BlockState) ((BlockState) ((BlockState) ((BlockState) Blocks.IRON_BARS - .defaultBlockState().with(PaneBlock.NORTH, bl4 && pz != -2)) - .with(PaneBlock.SOUTH, bl4 && pz != 2)).with(PaneBlock.WEST, - bl5 && px != -2)).with(PaneBlock.EAST, bl5 && px != 2); - BlocksHelper.setWithoutUpdate(world, - mut.set(spike.getCenterX() + px, maxY + py, spike.getCenterZ() + pz), - blockState); + BlockState blockState = (BlockState) ((BlockState) ((BlockState) ((BlockState) Blocks.IRON_BARS.defaultBlockState().setValue(IronBarsBlock.NORTH, bl4 && pz != -2)).setValue(IronBarsBlock.SOUTH, bl4 && pz != 2)).setValue(IronBarsBlock.WEST, bl5 && px != -2)).setValue(IronBarsBlock.EAST, bl5 && px != 2); + BlocksHelper.setWithoutUpdate(world, mut.set(spike.getCenterX() + px, maxY + py, spike.getCenterZ() + pz), blockState); } } } @@ -163,7 +155,7 @@ public class EndSpikeFeatureMixin { info.cancel(); } - + private boolean be_radiusInRange(int radius) { return radius > 1 && radius < 6; } diff --git a/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java b/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java index 6656836e..d962b716 100644 --- a/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java @@ -1,24 +1,23 @@ package ru.betterend.mixin.common; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.monster.EnderMan; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.enchantment.EnchantmentHelper; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.mob.EndermanEntity; -import net.minecraft.world.entity.player.Player; import ru.betterend.effects.EndEnchantments; -import ru.betterend.effects.EndMobEffects; +import ru.betterend.effects.EndStatusEffects; -@Mixin(EndermanEntity.class) +@Mixin(EnderMan.class) public abstract class EndermanEntityMixin { - + @Inject(method = "isPlayerStaring", at = @At("HEAD"), cancellable = true) private void be_isPlayerStaring(Player player, CallbackInfoReturnable info) { - if (player.isCreative() || player.hasMobEffect(EndMobEffects.END_VEIL) || EnchantmentHelper - .getLevel(EndEnchantments.END_VEIL, player.getEquippedStack(EquipmentSlot.HEAD)) > 0) { + if (player.isCreative() || player.hasEffect(EndStatusEffects.END_VEIL) || + EnchantmentHelper.getItemEnchantmentLevel(EndEnchantments.END_VEIL, player.getItemBySlot(EquipmentSlot.HEAD)) > 0) { info.setReturnValue(false); } } diff --git a/src/main/java/ru/betterend/mixin/common/EntityMixin.java b/src/main/java/ru/betterend/mixin/common/EntityMixin.java index 980b9750..c48e323a 100644 --- a/src/main/java/ru/betterend/mixin/common/EntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EntityMixin.java @@ -1,19 +1,18 @@ package ru.betterend.mixin.common; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.portal.PortalInfo; +import net.minecraft.world.phys.Vec3; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityType; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.core.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.TeleportTarget; -import net.minecraft.world.level.Level; import ru.betterend.interfaces.TeleportingEntity; @Mixin(Entity.class) @@ -27,19 +26,19 @@ public abstract class EntityMixin implements TeleportingEntity { public boolean removed; @Shadow public Level world; - + @Final @Shadow public abstract void detach(); - + @Shadow - public abstract Vec3d getVelocity(); - + public abstract Vec3 getVelocity(); + @Shadow public abstract EntityType getType(); - + @Shadow - protected abstract TeleportTarget getTeleportTarget(ServerLevel destination); + protected abstract PortalInfo getTeleportTarget(ServerLevel destination); private BlockPos exitPos; @@ -49,33 +48,31 @@ public abstract class EntityMixin implements TeleportingEntity { this.detach(); this.world.getProfiler().push("changeDimension"); this.world.getProfiler().push("reposition"); - TeleportTarget teleportTarget = this.getTeleportTarget(destination); + PortalInfo teleportTarget = this.getTeleportTarget(destination); if (teleportTarget != null) { - this.world.getProfiler().swap("reloading"); + this.world.getProfiler().popPush("reloading"); Entity entity = this.getType().create(destination); if (entity != null) { - entity.copyFrom(Entity.class.cast(this)); - entity.refreshPositionAndAngles(teleportTarget.position.x, teleportTarget.position.y, - teleportTarget.position.z, teleportTarget.yaw, entity.pitch); - entity.setVelocity(teleportTarget.velocity); - destination.onDimensionChanged(entity); + entity.restoreFrom(Entity.class.cast(this)); + entity.moveTo(teleportTarget.pos.x, teleportTarget.pos.y, teleportTarget.pos.z, teleportTarget.yRot, entity.xRot); + entity.setDeltaMovement(teleportTarget.speed); + destination.addFromAnotherDimension(entity); } this.removed = true; this.world.getProfiler().pop(); - ((ServerLevel) world).resetIdleTimeout(); - destination.resetIdleTimeout(); + ((ServerLevel) world).resetEmptyTime(); + destination.resetEmptyTime(); this.world.getProfiler().pop(); this.beResetExitPos(); info.setReturnValue(entity); } } } - + @Inject(method = "getTeleportTarget", at = @At("HEAD"), cancellable = true) - protected void be_getTeleportTarget(ServerLevel destination, CallbackInfoReturnable info) { + protected void be_getTeleportTarget(ServerLevel destination, CallbackInfoReturnable info) { if (beCanTeleport()) { - info.setReturnValue(new TeleportTarget( - new Vec3d(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), getVelocity(), yaw, pitch)); + info.setReturnValue(new PortalInfo(new Vec3(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), getVelocity(), yaw, pitch)); } } diff --git a/src/main/java/ru/betterend/mixin/common/GenerationSettingsAccessor.java b/src/main/java/ru/betterend/mixin/common/GenerationSettingsAccessor.java index 1e139594..f368415e 100644 --- a/src/main/java/ru/betterend/mixin/common/GenerationSettingsAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/GenerationSettingsAccessor.java @@ -2,25 +2,23 @@ package ru.betterend.mixin.common; import java.util.List; import java.util.function.Supplier; - +import net.minecraft.world.level.biome.BiomeGenerationSettings; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -import net.minecraft.world.biome.GenerationSettings; -import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; -import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; - -@Mixin(GenerationSettings.class) +@Mixin(BiomeGenerationSettings.class) public interface GenerationSettingsAccessor { @Accessor("features") List>>> beGetFeatures(); - + @Accessor("features") void beSetFeatures(List>>> features); - + @Accessor("structureFeatures") List>> beGetStructures(); - + @Accessor("structureFeatures") void beSetStructures(List>> structures); } diff --git a/src/main/java/ru/betterend/mixin/common/HostileEntityMixin.java b/src/main/java/ru/betterend/mixin/common/HostileEntityMixin.java index d32bdb36..9186f9f1 100644 --- a/src/main/java/ru/betterend/mixin/common/HostileEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/HostileEntityMixin.java @@ -2,33 +2,26 @@ package ru.betterend.mixin.common; import java.util.List; import java.util.Random; - +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.monster.EnderMan; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.phys.AABB; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.SpawnReason; -import net.minecraft.world.entity.mob.EndermanEntity; -import net.minecraft.world.entity.mob.HostileEntity; -import net.minecraft.core.BlockPos; -import net.minecraft.world.phys.AABB; -import net.minecraft.world.level.ServerLevelAccessor; - -@Mixin(HostileEntity.class) +@Mixin(Monster.class) public class HostileEntityMixin { @Inject(method = "canSpawnInDark", at = @At(value = "RETURN"), cancellable = true) - private static void be_endermenCheck(EntityType type, - ServerLevelAccessor serverWorldAccess, SpawnReason spawnReason, BlockPos pos, Random random, - CallbackInfoReturnable info) { + private static void be_endermenCheck(EntityType type, ServerLevelAccessor serverWorldAccess, MobSpawnType spawnReason, BlockPos pos, Random random, CallbackInfoReturnable info) { boolean canSpawn = info.getReturnValue(); - if (canSpawn && spawnReason == SpawnReason.NATURAL && type == EntityType.ENDERMAN) { - Box box = new Box(pos).expand(16); - List entities = serverWorldAccess.getEntitiesByClass(EndermanEntity.class, box, - (entity) -> { - return true; - }); + if (canSpawn && spawnReason == MobSpawnType.NATURAL && type == EntityType.ENDERMAN) { + AABB box = new AABB(pos).inflate(16); + List entities = serverWorldAccess.getEntitiesOfClass(EnderMan.class, box, (entity) -> { return true; }); info.setReturnValue(entities.size() < 6); } } diff --git a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java index d6a23643..8b9cb630 100644 --- a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java @@ -1,32 +1,30 @@ package ru.betterend.mixin.common; import java.util.Collection; - import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.item.Item; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.ai.attributes.AttributeModifier; -import net.minecraft.world.item.Item; - @Mixin(LivingEntity.class) public abstract class LivingEntityMixin { private Entity lastAttacker; - - @Inject(method = "hurt", at = @At("HEAD")) + + @Inject(method = "damage", at = @At("HEAD")) public void be_damage(DamageSource source, float amount, CallbackInfoReturnable info) { this.lastAttacker = source.getEntity(); } - - @ModifyArg(method = "hurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;knockback(FDD)V")) + + @ModifyArg(method = "damage", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;takeKnockback(FDD)V")) private float be_increaseKnockback(float value, double x, double z) { if (lastAttacker != null && lastAttacker instanceof LivingEntity) { LivingEntity attacker = (LivingEntity) lastAttacker; @@ -34,12 +32,11 @@ public abstract class LivingEntityMixin { } return value; } - + private double be_getKnockback(Item tool) { - if (tool == null) - return 0.0D; + if (tool == null) return 0.0D; Collection modifiers = tool.getDefaultAttributeModifiers(EquipmentSlot.MAINHAND) - .get(Attributes.ATTACK_KNOCKBACK); + .get(Attributes.ATTACK_KNOCKBACK); if (modifiers.size() > 0) { return modifiers.iterator().next().getAmount(); } diff --git a/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java b/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java index 7b7fbef6..99d7e49c 100644 --- a/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java @@ -13,15 +13,15 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.resource.ServerResourceManager; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.PlayerManager; -import net.minecraft.server.WorldGenerationProgressListener; -import net.minecraft.server.level.ServerLevel; import net.minecraft.resources.ResourceKey; -import net.minecraft.world.SaveProperties; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.ServerResources; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.progress.ChunkProgressListener; +import net.minecraft.server.players.PlayerList; import net.minecraft.world.level.Level; -import net.minecraft.world.level.ServerWorldProperties; +import net.minecraft.world.level.storage.ServerLevelData; +import net.minecraft.world.level.storage.WorldData; import ru.betterend.recipe.EndRecipeManager; import ru.betterend.registry.EndBiomes; import ru.betterend.world.generator.GeneratorOptions; @@ -29,15 +29,15 @@ import ru.betterend.world.generator.GeneratorOptions; @Mixin(MinecraftServer.class) public class MinecraftServerMixin { @Shadow - private ServerResourceManager serverResourceManager; - + private ServerResources serverResourceManager; + @Final @Shadow private Map, ServerLevel> worlds; - + @Final @Shadow - protected SaveProperties saveProperties; + protected WorldData saveProperties; @Inject(method = "reloadResources", at = @At(value = "RETURN"), cancellable = true) private void beOnReload(Collection collection, CallbackInfoReturnable> info) { @@ -49,7 +49,7 @@ public class MinecraftServerMixin { beInjectRecipes(); EndBiomes.initRegistry((MinecraftServer) (Object) this); } - + @Inject(method = "getOverworld", at = @At(value = "HEAD"), cancellable = true) private final void beGetOverworld(CallbackInfoReturnable info) { if (GeneratorOptions.swapOverworldToEnd()) { @@ -61,38 +61,34 @@ public class MinecraftServerMixin { info.cancel(); } } - + @Inject(method = "createWorlds", at = @At(value = "TAIL")) - private final void be_CreateWorlds(WorldGenerationProgressListener worldGenerationProgressListener, - CallbackInfo info) { + private final void be_CreateWorlds(ChunkProgressListener worldGenerationProgressListener, CallbackInfo info) { if (GeneratorOptions.swapOverworldToEnd()) { ServerLevel world = worlds.get(Level.END); if (world == null) { world = worlds.get(Level.OVERWORLD); } - this.getPlayerManager().setMainWorld(world); - ServerWorldProperties serverWorldProperties = saveProperties.getMainWorldProperties(); - net.minecraft.world.gen.GeneratorOptions generatorOptions = saveProperties.getGeneratorOptions(); - boolean bl = generatorOptions.isDebugWorld(); - setupSpawn(world, serverWorldProperties, generatorOptions.hasBonusChest(), bl, true); + this.getPlayerManager().setLevel(world); + ServerLevelData serverWorldProperties = saveProperties.overworldData(); + net.minecraft.world.level.levelgen.WorldGenSettings generatorOptions = saveProperties.worldGenSettings(); + boolean bl = generatorOptions.isDebug(); + setupSpawn(world, serverWorldProperties, generatorOptions.generateBonusChest(), bl, true); } } - + @Inject(method = "setupSpawn", at = @At(value = "HEAD"), cancellable = true) - private static void be_SetupSpawn(ServerLevel world, ServerWorldProperties serverWorldProperties, - boolean bonusChest, boolean debugWorld, boolean bl, CallbackInfo info) { + private static void be_SetupSpawn(ServerLevel world, ServerLevelData serverWorldProperties, boolean bonusChest, boolean debugWorld, boolean bl, CallbackInfo info) { if (GeneratorOptions.swapOverworldToEnd() && world.dimension() == Level.OVERWORLD) { info.cancel(); } } - + @Shadow - private static void setupSpawn(ServerLevel world, ServerWorldProperties serverWorldProperties, boolean bonusChest, - boolean debugWorld, boolean bl) { - } - + private static void setupSpawn(ServerLevel world, ServerLevelData serverWorldProperties, boolean bonusChest, boolean debugWorld, boolean bl) {} + @Shadow - public PlayerManager getPlayerManager() { + public PlayerList getPlayerManager() { return null; } diff --git a/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java b/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java index 20934b4b..95c4ccf4 100644 --- a/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java +++ b/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java @@ -1,47 +1,43 @@ package ru.betterend.mixin.common; import java.util.function.Supplier; - +import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; +import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; +import net.minecraft.world.level.levelgen.StructureSettings; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.minecraft.world.biome.source.BiomeSource; -import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; -import net.minecraft.world.gen.chunk.NoiseChunkGenerator; -import net.minecraft.world.gen.chunk.StructuresConfig; import ru.betterend.world.generator.GeneratorOptions; import ru.betterend.world.generator.TerrainGenerator; -@Mixin(NoiseChunkGenerator.class) +@Mixin(NoiseBasedChunkGenerator.class) public abstract class NoiseChunkGeneratorMixin extends ChunkGenerator { @Final @Shadow - protected Supplier settings; - - public NoiseChunkGeneratorMixin(BiomeSource populationSource, BiomeSource biomeSource, - StructuresConfig structuresConfig, long worldSeed) { + protected Supplier settings; + + public NoiseChunkGeneratorMixin(BiomeSource populationSource, BiomeSource biomeSource, StructureSettings structuresConfig, long worldSeed) { super(populationSource, biomeSource, structuresConfig, worldSeed); } - + @Inject(method = "(Lnet/minecraft/world/biome/source/BiomeSource;Lnet/minecraft/world/biome/source/BiomeSource;JLjava/util/function/Supplier;)V", at = @At("TAIL")) - private void beOnInit(BiomeSource populationSource, BiomeSource biomeSource, long seed, - Supplier settings, CallbackInfo info) { + private void beOnInit(BiomeSource populationSource, BiomeSource biomeSource, long seed, Supplier settings, CallbackInfo info) { TerrainGenerator.initNoise(seed); } - + @Inject(method = "sampleNoiseColumn([DII)V", at = @At("HEAD"), cancellable = true, allow = 2) private void beSampleNoiseColumn(double[] buffer, int x, int z, CallbackInfo info) { - if (GeneratorOptions.useNewGenerator() && settings.get().equals(ChunkGeneratorSettings.END)) { - // System.out.println(TerrainGenerator.canGenerate(x, z)); - // if (TerrainGenerator.canGenerate(x, z)) { - TerrainGenerator.fillTerrainDensity(buffer, x, z, getBiomeSource()); - info.cancel(); - // } + if (GeneratorOptions.useNewGenerator() && settings.get().stable(NoiseGeneratorSettings.END)) { + //System.out.println(TerrainGenerator.canGenerate(x, z)); + //if (TerrainGenerator.canGenerate(x, z)) { + TerrainGenerator.fillTerrainDensity(buffer, x, z, getBiomeSource()); + info.cancel(); + //} } } } diff --git a/src/main/java/ru/betterend/mixin/common/PlayerAdvancementTrackerMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerAdvancementTrackerMixin.java index 035398e3..2900fa3a 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerAdvancementTrackerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerAdvancementTrackerMixin.java @@ -2,26 +2,26 @@ package ru.betterend.mixin.common; import net.minecraft.advancements.Advancement; import net.minecraft.server.PlayerAdvancements; +import net.minecraft.server.level.ServerPlayer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At.Shift; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.server.level.ServerPlayer; import ru.betterend.events.PlayerAdvancementsEvents; @Mixin(PlayerAdvancements.class) public abstract class PlayerAdvancementTrackerMixin { - + @Shadow private ServerPlayer owner; - - @Inject(method = "award", at = @At(value = "INVOKE", target = "Lnet/minecraft/advancements/AdvancementRewards;grant(Lnet/minecraft/server/level/ServerPlayer;)V", shift = Shift.AFTER)) - public void be_onAdvancementComplete(Advancement advancement, String criterionName, - CallbackInfoReturnable info) { - PlayerAdvancementsEvents.PLAYER_ADVANCEMENT_COMPLETE.invoker().onAdvancementComplete(owner, advancement, - criterionName); + + @Inject(method = "grantCriterion", at = @At( + value = "INVOKE", + target = "Lnet/minecraft/advancement/AdvancementRewards;apply(Lnet/minecraft/server/network/ServerPlayerEntity;)V", + shift = Shift.AFTER)) + public void be_onAdvancementComplete(Advancement advancement, String criterionName, CallbackInfoReturnable info) { + PlayerAdvancementsEvents.PLAYER_ADVENCEMENT_COMPLETE.invoker().onAdvancementComplete(owner, advancement, criterionName); } } diff --git a/src/main/java/ru/betterend/mixin/common/PlayerEntityMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerEntityMixin.java index 3363b548..9ffc8d67 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerEntityMixin.java @@ -1,18 +1,16 @@ package ru.betterend.mixin.common; import java.util.Optional; - +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.entity.player.Player; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.util.math.Vec3d; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.registry.EndBlocks; @@ -22,10 +20,9 @@ import ru.betterend.util.MHelper; @Mixin(Player.class) public abstract class PlayerEntityMixin { private static Direction[] HORIZONTAL; - + @Inject(method = "findRespawnPosition", at = @At(value = "HEAD"), cancellable = true) - private static void be_statueRespawn(ServerLevel world, BlockPos pos, float f, boolean bl, boolean bl2, - CallbackInfoReturnable> info) { + private static void be_statueRespawn(ServerLevel world, BlockPos pos, float f, boolean bl, boolean bl2, CallbackInfoReturnable> info) { BlockState blockState = world.getBlockState(pos); if (blockState.is(EndBlocks.RESPAWN_OBELISK)) { info.setReturnValue(beObeliskRespawnPosition(world, pos, blockState)); @@ -33,21 +30,22 @@ public abstract class PlayerEntityMixin { } } - private static Optional beObeliskRespawnPosition(ServerLevel world, BlockPos pos, BlockState state) { + private static Optional beObeliskRespawnPosition(ServerLevel world, BlockPos pos, BlockState state) { if (state.getValue(BlockProperties.TRIPLE_SHAPE) == TripleShape.TOP) { - pos = pos.down(2); - } else if (state.getValue(BlockProperties.TRIPLE_SHAPE) == TripleShape.MIDDLE) { + pos = pos.below(2); + } + else if (state.getValue(BlockProperties.TRIPLE_SHAPE) == TripleShape.MIDDLE) { pos = pos.below(); } if (HORIZONTAL == null) { HORIZONTAL = BlocksHelper.makeHorizontal(); } MHelper.shuffle(HORIZONTAL, world.getRandom()); - for (Direction dir : HORIZONTAL) { + for (Direction dir: HORIZONTAL) { BlockPos p = pos.relative(dir); BlockState state2 = world.getBlockState(p); - if (!state2.getMaterial().blocksMovement() && state2.getCollisionShape(world, pos).isEmpty()) { - return Optional.of(Vec3d.of(p).add(0.5, 0, 0.5)); + if (!state2.getMaterial().blocksMotion() && state2.getCollisionShape(world, pos).isEmpty()) { + return Optional.of(Vec3.atLowerCornerOf(p).add(0.5, 0, 0.5)); } } return Optional.empty(); diff --git a/src/main/java/ru/betterend/mixin/common/PlayerManagerMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerManagerMixin.java index 18482905..32b06ec6 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerManagerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerManagerMixin.java @@ -19,46 +19,46 @@ import com.mojang.serialization.DataResult; import com.mojang.serialization.Dynamic; import io.netty.buffer.Unpooled; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.ChatFormatting; +import net.minecraft.Util; +import net.minecraft.core.RegistryAccess; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.Tag; -import net.minecraft.network.ClientConnection; -import net.minecraft.network.MessageType; -import net.minecraft.network.Packet; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket; -import net.minecraft.network.packet.s2c.play.DifficultyS2CPacket; -import net.minecraft.network.packet.s2c.play.EntityMobEffectS2CPacket; -import net.minecraft.network.packet.s2c.play.GameJoinS2CPacket; -import net.minecraft.network.packet.s2c.play.HeldItemChangeS2CPacket; -import net.minecraft.network.packet.s2c.play.PlayerAbilitiesS2CPacket; -import net.minecraft.network.packet.s2c.play.PlayerListS2CPacket; -import net.minecraft.network.packet.s2c.play.SynchronizeRecipesS2CPacket; -import net.minecraft.network.packet.s2c.play.SynchronizeTagsS2CPacket; -import net.minecraft.scoreboard.ServerScoreboard; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.PlayerManager; -import net.minecraft.server.network.ServerPlayNetworkHandler; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.Formatting; -import net.minecraft.util.UserCache; -import net.minecraft.util.Util; -import net.minecraft.util.registry.DynamicRegistryManager; +import net.minecraft.network.Connection; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.ChatType; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientboundChangeDifficultyPacket; +import net.minecraft.network.protocol.game.ClientboundCustomPayloadPacket; +import net.minecraft.network.protocol.game.ClientboundLoginPacket; +import net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket; +import net.minecraft.network.protocol.game.ClientboundPlayerInfoPacket; +import net.minecraft.network.protocol.game.ClientboundSetCarriedItemPacket; +import net.minecraft.network.protocol.game.ClientboundUpdateMobEffectPacket; +import net.minecraft.network.protocol.game.ClientboundUpdateRecipesPacket; +import net.minecraft.network.protocol.game.ClientboundUpdateTagsPacket; import net.minecraft.resources.ResourceKey; -import net.minecraft.world.GameRules; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.ServerScoreboard; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.ServerGamePacketListenerImpl; +import net.minecraft.server.players.GameProfileCache; +import net.minecraft.server.players.PlayerList; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.GameRules; import net.minecraft.world.level.Level; -import net.minecraft.world.WorldProperties; -import net.minecraft.world.biome.source.BiomeAccess; +import net.minecraft.world.level.biome.BiomeManager; import net.minecraft.world.level.dimension.DimensionType; +import net.minecraft.world.level.storage.LevelData; import ru.betterend.world.generator.GeneratorOptions; -@Mixin(PlayerManager.class) +@Mixin(PlayerList.class) public class PlayerManagerMixin { @Final @Shadow @@ -70,7 +70,7 @@ public class PlayerManagerMixin { @Final @Shadow - private DynamicRegistryManager.Impl registryManager; + private RegistryAccess.RegistryHolder registryManager; @Shadow private int viewDistance; @@ -84,22 +84,22 @@ public class PlayerManagerMixin { private Map playerMap; @Inject(method = "onPlayerConnect", at = @At(value = "HEAD"), cancellable = true) - public void be_onPlayerConnect(ClientConnection connection, ServerPlayer player, CallbackInfo info) { + public void be_onPlayerConnect(Connection connection, ServerPlayer player, CallbackInfo info) { if (GeneratorOptions.swapOverworldToEnd()) { GameProfile gameProfile = player.getGameProfile(); - UserCache userCache = this.server.getUserCache(); - GameProfile gameProfile2 = userCache.getByUuid(gameProfile.getId()); + GameProfileCache userCache = this.server.getProfileCache(); + GameProfile gameProfile2 = userCache.get(gameProfile.getId()); String string = gameProfile2 == null ? gameProfile.getName() : gameProfile2.getName(); userCache.add(gameProfile); CompoundTag compoundTag = this.loadPlayerData(player); ResourceKey var23; if (compoundTag != null) { - DataResult> var10000 = DimensionType - .method_28521(new Dynamic(NbtOps.INSTANCE, compoundTag.get("Dimension"))); + DataResult> var10000 = DimensionType.parseLegacy(new Dynamic(NbtOps.INSTANCE, compoundTag.get("Dimension"))); Logger var10001 = LOGGER; var10001.getClass(); var23 = (ResourceKey) var10000.resultOrPartial(var10001::error).orElse(Level.END); - } else { + } + else { var23 = Level.END; } @@ -108,128 +108,117 @@ public class PlayerManagerMixin { ServerLevel serverWorld3; if (serverWorld == null) { LOGGER.warn("Unknown respawn dimension {}, defaulting to overworld", registryKey); - serverWorld3 = this.server.getOverworld(); - } else { + serverWorld3 = this.server.overworld(); + } + else { serverWorld3 = serverWorld; } - player.setWorld(serverWorld3); - player.interactionManager.setWorld((ServerLevel) player.world); + player.setLevel(serverWorld3); + player.gameMode.setLevel((ServerLevel) player.level); String string2 = "local"; - if (connection.getAddress() != null) { - string2 = connection.getAddress().toString(); + if (connection.getRemoteAddress() != null) { + string2 = connection.getRemoteAddress().toString(); } - LOGGER.info("{}[{}] logged in with entity id {} at ({}, {}, {})", player.getName().getString(), string2, - player.getEntityId(), player.getX(), player.getY(), player.getZ()); - WorldProperties worldProperties = serverWorld3.getLevelProperties(); + LOGGER.info("{}[{}] logged in with entity id {} at ({}, {}, {})", player.getName().getString(), string2, player.getId(), player.getX(), player.getY(), player.getZ()); + LevelData worldProperties = serverWorld3.getLevelData(); this.setGameMode(player, (ServerPlayer) null, serverWorld3); - ServerPlayNetworkHandler serverPlayNetworkHandler = new ServerPlayNetworkHandler(this.server, connection, - player); + ServerGamePacketListenerImpl serverPlayNetworkHandler = new ServerGamePacketListenerImpl(this.server, connection, player); GameRules gameRules = serverWorld3.getGameRules(); - boolean bl = gameRules.getBoolean(GameRules.DO_IMMEDIATE_RESPAWN); - boolean bl2 = gameRules.getBoolean(GameRules.REDUCED_DEBUG_INFO); - serverPlayNetworkHandler.sendPacket(new GameJoinS2CPacket(player.getEntityId(), - player.interactionManager.getGameMode(), player.interactionManager.getPreviousGameMode(), - BiomeAccess.hashSeed(serverWorld3.getSeed()), worldProperties.isHardcore(), - this.server.getWorldRegistryKeys(), this.registryManager, serverWorld3.getDimension(), - serverWorld3.dimension(), this.getMaxPlayerCount(), this.viewDistance, bl2, !bl, - serverWorld3.isDebugWorld(), serverWorld3.isFlat())); - serverPlayNetworkHandler.sendPacket(new CustomPayloadS2CPacket(CustomPayloadS2CPacket.BRAND, - (new PacketByteBuf(Unpooled.buffer())).writeString(this.getServer().getServerModName()))); - serverPlayNetworkHandler.sendPacket( - new DifficultyS2CPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); - serverPlayNetworkHandler.sendPacket(new PlayerAbilitiesS2CPacket(player.abilities)); - serverPlayNetworkHandler.sendPacket(new HeldItemChangeS2CPacket(player.inventory.selectedSlot)); - serverPlayNetworkHandler - .sendPacket(new SynchronizeRecipesS2CPacket(this.server.getRecipeManager().values())); - serverPlayNetworkHandler.sendPacket(new SynchronizeTagsS2CPacket(this.server.getTagManager())); + boolean bl = gameRules.getBoolean(GameRules.RULE_DO_IMMEDIATE_RESPAWN); + boolean bl2 = gameRules.getBoolean(GameRules.RULE_REDUCEDDEBUGINFO); + serverPlayNetworkHandler.send(new ClientboundLoginPacket(player.getId(), player.gameMode.getGameModeForPlayer(), player.gameMode.getPreviousGameModeForPlayer(), BiomeManager.obfuscateSeed(serverWorld3.getSeed()), + worldProperties.isHardcore(), this.server.levelKeys(), this.registryManager, serverWorld3.dimensionType(), serverWorld3.dimension(), this.getMaxPlayerCount(), this.viewDistance, bl2, !bl, + serverWorld3.isDebug(), serverWorld3.isFlat())); + serverPlayNetworkHandler.send(new ClientboundCustomPayloadPacket(ClientboundCustomPayloadPacket.BRAND, (new FriendlyByteBuf(Unpooled.buffer())).writeUtf(this.getServer().getServerModName()))); + serverPlayNetworkHandler.send(new ClientboundChangeDifficultyPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); + serverPlayNetworkHandler.send(new ClientboundPlayerAbilitiesPacket(player.abilities)); + serverPlayNetworkHandler.send(new ClientboundSetCarriedItemPacket(player.inventory.selected)); + serverPlayNetworkHandler.send(new ClientboundUpdateRecipesPacket(this.server.getRecipeManager().getRecipes())); + serverPlayNetworkHandler.send(new ClientboundUpdateTagsPacket(this.server.getTags())); this.sendCommandTree(player); - player.getStatHandler().updateStatSet(); - player.getRecipeBook().sendInitRecipesPacket(player); + player.getStats().markAllDirty(); + player.getRecipeBook().sendInitialRecipeBook(player); this.sendScoreboard(serverWorld3.getScoreboard(), player); - this.server.forcePlayerSampleUpdate(); - TranslatableText mutableText2; + this.server.invalidateStatus(); + TranslatableComponent mutableText2; if (player.getGameProfile().getName().equalsIgnoreCase(string)) { - mutableText2 = new TranslatableText("multiplayer.player.joined", - new Object[] { player.getDisplayName() }); - } else { - mutableText2 = new TranslatableText("multiplayer.player.joined.renamed", - new Object[] { player.getDisplayName(), string }); + mutableText2 = new TranslatableComponent("multiplayer.player.joined", new Object[] { player.getDisplayName() }); + } + else { + mutableText2 = new TranslatableComponent("multiplayer.player.joined.renamed", new Object[] { player.getDisplayName(), string }); } - this.broadcastChatMessage(mutableText2.formatted(Formatting.YELLOW), MessageType.SYSTEM, Util.NIL_UUID); - serverPlayNetworkHandler.requestTeleport(player.getX(), player.getY(), player.getZ(), player.yaw, - player.pitch); + this.broadcastChatMessage(mutableText2.withStyle(ChatFormatting.YELLOW), ChatType.SYSTEM, Util.NIL_UUID); + serverPlayNetworkHandler.teleport(player.getX(), player.getY(), player.getZ(), player.yRot, player.xRot); this.players.add(player); - this.playerMap.put(player.getUuid(), player); - this.sendToAll( - new PlayerListS2CPacket(PlayerListS2CPacket.Action.ADD_PLAYER, new ServerPlayer[] { player })); + this.playerMap.put(player.getUUID(), player); + this.sendToAll(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, new ServerPlayer[] { player })); for (int i = 0; i < this.players.size(); ++i) { - player.networkHandler.sendPacket(new PlayerListS2CPacket(PlayerListS2CPacket.Action.ADD_PLAYER, - new ServerPlayer[] { (ServerPlayer) this.players.get(i) })); + player.connection.send(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, new ServerPlayer[] { (ServerPlayer) this.players.get(i) })); } - serverWorld3.onPlayerConnected(player); - this.server.getBossBarManager().onPlayerConnect(player); + serverWorld3.addNewPlayer(player); + this.server.getCustomBossEvents().onPlayerConnect(player); this.sendWorldInfo(player, serverWorld3); - if (!this.server.getResourcePackUrl().isEmpty()) { - player.sendResourcePackUrl(this.server.getResourcePackUrl(), this.server.getResourcePackHash()); + if (!this.server.getResourcePack().isEmpty()) { + player.sendTexturePack(this.server.getResourcePack(), this.server.getResourcePackHash()); } - Iterator var24 = player.getMobEffects().iterator(); + Iterator var24 = player.getActiveEffects().iterator(); while (var24.hasNext()) { MobEffectInstance statusEffectInstance = (MobEffectInstance) var24.next(); - serverPlayNetworkHandler - .sendPacket(new EntityMobEffectS2CPacket(player.getEntityId(), statusEffectInstance)); + serverPlayNetworkHandler.send(new ClientboundUpdateMobEffectPacket(player.getId(), statusEffectInstance)); } if (compoundTag != null && compoundTag.contains("RootVehicle", 10)) { CompoundTag compoundTag2 = compoundTag.getCompound("RootVehicle"); - Entity entity = EntityType.loadEntityWithPassengers(compoundTag2.getCompound("Entity"), serverWorld3, - (vehicle) -> { - return !serverWorld3.tryLoadEntity(vehicle) ? null : vehicle; - }); + Entity entity = EntityType.loadEntityRecursive(compoundTag2.getCompound("Entity"), serverWorld3, (vehicle) -> { + return !serverWorld3.addWithUUID(vehicle) ? null : vehicle; + }); if (entity != null) { UUID uUID2; - if (compoundTag2.containsUuid("Attach")) { - uUID2 = compoundTag2.getUuid("Attach"); - } else { + if (compoundTag2.hasUUID("Attach")) { + uUID2 = compoundTag2.getUUID("Attach"); + } + else { uUID2 = null; } Iterator var21; Entity entity3; - if (entity.getUuid().equals(uUID2)) { + if (entity.getUUID().equals(uUID2)) { player.startRiding(entity, true); - } else { - var21 = entity.getPassengersDeep().iterator(); + } + else { + var21 = entity.getIndirectPassengers().iterator(); while (var21.hasNext()) { entity3 = (Entity) var21.next(); - if (entity3.getUuid().equals(uUID2)) { + if (entity3.getUUID().equals(uUID2)) { player.startRiding(entity3, true); break; } } } - if (!player.hasVehicle()) { + if (!player.isPassenger()) { LOGGER.warn("Couldn't reattach entity to player"); - serverWorld3.removeEntity(entity); - var21 = entity.getPassengersDeep().iterator(); + serverWorld3.despawn(entity); + var21 = entity.getIndirectPassengers().iterator(); while (var21.hasNext()) { entity3 = (Entity) var21.next(); - serverWorld3.removeEntity(entity3); + serverWorld3.despawn(entity3); } } } } - player.onSpawn(); + player.initMenu(); info.cancel(); } } @@ -240,12 +229,10 @@ public class PlayerManagerMixin { } @Shadow - private void setGameMode(ServerPlayer player, @Nullable ServerPlayer oldPlayer, ServerLevel world) { - } + private void setGameMode(ServerPlayer player, @Nullable ServerPlayer oldPlayer, ServerLevel world) {} @Shadow - public void sendCommandTree(ServerPlayer player) { - } + public void sendCommandTree(ServerPlayer player) {} @Shadow public int getMaxPlayerCount() { @@ -258,18 +245,14 @@ public class PlayerManagerMixin { } @Shadow - protected void sendScoreboard(ServerScoreboard scoreboard, ServerPlayer player) { - } + protected void sendScoreboard(ServerScoreboard scoreboard, ServerPlayer player) {} @Shadow - public void broadcastChatMessage(Text message, MessageType type, UUID senderUuid) { - } + public void broadcastChatMessage(Component message, ChatType type, UUID senderUuid) {} @Shadow - public void sendToAll(Packet packet) { - } + public void sendToAll(Packet packet) {} @Shadow - public void sendWorldInfo(ServerPlayer player, ServerLevel world) { - } + public void sendWorldInfo(ServerPlayer player, ServerLevel world) {} } diff --git a/src/main/java/ru/betterend/mixin/common/RecipeManagerAccessor.java b/src/main/java/ru/betterend/mixin/common/RecipeManagerAccessor.java index 759f56f3..5f680919 100644 --- a/src/main/java/ru/betterend/mixin/common/RecipeManagerAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/RecipeManagerAccessor.java @@ -1,14 +1,12 @@ package ru.betterend.mixin.common; import java.util.Map; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeManager; import net.minecraft.world.item.crafting.RecipeType; -import net.minecraft.resources.ResourceLocation; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(RecipeManager.class) public interface RecipeManagerAccessor { diff --git a/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java b/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java index 10dce970..5baffe2a 100644 --- a/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java @@ -5,7 +5,15 @@ import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Optional; - +import net.minecraft.Util; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.util.profiling.ProfilerFiller; +import net.minecraft.world.Container; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; @@ -14,16 +22,6 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.google.gson.JsonElement; - -import net.minecraft.inventory.Inventory; -import net.minecraft.world.item.crafting.Recipe; -import net.minecraft.world.item.crafting.RecipeManager; -import net.minecraft.world.item.crafting.RecipeType; -import net.minecraft.resource.ResourceManager; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.Util; -import net.minecraft.util.profiler.Profiler; -import net.minecraft.world.level.Level; import ru.betterend.recipe.EndRecipeManager; @Mixin(RecipeManager.class) @@ -32,26 +30,23 @@ public class RecipeManagerMixin { private Map, Map>> recipes; @Inject(method = "apply", at = @At(value = "RETURN")) - private void beSetRecipes(Map map, ResourceManager resourceManager, - Profiler profiler, CallbackInfo info) { + private void beSetRecipes(Map map, ResourceManager resourceManager, ProfilerFiller profiler, CallbackInfo info) { recipes = EndRecipeManager.getMap(recipes); } @Shadow - private > Map> getAllOfType( - RecipeType type) { + private > Map> getAllOfType(RecipeType type) { return null; } /** * @author paulevs - * @reason Remove conflicts with vanilla tags Change recipe order to show mod - * recipes first, helps when block have vanilla tag (example - mod stone - * with vanilla tags and furnace from that stone) + * @reason Remove conflicts with vanilla tags + * Change recipe order to show mod recipes first, helps when block have vanilla tag + * (example - mod stone with vanilla tags and furnace from that stone) */ @Overwrite - public > Optional getFirstMatch(RecipeType type, C inventory, - Level world) { + public > Optional getFirstMatch(RecipeType type, C inventory, Level world) { Collection> values = getAllOfType(type).values(); List> list = new ArrayList>(values); list.sort((v1, v2) -> { @@ -61,7 +56,7 @@ public class RecipeManagerMixin { }); return list.stream().flatMap((recipe) -> { - return Util.stream(type.get(recipe, world, inventory)); + return Util.toStream(type.tryMatch(recipe, world, inventory)); }).findFirst(); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java b/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java index f592d94d..bda5a594 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java @@ -9,27 +9,26 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.mojang.authlib.GameProfile; - -import net.minecraft.world.entity.Entity; -import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.entity.player.Player; -import net.minecraft.network.packet.s2c.play.DifficultyS2CPacket; -import net.minecraft.network.packet.s2c.play.EntityMobEffectS2CPacket; -import net.minecraft.network.packet.s2c.play.PlayerAbilitiesS2CPacket; -import net.minecraft.network.packet.s2c.play.PlayerRespawnS2CPacket; -import net.minecraft.network.packet.s2c.play.WorldEventS2CPacket; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.PlayerManager; -import net.minecraft.server.network.ServerPlayNetworkHandler; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.network.ServerPlayerInteractionManager; -import net.minecraft.server.level.ServerLevel; import net.minecraft.core.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.TeleportTarget; +import net.minecraft.network.protocol.game.ClientboundChangeDifficultyPacket; +import net.minecraft.network.protocol.game.ClientboundLevelEventPacket; +import net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket; +import net.minecraft.network.protocol.game.ClientboundRespawnPacket; +import net.minecraft.network.protocol.game.ClientboundUpdateMobEffectPacket; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.level.ServerPlayerGameMode; +import net.minecraft.server.network.ServerGamePacketListenerImpl; +import net.minecraft.server.players.PlayerList; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; -import net.minecraft.world.WorldProperties; -import net.minecraft.world.biome.source.BiomeAccess; +import net.minecraft.world.level.biome.BiomeManager; +import net.minecraft.world.level.portal.PortalInfo; +import net.minecraft.world.level.storage.LevelData; +import net.minecraft.world.phys.Vec3; import ru.betterend.interfaces.TeleportingEntity; import ru.betterend.world.generator.GeneratorOptions; @@ -37,10 +36,10 @@ import ru.betterend.world.generator.GeneratorOptions; public abstract class ServerPlayerEntityMixin extends Player implements TeleportingEntity { @Shadow - public ServerPlayNetworkHandler networkHandler; + public ServerGamePacketListenerImpl networkHandler; @Final @Shadow - public ServerPlayerInteractionManager interactionManager; + public ServerPlayerGameMode interactionManager; @Final @Shadow public MinecraftServer server; @@ -67,52 +66,47 @@ public abstract class ServerPlayerEntityMixin extends Player implements Teleport } @Inject(method = "getTeleportTarget", at = @At("HEAD"), cancellable = true) - protected void be_getTeleportTarget(ServerLevel destination, CallbackInfoReturnable info) { + protected void be_getTeleportTarget(ServerLevel destination, CallbackInfoReturnable info) { if (beCanTeleport()) { - info.setReturnValue(new TeleportTarget( - new Vec3d(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), getVelocity(), yaw, pitch)); + info.setReturnValue(new PortalInfo(new Vec3(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), getDeltaMovement(), yRot, xRot)); } } @Inject(method = "moveToWorld", at = @At("HEAD"), cancellable = true) public void be_moveToWorld(ServerLevel destination, CallbackInfoReturnable info) { - if (beCanTeleport() && world instanceof ServerLevel) { + if (beCanTeleport() && level instanceof ServerLevel) { this.inTeleportationState = true; ServerLevel serverWorld = this.getServerWorld(); - WorldProperties worldProperties = destination.getLevelProperties(); + LevelData worldProperties = destination.getLevelData(); ServerPlayer player = ServerPlayer.class.cast(this); - this.networkHandler.sendPacket(new PlayerRespawnS2CPacket(destination.getDimension(), - destination.dimension(), BiomeAccess.hashSeed(destination.getSeed()), - interactionManager.getGameMode(), interactionManager.getPreviousGameMode(), - destination.isDebugWorld(), destination.isFlat(), true)); - this.networkHandler.sendPacket( - new DifficultyS2CPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); - PlayerManager playerManager = this.server.getPlayerManager(); - playerManager.sendCommandTree(player); - serverWorld.removePlayer(player); + this.networkHandler.send(new ClientboundRespawnPacket(destination.dimensionType(), destination.dimension(), BiomeManager.obfuscateSeed(destination.getSeed()), + interactionManager.getGameModeForPlayer(),interactionManager.getPreviousGameModeForPlayer(), destination.isDebug(), destination.isFlat(), true)); + this.networkHandler.send(new ClientboundChangeDifficultyPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); + PlayerList playerManager = this.server.getPlayerList(); + playerManager.sendPlayerPermissionLevel(player); + serverWorld.removePlayerImmediately(player); this.removed = false; - TeleportTarget teleportTarget = this.getTeleportTarget(destination); + PortalInfo teleportTarget = this.findDimensionEntryPoint(destination); if (teleportTarget != null) { serverWorld.getProfiler().push("moving"); serverWorld.getProfiler().pop(); serverWorld.getProfiler().push("placing"); - this.setWorld(destination); - destination.onPlayerChangeDimension(player); - this.setRotation(teleportTarget.yaw, teleportTarget.pitch); - this.refreshPositionAfterTeleport(teleportTarget.position.x, teleportTarget.position.y, - teleportTarget.position.z); + this.setLevel(destination); + destination.addDuringPortalTeleport(player); + this.setRot(teleportTarget.yRot, teleportTarget.xRot); + this.moveTo(teleportTarget.pos.x, teleportTarget.pos.y, teleportTarget.pos.z); serverWorld.getProfiler().pop(); this.worldChanged(serverWorld); - this.interactionManager.setWorld(destination); - this.networkHandler.sendPacket(new PlayerAbilitiesS2CPacket(this.abilities)); - playerManager.sendWorldInfo(player, destination); - playerManager.sendPlayerStatus(player); + this.interactionManager.setLevel(destination); + this.networkHandler.send(new ClientboundPlayerAbilitiesPacket(this.abilities)); + playerManager.sendLevelInfo(player, destination); + playerManager.sendAllPlayerInfo(player); - for (MobEffectInstance statusEffectInstance : this.getMobEffects()) { - this.networkHandler.sendPacket(new EntityMobEffectS2CPacket(getEntityId(), statusEffectInstance)); + for (MobEffectInstance statusEffectInstance : this.getActiveEffects()) { + this.networkHandler.send(new ClientboundUpdateMobEffectPacket(getId(), statusEffectInstance)); } - this.networkHandler.sendPacket(new WorldEventS2CPacket(1032, BlockPos.ORIGIN, 0, false)); + this.networkHandler.send(new ClientboundLevelEventPacket(1032, BlockPos.ZERO, 0, false)); this.syncedExperience = -1; this.syncedHealth = -1.0F; this.syncedFoodLevel = -1; @@ -130,7 +124,7 @@ public abstract class ServerPlayerEntityMixin extends Player implements Teleport @Shadow @Override - protected abstract TeleportTarget getTeleportTarget(ServerLevel destination); + protected abstract PortalInfo findDimensionEntryPoint(ServerLevel destination); @Override public void beSetExitPos(BlockPos pos) { diff --git a/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java b/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java index 944990c0..39e90b32 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java @@ -13,19 +13,19 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.metadata.ModMetadata; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtHelper; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.WorldGenerationProgressListener; -import net.minecraft.server.level.ServerLevel; import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; import net.minecraft.resources.ResourceKey; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.progress.ChunkProgressListener; +import net.minecraft.world.level.CustomSpawner; import net.minecraft.world.level.Level; -import net.minecraft.world.level.dimension.DimensionType; -import net.minecraft.world.gen.Spawner; import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.ServerWorldProperties; -import net.minecraft.world.level.storage.LevelStorage; +import net.minecraft.world.level.dimension.DimensionType; +import net.minecraft.world.level.storage.LevelStorageSource; +import net.minecraft.world.level.storage.ServerLevelData; import ru.betterend.BetterEnd; import ru.betterend.util.DataFixerUtil; import ru.betterend.util.WorldDataUtil; @@ -36,34 +36,31 @@ public class ServerWorldMixin { private static final int DEV_VERSION = be_getVersionInt("63.63.63"); private static final int FIX_VERSION = DEV_VERSION; private static String lastWorld = null; - + @Inject(method = "*", at = @At("TAIL")) - private void be_onServerWorldInit(MinecraftServer server, Executor workerExecutor, LevelStorage.Session session, - ServerWorldProperties properties, ResourceKey registryKey, DimensionType dimensionType, - WorldGenerationProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, - boolean debugWorld, long l, List list, boolean bl, CallbackInfo info) { - if (lastWorld != null && lastWorld.equals(session.getDirectoryName())) { + private void be_onServerWorldInit(MinecraftServer server, Executor workerExecutor, LevelStorageSource.LevelStorageAccess session, ServerLevelData properties, ResourceKey registryKey, DimensionType dimensionType, ChunkProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, boolean debugWorld, long l, List list, boolean bl, CallbackInfo info) { + if (lastWorld != null && lastWorld.equals(session.getLevelId())) { return; } - - lastWorld = session.getDirectoryName(); - + + lastWorld = session.getLevelId(); + @SuppressWarnings("resource") ServerLevel world = (ServerLevel) (Object) this; - File dir = session.getWorldDirectory(world.dimension()); + File dir = session.getDimensionPath(world.dimension()); if (!new File(dir, "level.dat").exists()) { dir = dir.getParentFile(); } File data = new File(dir, "data/betterend_data.nbt"); - + ModMetadata meta = FabricLoader.getInstance().getModContainer(BetterEnd.MOD_ID).get().getMetadata(); int version = BetterEnd.isDevEnvironment() ? DEV_VERSION : be_getVersionInt(meta.getVersion().toString()); - + WorldDataUtil.load(data); CompoundTag root = WorldDataUtil.getRootTag(); int dataVersion = be_getVersionInt(root.getString("version")); - GeneratorOptions.setPortalPos(NbtHelper.toBlockPos(root.getCompound("portal"))); - + GeneratorOptions.setPortalPos(NbtUtils.readBlockPos(root.getCompound("portal"))); + if (dataVersion < version) { if (version < FIX_VERSION) { DataFixerUtil.fixData(data.getParentFile()); @@ -82,7 +79,7 @@ public class ServerWorldMixin { } } } - + private static int be_getVersionInt(String version) { if (version.isEmpty()) { return 0; @@ -90,11 +87,12 @@ public class ServerWorldMixin { try { String[] values = version.split("\\."); return Integer.parseInt(values[0]) << 12 | Integer.parseInt(values[1]) << 6 | Integer.parseInt(values[1]); - } catch (Exception e) { + } + catch (Exception e) { return 0; } } - + private static String be_getVersionString(int version) { int a = (version >> 12) & 63; int b = (version >> 6) & 63; diff --git a/src/main/java/ru/betterend/mixin/common/SlimeEntityMixin.java b/src/main/java/ru/betterend/mixin/common/SlimeEntityMixin.java index d4874e59..151180d7 100644 --- a/src/main/java/ru/betterend/mixin/common/SlimeEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/SlimeEntityMixin.java @@ -1,17 +1,15 @@ package ru.betterend.mixin.common; +import net.minecraft.world.entity.monster.Slime; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; - -import net.minecraft.world.entity.mob.SlimeEntity; import ru.betterend.interfaces.ISlime; -@Mixin(SlimeEntity.class) +@Mixin(Slime.class) public class SlimeEntityMixin implements ISlime { @Shadow - protected void setSize(int size, boolean heal) { - } - + protected void setSize(int size, boolean heal) {} + @Override public void beSetSlimeSize(int size, boolean heal) { setSize(size, heal); diff --git a/src/main/java/ru/betterend/mixin/common/TagGroupLoaderMixin.java b/src/main/java/ru/betterend/mixin/common/TagGroupLoaderMixin.java index 8f7c02d2..825d68be 100644 --- a/src/main/java/ru/betterend/mixin/common/TagGroupLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/common/TagGroupLoaderMixin.java @@ -3,28 +3,25 @@ package ru.betterend.mixin.common; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; - +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.tags.Tag; +import net.minecraft.tags.TagLoader; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.resource.ResourceManager; -import net.minecraft.tags.Tag; -import net.minecraft.tags.TagGroupLoader; -import net.minecraft.resources.ResourceLocation; import ru.betterend.util.TagHelper; -@Mixin(TagGroupLoader.class) +@Mixin(TagLoader.class) public class TagGroupLoaderMixin { - + @Shadow private String entryType; - + @Inject(method = "prepareReload", at = @At("RETURN"), cancellable = true) - public void be_prepareReload(ResourceManager manager, Executor prepareExecutor, - CallbackInfoReturnable>> info) { + public void be_prepareReload(ResourceManager manager, Executor prepareExecutor, CallbackInfoReturnable>> info) { CompletableFuture> future = info.getReturnValue(); info.setReturnValue(CompletableFuture.supplyAsync(() -> { Map map = future.join(); diff --git a/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerMixin.java b/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerMixin.java index f8f3830e..7e07ce2c 100644 --- a/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerMixin.java @@ -19,21 +19,20 @@ import ru.betterend.interfaces.IBiomeList; @Mixin(value = WeightedBiomePicker.class, remap = false) public class WeightedBiomePickerMixin implements IBiomeList { private List> biomes = Lists.newArrayList(); - + @Inject(method = "addBiome", at = @At("TAIL")) private void be_addBiome(final ResourceKey biome, final double weight, CallbackInfo info) { if (be_isCorrectPicker((WeightedBiomePicker) (Object) this)) { biomes.add(biome); } } - + @Override public List> getBiomes() { return biomes; } - + private boolean be_isCorrectPicker(WeightedBiomePicker picker) { - return picker == InternalBiomeData.getEndBiomesMap().get(Biomes.SMALL_END_ISLANDS) - || picker == InternalBiomeData.getEndBarrensMap().get(Biomes.END_BARRENS); + return picker == InternalBiomeData.getEndBiomesMap().get(Biomes.SMALL_END_ISLANDS) || picker == InternalBiomeData.getEndBarrensMap().get(Biomes.END_BARRENS); } } diff --git a/src/main/java/ru/betterend/noise/VoronoiNoise.java b/src/main/java/ru/betterend/noise/VoronoiNoise.java index c7735336..20356055 100644 --- a/src/main/java/ru/betterend/noise/VoronoiNoise.java +++ b/src/main/java/ru/betterend/noise/VoronoiNoise.java @@ -1,14 +1,13 @@ package ru.betterend.noise; import java.util.Random; - import net.minecraft.core.BlockPos; import ru.betterend.util.MHelper; public class VoronoiNoise { private static final Random RANDOM = new Random(); final int seed; - + public VoronoiNoise() { this(0); } @@ -16,7 +15,7 @@ public class VoronoiNoise { public VoronoiNoise(int seed) { this.seed = seed; } - + private int getSeed(int x, int y, int z) { int h = seed + x * 374761393 + y * 668265263 + z; h = (h ^ (h >> 13)) * 1274126177; @@ -27,13 +26,13 @@ public class VoronoiNoise { int ix = MHelper.floor(x); int iy = MHelper.floor(y); int iz = MHelper.floor(z); - + float px = (float) (x - ix); float py = (float) (y - iy); float pz = (float) (z - iz); - + float d = 10; - + for (int pox = -1; pox < 2; pox++) { for (int poy = -1; poy < 2; poy++) { for (int poz = -1; poz < 2; poz++) { @@ -48,19 +47,19 @@ public class VoronoiNoise { } } } - + return Math.sqrt(d); } - + public BlockPos[] getPos(double x, double y, double z, double scale) { int ix = MHelper.floor(x); int iy = MHelper.floor(y); int iz = MHelper.floor(z); - + float px = (float) (x - ix); float py = (float) (y - iy); float pz = (float) (z - iz); - + float d = 10; float selX = 0; float selY = 0; @@ -68,7 +67,7 @@ public class VoronoiNoise { float selXPre = 0; float selYPre = 0; float selZPre = 0; - + for (int pox = -1; pox < 2; pox++) { for (int poy = -1; poy < 2; poy++) { for (int poz = -1; poz < 2; poz++) { @@ -89,11 +88,9 @@ public class VoronoiNoise { } } } - - BlockPos p1 = new BlockPos((ix + (double) selX) * scale, (iy + (double) selY) * scale, - (iz + (double) selZ) * scale); - BlockPos p2 = new BlockPos((ix + (double) selXPre) * scale, (iy + (double) selYPre) * scale, - (iz + (double) selZPre) * scale); - return new BlockPos[] { p1, p2 }; + + BlockPos p1 = new BlockPos((ix + (double) selX) * scale, (iy + (double) selY) * scale, (iz + (double) selZ) * scale); + BlockPos p2 = new BlockPos((ix + (double) selXPre) * scale, (iy + (double) selYPre) * scale, (iz + (double) selZPre) * scale); + return new BlockPos[] {p1, p2}; } } diff --git a/src/main/java/ru/betterend/particle/FireflyParticle.java b/src/main/java/ru/betterend/particle/FireflyParticle.java index 808d69fc..fc1f68d8 100644 --- a/src/main/java/ru/betterend/particle/FireflyParticle.java +++ b/src/main/java/ru/betterend/particle/FireflyParticle.java @@ -2,11 +2,11 @@ package ru.betterend.particle; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.particle.SimpleAnimatedParticle; -import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleFactory; -import net.minecraft.client.particle.SpriteSet; import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.SimpleAnimatedParticle; +import net.minecraft.client.particle.SpriteSet; import net.minecraft.core.particles.SimpleParticleType; import net.minecraft.util.Mth; import ru.betterend.util.MHelper; @@ -19,26 +19,25 @@ public class FireflyParticle extends SimpleAnimatedParticle { private double nextVX; private double nextVY; private double nextVZ; - - protected FireflyParticle(ClientLevel world, double x, double y, double z, SpriteSet sprites, double r, double g, - double b) { + + protected FireflyParticle(ClientLevel world, double x, double y, double z, SpriteSet sprites, double r, double g, double b) { super(world, x, y, z, sprites, 0); - setSprite(sprites.getSprite(random)); - this.maxAge = MHelper.randRange(150, 300, random); - this.scale = MHelper.randRange(0.05F, 0.15F, random); - this.setTargetColor(15916745); - this.setSpriteForAge(spriteProvider); - this.setColorAlpha(0); - + setSprite(sprites.get(random)); + this.lifetime = MHelper.randRange(150, 300, random); + this.quadSize = MHelper.randRange(0.05F, 0.15F, random); + this.setFadeColor(15916745); + this.setSpriteFromAge(sprites); + this.setAlpha(0); + preVX = random.nextGaussian() * 0.02; preVY = random.nextGaussian() * 0.02; preVZ = random.nextGaussian() * 0.02; - + nextVX = random.nextGaussian() * 0.02; nextVY = random.nextGaussian() * 0.02; nextVZ = random.nextGaussian() * 0.02; } - + @Override public void tick() { int ticks = this.age & 31; @@ -51,22 +50,23 @@ public class FireflyParticle extends SimpleAnimatedParticle { nextVZ = random.nextGaussian() * 0.02; } double delta = (double) ticks / 31.0; - - this.velocityX = Mth.lerp(delta, preVX, nextVX); - this.velocityY = Mth.lerp(delta, preVY, nextVY); - this.velocityZ = Mth.lerp(delta, preVZ, nextVZ); - + + this.xd = Mth.lerp(delta, preVX, nextVX); + this.yd = Mth.lerp(delta, preVY, nextVY); + this.zd = Mth.lerp(delta, preVZ, nextVZ); + if (this.age <= 60) { - this.setColorAlpha(this.age / 60F); - } else if (this.age > maxAge - 60) { - this.setColorAlpha((maxAge - this.age) / 60F); + this.setAlpha(this.age / 60F); } - + else if (this.age > lifetime - 60) { + this.setAlpha((lifetime - this.age) / 60F); + } + super.tick(); } @Environment(EnvType.CLIENT) - public static class FireflyParticleFactory implements ParticleFactory { + public static class FireflyParticleFactory implements ParticleProvider { private final SpriteSet sprites; public FireflyParticleFactory(SpriteSet sprites) { @@ -74,8 +74,7 @@ public class FireflyParticle extends SimpleAnimatedParticle { } @Override - public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, - double vX, double vY, double vZ) { + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { return new FireflyParticle(world, x, y, z, sprites, 1, 1, 1); } } diff --git a/src/main/java/ru/betterend/particle/GlowingSphereParticleEffect.java b/src/main/java/ru/betterend/particle/GlowingSphereParticleEffect.java index 2c971282..67d8fca1 100644 --- a/src/main/java/ru/betterend/particle/GlowingSphereParticleEffect.java +++ b/src/main/java/ru/betterend/particle/GlowingSphereParticleEffect.java @@ -1,11 +1,10 @@ package ru.betterend.particle; import java.util.Locale; - -import net.minecraft.network.PacketByteBuf; +import net.minecraft.core.Registry; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleType; -import net.minecraft.core.Registry; +import net.minecraft.network.FriendlyByteBuf; import ru.betterend.registry.EndParticles; public class GlowingSphereParticleEffect implements ParticleOptions { @@ -25,16 +24,15 @@ public class GlowingSphereParticleEffect implements ParticleOptions { } @Override - public void write(PacketByteBuf buf) { + public void writeToNetwork(FriendlyByteBuf buf) { buf.writeFloat(this.red); buf.writeFloat(this.green); buf.writeFloat(this.blue); } @Override - public String asString() { - return String.format(Locale.ROOT, "%s %.2f %.2f %.2f", Registry.PARTICLE_TYPE.getId(this.getType()), this.red, - this.green, this.blue); + public String writeToString() { + return String.format(Locale.ROOT, "%s %.2f %.2f %.2f", Registry.PARTICLE_TYPE.getKey(this.getType()), this.red, this.green, this.blue); } public float getRed() { diff --git a/src/main/java/ru/betterend/particle/InfusionParticle.java b/src/main/java/ru/betterend/particle/InfusionParticle.java index e856a4a0..8bdac965 100644 --- a/src/main/java/ru/betterend/particle/InfusionParticle.java +++ b/src/main/java/ru/betterend/particle/InfusionParticle.java @@ -2,62 +2,60 @@ package ru.betterend.particle; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleFactory; -import net.minecraft.client.particle.ParticleTextureSheet; -import net.minecraft.client.particle.SpriteBillboardParticle; -import net.minecraft.client.particle.SpriteSet; import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.ParticleRenderType; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.particle.TextureSheetParticle; -public class InfusionParticle extends SpriteBillboardParticle { - +public class InfusionParticle extends TextureSheetParticle { + private final SpriteSet spriteProvider; - public InfusionParticle(ClientLevel clientWorld, double x, double y, double z, double velocityX, double velocityY, - double velocityZ, float[] palette, SpriteSet spriteProvider) { + public InfusionParticle(ClientLevel clientWorld, double x, double y, double z, double velocityX, double velocityY, double velocityZ, float[] palette, SpriteSet spriteProvider) { super(clientWorld, x, y, z, 0.0, 0.0, 0.0); - this.setSpriteForAge(spriteProvider); + this.setSpriteFromAge(spriteProvider); this.spriteProvider = spriteProvider; this.setColor(palette[0], palette[1], palette[2]); - this.setColorAlpha(palette[3]); - this.velocityX = velocityX * 0.1D; - this.velocityY = velocityY * 0.1D; - this.velocityZ = velocityZ * 0.1D; - this.maxAge = (int) (3.0F / (this.random.nextFloat() * 0.9F + 0.1F)); - this.scale *= 0.9F; + this.setAlpha(palette[3]); + this.xd = velocityX * 0.1D; + this.yd = velocityY * 0.1D; + this.zd = velocityZ * 0.1D; + this.lifetime = (int) (3.0F / (this.random.nextFloat() * 0.9F + 0.1F)); + this.quadSize *= 0.9F; } @Override - public ParticleTextureSheet getType() { - return ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT; + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; } - + @Override public void tick() { - this.prevPosX = this.x; - this.prevPosY = this.y; - this.prevPosZ = this.z; - if (this.age++ >= this.maxAge) { - this.markDead(); + this.xo = this.x; + this.yo = this.y; + this.zo = this.z; + if (this.age++ >= this.lifetime) { + this.remove(); } else { - this.setSpriteForAge(spriteProvider); - double velocityX = 2.0D * this.velocityX * this.random.nextDouble(); - double velocityY = 3.0D * this.velocityY * this.random.nextDouble(); - double velocityZ = 2.0D * this.velocityZ * this.random.nextDouble(); + this.setSpriteFromAge(spriteProvider); + double velocityX = 2.0D * this.xd * this.random.nextDouble(); + double velocityY = 3.0D * this.yd * this.random.nextDouble(); + double velocityZ = 2.0D * this.zd * this.random.nextDouble(); this.move(velocityX, velocityY, velocityZ); } } @Environment(EnvType.CLIENT) - public static class InfusionFactory implements ParticleFactory { + public static class InfusionFactory implements ParticleProvider { private final SpriteSet spriteProvider; - + public InfusionFactory(SpriteSet spriteProvider) { this.spriteProvider = spriteProvider; } - - public Particle createParticle(InfusionParticleType particleType, ClientLevel clientWorld, double d, double e, - double f, double g, double h, double i) { + + public Particle createParticle(InfusionParticleType particleType, ClientLevel clientWorld, double d, double e, double f, double g, double h, double i) { return new InfusionParticle(clientWorld, d, e, f, g, h, i, particleType.getPalette(), this.spriteProvider); } } diff --git a/src/main/java/ru/betterend/particle/InfusionParticleType.java b/src/main/java/ru/betterend/particle/InfusionParticleType.java index 6d237c06..9ab3f67b 100644 --- a/src/main/java/ru/betterend/particle/InfusionParticleType.java +++ b/src/main/java/ru/betterend/particle/InfusionParticleType.java @@ -6,13 +6,13 @@ import com.mojang.serialization.Codec; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.command.argument.ItemStackArgument; -import net.minecraft.command.argument.ItemStringReader; -import net.minecraft.world.item.ItemStack; -import net.minecraft.network.PacketByteBuf; +import net.minecraft.commands.arguments.item.ItemInput; +import net.minecraft.commands.arguments.item.ItemParser; +import net.minecraft.core.Registry; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleType; -import net.minecraft.core.Registry; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.item.ItemStack; import ru.betterend.registry.EndParticles; import ru.betterend.util.ColorUtil; @@ -22,34 +22,32 @@ public class InfusionParticleType extends ParticleType imp }, infusionParticleType -> { return infusionParticleType.itemStack; }); - public static final ParticleOptions.Factory PARAMETERS_FACTORY = new ParticleOptions.Factory() { - public InfusionParticleType read(ParticleType particleType, StringReader stringReader) - throws CommandSyntaxException { + public static final ParticleOptions.Deserializer PARAMETERS_FACTORY = new ParticleOptions.Deserializer() { + public InfusionParticleType fromCommand(ParticleType particleType, StringReader stringReader) throws CommandSyntaxException { stringReader.expect(' '); - ItemStringReader itemStringReader = new ItemStringReader(stringReader, false).consume(); - ItemStack itemStack = new ItemStackArgument(itemStringReader.getItem(), itemStringReader.getTag()) - .createStack(1, false); + ItemParser itemStringReader = new ItemParser(stringReader, false).parse(); + ItemStack itemStack = new ItemInput(itemStringReader.getItem(), itemStringReader.getNbt()).createItemStack(1, false); return new InfusionParticleType(particleType, itemStack); } - public InfusionParticleType read(ParticleType particleType, PacketByteBuf packetByteBuf) { - return new InfusionParticleType(particleType, packetByteBuf.readItemStack()); + public InfusionParticleType fromNetwork(ParticleType particleType, FriendlyByteBuf packetByteBuf) { + return new InfusionParticleType(particleType, packetByteBuf.readItem()); } }; - + private ParticleType type; private ItemStack itemStack; - + public InfusionParticleType(ParticleType particleType, ItemStack stack) { super(true, PARAMETERS_FACTORY); this.type = particleType; this.itemStack = stack; } - + public InfusionParticleType(ItemStack stack) { this(EndParticles.INFUSION, stack); } - + @Environment(EnvType.CLIENT) public float[] getPalette() { int color = ColorUtil.extractColor(itemStack.getItem()); @@ -62,17 +60,17 @@ public class InfusionParticleType extends ParticleType imp } @Override - public void write(PacketByteBuf buffer) { - buffer.writeItemStack(itemStack); + public void writeToNetwork(FriendlyByteBuf buffer) { + buffer.writeItem(itemStack); } @Override - public String asString() { - return Registry.PARTICLE_TYPE.getId(this).toString(); + public String writeToString() { + return Registry.PARTICLE_TYPE.getKey(this).toString(); } @Override - public Codec getCodec() { + public Codec codec() { return CODEC; } } diff --git a/src/main/java/ru/betterend/particle/ParticleBlackSpore.java b/src/main/java/ru/betterend/particle/ParticleBlackSpore.java index 2185c4e5..b1216424 100644 --- a/src/main/java/ru/betterend/particle/ParticleBlackSpore.java +++ b/src/main/java/ru/betterend/particle/ParticleBlackSpore.java @@ -2,12 +2,12 @@ package ru.betterend.particle; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.particle.SimpleAnimatedParticle; -import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleFactory; -import net.minecraft.client.particle.ParticleTextureSheet; -import net.minecraft.client.particle.SpriteSet; import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.ParticleRenderType; +import net.minecraft.client.particle.SimpleAnimatedParticle; +import net.minecraft.client.particle.SpriteSet; import net.minecraft.core.particles.SimpleParticleType; import net.minecraft.util.Mth; import ru.betterend.util.MHelper; @@ -20,26 +20,25 @@ public class ParticleBlackSpore extends SimpleAnimatedParticle { private double nextVX; private double nextVY; private double nextVZ; - - protected ParticleBlackSpore(ClientLevel world, double x, double y, double z, double r, double g, double b, - SpriteSet sprites) { + + protected ParticleBlackSpore(ClientLevel world, double x, double y, double z, double r, double g, double b, SpriteSet sprites) { super(world, x, y, z, sprites, 0); - setSprite(sprites.getSprite(random)); - - this.maxAge = MHelper.randRange(30, 60, random); - this.scale = MHelper.randRange(0.05F, 0.15F, random); + setSprite(sprites.get(random)); + + this.lifetime = MHelper.randRange(30, 60, random); + this.quadSize = MHelper.randRange(0.05F, 0.15F, random); this.setColor(1, 1, 1); - this.setColorAlpha(0); - + this.setAlpha(0); + preVX = random.nextGaussian() * 0.015; preVY = 0; preVZ = random.nextGaussian() * 0.015; - + nextVX = random.nextGaussian() * 0.015; nextVY = random.nextFloat() * 0.02 + 0.01; nextVZ = random.nextGaussian() * 0.015; } - + @Override public void tick() { int ticks = this.age & 15; @@ -52,31 +51,32 @@ public class ParticleBlackSpore extends SimpleAnimatedParticle { nextVZ = random.nextGaussian() * 0.015; } double delta = (double) ticks / 15.0; - + if (this.age <= 15) { - this.setColorAlpha(this.age / 15F); - } else if (this.age >= this.maxAge - 15) { - this.setColorAlpha((this.maxAge - this.age) / 15F); + this.setAlpha(this.age / 15F); } - - if (this.age >= this.maxAge) { - this.markDead(); + else if (this.age >= this.lifetime - 15) { + this.setAlpha((this.lifetime - this.age) / 15F); } - - this.velocityX = Mth.lerp(delta, preVX, nextVX); - this.velocityY = Mth.lerp(delta, preVY, nextVY); - this.velocityZ = Mth.lerp(delta, preVZ, nextVZ); - + + if (this.age >= this.lifetime) { + this.remove(); + } + + this.xd = Mth.lerp(delta, preVX, nextVX); + this.yd = Mth.lerp(delta, preVY, nextVY); + this.zd = Mth.lerp(delta, preVZ, nextVZ); + super.tick(); } - + @Override - public ParticleTextureSheet getType() { - return ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT; + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; } @Environment(EnvType.CLIENT) - public static class FactoryBlackSpore implements ParticleFactory { + public static class FactoryBlackSpore implements ParticleProvider { private final SpriteSet sprites; @@ -85,8 +85,7 @@ public class ParticleBlackSpore extends SimpleAnimatedParticle { } @Override - public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, - double vX, double vY, double vZ) { + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { return new ParticleBlackSpore(world, x, y, z, 1, 1, 1, sprites); } } diff --git a/src/main/java/ru/betterend/particle/ParticleGeyser.java b/src/main/java/ru/betterend/particle/ParticleGeyser.java index dbe6f814..f51913dd 100644 --- a/src/main/java/ru/betterend/particle/ParticleGeyser.java +++ b/src/main/java/ru/betterend/particle/ParticleGeyser.java @@ -2,67 +2,68 @@ package ru.betterend.particle; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleFactory; -import net.minecraft.client.particle.ParticleTextureSheet; -import net.minecraft.client.particle.SpriteBillboardParticle; -import net.minecraft.client.particle.SpriteSet; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.ParticleRenderType; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.particle.TextureSheetParticle; import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.particles.SimpleParticleType; import ru.betterend.util.MHelper; @Environment(EnvType.CLIENT) -public class ParticleGeyser extends SpriteBillboardParticle { +public class ParticleGeyser extends TextureSheetParticle { private MutableBlockPos mut = new MutableBlockPos(); private boolean changeDir = false; private boolean check = true; - - protected ParticleGeyser(ClientLevel world, double x, double y, double z, double vx, double vy, double vz, - SpriteSet sprites) { + + protected ParticleGeyser(ClientLevel world, double x, double y, double z, double vx, double vy, double vz, SpriteSet sprites) { super(world, x, y, z, vx, vy, vz); - setSprite(sprites); - this.maxAge = MHelper.randRange(400, 800, random); - this.scale = MHelper.randRange(0.5F, 1.0F, random); - this.velocityX = vx; - this.velocityZ = vz; - this.prevPosY = y - 0.125; + pickSprite(sprites); + this.lifetime = MHelper.randRange(400, 800, random); + this.quadSize = MHelper.randRange(0.5F, 1.0F, random); + this.xd = vx; + this.zd = vz; + this.yo = y - 0.125; } - + @Override public void tick() { - - if (this.prevPosY == this.y || this.age > this.maxAge) { - this.markDead(); - } else { - if (this.age >= this.maxAge - 200) { - this.setColorAlpha((this.maxAge - this.age) / 200F); + + if (this.yo == this.y || this.age > this.lifetime) { + this.remove(); + } + else { + if (this.age >= this.lifetime - 200) { + this.setAlpha((this.lifetime - this.age) / 200F); } - - this.scale += 0.005F; - this.velocityY = 0.125; - + + this.quadSize += 0.005F; + this.yd = 0.125; + if (changeDir) { changeDir = false; check = false; - this.velocityX += MHelper.randRange(-0.2, 0.2, random); - this.velocityZ += MHelper.randRange(-0.2, 0.2, random); - } else if (check) { - changeDir = world.getBlockState(mut.set(x, y, z)).getFluidState().isEmpty(); - this.velocityX = 0; - this.velocityZ = 0; + this.xd += MHelper.randRange(-0.2, 0.2, random); + this.zd += MHelper.randRange(-0.2, 0.2, random); + } + else if (check) { + changeDir = level.getBlockState(mut.set(x, y, z)).getFluidState().isEmpty(); + this.xd = 0; + this.zd = 0; } } super.tick(); } - + @Override - public ParticleTextureSheet getType() { - return ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT; + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; } @Environment(EnvType.CLIENT) - public static class FactoryGeyser implements ParticleFactory { + public static class FactoryGeyser implements ParticleProvider { private final SpriteSet sprites; @@ -71,8 +72,7 @@ public class ParticleGeyser extends SpriteBillboardParticle { } @Override - public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, - double vX, double vY, double vZ) { + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { return new ParticleGeyser(world, x, y, z, 0, 0.125, 0, sprites); } } diff --git a/src/main/java/ru/betterend/particle/ParticleGlowingSphere.java b/src/main/java/ru/betterend/particle/ParticleGlowingSphere.java index 2628d725..09f5bd02 100644 --- a/src/main/java/ru/betterend/particle/ParticleGlowingSphere.java +++ b/src/main/java/ru/betterend/particle/ParticleGlowingSphere.java @@ -3,9 +3,9 @@ package ru.betterend.particle; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.particle.SimpleAnimatedParticle; import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleFactory; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.SimpleAnimatedParticle; import net.minecraft.client.particle.SpriteSet; import net.minecraft.core.particles.SimpleParticleType; import net.minecraft.util.Mth; @@ -20,28 +20,27 @@ public class ParticleGlowingSphere extends SimpleAnimatedParticle { private double nextVX; private double nextVY; private double nextVZ; - - protected ParticleGlowingSphere(ClientLevel world, double x, double y, double z, SpriteSet sprites, double r, - double g, double b) { + + protected ParticleGlowingSphere(ClientLevel world, double x, double y, double z, SpriteSet sprites, double r, double g, double b) { super(world, x, y, z, sprites, 0); setSprite(sprites.get(random)); this.lifetime = MHelper.randRange(150, 300, random); - this.scale = MHelper.randRange(0.05F, 0.15F, random); + this.quadSize = MHelper.randRange(0.05F, 0.15F, random); this.setFadeColor(15916745); this.setSpriteFromAge(sprites); - + preVX = random.nextGaussian() * 0.02; preVY = random.nextGaussian() * 0.02; preVZ = random.nextGaussian() * 0.02; - + nextVX = random.nextGaussian() * 0.02; nextVY = random.nextGaussian() * 0.02; nextVZ = random.nextGaussian() * 0.02; } - + @Override public void tick() { - ticks++; + ticks ++; if (ticks > 30) { preVX = nextVX; preVY = nextVY; @@ -52,16 +51,16 @@ public class ParticleGlowingSphere extends SimpleAnimatedParticle { ticks = 0; } double delta = (double) ticks / 30.0; - - this.velocityX = Mth.lerp(delta, preVX, nextVX); - this.velocityY = Mth.lerp(delta, preVY, nextVY); - this.velocityZ = Mth.lerp(delta, preVZ, nextVZ); - + + this.xd = Mth.lerp(delta, preVX, nextVX); + this.yd = Mth.lerp(delta, preVY, nextVY); + this.zd = Mth.lerp(delta, preVZ, nextVZ); + super.tick(); } @Environment(EnvType.CLIENT) - public static class FactoryGlowingSphere implements ParticleFactory { + public static class FactoryGlowingSphere implements ParticleProvider { private final SpriteSet sprites; @@ -70,8 +69,7 @@ public class ParticleGlowingSphere extends SimpleAnimatedParticle { } @Override - public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, - double vX, double vY, double vZ) { + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { return new ParticleGlowingSphere(world, x, y, z, sprites, 1, 1, 1); } } diff --git a/src/main/java/ru/betterend/particle/ParticleJungleSpore.java b/src/main/java/ru/betterend/particle/ParticleJungleSpore.java index 691ad9e9..496bc106 100644 --- a/src/main/java/ru/betterend/particle/ParticleJungleSpore.java +++ b/src/main/java/ru/betterend/particle/ParticleJungleSpore.java @@ -2,58 +2,60 @@ package ru.betterend.particle; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.particle.SimpleAnimatedParticle; -import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleFactory; -import net.minecraft.client.particle.SpriteSet; import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.SimpleAnimatedParticle; +import net.minecraft.client.particle.SpriteSet; import net.minecraft.core.particles.SimpleParticleType; import ru.betterend.util.MHelper; @Environment(EnvType.CLIENT) public class ParticleJungleSpore extends SimpleAnimatedParticle { - - protected ParticleJungleSpore(ClientLevel world, double x, double y, double z, SpriteSet sprites, double r, - double g, double b) { + + protected ParticleJungleSpore(ClientLevel world, double x, double y, double z, SpriteSet sprites, double r, double g, double b) { super(world, x, y, z, sprites, 0); - setSprite(sprites.getSprite(random)); - this.maxAge = MHelper.randRange(150, 300, random); - this.scale = MHelper.randRange(0.05F, 0.15F, random); - this.setTargetColor(15916745); - this.setSpriteForAge(spriteProvider); - this.setColorAlpha(0); + setSprite(sprites.get(random)); + this.lifetime = MHelper.randRange(150, 300, random); + this.quadSize = MHelper.randRange(0.05F, 0.15F, random); + this.setFadeColor(15916745); + this.setSpriteFromAge(sprites); + this.setAlpha(0); } - + @Override public void tick() { super.tick(); - + int ticks = this.age % 30; if (ticks == 0) { - this.velocityX = random.nextGaussian() * 0.02; - this.velocityY = random.nextFloat() * 0.02 + 0.02; - this.velocityZ = random.nextGaussian() * 0.02; + this.xd = random.nextGaussian() * 0.02; + this.yd = random.nextFloat() * 0.02 + 0.02; + this.zd = random.nextGaussian() * 0.02; ticks = 0; } - + if (this.age <= 30) { float delta = ticks / 30F; - this.setColorAlpha(delta); - } else if (this.age >= this.maxAge) { - this.setColorAlpha(0); - } else if (this.age >= this.maxAge - 30) { - this.setColorAlpha((this.maxAge - this.age) / 30F); - } else { - this.setColorAlpha(1); + this.setAlpha(delta); } - - this.velocityY -= 0.001F; - this.velocityX *= 0.99F; - this.velocityZ *= 0.99F; + else if (this.age >= this.lifetime) { + this.setAlpha(0); + } + else if (this.age >= this.lifetime - 30) { + this.setAlpha((this.lifetime - this.age) / 30F); + } + else { + this.setAlpha(1); + } + + this.yd -= 0.001F; + this.xd *= 0.99F; + this.zd *= 0.99F; } @Environment(EnvType.CLIENT) - public static class FactoryJungleSpore implements ParticleFactory { + public static class FactoryJungleSpore implements ParticleProvider { private final SpriteSet sprites; public FactoryJungleSpore(SpriteSet sprites) { @@ -61,8 +63,7 @@ public class ParticleJungleSpore extends SimpleAnimatedParticle { } @Override - public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, - double vX, double vY, double vZ) { + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { return new ParticleJungleSpore(world, x, y, z, sprites, 1, 1, 1); } } diff --git a/src/main/java/ru/betterend/particle/ParticleSnowflake.java b/src/main/java/ru/betterend/particle/ParticleSnowflake.java index 1801fada..f7e389e4 100644 --- a/src/main/java/ru/betterend/particle/ParticleSnowflake.java +++ b/src/main/java/ru/betterend/particle/ParticleSnowflake.java @@ -2,18 +2,18 @@ package ru.betterend.particle; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleFactory; -import net.minecraft.client.particle.ParticleTextureSheet; -import net.minecraft.client.particle.SpriteBillboardParticle; -import net.minecraft.client.particle.SpriteSet; import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.ParticleRenderType; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.particle.TextureSheetParticle; import net.minecraft.core.particles.SimpleParticleType; import net.minecraft.util.Mth; import ru.betterend.util.MHelper; @Environment(EnvType.CLIENT) -public class ParticleSnowflake extends SpriteBillboardParticle { +public class ParticleSnowflake extends TextureSheetParticle { private int ticks; private double preVX; private double preVY; @@ -21,28 +21,27 @@ public class ParticleSnowflake extends SpriteBillboardParticle { private double nextVX; private double nextVY; private double nextVZ; - - protected ParticleSnowflake(ClientLevel world, double x, double y, double z, double r, double g, double b, - SpriteSet sprites) { + + protected ParticleSnowflake(ClientLevel world, double x, double y, double z, double r, double g, double b, SpriteSet sprites) { super(world, x, y, z, r, g, b); - setSprite(sprites); - - this.maxAge = MHelper.randRange(150, 300, random); - this.scale = MHelper.randRange(0.05F, 0.2F, random); - this.setColorAlpha(0F); - + pickSprite(sprites); + + this.lifetime = MHelper.randRange(150, 300, random); + this.quadSize = MHelper.randRange(0.05F, 0.2F, random); + this.setAlpha(0F); + preVX = random.nextGaussian() * 0.015; preVY = random.nextGaussian() * 0.015; preVZ = random.nextGaussian() * 0.015; - + nextVX = random.nextGaussian() * 0.015; nextVY = random.nextGaussian() * 0.015; nextVZ = random.nextGaussian() * 0.015; } - + @Override public void tick() { - ticks++; + ticks ++; if (ticks > 200) { preVX = nextVX; preVY = nextVY; @@ -56,31 +55,32 @@ public class ParticleSnowflake extends SpriteBillboardParticle { ticks = 0; } double delta = (double) ticks / 200.0; - + if (this.age <= 40) { - this.setColorAlpha(this.age / 40F); - } else if (this.age >= this.maxAge - 40) { - this.setColorAlpha((this.maxAge - this.age) / 40F); + this.setAlpha(this.age / 40F); } - - if (this.age >= this.maxAge) { - this.markDead(); + else if (this.age >= this.lifetime - 40) { + this.setAlpha((this.lifetime - this.age) / 40F); } - - this.velocityX = Mth.lerp(delta, preVX, nextVX); - this.velocityY = Mth.lerp(delta, preVY, nextVY); - this.velocityZ = Mth.lerp(delta, preVZ, nextVZ); - + + if (this.age >= this.lifetime) { + this.remove(); + } + + this.xd = Mth.lerp(delta, preVX, nextVX); + this.yd = Mth.lerp(delta, preVY, nextVY); + this.zd = Mth.lerp(delta, preVZ, nextVZ); + super.tick(); } - + @Override - public ParticleTextureSheet getType() { - return ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT; + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; } @Environment(EnvType.CLIENT) - public static class FactorySnowflake implements ParticleFactory { + public static class FactorySnowflake implements ParticleProvider { private final SpriteSet sprites; @@ -89,8 +89,7 @@ public class ParticleSnowflake extends SpriteBillboardParticle { } @Override - public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, - double vX, double vY, double vZ) { + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { return new ParticleSnowflake(world, x, y, z, 1, 1, 1, sprites); } } diff --git a/src/main/java/ru/betterend/particle/ParticleSulphur.java b/src/main/java/ru/betterend/particle/ParticleSulphur.java index 74a3d9f7..288bc830 100644 --- a/src/main/java/ru/betterend/particle/ParticleSulphur.java +++ b/src/main/java/ru/betterend/particle/ParticleSulphur.java @@ -2,18 +2,18 @@ package ru.betterend.particle; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleFactory; -import net.minecraft.client.particle.ParticleTextureSheet; -import net.minecraft.client.particle.SpriteBillboardParticle; -import net.minecraft.client.particle.SpriteSet; import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.ParticleRenderType; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.particle.TextureSheetParticle; import net.minecraft.core.particles.SimpleParticleType; import net.minecraft.util.Mth; import ru.betterend.util.MHelper; @Environment(EnvType.CLIENT) -public class ParticleSulphur extends SpriteBillboardParticle { +public class ParticleSulphur extends TextureSheetParticle { private int ticks; private double preVX; private double preVY; @@ -21,29 +21,28 @@ public class ParticleSulphur extends SpriteBillboardParticle { private double nextVX; private double nextVY; private double nextVZ; - - protected ParticleSulphur(ClientLevel world, double x, double y, double z, double r, double g, double b, - SpriteSet sprites) { + + protected ParticleSulphur(ClientLevel world, double x, double y, double z, double r, double g, double b, SpriteSet sprites) { super(world, x, y, z, r, g, b); - setSprite(sprites); - - this.maxAge = MHelper.randRange(150, 300, random); - this.scale = MHelper.randRange(0.05F, 0.15F, random); + pickSprite(sprites); + + this.lifetime = MHelper.randRange(150, 300, random); + this.quadSize = MHelper.randRange(0.05F, 0.15F, random); this.setColor(1, 1, 1); - this.setColorAlpha(0); - + this.setAlpha(0); + preVX = random.nextGaussian() * 0.015; preVY = random.nextGaussian() * 0.015; preVZ = random.nextGaussian() * 0.015; - + nextVX = random.nextGaussian() * 0.015; nextVY = random.nextGaussian() * 0.015; nextVZ = random.nextGaussian() * 0.015; } - + @Override public void tick() { - ticks++; + ticks ++; if (ticks > 200) { preVX = nextVX; preVY = nextVY; @@ -57,31 +56,32 @@ public class ParticleSulphur extends SpriteBillboardParticle { ticks = 0; } double delta = (double) ticks / 200.0; - + if (this.age <= 40) { - this.setColorAlpha(this.age / 40F); - } else if (this.age >= this.maxAge - 40) { - this.setColorAlpha((this.maxAge - this.age) / 40F); + this.setAlpha(this.age / 40F); } - - if (this.age >= this.maxAge) { - this.markDead(); + else if (this.age >= this.lifetime - 40) { + this.setAlpha((this.lifetime - this.age) / 40F); } - - this.velocityX = Mth.lerp(delta, preVX, nextVX); - this.velocityY = Mth.lerp(delta, preVY, nextVY); - this.velocityZ = Mth.lerp(delta, preVZ, nextVZ); - + + if (this.age >= this.lifetime) { + this.remove(); + } + + this.xd = Mth.lerp(delta, preVX, nextVX); + this.yd = Mth.lerp(delta, preVY, nextVY); + this.zd = Mth.lerp(delta, preVZ, nextVZ); + super.tick(); } - + @Override - public ParticleTextureSheet getType() { - return ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT; + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; } @Environment(EnvType.CLIENT) - public static class FactorySulphur implements ParticleFactory { + public static class FactorySulphur implements ParticleProvider { private final SpriteSet sprites; @@ -90,8 +90,7 @@ public class ParticleSulphur extends SpriteBillboardParticle { } @Override - public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, - double vX, double vY, double vZ) { + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { return new ParticleSulphur(world, x, y, z, 1, 1, 1, sprites); } } diff --git a/src/main/java/ru/betterend/particle/ParticleTenaneaPetal.java b/src/main/java/ru/betterend/particle/ParticleTenaneaPetal.java index 52e438bb..abf2c9d7 100644 --- a/src/main/java/ru/betterend/particle/ParticleTenaneaPetal.java +++ b/src/main/java/ru/betterend/particle/ParticleTenaneaPetal.java @@ -3,62 +3,61 @@ package ru.betterend.particle; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.color.block.BlockColor; -import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleFactory; -import net.minecraft.client.particle.ParticleTextureSheet; -import net.minecraft.client.particle.SpriteBillboardParticle; -import net.minecraft.client.particle.SpriteSet; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.ParticleRenderType; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.particle.TextureSheetParticle; import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.SimpleParticleType; import net.minecraft.util.Mth; import ru.betterend.interfaces.IColorProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; @Environment(EnvType.CLIENT) -public class ParticleTenaneaPetal extends SpriteBillboardParticle { +public class ParticleTenaneaPetal extends TextureSheetParticle { private static BlockColor provider; - + private double preVX; private double preVY; private double preVZ; private double nextVX; private double nextVY; private double nextVZ; - - protected ParticleTenaneaPetal(ClientLevel world, double x, double y, double z, double r, double g, double b, - SpriteSet sprites) { + + protected ParticleTenaneaPetal(ClientLevel world, double x, double y, double z, double r, double g, double b, SpriteSet sprites) { super(world, x, y, z, r, g, b); - setSprite(sprites); - + pickSprite(sprites); + if (provider == null) { IColorProvider block = (IColorProvider) EndBlocks.TENANEA_FLOWERS; - provider = block.getBlockProvider(); + provider = block.getProvider(); } int color = provider.getColor(null, null, new BlockPos(x, y, z), 0); - this.colorRed = ((color >> 16) & 255) / 255F; - this.colorGreen = ((color >> 8) & 255) / 255F; - this.colorBlue = ((color) & 255) / 255F; - - this.maxAge = MHelper.randRange(120, 200, random); - this.scale = MHelper.randRange(0.05F, 0.15F, random); - this.setColorAlpha(0); - + this.rCol = ((color >> 16) & 255) / 255F; + this.gCol = ((color >> 8) & 255) / 255F; + this.bCol = ((color) & 255) / 255F; + + this.lifetime = MHelper.randRange(120, 200, random); + this.quadSize = MHelper.randRange(0.05F, 0.15F, random); + this.setAlpha(0); + preVX = 0; preVY = 0; preVZ = 0; - + nextVX = random.nextGaussian() * 0.02; nextVY = -random.nextDouble() * 0.02 - 0.02; nextVZ = random.nextGaussian() * 0.02; } @Override - public int getColorMultiplier(float tint) { + public int getLightColor(float tint) { return 15728880; } - + @Override public void tick() { int ticks = this.age & 63; @@ -71,31 +70,32 @@ public class ParticleTenaneaPetal extends SpriteBillboardParticle { nextVZ = random.nextGaussian() * 0.02; } double delta = (double) ticks / 63.0; - + if (this.age <= 40) { - this.setColorAlpha(this.age / 40F); - } else if (this.age >= this.maxAge - 40) { - this.setColorAlpha((this.maxAge - this.age) / 40F); + this.setAlpha(this.age / 40F); } - - if (this.age >= this.maxAge) { - this.markDead(); + else if (this.age >= this.lifetime - 40) { + this.setAlpha((this.lifetime - this.age) / 40F); } - - this.velocityX = Mth.lerp(delta, preVX, nextVX); - this.velocityY = Mth.lerp(delta, preVY, nextVY); - this.velocityZ = Mth.lerp(delta, preVZ, nextVZ); - + + if (this.age >= this.lifetime) { + this.remove(); + } + + this.xd = Mth.lerp(delta, preVX, nextVX); + this.yd = Mth.lerp(delta, preVY, nextVY); + this.zd = Mth.lerp(delta, preVZ, nextVZ); + super.tick(); } - + @Override - public ParticleTextureSheet getType() { - return ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT; + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; } @Environment(EnvType.CLIENT) - public static class FactoryTenaneaPetal implements ParticleFactory { + public static class FactoryTenaneaPetal implements ParticleProvider { private final SpriteSet sprites; @@ -104,8 +104,7 @@ public class ParticleTenaneaPetal extends SpriteBillboardParticle { } @Override - public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, - double vX, double vY, double vZ) { + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { return new ParticleTenaneaPetal(world, x, y, z, 1, 1, 1, sprites); } } diff --git a/src/main/java/ru/betterend/particle/PaticlePortalSphere.java b/src/main/java/ru/betterend/particle/PaticlePortalSphere.java index 7566c67b..4df6155e 100644 --- a/src/main/java/ru/betterend/particle/PaticlePortalSphere.java +++ b/src/main/java/ru/betterend/particle/PaticlePortalSphere.java @@ -2,11 +2,11 @@ package ru.betterend.particle; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.particle.SimpleAnimatedParticle; -import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleFactory; -import net.minecraft.client.particle.SpriteSet; import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.SimpleAnimatedParticle; +import net.minecraft.client.particle.SpriteSet; import net.minecraft.core.particles.SimpleParticleType; import net.minecraft.util.Mth; import ru.betterend.util.MHelper; @@ -19,25 +19,25 @@ public class PaticlePortalSphere extends SimpleAnimatedParticle { private double nextVX; private double nextVY; private double nextVZ; - + public PaticlePortalSphere(ClientLevel world, double x, double y, double z, SpriteSet spriteProvider) { super(world, x, y, z, spriteProvider, 0); - setSprite(spriteProvider.getSprite(random)); - this.maxAge = MHelper.randRange(20, 80, random); - this.scale = MHelper.randRange(0.05F, 0.15F, random); + setSprite(spriteProvider.get(random)); + this.lifetime = MHelper.randRange(20, 80, random); + this.quadSize = MHelper.randRange(0.05F, 0.15F, random); this.setColor(0xFEBBD5); - this.setTargetColor(0xBBFEE4); - this.setSpriteForAge(spriteProvider); - + this.setFadeColor(0xBBFEE4); + this.setSpriteFromAge(spriteProvider); + preVX = random.nextGaussian() * 0.02; preVY = random.nextGaussian() * 0.02; preVZ = random.nextGaussian() * 0.02; - + nextVX = random.nextGaussian() * 0.02; nextVY = random.nextGaussian() * 0.02; nextVZ = random.nextGaussian() * 0.02; } - + @Override public void tick() { ticks++; @@ -51,16 +51,16 @@ public class PaticlePortalSphere extends SimpleAnimatedParticle { ticks = 0; } double delta = (double) ticks / 30.0; - - this.velocityX = Mth.lerp(delta, preVX, nextVX); - this.velocityY = Mth.lerp(delta, preVY, nextVY); - this.velocityZ = Mth.lerp(delta, preVZ, nextVZ); - + + this.xd = Mth.lerp(delta, preVX, nextVX); + this.yd = Mth.lerp(delta, preVY, nextVY); + this.zd = Mth.lerp(delta, preVZ, nextVZ); + super.tick(); } @Environment(EnvType.CLIENT) - public static class FactoryPortalSphere implements ParticleFactory { + public static class FactoryPortalSphere implements ParticleProvider { private final SpriteSet sprites; @@ -69,8 +69,7 @@ public class PaticlePortalSphere extends SimpleAnimatedParticle { } @Override - public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, - double vX, double vY, double vZ) { + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { return new PaticlePortalSphere(world, x, y, z, sprites); } } diff --git a/src/main/java/ru/betterend/particle/SmaragdantParticle.java b/src/main/java/ru/betterend/particle/SmaragdantParticle.java index 2cb5aac3..ceab0088 100644 --- a/src/main/java/ru/betterend/particle/SmaragdantParticle.java +++ b/src/main/java/ru/betterend/particle/SmaragdantParticle.java @@ -2,12 +2,12 @@ package ru.betterend.particle; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.particle.SimpleAnimatedParticle; -import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleFactory; -import net.minecraft.client.particle.ParticleTextureSheet; -import net.minecraft.client.particle.SpriteSet; import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.ParticleRenderType; +import net.minecraft.client.particle.SimpleAnimatedParticle; +import net.minecraft.client.particle.SpriteSet; import net.minecraft.core.particles.SimpleParticleType; import net.minecraft.util.Mth; import ru.betterend.util.MHelper; @@ -20,26 +20,25 @@ public class SmaragdantParticle extends SimpleAnimatedParticle { private double nextVX; private double nextVY; private double nextVZ; - - protected SmaragdantParticle(ClientLevel world, double x, double y, double z, double r, double g, double b, - SpriteSet sprites) { + + protected SmaragdantParticle(ClientLevel world, double x, double y, double z, double r, double g, double b, SpriteSet sprites) { super(world, x, y, z, sprites, 0); - setSprite(sprites.getSprite(random)); - - this.maxAge = MHelper.randRange(60, 120, random); - this.scale = MHelper.randRange(0.05F, 0.15F, random); + setSprite(sprites.get(random)); + + this.lifetime = MHelper.randRange(60, 120, random); + this.quadSize = MHelper.randRange(0.05F, 0.15F, random); this.setColor(1, 1, 1); - this.setColorAlpha(0); - + this.setAlpha(0); + preVX = random.nextGaussian() * 0.01; preVY = random.nextGaussian() * 0.01; preVZ = random.nextGaussian() * 0.01; - + nextVX = random.nextGaussian() * 0.01; nextVY = random.nextGaussian() * 0.01; nextVZ = random.nextGaussian() * 0.01; } - + @Override public void tick() { int ticks = this.age & 31; @@ -52,31 +51,32 @@ public class SmaragdantParticle extends SimpleAnimatedParticle { nextVZ = random.nextGaussian() * 0.015; } double delta = (double) ticks / 31.0; - + if (this.age <= 31) { - this.setColorAlpha(this.age / 31F); - } else if (this.age >= this.maxAge - 31) { - this.setColorAlpha((this.maxAge - this.age) / 31F); + this.setAlpha(this.age / 31F); } - - if (this.age >= this.maxAge) { - this.markDead(); + else if (this.age >= this.lifetime - 31) { + this.setAlpha((this.lifetime - this.age) / 31F); } - - this.velocityX = Mth.lerp(delta, preVX, nextVX); - this.velocityY = Mth.lerp(delta, preVY, nextVY); - this.velocityZ = Mth.lerp(delta, preVZ, nextVZ); - + + if (this.age >= this.lifetime) { + this.remove(); + } + + this.xd = Mth.lerp(delta, preVX, nextVX); + this.yd = Mth.lerp(delta, preVY, nextVY); + this.zd = Mth.lerp(delta, preVZ, nextVZ); + super.tick(); } - + @Override - public ParticleTextureSheet getType() { - return ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT; + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; } @Environment(EnvType.CLIENT) - public static class SmaragdantParticleFactory implements ParticleFactory { + public static class SmaragdantParticleFactory implements ParticleProvider { private final SpriteSet sprites; @@ -85,8 +85,7 @@ public class SmaragdantParticle extends SimpleAnimatedParticle { } @Override - public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, - double vX, double vY, double vZ) { + public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { return new SmaragdantParticle(world, x, y, z, 1, 1, 1, sprites); } } diff --git a/src/main/java/ru/betterend/patterns/BlockPatterned.java b/src/main/java/ru/betterend/patterns/BlockPatterned.java index 61feee5d..3e35dee0 100644 --- a/src/main/java/ru/betterend/patterns/BlockPatterned.java +++ b/src/main/java/ru/betterend/patterns/BlockPatterned.java @@ -1,14 +1,12 @@ package ru.betterend.patterns; import java.io.Reader; - import net.minecraft.resources.ResourceLocation; public interface BlockPatterned extends Patterned { default String getStatesPattern(Reader data) { return null; } - default ResourceLocation statePatternId() { return null; } diff --git a/src/main/java/ru/betterend/patterns/Patterns.java b/src/main/java/ru/betterend/patterns/Patterns.java index d4f5b7da..9db38371 100644 --- a/src/main/java/ru/betterend/patterns/Patterns.java +++ b/src/main/java/ru/betterend/patterns/Patterns.java @@ -8,17 +8,15 @@ import java.nio.charset.StandardCharsets; import java.util.Map; import java.util.Map.Entry; import java.util.stream.Collectors; - -import com.google.common.collect.Maps; - import net.minecraft.client.Minecraft; -import net.minecraft.resource.ResourceManager; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.ResourceManager; +import com.google.common.collect.Maps; import ru.betterend.BetterEnd; public class Patterns { - - // Blockstates + + //Blockstates public final static ResourceLocation STATE_SIMPLE = BetterEnd.makeID("patterns/blockstate/block.json"); public final static ResourceLocation STATE_SLAB = BetterEnd.makeID("patterns/blockstate/slab.json"); public final static ResourceLocation STATE_STAIRS = BetterEnd.makeID("patterns/blockstate/stairs.json"); @@ -27,8 +25,7 @@ public class Patterns { public final static ResourceLocation STATE_BUTTON = BetterEnd.makeID("patterns/blockstate/button.json"); public final static ResourceLocation STATE_PILLAR = BetterEnd.makeID("patterns/blockstate/pillar.json"); public final static ResourceLocation STATE_PLATE = BetterEnd.makeID("patterns/blockstate/pressure_plate.json"); - public final static ResourceLocation STATE_PLATE_ROTATED = BetterEnd - .makeID("patterns/blockstate/pressure_plate_rotated.json"); + public final static ResourceLocation STATE_PLATE_ROTATED = BetterEnd.makeID("patterns/blockstate/pressure_plate_rotated.json"); public final static ResourceLocation STATE_DOOR = BetterEnd.makeID("patterns/blockstate/door.json"); public final static ResourceLocation STATE_SAPLING = BetterEnd.makeID("patterns/blockstate/sapling.json"); public final static ResourceLocation STATE_GATE = BetterEnd.makeID("patterns/blockstate/fence_gate.json"); @@ -36,8 +33,7 @@ public class Patterns { public final static ResourceLocation STATE_LADDER = BetterEnd.makeID("patterns/blockstate/ladder.json"); public final static ResourceLocation STATE_BARREL = BetterEnd.makeID("patterns/blockstate/barrel.json"); public final static ResourceLocation STATE_PEDESTAL = BetterEnd.makeID("patterns/blockstate/pedestal.json"); - public final static ResourceLocation STATE_STONE_LANTERN = BetterEnd - .makeID("patterns/blockstate/stone_lantern.json"); + public final static ResourceLocation STATE_STONE_LANTERN = BetterEnd.makeID("patterns/blockstate/stone_lantern.json"); public final static ResourceLocation STATE_DIRECT = BetterEnd.makeID("patterns/blockstate/direct.json"); public final static ResourceLocation STATE_BULB_LANTERN = BetterEnd.makeID("patterns/blockstate/bulb_lantern.json"); public final static ResourceLocation STATE_COMPOSTER = BetterEnd.makeID("patterns/blockstate/composter.json"); @@ -48,11 +44,10 @@ public class Patterns { public final static ResourceLocation STATE_CHANDELIER = BetterEnd.makeID("patterns/blockstate/chandelier.json"); public final static ResourceLocation STATE_FURNACE = BetterEnd.makeID("patterns/blockstate/furnace.json"); public final static ResourceLocation STATE_ROTATED_TOP = BetterEnd.makeID("patterns/blockstate/rotated_top.json"); - public final static ResourceLocation STATE_TRIPLE_ROTATED_TOP = BetterEnd - .makeID("patterns/blockstate/triple_rotated_top.json"); + public final static ResourceLocation STATE_TRIPLE_ROTATED_TOP = BetterEnd.makeID("patterns/blockstate/triple_rotated_top.json"); public final static ResourceLocation STATE_STALACTITE = BetterEnd.makeID("patterns/blockstate/stalactite.json"); - - // Models Block + + //Models Block public final static ResourceLocation BLOCK_EMPTY = BetterEnd.makeID("patterns/block/empty.json"); public final static ResourceLocation BLOCK_BASE = BetterEnd.makeID("patterns/block/block.json"); public final static ResourceLocation BLOCK_SIDED = BetterEnd.makeID("patterns/block/block_sided.json"); @@ -74,59 +69,43 @@ public class Patterns { public final static ResourceLocation BLOCK_DOOR_TOP = BetterEnd.makeID("patterns/block/door_top.json"); public final static ResourceLocation BLOCK_DOOR_TOP_HINGE = BetterEnd.makeID("patterns/block/door_top_hinge.json"); public final static ResourceLocation BLOCK_DOOR_BOTTOM = BetterEnd.makeID("patterns/block/door_bottom.json"); - public final static ResourceLocation BLOCK_DOOR_BOTTOM_HINGE = BetterEnd - .makeID("patterns/block/door_bottom_hinge.json"); + public final static ResourceLocation BLOCK_DOOR_BOTTOM_HINGE = BetterEnd.makeID("patterns/block/door_bottom_hinge.json"); public final static ResourceLocation BLOCK_CROSS = BetterEnd.makeID("patterns/block/cross.json"); public final static ResourceLocation BLOCK_CROSS_SHADED = BetterEnd.makeID("patterns/block/cross_shaded.json"); public final static ResourceLocation BLOCK_GATE_CLOSED = BetterEnd.makeID("patterns/block/fence_gate_closed.json"); - public final static ResourceLocation BLOCK_GATE_CLOSED_WALL = BetterEnd - .makeID("patterns/block/wall_gate_closed.json"); + public final static ResourceLocation BLOCK_GATE_CLOSED_WALL = BetterEnd.makeID("patterns/block/wall_gate_closed.json"); public final static ResourceLocation BLOCK_GATE_OPEN = BetterEnd.makeID("patterns/block/fence_gate_open.json"); public final static ResourceLocation BLOCK_GATE_OPEN_WALL = BetterEnd.makeID("patterns/block/wall_gate_open.json"); public final static ResourceLocation BLOCK_TRAPDOOR = BetterEnd.makeID("patterns/block/trapdoor.json"); public final static ResourceLocation BLOCK_LADDER = BetterEnd.makeID("patterns/block/ladder.json"); public final static ResourceLocation BLOCK_BARREL_OPEN = BetterEnd.makeID("patterns/block/barrel_open.json"); - public final static ResourceLocation BLOCK_PEDESTAL_DEFAULT = BetterEnd - .makeID("patterns/block/pedestal_default.json"); - public final static ResourceLocation BLOKC_PEDESTAL_COLUMN = BetterEnd - .makeID("patterns/block/pedestal_column.json"); - public final static ResourceLocation BLOCK_PEDESTAL_COLUMN_TOP = BetterEnd - .makeID("patterns/block/pedestal_column_top.json"); + public final static ResourceLocation BLOCK_PEDESTAL_DEFAULT = BetterEnd.makeID("patterns/block/pedestal_default.json"); + public final static ResourceLocation BLOKC_PEDESTAL_COLUMN = BetterEnd.makeID("patterns/block/pedestal_column.json"); + public final static ResourceLocation BLOCK_PEDESTAL_COLUMN_TOP = BetterEnd.makeID("patterns/block/pedestal_column_top.json"); public final static ResourceLocation BLOCK_PEDESTAL_TOP = BetterEnd.makeID("patterns/block/pedestal_top.json"); - public final static ResourceLocation BLOCK_PEDESTAL_BOTTOM = BetterEnd - .makeID("patterns/block/pedestal_bottom.json"); - public final static ResourceLocation BLOCK_PEDESTAL_PILLAR = BetterEnd - .makeID("patterns/block/pedestal_pillar.json"); + public final static ResourceLocation BLOCK_PEDESTAL_BOTTOM = BetterEnd.makeID("patterns/block/pedestal_bottom.json"); + public final static ResourceLocation BLOCK_PEDESTAL_PILLAR = BetterEnd.makeID("patterns/block/pedestal_pillar.json"); public final static ResourceLocation BLOCK_BOOKSHELF = BetterEnd.makeID("patterns/block/bookshelf.json"); - public final static ResourceLocation BLOCK_STONE_LANTERN_CEIL = BetterEnd - .makeID("patterns/block/stone_lantern_ceil.json"); - public final static ResourceLocation BLOCK_STONE_LANTERN_FLOOR = BetterEnd - .makeID("patterns/block/stone_lantern_floor.json"); - public final static ResourceLocation BLOCK_BULB_LANTERN_FLOOR = BetterEnd - .makeID("patterns/block/bulb_lantern_floor.json"); - public final static ResourceLocation BLOCK_BULB_LANTERN_CEIL = BetterEnd - .makeID("patterns/block/bulb_lantern_ceil.json"); - public final static ResourceLocation BLOCK_PETAL_COLORED = BetterEnd - .makeID("models/block/block_petal_colored.json"); + public final static ResourceLocation BLOCK_STONE_LANTERN_CEIL = BetterEnd.makeID("patterns/block/stone_lantern_ceil.json"); + public final static ResourceLocation BLOCK_STONE_LANTERN_FLOOR = BetterEnd.makeID("patterns/block/stone_lantern_floor.json"); + public final static ResourceLocation BLOCK_BULB_LANTERN_FLOOR = BetterEnd.makeID("patterns/block/bulb_lantern_floor.json"); + public final static ResourceLocation BLOCK_BULB_LANTERN_CEIL = BetterEnd.makeID("patterns/block/bulb_lantern_ceil.json"); + public final static ResourceLocation BLOCK_PETAL_COLORED = BetterEnd.makeID("models/block/block_petal_colored.json"); public final static ResourceLocation BLOCK_COMPOSTER = BetterEnd.makeID("patterns/block/composter.json"); public final static ResourceLocation BLOCK_COLORED = BetterEnd.makeID("patterns/block/block_colored.json"); public final static ResourceLocation BLOCK_BARS_POST = BetterEnd.makeID("patterns/block/bars_post.json"); public final static ResourceLocation BLOCK_BARS_SIDE = BetterEnd.makeID("patterns/block/bars_side.json"); public final static ResourceLocation BLOCK_ANVIL = BetterEnd.makeID("patterns/block/anvil.json"); public final static ResourceLocation BLOCK_CHAIN = BetterEnd.makeID("patterns/block/chain.json"); - public final static ResourceLocation BLOCK_CHANDELIER_FLOOR = BetterEnd - .makeID("patterns/block/chandelier_floor.json"); - public final static ResourceLocation BLOCK_CHANDELIER_WALL = BetterEnd - .makeID("patterns/block/chandelier_wall.json"); - public final static ResourceLocation BLOCK_CHANDELIER_CEIL = BetterEnd - .makeID("patterns/block/chandelier_ceil.json"); + public final static ResourceLocation BLOCK_CHANDELIER_FLOOR = BetterEnd.makeID("patterns/block/chandelier_floor.json"); + public final static ResourceLocation BLOCK_CHANDELIER_WALL = BetterEnd.makeID("patterns/block/chandelier_wall.json"); + public final static ResourceLocation BLOCK_CHANDELIER_CEIL = BetterEnd.makeID("patterns/block/chandelier_ceil.json"); public final static ResourceLocation BLOCK_FURNACE = BetterEnd.makeID("patterns/block/furnace.json"); public final static ResourceLocation BLOCK_FURNACE_GLOW = BetterEnd.makeID("patterns/block/furnace_glow.json"); - public final static ResourceLocation BLOCK_TOP_SIDE_BOTTOM = BetterEnd - .makeID("patterns/block/top_side_bottom.json"); + public final static ResourceLocation BLOCK_TOP_SIDE_BOTTOM = BetterEnd.makeID("patterns/block/top_side_bottom.json"); public final static ResourceLocation BLOCK_PATH = BetterEnd.makeID("patterns/block/path.json"); - - // Models Item + + //Models Item public final static ResourceLocation ITEM_WALL = BetterEnd.makeID("patterns/item/pattern_wall.json"); public final static ResourceLocation ITEM_FENCE = BetterEnd.makeID("patterns/item/pattern_fence.json"); public final static ResourceLocation ITEM_BUTTON = BetterEnd.makeID("patterns/item/pattern_button.json"); @@ -135,15 +114,17 @@ public class Patterns { public final static ResourceLocation ITEM_GENERATED = BetterEnd.makeID("patterns/item/pattern_item_generated.json"); public final static ResourceLocation ITEM_HANDHELD = BetterEnd.makeID("patterns/item/pattern_item_handheld.json"); public final static ResourceLocation ITEM_SPAWN_EGG = BetterEnd.makeID("patterns/item/pattern_item_spawn_egg.json"); - + public static String createJson(Reader data, String parent, String block) { try (BufferedReader buffer = new BufferedReader(data)) { - return buffer.lines().collect(Collectors.joining()).replace("%parent%", parent).replace("%block%", block); + return buffer.lines().collect(Collectors.joining()) + .replace("%parent%", parent) + .replace("%block%", block); } catch (Exception ex) { return null; } } - + public static String createJson(ResourceLocation patternId, String parent, String block) { ResourceManager resourceManager = Minecraft.getInstance().getResourceManager(); try (InputStream input = resourceManager.getResource(patternId).getInputStream()) { @@ -162,8 +143,8 @@ public class Patterns { public static String createJson(ResourceLocation patternId, Map textures) { ResourceManager resourceManager = Minecraft.getInstance().getResourceManager(); try (InputStream input = resourceManager.getResource(patternId).getInputStream()) { - String json = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8)).lines() - .collect(Collectors.joining()); + String json = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8)) + .lines().collect(Collectors.joining()); for (Entry texture : textures.entrySet()) { json = json.replace(texture.getKey(), texture.getValue()); } diff --git a/src/main/java/ru/betterend/recipe/AlloyingRecipes.java b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java index 0204b435..9d6dfc88 100644 --- a/src/main/java/ru/betterend/recipe/AlloyingRecipes.java +++ b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java @@ -1,25 +1,46 @@ package ru.betterend.recipe; -import net.minecraft.world.level.block.Blocks; import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Blocks; import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; public class AlloyingRecipes { public static void register() { - AlloyingRecipe.Builder.create("additional_iron").setInput(Blocks.IRON_ORE, Blocks.IRON_ORE) - .setOutput(Items.IRON_INGOT, 3).setExpiriense(2.1F).build(); - AlloyingRecipe.Builder.create("additional_gold").setInput(Blocks.GOLD_ORE, Blocks.GOLD_ORE) - .setOutput(Items.GOLD_INGOT, 3).setExpiriense(3F).build(); - AlloyingRecipe.Builder.create("additional_netherite").setInput(Blocks.ANCIENT_DEBRIS, Blocks.ANCIENT_DEBRIS) - .setOutput(Items.NETHERITE_SCRAP, 3).setExpiriense(6F).setSmeltTime(1000).build(); - AlloyingRecipe.Builder.create("terminite_ingot").setInput(Items.IRON_INGOT, EndItems.ENDER_DUST) - .setOutput(EndBlocks.TERMINITE.ingot, 1).setExpiriense(2.5F).setSmeltTime(450).build(); - AlloyingRecipe.Builder.create("aeternium_ingot").setInput(EndBlocks.TERMINITE.ingot, Items.NETHERITE_INGOT) - .setOutput(EndItems.AETERNIUM_INGOT, 1).setExpiriense(4.5F).setSmeltTime(850).build(); + AlloyingRecipe.Builder.create("additional_iron") + .setInput(Blocks.IRON_ORE, Blocks.IRON_ORE) + .setOutput(Items.IRON_INGOT, 3) + .setExpiriense(2.1F) + .build(); + AlloyingRecipe.Builder.create("additional_gold") + .setInput(Blocks.GOLD_ORE, Blocks.GOLD_ORE) + .setOutput(Items.GOLD_INGOT, 3) + .setExpiriense(3F) + .build(); + AlloyingRecipe.Builder.create("additional_netherite") + .setInput(Blocks.ANCIENT_DEBRIS, Blocks.ANCIENT_DEBRIS) + .setOutput(Items.NETHERITE_SCRAP, 3) + .setExpiriense(6F) + .setSmeltTime(1000) + .build(); + AlloyingRecipe.Builder.create("terminite_ingot") + .setInput(Items.IRON_INGOT, EndItems.ENDER_DUST) + .setOutput(EndBlocks.TERMINITE.ingot, 1) + .setExpiriense(2.5F) + .setSmeltTime(450) + .build(); + AlloyingRecipe.Builder.create("aeternium_ingot") + .setInput(EndBlocks.TERMINITE.ingot, Items.NETHERITE_INGOT) + .setOutput(EndItems.AETERNIUM_INGOT, 1) + .setExpiriense(4.5F) + .setSmeltTime(850) + .build(); AlloyingRecipe.Builder.create("terminite_ingot_thallasium") - .setInput(EndBlocks.THALLASIUM.ingot, EndItems.ENDER_DUST).setOutput(EndBlocks.TERMINITE.ingot, 1) - .setExpiriense(2.5F).setSmeltTime(450).build(); + .setInput(EndBlocks.THALLASIUM.ingot, EndItems.ENDER_DUST) + .setOutput(EndBlocks.TERMINITE.ingot, 1) + .setExpiriense(2.5F) + .setSmeltTime(450) + .build(); } } diff --git a/src/main/java/ru/betterend/recipe/AnvilRecipes.java b/src/main/java/ru/betterend/recipe/AnvilRecipes.java index b72ce6d4..0e110e83 100644 --- a/src/main/java/ru/betterend/recipe/AnvilRecipes.java +++ b/src/main/java/ru/betterend/recipe/AnvilRecipes.java @@ -7,27 +7,61 @@ import ru.betterend.registry.EndItems; public class AnvilRecipes { public static void register() { - AnvilRecipe.Builder.create("ender_pearl_to_dust").setInput(Items.ENDER_PEARL).setOutput(EndItems.ENDER_DUST) - .setToolLevel(4).setDamage(5).build(); - AnvilRecipe.Builder.create("ender_shard_to_dust").setInput(EndItems.ENDER_SHARD).setOutput(EndItems.ENDER_DUST) - .setToolLevel(0).setDamage(3).build(); - + AnvilRecipe.Builder.create("ender_pearl_to_dust") + .setInput(Items.ENDER_PEARL) + .setOutput(EndItems.ENDER_DUST) + .setToolLevel(4) + .setDamage(5) + .build(); + AnvilRecipe.Builder.create("ender_shard_to_dust") + .setInput(EndItems.ENDER_SHARD) + .setOutput(EndItems.ENDER_DUST) + .setToolLevel(0) + .setDamage(3) + .build(); + int anvilLevel = EndToolMaterial.AETERNIUM.getLevel(); - AnvilRecipe.Builder.create("aeternium_axe_head").setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_AXE_HEAD).setAnvilLevel(anvilLevel).setToolLevel(4).setDamage(6).build(); - AnvilRecipe.Builder.create("aeternium_pickaxe_head").setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_PICKAXE_HEAD).setAnvilLevel(anvilLevel).setToolLevel(4).setDamage(6) - .build(); - AnvilRecipe.Builder.create("aeternium_shovel_head").setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_SHOVEL_HEAD).setAnvilLevel(anvilLevel).setToolLevel(4).setDamage(6) - .build(); - AnvilRecipe.Builder.create("aeternium_hoe_head").setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_HOE_HEAD).setAnvilLevel(anvilLevel).setToolLevel(4).setDamage(6).build(); - AnvilRecipe.Builder.create("aeternium_hammer_head").setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_HAMMER_HEAD).setAnvilLevel(anvilLevel).setToolLevel(4).setDamage(6) - .build(); - AnvilRecipe.Builder.create("aeternium_sword_blade").setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_SWORD_BLADE).setAnvilLevel(anvilLevel).setToolLevel(4).setDamage(6) - .build(); + AnvilRecipe.Builder.create("aeternium_axe_head") + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_AXE_HEAD) + .setAnvilLevel(anvilLevel) + .setToolLevel(4) + .setDamage(6) + .build(); + AnvilRecipe.Builder.create("aeternium_pickaxe_head") + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_PICKAXE_HEAD) + .setAnvilLevel(anvilLevel) + .setToolLevel(4) + .setDamage(6) + .build(); + AnvilRecipe.Builder.create("aeternium_shovel_head") + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_SHOVEL_HEAD) + .setAnvilLevel(anvilLevel) + .setToolLevel(4) + .setDamage(6) + .build(); + AnvilRecipe.Builder.create("aeternium_hoe_head") + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_HOE_HEAD) + .setAnvilLevel(anvilLevel) + .setToolLevel(4) + .setDamage(6) + .build(); + AnvilRecipe.Builder.create("aeternium_hammer_head") + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_HAMMER_HEAD) + .setAnvilLevel(anvilLevel) + .setToolLevel(4) + .setDamage(6) + .build(); + AnvilRecipe.Builder.create("aeternium_sword_blade") + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_SWORD_BLADE) + .setAnvilLevel(anvilLevel) + .setToolLevel(4) + .setDamage(6) + .build(); } } diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index 841be2e2..4b894a6b 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -1,12 +1,12 @@ package ru.betterend.recipe; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.potion.PotionUtil; +import net.minecraft.world.item.alchemy.PotionUtils; import net.minecraft.world.item.alchemy.Potions; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; import ru.betterend.BetterEnd; import ru.betterend.item.GuideBookItem; import ru.betterend.recipe.builders.GridRecipe; @@ -15,66 +15,71 @@ import ru.betterend.registry.EndItems; import ru.betterend.registry.EndTags; public class CraftingRecipes { - + public static void register() { if (BetterEnd.hasGuideBook()) { - GridRecipe.make("guide_book", GuideBookItem.GUIDE_BOOK).setShape("D", "B", "C") - .addMaterial('D', EndItems.ENDER_DUST).addMaterial('B', Items.BOOK) - .addMaterial('C', EndItems.CRYSTAL_SHARDS).build(); + GridRecipe.make("guide_book", GuideBookItem.GUIDE_BOOK) + .setShape("D", "B", "C") + .addMaterial('D', EndItems.ENDER_DUST) + .addMaterial('B', Items.BOOK) + .addMaterial('C', EndItems.CRYSTAL_SHARDS) + .build(); } - - GridRecipe.make("ender_perl_to_block", EndBlocks.ENDER_BLOCK).setShape("OO", "OO") - .addMaterial('O', Items.ENDER_PEARL).build(); - GridRecipe.make("ender_block_to_perl", Items.ENDER_PEARL).addMaterial('#', EndBlocks.ENDER_BLOCK) - .setOutputCount(4).setList("#").build(); - - GridRecipe.make("end_stone_smelter", EndBlocks.END_STONE_SMELTER).setShape("T#T", "V V", "T#T") - .addMaterial('#', Blocks.END_STONE_BRICKS).addMaterial('T', EndBlocks.THALLASIUM.ingot) - .addMaterial('V', EndTags.FURNACES).build(); - - registerPedestal("andesite_pedestal", EndBlocks.ANDESITE_PEDESTAL, Blocks.POLISHED_ANDESITE_SLAB, - Blocks.POLISHED_ANDESITE); - registerPedestal("diorite_pedestal", EndBlocks.DIORITE_PEDESTAL, Blocks.POLISHED_DIORITE_SLAB, - Blocks.POLISHED_DIORITE); - registerPedestal("granite_pedestal", EndBlocks.GRANITE_PEDESTAL, Blocks.POLISHED_GRANITE_SLAB, - Blocks.POLISHED_GRANITE); + + GridRecipe.make("ender_perl_to_block", EndBlocks.ENDER_BLOCK) + .setShape("OO", "OO") + .addMaterial('O', Items.ENDER_PEARL) + .build(); + GridRecipe.make("ender_block_to_perl", Items.ENDER_PEARL) + .addMaterial('#', EndBlocks.ENDER_BLOCK) + .setOutputCount(4) + .setList("#") + .build(); + + GridRecipe.make("end_stone_smelter", EndBlocks.END_STONE_SMELTER) + .setShape("T#T", "V V", "T#T") + .addMaterial('#', Blocks.END_STONE_BRICKS) + .addMaterial('T', EndBlocks.THALLASIUM.ingot) + .addMaterial('V', EndTags.FURNACES) + .build(); + + registerPedestal("andesite_pedestal", EndBlocks.ANDESITE_PEDESTAL, Blocks.POLISHED_ANDESITE_SLAB, Blocks.POLISHED_ANDESITE); + registerPedestal("diorite_pedestal", EndBlocks.DIORITE_PEDESTAL, Blocks.POLISHED_DIORITE_SLAB, Blocks.POLISHED_DIORITE); + registerPedestal("granite_pedestal", EndBlocks.GRANITE_PEDESTAL, Blocks.POLISHED_GRANITE_SLAB, Blocks.POLISHED_GRANITE); registerPedestal("quartz_pedestal", EndBlocks.QUARTZ_PEDESTAL, Blocks.QUARTZ_SLAB, Blocks.QUARTZ_PILLAR); registerPedestal("purpur_pedestal", EndBlocks.PURPUR_PEDESTAL, Blocks.PURPUR_SLAB, Blocks.PURPUR_PILLAR); - - GridRecipe.make("infusion_pedestal", EndBlocks.INFUSION_PEDESTAL).setShape(" Y ", "O#O", " # ") - .addMaterial('O', Items.ENDER_PEARL).addMaterial('Y', Items.ENDER_EYE).addMaterial('#', Blocks.OBSIDIAN) - .build(); - + + GridRecipe.make("infusion_pedestal", EndBlocks.INFUSION_PEDESTAL) + .setShape(" Y ", "O#O", " # ") + .addMaterial('O', Items.ENDER_PEARL) + .addMaterial('Y', Items.ENDER_EYE) + .addMaterial('#', Blocks.OBSIDIAN) + .build(); + String material = "aeternium"; - GridRecipe.make(material + "_block", EndBlocks.AETERNIUM_BLOCK).setShape("III", "III", "III") - .addMaterial('I', EndItems.AETERNIUM_INGOT).build(); + GridRecipe.make(material + "_block", EndBlocks.AETERNIUM_BLOCK) + .setShape("III", "III", "III") + .addMaterial('I', EndItems.AETERNIUM_INGOT) + .build(); GridRecipe.make(material + "_block_to_ingot", EndItems.AETERNIUM_INGOT) - .addMaterial('#', EndBlocks.AETERNIUM_BLOCK).setOutputCount(9).setList("#").build(); - - GridRecipe.make("blue_vine_seed_dye", Items.BLUE_DYE).setList("#").addMaterial('#', EndBlocks.BLUE_VINE_SEED) - .build(); - GridRecipe.make("creeping_moss_dye", Items.CYAN_DYE).setList("#").addMaterial('#', EndBlocks.CREEPING_MOSS) - .build(); - GridRecipe.make("umbrella_moss_dye", Items.YELLOW_DYE).setList("#").addMaterial('#', EndBlocks.UMBRELLA_MOSS) - .build(); - GridRecipe.make("umbrella_moss_tall_dye", Items.YELLOW_DYE).setOutputCount(2).setList("#") - .addMaterial('#', EndBlocks.UMBRELLA_MOSS_TALL).build(); - GridRecipe.make("shadow_plant_dye", Items.BLACK_DYE).setList("#").addMaterial('#', EndBlocks.SHADOW_PLANT) - .build(); - - GridRecipe.make("paper", Items.PAPER).setShape("###").addMaterial('#', EndItems.END_LILY_LEAF_DRIED) - .setOutputCount(3).build(); - - GridRecipe.make("aurora_block", EndBlocks.AURORA_CRYSTAL).setShape("##", "##") - .addMaterial('#', EndItems.CRYSTAL_SHARDS).build(); - GridRecipe.make("lotus_block", EndBlocks.END_LOTUS.log).setShape("##", "##") - .addMaterial('#', EndBlocks.END_LOTUS_STEM).build(); - GridRecipe.make("needlegrass_stick", Items.STICK).setList("#").setOutputCount(2) - .addMaterial('#', EndBlocks.NEEDLEGRASS).build(); - GridRecipe.make("shadow_berry_seeds", EndBlocks.SHADOW_BERRY).setList("#").setOutputCount(4) - .addMaterial('#', EndItems.SHADOW_BERRY_RAW).build(); - GridRecipe.make("purple_polypore_dye", Items.PURPLE_DYE).setList("#") - .addMaterial('#', EndBlocks.PURPLE_POLYPORE).build(); + .addMaterial('#', EndBlocks.AETERNIUM_BLOCK) + .setOutputCount(9) + .setList("#") + .build(); + + GridRecipe.make("blue_vine_seed_dye", Items.BLUE_DYE).setList("#").addMaterial('#', EndBlocks.BLUE_VINE_SEED).build(); + GridRecipe.make("creeping_moss_dye", Items.CYAN_DYE).setList("#").addMaterial('#', EndBlocks.CREEPING_MOSS).build(); + GridRecipe.make("umbrella_moss_dye", Items.YELLOW_DYE).setList("#").addMaterial('#', EndBlocks.UMBRELLA_MOSS).build(); + GridRecipe.make("umbrella_moss_tall_dye", Items.YELLOW_DYE).setOutputCount(2).setList("#").addMaterial('#', EndBlocks.UMBRELLA_MOSS_TALL).build(); + GridRecipe.make("shadow_plant_dye", Items.BLACK_DYE).setList("#").addMaterial('#', EndBlocks.SHADOW_PLANT).build(); + + GridRecipe.make("paper", Items.PAPER).setShape("###").addMaterial('#', EndItems.END_LILY_LEAF_DRIED).setOutputCount(3).build(); + + GridRecipe.make("aurora_block", EndBlocks.AURORA_CRYSTAL).setShape("##", "##").addMaterial('#', EndItems.CRYSTAL_SHARDS).build(); + GridRecipe.make("lotus_block", EndBlocks.END_LOTUS.log).setShape("##", "##").addMaterial('#', EndBlocks.END_LOTUS_STEM).build(); + GridRecipe.make("needlegrass_stick", Items.STICK).setList("#").setOutputCount(2).addMaterial('#', EndBlocks.NEEDLEGRASS).build(); + GridRecipe.make("shadow_berry_seeds", EndBlocks.SHADOW_BERRY).setList("#").setOutputCount(4).addMaterial('#', EndItems.SHADOW_BERRY_RAW).build(); + GridRecipe.make("purple_polypore_dye", Items.PURPLE_DYE).setList("#").addMaterial('#', EndBlocks.PURPLE_POLYPORE).build(); registerLantern("end_stone_lantern", EndBlocks.END_STONE_LANTERN, Blocks.END_STONE_BRICK_SLAB); registerLantern("andesite_lantern", EndBlocks.ANDESITE_LANTERN, Blocks.ANDESITE_SLAB); @@ -83,130 +88,136 @@ public class CraftingRecipes { registerLantern("quartz_lantern", EndBlocks.QUARTZ_LANTERN, Blocks.QUARTZ_SLAB); registerLantern("purpur_lantern", EndBlocks.PURPUR_LANTERN, Blocks.PURPUR_SLAB); registerLantern("blackstone_lantern", EndBlocks.BLACKSTONE_LANTERN, Blocks.BLACKSTONE_SLAB); - - GridRecipe.make("amber_gem", EndItems.AMBER_GEM).setShape("##", "##").addMaterial('#', EndItems.RAW_AMBER) - .build(); - GridRecipe.make("amber_block", EndBlocks.AMBER_BLOCK).setShape("##", "##").addMaterial('#', EndItems.AMBER_GEM) - .build(); - GridRecipe.make("amber_gem_block", EndItems.AMBER_GEM).setOutputCount(4).setList("#") - .addMaterial('#', EndBlocks.AMBER_BLOCK).build(); - GridRecipe.make("iron_bulb_lantern", EndBlocks.IRON_BULB_LANTERN).setShape("C", "I", "#") - .addMaterial('C', Items.CHAIN).addMaterial('I', Items.IRON_INGOT) - .addMaterial('#', EndItems.GLOWING_BULB).build(); - GridRecipe.make("twisted_moss_dye", Items.PINK_DYE).setList("#").addMaterial('#', EndBlocks.TWISTED_MOSS) - .build(); - GridRecipe.make("byshy_grass_dye", Items.MAGENTA_DYE).setList("#").addMaterial('#', EndBlocks.BUSHY_GRASS) - .build(); + + GridRecipe.make("amber_gem", EndItems.AMBER_GEM).setShape("##", "##").addMaterial('#', EndItems.RAW_AMBER).build(); + GridRecipe.make("amber_block", EndBlocks.AMBER_BLOCK).setShape("##", "##").addMaterial('#', EndItems.AMBER_GEM).build(); + GridRecipe.make("amber_gem_block", EndItems.AMBER_GEM).setOutputCount(4).setList("#").addMaterial('#', EndBlocks.AMBER_BLOCK).build(); + GridRecipe.make("iron_bulb_lantern", EndBlocks.IRON_BULB_LANTERN).setShape("C", "I", "#").addMaterial('C', Items.CHAIN).addMaterial('I', Items.IRON_INGOT).addMaterial('#', EndItems.GLOWING_BULB).build(); + GridRecipe.make("twisted_moss_dye", Items.PINK_DYE).setList("#").addMaterial('#', EndBlocks.TWISTED_MOSS).build(); + GridRecipe.make("byshy_grass_dye", Items.MAGENTA_DYE).setList("#").addMaterial('#', EndBlocks.BUSHY_GRASS).build(); GridRecipe.make("tail_moss_dye", Items.GRAY_DYE).setList("#").addMaterial('#', EndBlocks.TAIL_MOSS).build(); - GridRecipe.make("petal_block", EndBlocks.HYDRALUX_PETAL_BLOCK).setShape("##", "##") - .addMaterial('#', EndItems.HYDRALUX_PETAL).build(); - GridRecipe.make("petal_white_dye", Items.WHITE_DYE).setList("#").addMaterial('#', EndItems.HYDRALUX_PETAL) - .build(); - - GridRecipe.make("sweet_berry_jelly", EndItems.SWEET_BERRY_JELLY).setList("JWSB") - .addMaterial('J', EndItems.GELATINE) - .addMaterial('W', PotionUtil.setPotion(new ItemStack(Items.POTION), Potions.WATER)) - .addMaterial('S', Items.SUGAR).addMaterial('B', Items.SWEET_BERRIES).build(); - - GridRecipe.make("shadow_berry_jelly", EndItems.SHADOW_BERRY_JELLY).setList("JWSB") - .addMaterial('J', EndItems.GELATINE) - .addMaterial('W', PotionUtil.setPotion(new ItemStack(Items.POTION), Potions.WATER)) - .addMaterial('S', Items.SUGAR).addMaterial('B', EndItems.SHADOW_BERRY_COOKED).build(); - - GridRecipe.make("sulphur_gunpowder", Items.GUNPOWDER).setList("SCB") - .addMaterial('S', EndItems.CRYSTALLINE_SULPHUR).addMaterial('C', Items.COAL, Items.CHARCOAL) - .addMaterial('B', Items.BONE_MEAL).build(); - - GridRecipe.make("dense_emerald_ice", EndBlocks.DENSE_EMERALD_ICE).setShape("##", "##") - .addMaterial('#', EndBlocks.EMERALD_ICE).build(); - GridRecipe.make("ancient_emerald_ice", EndBlocks.ANCIENT_EMERALD_ICE).setShape("###", "###", "###") - .addMaterial('#', EndBlocks.DENSE_EMERALD_ICE).build(); - - GridRecipe.make("charnia_cyan_dye", Items.CYAN_DYE).setList("#").addMaterial('#', EndBlocks.CHARNIA_CYAN) - .build(); - GridRecipe.make("charnia_green_dye", Items.GREEN_DYE).setList("#").addMaterial('#', EndBlocks.CHARNIA_GREEN) - .build(); - GridRecipe.make("charnia_light_blue_dye", Items.LIGHT_BLUE_DYE).setList("#") - .addMaterial('#', EndBlocks.CHARNIA_LIGHT_BLUE).build(); - GridRecipe.make("charnia_orange_dye", Items.ORANGE_DYE).setList("#").addMaterial('#', EndBlocks.CHARNIA_ORANGE) - .build(); - GridRecipe.make("charnia_purple_dye", Items.PURPLE_DYE).setList("#").addMaterial('#', EndBlocks.CHARNIA_PURPLE) - .build(); + GridRecipe.make("petal_block", EndBlocks.HYDRALUX_PETAL_BLOCK).setShape("##", "##").addMaterial('#', EndItems.HYDRALUX_PETAL).build(); + GridRecipe.make("petal_white_dye", Items.WHITE_DYE).setList("#").addMaterial('#', EndItems.HYDRALUX_PETAL).build(); + + GridRecipe.make("sweet_berry_jelly", EndItems.SWEET_BERRY_JELLY) + .setList("JWSB") + .addMaterial('J', EndItems.GELATINE) + .addMaterial('W', PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.WATER)) + .addMaterial('S', Items.SUGAR).addMaterial('B', Items.SWEET_BERRIES) + .build(); + + GridRecipe.make("shadow_berry_jelly", EndItems.SHADOW_BERRY_JELLY) + .setList("JWSB") + .addMaterial('J', EndItems.GELATINE) + .addMaterial('W', PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.WATER)) + .addMaterial('S', Items.SUGAR) + .addMaterial('B', EndItems.SHADOW_BERRY_COOKED) + .build(); + + GridRecipe.make("sulphur_gunpowder", Items.GUNPOWDER).setList("SCB").addMaterial('S', EndItems.CRYSTALLINE_SULPHUR).addMaterial('C', Items.COAL, Items.CHARCOAL).addMaterial('B', Items.BONE_MEAL).build(); + + GridRecipe.make("dense_emerald_ice", EndBlocks.DENSE_EMERALD_ICE).setShape("##", "##").addMaterial('#', EndBlocks.EMERALD_ICE).build(); + GridRecipe.make("ancient_emerald_ice", EndBlocks.ANCIENT_EMERALD_ICE).setShape("###", "###", "###").addMaterial('#', EndBlocks.DENSE_EMERALD_ICE).build(); + + GridRecipe.make("charnia_cyan_dye", Items.CYAN_DYE).setList("#").addMaterial('#', EndBlocks.CHARNIA_CYAN).build(); + GridRecipe.make("charnia_green_dye", Items.GREEN_DYE).setList("#").addMaterial('#', EndBlocks.CHARNIA_GREEN).build(); + GridRecipe.make("charnia_light_blue_dye", Items.LIGHT_BLUE_DYE).setList("#").addMaterial('#', EndBlocks.CHARNIA_LIGHT_BLUE).build(); + GridRecipe.make("charnia_orange_dye", Items.ORANGE_DYE).setList("#").addMaterial('#', EndBlocks.CHARNIA_ORANGE).build(); + GridRecipe.make("charnia_purple_dye", Items.PURPLE_DYE).setList("#").addMaterial('#', EndBlocks.CHARNIA_PURPLE).build(); GridRecipe.make("charnia_red_dye", Items.RED_DYE).setList("#").addMaterial('#', EndBlocks.CHARNIA_RED).build(); - - GridRecipe.make("respawn_obelisk", EndBlocks.RESPAWN_OBELISK).setShape("CSC", "CSC", "AAA") - .addMaterial('C', EndBlocks.AURORA_CRYSTAL).addMaterial('S', EndItems.ETERNAL_CRYSTAL) - .addMaterial('A', EndBlocks.AMBER_BLOCK).build(); - - GridRecipe.make("hopper", Blocks.HOPPER).setShape("I I", "ICI", " I ").addMaterial('I', Items.IRON_INGOT) - .addMaterial('C', EndTags.ITEM_CHEST).build(); - - GridRecipe.make("shulker_box", Blocks.SHULKER_BOX).setShape("S", "C", "S").addMaterial('S', Items.SHULKER_SHELL) - .addMaterial('C', EndTags.ITEM_CHEST).build(); - - GridRecipe.make("twisted_umbrella_moss_dye", Items.PURPLE_DYE).setList("#") - .addMaterial('#', EndBlocks.TWISTED_UMBRELLA_MOSS).build(); - GridRecipe.make("twisted_umbrella_moss_dye_tall", Items.PURPLE_DYE).setOutputCount(2).setList("#") - .addMaterial('#', EndBlocks.TWISTED_UMBRELLA_MOSS_TALL).build(); - - GridRecipe.make("leather_to_stripes", EndItems.LEATHER_STRIPE).setList("L").addMaterial('L', Items.LEATHER) - .setOutputCount(3).build(); - GridRecipe.make("stripes_to_leather", Items.LEATHER).setList("SSS").addMaterial('S', EndItems.LEATHER_STRIPE) - .build(); - GridRecipe.make("leather_wrapped_stick", EndItems.LEATHER_WRAPPED_STICK).setList("SL") - .addMaterial('S', Items.STICK).addMaterial('L', EndItems.LEATHER_STRIPE).build(); - - GridRecipe.make("fiber_string", Items.STRING).setOutputCount(6).setShape("#", "#", "#") - .addMaterial('#', EndItems.SILK_FIBER).build(); - - GridRecipe.make("ender_eye_amber", Items.ENDER_EYE).setShape("SAS", "APA", "SAS") - .addMaterial('S', EndItems.CRYSTAL_SHARDS).addMaterial('A', EndItems.AMBER_GEM) - .addMaterial('P', Items.ENDER_PEARL).build(); - - GridRecipe.make("iron_chandelier", EndBlocks.IRON_CHANDELIER).setShape("I#I", " # ") - .addMaterial('#', Items.IRON_INGOT).addMaterial('I', EndItems.LUMECORN_ROD) - .setGroup("end_metal_chandelier").build(); - GridRecipe.make("gold_chandelier", EndBlocks.GOLD_CHANDELIER).setShape("I#I", " # ") - .addMaterial('#', Items.GOLD_INGOT).addMaterial('I', EndItems.LUMECORN_ROD) - .setGroup("end_metal_chandelier").build(); - - GridRecipe.make("missing_tile", EndBlocks.MISSING_TILE).setOutputCount(4).setShape("#P", "P#") - .addMaterial('#', EndBlocks.VIOLECITE.stone, EndBlocks.VIOLECITE.bricks, EndBlocks.VIOLECITE.tiles) - .addMaterial('P', Blocks.PURPUR_BLOCK).build(); + + GridRecipe.make("respawn_obelisk", EndBlocks.RESPAWN_OBELISK) + .setShape("CSC", "CSC", "AAA") + .addMaterial('C', EndBlocks.AURORA_CRYSTAL) + .addMaterial('S', EndItems.ETERNAL_CRYSTAL) + .addMaterial('A', EndBlocks.AMBER_BLOCK) + .build(); + + GridRecipe.make("hopper", Blocks.HOPPER) + .setShape("I I", "ICI", " I ") + .addMaterial('I', Items.IRON_INGOT) + .addMaterial('C', EndTags.ITEM_CHEST) + .build(); + + GridRecipe.make("shulker_box", Blocks.SHULKER_BOX) + .setShape("S", "C", "S") + .addMaterial('S', Items.SHULKER_SHELL) + .addMaterial('C', EndTags.ITEM_CHEST) + .build(); + + GridRecipe.make("twisted_umbrella_moss_dye", Items.PURPLE_DYE).setList("#").addMaterial('#', EndBlocks.TWISTED_UMBRELLA_MOSS).build(); + GridRecipe.make("twisted_umbrella_moss_dye_tall", Items.PURPLE_DYE).setOutputCount(2).setList("#").addMaterial('#', EndBlocks.TWISTED_UMBRELLA_MOSS_TALL).build(); + + GridRecipe.make("leather_to_stripes", EndItems.LEATHER_STRIPE) + .setList("L") + .addMaterial('L', Items.LEATHER) + .setOutputCount(3) + .build(); + GridRecipe.make("stripes_to_leather", Items.LEATHER) + .setList("SSS") + .addMaterial('S', EndItems.LEATHER_STRIPE) + .build(); + GridRecipe.make("leather_wrapped_stick", EndItems.LEATHER_WRAPPED_STICK) + .setList("SL") + .addMaterial('S', Items.STICK) + .addMaterial('L', EndItems.LEATHER_STRIPE) + .build(); + + GridRecipe.make("fiber_string", Items.STRING).setOutputCount(6).setShape("#", "#", "#").addMaterial('#', EndItems.SILK_FIBER).build(); + + GridRecipe.make("ender_eye_amber", Items.ENDER_EYE) + .setShape("SAS", "APA", "SAS") + .addMaterial('S', EndItems.CRYSTAL_SHARDS) + .addMaterial('A', EndItems.AMBER_GEM) + .addMaterial('P', Items.ENDER_PEARL) + .build(); + + GridRecipe.make("iron_chandelier", EndBlocks.IRON_CHANDELIER).setShape("I#I", " # ").addMaterial('#', Items.IRON_INGOT).addMaterial('I', EndItems.LUMECORN_ROD).setGroup("end_metal_chandelier").build(); + GridRecipe.make("gold_chandelier", EndBlocks.GOLD_CHANDELIER).setShape("I#I", " # ").addMaterial('#', Items.GOLD_INGOT).addMaterial('I', EndItems.LUMECORN_ROD).setGroup("end_metal_chandelier").build(); + + GridRecipe.make("missing_tile", EndBlocks.MISSING_TILE) + .setOutputCount(4) + .setShape("#P", "P#") + .addMaterial('#', EndBlocks.VIOLECITE.stone, EndBlocks.VIOLECITE.bricks, EndBlocks.VIOLECITE.tiles) + .addMaterial('P', Blocks.PURPUR_BLOCK) + .build(); registerHammer("iron", Items.IRON_INGOT, EndItems.IRON_HAMMER); registerHammer("golden", Items.GOLD_INGOT, EndItems.GOLDEN_HAMMER); registerHammer("diamond", Items.DIAMOND, EndItems.DIAMOND_HAMMER); - GridRecipe.make("charcoal_block", EndBlocks.CHARCOAL_BLOCK).setShape("###", "###", "###") - .addMaterial('#', Items.CHARCOAL).build(); - GridRecipe.make("end_stone_furnace", EndBlocks.END_STONE_FURNACE).setShape("###", "# #", "###") - .addMaterial('#', Blocks.END_STONE).build(); - GridRecipe.make("filalux_lantern", EndBlocks.FILALUX_LANTERN).setShape("###", "###", "###") - .addMaterial('#', EndBlocks.FILALUX).build(); - - GridRecipe.make("silk_moth_hive", EndBlocks.SILK_MOTH_HIVE).setShape("#L#", "LML", "#L#") - .addMaterial('#', EndBlocks.TENANEA.planks).addMaterial('L', EndBlocks.TENANEA_LEAVES) - .addMaterial('M', EndItems.SILK_MOTH_MATRIX).build(); - GridRecipe.make("cave_pumpkin_pie", EndItems.CAVE_PUMPKIN_PIE).setShape(" B ", "BPB", " B ") - .addMaterial('P', EndBlocks.CAVE_PUMPKIN) - .addMaterial('B', EndItems.BLOSSOM_BERRY, EndItems.SHADOW_BERRY_RAW).build(); - GridRecipe.make("cave_pumpkin_seeds", EndBlocks.CAVE_PUMPKIN_SEED).setOutputCount(4).setList("#") - .addMaterial('#', EndBlocks.CAVE_PUMPKIN).build(); + GridRecipe.make("charcoal_block", EndBlocks.CHARCOAL_BLOCK).setShape("###", "###", "###").addMaterial('#', Items.CHARCOAL).build(); + GridRecipe.make("end_stone_furnace", EndBlocks.END_STONE_FURNACE).setShape("###", "# #", "###").addMaterial('#', Blocks.END_STONE).build(); + GridRecipe.make("filalux_lantern", EndBlocks.FILALUX_LANTERN).setShape("###", "###", "###").addMaterial('#', EndBlocks.FILALUX).build(); + + GridRecipe.make("silk_moth_hive", EndBlocks.SILK_MOTH_HIVE).setShape("#L#", "LML", "#L#").addMaterial('#', EndBlocks.TENANEA.planks).addMaterial('L', EndBlocks.TENANEA_LEAVES).addMaterial('M', EndItems.SILK_MOTH_MATRIX).build(); + GridRecipe.make("cave_pumpkin_pie", EndItems.CAVE_PUMPKIN_PIE).setShape(" B ", "BPB", " B ").addMaterial('P', EndBlocks.CAVE_PUMPKIN).addMaterial('B', EndItems.BLOSSOM_BERRY, EndItems.SHADOW_BERRY_RAW).build(); + GridRecipe.make("cave_pumpkin_seeds", EndBlocks.CAVE_PUMPKIN_SEED).setOutputCount(4).setList("#").addMaterial('#', EndBlocks.CAVE_PUMPKIN).build(); } - + private static void registerLantern(String name, Block lantern, Block slab) { - GridRecipe.make(name, lantern).setShape("S", "#", "S").addMaterial('#', EndItems.CRYSTAL_SHARDS) - .addMaterial('S', slab).setGroup("end_stone_lanterns").build(); + GridRecipe.make(name, lantern) + .setShape("S", "#", "S") + .addMaterial('#', EndItems.CRYSTAL_SHARDS) + .addMaterial('S', slab) + .setGroup("end_stone_lanterns") + .build(); } - + public static void registerPedestal(String name, Block pedestal, Block slab, Block pillar) { - GridRecipe.make(name, pedestal).setShape("S", "#", "S").addMaterial('S', slab).addMaterial('#', pillar) - .setOutputCount(2).build(); + GridRecipe.make(name, pedestal) + .setShape("S", "#", "S") + .addMaterial('S', slab) + .addMaterial('#', pillar) + .setOutputCount(2) + .build(); } private static void registerHammer(String name, Item material, Item result) { - GridRecipe.make(name + "_hammer", result).setShape("I I", "I#I", " # ").addMaterial('I', material) - .addMaterial('#', Items.STICK).build(); + GridRecipe.make(name + "_hammer", result) + .setShape("I I", "I#I", " # ") + .addMaterial('I', material) + .addMaterial('#', Items.STICK) + .build(); } } diff --git a/src/main/java/ru/betterend/recipe/EndRecipeManager.java b/src/main/java/ru/betterend/recipe/EndRecipeManager.java index 4a3eb2ca..eef6a87e 100644 --- a/src/main/java/ru/betterend/recipe/EndRecipeManager.java +++ b/src/main/java/ru/betterend/recipe/EndRecipeManager.java @@ -2,14 +2,12 @@ package ru.betterend.recipe; import java.util.Map; import java.util.Map.Entry; - -import com.google.common.collect.Maps; - +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.Registry; +import com.google.common.collect.Maps; import ru.betterend.BetterEnd; public class EndRecipeManager { @@ -23,7 +21,7 @@ public class EndRecipeManager { } list.put(recipe.getId(), recipe); } - + @SuppressWarnings("unchecked") public static > T getRecipe(RecipeType type, ResourceLocation id) { if (RECIPES.containsKey(type)) { @@ -32,8 +30,7 @@ public class EndRecipeManager { return null; } - public static Map, Map>> getMap( - Map, Map>> recipes) { + public static Map, Map>> getMap(Map, Map>> recipes) { Map, Map>> result = Maps.newHashMap(); for (RecipeType type : recipes.keySet()) { @@ -71,6 +68,6 @@ public class EndRecipeManager { public String toString() { return type; } - }); + }); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/recipe/FurnaceRecipes.java b/src/main/java/ru/betterend/recipe/FurnaceRecipes.java index de83076f..50ecab0d 100644 --- a/src/main/java/ru/betterend/recipe/FurnaceRecipes.java +++ b/src/main/java/ru/betterend/recipe/FurnaceRecipes.java @@ -1,7 +1,7 @@ package ru.betterend.recipe; -import net.minecraft.world.level.block.Blocks; import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Blocks; import ru.betterend.recipe.builders.FurnaceRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; @@ -14,8 +14,7 @@ public class FurnaceRecipes { FurnaceRecipe.make("end_fish", EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED).buildFoodlike(); FurnaceRecipe.make("slime_ball", EndBlocks.JELLYSHROOM_CAP_PURPLE, Items.SLIME_BALL).build(); FurnaceRecipe.make("menger_sponge", EndBlocks.MENGER_SPONGE_WET, EndBlocks.MENGER_SPONGE).build(); - FurnaceRecipe.make("chorus_mushroom", EndItems.CHORUS_MUSHROOM_RAW, EndItems.CHORUS_MUSHROOM_COOKED) - .buildFoodlike(); + FurnaceRecipe.make("chorus_mushroom", EndItems.CHORUS_MUSHROOM_RAW, EndItems.CHORUS_MUSHROOM_COOKED).buildFoodlike(); FurnaceRecipe.make("bolux_mushroom", EndBlocks.BOLUX_MUSHROOM, EndItems.BOLUX_MUSHROOM_COOKED).buildFoodlike(); } } diff --git a/src/main/java/ru/betterend/recipe/InfusionRecipes.java b/src/main/java/ru/betterend/recipe/InfusionRecipes.java index 6aba6304..64569b97 100644 --- a/src/main/java/ru/betterend/recipe/InfusionRecipes.java +++ b/src/main/java/ru/betterend/recipe/InfusionRecipes.java @@ -1,268 +1,591 @@ package ru.betterend.recipe; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.item.enchantment.Enchantment; -import net.minecraft.world.item.enchantment.EnchantmentLevelEntry; -import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.item.EnchantedBookItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentInstance; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.block.Blocks; import ru.betterend.recipe.builders.InfusionRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; public class InfusionRecipes { public static void register() { - InfusionRecipe.Builder.create("runed_flavolite").setInput(EndBlocks.FLAVOLITE.polished) - .setOutput(EndBlocks.FLAVOLITE_RUNED).addCatalyst(0, EndItems.CRYSTAL_SHARDS) - .addCatalyst(2, EndItems.CRYSTAL_SHARDS).addCatalyst(4, EndItems.CRYSTAL_SHARDS) - .addCatalyst(6, EndItems.CRYSTAL_SHARDS).setTime(100).build(); + InfusionRecipe.Builder.create("runed_flavolite") + .setInput(EndBlocks.FLAVOLITE.polished) + .setOutput(EndBlocks.FLAVOLITE_RUNED) + .addCatalyst(0, EndItems.CRYSTAL_SHARDS) + .addCatalyst(2, EndItems.CRYSTAL_SHARDS) + .addCatalyst(4, EndItems.CRYSTAL_SHARDS) + .addCatalyst(6, EndItems.CRYSTAL_SHARDS) + .setTime(100) + .build(); + + InfusionRecipe.Builder.create("eternal_crystal") + .setInput(Items.END_CRYSTAL) + .setOutput(EndItems.ETERNAL_CRYSTAL) + .addCatalyst(0, EndItems.CRYSTAL_SHARDS) + .addCatalyst(2, EndItems.CRYSTAL_SHARDS) + .addCatalyst(4, EndItems.CRYSTAL_SHARDS) + .addCatalyst(6, EndItems.CRYSTAL_SHARDS) + .addCatalyst(1, EndItems.ENDER_SHARD) + .addCatalyst(3, EndItems.ENDER_SHARD) + .addCatalyst(5, EndItems.ENDER_SHARD) + .addCatalyst(7, EndItems.ENDER_SHARD) + .setTime(250) + .build(); + + InfusionRecipe.Builder.create("crystalite_helmet") + .setInput(EndBlocks.TERMINITE.helmet) + .setOutput(EndItems.CRYSTALITE_HELMET) + .addCatalyst(0, EndItems.AMBER_GEM) + .addCatalyst(2, EndItems.CRYSTAL_SHARDS) + .addCatalyst(6, EndItems.CRYSTAL_SHARDS) + .setTime(150) + .build(); + InfusionRecipe.Builder.create("crystalite_chestplate") + .setInput(EndBlocks.TERMINITE.chestplate) + .setOutput(EndItems.CRYSTALITE_CHESTPLATE) + .addCatalyst(0, EndItems.AMBER_GEM) + .addCatalyst(1, EndItems.CRYSTAL_SHARDS) + .addCatalyst(3, EndItems.CRYSTAL_SHARDS) + .addCatalyst(5, EndItems.CRYSTAL_SHARDS) + .addCatalyst(7, EndItems.CRYSTAL_SHARDS) + .setTime(300) + .build(); + InfusionRecipe.Builder.create("crystalite_leggings") + .setInput(EndBlocks.TERMINITE.leggings) + .setOutput(EndItems.CRYSTALITE_LEGGINGS) + .addCatalyst(0, EndItems.AMBER_GEM) + .addCatalyst(2, EndItems.CRYSTAL_SHARDS) + .addCatalyst(4, EndItems.CRYSTAL_SHARDS) + .addCatalyst(6, EndItems.CRYSTAL_SHARDS) + .setTime(225) + .build(); + InfusionRecipe.Builder.create("crystalite_boots") + .setInput(EndBlocks.TERMINITE.boots) + .setOutput(EndItems.CRYSTALITE_BOOTS) + .addCatalyst(0, EndItems.AMBER_GEM) + .addCatalyst(2, EndItems.CRYSTAL_SHARDS) + .addCatalyst(6, EndItems.CRYSTAL_SHARDS) + .setTime(150) + .build(); + + InfusionRecipe.Builder.create("enchanted_petal") + .setInput(EndItems.HYDRALUX_PETAL) + .setOutput(EndItems.ENCHANTED_PETAL) + .addCatalyst(0, EndItems.CRYSTAL_SHARDS) + .addCatalyst(2, EndItems.CRYSTAL_SHARDS) + .addCatalyst(4, EndItems.CRYSTAL_SHARDS) + .addCatalyst(6, EndItems.CRYSTAL_SHARDS) + .setTime(75) + .build(); - InfusionRecipe.Builder.create("eternal_crystal").setInput(Items.END_CRYSTAL).setOutput(EndItems.ETERNAL_CRYSTAL) - .addCatalyst(0, EndItems.CRYSTAL_SHARDS).addCatalyst(2, EndItems.CRYSTAL_SHARDS) - .addCatalyst(4, EndItems.CRYSTAL_SHARDS).addCatalyst(6, EndItems.CRYSTAL_SHARDS) - .addCatalyst(1, EndItems.ENDER_SHARD).addCatalyst(3, EndItems.ENDER_SHARD) - .addCatalyst(5, EndItems.ENDER_SHARD).addCatalyst(7, EndItems.ENDER_SHARD).setTime(250).build(); - - InfusionRecipe.Builder.create("crystalite_helmet").setInput(EndBlocks.TERMINITE.helmet) - .setOutput(EndItems.CRYSTALITE_HELMET).addCatalyst(0, EndItems.AMBER_GEM) - .addCatalyst(2, EndItems.CRYSTAL_SHARDS).addCatalyst(6, EndItems.CRYSTAL_SHARDS).setTime(150).build(); - InfusionRecipe.Builder.create("crystalite_chestplate").setInput(EndBlocks.TERMINITE.chestplate) - .setOutput(EndItems.CRYSTALITE_CHESTPLATE).addCatalyst(0, EndItems.AMBER_GEM) - .addCatalyst(1, EndItems.CRYSTAL_SHARDS).addCatalyst(3, EndItems.CRYSTAL_SHARDS) - .addCatalyst(5, EndItems.CRYSTAL_SHARDS).addCatalyst(7, EndItems.CRYSTAL_SHARDS).setTime(300).build(); - InfusionRecipe.Builder.create("crystalite_leggings").setInput(EndBlocks.TERMINITE.leggings) - .setOutput(EndItems.CRYSTALITE_LEGGINGS).addCatalyst(0, EndItems.AMBER_GEM) - .addCatalyst(2, EndItems.CRYSTAL_SHARDS).addCatalyst(4, EndItems.CRYSTAL_SHARDS) - .addCatalyst(6, EndItems.CRYSTAL_SHARDS).setTime(225).build(); - InfusionRecipe.Builder.create("crystalite_boots").setInput(EndBlocks.TERMINITE.boots) - .setOutput(EndItems.CRYSTALITE_BOOTS).addCatalyst(0, EndItems.AMBER_GEM) - .addCatalyst(2, EndItems.CRYSTAL_SHARDS).addCatalyst(6, EndItems.CRYSTAL_SHARDS).setTime(150).build(); - - InfusionRecipe.Builder.create("enchanted_petal").setInput(EndItems.HYDRALUX_PETAL) - .setOutput(EndItems.ENCHANTED_PETAL).addCatalyst(0, EndItems.CRYSTAL_SHARDS) - .addCatalyst(2, EndItems.CRYSTAL_SHARDS).addCatalyst(4, EndItems.CRYSTAL_SHARDS) - .addCatalyst(6, EndItems.CRYSTAL_SHARDS).setTime(75).build(); - - InfusionRecipe.Builder.create("protection_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.PROTECTION, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(4, Items.TURTLE_HELMET).addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); - InfusionRecipe.Builder.create("fire_protection_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.FIRE_PROTECTION, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL).addCatalyst(2, Items.BLAZE_ROD) - .addCatalyst(4, Items.BLAZE_ROD).addCatalyst(6, Items.BLAZE_ROD).addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); - InfusionRecipe.Builder.create("feather_falling_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.FEATHER_FALLING, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL).addCatalyst(2, Items.FEATHER).addCatalyst(4, Items.FEATHER) - .addCatalyst(6, Items.FEATHER).addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") - .setTime(300).build(); - InfusionRecipe.Builder.create("blast_protection_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.BLAST_PROTECTION, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL).addCatalyst(2, Blocks.OBSIDIAN) - .addCatalyst(4, Blocks.OBSIDIAN).addCatalyst(6, Blocks.OBSIDIAN).addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); - InfusionRecipe.Builder.create("projectile_protection_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.PROJECTILE_PROTECTION, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL).addCatalyst(2, Items.SCUTE).addCatalyst(4, Items.SHIELD) - .addCatalyst(6, Items.SCUTE).addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") - .setTime(300).build(); - InfusionRecipe.Builder.create("respiration_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.RESPIRATION, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.NAUTILUS_SHELL).addCatalyst(4, Items.NAUTILUS_SHELL) - .addCatalyst(6, Items.NAUTILUS_SHELL).addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); - InfusionRecipe.Builder.create("aqua_affinity_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.AQUA_AFFINITY, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.PRISMARINE_CRYSTALS).addCatalyst(4, Items.PRISMARINE_CRYSTALS) - .addCatalyst(6, Items.PRISMARINE_CRYSTALS).addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); - InfusionRecipe.Builder.create("thorns_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.THORNS, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Blocks.CACTUS).addCatalyst(4, Blocks.CACTUS).addCatalyst(6, Blocks.CACTUS) - .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") - .setTime(300).build(); - InfusionRecipe.Builder.create("depth_strider_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.DEPTH_STRIDER, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Blocks.LILY_PAD).addCatalyst(4, EndBlocks.END_LILY_SEED).addCatalyst(6, Blocks.LILY_PAD) - .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") - .setTime(300).build(); - InfusionRecipe.Builder.create("frost_walker_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.FROST_WALKER, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(4, EndBlocks.ANCIENT_EMERALD_ICE).addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); - InfusionRecipe.Builder.create("soul_speed_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.SOUL_SPEED, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Blocks.SOUL_SAND, Blocks.SOUL_SOIL).addCatalyst(4, Blocks.SOUL_SAND, Blocks.SOUL_SOIL) - .addCatalyst(6, Blocks.SOUL_SAND, Blocks.SOUL_SOIL).addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); - InfusionRecipe.Builder.create("sharpness_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.SHARPNESS, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(4, Items.NETHERITE_SCRAP).addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); - InfusionRecipe.Builder.create("smite_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.SMITE, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Blocks.SUNFLOWER).addCatalyst(4, Items.GOLD_INGOT).addCatalyst(6, Blocks.SUNFLOWER) - .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") - .setTime(300).build(); - InfusionRecipe.Builder.create("bane_of_arthropods_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.BANE_OF_ARTHROPODS, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL).addCatalyst(2, Items.FERMENTED_SPIDER_EYE) - .addCatalyst(4, Items.IRON_INGOT).addCatalyst(6, Items.FERMENTED_SPIDER_EYE) - .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") - .setTime(300).build(); - InfusionRecipe.Builder.create("knockback_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.KNOCKBACK, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.REDSTONE).addCatalyst(4, Blocks.PISTON).addCatalyst(6, Items.REDSTONE) - .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") - .setTime(300).build(); - InfusionRecipe.Builder.create("fire_aspect_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.FIRE_ASPECT, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.BLAZE_POWDER).addCatalyst(4, Items.MAGMA_CREAM).addCatalyst(6, Items.BLAZE_POWDER) - .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") - .setTime(300).build(); - InfusionRecipe.Builder.create("looting_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.LOOTING, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.EMERALD).addCatalyst(4, Items.GOLD_INGOT).addCatalyst(6, Items.EMERALD) - .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") - .setTime(300).build(); - InfusionRecipe.Builder.create("sweeping_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.SWEEPING, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.GOLDEN_SWORD).addCatalyst(4, Items.IRON_SWORD).addCatalyst(6, Items.GOLDEN_SWORD) - .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") - .setTime(300).build(); - InfusionRecipe.Builder.create("efficiency_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.EFFICIENCY, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, EndItems.AMBER_GEM).addCatalyst(4, EndItems.AMBER_GEM) - .addCatalyst(6, EndItems.AMBER_GEM).addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); - InfusionRecipe.Builder.create("silk_touch_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.SILK_TOUCH, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Blocks.COBWEB).addCatalyst(4, EndItems.ETERNAL_CRYSTAL).addCatalyst(6, Blocks.COBWEB) - .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") - .setTime(375).build(); - InfusionRecipe.Builder.create("unbreaking_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.UNBREAKING, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.DIAMOND).addCatalyst(4, Items.DIAMOND).addCatalyst(6, Items.DIAMOND) - .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") - .setTime(300).build(); - InfusionRecipe.Builder.create("fortune_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.BLOCK_FORTUNE, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.EMERALD).addCatalyst(4, Items.RABBIT_FOOT).addCatalyst(6, Items.EMERALD) - .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") - .setTime(300).build(); - InfusionRecipe.Builder.create("power_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.POWER, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, EndItems.AMBER_GEM).addCatalyst(4, Items.DIAMOND_SWORD) - .addCatalyst(6, EndItems.AMBER_GEM).addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); - InfusionRecipe.Builder.create("punch_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.PUNCH, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.POPPED_CHORUS_FRUIT).addCatalyst(4, Items.SPECTRAL_ARROW) - .addCatalyst(6, Items.POPPED_CHORUS_FRUIT).addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); - InfusionRecipe.Builder.create("flame_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.FLAME, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.BLAZE_POWDER).addCatalyst(4, Items.SPECTRAL_ARROW) - .addCatalyst(6, Items.BLAZE_POWDER).addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); - InfusionRecipe.Builder.create("infinity_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.INFINITY, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.SPECTRAL_ARROW).addCatalyst(4, EndItems.ETERNAL_CRYSTAL) - .addCatalyst(6, Items.SPECTRAL_ARROW).addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(375).build(); - InfusionRecipe.Builder.create("luck_of_sea_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.LUCK_OF_THE_SEA, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL).addCatalyst(2, Items.EMERALD) - .addCatalyst(4, Items.FISHING_ROD).addCatalyst(6, Items.EMERALD).addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); - InfusionRecipe.Builder.create("lure_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.LURE, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.GOLD_NUGGET).addCatalyst(4, Items.FISHING_ROD).addCatalyst(6, Items.GOLD_NUGGET) - .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") - .setTime(300).build(); - InfusionRecipe.Builder.create("loyalty_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.LOYALTY, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.ENDER_EYE).addCatalyst(4, Items.HEART_OF_THE_SEA).addCatalyst(6, Items.ENDER_EYE) - .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") - .setTime(375).build(); - InfusionRecipe.Builder.create("impaling_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.IMPALING, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.PRISMARINE_SHARD).addCatalyst(4, Items.IRON_SWORD) - .addCatalyst(6, Items.PRISMARINE_SHARD).addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); - InfusionRecipe.Builder.create("riptide_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.RIPTIDE, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.LEAD).addCatalyst(4, Items.HEART_OF_THE_SEA).addCatalyst(6, Items.LEAD) - .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") - .setTime(375).build(); - InfusionRecipe.Builder.create("channeling_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.CHANNELING, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.CHAIN).addCatalyst(4, Items.HEART_OF_THE_SEA).addCatalyst(6, Items.CHAIN) - .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") - .setTime(375).build(); - InfusionRecipe.Builder.create("multishot_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.MULTISHOT, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.ARROW).addCatalyst(4, Items.SPECTRAL_ARROW).addCatalyst(6, Items.ARROW) - .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") - .setTime(300).build(); - InfusionRecipe.Builder.create("quick_charge_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.QUICK_CHARGE, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.QUARTZ).addCatalyst(4, Items.GLOWSTONE_DUST).addCatalyst(6, Items.QUARTZ) - .addCatalyst(1, Items.LAPIS_LAZULI).addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI).addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment") - .setTime(300).build(); - InfusionRecipe.Builder.create("piercing_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.PIERCING, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.GLOWSTONE_DUST).addCatalyst(4, Items.SPECTRAL_ARROW) - .addCatalyst(6, Items.GLOWSTONE_DUST).addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(300).build(); - InfusionRecipe.Builder.create("mending_book").setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.MENDING, 1)).addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.EXPERIENCE_BOTTLE).addCatalyst(4, Blocks.ANVIL) - .addCatalyst(6, Items.EXPERIENCE_BOTTLE).addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI).addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI).setGroup("enchantment").setTime(375).build(); + InfusionRecipe.Builder.create("protection_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.ALL_DAMAGE_PROTECTION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(4, Items.TURTLE_HELMET) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("fire_protection_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FIRE_PROTECTION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.BLAZE_ROD) + .addCatalyst(4, Items.BLAZE_ROD) + .addCatalyst(6, Items.BLAZE_ROD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("feather_falling_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FALL_PROTECTION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.FEATHER) + .addCatalyst(4, Items.FEATHER) + .addCatalyst(6, Items.FEATHER) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("blast_protection_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.BLAST_PROTECTION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.OBSIDIAN) + .addCatalyst(4, Blocks.OBSIDIAN) + .addCatalyst(6, Blocks.OBSIDIAN) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("projectile_protection_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.PROJECTILE_PROTECTION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.SCUTE) + .addCatalyst(4, Items.SHIELD) + .addCatalyst(6, Items.SCUTE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("respiration_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.RESPIRATION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.NAUTILUS_SHELL) + .addCatalyst(4, Items.NAUTILUS_SHELL) + .addCatalyst(6, Items.NAUTILUS_SHELL) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("aqua_affinity_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.AQUA_AFFINITY, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.PRISMARINE_CRYSTALS) + .addCatalyst(4, Items.PRISMARINE_CRYSTALS) + .addCatalyst(6, Items.PRISMARINE_CRYSTALS) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("thorns_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.THORNS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.CACTUS) + .addCatalyst(4, Blocks.CACTUS) + .addCatalyst(6, Blocks.CACTUS) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("depth_strider_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.DEPTH_STRIDER, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.LILY_PAD) + .addCatalyst(4, EndBlocks.END_LILY_SEED) + .addCatalyst(6, Blocks.LILY_PAD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("frost_walker_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FROST_WALKER, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(4, EndBlocks.ANCIENT_EMERALD_ICE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("soul_speed_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SOUL_SPEED, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.SOUL_SAND, Blocks.SOUL_SOIL) + .addCatalyst(4, Blocks.SOUL_SAND, Blocks.SOUL_SOIL) + .addCatalyst(6, Blocks.SOUL_SAND, Blocks.SOUL_SOIL) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("sharpness_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SHARPNESS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(4, Items.NETHERITE_SCRAP) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("smite_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SMITE, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.SUNFLOWER) + .addCatalyst(4, Items.GOLD_INGOT) + .addCatalyst(6, Blocks.SUNFLOWER) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("bane_of_arthropods_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.BANE_OF_ARTHROPODS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.FERMENTED_SPIDER_EYE) + .addCatalyst(4, Items.IRON_INGOT) + .addCatalyst(6, Items.FERMENTED_SPIDER_EYE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("knockback_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.KNOCKBACK, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.REDSTONE) + .addCatalyst(4, Blocks.PISTON) + .addCatalyst(6, Items.REDSTONE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("fire_aspect_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FIRE_ASPECT, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.BLAZE_POWDER) + .addCatalyst(4, Items.MAGMA_CREAM) + .addCatalyst(6, Items.BLAZE_POWDER) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("looting_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.MOB_LOOTING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.EMERALD) + .addCatalyst(4, Items.GOLD_INGOT) + .addCatalyst(6, Items.EMERALD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("sweeping_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SWEEPING_EDGE, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.GOLDEN_SWORD) + .addCatalyst(4, Items.IRON_SWORD) + .addCatalyst(6, Items.GOLDEN_SWORD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("efficiency_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.BLOCK_EFFICIENCY, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, EndItems.AMBER_GEM) + .addCatalyst(4, EndItems.AMBER_GEM) + .addCatalyst(6, EndItems.AMBER_GEM) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("silk_touch_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SILK_TOUCH, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.COBWEB) + .addCatalyst(4, EndItems.ETERNAL_CRYSTAL) + .addCatalyst(6, Blocks.COBWEB) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); + InfusionRecipe.Builder.create("unbreaking_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.UNBREAKING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.DIAMOND) + .addCatalyst(4, Items.DIAMOND) + .addCatalyst(6, Items.DIAMOND) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("fortune_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.BLOCK_FORTUNE, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.EMERALD) + .addCatalyst(4, Items.RABBIT_FOOT) + .addCatalyst(6, Items.EMERALD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("power_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.POWER_ARROWS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, EndItems.AMBER_GEM) + .addCatalyst(4, Items.DIAMOND_SWORD) + .addCatalyst(6, EndItems.AMBER_GEM) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("punch_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.PUNCH_ARROWS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.POPPED_CHORUS_FRUIT) + .addCatalyst(4, Items.SPECTRAL_ARROW) + .addCatalyst(6, Items.POPPED_CHORUS_FRUIT) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("flame_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FLAMING_ARROWS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.BLAZE_POWDER) + .addCatalyst(4, Items.SPECTRAL_ARROW) + .addCatalyst(6, Items.BLAZE_POWDER) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("infinity_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.INFINITY_ARROWS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.SPECTRAL_ARROW) + .addCatalyst(4, EndItems.ETERNAL_CRYSTAL) + .addCatalyst(6, Items.SPECTRAL_ARROW) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); + InfusionRecipe.Builder.create("luck_of_sea_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FISHING_LUCK, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.EMERALD) + .addCatalyst(4, Items.FISHING_ROD) + .addCatalyst(6, Items.EMERALD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("lure_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FISHING_SPEED, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.GOLD_NUGGET) + .addCatalyst(4, Items.FISHING_ROD) + .addCatalyst(6, Items.GOLD_NUGGET) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("loyalty_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.LOYALTY, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.ENDER_EYE) + .addCatalyst(4, Items.HEART_OF_THE_SEA) + .addCatalyst(6, Items.ENDER_EYE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); + InfusionRecipe.Builder.create("impaling_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.IMPALING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.PRISMARINE_SHARD) + .addCatalyst(4, Items.IRON_SWORD) + .addCatalyst(6, Items.PRISMARINE_SHARD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("riptide_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.RIPTIDE, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.LEAD) + .addCatalyst(4, Items.HEART_OF_THE_SEA) + .addCatalyst(6, Items.LEAD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); + InfusionRecipe.Builder.create("channeling_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.CHANNELING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.CHAIN) + .addCatalyst(4, Items.HEART_OF_THE_SEA) + .addCatalyst(6, Items.CHAIN) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); + InfusionRecipe.Builder.create("multishot_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.MULTISHOT, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.ARROW) + .addCatalyst(4, Items.SPECTRAL_ARROW) + .addCatalyst(6, Items.ARROW) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("quick_charge_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.QUICK_CHARGE, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.QUARTZ) + .addCatalyst(4, Items.GLOWSTONE_DUST) + .addCatalyst(6, Items.QUARTZ) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("piercing_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.PIERCING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.GLOWSTONE_DUST) + .addCatalyst(4, Items.SPECTRAL_ARROW) + .addCatalyst(6, Items.GLOWSTONE_DUST) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); + InfusionRecipe.Builder.create("mending_book") + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.MENDING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.EXPERIENCE_BOTTLE) + .addCatalyst(4, Blocks.ANVIL) + .addCatalyst(6, Items.EXPERIENCE_BOTTLE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); } - + private static ItemStack createEnchantedBook(Enchantment enchantment, int level) { ItemStack book = new ItemStack(Items.ENCHANTED_BOOK); - EnchantedBookItem.addEnchantment(book, new EnchantmentLevelEntry(enchantment, level)); + EnchantedBookItem.addEnchantment(book, new EnchantmentInstance(enchantment, level)); return book; } } diff --git a/src/main/java/ru/betterend/recipe/SmithingRecipes.java b/src/main/java/ru/betterend/recipe/SmithingRecipes.java index a48ce9f0..0da63634 100644 --- a/src/main/java/ru/betterend/recipe/SmithingRecipes.java +++ b/src/main/java/ru/betterend/recipe/SmithingRecipes.java @@ -6,40 +6,82 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; public class SmithingRecipes { - + public static void register() { - SmithingTableRecipe.create("aeternium_sword_handle").setResult(EndItems.AETERNIUM_SWORD_HANDLE) - .setBase(EndBlocks.TERMINITE.ingot).setAddition(EndItems.LEATHER_WRAPPED_STICK).build(); + SmithingTableRecipe.create("aeternium_sword_handle") + .setResult(EndItems.AETERNIUM_SWORD_HANDLE) + .setBase(EndBlocks.TERMINITE.ingot) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); + + SmithingTableRecipe.create("aeternium_sword") + .setResult(EndItems.AETERNIUM_SWORD) + .setBase(EndItems.AETERNIUM_SWORD_BLADE) + .setAddition(EndItems.AETERNIUM_SWORD_HANDLE) + .build(); + SmithingTableRecipe.create("aeternium_pickaxe") + .setResult(EndItems.AETERNIUM_PICKAXE) + .setBase(EndItems.AETERNIUM_PICKAXE_HEAD) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); + SmithingTableRecipe.create("aeternium_axe") + .setResult(EndItems.AETERNIUM_AXE) + .setBase(EndItems.AETERNIUM_AXE_HEAD) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); + SmithingTableRecipe.create("aeternium_shovel") + .setResult(EndItems.AETERNIUM_SHOVEL) + .setBase(EndItems.AETERNIUM_SHOVEL_HEAD) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); + SmithingTableRecipe.create("aeternium_hoe") + .setResult(EndItems.AETERNIUM_HOE) + .setBase(EndItems.AETERNIUM_HOE_HEAD) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); + SmithingTableRecipe.create("aeternium_hammer") + .setResult(EndItems.AETERNIUM_HAMMER) + .setBase(EndItems.AETERNIUM_HAMMER_HEAD) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); - SmithingTableRecipe.create("aeternium_sword").setResult(EndItems.AETERNIUM_SWORD) - .setBase(EndItems.AETERNIUM_SWORD_BLADE).setAddition(EndItems.AETERNIUM_SWORD_HANDLE).build(); - SmithingTableRecipe.create("aeternium_pickaxe").setResult(EndItems.AETERNIUM_PICKAXE) - .setBase(EndItems.AETERNIUM_PICKAXE_HEAD).setAddition(EndItems.LEATHER_WRAPPED_STICK).build(); - SmithingTableRecipe.create("aeternium_axe").setResult(EndItems.AETERNIUM_AXE) - .setBase(EndItems.AETERNIUM_AXE_HEAD).setAddition(EndItems.LEATHER_WRAPPED_STICK).build(); - SmithingTableRecipe.create("aeternium_shovel").setResult(EndItems.AETERNIUM_SHOVEL) - .setBase(EndItems.AETERNIUM_SHOVEL_HEAD).setAddition(EndItems.LEATHER_WRAPPED_STICK).build(); - SmithingTableRecipe.create("aeternium_hoe").setResult(EndItems.AETERNIUM_HOE) - .setBase(EndItems.AETERNIUM_HOE_HEAD).setAddition(EndItems.LEATHER_WRAPPED_STICK).build(); - SmithingTableRecipe.create("aeternium_hammer").setResult(EndItems.AETERNIUM_HAMMER) - .setBase(EndItems.AETERNIUM_HAMMER_HEAD).setAddition(EndItems.LEATHER_WRAPPED_STICK).build(); - - SmithingTableRecipe.create("netherite_hammer").setResult(EndItems.NETHERITE_HAMMER) - .setBase(EndItems.DIAMOND_HAMMER).setAddition(Items.NETHERITE_INGOT).build(); - - SmithingTableRecipe.create("aeternium_helmet").setResult(EndItems.AETERNIUM_HELMET) - .setBase(EndBlocks.TERMINITE.helmet).setAddition(EndItems.AETERNIUM_INGOT).build(); - SmithingTableRecipe.create("aeternium_chestplate").setResult(EndItems.AETERNIUM_CHESTPLATE) - .setBase(EndBlocks.TERMINITE.chestplate).setAddition(EndItems.AETERNIUM_INGOT).build(); - SmithingTableRecipe.create("aeternium_leggings").setResult(EndItems.AETERNIUM_LEGGINGS) - .setBase(EndBlocks.TERMINITE.leggings).setAddition(EndItems.AETERNIUM_INGOT).build(); - SmithingTableRecipe.create("aeternium_boots").setResult(EndItems.AETERNIUM_BOOTS) - .setBase(EndBlocks.TERMINITE.boots).setAddition(EndItems.AETERNIUM_INGOT).build(); - - SmithingTableRecipe.create("thallasium_anvil_updrade").setResult(EndBlocks.TERMINITE.anvil) - .setBase(EndBlocks.THALLASIUM.anvil).setAddition(EndBlocks.TERMINITE.block).build(); - - SmithingTableRecipe.create("terminite_anvil_updrade").setResult(EndBlocks.AETERNIUM_ANVIL) - .setBase(EndBlocks.TERMINITE.anvil).setAddition(EndBlocks.AETERNIUM_BLOCK).build(); + SmithingTableRecipe.create("netherite_hammer") + .setResult(EndItems.NETHERITE_HAMMER) + .setBase(EndItems.DIAMOND_HAMMER) + .setAddition(Items.NETHERITE_INGOT) + .build(); + + SmithingTableRecipe.create("aeternium_helmet") + .setResult(EndItems.AETERNIUM_HELMET) + .setBase(EndBlocks.TERMINITE.helmet) + .setAddition(EndItems.AETERNIUM_INGOT) + .build(); + SmithingTableRecipe.create("aeternium_chestplate") + .setResult(EndItems.AETERNIUM_CHESTPLATE) + .setBase(EndBlocks.TERMINITE.chestplate) + .setAddition(EndItems.AETERNIUM_INGOT) + .build(); + SmithingTableRecipe.create("aeternium_leggings") + .setResult(EndItems.AETERNIUM_LEGGINGS) + .setBase(EndBlocks.TERMINITE.leggings) + .setAddition(EndItems.AETERNIUM_INGOT) + .build(); + SmithingTableRecipe.create("aeternium_boots") + .setResult(EndItems.AETERNIUM_BOOTS) + .setBase(EndBlocks.TERMINITE.boots) + .setAddition(EndItems.AETERNIUM_INGOT) + .build(); + + SmithingTableRecipe.create("thallasium_anvil_updrade") + .setResult(EndBlocks.TERMINITE.anvil) + .setBase(EndBlocks.THALLASIUM.anvil) + .setAddition(EndBlocks.TERMINITE.block) + .build(); + + SmithingTableRecipe.create("terminite_anvil_updrade") + .setResult(EndBlocks.AETERNIUM_ANVIL) + .setBase(EndBlocks.TERMINITE.anvil) + .setAddition(EndBlocks.AETERNIUM_BLOCK) + .build(); } } diff --git a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java index fc5876a1..465a3ec1 100644 --- a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java @@ -5,19 +5,19 @@ import com.google.gson.JsonObject; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.inventory.Inventory; +import net.minecraft.core.NonNullList; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.Tag; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.Container; import net.minecraft.world.item.Item; -import net.minecraft.world.level.ItemLike; import net.minecraft.world.item.ItemStack; -import net.minecraft.network.PacketByteBuf; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; -import net.minecraft.tags.Tag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.JsonHelper; -import net.minecraft.util.collection.DefaultedList; +import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; @@ -27,13 +27,13 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.util.ItemUtil; import ru.betterend.util.RecipeHelper; -public class AlloyingRecipe implements Recipe, BetterEndRecipe { - +public class AlloyingRecipe implements Recipe, BetterEndRecipe { + public final static String GROUP = "alloying"; public final static RecipeType TYPE = EndRecipeManager.registerType(GROUP); public final static Serializer SERIALIZER = EndRecipeManager.registerSerializer(GROUP, new Serializer()); public final static ResourceLocation ID = BetterEnd.makeID(GROUP); - + protected final RecipeType type; protected final ResourceLocation id; protected final Ingredient primaryInput; @@ -42,9 +42,8 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { protected final String group; protected final float experience; protected final int smeltTime; - - public AlloyingRecipe(ResourceLocation id, String group, Ingredient primaryInput, Ingredient secondaryInput, - ItemStack output, float experience, int smeltTime) { + + public AlloyingRecipe(ResourceLocation id, String group, Ingredient primaryInput, Ingredient secondaryInput, ItemStack output, float experience, int smeltTime) { this.group = group; this.id = id; this.primaryInput = primaryInput; @@ -54,42 +53,42 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { this.smeltTime = smeltTime; this.type = TYPE; } - + public float getExperience() { return this.experience; } - + public int getSmeltTime() { return this.smeltTime; } @Override - public DefaultedList getPreviewInputs() { - DefaultedList defaultedList = DefaultedList.of(); + public NonNullList getIngredients() { + NonNullList defaultedList = NonNullList.create(); defaultedList.add(primaryInput); defaultedList.add(secondaryInput); - + return defaultedList; } @Override - public boolean matches(Inventory inv, Level world) { - return this.primaryInput.test(inv.getStack(0)) && this.secondaryInput.test(inv.getStack(1)) - || this.primaryInput.test(inv.getStack(1)) && this.secondaryInput.test(inv.getStack(0)); + public boolean matches(Container inv, Level world) { + return this.primaryInput.test(inv.getItem(0)) && this.secondaryInput.test(inv.getItem(1)) || + this.primaryInput.test(inv.getItem(1)) && this.secondaryInput.test(inv.getItem(0)); } @Override - public ItemStack craft(Inventory inv) { + public ItemStack assemble(Container inv) { return this.output.copy(); } @Override - public boolean fits(int width, int height) { + public boolean canCraftInDimensions(int width, int height) { return true; } @Override - public ItemStack getOutput() { + public ItemStack getResultItem() { return this.output; } @@ -107,22 +106,22 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { public RecipeType getType() { return this.type; } - + @Override @Environment(EnvType.CLIENT) public String getGroup() { return this.group; } - + @Environment(EnvType.CLIENT) - public ItemStack getRecipeKindIcon() { + public ItemStack getToastSymbol() { return new ItemStack(EndBlocks.END_STONE_SMELTER); } - + public static class Builder { private final static Builder INSTANCE = new Builder(); private static boolean exist; - + public static Builder create(ResourceLocation id) { INSTANCE.id = id; INSTANCE.group = String.format("%s_%s", GROUP, id); @@ -132,14 +131,14 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { INSTANCE.experience = 0.0F; INSTANCE.smeltTime = 350; exist = Configs.RECIPE_CONFIG.getBoolean("alloying", id.getPath(), true); - + return INSTANCE; } - + public static Builder create(String id) { return create(BetterEnd.makeID(id)); } - + private ResourceLocation id; private Ingredient primaryInput; private Ingredient secondaryInput; @@ -148,15 +147,14 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { private float experience; private int smeltTime; private boolean alright = true; - - private Builder() { - } - + + private Builder() {} + public Builder setGroup(String group) { this.group = group; return this; } - + public Builder setPrimaryInput(ItemLike... inputs) { for (ItemLike item : inputs) { this.alright &= RecipeHelper.exists(item); @@ -164,7 +162,7 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { this.primaryInput = Ingredient.of(inputs); return this; } - + public Builder setSecondaryInput(ItemLike... inputs) { for (ItemLike item : inputs) { this.alright &= RecipeHelper.exists(item); @@ -172,58 +170,56 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { this.secondaryInput = Ingredient.of(inputs); return this; } - + public Builder setPrimaryInput(Tag input) { - this.primaryInput = Ingredient.fromTag(input); + this.primaryInput = Ingredient.of(input); return this; } - + public Builder setSecondaryInput(Tag input) { - this.secondaryInput = Ingredient.fromTag(input); + this.secondaryInput = Ingredient.of(input); return this; } - + public Builder setInput(ItemLike primaryInput, ItemLike secondaryInput) { this.setPrimaryInput(primaryInput); this.setSecondaryInput(secondaryInput); return this; } - + public Builder setInput(Tag primaryInput, Tag secondaryInput) { this.setPrimaryInput(primaryInput); this.setSecondaryInput(secondaryInput); return this; } - + public Builder setOutput(ItemLike output, int amount) { this.alright &= RecipeHelper.exists(output); this.output = new ItemStack(output, amount); return this; } - + public Builder setExpiriense(float amount) { this.experience = amount; return this; } - + public Builder setSmeltTime(int time) { this.smeltTime = time; return this; } - + public void build() { if (exist) { if (primaryInput == null) { - BetterEnd.LOGGER.warning( - "Primary input for Alloying recipe can't be 'null', recipe {} will be ignored!", id); + BetterEnd.LOGGER.warning("Primary input for Alloying recipe can't be 'null', recipe {} will be ignored!", id); return; } - if (secondaryInput == null) { - BetterEnd.LOGGER.warning("Secondary input for Alloying can't be 'null', recipe {} will be ignored!", - id); + if(secondaryInput == null) { + BetterEnd.LOGGER.warning("Secondary input for Alloying can't be 'null', recipe {} will be ignored!", id); return; } - if (output == null) { + if(output == null) { BetterEnd.LOGGER.warning("Output for Alloying can't be 'null', recipe {} will be ignored!", id); return; } @@ -235,48 +231,47 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { BetterEnd.LOGGER.debug("Can't add Alloying recipe {}! Ingeredient or output not exists.", id); return; } - EndRecipeManager.addRecipe(TYPE, - new AlloyingRecipe(id, group, primaryInput, secondaryInput, output, experience, smeltTime)); + EndRecipeManager.addRecipe(TYPE, new AlloyingRecipe(id, group, primaryInput, secondaryInput, output, experience, smeltTime)); } } } - + public static class Serializer implements RecipeSerializer { @Override - public AlloyingRecipe read(ResourceLocation id, JsonObject json) { - JsonArray ingredients = JsonHelper.getArray(json, "ingredients"); + public AlloyingRecipe fromJson(ResourceLocation id, JsonObject json) { + JsonArray ingredients = GsonHelper.getAsJsonArray(json, "ingredients"); Ingredient primaryInput = Ingredient.fromJson(ingredients.get(0)); Ingredient secondaryInput = Ingredient.fromJson(ingredients.get(1)); - String group = JsonHelper.getString(json, "group", ""); - JsonObject result = JsonHelper.getObject(json, "result"); + String group = GsonHelper.getAsString(json, "group", ""); + JsonObject result = GsonHelper.getAsJsonObject(json, "result"); ItemStack output = ItemUtil.fromJsonRecipe(result); if (output == null) { throw new IllegalStateException("Output item does not exists!"); } - float experience = JsonHelper.getFloat(json, "experience", 0.0F); - int smeltTime = JsonHelper.getInt(json, "smelttime", 350); - + float experience = GsonHelper.getAsFloat(json, "experience", 0.0F); + int smeltTime = GsonHelper.getAsInt(json, "smelttime", 350); + return new AlloyingRecipe(id, group, primaryInput, secondaryInput, output, experience, smeltTime); } @Override - public AlloyingRecipe read(ResourceLocation id, PacketByteBuf packetBuffer) { - String group = packetBuffer.readString(32767); - Ingredient primary = Ingredient.fromPacket(packetBuffer); - Ingredient secondary = Ingredient.fromPacket(packetBuffer); - ItemStack output = packetBuffer.readItemStack(); + public AlloyingRecipe fromNetwork(ResourceLocation id, FriendlyByteBuf packetBuffer) { + String group = packetBuffer.readUtf(32767); + Ingredient primary = Ingredient.fromNetwork(packetBuffer); + Ingredient secondary = Ingredient.fromNetwork(packetBuffer); + ItemStack output = packetBuffer.readItem(); float experience = packetBuffer.readFloat(); int smeltTime = packetBuffer.readVarInt(); - + return new AlloyingRecipe(id, group, primary, secondary, output, experience, smeltTime); } @Override - public void write(PacketByteBuf packetBuffer, AlloyingRecipe recipe) { - packetBuffer.writeString(recipe.group); - recipe.primaryInput.write(packetBuffer); - recipe.secondaryInput.write(packetBuffer); - packetBuffer.writeItemStack(recipe.output); + public void toNetwork(FriendlyByteBuf packetBuffer, AlloyingRecipe recipe) { + packetBuffer.writeUtf(recipe.group); + recipe.primaryInput.toNetwork(packetBuffer); + recipe.secondaryInput.toNetwork(packetBuffer); + packetBuffer.writeItem(recipe.output); packetBuffer.writeFloat(recipe.experience); packetBuffer.writeVarInt(recipe.smeltTime); } diff --git a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java index 498d55f5..5feda8ab 100644 --- a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java @@ -6,21 +6,22 @@ import com.google.gson.JsonObject; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.core.NonNullList; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.Tag; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.Container; +import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; -import net.minecraft.inventory.Inventory; import net.minecraft.world.item.Item; -import net.minecraft.world.level.ItemLike; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TieredItem; -import net.minecraft.network.PacketByteBuf; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; -import net.minecraft.tags.Tag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.JsonHelper; -import net.minecraft.util.collection.DefaultedList; +import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; @@ -30,13 +31,13 @@ import ru.betterend.registry.EndTags; import ru.betterend.util.ItemUtil; import ru.betterend.util.RecipeHelper; -public class AnvilRecipe implements Recipe, BetterEndRecipe { - +public class AnvilRecipe implements Recipe, BetterEndRecipe { + public final static String GROUP = "smithing"; public final static RecipeType TYPE = EndRecipeManager.registerType(GROUP); public final static Serializer SERIALIZER = EndRecipeManager.registerSerializer(GROUP, new Serializer()); public final static ResourceLocation ID = BetterEnd.makeID(GROUP); - + private final ResourceLocation id; private final Ingredient input; private final ItemStack output; @@ -44,9 +45,8 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { private final int toolLevel; private final int anvilLevel; private final int inputCount; - - public AnvilRecipe(ResourceLocation identifier, Ingredient input, ItemStack output, int inputCount, int toolLevel, - int anvilLevel, int damage) { + + public AnvilRecipe(ResourceLocation identifier, Ingredient input, ItemStack output, int inputCount, int toolLevel, int anvilLevel, int damage) { this.id = identifier; this.input = input; this.output = output; @@ -62,50 +62,50 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { } @Override - public ItemStack getOutput() { + public ItemStack getResultItem() { return this.output; } - + @Override - public boolean matches(Inventory craftingInventory, Level world) { + public boolean matches(Container craftingInventory, Level world) { return this.matches(craftingInventory); } - + @Override - public ItemStack craft(Inventory craftingInventory) { + public ItemStack assemble(Container craftingInventory) { return this.output.copy(); } - - public ItemStack craft(Inventory craftingInventory, Player player) { + + public ItemStack craft(Container craftingInventory, Player player) { if (!player.isCreative()) { - if (!checkHammerDurability(craftingInventory, player)) - return ItemStack.EMPTY; - ItemStack hammer = craftingInventory.getStack(1); - hammer.damage(this.damage, player, entity -> entity.sendEquipmentBreakStatus(null)); + if (!checkHammerDurability(craftingInventory, player)) return ItemStack.EMPTY; + ItemStack hammer = craftingInventory.getItem(1); + hammer.hurtAndBreak(this.damage, player, entity -> + entity.broadcastBreakEvent((InteractionHand) null)); } - return this.craft(craftingInventory); + return this.assemble(craftingInventory); } - public boolean checkHammerDurability(Inventory craftingInventory, Player player) { - if (player.isCreative()) - return true; - ItemStack hammer = craftingInventory.getStack(1); - int damage = hammer.getDamage() + this.damage; + public boolean checkHammerDurability(Container craftingInventory, Player player) { + if (player.isCreative()) return true; + ItemStack hammer = craftingInventory.getItem(1); + int damage = hammer.getDamageValue() + this.damage; return damage < hammer.getMaxDamage(); } - - public boolean matches(Inventory craftingInventory) { - ItemStack hammer = craftingInventory.getStack(1); + + public boolean matches(Container craftingInventory) { + ItemStack hammer = craftingInventory.getItem(1); if (hammer.isEmpty() || !EndTags.HAMMERS.contains(hammer.getItem())) { return false; } - ItemStack material = craftingInventory.getStack(0); + ItemStack material = craftingInventory.getItem(0); int materialCount = material.getCount(); int level = ((TieredItem) hammer.getItem()).getTier().getLevel(); - return this.input.test(craftingInventory.getStack(0)) && materialCount >= this.inputCount - && level >= this.toolLevel; + return this.input.test(craftingInventory.getItem(0)) && + materialCount >= this.inputCount && + level >= this.toolLevel; } - + public int getDamage() { return this.damage; } @@ -119,18 +119,18 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { } @Override - public DefaultedList getPreviewInputs() { - DefaultedList defaultedList = DefaultedList.of(); - defaultedList.add(Ingredient.ofStacks(EndTags.HAMMERS.values().stream() - .filter(hammer -> ((TieredItem) hammer).getTier().getLevel() >= toolLevel).map(ItemStack::new))); + public NonNullList getIngredients() { + NonNullList defaultedList = NonNullList.create(); + defaultedList.add(Ingredient.of(EndTags.HAMMERS.getValues().stream().filter(hammer -> + ((TieredItem) hammer).getTier().getLevel() >= toolLevel).map(ItemStack::new))); defaultedList.add(input); - + return defaultedList; } @Override @Environment(EnvType.CLIENT) - public boolean fits(int width, int height) { + public boolean canCraftInDimensions(int width, int height) { return true; } @@ -143,21 +143,18 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { public RecipeType getType() { return TYPE; } - + @Override - public boolean isIgnoredInRecipeBook() { + public boolean isSpecial() { return true; } @Override public boolean equals(Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; AnvilRecipe that = (AnvilRecipe) o; - return damage == that.damage && toolLevel == that.toolLevel && id.equals(that.id) && input.equals(that.input) - && output.equals(that.output); + return damage == that.damage && toolLevel == that.toolLevel && id.equals(that.id) && input.equals(that.input) && output.equals(that.output); } @Override @@ -172,11 +169,11 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { public static class Builder { private final static Builder INSTANCE = new Builder(); - + public static Builder create(String id) { return create(BetterEnd.makeID(id)); } - + public static Builder create(ResourceLocation id) { INSTANCE.id = id; INSTANCE.input = null; @@ -186,10 +183,10 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { INSTANCE.anvilLevel = 1; INSTANCE.damage = 1; INSTANCE.alright = true; - + return INSTANCE; } - + private ResourceLocation id; private Ingredient input; private ItemStack output; @@ -198,21 +195,20 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { private int anvilLevel = 1; private int damage = 1; private boolean alright; - - private Builder() { - } - + + private Builder() {} + public Builder setInput(ItemLike... inputItems) { this.alright &= RecipeHelper.exists(inputItems); this.setInput(Ingredient.of(inputItems)); return this; } - + public Builder setInput(Tag inputTag) { - this.setInput(Ingredient.fromTag(inputTag)); + this.setInput(Ingredient.of(inputTag)); return this; } - + public Builder setInput(Ingredient ingredient) { this.input = ingredient; return this; @@ -222,17 +218,17 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { this.inputCount = count; return this; } - + public Builder setOutput(ItemLike output) { return this.setOutput(output, 1); } - + public Builder setOutput(ItemLike output, int amount) { this.alright &= RecipeHelper.exists(output); this.output = new ItemStack(output, amount); return this; } - + public Builder setToolLevel(int level) { this.toolLevel = level; return this; @@ -242,19 +238,19 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { this.anvilLevel = level; return this; } - + public Builder setDamage(int damage) { this.damage = damage; return this; } - + public void build() { if (Configs.RECIPE_CONFIG.getBoolean("anvil", id.getPath(), true)) { if (input == null) { BetterEnd.LOGGER.warning("Input for Anvil recipe can't be 'null', recipe {} will be ignored!", id); return; } - if (output == null) { + if(output == null) { BetterEnd.LOGGER.warning("Output for Anvil recipe can't be 'null', recipe {} will be ignored!", id); return; } @@ -266,45 +262,44 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { BetterEnd.LOGGER.debug("Can't add Anvil recipe {}! Ingeredient or output not exists.", id); return; } - EndRecipeManager.addRecipe(TYPE, - new AnvilRecipe(id, input, output, inputCount, toolLevel, anvilLevel, damage)); + EndRecipeManager.addRecipe(TYPE, new AnvilRecipe(id, input, output, inputCount, toolLevel, anvilLevel, damage)); } } } public static class Serializer implements RecipeSerializer { @Override - public AnvilRecipe read(ResourceLocation id, JsonObject json) { + public AnvilRecipe fromJson(ResourceLocation id, JsonObject json) { Ingredient input = Ingredient.fromJson(json.get("input")); - JsonObject result = JsonHelper.getObject(json, "result"); + JsonObject result = GsonHelper.getAsJsonObject(json, "result"); ItemStack output = ItemUtil.fromJsonRecipe(result); if (output == null) { throw new IllegalStateException("Output item does not exists!"); } - int inputCount = JsonHelper.getInt(json, "inputCount", 1); - int toolLevel = JsonHelper.getInt(json, "toolLevel", 1); - int anvilLevel = JsonHelper.getInt(json, "anvilLevel", 1); - int damage = JsonHelper.getInt(json, "damage", 1); - + int inputCount = GsonHelper.getAsInt(json, "inputCount", 1); + int toolLevel = GsonHelper.getAsInt(json, "toolLevel", 1); + int anvilLevel = GsonHelper.getAsInt(json, "anvilLevel", 1); + int damage = GsonHelper.getAsInt(json, "damage", 1); + return new AnvilRecipe(id, input, output, inputCount, toolLevel, anvilLevel, damage); } @Override - public AnvilRecipe read(ResourceLocation id, PacketByteBuf packetBuffer) { - Ingredient input = Ingredient.fromPacket(packetBuffer); - ItemStack output = packetBuffer.readItemStack(); + public AnvilRecipe fromNetwork(ResourceLocation id, FriendlyByteBuf packetBuffer) { + Ingredient input = Ingredient.fromNetwork(packetBuffer); + ItemStack output = packetBuffer.readItem(); int inputCount = packetBuffer.readVarInt(); int toolLevel = packetBuffer.readVarInt(); int anvilLevel = packetBuffer.readVarInt(); int damage = packetBuffer.readVarInt(); - + return new AnvilRecipe(id, input, output, inputCount, toolLevel, anvilLevel, damage); } @Override - public void write(PacketByteBuf packetBuffer, AnvilRecipe recipe) { - recipe.input.write(packetBuffer); - packetBuffer.writeItemStack(recipe.output); + public void toNetwork(FriendlyByteBuf packetBuffer, AnvilRecipe recipe) { + recipe.input.toNetwork(packetBuffer); + packetBuffer.writeItem(recipe.output); packetBuffer.writeVarInt(recipe.inputCount); packetBuffer.writeVarInt(recipe.toolLevel); packetBuffer.writeVarInt(recipe.anvilLevel); diff --git a/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java b/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java index 928a533e..ea441729 100644 --- a/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/FurnaceRecipe.java @@ -1,6 +1,6 @@ package ru.betterend.recipe.builders; -import net.minecraft.world.level.ItemLike; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.BlastingRecipe; import net.minecraft.world.item.crafting.CampfireCookingRecipe; @@ -8,7 +8,7 @@ import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.crafting.SmeltingRecipe; import net.minecraft.world.item.crafting.SmokingRecipe; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.ItemLike; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; import ru.betterend.recipe.EndRecipeManager; @@ -16,7 +16,7 @@ import ru.betterend.util.RecipeHelper; public class FurnaceRecipe { private static final FurnaceRecipe INSTANCE = new FurnaceRecipe(); - + private ItemLike input; private ItemLike output; private boolean exist; @@ -25,10 +25,9 @@ public class FurnaceRecipe { private int count; private int time; private float xp; - - private FurnaceRecipe() { - } - + + private FurnaceRecipe() {} + public static FurnaceRecipe make(String name, ItemLike input, ItemLike output) { INSTANCE.name = name; INSTANCE.group = ""; @@ -37,68 +36,64 @@ public class FurnaceRecipe { INSTANCE.count = 1; INSTANCE.time = 200; INSTANCE.xp = 0; - INSTANCE.exist = Configs.RECIPE_CONFIG.getBoolean("furnace", name, true) && RecipeHelper.exists(output) - && RecipeHelper.exists(input); + INSTANCE.exist = Configs.RECIPE_CONFIG.getBoolean("furnace", name, true) && RecipeHelper.exists(output) && RecipeHelper.exists(input); return INSTANCE; } - + public FurnaceRecipe setGroup(String group) { this.group = group; return this; } - + public FurnaceRecipe setOutputCount(int count) { this.count = count; return this; } - + public FurnaceRecipe setXP(float xp) { this.xp = xp; return this; } - + public FurnaceRecipe setCookTime(int time) { this.time = time; return this; } - + public void build() { build(false, false, false); } - + public void buildWithBlasting() { build(true, false, false); } - + public void buildFoodlike() { build(false, true, true); } - + public void build(boolean blasting, boolean campfire, boolean smoker) { if (exist) { ResourceLocation id = BetterEnd.makeID(name); - SmeltingRecipe recipe = new SmeltingRecipe(id, group, Ingredient.of(input), new ItemStack(output, count), - xp, time); + SmeltingRecipe recipe = new SmeltingRecipe(id, group, Ingredient.of(input), new ItemStack(output, count), xp, time); EndRecipeManager.addRecipe(RecipeType.SMELTING, recipe); - + if (blasting) { - BlastingRecipe recipe2 = new BlastingRecipe(id, group, Ingredient.of(input), - new ItemStack(output, count), xp, time / 2); + BlastingRecipe recipe2 = new BlastingRecipe(id, group, Ingredient.of(input), new ItemStack(output, count), xp, time / 2); EndRecipeManager.addRecipe(RecipeType.BLASTING, recipe2); } - + if (campfire) { - CampfireCookingRecipe recipe2 = new CampfireCookingRecipe(id, group, Ingredient.of(input), - new ItemStack(output, count), xp, time * 3); + CampfireCookingRecipe recipe2 = new CampfireCookingRecipe(id, group, Ingredient.of(input), new ItemStack(output, count), xp, time * 3); EndRecipeManager.addRecipe(RecipeType.CAMPFIRE_COOKING, recipe2); } - + if (smoker) { - SmokingRecipe recipe2 = new SmokingRecipe(id, group, Ingredient.of(input), new ItemStack(output, count), - xp, time / 2); + SmokingRecipe recipe2 = new SmokingRecipe(id, group, Ingredient.of(input), new ItemStack(output, count), xp, time / 2); EndRecipeManager.addRecipe(RecipeType.SMOKING, recipe2); } - } else { + } + else { BetterEnd.LOGGER.debug("Furnace recipe {} couldn't be added", name); } } diff --git a/src/main/java/ru/betterend/recipe/builders/GridRecipe.java b/src/main/java/ru/betterend/recipe/builders/GridRecipe.java index d3991074..b8ec3625 100644 --- a/src/main/java/ru/betterend/recipe/builders/GridRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/GridRecipe.java @@ -2,20 +2,18 @@ package ru.betterend.recipe.builders; import java.util.Arrays; import java.util.Map; - -import com.google.common.collect.Maps; - +import net.minecraft.core.NonNullList; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.Tag; import net.minecraft.world.item.Item; -import net.minecraft.world.level.ItemLike; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.CraftingRecipe; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.crafting.ShapedRecipe; import net.minecraft.world.item.crafting.ShapelessRecipe; -import net.minecraft.tags.Tag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.collection.DefaultedList; +import net.minecraft.world.level.ItemLike; +import com.google.common.collect.Maps; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; import ru.betterend.recipe.EndRecipeManager; @@ -23,10 +21,10 @@ import ru.betterend.util.RecipeHelper; public class GridRecipe { private static final GridRecipe INSTANCE = new GridRecipe(); - + private String name; private ItemLike output; - + private String group; private RecipeType type; private boolean shaped; @@ -34,23 +32,22 @@ public class GridRecipe { private Map materialKeys = Maps.newHashMap(); private int count; private boolean exist = true; - - private GridRecipe() { - } - + + private GridRecipe() {} + public static GridRecipe make(String name, ItemLike output) { INSTANCE.name = name; INSTANCE.output = output; - + INSTANCE.group = ""; INSTANCE.type = RecipeType.CRAFTING; INSTANCE.shaped = true; - INSTANCE.shape = new String[] { "#" }; + INSTANCE.shape = new String[] {"#"}; INSTANCE.materialKeys.clear(); INSTANCE.count = 1; - + INSTANCE.exist = Configs.RECIPE_CONFIG.getBoolean("grid", name, true) && RecipeHelper.exists(output); - + return INSTANCE; } @@ -58,66 +55,65 @@ public class GridRecipe { this.group = group; return this; } - + public GridRecipe setShape(String... shape) { this.shape = shape; return this; } - + public GridRecipe setList(String shape) { this.shape = new String[] { shape }; this.shaped = false; return this; } - + public GridRecipe addMaterial(char key, Tag value) { - return addMaterial(key, Ingredient.fromTag(value)); + return addMaterial(key, Ingredient.of(value)); } - + public GridRecipe addMaterial(char key, ItemStack... value) { - return addMaterial(key, Ingredient.ofStacks(Arrays.stream(value))); + return addMaterial(key, Ingredient.of(Arrays.stream(value))); } - + public GridRecipe addMaterial(char key, ItemLike... values) { - for (ItemLike item : values) { + for (ItemLike item: values) { exist &= RecipeHelper.exists(item); } return addMaterial(key, Ingredient.of(values)); } - + private GridRecipe addMaterial(char key, Ingredient value) { materialKeys.put(key, value); return this; } - + public GridRecipe setOutputCount(int count) { this.count = count; return this; } - - private DefaultedList getMaterials(int width, int height) { - DefaultedList materials = DefaultedList.ofSize(width * height, Ingredient.EMPTY); + + private NonNullList getMaterials(int width, int height) { + NonNullList materials = NonNullList.withSize(width * height, Ingredient.EMPTY); int pos = 0; - for (String line : shape) { + for (String line: shape) { for (int i = 0; i < width; i++) { char c = line.charAt(i); Ingredient material = materialKeys.get(c); - materials.set(pos++, material == null ? Ingredient.EMPTY : material); + materials.set(pos ++, material == null ? Ingredient.EMPTY : material); } } return materials; } - + public void build() { if (exist) { int height = shape.length; int width = shape[0].length(); ItemStack result = new ItemStack(output, count); ResourceLocation id = BetterEnd.makeID(name); - DefaultedList materials = this.getMaterials(width, height); - - CraftingRecipe recipe = shaped ? new ShapedRecipe(id, group, width, height, materials, result) - : new ShapelessRecipe(id, group, result, materials); + NonNullList materials = this.getMaterials(width, height); + + CraftingRecipe recipe = shaped ? new ShapedRecipe(id, group, width, height, materials, result) : new ShapelessRecipe(id, group, result, materials); EndRecipeManager.addRecipe(type, recipe); } else { BetterEnd.LOGGER.debug("Recipe {} couldn't be added", name); diff --git a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java index 8864b200..df7e7bfd 100644 --- a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java @@ -6,16 +6,16 @@ import com.google.gson.JsonObject; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.world.level.ItemLike; +import net.minecraft.core.NonNullList; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; import net.minecraft.world.item.ItemStack; -import net.minecraft.network.PacketByteBuf; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.JsonHelper; -import net.minecraft.util.collection.DefaultedList; +import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; @@ -25,67 +25,65 @@ import ru.betterend.rituals.InfusionRitual; import ru.betterend.util.ItemUtil; public class InfusionRecipe implements Recipe, BetterEndRecipe { - + public final static String GROUP = "infusion"; public final static RecipeType TYPE = EndRecipeManager.registerType(GROUP); public final static Serializer SERIALIZER = EndRecipeManager.registerSerializer(GROUP, new Serializer()); public final static ResourceLocation ID = BetterEnd.makeID(GROUP); - + private final ResourceLocation id; + private final Ingredient[] catalysts; private Ingredient input; private ItemStack output; private int time = 1; - private Ingredient[] catalysts = new Ingredient[8]; private String group; - + private InfusionRecipe(ResourceLocation id) { this(id, null, null); } - + private InfusionRecipe(ResourceLocation id, Ingredient input, ItemStack output) { this.id = id; this.input = input; this.output = output; + this.catalysts = new Ingredient[8]; Arrays.fill(catalysts, Ingredient.EMPTY); } - + public int getInfusionTime() { return this.time; } @Override public boolean matches(InfusionRitual inv, Level world) { - boolean valid = this.input.test(inv.getStack(0)); - if (!valid) - return false; + boolean valid = this.input.test(inv.getItem(0)); + if (!valid) return false; for (int i = 0; i < 8; i++) { - valid &= this.catalysts[i].test(inv.getStack(i + 1)); + valid &= this.catalysts[i].test(inv.getItem(i + 1)); } return valid; } @Override - public ItemStack craft(InfusionRitual ritual) { + public ItemStack assemble(InfusionRitual ritual) { return this.output.copy(); } @Override - public boolean fits(int width, int height) { + public boolean canCraftInDimensions(int width, int height) { return true; } - + @Override - public DefaultedList getPreviewInputs() { - DefaultedList defaultedList = DefaultedList.of(); + public NonNullList getIngredients() { + NonNullList defaultedList = NonNullList.create(); defaultedList.add(input); - for (Ingredient catalyst : catalysts) { - defaultedList.add(catalyst); - } + defaultedList.addAll(Arrays.asList(catalysts)); return defaultedList; } @Override - public ItemStack getOutput() { + public ItemStack getResultItem() { return this.output; } @@ -93,7 +91,7 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { public ResourceLocation getId() { return this.id; } - + @Override @Environment(EnvType.CLIENT) public String getGroup() { @@ -109,82 +107,79 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { public RecipeType getType() { return TYPE; } - + public static class Builder { private final static Builder INSTANCE = new Builder(); private static boolean exist; - + public static Builder create(String id) { return create(BetterEnd.makeID(id)); } - + public static Builder create(ResourceLocation id) { INSTANCE.id = id; INSTANCE.input = null; INSTANCE.output = null; INSTANCE.time = 1; exist = Configs.RECIPE_CONFIG.getBoolean("infusion", id.getPath(), true); - + Arrays.fill(INSTANCE.catalysts, Ingredient.EMPTY); - + return INSTANCE; } - + private ResourceLocation id; private Ingredient input; private ItemStack output; private String group; private int time = 1; private Ingredient[] catalysts = new Ingredient[8]; - + private Builder() { Arrays.fill(catalysts, Ingredient.EMPTY); } - + public Builder setGroup(String group) { this.group = group; return this; } - + public Builder setInput(ItemLike input) { this.input = Ingredient.of(input); return this; } - + public Builder setOutput(ItemLike output) { this.output = new ItemStack(output); this.output.setCount(1); return this; } - + public Builder setOutput(ItemStack output) { this.output = output; this.output.setCount(1); return this; } - + public Builder setTime(int time) { this.time = time; return this; } - + public Builder addCatalyst(int slot, ItemLike... items) { - if (slot > 7) - return this; + if (slot > 7) return this; this.catalysts[slot] = Ingredient.of(items); return this; } - + public void build() { if (exist) { if (input == null) { - BetterEnd.LOGGER.warning("Input for Infusion recipe can't be 'null', recipe {} will be ignored!", - id); + BetterEnd.LOGGER.warning("Input for Infusion recipe can't be 'null', recipe {} will be ignored!", id); return; } if (output == null) { - BetterEnd.LOGGER.warning("Output for Infusion recipe can't be 'null', recipe {} will be ignored!", - id); + BetterEnd.LOGGER.warning("Output for Infusion recipe can't be 'null', recipe {} will be ignored!", id); return; } InfusionRecipe recipe = new InfusionRecipe(id, input, output); @@ -192,10 +187,8 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { recipe.time = time; int empty = 0; for (int i = 0; i < catalysts.length; i++) { - if (catalysts[i].isEmpty()) - empty++; - else - recipe.catalysts[i] = catalysts[i]; + if (catalysts[i].isEmpty()) empty++; + else recipe.catalysts[i] = catalysts[i]; } if (empty == catalysts.length) { BetterEnd.LOGGER.warning("At least one catalyst must be non empty, recipe {} will be ignored!", id); @@ -205,62 +198,62 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { } } } - + public static class Serializer implements RecipeSerializer { @Override - public InfusionRecipe read(ResourceLocation id, JsonObject json) { + public InfusionRecipe fromJson(ResourceLocation id, JsonObject json) { InfusionRecipe recipe = new InfusionRecipe(id); recipe.input = Ingredient.fromJson(json.get("input")); - JsonObject result = JsonHelper.getObject(json, "result"); + JsonObject result = GsonHelper.getAsJsonObject(json, "result"); recipe.output = ItemUtil.fromJsonRecipe(result); if (recipe.output == null) { throw new IllegalStateException("Output item does not exists!"); } - recipe.group = JsonHelper.getString(json, "group", GROUP); - recipe.time = JsonHelper.getInt(json, "time", 1); - - JsonObject catalysts = JsonHelper.asObject(json, "catalysts"); - ItemStack catalyst = ItemUtil.fromStackString(JsonHelper.getString(catalysts, "north", "")); - recipe.catalysts[0] = Ingredient.ofStacks(Arrays.stream(new ItemStack[] { catalyst })); - catalyst = ItemUtil.fromStackString(JsonHelper.getString(catalysts, "north_east", "")); - recipe.catalysts[1] = Ingredient.ofStacks(Arrays.stream(new ItemStack[] { catalyst })); - catalyst = ItemUtil.fromStackString(JsonHelper.getString(catalysts, "east", "")); - recipe.catalysts[2] = Ingredient.ofStacks(Arrays.stream(new ItemStack[] { catalyst })); - catalyst = ItemUtil.fromStackString(JsonHelper.getString(catalysts, "south_east", "")); - recipe.catalysts[3] = Ingredient.ofStacks(Arrays.stream(new ItemStack[] { catalyst })); - catalyst = ItemUtil.fromStackString(JsonHelper.getString(catalysts, "south", "")); - recipe.catalysts[4] = Ingredient.ofStacks(Arrays.stream(new ItemStack[] { catalyst })); - catalyst = ItemUtil.fromStackString(JsonHelper.getString(catalysts, "south_west", "")); - recipe.catalysts[5] = Ingredient.ofStacks(Arrays.stream(new ItemStack[] { catalyst })); - catalyst = ItemUtil.fromStackString(JsonHelper.getString(catalysts, "west", "")); - recipe.catalysts[6] = Ingredient.ofStacks(Arrays.stream(new ItemStack[] { catalyst })); - catalyst = ItemUtil.fromStackString(JsonHelper.getString(catalysts, "north_west", "")); - recipe.catalysts[7] = Ingredient.ofStacks(Arrays.stream(new ItemStack[] { catalyst })); - + recipe.group = GsonHelper.getAsString(json, "group", GROUP); + recipe.time = GsonHelper.getAsInt(json, "time", 1); + + JsonObject catalysts = GsonHelper.convertToJsonObject(json, "catalysts"); + ItemStack catalyst = ItemUtil.fromStackString(GsonHelper.getAsString(catalysts, "north", "")); + recipe.catalysts[0] = Ingredient.of(Arrays.stream(new ItemStack[] { catalyst })); + catalyst = ItemUtil.fromStackString(GsonHelper.getAsString(catalysts, "north_east", "")); + recipe.catalysts[1] = Ingredient.of(Arrays.stream(new ItemStack[] { catalyst })); + catalyst = ItemUtil.fromStackString(GsonHelper.getAsString(catalysts, "east", "")); + recipe.catalysts[2] = Ingredient.of(Arrays.stream(new ItemStack[] { catalyst })); + catalyst = ItemUtil.fromStackString(GsonHelper.getAsString(catalysts, "south_east", "")); + recipe.catalysts[3] = Ingredient.of(Arrays.stream(new ItemStack[] { catalyst })); + catalyst = ItemUtil.fromStackString(GsonHelper.getAsString(catalysts, "south", "")); + recipe.catalysts[4] = Ingredient.of(Arrays.stream(new ItemStack[] { catalyst })); + catalyst = ItemUtil.fromStackString(GsonHelper.getAsString(catalysts, "south_west", "")); + recipe.catalysts[5] = Ingredient.of(Arrays.stream(new ItemStack[] { catalyst })); + catalyst = ItemUtil.fromStackString(GsonHelper.getAsString(catalysts, "west", "")); + recipe.catalysts[6] = Ingredient.of(Arrays.stream(new ItemStack[] { catalyst })); + catalyst = ItemUtil.fromStackString(GsonHelper.getAsString(catalysts, "north_west", "")); + recipe.catalysts[7] = Ingredient.of(Arrays.stream(new ItemStack[] { catalyst })); + return recipe; } @Override - public InfusionRecipe read(ResourceLocation id, PacketByteBuf buffer) { + public InfusionRecipe fromNetwork(ResourceLocation id, FriendlyByteBuf buffer) { InfusionRecipe recipe = new InfusionRecipe(id); - recipe.input = Ingredient.fromPacket(buffer); - recipe.output = buffer.readItemStack(); - recipe.group = buffer.readString(); + recipe.input = Ingredient.fromNetwork(buffer); + recipe.output = buffer.readItem(); + recipe.group = buffer.readUtf(); recipe.time = buffer.readVarInt(); for (int i = 0; i < 8; i++) { - recipe.catalysts[i] = Ingredient.fromPacket(buffer); + recipe.catalysts[i] = Ingredient.fromNetwork(buffer); } return recipe; } @Override - public void write(PacketByteBuf buffer, InfusionRecipe recipe) { - recipe.input.write(buffer); - buffer.writeItemStack(recipe.output); - buffer.writeString(recipe.group); + public void toNetwork(FriendlyByteBuf buffer, InfusionRecipe recipe) { + recipe.input.toNetwork(buffer); + buffer.writeItem(recipe.output); + buffer.writeUtf(recipe.group); buffer.writeVarInt(recipe.time); for (int i = 0; i < 8; i++) { - recipe.catalysts[i].write(buffer); + recipe.catalysts[i].toNetwork(buffer); } } } diff --git a/src/main/java/ru/betterend/recipe/builders/SmithingTableRecipe.java b/src/main/java/ru/betterend/recipe/builders/SmithingTableRecipe.java index bed7b508..b48d55f6 100644 --- a/src/main/java/ru/betterend/recipe/builders/SmithingTableRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/SmithingTableRecipe.java @@ -1,91 +1,88 @@ package ru.betterend.recipe.builders; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.Tag; import net.minecraft.world.item.Item; -import net.minecraft.world.level.ItemLike; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.RecipeType; -import net.minecraft.world.item.crafting.SmithingRecipe; -import net.minecraft.tags.Tag; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.UpgradeRecipe; +import net.minecraft.world.level.ItemLike; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; import ru.betterend.recipe.EndRecipeManager; import ru.betterend.util.RecipeHelper; public class SmithingTableRecipe { - + private final static SmithingTableRecipe BUILDER = new SmithingTableRecipe(); - private final static RecipeType TYPE = RecipeType.SMITHING; - + private final static RecipeType TYPE = RecipeType.SMITHING; + public static SmithingTableRecipe create(String name) { return create(BetterEnd.makeID(name)); } - + public static SmithingTableRecipe create(ResourceLocation id) { BUILDER.id = id; BUILDER.base = null; BUILDER.addition = null; BUILDER.result = null; BUILDER.alright = true; - + return BUILDER; } - + private ResourceLocation id; private Ingredient base; private Ingredient addition; private ItemStack result; private boolean alright; - - private SmithingTableRecipe() { - } - + + private SmithingTableRecipe() {} + public SmithingTableRecipe setResult(ItemLike item) { return this.setResult(item, 1); } - + public SmithingTableRecipe setResult(ItemLike item, int count) { this.alright &= RecipeHelper.exists(item); this.result = new ItemStack(item, count); return this; } - + public SmithingTableRecipe setBase(ItemLike... items) { this.alright &= RecipeHelper.exists(items); this.base = Ingredient.of(items); return this; } - + public SmithingTableRecipe setBase(Tag tag) { - this.base = (Ingredient.fromTag(tag)); + this.base = (Ingredient.of(tag)); return this; } - + public SmithingTableRecipe setAddition(ItemLike... items) { this.alright &= RecipeHelper.exists(items); this.addition = Ingredient.of(items); return this; } - + public SmithingTableRecipe setAddition(Tag tag) { - this.addition = (Ingredient.fromTag(tag)); + this.addition = (Ingredient.of(tag)); return this; } - + public void build() { if (Configs.RECIPE_CONFIG.getBoolean("smithing", id.getPath(), true)) { if (base == null) { - BetterEnd.LOGGER.warning("Base input for Smithing recipe can't be 'null', recipe {} will be ignored!", - id); + BetterEnd.LOGGER.warning("Base input for Smithing recipe can't be 'null', recipe {} will be ignored!", id); return; } if (addition == null) { - BetterEnd.LOGGER - .warning("Addition input for Smithing recipe can't be 'null', recipe {} will be ignored!", id); + BetterEnd.LOGGER.warning("Addition input for Smithing recipe can't be 'null', recipe {} will be ignored!", id); return; } - if (result == null) { + if(result == null) { BetterEnd.LOGGER.warning("Result for Smithing recipe can't be 'null', recipe {} will be ignored!", id); return; } @@ -97,7 +94,7 @@ public class SmithingTableRecipe { BetterEnd.LOGGER.debug("Can't add Smithing recipe {}! Ingeredients or output not exists.", id); return; } - EndRecipeManager.addRecipe(TYPE, new SmithingRecipe(id, base, addition, result)); + EndRecipeManager.addRecipe(TYPE, new UpgradeRecipe(id, base, addition, result)); } } } diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index 9526810c..78107877 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -19,12 +19,13 @@ import net.fabricmc.api.Environment; import net.fabricmc.fabric.impl.biome.InternalBiomeData; import net.fabricmc.fabric.impl.biome.WeightedBiomePicker; import net.minecraft.client.Minecraft; +import net.minecraft.core.Registry; import net.minecraft.data.BuiltinRegistries; import net.minecraft.resources.ResourceKey; -import net.minecraft.server.MinecraftServer; import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.Registry; +import net.minecraft.server.MinecraftServer; import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Biome.BiomeCategory; import net.minecraft.world.level.biome.Biomes; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; @@ -64,24 +65,24 @@ public class EndBiomes { private static final HashMap CLIENT = Maps.newHashMap(); public static final Set FABRIC_VOID = Sets.newHashSet(); private static final Set SUBBIOMES_UNMUTABLES = Sets.newHashSet(); - + public static final BiomePicker LAND_BIOMES = new BiomePicker(); public static final BiomePicker VOID_BIOMES = new BiomePicker(); public static final BiomePicker CAVE_BIOMES = new BiomePicker(); public static final List SUBBIOMES = Lists.newArrayList(); private static final JsonObject EMPTY_JSON = new JsonObject(); - + private static Registry biomeRegistry; - + // Vanilla Land public static final EndBiome END = registerBiome(Biomes.THE_END, BiomeType.LAND, 1F); public static final EndBiome END_MIDLANDS = registerSubBiome(Biomes.END_MIDLANDS, END, 0.5F); public static final EndBiome END_HIGHLANDS = registerSubBiome(Biomes.END_HIGHLANDS, END, 0.5F); - + // Vanilla Void public static final EndBiome END_BARRENS = registerBiome(Biomes.END_BARRENS, BiomeType.VOID, 1F); public static final EndBiome SMALL_END_ISLANDS = registerBiome(Biomes.SMALL_END_ISLANDS, BiomeType.VOID, 1); - + // Better End Land public static final EndBiome FOGGY_MUSHROOMLAND = registerBiome(new FoggyMushroomlandBiome(), BiomeType.LAND); public static final EndBiome CHORUS_FOREST = registerBiome(new ChorusForestBiome(), BiomeType.LAND); @@ -100,39 +101,37 @@ public class EndBiomes { public static final EndBiome DRY_SHRUBLAND = registerBiome(new DryShrublandBiome(), BiomeType.LAND); public static final EndBiome LANTERN_WOODS = registerBiome(new LanternWoodsBiome(), BiomeType.LAND); public static final EndBiome NEON_OASIS = registerSubBiome(new NeonOasisBiome(), DUST_WASTELANDS); - + // Better End Void public static final EndBiome ICE_STARFIELD = registerBiome(new BiomeIceStarfield(), BiomeType.VOID); - + // Better End Caves public static final EndCaveBiome EMPTY_END_CAVE = registerCaveBiome(new EmptyEndCaveBiome()); public static final EndCaveBiome EMPTY_SMARAGDANT_CAVE = registerCaveBiome(new EmptySmaragdantCaveBiome()); public static final EndCaveBiome LUSH_SMARAGDANT_CAVE = registerCaveBiome(new LushSmaragdantCaveBiome()); public static final EndCaveBiome EMPTY_AURORA_CAVE = registerCaveBiome(new EmptyAuroraCaveBiome()); public static final EndCaveBiome LUSH_AURORA_CAVE = registerCaveBiome(new LushAuroraCaveBiome()); - - public static void register() { - } - + + public static void register() {} + public static void mutateRegistry(Registry biomeRegistry) { EndBiomes.biomeRegistry = biomeRegistry; - + LAND_BIOMES.clearMutables(); VOID_BIOMES.clearMutables(); CAVE_BIOMES.clearMutables(); - + if (FABRIC_VOID.isEmpty()) { loadFabricAPIBiomes(); } - + Map configs = Maps.newHashMap(); - + biomeRegistry.forEach((biome) -> { - if (biome.getBiomeCategory() == Biome.BiomeCategory.THEEND) { + if (biome.getBiomeCategory() == BiomeCategory.THEEND) { ResourceLocation id = biomeRegistry.getKey(biome); if (Configs.BIOME_CONFIG.getBoolean(id, "enabled", true)) { - if (!LAND_BIOMES.containsImmutable(id) && !VOID_BIOMES.containsImmutable(id) - && !SUBBIOMES_UNMUTABLES.contains(id)) { + if (!LAND_BIOMES.containsImmutable(id) && !VOID_BIOMES.containsImmutable(id) && !SUBBIOMES_UNMUTABLES.contains(id)) { JsonObject config = configs.get(id.getNamespace()); if (config == null) { config = loadJsonConfig(id.getNamespace()); @@ -153,7 +152,8 @@ public class EndBiomes { if (isVoid) { VOID_BIOMES.addBiomeMutable(endBiome); - } else { + } + else { LAND_BIOMES.addBiomeMutable(endBiome); } ID_MAP.put(id, endBiome); @@ -163,58 +163,58 @@ public class EndBiomes { }); Integrations.addBiomes(); Configs.BIOME_CONFIG.saveChanges(); - + rebuildPicker(LAND_BIOMES, biomeRegistry); rebuildPicker(VOID_BIOMES, biomeRegistry); rebuildPicker(CAVE_BIOMES, biomeRegistry); - + SUBBIOMES.forEach((endBiome) -> { endBiome.updateActualBiomes(biomeRegistry); }); - + CLIENT.clear(); } - + private static void rebuildPicker(BiomePicker picker, Registry biomeRegistry) { picker.rebuild(); picker.getBiomes().forEach((endBiome) -> { endBiome.updateActualBiomes(biomeRegistry); }); } - + private static void loadFabricAPIBiomes() { List> biomes = Lists.newArrayList(); biomes.addAll(getBiomes(InternalBiomeData.getEndBiomesMap().get(Biomes.SMALL_END_ISLANDS))); biomes.addAll(getBiomes(InternalBiomeData.getEndBarrensMap().get(Biomes.END_BARRENS))); biomes.forEach((key) -> FABRIC_VOID.add(key.location())); - + if (BetterEnd.isDevEnvironment()) { System.out.println("=================================="); System.out.println("Added void biomes from Fabric API:"); - FABRIC_VOID.forEach(System.out::println); + FABRIC_VOID.forEach((id) -> { + System.out.println(id); + }); System.out.println("=================================="); } } - + private static List> getBiomes(WeightedBiomePicker picker) { IBiomeList biomeList = (IBiomeList) (Object) picker; return biomeList == null ? Collections.emptyList() : biomeList.getBiomes(); } - + private static JsonObject loadJsonConfig(String namespace) { - InputStream inputstream = EndBiomes.class - .getResourceAsStream("/data/" + namespace + "/end_biome_properties.json"); + InputStream inputstream = EndBiomes.class.getResourceAsStream("/data/" + namespace + "/end_biome_properties.json"); if (inputstream != null) { return JsonFactory.getJsonObject(inputstream); - } else { + } + else { return EMPTY_JSON; } } - + /** - * Initialize registry if it was not initialized in world generation (when using - * mods/datapacks, that overrides the End generation) - * + * Initialize registry if it was not initialized in world generation (when using mods/datapacks, that overrides the End generation) * @param server - {@link MinecraftServer} */ public static void initRegistry(MinecraftServer server) { @@ -222,28 +222,24 @@ public class EndBiomes { biomeRegistry = server.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY); } } - + /** - * Registers new {@link EndBiome} and adds it to picker, can be used to add - * existing mod biomes into the End. - * - * @param biome - {@link Biome} instance - * @param type - {@link BiomeType} + * Registers new {@link EndBiome} and adds it to picker, can be used to add existing mod biomes into the End. + * @param biome - {@link Biome} instance + * @param type - {@link BiomeType} * @param genChance - generation chance [0.0F - Infinity] * @return registered {@link EndBiome} */ public static EndBiome registerBiome(Biome biome, BiomeType type, float genChance) { return registerBiome(biome, type, 1, genChance); } - + /** - * Registers new {@link EndBiome} and adds it to picker, can be used to add - * existing mod biomes into the End. - * - * @param biome - {@link Biome} instance - * @param type - {@link BiomeType} + * Registers new {@link EndBiome} and adds it to picker, can be used to add existing mod biomes into the End. + * @param biome - {@link Biome} instance + * @param type - {@link BiomeType} * @param fogDensity - density of fog (def: 1F) [0.0F - Infinity] - * @param genChance - generation chance [0.0F - Infinity] + * @param genChance - generation chance [0.0F - Infinity] * @return registered {@link EndBiome} */ public static EndBiome registerBiome(Biome biome, BiomeType type, float fogDensity, float genChance) { @@ -253,32 +249,27 @@ public class EndBiomes { } return endBiome; } - + /** - * Registers new {@link EndBiome} from existed {@link Biome} and put as a - * sub-biome into selected parent. - * - * @param biome - {@link Biome} instance - * @param parent - {@link EndBiome} to be linked with + * Registers new {@link EndBiome} from existed {@link Biome} and put as a sub-biome into selected parent. + * @param biome - {@link Biome} instance + * @param parent - {@link EndBiome} to be linked with * @param genChance - generation chance [0.0F - Infinity] * @return registered {@link EndBiome} */ public static EndBiome registerSubBiome(Biome biome, EndBiome parent, float genChance, boolean hasCaves) { return registerSubBiome(biome, parent, 1, genChance, hasCaves); } - + /** - * Registers new {@link EndBiome} from existed {@link Biome} and put as a - * sub-biome into selected parent. - * - * @param biome - {@link Biome} instance - * @param parent - {@link EndBiome} to be linked with + * Registers new {@link EndBiome} from existed {@link Biome} and put as a sub-biome into selected parent. + * @param biome - {@link Biome} instance + * @param parent - {@link EndBiome} to be linked with * @param fogDensity - density of fog (def: 1F) [0.0F - Infinity] - * @param genChance - generation chance [0.0F - Infinity] + * @param genChance - generation chance [0.0F - Infinity] * @return registered {@link EndBiome} */ - public static EndBiome registerSubBiome(Biome biome, EndBiome parent, float fogDensity, float genChance, - boolean hasCaves) { + public static EndBiome registerSubBiome(Biome biome, EndBiome parent, float fogDensity, float genChance, boolean hasCaves) { EndBiome endBiome = new EndBiome(BuiltinRegistries.BIOME.getKey(biome), biome, fogDensity, genChance, hasCaves); if (Configs.BIOME_CONFIG.getBoolean(endBiome.getID(), "enabled", true)) { parent.addSubBiome(endBiome); @@ -288,11 +279,10 @@ public class EndBiomes { } return endBiome; } - + /** * Put existing {@link EndBiome} as a sub-biome into selected parent. - * - * @param biome - {@link EndBiome} instance + * @param biome - {@link EndBiome} instance * @param parent - {@link EndBiome} to be linked with * @return registered {@link EndBiome} */ @@ -307,12 +297,11 @@ public class EndBiomes { } return biome; } - + /** * Registers {@link EndBiome} and adds it into worldgen. - * * @param biome - {@link EndBiome} instance - * @param type - {@link BiomeType} + * @param type - {@link BiomeType} * @return registered {@link EndBiome} */ public static EndBiome registerBiome(EndBiome biome, BiomeType type) { @@ -322,17 +311,16 @@ public class EndBiomes { ID_MAP.put(biome.getID(), biome); if (type == BiomeType.LAND) { addLandBiomeToFabricApi(biome); - } else { + } + else { addVoidBiomeToFabricApi(biome); } } return biome; } - + /** - * Put integration sub-biome {@link EndBiome} into subbiomes list and registers - * it. - * + * Put integration sub-biome {@link EndBiome} into subbiomes list and registers it. * @param biome - {@link EndBiome} instance * @return registered {@link EndBiome} */ @@ -346,11 +334,10 @@ public class EndBiomes { } return biome; } - + /** * Link integration sub-biome with parent. - * - * @param biome - {@link EndBiome} instance + * @param biome - {@link EndBiome} instance * @param parent - {@link ResourceLocation} parent id */ public static void addSubBiomeIntegration(EndBiome biome, ResourceLocation parent) { @@ -361,19 +348,20 @@ public class EndBiomes { } } } - + public static EndBiome registerBiome(ResourceKey key, BiomeType type, float genChance) { return registerBiome(BuiltinRegistries.BIOME.get(key), type, genChance); } - + public static EndBiome registerSubBiome(ResourceKey key, EndBiome parent, float genChance) { return registerSubBiome(BuiltinRegistries.BIOME.get(key), parent, genChance, true); } - + private static void addToPicker(EndBiome biome, BiomeType type) { if (type == BiomeType.LAND) { LAND_BIOMES.addBiome(biome); - } else { + } + else { VOID_BIOMES.addBiome(biome); } } @@ -381,37 +369,36 @@ public class EndBiomes { private static void registerBiomeDirectly(EndBiome biome) { Registry.register(BuiltinRegistries.BIOME, biome.getID(), biome.getBiome()); } - + private static void addLandBiomeToFabricApi(EndBiome biome) { float weight = biome.getGenChanceImmutable(); ResourceKey key = BuiltinRegistries.BIOME.getResourceKey(biome.getBiome()).get(); InternalBiomeData.addEndBiomeReplacement(Biomes.END_HIGHLANDS, key, weight); InternalBiomeData.addEndBiomeReplacement(Biomes.END_MIDLANDS, key, weight); } - + private static void addVoidBiomeToFabricApi(EndBiome biome) { float weight = biome.getGenChanceImmutable(); ResourceKey key = BuiltinRegistries.BIOME.getResourceKey(biome.getBiome()).get(); InternalBiomeData.addEndBiomeReplacement(Biomes.SMALL_END_ISLANDS, key, weight); } - + public static EndBiome getFromBiome(Biome biome) { - return ID_MAP.getOrDefault(biomeRegistry.getId(biome), END); + return ID_MAP.getOrDefault(biomeRegistry.getKey(biome), END); } - + @Environment(EnvType.CLIENT) public static EndBiome getRenderBiome(Biome biome) { EndBiome endBiome = CLIENT.get(biome); if (endBiome == null) { Minecraft minecraft = Minecraft.getInstance(); - ResourceLocation id = minecraft.level.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY) - .getKey(biome); + ResourceLocation id = minecraft.level.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY).getKey(biome); endBiome = id == null ? END : ID_MAP.getOrDefault(id, END); CLIENT.put(biome, endBiome); } return endBiome; } - + public static ResourceLocation getBiomeID(Biome biome) { ResourceLocation id = biomeRegistry.getKey(biome); return id == null ? END.getID() : id; @@ -429,7 +416,7 @@ public class EndBiomes { result.addAll(SUBBIOMES); return result; } - + public static EndCaveBiome registerCaveBiome(EndCaveBiome biome) { if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { registerBiomeDirectly(biome); @@ -438,11 +425,11 @@ public class EndBiomes { } return biome; } - + public static EndCaveBiome getCaveBiome(Random random) { return (EndCaveBiome) CAVE_BIOMES.getBiome(random); } - + public static boolean hasBiome(ResourceLocation biomeID) { return ID_MAP.containsKey(biomeID); } diff --git a/src/main/java/ru/betterend/registry/EndBlockEntities.java b/src/main/java/ru/betterend/registry/EndBlockEntities.java index 96116a09..e722dc94 100644 --- a/src/main/java/ru/betterend/registry/EndBlockEntities.java +++ b/src/main/java/ru/betterend/registry/EndBlockEntities.java @@ -1,14 +1,12 @@ package ru.betterend.registry; import java.util.List; - -import com.google.common.collect.Lists; - +import net.minecraft.core.Registry; +import net.minecraft.world.item.BlockItem; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.item.BlockItem; -import net.minecraft.core.Registry; +import com.google.common.collect.Lists; import ru.betterend.BetterEnd; import ru.betterend.blocks.EndStoneSmelter; import ru.betterend.blocks.EternalPedestal; @@ -29,35 +27,30 @@ import ru.betterend.blocks.entities.InfusionPedestalEntity; import ru.betterend.blocks.entities.PedestalBlockEntity; public class EndBlockEntities { - public final static BlockEntityType END_STONE_SMELTER = registerBlockEntity( - EndStoneSmelter.ID, - BlockEntityType.Builder.create(EndStoneSmelterBlockEntity::new, EndBlocks.END_STONE_SMELTER)); + public final static BlockEntityType END_STONE_SMELTER = registerBlockEntity(EndStoneSmelter.ID, + BlockEntityType.Builder.of(EndStoneSmelterBlockEntity::new, EndBlocks.END_STONE_SMELTER)); public final static BlockEntityType PEDESTAL = registerBlockEntity("pedestal", - BlockEntityType.Builder.create(PedestalBlockEntity::new, getPedestals())); - public final static BlockEntityType ETERNAL_PEDESTAL = registerBlockEntity( - "eternal_pedestal", BlockEntityType.Builder.create(EternalPedestalEntity::new, EndBlocks.ETERNAL_PEDESTAL)); - public final static BlockEntityType INFUSION_PEDESTAL = registerBlockEntity( - "infusion_pedestal", - BlockEntityType.Builder.create(InfusionPedestalEntity::new, EndBlocks.INFUSION_PEDESTAL)); - public static final BlockEntityType CHEST = registerBlockEntity("chest", - BlockEntityType.Builder.create(EChestBlockEntity::new, getChests())); + BlockEntityType.Builder.of(PedestalBlockEntity::new, getPedestals())); + public final static BlockEntityType ETERNAL_PEDESTAL = registerBlockEntity("eternal_pedestal", + BlockEntityType.Builder.of(EternalPedestalEntity::new, EndBlocks.ETERNAL_PEDESTAL)); + public final static BlockEntityType INFUSION_PEDESTAL = registerBlockEntity("infusion_pedestal", + BlockEntityType.Builder.of(InfusionPedestalEntity::new, EndBlocks.INFUSION_PEDESTAL)); + public static final BlockEntityType CHEST = registerBlockEntity("chest", + BlockEntityType.Builder.of(EChestBlockEntity::new, getChests())); public static final BlockEntityType BARREL = registerBlockEntity("barrel", - BlockEntityType.Builder.create(EBarrelBlockEntity::new, getBarrels())); + BlockEntityType.Builder.of(EBarrelBlockEntity::new, getBarrels())); public static final BlockEntityType SIGN = registerBlockEntity("sign", - BlockEntityType.Builder.create(ESignBlockEntity::new, getSigns())); - public final static BlockEntityType HYDROTHERMAL_VENT = registerBlockEntity( - "hydrother_malvent", - BlockEntityType.Builder.create(BlockEntityHydrothermalVent::new, EndBlocks.HYDROTHERMAL_VENT)); + BlockEntityType.Builder.of(ESignBlockEntity::new, getSigns())); + public final static BlockEntityType HYDROTHERMAL_VENT = registerBlockEntity("hydrother_malvent", + BlockEntityType.Builder.of(BlockEntityHydrothermalVent::new, EndBlocks.HYDROTHERMAL_VENT)); public static final BlockEntityType FURNACE = registerBlockEntity("furnace", - BlockEntityType.Builder.create(EFurnaceBlockEntity::new, getFurnaces())); + BlockEntityType.Builder.of(EFurnaceBlockEntity::new, getFurnaces())); - public static BlockEntityType registerBlockEntity(String id, - BlockEntityType.Builder builder) { + public static BlockEntityType registerBlockEntity(String id, BlockEntityType.Builder builder) { return Registry.register(Registry.BLOCK_ENTITY_TYPE, BetterEnd.makeID(id), builder.build(null)); } - - public static void register() { - } + + public static void register() {} static Block[] getChests() { List result = Lists.newArrayList(); @@ -71,7 +64,7 @@ public class EndBlockEntities { }); return result.toArray(new Block[] {}); } - + static Block[] getBarrels() { List result = Lists.newArrayList(); EndItems.getModBlocks().forEach((item) -> { @@ -84,7 +77,7 @@ public class EndBlockEntities { }); return result.toArray(new Block[] {}); } - + static Block[] getSigns() { List result = Lists.newArrayList(); EndItems.getModBlocks().forEach((item) -> { @@ -97,14 +90,14 @@ public class EndBlockEntities { }); return result.toArray(new Block[] {}); } - + static Block[] getPedestals() { List result = Lists.newArrayList(); EndItems.getModBlocks().forEach((item) -> { if (item instanceof BlockItem) { Block block = ((BlockItem) item).getBlock(); - if (block instanceof EternalPedestal || block instanceof InfusionPedestal) - return; + if (block instanceof EternalPedestal || + block instanceof InfusionPedestal) return; if (block instanceof PedestalBlock) { result.add(block); } @@ -112,7 +105,7 @@ public class EndBlockEntities { }); return result.toArray(new Block[] {}); } - + static Block[] getFurnaces() { List result = Lists.newArrayList(); EndItems.getModBlocks().forEach((item) -> { diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index b21a480a..c1ca660f 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -1,13 +1,13 @@ package ru.betterend.registry; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item.Properties; +import net.minecraft.world.item.WaterLilyBlockItem; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.MaterialColor; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.Item.Properties; -import net.minecraft.world.item.LilyPadItem; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.Registry; import ru.betterend.BetterEnd; import ru.betterend.blocks.*; import ru.betterend.blocks.basis.EndCropBlock; @@ -39,23 +39,18 @@ import ru.betterend.item.material.EndToolMaterial; public class EndBlocks { // Terrain // public static final Block ENDSTONE_DUST = registerBlock("endstone_dust", new EndstoneDustBlock()); - public static final Block END_MYCELIUM = registerBlock("end_mycelium", - new EndTerrainBlock(MaterialColor.COLOR_LIGHT_BLUE)); + public static final Block END_MYCELIUM = registerBlock("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 CHORUS_NYLIUM = registerBlock("chorus_nylium", - new EndTerrainBlock(MaterialColor.COLOR_MAGENTA)); - public static final Block CAVE_MOSS = registerBlock("cave_moss", - new TripleTerrainBlock(MaterialColor.COLOR_PURPLE)); - public static final Block CRYSTAL_MOSS = registerBlock("crystal_moss", - new EndTerrainBlock(MaterialColor.COLOR_PINK)); + public static final Block CHORUS_NYLIUM = registerBlock("chorus_nylium", new EndTerrainBlock(MaterialColor.COLOR_MAGENTA)); + public static final Block CAVE_MOSS = registerBlock("cave_moss", new TripleTerrainBlock(MaterialColor.COLOR_PURPLE)); + public static final Block CRYSTAL_MOSS = registerBlock("crystal_moss", new EndTerrainBlock(MaterialColor.COLOR_PINK)); 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)); + public static final Block JUNGLE_MOSS = registerBlock("jungle_moss", new EndTerrainBlock(MaterialColor.COLOR_GREEN)); public static final Block SANGNUM = registerBlock("sangnum", new EndTerrainBlock(MaterialColor.COLOR_RED)); public static final Block RUTISCUS = registerBlock("rutiscus", new EndTerrainBlock(MaterialColor.COLOR_ORANGE)); - + // Roads // public static final Block END_MYCELIUM_PATH = registerBlock("end_mycelium_path", new EndPathBlock(END_MYCELIUM)); public static final Block END_MOSS_PATH = registerBlock("end_moss_path", new EndPathBlock(END_MOSS)); @@ -68,130 +63,93 @@ public class EndBlocks { public static final Block JUNGLE_MOSS_PATH = registerBlock("jungle_moss_path", new EndPathBlock(JUNGLE_MOSS)); public static final Block SANGNUM_PATH = registerBlock("sangnum_path", new EndPathBlock(SANGNUM)); public static final Block RUTISCUS_PATH = registerBlock("rutiscus_path", new EndPathBlock(RUTISCUS)); - + public static final Block MOSSY_OBSIDIAN = registerBlock("mossy_obsidian", new MossyObsidian()); - public static final Block DRAGON_BONE_BLOCK = registerBlock("dragon_bone_block", - new EndPillarBlock(Blocks.BONE_BLOCK)); - public static final Block DRAGON_BONE_STAIRS = registerBlock("dragon_bone_stairs", - new EndStairsBlock(DRAGON_BONE_BLOCK)); + public static final Block DRAGON_BONE_BLOCK = registerBlock("dragon_bone_block", new EndPillarBlock(Blocks.BONE_BLOCK)); + public static final Block DRAGON_BONE_STAIRS = registerBlock("dragon_bone_stairs", new EndStairsBlock(DRAGON_BONE_BLOCK)); public static final Block DRAGON_BONE_SLAB = registerBlock("dragon_bone_slab", new EndSlabBlock(DRAGON_BONE_BLOCK)); public static final Block MOSSY_DRAGON_BONE = registerBlock("mossy_dragon_bone", new MossyDragonBoneBlock()); - + // Rocks // public static final StoneMaterial FLAVOLITE = new StoneMaterial("flavolite", MaterialColor.SAND); public static final StoneMaterial VIOLECITE = new StoneMaterial("violecite", MaterialColor.COLOR_PURPLE); public static final StoneMaterial SULPHURIC_ROCK = new StoneMaterial("sulphuric_rock", MaterialColor.COLOR_BROWN); public static final StoneMaterial VIRID_jADESTONE = new StoneMaterial("virid_jadestone", MaterialColor.COLOR_GREEN); - public static final StoneMaterial AZURE_jADESTONE = new StoneMaterial("azure_jadestone", - MaterialColor.COLOR_LIGHT_BLUE); - public static final StoneMaterial SANDY_jADESTONE = new StoneMaterial("sandy_jadestone", - MaterialColor.COLOR_YELLOW); + public static final StoneMaterial AZURE_jADESTONE = new StoneMaterial("azure_jadestone", MaterialColor.COLOR_LIGHT_BLUE); + public static final StoneMaterial SANDY_jADESTONE = new StoneMaterial("sandy_jadestone", MaterialColor.COLOR_YELLOW); public static final Block BRIMSTONE = registerBlock("brimstone", new BrimstoneBlock()); public static final Block SULPHUR_CRYSTAL = registerBlock("sulphur_crystal", new SulphurCrystalBlock()); public static final Block MISSING_TILE = registerBlock("missing_tile", new MissingTileBlock()); - + public static final Block FLAVOLITE_RUNED = registerBlock("flavolite_runed", new RunedFlavolite()); - public static final Block FLAVOLITE_RUNED_ETERNAL = registerBlock("flavolite_runed_eternal", - new EternalRunedFlavolite()); - - public static final Block ANDESITE_PEDESTAL = registerBlock("andesite_pedestal", - new PedestalVanilla(Blocks.ANDESITE)); + public static final Block FLAVOLITE_RUNED_ETERNAL = registerBlock("flavolite_runed_eternal", new EternalRunedFlavolite()); + + public static final Block ANDESITE_PEDESTAL = registerBlock("andesite_pedestal", new PedestalVanilla(Blocks.ANDESITE)); public static final Block DIORITE_PEDESTAL = registerBlock("diorite_pedestal", new PedestalVanilla(Blocks.DIORITE)); public static final Block GRANITE_PEDESTAL = registerBlock("granite_pedestal", new PedestalVanilla(Blocks.GRANITE)); - public static final Block QUARTZ_PEDESTAL = registerBlock("quartz_pedestal", - new PedestalVanilla(Blocks.QUARTZ_BLOCK)); - public static final Block PURPUR_PEDESTAL = registerBlock("purpur_pedestal", - new PedestalVanilla(Blocks.PURPUR_BLOCK)); - + public static final Block QUARTZ_PEDESTAL = registerBlock("quartz_pedestal", new PedestalVanilla(Blocks.QUARTZ_BLOCK)); + public static final Block PURPUR_PEDESTAL = registerBlock("purpur_pedestal", new PedestalVanilla(Blocks.PURPUR_BLOCK)); + public static final Block HYDROTHERMAL_VENT = registerBlock("hydrothermal_vent", new HydrothermalVentBlock()); public static final Block VENT_BUBBLE_COLUMN = registerBlockNI("vent_bubble_column", new VentBubbleColumnBlock()); - + public static final Block DENSE_SNOW = registerBlock("dense_snow", new DenseSnowBlock()); public static final Block EMERALD_ICE = registerBlock("emerald_ice", new EmeraldIceBlock()); public static final Block DENSE_EMERALD_ICE = registerBlock("dense_emerald_ice", new DenseEmeraldIceBlock()); public static final Block ANCIENT_EMERALD_ICE = registerBlock("ancient_emerald_ice", new AncientEmeraldIceBlock()); - - public static final Block END_STONE_STALACTITE = registerBlock("end_stone_stalactite", - new StalactiteBlock(Blocks.END_STONE)); - public static final Block END_STONE_STALACTITE_CAVEMOSS = registerBlock("end_stone_stalactite_cavemoss", - new StalactiteBlock(CAVE_MOSS)); - + + public static final Block END_STONE_STALACTITE = registerBlock("end_stone_stalactite", new StalactiteBlock(Blocks.END_STONE)); + public static final Block END_STONE_STALACTITE_CAVEMOSS = registerBlock("end_stone_stalactite_cavemoss", new StalactiteBlock(CAVE_MOSS)); + // Wooden Materials And Trees // - public static final Block MOSSY_GLOWSHROOM_SAPLING = registerBlock("mossy_glowshroom_sapling", - new MossyGlowshroomSaplingBlock()); - public static final Block MOSSY_GLOWSHROOM_CAP = registerBlock("mossy_glowshroom_cap", - new MossyGlowshroomCapBlock()); - public static final Block MOSSY_GLOWSHROOM_HYMENOPHORE = registerBlock("mossy_glowshroom_hymenophore", - new GlowingHymenophoreBlock()); - public static final Block MOSSY_GLOWSHROOM_FUR = registerBlock("mossy_glowshroom_fur", - new FurBlock(MOSSY_GLOWSHROOM_SAPLING, 15, 16, true)); - public static final WoodenMaterial MOSSY_GLOWSHROOM = new WoodenMaterial("mossy_glowshroom", - MaterialColor.COLOR_GRAY, MaterialColor.WOOD); - - public static final Block PYTHADENDRON_SAPLING = registerBlock("pythadendron_sapling", - new PythadendronSaplingBlock()); - public static final Block PYTHADENDRON_LEAVES = registerBlock("pythadendron_leaves", - new EndLeavesBlock(PYTHADENDRON_SAPLING, MaterialColor.COLOR_MAGENTA)); - public static final WoodenMaterial PYTHADENDRON = new WoodenMaterial("pythadendron", MaterialColor.COLOR_MAGENTA, - MaterialColor.COLOR_PURPLE); - + public static final Block MOSSY_GLOWSHROOM_SAPLING = registerBlock("mossy_glowshroom_sapling", new MossyGlowshroomSaplingBlock()); + public static final Block MOSSY_GLOWSHROOM_CAP = registerBlock("mossy_glowshroom_cap", new MossyGlowshroomCapBlock()); + public static final Block MOSSY_GLOWSHROOM_HYMENOPHORE = registerBlock("mossy_glowshroom_hymenophore", new GlowingHymenophoreBlock()); + public static final Block MOSSY_GLOWSHROOM_FUR = registerBlock("mossy_glowshroom_fur", new FurBlock(MOSSY_GLOWSHROOM_SAPLING, 15, 16, true)); + public static final WoodenMaterial MOSSY_GLOWSHROOM = new WoodenMaterial("mossy_glowshroom", MaterialColor.COLOR_GRAY, MaterialColor.WOOD); + + public static final Block PYTHADENDRON_SAPLING = registerBlock("pythadendron_sapling", new PythadendronSaplingBlock()); + public static final Block PYTHADENDRON_LEAVES = registerBlock("pythadendron_leaves", new EndLeavesBlock(PYTHADENDRON_SAPLING, MaterialColor.COLOR_MAGENTA)); + public static final WoodenMaterial PYTHADENDRON = new WoodenMaterial("pythadendron", MaterialColor.COLOR_MAGENTA, MaterialColor.COLOR_PURPLE); + public static final Block END_LOTUS_SEED = registerBlock("end_lotus_seed", new EndLotusSeedBlock()); public static final Block END_LOTUS_STEM = registerBlock("end_lotus_stem", new EndLotusStemBlock()); public static final Block END_LOTUS_LEAF = registerBlockNI("end_lotus_leaf", new EndLotusLeafBlock()); public static final Block END_LOTUS_FLOWER = registerBlockNI("end_lotus_flower", new EndLotusFlowerBlock()); - public static final WoodenMaterial END_LOTUS = new WoodenMaterial("end_lotus", MaterialColor.COLOR_LIGHT_BLUE, - MaterialColor.COLOR_CYAN); - + public static final WoodenMaterial END_LOTUS = new WoodenMaterial("end_lotus", MaterialColor.COLOR_LIGHT_BLUE, MaterialColor.COLOR_CYAN); + public static final Block LACUGROVE_SAPLING = registerBlock("lacugrove_sapling", new LacugroveSaplingBlock()); - public static final Block LACUGROVE_LEAVES = registerBlock("lacugrove_leaves", - new EndLeavesBlock(LACUGROVE_SAPLING, MaterialColor.COLOR_CYAN)); - public static final WoodenMaterial LACUGROVE = new WoodenMaterial("lacugrove", MaterialColor.COLOR_BROWN, - MaterialColor.COLOR_YELLOW); - + public static final Block LACUGROVE_LEAVES = registerBlock("lacugrove_leaves", new EndLeavesBlock(LACUGROVE_SAPLING, MaterialColor.COLOR_CYAN)); + public static final WoodenMaterial LACUGROVE = new WoodenMaterial("lacugrove", MaterialColor.COLOR_BROWN, MaterialColor.COLOR_YELLOW); + public static final Block DRAGON_TREE_SAPLING = registerBlock("dragon_tree_sapling", new DragonTreeSaplingBlock()); - public static final Block DRAGON_TREE_LEAVES = registerBlock("dragon_tree_leaves", - new EndLeavesBlock(DRAGON_TREE_SAPLING, MaterialColor.COLOR_MAGENTA)); - public static final WoodenMaterial DRAGON_TREE = new WoodenMaterial("dragon_tree", MaterialColor.COLOR_BLACK, - MaterialColor.COLOR_MAGENTA); - + public static final Block DRAGON_TREE_LEAVES = registerBlock("dragon_tree_leaves", new EndLeavesBlock(DRAGON_TREE_SAPLING, MaterialColor.COLOR_MAGENTA)); + public static final WoodenMaterial DRAGON_TREE = new WoodenMaterial("dragon_tree", MaterialColor.COLOR_BLACK, MaterialColor.COLOR_MAGENTA); + public static final Block TENANEA_SAPLING = registerBlock("tenanea_sapling", new TenaneaSaplingBlock()); - public static final Block TENANEA_LEAVES = registerBlock("tenanea_leaves", - new EndLeavesBlock(TENANEA_SAPLING, MaterialColor.COLOR_PINK)); + public static final Block TENANEA_LEAVES = registerBlock("tenanea_leaves", new EndLeavesBlock(TENANEA_SAPLING, MaterialColor.COLOR_PINK)); public static final Block TENANEA_FLOWERS = registerBlock("tenanea_flowers", new TenaneaFlowersBlock()); - public static final Block TENANEA_OUTER_LEAVES = registerBlock("tenanea_outer_leaves", - new FurBlock(TENANEA_SAPLING, 32)); - public static final WoodenMaterial TENANEA = new WoodenMaterial("tenanea", MaterialColor.COLOR_BROWN, - MaterialColor.COLOR_PINK); - + public static final Block TENANEA_OUTER_LEAVES = registerBlock("tenanea_outer_leaves", new FurBlock(TENANEA_SAPLING, 32)); + public static final WoodenMaterial TENANEA = new WoodenMaterial("tenanea", MaterialColor.COLOR_BROWN, MaterialColor.COLOR_PINK); + public static final Block HELIX_TREE_SAPLING = registerBlock("helix_tree_sapling", new HelixTreeSaplingBlock()); public static final Block HELIX_TREE_LEAVES = registerBlock("helix_tree_leaves", new HelixTreeLeavesBlock()); - public static final WoodenMaterial HELIX_TREE = new WoodenMaterial("helix_tree", MaterialColor.COLOR_GRAY, - MaterialColor.COLOR_ORANGE); - - public static final Block UMBRELLA_TREE_SAPLING = registerBlock("umbrella_tree_sapling", - new UmbrellaTreeSaplingBlock()); - public static final Block UMBRELLA_TREE_MEMBRANE = registerBlock("umbrella_tree_membrane", - new UmbrellaTreeMembraneBlock()); - public static final Block UMBRELLA_TREE_CLUSTER = registerBlock("umbrella_tree_cluster", - new UmbrellaTreeClusterBlock()); - public static final Block UMBRELLA_TREE_CLUSTER_EMPTY = registerBlock("umbrella_tree_cluster_empty", - new UmbrellaTreeClusterEmptyBlock()); - public static final WoodenMaterial UMBRELLA_TREE = new WoodenMaterial("umbrella_tree", MaterialColor.COLOR_BLUE, - MaterialColor.COLOR_GREEN); - - public static final Block JELLYSHROOM_CAP_PURPLE = registerBlock("jellyshroom_cap_purple", - new JellyshroomCapBlock(217, 142, 255, 164, 0, 255)); - public static final WoodenMaterial JELLYSHROOM = new WoodenMaterial("jellyshroom", MaterialColor.COLOR_PURPLE, - MaterialColor.COLOR_LIGHT_BLUE); - + public static final WoodenMaterial HELIX_TREE = new WoodenMaterial("helix_tree", MaterialColor.COLOR_GRAY, MaterialColor.COLOR_ORANGE); + + public static final Block UMBRELLA_TREE_SAPLING = registerBlock("umbrella_tree_sapling", new UmbrellaTreeSaplingBlock()); + public static final Block UMBRELLA_TREE_MEMBRANE = registerBlock("umbrella_tree_membrane", new UmbrellaTreeMembraneBlock()); + public static final Block UMBRELLA_TREE_CLUSTER = registerBlock("umbrella_tree_cluster", new UmbrellaTreeClusterBlock()); + public static final Block UMBRELLA_TREE_CLUSTER_EMPTY = registerBlock("umbrella_tree_cluster_empty", new UmbrellaTreeClusterEmptyBlock()); + public static final WoodenMaterial UMBRELLA_TREE = new WoodenMaterial("umbrella_tree", MaterialColor.COLOR_BLUE, MaterialColor.COLOR_GREEN); + + public static final Block JELLYSHROOM_CAP_PURPLE = registerBlock("jellyshroom_cap_purple", new JellyshroomCapBlock(217, 142, 255, 164, 0, 255)); + public static final WoodenMaterial JELLYSHROOM = new WoodenMaterial("jellyshroom", MaterialColor.COLOR_PURPLE, MaterialColor.COLOR_LIGHT_BLUE); + public static final Block LUCERNIA_SAPLING = registerBlock("lucernia_sapling", new TenaneaSaplingBlock()); - public static final Block LUCERNIA_LEAVES = registerBlock("lucernia_leaves", - new EndLeavesBlock(LUCERNIA_SAPLING, MaterialColor.COLOR_ORANGE)); - public static final Block LUCERNIA_OUTER_LEAVES = registerBlock("lucernia_outer_leaves", - new FurBlock(LUCERNIA_SAPLING, 32)); - public static final WoodenMaterial LUCERNIA = new WoodenMaterial("lucernia", MaterialColor.COLOR_ORANGE, - MaterialColor.COLOR_ORANGE); - + public static final Block LUCERNIA_LEAVES = registerBlock("lucernia_leaves", new EndLeavesBlock(LUCERNIA_SAPLING, MaterialColor.COLOR_ORANGE)); + public static final Block LUCERNIA_OUTER_LEAVES = registerBlock("lucernia_outer_leaves", new FurBlock(LUCERNIA_SAPLING, 32)); + public static final WoodenMaterial LUCERNIA = new WoodenMaterial("lucernia", MaterialColor.COLOR_ORANGE, MaterialColor.COLOR_ORANGE); + // Small Plants // public static final Block UMBRELLA_MOSS = registerBlock("umbrella_moss", new UmbrellaMossBlock()); public static final Block UMBRELLA_MOSS_TALL = registerBlock("umbrella_moss_tall", new UmbrellaMossTallBlock()); @@ -202,75 +160,59 @@ public class EndBlocks { public static final Block SHADOW_PLANT = registerBlock("shadow_plant", new TerrainPlantBlock(SHADOW_GRASS)); public static final Block BUSHY_GRASS = registerBlock("bushy_grass", new TerrainPlantBlock(PINK_MOSS)); public static final Block AMBER_GRASS = registerBlock("amber_grass", new TerrainPlantBlock(AMBER_MOSS)); - public static final Block TWISTED_UMBRELLA_MOSS = registerBlock("twisted_umbrella_moss", - new TwistedUmbrellaMossBlock()); - public static final Block TWISTED_UMBRELLA_MOSS_TALL = registerBlock("twisted_umbrella_moss_tall", - new TwistedUmbrellaMossTallBlock()); + public static final Block TWISTED_UMBRELLA_MOSS = registerBlock("twisted_umbrella_moss", new TwistedUmbrellaMossBlock()); + public static final Block TWISTED_UMBRELLA_MOSS_TALL = registerBlock("twisted_umbrella_moss_tall", new TwistedUmbrellaMossTallBlock()); public static final Block JUNGLE_GRASS = registerBlock("jungle_grass", new TerrainPlantBlock(JUNGLE_MOSS)); public static final Block BLOOMING_COOKSONIA = registerBlock("blooming_cooksonia", new TerrainPlantBlock(END_MOSS)); public static final Block SALTEAGO = registerBlock("salteago", new TerrainPlantBlock(END_MOSS)); public static final Block VAIOLUSH_FERN = registerBlock("vaiolush_fern", new TerrainPlantBlock(END_MOSS)); public static final Block FRACTURN = registerBlock("fracturn", new TerrainPlantBlock(END_MOSS)); - public static final Block CLAWFERN = registerBlock("clawfern", - new TerrainPlantBlock(SANGNUM, MOSSY_OBSIDIAN, MOSSY_DRAGON_BONE)); - public static final Block GLOBULAGUS = registerBlock("globulagus", - new TerrainPlantBlock(SANGNUM, MOSSY_OBSIDIAN, MOSSY_DRAGON_BONE)); + public static final Block CLAWFERN = registerBlock("clawfern", new TerrainPlantBlock(SANGNUM, MOSSY_OBSIDIAN, MOSSY_DRAGON_BONE)); + public static final Block GLOBULAGUS = registerBlock("globulagus", new TerrainPlantBlock(SANGNUM, MOSSY_OBSIDIAN, MOSSY_DRAGON_BONE)); public static final Block ORANGO = registerBlock("orango", new TerrainPlantBlock(RUTISCUS)); public static final Block AERIDIUM = registerBlock("aeridium", new TerrainPlantBlock(RUTISCUS)); public static final Block LUTEBUS = registerBlock("lutebus", new TerrainPlantBlock(RUTISCUS)); public static final Block LAMELLARIUM = registerBlock("lamellarium", new TerrainPlantBlock(RUTISCUS)); - + public static final Block BLUE_VINE_SEED = registerBlock("blue_vine_seed", new BlueVineSeedBlock()); public static final Block BLUE_VINE = registerBlockNI("blue_vine", new BlueVineBlock()); public static final Block BLUE_VINE_LANTERN = registerBlock("blue_vine_lantern", new BlueVineLanternBlock()); - public static final Block BLUE_VINE_FUR = registerBlock("blue_vine_fur", - new FurBlock(BLUE_VINE_SEED, 15, 3, false)); - + public static final Block BLUE_VINE_FUR = registerBlock("blue_vine_fur", new FurBlock(BLUE_VINE_SEED, 15, 3, false)); + public static final Block LANCELEAF_SEED = registerBlock("lanceleaf_seed", new LanceleafSeedBlock()); public static final Block LANCELEAF = registerBlockNI("lanceleaf", new LanceleafBlock()); - + public static final Block GLOWING_PILLAR_SEED = registerBlock("glowing_pillar_seed", new GlowingPillarSeedBlock()); - public static final Block GLOWING_PILLAR_ROOTS = registerBlockNI("glowing_pillar_roots", - new GlowingPillarRootsBlock()); - public static final Block GLOWING_PILLAR_LUMINOPHOR = registerBlock("glowing_pillar_luminophor", - new GlowingPillarLuminophorBlock()); - public static final Block GLOWING_PILLAR_LEAVES = registerBlock("glowing_pillar_leaves", - new FurBlock(GLOWING_PILLAR_SEED, 15, 3, false)); - + public static final Block GLOWING_PILLAR_ROOTS = registerBlockNI("glowing_pillar_roots", new GlowingPillarRootsBlock()); + public static final Block GLOWING_PILLAR_LUMINOPHOR = registerBlock("glowing_pillar_luminophor", new GlowingPillarLuminophorBlock()); + public static final Block GLOWING_PILLAR_LEAVES = registerBlock("glowing_pillar_leaves", new FurBlock(GLOWING_PILLAR_SEED, 15, 3, false)); + public static final Block SMALL_JELLYSHROOM = registerBlock("small_jellyshroom", new SmallJellyshroomBlock()); public static final Block BOLUX_MUSHROOM = registerBlock("bolux_mushroom", new BoluxMushroomBlock()); - + public static final Block LUMECORN_SEED = registerBlock("lumecorn_seed", new LumecornSeedBlock()); public static final Block LUMECORN = registerBlockNI("lumecorn", new LumecornBlock()); - - public static final Block SMALL_AMARANITA_MUSHROOM = registerBlock("small_amaranita_mushroom", - new SmallAmaranitaBlock()); - public static final Block LARGE_AMARANITA_MUSHROOM = registerBlockNI("large_amaranita_mushroom", - new LargeAmaranitaBlock()); + + public static final Block SMALL_AMARANITA_MUSHROOM = registerBlock("small_amaranita_mushroom", new SmallAmaranitaBlock()); + public static final Block LARGE_AMARANITA_MUSHROOM = registerBlockNI("large_amaranita_mushroom", new LargeAmaranitaBlock()); public static final Block AMARANITA_STEM = registerBlock("amaranita_stem", new AmaranitaStemBlock()); public static final Block AMARANITA_HYPHAE = registerBlock("amaranita_hyphae", new AmaranitaStemBlock()); - public static final Block AMARANITA_HYMENOPHORE = registerBlock("amaranita_hymenophore", - new AmaranitaHymenophoreBlock()); + public static final Block AMARANITA_HYMENOPHORE = registerBlock("amaranita_hymenophore", new AmaranitaHymenophoreBlock()); public static final Block AMARANITA_LANTERN = registerBlock("amaranita_lantern", new GlowingHymenophoreBlock()); - public static final Block AMARANITA_FUR = registerBlock("amaranita_fur", - new FurBlock(MOSSY_GLOWSHROOM_SAPLING, 15, 4, true)); + public static final Block AMARANITA_FUR = registerBlock("amaranita_fur", new FurBlock(MOSSY_GLOWSHROOM_SAPLING, 15, 4, true)); public static final Block AMARANITA_CAP = registerBlock("amaranita_cap", new AmaranitaCapBlock()); - + public static final Block NEON_CACTUS = registerBlock("neon_cactus", new NeonCactusBlock()); - + // Crops public static final Block SHADOW_BERRY = registerBlock("shadow_berry", new ShadowBerryBlock()); - public static final Block BLOSSOM_BERRY = registerBlock("blossom_berry_seed", - new EndCropBlock(EndItems.BLOSSOM_BERRY, PINK_MOSS)); - public static final Block AMBER_ROOT = registerBlock("amber_root_seed", - new EndCropBlock(EndItems.AMBER_ROOT_RAW, AMBER_MOSS)); - public static final Block CHORUS_MUSHROOM = registerBlock("chorus_mushroom_seed", - new EndCropBlock(EndItems.CHORUS_MUSHROOM_RAW, CHORUS_NYLIUM)); - public static final Block PEARLBERRY = registerBlock("pearlberry_seed", - new EndCropBlock(EndItems.BLOSSOM_BERRY, END_MOSS, END_MYCELIUM)); + public static final Block BLOSSOM_BERRY = registerBlock("blossom_berry_seed", new EndCropBlock(EndItems.BLOSSOM_BERRY, PINK_MOSS)); + public static final Block AMBER_ROOT = registerBlock("amber_root_seed", new EndCropBlock(EndItems.AMBER_ROOT_RAW, AMBER_MOSS)); + public static final Block CHORUS_MUSHROOM = registerBlock("chorus_mushroom_seed", new EndCropBlock(EndItems.CHORUS_MUSHROOM_RAW, CHORUS_NYLIUM)); + public static final Block PEARLBERRY = registerBlock("pearlberry_seed", new EndCropBlock(EndItems.BLOSSOM_BERRY, END_MOSS, END_MYCELIUM)); public static final Block CAVE_PUMPKIN_SEED = registerBlock("cave_pumpkin_seed", new CavePumpkinVineBlock()); public static final Block CAVE_PUMPKIN = registerBlock("cave_pumpkin", new CavePumpkinBlock()); - + // Water plants public static final Block BUBBLE_CORAL = registerBlock("bubble_coral", new BubbleCoralBlock()); public static final Block MENGER_SPONGE = registerBlock("menger_sponge", new MengerSpongeBlock()); @@ -281,26 +223,24 @@ public class EndBlocks { public static final Block CHARNIA_LIGHT_BLUE = registerBlock("charnia_light_blue", new CharniaBlock()); public static final Block CHARNIA_CYAN = registerBlock("charnia_cyan", new CharniaBlock()); public static final Block CHARNIA_GREEN = registerBlock("charnia_green", new CharniaBlock()); - + public static final Block END_LILY = registerBlockNI("end_lily", new EndLilyBlock()); public static final Block END_LILY_SEED = registerBlock("end_lily_seed", new EndLilySeedBlock()); - - public static final Block HYDRALUX_SAPLING = registerBlock("hydralux_sapling", new HydraluxSaplingBlock()); + + public static final Block HYDRALUX_SAPLING = registerBlock("hydralux_sapling", new HydraluxSaplingBlock()); public static final Block HYDRALUX = registerBlockNI("hydralux", new HydraluxBlock()); public static final Block HYDRALUX_PETAL_BLOCK = registerBlock("hydralux_petal_block", new HydraluxPetalBlock()); - public static final ColoredMaterial HYDRALUX_PETAL_BLOCK_COLORED = new ColoredMaterial( - HydraluxPetalColoredBlock::new, HYDRALUX_PETAL_BLOCK, true); - + public static final ColoredMaterial HYDRALUX_PETAL_BLOCK_COLORED = new ColoredMaterial(HydraluxPetalColoredBlock::new, HYDRALUX_PETAL_BLOCK, true); + public static final Block POND_ANEMONE = registerBlock("pond_anemone", new PondAnemoneBlock()); - + public static final Block FLAMAEA = registerBlock("flamaea", new FlamaeaBlock()); - - public static final Block CAVE_BUSH = registerBlock("cave_bush", - new SimpleLeavesBlock(MaterialColor.COLOR_MAGENTA)); - + + public static final Block CAVE_BUSH = registerBlock("cave_bush", new SimpleLeavesBlock(MaterialColor.COLOR_MAGENTA)); + public static final Block MURKWEED = registerBlock("murkweed", new MurkweedBlock()); public static final Block NEEDLEGRASS = registerBlock("needlegrass", new NeedlegrassBlock()); - + // Wall Plants // public static final Block PURPLE_POLYPORE = registerBlock("purple_polypore", new WallMushroomBlock(13)); public static final Block AURANT_POLYPORE = registerBlock("aurant_polypore", new WallMushroomBlock(13)); @@ -311,7 +251,7 @@ public class EndBlocks { public static final Block BULB_MOSS = registerBlock("bulb_moss", new EndWallPlantBlock(12)); public static final Block JUNGLE_FERN = registerBlock("jungle_fern", new EndWallPlantBlock()); public static final Block RUSCUS = registerBlock("ruscus", new EndWallPlantBlock()); - + // Vines // public static final Block DENSE_VINE = registerBlock("dense_vine", new VineBlock(15, true)); public static final Block TWISTED_VINE = registerBlock("twisted_vine", new VineBlock()); @@ -323,71 +263,57 @@ public class EndBlocks { public static final Block FILALUX = registerBlock("filalux", new FilaluxBlock()); public static final Block FILALUX_WINGS = registerBlock("filalux_wings", new FilaluxWingsBlock()); public static final Block FILALUX_LANTERN = registerBlock("filalux_lantern", new FilaluxLanternBlock()); - + // Mob-Related public static final Block SILK_MOTH_NEST = registerBlock("silk_moth_nest", new SilkMothNestBlock()); public static final Block SILK_MOTH_HIVE = registerBlock("silk_moth_hive", new SilkMothHiveBlock()); - + // Ores // public static final Block ENDER_ORE = registerBlock("ender_ore", new EndOreBlock(EndItems.ENDER_SHARD, 1, 3, 5)); public static final Block AMBER_ORE = registerBlock("amber_ore", new EndOreBlock(EndItems.RAW_AMBER, 1, 2, 4)); - + // Materials // - public static final MetalMaterial THALLASIUM = MetalMaterial.makeNormal("thallasium", MaterialColor.COLOR_BLUE, - EndToolMaterial.THALLASIUM, EndArmorMaterial.THALLASIUM); - public static final MetalMaterial TERMINITE = MetalMaterial.makeOreless("terminite", MaterialColor.field_25708, 7F, - 9F, EndToolMaterial.TERMINITE, EndArmorMaterial.TERMINITE); + public static final MetalMaterial THALLASIUM = MetalMaterial.makeNormal("thallasium", MaterialColor.COLOR_BLUE, EndToolMaterial.THALLASIUM, EndArmorMaterial.THALLASIUM); + public static final MetalMaterial TERMINITE = MetalMaterial.makeOreless("terminite", MaterialColor.WARPED_WART_BLOCK, 7F, 9F, EndToolMaterial.TERMINITE, EndArmorMaterial.TERMINITE); public static final Block AETERNIUM_BLOCK = registerBlock("aeternium_block", new AeterniumBlock()); public static final Block CHARCOAL_BLOCK = registerBlock("charcoal_block", new CharcoalBlock()); - + public static final Block ENDER_BLOCK = registerBlock("ender_block", new EnderBlock()); public static final Block AURORA_CRYSTAL = registerBlock("aurora_crystal", new AuroraCrystalBlock()); public static final Block AMBER_BLOCK = registerBlock("amber_block", new AmberBlock()); public static final Block SMARAGDANT_CRYSTAL = registerBlock("smaragdant_crystal", new SmaragdantCrystalBlock()); - public static final CrystalSubblocksMaterial SMARAGDANT_SUBBLOCKS = new CrystalSubblocksMaterial( - "smaragdant_crystal", SMARAGDANT_CRYSTAL); - public static final Block SMARAGDANT_CRYSTAL_SHARD = registerBlock("smaragdant_crystal_shard", - new SmaragdantCrystalShardBlock()); - + public static final CrystalSubblocksMaterial SMARAGDANT_SUBBLOCKS = new CrystalSubblocksMaterial("smaragdant_crystal", SMARAGDANT_CRYSTAL); + public static final Block SMARAGDANT_CRYSTAL_SHARD = registerBlock("smaragdant_crystal_shard", new SmaragdantCrystalShardBlock()); + public static final Block RESPAWN_OBELISK = registerBlock("respawn_obelisk", new RespawnObeliskBlock()); - + // Lanterns - public static final Block ANDESITE_LANTERN = registerBlock("andesite_lantern", - new StoneLanternBlock(Blocks.ANDESITE)); + public static final Block ANDESITE_LANTERN = registerBlock("andesite_lantern", new StoneLanternBlock(Blocks.ANDESITE)); public static final Block DIORITE_LANTERN = registerBlock("diorite_lantern", new StoneLanternBlock(Blocks.DIORITE)); public static final Block GRANITE_LANTERN = registerBlock("granite_lantern", new StoneLanternBlock(Blocks.GRANITE)); - public static final Block QUARTZ_LANTERN = registerBlock("quartz_lantern", - new StoneLanternBlock(Blocks.QUARTZ_BLOCK)); - public static final Block PURPUR_LANTERN = registerBlock("purpur_lantern", - new StoneLanternBlock(Blocks.PURPUR_BLOCK)); - public static final Block END_STONE_LANTERN = registerBlock("end_stone_lantern", - new StoneLanternBlock(Blocks.END_STONE)); - public static final Block BLACKSTONE_LANTERN = registerBlock("blackstone_lantern", - new StoneLanternBlock(Blocks.BLACKSTONE)); - + public static final Block QUARTZ_LANTERN = registerBlock("quartz_lantern", new StoneLanternBlock(Blocks.QUARTZ_BLOCK)); + public static final Block PURPUR_LANTERN = registerBlock("purpur_lantern", new StoneLanternBlock(Blocks.PURPUR_BLOCK)); + public static final Block END_STONE_LANTERN = registerBlock("end_stone_lantern", new StoneLanternBlock(Blocks.END_STONE)); + public static final Block BLACKSTONE_LANTERN = registerBlock("blackstone_lantern", new StoneLanternBlock(Blocks.BLACKSTONE)); + public static final Block IRON_BULB_LANTERN = registerBlock("iron_bulb_lantern", new BulbVineLanternBlock()); - public static final ColoredMaterial IRON_BULB_LANTERN_COLORED = new ColoredMaterial( - BulbVineLanternColoredBlock::new, IRON_BULB_LANTERN, false); - - public static final Block IRON_CHANDELIER = EndBlocks.registerBlock("iron_chandelier", - new ChandelierBlock(Blocks.GOLD_BLOCK)); - public static final Block GOLD_CHANDELIER = EndBlocks.registerBlock("gold_chandelier", - new ChandelierBlock(Blocks.GOLD_BLOCK)); - + public static final ColoredMaterial IRON_BULB_LANTERN_COLORED = new ColoredMaterial(BulbVineLanternColoredBlock::new, IRON_BULB_LANTERN, false); + + public static final Block IRON_CHANDELIER = EndBlocks.registerBlock("iron_chandelier", new ChandelierBlock(Blocks.GOLD_BLOCK)); + public static final Block GOLD_CHANDELIER = EndBlocks.registerBlock("gold_chandelier", new ChandelierBlock(Blocks.GOLD_BLOCK)); + // Blocks With Entity // - public static final Block END_STONE_FURNACE = registerBlock("end_stone_furnace", - new EndFurnaceBlock(Blocks.END_STONE)); + public static final Block END_STONE_FURNACE = registerBlock("end_stone_furnace", new EndFurnaceBlock(Blocks.END_STONE)); public static final Block END_STONE_SMELTER = registerBlock("end_stone_smelter", new EndStoneSmelter()); public static final Block ETERNAL_PEDESTAL = registerBlock("eternal_pedestal", new EternalPedestal()); public static final Block INFUSION_PEDESTAL = registerBlock("infusion_pedestal", new InfusionPedestal()); public static final Block AETERNIUM_ANVIL = registerBlock("aeternium_anvil", new AeterniumAnvil()); - + // Technical public static final Block END_PORTAL_BLOCK = registerBlockNI("end_portal_block", new EndPortalBlock()); - - public static void register() { - } - + + public static void register() {} + public static Block registerBlock(ResourceLocation id, Block block) { if (!Configs.BLOCK_CONFIG.getBooleanRoot(id.getPath(), true)) { return block; @@ -402,17 +328,18 @@ public class EndBlocks { } Properties item = EndItems.makeBlockItemSettings().stacksTo(maxCount); if (placeOnWater) { - EndItems.registerBlockItem(id, new LilyPadItem(block, item)); - } else { + EndItems.registerBlockItem(id, new WaterLilyBlockItem(block, item)); + } + else { EndItems.registerBlockItem(id, new BlockItem(block, item)); } return block; } - + public static Block registerBlock(String name, Block block) { return registerBlock(BetterEnd.makeID(name), block); } - + public static Block registerBlockNI(String name, Block block) { return Registry.register(Registry.BLOCK, BetterEnd.makeID(name), block); } diff --git a/src/main/java/ru/betterend/registry/EndEntities.java b/src/main/java/ru/betterend/registry/EndEntities.java index a7864691..11e15d55 100644 --- a/src/main/java/ru/betterend/registry/EndEntities.java +++ b/src/main/java/ru/betterend/registry/EndEntities.java @@ -2,15 +2,15 @@ package ru.betterend.registry; import net.fabricmc.fabric.api.object.builder.v1.entity.FabricDefaultAttributeRegistry; import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityDimensions; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType.EntityFactory; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.SpawnGroup; -import net.minecraft.world.entity.attribute.DefaultAttributeContainer.Builder; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.Registry; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier.Builder; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; import ru.betterend.entity.CubozoaEntity; @@ -23,25 +23,13 @@ import ru.betterend.util.MHelper; import ru.betterend.util.SpawnHelper; public class EndEntities { - public static final EntityType DRAGONFLY = register("dragonfly", SpawnGroup.AMBIENT, 0.6F, 0.5F, - DragonflyEntity::new, DragonflyEntity.createMobAttributes(), true, MHelper.color(32, 42, 176), - MHelper.color(115, 225, 249)); - public static final EntityType END_SLIME = register("end_slime", SpawnGroup.MONSTER, 2F, 2F, - EndSlimeEntity::new, EndSlimeEntity.createMobAttributes(), false, MHelper.color(28, 28, 28), - MHelper.color(99, 11, 99)); - public static final EntityType END_FISH = register("end_fish", SpawnGroup.WATER_AMBIENT, 0.5F, 0.5F, - EndFishEntity::new, EndFishEntity.createMobAttributes(), true, MHelper.color(3, 50, 76), - MHelper.color(120, 206, 255)); - public static final EntityType SHADOW_WALKER = register("shadow_walker", SpawnGroup.MONSTER, - 0.6F, 1.95F, ShadowWalkerEntity::new, ShadowWalkerEntity.createMobAttributes(), true, - MHelper.color(30, 30, 30), MHelper.color(5, 5, 5)); - public static final EntityType CUBOZOA = register("cubozoa", SpawnGroup.WATER_AMBIENT, 0.6F, 1F, - CubozoaEntity::new, CubozoaEntity.createMobAttributes(), true, MHelper.color(151, 77, 181), - MHelper.color(93, 176, 238)); - public static final EntityType SILK_MOTH = register("silk_moth", SpawnGroup.AMBIENT, 0.6F, 0.6F, - SilkMothEntity::new, SilkMothEntity.createMobAttributes(), true, MHelper.color(198, 138, 204), - MHelper.color(242, 220, 236)); - + public static final EntityType DRAGONFLY = register("dragonfly", MobCategory.AMBIENT, 0.6F, 0.5F, DragonflyEntity::new, DragonflyEntity.createMobAttributes(), true, MHelper.color(32, 42, 176), MHelper.color(115, 225, 249)); + public static final EntityType END_SLIME = register("end_slime", MobCategory.MONSTER, 2F, 2F, EndSlimeEntity::new, EndSlimeEntity.createMobAttributes(), false, MHelper.color(28, 28, 28), MHelper.color(99, 11, 99)); + public static final EntityType END_FISH = register("end_fish", MobCategory.WATER_AMBIENT, 0.5F, 0.5F, EndFishEntity::new, EndFishEntity.createMobAttributes(), true, MHelper.color(3, 50, 76), MHelper.color(120, 206, 255)); + public static final EntityType SHADOW_WALKER = register("shadow_walker", MobCategory.MONSTER, 0.6F, 1.95F, ShadowWalkerEntity::new, ShadowWalkerEntity.createMobAttributes(), true, MHelper.color(30, 30, 30), MHelper.color(5, 5, 5)); + public static final EntityType CUBOZOA = register("cubozoa", MobCategory.WATER_AMBIENT, 0.6F, 1F, CubozoaEntity::new, CubozoaEntity.createMobAttributes(), true, MHelper.color(151, 77, 181), MHelper.color(93, 176, 238)); + public static final EntityType SILK_MOTH = register("silk_moth", MobCategory.AMBIENT, 0.6F, 0.6F, SilkMothEntity::new, SilkMothEntity.createMobAttributes(), true, MHelper.color(198, 138, 204), MHelper.color(242, 220, 236)); + public static void register() { SpawnHelper.restrictionAir(DRAGONFLY, DragonflyEntity::canSpawn); SpawnHelper.restrictionLand(END_SLIME, EndSlimeEntity::canSpawn); @@ -50,25 +38,19 @@ public class EndEntities { SpawnHelper.restrictionWater(CUBOZOA, CubozoaEntity::canSpawn); SpawnHelper.restrictionAir(SILK_MOTH, SilkMothEntity::canSpawn); } - - protected static EntityType register(String name, SpawnGroup group, float width, float height, - EntityFactory entity) { + + protected static EntityType register(String name, MobCategory group, float width, float height, EntityFactory entity) { ResourceLocation id = BetterEnd.makeID(name); - EntityType type = FabricEntityTypeBuilder.create(group, entity) - .dimensions(EntityDimensions.fixed(width, height)).build(); + EntityType type = FabricEntityTypeBuilder.create(group, entity).dimensions(EntityDimensions.fixed(width, height)).build(); if (Configs.ENTITY_CONFIG.getBooleanRoot(id.getPath(), true)) { return Registry.register(Registry.ENTITY_TYPE, id, type); } return type; } - - private static EntityType register(String name, SpawnGroup group, float width, - float height, EntityFactory entity, Builder attributes, boolean fixedSize, int eggColor, int dotsColor) { + + private static EntityType register(String name, MobCategory group, float width, float height, EntityFactory entity, Builder attributes, boolean fixedSize, int eggColor, int dotsColor) { ResourceLocation id = BetterEnd.makeID(name); - EntityType type = FabricEntityTypeBuilder.create(group, entity) - .dimensions( - fixedSize ? EntityDimensions.fixed(width, height) : EntityDimensions.changing(width, height)) - .build(); + EntityType type = FabricEntityTypeBuilder.create(group, entity).dimensions(fixedSize ? EntityDimensions.fixed(width, height) : EntityDimensions.scalable(width, height)).build(); if (Configs.ENTITY_CONFIG.getBooleanRoot(id.getPath(), true)) { FabricDefaultAttributeRegistry.register(type, attributes); EndItems.registerEgg("spawn_egg_" + name, type, eggColor, dotsColor); diff --git a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java index 5719b6f8..30384554 100644 --- a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java +++ b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java @@ -3,8 +3,8 @@ package ru.betterend.registry; import java.util.function.Function; import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry; -import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.client.render.entity.MobEntityRenderer; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.MobRenderer; import net.minecraft.world.entity.EntityType; import ru.betterend.entity.render.RendererEntityCubozoa; import ru.betterend.entity.render.RendererEntityDragonfly; @@ -14,7 +14,7 @@ import ru.betterend.entity.render.RendererEntityShadowWalker; import ru.betterend.entity.render.SilkMothEntityRenderer; public class EndEntitiesRenders { - + public static void register() { register(EndEntities.DRAGONFLY, RendererEntityDragonfly::new); register(EndEntities.END_SLIME, RendererEntityEndSlime::new); @@ -23,8 +23,8 @@ public class EndEntitiesRenders { register(EndEntities.CUBOZOA, RendererEntityCubozoa::new); register(EndEntities.SILK_MOTH, SilkMothEntityRenderer::new); } - - private static void register(EntityType type, Function> render) { + + private static void register(EntityType type, Function> render) { EntityRendererRegistry.INSTANCE.register(type, (entityRenderDispatcher, context) -> { return render.apply(entityRenderDispatcher); }); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 1003ed6f..10fba6ad 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -2,14 +2,12 @@ package ru.betterend.registry; import java.util.List; import java.util.function.Supplier; - -import com.google.common.collect.Lists; - -import net.minecraft.world.level.block.Blocks; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.gen.GenerationStep; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.levelgen.GenerationStep; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import com.google.common.collect.Lists; import ru.betterend.BetterEnd; import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; @@ -74,263 +72,170 @@ import ru.betterend.world.generator.GeneratorOptions; public class EndFeatures { // Trees // - public static final EndFeature MOSSY_GLOWSHROOM = new EndFeature("mossy_glowshroom", new MossyGlowshroomFeature(), - 3); - public static final EndFeature PYTHADENDRON_TREE = new EndFeature("pythadendron_tree", - new PythadendronTreeFeature(), 2); + public static final EndFeature MOSSY_GLOWSHROOM = new EndFeature("mossy_glowshroom", new MossyGlowshroomFeature(), 3); + public static final EndFeature PYTHADENDRON_TREE = new EndFeature("pythadendron_tree", new PythadendronTreeFeature(), 2); public static final EndFeature LACUGROVE = new EndFeature("lacugrove", new LacugroveFeature(), 4); public static final EndFeature DRAGON_TREE = new EndFeature("dragon_tree", new DragonTreeFeature(), 3); public static final EndFeature TENANEA = new EndFeature("tenanea", new TenaneaFeature(), 3); public static final EndFeature HELIX_TREE = new EndFeature("helix_tree", new HelixTreeFeature(), 2); public static final EndFeature UMBRELLA_TREE = new EndFeature("umbrella_tree", new UmbrellaTreeFeature(), 4); public static final EndFeature JELLYSHROOM = new EndFeature("jellyshroom", new JellyshroomFeature(), 3); - public static final EndFeature GIGANTIC_AMARANITA = new EndFeature("gigantic_amaranita", - new GiganticAmaranitaFeature(), 1); + public static final EndFeature GIGANTIC_AMARANITA = new EndFeature("gigantic_amaranita", new GiganticAmaranitaFeature(), 1); public static final EndFeature LUCERNIA = new EndFeature("lucernia", new LucerniaFeature(), 3); - + // Bushes // - public static final EndFeature PYTHADENDRON_BUSH = new EndFeature("pythadendron_bush", - new BushFeature(EndBlocks.PYTHADENDRON_LEAVES, EndBlocks.PYTHADENDRON.bark), 4); - public static final EndFeature DRAGON_TREE_BUSH = new EndFeature("dragon_tree_bush", - new BushFeature(EndBlocks.DRAGON_TREE_LEAVES, EndBlocks.DRAGON_TREE.bark), 15); + public static final EndFeature PYTHADENDRON_BUSH = new EndFeature("pythadendron_bush", new BushFeature(EndBlocks.PYTHADENDRON_LEAVES, EndBlocks.PYTHADENDRON.bark), 4); + public static final EndFeature DRAGON_TREE_BUSH = new EndFeature("dragon_tree_bush", new BushFeature(EndBlocks.DRAGON_TREE_LEAVES, EndBlocks.DRAGON_TREE.bark), 15); public static final EndFeature TENANEA_BUSH = new EndFeature("tenanea_bush", new TenaneaBushFeature(), 10); public static final EndFeature LUMECORN = new EndFeature("lumecorn", new Lumecorn(), 5); public static final EndFeature LARGE_AMARANITA = new EndFeature("large_amaranita", new LargeAmaranitaFeature(), 5); - public static final EndFeature LUCERNIA_BUSH = new EndFeature("lucernia_bush", new BushWithOuterFeature( - EndBlocks.LUCERNIA_LEAVES, EndBlocks.LUCERNIA_OUTER_LEAVES, EndBlocks.LUCERNIA.bark), 10); + public static final EndFeature LUCERNIA_BUSH = new EndFeature("lucernia_bush", new BushWithOuterFeature(EndBlocks.LUCERNIA_LEAVES, EndBlocks.LUCERNIA_OUTER_LEAVES, EndBlocks.LUCERNIA.bark), 10); public static final EndFeature NEON_CACTUS = new EndFeature("neon_cactus", new NeonCactusFeature(), 2); - + // Plants // - public static final EndFeature UMBRELLA_MOSS = new EndFeature("umbrella_moss", - new DoublePlantFeature(EndBlocks.UMBRELLA_MOSS, EndBlocks.UMBRELLA_MOSS_TALL, 5), 5); - public static final EndFeature CREEPING_MOSS = new EndFeature("creeping_moss", - new SinglePlantFeature(EndBlocks.CREEPING_MOSS, 5), 5); + public static final EndFeature UMBRELLA_MOSS = new EndFeature("umbrella_moss", new DoublePlantFeature(EndBlocks.UMBRELLA_MOSS, EndBlocks.UMBRELLA_MOSS_TALL, 5), 5); + public static final EndFeature CREEPING_MOSS = new EndFeature("creeping_moss", new SinglePlantFeature(EndBlocks.CREEPING_MOSS, 5), 5); public static final EndFeature BLUE_VINE = new EndFeature("blue_vine", new BlueVineFeature(), 1); - public static final EndFeature CHORUS_GRASS = new EndFeature("chorus_grass", - new SinglePlantFeature(EndBlocks.CHORUS_GRASS, 4), 5); - public static final EndFeature CRYSTAL_GRASS = new EndFeature("crystal_grass", - new SinglePlantFeature(EndBlocks.CRYSTAL_GRASS, 8, false), 5); - public static final EndFeature SHADOW_PLANT = new EndFeature("shadow_plant", - new SinglePlantFeature(EndBlocks.SHADOW_PLANT, 6), 9); - public static final EndFeature MURKWEED = new EndFeature("murkweed", new SinglePlantFeature(EndBlocks.MURKWEED, 3), - 2); - public static final EndFeature NEEDLEGRASS = new EndFeature("needlegrass", - new SinglePlantFeature(EndBlocks.NEEDLEGRASS, 3), 2); - public static final EndFeature SHADOW_BERRY = new EndFeature("shadow_berry", - new SinglePlantFeature(EndBlocks.SHADOW_BERRY, 2), 1); - public static final EndFeature BUSHY_GRASS = new EndFeature("bushy_grass", - new SinglePlantFeature(EndBlocks.BUSHY_GRASS, 8, false), 20); - public static final EndFeature BUSHY_GRASS_WG = new EndFeature("bushy_grass_wg", - new SinglePlantFeature(EndBlocks.BUSHY_GRASS, 5), 10); - public static final EndFeature AMBER_GRASS = new EndFeature("amber_grass", - new SinglePlantFeature(EndBlocks.AMBER_GRASS, 6), 9); + public static final EndFeature CHORUS_GRASS = new EndFeature("chorus_grass", new SinglePlantFeature(EndBlocks.CHORUS_GRASS, 4), 5); + public static final EndFeature CRYSTAL_GRASS = new EndFeature("crystal_grass", new SinglePlantFeature(EndBlocks.CRYSTAL_GRASS, 8, false), 5); + public static final EndFeature SHADOW_PLANT = new EndFeature("shadow_plant", new SinglePlantFeature(EndBlocks.SHADOW_PLANT, 6), 9); + public static final EndFeature MURKWEED = new EndFeature("murkweed", new SinglePlantFeature(EndBlocks.MURKWEED, 3), 2); + public static final EndFeature NEEDLEGRASS = new EndFeature("needlegrass", new SinglePlantFeature(EndBlocks.NEEDLEGRASS, 3), 2); + public static final EndFeature SHADOW_BERRY = new EndFeature("shadow_berry", new SinglePlantFeature(EndBlocks.SHADOW_BERRY, 2), 1); + public static final EndFeature BUSHY_GRASS = new EndFeature("bushy_grass", new SinglePlantFeature(EndBlocks.BUSHY_GRASS, 8, false), 20); + public static final EndFeature BUSHY_GRASS_WG = new EndFeature("bushy_grass_wg", new SinglePlantFeature(EndBlocks.BUSHY_GRASS, 5), 10); + public static final EndFeature AMBER_GRASS = new EndFeature("amber_grass", new SinglePlantFeature(EndBlocks.AMBER_GRASS, 6), 9); public static final EndFeature LANCELEAF = new EndFeature("lanceleaf", new LanceleafFeature(), 3); public static final EndFeature GLOW_PILLAR = new EndFeature("glow_pillar", new GlowPillarFeature(), 1); - public static final EndFeature TWISTED_UMBRELLA_MOSS = new EndFeature("twisted_umbrella_moss", - new DoublePlantFeature(EndBlocks.TWISTED_UMBRELLA_MOSS, EndBlocks.TWISTED_UMBRELLA_MOSS_TALL, 6), 5); - public static final EndFeature JUNGLE_GRASS = new EndFeature("jungle_grass", - new SinglePlantFeature(EndBlocks.JUNGLE_GRASS, 7, 3), 8); - public static final EndFeature SMALL_JELLYSHROOM_FLOOR = new EndFeature("small_jellyshroom_floor", - new SinglePlantFeature(EndBlocks.SMALL_JELLYSHROOM, 5, 5), 4); - public static final EndFeature BLOSSOM_BERRY = new EndFeature("blossom_berry", - new SinglePlantFeature(EndBlocks.BLOSSOM_BERRY, 3, 3), 2); - public static final EndFeature BLOOMING_COOKSONIA = new EndFeature("blooming_cooksonia", - new SinglePlantFeature(EndBlocks.BLOOMING_COOKSONIA, 5), 5); - public static final EndFeature SALTEAGO = new EndFeature("salteago", new SinglePlantFeature(EndBlocks.SALTEAGO, 5), - 5); - public static final EndFeature VAIOLUSH_FERN = new EndFeature("vaiolush_fern", - new SinglePlantFeature(EndBlocks.VAIOLUSH_FERN, 5), 5); - public static final EndFeature FRACTURN = new EndFeature("fracturn", new SinglePlantFeature(EndBlocks.FRACTURN, 5), - 5); - public static final EndFeature UMBRELLA_MOSS_RARE = new EndFeature("umbrella_moss_rare", - new SinglePlantFeature(EndBlocks.UMBRELLA_MOSS, 3), 2); - public static final EndFeature CREEPING_MOSS_RARE = new EndFeature("creeping_moss_rare", - new SinglePlantFeature(EndBlocks.CREEPING_MOSS, 3), 2); - public static final EndFeature TWISTED_UMBRELLA_MOSS_RARE = new EndFeature("twisted_umbrella_moss_rare", - new SinglePlantFeature(EndBlocks.TWISTED_UMBRELLA_MOSS, 3), 2); + public static final EndFeature TWISTED_UMBRELLA_MOSS = new EndFeature("twisted_umbrella_moss", new DoublePlantFeature(EndBlocks.TWISTED_UMBRELLA_MOSS, EndBlocks.TWISTED_UMBRELLA_MOSS_TALL, 6), 5); + public static final EndFeature JUNGLE_GRASS = new EndFeature("jungle_grass", new SinglePlantFeature(EndBlocks.JUNGLE_GRASS, 7, 3), 8); + public static final EndFeature SMALL_JELLYSHROOM_FLOOR = new EndFeature("small_jellyshroom_floor", new SinglePlantFeature(EndBlocks.SMALL_JELLYSHROOM, 5, 5), 4); + public static final EndFeature BLOSSOM_BERRY = new EndFeature("blossom_berry", new SinglePlantFeature(EndBlocks.BLOSSOM_BERRY, 3, 3), 2); + public static final EndFeature BLOOMING_COOKSONIA = new EndFeature("blooming_cooksonia", new SinglePlantFeature(EndBlocks.BLOOMING_COOKSONIA, 5), 5); + public static final EndFeature SALTEAGO = new EndFeature("salteago", new SinglePlantFeature(EndBlocks.SALTEAGO, 5), 5); + public static final EndFeature VAIOLUSH_FERN = new EndFeature("vaiolush_fern", new SinglePlantFeature(EndBlocks.VAIOLUSH_FERN, 5), 5); + public static final EndFeature FRACTURN = new EndFeature("fracturn", new SinglePlantFeature(EndBlocks.FRACTURN, 5), 5); + public static final EndFeature UMBRELLA_MOSS_RARE = new EndFeature("umbrella_moss_rare", new SinglePlantFeature(EndBlocks.UMBRELLA_MOSS, 3), 2); + public static final EndFeature CREEPING_MOSS_RARE = new EndFeature("creeping_moss_rare", new SinglePlantFeature(EndBlocks.CREEPING_MOSS, 3), 2); + public static final EndFeature TWISTED_UMBRELLA_MOSS_RARE = new EndFeature("twisted_umbrella_moss_rare", new SinglePlantFeature(EndBlocks.TWISTED_UMBRELLA_MOSS, 3), 2); public static final EndFeature ORANGO = new EndFeature("orango", new SinglePlantFeature(EndBlocks.ORANGO, 5), 6); - public static final EndFeature AERIDIUM = new EndFeature("aeridium", - new SinglePlantFeature(EndBlocks.AERIDIUM, 5, 4), 5); - public static final EndFeature LUTEBUS = new EndFeature("lutebus", new SinglePlantFeature(EndBlocks.LUTEBUS, 5, 2), - 5); - public static final EndFeature LAMELLARIUM = new EndFeature("lamellarium", - new SinglePlantFeature(EndBlocks.LAMELLARIUM, 5), 6); - public static final EndFeature SMALL_AMARANITA = new EndFeature("small_amaranita", - new SinglePlantFeature(EndBlocks.SMALL_AMARANITA_MUSHROOM, 5, 5), 4); - public static final EndFeature GLOBULAGUS = new EndFeature("globulagus", - new SinglePlantFeature(EndBlocks.GLOBULAGUS, 5, 3), 6); - public static final EndFeature CLAWFERN = new EndFeature("clawfern", - new SinglePlantFeature(EndBlocks.CLAWFERN, 5, 4), 5); - public static final EndFeature BOLUX_MUSHROOM = new EndFeature("bolux_mushroom", - new SinglePlantFeature(EndBlocks.BOLUX_MUSHROOM, 5, 5), 2); - public static final EndFeature CHORUS_MUSHROOM = new EndFeature("chorus_mushroom", - new SinglePlantFeature(EndBlocks.CHORUS_MUSHROOM, 5, 5), 1); - public static final EndFeature AMBER_ROOT = new EndFeature("amber_root", - new SinglePlantFeature(EndBlocks.AMBER_ROOT, 5, 5), 1); - public static final EndFeature PEARLBERRY = new EndFeature("pearlberry", - new SinglePlantFeature(EndBlocks.PEARLBERRY, 5, 5), 1); - + public static final EndFeature AERIDIUM = new EndFeature("aeridium", new SinglePlantFeature(EndBlocks.AERIDIUM, 5, 4), 5); + public static final EndFeature LUTEBUS = new EndFeature("lutebus", new SinglePlantFeature(EndBlocks.LUTEBUS, 5, 2), 5); + public static final EndFeature LAMELLARIUM = new EndFeature("lamellarium", new SinglePlantFeature(EndBlocks.LAMELLARIUM, 5), 6); + public static final EndFeature SMALL_AMARANITA = new EndFeature("small_amaranita", new SinglePlantFeature(EndBlocks.SMALL_AMARANITA_MUSHROOM, 5, 5), 4); + public static final EndFeature GLOBULAGUS = new EndFeature("globulagus", new SinglePlantFeature(EndBlocks.GLOBULAGUS, 5, 3), 6); + public static final EndFeature CLAWFERN = new EndFeature("clawfern", new SinglePlantFeature(EndBlocks.CLAWFERN, 5, 4), 5); + public static final EndFeature BOLUX_MUSHROOM = new EndFeature("bolux_mushroom", new SinglePlantFeature(EndBlocks.BOLUX_MUSHROOM, 5, 5), 2); + public static final EndFeature CHORUS_MUSHROOM = new EndFeature("chorus_mushroom", new SinglePlantFeature(EndBlocks.CHORUS_MUSHROOM, 5, 5), 1); + public static final EndFeature AMBER_ROOT = new EndFeature("amber_root", new SinglePlantFeature(EndBlocks.AMBER_ROOT, 5, 5), 1); + public static final EndFeature PEARLBERRY = new EndFeature("pearlberry", new SinglePlantFeature(EndBlocks.PEARLBERRY, 5, 5), 1); + // Vines // - public static final EndFeature DENSE_VINE = new EndFeature("dense_vine", new VineFeature(EndBlocks.DENSE_VINE, 24), - 3); - public static final EndFeature TWISTED_VINE = new EndFeature("twisted_vine", - new VineFeature(EndBlocks.TWISTED_VINE, 24), 3); + public static final EndFeature DENSE_VINE = new EndFeature("dense_vine", new VineFeature(EndBlocks.DENSE_VINE, 24), 3); + public static final EndFeature TWISTED_VINE = new EndFeature("twisted_vine", new VineFeature(EndBlocks.TWISTED_VINE, 24), 3); public static final EndFeature BULB_VINE = new EndFeature("bulb_vine", new VineFeature(EndBlocks.BULB_VINE, 24), 5); - public static final EndFeature JUNGLE_VINE = new EndFeature("jungle_vine", - new VineFeature(EndBlocks.JUNGLE_VINE, 24), 5); - + public static final EndFeature JUNGLE_VINE = new EndFeature("jungle_vine", new VineFeature(EndBlocks.JUNGLE_VINE, 24), 5); + // Ceil plants - public static final EndFeature SMALL_JELLYSHROOM_CEIL = new EndFeature("small_jellyshroom_ceil", - new SingleInvertedScatterFeature(EndBlocks.SMALL_JELLYSHROOM, 8), 8); - + public static final EndFeature SMALL_JELLYSHROOM_CEIL = new EndFeature("small_jellyshroom_ceil", new SingleInvertedScatterFeature(EndBlocks.SMALL_JELLYSHROOM, 8), 8); + // Wall Plants // - public static final EndFeature PURPLE_POLYPORE = new EndFeature("purple_polypore", - new WallPlantOnLogFeature(EndBlocks.PURPLE_POLYPORE, 3), 5); - public static final EndFeature AURANT_POLYPORE = new EndFeature("aurant_polypore", - new WallPlantOnLogFeature(EndBlocks.AURANT_POLYPORE, 3), 5); - public static final EndFeature TAIL_MOSS = new EndFeature("tail_moss", new WallPlantFeature(EndBlocks.TAIL_MOSS, 3), - 15); - public static final EndFeature CYAN_MOSS = new EndFeature("cyan_moss", new WallPlantFeature(EndBlocks.CYAN_MOSS, 3), - 15); - public static final EndFeature TAIL_MOSS_WOOD = new EndFeature("tail_moss_wood", - new WallPlantOnLogFeature(EndBlocks.TAIL_MOSS, 4), 25); - public static final EndFeature CYAN_MOSS_WOOD = new EndFeature("cyan_moss_wood", - new WallPlantOnLogFeature(EndBlocks.CYAN_MOSS, 4), 25); - public static final EndFeature TWISTED_MOSS = new EndFeature("twisted_moss", - new WallPlantFeature(EndBlocks.TWISTED_MOSS, 6), 15); - public static final EndFeature TWISTED_MOSS_WOOD = new EndFeature("twisted_moss_wood", - new WallPlantOnLogFeature(EndBlocks.TWISTED_MOSS, 6), 25); - public static final EndFeature BULB_MOSS = new EndFeature("bulb_moss", new WallPlantFeature(EndBlocks.BULB_MOSS, 6), - 1); - public static final EndFeature BULB_MOSS_WOOD = new EndFeature("bulb_moss_wood", - new WallPlantOnLogFeature(EndBlocks.BULB_MOSS, 6), 15); - public static final EndFeature SMALL_JELLYSHROOM_WALL = new EndFeature("small_jellyshroom_wall", - new WallPlantFeature(EndBlocks.SMALL_JELLYSHROOM, 4), 4); - public static final EndFeature SMALL_JELLYSHROOM_WOOD = new EndFeature("small_jellyshroom_wood", - new WallPlantOnLogFeature(EndBlocks.SMALL_JELLYSHROOM, 4), 8); - public static final EndFeature JUNGLE_FERN_WOOD = new EndFeature("jungle_fern_wood", - new WallPlantOnLogFeature(EndBlocks.JUNGLE_FERN, 3), 12); + public static final EndFeature PURPLE_POLYPORE = new EndFeature("purple_polypore", new WallPlantOnLogFeature(EndBlocks.PURPLE_POLYPORE, 3), 5); + public static final EndFeature AURANT_POLYPORE = new EndFeature("aurant_polypore", new WallPlantOnLogFeature(EndBlocks.AURANT_POLYPORE, 3), 5); + public static final EndFeature TAIL_MOSS = new EndFeature("tail_moss", new WallPlantFeature(EndBlocks.TAIL_MOSS, 3), 15); + public static final EndFeature CYAN_MOSS = new EndFeature("cyan_moss", new WallPlantFeature(EndBlocks.CYAN_MOSS, 3), 15); + public static final EndFeature TAIL_MOSS_WOOD = new EndFeature("tail_moss_wood", new WallPlantOnLogFeature(EndBlocks.TAIL_MOSS, 4), 25); + public static final EndFeature CYAN_MOSS_WOOD = new EndFeature("cyan_moss_wood", new WallPlantOnLogFeature(EndBlocks.CYAN_MOSS, 4), 25); + public static final EndFeature TWISTED_MOSS = new EndFeature("twisted_moss", new WallPlantFeature(EndBlocks.TWISTED_MOSS, 6), 15); + public static final EndFeature TWISTED_MOSS_WOOD = new EndFeature("twisted_moss_wood", new WallPlantOnLogFeature(EndBlocks.TWISTED_MOSS, 6), 25); + public static final EndFeature BULB_MOSS = new EndFeature("bulb_moss", new WallPlantFeature(EndBlocks.BULB_MOSS, 6), 1); + public static final EndFeature BULB_MOSS_WOOD = new EndFeature("bulb_moss_wood", new WallPlantOnLogFeature(EndBlocks.BULB_MOSS, 6), 15); + public static final EndFeature SMALL_JELLYSHROOM_WALL = new EndFeature("small_jellyshroom_wall", new WallPlantFeature(EndBlocks.SMALL_JELLYSHROOM, 4), 4); + public static final EndFeature SMALL_JELLYSHROOM_WOOD = new EndFeature("small_jellyshroom_wood", new WallPlantOnLogFeature(EndBlocks.SMALL_JELLYSHROOM, 4), 8); + public static final EndFeature JUNGLE_FERN_WOOD = new EndFeature("jungle_fern_wood", new WallPlantOnLogFeature(EndBlocks.JUNGLE_FERN, 3), 12); public static final EndFeature RUSCUS = new EndFeature("ruscus", new WallPlantFeature(EndBlocks.RUSCUS, 6), 10); - public static final EndFeature RUSCUS_WOOD = new EndFeature("ruscus_wood", - new WallPlantOnLogFeature(EndBlocks.RUSCUS, 6), 10); - + public static final EndFeature RUSCUS_WOOD = new EndFeature("ruscus_wood", new WallPlantOnLogFeature(EndBlocks.RUSCUS, 6), 10); + // Sky plants public static final EndFeature FILALUX = new EndFeature("filalux", new FilaluxFeature(), 1); - + // Water // - public static final EndFeature BUBBLE_CORAL = new EndFeature("bubble_coral", - new UnderwaterPlantFeature(EndBlocks.BUBBLE_CORAL, 6), 10); - public static final EndFeature BUBBLE_CORAL_RARE = new EndFeature("bubble_coral_rare", - new UnderwaterPlantFeature(EndBlocks.BUBBLE_CORAL, 3), 4); + public static final EndFeature BUBBLE_CORAL = new EndFeature("bubble_coral", new UnderwaterPlantFeature(EndBlocks.BUBBLE_CORAL, 6), 10); + public static final EndFeature BUBBLE_CORAL_RARE = new EndFeature("bubble_coral_rare", new UnderwaterPlantFeature(EndBlocks.BUBBLE_CORAL, 3), 4); public static final EndFeature END_LILY = new EndFeature("end_lily", new EndLilyFeature(6), 10); public static final EndFeature END_LILY_RARE = new EndFeature("end_lily_rare", new EndLilyFeature(3), 4); public static final EndFeature END_LOTUS = new EndFeature("end_lotus", new EndLotusFeature(7), 5); public static final EndFeature END_LOTUS_LEAF = new EndFeature("end_lotus_leaf", new EndLotusLeafFeature(20), 25); public static final EndFeature HYDRALUX = new EndFeature("hydralux", new HydraluxFeature(5), 5); - public static final EndFeature POND_ANEMONE = new EndFeature("pond_anemone", - new UnderwaterPlantFeature(EndBlocks.POND_ANEMONE, 6), 10); - - public static final EndFeature CHARNIA_RED = new EndFeature("charnia_red", - new CharniaFeature(EndBlocks.CHARNIA_RED), 10); - public static final EndFeature CHARNIA_PURPLE = new EndFeature("charnia_purple", - new CharniaFeature(EndBlocks.CHARNIA_PURPLE), 10); - public static final EndFeature CHARNIA_CYAN = new EndFeature("charnia_cyan", - new CharniaFeature(EndBlocks.CHARNIA_CYAN), 10); - public static final EndFeature CHARNIA_LIGHT_BLUE = new EndFeature("charnia_light_blue", - new CharniaFeature(EndBlocks.CHARNIA_LIGHT_BLUE), 10); - public static final EndFeature CHARNIA_ORANGE = new EndFeature("charnia_orange", - new CharniaFeature(EndBlocks.CHARNIA_ORANGE), 10); - public static final EndFeature CHARNIA_GREEN = new EndFeature("charnia_green", - new CharniaFeature(EndBlocks.CHARNIA_GREEN), 10); + public static final EndFeature POND_ANEMONE = new EndFeature("pond_anemone", new UnderwaterPlantFeature(EndBlocks.POND_ANEMONE, 6), 10); + + public static final EndFeature CHARNIA_RED = new EndFeature("charnia_red", new CharniaFeature(EndBlocks.CHARNIA_RED), 10); + public static final EndFeature CHARNIA_PURPLE = new EndFeature("charnia_purple", new CharniaFeature(EndBlocks.CHARNIA_PURPLE), 10); + public static final EndFeature CHARNIA_CYAN = new EndFeature("charnia_cyan", new CharniaFeature(EndBlocks.CHARNIA_CYAN), 10); + public static final EndFeature CHARNIA_LIGHT_BLUE = new EndFeature("charnia_light_blue", new CharniaFeature(EndBlocks.CHARNIA_LIGHT_BLUE), 10); + public static final EndFeature CHARNIA_ORANGE = new EndFeature("charnia_orange", new CharniaFeature(EndBlocks.CHARNIA_ORANGE), 10); + public static final EndFeature CHARNIA_GREEN = new EndFeature("charnia_green", new CharniaFeature(EndBlocks.CHARNIA_GREEN), 10); public static final EndFeature MENGER_SPONGE = new EndFeature("menger_sponge", new MengerSpongeFeature(5), 1); - public static final EndFeature CHARNIA_RED_RARE = new EndFeature("charnia_red_rare", - new CharniaFeature(EndBlocks.CHARNIA_RED), 2); - public static final EndFeature BIOME_ISLAND = EndFeature.makeFeatureConfigured("overworld_island", - new BiomeIslandFeature()); - public static final EndFeature FLAMAEA = new EndFeature("flamaea", - new SinglePlantFeature(EndBlocks.FLAMAEA, 12, false, 5), 20); - + public static final EndFeature CHARNIA_RED_RARE = new EndFeature("charnia_red_rare", new CharniaFeature(EndBlocks.CHARNIA_RED), 2); + public static final EndFeature BIOME_ISLAND = EndFeature.makeFeatureConfigured("overworld_island", new BiomeIslandFeature()); + public static final EndFeature FLAMAEA = new EndFeature("flamaea", new SinglePlantFeature(EndBlocks.FLAMAEA, 12, false, 5), 20); + // Terrain // public static final EndFeature END_LAKE = EndFeature.makeLakeFeature("end_lake", new EndLakeFeature(), 4); - public static final EndFeature END_LAKE_NORMAL = EndFeature.makeLakeFeature("end_lake_normal", new EndLakeFeature(), - 20); - public static final EndFeature END_LAKE_RARE = EndFeature.makeLakeFeature("end_lake_rare", new EndLakeFeature(), - 40); + public static final EndFeature END_LAKE_NORMAL = EndFeature.makeLakeFeature("end_lake_normal", new EndLakeFeature(), 20); + public static final EndFeature END_LAKE_RARE = EndFeature.makeLakeFeature("end_lake_rare", new EndLakeFeature(), 40); public static final EndFeature ROUND_CAVE = EndFeature.makeRawGenFeature("round_cave", new RoundCaveFeature(), 2); public static final EndFeature SPIRE = EndFeature.makeRawGenFeature("spire", new SpireFeature(), 2); - public static final EndFeature FLOATING_SPIRE = EndFeature.makeRawGenFeature("floating_spire", - new FloatingSpireFeature(), 8); + public static final EndFeature FLOATING_SPIRE = EndFeature.makeRawGenFeature("floating_spire", new FloatingSpireFeature(), 8); public static final EndFeature GEYSER = EndFeature.makeRawGenFeature("geyser", new GeyserFeature(), 8); - public static final EndFeature SULPHURIC_LAKE = EndFeature.makeLakeFeature("sulphuric_lake", - new SulphuricLakeFeature(), 8); - public static final EndFeature SULPHURIC_CAVE = EndFeature.makeCountRawFeature("sulphuric_cave", - new SulphuricCaveFeature(), 2); - public static final EndFeature ICE_STAR = EndFeature.makeRawGenFeature("ice_star", - new IceStarFeature(5, 15, 10, 25), 15); - public static final EndFeature ICE_STAR_SMALL = EndFeature.makeRawGenFeature("ice_star_small", - new IceStarFeature(3, 5, 7, 12), 8); - public static final EndFeature SURFACE_VENT = EndFeature.makeChansedFeature("surface_vent", - new SurfaceVentFeature(), 4); - public static final EndFeature SULPHUR_HILL = EndFeature.makeChansedFeature("sulphur_hill", - new SulphurHillFeature(), 8); - public static final EndFeature OBSIDIAN_PILLAR_BASEMENT = EndFeature.makeChansedFeature("obsidian_pillar_basement", - new ObsidianPillarBasementFeature(), 8); - public static final EndFeature OBSIDIAN_BOULDER = EndFeature.makeChansedFeature("obsidian_boulder", - new ObsidianBoulderFeature(), 10); - public static final EndFeature FALLEN_PILLAR = EndFeature.makeChansedFeature("fallen_pillar", - new FallenPillarFeature(), 20); + public static final EndFeature SULPHURIC_LAKE = EndFeature.makeLakeFeature("sulphuric_lake", new SulphuricLakeFeature(), 8); + public static final EndFeature SULPHURIC_CAVE = EndFeature.makeCountRawFeature("sulphuric_cave", new SulphuricCaveFeature(), 2); + public static final EndFeature ICE_STAR = EndFeature.makeRawGenFeature("ice_star", new IceStarFeature(5, 15, 10, 25), 15); + public static final EndFeature ICE_STAR_SMALL = EndFeature.makeRawGenFeature("ice_star_small", new IceStarFeature(3, 5, 7, 12), 8); + public static final EndFeature SURFACE_VENT = EndFeature.makeChansedFeature("surface_vent", new SurfaceVentFeature(), 4); + public static final EndFeature SULPHUR_HILL = EndFeature.makeChansedFeature("sulphur_hill", new SulphurHillFeature(), 8); + public static final EndFeature OBSIDIAN_PILLAR_BASEMENT = EndFeature.makeChansedFeature("obsidian_pillar_basement", new ObsidianPillarBasementFeature(), 8); + public static final EndFeature OBSIDIAN_BOULDER = EndFeature.makeChansedFeature("obsidian_boulder", new ObsidianBoulderFeature(), 10); + public static final EndFeature FALLEN_PILLAR = EndFeature.makeChansedFeature("fallen_pillar", new FallenPillarFeature(), 20); public static final EndFeature TUNEL_CAVE = EndFeature.makeRawGenFeature("tunel_cave", new TunelCaveFeature(), 2); - + // Ores // - public static final EndFeature THALLASIUM_ORE = EndFeature.makeOreFeature("thallasium_ore", - EndBlocks.THALLASIUM.ore, 12, 6, 0, 16, 128); - public static final EndFeature ENDER_ORE = EndFeature.makeOreFeature("ender_ore", EndBlocks.ENDER_ORE, 8, 3, 0, 16, - 128); - public static final EndFeature AMBER_ORE = EndFeature.makeOreFeature("amber_ore", EndBlocks.AMBER_ORE, 12, 6, 0, 16, - 128); - public static final EndFeature VIOLECITE_LAYER = EndFeature.makeLayerFeature("violecite_layer", EndBlocks.VIOLECITE, - 15, 16, 128, 8); - public static final EndFeature FLAVOLITE_LAYER = EndFeature.makeLayerFeature("flavolite_layer", EndBlocks.FLAVOLITE, - 12, 16, 128, 6); - + public static final EndFeature THALLASIUM_ORE = EndFeature.makeOreFeature("thallasium_ore", EndBlocks.THALLASIUM.ore, 12, 6, 0, 16, 128); + public static final EndFeature ENDER_ORE = EndFeature.makeOreFeature("ender_ore", EndBlocks.ENDER_ORE, 8, 3, 0, 16, 128); + public static final EndFeature AMBER_ORE = EndFeature.makeOreFeature("amber_ore", EndBlocks.AMBER_ORE, 12, 6, 0, 16, 128); + public static final EndFeature VIOLECITE_LAYER = EndFeature.makeLayerFeature("violecite_layer", EndBlocks.VIOLECITE, 15, 16, 128, 8); + public static final EndFeature FLAVOLITE_LAYER = EndFeature.makeLayerFeature("flavolite_layer", EndBlocks.FLAVOLITE, 12, 16, 128, 6); + // Buildings - public static final EndFeature CRASHED_SHIP = EndFeature.makeChansedFeature("crashed_ship", - new CrashedShipFeature(), 500); - + public static final EndFeature CRASHED_SHIP = EndFeature.makeChansedFeature("crashed_ship", new CrashedShipFeature(), 500); + // Mobs - public static final EndFeature SILK_MOTH_NEST = EndFeature.makeChansedFeature("silk_moth_nest", - new SilkMothNestFeature(), 2); - + public static final EndFeature SILK_MOTH_NEST = EndFeature.makeChansedFeature("silk_moth_nest", new SilkMothNestFeature(), 2); + // Caves public static final DefaultFeature SMARAGDANT_CRYSTAL = new SmaragdantCrystalFeature(); - public static final DefaultFeature SMARAGDANT_CRYSTAL_SHARD = new SingleBlockFeature( - EndBlocks.SMARAGDANT_CRYSTAL_SHARD); + public static final DefaultFeature SMARAGDANT_CRYSTAL_SHARD = new SingleBlockFeature(EndBlocks.SMARAGDANT_CRYSTAL_SHARD); public static final DefaultFeature BIG_AURORA_CRYSTAL = new BigAuroraCrystalFeature(); public static final DefaultFeature CAVE_BUSH = new BushFeature(EndBlocks.CAVE_BUSH, EndBlocks.CAVE_BUSH); public static final DefaultFeature CAVE_GRASS = new SingleBlockFeature(EndBlocks.CAVE_GRASS); public static final DefaultFeature RUBINEA = new VineFeature(EndBlocks.RUBINEA, 8); public static final DefaultFeature MAGNULA = new VineFeature(EndBlocks.MAGNULA, 8); - public static final DefaultFeature END_STONE_STALACTITE = new StalactiteFeature(true, - EndBlocks.END_STONE_STALACTITE, Blocks.END_STONE); - public static final DefaultFeature END_STONE_STALAGMITE = new StalactiteFeature(false, - EndBlocks.END_STONE_STALACTITE, Blocks.END_STONE); - public static final DefaultFeature END_STONE_STALACTITE_CAVEMOSS = new StalactiteFeature(true, - EndBlocks.END_STONE_STALACTITE_CAVEMOSS, Blocks.END_STONE, EndBlocks.CAVE_MOSS); - public static final DefaultFeature END_STONE_STALAGMITE_CAVEMOSS = new StalactiteFeature(false, - EndBlocks.END_STONE_STALACTITE_CAVEMOSS, EndBlocks.CAVE_MOSS); + public static final DefaultFeature END_STONE_STALACTITE = new StalactiteFeature(true, EndBlocks.END_STONE_STALACTITE, Blocks.END_STONE); + public static final DefaultFeature END_STONE_STALAGMITE = new StalactiteFeature(false, EndBlocks.END_STONE_STALACTITE, Blocks.END_STONE); + public static final DefaultFeature END_STONE_STALACTITE_CAVEMOSS = new StalactiteFeature(true, EndBlocks.END_STONE_STALACTITE_CAVEMOSS, Blocks.END_STONE, EndBlocks.CAVE_MOSS); + public static final DefaultFeature END_STONE_STALAGMITE_CAVEMOSS = new StalactiteFeature(false, EndBlocks.END_STONE_STALACTITE_CAVEMOSS, EndBlocks.CAVE_MOSS); public static final DefaultFeature CAVE_PUMPKIN = new CavePumpkinFeature(); - - public static void registerBiomeFeatures(ResourceLocation id, Biome biome, - List>>> features) { + + public static void registerBiomeFeatures(ResourceLocation id, Biome biome, List>>> features) { if (id.getNamespace().equals(BetterEnd.MOD_ID)) { return; } - + if (GeneratorOptions.removeChorusFromVanillaBiomes()) { if (id.getNamespace().equals("minecraft")) { String path = id.getPath(); if (path.equals("end_highlands") || path.equals("end_midlands") || path.equals("small_end_islands")) { - int pos = GenerationStep.Feature.VEGETAL_DECORATION.ordinal(); + int pos = GenerationStep.Decoration.VEGETAL_DECORATION.ordinal(); if (pos < features.size()) { List>> list = features.get(pos); // If only chorus plants are enabled @@ -341,43 +246,44 @@ public class EndFeatures { } } } - + addFeature(FLAVOLITE_LAYER, features); addFeature(THALLASIUM_ORE, features); addFeature(ENDER_ORE, features); addFeature(CRASHED_SHIP, features); - + if (EndBiomes.getBiome(id).hasCaves()) { addFeature(ROUND_CAVE, features); addFeature(TUNEL_CAVE, features); } - + EndBiome endBiome = EndBiomes.getBiome(id); EndFeature feature = endBiome.getStructuresFeature(); if (feature != null) { addFeature(feature, features); } } - + public static void addDefaultFeatures(BiomeDefinition def) { def.addFeature(FLAVOLITE_LAYER); def.addFeature(THALLASIUM_ORE); def.addFeature(ENDER_ORE); def.addFeature(CRASHED_SHIP); - + if (def.hasCaves()) { def.addFeature(ROUND_CAVE); def.addFeature(TUNEL_CAVE); } } - + private static void addFeature(EndFeature feature, List>>> features) { int index = feature.getFeatureStep().ordinal(); if (features.size() > index) { features.get(index).add(() -> { return feature.getFeatureConfigured(); }); - } else { + } + else { List>> newFeature = Lists.newArrayList(); newFeature.add(() -> { return feature.getFeatureConfigured(); @@ -385,7 +291,6 @@ public class EndFeatures { features.add(newFeature); } } - - public static void register() { - } + + public static void register() {} } diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index cae4b4ed..0b35f495 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -5,23 +5,34 @@ import java.util.List; import com.google.common.collect.Lists; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.core.dispenser.DispenseItemBehavior; +import net.minecraft.core.BlockSource; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; +import net.minecraft.core.dispenser.DefaultDispenseItemBehavior; +import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; +import net.minecraft.tags.Tag; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.MobSpawnType; import net.minecraft.world.food.FoodProperties; import net.minecraft.world.food.Foods; -import net.minecraft.world.item.*; -import net.minecraft.world.level.block.DispenserBlock; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.effect.MobEffects; -import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.FishBucketItem; +import net.minecraft.world.item.Item; import net.minecraft.world.item.Item.Properties; -import net.minecraft.tags.Tag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.Direction; -import net.minecraft.core.Registry; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.item.ShovelItem; +import net.minecraft.world.item.SpawnEggItem; +import net.minecraft.world.item.SwordItem; +import net.minecraft.world.item.TieredItem; +import net.minecraft.world.item.Tiers; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.material.Fluids; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; import ru.betterend.item.DrinkItem; @@ -45,7 +56,7 @@ import ru.betterend.util.TagHelper; public class EndItems { private static final List MOD_BLOCKS = Lists.newArrayList(); private static final List MOD_ITEMS = Lists.newArrayList(); - + // Materials // public final static Item ENDER_DUST = registerItem("ender_dust"); public final static Item ENDER_SHARD = registerItem("ender_shard"); @@ -66,43 +77,28 @@ public class EndItems { public final static Item SILK_FIBER = registerItem("silk_fiber"); public final static Item LUMECORN_ROD = registerItem("lumecorn_rod"); public final static Item SILK_MOTH_MATRIX = registerItem("silk_moth_matrix"); - + // Music Discs - public final static Item MUSIC_DISC_STRANGE_AND_ALIEN = registerDisc("music_disc_strange_and_alien", 0, - EndSounds.STRANGE_AND_ALIEN); - + public final static Item MUSIC_DISC_STRANGE_AND_ALIEN = registerDisc("music_disc_strange_and_alien", 0, EndSounds.STRANGE_AND_ALIEN); + // Armor // - public static final Item AETERNIUM_HELMET = registerItem("aeternium_helmet", - new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.HEAD, makeItemSettings().fireResistant())); - public static final Item AETERNIUM_CHESTPLATE = registerItem("aeternium_chestplate", - new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.CHEST, makeItemSettings().fireResistant())); - public static final Item AETERNIUM_LEGGINGS = registerItem("aeternium_leggings", - new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.LEGS, makeItemSettings().fireResistant())); - public static final Item AETERNIUM_BOOTS = registerItem("aeternium_boots", - new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.FEET, makeItemSettings().fireResistant())); - public static final Item CRYSTALITE_HELMET = registerItem("crystalite_helmet", new EndArmorItem( - EndArmorMaterial.CRYSTALITE, EquipmentSlot.HEAD, makeItemSettings().rarity(Rarity.UNCOMMON))); - public static final Item CRYSTALITE_CHESTPLATE = registerItem("crystalite_chestplate", new EndArmorItem( - EndArmorMaterial.CRYSTALITE, EquipmentSlot.CHEST, makeItemSettings().rarity(Rarity.UNCOMMON))); - public static final Item CRYSTALITE_LEGGINGS = registerItem("crystalite_leggings", new EndArmorItem( - EndArmorMaterial.CRYSTALITE, EquipmentSlot.LEGS, makeItemSettings().rarity(Rarity.UNCOMMON))); - public static final Item CRYSTALITE_BOOTS = registerItem("crystalite_boots", new EndArmorItem( - EndArmorMaterial.CRYSTALITE, EquipmentSlot.FEET, makeItemSettings().rarity(Rarity.UNCOMMON))); - + public static final Item AETERNIUM_HELMET = registerItem("aeternium_helmet", new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.HEAD, makeItemSettings().fireResistant())); + public static final Item AETERNIUM_CHESTPLATE = registerItem("aeternium_chestplate", new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.CHEST, makeItemSettings().fireResistant())); + public static final Item AETERNIUM_LEGGINGS = registerItem("aeternium_leggings", new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.LEGS, makeItemSettings().fireResistant())); + public static final Item AETERNIUM_BOOTS = registerItem("aeternium_boots", new EndArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.FEET, makeItemSettings().fireResistant())); + public static final Item CRYSTALITE_HELMET = registerItem("crystalite_helmet", new EndArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.HEAD, makeItemSettings().rarity(Rarity.UNCOMMON))); + public static final Item CRYSTALITE_CHESTPLATE = registerItem("crystalite_chestplate", new EndArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.CHEST, makeItemSettings().rarity(Rarity.UNCOMMON))); + public static final Item CRYSTALITE_LEGGINGS = registerItem("crystalite_leggings", new EndArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.LEGS, makeItemSettings().rarity(Rarity.UNCOMMON))); + public static final Item CRYSTALITE_BOOTS = registerItem("crystalite_boots", new EndArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.FEET, makeItemSettings().rarity(Rarity.UNCOMMON))); + // Tools // - public static final TieredItem AETERNIUM_SHOVEL = registerTool("aeternium_shovel", - new EndShovelItem(EndToolMaterial.AETERNIUM, 1.5F, -3.0F, makeItemSettings().fireResistant())); - public static final TieredItem AETERNIUM_SWORD = registerTool("aeternium_sword", - new EndSwordItem(EndToolMaterial.AETERNIUM, 3, -2.4F, makeItemSettings().fireResistant())); - public static final TieredItem AETERNIUM_PICKAXE = registerTool("aeternium_pickaxe", - new EndPickaxeItem(EndToolMaterial.AETERNIUM, 1, -2.8F, makeItemSettings().fireResistant())); - public static final TieredItem AETERNIUM_AXE = registerTool("aeternium_axe", - new EndAxeItem(EndToolMaterial.AETERNIUM, 5.0F, -3.0F, makeItemSettings().fireResistant())); - public static final TieredItem AETERNIUM_HOE = registerTool("aeternium_hoe", - new EndHoeItem(EndToolMaterial.AETERNIUM, -3, 0.0F, makeItemSettings().fireResistant())); - public static final TieredItem AETERNIUM_HAMMER = registerTool("aeternium_hammer", - new EndHammerItem(EndToolMaterial.AETERNIUM, 6.0F, -3.0F, 0.3D, makeItemSettings().fireResistant())); - + public static final TieredItem AETERNIUM_SHOVEL = registerTool("aeternium_shovel", new EndShovelItem(EndToolMaterial.AETERNIUM, 1.5F, -3.0F, makeItemSettings().fireResistant())); + public static final TieredItem AETERNIUM_SWORD = registerTool("aeternium_sword", new EndSwordItem(EndToolMaterial.AETERNIUM, 3, -2.4F, makeItemSettings().fireResistant())); + public static final TieredItem AETERNIUM_PICKAXE = registerTool("aeternium_pickaxe", new EndPickaxeItem(EndToolMaterial.AETERNIUM, 1, -2.8F, makeItemSettings().fireResistant())); + public static final TieredItem AETERNIUM_AXE = registerTool("aeternium_axe", new EndAxeItem(EndToolMaterial.AETERNIUM, 5.0F, -3.0F, makeItemSettings().fireResistant())); + public static final TieredItem AETERNIUM_HOE = registerTool("aeternium_hoe", new EndHoeItem(EndToolMaterial.AETERNIUM, -3, 0.0F, makeItemSettings().fireResistant())); + public static final TieredItem AETERNIUM_HAMMER = registerTool("aeternium_hammer", new EndHammerItem(EndToolMaterial.AETERNIUM, 6.0F, -3.0F, 0.3D, makeItemSettings().fireResistant())); + // Toolparts // public final static Item AETERNIUM_SHOVEL_HEAD = registerItem("aeternium_shovel_head"); public final static Item AETERNIUM_PICKAXE_HEAD = registerItem("aeternium_pickaxe_head"); @@ -113,47 +109,41 @@ public class EndItems { public final static Item AETERNIUM_SWORD_HANDLE = registerItem("aeternium_sword_handle"); // Hammers // - public static final TieredItem IRON_HAMMER = registerTool("iron_hammer", - new EndHammerItem(Tiers.IRON, 5.0F, -3.2F, 0.2D, makeItemSettings())); - public static final TieredItem GOLDEN_HAMMER = registerTool("golden_hammer", - new EndHammerItem(Tiers.GOLD, 4.5F, -3.4F, 0.3D, makeItemSettings())); - public static final TieredItem DIAMOND_HAMMER = registerTool("diamond_hammer", - new EndHammerItem(Tiers.DIAMOND, 5.5F, -3.1F, 0.2D, makeItemSettings())); - public static final TieredItem NETHERITE_HAMMER = registerTool("netherite_hammer", - new EndHammerItem(Tiers.NETHERITE, 5.0F, -3.0F, 0.2D, makeItemSettings().fireResistant())); - + public static final TieredItem IRON_HAMMER = registerTool("iron_hammer", new EndHammerItem(Tiers.IRON, 5.0F, -3.2F, 0.2D, makeItemSettings())); + public static final TieredItem GOLDEN_HAMMER = registerTool("golden_hammer", new EndHammerItem(Tiers.GOLD, 4.5F, -3.4F, 0.3D, makeItemSettings())); + public static final TieredItem DIAMOND_HAMMER = registerTool("diamond_hammer", new EndHammerItem(Tiers.DIAMOND, 5.5F, -3.1F, 0.2D, makeItemSettings())); + public static final TieredItem NETHERITE_HAMMER = registerTool("netherite_hammer", new EndHammerItem(Tiers.NETHERITE, 5.0F, -3.0F, 0.2D, makeItemSettings().fireResistant())); + // Food // public final static Item SHADOW_BERRY_RAW = registerFood("shadow_berry_raw", 4, 0.5F); public final static Item SHADOW_BERRY_COOKED = registerFood("shadow_berry_cooked", 6, 0.7F); public final static Item END_FISH_RAW = registerFood("end_fish_raw", Foods.SALMON); public final static Item END_FISH_COOKED = registerFood("end_fish_cooked", Foods.COOKED_SALMON); - public final static Item BUCKET_END_FISH = registerItem("bucket_end_fish", - new FishBucketItem(EndEntities.END_FISH, Fluids.WATER, makeItemSettings().stacksTo(1))); + public final static Item BUCKET_END_FISH = registerItem("bucket_end_fish", new FishBucketItem(EndEntities.END_FISH, Fluids.WATER, makeItemSettings().stacksTo(1))); public final static Item SWEET_BERRY_JELLY = registerFood("sweet_berry_jelly", 6, 0.75F); - public final static Item SHADOW_BERRY_JELLY = registerFood("shadow_berry_jelly", 7, 0.75F, - new MobEffectInstance(MobEffects.NIGHT_VISION, 400)); + public final static Item SHADOW_BERRY_JELLY = registerFood("shadow_berry_jelly", 7, 0.75F, new MobEffectInstance(MobEffects.NIGHT_VISION, 400)); public final static Item BLOSSOM_BERRY = registerFood("blossom_berry", Foods.APPLE); public final static Item AMBER_ROOT_RAW = registerFood("amber_root_raw", 2, 0.8F); public final static Item CHORUS_MUSHROOM_RAW = registerFood("chorus_mushroom_raw", 3, 0.5F); public final static Item CHORUS_MUSHROOM_COOKED = registerFood("chorus_mushroom_cooked", Foods.MUSHROOM_STEW); public final static Item BOLUX_MUSHROOM_COOKED = registerFood("bolux_mushroom_cooked", Foods.MUSHROOM_STEW); public final static Item CAVE_PUMPKIN_PIE = registerFood("cave_pumpkin_pie", Foods.PUMPKIN_PIE); - + // Drinks // public final static Item UMBRELLA_CLUSTER_JUICE = registerDrink("umbrella_cluster_juice", 5, 0.7F); - + public static Item registerDisc(String name, int power, SoundEvent sound) { return registerItem(BetterEnd.makeID(name), new PatternedDiscItem(power, sound, makeItemSettings())); } - + public static Item registerItem(String name) { return registerItem(BetterEnd.makeID(name), new PatternedItem(makeItemSettings())); } - + public static Item registerItem(String name, Item item) { return registerItem(BetterEnd.makeID(name), item); } - + public static Item registerItem(ResourceLocation id, Item item) { if (item instanceof ArmorItem) { return registerArmor(id, item); @@ -164,19 +154,19 @@ public class EndItems { registerItem(id, item, MOD_ITEMS); return item; } - + public static Item registerBlockItem(ResourceLocation id, Item item) { registerItem(id, item, MOD_BLOCKS); return item; } - + private static void registerItem(ResourceLocation id, Item item, List registry) { if (item != Items.AIR) { Registry.register(Registry.ITEM, id, item); registry.add(item); } } - + private static Item registerArmor(ResourceLocation id, Item item) { if (!Configs.ITEM_CONFIG.getBoolean("armor", id.getPath(), true)) { return item; @@ -184,14 +174,14 @@ public class EndItems { registerItem(id, item, MOD_ITEMS); return item; } - + public static TieredItem registerTool(String name, TieredItem item) { ResourceLocation id = BetterEnd.makeID(name); if (!Configs.ITEM_CONFIG.getBoolean("tools", id.getPath(), true)) { return item; } registerItem(id, item, MOD_ITEMS); - + if (item instanceof ShovelItem) { TagHelper.addTag((Tag.Named) FabricToolTags.SHOVELS, item); } else if (item instanceof SwordItem) { @@ -205,44 +195,45 @@ public class EndItems { } else if (item instanceof EndHammerItem) { TagHelper.addTag((Tag.Named) EndTags.HAMMERS, item); } - + return item; } - + public static Item registerEgg(String name, EntityType type, int background, int dots) { SpawnEggItem item = new EndSpawnEggItem(type, background, dots, makeItemSettings()); - DispenseItemBehavior behavior = (pointer, stack) -> { - Direction direction = pointer.getBlockState().getValue(DispenserBlock.FACING); - EntityType entityType = ((SpawnEggItem) stack.getItem()).getType(stack.getTag()); - entityType.spawn(pointer.getLevel(), stack, null, pointer.getPos().relative(direction), - MobSpawnType.DISPENSER, direction != Direction.UP, false); - stack.shrink(1); - return stack; + DefaultDispenseItemBehavior behavior = new DefaultDispenseItemBehavior() { + public ItemStack execute(BlockSource pointer, ItemStack stack) { + Direction direction = pointer.getBlockState().getValue(DispenserBlock.FACING); + EntityType entityType = ((SpawnEggItem) stack.getItem()).getType(stack.getTag()); + entityType.spawn(pointer.getLevel(), stack, null, pointer.getPos().relative(direction), MobSpawnType.DISPENSER, direction != Direction.UP, false); + stack.shrink(1); + return stack; + } }; DispenserBlock.registerBehavior(item, behavior); return registerItem(name, item); } - + public static Item registerFood(String name, int hunger, float saturation, MobEffectInstance... effects) { FoodProperties.Builder builder = new FoodProperties.Builder().nutrition(hunger).saturationMod(saturation); - for (MobEffectInstance effect : effects) { + for (MobEffectInstance effect: effects) { builder.effect(effect, 1F); } return registerFood(name, builder.build()); } - + public static Item registerFood(String name, FoodProperties foodComponent) { return registerItem(name, new PatternedItem(makeItemSettings().food(foodComponent))); } - + public static Item registerDrink(String name) { return registerItem(name, new DrinkItem(makeItemSettings().stacksTo(1))); } - + public static Item registerDrink(String name, FoodProperties foodComponent) { return registerItem(name, new DrinkItem(makeItemSettings().stacksTo(1).food(foodComponent))); } - + public static Item registerDrink(String name, int hunger, float saturation) { FoodProperties.Builder builder = new FoodProperties.Builder().nutrition(hunger).saturationMod(saturation); return registerDrink(name, builder.build()); @@ -251,14 +242,13 @@ public class EndItems { public static Properties makeItemSettings() { return new Item.Properties().tab(CreativeTabs.TAB_ITEMS); } - + public static Properties makeBlockItemSettings() { return new Item.Properties().tab(CreativeTabs.TAB_BLOCKS); } - public static void register() { - } - + public static void register() {} + public static List getModBlocks() { return MOD_BLOCKS; } diff --git a/src/main/java/ru/betterend/registry/EndParticles.java b/src/main/java/ru/betterend/registry/EndParticles.java index b08ef032..2fb673a6 100644 --- a/src/main/java/ru/betterend/registry/EndParticles.java +++ b/src/main/java/ru/betterend/registry/EndParticles.java @@ -2,10 +2,10 @@ package ru.betterend.registry; import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry; import net.fabricmc.fabric.api.particle.v1.FabricParticleTypes; +import net.minecraft.core.Registry; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleType; import net.minecraft.core.particles.SimpleParticleType; -import net.minecraft.core.Registry; import ru.betterend.BetterEnd; import ru.betterend.particle.FireflyParticle; import ru.betterend.particle.InfusionParticle; @@ -23,8 +23,7 @@ import ru.betterend.particle.SmaragdantParticle; public class EndParticles { public static final SimpleParticleType GLOWING_SPHERE = register("glowing_sphere"); public static final SimpleParticleType PORTAL_SPHERE = register("portal_sphere"); - public static final ParticleType INFUSION = register("infusion", - FabricParticleTypes.complex(InfusionParticleType.PARAMETERS_FACTORY)); + public static final ParticleType INFUSION = register("infusion", FabricParticleTypes.complex(InfusionParticleType.PARAMETERS_FACTORY)); public static final SimpleParticleType SULPHUR_PARTICLE = register("sulphur_particle"); public static final SimpleParticleType GEYSER_PARTICLE = registerFar("geyser_particle"); public static final SimpleParticleType SNOWFLAKE = register("snowflake"); @@ -34,7 +33,7 @@ public class EndParticles { public static final SimpleParticleType JUNGLE_SPORE = register("jungle_spore"); public static final SimpleParticleType FIREFLY = register("firefly"); public static final SimpleParticleType SMARAGDANT = register("smaragdant_particle"); - + public static void register() { ParticleFactoryRegistry.getInstance().register(GLOWING_SPHERE, ParticleGlowingSphere.FactoryGlowingSphere::new); ParticleFactoryRegistry.getInstance().register(PORTAL_SPHERE, PaticlePortalSphere.FactoryPortalSphere::new); @@ -49,15 +48,15 @@ public class EndParticles { ParticleFactoryRegistry.getInstance().register(FIREFLY, FireflyParticle.FireflyParticleFactory::new); ParticleFactoryRegistry.getInstance().register(SMARAGDANT, SmaragdantParticle.SmaragdantParticleFactory::new); } - + private static SimpleParticleType register(String name) { return Registry.register(Registry.PARTICLE_TYPE, BetterEnd.makeID(name), FabricParticleTypes.simple()); } - + private static SimpleParticleType registerFar(String name) { return Registry.register(Registry.PARTICLE_TYPE, BetterEnd.makeID(name), FabricParticleTypes.simple(true)); } - + private static ParticleType register(String name, ParticleType type) { return Registry.register(Registry.PARTICLE_TYPE, BetterEnd.makeID(name), type); } diff --git a/src/main/java/ru/betterend/registry/EndPortals.java b/src/main/java/ru/betterend/registry/EndPortals.java index 1e7cce4b..81710747 100644 --- a/src/main/java/ru/betterend/registry/EndPortals.java +++ b/src/main/java/ru/betterend/registry/EndPortals.java @@ -4,10 +4,9 @@ import java.io.File; import com.google.gson.JsonArray; import com.google.gson.JsonObject; - +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; import ru.betterend.BetterEnd; import ru.betterend.config.ConfigWriter; @@ -16,10 +15,10 @@ import ru.betterend.util.MHelper; public class EndPortals { - public final static ResourceLocation OVERWORLD_ID = Level.OVERWORLD.getValue(); + public final static ResourceLocation OVERWORLD_ID = Level.OVERWORLD.location(); private static PortalInfo[] portals; - + public static void loadPortals() { File file = new File(ConfigWriter.MOD_CONFIG_DIR, "portals.json"); JsonObject json; @@ -42,16 +41,16 @@ public class EndPortals { portals[i] = new PortalInfo(array.get(i).getAsJsonObject()); } } - + public static int getCount() { return MHelper.max(portals.length - 1, 1); } - - public static ServerLevel getLevel(MinecraftServer server, int portalId) { + + public static ServerLevel getWorld(MinecraftServer server, int portalId) { if (portalId < 0 || portalId >= portals.length) { - return server.getOverworld(); + return server.overworld(); } - return portals[portalId].getLevel(server); + return portals[portalId].getWorld(server); } public static ResourceLocation getWorldId(int portalId) { @@ -60,7 +59,7 @@ public class EndPortals { } return portals[portalId].dimension; } - + public static int getPortalIdByItem(ResourceLocation item) { for (int i = 0; i < portals.length; i++) { if (portals[i].item.equals(item)) { @@ -69,7 +68,6 @@ public class EndPortals { } return 0; } - public static int getPortalIdByWorld(ResourceLocation world) { for (int i = 0; i < portals.length; i++) { if (portals[i].dimension.equals(world)) { @@ -78,11 +76,11 @@ public class EndPortals { } return 0; } - + public static int getColor(int state) { return portals[state].color; } - + public static boolean isAvailableItem(ResourceLocation item) { for (PortalInfo portal : portals) { if (portal.item.equals(item)) { @@ -91,7 +89,7 @@ public class EndPortals { } return false; } - + private static JsonObject makeDefault(File file) { JsonObject jsonObject = new JsonObject(); JsonFactory.storeJson(file, jsonObject); @@ -101,44 +99,46 @@ public class EndPortals { JsonFactory.storeJson(file, jsonObject); return jsonObject; } - + private static PortalInfo makeDefault() { - return new PortalInfo(new ResourceLocation("minecraft:overworld"), BetterEnd.makeID("eternal_crystal"), 255, - 255, 255); + return new PortalInfo(new ResourceLocation("minecraft:overworld"), BetterEnd.makeID("eternal_crystal"), 255, 255, 255); } - + private static class PortalInfo { private final ResourceLocation dimension; private final ResourceLocation item; private final int color; private ServerLevel world; - + PortalInfo(JsonObject obj) { - this(new ResourceLocation(JsonFactory.getString(obj, "dimension", "minecraft:overworld")), - new ResourceLocation(JsonFactory.getString(obj, "item", "betterend:eternal_crystal")), - JsonFactory.getInt(obj, "colorRed", 255), JsonFactory.getInt(obj, "colorGreen", 255), - JsonFactory.getInt(obj, "colorBlue", 255)); + this( + new ResourceLocation(JsonFactory.getString(obj, "dimension", "minecraft:overworld")), + new ResourceLocation(JsonFactory.getString(obj, "item", "betterend:eternal_crystal")), + JsonFactory.getInt(obj, "colorRed", 255), + JsonFactory.getInt(obj, "colorGreen", 255), + JsonFactory.getInt(obj, "colorBlue", 255) + ); } - + PortalInfo(ResourceLocation dimension, ResourceLocation item, int r, int g, int b) { this.dimension = dimension; this.item = item; this.color = MHelper.color(r, g, b); } - - ServerLevel getLevel(MinecraftServer server) { + + ServerLevel getWorld(MinecraftServer server) { if (world != null) { return world; } - for (ServerLevel world : server.getWorlds()) { + for (ServerLevel world : server.getAllLevels()) { if (world.dimension().location().equals(dimension)) { this.world = world; return world; } } - return server.getOverworld(); + return server.overworld(); } - + JsonObject toJson() { JsonObject obj = new JsonObject(); obj.addProperty("dimension", dimension.toString()); diff --git a/src/main/java/ru/betterend/registry/EndSounds.java b/src/main/java/ru/betterend/registry/EndSounds.java index b5962beb..7110cd17 100644 --- a/src/main/java/ru/betterend/registry/EndSounds.java +++ b/src/main/java/ru/betterend/registry/EndSounds.java @@ -1,7 +1,7 @@ package ru.betterend.registry; -import net.minecraft.sounds.SoundEvent; import net.minecraft.core.Registry; +import net.minecraft.sounds.SoundEvent; import ru.betterend.BetterEnd; public class EndSounds { @@ -10,7 +10,7 @@ public class EndSounds { public static final SoundEvent MUSIC_WATER = register("music", "water"); public static final SoundEvent MUSIC_DARK = register("music", "dark"); public static final SoundEvent MUSIC_OPENSPACE = register("music", "openspace"); - + // Ambient public static final SoundEvent AMBIENT_FOGGY_MUSHROOMLAND = register("ambient", "foggy_mushroomland"); public static final SoundEvent AMBIENT_CHORUS_FOREST = register("ambient", "chorus_forest"); @@ -21,19 +21,18 @@ public class EndSounds { public static final SoundEvent AMBIENT_SULPHUR_SPRINGS = register("ambient", "sulphur_springs"); public static final SoundEvent AMBIENT_UMBRELLA_JUNGLE = register("ambient", "umbrella_jungle"); public static final SoundEvent AMBIENT_GLOWING_GRASSLANDS = register("ambient", "glowing_grasslands"); - + // Entity public static final SoundEvent ENTITY_DRAGONFLY = register("entity", "dragonfly"); public static final SoundEvent ENTITY_SHADOW_WALKER = register("entity", "shadow_walker"); public static final SoundEvent ENTITY_SHADOW_WALKER_DAMAGE = register("entity", "shadow_walker_damage"); public static final SoundEvent ENTITY_SHADOW_WALKER_DEATH = register("entity", "shadow_walker_death"); - + // Records public static final SoundEvent STRANGE_AND_ALIEN = register("record", "strange_and_alien"); - - public static void register() { - } - + + public static void register() {} + private static SoundEvent register(String type, String id) { id = "betterend." + type + "." + id; return Registry.register(Registry.SOUND_EVENT, id, new SoundEvent(BetterEnd.makeID(id))); diff --git a/src/main/java/ru/betterend/registry/EndStructures.java b/src/main/java/ru/betterend/registry/EndStructures.java index bc11e4da..08d1b32a 100644 --- a/src/main/java/ru/betterend/registry/EndStructures.java +++ b/src/main/java/ru/betterend/registry/EndStructures.java @@ -2,13 +2,12 @@ package ru.betterend.registry; import java.util.Collection; import java.util.function.Supplier; - -import net.minecraft.structure.StructurePieceType; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.gen.GenerationStep.Feature; +import net.minecraft.world.level.levelgen.GenerationStep.Decoration; import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; +import net.minecraft.world.level.levelgen.feature.StructurePieceType; import ru.betterend.BetterEnd; import ru.betterend.world.structures.EndStructureFeature; import ru.betterend.world.structures.features.EternalPortalStructure; @@ -30,43 +29,30 @@ public class EndStructures { public static final StructurePieceType MOUNTAIN_PIECE = register("mountain_piece", CrystalMountainPiece::new); public static final StructurePieceType CAVE_PIECE = register("cave_piece", CavePiece::new); public static final StructurePieceType LAKE_PIECE = register("lake_piece", LakePiece::new); - public static final StructurePieceType PAINTED_MOUNTAIN_PIECE = register("painted_mountain_piece", - PaintedMountainPiece::new); + public static final StructurePieceType PAINTED_MOUNTAIN_PIECE = register("painted_mountain_piece", PaintedMountainPiece::new); public static final StructurePieceType NBT_PIECE = register("nbt_piece", NBTPiece::new); - - public static final EndStructureFeature GIANT_MOSSY_GLOWSHROOM = new EndStructureFeature("giant_mossy_glowshroom", - new GiantMossyGlowshroomStructure(), Feature.SURFACE_STRUCTURES, 16, 8); - public static final EndStructureFeature MEGALAKE = new EndStructureFeature("megalake", new MegaLakeStructure(), - Feature.RAW_GENERATION, 4, 1); - public static final EndStructureFeature MEGALAKE_SMALL = new EndStructureFeature("megalake_small", - new MegaLakeSmallStructure(), Feature.RAW_GENERATION, 4, 1); - public static final EndStructureFeature MOUNTAIN = new EndStructureFeature("mountain", new MountainStructure(), - Feature.RAW_GENERATION, 3, 2); - public static final EndStructureFeature PAINTED_MOUNTAIN = new EndStructureFeature("painted_mountain", - new PaintedMountainStructure(), Feature.RAW_GENERATION, 3, 2); - public static final EndStructureFeature ETERNAL_PORTAL = new EndStructureFeature("eternal_portal", - new EternalPortalStructure(), Feature.SURFACE_STRUCTURES, 16, 6); - public static final EndStructureFeature GIANT_ICE_STAR = new EndStructureFeature("giant_ice_star", - new GiantIceStarStructure(), Feature.SURFACE_STRUCTURES, 16, 8); - - public static void register() { - } - + + public static final EndStructureFeature GIANT_MOSSY_GLOWSHROOM = new EndStructureFeature("giant_mossy_glowshroom", new GiantMossyGlowshroomStructure(), Decoration.SURFACE_STRUCTURES, 16, 8); + public static final EndStructureFeature MEGALAKE = new EndStructureFeature("megalake", new MegaLakeStructure(), Decoration.RAW_GENERATION, 4, 1); + public static final EndStructureFeature MEGALAKE_SMALL = new EndStructureFeature("megalake_small", new MegaLakeSmallStructure(), Decoration.RAW_GENERATION, 4, 1); + public static final EndStructureFeature MOUNTAIN = new EndStructureFeature("mountain", new MountainStructure(), Decoration.RAW_GENERATION, 3, 2); + public static final EndStructureFeature PAINTED_MOUNTAIN = new EndStructureFeature("painted_mountain", new PaintedMountainStructure(), Decoration.RAW_GENERATION, 3, 2); + public static final EndStructureFeature ETERNAL_PORTAL = new EndStructureFeature("eternal_portal", new EternalPortalStructure(), Decoration.SURFACE_STRUCTURES, 16, 6); + public static final EndStructureFeature GIANT_ICE_STAR = new EndStructureFeature("giant_ice_star", new GiantIceStarStructure(), Decoration.SURFACE_STRUCTURES, 16, 8); + + public static void register() {} + private static StructurePieceType register(String id, StructurePieceType pieceType) { return Registry.register(Registry.STRUCTURE_PIECE, BetterEnd.makeID(id), pieceType); } - - public static void registerBiomeStructures(ResourceLocation id, Biome biome, - Collection>> structures) { + + public static void registerBiomeStructures(ResourceLocation id, Biome biome, Collection>> structures) { if (!id.getPath().contains("mountain") && !id.getPath().contains("lake")) { addStructure(ETERNAL_PORTAL, structures); } } - - private static void addStructure(EndStructureFeature feature, - Collection>> structures) { - structures.add(() -> { - return feature.getFeatureConfigured(); - }); + + private static void addStructure(EndStructureFeature feature, Collection>> structures) { + structures.add(() -> { return feature.getFeatureConfigured(); }); } } diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index 46f7283f..e5238040 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -5,22 +5,22 @@ import java.util.Arrays; 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.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.LeavesBlock; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.food.FoodProperties; -import net.minecraft.world.item.Item; +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.resources.ResourceLocation; -import net.minecraft.core.Registry; +import net.minecraft.world.food.FoodProperties; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.Biome.Category; -import net.minecraft.world.gen.surfacebuilder.SurfaceConfig; +import net.minecraft.world.level.biome.Biome.BiomeCategory; +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.levelgen.surfacebuilders.SurfaceBuilderConfiguration; +import net.minecraft.world.level.material.Material; import ru.betterend.BetterEnd; import ru.betterend.blocks.EndTerrainBlock; import ru.betterend.blocks.basis.PedestalBlock; @@ -32,7 +32,7 @@ import ru.betterend.util.TagHelper; public class EndTags { // Table with common (c) tags: // https://fabricmc.net/wiki/tutorial:tags - + // Block Tags public static final Tag.Named BOOKSHELVES = makeCommonBlockTag("bookshelves"); public static final Tag.Named GEN_TERRAIN = makeBlockTag("gen_terrain"); @@ -41,114 +41,122 @@ public class EndTags { public static final Tag.Named BLOCK_CHEST = makeCommonBlockTag("chest"); public static final Tag.Named END_STONES = makeCommonBlockTag("end_stones"); public static final Tag.Named DRAGON_IMMUNE = getMCBlockTag("dragon_immune"); - + // Item Tags public static final Tag.Named ITEM_CHEST = makeCommonItemTag("chest"); public static final Tag.Named IRON_INGOTS = makeCommonItemTag("iron_ingots"); public static final Tag.Named FURNACES = makeCommonItemTag("furnaces"); public final static Tag HAMMERS = registerFabricItemTag("hammers"); - + public static Tag.Named makeBlockTag(String name) { ResourceLocation id = BetterEnd.makeID(name); - Tag tag = BlockTags.getTagGroup().getTag(id); - return tag == null ? (Identified) TagRegistry.block(id) : (Identified) tag; + Tag tag = BlockTags.getAllTags().getTag(id); + return tag == null ? (Named) TagRegistry.block(id) : (Named) tag; } - + public static Tag.Named makeItemTag(String name) { ResourceLocation id = BetterEnd.makeID(name); - Tag tag = ItemTags.getTagGroup().getTag(id); - return tag == null ? (Identified) TagRegistry.item(id) : (Identified) tag; + Tag tag = ItemTags.getAllTags().getTag(id); + return tag == null ? (Named) TagRegistry.item(id) : (Named) tag; } - + public static Tag.Named makeCommonBlockTag(String name) { ResourceLocation id = new ResourceLocation("c", name); - Tag tag = BlockTags.getTagGroup().getTag(id); - return tag == null ? (Identified) TagRegistry.block(id) : (Identified) tag; + Tag tag = BlockTags.getAllTags().getTag(id); + return tag == null ? (Named) TagRegistry.block(id) : (Named) tag; } - + public static Tag.Named makeCommonItemTag(String name) { ResourceLocation id = new ResourceLocation("c", name); - Tag tag = ItemTags.getTagGroup().getTag(id); - return tag == null ? (Identified) TagRegistry.item(id) : (Identified) tag; + Tag tag = ItemTags.getAllTags().getTag(id); + return tag == null ? (Named) TagRegistry.item(id) : (Named) tag; } - + public static Tag.Named getMCBlockTag(String name) { ResourceLocation id = new ResourceLocation(name); - Tag tag = BlockTags.getTagGroup().getTag(id); - return tag == null ? (Identified) TagRegistry.block(id) : (Identified) tag; + Tag tag = BlockTags.getAllTags().getTag(id); + return tag == null ? (Named) TagRegistry.block(id) : (Named) tag; } - + public static void register() { addSurfaceBlock(Blocks.END_STONE); addSurfaceBlock(EndBlocks.THALLASIUM.ore); addSurfaceBlock(EndBlocks.ENDSTONE_DUST); addSurfaceBlock(EndBlocks.AMBER_ORE); - + EndItems.getModBlocks().forEach((item) -> { Block block = ((BlockItem) item).getBlock(); if (block instanceof EndTerrainBlock) { addSurfaceBlock(block); TagHelper.addTag(BlockTags.NYLIUM, block); - } else if (block instanceof LeavesBlock || block instanceof SimpleLeavesBlock) { + } + else if (block instanceof LeavesBlock || block instanceof SimpleLeavesBlock) { TagHelper.addTag(BlockTags.LEAVES, block); ComposterBlockAccessor.callRegisterCompostableItem(0.3F, block); - } else if (block instanceof VineBlock) { + } + else if (block instanceof VineBlock) { TagHelper.addTag(BlockTags.CLIMBABLE, block); - } else if (block instanceof PedestalBlock) { + } + else if (block instanceof PedestalBlock) { TagHelper.addTag(PEDESTALS, block); } - + Material mat = block.defaultBlockState().getMaterial(); if (mat.equals(Material.PLANT) || mat.equals(Material.REPLACEABLE_PLANT)) { ComposterBlockAccessor.callRegisterCompostableItem(0.1F, block); } }); - + EndItems.getModItems().forEach((item) -> { - if (item.isFood()) { - FoodProperties food = item.getFoodComponent(); - float compost = food.getHunger() * food.getSaturationModifier() * 0.18F; + if (item.isEdible()) { + FoodProperties food = item.getFoodProperties(); + float compost = food.getNutrition() * food.getSaturationModifier() * 0.18F; ComposterBlockAccessor.callRegisterCompostableItem(compost, item); } }); - - TagHelper.addTag(GEN_TERRAIN, EndBlocks.ENDER_ORE, EndBlocks.FLAVOLITE.stone, EndBlocks.VIOLECITE.stone, - EndBlocks.SULPHURIC_ROCK.stone, EndBlocks.BRIMSTONE); + + TagHelper.addTag(GEN_TERRAIN, EndBlocks.ENDER_ORE, EndBlocks.FLAVOLITE.stone, EndBlocks.VIOLECITE.stone, EndBlocks.SULPHURIC_ROCK.stone, EndBlocks.BRIMSTONE); TagHelper.addTag(END_GROUND, EndBlocks.SULPHURIC_ROCK.stone, EndBlocks.BRIMSTONE); - ToolManagerImpl.tag(HAMMERS) - .register(new ModdedToolsVanillaBlocksToolHandler(Arrays.asList(EndItems.IRON_HAMMER, - EndItems.GOLDEN_HAMMER, EndItems.DIAMOND_HAMMER, EndItems.NETHERITE_HAMMER, - EndItems.AETERNIUM_HAMMER, EndBlocks.THALLASIUM.hammer, EndBlocks.TERMINITE.hammer))); - + ToolManagerImpl.tag(HAMMERS).register(new ModdedToolsVanillaBlocksToolHandler( + Arrays.asList( + EndItems.IRON_HAMMER, + EndItems.GOLDEN_HAMMER, + EndItems.DIAMOND_HAMMER, + EndItems.NETHERITE_HAMMER, + EndItems.AETERNIUM_HAMMER, + EndBlocks.THALLASIUM.hammer, + EndBlocks.TERMINITE.hammer + ) + )); + TagHelper.addTag(FURNACES, Blocks.FURNACE); TagHelper.addTag(BlockTags.ANVIL, EndBlocks.AETERNIUM_ANVIL); - + TagHelper.addTag(BlockTags.BEACON_BASE_BLOCKS, EndBlocks.AETERNIUM_BLOCK); TagHelper.addTag(ItemTags.BEACON_PAYMENT_ITEMS, EndItems.AETERNIUM_INGOT); - - TagHelper.addTag(EndTags.DRAGON_IMMUNE, EndBlocks.ENDER_ORE, EndBlocks.ETERNAL_PEDESTAL, - EndBlocks.FLAVOLITE_RUNED_ETERNAL, EndBlocks.FLAVOLITE_RUNED); + + TagHelper.addTag(EndTags.DRAGON_IMMUNE, EndBlocks.ENDER_ORE, EndBlocks.ETERNAL_PEDESTAL, EndBlocks.FLAVOLITE_RUNED_ETERNAL, EndBlocks.FLAVOLITE_RUNED); } - + public static void addSurfaceBlock(Block block) { TagHelper.addTag(END_GROUND, block); TagHelper.addTag(GEN_TERRAIN, block); } - + public static void addTerrainTags(Registry biomeRegistry) { biomeRegistry.forEach((biome) -> { - if (biome.getCategory() == Category.THEEND) { - SurfaceConfig config = biome.getGenerationSettings().getSurfaceBuilderConfig(); + if (biome.getBiomeCategory() == BiomeCategory.THEEND) { + SurfaceBuilderConfiguration config = biome.getGenerationSettings().getSurfaceBuilderConfig(); Block under = config.getUnderMaterial().getBlock(); Block surface = config.getTopMaterial().getBlock(); TagHelper.addTag(GEN_TERRAIN, under, surface); TagHelper.addTag(END_GROUND, surface); } }); - END_STONES.values().forEach(EndTags::addSurfaceBlock); + END_STONES.getValues().forEach(EndTags::addSurfaceBlock); } - + public static Tag registerFabricItemTag(String name) { return TagRegistry.item(new ResourceLocation("fabric", name)); } diff --git a/src/main/java/ru/betterend/registry/FilaluxBlock.java b/src/main/java/ru/betterend/registry/FilaluxBlock.java index eeb40f93..4ca2c82f 100644 --- a/src/main/java/ru/betterend/registry/FilaluxBlock.java +++ b/src/main/java/ru/betterend/registry/FilaluxBlock.java @@ -1,15 +1,15 @@ package ru.betterend.registry; -import net.minecraft.world.level.block.AbstractBlock; +import net.minecraft.world.level.block.state.BlockBehaviour; import ru.betterend.blocks.basis.VineBlock; public class FilaluxBlock extends VineBlock { public FilaluxBlock() { super(15, true); } - + @Override - public AbstractBlock.OffsetType getOffsetType() { - return AbstractBlock.OffsetType.NONE; + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.NONE; } } diff --git a/src/main/java/ru/betterend/registry/FilaluxWingsBlock.java b/src/main/java/ru/betterend/registry/FilaluxWingsBlock.java index 12a8e20b..12b7f789 100644 --- a/src/main/java/ru/betterend/registry/FilaluxWingsBlock.java +++ b/src/main/java/ru/betterend/registry/FilaluxWingsBlock.java @@ -6,43 +6,42 @@ import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.world.level.block.SoundType; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.basis.AttachedBlock; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; public class FilaluxWingsBlock extends AttachedBlock implements IRenderTypeable { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); - + public FilaluxWingsBlock() { - super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).sounds(SoundType.WET_GRASS) - .noCollision()); + super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).sound(SoundType.WET_GRASS).noCollission()); } @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return BOUNDING_SHAPES.get(state.getValue(FACING)); } - + static { - BOUNDING_SHAPES.put(Direction.UP, VoxelShapes.cuboid(0.0, 0.0, 0.0, 1.0, 0.5, 1.0)); - BOUNDING_SHAPES.put(Direction.DOWN, VoxelShapes.cuboid(0.0, 0.5, 0.0, 1.0, 1.0, 1.0)); - BOUNDING_SHAPES.put(Direction.NORTH, VoxelShapes.cuboid(0.0, 0.0, 0.5, 1.0, 1.0, 1.0)); - BOUNDING_SHAPES.put(Direction.SOUTH, VoxelShapes.cuboid(0.0, 0.0, 0.0, 1.0, 1.0, 0.5)); - BOUNDING_SHAPES.put(Direction.WEST, VoxelShapes.cuboid(0.5, 0.0, 0.0, 1.0, 1.0, 1.0)); - BOUNDING_SHAPES.put(Direction.EAST, VoxelShapes.cuboid(0.0, 0.0, 0.0, 0.5, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.UP, Shapes.box(0.0, 0.0, 0.0, 1.0, 0.5, 1.0)); + BOUNDING_SHAPES.put(Direction.DOWN, Shapes.box(0.0, 0.5, 0.0, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.NORTH, Shapes.box(0.0, 0.0, 0.5, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.SOUTH, Shapes.box(0.0, 0.0, 0.0, 1.0, 1.0, 0.5)); + BOUNDING_SHAPES.put(Direction.WEST, Shapes.box(0.5, 0.0, 0.0, 1.0, 1.0, 1.0)); + BOUNDING_SHAPES.put(Direction.EAST, Shapes.box(0.0, 0.0, 0.0, 0.5, 1.0, 1.0)); } } diff --git a/src/main/java/ru/betterend/registry/PondAnemoneBlock.java b/src/main/java/ru/betterend/registry/PondAnemoneBlock.java index 8b6073cb..4ac7e185 100644 --- a/src/main/java/ru/betterend/registry/PondAnemoneBlock.java +++ b/src/main/java/ru/betterend/registry/PondAnemoneBlock.java @@ -6,30 +6,34 @@ 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.world.level.block.AbstractBlock; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.block.ShapeContext; -import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.world.level.block.SoundType; import net.minecraft.core.BlockPos; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.core.particles.ParticleTypes; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.basis.UnderwaterPlantBlock; public class PondAnemoneBlock extends UnderwaterPlantBlock { - private static final VoxelShape SHAPE = Block.createCuboidShape(2, 0, 2, 14, 14, 14); - + private static final VoxelShape SHAPE = Block.box(2, 0, 2, 14, 14, 14); + public PondAnemoneBlock() { - super(FabricBlockSettings.of(Material.UNDERWATER_PLANT).breakByTool(FabricToolTags.SHEARS) - .sounds(SoundType.CORAL).breakByHand(true).luminance(13).noCollision()); + super(FabricBlockSettings.of(Material.WATER_PLANT) + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .luminance(13) + .sound(SoundType.CORAL_BLOCK) + .noCollission()); } - + @Override - public AbstractBlock.OffsetType getOffsetType() { - return AbstractBlock.OffsetType.NONE; + public BlockBehaviour.OffsetType getOffsetType() { + return BlockBehaviour.OffsetType.NONE; } @Environment(EnvType.CLIENT) @@ -39,19 +43,19 @@ public class PondAnemoneBlock extends UnderwaterPlantBlock { double z = pos.getZ() + random.nextDouble(); world.addParticle(ParticleTypes.BUBBLE, x, y, z, 0.0D, 0.0D, 0.0D); } - + @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPE; } - + @Override - public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { + public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { return false; } @Override - public boolean canGrow(Level world, Random random, BlockPos pos, BlockState state) { + public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return false; } } diff --git a/src/main/java/ru/betterend/rituals/EternalRitual.java b/src/main/java/ru/betterend/rituals/EternalRitual.java index 964cef7c..56e58413 100644 --- a/src/main/java/ru/betterend/rituals/EternalRitual.java +++ b/src/main/java/ru/betterend/rituals/EternalRitual.java @@ -8,35 +8,34 @@ import java.util.Set; import java.util.function.Predicate; import com.google.common.collect.Lists; -import net.minecraft.world.chunk.ChunkSection; -import net.minecraft.world.chunk.WorldChunk; import org.jetbrains.annotations.Nullable; import com.google.common.collect.Sets; - -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.item.Item; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtHelper; -import net.minecraft.core.particles.BlockStateParticleEffect; -import net.minecraft.core.particles.ParticleOptions; -import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.sounds.SoundSource; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Registry; -import net.minecraft.world.Heightmap; +import net.minecraft.core.particles.BlockParticleOption; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.data.worldgen.Features; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.item.Item; import net.minecraft.world.level.Level; -import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.chunk.LevelChunkSection; import net.minecraft.world.level.dimension.DimensionType; -import net.minecraft.world.level.levelgen.feature.ConfiguredFeatures; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.material.Material; import ru.betterend.BetterEnd; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.EndPortalBlock; @@ -47,15 +46,22 @@ import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndPortals; public class EternalRitual { - private final static Set STRUCTURE_MAP = Sets.newHashSet(new Point(-4, -5), new Point(-4, 5), - new Point(-6, 0), new Point(4, -5), new Point(4, 5), new Point(6, 0)); - private final static Set FRAME_MAP = Sets.newHashSet(new Point(0, 0), new Point(0, 6), new Point(1, 0), - new Point(1, 6), new Point(2, 1), new Point(2, 5), new Point(3, 2), new Point(3, 3), new Point(3, 4)); - private final static Set PORTAL_MAP = Sets.newHashSet(new Point(0, 0), new Point(0, 1), new Point(0, 2), - new Point(0, 3), new Point(0, 4), new Point(1, 0), new Point(1, 1), new Point(1, 2), new Point(1, 3), - new Point(1, 4), new Point(2, 1), new Point(2, 2), new Point(2, 3)); - private final static Set BASE_MAP = Sets.newHashSet(new Point(3, 0), new Point(2, 0), new Point(2, 1), - new Point(1, 1), new Point(1, 2), new Point(0, 1), new Point(0, 2)); + private final static Set STRUCTURE_MAP = Sets.newHashSet( + new Point(-4, -5), new Point(-4, 5), new Point(-6, 0), + new Point(4, -5), new Point(4, 5), new Point(6, 0)); + private final static Set FRAME_MAP = Sets.newHashSet( + new Point(0, 0), new Point(0, 6), new Point(1, 0), + new Point(1, 6), new Point(2, 1), new Point(2, 5), + new Point(3, 2), new Point(3, 3), new Point(3, 4)); + private final static Set PORTAL_MAP = Sets.newHashSet( + new Point(0, 0), new Point(0, 1), new Point(0, 2), + new Point(0, 3), new Point(0, 4), new Point(1, 0), + new Point(1, 1), new Point(1, 2), new Point(1, 3), + new Point(1, 4), new Point(2, 1), new Point(2, 2), + new Point(2, 3)); + private final static Set BASE_MAP = Sets.newHashSet( + new Point(3, 0), new Point(2, 0), new Point(2, 1), new Point(1, 1), + new Point(1, 2), new Point(0, 1), new Point(0, 2)); private final static Block BASE = EndBlocks.FLAVOLITE.tiles; private final static Block PEDESTAL = EndBlocks.ETERNAL_PEDESTAL; @@ -91,17 +97,18 @@ public class EternalRitual { } private boolean isInvalid() { - return world == null || world.isClientSide() || center == null || axis == null; + return world == null || world.isClientSide() || + center == null || axis == null; } public void checkStructure() { - if (isInvalid()) - return; + if (isInvalid()) return; Direction moveX, moveY; if (Direction.Axis.X == axis) { moveX = Direction.EAST; moveY = Direction.NORTH; - } else { + } + else { moveX = Direction.SOUTH; moveY = Direction.EAST; } @@ -114,7 +121,7 @@ public class EternalRitual { if (valid) { EternalPedestalEntity pedestal = (EternalPedestalEntity) world.getBlockEntity(checkPos); if (pedestal != null) { - Item pItem = pedestal.getStack(0).getItem(); + Item pItem = pedestal.getItem(0).getItem(); if (item == null) { item = pItem; } else if (!item.equals(pItem)) { @@ -147,9 +154,8 @@ public class EternalRitual { } private void activatePortal(Item keyItem) { - if (active) - return; - ResourceLocation itemId = Registry.ITEM.getId(keyItem); + if (active) return; + ResourceLocation itemId = Registry.ITEM.getKey(keyItem); int portalId = EndPortals.getPortalIdByItem(itemId); Level targetWorld = getTargetWorld(portalId); ResourceLocation worldId = targetWorld.dimension().location(); @@ -186,66 +192,59 @@ public class EternalRitual { if (Direction.Axis.X == axis) { moveX = Direction.EAST; moveY = Direction.NORTH; - } else { + } + else { moveX = Direction.SOUTH; moveY = Direction.EAST; } for (Point pos : STRUCTURE_MAP) { BlockPos.MutableBlockPos p = center.mutable(); p.move(moveX, pos.x).move(moveY, pos.y); - serverWorld.sendParticles(ParticleTypes.PORTAL, p.getX() + 0.5, p.getY() + 1.5, p.getZ() + 0.5, 20, 0, 0, 0, - 1); - serverWorld.sendParticles(ParticleTypes.REVERSE_PORTAL, p.getX() + 0.5, p.getY() + 1.5, p.getZ() + 0.5, 20, - 0, 0, 0, 0.3); + serverWorld.sendParticles(ParticleTypes.PORTAL, p.getX() + 0.5, p.getY() + 1.5, p.getZ() + 0.5, 20, 0, 0, 0, 1); + serverWorld.sendParticles(ParticleTypes.REVERSE_PORTAL, p.getX() + 0.5, p.getY() + 1.5, p.getZ() + 0.5, 20, 0, 0, 0, 0.3); } - serverWorld.playSound(null, center, SoundEvents.BLOCK_END_PORTAL_SPAWN, SoundSource.NEUTRAL, 16, 1); + serverWorld.playSound(null, center, SoundEvents.END_PORTAL_SPAWN, SoundSource.NEUTRAL, 16, 1); } private void activatePortal(Level world, BlockPos center, int portalId) { BlockPos framePos = center.below(); Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH : Direction.EAST; - BlockState frame = FRAME.defaultBlockState().with(ACTIVE, true); + BlockState frame = FRAME.defaultBlockState().setValue(ACTIVE, true); FRAME_MAP.forEach(point -> { BlockPos pos = framePos.mutable().move(moveDir, point.x).move(Direction.UP, point.y); BlockState state = world.getBlockState(pos); - if (state.contains(ACTIVE) && !state.getValue(ACTIVE)) { + if (state.hasProperty(ACTIVE) && !state.getValue(ACTIVE)) { world.setBlockAndUpdate(pos, frame); } pos = framePos.mutable().move(moveDir, -point.x).move(Direction.UP, point.y); state = world.getBlockState(pos); - if (state.contains(ACTIVE) && !state.getValue(ACTIVE)) { + if (state.hasProperty(ACTIVE) && !state.getValue(ACTIVE)) { world.setBlockAndUpdate(pos, frame); } }); Direction.Axis portalAxis = Direction.Axis.X == axis ? Direction.Axis.Z : Direction.Axis.X; - BlockState portal = PORTAL.defaultBlockState().with(EndPortalBlock.AXIS, portalAxis).with(EndPortalBlock.PORTAL, - portalId); - ParticleOptions effect = new BlockStateParticleEffect(ParticleTypes.BLOCK, portal); + BlockState portal = PORTAL.defaultBlockState().setValue(EndPortalBlock.AXIS, portalAxis).setValue(EndPortalBlock.PORTAL, portalId); + ParticleOptions effect = new BlockParticleOption(ParticleTypes.BLOCK, portal); ServerLevel serverWorld = (ServerLevel) world; PORTAL_MAP.forEach(point -> { BlockPos pos = center.mutable().move(moveDir, point.x).move(Direction.UP, point.y); if (!world.getBlockState(pos).is(PORTAL)) { world.setBlockAndUpdate(pos, portal); - serverWorld.sendParticles(effect, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 10, 0.5, 0.5, - 0.5, 0.1); - serverWorld.sendParticles(ParticleTypes.REVERSE_PORTAL, pos.getX() + 0.5, pos.getY() + 0.5, - pos.getZ() + 0.5, 10, 0.5, 0.5, 0.5, 0.3); + serverWorld.sendParticles(effect, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 10, 0.5, 0.5, 0.5, 0.1); + serverWorld.sendParticles(ParticleTypes.REVERSE_PORTAL, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 10, 0.5, 0.5, 0.5, 0.3); } pos = center.mutable().move(moveDir, -point.x).move(Direction.UP, point.y); if (!world.getBlockState(pos).is(PORTAL)) { world.setBlockAndUpdate(pos, portal); - serverWorld.sendParticles(effect, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 10, 0.5, 0.5, - 0.5, 0.1); - serverWorld.sendParticles(ParticleTypes.REVERSE_PORTAL, pos.getX() + 0.5, pos.getY() + 0.5, - pos.getZ() + 0.5, 10, 0.5, 0.5, 0.5, 0.3); + serverWorld.sendParticles(effect, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 10, 0.5, 0.5, 0.5, 0.1); + serverWorld.sendParticles(ParticleTypes.REVERSE_PORTAL, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 10, 0.5, 0.5, 0.5, 0.3); } }); } public void disablePortal(int state) { - if (!active || isInvalid()) - return; + if (!active || isInvalid()) return; removePortal(getTargetWorld(state), exit); removePortal(world, center); } @@ -257,12 +256,12 @@ public class EternalRitual { BlockPos pos = framePos.mutable().move(moveDir, point.x).move(Direction.UP, point.y); BlockState state = world.getBlockState(pos); if (state.is(FRAME) && state.getValue(ACTIVE)) { - world.setBlockAndUpdate(pos, state.with(ACTIVE, false)); + world.setBlockAndUpdate(pos, state.setValue(ACTIVE, false)); } pos = framePos.mutable().move(moveDir, -point.x).move(Direction.UP, point.y); state = world.getBlockState(pos); if (state.is(FRAME) && state.getValue(ACTIVE)) { - world.setBlockAndUpdate(pos, state.with(ACTIVE, false)); + world.setBlockAndUpdate(pos, state.setValue(ACTIVE, false)); } }); PORTAL_MAP.forEach(point -> { @@ -281,8 +280,8 @@ public class EternalRitual { @Nullable private BlockPos findFrame(Level world, BlockPos.MutableBlockPos startPos) { List foundPos = findAllBlockPos(world, startPos, (SEARCH_RADIUS >> 4) + 1, FRAME, - blockState -> blockState.is(FRAME) && !blockState.get(ACTIVE)); - for (BlockPos.MutableBlockPos testPos : foundPos) { + blockState -> blockState.is(FRAME) && !blockState.getValue(ACTIVE)); + for(BlockPos.MutableBlockPos testPos : foundPos) { if (checkFrame(world, testPos)) { return testPos; } @@ -295,14 +294,13 @@ public class EternalRitual { ServerLevel targetWorld = (ServerLevel) getTargetWorld(portalId); Registry registry = Objects.requireNonNull(server).registryAccess().dimensionTypes(); double multiplier = Objects.requireNonNull(registry.get(targetWorldId)).coordinateScale(); - BlockPos.MutableBlockPos basePos = center.mutable().set(center.getX() / multiplier, center.getY(), - center.getZ() / multiplier); + BlockPos.MutableBlockPos basePos = center.mutable().set(center.getX() / multiplier, center.getY(), center.getZ() / multiplier); BlockPos framePos = findFrame(targetWorld, basePos.mutable()); if (framePos != null) { - return framePos.up(); + return framePos.above(); } Direction.Axis portalAxis = (Direction.Axis.X == axis) ? Direction.Axis.Z : Direction.Axis.X; - int worldCeil = targetWorld.getDimensionHeight() - 1; + int worldCeil = targetWorld.getHeight() - 1; if (checkIsAreaValid(targetWorld, basePos, portalAxis)) { generatePortal(targetWorld, basePos, portalAxis, portalId); return basePos.immutable(); @@ -312,18 +310,15 @@ public class EternalRitual { int radius = (int) ((SEARCH_RADIUS / multiplier) + 1); for (int step = 1; step < radius; step++) { for (int i = 0; i < (step >> 1); i++) { - Chunk chunk = targetWorld.getChunk(checkPos); + ChunkAccess chunk = targetWorld.getChunk(checkPos); if (chunk != null) { - int surfaceY = chunk.sampleHeightmap(Heightmap.Type.WORLD_SURFACE, checkPos.getX() & 15, - checkPos.getZ() & 15); - int motionY = chunk.sampleHeightmap(Heightmap.Type.MOTION_BLOCKING, checkPos.getX() & 15, - checkPos.getZ() & 15); + int surfaceY = chunk.getHeight(Heightmap.Types.WORLD_SURFACE, checkPos.getX() & 15, checkPos.getZ() & 15); + int motionY = chunk.getHeight(Heightmap.Types.MOTION_BLOCKING, checkPos.getX() & 15, checkPos.getZ() & 15); int ceil = Math.min(Math.max(surfaceY, motionY) + 1, worldCeil); - if (ceil < 5) - continue; + if (ceil < 5) continue; checkPos.setY(ceil); while (checkPos.getY() >= 5) { - if (checkIsAreaValid(targetWorld, checkPos, portalAxis)) { + if(checkIsAreaValid(targetWorld, checkPos, portalAxis)) { generatePortal(targetWorld, checkPos, portalAxis, portalId); return checkPos.immutable(); } @@ -336,44 +331,40 @@ public class EternalRitual { } } if (targetWorld.dimension() == Level.END) { - ConfiguredFeatures.END_ISLAND.generate(targetWorld, targetWorld.getChunkManager().getChunkGenerator(), - new Random(basePos.asLong()), basePos.below()); + Features.END_ISLAND.place(targetWorld, targetWorld.getChunkSource().getGenerator(), new Random(basePos.asLong()), basePos.below()); } else if (targetWorld.dimension() == Level.OVERWORLD) { - basePos.setY(targetWorld.getChunk(basePos).sampleHeightmap(Heightmap.Type.WORLD_SURFACE, basePos.getX(), - basePos.getZ()) + 1); + basePos.setY(targetWorld.getChunk(basePos).getHeight(Heightmap.Types.WORLD_SURFACE, basePos.getX(), basePos.getZ()) + 1); } - EndFeatures.BIOME_ISLAND.getFeatureConfigured().generate(targetWorld, - targetWorld.getChunkManager().getChunkGenerator(), new Random(basePos.asLong()), basePos.below()); + EndFeatures.BIOME_ISLAND.getFeatureConfigured().place(targetWorld, targetWorld.getChunkSource().getGenerator(), new Random(basePos.asLong()), basePos.below()); generatePortal(targetWorld, basePos, portalAxis, portalId); return basePos.immutable(); } private Level getTargetWorld(int state) { if (world.dimension() == Level.END) { - return EndPortals.getLevel(world.getServer(), state); + return EndPortals.getWorld(world.getServer(), state); } return Objects.requireNonNull(world.getServer()).getLevel(Level.END); } private boolean checkIsAreaValid(Level world, BlockPos pos, Direction.Axis axis) { - if (pos.getY() >= world.getDimensionHeight() - 1) - return false; - if (!isBaseValid(world, pos, axis)) - return false; + if (pos.getY() >= world.getHeight() - 1) return false; + if (!isBaseValid(world, pos, axis)) return false; return EternalRitual.checkArea(world, pos, axis); } private boolean isBaseValid(Level world, BlockPos pos, Direction.Axis axis) { boolean solid = true; if (axis.equals(Direction.Axis.X)) { - pos = pos.below().add(0, 0, -3); + pos = pos.below().offset(0, 0, -3); for (int i = 0; i < 7; i++) { BlockPos checkPos = pos.offset(0, 0, i); BlockState state = world.getBlockState(checkPos); solid &= validBlock(world, checkPos, state); } - } else { - pos = pos.below().add(-3, 0, 0); + } + else { + pos = pos.below().offset(-3, 0, 0); for (int i = 0; i < 7; i++) { BlockPos checkPos = pos.offset(i, 0, 0); BlockState state = world.getBlockState(checkPos); @@ -384,7 +375,7 @@ public class EternalRitual { } private boolean validBlock(Level world, BlockPos pos, BlockState state) { - return state.isSolidBlock(world, pos) && state.isFullCube(world, pos); + return state.isRedstoneConductor(world, pos) && state.isCollisionShapeFullBlock(world, pos); } public void configure(BlockPos initial) { @@ -481,24 +472,24 @@ public class EternalRitual { } public CompoundTag toTag(CompoundTag tag) { - tag.put("center", NbtHelper.fromBlockPos(center)); + tag.put("center", NbtUtils.writeBlockPos(center)); tag.putString("axis", axis.getName()); tag.putBoolean("active", active); if (targetWorldId != null) { tag.putString("key_item", targetWorldId.toString()); } if (exit != null) { - tag.put("exit", NbtHelper.fromBlockPos(exit)); + tag.put("exit", NbtUtils.writeBlockPos(exit)); } return tag; } public void fromTag(CompoundTag tag) { - axis = Direction.Axis.fromName(tag.getString("axis")); - center = NbtHelper.toBlockPos(tag.getCompound("center")); + axis = Direction.Axis.byName(tag.getString("axis")); + center = NbtUtils.readBlockPos(tag.getCompound("center")); active = tag.getBoolean("active"); if (tag.contains("exit")) { - exit = NbtHelper.toBlockPos(tag.getCompound("exit")); + exit = NbtUtils.readBlockPos(tag.getCompound("exit")); } if (tag.contains("key_item")) { targetWorldId = new ResourceLocation(tag.getString("key_item")); @@ -507,26 +498,25 @@ public class EternalRitual { @Override public boolean equals(Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; EternalRitual ritual = (EternalRitual) o; - return world.equals(ritual.world) && Objects.equals(center, ritual.center) && Objects.equals(exit, ritual.exit); + return world.equals(ritual.world) && + Objects.equals(center, ritual.center) && + Objects.equals(exit, ritual.exit); } public static void generatePortal(Level world, BlockPos center, Direction.Axis axis, int portalId) { BlockPos framePos = center.below(); Direction moveDir = Direction.Axis.X == axis ? Direction.EAST : Direction.NORTH; - BlockState frame = FRAME.defaultBlockState().with(ACTIVE, true); + BlockState frame = FRAME.defaultBlockState().setValue(ACTIVE, true); FRAME_MAP.forEach(point -> { BlockPos pos = framePos.mutable().move(moveDir, point.x).move(Direction.UP, point.y); world.setBlockAndUpdate(pos, frame); pos = framePos.mutable().move(moveDir, -point.x).move(Direction.UP, point.y); world.setBlockAndUpdate(pos, frame); }); - BlockState portal = PORTAL.defaultBlockState().with(EndPortalBlock.AXIS, axis).with(EndPortalBlock.PORTAL, - portalId); + BlockState portal = PORTAL.defaultBlockState().setValue(EndPortalBlock.AXIS, axis).setValue(EndPortalBlock.PORTAL, portalId); PORTAL_MAP.forEach(point -> { BlockPos pos = center.mutable().move(moveDir, point.x).move(Direction.UP, point.y); world.setBlockAndUpdate(pos, portal); @@ -553,57 +543,50 @@ public class EternalRitual { public static boolean checkArea(Level world, BlockPos center, Direction.Axis axis) { Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH : Direction.EAST; - for (BlockPos checkPos : BlockPos.iterate(center.offset(moveDir.getClockWise()), - center.offset(moveDir.rotateYCounterclockwise()))) { + for (BlockPos checkPos : BlockPos.betweenClosed(center.relative(moveDir.getClockWise()), center.relative(moveDir.getCounterClockWise()))) { for (Point point : PORTAL_MAP) { BlockPos pos = checkPos.mutable().move(moveDir, point.x).move(Direction.UP, point.y); BlockState state = world.getBlockState(pos); - if (isStateInvalid(state)) - return false; + if (isStateInvalid(state)) return false; pos = checkPos.mutable().move(moveDir, -point.x).move(Direction.UP, point.y); state = world.getBlockState(pos); - if (isStateInvalid(state)) - return false; + if (isStateInvalid(state)) return false; } } return true; } private static boolean isStateInvalid(BlockState state) { - if (!state.getFluidState().isEmpty()) - return true; + if (!state.getFluidState().isEmpty()) return true; Material material = state.getMaterial(); return !material.isReplaceable() && !material.equals(Material.PLANT); } /** - * @param world Level for search - * @param checkPos Start search position - * @param radius Search radius + * @param world World for search + * @param checkPos Start search position + * @param radius Search radius * @param searchBlock Target block - * @param condition Predicate for test block states in the chunk section + * @param condition Predicate for test block states in the chunk section * * @return Position of the first found block or null. */ @Nullable - public static BlockPos.MutableBlockPos findBlockPos(Level world, BlockPos.MutableBlockPos checkPos, int radius, - Block searchBlock, Predicate condition) { + public static BlockPos.MutableBlockPos findBlockPos(Level world, BlockPos.MutableBlockPos checkPos, int radius, Block searchBlock, Predicate condition) { Direction moveDirection = Direction.EAST; for (int step = 1; step < radius; step++) { for (int i = 0; i < (step >> 1); i++) { - Chunk chunk = world.getChunk(checkPos); - if (!(chunk instanceof WorldChunk) || ((WorldChunk) chunk).isEmpty()) - continue; - for (ChunkSection section : chunk.getSectionArray()) { - if (section == null || !section.getContainer().hasAny(condition)) - continue; + ChunkAccess chunk = world.getChunk(checkPos); + if (!(chunk instanceof LevelChunk) || ((LevelChunk) chunk).isEmpty()) continue; + for (LevelChunkSection section : chunk.getSections()) { + if (section == null || !section.getStates().maybeHas(condition)) continue; for (int x = 0; x < 16; x++) { for (int y = 0; y < 16; y++) { - for (int z = 0; z < 16; z++) { + for(int z = 0; z < 16; z++) { BlockState checkState = section.getBlockState(x, y, z); if (checkState.is(searchBlock)) { int worldX = (chunk.getPos().x << 4) + x; - int worldY = section.getYOffset() + y; + int worldY = section.bottomBlockY() + y; int worldZ = (chunk.getPos().z << 4) + z; checkPos.set(worldX, worldY, worldZ); return checkPos; @@ -620,33 +603,30 @@ public class EternalRitual { } /** - * @param world Level for search - * @param checkPos Start search position - * @param radius Search radius + * @param world World for search + * @param checkPos Start search position + * @param radius Search radius * @param searchBlock Target block - * @param condition Predicate for test block states in the chunk section + * @param condition Predicate for test block states in the chunk section * * @return List of positions of the all found blocks or empty list. */ - public static List findAllBlockPos(Level world, BlockPos.MutableBlockPos checkPos, - int radius, Block searchBlock, Predicate condition) { + public static List findAllBlockPos(Level world, BlockPos.MutableBlockPos checkPos, int radius, Block searchBlock, Predicate condition) { List posFound = Lists.newArrayList(); Direction moveDirection = Direction.EAST; for (int step = 1; step < radius; step++) { for (int i = 0; i < (step >> 1); i++) { - Chunk chunk = world.getChunk(checkPos); - if (!(chunk instanceof WorldChunk) || ((WorldChunk) chunk).isEmpty()) - continue; - for (ChunkSection section : chunk.getSectionArray()) { - if (section == null || !section.getContainer().hasAny(condition)) - continue; + ChunkAccess chunk = world.getChunk(checkPos); + if (!(chunk instanceof LevelChunk) || ((LevelChunk) chunk).isEmpty()) continue; + for (LevelChunkSection section : chunk.getSections()) { + if (section == null || !section.getStates().maybeHas(condition)) continue; for (int x = 0; x < 16; x++) { for (int y = 0; y < 16; y++) { - for (int z = 0; z < 16; z++) { + for(int z = 0; z < 16; z++) { BlockState checkState = section.getBlockState(x, y, z); if (checkState.is(searchBlock)) { int worldX = (chunk.getPos().x << 4) + x; - int worldY = section.getYOffset() + y; + int worldY = section.bottomBlockY() + y; int worldZ = (chunk.getPos().z << 4) + z; checkPos.set(worldX, worldY, worldZ); posFound.add(checkPos.mutable()); diff --git a/src/main/java/ru/betterend/rituals/InfusionRitual.java b/src/main/java/ru/betterend/rituals/InfusionRitual.java index fc589e14..9939c3cf 100644 --- a/src/main/java/ru/betterend/rituals/InfusionRitual.java +++ b/src/main/java/ru/betterend/rituals/InfusionRitual.java @@ -1,24 +1,25 @@ package ru.betterend.rituals; import java.awt.Point; - -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.inventory.Inventory; -import net.minecraft.world.item.ItemStack; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.server.level.ServerLevel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +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.ItemStack; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; import ru.betterend.blocks.entities.InfusionPedestalEntity; import ru.betterend.blocks.entities.PedestalBlockEntity; import ru.betterend.particle.InfusionParticleType; import ru.betterend.recipe.builders.InfusionRecipe; -public class InfusionRitual implements Inventory { - private static final Point[] PEDESTALS_MAP = new Point[] { new Point(0, 3), new Point(2, 2), new Point(3, 0), - new Point(2, -2), new Point(0, -3), new Point(-2, -2), new Point(-3, 0), new Point(-2, 2) }; +public class InfusionRitual implements Container { + private static final Point[] PEDESTALS_MAP = new Point[] { + new Point(0, 3), new Point(2, 2), new Point(3, 0), new Point(2, -2), + new Point(0, -3), new Point(-2, -2), new Point(-3, 0), new Point(-2, 2) + }; private Level world; private BlockPos worldPos; @@ -27,31 +28,29 @@ public class InfusionRitual implements Inventory { private boolean hasRecipe = false; private int progress = 0; private int time = 0; - + private InfusionPedestalEntity input; private final PedestalBlockEntity[] catalysts = new PedestalBlockEntity[8]; - + public InfusionRitual(Level world, BlockPos pos) { this.world = world; this.worldPos = pos; this.configure(); } - + public static Point[] getMap() { return PEDESTALS_MAP; } - + public void configure() { - if (world == null || world.isClientSide || worldPos == null) - return; + if (world == null || world.isClientSide || worldPos == null) return; BlockEntity inputEntity = world.getBlockEntity(worldPos); if (inputEntity instanceof InfusionPedestalEntity) { input = (InfusionPedestalEntity) inputEntity; } int i = 0; - for (Point point : PEDESTALS_MAP) { - BlockPos.MutableBlockPos checkPos = worldPos.mutable().move(Direction.EAST, point.x).move(Direction.NORTH, - point.y); + for(Point point : PEDESTALS_MAP) { + BlockPos.MutableBlockPos checkPos = worldPos.mutable().move(Direction.EAST, point.x).move(Direction.NORTH, point.y); BlockEntity catalystEntity = world.getBlockEntity(checkPos); if (catalystEntity instanceof PedestalBlockEntity) { catalysts[i] = (PedestalBlockEntity) catalystEntity; @@ -61,11 +60,10 @@ public class InfusionRitual implements Inventory { } } } - + public boolean checkRecipe() { - if (!isValid()) - return false; - InfusionRecipe recipe = world.getRecipeManager().getFirstMatch(InfusionRecipe.TYPE, this, world).orElse(null); + if (!isValid()) return false; + InfusionRecipe recipe = world.getRecipeManager().getRecipeFor(InfusionRecipe.TYPE, this, world).orElse(null); if (hasRecipe()) { if (recipe == null) { stop(); @@ -74,7 +72,7 @@ public class InfusionRitual implements Inventory { activeRecipe = recipe; time = activeRecipe.getInfusionTime(); progress = 0; - markDirty(); + setChanged(); } else if (activeRecipe == null) { activeRecipe = recipe; } @@ -85,47 +83,45 @@ public class InfusionRitual implements Inventory { time = activeRecipe.getInfusionTime(); hasRecipe = true; progress = 0; - markDirty(); + setChanged(); return true; } return false; } - + public void stop() { activeRecipe = null; hasRecipe = false; progress = 0; time = 0; - markDirty(); + setChanged(); } - + public void tick() { if (isDirty) { configure(); isDirty = false; } - if (!isValid() || !hasRecipe()) - return; - if (!checkRecipe()) - return; + if (!isValid() || !hasRecipe()) return; + if (!checkRecipe()) return; progress++; if (progress == time) { - input.removeStack(0); - input.setStack(0, activeRecipe.craft(this)); + input.removeItemNoUpdate(0); + input.setItem(0, activeRecipe.assemble(this)); for (PedestalBlockEntity catalyst : catalysts) { - catalyst.removeStack(0); + catalyst.removeItemNoUpdate(0); } stop(); } else { ServerLevel world = (ServerLevel) this.world; - BlockPos target = worldPos.up(); + BlockPos target = worldPos.above(); double tx = target.getX() + 0.5; double ty = target.getY() + 0.5; double tz = target.getZ() + 0.5; for (PedestalBlockEntity catalyst : catalysts) { - ItemStack stack = catalyst.getStack(0); + ItemStack stack = catalyst.getItem(0); if (!stack.isEmpty()) { - BlockPos start = catalyst.getPos(); + BlockPos start = catalyst.getBlockPos(); double sx = start.getX() + 0.5; double sy = start.getY() + 1.25; double sz = start.getZ() + 0.5; @@ -133,24 +129,22 @@ public class InfusionRitual implements Inventory { } } } - + } - + @Override - public boolean isValid(int slot, ItemStack stack) { + public boolean canPlaceItem(int slot, ItemStack stack) { return isValid(); } - + public boolean isValid() { - if (world == null || world.isClientSide || worldPos == null || input == null) - return false; + if (world == null || world.isClientSide || worldPos == null || input == null) return false; for (PedestalBlockEntity catalyst : catalysts) { - if (catalyst == null) - return false; + if (catalyst == null) return false; } return true; } - + public boolean hasRecipe() { return hasRecipe; } @@ -162,17 +156,16 @@ public class InfusionRitual implements Inventory { } @Override - public void clear() { - if (!isValid()) - return; - input.clear(); + public void clearContent() { + if (!isValid()) return; + input.clearContent(); for (PedestalBlockEntity catalyst : catalysts) { - catalyst.clear(); + catalyst.clearContent(); } } @Override - public int size() { + public int getContainerSize() { return 9; } @@ -182,58 +175,55 @@ public class InfusionRitual implements Inventory { } @Override - public ItemStack getStack(int slot) { - if (slot > 8) - return ItemStack.EMPTY; + public ItemStack getItem(int slot) { + if (slot > 8) return ItemStack.EMPTY; if (slot == 0) { - return input.getStack(0); + return input.getItem(0); } else { - return catalysts[slot - 1].getStack(0); + return catalysts[slot - 1].getItem(0); } } @Override - public ItemStack removeStack(int slot, int amount) { - return removeStack(slot); + public ItemStack removeItem(int slot, int amount) { + return removeItemNoUpdate(slot); } @Override - public ItemStack removeStack(int slot) { - if (slot > 8) - return ItemStack.EMPTY; + public ItemStack removeItemNoUpdate(int slot) { + if (slot > 8) return ItemStack.EMPTY; if (slot == 0) { - return input.removeStack(0); + return input.removeItemNoUpdate(0); } else { - return catalysts[slot - 1].removeStack(0); + return catalysts[slot - 1].removeItemNoUpdate(0); } } @Override - public void setStack(int slot, ItemStack stack) { - if (slot > 8) - return; + public void setItem(int slot, ItemStack stack) { + if (slot > 8) return; if (slot == 0) { - input.setStack(0, stack); + input.setItem(0, stack); } else { - catalysts[slot - 1].setStack(0, stack); + catalysts[slot - 1].setItem(0, stack); } } @Override - public void markDirty() { + public void setChanged() { if (isValid()) { - input.markDirty(); + input.setChanged(); for (PedestalBlockEntity catalyst : catalysts) { - catalyst.markDirty(); + catalyst.setChanged(); } } } @Override - public boolean canPlayerUse(Player player) { + public boolean stillValid(Player player) { return true; } - + public void fromTag(CompoundTag tag) { if (tag.contains("recipe")) { hasRecipe = tag.getBoolean("recipe"); diff --git a/src/main/java/ru/betterend/util/BlocksHelper.java b/src/main/java/ru/betterend/util/BlocksHelper.java index 580a5b7e..84e3ec12 100644 --- a/src/main/java/ru/betterend/util/BlocksHelper.java +++ b/src/main/java/ru/betterend/util/BlocksHelper.java @@ -5,24 +5,22 @@ import java.util.Iterator; import java.util.Map; import java.util.Random; import java.util.Set; - -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; - -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.FallingBlock; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.Property; -import net.minecraft.tags.BlockTags; -import net.minecraft.util.BlockMirror; -import net.minecraft.world.level.block.Rotation; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Vec3i; +import net.minecraft.tags.BlockTags; import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.FallingBlock; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.Property; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; import ru.betterend.blocks.BlueVineBlock; import ru.betterend.blocks.basis.DoublePlantBlock; import ru.betterend.blocks.basis.FurBlock; @@ -32,9 +30,9 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; public class BlocksHelper { - public static final BooleanProperty ROOTS = BooleanProperty.of("roots"); + public static final BooleanProperty ROOTS = BooleanProperty.create("roots"); private static final Map COLOR_BY_BLOCK = Maps.newHashMap(); - + public static final int FLAG_UPDATE_BLOCK = 1; public static final int FLAG_SEND_CLIENT_CHANGES = 2; public static final int FLAG_NO_RERENDER = 4; @@ -45,92 +43,97 @@ public class BlocksHelper { public static final int SET_OBSERV = FLAG_UPDATE_BLOCK | FLAG_SEND_CLIENT_CHANGES; public static final Direction[] HORIZONTAL = makeHorizontal(); public static final Direction[] DIRECTIONS = Direction.values(); - + private static final MutableBlockPos POS = new MutableBlockPos(); protected static final BlockState AIR = Blocks.AIR.defaultBlockState(); protected static final BlockState WATER = Blocks.WATER.defaultBlockState(); - private static final Vec3i[] OFFSETS = new Vec3i[] { new Vec3i(-1, -1, -1), new Vec3i(-1, -1, 0), - new Vec3i(-1, -1, 1), new Vec3i(-1, 0, -1), new Vec3i(-1, 0, 0), new Vec3i(-1, 0, 1), new Vec3i(-1, 1, -1), - new Vec3i(-1, 1, 0), new Vec3i(-1, 1, 1), + private static final Vec3i[] OFFSETS = new Vec3i[] { + new Vec3i(-1, -1, -1), new Vec3i(-1, -1, 0), new Vec3i(-1, -1, 1), + new Vec3i(-1, 0, -1), new Vec3i(-1, 0, 0), new Vec3i(-1, 0, 1), + new Vec3i(-1, 1, -1), new Vec3i(-1, 1, 0), new Vec3i(-1, 1, 1), - new Vec3i(0, -1, -1), new Vec3i(0, -1, 0), new Vec3i(0, -1, 1), new Vec3i(0, 0, -1), new Vec3i(0, 0, 0), - new Vec3i(0, 0, 1), new Vec3i(0, 1, -1), new Vec3i(0, 1, 0), new Vec3i(0, 1, 1), - - new Vec3i(1, -1, -1), new Vec3i(1, -1, 0), new Vec3i(1, -1, 1), new Vec3i(1, 0, -1), new Vec3i(1, 0, 0), - new Vec3i(1, 0, 1), new Vec3i(1, 1, -1), new Vec3i(1, 1, 0), new Vec3i(1, 1, 1) }; + new Vec3i(0, -1, -1), new Vec3i(0, -1, 0), new Vec3i(0, -1, 1), + new Vec3i(0, 0, -1), new Vec3i(0, 0, 0), new Vec3i(0, 0, 1), + new Vec3i(0, 1, -1), new Vec3i(0, 1, 0), new Vec3i(0, 1, 1), + new Vec3i(1, -1, -1), new Vec3i(1, -1, 0), new Vec3i(1, -1, 1), + new Vec3i(1, 0, -1), new Vec3i(1, 0, 0), new Vec3i(1, 0, 1), + new Vec3i(1, 1, -1), new Vec3i(1, 1, 0), new Vec3i(1, 1, 1) + }; + public static void addBlockColor(Block block, int color) { COLOR_BY_BLOCK.put(block, color); } - + public static int getBlockColor(Block block) { return COLOR_BY_BLOCK.getOrDefault(block, 0xFF000000); } public static void setWithoutUpdate(LevelAccessor world, BlockPos pos, BlockState state) { - world.setBlockAndUpdate(pos, state, SET_SILENT); + world.setBlock(pos, state, SET_SILENT); } - + public static void setWithoutUpdate(LevelAccessor world, BlockPos pos, Block block) { - world.setBlockAndUpdate(pos, block.defaultBlockState(), SET_SILENT); + world.setBlock(pos, block.defaultBlockState(), SET_SILENT); } - + public static void setWithUpdate(LevelAccessor world, BlockPos pos, BlockState state) { - world.setBlockAndUpdate(pos, state, SET_OBSERV); + world.setBlock(pos, state, SET_OBSERV); } - + public static void setWithUpdate(LevelAccessor world, BlockPos pos, Block block) { - world.setBlockAndUpdate(pos, block.defaultBlockState(), SET_OBSERV); + world.setBlock(pos, block.defaultBlockState(), SET_OBSERV); } public static int upRay(LevelAccessor world, BlockPos pos, int maxDist) { int length = 0; - for (int j = 1; j < maxDist && (world.isAir(pos.up(j))); j++) + for (int j = 1; j < maxDist && (world.isEmptyBlock(pos.above(j))); j++) length++; return length; } public static int downRay(LevelAccessor world, BlockPos pos, int maxDist) { int length = 0; - for (int j = 1; j < maxDist && (world.isAir(pos.down(j))); j++) + for (int j = 1; j < maxDist && (world.isEmptyBlock(pos.below(j))); j++) length++; return length; } - + public static int downRayRep(LevelAccessor world, BlockPos pos, int maxDist) { POS.set(pos); - for (int j = 1; j < maxDist && (world.getBlockState(POS)).getMaterial().isReplaceable(); j++) { + for (int j = 1; j < maxDist && (world.getBlockState(POS)).getMaterial().isReplaceable(); j++) + { POS.setY(POS.getY() - 1); } return pos.getY() - POS.getY(); } - + public static int raycastSqr(LevelAccessor world, BlockPos pos, int dx, int dy, int dz, int maxDist) { POS.set(pos); - for (int j = 1; j < maxDist && (world.getBlockState(POS)).getMaterial().isReplaceable(); j++) { + for (int j = 1; j < maxDist && (world.getBlockState(POS)).getMaterial().isReplaceable(); j++) + { POS.move(dx, dy, dz); } - return (int) pos.getSquaredDistance(POS); + return (int) pos.distSqr(POS); } public static BlockState rotateHorizontal(BlockState state, Rotation rotation, Property facing) { - return state.with(facing, rotation.rotate(state.getValue(facing))); + return state.setValue(facing, rotation.rotate(state.getValue(facing))); } - public static BlockState mirrorHorizontal(BlockState state, BlockMirror mirror, Property facing) { + public static BlockState mirrorHorizontal(BlockState state, Mirror mirror, Property facing) { return state.rotate(mirror.getRotation(state.getValue(facing))); } public static int getLengthDown(LevelAccessor world, BlockPos pos, Block block) { int count = 1; - while (world.getBlockState(pos.down(count)).getBlock() == block) + while (world.getBlockState(pos.below(count)).getBlock() == block) count++; return count; } - public static void cover(LevelAccessor world, BlockPos center, Block ground, BlockState cover, int radius, - Random random) { + public static void cover(LevelAccessor world, BlockPos center, Block ground, BlockState cover, int radius, Random random) { HashSet points = new HashSet(); HashSet points2 = new HashSet(); if (world.getBlockState(center).getBlock() == ground) { @@ -159,7 +162,7 @@ public class BlocksHelper { } } } - + public static void fixBlocks(LevelAccessor world, BlockPos start, BlockPos end) { BlockState state; Set doubleCheck = Sets.newHashSet(); @@ -170,17 +173,17 @@ public class BlocksHelper { 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.canPlaceAt(world, POS)) { + if (!state.canSurvive(world, POS)) { setWithoutUpdate(world, POS, WATER); POS.setY(POS.getY() - 1); state = world.getBlockState(POS); - while (!state.canPlaceAt(world, POS)) { + while (!state.canSurvive(world, POS)) { state = state.getFluidState().isEmpty() ? AIR : WATER; setWithoutUpdate(world, POS, state); POS.setY(POS.getY() - 1); @@ -188,7 +191,7 @@ public class BlocksHelper { } } POS.setY(y - 1); - if (world.isAir(POS)) { + if (world.isEmptyBlock(POS)) { POS.setY(y); while (!world.getFluidState(POS).isEmpty()) { setWithoutUpdate(world, POS, AIR); @@ -197,14 +200,15 @@ public class BlocksHelper { continue; } for (Direction dir : HORIZONTAL) { - if (world.isAir(POS.offset(dir))) { - world.getFluidTickScheduler().schedule(POS, state.getFluidState().getFluid(), 0); + if (world.isEmptyBlock(POS.relative(dir))) { + world.getLiquidTicks().scheduleTick(POS, state.getFluidState().getType(), 0); break; } } - } else if (state.is(EndBlocks.SMARAGDANT_CRYSTAL)) { + } + else if (state.is(EndBlocks.SMARAGDANT_CRYSTAL)) { POS.setY(POS.getY() - 1); - if (world.isAir(POS)) { + if (world.isEmptyBlock(POS)) { POS.setY(POS.getY() + 1); while (state.is(EndBlocks.SMARAGDANT_CRYSTAL)) { setWithoutUpdate(world, POS, AIR); @@ -212,15 +216,17 @@ public class BlocksHelper { state = world.getBlockState(POS); } } - } else if (state.getBlock() instanceof StalactiteBlock) { - if (!state.canPlaceAt(world, POS)) { - if (world.getBlockState(POS.up()).getBlock() instanceof StalactiteBlock) { + } + 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 { + } + else { while (state.getBlock() instanceof StalactiteBlock) { setWithoutUpdate(world, POS, AIR); POS.setY(POS.getY() - 1); @@ -228,11 +234,13 @@ public class BlocksHelper { } } } - } else if (state.is(EndBlocks.CAVE_PUMPKIN)) { - if (!world.getBlockState(POS.up()).is(EndBlocks.CAVE_PUMPKIN_SEED)) { + } + else if (state.is(EndBlocks.CAVE_PUMPKIN)) { + if (!world.getBlockState(POS.above()).is(EndBlocks.CAVE_PUMPKIN_SEED)) { setWithoutUpdate(world, POS, AIR); } - } else if (!state.canPlaceAt(world, POS)) { + } + else if (!state.canSurvive(world, POS)) { // Chorus if (state.is(Blocks.CHORUS_PLANT)) { Set ends = Sets.newHashSet(); @@ -245,15 +253,13 @@ public class BlocksHelper { for (Direction dir : HORIZONTAL) { BlockPos p = pos.relative(dir); BlockState st = world.getBlockState(p); - if ((st.is(Blocks.CHORUS_PLANT) || st.is(Blocks.CHORUS_FLOWER)) - && !st.canPlaceAt(world, p)) { + if ((st.is(Blocks.CHORUS_PLANT) || st.is(Blocks.CHORUS_FLOWER)) && !st.canSurvive(world, p)) { add.add(p); } } - BlockPos p = pos.up(); + BlockPos p = pos.above(); BlockState st = world.getBlockState(p); - if ((st.is(Blocks.CHORUS_PLANT) || st.is(Blocks.CHORUS_FLOWER)) - && !st.canPlaceAt(world, p)) { + if ((st.is(Blocks.CHORUS_PLANT) || st.is(Blocks.CHORUS_FLOWER)) && !st.canSurvive(world, p)) { add.add(p); } }); @@ -284,11 +290,12 @@ public class BlocksHelper { state = world.getBlockState(POS); BlocksHelper.setWithoutUpdate(world, POS, Blocks.END_STONE.defaultBlockState()); } - } else { + } + else { POS.setY(y); BlockState replacement = AIR; for (Direction dir : HORIZONTAL) { - state = world.getBlockState(POS.offset(dir)); + state = world.getBlockState(POS.relative(dir)); if (!state.getFluidState().isEmpty()) { replacement = state; break; @@ -303,8 +310,7 @@ public class BlocksHelper { 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)) { + 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); @@ -325,34 +331,34 @@ public class BlocksHelper { } } } - + doubleCheck.forEach((pos) -> { - if (!world.getBlockState(pos).canPlaceAt(world, pos)) { + if (!world.getBlockState(pos).canSurvive(world, pos)) { BlocksHelper.setWithoutUpdate(world, pos, AIR); } }); } - + private static BlockState getAirOrFluid(BlockState state) { - return state.getFluidState().isEmpty() ? AIR : state.getFluidState().getBlockState(); + return state.getFluidState().isEmpty() ? AIR : state.getFluidState().createLegacyBlock(); } - + public static boolean isEndNylium(Block block) { - return block.isIn(BlockTags.NYLIUM) && block.isIn(EndTags.END_GROUND); + return block.is(BlockTags.NYLIUM) && block.is(EndTags.END_GROUND); } - + public static boolean isEndNylium(BlockState state) { return isEndNylium(state.getBlock()); } - + public static Direction[] makeHorizontal() { return new Direction[] { Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST }; } - + public static Direction randomHorizontal(Random random) { return HORIZONTAL[random.nextInt(4)]; } - + public static Direction randomDirection(Random random) { return DIRECTIONS[random.nextInt(6)]; } diff --git a/src/main/java/ru/betterend/util/BonemealUtil.java b/src/main/java/ru/betterend/util/BonemealUtil.java index cbf685ec..dae14b5b 100644 --- a/src/main/java/ru/betterend/util/BonemealUtil.java +++ b/src/main/java/ru/betterend/util/BonemealUtil.java @@ -3,12 +3,10 @@ package ru.betterend.util; import java.util.List; import java.util.Map; import java.util.Random; - +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; import com.google.common.collect.Lists; import com.google.common.collect.Maps; - -import net.minecraft.world.level.block.Block; -import net.minecraft.resources.ResourceLocation; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndBlocks; import ru.betterend.world.biome.EndBiome; @@ -16,59 +14,59 @@ import ru.betterend.world.biome.EndBiome; public class BonemealUtil { private static final Map> GRASS_BIOMES = Maps.newHashMap(); private static final Map GRASS_TYPES = Maps.newHashMap(); - + public static void init() { addBonemealGrass(EndBlocks.END_MOSS, EndBlocks.CREEPING_MOSS); addBonemealGrass(EndBlocks.END_MOSS, EndBlocks.UMBRELLA_MOSS); addBonemealGrass(EndBlocks.END_MYCELIUM, EndBlocks.CREEPING_MOSS); addBonemealGrass(EndBlocks.END_MYCELIUM, EndBlocks.UMBRELLA_MOSS); - + addBonemealGrass(EndBlocks.CAVE_MOSS, EndBlocks.CAVE_GRASS); addBonemealGrass(EndBlocks.CHORUS_NYLIUM, EndBlocks.CHORUS_GRASS); addBonemealGrass(EndBlocks.CRYSTAL_MOSS, EndBlocks.CRYSTAL_GRASS); addBonemealGrass(EndBlocks.SHADOW_GRASS, EndBlocks.SHADOW_PLANT); addBonemealGrass(EndBlocks.PINK_MOSS, EndBlocks.BUSHY_GRASS); addBonemealGrass(EndBlocks.AMBER_MOSS, EndBlocks.AMBER_GRASS); - + addBonemealGrass(EndBlocks.JUNGLE_MOSS, EndBlocks.JUNGLE_GRASS); addBonemealGrass(EndBlocks.JUNGLE_MOSS, EndBlocks.TWISTED_UMBRELLA_MOSS); addBonemealGrass(EndBlocks.JUNGLE_MOSS, EndBlocks.SMALL_JELLYSHROOM, 0.1F); - + addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.BLOOMING_COOKSONIA); addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.VAIOLUSH_FERN); addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.FRACTURN); addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.SALTEAGO); - + addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.CREEPING_MOSS, 0.1F); addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.UMBRELLA_MOSS, 0.1F); addBonemealGrass(EndBiomes.GLOWING_GRASSLANDS, EndBlocks.END_MOSS, EndBlocks.TWISTED_UMBRELLA_MOSS, 0.1F); - + addBonemealGrass(EndBlocks.RUTISCUS, EndBlocks.ORANGO); addBonemealGrass(EndBlocks.RUTISCUS, EndBlocks.AERIDIUM, 0.2F); addBonemealGrass(EndBlocks.RUTISCUS, EndBlocks.LUTEBUS, 0.2F); addBonemealGrass(EndBlocks.RUTISCUS, EndBlocks.LAMELLARIUM); - + addBonemealGrass(EndBiomes.LANTERN_WOODS, EndBlocks.RUTISCUS, EndBlocks.AERIDIUM, 0.2F); addBonemealGrass(EndBiomes.LANTERN_WOODS, EndBlocks.RUTISCUS, EndBlocks.LAMELLARIUM); addBonemealGrass(EndBiomes.LANTERN_WOODS, EndBlocks.RUTISCUS, EndBlocks.BOLUX_MUSHROOM, 0.05F); - + addBonemealGrass(EndBlocks.SANGNUM, EndBlocks.GLOBULAGUS); addBonemealGrass(EndBlocks.SANGNUM, EndBlocks.CLAWFERN); addBonemealGrass(EndBlocks.SANGNUM, EndBlocks.SMALL_AMARANITA_MUSHROOM, 0.1F); - + addBonemealGrass(EndBlocks.MOSSY_DRAGON_BONE, EndBlocks.GLOBULAGUS); addBonemealGrass(EndBlocks.MOSSY_DRAGON_BONE, EndBlocks.CLAWFERN); addBonemealGrass(EndBlocks.MOSSY_DRAGON_BONE, EndBlocks.SMALL_AMARANITA_MUSHROOM, 0.1F); - + addBonemealGrass(EndBlocks.MOSSY_OBSIDIAN, EndBlocks.GLOBULAGUS); addBonemealGrass(EndBlocks.MOSSY_OBSIDIAN, EndBlocks.CLAWFERN); addBonemealGrass(EndBlocks.MOSSY_OBSIDIAN, EndBlocks.SMALL_AMARANITA_MUSHROOM, 0.1F); } - + public static void addBonemealGrass(Block terrain, Block plant) { addBonemealGrass(terrain, plant, 1F); } - + public static void addBonemealGrass(Block terrain, Block plant, float chance) { GrassList list = GRASS_TYPES.get(terrain); if (list == null) { @@ -77,11 +75,11 @@ public class BonemealUtil { } list.addGrass(plant, chance); } - + public static void addBonemealGrass(EndBiome biome, Block terrain, Block plant) { addBonemealGrass(biome, terrain, plant, 1F); } - + public static void addBonemealGrass(EndBiome biome, Block terrain, Block plant, float chance) { Map map = GRASS_BIOMES.get(biome.getID()); if (map == null) { @@ -95,7 +93,7 @@ public class BonemealUtil { } list.addGrass(plant, chance); } - + public static Block getGrass(ResourceLocation biomeID, Block terrain, Random random) { Map map = GRASS_BIOMES.get(biomeID); GrassList list = null; @@ -104,43 +102,44 @@ public class BonemealUtil { if (list == null) { list = GRASS_TYPES.get(terrain); } - } else { + } + else { list = GRASS_TYPES.get(terrain); } return list == null ? null : list.getGrass(random); } - + private static final class GrassInfo { final Block grass; float chance; - + public GrassInfo(Block grass, float chance) { this.grass = grass; this.chance = chance; } - + public float addChance(float chance) { this.chance += chance; return this.chance; } } - + private static final class GrassList { final List list = Lists.newArrayList(); float maxChance = 0; - + public void addGrass(Block grass, float chance) { GrassInfo info = new GrassInfo(grass, chance); maxChance = info.addChance(maxChance); list.add(info); } - + public Block getGrass(Random random) { if (maxChance == 0 || list.isEmpty()) { return null; } float chance = random.nextFloat() * maxChance; - for (GrassInfo info : list) { + for (GrassInfo info: list) { if (chance <= info.chance) { return info.grass; } diff --git a/src/main/java/ru/betterend/util/ColorUtil.java b/src/main/java/ru/betterend/util/ColorUtil.java index e2031cbd..87b7b5b4 100644 --- a/src/main/java/ru/betterend/util/ColorUtil.java +++ b/src/main/java/ru/betterend/util/ColorUtil.java @@ -6,50 +6,52 @@ import java.util.List; import java.util.Map; import com.google.common.collect.Maps; - +import com.mojang.blaze3d.platform.NativeImage; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.impl.client.indigo.renderer.helper.ColorHelper; import net.minecraft.client.Minecraft; -import net.minecraft.client.texture.NativeImage; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.Resource; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.util.Mth; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; -import net.minecraft.resource.Resource; -import net.minecraft.resource.ResourceManager; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.Mth; -import net.minecraft.core.Registry; import ru.betterend.BetterEnd; @Environment(EnvType.CLIENT) public class ColorUtil { - + private static float[] floatBuffer = new float[4]; - + public static int[] toIntArray(int color) { - return new int[] { (color >> 24) & 255, (color >> 16) & 255, (color >> 8) & 255, color & 255 }; + return new int[] { + (color >> 24) & 255, + (color >> 16) & 255, + (color >> 8) & 255, + color & 255 + }; } - + public static float[] toFloatArray(int color) { floatBuffer[0] = ((color >> 16 & 255) / 255.0F); floatBuffer[1] = ((color >> 8 & 255) / 255.0F); floatBuffer[2] = ((color & 255) / 255.0F); floatBuffer[3] = ((color >> 24 & 255) / 255.0F); - + return floatBuffer; } - + public static float[] RGBtoHSB(int r, int g, int b, float[] hsbvals) { float hue, saturation, brightness; if (hsbvals == null) { hsbvals = floatBuffer; } int cmax = (r > g) ? r : g; - if (b > cmax) - cmax = b; + if (b > cmax) cmax = b; int cmin = (r < g) ? r : g; - if (b < cmin) - cmin = b; + if (b < cmin) cmin = b; brightness = ((float) cmax) / 255.0F; if (cmax != 0) @@ -77,14 +79,14 @@ public class ColorUtil { hsbvals[2] = brightness; return hsbvals; } - + public static int HSBtoRGB(float hue, float saturation, float brightness) { int r = 0, g = 0, b = 0; if (saturation == 0) { r = g = b = (int) (brightness * 255.0F + 0.5F); } else { - float h = (hue - (float) Math.floor(hue)) * 6.0F; - float f = h - (float) java.lang.Math.floor(h); + float h = (hue - (float)Math.floor(hue)) * 6.0F; + float f = h - (float)java.lang.Math.floor(h); float p = brightness * (1.0F - saturation); float q = brightness * (1.0F - saturation * f); float t = brightness * (1.0F - (saturation * (1.0F - f))); @@ -123,43 +125,41 @@ public class ColorUtil { } return 0xFF000000 | (r << 16) | (g << 8) | (b << 0); } - + public static int parseHex(String hexColor) { int len = hexColor.length(); if (len < 6 || len > 8 || len % 2 > 0) { return -1; } - + int color, shift; - if (len == 6) { - color = 0xFF000000; - shift = 16; + if(len == 6) { + color = 0xFF000000; shift = 16; } else { - color = 0; - shift = 24; + color = 0; shift = 24; } - + try { String[] splited = hexColor.split("(?<=\\G.{2})"); for (String digit : splited) { color |= Integer.valueOf(digit, 16) << shift; shift -= 8; } - } catch (NumberFormatException ex) { + } catch(NumberFormatException ex) { BetterEnd.LOGGER.catching(ex); return -1; } - + return color; } - + public static int toABGR(int color) { int r = (color >> 16) & 255; int g = (color >> 8) & 255; int b = color & 255; return 0xFF000000 | b << 16 | g << 8 | r; } - + public static int ABGRtoARGB(int color) { int a = (color >> 24) & 255; int b = (color >> 16) & 255; @@ -167,18 +167,18 @@ public class ColorUtil { int r = color & 255; return a << 24 | r << 16 | g << 8 | b; } - + public static int colorBrigtness(int color, float val) { RGBtoHSB((color >> 16) & 255, (color >> 8) & 255, color & 255, floatBuffer); floatBuffer[2] += val / 10.0F; floatBuffer[2] = Mth.clamp(floatBuffer[2], 0.0F, 1.0F); return HSBtoRGB(floatBuffer[0], floatBuffer[1], floatBuffer[2]); } - + public static int applyTint(int color, int tint) { return colorBrigtness(ColorHelper.multiplyColor(color, tint), 1.5F); } - + public static int colorDistance(int color1, int color2) { int r1 = (color1 >> 16) & 255; int g1 = (color1 >> 8) & 255; @@ -188,13 +188,12 @@ public class ColorUtil { int b2 = color2 & 255; return MHelper.pow2(r1 - r2) + MHelper.pow2(g1 - g2) + MHelper.pow2(b1 - b2); } - + private static Map colorPalette = Maps.newHashMap(); - + public static int extractColor(Item item) { - ResourceLocation id = Registry.ITEM.getId(item); - if (id.equals(Registry.ITEM.getDefaultKey())) - return -1; + ResourceLocation id = Registry.ITEM.getKey(item); + if (id.equals(Registry.ITEM.getDefaultKey())) return -1; if (colorPalette.containsKey(id)) { return colorPalette.get(id); } @@ -208,35 +207,34 @@ public class ColorUtil { List colors = new ArrayList<>(); for (int i = 0; i < image.getWidth(); i++) { for (int j = 0; j < 16; j++) { - int col = image.getPixelColor(i, j); + int col = image.getPixelRGBA(i, j); if (((col >> 24) & 255) > 0) { colors.add(ABGRtoARGB(col)); } } } image.close(); - - if (colors.size() == 0) - return -1; - + + if (colors.size() == 0) return -1; + ColorExtractor extractor = new ColorExtractor(colors); int color = extractor.analize(); colorPalette.put(id, color); - + return color; } - + public static NativeImage loadImage(ResourceLocation image, int w, int h) { Minecraft minecraft = Minecraft.getInstance(); ResourceManager resourceManager = minecraft.getResourceManager(); - if (resourceManager.containsResource(image)) { + if (resourceManager.hasResource(image)) { try (Resource resource = resourceManager.getResource(image)) { - return NativeImage.read(resource.getInputStream()); + return NativeImage.read(resource.getInputStream()); } catch (IOException e) { BetterEnd.LOGGER.warning("Can't load texture image: {}. Will be created empty image.", image); BetterEnd.LOGGER.warning("Cause: {}.", e.getMessage()); } - } + } return new NativeImage(w, h, false); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/util/DataFixerUtil.java b/src/main/java/ru/betterend/util/DataFixerUtil.java index 2d864e2a..39748815 100644 --- a/src/main/java/ru/betterend/util/DataFixerUtil.java +++ b/src/main/java/ru/betterend/util/DataFixerUtil.java @@ -12,8 +12,8 @@ import com.google.common.collect.Maps; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.NbtIo; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.storage.RegionFile; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.chunk.storage.RegionFile; public class DataFixerUtil { private static final Map REPLACEMENT = Maps.newHashMap(); @@ -38,7 +38,7 @@ public class DataFixerUtil { ChunkPos pos = new ChunkPos(x, z); changed[0] = false; if (region.hasChunk(pos)) { - DataInputStream input = region.getChunkInputStream(pos); + DataInputStream input = region.getChunkDataInputStream(pos); CompoundTag root = NbtIo.read(input); input.close(); ListTag sections = root.getCompound("Level").getList("Sections", 10); @@ -56,7 +56,7 @@ public class DataFixerUtil { }); if (changed[0]) { System.out.println("Write!"); - DataOutputStream output = region.getChunkOutputStream(pos); + DataOutputStream output = region.getChunkDataOutputStream(pos); NbtIo.write(root, output); output.close(); } diff --git a/src/main/java/ru/betterend/util/FeaturesHelper.java b/src/main/java/ru/betterend/util/FeaturesHelper.java index c00e2452..e7dcf4e1 100644 --- a/src/main/java/ru/betterend/util/FeaturesHelper.java +++ b/src/main/java/ru/betterend/util/FeaturesHelper.java @@ -4,14 +4,12 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.function.Supplier; - -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; - import net.minecraft.core.Registry; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; import ru.betterend.mixin.common.GenerationSettingsAccessor; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndStructures; @@ -21,24 +19,22 @@ public class FeaturesHelper { public static void addFeatures(Registry biomeRegistry) { biomeRegistry.forEach((biome) -> { - if (biome.getCategory() == Biome.Category.THEEND && !INJECTED.contains(biome)) { + if (biome.getBiomeCategory() == Biome.BiomeCategory.THEEND && !INJECTED.contains(biome)) { GenerationSettingsAccessor accessor = (GenerationSettingsAccessor) biome.getGenerationSettings(); - List>> structures = Lists - .newArrayList(accessor.beGetStructures()); + List>> structures = Lists.newArrayList(accessor.beGetStructures()); List>>> preFeatures = accessor.beGetFeatures(); - List>>> features = new ArrayList>>>( - preFeatures.size()); + List>>> features = new ArrayList>>>(preFeatures.size()); preFeatures.forEach((list) -> { features.add(Lists.newArrayList(list)); }); - EndFeatures.registerBiomeFeatures(biomeRegistry.getId(biome), biome, features); - EndStructures.registerBiomeStructures(biomeRegistry.getId(biome), biome, structures); + EndFeatures.registerBiomeFeatures(biomeRegistry.getKey(biome), biome, features); + EndStructures.registerBiomeStructures(biomeRegistry.getKey(biome), biome, structures); accessor.beSetFeatures(features); accessor.beSetStructures(structures); INJECTED.add(biome); } - }); + }); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/util/ItemUtil.java b/src/main/java/ru/betterend/util/ItemUtil.java index 030a47a0..954de98e 100644 --- a/src/main/java/ru/betterend/util/ItemUtil.java +++ b/src/main/java/ru/betterend/util/ItemUtil.java @@ -4,29 +4,28 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import com.google.gson.JsonObject; - +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.JsonHelper; -import net.minecraft.core.Registry; import ru.betterend.BetterEnd; public class ItemUtil { - + public static String toStackString(@NotNull ItemStack stack) { try { if (stack == null) { throw new IllegalStateException("Stack can't be null!"); } Item item = stack.getItem(); - return Registry.ITEM.getId(item) + ":" + stack.getCount(); + return Registry.ITEM.getKey(item) + ":" + stack.getCount(); } catch (Exception ex) { BetterEnd.LOGGER.error("ItemStack serialization error!", ex); } return ""; } - + @Nullable public static ItemStack fromStackString(String stackString) { if (stackString == null || stackString.equals("")) { @@ -34,17 +33,16 @@ public class ItemUtil { } try { String[] parts = stackString.split(":"); - if (parts.length < 2) - return null; + if (parts.length < 2) return null; if (parts.length == 2) { ResourceLocation itemId = new ResourceLocation(stackString); - Item item = Registry.ITEM.getOrEmpty(itemId).orElseThrow(() -> { + Item item = Registry.ITEM.getOptional(itemId).orElseThrow(() -> { return new IllegalStateException("Output item " + itemId + " does not exists!"); }); return new ItemStack(item); } ResourceLocation itemId = new ResourceLocation(parts[0], parts[1]); - Item item = Registry.ITEM.getOrEmpty(itemId).orElseThrow(() -> { + Item item = Registry.ITEM.getOptional(itemId).orElseThrow(() -> { return new IllegalStateException("Output item " + itemId + " does not exists!"); }); return new ItemStack(item, Integer.valueOf(parts[2])); @@ -53,18 +51,18 @@ public class ItemUtil { } return null; } - + @Nullable public static ItemStack fromJsonRecipe(JsonObject recipe) { try { if (!recipe.has("item")) { throw new IllegalStateException("Invalid JsonObject. Entry 'item' does not exists!"); } - ResourceLocation itemId = new ResourceLocation(JsonHelper.getString(recipe, "item")); - Item item = Registry.ITEM.getOrEmpty(itemId).orElseThrow(() -> { + ResourceLocation itemId = new ResourceLocation(GsonHelper.getAsString(recipe, "item")); + Item item = Registry.ITEM.getOptional(itemId).orElseThrow(() -> { return new IllegalStateException("Output item " + itemId + " does not exists!"); }); - int count = JsonHelper.getInt(recipe, "count", 1); + int count = GsonHelper.getAsInt(recipe, "count", 1); return new ItemStack(item, count); } catch (Exception ex) { BetterEnd.LOGGER.error("ItemStack deserialization error!", ex); diff --git a/src/main/java/ru/betterend/util/LangUtil.java b/src/main/java/ru/betterend/util/LangUtil.java index a5767bf2..bc051bf8 100644 --- a/src/main/java/ru/betterend/util/LangUtil.java +++ b/src/main/java/ru/betterend/util/LangUtil.java @@ -1,7 +1,7 @@ package ru.betterend.util; -import net.minecraft.client.resource.language.I18n; -import net.minecraft.text.TranslatableText; +import net.minecraft.client.resources.language.I18n; +import net.minecraft.network.chat.TranslatableComponent; public class LangUtil { public final static String CONFIG_ELEMENT = "configuration"; @@ -20,19 +20,19 @@ public class LangUtil { return getString(element, key); } - public TranslatableText getText(String key) { + public TranslatableComponent getText(String key) { return getText(element, key); } public static String translate(String key) { - return I18n.translate(key); + return I18n.get(key); } public static String getString(String element, String key) { return translate(String.format("%s.%s", element, key)); } - public static TranslatableText getText(String element, String key) { - return new TranslatableText(getString(element, key)); + public static TranslatableComponent getText(String element, String key) { + return new TranslatableComponent(getString(element, key)); } } diff --git a/src/main/java/ru/betterend/util/LootTableUtil.java b/src/main/java/ru/betterend/util/LootTableUtil.java index 163cec76..c3867a2c 100644 --- a/src/main/java/ru/betterend/util/LootTableUtil.java +++ b/src/main/java/ru/betterend/util/LootTableUtil.java @@ -2,11 +2,11 @@ package ru.betterend.util; import net.fabricmc.fabric.api.loot.v1.FabricLootPoolBuilder; import net.fabricmc.fabric.api.loot.v1.event.LootTableLoadingCallback; -import net.minecraft.world.item.Items; -import net.minecraft.loot.UniformLootTableRange; -import net.minecraft.loot.condition.RandomChanceLootCondition; -import net.minecraft.loot.entry.ItemEntry; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.storage.loot.RandomValueBounds; +import net.minecraft.world.level.storage.loot.entries.LootItem; +import net.minecraft.world.level.storage.loot.predicates.LootItemRandomChanceCondition; import ru.betterend.registry.EndItems; public class LootTableUtil { @@ -16,11 +16,11 @@ public class LootTableUtil { LootTableLoadingCallback.EVENT.register((resourceManager, lootManager, id, supplier, setter) -> { if (END_CITY_TREASURE_ID.equals(id)) { FabricLootPoolBuilder builder = FabricLootPoolBuilder.builder(); - builder.rolls(UniformLootTableRange.between(0, 5)); - builder.withCondition(RandomChanceLootCondition.builder(0.5f).build()); - builder.withEntry(ItemEntry.builder(Items.GHAST_TEAR).build()); - builder.withEntry(ItemEntry.builder(EndItems.MUSIC_DISC_STRANGE_AND_ALIEN).build()); - supplier.pool(builder); + builder.setRolls(RandomValueBounds.between(0, 5)); + builder.withCondition(LootItemRandomChanceCondition.randomChance(0.5f).build()); + builder.withEntry(LootItem.lootTableItem(Items.GHAST_TEAR).build()); + builder.withEntry(LootItem.lootTableItem(EndItems.MUSIC_DISC_STRANGE_AND_ALIEN).build()); + supplier.withPool(builder); } }); } diff --git a/src/main/java/ru/betterend/util/MHelper.java b/src/main/java/ru/betterend/util/MHelper.java index 156333b8..4d6d4d0a 100644 --- a/src/main/java/ru/betterend/util/MHelper.java +++ b/src/main/java/ru/betterend/util/MHelper.java @@ -1,9 +1,8 @@ package ru.betterend.util; -import java.util.Random; - import com.mojang.math.Vector3f; -import net.minecraft.util.math.Vec3d; +import java.util.Random; +import net.minecraft.world.phys.Vec3; public class MHelper { public static final float PI2 = (float) (Math.PI * 2); @@ -15,7 +14,7 @@ public class MHelper { public static int color(int r, int g, int b) { return ALPHA | (r << 16) | (g << 8) | b; } - + public static int color(String hex) { int r = Integer.parseInt(hex.substring(0, 2), 16); int g = Integer.parseInt(hex.substring(2, 4), 16); @@ -26,7 +25,7 @@ public class MHelper { public static int randRange(int min, int max, Random random) { return min + random.nextInt(max - min + 1); } - + public static double randRange(double min, double max, Random random) { return min + random.nextDouble() * (max - min); } @@ -68,81 +67,81 @@ public class MHelper { public static int min(int a, int b) { return a < b ? a : b; } - + public static int min(int a, int b, int c) { return min(a, min(b, c)); } - + public static int max(int a, int b) { return a > b ? a : b; } - + public static float min(float a, float b) { return a < b ? a : b; } - + public static float max(float a, float b) { return a > b ? a : b; } - + public static float max(float a, float b, float c) { return max(a, max(b, c)); } - + public static int max(int a, int b, int c) { return max(a, max(b, c)); } - + public static boolean isEven(int num) { return (num & 1) == 0; } - + public static float lengthSqr(float x, float y, float z) { return x * x + y * y + z * z; } - + public static double lengthSqr(double x, double y, double z) { return x * x + y * y + z * z; } - + public static float length(float x, float y, float z) { return (float) Math.sqrt(lengthSqr(x, y, z)); } - + public static double length(double x, double y, double z) { return Math.sqrt(lengthSqr(x, y, z)); } - + public static float lengthSqr(float x, float y) { return x * x + y * y; } - + public static double lengthSqr(double x, double y) { return x * x + y * y; } - + public static float length(float x, float y) { return (float) Math.sqrt(lengthSqr(x, y)); } - + public static double length(double x, double y) { return Math.sqrt(lengthSqr(x, y)); } - + public static float dot(float x1, float y1, float z1, float x2, float y2, float z2) { return x1 * x2 + y1 * y2 + z1 * z2; } - + public static float dot(float x1, float y1, float x2, float y2) { return x1 * x2 + y1 * y2; } - + public static int getRandom(int x, int z) { int h = x * 374761393 + z * 668265263; h = (h ^ (h >> 13)) * 1274126177; return h ^ (h >> 16); } - + public static int getSeed(int seed, int x, int y) { int h = seed + x * 374761393 + y * 668265263; h = (h ^ (h >> 13)) * 1274126177; @@ -154,7 +153,7 @@ public class MHelper { h = (h ^ (h >> 13)) * 1274126177; return h ^ (h >> 16); } - + public static void shuffle(T[] array, Random random) { for (int i = 0; i < array.length; i++) { int i2 = random.nextInt(array.length); @@ -167,15 +166,15 @@ public class MHelper { public static int pow2(int i) { return i * i; } - + public static float pow2(float f) { return f * f; } - + public static double pow2(double d) { return d * d; } - + public static int fromHSBtoRGB(float hue, float saturation, float brightness) { int red = 0; int green = 0; @@ -189,35 +188,35 @@ public class MHelper { float var9 = brightness * (1.0F - saturation * var7); float var10 = brightness * (1.0F - saturation * (1.0F - var7)); switch ((int) var6) { - case 0: - red = (int) (brightness * 255.0F + 0.5F); - green = (int) (var10 * 255.0F + 0.5F); - blue = (int) (var8 * 255.0F + 0.5F); - break; - case 1: - red = (int) (var9 * 255.0F + 0.5F); - green = (int) (brightness * 255.0F + 0.5F); - blue = (int) (var8 * 255.0F + 0.5F); - break; - case 2: - red = (int) (var8 * 255.0F + 0.5F); - green = (int) (brightness * 255.0F + 0.5F); - blue = (int) (var10 * 255.0F + 0.5F); - break; - case 3: - red = (int) (var8 * 255.0F + 0.5F); - green = (int) (var9 * 255.0F + 0.5F); - blue = (int) (brightness * 255.0F + 0.5F); - break; - case 4: - red = (int) (var10 * 255.0F + 0.5F); - green = (int) (var8 * 255.0F + 0.5F); - blue = (int) (brightness * 255.0F + 0.5F); - break; - case 5: - red = (int) (brightness * 255.0F + 0.5F); - green = (int) (var8 * 255.0F + 0.5F); - blue = (int) (var9 * 255.0F + 0.5F); + case 0 : + red = (int) (brightness * 255.0F + 0.5F); + green = (int) (var10 * 255.0F + 0.5F); + blue = (int) (var8 * 255.0F + 0.5F); + break; + case 1 : + red = (int) (var9 * 255.0F + 0.5F); + green = (int) (brightness * 255.0F + 0.5F); + blue = (int) (var8 * 255.0F + 0.5F); + break; + case 2 : + red = (int) (var8 * 255.0F + 0.5F); + green = (int) (brightness * 255.0F + 0.5F); + blue = (int) (var10 * 255.0F + 0.5F); + break; + case 3 : + red = (int) (var8 * 255.0F + 0.5F); + green = (int) (var9 * 255.0F + 0.5F); + blue = (int) (brightness * 255.0F + 0.5F); + break; + case 4 : + red = (int) (var10 * 255.0F + 0.5F); + green = (int) (var8 * 255.0F + 0.5F); + blue = (int) (brightness * 255.0F + 0.5F); + break; + case 5 : + red = (int) (brightness * 255.0F + 0.5F); + green = (int) (var8 * 255.0F + 0.5F); + blue = (int) (var9 * 255.0F + 0.5F); } } @@ -241,7 +240,8 @@ public class MHelper { float hue; if (saturation == 0.0F) { hue = 0.0F; - } else { + } + else { float var9 = (float) (max - r) / (float) (max - min); float var10 = (float) (max - g) / (float) (max - min); float var11 = (float) (max - b) / (float) (max - min); @@ -262,11 +262,11 @@ public class MHelper { values[0] = hue; values[1] = saturation; values[2] = brightness; - + return values; } - - public static Vec3d fromRGBtoHSBV(int r, int g, int b) { + + public static Vec3 fromRGBtoHSBV(int r, int g, int b) { int max = max(r, g, b); int min = min(r, g, b); @@ -281,7 +281,8 @@ public class MHelper { float hue; if (saturation == 0.0F) { hue = 0.0F; - } else { + } + else { float var9 = (float) (max - r) / (float) (max - min); float var10 = (float) (max - g) / (float) (max - min); float var11 = (float) (max - b) / (float) (max - min); @@ -298,25 +299,26 @@ public class MHelper { ++hue; } } - - return new Vec3d(hue, saturation, brightness); + + return new Vec3(hue, saturation, brightness); } - + public static final float radiansToDegrees(float value) { return value * RAD_TO_DEG; } - + public static final float degreesToRadians(float value) { return value / RAD_TO_DEG; } - - public static Vector3f cross(Vector3f vec1, Vector3f vec2) { - float cx = vec1.getY() * vec2.getZ() - vec1.getZ() * vec2.getY(); - float cy = vec1.getZ() * vec2.getX() - vec1.getX() * vec2.getZ(); - float cz = vec1.getX() * vec2.getY() - vec1.getY() * vec2.getX(); + + public static Vector3f cross(Vector3f vec1, Vector3f vec2) + { + float cx = vec1.y() * vec2.z() - vec1.z() * vec2.y(); + float cy = vec1.z() * vec2.x() - vec1.x() * vec2.z(); + float cz = vec1.x() * vec2.y() - vec1.y() * vec2.x(); return new Vector3f(cx, cy, cz); } - + public static Vector3f normalize(Vector3f vec) { float length = lengthSqr(vec.x(), vec.y(), vec.z()); if (length > 0) { @@ -328,14 +330,14 @@ public class MHelper { } return vec; } - + public static float angle(Vector3f vec1, Vector3f vec2) { - float dot = vec1.getX() * vec2.getX() + vec1.getY() * vec2.getY() + vec1.getZ() * vec2.getZ(); - float length1 = lengthSqr(vec1.getX(), vec1.getY(), vec1.getZ()); - float length2 = lengthSqr(vec2.getX(), vec2.getY(), vec2.getZ()); + float dot = vec1.x() * vec2.x() + vec1.y() * vec2.y() + vec1.z() * vec2.z(); + float length1 = lengthSqr(vec1.x(), vec1.y(), vec1.z()); + float length2 = lengthSqr(vec2.x(), vec2.y(), vec2.z()); return (float) Math.acos(dot / Math.sqrt(length1 * length2)); } - + public static Vector3f randomHorizontal(Random random) { float angleY = MHelper.randRange(0, MHelper.PI2, random); float vx = (float) Math.sin(angleY); diff --git a/src/main/java/ru/betterend/util/RecipeHelper.java b/src/main/java/ru/betterend/util/RecipeHelper.java index e0b9b2a0..7b0f879e 100644 --- a/src/main/java/ru/betterend/util/RecipeHelper.java +++ b/src/main/java/ru/betterend/util/RecipeHelper.java @@ -1,18 +1,18 @@ package ru.betterend.util; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.ItemLike; import net.minecraft.core.Registry; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.Block; public class RecipeHelper { public static boolean exists(ItemLike item) { if (item instanceof Block) { return Registry.BLOCK.getKey((Block) item) != Registry.BLOCK.getDefaultKey(); } else { - return Registry.ITEM.getId(item.asItem()) != Registry.ITEM.getDefaultKey(); + return Registry.ITEM.getKey(item.asItem()) != Registry.ITEM.getDefaultKey(); } } - + public static boolean exists(ItemLike... items) { for (ItemLike item : items) { if (!exists(item)) { diff --git a/src/main/java/ru/betterend/util/SpawnHelper.java b/src/main/java/ru/betterend/util/SpawnHelper.java index fccf56c7..e42a688a 100644 --- a/src/main/java/ru/betterend/util/SpawnHelper.java +++ b/src/main/java/ru/betterend/util/SpawnHelper.java @@ -2,21 +2,21 @@ package ru.betterend.util; import net.fabricmc.fabric.mixin.object.builder.SpawnRestrictionAccessor; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.SpawnRestriction.Location; -import net.minecraft.world.entity.SpawnRestriction.SpawnPredicate; -import net.minecraft.world.entity.mob.MobEntity; -import net.minecraft.world.Heightmap.Type; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.SpawnPlacements.SpawnPredicate; +import net.minecraft.world.entity.SpawnPlacements.Type; +import net.minecraft.world.level.levelgen.Heightmap.Types; public class SpawnHelper { - public static void restrictionAir(EntityType entity, SpawnPredicate predicate) { - SpawnRestrictionAccessor.callRegister(entity, Location.NO_RESTRICTIONS, Type.MOTION_BLOCKING, predicate); + public static void restrictionAir(EntityType entity, SpawnPredicate predicate) { + SpawnRestrictionAccessor.callRegister(entity, Type.NO_RESTRICTIONS, Types.MOTION_BLOCKING, predicate); } - - public static void restrictionLand(EntityType entity, SpawnPredicate predicate) { - SpawnRestrictionAccessor.callRegister(entity, Location.ON_GROUND, Type.MOTION_BLOCKING, predicate); + + public static void restrictionLand(EntityType entity, SpawnPredicate predicate) { + SpawnRestrictionAccessor.callRegister(entity, Type.ON_GROUND, Types.MOTION_BLOCKING, predicate); } - - public static void restrictionWater(EntityType entity, SpawnPredicate predicate) { - SpawnRestrictionAccessor.callRegister(entity, Location.IN_WATER, Type.MOTION_BLOCKING, predicate); + + public static void restrictionWater(EntityType entity, SpawnPredicate predicate) { + SpawnRestrictionAccessor.callRegister(entity, Type.IN_WATER, Types.MOTION_BLOCKING, predicate); } } diff --git a/src/main/java/ru/betterend/util/SplineHelper.java b/src/main/java/ru/betterend/util/SplineHelper.java index d0ad187f..8dfef055 100644 --- a/src/main/java/ru/betterend/util/SplineHelper.java +++ b/src/main/java/ru/betterend/util/SplineHelper.java @@ -4,15 +4,13 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.function.Function; - -import com.google.common.collect.Lists; - -import net.minecraft.world.level.block.state.BlockState; -import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import com.google.common.collect.Lists; +import com.mojang.math.Vector3f; import ru.betterend.util.sdf.SDF; import ru.betterend.util.sdf.operator.SDFUnion; import ru.betterend.util.sdf.primitive.SDFLine; @@ -32,7 +30,7 @@ public class SplineHelper { spline.add(new Vector3f(x2, y2, z2)); return spline; } - + public static List smoothSpline(List spline, int segmentPoints) { List result = Lists.newArrayList(); Vector3f start = spline.get(0); @@ -48,38 +46,37 @@ public class SplineHelper { result.add(start); return result; } - + private static Vector3f lerp(Vector3f start, Vector3f end, float delta) { - float x = Mth.lerp(delta, start.getX(), end.getX()); - float y = Mth.lerp(delta, start.getY(), end.getY()); - float z = Mth.lerp(delta, start.getZ(), end.getZ()); + float x = Mth.lerp(delta, start.x(), end.x()); + float y = Mth.lerp(delta, start.y(), end.y()); + float z = Mth.lerp(delta, start.z(), end.z()); return new Vector3f(x, y, z); } - + public static void offsetParts(List spline, Random random, float dx, float dy, float dz) { int count = spline.size(); for (int i = 1; i < count; i++) { Vector3f pos = spline.get(i); - float x = pos.getX() + (float) random.nextGaussian() * dx; - float y = pos.getY() + (float) random.nextGaussian() * dy; - float z = pos.getZ() + (float) random.nextGaussian() * dz; + float x = pos.x() + (float) random.nextGaussian() * dx; + float y = pos.y() + (float) random.nextGaussian() * dy; + float z = pos.z() + (float) random.nextGaussian() * dz; pos.set(x, y, z); } } - + public static void powerOffset(List spline, float distance, float power) { int count = spline.size(); float max = count + 1; for (int i = 1; i < count; i++) { Vector3f pos = spline.get(i); float x = (float) i / max; - float y = pos.getY() + (float) Math.pow(x, power) * distance; - pos.set(pos.getX(), y, pos.getZ()); + float y = pos.y() + (float) Math.pow(x, power) * distance; + pos.set(pos.x(), y, pos.z()); } } - - public static SDF buildSDF(List spline, float radius1, float radius2, - Function placerFunction) { + + public static SDF buildSDF(List spline, float radius1, float radius2, Function placerFunction) { int count = spline.size(); float max = count - 2; SDF result = null; @@ -87,17 +84,18 @@ public class SplineHelper { for (int i = 1; i < count; i++) { Vector3f pos = spline.get(i); float delta = (float) (i - 1) / max; - SDF line = new SDFLine().setRadius(Mth.lerp(delta, radius1, radius2)) - .setStart(start.getX(), start.getY(), start.getZ()).setEnd(pos.getX(), pos.getY(), pos.getZ()) + SDF line = new SDFLine() + .setRadius(Mth.lerp(delta, radius1, radius2)) + .setStart(start.x(), start.y(), start.z()) + .setEnd(pos.x(), pos.y(), pos.z()) .setBlock(placerFunction); result = result == null ? line : new SDFUnion().setSourceA(result).setSourceB(line); start = pos; } return result; } - - public static SDF buildSDF(List spline, Function radiusFunction, - Function placerFunction) { + + public static SDF buildSDF(List spline, Function radiusFunction, Function placerFunction) { int count = spline.size(); float max = count - 2; SDF result = null; @@ -105,17 +103,18 @@ public class SplineHelper { for (int i = 1; i < count; i++) { Vector3f pos = spline.get(i); float delta = (float) (i - 1) / max; - SDF line = new SDFLine().setRadius(radiusFunction.apply(delta)) - .setStart(start.getX(), start.getY(), start.getZ()).setEnd(pos.getX(), pos.getY(), pos.getZ()) + SDF line = new SDFLine() + .setRadius(radiusFunction.apply(delta)) + .setStart(start.x(), start.y(), start.z()) + .setEnd(pos.x(), pos.y(), pos.z()) .setBlock(placerFunction); result = result == null ? line : new SDFUnion().setSourceA(result).setSourceB(line); start = pos; } return result; } - - public static boolean fillSpline(List spline, WorldGenLevel world, BlockState state, BlockPos pos, - Function replace) { + + public static boolean fillSpline(List spline, WorldGenLevel world, BlockState state, BlockPos pos, Function replace) { Vector3f startPos = spline.get(0); for (int i = 1; i < spline.size(); i++) { Vector3f endPos = spline.get(i); @@ -124,12 +123,11 @@ public class SplineHelper { } startPos = endPos; } - + return true; } - - public static void fillSplineForce(List spline, WorldGenLevel world, BlockState state, BlockPos pos, - Function replace) { + + public static void fillSplineForce(List spline, WorldGenLevel world, BlockState state, BlockPos pos, Function replace) { Vector3f startPos = spline.get(0); for (int i = 1; i < spline.size(); i++) { Vector3f endPos = spline.get(i); @@ -137,22 +135,21 @@ public class SplineHelper { startPos = endPos; } } - - public static boolean fillLine(Vector3f start, Vector3f end, WorldGenLevel world, BlockState state, BlockPos pos, - Function replace) { - float dx = end.getX() - start.getX(); - float dy = end.getY() - start.getY(); - float dz = end.getZ() - start.getZ(); + + public static boolean fillLine(Vector3f start, Vector3f end, WorldGenLevel world, BlockState state, BlockPos pos, Function replace) { + float dx = end.x() - start.x(); + float dy = end.y() - start.y(); + float dz = end.z() - start.z(); float max = MHelper.max(Math.abs(dx), Math.abs(dy), Math.abs(dz)); int count = MHelper.floor(max + 1); dx /= max; dy /= max; dz /= max; - float x = start.getX(); - float y = start.getY(); - float z = start.getZ(); + float x = start.x(); + float y = start.y(); + float z = start.z(); boolean down = Math.abs(dy) > 0.2; - + BlockState bState; MutableBlockPos bPos = new MutableBlockPos(); for (int i = 0; i < count; i++) { @@ -165,14 +162,15 @@ public class SplineHelper { if (down && bState.equals(state) || replace.apply(bState)) { BlocksHelper.setWithoutUpdate(world, bPos, state); } - } else { + } + else { return false; } x += dx; y += dy; z += dz; } - bPos.set(end.getX() + pos.getX(), end.getY() + pos.getY(), end.getZ() + pos.getZ()); + bPos.set(end.x() + pos.getX(), end.y() + pos.getY(), end.z() + pos.getZ()); bState = world.getBlockState(bPos); if (bState.equals(state) || replace.apply(bState)) { BlocksHelper.setWithoutUpdate(world, bPos, state); @@ -182,26 +180,26 @@ public class SplineHelper { BlocksHelper.setWithoutUpdate(world, bPos, state); } return true; - } else { + } + else { return false; } } - - public static void fillLineForce(Vector3f start, Vector3f end, WorldGenLevel world, BlockState state, BlockPos pos, - Function replace) { - float dx = end.getX() - start.getX(); - float dy = end.getY() - start.getY(); - float dz = end.getZ() - start.getZ(); + + public static void fillLineForce(Vector3f start, Vector3f end, WorldGenLevel world, BlockState state, BlockPos pos, Function replace) { + float dx = end.x() - start.x(); + float dy = end.y() - start.y(); + float dz = end.z() - start.z(); float max = MHelper.max(Math.abs(dx), Math.abs(dy), Math.abs(dz)); int count = MHelper.floor(max + 1); dx /= max; dy /= max; dz /= max; - float x = start.getX(); - float y = start.getY(); - float z = start.getZ(); + float x = start.x(); + float y = start.y(); + float z = start.z(); boolean down = Math.abs(dy) > 0.2; - + BlockState bState; MutableBlockPos bPos = new MutableBlockPos(); for (int i = 0; i < count; i++) { @@ -219,7 +217,7 @@ public class SplineHelper { y += dy; z += dz; } - bPos.set(end.getX() + pos.getX(), end.getY() + pos.getY(), end.getZ() + pos.getZ()); + bPos.set(end.x() + pos.getX(), end.y() + pos.getY(), end.z() + pos.getZ()); bState = world.getBlockState(bPos); if (replace.apply(bState)) { BlocksHelper.setWithoutUpdate(world, bPos, state); @@ -230,9 +228,8 @@ public class SplineHelper { } } } - - public static boolean canGenerate(List spline, float scale, BlockPos start, WorldGenLevel world, - Function canReplace) { + + public static boolean canGenerate(List spline, float scale, BlockPos start, WorldGenLevel world, Function canReplace) { int count = spline.size(); Vector3f vec = spline.get(0); MutableBlockPos mut = new MutableBlockPos(); @@ -244,10 +241,9 @@ public class SplineHelper { float x2 = start.getX() + vec.x() * scale; float y2 = start.getY() + vec.y() * scale; float z2 = start.getZ() + vec.z() * scale; - + for (float py = y1; py < y2; py += 3) { - if (py - start.getY() < 10) - continue; + if (py - start.getY() < 10) continue; float lerp = (py - y1) / (y2 - y1); float x = Mth.lerp(lerp, x1, x2); float z = Mth.lerp(lerp, z1, z2); @@ -256,16 +252,15 @@ public class SplineHelper { return false; } } - + x1 = x2; y1 = y2; z1 = z2; } return true; } - - public static boolean canGenerate(List spline, BlockPos start, WorldGenLevel world, - Function canReplace) { + + public static boolean canGenerate(List spline, BlockPos start, WorldGenLevel world, Function canReplace) { int count = spline.size(); Vector3f vec = spline.get(0); MutableBlockPos mut = new MutableBlockPos(); @@ -277,10 +272,9 @@ public class SplineHelper { float x2 = start.getX() + vec.x(); float y2 = start.getY() + vec.y(); float z2 = start.getZ() + vec.z(); - + for (float py = y1; py < y2; py += 3) { - if (py - start.getY() < 10) - continue; + if (py - start.getY() < 10) continue; float lerp = (py - y1) / (y2 - y1); float x = Mth.lerp(lerp, x1, x2); float z = Mth.lerp(lerp, z1, z2); @@ -289,14 +283,14 @@ public class SplineHelper { return false; } } - + x1 = x2; y1 = y2; z1 = z2; } return true; } - + public static Vector3f getPos(List spline, float index) { int i = (int) index; int last = spline.size() - 1; @@ -306,43 +300,43 @@ public class SplineHelper { float delta = index - i; Vector3f p1 = spline.get(i); Vector3f p2 = spline.get(i + 1); - float x = Mth.lerp(delta, p1.getX(), p2.getX()); - float y = Mth.lerp(delta, p1.getY(), p2.getY()); - float z = Mth.lerp(delta, p1.getZ(), p2.getZ()); + float x = Mth.lerp(delta, p1.x(), p2.x()); + float y = Mth.lerp(delta, p1.y(), p2.y()); + float z = Mth.lerp(delta, p1.z(), p2.z()); return new Vector3f(x, y, z); } - + public static void rotateSpline(List spline, float angle) { - for (Vector3f v : spline) { + for (Vector3f v: spline) { float sin = (float) Math.sin(angle); float cos = (float) Math.cos(angle); - float x = v.getX() * cos + v.getZ() * sin; - float z = v.getX() * sin + v.getZ() * cos; - v.set(x, v.getY(), z); + float x = v.x() * cos + v.z() * sin; + float z = v.x() * sin + v.z() * cos; + v.set(x, v.y(), z); } } - + public static List copySpline(List spline) { List result = new ArrayList(spline.size()); - for (Vector3f v : spline) { - result.add(new Vector3f(v.getX(), v.getY(), v.getZ())); + for (Vector3f v: spline) { + result.add(new Vector3f(v.x(), v.y(), v.z())); } return result; } - + public static void scale(List spline, float scale) { scale(spline, scale, scale, scale); } - + public static void scale(List spline, float x, float y, float z) { - for (Vector3f v : spline) { - v.set(v.getX() * x, v.getY() * y, v.getZ() * z); + for (Vector3f v: spline) { + v.set(v.x() * x, v.y() * y, v.z() * z); } } - + public static void offset(List spline, Vector3f offset) { - for (Vector3f v : spline) { - v.set(offset.getX() + v.getX(), offset.getY() + v.getY(), offset.getZ() + v.getZ()); + for (Vector3f v: spline) { + v.set(offset.x() + v.x(), offset.y() + v.y(), offset.z() + v.z()); } } } diff --git a/src/main/java/ru/betterend/util/StructureHelper.java b/src/main/java/ru/betterend/util/StructureHelper.java index 8ec9dbc5..4274a66d 100644 --- a/src/main/java/ru/betterend/util/StructureHelper.java +++ b/src/main/java/ru/betterend/util/StructureHelper.java @@ -10,39 +10,39 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import com.google.common.collect.Sets; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.Material; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtIo; -import net.minecraft.structure.Structure; -import net.minecraft.structure.StructurePlacementData; -import net.minecraft.tags.BlockTags; -import net.minecraft.util.BlockMirror; -import net.minecraft.world.level.block.Rotation; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtIo; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import net.minecraft.world.level.material.Material; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; public class StructureHelper { private static final Direction[] DIR = BlocksHelper.makeHorizontal(); - - public static Structure readStructure(ResourceLocation resource) { + + public static StructureTemplate readStructure(ResourceLocation resource) { String ns = resource.getNamespace(); String nm = resource.getPath(); return readStructure("/data/" + ns + "/structures/" + nm + ".nbt"); } - - public static Structure readStructure(File datapack, String path) { + + public static StructureTemplate readStructure(File datapack, String path) { if (datapack.isDirectory()) { return readStructure(datapack.toString() + "/" + path); - } else if (datapack.isFile() && datapack.getName().endsWith(".zip")) { + } + else if (datapack.isFile() && datapack.getName().endsWith(".zip")) { try { ZipFile zipFile = new ZipFile(datapack); Enumeration entries = zipFile.entries(); @@ -57,91 +57,88 @@ public class StructureHelper { System.out.format("\t %s - %d - %d\n", type, compressedSize, normalSize); } zipFile.close(); - } catch (IOException e) { + } + catch (IOException e) { e.printStackTrace(); } } return null; } - - public static Structure readStructure(String path) { + + public static StructureTemplate readStructure(String path) { try { InputStream inputstream = StructureHelper.class.getResourceAsStream(path); return readStructureFromStream(inputstream); - } catch (IOException e) { + } + catch (IOException e) { e.printStackTrace(); } return null; } - - private static Structure readStructureFromStream(InputStream stream) throws IOException { + + private static StructureTemplate readStructureFromStream(InputStream stream) throws IOException { CompoundTag nbttagcompound = NbtIo.readCompressed(stream); - Structure template = new Structure(); - template.fromTag(nbttagcompound); + StructureTemplate template = new StructureTemplate(); + template.load(nbttagcompound); return template; } - - public static BlockPos offsetPos(BlockPos pos, Structure structure, Rotation rotation, BlockMirror mirror) { - BlockPos offset = Structure.transformAround(structure.getSize(), mirror, rotation, BlockPos.ORIGIN); + + public static BlockPos offsetPos(BlockPos pos, StructureTemplate structure, Rotation rotation, Mirror mirror) { + BlockPos offset = StructureTemplate.transform(structure.getSize(), mirror, rotation, BlockPos.ZERO); return pos.offset(-offset.getX() * 0.5, 0, -offset.getZ() * 0.5); } - - public static void placeCenteredBottom(WorldGenLevel world, BlockPos pos, Structure structure, Rotation rotation, - BlockMirror mirror, Random random) { + + public static void placeCenteredBottom(WorldGenLevel world, BlockPos pos, StructureTemplate structure, Rotation rotation, Mirror mirror, Random random) { placeCenteredBottom(world, pos, structure, rotation, mirror, makeBox(pos), random); } - - public static void placeCenteredBottom(WorldGenLevel world, BlockPos pos, Structure structure, Rotation rotation, - BlockMirror mirror, BlockBox bounds, Random random) { + + public static void placeCenteredBottom(WorldGenLevel world, BlockPos pos, StructureTemplate structure, Rotation rotation, Mirror mirror, BoundingBox bounds, Random random) { BlockPos offset = offsetPos(pos, structure, rotation, mirror); - StructurePlacementData placementData = new StructurePlacementData().setRotation(rotation).setMirror(mirror) - .setBoundingBox(bounds); - structure.place(world, offset, placementData, random); + StructurePlaceSettings placementData = new StructurePlaceSettings().setRotation(rotation).setMirror(mirror).setBoundingBox(bounds); + structure.placeInWorldChunk(world, offset, placementData, random); } - - private static BlockBox makeBox(BlockPos pos) { + + private static BoundingBox makeBox(BlockPos pos) { int sx = ((pos.getX() >> 4) << 4) - 16; int sz = ((pos.getZ() >> 4) << 4) - 16; int ex = sx + 47; int ez = sz + 47; - return BlockBox.create(sx, 0, sz, ex, 255, ez); + return BoundingBox.createProper(sx, 0, sz, ex, 255, ez); } - - public static BlockBox getStructureBounds(BlockPos pos, Structure structure, Rotation rotation, - BlockMirror mirror) { + + public static BoundingBox getStructureBounds(BlockPos pos, StructureTemplate structure, Rotation rotation, Mirror mirror) { BlockPos max = structure.getSize(); - BlockPos min = Structure.transformAround(structure.getSize(), mirror, rotation, BlockPos.ORIGIN); + BlockPos min = StructureTemplate.transform(structure.getSize(), mirror, rotation, BlockPos.ZERO); max = max.subtract(min); - return new BlockBox(min.add(pos), max.add(pos)); + return new BoundingBox(min.offset(pos), max.offset(pos)); } - - public static BlockBox intersectBoxes(BlockBox box1, BlockBox box2) { - int x1 = MHelper.max(box1.minX, box2.minX); - int y1 = MHelper.max(box1.minY, box2.minY); - int z1 = MHelper.max(box1.minZ, box2.minZ); - - int x2 = MHelper.min(box1.maxX, box2.maxX); - int y2 = MHelper.min(box1.maxY, box2.maxY); - int z2 = MHelper.min(box1.maxZ, box2.maxZ); - - return BlockBox.create(x1, y1, z1, x2, y2, z2); + + public static BoundingBox intersectBoxes(BoundingBox box1, BoundingBox box2) { + int x1 = MHelper.max(box1.x0, box2.x0); + int y1 = MHelper.max(box1.y0, box2.y0); + int z1 = MHelper.max(box1.z0, box2.z0); + + int x2 = MHelper.min(box1.x1, box2.x1); + int y2 = MHelper.min(box1.y1, box2.y1); + int z2 = MHelper.min(box1.z1, box2.z1); + + return BoundingBox.createProper(x1, y1, z1, x2, y2, z2); } - - public static void erode(WorldGenLevel world, BlockBox bounds, int iterations, Random random) { + + public static void erode(WorldGenLevel world, BoundingBox bounds, int iterations, Random random) { MutableBlockPos mut = new MutableBlockPos(); boolean canDestruct = true; for (int i = 0; i < iterations; i++) { - for (int x = bounds.minX; x <= bounds.maxX; x++) { + for (int x = bounds.x0; x <= bounds.x1; x++) { mut.setX(x); - for (int z = bounds.minZ; z <= bounds.maxZ; z++) { + for (int z = bounds.z0; z <= bounds.z1; z++) { mut.setZ(z); - for (int y = bounds.maxY; y >= bounds.minY; y--) { + for (int y = bounds.y1; y >= bounds.y0; y--) { mut.setY(y); BlockState state = world.getBlockState(mut); - if (canDestruct && state.is(EndBlocks.FLAVOLITE_RUNED_ETERNAL) && random.nextInt(8) == 0 - && world.isAir(mut.down(2))) { + if (canDestruct && state.is(EndBlocks.FLAVOLITE_RUNED_ETERNAL) && random.nextInt(8) == 0 && world.isEmptyBlock(mut.below(2))) { int r = MHelper.randRange(1, 4, random); int cx = mut.getX(); int cy = mut.getY(); @@ -164,8 +161,7 @@ public class StructureHelper { int dz = pz - cz; dz *= dz; mut.setZ(pz); - if (dx + dy + dz <= r - && world.getBlockState(mut).is(EndBlocks.FLAVOLITE_RUNED_ETERNAL)) { + if (dx + dy + dz <= r && world.getBlockState(mut).is(EndBlocks.FLAVOLITE_RUNED_ETERNAL)) { BlocksHelper.setWithoutUpdate(world, mut, Blocks.AIR); } } @@ -176,18 +172,19 @@ public class StructureHelper { mut.setZ(cz); canDestruct = false; continue; - } else if (ignore(state)) { + } + else if (ignore(state)) { continue; } if (!state.isAir() && random.nextBoolean()) { shuffle(random); - for (Direction dir : DIR) { - if (world.isAir(mut.offset(dir)) && world.isAir(mut.below().offset(dir))) { + for (Direction dir: DIR) { + if (world.isEmptyBlock(mut.relative(dir)) && world.isEmptyBlock(mut.below().relative(dir))) { BlocksHelper.setWithoutUpdate(world, mut, Blocks.AIR); mut.move(dir).move(Direction.DOWN); - for (int py = mut.getY(); y >= bounds.minY - 10; y--) { + for (int py = mut.getY(); y >= bounds.y0 - 10; y--) { mut.setY(py - 1); - if (!world.isAir(mut)) { + if (!world.isEmptyBlock(mut)) { mut.setY(py); BlocksHelper.setWithoutUpdate(world, mut, state); break; @@ -196,26 +193,26 @@ public class StructureHelper { } } break; - } else if (random.nextInt(8) == 0 - && !world.getBlockState(mut.up()).is(EndBlocks.ETERNAL_PEDESTAL)) { + } + else if (random.nextInt(8) == 0 && !world.getBlockState(mut.above()).is(EndBlocks.ETERNAL_PEDESTAL)) { BlocksHelper.setWithoutUpdate(world, mut, Blocks.AIR); } } } } } - for (int x = bounds.minX; x <= bounds.maxX; x++) { + for (int x = bounds.x0; x <= bounds.x1; x++) { mut.setX(x); - for (int z = bounds.minZ; z <= bounds.maxZ; z++) { + for (int z = bounds.z0; z <= bounds.z1; z++) { mut.setZ(z); - for (int y = bounds.maxY; y >= bounds.minY; y--) { + for (int y = bounds.y1; y >= bounds.y0; y--) { mut.setY(y); BlockState state = world.getBlockState(mut); - if (!ignore(state) && world.isAir(mut.below())) { + if (!ignore(state) && world.isEmptyBlock(mut.below())) { BlocksHelper.setWithoutUpdate(world, mut, Blocks.AIR); - for (int py = mut.getY(); py >= bounds.minY - 10; py--) { + for (int py = mut.getY(); py >= bounds.y0 - 10; py--) { mut.setY(py - 1); - if (!world.isAir(mut)) { + if (!world.isEmptyBlock(mut)) { mut.setY(py); BlocksHelper.setWithoutUpdate(world, mut, state); break; @@ -227,15 +224,15 @@ public class StructureHelper { } } - public static void erodeIntense(WorldGenLevel world, BlockBox bounds, Random random) { + public static void erodeIntense(WorldGenLevel world, BoundingBox bounds, Random random) { MutableBlockPos mut = new MutableBlockPos(); MutableBlockPos mut2 = new MutableBlockPos(); - int minY = bounds.minY - 10; - for (int x = bounds.minX; x <= bounds.maxX; x++) { + int minY = bounds.y0 - 10; + for (int x = bounds.x0; x <= bounds.x1; x++) { mut.setX(x); - for (int z = bounds.minZ; z <= bounds.maxZ; z++) { + for (int z = bounds.z0; z <= bounds.z1; z++) { mut.setZ(z); - for (int y = bounds.maxY; y >= bounds.minY; y--) { + for (int y = bounds.y1; y >= bounds.y0; y--) { mut.setY(y); BlockState state = world.getBlockState(mut); if (!ignore(state)) { @@ -248,12 +245,13 @@ public class StructureHelper { while (world.getBlockState(mut2).getMaterial().isReplaceable() && mut2.getY() > minY) { mut2.setY(mut2.getY() - 1); } - if (!world.getBlockState(mut2).isAir() && state.canPlaceAt(world, mut2)) { + if (!world.getBlockState(mut2).isAir() && state.canSurvive(world, mut2)) { mut2.setY(mut2.getY() + 1); BlocksHelper.setWithoutUpdate(world, mut2, state); } } - } else if (random.nextInt(8) == 0) { + } + else if (random.nextInt(8) == 0) { BlocksHelper.setWithoutUpdate(world, mut, Blocks.AIR); } } @@ -263,28 +261,28 @@ public class StructureHelper { drop(world, bounds); } - + private static boolean isTerrainNear(WorldGenLevel world, BlockPos pos) { - for (Direction dir : BlocksHelper.DIRECTIONS) { - if (world.getBlockState(pos.relative(dir)).isIn(EndTags.GEN_TERRAIN)) { + for (Direction dir: BlocksHelper.DIRECTIONS) { + if (world.getBlockState(pos.relative(dir)).is(EndTags.GEN_TERRAIN)) { return true; } } return false; } - - private static void drop(WorldGenLevel world, BlockBox bounds) { + + private static void drop(WorldGenLevel world, BoundingBox bounds) { MutableBlockPos mut = new MutableBlockPos(); - + Set blocks = Sets.newHashSet(); Set edge = Sets.newHashSet(); Set add = Sets.newHashSet(); - - for (int x = bounds.minX; x <= bounds.maxX; x++) { + + for (int x = bounds.x0; x <= bounds.x1; x++) { mut.setX(x); - for (int z = bounds.minZ; z <= bounds.maxZ; z++) { + for (int z = bounds.z0; z <= bounds.z1; z++) { mut.setZ(z); - for (int y = bounds.minY; y <= bounds.maxY; y++) { + for (int y = bounds.y0; y <= bounds.y1; y++) { mut.setY(y); BlockState state = world.getBlockState(mut); if (!ignore(state) && isTerrainNear(world, mut)) { @@ -293,18 +291,18 @@ public class StructureHelper { } } } - + if (edge.isEmpty()) { return; } - + while (!edge.isEmpty()) { - for (BlockPos center : edge) { - for (Direction dir : BlocksHelper.DIRECTIONS) { + for (BlockPos center: edge) { + for (Direction dir: BlocksHelper.DIRECTIONS) { BlockState state = world.getBlockState(center); - if (state.isFullCube(world, center)) { + if (state.isCollisionShapeFullBlock(world, center)) { mut.set(center).move(dir); - if (bounds.contains(mut)) { + if (bounds.isInside(mut)) { state = world.getBlockState(mut); if (!ignore(state) && !blocks.contains(mut)) { add.add(mut.immutable()); @@ -313,19 +311,19 @@ public class StructureHelper { } } } - + blocks.addAll(edge); edge.clear(); edge.addAll(add); add.clear(); } - - int minY = bounds.minY - 10; - for (int x = bounds.minX; x <= bounds.maxX; x++) { + + int minY = bounds.y0 - 10; + for (int x = bounds.x0; x <= bounds.x1; x++) { mut.setX(x); - for (int z = bounds.minZ; z <= bounds.maxZ; z++) { + for (int z = bounds.z0; z <= bounds.z1; z++) { mut.setZ(z); - for (int y = bounds.minY; y <= bounds.maxY; y++) { + for (int y = bounds.y0; y <= bounds.y1; y++) { mut.setY(y); BlockState state = world.getBlockState(mut); if (!ignore(state) && !blocks.contains(mut)) { @@ -344,12 +342,17 @@ public class StructureHelper { } private static boolean ignore(BlockState state) { - return state.getMaterial().isReplaceable() || !state.getFluidState().isEmpty() || state.isIn(EndTags.END_GROUND) - || state.is(EndBlocks.ETERNAL_PEDESTAL) || state.is(EndBlocks.FLAVOLITE_RUNED_ETERNAL) - || state.isIn(BlockTags.LOGS) || state.isIn(BlockTags.LEAVES) - || state.getMaterial().equals(Material.PLANT) || state.getMaterial().equals(Material.LEAVES); + return state.getMaterial().isReplaceable() + || !state.getFluidState().isEmpty() + || state.is(EndTags.END_GROUND) + || state.is(EndBlocks.ETERNAL_PEDESTAL) + || state.is(EndBlocks.FLAVOLITE_RUNED_ETERNAL) + || state.is(BlockTags.LOGS) + || state.is(BlockTags.LEAVES) + || state.getMaterial().equals(Material.PLANT) + || state.getMaterial().equals(Material.LEAVES); } - + private static void shuffle(Random random) { for (int i = 0; i < 4; i++) { int j = random.nextInt(4); @@ -358,18 +361,18 @@ public class StructureHelper { DIR[j] = d; } } - - public static void cover(WorldGenLevel world, BlockBox bounds, Random random) { + + public static void cover(WorldGenLevel world, BoundingBox bounds, Random random) { MutableBlockPos mut = new MutableBlockPos(); - for (int x = bounds.minX; x <= bounds.maxX; x++) { + for (int x = bounds.x0; x <= bounds.x1; x++) { mut.setX(x); - for (int z = bounds.minZ; z <= bounds.maxZ; z++) { + for (int z = bounds.z0; z <= bounds.z1; z++) { mut.setZ(z); BlockState top = world.getBiome(mut).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); - for (int y = bounds.maxY; y >= bounds.minY; y--) { + for (int y = bounds.y1; y >= bounds.y0; y--) { mut.setY(y); BlockState state = world.getBlockState(mut); - if (state.isIn(EndTags.END_GROUND) && !world.getBlockState(mut.up()).getMaterial().blocksLight()) { + if (state.is(EndTags.END_GROUND) && !world.getBlockState(mut.above()).getMaterial().isSolidBlocking()) { BlocksHelper.setWithoutUpdate(world, mut, top); } } diff --git a/src/main/java/ru/betterend/util/TagHelper.java b/src/main/java/ru/betterend/util/TagHelper.java index 2f962089..2ca68e42 100644 --- a/src/main/java/ru/betterend/util/TagHelper.java +++ b/src/main/java/ru/betterend/util/TagHelper.java @@ -2,64 +2,70 @@ package ru.betterend.util; import java.util.Map; import java.util.Set; - -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; - +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.Tag; +import net.minecraft.world.item.Item; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Block; -import net.minecraft.world.item.Item; -import net.minecraft.tags.Tag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.Registry; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; public class TagHelper { private static final Map> TAGS_BLOCK = Maps.newHashMap(); private static final Map> TAGS_ITEM = Maps.newHashMap(); - + public static void addTag(Tag.Named tag, Block... blocks) { ResourceLocation tagID = tag.getName(); - Set set = TAGS_BLOCK.computeIfAbsent(tagID, k -> Sets.newHashSet()); - for (Block block : blocks) { + Set set = TAGS_BLOCK.get(tagID); + if (set == null) { + set = Sets.newHashSet(); + TAGS_BLOCK.put(tagID, set); + } + for (Block block: blocks) { ResourceLocation id = Registry.BLOCK.getKey(block); if (id != Registry.BLOCK.getDefaultKey()) { set.add(id); } } } - + public static void addTag(Tag.Named tag, ItemLike... items) { ResourceLocation tagID = tag.getName(); - Set set = TAGS_ITEM.computeIfAbsent(tagID, k -> Sets.newHashSet()); - for (ItemLike item : items) { + Set set = TAGS_ITEM.get(tagID); + if (set == null) { + set = Sets.newHashSet(); + TAGS_ITEM.put(tagID, set); + } + for (ItemLike item: items) { ResourceLocation id = Registry.ITEM.getKey(item.asItem()); if (id != Registry.ITEM.getDefaultKey()) { set.add(id); } } } - + @SafeVarargs public static void addTags(ItemLike item, Tag.Named... tags) { - for (Tag.Named tag : tags) { + for (Tag.Named tag: tags) { addTag(tag, item); } } - + @SafeVarargs public static void addTags(Block block, Tag.Named... tags) { - for (Tag.Named tag : tags) { + for (Tag.Named tag: tags) { addTag(tag, block); } } - + public static Tag.Builder apply(Tag.Builder builder, Set ids) { - ids.forEach(value -> { - builder.addTag(value, "Better End Code"); + ids.forEach((value) -> { + builder.addElement(value, "Better End Code"); }); return builder; } - + public static void apply(String entry, Map tagsMap) { Map> endTags = null; if (entry.equals("block")) { diff --git a/src/main/java/ru/betterend/util/TranslationHelper.java b/src/main/java/ru/betterend/util/TranslationHelper.java index 1911dff5..cd6adfa7 100644 --- a/src/main/java/ru/betterend/util/TranslationHelper.java +++ b/src/main/java/ru/betterend/util/TranslationHelper.java @@ -4,13 +4,11 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.util.Collections; import java.util.List; - +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; import com.google.common.collect.Lists; import com.google.gson.Gson; import com.google.gson.JsonObject; - -import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.Registry; import ru.betterend.BetterEnd; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndItems; @@ -19,13 +17,13 @@ public class TranslationHelper { public static void printMissingNames() { List missingNamesEn = Lists.newArrayList(); List missingNamesRu = Lists.newArrayList(); - + Gson gson = new Gson(); InputStream streamEn = BetterEnd.class.getResourceAsStream("/assets/betterend/lang/en_us.json"); InputStream streamRu = BetterEnd.class.getResourceAsStream("/assets/betterend/lang/ru_ru.json"); JsonObject translationEn = gson.fromJson(new InputStreamReader(streamEn), JsonObject.class); JsonObject translationRu = gson.fromJson(new InputStreamReader(streamRu), JsonObject.class); - + Registry.BLOCK.forEach((block) -> { if (Registry.BLOCK.getKey(block).getNamespace().equals(BetterEnd.MOD_ID)) { String name = block.getName().getString(); @@ -37,9 +35,9 @@ public class TranslationHelper { } } }); - + EndItems.getModItems().forEach((item) -> { - String name = item.getName().getString(); + String name = item.getDescription().getString(); if (!translationEn.has(name)) { missingNamesEn.add(name); } @@ -47,7 +45,7 @@ public class TranslationHelper { missingNamesRu.add(name); } }); - + EndBiomes.getModBiomes().forEach((endBiome) -> { if (endBiome.getID().getNamespace().equals(BetterEnd.MOD_ID)) { String name = "biome." + BetterEnd.MOD_ID + "." + endBiome.getID().getPath(); @@ -59,9 +57,9 @@ public class TranslationHelper { } } }); - + Registry.ENTITY_TYPE.forEach((entity) -> { - ResourceLocation id = Registry.ENTITY_TYPE.getId(entity); + ResourceLocation id = Registry.ENTITY_TYPE.getKey(entity); if (id.getNamespace().equals(BetterEnd.MOD_ID)) { String name = "entity." + BetterEnd.MOD_ID + "." + id.getPath(); if (!translationEn.has(name)) { @@ -72,12 +70,12 @@ public class TranslationHelper { } } }); - + if (!missingNamesEn.isEmpty() || !missingNamesRu.isEmpty()) { - + System.out.println("========================================"); System.out.println(" MISSING NAMES LIST"); - + if (!missingNamesEn.isEmpty()) { Collections.sort(missingNamesEn); System.out.println("========================================"); @@ -87,7 +85,7 @@ public class TranslationHelper { System.out.println(" \"" + name + "\": \"" + fastTranslateEn(name) + "\","); }); } - + if (!missingNamesRu.isEmpty()) { Collections.sort(missingNamesRu); System.out.println("========================================"); @@ -97,11 +95,11 @@ public class TranslationHelper { System.out.println(" \"" + name + "\": \"\","); }); } - + System.out.println("========================================"); } } - + public static String fastTranslateEn(String text) { String[] words = text.substring(text.lastIndexOf('.') + 1).split("_"); StringBuilder builder = new StringBuilder(); diff --git a/src/main/java/ru/betterend/util/WorldDataUtil.java b/src/main/java/ru/betterend/util/WorldDataUtil.java index 5c99bcab..e881ba09 100644 --- a/src/main/java/ru/betterend/util/WorldDataUtil.java +++ b/src/main/java/ru/betterend/util/WorldDataUtil.java @@ -10,32 +10,34 @@ import ru.betterend.BetterEnd; public class WorldDataUtil { private static CompoundTag root; private static File saveFile; - + public static void load(File file) { saveFile = file; if (file.exists()) { try { root = NbtIo.readCompressed(file); - } catch (IOException e) { - BetterEnd.LOGGER.error("Level data loading failed", e); + } + catch (IOException e) { + BetterEnd.LOGGER.error("World data loading failed", e); root = new CompoundTag(); } return; } root = new CompoundTag(); } - + public static CompoundTag getRootTag() { return root; } - + public static CompoundTag getCompoundTag(String path) { String[] parts = path.split("\\."); CompoundTag tag = root; - for (String part : parts) { + for (String part: parts) { if (tag.contains(part)) { tag = tag.getCompound(part); - } else { + } + else { CompoundTag t = new CompoundTag(); tag.put(part, t); tag = t; @@ -43,12 +45,13 @@ public class WorldDataUtil { } return tag; } - + public static void saveFile() { try { NbtIo.writeCompressed(root, saveFile); - } catch (IOException e) { - BetterEnd.LOGGER.error("Level data saving failed", e); + } + catch (IOException e) { + BetterEnd.LOGGER.error("World data saving failed", e); } } } diff --git a/src/main/java/ru/betterend/util/sdf/PosInfo.java b/src/main/java/ru/betterend/util/sdf/PosInfo.java index 8594141f..74510770 100644 --- a/src/main/java/ru/betterend/util/sdf/PosInfo.java +++ b/src/main/java/ru/betterend/util/sdf/PosInfo.java @@ -1,11 +1,10 @@ package ru.betterend.util.sdf; import java.util.Map; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; public class PosInfo implements Comparable { private static final BlockState AIR = Blocks.AIR.defaultBlockState(); @@ -13,22 +12,22 @@ public class PosInfo implements Comparable { private final Map add; private final BlockPos pos; private BlockState state; - + public static PosInfo create(Map blocks, Map add, BlockPos pos) { return new PosInfo(blocks, add, pos); } - + private PosInfo(Map blocks, Map add, BlockPos pos) { this.blocks = blocks; this.add = add; this.pos = pos; blocks.put(pos, this); } - + public BlockState getState() { return state; } - + public BlockState getState(BlockPos pos) { PosInfo info = blocks.get(pos); if (info == null) { @@ -37,18 +36,18 @@ public class PosInfo implements Comparable { } return info.getState(); } - + public void setState(BlockState state) { this.state = state; } - + public void setState(BlockPos pos, BlockState state) { PosInfo info = blocks.get(pos); if (info != null) { info.setState(state); } } - + public BlockState getState(Direction dir) { PosInfo info = blocks.get(pos.relative(dir)); if (info == null) { @@ -57,7 +56,7 @@ public class PosInfo implements Comparable { } return info.getState(); } - + public BlockState getState(Direction dir, int distance) { PosInfo info = blocks.get(pos.relative(dir, distance)); if (info == null) { @@ -65,20 +64,20 @@ public class PosInfo implements Comparable { } return info.getState(); } - + public BlockState getStateUp() { return getState(Direction.UP); } - + public BlockState getStateDown() { return getState(Direction.DOWN); } - + @Override public int hashCode() { return pos.hashCode(); } - + @Override public boolean equals(Object obj) { if (!(obj instanceof PosInfo)) { @@ -95,7 +94,7 @@ public class PosInfo implements Comparable { public BlockPos getPos() { return pos; } - + public void setBlockPos(BlockPos pos, BlockState state) { PosInfo info = new PosInfo(blocks, add, pos); info.state = state; diff --git a/src/main/java/ru/betterend/util/sdf/SDF.java b/src/main/java/ru/betterend/util/sdf/SDF.java index 68bfc191..e288291e 100644 --- a/src/main/java/ru/betterend/util/sdf/SDF.java +++ b/src/main/java/ru/betterend/util/sdf/SDF.java @@ -6,17 +6,15 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Function; - +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; - -import net.minecraft.world.level.ServerLevelAccessor; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.core.BlockPos; -import net.minecraft.core.BlockPos.MutableBlockPos; -import net.minecraft.world.phys.AABB; -import net.minecraft.core.Direction; import ru.betterend.util.BlocksHelper; import ru.betterend.world.structures.StructureWorld; @@ -27,19 +25,19 @@ public abstract class SDF { }; public abstract float getDistance(float x, float y, float z); - + public abstract BlockState getBlockState(BlockPos pos); - + public SDF addPostProcess(Function postProcess) { this.postProcesses.add(postProcess); return this; } - + public SDF setReplaceFunction(Function canReplace) { this.canReplace = canReplace; return this; } - + public void fillRecursive(ServerLevelAccessor world, BlockPos start) { Map mapWorld = Maps.newHashMap(); Map addInfo = Maps.newHashMap(); @@ -48,15 +46,15 @@ public abstract class SDF { Set add = Sets.newHashSet(); ends.add(new BlockPos(0, 0, 0)); boolean run = true; - + MutableBlockPos bPos = new MutableBlockPos(); - + while (run) { - for (BlockPos center : ends) { - for (Direction dir : Direction.values()) { + for (BlockPos center: ends) { + for (Direction dir: Direction.values()) { bPos.set(center).move(dir); BlockPos wpos = bPos.offset(start); - + if (!blocks.contains(bPos) && canReplace.apply(world.getBlockState(wpos))) { if (this.getDistance(bPos.getX(), bPos.getY(), bPos.getZ()) < 0) { BlockState state = getBlockState(wpos); @@ -66,15 +64,15 @@ public abstract class SDF { } } } - + blocks.addAll(ends); ends.clear(); ends.addAll(add); add.clear(); - + run &= !ends.isEmpty(); } - + List infos = new ArrayList(mapWorld.values()); if (infos.size() > 0) { Collections.sort(infos); @@ -102,11 +100,11 @@ public abstract class SDF { }); } } - + public void fillArea(ServerLevelAccessor world, BlockPos center, AABB box) { Map mapWorld = Maps.newHashMap(); Map addInfo = Maps.newHashMap(); - + MutableBlockPos mut = new MutableBlockPos(); for (int y = (int) box.minY; y <= box.maxY; y++) { mut.setY(y); @@ -123,7 +121,7 @@ public abstract class SDF { } } } - + List infos = new ArrayList(mapWorld.values()); if (infos.size() > 0) { Collections.sort(infos); @@ -151,7 +149,7 @@ public abstract class SDF { }); } } - + public void fillRecursiveIgnore(ServerLevelAccessor world, BlockPos start, Function ignore) { Map mapWorld = Maps.newHashMap(); Map addInfo = Maps.newHashMap(); @@ -160,12 +158,12 @@ public abstract class SDF { Set add = Sets.newHashSet(); ends.add(new BlockPos(0, 0, 0)); boolean run = true; - + MutableBlockPos bPos = new MutableBlockPos(); - + while (run) { - for (BlockPos center : ends) { - for (Direction dir : Direction.values()) { + for (BlockPos center: ends) { + for (Direction dir: Direction.values()) { bPos.set(center).move(dir); BlockPos wpos = bPos.offset(start); BlockState state = world.getBlockState(wpos); @@ -178,15 +176,15 @@ public abstract class SDF { } } } - + blocks.addAll(ends); ends.clear(); ends.addAll(add); add.clear(); - + run &= !ends.isEmpty(); } - + List infos = new ArrayList(mapWorld.values()); if (infos.size() > 0) { Collections.sort(infos); @@ -214,7 +212,7 @@ public abstract class SDF { }); } } - + public void fillRecursive(StructureWorld world, BlockPos start) { Map mapWorld = Maps.newHashMap(); Map addInfo = Maps.newHashMap(); @@ -223,15 +221,15 @@ public abstract class SDF { Set add = Sets.newHashSet(); ends.add(new BlockPos(0, 0, 0)); boolean run = true; - + MutableBlockPos bPos = new MutableBlockPos(); - + while (run) { - for (BlockPos center : ends) { - for (Direction dir : Direction.values()) { + for (BlockPos center: ends) { + for (Direction dir: Direction.values()) { bPos.set(center).move(dir); BlockPos wpos = bPos.offset(start); - + if (!blocks.contains(bPos)) { if (this.getDistance(bPos.getX(), bPos.getY(), bPos.getZ()) < 0) { BlockState state = getBlockState(wpos); @@ -241,15 +239,15 @@ public abstract class SDF { } } } - + blocks.addAll(ends); ends.clear(); ends.addAll(add); add.clear(); - + run &= !ends.isEmpty(); } - + List infos = new ArrayList(mapWorld.values()); Collections.sort(infos); postProcesses.forEach((postProcess) -> { @@ -260,7 +258,7 @@ public abstract class SDF { infos.forEach((info) -> { world.setBlock(info.getPos(), info.getState()); }); - + infos.clear(); infos.addAll(addInfo.values()); Collections.sort(infos); @@ -273,19 +271,19 @@ public abstract class SDF { world.setBlock(info.getPos(), info.getState()); }); } - + public Set getPositions(ServerLevelAccessor world, BlockPos start) { Set blocks = Sets.newHashSet(); Set ends = Sets.newHashSet(); Set add = Sets.newHashSet(); ends.add(new BlockPos(0, 0, 0)); boolean run = true; - + MutableBlockPos bPos = new MutableBlockPos(); - + while (run) { - for (BlockPos center : ends) { - for (Direction dir : Direction.values()) { + for (BlockPos center: ends) { + for (Direction dir: Direction.values()) { bPos.set(center).move(dir); BlockPos wpos = bPos.offset(start); BlockState state = world.getBlockState(wpos); @@ -296,15 +294,15 @@ public abstract class SDF { } } } - + ends.forEach((end) -> blocks.add(end.offset(start))); ends.clear(); ends.addAll(add); add.clear(); - + run &= !ends.isEmpty(); } - + return blocks; } } diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFBinary.java b/src/main/java/ru/betterend/util/sdf/operator/SDFBinary.java index 167de382..1d48561d 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFBinary.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFBinary.java @@ -1,28 +1,28 @@ package ru.betterend.util.sdf.operator; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.util.sdf.SDF; public abstract class SDFBinary extends SDF { protected SDF sourceA; protected SDF sourceB; protected boolean firstValue; - + public SDFBinary setSourceA(SDF sourceA) { this.sourceA = sourceA; return this; } - + public SDFBinary setSourceB(SDF sourceB) { this.sourceB = sourceB; return this; } - + protected void selectValue(float a, float b) { firstValue = a < b; } - + @Override public BlockState getBlockState(BlockPos pos) { if (firstValue) { diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFCoordModify.java b/src/main/java/ru/betterend/util/sdf/operator/SDFCoordModify.java index 280cd223..ccba6d7e 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFCoordModify.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFCoordModify.java @@ -1,22 +1,21 @@ package ru.betterend.util.sdf.operator; -import java.util.function.Consumer; - import com.mojang.math.Vector3f; +import java.util.function.Consumer; public class SDFCoordModify extends SDFUnary { private static final Vector3f POS = new Vector3f(); private Consumer function; - + public SDFCoordModify setFunction(Consumer function) { this.function = function; return this; } - + @Override public float getDistance(float x, float y, float z) { POS.set(x, y, z); function.accept(POS); - return this.source.getDistance(POS.getX(), POS.getY(), POS.getZ()); + return this.source.getDistance(POS.x(), POS.y(), POS.z()); } } diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFDisplacement.java b/src/main/java/ru/betterend/util/sdf/operator/SDFDisplacement.java index 32b9474d..14e212b8 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFDisplacement.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFDisplacement.java @@ -1,18 +1,17 @@ package ru.betterend.util.sdf.operator; -import java.util.function.Function; - import com.mojang.math.Vector3f; +import java.util.function.Function; public class SDFDisplacement extends SDFUnary { private static final Vector3f POS = new Vector3f(); private Function displace; - + public SDFDisplacement setFunction(Function displace) { this.displace = displace; return this; } - + @Override public float getDistance(float x, float y, float z) { POS.set(x, y, z); diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFFlatWave.java b/src/main/java/ru/betterend/util/sdf/operator/SDFFlatWave.java index a94f2c3c..f5707bdb 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFFlatWave.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFFlatWave.java @@ -7,7 +7,7 @@ public class SDFFlatWave extends SDFDisplacement { public SDFFlatWave() { setFunction((pos) -> { - return (float) Math.cos(Math.atan2(pos.getX(), pos.getZ()) * rayCount + angle) * intensity; + return (float) Math.cos(Math.atan2(pos.x(), pos.z()) * rayCount + angle) * intensity; }); } diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFHeightmap.java b/src/main/java/ru/betterend/util/sdf/operator/SDFHeightmap.java index a82b50e4..62c17d22 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFHeightmap.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFHeightmap.java @@ -1,6 +1,6 @@ package ru.betterend.util.sdf.operator; -import net.minecraft.client.texture.NativeImage; +import com.mojang.blaze3d.platform.NativeImage; import net.minecraft.util.Mth; public class SDFHeightmap extends SDFDisplacement { @@ -11,14 +11,14 @@ public class SDFHeightmap extends SDFDisplacement { private float scale; private float cos = 1; private float sin = 0; - + public SDFHeightmap() { setFunction((pos) -> { if (map == null) { return 0F; } - float px = Mth.clamp(pos.getX() * scale + offsetX, 0, map.getWidth() - 2); - float pz = Mth.clamp(pos.getZ() * scale + offsetZ, 0, map.getHeight() - 2); + float px = Mth.clamp(pos.x() * scale + offsetX, 0, map.getWidth() - 2); + float pz = Mth.clamp(pos.z() * scale + offsetZ, 0, map.getHeight() - 2); float dx = (px * cos - pz * sin); float dz = (pz * cos + px * sin); int x1 = Mth.floor(dx); @@ -27,16 +27,16 @@ public class SDFHeightmap extends SDFDisplacement { int z2 = z1 + 1; dx = dx - x1; dz = dz - z1; - float a = (map.getPixelColor(x1, z1) & 255) / 255F; - float b = (map.getPixelColor(x2, z1) & 255) / 255F; - float c = (map.getPixelColor(x1, z2) & 255) / 255F; - float d = (map.getPixelColor(x2, z2) & 255) / 255F; + float a = (map.getPixelRGBA(x1, z1) & 255) / 255F; + float b = (map.getPixelRGBA(x2, z1) & 255) / 255F; + float c = (map.getPixelRGBA(x1, z2) & 255) / 255F; + float d = (map.getPixelRGBA(x2, z2) & 255) / 255F; a = Mth.lerp(dx, a, b); b = Mth.lerp(dx, c, d); return -Mth.lerp(dz, a, b) * intensity; }); } - + public SDFHeightmap setMap(NativeImage map) { this.map = map; offsetX = map.getWidth() * 0.5F; @@ -44,18 +44,18 @@ public class SDFHeightmap extends SDFDisplacement { scale = map.getWidth(); return this; } - + public SDFHeightmap setAngle(float angle) { sin = Mth.sin(angle); cos = Mth.cos(angle); return this; } - + public SDFHeightmap setScale(float scale) { this.scale = map.getWidth() * scale; return this; } - + public SDFHeightmap setIntensity(float intensity) { this.intensity = intensity; return this; diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFRadialNoiseMap.java b/src/main/java/ru/betterend/util/sdf/operator/SDFRadialNoiseMap.java index b428973d..258d2ee2 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFRadialNoiseMap.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFRadialNoiseMap.java @@ -7,20 +7,20 @@ import ru.betterend.util.MHelper; public class SDFRadialNoiseMap extends SDFDisplacement { private static final float SIN = Mth.sin(0.5F); private static final float COS = Mth.cos(0.5F); - + private OpenSimplexNoise noise; private float intensity = 1F; private float radius = 1F; private short offsetX; private short offsetZ; - + public SDFRadialNoiseMap() { setFunction((pos) -> { if (intensity == 0) { return 0F; } - float px = pos.getX() / radius; - float pz = pos.getZ() / radius; + float px = pos.x() / radius; + float pz = pos.z() / radius; float distance = MHelper.lengthSqr(px, pz); if (distance > 1) { return 0F; @@ -32,27 +32,26 @@ public class SDFRadialNoiseMap extends SDFDisplacement { return distance * intensity; }); } - + private float getNoise(double x, double z) { - return (float) noise.eval(x, z) + (float) noise.eval(x * 3 + 1000, z * 3) * 0.5F - + (float) noise.eval(x * 9 + 1000, z * 9) * 0.2F; + return (float) noise.eval(x, z) + (float) noise.eval(x * 3 + 1000, z * 3) * 0.5F + (float) noise.eval(x * 9 + 1000, z * 9) * 0.2F; } - + public SDFRadialNoiseMap setSeed(long seed) { noise = new OpenSimplexNoise(seed); return this; } - + public SDFRadialNoiseMap setIntensity(float intensity) { this.intensity = intensity; return this; } - + public SDFRadialNoiseMap setRadius(float radius) { this.radius = radius; return this; } - + public SDFRadialNoiseMap setOffset(int x, int z) { offsetX = (short) (x & 32767); offsetZ = (short) (z & 32767); diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFRotation.java b/src/main/java/ru/betterend/util/sdf/operator/SDFRotation.java index 38112670..3772443a 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFRotation.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFRotation.java @@ -1,21 +1,21 @@ package ru.betterend.util.sdf.operator; +import com.mojang.math.Quaternion; import com.mojang.math.Vector3f; -import net.minecraft.util.math.Quaternion; public class SDFRotation extends SDFUnary { private static final Vector3f POS = new Vector3f(); private Quaternion rotation; - + public SDFRotation setRotation(Vector3f axis, float rotationAngle) { rotation = new Quaternion(axis, rotationAngle, false); return this; } - + @Override public float getDistance(float x, float y, float z) { POS.set(x, y, z); - POS.rotate(rotation); - return source.getDistance(POS.getX(), POS.getY(), POS.getZ()); + POS.transform(rotation); + return source.getDistance(POS.x(), POS.y(), POS.z()); } } diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothIntersection.java b/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothIntersection.java index e9aa513c..de4d12f0 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothIntersection.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothIntersection.java @@ -9,7 +9,7 @@ public class SDFSmoothIntersection extends SDFBinary { this.radius = radius; return this; } - + @Override public float getDistance(float x, float y, float z) { float a = this.sourceA.getDistance(x, y, z); diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothSubtraction.java b/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothSubtraction.java index 98ba21c1..8f2a5226 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothSubtraction.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothSubtraction.java @@ -9,7 +9,7 @@ public class SDFSmoothSubtraction extends SDFBinary { this.radius = radius; return this; } - + @Override public float getDistance(float x, float y, float z) { float a = this.sourceA.getDistance(x, y, z); diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFUnary.java b/src/main/java/ru/betterend/util/sdf/operator/SDFUnary.java index 29286ad5..233901c3 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFUnary.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFUnary.java @@ -1,17 +1,17 @@ package ru.betterend.util.sdf.operator; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.util.sdf.SDF; public abstract class SDFUnary extends SDF { protected SDF source; - + public SDFUnary setSource(SDF source) { this.source = source; return this; } - + @Override public BlockState getBlockState(BlockPos pos) { return source.getBlockState(pos); diff --git a/src/main/java/ru/betterend/util/sdf/primitive/SDFCappedCone.java b/src/main/java/ru/betterend/util/sdf/primitive/SDFCappedCone.java index 580c6dfb..e7461443 100644 --- a/src/main/java/ru/betterend/util/sdf/primitive/SDFCappedCone.java +++ b/src/main/java/ru/betterend/util/sdf/primitive/SDFCappedCone.java @@ -7,17 +7,17 @@ public class SDFCappedCone extends SDFPrimitive { private float radius1; private float radius2; private float height; - + public SDFCappedCone setRadius1(float radius) { this.radius1 = radius; return this; } - + public SDFCappedCone setRadius2(float radius) { this.radius2 = radius; return this; } - + public SDFCappedCone setHeight(float height) { this.height = height; return this; @@ -30,8 +30,7 @@ public class SDFCappedCone extends SDFPrimitive { float k2y = 2 * height; float cax = qx - MHelper.min(qx, (y < 0F) ? radius1 : radius2); float cay = Math.abs(y) - height; - float mlt = Mth.clamp(MHelper.dot(radius2 - qx, height - y, k2x, k2y) / MHelper.dot(k2x, k2y, k2x, k2y), 0F, - 1F); + float mlt = Mth.clamp(MHelper.dot(radius2 - qx, height - y, k2x, k2y) / MHelper.dot(k2x, k2y, k2x, k2y), 0F, 1F); float cbx = qx - radius2 + k2x * mlt; float cby = y - height + k2y * mlt; float s = (cbx < 0F && cay < 0F) ? -1F : 1F; diff --git a/src/main/java/ru/betterend/util/sdf/primitive/SDFCapsule.java b/src/main/java/ru/betterend/util/sdf/primitive/SDFCapsule.java index 4242d18f..94c38913 100644 --- a/src/main/java/ru/betterend/util/sdf/primitive/SDFCapsule.java +++ b/src/main/java/ru/betterend/util/sdf/primitive/SDFCapsule.java @@ -6,17 +6,17 @@ import ru.betterend.util.MHelper; public class SDFCapsule extends SDFPrimitive { private float radius; private float height; - + public SDFCapsule setRadius(float radius) { this.radius = radius; return this; } - + public SDFCapsule setHeight(float height) { this.height = height; return this; } - + @Override public float getDistance(float x, float y, float z) { return MHelper.length(x, y - Mth.clamp(y, 0, height), z) - radius; diff --git a/src/main/java/ru/betterend/util/sdf/primitive/SDFLine.java b/src/main/java/ru/betterend/util/sdf/primitive/SDFLine.java index e35fc302..eff4c11a 100644 --- a/src/main/java/ru/betterend/util/sdf/primitive/SDFLine.java +++ b/src/main/java/ru/betterend/util/sdf/primitive/SDFLine.java @@ -11,19 +11,19 @@ public class SDFLine extends SDFPrimitive { private float x2; private float y2; private float z2; - + public SDFLine setRadius(float radius) { this.radius = radius; return this; } - + public SDFLine setStart(float x, float y, float z) { this.x1 = x; this.y1 = y; this.z1 = z; return this; } - + public SDFLine setEnd(float x, float y, float z) { this.x2 = x; this.y2 = y; diff --git a/src/main/java/ru/betterend/util/sdf/primitive/SDFPie.java b/src/main/java/ru/betterend/util/sdf/primitive/SDFPie.java index 3fdb2dcf..49482fd6 100644 --- a/src/main/java/ru/betterend/util/sdf/primitive/SDFPie.java +++ b/src/main/java/ru/betterend/util/sdf/primitive/SDFPie.java @@ -7,25 +7,25 @@ public class SDFPie extends SDFPrimitive { private float sin; private float cos; private float radius; - + public SDFPie setAngle(float angle) { this.sin = (float) Math.sin(angle); this.cos = (float) Math.cos(angle); return this; } - + public SDFPie setRadius(float radius) { this.radius = radius; return this; } - + @Override public float getDistance(float x, float y, float z) { float px = Math.abs(x); - float l = MHelper.length(px, y, z) - radius; - float m = MHelper.dot(px, z, sin, cos); - m = Mth.clamp(m, 0, radius); + float l = MHelper.length(px, y, z) - radius; + float m = MHelper.dot(px, z, sin, cos); + m = Mth.clamp(m, 0, radius); m = MHelper.length(px - sin * m, z - cos * m); - return MHelper.max(l, m * (float) Math.signum(cos * px - sin * z)); + return MHelper.max(l, m * (float) Math.signum(cos * px - sin * z)); } } diff --git a/src/main/java/ru/betterend/util/sdf/primitive/SDFPrimitive.java b/src/main/java/ru/betterend/util/sdf/primitive/SDFPrimitive.java index 7ee719bf..27ef4f91 100644 --- a/src/main/java/ru/betterend/util/sdf/primitive/SDFPrimitive.java +++ b/src/main/java/ru/betterend/util/sdf/primitive/SDFPrimitive.java @@ -1,41 +1,38 @@ package ru.betterend.util.sdf.primitive; import java.util.function.Function; - +import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.core.BlockPos; import ru.betterend.util.sdf.SDF; public abstract class SDFPrimitive extends SDF { protected Function placerFunction; - + public SDFPrimitive setBlock(Function placerFunction) { this.placerFunction = placerFunction; return this; } - + public SDFPrimitive setBlock(BlockState state) { this.placerFunction = (pos) -> { return state; }; return this; } - + public SDFPrimitive setBlock(Block block) { this.placerFunction = (pos) -> { return block.defaultBlockState(); }; return this; } - + public BlockState getBlockState(BlockPos pos) { return placerFunction.apply(pos); } - - /* - * public abstract CompoundTag toNBT(CompoundTag root) { - * - * } - */ + + /*public abstract CompoundTag toNBT(CompoundTag root) { + + }*/ } diff --git a/src/main/java/ru/betterend/world/biome/BiomeDefinition.java b/src/main/java/ru/betterend/world/biome/BiomeDefinition.java index 8a02e4a9..687db4cb 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeDefinition.java +++ b/src/main/java/ru/betterend/world/biome/BiomeDefinition.java @@ -1,39 +1,36 @@ package ru.betterend.world.biome; import java.util.List; - -import com.google.common.collect.Lists; - +import net.minecraft.core.Registry; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.Music; +import net.minecraft.sounds.Musics; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.biome.AmbientAdditionsSettings; +import net.minecraft.world.level.biome.AmbientMoodSettings; +import net.minecraft.world.level.biome.AmbientParticleSettings; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Biome.BiomeCategory; +import net.minecraft.world.level.biome.Biome.Precipitation; +import net.minecraft.world.level.biome.BiomeGenerationSettings; +import net.minecraft.world.level.biome.BiomeSpecialEffects.Builder; +import net.minecraft.world.level.biome.MobSpawnSettings; +import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; -import net.minecraft.client.sound.MusicType; -import net.minecraft.world.entity.EntityType; -import net.minecraft.core.particles.ParticleOptions; -import net.minecraft.sound.BiomeAdditionsSound; -import net.minecraft.sound.BiomeMoodSound; -import net.minecraft.sound.MusicSound; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.Mth; -import net.minecraft.core.Registry; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.Biome.Category; -import net.minecraft.world.level.biome.Biome.Precipitation; -import net.minecraft.world.biome.BiomeEffects.Builder; -import net.minecraft.world.biome.BiomeParticleConfig; -import net.minecraft.world.biome.GenerationSettings; -import net.minecraft.world.biome.SpawnSettings; -import net.minecraft.world.biome.SpawnSettings.SpawnEntry; -import net.minecraft.world.gen.GenerationStep.Carver; -import net.minecraft.world.gen.GenerationStep.Feature; -import net.minecraft.world.gen.ProbabilityConfig; -import net.minecraft.world.gen.carver.ConfiguredCarver; +import net.minecraft.world.level.levelgen.GenerationStep.Carving; +import net.minecraft.world.level.levelgen.GenerationStep.Decoration; +import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; -import net.minecraft.world.gen.surfacebuilder.ConfiguredSurfaceBuilder; -import net.minecraft.world.gen.surfacebuilder.ConfiguredSurfaceBuilders; -import net.minecraft.world.gen.surfacebuilder.SurfaceBuilder; -import net.minecraft.world.gen.surfacebuilder.TernarySurfaceConfig; +import net.minecraft.world.level.levelgen.feature.configurations.ProbabilityFeatureConfiguration; +import net.minecraft.world.level.levelgen.surfacebuilders.ConfiguredSurfaceBuilder; +import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilder; +import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderBaseConfiguration; +import com.google.common.collect.Lists; import ru.betterend.BetterEnd; import ru.betterend.registry.EndFeatures; import ru.betterend.util.MHelper; @@ -44,16 +41,16 @@ import ru.betterend.world.surface.SurfaceBuilders; public class BiomeDefinition { private static final int DEF_FOLIAGE = MHelper.color(197, 210, 112); - + private final List> structures = Lists.newArrayList(); private final List features = Lists.newArrayList(); private final List carvers = Lists.newArrayList(); private final List mobs = Lists.newArrayList(); - private final List spawns = Lists.newArrayList(); + private final List spawns = Lists.newArrayList(); - private BiomeParticleConfig particleConfig; - private BiomeAdditionsSound additions; - private BiomeMoodSound mood; + private AmbientParticleSettings particleConfig; + private AmbientAdditionsSettings additions; + private AmbientMoodSettings mood; private SoundEvent music; private SoundEvent loop; @@ -69,56 +66,58 @@ public class BiomeDefinition { private float genChance = 1F; private boolean hasCaves = true; private boolean isCaveBiome = false; - + private ConfiguredSurfaceBuilder surface; public BiomeDefinition(String name) { this.id = BetterEnd.makeID(name); } - + public BiomeDefinition setCaveBiome() { isCaveBiome = true; return this; } - + public BiomeDefinition setSurface(Block block) { - setSurface(SurfaceBuilder.DEFAULT.withConfig(new TernarySurfaceConfig(block.defaultBlockState(), - Blocks.END_STONE.defaultBlockState(), Blocks.END_STONE.defaultBlockState()))); + setSurface(SurfaceBuilder.DEFAULT.configured(new SurfaceBuilderBaseConfiguration( + block.defaultBlockState(), + Blocks.END_STONE.defaultBlockState(), + Blocks.END_STONE.defaultBlockState() + ))); return this; } - + public BiomeDefinition setSurface(Block block1, Block block2) { - setSurface(DoubleBlockSurfaceBuilder.register("be_" + id.getPath() + "_surface").setBlock1(block1) - .setBlock2(block2).configured()); + setSurface(DoubleBlockSurfaceBuilder.register("be_" + id.getPath() + "_surface").setBlock1(block1).setBlock2(block2).configured()); return this; } - + public BiomeDefinition setSurface(ConfiguredSurfaceBuilder builder) { this.surface = builder; return this; } - - public BiomeDefinition setSurface(SurfaceBuilder builder) { - return setSurface(builder.withConfig(SurfaceBuilders.DEFAULT_END_CONFIG)); + + public BiomeDefinition setSurface(SurfaceBuilder builder) { + return setSurface(builder.configured(SurfaceBuilders.DEFAULT_END_CONFIG)); } public BiomeDefinition setParticles(ParticleOptions particle, float probability) { - this.particleConfig = new BiomeParticleConfig(particle, probability); + this.particleConfig = new AmbientParticleSettings(particle, probability); return this; } - + public BiomeDefinition setGenChance(float genChance) { this.genChance = genChance; return this; } - + public BiomeDefinition setDepth(float depth) { this.depth = depth; return this; } public BiomeDefinition addMobSpawn(EntityType type, int weight, int minGroupSize, int maxGroupSize) { - ResourceLocation eID = Registry.ENTITY_TYPE.getId(type); + ResourceLocation eID = Registry.ENTITY_TYPE.getKey(type); if (eID != Registry.ENTITY_TYPE.getDefaultKey()) { SpawnInfo info = new SpawnInfo(); info.type = type; @@ -129,8 +128,8 @@ public class BiomeDefinition { } return this; } - - public BiomeDefinition addMobSpawn(SpawnEntry entry) { + + public BiomeDefinition addMobSpawn(SpawnerData entry) { spawns.add(entry); return this; } @@ -139,12 +138,12 @@ public class BiomeDefinition { structures.add(feature); return this; } - + public BiomeDefinition addStructureFeature(EndStructureFeature feature) { structures.add(feature.getFeatureConfigured()); return this; } - + public BiomeDefinition addFeature(EndFeature feature) { FeatureInfo info = new FeatureInfo(); info.featureStep = feature.getFeatureStep(); @@ -153,14 +152,14 @@ public class BiomeDefinition { return this; } - public BiomeDefinition addFeature(Feature featureStep, ConfiguredFeature feature) { + public BiomeDefinition addFeature(Decoration featureStep, ConfiguredFeature feature) { FeatureInfo info = new FeatureInfo(); info.featureStep = featureStep; info.feature = feature; features.add(info); return this; } - + private int getColor(int r, int g, int b) { r = Mth.clamp(r, 0, 255); g = Mth.clamp(g, 0, 255); @@ -187,21 +186,21 @@ public class BiomeDefinition { this.waterFogColor = getColor(r, g, b); return this; } - + public BiomeDefinition setWaterAndFogColor(int r, int g, int b) { return setWaterColor(r, g, b).setWaterFogColor(r, g, b); } - + public BiomeDefinition setFoliageColor(int r, int g, int b) { this.foliageColor = getColor(r, g, b); return this; } - + public BiomeDefinition setGrassColor(int r, int g, int b) { this.grassColor = getColor(r, g, b); return this; } - + public BiomeDefinition setPlantsColor(int r, int g, int b) { return this.setFoliageColor(r, g, b).setGrassColor(r, g, b); } @@ -212,12 +211,12 @@ public class BiomeDefinition { } public BiomeDefinition setMood(SoundEvent mood) { - this.mood = new BiomeMoodSound(mood, 6000, 8, 2.0D); + this.mood = new AmbientMoodSettings(mood, 6000, 8, 2.0D); return this; } public BiomeDefinition setAdditions(SoundEvent additions) { - this.additions = new BiomeAdditionsSound(additions, 0.0111); + this.additions = new AmbientAdditionsSettings(additions, 0.0111); return this; } @@ -225,48 +224,49 @@ public class BiomeDefinition { this.music = music; return this; } - + public BiomeDefinition setCaves(boolean hasCaves) { this.hasCaves = hasCaves; return this; } public Biome build() { - SpawnSettings.Builder spawnSettings = new SpawnSettings.Builder(); - GenerationSettings.Builder generationSettings = new GenerationSettings.Builder(); + MobSpawnSettings.Builder spawnSettings = new MobSpawnSettings.Builder(); + BiomeGenerationSettings.Builder generationSettings = new BiomeGenerationSettings.Builder(); Builder effects = new Builder(); mobs.forEach((spawn) -> { - spawnSettings.spawn(spawn.type.getSpawnGroup(), - new SpawnSettings.SpawnEntry(spawn.type, spawn.weight, spawn.minGroupSize, spawn.maxGroupSize)); + spawnSettings.addSpawn(spawn.type.getCategory(), new MobSpawnSettings.SpawnerData(spawn.type, spawn.weight, spawn.minGroupSize, spawn.maxGroupSize)); }); - + spawns.forEach((entry) -> { - spawnSettings.spawn(entry.type.getSpawnGroup(), entry); + spawnSettings.addSpawn(entry.type.getCategory(), entry); }); EndFeatures.addDefaultFeatures(this); - generationSettings.surfaceBuilder(surface == null ? ConfiguredSurfaceBuilders.END : surface); - structures.forEach((structure) -> generationSettings.structureFeature(structure)); - features.forEach((info) -> generationSettings.feature(info.featureStep, info.feature)); - carvers.forEach((info) -> generationSettings.carver(info.carverStep, info.carver)); + generationSettings.surfaceBuilder(surface == null ? net.minecraft.data.worldgen.SurfaceBuilders.END : surface); + structures.forEach((structure) -> generationSettings.addStructureStart(structure)); + features.forEach((info) -> generationSettings.addFeature(info.featureStep, info.feature)); + carvers.forEach((info) -> generationSettings.addCarver(info.carverStep, info.carver)); - effects.skyColor(0).waterColor(waterColor).waterFogColor(waterFogColor).fogColor(fogColor) - .foliageColor(foliageColor).grassColor(grassColor); - if (loop != null) - effects.loopSound(loop); - if (mood != null) - effects.moodSound(mood); - if (additions != null) - effects.additionsSound(additions); - if (particleConfig != null) - effects.particleConfig(particleConfig); - effects.music(music != null ? new MusicSound(music, 600, 2400, true) : MusicType.END); + effects.skyColor(0).waterColor(waterColor).waterFogColor(waterFogColor).fogColor(fogColor).foliageColorOverride(foliageColor).grassColorOverride(grassColor); + if (loop != null) effects.ambientLoopSound(loop); + if (mood != null) effects.ambientMoodSound(mood); + if (additions != null) effects.ambientAdditionsSound(additions); + if (particleConfig != null) effects.ambientParticle(particleConfig); + effects.backgroundMusic(music != null ? new Music(music, 600, 2400, true) : Musics.END); - return new Biome.Builder().precipitation(Precipitation.NONE) - .category(isCaveBiome ? Category.NONE : Category.THEEND).depth(depth).scale(0.2F).temperature(2.0F) - .downfall(0.0F).effects(effects.build()).spawnSettings(spawnSettings.build()) - .generationSettings(generationSettings.build()).build(); + return new Biome.BiomeBuilder() + .precipitation(Precipitation.NONE) + .biomeCategory(isCaveBiome ? BiomeCategory.NONE : BiomeCategory.THEEND) + .depth(depth) + .scale(0.2F) + .temperature(2.0F) + .downfall(0.0F) + .specialEffects(effects.build()) + .mobSpawnSettings(spawnSettings.build()) + .generationSettings(generationSettings.build()) + .build(); } private static final class SpawnInfo { @@ -277,19 +277,19 @@ public class BiomeDefinition { } private static final class FeatureInfo { - Feature featureStep; + Decoration featureStep; ConfiguredFeature feature; } - + private static final class CarverInfo { - Carver carverStep; - ConfiguredCarver carver; + Carving carverStep; + ConfiguredWorldCarver carver; } public ResourceLocation getID() { return id; } - + public float getFodDensity() { return fogDensity; } @@ -302,7 +302,7 @@ public class BiomeDefinition { return hasCaves; } - public BiomeDefinition addCarver(Carver carverStep, ConfiguredCarver carver) { + public BiomeDefinition addCarver(Carving carverStep, ConfiguredWorldCarver carver) { CarverInfo info = new CarverInfo(); info.carverStep = carverStep; info.carver = carver; diff --git a/src/main/java/ru/betterend/world/biome/EndBiome.java b/src/main/java/ru/betterend/world/biome/EndBiome.java index 94c553a7..00e8bccc 100644 --- a/src/main/java/ru/betterend/world/biome/EndBiome.java +++ b/src/main/java/ru/betterend/world/biome/EndBiome.java @@ -3,14 +3,12 @@ package ru.betterend.world.biome; import java.io.InputStream; import java.util.List; import java.util.Random; - +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.biome.Biome; import com.google.common.collect.Lists; import com.google.gson.JsonArray; import com.google.gson.JsonObject; - -import net.minecraft.resources.ResourceLocation; -import net.minecraft.core.Registry; -import net.minecraft.world.level.biome.Biome; import ru.betterend.config.Configs; import ru.betterend.util.JsonFactory; import ru.betterend.util.StructureHelper; @@ -82,7 +80,7 @@ public class EndBiome { biome.biomeParent = this; subbiomes.add(biome); } - + public boolean containsSubBiome(EndBiome biome) { return subbiomes.contains(biome); } @@ -137,7 +135,7 @@ public class EndBiome { public float getFogDensity() { return fogDensity; } - + protected void readStructureList() { String ns = mcID.getNamespace(); String nm = mcID.getPath(); @@ -162,11 +160,11 @@ public class EndBiome { } } } - + public EndFeature getStructuresFeature() { return structuresFeature; } - + public Biome getActualBiome() { return this.actualBiome; } @@ -174,15 +172,15 @@ public class EndBiome { public float getGenChance() { return this.genChance; } - + public float getGenChanceImmutable() { return this.genChanceUnmutable; } - + public boolean hasCaves() { return hasCaves; } - + public void updateActualBiomes(Registry biomeRegistry) { subbiomes.forEach((sub) -> { if (sub != this) { @@ -194,7 +192,7 @@ public class EndBiome { } this.actualBiome = biomeRegistry.get(mcID); } - + @Override public boolean equals(Object obj) { if (obj == this) { @@ -203,7 +201,7 @@ public class EndBiome { EndBiome biome = (EndBiome) obj; return biome == null ? false : biome.mcID.equals(mcID); } - + @Override public int hashCode() { return mcID.hashCode(); diff --git a/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java b/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java index 9e2424c9..f90945e3 100644 --- a/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java +++ b/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java @@ -9,9 +9,15 @@ import ru.betterend.world.biome.EndBiome; public class BiomeIceStarfield extends EndBiome { public BiomeIceStarfield() { - super(new BiomeDefinition("ice_starfield").setFogColor(224, 245, 254).setFogDensity(2.2F) - .setFoliageColor(193, 244, 244).setGenChance(0.25F).setParticles(EndParticles.SNOWFLAKE, 0.002F) - .addStructureFeature(EndStructures.GIANT_ICE_STAR).addFeature(EndFeatures.ICE_STAR) - .addFeature(EndFeatures.ICE_STAR_SMALL).addMobSpawn(EntityType.ENDERMAN, 20, 1, 4)); + super(new BiomeDefinition("ice_starfield") + .setFogColor(224, 245, 254) + .setFogDensity(2.2F) + .setFoliageColor(193, 244, 244) + .setGenChance(0.25F) + .setParticles(EndParticles.SNOWFLAKE, 0.002F) + .addStructureFeature(EndStructures.GIANT_ICE_STAR) + .addFeature(EndFeatures.ICE_STAR) + .addFeature(EndFeatures.ICE_STAR_SMALL) + .addMobSpawn(EntityType.ENDERMAN, 20, 1, 4)); } } diff --git a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java index 94368757..673f9556 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java @@ -1,10 +1,9 @@ package ru.betterend.world.biome.cave; import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.util.collection.WeightedList; import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.ai.behavior.WeightedList; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.registry.EndBiomes; import ru.betterend.world.biome.BiomeDefinition; @@ -15,42 +14,44 @@ import ru.betterend.world.features.terrain.caves.CaveChunkPopulatorFeature; public class EndCaveBiome extends EndBiome { private WeightedList> floorFeatures = new WeightedList>(); private WeightedList> ceilFeatures = new WeightedList>(); - + public EndCaveBiome(BiomeDefinition definition) { super(makeDef(definition)); } - + private static BiomeDefinition makeDef(BiomeDefinition definition) { - EndFeature feature = EndFeature.makeChunkFeature(definition.getID().getPath() + "_cave_populator", - new CaveChunkPopulatorFeature(() -> (EndCaveBiome) EndBiomes.getBiome(definition.getID()))); + EndFeature feature = EndFeature.makeChunkFeature( + definition.getID().getPath() + "_cave_populator", + new CaveChunkPopulatorFeature(() -> (EndCaveBiome) EndBiomes.getBiome(definition.getID())) + ); definition.addFeature(feature).setCaveBiome(); return definition; } - + public void addFloorFeature(Feature feature, int weight) { floorFeatures.add(feature, weight); } - + public void addCeilFeature(Feature feature, int weight) { ceilFeatures.add(feature, weight); } - + public Feature getFloorFeature(Random random) { - return floorFeatures.isEmpty() ? null : floorFeatures.pickRandom(random); + return floorFeatures.isEmpty() ? null : floorFeatures.getOne(random); } - + public Feature getCeilFeature(Random random) { - return ceilFeatures.isEmpty() ? null : ceilFeatures.pickRandom(random); + return ceilFeatures.isEmpty() ? null : ceilFeatures.getOne(random); } - + public float getFloorDensity() { return 0; } - + public float getCeilDensity() { return 0; } - + public BlockState getCeil(BlockPos pos) { return null; } diff --git a/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java index 5e8ddcb4..52ff7f1b 100644 --- a/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java @@ -1,7 +1,7 @@ package ru.betterend.world.biome.cave; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.registry.EndBlocks; @@ -12,34 +12,39 @@ import ru.betterend.world.biome.BiomeDefinition; public class LushAuroraCaveBiome extends EndCaveBiome { public LushAuroraCaveBiome() { - super(new BiomeDefinition("lush_aurora_cave").setFogColor(150, 30, 68).setFogDensity(2.0F) - .setPlantsColor(108, 25, 46).setWaterAndFogColor(186, 77, 237).setMusic(EndSounds.MUSIC_FOREST) - .setParticles(EndParticles.GLOWING_SPHERE, 0.001F).setSurface(EndBlocks.CAVE_MOSS)); - + super(new BiomeDefinition("lush_aurora_cave") + .setFogColor(150, 30, 68) + .setFogDensity(2.0F) + .setPlantsColor(108, 25, 46) + .setWaterAndFogColor(186, 77, 237) + .setMusic(EndSounds.MUSIC_FOREST) + .setParticles(EndParticles.GLOWING_SPHERE, 0.001F) + .setSurface(EndBlocks.CAVE_MOSS)); + this.addFloorFeature(EndFeatures.BIG_AURORA_CRYSTAL, 1); this.addFloorFeature(EndFeatures.CAVE_BUSH, 5); this.addFloorFeature(EndFeatures.CAVE_GRASS, 40); this.addFloorFeature(EndFeatures.END_STONE_STALAGMITE_CAVEMOSS, 5); - + this.addCeilFeature(EndFeatures.CAVE_BUSH, 1); this.addCeilFeature(EndFeatures.CAVE_PUMPKIN, 1); this.addCeilFeature(EndFeatures.RUBINEA, 3); this.addCeilFeature(EndFeatures.MAGNULA, 1); this.addCeilFeature(EndFeatures.END_STONE_STALACTITE_CAVEMOSS, 10); } - + @Override public float getFloorDensity() { return 0.2F; } - + @Override public float getCeilDensity() { return 0.1F; } - + @Override public BlockState getCeil(BlockPos pos) { - return EndBlocks.CAVE_MOSS.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP); + return EndBlocks.CAVE_MOSS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP); } } diff --git a/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java b/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java index ea5ad1ce..43dd0840 100644 --- a/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java @@ -1,7 +1,7 @@ package ru.betterend.world.biome.land; +import net.minecraft.data.worldgen.StructureFeatures; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; @@ -12,15 +12,27 @@ import ru.betterend.world.biome.EndBiome; public class AmberLandBiome extends EndBiome { public AmberLandBiome() { - super(new BiomeDefinition("amber_land").setFogColor(255, 184, 71).setFogDensity(2.0F) - .setPlantsColor(219, 115, 38).setWaterAndFogColor(145, 108, 72).setMusic(EndSounds.MUSIC_FOREST) - .setParticles(EndParticles.AMBER_SPHERE, 0.001F).setSurface(EndBlocks.AMBER_MOSS) - .addFeature(EndFeatures.AMBER_ORE).addFeature(EndFeatures.END_LAKE_RARE) - .addFeature(EndFeatures.HELIX_TREE).addFeature(EndFeatures.LANCELEAF) - .addFeature(EndFeatures.GLOW_PILLAR).addFeature(EndFeatures.AMBER_GRASS) - .addFeature(EndFeatures.AMBER_ROOT).addFeature(EndFeatures.BULB_MOSS) - .addFeature(EndFeatures.BULB_MOSS_WOOD).addFeature(EndFeatures.CHARNIA_ORANGE) - .addFeature(EndFeatures.CHARNIA_RED).addStructureFeature(ConfiguredStructureFeatures.END_CITY) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4).addMobSpawn(EndEntities.END_SLIME, 30, 1, 2)); + super(new BiomeDefinition("amber_land") + .setFogColor(255, 184, 71) + .setFogDensity(2.0F) + .setPlantsColor(219, 115, 38) + .setWaterAndFogColor(145, 108, 72) + .setMusic(EndSounds.MUSIC_FOREST) + .setParticles(EndParticles.AMBER_SPHERE, 0.001F) + .setSurface(EndBlocks.AMBER_MOSS) + .addFeature(EndFeatures.AMBER_ORE) + .addFeature(EndFeatures.END_LAKE_RARE) + .addFeature(EndFeatures.HELIX_TREE) + .addFeature(EndFeatures.LANCELEAF) + .addFeature(EndFeatures.GLOW_PILLAR) + .addFeature(EndFeatures.AMBER_GRASS) + .addFeature(EndFeatures.AMBER_ROOT) + .addFeature(EndFeatures.BULB_MOSS) + .addFeature(EndFeatures.BULB_MOSS_WOOD) + .addFeature(EndFeatures.CHARNIA_ORANGE) + .addFeature(EndFeatures.CHARNIA_RED) + .addStructureFeature(StructureFeatures.END_CITY) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4) + .addMobSpawn(EndEntities.END_SLIME, 30, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java b/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java index 546443bb..8bd7c58c 100644 --- a/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java @@ -10,14 +10,26 @@ import ru.betterend.world.biome.EndBiome; public class BlossomingSpiresBiome extends EndBiome { public BlossomingSpiresBiome() { - super(new BiomeDefinition("blossoming_spires").setFogColor(241, 146, 229).setFogDensity(1.7F) - .setPlantsColor(122, 45, 122).setCaves(false).setSurface(EndBlocks.PINK_MOSS) - .setMusic(EndSounds.MUSIC_FOREST).setLoop(EndSounds.AMBIENT_BLOSSOMING_SPIRES) - .addFeature(EndFeatures.SPIRE).addFeature(EndFeatures.FLOATING_SPIRE).addFeature(EndFeatures.TENANEA) - .addFeature(EndFeatures.TENANEA_BUSH).addFeature(EndFeatures.BULB_VINE) - .addFeature(EndFeatures.BUSHY_GRASS).addFeature(EndFeatures.BUSHY_GRASS_WG) - .addFeature(EndFeatures.BLOSSOM_BERRY).addFeature(EndFeatures.TWISTED_MOSS) - .addFeature(EndFeatures.TWISTED_MOSS_WOOD).addFeature(EndFeatures.SILK_MOTH_NEST) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4).addMobSpawn(EndEntities.SILK_MOTH, 5, 1, 2)); + super(new BiomeDefinition("blossoming_spires") + .setFogColor(241, 146, 229) + .setFogDensity(1.7F) + .setPlantsColor(122, 45, 122) + .setCaves(false) + .setSurface(EndBlocks.PINK_MOSS) + .setMusic(EndSounds.MUSIC_FOREST) + .setLoop(EndSounds.AMBIENT_BLOSSOMING_SPIRES) + .addFeature(EndFeatures.SPIRE) + .addFeature(EndFeatures.FLOATING_SPIRE) + .addFeature(EndFeatures.TENANEA) + .addFeature(EndFeatures.TENANEA_BUSH) + .addFeature(EndFeatures.BULB_VINE) + .addFeature(EndFeatures.BUSHY_GRASS) + .addFeature(EndFeatures.BUSHY_GRASS_WG) + .addFeature(EndFeatures.BLOSSOM_BERRY) + .addFeature(EndFeatures.TWISTED_MOSS) + .addFeature(EndFeatures.TWISTED_MOSS_WOOD) + .addFeature(EndFeatures.SILK_MOTH_NEST) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4) + .addMobSpawn(EndEntities.SILK_MOTH, 5, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java b/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java index 343211dd..0e52fc83 100644 --- a/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java @@ -1,10 +1,10 @@ package ru.betterend.world.biome.land; -import net.minecraft.world.entity.EntityType; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.world.gen.GenerationStep.Feature; -import net.minecraft.world.level.levelgen.feature.ConfiguredFeatures; -import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeatures; +import net.minecraft.data.worldgen.Features; +import net.minecraft.data.worldgen.StructureFeatures; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.levelgen.GenerationStep.Decoration; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; @@ -14,18 +14,30 @@ import ru.betterend.world.biome.EndBiome; public class ChorusForestBiome extends EndBiome { public ChorusForestBiome() { - super(new BiomeDefinition("chorus_forest").setFogColor(87, 26, 87).setFogDensity(1.5F) - .setPlantsColor(122, 45, 122).setWaterAndFogColor(73, 30, 73).setSurface(EndBlocks.CHORUS_NYLIUM) - .setParticles(ParticleTypes.PORTAL, 0.01F).setLoop(EndSounds.AMBIENT_CHORUS_FOREST) - .setMusic(EndSounds.MUSIC_DARK).addFeature(EndFeatures.VIOLECITE_LAYER) - .addFeature(EndFeatures.END_LAKE_RARE).addFeature(EndFeatures.PYTHADENDRON_TREE) - .addFeature(EndFeatures.PYTHADENDRON_BUSH).addFeature(EndFeatures.PURPLE_POLYPORE) - .addFeature(Feature.VEGETAL_DECORATION, ConfiguredFeatures.CHORUS_PLANT) - .addFeature(Feature.VEGETAL_DECORATION, ConfiguredFeatures.CHORUS_PLANT) - .addFeature(EndFeatures.CHORUS_GRASS).addFeature(EndFeatures.CHORUS_MUSHROOM) - .addFeature(EndFeatures.TAIL_MOSS).addFeature(EndFeatures.TAIL_MOSS_WOOD) - .addFeature(EndFeatures.CHARNIA_PURPLE).addFeature(EndFeatures.CHARNIA_RED_RARE) - .addStructureFeature(ConfiguredStructureFeatures.END_CITY).addMobSpawn(EndEntities.END_SLIME, 5, 1, 2) + super(new BiomeDefinition("chorus_forest") + .setFogColor(87, 26, 87) + .setFogDensity(1.5F) + .setPlantsColor(122, 45, 122) + .setWaterAndFogColor(73, 30, 73) + .setSurface(EndBlocks.CHORUS_NYLIUM) + .setParticles(ParticleTypes.PORTAL, 0.01F) + .setLoop(EndSounds.AMBIENT_CHORUS_FOREST) + .setMusic(EndSounds.MUSIC_DARK) + .addFeature(EndFeatures.VIOLECITE_LAYER) + .addFeature(EndFeatures.END_LAKE_RARE) + .addFeature(EndFeatures.PYTHADENDRON_TREE) + .addFeature(EndFeatures.PYTHADENDRON_BUSH) + .addFeature(EndFeatures.PURPLE_POLYPORE) + .addFeature(Decoration.VEGETAL_DECORATION, Features.CHORUS_PLANT) + .addFeature(Decoration.VEGETAL_DECORATION, Features.CHORUS_PLANT) + .addFeature(EndFeatures.CHORUS_GRASS) + .addFeature(EndFeatures.CHORUS_MUSHROOM) + .addFeature(EndFeatures.TAIL_MOSS) + .addFeature(EndFeatures.TAIL_MOSS_WOOD) + .addFeature(EndFeatures.CHARNIA_PURPLE) + .addFeature(EndFeatures.CHARNIA_RED_RARE) + .addStructureFeature(StructureFeatures.END_CITY) + .addMobSpawn(EndEntities.END_SLIME, 5, 1, 2) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java b/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java index 06fcc42e..1b398d92 100644 --- a/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java @@ -10,9 +10,13 @@ import ru.betterend.world.biome.EndBiome; public class CrystalMountainsBiome extends EndBiome { public CrystalMountainsBiome() { - super(new BiomeDefinition("crystal_mountains").setPlantsColor(255, 133, 211).setSurface(EndBlocks.CRYSTAL_MOSS) - .setMusic(EndSounds.MUSIC_OPENSPACE).addStructureFeature(EndStructures.MOUNTAIN) - .addFeature(EndFeatures.ROUND_CAVE).addFeature(EndFeatures.CRYSTAL_GRASS) + super(new BiomeDefinition("crystal_mountains") + .setPlantsColor(255, 133, 211) + .setSurface(EndBlocks.CRYSTAL_MOSS) + .setMusic(EndSounds.MUSIC_OPENSPACE) + .addStructureFeature(EndStructures.MOUNTAIN) + .addFeature(EndFeatures.ROUND_CAVE) + .addFeature(EndFeatures.CRYSTAL_GRASS) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java b/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java index 4ac95163..127d0799 100644 --- a/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java @@ -10,14 +10,24 @@ import ru.betterend.world.biome.EndBiome; public class DragonGraveyardsBiome extends EndBiome { public DragonGraveyardsBiome() { - super(new BiomeDefinition("dragon_graveyards").setGenChance(0.1F).setFogColor(244, 46, 79).setFogDensity(1.3F) - .setParticles(EndParticles.FIREFLY, 0.0007F).setMusic(EndSounds.MUSIC_OPENSPACE) - .setLoop(EndSounds.AMBIENT_GLOWING_GRASSLANDS).setSurface(EndBlocks.SANGNUM) - .setWaterAndFogColor(203, 59, 167).setPlantsColor(244, 46, 79) - .addFeature(EndFeatures.OBSIDIAN_PILLAR_BASEMENT).addFeature(EndFeatures.FALLEN_PILLAR) - .addFeature(EndFeatures.OBSIDIAN_BOULDER).addFeature(EndFeatures.GIGANTIC_AMARANITA) - .addFeature(EndFeatures.LARGE_AMARANITA).addFeature(EndFeatures.SMALL_AMARANITA) - .addFeature(EndFeatures.GLOBULAGUS).addFeature(EndFeatures.CLAWFERN) + super(new BiomeDefinition("dragon_graveyards") + .setGenChance(0.1F) + .setFogColor(244, 46, 79) + .setFogDensity(1.3F) + .setParticles(EndParticles.FIREFLY, 0.0007F) + .setMusic(EndSounds.MUSIC_OPENSPACE) + .setLoop(EndSounds.AMBIENT_GLOWING_GRASSLANDS) + .setSurface(EndBlocks.SANGNUM) + .setWaterAndFogColor(203, 59, 167) + .setPlantsColor(244, 46, 79) + .addFeature(EndFeatures.OBSIDIAN_PILLAR_BASEMENT) + .addFeature(EndFeatures.FALLEN_PILLAR) + .addFeature(EndFeatures.OBSIDIAN_BOULDER) + .addFeature(EndFeatures.GIGANTIC_AMARANITA) + .addFeature(EndFeatures.LARGE_AMARANITA) + .addFeature(EndFeatures.SMALL_AMARANITA) + .addFeature(EndFeatures.GLOBULAGUS) + .addFeature(EndFeatures.CLAWFERN) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java b/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java index 77f81198..570c1cb9 100644 --- a/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java @@ -1,7 +1,7 @@ package ru.betterend.world.biome.land; +import net.minecraft.data.worldgen.StructureFeatures; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; @@ -10,10 +10,18 @@ import ru.betterend.world.biome.EndBiome; public class DryShrublandBiome extends EndBiome { public DryShrublandBiome() { - super(new BiomeDefinition("dry_shrubland").setFogColor(132, 35, 13).setFogDensity(1.2F) - .setWaterAndFogColor(113, 88, 53).setPlantsColor(237, 122, 66).setSurface(EndBlocks.RUTISCUS) - .setMusic(EndSounds.MUSIC_OPENSPACE).addFeature(EndFeatures.ORANGO).addFeature(EndFeatures.AERIDIUM) - .addFeature(EndFeatures.LUTEBUS).addFeature(EndFeatures.LAMELLARIUM) - .addStructureFeature(ConfiguredStructureFeatures.END_CITY).addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + super(new BiomeDefinition("dry_shrubland") + .setFogColor(132, 35, 13) + .setFogDensity(1.2F) + .setWaterAndFogColor(113, 88, 53) + .setPlantsColor(237, 122, 66) + .setSurface(EndBlocks.RUTISCUS) + .setMusic(EndSounds.MUSIC_OPENSPACE) + .addFeature(EndFeatures.ORANGO) + .addFeature(EndFeatures.AERIDIUM) + .addFeature(EndFeatures.LUTEBUS) + .addFeature(EndFeatures.LAMELLARIUM) + .addStructureFeature(StructureFeatures.END_CITY) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java b/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java index cc46c7db..85945dec 100644 --- a/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java @@ -1,8 +1,8 @@ package ru.betterend.world.biome.land; -import net.minecraft.world.entity.EntityType; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeatures; +import net.minecraft.data.worldgen.StructureFeatures; +import net.minecraft.world.entity.EntityType; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.BiomeDefinition; @@ -10,10 +10,15 @@ import ru.betterend.world.biome.EndBiome; public class DustWastelandsBiome extends EndBiome { public DustWastelandsBiome() { - super(new BiomeDefinition("dust_wastelands").setFogColor(226, 239, 168).setFogDensity(2) - .setWaterAndFogColor(192, 180, 131).setSurface(EndBlocks.ENDSTONE_DUST) - .setParticles(ParticleTypes.WHITE_ASH, 0.01F).setLoop(EndSounds.AMBIENT_DUST_WASTELANDS) - .setMusic(EndSounds.MUSIC_OPENSPACE).addStructureFeature(ConfiguredStructureFeatures.END_CITY) + super(new BiomeDefinition("dust_wastelands") + .setFogColor(226, 239, 168) + .setFogDensity(2) + .setWaterAndFogColor(192, 180, 131) + .setSurface(EndBlocks.ENDSTONE_DUST) + .setParticles(ParticleTypes.WHITE_ASH, 0.01F) + .setLoop(EndSounds.AMBIENT_DUST_WASTELANDS) + .setMusic(EndSounds.MUSIC_OPENSPACE) + .addStructureFeature(StructureFeatures.END_CITY) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java b/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java index 9f2f2184..cff6f813 100644 --- a/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java @@ -1,7 +1,7 @@ package ru.betterend.world.biome.land; +import net.minecraft.data.worldgen.StructureFeatures; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; @@ -13,20 +13,35 @@ import ru.betterend.world.biome.EndBiome; public class FoggyMushroomlandBiome extends EndBiome { public FoggyMushroomlandBiome() { - super(new BiomeDefinition("foggy_mushroomland").setPlantsColor(73, 210, 209).setFogColor(41, 122, 173) - .setFogDensity(3).setWaterAndFogColor(119, 227, 250) + super(new BiomeDefinition("foggy_mushroomland") + .setPlantsColor(73, 210, 209) + .setFogColor(41, 122, 173) + .setFogDensity(3) + .setWaterAndFogColor(119, 227, 250) .setSurface(EndBlocks.END_MOSS, EndBlocks.END_MYCELIUM) - .setParticles(EndParticles.GLOWING_SPHERE, 0.001F).setLoop(EndSounds.AMBIENT_FOGGY_MUSHROOMLAND) - .setMusic(EndSounds.MUSIC_FOREST).addStructureFeature(EndStructures.GIANT_MOSSY_GLOWSHROOM) - .addFeature(EndFeatures.END_LAKE).addFeature(EndFeatures.MOSSY_GLOWSHROOM) - .addFeature(EndFeatures.BLUE_VINE).addFeature(EndFeatures.UMBRELLA_MOSS) - .addFeature(EndFeatures.CREEPING_MOSS).addFeature(EndFeatures.DENSE_VINE) - .addFeature(EndFeatures.PEARLBERRY).addFeature(EndFeatures.CYAN_MOSS) - .addFeature(EndFeatures.CYAN_MOSS_WOOD).addFeature(EndFeatures.END_LILY) - .addFeature(EndFeatures.BUBBLE_CORAL).addFeature(EndFeatures.CHARNIA_CYAN) - .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE).addFeature(EndFeatures.CHARNIA_RED_RARE) - .addStructureFeature(ConfiguredStructureFeatures.END_CITY).addMobSpawn(EndEntities.DRAGONFLY, 80, 2, 5) - .addMobSpawn(EndEntities.END_FISH, 20, 2, 5).addMobSpawn(EndEntities.CUBOZOA, 10, 3, 8) - .addMobSpawn(EndEntities.END_SLIME, 10, 1, 2).addMobSpawn(EntityType.ENDERMAN, 10, 1, 2)); + .setParticles(EndParticles.GLOWING_SPHERE, 0.001F) + .setLoop(EndSounds.AMBIENT_FOGGY_MUSHROOMLAND) + .setMusic(EndSounds.MUSIC_FOREST) + .addStructureFeature(EndStructures.GIANT_MOSSY_GLOWSHROOM) + .addFeature(EndFeatures.END_LAKE) + .addFeature(EndFeatures.MOSSY_GLOWSHROOM) + .addFeature(EndFeatures.BLUE_VINE) + .addFeature(EndFeatures.UMBRELLA_MOSS) + .addFeature(EndFeatures.CREEPING_MOSS) + .addFeature(EndFeatures.DENSE_VINE) + .addFeature(EndFeatures.PEARLBERRY) + .addFeature(EndFeatures.CYAN_MOSS) + .addFeature(EndFeatures.CYAN_MOSS_WOOD) + .addFeature(EndFeatures.END_LILY) + .addFeature(EndFeatures.BUBBLE_CORAL) + .addFeature(EndFeatures.CHARNIA_CYAN) + .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) + .addFeature(EndFeatures.CHARNIA_RED_RARE) + .addStructureFeature(StructureFeatures.END_CITY) + .addMobSpawn(EndEntities.DRAGONFLY, 80, 2, 5) + .addMobSpawn(EndEntities.END_FISH, 20, 2, 5) + .addMobSpawn(EndEntities.CUBOZOA, 10, 3, 8) + .addMobSpawn(EndEntities.END_SLIME, 10, 1, 2) + .addMobSpawn(EntityType.ENDERMAN, 10, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java b/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java index 69521075..ffef3fe9 100644 --- a/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java @@ -1,7 +1,7 @@ package ru.betterend.world.biome.land; +import net.minecraft.data.worldgen.StructureFeatures; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; @@ -11,16 +11,29 @@ import ru.betterend.world.biome.EndBiome; public class GlowingGrasslandsBiome extends EndBiome { public GlowingGrasslandsBiome() { - super(new BiomeDefinition("glowing_grasslands").setFogColor(99, 228, 247).setFogDensity(1.3F) - .setParticles(EndParticles.FIREFLY, 0.001F).setMusic(EndSounds.MUSIC_OPENSPACE) - .setLoop(EndSounds.AMBIENT_GLOWING_GRASSLANDS).setSurface(EndBlocks.END_MOSS) - .setWaterAndFogColor(92, 250, 230).setPlantsColor(73, 210, 209).addFeature(EndFeatures.END_LAKE_RARE) - .addFeature(EndFeatures.LUMECORN).addFeature(EndFeatures.BLOOMING_COOKSONIA) - .addFeature(EndFeatures.SALTEAGO).addFeature(EndFeatures.VAIOLUSH_FERN).addFeature(EndFeatures.FRACTURN) - .addFeature(EndFeatures.UMBRELLA_MOSS_RARE).addFeature(EndFeatures.CREEPING_MOSS_RARE) - .addFeature(EndFeatures.TWISTED_UMBRELLA_MOSS_RARE).addFeature(EndFeatures.CHARNIA_CYAN) - .addFeature(EndFeatures.CHARNIA_GREEN).addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) - .addFeature(EndFeatures.CHARNIA_RED_RARE).addStructureFeature(ConfiguredStructureFeatures.END_CITY) + super(new BiomeDefinition("glowing_grasslands") + .setFogColor(99, 228, 247) + .setFogDensity(1.3F) + .setParticles(EndParticles.FIREFLY, 0.001F) + .setMusic(EndSounds.MUSIC_OPENSPACE) + .setLoop(EndSounds.AMBIENT_GLOWING_GRASSLANDS) + .setSurface(EndBlocks.END_MOSS) + .setWaterAndFogColor(92, 250, 230) + .setPlantsColor(73, 210, 209) + .addFeature(EndFeatures.END_LAKE_RARE) + .addFeature(EndFeatures.LUMECORN) + .addFeature(EndFeatures.BLOOMING_COOKSONIA) + .addFeature(EndFeatures.SALTEAGO) + .addFeature(EndFeatures.VAIOLUSH_FERN) + .addFeature(EndFeatures.FRACTURN) + .addFeature(EndFeatures.UMBRELLA_MOSS_RARE) + .addFeature(EndFeatures.CREEPING_MOSS_RARE) + .addFeature(EndFeatures.TWISTED_UMBRELLA_MOSS_RARE) + .addFeature(EndFeatures.CHARNIA_CYAN) + .addFeature(EndFeatures.CHARNIA_GREEN) + .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) + .addFeature(EndFeatures.CHARNIA_RED_RARE) + .addStructureFeature(StructureFeatures.END_CITY) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java index 5ffd7775..ef96a8c1 100644 --- a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java @@ -1,7 +1,7 @@ package ru.betterend.world.biome.land; +import net.minecraft.data.worldgen.StructureFeatures; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; @@ -11,15 +11,29 @@ import ru.betterend.world.biome.EndBiome; public class LanternWoodsBiome extends EndBiome { public LanternWoodsBiome() { - super(new BiomeDefinition("lantern_woods").setFogColor(189, 82, 70).setFogDensity(1.1F) - .setWaterAndFogColor(171, 234, 226).setPlantsColor(254, 85, 57).setSurface(EndBlocks.RUTISCUS) - .setMusic(EndSounds.MUSIC_FOREST).setParticles(EndParticles.GLOWING_SPHERE, 0.001F) - .addFeature(EndFeatures.END_LAKE_NORMAL).addFeature(EndFeatures.FLAMAEA) - .addFeature(EndFeatures.LUCERNIA).addFeature(EndFeatures.LUCERNIA_BUSH).addFeature(EndFeatures.FILALUX) - .addFeature(EndFeatures.AERIDIUM).addFeature(EndFeatures.LAMELLARIUM) - .addFeature(EndFeatures.BOLUX_MUSHROOM).addFeature(EndFeatures.AURANT_POLYPORE) - .addFeature(EndFeatures.POND_ANEMONE).addFeature(EndFeatures.CHARNIA_ORANGE) - .addFeature(EndFeatures.CHARNIA_RED).addFeature(EndFeatures.RUSCUS).addFeature(EndFeatures.RUSCUS_WOOD) - .addStructureFeature(ConfiguredStructureFeatures.END_CITY).addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + super(new BiomeDefinition("lantern_woods") + .setFogColor(189, 82, 70) + .setFogDensity(1.1F) + .setWaterAndFogColor(171, 234, 226) + .setPlantsColor(254, 85, 57) + .setSurface(EndBlocks.RUTISCUS) + .setMusic(EndSounds.MUSIC_FOREST) + .setParticles(EndParticles.GLOWING_SPHERE, 0.001F) + .addFeature(EndFeatures.END_LAKE_NORMAL) + .addFeature(EndFeatures.FLAMAEA) + .addFeature(EndFeatures.LUCERNIA) + .addFeature(EndFeatures.LUCERNIA_BUSH) + .addFeature(EndFeatures.FILALUX) + .addFeature(EndFeatures.AERIDIUM) + .addFeature(EndFeatures.LAMELLARIUM) + .addFeature(EndFeatures.BOLUX_MUSHROOM) + .addFeature(EndFeatures.AURANT_POLYPORE) + .addFeature(EndFeatures.POND_ANEMONE) + .addFeature(EndFeatures.CHARNIA_ORANGE) + .addFeature(EndFeatures.CHARNIA_RED) + .addFeature(EndFeatures.RUSCUS) + .addFeature(EndFeatures.RUSCUS_WOOD) + .addStructureFeature(StructureFeatures.END_CITY) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java b/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java index ad87875c..998c1adc 100644 --- a/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java @@ -11,17 +11,31 @@ import ru.betterend.world.biome.EndBiome; public class MegalakeBiome extends EndBiome { public MegalakeBiome() { - super(new BiomeDefinition("megalake").setPlantsColor(73, 210, 209).setFogColor(178, 209, 248) - .setWaterAndFogColor(96, 163, 255).setFogDensity(1.75F).setMusic(EndSounds.MUSIC_WATER) - .setLoop(EndSounds.AMBIENT_MEGALAKE).setSurface(EndBlocks.END_MOSS, EndBlocks.ENDSTONE_DUST) - .setDepth(0F).addStructureFeature(EndStructures.MEGALAKE).addFeature(EndFeatures.END_LOTUS) - .addFeature(EndFeatures.END_LOTUS_LEAF).addFeature(EndFeatures.BUBBLE_CORAL_RARE) - .addFeature(EndFeatures.END_LILY_RARE).addFeature(EndFeatures.UMBRELLA_MOSS) - .addFeature(EndFeatures.CREEPING_MOSS).addFeature(EndFeatures.PEARLBERRY) - .addFeature(EndFeatures.CHARNIA_CYAN).addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) - .addFeature(EndFeatures.CHARNIA_RED_RARE).addFeature(EndFeatures.MENGER_SPONGE) - .addMobSpawn(EndEntities.DRAGONFLY, 50, 1, 3).addMobSpawn(EndEntities.END_FISH, 50, 3, 8) - .addMobSpawn(EndEntities.CUBOZOA, 50, 3, 8).addMobSpawn(EndEntities.END_SLIME, 5, 1, 2) + super(new BiomeDefinition("megalake") + .setPlantsColor(73, 210, 209) + .setFogColor(178, 209, 248) + .setWaterAndFogColor(96, 163, 255) + .setFogDensity(1.75F) + .setMusic(EndSounds.MUSIC_WATER) + .setLoop(EndSounds.AMBIENT_MEGALAKE) + .setSurface(EndBlocks.END_MOSS, EndBlocks.ENDSTONE_DUST) + .setDepth(0F) + .addStructureFeature(EndStructures.MEGALAKE) + .addFeature(EndFeatures.END_LOTUS) + .addFeature(EndFeatures.END_LOTUS_LEAF) + .addFeature(EndFeatures.BUBBLE_CORAL_RARE) + .addFeature(EndFeatures.END_LILY_RARE) + .addFeature(EndFeatures.UMBRELLA_MOSS) + .addFeature(EndFeatures.CREEPING_MOSS) + .addFeature(EndFeatures.PEARLBERRY) + .addFeature(EndFeatures.CHARNIA_CYAN) + .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) + .addFeature(EndFeatures.CHARNIA_RED_RARE) + .addFeature(EndFeatures.MENGER_SPONGE) + .addMobSpawn(EndEntities.DRAGONFLY, 50, 1, 3) + .addMobSpawn(EndEntities.END_FISH, 50, 3, 8) + .addMobSpawn(EndEntities.CUBOZOA, 50, 3, 8) + .addMobSpawn(EndEntities.END_SLIME, 5, 1, 2) .addMobSpawn(EntityType.ENDERMAN, 10, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java b/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java index 3380f1da..93ca8dab 100644 --- a/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java @@ -12,18 +12,33 @@ import ru.betterend.world.biome.EndBiome; public class MegalakeGroveBiome extends EndBiome { public MegalakeGroveBiome() { - super(new BiomeDefinition("megalake_grove").setPlantsColor(73, 210, 209).setFogColor(178, 209, 248) - .setWaterAndFogColor(96, 163, 255).setFogDensity(2.0F).setParticles(EndParticles.GLOWING_SPHERE, 0.001F) - .setMusic(EndSounds.MUSIC_WATER).setLoop(EndSounds.AMBIENT_MEGALAKE_GROVE) - .setSurface(EndBlocks.END_MOSS).setDepth(0F).addStructureFeature(EndStructures.MEGALAKE_SMALL) - .addFeature(EndFeatures.LACUGROVE).addFeature(EndFeatures.END_LOTUS) - .addFeature(EndFeatures.END_LOTUS_LEAF).addFeature(EndFeatures.BUBBLE_CORAL_RARE) - .addFeature(EndFeatures.END_LILY_RARE).addFeature(EndFeatures.UMBRELLA_MOSS) - .addFeature(EndFeatures.PEARLBERRY).addFeature(EndFeatures.CREEPING_MOSS) - .addFeature(EndFeatures.CHARNIA_CYAN).addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) - .addFeature(EndFeatures.CHARNIA_RED_RARE).addFeature(EndFeatures.MENGER_SPONGE) - .addMobSpawn(EndEntities.DRAGONFLY, 20, 1, 3).addMobSpawn(EndEntities.END_FISH, 20, 3, 8) - .addMobSpawn(EndEntities.CUBOZOA, 50, 3, 8).addMobSpawn(EndEntities.END_SLIME, 5, 1, 2) + super(new BiomeDefinition("megalake_grove") + .setPlantsColor(73, 210, 209) + .setFogColor(178, 209, 248) + .setWaterAndFogColor(96, 163, 255) + .setFogDensity(2.0F) + .setParticles(EndParticles.GLOWING_SPHERE, 0.001F) + .setMusic(EndSounds.MUSIC_WATER) + .setLoop(EndSounds.AMBIENT_MEGALAKE_GROVE) + .setSurface(EndBlocks.END_MOSS) + .setDepth(0F) + .addStructureFeature(EndStructures.MEGALAKE_SMALL) + .addFeature(EndFeatures.LACUGROVE) + .addFeature(EndFeatures.END_LOTUS) + .addFeature(EndFeatures.END_LOTUS_LEAF) + .addFeature(EndFeatures.BUBBLE_CORAL_RARE) + .addFeature(EndFeatures.END_LILY_RARE) + .addFeature(EndFeatures.UMBRELLA_MOSS) + .addFeature(EndFeatures.PEARLBERRY) + .addFeature(EndFeatures.CREEPING_MOSS) + .addFeature(EndFeatures.CHARNIA_CYAN) + .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) + .addFeature(EndFeatures.CHARNIA_RED_RARE) + .addFeature(EndFeatures.MENGER_SPONGE) + .addMobSpawn(EndEntities.DRAGONFLY, 20, 1, 3) + .addMobSpawn(EndEntities.END_FISH, 20, 3, 8) + .addMobSpawn(EndEntities.CUBOZOA, 50, 3, 8) + .addMobSpawn(EndEntities.END_SLIME, 5, 1, 2) .addMobSpawn(EntityType.ENDERMAN, 10, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java b/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java index 9332aa0e..13fca7d6 100644 --- a/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java @@ -1,8 +1,8 @@ package ru.betterend.world.biome.land; -import net.minecraft.world.entity.EntityType; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeatures; +import net.minecraft.data.worldgen.StructureFeatures; +import net.minecraft.world.entity.EntityType; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; @@ -11,10 +11,17 @@ import ru.betterend.world.biome.EndBiome; public class NeonOasisBiome extends EndBiome { public NeonOasisBiome() { - super(new BiomeDefinition("neon_oasis").setGenChance(0.5F).setFogColor(226, 239, 168).setFogDensity(2) - .setWaterAndFogColor(192, 180, 131).setSurface(EndBlocks.ENDSTONE_DUST, EndBlocks.END_MOSS) - .setParticles(ParticleTypes.WHITE_ASH, 0.01F).setLoop(EndSounds.AMBIENT_DUST_WASTELANDS) - .setMusic(EndSounds.MUSIC_OPENSPACE).addFeature(EndFeatures.NEON_CACTUS) - .addStructureFeature(ConfiguredStructureFeatures.END_CITY).addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + super(new BiomeDefinition("neon_oasis") + .setGenChance(0.5F) + .setFogColor(226, 239, 168) + .setFogDensity(2) + .setWaterAndFogColor(192, 180, 131) + .setSurface(EndBlocks.ENDSTONE_DUST, EndBlocks.END_MOSS) + .setParticles(ParticleTypes.WHITE_ASH, 0.01F) + .setLoop(EndSounds.AMBIENT_DUST_WASTELANDS) + .setMusic(EndSounds.MUSIC_OPENSPACE) + .addFeature(EndFeatures.NEON_CACTUS) + .addStructureFeature(StructureFeatures.END_CITY) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java b/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java index b158608c..08e502a1 100644 --- a/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java @@ -1,7 +1,7 @@ package ru.betterend.world.biome.land; -import net.minecraft.world.entity.EntityType; import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.entity.EntityType; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; @@ -10,10 +10,16 @@ import ru.betterend.world.biome.EndBiome; public class PaintedMountainsBiome extends EndBiome { public PaintedMountainsBiome() { - super(new BiomeDefinition("painted_mountains").setFogColor(226, 239, 168).setFogDensity(2).setCaves(false) - .setWaterAndFogColor(192, 180, 131).setMusic(EndSounds.MUSIC_OPENSPACE) - .setLoop(EndSounds.AMBIENT_DUST_WASTELANDS).setSurface(EndBlocks.ENDSTONE_DUST) - .setParticles(ParticleTypes.WHITE_ASH, 0.01F).addStructureFeature(EndStructures.PAINTED_MOUNTAIN) + super(new BiomeDefinition("painted_mountains") + .setFogColor(226, 239, 168) + .setFogDensity(2) + .setCaves(false) + .setWaterAndFogColor(192, 180, 131) + .setMusic(EndSounds.MUSIC_OPENSPACE) + .setLoop(EndSounds.AMBIENT_DUST_WASTELANDS) + .setSurface(EndBlocks.ENDSTONE_DUST) + .setParticles(ParticleTypes.WHITE_ASH, 0.01F) + .addStructureFeature(EndStructures.PAINTED_MOUNTAIN) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java b/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java index 0ee6a1f5..d27dc451 100644 --- a/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java @@ -1,8 +1,8 @@ package ru.betterend.world.biome.land; -import net.minecraft.world.entity.EntityType; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeatures; +import net.minecraft.data.worldgen.StructureFeatures; +import net.minecraft.world.entity.EntityType; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; @@ -12,18 +12,32 @@ import ru.betterend.world.biome.EndBiome; public class ShadowForestBiome extends EndBiome { public ShadowForestBiome() { - super(new BiomeDefinition("shadow_forest").setFogColor(0, 0, 0).setFogDensity(2.5F).setPlantsColor(45, 45, 45) - .setWaterAndFogColor(42, 45, 80).setSurface(EndBlocks.SHADOW_GRASS) - .setParticles(ParticleTypes.MYCELIUM, 0.01F).setLoop(EndSounds.AMBIENT_CHORUS_FOREST) - .setMusic(EndSounds.MUSIC_DARK).addFeature(EndFeatures.VIOLECITE_LAYER) - .addFeature(EndFeatures.END_LAKE_RARE).addFeature(EndFeatures.DRAGON_TREE) - .addFeature(EndFeatures.DRAGON_TREE_BUSH).addFeature(EndFeatures.SHADOW_PLANT) - .addFeature(EndFeatures.MURKWEED).addFeature(EndFeatures.NEEDLEGRASS) - .addFeature(EndFeatures.SHADOW_BERRY).addFeature(EndFeatures.TWISTED_VINE) - .addFeature(EndFeatures.PURPLE_POLYPORE).addFeature(EndFeatures.TAIL_MOSS) - .addFeature(EndFeatures.TAIL_MOSS_WOOD).addFeature(EndFeatures.CHARNIA_PURPLE) - .addFeature(EndFeatures.CHARNIA_RED_RARE).addStructureFeature(ConfiguredStructureFeatures.END_CITY) - .addMobSpawn(EndEntities.SHADOW_WALKER, 80, 2, 4).addMobSpawn(EntityType.ENDERMAN, 40, 1, 4) + super(new BiomeDefinition("shadow_forest") + .setFogColor(0, 0, 0) + .setFogDensity(2.5F) + .setPlantsColor(45, 45, 45) + .setWaterAndFogColor(42, 45, 80) + .setSurface(EndBlocks.SHADOW_GRASS) + .setParticles(ParticleTypes.MYCELIUM, 0.01F) + .setLoop(EndSounds.AMBIENT_CHORUS_FOREST) + .setMusic(EndSounds.MUSIC_DARK) + .addFeature(EndFeatures.VIOLECITE_LAYER) + .addFeature(EndFeatures.END_LAKE_RARE) + .addFeature(EndFeatures.DRAGON_TREE) + .addFeature(EndFeatures.DRAGON_TREE_BUSH) + .addFeature(EndFeatures.SHADOW_PLANT) + .addFeature(EndFeatures.MURKWEED) + .addFeature(EndFeatures.NEEDLEGRASS) + .addFeature(EndFeatures.SHADOW_BERRY) + .addFeature(EndFeatures.TWISTED_VINE) + .addFeature(EndFeatures.PURPLE_POLYPORE) + .addFeature(EndFeatures.TAIL_MOSS) + .addFeature(EndFeatures.TAIL_MOSS_WOOD) + .addFeature(EndFeatures.CHARNIA_PURPLE) + .addFeature(EndFeatures.CHARNIA_RED_RARE) + .addStructureFeature(StructureFeatures.END_CITY) + .addMobSpawn(EndEntities.SHADOW_WALKER, 80, 2, 4) + .addMobSpawn(EntityType.ENDERMAN, 40, 1, 4) .addMobSpawn(EntityType.PHANTOM, 1, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java b/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java index 161efd76..a1a50d00 100644 --- a/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java @@ -11,15 +11,27 @@ import ru.betterend.world.surface.SurfaceBuilders; public class SulphurSpringsBiome extends EndBiome { public SulphurSpringsBiome() { - super(new BiomeDefinition("sulphur_springs").setSurface(SurfaceBuilders.SULPHURIC_SURFACE) - .setMusic(EndSounds.MUSIC_OPENSPACE).setLoop(EndSounds.AMBIENT_SULPHUR_SPRINGS) - .setWaterColor(25, 90, 157).setWaterFogColor(30, 65, 61).setFogColor(207, 194, 62).setFogDensity(1.5F) - .setCaves(false).setDepth(0F).setParticles(EndParticles.SULPHUR_PARTICLE, 0.001F) - .addFeature(EndFeatures.GEYSER).addFeature(EndFeatures.SURFACE_VENT) - .addFeature(EndFeatures.SULPHURIC_LAKE).addFeature(EndFeatures.SULPHURIC_CAVE) - .addFeature(EndFeatures.HYDRALUX).addFeature(EndFeatures.CHARNIA_GREEN) - .addFeature(EndFeatures.CHARNIA_ORANGE).addFeature(EndFeatures.CHARNIA_RED_RARE) - .addMobSpawn(EndEntities.END_FISH, 50, 3, 8).addMobSpawn(EndEntities.CUBOZOA, 50, 3, 8) + super(new BiomeDefinition("sulphur_springs") + .setSurface(SurfaceBuilders.SULPHURIC_SURFACE) + .setMusic(EndSounds.MUSIC_OPENSPACE) + .setLoop(EndSounds.AMBIENT_SULPHUR_SPRINGS) + .setWaterColor(25, 90, 157) + .setWaterFogColor(30, 65, 61) + .setFogColor(207, 194, 62) + .setFogDensity(1.5F) + .setCaves(false) + .setDepth(0F) + .setParticles(EndParticles.SULPHUR_PARTICLE, 0.001F) + .addFeature(EndFeatures.GEYSER) + .addFeature(EndFeatures.SURFACE_VENT) + .addFeature(EndFeatures.SULPHURIC_LAKE) + .addFeature(EndFeatures.SULPHURIC_CAVE) + .addFeature(EndFeatures.HYDRALUX) + .addFeature(EndFeatures.CHARNIA_GREEN) + .addFeature(EndFeatures.CHARNIA_ORANGE) + .addFeature(EndFeatures.CHARNIA_RED_RARE) + .addMobSpawn(EndEntities.END_FISH, 50, 3, 8) + .addMobSpawn(EndEntities.CUBOZOA, 50, 3, 8) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4)); } } diff --git a/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java b/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java index 29c8e5eb..9da34de6 100644 --- a/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java @@ -1,7 +1,7 @@ package ru.betterend.world.biome.land; +import net.minecraft.data.worldgen.StructureFeatures; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; @@ -11,18 +11,33 @@ import ru.betterend.world.biome.EndBiome; public class UmbrellaJungleBiome extends EndBiome { public UmbrellaJungleBiome() { - super(new BiomeDefinition("umbrella_jungle").setFogColor(87, 223, 221).setWaterAndFogColor(119, 198, 253) - .setFoliageColor(27, 183, 194).setFogDensity(2.3F).setParticles(EndParticles.JUNGLE_SPORE, 0.001F) - .setMusic(EndSounds.MUSIC_FOREST).setLoop(EndSounds.AMBIENT_UMBRELLA_JUNGLE) - .setSurface(EndBlocks.JUNGLE_MOSS).addFeature(EndFeatures.END_LAKE) - .addFeature(EndFeatures.UMBRELLA_TREE).addFeature(EndFeatures.JELLYSHROOM) - .addFeature(EndFeatures.TWISTED_UMBRELLA_MOSS).addFeature(EndFeatures.SMALL_JELLYSHROOM_FLOOR) - .addFeature(EndFeatures.JUNGLE_GRASS).addFeature(EndFeatures.CYAN_MOSS) - .addFeature(EndFeatures.CYAN_MOSS_WOOD).addFeature(EndFeatures.JUNGLE_FERN_WOOD) - .addFeature(EndFeatures.SMALL_JELLYSHROOM_WALL).addFeature(EndFeatures.SMALL_JELLYSHROOM_WOOD) - .addFeature(EndFeatures.SMALL_JELLYSHROOM_CEIL).addFeature(EndFeatures.JUNGLE_VINE) - .addFeature(EndFeatures.CHARNIA_CYAN).addFeature(EndFeatures.CHARNIA_GREEN) - .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE).addFeature(EndFeatures.CHARNIA_RED_RARE) - .addStructureFeature(ConfiguredStructureFeatures.END_CITY).addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + super(new BiomeDefinition("umbrella_jungle") + .setFogColor(87, 223, 221) + .setWaterAndFogColor(119, 198, 253) + .setFoliageColor(27, 183, 194) + .setFogDensity(2.3F) + .setParticles(EndParticles.JUNGLE_SPORE, 0.001F) + .setMusic(EndSounds.MUSIC_FOREST) + .setLoop(EndSounds.AMBIENT_UMBRELLA_JUNGLE) + .setSurface(EndBlocks.JUNGLE_MOSS) + .addFeature(EndFeatures.END_LAKE) + .addFeature(EndFeatures.UMBRELLA_TREE) + .addFeature(EndFeatures.JELLYSHROOM) + .addFeature(EndFeatures.TWISTED_UMBRELLA_MOSS) + .addFeature(EndFeatures.SMALL_JELLYSHROOM_FLOOR) + .addFeature(EndFeatures.JUNGLE_GRASS) + .addFeature(EndFeatures.CYAN_MOSS) + .addFeature(EndFeatures.CYAN_MOSS_WOOD) + .addFeature(EndFeatures.JUNGLE_FERN_WOOD) + .addFeature(EndFeatures.SMALL_JELLYSHROOM_WALL) + .addFeature(EndFeatures.SMALL_JELLYSHROOM_WOOD) + .addFeature(EndFeatures.SMALL_JELLYSHROOM_CEIL) + .addFeature(EndFeatures.JUNGLE_VINE) + .addFeature(EndFeatures.CHARNIA_CYAN) + .addFeature(EndFeatures.CHARNIA_GREEN) + .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) + .addFeature(EndFeatures.CHARNIA_RED_RARE) + .addStructureFeature(StructureFeatures.END_CITY) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java b/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java index 16658b53..9d880546 100644 --- a/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java +++ b/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java @@ -1,17 +1,16 @@ package ru.betterend.world.features; import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; 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.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.gen.surfacebuilder.SurfaceConfig; -import net.minecraft.world.gen.surfacebuilder.TernarySurfaceConfig; +import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderBaseConfiguration; +import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderConfiguration; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.BlocksHelper; import ru.betterend.util.sdf.SDF; @@ -31,10 +30,10 @@ public class BiomeIslandFeature extends DefaultFeature { public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { Biome biome = world.getBiome(pos); - SurfaceConfig surfaceConfig = biome.getGenerationSettings().getSurfaceBuilderConfig(); + SurfaceBuilderConfiguration surfaceConfig = biome.getGenerationSettings().getSurfaceBuilderConfig(); BlockState topMaterial = surfaceConfig.getTopMaterial(); if (BlocksHelper.isFluid(topMaterial)) { - topBlock = ((TernarySurfaceConfig) surfaceConfig).getUnderwaterMaterial(); + topBlock = ((SurfaceBuilderBaseConfiguration) surfaceConfig).getUnderwaterMaterial(); } else { topBlock = topMaterial; } @@ -55,13 +54,12 @@ public class BiomeIslandFeature extends DefaultFeature { }); sdfCone = new SDFTranslate().setTranslate(0, -2, 0).setSource(sdfCone); sdfCone = new SDFDisplacement().setFunction(pos -> { - float deltaX = Math.abs(pos.getX()); - float deltaY = Math.abs(pos.getY()); - float deltaZ = Math.abs(pos.getZ()); + float deltaX = Math.abs(pos.x()); + float deltaY = Math.abs(pos.y()); + float deltaZ = Math.abs(pos.z()); if (deltaY < 2.0f && (deltaX < 3.0f || deltaZ < 3.0F)) return 0.0f; - return (float) simplexNoise.eval(CENTER.getX() + pos.getX(), CENTER.getY() + pos.getY(), - CENTER.getZ() + pos.getZ()); + return (float) simplexNoise.eval(CENTER.getX() + pos.x(), CENTER.getY() + pos.y(), CENTER.getZ() + pos.z()); }).setSource(sdfCone) .setReplaceFunction(state -> BlocksHelper.isFluid(state) || state.getMaterial().isReplaceable()); return sdfCone; diff --git a/src/main/java/ru/betterend/world/features/BlueVineFeature.java b/src/main/java/ru/betterend/world/features/BlueVineFeature.java index b74d5057..92fd0862 100644 --- a/src/main/java/ru/betterend/world/features/BlueVineFeature.java +++ b/src/main/java/ru/betterend/world/features/BlueVineFeature.java @@ -1,7 +1,6 @@ package ru.betterend.world.features; import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; @@ -11,25 +10,24 @@ import ru.betterend.util.MHelper; public class BlueVineFeature extends ScatterFeature { private boolean small; - + public BlueVineFeature() { super(5); } @Override public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { - float d = MHelper.length(center.getX() - blockPos.getX(), center.getZ() - blockPos.getZ()) / radius * 0.6F - + random.nextFloat() * 0.4F; + float d = MHelper.length(center.getX() - blockPos.getX(), center.getZ() - blockPos.getZ()) / radius * 0.6F + random.nextFloat() * 0.4F; small = d > 0.5F; - return EndBlocks.BLUE_VINE_SEED.canPlaceAt(AIR, world, blockPos); + return EndBlocks.BLUE_VINE_SEED.canSurvive(AIR, world, blockPos); } @Override - public void place(WorldGenLevel world, Random random, BlockPos blockPos) { + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { if (small) { - BlocksHelper.setWithoutUpdate(world, blockPos, - EndBlocks.BLUE_VINE_SEED.defaultBlockState().with(EndPlantWithAgeBlock.AGE, random.nextInt(4))); - } else { + BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.BLUE_VINE_SEED.defaultBlockState().setValue(EndPlantWithAgeBlock.AGE, random.nextInt(4))); + } + else { EndPlantWithAgeBlock seed = ((EndPlantWithAgeBlock) EndBlocks.BLUE_VINE_SEED); seed.growAdult(world, random, blockPos); } diff --git a/src/main/java/ru/betterend/world/features/CavePlantFeature.java b/src/main/java/ru/betterend/world/features/CavePlantFeature.java index 63c6b393..c3ed7edb 100644 --- a/src/main/java/ru/betterend/world/features/CavePlantFeature.java +++ b/src/main/java/ru/betterend/world/features/CavePlantFeature.java @@ -1,15 +1,14 @@ package ru.betterend.world.features; import java.util.Random; - -import net.minecraft.world.level.block.Block; import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; import ru.betterend.util.BlocksHelper; public class CavePlantFeature extends FullHeightScatterFeature { private final Block plant; - + public CavePlantFeature(Block plant, int radius) { super(radius); this.plant = plant; @@ -17,11 +16,11 @@ public class CavePlantFeature extends FullHeightScatterFeature { @Override public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { - return plant.canPlaceAt(world.getBlockState(blockPos), world, blockPos); + return plant.canSurvive(world.getBlockState(blockPos), world, blockPos); } @Override - public void place(WorldGenLevel world, Random random, BlockPos blockPos) { + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { BlocksHelper.setWithoutUpdate(world, blockPos, plant); } } diff --git a/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java b/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java index 83e477e7..09016953 100644 --- a/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java +++ b/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java @@ -1,7 +1,6 @@ package ru.betterend.world.features; import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.chunk.ChunkGenerator; @@ -15,17 +14,17 @@ public class CavePumpkinFeature extends DefaultFeature { @Override public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.up()).isIn(EndTags.GEN_TERRAIN) || !world.isAir(pos) - || !world.isAir(pos.below())) { + if (!world.getBlockState(pos.above()).is(EndTags.GEN_TERRAIN) || !world.isEmptyBlock(pos) + || !world.isEmptyBlock(pos.below())) { return false; } int age = random.nextInt(4); BlocksHelper.setWithoutUpdate(world, pos, - EndBlocks.CAVE_PUMPKIN_SEED.defaultBlockState().with(BlockProperties.AGE, age)); + EndBlocks.CAVE_PUMPKIN_SEED.defaultBlockState().setValue(BlockProperties.AGE, age)); if (age > 1) { BlocksHelper.setWithoutUpdate(world, pos.below(), - EndBlocks.CAVE_PUMPKIN.defaultBlockState().with(BlockProperties.SMALL, age < 3)); + EndBlocks.CAVE_PUMPKIN.defaultBlockState().setValue(BlockProperties.SMALL, age < 3)); } return true; diff --git a/src/main/java/ru/betterend/world/features/CharniaFeature.java b/src/main/java/ru/betterend/world/features/CharniaFeature.java index 57636909..c8022a39 100644 --- a/src/main/java/ru/betterend/world/features/CharniaFeature.java +++ b/src/main/java/ru/betterend/world/features/CharniaFeature.java @@ -6,7 +6,7 @@ public class CharniaFeature extends UnderwaterPlantFeature { public CharniaFeature(Block plant) { super(plant, 6); } - + @Override protected int getChance() { return 3; diff --git a/src/main/java/ru/betterend/world/features/CrashedShipFeature.java b/src/main/java/ru/betterend/world/features/CrashedShipFeature.java index 4ac58a3b..64a5838e 100644 --- a/src/main/java/ru/betterend/world/features/CrashedShipFeature.java +++ b/src/main/java/ru/betterend/world/features/CrashedShipFeature.java @@ -1,25 +1,24 @@ package ru.betterend.world.features; import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.Material; -import net.minecraft.structure.Structure; -import net.minecraft.structure.Structure.StructureBlockInfo; -import net.minecraft.structure.StructurePlacementData; -import net.minecraft.structure.processor.BlockIgnoreStructureProcessor; -import net.minecraft.structure.processor.StructureProcessor; -import net.minecraft.structure.processor.StructureProcessorType; -import net.minecraft.util.BlockMirror; -import net.minecraft.world.level.block.Rotation; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.templatesystem.BlockIgnoreProcessor; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessor; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.StructureBlockInfo; +import net.minecraft.world.level.material.Material; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; @@ -28,13 +27,12 @@ import ru.betterend.util.StructureHelper; public class CrashedShipFeature extends NBTStructureFeature { private static final StructureProcessor REPLACER; private static final String STRUCTURE_PATH = "/data/minecraft/structures/end_city/ship.nbt"; - private Structure structure; + private StructureTemplate structure; @Override - protected Structure getStructure(WorldGenLevel world, BlockPos pos, Random random) { + protected StructureTemplate getStructure(WorldGenLevel world, BlockPos pos, Random random) { if (structure == null) { - structure = world.toServerWorld().getStructureManager() - .getStructureOrBlank(new ResourceLocation("end_city/ship")); + structure = world.getLevel().getStructureManager().getOrCreate(new ResourceLocation("end_city/ship")); if (structure == null) { structure = StructureHelper.readStructure(STRUCTURE_PATH); } @@ -49,21 +47,21 @@ public class CrashedShipFeature extends NBTStructureFeature { if (x * x + z * z < 3600) { return false; } - return pos.getY() > 5 && world.getBlockState(pos.below()).isIn(EndTags.GEN_TERRAIN); + return pos.getY() > 5 && world.getBlockState(pos.below()).is(EndTags.GEN_TERRAIN); } @Override protected Rotation getRotation(WorldGenLevel world, BlockPos pos, Random random) { - return Rotation.random(random); + return Rotation.getRandom(random); } @Override - protected BlockMirror getMirror(WorldGenLevel world, BlockPos pos, Random random) { - return BlockMirror.values()[random.nextInt(3)]; + protected Mirror getMirror(WorldGenLevel world, BlockPos pos, Random random) { + return Mirror.values()[random.nextInt(3)]; } @Override - protected int getYOffset(Structure structure, WorldGenLevel world, BlockPos pos, Random random) { + protected int getYOffset(StructureTemplate structure, WorldGenLevel world, BlockPos pos, Random random) { int min = structure.getSize().getY() >> 3; int max = structure.getSize().getY() >> 2; return -MHelper.randRange(min, max, random); @@ -79,45 +77,44 @@ public class CrashedShipFeature extends NBTStructureFeature { NoneFeatureConfiguration featureConfig) { center = new BlockPos(((center.getX() >> 4) << 4) | 8, 128, ((center.getZ() >> 4) << 4) | 8); center = getGround(world, center); - BlockBox bounds = makeBox(center); + BoundingBox bounds = makeBox(center); if (!canSpawn(world, center, random)) { return false; } - Structure structure = getStructure(world, center, random); + StructureTemplate structure = getStructure(world, center, random); Rotation rotation = getRotation(world, center, random); - BlockMirror mirror = getMirror(world, center, random); - BlockPos offset = Structure.transformAround(structure.getSize(), mirror, rotation, BlockPos.ORIGIN); - center = center.add(0, getYOffset(structure, world, center, random) + 0.5, 0); - StructurePlacementData placementData = new StructurePlacementData().setRotation(rotation).setMirror(mirror); - center = center.add(-offset.getX() * 0.5, 0, -offset.getZ() * 0.5); + Mirror mirror = getMirror(world, center, random); + BlockPos offset = StructureTemplate.transform(structure.getSize(), mirror, rotation, BlockPos.ZERO); + center = center.offset(0, getYOffset(structure, world, center, random) + 0.5, 0); + StructurePlaceSettings placementData = new StructurePlaceSettings().setRotation(rotation).setMirror(mirror); + center = center.offset(-offset.getX() * 0.5, 0, -offset.getZ() * 0.5); - BlockBox structB = structure.calculateBoundingBox(placementData, center); + BoundingBox structB = structure.getBoundingBox(placementData, center); bounds = StructureHelper.intersectBoxes(bounds, structB); addStructureData(placementData); - structure.place(world, center, placementData.setBoundingBox(bounds), random); + structure.placeInWorldChunk(world, center, placementData.setBoundingBox(bounds), random); StructureHelper.erodeIntense(world, bounds, random); - BlocksHelper.fixBlocks(world, new BlockPos(bounds.minX, bounds.minY, bounds.minZ), - new BlockPos(bounds.maxX, bounds.maxY, bounds.maxZ)); + BlocksHelper.fixBlocks(world, new BlockPos(bounds.x0, bounds.y0, bounds.z0), + new BlockPos(bounds.x1, bounds.y1, bounds.z1)); return true; } @Override - protected void addStructureData(StructurePlacementData data) { - data.addProcessor(BlockIgnoreStructureProcessor.IGNORE_AIR_AND_STRUCTURE_BLOCKS).addProcessor(REPLACER) - .setIgnoreEntities(true); + protected void addStructureData(StructurePlaceSettings data) { + data.addProcessor(BlockIgnoreProcessor.STRUCTURE_AND_AIR).addProcessor(REPLACER).setIgnoreEntities(true); } static { REPLACER = new StructureProcessor() { @Override - public StructureBlockInfo process(WorldView worldView, BlockPos pos, BlockPos blockPos, + public StructureBlockInfo processBlock(LevelReader worldView, BlockPos pos, BlockPos blockPos, StructureBlockInfo structureBlockInfo, StructureBlockInfo structureBlockInfo2, - StructurePlacementData structurePlacementData) { + StructurePlaceSettings structurePlacementData) { BlockState state = structureBlockInfo2.state; if (state.is(Blocks.SPAWNER) || state.getMaterial().equals(Material.WOOL)) { return new StructureBlockInfo(structureBlockInfo2.pos, AIR, null); diff --git a/src/main/java/ru/betterend/world/features/DefaultFeature.java b/src/main/java/ru/betterend/world/features/DefaultFeature.java index ede487d5..afaf1197 100644 --- a/src/main/java/ru/betterend/world/features/DefaultFeature.java +++ b/src/main/java/ru/betterend/world/features/DefaultFeature.java @@ -1,42 +1,42 @@ package ru.betterend.world.features; -import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.Heightmap.Types; -import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.util.BlocksHelper; public abstract class DefaultFeature extends Feature { protected static final BlockState AIR = Blocks.AIR.defaultBlockState(); protected static final BlockState WATER = Blocks.WATER.defaultBlockState(); - + public DefaultFeature() { super(NoneFeatureConfiguration.CODEC); } - + public static int getYOnSurface(WorldGenLevel world, int x, int z) { return world.getHeight(Types.WORLD_SURFACE, x, z); } - + public static int getYOnSurfaceWG(WorldGenLevel world, int x, int z) { return world.getHeight(Types.WORLD_SURFACE_WG, x, z); } - + public static BlockPos getPosOnSurface(WorldGenLevel world, BlockPos pos) { return world.getHeightmapPos(Types.WORLD_SURFACE, pos); } - + public static BlockPos getPosOnSurfaceWG(WorldGenLevel world, BlockPos pos) { return world.getHeightmapPos(Types.WORLD_SURFACE_WG, pos); } - + public static BlockPos getPosOnSurfaceRaycast(WorldGenLevel world, BlockPos pos) { return getPosOnSurfaceRaycast(world, pos, 256); } - + public static BlockPos getPosOnSurfaceRaycast(WorldGenLevel world, BlockPos pos, int dist) { int h = BlocksHelper.downRay(world, pos, dist); return pos.below(h); diff --git a/src/main/java/ru/betterend/world/features/DoublePlantFeature.java b/src/main/java/ru/betterend/world/features/DoublePlantFeature.java index 38bdabb6..8f1fa22a 100644 --- a/src/main/java/ru/betterend/world/features/DoublePlantFeature.java +++ b/src/main/java/ru/betterend/world/features/DoublePlantFeature.java @@ -1,11 +1,10 @@ package ru.betterend.world.features; import java.util.Random; - -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.basis.DoublePlantBlock; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; @@ -14,29 +13,29 @@ public class DoublePlantFeature extends ScatterFeature { private final Block smallPlant; private final Block largePlant; private Block plant; - + public DoublePlantFeature(Block smallPlant, Block largePlant, int radius) { super(radius); this.smallPlant = smallPlant; this.largePlant = largePlant; } - + @Override public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { - float d = MHelper.length(center.getX() - blockPos.getX(), center.getZ() - blockPos.getZ()) / radius * 0.6F - + random.nextFloat() * 0.4F; + float d = MHelper.length(center.getX() - blockPos.getX(), center.getZ() - blockPos.getZ()) / radius * 0.6F + random.nextFloat() * 0.4F; plant = d < 0.5F ? largePlant : smallPlant; - return plant.canPlaceAt(plant.defaultBlockState(), world, blockPos); + return plant.canSurvive(plant.defaultBlockState(), world, blockPos); } @Override - public void place(WorldGenLevel world, Random random, BlockPos blockPos) { + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { if (plant instanceof DoublePlantBlock) { int rot = random.nextInt(4); - BlockState state = plant.defaultBlockState().with(DoublePlantBlock.ROTATION, rot); + BlockState state = plant.defaultBlockState().setValue(DoublePlantBlock.ROTATION, rot); BlocksHelper.setWithoutUpdate(world, blockPos, state); - BlocksHelper.setWithoutUpdate(world, blockPos.up(), state.with(DoublePlantBlock.TOP, true)); - } else { + BlocksHelper.setWithoutUpdate(world, blockPos.above(), state.setValue(DoublePlantBlock.TOP, true)); + } + else { BlocksHelper.setWithoutUpdate(world, blockPos, plant); } } diff --git a/src/main/java/ru/betterend/world/features/EndFeature.java b/src/main/java/ru/betterend/world/features/EndFeature.java index ac26405d..d9328029 100644 --- a/src/main/java/ru/betterend/world/features/EndFeature.java +++ b/src/main/java/ru/betterend/world/features/EndFeature.java @@ -1,23 +1,23 @@ package ru.betterend.world.features; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.structure.rule.BlockMatchRuleTest; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.data.BuiltinRegistries; import net.minecraft.core.Registry; -import net.minecraft.world.gen.CountConfig; -import net.minecraft.world.gen.GenerationStep; -import net.minecraft.world.gen.decorator.ChanceDecoratorConfig; -import net.minecraft.world.gen.decorator.Decorator; -import net.minecraft.world.gen.decorator.RangeDecoratorConfig; +import net.minecraft.data.BuiltinRegistries; +import net.minecraft.data.worldgen.Features; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.GenerationStep; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; -import net.minecraft.world.level.levelgen.feature.ConfiguredFeatures; -import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.levelgen.feature.Feature; -import net.minecraft.world.level.levelgen.feature.FeatureConfig; -import net.minecraft.world.level.levelgen.feature.OreFeatureConfig; +import net.minecraft.world.level.levelgen.feature.configurations.CountConfiguration; +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.RangeDecoratorConfiguration; +import net.minecraft.world.level.levelgen.placement.ChanceDecoratorConfiguration; +import net.minecraft.world.level.levelgen.placement.FeatureDecorator; +import net.minecraft.world.level.levelgen.structure.templatesystem.BlockMatchTest; import ru.betterend.BetterEnd; import ru.betterend.blocks.complex.StoneMaterial; import ru.betterend.world.features.terrain.OreLayerFeature; @@ -25,117 +25,100 @@ import ru.betterend.world.features.terrain.OreLayerFeature; public class EndFeature { private Feature feature; private ConfiguredFeature featureConfigured; - private GenerationStep.Feature featureStep; - - protected EndFeature() { - } - - public EndFeature(Feature feature, ConfiguredFeature configuredFeature, - GenerationStep.Feature featureStep) { + private GenerationStep.Decoration featureStep; + + protected EndFeature() {} + + public EndFeature(Feature feature, ConfiguredFeature configuredFeature, GenerationStep.Decoration featureStep) { this.featureStep = featureStep; this.feature = feature; this.featureConfigured = configuredFeature; } - - public EndFeature(String name, Feature feature, GenerationStep.Feature featureStep, - ConfiguredFeature configuredFeature) { + + public EndFeature(String name, Feature feature, GenerationStep.Decoration featureStep, ConfiguredFeature configuredFeature) { ResourceLocation id = BetterEnd.makeID(name); this.featureStep = featureStep; this.feature = Registry.register(Registry.FEATURE, id, feature); this.featureConfigured = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, configuredFeature); } - + public EndFeature(String name, Feature feature) { ResourceLocation id = BetterEnd.makeID(name); - this.featureStep = GenerationStep.Feature.VEGETAL_DECORATION; + this.featureStep = GenerationStep.Decoration.VEGETAL_DECORATION; this.feature = Registry.register(Registry.FEATURE, id, feature); - this.featureConfigured = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, feature - .configure(FeatureConfig.DEFAULT).decorate(Decorator.CHANCE.configure(new ChanceDecoratorConfig(100)))); + this.featureConfigured = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, feature.configured(FeatureConfiguration.NONE).decorated(FeatureDecorator.CHANCE.configured(new ChanceDecoratorConfiguration(100)))); } - + public EndFeature(String name, Feature feature, int density) { ResourceLocation id = BetterEnd.makeID(name); - this.featureStep = GenerationStep.Feature.VEGETAL_DECORATION; + this.featureStep = GenerationStep.Decoration.VEGETAL_DECORATION; this.feature = Registry.register(Registry.FEATURE, id, feature); - this.featureConfigured = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, - feature.configure(FeatureConfig.DEFAULT).decorate(ConfiguredFeatures.Decorators.SQUARE_HEIGHTMAP) - .repeatRandomly(density)); + this.featureConfigured = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, feature.configured(FeatureConfiguration.NONE).decorated(Features.Decorators.HEIGHTMAP_SQUARE).countRandom(density)); } - + public static EndFeature makeRawGenFeature(String name, Feature feature, int chance) { - ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT) - .decorate(Decorator.CHANCE.configure(new ChanceDecoratorConfig(chance))); - return new EndFeature(name, feature, GenerationStep.Feature.RAW_GENERATION, configured); + ConfiguredFeature configured = feature.configured(FeatureConfiguration.NONE).decorated(FeatureDecorator.CHANCE.configured(new ChanceDecoratorConfiguration(chance))); + return new EndFeature(name, feature, GenerationStep.Decoration.RAW_GENERATION, configured); } - + public static EndFeature makeLakeFeature(String name, Feature feature, int chance) { - ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT) - .decorate(Decorator.WATER_LAKE.configure(new ChanceDecoratorConfig(chance))); - return new EndFeature(name, feature, GenerationStep.Feature.LAKES, configured); + ConfiguredFeature configured = feature.configured(FeatureConfiguration.NONE).decorated(FeatureDecorator.WATER_LAKE.configured(new ChanceDecoratorConfiguration(chance))); + return new EndFeature(name, feature, GenerationStep.Decoration.LAKES, configured); } - - public static EndFeature makeOreFeature(String name, Block blockOre, int veins, int veinSize, int offset, int minY, - int maxY) { + + public static EndFeature makeOreFeature(String name, Block blockOre, int veins, int veinSize, int offset, int minY, int maxY) { EndFeature newFeature = new EndFeature(); - OreFeatureConfig featureConfig = new OreFeatureConfig(new BlockMatchRuleTest(Blocks.END_STONE), - blockOre.defaultBlockState(), veinSize); - RangeDecoratorConfig rangeDecorator = new RangeDecoratorConfig(offset, minY, maxY); - ConfiguredFeature oreFeature = Feature.ORE.configure(featureConfig) - .decorate(Decorator.RANGE.configure(rangeDecorator)).spreadHorizontally().repeat(veins); + OreConfiguration featureConfig = new OreConfiguration(new BlockMatchTest(Blocks.END_STONE), blockOre.defaultBlockState(), veinSize); + RangeDecoratorConfiguration rangeDecorator = new RangeDecoratorConfiguration(offset, minY, maxY); + ConfiguredFeature oreFeature = Feature.ORE.configured(featureConfig) + .decorated(FeatureDecorator.RANGE.configured(rangeDecorator)) + .squared() + .count(veins); newFeature.feature = Feature.ORE; - newFeature.featureStep = GenerationStep.Feature.UNDERGROUND_ORES; - newFeature.featureConfigured = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, BetterEnd.makeID(name), - oreFeature); - + newFeature.featureStep = GenerationStep.Decoration.UNDERGROUND_ORES; + newFeature.featureConfigured = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, BetterEnd.makeID(name), oreFeature); + return newFeature; } - - public static EndFeature makeLayerFeature(String name, BlockState state, float radius, int minY, int maxY, - int count) { + + public static EndFeature makeLayerFeature(String name, BlockState state, float radius, int minY, int maxY, int count) { OreLayerFeature layer = new OreLayerFeature(state, radius, minY, maxY); - ConfiguredFeature configured = layer.configure(FeatureConfig.DEFAULT) - .decorate(Decorator.COUNT.configure(new CountConfig(count))); - return new EndFeature(name, layer, GenerationStep.Feature.UNDERGROUND_ORES, configured); + ConfiguredFeature configured = layer.configured(FeatureConfiguration.NONE).decorated(FeatureDecorator.COUNT.configured(new CountConfiguration(count))); + return new EndFeature(name, layer, GenerationStep.Decoration.UNDERGROUND_ORES, configured); } - + public static EndFeature makeLayerFeature(String name, Block block, float radius, int minY, int maxY, int count) { OreLayerFeature layer = new OreLayerFeature(block.defaultBlockState(), radius, minY, maxY); - ConfiguredFeature configured = layer.configure(FeatureConfig.DEFAULT) - .decorate(Decorator.COUNT.configure(new CountConfig(count))); - return new EndFeature(name, layer, GenerationStep.Feature.UNDERGROUND_ORES, configured); + ConfiguredFeature configured = layer.configured(FeatureConfiguration.NONE).decorated(FeatureDecorator.COUNT.configured(new CountConfiguration(count))); + return new EndFeature(name, layer, GenerationStep.Decoration.UNDERGROUND_ORES, configured); } - - public static EndFeature makeLayerFeature(String name, StoneMaterial material, float radius, int minY, int maxY, - int count) { + + public static EndFeature makeLayerFeature(String name, StoneMaterial material, float radius, int minY, int maxY, int count) { OreLayerFeature layer = new OreLayerFeature(material.stone.defaultBlockState(), radius, minY, maxY); - ConfiguredFeature configured = layer.configure(FeatureConfig.DEFAULT) - .decorate(Decorator.COUNT.configure(new CountConfig(count))); - return new EndFeature(name, layer, GenerationStep.Feature.UNDERGROUND_ORES, configured); + ConfiguredFeature configured = layer.configured(FeatureConfiguration.NONE).decorated(FeatureDecorator.COUNT.configured(new CountConfiguration(count))); + return new EndFeature(name, layer, GenerationStep.Decoration.UNDERGROUND_ORES, configured); } - + public static EndFeature makeChunkFeature(String name, Feature feature) { - ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT) - .decorate(Decorator.COUNT.configure(new CountConfig(1))); - return new EndFeature(name, feature, GenerationStep.Feature.LOCAL_MODIFICATIONS, configured); + ConfiguredFeature configured = feature.configured(FeatureConfiguration.NONE).decorated(FeatureDecorator.COUNT.configured(new CountConfiguration(1))); + return new EndFeature(name, feature, GenerationStep.Decoration.LOCAL_MODIFICATIONS, configured); } - + public static EndFeature makeChansedFeature(String name, Feature feature, int chance) { - ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT) - .decorate(Decorator.CHANCE.configure(new ChanceDecoratorConfig(chance))); - return new EndFeature(name, feature, GenerationStep.Feature.SURFACE_STRUCTURES, configured); + ConfiguredFeature configured = feature.configured(FeatureConfiguration.NONE).decorated(FeatureDecorator.CHANCE.configured(new ChanceDecoratorConfiguration(chance))); + return new EndFeature(name, feature, GenerationStep.Decoration.SURFACE_STRUCTURES, configured); } - + public static EndFeature makeCountRawFeature(String name, Feature feature, int chance) { - ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT) - .decorate(Decorator.COUNT.configure(new CountConfig(chance))); - return new EndFeature(name, feature, GenerationStep.Feature.RAW_GENERATION, configured); + ConfiguredFeature configured = feature.configured(FeatureConfiguration.NONE).decorated(FeatureDecorator.COUNT.configured(new CountConfiguration(chance))); + return new EndFeature(name, feature, GenerationStep.Decoration.RAW_GENERATION, configured); } - + public static EndFeature makeFeatureConfigured(String name, Feature feature) { - ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT); - return new EndFeature(name, feature, GenerationStep.Feature.RAW_GENERATION, configured); + ConfiguredFeature configured = feature.configured(FeatureConfiguration.NONE); + return new EndFeature(name, feature, GenerationStep.Decoration.RAW_GENERATION, configured); } - + public Feature getFeature() { return feature; } @@ -144,7 +127,7 @@ public class EndFeature { return featureConfigured; } - public GenerationStep.Feature getFeatureStep() { + public GenerationStep.Decoration getFeatureStep() { return featureStep; } } diff --git a/src/main/java/ru/betterend/world/features/EndLilyFeature.java b/src/main/java/ru/betterend/world/features/EndLilyFeature.java index 598a3afc..6172ddf4 100644 --- a/src/main/java/ru/betterend/world/features/EndLilyFeature.java +++ b/src/main/java/ru/betterend/world/features/EndLilyFeature.java @@ -1,7 +1,6 @@ package ru.betterend.world.features; import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.EndLilySeedBlock; @@ -13,11 +12,11 @@ public class EndLilyFeature extends UnderwaterPlantScatter { } @Override - public void place(WorldGenLevel world, Random random, BlockPos blockPos) { + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { EndLilySeedBlock seed = (EndLilySeedBlock) EndBlocks.END_LILY_SEED; seed.grow(world, random, blockPos); } - + @Override protected int getChance() { return 15; diff --git a/src/main/java/ru/betterend/world/features/EndLotusFeature.java b/src/main/java/ru/betterend/world/features/EndLotusFeature.java index 6de29310..ce462ce3 100644 --- a/src/main/java/ru/betterend/world/features/EndLotusFeature.java +++ b/src/main/java/ru/betterend/world/features/EndLotusFeature.java @@ -1,7 +1,6 @@ package ru.betterend.world.features; import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.EndLotusSeedBlock; @@ -13,11 +12,11 @@ public class EndLotusFeature extends UnderwaterPlantScatter { } @Override - public void place(WorldGenLevel world, Random random, BlockPos blockPos) { + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { EndLotusSeedBlock seed = (EndLotusSeedBlock) EndBlocks.END_LOTUS_SEED; seed.grow(world, random, blockPos); } - + @Override protected int getChance() { return 15; diff --git a/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java b/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java index 3ea237c6..9701f584 100644 --- a/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java +++ b/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java @@ -1,13 +1,12 @@ package ru.betterend.world.features; import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.EndLotusLeafBlock; import ru.betterend.registry.EndBlocks; @@ -19,48 +18,46 @@ public class EndLotusLeafFeature extends ScatterFeature { } @Override - public void place(WorldGenLevel world, Random random, BlockPos blockPos) { + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { if (canGenerate(world, blockPos)) { generateLeaf(world, blockPos); } } - + @Override protected int getChance() { return 15; } - + @Override protected BlockPos getCenterGround(WorldGenLevel world, BlockPos pos) { return getPosOnSurface(world, pos); } - + private void generateLeaf(WorldGenLevel world, BlockPos pos) { MutableBlockPos p = new MutableBlockPos(); BlockState leaf = EndBlocks.END_LOTUS_LEAF.defaultBlockState(); - BlocksHelper.setWithoutUpdate(world, pos, leaf.with(EndLotusLeafBlock.SHAPE, TripleShape.BOTTOM)); - for (Direction move : BlocksHelper.HORIZONTAL) { - BlocksHelper.setWithoutUpdate(world, p.set(pos).move(move), leaf - .with(EndLotusLeafBlock.HORIZONTAL_FACING, move).with(EndLotusLeafBlock.SHAPE, TripleShape.MIDDLE)); + BlocksHelper.setWithoutUpdate(world, pos, leaf.setValue(EndLotusLeafBlock.SHAPE, TripleShape.BOTTOM)); + for (Direction move: BlocksHelper.HORIZONTAL) { + BlocksHelper.setWithoutUpdate(world, p.set(pos).move(move), leaf.setValue(EndLotusLeafBlock.HORIZONTAL_FACING, move).setValue(EndLotusLeafBlock.SHAPE, TripleShape.MIDDLE)); } - for (int i = 0; i < 4; i++) { + for (int i = 0; i < 4; i ++) { Direction d1 = BlocksHelper.HORIZONTAL[i]; Direction d2 = BlocksHelper.HORIZONTAL[(i + 1) & 3]; - BlocksHelper.setWithoutUpdate(world, p.set(pos).move(d1).move(d2), - leaf.with(EndLotusLeafBlock.HORIZONTAL_FACING, d1).with(EndLotusLeafBlock.SHAPE, TripleShape.TOP)); + BlocksHelper.setWithoutUpdate(world, p.set(pos).move(d1).move(d2), leaf.setValue(EndLotusLeafBlock.HORIZONTAL_FACING, d1).setValue(EndLotusLeafBlock.SHAPE, TripleShape.TOP)); } } - + private boolean canGenerate(WorldGenLevel world, BlockPos pos) { MutableBlockPos p = new MutableBlockPos(); p.setY(pos.getY()); int count = 0; - for (int x = -1; x < 2; x++) { + for (int x = -1; x < 2; x ++) { p.setX(pos.getX() + x); - for (int z = -1; z < 2; z++) { + for (int z = -1; z < 2; z ++) { p.setZ(pos.getZ() + z); - if (world.isAir(p) && world.getBlockState(p.below()).is(Blocks.WATER)) - count++; + if (world.isEmptyBlock(p) && world.getBlockState(p.below()).is(Blocks.WATER)) + count ++; } } return count == 9; @@ -68,6 +65,6 @@ public class EndLotusLeafFeature extends ScatterFeature { @Override public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { - return world.isAir(blockPos) && world.getBlockState(blockPos.below()).is(Blocks.WATER); + return world.isEmptyBlock(blockPos) && world.getBlockState(blockPos.below()).is(Blocks.WATER); } } diff --git a/src/main/java/ru/betterend/world/features/FilaluxFeature.java b/src/main/java/ru/betterend/world/features/FilaluxFeature.java index e263c2f5..8ad288b0 100644 --- a/src/main/java/ru/betterend/world/features/FilaluxFeature.java +++ b/src/main/java/ru/betterend/world/features/FilaluxFeature.java @@ -1,12 +1,11 @@ package ru.betterend.world.features; import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.state.property.Properties; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.registry.EndBlocks; @@ -19,13 +18,13 @@ public class FilaluxFeature extends SkyScatterFeature { } @Override - public void place(WorldGenLevel world, Random random, BlockPos blockPos) { + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { BlockState vine = EndBlocks.FILALUX.defaultBlockState(); BlockState wings = EndBlocks.FILALUX_WINGS.defaultBlockState(); BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.FILALUX_LANTERN); - BlocksHelper.setWithoutUpdate(world, blockPos.up(), wings.with(Properties.FACING, Direction.UP)); - for (Direction dir : BlocksHelper.HORIZONTAL) { - BlocksHelper.setWithoutUpdate(world, blockPos.offset(dir), wings.with(Properties.FACING, dir)); + BlocksHelper.setWithoutUpdate(world, blockPos.above(), wings.setValue(BlockStateProperties.FACING, Direction.UP)); + for (Direction dir: BlocksHelper.HORIZONTAL) { + BlocksHelper.setWithoutUpdate(world, blockPos.relative(dir), wings.setValue(BlockStateProperties.FACING, dir)); } int length = MHelper.randRange(1, 3, random); for (int i = 1; i <= length; i++) { @@ -33,7 +32,7 @@ public class FilaluxFeature extends SkyScatterFeature { if (i > 1) { shape = i == length ? TripleShape.BOTTOM : TripleShape.MIDDLE; } - BlocksHelper.setWithoutUpdate(world, blockPos.down(i), vine.with(BlockProperties.TRIPLE_SHAPE, shape)); + BlocksHelper.setWithoutUpdate(world, blockPos.below(i), vine.setValue(BlockProperties.TRIPLE_SHAPE, shape)); } } } diff --git a/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java b/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java index 7253dd35..4de057f0 100644 --- a/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java @@ -1,12 +1,11 @@ package ru.betterend.world.features; import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; -import net.minecraft.world.Heightmap; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; @@ -22,12 +21,12 @@ public abstract class FullHeightScatterFeature extends DefaultFeature { public abstract boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius); - public abstract void place(WorldGenLevel world, Random random, BlockPos blockPos); + public abstract void generate(WorldGenLevel world, Random random, BlockPos blockPos); @Override public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, NoneFeatureConfiguration featureConfig) { - int maxY = world.getTopY(Heightmap.Type.WORLD_SURFACE_WG, center.getX(), center.getZ()); + int maxY = world.getHeight(Heightmap.Types.WORLD_SURFACE_WG, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); for (int y = maxY; y > minY; y--) { POS.set(center.getX(), y, center.getZ()); diff --git a/src/main/java/ru/betterend/world/features/GlowPillarFeature.java b/src/main/java/ru/betterend/world/features/GlowPillarFeature.java index f63576e4..64aea15c 100644 --- a/src/main/java/ru/betterend/world/features/GlowPillarFeature.java +++ b/src/main/java/ru/betterend/world/features/GlowPillarFeature.java @@ -1,7 +1,6 @@ package ru.betterend.world.features; import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; @@ -14,15 +13,15 @@ public class GlowPillarFeature extends ScatterFeature { @Override public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { - return EndBlocks.GLOWING_PILLAR_SEED.canPlaceAt(AIR, world, blockPos); + return EndBlocks.GLOWING_PILLAR_SEED.canSurvive(AIR, world, blockPos); } @Override - public void place(WorldGenLevel world, Random random, BlockPos blockPos) { + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { EndPlantWithAgeBlock seed = ((EndPlantWithAgeBlock) EndBlocks.GLOWING_PILLAR_SEED); seed.growAdult(world, random, blockPos); } - + @Override protected int getChance() { return 10; diff --git a/src/main/java/ru/betterend/world/features/HydraluxFeature.java b/src/main/java/ru/betterend/world/features/HydraluxFeature.java index a4004fee..08f7f35c 100644 --- a/src/main/java/ru/betterend/world/features/HydraluxFeature.java +++ b/src/main/java/ru/betterend/world/features/HydraluxFeature.java @@ -1,7 +1,6 @@ package ru.betterend.world.features; import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.HydraluxSaplingBlock; @@ -13,11 +12,11 @@ public class HydraluxFeature extends UnderwaterPlantScatter { } @Override - public void place(WorldGenLevel world, Random random, BlockPos blockPos) { + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { HydraluxSaplingBlock seed = (HydraluxSaplingBlock) EndBlocks.HYDRALUX_SAPLING; seed.grow(world, random, blockPos); } - + @Override protected int getChance() { return 15; diff --git a/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java b/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java index fd900d57..4478357d 100644 --- a/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java @@ -1,12 +1,11 @@ package ru.betterend.world.features; import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; -import net.minecraft.world.Heightmap; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; @@ -22,16 +21,16 @@ public abstract class InvertedScatterFeature extends DefaultFeature { public abstract boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius); - public abstract void place(WorldGenLevel world, Random random, BlockPos blockPos); + public abstract void generate(WorldGenLevel world, Random random, BlockPos blockPos); @Override public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, NoneFeatureConfiguration featureConfig) { - int maxY = world.getTopY(Heightmap.Type.WORLD_SURFACE, center.getX(), center.getZ()); + int maxY = world.getHeight(Heightmap.Types.WORLD_SURFACE, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); for (int y = maxY; y > minY; y--) { POS.set(center.getX(), y, center.getZ()); - if (world.getBlockState(POS).isAir() && !world.getBlockState(POS.up()).isAir()) { + if (world.getBlockState(POS).isAir() && !world.getBlockState(POS.above()).isAir()) { float r = MHelper.randRange(radius * 0.5F, radius, random); int count = MHelper.floor(r * r * MHelper.randRange(0.5F, 1.5F, random)); for (int i = 0; i < count; i++) { diff --git a/src/main/java/ru/betterend/world/features/LanceleafFeature.java b/src/main/java/ru/betterend/world/features/LanceleafFeature.java index aaff0656..6724b0b0 100644 --- a/src/main/java/ru/betterend/world/features/LanceleafFeature.java +++ b/src/main/java/ru/betterend/world/features/LanceleafFeature.java @@ -1,7 +1,6 @@ package ru.betterend.world.features; import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; @@ -14,15 +13,15 @@ public class LanceleafFeature extends ScatterFeature { @Override public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { - return EndBlocks.LANCELEAF_SEED.canPlaceAt(AIR, world, blockPos); + return EndBlocks.LANCELEAF_SEED.canSurvive(AIR, world, blockPos); } @Override - public void place(WorldGenLevel world, Random random, BlockPos blockPos) { + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { EndPlantWithAgeBlock seed = ((EndPlantWithAgeBlock) EndBlocks.LANCELEAF_SEED); seed.growAdult(world, random, blockPos); } - + @Override protected int getChance() { return 5; diff --git a/src/main/java/ru/betterend/world/features/ListFeature.java b/src/main/java/ru/betterend/world/features/ListFeature.java index 69c2dd13..15c980c4 100644 --- a/src/main/java/ru/betterend/world/features/ListFeature.java +++ b/src/main/java/ru/betterend/world/features/ListFeature.java @@ -2,26 +2,25 @@ package ru.betterend.world.features; import java.util.List; import java.util.Random; - -import net.minecraft.structure.Structure; -import net.minecraft.structure.StructurePlacementData; -import net.minecraft.util.BlockMirror; -import net.minecraft.world.level.block.Rotation; import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import ru.betterend.registry.EndTags; import ru.betterend.util.StructureHelper; public class ListFeature extends NBTStructureFeature { private final List list; private StructureInfo selected; - + public ListFeature(List list) { this.list = list; } - + @Override - protected Structure getStructure(WorldGenLevel world, BlockPos pos, Random random) { + protected StructureTemplate getStructure(WorldGenLevel world, BlockPos pos, Random random) { selected = list.get(random.nextInt(list.size())); return selected.getStructure(); } @@ -30,21 +29,21 @@ public class ListFeature extends NBTStructureFeature { protected boolean canSpawn(WorldGenLevel world, BlockPos pos, Random random) { int cx = pos.getX() >> 4; int cz = pos.getZ() >> 4; - return ((cx + cz) & 1) == 0 && pos.getY() > 58 && world.getBlockState(pos.below()).isIn(EndTags.GEN_TERRAIN); + return ((cx + cz) & 1) == 0 && pos.getY() > 58 && world.getBlockState(pos.below()).is(EndTags.GEN_TERRAIN); } @Override protected Rotation getRotation(WorldGenLevel world, BlockPos pos, Random random) { - return Rotation.random(random); + return Rotation.getRandom(random); } @Override - protected BlockMirror getMirror(WorldGenLevel world, BlockPos pos, Random random) { - return BlockMirror.values()[random.nextInt(3)]; + protected Mirror getMirror(WorldGenLevel world, BlockPos pos, Random random) { + return Mirror.values()[random.nextInt(3)]; } @Override - protected int getYOffset(Structure structure, WorldGenLevel world, BlockPos pos, Random random) { + protected int getYOffset(StructureTemplate structure, WorldGenLevel world, BlockPos pos, Random random) { return selected.offsetY; } @@ -52,25 +51,24 @@ public class ListFeature extends NBTStructureFeature { protected TerrainMerge getTerrainMerge(WorldGenLevel world, BlockPos pos, Random random) { return selected.terrainMerge; } - + @Override - protected void addStructureData(StructurePlacementData data) { - } - + protected void addStructureData(StructurePlaceSettings data) {} + public static final class StructureInfo { public final TerrainMerge terrainMerge; public final String structurePath; public final int offsetY; - - private Structure structure; - + + private StructureTemplate structure; + public StructureInfo(String structurePath, int offsetY, TerrainMerge terrainMerge) { this.terrainMerge = terrainMerge; this.structurePath = structurePath; this.offsetY = offsetY; } - - public Structure getStructure() { + + public StructureTemplate getStructure() { if (structure == null) { structure = StructureHelper.readStructure(structurePath); } diff --git a/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java b/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java index 5a20b737..669c8f7f 100644 --- a/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java +++ b/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java @@ -2,34 +2,33 @@ package ru.betterend.world.features; import java.util.Random; import java.util.function.Function; - -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; public class MengerSpongeFeature extends UnderwaterPlantScatter { private static final Function REPLACE; - + public MengerSpongeFeature(int radius) { super(radius); } @Override - public void place(WorldGenLevel world, Random random, BlockPos blockPos) { + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.MENGER_SPONGE_WET); if (random.nextBoolean()) { - for (Direction dir : BlocksHelper.DIRECTIONS) { - BlockPos pos = blockPos.offset(dir); + for (Direction dir: BlocksHelper.DIRECTIONS) { + BlockPos pos = blockPos.relative(dir); if (REPLACE.apply(world.getBlockState(pos))) { BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.MENGER_SPONGE_WET); } } } } - + static { REPLACE = (state) -> { if (state.is(EndBlocks.END_LOTUS_STEM)) { diff --git a/src/main/java/ru/betterend/world/features/NBTStructureFeature.java b/src/main/java/ru/betterend/world/features/NBTStructureFeature.java index f3020bb6..65bb5d14 100644 --- a/src/main/java/ru/betterend/world/features/NBTStructureFeature.java +++ b/src/main/java/ru/betterend/world/features/NBTStructureFeature.java @@ -3,25 +3,24 @@ package ru.betterend.world.features; import java.io.IOException; import java.io.InputStream; import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtIo; -import net.minecraft.server.MinecraftServer; -import net.minecraft.structure.Structure; -import net.minecraft.structure.StructurePlacementData; -import net.minecraft.util.BlockMirror; -import net.minecraft.world.level.block.Rotation; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtIo; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.gen.surfacebuilder.SurfaceConfig; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderConfiguration; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; @@ -30,19 +29,19 @@ import ru.betterend.world.processors.DestructionStructureProcessor; public abstract class NBTStructureFeature extends DefaultFeature { protected static final DestructionStructureProcessor DESTRUCTION = new DestructionStructureProcessor(); - protected abstract Structure getStructure(WorldGenLevel world, BlockPos pos, Random random); + protected abstract StructureTemplate getStructure(WorldGenLevel world, BlockPos pos, Random random); protected abstract boolean canSpawn(WorldGenLevel world, BlockPos pos, Random random); protected abstract Rotation getRotation(WorldGenLevel world, BlockPos pos, Random random); - protected abstract BlockMirror getMirror(WorldGenLevel world, BlockPos pos, Random random); + protected abstract Mirror getMirror(WorldGenLevel world, BlockPos pos, Random random); - protected abstract int getYOffset(Structure structure, WorldGenLevel world, BlockPos pos, Random random); + protected abstract int getYOffset(StructureTemplate structure, WorldGenLevel world, BlockPos pos, Random random); protected abstract TerrainMerge getTerrainMerge(WorldGenLevel world, BlockPos pos, Random random); - protected abstract void addStructureData(StructurePlacementData data); + protected abstract void addStructureData(StructurePlaceSettings data); protected BlockPos getGround(WorldGenLevel world, BlockPos center) { Biome biome = world.getBiome(center); @@ -85,18 +84,18 @@ public abstract class NBTStructureFeature extends DefaultFeature { } int posY = center.getY() + 1; - Structure structure = getStructure(world, center, random); + StructureTemplate structure = getStructure(world, center, random); Rotation rotation = getRotation(world, center, random); - BlockMirror mirror = getMirror(world, center, random); - BlockPos offset = Structure.transformAround(structure.getSize(), mirror, rotation, BlockPos.ORIGIN); - center = center.add(0, getYOffset(structure, world, center, random) + 0.5, 0); + Mirror mirror = getMirror(world, center, random); + BlockPos offset = StructureTemplate.transform(structure.getSize(), mirror, rotation, BlockPos.ZERO); + center = center.offset(0, getYOffset(structure, world, center, random) + 0.5, 0); - BlockBox bounds = makeBox(center); - StructurePlacementData placementData = new StructurePlacementData().setRotation(rotation).setMirror(mirror) + BoundingBox bounds = makeBox(center); + StructurePlaceSettings placementData = new StructurePlaceSettings().setRotation(rotation).setMirror(mirror) .setBoundingBox(bounds); addStructureData(placementData); - center = center.add(-offset.getX() * 0.5, 0, -offset.getZ() * 0.5); - structure.place(world, center, placementData, random); + center = center.offset(-offset.getX() * 0.5, 0, -offset.getZ() * 0.5); + structure.placeInWorldChunk(world, center, placementData, random); TerrainMerge merge = getTerrainMerge(world, center, random); int x1 = center.getX(); @@ -125,24 +124,24 @@ public abstract class NBTStructureFeature extends DefaultFeature { mut.setZ(z); mut.setY(surfMax); BlockState state = world.getBlockState(mut); - if (!state.isIn(EndTags.GEN_TERRAIN) && state.isSideSolidFullSquare(world, mut, Direction.DOWN)) { + if (!state.is(EndTags.GEN_TERRAIN) && state.isFaceSturdy(world, mut, Direction.DOWN)) { for (int i = 0; i < 10; i++) { mut.setY(mut.getY() - 1); BlockState stateSt = world.getBlockState(mut); - if (!stateSt.isIn(EndTags.GEN_TERRAIN)) { + if (!stateSt.is(EndTags.GEN_TERRAIN)) { if (merge == TerrainMerge.SURFACE) { - SurfaceConfig config = world.getBiome(mut).getGenerationSettings() + SurfaceBuilderConfiguration config = world.getBiome(mut).getGenerationSettings() .getSurfaceBuilderConfig(); - boolean isTop = mut.getY() == surfMax && state.getMaterial().blocksLight(); + boolean isTop = mut.getY() == surfMax && state.getMaterial().isSolidBlocking(); BlockState top = isTop ? config.getTopMaterial() : config.getUnderMaterial(); BlocksHelper.setWithoutUpdate(world, mut, top); } else { BlocksHelper.setWithoutUpdate(world, mut, state); } } else { - if (stateSt.isIn(EndTags.END_GROUND) && state.getMaterial().blocksLight()) { + if (stateSt.is(EndTags.END_GROUND) && state.getMaterial().isSolidBlocking()) { if (merge == TerrainMerge.SURFACE) { - SurfaceConfig config = world.getBiome(mut).getGenerationSettings() + SurfaceBuilderConfiguration config = world.getBiome(mut).getGenerationSettings() .getSurfaceBuilderConfig(); BlocksHelper.setWithoutUpdate(world, mut, config.getUnderMaterial()); } else { @@ -162,15 +161,15 @@ public abstract class NBTStructureFeature extends DefaultFeature { return true; } - protected BlockBox makeBox(BlockPos pos) { + protected BoundingBox makeBox(BlockPos pos) { int sx = ((pos.getX() >> 4) << 4) - 16; int sz = ((pos.getZ() >> 4) << 4) - 16; int ex = sx + 47; int ez = sz + 47; - return BlockBox.create(sx, 0, sz, ex, 255, ez); + return BoundingBox.createProper(sx, 0, sz, ex, 255, ez); } - protected static Structure readStructure(ResourceLocation resource) { + protected static StructureTemplate readStructure(ResourceLocation resource) { String ns = resource.getNamespace(); String nm = resource.getPath(); @@ -185,11 +184,11 @@ public abstract class NBTStructureFeature extends DefaultFeature { return null; } - private static Structure readStructureFromStream(InputStream stream) throws IOException { + private static StructureTemplate readStructureFromStream(InputStream stream) throws IOException { CompoundTag nbttagcompound = NbtIo.readCompressed(stream); - Structure template = new Structure(); - template.fromTag(nbttagcompound); + StructureTemplate template = new StructureTemplate(); + template.load(nbttagcompound); return template; } diff --git a/src/main/java/ru/betterend/world/features/NeonCactusFeature.java b/src/main/java/ru/betterend/world/features/NeonCactusFeature.java index 845e1008..9a018747 100644 --- a/src/main/java/ru/betterend/world/features/NeonCactusFeature.java +++ b/src/main/java/ru/betterend/world/features/NeonCactusFeature.java @@ -1,12 +1,11 @@ package ru.betterend.world.features; import java.util.Random; - -import net.minecraft.state.property.Properties; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.BlockProperties; @@ -31,15 +30,16 @@ public class NeonCactusFeature extends DefaultFeature { break; } int size = (h - i) >> 2; - BlocksHelper.setWithUpdate(world, mut, EndBlocks.NEON_CACTUS.defaultBlockState() - .with(BlockProperties.TRIPLE_SHAPE, getBySize(size)).with(Properties.FACING, Direction.UP)); + BlocksHelper.setWithUpdate(world, mut, + EndBlocks.NEON_CACTUS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, getBySize(size)) + .setValue(BlockStateProperties.FACING, Direction.UP)); if (i > 2 && i < (h - 1) && random.nextBoolean()) { int length = h - i - MHelper.randRange(1, 2, random); if (length > 0) { Direction dir2 = hor; hor = hor.getClockWise(); int bsize = i > ((h << 1) / 3) ? 0 : size > 1 ? 1 : size; - branch(world, mut.offset(dir2), dir2, random, length, bsize); + branch(world, mut.relative(dir2), dir2, random, length, bsize); } } mut.move(Direction.UP); @@ -56,8 +56,9 @@ public class NeonCactusFeature extends DefaultFeature { if (!world.getBlockState(mut).getMaterial().isReplaceable()) { return; } - BlocksHelper.setWithUpdate(world, mut, EndBlocks.NEON_CACTUS.defaultBlockState() - .with(BlockProperties.TRIPLE_SHAPE, getBySize(size)).with(Properties.FACING, dir)); + BlocksHelper.setWithUpdate(world, mut, + EndBlocks.NEON_CACTUS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, getBySize(size)) + .setValue(BlockStateProperties.FACING, dir)); if (i == rotIndex) { dir = Direction.UP; size--; @@ -65,7 +66,7 @@ public class NeonCactusFeature extends DefaultFeature { if (i > 1 && i < (length - 1) && random.nextBoolean()) { Direction dir2 = dir == Direction.UP ? hor : Direction.UP; hor = hor.getClockWise(); - branch(world, mut.offset(dir2), dir2, random, MHelper.randRange(length / 4, length / 2, random), + branch(world, mut.relative(dir2), dir2, random, MHelper.randRange(length / 4, length / 2, random), size > 0 ? size - 1 : size); } mut.move(dir); diff --git a/src/main/java/ru/betterend/world/features/ScatterFeature.java b/src/main/java/ru/betterend/world/features/ScatterFeature.java index ddd6b540..833985ef 100644 --- a/src/main/java/ru/betterend/world/features/ScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/ScatterFeature.java @@ -1,7 +1,6 @@ package ru.betterend.world.features; import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; @@ -22,7 +21,7 @@ public abstract class ScatterFeature extends DefaultFeature { public abstract boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius); - public abstract void place(WorldGenLevel world, Random random, BlockPos blockPos); + public abstract void generate(WorldGenLevel world, Random random, BlockPos blockPos); protected BlockPos getCenterGround(WorldGenLevel world, BlockPos pos) { return getPosOnSurfaceWG(world, pos); @@ -31,7 +30,7 @@ public abstract class ScatterFeature extends DefaultFeature { protected boolean canSpawn(WorldGenLevel world, BlockPos pos) { if (pos.getY() < 5) { return false; - } else if (!world.getBlockState(pos.below()).isIn(EndTags.END_GROUND)) { + } else if (!world.getBlockState(pos.below()).is(EndTags.END_GROUND)) { return false; } return true; diff --git a/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java b/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java index 20f00833..d8383f44 100644 --- a/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java +++ b/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java @@ -1,16 +1,15 @@ package ru.betterend.world.features; import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.state.property.Properties; -import net.minecraft.tags.BlockTags; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.Heightmap; +import net.minecraft.tags.BlockTags; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.BlockProperties; import ru.betterend.registry.EndBlocks; @@ -20,12 +19,12 @@ public class SilkMothNestFeature extends DefaultFeature { private static final MutableBlockPos POS = new MutableBlockPos(); private boolean canGenerate(WorldGenLevel world, BlockPos pos) { - BlockState state = world.getBlockState(pos.up()); - if (state.isIn(BlockTags.LEAVES) || state.isIn(BlockTags.LOGS)) { + BlockState state = world.getBlockState(pos.above()); + if (state.is(BlockTags.LEAVES) || state.is(BlockTags.LOGS)) { state = world.getBlockState(pos); - if ((state.isAir() || state.is(EndBlocks.TENANEA_OUTER_LEAVES)) && world.isAir(pos.below())) { + if ((state.isAir() || state.is(EndBlocks.TENANEA_OUTER_LEAVES)) && world.isEmptyBlock(pos.below())) { for (Direction dir : BlocksHelper.HORIZONTAL) { - if (world.getBlockState(pos.below().offset(dir)).getMaterial().blocksMovement()) { + if (world.getBlockState(pos.below().relative(dir)).getMaterial().blocksMotion()) { return false; } return true; @@ -38,7 +37,7 @@ public class SilkMothNestFeature extends DefaultFeature { @Override public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, NoneFeatureConfiguration featureConfig) { - int maxY = world.getTopY(Heightmap.Type.WORLD_SURFACE, center.getX(), center.getZ()); + int maxY = world.getHeight(Heightmap.Types.WORLD_SURFACE, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); POS.set(center); for (int y = maxY; y > minY; y--) { @@ -46,10 +45,10 @@ public class SilkMothNestFeature extends DefaultFeature { if (canGenerate(world, POS)) { Direction dir = BlocksHelper.randomHorizontal(random); BlocksHelper.setWithoutUpdate(world, POS, EndBlocks.SILK_MOTH_NEST.defaultBlockState() - .with(Properties.HORIZONTAL_FACING, dir).with(BlockProperties.ACTIVE, false)); + .setValue(BlockStateProperties.HORIZONTAL_FACING, dir).setValue(BlockProperties.ACTIVE, false)); POS.setY(y - 1); - BlocksHelper.setWithoutUpdate(world, POS, - EndBlocks.SILK_MOTH_NEST.defaultBlockState().with(Properties.HORIZONTAL_FACING, dir)); + BlocksHelper.setWithoutUpdate(world, POS, EndBlocks.SILK_MOTH_NEST.defaultBlockState() + .setValue(BlockStateProperties.HORIZONTAL_FACING, dir)); return true; } } diff --git a/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java b/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java index 8923635a..20d87cec 100644 --- a/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java @@ -1,19 +1,18 @@ package ru.betterend.world.features; import java.util.Random; - -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.state.property.Properties; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; import ru.betterend.blocks.basis.AttachedBlock; import ru.betterend.util.BlocksHelper; public class SingleInvertedScatterFeature extends InvertedScatterFeature { private final Block block; - + public SingleInvertedScatterFeature(Block block, int radius) { super(radius); this.block = block; @@ -21,21 +20,21 @@ public class SingleInvertedScatterFeature extends InvertedScatterFeature { @Override public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { - if (!world.isAir(blockPos)) { + if (!world.isEmptyBlock(blockPos)) { return false; } BlockState state = block.defaultBlockState(); if (block instanceof AttachedBlock) { - state = state.with(Properties.FACING, Direction.DOWN); + state = state.setValue(BlockStateProperties.FACING, Direction.DOWN); } - return state.canPlaceAt(world, blockPos); + return state.canSurvive(world, blockPos); } @Override - public void place(WorldGenLevel world, Random random, BlockPos blockPos) { + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { BlockState state = block.defaultBlockState(); if (block instanceof AttachedBlock) { - state = state.with(Properties.FACING, Direction.DOWN); + state = state.setValue(BlockStateProperties.FACING, Direction.DOWN); } BlocksHelper.setWithoutUpdate(world, blockPos, state); } diff --git a/src/main/java/ru/betterend/world/features/SinglePlantFeature.java b/src/main/java/ru/betterend/world/features/SinglePlantFeature.java index ef8d6fa5..be176c6b 100644 --- a/src/main/java/ru/betterend/world/features/SinglePlantFeature.java +++ b/src/main/java/ru/betterend/world/features/SinglePlantFeature.java @@ -1,11 +1,10 @@ package ru.betterend.world.features; import java.util.Random; - -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.basis.DoublePlantBlock; import ru.betterend.blocks.basis.EndCropBlock; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; @@ -15,55 +14,58 @@ public class SinglePlantFeature extends ScatterFeature { private final Block plant; private final boolean rawHeightmap; private final int chance; - + public SinglePlantFeature(Block plant, int radius) { this(plant, radius, true, 1); } - + public SinglePlantFeature(Block plant, int radius, int chance) { this(plant, radius, true, chance); } - + public SinglePlantFeature(Block plant, int radius, boolean rawHeightmap) { this(plant, radius, rawHeightmap, 1); } - + public SinglePlantFeature(Block plant, int radius, boolean rawHeightmap, int chance) { super(radius); this.plant = plant; this.rawHeightmap = rawHeightmap; this.chance = chance; } - + protected int getChance() { return chance; } - + @Override protected BlockPos getCenterGround(WorldGenLevel world, BlockPos pos) { return rawHeightmap ? getPosOnSurfaceWG(world, pos) : getPosOnSurface(world, pos); } - + @Override public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { - return plant.canPlaceAt(plant.defaultBlockState(), world, blockPos); + return plant.canSurvive(plant.defaultBlockState(), world, blockPos); } @Override - public void place(WorldGenLevel world, Random random, BlockPos blockPos) { + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { if (plant instanceof DoublePlantBlock) { int rot = random.nextInt(4); - BlockState state = plant.defaultBlockState().with(DoublePlantBlock.ROTATION, rot); + BlockState state = plant.defaultBlockState().setValue(DoublePlantBlock.ROTATION, rot); BlocksHelper.setWithoutUpdate(world, blockPos, state); - BlocksHelper.setWithoutUpdate(world, blockPos.up(), state.with(DoublePlantBlock.TOP, true)); - } else if (plant instanceof EndCropBlock) { - BlockState state = plant.defaultBlockState().with(EndCropBlock.AGE, 3); + BlocksHelper.setWithoutUpdate(world, blockPos.above(), state.setValue(DoublePlantBlock.TOP, true)); + } + else if (plant instanceof EndCropBlock) { + BlockState state = plant.defaultBlockState().setValue(EndCropBlock.AGE, 3); BlocksHelper.setWithoutUpdate(world, blockPos, state); - } else if (plant instanceof EndPlantWithAgeBlock) { + } + else if (plant instanceof EndPlantWithAgeBlock) { int age = random.nextInt(4); - BlockState state = plant.defaultBlockState().with(EndPlantWithAgeBlock.AGE, age); + BlockState state = plant.defaultBlockState().setValue(EndPlantWithAgeBlock.AGE, age); BlocksHelper.setWithoutUpdate(world, blockPos, state); - } else { + } + else { BlocksHelper.setWithoutUpdate(world, blockPos, plant); } } diff --git a/src/main/java/ru/betterend/world/features/SkyScatterFeature.java b/src/main/java/ru/betterend/world/features/SkyScatterFeature.java index 37160826..d2e1eaeb 100644 --- a/src/main/java/ru/betterend/world/features/SkyScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/SkyScatterFeature.java @@ -1,7 +1,6 @@ package ru.betterend.world.features; import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -13,7 +12,7 @@ public abstract class SkyScatterFeature extends ScatterFeature { public SkyScatterFeature(int radius) { super(radius); } - + @Override protected int getChance() { return 10; @@ -21,32 +20,32 @@ public abstract class SkyScatterFeature extends ScatterFeature { @Override public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { - if (!world.isAir(blockPos)) { + if (!world.isEmptyBlock(blockPos)) { return false; } - - for (Direction dir : BlocksHelper.HORIZONTAL) { - if (!world.isAir(blockPos.offset(dir))) { + + for (Direction dir: BlocksHelper.HORIZONTAL) { + if (!world.isEmptyBlock(blockPos.relative(dir))) { return false; } } - + int maxD = getYOffset() + 2; int maxV = getYOffset() - 2; - + return BlocksHelper.upRay(world, blockPos, maxD) > maxV && BlocksHelper.downRay(world, blockPos, maxD) > maxV; } - + @Override protected boolean canSpawn(WorldGenLevel world, BlockPos pos) { return true; } - + @Override protected BlockPos getCenterGround(WorldGenLevel world, BlockPos pos) { return new BlockPos(pos.getX(), MHelper.randRange(32, 192, world.getRandom()), pos.getZ()); } - + protected boolean getGroundPlant(WorldGenLevel world, MutableBlockPos pos) { pos.setY(pos.getY() + MHelper.randRange(-getYOffset(), getYOffset(), world.getRandom())); return true; diff --git a/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java b/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java index a2886e60..5b0ce2dc 100644 --- a/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java +++ b/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java @@ -1,35 +1,35 @@ package ru.betterend.world.features; import java.util.Random; - -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.basis.DoublePlantBlock; import ru.betterend.util.BlocksHelper; public class UnderwaterPlantFeature extends UnderwaterPlantScatter { private final Block plant; - + public UnderwaterPlantFeature(Block plant, int radius) { super(radius); this.plant = plant; } - + @Override public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { - return super.canSpawn(world, blockPos) && plant.canPlaceAt(plant.defaultBlockState(), world, blockPos); + return super.canSpawn(world, blockPos) && plant.canSurvive(plant.defaultBlockState(), world, blockPos); } @Override - public void place(WorldGenLevel world, Random random, BlockPos blockPos) { + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { if (plant instanceof DoublePlantBlock) { int rot = random.nextInt(4); - BlockState state = plant.defaultBlockState().with(DoublePlantBlock.ROTATION, rot); + BlockState state = plant.defaultBlockState().setValue(DoublePlantBlock.ROTATION, rot); BlocksHelper.setWithoutUpdate(world, blockPos, state); - BlocksHelper.setWithoutUpdate(world, blockPos.up(), state.with(DoublePlantBlock.TOP, true)); - } else { + BlocksHelper.setWithoutUpdate(world, blockPos.above(), state.setValue(DoublePlantBlock.TOP, true)); + } + else { BlocksHelper.setWithoutUpdate(world, blockPos, plant); } } diff --git a/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java b/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java index 35bf1de9..3c40c55f 100644 --- a/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java +++ b/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java @@ -1,19 +1,18 @@ package ru.betterend.world.features; import java.util.Random; - -import net.minecraft.world.level.block.Blocks; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; public abstract class UnderwaterPlantScatter extends ScatterFeature { private static final MutableBlockPos POS = new MutableBlockPos(); - + public UnderwaterPlantScatter(int radius) { super(radius); } - + @Override protected BlockPos getCenterGround(WorldGenLevel world, BlockPos pos) { POS.setX(pos.getX()); @@ -21,32 +20,32 @@ public abstract class UnderwaterPlantScatter extends ScatterFeature { POS.setY(0); return getGround(world, POS).immutable(); } - + @Override public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { return world.getBlockState(blockPos).is(Blocks.WATER); } - + @Override protected boolean canSpawn(WorldGenLevel world, BlockPos pos) { return world.getBlockState(pos).is(Blocks.WATER); } - + @Override protected boolean getGroundPlant(WorldGenLevel world, MutableBlockPos pos) { return getGround(world, pos).getY() < 128; } - + @Override protected int getYOffset() { return -5; } - + @Override protected int getChance() { return 5; } - + private BlockPos getGround(WorldGenLevel world, MutableBlockPos pos) { while (pos.getY() < 128 && world.getFluidState(pos).isEmpty()) { pos.setY(pos.getY() + 1); diff --git a/src/main/java/ru/betterend/world/features/VineFeature.java b/src/main/java/ru/betterend/world/features/VineFeature.java index 18c8e7c7..3cca3e78 100644 --- a/src/main/java/ru/betterend/world/features/VineFeature.java +++ b/src/main/java/ru/betterend/world/features/VineFeature.java @@ -1,11 +1,10 @@ package ru.betterend.world.features; import java.util.Random; - -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.VineBlock; @@ -15,7 +14,7 @@ public class VineFeature extends InvertedScatterFeature { private final Block vineBlock; private final int maxLength; private final boolean vine; - + public VineFeature(Block vineBlock, int maxLength) { super(6); this.vineBlock = vineBlock; @@ -30,7 +29,7 @@ public class VineFeature extends InvertedScatterFeature { } @Override - public void place(WorldGenLevel world, Random random, BlockPos blockPos) { + public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { int h = BlocksHelper.downRay(world, blockPos, random.nextInt(maxLength)) - 1; if (h > 2) { BlockState top = getTopState(); @@ -38,32 +37,33 @@ public class VineFeature extends InvertedScatterFeature { BlockState bottom = getBottomState(); BlocksHelper.setWithoutUpdate(world, blockPos, top); for (int i = 1; i < h; i++) { - BlocksHelper.setWithoutUpdate(world, blockPos.down(i), middle); + BlocksHelper.setWithoutUpdate(world, blockPos.below(i), middle); } - BlocksHelper.setWithoutUpdate(world, blockPos.down(h), bottom); + BlocksHelper.setWithoutUpdate(world, blockPos.below(h), bottom); } } - + private boolean canPlaceBlock(BlockState state, WorldGenLevel world, BlockPos blockPos) { if (vine) { return ((VineBlock) vineBlock).canGenerate(state, world, blockPos); - } else { - return vineBlock.canPlaceAt(state, world, blockPos); + } + else { + return vineBlock.canSurvive(state, world, blockPos); } } - + private BlockState getTopState() { BlockState state = vineBlock.defaultBlockState(); - return vine ? state.with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP) : state; + return vine ? state.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP) : state; } - + private BlockState getMiggleState() { BlockState state = vineBlock.defaultBlockState(); - return vine ? state.with(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE) : state; + return vine ? state.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE) : state; } - + private BlockState getBottomState() { BlockState state = vineBlock.defaultBlockState(); - return vine ? state.with(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM) : state; + return vine ? state.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM) : state; } } diff --git a/src/main/java/ru/betterend/world/features/WallPlantFeature.java b/src/main/java/ru/betterend/world/features/WallPlantFeature.java index 0f34f39f..54e61ee0 100644 --- a/src/main/java/ru/betterend/world/features/WallPlantFeature.java +++ b/src/main/java/ru/betterend/world/features/WallPlantFeature.java @@ -1,20 +1,19 @@ package ru.betterend.world.features; import java.util.Random; - -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.state.property.Properties; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; import ru.betterend.blocks.basis.AttachedBlock; import ru.betterend.blocks.basis.EndWallPlantBlock; import ru.betterend.util.BlocksHelper; public class WallPlantFeature extends WallScatterFeature { private final Block block; - + public WallPlantFeature(Block block, int radius) { super(radius); this.block = block; @@ -23,22 +22,24 @@ public class WallPlantFeature extends WallScatterFeature { @Override public boolean canGenerate(WorldGenLevel world, Random random, BlockPos pos, Direction dir) { if (block instanceof EndWallPlantBlock) { - BlockState state = block.defaultBlockState().with(EndWallPlantBlock.FACING, dir); - return block.canPlaceAt(state, world, pos); - } else if (block instanceof AttachedBlock) { - BlockState state = block.defaultBlockState().with(Properties.FACING, dir); - return block.canPlaceAt(state, world, pos); + BlockState state = block.defaultBlockState().setValue(EndWallPlantBlock.FACING, dir); + return block.canSurvive(state, world, pos); } - return block.canPlaceAt(block.defaultBlockState(), world, pos); + else if (block instanceof AttachedBlock) { + BlockState state = block.defaultBlockState().setValue(BlockStateProperties.FACING, dir); + return block.canSurvive(state, world, pos); + } + return block.canSurvive(block.defaultBlockState(), world, pos); } @Override - public void place(WorldGenLevel world, Random random, BlockPos pos, Direction dir) { + public void generate(WorldGenLevel world, Random random, BlockPos pos, Direction dir) { BlockState state = block.defaultBlockState(); if (block instanceof EndWallPlantBlock) { - state = state.with(EndWallPlantBlock.FACING, dir); - } else if (block instanceof AttachedBlock) { - state = state.with(Properties.FACING, dir); + state = state.setValue(EndWallPlantBlock.FACING, dir); + } + else if (block instanceof AttachedBlock) { + state = state.setValue(BlockStateProperties.FACING, dir); } BlocksHelper.setWithoutUpdate(world, pos, state); } diff --git a/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java b/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java index 72855bab..7a4b2681 100644 --- a/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java +++ b/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java @@ -1,13 +1,12 @@ package ru.betterend.world.features; import java.util.Random; - -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.tags.BlockTags; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.tags.BlockTags; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; public class WallPlantOnLogFeature extends WallPlantFeature { public WallPlantOnLogFeature(Block block, int radius) { @@ -18,6 +17,6 @@ public class WallPlantOnLogFeature extends WallPlantFeature { public boolean canGenerate(WorldGenLevel world, Random random, BlockPos pos, Direction dir) { BlockPos blockPos = pos.relative(dir.getOpposite()); BlockState blockState = world.getBlockState(blockPos); - return blockState.isIn(BlockTags.LOGS); + return blockState.is(BlockTags.LOGS); } } diff --git a/src/main/java/ru/betterend/world/features/WallScatterFeature.java b/src/main/java/ru/betterend/world/features/WallScatterFeature.java index 7528bf86..052e9dd5 100644 --- a/src/main/java/ru/betterend/world/features/WallScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/WallScatterFeature.java @@ -1,13 +1,12 @@ package ru.betterend.world.features; import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.Heightmap; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; @@ -22,12 +21,12 @@ public abstract class WallScatterFeature extends DefaultFeature { public abstract boolean canGenerate(WorldGenLevel world, Random random, BlockPos pos, Direction dir); - public abstract void place(WorldGenLevel world, Random random, BlockPos pos, Direction dir); + public abstract void generate(WorldGenLevel world, Random random, BlockPos pos, Direction dir); @Override public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, NoneFeatureConfiguration featureConfig) { - int maxY = world.getTopY(Heightmap.Type.WORLD_SURFACE, center.getX(), center.getZ()); + int maxY = world.getHeight(Heightmap.Types.WORLD_SURFACE, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); if (maxY < 10 || maxY < minY) { return false; @@ -41,7 +40,7 @@ public abstract class WallScatterFeature extends DefaultFeature { mut.setY(py + y); for (int z = -radius; z <= radius; z++) { mut.setZ(center.getZ() + z); - if (random.nextInt(4) == 0 && world.isAir(mut)) { + if (random.nextInt(4) == 0 && world.isEmptyBlock(mut)) { shuffle(random); for (Direction dir : DIR) { if (canGenerate(world, random, mut, dir)) { diff --git a/src/main/java/ru/betterend/world/features/bushes/BushFeature.java b/src/main/java/ru/betterend/world/features/bushes/BushFeature.java index dbd7c83c..e557592e 100644 --- a/src/main/java/ru/betterend/world/features/bushes/BushFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/BushFeature.java @@ -2,16 +2,15 @@ package ru.betterend.world.features.bushes; import java.util.Random; import java.util.function.Function; - -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.LeavesBlock; -import net.minecraft.world.level.material.Material; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; @@ -37,8 +36,8 @@ public class BushFeature extends DefaultFeature { @Override public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND) - && !world.getBlockState(pos.up()).getBlock().isIn(EndTags.END_GROUND)) + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND) + && !world.getBlockState(pos.above()).getBlock().is(EndTags.END_GROUND)) return false; float radius = MHelper.randRange(1.8F, 3.5F, random); @@ -56,9 +55,9 @@ public class BushFeature extends DefaultFeature { sphere.setReplaceFunction(REPLACE); sphere.addPostProcess((info) -> { if (info.getState().getBlock() instanceof LeavesBlock) { - int distance = info.getPos().getManhattanDistance(pos); + int distance = info.getPos().distManhattan(pos); if (distance < 7) { - return info.getState().with(LeavesBlock.DISTANCE, distance); + return info.getState().setValue(LeavesBlock.DISTANCE, distance); } else { return AIR; } @@ -69,9 +68,10 @@ public class BushFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, pos, stem); for (Direction d : Direction.values()) { BlockPos p = pos.relative(d); - if (world.isAir(p)) { + if (world.isEmptyBlock(p)) { if (leaves instanceof LeavesBlock) { - BlocksHelper.setWithoutUpdate(world, p, leaves.defaultBlockState().with(LeavesBlock.DISTANCE, 1)); + BlocksHelper.setWithoutUpdate(world, p, + leaves.defaultBlockState().setValue(LeavesBlock.DISTANCE, 1)); } else { BlocksHelper.setWithoutUpdate(world, p, leaves.defaultBlockState()); } diff --git a/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java b/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java index 9f088dba..4de7f7ec 100644 --- a/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java @@ -2,17 +2,16 @@ package ru.betterend.world.features.bushes; import java.util.Random; import java.util.function.Function; - -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.LeavesBlock; -import net.minecraft.world.level.material.Material; -import net.minecraft.state.property.Properties; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; @@ -41,8 +40,8 @@ public class BushWithOuterFeature extends DefaultFeature { @Override public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND) - && !world.getBlockState(pos.up()).getBlock().isIn(EndTags.END_GROUND)) + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND) + && !world.getBlockState(pos.above()).getBlock().is(EndTags.END_GROUND)) return false; float radius = MHelper.randRange(1.8F, 3.5F, random); @@ -60,9 +59,9 @@ public class BushWithOuterFeature extends DefaultFeature { sphere.setReplaceFunction(REPLACE); sphere.addPostProcess((info) -> { if (info.getState().getBlock() instanceof LeavesBlock) { - int distance = info.getPos().getManhattanDistance(pos); + int distance = info.getPos().distManhattan(pos); if (distance < 7) { - return info.getState().with(LeavesBlock.DISTANCE, distance); + return info.getState().setValue(LeavesBlock.DISTANCE, distance); } else { return AIR; } @@ -73,8 +72,8 @@ public class BushWithOuterFeature extends DefaultFeature { MHelper.shuffle(DIRECTIONS, random); for (Direction dir : DIRECTIONS) { if (info.getState(dir).isAir()) { - info.setBlockPos(info.getPos().offset(dir), - outer_leaves.defaultBlockState().with(Properties.FACING, dir)); + info.setBlockPos(info.getPos().relative(dir), + outer_leaves.defaultBlockState().setValue(BlockStateProperties.FACING, dir)); } } } @@ -84,9 +83,10 @@ public class BushWithOuterFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, pos, stem); for (Direction d : Direction.values()) { BlockPos p = pos.relative(d); - if (world.isAir(p)) { + if (world.isEmptyBlock(p)) { if (leaves instanceof LeavesBlock) { - BlocksHelper.setWithoutUpdate(world, p, leaves.defaultBlockState().with(LeavesBlock.DISTANCE, 1)); + BlocksHelper.setWithoutUpdate(world, p, + leaves.defaultBlockState().setValue(LeavesBlock.DISTANCE, 1)); } else { BlocksHelper.setWithoutUpdate(world, p, leaves.defaultBlockState()); } diff --git a/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java b/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java index b4794ae8..45d6f250 100644 --- a/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java @@ -1,12 +1,11 @@ package ru.betterend.world.features.bushes; import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.BlockProperties; @@ -21,27 +20,27 @@ public class LargeAmaranitaFeature extends DefaultFeature { @Override public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) return false; MutableBlockPos mut = new MutableBlockPos().set(pos); int height = MHelper.randRange(2, 3, random); for (int i = 1; i < height; i++) { mut.setY(mut.getY() + 1); - if (!world.isAir(mut)) { + if (!world.isEmptyBlock(mut)) { return false; } } mut.set(pos); BlockState state = EndBlocks.LARGE_AMARANITA_MUSHROOM.defaultBlockState(); - BlocksHelper.setWithUpdate(world, mut, state.with(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); + BlocksHelper.setWithUpdate(world, mut, state.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); if (height > 2) { BlocksHelper.setWithUpdate(world, mut.move(Direction.UP), - state.with(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); + state.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); } BlocksHelper.setWithUpdate(world, mut.move(Direction.UP), - state.with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); + state.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); return true; } diff --git a/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java b/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java index 5d323765..0b1cfa55 100644 --- a/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java +++ b/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java @@ -1,12 +1,11 @@ package ru.betterend.world.features.bushes; import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.BlockProperties.LumecornShape; @@ -21,28 +20,28 @@ public class Lumecorn extends DefaultFeature { @Override public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) return false; int height = MHelper.randRange(4, 7, random); MutableBlockPos mut = new MutableBlockPos().set(pos); for (int i = 1; i < height; i++) { mut.move(Direction.UP); - if (!world.isAir(mut)) { + if (!world.isEmptyBlock(mut)) { return false; } } mut.set(pos); - BlockState topMiddle = EndBlocks.LUMECORN.defaultBlockState().with(LumecornBlock.SHAPE, + BlockState topMiddle = EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, LumecornShape.LIGHT_TOP_MIDDLE); - BlockState middle = EndBlocks.LUMECORN.defaultBlockState().with(LumecornBlock.SHAPE, + BlockState middle = EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, LumecornShape.LIGHT_MIDDLE); - BlockState bottom = EndBlocks.LUMECORN.defaultBlockState().with(LumecornBlock.SHAPE, + BlockState bottom = EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, LumecornShape.LIGHT_BOTTOM); - BlockState top = EndBlocks.LUMECORN.defaultBlockState().with(LumecornBlock.SHAPE, LumecornShape.LIGHT_TOP); + BlockState top = EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, LumecornShape.LIGHT_TOP); if (height == 4) { BlocksHelper.setWithoutUpdate(world, mut, - EndBlocks.LUMECORN.defaultBlockState().with(LumecornBlock.SHAPE, LumecornShape.BOTTOM_SMALL)); + EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, LumecornShape.BOTTOM_SMALL)); BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), bottom); BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), topMiddle); BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), top); @@ -50,12 +49,12 @@ public class Lumecorn extends DefaultFeature { } if (random.nextBoolean()) { BlocksHelper.setWithoutUpdate(world, mut, - EndBlocks.LUMECORN.defaultBlockState().with(LumecornBlock.SHAPE, LumecornShape.BOTTOM_SMALL)); + EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, LumecornShape.BOTTOM_SMALL)); } else { BlocksHelper.setWithoutUpdate(world, mut, - EndBlocks.LUMECORN.defaultBlockState().with(LumecornBlock.SHAPE, LumecornShape.BOTTOM_BIG)); + EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, LumecornShape.BOTTOM_BIG)); BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), - EndBlocks.LUMECORN.defaultBlockState().with(LumecornBlock.SHAPE, LumecornShape.MIDDLE)); + EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, LumecornShape.MIDDLE)); height--; } BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), bottom); diff --git a/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java index 3e6edc03..3e0901d2 100644 --- a/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java @@ -3,18 +3,16 @@ package ru.betterend.world.features.bushes; import java.util.List; import java.util.Random; import java.util.function.Function; - -import com.google.common.collect.Lists; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.LeavesBlock; -import net.minecraft.world.level.material.Material; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; +import com.google.common.collect.Lists; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.FurBlock; @@ -41,7 +39,7 @@ public class TenaneaBushFeature extends DefaultFeature { @Override public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) return false; float radius = MHelper.randRange(1.8F, 3.5F, random); @@ -61,7 +59,7 @@ public class TenaneaBushFeature extends DefaultFeature { List support = Lists.newArrayList(); sphere.addPostProcess((info) -> { if (info.getState().getBlock() instanceof LeavesBlock) { - int distance = info.getPos().getManhattanDistance(pos); + int distance = info.getPos().distManhattan(pos); if (distance < 7) { if (random.nextInt(4) == 0 && info.getStateDown().isAir()) { BlockPos d = info.getPos().below(); @@ -71,12 +69,12 @@ public class TenaneaBushFeature extends DefaultFeature { MHelper.shuffle(DIRECTIONS, random); for (Direction d : DIRECTIONS) { if (info.getState(d).isAir()) { - info.setBlockPos(info.getPos().offset(d), - EndBlocks.TENANEA_OUTER_LEAVES.defaultBlockState().with(FurBlock.FACING, d)); + info.setBlockPos(info.getPos().relative(d), + EndBlocks.TENANEA_OUTER_LEAVES.defaultBlockState().setValue(FurBlock.FACING, d)); } } - return info.getState().with(LeavesBlock.DISTANCE, distance); + return info.getState().setValue(LeavesBlock.DISTANCE, distance); } else { return AIR; } @@ -88,28 +86,28 @@ public class TenaneaBushFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, pos, stem); for (Direction d : Direction.values()) { BlockPos p = pos.relative(d); - if (world.isAir(p)) { - BlocksHelper.setWithoutUpdate(world, p, leaves.with(LeavesBlock.DISTANCE, 1)); + if (world.isEmptyBlock(p)) { + BlocksHelper.setWithoutUpdate(world, p, leaves.setValue(LeavesBlock.DISTANCE, 1)); } } MutableBlockPos mut = new MutableBlockPos(); - BlockState top = EndBlocks.TENANEA_FLOWERS.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, + BlockState top = EndBlocks.TENANEA_FLOWERS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP); - BlockState middle = EndBlocks.TENANEA_FLOWERS.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, + BlockState middle = EndBlocks.TENANEA_FLOWERS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE); - BlockState bottom = EndBlocks.TENANEA_FLOWERS.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, + BlockState bottom = EndBlocks.TENANEA_FLOWERS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM); support.forEach((bpos) -> { BlockState state = world.getBlockState(bpos); if (state.isAir() || state.is(EndBlocks.TENANEA_OUTER_LEAVES)) { int count = MHelper.randRange(3, 8, random); mut.set(bpos); - if (world.getBlockState(mut.up()).is(EndBlocks.TENANEA_LEAVES)) { + if (world.getBlockState(mut.above()).is(EndBlocks.TENANEA_LEAVES)) { BlocksHelper.setWithoutUpdate(world, mut, top); for (int i = 1; i < count; i++) { mut.setY(mut.getY() - 1); - if (world.isAir(mut.below())) { + if (world.isEmptyBlock(mut.below())) { BlocksHelper.setWithoutUpdate(world, mut, middle); } else { break; diff --git a/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java b/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java index ec22a61f..c471ab5f 100644 --- a/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java @@ -1,13 +1,12 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - -import net.minecraft.world.level.material.Material; import com.mojang.math.Vector3f; +import java.util.Random; import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; @@ -37,7 +36,7 @@ public class BigAuroraCrystalFeature extends DefaultFeature { Vector3f vec = MHelper.randomHorizontal(random); prism = new SDFRotation().setRotation(vec, random.nextFloat()).setSource(prism); prism.setReplaceFunction((bState) -> { - return bState.getMaterial().isReplaceable() || bState.isIn(EndTags.GEN_TERRAIN) + return bState.getMaterial().isReplaceable() || bState.is(EndTags.GEN_TERRAIN) || bState.getMaterial().equals(Material.PLANT) || bState.getMaterial().equals(Material.LEAVES); }); prism.fillRecursive(world, pos); diff --git a/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java index 3231fbb6..788dd936 100644 --- a/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java @@ -1,16 +1,15 @@ package ru.betterend.world.features.terrain; import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.Material; -import net.minecraft.fluid.FluidState; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; +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.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Material; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -37,22 +36,22 @@ public class EndLakeFeature extends DefaultFeature { int waterLevel = blockPos.getY(); - BlockPos pos = getPosOnSurfaceRaycast(world, blockPos.north(dist).up(10), 20); + BlockPos pos = getPosOnSurfaceRaycast(world, blockPos.north(dist).above(10), 20); if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; waterLevel = MHelper.min(pos.getY(), waterLevel); - pos = getPosOnSurfaceRaycast(world, blockPos.south(dist).up(10), 20); + pos = getPosOnSurfaceRaycast(world, blockPos.south(dist).above(10), 20); if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; waterLevel = MHelper.min(pos.getY(), waterLevel); - pos = getPosOnSurfaceRaycast(world, blockPos.east(dist).up(10), 20); + pos = getPosOnSurfaceRaycast(world, blockPos.east(dist).above(10), 20); if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; waterLevel = MHelper.min(pos.getY(), waterLevel); - pos = getPosOnSurfaceRaycast(world, blockPos.west(dist).up(10), 20); + pos = getPosOnSurfaceRaycast(world, blockPos.west(dist).above(10), 20); if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; waterLevel = MHelper.min(pos.getY(), waterLevel); @@ -116,11 +115,11 @@ public class EndLakeFeature extends DefaultFeature { r *= r; if (x2 + z2 <= r) { state = world.getBlockState(POS); - if (state.isIn(EndTags.GEN_TERRAIN)) { + if (state.is(EndTags.GEN_TERRAIN)) { BlocksHelper.setWithoutUpdate(world, POS, AIR); } pos = POS.below(); - if (world.getBlockState(pos).isIn(EndTags.GEN_TERRAIN)) { + if (world.getBlockState(pos).is(EndTags.GEN_TERRAIN)) { state = world.getBiome(pos).getGenerationSettings().getSurfaceBuilderConfig() .getTopMaterial(); if (y > waterLevel + 1) @@ -165,24 +164,24 @@ public class EndLakeFeature extends DefaultFeature { if (y2 + x2 + z2 <= r) { state = world.getBlockState(POS); if (canReplace(state)) { - state = world.getBlockState(POS.up()); + state = world.getBlockState(POS.above()); state = canReplace(state) ? (y < waterLevel ? WATER : AIR) : state; BlocksHelper.setWithoutUpdate(world, POS, state); } pos = POS.below(); - if (world.getBlockState(pos).getBlock().isIn(EndTags.GEN_TERRAIN)) { + if (world.getBlockState(pos).getBlock().is(EndTags.GEN_TERRAIN)) { BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.ENDSTONE_DUST.defaultBlockState()); } - pos = POS.up(); + pos = POS.above(); while (canReplace(state = world.getBlockState(pos)) && !state.isAir() && state.getFluidState().isEmpty()) { BlocksHelper.setWithoutUpdate(world, pos, pos.getY() < waterLevel ? WATER : AIR); - pos = pos.up(); + pos = pos.above(); } } // Make border else if (y < waterLevel && y2 + x2 + z2 <= rb) { - if (world.isAir(POS.up())) { + if (world.isEmptyBlock(POS.above())) { state = world.getBiome(POS).getGenerationSettings().getSurfaceBuilderConfig() .getTopMaterial(); BlocksHelper.setWithoutUpdate(world, POS, @@ -206,9 +205,8 @@ public class EndLakeFeature extends DefaultFeature { } private boolean canReplace(BlockState state) { - return state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN) - || state.is(EndBlocks.ENDSTONE_DUST) || state.getMaterial().equals(Material.PLANT) - || state.getMaterial().equals(Material.UNDERWATER_PLANT) - || state.getMaterial().equals(Material.UNUSED_PLANT); + return state.getMaterial().isReplaceable() || state.is(EndTags.GEN_TERRAIN) || state.is(EndBlocks.ENDSTONE_DUST) + || state.getMaterial().equals(Material.PLANT) || state.getMaterial().equals(Material.WATER_PLANT) + || state.getMaterial().equals(Material.CORAL); } } diff --git a/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java b/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java index 53f60237..0cd32d05 100644 --- a/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java @@ -1,15 +1,14 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.Material; import com.mojang.math.Vector3f; +import java.util.Random; import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; +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.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -27,7 +26,7 @@ public class FallenPillarFeature extends DefaultFeature { NoneFeatureConfiguration config) { pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); - if (!world.getBlockState(pos.down(5)).isIn(EndTags.GEN_TERRAIN)) { + if (!world.getBlockState(pos.below(5)).is(EndTags.GEN_TERRAIN)) { return false; } @@ -51,7 +50,7 @@ public class FallenPillarFeature extends DefaultFeature { } return info.getState(); }).setReplaceFunction((state) -> { - return state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN) + return state.getMaterial().isReplaceable() || state.is(EndTags.GEN_TERRAIN) || state.getMaterial().equals(Material.PLANT); }).fillRecursive(world, pos); diff --git a/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java index 108edf17..3eefb3d6 100644 --- a/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java @@ -2,15 +2,13 @@ package ru.betterend.world.features.terrain; import java.util.List; import java.util.Random; - -import com.google.common.collect.Lists; - -import net.minecraft.world.level.block.Blocks; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import com.google.common.collect.Lists; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndFeatures; @@ -50,7 +48,7 @@ public class FloatingSpireFeature extends SpireFeature { sdf.setReplaceFunction(REPLACE).addPostProcess((info) -> { if (info.getStateUp().isAir()) { if (random.nextInt(16) == 0) { - support.add(info.getPos().up()); + support.add(info.getPos().above()); } return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); } else if (info.getState(Direction.UP, 3).isAir()) { diff --git a/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java b/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java index 4ee5f97f..d565d233 100644 --- a/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java @@ -1,20 +1,19 @@ package ru.betterend.world.features.terrain; +import com.mojang.math.Vector3f; import java.util.Random; import java.util.function.Function; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.HorizontalFacingBlock; -import net.minecraft.world.level.material.Material; -import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; 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.block.Blocks; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; import ru.betterend.blocks.HydrothermalVentBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; @@ -56,7 +55,7 @@ public class GeyserFeature extends DefaultFeature { MutableBlockPos bpos = new MutableBlockPos().set(pos); bpos.setY(bpos.getY() - 1); BlockState state = world.getBlockState(bpos); - while (state.isIn(EndTags.GEN_TERRAIN) || !state.getFluidState().isEmpty() && bpos.getY() > 5) { + while (state.is(EndTags.GEN_TERRAIN) || !state.getFluidState().isEmpty() && bpos.getY() > 5) { bpos.setY(bpos.getY() - 1); state = world.getBlockState(bpos); } @@ -107,7 +106,7 @@ public class GeyserFeature extends DefaultFeature { bowl = new SDFSubtraction().setSourceA(bowl).setSourceB(cut); bowl = new SDFTranslate().setTranslate(radius, py - radius, 0).setSource(bowl); - bowl = new SDFRotation().setRotation(Vector3f.POSITIVE_Y, i * 4F).setSource(bowl); + bowl = new SDFRotation().setRotation(Vector3f.YP, i * 4F).setSource(bowl); sdf = new SDFUnion().setSourceA(sdf).setSourceB(bowl); } sdf.setReplaceFunction(REPLACE2).fillRecursive(world, pos); @@ -165,7 +164,7 @@ public class GeyserFeature extends DefaultFeature { for (int i = 0; i < count; i++) { BlocksHelper.setWithoutUpdate(world, mut, WATER); for (Direction dir : BlocksHelper.HORIZONTAL) { - BlocksHelper.setWithoutUpdate(world, mut.offset(dir), WATER); + BlocksHelper.setWithoutUpdate(world, mut.relative(dir), WATER); } mut.setY(mut.getY() + 1); } @@ -177,24 +176,25 @@ public class GeyserFeature extends DefaultFeature { int dist = MHelper.floor(6 - distRaw) + random.nextInt(2); if (dist >= 0) { state = world.getBlockState(mut); - while (!state.getFluidState().isEmpty() || state.getMaterial().equals(Material.UNDERWATER_PLANT)) { + while (!state.getFluidState().isEmpty() || state.getMaterial().equals(Material.WATER_PLANT)) { mut.setY(mut.getY() - 1); state = world.getBlockState(mut); } - if (state.isIn(EndTags.GEN_TERRAIN) && !world.getBlockState(mut.up()).is(EndBlocks.HYDROTHERMAL_VENT)) { + if (state.is(EndTags.GEN_TERRAIN) + && !world.getBlockState(mut.above()).is(EndBlocks.HYDROTHERMAL_VENT)) { for (int j = 0; j <= dist; j++) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.SULPHURIC_ROCK.stone); MHelper.shuffle(HORIZONTAL, random); for (Direction dir : HORIZONTAL) { - BlockPos p = mut.offset(dir); + BlockPos p = mut.relative(dir); if (random.nextBoolean() && world.getBlockState(p).is(Blocks.WATER)) { BlocksHelper.setWithoutUpdate(world, p, EndBlocks.TUBE_WORM.defaultBlockState() - .with(HorizontalFacingBlock.FACING, dir)); + .setValue(HorizontalDirectionalBlock.FACING, dir)); } } mut.setY(mut.getY() + 1); } - state = EndBlocks.HYDROTHERMAL_VENT.defaultBlockState().with(HydrothermalVentBlock.ACTIVATED, + state = EndBlocks.HYDROTHERMAL_VENT.defaultBlockState().setValue(HydrothermalVentBlock.ACTIVATED, distRaw < 2); BlocksHelper.setWithoutUpdate(world, mut, state); mut.setY(mut.getY() + 1); @@ -219,12 +219,12 @@ public class GeyserFeature extends DefaultFeature { mut.setY(mut.getY() - 1); state = world.getBlockState(mut); } - if (state.isIn(EndTags.GEN_TERRAIN)) { + if (state.is(EndTags.GEN_TERRAIN)) { for (int j = 0; j <= dist; j++) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.SULPHURIC_ROCK.stone); mut.setY(mut.getY() + 1); } - state = EndBlocks.HYDROTHERMAL_VENT.defaultBlockState().with(HydrothermalVentBlock.ACTIVATED, + state = EndBlocks.HYDROTHERMAL_VENT.defaultBlockState().setValue(HydrothermalVentBlock.ACTIVATED, distRaw < 2); BlocksHelper.setWithoutUpdate(world, mut, state); mut.setY(mut.getY() + 1); @@ -250,11 +250,11 @@ public class GeyserFeature extends DefaultFeature { static { REPLACE1 = (state) -> { - return state.isAir() || (state.isIn(EndTags.GEN_TERRAIN)); + return state.isAir() || (state.is(EndTags.GEN_TERRAIN)); }; REPLACE2 = (state) -> { - if (state.isIn(EndTags.GEN_TERRAIN) || state.is(EndBlocks.HYDROTHERMAL_VENT) + if (state.is(EndTags.GEN_TERRAIN) || state.is(EndBlocks.HYDROTHERMAL_VENT) || state.is(EndBlocks.SULPHUR_CRYSTAL)) { return true; } diff --git a/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java b/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java index a1db3934..d106c5c9 100644 --- a/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java @@ -1,13 +1,12 @@ package ru.betterend.world.features.terrain; +import com.mojang.math.Vector3f; import java.util.ArrayList; import java.util.List; import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; -import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.registry.EndBlocks; @@ -45,12 +44,12 @@ public class IceStarFeature extends DefaultFeature { for (Vector3f point : points) { SDF rotated = spike; point = MHelper.normalize(point); - float angle = MHelper.angle(Vector3f.POSITIVE_Y, point); + float angle = MHelper.angle(Vector3f.YP, point); if (angle > 0.01F && angle < 3.14F) { - Vector3f axis = MHelper.normalize(MHelper.cross(Vector3f.POSITIVE_Y, point)); + Vector3f axis = MHelper.normalize(MHelper.cross(Vector3f.YP, point)); rotated = new SDFRotation().setRotation(axis, angle).setSource(spike); } else if (angle > 1) { - rotated = new SDFRotation().setRotation(Vector3f.POSITIVE_Y, (float) Math.PI).setSource(spike); + rotated = new SDFRotation().setRotation(Vector3f.YP, (float) Math.PI).setSource(spike); } sdf = (sdf == null) ? rotated : new SDFUnion().setSourceA(sdf).setSourceB(rotated); } diff --git a/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java b/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java index 815e810c..a47a0eb5 100644 --- a/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java @@ -1,14 +1,13 @@ package ru.betterend.world.features.terrain; import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.Material; import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; +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.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -25,7 +24,7 @@ public class ObsidianBoulderFeature extends DefaultFeature { NoneFeatureConfiguration config) { pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); - if (!world.getBlockState(pos.below()).isIn(EndTags.END_GROUND)) { + if (!world.getBlockState(pos.below()).is(EndTags.END_GROUND)) { return false; } @@ -40,7 +39,7 @@ public class ObsidianBoulderFeature extends DefaultFeature { } private void makeBoulder(WorldGenLevel world, BlockPos pos, Random random) { - if (!world.getBlockState(pos.below()).isIn(EndTags.END_GROUND)) { + if (!world.getBlockState(pos.below()).is(EndTags.END_GROUND)) { return; } @@ -62,7 +61,7 @@ public class ObsidianBoulderFeature extends DefaultFeature { } return info.getState(); }).setReplaceFunction((state) -> { - return state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN) + return state.getMaterial().isReplaceable() || state.is(EndTags.GEN_TERRAIN) || state.getMaterial().equals(Material.PLANT); }).fillRecursive(world, pos); } diff --git a/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java b/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java index 08067b32..923b39e6 100644 --- a/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java @@ -1,15 +1,14 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.Material; import com.mojang.math.Vector3f; +import java.util.Random; import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; +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.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -29,7 +28,7 @@ public class ObsidianPillarBasementFeature extends DefaultFeature { NoneFeatureConfiguration config) { pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); - if (!world.getBlockState(pos.down(5)).isIn(EndTags.GEN_TERRAIN)) { + if (!world.getBlockState(pos.below(5)).is(EndTags.GEN_TERRAIN)) { return false; } @@ -59,7 +58,7 @@ public class ObsidianPillarBasementFeature extends DefaultFeature { } return info.getState(); }).setReplaceFunction((state) -> { - return state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN) + return state.getMaterial().isReplaceable() || state.is(EndTags.GEN_TERRAIN) || state.getMaterial().equals(Material.PLANT); }).fillRecursive(world, pos); diff --git a/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java b/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java index cd73b096..2e8624b3 100644 --- a/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java @@ -1,11 +1,10 @@ package ru.betterend.world.features.terrain; import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; +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.feature.configurations.NoneFeatureConfiguration; import ru.betterend.noise.OpenSimplexNoise; diff --git a/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java b/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java index 08f7c648..a1f1aca3 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java @@ -1,12 +1,11 @@ package ru.betterend.world.features.terrain; import java.util.Random; - -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.state.property.Properties; import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.registry.EndTags; @@ -23,14 +22,14 @@ public class SingleBlockFeature extends DefaultFeature { @Override public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).isIn(EndTags.GEN_TERRAIN)) { + if (!world.getBlockState(pos.below()).is(EndTags.GEN_TERRAIN)) { return false; } BlockState state = block.defaultBlockState(); - if (block.getStateManager().getProperty("waterlogged") != null) { + if (block.getStateDefinition().getProperty("waterlogged") != null) { boolean waterlogged = !world.getFluidState(pos).isEmpty(); - state = state.with(Properties.WATERLOGGED, waterlogged); + state = state.setValue(BlockStateProperties.WATERLOGGED, waterlogged); } BlocksHelper.setWithoutUpdate(world, pos, state); diff --git a/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java b/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java index 6397ca07..66aac613 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java @@ -1,12 +1,11 @@ package ru.betterend.world.features.terrain; import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.state.property.Properties; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.registry.EndBlocks; @@ -19,7 +18,7 @@ public class SmaragdantCrystalFeature extends DefaultFeature { @Override public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).isIn(EndTags.GEN_TERRAIN)) { + if (!world.getBlockState(pos.below()).is(EndTags.GEN_TERRAIN)) { return false; } @@ -38,13 +37,14 @@ public class SmaragdantCrystalFeature extends DefaultFeature { mut.setY(mut.getY() - 1); state = world.getBlockState(mut); } - if (state.isIn(EndTags.GEN_TERRAIN) && !world.getBlockState(mut.up()).is(crystal.getBlock())) { + if (state.is(EndTags.GEN_TERRAIN) && !world.getBlockState(mut.above()).is(crystal.getBlock())) { for (int j = 0; j <= dist; j++) { BlocksHelper.setWithoutUpdate(world, mut, crystal); mut.setY(mut.getY() + 1); } boolean waterlogged = !world.getFluidState(mut).isEmpty(); - BlocksHelper.setWithoutUpdate(world, mut, shard.with(Properties.WATERLOGGED, waterlogged)); + BlocksHelper.setWithoutUpdate(world, mut, + shard.setValue(BlockStateProperties.WATERLOGGED, waterlogged)); } } } diff --git a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java index 30617675..980d436d 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java @@ -3,18 +3,16 @@ package ru.betterend.world.features.terrain; import java.util.List; import java.util.Random; import java.util.function.Function; - -import com.google.common.collect.Lists; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.LeavesBlock; -import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.material.Material; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; +import com.google.common.collect.Lists; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndFeatures; @@ -46,7 +44,7 @@ public class SpireFeature extends DefaultFeature { sdf = addSegment(sdf, MHelper.randRange(rMin, rMin + 1.5F, random), random); } OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); - sdf = new SDFDisplacement().setFunction(vec -> { + sdf = new SDFDisplacement().setFunction((vec) -> { return (float) (Math.abs(noise.eval(vec.x() * 0.1, vec.y() * 0.1, vec.z() * 0.1)) * 3F + Math.abs(noise.eval(vec.x() * 0.3, vec.y() * 0.3 + 100, vec.z() * 0.3)) * 1.3F); }).setSource(sdf); diff --git a/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java b/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java index 3a336a23..bfc53e91 100644 --- a/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java @@ -1,14 +1,13 @@ package ru.betterend.world.features.terrain; import java.util.Random; - -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.state.property.Properties; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.basis.StalactiteBlock; @@ -30,7 +29,7 @@ public class StalactiteFeature extends DefaultFeature { @Override public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { - if (!isGround(world.getBlockState(ceiling ? pos.up() : pos.below()).getBlock())) { + if (!isGround(world.getBlockState(ceiling ? pos.above() : pos.below()).getBlock())) { return false; } @@ -43,7 +42,7 @@ public class StalactiteFeature extends DefaultFeature { mut.setY(pos.getY() + i * dir); BlockState state = world.getBlockState(mut); if (!state.getMaterial().isReplaceable()) { - stalagnate = state.isIn(EndTags.GEN_TERRAIN); + stalagnate = state.is(EndTags.GEN_TERRAIN); height = i; break; } @@ -58,10 +57,10 @@ public class StalactiteFeature extends DefaultFeature { mut.setY(pos.getY() + i * dir); int size = stalagnate ? Mth.clamp((int) (Mth.abs(i - center) + 1), 1, 7) : height - i - 1; boolean waterlogged = !world.getFluidState(mut).isEmpty(); - BlockState base = block.defaultBlockState().with(StalactiteBlock.SIZE, size).with(Properties.WATERLOGGED, - waterlogged); - BlockState state = stalagnate ? base.with(StalactiteBlock.IS_FLOOR, dir > 0 ? i < center : i > center) - : base.with(StalactiteBlock.IS_FLOOR, dir > 0); + BlockState base = block.defaultBlockState().setValue(StalactiteBlock.SIZE, size) + .setValue(BlockStateProperties.WATERLOGGED, waterlogged); + BlockState state = stalagnate ? base.setValue(StalactiteBlock.IS_FLOOR, dir > 0 ? i < center : i > center) + : base.setValue(StalactiteBlock.IS_FLOOR, dir > 0); BlocksHelper.setWithoutUpdate(world, mut, state); } diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java index d75ea8ed..cab6b03f 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java @@ -1,13 +1,12 @@ package ru.betterend.world.features.terrain; import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +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.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.BlockProperties; @@ -46,7 +45,7 @@ public class SulphurHillFeature extends DefaultFeature { int max = radius + 4; MutableBlockPos mut = new MutableBlockPos(); BlockState rock = EndBlocks.SULPHURIC_ROCK.stone.defaultBlockState(); - BlockState brimstone = EndBlocks.BRIMSTONE.defaultBlockState().with(BlockProperties.ACTIVE, true); + BlockState brimstone = EndBlocks.BRIMSTONE.defaultBlockState().setValue(BlockProperties.ACTIVE, true); for (int x = min; x < max; x++) { int x2 = x * x; int px = pos.getX() + x; diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java index 35aa9add..e02cf7cb 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java @@ -2,20 +2,18 @@ package ru.betterend.world.features.terrain; import java.util.Random; import java.util.Set; - -import com.google.common.collect.Sets; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.HorizontalFacingBlock; -import net.minecraft.world.level.material.Material; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.Heightmap; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; +import com.google.common.collect.Sets; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.SulphurCrystalBlock; import ru.betterend.noise.OpenSimplexNoise; @@ -35,14 +33,14 @@ public class SulphuricCaveFeature extends DefaultFeature { NoneFeatureConfiguration config) { int radius = MHelper.randRange(10, 30, random); - int top = world.getTopY(Heightmap.Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); + int top = world.getHeight(Heightmap.Types.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); MutableBlockPos bpos = new MutableBlockPos(); bpos.setX(pos.getX()); bpos.setZ(pos.getZ()); bpos.setY(top - 1); BlockState state = world.getBlockState(bpos); - while (!state.isIn(EndTags.GEN_TERRAIN) && bpos.getY() > 5) { + while (!state.is(EndTags.GEN_TERRAIN) && bpos.getY() > 5) { bpos.setY(bpos.getY() - 1); state = world.getBlockState(bpos); } @@ -51,7 +49,7 @@ public class SulphuricCaveFeature extends DefaultFeature { } top = (int) (bpos.getY() - (radius * 1.3F + 5)); - while (state.isIn(EndTags.GEN_TERRAIN) || !state.getFluidState().isEmpty() && bpos.getY() > 5) { + while (state.is(EndTags.GEN_TERRAIN) || !state.getFluidState().isEmpty() && bpos.getY() > 5) { bpos.setY(bpos.getY() - 1); state = world.getBlockState(bpos); } @@ -102,7 +100,7 @@ public class SulphuricCaveFeature extends DefaultFeature { } } else if (dist < r2 * r2) { state = world.getBlockState(mut); - if (state.isIn(EndTags.GEN_TERRAIN) || state.is(Blocks.AIR)) { + if (state.is(EndTags.GEN_TERRAIN) || state.is(Blocks.AIR)) { double v = noise.eval(x * 0.1, y * 0.1, z * 0.1) + noise.eval(x * 0.03, y * 0.03, z * 0.03) * 0.5; if (v > 0.4) { @@ -128,20 +126,20 @@ public class SulphuricCaveFeature extends DefaultFeature { + random.nextInt(2); if (dist > 0) { state = world.getBlockState(mut); - while (!state.getFluidState().isEmpty() || state.getMaterial().equals(Material.UNDERWATER_PLANT)) { + while (!state.getFluidState().isEmpty() || state.getMaterial().equals(Material.WATER_PLANT)) { mut.setY(mut.getY() - 1); state = world.getBlockState(mut); } - if (state.isIn(EndTags.GEN_TERRAIN) - && !world.getBlockState(mut.up()).is(EndBlocks.HYDROTHERMAL_VENT)) { + if (state.is(EndTags.GEN_TERRAIN) + && !world.getBlockState(mut.above()).is(EndBlocks.HYDROTHERMAL_VENT)) { for (int j = 0; j <= dist; j++) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.SULPHURIC_ROCK.stone); MHelper.shuffle(HORIZONTAL, random); for (Direction dir : HORIZONTAL) { - BlockPos p = mut.offset(dir); + BlockPos p = mut.relative(dir); if (random.nextBoolean() && world.getBlockState(p).is(Blocks.WATER)) { BlocksHelper.setWithoutUpdate(world, p, EndBlocks.TUBE_WORM.defaultBlockState() - .with(HorizontalFacingBlock.FACING, dir)); + .setValue(HorizontalDirectionalBlock.FACING, dir)); } } mut.setY(mut.getY() + 1); @@ -151,7 +149,7 @@ public class SulphuricCaveFeature extends DefaultFeature { state = world.getBlockState(mut); while (state.is(Blocks.WATER)) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.VENT_BUBBLE_COLUMN.defaultBlockState()); - world.getBlockTickScheduler().schedule(mut, EndBlocks.VENT_BUBBLE_COLUMN, + world.getBlockTicks().scheduleTick(mut, EndBlocks.VENT_BUBBLE_COLUMN, MHelper.randRange(8, 32, random)); mut.setY(mut.getY() + 1); state = world.getBlockState(mut); @@ -167,10 +165,10 @@ public class SulphuricCaveFeature extends DefaultFeature { } private boolean isReplaceable(BlockState state) { - return state.isIn(EndTags.GEN_TERRAIN) || state.is(EndBlocks.HYDROTHERMAL_VENT) + return state.is(EndTags.GEN_TERRAIN) || state.is(EndBlocks.HYDROTHERMAL_VENT) || state.is(EndBlocks.VENT_BUBBLE_COLUMN) || state.is(EndBlocks.SULPHUR_CRYSTAL) || state.getMaterial().isReplaceable() || state.getMaterial().equals(Material.PLANT) - || state.getMaterial().equals(Material.UNDERWATER_PLANT) || state.getMaterial().equals(Material.LEAVES); + || state.getMaterial().equals(Material.WATER_PLANT) || state.getMaterial().equals(Material.LEAVES); } private void placeBrimstone(WorldGenLevel world, BlockPos pos, Random random) { @@ -184,7 +182,7 @@ public class SulphuricCaveFeature extends DefaultFeature { private BlockState getBrimstone(WorldGenLevel world, BlockPos pos) { for (Direction dir : BlocksHelper.DIRECTIONS) { if (world.getBlockState(pos.relative(dir)).is(Blocks.WATER)) { - return EndBlocks.BRIMSTONE.defaultBlockState().with(BlockProperties.ACTIVE, true); + return EndBlocks.BRIMSTONE.defaultBlockState().setValue(BlockProperties.ACTIVE, true); } } return EndBlocks.BRIMSTONE.defaultBlockState(); @@ -195,8 +193,8 @@ public class SulphuricCaveFeature extends DefaultFeature { BlockPos side; if (random.nextInt(16) == 0 && world.getBlockState((side = pos.relative(dir))).is(Blocks.WATER)) { BlockState state = EndBlocks.SULPHUR_CRYSTAL.defaultBlockState() - .with(SulphurCrystalBlock.WATERLOGGED, true).with(SulphurCrystalBlock.FACING, dir) - .with(SulphurCrystalBlock.AGE, random.nextInt(3)); + .setValue(SulphurCrystalBlock.WATERLOGGED, true).setValue(SulphurCrystalBlock.FACING, dir) + .setValue(SulphurCrystalBlock.AGE, random.nextInt(3)); BlocksHelper.setWithoutUpdate(world, side, state); } } diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java index 5f1948a4..50de79e8 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java @@ -2,18 +2,16 @@ package ru.betterend.world.features.terrain; import java.util.Random; import java.util.Set; - -import com.google.common.collect.Sets; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.Fluids; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +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.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Fluids; +import com.google.common.collect.Sets; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.SulphurCrystalBlock; import ru.betterend.noise.OpenSimplexNoise; @@ -60,25 +58,25 @@ public class SulphuricLakeFeature extends DefaultFeature { int dist = x2 + z2; if (dist <= r) { POS.setY(getYOnSurface(world, x, z) - 1); - if (world.getBlockState(POS).isIn(EndTags.GEN_TERRAIN)) { + if (world.getBlockState(POS).is(EndTags.GEN_TERRAIN)) { if (isBorder(world, POS)) { if (random.nextInt(8) > 0) { brimstone.add(POS.immutable()); if (random.nextBoolean()) { brimstone.add(POS.below()); if (random.nextBoolean()) { - brimstone.add(POS.down(2)); + brimstone.add(POS.below(2)); } } } else { if (!isAbsoluteBorder(world, POS)) { BlocksHelper.setWithoutUpdate(world, POS, Blocks.WATER); - world.getFluidTickScheduler().schedule(POS, Fluids.WATER, 0); + world.getLiquidTicks().scheduleTick(POS, Fluids.WATER, 0); brimstone.add(POS.below()); if (random.nextBoolean()) { - brimstone.add(POS.down(2)); + brimstone.add(POS.below(2)); if (random.nextBoolean()) { - brimstone.add(POS.down(3)); + brimstone.add(POS.below(3)); } } } else { @@ -92,8 +90,8 @@ public class SulphuricLakeFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, POS, Blocks.WATER); brimstone.remove(POS); for (Direction dir : BlocksHelper.HORIZONTAL) { - BlockPos offseted = POS.offset(dir); - if (world.getBlockState(offseted).isIn(EndTags.GEN_TERRAIN)) { + BlockPos offseted = POS.relative(dir); + if (world.getBlockState(offseted).is(EndTags.GEN_TERRAIN)) { brimstone.add(offseted); } } @@ -101,29 +99,29 @@ public class SulphuricLakeFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, POS.move(Direction.DOWN), Blocks.WATER); brimstone.remove(POS); for (Direction dir : BlocksHelper.HORIZONTAL) { - BlockPos offseted = POS.offset(dir); - if (world.getBlockState(offseted).isIn(EndTags.GEN_TERRAIN)) { + BlockPos offseted = POS.relative(dir); + if (world.getBlockState(offseted).is(EndTags.GEN_TERRAIN)) { brimstone.add(offseted); } } } brimstone.add(POS.below()); if (random.nextBoolean()) { - brimstone.add(POS.down(2)); + brimstone.add(POS.below(2)); if (random.nextBoolean()) { - brimstone.add(POS.down(3)); + brimstone.add(POS.below(3)); } } } } } else if (dist < r2) { POS.setY(getYOnSurface(world, x, z) - 1); - if (world.getBlockState(POS).isIn(EndTags.GEN_TERRAIN)) { + if (world.getBlockState(POS).is(EndTags.GEN_TERRAIN)) { brimstone.add(POS.immutable()); if (random.nextBoolean()) { brimstone.add(POS.below()); if (random.nextBoolean()) { - brimstone.add(POS.down(2)); + brimstone.add(POS.below(2)); } } } @@ -141,7 +139,7 @@ public class SulphuricLakeFeature extends DefaultFeature { private boolean isBorder(WorldGenLevel world, BlockPos pos) { int y = pos.getY() + 1; for (Direction dir : BlocksHelper.DIRECTIONS) { - if (getYOnSurface(world, pos.getX() + dir.getOffsetX(), pos.getZ() + dir.getOffsetZ()) < y) { + if (getYOnSurface(world, pos.getX() + dir.getStepX(), pos.getZ() + dir.getStepZ()) < y) { return true; } } @@ -151,7 +149,7 @@ public class SulphuricLakeFeature extends DefaultFeature { private boolean isAbsoluteBorder(WorldGenLevel world, BlockPos pos) { int y = pos.getY() - 2; for (Direction dir : BlocksHelper.DIRECTIONS) { - if (getYOnSurface(world, pos.getX() + dir.getOffsetX() * 3, pos.getZ() + dir.getOffsetZ() * 3) < y) { + if (getYOnSurface(world, pos.getX() + dir.getStepX() * 3, pos.getZ() + dir.getStepZ() * 3) < y) { return true; } } @@ -161,9 +159,9 @@ public class SulphuricLakeFeature extends DefaultFeature { private boolean isDeepWater(WorldGenLevel world, BlockPos pos) { int y = pos.getY() + 1; for (Direction dir : BlocksHelper.DIRECTIONS) { - if (getYOnSurface(world, pos.getX() + dir.getOffsetX(), pos.getZ() + dir.getOffsetZ()) < y - || getYOnSurface(world, pos.getX() + dir.getOffsetX() * 2, pos.getZ() + dir.getOffsetZ() * 2) < y - || getYOnSurface(world, pos.getX() + dir.getOffsetX() * 3, pos.getZ() + dir.getOffsetZ() * 3) < y) { + if (getYOnSurface(world, pos.getX() + dir.getStepX(), pos.getZ() + dir.getStepZ()) < y + || getYOnSurface(world, pos.getX() + dir.getStepX() * 2, pos.getZ() + dir.getStepZ() * 2) < y + || getYOnSurface(world, pos.getX() + dir.getStepX() * 3, pos.getZ() + dir.getStepZ() * 3) < y) { return false; } } @@ -181,7 +179,7 @@ public class SulphuricLakeFeature extends DefaultFeature { private BlockState getBrimstone(WorldGenLevel world, BlockPos pos) { for (Direction dir : BlocksHelper.DIRECTIONS) { if (world.getBlockState(pos.relative(dir)).is(Blocks.WATER)) { - return EndBlocks.BRIMSTONE.defaultBlockState().with(BlockProperties.ACTIVE, true); + return EndBlocks.BRIMSTONE.defaultBlockState().setValue(BlockProperties.ACTIVE, true); } } return EndBlocks.BRIMSTONE.defaultBlockState(); @@ -192,8 +190,8 @@ public class SulphuricLakeFeature extends DefaultFeature { BlockPos side; if (random.nextInt(16) == 0 && world.getBlockState((side = pos.relative(dir))).is(Blocks.WATER)) { BlockState state = EndBlocks.SULPHUR_CRYSTAL.defaultBlockState() - .with(SulphurCrystalBlock.WATERLOGGED, true).with(SulphurCrystalBlock.FACING, dir) - .with(SulphurCrystalBlock.AGE, random.nextInt(3)); + .setValue(SulphurCrystalBlock.WATERLOGGED, true).setValue(SulphurCrystalBlock.FACING, dir) + .setValue(SulphurCrystalBlock.AGE, random.nextInt(3)); BlocksHelper.setWithoutUpdate(world, side, state); } } diff --git a/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java b/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java index 1e75d2ca..1ddf691e 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java @@ -1,11 +1,10 @@ package ru.betterend.world.features.terrain; import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.HydrothermalVentBlock; @@ -21,13 +20,13 @@ public class SurfaceVentFeature extends DefaultFeature { NoneFeatureConfiguration config) { pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); - if (!world.getBlockState(pos.down(3)).isIn(EndTags.GEN_TERRAIN)) { + if (!world.getBlockState(pos.below(3)).is(EndTags.GEN_TERRAIN)) { return false; } MutableBlockPos mut = new MutableBlockPos(); int count = MHelper.randRange(15, 30, random); - BlockState vent = EndBlocks.HYDROTHERMAL_VENT.defaultBlockState().with(HydrothermalVentBlock.WATERLOGGED, + BlockState vent = EndBlocks.HYDROTHERMAL_VENT.defaultBlockState().setValue(HydrothermalVentBlock.WATERLOGGED, false); for (int i = 0; i < count; i++) { mut.set(pos).move(MHelper.floor(random.nextGaussian() * 2 + 0.5), 5, @@ -40,7 +39,8 @@ public class SurfaceVentFeature extends DefaultFeature { mut.setY(mut.getY() - 1); state = world.getBlockState(mut); } - if (state.isIn(EndTags.GEN_TERRAIN) && !world.getBlockState(mut.up()).is(EndBlocks.HYDROTHERMAL_VENT)) { + if (state.is(EndTags.GEN_TERRAIN) + && !world.getBlockState(mut.above()).is(EndBlocks.HYDROTHERMAL_VENT)) { for (int j = 0; j <= dist; j++) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.SULPHURIC_ROCK.stone); mut.setY(mut.getY() + 1); diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java index 96397bb2..d01a6dad 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java @@ -3,18 +3,16 @@ package ru.betterend.world.features.terrain.caves; import java.util.Random; import java.util.Set; import java.util.function.Supplier; - -import com.google.common.collect.Sets; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.chunk.Chunk; +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.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import com.google.common.collect.Sets; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; import ru.betterend.world.biome.cave.EndCaveBiome; @@ -45,8 +43,8 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { return true; } - protected void fillSets(int sx, int sz, Chunk chunk, Set floorPositions, Set ceilPositions, - MutableBlockPos min, MutableBlockPos max) { + protected void fillSets(int sx, int sz, ChunkAccess chunk, Set floorPositions, + Set ceilPositions, MutableBlockPos min, MutableBlockPos max) { MutableBlockPos mut = new MutableBlockPos(); MutableBlockPos mut2 = new MutableBlockPos(); MutableBlockPos mut3 = new MutableBlockPos(); @@ -57,16 +55,16 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { mut.setZ(z); mut2.setZ(z); mut2.setY(0); - for (int y = 1; y < chunk.getHeight(); y++) { + for (int y = 1; y < chunk.getMaxBuildHeight(); y++) { mut.setY(y); BlockState top = chunk.getBlockState(mut); BlockState bottom = chunk.getBlockState(mut2); - if (top.isAir() && (bottom.isIn(EndTags.GEN_TERRAIN) || bottom.is(Blocks.STONE))) { + if (top.isAir() && (bottom.is(EndTags.GEN_TERRAIN) || bottom.is(Blocks.STONE))) { mut3.set(mut2).move(sx, 0, sz); floorPositions.add(mut3.immutable()); updateMin(mut3, min); updateMax(mut3, max); - } else if (bottom.isAir() && (top.isIn(EndTags.GEN_TERRAIN) || top.is(Blocks.STONE))) { + } else if (bottom.isAir() && (top.is(EndTags.GEN_TERRAIN) || top.is(Blocks.STONE))) { mut3.set(mut).move(sx, 0, sz); ceilPositions.add(mut3.immutable()); updateMin(mut3, min); @@ -110,7 +108,7 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { if (density > 0 && random.nextFloat() <= density) { Feature feature = biome.getFloorFeature(random); if (feature != null) { - feature.place(world, null, random, pos.up(), null); + feature.place(world, null, random, pos.above(), null); } } }); 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 b1787b6c..f7f0f99d 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 @@ -2,20 +2,18 @@ package ru.betterend.world.features.terrain.caves; import java.util.Random; import java.util.Set; - -import com.google.common.collect.Sets; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.Heightmap; 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.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import com.google.common.collect.Sets; import ru.betterend.interfaces.IBiomeArray; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndTags; @@ -62,11 +60,11 @@ public abstract class EndCaveFeature extends DefaultFeature { mut.set(bpos); if (world.getBlockState(mut).getMaterial().isReplaceable()) { mut.setY(bpos.getY() - 1); - if (world.getBlockState(mut).isIn(EndTags.GEN_TERRAIN)) { + if (world.getBlockState(mut).is(EndTags.GEN_TERRAIN)) { floorPositions.add(mut.immutable()); } mut.setY(bpos.getY() + 1); - if (world.getBlockState(mut).isIn(EndTags.GEN_TERRAIN)) { + if (world.getBlockState(mut).is(EndTags.GEN_TERRAIN)) { ceilPositions.add(mut.immutable()); } } @@ -82,7 +80,7 @@ public abstract class EndCaveFeature extends DefaultFeature { return true; } - protected abstract Set place(WorldGenLevel world, BlockPos center, int radius, Random random); + protected abstract Set generate(WorldGenLevel world, BlockPos center, int radius, Random random); protected void placeFloor(WorldGenLevel world, EndCaveBiome biome, Set floorPositions, Random random, BlockState surfaceBlock) { @@ -92,7 +90,7 @@ public abstract class EndCaveFeature extends DefaultFeature { if (density > 0 && random.nextFloat() <= density) { Feature feature = biome.getFloorFeature(random); if (feature != null) { - feature.place(world, null, random, pos.up(), null); + feature.place(world, null, random, pos.above(), null); } } }); @@ -119,21 +117,21 @@ public abstract class EndCaveFeature extends DefaultFeature { } private void setBiome(WorldGenLevel world, BlockPos pos, EndCaveBiome biome) { - IBiomeArray array = (IBiomeArray) world.getChunk(pos).getBiomeArray(); + IBiomeArray array = (IBiomeArray) world.getChunk(pos).getBiomes(); if (array != null) { array.setBiome(biome.getActualBiome(), pos); } } private BlockPos findPos(WorldGenLevel world, BlockPos pos, int radius, Random random) { - int top = world.getTopY(Heightmap.Type.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); + int top = world.getHeight(Heightmap.Types.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); MutableBlockPos bpos = new MutableBlockPos(); bpos.setX(pos.getX()); bpos.setZ(pos.getZ()); bpos.setY(top - 1); BlockState state = world.getBlockState(bpos); - while (!state.isIn(EndTags.GEN_TERRAIN) && bpos.getY() > 5) { + while (!state.is(EndTags.GEN_TERRAIN) && bpos.getY() > 5) { bpos.setY(bpos.getY() - 1); state = world.getBlockState(bpos); } @@ -142,7 +140,7 @@ public abstract class EndCaveFeature extends DefaultFeature { } top = (int) (bpos.getY() - (radius * 1.3F + 5)); - while (state.isIn(EndTags.GEN_TERRAIN) || !state.getFluidState().isEmpty() && bpos.getY() > 5) { + while (state.is(EndTags.GEN_TERRAIN) || !state.getFluidState().isEmpty() && bpos.getY() > 5) { bpos.setY(bpos.getY() - 1); state = world.getBlockState(bpos); } @@ -181,7 +179,7 @@ public abstract class EndCaveFeature extends DefaultFeature { end.setZ(bpos.getZ()); } }); - BlocksHelper.fixBlocks(world, start.add(-5, -5, -5), end.add(5, 5, 5)); + BlocksHelper.fixBlocks(world, start.offset(-5, -5, -5), end.offset(5, 5, 5)); } protected boolean isWaterNear(WorldGenLevel world, BlockPos pos) { 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 54c96c39..bcdffd3e 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,14 +2,12 @@ package ru.betterend.world.features.terrain.caves; import java.util.Random; import java.util.Set; - -import com.google.common.collect.Sets; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import com.google.common.collect.Sets; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; @@ -17,19 +15,19 @@ import ru.betterend.util.MHelper; public class RoundCaveFeature extends EndCaveFeature { @Override - protected Set place(WorldGenLevel world, BlockPos center, int radius, Random random) { + protected Set generate(WorldGenLevel world, BlockPos center, int radius, Random random) { OpenSimplexNoise noise = new OpenSimplexNoise(MHelper.getSeed(534, center.getX(), center.getZ())); - + int x1 = center.getX() - radius - 5; int z1 = center.getZ() - radius - 5; int x2 = center.getX() + radius + 5; int z2 = center.getZ() + radius + 5; int y1 = MHelper.floor(center.getY() - (radius + 5) / 1.6); int y2 = MHelper.floor(center.getY() + (radius + 5) / 1.6); - + double hr = radius * 0.75; double nr = radius * 0.25; - + BlockState state; MutableBlockPos bpos = new MutableBlockPos(); Set blocks = Sets.newHashSet(); @@ -53,13 +51,13 @@ public class RoundCaveFeature extends EndCaveFeature { 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); @@ -71,12 +69,14 @@ public class RoundCaveFeature extends EndCaveFeature { } } } - + return blocks; } - + private boolean isReplaceable(BlockState state) { - return state.isIn(EndTags.GEN_TERRAIN) || state.getMaterial().isReplaceable() - || state.getMaterial().equals(Material.PLANT) || state.getMaterial().equals(Material.LEAVES); + return state.is(EndTags.GEN_TERRAIN) + || state.getMaterial().isReplaceable() + || state.getMaterial().equals(Material.PLANT) + || state.getMaterial().equals(Material.LEAVES); } } 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 d428fc45..7a3db063 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 @@ -1,17 +1,16 @@ package ru.betterend.world.features.terrain.caves; +import com.mojang.math.Vector3f; import java.util.List; import java.util.Random; import java.util.Set; import java.util.function.Function; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.Material; -import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; import ru.betterend.util.SplineHelper; @@ -19,18 +18,17 @@ import ru.betterend.util.sdf.SDF; public class TunelCaveFeature extends EndCaveFeature { private static final Function REPLACE; - + @Override - protected Set place(WorldGenLevel world, BlockPos center, int radius, Random random) { - // OpenSimplexNoise noise = new OpenSimplexNoise(MHelper.getSeed(534, - // center.getX(), center.getZ())); + protected Set generate(WorldGenLevel world, BlockPos center, int radius, Random random) { + //OpenSimplexNoise noise = new OpenSimplexNoise(MHelper.getSeed(534, center.getX(), center.getZ())); float rad = radius * 0.15F; int min = Mth.ceil(rad) - 15; int max = 31 - Mth.floor(rad); List spline = SplineHelper.makeSpline(0, 0, 0, 0, 0, 0, radius / 3); spline = SplineHelper.smoothSpline(spline, 5); SplineHelper.offsetParts(spline, random, 5, radius * 0.4F, 5); - for (Vector3f vec : spline) { + for (Vector3f vec: spline) { float x = Mth.clamp(vec.x(), min, max); float y = Mth.clamp(vec.y(), -radius, radius); float z = Mth.clamp(vec.z(), min, max); @@ -38,16 +36,18 @@ public class TunelCaveFeature extends EndCaveFeature { } SDF sdf = SplineHelper.buildSDF(spline, rad, rad, (vec) -> Blocks.AIR.defaultBlockState()); Set positions = sdf.setReplaceFunction(REPLACE).getPositions(world, center); - for (BlockPos p : positions) { + for (BlockPos p: positions) { BlocksHelper.setWithoutUpdate(world, p, CAVE_AIR); } return positions; } - + static { REPLACE = (state) -> { - return state.isIn(EndTags.GEN_TERRAIN) || state.getMaterial().isReplaceable() - || state.getMaterial().equals(Material.PLANT) || state.getMaterial().equals(Material.LEAVES); + return state.is(EndTags.GEN_TERRAIN) + || state.getMaterial().isReplaceable() + || state.getMaterial().equals(Material.PLANT) + || state.getMaterial().equals(Material.LEAVES); }; } } diff --git a/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java index 1a890aa4..b9bf59a0 100644 --- a/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java @@ -3,19 +3,17 @@ package ru.betterend.world.features.trees; import java.util.List; import java.util.Random; import java.util.function.Function; - -import com.google.common.collect.Lists; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.LeavesBlock; -import net.minecraft.world.level.material.Material; -import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; +import com.google.common.collect.Lists; +import com.mojang.math.Vector3f; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -44,7 +42,7 @@ public class DragonTreeFeature extends DefaultFeature { @Override public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) return false; float size = MHelper.randRange(10, 25, random); @@ -59,10 +57,10 @@ public class DragonTreeFeature extends DefaultFeature { Vector3f last = SplineHelper.getPos(spline, 3.5F); OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); float radius = size * MHelper.randRange(0.5F, 0.7F, random); - makeCap(world, pos.offset(last.getX(), last.getY(), last.getZ()), radius, random, noise); + makeCap(world, pos.offset(last.x(), last.y(), last.z()), radius, random, noise); last = spline.get(0); - makeRoots(world, pos.offset(last.getX(), last.getY(), last.getZ()), radius, random); + makeRoots(world, pos.offset(last.x(), last.y(), last.z()), radius, random); radius = MHelper.randRange(1.2F, 2.3F, random); SDF function = SplineHelper.buildSDF(spline, radius, 1.2F, (bpos) -> { @@ -78,7 +76,7 @@ public class DragonTreeFeature extends DefaultFeature { private void makeCap(WorldGenLevel world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) { int count = (int) radius; - int offset = (int) (BRANCH.get(BRANCH.size() - 1).getY() * radius); + int offset = (int) (BRANCH.get(BRANCH.size() - 1).y() * radius); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2; float scale = radius * MHelper.randRange(0.85F, 1.15F, random); @@ -98,7 +96,7 @@ public class DragonTreeFeature extends DefaultFeature { SplineHelper.scale(branch, scale); SplineHelper.fillSpline(branch, world, EndBlocks.DRAGON_TREE.bark.defaultBlockState(), pos, REPLACE); } - leavesBall(world, pos.up(offset), radius * 1.15F + 2, random, noise); + leavesBall(world, pos.above(offset), radius * 1.15F + 2, random, noise); } private void makeRoots(WorldGenLevel world, BlockPos pos, float radius, Random random) { @@ -111,7 +109,7 @@ public class DragonTreeFeature extends DefaultFeature { SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); Vector3f last = branch.get(branch.size() - 1); - if (world.getBlockState(pos.offset(last.getX(), last.getY(), last.getZ())).isIn(EndTags.GEN_TERRAIN)) { + if (world.getBlockState(pos.offset(last.x(), last.y(), last.z())).is(EndTags.GEN_TERRAIN)) { SplineHelper.fillSpline(branch, world, EndBlocks.DRAGON_TREE.bark.defaultBlockState(), pos, REPLACE); } } @@ -119,7 +117,7 @@ public class DragonTreeFeature extends DefaultFeature { private void leavesBall(WorldGenLevel world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) { SDF sphere = new SDFSphere().setRadius(radius) - .setBlock(EndBlocks.DRAGON_TREE_LEAVES.defaultBlockState().with(LeavesBlock.DISTANCE, 6)); + .setBlock(EndBlocks.DRAGON_TREE_LEAVES.defaultBlockState().setValue(LeavesBlock.DISTANCE, 6)); SDF sub = new SDFScale().setScale(5).setSource(sphere); sub = new SDFTranslate().setTranslate(0, -radius * 5, 0).setSource(sub); sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sub); @@ -155,7 +153,7 @@ public class DragonTreeFeature extends DefaultFeature { if (state.getBlock() instanceof LeavesBlock) { int distance = state.getValue(LeavesBlock.DISTANCE); if (d < distance) { - info.setState(mut, state.with(LeavesBlock.DISTANCE, d)); + info.setState(mut, state.setValue(LeavesBlock.DISTANCE, d)); } } } @@ -174,7 +172,7 @@ public class DragonTreeFeature extends DefaultFeature { random.nextGaussian() * 1); boolean place = true; for (Direction d : Direction.values()) { - BlockState state = world.getBlockState(p.offset(d)); + BlockState state = world.getBlockState(p.relative(d)); if (!EndBlocks.DRAGON_TREE.isTreeLog(state) && !state.is(EndBlocks.DRAGON_TREE_LEAVES)) { place = false; break; @@ -191,7 +189,7 @@ public class DragonTreeFeature extends DefaultFeature { static { REPLACE = (state) -> { - if (state.isIn(EndTags.END_GROUND)) { + if (state.is(EndTags.END_GROUND)) { return true; } if (state.getBlock() == EndBlocks.DRAGON_TREE_LEAVES) { diff --git a/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java b/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java index 24eb7553..af633bfd 100644 --- a/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java @@ -1,12 +1,9 @@ package ru.betterend.world.features.trees; +import com.mojang.math.Vector3f; import java.util.List; import java.util.Random; import java.util.function.Function; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; -import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -14,8 +11,10 @@ import net.minecraft.core.Direction.Axis; import net.minecraft.core.Direction.AxisDirection; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; import ru.betterend.blocks.basis.AttachedBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -34,7 +33,7 @@ public class GiganticAmaranitaFeature extends DefaultFeature { @Override public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) return false; float size = MHelper.randRange(5, 10, random); @@ -52,8 +51,7 @@ public class GiganticAmaranitaFeature extends DefaultFeature { }); Vector3f capPos = spline.get(spline.size() - 1); - makeHead(world, pos.offset(capPos.getX() + 0.5F, capPos.getY() + 1.5F, capPos.getZ() + 0.5F), - Mth.floor(size / 1.6F)); + makeHead(world, pos.offset(capPos.x() + 0.5F, capPos.y() + 1.5F, capPos.z() + 0.5F), Mth.floor(size / 1.6F)); function.setReplaceFunction(REPLACE); function.addPostProcess(POST); @@ -99,7 +97,7 @@ public class GiganticAmaranitaFeature extends DefaultFeature { mut.move(Direction.DOWN); if (world.getBlockState(mut).getMaterial().isReplaceable()) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_FUR.defaultBlockState() - .with(AttachedBlock.FACING, Direction.DOWN)); + .setValue(AttachedBlock.FACING, Direction.DOWN)); } } } @@ -159,18 +157,18 @@ public class GiganticAmaranitaFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_LANTERN); Axis axis = x < 0 || x > 1 ? Axis.X : Axis.Z; int distance = axis == Axis.X ? x < 0 ? -1 : 1 : z < 0 ? -1 : 1; - BlockPos offseted = mut.offset(axis, distance); + BlockPos offseted = mut.relative(axis, distance); if (world.getBlockState(offseted).getMaterial().isReplaceable()) { Direction dir = Direction.fromAxisAndDirection(axis, distance < 0 ? AxisDirection.NEGATIVE : AxisDirection.POSITIVE); - BlocksHelper.setWithoutUpdate(world, offseted, - EndBlocks.AMARANITA_FUR.defaultBlockState().with(AttachedBlock.FACING, dir)); + BlocksHelper.setWithoutUpdate(world, offseted, EndBlocks.AMARANITA_FUR + .defaultBlockState().setValue(AttachedBlock.FACING, dir)); } mut.move(Direction.DOWN); } if (world.getBlockState(mut).getMaterial().isReplaceable()) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_FUR.defaultBlockState() - .with(AttachedBlock.FACING, Direction.DOWN)); + .setValue(AttachedBlock.FACING, Direction.DOWN)); } } } @@ -273,18 +271,18 @@ public class GiganticAmaranitaFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_LANTERN); Axis axis = x < 0 || x > 1 ? Axis.X : Axis.Z; int distance = axis == Axis.X ? x < 0 ? -1 : 1 : z < 0 ? -1 : 1; - BlockPos offseted = mut.offset(axis, distance); + BlockPos offseted = mut.relative(axis, distance); if (world.getBlockState(offseted).getMaterial().isReplaceable()) { Direction dir = Direction.fromAxisAndDirection(axis, distance < 0 ? AxisDirection.NEGATIVE : AxisDirection.POSITIVE); - BlocksHelper.setWithoutUpdate(world, offseted, - EndBlocks.AMARANITA_FUR.defaultBlockState().with(AttachedBlock.FACING, dir)); + BlocksHelper.setWithoutUpdate(world, offseted, EndBlocks.AMARANITA_FUR + .defaultBlockState().setValue(AttachedBlock.FACING, dir)); } mut.move(Direction.DOWN); } if (world.getBlockState(mut).getMaterial().isReplaceable()) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_FUR.defaultBlockState() - .with(AttachedBlock.FACING, Direction.DOWN)); + .setValue(AttachedBlock.FACING, Direction.DOWN)); } } } @@ -329,7 +327,7 @@ public class GiganticAmaranitaFeature extends DefaultFeature { static { REPLACE = (state) -> { - if (state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT)) { + if (state.is(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT)) { return true; } return state.getMaterial().isReplaceable(); diff --git a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java index 5f43fa48..2b294fa0 100644 --- a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java @@ -1,19 +1,18 @@ package ru.betterend.world.features.trees; +import com.mojang.math.Vector3f; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.function.Function; - -import net.minecraft.world.level.block.state.BlockState; -import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; -import net.minecraft.world.phys.AABB; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.phys.AABB; import ru.betterend.blocks.HelixTreeLeavesBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -35,7 +34,7 @@ public class HelixTreeFeature extends DefaultFeature { @Override public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) return false; BlocksHelper.setWithoutUpdate(world, pos, AIR); @@ -55,7 +54,7 @@ public class HelixTreeFeature extends DefaultFeature { SDF sdf = SplineHelper.buildSDF(spline, 1.7F, 0.5F, (p) -> { return EndBlocks.HELIX_TREE.bark.defaultBlockState(); }); - SDF rotated = new SDFRotation().setRotation(Vector3f.POSITIVE_Y, (float) Math.PI).setSource(sdf); + SDF rotated = new SDFRotation().setRotation(Vector3f.YP, (float) Math.PI).setSource(sdf); sdf = new SDFUnion().setSourceA(rotated).setSourceB(sdf); Vector3f lastPoint = spline.get(spline.size() - 1); @@ -63,14 +62,14 @@ public class HelixTreeFeature extends DefaultFeature { SDF stem = SplineHelper.buildSDF(spline2, 1.0F, 0.5F, (p) -> { return EndBlocks.HELIX_TREE.bark.defaultBlockState(); }); - stem = new SDFTranslate().setTranslate(lastPoint.getX(), lastPoint.getY(), lastPoint.getZ()).setSource(stem); + stem = new SDFTranslate().setTranslate(lastPoint.x(), lastPoint.y(), lastPoint.z()).setSource(stem); sdf = new SDFSmoothUnion().setRadius(3).setSourceA(sdf).setSourceB(stem); sdf = new SDFScale().setScale(scale).setSource(sdf); dx = 30 * scale; float dy1 = -20 * scale; float dy2 = 100 * scale; - sdf.addPostProcess(POST).fillArea(world, pos, new Box(pos.offset(-dx, dy1, -dx), pos.offset(dx, dy2, dx))); + sdf.addPostProcess(POST).fillArea(world, pos, new AABB(pos.offset(-dx, dy1, -dx), pos.offset(dx, dy2, dx))); SplineHelper.scale(spline, scale); SplineHelper.fillSplineForce(spline, world, EndBlocks.HELIX_TREE.bark.defaultBlockState(), pos, (state) -> { return state.getMaterial().isReplaceable(); @@ -80,7 +79,7 @@ public class HelixTreeFeature extends DefaultFeature { return state.getMaterial().isReplaceable(); }); SplineHelper.scale(spline2, scale); - BlockPos leafStart = pos.offset(lastPoint.getX() + 0.5, lastPoint.getY() + 0.5, lastPoint.getZ() + 0.5); + BlockPos leafStart = pos.offset(lastPoint.x() + 0.5, lastPoint.y() + 0.5, lastPoint.z() + 0.5); SplineHelper.fillSplineForce(spline2, world, EndBlocks.HELIX_TREE.log.defaultBlockState(), leafStart, (state) -> { return state.getMaterial().isReplaceable(); @@ -107,38 +106,38 @@ public class HelixTreeFeature extends DefaultFeature { BlockState leaf = EndBlocks.HELIX_TREE_LEAVES.defaultBlockState(); for (int i = 1; i < spline.size(); i++) { Vector3f point = spline.get(i); - int minY = MHelper.floor(lastPoint.getY()); - int maxY = MHelper.floor(point.getY()); - float div = point.getY() - lastPoint.getY(); + int minY = MHelper.floor(lastPoint.y()); + int maxY = MHelper.floor(point.y()); + float div = point.y() - lastPoint.y(); for (float py = minY; py <= maxY; py += 0.2F) { start.set(0, py, 0); float delta = (float) (py - minY) / div; - float px = Mth.lerp(delta, lastPoint.getX(), point.getX()); - float pz = Mth.lerp(delta, lastPoint.getZ(), point.getZ()); + float px = Mth.lerp(delta, lastPoint.x(), point.x()); + float pz = Mth.lerp(delta, lastPoint.z(), point.z()); end.set(px, py, pz); fillLine(start, end, world, leaf, leafStart, i / 2 - 1); float ax = Math.abs(px); float az = Math.abs(pz); if (ax > az) { - start.set(start.getX(), start.getY(), start.getZ() + az > 0 ? 1 : -1); - end.set(end.getX(), end.getY(), end.getZ() + az > 0 ? 1 : -1); + start.set(start.x(), start.y(), start.z() + az > 0 ? 1 : -1); + end.set(end.x(), end.y(), end.z() + az > 0 ? 1 : -1); } else { - start.set(start.getX() + ax > 0 ? 1 : -1, start.getY(), start.getZ()); - end.set(end.getX() + ax > 0 ? 1 : -1, end.getY(), end.getZ()); + start.set(start.x() + ax > 0 ? 1 : -1, start.y(), start.z()); + end.set(end.x() + ax > 0 ? 1 : -1, end.y(), end.z()); } fillLine(start, end, world, leaf, leafStart, i / 2 - 1); } lastPoint = point; } - leaf = leaf.with(HelixTreeLeavesBlock.COLOR, 7); - leafStart = leafStart.add(0, lastPoint.getY(), 0); + leaf = leaf.setValue(HelixTreeLeavesBlock.COLOR, 7); + leafStart = leafStart.offset(0, lastPoint.y(), 0); if (world.getBlockState(leafStart).isAir()) { BlocksHelper.setWithoutUpdate(world, leafStart, leaf); - leafStart = leafStart.up(); + leafStart = leafStart.above(); if (world.getBlockState(leafStart).isAir()) { BlocksHelper.setWithoutUpdate(world, leafStart, leaf); - leafStart = leafStart.up(); + leafStart = leafStart.above(); if (world.getBlockState(leafStart).isAir()) { BlocksHelper.setWithoutUpdate(world, leafStart, leaf); } @@ -150,17 +149,17 @@ public class HelixTreeFeature extends DefaultFeature { private void fillLine(Vector3f start, Vector3f end, WorldGenLevel world, BlockState state, BlockPos pos, int offset) { - float dx = end.getX() - start.getX(); - float dy = end.getY() - start.getY(); - float dz = end.getZ() - start.getZ(); + float dx = end.x() - start.x(); + float dy = end.y() - start.y(); + float dz = end.z() - start.z(); float max = MHelper.max(Math.abs(dx), Math.abs(dy), Math.abs(dz)); int count = MHelper.floor(max + 1); dx /= max; dy /= max; dz /= max; - float x = start.getX(); - float y = start.getY(); - float z = start.getZ(); + float x = start.x(); + float y = start.y(); + float z = start.z(); MutableBlockPos bPos = new MutableBlockPos(); for (int i = 0; i < count; i++) { @@ -168,15 +167,15 @@ public class HelixTreeFeature extends DefaultFeature { int color = MHelper.floor((float) i / (float) count * 7F + 0.5F) + offset; color = Mth.clamp(color, 0, 7); if (world.getBlockState(bPos).getMaterial().isReplaceable()) { - BlocksHelper.setWithoutUpdate(world, bPos, state.with(HelixTreeLeavesBlock.COLOR, color)); + BlocksHelper.setWithoutUpdate(world, bPos, state.setValue(HelixTreeLeavesBlock.COLOR, color)); } x += dx; y += dy; z += dz; } - bPos.set(end.getX() + pos.getX(), end.getY() + pos.getY(), end.getZ() + pos.getZ()); + bPos.set(end.x() + pos.getX(), end.y() + pos.getY(), end.z() + pos.getZ()); if (world.getBlockState(bPos).getMaterial().isReplaceable()) { - BlocksHelper.setWithoutUpdate(world, bPos, state.with(HelixTreeLeavesBlock.COLOR, 7)); + BlocksHelper.setWithoutUpdate(world, bPos, state.setValue(HelixTreeLeavesBlock.COLOR, 7)); } } diff --git a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java index 94bedc0d..d553bc59 100644 --- a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java @@ -3,17 +3,15 @@ package ru.betterend.world.features.trees; import java.util.List; import java.util.Random; import java.util.function.Function; - -import com.google.common.collect.Lists; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; -import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; +import com.google.common.collect.Lists; +import com.mojang.math.Vector3f; import ru.betterend.blocks.JellyshroomCapBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -35,7 +33,7 @@ public class JellyshroomFeature extends DefaultFeature { @Override public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) return false; BlockState bark = EndBlocks.JELLYSHROOM.bark.defaultBlockState(); @@ -56,7 +54,7 @@ public class JellyshroomFeature extends DefaultFeature { final float membraneRadius = radius; SDF cap = makeCap(membraneRadius, random, membrane); final Vector3f last = spline.get(spline.size() - 1); - cap = new SDFTranslate().setTranslate(last.getX(), last.getY(), last.getZ()).setSource(cap); + cap = new SDFTranslate().setTranslate(last.x(), last.y(), last.z()).setSource(cap); sdf = new SDFSmoothUnion().setRadius(3F).setSourceA(sdf).setSourceB(cap); sdf.setReplaceFunction(REPLACE).addPostProcess((info) -> { if (EndBlocks.JELLYSHROOM.isTreeLog(info.getState())) { @@ -65,11 +63,11 @@ public class JellyshroomFeature extends DefaultFeature { return EndBlocks.JELLYSHROOM.log.defaultBlockState(); } } else if (info.getState().is(EndBlocks.JELLYSHROOM_CAP_PURPLE)) { - float dx = info.getPos().getX() - pos.getX() - last.getX(); - float dz = info.getPos().getZ() - pos.getZ() - last.getZ(); + float dx = info.getPos().getX() - pos.getX() - last.x(); + float dz = info.getPos().getZ() - pos.getZ() - last.z(); float distance = MHelper.length(dx, dz) / membraneRadius * 7F; int color = Mth.clamp(MHelper.floor(distance), 0, 7); - return info.getState().with(JellyshroomCapBlock.COLOR, color); + return info.getState().setValue(JellyshroomCapBlock.COLOR, color); } return info.getState(); }).fillRecursive(world, pos); @@ -89,7 +87,7 @@ public class JellyshroomFeature extends DefaultFeature { SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); Vector3f last = branch.get(branch.size() - 1); - if (world.getBlockState(pos.offset(last.getX(), last.getY(), last.getZ())).isIn(EndTags.GEN_TERRAIN)) { + if (world.getBlockState(pos.offset(last.x(), last.y(), last.z())).is(EndTags.GEN_TERRAIN)) { SplineHelper.fillSpline(branch, world, wood, pos, REPLACE); } } @@ -118,7 +116,7 @@ public class JellyshroomFeature extends DefaultFeature { SplineHelper.offset(ROOT, new Vector3f(0, -0.45F, 0)); REPLACE = (state) -> { - if (state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT)) { + if (state.is(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT)) { return true; } return state.getMaterial().isReplaceable(); diff --git a/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java b/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java index d71d222e..2c235cd0 100644 --- a/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java @@ -1,19 +1,18 @@ package ru.betterend.world.features.trees; +import com.mojang.math.Vector3f; import java.util.List; import java.util.Random; import java.util.function.Function; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.LeavesBlock; -import net.minecraft.world.level.material.Material; -import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -36,7 +35,7 @@ public class LacugroveFeature extends DefaultFeature { @Override public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).isIn(EndTags.END_GROUND)) + if (!world.getBlockState(pos.below()).is(EndTags.END_GROUND)) return false; float size = MHelper.randRange(15, 25, random); @@ -52,7 +51,7 @@ public class LacugroveFeature extends DefaultFeature { float radius = MHelper.randRange(6F, 8F, random); radius *= (size - 15F) / 20F + 1F; Vector3f center = spline.get(4); - leavesBall(world, pos.offset(center.getX(), center.getY(), center.getZ()), radius, random, noise); + leavesBall(world, pos.offset(center.x(), center.y(), center.z()), radius, random, noise); radius = MHelper.randRange(1.2F, 1.8F, random); SDF function = SplineHelper.buildSDF(spline, radius, 0.7F, (bpos) -> { @@ -81,7 +80,7 @@ public class LacugroveFeature extends DefaultFeature { boolean generate = false; for (int y = minY; y < maxY; y++) { mut.setY(y); - if (world.getBlockState(mut).isIn(EndTags.END_GROUND)) { + if (world.getBlockState(mut).is(EndTags.END_GROUND)) { generate = true; break; } @@ -92,7 +91,7 @@ public class LacugroveFeature extends DefaultFeature { mut.setY(y); BlockState state = world.getBlockState(mut); if (state.getMaterial().isReplaceable() || state.getMaterial().equals(Material.PLANT) - || state.isIn(EndTags.END_GROUND)) { + || state.is(EndTags.END_GROUND)) { BlocksHelper.setWithoutUpdate(world, mut, y == top ? EndBlocks.LACUGROVE.bark : EndBlocks.LACUGROVE.log); } else { @@ -109,7 +108,7 @@ public class LacugroveFeature extends DefaultFeature { private void leavesBall(WorldGenLevel world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) { SDF sphere = new SDFSphere().setRadius(radius) - .setBlock(EndBlocks.LACUGROVE_LEAVES.defaultBlockState().with(LeavesBlock.DISTANCE, 6)); + .setBlock(EndBlocks.LACUGROVE_LEAVES.defaultBlockState().setValue(LeavesBlock.DISTANCE, 6)); sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.x() * 0.2, vec.y() * 0.2, vec.z() * 0.2) * 3; }).setSource(sphere); @@ -143,7 +142,7 @@ public class LacugroveFeature extends DefaultFeature { if (state.getBlock() instanceof LeavesBlock) { int distance = state.getValue(LeavesBlock.DISTANCE); if (d < distance) { - info.setState(mut, state.with(LeavesBlock.DISTANCE, d)); + info.setState(mut, state.setValue(LeavesBlock.DISTANCE, d)); } } } @@ -162,7 +161,7 @@ public class LacugroveFeature extends DefaultFeature { random.nextGaussian() * 1); boolean place = true; for (Direction d : Direction.values()) { - BlockState state = world.getBlockState(p.offset(d)); + BlockState state = world.getBlockState(p.relative(d)); if (!EndBlocks.LACUGROVE.isTreeLog(state) && !state.is(EndBlocks.LACUGROVE_LEAVES)) { place = false; break; @@ -179,7 +178,7 @@ public class LacugroveFeature extends DefaultFeature { static { REPLACE = (state) -> { - if (state.isIn(EndTags.END_GROUND)) { + if (state.is(EndTags.END_GROUND)) { return true; } if (EndBlocks.LACUGROVE.isTreeLog(state)) { diff --git a/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java b/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java index cbf386bb..4ad56fb5 100644 --- a/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java @@ -3,19 +3,17 @@ package ru.betterend.world.features.trees; import java.util.List; import java.util.Random; import java.util.function.Function; - -import com.google.common.collect.Lists; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.LeavesBlock; -import net.minecraft.world.level.material.Material; -import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; +import com.google.common.collect.Lists; +import com.mojang.math.Vector3f; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.FurBlock; @@ -44,7 +42,7 @@ public class LucerniaFeature extends DefaultFeature { @Override public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) return false; float size = MHelper.randRange(12, 20, random); @@ -61,8 +59,7 @@ public class LucerniaFeature extends DefaultFeature { Vector3f last = spline.get(spline.size() - 1); float leavesRadius = (size * 0.13F + MHelper.randRange(0.8F, 1.5F, random)) * 1.4F; OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); - leavesBall(world, pos.offset(last.getX(), last.getY(), last.getZ()), leavesRadius, random, noise, - config != null); + leavesBall(world, pos.offset(last.x(), last.y(), last.z()), leavesRadius, random, noise, config != null); } makeRoots(world, pos.offset(0, MHelper.randRange(3, 5, random), 0), size * 0.35F, random); @@ -73,7 +70,7 @@ public class LucerniaFeature extends DefaultFeature { private void leavesBall(WorldGenLevel world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise, boolean natural) { SDF sphere = new SDFSphere().setRadius(radius) - .setBlock(EndBlocks.LUCERNIA_LEAVES.defaultBlockState().with(LeavesBlock.DISTANCE, 6)); + .setBlock(EndBlocks.LUCERNIA_LEAVES.defaultBlockState().setValue(LeavesBlock.DISTANCE, 6)); SDF sub = new SDFScale().setScale(5).setSource(sphere); sub = new SDFTranslate().setTranslate(0, -radius * 5, 0).setSource(sub); sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sub); @@ -95,10 +92,10 @@ public class LucerniaFeature extends DefaultFeature { } } - BlockState top = EndBlocks.FILALUX.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP); - BlockState middle = EndBlocks.FILALUX.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, + BlockState top = EndBlocks.FILALUX.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP); + BlockState middle = EndBlocks.FILALUX.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE); - BlockState bottom = EndBlocks.FILALUX.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, + BlockState bottom = EndBlocks.FILALUX.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM); BlockState outer = EndBlocks.LUCERNIA_OUTER_LEAVES.defaultBlockState(); @@ -121,7 +118,7 @@ public class LucerniaFeature extends DefaultFeature { MHelper.shuffle(DIRECTIONS, random); for (Direction d : DIRECTIONS) { if (info.getState(d).isAir()) { - info.setBlockPos(info.getPos().offset(d), outer.with(FurBlock.FACING, d)); + info.setBlockPos(info.getPos().relative(d), outer.setValue(FurBlock.FACING, d)); } } @@ -141,7 +138,7 @@ public class LucerniaFeature extends DefaultFeature { if (state.getBlock() instanceof LeavesBlock) { int distance = state.getValue(LeavesBlock.DISTANCE); if (d < distance) { - info.setState(mut, state.with(LeavesBlock.DISTANCE, d)); + info.setState(mut, state.setValue(LeavesBlock.DISTANCE, d)); } } } @@ -159,11 +156,11 @@ public class LucerniaFeature extends DefaultFeature { if (state.isAir() || state.is(EndBlocks.LUCERNIA_OUTER_LEAVES)) { int count = MHelper.randRange(3, 8, random); mut.set(bpos); - if (world.getBlockState(mut.up()).is(EndBlocks.LUCERNIA_LEAVES)) { + if (world.getBlockState(mut.above()).is(EndBlocks.LUCERNIA_LEAVES)) { BlocksHelper.setWithoutUpdate(world, mut, top); for (int i = 1; i < count; i++) { mut.setY(mut.getY() - 1); - if (world.isAir(mut.below())) { + if (world.isEmptyBlock(mut.below())) { BlocksHelper.setWithoutUpdate(world, mut, middle); } else { break; @@ -185,7 +182,7 @@ public class LucerniaFeature extends DefaultFeature { SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); Vector3f last = branch.get(branch.size() - 1); - if (world.getBlockState(pos.offset(last.getX(), last.getY(), last.getZ())).isIn(EndTags.GEN_TERRAIN)) { + if (world.getBlockState(pos.offset(last.x(), last.y(), last.z())).is(EndTags.GEN_TERRAIN)) { SplineHelper.fillSplineForce(branch, world, EndBlocks.LUCERNIA.bark.defaultBlockState(), pos, REPLACE); } } @@ -193,7 +190,7 @@ public class LucerniaFeature extends DefaultFeature { static { REPLACE = (state) -> { - if (state.isIn(EndTags.END_GROUND)) { + if (state.is(EndTags.END_GROUND)) { return true; } if (state.getBlock() == EndBlocks.LUCERNIA_LEAVES) { diff --git a/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java index 453ed3e9..d51eaac2 100644 --- a/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java @@ -1,17 +1,16 @@ package ru.betterend.world.features.trees; +import com.mojang.math.Vector3f; import java.util.List; import java.util.Random; import java.util.function.Function; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; -import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; import ru.betterend.blocks.MossyGlowshroomCapBlock; import ru.betterend.blocks.basis.FurBlock; import ru.betterend.noise.OpenSimplexNoise; @@ -75,7 +74,7 @@ public class MossyGlowshroomFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, blockPos, AIR); CENTER.set(blockPos.getX(), 0, blockPos.getZ()); - HEAD_POS.setTranslate(pos.getX(), pos.getY(), pos.getZ()); + HEAD_POS.setTranslate(pos.x(), pos.y(), pos.z()); ROOTS_ROT.setAngle(random.nextFloat() * MHelper.PI2); FUNCTION.setSourceA(sdf); @@ -83,7 +82,7 @@ public class MossyGlowshroomFeature extends DefaultFeature { if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getState())) { if (random.nextBoolean() && info.getStateUp().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState() - .with(MossyGlowshroomCapBlock.TRANSITION, true)); + .setValue(MossyGlowshroomCapBlock.TRANSITION, true)); return info.getState(); } else if (!EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateUp()) || !EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateDown())) { @@ -93,7 +92,7 @@ public class MossyGlowshroomFeature extends DefaultFeature { } else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateDown().getBlock())) { info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState() - .with(MossyGlowshroomCapBlock.TRANSITION, true)); + .setValue(MossyGlowshroomCapBlock.TRANSITION, true)); return info.getState(); } @@ -102,14 +101,14 @@ public class MossyGlowshroomFeature extends DefaultFeature { } else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { for (Direction dir : BlocksHelper.HORIZONTAL) { if (info.getState(dir) == AIR) { - info.setBlockPos(info.getPos().offset(dir), - EndBlocks.MOSSY_GLOWSHROOM_FUR.defaultBlockState().with(FurBlock.FACING, dir)); + info.setBlockPos(info.getPos().relative(dir), + EndBlocks.MOSSY_GLOWSHROOM_FUR.defaultBlockState().setValue(FurBlock.FACING, dir)); } } if (info.getStateDown().getBlock() != EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { - info.setBlockPos(info.getPos().below(), - EndBlocks.MOSSY_GLOWSHROOM_FUR.defaultBlockState().with(FurBlock.FACING, Direction.DOWN)); + info.setBlockPos(info.getPos().below(), EndBlocks.MOSSY_GLOWSHROOM_FUR.defaultBlockState() + .setValue(FurBlock.FACING, Direction.DOWN)); } } return info.getState(); @@ -144,12 +143,10 @@ public class MossyGlowshroomFeature extends DefaultFeature { OpenSimplexNoise noise = new OpenSimplexNoise(1234); cones = new SDFCoordModify().setFunction((pos) -> { - float dist = MHelper.length(pos.getX(), pos.getZ()); - float y = pos.getY() - + (float) noise.eval(pos.getX() * 0.1 + CENTER.getX(), pos.getZ() * 0.1 + CENTER.getZ()) * dist - * 0.3F + float dist = MHelper.length(pos.x(), pos.z()); + float y = pos.y() + (float) noise.eval(pos.x() * 0.1 + CENTER.x(), pos.z() * 0.1 + CENTER.z()) * dist * 0.3F - dist * 0.15F; - pos.set(pos.getX(), y, pos.getZ()); + pos.set(pos.x(), y, pos.z()); }).setSource(cones); HEAD_POS = (SDFTranslate) new SDFTranslate() @@ -164,7 +161,7 @@ public class MossyGlowshroomFeature extends DefaultFeature { .setSourceB(new SDFUnion().setSourceA(HEAD_POS).setSourceB(ROOTS_ROT)); REPLACE = (state) -> { - if (state.isIn(EndTags.END_GROUND)) { + if (state.is(EndTags.END_GROUND)) { return true; } if (state.getMaterial().equals(Material.PLANT)) { diff --git a/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java index ac727c80..17254bee 100644 --- a/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java @@ -1,19 +1,18 @@ package ru.betterend.world.features.trees; +import com.mojang.math.Vector3f; import java.util.List; import java.util.Random; import java.util.function.Function; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.LeavesBlock; -import net.minecraft.world.level.material.Material; -import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; @@ -48,8 +47,8 @@ public class PythadendronTreeFeature extends DefaultFeature { int depth = MHelper.floor((size - 10F) * 3F / 10F + 1F); float bsize = (10F - (size - 10F)) / 10F + 1.5F; - branch(last.getX(), last.getY(), last.getZ(), size * bsize, MHelper.randRange(0, MHelper.PI2, random), random, - depth, world, pos); + branch(last.x(), last.y(), last.z(), size * bsize, MHelper.randRange(0, MHelper.PI2, random), random, depth, + world, pos); SDF function = SplineHelper.buildSDF(spline, 1.7F, 1.1F, (bpos) -> { return EndBlocks.PYTHADENDRON.bark.defaultBlockState(); @@ -93,10 +92,10 @@ public class PythadendronTreeFeature extends DefaultFeature { OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt()); if (depth < 3) { if (s1) { - leavesBall(world, pos.offset(pos1.getX(), pos1.getY(), pos1.getZ()), random, noise); + leavesBall(world, pos.offset(pos1.x(), pos1.y(), pos1.z()), random, noise); } if (s2) { - leavesBall(world, pos.offset(pos2.getX(), pos2.getY(), pos2.getZ()), random, noise); + leavesBall(world, pos.offset(pos2.x(), pos2.y(), pos2.z()), random, noise); } } @@ -106,10 +105,10 @@ public class PythadendronTreeFeature extends DefaultFeature { float angle2 = angle + (float) Math.PI * 0.5F + MHelper.randRange(-0.1F, 0.1F, random); if (s1) { - branch(pos1.getX(), pos1.getY(), pos1.getZ(), size1, angle1, random, depth - 1, world, pos); + branch(pos1.x(), pos1.y(), pos1.z(), size1, angle1, random, depth - 1, world, pos); } if (s2) { - branch(pos2.getX(), pos2.getY(), pos2.getZ(), size2, angle2, random, depth - 1, world, pos); + branch(pos2.x(), pos2.y(), pos2.z(), size2, angle2, random, depth - 1, world, pos); } } @@ -117,7 +116,7 @@ public class PythadendronTreeFeature extends DefaultFeature { float radius = MHelper.randRange(4.5F, 6.5F, random); SDF sphere = new SDFSphere().setRadius(radius) - .setBlock(EndBlocks.PYTHADENDRON_LEAVES.defaultBlockState().with(LeavesBlock.DISTANCE, 6)); + .setBlock(EndBlocks.PYTHADENDRON_LEAVES.defaultBlockState().setValue(LeavesBlock.DISTANCE, 6)); sphere = new SDFScale3D().setScale(1, 0.6F, 1).setSource(sphere); sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.x() * 0.2, vec.y() * 0.2, vec.z() * 0.2) * 3; @@ -152,7 +151,7 @@ public class PythadendronTreeFeature extends DefaultFeature { if (state.getBlock() instanceof LeavesBlock) { int distance = state.getValue(LeavesBlock.DISTANCE); if (d < distance) { - info.setState(mut, state.with(LeavesBlock.DISTANCE, d)); + info.setState(mut, state.setValue(LeavesBlock.DISTANCE, d)); } } } @@ -167,7 +166,7 @@ public class PythadendronTreeFeature extends DefaultFeature { static { REPLACE = (state) -> { - if (state.isIn(EndTags.END_GROUND)) { + if (state.is(EndTags.END_GROUND)) { return true; } if (state.getBlock() == EndBlocks.PYTHADENDRON_LEAVES) { diff --git a/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java b/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java index 627989c6..6a9164a2 100644 --- a/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java @@ -3,19 +3,17 @@ package ru.betterend.world.features.trees; import java.util.List; import java.util.Random; import java.util.function.Function; - -import com.google.common.collect.Lists; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.LeavesBlock; -import net.minecraft.world.level.material.Material; -import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; +import com.google.common.collect.Lists; +import com.mojang.math.Vector3f; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.FurBlock; @@ -43,7 +41,7 @@ public class TenaneaFeature extends DefaultFeature { @Override public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) return false; float size = MHelper.randRange(7, 10, random); @@ -60,7 +58,7 @@ public class TenaneaFeature extends DefaultFeature { Vector3f last = spline.get(spline.size() - 1); float leavesRadius = (size * 0.3F + MHelper.randRange(0.8F, 1.5F, random)) * 1.4F; OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); - leavesBall(world, pos.offset(last.getX(), last.getY(), last.getZ()), leavesRadius, random, noise); + leavesBall(world, pos.offset(last.x(), last.y(), last.z()), leavesRadius, random, noise); } return true; @@ -68,7 +66,7 @@ public class TenaneaFeature extends DefaultFeature { private void leavesBall(WorldGenLevel world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) { SDF sphere = new SDFSphere().setRadius(radius) - .setBlock(EndBlocks.TENANEA_LEAVES.defaultBlockState().with(LeavesBlock.DISTANCE, 6)); + .setBlock(EndBlocks.TENANEA_LEAVES.defaultBlockState().setValue(LeavesBlock.DISTANCE, 6)); SDF sub = new SDFScale().setScale(5).setSource(sphere); sub = new SDFTranslate().setTranslate(0, -radius * 5, 0).setSource(sub); sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sub); @@ -90,11 +88,11 @@ public class TenaneaFeature extends DefaultFeature { } } - BlockState top = EndBlocks.TENANEA_FLOWERS.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, + BlockState top = EndBlocks.TENANEA_FLOWERS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP); - BlockState middle = EndBlocks.TENANEA_FLOWERS.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, + BlockState middle = EndBlocks.TENANEA_FLOWERS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE); - BlockState bottom = EndBlocks.TENANEA_FLOWERS.defaultBlockState().with(BlockProperties.TRIPLE_SHAPE, + BlockState bottom = EndBlocks.TENANEA_FLOWERS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM); BlockState outer = EndBlocks.TENANEA_OUTER_LEAVES.defaultBlockState(); @@ -117,7 +115,7 @@ public class TenaneaFeature extends DefaultFeature { MHelper.shuffle(DIRECTIONS, random); for (Direction d : DIRECTIONS) { if (info.getState(d).isAir()) { - info.setBlockPos(info.getPos().offset(d), outer.with(FurBlock.FACING, d)); + info.setBlockPos(info.getPos().relative(d), outer.setValue(FurBlock.FACING, d)); } } @@ -137,7 +135,7 @@ public class TenaneaFeature extends DefaultFeature { if (state.getBlock() instanceof LeavesBlock) { int distance = state.getValue(LeavesBlock.DISTANCE); if (d < distance) { - info.setState(mut, state.with(LeavesBlock.DISTANCE, d)); + info.setState(mut, state.setValue(LeavesBlock.DISTANCE, d)); } } } @@ -155,11 +153,11 @@ public class TenaneaFeature extends DefaultFeature { if (state.isAir() || state.is(EndBlocks.TENANEA_OUTER_LEAVES)) { int count = MHelper.randRange(3, 8, random); mut.set(bpos); - if (world.getBlockState(mut.up()).is(EndBlocks.TENANEA_LEAVES)) { + if (world.getBlockState(mut.above()).is(EndBlocks.TENANEA_LEAVES)) { BlocksHelper.setWithoutUpdate(world, mut, top); for (int i = 1; i < count; i++) { mut.setY(mut.getY() - 1); - if (world.isAir(mut.below())) { + if (world.isEmptyBlock(mut.below())) { BlocksHelper.setWithoutUpdate(world, mut, middle); } else { break; @@ -173,7 +171,7 @@ public class TenaneaFeature extends DefaultFeature { static { REPLACE = (state) -> { - if (state.isIn(EndTags.END_GROUND)) { + if (state.is(EndTags.END_GROUND)) { return true; } if (state.getBlock() == EndBlocks.TENANEA_LEAVES) { diff --git a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java index dc7ba0e8..b2ab2b2a 100644 --- a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java @@ -3,19 +3,17 @@ package ru.betterend.world.features.trees; import java.util.List; import java.util.Random; import java.util.function.Function; - -import com.google.common.collect.Lists; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; -import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; 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.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Material; +import com.google.common.collect.Lists; +import com.mojang.math.Vector3f; import ru.betterend.blocks.UmbrellaTreeClusterBlock; import ru.betterend.blocks.UmbrellaTreeMembraneBlock; import ru.betterend.registry.EndBlocks; @@ -42,16 +40,16 @@ public class UmbrellaTreeFeature extends DefaultFeature { @Override public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().isIn(EndTags.END_GROUND)) + if (!world.getBlockState(pos.below()).getBlock().is(EndTags.END_GROUND)) return false; BlockState wood = EndBlocks.UMBRELLA_TREE.bark.defaultBlockState(); - BlockState membrane = EndBlocks.UMBRELLA_TREE_MEMBRANE.defaultBlockState().with(UmbrellaTreeMembraneBlock.COLOR, - 1); - BlockState center = EndBlocks.UMBRELLA_TREE_MEMBRANE.defaultBlockState().with(UmbrellaTreeMembraneBlock.COLOR, - 0); - BlockState fruit = EndBlocks.UMBRELLA_TREE_CLUSTER.defaultBlockState().with(UmbrellaTreeClusterBlock.NATURAL, - true); + BlockState membrane = EndBlocks.UMBRELLA_TREE_MEMBRANE.defaultBlockState() + .setValue(UmbrellaTreeMembraneBlock.COLOR, 1); + BlockState center = EndBlocks.UMBRELLA_TREE_MEMBRANE.defaultBlockState() + .setValue(UmbrellaTreeMembraneBlock.COLOR, 0); + BlockState fruit = EndBlocks.UMBRELLA_TREE_CLUSTER.defaultBlockState() + .setValue(UmbrellaTreeClusterBlock.NATURAL, true); float size = MHelper.randRange(10, 20, random); int count = (int) (size * 0.15F); @@ -123,7 +121,7 @@ public class UmbrellaTreeFeature extends DefaultFeature { } int color = MHelper.floor(d / min.radius * 7); color = Mth.clamp(color, 1, 7); - return info.getState().with(UmbrellaTreeMembraneBlock.COLOR, color); + return info.getState().setValue(UmbrellaTreeMembraneBlock.COLOR, color); } return info.getState(); }).fillRecursive(world, pos); @@ -156,7 +154,7 @@ public class UmbrellaTreeFeature extends DefaultFeature { SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); Vector3f last = branch.get(branch.size() - 1); - if (world.getBlockState(pos.offset(last.getX(), last.getY(), last.getZ())).isIn(EndTags.GEN_TERRAIN)) { + if (world.getBlockState(pos.offset(last.x(), last.y(), last.z())).is(EndTags.GEN_TERRAIN)) { SplineHelper.fillSplineForce(branch, world, wood, pos, REPLACE); } } @@ -186,8 +184,8 @@ public class UmbrellaTreeFeature extends DefaultFeature { MutableBlockPos mut = new MutableBlockPos().set(px, py, pz); for (int i = 0; i < 8; i++) { mut.move(Direction.DOWN); - if (world.isAir(mut)) { - BlockState state = world.getBlockState(mut.up()); + if (world.isEmptyBlock(mut)) { + BlockState state = world.getBlockState(mut.above()); if (state.is(EndBlocks.UMBRELLA_TREE_MEMBRANE) && state.getValue(UmbrellaTreeMembraneBlock.COLOR) < 2) { BlocksHelper.setWithoutUpdate(world, mut, fruit); } @@ -206,7 +204,7 @@ public class UmbrellaTreeFeature extends DefaultFeature { SplineHelper.offset(ROOT, new Vector3f(0, -0.45F, 0)); REPLACE = (state) -> { - if (state.isIn(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) + if (state.is(EndTags.END_GROUND) || state.getMaterial().equals(Material.PLANT) || state.is(EndBlocks.UMBRELLA_TREE_MEMBRANE)) { return true; } diff --git a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java index ef6ce5a8..e5bd64d9 100644 --- a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java +++ b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java @@ -1,19 +1,17 @@ package ru.betterend.world.generator; import java.util.List; - +import net.minecraft.core.Registry; +import net.minecraft.resources.RegistryLookupCodec; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.biome.Biomes; +import net.minecraft.world.level.biome.TheEndBiomeSource; +import net.minecraft.world.level.levelgen.WorldgenRandom; +import net.minecraft.world.level.levelgen.synth.SimplexNoise; import com.google.common.collect.Lists; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; - -import net.minecraft.util.math.noise.SimplexNoiseSampler; -import net.minecraft.core.Registry; -import net.minecraft.util.registry.RegistryLookupCodec; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.Biomes; -import net.minecraft.world.biome.source.BiomeSource; -import net.minecraft.world.biome.source.TheEndBiomeSource; -import net.minecraft.world.gen.ChunkRandom; import ru.betterend.BetterEnd; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; @@ -23,7 +21,7 @@ import ru.betterend.world.biome.EndBiome; public class BetterEndBiomeSource extends BiomeSource { public static final Codec CODEC = RecordCodecBuilder.create((instance) -> { - return instance.group(RegistryLookupCodec.of(Registry.BIOME_KEY).forGetter((theEndBiomeSource) -> { + return instance.group(RegistryLookupCodec.create(Registry.BIOME_REGISTRY).forGetter((theEndBiomeSource) -> { return theEndBiomeSource.biomeRegistry; }), Codec.LONG.fieldOf("seed").stable().forGetter((theEndBiomeSource) -> { return theEndBiomeSource.seed; @@ -31,7 +29,7 @@ public class BetterEndBiomeSource extends BiomeSource { }); private static final OpenSimplexNoise SMALL_NOISE = new OpenSimplexNoise(8324); private final Registry biomeRegistry; - private final SimplexNoiseSampler noise; + private final SimplexNoise noise; private final Biome centerBiome; private final Biome barrens; private BiomeMap mapLand; @@ -40,27 +38,27 @@ public class BetterEndBiomeSource extends BiomeSource { public BetterEndBiomeSource(Registry biomeRegistry, long seed) { super(getBiomes(biomeRegistry)); - + this.mapLand = new BiomeMap(seed, GeneratorOptions.getBiomeSizeLand(), EndBiomes.LAND_BIOMES); this.mapVoid = new BiomeMap(seed, GeneratorOptions.getBiomeSizeVoid(), EndBiomes.VOID_BIOMES); this.centerBiome = biomeRegistry.getOrThrow(Biomes.THE_END); this.barrens = biomeRegistry.getOrThrow(Biomes.END_BARRENS); this.biomeRegistry = biomeRegistry; this.seed = seed; - - ChunkRandom chunkRandom = new ChunkRandom(seed); - chunkRandom.consume(17292); - this.noise = new SimplexNoiseSampler(chunkRandom); + + WorldgenRandom chunkRandom = new WorldgenRandom(seed); + chunkRandom.consumeCount(17292); + this.noise = new SimplexNoise(chunkRandom); EndBiomes.mutateRegistry(biomeRegistry); EndTags.addTerrainTags(biomeRegistry); FeaturesHelper.addFeatures(biomeRegistry); } - + private static List getBiomes(Registry biomeRegistry) { List list = Lists.newArrayList(); biomeRegistry.forEach((biome) -> { - if (EndBiomes.hasBiome(biomeRegistry.getId(biome))) { + if (EndBiomes.hasBiome(biomeRegistry.getKey(biome))) { list.add(biome); } }); @@ -68,58 +66,58 @@ public class BetterEndBiomeSource extends BiomeSource { } @Override - public Biome getBiomeForNoiseGen(int biomeX, int biomeY, int biomeZ) { + public Biome getNoiseBiome(int biomeX, int biomeY, int biomeZ) { boolean hasVoid = !GeneratorOptions.useNewGenerator() || !GeneratorOptions.noRingVoid(); long i = (long) biomeX * (long) biomeX; long j = (long) biomeZ * (long) biomeZ; - + long dist = i + j; if (hasVoid) { - if (dist <= 65536L) - return this.centerBiome; - } else if (dist <= 625L) { - dist += noise.sample(i * 0.2, j * 0.2) * 10; + if (dist <= 65536L) return this.centerBiome; + } + else if (dist <= 625L) { + dist += noise.getValue(i * 0.2, j * 0.2) * 10; if (dist <= 625L) { return this.centerBiome; } } - + if (biomeX == 0 && biomeZ == 0) { mapLand.clearCache(); mapVoid.clearCache(); } - + if (GeneratorOptions.useNewGenerator()) { if (TerrainGenerator.isLand(biomeX, biomeZ)) { return mapLand.getBiome(biomeX << 2, biomeZ << 2).getActualBiome(); - } else { + } + else { return mapVoid.getBiome(biomeX << 2, biomeZ << 2).getActualBiome(); } - } else { - float height = TheEndBiomeSource.getNoiseAt(noise, (biomeX >> 1) + 1, (biomeZ >> 1) + 1) - + (float) SMALL_NOISE.eval(biomeX, biomeZ) * 5; - + } + else { + float height = TheEndBiomeSource.getHeightValue(noise, (biomeX >> 1) + 1, (biomeZ >> 1) + 1) + (float) SMALL_NOISE.eval(biomeX, biomeZ) * 5; + if (height > -20F && height < -5F) { return barrens; } - - EndBiome endBiome = height < -10F ? mapVoid.getBiome(biomeX << 2, biomeZ << 2) - : mapLand.getBiome(biomeX << 2, biomeZ << 2); + + EndBiome endBiome = height < -10F ? mapVoid.getBiome(biomeX << 2, biomeZ << 2) : mapLand.getBiome(biomeX << 2, biomeZ << 2); return endBiome.getActualBiome(); } } - + public Biome getLandBiome(int biomeX, int biomeY, int biomeZ) { boolean hasVoid = !GeneratorOptions.useNewGenerator() || !GeneratorOptions.noRingVoid(); long i = (long) biomeX * (long) biomeX; long j = (long) biomeZ * (long) biomeZ; - + long dist = i + j; if (hasVoid) { - if (dist <= 65536L) - return this.centerBiome; - } else if (dist <= 625L) { - dist += noise.sample(i * 0.2, j * 0.2) * 10; + if (dist <= 65536L) return this.centerBiome; + } + else if (dist <= 625L) { + dist += noise.getValue(i * 0.2, j * 0.2) * 10; if (dist <= 625L) { return this.centerBiome; } @@ -133,7 +131,7 @@ public class BetterEndBiomeSource extends BiomeSource { } @Override - protected Codec getCodec() { + protected Codec codec() { return CODEC; } diff --git a/src/main/java/ru/betterend/world/generator/BiomeMap.java b/src/main/java/ru/betterend/world/generator/BiomeMap.java index bcc73d85..5a12b27b 100644 --- a/src/main/java/ru/betterend/world/generator/BiomeMap.java +++ b/src/main/java/ru/betterend/world/generator/BiomeMap.java @@ -1,17 +1,15 @@ package ru.betterend.world.generator; import java.util.Map; - +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.levelgen.WorldgenRandom; import com.google.common.collect.Maps; - -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.gen.ChunkRandom; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; import ru.betterend.world.biome.EndBiome; public class BiomeMap { - private static final ChunkRandom RANDOM = new ChunkRandom(); + private static final WorldgenRandom RANDOM = new WorldgenRandom(); private final Map maps = Maps.newHashMap(); private final int size; @@ -70,7 +68,7 @@ public class BiomeMap { ChunkPos cpos = new ChunkPos(MHelper.floor(x / BiomeChunk.WIDTH), MHelper.floor(z / BiomeChunk.WIDTH)); BiomeChunk chunk = maps.get(cpos); if (chunk == null) { - RANDOM.setTerrainSeed(cpos.x, cpos.z); + RANDOM.setBaseChunkSeed(cpos.x, cpos.z); chunk = new BiomeChunk(this, RANDOM, picker); maps.put(cpos, chunk); } diff --git a/src/main/java/ru/betterend/world/generator/BiomePicker.java b/src/main/java/ru/betterend/world/generator/BiomePicker.java index 159f4a53..b237a1e5 100644 --- a/src/main/java/ru/betterend/world/generator/BiomePicker.java +++ b/src/main/java/ru/betterend/world/generator/BiomePicker.java @@ -3,11 +3,9 @@ package ru.betterend.world.generator; import java.util.List; import java.util.Random; import java.util.Set; - +import net.minecraft.resources.ResourceLocation; import com.google.common.collect.Lists; import com.google.common.collect.Sets; - -import net.minecraft.resources.ResourceLocation; import ru.betterend.world.biome.EndBiome; public class BiomePicker { @@ -17,38 +15,38 @@ public class BiomePicker { private float maxChance = 0; private int biomeCount = 0; private WeighTree tree; - + public void addBiome(EndBiome biome) { maxChance = biome.mutateGenChance(maxChance); immutableIDs.add(biome.getID()); maxChanceUnmutable = maxChance; biomes.add(biome); - biomeCount++; + biomeCount ++; } - + public void addBiomeMutable(EndBiome biome) { biomes.add(biome); } - + public void clearMutables() { maxChance = maxChanceUnmutable; for (int i = biomes.size() - 1; i >= biomeCount; i--) { biomes.remove(i); } } - + public EndBiome getBiome(Random random) { return biomes.isEmpty() ? null : tree.getBiome(random.nextFloat() * maxChance); } - + public List getBiomes() { return biomes; } - + public boolean containsImmutable(ResourceLocation id) { return immutableIDs.contains(id); } - + public void removeMutableBiome(ResourceLocation id) { for (int i = biomeCount; i < biomes.size(); i++) { EndBiome biome = biomes.get(i); @@ -58,7 +56,7 @@ public class BiomePicker { } } } - + public void rebuild() { if (biomes.isEmpty()) { return; diff --git a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java index 7db78346..b9b34d4c 100644 --- a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java +++ b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java @@ -23,10 +23,10 @@ public class GeneratorOptions { public static LayerOptions smallOptions; private static boolean changeSpawn; private static BlockPos spawn; - private static BlockPos portal = BlockPos.ORIGIN; + private static BlockPos portal = BlockPos.ZERO; private static boolean replacePortal; private static boolean replacePillars; - + public static void init() { biomeSizeLand = Configs.GENERATOR_CONFIG.getInt("biomeMap", "biomeSizeLand", 256); biomeSizeVoid = Configs.GENERATOR_CONFIG.getInt("biomeMap", "biomeSizeVoid", 256); @@ -35,23 +35,21 @@ public class GeneratorOptions { hasDragonFights = Configs.GENERATOR_CONFIG.getBooleanRoot("hasDragonFights", true); swapOverworldToEnd = Configs.GENERATOR_CONFIG.getBooleanRoot("swapOverworldToEnd", false); changeChorusPlant = Configs.GENERATOR_CONFIG.getBoolean("chorusPlant", "changeChorusPlant", true); - removeChorusFromVanillaBiomes = Configs.GENERATOR_CONFIG.getBoolean("chorusPlant", - "removeChorusFromVanillaBiomes", true); + removeChorusFromVanillaBiomes = Configs.GENERATOR_CONFIG.getBoolean("chorusPlant", "removeChorusFromVanillaBiomes", true); newGenerator = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "useNewGenerator", true); noRingVoid = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "noRingVoid", false); generateCentralIsland = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "generateCentralIsland", true); endCityFailChance = Configs.GENERATOR_CONFIG.getInt("customGenerator", "endCityFailChance", 5); generateObsidianPlatform = Configs.GENERATOR_CONFIG.getBooleanRoot("generateObsidianPlatform", true); - bigOptions = new LayerOptions("customGenerator.layers.bigIslands", Configs.GENERATOR_CONFIG, 300, 200, 70, 10, - false); - mediumOptions = new LayerOptions("customGenerator.layers.mediumIslands", Configs.GENERATOR_CONFIG, 150, 100, 70, - 20, true); - smallOptions = new LayerOptions("customGenerator.layers.smallIslands", Configs.GENERATOR_CONFIG, 60, 50, 70, 30, - false); + bigOptions = new LayerOptions("customGenerator.layers.bigIslands", Configs.GENERATOR_CONFIG, 300, 200, 70, 10, false); + mediumOptions = new LayerOptions("customGenerator.layers.mediumIslands", Configs.GENERATOR_CONFIG, 150, 100, 70, 20, true); + smallOptions = new LayerOptions("customGenerator.layers.smallIslands", Configs.GENERATOR_CONFIG, 60, 50, 70, 30, false); changeSpawn = Configs.GENERATOR_CONFIG.getBoolean("spawn", "changeSpawn", false); - spawn = new BlockPos(Configs.GENERATOR_CONFIG.getInt("spawn.point", "x", 20), - Configs.GENERATOR_CONFIG.getInt("spawn.point", "y", 65), - Configs.GENERATOR_CONFIG.getInt("spawn.point", "z", 0)); + spawn = new BlockPos( + Configs.GENERATOR_CONFIG.getInt("spawn.point", "x", 20), + Configs.GENERATOR_CONFIG.getInt("spawn.point", "y", 65), + Configs.GENERATOR_CONFIG.getInt("spawn.point", "z", 0) + ); replacePortal = Configs.GENERATOR_CONFIG.getBoolean("portal", "customEndPortal", true); replacePillars = Configs.GENERATOR_CONFIG.getBoolean("spikes", "customObsidianSpikes", true); } @@ -59,7 +57,7 @@ public class GeneratorOptions { public static int getBiomeSizeLand() { return Mth.clamp(biomeSizeLand, 1, 8192); } - + public static int getBiomeSizeVoid() { return Mth.clamp(biomeSizeVoid, 1, 8192); } @@ -67,15 +65,15 @@ public class GeneratorOptions { public static boolean hasPortal() { return hasPortal; } - + public static boolean hasPillars() { return hasPillars; } - + public static boolean hasDragonFights() { return hasDragonFights; } - + public static boolean swapOverworldToEnd() { return swapOverworldToEnd; } @@ -87,23 +85,23 @@ public class GeneratorOptions { public static boolean removeChorusFromVanillaBiomes() { return removeChorusFromVanillaBiomes; } - + public static boolean noRingVoid() { return noRingVoid; } - + public static boolean useNewGenerator() { return newGenerator; } - + public static boolean hasCentralIsland() { return generateCentralIsland; } - + public static boolean generateObsidianPlatform() { return generateObsidianPlatform; } - + public static int getEndCityFailChance() { return endCityFailChance; } @@ -123,11 +121,11 @@ public class GeneratorOptions { public static void setPortalPos(BlockPos portal) { GeneratorOptions.portal = portal; } - + public static boolean replacePortal() { return replacePortal; } - + public static boolean replacePillars() { return replacePillars; } diff --git a/src/main/java/ru/betterend/world/generator/IslandLayer.java b/src/main/java/ru/betterend/world/generator/IslandLayer.java index 16ea3d49..7fcc6919 100644 --- a/src/main/java/ru/betterend/world/generator/IslandLayer.java +++ b/src/main/java/ru/betterend/world/generator/IslandLayer.java @@ -4,11 +4,9 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Random; - +import net.minecraft.core.BlockPos; import com.google.common.collect.Lists; import com.google.common.collect.Maps; - -import net.minecraft.core.BlockPos; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; import ru.betterend.util.sdf.SDF; @@ -22,7 +20,7 @@ public class IslandLayer { private static final Random RANDOM = new Random(); private final SDFRadialNoiseMap noise; private final SDF island; - + private final List positions = new ArrayList(9); private final Map islands = Maps.newHashMap(); private final OpenSimplexNoise density; @@ -30,34 +28,33 @@ public class IslandLayer { private int lastX = Integer.MIN_VALUE; private int lastZ = Integer.MIN_VALUE; private final LayerOptions options; - + public IslandLayer(int seed, LayerOptions options) { this.density = new OpenSimplexNoise(seed); this.options = options; this.seed = seed; - + SDF cone1 = makeCone(0, 0.4F, 0.2F, -0.3F); SDF cone2 = makeCone(0.4F, 0.5F, 0.1F, -0.1F); SDF cone3 = makeCone(0.5F, 0.45F, 0.03F, 0.0F); SDF cone4 = makeCone(0.45F, 0, 0.02F, 0.03F); - + SDF coneBottom = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone1).setSourceB(cone2); SDF coneTop = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone3).setSourceB(cone4); - noise = (SDFRadialNoiseMap) new SDFRadialNoiseMap().setSeed(seed).setRadius(0.5F).setIntensity(0.2F) - .setSource(coneTop); + noise = (SDFRadialNoiseMap) new SDFRadialNoiseMap().setSeed(seed).setRadius(0.5F).setIntensity(0.2F).setSource(coneTop); island = new SDFSmoothUnion().setRadius(0.01F).setSourceA(noise).setSourceB(coneBottom); } - + private int getSeed(int x, int z) { int h = seed + x * 374761393 + z * 668265263; h = (h ^ (h >> 13)) * 1274126177; return h ^ (h >> 16); } - + public void updatePositions(double x, double z) { int ix = MHelper.floor(x / options.distance); int iz = MHelper.floor(z / options.distance); - + if (lastX != ix || lastZ != iz) { lastX = ix; lastZ = iz; @@ -80,7 +77,7 @@ public class IslandLayer { } } } - + if (GeneratorOptions.hasCentralIsland() && ix < 4 && iz < 4 && ix > -4 && iz > -4) { List remove = Lists.newArrayList(); positions.forEach((pos) -> { @@ -95,13 +92,14 @@ public class IslandLayer { } } } - + private SDF getIsland(BlockPos pos) { SDF island = islands.get(pos); if (island == null) { if (pos.getX() == 0 && pos.getZ() == 0) { island = new SDFScale().setScale(1.3F).setSource(this.island); - } else { + } + else { RANDOM.setSeed(getSeed(pos.getX(), pos.getZ())); island = new SDFScale().setScale(RANDOM.nextFloat() + 0.5F).setSource(this.island); } @@ -110,74 +108,78 @@ public class IslandLayer { noise.setOffset(pos.getX(), pos.getZ()); return island; } - + private float getRelativeDistance(SDF sdf, BlockPos center, double px, double py, double pz) { float x = (float) (px - center.getX()) / options.scale; float y = (float) (py - center.getY()) / options.scale; float z = (float) (pz - center.getZ()) / options.scale; return sdf.getDistance(x, y, z); } - + private float calculateSDF(double x, double y, double z) { float distance = 10; - for (BlockPos pos : positions) { + for (BlockPos pos: positions) { SDF island = getIsland(pos); float dist = getRelativeDistance(island, pos, x, y, z); distance = MHelper.min(distance, dist); } return distance; } - + public float getDensity(double x, double y, double z) { return -calculateSDF(x, y, z); } - + public float getDensity(double x, double y, double z, float height) { noise.setIntensity(height); noise.setRadius(0.5F / (1 + height)); return -calculateSDF(x, y, z); } - + public void clearCache() { if (islands.size() > 128) { islands.clear(); } } - + private static SDF makeCone(float radiusBottom, float radiusTop, float height, float minY) { float hh = height * 0.5F; SDF sdf = new SDFCappedCone().setHeight(hh).setRadius1(radiusBottom).setRadius2(radiusTop); return new SDFTranslate().setTranslate(0, minY + hh, 0).setSource(sdf); } - - /* - * private static NativeImage loadMap(String path) { InputStream stream = - * IslandLayer.class.getResourceAsStream(path); if (stream != null) { try { - * NativeImage map = NativeImage.read(stream); stream.close(); return map; } - * catch (IOException e) { BetterEnd.LOGGER.warning(e.getMessage()); } } return - * null; } - */ - - /* - * static { NativeImage map = loadMap("/assets/" + BetterEnd.MOD_ID + - * "/textures/heightmaps/mountain_1.png"); - * - * SDF cone1 = makeCone(0, 0.4F, 0.2F, -0.3F); SDF cone2 = makeCone(0.4F, 0.5F, - * 0.1F, -0.1F); SDF cone3 = makeCone(0.5F, 0.45F, 0.03F, 0.0F); SDF cone4 = - * makeCone(0.45F, 0, 0.02F, 0.03F); - * - * SDF coneBottom = new - * SDFSmoothUnion().setRadius(0.02F).setSourceA(cone1).setSourceB(cone2); SDF - * coneTop = new - * SDFSmoothUnion().setRadius(0.02F).setSourceA(cone3).setSourceB(cone4); - * - * SDF map1 = new - * SDFHeightmap().setMap(map).setIntensity(0.3F).setSource(coneTop); NOISE = - * (SDFRadialNoiseMap) new SDFRadialNoiseMap().setSource(coneTop); - * - * ISLAND = new SDF[] { new - * SDFSmoothUnion().setRadius(0.01F).setSourceA(coneTop).setSourceB(coneBottom), - * new SDFSmoothUnion().setRadius(0.01F).setSourceA(map1).setSourceB(coneBottom) - * }; } - */ + + /*private static NativeImage loadMap(String path) { + InputStream stream = IslandLayer.class.getResourceAsStream(path); + if (stream != null) { + try { + NativeImage map = NativeImage.read(stream); + stream.close(); + return map; + } + catch (IOException e) { + BetterEnd.LOGGER.warning(e.getMessage()); + } + } + return null; + }*/ + + /*static { + NativeImage map = loadMap("/assets/" + BetterEnd.MOD_ID + "/textures/heightmaps/mountain_1.png"); + + SDF cone1 = makeCone(0, 0.4F, 0.2F, -0.3F); + SDF cone2 = makeCone(0.4F, 0.5F, 0.1F, -0.1F); + SDF cone3 = makeCone(0.5F, 0.45F, 0.03F, 0.0F); + SDF cone4 = makeCone(0.45F, 0, 0.02F, 0.03F); + + SDF coneBottom = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone1).setSourceB(cone2); + SDF coneTop = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone3).setSourceB(cone4); + + SDF map1 = new SDFHeightmap().setMap(map).setIntensity(0.3F).setSource(coneTop); + NOISE = (SDFRadialNoiseMap) new SDFRadialNoiseMap().setSource(coneTop); + + ISLAND = new SDF[] { + new SDFSmoothUnion().setRadius(0.01F).setSourceA(coneTop).setSourceB(coneBottom), + new SDFSmoothUnion().setRadius(0.01F).setSourceA(map1).setSourceB(coneBottom) + }; + }*/ } diff --git a/src/main/java/ru/betterend/world/generator/LayerOptions.java b/src/main/java/ru/betterend/world/generator/LayerOptions.java index 95371497..9c57bd3c 100644 --- a/src/main/java/ru/betterend/world/generator/LayerOptions.java +++ b/src/main/java/ru/betterend/world/generator/LayerOptions.java @@ -13,9 +13,8 @@ public class LayerOptions { public final int maxY; public final long centerDist; public final boolean hasCentralIsland; - - public LayerOptions(String name, PathConfig config, float distance, float scale, int center, int heightVariation, - boolean hasCentral) { + + public LayerOptions(String name, PathConfig config, float distance, float scale, int center, int heightVariation, boolean hasCentral) { this.distance = clampDistance(config.getFloat(name, "distance[1-8192]", distance)); this.scale = clampScale(config.getFloat(name, "scale[0.1-1024]", scale)); this.center = clampCenter(config.getInt(name, "averageHeight[0-255]", center)); @@ -26,23 +25,23 @@ public class LayerOptions { this.centerDist = Mth.floor(1000 / this.distance); this.hasCentralIsland = config.getBoolean(name, "hasCentralIsland", hasCentral); } - + private float clampDistance(float value) { return Mth.clamp(value, 1, 8192); } - + private float clampScale(float value) { return Mth.clamp(value, 0.1F, 1024); } - + private float clampCoverage(float value) { return 0.9999F - Mth.clamp(value, 0, 1) * 2; } - + private int clampCenter(int value) { return Mth.clamp(value, 0, 255); } - + private int clampVariation(int value) { return Mth.clamp(value, 0, 255); } diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index 151a6a58..6b2818d8 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -4,12 +4,10 @@ import java.awt.Point; import java.util.List; import java.util.Random; import java.util.concurrent.locks.ReentrantLock; - -import com.google.common.collect.Lists; - import net.minecraft.util.Mth; import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.biome.source.BiomeSource; +import net.minecraft.world.level.biome.BiomeSource; +import com.google.common.collect.Lists; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; @@ -19,18 +17,17 @@ public class TerrainGenerator { private static final double SCALE_Y = 4.0; private static final float[] COEF; private static final Point[] OFFS; - + private static IslandLayer largeIslands; private static IslandLayer mediumIslands; private static IslandLayer smallIslands; private static OpenSimplexNoise noise1; private static OpenSimplexNoise noise2; - - /* - * public static boolean canGenerate(int x, int z) { return - * GeneratorOptions.noRingVoid() || (long) x + (long) z > CENTER; } - */ - + + /*public static boolean canGenerate(int x, int z) { + return GeneratorOptions.noRingVoid() || (long) x + (long) z > CENTER; + }*/ + public static void initNoise(long seed) { Random random = new Random(seed); largeIslands = new IslandLayer(random.nextInt(), GeneratorOptions.bigOptions); @@ -39,27 +36,25 @@ public class TerrainGenerator { noise1 = new OpenSimplexNoise(random.nextInt()); noise2 = new OpenSimplexNoise(random.nextInt()); } - + public static void fillTerrainDensity(double[] buffer, int x, int z, BiomeSource biomeSource) { LOCKER.lock(); - + largeIslands.clearCache(); mediumIslands.clearCache(); smallIslands.clearCache(); - - double distortion1 = noise1.eval(x * 0.1, z * 0.1) * 20 + noise2.eval(x * 0.2, z * 0.2) * 10 - + noise1.eval(x * 0.4, z * 0.4) * 5; - double distortion2 = noise2.eval(x * 0.1, z * 0.1) * 20 + noise1.eval(x * 0.2, z * 0.2) * 10 - + noise2.eval(x * 0.4, z * 0.4) * 5; + + double distortion1 = noise1.eval(x * 0.1, z * 0.1) * 20 + noise2.eval(x * 0.2, z * 0.2) * 10 + noise1.eval(x * 0.4, z * 0.4) * 5; + double distortion2 = noise2.eval(x * 0.1, z * 0.1) * 20 + noise1.eval(x * 0.2, z * 0.2) * 10 + noise2.eval(x * 0.4, z * 0.4) * 5; double px = (double) x * SCALE_XZ + distortion1; double pz = (double) z * SCALE_XZ + distortion2; - + largeIslands.updatePositions(px, pz); mediumIslands.updatePositions(px, pz); smallIslands.updatePositions(px, pz); - + float height = getAverageDepth(biomeSource, x << 1, z << 1) * 0.5F; - + for (int y = 0; y < buffer.length; y++) { double py = (double) y * SCALE_Y; float dist = largeIslands.getDensity(px, py, pz, height); @@ -72,10 +67,10 @@ public class TerrainGenerator { } buffer[y] = dist; } - + LOCKER.unlock(); } - + private static float getAverageDepth(BiomeSource biomeSource, int x, int z) { if (getBiome(biomeSource, x, z).getDepth() < 0.1F) { return 0F; @@ -88,37 +83,34 @@ public class TerrainGenerator { } return depth; } - + private static Biome getBiome(BiomeSource biomeSource, int x, int z) { if (biomeSource instanceof BetterEndBiomeSource) { return ((BetterEndBiomeSource) biomeSource).getLandBiome(x, 0, z); } - return biomeSource.getBiomeForNoiseGen(x, 0, z); + return biomeSource.getNoiseBiome(x, 0, z); } - + /** * Check if this is land - * * @param x - biome pos x * @param z - biome pos z */ public static boolean isLand(int x, int z) { LOCKER.lock(); - + double px = (x >> 1) + 0.5; double pz = (z >> 1) + 0.5; - - double distortion1 = noise1.eval(px * 0.1, pz * 0.1) * 20 + noise2.eval(px * 0.2, pz * 0.2) * 10 - + noise1.eval(px * 0.4, pz * 0.4) * 5; - double distortion2 = noise2.eval(px * 0.1, pz * 0.1) * 20 + noise1.eval(px * 0.2, pz * 0.2) * 10 - + noise2.eval(px * 0.4, pz * 0.4) * 5; + + double distortion1 = noise1.eval(px * 0.1, pz * 0.1) * 20 + noise2.eval(px * 0.2, pz * 0.2) * 10 + noise1.eval(px * 0.4, pz * 0.4) * 5; + double distortion2 = noise2.eval(px * 0.1, pz * 0.1) * 20 + noise1.eval(px * 0.2, pz * 0.2) * 10 + noise2.eval(px * 0.4, pz * 0.4) * 5; px = px * SCALE_XZ + distortion1; pz = pz * SCALE_XZ + distortion2; - + largeIslands.updatePositions(px, pz); mediumIslands.updatePositions(px, pz); smallIslands.updatePositions(px, pz); - + for (int y = 0; y < 32; y++) { double py = (double) y * SCALE_Y; float dist = largeIslands.getDensity(px, py, pz); @@ -134,34 +126,31 @@ public class TerrainGenerator { return true; } } - + LOCKER.unlock(); return false; } - + /** * Get something like height - * * @param x - block pos x * @param z - block pos z */ public static int getHeight(int x, int z) { LOCKER.lock(); - + double px = (double) x / 8.0; double pz = (double) z / 8.0; - - double distortion1 = noise1.eval(px * 0.1, pz * 0.1) * 20 + noise2.eval(px * 0.2, pz * 0.2) * 10 - + noise1.eval(px * 0.4, pz * 0.4) * 5; - double distortion2 = noise2.eval(px * 0.1, pz * 0.1) * 20 + noise1.eval(px * 0.2, pz * 0.2) * 10 - + noise2.eval(px * 0.4, pz * 0.4) * 5; + + double distortion1 = noise1.eval(px * 0.1, pz * 0.1) * 20 + noise2.eval(px * 0.2, pz * 0.2) * 10 + noise1.eval(px * 0.4, pz * 0.4) * 5; + double distortion2 = noise2.eval(px * 0.1, pz * 0.1) * 20 + noise1.eval(px * 0.2, pz * 0.2) * 10 + noise2.eval(px * 0.4, pz * 0.4) * 5; px = (double) x * SCALE_XZ + distortion1; pz = (double) z * SCALE_XZ + distortion2; - + largeIslands.updatePositions(px, pz); mediumIslands.updatePositions(px, pz); smallIslands.updatePositions(px, pz); - + for (int y = 32; y >= 0; y--) { double py = (double) y * SCALE_Y; float dist = largeIslands.getDensity(px, py, pz); @@ -177,11 +166,11 @@ public class TerrainGenerator { return Mth.floor(Mth.clamp(y + dist, y, y + 1) * SCALE_Y); } } - + LOCKER.unlock(); return 0; } - + static { float sum = 0; List coef = Lists.newArrayList(); @@ -192,7 +181,7 @@ public class TerrainGenerator { if (dist <= 1) { sum += dist; coef.add(dist); - pos.offset(new Point(x, z)); + pos.add(new Point(x, z)); } } } diff --git a/src/main/java/ru/betterend/world/processors/DestructionStructureProcessor.java b/src/main/java/ru/betterend/world/processors/DestructionStructureProcessor.java index 2ff4898c..92d2b335 100644 --- a/src/main/java/ru/betterend/world/processors/DestructionStructureProcessor.java +++ b/src/main/java/ru/betterend/world/processors/DestructionStructureProcessor.java @@ -1,28 +1,24 @@ package ru.betterend.world.processors; -import net.minecraft.structure.Structure.StructureBlockInfo; -import net.minecraft.structure.StructurePlacementData; -import net.minecraft.structure.processor.StructureProcessor; -import net.minecraft.structure.processor.StructureProcessorType; import net.minecraft.core.BlockPos; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessor; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.StructureBlockInfo; import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; public class DestructionStructureProcessor extends StructureProcessor { private int chance = 4; - + public void setChance(int chance) { this.chance = chance; } - + @Override - public StructureBlockInfo process(WorldView worldView, BlockPos pos, BlockPos blockPos, - StructureBlockInfo structureBlockInfo, StructureBlockInfo structureBlockInfo2, - StructurePlacementData structurePlacementData) { - if (!structureBlockInfo2.state.is(EndBlocks.ETERNAL_PEDESTAL) - && !structureBlockInfo2.state.is(EndBlocks.FLAVOLITE_RUNED_ETERNAL) - && MHelper.RANDOM.nextInt(chance) == 0) { + public StructureBlockInfo processBlock(LevelReader worldView, BlockPos pos, BlockPos blockPos, StructureBlockInfo structureBlockInfo, StructureBlockInfo structureBlockInfo2, StructurePlaceSettings structurePlacementData) { + if (!structureBlockInfo2.state.is(EndBlocks.ETERNAL_PEDESTAL) && !structureBlockInfo2.state.is(EndBlocks.FLAVOLITE_RUNED_ETERNAL) && MHelper.RANDOM.nextInt(chance) == 0) { return null; } return structureBlockInfo2; diff --git a/src/main/java/ru/betterend/world/processors/TerrainStructureProcessor.java b/src/main/java/ru/betterend/world/processors/TerrainStructureProcessor.java index be56fcf7..a937a1c7 100644 --- a/src/main/java/ru/betterend/world/processors/TerrainStructureProcessor.java +++ b/src/main/java/ru/betterend/world/processors/TerrainStructureProcessor.java @@ -1,24 +1,21 @@ package ru.betterend.world.processors; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.structure.Structure.StructureBlockInfo; -import net.minecraft.structure.StructurePlacementData; -import net.minecraft.structure.processor.StructureProcessor; -import net.minecraft.structure.processor.StructureProcessorType; import net.minecraft.core.BlockPos; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessor; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.StructureBlockInfo; public class TerrainStructureProcessor extends StructureProcessor { @Override - public StructureBlockInfo process(WorldView worldView, BlockPos pos, BlockPos blockPos, - StructureBlockInfo structureBlockInfo, StructureBlockInfo structureBlockInfo2, - StructurePlacementData structurePlacementData) { + public StructureBlockInfo processBlock(LevelReader worldView, BlockPos pos, BlockPos blockPos, StructureBlockInfo structureBlockInfo, StructureBlockInfo structureBlockInfo2, StructurePlaceSettings structurePlacementData) { BlockPos bpos = structureBlockInfo2.pos; - if (structureBlockInfo2.state.is(Blocks.END_STONE) && worldView.isAir(bpos.up())) { - BlockState top = worldView.getBiome(structureBlockInfo2.pos).getGenerationSettings() - .getSurfaceBuilderConfig().getTopMaterial(); - return new StructureBlockInfo(bpos, top, structureBlockInfo2.tag); + if (structureBlockInfo2.state.is(Blocks.END_STONE) && worldView.isEmptyBlock(bpos.above())) { + BlockState top = worldView.getBiome(structureBlockInfo2.pos).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + return new StructureBlockInfo(bpos, top, structureBlockInfo2.nbt); } return structureBlockInfo2; } diff --git a/src/main/java/ru/betterend/world/structures/EndStructureFeature.java b/src/main/java/ru/betterend/world/structures/EndStructureFeature.java index 05377e2c..396fc2a1 100644 --- a/src/main/java/ru/betterend/world/structures/EndStructureFeature.java +++ b/src/main/java/ru/betterend/world/structures/EndStructureFeature.java @@ -3,31 +3,32 @@ package ru.betterend.world.structures; import java.util.Random; import net.fabricmc.fabric.api.structure.v1.FabricStructureBuilder; -import net.minecraft.resources.ResourceLocation; import net.minecraft.data.BuiltinRegistries; -import net.minecraft.world.gen.GenerationStep; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.levelgen.GenerationStep; import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; -import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.levelgen.feature.StructureFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.BetterEnd; public class EndStructureFeature { private static final Random RANDOM = new Random(354); private final StructureFeature structure; private final ConfiguredStructureFeature featureConfigured; - private final GenerationStep.Feature featureStep; - - public EndStructureFeature(String name, StructureFeature structure, - GenerationStep.Feature step, int spacing, int separation) { + private final GenerationStep.Decoration featureStep; + + public EndStructureFeature(String name, StructureFeature structure, GenerationStep.Decoration step, int spacing, int separation) { ResourceLocation id = BetterEnd.makeID(name); - + this.featureStep = step; - this.structure = FabricStructureBuilder.create(id, structure).step(step) - .defaultConfig(spacing, separation, RANDOM.nextInt(8192)).register(); + this.structure = FabricStructureBuilder.create(id, structure) + .step(step) + .defaultConfig(spacing, separation, RANDOM.nextInt(8192)) + .register(); - this.featureConfigured = this.structure.configure(NoneFeatureConfiguration.DEFAULT); - - BuiltinRegistries.add(BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE, id, this.featureConfigured); + this.featureConfigured = this.structure.configured(NoneFeatureConfiguration.NONE); + + BuiltinRegistries.register(BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE, id, this.featureConfigured); } public StructureFeature getStructure() { @@ -38,7 +39,7 @@ public class EndStructureFeature { return featureConfigured; } - public GenerationStep.Feature getFeatureStep() { + public GenerationStep.Decoration getFeatureStep() { return featureStep; } } diff --git a/src/main/java/ru/betterend/world/structures/StructureWorld.java b/src/main/java/ru/betterend/world/structures/StructureWorld.java index b6cf310c..9374441e 100644 --- a/src/main/java/ru/betterend/world/structures/StructureWorld.java +++ b/src/main/java/ru/betterend/world/structures/StructureWorld.java @@ -3,17 +3,16 @@ package ru.betterend.world.structures; import java.util.Map; import com.google.common.collect.Maps; - -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.NbtHelper; -import net.minecraft.util.math.BlockBox; -import net.minecraft.core.BlockPos; -import net.minecraft.util.math.ChunkPos; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.levelgen.structure.BoundingBox; public class StructureWorld { private Map parts = Maps.newHashMap(); @@ -25,10 +24,9 @@ public class StructureWorld { private int maxX = Integer.MIN_VALUE; private int maxY = Integer.MIN_VALUE; private int maxZ = Integer.MIN_VALUE; - - public StructureWorld() { - } - + + public StructureWorld() {} + public StructureWorld(CompoundTag tag) { minX = tag.getInt("minX"); maxX = tag.getInt("maxX"); @@ -36,7 +34,7 @@ public class StructureWorld { maxY = tag.getInt("maxY"); minZ = tag.getInt("minZ"); maxZ = tag.getInt("maxZ"); - + ListTag map = tag.getList("parts", 10); map.forEach((element) -> { CompoundTag compound = (CompoundTag) element; @@ -46,49 +44,43 @@ public class StructureWorld { parts.put(new ChunkPos(x, z), part); }); } - + public void setBlock(BlockPos pos, BlockState state) { ChunkPos cPos = new ChunkPos(pos); - + if (cPos.equals(lastPos)) { lastPart.addBlock(pos, state); return; } - + Part part = parts.get(cPos); if (part == null) { part = new Part(); parts.put(cPos, part); - - if (cPos.x < minX) - minX = cPos.x; - if (cPos.x > maxX) - maxX = cPos.x; - if (cPos.z < minZ) - minZ = cPos.z; - if (cPos.z > maxZ) - maxZ = cPos.z; + + if (cPos.x < minX) minX = cPos.x; + if (cPos.x > maxX) maxX = cPos.x; + if (cPos.z < minZ) minZ = cPos.z; + if (cPos.z > maxZ) maxZ = cPos.z; } - if (pos.getY() < minY) - minY = pos.getY(); - if (pos.getY() > maxY) - maxY = pos.getY(); + if (pos.getY() < minY) minY = pos.getY(); + if (pos.getY() > maxY) maxY = pos.getY(); part.addBlock(pos, state); - + lastPos = cPos; lastPart = part; } - + public boolean placeChunk(WorldGenLevel world, ChunkPos chunkPos) { Part part = parts.get(chunkPos); if (part != null) { - Chunk chunk = world.getChunk(chunkPos.x, chunkPos.z); + ChunkAccess chunk = world.getChunk(chunkPos.x, chunkPos.z); part.placeChunk(chunk); return true; } return false; } - + public CompoundTag toBNT() { CompoundTag tag = new CompoundTag(); tag.putInt("minX", minX); @@ -104,49 +96,47 @@ public class StructureWorld { }); return tag; } - - public BlockBox getBounds() { - if (minX == Integer.MAX_VALUE || maxX == Integer.MIN_VALUE || minZ == Integer.MAX_VALUE - || maxZ == Integer.MIN_VALUE) { - return BlockBox.empty(); + + public BoundingBox getBounds() { + if (minX == Integer.MAX_VALUE || maxX == Integer.MIN_VALUE || minZ == Integer.MAX_VALUE || maxZ == Integer.MIN_VALUE) { + return BoundingBox.getUnknownBox(); } - return new BlockBox(minX << 4, minY, minZ << 4, (maxX << 4) | 15, maxY, (maxZ << 4) | 15); + return new BoundingBox(minX << 4, minY, minZ << 4, (maxX << 4) | 15, maxY, (maxZ << 4) | 15); } - + private static final class Part { Map blocks = Maps.newHashMap(); - - public Part() { - } - + + public Part() {} + public Part(CompoundTag tag) { ListTag map = tag.getList("blocks", 10); ListTag map2 = tag.getList("states", 10); BlockState[] states = new BlockState[map2.size()]; for (int i = 0; i < states.length; i++) { - states[i] = NbtHelper.toBlockState((CompoundTag) map2.get(i)); + states[i] = NbtUtils.readBlockState((CompoundTag) map2.get(i)); } - + map.forEach((element) -> { CompoundTag block = (CompoundTag) element; - BlockPos pos = NbtHelper.toBlockPos(block.getCompound("pos")); + BlockPos pos = NbtUtils.readBlockPos(block.getCompound("pos")); int stateID = block.getInt("state"); - BlockState state = stateID < states.length ? states[stateID] : Block.getStateFromRawId(stateID); + BlockState state = stateID < states.length ? states[stateID] : Block.stateById(stateID); blocks.put(pos, state); }); } - + void addBlock(BlockPos pos, BlockState state) { BlockPos inner = new BlockPos(pos.getX() & 15, pos.getY(), pos.getZ() & 15); blocks.put(inner, state); } - - void placeChunk(Chunk chunk) { + + void placeChunk(ChunkAccess chunk) { blocks.forEach((pos, state) -> { - chunk.setBlockAndUpdate(pos, state, false); + chunk.setBlockState(pos, state, false); }); } - + CompoundTag toNBT(int x, int z) { CompoundTag tag = new CompoundTag(); tag.putInt("x", x); @@ -155,24 +145,24 @@ public class StructureWorld { tag.put("blocks", map); ListTag stateMap = new ListTag(); tag.put("states", stateMap); - + int[] id = new int[1]; Map states = Maps.newHashMap(); - + blocks.forEach((pos, state) -> { int stateID = states.getOrDefault(states, -1); if (stateID < 0) { - stateID = id[0]++; + stateID = id[0] ++; states.put(state, stateID); - stateMap.add(NbtHelper.fromBlockState(state)); + stateMap.add(NbtUtils.writeBlockState(state)); } - + CompoundTag block = new CompoundTag(); - block.put("pos", NbtHelper.fromBlockPos(pos)); + block.put("pos", NbtUtils.writeBlockPos(pos)); block.putInt("state", stateID); map.add(block); }); - + return tag; } } diff --git a/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java b/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java index a40bd45c..5cb3dcc9 100644 --- a/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java @@ -1,21 +1,21 @@ package ru.betterend.world.structures.features; -import net.minecraft.structure.Structure; -import net.minecraft.structure.StructureManager; -import net.minecraft.structure.StructureStart; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.util.registry.DynamicRegistryManager; -import net.minecraft.world.Heightmap; -import net.minecraft.world.Heightmap.Type; +import net.minecraft.core.RegistryAccess; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.biome.source.BiomeSource; -import net.minecraft.world.gen.ChunkRandom; +import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.levelgen.WorldgenRandom; import net.minecraft.world.level.levelgen.feature.StructureFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructureStart; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import ru.betterend.BetterEnd; import ru.betterend.util.MHelper; import ru.betterend.util.StructureHelper; @@ -23,46 +23,40 @@ import ru.betterend.world.structures.piece.NBTPiece; public class EternalPortalStructure extends FeatureBaseStructure { private static final ResourceLocation STRUCTURE_ID = BetterEnd.makeID("portal/eternal_portal"); - private static final Structure STRUCTURE = StructureHelper.readStructure(STRUCTURE_ID); - + private static final StructureTemplate STRUCTURE = StructureHelper.readStructure(STRUCTURE_ID); + @Override - protected boolean shouldStartAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, - ChunkRandom chunkRandom, int chunkX, int chunkZ, Biome biome, ChunkPos chunkPos, - NoneFeatureConfiguration featureConfig) { + protected boolean shouldStartAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, WorldgenRandom chunkRandom, int chunkX, int chunkZ, Biome biome, ChunkPos chunkPos, NoneFeatureConfiguration featureConfig) { long x = chunkPos.x; long z = chunkPos.z; if (x * x + z * z < 10000) { return false; } - if (chunkGenerator.getHeight((chunkX << 4) | 8, (chunkZ << 4) | 8, Heightmap.Type.WORLD_SURFACE_WG) < 10) { + if (chunkGenerator.getBaseHeight((chunkX << 4) | 8, (chunkZ << 4) | 8, Heightmap.Types.WORLD_SURFACE_WG) < 10) { return false; } - return super.shouldStartAt(chunkGenerator, biomeSource, worldSeed, chunkRandom, chunkX, chunkZ, biome, chunkPos, - featureConfig); + return super.shouldStartAt(chunkGenerator, biomeSource, worldSeed, chunkRandom, chunkX, chunkZ, biome, chunkPos, featureConfig); } - + @Override - public StructureFeature.StructureStartFactory getStructureStartFactory() { + public StructureFeature.StructureStartFactory getStartFactory() { return SDFStructureStart::new; } - + public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, - BlockBox box, int references, long seed) { + public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { super(feature, chunkX, chunkZ, box, references, seed); } @Override - public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, - StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { int x = (chunkX << 4) | MHelper.randRange(4, 12, random); int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); if (y > 4) { - this.children.add(new NBTPiece(STRUCTURE_ID, STRUCTURE, new BlockPos(x, y - 4, z), random.nextInt(5), - true, random)); + this.pieces.add(new NBTPiece(STRUCTURE_ID, STRUCTURE, new BlockPos(x, y - 4, z), random.nextInt(5), true, random)); } - this.setBoundingBoxFromChildren(); + this.calculateBoundingBox(); } } } diff --git a/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java b/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java index a670c02e..cf36a3ac 100644 --- a/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java @@ -1,35 +1,32 @@ package ru.betterend.world.structures.features; import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Rotation; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.Heightmap; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.biome.source.BiomeSource; -import net.minecraft.world.gen.ChunkRandom; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.WorldgenRandom; import net.minecraft.world.level.levelgen.feature.StructureFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; public abstract class FeatureBaseStructure extends StructureFeature { protected static final BlockState AIR = Blocks.AIR.defaultBlockState(); - + public FeatureBaseStructure() { super(NoneFeatureConfiguration.CODEC); } - - protected boolean shouldStartAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, - ChunkRandom chunkRandom, int chunkX, int chunkZ, Biome biome, ChunkPos chunkPos, - NoneFeatureConfiguration featureConfig) { + + protected boolean shouldStartAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, WorldgenRandom chunkRandom, int chunkX, int chunkZ, Biome biome, ChunkPos chunkPos, NoneFeatureConfiguration featureConfig) { return getGenerationHeight(chunkX, chunkZ, chunkGenerator) >= 20; } private static int getGenerationHeight(int chunkX, int chunkZ, ChunkGenerator chunkGenerator) { Random random = new Random((long) (chunkX + chunkZ * 10387313)); - Rotation blockRotation = Rotation.random(random); + Rotation blockRotation = Rotation.getRandom(random); int i = 5; int j = 5; if (blockRotation == Rotation.CLOCKWISE_90) { @@ -43,10 +40,10 @@ public abstract class FeatureBaseStructure extends StructureFeature points = getFibonacciPoints(count); SDF sdf = null; - SDF spike = new SDFCappedCone().setRadius1(3 + (size - 5) * 0.2F).setRadius2(0).setHeight(size) - .setBlock(EndBlocks.DENSE_SNOW); + SDF spike = new SDFCappedCone().setRadius1(3 + (size - 5) * 0.2F).setRadius2(0).setHeight(size).setBlock(EndBlocks.DENSE_SNOW); spike = new SDFTranslate().setTranslate(0, size - 0.5F, 0).setSource(spike); - for (Vector3f point : points) { + for (Vector3f point: points) { SDF rotated = spike; point = MHelper.normalize(point); - float angle = MHelper.angle(Vector3f.POSITIVE_Y, point); + float angle = MHelper.angle(Vector3f.YP, point); if (angle > 0.01F && angle < 3.14F) { - Vector3f axis = MHelper.normalize(MHelper.cross(Vector3f.POSITIVE_Y, point)); + Vector3f axis = MHelper.normalize(MHelper.cross(Vector3f.YP, point)); rotated = new SDFRotation().setRotation(axis, angle).setSource(spike); - } else if (angle > 1) { - rotated = new SDFRotation().setRotation(Vector3f.POSITIVE_Y, (float) Math.PI).setSource(spike); + } + else if (angle > 1) { + rotated = new SDFRotation().setRotation(Vector3f.YP, (float) Math.PI).setSource(spike); } sdf = (sdf == null) ? rotated : new SDFUnion().setSourceA(sdf).setSourceB(rotated); } - + final float ancientRadius = size * 0.7F; final float denseRadius = size * 0.9F; final float iceRadius = size < 7 ? size * 5 : size * 1.3F; final float randScale = size * 0.3F; - + final BlockPos center = pos; final BlockState ice = EndBlocks.EMERALD_ICE.defaultBlockState(); final BlockState dense = EndBlocks.DENSE_EMERALD_ICE.defaultBlockState(); final BlockState ancient = EndBlocks.ANCIENT_EMERALD_ICE.defaultBlockState(); final SDF sdfCopy = sdf; - + return sdf.addPostProcess((info) -> { BlockPos bpos = info.getPos(); float px = bpos.getX() - center.getX(); float py = bpos.getY() - center.getY(); float pz = bpos.getZ() - center.getZ(); - float distance = MHelper.length(px, py, pz) + sdfCopy.getDistance(px, py, pz) * 0.4F - + random.nextFloat() * randScale; + float distance = MHelper.length(px, py, pz) + sdfCopy.getDistance(px, py, pz) * 0.4F + random.nextFloat() * randScale; if (distance < ancientRadius) { return ancient; - } else if (distance < denseRadius) { + } + else if (distance < denseRadius) { return dense; - } else if (distance < iceRadius) { + } + else if (distance < iceRadius) { return ice; } return info.getState(); }); } - + private List getFibonacciPoints(int count) { float max = count - 1; List result = new ArrayList(count); @@ -94,29 +94,25 @@ public class GiantIceStarStructure extends SDFStructureFeature { } return result; } - + @Override - public StructureFeature.StructureStartFactory getStructureStartFactory() { + public StructureFeature.StructureStartFactory getStartFactory() { return StarStructureStart::new; } - + public static class StarStructureStart extends StructureStart { - public StarStructureStart(StructureFeature feature, int chunkX, int chunkZ, - BlockBox box, int references, long seed) { + public StarStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { super(feature, chunkX, chunkZ, box, references, seed); } @Override - public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, - StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { int x = (chunkX << 4) | MHelper.randRange(4, 12, random); int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); BlockPos start = new BlockPos(x, MHelper.randRange(32, 128, random), z); - VoxelPiece piece = new VoxelPiece((world) -> { - ((SDFStructureFeature) this.getFeature()).getSDF(start, this.random).fillRecursive(world, start); - }, random.nextInt()); - this.children.add(piece); - this.setBoundingBoxFromChildren(); + VoxelPiece piece = new VoxelPiece((world) -> { ((SDFStructureFeature) this.getFeature()).getSDF(start, this.random).fillRecursive(world, start); }, random.nextInt()); + this.pieces.add(piece); + this.calculateBoundingBox(); } } } diff --git a/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java b/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java index c1082948..3def5bb3 100644 --- a/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java @@ -1,9 +1,8 @@ package ru.betterend.world.structures.features; +import com.mojang.math.Vector3f; import java.util.List; import java.util.Random; - -import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import ru.betterend.blocks.MossyGlowshroomCapBlock; @@ -34,49 +33,43 @@ public class GiantMossyGlowshroomStructure extends SDFStructureFeature { SDFCappedCone cone1 = new SDFCappedCone().setHeight(2.5F).setRadius1(1.5F).setRadius2(2.5F); SDFCappedCone cone2 = new SDFCappedCone().setHeight(3F).setRadius1(2.5F).setRadius2(13F); SDF posedCone2 = new SDFTranslate().setTranslate(0, 5, 0).setSource(cone2); - SDF posedCone3 = new SDFTranslate().setTranslate(0, 12F, 0) - .setSource(new SDFScale().setScale(2).setSource(cone2)); + SDF posedCone3 = new SDFTranslate().setTranslate(0, 12F, 0).setSource(new SDFScale().setScale(2).setSource(cone2)); SDF upCone = new SDFSubtraction().setSourceA(posedCone2).setSourceB(posedCone3); SDF wave = new SDFFlatWave().setRaysCount(12).setIntensity(1.3F).setSource(upCone); SDF cones = new SDFSmoothUnion().setRadius(3).setSourceA(cone1).setSourceB(wave); - + SDF innerCone = new SDFTranslate().setTranslate(0, 1.25F, 0).setSource(upCone); innerCone = new SDFScale3D().setScale(1.2F, 1F, 1.2F).setSource(innerCone); cones = new SDFUnion().setSourceA(cones).setSourceB(innerCone); - + SDF glowCone = new SDFCappedCone().setHeight(3F).setRadius1(2F).setRadius2(12.5F); SDFPrimitive priGlowCone = (SDFPrimitive) glowCone; glowCone = new SDFTranslate().setTranslate(0, 4.25F, 0).setSource(glowCone); glowCone = new SDFSubtraction().setSourceA(glowCone).setSourceB(posedCone3); - + cones = new SDFUnion().setSourceA(cones).setSourceB(glowCone); - + OpenSimplexNoise noise = new OpenSimplexNoise(1234); cones = new SDFCoordModify().setFunction((pos) -> { - float dist = MHelper.length(pos.getX(), pos.getZ()); - float y = pos.getY() - + (float) noise.eval(pos.getX() * 0.1 + center.getX(), pos.getZ() * 0.1 + center.getZ()) * dist - * 0.3F - - dist * 0.15F; - pos.set(pos.getX(), y, pos.getZ()); + float dist = MHelper.length(pos.x(), pos.z()); + float y = pos.y() + (float) noise.eval(pos.x() * 0.1 + center.getX(), pos.z() * 0.1 + center.getZ()) * dist * 0.3F - dist * 0.15F; + pos.set(pos.x(), y, pos.z()); }).setSource(cones); - - SDFTranslate HEAD_POS = (SDFTranslate) new SDFTranslate() - .setSource(new SDFTranslate().setTranslate(0, 2.5F, 0).setSource(cones)); - + + SDFTranslate HEAD_POS = (SDFTranslate) new SDFTranslate().setSource(new SDFTranslate().setTranslate(0, 2.5F, 0).setSource(cones)); + SDF roots = new SDFSphere().setRadius(4F); SDFPrimitive primRoots = (SDFPrimitive) roots; roots = new SDFScale3D().setScale(1, 0.7F, 1).setSource(roots); SDFFlatWave rotRoots = (SDFFlatWave) new SDFFlatWave().setRaysCount(5).setIntensity(1.5F).setSource(roots); - - SDFBinary function = new SDFSmoothUnion().setRadius(4) - .setSourceB(new SDFUnion().setSourceA(HEAD_POS).setSourceB(rotRoots)); - + + SDFBinary function = new SDFSmoothUnion().setRadius(4).setSourceB(new SDFUnion().setSourceA(HEAD_POS).setSourceB(rotRoots)); + cone1.setBlock(EndBlocks.MOSSY_GLOWSHROOM_CAP); cone2.setBlock(EndBlocks.MOSSY_GLOWSHROOM_CAP); priGlowCone.setBlock(EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE); primRoots.setBlock(EndBlocks.MOSSY_GLOWSHROOM.bark); - + float height = MHelper.randRange(10F, 25F, random); int count = MHelper.floor(height / 4); List spline = SplineHelper.makeSpline(0, 0, 0, 0, height, 0, count); @@ -86,43 +79,43 @@ public class GiantMossyGlowshroomStructure extends SDFStructureFeature { }); Vector3f pos = spline.get(spline.size() - 1); float scale = MHelper.randRange(2F, 3.5F, random); - - HEAD_POS.setTranslate(pos.getX(), pos.getY(), pos.getZ()); + + HEAD_POS.setTranslate(pos.x(), pos.y(), pos.z()); rotRoots.setAngle(random.nextFloat() * MHelper.PI2); function.setSourceA(sdf); - - return new SDFRound().setRadius(1.5F).setSource(new SDFScale().setScale(scale).setSource(function)) + + return new SDFRound().setRadius(1.5F).setSource(new SDFScale() + .setScale(scale) + .setSource(function)) .addPostProcess((info) -> { if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getState())) { if (random.nextBoolean() && info.getStateUp().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { - info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState() - .with(MossyGlowshroomCapBlock.TRANSITION, true)); + info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState().setValue(MossyGlowshroomCapBlock.TRANSITION, true)); return info.getState(); - } else if (!EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateUp()) - || !EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateDown())) { + } + else if (!EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateUp()) || !EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateDown())) { info.setState(EndBlocks.MOSSY_GLOWSHROOM.bark.defaultBlockState()); return info.getState(); } - } else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { + } + else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateDown().getBlock())) { - info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState() - .with(MossyGlowshroomCapBlock.TRANSITION, true)); + info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState().setValue(MossyGlowshroomCapBlock.TRANSITION, true)); return info.getState(); } - + info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState()); return info.getState(); - } else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { - for (Direction dir : BlocksHelper.HORIZONTAL) { + } + else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { + for (Direction dir: BlocksHelper.HORIZONTAL) { if (info.getState(dir) == AIR) { - info.setBlockPos(info.getPos().offset(dir), - EndBlocks.MOSSY_GLOWSHROOM_FUR.defaultBlockState().with(FurBlock.FACING, dir)); + info.setBlockPos(info.getPos().relative(dir), EndBlocks.MOSSY_GLOWSHROOM_FUR.defaultBlockState().setValue(FurBlock.FACING, dir)); } } - + if (info.getStateDown().getBlock() != EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { - info.setBlockPos(info.getPos().below(), EndBlocks.MOSSY_GLOWSHROOM_FUR.defaultBlockState() - .with(FurBlock.FACING, Direction.DOWN)); + info.setBlockPos(info.getPos().below(), EndBlocks.MOSSY_GLOWSHROOM_FUR.defaultBlockState().setValue(FurBlock.FACING, Direction.DOWN)); } } return info.getState(); diff --git a/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java b/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java index 5ec17e48..2ed7f3c7 100644 --- a/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java @@ -1,43 +1,41 @@ package ru.betterend.world.structures.features; -import net.minecraft.structure.StructureManager; -import net.minecraft.structure.StructureStart; -import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; -import net.minecraft.util.registry.DynamicRegistryManager; -import net.minecraft.world.Heightmap.Type; +import net.minecraft.core.RegistryAccess; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.feature.StructureFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructureStart; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import ru.betterend.util.MHelper; import ru.betterend.world.structures.piece.LakePiece; public class MegaLakeSmallStructure extends FeatureBaseStructure { @Override - public StructureFeature.StructureStartFactory getStructureStartFactory() { + public StructureFeature.StructureStartFactory getStartFactory() { return SDFStructureStart::new; } - + public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, - BlockBox box, int references, long seed) { + public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { super(feature, chunkX, chunkZ, box, references, seed); } @Override - public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, - StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { int x = (chunkX << 4) | MHelper.randRange(4, 12, random); int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); if (y > 5) { float radius = MHelper.randRange(20, 40, random); float depth = MHelper.randRange(5, 10, random); LakePiece piece = new LakePiece(new BlockPos(x, y, z), radius, depth, random, biome); - this.children.add(piece); + this.pieces.add(piece); } - this.setBoundingBoxFromChildren(); + this.calculateBoundingBox(); } } } diff --git a/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java b/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java index c5ff0335..8a433b2f 100644 --- a/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java @@ -1,43 +1,41 @@ package ru.betterend.world.structures.features; -import net.minecraft.structure.StructureManager; -import net.minecraft.structure.StructureStart; -import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; -import net.minecraft.util.registry.DynamicRegistryManager; -import net.minecraft.world.Heightmap.Type; +import net.minecraft.core.RegistryAccess; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.feature.StructureFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructureStart; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import ru.betterend.util.MHelper; import ru.betterend.world.structures.piece.LakePiece; public class MegaLakeStructure extends FeatureBaseStructure { @Override - public StructureFeature.StructureStartFactory getStructureStartFactory() { + public StructureFeature.StructureStartFactory getStartFactory() { return SDFStructureStart::new; } - + public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, - BlockBox box, int references, long seed) { + public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { super(feature, chunkX, chunkZ, box, references, seed); } @Override - public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, - StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { int x = (chunkX << 4) | MHelper.randRange(4, 12, random); int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); if (y > 5) { float radius = MHelper.randRange(32, 64, random); float depth = MHelper.randRange(7, 15, random); LakePiece piece = new LakePiece(new BlockPos(x, y, z), radius, depth, random, biome); - this.children.add(piece); + this.pieces.add(piece); } - this.setBoundingBoxFromChildren(); + this.calculateBoundingBox(); } } } diff --git a/src/main/java/ru/betterend/world/structures/features/MountainStructure.java b/src/main/java/ru/betterend/world/structures/features/MountainStructure.java index 686d64b6..8ae1acfa 100644 --- a/src/main/java/ru/betterend/world/structures/features/MountainStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/MountainStructure.java @@ -1,44 +1,41 @@ package ru.betterend.world.structures.features; -import net.minecraft.structure.StructureManager; -import net.minecraft.structure.StructureStart; -import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; -import net.minecraft.util.registry.DynamicRegistryManager; -import net.minecraft.world.Heightmap.Type; +import net.minecraft.core.RegistryAccess; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.feature.StructureFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructureStart; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import ru.betterend.util.MHelper; import ru.betterend.world.structures.piece.CrystalMountainPiece; public class MountainStructure extends FeatureBaseStructure { @Override - public StructureFeature.StructureStartFactory getStructureStartFactory() { + public StructureFeature.StructureStartFactory getStartFactory() { return SDFStructureStart::new; } - + public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, - BlockBox box, int references, long seed) { + public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { super(feature, chunkX, chunkZ, box, references, seed); } @Override - public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, - StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { int x = (chunkX << 4) | MHelper.randRange(4, 12, random); int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); if (y > 5) { float radius = MHelper.randRange(50, 100, random); float height = radius * MHelper.randRange(0.8F, 1.2F, random); - CrystalMountainPiece piece = new CrystalMountainPiece(new BlockPos(x, y, z), radius, height, random, - biome); - this.children.add(piece); + CrystalMountainPiece piece = new CrystalMountainPiece(new BlockPos(x, y, z), radius, height, random, biome); + this.pieces.add(piece); } - this.setBoundingBoxFromChildren(); + this.calculateBoundingBox(); } } } diff --git a/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java b/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java index 4bb136ba..b9e192dc 100644 --- a/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java @@ -1,41 +1,39 @@ package ru.betterend.world.structures.features; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.structure.StructureManager; -import net.minecraft.structure.StructureStart; -import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; -import net.minecraft.util.registry.DynamicRegistryManager; -import net.minecraft.world.Heightmap.Type; +import net.minecraft.core.RegistryAccess; 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.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.feature.StructureFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructureStart; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; import ru.betterend.world.structures.piece.PaintedMountainPiece; public class PaintedMountainStructure extends FeatureBaseStructure { private static final BlockState[] VARIANTS; - + @Override - public StructureFeature.StructureStartFactory getStructureStartFactory() { + public StructureFeature.StructureStartFactory getStartFactory() { return SDFStructureStart::new; } - + public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, - BlockBox box, int references, long seed) { + public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { super(feature, chunkX, chunkZ, box, references, seed); } @Override - public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, - StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { int x = (chunkX << 4) | MHelper.randRange(4, 12, random); int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); if (y > 50) { float radius = MHelper.randRange(50, 100, random); float height = radius * MHelper.randRange(0.4F, 0.6F, random); @@ -44,15 +42,17 @@ public class PaintedMountainStructure extends FeatureBaseStructure { for (int i = 0; i < count; i++) { slises[i] = VARIANTS[random.nextInt(VARIANTS.length)]; } - this.children - .add(new PaintedMountainPiece(new BlockPos(x, y, z), radius, height, random, biome, slises)); + this.pieces.add(new PaintedMountainPiece(new BlockPos(x, y, z), radius, height, random, biome, slises )); } - this.setBoundingBoxFromChildren(); + this.calculateBoundingBox(); } } - + static { - VARIANTS = new BlockState[] { Blocks.END_STONE.defaultBlockState(), - EndBlocks.FLAVOLITE.stone.defaultBlockState(), EndBlocks.VIOLECITE.stone.defaultBlockState(), }; + VARIANTS = new BlockState[] { + Blocks.END_STONE.defaultBlockState(), + EndBlocks.FLAVOLITE.stone.defaultBlockState(), + EndBlocks.VIOLECITE.stone.defaultBlockState(), + }; } } diff --git a/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java b/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java index bfbb613b..299b8477 100644 --- a/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java +++ b/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java @@ -1,50 +1,45 @@ package ru.betterend.world.structures.features; import java.util.Random; - -import net.minecraft.structure.StructureManager; -import net.minecraft.structure.StructureStart; -import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; -import net.minecraft.util.registry.DynamicRegistryManager; -import net.minecraft.world.Heightmap.Type; +import net.minecraft.core.RegistryAccess; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.feature.StructureFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructureStart; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import ru.betterend.util.MHelper; import ru.betterend.util.sdf.SDF; import ru.betterend.world.structures.piece.VoxelPiece; public abstract class SDFStructureFeature extends FeatureBaseStructure { - + protected abstract SDF getSDF(BlockPos pos, Random random); - + @Override - public StructureFeature.StructureStartFactory getStructureStartFactory() { + public StructureFeature.StructureStartFactory getStartFactory() { return SDFStructureStart::new; } - + public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, - BlockBox box, int references, long seed) { + public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { super(feature, chunkX, chunkZ, box, references, seed); } @Override - public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, - StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { int x = (chunkX << 4) | MHelper.randRange(4, 12, random); int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); if (y > 5) { BlockPos start = new BlockPos(x, y, z); - VoxelPiece piece = new VoxelPiece((world) -> { - ((SDFStructureFeature) this.getFeature()).getSDF(start, this.random).fillRecursive(world, start); - }, random.nextInt()); - this.children.add(piece); + VoxelPiece piece = new VoxelPiece((world) -> { ((SDFStructureFeature) this.getFeature()).getSDF(start, this.random).fillRecursive(world, start); }, random.nextInt()); + this.pieces.add(piece); } - this.setBoundingBoxFromChildren(); + this.calculateBoundingBox(); } } } diff --git a/src/main/java/ru/betterend/world/structures/piece/BasePiece.java b/src/main/java/ru/betterend/world/structures/piece/BasePiece.java index aa8fe1a4..b5ce64f8 100644 --- a/src/main/java/ru/betterend/world/structures/piece/BasePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/BasePiece.java @@ -1,8 +1,8 @@ package ru.betterend.world.structures.piece; import net.minecraft.nbt.CompoundTag; -import net.minecraft.structure.StructurePiece; -import net.minecraft.structure.StructurePieceType; +import net.minecraft.world.level.levelgen.feature.StructurePieceType; +import net.minecraft.world.level.levelgen.structure.StructurePiece; public abstract class BasePiece extends StructurePiece { protected BasePiece(StructurePieceType type, int i) { diff --git a/src/main/java/ru/betterend/world/structures/piece/CavePiece.java b/src/main/java/ru/betterend/world/structures/piece/CavePiece.java index a8042879..fef5d2f0 100644 --- a/src/main/java/ru/betterend/world/structures/piece/CavePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/CavePiece.java @@ -1,18 +1,17 @@ package ru.betterend.world.structures.piece; import java.util.Random; - -import net.minecraft.world.level.block.Blocks; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtHelper; -import net.minecraft.structure.StructureManager; -import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; -import net.minecraft.util.math.ChunkPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureFeatureManager; import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.gen.StructureAccessor; +import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndStructures; import ru.betterend.registry.EndTags; @@ -23,7 +22,7 @@ public class CavePiece extends BasePiece { private OpenSimplexNoise noise; private BlockPos center; private float radius; - + public CavePiece(BlockPos center, float radius, int id) { super(EndStructures.CAVE_PIECE, id); this.center = center; @@ -36,17 +35,16 @@ public class CavePiece extends BasePiece { super(EndStructures.CAVE_PIECE, tag); makeBoundingBox(); } - + @Override - public boolean place(WorldGenLevel world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, - BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { - int x1 = MHelper.max(this.boundingBox.minX, blockBox.minX); - int z1 = MHelper.max(this.boundingBox.minZ, blockBox.minZ); - int x2 = MHelper.min(this.boundingBox.maxX, blockBox.maxX); - int z2 = MHelper.min(this.boundingBox.maxZ, blockBox.maxZ); - int y1 = this.boundingBox.minY; - int y2 = this.boundingBox.maxY; - + public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + int x1 = MHelper.max(this.boundingBox.x0, blockBox.x0); + int z1 = MHelper.max(this.boundingBox.z0, blockBox.z0); + int x2 = MHelper.min(this.boundingBox.x1, blockBox.x1); + int z2 = MHelper.min(this.boundingBox.z1, blockBox.z1); + int y1 = this.boundingBox.y0; + int y2 = this.boundingBox.y1; + double hr = radius * 0.75; double nr = radius * 0.25; MutableBlockPos pos = new MutableBlockPos(); @@ -67,10 +65,11 @@ public class CavePiece extends BasePiece { double r2 = r - 4.5; double dist = xsq + ysq + zsq; if (dist < r2 * r2) { - if (world.getBlockState(pos).isIn(EndTags.END_GROUND)) { - BlocksHelper.setWithoutUpdate(world, pos, AIR); + if (world.getBlockState(pos).is(EndTags.END_GROUND)) { + BlocksHelper.setWithoutUpdate(world, pos, CAVE_AIR); } - } else if (dist < r * r) { + } + else if (dist < r * r) { if (world.getBlockState(pos).getMaterial().isReplaceable()) { BlocksHelper.setWithoutUpdate(world, pos, Blocks.END_STONE); } @@ -78,23 +77,23 @@ public class CavePiece extends BasePiece { } } } - + return true; } @Override - protected void toNbt(CompoundTag tag) { - tag.put("center", NbtHelper.fromBlockPos(center)); + protected void addAdditionalSaveData(CompoundTag tag) { + tag.put("center", NbtUtils.writeBlockPos(center)); tag.putFloat("radius", radius); } @Override protected void fromNbt(CompoundTag tag) { - center = NbtHelper.toBlockPos(tag.getCompound("center")); + center = NbtUtils.readBlockPos(tag.getCompound("center")); radius = tag.getFloat("radius"); noise = new OpenSimplexNoise(MHelper.getSeed(534, center.getX(), center.getZ())); } - + private void makeBoundingBox() { int minX = MHelper.floor(center.getX() - radius); int minY = MHelper.floor(center.getY() - radius); @@ -102,6 +101,6 @@ public class CavePiece extends BasePiece { int maxX = MHelper.floor(center.getX() + radius + 1); int maxY = MHelper.floor(center.getY() + radius + 1); int maxZ = MHelper.floor(center.getZ() + radius + 1); - this.boundingBox = new BlockBox(minX, minY, minZ, maxX, maxY, maxZ); + this.boundingBox = new BoundingBox(minX, minY, minZ, maxX, maxY, maxZ); } } diff --git a/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java index 82d08f40..e85ca44d 100644 --- a/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java @@ -1,23 +1,22 @@ package ru.betterend.world.structures.piece; import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.structure.StructureManager; -import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; -import net.minecraft.util.math.ChunkPos; +import net.minecraft.nbt.CompoundTag; import net.minecraft.util.Mth; -import net.minecraft.world.Heightmap; -import net.minecraft.world.Heightmap.Type; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureFeatureManager; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.gen.StructureAccessor; +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; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndStructures; @@ -26,7 +25,7 @@ import ru.betterend.util.MHelper; public class CrystalMountainPiece extends MountainPiece { private BlockState top; - + public CrystalMountainPiece(BlockPos center, float radius, float height, Random random, Biome biome) { super(EndStructures.MOUNTAIN_PIECE, center, radius, height, random, biome); top = biome.getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); @@ -43,14 +42,13 @@ public class CrystalMountainPiece extends MountainPiece { } @Override - public boolean place(WorldGenLevel world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, - BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { - int sx = chunkPos.getStartX(); - int sz = chunkPos.getStartZ(); + public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + int sx = chunkPos.getMinBlockX(); + int sz = chunkPos.getMinBlockZ(); MutableBlockPos pos = new MutableBlockPos(); - Chunk chunk = world.getChunk(chunkPos.x, chunkPos.z); - Heightmap map = chunk.getHeightmap(Type.WORLD_SURFACE); - Heightmap map2 = chunk.getHeightmap(Type.WORLD_SURFACE_WG); + ChunkAccess chunk = world.getChunk(chunkPos.x, chunkPos.z); + Heightmap map = chunk.getOrCreateHeightmapUnprimed(Types.WORLD_SURFACE); + Heightmap map2 = chunk.getOrCreateHeightmapUnprimed(Types.WORLD_SURFACE_WG); for (int x = 0; x < 16; x++) { int px = x + sx; int px2 = px - center.getX(); @@ -64,17 +62,16 @@ public class CrystalMountainPiece extends MountainPiece { if (dist < r2) { pos.setZ(z); dist = 1 - (float) Math.pow(dist / r2, 0.3); - int minY = map.get(x, z); + int minY = map.getFirstAvailable(x, z); if (minY < 10) { continue; } pos.setY(minY); - while (!chunk.getBlockState(pos).isIn(EndTags.GEN_TERRAIN) && pos.getY() > 56 - && !chunk.getBlockState(pos.below()).is(Blocks.CAVE_AIR)) { + while (!chunk.getBlockState(pos).is(EndTags.GEN_TERRAIN) && pos.getY() > 56 && !chunk.getBlockState(pos.below()).is(Blocks.CAVE_AIR)) { pos.setY(pos.getY() - 1); } minY = pos.getY(); - minY = Math.max(minY, map2.get(x, z)); + minY = Math.max(minY, map2.getFirstAvailable(x, z)); if (minY > center.getY() - 8) { float maxY = dist * height * getHeightClamp(world, 12, px, pz); if (maxY > 0) { @@ -83,30 +80,28 @@ public class CrystalMountainPiece extends MountainPiece { maxY += center.getY(); int maxYI = (int) (maxY); int cover = maxYI - 1; - boolean needCover = (noise1.eval(px * 0.1, pz * 0.1) + MHelper.randRange(-0.4, 0.4, random) - - (center.getY() + 14) * 0.1) > 0; + boolean needCover = (noise1.eval(px * 0.1, pz * 0.1) + MHelper.randRange(-0.4, 0.4, random) - (center.getY() + 14) * 0.1) > 0; for (int y = minY - 1; y < maxYI; y++) { pos.setY(y); - chunk.setBlockAndUpdate(pos, - needCover && y == cover ? top : Blocks.END_STONE.defaultBlockState(), false); + chunk.setBlockState(pos, needCover && y == cover ? top : Blocks.END_STONE.defaultBlockState(), false); } } } } } } - - map = chunk.getHeightmap(Type.WORLD_SURFACE); - + + map = chunk.getOrCreateHeightmapUnprimed(Types.WORLD_SURFACE); + // Big crystals - int count = (map.get(8, 8) - (center.getY() + 24)) / 7; + int count = (map.getFirstAvailable(8, 8) - (center.getY() + 24)) / 7; count = Mth.clamp(count, 0, 8); for (int i = 0; i < count; i++) { int radius = MHelper.randRange(2, 3, random); float fill = MHelper.randRange(0F, 1F, random); int x = MHelper.randRange(radius, 15 - radius, random); int z = MHelper.randRange(radius, 15 - radius, random); - int y = map.get(x, z); + int y = map.getFirstAvailable(x, z); if (y > 80) { pos.set(x, y, z); if (chunk.getBlockState(pos.below()).is(Blocks.END_STONE)) { @@ -115,16 +110,16 @@ public class CrystalMountainPiece extends MountainPiece { } } } - + // Small crystals - count = (map.get(8, 8) - (center.getY() + 24)) / 2; + count = (map.getFirstAvailable(8, 8) - (center.getY() + 24)) / 2; count = Mth.clamp(count, 4, 8); for (int i = 0; i < count; i++) { int radius = MHelper.randRange(1, 2, random); float fill = random.nextBoolean() ? 0 : 1; int x = MHelper.randRange(radius, 15 - radius, random); int z = MHelper.randRange(radius, 15 - radius, random); - int y = map.get(x, z); + int y = map.getFirstAvailable(x, z); if (y > 80) { pos.set(x, y, z); if (chunk.getBlockState(pos.below()).getBlock() == Blocks.END_STONE) { @@ -133,15 +128,15 @@ public class CrystalMountainPiece extends MountainPiece { } } } - + return true; } - - private void crystal(Chunk chunk, BlockPos pos, int radius, int height, float fill, Random random) { + + private void crystal(ChunkAccess chunk, BlockPos pos, int radius, int height, float fill, Random random) { MutableBlockPos mut = new MutableBlockPos(); int max = MHelper.floor(fill * radius + radius + 0.5F); height += pos.getY(); - Heightmap map = chunk.getHeightmap(Type.WORLD_SURFACE); + Heightmap map = chunk.getOrCreateHeightmapUnprimed(Types.WORLD_SURFACE); int coefX = MHelper.randRange(-1, 1, random); int coefZ = MHelper.randRange(-1, 1, random); for (int x = -radius; x <= radius; x++) { @@ -153,14 +148,14 @@ public class CrystalMountainPiece extends MountainPiece { if (mut.getZ() >= 0 && mut.getZ() < 16) { int az = Math.abs(z); if (ax + az < max) { - int minY = map.get(mut.getX(), mut.getZ()) - MHelper.randRange(3, 7, random); + int minY = map.getFirstAvailable(mut.getX(), mut.getZ()) - MHelper.randRange(3, 7, random); if (pos.getY() - minY > 8) { minY = pos.getY() - 8; } int h = coefX * x + coefZ * z + height; for (int y = minY; y < h; y++) { mut.setY(y); - chunk.setBlockAndUpdate(mut, EndBlocks.AURORA_CRYSTAL.defaultBlockState(), false); + chunk.setBlockState(mut, EndBlocks.AURORA_CRYSTAL.defaultBlockState(), false); } } } diff --git a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java index 12939c6f..7200068a 100644 --- a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java @@ -4,26 +4,25 @@ import java.util.Map; import java.util.Random; import com.google.common.collect.Maps; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.fluid.FluidState; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtHelper; -import net.minecraft.structure.StructureManager; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; -import net.minecraft.util.math.ChunkPos; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; -import net.minecraft.world.Heightmap.Type; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureFeatureManager; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.gen.StructureAccessor; +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.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import net.minecraft.world.level.material.FluidState; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndBlocks; @@ -42,9 +41,9 @@ public class LakePiece extends BasePiece { private float aspect; private float depth; private int seed; - + private ResourceLocation biomeID; - + public LakePiece(BlockPos center, float radius, float depth, Random random, Biome biome) { super(EndStructures.LAKE_PIECE, random.nextInt()); this.center = center; @@ -63,8 +62,8 @@ public class LakePiece extends BasePiece { } @Override - protected void toNbt(CompoundTag tag) { - tag.put("center", NbtHelper.fromBlockPos(center)); + protected void addAdditionalSaveData(CompoundTag tag) { + tag.put("center", NbtUtils.writeBlockPos(center)); tag.putFloat("radius", radius); tag.putFloat("depth", depth); tag.putInt("seed", seed); @@ -73,7 +72,7 @@ public class LakePiece extends BasePiece { @Override protected void fromNbt(CompoundTag tag) { - center = NbtHelper.toBlockPos(tag.getCompound("center")); + center = NbtUtils.readBlockPos(tag.getCompound("center")); radius = tag.getFloat("radius"); depth = tag.getFloat("depth"); seed = tag.getInt("seed"); @@ -83,14 +82,13 @@ public class LakePiece extends BasePiece { } @Override - public boolean place(WorldGenLevel world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, - BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { - int minY = this.boundingBox.minY; - int maxY = this.boundingBox.maxY; + public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + int minY = this.boundingBox.y0; + int maxY = this.boundingBox.y1; int sx = chunkPos.x << 4; int sz = chunkPos.z << 4; MutableBlockPos mut = new MutableBlockPos(); - Chunk chunk = world.getChunk(chunkPos.x, chunkPos.z); + ChunkAccess chunk = world.getChunk(chunkPos.x, chunkPos.z); for (int x = 0; x < 16; x++) { mut.setX(x); int wx = x | sx; @@ -102,13 +100,12 @@ public class LakePiece extends BasePiece { double nz = wz * 0.1; int z2 = wz - center.getZ(); float clamp = getHeightClamp(world, 8, wx, wz); - if (clamp < 0.01) - continue; - + if (clamp < 0.01) continue; + double n = noise.eval(nx, nz) * 1.5 + 1.5; double x3 = MHelper.pow2(x2 + noise.eval(nx, nz, 100) * 10); double z3 = MHelper.pow2(z2 + noise.eval(nx, nz, -100) * 10); - + for (int y = minY; y <= maxY; y++) { mut.setY((int) (y + n)); double y2 = MHelper.pow2((y - center.getY()) * aspect); @@ -119,24 +116,23 @@ public class LakePiece extends BasePiece { double dist = x3 + y2 + z3; if (dist < r2) { BlockState state = chunk.getBlockState(mut); - if (state.isIn(EndTags.GEN_TERRAIN) || state.isAir()) { - state = mut.getY() < center.getY() ? WATER : AIR; - chunk.setBlockAndUpdate(mut, state, false); + if (state.is(EndTags.GEN_TERRAIN) || state.isAir()) { + state = mut.getY() < center.getY() ? WATER : CAVE_AIR; + chunk.setBlockState(mut, state, false); } - } else if (dist <= r3 && mut.getY() < center.getY()) { + } + else if (dist <= r3 && mut.getY() < center.getY()) { BlockState state = chunk.getBlockState(mut); - BlockPos worldPos = mut.add(sx, 0, sz); - if (!state.isFullCube(world, worldPos) && !state.isSolidBlock(world, worldPos)) { - state = chunk.getBlockState(mut.up()); + BlockPos worldPos = mut.offset(sx, 0, sz); + if (!state.isCollisionShapeFullBlock(world, worldPos) && !state.isRedstoneConductor(world, worldPos)) { + state = chunk.getBlockState(mut.above()); if (state.isAir()) { - state = random.nextBoolean() ? ENDSTONE - : world.getBiome(worldPos).getGenerationSettings().getSurfaceBuilderConfig() - .getTopMaterial(); - } else { - state = state.getFluidState().isEmpty() ? ENDSTONE - : EndBlocks.ENDSTONE_DUST.defaultBlockState(); + state = random.nextBoolean() ? ENDSTONE : world.getBiome(worldPos).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); } - chunk.setBlockAndUpdate(mut, state, false); + else { + state = state.getFluidState().isEmpty() ? ENDSTONE : EndBlocks.ENDSTONE_DUST.defaultBlockState(); + } + chunk.setBlockState(mut, state, false); } } } @@ -145,10 +141,10 @@ public class LakePiece extends BasePiece { fixWater(world, chunk, mut, random, sx, sz); return true; } - - private void fixWater(WorldGenLevel world, Chunk chunk, MutableBlockPos mut, Random random, int sx, int sz) { - int minY = this.boundingBox.minY; - int maxY = this.boundingBox.maxY; + + private void fixWater(WorldGenLevel world, ChunkAccess chunk, MutableBlockPos mut, Random random, int sx, int sz) { + int minY = this.boundingBox.y0; + int maxY = this.boundingBox.y1; for (int x = 0; x < 16; x++) { mut.setX(x); for (int z = 0; z < 16; z++) { @@ -160,78 +156,76 @@ public class LakePiece extends BasePiece { mut.setY(y - 1); if (chunk.getBlockState(mut).isAir()) { mut.setY(y + 1); - + BlockState bState = chunk.getBlockState(mut); if (bState.isAir()) { - bState = random.nextBoolean() ? ENDSTONE - : world.getBiome(mut.add(sx, 0, sz)).getGenerationSettings() - .getSurfaceBuilderConfig().getTopMaterial(); - } else { - bState = bState.getFluidState().isEmpty() ? ENDSTONE - : EndBlocks.ENDSTONE_DUST.defaultBlockState(); + bState = random.nextBoolean() ? ENDSTONE : world.getBiome(mut.offset(sx, 0, sz)).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); } - + else { + bState = bState.getFluidState().isEmpty() ? ENDSTONE : EndBlocks.ENDSTONE_DUST.defaultBlockState(); + } + mut.setY(y); - + makeEndstonePillar(chunk, mut, bState); - } else if (x > 1 && x < 15 && z > 1 && z < 15) { + } + else if (x > 1 && x < 15 && z > 1 && z < 15) { mut.setY(y); - for (Direction dir : BlocksHelper.HORIZONTAL) { - BlockPos wPos = mut.add(dir.getOffsetX(), 0, dir.getOffsetZ()); + for (Direction dir: BlocksHelper.HORIZONTAL) { + BlockPos wPos = mut.offset(dir.getStepX(), 0, dir.getStepZ()); if (chunk.getBlockState(wPos).isAir()) { mut.setY(y + 1); BlockState bState = chunk.getBlockState(mut); if (bState.isAir()) { - bState = random.nextBoolean() ? ENDSTONE - : world.getBiome(mut.add(sx, 0, sz)).getGenerationSettings() - .getSurfaceBuilderConfig().getTopMaterial(); - } else { - bState = bState.getFluidState().isEmpty() ? ENDSTONE - : EndBlocks.ENDSTONE_DUST.defaultBlockState(); + bState = random.nextBoolean() ? ENDSTONE : world.getBiome(mut.offset(sx, 0, sz)).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + } + else { + bState = bState.getFluidState().isEmpty() ? ENDSTONE : EndBlocks.ENDSTONE_DUST.defaultBlockState(); } mut.setY(y); makeEndstonePillar(chunk, mut, bState); break; } } - } else if (chunk.getBlockState(mut.move(Direction.UP)).isAir()) { - chunk.getFluidTickScheduler().schedule(mut.move(Direction.DOWN), state.getFluid(), 0); + } + else if (chunk.getBlockState(mut.move(Direction.UP)).isAir()) { + chunk.getLiquidTicks().scheduleTick(mut.move(Direction.DOWN), state.getType(), 0); } } } } } } - - private void makeEndstonePillar(Chunk chunk, MutableBlockPos mut, BlockState terrain) { - chunk.setBlockAndUpdate(mut, terrain, false); + + private void makeEndstonePillar(ChunkAccess chunk, MutableBlockPos mut, BlockState terrain) { + chunk.setBlockState(mut, terrain, false); mut.setY(mut.getY() - 1); while (!chunk.getFluidState(mut).isEmpty()) { - chunk.setBlockAndUpdate(mut, ENDSTONE, false); + chunk.setBlockState(mut, ENDSTONE, false); mut.setY(mut.getY() - 1); } } - + private int getHeight(WorldGenLevel world, BlockPos pos) { int p = ((pos.getX() & 2047) << 11) | (pos.getZ() & 2047); int h = heightmap.getOrDefault(p, Byte.MIN_VALUE); if (h > Byte.MIN_VALUE) { return h; } - + if (!EndBiomes.getBiomeID(world.getBiome(pos)).equals(biomeID)) { heightmap.put(p, (byte) 0); return 0; } - + h = world.getHeight(Types.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); h = Mth.abs(h - center.getY()); h = h < 8 ? 1 : 0; - + heightmap.put(p, (byte) h); return h; } - + private float getHeightClamp(WorldGenLevel world, int radius, int posX, int posZ) { MutableBlockPos mut = new MutableBlockPos(); int r2 = radius * radius; @@ -253,7 +247,7 @@ public class LakePiece extends BasePiece { height /= max; return Mth.clamp(height, 0, 1); } - + private void makeBoundingBox() { int minX = MHelper.floor(center.getX() - radius - 8); int minY = MHelper.floor(center.getY() - depth - 8); @@ -261,6 +255,6 @@ public class LakePiece extends BasePiece { int maxX = MHelper.floor(center.getX() + radius + 8); int maxY = MHelper.floor(center.getY() + depth); int maxZ = MHelper.floor(center.getZ() + radius + 8); - this.boundingBox = new BlockBox(minX, minY, minZ, maxX, maxY, maxZ); + this.boundingBox = new BoundingBox(minX, minY, minZ, maxX, maxY, maxZ); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java index a066e38b..95f10b32 100644 --- a/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java @@ -4,19 +4,18 @@ import java.util.Map; import java.util.Random; import com.google.common.collect.Maps; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtHelper; -import net.minecraft.structure.StructureManager; -import net.minecraft.structure.StructurePieceType; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; -import net.minecraft.world.Heightmap.Type; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.levelgen.feature.StructurePieceType; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; import ru.betterend.util.MHelper; @@ -32,9 +31,8 @@ public abstract class MountainPiece extends BasePiece { protected ResourceLocation biomeID; protected int seed1; protected int seed2; - - public MountainPiece(StructurePieceType type, BlockPos center, float radius, float height, Random random, - Biome biome) { + + public MountainPiece(StructurePieceType type, BlockPos center, float radius, float height, Random random, Biome biome) { super(type, random.nextInt()); this.center = center; this.radius = radius; @@ -54,8 +52,8 @@ public abstract class MountainPiece extends BasePiece { } @Override - protected void toNbt(CompoundTag tag) { - tag.put("center", NbtHelper.fromBlockPos(center)); + protected void addAdditionalSaveData(CompoundTag tag) { + tag.put("center", NbtUtils.writeBlockPos(center)); tag.putFloat("radius", radius); tag.putFloat("height", height); tag.putString("biome", biomeID.toString()); @@ -65,7 +63,7 @@ public abstract class MountainPiece extends BasePiece { @Override protected void fromNbt(CompoundTag tag) { - center = NbtHelper.toBlockPos(tag.getCompound("center")); + center = NbtUtils.readBlockPos(tag.getCompound("center")); radius = tag.getFloat("radius"); height = tag.getFloat("height"); biomeID = new ResourceLocation(tag.getString("biome")); @@ -75,14 +73,14 @@ public abstract class MountainPiece extends BasePiece { noise1 = new OpenSimplexNoise(seed1); noise2 = new OpenSimplexNoise(seed2); } - + private int getHeight(WorldGenLevel world, BlockPos pos) { int p = ((pos.getX() & 2047) << 11) | (pos.getZ() & 2047); int h = heightmap.getOrDefault(p, Integer.MIN_VALUE); if (h > Integer.MIN_VALUE) { return h; } - + if (!EndBiomes.getBiomeID(world.getBiome(pos)).equals(biomeID)) { heightmap.put(p, -10); return -10; @@ -94,20 +92,19 @@ public abstract class MountainPiece extends BasePiece { heightmap.put(p, h); return h; } - - h = MHelper.floor(noise2.eval(pos.getX() * 0.01, pos.getZ() * 0.01) - * noise2.eval(pos.getX() * 0.002, pos.getZ() * 0.002) * 8 + 8); - + + h = MHelper.floor(noise2.eval(pos.getX() * 0.01, pos.getZ() * 0.01) * noise2.eval(pos.getX() * 0.002, pos.getZ() * 0.002) * 8 + 8); + if (h < 0) { heightmap.put(p, 0); return 0; } - + heightmap.put(p, h); - + return h; } - + protected float getHeightClamp(WorldGenLevel world, int radius, int posX, int posZ) { MutableBlockPos mut = new MutableBlockPos(); float height = 0; @@ -128,12 +125,12 @@ public abstract class MountainPiece extends BasePiece { height /= max; return Mth.clamp(height / radius, 0, 1); } - + private void makeBoundingBox() { int minX = MHelper.floor(center.getX() - radius); int minZ = MHelper.floor(center.getZ() - radius); int maxX = MHelper.floor(center.getX() + radius + 1); int maxZ = MHelper.floor(center.getZ() + radius + 1); - this.boundingBox = new BlockBox(minX, minZ, maxX, maxZ); + this.boundingBox = new BoundingBox(minX, minZ, maxX, maxZ); } } diff --git a/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java b/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java index 29e87287..63fa5bd7 100644 --- a/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java @@ -1,21 +1,20 @@ package ru.betterend.world.structures.piece; import java.util.Random; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtHelper; -import net.minecraft.structure.Structure; -import net.minecraft.structure.StructureManager; -import net.minecraft.structure.StructurePlacementData; -import net.minecraft.util.BlockMirror; -import net.minecraft.world.level.block.Rotation; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; -import net.minecraft.util.math.ChunkPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureFeatureManager; import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.gen.StructureAccessor; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import ru.betterend.registry.EndStructures; import ru.betterend.util.MHelper; import ru.betterend.util.StructureHelper; @@ -23,19 +22,18 @@ import ru.betterend.util.StructureHelper; public class NBTPiece extends BasePiece { private ResourceLocation structureID; private Rotation rotation; - private BlockMirror mirror; - private Structure structure; + private Mirror mirror; + private StructureTemplate structure; private BlockPos pos; private int erosion; private boolean cover; - - public NBTPiece(ResourceLocation structureID, Structure structure, BlockPos pos, int erosion, boolean cover, - Random random) { + + public NBTPiece(ResourceLocation structureID, StructureTemplate structure, BlockPos pos, int erosion, boolean cover, Random random) { super(EndStructures.NBT_PIECE, random.nextInt()); this.structureID = structureID; this.structure = structure; - this.rotation = Rotation.random(random); - this.mirror = BlockMirror.values()[random.nextInt(3)]; + this.rotation = Rotation.getRandom(random); + this.mirror = Mirror.values()[random.nextInt(3)]; this.pos = StructureHelper.offsetPos(pos, structure, rotation, mirror); this.erosion = erosion; this.cover = cover; @@ -48,12 +46,12 @@ public class NBTPiece extends BasePiece { } @Override - protected void toNbt(CompoundTag tag) { + protected void addAdditionalSaveData(CompoundTag tag) { tag.putString("id", structureID.toString()); tag.putInt("rotation", rotation.ordinal()); tag.putInt("mirror", mirror.ordinal()); tag.putInt("erosion", erosion); - tag.put("pos", NbtHelper.fromBlockPos(pos)); + tag.put("pos", NbtUtils.writeBlockPos(pos)); tag.putBoolean("cover", cover); } @@ -61,27 +59,25 @@ public class NBTPiece extends BasePiece { protected void fromNbt(CompoundTag tag) { structureID = new ResourceLocation(tag.getString("id")); rotation = Rotation.values()[tag.getInt("rotation")]; - mirror = BlockMirror.values()[tag.getInt("mirror")]; + mirror = Mirror.values()[tag.getInt("mirror")]; erosion = tag.getInt("erosion"); - pos = NbtHelper.toBlockPos(tag.getCompound("pos")); + pos = NbtUtils.readBlockPos(tag.getCompound("pos")); cover = tag.getBoolean("cover"); structure = StructureHelper.readStructure(structureID); } @Override - public boolean place(WorldGenLevel world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, - BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { - BlockBox bounds = new BlockBox(blockBox); - bounds.maxY = this.boundingBox.maxY; - bounds.minY = this.boundingBox.minY; - StructurePlacementData placementData = new StructurePlacementData().setRotation(rotation).setMirror(mirror) - .setBoundingBox(bounds); - structure.place(world, pos, placementData, random); + public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + BoundingBox bounds = new BoundingBox(blockBox); + bounds.y1 = this.boundingBox.y1; + bounds.y0 = this.boundingBox.y0; + StructurePlaceSettings placementData = new StructurePlaceSettings().setRotation(rotation).setMirror(mirror).setBoundingBox(bounds); + structure.placeInWorldChunk(world, pos, placementData, random); if (erosion > 0) { - bounds.maxX = MHelper.min(bounds.maxX, boundingBox.maxX); - bounds.minX = MHelper.max(bounds.minX, boundingBox.minX); - bounds.maxZ = MHelper.min(bounds.maxZ, boundingBox.maxZ); - bounds.minZ = MHelper.max(bounds.minZ, boundingBox.minZ); + bounds.x1 = MHelper.min(bounds.x1, boundingBox.x1); + bounds.x0 = MHelper.max(bounds.x0, boundingBox.x0); + bounds.z1 = MHelper.min(bounds.z1, boundingBox.z1); + bounds.z0 = MHelper.max(bounds.z0, boundingBox.z0); StructureHelper.erode(world, bounds, erosion, random); } if (cover) { @@ -89,7 +85,7 @@ public class NBTPiece extends BasePiece { } return true; } - + private void makeBoundingBox() { this.boundingBox = StructureHelper.getStructureBounds(pos, structure, rotation, mirror); } diff --git a/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java index b6c3c9c8..915c9126 100644 --- a/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java @@ -1,31 +1,28 @@ package ru.betterend.world.structures.piece; import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.NbtHelper; -import net.minecraft.structure.StructureManager; -import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.Heightmap; -import net.minecraft.world.Heightmap.Type; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureFeatureManager; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.gen.StructureAccessor; +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; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import ru.betterend.registry.EndStructures; import ru.betterend.util.MHelper; public class PaintedMountainPiece extends MountainPiece { private BlockState[] slises; - - public PaintedMountainPiece(BlockPos center, float radius, float height, Random random, Biome biome, - BlockState[] slises) { + public PaintedMountainPiece(BlockPos center, float radius, float height, Random random, Biome biome, BlockState[] slises) { super(EndStructures.PAINTED_MOUNTAIN_PIECE, center, radius, height, random, biome); this.slises = slises; } @@ -35,11 +32,11 @@ public class PaintedMountainPiece extends MountainPiece { } @Override - protected void toNbt(CompoundTag tag) { - super.toNbt(tag); + protected void addAdditionalSaveData(CompoundTag tag) { + super.addAdditionalSaveData(tag); ListTag slise = new ListTag(); - for (BlockState state : slises) { - slise.add(NbtHelper.fromBlockState(state)); + for (BlockState state: slises) { + slise.add(NbtUtils.writeBlockState(state)); } tag.put("slises", slise); } @@ -50,19 +47,18 @@ public class PaintedMountainPiece extends MountainPiece { ListTag slise = tag.getList("slises", 10); slises = new BlockState[slise.size()]; for (int i = 0; i < slises.length; i++) { - slises[i] = NbtHelper.toBlockState(slise.getCompound(i)); + slises[i] = NbtUtils.readBlockState(slise.getCompound(i)); } } @Override - public boolean place(WorldGenLevel world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, - BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { - int sx = chunkPos.getStartX(); - int sz = chunkPos.getStartZ(); + public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + int sx = chunkPos.getMinBlockX(); + int sz = chunkPos.getMinBlockZ(); MutableBlockPos pos = new MutableBlockPos(); - Chunk chunk = world.getChunk(chunkPos.x, chunkPos.z); - Heightmap map = chunk.getHeightmap(Type.WORLD_SURFACE); - Heightmap map2 = chunk.getHeightmap(Type.WORLD_SURFACE_WG); + ChunkAccess chunk = world.getChunk(chunkPos.x, chunkPos.z); + Heightmap map = chunk.getOrCreateHeightmapUnprimed(Types.WORLD_SURFACE); + Heightmap map2 = chunk.getOrCreateHeightmapUnprimed(Types.WORLD_SURFACE_WG); for (int x = 0; x < 16; x++) { int px = x + sx; int px2 = px - center.getX(); @@ -76,32 +72,31 @@ public class PaintedMountainPiece extends MountainPiece { if (dist < r2) { pos.setZ(z); dist = 1 - dist / r2; - int minY = map.get(x, z); + int minY = map.getFirstAvailable(x, z); pos.setY(minY - 1); while (chunk.getBlockState(pos).isAir() && pos.getY() > 50) { - pos.setY(minY--); + pos.setY(minY --); } minY = pos.getY(); - minY = Math.max(minY, map2.get(x, z)); + minY = Math.max(minY, map2.getFirstAvailable(x, z)); if (minY > center.getY() - 8) { float maxY = dist * height * getHeightClamp(world, 10, px, pz); if (maxY > 0) { maxY *= (float) noise1.eval(px * 0.05, pz * 0.05) * 0.3F + 0.7F; maxY *= (float) noise1.eval(px * 0.1, pz * 0.1) * 0.1F + 0.9F; maxY += center.getY(); - float offset = (float) (noise1.eval(px * 0.07, pz * 0.07) * 5 - + noise1.eval(px * 0.2, pz * 0.2) * 2 + 7); + float offset = (float) (noise1.eval(px * 0.07, pz * 0.07) * 5 + noise1.eval(px * 0.2, pz * 0.2) * 2 + 7); for (int y = minY - 1; y < maxY; y++) { pos.setY(y); int index = MHelper.floor((y + offset) * 0.65F) % slises.length; - chunk.setBlockAndUpdate(pos, slises[index], false); + chunk.setBlockState(pos, slises[index], false); } } } } } } - + return true; } } diff --git a/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java b/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java index a2be51f9..07276d85 100644 --- a/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java @@ -2,21 +2,20 @@ package ru.betterend.world.structures.piece; import java.util.Random; import java.util.function.Consumer; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.structure.StructureManager; -import net.minecraft.util.math.BlockBox; import net.minecraft.core.BlockPos; -import net.minecraft.util.math.ChunkPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureFeatureManager; import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.gen.StructureAccessor; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import ru.betterend.registry.EndStructures; import ru.betterend.world.structures.StructureWorld; public class VoxelPiece extends BasePiece { private StructureWorld world; - + public VoxelPiece(Consumer function, int id) { super(EndStructures.VOXEL_PIECE, id); world = new StructureWorld(); @@ -30,7 +29,7 @@ public class VoxelPiece extends BasePiece { } @Override - protected void toNbt(CompoundTag tag) { + protected void addAdditionalSaveData(CompoundTag tag) { tag.put("world", world.toBNT()); } @@ -40,8 +39,7 @@ public class VoxelPiece extends BasePiece { } @Override - public boolean place(WorldGenLevel world, StructureAccessor arg, ChunkGenerator chunkGenerator, Random random, - BlockBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { this.world.placeChunk(world, chunkPos); return true; } diff --git a/src/main/java/ru/betterend/world/surface/DoubleBlockSurfaceBuilder.java b/src/main/java/ru/betterend/world/surface/DoubleBlockSurfaceBuilder.java index 053d7798..b69dc71a 100644 --- a/src/main/java/ru/betterend/world/surface/DoubleBlockSurfaceBuilder.java +++ b/src/main/java/ru/betterend/world/surface/DoubleBlockSurfaceBuilder.java @@ -1,55 +1,51 @@ package ru.betterend.world.surface; import java.util.Random; - -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; import net.minecraft.core.Registry; import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.gen.surfacebuilder.ConfiguredSurfaceBuilder; -import net.minecraft.world.gen.surfacebuilder.SurfaceBuilder; -import net.minecraft.world.gen.surfacebuilder.TernarySurfaceConfig; +import net.minecraft.world.level.block.Block; +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.levelgen.surfacebuilders.ConfiguredSurfaceBuilder; +import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilder; +import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderBaseConfiguration; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; -public class DoubleBlockSurfaceBuilder extends SurfaceBuilder { +public class DoubleBlockSurfaceBuilder extends SurfaceBuilder { private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(4141); - private TernarySurfaceConfig config1; - private TernarySurfaceConfig config2; - + private SurfaceBuilderBaseConfiguration config1; + private SurfaceBuilderBaseConfiguration config2; + private DoubleBlockSurfaceBuilder() { - super(TernarySurfaceConfig.CODEC); + super(SurfaceBuilderBaseConfiguration.CODEC); } - + public DoubleBlockSurfaceBuilder setBlock1(Block block) { BlockState stone = Blocks.END_STONE.defaultBlockState(); - config1 = new TernarySurfaceConfig(block.defaultBlockState(), stone, stone); + config1 = new SurfaceBuilderBaseConfiguration(block.defaultBlockState(), stone, stone); return this; } - + public DoubleBlockSurfaceBuilder setBlock2(Block block) { BlockState stone = Blocks.END_STONE.defaultBlockState(); - config2 = new TernarySurfaceConfig(block.defaultBlockState(), stone, stone); + config2 = new SurfaceBuilderBaseConfiguration(block.defaultBlockState(), stone, stone); return this; } @Override - public void generate(Random random, Chunk chunk, Biome biome, int x, int z, int height, double noise, - BlockState defaultBlock, BlockState defaultFluid, int seaLevel, long seed, - TernarySurfaceConfig surfaceBlocks) { + public void apply(Random random, ChunkAccess chunk, Biome biome, int x, int z, int height, double noise, BlockState defaultBlock, BlockState defaultFluid, int seaLevel, long seed, SurfaceBuilderBaseConfiguration surfaceBlocks) { noise = NOISE.eval(x * 0.1, z * 0.1) + MHelper.randRange(-0.4, 0.4, random); - SurfaceBuilder.DEFAULT.generate(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, seaLevel, - seed, noise > 0 ? config1 : config2); + SurfaceBuilder.DEFAULT.apply(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, seaLevel, seed, noise > 0 ? config1 : config2); } - + public static DoubleBlockSurfaceBuilder register(String name) { return Registry.register(Registry.SURFACE_BUILDER, name, new DoubleBlockSurfaceBuilder()); } - - public ConfiguredSurfaceBuilder configured() { + + public ConfiguredSurfaceBuilder configured() { BlockState stone = Blocks.END_STONE.defaultBlockState(); - return this.withConfig(new TernarySurfaceConfig(config1.getTopMaterial(), stone, stone)); + return this.configured(new SurfaceBuilderBaseConfiguration(config1.getTopMaterial(), stone, stone)); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java b/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java index bbe78a14..e9317b48 100644 --- a/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java +++ b/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java @@ -1,44 +1,39 @@ package ru.betterend.world.surface; import java.util.Random; - -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.core.Registry; import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.gen.surfacebuilder.SurfaceBuilder; -import net.minecraft.world.gen.surfacebuilder.TernarySurfaceConfig; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilder; +import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderBaseConfiguration; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; -public class SulphuricSurfaceBuilder extends SurfaceBuilder { +public class SulphuricSurfaceBuilder extends SurfaceBuilder { private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(5123); - + public SulphuricSurfaceBuilder() { - super(TernarySurfaceConfig.CODEC); + super(SurfaceBuilderBaseConfiguration.CODEC); } @Override - public void generate(Random random, Chunk chunk, Biome biome, int x, int z, int height, double noise, - BlockState defaultBlock, BlockState defaultFluid, int seaLevel, long seed, - TernarySurfaceConfig surfaceBlocks) { - double value = NOISE.eval(x * 0.03, z * 0.03) + NOISE.eval(x * 0.1, z * 0.1) * 0.3 - + MHelper.randRange(-0.1, 0.1, MHelper.RANDOM); + public void apply(Random random, ChunkAccess chunk, Biome biome, int x, int z, int height, double noise, BlockState defaultBlock, BlockState defaultFluid, int seaLevel, long seed, SurfaceBuilderBaseConfiguration surfaceBlocks) { + double value = NOISE.eval(x * 0.03, z * 0.03) + NOISE.eval(x * 0.1, z * 0.1) * 0.3 + MHelper.randRange(-0.1, 0.1, MHelper.RANDOM); if (value < -0.6) { - SurfaceBuilder.DEFAULT.generate(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, - seaLevel, seed, SurfaceBuilders.DEFAULT_END_CONFIG); - } else if (value < -0.3) { - SurfaceBuilder.DEFAULT.generate(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, - seaLevel, seed, SurfaceBuilders.FLAVOLITE_CONFIG); - } else if (value < 0.5) { - SurfaceBuilder.DEFAULT.generate(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, - seaLevel, seed, SurfaceBuilders.SULFURIC_ROCK_CONFIG); - } else { - SurfaceBuilder.DEFAULT.generate(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, - seaLevel, seed, SurfaceBuilders.BRIMSTONE_CONFIG); + SurfaceBuilder.DEFAULT.apply(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, seaLevel, seed, SurfaceBuilders.DEFAULT_END_CONFIG); + } + else if (value < -0.3) { + SurfaceBuilder.DEFAULT.apply(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, seaLevel, seed, SurfaceBuilders.FLAVOLITE_CONFIG); + } + else if (value < 0.5) { + SurfaceBuilder.DEFAULT.apply(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, seaLevel, seed, SurfaceBuilders.SULFURIC_ROCK_CONFIG); + } + else { + SurfaceBuilder.DEFAULT.apply(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, seaLevel, seed, SurfaceBuilders.BRIMSTONE_CONFIG); } } - + public static SulphuricSurfaceBuilder register(String name) { return Registry.register(Registry.SURFACE_BUILDER, name, new SulphuricSurfaceBuilder()); } diff --git a/src/main/java/ru/betterend/world/surface/SurfaceBuilders.java b/src/main/java/ru/betterend/world/surface/SurfaceBuilders.java index 2246f34a..b00b12ca 100644 --- a/src/main/java/ru/betterend/world/surface/SurfaceBuilders.java +++ b/src/main/java/ru/betterend/world/surface/SurfaceBuilders.java @@ -1,32 +1,29 @@ package ru.betterend.world.surface; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; import net.minecraft.core.Registry; -import net.minecraft.world.gen.surfacebuilder.SurfaceBuilder; -import net.minecraft.world.gen.surfacebuilder.TernarySurfaceConfig; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilder; +import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderBaseConfiguration; import ru.betterend.registry.EndBlocks; public class SurfaceBuilders { - public static final TernarySurfaceConfig DEFAULT_END_CONFIG = makeSimpleConfig(Blocks.END_STONE); - public static final TernarySurfaceConfig FLAVOLITE_CONFIG = makeSimpleConfig(EndBlocks.FLAVOLITE.stone); - public static final TernarySurfaceConfig BRIMSTONE_CONFIG = makeSimpleConfig(EndBlocks.BRIMSTONE); - public static final TernarySurfaceConfig SULFURIC_ROCK_CONFIG = makeSimpleConfig(EndBlocks.SULPHURIC_ROCK.stone); - - public static final SurfaceBuilder SULPHURIC_SURFACE = register("sulphuric_surface", - new SulphuricSurfaceBuilder()); - - private static SurfaceBuilder register(String name, - SurfaceBuilder builder) { + public static final SurfaceBuilderBaseConfiguration DEFAULT_END_CONFIG = makeSimpleConfig(Blocks.END_STONE); + public static final SurfaceBuilderBaseConfiguration FLAVOLITE_CONFIG = makeSimpleConfig(EndBlocks.FLAVOLITE.stone); + public static final SurfaceBuilderBaseConfiguration BRIMSTONE_CONFIG = makeSimpleConfig(EndBlocks.BRIMSTONE); + public static final SurfaceBuilderBaseConfiguration SULFURIC_ROCK_CONFIG = makeSimpleConfig(EndBlocks.SULPHURIC_ROCK.stone); + + public static final SurfaceBuilder SULPHURIC_SURFACE = register("sulphuric_surface", new SulphuricSurfaceBuilder()); + + private static SurfaceBuilder register(String name, SurfaceBuilder builder) { return Registry.register(Registry.SURFACE_BUILDER, name, builder); } - - private static TernarySurfaceConfig makeSimpleConfig(Block block) { + + private static SurfaceBuilderBaseConfiguration makeSimpleConfig(Block block) { BlockState state = block.defaultBlockState(); - return new TernarySurfaceConfig(state, state, state); - } - - public static void register() { + return new SurfaceBuilderBaseConfiguration(state, state, state); } + + public static void register() {} } From de3bc706bd7fdef62a46d3fa567a9d822eb8e87b Mon Sep 17 00:00:00 2001 From: Aleksey Date: Wed, 14 Apr 2021 09:31:07 +0300 Subject: [PATCH 412/463] Continue migration --- .../java/ru/betterend/effects/EndPotions.java | 6 ++--- .../java/ru/betterend/item/EndArmorItem.java | 6 ++--- .../mixin/common/AbstractBlockMixin.java | 2 +- .../mixin/common/AnvilBlockMixin.java | 4 +-- .../mixin/common/AnvilScreenHandlerMixin.java | 10 +++---- .../mixin/common/ArmorItemAccessor.java | 12 ++++----- .../mixin/common/BiomeArrayMixin.java | 18 ++++++------- .../mixin/common/BoneMealItemMixin.java | 26 +++++++++---------- .../mixin/common/BrewingAccessor.java | 2 +- .../mixin/common/ChorusFlowerBlockMixin.java | 20 +++++++------- .../mixin/common/TagGroupLoaderMixin.java | 6 ++--- 11 files changed, 56 insertions(+), 56 deletions(-) diff --git a/src/main/java/ru/betterend/effects/EndPotions.java b/src/main/java/ru/betterend/effects/EndPotions.java index e0a91270..86ab156b 100644 --- a/src/main/java/ru/betterend/effects/EndPotions.java +++ b/src/main/java/ru/betterend/effects/EndPotions.java @@ -24,8 +24,8 @@ public class EndPotions { } public static void register() { - BrewingAccessor.callRegisterPotionRecipe(Potions.AWKWARD, EndItems.ENDER_DUST, END_VEIL); - BrewingAccessor.callRegisterPotionRecipe(END_VEIL, Items.REDSTONE, LONG_END_VEIL); - BrewingAccessor.callRegisterPotionRecipe(Potions.AWKWARD, EndBlocks.MURKWEED.asItem(), Potions.NIGHT_VISION); + BrewingAccessor.callAddMix(Potions.AWKWARD, EndItems.ENDER_DUST, END_VEIL); + BrewingAccessor.callAddMix(END_VEIL, Items.REDSTONE, LONG_END_VEIL); + BrewingAccessor.callAddMix(Potions.AWKWARD, EndBlocks.MURKWEED.asItem(), Potions.NIGHT_VISION); } } diff --git a/src/main/java/ru/betterend/item/EndArmorItem.java b/src/main/java/ru/betterend/item/EndArmorItem.java index 4c98eb68..0f04de3e 100644 --- a/src/main/java/ru/betterend/item/EndArmorItem.java +++ b/src/main/java/ru/betterend/item/EndArmorItem.java @@ -27,20 +27,20 @@ public class EndArmorItem extends ArmorItem implements Patterned { return; } - Multimap attributeModifiers = accessor.be_getAttributeModifiers(); + Multimap attributeModifiers = accessor.getDefaultModifiers(); // In case Mojang or anyone else decided to fix this if (attributeModifiers.keys().contains(Attributes.KNOCKBACK_RESISTANCE)) { return; } - UUID uuid = accessor.be_getModifiers()[slot.getIndex()]; + UUID uuid = accessor.getModifiers()[slot.getIndex()]; // Rebuild attributeModifiers to include knockback resistance ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); builder.putAll(attributeModifiers); builder.put(Attributes.KNOCKBACK_RESISTANCE, new AttributeModifier(uuid, "Armor knockback resistance", knockbackResistance, AttributeModifier.Operation.ADDITION)); - accessor.be_setAttributeModifiers(builder.build()); + accessor.setDefaultModifiers(builder.build()); } @Override diff --git a/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java b/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java index c7f32c8d..369f0a72 100644 --- a/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java @@ -23,7 +23,7 @@ import ru.betterend.util.MHelper; @Mixin(BlockBehaviour.class) public abstract class AbstractBlockMixin { - @Inject(method = "getDroppedStacks", at = @At("HEAD"), cancellable = true) + @Inject(method = "getDrops", at = @At("HEAD"), cancellable = true) public void be_getDroppedStacks(BlockState state, LootContext.Builder builder, CallbackInfoReturnable> info) { if (state.is(Blocks.GLOWSTONE)) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); diff --git a/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java index 19b4f081..46d69ce5 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java @@ -11,8 +11,8 @@ import ru.betterend.blocks.basis.EndAnvilBlock; @Mixin(AnvilBlock.class) public class AnvilBlockMixin { - @Inject(method = "getLandingState", at = @At("HEAD"), cancellable = true) - private static void be_getLandingState(BlockState fallingState, CallbackInfoReturnable info) { + @Inject(method = "damage", at = @At("HEAD"), cancellable = true) + private static void be_damage(BlockState fallingState, CallbackInfoReturnable info) { if (fallingState.getBlock() instanceof EndAnvilBlock) { IntegerProperty destructionProperty = ((EndAnvilBlock) fallingState.getBlock()).getDestructionProperty(); int destruction = fallingState.getValue(destructionProperty); diff --git a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java index 28ad1cf7..5df5f766 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java @@ -37,7 +37,7 @@ public abstract class AnvilScreenHandlerMixin extends ItemCombinerMenu implement super(MenuType.ANVIL, syncId, playerInventory, ContainerLevelAccess.NULL); } - @Inject(method = "(ILnet/minecraft/entity/player/PlayerInventory;Lnet/minecraft/screen/ScreenHandlerContext;)V", + @Inject(method = "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/inventory/ContainerLevelAccess;)V", at = @At("TAIL")) public void be_initAnvilLevel(int syncId, Inventory inventory, ContainerLevelAccess context, CallbackInfo info) { if (context != ContainerLevelAccess.NULL) { @@ -57,14 +57,14 @@ public abstract class AnvilScreenHandlerMixin extends ItemCombinerMenu implement @Shadow public abstract void createResult(); - @Inject(method = "canTakeOutput", at = @At("HEAD"), cancellable = true) + @Inject(method = "mayPickup", at = @At("HEAD"), cancellable = true) protected void be_canTakeOutput(Player player, boolean present, CallbackInfoReturnable info) { if (be_currentRecipe != null) { info.setReturnValue(be_currentRecipe.checkHammerDurability(inputSlots, player)); } } - @Inject(method = "onTakeOutput", at = @At("HEAD"), cancellable = true) + @Inject(method = "onTake", at = @At("HEAD"), cancellable = true) protected void be_onTakeOutput(Player player, ItemStack stack, CallbackInfoReturnable info) { if (be_currentRecipe != null) { this.inputSlots.getItem(0).shrink(be_currentRecipe.getInputCount()); @@ -89,7 +89,7 @@ public abstract class AnvilScreenHandlerMixin extends ItemCombinerMenu implement } } - @Inject(method = "updateResult", at = @At("HEAD"), cancellable = true) + @Inject(method = "createResult", at = @At("HEAD"), cancellable = true) public void be_updateOutput(CallbackInfo info) { RecipeManager recipeManager = this.player.level.getRecipeManager(); be_recipes = recipeManager.getRecipesFor(AnvilRecipe.TYPE, inputSlots, player.level); @@ -109,7 +109,7 @@ public abstract class AnvilScreenHandlerMixin extends ItemCombinerMenu implement } } - @Inject(method = "setNewItemName", at = @At("HEAD"), cancellable = true) + @Inject(method = "setItemName", at = @At("HEAD"), cancellable = true) public void be_setNewItemName(String string, CallbackInfo info) { if (be_currentRecipe != null) { info.cancel(); diff --git a/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java b/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java index ce903a6e..f91eed33 100644 --- a/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java @@ -11,12 +11,12 @@ import com.google.common.collect.Multimap; @Mixin(ArmorItem.class) public interface ArmorItemAccessor { - @Accessor("MODIFIERS") - UUID[] be_getModifiers(); + @Accessor("ARMOR_MODIFIER_UUID_PER_SLOT") + UUID[] getModifiers(); - @Accessor("attributeModifiers") - Multimap be_getAttributeModifiers(); + @Accessor("defaultModifiers") + Multimap getDefaultModifiers(); - @Accessor("attributeModifiers") - void be_setAttributeModifiers(Multimap attributeModifiers); + @Accessor("defaultModifiers") + void setDefaultModifiers(Multimap attributeModifiers); } diff --git a/src/main/java/ru/betterend/mixin/common/BiomeArrayMixin.java b/src/main/java/ru/betterend/mixin/common/BiomeArrayMixin.java index 13da34e7..7ee5b484 100644 --- a/src/main/java/ru/betterend/mixin/common/BiomeArrayMixin.java +++ b/src/main/java/ru/betterend/mixin/common/BiomeArrayMixin.java @@ -13,19 +13,19 @@ import ru.betterend.interfaces.IBiomeArray; public class BiomeArrayMixin implements IBiomeArray { @Final @Shadow - private Biome[] data; + private Biome[] biomes; @Final @Shadow - private static int HORIZONTAL_SECTION_COUNT; + private static int WIDTH_BITS; @Final @Shadow - public static int HORIZONTAL_BIT_MASK; + public static int HORIZONTAL_MASK; @Final @Shadow - public static int VERTICAL_BIT_MASK; + public static int VERTICAL_MASK; @Override public void setBiome(Biome biome, BlockPos pos) { @@ -33,13 +33,13 @@ public class BiomeArrayMixin implements IBiomeArray { int biomeY = pos.getY() >> 2; int biomeZ = pos.getZ() >> 2; int index = be_getArrayIndex(biomeX, biomeY, biomeZ); - data[index] = biome; + biomes[index] = biome; } private int be_getArrayIndex(int biomeX, int biomeY, int biomeZ) { - int i = biomeX & HORIZONTAL_BIT_MASK; - int j = Mth.clamp(biomeY, 0, VERTICAL_BIT_MASK); - int k = biomeZ & HORIZONTAL_BIT_MASK; - return j << HORIZONTAL_SECTION_COUNT + HORIZONTAL_SECTION_COUNT | k << HORIZONTAL_SECTION_COUNT | i; + int i = biomeX & HORIZONTAL_MASK; + int j = Mth.clamp(biomeY, 0, VERTICAL_MASK); + int k = biomeZ & HORIZONTAL_MASK; + return j << WIDTH_BITS + WIDTH_BITS | k << WIDTH_BITS | i; } } diff --git a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java index aaf77045..29bd14f5 100644 --- a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java +++ b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java @@ -28,7 +28,7 @@ public class BoneMealItemMixin { private static final Direction[] DIR = BlocksHelper.makeHorizontal(); private static final MutableBlockPos POS = new MutableBlockPos(); - @Inject(method = "useOnBlock", at = @At("HEAD"), cancellable = true) + @Inject(method = "useOn", at = @At("HEAD"), cancellable = true) private void be_onUse(UseOnContext context, CallbackInfoReturnable info) { Level world = context.getLevel(); BlockPos blockPos = context.getClickedPos(); @@ -39,7 +39,7 @@ public class BoneMealItemMixin { if (world.getBlockState(blockPos).is(EndTags.END_GROUND)) { boolean consume = false; if (world.getBlockState(blockPos).is(Blocks.END_STONE)) { - BlockState nylium = beGetNylium(world, blockPos); + BlockState nylium = be_getNylium(world, blockPos); if (nylium != null) { BlocksHelper.setWithoutUpdate(world, blockPos, nylium); consume = true; @@ -48,11 +48,11 @@ public class BoneMealItemMixin { else { if (!world.getFluidState(offseted).isEmpty() && endBiome) { if (world.getBlockState(offseted).getBlock().equals(Blocks.WATER)) { - consume = beGrowWaterGrass(world, blockPos); + consume = be_growWaterGrass(world, blockPos); } } else { - consume = beGrowGrass(world, blockPos); + consume = be_growGrass(world, blockPos); } } if (consume) { @@ -73,7 +73,7 @@ public class BoneMealItemMixin { } } - private boolean beGrowGrass(Level world, BlockPos pos) { + private boolean be_growGrass(Level world, BlockPos pos) { int y1 = pos.getY() + 3; int y2 = pos.getY() - 3; boolean result = false; @@ -86,7 +86,7 @@ public class BoneMealItemMixin { POS.setY(y); BlockPos down = POS.below(); if (world.isEmptyBlock(POS) && !world.isEmptyBlock(down)) { - BlockState grass = beGetGrassState(world, down); + BlockState grass = be_getGrassState(world, down); if (grass != null) { BlocksHelper.setWithoutUpdate(world, POS, grass); result = true; @@ -98,7 +98,7 @@ public class BoneMealItemMixin { return result; } - private boolean beGrowWaterGrass(Level world, BlockPos pos) { + private boolean be_growWaterGrass(Level world, BlockPos pos) { int y1 = pos.getY() + 3; int y2 = pos.getY() - 3; boolean result = false; @@ -111,7 +111,7 @@ public class BoneMealItemMixin { POS.setY(y); BlockPos down = POS.below(); if (world.getBlockState(POS).is(Blocks.WATER) && world.getBlockState(down).is(EndTags.END_GROUND)) { - BlockState grass = beGetWaterGrassState(world, down); + BlockState grass = be_getWaterGrassState(world, down); if (grass != null) { BlocksHelper.setWithoutUpdate(world, POS, grass); result = true; @@ -123,14 +123,14 @@ public class BoneMealItemMixin { return result; } - private BlockState beGetGrassState(Level world, BlockPos pos) { + private BlockState be_getGrassState(Level world, BlockPos pos) { BlockState state = world.getBlockState(pos); Block block = state.getBlock(); block = BonemealUtil.getGrass(EndBiomes.getBiomeID(world.getBiome(pos)), block, world.getRandom()); return block == null ? null : block.defaultBlockState(); } - private BlockState beGetWaterGrassState(Level world, BlockPos pos) { + private BlockState be_getWaterGrassState(Level world, BlockPos pos) { EndBiome biome = EndBiomes.getFromBiome(world.getBiome(pos)); if (world.random.nextInt(16) == 0) { return EndBlocks.CHARNIA_RED.defaultBlockState(); @@ -147,7 +147,7 @@ public class BoneMealItemMixin { return null; } - private void beShuffle(Random random) { + private void be_shuffle(Random random) { for (int i = 0; i < 4; i++) { int j = random.nextInt(4); Direction d = DIR[i]; @@ -156,8 +156,8 @@ public class BoneMealItemMixin { } } - private BlockState beGetNylium(Level world, BlockPos pos) { - beShuffle(world.random); + private BlockState be_getNylium(Level world, BlockPos pos) { + be_shuffle(world.random); for (Direction dir : DIR) { BlockState state = world.getBlockState(pos.relative(dir)); if (BlocksHelper.isEndNylium(state)) diff --git a/src/main/java/ru/betterend/mixin/common/BrewingAccessor.java b/src/main/java/ru/betterend/mixin/common/BrewingAccessor.java index 0093c018..f1987282 100644 --- a/src/main/java/ru/betterend/mixin/common/BrewingAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/BrewingAccessor.java @@ -9,7 +9,7 @@ import org.spongepowered.asm.mixin.gen.Invoker; @Mixin(PotionBrewing.class) public interface BrewingAccessor { @Invoker - static void callRegisterPotionRecipe(Potion input, Item item, Potion output) { + static void callAddMix(Potion input, Item item, Potion output) { throw new AssertionError("@Invoker dummy body called"); } } diff --git a/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java index 570963f9..87a40f52 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java @@ -42,8 +42,8 @@ public abstract class ChorusFlowerBlockMixin extends Block { @Final private ChorusPlantBlock plantBlock; - @Inject(method = "canPlaceAt", at = @At("HEAD"), cancellable = true) - private void beCanPlace(BlockState state, LevelReader world, BlockPos pos, CallbackInfoReturnable info) { + @Inject(method = "canSurvive", at = @At("HEAD"), cancellable = true) + private void be_canPlace(BlockState state, LevelReader world, BlockPos pos, CallbackInfoReturnable info) { if (world.getBlockState(pos.below()).is(EndBlocks.CHORUS_NYLIUM)) { info.setReturnValue(true); info.cancel(); @@ -51,13 +51,13 @@ public abstract class ChorusFlowerBlockMixin extends Block { } @Inject(method = "randomTick", at = @At("HEAD"), cancellable = true) - private void beOnTick(BlockState state, ServerLevel world, BlockPos pos, Random random, CallbackInfo info) { + private void be_onTick(BlockState state, ServerLevel world, BlockPos pos, Random random, CallbackInfo info) { if (world.getBlockState(pos.below()).is(EndTags.END_GROUND)) { BlockPos up = pos.above(); if (world.isEmptyBlock(up) && up.getY() < 256) { int i = state.getValue(ChorusFlowerBlock.AGE); if (i < 5) { - this.grow(world, up, i + 1); + this.placeGrownFlower(world, up, i + 1); if (GeneratorOptions.changeChorusPlant()) { BlocksHelper.setWithoutUpdate(world, pos, plantBlock.defaultBlockState().setValue(ChorusPlantBlock.UP, true).setValue(ChorusPlantBlock.DOWN, true).setValue(BlocksHelper.ROOTS, true)); } @@ -70,8 +70,8 @@ public abstract class ChorusFlowerBlockMixin extends Block { } } - @Inject(method = "generate", at = @At("RETURN"), cancellable = true) - private static void beOnGenerate(LevelAccessor world, BlockPos pos, Random random, int size, CallbackInfo info) { + @Inject(method = "generatePlant", at = @At("RETURN"), cancellable = true) + private static void be_onGeneratePlant(LevelAccessor world, BlockPos pos, Random random, int size, CallbackInfo info) { BlockState state = world.getBlockState(pos); if (GeneratorOptions.changeChorusPlant() && state.is(Blocks.CHORUS_PLANT)) { BlocksHelper.setWithoutUpdate(world, pos, state.setValue(BlocksHelper.ROOTS, true)); @@ -79,13 +79,13 @@ public abstract class ChorusFlowerBlockMixin extends Block { } @Shadow - private static boolean isSurroundedByAir(LevelReader world, BlockPos pos, @Nullable Direction exceptDirection) { return false; } + private static boolean allNeighborsEmpty(LevelReader world, BlockPos pos, @Nullable Direction exceptDirection) { return false; } @Shadow - private void grow(Level world, BlockPos pos, int age) {} + private void placeGrownFlower(Level world, BlockPos pos, int age) {} @Shadow - private void die(Level world, BlockPos pos) {} + private void placeDeadFlower(Level world, BlockPos pos) {} @Override public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { @@ -98,7 +98,7 @@ public abstract class ChorusFlowerBlockMixin extends Block { } @Inject(method = "die", at = @At("HEAD"), cancellable = true) - private void beOnDie(Level world, BlockPos pos, CallbackInfo info) { + private void be_onDie(Level world, BlockPos pos, CallbackInfo info) { BlockState down = world.getBlockState(pos.below()); if (down.is(Blocks.CHORUS_PLANT) || down.is(EndTags.GEN_TERRAIN)) { world.setBlock(pos, this.defaultBlockState().setValue(BlockStateProperties.AGE_5, 5), 2); diff --git a/src/main/java/ru/betterend/mixin/common/TagGroupLoaderMixin.java b/src/main/java/ru/betterend/mixin/common/TagGroupLoaderMixin.java index 825d68be..bb201c67 100644 --- a/src/main/java/ru/betterend/mixin/common/TagGroupLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/common/TagGroupLoaderMixin.java @@ -20,13 +20,13 @@ public class TagGroupLoaderMixin { @Shadow private String entryType; - @Inject(method = "prepareReload", at = @At("RETURN"), cancellable = true) - public void be_prepareReload(ResourceManager manager, Executor prepareExecutor, CallbackInfoReturnable>> info) { + @Inject(method = "prepare", at = @At("RETURN"), cancellable = true) + public void be_prepareReload(ResourceManager manager, Executor executor, CallbackInfoReturnable>> info) { CompletableFuture> future = info.getReturnValue(); info.setReturnValue(CompletableFuture.supplyAsync(() -> { Map map = future.join(); TagHelper.apply(entryType, map); return map; - })); + }, executor)); } } From 2a8853d6155df37d00c3ef3dc271d2a4b0066b49 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 15 Apr 2021 01:16:53 +0300 Subject: [PATCH 413/463] Server mixins update --- .../ru/betterend/blocks/EndPortalBlock.java | 4 +- .../java/ru/betterend/effects/EndPotions.java | 8 +-- .../ru/betterend/entity/EndSlimeEntity.java | 2 +- .../ru/betterend/interfaces/IBiomeArray.java | 2 +- .../java/ru/betterend/interfaces/ISlime.java | 2 +- .../interfaces/TeleportingEntity.java | 6 +- .../java/ru/betterend/item/EndArmorItem.java | 6 +- ...nHandlerMixin.java => AnvilMenuMixin.java} | 8 +-- .../mixin/common/ArmorItemAccessor.java | 44 ++++++------- ...a => BiomeGenerationSettingsAccessor.java} | 14 ++--- ...ockMixin.java => BlockBehaviourMixin.java} | 3 +- .../mixin/common/ChorusFlowerBlockMixin.java | 10 +-- .../mixin/common/ChorusPlantBlockMixin.java | 20 +++--- .../mixin/common/ChorusPlantFeatureMixin.java | 4 +- ...xin.java => ChunkBiomeContainerMixin.java} | 4 +- .../mixin/common/ComposterBlockAccessor.java | 2 +- ...ndlerMixin.java => CraftingMenuMixin.java} | 7 +-- .../mixin/common/DimensionTypeMixin.java | 4 +- ...erMixin.java => EnchantmentMenuMixin.java} | 50 +++++++-------- .../mixin/common/EndCityFeatureMixin.java | 10 +-- ...eMixin.java => EndPodiumFeatureMixin.java} | 12 ++-- ...manEntityMixin.java => EnderManMixin.java} | 7 +-- .../betterend/mixin/common/EntityMixin.java | 27 ++++---- .../mixin/common/LivingEntityMixin.java | 10 ++- .../mixin/common/MinecraftServerMixin.java | 54 ++++++++-------- ...tileEntityMixin.java => MonsterMixin.java} | 6 +- ...ava => NoiseBasedChunkGeneratorMixin.java} | 17 +++-- ...ixin.java => PlayerAdvancementsMixin.java} | 53 ++++++++-------- ...ManagerMixin.java => PlayerListMixin.java} | 44 ++++++------- ...layerEntityMixin.java => PlayerMixin.java} | 20 +++--- ...cessor.java => PotionBrewingAccessor.java} | 2 +- .../mixin/common/RecipeManagerAccessor.java | 4 +- .../mixin/common/RecipeManagerMixin.java | 4 +- ...rWorldMixin.java => ServerLevelMixin.java} | 6 +- ...ntityMixin.java => ServerPlayerMixin.java} | 63 +++++++++---------- ...{SlimeEntityMixin.java => SlimeMixin.java} | 4 +- ...atureMixin.java => SpikeFeatureMixin.java} | 10 +-- ...upLoaderMixin.java => TagLoaderMixin.java} | 3 +- .../java/ru/betterend/registry/EndTags.java | 6 +- .../ru/betterend/util/FeaturesHelper.java | 12 ++-- .../terrain/caves/EndCaveFeature.java | 2 +- .../resources/betterend.mixins.common.json | 42 ++++++------- 42 files changed, 302 insertions(+), 316 deletions(-) rename src/main/java/ru/betterend/mixin/common/{AnvilScreenHandlerMixin.java => AnvilMenuMixin.java} (93%) rename src/main/java/ru/betterend/mixin/common/{GenerationSettingsAccessor.java => BiomeGenerationSettingsAccessor.java} (53%) rename src/main/java/ru/betterend/mixin/common/{AbstractBlockMixin.java => BlockBehaviourMixin.java} (95%) rename src/main/java/ru/betterend/mixin/common/{BiomeArrayMixin.java => ChunkBiomeContainerMixin.java} (86%) rename src/main/java/ru/betterend/mixin/common/{CraftingScreenHandlerMixin.java => CraftingMenuMixin.java} (78%) rename src/main/java/ru/betterend/mixin/common/{EnchantmentScreenHandlerMixin.java => EnchantmentMenuMixin.java} (67%) rename src/main/java/ru/betterend/mixin/common/{EndPortalFeatureMixin.java => EndPodiumFeatureMixin.java} (81%) rename src/main/java/ru/betterend/mixin/common/{EndermanEntityMixin.java => EnderManMixin.java} (77%) rename src/main/java/ru/betterend/mixin/common/{HostileEntityMixin.java => MonsterMixin.java} (73%) rename src/main/java/ru/betterend/mixin/common/{NoiseChunkGeneratorMixin.java => NoiseBasedChunkGeneratorMixin.java} (60%) rename src/main/java/ru/betterend/mixin/common/{PlayerAdvancementTrackerMixin.java => PlayerAdvancementsMixin.java} (62%) rename src/main/java/ru/betterend/mixin/common/{PlayerManagerMixin.java => PlayerListMixin.java} (82%) rename src/main/java/ru/betterend/mixin/common/{PlayerEntityMixin.java => PlayerMixin.java} (65%) rename src/main/java/ru/betterend/mixin/common/{BrewingAccessor.java => PotionBrewingAccessor.java} (88%) rename src/main/java/ru/betterend/mixin/common/{ServerWorldMixin.java => ServerLevelMixin.java} (92%) rename src/main/java/ru/betterend/mixin/common/{ServerPlayerEntityMixin.java => ServerPlayerMixin.java} (64%) rename src/main/java/ru/betterend/mixin/common/{SlimeEntityMixin.java => SlimeMixin.java} (73%) rename src/main/java/ru/betterend/mixin/common/{EndSpikeFeatureMixin.java => SpikeFeatureMixin.java} (89%) rename src/main/java/ru/betterend/mixin/common/{TagGroupLoaderMixin.java => TagLoaderMixin.java} (94%) diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index 3fc80413..5ae29c24 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -95,7 +95,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable teleportPlayer(player, destination, exitPos); } else { TeleportingEntity teleEntity = (TeleportingEntity) entity; - teleEntity.beSetExitPos(exitPos); + teleEntity.be_setExitPos(exitPos); Entity teleported = entity.changeDimension(destination); if (teleported != null) { teleported.setPortalCooldown(); @@ -113,7 +113,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable player.teleportTo(destination, exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5, player.yRot, player.xRot); } else { TeleportingEntity teleEntity = (TeleportingEntity) player; - teleEntity.beSetExitPos(exitPos); + teleEntity.be_setExitPos(exitPos); player.changeDimension(destination); } } diff --git a/src/main/java/ru/betterend/effects/EndPotions.java b/src/main/java/ru/betterend/effects/EndPotions.java index 86ab156b..64608d37 100644 --- a/src/main/java/ru/betterend/effects/EndPotions.java +++ b/src/main/java/ru/betterend/effects/EndPotions.java @@ -7,7 +7,7 @@ import net.minecraft.world.item.Items; import net.minecraft.world.item.alchemy.Potion; import net.minecraft.world.item.alchemy.Potions; import ru.betterend.BetterEnd; -import ru.betterend.mixin.common.BrewingAccessor; +import ru.betterend.mixin.common.PotionBrewingAccessor; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; @@ -24,8 +24,8 @@ public class EndPotions { } public static void register() { - BrewingAccessor.callAddMix(Potions.AWKWARD, EndItems.ENDER_DUST, END_VEIL); - BrewingAccessor.callAddMix(END_VEIL, Items.REDSTONE, LONG_END_VEIL); - BrewingAccessor.callAddMix(Potions.AWKWARD, EndBlocks.MURKWEED.asItem(), Potions.NIGHT_VISION); + PotionBrewingAccessor.callAddMix(Potions.AWKWARD, EndItems.ENDER_DUST, END_VEIL); + PotionBrewingAccessor.callAddMix(END_VEIL, Items.REDSTONE, LONG_END_VEIL); + PotionBrewingAccessor.callAddMix(Potions.AWKWARD, EndBlocks.MURKWEED.asItem(), Potions.NIGHT_VISION); } } diff --git a/src/main/java/ru/betterend/entity/EndSlimeEntity.java b/src/main/java/ru/betterend/entity/EndSlimeEntity.java index f23f8c99..bf1a8227 100644 --- a/src/main/java/ru/betterend/entity/EndSlimeEntity.java +++ b/src/main/java/ru/betterend/entity/EndSlimeEntity.java @@ -141,7 +141,7 @@ public class EndSlimeEntity extends Slime { slimeEntity.setCustomName(text); slimeEntity.setNoAi(bl); slimeEntity.setInvulnerable(this.isInvulnerable()); - ((ISlime) slimeEntity).beSetSlimeSize(j, true); + ((ISlime) slimeEntity).be_setSlimeSize(j, true); slimeEntity.refreshDimensions(); slimeEntity.moveTo(this.getX() + (double) g, this.getY() + 0.5D, this.getZ() + (double) h, this.random.nextFloat() * 360.0F, 0.0F); this.level.addFreshEntity(slimeEntity); diff --git a/src/main/java/ru/betterend/interfaces/IBiomeArray.java b/src/main/java/ru/betterend/interfaces/IBiomeArray.java index a4fce686..9c632b6d 100644 --- a/src/main/java/ru/betterend/interfaces/IBiomeArray.java +++ b/src/main/java/ru/betterend/interfaces/IBiomeArray.java @@ -4,5 +4,5 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.biome.Biome; public interface IBiomeArray { - public void setBiome(Biome biome, BlockPos pos); + public void be_setBiome(Biome biome, BlockPos pos); } diff --git a/src/main/java/ru/betterend/interfaces/ISlime.java b/src/main/java/ru/betterend/interfaces/ISlime.java index 6d7abb63..7df19bc6 100644 --- a/src/main/java/ru/betterend/interfaces/ISlime.java +++ b/src/main/java/ru/betterend/interfaces/ISlime.java @@ -1,5 +1,5 @@ package ru.betterend.interfaces; public interface ISlime { - public void beSetSlimeSize(int size, boolean heal); + public void be_setSlimeSize(int size, boolean heal); } diff --git a/src/main/java/ru/betterend/interfaces/TeleportingEntity.java b/src/main/java/ru/betterend/interfaces/TeleportingEntity.java index 29a6c466..cfd23f30 100644 --- a/src/main/java/ru/betterend/interfaces/TeleportingEntity.java +++ b/src/main/java/ru/betterend/interfaces/TeleportingEntity.java @@ -3,7 +3,7 @@ package ru.betterend.interfaces; import net.minecraft.core.BlockPos; public interface TeleportingEntity { - void beSetExitPos(BlockPos pos); - void beResetExitPos(); - boolean beCanTeleport(); + void be_setExitPos(BlockPos pos); + void be_resetExitPos(); + boolean be_canTeleport(); } diff --git a/src/main/java/ru/betterend/item/EndArmorItem.java b/src/main/java/ru/betterend/item/EndArmorItem.java index 0f04de3e..cc4faf42 100644 --- a/src/main/java/ru/betterend/item/EndArmorItem.java +++ b/src/main/java/ru/betterend/item/EndArmorItem.java @@ -27,20 +27,20 @@ public class EndArmorItem extends ArmorItem implements Patterned { return; } - Multimap attributeModifiers = accessor.getDefaultModifiers(); + Multimap attributeModifiers = accessor.be_getDefaultModifiers(); // In case Mojang or anyone else decided to fix this if (attributeModifiers.keys().contains(Attributes.KNOCKBACK_RESISTANCE)) { return; } - UUID uuid = accessor.getModifiers()[slot.getIndex()]; + UUID uuid = accessor.be_getModifiers()[slot.getIndex()]; // Rebuild attributeModifiers to include knockback resistance ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); builder.putAll(attributeModifiers); builder.put(Attributes.KNOCKBACK_RESISTANCE, new AttributeModifier(uuid, "Armor knockback resistance", knockbackResistance, AttributeModifier.Operation.ADDITION)); - accessor.setDefaultModifiers(builder.build()); + accessor.be_setDefaultModifiers(builder.build()); } @Override diff --git a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java similarity index 93% rename from src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java rename to src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java index 5df5f766..48cf2e5b 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java @@ -27,18 +27,16 @@ import ru.betterend.interfaces.AnvilScreenHandlerExtended; import ru.betterend.recipe.builders.AnvilRecipe; @Mixin(AnvilMenu.class) -public abstract class AnvilScreenHandlerMixin extends ItemCombinerMenu implements AnvilScreenHandlerExtended { - +public abstract class AnvilMenuMixin extends ItemCombinerMenu implements AnvilScreenHandlerExtended { private List be_recipes = Collections.emptyList(); private AnvilRecipe be_currentRecipe; private DataSlot anvilLevel; - public AnvilScreenHandlerMixin(int syncId, Inventory playerInventory) { + public AnvilMenuMixin(int syncId, Inventory playerInventory) { super(MenuType.ANVIL, syncId, playerInventory, ContainerLevelAccess.NULL); } - @Inject(method = "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/inventory/ContainerLevelAccess;)V", - at = @At("TAIL")) + @Inject(method = "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/inventory/ContainerLevelAccess;)V", at = @At("TAIL")) public void be_initAnvilLevel(int syncId, Inventory inventory, ContainerLevelAccess context, CallbackInfo info) { if (context != ContainerLevelAccess.NULL) { int anvLevel = context.evaluate((world, blockPos) -> { diff --git a/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java b/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java index f91eed33..33f8224a 100644 --- a/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java @@ -1,22 +1,22 @@ -package ru.betterend.mixin.common; - -import java.util.UUID; -import net.minecraft.world.entity.ai.attributes.Attribute; -import net.minecraft.world.entity.ai.attributes.AttributeModifier; -import net.minecraft.world.item.ArmorItem; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import com.google.common.collect.Multimap; - -@Mixin(ArmorItem.class) -public interface ArmorItemAccessor { - @Accessor("ARMOR_MODIFIER_UUID_PER_SLOT") - UUID[] getModifiers(); - - @Accessor("defaultModifiers") - Multimap getDefaultModifiers(); - - @Accessor("defaultModifiers") - void setDefaultModifiers(Multimap attributeModifiers); -} +package ru.betterend.mixin.common; + +import java.util.UUID; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.item.ArmorItem; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import com.google.common.collect.Multimap; + +@Mixin(ArmorItem.class) +public interface ArmorItemAccessor { + @Accessor("ARMOR_MODIFIER_UUID_PER_SLOT") + UUID[] be_getModifiers(); + + @Accessor("defaultModifiers") + Multimap be_getDefaultModifiers(); + + @Accessor("defaultModifiers") + void be_setDefaultModifiers(Multimap attributeModifiers); +} diff --git a/src/main/java/ru/betterend/mixin/common/GenerationSettingsAccessor.java b/src/main/java/ru/betterend/mixin/common/BiomeGenerationSettingsAccessor.java similarity index 53% rename from src/main/java/ru/betterend/mixin/common/GenerationSettingsAccessor.java rename to src/main/java/ru/betterend/mixin/common/BiomeGenerationSettingsAccessor.java index f368415e..47bc7b98 100644 --- a/src/main/java/ru/betterend/mixin/common/GenerationSettingsAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/BiomeGenerationSettingsAccessor.java @@ -9,16 +9,16 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(BiomeGenerationSettings.class) -public interface GenerationSettingsAccessor { +public interface BiomeGenerationSettingsAccessor { @Accessor("features") - List>>> beGetFeatures(); + List>>> be_getFeatures(); @Accessor("features") - void beSetFeatures(List>>> features); + void be_setFeatures(List>>> features); - @Accessor("structureFeatures") - List>> beGetStructures(); + @Accessor("structureStarts") + List>> be_getStructures(); - @Accessor("structureFeatures") - void beSetStructures(List>> structures); + @Accessor("structureStarts") + void be_setStructures(List>> structures); } diff --git a/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java b/src/main/java/ru/betterend/mixin/common/BlockBehaviourMixin.java similarity index 95% rename from src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java rename to src/main/java/ru/betterend/mixin/common/BlockBehaviourMixin.java index 369f0a72..a0953f41 100644 --- a/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/BlockBehaviourMixin.java @@ -21,8 +21,7 @@ import ru.betterend.item.tool.EndHammerItem; import ru.betterend.util.MHelper; @Mixin(BlockBehaviour.class) -public abstract class AbstractBlockMixin { - +public abstract class BlockBehaviourMixin { @Inject(method = "getDrops", at = @At("HEAD"), cancellable = true) public void be_getDroppedStacks(BlockState state, LootContext.Builder builder, CallbackInfoReturnable> info) { if (state.is(Blocks.GLOWSTONE)) { diff --git a/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java index 87a40f52..2e364740 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java @@ -43,7 +43,7 @@ public abstract class ChorusFlowerBlockMixin extends Block { private ChorusPlantBlock plantBlock; @Inject(method = "canSurvive", at = @At("HEAD"), cancellable = true) - private void be_canPlace(BlockState state, LevelReader world, BlockPos pos, CallbackInfoReturnable info) { + private void be_canSurvive(BlockState state, LevelReader world, BlockPos pos, CallbackInfoReturnable info) { if (world.getBlockState(pos.below()).is(EndBlocks.CHORUS_NYLIUM)) { info.setReturnValue(true); info.cancel(); @@ -51,7 +51,7 @@ public abstract class ChorusFlowerBlockMixin extends Block { } @Inject(method = "randomTick", at = @At("HEAD"), cancellable = true) - private void be_onTick(BlockState state, ServerLevel world, BlockPos pos, Random random, CallbackInfo info) { + private void be_randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random, CallbackInfo info) { if (world.getBlockState(pos.below()).is(EndTags.END_GROUND)) { BlockPos up = pos.above(); if (world.isEmptyBlock(up) && up.getY() < 256) { @@ -71,7 +71,7 @@ public abstract class ChorusFlowerBlockMixin extends Block { } @Inject(method = "generatePlant", at = @At("RETURN"), cancellable = true) - private static void be_onGeneratePlant(LevelAccessor world, BlockPos pos, Random random, int size, CallbackInfo info) { + private static void be_generatePlant(LevelAccessor world, BlockPos pos, Random random, int size, CallbackInfo info) { BlockState state = world.getBlockState(pos); if (GeneratorOptions.changeChorusPlant() && state.is(Blocks.CHORUS_PLANT)) { BlocksHelper.setWithoutUpdate(world, pos, state.setValue(BlocksHelper.ROOTS, true)); @@ -97,8 +97,8 @@ public abstract class ChorusFlowerBlockMixin extends Block { } } - @Inject(method = "die", at = @At("HEAD"), cancellable = true) - private void be_onDie(Level world, BlockPos pos, CallbackInfo info) { + @Inject(method = "placeDeadFlower", at = @At("HEAD"), cancellable = true) + private void be_placeDeadFlower(Level world, BlockPos pos, CallbackInfo info) { BlockState down = world.getBlockState(pos.below()); if (down.is(Blocks.CHORUS_PLANT) || down.is(EndTags.GEN_TERRAIN)) { world.setBlock(pos, this.defaultBlockState().setValue(BlockStateProperties.AGE_5, 5), 2); diff --git a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java index 8b5e0fd7..dbc265cd 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java @@ -37,16 +37,16 @@ public abstract class ChorusPlantBlockMixin extends Block { } } - @Inject(method = "appendProperties", at = @At("TAIL")) - private void beAddProperties(StateDefinition.Builder builder, CallbackInfo info) { + @Inject(method = "createBlockStateDefinition", at = @At("TAIL")) + private void be_createBlockStateDefinition(StateDefinition.Builder builder, CallbackInfo info) { GeneratorOptions.init(); if (GeneratorOptions.changeChorusPlant()) { builder.add(BlocksHelper.ROOTS); } } - @Inject(method = "withConnectionProperties", at = @At("RETURN"), cancellable = true) - private void beConnectionProperties(BlockGetter world, BlockPos pos, CallbackInfoReturnable info) { + @Inject(method = "getStateForPlacement", at = @At("RETURN"), cancellable = true) + private void be_getStateForPlacement(BlockGetter world, BlockPos pos, CallbackInfoReturnable info) { BlockState plant = info.getReturnValue(); if (plant.is(Blocks.CHORUS_PLANT)) { if (world.getBlockState(pos.below()).is(EndTags.END_GROUND)) { @@ -67,8 +67,8 @@ public abstract class ChorusPlantBlockMixin extends Block { } } - @Inject(method = "canPlaceAt", at = @At("HEAD"), cancellable = true) - private void beCanPlace(BlockState state, LevelReader world, BlockPos pos, CallbackInfoReturnable info) { + @Inject(method = "canSurvive", at = @At("HEAD"), cancellable = true) + private void be_canSurvive(BlockState state, LevelReader world, BlockPos pos, CallbackInfoReturnable info) { BlockState down = world.getBlockState(pos.below()); if (down.is(EndBlocks.CHORUS_NYLIUM) || down.is(Blocks.END_STONE)) { info.setReturnValue(true); @@ -76,8 +76,8 @@ public abstract class ChorusPlantBlockMixin extends Block { } } - @Inject(method = "getStateForNeighborUpdate", at = @At("RETURN"), cancellable = true) - private void beStateForNeighborUpdate(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom, CallbackInfoReturnable info) { + @Inject(method = "updateShape", at = @At("RETURN"), cancellable = true) + private void be_updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom, CallbackInfoReturnable info) { BlockState plant = info.getReturnValue(); if (plant.is(Blocks.CHORUS_PLANT)) { if (world.getBlockState(pos.below()).is(EndTags.END_GROUND)) { @@ -100,8 +100,8 @@ public abstract class ChorusPlantBlockMixin extends Block { } } - @Inject(method = "getPlacementState", at = @At("RETURN"), cancellable = true) - private void beGetPlacementState(BlockPlaceContext ctx, CallbackInfoReturnable info) { + @Inject(method = "getStateForPlacement", at = @At("RETURN"), cancellable = true) + private void be_getStateForPlacement(BlockPlaceContext ctx, CallbackInfoReturnable info) { BlockPos pos = ctx.getClickedPos(); Level world = ctx.getLevel(); BlockState plant = info.getReturnValue(); diff --git a/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java index fee8e1f9..de29482a 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java @@ -21,8 +21,8 @@ import ru.betterend.world.generator.GeneratorOptions; @Mixin(ChorusPlantFeature.class) public class ChorusPlantFeatureMixin { - @Inject(method = "generate", at = @At("HEAD"), cancellable = true) - private void be_onGenerate(WorldGenLevel structureWorldAccess, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, NoneFeatureConfiguration defaultFeatureConfig, CallbackInfoReturnable info) { + @Inject(method = "place", at = @At("HEAD"), cancellable = true) + private void be_place(WorldGenLevel structureWorldAccess, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, NoneFeatureConfiguration defaultFeatureConfig, CallbackInfoReturnable info) { if (structureWorldAccess.isEmptyBlock(blockPos) && structureWorldAccess.getBlockState(blockPos.below()).is(EndBlocks.CHORUS_NYLIUM)) { ChorusFlowerBlock.generatePlant(structureWorldAccess, blockPos, random, MHelper.randRange(8, 16, random)); BlockState bottom = structureWorldAccess.getBlockState(blockPos); diff --git a/src/main/java/ru/betterend/mixin/common/BiomeArrayMixin.java b/src/main/java/ru/betterend/mixin/common/ChunkBiomeContainerMixin.java similarity index 86% rename from src/main/java/ru/betterend/mixin/common/BiomeArrayMixin.java rename to src/main/java/ru/betterend/mixin/common/ChunkBiomeContainerMixin.java index 7ee5b484..5f559269 100644 --- a/src/main/java/ru/betterend/mixin/common/BiomeArrayMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChunkBiomeContainerMixin.java @@ -10,7 +10,7 @@ import org.spongepowered.asm.mixin.Shadow; import ru.betterend.interfaces.IBiomeArray; @Mixin(ChunkBiomeContainer.class) -public class BiomeArrayMixin implements IBiomeArray { +public class ChunkBiomeContainerMixin implements IBiomeArray { @Final @Shadow private Biome[] biomes; @@ -28,7 +28,7 @@ public class BiomeArrayMixin implements IBiomeArray { public static int VERTICAL_MASK; @Override - public void setBiome(Biome biome, BlockPos pos) { + public void be_setBiome(Biome biome, BlockPos pos) { int biomeX = pos.getX() >> 2; int biomeY = pos.getY() >> 2; int biomeZ = pos.getZ() >> 2; diff --git a/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java b/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java index 9152b3fd..c0bc899e 100644 --- a/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java @@ -8,7 +8,7 @@ import org.spongepowered.asm.mixin.gen.Invoker; @Mixin(ComposterBlock.class) public interface ComposterBlockAccessor { @Invoker - static void callRegisterCompostableItem(float levelIncreaseChance, ItemLike item) { + static void callAdd(float levelIncreaseChance, ItemLike item) { throw new AssertionError("@Invoker dummy body called"); } } diff --git a/src/main/java/ru/betterend/mixin/common/CraftingScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/CraftingMenuMixin.java similarity index 78% rename from src/main/java/ru/betterend/mixin/common/CraftingScreenHandlerMixin.java rename to src/main/java/ru/betterend/mixin/common/CraftingMenuMixin.java index 6b4f898a..b1a40263 100644 --- a/src/main/java/ru/betterend/mixin/common/CraftingScreenHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/CraftingMenuMixin.java @@ -12,14 +12,13 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(CraftingMenu.class) -public abstract class CraftingScreenHandlerMixin -{ +public abstract class CraftingMenuMixin { @Shadow @Final private ContainerLevelAccess context; - @Inject(method = "canUse", at = @At("HEAD"), cancellable = true) - private void be_canUse(Player player, CallbackInfoReturnable info) { + @Inject(method = "stillValid", at = @At("HEAD"), cancellable = true) + private void be_stillValid(Player player, CallbackInfoReturnable info) { if (context.evaluate((world, pos) -> { return world.getBlockState(pos).getBlock() instanceof CraftingTableBlock; }, true)) { diff --git a/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java b/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java index b25e55cc..b238b0db 100644 --- a/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java +++ b/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java @@ -15,7 +15,7 @@ import ru.betterend.world.generator.GeneratorOptions; @Mixin(value = DimensionType.class, priority = 100) public class DimensionTypeMixin { - @Inject(method = "createEndGenerator", at = @At("HEAD"), cancellable = true) + @Inject(method = "defaultEndGenerator", at = @At("HEAD"), cancellable = true) private static void be_replaceGenerator(Registry biomeRegistry, Registry chunkGeneratorSettingsRegistry, long seed, CallbackInfoReturnable info) { info.setReturnValue(new NoiseBasedChunkGenerator(new BetterEndBiomeSource(biomeRegistry, seed), seed, () -> { return (NoiseGeneratorSettings) chunkGeneratorSettingsRegistry.getOrThrow(NoiseGeneratorSettings.END); @@ -23,7 +23,7 @@ public class DimensionTypeMixin { info.cancel(); } - @Inject(method = "hasEnderDragonFight", at = @At("HEAD"), cancellable = true) + @Inject(method = "createDragonFight", at = @At("HEAD"), cancellable = true) private void be_hasEnderDragonFight(CallbackInfoReturnable info) { if (!GeneratorOptions.hasDragonFights()) { info.setReturnValue(false); diff --git a/src/main/java/ru/betterend/mixin/common/EnchantmentScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/EnchantmentMenuMixin.java similarity index 67% rename from src/main/java/ru/betterend/mixin/common/EnchantmentScreenHandlerMixin.java rename to src/main/java/ru/betterend/mixin/common/EnchantmentMenuMixin.java index 2b0e27e3..8695a9ed 100644 --- a/src/main/java/ru/betterend/mixin/common/EnchantmentScreenHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EnchantmentMenuMixin.java @@ -21,14 +21,14 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.betterend.registry.EndTags; @Mixin(EnchantmentMenu.class) -public abstract class EnchantmentScreenHandlerMixin extends AbstractContainerMenu { +public abstract class EnchantmentMenuMixin extends AbstractContainerMenu { @Shadow @Final - private Container inventory; + private Container enchantSlots; @Shadow @Final - private ContainerLevelAccess context; + private ContainerLevelAccess access; @Shadow @Final @@ -36,30 +36,30 @@ public abstract class EnchantmentScreenHandlerMixin extends AbstractContainerMen @Shadow @Final - private DataSlot seed; + private DataSlot enchantmentSeed; @Shadow @Final - public int[] enchantmentPower; + public int[] costs; @Shadow @Final - public int[] enchantmentId; + public int[] enchantClue; @Shadow @Final - public int[] enchantmentLevel; + public int[] levelClue; - protected EnchantmentScreenHandlerMixin(MenuType type, int syncId) { + protected EnchantmentMenuMixin(MenuType type, int syncId) { super(type, syncId); } - @Inject(method = "onContentChanged", at = @At("HEAD"), cancellable = true) - private void beOnContentChanged(Container inventory, CallbackInfo info) { - if (inventory == this.inventory) { + @Inject(method = "slotsChanged", at = @At("HEAD"), cancellable = true) + private void be_slotsChanged(Container inventory, CallbackInfo info) { + if (inventory == this.enchantSlots) { ItemStack itemStack = inventory.getItem(0); if (!itemStack.isEmpty() && itemStack.isEnchantable()) { - this.context.execute((world, blockPos) -> { + this.access.execute((world, blockPos) -> { int i = 0; int j; @@ -95,24 +95,24 @@ public abstract class EnchantmentScreenHandlerMixin extends AbstractContainerMen } } - this.random.setSeed((long) this.seed.get()); + this.random.setSeed((long) this.enchantmentSeed.get()); for (j = 0; j < 3; ++j) { - this.enchantmentPower[j] = EnchantmentHelper.getEnchantmentCost(this.random, j, i, itemStack); - this.enchantmentId[j] = -1; - this.enchantmentLevel[j] = -1; - if (this.enchantmentPower[j] < j + 1) { - this.enchantmentPower[j] = 0; + this.costs[j] = EnchantmentHelper.getEnchantmentCost(this.random, j, i, itemStack); + this.enchantClue[j] = -1; + this.levelClue[j] = -1; + if (this.costs[j] < j + 1) { + this.costs[j] = 0; } } for (j = 0; j < 3; ++j) { - if (this.enchantmentPower[j] > 0) { - List list = this.generateEnchantments(itemStack, j, this.enchantmentPower[j]); + if (this.costs[j] > 0) { + List list = this.generateEnchantments(itemStack, j, this.costs[j]); if (list != null && !list.isEmpty()) { EnchantmentInstance enchantmentLevelEntry = (EnchantmentInstance) list.get(this.random.nextInt(list.size())); - this.enchantmentId[j] = Registry.ENCHANTMENT.getId(enchantmentLevelEntry.enchantment); - this.enchantmentLevel[j] = enchantmentLevelEntry.level; + this.enchantClue[j] = Registry.ENCHANTMENT.getId(enchantmentLevelEntry.enchantment); + this.levelClue[j] = enchantmentLevelEntry.level; } } } @@ -122,9 +122,9 @@ public abstract class EnchantmentScreenHandlerMixin extends AbstractContainerMen } else { for (int i = 0; i < 3; ++i) { - this.enchantmentPower[i] = 0; - this.enchantmentId[i] = -1; - this.enchantmentLevel[i] = -1; + this.costs[i] = 0; + this.enchantClue[i] = -1; + this.levelClue[i] = -1; } } info.cancel(); diff --git a/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java index 55d6b7c5..d4b691f1 100644 --- a/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java @@ -16,16 +16,16 @@ import ru.betterend.world.generator.GeneratorOptions; @Mixin(EndCityFeature.class) public class EndCityFeatureMixin { - @Inject(method = "shouldStartAt", at = @At("HEAD"), cancellable = true) - private void be_shouldStartAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long l, WorldgenRandom chunkRandom, int i, int j, Biome biome, ChunkPos chunkPos, NoneFeatureConfiguration defaultFeatureConfig, CallbackInfoReturnable info) { + @Inject(method = "isFeatureChunk", at = @At("HEAD"), cancellable = true) + private void be_isFeatureChunk(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long l, WorldgenRandom chunkRandom, int i, int j, Biome biome, ChunkPos chunkPos, NoneFeatureConfiguration defaultFeatureConfig, CallbackInfoReturnable info) { if (GeneratorOptions.useNewGenerator()) { int chance = GeneratorOptions.getEndCityFailChance(); if (chance == 0) { - info.setReturnValue(getGenerationHeight(i, j, chunkGenerator) >= 60); + info.setReturnValue(getYPositionForFeature(i, j, chunkGenerator) >= 60); info.cancel(); } else if (chunkRandom.nextInt(chance) == 0){ - info.setReturnValue(getGenerationHeight(i, j, chunkGenerator) >= 60); + info.setReturnValue(getYPositionForFeature(i, j, chunkGenerator) >= 60); info.cancel(); } else { @@ -36,7 +36,7 @@ public class EndCityFeatureMixin { } @Shadow - private static int getGenerationHeight(int chunkX, int chunkZ, ChunkGenerator chunkGenerator) { + private static int getYPositionForFeature(int chunkX, int chunkZ, ChunkGenerator chunkGenerator) { return 0; } } diff --git a/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java similarity index 81% rename from src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java rename to src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java index 6f544079..a9c095b2 100644 --- a/src/main/java/ru/betterend/mixin/common/EndPortalFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java @@ -23,20 +23,20 @@ import ru.betterend.util.WorldDataUtil; import ru.betterend.world.generator.GeneratorOptions; @Mixin(EndPodiumFeature.class) -public class EndPortalFeatureMixin { +public class EndPodiumFeatureMixin { @Final @Shadow - private boolean open; + private boolean active; - @Inject(method = "generate", at = @At("HEAD"), cancellable = true) - private void bePortalGenerate(WorldGenLevel world, ChunkGenerator generator, Random random, BlockPos blockPos, NoneFeatureConfiguration config, CallbackInfoReturnable info) { + @Inject(method = "place", at = @At("HEAD"), cancellable = true) + private void be_place(WorldGenLevel world, ChunkGenerator generator, Random random, BlockPos blockPos, NoneFeatureConfiguration config, CallbackInfoReturnable info) { if (!GeneratorOptions.hasPortal()) { info.setReturnValue(false); info.cancel(); } else if (GeneratorOptions.replacePortal()) { blockPos = be_updatePos(blockPos, world); - StructureTemplate structure = StructureHelper.readStructure(BetterEnd.makeID(open ? "portal/end_portal_active" : "portal/end_portal_inactive")); + StructureTemplate structure = StructureHelper.readStructure(BetterEnd.makeID(active ? "portal/end_portal_active" : "portal/end_portal_inactive")); BlockPos size = structure.getSize(); blockPos = blockPos.offset(-(size.getX() >> 1), -3, -(size.getZ() >> 1)); structure.placeInWorldChunk(world, blockPos, new StructurePlaceSettings(), random); @@ -45,7 +45,7 @@ public class EndPortalFeatureMixin { } } - @ModifyVariable(method = "generate", ordinal = 0, at = @At("HEAD")) + @ModifyVariable(method = "place", ordinal = 0, at = @At("HEAD")) private BlockPos be_setPosOnGround(BlockPos blockPos, WorldGenLevel world) { return be_updatePos(blockPos, world); } diff --git a/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java b/src/main/java/ru/betterend/mixin/common/EnderManMixin.java similarity index 77% rename from src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java rename to src/main/java/ru/betterend/mixin/common/EnderManMixin.java index d962b716..dc5f1424 100644 --- a/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EnderManMixin.java @@ -12,10 +12,9 @@ import ru.betterend.effects.EndEnchantments; import ru.betterend.effects.EndStatusEffects; @Mixin(EnderMan.class) -public abstract class EndermanEntityMixin { - - @Inject(method = "isPlayerStaring", at = @At("HEAD"), cancellable = true) - private void be_isPlayerStaring(Player player, CallbackInfoReturnable info) { +public abstract class EnderManMixin { + @Inject(method = "isLookingAtMe", at = @At("HEAD"), cancellable = true) + private void be_isLookingAtMe(Player player, CallbackInfoReturnable info) { if (player.isCreative() || player.hasEffect(EndStatusEffects.END_VEIL) || EnchantmentHelper.getItemEnchantmentLevel(EndEnchantments.END_VEIL, player.getItemBySlot(EquipmentSlot.HEAD)) > 0) { info.setReturnValue(false); diff --git a/src/main/java/ru/betterend/mixin/common/EntityMixin.java b/src/main/java/ru/betterend/mixin/common/EntityMixin.java index c48e323a..21a3c5dd 100644 --- a/src/main/java/ru/betterend/mixin/common/EntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EntityMixin.java @@ -17,11 +17,10 @@ import ru.betterend.interfaces.TeleportingEntity; @Mixin(Entity.class) public abstract class EntityMixin implements TeleportingEntity { - @Shadow - public float yaw; + public float yRot; @Shadow - public float pitch; + public float xRot; @Shadow public boolean removed; @Shadow @@ -42,9 +41,9 @@ public abstract class EntityMixin implements TeleportingEntity { private BlockPos exitPos; - @Inject(method = "moveToWorld", at = @At("HEAD"), cancellable = true) - public void be_moveToWorld(ServerLevel destination, CallbackInfoReturnable info) { - if (!removed && beCanTeleport() && world instanceof ServerLevel) { + @Inject(method = "changeDimension", at = @At("HEAD"), cancellable = true) + public void be_changeDimension(ServerLevel destination, CallbackInfoReturnable info) { + if (!removed && be_canTeleport() && world instanceof ServerLevel) { this.detach(); this.world.getProfiler().push("changeDimension"); this.world.getProfiler().push("reposition"); @@ -63,31 +62,31 @@ public abstract class EntityMixin implements TeleportingEntity { ((ServerLevel) world).resetEmptyTime(); destination.resetEmptyTime(); this.world.getProfiler().pop(); - this.beResetExitPos(); + this.be_resetExitPos(); info.setReturnValue(entity); } } } - @Inject(method = "getTeleportTarget", at = @At("HEAD"), cancellable = true) - protected void be_getTeleportTarget(ServerLevel destination, CallbackInfoReturnable info) { - if (beCanTeleport()) { - info.setReturnValue(new PortalInfo(new Vec3(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), getVelocity(), yaw, pitch)); + @Inject(method = "findDimensionEntryPoint", at = @At("HEAD"), cancellable = true) + protected void be_findDimensionEntryPoint(ServerLevel destination, CallbackInfoReturnable info) { + if (be_canTeleport()) { + info.setReturnValue(new PortalInfo(new Vec3(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), getVelocity(), yRot, xRot)); } } @Override - public void beSetExitPos(BlockPos pos) { + public void be_setExitPos(BlockPos pos) { this.exitPos = pos.immutable(); } @Override - public void beResetExitPos() { + public void be_resetExitPos() { this.exitPos = null; } @Override - public boolean beCanTeleport() { + public boolean be_canTeleport() { return this.exitPos != null; } } diff --git a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java index 8b9cb630..d2d4950d 100644 --- a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java @@ -16,15 +16,14 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(LivingEntity.class) public abstract class LivingEntityMixin { - private Entity lastAttacker; - @Inject(method = "damage", at = @At("HEAD")) - public void be_damage(DamageSource source, float amount, CallbackInfoReturnable info) { + @Inject(method = "hurt", at = @At("HEAD")) + public void be_hurt(DamageSource source, float amount, CallbackInfoReturnable info) { this.lastAttacker = source.getEntity(); } - @ModifyArg(method = "damage", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;takeKnockback(FDD)V")) + @ModifyArg(method = "hurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;knockback(FDD)V")) private float be_increaseKnockback(float value, double x, double z) { if (lastAttacker != null && lastAttacker instanceof LivingEntity) { LivingEntity attacker = (LivingEntity) lastAttacker; @@ -35,8 +34,7 @@ public abstract class LivingEntityMixin { private double be_getKnockback(Item tool) { if (tool == null) return 0.0D; - Collection modifiers = tool.getDefaultAttributeModifiers(EquipmentSlot.MAINHAND) - .get(Attributes.ATTACK_KNOCKBACK); + Collection modifiers = tool.getDefaultAttributeModifiers(EquipmentSlot.MAINHAND).get(Attributes.ATTACK_KNOCKBACK); if (modifiers.size() > 0) { return modifiers.iterator().next().getAmount(); } diff --git a/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java b/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java index 99d7e49c..14d5fa1d 100644 --- a/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java @@ -29,73 +29,73 @@ import ru.betterend.world.generator.GeneratorOptions; @Mixin(MinecraftServer.class) public class MinecraftServerMixin { @Shadow - private ServerResources serverResourceManager; + private ServerResources resources; @Final @Shadow - private Map, ServerLevel> worlds; + private Map, ServerLevel> levels; @Final @Shadow - protected WorldData saveProperties; + protected WorldData worldData; @Inject(method = "reloadResources", at = @At(value = "RETURN"), cancellable = true) - private void beOnReload(Collection collection, CallbackInfoReturnable> info) { - beInjectRecipes(); + private void be_reloadResources(Collection collection, CallbackInfoReturnable> info) { + be_injectRecipes(); } - @Inject(method = "loadWorld", at = @At(value = "RETURN"), cancellable = true) - private void beOnLoadWorld(CallbackInfo info) { - beInjectRecipes(); + @Inject(method = "loadLevel", at = @At(value = "RETURN"), cancellable = true) + private void be_loadLevel(CallbackInfo info) { + be_injectRecipes(); EndBiomes.initRegistry((MinecraftServer) (Object) this); } - @Inject(method = "getOverworld", at = @At(value = "HEAD"), cancellable = true) - private final void beGetOverworld(CallbackInfoReturnable info) { + @Inject(method = "overworld", at = @At(value = "HEAD"), cancellable = true) + private final void be_overworld(CallbackInfoReturnable info) { if (GeneratorOptions.swapOverworldToEnd()) { - ServerLevel world = worlds.get(Level.END); + ServerLevel world = levels.get(Level.END); if (world == null) { - world = worlds.get(Level.OVERWORLD); + world = levels.get(Level.OVERWORLD); } info.setReturnValue(world); info.cancel(); } } - @Inject(method = "createWorlds", at = @At(value = "TAIL")) - private final void be_CreateWorlds(ChunkProgressListener worldGenerationProgressListener, CallbackInfo info) { + @Inject(method = "createLevels", at = @At(value = "TAIL")) + private final void be_createLevels(ChunkProgressListener worldGenerationProgressListener, CallbackInfo info) { if (GeneratorOptions.swapOverworldToEnd()) { - ServerLevel world = worlds.get(Level.END); + ServerLevel world = levels.get(Level.END); if (world == null) { - world = worlds.get(Level.OVERWORLD); + world = levels.get(Level.OVERWORLD); } - this.getPlayerManager().setLevel(world); - ServerLevelData serverWorldProperties = saveProperties.overworldData(); - net.minecraft.world.level.levelgen.WorldGenSettings generatorOptions = saveProperties.worldGenSettings(); + this.getPlayerList().setLevel(world); + ServerLevelData serverWorldProperties = worldData.overworldData(); + net.minecraft.world.level.levelgen.WorldGenSettings generatorOptions = worldData.worldGenSettings(); boolean bl = generatorOptions.isDebug(); - setupSpawn(world, serverWorldProperties, generatorOptions.generateBonusChest(), bl, true); + setInitialSpawn(world, serverWorldProperties, generatorOptions.generateBonusChest(), bl, true); } } - @Inject(method = "setupSpawn", at = @At(value = "HEAD"), cancellable = true) - private static void be_SetupSpawn(ServerLevel world, ServerLevelData serverWorldProperties, boolean bonusChest, boolean debugWorld, boolean bl, CallbackInfo info) { + @Inject(method = "setInitialSpawn", at = @At(value = "HEAD"), cancellable = true) + private static void be_setInitialSpawn(ServerLevel world, ServerLevelData serverWorldProperties, boolean bonusChest, boolean debugWorld, boolean bl, CallbackInfo info) { if (GeneratorOptions.swapOverworldToEnd() && world.dimension() == Level.OVERWORLD) { info.cancel(); } } @Shadow - private static void setupSpawn(ServerLevel world, ServerLevelData serverWorldProperties, boolean bonusChest, boolean debugWorld, boolean bl) {} + private static void setInitialSpawn(ServerLevel world, ServerLevelData serverWorldProperties, boolean bonusChest, boolean debugWorld, boolean bl) {} @Shadow - public PlayerList getPlayerManager() { + public PlayerList getPlayerList() { return null; } - private void beInjectRecipes() { + private void be_injectRecipes() { if (FabricLoader.getInstance().isModLoaded("kubejs")) { - RecipeManagerAccessor accessor = (RecipeManagerAccessor) serverResourceManager.getRecipeManager(); - accessor.setRecipes(EndRecipeManager.getMap(accessor.getRecipes())); + RecipeManagerAccessor accessor = (RecipeManagerAccessor) resources.getRecipeManager(); + accessor.be_setRecipes(EndRecipeManager.getMap(accessor.be_getRecipes())); } } } diff --git a/src/main/java/ru/betterend/mixin/common/HostileEntityMixin.java b/src/main/java/ru/betterend/mixin/common/MonsterMixin.java similarity index 73% rename from src/main/java/ru/betterend/mixin/common/HostileEntityMixin.java rename to src/main/java/ru/betterend/mixin/common/MonsterMixin.java index 9186f9f1..d3f85e17 100644 --- a/src/main/java/ru/betterend/mixin/common/HostileEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/MonsterMixin.java @@ -15,9 +15,9 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(Monster.class) -public class HostileEntityMixin { - @Inject(method = "canSpawnInDark", at = @At(value = "RETURN"), cancellable = true) - private static void be_endermenCheck(EntityType type, ServerLevelAccessor serverWorldAccess, MobSpawnType spawnReason, BlockPos pos, Random random, CallbackInfoReturnable info) { +public class MonsterMixin { + @Inject(method = "checkMonsterSpawnRules", at = @At(value = "RETURN"), cancellable = true) + private static void be_checkMonsterSpawnRules(EntityType type, ServerLevelAccessor serverWorldAccess, MobSpawnType spawnReason, BlockPos pos, Random random, CallbackInfoReturnable info) { boolean canSpawn = info.getReturnValue(); if (canSpawn && spawnReason == MobSpawnType.NATURAL && type == EntityType.ENDERMAN) { AABB box = new AABB(pos).inflate(16); diff --git a/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java b/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java similarity index 60% rename from src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java rename to src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java index 95c4ccf4..7fcd2978 100644 --- a/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java +++ b/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java @@ -16,28 +16,25 @@ import ru.betterend.world.generator.GeneratorOptions; import ru.betterend.world.generator.TerrainGenerator; @Mixin(NoiseBasedChunkGenerator.class) -public abstract class NoiseChunkGeneratorMixin extends ChunkGenerator { +public abstract class NoiseBasedChunkGeneratorMixin extends ChunkGenerator { @Final @Shadow protected Supplier settings; - public NoiseChunkGeneratorMixin(BiomeSource populationSource, BiomeSource biomeSource, StructureSettings structuresConfig, long worldSeed) { + public NoiseBasedChunkGeneratorMixin(BiomeSource populationSource, BiomeSource biomeSource, StructureSettings structuresConfig, long worldSeed) { super(populationSource, biomeSource, structuresConfig, worldSeed); } - @Inject(method = "(Lnet/minecraft/world/biome/source/BiomeSource;Lnet/minecraft/world/biome/source/BiomeSource;JLjava/util/function/Supplier;)V", at = @At("TAIL")) + @Inject(method = "(Lnet/minecraft/world/level/biome/BiomeSource;Lnet/minecraft/world/level/biome/BiomeSource;JLjava/util/function/Supplier;)V", at = @At("TAIL")) private void beOnInit(BiomeSource populationSource, BiomeSource biomeSource, long seed, Supplier settings, CallbackInfo info) { TerrainGenerator.initNoise(seed); } - @Inject(method = "sampleNoiseColumn([DII)V", at = @At("HEAD"), cancellable = true, allow = 2) - private void beSampleNoiseColumn(double[] buffer, int x, int z, CallbackInfo info) { + @Inject(method = "fillNoiseColumn([DII)V", at = @At("HEAD"), cancellable = true, allow = 2) + private void be_fillNoiseColumn(double[] buffer, int x, int z, CallbackInfo info) { if (GeneratorOptions.useNewGenerator() && settings.get().stable(NoiseGeneratorSettings.END)) { - //System.out.println(TerrainGenerator.canGenerate(x, z)); - //if (TerrainGenerator.canGenerate(x, z)) { - TerrainGenerator.fillTerrainDensity(buffer, x, z, getBiomeSource()); - info.cancel(); - //} + TerrainGenerator.fillTerrainDensity(buffer, x, z, getBiomeSource()); + info.cancel(); } } } diff --git a/src/main/java/ru/betterend/mixin/common/PlayerAdvancementTrackerMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerAdvancementsMixin.java similarity index 62% rename from src/main/java/ru/betterend/mixin/common/PlayerAdvancementTrackerMixin.java rename to src/main/java/ru/betterend/mixin/common/PlayerAdvancementsMixin.java index 2900fa3a..e3bfcc97 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerAdvancementTrackerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerAdvancementsMixin.java @@ -1,27 +1,26 @@ -package ru.betterend.mixin.common; - -import net.minecraft.advancements.Advancement; -import net.minecraft.server.PlayerAdvancements; -import net.minecraft.server.level.ServerPlayer; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.At.Shift; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import ru.betterend.events.PlayerAdvancementsEvents; - -@Mixin(PlayerAdvancements.class) -public abstract class PlayerAdvancementTrackerMixin { - - @Shadow - private ServerPlayer owner; - - @Inject(method = "grantCriterion", at = @At( - value = "INVOKE", - target = "Lnet/minecraft/advancement/AdvancementRewards;apply(Lnet/minecraft/server/network/ServerPlayerEntity;)V", - shift = Shift.AFTER)) - public void be_onAdvancementComplete(Advancement advancement, String criterionName, CallbackInfoReturnable info) { - PlayerAdvancementsEvents.PLAYER_ADVENCEMENT_COMPLETE.invoker().onAdvancementComplete(owner, advancement, criterionName); - } -} +package ru.betterend.mixin.common; + +import net.minecraft.advancements.Advancement; +import net.minecraft.server.PlayerAdvancements; +import net.minecraft.server.level.ServerPlayer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import ru.betterend.events.PlayerAdvancementsEvents; + +@Mixin(PlayerAdvancements.class) +public abstract class PlayerAdvancementsMixin { + @Shadow + private ServerPlayer player; + + @Inject(method = "award", at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/PlayerAdvancements;grant(Lnet/minecraft/server/level/ServerPlayer;)V", + shift = Shift.AFTER)) + public void be_award(Advancement advancement, String criterionName, CallbackInfoReturnable info) { + PlayerAdvancementsEvents.PLAYER_ADVENCEMENT_COMPLETE.invoker().onAdvancementComplete(player, advancement, criterionName); + } +} diff --git a/src/main/java/ru/betterend/mixin/common/PlayerManagerMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerListMixin.java similarity index 82% rename from src/main/java/ru/betterend/mixin/common/PlayerManagerMixin.java rename to src/main/java/ru/betterend/mixin/common/PlayerListMixin.java index 32b06ec6..408fb3fa 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerManagerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerListMixin.java @@ -59,7 +59,7 @@ import net.minecraft.world.level.storage.LevelData; import ru.betterend.world.generator.GeneratorOptions; @Mixin(PlayerList.class) -public class PlayerManagerMixin { +public class PlayerListMixin { @Final @Shadow private static Logger LOGGER; @@ -70,7 +70,7 @@ public class PlayerManagerMixin { @Final @Shadow - private RegistryAccess.RegistryHolder registryManager; + private RegistryAccess.RegistryHolder registryHolder; @Shadow private int viewDistance; @@ -81,17 +81,17 @@ public class PlayerManagerMixin { @Final @Shadow - private Map playerMap; + private Map playersByUUID; - @Inject(method = "onPlayerConnect", at = @At(value = "HEAD"), cancellable = true) - public void be_onPlayerConnect(Connection connection, ServerPlayer player, CallbackInfo info) { + @Inject(method = "placeNewPlayer", at = @At(value = "HEAD"), cancellable = true) + public void be_placeNewPlayer(Connection connection, ServerPlayer player, CallbackInfo info) { if (GeneratorOptions.swapOverworldToEnd()) { GameProfile gameProfile = player.getGameProfile(); GameProfileCache userCache = this.server.getProfileCache(); GameProfile gameProfile2 = userCache.get(gameProfile.getId()); String string = gameProfile2 == null ? gameProfile.getName() : gameProfile2.getName(); userCache.add(gameProfile); - CompoundTag compoundTag = this.loadPlayerData(player); + CompoundTag compoundTag = this.load(player); ResourceKey var23; if (compoundTag != null) { DataResult> var10000 = DimensionType.parseLegacy(new Dynamic(NbtOps.INSTANCE, compoundTag.get("Dimension"))); @@ -123,13 +123,13 @@ public class PlayerManagerMixin { LOGGER.info("{}[{}] logged in with entity id {} at ({}, {}, {})", player.getName().getString(), string2, player.getId(), player.getX(), player.getY(), player.getZ()); LevelData worldProperties = serverWorld3.getLevelData(); - this.setGameMode(player, (ServerPlayer) null, serverWorld3); + this.updatePlayerGameMode(player, (ServerPlayer) null, serverWorld3); ServerGamePacketListenerImpl serverPlayNetworkHandler = new ServerGamePacketListenerImpl(this.server, connection, player); GameRules gameRules = serverWorld3.getGameRules(); boolean bl = gameRules.getBoolean(GameRules.RULE_DO_IMMEDIATE_RESPAWN); boolean bl2 = gameRules.getBoolean(GameRules.RULE_REDUCEDDEBUGINFO); serverPlayNetworkHandler.send(new ClientboundLoginPacket(player.getId(), player.gameMode.getGameModeForPlayer(), player.gameMode.getPreviousGameModeForPlayer(), BiomeManager.obfuscateSeed(serverWorld3.getSeed()), - worldProperties.isHardcore(), this.server.levelKeys(), this.registryManager, serverWorld3.dimensionType(), serverWorld3.dimension(), this.getMaxPlayerCount(), this.viewDistance, bl2, !bl, + worldProperties.isHardcore(), this.server.levelKeys(), this.registryHolder, serverWorld3.dimensionType(), serverWorld3.dimension(), this.getPlayerCount(), this.viewDistance, bl2, !bl, serverWorld3.isDebug(), serverWorld3.isFlat())); serverPlayNetworkHandler.send(new ClientboundCustomPayloadPacket(ClientboundCustomPayloadPacket.BRAND, (new FriendlyByteBuf(Unpooled.buffer())).writeUtf(this.getServer().getServerModName()))); serverPlayNetworkHandler.send(new ClientboundChangeDifficultyPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); @@ -137,10 +137,10 @@ public class PlayerManagerMixin { serverPlayNetworkHandler.send(new ClientboundSetCarriedItemPacket(player.inventory.selected)); serverPlayNetworkHandler.send(new ClientboundUpdateRecipesPacket(this.server.getRecipeManager().getRecipes())); serverPlayNetworkHandler.send(new ClientboundUpdateTagsPacket(this.server.getTags())); - this.sendCommandTree(player); + this.sendPlayerPermissionLevel(player); player.getStats().markAllDirty(); player.getRecipeBook().sendInitialRecipeBook(player); - this.sendScoreboard(serverWorld3.getScoreboard(), player); + this.updateEntireScoreboard(serverWorld3.getScoreboard(), player); this.server.invalidateStatus(); TranslatableComponent mutableText2; if (player.getGameProfile().getName().equalsIgnoreCase(string)) { @@ -150,11 +150,11 @@ public class PlayerManagerMixin { mutableText2 = new TranslatableComponent("multiplayer.player.joined.renamed", new Object[] { player.getDisplayName(), string }); } - this.broadcastChatMessage(mutableText2.withStyle(ChatFormatting.YELLOW), ChatType.SYSTEM, Util.NIL_UUID); + this.broadcastMessage(mutableText2.withStyle(ChatFormatting.YELLOW), ChatType.SYSTEM, Util.NIL_UUID); serverPlayNetworkHandler.teleport(player.getX(), player.getY(), player.getZ(), player.yRot, player.xRot); this.players.add(player); - this.playerMap.put(player.getUUID(), player); - this.sendToAll(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, new ServerPlayer[] { player })); + this.playersByUUID.put(player.getUUID(), player); + this.broadcastAll(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, new ServerPlayer[] { player })); for (int i = 0; i < this.players.size(); ++i) { player.connection.send(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, new ServerPlayer[] { (ServerPlayer) this.players.get(i) })); @@ -162,7 +162,7 @@ public class PlayerManagerMixin { serverWorld3.addNewPlayer(player); this.server.getCustomBossEvents().onPlayerConnect(player); - this.sendWorldInfo(player, serverWorld3); + this.sendLevelInfo(player, serverWorld3); if (!this.server.getResourcePack().isEmpty()) { player.sendTexturePack(this.server.getResourcePack(), this.server.getResourcePackHash()); } @@ -224,18 +224,18 @@ public class PlayerManagerMixin { } @Shadow - public CompoundTag loadPlayerData(ServerPlayer player) { + public CompoundTag load(ServerPlayer player) { return null; } @Shadow - private void setGameMode(ServerPlayer player, @Nullable ServerPlayer oldPlayer, ServerLevel world) {} + private void updatePlayerGameMode(ServerPlayer player, @Nullable ServerPlayer oldPlayer, ServerLevel world) {} @Shadow - public void sendCommandTree(ServerPlayer player) {} + public void sendPlayerPermissionLevel(ServerPlayer player) {} @Shadow - public int getMaxPlayerCount() { + public int getPlayerCount() { return 0; } @@ -245,14 +245,14 @@ public class PlayerManagerMixin { } @Shadow - protected void sendScoreboard(ServerScoreboard scoreboard, ServerPlayer player) {} + protected void updateEntireScoreboard(ServerScoreboard scoreboard, ServerPlayer player) {} @Shadow - public void broadcastChatMessage(Component message, ChatType type, UUID senderUuid) {} + public void broadcastMessage(Component message, ChatType type, UUID senderUuid) {} @Shadow - public void sendToAll(Packet packet) {} + public void broadcastAll(Packet packet) {} @Shadow - public void sendWorldInfo(ServerPlayer player, ServerLevel world) {} + public void sendLevelInfo(ServerPlayer player, ServerLevel world) {} } diff --git a/src/main/java/ru/betterend/mixin/common/PlayerEntityMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerMixin.java similarity index 65% rename from src/main/java/ru/betterend/mixin/common/PlayerEntityMixin.java rename to src/main/java/ru/betterend/mixin/common/PlayerMixin.java index 9ffc8d67..46a1c6dc 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerMixin.java @@ -18,30 +18,30 @@ import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; @Mixin(Player.class) -public abstract class PlayerEntityMixin { - private static Direction[] HORIZONTAL; +public abstract class PlayerMixin { + private static Direction[] horizontal; - @Inject(method = "findRespawnPosition", at = @At(value = "HEAD"), cancellable = true) - private static void be_statueRespawn(ServerLevel world, BlockPos pos, float f, boolean bl, boolean bl2, CallbackInfoReturnable> info) { + @Inject(method = "findRespawnPositionAndUseSpawnBlock", at = @At(value = "HEAD"), cancellable = true) + private static void be_findRespawnPositionAndUseSpawnBlock(ServerLevel world, BlockPos pos, float f, boolean bl, boolean bl2, CallbackInfoReturnable> info) { BlockState blockState = world.getBlockState(pos); if (blockState.is(EndBlocks.RESPAWN_OBELISK)) { - info.setReturnValue(beObeliskRespawnPosition(world, pos, blockState)); + info.setReturnValue(be_obeliskRespawnPosition(world, pos, blockState)); info.cancel(); } } - private static Optional beObeliskRespawnPosition(ServerLevel world, BlockPos pos, BlockState state) { + private static Optional be_obeliskRespawnPosition(ServerLevel world, BlockPos pos, BlockState state) { if (state.getValue(BlockProperties.TRIPLE_SHAPE) == TripleShape.TOP) { pos = pos.below(2); } else if (state.getValue(BlockProperties.TRIPLE_SHAPE) == TripleShape.MIDDLE) { pos = pos.below(); } - if (HORIZONTAL == null) { - HORIZONTAL = BlocksHelper.makeHorizontal(); + if (horizontal == null) { + horizontal = BlocksHelper.makeHorizontal(); } - MHelper.shuffle(HORIZONTAL, world.getRandom()); - for (Direction dir: HORIZONTAL) { + MHelper.shuffle(horizontal, world.getRandom()); + for (Direction dir: horizontal) { BlockPos p = pos.relative(dir); BlockState state2 = world.getBlockState(p); if (!state2.getMaterial().blocksMotion() && state2.getCollisionShape(world, pos).isEmpty()) { diff --git a/src/main/java/ru/betterend/mixin/common/BrewingAccessor.java b/src/main/java/ru/betterend/mixin/common/PotionBrewingAccessor.java similarity index 88% rename from src/main/java/ru/betterend/mixin/common/BrewingAccessor.java rename to src/main/java/ru/betterend/mixin/common/PotionBrewingAccessor.java index f1987282..d863d6cb 100644 --- a/src/main/java/ru/betterend/mixin/common/BrewingAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/PotionBrewingAccessor.java @@ -7,7 +7,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; @Mixin(PotionBrewing.class) -public interface BrewingAccessor { +public interface PotionBrewingAccessor { @Invoker static void callAddMix(Potion input, Item item, Potion output) { throw new AssertionError("@Invoker dummy body called"); diff --git a/src/main/java/ru/betterend/mixin/common/RecipeManagerAccessor.java b/src/main/java/ru/betterend/mixin/common/RecipeManagerAccessor.java index 5f680919..1f3e2fb8 100644 --- a/src/main/java/ru/betterend/mixin/common/RecipeManagerAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/RecipeManagerAccessor.java @@ -11,8 +11,8 @@ import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(RecipeManager.class) public interface RecipeManagerAccessor { @Accessor("recipes") - Map, Map>> getRecipes(); + Map, Map>> be_getRecipes(); @Accessor("recipes") - void setRecipes(Map, Map>> recipes); + void be_setRecipes(Map, Map>> recipes); } \ No newline at end of file diff --git a/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java b/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java index 5baffe2a..cd21aa6c 100644 --- a/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java @@ -30,7 +30,7 @@ public class RecipeManagerMixin { private Map, Map>> recipes; @Inject(method = "apply", at = @At(value = "RETURN")) - private void beSetRecipes(Map map, ResourceManager resourceManager, ProfilerFiller profiler, CallbackInfo info) { + private void be_apply(Map map, ResourceManager resourceManager, ProfilerFiller profiler, CallbackInfo info) { recipes = EndRecipeManager.getMap(recipes); } @@ -46,7 +46,7 @@ public class RecipeManagerMixin { * (example - mod stone with vanilla tags and furnace from that stone) */ @Overwrite - public > Optional getFirstMatch(RecipeType type, C inventory, Level world) { + public > Optional getRecipeFor(RecipeType type, C inventory, Level world) { Collection> values = getAllOfType(type).values(); List> list = new ArrayList>(values); list.sort((v1, v2) -> { diff --git a/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java b/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java similarity index 92% rename from src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java rename to src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java index 39e90b32..0656ed29 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java @@ -32,7 +32,7 @@ import ru.betterend.util.WorldDataUtil; import ru.betterend.world.generator.GeneratorOptions; @Mixin(ServerLevel.class) -public class ServerWorldMixin { +public class ServerLevelMixin { private static final int DEV_VERSION = be_getVersionInt("63.63.63"); private static final int FIX_VERSION = DEV_VERSION; private static String lastWorld = null; @@ -70,8 +70,8 @@ public class ServerWorldMixin { } } - @Inject(method = "getSpawnPos", at = @At("HEAD"), cancellable = true) - private void be_getSpawnPos(CallbackInfoReturnable info) { + @Inject(method = "getSharedSpawnPos", at = @At("HEAD"), cancellable = true) + private void be_getSharedSpawnPos(CallbackInfoReturnable info) { if (GeneratorOptions.changeSpawn()) { if (((ServerLevel) (Object) this).dimension() == Level.END) { info.setReturnValue(GeneratorOptions.getSpawn()); diff --git a/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java b/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java similarity index 64% rename from src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java rename to src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java index bda5a594..fd9bbb68 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerPlayerEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java @@ -33,28 +33,27 @@ import ru.betterend.interfaces.TeleportingEntity; import ru.betterend.world.generator.GeneratorOptions; @Mixin(ServerPlayer.class) -public abstract class ServerPlayerEntityMixin extends Player implements TeleportingEntity { - +public abstract class ServerPlayerMixin extends Player implements TeleportingEntity { @Shadow - public ServerGamePacketListenerImpl networkHandler; + public ServerGamePacketListenerImpl connection; @Final @Shadow - public ServerPlayerGameMode interactionManager; + public ServerPlayerGameMode gameMode; @Final @Shadow public MinecraftServer server; @Shadow - private boolean inTeleportationState; + private boolean isChangingDimension; @Shadow - private float syncedHealth; + private float lastSentHealth; @Shadow - private int syncedFoodLevel; + private int lastSentFood; @Shadow - private int syncedExperience; + private int lastSentExp; private BlockPos exitPos; - public ServerPlayerEntityMixin(Level world, BlockPos pos, float yaw, GameProfile profile) { + public ServerPlayerMixin(Level world, BlockPos pos, float yaw, GameProfile profile) { super(world, pos, yaw, profile); } @@ -67,21 +66,21 @@ public abstract class ServerPlayerEntityMixin extends Player implements Teleport @Inject(method = "getTeleportTarget", at = @At("HEAD"), cancellable = true) protected void be_getTeleportTarget(ServerLevel destination, CallbackInfoReturnable info) { - if (beCanTeleport()) { + if (be_canTeleport()) { info.setReturnValue(new PortalInfo(new Vec3(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), getDeltaMovement(), yRot, xRot)); } } - @Inject(method = "moveToWorld", at = @At("HEAD"), cancellable = true) - public void be_moveToWorld(ServerLevel destination, CallbackInfoReturnable info) { - if (beCanTeleport() && level instanceof ServerLevel) { - this.inTeleportationState = true; - ServerLevel serverWorld = this.getServerWorld(); + @Inject(method = "changeDimension", at = @At("HEAD"), cancellable = true) + public void be_changeDimension(ServerLevel destination, CallbackInfoReturnable info) { + if (be_canTeleport() && level instanceof ServerLevel) { + this.isChangingDimension = true; + ServerLevel serverWorld = this.getLevel(); LevelData worldProperties = destination.getLevelData(); ServerPlayer player = ServerPlayer.class.cast(this); - this.networkHandler.send(new ClientboundRespawnPacket(destination.dimensionType(), destination.dimension(), BiomeManager.obfuscateSeed(destination.getSeed()), - interactionManager.getGameModeForPlayer(),interactionManager.getPreviousGameModeForPlayer(), destination.isDebug(), destination.isFlat(), true)); - this.networkHandler.send(new ClientboundChangeDifficultyPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); + this.connection.send(new ClientboundRespawnPacket(destination.dimensionType(), destination.dimension(), BiomeManager.obfuscateSeed(destination.getSeed()), + gameMode.getGameModeForPlayer(),gameMode.getPreviousGameModeForPlayer(), destination.isDebug(), destination.isFlat(), true)); + this.connection.send(new ClientboundChangeDifficultyPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); PlayerList playerManager = this.server.getPlayerList(); playerManager.sendPlayerPermissionLevel(player); serverWorld.removePlayerImmediately(player); @@ -96,48 +95,48 @@ public abstract class ServerPlayerEntityMixin extends Player implements Teleport this.setRot(teleportTarget.yRot, teleportTarget.xRot); this.moveTo(teleportTarget.pos.x, teleportTarget.pos.y, teleportTarget.pos.z); serverWorld.getProfiler().pop(); - this.worldChanged(serverWorld); - this.interactionManager.setLevel(destination); - this.networkHandler.send(new ClientboundPlayerAbilitiesPacket(this.abilities)); + this.triggerDimensionChangeTriggers(serverWorld); + this.gameMode.setLevel(destination); + this.connection.send(new ClientboundPlayerAbilitiesPacket(this.abilities)); playerManager.sendLevelInfo(player, destination); playerManager.sendAllPlayerInfo(player); for (MobEffectInstance statusEffectInstance : this.getActiveEffects()) { - this.networkHandler.send(new ClientboundUpdateMobEffectPacket(getId(), statusEffectInstance)); + this.connection.send(new ClientboundUpdateMobEffectPacket(getId(), statusEffectInstance)); } - this.networkHandler.send(new ClientboundLevelEventPacket(1032, BlockPos.ZERO, 0, false)); - this.syncedExperience = -1; - this.syncedHealth = -1.0F; - this.syncedFoodLevel = -1; + this.connection.send(new ClientboundLevelEventPacket(1032, BlockPos.ZERO, 0, false)); + this.lastSentExp = -1; + this.lastSentHealth = -1.0F; + this.lastSentFood = -1; } - this.beResetExitPos(); + this.be_resetExitPos(); info.setReturnValue(player); } } @Shadow - abstract ServerLevel getServerWorld(); + abstract ServerLevel getLevel(); @Shadow - abstract void worldChanged(ServerLevel origin); + abstract void triggerDimensionChangeTriggers(ServerLevel origin); @Shadow @Override protected abstract PortalInfo findDimensionEntryPoint(ServerLevel destination); @Override - public void beSetExitPos(BlockPos pos) { + public void be_setExitPos(BlockPos pos) { this.exitPos = pos.immutable(); } @Override - public void beResetExitPos() { + public void be_resetExitPos() { this.exitPos = null; } @Override - public boolean beCanTeleport() { + public boolean be_canTeleport() { return this.exitPos != null; } } diff --git a/src/main/java/ru/betterend/mixin/common/SlimeEntityMixin.java b/src/main/java/ru/betterend/mixin/common/SlimeMixin.java similarity index 73% rename from src/main/java/ru/betterend/mixin/common/SlimeEntityMixin.java rename to src/main/java/ru/betterend/mixin/common/SlimeMixin.java index 151180d7..8dec140b 100644 --- a/src/main/java/ru/betterend/mixin/common/SlimeEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/SlimeMixin.java @@ -6,12 +6,12 @@ import org.spongepowered.asm.mixin.Shadow; import ru.betterend.interfaces.ISlime; @Mixin(Slime.class) -public class SlimeEntityMixin implements ISlime { +public class SlimeMixin implements ISlime { @Shadow protected void setSize(int size, boolean heal) {} @Override - public void beSetSlimeSize(int size, boolean heal) { + public void be_setSlimeSize(int size, boolean heal) { setSize(size, heal); } } diff --git a/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java similarity index 89% rename from src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java rename to src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java index 10489789..4968ed91 100644 --- a/src/main/java/ru/betterend/mixin/common/EndSpikeFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java @@ -31,16 +31,16 @@ import ru.betterend.util.WorldDataUtil; import ru.betterend.world.generator.GeneratorOptions; @Mixin(SpikeFeature.class) -public class EndSpikeFeatureMixin { - @Inject(method = "generate", at = @At("HEAD"), cancellable = true) - private void beSpikeGenerate(WorldGenLevel structureWorldAccess, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, SpikeConfiguration endSpikeFeatureConfig, CallbackInfoReturnable info) { +public class SpikeFeatureMixin { + @Inject(method = "place", at = @At("HEAD"), cancellable = true) + private void be_place(WorldGenLevel structureWorldAccess, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, SpikeConfiguration endSpikeFeatureConfig, CallbackInfoReturnable info) { if (!GeneratorOptions.hasPillars()) { info.setReturnValue(false); } } - @Inject(method = "generateSpike", at = @At("HEAD"), cancellable = true) - private void be_generateSpike(ServerLevelAccessor world, Random random, SpikeConfiguration config, SpikeFeature.EndSpike spike, CallbackInfo info) { + @Inject(method = "placeSpike", at = @At("HEAD"), cancellable = true) + private void be_placeSpike(ServerLevelAccessor world, Random random, SpikeConfiguration config, SpikeFeature.EndSpike spike, CallbackInfo info) { int x = spike.getCenterX(); int z = spike.getCenterZ(); int radius = spike.getRadius(); diff --git a/src/main/java/ru/betterend/mixin/common/TagGroupLoaderMixin.java b/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java similarity index 94% rename from src/main/java/ru/betterend/mixin/common/TagGroupLoaderMixin.java rename to src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java index bb201c67..42c555e6 100644 --- a/src/main/java/ru/betterend/mixin/common/TagGroupLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java @@ -15,8 +15,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.betterend.util.TagHelper; @Mixin(TagLoader.class) -public class TagGroupLoaderMixin { - +public class TagLoaderMixin { @Shadow private String entryType; diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index e5238040..c6ec7ef3 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -92,7 +92,7 @@ public class EndTags { } else if (block instanceof LeavesBlock || block instanceof SimpleLeavesBlock) { TagHelper.addTag(BlockTags.LEAVES, block); - ComposterBlockAccessor.callRegisterCompostableItem(0.3F, block); + ComposterBlockAccessor.callAdd(0.3F, block); } else if (block instanceof VineBlock) { TagHelper.addTag(BlockTags.CLIMBABLE, block); @@ -103,7 +103,7 @@ public class EndTags { Material mat = block.defaultBlockState().getMaterial(); if (mat.equals(Material.PLANT) || mat.equals(Material.REPLACEABLE_PLANT)) { - ComposterBlockAccessor.callRegisterCompostableItem(0.1F, block); + ComposterBlockAccessor.callAdd(0.1F, block); } }); @@ -111,7 +111,7 @@ public class EndTags { if (item.isEdible()) { FoodProperties food = item.getFoodProperties(); float compost = food.getNutrition() * food.getSaturationModifier() * 0.18F; - ComposterBlockAccessor.callRegisterCompostableItem(compost, item); + ComposterBlockAccessor.callAdd(compost, item); } }); diff --git a/src/main/java/ru/betterend/util/FeaturesHelper.java b/src/main/java/ru/betterend/util/FeaturesHelper.java index e7dcf4e1..476f5071 100644 --- a/src/main/java/ru/betterend/util/FeaturesHelper.java +++ b/src/main/java/ru/betterend/util/FeaturesHelper.java @@ -10,7 +10,7 @@ import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import com.google.common.collect.Lists; import com.google.common.collect.Sets; -import ru.betterend.mixin.common.GenerationSettingsAccessor; +import ru.betterend.mixin.common.BiomeGenerationSettingsAccessor; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndStructures; @@ -20,9 +20,9 @@ public class FeaturesHelper { public static void addFeatures(Registry biomeRegistry) { biomeRegistry.forEach((biome) -> { if (biome.getBiomeCategory() == Biome.BiomeCategory.THEEND && !INJECTED.contains(biome)) { - GenerationSettingsAccessor accessor = (GenerationSettingsAccessor) biome.getGenerationSettings(); - List>> structures = Lists.newArrayList(accessor.beGetStructures()); - List>>> preFeatures = accessor.beGetFeatures(); + BiomeGenerationSettingsAccessor accessor = (BiomeGenerationSettingsAccessor) biome.getGenerationSettings(); + List>> structures = Lists.newArrayList(accessor.be_getStructures()); + List>>> preFeatures = accessor.be_getFeatures(); List>>> features = new ArrayList>>>(preFeatures.size()); preFeatures.forEach((list) -> { features.add(Lists.newArrayList(list)); @@ -31,8 +31,8 @@ public class FeaturesHelper { EndFeatures.registerBiomeFeatures(biomeRegistry.getKey(biome), biome, features); EndStructures.registerBiomeStructures(biomeRegistry.getKey(biome), biome, structures); - accessor.beSetFeatures(features); - accessor.beSetStructures(structures); + accessor.be_setFeatures(features); + accessor.be_setStructures(structures); INJECTED.add(biome); } }); 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 f7f0f99d..ae049d10 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 @@ -119,7 +119,7 @@ public abstract class EndCaveFeature extends DefaultFeature { private void setBiome(WorldGenLevel world, BlockPos pos, EndCaveBiome biome) { IBiomeArray array = (IBiomeArray) world.getChunk(pos).getBiomes(); if (array != null) { - array.setBiome(biome.getActualBiome(), pos); + array.be_setBiome(biome.getActualBiome(), pos); } } diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index 5ce208b8..88651502 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -4,39 +4,39 @@ "package": "ru.betterend.mixin.common", "compatibilityLevel": "JAVA_8", "mixins": [ - "EnchantmentScreenHandlerMixin", - "PlayerAdvancementTrackerMixin", - "CraftingScreenHandlerMixin", - "GenerationSettingsAccessor", - "NoiseChunkGeneratorMixin", + "BiomeGenerationSettingsAccessor", + "NoiseBasedChunkGeneratorMixin", + "ChunkBiomeContainerMixin", "WeightedBiomePickerMixin", - "AnvilScreenHandlerMixin", "ChorusPlantFeatureMixin", - "ServerPlayerEntityMixin", - "ComposterBlockAccessor", + "PlayerAdvancementsMixin", "ChorusFlowerBlockMixin", - "EndPortalFeatureMixin", + "ComposterBlockAccessor", "ChorusPlantBlockMixin", + "EndPodiumFeatureMixin", + "PotionBrewingAccessor", "RecipeManagerAccessor", - "EndSpikeFeatureMixin", + "EnchantmentMenuMixin", "MinecraftServerMixin", - "EndermanEntityMixin", - "TagGroupLoaderMixin", - "AbstractBlockMixin", + "BlockBehaviourMixin", "DimensionTypeMixin", - "PlayerManagerMixin", "RecipeManagerMixin", - "HostileEntityMixin", "ArmorItemAccessor", "BoneMealItemMixin", + "CraftingMenuMixin", "LivingEntityMixin", - "PlayerEntityMixin", - "ServerWorldMixin", - "SlimeEntityMixin", + "ServerPlayerMixin", + "SpikeFeatureMixin", "AnvilBlockMixin", - "BrewingAccessor", - "BiomeArrayMixin", - "EntityMixin" + "PlayerListMixin", + "ServerLevelMixin", + "AnvilMenuMixin", + "TagLoaderMixin", + "EnderManMixin", + "MonsterMixin", + "EntityMixin", + "PlayerMixin", + "SlimeMixin" ], "injectors": { "defaultRequire": 1 From 81edbacc128459466e16d55123bb0cd2bbda1281 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sat, 17 Apr 2021 00:26:35 +0300 Subject: [PATCH 414/463] Migration complete --- build.gradle | 2 +- gradle.properties | 6 +-- .../mixin/client/AnvilScreenMixin.java | 24 +++++----- .../mixin/client/BackgroundRendererMixin.java | 22 +++++----- .../mixin/client/BiomeColorsMixin.java | 2 +- .../client/ClientPlayNetworkHandlerMixin.java | 12 ++--- .../mixin/client/ClientRecipeBookMixin.java | 10 ++--- .../mixin/client/ContextGsonAccessor.java | 2 +- .../client/EnchantingTableBlockMixin.java | 2 +- .../mixin/client/MinecraftClientMixin.java | 24 +++++----- .../mixin/client/ModelLoaderMixin.java | 8 ++-- .../mixin/client/ModelVariantMapMixin.java | 2 +- .../mixin/client/MusicTrackerMixin.java | 38 ++++++++-------- .../client/NamespaceResourceManagerMixin.java | 2 +- .../mixin/client/WorldRendererMixin.java | 6 +-- .../mixin/common/ChorusFlowerBlockMixin.java | 8 ++-- .../mixin/common/ChorusPlantBlockMixin.java | 41 +++++++++-------- .../mixin/common/CraftingMenuMixin.java | 6 +-- .../mixin/common/EnchantmentMenuMixin.java | 36 +++++++-------- .../betterend/mixin/common/EntityMixin.java | 34 +++++++------- .../mixin/common/LivingEntityMixin.java | 2 +- .../mixin/common/PlayerAdvancementsMixin.java | 2 +- .../mixin/common/RecipeManagerMixin.java | 6 +-- .../mixin/common/ServerPlayerMixin.java | 44 +++++++++---------- .../mixin/common/TagLoaderMixin.java | 4 +- 25 files changed, 173 insertions(+), 172 deletions(-) diff --git a/build.gradle b/build.gradle index b1895389..76c24419 100644 --- a/build.gradle +++ b/build.gradle @@ -32,7 +32,7 @@ dependencies { useOptional "me.shedaniel:RoughlyEnoughItems:${project.rei_version}" useOptional "me.shedaniel:RoughlyEnoughItems-api:${project.rei_version}" - useOptional "grondag:canvas-mc116:${project.canvas_version}" + //useOptional "grondag:canvas-mc116:${project.canvas_version}" } def useOptional(String dep) { diff --git a/gradle.properties b/gradle.properties index 5afb5c05..b8ce1799 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,8 +4,8 @@ # Fabric Properties # check these on https://fabricmc.net/use minecraft_version=1.16.5 - yarn_mappings=5 - loader_version=0.11.2 + yarn_mappings=6 + loader_version=0.11.3 # Mod Properties mod_version = 0.9.2-pre @@ -15,6 +15,6 @@ # Dependencies # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api patchouli_version = 50-FABRIC - fabric_version = 0.32.5+1.16 + fabric_version = 0.32.9+1.16 canvas_version = 1.0.+ rei_version = 5.8.10 \ No newline at end of file diff --git a/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java index 1bbed601..162c05c8 100644 --- a/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java +++ b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java @@ -27,7 +27,7 @@ import ru.betterend.interfaces.AnvilScreenHandlerExtended; public class AnvilScreenMixin extends ItemCombinerScreen { @Shadow - private EditBox nameField; + private EditBox name; private final List be_buttons = Lists.newArrayList(); private AnvilScreenHandlerExtended anvilHandler; @@ -37,24 +37,24 @@ public class AnvilScreenMixin extends ItemCombinerScreen { super(handler, playerInventory, title, texture); } - @Inject(method = "setup", at = @At("TAIL")) + @Inject(method = "subInit", at = @At("TAIL")) protected void be_setup(CallbackInfo info) { - this.be_buttons.clear(); int x = (width - imageWidth) / 2; int y = (height - imageHeight) / 2; - this.anvilHandler = (AnvilScreenHandlerExtended) this.menu; - this.be_buttons.add(new Button(x + 8, y + 45, 15, 20, new TextComponent("<"), (b) -> be_previousRecipe())); - this.be_buttons.add(new Button(x + 154, y + 45, 15, 20, new TextComponent(">"), (b) -> be_nextRecipe())); + anvilHandler = (AnvilScreenHandlerExtended) menu; + be_buttons.clear(); + be_buttons.add(new Button(x + 8, y + 45, 15, 20, new TextComponent("<"), (b) -> be_previousRecipe())); + be_buttons.add(new Button(x + 154, y + 45, 15, 20, new TextComponent(">"), (b) -> be_nextRecipe())); } - @Inject(method = "renderForeground", at = @At("TAIL")) + @Inject(method = "renderFg", at = @At("TAIL")) protected void be_renderForeground(PoseStack matrices, int mouseX, int mouseY, float delta, CallbackInfo info) { this.be_buttons.forEach(button -> { button.render(matrices, mouseX, mouseY, delta); }); } - @Inject(method = "onSlotUpdate", at = @At("HEAD"), cancellable = true) + @Inject(method = "slotChanged", at = @At("HEAD"), cancellable = true) public void be_onSlotUpdate(AbstractContainerMenu handler, int slotId, ItemStack stack, CallbackInfo info) { AnvilScreenHandlerExtended anvilHandler = (AnvilScreenHandlerExtended) handler; if (anvilHandler.be_getCurrentRecipe() != null) { @@ -63,7 +63,7 @@ public class AnvilScreenMixin extends ItemCombinerScreen { } else { this.be_buttons.forEach(button -> button.visible = false); } - this.nameField.setValue(""); + this.name.setValue(""); info.cancel(); } else { this.be_buttons.forEach(button -> button.visible = false); @@ -71,11 +71,11 @@ public class AnvilScreenMixin extends ItemCombinerScreen { } private void be_nextRecipe() { - this.anvilHandler.be_nextRecipe(); + anvilHandler.be_nextRecipe(); } private void be_previousRecipe() { - this.anvilHandler.be_previousRecipe(); + anvilHandler.be_previousRecipe(); } @Override @@ -85,7 +85,7 @@ public class AnvilScreenMixin extends ItemCombinerScreen { if (elem.visible && elem.mouseClicked(mouseX, mouseY, button)) { if (minecraft.gameMode != null) { int i = be_buttons.indexOf(elem); - this.minecraft.gameMode.handleInventoryButtonClick(menu.containerId, i); + minecraft.gameMode.handleInventoryButtonClick(menu.containerId, i); return true; } } diff --git a/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java b/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java index 993c4b51..2d6697dc 100644 --- a/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java @@ -34,13 +34,13 @@ public class BackgroundRendererMixin { private static long time; @Shadow - private static float red; + private static float fogRed; @Shadow - private static float green; + private static float fogGreen; @Shadow - private static float blue; + private static float fogBlue; - @Inject(method = "render", at = @At("RETURN")) + @Inject(method = "setupColor", at = @At("RETURN")) private static void be_onRender(Camera camera, float tickDelta, ClientLevel world, int i, float f, CallbackInfo info) { long l = Util.getMillis() - time; time += l; @@ -56,18 +56,18 @@ public class BackgroundRendererMixin { skip = effect != null && effect.getDuration() > 0; } if (!skip) { - red *= 4; - green *= 4; - blue *= 4; + fogRed *= 4; + fogGreen *= 4; + fogBlue *= 4; } } - BackgroundInfo.red = red; - BackgroundInfo.green = green; - BackgroundInfo.blue = blue; + BackgroundInfo.red = fogRed; + BackgroundInfo.green = fogGreen; + BackgroundInfo.blue = fogBlue; } - @Inject(method = "applyFog", at = @At("HEAD"), cancellable = true) + @Inject(method = "setupFog", at = @At("HEAD"), cancellable = true) private static void be_fogDensity(Camera camera, FogRenderer.FogMode fogType, float viewDistance, boolean thickFog, CallbackInfo info) { Entity entity = camera.getEntity(); Biome biome = entity.level.getBiome(entity.blockPosition()); diff --git a/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java b/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java index 4d18dda8..fc1f26ad 100644 --- a/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java +++ b/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java @@ -26,7 +26,7 @@ public class BiomeColorsMixin { private static final Point[] OFFSETS; private static final boolean HAS_SODIUM; - @Inject(method = "getWaterColor", at = @At("RETURN"), cancellable = true) + @Inject(method = "getAverageWaterColor", at = @At("RETURN"), cancellable = true) private static void be_getWaterColor(BlockAndTintGetter world, BlockPos pos, CallbackInfoReturnable info) { if (ClientOptions.useSulfurWaterColor()) { BlockAndTintGetter view = HAS_SODIUM ? Minecraft.getInstance().level : world; diff --git a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java index 9fd6850c..fd669eee 100644 --- a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java @@ -18,18 +18,18 @@ import ru.betterend.client.gui.BlockSignEditScreen; public class ClientPlayNetworkHandlerMixin { @Shadow - private Minecraft client; + private Minecraft minecraft; @Shadow - private ClientLevel world; + private ClientLevel level; - @Inject(method = "onSignEditorOpen", at = @At(value = "HEAD"), cancellable = true) + @Inject(method = "handleOpenSignEditor", at = @At(value = "HEAD"), cancellable = true) public void be_openSignEditor(ClientboundOpenSignEditorPacket packet, CallbackInfo info) { - PacketUtils.ensureRunningOnSameThread(packet, ClientPacketListener.class.cast(this), client); - BlockEntity blockEntity = world.getBlockEntity(packet.getPos()); + PacketUtils.ensureRunningOnSameThread(packet, ClientPacketListener.class.cast(this), minecraft); + BlockEntity blockEntity = level.getBlockEntity(packet.getPos()); if (blockEntity instanceof ESignBlockEntity) { ESignBlockEntity sign = (ESignBlockEntity) blockEntity; - client.setScreen(new BlockSignEditScreen(sign)); + minecraft.setScreen(new BlockSignEditScreen(sign)); info.cancel(); } } diff --git a/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java b/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java index 873da6b2..ff72ef08 100644 --- a/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java @@ -12,12 +12,10 @@ import ru.betterend.recipe.builders.AlloyingRecipe; @Mixin(ClientRecipeBook.class) public abstract class ClientRecipeBookMixin { - @Inject(method = "getGroupForRecipe", at = @At("HEAD"), cancellable = true) - private static void be_getGroupForRecipe(Recipe recipe, CallbackInfoReturnable cinfo) { - if (recipe instanceof AlloyingRecipe) { - cinfo.setReturnValue(RecipeBookCategories.BLAST_FURNACE_MISC); - } else if (recipe instanceof BetterEndRecipe) { - cinfo.setReturnValue(RecipeBookCategories.UNKNOWN); + @Inject(method = "getCategory", at = @At("HEAD"), cancellable = true) + private static void be_getGroupForRecipe(Recipe recipe, CallbackInfoReturnable info) { + if (recipe instanceof BetterEndRecipe) { + info.setReturnValue(RecipeBookCategories.UNKNOWN); } } } diff --git a/src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java b/src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java index 300486c2..3c208101 100644 --- a/src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java +++ b/src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java @@ -9,5 +9,5 @@ import net.minecraft.client.renderer.block.model.BlockModelDefinition; @Mixin(BlockModelDefinition.Context.class) public interface ContextGsonAccessor { @Accessor - public Gson getGson(); + Gson getGson(); } diff --git a/src/main/java/ru/betterend/mixin/client/EnchantingTableBlockMixin.java b/src/main/java/ru/betterend/mixin/client/EnchantingTableBlockMixin.java index 55ce721d..4ff34f60 100644 --- a/src/main/java/ru/betterend/mixin/client/EnchantingTableBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/client/EnchantingTableBlockMixin.java @@ -19,7 +19,7 @@ public abstract class EnchantingTableBlockMixin extends Block { super(settings); } - @Inject(method = "randomDisplayTick", at = @At(value = "TAIL")) + @Inject(method = "animateTick", at = @At(value = "TAIL")) private void be_onRandomDisplayTick(BlockState state, Level world, BlockPos pos, Random random, CallbackInfo info) { for (int px = -2; px <= 2; ++px) { for (int pz = -2; pz <= 2; ++pz) { diff --git a/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java b/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java index 06ac5e6a..32d4938c 100644 --- a/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java +++ b/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java @@ -29,21 +29,21 @@ public class MinecraftClientMixin { public LocalPlayer player; @Shadow - public Screen currentScreen; - - @Shadow + public Screen screen; + @Final - public Gui inGameHud; - - @Shadow - public ClientLevel world; + @Shadow + public Gui gui; @Shadow + public ClientLevel level; + @Final + @Shadow private BlockColors blockColors; - @Shadow @Final + @Shadow private ItemColors itemColors; @Inject(method = "*", at = @At("TAIL")) @@ -57,15 +57,15 @@ public class MinecraftClientMixin { }); } - @Inject(method = "getMusicType", at = @At("HEAD"), cancellable = true) + @Inject(method = "getSituationalMusic", at = @At("HEAD"), cancellable = true) private void be_getEndMusic(CallbackInfoReturnable info) { - if (!(this.currentScreen instanceof WinScreen) && this.player != null) { + if (!(this.screen instanceof WinScreen) && this.player != null) { if (this.player.level.dimension() == Level.END) { - if (this.inGameHud.getBossOverlay().shouldPlayMusic() && MHelper.lengthSqr(this.player.getX(), this.player.getZ()) < 250000) { + if (this.gui.getBossOverlay().shouldPlayMusic() && MHelper.lengthSqr(this.player.getX(), this.player.getZ()) < 250000) { info.setReturnValue(Musics.END_BOSS); } else { - Music sound = (Music) this.world.getBiomeManager().getNoiseBiomeAtPosition(this.player.blockPosition()).getBackgroundMusic().orElse(Musics.END); + Music sound = (Music) this.level.getBiomeManager().getNoiseBiomeAtPosition(this.player.blockPosition()).getBackgroundMusic().orElse(Musics.END); info.setReturnValue(sound); } info.cancel(); diff --git a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java index 687e9475..0af76236 100644 --- a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java @@ -29,7 +29,7 @@ public class ModelLoaderMixin { @Shadow private ResourceManager resourceManager; - @Inject(method = "loadModelFromJson", at = @At("HEAD"), cancellable = true) + @Inject(method = "loadBlockModel", at = @At("HEAD"), cancellable = true) private void be_loadModelPattern(ResourceLocation id, CallbackInfoReturnable info) { if (id.getNamespace().equals(BetterEnd.MOD_ID)) { ResourceLocation modelId = new ResourceLocation(id.getNamespace(), "models/" + id.getPath() + ".json"); @@ -40,7 +40,7 @@ public class ModelLoaderMixin { model.name = id.toString(); info.setReturnValue(model); } catch (Exception ex) { - String data[] = id.getPath().split("/"); + String[] data = id.getPath().split("/"); if (data.length > 1) { ResourceLocation itemId = new ResourceLocation(id.getNamespace(), data[1]); Optional block = Registry.BLOCK.getOptional(itemId); @@ -63,7 +63,7 @@ public class ModelLoaderMixin { } } - private BlockModel be_getModel(String data[], ResourceLocation id, Patterned patterned) { + private BlockModel be_getModel(String[] data, ResourceLocation id, Patterned patterned) { String pattern; if (id.getPath().contains("item")) { pattern = patterned.getModelPattern(id.getPath()); @@ -81,7 +81,7 @@ public class ModelLoaderMixin { } @ModifyVariable(method = "loadModel", ordinal = 2, at = @At(value = "INVOKE")) - public ResourceLocation be_SwitchModel(ResourceLocation id) { + public ResourceLocation be_switchModel(ResourceLocation id) { if (GeneratorOptions.changeChorusPlant() && id.getNamespace().equals("minecraft") && id.getPath().startsWith("blockstates/") && id.getPath().contains("chorus") && !id.getPath().contains("custom_")) { id = new ResourceLocation(id.getPath().replace("chorus", "custom_chorus")); } diff --git a/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java b/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java index 60c4e394..924546b8 100644 --- a/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java @@ -16,7 +16,7 @@ import ru.betterend.patterns.BlockPatterned; @Mixin(BlockModelDefinition.class) public abstract class ModelVariantMapMixin { - @Inject(method = "deserialize", at = @At("HEAD"), cancellable = true) + @Inject(method = "fromStream", at = @At("HEAD"), cancellable = true) private static void be_deserializeBlockState(BlockModelDefinition.Context context, Reader reader, CallbackInfoReturnable info) { Block block = context.getDefinition().any().getBlock(); if (block instanceof BlockPatterned) { diff --git a/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java b/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java index d28a8e45..6e9072b1 100644 --- a/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java @@ -17,20 +17,20 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.betterend.client.ClientOptions; @Mixin(MusicManager.class) -public class MusicTrackerMixin { - @Shadow +public abstract class MusicTrackerMixin { @Final - private Minecraft client; - @Shadow + private Minecraft minecraft; + @Final + @Shadow private Random random; @Shadow - private SoundInstance current; + private SoundInstance currentMusic; @Shadow - private int timeUntilNextSong; + private int nextSongDelay; private static float volume = 1; private static float srcVolume = 0; @@ -39,16 +39,16 @@ public class MusicTrackerMixin { @Inject(method = "tick", at = @At("HEAD"), cancellable = true) public void be_onTick(CallbackInfo info) { if (ClientOptions.blendBiomeMusic()) { - Music musicSound = client.getSituationalMusic(); + Music musicSound = minecraft.getSituationalMusic(); if (be_checkNullSound(musicSound) && volume > 0 && be_isInEnd() && be_shouldChangeSound(musicSound)) { if (volume > 0) { if (srcVolume < 0) { - srcVolume = current.getVolume(); + srcVolume = currentMusic.getVolume(); } - if (current instanceof AbstractSoundInstance) { - ((AbstractSoundInstanceAccessor) current).setVolume(volume); + if (currentMusic instanceof AbstractSoundInstance) { + ((AbstractSoundInstanceAccessor) currentMusic).setVolume(volume); } - client.getSoundManager().updateSourceVolume(current.getSource(), current.getVolume() * volume); + minecraft.getSoundManager().updateSourceVolume(currentMusic.getSource(), currentMusic.getVolume() * volume); long t = System.currentTimeMillis(); if (volume == 1 && time == 0) { time = t; @@ -64,12 +64,12 @@ public class MusicTrackerMixin { volume = 1; time = 0; srcVolume = -1; - this.client.getSoundManager().stop(this.current); - this.timeUntilNextSong = Mth.nextInt(this.random, 0, musicSound.getMinDelay() / 2); - this.current = null; + this.minecraft.getSoundManager().stop(this.currentMusic); + this.nextSongDelay = Mth.nextInt(this.random, 0, musicSound.getMinDelay() / 2); + this.currentMusic = null; } - if (this.current == null && this.timeUntilNextSong-- <= 0) { - this.play(musicSound); + if (this.currentMusic == null && this.nextSongDelay-- <= 0) { + this.startPlaying(musicSound); } info.cancel(); } @@ -80,11 +80,11 @@ public class MusicTrackerMixin { } private boolean be_isInEnd() { - return client.level != null && client.level.dimension().equals(Level.END); + return minecraft.level != null && minecraft.level.dimension().equals(Level.END); } private boolean be_shouldChangeSound(Music musicSound) { - return current != null && !musicSound.getEvent().getLocation().equals(this.current.getLocation()) && musicSound.replaceCurrentMusic(); + return currentMusic != null && !musicSound.getEvent().getLocation().equals(this.currentMusic.getLocation()) && musicSound.replaceCurrentMusic(); } private boolean be_checkNullSound(Music musicSound) { @@ -92,5 +92,5 @@ public class MusicTrackerMixin { } @Shadow - public void play(Music type) {} + public abstract void startPlaying(Music type); } diff --git a/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java b/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java index 0320e2fb..824161eb 100644 --- a/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java @@ -23,7 +23,7 @@ public abstract class NamespaceResourceManagerMixin { @Shadow public abstract Resource getResource(ResourceLocation id); - @Inject(method = "getAllResources", cancellable = true, at = @At( + @Inject(method = "getResources", cancellable = true, at = @At( value = "NEW", target = "java/io/FileNotFoundException", shift = Shift.BEFORE)) diff --git a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java index fd02404f..2830919a 100644 --- a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java @@ -62,14 +62,14 @@ public class WorldRendererMixin { @Shadow @Final - private Minecraft client; + private Minecraft minecraft; @Shadow @Final private TextureManager textureManager; @Shadow - private ClientLevel world; + private ClientLevel level; @Shadow private int ticks; @@ -92,7 +92,7 @@ public class WorldRendererMixin { @Inject(method = "renderSky", at = @At("HEAD"), cancellable = true) private void be_renderBetterEndSky(PoseStack matrices, float tickDelta, CallbackInfo info) { - if (ClientOptions.isCustomSky() && client.level.effects().skyType() == DimensionSpecialEffects.SkyType.END) { + if (ClientOptions.isCustomSky() && minecraft.level.effects().skyType() == DimensionSpecialEffects.SkyType.END) { time = (ticks % 360000) * 0.000017453292F; time2 = time * 2; time3 = time * 3; diff --git a/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java index 2e364740..ba5f2062 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java @@ -38,9 +38,9 @@ public abstract class ChorusFlowerBlockMixin extends Block { super(settings); } - @Shadow @Final - private ChorusPlantBlock plantBlock; + @Shadow + private ChorusPlantBlock plant; @Inject(method = "canSurvive", at = @At("HEAD"), cancellable = true) private void be_canSurvive(BlockState state, LevelReader world, BlockPos pos, CallbackInfoReturnable info) { @@ -59,10 +59,10 @@ public abstract class ChorusFlowerBlockMixin extends Block { if (i < 5) { this.placeGrownFlower(world, up, i + 1); if (GeneratorOptions.changeChorusPlant()) { - BlocksHelper.setWithoutUpdate(world, pos, plantBlock.defaultBlockState().setValue(ChorusPlantBlock.UP, true).setValue(ChorusPlantBlock.DOWN, true).setValue(BlocksHelper.ROOTS, true)); + BlocksHelper.setWithoutUpdate(world, pos, plant.defaultBlockState().setValue(ChorusPlantBlock.UP, true).setValue(ChorusPlantBlock.DOWN, true).setValue(BlocksHelper.ROOTS, true)); } else { - BlocksHelper.setWithoutUpdate(world, pos, plantBlock.defaultBlockState().setValue(ChorusPlantBlock.UP, true).setValue(ChorusPlantBlock.DOWN, true)); + BlocksHelper.setWithoutUpdate(world, pos, plant.defaultBlockState().setValue(ChorusPlantBlock.UP, true).setValue(ChorusPlantBlock.DOWN, true)); } info.cancel(); } diff --git a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java index dbc265cd..55539d66 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java @@ -44,12 +44,31 @@ public abstract class ChorusPlantBlockMixin extends Block { builder.add(BlocksHelper.ROOTS); } } - + @Inject(method = "getStateForPlacement", at = @At("RETURN"), cancellable = true) - private void be_getStateForPlacement(BlockGetter world, BlockPos pos, CallbackInfoReturnable info) { + private void be_getStateForPlacement(BlockPlaceContext ctx, CallbackInfoReturnable info) { + BlockPos pos = ctx.getClickedPos(); + Level world = ctx.getLevel(); + BlockState plant = info.getReturnValue(); + if (ctx.canPlace() && plant.is(Blocks.CHORUS_PLANT) && world.getBlockState(pos.below()).is(EndTags.END_GROUND)) { + if (GeneratorOptions.changeChorusPlant()) { + info.setReturnValue(plant.setValue(BlocksHelper.ROOTS, true).setValue(BlockStateProperties.DOWN, true)); + } + else { + info.setReturnValue(plant.setValue(BlockStateProperties.DOWN, true)); + } + info.cancel(); + } + } + + @Inject(method = "Lnet/minecraft/world/level/block/ChorusPlantBlock;getStateForPlacement" + + "(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)" + + "Lnet/minecraft/world/level/block/state/BlockState;", + at = @At("RETURN"), cancellable = true) + private void be_getStateForPlacement(BlockGetter blockGetter, BlockPos blockPos, CallbackInfoReturnable info) { BlockState plant = info.getReturnValue(); if (plant.is(Blocks.CHORUS_PLANT)) { - if (world.getBlockState(pos.below()).is(EndTags.END_GROUND)) { + if (blockGetter.getBlockState(blockPos.below()).is(EndTags.END_GROUND)) { if (GeneratorOptions.changeChorusPlant()) { info.setReturnValue(plant.setValue(BlockStateProperties.DOWN, true).setValue(BlocksHelper.ROOTS, true)); } @@ -99,20 +118,4 @@ public abstract class ChorusPlantBlockMixin extends Block { info.cancel(); } } - - @Inject(method = "getStateForPlacement", at = @At("RETURN"), cancellable = true) - private void be_getStateForPlacement(BlockPlaceContext ctx, CallbackInfoReturnable info) { - BlockPos pos = ctx.getClickedPos(); - Level world = ctx.getLevel(); - BlockState plant = info.getReturnValue(); - if (ctx.canPlace() && plant.is(Blocks.CHORUS_PLANT) && world.getBlockState(pos.below()).is(EndTags.END_GROUND)) { - if (GeneratorOptions.changeChorusPlant()) { - info.setReturnValue(plant.setValue(BlocksHelper.ROOTS, true).setValue(BlockStateProperties.DOWN, true)); - } - else { - info.setReturnValue(plant.setValue(BlockStateProperties.DOWN, true)); - } - info.cancel(); - } - } } diff --git a/src/main/java/ru/betterend/mixin/common/CraftingMenuMixin.java b/src/main/java/ru/betterend/mixin/common/CraftingMenuMixin.java index b1a40263..48e81bf2 100644 --- a/src/main/java/ru/betterend/mixin/common/CraftingMenuMixin.java +++ b/src/main/java/ru/betterend/mixin/common/CraftingMenuMixin.java @@ -13,13 +13,13 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(CraftingMenu.class) public abstract class CraftingMenuMixin { - @Shadow @Final - private ContainerLevelAccess context; + @Shadow + private ContainerLevelAccess access; @Inject(method = "stillValid", at = @At("HEAD"), cancellable = true) private void be_stillValid(Player player, CallbackInfoReturnable info) { - if (context.evaluate((world, pos) -> { + if (access.evaluate((world, pos) -> { return world.getBlockState(pos).getBlock() instanceof CraftingTableBlock; }, true)) { info.setReturnValue(true); diff --git a/src/main/java/ru/betterend/mixin/common/EnchantmentMenuMixin.java b/src/main/java/ru/betterend/mixin/common/EnchantmentMenuMixin.java index 8695a9ed..e47fa771 100644 --- a/src/main/java/ru/betterend/mixin/common/EnchantmentMenuMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EnchantmentMenuMixin.java @@ -22,20 +22,20 @@ import ru.betterend.registry.EndTags; @Mixin(EnchantmentMenu.class) public abstract class EnchantmentMenuMixin extends AbstractContainerMenu { - @Shadow @Final + @Shadow private Container enchantSlots; - @Shadow @Final + @Shadow private ContainerLevelAccess access; - @Shadow @Final + @Shadow private Random random; - @Shadow @Final + @Shadow private DataSlot enchantmentSeed; @Shadow @@ -95,36 +95,36 @@ public abstract class EnchantmentMenuMixin extends AbstractContainerMenu { } } - this.random.setSeed((long) this.enchantmentSeed.get()); + random.setSeed(enchantmentSeed.get()); for (j = 0; j < 3; ++j) { - this.costs[j] = EnchantmentHelper.getEnchantmentCost(this.random, j, i, itemStack); - this.enchantClue[j] = -1; - this.levelClue[j] = -1; - if (this.costs[j] < j + 1) { - this.costs[j] = 0; + costs[j] = EnchantmentHelper.getEnchantmentCost(this.random, j, i, itemStack); + enchantClue[j] = -1; + levelClue[j] = -1; + if (costs[j] < j + 1) { + costs[j] = 0; } } for (j = 0; j < 3; ++j) { if (this.costs[j] > 0) { - List list = this.generateEnchantments(itemStack, j, this.costs[j]); + List list = this.getEnchantmentList(itemStack, j, this.costs[j]); if (list != null && !list.isEmpty()) { EnchantmentInstance enchantmentLevelEntry = (EnchantmentInstance) list.get(this.random.nextInt(list.size())); - this.enchantClue[j] = Registry.ENCHANTMENT.getId(enchantmentLevelEntry.enchantment); - this.levelClue[j] = enchantmentLevelEntry.level; + enchantClue[j] = Registry.ENCHANTMENT.getId(enchantmentLevelEntry.enchantment); + levelClue[j] = enchantmentLevelEntry.level; } } } - this.broadcastChanges(); + broadcastChanges(); }); } else { for (int i = 0; i < 3; ++i) { - this.costs[i] = 0; - this.enchantClue[i] = -1; - this.levelClue[i] = -1; + costs[i] = 0; + enchantClue[i] = -1; + levelClue[i] = -1; } } info.cancel(); @@ -132,7 +132,7 @@ public abstract class EnchantmentMenuMixin extends AbstractContainerMenu { } @Shadow - private List generateEnchantments(ItemStack stack, int slot, int level) { + private List getEnchantmentList(ItemStack stack, int slot, int level) { return null; } } diff --git a/src/main/java/ru/betterend/mixin/common/EntityMixin.java b/src/main/java/ru/betterend/mixin/common/EntityMixin.java index 21a3c5dd..914cd05b 100644 --- a/src/main/java/ru/betterend/mixin/common/EntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EntityMixin.java @@ -24,45 +24,45 @@ public abstract class EntityMixin implements TeleportingEntity { @Shadow public boolean removed; @Shadow - public Level world; + public Level level; @Final @Shadow - public abstract void detach(); + public abstract void unRide(); @Shadow - public abstract Vec3 getVelocity(); + public abstract Vec3 getDeltaMovement(); @Shadow public abstract EntityType getType(); @Shadow - protected abstract PortalInfo getTeleportTarget(ServerLevel destination); + protected abstract PortalInfo findDimensionEntryPoint(ServerLevel destination); private BlockPos exitPos; @Inject(method = "changeDimension", at = @At("HEAD"), cancellable = true) public void be_changeDimension(ServerLevel destination, CallbackInfoReturnable info) { - if (!removed && be_canTeleport() && world instanceof ServerLevel) { - this.detach(); - this.world.getProfiler().push("changeDimension"); - this.world.getProfiler().push("reposition"); - PortalInfo teleportTarget = this.getTeleportTarget(destination); + if (!removed && be_canTeleport() && level instanceof ServerLevel) { + unRide(); + level.getProfiler().push("changeDimension"); + level.getProfiler().push("reposition"); + PortalInfo teleportTarget = findDimensionEntryPoint(destination); if (teleportTarget != null) { - this.world.getProfiler().popPush("reloading"); - Entity entity = this.getType().create(destination); + level.getProfiler().popPush("reloading"); + Entity entity = getType().create(destination); if (entity != null) { entity.restoreFrom(Entity.class.cast(this)); entity.moveTo(teleportTarget.pos.x, teleportTarget.pos.y, teleportTarget.pos.z, teleportTarget.yRot, entity.xRot); entity.setDeltaMovement(teleportTarget.speed); destination.addFromAnotherDimension(entity); } - this.removed = true; - this.world.getProfiler().pop(); - ((ServerLevel) world).resetEmptyTime(); + removed = true; + level.getProfiler().pop(); + ((ServerLevel) level).resetEmptyTime(); destination.resetEmptyTime(); - this.world.getProfiler().pop(); - this.be_resetExitPos(); + level.getProfiler().pop(); + be_resetExitPos(); info.setReturnValue(entity); } } @@ -71,7 +71,7 @@ public abstract class EntityMixin implements TeleportingEntity { @Inject(method = "findDimensionEntryPoint", at = @At("HEAD"), cancellable = true) protected void be_findDimensionEntryPoint(ServerLevel destination, CallbackInfoReturnable info) { if (be_canTeleport()) { - info.setReturnValue(new PortalInfo(new Vec3(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), getVelocity(), yRot, xRot)); + info.setReturnValue(new PortalInfo(new Vec3(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), getDeltaMovement(), yRot, xRot)); } } diff --git a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java index d2d4950d..138e9c29 100644 --- a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java @@ -23,7 +23,7 @@ public abstract class LivingEntityMixin { this.lastAttacker = source.getEntity(); } - @ModifyArg(method = "hurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;knockback(FDD)V")) + @ModifyArg(method = "hurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;knockback(FDD)V")) private float be_increaseKnockback(float value, double x, double z) { if (lastAttacker != null && lastAttacker instanceof LivingEntity) { LivingEntity attacker = (LivingEntity) lastAttacker; diff --git a/src/main/java/ru/betterend/mixin/common/PlayerAdvancementsMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerAdvancementsMixin.java index e3bfcc97..a1bbcb95 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerAdvancementsMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerAdvancementsMixin.java @@ -18,7 +18,7 @@ public abstract class PlayerAdvancementsMixin { @Inject(method = "award", at = @At( value = "INVOKE", - target = "Lnet/minecraft/server/PlayerAdvancements;grant(Lnet/minecraft/server/level/ServerPlayer;)V", + target = "Lnet/minecraft/advancements/AdvancementRewards;grant(Lnet/minecraft/server/level/ServerPlayer;)V", shift = Shift.AFTER)) public void be_award(Advancement advancement, String criterionName, CallbackInfoReturnable info) { PlayerAdvancementsEvents.PLAYER_ADVENCEMENT_COMPLETE.invoker().onAdvancementComplete(player, advancement, criterionName); diff --git a/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java b/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java index cd21aa6c..fa5c1250 100644 --- a/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java @@ -25,7 +25,7 @@ import com.google.gson.JsonElement; import ru.betterend.recipe.EndRecipeManager; @Mixin(RecipeManager.class) -public class RecipeManagerMixin { +public abstract class RecipeManagerMixin { @Shadow private Map, Map>> recipes; @@ -35,7 +35,7 @@ public class RecipeManagerMixin { } @Shadow - private > Map> getAllOfType(RecipeType type) { + private > Map> byType(RecipeType type) { return null; } @@ -47,7 +47,7 @@ public class RecipeManagerMixin { */ @Overwrite public > Optional getRecipeFor(RecipeType type, C inventory, Level world) { - Collection> values = getAllOfType(type).values(); + Collection> values = byType(type).values(); List> list = new ArrayList>(values); list.sort((v1, v2) -> { boolean b1 = v1.getId().getNamespace().equals("minecraft"); diff --git a/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java b/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java index fd9bbb68..044ca48f 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java @@ -57,14 +57,14 @@ public abstract class ServerPlayerMixin extends Player implements TeleportingEnt super(world, pos, yaw, profile); } - @Inject(method = "createEndSpawnPlatform", at = @At("HEAD"), cancellable = true) + @Inject(method = "createEndPlatform", at = @At("HEAD"), cancellable = true) private void be_createEndSpawnPlatform(ServerLevel world, BlockPos centerPos, CallbackInfo info) { if (!GeneratorOptions.generateObsidianPlatform()) { info.cancel(); } } - @Inject(method = "getTeleportTarget", at = @At("HEAD"), cancellable = true) + @Inject(method = "findDimensionEntryPoint", at = @At("HEAD"), cancellable = true) protected void be_getTeleportTarget(ServerLevel destination, CallbackInfoReturnable info) { if (be_canTeleport()) { info.setReturnValue(new PortalInfo(new Vec3(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), getDeltaMovement(), yRot, xRot)); @@ -74,43 +74,43 @@ public abstract class ServerPlayerMixin extends Player implements TeleportingEnt @Inject(method = "changeDimension", at = @At("HEAD"), cancellable = true) public void be_changeDimension(ServerLevel destination, CallbackInfoReturnable info) { if (be_canTeleport() && level instanceof ServerLevel) { - this.isChangingDimension = true; - ServerLevel serverWorld = this.getLevel(); + isChangingDimension = true; + ServerLevel serverWorld = getLevel(); LevelData worldProperties = destination.getLevelData(); ServerPlayer player = ServerPlayer.class.cast(this); - this.connection.send(new ClientboundRespawnPacket(destination.dimensionType(), destination.dimension(), BiomeManager.obfuscateSeed(destination.getSeed()), + connection.send(new ClientboundRespawnPacket(destination.dimensionType(), destination.dimension(), BiomeManager.obfuscateSeed(destination.getSeed()), gameMode.getGameModeForPlayer(),gameMode.getPreviousGameModeForPlayer(), destination.isDebug(), destination.isFlat(), true)); - this.connection.send(new ClientboundChangeDifficultyPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); - PlayerList playerManager = this.server.getPlayerList(); + connection.send(new ClientboundChangeDifficultyPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); + PlayerList playerManager = server.getPlayerList(); playerManager.sendPlayerPermissionLevel(player); serverWorld.removePlayerImmediately(player); - this.removed = false; - PortalInfo teleportTarget = this.findDimensionEntryPoint(destination); + removed = false; + PortalInfo teleportTarget = findDimensionEntryPoint(destination); if (teleportTarget != null) { serverWorld.getProfiler().push("moving"); serverWorld.getProfiler().pop(); serverWorld.getProfiler().push("placing"); - this.setLevel(destination); + setLevel(destination); destination.addDuringPortalTeleport(player); - this.setRot(teleportTarget.yRot, teleportTarget.xRot); - this.moveTo(teleportTarget.pos.x, teleportTarget.pos.y, teleportTarget.pos.z); + setRot(teleportTarget.yRot, teleportTarget.xRot); + moveTo(teleportTarget.pos.x, teleportTarget.pos.y, teleportTarget.pos.z); serverWorld.getProfiler().pop(); - this.triggerDimensionChangeTriggers(serverWorld); - this.gameMode.setLevel(destination); - this.connection.send(new ClientboundPlayerAbilitiesPacket(this.abilities)); + triggerDimensionChangeTriggers(serverWorld); + gameMode.setLevel(destination); + connection.send(new ClientboundPlayerAbilitiesPacket(abilities)); playerManager.sendLevelInfo(player, destination); playerManager.sendAllPlayerInfo(player); - for (MobEffectInstance statusEffectInstance : this.getActiveEffects()) { - this.connection.send(new ClientboundUpdateMobEffectPacket(getId(), statusEffectInstance)); + for (MobEffectInstance statusEffectInstance : getActiveEffects()) { + connection.send(new ClientboundUpdateMobEffectPacket(getId(), statusEffectInstance)); } - this.connection.send(new ClientboundLevelEventPacket(1032, BlockPos.ZERO, 0, false)); - this.lastSentExp = -1; - this.lastSentHealth = -1.0F; - this.lastSentFood = -1; + connection.send(new ClientboundLevelEventPacket(1032, BlockPos.ZERO, 0, false)); + lastSentExp = -1; + lastSentHealth = -1.0F; + lastSentFood = -1; } - this.be_resetExitPos(); + be_resetExitPos(); info.setReturnValue(player); } } diff --git a/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java b/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java index 42c555e6..b2d5354b 100644 --- a/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java @@ -17,14 +17,14 @@ import ru.betterend.util.TagHelper; @Mixin(TagLoader.class) public class TagLoaderMixin { @Shadow - private String entryType; + private String directory; @Inject(method = "prepare", at = @At("RETURN"), cancellable = true) public void be_prepareReload(ResourceManager manager, Executor executor, CallbackInfoReturnable>> info) { CompletableFuture> future = info.getReturnValue(); info.setReturnValue(CompletableFuture.supplyAsync(() -> { Map map = future.join(); - TagHelper.apply(entryType, map); + TagHelper.apply(directory, map); return map; }, executor)); } From 50d42c1218027c1520fffba5511dbe2dffab65a9 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sat, 17 Apr 2021 00:56:30 +0300 Subject: [PATCH 415/463] Update TagHelper.java --- src/main/java/ru/betterend/util/TagHelper.java | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/main/java/ru/betterend/util/TagHelper.java b/src/main/java/ru/betterend/util/TagHelper.java index 2ca68e42..d4224e2c 100644 --- a/src/main/java/ru/betterend/util/TagHelper.java +++ b/src/main/java/ru/betterend/util/TagHelper.java @@ -12,16 +12,12 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; public class TagHelper { - private static final Map> TAGS_BLOCK = Maps.newHashMap(); - private static final Map> TAGS_ITEM = Maps.newHashMap(); + private static final Map> TAGS_BLOCK = Maps.newConcurrentMap(); + private static final Map> TAGS_ITEM = Maps.newConcurrentMap(); public static void addTag(Tag.Named tag, Block... blocks) { ResourceLocation tagID = tag.getName(); - Set set = TAGS_BLOCK.get(tagID); - if (set == null) { - set = Sets.newHashSet(); - TAGS_BLOCK.put(tagID, set); - } + Set set = TAGS_BLOCK.computeIfAbsent(tagID, k -> Sets.newHashSet()); for (Block block: blocks) { ResourceLocation id = Registry.BLOCK.getKey(block); if (id != Registry.BLOCK.getDefaultKey()) { @@ -32,11 +28,7 @@ public class TagHelper { public static void addTag(Tag.Named tag, ItemLike... items) { ResourceLocation tagID = tag.getName(); - Set set = TAGS_ITEM.get(tagID); - if (set == null) { - set = Sets.newHashSet(); - TAGS_ITEM.put(tagID, set); - } + Set set = TAGS_ITEM.computeIfAbsent(tagID, k -> Sets.newHashSet()); for (ItemLike item: items) { ResourceLocation id = Registry.ITEM.getKey(item.asItem()); if (id != Registry.ITEM.getDefaultKey()) { From 2b19382e887d45975153a8297942a49ab532b329 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sat, 17 Apr 2021 11:25:30 +0300 Subject: [PATCH 416/463] EndTags refactor --- .../java/ru/betterend/registry/EndTags.java | 67 +++++++++---------- 1 file changed, 32 insertions(+), 35 deletions(-) diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index c6ec7ef3..4c686a8b 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -1,7 +1,10 @@ package ru.betterend.registry; import java.util.Arrays; +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; @@ -11,6 +14,7 @@ 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.BlockItem; import net.minecraft.world.item.Item; @@ -26,6 +30,7 @@ import ru.betterend.blocks.EndTerrainBlock; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.basis.SimpleLeavesBlock; import ru.betterend.blocks.basis.VineBlock; +import ru.betterend.item.tool.EndHammerItem; import ru.betterend.mixin.common.ComposterBlockAccessor; import ru.betterend.util.TagHelper; @@ -46,30 +51,31 @@ public class EndTags { public static final Tag.Named ITEM_CHEST = makeCommonItemTag("chest"); public static final Tag.Named IRON_INGOTS = makeCommonItemTag("iron_ingots"); public static final Tag.Named FURNACES = makeCommonItemTag("furnaces"); - public final static Tag HAMMERS = registerFabricItemTag("hammers"); - + 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) { - ResourceLocation id = BetterEnd.makeID(name); - Tag tag = BlockTags.getAllTags().getTag(id); - return tag == null ? (Named) TagRegistry.block(id) : (Named) tag; + return makeTag(BlockTags::getAllTags, BetterEnd.makeID(name)); } public static Tag.Named makeItemTag(String name) { - ResourceLocation id = BetterEnd.makeID(name); - Tag tag = ItemTags.getAllTags().getTag(id); - return tag == null ? (Named) TagRegistry.item(id) : (Named) tag; + return makeTag(ItemTags::getAllTags, BetterEnd.makeID(name)); } public static Tag.Named makeCommonBlockTag(String name) { - ResourceLocation id = new ResourceLocation("c", name); - Tag tag = BlockTags.getAllTags().getTag(id); - return tag == null ? (Named) TagRegistry.block(id) : (Named) tag; + return makeTag(BlockTags::getAllTags, new ResourceLocation("c", name)); } public static Tag.Named makeCommonItemTag(String name) { - ResourceLocation id = new ResourceLocation("c", name); - Tag tag = ItemTags.getAllTags().getTag(id); - return tag == null ? (Named) TagRegistry.item(id) : (Named) tag; + 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) { @@ -84,8 +90,8 @@ public class EndTags { addSurfaceBlock(EndBlocks.ENDSTONE_DUST); addSurfaceBlock(EndBlocks.AMBER_ORE); - EndItems.getModBlocks().forEach((item) -> { - Block block = ((BlockItem) item).getBlock(); + EndItems.getModBlocks().forEach(blockItem -> { + Block block = ((BlockItem) blockItem).getBlock(); if (block instanceof EndTerrainBlock) { addSurfaceBlock(block); TagHelper.addTag(BlockTags.NYLIUM, block); @@ -107,28 +113,23 @@ public class EndTags { } }); - EndItems.getModItems().forEach((item) -> { + List hammers = Lists.newArrayList(); + EndItems.getModItems().forEach(item -> { if (item.isEdible()) { FoodProperties food = item.getFoodProperties(); - float compost = food.getNutrition() * food.getSaturationModifier() * 0.18F; - ComposterBlockAccessor.callAdd(compost, item); + if (food != null) { + float compost = food.getNutrition() * food.getSaturationModifier() * 0.18F; + ComposterBlockAccessor.callAdd(compost, item); + } + } + if (item instanceof EndHammerItem) { + hammers.add(item); } }); + ToolManagerImpl.tag(HAMMERS).register(new ModdedToolsVanillaBlocksToolHandler(hammers)); TagHelper.addTag(GEN_TERRAIN, EndBlocks.ENDER_ORE, EndBlocks.FLAVOLITE.stone, EndBlocks.VIOLECITE.stone, EndBlocks.SULPHURIC_ROCK.stone, EndBlocks.BRIMSTONE); TagHelper.addTag(END_GROUND, EndBlocks.SULPHURIC_ROCK.stone, EndBlocks.BRIMSTONE); - - ToolManagerImpl.tag(HAMMERS).register(new ModdedToolsVanillaBlocksToolHandler( - Arrays.asList( - EndItems.IRON_HAMMER, - EndItems.GOLDEN_HAMMER, - EndItems.DIAMOND_HAMMER, - EndItems.NETHERITE_HAMMER, - EndItems.AETERNIUM_HAMMER, - EndBlocks.THALLASIUM.hammer, - EndBlocks.TERMINITE.hammer - ) - )); TagHelper.addTag(FURNACES, Blocks.FURNACE); TagHelper.addTag(BlockTags.ANVIL, EndBlocks.AETERNIUM_ANVIL); @@ -156,8 +157,4 @@ public class EndTags { }); END_STONES.getValues().forEach(EndTags::addSurfaceBlock); } - - public static Tag registerFabricItemTag(String name) { - return TagRegistry.item(new ResourceLocation("fabric", name)); - } } From 04e03cac07d2fe275ad92bb08d581f17f9fa2497 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sat, 17 Apr 2021 11:57:31 +0300 Subject: [PATCH 417/463] A little more refactor --- .../java/ru/betterend/mixin/common/DimensionTypeMixin.java | 7 ++----- .../java/ru/betterend/mixin/common/TagLoaderMixin.java | 4 +++- .../betterend/mixin/common/WeightedBiomePickerMixin.java | 4 ++-- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java b/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java index b238b0db..982e906c 100644 --- a/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java +++ b/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java @@ -17,17 +17,14 @@ import ru.betterend.world.generator.GeneratorOptions; public class DimensionTypeMixin { @Inject(method = "defaultEndGenerator", at = @At("HEAD"), cancellable = true) private static void be_replaceGenerator(Registry biomeRegistry, Registry chunkGeneratorSettingsRegistry, long seed, CallbackInfoReturnable info) { - info.setReturnValue(new NoiseBasedChunkGenerator(new BetterEndBiomeSource(biomeRegistry, seed), seed, () -> { - return (NoiseGeneratorSettings) chunkGeneratorSettingsRegistry.getOrThrow(NoiseGeneratorSettings.END); - })); - info.cancel(); + info.setReturnValue(new NoiseBasedChunkGenerator(new BetterEndBiomeSource(biomeRegistry, seed), seed, + () -> chunkGeneratorSettingsRegistry.getOrThrow(NoiseGeneratorSettings.END))); } @Inject(method = "createDragonFight", at = @At("HEAD"), cancellable = true) private void be_hasEnderDragonFight(CallbackInfoReturnable info) { if (!GeneratorOptions.hasDragonFights()) { info.setReturnValue(false); - info.cancel(); } } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java b/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java index b2d5354b..dc73a864 100644 --- a/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java @@ -3,6 +3,8 @@ package ru.betterend.mixin.common; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; + +import com.google.common.collect.Maps; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.tags.Tag; @@ -23,7 +25,7 @@ public class TagLoaderMixin { public void be_prepareReload(ResourceManager manager, Executor executor, CallbackInfoReturnable>> info) { CompletableFuture> future = info.getReturnValue(); info.setReturnValue(CompletableFuture.supplyAsync(() -> { - Map map = future.join(); + Map map = Maps.newHashMap(future.join()); TagHelper.apply(directory, map); return map; }, executor)); diff --git a/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerMixin.java b/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerMixin.java index 7e07ce2c..da2c05e6 100644 --- a/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerMixin.java @@ -18,11 +18,11 @@ import ru.betterend.interfaces.IBiomeList; @Mixin(value = WeightedBiomePicker.class, remap = false) public class WeightedBiomePickerMixin implements IBiomeList { - private List> biomes = Lists.newArrayList(); + private final List> biomes = Lists.newArrayList(); @Inject(method = "addBiome", at = @At("TAIL")) private void be_addBiome(final ResourceKey biome, final double weight, CallbackInfo info) { - if (be_isCorrectPicker((WeightedBiomePicker) (Object) this)) { + if (be_isCorrectPicker(WeightedBiomePicker.class.cast(this))) { biomes.add(biome); } } From a283ca19516980191f1accdfc0474b2551b13dca Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sat, 17 Apr 2021 21:21:17 +0300 Subject: [PATCH 418/463] More refactor --- .../mixin/client/AnvilScreenMixin.java | 22 +++++++------- .../mixin/common/AnvilBlockMixin.java | 2 -- .../mixin/common/AnvilMenuMixin.java | 29 ++++++++++--------- .../resources/betterend.mixins.common.json | 4 +-- 4 files changed, 27 insertions(+), 30 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java index 162c05c8..41cc84be 100644 --- a/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java +++ b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java @@ -30,7 +30,6 @@ public class AnvilScreenMixin extends ItemCombinerScreen { private EditBox name; private final List be_buttons = Lists.newArrayList(); - private AnvilScreenHandlerExtended anvilHandler; public AnvilScreenMixin(AnvilMenu handler, Inventory playerInventory, Component title, ResourceLocation texture) { @@ -38,18 +37,17 @@ public class AnvilScreenMixin extends ItemCombinerScreen { } @Inject(method = "subInit", at = @At("TAIL")) - protected void be_setup(CallbackInfo info) { + protected void be_subInit(CallbackInfo info) { int x = (width - imageWidth) / 2; int y = (height - imageHeight) / 2; - anvilHandler = (AnvilScreenHandlerExtended) menu; be_buttons.clear(); - be_buttons.add(new Button(x + 8, y + 45, 15, 20, new TextComponent("<"), (b) -> be_previousRecipe())); - be_buttons.add(new Button(x + 154, y + 45, 15, 20, new TextComponent(">"), (b) -> be_nextRecipe())); + be_buttons.add(new Button(x + 8, y + 45, 15, 20, new TextComponent("<"), b -> be_previousRecipe())); + be_buttons.add(new Button(x + 154, y + 45, 15, 20, new TextComponent(">"), b -> be_nextRecipe())); } @Inject(method = "renderFg", at = @At("TAIL")) protected void be_renderForeground(PoseStack matrices, int mouseX, int mouseY, float delta, CallbackInfo info) { - this.be_buttons.forEach(button -> { + be_buttons.forEach(button -> { button.render(matrices, mouseX, mouseY, delta); }); } @@ -59,23 +57,23 @@ public class AnvilScreenMixin extends ItemCombinerScreen { AnvilScreenHandlerExtended anvilHandler = (AnvilScreenHandlerExtended) handler; if (anvilHandler.be_getCurrentRecipe() != null) { if (anvilHandler.be_getRecipes().size() > 1) { - this.be_buttons.forEach(button -> button.visible = true); + be_buttons.forEach(button -> button.visible = true); } else { - this.be_buttons.forEach(button -> button.visible = false); + be_buttons.forEach(button -> button.visible = false); } - this.name.setValue(""); + name.setValue(""); info.cancel(); } else { - this.be_buttons.forEach(button -> button.visible = false); + be_buttons.forEach(button -> button.visible = false); } } private void be_nextRecipe() { - anvilHandler.be_nextRecipe(); + ((AnvilScreenHandlerExtended) menu).be_nextRecipe(); } private void be_previousRecipe() { - anvilHandler.be_previousRecipe(); + ((AnvilScreenHandlerExtended) menu).be_previousRecipe(); } @Override diff --git a/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java index 46d69ce5..b58e098b 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java @@ -19,10 +19,8 @@ public class AnvilBlockMixin { try { BlockState state = fallingState.setValue(destructionProperty, destruction + 1); info.setReturnValue(state); - info.cancel(); } catch (Exception ex) { info.setReturnValue(null); - info.cancel(); } } } diff --git a/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java index 48cf2e5b..f23b4e0f 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java @@ -38,17 +38,18 @@ public abstract class AnvilMenuMixin extends ItemCombinerMenu implements AnvilSc @Inject(method = "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/inventory/ContainerLevelAccess;)V", at = @At("TAIL")) public void be_initAnvilLevel(int syncId, Inventory inventory, ContainerLevelAccess context, CallbackInfo info) { + this.anvilLevel = addDataSlot(DataSlot.standalone()); if (context != ContainerLevelAccess.NULL) { - int anvLevel = context.evaluate((world, blockPos) -> { + int level = context.evaluate((world, blockPos) -> { Block anvilBlock = world.getBlockState(blockPos).getBlock(); if (anvilBlock instanceof EndAnvilBlock) { return ((EndAnvilBlock) anvilBlock).getCraftingLevel(); } return 1; }, 1); - DataSlot anvilLevel = DataSlot.standalone(); - anvilLevel.set(anvLevel); - this.anvilLevel = addDataSlot(anvilLevel); + anvilLevel.set(level); + } else { + anvilLevel.set(1); } } @@ -65,10 +66,10 @@ public abstract class AnvilMenuMixin extends ItemCombinerMenu implements AnvilSc @Inject(method = "onTake", at = @At("HEAD"), cancellable = true) protected void be_onTakeOutput(Player player, ItemStack stack, CallbackInfoReturnable info) { if (be_currentRecipe != null) { - this.inputSlots.getItem(0).shrink(be_currentRecipe.getInputCount()); + inputSlots.getItem(0).shrink(be_currentRecipe.getInputCount()); stack = be_currentRecipe.craft(inputSlots, player); - this.slotsChanged(inputSlots); - this.access.execute((world, blockPos) -> { + slotsChanged(inputSlots); + access.execute((world, blockPos) -> { BlockState anvilState = world.getBlockState(blockPos); if (!player.abilities.instabuild && anvilState.is(BlockTags.ANVIL) && player.getRandom().nextFloat() < 0.12F) { BlockState landingState = AnvilBlock.damage(anvilState); @@ -117,10 +118,10 @@ public abstract class AnvilMenuMixin extends ItemCombinerMenu implements AnvilSc @Override public boolean clickMenuButton(Player player, int id) { if (id == 0) { - this.be_previousRecipe(); + be_previousRecipe(); return true; } else if (id == 1) { - this.be_nextRecipe(); + be_nextRecipe(); return true; } return super.clickMenuButton(player, id); @@ -128,23 +129,23 @@ public abstract class AnvilMenuMixin extends ItemCombinerMenu implements AnvilSc private void be_updateResult() { if (be_currentRecipe == null) return; - this.resultSlots.setItem(0, be_currentRecipe.assemble(inputSlots)); - this.broadcastChanges(); + resultSlots.setItem(0, be_currentRecipe.assemble(inputSlots)); + broadcastChanges(); } @Override public void be_updateCurrentRecipe(AnvilRecipe recipe) { this.be_currentRecipe = recipe; - this.be_updateResult(); + be_updateResult(); } @Override public AnvilRecipe be_getCurrentRecipe() { - return this.be_currentRecipe; + return be_currentRecipe; } @Override public List be_getRecipes() { - return this.be_recipes; + return be_recipes; } } diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index 88651502..1225e6e1 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -26,10 +26,10 @@ "CraftingMenuMixin", "LivingEntityMixin", "ServerPlayerMixin", - "SpikeFeatureMixin", + "SpikeFeatureMixin", + "ServerLevelMixin", "AnvilBlockMixin", "PlayerListMixin", - "ServerLevelMixin", "AnvilMenuMixin", "TagLoaderMixin", "EnderManMixin", From d0f5f664c6c23d7e4c8c91b8d9e384e98e2aed7a Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sat, 17 Apr 2021 21:33:48 +0300 Subject: [PATCH 419/463] Update TagGroupLoaderMixin.java --- .../java/ru/betterend/mixin/common/TagGroupLoaderMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/mixin/common/TagGroupLoaderMixin.java b/src/main/java/ru/betterend/mixin/common/TagGroupLoaderMixin.java index 21038c9e..a069d165 100644 --- a/src/main/java/ru/betterend/mixin/common/TagGroupLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/common/TagGroupLoaderMixin.java @@ -29,6 +29,6 @@ public class TagGroupLoaderMixin { Map map = future.join(); TagHelper.apply(entryType, map); return map; - })); + }, prepareExecutor)); } } From 01391537fe4538bc34c27333682b1ad811fcfbb8 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sat, 17 Apr 2021 22:04:16 +0300 Subject: [PATCH 420/463] TagLoader fix --- src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java b/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java index dc73a864..0237ad8f 100644 --- a/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java @@ -19,14 +19,14 @@ import ru.betterend.util.TagHelper; @Mixin(TagLoader.class) public class TagLoaderMixin { @Shadow - private String directory; + private String name; @Inject(method = "prepare", at = @At("RETURN"), cancellable = true) public void be_prepareReload(ResourceManager manager, Executor executor, CallbackInfoReturnable>> info) { CompletableFuture> future = info.getReturnValue(); info.setReturnValue(CompletableFuture.supplyAsync(() -> { Map map = Maps.newHashMap(future.join()); - TagHelper.apply(directory, map); + TagHelper.apply(name, map); return map; }, executor)); } From b49bd6ef914cdd8a8fed7053267fe8f2dafc8b44 Mon Sep 17 00:00:00 2001 From: vemerion Date: Sun, 18 Apr 2021 09:11:33 +0200 Subject: [PATCH 421/463] Add cubozoa bucket and make fish buckets retain variant This change adds a cubozoa bucket that functions like the other types of fish buckets. In addition to that, this commit also saves the size and variant of end fish and cubozoa in the item tag when they are scooped up in a bucket, so that they retain their size/variant when they are placed again. Here is the issue from the Forge port that made me away of the issue: https://github.com/Beethoven92/BetterEndForge/issues/93 --- .../java/ru/betterend/entity/CubozoaEntity.java | 15 +++++++++++++-- .../java/ru/betterend/entity/EndFishEntity.java | 14 +++++++++++++- .../java/ru/betterend/registry/EndItems.java | 1 + .../resources/assets/betterend/lang/en_us.json | 1 + .../betterend/models/item/bucket_cubozoa.json | 6 ++++++ .../betterend/textures/item/bucket_cubozoa.png | Bin 0 -> 1633 bytes 6 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/assets/betterend/models/item/bucket_cubozoa.json create mode 100644 src/main/resources/assets/betterend/textures/item/bucket_cubozoa.png diff --git a/src/main/java/ru/betterend/entity/CubozoaEntity.java b/src/main/java/ru/betterend/entity/CubozoaEntity.java index 65a20bb9..71b0d548 100644 --- a/src/main/java/ru/betterend/entity/CubozoaEntity.java +++ b/src/main/java/ru/betterend/entity/CubozoaEntity.java @@ -22,7 +22,6 @@ import net.minecraft.entity.effect.StatusEffects; import net.minecraft.entity.passive.SchoolingFishEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.packet.s2c.play.GameStateChangeS2CPacket; import net.minecraft.server.network.ServerPlayerEntity; @@ -53,6 +52,14 @@ public class CubozoaEntity extends SchoolingFishEntity { if (EndBiomes.getFromBiome(world.getBiome(getBlockPos())) == EndBiomes.SULPHUR_SPRINGS) { this.dataTracker.set(VARIANT, (byte) 1); } + + if (entityTag != null) { + if (entityTag.contains("variant")) + this.dataTracker.set(VARIANT, entityTag.getByte("variant")); + if (entityTag.contains("scale")) + this.dataTracker.set(SCALE, entityTag.getByte("scale")); + } + this.calculateDimensions(); return data; } @@ -120,7 +127,11 @@ public class CubozoaEntity extends SchoolingFishEntity { @Override protected ItemStack getFishBucketItem() { - return new ItemStack(Items.WATER_BUCKET); + ItemStack bucket = EndItems.BUCKET_CUBOZOA.getDefaultStack(); + CompoundTag tag = bucket.getOrCreateTag(); + tag.putByte("variant", dataTracker.get(VARIANT)); + tag.putByte("scale", dataTracker.get(SCALE)); + return bucket; } @Override diff --git a/src/main/java/ru/betterend/entity/EndFishEntity.java b/src/main/java/ru/betterend/entity/EndFishEntity.java index 4b633a4d..42ed0f7e 100644 --- a/src/main/java/ru/betterend/entity/EndFishEntity.java +++ b/src/main/java/ru/betterend/entity/EndFishEntity.java @@ -46,6 +46,14 @@ public class EndFishEntity extends SchoolingFishEntity { if (EndBiomes.getFromBiome(world.getBiome(getBlockPos())) == EndBiomes.SULPHUR_SPRINGS) { this.dataTracker.set(VARIANT, (byte) (random.nextInt(VARIANTS_SULPHUR) + VARIANTS_NORMAL)); } + + if (entityTag != null) { + if (entityTag.contains("variant")) + this.dataTracker.set(VARIANT, entityTag.getByte("variant")); + if (entityTag.contains("scale")) + this.dataTracker.set(SCALE, entityTag.getByte("scale")); + } + this.calculateDimensions(); return data; } @@ -77,7 +85,11 @@ public class EndFishEntity extends SchoolingFishEntity { @Override protected ItemStack getFishBucketItem() { - return new ItemStack(EndItems.BUCKET_END_FISH); + ItemStack bucket = EndItems.BUCKET_END_FISH.getDefaultStack(); + CompoundTag tag = bucket.getOrCreateTag(); + tag.putByte("variant", dataTracker.get(VARIANT)); + tag.putByte("scale", dataTracker.get(SCALE)); + return bucket; } @Override diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index 4e3dc6f3..203f0e48 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -120,6 +120,7 @@ public class EndItems { public final static Item END_FISH_RAW = registerFood("end_fish_raw", FoodComponents.SALMON); public final static Item END_FISH_COOKED = registerFood("end_fish_cooked", FoodComponents.COOKED_SALMON); public final static Item BUCKET_END_FISH = registerItem("bucket_end_fish", new FishBucketItem(EndEntities.END_FISH, Fluids.WATER, makeItemSettings().maxCount(1))); + public final static Item BUCKET_CUBOZOA = registerItem("bucket_cubozoa", new FishBucketItem(EndEntities.CUBOZOA, Fluids.WATER, makeItemSettings().maxCount(1))); public final static Item SWEET_BERRY_JELLY = registerFood("sweet_berry_jelly", 6, 0.75F); public final static Item SHADOW_BERRY_JELLY = registerFood("shadow_berry_jelly", 7, 0.75F, new StatusEffectInstance(StatusEffects.NIGHT_VISION, 400)); public final static Item BLOSSOM_BERRY = registerFood("blossom_berry", FoodComponents.APPLE); diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 2d63c8a3..140e8f20 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -316,6 +316,7 @@ "block.betterend.quartz_lantern": "Quartz Lantern", "item.betterend.bucket_end_fish": "Bucket of End Fish", + "item.betterend.bucket_cubozoa": "Bucket of Cubozoa", "item.betterend.end_fish_cooked": "Cooked End Fish", "item.betterend.end_fish_raw": "End Fish", diff --git a/src/main/resources/assets/betterend/models/item/bucket_cubozoa.json b/src/main/resources/assets/betterend/models/item/bucket_cubozoa.json new file mode 100644 index 00000000..27e0e130 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/bucket_cubozoa.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/bucket_cubozoa" + } +} diff --git a/src/main/resources/assets/betterend/textures/item/bucket_cubozoa.png b/src/main/resources/assets/betterend/textures/item/bucket_cubozoa.png new file mode 100644 index 0000000000000000000000000000000000000000..6b1e88c42bcf7b84deacfb1570d7868c63d65b05 GIT binary patch literal 1633 zcmV-n2A=teP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3yslIti8M*p*lSpoutU^$pa)!o4?e?A^2iR13- z&Rn}~a5hPLd-#<G1ZeLTOv|kGT zlA|RjzR2x%W3JRr&o2W;wCLySDR-@v&|00VOU@%xUadu)OBp>V9!RAf(>!j$htZdD zN8ABR%pg`k^T3@IMKZ{CBS(c2HL9b{lo6sc)d*T+G8lAOuwtUg06<7QZfZtsv_*l4 zu^H4X#Ae4r!*3k^G6i@p1Wjy)48P|6R(HZr?ro^GUb@(QVdn~QnO@U0>EKja8UJW@vaWS2SnEIH(uQ!&LBZ2#hms1iynsZvELRad$C zDmBztQ$wva+g#)3o3zkkOPkuF`bv#1Et>y9St@G8&D(ea0+!|Am}O?ZnW7w$bHLAvHKM_^A$PO(fti_s-s)v z-nrdSD`|YA*a4{T!k$xY8xA%o)R0U_{X6O7R{dWC_l6p~-Z94!n&@VZ`4(K$xw$ys zl4~yKH55a$x?q;NA37};_cXa#|D!@iS|P{8kuoZ-cO8B% zc;X>VRJ^ZCBjzyWY7R)uPa|p0C`J-Sj`@}|>g_c8-m2LVe=L!}?ikjTS76O0#ASxP z-p*vis98oY^jpnE`>BO6mpv?LbeM{s5jE@Z1y&`V9*LjBQa5ov!t-UtBpJW!{4w7u z>@{q}kyGcUBZVb|X8wYr6yr4A&x?F6(YqOH%~Wx)g&8V-xW!s2^HkIN zia9LHQ&231dCxVrsCVAOa7qQ*QqrAWt@m2%&T z%=D@LgLe}R?cRJNojzw1eL&;j%sNcc;3P1A2%3Bw^|u5k<)zs*gvdH_6)na$0XA9Ex1HPB5lZXe+-QM<_1UrEq7A@!$+>o@p+>iw=&pHBSD z5dIYv{JU2F0f1??Xd#zUb^rhX24YJ`L;x%RegJ_vqK}pU000SaNLh0L04^f{04^f| zc%?sf00007bV*G`2jv731~oG4ruM-A00CJ^L_t(I%dL{JPQp+WhQDHwAjnXNi9{0y zw9!SDs}oaSfz1bSGI7uca5kNM0EUh{0~2B4E_IPK>C95nffzbatOnaHOGZm=#s&>y_xr}~L1|VKWd`1y(i`Sn-RYArB z$8m677u&XBv1xL*+oj!Z)9?55O$6w4IyjC4fa|&dgkgy9`?-@V` Date: Sun, 18 Apr 2021 13:35:25 +0300 Subject: [PATCH 422/463] More refactor --- .../java/ru/betterend/mixin/common/MinecraftServerMixin.java | 2 +- src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java b/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java index 14d5fa1d..1ae3f8d9 100644 --- a/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java @@ -47,7 +47,7 @@ public class MinecraftServerMixin { @Inject(method = "loadLevel", at = @At(value = "RETURN"), cancellable = true) private void be_loadLevel(CallbackInfo info) { be_injectRecipes(); - EndBiomes.initRegistry((MinecraftServer) (Object) this); + EndBiomes.initRegistry(MinecraftServer.class.cast(this)); } @Inject(method = "overworld", at = @At(value = "HEAD"), cancellable = true) diff --git a/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java b/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java index 0656ed29..b4a6db38 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java @@ -46,7 +46,7 @@ public class ServerLevelMixin { lastWorld = session.getLevelId(); @SuppressWarnings("resource") - ServerLevel world = (ServerLevel) (Object) this; + ServerLevel world = ServerLevel.class.cast(this); File dir = session.getDimensionPath(world.dimension()); if (!new File(dir, "level.dat").exists()) { dir = dir.getParentFile(); @@ -73,7 +73,7 @@ public class ServerLevelMixin { @Inject(method = "getSharedSpawnPos", at = @At("HEAD"), cancellable = true) private void be_getSharedSpawnPos(CallbackInfoReturnable info) { if (GeneratorOptions.changeSpawn()) { - if (((ServerLevel) (Object) this).dimension() == Level.END) { + if (ServerLevel.class.cast(this).dimension() == Level.END) { info.setReturnValue(GeneratorOptions.getSpawn()); info.cancel(); } From 25b153f5157965e7fef9c06a584887ccc9b4d66a Mon Sep 17 00:00:00 2001 From: vemerion Date: Mon, 19 Apr 2021 15:36:56 +0200 Subject: [PATCH 423/463] Fix cubozoa and end fish getting smaller after every reload Previously, getScale() was used to get the size value when saving the entity to NBT. However, this means that the entities will get progressively smaller, since getScale() divides the true scale before returning it. This commit fixes this by getting the 'raw' scale directly from the dataTracker when saving the scale to NBT. --- src/main/java/ru/betterend/entity/CubozoaEntity.java | 2 +- src/main/java/ru/betterend/entity/EndFishEntity.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/entity/CubozoaEntity.java b/src/main/java/ru/betterend/entity/CubozoaEntity.java index 71b0d548..b1a2457d 100644 --- a/src/main/java/ru/betterend/entity/CubozoaEntity.java +++ b/src/main/java/ru/betterend/entity/CubozoaEntity.java @@ -75,7 +75,7 @@ public class CubozoaEntity extends SchoolingFishEntity { public void writeCustomDataToTag(CompoundTag tag) { super.writeCustomDataToTag(tag); tag.putByte("Variant", (byte) getVariant()); - tag.putByte("Scale", (byte) getScale()); + tag.putByte("Scale", dataTracker.get(SCALE)); } @Override diff --git a/src/main/java/ru/betterend/entity/EndFishEntity.java b/src/main/java/ru/betterend/entity/EndFishEntity.java index 42ed0f7e..28526125 100644 --- a/src/main/java/ru/betterend/entity/EndFishEntity.java +++ b/src/main/java/ru/betterend/entity/EndFishEntity.java @@ -69,7 +69,7 @@ public class EndFishEntity extends SchoolingFishEntity { public void writeCustomDataToTag(CompoundTag tag) { super.writeCustomDataToTag(tag); tag.putByte("Variant", (byte) getVariant()); - tag.putByte("Scale", (byte) getScale()); + tag.putByte("Scale", dataTracker.get(SCALE)); } @Override From 95fc927c16e6574108223f0957ca6f2f217a6131 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 19 Apr 2021 20:53:26 +0300 Subject: [PATCH 424/463] Cave generation fix & cleanup --- src/main/java/ru/betterend/rituals/EternalRitual.java | 6 +++--- .../world/features/terrain/caves/EndCaveFeature.java | 5 ++--- .../assets/betterend/models/item/bucket_cubozoa.json | 6 ------ 3 files changed, 5 insertions(+), 12 deletions(-) delete mode 100644 src/main/resources/assets/betterend/models/item/bucket_cubozoa.json diff --git a/src/main/java/ru/betterend/rituals/EternalRitual.java b/src/main/java/ru/betterend/rituals/EternalRitual.java index ab031512..428235f0 100644 --- a/src/main/java/ru/betterend/rituals/EternalRitual.java +++ b/src/main/java/ru/betterend/rituals/EternalRitual.java @@ -7,11 +7,9 @@ import java.util.Random; import java.util.Set; import java.util.function.Predicate; -import com.google.common.collect.Lists; -import net.minecraft.world.chunk.ChunkSection; -import net.minecraft.world.chunk.WorldChunk; import org.jetbrains.annotations.Nullable; +import com.google.common.collect.Lists; import com.google.common.collect.Sets; import net.minecraft.block.Block; @@ -35,6 +33,8 @@ import net.minecraft.util.registry.Registry; import net.minecraft.world.Heightmap; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.ChunkSection; +import net.minecraft.world.chunk.WorldChunk; import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.feature.ConfiguredFeatures; import ru.betterend.BetterEnd; 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 ad2b088a..7904822b 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 @@ -24,7 +24,6 @@ import ru.betterend.util.MHelper; import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.cave.EndCaveBiome; import ru.betterend.world.features.DefaultFeature; -import ru.betterend.world.generator.GeneratorOptions; public abstract class EndCaveFeature extends DefaultFeature { protected static final BlockState CAVE_AIR = Blocks.CAVE_AIR.getDefaultState(); @@ -33,7 +32,7 @@ public abstract class EndCaveFeature extends DefaultFeature { @Override public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - if (!(GeneratorOptions.useNewGenerator() && GeneratorOptions.noRingVoid()) || pos.getX() * pos.getX() + pos.getZ() * pos.getZ() <= 22500) { + if (pos.getX() * pos.getX() + pos.getZ() * pos.getZ() <= 2500) { return false; } @@ -194,7 +193,7 @@ public abstract class EndCaveFeature extends DefaultFeature { for (int z = -2; z < 3; z++) { Biome biome = world.getBiome(pos.add(x << 4, 0, z << 4)); EndBiome endBiome = EndBiomes.getFromBiome(biome); - if (!endBiome.hasCaves()) { + if (!endBiome.hasCaves() && EndBiomes.LAND_BIOMES.containsImmutable(endBiome.getID())) { return true; } } diff --git a/src/main/resources/assets/betterend/models/item/bucket_cubozoa.json b/src/main/resources/assets/betterend/models/item/bucket_cubozoa.json deleted file mode 100644 index 27e0e130..00000000 --- a/src/main/resources/assets/betterend/models/item/bucket_cubozoa.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "betterend:item/bucket_cubozoa" - } -} From 00fd2b6199c378249958354ebf945f4db4328ef1 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 19 Apr 2021 21:01:24 +0300 Subject: [PATCH 425/463] Cave fix --- .../features/terrain/caves/EndCaveFeature.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) 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 ae049d10..8142416a 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 @@ -2,6 +2,9 @@ package ru.betterend.world.features.terrain.caves; import java.util.Random; import java.util.Set; + +import com.google.common.collect.Sets; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -13,7 +16,6 @@ import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import com.google.common.collect.Sets; import ru.betterend.interfaces.IBiomeArray; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndTags; @@ -22,7 +24,6 @@ import ru.betterend.util.MHelper; import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.cave.EndCaveBiome; import ru.betterend.world.features.DefaultFeature; -import ru.betterend.world.generator.GeneratorOptions; public abstract class EndCaveFeature extends DefaultFeature { protected static final BlockState CAVE_AIR = Blocks.CAVE_AIR.defaultBlockState(); @@ -30,10 +31,8 @@ public abstract class EndCaveFeature extends DefaultFeature { protected static final BlockState WATER = Blocks.WATER.defaultBlockState(); @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!(GeneratorOptions.useNewGenerator() && GeneratorOptions.noRingVoid()) - || pos.getX() * pos.getX() + pos.getZ() * pos.getZ() <= 22500) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { + if (pos.getX() * pos.getX() + pos.getZ() * pos.getZ() <= 2500) { return false; } @@ -190,13 +189,13 @@ public abstract class EndCaveFeature extends DefaultFeature { } return false; } - + protected boolean biomeMissingCaves(WorldGenLevel world, BlockPos pos) { for (int x = -2; x < 3; x++) { for (int z = -2; z < 3; z++) { Biome biome = world.getBiome(pos.offset(x << 4, 0, z << 4)); EndBiome endBiome = EndBiomes.getFromBiome(biome); - if (!endBiome.hasCaves()) { + if (!endBiome.hasCaves() && EndBiomes.LAND_BIOMES.containsImmutable(endBiome.getID())) { return true; } } From 3ec2edd6d584679557ee428db2afe88308635bc8 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 19 Apr 2021 21:22:11 +0300 Subject: [PATCH 426/463] Buckets & entity enhancements, cleanup --- .../betterend/blocks/AuroraCrystalBlock.java | 1 - .../betterend/blocks/BlueVineSeedBlock.java | 1 + .../betterend/blocks/BoluxMushroomBlock.java | 4 +- .../ru/betterend/blocks/BulbVineBlock.java | 4 +- .../betterend/blocks/BulbVineSeedBlock.java | 1 + .../blocks/CavePumpkinVineBlock.java | 1 + .../ru/betterend/blocks/EndLilySeedBlock.java | 1 + .../betterend/blocks/EndLotusSeedBlock.java | 1 + .../java/ru/betterend/blocks/EndPedestal.java | 1 + .../ru/betterend/blocks/EternalPedestal.java | 4 +- .../blocks/EternalRunedFlavolite.java | 4 +- .../blocks/HydraluxSaplingBlock.java | 1 + .../ru/betterend/blocks/LanceleafBlock.java | 1 + .../betterend/blocks/LanceleafSeedBlock.java | 1 + .../betterend/blocks/LumecornSeedBlock.java | 1 + .../ru/betterend/blocks/PedestalVanilla.java | 1 + .../betterend/blocks/SmallAmaranitaBlock.java | 1 + .../blocks/TwistedUmbrellaMossTallBlock.java | 1 + .../blocks/UmbrellaMossTallBlock.java | 1 + .../ru/betterend/blocks/basis/BarkBlock.java | 1 + .../blocks/basis/BaseBlockWithEntity.java | 1 + .../ru/betterend/blocks/basis/BlockBase.java | 1 + .../blocks/basis/TripleTerrainBlock.java | 4 +- .../render/EndChestBlockEntityRenderer.java | 14 +- .../render/EndSignBlockEntityRenderer.java | 12 +- .../entities/render/PedestalItemRenderer.java | 1 + .../client/gui/BlockSignEditScreen.java | 1 + .../gui/EndStoneSmelterRecipeBookScreen.java | 1 + .../client/gui/EndStoneSmelterScreen.java | 1 + .../betterend/client/render/BeamRenderer.java | 1 + .../client/render/EndCrystalRenderer.java | 189 +++---- .../client/render/EternalCrystalRenderer.java | 139 ++--- .../ru/betterend/config/ConfigKeeper.java | 4 +- .../java/ru/betterend/config/IdConfig.java | 184 +++---- .../ru/betterend/entity/CubozoaEntity.java | 32 +- .../ru/betterend/entity/DragonflyEntity.java | 3 +- .../ru/betterend/entity/EndFishEntity.java | 23 +- .../ru/betterend/entity/EndSlimeEntity.java | 6 +- .../betterend/entity/ShadowWalkerEntity.java | 1 + .../ru/betterend/entity/SilkMothEntity.java | 4 +- .../entity/model/BlockBenchModel.java | 1 + .../entity/model/CubozoaEntityModel.java | 1 + .../entity/model/DragonflyEntityModel.java | 1 + .../entity/model/EndFishEntityModel.java | 1 + .../entity/model/EndSlimeEntityModel.java | 1 + .../entity/model/SilkMothEntityModel.java | 1 + .../entity/render/RendererEntityCubozoa.java | 1 + .../entity/render/RendererEntityEndFish.java | 1 + .../entity/render/RendererEntityEndSlime.java | 1 + .../FlamboyantRefabricatedIntegration.java | 4 +- .../integration/byg/BYGIntegration.java | 1 + .../integration/byg/biomes/EterialGrove.java | 1 + .../byg/biomes/NightshadeRedwoods.java | 1 + .../byg/biomes/OldBulbisGardens.java | 1 + .../byg/features/BigEtherTreeFeature.java | 6 +- .../features/GreatNightshadeTreeFeature.java | 8 +- .../NightshadeRedwoodTreeFeature.java | 8 +- .../byg/features/OldBulbisTreeFeature.java | 6 +- .../integration/rei/REIAlloyingCategory.java | 177 +++---- .../rei/REIAlloyingFuelCategory.java | 183 +++---- .../integration/rei/REIAnvilCategory.java | 201 ++++---- .../integration/rei/REIInfusionCategory.java | 161 +++--- .../ru/betterend/interfaces/IBiomeList.java | 1 + .../java/ru/betterend/item/EndArmorItem.java | 6 +- .../java/ru/betterend/item/EndBucketItem.java | 18 + .../java/ru/betterend/item/GuideBookItem.java | 87 ++-- .../item/material/EndToolMaterial.java | 1 + .../item/model/CrystaliteBootsModel.java | 84 +-- .../item/model/CrystaliteChestplateModel.java | 146 +++--- .../item/model/CrystaliteLeggingsModel.java | 70 +-- .../client/AbstractSoundInstanceAccessor.java | 3 +- .../mixin/client/AnvilScreenMixin.java | 18 +- .../mixin/client/BackgroundRendererMixin.java | 1 + .../client/ClientPlayNetworkHandlerMixin.java | 11 +- .../mixin/client/ClientRecipeBookMixin.java | 8 +- .../mixin/client/ContextGsonAccessor.java | 1 + .../client/EnchantingTableBlockMixin.java | 10 +- .../mixin/client/MinecraftClientMixin.java | 1 + .../mixin/client/ModelLoaderMixin.java | 16 +- .../mixin/client/ModelVariantMapMixin.java | 8 +- .../mixin/client/MusicTrackerMixin.java | 14 +- .../client/NamespaceResourceManagerMixin.java | 12 +- .../mixin/client/WorldRendererMixin.java | 1 + .../mixin/common/AnvilBlockMixin.java | 7 +- .../mixin/common/AnvilMenuMixin.java | 14 +- .../mixin/common/ArmorItemAccessor.java | 8 +- .../BiomeGenerationSettingsAccessor.java | 6 +- .../mixin/common/BlockBehaviourMixin.java | 14 +- .../mixin/common/BoneMealItemMixin.java | 10 +- .../mixin/common/ChorusFlowerBlockMixin.java | 18 +- .../mixin/common/ChorusPlantBlockMixin.java | 11 +- .../mixin/common/ChorusPlantFeatureMixin.java | 10 +- .../common/ChunkBiomeContainerMixin.java | 7 +- .../mixin/common/ComposterBlockAccessor.java | 5 +- .../mixin/common/CraftingMenuMixin.java | 9 +- .../mixin/common/DimensionTypeMixin.java | 9 +- .../mixin/common/EnchantmentMenuMixin.java | 14 +- .../mixin/common/EndCityFeatureMixin.java | 11 +- .../mixin/common/EndPodiumFeatureMixin.java | 16 +- .../betterend/mixin/common/EnderManMixin.java | 9 +- .../betterend/mixin/common/EntityMixin.java | 13 +- .../mixin/common/LivingEntityMixin.java | 12 +- .../betterend/mixin/common/MonsterMixin.java | 10 +- .../common/NoiseBasedChunkGeneratorMixin.java | 12 +- .../mixin/common/PlayerAdvancementsMixin.java | 7 +- .../betterend/mixin/common/PlayerMixin.java | 10 +- .../mixin/common/PotionBrewingAccessor.java | 5 +- .../mixin/common/RecipeManagerAccessor.java | 6 +- .../mixin/common/RecipeManagerMixin.java | 18 +- .../mixin/common/ServerPlayerMixin.java | 1 + .../ru/betterend/mixin/common/SlimeMixin.java | 3 +- .../mixin/common/SpikeFeatureMixin.java | 1 + .../mixin/common/TagLoaderMixin.java | 12 +- .../java/ru/betterend/noise/VoronoiNoise.java | 1 + .../particle/GlowingSphereParticleEffect.java | 1 + .../ru/betterend/patterns/BlockPatterned.java | 27 +- .../java/ru/betterend/patterns/Patterns.java | 314 ++++++------ .../ru/betterend/recipe/EndRecipeManager.java | 4 +- .../betterend/recipe/builders/GridRecipe.java | 4 +- .../betterend/registry/EndBlockEntities.java | 4 +- .../ru/betterend/registry/EndFeatures.java | 6 +- .../java/ru/betterend/registry/EndItems.java | 6 +- .../ru/betterend/registry/EndPortals.java | 1 + .../ru/betterend/registry/EndStructures.java | 1 + .../java/ru/betterend/registry/EndTags.java | 2 +- .../ru/betterend/rituals/EternalRitual.java | 3 +- .../ru/betterend/rituals/InfusionRitual.java | 1 + .../java/ru/betterend/util/BlocksHelper.java | 6 +- .../java/ru/betterend/util/BonemealUtil.java | 6 +- .../java/ru/betterend/util/ColorUtil.java | 479 +++++++++--------- .../ru/betterend/util/FeaturesHelper.java | 6 +- src/main/java/ru/betterend/util/ItemUtil.java | 145 +++--- src/main/java/ru/betterend/util/MHelper.java | 4 +- .../java/ru/betterend/util/SplineHelper.java | 6 +- .../ru/betterend/util/StructureHelper.java | 1 + .../java/ru/betterend/util/TagHelper.java | 6 +- .../ru/betterend/util/TranslationHelper.java | 6 +- .../java/ru/betterend/util/sdf/PosInfo.java | 1 + src/main/java/ru/betterend/util/sdf/SDF.java | 8 +- .../util/sdf/operator/SDFCoordModify.java | 3 +- .../util/sdf/operator/SDFDisplacement.java | 3 +- .../util/sdf/operator/SDFHeightmap.java | 1 + .../util/sdf/primitive/SDFPrimitive.java | 1 + .../world/biome/BiomeDefinition.java | 4 +- .../ru/betterend/world/biome/EndBiome.java | 8 +- .../world/biome/cave/EndCaveBiome.java | 1 + .../world/features/BiomeIslandFeature.java | 143 +++--- .../world/features/BlueVineFeature.java | 1 + .../world/features/CavePlantFeature.java | 1 + .../world/features/CavePumpkinFeature.java | 1 + .../world/features/CrashedShipFeature.java | 1 + .../world/features/DoublePlantFeature.java | 1 + .../world/features/EndLilyFeature.java | 1 + .../world/features/EndLotusFeature.java | 1 + .../world/features/EndLotusLeafFeature.java | 1 + .../world/features/FilaluxFeature.java | 1 + .../features/FullHeightScatterFeature.java | 1 + .../world/features/GlowPillarFeature.java | 1 + .../world/features/HydraluxFeature.java | 1 + .../features/InvertedScatterFeature.java | 1 + .../world/features/LanceleafFeature.java | 1 + .../betterend/world/features/ListFeature.java | 1 + .../world/features/MengerSpongeFeature.java | 1 + .../world/features/NBTStructureFeature.java | 1 + .../world/features/NeonCactusFeature.java | 1 + .../world/features/ScatterFeature.java | 1 + .../world/features/SilkMothNestFeature.java | 1 + .../SingleInvertedScatterFeature.java | 1 + .../world/features/SinglePlantFeature.java | 1 + .../world/features/SkyScatterFeature.java | 1 + .../features/UnderwaterPlantFeature.java | 1 + .../features/UnderwaterPlantScatter.java | 1 + .../betterend/world/features/VineFeature.java | 1 + .../world/features/WallPlantFeature.java | 1 + .../world/features/WallPlantOnLogFeature.java | 1 + .../world/features/WallScatterFeature.java | 1 + .../world/features/bushes/BushFeature.java | 1 + .../features/bushes/BushWithOuterFeature.java | 1 + .../bushes/LargeAmaranitaFeature.java | 1 + .../world/features/bushes/Lumecorn.java | 1 + .../features/bushes/TenaneaBushFeature.java | 4 +- .../terrain/BigAuroraCrystalFeature.java | 4 +- .../features/terrain/EndLakeFeature.java | 1 + .../features/terrain/FallenPillarFeature.java | 4 +- .../terrain/FloatingSpireFeature.java | 4 +- .../world/features/terrain/GeyserFeature.java | 4 +- .../features/terrain/IceStarFeature.java | 4 +- .../terrain/ObsidianBoulderFeature.java | 1 + .../ObsidianPillarBasementFeature.java | 4 +- .../features/terrain/OreLayerFeature.java | 1 + .../features/terrain/SingleBlockFeature.java | 1 + .../terrain/SmaragdantCrystalFeature.java | 1 + .../world/features/terrain/SpireFeature.java | 4 +- .../features/terrain/StalactiteFeature.java | 1 + .../features/terrain/SulphurHillFeature.java | 1 + .../terrain/SulphuricCaveFeature.java | 4 +- .../terrain/SulphuricLakeFeature.java | 4 +- .../features/terrain/SurfaceVentFeature.java | 1 + .../caves/CaveChunkPopulatorFeature.java | 4 +- .../terrain/caves/EndCaveFeature.java | 3 +- .../terrain/caves/RoundCaveFeature.java | 4 +- .../terrain/caves/TunelCaveFeature.java | 4 +- .../features/trees/DragonTreeFeature.java | 6 +- .../trees/GiganticAmaranitaFeature.java | 4 +- .../features/trees/HelixTreeFeature.java | 4 +- .../features/trees/JellyshroomFeature.java | 6 +- .../features/trees/LacugroveFeature.java | 4 +- .../world/features/trees/LucerniaFeature.java | 6 +- .../trees/MossyGlowshroomFeature.java | 4 +- .../trees/PythadendronTreeFeature.java | 4 +- .../world/features/trees/TenaneaFeature.java | 6 +- .../features/trees/UmbrellaTreeFeature.java | 6 +- .../world/generator/BetterEndBiomeSource.java | 8 +- .../betterend/world/generator/BiomeMap.java | 4 +- .../world/generator/BiomePicker.java | 4 +- .../world/generator/IslandLayer.java | 4 +- .../world/generator/TerrainGenerator.java | 4 +- .../world/structures/StructureWorld.java | 1 + .../features/FeatureBaseStructure.java | 1 + .../features/GiantIceStarStructure.java | 4 +- .../GiantMossyGlowshroomStructure.java | 4 +- .../features/SDFStructureFeature.java | 1 + .../world/structures/piece/CavePiece.java | 1 + .../piece/CrystalMountainPiece.java | 1 + .../world/structures/piece/LakePiece.java | 1 + .../world/structures/piece/MountainPiece.java | 1 + .../world/structures/piece/NBTPiece.java | 1 + .../piece/PaintedMountainPiece.java | 1 + .../world/structures/piece/VoxelPiece.java | 1 + .../surface/DoubleBlockSurfaceBuilder.java | 1 + .../surface/SulphuricSurfaceBuilder.java | 1 + .../assets/betterend/lang/en_us.json | 1 + .../assets/betterend/lang/ru_ru.json | 1 + .../textures/item/bucket_cubozoa.png | Bin 0 -> 1633 bytes 234 files changed, 1988 insertions(+), 1643 deletions(-) create mode 100644 src/main/java/ru/betterend/item/EndBucketItem.java create mode 100644 src/main/resources/assets/betterend/textures/item/bucket_cubozoa.png diff --git a/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java b/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java index 9533b296..99c12928 100644 --- a/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java +++ b/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java @@ -5,7 +5,6 @@ import java.util.List; import com.google.common.collect.Lists; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tag.TagRegistry; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; diff --git a/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java b/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java index 0d5d63a4..586c81cc 100644 --- a/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java @@ -1,6 +1,7 @@ package ru.betterend.blocks; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; diff --git a/src/main/java/ru/betterend/blocks/BoluxMushroomBlock.java b/src/main/java/ru/betterend/blocks/BoluxMushroomBlock.java index fb512f7d..a7c95243 100644 --- a/src/main/java/ru/betterend/blocks/BoluxMushroomBlock.java +++ b/src/main/java/ru/betterend/blocks/BoluxMushroomBlock.java @@ -2,6 +2,9 @@ package ru.betterend.blocks; import java.util.List; import java.util.Random; + +import com.google.common.collect.Lists; + import net.minecraft.core.BlockPos; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; @@ -12,7 +15,6 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; -import com.google.common.collect.Lists; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; diff --git a/src/main/java/ru/betterend/blocks/BulbVineBlock.java b/src/main/java/ru/betterend/blocks/BulbVineBlock.java index 50846ebc..504fe6f8 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineBlock.java @@ -1,13 +1,15 @@ package ru.betterend.blocks; import java.util.List; + +import com.google.common.collect.Lists; + import net.minecraft.core.BlockPos; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.storage.loot.LootContext; -import com.google.common.collect.Lists; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.VineBlock; import ru.betterend.registry.EndBlocks; diff --git a/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java b/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java index 9ce91135..38b5e60c 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java @@ -1,6 +1,7 @@ package ru.betterend.blocks; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.tags.BlockTags; import net.minecraft.world.level.LevelReader; diff --git a/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java b/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java index e5754327..c0898eb8 100644 --- a/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java +++ b/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java @@ -1,6 +1,7 @@ package ru.betterend.blocks; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; diff --git a/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java b/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java index f2f67d4c..9bcdf0ec 100644 --- a/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java @@ -1,6 +1,7 @@ package ru.betterend.blocks; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.material.Fluids; diff --git a/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java b/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java index 40111055..b9b8fb4d 100644 --- a/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java @@ -1,6 +1,7 @@ package ru.betterend.blocks; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/ru/betterend/blocks/EndPedestal.java b/src/main/java/ru/betterend/blocks/EndPedestal.java index d5756e44..b626629a 100644 --- a/src/main/java/ru/betterend/blocks/EndPedestal.java +++ b/src/main/java/ru/betterend/blocks/EndPedestal.java @@ -2,6 +2,7 @@ package ru.betterend.blocks; import java.util.HashMap; import java.util.Map; + import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/ru/betterend/blocks/EternalPedestal.java b/src/main/java/ru/betterend/blocks/EternalPedestal.java index b857ac4c..8d057510 100644 --- a/src/main/java/ru/betterend/blocks/EternalPedestal.java +++ b/src/main/java/ru/betterend/blocks/EternalPedestal.java @@ -1,6 +1,9 @@ package ru.betterend.blocks; import java.util.List; + +import com.google.common.collect.Lists; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Registry; @@ -19,7 +22,6 @@ import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import com.google.common.collect.Lists; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.entities.EternalPedestalEntity; import ru.betterend.registry.EndBlocks; diff --git a/src/main/java/ru/betterend/blocks/EternalRunedFlavolite.java b/src/main/java/ru/betterend/blocks/EternalRunedFlavolite.java index a139eafb..be662a47 100644 --- a/src/main/java/ru/betterend/blocks/EternalRunedFlavolite.java +++ b/src/main/java/ru/betterend/blocks/EternalRunedFlavolite.java @@ -1,6 +1,9 @@ package ru.betterend.blocks; import java.util.List; + +import com.google.common.collect.Lists; + import net.minecraft.core.BlockPos; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -9,7 +12,6 @@ import net.minecraft.world.level.Explosion; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.storage.loot.LootContext; -import com.google.common.collect.Lists; public class EternalRunedFlavolite extends RunedFlavolite { diff --git a/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java b/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java index 9afb2681..2d69864b 100644 --- a/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java @@ -1,6 +1,7 @@ package ru.betterend.blocks; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; diff --git a/src/main/java/ru/betterend/blocks/LanceleafBlock.java b/src/main/java/ru/betterend/blocks/LanceleafBlock.java index c6378032..e40ae5c7 100644 --- a/src/main/java/ru/betterend/blocks/LanceleafBlock.java +++ b/src/main/java/ru/betterend/blocks/LanceleafBlock.java @@ -2,6 +2,7 @@ package ru.betterend.blocks; import java.util.Collections; import java.util.List; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java b/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java index 3f631b57..f319eabc 100644 --- a/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java @@ -1,6 +1,7 @@ package ru.betterend.blocks; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java b/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java index c3e6a14c..d3487a23 100644 --- a/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java @@ -1,6 +1,7 @@ package ru.betterend.blocks; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockBehaviour; diff --git a/src/main/java/ru/betterend/blocks/PedestalVanilla.java b/src/main/java/ru/betterend/blocks/PedestalVanilla.java index 292303fb..122ff0a1 100644 --- a/src/main/java/ru/betterend/blocks/PedestalVanilla.java +++ b/src/main/java/ru/betterend/blocks/PedestalVanilla.java @@ -2,6 +2,7 @@ package ru.betterend.blocks; import java.util.HashMap; import java.util.Map; + import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java index 9bf881c3..edb75b91 100644 --- a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java +++ b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java @@ -1,6 +1,7 @@ package ru.betterend.blocks; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.BlockGetter; diff --git a/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossTallBlock.java b/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossTallBlock.java index 843aa4a3..3d0ff3e8 100644 --- a/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossTallBlock.java +++ b/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossTallBlock.java @@ -1,6 +1,7 @@ package ru.betterend.blocks; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.item.ItemEntity; diff --git a/src/main/java/ru/betterend/blocks/UmbrellaMossTallBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaMossTallBlock.java index 7e15e99a..51045ffb 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaMossTallBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaMossTallBlock.java @@ -1,6 +1,7 @@ package ru.betterend.blocks; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.item.ItemEntity; diff --git a/src/main/java/ru/betterend/blocks/basis/BarkBlock.java b/src/main/java/ru/betterend/blocks/basis/BarkBlock.java index 1b82913c..f408f369 100644 --- a/src/main/java/ru/betterend/blocks/basis/BarkBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/BarkBlock.java @@ -1,6 +1,7 @@ package ru.betterend.blocks.basis; import java.io.Reader; + import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import ru.betterend.patterns.Patterns; diff --git a/src/main/java/ru/betterend/blocks/basis/BaseBlockWithEntity.java b/src/main/java/ru/betterend/blocks/basis/BaseBlockWithEntity.java index f8a8b656..fffe742d 100644 --- a/src/main/java/ru/betterend/blocks/basis/BaseBlockWithEntity.java +++ b/src/main/java/ru/betterend/blocks/basis/BaseBlockWithEntity.java @@ -2,6 +2,7 @@ package ru.betterend.blocks.basis; import java.util.Collections; import java.util.List; + import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.BaseEntityBlock; diff --git a/src/main/java/ru/betterend/blocks/basis/BlockBase.java b/src/main/java/ru/betterend/blocks/basis/BlockBase.java index 05f59723..9299f6d6 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockBase.java +++ b/src/main/java/ru/betterend/blocks/basis/BlockBase.java @@ -3,6 +3,7 @@ package ru.betterend.blocks.basis; import java.io.Reader; import java.util.Collections; import java.util.List; + import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java index 3144d336..7e7bdbf1 100644 --- a/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java @@ -2,6 +2,9 @@ package ru.betterend.blocks.basis; import java.util.Map; import java.util.Random; + +import com.google.common.collect.Maps; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Registry; @@ -20,7 +23,6 @@ import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.EnumProperty; import net.minecraft.world.level.material.MaterialColor; import net.minecraft.world.phys.BlockHitResult; -import com.google.common.collect.Maps; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.EndTerrainBlock; diff --git a/src/main/java/ru/betterend/blocks/entities/render/EndChestBlockEntityRenderer.java b/src/main/java/ru/betterend/blocks/entities/render/EndChestBlockEntityRenderer.java index 2b6b7838..b06c2316 100644 --- a/src/main/java/ru/betterend/blocks/entities/render/EndChestBlockEntityRenderer.java +++ b/src/main/java/ru/betterend/blocks/entities/render/EndChestBlockEntityRenderer.java @@ -1,6 +1,14 @@ package ru.betterend.blocks.entities.render; import java.util.HashMap; + +import com.google.common.collect.Maps; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Vector3f; + +import it.unimi.dsi.fastutil.floats.Float2FloatFunction; +import it.unimi.dsi.fastutil.ints.Int2IntFunction; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -22,12 +30,6 @@ import net.minecraft.world.level.block.entity.ChestBlockEntity; import net.minecraft.world.level.block.entity.LidBlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.ChestType; -import com.google.common.collect.Maps; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.math.Vector3f; -import it.unimi.dsi.fastutil.floats.Float2FloatFunction; -import it.unimi.dsi.fastutil.ints.Int2IntFunction; import ru.betterend.BetterEnd; import ru.betterend.blocks.basis.EndChestBlock; import ru.betterend.blocks.entities.EChestBlockEntity; diff --git a/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java b/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java index 9c979617..53b3a0fa 100644 --- a/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java +++ b/src/main/java/ru/betterend/blocks/entities/render/EndSignBlockEntityRenderer.java @@ -2,6 +2,13 @@ package ru.betterend.blocks.entities.render; import java.util.HashMap; import java.util.List; + +import com.google.common.collect.Maps; +import com.mojang.blaze3d.platform.NativeImage; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Vector3f; + import net.minecraft.client.gui.Font; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -20,11 +27,6 @@ import net.minecraft.world.level.block.SignBlock; import net.minecraft.world.level.block.StandingSignBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.WoodType; -import com.google.common.collect.Maps; -import com.mojang.blaze3d.platform.NativeImage; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.math.Vector3f; import ru.betterend.BetterEnd; import ru.betterend.blocks.basis.EndSignBlock; import ru.betterend.blocks.entities.ESignBlockEntity; diff --git a/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java b/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java index d989e57d..1bb01cec 100644 --- a/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java +++ b/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java @@ -2,6 +2,7 @@ package ru.betterend.blocks.entities.render; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Vector3f; + import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; diff --git a/src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java b/src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java index 797438f7..fea3c140 100644 --- a/src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java +++ b/src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java @@ -12,6 +12,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.Tesselator; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Matrix4f; + import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.Util; diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java index 30cc0260..1ed760f5 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java @@ -6,6 +6,7 @@ import java.util.Set; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; + import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.gui.GuiComponent; diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java index 6aba3065..7bb7f206 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java @@ -2,6 +2,7 @@ package ru.betterend.client.gui; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; + import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.gui.components.ImageButton; diff --git a/src/main/java/ru/betterend/client/render/BeamRenderer.java b/src/main/java/ru/betterend/client/render/BeamRenderer.java index fe8f8e3a..88de8add 100644 --- a/src/main/java/ru/betterend/client/render/BeamRenderer.java +++ b/src/main/java/ru/betterend/client/render/BeamRenderer.java @@ -5,6 +5,7 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Matrix3f; import com.mojang.math.Matrix4f; import com.mojang.math.Vector3f; + import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.texture.OverlayTexture; diff --git a/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java b/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java index 9c559914..54a1d540 100644 --- a/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java +++ b/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java @@ -1,94 +1,95 @@ -package ru.betterend.client.render; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.math.Matrix3f; -import com.mojang.math.Matrix4f; -import com.mojang.math.Quaternion; -import com.mojang.math.Vector3f; -import net.minecraft.client.model.geom.ModelPart; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.core.BlockPos; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.Mth; - -public class EndCrystalRenderer { - private static final ResourceLocation CRYSTAL_TEXTURE = new ResourceLocation("textures/entity/end_crystal/end_crystal.png"); - private static final ResourceLocation CRYSTAL_BEAM_TEXTURE = new ResourceLocation("textures/entity/end_crystal/end_crystal_beam.png"); - private static final RenderType CRYSTAL_BEAM_LAYER; - private static final RenderType END_CRYSTAL; - private static final ModelPart CORE; - private static final ModelPart FRAME; - private static final int AGE_CYCLE = 240; - private static final float SINE_45_DEGREES; - - public static void render(int age, int maxAge, float tickDelta, PoseStack matrices, MultiBufferSource vertexConsumerProvider, int light) { - float k = (float) AGE_CYCLE / maxAge; - float rotation = (age * k + tickDelta) * 3.0F; - VertexConsumer vertexConsumer = vertexConsumerProvider.getBuffer(END_CRYSTAL); - matrices.pushPose(); - matrices.scale(0.8F, 0.8F, 0.8F); - matrices.translate(0.0D, -0.5D, 0.0D); - matrices.mulPose(Vector3f.YP.rotationDegrees(rotation)); - matrices.translate(0.0D, 0.8F, 0.0D); - matrices.mulPose(new Quaternion(new Vector3f(SINE_45_DEGREES, 0.0F, SINE_45_DEGREES), 60.0F, true)); - FRAME.render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY); - matrices.scale(0.875F, 0.875F, 0.875F); - matrices.mulPose(new Quaternion(new Vector3f(SINE_45_DEGREES, 0.0F, SINE_45_DEGREES), 60.0F, true)); - matrices.mulPose(Vector3f.YP.rotationDegrees(rotation)); - FRAME.render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY); - matrices.scale(0.875F, 0.875F, 0.875F); - matrices.mulPose(new Quaternion(new Vector3f(SINE_45_DEGREES, 0.0F, SINE_45_DEGREES), 60.0F, true)); - matrices.mulPose(Vector3f.YP.rotationDegrees(rotation)); - CORE.render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY); - matrices.popPose(); - } - - public static void renderBeam(BlockPos start, BlockPos end, float tickDelta, int age, PoseStack matrices, MultiBufferSource vertexConsumers, int light) { - float dx = start.getX() - end.getX() + 1.0F; - float dy = start.getY() - end.getY() + 1.0F; - float dz = start.getZ() - end.getZ() + 1.0F; - float f = Mth.sqrt(dx * dx + dz * dz); - float g = Mth.sqrt(dx * dx + dy * dy + dz * dz); - matrices.pushPose(); - matrices.translate(0.0D, 2.0D, 0.0D); - matrices.mulPose(Vector3f.YP.rotation((float)(-Math.atan2((double) dz, (double) dx)) - 1.5707964F)); - matrices.mulPose(Vector3f.XP.rotation((float)(-Math.atan2((double) f, (double) dy)) - 1.5707964F)); - VertexConsumer vertexConsumer = vertexConsumers.getBuffer(CRYSTAL_BEAM_LAYER); - float h = 0.0F - ((float) age + tickDelta) * 0.01F; - float i = Mth.sqrt(dx * dx + dy * dy + dz * dz) / 32.0F - ((float) age + tickDelta) * 0.01F; - float k = 0.0F; - float l = 0.75F; - float m = 0.0F; - PoseStack.Pose entry = matrices.last(); - Matrix4f matrix4f = entry.pose(); - Matrix3f matrix3f = entry.normal(); - - for(int n = 1; n <= 8; ++n) { - float o = Mth.sin((float) n * 6.2831855F / 8.0F) * 0.75F; - float p = Mth.cos((float) n * 6.2831855F / 8.0F) * 0.75F; - float q = (float) n / 8.0F; - vertexConsumer.vertex(matrix4f, k * 0.2F, l * 0.2F, 0.0F).color(0, 0, 0, 255).uv(m, h).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).endVertex(); - vertexConsumer.vertex(matrix4f, k, l, g).color(255, 255, 255, 255).uv(m, i).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).endVertex(); - vertexConsumer.vertex(matrix4f, o, p, g).color(255, 255, 255, 255).uv(q, i).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).endVertex(); - vertexConsumer.vertex(matrix4f, o * 0.2F, p * 0.2F, 0.0F).color(0, 0, 0, 255).uv(q, h).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).endVertex(); - k = o; - l = p; - m = q; - } - - matrices.popPose(); - } - - static { - END_CRYSTAL = RenderType.entityCutoutNoCull(CRYSTAL_TEXTURE); - CRYSTAL_BEAM_LAYER = RenderType.entitySmoothCutout(CRYSTAL_BEAM_TEXTURE); - SINE_45_DEGREES = (float) Math.sin(0.7853981633974483D); - FRAME = new ModelPart(64, 32, 0, 0); - FRAME.addBox(-4.0F, -4.0F, -4.0F, 8.0F, 8.0F, 8.0F); - CORE = new ModelPart(64, 32, 32, 0); - CORE.addBox(-4.0F, -4.0F, -4.0F, 8.0F, 8.0F, 8.0F); - } -} +package ru.betterend.client.render; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Matrix3f; +import com.mojang.math.Matrix4f; +import com.mojang.math.Quaternion; +import com.mojang.math.Vector3f; + +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; + +public class EndCrystalRenderer { + private static final ResourceLocation CRYSTAL_TEXTURE = new ResourceLocation("textures/entity/end_crystal/end_crystal.png"); + private static final ResourceLocation CRYSTAL_BEAM_TEXTURE = new ResourceLocation("textures/entity/end_crystal/end_crystal_beam.png"); + private static final RenderType CRYSTAL_BEAM_LAYER; + private static final RenderType END_CRYSTAL; + private static final ModelPart CORE; + private static final ModelPart FRAME; + private static final int AGE_CYCLE = 240; + private static final float SINE_45_DEGREES; + + public static void render(int age, int maxAge, float tickDelta, PoseStack matrices, MultiBufferSource vertexConsumerProvider, int light) { + float k = (float) AGE_CYCLE / maxAge; + float rotation = (age * k + tickDelta) * 3.0F; + VertexConsumer vertexConsumer = vertexConsumerProvider.getBuffer(END_CRYSTAL); + matrices.pushPose(); + matrices.scale(0.8F, 0.8F, 0.8F); + matrices.translate(0.0D, -0.5D, 0.0D); + matrices.mulPose(Vector3f.YP.rotationDegrees(rotation)); + matrices.translate(0.0D, 0.8F, 0.0D); + matrices.mulPose(new Quaternion(new Vector3f(SINE_45_DEGREES, 0.0F, SINE_45_DEGREES), 60.0F, true)); + FRAME.render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY); + matrices.scale(0.875F, 0.875F, 0.875F); + matrices.mulPose(new Quaternion(new Vector3f(SINE_45_DEGREES, 0.0F, SINE_45_DEGREES), 60.0F, true)); + matrices.mulPose(Vector3f.YP.rotationDegrees(rotation)); + FRAME.render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY); + matrices.scale(0.875F, 0.875F, 0.875F); + matrices.mulPose(new Quaternion(new Vector3f(SINE_45_DEGREES, 0.0F, SINE_45_DEGREES), 60.0F, true)); + matrices.mulPose(Vector3f.YP.rotationDegrees(rotation)); + CORE.render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY); + matrices.popPose(); + } + + public static void renderBeam(BlockPos start, BlockPos end, float tickDelta, int age, PoseStack matrices, MultiBufferSource vertexConsumers, int light) { + float dx = start.getX() - end.getX() + 1.0F; + float dy = start.getY() - end.getY() + 1.0F; + float dz = start.getZ() - end.getZ() + 1.0F; + float f = Mth.sqrt(dx * dx + dz * dz); + float g = Mth.sqrt(dx * dx + dy * dy + dz * dz); + matrices.pushPose(); + matrices.translate(0.0D, 2.0D, 0.0D); + matrices.mulPose(Vector3f.YP.rotation((float)(-Math.atan2((double) dz, (double) dx)) - 1.5707964F)); + matrices.mulPose(Vector3f.XP.rotation((float)(-Math.atan2((double) f, (double) dy)) - 1.5707964F)); + VertexConsumer vertexConsumer = vertexConsumers.getBuffer(CRYSTAL_BEAM_LAYER); + float h = 0.0F - ((float) age + tickDelta) * 0.01F; + float i = Mth.sqrt(dx * dx + dy * dy + dz * dz) / 32.0F - ((float) age + tickDelta) * 0.01F; + float k = 0.0F; + float l = 0.75F; + float m = 0.0F; + PoseStack.Pose entry = matrices.last(); + Matrix4f matrix4f = entry.pose(); + Matrix3f matrix3f = entry.normal(); + + for(int n = 1; n <= 8; ++n) { + float o = Mth.sin((float) n * 6.2831855F / 8.0F) * 0.75F; + float p = Mth.cos((float) n * 6.2831855F / 8.0F) * 0.75F; + float q = (float) n / 8.0F; + vertexConsumer.vertex(matrix4f, k * 0.2F, l * 0.2F, 0.0F).color(0, 0, 0, 255).uv(m, h).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).endVertex(); + vertexConsumer.vertex(matrix4f, k, l, g).color(255, 255, 255, 255).uv(m, i).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).endVertex(); + vertexConsumer.vertex(matrix4f, o, p, g).color(255, 255, 255, 255).uv(q, i).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).endVertex(); + vertexConsumer.vertex(matrix4f, o * 0.2F, p * 0.2F, 0.0F).color(0, 0, 0, 255).uv(q, h).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(light).normal(matrix3f, 0.0F, -1.0F, 0.0F).endVertex(); + k = o; + l = p; + m = q; + } + + matrices.popPose(); + } + + static { + END_CRYSTAL = RenderType.entityCutoutNoCull(CRYSTAL_TEXTURE); + CRYSTAL_BEAM_LAYER = RenderType.entitySmoothCutout(CRYSTAL_BEAM_TEXTURE); + SINE_45_DEGREES = (float) Math.sin(0.7853981633974483D); + FRAME = new ModelPart(64, 32, 0, 0); + FRAME.addBox(-4.0F, -4.0F, -4.0F, 8.0F, 8.0F, 8.0F); + CORE = new ModelPart(64, 32, 32, 0); + CORE.addBox(-4.0F, -4.0F, -4.0F, 8.0F, 8.0F, 8.0F); + } +} diff --git a/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java b/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java index a64ecc94..8df56267 100644 --- a/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java +++ b/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java @@ -1,69 +1,70 @@ -package ru.betterend.client.render; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.math.Vector3f; -import net.minecraft.client.model.geom.ModelPart; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.core.Vec3i; -import net.minecraft.util.Mth; -import ru.betterend.BetterEnd; -import ru.betterend.blocks.AuroraCrystalBlock; -import ru.betterend.util.ColorUtil; -import ru.betterend.util.MHelper; - -public class EternalCrystalRenderer { - private static final RenderType RENDER_LAYER; - private static final ModelPart[] SHARDS; - private static final ModelPart CORE; - - public static void render(int age, float tickDelta, PoseStack matrices, MultiBufferSource vertexConsumerProvider, int light) { - VertexConsumer vertexConsumer = vertexConsumerProvider.getBuffer(RENDER_LAYER); - float[] colors = colors(age); - float rotation = (age + tickDelta) / 25.0F + 6.0F; - matrices.pushPose(); - matrices.scale(0.6F, 0.6F, 0.6F); - matrices.mulPose(Vector3f.YP.rotation(rotation)); - CORE.render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY, colors[0], colors[1], colors[2], colors[3]); - - for (int i = 0; i < 4; i++) { - matrices.pushPose(); - float offset = Mth.sin(rotation * 2 + i) * 0.15F; - matrices.translate(0, offset, 0); - SHARDS[i].render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY, colors[0], colors[1], colors[2], colors[3]); - matrices.popPose(); - } - - matrices.popPose(); - } - - public static float[] colors(int age) { - double delta = age * 0.01; - int index = MHelper.floor(delta); - int index2 = (index + 1) & 3; - delta -= index; - index &= 3; - - Vec3i color1 = AuroraCrystalBlock.COLORS[index]; - Vec3i color2 = AuroraCrystalBlock.COLORS[index2]; - - int r = MHelper.floor(Mth.lerp(delta, color1.getX(), color2.getX())); - int g = MHelper.floor(Mth.lerp(delta, color1.getY(), color2.getY())); - int b = MHelper.floor(Mth.lerp(delta, color1.getZ(), color2.getZ())); - - return ColorUtil.toFloatArray(MHelper.color(r, g, b)); - } - - static { - RENDER_LAYER = RenderType.beaconBeam(BetterEnd.makeID("textures/entity/eternal_crystal.png"), true); - SHARDS = new ModelPart[4]; - SHARDS[0] = new ModelPart(16, 16, 2, 4).addBox(-5.0F, 1.0F, -3.0F, 2.0F, 8.0F, 2.0F); - SHARDS[1] = new ModelPart(16, 16, 2, 4).addBox(3.0F, -1.0F, -1.0F, 2.0F, 8.0F, 2.0F); - SHARDS[2] = new ModelPart(16, 16, 2, 4).addBox(-1.0F, 0.0F, -5.0F, 2.0F, 4.0F, 2.0F); - SHARDS[3] = new ModelPart(16, 16, 2, 4).addBox(0.0F, 3.0F, 4.0F, 2.0F, 6.0F, 2.0F); - CORE = new ModelPart(16, 16, 0, 0); - CORE.addBox(-2.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F); - } -} +package ru.betterend.client.render; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Vector3f; + +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.core.Vec3i; +import net.minecraft.util.Mth; +import ru.betterend.BetterEnd; +import ru.betterend.blocks.AuroraCrystalBlock; +import ru.betterend.util.ColorUtil; +import ru.betterend.util.MHelper; + +public class EternalCrystalRenderer { + private static final RenderType RENDER_LAYER; + private static final ModelPart[] SHARDS; + private static final ModelPart CORE; + + public static void render(int age, float tickDelta, PoseStack matrices, MultiBufferSource vertexConsumerProvider, int light) { + VertexConsumer vertexConsumer = vertexConsumerProvider.getBuffer(RENDER_LAYER); + float[] colors = colors(age); + float rotation = (age + tickDelta) / 25.0F + 6.0F; + matrices.pushPose(); + matrices.scale(0.6F, 0.6F, 0.6F); + matrices.mulPose(Vector3f.YP.rotation(rotation)); + CORE.render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY, colors[0], colors[1], colors[2], colors[3]); + + for (int i = 0; i < 4; i++) { + matrices.pushPose(); + float offset = Mth.sin(rotation * 2 + i) * 0.15F; + matrices.translate(0, offset, 0); + SHARDS[i].render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY, colors[0], colors[1], colors[2], colors[3]); + matrices.popPose(); + } + + matrices.popPose(); + } + + public static float[] colors(int age) { + double delta = age * 0.01; + int index = MHelper.floor(delta); + int index2 = (index + 1) & 3; + delta -= index; + index &= 3; + + Vec3i color1 = AuroraCrystalBlock.COLORS[index]; + Vec3i color2 = AuroraCrystalBlock.COLORS[index2]; + + int r = MHelper.floor(Mth.lerp(delta, color1.getX(), color2.getX())); + int g = MHelper.floor(Mth.lerp(delta, color1.getY(), color2.getY())); + int b = MHelper.floor(Mth.lerp(delta, color1.getZ(), color2.getZ())); + + return ColorUtil.toFloatArray(MHelper.color(r, g, b)); + } + + static { + RENDER_LAYER = RenderType.beaconBeam(BetterEnd.makeID("textures/entity/eternal_crystal.png"), true); + SHARDS = new ModelPart[4]; + SHARDS[0] = new ModelPart(16, 16, 2, 4).addBox(-5.0F, 1.0F, -3.0F, 2.0F, 8.0F, 2.0F); + SHARDS[1] = new ModelPart(16, 16, 2, 4).addBox(3.0F, -1.0F, -1.0F, 2.0F, 8.0F, 2.0F); + SHARDS[2] = new ModelPart(16, 16, 2, 4).addBox(-1.0F, 0.0F, -5.0F, 2.0F, 4.0F, 2.0F); + SHARDS[3] = new ModelPart(16, 16, 2, 4).addBox(0.0F, 3.0F, 4.0F, 2.0F, 6.0F, 2.0F); + CORE = new ModelPart(16, 16, 0, 0); + CORE.addBox(-2.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F); + } +} diff --git a/src/main/java/ru/betterend/config/ConfigKeeper.java b/src/main/java/ru/betterend/config/ConfigKeeper.java index b98c942e..ffd6ee5b 100644 --- a/src/main/java/ru/betterend/config/ConfigKeeper.java +++ b/src/main/java/ru/betterend/config/ConfigKeeper.java @@ -4,13 +4,15 @@ import java.lang.reflect.Type; import java.util.Map; import java.util.function.Consumer; import java.util.function.Supplier; -import net.minecraft.util.GsonHelper; + import org.jetbrains.annotations.Nullable; import com.google.common.collect.Maps; import com.google.common.reflect.TypeToken; import com.google.gson.JsonElement; import com.google.gson.JsonObject; + +import net.minecraft.util.GsonHelper; import ru.betterend.util.JsonFactory; public final class ConfigKeeper { diff --git a/src/main/java/ru/betterend/config/IdConfig.java b/src/main/java/ru/betterend/config/IdConfig.java index e6e84f7f..9bef635e 100644 --- a/src/main/java/ru/betterend/config/IdConfig.java +++ b/src/main/java/ru/betterend/config/IdConfig.java @@ -1,91 +1,93 @@ -package ru.betterend.config; - -import java.util.function.BiFunction; -import net.minecraft.resources.ResourceLocation; -import org.jetbrains.annotations.Nullable; -import ru.betterend.config.ConfigKeeper.Entry; -import ru.betterend.config.ConfigKeeper.FloatRange; -import ru.betterend.config.ConfigKeeper.IntegerRange; - -public class IdConfig extends Config { - - protected final BiFunction keyFactory; - - public IdConfig(String group, BiFunction keyFactory) { - super(group); - this.keyFactory = keyFactory; - } - - @Override - protected void registerEntries() {} - - protected ConfigKey createKey(ResourceLocation id, String key) { - return this.keyFactory.apply(id, key); - } - - @Nullable - public > E getEntry(ResourceLocation id, String key, Class type) { - return this.getEntry(createKey(id, key), type); - } - - @Nullable - public > T getDefault(ResourceLocation id, String key, Class type) { - return this.getDefault(createKey(id, key), type); - } - - public String getString(ResourceLocation id, String key, String defaultValue) { - return this.getString(createKey(id, key), defaultValue); - } - - public String getString(ResourceLocation id, String key) { - return this.getString(createKey(id, key)); - } - - public boolean setString(ResourceLocation id, String key, String value) { - return this.setString(createKey(id, key), value); - } - - public int getInt(ResourceLocation id, String key, int defaultValue) { - return this.getInt(createKey(id, key), defaultValue); - } - - public int getInt(ResourceLocation id, String key) { - return this.getInt(createKey(id, key)); - } - - public boolean setInt(ResourceLocation id, String key, int value) { - return this.setInt(createKey(id, key), value); - } - - public boolean setRangedInt(ResourceLocation id, String key, int value) { - return this.setRanged(createKey(id, key), value, IntegerRange.class); - } - - public boolean setRangedFloat(ResourceLocation id, String key, float value) { - return this.setRanged(createKey(id, key), value, FloatRange.class); - } - - public float getFloat(ResourceLocation id, String key, float defaultValue) { - return this.getFloat(createKey(id, key), defaultValue); - } - - public float getFloat(ResourceLocation id, String key) { - return this.getFloat(createKey(id, key)); - } - - public boolean setFloat(ResourceLocation id, String key, float value) { - return this.setFloat(createKey(id, key), value); - } - - public boolean getBoolean(ResourceLocation id, String key, boolean defaultValue) { - return this.getBoolean(createKey(id, key), defaultValue); - } - - public boolean getBoolean(ResourceLocation id, String key) { - return this.getBoolean(createKey(id, key)); - } - - public boolean setBoolean(ResourceLocation id, String key, boolean value) { - return this.setBoolean(createKey(id, key), value); - } -} +package ru.betterend.config; + +import java.util.function.BiFunction; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.resources.ResourceLocation; +import ru.betterend.config.ConfigKeeper.Entry; +import ru.betterend.config.ConfigKeeper.FloatRange; +import ru.betterend.config.ConfigKeeper.IntegerRange; + +public class IdConfig extends Config { + + protected final BiFunction keyFactory; + + public IdConfig(String group, BiFunction keyFactory) { + super(group); + this.keyFactory = keyFactory; + } + + @Override + protected void registerEntries() {} + + protected ConfigKey createKey(ResourceLocation id, String key) { + return this.keyFactory.apply(id, key); + } + + @Nullable + public > E getEntry(ResourceLocation id, String key, Class type) { + return this.getEntry(createKey(id, key), type); + } + + @Nullable + public > T getDefault(ResourceLocation id, String key, Class type) { + return this.getDefault(createKey(id, key), type); + } + + public String getString(ResourceLocation id, String key, String defaultValue) { + return this.getString(createKey(id, key), defaultValue); + } + + public String getString(ResourceLocation id, String key) { + return this.getString(createKey(id, key)); + } + + public boolean setString(ResourceLocation id, String key, String value) { + return this.setString(createKey(id, key), value); + } + + public int getInt(ResourceLocation id, String key, int defaultValue) { + return this.getInt(createKey(id, key), defaultValue); + } + + public int getInt(ResourceLocation id, String key) { + return this.getInt(createKey(id, key)); + } + + public boolean setInt(ResourceLocation id, String key, int value) { + return this.setInt(createKey(id, key), value); + } + + public boolean setRangedInt(ResourceLocation id, String key, int value) { + return this.setRanged(createKey(id, key), value, IntegerRange.class); + } + + public boolean setRangedFloat(ResourceLocation id, String key, float value) { + return this.setRanged(createKey(id, key), value, FloatRange.class); + } + + public float getFloat(ResourceLocation id, String key, float defaultValue) { + return this.getFloat(createKey(id, key), defaultValue); + } + + public float getFloat(ResourceLocation id, String key) { + return this.getFloat(createKey(id, key)); + } + + public boolean setFloat(ResourceLocation id, String key, float value) { + return this.setFloat(createKey(id, key), value); + } + + public boolean getBoolean(ResourceLocation id, String key, boolean defaultValue) { + return this.getBoolean(createKey(id, key), defaultValue); + } + + public boolean getBoolean(ResourceLocation id, String key) { + return this.getBoolean(createKey(id, key)); + } + + public boolean setBoolean(ResourceLocation id, String key, boolean value) { + return this.setBoolean(createKey(id, key), value); + } +} diff --git a/src/main/java/ru/betterend/entity/CubozoaEntity.java b/src/main/java/ru/betterend/entity/CubozoaEntity.java index 067e9226..3d45e55f 100644 --- a/src/main/java/ru/betterend/entity/CubozoaEntity.java +++ b/src/main/java/ru/betterend/entity/CubozoaEntity.java @@ -2,6 +2,7 @@ package ru.betterend.entity; import java.util.List; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.protocol.game.ClientboundGameEventPacket; @@ -30,7 +31,6 @@ import net.minecraft.world.entity.animal.AbstractSchoolingFish; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.phys.AABB; @@ -49,7 +49,13 @@ public class CubozoaEntity extends AbstractSchoolingFish { @Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, SpawnGroupData entityData, CompoundTag entityTag) { SpawnGroupData data = super.finalizeSpawn(world, difficulty, spawnReason, entityData, entityTag); - if (EndBiomes.getFromBiome(world.getBiome(blockPosition())) == EndBiomes.SULPHUR_SPRINGS) { + if (entityTag != null) { + if (entityTag.contains("variant")) + this.entityData.set(VARIANT, entityTag.getByte("variant")); + if (entityTag.contains("scale")) + this.entityData.set(SCALE, entityTag.getByte("scale")); + } + else if (EndBiomes.getFromBiome(world.getBiome(blockPosition())) == EndBiomes.SULPHUR_SPRINGS) { this.entityData.set(VARIANT, (byte) 1); } this.refreshDimensions(); @@ -67,7 +73,7 @@ public class CubozoaEntity extends AbstractSchoolingFish { public void addAdditionalSaveData(CompoundTag tag) { super.addAdditionalSaveData(tag); tag.putByte("Variant", (byte) getVariant()); - tag.putByte("Scale", (byte) getScale()); + tag.putByte("Scale", getByteScale()); } @Override @@ -80,6 +86,15 @@ public class CubozoaEntity extends AbstractSchoolingFish { this.entityData.set(SCALE, tag.getByte("Scale")); } } + + @Override + protected ItemStack getBucketItemStack() { + ItemStack bucket = EndItems.BUCKET_CUBOZOA.getDefaultInstance(); + CompoundTag tag = bucket.getOrCreateTag(); + tag.putByte("variant", entityData.get(VARIANT)); + tag.putByte("scale", entityData.get(SCALE)); + return bucket; + } public static AttributeSupplier.Builder createMobAttributes() { return LivingEntity.createLivingAttributes() @@ -91,9 +106,13 @@ public class CubozoaEntity extends AbstractSchoolingFish { public int getVariant() { return (int) this.entityData.get(VARIANT); } + + public byte getByteScale() { + return this.entityData.get(SCALE); + } public float getScale() { - return this.entityData.get(SCALE) / 32F + 0.75F; + return getByteScale() / 32F + 0.75F; } public static boolean canSpawn(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { @@ -117,11 +136,6 @@ public class CubozoaEntity extends AbstractSchoolingFish { } } - @Override - protected ItemStack getBucketItemStack() { - return new ItemStack(Items.WATER_BUCKET); - } - @Override protected SoundEvent getFlopSound() { return SoundEvents.SALMON_FLOP; diff --git a/src/main/java/ru/betterend/entity/DragonflyEntity.java b/src/main/java/ru/betterend/entity/DragonflyEntity.java index a105912e..ff66b062 100644 --- a/src/main/java/ru/betterend/entity/DragonflyEntity.java +++ b/src/main/java/ru/betterend/entity/DragonflyEntity.java @@ -2,6 +2,7 @@ package ru.betterend.entity; import java.util.EnumSet; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; @@ -31,8 +32,6 @@ import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.pathfinder.BlockPathTypes; import net.minecraft.world.level.pathfinder.Path; import net.minecraft.world.phys.Vec3; -import ru.betterend.entity.DragonflyEntity.DragonflyLookControl; -import ru.betterend.entity.DragonflyEntity.WanderAroundGoal; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndSounds; import ru.betterend.util.BlocksHelper; diff --git a/src/main/java/ru/betterend/entity/EndFishEntity.java b/src/main/java/ru/betterend/entity/EndFishEntity.java index a37d3854..9d3a170d 100644 --- a/src/main/java/ru/betterend/entity/EndFishEntity.java +++ b/src/main/java/ru/betterend/entity/EndFishEntity.java @@ -2,6 +2,7 @@ package ru.betterend.entity; import java.util.List; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; @@ -42,7 +43,13 @@ public class EndFishEntity extends AbstractSchoolingFish { @Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, SpawnGroupData entityData, CompoundTag entityTag) { SpawnGroupData data = super.finalizeSpawn(world, difficulty, spawnReason, entityData, entityTag); - if (EndBiomes.getFromBiome(world.getBiome(blockPosition())) == EndBiomes.SULPHUR_SPRINGS) { + if (entityTag != null) { + if (entityTag.contains("variant")) + this.entityData.set(VARIANT, entityTag.getByte("variant")); + if (entityTag.contains("scale")) + this.entityData.set(SCALE, entityTag.getByte("scale")); + } + else if (EndBiomes.getFromBiome(world.getBiome(blockPosition())) == EndBiomes.SULPHUR_SPRINGS) { this.entityData.set(VARIANT, (byte) (random.nextInt(VARIANTS_SULPHUR) + VARIANTS_NORMAL)); } this.refreshDimensions(); @@ -60,7 +67,7 @@ public class EndFishEntity extends AbstractSchoolingFish { public void addAdditionalSaveData(CompoundTag tag) { super.addAdditionalSaveData(tag); tag.putByte("Variant", (byte) getVariant()); - tag.putByte("Scale", (byte) getScale()); + tag.putByte("Scale", getByteScale()); } @Override @@ -76,7 +83,11 @@ public class EndFishEntity extends AbstractSchoolingFish { @Override protected ItemStack getBucketItemStack() { - return new ItemStack(EndItems.BUCKET_END_FISH); + ItemStack bucket = EndItems.BUCKET_END_FISH.getDefaultInstance(); + CompoundTag tag = bucket.getOrCreateTag(); + tag.putByte("variant", entityData.get(VARIANT)); + tag.putByte("scale", entityData.get(SCALE)); + return bucket; } @Override @@ -121,8 +132,12 @@ public class EndFishEntity extends AbstractSchoolingFish { return (int) this.entityData.get(VARIANT); } + public byte getByteScale() { + return this.entityData.get(SCALE); + } + public float getScale() { - return this.entityData.get(SCALE) / 32F + 0.75F; + return getByteScale() / 32F + 0.75F; } public static boolean canSpawn(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { diff --git a/src/main/java/ru/betterend/entity/EndSlimeEntity.java b/src/main/java/ru/betterend/entity/EndSlimeEntity.java index bf1a8227..beaea327 100644 --- a/src/main/java/ru/betterend/entity/EndSlimeEntity.java +++ b/src/main/java/ru/betterend/entity/EndSlimeEntity.java @@ -3,6 +3,7 @@ package ru.betterend.entity; import java.util.EnumSet; import java.util.List; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.particles.ParticleOptions; @@ -37,11 +38,6 @@ import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.phys.AABB; -import ru.betterend.entity.EndSlimeEntity.EndSlimeMoveControl; -import ru.betterend.entity.EndSlimeEntity.FaceTowardTargetGoal; -import ru.betterend.entity.EndSlimeEntity.MoveGoal; -import ru.betterend.entity.EndSlimeEntity.RandomLookGoal; -import ru.betterend.entity.EndSlimeEntity.SwimmingGoal; import ru.betterend.interfaces.ISlime; import ru.betterend.registry.EndBiomes; import ru.betterend.util.BlocksHelper; diff --git a/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java b/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java index 9e466de1..8f209b7a 100644 --- a/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java +++ b/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java @@ -2,6 +2,7 @@ package ru.betterend.entity; import java.util.List; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.sounds.SoundEvent; diff --git a/src/main/java/ru/betterend/entity/SilkMothEntity.java b/src/main/java/ru/betterend/entity/SilkMothEntity.java index a88a78e8..edd20af3 100644 --- a/src/main/java/ru/betterend/entity/SilkMothEntity.java +++ b/src/main/java/ru/betterend/entity/SilkMothEntity.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Random; import org.jetbrains.annotations.Nullable; + import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; import net.minecraft.nbt.CompoundTag; @@ -46,9 +47,6 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import ru.betterend.BetterEnd; import ru.betterend.blocks.BlockProperties; -import ru.betterend.entity.SilkMothEntity.MothLookControl; -import ru.betterend.entity.SilkMothEntity.ReturnToHiveGoal; -import ru.betterend.entity.SilkMothEntity.WanderAroundGoal; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndItems; diff --git a/src/main/java/ru/betterend/entity/model/BlockBenchModel.java b/src/main/java/ru/betterend/entity/model/BlockBenchModel.java index de949560..cb0758ad 100644 --- a/src/main/java/ru/betterend/entity/model/BlockBenchModel.java +++ b/src/main/java/ru/betterend/entity/model/BlockBenchModel.java @@ -1,6 +1,7 @@ package ru.betterend.entity.model; import java.util.function.Function; + import net.minecraft.client.model.EntityModel; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java b/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java index 68d9021b..91f0abda 100644 --- a/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java @@ -2,6 +2,7 @@ package ru.betterend.entity.model; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; + import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.renderer.RenderType; import net.minecraft.util.Mth; diff --git a/src/main/java/ru/betterend/entity/model/DragonflyEntityModel.java b/src/main/java/ru/betterend/entity/model/DragonflyEntityModel.java index 08b04474..88162bc2 100644 --- a/src/main/java/ru/betterend/entity/model/DragonflyEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/DragonflyEntityModel.java @@ -2,6 +2,7 @@ package ru.betterend.entity.model; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; + import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.renderer.RenderType; import ru.betterend.entity.DragonflyEntity; diff --git a/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java b/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java index 20357336..ebfe8f7b 100644 --- a/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java @@ -2,6 +2,7 @@ package ru.betterend.entity.model; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; + import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.renderer.RenderType; import ru.betterend.entity.EndFishEntity; diff --git a/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java index 2f07e710..bd5b7d52 100644 --- a/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java @@ -3,6 +3,7 @@ package ru.betterend.entity.model; import com.google.common.collect.ImmutableList; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; + import net.minecraft.client.model.ListModel; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java b/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java index 55766a70..5d21fafe 100644 --- a/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java @@ -2,6 +2,7 @@ package ru.betterend.entity.model; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; + import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.renderer.RenderType; import net.minecraft.util.Mth; diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java b/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java index 0e23ffed..5b6b78fe 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java @@ -2,6 +2,7 @@ package ru.betterend.entity.render; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; + import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java b/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java index e37fe63d..fce70f61 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java @@ -2,6 +2,7 @@ package ru.betterend.entity.render; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; + import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java index fa3de633..3fad8fc1 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java @@ -2,6 +2,7 @@ package ru.betterend.entity.render; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; + import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; diff --git a/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java b/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java index d5f6e224..ec830f43 100644 --- a/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java +++ b/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java @@ -2,8 +2,10 @@ package ru.betterend.integration; import java.awt.Color; import java.util.Map; -import net.minecraft.world.level.ItemLike; + import com.google.common.collect.Maps; + +import net.minecraft.world.level.ItemLike; import ru.betterend.blocks.HydraluxPetalColoredBlock; import ru.betterend.blocks.complex.ColoredMaterial; import ru.betterend.registry.EndBlocks; diff --git a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java index 4e18f028..64a805d7 100644 --- a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java +++ b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java @@ -2,6 +2,7 @@ package ru.betterend.integration.byg; import java.util.List; import java.util.stream.Collectors; + import net.minecraft.data.BuiltinRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.ai.behavior.WeightedList; diff --git a/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java b/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java index 42442df7..58c69b13 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java @@ -1,6 +1,7 @@ package ru.betterend.integration.byg.biomes; import java.util.List; + import net.minecraft.sounds.SoundEvent; import net.minecraft.world.entity.MobCategory; import net.minecraft.world.level.biome.Biome; diff --git a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java index 69122484..d373af5e 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java @@ -1,6 +1,7 @@ package ru.betterend.integration.byg.biomes; import java.util.List; + import net.minecraft.core.particles.ParticleTypes; import net.minecraft.sounds.SoundEvent; import net.minecraft.world.entity.MobCategory; diff --git a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java index 469c6609..d1aeb582 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java @@ -2,6 +2,7 @@ package ru.betterend.integration.byg.biomes; import java.util.List; import java.util.function.Supplier; + import net.minecraft.core.Registry; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.data.BuiltinRegistries; diff --git a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java index ee76db67..19b254e4 100644 --- a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java @@ -2,14 +2,16 @@ package ru.betterend.integration.byg.features; import java.util.List; import java.util.Random; + +import com.google.common.base.Function; +import com.mojang.math.Vector3f; + import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; -import com.google.common.base.Function; -import com.mojang.math.Vector3f; import ru.betterend.integration.Integrations; import ru.betterend.registry.EndTags; import ru.betterend.util.MHelper; diff --git a/src/main/java/ru/betterend/integration/byg/features/GreatNightshadeTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/GreatNightshadeTreeFeature.java index fc0b8bf4..12a3554e 100644 --- a/src/main/java/ru/betterend/integration/byg/features/GreatNightshadeTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/GreatNightshadeTreeFeature.java @@ -2,6 +2,11 @@ package ru.betterend.integration.byg.features; import java.util.List; import java.util.Random; + +import com.google.common.base.Function; +import com.google.common.collect.Lists; +import com.mojang.math.Vector3f; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -12,9 +17,6 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; -import com.google.common.base.Function; -import com.google.common.collect.Lists; -import com.mojang.math.Vector3f; import ru.betterend.integration.Integrations; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; diff --git a/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java index f4e03327..72f35a9a 100644 --- a/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java @@ -2,6 +2,11 @@ package ru.betterend.integration.byg.features; import java.util.List; import java.util.Random; + +import com.google.common.base.Function; +import com.google.common.collect.Lists; +import com.mojang.math.Vector3f; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -12,9 +17,6 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; -import com.google.common.base.Function; -import com.google.common.collect.Lists; -import com.mojang.math.Vector3f; import ru.betterend.integration.Integrations; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; diff --git a/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java index e7ed034a..479f1162 100644 --- a/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java @@ -3,6 +3,10 @@ package ru.betterend.integration.byg.features; import java.util.List; import java.util.Random; import java.util.function.Function; + +import com.google.common.collect.Lists; +import com.mojang.math.Vector3f; + import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; @@ -12,8 +16,6 @@ import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import net.minecraft.world.phys.AABB; -import com.google.common.collect.Lists; -import com.mojang.math.Vector3f; import ru.betterend.integration.Integrations; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndTags; diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java index 285f0be4..507cfc15 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java @@ -1,88 +1,89 @@ -package ru.betterend.integration.rei; - -import java.text.DecimalFormat; -import java.util.List; - -import org.jetbrains.annotations.NotNull; - -import com.google.common.collect.Lists; -import com.mojang.blaze3d.vertex.PoseStack; -import it.unimi.dsi.fastutil.ints.IntList; -import me.shedaniel.math.Point; -import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.TransferRecipeCategory; -import me.shedaniel.rei.api.widgets.Widgets; -import me.shedaniel.rei.gui.entries.RecipeEntry; -import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; -import me.shedaniel.rei.gui.widget.Widget; -import net.minecraft.client.gui.GuiComponent; -import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.resources.ResourceLocation; -import ru.betterend.recipe.builders.AlloyingRecipe; -import ru.betterend.registry.EndBlocks; -import ru.betterend.util.LangUtil; - -public class REIAlloyingCategory implements TransferRecipeCategory { - - @Override - public @NotNull ResourceLocation getIdentifier() { - return AlloyingRecipe.ID; - } - - @Override - public @NotNull String getCategoryName() { - return LangUtil.translate(EndBlocks.END_STONE_SMELTER.getDescriptionId()); - } - - @Override - public @NotNull EntryStack getLogo() { - return REIPlugin.END_STONE_SMELTER; - } - - @Override - public @NotNull List setupDisplay(REIAlloyingDisplay display, Rectangle bounds) { - Point startPoint = new Point(bounds.getCenterX() - 41, bounds.y + 10); - double smeltTime = display.getSmeltTime(); - DecimalFormat df = new DecimalFormat("###.##"); - List widgets = Lists.newArrayList(); - widgets.add(Widgets.createRecipeBase(bounds)); - widgets.add(Widgets.createResultSlotBackground(new Point(startPoint.x + 61, startPoint.y + 9))); - widgets.add(Widgets.createBurningFire(new Point(startPoint.x - 9, startPoint.y + 20)).animationDurationMS(10000)); - widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width - 5, bounds.y + 5), - new TranslatableComponent("category.rei.cooking.time&xp", df.format(display.getXp()), df.format(smeltTime / 20D))).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); - widgets.add(Widgets.createArrow(new Point(startPoint.x + 24, startPoint.y + 8)).animationDurationTicks(smeltTime)); - List> inputEntries = display.getInputEntries(); - widgets.add(Widgets.createSlot(new Point(startPoint.x - 20, startPoint.y + 1)).entries(inputEntries.get(0)).markInput()); - if (inputEntries.size() > 1) { - widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(inputEntries.get(1)).markInput()); - } else { - widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(Lists.newArrayList()).markInput()); - } - widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 9)).entries(display.getResultingEntries().get(0)).disableBackground().markOutput()); - return widgets; - } - - @Override - public void renderRedSlots(PoseStack matrices, List widgets, Rectangle bounds, REIAlloyingDisplay display, - IntList redSlots) { - Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 27); - matrices.pushPose(); - matrices.translate(0, 0, 400); - if (redSlots.contains(0)) { - GuiComponent.fill(matrices, startPoint.x - 20, startPoint.y + 1, startPoint.x - 20 + 16, startPoint.y + 1 + 16, 1090453504); - GuiComponent.fill(matrices, startPoint.x + 1, startPoint.y + 1, startPoint.x + 1 + 16, startPoint.y + 1 + 16, 1090453504); - } - matrices.popPose(); - } - - @Override - public @NotNull RecipeEntry getSimpleRenderer(REIAlloyingDisplay recipe) { - return SimpleRecipeEntry.from(recipe.getInputEntries(), recipe.getResultingEntries()); - } - - @Override - public int getDisplayHeight() { - return 49; - } -} +package ru.betterend.integration.rei; + +import java.text.DecimalFormat; +import java.util.List; + +import org.jetbrains.annotations.NotNull; + +import com.google.common.collect.Lists; +import com.mojang.blaze3d.vertex.PoseStack; + +import it.unimi.dsi.fastutil.ints.IntList; +import me.shedaniel.math.Point; +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.EntryStack; +import me.shedaniel.rei.api.TransferRecipeCategory; +import me.shedaniel.rei.api.widgets.Widgets; +import me.shedaniel.rei.gui.entries.RecipeEntry; +import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; +import me.shedaniel.rei.gui.widget.Widget; +import net.minecraft.client.gui.GuiComponent; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import ru.betterend.recipe.builders.AlloyingRecipe; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.LangUtil; + +public class REIAlloyingCategory implements TransferRecipeCategory { + + @Override + public @NotNull ResourceLocation getIdentifier() { + return AlloyingRecipe.ID; + } + + @Override + public @NotNull String getCategoryName() { + return LangUtil.translate(EndBlocks.END_STONE_SMELTER.getDescriptionId()); + } + + @Override + public @NotNull EntryStack getLogo() { + return REIPlugin.END_STONE_SMELTER; + } + + @Override + public @NotNull List setupDisplay(REIAlloyingDisplay display, Rectangle bounds) { + Point startPoint = new Point(bounds.getCenterX() - 41, bounds.y + 10); + double smeltTime = display.getSmeltTime(); + DecimalFormat df = new DecimalFormat("###.##"); + List widgets = Lists.newArrayList(); + widgets.add(Widgets.createRecipeBase(bounds)); + widgets.add(Widgets.createResultSlotBackground(new Point(startPoint.x + 61, startPoint.y + 9))); + widgets.add(Widgets.createBurningFire(new Point(startPoint.x - 9, startPoint.y + 20)).animationDurationMS(10000)); + widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width - 5, bounds.y + 5), + new TranslatableComponent("category.rei.cooking.time&xp", df.format(display.getXp()), df.format(smeltTime / 20D))).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); + widgets.add(Widgets.createArrow(new Point(startPoint.x + 24, startPoint.y + 8)).animationDurationTicks(smeltTime)); + List> inputEntries = display.getInputEntries(); + widgets.add(Widgets.createSlot(new Point(startPoint.x - 20, startPoint.y + 1)).entries(inputEntries.get(0)).markInput()); + if (inputEntries.size() > 1) { + widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(inputEntries.get(1)).markInput()); + } else { + widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(Lists.newArrayList()).markInput()); + } + widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 9)).entries(display.getResultingEntries().get(0)).disableBackground().markOutput()); + return widgets; + } + + @Override + public void renderRedSlots(PoseStack matrices, List widgets, Rectangle bounds, REIAlloyingDisplay display, + IntList redSlots) { + Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 27); + matrices.pushPose(); + matrices.translate(0, 0, 400); + if (redSlots.contains(0)) { + GuiComponent.fill(matrices, startPoint.x - 20, startPoint.y + 1, startPoint.x - 20 + 16, startPoint.y + 1 + 16, 1090453504); + GuiComponent.fill(matrices, startPoint.x + 1, startPoint.y + 1, startPoint.x + 1 + 16, startPoint.y + 1 + 16, 1090453504); + } + matrices.popPose(); + } + + @Override + public @NotNull RecipeEntry getSimpleRenderer(REIAlloyingDisplay recipe) { + return SimpleRecipeEntry.from(recipe.getInputEntries(), recipe.getResultingEntries()); + } + + @Override + public int getDisplayHeight() { + return 49; + } +} diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java index 10c7564c..8b7a552a 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java @@ -1,91 +1,92 @@ -package ru.betterend.integration.rei; - -import java.text.DecimalFormat; -import java.util.List; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import com.google.common.collect.Lists; -import com.mojang.blaze3d.vertex.PoseStack; -import me.shedaniel.math.Point; -import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.RecipeCategory; -import me.shedaniel.rei.api.widgets.Slot; -import me.shedaniel.rei.api.widgets.Tooltip; -import me.shedaniel.rei.api.widgets.Widgets; -import me.shedaniel.rei.gui.entries.RecipeEntry; -import me.shedaniel.rei.gui.widget.Widget; -import net.minecraft.client.Minecraft; -import net.minecraft.client.resources.language.I18n; -import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.Items; - -public class REIAlloyingFuelCategory implements RecipeCategory { - private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#.##"); - - @Override - public @NotNull ResourceLocation getIdentifier() { - return REIPlugin.ALLOYING_FUEL; - } - - @Override - public @NotNull String getCategoryName() { - return I18n.get("category.rei.fuel"); - } - - @Override - public int getDisplayHeight() { - return 49; - } - - @Override - public @NotNull EntryStack getLogo() { - return EntryStack.create(Items.COAL); - } - - @Override - public @NotNull List setupDisplay(REIAlloyingFuelDisplay recipeDisplay, Rectangle bounds) { - Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 17); - String burnTime = DECIMAL_FORMAT.format(recipeDisplay.getFuelTime()); - List widgets = Lists.newArrayList(); - widgets.add(Widgets.createRecipeBase(bounds)); - widgets.add(Widgets.createLabel(new Point(bounds.x + 26, bounds.getMaxY() - 15), new TranslatableComponent("category.rei.fuel.time", burnTime)) - .color(0xFF404040, 0xFFBBBBBB).noShadow().leftAligned()); - widgets.add(Widgets.createBurningFire(new Point(bounds.x + 6, startPoint.y + 1)).animationDurationTicks(recipeDisplay.getFuelTime())); - widgets.add(Widgets.createSlot(new Point(bounds.x + 6, startPoint.y + 18)).entries(recipeDisplay.getInputEntries().get(0)).markInput()); - return widgets; - } - - @Override - public @NotNull RecipeEntry getSimpleRenderer(REIAlloyingFuelDisplay recipe) { - Slot slot = Widgets.createSlot(new Point(0, 0)).entries(recipe.getInputEntries().get(0)).disableBackground().disableHighlight(); - String burnItems = DECIMAL_FORMAT.format(recipe.getFuelTime() / 200d); - return new RecipeEntry() { - private TranslatableComponent text = new TranslatableComponent("category.rei.fuel.time_short.items", burnItems); - - @Override - public int getHeight() { - return 22; - } - - @Nullable - @Override - public Tooltip getTooltip(Point point) { - if (slot.containsMouse(point)) - return slot.getCurrentTooltip(point); - return null; - } - - @Override - public void render(PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, float delta) { - slot.setZ(getZ() + 50); - slot.getBounds().setLocation(bounds.x + 4, bounds.y + 2); - slot.render(matrices, mouseX, mouseY, delta); - Minecraft.getInstance().font.drawShadow(matrices, text.getVisualOrderText(), bounds.x + 25, bounds.y + 8, -1); - } - }; - } -} +package ru.betterend.integration.rei; + +import java.text.DecimalFormat; +import java.util.List; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import com.google.common.collect.Lists; +import com.mojang.blaze3d.vertex.PoseStack; + +import me.shedaniel.math.Point; +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.EntryStack; +import me.shedaniel.rei.api.RecipeCategory; +import me.shedaniel.rei.api.widgets.Slot; +import me.shedaniel.rei.api.widgets.Tooltip; +import me.shedaniel.rei.api.widgets.Widgets; +import me.shedaniel.rei.gui.entries.RecipeEntry; +import me.shedaniel.rei.gui.widget.Widget; +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.language.I18n; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Items; + +public class REIAlloyingFuelCategory implements RecipeCategory { + private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#.##"); + + @Override + public @NotNull ResourceLocation getIdentifier() { + return REIPlugin.ALLOYING_FUEL; + } + + @Override + public @NotNull String getCategoryName() { + return I18n.get("category.rei.fuel"); + } + + @Override + public int getDisplayHeight() { + return 49; + } + + @Override + public @NotNull EntryStack getLogo() { + return EntryStack.create(Items.COAL); + } + + @Override + public @NotNull List setupDisplay(REIAlloyingFuelDisplay recipeDisplay, Rectangle bounds) { + Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 17); + String burnTime = DECIMAL_FORMAT.format(recipeDisplay.getFuelTime()); + List widgets = Lists.newArrayList(); + widgets.add(Widgets.createRecipeBase(bounds)); + widgets.add(Widgets.createLabel(new Point(bounds.x + 26, bounds.getMaxY() - 15), new TranslatableComponent("category.rei.fuel.time", burnTime)) + .color(0xFF404040, 0xFFBBBBBB).noShadow().leftAligned()); + widgets.add(Widgets.createBurningFire(new Point(bounds.x + 6, startPoint.y + 1)).animationDurationTicks(recipeDisplay.getFuelTime())); + widgets.add(Widgets.createSlot(new Point(bounds.x + 6, startPoint.y + 18)).entries(recipeDisplay.getInputEntries().get(0)).markInput()); + return widgets; + } + + @Override + public @NotNull RecipeEntry getSimpleRenderer(REIAlloyingFuelDisplay recipe) { + Slot slot = Widgets.createSlot(new Point(0, 0)).entries(recipe.getInputEntries().get(0)).disableBackground().disableHighlight(); + String burnItems = DECIMAL_FORMAT.format(recipe.getFuelTime() / 200d); + return new RecipeEntry() { + private TranslatableComponent text = new TranslatableComponent("category.rei.fuel.time_short.items", burnItems); + + @Override + public int getHeight() { + return 22; + } + + @Nullable + @Override + public Tooltip getTooltip(Point point) { + if (slot.containsMouse(point)) + return slot.getCurrentTooltip(point); + return null; + } + + @Override + public void render(PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, float delta) { + slot.setZ(getZ() + 50); + slot.getBounds().setLocation(bounds.x + 4, bounds.y + 2); + slot.render(matrices, mouseX, mouseY, delta); + Minecraft.getInstance().font.drawShadow(matrices, text.getVisualOrderText(), bounds.x + 25, bounds.y + 8, -1); + } + }; + } +} diff --git a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java index 95416a05..fddf1a83 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java @@ -1,100 +1,101 @@ -package ru.betterend.integration.rei; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -import org.jetbrains.annotations.NotNull; - -import com.google.common.collect.Lists; -import com.mojang.blaze3d.vertex.PoseStack; -import it.unimi.dsi.fastutil.ints.IntList; -import me.shedaniel.math.Point; -import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.TransferRecipeCategory; -import me.shedaniel.rei.api.widgets.Widgets; -import me.shedaniel.rei.gui.entries.RecipeEntry; -import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; -import me.shedaniel.rei.gui.widget.Widget; -import net.minecraft.client.gui.GuiComponent; -import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import ru.betterend.blocks.basis.EndAnvilBlock; -import ru.betterend.util.LangUtil; - -public class REIAnvilCategory implements TransferRecipeCategory { - - @Override - public @NotNull ResourceLocation getIdentifier() { - return REIPlugin.SMITHING; - } - - @Override - public @NotNull String getCategoryName() { - return LangUtil.translate(Blocks.ANVIL.getDescriptionId()); - } - - @Override - public @NotNull EntryStack getLogo() { - return REIPlugin.ANVILS[0]; - } - - @Override - public @NotNull List setupDisplay(REIAnvilDisplay display, Rectangle bounds) { - Point startPoint = new Point(bounds.getCenterX() - 41, bounds.y + 10); - List widgets = Lists.newArrayList(); - widgets.add(Widgets.createRecipeBase(bounds)); - int x = startPoint.x + 10; - int y = startPoint.y; - widgets.add(Widgets.createResultSlotBackground(new Point(x + 61, y + 5))); - List> inputEntries = display.getInputEntries(); - List materials = inputEntries.get(1); - int anvilLevel = display.getAnvilLevel(); - List anvils = Arrays.stream(REIPlugin.ANVILS).filter(anvil -> { - Block block = ((BlockItem) anvil.getItem()).getBlock(); - if (block instanceof EndAnvilBlock) { - return ((EndAnvilBlock) block).getCraftingLevel() >= anvilLevel; - } - return anvilLevel == 1; - }).collect(Collectors.toList()); - materials.forEach(entryStack -> entryStack.setAmount(display.getInputCount())); - widgets.add(Widgets.createArrow(new Point(x + 24, y + 4))); - widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width - 7, bounds.y + bounds.height - 15), - new TranslatableComponent("category.rei.damage.amount&dmg", display.getDamage())).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); - widgets.add(Widgets.createSlot(new Point(x - 20, y + 4)).entries(materials).markInput()); - widgets.add(Widgets.createSlot(new Point(x + 1, y + 4)).entries(inputEntries.get(0)).markInput()); - widgets.add(Widgets.createSlot(new Point(x + 61, y + 5)).entries(display.getResultingEntries().get(0)).disableBackground().markOutput()); - widgets.add(Widgets.createSlot(new Point(x - 9, y + 25)).entries(anvils)); - - return widgets; - } - - @Override - public void renderRedSlots(PoseStack matrices, List widgets, Rectangle bounds, REIAnvilDisplay display, - IntList redSlots) { - Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 27); - matrices.pushPose(); - matrices.translate(0, 0, 400); - if (redSlots.contains(0)) { - GuiComponent.fill(matrices, startPoint.x - 20, startPoint.y + 3, startPoint.x - 20 + 16, startPoint.y + 3 + 16, 1090453504); - GuiComponent.fill(matrices, startPoint.x + 1, startPoint.y + 3, startPoint.x + 1 + 16, startPoint.y + 3 + 16, 1090453504); - } - matrices.popPose(); - } - - @Override - public @NotNull RecipeEntry getSimpleRenderer(REIAnvilDisplay recipe) { - return SimpleRecipeEntry.from(Collections.singletonList(recipe.getInputEntries().get(0)), recipe.getResultingEntries()); - } - - @Override - public int getDisplayHeight() { - return 60; - } - -} +package ru.betterend.integration.rei; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import org.jetbrains.annotations.NotNull; + +import com.google.common.collect.Lists; +import com.mojang.blaze3d.vertex.PoseStack; + +import it.unimi.dsi.fastutil.ints.IntList; +import me.shedaniel.math.Point; +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.EntryStack; +import me.shedaniel.rei.api.TransferRecipeCategory; +import me.shedaniel.rei.api.widgets.Widgets; +import me.shedaniel.rei.gui.entries.RecipeEntry; +import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; +import me.shedaniel.rei.gui.widget.Widget; +import net.minecraft.client.gui.GuiComponent; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import ru.betterend.blocks.basis.EndAnvilBlock; +import ru.betterend.util.LangUtil; + +public class REIAnvilCategory implements TransferRecipeCategory { + + @Override + public @NotNull ResourceLocation getIdentifier() { + return REIPlugin.SMITHING; + } + + @Override + public @NotNull String getCategoryName() { + return LangUtil.translate(Blocks.ANVIL.getDescriptionId()); + } + + @Override + public @NotNull EntryStack getLogo() { + return REIPlugin.ANVILS[0]; + } + + @Override + public @NotNull List setupDisplay(REIAnvilDisplay display, Rectangle bounds) { + Point startPoint = new Point(bounds.getCenterX() - 41, bounds.y + 10); + List widgets = Lists.newArrayList(); + widgets.add(Widgets.createRecipeBase(bounds)); + int x = startPoint.x + 10; + int y = startPoint.y; + widgets.add(Widgets.createResultSlotBackground(new Point(x + 61, y + 5))); + List> inputEntries = display.getInputEntries(); + List materials = inputEntries.get(1); + int anvilLevel = display.getAnvilLevel(); + List anvils = Arrays.stream(REIPlugin.ANVILS).filter(anvil -> { + Block block = ((BlockItem) anvil.getItem()).getBlock(); + if (block instanceof EndAnvilBlock) { + return ((EndAnvilBlock) block).getCraftingLevel() >= anvilLevel; + } + return anvilLevel == 1; + }).collect(Collectors.toList()); + materials.forEach(entryStack -> entryStack.setAmount(display.getInputCount())); + widgets.add(Widgets.createArrow(new Point(x + 24, y + 4))); + widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width - 7, bounds.y + bounds.height - 15), + new TranslatableComponent("category.rei.damage.amount&dmg", display.getDamage())).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); + widgets.add(Widgets.createSlot(new Point(x - 20, y + 4)).entries(materials).markInput()); + widgets.add(Widgets.createSlot(new Point(x + 1, y + 4)).entries(inputEntries.get(0)).markInput()); + widgets.add(Widgets.createSlot(new Point(x + 61, y + 5)).entries(display.getResultingEntries().get(0)).disableBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(x - 9, y + 25)).entries(anvils)); + + return widgets; + } + + @Override + public void renderRedSlots(PoseStack matrices, List widgets, Rectangle bounds, REIAnvilDisplay display, + IntList redSlots) { + Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 27); + matrices.pushPose(); + matrices.translate(0, 0, 400); + if (redSlots.contains(0)) { + GuiComponent.fill(matrices, startPoint.x - 20, startPoint.y + 3, startPoint.x - 20 + 16, startPoint.y + 3 + 16, 1090453504); + GuiComponent.fill(matrices, startPoint.x + 1, startPoint.y + 3, startPoint.x + 1 + 16, startPoint.y + 3 + 16, 1090453504); + } + matrices.popPose(); + } + + @Override + public @NotNull RecipeEntry getSimpleRenderer(REIAnvilDisplay recipe) { + return SimpleRecipeEntry.from(Collections.singletonList(recipe.getInputEntries().get(0)), recipe.getResultingEntries()); + } + + @Override + public int getDisplayHeight() { + return 60; + } + +} diff --git a/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java index 210d838f..5acb5b12 100644 --- a/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java @@ -1,80 +1,81 @@ -package ru.betterend.integration.rei; - -import java.util.List; - -import org.jetbrains.annotations.NotNull; - -import com.google.common.collect.Lists; -import com.mojang.blaze3d.vertex.PoseStack; -import it.unimi.dsi.fastutil.ints.IntList; -import me.shedaniel.math.Point; -import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.TransferRecipeCategory; -import me.shedaniel.rei.api.widgets.Widgets; -import me.shedaniel.rei.gui.entries.RecipeEntry; -import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; -import me.shedaniel.rei.gui.widget.Widget; -import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.resources.ResourceLocation; -import ru.betterend.BetterEnd; -import ru.betterend.recipe.builders.InfusionRecipe; -import ru.betterend.registry.EndBlocks; -import ru.betterend.util.LangUtil; - -public class REIInfusionCategory implements TransferRecipeCategory { - - private final static ResourceLocation BACKGROUND = BetterEnd.makeID("textures/gui/rei_infusion.png"); - - @Override - public @NotNull ResourceLocation getIdentifier() { - return InfusionRecipe.ID; - } - - @Override - public @NotNull String getCategoryName() { - return LangUtil.translate(EndBlocks.INFUSION_PEDESTAL.getDescriptionId()); - } - - @Override - public @NotNull EntryStack getLogo() { - return REIPlugin.INFUSION_RITUAL; - } - - @Override - public @NotNull RecipeEntry getSimpleRenderer(REIInfusionDisplay recipe) { - return SimpleRecipeEntry.from(recipe.getInputEntries(), recipe.getResultingEntries()); - } - - @Override - public @NotNull List setupDisplay(REIInfusionDisplay display, Rectangle bounds) { - Point centerPoint = new Point(bounds.getCenterX() - 34, bounds.getCenterY() - 2); - List widgets = Lists.newArrayList(); - widgets.add(Widgets.createRecipeBase(bounds)); - List> inputEntries = display.getInputEntries(); - List> outputEntries = display.getResultingEntries(); - widgets.add(Widgets.createTexturedWidget(BACKGROUND, bounds.x, bounds.y, 0, 0, 150, 104, 150, 104)); - widgets.add(Widgets.createSlot(centerPoint).entries(inputEntries.get(0)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x, centerPoint.y - 28)).entries(inputEntries.get(1)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x + 28, centerPoint.y)).entries(inputEntries.get(3)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x, centerPoint.y + 28)).entries(inputEntries.get(5)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x - 28, centerPoint.y)).entries(inputEntries.get(7)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x + 24, centerPoint.y - 24)).entries(inputEntries.get(2)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x + 24, centerPoint.y + 24)).entries(inputEntries.get(4)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x - 24, centerPoint.y + 24)).entries(inputEntries.get(6)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x - 24, centerPoint.y - 24)).entries(inputEntries.get(8)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x + 80, centerPoint.y)).entries(outputEntries.get(0)).disableBackground().markOutput()); - widgets.add(Widgets.createLabel(new Point(bounds.getMaxX() - 5, bounds.y + 6), new TranslatableComponent("category.rei.infusion.time&val", display.getInfusionTime())) - .noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); - return widgets; - } - - @Override - public void renderRedSlots(PoseStack matrices, List widgets, Rectangle bounds, - REIInfusionDisplay display, IntList redSlots) {} - - @Override - public int getDisplayHeight() { - return 104; - } -} +package ru.betterend.integration.rei; + +import java.util.List; + +import org.jetbrains.annotations.NotNull; + +import com.google.common.collect.Lists; +import com.mojang.blaze3d.vertex.PoseStack; + +import it.unimi.dsi.fastutil.ints.IntList; +import me.shedaniel.math.Point; +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.EntryStack; +import me.shedaniel.rei.api.TransferRecipeCategory; +import me.shedaniel.rei.api.widgets.Widgets; +import me.shedaniel.rei.gui.entries.RecipeEntry; +import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; +import me.shedaniel.rei.gui.widget.Widget; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import ru.betterend.BetterEnd; +import ru.betterend.recipe.builders.InfusionRecipe; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.LangUtil; + +public class REIInfusionCategory implements TransferRecipeCategory { + + private final static ResourceLocation BACKGROUND = BetterEnd.makeID("textures/gui/rei_infusion.png"); + + @Override + public @NotNull ResourceLocation getIdentifier() { + return InfusionRecipe.ID; + } + + @Override + public @NotNull String getCategoryName() { + return LangUtil.translate(EndBlocks.INFUSION_PEDESTAL.getDescriptionId()); + } + + @Override + public @NotNull EntryStack getLogo() { + return REIPlugin.INFUSION_RITUAL; + } + + @Override + public @NotNull RecipeEntry getSimpleRenderer(REIInfusionDisplay recipe) { + return SimpleRecipeEntry.from(recipe.getInputEntries(), recipe.getResultingEntries()); + } + + @Override + public @NotNull List setupDisplay(REIInfusionDisplay display, Rectangle bounds) { + Point centerPoint = new Point(bounds.getCenterX() - 34, bounds.getCenterY() - 2); + List widgets = Lists.newArrayList(); + widgets.add(Widgets.createRecipeBase(bounds)); + List> inputEntries = display.getInputEntries(); + List> outputEntries = display.getResultingEntries(); + widgets.add(Widgets.createTexturedWidget(BACKGROUND, bounds.x, bounds.y, 0, 0, 150, 104, 150, 104)); + widgets.add(Widgets.createSlot(centerPoint).entries(inputEntries.get(0)).disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x, centerPoint.y - 28)).entries(inputEntries.get(1)).disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x + 28, centerPoint.y)).entries(inputEntries.get(3)).disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x, centerPoint.y + 28)).entries(inputEntries.get(5)).disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x - 28, centerPoint.y)).entries(inputEntries.get(7)).disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x + 24, centerPoint.y - 24)).entries(inputEntries.get(2)).disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x + 24, centerPoint.y + 24)).entries(inputEntries.get(4)).disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x - 24, centerPoint.y + 24)).entries(inputEntries.get(6)).disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x - 24, centerPoint.y - 24)).entries(inputEntries.get(8)).disableBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x + 80, centerPoint.y)).entries(outputEntries.get(0)).disableBackground().markOutput()); + widgets.add(Widgets.createLabel(new Point(bounds.getMaxX() - 5, bounds.y + 6), new TranslatableComponent("category.rei.infusion.time&val", display.getInfusionTime())) + .noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); + return widgets; + } + + @Override + public void renderRedSlots(PoseStack matrices, List widgets, Rectangle bounds, + REIInfusionDisplay display, IntList redSlots) {} + + @Override + public int getDisplayHeight() { + return 104; + } +} diff --git a/src/main/java/ru/betterend/interfaces/IBiomeList.java b/src/main/java/ru/betterend/interfaces/IBiomeList.java index e7546aa6..4dbbfde4 100644 --- a/src/main/java/ru/betterend/interfaces/IBiomeList.java +++ b/src/main/java/ru/betterend/interfaces/IBiomeList.java @@ -1,6 +1,7 @@ package ru.betterend.interfaces; import java.util.List; + import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.biome.Biome; diff --git a/src/main/java/ru/betterend/item/EndArmorItem.java b/src/main/java/ru/betterend/item/EndArmorItem.java index cc4faf42..61ed97d1 100644 --- a/src/main/java/ru/betterend/item/EndArmorItem.java +++ b/src/main/java/ru/betterend/item/EndArmorItem.java @@ -1,6 +1,10 @@ package ru.betterend.item; import java.util.UUID; + +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Multimap; + import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.AttributeModifier; @@ -8,8 +12,6 @@ import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ArmorMaterial; import net.minecraft.world.item.Item; -import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.Multimap; import ru.betterend.mixin.common.ArmorItemAccessor; import ru.betterend.patterns.Patterned; import ru.betterend.patterns.Patterns; diff --git a/src/main/java/ru/betterend/item/EndBucketItem.java b/src/main/java/ru/betterend/item/EndBucketItem.java new file mode 100644 index 00000000..5b84e7a4 --- /dev/null +++ b/src/main/java/ru/betterend/item/EndBucketItem.java @@ -0,0 +1,18 @@ +package ru.betterend.item; + +import net.minecraft.world.item.BucketItem; +import net.minecraft.world.level.material.Fluids; +import ru.betterend.patterns.Patterned; +import ru.betterend.patterns.Patterns; +import ru.betterend.registry.EndItems; + +public class EndBucketItem extends BucketItem implements Patterned { + public EndBucketItem() { + super(Fluids.WATER, EndItems.makeItemSettings().stacksTo(1)); + } + + @Override + public String getModelPattern(String name) { + return Patterns.createJson(Patterns.ITEM_GENERATED, name); + } +} diff --git a/src/main/java/ru/betterend/item/GuideBookItem.java b/src/main/java/ru/betterend/item/GuideBookItem.java index e60d441c..915ae3b3 100644 --- a/src/main/java/ru/betterend/item/GuideBookItem.java +++ b/src/main/java/ru/betterend/item/GuideBookItem.java @@ -1,43 +1,44 @@ -package ru.betterend.item; - -import java.util.List; -import net.minecraft.ChatFormatting; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResultHolder; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.level.Level; -import ru.betterend.BetterEnd; -import ru.betterend.registry.EndItems; -import ru.betterend.util.LangUtil; -import vazkii.patchouli.api.PatchouliAPI; - -public class GuideBookItem extends PatternedItem { - public final static ResourceLocation BOOK_ID = BetterEnd.makeID("guidebook"); - public static final Item GUIDE_BOOK = EndItems.registerItem(BOOK_ID, new GuideBookItem()); - - public static void register() {} - - public GuideBookItem() { - super(EndItems.makeItemSettings().stacksTo(1)); - } - - @Override - public InteractionResultHolder use(Level world, Player user, InteractionHand hand) { - if (!world.isClientSide && user instanceof ServerPlayer) { - PatchouliAPI.get().openBookGUI((ServerPlayer) user, BOOK_ID); - return InteractionResultHolder.success(user.getItemInHand(hand)); - } - return InteractionResultHolder.consume(user.getItemInHand(hand)); - } - - @Override - public void appendHoverText(ItemStack stack, Level world, List tooltip, TooltipFlag context) { - tooltip.add(LangUtil.getText("book.betterend", "subtitle").withStyle(ChatFormatting.DARK_PURPLE, ChatFormatting.ITALIC)); - } -} +package ru.betterend.item; + +import java.util.List; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import ru.betterend.BetterEnd; +import ru.betterend.registry.EndItems; +import ru.betterend.util.LangUtil; +import vazkii.patchouli.api.PatchouliAPI; + +public class GuideBookItem extends PatternedItem { + public final static ResourceLocation BOOK_ID = BetterEnd.makeID("guidebook"); + public static final Item GUIDE_BOOK = EndItems.registerItem(BOOK_ID, new GuideBookItem()); + + public static void register() {} + + public GuideBookItem() { + super(EndItems.makeItemSettings().stacksTo(1)); + } + + @Override + public InteractionResultHolder use(Level world, Player user, InteractionHand hand) { + if (!world.isClientSide && user instanceof ServerPlayer) { + PatchouliAPI.get().openBookGUI((ServerPlayer) user, BOOK_ID); + return InteractionResultHolder.success(user.getItemInHand(hand)); + } + return InteractionResultHolder.consume(user.getItemInHand(hand)); + } + + @Override + public void appendHoverText(ItemStack stack, Level world, List tooltip, TooltipFlag context) { + tooltip.add(LangUtil.getText("book.betterend", "subtitle").withStyle(ChatFormatting.DARK_PURPLE, ChatFormatting.ITALIC)); + } +} diff --git a/src/main/java/ru/betterend/item/material/EndToolMaterial.java b/src/main/java/ru/betterend/item/material/EndToolMaterial.java index b132224c..9c0197ae 100644 --- a/src/main/java/ru/betterend/item/material/EndToolMaterial.java +++ b/src/main/java/ru/betterend/item/material/EndToolMaterial.java @@ -1,6 +1,7 @@ package ru.betterend.item.material; import java.util.function.Supplier; + import net.minecraft.util.LazyLoadedValue; import net.minecraft.world.item.Tier; import net.minecraft.world.item.crafting.Ingredient; diff --git a/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java b/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java index 82ef8a4b..d1a37fde 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java @@ -1,41 +1,43 @@ -package ru.betterend.item.model; - -import java.util.Collections; -import net.minecraft.client.model.HumanoidModel; -import net.minecraft.client.model.geom.ModelPart; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.world.entity.LivingEntity; -import com.google.common.collect.Lists; - -public class CrystaliteBootsModel extends HumanoidModel { - - public ModelPart leftBoot; - public ModelPart rightBoot; - - public CrystaliteBootsModel(float scale) { - super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); - this.leftBoot = new ModelPart(this, 0, 32); - this.leftBoot.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.25F); - this.leftBoot.setPos(1.9F, 12.0F, 0.0F); - this.rightBoot = new ModelPart(this, 0, 16); - this.rightBoot.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.25F); - this.rightBoot.setPos(-1.9F, 12.0F, 0.0F); - } - - @Override - public void copyPropertiesTo(HumanoidModel bipedEntityModel) { - super.copyPropertiesTo(bipedEntityModel); - this.leftBoot.copyFrom(leftLeg); - this.rightBoot.copyFrom(rightLeg); - } - - @Override - protected Iterable headParts() { - return Collections::emptyIterator; - } - - @Override - protected Iterable bodyParts() { - return Lists.newArrayList(leftBoot, rightBoot); - } -} +package ru.betterend.item.model; + +import java.util.Collections; + +import com.google.common.collect.Lists; + +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.world.entity.LivingEntity; + +public class CrystaliteBootsModel extends HumanoidModel { + + public ModelPart leftBoot; + public ModelPart rightBoot; + + public CrystaliteBootsModel(float scale) { + super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); + this.leftBoot = new ModelPart(this, 0, 32); + this.leftBoot.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.25F); + this.leftBoot.setPos(1.9F, 12.0F, 0.0F); + this.rightBoot = new ModelPart(this, 0, 16); + this.rightBoot.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.25F); + this.rightBoot.setPos(-1.9F, 12.0F, 0.0F); + } + + @Override + public void copyPropertiesTo(HumanoidModel bipedEntityModel) { + super.copyPropertiesTo(bipedEntityModel); + this.leftBoot.copyFrom(leftLeg); + this.rightBoot.copyFrom(rightLeg); + } + + @Override + protected Iterable headParts() { + return Collections::emptyIterator; + } + + @Override + protected Iterable bodyParts() { + return Lists.newArrayList(leftBoot, rightBoot); + } +} diff --git a/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java b/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java index f33a27ef..d0dd72f0 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java @@ -1,72 +1,74 @@ -package ru.betterend.item.model; - -import java.util.Collections; -import net.minecraft.client.model.HumanoidModel; -import net.minecraft.client.model.geom.ModelPart; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.world.entity.HumanoidArm; -import net.minecraft.world.entity.LivingEntity; -import com.google.common.collect.Lists; -import com.mojang.blaze3d.vertex.PoseStack; - -public class CrystaliteChestplateModel extends HumanoidModel { - - public ModelPart leftShoulder; - public ModelPart rightShoulder; - private boolean thinArms; - - public CrystaliteChestplateModel(float scale, boolean thinArms) { - super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); - this.thinArms = thinArms; - this.body = new ModelPart(this, 16, 16); - this.body.addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale + 0.25F); - this.body.setPos(0.0F, 0.0F, 0.0F); - if (thinArms) { - this.leftShoulder = new ModelPart(this, 41, 32); - this.leftShoulder.addBox(-1.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F); - this.leftShoulder.setPos(5.0F, 2.5F, 0.0F); - this.leftShoulder.mirror = true; - this.rightShoulder = new ModelPart(this, 41, 16); - this.rightShoulder.addBox(-2.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F); - this.rightShoulder.setPos(-5.0F, 2.5F, 10.0F); - } else { - this.leftShoulder = new ModelPart(this, 40, 32); - this.leftShoulder.addBox(-1.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F); - this.leftShoulder.setPos(5.0F, 2.0F, 0.0F); - this.leftShoulder.mirror = true; - this.rightShoulder = new ModelPart(this, 40, 16); - this.rightShoulder.addBox(-3.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F); - this.rightShoulder.setPos(-5.0F, 2.0F, 10.0F); - } - } - - @Override - public void copyPropertiesTo(HumanoidModel bipedEntityModel) { - super.copyPropertiesTo(bipedEntityModel); - this.leftShoulder.copyFrom(leftArm); - this.rightShoulder.copyFrom(rightArm); - } - - @Override - protected Iterable headParts() { - return Collections::emptyIterator; - } - - @Override - protected Iterable bodyParts() { - return Lists.newArrayList(body, leftShoulder, rightShoulder); - } - - @Override - public void translateToHand(HumanoidArm arm, PoseStack matrices) { - ModelPart modelPart = this.getArm(arm); - if (this.thinArms) { - float f = 0.5F * (float)(arm == HumanoidArm.RIGHT ? 1 : -1); - modelPart.x += f; - modelPart.translateAndRotate(matrices); - modelPart.x -= f; - } else { - modelPart.translateAndRotate(matrices); - } - } -} +package ru.betterend.item.model; + +import java.util.Collections; + +import com.google.common.collect.Lists; +import com.mojang.blaze3d.vertex.PoseStack; + +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.world.entity.HumanoidArm; +import net.minecraft.world.entity.LivingEntity; + +public class CrystaliteChestplateModel extends HumanoidModel { + + public ModelPart leftShoulder; + public ModelPart rightShoulder; + private boolean thinArms; + + public CrystaliteChestplateModel(float scale, boolean thinArms) { + super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); + this.thinArms = thinArms; + this.body = new ModelPart(this, 16, 16); + this.body.addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale + 0.25F); + this.body.setPos(0.0F, 0.0F, 0.0F); + if (thinArms) { + this.leftShoulder = new ModelPart(this, 41, 32); + this.leftShoulder.addBox(-1.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F); + this.leftShoulder.setPos(5.0F, 2.5F, 0.0F); + this.leftShoulder.mirror = true; + this.rightShoulder = new ModelPart(this, 41, 16); + this.rightShoulder.addBox(-2.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F); + this.rightShoulder.setPos(-5.0F, 2.5F, 10.0F); + } else { + this.leftShoulder = new ModelPart(this, 40, 32); + this.leftShoulder.addBox(-1.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F); + this.leftShoulder.setPos(5.0F, 2.0F, 0.0F); + this.leftShoulder.mirror = true; + this.rightShoulder = new ModelPart(this, 40, 16); + this.rightShoulder.addBox(-3.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F); + this.rightShoulder.setPos(-5.0F, 2.0F, 10.0F); + } + } + + @Override + public void copyPropertiesTo(HumanoidModel bipedEntityModel) { + super.copyPropertiesTo(bipedEntityModel); + this.leftShoulder.copyFrom(leftArm); + this.rightShoulder.copyFrom(rightArm); + } + + @Override + protected Iterable headParts() { + return Collections::emptyIterator; + } + + @Override + protected Iterable bodyParts() { + return Lists.newArrayList(body, leftShoulder, rightShoulder); + } + + @Override + public void translateToHand(HumanoidArm arm, PoseStack matrices) { + ModelPart modelPart = this.getArm(arm); + if (this.thinArms) { + float f = 0.5F * (float)(arm == HumanoidArm.RIGHT ? 1 : -1); + modelPart.x += f; + modelPart.translateAndRotate(matrices); + modelPart.x -= f; + } else { + modelPart.translateAndRotate(matrices); + } + } +} diff --git a/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java b/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java index acbbd1bb..54772ebd 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java @@ -1,34 +1,36 @@ -package ru.betterend.item.model; - -import java.util.Collections; -import net.minecraft.client.model.HumanoidModel; -import net.minecraft.client.model.geom.ModelPart; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.world.entity.LivingEntity; -import com.google.common.collect.Lists; - -public class CrystaliteLeggingsModel extends HumanoidModel { - - public CrystaliteLeggingsModel(float scale) { - super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); - this.body = new ModelPart(this, 16, 16); - this.body.addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale); - this.body.setPos(0.0F, 0.0F, 0.0F); - this.leftLeg = new ModelPart(this, 0, 32); - this.leftLeg.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale); - this.leftLeg.setPos(1.9F, 12.0F, 0.0F); - this.rightLeg = new ModelPart(this, 0, 16); - this.rightLeg.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale); - this.rightLeg.setPos(-1.9F, 12.0F, 0.0F); - } - - @Override - protected Iterable headParts() { - return Collections::emptyIterator; - } - - @Override - protected Iterable bodyParts() { - return Lists.newArrayList(body, rightLeg, leftLeg); - } -} +package ru.betterend.item.model; + +import java.util.Collections; + +import com.google.common.collect.Lists; + +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.world.entity.LivingEntity; + +public class CrystaliteLeggingsModel extends HumanoidModel { + + public CrystaliteLeggingsModel(float scale) { + super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); + this.body = new ModelPart(this, 16, 16); + this.body.addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale); + this.body.setPos(0.0F, 0.0F, 0.0F); + this.leftLeg = new ModelPart(this, 0, 32); + this.leftLeg.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale); + this.leftLeg.setPos(1.9F, 12.0F, 0.0F); + this.rightLeg = new ModelPart(this, 0, 16); + this.rightLeg.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale); + this.rightLeg.setPos(-1.9F, 12.0F, 0.0F); + } + + @Override + protected Iterable headParts() { + return Collections::emptyIterator; + } + + @Override + protected Iterable bodyParts() { + return Lists.newArrayList(body, rightLeg, leftLeg); + } +} diff --git a/src/main/java/ru/betterend/mixin/client/AbstractSoundInstanceAccessor.java b/src/main/java/ru/betterend/mixin/client/AbstractSoundInstanceAccessor.java index 9c94ed93..296a013e 100644 --- a/src/main/java/ru/betterend/mixin/client/AbstractSoundInstanceAccessor.java +++ b/src/main/java/ru/betterend/mixin/client/AbstractSoundInstanceAccessor.java @@ -1,9 +1,10 @@ package ru.betterend.mixin.client; -import net.minecraft.client.resources.sounds.AbstractSoundInstance; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; +import net.minecraft.client.resources.sounds.AbstractSoundInstance; + @Mixin(AbstractSoundInstance.class) public interface AbstractSoundInstanceAccessor { @Accessor("volume") diff --git a/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java index 41cc84be..2efb8696 100644 --- a/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java +++ b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java @@ -1,6 +1,16 @@ package ru.betterend.mixin.client; import java.util.List; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.google.common.collect.Lists; +import com.mojang.blaze3d.vertex.PoseStack; + import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.EditBox; @@ -13,14 +23,6 @@ import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.AnvilMenu; import net.minecraft.world.item.ItemStack; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import com.google.common.collect.Lists; -import com.mojang.blaze3d.vertex.PoseStack; import ru.betterend.interfaces.AnvilScreenHandlerExtended; @Mixin(AnvilScreen.class) diff --git a/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java b/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java index 2d6697dc..4e0db101 100644 --- a/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/BackgroundRendererMixin.java @@ -8,6 +8,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; + import net.minecraft.Util; import net.minecraft.client.Camera; import net.minecraft.client.multiplayer.ClientLevel; diff --git a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java index fd669eee..39163b8b 100644 --- a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java @@ -1,16 +1,17 @@ package ru.betterend.mixin.client; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.network.protocol.PacketUtils; import net.minecraft.network.protocol.game.ClientboundOpenSignEditorPacket; import net.minecraft.world.level.block.entity.BlockEntity; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.betterend.blocks.entities.ESignBlockEntity; import ru.betterend.client.gui.BlockSignEditScreen; diff --git a/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java b/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java index ff72ef08..4fd3d635 100644 --- a/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java @@ -1,14 +1,14 @@ package ru.betterend.mixin.client; -import net.minecraft.client.ClientRecipeBook; -import net.minecraft.client.RecipeBookCategories; -import net.minecraft.world.item.crafting.Recipe; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.client.ClientRecipeBook; +import net.minecraft.client.RecipeBookCategories; +import net.minecraft.world.item.crafting.Recipe; import ru.betterend.interfaces.BetterEndRecipe; -import ru.betterend.recipe.builders.AlloyingRecipe; @Mixin(ClientRecipeBook.class) public abstract class ClientRecipeBookMixin { diff --git a/src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java b/src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java index 3c208101..484b3a65 100644 --- a/src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java +++ b/src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java @@ -4,6 +4,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; import com.google.gson.Gson; + import net.minecraft.client.renderer.block.model.BlockModelDefinition; @Mixin(BlockModelDefinition.Context.class) diff --git a/src/main/java/ru/betterend/mixin/client/EnchantingTableBlockMixin.java b/src/main/java/ru/betterend/mixin/client/EnchantingTableBlockMixin.java index 4ff34f60..384dc491 100644 --- a/src/main/java/ru/betterend/mixin/client/EnchantingTableBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/client/EnchantingTableBlockMixin.java @@ -1,16 +1,18 @@ package ru.betterend.mixin.client; import java.util.Random; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.EnchantmentTableBlock; import net.minecraft.world.level.block.state.BlockState; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.betterend.registry.EndTags; @Mixin(EnchantmentTableBlock.class) diff --git a/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java b/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java index 32d4938c..00f48281 100644 --- a/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java +++ b/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java @@ -7,6 +7,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + import net.minecraft.client.Minecraft; import net.minecraft.client.color.block.BlockColors; import net.minecraft.client.color.item.ItemColors; diff --git a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java index 0af76236..07c57f8f 100644 --- a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java @@ -4,6 +4,15 @@ import java.io.InputStreamReader; import java.io.Reader; import java.nio.charset.StandardCharsets; import java.util.Optional; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.resources.model.ModelBakery; import net.minecraft.core.Registry; @@ -12,13 +21,6 @@ import net.minecraft.server.packs.resources.Resource; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyVariable; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.betterend.BetterEnd; import ru.betterend.patterns.Patterned; import ru.betterend.world.generator.GeneratorOptions; diff --git a/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java b/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java index 924546b8..d657e0aa 100644 --- a/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ModelVariantMapMixin.java @@ -2,15 +2,17 @@ package ru.betterend.mixin.client; import java.io.Reader; import java.io.StringReader; -import net.minecraft.client.renderer.block.model.BlockModelDefinition; -import net.minecraft.util.GsonHelper; -import net.minecraft.world.level.block.Block; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.google.gson.Gson; + +import net.minecraft.client.renderer.block.model.BlockModelDefinition; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.level.block.Block; import ru.betterend.patterns.BlockPatterned; @Mixin(BlockModelDefinition.class) diff --git a/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java b/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java index 6e9072b1..7af64b12 100644 --- a/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java @@ -1,6 +1,14 @@ package ru.betterend.mixin.client; import java.util.Random; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + import net.minecraft.client.Minecraft; import net.minecraft.client.resources.sounds.AbstractSoundInstance; import net.minecraft.client.resources.sounds.SoundInstance; @@ -8,12 +16,6 @@ import net.minecraft.client.sounds.MusicManager; import net.minecraft.sounds.Music; import net.minecraft.util.Mth; import net.minecraft.world.level.Level; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.betterend.client.ClientOptions; @Mixin(MusicManager.class) diff --git a/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java b/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java index 824161eb..ca9e8460 100644 --- a/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/NamespaceResourceManagerMixin.java @@ -1,11 +1,7 @@ package ru.betterend.mixin.client; import java.util.List; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.resources.FallbackResourceManager; -import net.minecraft.server.packs.resources.Resource; -import net.minecraft.world.level.block.Block; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -14,6 +10,12 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.google.common.collect.Lists; + +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.FallbackResourceManager; +import net.minecraft.server.packs.resources.Resource; +import net.minecraft.world.level.block.Block; import ru.betterend.BetterEnd; import ru.betterend.patterns.BlockPatterned; diff --git a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java index 2830919a..9f06187d 100644 --- a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java @@ -19,6 +19,7 @@ import com.mojang.blaze3d.vertex.VertexBuffer; import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.math.Quaternion; import com.mojang.math.Vector3f; + import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; diff --git a/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java index b58e098b..fa27a791 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilBlockMixin.java @@ -1,12 +1,13 @@ package ru.betterend.mixin.common; -import net.minecraft.world.level.block.AnvilBlock; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.properties.IntegerProperty; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.world.level.block.AnvilBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.IntegerProperty; import ru.betterend.blocks.basis.EndAnvilBlock; @Mixin(AnvilBlock.class) diff --git a/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java index f23b4e0f..cdd7f400 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java @@ -3,6 +3,14 @@ package ru.betterend.mixin.common; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + import net.minecraft.tags.BlockTags; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; @@ -16,12 +24,6 @@ import net.minecraft.world.item.crafting.RecipeManager; import net.minecraft.world.level.block.AnvilBlock; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.betterend.blocks.basis.EndAnvilBlock; import ru.betterend.interfaces.AnvilScreenHandlerExtended; import ru.betterend.recipe.builders.AnvilRecipe; diff --git a/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java b/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java index 33f8224a..efd97bf5 100644 --- a/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/ArmorItemAccessor.java @@ -1,14 +1,16 @@ package ru.betterend.mixin.common; import java.util.UUID; -import net.minecraft.world.entity.ai.attributes.Attribute; -import net.minecraft.world.entity.ai.attributes.AttributeModifier; -import net.minecraft.world.item.ArmorItem; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; import com.google.common.collect.Multimap; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.item.ArmorItem; + @Mixin(ArmorItem.class) public interface ArmorItemAccessor { @Accessor("ARMOR_MODIFIER_UUID_PER_SLOT") diff --git a/src/main/java/ru/betterend/mixin/common/BiomeGenerationSettingsAccessor.java b/src/main/java/ru/betterend/mixin/common/BiomeGenerationSettingsAccessor.java index 47bc7b98..eb1f962b 100644 --- a/src/main/java/ru/betterend/mixin/common/BiomeGenerationSettingsAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/BiomeGenerationSettingsAccessor.java @@ -2,11 +2,13 @@ package ru.betterend.mixin.common; import java.util.List; import java.util.function.Supplier; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + import net.minecraft.world.level.biome.BiomeGenerationSettings; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(BiomeGenerationSettings.class) public interface BiomeGenerationSettingsAccessor { diff --git a/src/main/java/ru/betterend/mixin/common/BlockBehaviourMixin.java b/src/main/java/ru/betterend/mixin/common/BlockBehaviourMixin.java index a0953f41..ed4ae4d8 100644 --- a/src/main/java/ru/betterend/mixin/common/BlockBehaviourMixin.java +++ b/src/main/java/ru/betterend/mixin/common/BlockBehaviourMixin.java @@ -1,6 +1,14 @@ package ru.betterend.mixin.common; import java.util.List; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.google.common.collect.Lists; + import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; @@ -11,12 +19,6 @@ import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import com.google.common.collect.Lists; import ru.betterend.item.tool.EndHammerItem; import ru.betterend.util.MHelper; diff --git a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java index 29bd14f5..b352bc3f 100644 --- a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java +++ b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java @@ -1,6 +1,12 @@ package ru.betterend.mixin.common; import java.util.Random; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -12,10 +18,6 @@ import net.minecraft.world.level.biome.Biome.BiomeCategory; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; diff --git a/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java index ba5f2062..cfb4f4b3 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java @@ -1,6 +1,16 @@ package ru.betterend.mixin.common; import java.util.Random; + +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -16,14 +26,6 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; diff --git a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java index 55539d66..c6f1bdcd 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java @@ -1,5 +1,11 @@ package ru.betterend.mixin.common; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.context.BlockPlaceContext; @@ -14,11 +20,6 @@ import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; diff --git a/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java index de29482a..bcc4191f 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java @@ -1,6 +1,12 @@ package ru.betterend.mixin.common; import java.util.Random; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; @@ -10,10 +16,6 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.ChorusPlantFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; diff --git a/src/main/java/ru/betterend/mixin/common/ChunkBiomeContainerMixin.java b/src/main/java/ru/betterend/mixin/common/ChunkBiomeContainerMixin.java index 5f559269..9733e648 100644 --- a/src/main/java/ru/betterend/mixin/common/ChunkBiomeContainerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChunkBiomeContainerMixin.java @@ -1,12 +1,13 @@ package ru.betterend.mixin.common; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.chunk.ChunkBiomeContainer; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import ru.betterend.interfaces.IBiomeArray; @Mixin(ChunkBiomeContainer.class) diff --git a/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java b/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java index c0bc899e..1d754b20 100644 --- a/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java @@ -1,9 +1,10 @@ package ru.betterend.mixin.common; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.ComposterBlock; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; @Mixin(ComposterBlock.class) public interface ComposterBlockAccessor { diff --git a/src/main/java/ru/betterend/mixin/common/CraftingMenuMixin.java b/src/main/java/ru/betterend/mixin/common/CraftingMenuMixin.java index 48e81bf2..11c7f94e 100644 --- a/src/main/java/ru/betterend/mixin/common/CraftingMenuMixin.java +++ b/src/main/java/ru/betterend/mixin/common/CraftingMenuMixin.java @@ -1,9 +1,5 @@ package ru.betterend.mixin.common; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.ContainerLevelAccess; -import net.minecraft.world.inventory.CraftingMenu; -import net.minecraft.world.level.block.CraftingTableBlock; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -11,6 +7,11 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.ContainerLevelAccess; +import net.minecraft.world.inventory.CraftingMenu; +import net.minecraft.world.level.block.CraftingTableBlock; + @Mixin(CraftingMenu.class) public abstract class CraftingMenuMixin { @Final diff --git a/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java b/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java index 982e906c..5e0ac980 100644 --- a/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java +++ b/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java @@ -1,15 +1,16 @@ package ru.betterend.mixin.common; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + import net.minecraft.core.Registry; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.betterend.world.generator.BetterEndBiomeSource; import ru.betterend.world.generator.GeneratorOptions; diff --git a/src/main/java/ru/betterend/mixin/common/EnchantmentMenuMixin.java b/src/main/java/ru/betterend/mixin/common/EnchantmentMenuMixin.java index e47fa771..311b79fe 100644 --- a/src/main/java/ru/betterend/mixin/common/EnchantmentMenuMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EnchantmentMenuMixin.java @@ -2,6 +2,14 @@ package ru.betterend.mixin.common; import java.util.List; import java.util.Random; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + import net.minecraft.core.Registry; import net.minecraft.world.Container; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -12,12 +20,6 @@ import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.EnchantmentInstance; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.betterend.registry.EndTags; @Mixin(EnchantmentMenu.class) diff --git a/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java index d4b691f1..e91f8949 100644 --- a/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java @@ -1,5 +1,11 @@ package ru.betterend.mixin.common; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.BiomeSource; @@ -7,11 +13,6 @@ import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.WorldgenRandom; import net.minecraft.world.level.levelgen.feature.EndCityFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.betterend.world.generator.GeneratorOptions; @Mixin(EndCityFeature.class) diff --git a/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java index a9c095b2..e96ded09 100644 --- a/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java @@ -1,6 +1,15 @@ package ru.betterend.mixin.common; import java.util.Random; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + import net.minecraft.core.BlockPos; import net.minecraft.nbt.NbtUtils; import net.minecraft.world.level.WorldGenLevel; @@ -10,13 +19,6 @@ import net.minecraft.world.level.levelgen.feature.EndPodiumFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyVariable; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.betterend.BetterEnd; import ru.betterend.util.StructureHelper; import ru.betterend.util.WorldDataUtil; diff --git a/src/main/java/ru/betterend/mixin/common/EnderManMixin.java b/src/main/java/ru/betterend/mixin/common/EnderManMixin.java index dc5f1424..4102fef9 100644 --- a/src/main/java/ru/betterend/mixin/common/EnderManMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EnderManMixin.java @@ -1,13 +1,14 @@ package ru.betterend.mixin.common; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.monster.EnderMan; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.enchantment.EnchantmentHelper; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.betterend.effects.EndEnchantments; import ru.betterend.effects.EndStatusEffects; diff --git a/src/main/java/ru/betterend/mixin/common/EntityMixin.java b/src/main/java/ru/betterend/mixin/common/EntityMixin.java index 914cd05b..4f9372b8 100644 --- a/src/main/java/ru/betterend/mixin/common/EntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EntityMixin.java @@ -1,5 +1,12 @@ package ru.betterend.mixin.common; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; @@ -7,12 +14,6 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.Level; import net.minecraft.world.level.portal.PortalInfo; import net.minecraft.world.phys.Vec3; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.betterend.interfaces.TeleportingEntity; @Mixin(Entity.class) diff --git a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java index 138e9c29..71777ea6 100644 --- a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java @@ -1,6 +1,13 @@ package ru.betterend.mixin.common; import java.util.Collection; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; @@ -8,11 +15,6 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.item.Item; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyArg; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(LivingEntity.class) public abstract class LivingEntityMixin { diff --git a/src/main/java/ru/betterend/mixin/common/MonsterMixin.java b/src/main/java/ru/betterend/mixin/common/MonsterMixin.java index d3f85e17..b2d77c7c 100644 --- a/src/main/java/ru/betterend/mixin/common/MonsterMixin.java +++ b/src/main/java/ru/betterend/mixin/common/MonsterMixin.java @@ -2,6 +2,12 @@ package ru.betterend.mixin.common; import java.util.List; import java.util.Random; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + import net.minecraft.core.BlockPos; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobSpawnType; @@ -9,10 +15,6 @@ import net.minecraft.world.entity.monster.EnderMan; import net.minecraft.world.entity.monster.Monster; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.phys.AABB; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(Monster.class) public class MonsterMixin { diff --git a/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java b/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java index 7fcd2978..8d59913e 100644 --- a/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java +++ b/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java @@ -1,17 +1,19 @@ package ru.betterend.mixin.common; import java.util.function.Supplier; -import net.minecraft.world.level.biome.BiomeSource; -import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; -import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; -import net.minecraft.world.level.levelgen.StructureSettings; + import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; +import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; +import net.minecraft.world.level.levelgen.StructureSettings; import ru.betterend.world.generator.GeneratorOptions; import ru.betterend.world.generator.TerrainGenerator; diff --git a/src/main/java/ru/betterend/mixin/common/PlayerAdvancementsMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerAdvancementsMixin.java index a1bbcb95..08f2d54d 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerAdvancementsMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerAdvancementsMixin.java @@ -1,14 +1,15 @@ package ru.betterend.mixin.common; -import net.minecraft.advancements.Advancement; -import net.minecraft.server.PlayerAdvancements; -import net.minecraft.server.level.ServerPlayer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At.Shift; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.advancements.Advancement; +import net.minecraft.server.PlayerAdvancements; +import net.minecraft.server.level.ServerPlayer; import ru.betterend.events.PlayerAdvancementsEvents; @Mixin(PlayerAdvancements.class) diff --git a/src/main/java/ru/betterend/mixin/common/PlayerMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerMixin.java index 46a1c6dc..7b177e3a 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerMixin.java @@ -1,16 +1,18 @@ package ru.betterend.mixin.common; import java.util.Optional; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.registry.EndBlocks; diff --git a/src/main/java/ru/betterend/mixin/common/PotionBrewingAccessor.java b/src/main/java/ru/betterend/mixin/common/PotionBrewingAccessor.java index d863d6cb..49366687 100644 --- a/src/main/java/ru/betterend/mixin/common/PotionBrewingAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/PotionBrewingAccessor.java @@ -1,10 +1,11 @@ package ru.betterend.mixin.common; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + import net.minecraft.world.item.Item; import net.minecraft.world.item.alchemy.Potion; import net.minecraft.world.item.alchemy.PotionBrewing; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; @Mixin(PotionBrewing.class) public interface PotionBrewingAccessor { diff --git a/src/main/java/ru/betterend/mixin/common/RecipeManagerAccessor.java b/src/main/java/ru/betterend/mixin/common/RecipeManagerAccessor.java index 1f3e2fb8..0035a588 100644 --- a/src/main/java/ru/betterend/mixin/common/RecipeManagerAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/RecipeManagerAccessor.java @@ -1,12 +1,14 @@ package ru.betterend.mixin.common; import java.util.Map; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeManager; import net.minecraft.world.item.crafting.RecipeType; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(RecipeManager.class) public interface RecipeManagerAccessor { diff --git a/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java b/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java index fa5c1250..02e33c4b 100644 --- a/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java @@ -5,6 +5,16 @@ import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Optional; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.google.gson.JsonElement; + import net.minecraft.Util; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.resources.ResourceManager; @@ -14,14 +24,6 @@ import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeManager; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.Level; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import com.google.gson.JsonElement; import ru.betterend.recipe.EndRecipeManager; @Mixin(RecipeManager.class) diff --git a/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java b/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java index 044ca48f..a4d0ce6a 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java @@ -9,6 +9,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.mojang.authlib.GameProfile; + import net.minecraft.core.BlockPos; import net.minecraft.network.protocol.game.ClientboundChangeDifficultyPacket; import net.minecraft.network.protocol.game.ClientboundLevelEventPacket; diff --git a/src/main/java/ru/betterend/mixin/common/SlimeMixin.java b/src/main/java/ru/betterend/mixin/common/SlimeMixin.java index 8dec140b..5d5ba94f 100644 --- a/src/main/java/ru/betterend/mixin/common/SlimeMixin.java +++ b/src/main/java/ru/betterend/mixin/common/SlimeMixin.java @@ -1,8 +1,9 @@ package ru.betterend.mixin.common; -import net.minecraft.world.entity.monster.Slime; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.world.entity.monster.Slime; import ru.betterend.interfaces.ISlime; @Mixin(Slime.class) diff --git a/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java index 4968ed91..699b1250 100644 --- a/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java @@ -7,6 +7,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java b/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java index 0237ad8f..bdc9f568 100644 --- a/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java @@ -4,16 +4,18 @@ import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; -import com.google.common.collect.Maps; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.resources.ResourceManager; -import net.minecraft.tags.Tag; -import net.minecraft.tags.TagLoader; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.google.common.collect.Maps; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.tags.Tag; +import net.minecraft.tags.TagLoader; import ru.betterend.util.TagHelper; @Mixin(TagLoader.class) diff --git a/src/main/java/ru/betterend/noise/VoronoiNoise.java b/src/main/java/ru/betterend/noise/VoronoiNoise.java index 20356055..b1a9a619 100644 --- a/src/main/java/ru/betterend/noise/VoronoiNoise.java +++ b/src/main/java/ru/betterend/noise/VoronoiNoise.java @@ -1,6 +1,7 @@ package ru.betterend.noise; import java.util.Random; + import net.minecraft.core.BlockPos; import ru.betterend.util.MHelper; diff --git a/src/main/java/ru/betterend/particle/GlowingSphereParticleEffect.java b/src/main/java/ru/betterend/particle/GlowingSphereParticleEffect.java index 67d8fca1..1481b70b 100644 --- a/src/main/java/ru/betterend/particle/GlowingSphereParticleEffect.java +++ b/src/main/java/ru/betterend/particle/GlowingSphereParticleEffect.java @@ -1,6 +1,7 @@ package ru.betterend.particle; import java.util.Locale; + import net.minecraft.core.Registry; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleType; diff --git a/src/main/java/ru/betterend/patterns/BlockPatterned.java b/src/main/java/ru/betterend/patterns/BlockPatterned.java index 3e35dee0..f1ca3f48 100644 --- a/src/main/java/ru/betterend/patterns/BlockPatterned.java +++ b/src/main/java/ru/betterend/patterns/BlockPatterned.java @@ -1,13 +1,14 @@ -package ru.betterend.patterns; - -import java.io.Reader; -import net.minecraft.resources.ResourceLocation; - -public interface BlockPatterned extends Patterned { - default String getStatesPattern(Reader data) { - return null; - } - default ResourceLocation statePatternId() { - return null; - } -} +package ru.betterend.patterns; + +import java.io.Reader; + +import net.minecraft.resources.ResourceLocation; + +public interface BlockPatterned extends Patterned { + default String getStatesPattern(Reader data) { + return null; + } + default ResourceLocation statePatternId() { + return null; + } +} diff --git a/src/main/java/ru/betterend/patterns/Patterns.java b/src/main/java/ru/betterend/patterns/Patterns.java index 9db38371..53851122 100644 --- a/src/main/java/ru/betterend/patterns/Patterns.java +++ b/src/main/java/ru/betterend/patterns/Patterns.java @@ -1,156 +1,158 @@ -package ru.betterend.patterns; - -import java.io.BufferedReader; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.nio.charset.StandardCharsets; -import java.util.Map; -import java.util.Map.Entry; -import java.util.stream.Collectors; -import net.minecraft.client.Minecraft; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.resources.ResourceManager; -import com.google.common.collect.Maps; -import ru.betterend.BetterEnd; - -public class Patterns { - - //Blockstates - public final static ResourceLocation STATE_SIMPLE = BetterEnd.makeID("patterns/blockstate/block.json"); - public final static ResourceLocation STATE_SLAB = BetterEnd.makeID("patterns/blockstate/slab.json"); - public final static ResourceLocation STATE_STAIRS = BetterEnd.makeID("patterns/blockstate/stairs.json"); - public final static ResourceLocation STATE_WALL = BetterEnd.makeID("patterns/blockstate/wall.json"); - public final static ResourceLocation STATE_FENCE = BetterEnd.makeID("patterns/blockstate/fence.json"); - public final static ResourceLocation STATE_BUTTON = BetterEnd.makeID("patterns/blockstate/button.json"); - public final static ResourceLocation STATE_PILLAR = BetterEnd.makeID("patterns/blockstate/pillar.json"); - public final static ResourceLocation STATE_PLATE = BetterEnd.makeID("patterns/blockstate/pressure_plate.json"); - public final static ResourceLocation STATE_PLATE_ROTATED = BetterEnd.makeID("patterns/blockstate/pressure_plate_rotated.json"); - public final static ResourceLocation STATE_DOOR = BetterEnd.makeID("patterns/blockstate/door.json"); - public final static ResourceLocation STATE_SAPLING = BetterEnd.makeID("patterns/blockstate/sapling.json"); - public final static ResourceLocation STATE_GATE = BetterEnd.makeID("patterns/blockstate/fence_gate.json"); - public final static ResourceLocation STATE_TRAPDOOR = BetterEnd.makeID("patterns/blockstate/trapdoor.json"); - public final static ResourceLocation STATE_LADDER = BetterEnd.makeID("patterns/blockstate/ladder.json"); - public final static ResourceLocation STATE_BARREL = BetterEnd.makeID("patterns/blockstate/barrel.json"); - public final static ResourceLocation STATE_PEDESTAL = BetterEnd.makeID("patterns/blockstate/pedestal.json"); - public final static ResourceLocation STATE_STONE_LANTERN = BetterEnd.makeID("patterns/blockstate/stone_lantern.json"); - public final static ResourceLocation STATE_DIRECT = BetterEnd.makeID("patterns/blockstate/direct.json"); - public final static ResourceLocation STATE_BULB_LANTERN = BetterEnd.makeID("patterns/blockstate/bulb_lantern.json"); - public final static ResourceLocation STATE_COMPOSTER = BetterEnd.makeID("patterns/blockstate/composter.json"); - public final static ResourceLocation STATE_BARS = BetterEnd.makeID("patterns/blockstate/bars.json"); - public final static ResourceLocation STATE_ANVIL = BetterEnd.makeID("patterns/blockstate/anvil.json"); - public final static ResourceLocation STATE_ANVIL_LONG = BetterEnd.makeID("patterns/blockstate/anvil_long.json"); - public final static ResourceLocation STATE_CHAIN = BetterEnd.makeID("patterns/blockstate/chain.json"); - public final static ResourceLocation STATE_CHANDELIER = BetterEnd.makeID("patterns/blockstate/chandelier.json"); - public final static ResourceLocation STATE_FURNACE = BetterEnd.makeID("patterns/blockstate/furnace.json"); - public final static ResourceLocation STATE_ROTATED_TOP = BetterEnd.makeID("patterns/blockstate/rotated_top.json"); - public final static ResourceLocation STATE_TRIPLE_ROTATED_TOP = BetterEnd.makeID("patterns/blockstate/triple_rotated_top.json"); - public final static ResourceLocation STATE_STALACTITE = BetterEnd.makeID("patterns/blockstate/stalactite.json"); - - //Models Block - public final static ResourceLocation BLOCK_EMPTY = BetterEnd.makeID("patterns/block/empty.json"); - public final static ResourceLocation BLOCK_BASE = BetterEnd.makeID("patterns/block/block.json"); - public final static ResourceLocation BLOCK_SIDED = BetterEnd.makeID("patterns/block/block_sided.json"); - public final static ResourceLocation BLOCK_BOTTOM_TOP = BetterEnd.makeID("patterns/block/block_bottom_top.json"); - public final static ResourceLocation BLOCK_SLAB = BetterEnd.makeID("patterns/block/slab.json"); - public final static ResourceLocation BLOCK_STAIR = BetterEnd.makeID("patterns/block/stairs.json"); - public final static ResourceLocation BLOCK_STAIR_INNER = BetterEnd.makeID("patterns/block/inner_stairs.json"); - public final static ResourceLocation BLOCK_STAIR_OUTER = BetterEnd.makeID("patterns/block/outer_stairs.json"); - public final static ResourceLocation BLOCK_WALL_POST = BetterEnd.makeID("patterns/block/wall_post.json"); - public final static ResourceLocation BLOCK_WALL_SIDE = BetterEnd.makeID("patterns/block/wall_side.json"); - public final static ResourceLocation BLOCK_WALL_SIDE_TALL = BetterEnd.makeID("patterns/block/wall_side_tall.json"); - public final static ResourceLocation BLOCK_FENCE_POST = BetterEnd.makeID("patterns/block/fence_post.json"); - public final static ResourceLocation BLOCK_FENCE_SIDE = BetterEnd.makeID("patterns/block/fence_side.json"); - public final static ResourceLocation BLOCK_BUTTON = BetterEnd.makeID("patterns/block/button.json"); - public final static ResourceLocation BLOCK_BUTTON_PRESSED = BetterEnd.makeID("patterns/block/button_pressed.json"); - public final static ResourceLocation BLOCK_PILLAR = BetterEnd.makeID("patterns/block/pillar.json"); - public final static ResourceLocation BLOCK_PLATE_UP = BetterEnd.makeID("patterns/block/pressure_plate_up.json"); - public final static ResourceLocation BLOCK_PLATE_DOWN = BetterEnd.makeID("patterns/block/pressure_plate_down.json"); - public final static ResourceLocation BLOCK_DOOR_TOP = BetterEnd.makeID("patterns/block/door_top.json"); - public final static ResourceLocation BLOCK_DOOR_TOP_HINGE = BetterEnd.makeID("patterns/block/door_top_hinge.json"); - public final static ResourceLocation BLOCK_DOOR_BOTTOM = BetterEnd.makeID("patterns/block/door_bottom.json"); - public final static ResourceLocation BLOCK_DOOR_BOTTOM_HINGE = BetterEnd.makeID("patterns/block/door_bottom_hinge.json"); - public final static ResourceLocation BLOCK_CROSS = BetterEnd.makeID("patterns/block/cross.json"); - public final static ResourceLocation BLOCK_CROSS_SHADED = BetterEnd.makeID("patterns/block/cross_shaded.json"); - public final static ResourceLocation BLOCK_GATE_CLOSED = BetterEnd.makeID("patterns/block/fence_gate_closed.json"); - public final static ResourceLocation BLOCK_GATE_CLOSED_WALL = BetterEnd.makeID("patterns/block/wall_gate_closed.json"); - public final static ResourceLocation BLOCK_GATE_OPEN = BetterEnd.makeID("patterns/block/fence_gate_open.json"); - public final static ResourceLocation BLOCK_GATE_OPEN_WALL = BetterEnd.makeID("patterns/block/wall_gate_open.json"); - public final static ResourceLocation BLOCK_TRAPDOOR = BetterEnd.makeID("patterns/block/trapdoor.json"); - public final static ResourceLocation BLOCK_LADDER = BetterEnd.makeID("patterns/block/ladder.json"); - public final static ResourceLocation BLOCK_BARREL_OPEN = BetterEnd.makeID("patterns/block/barrel_open.json"); - public final static ResourceLocation BLOCK_PEDESTAL_DEFAULT = BetterEnd.makeID("patterns/block/pedestal_default.json"); - public final static ResourceLocation BLOKC_PEDESTAL_COLUMN = BetterEnd.makeID("patterns/block/pedestal_column.json"); - public final static ResourceLocation BLOCK_PEDESTAL_COLUMN_TOP = BetterEnd.makeID("patterns/block/pedestal_column_top.json"); - public final static ResourceLocation BLOCK_PEDESTAL_TOP = BetterEnd.makeID("patterns/block/pedestal_top.json"); - public final static ResourceLocation BLOCK_PEDESTAL_BOTTOM = BetterEnd.makeID("patterns/block/pedestal_bottom.json"); - public final static ResourceLocation BLOCK_PEDESTAL_PILLAR = BetterEnd.makeID("patterns/block/pedestal_pillar.json"); - public final static ResourceLocation BLOCK_BOOKSHELF = BetterEnd.makeID("patterns/block/bookshelf.json"); - public final static ResourceLocation BLOCK_STONE_LANTERN_CEIL = BetterEnd.makeID("patterns/block/stone_lantern_ceil.json"); - public final static ResourceLocation BLOCK_STONE_LANTERN_FLOOR = BetterEnd.makeID("patterns/block/stone_lantern_floor.json"); - public final static ResourceLocation BLOCK_BULB_LANTERN_FLOOR = BetterEnd.makeID("patterns/block/bulb_lantern_floor.json"); - public final static ResourceLocation BLOCK_BULB_LANTERN_CEIL = BetterEnd.makeID("patterns/block/bulb_lantern_ceil.json"); - public final static ResourceLocation BLOCK_PETAL_COLORED = BetterEnd.makeID("models/block/block_petal_colored.json"); - public final static ResourceLocation BLOCK_COMPOSTER = BetterEnd.makeID("patterns/block/composter.json"); - public final static ResourceLocation BLOCK_COLORED = BetterEnd.makeID("patterns/block/block_colored.json"); - public final static ResourceLocation BLOCK_BARS_POST = BetterEnd.makeID("patterns/block/bars_post.json"); - public final static ResourceLocation BLOCK_BARS_SIDE = BetterEnd.makeID("patterns/block/bars_side.json"); - public final static ResourceLocation BLOCK_ANVIL = BetterEnd.makeID("patterns/block/anvil.json"); - public final static ResourceLocation BLOCK_CHAIN = BetterEnd.makeID("patterns/block/chain.json"); - public final static ResourceLocation BLOCK_CHANDELIER_FLOOR = BetterEnd.makeID("patterns/block/chandelier_floor.json"); - public final static ResourceLocation BLOCK_CHANDELIER_WALL = BetterEnd.makeID("patterns/block/chandelier_wall.json"); - public final static ResourceLocation BLOCK_CHANDELIER_CEIL = BetterEnd.makeID("patterns/block/chandelier_ceil.json"); - public final static ResourceLocation BLOCK_FURNACE = BetterEnd.makeID("patterns/block/furnace.json"); - public final static ResourceLocation BLOCK_FURNACE_GLOW = BetterEnd.makeID("patterns/block/furnace_glow.json"); - public final static ResourceLocation BLOCK_TOP_SIDE_BOTTOM = BetterEnd.makeID("patterns/block/top_side_bottom.json"); - public final static ResourceLocation BLOCK_PATH = BetterEnd.makeID("patterns/block/path.json"); - - //Models Item - public final static ResourceLocation ITEM_WALL = BetterEnd.makeID("patterns/item/pattern_wall.json"); - public final static ResourceLocation ITEM_FENCE = BetterEnd.makeID("patterns/item/pattern_fence.json"); - public final static ResourceLocation ITEM_BUTTON = BetterEnd.makeID("patterns/item/pattern_button.json"); - public final static ResourceLocation ITEM_CHEST = BetterEnd.makeID("patterns/item/pattern_chest.json"); - public final static ResourceLocation ITEM_BLOCK = BetterEnd.makeID("patterns/item/pattern_block_item.json"); - public final static ResourceLocation ITEM_GENERATED = BetterEnd.makeID("patterns/item/pattern_item_generated.json"); - public final static ResourceLocation ITEM_HANDHELD = BetterEnd.makeID("patterns/item/pattern_item_handheld.json"); - public final static ResourceLocation ITEM_SPAWN_EGG = BetterEnd.makeID("patterns/item/pattern_item_spawn_egg.json"); - - public static String createJson(Reader data, String parent, String block) { - try (BufferedReader buffer = new BufferedReader(data)) { - return buffer.lines().collect(Collectors.joining()) - .replace("%parent%", parent) - .replace("%block%", block); - } catch (Exception ex) { - return null; - } - } - - public static String createJson(ResourceLocation patternId, String parent, String block) { - ResourceManager resourceManager = Minecraft.getInstance().getResourceManager(); - try (InputStream input = resourceManager.getResource(patternId).getInputStream()) { - return createJson(new InputStreamReader(input, StandardCharsets.UTF_8), parent, block); - } catch (Exception ex) { - return null; - } - } - - public static String createJson(ResourceLocation patternId, String texture) { - Map textures = Maps.newHashMap(); - textures.put("%texture%", texture); - return createJson(patternId, textures); - } - - public static String createJson(ResourceLocation patternId, Map textures) { - ResourceManager resourceManager = Minecraft.getInstance().getResourceManager(); - try (InputStream input = resourceManager.getResource(patternId).getInputStream()) { - String json = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8)) - .lines().collect(Collectors.joining()); - for (Entry texture : textures.entrySet()) { - json = json.replace(texture.getKey(), texture.getValue()); - } - return json; - } catch (Exception ex) { - return null; - } - } -} +package ru.betterend.patterns; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.nio.charset.StandardCharsets; +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; + +import com.google.common.collect.Maps; + +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.ResourceManager; +import ru.betterend.BetterEnd; + +public class Patterns { + + //Blockstates + public final static ResourceLocation STATE_SIMPLE = BetterEnd.makeID("patterns/blockstate/block.json"); + public final static ResourceLocation STATE_SLAB = BetterEnd.makeID("patterns/blockstate/slab.json"); + public final static ResourceLocation STATE_STAIRS = BetterEnd.makeID("patterns/blockstate/stairs.json"); + public final static ResourceLocation STATE_WALL = BetterEnd.makeID("patterns/blockstate/wall.json"); + public final static ResourceLocation STATE_FENCE = BetterEnd.makeID("patterns/blockstate/fence.json"); + public final static ResourceLocation STATE_BUTTON = BetterEnd.makeID("patterns/blockstate/button.json"); + public final static ResourceLocation STATE_PILLAR = BetterEnd.makeID("patterns/blockstate/pillar.json"); + public final static ResourceLocation STATE_PLATE = BetterEnd.makeID("patterns/blockstate/pressure_plate.json"); + public final static ResourceLocation STATE_PLATE_ROTATED = BetterEnd.makeID("patterns/blockstate/pressure_plate_rotated.json"); + public final static ResourceLocation STATE_DOOR = BetterEnd.makeID("patterns/blockstate/door.json"); + public final static ResourceLocation STATE_SAPLING = BetterEnd.makeID("patterns/blockstate/sapling.json"); + public final static ResourceLocation STATE_GATE = BetterEnd.makeID("patterns/blockstate/fence_gate.json"); + public final static ResourceLocation STATE_TRAPDOOR = BetterEnd.makeID("patterns/blockstate/trapdoor.json"); + public final static ResourceLocation STATE_LADDER = BetterEnd.makeID("patterns/blockstate/ladder.json"); + public final static ResourceLocation STATE_BARREL = BetterEnd.makeID("patterns/blockstate/barrel.json"); + public final static ResourceLocation STATE_PEDESTAL = BetterEnd.makeID("patterns/blockstate/pedestal.json"); + public final static ResourceLocation STATE_STONE_LANTERN = BetterEnd.makeID("patterns/blockstate/stone_lantern.json"); + public final static ResourceLocation STATE_DIRECT = BetterEnd.makeID("patterns/blockstate/direct.json"); + public final static ResourceLocation STATE_BULB_LANTERN = BetterEnd.makeID("patterns/blockstate/bulb_lantern.json"); + public final static ResourceLocation STATE_COMPOSTER = BetterEnd.makeID("patterns/blockstate/composter.json"); + public final static ResourceLocation STATE_BARS = BetterEnd.makeID("patterns/blockstate/bars.json"); + public final static ResourceLocation STATE_ANVIL = BetterEnd.makeID("patterns/blockstate/anvil.json"); + public final static ResourceLocation STATE_ANVIL_LONG = BetterEnd.makeID("patterns/blockstate/anvil_long.json"); + public final static ResourceLocation STATE_CHAIN = BetterEnd.makeID("patterns/blockstate/chain.json"); + public final static ResourceLocation STATE_CHANDELIER = BetterEnd.makeID("patterns/blockstate/chandelier.json"); + public final static ResourceLocation STATE_FURNACE = BetterEnd.makeID("patterns/blockstate/furnace.json"); + public final static ResourceLocation STATE_ROTATED_TOP = BetterEnd.makeID("patterns/blockstate/rotated_top.json"); + public final static ResourceLocation STATE_TRIPLE_ROTATED_TOP = BetterEnd.makeID("patterns/blockstate/triple_rotated_top.json"); + public final static ResourceLocation STATE_STALACTITE = BetterEnd.makeID("patterns/blockstate/stalactite.json"); + + //Models Block + public final static ResourceLocation BLOCK_EMPTY = BetterEnd.makeID("patterns/block/empty.json"); + public final static ResourceLocation BLOCK_BASE = BetterEnd.makeID("patterns/block/block.json"); + public final static ResourceLocation BLOCK_SIDED = BetterEnd.makeID("patterns/block/block_sided.json"); + public final static ResourceLocation BLOCK_BOTTOM_TOP = BetterEnd.makeID("patterns/block/block_bottom_top.json"); + public final static ResourceLocation BLOCK_SLAB = BetterEnd.makeID("patterns/block/slab.json"); + public final static ResourceLocation BLOCK_STAIR = BetterEnd.makeID("patterns/block/stairs.json"); + public final static ResourceLocation BLOCK_STAIR_INNER = BetterEnd.makeID("patterns/block/inner_stairs.json"); + public final static ResourceLocation BLOCK_STAIR_OUTER = BetterEnd.makeID("patterns/block/outer_stairs.json"); + public final static ResourceLocation BLOCK_WALL_POST = BetterEnd.makeID("patterns/block/wall_post.json"); + public final static ResourceLocation BLOCK_WALL_SIDE = BetterEnd.makeID("patterns/block/wall_side.json"); + public final static ResourceLocation BLOCK_WALL_SIDE_TALL = BetterEnd.makeID("patterns/block/wall_side_tall.json"); + public final static ResourceLocation BLOCK_FENCE_POST = BetterEnd.makeID("patterns/block/fence_post.json"); + public final static ResourceLocation BLOCK_FENCE_SIDE = BetterEnd.makeID("patterns/block/fence_side.json"); + public final static ResourceLocation BLOCK_BUTTON = BetterEnd.makeID("patterns/block/button.json"); + public final static ResourceLocation BLOCK_BUTTON_PRESSED = BetterEnd.makeID("patterns/block/button_pressed.json"); + public final static ResourceLocation BLOCK_PILLAR = BetterEnd.makeID("patterns/block/pillar.json"); + public final static ResourceLocation BLOCK_PLATE_UP = BetterEnd.makeID("patterns/block/pressure_plate_up.json"); + public final static ResourceLocation BLOCK_PLATE_DOWN = BetterEnd.makeID("patterns/block/pressure_plate_down.json"); + public final static ResourceLocation BLOCK_DOOR_TOP = BetterEnd.makeID("patterns/block/door_top.json"); + public final static ResourceLocation BLOCK_DOOR_TOP_HINGE = BetterEnd.makeID("patterns/block/door_top_hinge.json"); + public final static ResourceLocation BLOCK_DOOR_BOTTOM = BetterEnd.makeID("patterns/block/door_bottom.json"); + public final static ResourceLocation BLOCK_DOOR_BOTTOM_HINGE = BetterEnd.makeID("patterns/block/door_bottom_hinge.json"); + public final static ResourceLocation BLOCK_CROSS = BetterEnd.makeID("patterns/block/cross.json"); + public final static ResourceLocation BLOCK_CROSS_SHADED = BetterEnd.makeID("patterns/block/cross_shaded.json"); + public final static ResourceLocation BLOCK_GATE_CLOSED = BetterEnd.makeID("patterns/block/fence_gate_closed.json"); + public final static ResourceLocation BLOCK_GATE_CLOSED_WALL = BetterEnd.makeID("patterns/block/wall_gate_closed.json"); + public final static ResourceLocation BLOCK_GATE_OPEN = BetterEnd.makeID("patterns/block/fence_gate_open.json"); + public final static ResourceLocation BLOCK_GATE_OPEN_WALL = BetterEnd.makeID("patterns/block/wall_gate_open.json"); + public final static ResourceLocation BLOCK_TRAPDOOR = BetterEnd.makeID("patterns/block/trapdoor.json"); + public final static ResourceLocation BLOCK_LADDER = BetterEnd.makeID("patterns/block/ladder.json"); + public final static ResourceLocation BLOCK_BARREL_OPEN = BetterEnd.makeID("patterns/block/barrel_open.json"); + public final static ResourceLocation BLOCK_PEDESTAL_DEFAULT = BetterEnd.makeID("patterns/block/pedestal_default.json"); + public final static ResourceLocation BLOKC_PEDESTAL_COLUMN = BetterEnd.makeID("patterns/block/pedestal_column.json"); + public final static ResourceLocation BLOCK_PEDESTAL_COLUMN_TOP = BetterEnd.makeID("patterns/block/pedestal_column_top.json"); + public final static ResourceLocation BLOCK_PEDESTAL_TOP = BetterEnd.makeID("patterns/block/pedestal_top.json"); + public final static ResourceLocation BLOCK_PEDESTAL_BOTTOM = BetterEnd.makeID("patterns/block/pedestal_bottom.json"); + public final static ResourceLocation BLOCK_PEDESTAL_PILLAR = BetterEnd.makeID("patterns/block/pedestal_pillar.json"); + public final static ResourceLocation BLOCK_BOOKSHELF = BetterEnd.makeID("patterns/block/bookshelf.json"); + public final static ResourceLocation BLOCK_STONE_LANTERN_CEIL = BetterEnd.makeID("patterns/block/stone_lantern_ceil.json"); + public final static ResourceLocation BLOCK_STONE_LANTERN_FLOOR = BetterEnd.makeID("patterns/block/stone_lantern_floor.json"); + public final static ResourceLocation BLOCK_BULB_LANTERN_FLOOR = BetterEnd.makeID("patterns/block/bulb_lantern_floor.json"); + public final static ResourceLocation BLOCK_BULB_LANTERN_CEIL = BetterEnd.makeID("patterns/block/bulb_lantern_ceil.json"); + public final static ResourceLocation BLOCK_PETAL_COLORED = BetterEnd.makeID("models/block/block_petal_colored.json"); + public final static ResourceLocation BLOCK_COMPOSTER = BetterEnd.makeID("patterns/block/composter.json"); + public final static ResourceLocation BLOCK_COLORED = BetterEnd.makeID("patterns/block/block_colored.json"); + public final static ResourceLocation BLOCK_BARS_POST = BetterEnd.makeID("patterns/block/bars_post.json"); + public final static ResourceLocation BLOCK_BARS_SIDE = BetterEnd.makeID("patterns/block/bars_side.json"); + public final static ResourceLocation BLOCK_ANVIL = BetterEnd.makeID("patterns/block/anvil.json"); + public final static ResourceLocation BLOCK_CHAIN = BetterEnd.makeID("patterns/block/chain.json"); + public final static ResourceLocation BLOCK_CHANDELIER_FLOOR = BetterEnd.makeID("patterns/block/chandelier_floor.json"); + public final static ResourceLocation BLOCK_CHANDELIER_WALL = BetterEnd.makeID("patterns/block/chandelier_wall.json"); + public final static ResourceLocation BLOCK_CHANDELIER_CEIL = BetterEnd.makeID("patterns/block/chandelier_ceil.json"); + public final static ResourceLocation BLOCK_FURNACE = BetterEnd.makeID("patterns/block/furnace.json"); + public final static ResourceLocation BLOCK_FURNACE_GLOW = BetterEnd.makeID("patterns/block/furnace_glow.json"); + public final static ResourceLocation BLOCK_TOP_SIDE_BOTTOM = BetterEnd.makeID("patterns/block/top_side_bottom.json"); + public final static ResourceLocation BLOCK_PATH = BetterEnd.makeID("patterns/block/path.json"); + + //Models Item + public final static ResourceLocation ITEM_WALL = BetterEnd.makeID("patterns/item/pattern_wall.json"); + public final static ResourceLocation ITEM_FENCE = BetterEnd.makeID("patterns/item/pattern_fence.json"); + public final static ResourceLocation ITEM_BUTTON = BetterEnd.makeID("patterns/item/pattern_button.json"); + public final static ResourceLocation ITEM_CHEST = BetterEnd.makeID("patterns/item/pattern_chest.json"); + public final static ResourceLocation ITEM_BLOCK = BetterEnd.makeID("patterns/item/pattern_block_item.json"); + public final static ResourceLocation ITEM_GENERATED = BetterEnd.makeID("patterns/item/pattern_item_generated.json"); + public final static ResourceLocation ITEM_HANDHELD = BetterEnd.makeID("patterns/item/pattern_item_handheld.json"); + public final static ResourceLocation ITEM_SPAWN_EGG = BetterEnd.makeID("patterns/item/pattern_item_spawn_egg.json"); + + public static String createJson(Reader data, String parent, String block) { + try (BufferedReader buffer = new BufferedReader(data)) { + return buffer.lines().collect(Collectors.joining()) + .replace("%parent%", parent) + .replace("%block%", block); + } catch (Exception ex) { + return null; + } + } + + public static String createJson(ResourceLocation patternId, String parent, String block) { + ResourceManager resourceManager = Minecraft.getInstance().getResourceManager(); + try (InputStream input = resourceManager.getResource(patternId).getInputStream()) { + return createJson(new InputStreamReader(input, StandardCharsets.UTF_8), parent, block); + } catch (Exception ex) { + return null; + } + } + + public static String createJson(ResourceLocation patternId, String texture) { + Map textures = Maps.newHashMap(); + textures.put("%texture%", texture); + return createJson(patternId, textures); + } + + public static String createJson(ResourceLocation patternId, Map textures) { + ResourceManager resourceManager = Minecraft.getInstance().getResourceManager(); + try (InputStream input = resourceManager.getResource(patternId).getInputStream()) { + String json = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8)) + .lines().collect(Collectors.joining()); + for (Entry texture : textures.entrySet()) { + json = json.replace(texture.getKey(), texture.getValue()); + } + return json; + } catch (Exception ex) { + return null; + } + } +} diff --git a/src/main/java/ru/betterend/recipe/EndRecipeManager.java b/src/main/java/ru/betterend/recipe/EndRecipeManager.java index eef6a87e..d6699142 100644 --- a/src/main/java/ru/betterend/recipe/EndRecipeManager.java +++ b/src/main/java/ru/betterend/recipe/EndRecipeManager.java @@ -2,12 +2,14 @@ package ru.betterend.recipe; import java.util.Map; import java.util.Map.Entry; + +import com.google.common.collect.Maps; + import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; -import com.google.common.collect.Maps; import ru.betterend.BetterEnd; public class EndRecipeManager { diff --git a/src/main/java/ru/betterend/recipe/builders/GridRecipe.java b/src/main/java/ru/betterend/recipe/builders/GridRecipe.java index b8ec3625..64d705c5 100644 --- a/src/main/java/ru/betterend/recipe/builders/GridRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/GridRecipe.java @@ -2,6 +2,9 @@ package ru.betterend.recipe.builders; import java.util.Arrays; import java.util.Map; + +import com.google.common.collect.Maps; + import net.minecraft.core.NonNullList; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.Tag; @@ -13,7 +16,6 @@ import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.crafting.ShapedRecipe; import net.minecraft.world.item.crafting.ShapelessRecipe; import net.minecraft.world.level.ItemLike; -import com.google.common.collect.Maps; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; import ru.betterend.recipe.EndRecipeManager; diff --git a/src/main/java/ru/betterend/registry/EndBlockEntities.java b/src/main/java/ru/betterend/registry/EndBlockEntities.java index e722dc94..003777b3 100644 --- a/src/main/java/ru/betterend/registry/EndBlockEntities.java +++ b/src/main/java/ru/betterend/registry/EndBlockEntities.java @@ -1,12 +1,14 @@ package ru.betterend.registry; import java.util.List; + +import com.google.common.collect.Lists; + import net.minecraft.core.Registry; import net.minecraft.world.item.BlockItem; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; -import com.google.common.collect.Lists; import ru.betterend.BetterEnd; import ru.betterend.blocks.EndStoneSmelter; import ru.betterend.blocks.EternalPedestal; diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 10fba6ad..d2228007 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -2,15 +2,18 @@ package ru.betterend.registry; import java.util.List; import java.util.function.Supplier; + +import com.google.common.collect.Lists; + import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.levelgen.GenerationStep; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; -import com.google.common.collect.Lists; import ru.betterend.BetterEnd; import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; +import ru.betterend.world.features.BiomeIslandFeature; import ru.betterend.world.features.BlueVineFeature; import ru.betterend.world.features.CavePumpkinFeature; import ru.betterend.world.features.CharniaFeature; @@ -27,7 +30,6 @@ import ru.betterend.world.features.HydraluxFeature; import ru.betterend.world.features.LanceleafFeature; import ru.betterend.world.features.MengerSpongeFeature; import ru.betterend.world.features.NeonCactusFeature; -import ru.betterend.world.features.BiomeIslandFeature; import ru.betterend.world.features.SilkMothNestFeature; import ru.betterend.world.features.SingleInvertedScatterFeature; import ru.betterend.world.features.SinglePlantFeature; diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index 0b35f495..d3fbe6cf 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -20,7 +20,6 @@ import net.minecraft.world.entity.MobSpawnType; import net.minecraft.world.food.FoodProperties; import net.minecraft.world.food.Foods; import net.minecraft.world.item.ArmorItem; -import net.minecraft.world.item.FishBucketItem; import net.minecraft.world.item.Item; import net.minecraft.world.item.Item.Properties; import net.minecraft.world.item.ItemStack; @@ -32,12 +31,12 @@ import net.minecraft.world.item.SwordItem; import net.minecraft.world.item.TieredItem; import net.minecraft.world.item.Tiers; import net.minecraft.world.level.block.DispenserBlock; -import net.minecraft.world.level.material.Fluids; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; import ru.betterend.item.DrinkItem; import ru.betterend.item.EnchantedPetalItem; import ru.betterend.item.EndArmorItem; +import ru.betterend.item.EndBucketItem; import ru.betterend.item.EndSpawnEggItem; import ru.betterend.item.EternalCrystalItem; import ru.betterend.item.PatternedDiscItem; @@ -119,7 +118,8 @@ public class EndItems { public final static Item SHADOW_BERRY_COOKED = registerFood("shadow_berry_cooked", 6, 0.7F); public final static Item END_FISH_RAW = registerFood("end_fish_raw", Foods.SALMON); public final static Item END_FISH_COOKED = registerFood("end_fish_cooked", Foods.COOKED_SALMON); - public final static Item BUCKET_END_FISH = registerItem("bucket_end_fish", new FishBucketItem(EndEntities.END_FISH, Fluids.WATER, makeItemSettings().stacksTo(1))); + public final static Item BUCKET_END_FISH = registerItem("bucket_end_fish", new EndBucketItem()); + public final static Item BUCKET_CUBOZOA = registerItem("bucket_cubozoa", new EndBucketItem()); public final static Item SWEET_BERRY_JELLY = registerFood("sweet_berry_jelly", 6, 0.75F); public final static Item SHADOW_BERRY_JELLY = registerFood("shadow_berry_jelly", 7, 0.75F, new MobEffectInstance(MobEffects.NIGHT_VISION, 400)); public final static Item BLOSSOM_BERRY = registerFood("blossom_berry", Foods.APPLE); diff --git a/src/main/java/ru/betterend/registry/EndPortals.java b/src/main/java/ru/betterend/registry/EndPortals.java index 81710747..8288f60b 100644 --- a/src/main/java/ru/betterend/registry/EndPortals.java +++ b/src/main/java/ru/betterend/registry/EndPortals.java @@ -4,6 +4,7 @@ import java.io.File; import com.google.gson.JsonArray; import com.google.gson.JsonObject; + import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; diff --git a/src/main/java/ru/betterend/registry/EndStructures.java b/src/main/java/ru/betterend/registry/EndStructures.java index 08d1b32a..c3ed2370 100644 --- a/src/main/java/ru/betterend/registry/EndStructures.java +++ b/src/main/java/ru/betterend/registry/EndStructures.java @@ -2,6 +2,7 @@ package ru.betterend.registry; import java.util.Collection; import java.util.function.Supplier; + import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.biome.Biome; diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index 4c686a8b..c2866b47 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -1,10 +1,10 @@ package ru.betterend.registry; -import java.util.Arrays; 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; diff --git a/src/main/java/ru/betterend/rituals/EternalRitual.java b/src/main/java/ru/betterend/rituals/EternalRitual.java index 56e58413..995c3244 100644 --- a/src/main/java/ru/betterend/rituals/EternalRitual.java +++ b/src/main/java/ru/betterend/rituals/EternalRitual.java @@ -7,10 +7,11 @@ import java.util.Random; import java.util.Set; import java.util.function.Predicate; -import com.google.common.collect.Lists; import org.jetbrains.annotations.Nullable; +import com.google.common.collect.Lists; import com.google.common.collect.Sets; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Registry; diff --git a/src/main/java/ru/betterend/rituals/InfusionRitual.java b/src/main/java/ru/betterend/rituals/InfusionRitual.java index 9939c3cf..edad8922 100644 --- a/src/main/java/ru/betterend/rituals/InfusionRitual.java +++ b/src/main/java/ru/betterend/rituals/InfusionRitual.java @@ -1,6 +1,7 @@ package ru.betterend.rituals; import java.awt.Point; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/ru/betterend/util/BlocksHelper.java b/src/main/java/ru/betterend/util/BlocksHelper.java index 84e3ec12..62b5eeaa 100644 --- a/src/main/java/ru/betterend/util/BlocksHelper.java +++ b/src/main/java/ru/betterend/util/BlocksHelper.java @@ -5,6 +5,10 @@ import java.util.Iterator; import java.util.Map; import java.util.Random; import java.util.Set; + +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -19,8 +23,6 @@ import net.minecraft.world.level.block.Rotation; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.level.block.state.properties.Property; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; import ru.betterend.blocks.BlueVineBlock; import ru.betterend.blocks.basis.DoublePlantBlock; import ru.betterend.blocks.basis.FurBlock; diff --git a/src/main/java/ru/betterend/util/BonemealUtil.java b/src/main/java/ru/betterend/util/BonemealUtil.java index dae14b5b..2229d089 100644 --- a/src/main/java/ru/betterend/util/BonemealUtil.java +++ b/src/main/java/ru/betterend/util/BonemealUtil.java @@ -3,10 +3,12 @@ package ru.betterend.util; import java.util.List; import java.util.Map; import java.util.Random; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.block.Block; + import com.google.common.collect.Lists; import com.google.common.collect.Maps; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndBlocks; import ru.betterend.world.biome.EndBiome; diff --git a/src/main/java/ru/betterend/util/ColorUtil.java b/src/main/java/ru/betterend/util/ColorUtil.java index 87b7b5b4..2ea3523a 100644 --- a/src/main/java/ru/betterend/util/ColorUtil.java +++ b/src/main/java/ru/betterend/util/ColorUtil.java @@ -1,240 +1,241 @@ -package ru.betterend.util; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import com.google.common.collect.Maps; -import com.mojang.blaze3d.platform.NativeImage; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.fabricmc.fabric.impl.client.indigo.renderer.helper.ColorHelper; -import net.minecraft.client.Minecraft; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.resources.Resource; -import net.minecraft.server.packs.resources.ResourceManager; -import net.minecraft.util.Mth; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.Item; -import ru.betterend.BetterEnd; - -@Environment(EnvType.CLIENT) -public class ColorUtil { - - private static float[] floatBuffer = new float[4]; - - public static int[] toIntArray(int color) { - return new int[] { - (color >> 24) & 255, - (color >> 16) & 255, - (color >> 8) & 255, - color & 255 - }; - } - - public static float[] toFloatArray(int color) { - floatBuffer[0] = ((color >> 16 & 255) / 255.0F); - floatBuffer[1] = ((color >> 8 & 255) / 255.0F); - floatBuffer[2] = ((color & 255) / 255.0F); - floatBuffer[3] = ((color >> 24 & 255) / 255.0F); - - return floatBuffer; - } - - public static float[] RGBtoHSB(int r, int g, int b, float[] hsbvals) { - float hue, saturation, brightness; - if (hsbvals == null) { - hsbvals = floatBuffer; - } - int cmax = (r > g) ? r : g; - if (b > cmax) cmax = b; - int cmin = (r < g) ? r : g; - if (b < cmin) cmin = b; - - brightness = ((float) cmax) / 255.0F; - if (cmax != 0) - saturation = ((float) (cmax - cmin)) / ((float) cmax); - else - saturation = 0; - if (saturation == 0) - hue = 0; - else { - float redc = ((float) (cmax - r)) / ((float) (cmax - cmin)); - float greenc = ((float) (cmax - g)) / ((float) (cmax - cmin)); - float bluec = ((float) (cmax - b)) / ((float) (cmax - cmin)); - if (r == cmax) - hue = bluec - greenc; - else if (g == cmax) - hue = 2.0F + redc - bluec; - else - hue = 4.0F + greenc - redc; - hue = hue / 6.0F; - if (hue < 0) - hue = hue + 1.0F; - } - hsbvals[0] = hue; - hsbvals[1] = saturation; - hsbvals[2] = brightness; - return hsbvals; - } - - public static int HSBtoRGB(float hue, float saturation, float brightness) { - int r = 0, g = 0, b = 0; - if (saturation == 0) { - r = g = b = (int) (brightness * 255.0F + 0.5F); - } else { - float h = (hue - (float)Math.floor(hue)) * 6.0F; - float f = h - (float)java.lang.Math.floor(h); - float p = brightness * (1.0F - saturation); - float q = brightness * (1.0F - saturation * f); - float t = brightness * (1.0F - (saturation * (1.0F - f))); - switch ((int) h) { - case 0: - r = (int) (brightness * 255.0F + 0.5F); - g = (int) (t * 255.0F + 0.5F); - b = (int) (p * 255.0F + 0.5F); - break; - case 1: - r = (int) (q * 255.0F + 0.5F); - g = (int) (brightness * 255.0F + 0.5F); - b = (int) (p * 255.0F + 0.5F); - break; - case 2: - r = (int) (p * 255.0F + 0.5F); - g = (int) (brightness * 255.0F + 0.5F); - b = (int) (t * 255.0F + 0.5F); - break; - case 3: - r = (int) (p * 255.0F + 0.5F); - g = (int) (q * 255.0F + 0.5F); - b = (int) (brightness * 255.0F + 0.5F); - break; - case 4: - r = (int) (t * 255.0F + 0.5F); - g = (int) (p * 255.0F + 0.5F); - b = (int) (brightness * 255.0F + 0.5F); - break; - case 5: - r = (int) (brightness * 255.0F + 0.5F); - g = (int) (p * 255.0F + 0.5F); - b = (int) (q * 255.0F + 0.5F); - break; - } - } - return 0xFF000000 | (r << 16) | (g << 8) | (b << 0); - } - - public static int parseHex(String hexColor) { - int len = hexColor.length(); - if (len < 6 || len > 8 || len % 2 > 0) { - return -1; - } - - int color, shift; - if(len == 6) { - color = 0xFF000000; shift = 16; - } else { - color = 0; shift = 24; - } - - try { - String[] splited = hexColor.split("(?<=\\G.{2})"); - for (String digit : splited) { - color |= Integer.valueOf(digit, 16) << shift; - shift -= 8; - } - } catch(NumberFormatException ex) { - BetterEnd.LOGGER.catching(ex); - return -1; - } - - return color; - } - - public static int toABGR(int color) { - int r = (color >> 16) & 255; - int g = (color >> 8) & 255; - int b = color & 255; - return 0xFF000000 | b << 16 | g << 8 | r; - } - - public static int ABGRtoARGB(int color) { - int a = (color >> 24) & 255; - int b = (color >> 16) & 255; - int g = (color >> 8) & 255; - int r = color & 255; - return a << 24 | r << 16 | g << 8 | b; - } - - public static int colorBrigtness(int color, float val) { - RGBtoHSB((color >> 16) & 255, (color >> 8) & 255, color & 255, floatBuffer); - floatBuffer[2] += val / 10.0F; - floatBuffer[2] = Mth.clamp(floatBuffer[2], 0.0F, 1.0F); - return HSBtoRGB(floatBuffer[0], floatBuffer[1], floatBuffer[2]); - } - - public static int applyTint(int color, int tint) { - return colorBrigtness(ColorHelper.multiplyColor(color, tint), 1.5F); - } - - public static int colorDistance(int color1, int color2) { - int r1 = (color1 >> 16) & 255; - int g1 = (color1 >> 8) & 255; - int b1 = color1 & 255; - int r2 = (color2 >> 16) & 255; - int g2 = (color2 >> 8) & 255; - int b2 = color2 & 255; - return MHelper.pow2(r1 - r2) + MHelper.pow2(g1 - g2) + MHelper.pow2(b1 - b2); - } - - private static Map colorPalette = Maps.newHashMap(); - - public static int extractColor(Item item) { - ResourceLocation id = Registry.ITEM.getKey(item); - if (id.equals(Registry.ITEM.getDefaultKey())) return -1; - if (colorPalette.containsKey(id)) { - return colorPalette.get(id); - } - ResourceLocation texture; - if (item instanceof BlockItem) { - texture = new ResourceLocation(id.getNamespace(), "textures/block/" + id.getPath() + ".png"); - } else { - texture = new ResourceLocation(id.getNamespace(), "textures/item/" + id.getPath() + ".png"); - } - NativeImage image = loadImage(texture, 16, 16); - List colors = new ArrayList<>(); - for (int i = 0; i < image.getWidth(); i++) { - for (int j = 0; j < 16; j++) { - int col = image.getPixelRGBA(i, j); - if (((col >> 24) & 255) > 0) { - colors.add(ABGRtoARGB(col)); - } - } - } - image.close(); - - if (colors.size() == 0) return -1; - - ColorExtractor extractor = new ColorExtractor(colors); - int color = extractor.analize(); - colorPalette.put(id, color); - - return color; - } - - public static NativeImage loadImage(ResourceLocation image, int w, int h) { - Minecraft minecraft = Minecraft.getInstance(); - ResourceManager resourceManager = minecraft.getResourceManager(); - if (resourceManager.hasResource(image)) { - try (Resource resource = resourceManager.getResource(image)) { - return NativeImage.read(resource.getInputStream()); - } catch (IOException e) { - BetterEnd.LOGGER.warning("Can't load texture image: {}. Will be created empty image.", image); - BetterEnd.LOGGER.warning("Cause: {}.", e.getMessage()); - } - } - return new NativeImage(w, h, false); - } +package ru.betterend.util; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import com.google.common.collect.Maps; +import com.mojang.blaze3d.platform.NativeImage; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.impl.client.indigo.renderer.helper.ColorHelper; +import net.minecraft.client.Minecraft; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.Resource; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.util.Mth; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; +import ru.betterend.BetterEnd; + +@Environment(EnvType.CLIENT) +public class ColorUtil { + + private static float[] floatBuffer = new float[4]; + + public static int[] toIntArray(int color) { + return new int[] { + (color >> 24) & 255, + (color >> 16) & 255, + (color >> 8) & 255, + color & 255 + }; + } + + public static float[] toFloatArray(int color) { + floatBuffer[0] = ((color >> 16 & 255) / 255.0F); + floatBuffer[1] = ((color >> 8 & 255) / 255.0F); + floatBuffer[2] = ((color & 255) / 255.0F); + floatBuffer[3] = ((color >> 24 & 255) / 255.0F); + + return floatBuffer; + } + + public static float[] RGBtoHSB(int r, int g, int b, float[] hsbvals) { + float hue, saturation, brightness; + if (hsbvals == null) { + hsbvals = floatBuffer; + } + int cmax = (r > g) ? r : g; + if (b > cmax) cmax = b; + int cmin = (r < g) ? r : g; + if (b < cmin) cmin = b; + + brightness = ((float) cmax) / 255.0F; + if (cmax != 0) + saturation = ((float) (cmax - cmin)) / ((float) cmax); + else + saturation = 0; + if (saturation == 0) + hue = 0; + else { + float redc = ((float) (cmax - r)) / ((float) (cmax - cmin)); + float greenc = ((float) (cmax - g)) / ((float) (cmax - cmin)); + float bluec = ((float) (cmax - b)) / ((float) (cmax - cmin)); + if (r == cmax) + hue = bluec - greenc; + else if (g == cmax) + hue = 2.0F + redc - bluec; + else + hue = 4.0F + greenc - redc; + hue = hue / 6.0F; + if (hue < 0) + hue = hue + 1.0F; + } + hsbvals[0] = hue; + hsbvals[1] = saturation; + hsbvals[2] = brightness; + return hsbvals; + } + + public static int HSBtoRGB(float hue, float saturation, float brightness) { + int r = 0, g = 0, b = 0; + if (saturation == 0) { + r = g = b = (int) (brightness * 255.0F + 0.5F); + } else { + float h = (hue - (float)Math.floor(hue)) * 6.0F; + float f = h - (float)java.lang.Math.floor(h); + float p = brightness * (1.0F - saturation); + float q = brightness * (1.0F - saturation * f); + float t = brightness * (1.0F - (saturation * (1.0F - f))); + switch ((int) h) { + case 0: + r = (int) (brightness * 255.0F + 0.5F); + g = (int) (t * 255.0F + 0.5F); + b = (int) (p * 255.0F + 0.5F); + break; + case 1: + r = (int) (q * 255.0F + 0.5F); + g = (int) (brightness * 255.0F + 0.5F); + b = (int) (p * 255.0F + 0.5F); + break; + case 2: + r = (int) (p * 255.0F + 0.5F); + g = (int) (brightness * 255.0F + 0.5F); + b = (int) (t * 255.0F + 0.5F); + break; + case 3: + r = (int) (p * 255.0F + 0.5F); + g = (int) (q * 255.0F + 0.5F); + b = (int) (brightness * 255.0F + 0.5F); + break; + case 4: + r = (int) (t * 255.0F + 0.5F); + g = (int) (p * 255.0F + 0.5F); + b = (int) (brightness * 255.0F + 0.5F); + break; + case 5: + r = (int) (brightness * 255.0F + 0.5F); + g = (int) (p * 255.0F + 0.5F); + b = (int) (q * 255.0F + 0.5F); + break; + } + } + return 0xFF000000 | (r << 16) | (g << 8) | (b << 0); + } + + public static int parseHex(String hexColor) { + int len = hexColor.length(); + if (len < 6 || len > 8 || len % 2 > 0) { + return -1; + } + + int color, shift; + if(len == 6) { + color = 0xFF000000; shift = 16; + } else { + color = 0; shift = 24; + } + + try { + String[] splited = hexColor.split("(?<=\\G.{2})"); + for (String digit : splited) { + color |= Integer.valueOf(digit, 16) << shift; + shift -= 8; + } + } catch(NumberFormatException ex) { + BetterEnd.LOGGER.catching(ex); + return -1; + } + + return color; + } + + public static int toABGR(int color) { + int r = (color >> 16) & 255; + int g = (color >> 8) & 255; + int b = color & 255; + return 0xFF000000 | b << 16 | g << 8 | r; + } + + public static int ABGRtoARGB(int color) { + int a = (color >> 24) & 255; + int b = (color >> 16) & 255; + int g = (color >> 8) & 255; + int r = color & 255; + return a << 24 | r << 16 | g << 8 | b; + } + + public static int colorBrigtness(int color, float val) { + RGBtoHSB((color >> 16) & 255, (color >> 8) & 255, color & 255, floatBuffer); + floatBuffer[2] += val / 10.0F; + floatBuffer[2] = Mth.clamp(floatBuffer[2], 0.0F, 1.0F); + return HSBtoRGB(floatBuffer[0], floatBuffer[1], floatBuffer[2]); + } + + public static int applyTint(int color, int tint) { + return colorBrigtness(ColorHelper.multiplyColor(color, tint), 1.5F); + } + + public static int colorDistance(int color1, int color2) { + int r1 = (color1 >> 16) & 255; + int g1 = (color1 >> 8) & 255; + int b1 = color1 & 255; + int r2 = (color2 >> 16) & 255; + int g2 = (color2 >> 8) & 255; + int b2 = color2 & 255; + return MHelper.pow2(r1 - r2) + MHelper.pow2(g1 - g2) + MHelper.pow2(b1 - b2); + } + + private static Map colorPalette = Maps.newHashMap(); + + public static int extractColor(Item item) { + ResourceLocation id = Registry.ITEM.getKey(item); + if (id.equals(Registry.ITEM.getDefaultKey())) return -1; + if (colorPalette.containsKey(id)) { + return colorPalette.get(id); + } + ResourceLocation texture; + if (item instanceof BlockItem) { + texture = new ResourceLocation(id.getNamespace(), "textures/block/" + id.getPath() + ".png"); + } else { + texture = new ResourceLocation(id.getNamespace(), "textures/item/" + id.getPath() + ".png"); + } + NativeImage image = loadImage(texture, 16, 16); + List colors = new ArrayList<>(); + for (int i = 0; i < image.getWidth(); i++) { + for (int j = 0; j < 16; j++) { + int col = image.getPixelRGBA(i, j); + if (((col >> 24) & 255) > 0) { + colors.add(ABGRtoARGB(col)); + } + } + } + image.close(); + + if (colors.size() == 0) return -1; + + ColorExtractor extractor = new ColorExtractor(colors); + int color = extractor.analize(); + colorPalette.put(id, color); + + return color; + } + + public static NativeImage loadImage(ResourceLocation image, int w, int h) { + Minecraft minecraft = Minecraft.getInstance(); + ResourceManager resourceManager = minecraft.getResourceManager(); + if (resourceManager.hasResource(image)) { + try (Resource resource = resourceManager.getResource(image)) { + return NativeImage.read(resource.getInputStream()); + } catch (IOException e) { + BetterEnd.LOGGER.warning("Can't load texture image: {}. Will be created empty image.", image); + BetterEnd.LOGGER.warning("Cause: {}.", e.getMessage()); + } + } + return new NativeImage(w, h, false); + } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/util/FeaturesHelper.java b/src/main/java/ru/betterend/util/FeaturesHelper.java index 476f5071..d2b9658c 100644 --- a/src/main/java/ru/betterend/util/FeaturesHelper.java +++ b/src/main/java/ru/betterend/util/FeaturesHelper.java @@ -4,12 +4,14 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.function.Supplier; + +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; + import net.minecraft.core.Registry; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; import ru.betterend.mixin.common.BiomeGenerationSettingsAccessor; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndStructures; diff --git a/src/main/java/ru/betterend/util/ItemUtil.java b/src/main/java/ru/betterend/util/ItemUtil.java index 954de98e..20f57987 100644 --- a/src/main/java/ru/betterend/util/ItemUtil.java +++ b/src/main/java/ru/betterend/util/ItemUtil.java @@ -1,72 +1,73 @@ -package ru.betterend.util; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import com.google.gson.JsonObject; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.GsonHelper; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import ru.betterend.BetterEnd; - -public class ItemUtil { - - public static String toStackString(@NotNull ItemStack stack) { - try { - if (stack == null) { - throw new IllegalStateException("Stack can't be null!"); - } - Item item = stack.getItem(); - return Registry.ITEM.getKey(item) + ":" + stack.getCount(); - } catch (Exception ex) { - BetterEnd.LOGGER.error("ItemStack serialization error!", ex); - } - return ""; - } - - @Nullable - public static ItemStack fromStackString(String stackString) { - if (stackString == null || stackString.equals("")) { - return null; - } - try { - String[] parts = stackString.split(":"); - if (parts.length < 2) return null; - if (parts.length == 2) { - ResourceLocation itemId = new ResourceLocation(stackString); - Item item = Registry.ITEM.getOptional(itemId).orElseThrow(() -> { - return new IllegalStateException("Output item " + itemId + " does not exists!"); - }); - return new ItemStack(item); - } - ResourceLocation itemId = new ResourceLocation(parts[0], parts[1]); - Item item = Registry.ITEM.getOptional(itemId).orElseThrow(() -> { - return new IllegalStateException("Output item " + itemId + " does not exists!"); - }); - return new ItemStack(item, Integer.valueOf(parts[2])); - } catch (Exception ex) { - BetterEnd.LOGGER.error("ItemStack deserialization error!", ex); - } - return null; - } - - @Nullable - public static ItemStack fromJsonRecipe(JsonObject recipe) { - try { - if (!recipe.has("item")) { - throw new IllegalStateException("Invalid JsonObject. Entry 'item' does not exists!"); - } - ResourceLocation itemId = new ResourceLocation(GsonHelper.getAsString(recipe, "item")); - Item item = Registry.ITEM.getOptional(itemId).orElseThrow(() -> { - return new IllegalStateException("Output item " + itemId + " does not exists!"); - }); - int count = GsonHelper.getAsInt(recipe, "count", 1); - return new ItemStack(item, count); - } catch (Exception ex) { - BetterEnd.LOGGER.error("ItemStack deserialization error!", ex); - } - return null; - } -} +package ru.betterend.util; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import com.google.gson.JsonObject; + +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import ru.betterend.BetterEnd; + +public class ItemUtil { + + public static String toStackString(@NotNull ItemStack stack) { + try { + if (stack == null) { + throw new IllegalStateException("Stack can't be null!"); + } + Item item = stack.getItem(); + return Registry.ITEM.getKey(item) + ":" + stack.getCount(); + } catch (Exception ex) { + BetterEnd.LOGGER.error("ItemStack serialization error!", ex); + } + return ""; + } + + @Nullable + public static ItemStack fromStackString(String stackString) { + if (stackString == null || stackString.equals("")) { + return null; + } + try { + String[] parts = stackString.split(":"); + if (parts.length < 2) return null; + if (parts.length == 2) { + ResourceLocation itemId = new ResourceLocation(stackString); + Item item = Registry.ITEM.getOptional(itemId).orElseThrow(() -> { + return new IllegalStateException("Output item " + itemId + " does not exists!"); + }); + return new ItemStack(item); + } + ResourceLocation itemId = new ResourceLocation(parts[0], parts[1]); + Item item = Registry.ITEM.getOptional(itemId).orElseThrow(() -> { + return new IllegalStateException("Output item " + itemId + " does not exists!"); + }); + return new ItemStack(item, Integer.valueOf(parts[2])); + } catch (Exception ex) { + BetterEnd.LOGGER.error("ItemStack deserialization error!", ex); + } + return null; + } + + @Nullable + public static ItemStack fromJsonRecipe(JsonObject recipe) { + try { + if (!recipe.has("item")) { + throw new IllegalStateException("Invalid JsonObject. Entry 'item' does not exists!"); + } + ResourceLocation itemId = new ResourceLocation(GsonHelper.getAsString(recipe, "item")); + Item item = Registry.ITEM.getOptional(itemId).orElseThrow(() -> { + return new IllegalStateException("Output item " + itemId + " does not exists!"); + }); + int count = GsonHelper.getAsInt(recipe, "count", 1); + return new ItemStack(item, count); + } catch (Exception ex) { + BetterEnd.LOGGER.error("ItemStack deserialization error!", ex); + } + return null; + } +} diff --git a/src/main/java/ru/betterend/util/MHelper.java b/src/main/java/ru/betterend/util/MHelper.java index 4d6d4d0a..ba74b438 100644 --- a/src/main/java/ru/betterend/util/MHelper.java +++ b/src/main/java/ru/betterend/util/MHelper.java @@ -1,7 +1,9 @@ package ru.betterend.util; -import com.mojang.math.Vector3f; import java.util.Random; + +import com.mojang.math.Vector3f; + import net.minecraft.world.phys.Vec3; public class MHelper { diff --git a/src/main/java/ru/betterend/util/SplineHelper.java b/src/main/java/ru/betterend/util/SplineHelper.java index 8dfef055..ed862612 100644 --- a/src/main/java/ru/betterend/util/SplineHelper.java +++ b/src/main/java/ru/betterend/util/SplineHelper.java @@ -4,13 +4,15 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.function.Function; + +import com.google.common.collect.Lists; +import com.mojang.math.Vector3f; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; -import com.google.common.collect.Lists; -import com.mojang.math.Vector3f; import ru.betterend.util.sdf.SDF; import ru.betterend.util.sdf.operator.SDFUnion; import ru.betterend.util.sdf.primitive.SDFLine; diff --git a/src/main/java/ru/betterend/util/StructureHelper.java b/src/main/java/ru/betterend/util/StructureHelper.java index 4274a66d..bf136865 100644 --- a/src/main/java/ru/betterend/util/StructureHelper.java +++ b/src/main/java/ru/betterend/util/StructureHelper.java @@ -10,6 +10,7 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import com.google.common.collect.Sets; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/ru/betterend/util/TagHelper.java b/src/main/java/ru/betterend/util/TagHelper.java index d4224e2c..af8a1d04 100644 --- a/src/main/java/ru/betterend/util/TagHelper.java +++ b/src/main/java/ru/betterend/util/TagHelper.java @@ -2,14 +2,16 @@ package ru.betterend.util; import java.util.Map; import java.util.Set; + +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; + import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.Tag; import net.minecraft.world.item.Item; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Block; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; public class TagHelper { private static final Map> TAGS_BLOCK = Maps.newConcurrentMap(); diff --git a/src/main/java/ru/betterend/util/TranslationHelper.java b/src/main/java/ru/betterend/util/TranslationHelper.java index cd6adfa7..92cdc229 100644 --- a/src/main/java/ru/betterend/util/TranslationHelper.java +++ b/src/main/java/ru/betterend/util/TranslationHelper.java @@ -4,11 +4,13 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.util.Collections; import java.util.List; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; + import com.google.common.collect.Lists; import com.google.gson.Gson; import com.google.gson.JsonObject; + +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndItems; diff --git a/src/main/java/ru/betterend/util/sdf/PosInfo.java b/src/main/java/ru/betterend/util/sdf/PosInfo.java index 74510770..9d7133f0 100644 --- a/src/main/java/ru/betterend/util/sdf/PosInfo.java +++ b/src/main/java/ru/betterend/util/sdf/PosInfo.java @@ -1,6 +1,7 @@ package ru.betterend.util.sdf; import java.util.Map; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.block.Blocks; diff --git a/src/main/java/ru/betterend/util/sdf/SDF.java b/src/main/java/ru/betterend/util/sdf/SDF.java index e288291e..6e446fdd 100644 --- a/src/main/java/ru/betterend/util/sdf/SDF.java +++ b/src/main/java/ru/betterend/util/sdf/SDF.java @@ -6,15 +6,17 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Function; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; import ru.betterend.util.BlocksHelper; import ru.betterend.world.structures.StructureWorld; diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFCoordModify.java b/src/main/java/ru/betterend/util/sdf/operator/SDFCoordModify.java index ccba6d7e..108a9c39 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFCoordModify.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFCoordModify.java @@ -1,8 +1,9 @@ package ru.betterend.util.sdf.operator; -import com.mojang.math.Vector3f; import java.util.function.Consumer; +import com.mojang.math.Vector3f; + public class SDFCoordModify extends SDFUnary { private static final Vector3f POS = new Vector3f(); private Consumer function; diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFDisplacement.java b/src/main/java/ru/betterend/util/sdf/operator/SDFDisplacement.java index 14e212b8..531d7158 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFDisplacement.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFDisplacement.java @@ -1,8 +1,9 @@ package ru.betterend.util.sdf.operator; -import com.mojang.math.Vector3f; import java.util.function.Function; +import com.mojang.math.Vector3f; + public class SDFDisplacement extends SDFUnary { private static final Vector3f POS = new Vector3f(); private Function displace; diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFHeightmap.java b/src/main/java/ru/betterend/util/sdf/operator/SDFHeightmap.java index 62c17d22..a05ebdad 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFHeightmap.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFHeightmap.java @@ -1,6 +1,7 @@ package ru.betterend.util.sdf.operator; import com.mojang.blaze3d.platform.NativeImage; + import net.minecraft.util.Mth; public class SDFHeightmap extends SDFDisplacement { diff --git a/src/main/java/ru/betterend/util/sdf/primitive/SDFPrimitive.java b/src/main/java/ru/betterend/util/sdf/primitive/SDFPrimitive.java index 27ef4f91..533a7496 100644 --- a/src/main/java/ru/betterend/util/sdf/primitive/SDFPrimitive.java +++ b/src/main/java/ru/betterend/util/sdf/primitive/SDFPrimitive.java @@ -1,6 +1,7 @@ package ru.betterend.util.sdf.primitive; import java.util.function.Function; + import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; diff --git a/src/main/java/ru/betterend/world/biome/BiomeDefinition.java b/src/main/java/ru/betterend/world/biome/BiomeDefinition.java index 687db4cb..0da55eba 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeDefinition.java +++ b/src/main/java/ru/betterend/world/biome/BiomeDefinition.java @@ -1,6 +1,9 @@ package ru.betterend.world.biome; import java.util.List; + +import com.google.common.collect.Lists; + import net.minecraft.core.Registry; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.resources.ResourceLocation; @@ -30,7 +33,6 @@ import net.minecraft.world.level.levelgen.feature.configurations.ProbabilityFeat import net.minecraft.world.level.levelgen.surfacebuilders.ConfiguredSurfaceBuilder; import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilder; import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderBaseConfiguration; -import com.google.common.collect.Lists; import ru.betterend.BetterEnd; import ru.betterend.registry.EndFeatures; import ru.betterend.util.MHelper; diff --git a/src/main/java/ru/betterend/world/biome/EndBiome.java b/src/main/java/ru/betterend/world/biome/EndBiome.java index 00e8bccc..bb9b957f 100644 --- a/src/main/java/ru/betterend/world/biome/EndBiome.java +++ b/src/main/java/ru/betterend/world/biome/EndBiome.java @@ -3,12 +3,14 @@ package ru.betterend.world.biome; import java.io.InputStream; import java.util.List; import java.util.Random; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.biome.Biome; + import com.google.common.collect.Lists; import com.google.gson.JsonArray; import com.google.gson.JsonObject; + +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.biome.Biome; import ru.betterend.config.Configs; import ru.betterend.util.JsonFactory; import ru.betterend.util.StructureHelper; diff --git a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java index 673f9556..26c07fbf 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java @@ -1,6 +1,7 @@ package ru.betterend.world.biome.cave; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.world.entity.ai.behavior.WeightedList; import net.minecraft.world.level.block.state.BlockState; diff --git a/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java b/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java index 9d880546..4a3a44ba 100644 --- a/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java +++ b/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java @@ -1,71 +1,72 @@ -package ru.betterend.world.features; - -import java.util.Random; -import net.minecraft.core.BlockPos; -import net.minecraft.core.BlockPos.MutableBlockPos; -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.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderBaseConfiguration; -import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderConfiguration; -import ru.betterend.noise.OpenSimplexNoise; -import ru.betterend.util.BlocksHelper; -import ru.betterend.util.sdf.SDF; -import ru.betterend.util.sdf.operator.SDFDisplacement; -import ru.betterend.util.sdf.operator.SDFTranslate; -import ru.betterend.util.sdf.primitive.SDFCappedCone; - -public class BiomeIslandFeature extends DefaultFeature { - private static final MutableBlockPos CENTER = new MutableBlockPos(); - private static final SDF ISLAND; - - private static OpenSimplexNoise simplexNoise = new OpenSimplexNoise(412L); - private static BlockState topBlock = Blocks.GRASS_BLOCK.defaultBlockState(); - private static BlockState underBlock = Blocks.DIRT.defaultBlockState(); - - @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - Biome biome = world.getBiome(pos); - SurfaceBuilderConfiguration surfaceConfig = biome.getGenerationSettings().getSurfaceBuilderConfig(); - BlockState topMaterial = surfaceConfig.getTopMaterial(); - if (BlocksHelper.isFluid(topMaterial)) { - topBlock = ((SurfaceBuilderBaseConfiguration) surfaceConfig).getUnderwaterMaterial(); - } else { - topBlock = topMaterial; - } - underBlock = surfaceConfig.getUnderMaterial(); - simplexNoise = new OpenSimplexNoise(world.getSeed()); - CENTER.set(pos); - ISLAND.fillRecursive(world, pos.below()); - return true; - } - - private static SDF createSDFIsland() { - SDF sdfCone = new SDFCappedCone().setRadius1(0).setRadius2(6).setHeight(4).setBlock(pos -> { - if (pos.getY() > CENTER.getY()) - return AIR; - if (pos.getY() == CENTER.getY()) - return topBlock; - return underBlock; - }); - sdfCone = new SDFTranslate().setTranslate(0, -2, 0).setSource(sdfCone); - sdfCone = new SDFDisplacement().setFunction(pos -> { - float deltaX = Math.abs(pos.x()); - float deltaY = Math.abs(pos.y()); - float deltaZ = Math.abs(pos.z()); - if (deltaY < 2.0f && (deltaX < 3.0f || deltaZ < 3.0F)) - return 0.0f; - return (float) simplexNoise.eval(CENTER.getX() + pos.x(), CENTER.getY() + pos.y(), CENTER.getZ() + pos.z()); - }).setSource(sdfCone) - .setReplaceFunction(state -> BlocksHelper.isFluid(state) || state.getMaterial().isReplaceable()); - return sdfCone; - } - - static { - ISLAND = createSDFIsland(); - } -} +package ru.betterend.world.features; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +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.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderBaseConfiguration; +import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderConfiguration; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFDisplacement; +import ru.betterend.util.sdf.operator.SDFTranslate; +import ru.betterend.util.sdf.primitive.SDFCappedCone; + +public class BiomeIslandFeature extends DefaultFeature { + private static final MutableBlockPos CENTER = new MutableBlockPos(); + private static final SDF ISLAND; + + private static OpenSimplexNoise simplexNoise = new OpenSimplexNoise(412L); + private static BlockState topBlock = Blocks.GRASS_BLOCK.defaultBlockState(); + private static BlockState underBlock = Blocks.DIRT.defaultBlockState(); + + @Override + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, + NoneFeatureConfiguration config) { + Biome biome = world.getBiome(pos); + SurfaceBuilderConfiguration surfaceConfig = biome.getGenerationSettings().getSurfaceBuilderConfig(); + BlockState topMaterial = surfaceConfig.getTopMaterial(); + if (BlocksHelper.isFluid(topMaterial)) { + topBlock = ((SurfaceBuilderBaseConfiguration) surfaceConfig).getUnderwaterMaterial(); + } else { + topBlock = topMaterial; + } + underBlock = surfaceConfig.getUnderMaterial(); + simplexNoise = new OpenSimplexNoise(world.getSeed()); + CENTER.set(pos); + ISLAND.fillRecursive(world, pos.below()); + return true; + } + + private static SDF createSDFIsland() { + SDF sdfCone = new SDFCappedCone().setRadius1(0).setRadius2(6).setHeight(4).setBlock(pos -> { + if (pos.getY() > CENTER.getY()) + return AIR; + if (pos.getY() == CENTER.getY()) + return topBlock; + return underBlock; + }); + sdfCone = new SDFTranslate().setTranslate(0, -2, 0).setSource(sdfCone); + sdfCone = new SDFDisplacement().setFunction(pos -> { + float deltaX = Math.abs(pos.x()); + float deltaY = Math.abs(pos.y()); + float deltaZ = Math.abs(pos.z()); + if (deltaY < 2.0f && (deltaX < 3.0f || deltaZ < 3.0F)) + return 0.0f; + return (float) simplexNoise.eval(CENTER.getX() + pos.x(), CENTER.getY() + pos.y(), CENTER.getZ() + pos.z()); + }).setSource(sdfCone) + .setReplaceFunction(state -> BlocksHelper.isFluid(state) || state.getMaterial().isReplaceable()); + return sdfCone; + } + + static { + ISLAND = createSDFIsland(); + } +} diff --git a/src/main/java/ru/betterend/world/features/BlueVineFeature.java b/src/main/java/ru/betterend/world/features/BlueVineFeature.java index 92fd0862..27452987 100644 --- a/src/main/java/ru/betterend/world/features/BlueVineFeature.java +++ b/src/main/java/ru/betterend/world/features/BlueVineFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; diff --git a/src/main/java/ru/betterend/world/features/CavePlantFeature.java b/src/main/java/ru/betterend/world/features/CavePlantFeature.java index c3ed7edb..760eafc2 100644 --- a/src/main/java/ru/betterend/world/features/CavePlantFeature.java +++ b/src/main/java/ru/betterend/world/features/CavePlantFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java b/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java index 09016953..05d4788a 100644 --- a/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java +++ b/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.chunk.ChunkGenerator; diff --git a/src/main/java/ru/betterend/world/features/CrashedShipFeature.java b/src/main/java/ru/betterend/world/features/CrashedShipFeature.java index 64a5838e..66d34061 100644 --- a/src/main/java/ru/betterend/world/features/CrashedShipFeature.java +++ b/src/main/java/ru/betterend/world/features/CrashedShipFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.LevelReader; diff --git a/src/main/java/ru/betterend/world/features/DoublePlantFeature.java b/src/main/java/ru/betterend/world/features/DoublePlantFeature.java index 8f1fa22a..9cd9a790 100644 --- a/src/main/java/ru/betterend/world/features/DoublePlantFeature.java +++ b/src/main/java/ru/betterend/world/features/DoublePlantFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/ru/betterend/world/features/EndLilyFeature.java b/src/main/java/ru/betterend/world/features/EndLilyFeature.java index 6172ddf4..4ecbd3cf 100644 --- a/src/main/java/ru/betterend/world/features/EndLilyFeature.java +++ b/src/main/java/ru/betterend/world/features/EndLilyFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.EndLilySeedBlock; diff --git a/src/main/java/ru/betterend/world/features/EndLotusFeature.java b/src/main/java/ru/betterend/world/features/EndLotusFeature.java index ce462ce3..dc65d14a 100644 --- a/src/main/java/ru/betterend/world/features/EndLotusFeature.java +++ b/src/main/java/ru/betterend/world/features/EndLotusFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.EndLotusSeedBlock; diff --git a/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java b/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java index 9701f584..207a20ae 100644 --- a/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java +++ b/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/ru/betterend/world/features/FilaluxFeature.java b/src/main/java/ru/betterend/world/features/FilaluxFeature.java index 8ad288b0..e30c60de 100644 --- a/src/main/java/ru/betterend/world/features/FilaluxFeature.java +++ b/src/main/java/ru/betterend/world/features/FilaluxFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; diff --git a/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java b/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java index 4de057f0..c1a37cda 100644 --- a/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; diff --git a/src/main/java/ru/betterend/world/features/GlowPillarFeature.java b/src/main/java/ru/betterend/world/features/GlowPillarFeature.java index 64aea15c..b8a1d6f2 100644 --- a/src/main/java/ru/betterend/world/features/GlowPillarFeature.java +++ b/src/main/java/ru/betterend/world/features/GlowPillarFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; diff --git a/src/main/java/ru/betterend/world/features/HydraluxFeature.java b/src/main/java/ru/betterend/world/features/HydraluxFeature.java index 08f7f35c..73d6b4ec 100644 --- a/src/main/java/ru/betterend/world/features/HydraluxFeature.java +++ b/src/main/java/ru/betterend/world/features/HydraluxFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.HydraluxSaplingBlock; diff --git a/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java b/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java index 4478357d..6b9b7da8 100644 --- a/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; diff --git a/src/main/java/ru/betterend/world/features/LanceleafFeature.java b/src/main/java/ru/betterend/world/features/LanceleafFeature.java index 6724b0b0..5800a71f 100644 --- a/src/main/java/ru/betterend/world/features/LanceleafFeature.java +++ b/src/main/java/ru/betterend/world/features/LanceleafFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; diff --git a/src/main/java/ru/betterend/world/features/ListFeature.java b/src/main/java/ru/betterend/world/features/ListFeature.java index 15c980c4..899e16d0 100644 --- a/src/main/java/ru/betterend/world/features/ListFeature.java +++ b/src/main/java/ru/betterend/world/features/ListFeature.java @@ -2,6 +2,7 @@ package ru.betterend.world.features; import java.util.List; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Mirror; diff --git a/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java b/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java index 669c8f7f..2a859ab1 100644 --- a/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java +++ b/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java @@ -2,6 +2,7 @@ package ru.betterend.world.features; import java.util.Random; import java.util.function.Function; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; diff --git a/src/main/java/ru/betterend/world/features/NBTStructureFeature.java b/src/main/java/ru/betterend/world/features/NBTStructureFeature.java index 65bb5d14..8ca4639c 100644 --- a/src/main/java/ru/betterend/world/features/NBTStructureFeature.java +++ b/src/main/java/ru/betterend/world/features/NBTStructureFeature.java @@ -3,6 +3,7 @@ package ru.betterend.world.features; import java.io.IOException; import java.io.InputStream; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/ru/betterend/world/features/NeonCactusFeature.java b/src/main/java/ru/betterend/world/features/NeonCactusFeature.java index 9a018747..3bdb8c1d 100644 --- a/src/main/java/ru/betterend/world/features/NeonCactusFeature.java +++ b/src/main/java/ru/betterend/world/features/NeonCactusFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/ru/betterend/world/features/ScatterFeature.java b/src/main/java/ru/betterend/world/features/ScatterFeature.java index 833985ef..fad40d0e 100644 --- a/src/main/java/ru/betterend/world/features/ScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/ScatterFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; diff --git a/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java b/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java index d8383f44..0fbac2e2 100644 --- a/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java +++ b/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java b/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java index 20d87cec..2f91ca33 100644 --- a/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; diff --git a/src/main/java/ru/betterend/world/features/SinglePlantFeature.java b/src/main/java/ru/betterend/world/features/SinglePlantFeature.java index be176c6b..fd58b83f 100644 --- a/src/main/java/ru/betterend/world/features/SinglePlantFeature.java +++ b/src/main/java/ru/betterend/world/features/SinglePlantFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/ru/betterend/world/features/SkyScatterFeature.java b/src/main/java/ru/betterend/world/features/SkyScatterFeature.java index d2e1eaeb..1ca53a94 100644 --- a/src/main/java/ru/betterend/world/features/SkyScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/SkyScatterFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java b/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java index 5b0ce2dc..9ee99007 100644 --- a/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java +++ b/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java b/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java index 3c40c55f..c97f15df 100644 --- a/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java +++ b/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java @@ -1,6 +1,7 @@ package ru.betterend.world.features; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; diff --git a/src/main/java/ru/betterend/world/features/VineFeature.java b/src/main/java/ru/betterend/world/features/VineFeature.java index 3cca3e78..8e31591a 100644 --- a/src/main/java/ru/betterend/world/features/VineFeature.java +++ b/src/main/java/ru/betterend/world/features/VineFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/ru/betterend/world/features/WallPlantFeature.java b/src/main/java/ru/betterend/world/features/WallPlantFeature.java index 54e61ee0..8d38ffaf 100644 --- a/src/main/java/ru/betterend/world/features/WallPlantFeature.java +++ b/src/main/java/ru/betterend/world/features/WallPlantFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; diff --git a/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java b/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java index 7a4b2681..7ca5cb1e 100644 --- a/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java +++ b/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.tags.BlockTags; diff --git a/src/main/java/ru/betterend/world/features/WallScatterFeature.java b/src/main/java/ru/betterend/world/features/WallScatterFeature.java index 052e9dd5..5563c1ed 100644 --- a/src/main/java/ru/betterend/world/features/WallScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/WallScatterFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/ru/betterend/world/features/bushes/BushFeature.java b/src/main/java/ru/betterend/world/features/bushes/BushFeature.java index e557592e..740f853e 100644 --- a/src/main/java/ru/betterend/world/features/bushes/BushFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/BushFeature.java @@ -2,6 +2,7 @@ package ru.betterend.world.features.bushes; import java.util.Random; import java.util.function.Function; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; diff --git a/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java b/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java index 4de7f7ec..79713f00 100644 --- a/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java @@ -2,6 +2,7 @@ package ru.betterend.world.features.bushes; import java.util.Random; import java.util.function.Function; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; diff --git a/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java b/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java index 45d6f250..3b5de04e 100644 --- a/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features.bushes; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java b/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java index 0b1cfa55..5598f080 100644 --- a/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java +++ b/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java @@ -1,6 +1,7 @@ package ru.betterend.world.features.bushes; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java index 3e0901d2..a6beb01d 100644 --- a/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java @@ -3,6 +3,9 @@ package ru.betterend.world.features.bushes; import java.util.List; import java.util.Random; import java.util.function.Function; + +import com.google.common.collect.Lists; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -12,7 +15,6 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; -import com.google.common.collect.Lists; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.FurBlock; diff --git a/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java b/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java index c471ab5f..25e2de29 100644 --- a/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java @@ -1,7 +1,9 @@ package ru.betterend.world.features.terrain; -import com.mojang.math.Vector3f; import java.util.Random; + +import com.mojang.math.Vector3f; + import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.chunk.ChunkGenerator; diff --git a/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java index 788dd936..b2cc2103 100644 --- a/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features.terrain; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; diff --git a/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java b/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java index 0cd32d05..0613e2ac 100644 --- a/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java @@ -1,7 +1,9 @@ package ru.betterend.world.features.terrain; -import com.mojang.math.Vector3f; import java.util.Random; + +import com.mojang.math.Vector3f; + import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; diff --git a/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java index 3eefb3d6..878fba9a 100644 --- a/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java @@ -2,13 +2,15 @@ package ru.betterend.world.features.terrain; import java.util.List; import java.util.Random; + +import com.google.common.collect.Lists; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import com.google.common.collect.Lists; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndFeatures; diff --git a/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java b/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java index d565d233..40655747 100644 --- a/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java @@ -1,8 +1,10 @@ package ru.betterend.world.features.terrain; -import com.mojang.math.Vector3f; import java.util.Random; import java.util.function.Function; + +import com.mojang.math.Vector3f; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java b/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java index d106c5c9..7dc540e8 100644 --- a/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java @@ -1,9 +1,11 @@ package ru.betterend.world.features.terrain; -import com.mojang.math.Vector3f; import java.util.ArrayList; import java.util.List; import java.util.Random; + +import com.mojang.math.Vector3f; + import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; diff --git a/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java b/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java index a47a0eb5..4f10ad23 100644 --- a/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features.terrain; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; diff --git a/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java b/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java index 923b39e6..66d1bc3d 100644 --- a/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java @@ -1,7 +1,9 @@ package ru.betterend.world.features.terrain; -import com.mojang.math.Vector3f; import java.util.Random; + +import com.mojang.math.Vector3f; + import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; diff --git a/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java b/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java index 2e8624b3..b1ec8284 100644 --- a/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features.terrain; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; diff --git a/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java b/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java index a1f1aca3..d35ce510 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features.terrain; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java b/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java index 66aac613..ee4be50f 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features.terrain; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; diff --git a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java index 980d436d..bcb3c382 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java @@ -3,6 +3,9 @@ package ru.betterend.world.features.terrain; import java.util.List; import java.util.Random; import java.util.function.Function; + +import com.google.common.collect.Lists; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; @@ -12,7 +15,6 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; -import com.google.common.collect.Lists; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndFeatures; diff --git a/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java b/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java index bfc53e91..76522f31 100644 --- a/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features.terrain; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.util.Mth; diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java index cab6b03f..639ffb06 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features.terrain; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java index e02cf7cb..58e0480f 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java @@ -2,6 +2,9 @@ package ru.betterend.world.features.terrain; import java.util.Random; import java.util.Set; + +import com.google.common.collect.Sets; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -13,7 +16,6 @@ import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; -import com.google.common.collect.Sets; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.SulphurCrystalBlock; import ru.betterend.noise.OpenSimplexNoise; diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java index 50de79e8..46ac438e 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java @@ -2,6 +2,9 @@ package ru.betterend.world.features.terrain; import java.util.Random; import java.util.Set; + +import com.google.common.collect.Sets; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -11,7 +14,6 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Fluids; -import com.google.common.collect.Sets; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.SulphurCrystalBlock; import ru.betterend.noise.OpenSimplexNoise; diff --git a/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java b/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java index 1ddf691e..84ce8055 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.features.terrain; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java index d01a6dad..91aa7714 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java @@ -3,6 +3,9 @@ package ru.betterend.world.features.terrain.caves; import java.util.Random; import java.util.Set; import java.util.function.Supplier; + +import com.google.common.collect.Sets; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; @@ -12,7 +15,6 @@ import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import com.google.common.collect.Sets; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; import ru.betterend.world.biome.cave.EndCaveBiome; 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 8142416a..0afc7c87 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 @@ -81,8 +81,7 @@ public abstract class EndCaveFeature extends DefaultFeature { protected abstract Set generate(WorldGenLevel world, BlockPos center, int radius, Random random); - protected void placeFloor(WorldGenLevel world, EndCaveBiome biome, Set floorPositions, Random random, - BlockState surfaceBlock) { + protected void placeFloor(WorldGenLevel world, EndCaveBiome biome, Set floorPositions, Random random, BlockState surfaceBlock) { float density = biome.getFloorDensity(); floorPositions.forEach((pos) -> { BlocksHelper.setWithoutUpdate(world, pos, surfaceBlock); 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 bcdffd3e..726d1873 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,12 +2,14 @@ package ru.betterend.world.features.terrain.caves; import java.util.Random; import java.util.Set; + +import com.google.common.collect.Sets; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; -import com.google.common.collect.Sets; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; 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 7a3db063..c907b07d 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 @@ -1,10 +1,12 @@ package ru.betterend.world.features.terrain.caves; -import com.mojang.math.Vector3f; import java.util.List; import java.util.Random; import java.util.Set; import java.util.function.Function; + +import com.mojang.math.Vector3f; + import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; diff --git a/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java index b9bf59a0..47f71a2b 100644 --- a/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java @@ -3,6 +3,10 @@ package ru.betterend.world.features.trees; import java.util.List; import java.util.Random; import java.util.function.Function; + +import com.google.common.collect.Lists; +import com.mojang.math.Vector3f; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -12,8 +16,6 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; -import com.google.common.collect.Lists; -import com.mojang.math.Vector3f; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; diff --git a/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java b/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java index af633bfd..1f89af04 100644 --- a/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java @@ -1,9 +1,11 @@ package ru.betterend.world.features.trees; -import com.mojang.math.Vector3f; import java.util.List; import java.util.Random; import java.util.function.Function; + +import com.mojang.math.Vector3f; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java index 2b294fa0..75ac74f7 100644 --- a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java @@ -1,10 +1,12 @@ package ru.betterend.world.features.trees; -import com.mojang.math.Vector3f; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.function.Function; + +import com.mojang.math.Vector3f; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.util.Mth; diff --git a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java index d553bc59..7ffbc9a3 100644 --- a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java @@ -3,6 +3,10 @@ package ru.betterend.world.features.trees; import java.util.List; import java.util.Random; import java.util.function.Function; + +import com.google.common.collect.Lists; +import com.mojang.math.Vector3f; + import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; @@ -10,8 +14,6 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; -import com.google.common.collect.Lists; -import com.mojang.math.Vector3f; import ru.betterend.blocks.JellyshroomCapBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; diff --git a/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java b/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java index 2c235cd0..c35edc9d 100644 --- a/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java @@ -1,9 +1,11 @@ package ru.betterend.world.features.trees; -import com.mojang.math.Vector3f; import java.util.List; import java.util.Random; import java.util.function.Function; + +import com.mojang.math.Vector3f; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java b/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java index 4ad56fb5..45c6e34f 100644 --- a/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java @@ -3,6 +3,10 @@ package ru.betterend.world.features.trees; import java.util.List; import java.util.Random; import java.util.function.Function; + +import com.google.common.collect.Lists; +import com.mojang.math.Vector3f; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -12,8 +16,6 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; -import com.google.common.collect.Lists; -import com.mojang.math.Vector3f; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.FurBlock; diff --git a/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java index d51eaac2..0208167d 100644 --- a/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java @@ -1,9 +1,11 @@ package ru.betterend.world.features.trees; -import com.mojang.math.Vector3f; import java.util.List; import java.util.Random; import java.util.function.Function; + +import com.mojang.math.Vector3f; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; diff --git a/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java index 17254bee..1cc92aa8 100644 --- a/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java @@ -1,9 +1,11 @@ package ru.betterend.world.features.trees; -import com.mojang.math.Vector3f; import java.util.List; import java.util.Random; import java.util.function.Function; + +import com.mojang.math.Vector3f; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java b/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java index 6a9164a2..0ef7a3e5 100644 --- a/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java @@ -3,6 +3,10 @@ package ru.betterend.world.features.trees; import java.util.List; import java.util.Random; import java.util.function.Function; + +import com.google.common.collect.Lists; +import com.mojang.math.Vector3f; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -12,8 +16,6 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; -import com.google.common.collect.Lists; -import com.mojang.math.Vector3f; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.FurBlock; diff --git a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java index b2ab2b2a..455ed41f 100644 --- a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java @@ -3,6 +3,10 @@ package ru.betterend.world.features.trees; import java.util.List; import java.util.Random; import java.util.function.Function; + +import com.google.common.collect.Lists; +import com.mojang.math.Vector3f; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -12,8 +16,6 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; -import com.google.common.collect.Lists; -import com.mojang.math.Vector3f; import ru.betterend.blocks.UmbrellaTreeClusterBlock; import ru.betterend.blocks.UmbrellaTreeMembraneBlock; import ru.betterend.registry.EndBlocks; diff --git a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java index e5bd64d9..6c85f2ab 100644 --- a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java +++ b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java @@ -1,6 +1,11 @@ package ru.betterend.world.generator; import java.util.List; + +import com.google.common.collect.Lists; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + import net.minecraft.core.Registry; import net.minecraft.resources.RegistryLookupCodec; import net.minecraft.world.level.biome.Biome; @@ -9,9 +14,6 @@ import net.minecraft.world.level.biome.Biomes; import net.minecraft.world.level.biome.TheEndBiomeSource; import net.minecraft.world.level.levelgen.WorldgenRandom; import net.minecraft.world.level.levelgen.synth.SimplexNoise; -import com.google.common.collect.Lists; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; import ru.betterend.BetterEnd; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; diff --git a/src/main/java/ru/betterend/world/generator/BiomeMap.java b/src/main/java/ru/betterend/world/generator/BiomeMap.java index 5a12b27b..1aa8c3c8 100644 --- a/src/main/java/ru/betterend/world/generator/BiomeMap.java +++ b/src/main/java/ru/betterend/world/generator/BiomeMap.java @@ -1,9 +1,11 @@ package ru.betterend.world.generator; import java.util.Map; + +import com.google.common.collect.Maps; + import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.levelgen.WorldgenRandom; -import com.google.common.collect.Maps; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; import ru.betterend.world.biome.EndBiome; diff --git a/src/main/java/ru/betterend/world/generator/BiomePicker.java b/src/main/java/ru/betterend/world/generator/BiomePicker.java index b237a1e5..8239777f 100644 --- a/src/main/java/ru/betterend/world/generator/BiomePicker.java +++ b/src/main/java/ru/betterend/world/generator/BiomePicker.java @@ -3,9 +3,11 @@ package ru.betterend.world.generator; import java.util.List; import java.util.Random; import java.util.Set; -import net.minecraft.resources.ResourceLocation; + import com.google.common.collect.Lists; import com.google.common.collect.Sets; + +import net.minecraft.resources.ResourceLocation; import ru.betterend.world.biome.EndBiome; public class BiomePicker { diff --git a/src/main/java/ru/betterend/world/generator/IslandLayer.java b/src/main/java/ru/betterend/world/generator/IslandLayer.java index 7fcc6919..fc98a264 100644 --- a/src/main/java/ru/betterend/world/generator/IslandLayer.java +++ b/src/main/java/ru/betterend/world/generator/IslandLayer.java @@ -4,9 +4,11 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Random; -import net.minecraft.core.BlockPos; + import com.google.common.collect.Lists; import com.google.common.collect.Maps; + +import net.minecraft.core.BlockPos; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; import ru.betterend.util.sdf.SDF; diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index 6b2818d8..b4ce4e53 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -4,10 +4,12 @@ import java.awt.Point; import java.util.List; import java.util.Random; import java.util.concurrent.locks.ReentrantLock; + +import com.google.common.collect.Lists; + import net.minecraft.util.Mth; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.BiomeSource; -import com.google.common.collect.Lists; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; diff --git a/src/main/java/ru/betterend/world/structures/StructureWorld.java b/src/main/java/ru/betterend/world/structures/StructureWorld.java index 9374441e..5ae3f4f3 100644 --- a/src/main/java/ru/betterend/world/structures/StructureWorld.java +++ b/src/main/java/ru/betterend/world/structures/StructureWorld.java @@ -3,6 +3,7 @@ package ru.betterend.world.structures; import java.util.Map; import com.google.common.collect.Maps; + import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; diff --git a/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java b/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java index cf36a3ac..a3986e2f 100644 --- a/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java @@ -1,6 +1,7 @@ package ru.betterend.world.structures.features; import java.util.Random; + import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.BiomeSource; diff --git a/src/main/java/ru/betterend/world/structures/features/GiantIceStarStructure.java b/src/main/java/ru/betterend/world/structures/features/GiantIceStarStructure.java index 456c8183..d844fa06 100644 --- a/src/main/java/ru/betterend/world/structures/features/GiantIceStarStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/GiantIceStarStructure.java @@ -1,9 +1,11 @@ package ru.betterend.world.structures.features; -import com.mojang.math.Vector3f; import java.util.ArrayList; import java.util.List; import java.util.Random; + +import com.mojang.math.Vector3f; + import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; import net.minecraft.world.level.biome.Biome; diff --git a/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java b/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java index 3def5bb3..6cf3b28a 100644 --- a/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java @@ -1,8 +1,10 @@ package ru.betterend.world.structures.features; -import com.mojang.math.Vector3f; import java.util.List; import java.util.Random; + +import com.mojang.math.Vector3f; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import ru.betterend.blocks.MossyGlowshroomCapBlock; diff --git a/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java b/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java index 299b8477..75acf8e9 100644 --- a/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java +++ b/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java @@ -1,6 +1,7 @@ package ru.betterend.world.structures.features; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; import net.minecraft.world.level.biome.Biome; diff --git a/src/main/java/ru/betterend/world/structures/piece/CavePiece.java b/src/main/java/ru/betterend/world/structures/piece/CavePiece.java index fef5d2f0..8bd1755d 100644 --- a/src/main/java/ru/betterend/world/structures/piece/CavePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/CavePiece.java @@ -1,6 +1,7 @@ package ru.betterend.world.structures.piece; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java index e85ca44d..946ba467 100644 --- a/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java @@ -1,6 +1,7 @@ package ru.betterend.world.structures.piece; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java index 7200068a..eee3fdf1 100644 --- a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java @@ -4,6 +4,7 @@ import java.util.Map; import java.util.Random; import com.google.common.collect.Maps; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java index 95f10b32..31c30b58 100644 --- a/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java @@ -4,6 +4,7 @@ import java.util.Map; import java.util.Random; import com.google.common.collect.Maps; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java b/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java index 63fa5bd7..9cf35d99 100644 --- a/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java @@ -1,6 +1,7 @@ package ru.betterend.world.structures.piece; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; diff --git a/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java index 915c9126..cbc18a5e 100644 --- a/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java @@ -1,6 +1,7 @@ package ru.betterend.world.structures.piece; import java.util.Random; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java b/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java index 07276d85..1837d3eb 100644 --- a/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java @@ -2,6 +2,7 @@ package ru.betterend.world.structures.piece; import java.util.Random; import java.util.function.Consumer; + import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.ChunkPos; diff --git a/src/main/java/ru/betterend/world/surface/DoubleBlockSurfaceBuilder.java b/src/main/java/ru/betterend/world/surface/DoubleBlockSurfaceBuilder.java index b69dc71a..4e63a4f2 100644 --- a/src/main/java/ru/betterend/world/surface/DoubleBlockSurfaceBuilder.java +++ b/src/main/java/ru/betterend/world/surface/DoubleBlockSurfaceBuilder.java @@ -1,6 +1,7 @@ package ru.betterend.world.surface; import java.util.Random; + import net.minecraft.core.Registry; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java b/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java index e9317b48..5d020a83 100644 --- a/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java +++ b/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java @@ -1,6 +1,7 @@ package ru.betterend.world.surface; import java.util.Random; + import net.minecraft.core.Registry; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.state.BlockState; diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 2d63c8a3..140e8f20 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -316,6 +316,7 @@ "block.betterend.quartz_lantern": "Quartz Lantern", "item.betterend.bucket_end_fish": "Bucket of End Fish", + "item.betterend.bucket_cubozoa": "Bucket of Cubozoa", "item.betterend.end_fish_cooked": "Cooked End Fish", "item.betterend.end_fish_raw": "End Fish", diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index d23383e6..ae48d1e6 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -318,6 +318,7 @@ "block.betterend.quartz_lantern": "Кварцевый фонарь", "item.betterend.bucket_end_fish": "Ведро с рыбой Края", + "item.betterend.bucket_cubozoa": "Ведро с кубомедузой", "item.betterend.end_fish_cooked": "Приготовленная рыба Края", "item.betterend.end_fish_raw": "Рыба Края", diff --git a/src/main/resources/assets/betterend/textures/item/bucket_cubozoa.png b/src/main/resources/assets/betterend/textures/item/bucket_cubozoa.png new file mode 100644 index 0000000000000000000000000000000000000000..6b1e88c42bcf7b84deacfb1570d7868c63d65b05 GIT binary patch literal 1633 zcmV-n2A=teP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3yslIti8M*p*lSpoutU^$pa)!o4?e?A^2iR13- z&Rn}~a5hPLd-#<G1ZeLTOv|kGT zlA|RjzR2x%W3JRr&o2W;wCLySDR-@v&|00VOU@%xUadu)OBp>V9!RAf(>!j$htZdD zN8ABR%pg`k^T3@IMKZ{CBS(c2HL9b{lo6sc)d*T+G8lAOuwtUg06<7QZfZtsv_*l4 zu^H4X#Ae4r!*3k^G6i@p1Wjy)48P|6R(HZr?ro^GUb@(QVdn~QnO@U0>EKja8UJW@vaWS2SnEIH(uQ!&LBZ2#hms1iynsZvELRad$C zDmBztQ$wva+g#)3o3zkkOPkuF`bv#1Et>y9St@G8&D(ea0+!|Am}O?ZnW7w$bHLAvHKM_^A$PO(fti_s-s)v z-nrdSD`|YA*a4{T!k$xY8xA%o)R0U_{X6O7R{dWC_l6p~-Z94!n&@VZ`4(K$xw$ys zl4~yKH55a$x?q;NA37};_cXa#|D!@iS|P{8kuoZ-cO8B% zc;X>VRJ^ZCBjzyWY7R)uPa|p0C`J-Sj`@}|>g_c8-m2LVe=L!}?ikjTS76O0#ASxP z-p*vis98oY^jpnE`>BO6mpv?LbeM{s5jE@Z1y&`V9*LjBQa5ov!t-UtBpJW!{4w7u z>@{q}kyGcUBZVb|X8wYr6yr4A&x?F6(YqOH%~Wx)g&8V-xW!s2^HkIN zia9LHQ&231dCxVrsCVAOa7qQ*QqrAWt@m2%&T z%=D@LgLe}R?cRJNojzw1eL&;j%sNcc;3P1A2%3Bw^|u5k<)zs*gvdH_6)na$0XA9Ex1HPB5lZXe+-QM<_1UrEq7A@!$+>o@p+>iw=&pHBSD z5dIYv{JU2F0f1??Xd#zUb^rhX24YJ`L;x%RegJ_vqK}pU000SaNLh0L04^f{04^f| zc%?sf00007bV*G`2jv731~oG4ruM-A00CJ^L_t(I%dL{JPQp+WhQDHwAjnXNi9{0y zw9!SDs}oaSfz1bSGI7uca5kNM0EUh{0~2B4E_IPK>C95nffzbatOnaHOGZm=#s&>y_xr}~L1|VKWd`1y(i`Sn-RYArB z$8m677u&XBv1xL*+oj!Z)9?55O$6w4IyjC4fa|&dgkgy9`?-@V` Date: Mon, 19 Apr 2021 21:38:14 +0300 Subject: [PATCH 427/463] Fixes --- .../java/ru/betterend/config/Configs.java | 61 +++++++++---------- .../ru/betterend/config/PortalsConfig.java | 19 ------ .../ru/betterend/entity/CubozoaEntity.java | 23 ++++--- .../ru/betterend/entity/EndFishEntity.java | 19 +++--- .../mixin/common/ServerLevelMixin.java | 1 - 5 files changed, 56 insertions(+), 67 deletions(-) delete mode 100644 src/main/java/ru/betterend/config/PortalsConfig.java diff --git a/src/main/java/ru/betterend/config/Configs.java b/src/main/java/ru/betterend/config/Configs.java index 4119842a..f1bc46e5 100644 --- a/src/main/java/ru/betterend/config/Configs.java +++ b/src/main/java/ru/betterend/config/Configs.java @@ -1,31 +1,30 @@ -package ru.betterend.config; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import ru.betterend.BetterEnd; - -public class Configs { - public static final PathConfig ENTITY_CONFIG = new PathConfig("entities"); - public static final PathConfig BLOCK_CONFIG = new PathConfig("blocks"); - public static final PathConfig ITEM_CONFIG = new PathConfig("items"); - public static final IdConfig BIOME_CONFIG = new EntryConfig("biomes"); - public static final PathConfig GENERATOR_CONFIG = new PathConfig("generator"); - public static final PathConfig RECIPE_CONFIG = new PathConfig("recipes"); - public static final PortalsConfig PORTALS_CONFIG = new PortalsConfig("portals"); - - @Environment(value = EnvType.CLIENT) - public static final PathConfig CLENT_CONFIG = new PathConfig("client"); - - public static void saveConfigs() { - ENTITY_CONFIG.saveChanges(); - BLOCK_CONFIG.saveChanges(); - BIOME_CONFIG.saveChanges(); - ITEM_CONFIG.saveChanges(); - GENERATOR_CONFIG.saveChanges(); - RECIPE_CONFIG.saveChanges(); - - if (BetterEnd.isClient()) { - CLENT_CONFIG.saveChanges(); - } - } -} +package ru.betterend.config; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import ru.betterend.BetterEnd; + +public class Configs { + public static final PathConfig ENTITY_CONFIG = new PathConfig("entities"); + public static final PathConfig BLOCK_CONFIG = new PathConfig("blocks"); + public static final PathConfig ITEM_CONFIG = new PathConfig("items"); + public static final IdConfig BIOME_CONFIG = new EntryConfig("biomes"); + public static final PathConfig GENERATOR_CONFIG = new PathConfig("generator"); + public static final PathConfig RECIPE_CONFIG = new PathConfig("recipes"); + + @Environment(value = EnvType.CLIENT) + public static final PathConfig CLENT_CONFIG = new PathConfig("client"); + + public static void saveConfigs() { + ENTITY_CONFIG.saveChanges(); + BLOCK_CONFIG.saveChanges(); + BIOME_CONFIG.saveChanges(); + ITEM_CONFIG.saveChanges(); + GENERATOR_CONFIG.saveChanges(); + RECIPE_CONFIG.saveChanges(); + + if (BetterEnd.isClient()) { + CLENT_CONFIG.saveChanges(); + } + } +} diff --git a/src/main/java/ru/betterend/config/PortalsConfig.java b/src/main/java/ru/betterend/config/PortalsConfig.java deleted file mode 100644 index eefe4534..00000000 --- a/src/main/java/ru/betterend/config/PortalsConfig.java +++ /dev/null @@ -1,19 +0,0 @@ -package ru.betterend.config; - -import com.google.gson.JsonObject; - -public class PortalsConfig { - - - private final ConfigWriter writer; - private final JsonObject configObject; - - public PortalsConfig(String path) { - this.writer = new ConfigWriter(path); - this.configObject = writer.load(); - } - - public void saveChanges() { - writer.save(); - } -} diff --git a/src/main/java/ru/betterend/entity/CubozoaEntity.java b/src/main/java/ru/betterend/entity/CubozoaEntity.java index 3d45e55f..7b2e0cae 100644 --- a/src/main/java/ru/betterend/entity/CubozoaEntity.java +++ b/src/main/java/ru/betterend/entity/CubozoaEntity.java @@ -49,15 +49,20 @@ public class CubozoaEntity extends AbstractSchoolingFish { @Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, SpawnGroupData entityData, CompoundTag entityTag) { SpawnGroupData data = super.finalizeSpawn(world, difficulty, spawnReason, entityData, entityTag); - if (entityTag != null) { - if (entityTag.contains("variant")) - this.entityData.set(VARIANT, entityTag.getByte("variant")); - if (entityTag.contains("scale")) - this.entityData.set(SCALE, entityTag.getByte("scale")); - } - else if (EndBiomes.getFromBiome(world.getBiome(blockPosition())) == EndBiomes.SULPHUR_SPRINGS) { + + if (EndBiomes.getFromBiome(world.getBiome(blockPosition())) == EndBiomes.SULPHUR_SPRINGS) { this.entityData.set(VARIANT, (byte) 1); } + + if (entityTag != null) { + if (entityTag.contains("Variant")) { + this.entityData.set(VARIANT, entityTag.getByte("Variant")); + } + if (entityTag.contains("Scale")) { + this.entityData.set(SCALE, entityTag.getByte("Scale")); + } + } + this.refreshDimensions(); return data; } @@ -91,8 +96,8 @@ public class CubozoaEntity extends AbstractSchoolingFish { protected ItemStack getBucketItemStack() { ItemStack bucket = EndItems.BUCKET_CUBOZOA.getDefaultInstance(); CompoundTag tag = bucket.getOrCreateTag(); - tag.putByte("variant", entityData.get(VARIANT)); - tag.putByte("scale", entityData.get(SCALE)); + tag.putByte("Variant", entityData.get(VARIANT)); + tag.putByte("Scale", entityData.get(SCALE)); return bucket; } diff --git a/src/main/java/ru/betterend/entity/EndFishEntity.java b/src/main/java/ru/betterend/entity/EndFishEntity.java index 9d3a170d..ce9a04d9 100644 --- a/src/main/java/ru/betterend/entity/EndFishEntity.java +++ b/src/main/java/ru/betterend/entity/EndFishEntity.java @@ -43,15 +43,20 @@ public class EndFishEntity extends AbstractSchoolingFish { @Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, SpawnGroupData entityData, CompoundTag entityTag) { SpawnGroupData data = super.finalizeSpawn(world, difficulty, spawnReason, entityData, entityTag); - if (entityTag != null) { - if (entityTag.contains("variant")) - this.entityData.set(VARIANT, entityTag.getByte("variant")); - if (entityTag.contains("scale")) - this.entityData.set(SCALE, entityTag.getByte("scale")); - } - else if (EndBiomes.getFromBiome(world.getBiome(blockPosition())) == EndBiomes.SULPHUR_SPRINGS) { + + if (EndBiomes.getFromBiome(world.getBiome(blockPosition())) == EndBiomes.SULPHUR_SPRINGS) { this.entityData.set(VARIANT, (byte) (random.nextInt(VARIANTS_SULPHUR) + VARIANTS_NORMAL)); } + + if (entityTag != null) { + if (entityTag.contains("Variant")) { + this.entityData.set(VARIANT, entityTag.getByte("variant")); + } + if (entityTag.contains("Scale")) { + this.entityData.set(SCALE, entityTag.getByte("scale")); + } + } + this.refreshDimensions(); return data; } diff --git a/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java b/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java index b4a6db38..ee5c0d69 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java @@ -45,7 +45,6 @@ public class ServerLevelMixin { lastWorld = session.getLevelId(); - @SuppressWarnings("resource") ServerLevel world = ServerLevel.class.cast(this); File dir = session.getDimensionPath(world.dimension()); if (!new File(dir, "level.dat").exists()) { From c418fc4d0414d9946333eaa6abbfe5975890595a Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 20 Apr 2021 14:14:49 +0300 Subject: [PATCH 428/463] Deprecated fuctions fix --- src/main/java/ru/betterend/blocks/CavePumpkinBlock.java | 2 +- src/main/java/ru/betterend/blocks/LumecornBlock.java | 4 +--- src/main/java/ru/betterend/blocks/NeonCactusBlock.java | 2 +- src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java | 2 +- src/main/java/ru/betterend/blocks/RunedFlavolite.java | 2 +- src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java | 2 +- src/main/java/ru/betterend/blocks/basis/PedestalBlock.java | 2 +- 7 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java b/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java index 5121e6c4..01565041 100644 --- a/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java +++ b/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java @@ -27,7 +27,7 @@ public class CavePumpkinBlock extends BlockBaseNotFull implements IRenderTypeabl private static final VoxelShape SHAPE_BIG; public CavePumpkinBlock() { - super(FabricBlockSettings.copyOf(Blocks.PUMPKIN).lightLevel((state) -> state.getValue(SMALL) ? 10 : 15)); + super(FabricBlockSettings.copyOf(Blocks.PUMPKIN).luminance((state) -> state.getValue(SMALL) ? 10 : 15)); registerDefaultState(defaultBlockState().setValue(SMALL, false)); } diff --git a/src/main/java/ru/betterend/blocks/LumecornBlock.java b/src/main/java/ru/betterend/blocks/LumecornBlock.java index 9f782340..38e954ad 100644 --- a/src/main/java/ru/betterend/blocks/LumecornBlock.java +++ b/src/main/java/ru/betterend/blocks/LumecornBlock.java @@ -40,9 +40,7 @@ public class LumecornBlock extends BlockBaseNotFull implements IRenderTypeable { super(FabricBlockSettings.of(Material.WOOD) .breakByTool(FabricToolTags.AXES) .hardness(0.5F) - .lightLevel((state) -> { - return state.getValue(SHAPE).getLight(); - })); + .luminance(state -> state.getValue(SHAPE).getLight())); } @Override diff --git a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java index 58fc1ac1..81fe4854 100644 --- a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java +++ b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java @@ -44,7 +44,7 @@ public class NeonCactusBlock extends BlockBaseNotFull implements SimpleWaterlogg private static final EnumMap SMALL_SHAPES = Maps.newEnumMap(Axis.class); public NeonCactusBlock() { - super(FabricBlockSettings.copyOf(Blocks.CACTUS).lightLevel(state -> { + super(FabricBlockSettings.copyOf(Blocks.CACTUS).luminance(state -> { TripleShape shape = state.getValue(SHAPE); if (shape == TripleShape.TOP) { return 15; diff --git a/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java b/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java index 74208609..05dc7fe9 100644 --- a/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java +++ b/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java @@ -53,7 +53,7 @@ public class RespawnObeliskBlock extends BlockBase implements IColorProvider, IR public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; public RespawnObeliskBlock() { - super(FabricBlockSettings.copyOf(Blocks.END_STONE).lightLevel((state) -> { + super(FabricBlockSettings.copyOf(Blocks.END_STONE).luminance((state) -> { return (state.getValue(SHAPE) == TripleShape.BOTTOM) ? 0 : 15; })); } diff --git a/src/main/java/ru/betterend/blocks/RunedFlavolite.java b/src/main/java/ru/betterend/blocks/RunedFlavolite.java index 9cefae39..b457f8be 100644 --- a/src/main/java/ru/betterend/blocks/RunedFlavolite.java +++ b/src/main/java/ru/betterend/blocks/RunedFlavolite.java @@ -13,7 +13,7 @@ public class RunedFlavolite extends BlockBase { public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; public RunedFlavolite() { - super(FabricBlockSettings.copyOf(EndBlocks.FLAVOLITE.polished).resistance(Blocks.OBSIDIAN.getExplosionResistance()).lightLevel(state -> { + super(FabricBlockSettings.copyOf(EndBlocks.FLAVOLITE.polished).resistance(Blocks.OBSIDIAN.getExplosionResistance()).luminance(state -> { return state.getValue(ACTIVATED) ? 8 : 0; })); this.registerDefaultState(stateDefinition.any().setValue(ACTIVATED, false)); diff --git a/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java b/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java index dee166a3..68690e6c 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java @@ -31,7 +31,7 @@ import ru.betterend.patterns.Patterns; public class EndFurnaceBlock extends FurnaceBlock implements BlockPatterned, IRenderTypeable { public EndFurnaceBlock(Block source) { - super(FabricBlockSettings.copyOf(source).lightLevel((state) -> { + super(FabricBlockSettings.copyOf(source).luminance((state) -> { return state.getValue(LIT) ? 13 : 0; })); } diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index cf0dbfd8..7f3a1f7e 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -86,7 +86,7 @@ public class PedestalBlock extends BlockBaseNotFull implements EntityBlock { protected float height = 1.0F; public PedestalBlock(Block parent) { - super(FabricBlockSettings.copyOf(parent).lightLevel(state -> state.getValue(HAS_LIGHT) ? 12 : 0)); + super(FabricBlockSettings.copyOf(parent).luminance(state -> state.getValue(HAS_LIGHT) ? 12 : 0)); this.registerDefaultState(stateDefinition.any().setValue(STATE, PedestalState.DEFAULT).setValue(HAS_ITEM, false).setValue(HAS_LIGHT, false)); this.parent = parent; } From bf171754c745f062288f89454e8b22284a688a5d Mon Sep 17 00:00:00 2001 From: Aleksey Date: Tue, 20 Apr 2021 14:46:03 +0300 Subject: [PATCH 429/463] End Stone Smelter GUI fix --- .../client/gui/EndStoneSmelterScreen.java | 68 +++++++++---------- 1 file changed, 33 insertions(+), 35 deletions(-) diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java index 7bb7f206..40834986 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java @@ -2,7 +2,6 @@ package ru.betterend.client.gui; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.gui.components.ImageButton; @@ -10,7 +9,6 @@ import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.client.gui.screens.recipebook.RecipeBookComponent; import net.minecraft.client.gui.screens.recipebook.RecipeUpdateListener; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.FormattedText; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.ClickType; @@ -28,43 +26,42 @@ public class EndStoneSmelterScreen extends AbstractContainerScreen { - this.recipeBook.initVisuals(narrow); - this.recipeBook.toggleVisibility(); - this.leftPos = this.recipeBook.updateScreenPosition(narrow, width, imageWidth); - ((ImageButton) buttonWidget).setPosition(this.leftPos + 20, height / 2 - 49); + narrow = width < 379; + recipeBook.init(width, height, minecraft, narrow, menu); + leftPos = recipeBook.updateScreenPosition(narrow, width, imageWidth); + addButton(new ImageButton(leftPos + 20, height / 2 - 49, 20, 18, 0, 0, 19, RECIPE_BUTTON_TEXTURE, (buttonWidget) -> { + recipeBook.initVisuals(narrow); + recipeBook.toggleVisibility(); + leftPos = recipeBook.updateScreenPosition(narrow, width, imageWidth); + ((ImageButton) buttonWidget).setPosition(leftPos + 20, height / 2 - 49); })); - this.titleLabelX = (this.imageWidth - this.font.width((FormattedText)this.title)) / 2; + titleLabelX = (imageWidth - font.width(title)) / 2; } @Override public void tick() { super.tick(); - this.recipeBook.tick(); + recipeBook.tick(); } @Override public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { - this.renderBackground(matrices); - if (this.recipeBook.isVisible() && this.narrow) { - this.renderBg(matrices, delta, mouseX, mouseY); - this.recipeBook.render(matrices, mouseX, mouseY, delta); + renderBackground(matrices); + if (recipeBook.isVisible() && narrow) { + renderBg(matrices, delta, mouseX, mouseY); + recipeBook.render(matrices, mouseX, mouseY, delta); } else { - this.recipeBook.render(matrices, mouseX, mouseY, delta); + recipeBook.render(matrices, mouseX, mouseY, delta); super.render(matrices, mouseX, mouseY, delta); - this.recipeBook.renderGhostRecipe(matrices, leftPos, topPos, true, delta); + recipeBook.renderGhostRecipe(matrices, leftPos, topPos, true, delta); } - - this.renderTooltip(matrices, mouseX, mouseY); - this.recipeBook.renderTooltip(matrices, leftPos, topPos, mouseX, mouseY); + renderTooltip(matrices, mouseX, mouseY); + recipeBook.renderTooltip(matrices, leftPos, topPos, mouseX, mouseY); } @Override @@ -72,7 +69,7 @@ public class EndStoneSmelterScreen extends AbstractContainerScreen Date: Wed, 21 Apr 2021 15:58:04 +0300 Subject: [PATCH 430/463] A little bit refactor --- src/main/java/ru/betterend/util/TagHelper.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/main/java/ru/betterend/util/TagHelper.java b/src/main/java/ru/betterend/util/TagHelper.java index af8a1d04..4dcd6df9 100644 --- a/src/main/java/ru/betterend/util/TagHelper.java +++ b/src/main/java/ru/betterend/util/TagHelper.java @@ -54,9 +54,7 @@ public class TagHelper { } public static Tag.Builder apply(Tag.Builder builder, Set ids) { - ids.forEach((value) -> { - builder.addElement(value, "Better End Code"); - }); + ids.forEach(value -> builder.addElement(value, "Better End Code")); return builder; } @@ -69,11 +67,7 @@ public class TagHelper { } if (endTags != null) { endTags.forEach((id, ids) -> { - if (tagsMap.containsKey(id)) { - apply(tagsMap.get(id), ids); - } else { - tagsMap.put(id, apply(Tag.Builder.tag(), ids)); - } + apply(tagsMap.computeIfAbsent(id, key -> Tag.Builder.tag()), ids); }); } } From 505acbb56bf1b13295f48ff148e56fa02124abe9 Mon Sep 17 00:00:00 2001 From: vemerion Date: Wed, 21 Apr 2021 15:53:09 +0200 Subject: [PATCH 431/463] Fix end stone smelter not giving exp on shift-click This is a one character buggfix for a bug that prevented players from getting exp when shift-clicking the output slot to retrieve the smelted item. See this for the original Forge issue that made me aware of the bug: https://github.com/Beethoven92/BetterEndForge/issues/85 --- .../ru/betterend/client/gui/EndStoneSmelterScreenHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java index 27e29418..8ef1b73e 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java @@ -128,7 +128,7 @@ public class EndStoneSmelterScreenHandler extends RecipeBookMenu { ItemStack itemStack2 = slot.getItem(); itemStack = itemStack2.copy(); if (index == 3) { - if (moveItemStackTo(itemStack2, 4, 40, true)) { + if (!moveItemStackTo(itemStack2, 4, 40, true)) { return ItemStack.EMPTY; } slot.onQuickCraft(itemStack2, itemStack); From 3cd71e300d351a5bfb8261a5209a6dd1cf1b077c Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 21 Apr 2021 18:17:52 +0300 Subject: [PATCH 432/463] Fixed small entity bugs, move classes to correct package --- .../ru/betterend/{registry => blocks}/FilaluxBlock.java | 2 +- .../betterend/{registry => blocks}/FilaluxWingsBlock.java | 2 +- .../ru/betterend/{registry => blocks}/PondAnemoneBlock.java | 2 +- src/main/java/ru/betterend/entity/DragonflyEntity.java | 6 ++++++ src/main/java/ru/betterend/entity/SilkMothEntity.java | 6 ++++++ 5 files changed, 15 insertions(+), 3 deletions(-) rename src/main/java/ru/betterend/{registry => blocks}/FilaluxBlock.java (87%) rename src/main/java/ru/betterend/{registry => blocks}/FilaluxWingsBlock.java (96%) rename src/main/java/ru/betterend/{registry => blocks}/PondAnemoneBlock.java (95%) diff --git a/src/main/java/ru/betterend/registry/FilaluxBlock.java b/src/main/java/ru/betterend/blocks/FilaluxBlock.java similarity index 87% rename from src/main/java/ru/betterend/registry/FilaluxBlock.java rename to src/main/java/ru/betterend/blocks/FilaluxBlock.java index 4ca2c82f..d9c8b473 100644 --- a/src/main/java/ru/betterend/registry/FilaluxBlock.java +++ b/src/main/java/ru/betterend/blocks/FilaluxBlock.java @@ -1,4 +1,4 @@ -package ru.betterend.registry; +package ru.betterend.blocks; import net.minecraft.world.level.block.state.BlockBehaviour; import ru.betterend.blocks.basis.VineBlock; diff --git a/src/main/java/ru/betterend/registry/FilaluxWingsBlock.java b/src/main/java/ru/betterend/blocks/FilaluxWingsBlock.java similarity index 96% rename from src/main/java/ru/betterend/registry/FilaluxWingsBlock.java rename to src/main/java/ru/betterend/blocks/FilaluxWingsBlock.java index 12b7f789..b9721334 100644 --- a/src/main/java/ru/betterend/registry/FilaluxWingsBlock.java +++ b/src/main/java/ru/betterend/blocks/FilaluxWingsBlock.java @@ -1,4 +1,4 @@ -package ru.betterend.registry; +package ru.betterend.blocks; import java.util.EnumMap; diff --git a/src/main/java/ru/betterend/registry/PondAnemoneBlock.java b/src/main/java/ru/betterend/blocks/PondAnemoneBlock.java similarity index 95% rename from src/main/java/ru/betterend/registry/PondAnemoneBlock.java rename to src/main/java/ru/betterend/blocks/PondAnemoneBlock.java index 4ac7e185..1fed3cf3 100644 --- a/src/main/java/ru/betterend/registry/PondAnemoneBlock.java +++ b/src/main/java/ru/betterend/blocks/PondAnemoneBlock.java @@ -1,4 +1,4 @@ -package ru.betterend.registry; +package ru.betterend.blocks; import java.util.Random; diff --git a/src/main/java/ru/betterend/entity/DragonflyEntity.java b/src/main/java/ru/betterend/entity/DragonflyEntity.java index ff66b062..b5e7a5b3 100644 --- a/src/main/java/ru/betterend/entity/DragonflyEntity.java +++ b/src/main/java/ru/betterend/entity/DragonflyEntity.java @@ -7,6 +7,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; import net.minecraft.world.entity.AgableMob; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; @@ -54,6 +55,11 @@ public class DragonflyEntity extends Animal implements FlyingAnimal { .add(Attributes.FLYING_SPEED, 1.0D) .add(Attributes.MOVEMENT_SPEED, 0.1D); } + + @Override + public Entity getLeashHolder() { + return null; + } @Override protected PathNavigation createNavigation(Level world) { diff --git a/src/main/java/ru/betterend/entity/SilkMothEntity.java b/src/main/java/ru/betterend/entity/SilkMothEntity.java index edd20af3..3365d894 100644 --- a/src/main/java/ru/betterend/entity/SilkMothEntity.java +++ b/src/main/java/ru/betterend/entity/SilkMothEntity.java @@ -17,6 +17,7 @@ import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.AgableMob; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; @@ -80,6 +81,11 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { this.hiveWorld = world; } + @Override + public Entity getLeashHolder() { + return null; + } + @Override public void addAdditionalSaveData(CompoundTag tag) { if (hivePos != null) { From b6f6541e94a232580e76a2d90ffe477d55474567 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 21 Apr 2021 18:22:31 +0300 Subject: [PATCH 433/463] Neon cactus item --- .../assets/betterend/models/block/neon_cactus_small.json | 1 + .../resources/assets/betterend/models/item/neon_cactus.json | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 src/main/resources/assets/betterend/models/item/neon_cactus.json diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_small.json b/src/main/resources/assets/betterend/models/block/neon_cactus_small.json index c94fa800..6d0ec8ae 100644 --- a/src/main/resources/assets/betterend/models/block/neon_cactus_small.json +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_small.json @@ -1,5 +1,6 @@ { "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", "textures": { "particle": "betterend:block/neon_cactus_small_side", "side": "betterend:block/neon_cactus_small_side", diff --git a/src/main/resources/assets/betterend/models/item/neon_cactus.json b/src/main/resources/assets/betterend/models/item/neon_cactus.json new file mode 100644 index 00000000..3a3f1ba8 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/neon_cactus.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/neon_cactus_small" +} From e6c411d6a1ffc6fb4dcd6753318f163305a4ba65 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 21 Apr 2021 19:27:49 +0300 Subject: [PATCH 434/463] Neon oasis enhancements --- .../ru/betterend/blocks/NeonCactusBlock.java | 8 +- .../client/gui/EndStoneSmelterScreen.java | 1 + .../ru/betterend/registry/EndFeatures.java | 2 + .../world/biome/land/DustWastelandsBiome.java | 1 + .../world/biome/land/NeonOasisBiome.java | 5 +- .../features/terrain/DesertLakeFeature.java | 210 ++++++++++++++++++ .../features/terrain/EndLakeFeature.java | 57 ++--- .../models/block/column_noshade.json | 22 ++ .../models/block/neon_cactus_big.json | 2 +- 9 files changed, 266 insertions(+), 42 deletions(-) create mode 100644 src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java create mode 100644 src/main/resources/assets/betterend/models/block/column_noshade.json diff --git a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java index 81fe4854..e526c390 100644 --- a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java +++ b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java @@ -44,13 +44,7 @@ public class NeonCactusBlock extends BlockBaseNotFull implements SimpleWaterlogg private static final EnumMap SMALL_SHAPES = Maps.newEnumMap(Axis.class); public NeonCactusBlock() { - super(FabricBlockSettings.copyOf(Blocks.CACTUS).luminance(state -> { - TripleShape shape = state.getValue(SHAPE); - if (shape == TripleShape.TOP) { - return 15; - } - return shape == TripleShape.MIDDLE ? 13 : 10; - })); + super(FabricBlockSettings.copyOf(Blocks.CACTUS).luminance(15)); registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false).setValue(FACING, Direction.UP).setValue(SHAPE, TripleShape.TOP)); } diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java index 40834986..c030ed9f 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java @@ -2,6 +2,7 @@ package ru.betterend.client.gui; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; + import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.gui.components.ImageButton; diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index d2228007..bcd14c9f 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -43,6 +43,7 @@ import ru.betterend.world.features.bushes.LargeAmaranitaFeature; import ru.betterend.world.features.bushes.Lumecorn; import ru.betterend.world.features.bushes.TenaneaBushFeature; import ru.betterend.world.features.terrain.BigAuroraCrystalFeature; +import ru.betterend.world.features.terrain.DesertLakeFeature; import ru.betterend.world.features.terrain.EndLakeFeature; import ru.betterend.world.features.terrain.FallenPillarFeature; import ru.betterend.world.features.terrain.FloatingSpireFeature; @@ -186,6 +187,7 @@ public class EndFeatures { public static final EndFeature END_LAKE = EndFeature.makeLakeFeature("end_lake", new EndLakeFeature(), 4); public static final EndFeature END_LAKE_NORMAL = EndFeature.makeLakeFeature("end_lake_normal", new EndLakeFeature(), 20); public static final EndFeature END_LAKE_RARE = EndFeature.makeLakeFeature("end_lake_rare", new EndLakeFeature(), 40); + public static final EndFeature DESERT_LAKE = EndFeature.makeLakeFeature("desert_lake", new DesertLakeFeature(), 8); public static final EndFeature ROUND_CAVE = EndFeature.makeRawGenFeature("round_cave", new RoundCaveFeature(), 2); public static final EndFeature SPIRE = EndFeature.makeRawGenFeature("spire", new SpireFeature(), 2); public static final EndFeature FLOATING_SPIRE = EndFeature.makeRawGenFeature("floating_spire", new FloatingSpireFeature(), 8); diff --git a/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java b/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java index 85945dec..852127ac 100644 --- a/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java @@ -15,6 +15,7 @@ public class DustWastelandsBiome extends EndBiome { .setFogDensity(2) .setWaterAndFogColor(192, 180, 131) .setSurface(EndBlocks.ENDSTONE_DUST) + .setDepth(1.5F) .setParticles(ParticleTypes.WHITE_ASH, 0.01F) .setLoop(EndSounds.AMBIENT_DUST_WASTELANDS) .setMusic(EndSounds.MUSIC_OPENSPACE) diff --git a/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java b/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java index 13fca7d6..587958ce 100644 --- a/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java @@ -15,12 +15,15 @@ public class NeonOasisBiome extends EndBiome { .setGenChance(0.5F) .setFogColor(226, 239, 168) .setFogDensity(2) - .setWaterAndFogColor(192, 180, 131) + .setWaterAndFogColor(106, 238, 215) .setSurface(EndBlocks.ENDSTONE_DUST, EndBlocks.END_MOSS) .setParticles(ParticleTypes.WHITE_ASH, 0.01F) .setLoop(EndSounds.AMBIENT_DUST_WASTELANDS) .setMusic(EndSounds.MUSIC_OPENSPACE) + .addFeature(EndFeatures.DESERT_LAKE) .addFeature(EndFeatures.NEON_CACTUS) + .addFeature(EndFeatures.UMBRELLA_MOSS) + .addFeature(EndFeatures.CREEPING_MOSS) .addStructureFeature(StructureFeatures.END_CITY) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); } diff --git a/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java new file mode 100644 index 00000000..82f9feb8 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java @@ -0,0 +1,210 @@ +package ru.betterend.world.features.terrain; + +import java.util.Random; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.world.level.WorldGenLevel; +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.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Material; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; +import ru.betterend.world.features.DefaultFeature; + +public class DesertLakeFeature extends DefaultFeature { + private static final BlockState END_STONE = Blocks.END_STONE.defaultBlockState(); + private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(15152); + private static final MutableBlockPos POS = new MutableBlockPos(); + + @Override + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, NoneFeatureConfiguration featureConfig) { + double radius = MHelper.randRange(8.0, 15.0, random); + double depth = radius * 0.5 * MHelper.randRange(0.8, 1.2, random); + int dist = MHelper.floor(radius); + int dist2 = MHelper.floor(radius * 1.5); + int bott = MHelper.floor(depth); + blockPos = getPosOnSurfaceWG(world, blockPos); + + if (blockPos.getY() < 10) return false; + + int waterLevel = blockPos.getY(); + + BlockPos pos = getPosOnSurfaceRaycast(world, blockPos.north(dist).above(10), 20); + if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; + waterLevel = MHelper.min(pos.getY(), waterLevel); + + pos = getPosOnSurfaceRaycast(world, blockPos.south(dist).above(10), 20); + if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; + waterLevel = MHelper.min(pos.getY(), waterLevel); + + pos = getPosOnSurfaceRaycast(world, blockPos.east(dist).above(10), 20); + if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; + waterLevel = MHelper.min(pos.getY(), waterLevel); + + pos = getPosOnSurfaceRaycast(world, blockPos.west(dist).above(10), 20); + if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; + waterLevel = MHelper.min(pos.getY(), waterLevel); + BlockState state; + + int minX = blockPos.getX() - dist2; + int maxX = blockPos.getX() + dist2; + int minZ = blockPos.getZ() - dist2; + int maxZ = blockPos.getZ() + dist2; + int maskMinX = minX - 1; + int maskMinZ = minZ - 1; + + boolean[][] mask = new boolean[maxX - minX + 3][maxZ - minZ + 3]; + for (int x = minX; x <= maxX; x++) { + POS.setX(x); + int mx = x - maskMinX; + for (int z = minZ; z <= maxZ; z++) { + POS.setZ(z); + int mz = z - maskMinZ; + if (!mask[mx][mz]) { + for (int y = waterLevel + 1; y <= waterLevel + 20; y++) { + POS.setY(y); + FluidState fluid = world.getFluidState(POS); + if (!fluid.isEmpty()) { + for (int i = -1; i < 2; i++) { + int px = mx + i; + for (int j = -1; j < 2; j++) { + int pz = mz + j; + mask[px][pz] = true; + } + } + break; + } + } + } + } + } + + for (int x = minX; x <= maxX; x++) { + POS.setX(x); + int x2 = x - blockPos.getX(); + x2 *= x2; + int mx = x - maskMinX; + for (int z = minZ; z <= maxZ; z++) { + POS.setZ(z); + int z2 = z - blockPos.getZ(); + z2 *= z2; + int mz = z - maskMinZ; + if (!mask[mx][mz]) { + double size = 1; + for (int y = blockPos.getY(); y <= blockPos.getY() + 20; y++) { + POS.setY(y); + double add = y - blockPos.getY(); + if (add > 5) { + size *= 0.8; + add = 5; + } + double r = (add * 1.8 + radius * (NOISE.eval(x * 0.2, y * 0.2, z * 0.2) * 0.25 + 0.75)) - 1.0 / size; + if (r > 0) { + r *= r; + if (x2 + z2 <= r) { + state = world.getBlockState(POS); + if (state.is(EndTags.GEN_TERRAIN)) { + BlocksHelper.setWithoutUpdate(world, POS, AIR); + } + pos = POS.below(); + if (world.getBlockState(pos).is(EndTags.GEN_TERRAIN)) { + state = world.getBiome(pos).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + if (y > waterLevel + 1) + BlocksHelper.setWithoutUpdate(world, pos, state); + else if (y > waterLevel) + BlocksHelper.setWithoutUpdate(world, pos, random.nextBoolean() ? state : EndBlocks.ENDSTONE_DUST.defaultBlockState()); + else + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.ENDSTONE_DUST.defaultBlockState()); + } + } + } + else { + break; + } + } + } + } + } + + double aspect = ((double) radius / (double) depth); + + for (int x = blockPos.getX() - dist; x <= blockPos.getX() + dist; x++) { + POS.setX(x); + int x2 = x - blockPos.getX(); + x2 *= x2; + int mx = x - maskMinX; + for (int z = blockPos.getZ() - dist; z <= blockPos.getZ() + dist; z++) { + POS.setZ(z); + int z2 = z - blockPos.getZ(); + z2 *= z2; + int mz = z - maskMinZ; + if (!mask[mx][mz]) { + for (int y = blockPos.getY() - bott; y < blockPos.getY(); y++) { + POS.setY(y); + double y2 = (double) (y - blockPos.getY()) * aspect; + y2 *= y2; + double r = radius * (NOISE.eval(x * 0.2, y * 0.2, z * 0.2) * 0.25 + 0.75); + double rb = r * 1.2; + r *= r; + rb *= rb; + if (y2 + x2 + z2 <= r) { + state = world.getBlockState(POS); + if (canReplace(state)) { + state = world.getBlockState(POS.above()); + state = canReplace(state) ? (y < waterLevel ? WATER : AIR) : state; + BlocksHelper.setWithoutUpdate(world, POS, state); + } + pos = POS.below(); + if (world.getBlockState(pos).getBlock().is(EndTags.GEN_TERRAIN)) { + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.ENDSTONE_DUST.defaultBlockState()); + } + pos = POS.above(); + while (canReplace(state = world.getBlockState(pos)) && !state.isAir() && state.getFluidState().isEmpty()) { + BlocksHelper.setWithoutUpdate(world, pos, pos.getY() < waterLevel ? WATER : AIR); + pos = pos.above(); + } + } + // Make border + else if (y2 + x2 + z2 <= rb) { + state = world.getBlockState(POS); + if (state.is(EndTags.GEN_TERRAIN) && world.isEmptyBlock(POS.above())) { + BlocksHelper.setWithoutUpdate(world, POS, EndBlocks.END_MOSS); + } + else if (y < waterLevel) { + if (world.isEmptyBlock(POS.above())) { + state = world.getBiome(POS).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + BlocksHelper.setWithoutUpdate(world, POS, random.nextBoolean() ? state : EndBlocks.ENDSTONE_DUST.defaultBlockState()); + BlocksHelper.setWithoutUpdate(world, POS.below(), END_STONE); + } + else { + BlocksHelper.setWithoutUpdate(world, POS, EndBlocks.ENDSTONE_DUST.defaultBlockState()); + BlocksHelper.setWithoutUpdate(world, POS.below(), END_STONE); + } + } + } + } + } + } + } + + BlocksHelper.fixBlocks(world, new BlockPos(minX - 2, waterLevel - 2, minZ - 2), new BlockPos(maxX + 2, blockPos.getY() + 20, maxZ + 2)); + + return true; + } + + private boolean canReplace(BlockState state) { + return state.getMaterial().isReplaceable() + || state.is(EndTags.GEN_TERRAIN) + || state.is(EndBlocks.ENDSTONE_DUST) + || state.getMaterial().equals(Material.PLANT) + || state.getMaterial().equals(Material.WATER_PLANT) + || state.getMaterial().equals(Material.CORAL); + } +} diff --git a/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java index b2cc2103..e083d61f 100644 --- a/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java @@ -24,37 +24,32 @@ public class EndLakeFeature extends DefaultFeature { private static final MutableBlockPos POS = new MutableBlockPos(); @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, - NoneFeatureConfiguration featureConfig) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, NoneFeatureConfiguration featureConfig) { double radius = MHelper.randRange(10.0, 20.0, random); double depth = radius * 0.5 * MHelper.randRange(0.8, 1.2, random); int dist = MHelper.floor(radius); int dist2 = MHelper.floor(radius * 1.5); int bott = MHelper.floor(depth); blockPos = getPosOnSurfaceWG(world, blockPos); - if (blockPos.getY() < 10) - return false; + + if (blockPos.getY() < 10) return false; int waterLevel = blockPos.getY(); BlockPos pos = getPosOnSurfaceRaycast(world, blockPos.north(dist).above(10), 20); - if (Math.abs(blockPos.getY() - pos.getY()) > 5) - return false; + if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; waterLevel = MHelper.min(pos.getY(), waterLevel); pos = getPosOnSurfaceRaycast(world, blockPos.south(dist).above(10), 20); - if (Math.abs(blockPos.getY() - pos.getY()) > 5) - return false; + if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; waterLevel = MHelper.min(pos.getY(), waterLevel); pos = getPosOnSurfaceRaycast(world, blockPos.east(dist).above(10), 20); - if (Math.abs(blockPos.getY() - pos.getY()) > 5) - return false; + if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; waterLevel = MHelper.min(pos.getY(), waterLevel); pos = getPosOnSurfaceRaycast(world, blockPos.west(dist).above(10), 20); - if (Math.abs(blockPos.getY() - pos.getY()) > 5) - return false; + if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; waterLevel = MHelper.min(pos.getY(), waterLevel); BlockState state; @@ -110,8 +105,7 @@ public class EndLakeFeature extends DefaultFeature { size *= 0.8; add = 5; } - double r = (add * 1.8 + radius * (NOISE.eval(x * 0.2, y * 0.2, z * 0.2) * 0.25 + 0.75)) - - 1.0 / size; + double r = (add * 1.8 + radius * (NOISE.eval(x * 0.2, y * 0.2, z * 0.2) * 0.25 + 0.75)) - 1.0 / size; if (r > 0) { r *= r; if (x2 + z2 <= r) { @@ -121,19 +115,17 @@ public class EndLakeFeature extends DefaultFeature { } pos = POS.below(); if (world.getBlockState(pos).is(EndTags.GEN_TERRAIN)) { - state = world.getBiome(pos).getGenerationSettings().getSurfaceBuilderConfig() - .getTopMaterial(); + state = world.getBiome(pos).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); if (y > waterLevel + 1) BlocksHelper.setWithoutUpdate(world, pos, state); else if (y > waterLevel) - BlocksHelper.setWithoutUpdate(world, pos, random.nextBoolean() ? state - : EndBlocks.ENDSTONE_DUST.defaultBlockState()); + BlocksHelper.setWithoutUpdate(world, pos, random.nextBoolean() ? state : EndBlocks.ENDSTONE_DUST.defaultBlockState()); else - BlocksHelper.setWithoutUpdate(world, pos, - EndBlocks.ENDSTONE_DUST.defaultBlockState()); + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.ENDSTONE_DUST.defaultBlockState()); } } - } else { + } + else { break; } } @@ -174,8 +166,7 @@ public class EndLakeFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.ENDSTONE_DUST.defaultBlockState()); } pos = POS.above(); - while (canReplace(state = world.getBlockState(pos)) && !state.isAir() - && state.getFluidState().isEmpty()) { + while (canReplace(state = world.getBlockState(pos)) && !state.isAir() && state.getFluidState().isEmpty()) { BlocksHelper.setWithoutUpdate(world, pos, pos.getY() < waterLevel ? WATER : AIR); pos = pos.above(); } @@ -183,31 +174,31 @@ public class EndLakeFeature extends DefaultFeature { // Make border else if (y < waterLevel && y2 + x2 + z2 <= rb) { if (world.isEmptyBlock(POS.above())) { - state = world.getBiome(POS).getGenerationSettings().getSurfaceBuilderConfig() - .getTopMaterial(); - BlocksHelper.setWithoutUpdate(world, POS, - random.nextBoolean() ? state : EndBlocks.ENDSTONE_DUST.defaultBlockState()); + state = world.getBiome(POS).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + BlocksHelper.setWithoutUpdate(world, POS, random.nextBoolean() ? state : EndBlocks.ENDSTONE_DUST.defaultBlockState()); BlocksHelper.setWithoutUpdate(world, POS.below(), END_STONE); - } else { + } + else { BlocksHelper.setWithoutUpdate(world, POS, EndBlocks.ENDSTONE_DUST.defaultBlockState()); BlocksHelper.setWithoutUpdate(world, POS.below(), END_STONE); } - // } } } } } } - BlocksHelper.fixBlocks(world, new BlockPos(minX - 2, waterLevel - 2, minZ - 2), - new BlockPos(maxX + 2, blockPos.getY() + 20, maxZ + 2)); + BlocksHelper.fixBlocks(world, new BlockPos(minX - 2, waterLevel - 2, minZ - 2), new BlockPos(maxX + 2, blockPos.getY() + 20, maxZ + 2)); return true; } private boolean canReplace(BlockState state) { - return state.getMaterial().isReplaceable() || state.is(EndTags.GEN_TERRAIN) || state.is(EndBlocks.ENDSTONE_DUST) - || state.getMaterial().equals(Material.PLANT) || state.getMaterial().equals(Material.WATER_PLANT) + return state.getMaterial().isReplaceable() + || state.is(EndTags.GEN_TERRAIN) + || state.is(EndBlocks.ENDSTONE_DUST) + || state.getMaterial().equals(Material.PLANT) + || state.getMaterial().equals(Material.WATER_PLANT) || state.getMaterial().equals(Material.CORAL); } } diff --git a/src/main/resources/assets/betterend/models/block/column_noshade.json b/src/main/resources/assets/betterend/models/block/column_noshade.json new file mode 100644 index 00000000..163be8b0 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/column_noshade.json @@ -0,0 +1,22 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#side" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#end", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#end", "cullface": "up" }, + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "west" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "east" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_big.json b/src/main/resources/assets/betterend/models/block/neon_cactus_big.json index 1c42b356..a917c73f 100644 --- a/src/main/resources/assets/betterend/models/block/neon_cactus_big.json +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_big.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:block/cube_column", + "parent": "betterend:block/column_noshade", "textures": { "end": "betterend:block/neon_cactus_big_top", "side": "betterend:block/neon_cactus_big_side" From e9043ea2db15472c79658e74f6c1d3b98058bcde Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 21 Apr 2021 19:46:25 +0300 Subject: [PATCH 435/463] Shrubland bushes --- src/main/java/ru/betterend/registry/EndFeatures.java | 1 + .../java/ru/betterend/world/biome/land/DryShrublandBiome.java | 1 + .../java/ru/betterend/world/biome/land/NeonOasisBiome.java | 3 +++ 3 files changed, 5 insertions(+) diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index bcd14c9f..9684e2e0 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -93,6 +93,7 @@ public class EndFeatures { public static final EndFeature LUMECORN = new EndFeature("lumecorn", new Lumecorn(), 5); public static final EndFeature LARGE_AMARANITA = new EndFeature("large_amaranita", new LargeAmaranitaFeature(), 5); public static final EndFeature LUCERNIA_BUSH = new EndFeature("lucernia_bush", new BushWithOuterFeature(EndBlocks.LUCERNIA_LEAVES, EndBlocks.LUCERNIA_OUTER_LEAVES, EndBlocks.LUCERNIA.bark), 10); + public static final EndFeature LUCERNIA_BUSH_RARE = new EndFeature("lucernia_bush_rare", new BushWithOuterFeature(EndBlocks.LUCERNIA_LEAVES, EndBlocks.LUCERNIA_OUTER_LEAVES, EndBlocks.LUCERNIA.bark), 1); public static final EndFeature NEON_CACTUS = new EndFeature("neon_cactus", new NeonCactusFeature(), 2); // Plants // diff --git a/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java b/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java index 570c1cb9..abec4ba5 100644 --- a/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java @@ -17,6 +17,7 @@ public class DryShrublandBiome extends EndBiome { .setPlantsColor(237, 122, 66) .setSurface(EndBlocks.RUTISCUS) .setMusic(EndSounds.MUSIC_OPENSPACE) + .addFeature(EndFeatures.LUCERNIA_BUSH_RARE) .addFeature(EndFeatures.ORANGO) .addFeature(EndFeatures.AERIDIUM) .addFeature(EndFeatures.LUTEBUS) diff --git a/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java b/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java index 587958ce..0d88d0cd 100644 --- a/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java @@ -24,6 +24,9 @@ public class NeonOasisBiome extends EndBiome { .addFeature(EndFeatures.NEON_CACTUS) .addFeature(EndFeatures.UMBRELLA_MOSS) .addFeature(EndFeatures.CREEPING_MOSS) + .addFeature(EndFeatures.CHARNIA_GREEN) + .addFeature(EndFeatures.CHARNIA_CYAN) + .addFeature(EndFeatures.CHARNIA_RED) .addStructureFeature(StructureFeatures.END_CITY) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); } From 68575c40a1d7245a9c830c5cd3810cf34749d67b Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 21 Apr 2021 20:05:13 +0300 Subject: [PATCH 436/463] Burning wood --- .../blocks/complex/WoodenMaterial.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java index f545c6b0..0dac5b08 100644 --- a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java @@ -1,6 +1,7 @@ package ru.betterend.blocks.complex; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.registry.FlammableBlockRegistry; import net.minecraft.tags.BlockTags; import net.minecraft.tags.ItemTags; import net.minecraft.tags.Tag; @@ -147,6 +148,31 @@ public class WoodenMaterial { logItemTag = EndTags.makeItemTag(name + "_logs"); TagHelper.addTag(logBlockTag, log_stripped, bark_stripped, log, bark); TagHelper.addTag(logItemTag, log_stripped, bark_stripped, log, bark); + + FlammableBlockRegistry.getDefaultInstance().add(log, 5, 5); + FlammableBlockRegistry.getDefaultInstance().add(bark, 5, 5); + FlammableBlockRegistry.getDefaultInstance().add(log_stripped, 5, 5); + FlammableBlockRegistry.getDefaultInstance().add(bark_stripped, 5, 5); + + FlammableBlockRegistry.getDefaultInstance().add(planks, 5, 20); + FlammableBlockRegistry.getDefaultInstance().add(stairs, 5, 20); + FlammableBlockRegistry.getDefaultInstance().add(slab, 5, 20); + + FlammableBlockRegistry.getDefaultInstance().add(fence, 5, 20); + FlammableBlockRegistry.getDefaultInstance().add(gate, 5, 20); + FlammableBlockRegistry.getDefaultInstance().add(button, 5, 20); + FlammableBlockRegistry.getDefaultInstance().add(pressurePlate, 5, 20); + FlammableBlockRegistry.getDefaultInstance().add(trapdoor, 5, 20); + FlammableBlockRegistry.getDefaultInstance().add(door, 5, 20); + + FlammableBlockRegistry.getDefaultInstance().add(craftingTable, 5, 20); + FlammableBlockRegistry.getDefaultInstance().add(ladder, 5, 20); + FlammableBlockRegistry.getDefaultInstance().add(sign, 5, 20); + + FlammableBlockRegistry.getDefaultInstance().add(chest, 5, 20); + FlammableBlockRegistry.getDefaultInstance().add(barrel, 5, 20); + FlammableBlockRegistry.getDefaultInstance().add(shelf, 5, 20); + FlammableBlockRegistry.getDefaultInstance().add(composter, 5, 20); } public boolean isTreeLog(Block block) { From 6c8c021fb7de35926638a64a68e692b03348f11a Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 21 Apr 2021 20:11:31 +0300 Subject: [PATCH 437/463] Flammable block --- src/main/java/ru/betterend/registry/EndBlocks.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index c1ca660f..23370c07 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -1,5 +1,6 @@ package ru.betterend.registry; +import net.fabricmc.fabric.api.registry.FlammableBlockRegistry; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.BlockItem; @@ -333,6 +334,9 @@ public class EndBlocks { else { EndItems.registerBlockItem(id, new BlockItem(block, item)); } + if (block.defaultBlockState().getMaterial().isFlammable() && FlammableBlockRegistry.getDefaultInstance().get(block).getBurnChance() == 0) { + FlammableBlockRegistry.getDefaultInstance().add(block, 5, 5); + } return block; } From 5e2335b255aa20daf069b617612eabaa2024ead0 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 21 Apr 2021 20:50:16 +0300 Subject: [PATCH 438/463] Bonemeal enhancement --- .../mixin/common/BoneMealItemMixin.java | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java index b352bc3f..e91bceab 100644 --- a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java +++ b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java @@ -1,7 +1,5 @@ package ru.betterend.mixin.common; -import java.util.Random; - import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -9,7 +7,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; -import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; import net.minecraft.world.InteractionResult; import net.minecraft.world.item.BoneMealItem; import net.minecraft.world.item.context.UseOnContext; @@ -23,12 +21,13 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; import ru.betterend.util.BonemealUtil; +import ru.betterend.util.MHelper; import ru.betterend.world.biome.EndBiome; @Mixin(BoneMealItem.class) public class BoneMealItemMixin { - private static final Direction[] DIR = BlocksHelper.makeHorizontal(); private static final MutableBlockPos POS = new MutableBlockPos(); + private static final Vec3i[] DIR; @Inject(method = "useOn", at = @At("HEAD"), cancellable = true) private void be_onUse(UseOnContext context, CallbackInfoReturnable info) { @@ -149,22 +148,29 @@ public class BoneMealItemMixin { return null; } - private void be_shuffle(Random random) { - for (int i = 0; i < 4; i++) { - int j = random.nextInt(4); - Direction d = DIR[i]; - DIR[i] = DIR[j]; - DIR[j] = d; - } - } - private BlockState be_getNylium(Level world, BlockPos pos) { - be_shuffle(world.random); - for (Direction dir : DIR) { - BlockState state = world.getBlockState(pos.relative(dir)); - if (BlocksHelper.isEndNylium(state)) + MHelper.shuffle(DIR, world.getRandom()); + for (Vec3i dir : DIR) { + BlockPos p = pos.offset(dir); + BlockState state = world.getBlockState(p); + if (BlocksHelper.isEndNylium(state) && !world.getBlockState(p.above()).is(EndTags.END_GROUND)) { return state; + } } return null; } + + static { + int index = 0; + DIR = new Vec3i[3 * 3 * 3 - 1]; + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + for (int z = -1; z <= 1; z++) { + if (x != 0 || y != 0 || z != 0) { + DIR[index++] = new Vec3i(x, y, z); + } + } + } + } + } } \ No newline at end of file From 38a09c0aefa2e64795da75f8fdea97360f6fe5a0 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 21 Apr 2021 21:41:52 +0300 Subject: [PATCH 439/463] Prevent anvil damage restore --- .../betterend/blocks/basis/EndAnvilBlock.java | 5 ++- .../java/ru/betterend/item/EndAnvilItem.java | 44 +++++++++++++++++++ .../java/ru/betterend/registry/EndBlocks.java | 9 +++- .../assets/betterend/lang/en_us.json | 3 +- .../assets/betterend/lang/ru_ru.json | 3 +- 5 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 src/main/java/ru/betterend/item/EndAnvilItem.java diff --git a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java index 2cc44850..cb7a867a 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java @@ -48,7 +48,10 @@ public class EndAnvilBlock extends AnvilBlock implements BlockPatterned { @Override public List getDrops(BlockState state, LootContext.Builder builder) { - return Collections.singletonList(new ItemStack(this)); + ItemStack stack = new ItemStack(this); + int level = state.getValue(getDestructionProperty()); + stack.getOrCreateTag().putInt("level", level); + return Collections.singletonList(stack); } @Override diff --git a/src/main/java/ru/betterend/item/EndAnvilItem.java b/src/main/java/ru/betterend/item/EndAnvilItem.java new file mode 100644 index 00000000..e9272779 --- /dev/null +++ b/src/main/java/ru/betterend/item/EndAnvilItem.java @@ -0,0 +1,44 @@ +package ru.betterend.item; + +import java.util.List; + +import org.jetbrains.annotations.Nullable; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.blocks.basis.EndAnvilBlock; +import ru.betterend.registry.EndItems; + +public class EndAnvilItem extends BlockItem { + public EndAnvilItem(Block block) { + super(block, EndItems.makeBlockItemSettings()); + } + + @Override + protected BlockState getPlacementState(BlockPlaceContext blockPlaceContext) { + BlockState blockState = super.getPlacementState(blockPlaceContext); + ItemStack stack = blockPlaceContext.getItemInHand(); + int level = stack.getOrCreateTag().getInt("level"); + blockState = blockState.setValue(((EndAnvilBlock) blockState.getBlock()).getDestructionProperty(), level); + return blockState; + } + + @Override + @Environment(EnvType.CLIENT) + public void appendHoverText(ItemStack itemStack, @Nullable Level level, List list, TooltipFlag tooltipFlag) { + super.appendHoverText(itemStack, level, list, tooltipFlag); + int l = itemStack.getOrCreateTag().getInt("level"); + if (l > 0) { + list.add(new TranslatableComponent("message.betterend.anvil_damage").append(": " + l)); + } + } +} diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 23370c07..44a7f7b5 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -11,6 +11,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.MaterialColor; import ru.betterend.BetterEnd; import ru.betterend.blocks.*; +import ru.betterend.blocks.basis.EndAnvilBlock; import ru.betterend.blocks.basis.EndCropBlock; import ru.betterend.blocks.basis.EndFurnaceBlock; import ru.betterend.blocks.basis.EndLeavesBlock; @@ -34,6 +35,7 @@ import ru.betterend.blocks.complex.StoneMaterial; import ru.betterend.blocks.complex.WoodenMaterial; import ru.betterend.config.Configs; import ru.betterend.interfaces.ISpetialItem; +import ru.betterend.item.EndAnvilItem; import ru.betterend.item.material.EndArmorMaterial; import ru.betterend.item.material.EndToolMaterial; @@ -332,7 +334,12 @@ public class EndBlocks { EndItems.registerBlockItem(id, new WaterLilyBlockItem(block, item)); } else { - EndItems.registerBlockItem(id, new BlockItem(block, item)); + if (block instanceof EndAnvilBlock) { + EndItems.registerBlockItem(id, new EndAnvilItem(block)); + } + else { + EndItems.registerBlockItem(id, new BlockItem(block, item)); + } } if (block.defaultBlockState().getMaterial().isFlammable() && FlammableBlockRegistry.getDefaultInstance().get(block).getBurnChance() == 0) { FlammableBlockRegistry.getDefaultInstance().add(block, 5, 5); diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 140e8f20..8a7a40d7 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -848,5 +848,6 @@ "block.betterend.smaragdant_crystal_slab": "Smaragdant Slab", "block.betterend.smaragdant_crystal_stairs": "Smaragdant Stairs", "block.betterend.smaragdant_crystal_tiles": "Smaragdant Tiles", - "block.betterend.smaragdant_crystal_wall": "Smaragdant Wall" + "block.betterend.smaragdant_crystal_wall": "Smaragdant Wall", + "message.betterend.anvil_damage": "§cDamage" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index ae48d1e6..236a8ae4 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -867,5 +867,6 @@ "block.betterend.smaragdant_crystal_slab": "Смарагдантовая плита", "block.betterend.smaragdant_crystal_stairs": "Смарагдантовые ступени", "block.betterend.smaragdant_crystal_tiles": "Смарагдантовая плитка", - "block.betterend.smaragdant_crystal_wall": "Смарагдантовая стена" + "block.betterend.smaragdant_crystal_wall": "Смарагдантовая стена", + "message.betterend.anvil_damage": "§cПовреждение" } \ No newline at end of file From 6487ac81c6c25edf952f27c6c254d3b3b9fc8761 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 21 Apr 2021 21:49:39 +0300 Subject: [PATCH 440/463] Ice drop fix --- .../blocks/AncientEmeraldIceBlock.java | 18 +++++++++++++++++ .../blocks/DenseEmeraldIceBlock.java | 20 +++++++++++++++++++ .../ru/betterend/blocks/EmeraldIceBlock.java | 9 ++++++++- 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java index 61516a0a..7097ee98 100644 --- a/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java +++ b/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java @@ -1,13 +1,20 @@ package ru.betterend.blocks; +import java.util.Collections; +import java.util.List; import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndParticles; @@ -49,4 +56,15 @@ public class AncientEmeraldIceBlock extends BlockBase { private void makeParticles(ServerLevel world, BlockPos pos, Random random) { world.sendParticles(EndParticles.SNOWFLAKE, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 20, 0.5, 0.5, 0.5, 0); } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getOptionalParameter(LootContextParams.TOOL); + if (tool != null && EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) != 0) { + return Collections.singletonList(new ItemStack(this)); + } + else { + return Collections.emptyList(); + } + } } diff --git a/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java index 43a13c76..17d6a839 100644 --- a/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java +++ b/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java @@ -1,7 +1,16 @@ package ru.betterend.blocks; +import java.util.Collections; +import java.util.List; + import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; @@ -15,4 +24,15 @@ public class DenseEmeraldIceBlock extends BlockBase implements IRenderTypeable { public ERenderLayer getRenderLayer() { return ERenderLayer.TRANSLUCENT; } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getOptionalParameter(LootContextParams.TOOL); + if (tool != null && EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) != 0) { + return Collections.singletonList(new ItemStack(this)); + } + else { + return Collections.emptyList(); + } + } } diff --git a/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java index 04b93080..754dab66 100644 --- a/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java +++ b/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java @@ -24,6 +24,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.patterns.BlockPatterned; @@ -76,7 +77,13 @@ public class EmeraldIceBlock extends HalfTransparentBlock implements IRenderType @Override public List getDrops(BlockState state, LootContext.Builder builder) { - return Collections.singletonList(new ItemStack(this)); + ItemStack tool = builder.getOptionalParameter(LootContextParams.TOOL); + if (tool != null && EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) != 0) { + return Collections.singletonList(new ItemStack(this)); + } + else { + return Collections.emptyList(); + } } @Override From bc07b34f1c3e677a04d6e0cff9266ee884385806 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Thu, 22 Apr 2021 09:44:01 +0300 Subject: [PATCH 441/463] Changed TagLoader injection point --- .../mixin/common/TagLoaderMixin.java | 20 ++++++++++--------- .../java/ru/betterend/util/TagHelper.java | 4 +--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java b/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java index bdc9f568..1b627124 100644 --- a/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java @@ -3,11 +3,14 @@ package ru.betterend.mixin.common; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; +import java.util.function.Supplier; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.google.common.collect.Maps; @@ -16,20 +19,19 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.tags.Tag; import net.minecraft.tags.TagLoader; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import ru.betterend.util.TagHelper; @Mixin(TagLoader.class) public class TagLoaderMixin { @Shadow private String name; - - @Inject(method = "prepare", at = @At("RETURN"), cancellable = true) - public void be_prepareReload(ResourceManager manager, Executor executor, CallbackInfoReturnable>> info) { - CompletableFuture> future = info.getReturnValue(); - info.setReturnValue(CompletableFuture.supplyAsync(() -> { - Map map = Maps.newHashMap(future.join()); - TagHelper.apply(name, map); - return map; - }, executor)); + + @ModifyArg(method = "prepare", at = @At(value = "INVOKE", + target = "Ljava/util/concurrent/CompletableFuture;supplyAsync(Ljava/util/function/Supplier;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;")) + public Supplier> be_modifyTags(Supplier> supplier, Executor executor) { + Map map = supplier.get(); + TagHelper.apply(name, map); + return () -> map; } } diff --git a/src/main/java/ru/betterend/util/TagHelper.java b/src/main/java/ru/betterend/util/TagHelper.java index 4dcd6df9..0f44152b 100644 --- a/src/main/java/ru/betterend/util/TagHelper.java +++ b/src/main/java/ru/betterend/util/TagHelper.java @@ -66,9 +66,7 @@ public class TagHelper { endTags = TAGS_ITEM; } if (endTags != null) { - endTags.forEach((id, ids) -> { - apply(tagsMap.computeIfAbsent(id, key -> Tag.Builder.tag()), ids); - }); + endTags.forEach((id, ids) -> apply(tagsMap.computeIfAbsent(id, key -> Tag.Builder.tag()), ids)); } } } From 265cc1a666f194adbc3605dd44ed928275db584c Mon Sep 17 00:00:00 2001 From: Aleksey Date: Thu, 22 Apr 2021 09:50:32 +0300 Subject: [PATCH 442/463] A liitle bit refactor --- src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java | 4 +--- src/main/java/ru/betterend/util/TagHelper.java | 3 ++- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java b/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java index 1b627124..aabf889a 100644 --- a/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java @@ -30,8 +30,6 @@ public class TagLoaderMixin { @ModifyArg(method = "prepare", at = @At(value = "INVOKE", target = "Ljava/util/concurrent/CompletableFuture;supplyAsync(Ljava/util/function/Supplier;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;")) public Supplier> be_modifyTags(Supplier> supplier, Executor executor) { - Map map = supplier.get(); - TagHelper.apply(name, map); - return () -> map; + return () -> TagHelper.apply(name, supplier.get()); } } diff --git a/src/main/java/ru/betterend/util/TagHelper.java b/src/main/java/ru/betterend/util/TagHelper.java index 0f44152b..bef0ffb7 100644 --- a/src/main/java/ru/betterend/util/TagHelper.java +++ b/src/main/java/ru/betterend/util/TagHelper.java @@ -58,7 +58,7 @@ public class TagHelper { return builder; } - public static void apply(String entry, Map tagsMap) { + public static Map apply(String entry, Map tagsMap) { Map> endTags = null; if (entry.equals("block")) { endTags = TAGS_BLOCK; @@ -68,5 +68,6 @@ public class TagHelper { if (endTags != null) { endTags.forEach((id, ids) -> apply(tagsMap.computeIfAbsent(id, key -> Tag.Builder.tag()), ids)); } + return tagsMap; } } From dba8876bde5ac34a559b5ef1a4af57c5dfe06e1f Mon Sep 17 00:00:00 2001 From: Aleksey Date: Mon, 26 Apr 2021 09:43:22 +0300 Subject: [PATCH 443/463] Fix smelter exp, refactor --- .../entities/EndStoneSmelterBlockEntity.java | 142 +++++++++--------- .../gui/EndStoneSmelterScreenHandler.java | 105 +++++++------ 2 files changed, 123 insertions(+), 124 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java index 7f3672d2..49516b35 100644 --- a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java @@ -105,17 +105,17 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme } private boolean isBurning() { - return this.burnTime > 0; + return burnTime > 0; } @Override public int getContainerSize() { - return this.inventory.size(); + return inventory.size(); } @Override public boolean isEmpty() { - Iterator iterator = this.inventory.iterator(); + Iterator iterator = inventory.iterator(); ItemStack itemStack; do { if (!iterator.hasNext()) { @@ -129,40 +129,40 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme @Override public ItemStack getItem(int slot) { - return this.inventory.get(slot); + return inventory.get(slot); } @Override public ItemStack removeItem(int slot, int amount) { - return ContainerHelper.removeItem(this.inventory, slot, amount); + return ContainerHelper.removeItem(inventory, slot, amount); } @Override public ItemStack removeItemNoUpdate(int slot) { - return ContainerHelper.takeItem(this.inventory, slot); + return ContainerHelper.takeItem(inventory, slot); } @Override public void setItem(int slot, ItemStack stack) { - ItemStack itemStack = this.inventory.get(slot); + ItemStack itemStack = inventory.get(slot); boolean stackValid = !stack.isEmpty() && stack.sameItem(itemStack) && ItemStack.tagMatches(stack, itemStack); - this.inventory.set(slot, stack); + inventory.set(slot, stack); if (stack.getCount() > getMaxStackSize()) { stack.setCount(getMaxStackSize()); } if ((slot == 0 || slot == 1) && !stackValid) { - this.smeltTimeTotal = this.getSmeltTime(); - this.smeltTime = 0; - this.setChanged(); + smeltTimeTotal = getSmeltTime(); + smeltTime = 0; + setChanged(); } } protected int getSmeltTime() { - assert this.level != null; - int smeltTime = this.level.getRecipeManager().getRecipeFor(AlloyingRecipe.TYPE, this, level) + if (level == null) return 200; + int smeltTime = level.getRecipeManager().getRecipeFor(AlloyingRecipe.TYPE, this, level) .map(AlloyingRecipe::getSmeltTime).orElse(0); if (smeltTime == 0) { - smeltTime = this.level.getRecipeManager().getRecipeFor(RecipeType.BLASTING, this, level) + smeltTime = level.getRecipeManager().getRecipeFor(RecipeType.BLASTING, this, level) .map(BlastingRecipe::getCookingTime).orElse(200); smeltTime /= 1.5; } @@ -170,50 +170,49 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme } public void dropExperience(Player player) { - assert level != null; + if (level == null) return; List> list = Lists.newArrayList(); - for (Entry entry : this.recipesUsed.object2IntEntrySet()) { + for (Entry entry : recipesUsed.object2IntEntrySet()) { level.getRecipeManager().byKey(entry.getKey()).ifPresent((recipe) -> { list.add(recipe); if (recipe instanceof AlloyingRecipe) { AlloyingRecipe alloying = (AlloyingRecipe) recipe; - this.dropExperience(player.level, player.position(), entry.getIntValue(), alloying.getExperience()); + dropExperience(player.level, player.position(), entry.getIntValue(), alloying.getExperience()); } else { BlastingRecipe blasting = (BlastingRecipe) recipe; - this.dropExperience(player.level, player.position(), entry.getIntValue(), blasting.getExperience()); + dropExperience(player.level, player.position(), entry.getIntValue(), blasting.getExperience()); } }); } player.awardRecipes(list); - this.recipesUsed.clear(); + recipesUsed.clear(); } - private void dropExperience(Level world, Vec3 vec3d, int i, float f) { - int j = Mth.floor(i * f); - float g = Mth.frac(i * f); + private void dropExperience(Level world, Vec3 vec3d, int count, float amount) { + int expTotal = Mth.floor(count * amount); + float g = Mth.frac(count * amount); if (g != 0.0F && Math.random() < g) { - j++; + expTotal++; } - while(j > 0) { - int k = ExperienceOrb.getExperienceValue(j); - j -= k; - world.addFreshEntity(new ExperienceOrb(world, vec3d.x, vec3d.y, vec3d.z, k)); + while(expTotal > 0) { + int expVal = ExperienceOrb.getExperienceValue(expTotal); + expTotal -= expVal; + world.addFreshEntity(new ExperienceOrb(world, vec3d.x, vec3d.y, vec3d.z, expVal)); } } @Override public boolean stillValid(Player player) { - assert this.level != null; - if (this.level.getBlockEntity(this.worldPosition) != this) { + if (level != null && level.getBlockEntity(worldPosition) != this) { return false; } - return player.distanceToSqr(this.worldPosition.getX() + 0.5D, this.worldPosition.getY() + 0.5D, this.worldPosition.getZ() + 0.5D) <= 64.0D; + return player.distanceToSqr(worldPosition.getX() + 0.5D, worldPosition.getY() + 0.5D, worldPosition.getZ() + 0.5D) <= 64.0D; } @Override public void clearContent() { - this.inventory.clear(); + inventory.clear(); } @Override @@ -228,58 +227,59 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme @Override public void tick() { - boolean initialBurning = this.isBurning(); + if (level == null) return; + + boolean initialBurning = isBurning(); if (initialBurning) { - this.burnTime--; + burnTime--; } - boolean burning = this.isBurning(); - assert this.level != null; - if (!this.level.isClientSide) { - ItemStack fuel = this.inventory.get(2); + boolean burning = initialBurning; + if (!level.isClientSide) { + ItemStack fuel = inventory.get(2); if (!burning && (fuel.isEmpty() || inventory.get(0).isEmpty() && inventory.get(1).isEmpty())) { if (smeltTime > 0) { - this.smeltTime = Mth.clamp(smeltTime - 2, 0, smeltTimeTotal); + smeltTime = Mth.clamp(smeltTime - 2, 0, smeltTimeTotal); } } else { - Recipe recipe = this.level.getRecipeManager().getRecipeFor(AlloyingRecipe.TYPE, this, level).orElse(null); + Recipe recipe = level.getRecipeManager().getRecipeFor(AlloyingRecipe.TYPE, this, level).orElse(null); if (recipe == null) { - recipe = this.level.getRecipeManager().getRecipeFor(RecipeType.BLASTING, this, level).orElse(null); + recipe = level.getRecipeManager().getRecipeFor(RecipeType.BLASTING, this, level).orElse(null); } boolean accepted = this.canAcceptRecipeOutput(recipe); if (!burning && accepted) { - this.burnTime = this.getFuelTime(fuel); - this.fuelTime = this.burnTime; - burning = this.isBurning(); + burnTime = getFuelTime(fuel); + fuelTime = burnTime; + burning = isBurning(); if (burning) { if (!fuel.isEmpty()) { Item item = fuel.getItem(); fuel.shrink(1); if (fuel.isEmpty()) { Item remainFuel = item.getCraftingRemainingItem(); - this.inventory.set(2, remainFuel == null ? ItemStack.EMPTY : new ItemStack(remainFuel)); + inventory.set(2, remainFuel == null ? ItemStack.EMPTY : new ItemStack(remainFuel)); } } - this.setChanged(); + setChanged(); } } if (burning && accepted) { this.smeltTime++; if (smeltTime == smeltTimeTotal) { - this.smeltTime = 0; - this.smeltTimeTotal = this.getSmeltTime(); - this.craftRecipe(recipe); - this.setChanged(); + smeltTime = 0; + smeltTimeTotal = getSmeltTime(); + craftRecipe(recipe); + setChanged(); } } else { - this.smeltTime = 0; + smeltTime = 0; } } if (initialBurning != burning) { - this.level.setBlock(worldPosition, level.getBlockState(worldPosition).setValue(EndStoneSmelter.LIT, burning), 3); - this.setChanged(); + level.setBlock(worldPosition, level.getBlockState(worldPosition).setValue(EndStoneSmelter.LIT, burning), 3); + setChanged(); } } } @@ -308,8 +308,8 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme if (!output.sameItem(result)) { return false; } - if (outCount < this.getMaxStackSize() && outCount < output.getMaxStackSize()) { - return this.getMaxStackSize() >= total; + if (outCount < getMaxStackSize() && outCount < output.getMaxStackSize()) { + return getMaxStackSize() >= total; } return output.getCount() < result.getMaxStackSize(); } @@ -320,26 +320,26 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme if (recipe == null || !canAcceptRecipeOutput(recipe)) return; ItemStack result = recipe.getResultItem(); - ItemStack output = this.inventory.get(3); + ItemStack output = inventory.get(3); if (output.isEmpty()) { - this.inventory.set(3, result.copy()); + inventory.set(3, result.copy()); } else if (output.getItem() == result.getItem()) { output.grow(result.getCount()); } assert this.level != null; if (!this.level.isClientSide) { - this.setRecipeUsed(recipe); + setRecipeUsed(recipe); } if (recipe instanceof AlloyingRecipe) { - this.inventory.get(0).shrink(1); - this.inventory.get(1).shrink(1); + inventory.get(0).shrink(1); + inventory.get(1).shrink(1); } else { - if (!this.inventory.get(0).isEmpty()) { - this.inventory.get(0).shrink(1); + if (!inventory.get(0).isEmpty()) { + inventory.get(0).shrink(1); } else { - this.inventory.get(1).shrink(1); + inventory.get(1).shrink(1); } } } @@ -355,8 +355,8 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme public void setRecipeUsed(Recipe recipe) { if (recipe != null) { ResourceLocation recipeId = recipe.getId(); - this.recipesUsed.addTo(recipeId, 1); - this.lastRecipe = recipe; + recipesUsed.addTo(recipeId, 1); + lastRecipe = recipe; } } @@ -397,15 +397,15 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme @Override public void load(BlockState state, CompoundTag tag) { super.load(state, tag); - this.inventory = NonNullList.withSize(getContainerSize(), ItemStack.EMPTY); + inventory = NonNullList.withSize(getContainerSize(), ItemStack.EMPTY); ContainerHelper.loadAllItems(tag, inventory); - this.burnTime = tag.getShort("BurnTime"); - this.fuelTime = tag.getShort("FuelTime"); - this.smeltTime = tag.getShort("SmeltTime"); - this.smeltTimeTotal = tag.getShort("SmeltTimeTotal"); + burnTime = tag.getShort("BurnTime"); + fuelTime = tag.getShort("FuelTime"); + smeltTime = tag.getShort("SmeltTime"); + smeltTimeTotal = tag.getShort("SmeltTimeTotal"); CompoundTag compoundTag = tag.getCompound("RecipesUsed"); for (String id : compoundTag.getAllKeys()) { - this.recipesUsed.put(new ResourceLocation(id), compoundTag.getInt(id)); + recipesUsed.put(new ResourceLocation(id), compoundTag.getInt(id)); } } @@ -418,7 +418,7 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme tag.putShort("SmeltTimeTotal", (short) smeltTimeTotal); ContainerHelper.saveAllItems(tag, inventory); CompoundTag usedRecipes = new CompoundTag(); - this.recipesUsed.forEach((identifier, integer) -> usedRecipes.putInt(identifier.toString(), integer)); + recipesUsed.forEach((identifier, integer) -> usedRecipes.putInt(identifier.toString(), integer)); tag.put("RecipesUsed", usedRecipes); return tag; diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java index 27e29418..e2c98053 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java @@ -44,19 +44,19 @@ public class EndStoneSmelterScreenHandler extends RecipeBookMenu { this.propertyDelegate = propertyDelegate; this.world = playerInventory.player.level; - this.addDataSlots(propertyDelegate); - this.addSlot(new Slot(inventory, 0, 45, 17)); - this.addSlot(new Slot(inventory, 1, 67, 17)); - this.addSlot(new SmelterFuelSlot(this, inventory, 2, 56, 53)); - this.addSlot(new SmelterOutputSlot(playerInventory.player, inventory, 3, 129, 35)); + addDataSlots(propertyDelegate); + addSlot(new Slot(inventory, 0, 45, 17)); + addSlot(new Slot(inventory, 1, 67, 17)); + addSlot(new SmelterFuelSlot(this, inventory, 2, 56, 53)); + addSlot(new SmelterOutputSlot(playerInventory.player, inventory, 3, 129, 35)); for(int i = 0; i < 3; ++i) { for(int j = 0; j < 9; ++j) { - this.addSlot(new Slot(playerInventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + addSlot(new Slot(playerInventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); } } for(int i = 0; i < 9; ++i) { - this.addSlot(new Slot(playerInventory, i, 8 + i * 18, 142)); + addSlot(new Slot(playerInventory, i, 8 + i * 18, 142)); } } @@ -74,12 +74,12 @@ public class EndStoneSmelterScreenHandler extends RecipeBookMenu { @Override public void clearCraftingContent() { - this.inventory.clearContent(); + inventory.clearContent(); } @Override public boolean recipeMatches(Recipe recipe) { - return recipe.matches(this.inventory, this.world); + return recipe.matches(inventory, world); } @Override @@ -109,11 +109,11 @@ public class EndStoneSmelterScreenHandler extends RecipeBookMenu { @Override public boolean stillValid(Player player) { - return this.inventory.stillValid(player); + return inventory.stillValid(player); } protected boolean isSmeltable(ItemStack itemStack) { - return this.world.getRecipeManager().getRecipeFor(AlloyingRecipe.TYPE, new SimpleContainer(itemStack), this.world).isPresent(); + return world.getRecipeManager().getRecipeFor(AlloyingRecipe.TYPE, new SimpleContainer(itemStack), world).isPresent(); } public boolean isFuel(ItemStack itemStack) { @@ -122,70 +122,69 @@ public class EndStoneSmelterScreenHandler extends RecipeBookMenu { @Override public ItemStack quickMoveStack(Player player, int index) { - ItemStack itemStack = ItemStack.EMPTY; - Slot slot = this.slots.get(index); - if (slot != null && slot.hasItem()) { - ItemStack itemStack2 = slot.getItem(); - itemStack = itemStack2.copy(); - if (index == 3) { - if (moveItemStackTo(itemStack2, 4, 40, true)) { - return ItemStack.EMPTY; - } - slot.onQuickCraft(itemStack2, itemStack); - } else if (index != 2 && index != 1 && index != 0) { - if (isSmeltable(itemStack2)) { - if (!moveItemStackTo(itemStack2, 0, 2, false)) { - return ItemStack.EMPTY; - } - } else if (isFuel(itemStack2)) { - if (!this.moveItemStackTo(itemStack2, 2, 3, false)) { - return ItemStack.EMPTY; - } - } else if (index < 31) { - if (!moveItemStackTo(itemStack2, 31, 40, false)) { - return ItemStack.EMPTY; - } - } else if (index < 40 && !moveItemStackTo(itemStack2, 4, 31, false)) { - return ItemStack.EMPTY; - } - } else if (!moveItemStackTo(itemStack2, 4, 40, false)) { + Slot slot = slots.get(index); + if (slot == null || !slot.hasItem()) return ItemStack.EMPTY; + + ItemStack slotStack = slot.getItem(); + ItemStack itemStack = slotStack.copy(); + if (index == 3) { + if (!moveItemStackTo(slotStack, 4, 40, true)) { return ItemStack.EMPTY; } - - if (itemStack2.isEmpty()) { - slot.set(ItemStack.EMPTY); - } else { - slot.setChanged(); - } - - if (itemStack2.getCount() == itemStack.getCount()) { + slot.onQuickCraft(slotStack, itemStack); + } else if (index != 2 && index != 1 && index != 0) { + if (isSmeltable(slotStack)) { + if (!moveItemStackTo(slotStack, 0, 2, false)) { + return ItemStack.EMPTY; + } + } else if (isFuel(slotStack)) { + if (!moveItemStackTo(slotStack, 2, 3, false)) { + return ItemStack.EMPTY; + } + } else if (index < 31) { + if (!moveItemStackTo(slotStack, 31, 40, false)) { + return ItemStack.EMPTY; + } + } else if (index < 40 && !moveItemStackTo(slotStack, 4, 31, false)) { return ItemStack.EMPTY; } - - slot.onTake(player, itemStack2); + } else if (!moveItemStackTo(slotStack, 4, 40, false)) { + return ItemStack.EMPTY; } + if (slotStack.isEmpty()) { + slot.set(ItemStack.EMPTY); + } else { + slot.setChanged(); + } + + if (slotStack.getCount() == itemStack.getCount()) { + return ItemStack.EMPTY; + } + + slot.onTake(player, slotStack); + return itemStack; } @Environment(EnvType.CLIENT) public int getSmeltProgress() { - int time = this.propertyDelegate.get(2); - int timeTotal = this.propertyDelegate.get(3); + int time = propertyDelegate.get(2); + int timeTotal = propertyDelegate.get(3); return timeTotal != 0 && time != 0 ? time * 24 / timeTotal : 0; } @Environment(EnvType.CLIENT) public int getFuelProgress() { - int fuelTime = this.propertyDelegate.get(1); + int fuelTime = propertyDelegate.get(1); if (fuelTime == 0) { fuelTime = 200; } - return this.propertyDelegate.get(0) * 13 / fuelTime; + return propertyDelegate.get(0) * 13 / fuelTime; } @Environment(EnvType.CLIENT) public boolean isBurning() { - return this.propertyDelegate.get(0) > 0; + return propertyDelegate.get(0) > 0; } } From d897bb09d8f4de08c56b1ed58a0672da817df6eb Mon Sep 17 00:00:00 2001 From: Aleksey Date: Mon, 26 Apr 2021 09:51:26 +0300 Subject: [PATCH 444/463] Cleanup --- .../mixin/common/TagLoaderMixin.java | 23 ++++++------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java b/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java index aabf889a..d398bd84 100644 --- a/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java @@ -1,27 +1,18 @@ package ru.betterend.mixin.common; -import java.util.Map; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.Executor; -import java.util.function.Supplier; - +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.Tag; +import net.minecraft.tags.TagLoader; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.At.Shift; -import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyArg; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import com.google.common.collect.Maps; - -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.resources.ResourceManager; -import net.minecraft.tags.Tag; -import net.minecraft.tags.TagLoader; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import ru.betterend.util.TagHelper; +import java.util.Map; +import java.util.concurrent.Executor; +import java.util.function.Supplier; + @Mixin(TagLoader.class) public class TagLoaderMixin { @Shadow From 387a430fde484a804f77e4109a858bcdf54bd37f Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 26 Apr 2021 21:51:53 +0300 Subject: [PATCH 445/463] Neon cactus growing (WIP) & additional textures --- .../ru/betterend/blocks/BlockProperties.java | 43 ++++++- .../ru/betterend/blocks/NeonCactusBlock.java | 121 +++++++++++++++++- .../mixin/common/TagLoaderMixin.java | 19 +-- .../world/features/NeonCactusFeature.java | 23 +++- .../world/features/WallScatterFeature.java | 3 +- .../betterend/world/generator/BiomeChunk.java | 22 ++-- .../betterend/blockstates/neon_cactus.json | 78 ++++++++--- .../models/block/neon_cactus_big_moss.json | 34 +++++ .../models/block/neon_cactus_big_sand.json | 34 +++++ .../models/block/neon_cactus_medium_moss.json | 58 +++++++++ .../models/block/neon_cactus_medium_sand.json | 58 +++++++++ .../models/block/neon_cactus_small_moss.json | 58 +++++++++ .../models/block/neon_cactus_small_sand.json | 58 +++++++++ .../textures/block/end_moss_side.png | Bin 645 -> 298 bytes .../betterend/textures/block/end_moss_top.png | Bin 720 -> 234 bytes .../block/neon_cactus_big_side_dust.png | Bin 0 -> 1834 bytes .../neon_cactus_big_side_dust_overlay.png | Bin 0 -> 1753 bytes .../block/neon_cactus_big_side_moss.png | Bin 0 -> 331 bytes .../neon_cactus_big_side_moss_overlay.png | Bin 0 -> 1765 bytes .../block/neon_cactus_medium_side_dust.png | Bin 0 -> 303 bytes .../neon_cactus_medium_side_dust_overlay.png | Bin 0 -> 164 bytes .../block/neon_cactus_medium_side_moss.png | Bin 0 -> 324 bytes .../neon_cactus_medium_side_moss_overlay.png | Bin 0 -> 185 bytes .../textures/block/neon_cactus_small_side.png | Bin 256 -> 257 bytes .../block/neon_cactus_small_side_dust.png | Bin 0 -> 282 bytes .../neon_cactus_small_side_dust_overlay.png | Bin 0 -> 157 bytes .../block/neon_cactus_small_side_moss.png | Bin 0 -> 304 bytes .../neon_cactus_small_side_moss_overlay.png | Bin 0 -> 186 bytes 28 files changed, 554 insertions(+), 55 deletions(-) create mode 100644 src/main/resources/assets/betterend/models/block/neon_cactus_big_moss.json create mode 100644 src/main/resources/assets/betterend/models/block/neon_cactus_big_sand.json create mode 100644 src/main/resources/assets/betterend/models/block/neon_cactus_medium_moss.json create mode 100644 src/main/resources/assets/betterend/models/block/neon_cactus_medium_sand.json create mode 100644 src/main/resources/assets/betterend/models/block/neon_cactus_small_moss.json create mode 100644 src/main/resources/assets/betterend/models/block/neon_cactus_small_sand.json create mode 100644 src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_dust.png create mode 100644 src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_dust_overlay.png create mode 100644 src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_moss.png create mode 100644 src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_moss_overlay.png create mode 100644 src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_dust.png create mode 100644 src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_dust_overlay.png create mode 100644 src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_moss.png create mode 100644 src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_moss_overlay.png create mode 100644 src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_dust.png create mode 100644 src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_dust_overlay.png create mode 100644 src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_moss.png create mode 100644 src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_moss_overlay.png diff --git a/src/main/java/ru/betterend/blocks/BlockProperties.java b/src/main/java/ru/betterend/blocks/BlockProperties.java index 5a7df101..3c0cbb0d 100644 --- a/src/main/java/ru/betterend/blocks/BlockProperties.java +++ b/src/main/java/ru/betterend/blocks/BlockProperties.java @@ -8,7 +8,8 @@ import ru.betterend.registry.EndPortals; public class BlockProperties { public static final EnumProperty HYDRALUX_SHAPE = EnumProperty.create("shape", HydraluxShape.class); - public final static EnumProperty PEDESTAL_STATE = EnumProperty.create("state", PedestalState.class); + public static final EnumProperty PEDESTAL_STATE = EnumProperty.create("state", PedestalState.class); + public static final EnumProperty CACTUS_BOTTOM = EnumProperty.create("bottom", CactusBottom.class); public static final EnumProperty TRIPLE_SHAPE = EnumProperty.create("shape", TripleShape.class); public static final EnumProperty PENTA_SHAPE = EnumProperty.create("shape", PentaShape.class); @@ -30,14 +31,16 @@ public class BlockProperties { public static final IntegerProperty AGE = IntegerProperty.create("age", 0, 3); public static enum TripleShape implements StringRepresentable { - TOP("top"), - MIDDLE("middle"), - BOTTOM("bottom"); + TOP("top", 0), + MIDDLE("middle", 1), + BOTTOM("bottom", 2); private final String name; + private final int index; - TripleShape(String name) { + TripleShape(String name, int index) { this.name = name; + this.index = index; } @Override @@ -49,6 +52,14 @@ public class BlockProperties { public String toString() { return name; } + + public int getIndex() { + return index; + } + + public static TripleShape fromIndex(int index) { + return index > 1 ? BOTTOM : index == 1 ? MIDDLE : TOP; + } } public static enum PedestalState implements StringRepresentable { @@ -162,4 +173,26 @@ public class BlockProperties { return light; } } + + public static enum CactusBottom implements StringRepresentable { + EMPTY("empty"), + SAND("sand"), + MOSS("moss"); + + private final String name; + + CactusBottom(String name) { + this.name = name; + } + + @Override + public String getSerializedName() { + return name; + } + + @Override + public String toString() { + return name; + } + } } diff --git a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java index e526c390..e6f3dba5 100644 --- a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java +++ b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java @@ -1,13 +1,16 @@ package ru.betterend.blocks; import java.util.EnumMap; +import java.util.Random; import com.google.common.collect.Maps; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.LevelAccessor; @@ -27,14 +30,18 @@ import net.minecraft.world.level.material.Fluids; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.BlockProperties.CactusBottom; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.BlockBaseNotFull; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; public class NeonCactusBlock extends BlockBaseNotFull implements SimpleWaterloggedBlock, IRenderTypeable { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; + public static final EnumProperty CACTUS_BOTTOM = BlockProperties.CACTUS_BOTTOM; public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; public static final DirectionProperty FACING = BlockStateProperties.FACING; @@ -44,20 +51,32 @@ public class NeonCactusBlock extends BlockBaseNotFull implements SimpleWaterlogg private static final EnumMap SMALL_SHAPES = Maps.newEnumMap(Axis.class); public NeonCactusBlock() { - super(FabricBlockSettings.copyOf(Blocks.CACTUS).luminance(15)); + super(FabricBlockSettings.copyOf(Blocks.CACTUS).luminance(15).randomTicks()); registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false).setValue(FACING, Direction.UP).setValue(SHAPE, TripleShape.TOP)); } @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { - stateManager.add(SHAPE, WATERLOGGED, FACING); + stateManager.add(SHAPE, CACTUS_BOTTOM, WATERLOGGED, FACING); } @Override public BlockState getStateForPlacement(BlockPlaceContext ctx) { - LevelAccessor worldAccess = ctx.getLevel(); - BlockPos blockPos = ctx.getClickedPos(); - return this.defaultBlockState().setValue(WATERLOGGED, worldAccess.getFluidState(blockPos).getType() == Fluids.WATER).setValue(FACING, ctx.getClickedFace()); + LevelAccessor world = ctx.getLevel(); + BlockPos pos = ctx.getClickedPos(); + Direction dir = ctx.getClickedFace(); + BlockState down = world.getBlockState(pos.relative(dir.getOpposite())); + BlockState state = this.defaultBlockState().setValue(WATERLOGGED, world.getFluidState(pos).getType() == Fluids.WATER).setValue(FACING, ctx.getClickedFace()); + if (down.is(Blocks.END_STONE) || down.is(EndBlocks.ENDSTONE_DUST)) { + state = state.setValue(CACTUS_BOTTOM, CactusBottom.SAND); + } + else if (down.is(EndBlocks.END_MOSS)) { + state = state.setValue(CACTUS_BOTTOM, CactusBottom.MOSS); + } + else { + state = state.setValue(CACTUS_BOTTOM, CactusBottom.EMPTY); + } + return state; } @Override @@ -80,6 +99,17 @@ public class NeonCactusBlock extends BlockBaseNotFull implements SimpleWaterlogg if ((Boolean) state.getValue(WATERLOGGED)) { world.getLiquidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); } + Direction dir = state.getValue(FACING); + BlockState down = world.getBlockState(pos.relative(dir.getOpposite())); + if (down.is(Blocks.END_STONE) || down.is(EndBlocks.ENDSTONE_DUST)) { + state = state.setValue(CACTUS_BOTTOM, CactusBottom.SAND); + } + else if (down.is(EndBlocks.END_MOSS)) { + state = state.setValue(CACTUS_BOTTOM, CactusBottom.MOSS); + } + else { + state = state.setValue(CACTUS_BOTTOM, CactusBottom.EMPTY); + } return state; } @@ -106,6 +136,87 @@ public class NeonCactusBlock extends BlockBaseNotFull implements SimpleWaterlogg } } + @Override + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + Direction dir = state.getValue(FACING); + if (!world.getBlockState(pos.relative(dir)).isAir() || world.getBlockState(pos.above()).is(this)) { + return; + } + int length = getLength(state, world, pos, 10); + if (length < 0 || length > 9) { + return; + } + int horizontal = getHorizontal(state, world, pos, 5); + if (horizontal > random.nextInt(2)) { + dir = Direction.UP; + if (!world.getBlockState(pos.above()).isAir()) { + return; + } + } + BlockState placement = state.setValue(SHAPE, TripleShape.TOP).setValue(CACTUS_BOTTOM, CactusBottom.EMPTY).setValue(WATERLOGGED, false).setValue(FACING, dir); + BlocksHelper.setWithoutUpdate(world, pos.relative(dir), placement); + mutateStem(placement, world, pos, 10); + } + + private int getLength(BlockState state, ServerLevel world, BlockPos pos, int max) { + int length = 0; + Direction dir = state.getValue(FACING).getOpposite(); + MutableBlockPos mut = new MutableBlockPos().set(pos); + for (int i = 0; i < max; i++) { + mut.move(dir); + state = world.getBlockState(mut); + if (!state.is(this)) { + if (!state.is(EndTags.END_GROUND)) { + length = -1; + } + break; + } + dir = state.getValue(FACING).getOpposite(); + length ++; + } + return length; + } + + private int getHorizontal(BlockState state, ServerLevel world, BlockPos pos, int max) { + int count = 0; + Direction dir = state.getValue(FACING).getOpposite(); + MutableBlockPos mut = new MutableBlockPos().set(pos); + for (int i = 0; i < max; i++) { + mut.move(dir); + state = world.getBlockState(mut); + if (!state.is(this)) { + break; + } + dir = state.getValue(FACING).getOpposite(); + if (dir.getStepY() != 0) { + break; + } + count ++; + } + return count; + } + + private void mutateStem(BlockState state, ServerLevel world, BlockPos pos, int max) { + Direction dir = state.getValue(FACING).getOpposite(); + MutableBlockPos mut = new MutableBlockPos().set(pos); + for (int i = 0; i < max; i++) { + mut.move(dir); + state = world.getBlockState(mut); + if (!state.is(this)) { + return; + } + int size = i * 3 / max; + int src = state.getValue(SHAPE).getIndex(); + if (src < size) { + TripleShape shape = TripleShape.fromIndex(size); + BlocksHelper.setWithoutUpdate(world, pos, state.setValue(SHAPE, shape)); + } + else { + return; + } + } + } + static { MEDIUM_SHAPES.put(Axis.X, Block.box(0, 2, 2, 16, 14, 14)); MEDIUM_SHAPES.put(Axis.Y, Block.box(2, 0, 2, 14, 16, 14)); diff --git a/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java b/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java index d398bd84..46b477ec 100644 --- a/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/common/TagLoaderMixin.java @@ -1,18 +1,19 @@ package ru.betterend.mixin.common; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.Tag; -import net.minecraft.tags.TagLoader; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyArg; -import ru.betterend.util.TagHelper; - import java.util.Map; import java.util.concurrent.Executor; import java.util.function.Supplier; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.Tag; +import net.minecraft.tags.TagLoader; +import ru.betterend.util.TagHelper; + @Mixin(TagLoader.class) public class TagLoaderMixin { @Shadow diff --git a/src/main/java/ru/betterend/world/features/NeonCactusFeature.java b/src/main/java/ru/betterend/world/features/NeonCactusFeature.java index 3bdb8c1d..2accf7f3 100644 --- a/src/main/java/ru/betterend/world/features/NeonCactusFeature.java +++ b/src/main/java/ru/betterend/world/features/NeonCactusFeature.java @@ -6,10 +6,13 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.BlockProperties; +import ru.betterend.blocks.BlockProperties.CactusBottom; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlocksHelper; @@ -31,9 +34,23 @@ public class NeonCactusFeature extends DefaultFeature { break; } int size = (h - i) >> 2; - BlocksHelper.setWithUpdate(world, mut, - EndBlocks.NEON_CACTUS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, getBySize(size)) - .setValue(BlockStateProperties.FACING, Direction.UP)); + BlockState state = EndBlocks.NEON_CACTUS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, getBySize(size)).setValue(BlockStateProperties.FACING, Direction.UP); + if (i == 0) { + BlockState down = world.getBlockState(mut.below()); + if (down.is(Blocks.END_STONE) || down.is(EndBlocks.ENDSTONE_DUST)) { + state = state.setValue(BlockProperties.CACTUS_BOTTOM, CactusBottom.SAND); + } + else if (down.is(EndBlocks.END_MOSS)) { + state = state.setValue(BlockProperties.CACTUS_BOTTOM, CactusBottom.MOSS); + } + else { + state = state.setValue(BlockProperties.CACTUS_BOTTOM, CactusBottom.EMPTY); + } + } + else { + state = state.setValue(BlockProperties.CACTUS_BOTTOM, CactusBottom.EMPTY); + } + BlocksHelper.setWithUpdate(world, mut, state); if (i > 2 && i < (h - 1) && random.nextBoolean()) { int length = h - i - MHelper.randRange(1, 2, random); if (length > 0) { diff --git a/src/main/java/ru/betterend/world/features/WallScatterFeature.java b/src/main/java/ru/betterend/world/features/WallScatterFeature.java index 5563c1ed..977122bf 100644 --- a/src/main/java/ru/betterend/world/features/WallScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/WallScatterFeature.java @@ -25,8 +25,7 @@ public abstract class WallScatterFeature extends DefaultFeature { public abstract void generate(WorldGenLevel world, Random random, BlockPos pos, Direction dir); @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, - NoneFeatureConfiguration featureConfig) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, NoneFeatureConfiguration featureConfig) { int maxY = world.getHeight(Heightmap.Types.WORLD_SURFACE, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); if (maxY < 10 || maxY < minY) { diff --git a/src/main/java/ru/betterend/world/generator/BiomeChunk.java b/src/main/java/ru/betterend/world/generator/BiomeChunk.java index 96dd258f..3756eec9 100644 --- a/src/main/java/ru/betterend/world/generator/BiomeChunk.java +++ b/src/main/java/ru/betterend/world/generator/BiomeChunk.java @@ -4,36 +4,32 @@ import java.util.Random; import ru.betterend.world.biome.EndBiome; -public class BiomeChunk -{ +public class BiomeChunk { protected static final int WIDTH = 16; private static final int SM_WIDTH = WIDTH >> 1; private static final int MASK_OFFSET = SM_WIDTH - 1; protected static final int MASK_WIDTH = WIDTH - 1; - + private final EndBiome[][] biomes; - - public BiomeChunk(BiomeMap map, Random random, BiomePicker picker) - { + + public BiomeChunk(BiomeMap map, Random random, BiomePicker picker) { EndBiome[][] PreBio = new EndBiome[SM_WIDTH][SM_WIDTH]; biomes = new EndBiome[WIDTH][WIDTH]; - + for (int x = 0; x < SM_WIDTH; x++) for (int z = 0; z < SM_WIDTH; z++) PreBio[x][z] = picker.getBiome(random); - + for (int x = 0; x < WIDTH; x++) for (int z = 0; z < WIDTH; z++) biomes[x][z] = PreBio[offsetXZ(x, random)][offsetXZ(z, random)].getSubBiome(random); } - public EndBiome getBiome(int x, int z) - { + public EndBiome getBiome(int x, int z) { return biomes[x & MASK_WIDTH][z & MASK_WIDTH]; } - - private int offsetXZ(int x, Random random) - { + + private int offsetXZ(int x, Random random) { return ((x + random.nextInt(2)) >> 1) & MASK_OFFSET; } } diff --git a/src/main/resources/assets/betterend/blockstates/neon_cactus.json b/src/main/resources/assets/betterend/blockstates/neon_cactus.json index d72dcb4c..3bf98f48 100644 --- a/src/main/resources/assets/betterend/blockstates/neon_cactus.json +++ b/src/main/resources/assets/betterend/blockstates/neon_cactus.json @@ -1,24 +1,66 @@ { "variants": { - "shape=bottom,facing=up": { "model": "betterend:block/neon_cactus_big" }, - "shape=bottom,facing=down": { "model": "betterend:block/neon_cactus_big", "x": 180 }, - "shape=bottom,facing=north": { "model": "betterend:block/neon_cactus_big", "x": 90 }, - "shape=bottom,facing=south": { "model": "betterend:block/neon_cactus_big", "x": 90, "y": 180 }, - "shape=bottom,facing=east": { "model": "betterend:block/neon_cactus_big", "x": 90, "y": 90 }, - "shape=bottom,facing=west": { "model": "betterend:block/neon_cactus_big", "x": 90, "y": 270 }, + "bottom=empty,shape=bottom,facing=up": { "model": "betterend:block/neon_cactus_big" }, + "bottom=empty,shape=bottom,facing=down": { "model": "betterend:block/neon_cactus_big", "x": 180 }, + "bottom=empty,shape=bottom,facing=north": { "model": "betterend:block/neon_cactus_big", "x": 90 }, + "bottom=empty,shape=bottom,facing=south": { "model": "betterend:block/neon_cactus_big", "x": 90, "y": 180 }, + "bottom=empty,shape=bottom,facing=east": { "model": "betterend:block/neon_cactus_big", "x": 90, "y": 90 }, + "bottom=empty,shape=bottom,facing=west": { "model": "betterend:block/neon_cactus_big", "x": 90, "y": 270 }, - "shape=middle,facing=up": { "model": "betterend:block/neon_cactus_medium" }, - "shape=middle,facing=down": { "model": "betterend:block/neon_cactus_medium", "x": 180 }, - "shape=middle,facing=north": { "model": "betterend:block/neon_cactus_medium", "x": 90 }, - "shape=middle,facing=south": { "model": "betterend:block/neon_cactus_medium", "x": 90, "y": 180 }, - "shape=middle,facing=east": { "model": "betterend:block/neon_cactus_medium", "x": 90, "y": 90 }, - "shape=middle,facing=west": { "model": "betterend:block/neon_cactus_medium", "x": 90, "y": 270 }, + "bottom=sand,shape=bottom,facing=up": { "model": "betterend:block/neon_cactus_big_sand" }, + "bottom=sand,shape=bottom,facing=down": { "model": "betterend:block/neon_cactus_big_sand", "x": 180 }, + "bottom=sand,shape=bottom,facing=north": { "model": "betterend:block/neon_cactus_big_sand", "x": 90 }, + "bottom=sand,shape=bottom,facing=south": { "model": "betterend:block/neon_cactus_big_sand", "x": 90, "y": 180 }, + "bottom=sand,shape=bottom,facing=east": { "model": "betterend:block/neon_cactus_big_sand", "x": 90, "y": 90 }, + "bottom=sand,shape=bottom,facing=west": { "model": "betterend:block/neon_cactus_big_sand", "x": 90, "y": 270 }, - "shape=top,facing=up": { "model": "betterend:block/neon_cactus_small" }, - "shape=top,facing=down": { "model": "betterend:block/neon_cactus_small", "x": 180 }, - "shape=top,facing=north": { "model": "betterend:block/neon_cactus_small", "x": 90 }, - "shape=top,facing=south": { "model": "betterend:block/neon_cactus_small", "x": 90, "y": 180 }, - "shape=top,facing=east": { "model": "betterend:block/neon_cactus_small", "x": 90, "y": 90 }, - "shape=top,facing=west": { "model": "betterend:block/neon_cactus_small", "x": 90, "y": 270 } + "bottom=moss,shape=bottom,facing=up": { "model": "betterend:block/neon_cactus_big_moss" }, + "bottom=moss,shape=bottom,facing=down": { "model": "betterend:block/neon_cactus_big_moss", "x": 180 }, + "bottom=moss,shape=bottom,facing=north": { "model": "betterend:block/neon_cactus_big_moss", "x": 90 }, + "bottom=moss,shape=bottom,facing=south": { "model": "betterend:block/neon_cactus_big_moss", "x": 90, "y": 180 }, + "bottom=moss,shape=bottom,facing=east": { "model": "betterend:block/neon_cactus_big_moss", "x": 90, "y": 90 }, + "bottom=moss,shape=bottom,facing=west": { "model": "betterend:block/neon_cactus_big_moss", "x": 90, "y": 270 }, + + "bottom=empty,shape=middle,facing=up": { "model": "betterend:block/neon_cactus_medium" }, + "bottom=empty,shape=middle,facing=down": { "model": "betterend:block/neon_cactus_medium", "x": 180 }, + "bottom=empty,shape=middle,facing=north": { "model": "betterend:block/neon_cactus_medium", "x": 90 }, + "bottom=empty,shape=middle,facing=south": { "model": "betterend:block/neon_cactus_medium", "x": 90, "y": 180 }, + "bottom=empty,shape=middle,facing=east": { "model": "betterend:block/neon_cactus_medium", "x": 90, "y": 90 }, + "bottom=empty,shape=middle,facing=west": { "model": "betterend:block/neon_cactus_medium", "x": 90, "y": 270 }, + + "bottom=sand,shape=middle,facing=up": { "model": "betterend:block/neon_cactus_medium_sand" }, + "bottom=sand,shape=middle,facing=down": { "model": "betterend:block/neon_cactus_medium_sand", "x": 180 }, + "bottom=sand,shape=middle,facing=north": { "model": "betterend:block/neon_cactus_medium_sand", "x": 90 }, + "bottom=sand,shape=middle,facing=south": { "model": "betterend:block/neon_cactus_medium_sand", "x": 90, "y": 180 }, + "bottom=sand,shape=middle,facing=east": { "model": "betterend:block/neon_cactus_medium_sand", "x": 90, "y": 90 }, + "bottom=sand,shape=middle,facing=west": { "model": "betterend:block/neon_cactus_medium_sand", "x": 90, "y": 270 }, + + "bottom=moss,shape=middle,facing=up": { "model": "betterend:block/neon_cactus_medium_moss" }, + "bottom=moss,shape=middle,facing=down": { "model": "betterend:block/neon_cactus_medium_moss", "x": 180 }, + "bottom=moss,shape=middle,facing=north": { "model": "betterend:block/neon_cactus_medium_moss", "x": 90 }, + "bottom=moss,shape=middle,facing=south": { "model": "betterend:block/neon_cactus_medium_moss", "x": 90, "y": 180 }, + "bottom=moss,shape=middle,facing=east": { "model": "betterend:block/neon_cactus_medium_moss", "x": 90, "y": 90 }, + "bottom=moss,shape=middle,facing=west": { "model": "betterend:block/neon_cactus_medium_moss", "x": 90, "y": 270 }, + + "bottom=empty,shape=top,facing=up": { "model": "betterend:block/neon_cactus_small" }, + "bottom=empty,shape=top,facing=down": { "model": "betterend:block/neon_cactus_small", "x": 180 }, + "bottom=empty,shape=top,facing=north": { "model": "betterend:block/neon_cactus_small", "x": 90 }, + "bottom=empty,shape=top,facing=south": { "model": "betterend:block/neon_cactus_small", "x": 90, "y": 180 }, + "bottom=empty,shape=top,facing=east": { "model": "betterend:block/neon_cactus_small", "x": 90, "y": 90 }, + "bottom=empty,shape=top,facing=west": { "model": "betterend:block/neon_cactus_small", "x": 90, "y": 270 }, + + "bottom=sand,shape=top,facing=up": { "model": "betterend:block/neon_cactus_small_sand" }, + "bottom=sand,shape=top,facing=down": { "model": "betterend:block/neon_cactus_small_sand", "x": 180 }, + "bottom=sand,shape=top,facing=north": { "model": "betterend:block/neon_cactus_small_sand", "x": 90 }, + "bottom=sand,shape=top,facing=south": { "model": "betterend:block/neon_cactus_small_sand", "x": 90, "y": 180 }, + "bottom=sand,shape=top,facing=east": { "model": "betterend:block/neon_cactus_small_sand", "x": 90, "y": 90 }, + "bottom=sand,shape=top,facing=west": { "model": "betterend:block/neon_cactus_small_sand", "x": 90, "y": 270 }, + + "bottom=moss,shape=top,facing=up": { "model": "betterend:block/neon_cactus_small_moss" }, + "bottom=moss,shape=top,facing=down": { "model": "betterend:block/neon_cactus_small_moss", "x": 180 }, + "bottom=moss,shape=top,facing=north": { "model": "betterend:block/neon_cactus_small_moss", "x": 90 }, + "bottom=moss,shape=top,facing=south": { "model": "betterend:block/neon_cactus_small_moss", "x": 90, "y": 180 }, + "bottom=moss,shape=top,facing=east": { "model": "betterend:block/neon_cactus_small_moss", "x": 90, "y": 90 }, + "bottom=moss,shape=top,facing=west": { "model": "betterend:block/neon_cactus_small_moss", "x": 90, "y": 270 } } } diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_big_moss.json b/src/main/resources/assets/betterend/models/block/neon_cactus_big_moss.json new file mode 100644 index 00000000..2315eced --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_big_moss.json @@ -0,0 +1,34 @@ +{ + "parent": "block/block", + "textures": { + "end": "betterend:block/neon_cactus_big_top", + "side": "betterend:block/neon_cactus_big_side_moss", + "overlay": "betterend:block/neon_cactus_big_side_moss_overlay", + "particle": "#side" + }, + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#end", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#end", "cullface": "up" }, + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "west" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "east" } + } + }, + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "north" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "south" }, + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "west" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "east" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_big_sand.json b/src/main/resources/assets/betterend/models/block/neon_cactus_big_sand.json new file mode 100644 index 00000000..be4e3c1c --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_big_sand.json @@ -0,0 +1,34 @@ +{ + "parent": "block/block", + "textures": { + "end": "betterend:block/neon_cactus_big_top", + "side": "betterend:block/neon_cactus_big_side_dust", + "overlay": "betterend:block/neon_cactus_big_side_dust_overlay", + "particle": "#side" + }, + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#end", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#end", "cullface": "up" }, + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "west" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "east" } + } + }, + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "north" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "south" }, + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "west" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "east" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_medium_moss.json b/src/main/resources/assets/betterend/models/block/neon_cactus_medium_moss.json new file mode 100644 index 00000000..b939193c --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_medium_moss.json @@ -0,0 +1,58 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/neon_cactus_small_side", + "overlay": "betterend:block/neon_cactus_medium_side_moss_overlay", + "side": "betterend:block/neon_cactus_medium_side_moss", + "top": "betterend:block/neon_cactus_medium_top" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 2, -2, 2 ], + "to": [ 14, 14, 14 ], + "shade": false, + "faces": { + "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "north": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, + "south": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, + "west": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, + "east": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" } + } + }, + { + "__comment": "Box1", + "from": [ 2, -2, 2 ], + "to": [ 14, 14, 14 ], + "faces": { + "north": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" }, + "south": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" }, + "west": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" }, + "east": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0, -2, 0 ], + "to": [ 0.001, 14, 22.5 ], + "rotation": { "origin": [ 0, -2, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, -2, 0 ], + "to": [ 16.001, 14, 22.5 ], + "rotation": { "origin": [ 16, -2, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_medium_sand.json b/src/main/resources/assets/betterend/models/block/neon_cactus_medium_sand.json new file mode 100644 index 00000000..7fe12992 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_medium_sand.json @@ -0,0 +1,58 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/neon_cactus_small_side", + "overlay": "betterend:block/neon_cactus_medium_side_dust_overlay", + "side": "betterend:block/neon_cactus_medium_side_dust", + "top": "betterend:block/neon_cactus_medium_top" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 2, -2, 2 ], + "to": [ 14, 14, 14 ], + "shade": false, + "faces": { + "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "north": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, + "south": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, + "west": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, + "east": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" } + } + }, + { + "__comment": "Box1", + "from": [ 2, -2, 2 ], + "to": [ 14, 14, 14 ], + "faces": { + "north": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" }, + "south": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" }, + "west": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" }, + "east": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0, -2, 0 ], + "to": [ 0.001, 14, 22.5 ], + "rotation": { "origin": [ 0, -2, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, -2, 0 ], + "to": [ 16.001, 14, 22.5 ], + "rotation": { "origin": [ 16, -2, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_small_moss.json b/src/main/resources/assets/betterend/models/block/neon_cactus_small_moss.json new file mode 100644 index 00000000..a5125f93 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_small_moss.json @@ -0,0 +1,58 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "betterend:block/neon_cactus_small_side", + "overlay": "betterend:block/neon_cactus_small_side_moss_overlay", + "side": "betterend:block/neon_cactus_small_side", + "top": "betterend:block/neon_cactus_small_top" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 4, -4, 4 ], + "to": [ 12, 12, 12 ], + "shade": false, + "faces": { + "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "north": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, + "south": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, + "west": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, + "east": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" } + } + }, + { + "from": [ 4, -4, 4 ], + "to": [ 12, 12, 12 ], + "faces": { + "north": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" }, + "south": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" }, + "west": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" }, + "east": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0, -4, 0 ], + "to": [ 0.001, 12, 22.5 ], + "rotation": { "origin": [ 0, -4, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, -4, 0 ], + "to": [ 16.001, 12, 22.5 ], + "rotation": { "origin": [ 16, -4, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_small_sand.json b/src/main/resources/assets/betterend/models/block/neon_cactus_small_sand.json new file mode 100644 index 00000000..24ed9f5f --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_small_sand.json @@ -0,0 +1,58 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "betterend:block/neon_cactus_small_side", + "overlay": "betterend:block/neon_cactus_small_side_dust_overlay", + "side": "betterend:block/neon_cactus_small_side_dust", + "top": "betterend:block/neon_cactus_small_top" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 4, -4, 4 ], + "to": [ 12, 12, 12 ], + "shade": false, + "faces": { + "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "north": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, + "south": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, + "west": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, + "east": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" } + } + }, + { + "from": [ 4, -4, 4 ], + "to": [ 12, 12, 12 ], + "faces": { + "north": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" }, + "south": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" }, + "west": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" }, + "east": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0, -4, 0 ], + "to": [ 0.001, 12, 22.5 ], + "rotation": { "origin": [ 0, -4, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, -4, 0 ], + "to": [ 16.001, 12, 22.5 ], + "rotation": { "origin": [ 16, -4, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/end_moss_side.png b/src/main/resources/assets/betterend/textures/block/end_moss_side.png index 6a3288128c75ec0382abbc581ea3d145b3203aa1..cc0449f792d33e58f6d917324f58d5a9bb06a94a 100644 GIT binary patch delta 282 zcmV+#0pA4L}1^ z0001=Nkl9| z$};a#zZS5ts1)s2TR5WLY!%g7B5~ukdS8Fl=TjXuRIWZ>emnt$ZPY3ibPEr?Ll! z`r$WlMBV0wzNd#+d$8Y-+)|t`;qd@9YpWW!8&|Mz&d+h(T`f|dJtLga;N7MNk)A=us*d;OqpA00gyBaQ-$aXK4loPm# zqg4i+ R9QXhL002ovPDHLkV1i|PK575} diff --git a/src/main/resources/assets/betterend/textures/block/end_moss_top.png b/src/main/resources/assets/betterend/textures/block/end_moss_top.png index 38e28989c71e6b85fa5ccee5a141387cda261ed5..de6139a42ed669453070a82228b24d1a5d8b8916 100644 GIT binary patch delta 217 zcmV;~04D#?1?mBi8Gi!+001a04^sdD00DDSM?wIu&K&6g000$GOjJcFb#p0!gE5hm zIj*chy0l8dy-L>AdH>S*0001kNkl>mqJo>^fYSt122mal#@Yk&~tIJW*=K=wV;BfZhMPVrj{`+@%b7uX<*}@EE*A+ zOzpQf>a9(D2OPt3O$Ym>4o3yglVYn?HZ+8nGQVHGFkj}d7jqmV2+YVxAF3cf-#{FEW*9%pcR&K1ru{OIW;y6Ot?0CZTiyvn&o!4r$H6I?(!5{*p z#$MxZ{lYv{)yzyk-Q6Klv$--90v?dSQ*7x|M4~t)PJgGgzYn4--%Qr7q;OJ!0MaM$ zmq+UDt;wVx8D2pTIAH(~lpr8wWY0tsbw?FCX!bY^+Tm!DaYQ;7nrRJUOJcH)r z9JW&8_bb-d%3@K#Aa67XT42+H(E05YGgxGN(LAAt5~C3t21w-l^50+BRW2p9iwm^H p0`;Q)eksqR6KuFX^OD6(5INZTj~Jj3!-HsK;kL$=H8GH~Whvw`J-*wy&L3Y=3N$8&x|keIF_d!BRB%2!sM%XpJbK5#=^<*4>8o?-NkY3*7+Voz$h zk~iL!GHdhFlZEl@q`faDS?Wtfc|z$Qaa-F?ewexRgSH*-TsVCraH_iZvk-HXK6>%> z&o73nTDQ4Nu!e&tTDtc&KSww8-s#?yeQu*TWy_g$L*L)na{F7pbJR?P-&Wt;IOjd# z(yNz;4&QWV`@F5o5AY(eqEQ!kyk5I9?@=6c>Xj!ryMm%n1# zwRvS%#~nNEZWwzgJ*Ao&JFF$6F>MKLMSeX#_iA`&O4G!~quc3sbI&HWbq4p;x4w3) zb@RRbSEeUdR9t=wNo`6+&i|ae=BZ|?Grj5FH{Zt)DWlh$(8j=@9ciBitM+$gwJ(cp zU0E~u(!vF^5O>d)9ad)HxDXp7Z{Ug(k*nT)w{CT;V}EQJ?>7H*<;lvp6N_tQaYk19 z!NTO++Ce|8^ZlN%yZz~xb_`!V=H;79){g249a)brm_IkJ*-o{c-!&*UZF<_a*{Nld zZ+GW7zUungOf7CXba-_l*%SUwJ5w2F25U~W@0yt2Te)LIkuRyB?%ehHn={rTT5a3f zg7PI*<7_DnaWO}}7(!MpDz8Ex?J71Xj#$TJ5i&+2w literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_dust_overlay.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_dust_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..ca8bb728f223e8d9fe3e578aec52753217820547 GIT binary patch literal 1753 zcmbVNPi)&%9Ckpf+Cfp-5Q;cZ&l3~>96vjDoLCE0mvkhkDODG#WnyA4?>#4`v7fQs zCMihmK#W!5#EAh14nty>4GHZu*w8>+Ktn}>3ox}H;J{&;U=k9O%5(mhu5_a!lH+Il zd*Ao{{`lwR$%!WicRsL_k`ln*>;D zOQlF-OE0z^N%+CoJPV_nkS)=Ex#bdRiuiQSLu728+1wjO;~F`Sz<_#XO6$EsP4+DF zxm;M7H2?6lnh9L8O?^ z3M}k|WnlwgsOxG*6R~PyQ8m?+2s5%Gnn_Isnw}y$)O-8$6wQUj4fl8Y98<(N{!xV$ z4d^<{gqf@WQPmk+MX#hqT|+3X5umDS+gQw zKlSI@H`NdJ@TtNbr~2`UH_ko!>4(346+flE7sop;tyTEzd@erx@pIRPKaZWf$9r)6 p*iu}2vu}Ce^ixYm`gXsv!dYh*ug8A9B!(ZK;@Cv~%z>jX{|%WKHU$6x literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_moss.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_moss.png new file mode 100644 index 0000000000000000000000000000000000000000..3d9ea0d51a73dedbc682107c36c6cc251225d50f GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~n*g5>S0Ei5 zSeuj5Q&zd6e!_{473WHJU5LDL@%ZuMSFc`u{P^+5j~`_clQc_pnj2(AirRS|CnIc!{n7f`MI7hjv*3LP5q+zSQI&gMPyC84*Y$; zt5of`qegA3OH9`4nalTd3#BS(+PF=QawwQs+4*mamOLZxCEhxheNm2^PU`&cQ#+C& z^;k$aO(SH<*LFR_)erclb*WgTO@AXI7y03si{|F`Yzy|svt3-|#N4-61@wzNsmhN} zUwm@X?`506vgli%RyxS}{q^;wX)kvu<=5#L92at9=Fr^xgS}xRr=WI{q#n?r44$rj JF6*2UngEr#jhO%d literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_moss_overlay.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_moss_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..6415e7832d309b6336dfe34196b1c30833ad416c GIT binary patch literal 1765 zcmbVNUx*t;7*8pRRt_sF)I(v}zTBak{g-UAOVevENlj{Vp1HtX9|UJ-CdqQyo$c=C z-=XL!NYx5fd=ei7A3RZus1M$WEeQ40ini$aR8YAGK@mB@Cm;0NB)49#*Lt|Hnc11& z{J!7!XTCf)J@w$ozR`WLSZt(J%vWICAHKKjh2JsZ_8AxsO&_loV0`qECz|ARySMb@ zOP`-w`Z`#-bmF_qtE;PPYisN4>l+&z_abw=<&Q5uBcFLiKl@I0<-=p2esb*lwWU8^ zz5?g(3Mx}GvA?f(&Mrw=}O`O zPLbr4D5XSM6(re^G(*+7;lqP9kJOAx{^-yad}a7X5V(dYb~>GSM~ySDF3P&Di;^NL ziU0_~?>PbL3XXqplOa!i>{)JLF^3Bok;z&?h6kks7i>48b^KwNAYft_xuP7GLYMkL zf+L*U@|u0)1dFsuZR!L*VC4wwHdw&?2D=V*w0)HU2yM9>+1OEwZAT{jpwI?4h5^|T z?N@s)6)V(dEf3Q|8)O~~y>X44M^V7MDr3#fL``o>=5o0(F==jW)^Z5z_~Tp7&^!ug zhF2s-7Nmrr$W=u#WZg(A_e-iFNdst^5v$hQ2Gy!^(ttF}sjHw+H3S9dKfweWHRjm} ze70;(=KkY6yve^hWFpxYTJH__9@F+^gjZJ(nMvmyt}Ovjk!761R|9`J2#4mEM^?g*Iu z^bt;JmWeL3wkj`d8z5_tt9Ob!9V3`YTjrx!{(UmGBAfDAqf^@h|yn z+-hfEay+y9633Looj$YwHZsf%d&YFn``{`C@$XafuH>|?7ge3hq2QNr+%5K%w7Nw4 m+#`!+vX9?XfBv(hhB10MtGCnIWJ{pq7(8A5T-G@yGywq23x)vz literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_dust_overlay.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_dust_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..264be42897b131c4a4750fee9773c52fddf87e66 GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~{s5m4S0H_0 zOY@0ieV1;|e)N7t!>b?uKq1zWAirRS|3DyfK@DV*k*AAeh{V*ZU5%U!20Vw7zW$%B zu5F#vv{3cXe?gvo&x?+1@z**Ob=B2AHR#QauHg6sj9mX1qH-)$>wvl$JYD@<);T3K F0RU#hH=zIk literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_moss.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_moss.png new file mode 100644 index 0000000000000000000000000000000000000000..e22c2e9aa54a93a79e11e13036d31dceb603bf2e GIT binary patch literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~n*g5>S0J4f znpKouT~jl=ZPJ1MRmZFLoQ%DC`uOqVSFc`u{P^+5j~`_clQc_VS)S0F8u zn50=+tl8LXIB|;Qx;2iwws;-d>viqwX`!qLpfqPmkY6yve<(0#ntcT*XzuCa7$PzC zYIh^&0RsW1TvOZc^LNN!QeCAWv+7HI=&6cqp{b{SOc7T-`uE0{mtD^1TXUYpo%4xP Xn#}N(U3|Y9&#DyDOp@RsKcWy^h?j}esg2i>9rgx0=ZdH?_b00>D%PDHLkV1faQJhuP< diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_dust.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..e664cfe6260afd3da77682a8e14b67a7713ea618 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~g8-ipS0J4c z5nG;}+gRVzHD$x(HQVa-h2GSFc`u{P^+5j~@?gX+CkR@6yfLkKV7~jm=&U z)FV(5)!vlt2fU2w3Cxr^X$Uq zE5w$SwB6a7VtG(F^6tTMgGpr+G-; zs`sbIG|4`$h}4JGsgg22Z`+%q9g literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_dust_overlay.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_dust_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..9a47ee1125ef2a95423b1c8f3cb16f3d4a61cbe7 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~{s5m4S0H_0 zOY@0ieV1;|e)N7t!>b?uKq1zWAirRS|3DyfK@DV*wx^3@h{V*Zof`!i6a)@&Z1{gB y>+w%zkEtv#|0`Cq7&Ey(d}a1(U%k|%!`$r543?UYPfiAEWAJqKb6Mw<&;$U`)igT* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_moss.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_moss.png new file mode 100644 index 0000000000000000000000000000000000000000..5b2b0586507f18624f655a80c69389ff66c55296 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~n*g5>S0J4c z5nG;}+gRVzHD$x(HQVa-h2GSFc`u{P^+5j~`_clQc_wLZsx icg8Px|GO`FvAu-=Yv^y4&?=y77(8A5T-G@yGywot*@o`` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_moss_overlay.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_moss_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..a296b22fbf1ba8a7948a7ee6db244cbc8fdb8e5c GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~=>VS)S0F8u zn50=+tl8LXIB|;Qx;2iwws;-d>viqwX`!qLpfqPmkY6yve<(0#ntcT*XyNJN7$PzC zY?mV+g8|2(jz&NYp_}*N&$hYzS^LCbO>Buc%PaY=)DbEs}s;m|1Hb?O0-h=?D*ylh literal 0 HcmV?d00001 From b743aa62a22a5d0aeb27c435e413f02b1216cdc1 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 27 Apr 2021 13:33:09 +0300 Subject: [PATCH 446/463] Cactus growing --- .../ru/betterend/blocks/NeonCactusBlock.java | 37 ++++++++++++------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java index e6f3dba5..7107dd92 100644 --- a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java +++ b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java @@ -49,6 +49,7 @@ public class NeonCactusBlock extends BlockBaseNotFull implements SimpleWaterlogg private static final EnumMap SMALL_SHAPES_OPEN = Maps.newEnumMap(Direction.class); private static final EnumMap MEDIUM_SHAPES = Maps.newEnumMap(Axis.class); private static final EnumMap SMALL_SHAPES = Maps.newEnumMap(Axis.class); + private static final int MAX_LENGTH = 10; public NeonCactusBlock() { super(FabricBlockSettings.copyOf(Blocks.CACTUS).luminance(15).randomTicks()); @@ -139,23 +140,33 @@ public class NeonCactusBlock extends BlockBaseNotFull implements SimpleWaterlogg @Override public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { Direction dir = state.getValue(FACING); - if (!world.getBlockState(pos.relative(dir)).isAir() || world.getBlockState(pos.above()).is(this)) { + if (!world.isEmptyBlock(pos.relative(dir))) { return; } - int length = getLength(state, world, pos, 10); - if (length < 0 || length > 9) { + int length = getLength(state, world, pos, MAX_LENGTH); + if (length < 0 || length > MAX_LENGTH - 1) { return; } - int horizontal = getHorizontal(state, world, pos, 5); - if (horizontal > random.nextInt(2)) { - dir = Direction.UP; - if (!world.getBlockState(pos.above()).isAir()) { - return; + if (dir != Direction.UP) { + int horizontal = getHorizontal(state, world, pos, 2); + if (horizontal > random.nextInt(2)) { + dir = Direction.UP; + if (!world.getBlockState(pos.above()).isAir()) { + return; + } + } + } + else if (length > 1 && world.getBlockState(pos.below()).is(this)) { + Direction side = BlocksHelper.randomHorizontal(random); + BlockPos sidePos = pos.relative(side); + if (world.isEmptyBlock(sidePos)) { + BlockState placement = state.setValue(SHAPE, TripleShape.TOP).setValue(CACTUS_BOTTOM, CactusBottom.EMPTY).setValue(WATERLOGGED, false).setValue(FACING, side); + BlocksHelper.setWithoutUpdate(world, sidePos, placement); } } BlockState placement = state.setValue(SHAPE, TripleShape.TOP).setValue(CACTUS_BOTTOM, CactusBottom.EMPTY).setValue(WATERLOGGED, false).setValue(FACING, dir); BlocksHelper.setWithoutUpdate(world, pos.relative(dir), placement); - mutateStem(placement, world, pos, 10); + mutateStem(placement, world, pos, MAX_LENGTH); } private int getLength(BlockState state, ServerLevel world, BlockPos pos, int max) { @@ -205,14 +216,12 @@ public class NeonCactusBlock extends BlockBaseNotFull implements SimpleWaterlogg if (!state.is(this)) { return; } - int size = i * 3 / max; + int size = (i + 2) * 3 / max; int src = state.getValue(SHAPE).getIndex(); + dir = state.getValue(FACING).getOpposite(); if (src < size) { TripleShape shape = TripleShape.fromIndex(size); - BlocksHelper.setWithoutUpdate(world, pos, state.setValue(SHAPE, shape)); - } - else { - return; + BlocksHelper.setWithoutUpdate(world, mut, state.setValue(SHAPE, shape)); } } } From 56d10bfcdaeb1dcb45a979fa84ebad46f4073c04 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 27 Apr 2021 14:40:09 +0300 Subject: [PATCH 447/463] Cactus enhancements --- .../ru/betterend/blocks/NeonCactusBlock.java | 66 +++++++++---- .../models/block/neon_cactus_big.json | 53 +++++++++-- .../models/block/neon_cactus_big_moss.json | 90 +++++++++++------- .../models/block/neon_cactus_big_sand.json | 90 +++++++++++------- .../models/block/neon_cactus_medium.json | 28 +++--- .../models/block/neon_cactus_medium_moss.json | 58 ----------- .../models/block/neon_cactus_medium_sand.json | 46 ++++----- .../models/block/neon_cactus_small_moss.json | 48 +++++----- .../textures/block/neon_cactus_big_side.png | Bin 270 -> 271 bytes .../block/neon_cactus_big_side_dust.png | Bin 1834 -> 303 bytes .../neon_cactus_big_side_dust_overlay.png | Bin 1753 -> 164 bytes .../block/neon_cactus_big_side_moss.png | Bin 331 -> 324 bytes .../neon_cactus_big_side_moss_overlay.png | Bin 1765 -> 185 bytes .../textures/block/neon_cactus_block_side.png | Bin 0 -> 270 bytes ..._big_top.png => neon_cactus_block_top.png} | Bin .../block/neon_cactus_medium_side.png | Bin 271 -> 458 bytes .../block/neon_cactus_medium_side_dust.png | Bin 303 -> 569 bytes .../neon_cactus_medium_side_dust_overlay.png | Bin 164 -> 213 bytes .../block/neon_cactus_medium_side_moss.png | Bin 324 -> 569 bytes .../neon_cactus_medium_side_moss_overlay.png | Bin 185 -> 292 bytes 20 files changed, 269 insertions(+), 210 deletions(-) delete mode 100644 src/main/resources/assets/betterend/models/block/neon_cactus_medium_moss.json create mode 100644 src/main/resources/assets/betterend/textures/block/neon_cactus_block_side.png rename src/main/resources/assets/betterend/textures/block/{neon_cactus_big_top.png => neon_cactus_block_top.png} (100%) diff --git a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java index 7107dd92..51955d76 100644 --- a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java +++ b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java @@ -14,6 +14,7 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Mirror; @@ -28,7 +29,6 @@ import net.minecraft.world.level.block.state.properties.EnumProperty; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Fluids; import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.BlockProperties.CactusBottom; import ru.betterend.blocks.BlockProperties.TripleShape; @@ -45,11 +45,13 @@ public class NeonCactusBlock extends BlockBaseNotFull implements SimpleWaterlogg public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; public static final DirectionProperty FACING = BlockStateProperties.FACING; + private static final EnumMap BIG_SHAPES_OPEN = Maps.newEnumMap(Direction.class); private static final EnumMap MEDIUM_SHAPES_OPEN = Maps.newEnumMap(Direction.class); private static final EnumMap SMALL_SHAPES_OPEN = Maps.newEnumMap(Direction.class); + private static final EnumMap BIG_SHAPES = Maps.newEnumMap(Axis.class); private static final EnumMap MEDIUM_SHAPES = Maps.newEnumMap(Axis.class); private static final EnumMap SMALL_SHAPES = Maps.newEnumMap(Axis.class); - private static final int MAX_LENGTH = 10; + private static final int MAX_LENGTH = 12; public NeonCactusBlock() { super(FabricBlockSettings.copyOf(Blocks.CACTUS).luminance(15).randomTicks()); @@ -101,11 +103,14 @@ public class NeonCactusBlock extends BlockBaseNotFull implements SimpleWaterlogg world.getLiquidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); } Direction dir = state.getValue(FACING); - BlockState down = world.getBlockState(pos.relative(dir.getOpposite())); - if (down.is(Blocks.END_STONE) || down.is(EndBlocks.ENDSTONE_DUST)) { + if (!canSurvive(state, world, pos)) { + return Blocks.AIR.defaultBlockState(); + } + BlockState downState = world.getBlockState(pos.relative(dir.getOpposite())); + if (downState.is(Blocks.END_STONE) || downState.is(EndBlocks.ENDSTONE_DUST)) { state = state.setValue(CACTUS_BOTTOM, CactusBottom.SAND); } - else if (down.is(EndBlocks.END_MOSS)) { + else if (downState.is(EndBlocks.END_MOSS)) { state = state.setValue(CACTUS_BOTTOM, CactusBottom.MOSS); } else { @@ -122,24 +127,38 @@ public class NeonCactusBlock extends BlockBaseNotFull implements SimpleWaterlogg @Override public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { TripleShape shape = state.getValue(SHAPE); - - if (shape == TripleShape.BOTTOM) { - return Shapes.block(); - } Direction dir = state.getValue(FACING); BlockState next = view.getBlockState(pos.relative(dir)); if (next.is(this)) { Axis axis = dir.getAxis(); + if (shape == TripleShape.BOTTOM) { + return BIG_SHAPES.get(axis); + } return shape == TripleShape.MIDDLE ? MEDIUM_SHAPES.get(axis) : SMALL_SHAPES.get(axis); } else { + if (shape == TripleShape.BOTTOM) { + return BIG_SHAPES_OPEN.get(dir); + } return shape == TripleShape.MIDDLE ? MEDIUM_SHAPES_OPEN.get(dir) : SMALL_SHAPES_OPEN.get(dir); } } + @Override + public boolean canSurvive(BlockState state, LevelReader level, BlockPos pos) { + Direction dir = state.getValue(FACING); + BlockPos supportPos = pos.relative(dir.getOpposite()); + BlockState support = level.getBlockState(supportPos); + return support.is(this) || support.isFaceSturdy(level, supportPos, dir); + } + @Override public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { Direction dir = state.getValue(FACING); + if (!this.canSurvive(state, world, pos)) { + this.destroy(world, pos, state); + return; + } if (!world.isEmptyBlock(pos.relative(dir))) { return; } @@ -227,20 +246,31 @@ public class NeonCactusBlock extends BlockBaseNotFull implements SimpleWaterlogg } static { - MEDIUM_SHAPES.put(Axis.X, Block.box(0, 2, 2, 16, 14, 14)); - MEDIUM_SHAPES.put(Axis.Y, Block.box(2, 0, 2, 14, 16, 14)); - MEDIUM_SHAPES.put(Axis.Z, Block.box(2, 2, 0, 14, 14, 16)); + BIG_SHAPES.put(Axis.X, Block.box(0, 2, 2, 16, 14, 14)); + BIG_SHAPES.put(Axis.Y, Block.box(2, 0, 2, 14, 16, 14)); + BIG_SHAPES.put(Axis.Z, Block.box(2, 2, 0, 14, 14, 16)); + + MEDIUM_SHAPES.put(Axis.X, Block.box(0, 3, 3, 16, 13, 13)); + MEDIUM_SHAPES.put(Axis.Y, Block.box(3, 0, 3, 13, 16, 13)); + MEDIUM_SHAPES.put(Axis.Z, Block.box(3, 3, 0, 13, 13, 16)); SMALL_SHAPES.put(Axis.X, Block.box(0, 4, 4, 16, 12, 12)); SMALL_SHAPES.put(Axis.Y, Block.box(4, 0, 4, 12, 16, 12)); SMALL_SHAPES.put(Axis.Z, Block.box(4, 4, 0, 12, 12, 16)); - MEDIUM_SHAPES_OPEN.put(Direction.UP, Block.box(2, 0, 2, 14, 14, 14)); - MEDIUM_SHAPES_OPEN.put(Direction.DOWN, Block.box(2, 2, 2, 14, 16, 14)); - MEDIUM_SHAPES_OPEN.put(Direction.NORTH, Block.box(2, 2, 2, 14, 14, 16)); - MEDIUM_SHAPES_OPEN.put(Direction.SOUTH, Block.box(2, 2, 0, 14, 14, 14)); - MEDIUM_SHAPES_OPEN.put(Direction.WEST, Block.box(2, 2, 2, 16, 14, 14)); - MEDIUM_SHAPES_OPEN.put(Direction.EAST, Block.box(0, 2, 2, 14, 14, 14)); + BIG_SHAPES_OPEN.put(Direction.UP, Block.box(2, 0, 2, 14, 14, 14)); + BIG_SHAPES_OPEN.put(Direction.DOWN, Block.box(2, 2, 2, 14, 16, 14)); + BIG_SHAPES_OPEN.put(Direction.NORTH, Block.box(2, 2, 2, 14, 14, 16)); + BIG_SHAPES_OPEN.put(Direction.SOUTH, Block.box(2, 2, 0, 14, 14, 14)); + BIG_SHAPES_OPEN.put(Direction.WEST, Block.box(2, 2, 2, 16, 14, 14)); + BIG_SHAPES_OPEN.put(Direction.EAST, Block.box(0, 2, 2, 14, 14, 14)); + + MEDIUM_SHAPES_OPEN.put(Direction.UP, Block.box(3, 0, 3, 13, 13, 13)); + MEDIUM_SHAPES_OPEN.put(Direction.DOWN, Block.box(3, 3, 3, 13, 16, 13)); + MEDIUM_SHAPES_OPEN.put(Direction.NORTH, Block.box(3, 3, 3, 13, 13, 16)); + MEDIUM_SHAPES_OPEN.put(Direction.SOUTH, Block.box(3, 3, 0, 13, 13, 13)); + MEDIUM_SHAPES_OPEN.put(Direction.WEST, Block.box(3, 3, 3, 16, 13, 13)); + MEDIUM_SHAPES_OPEN.put(Direction.EAST, Block.box(0, 3, 3, 13, 13, 13)); SMALL_SHAPES_OPEN.put(Direction.UP, Block.box(4, 0, 4, 12, 12, 12)); SMALL_SHAPES_OPEN.put(Direction.DOWN, Block.box(4, 4, 4, 12, 16, 12)); diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_big.json b/src/main/resources/assets/betterend/models/block/neon_cactus_big.json index a917c73f..7e2dac87 100644 --- a/src/main/resources/assets/betterend/models/block/neon_cactus_big.json +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_big.json @@ -1,7 +1,46 @@ -{ - "parent": "betterend:block/column_noshade", - "textures": { - "end": "betterend:block/neon_cactus_big_top", - "side": "betterend:block/neon_cactus_big_side" - } -} +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/neon_cactus_big_side", + "side": "betterend:block/neon_cactus_big_side", + "top": "betterend:block/neon_cactus_medium_top" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 2, -2, 2 ], + "to": [ 14, 14, 14 ], + "shade": false, + "faces": { + "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "north": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, + "south": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, + "west": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, + "east": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0, -2, 0 ], + "to": [ 0.001, 14, 22.5 ], + "rotation": { "origin": [ 0, -2, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, -2, 0 ], + "to": [ 16.001, 14, 22.5 ], + "rotation": { "origin": [ 16, -2, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_big_moss.json b/src/main/resources/assets/betterend/models/block/neon_cactus_big_moss.json index 2315eced..d8c3232a 100644 --- a/src/main/resources/assets/betterend/models/block/neon_cactus_big_moss.json +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_big_moss.json @@ -1,34 +1,58 @@ -{ - "parent": "block/block", - "textures": { - "end": "betterend:block/neon_cactus_big_top", - "side": "betterend:block/neon_cactus_big_side_moss", - "overlay": "betterend:block/neon_cactus_big_side_moss_overlay", - "particle": "#side" - }, - "elements": [ - { - "from": [ 0, 0, 0 ], - "to": [ 16, 16, 16 ], - "shade": false, - "faces": { - "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#end", "cullface": "down" }, - "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#end", "cullface": "up" }, - "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "north" }, - "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "south" }, - "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "west" }, - "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "east" } - } - }, - { - "from": [ 0, 0, 0 ], - "to": [ 16, 16, 16 ], - "faces": { - "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "north" }, - "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "south" }, - "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "west" }, - "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "east" } - } - } - ] +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/neon_cactus_big_side", + "overlay": "betterend:block/neon_cactus_big_side_moss_overlay", + "side": "betterend:block/neon_cactus_big_side_moss", + "top": "betterend:block/neon_cactus_medium_top" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 2, -2, 2 ], + "to": [ 14, 14, 14 ], + "shade": false, + "faces": { + "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "north": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, + "south": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, + "west": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, + "east": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" } + } + }, + { + "__comment": "Box1", + "from": [ 2, -2, 2 ], + "to": [ 14, 14, 14 ], + "faces": { + "north": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" }, + "south": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" }, + "west": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" }, + "east": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0, -2, 0 ], + "to": [ 0.001, 14, 22.5 ], + "rotation": { "origin": [ 0, -2, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, -2, 0 ], + "to": [ 16.001, 14, 22.5 ], + "rotation": { "origin": [ 16, -2, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_big_sand.json b/src/main/resources/assets/betterend/models/block/neon_cactus_big_sand.json index be4e3c1c..addf607a 100644 --- a/src/main/resources/assets/betterend/models/block/neon_cactus_big_sand.json +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_big_sand.json @@ -1,34 +1,58 @@ -{ - "parent": "block/block", - "textures": { - "end": "betterend:block/neon_cactus_big_top", - "side": "betterend:block/neon_cactus_big_side_dust", - "overlay": "betterend:block/neon_cactus_big_side_dust_overlay", - "particle": "#side" - }, - "elements": [ - { - "from": [ 0, 0, 0 ], - "to": [ 16, 16, 16 ], - "shade": false, - "faces": { - "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#end", "cullface": "down" }, - "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#end", "cullface": "up" }, - "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "north" }, - "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "south" }, - "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "west" }, - "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "east" } - } - }, - { - "from": [ 0, 0, 0 ], - "to": [ 16, 16, 16 ], - "faces": { - "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "north" }, - "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "south" }, - "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "west" }, - "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "east" } - } - } - ] +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/neon_cactus_big_side", + "overlay": "betterend:block/neon_cactus_big_side_dust_overlay", + "side": "betterend:block/neon_cactus_big_side_dust", + "top": "betterend:block/neon_cactus_medium_top" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 2, -2, 2 ], + "to": [ 14, 14, 14 ], + "shade": false, + "faces": { + "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "north": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, + "south": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, + "west": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, + "east": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" } + } + }, + { + "__comment": "Box1", + "from": [ 2, -2, 2 ], + "to": [ 14, 14, 14 ], + "faces": { + "north": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" }, + "south": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" }, + "west": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" }, + "east": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0, -2, 0 ], + "to": [ 0.001, 14, 22.5 ], + "rotation": { "origin": [ 0, -2, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, -2, 0 ], + "to": [ 16.001, 14, 22.5 ], + "rotation": { "origin": [ 16, -2, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_medium.json b/src/main/resources/assets/betterend/models/block/neon_cactus_medium.json index 56c8107c..b8f84530 100644 --- a/src/main/resources/assets/betterend/models/block/neon_cactus_medium.json +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_medium.json @@ -8,23 +8,23 @@ "elements": [ { "__comment": "Box1", - "from": [ 2, -2, 2 ], - "to": [ 14, 14, 14 ], + "from": [ 3, -3, 3 ], + "to": [ 13, 13, 13 ], "shade": false, "faces": { - "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, - "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, - "north": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, - "south": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, - "west": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, - "east": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" } + "down": { "uv": [ 3, 3, 13, 13 ], "texture": "#top" }, + "up": { "uv": [ 3, 3, 13, 13 ], "texture": "#top" }, + "north": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" }, + "south": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" }, + "west": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" }, + "east": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" } } }, { "__comment": "PlaneX2", - "from": [ 0, -2, 0 ], - "to": [ 0.001, 14, 22.5 ], - "rotation": { "origin": [ 0, -2, 0 ], "axis": "y", "angle": 45 }, + "from": [ 0, -3, 0 ], + "to": [ 0.001, 13, 22.5 ], + "rotation": { "origin": [ 0, -3, 0 ], "axis": "y", "angle": 45 }, "shade": false, "faces": { "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, @@ -33,9 +33,9 @@ }, { "__comment": "PlaneX2", - "from": [ 16, -2, 0 ], - "to": [ 16.001, 14, 22.5 ], - "rotation": { "origin": [ 16, -2, 0 ], "axis": "y", "angle": -45 }, + "from": [ 16, -3, 0 ], + "to": [ 16.001, 13, 22.5 ], + "rotation": { "origin": [ 16, -3, 0 ], "axis": "y", "angle": -45 }, "shade": false, "faces": { "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_medium_moss.json b/src/main/resources/assets/betterend/models/block/neon_cactus_medium_moss.json deleted file mode 100644 index b939193c..00000000 --- a/src/main/resources/assets/betterend/models/block/neon_cactus_medium_moss.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", - "textures": { - "particle": "betterend:block/neon_cactus_small_side", - "overlay": "betterend:block/neon_cactus_medium_side_moss_overlay", - "side": "betterend:block/neon_cactus_medium_side_moss", - "top": "betterend:block/neon_cactus_medium_top" - }, - "elements": [ - { - "__comment": "Box1", - "from": [ 2, -2, 2 ], - "to": [ 14, 14, 14 ], - "shade": false, - "faces": { - "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, - "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, - "north": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, - "south": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, - "west": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, - "east": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" } - } - }, - { - "__comment": "Box1", - "from": [ 2, -2, 2 ], - "to": [ 14, 14, 14 ], - "faces": { - "north": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" }, - "south": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" }, - "west": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" }, - "east": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" } - } - }, - { - "__comment": "PlaneX2", - "from": [ 0, -2, 0 ], - "to": [ 0.001, 14, 22.5 ], - "rotation": { "origin": [ 0, -2, 0 ], "axis": "y", "angle": 45 }, - "shade": false, - "faces": { - "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, - "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } - } - }, - { - "__comment": "PlaneX2", - "from": [ 16, -2, 0 ], - "to": [ 16.001, 14, 22.5 ], - "rotation": { "origin": [ 16, -2, 0 ], "axis": "y", "angle": -45 }, - "shade": false, - "faces": { - "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, - "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_medium_sand.json b/src/main/resources/assets/betterend/models/block/neon_cactus_medium_sand.json index 7fe12992..807dbf17 100644 --- a/src/main/resources/assets/betterend/models/block/neon_cactus_medium_sand.json +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_medium_sand.json @@ -1,42 +1,42 @@ { "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", "textures": { - "particle": "betterend:block/neon_cactus_small_side", - "overlay": "betterend:block/neon_cactus_medium_side_dust_overlay", - "side": "betterend:block/neon_cactus_medium_side_dust", + "particle": "betterend:block/neon_cactus_small_side_moss", + "overlay": "betterend:block/neon_cactus_small_side_dust_overlay", + "side": "betterend:block/neon_cactus_medium_side", "top": "betterend:block/neon_cactus_medium_top" }, "elements": [ { "__comment": "Box1", - "from": [ 2, -2, 2 ], - "to": [ 14, 14, 14 ], + "from": [ 3, -3, 3 ], + "to": [ 13, 13, 13 ], "shade": false, "faces": { - "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, - "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, - "north": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, - "south": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, - "west": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, - "east": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" } + "down": { "uv": [ 3, 3, 13, 13 ], "texture": "#top" }, + "up": { "uv": [ 3, 3, 13, 13 ], "texture": "#top" }, + "north": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" }, + "south": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" }, + "west": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" }, + "east": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" } } }, { "__comment": "Box1", - "from": [ 2, -2, 2 ], - "to": [ 14, 14, 14 ], + "from": [ 3, -3, 3 ], + "to": [ 13, 13, 13 ], "faces": { - "north": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" }, - "south": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" }, - "west": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" }, - "east": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" } + "north": { "uv": [ 3, 0, 13, 16 ], "texture": "#overlay" }, + "south": { "uv": [ 3, 0, 13, 16 ], "texture": "#overlay" }, + "west": { "uv": [ 3, 0, 13, 16 ], "texture": "#overlay" }, + "east": { "uv": [ 3, 0, 13, 16 ], "texture": "#overlay" } } }, { "__comment": "PlaneX2", - "from": [ 0, -2, 0 ], - "to": [ 0.001, 14, 22.5 ], - "rotation": { "origin": [ 0, -2, 0 ], "axis": "y", "angle": 45 }, + "from": [ 0, -3, 0 ], + "to": [ 0.001, 13, 22.5 ], + "rotation": { "origin": [ 0, -3, 0 ], "axis": "y", "angle": 45 }, "shade": false, "faces": { "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, @@ -45,9 +45,9 @@ }, { "__comment": "PlaneX2", - "from": [ 16, -2, 0 ], - "to": [ 16.001, 14, 22.5 ], - "rotation": { "origin": [ 16, -2, 0 ], "axis": "y", "angle": -45 }, + "from": [ 16, -3, 0 ], + "to": [ 16.001, 13, 22.5 ], + "rotation": { "origin": [ 16, -3, 0 ], "axis": "y", "angle": -45 }, "shade": false, "faces": { "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_small_moss.json b/src/main/resources/assets/betterend/models/block/neon_cactus_small_moss.json index a5125f93..19596490 100644 --- a/src/main/resources/assets/betterend/models/block/neon_cactus_small_moss.json +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_small_moss.json @@ -1,42 +1,42 @@ { "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", - "parent": "block/block", "textures": { - "particle": "betterend:block/neon_cactus_small_side", + "particle": "betterend:block/neon_cactus_small_side_moss", "overlay": "betterend:block/neon_cactus_small_side_moss_overlay", - "side": "betterend:block/neon_cactus_small_side", - "top": "betterend:block/neon_cactus_small_top" + "side": "betterend:block/neon_cactus_medium_side", + "top": "betterend:block/neon_cactus_medium_top" }, "elements": [ { "__comment": "Box1", - "from": [ 4, -4, 4 ], - "to": [ 12, 12, 12 ], + "from": [ 3, -3, 3 ], + "to": [ 13, 13, 13 ], "shade": false, "faces": { - "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, - "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, - "north": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, - "south": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, - "west": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, - "east": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" } + "down": { "uv": [ 3, 3, 13, 13 ], "texture": "#top" }, + "up": { "uv": [ 3, 3, 13, 13 ], "texture": "#top" }, + "north": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" }, + "south": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" }, + "west": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" }, + "east": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" } } }, { - "from": [ 4, -4, 4 ], - "to": [ 12, 12, 12 ], + "__comment": "Box1", + "from": [ 3, -3, 3 ], + "to": [ 13, 13, 13 ], "faces": { - "north": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" }, - "south": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" }, - "west": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" }, - "east": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" } + "north": { "uv": [ 3, 0, 13, 16 ], "texture": "#overlay" }, + "south": { "uv": [ 3, 0, 13, 16 ], "texture": "#overlay" }, + "west": { "uv": [ 3, 0, 13, 16 ], "texture": "#overlay" }, + "east": { "uv": [ 3, 0, 13, 16 ], "texture": "#overlay" } } }, { "__comment": "PlaneX2", - "from": [ 0, -4, 0 ], - "to": [ 0.001, 12, 22.5 ], - "rotation": { "origin": [ 0, -4, 0 ], "axis": "y", "angle": 45 }, + "from": [ 0, -3, 0 ], + "to": [ 0.001, 13, 22.5 ], + "rotation": { "origin": [ 0, -3, 0 ], "axis": "y", "angle": 45 }, "shade": false, "faces": { "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, @@ -45,9 +45,9 @@ }, { "__comment": "PlaneX2", - "from": [ 16, -4, 0 ], - "to": [ 16.001, 12, 22.5 ], - "rotation": { "origin": [ 16, -4, 0 ], "axis": "y", "angle": -45 }, + "from": [ 16, -3, 0 ], + "to": [ 16.001, 13, 22.5 ], + "rotation": { "origin": [ 16, -3, 0 ], "axis": "y", "angle": -45 }, "shade": false, "faces": { "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side.png index 2c681c7d49e17f7e9fafe4b6493bfd72548bec66..1323e564aa84ca4dac0f946e533aacaf6ab357b8 100644 GIT binary patch delta 199 zcmV;&0671S0*?ZaIVECMYI0|Le0-aRlE9Cu$9lZUUDeCS$H&#x)#Kyi@$vD3Mr-Mj zUK@XbNkl^?^aD)61XsIZX!-yE002ovPDHLkV1n5R BUT6RS delta 198 zcmV;%06G7U0*(TZIVD|DeQacmc6q3OkjRLr&UCuaS=7UheZ`{A3y&1@#BFl%_olaUAj5@(fbuA|F3HU>Jcaj@(X78j|vV1 zbUOp(CVIL!hDc1c?Q;}jR^(u*pXnIWyyE}=+ylO?&7mgF-5mk5zy2!;c3LHL=G9rf z8Jt)4Iw)^0RsU){@7`L?yRK|TNq>c^EEnAJvJyVQ9mRUbH~uAmja%*POO9uDU*ec@ zxYK9$-$sU+Vb7TEc^_P*ApU)7-j$rz^`feCITZX7j=ROal2(^UpL=AnO!o1c>dz&9 bcGNINFK6|3TAOSMbRL7JtDnm{r-UW|Fkyxy literal 1834 zcmbVN3ry5z952KLX^OD6(5INZTj~Jj3!-HsK;kL$=H8GH~Whvw`J-*wy&L3Y=3N$8&x|keIF_d!BRB%2!sM%XpJbK5#=^<*4>8o?-NkY3*7+Voz$h zk~iL!GHdhFlZEl@q`faDS?Wtfc|z$Qaa-F?ewexRgSH*-TsVCraH_iZvk-HXK6>%> z&o73nTDQ4Nu!e&tTDtc&KSww8-s#?yeQu*TWy_g$L*L)na{F7pbJR?P-&Wt;IOjd# z(yNz;4&QWV`@F5o5AY(eqEQ!kyk5I9?@=6c>Xj!ryMm%n1# zwRvS%#~nNEZWwzgJ*Ao&JFF$6F>MKLMSeX#_iA`&O4G!~quc3sbI&HWbq4p;x4w3) zb@RRbSEeUdR9t=wNo`6+&i|ae=BZ|?Grj5FH{Zt)DWlh$(8j=@9ciBitM+$gwJ(cp zU0E~u(!vF^5O>d)9ad)HxDXp7Z{Ug(k*nT)w{CT;V}EQJ?>7H*<;lvp6N_tQaYk19 z!NTO++Ce|8^ZlN%yZz~xb_`!V=H;79){g249a)brm_IkJ*-o{c-!&*UZF<_a*{Nld zZ+GW7zUungOf7CXba-_l*%SUwJ5w2F25U~W@0yt2Te)LIkuRyB?%ehHn={rTT5a3f zg7PI*<7_DnaWO}}7(!MpDz8Ex?J71Xj#$TJ5i&+2w diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_dust_overlay.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_dust_overlay.png index ca8bb728f223e8d9fe3e578aec52753217820547..264be42897b131c4a4750fee9773c52fddf87e66 100644 GIT binary patch delta 147 zcmcb~yM%FqWIZzj1A~Sxe=v|@EDmyaVpw-h<|UBBAK(+>3ZxHgX+CkR@6yfLkKV6n zc=f{{D8yP4wx? literal 1753 zcmbVNPi)&%9Ckpf+Cfp-5Q;cZ&l3~>96vjDoLCE0mvkhkDODG#WnyA4?>#4`v7fQs zCMihmK#W!5#EAh14nty>4GHZu*w8>+Ktn}>3ox}H;J{&;U=k9O%5(mhu5_a!lH+Il zd*Ao{{`lwR$%!WicRsL_k`ln*>;D zOQlF-OE0z^N%+CoJPV_nkS)=Ex#bdRiuiQSLu728+1wjO;~F`Sz<_#XO6$EsP4+DF zxm;M7H2?6lnh9L8O?^ z3M}k|WnlwgsOxG*6R~PyQ8m?+2s5%Gnn_Isnw}y$)O-8$6wQUj4fl8Y98<(N{!xV$ z4d^<{gqf@WQPmk+MX#hqT|+3X5umDS+gQw zKlSI@H`NdJ@TtNbr~2`UH_ko!>4(346+flE7sop;tyTEzd@erx@pIRPKaZWf$9r)6 p*iu}2vu}Ce^ixYm`gXsv!dYh*ug8A9B!(ZK;@Cv~%z>jX{|%WKHU$6x diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_moss.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_moss.png index 3d9ea0d51a73dedbc682107c36c6cc251225d50f..e22c2e9aa54a93a79e11e13036d31dceb603bf2e 100644 GIT binary patch delta 212 zcmV;_04x8?0>lE4ITd16YI0|Le0-aRlE9Cu$9lZUUDeBxP9y{+qF_#ub|Zh5Nklg1!u{`Bu=~p2j+PNb1Q|N#YpQ^$r@-#4dV^g+%o+@!q8T9X z^_o+Mz>H{dRdn72)(#dKE!_p^0iz3MDv$IJyjOo)(goi4$^dga3|wv1e?ZLD7SsYi zmoj=1aQH2CMsP;jiPO@}pU5omjFX4^(t60By!?2iuXcoYj_-B+5d8vxBL+2L`3t!K O0000 delta 219 zcmV<103`p!0?PuBITc+|eQacmc6q3OkjRLr&UCuaS=7;yP9y}V@{-(~ixOoZDLh7#T0n4-d5QkCDjxw2 z(hYt@zFI-D$t?elCd6nO;}R2QC{(2Nhb}Rz;0~6GBsyl7>=YhZ@Ww?ALw|Y>I6y$nuUuUDqlKV5Jv-JcoJIf-$3HR&QrDo~4B5!^yFvk)`0|+U-_y>To V2@xw|87=?-002ovPDHLkV1i&rT^j%Z diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_moss_overlay.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_moss_overlay.png index 6415e7832d309b6336dfe34196b1c30833ad416c..e6ac60a105639beb82d14a025e3b0366d4b65fec 100644 GIT binary patch delta 136 zcmaFLyOVK(iYQ}okh>GZx^prw85kI(1AIbUf%HUQiHy@iSrI@cXGxG>FvEW+FlU;5 z1t@6l>Eak7G4*P9Bj*7F0j6A2+wb#t$X`-jr69BFOMU36ifo~&r+!QkS3Uao#+R2} h&gWZmp2eN>iBp=)@RePBzZ%d822WQ%mvv4FO#r=cHgy01 literal 1765 zcmbVNUx*t;7*8pRRt_sF)I(v}zTBak{g-UAOVevENlj{Vp1HtX9|UJ-CdqQyo$c=C z-=XL!NYx5fd=ei7A3RZus1M$WEeQ40ini$aR8YAGK@mB@Cm;0NB)49#*Lt|Hnc11& z{J!7!XTCf)J@w$ozR`WLSZt(J%vWICAHKKjh2JsZ_8AxsO&_loV0`qECz|ARySMb@ zOP`-w`Z`#-bmF_qtE;PPYisN4>l+&z_abw=<&Q5uBcFLiKl@I0<-=p2esb*lwWU8^ zz5?g(3Mx}GvA?f(&Mrw=}O`O zPLbr4D5XSM6(re^G(*+7;lqP9kJOAx{^-yad}a7X5V(dYb~>GSM~ySDF3P&Di;^NL ziU0_~?>PbL3XXqplOa!i>{)JLF^3Bok;z&?h6kks7i>48b^KwNAYft_xuP7GLYMkL zf+L*U@|u0)1dFsuZR!L*VC4wwHdw&?2D=V*w0)HU2yM9>+1OEwZAT{jpwI?4h5^|T z?N@s)6)V(dEf3Q|8)O~~y>X44M^V7MDr3#fL``o>=5o0(F==jW)^Z5z_~Tp7&^!ug zhF2s-7Nmrr$W=u#WZg(A_e-iFNdst^5v$hQ2Gy!^(ttF}sjHw+H3S9dKfweWHRjm} ze70;na*S0Ei5 zSeuj5Q&zd6e!_{473WHJU5LDL@%ZuMSFc`u{P^+5j~@m7&n^S1<0%R93ugF_0Gvkx z)PUj*o-U3d5>sQ(dkQfdaxgn|ALah@fB(ccPbLWmpH=wKa5U!f+RtJ<7W<9XWIg3+ za^3dejp=8`>YU6EjjP4y#N7ONT0vr=*M)@v4Nr46H){P&+@aXCnYGWO>3hS^v-Odo z%pcldh+TZo>Y<<7;e*^#Q4wh@*6=!Y-x`n~h)z4*} HQ$iB}Sl@Qk literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_big_top.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_block_top.png similarity index 100% rename from src/main/resources/assets/betterend/textures/block/neon_cactus_big_top.png rename to src/main/resources/assets/betterend/textures/block/neon_cactus_block_top.png diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side.png index 1323e564aa84ca4dac0f946e533aacaf6ab357b8..7fd0f467d4f47aad9bca05eff0b2fe89f1bf603d 100644 GIT binary patch delta 443 zcmV;s0Yv_f0?GrB8Gi-<001BJ|6u?C00DDSM?wIu&K&6g00D$aL_t(IjeV25N&`U@ zhQG-Y43dRhY=RDGK*U-s)+ey=0jzBTY1ClnTUgj>si3x2HWogD0V@l$un3wgvr#l5 zS&J~^jJtTcnRENkH)jNvby~-1$)BfGUuLwqL{b*SzCcD(ynlx$lIVrFKj8fOROp-n zIkw;4agvMg6AJ6Ad7-lcy*cYZ_7>0Z$pGKuq;4eh2Kr^^`eC6)`+41K>tkkN+{Q;fBT>xY> zCH4j5x(ECNQA+7BP)f14<-U8`Y)~vOn6n1&FwpbqnR|@_mE?CiZ?0_onptKOE43-gsHO*u^e9JU*AnK1| l(~fj~_pN_3G8fj~{>h__4_?8>F76B*-tA;XeX!9tltbiZ^Y9GA-|~I21bL8N-(|@3^HLRfOTlf?;;6)^+8-2WJa&XL5bFYn*&Ma7R|yf(Ob^&2xi%{Da*D8II(5 u#WzUYUUs%9IcN4Y*0vdc>Z=?2zA*b7WC`D$nDGnf8U{~SKbLh*2~7YNhjByz diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_dust.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_dust.png index 0aba31b5d389db661e23d6d89648db07dbb8561d..a36b2e48aeb0cec93735c1a56622eb054ca38d2a 100644 GIT binary patch delta 555 zcmV+`0@VGl0=Wc`8Gi-<001BJ|6u?C00DDSM?wIu&K&6g00Hw!L_t(IjeU|qYZE~j zhM#SWgtQB37J@++YcPmEz(Xt)PoAnbdrYJU3qdFr!Gj3>6&@-m3G`wW#NtU15Aozp z3`7EfnhhIEvRP)6ur?&?A?~n4t8<)rzxRE4zR`%Bovo)qLVr(^FjhFZaS3lp!__rR zdq%9*z_WkiIs;xFJlDdR1h*d6;Co|)5LlK4fVU*ulF*ZiRvLt2*BJot`k=;#(FvwKLmviAj2PSHb)}(c znwm5y6bhOULVu|o?@wj=*0mhb_d=m?8e;SkU}D5@bxkH(mWA()WlO~%3ej~2Oolz; z{i$T|=KC)`er_p)XF?1KKY8{L0Mnk~>KYRx_J4?`X(|ka5NzI@?>*%Ood0Su{XJ9~ zgy7Fb8EoDw2cdxwf>^D=;;@JRSL1tQ84xl%^%GO+Wq@^laMA49$i%e6^O-B7S|czIs=NOEW3Ma_|Ay;hd%drR`8t> zNkbkh!O>(PwHcAGmj83&;<21X<7L?EP?Z=D2X?Dr2=5dcb tQW+ih*d)Vgc1hUheZ`{A3y&1@#BFl%_olaUAj5@(fbuA|F3HU>Jcaj@(X78j|vV1 zbUOp(CVIL!hDc1c?Q;}jR^(u*pXnIWyyE}=+ylO?&7mgF-5mk5zy2!;c3LHL=G9rf z8Jt)4Iw)^0RsU){@7`L?yRK|TNq>c^EEnAJvJyVQ9mRUbH~uAmja%*POO9uDU*ec@ zxYK9$-$sU+Vb7TEc^_P*ApU)7-j$rz^`feCITZX7j=ROal2(^UpL=AnO!o1c>dz&9 bcGNINFK6|3TAOSMbRL7JtDnm{r-UW|HU@?% diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_dust_overlay.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_dust_overlay.png index 264be42897b131c4a4750fee9773c52fddf87e66..e00a6131307e8bda281446f18df1e4d4e377fdf3 100644 GIT binary patch delta 196 zcmV;#06YJr0o4JJ8Gi-<001BJ|6u?C00DDSM?wIu&K&6g0056kL_t(IjbmUK1*2eO zfCF2a|HIfPj`jUVmuDhm0EZAaUPDj}KvsBQOY{Fn?^pc)@$M^wgHJ8vrJJ+=|9JP6 zflHVdzm1RHulNr$2xiEMV}1W0yi8>?{2?f5K@(3U|?Wi5D?>KkQ0o6>jMBRWkyBHX^X4?00003ZxHgX+CkR@6yfLkKV6n zc=f{{D8yP4o-dP diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_moss.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_moss.png index e22c2e9aa54a93a79e11e13036d31dceb603bf2e..2887aae934744b9c291e5e2a48aa05fb79855563 100644 GIT binary patch delta 555 zcmV+`0@VG)0=Wc`8Gi-<001BJ|6u?C00DDSM?wIu&K&6g00Hw!L_t(IjeU|qYZE~n z#edrn*_13MO%AJOz!gM#5WIL;ZyvlAgqD5)dkGXvK?D!t$?xFN4`2mP;vt9iP=X-n zp@tL>T`&W?;-|HNiQ~y!W3szc(70^`!ZHu74Zr=(X!y+-)!@Yea^I z@MaW_PZ@YWh|WV^AHC8N&l)S%;r>?6TO3BaJ7rbRc_bJ}!3B96{O0NxxO^Zxe*!kb|X=ft%Fhx=Q( zghB`{9bntGrhk;mMK1QI>Fv#1H^`pbw!I87y9p523PgsM-YBJHG8m;Pa|5yvqw|n> z7*Om_QwDFp{iOBrEN5H^F(Lfy#bW@3HzP7M;#%SV5QPvq21+UR?k#%%rEPHOvt;^b z$Omyb)g<6^43hUX-S0>#`Es=mfzPLhcZi1plPJVL*ndGOl`>oUiT=S3)J7@-Rj*J&?O{o6tUQ5Pm9y_7SLrHl1wkLaXJ<@V<477~bhStkras`V-p t>Eg8UheZ`{A3y&1@uN&)l4fbKW@EGA#3`2R);R9k;&o`R*R`vvixT{R z`bA2D{DK+&V}e}|lUFh@)H6);ba4!km}=V>Sa#TegC$Y0t4ZkLp}+5=HvB$yzi*nL z3yY-H^Xyd(E0-U5x2CE&*5Qm4&w@pg3h%$p3T{8plTjF2a*yR2pO~cXUDg+ji@DRZ z`oHk+39pa7#Cq@hDTZQeo|xRL^$usQid|u{pKeqoRPaN$)UCknR_EnQXXopl_|P-C u{r9D+6Z7}{saUeUtfjo~ed!;8zf29vY^I4nxpxBnz~JfX=d#Wzp$PzDxRf~n diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_moss_overlay.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_moss_overlay.png index e6ac60a105639beb82d14a025e3b0366d4b65fec..1a10d5eb2d82216f701eac1ab5a2510732e8191d 100644 GIT binary patch delta 276 zcmV+v0qg#`0i*(u8Gi-<001BJ|6u?C00DDSM?wIu&K&6g007=eL_t(IjqQ*L6|FYj{oOfu*Jy%iiutV>{yGM05Mjh*o zM55J(wosQl5Q!uZfd}szP5QpTZfnA)?4&PW@E|a~A&Mi0M$;CGV46bTA;Ji|tr3az a1bb9~VW;z3P7V720000@2^0LeMd~43LxN|;nN|PDBvWxFm1De6$ M>FVdQ&MBb@0I)qlcmMzZ From bd73d1c57634834b0ddb8bbd93296b5ea05893ab Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 27 Apr 2021 15:54:37 +0300 Subject: [PATCH 448/463] cactus fixes & destruction --- .../ru/betterend/blocks/NeonCactusBlock.java | 32 ++++++++-- .../models/block/neon_cactus_big.json | 4 +- .../models/block/neon_cactus_big_moss.json | 4 +- .../models/block/neon_cactus_big_sand.json | 4 +- .../models/block/neon_cactus_medium_moss.json | 58 +++++++++++++++++++ .../models/block/neon_cactus_medium_sand.json | 6 +- .../models/block/neon_cactus_small_moss.json | 48 +++++++-------- 7 files changed, 118 insertions(+), 38 deletions(-) create mode 100644 src/main/resources/assets/betterend/models/block/neon_cactus_medium_moss.json diff --git a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java index 51955d76..a9ad12c8 100644 --- a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java +++ b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java @@ -11,8 +11,11 @@ import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.Block; @@ -28,6 +31,7 @@ import net.minecraft.world.level.block.state.properties.DirectionProperty; import net.minecraft.world.level.block.state.properties.EnumProperty; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.pathfinder.PathComputationType; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.BlockProperties.CactusBottom; @@ -38,6 +42,7 @@ import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; public class NeonCactusBlock extends BlockBaseNotFull implements SimpleWaterloggedBlock, IRenderTypeable { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; @@ -99,13 +104,14 @@ public class NeonCactusBlock extends BlockBaseNotFull implements SimpleWaterlogg @Override public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { + if (!canSurvive(state, world, pos)) { + world.getBlockTicks().scheduleTick(pos, this, MHelper.randRange(1, 4, world.getRandom())); + return state; + } if ((Boolean) state.getValue(WATERLOGGED)) { world.getLiquidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); } Direction dir = state.getValue(FACING); - if (!canSurvive(state, world, pos)) { - return Blocks.AIR.defaultBlockState(); - } BlockState downState = world.getBlockState(pos.relative(dir.getOpposite())); if (downState.is(Blocks.END_STONE) || downState.is(EndBlocks.ENDSTONE_DUST)) { state = state.setValue(CACTUS_BOTTOM, CactusBottom.SAND); @@ -119,6 +125,13 @@ public class NeonCactusBlock extends BlockBaseNotFull implements SimpleWaterlogg return state; } + @Override + public void tick(BlockState blockState, ServerLevel serverLevel, BlockPos blockPos, Random random) { + if (!blockState.canSurvive(serverLevel, blockPos)) { + serverLevel.destroyBlock(blockPos, true); + } + } + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.CUTOUT; @@ -154,11 +167,10 @@ public class NeonCactusBlock extends BlockBaseNotFull implements SimpleWaterlogg @Override public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { - Direction dir = state.getValue(FACING); if (!this.canSurvive(state, world, pos)) { - this.destroy(world, pos, state); return; } + Direction dir = state.getValue(FACING); if (!world.isEmptyBlock(pos.relative(dir))) { return; } @@ -187,6 +199,16 @@ public class NeonCactusBlock extends BlockBaseNotFull implements SimpleWaterlogg BlocksHelper.setWithoutUpdate(world, pos.relative(dir), placement); mutateStem(placement, world, pos, MAX_LENGTH); } + + @Override + public boolean isPathfindable(BlockState blockState, BlockGetter blockGetter, BlockPos blockPos, PathComputationType pathComputationType) { + return false; + } + + @Override + public void entityInside(BlockState blockState, Level level, BlockPos blockPos, Entity entity) { + entity.hurt(DamageSource.CACTUS, 1.0F); + } private int getLength(BlockState state, ServerLevel world, BlockPos pos, int max) { int length = 0; diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_big.json b/src/main/resources/assets/betterend/models/block/neon_cactus_big.json index 7e2dac87..9125516b 100644 --- a/src/main/resources/assets/betterend/models/block/neon_cactus_big.json +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_big.json @@ -12,8 +12,8 @@ "to": [ 14, 14, 14 ], "shade": false, "faces": { - "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, - "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "down": { "uv": [ 2, 2, 14, 14 ], "texture": "#top" }, + "up": { "uv": [ 2, 2, 14, 14 ], "texture": "#top" }, "north": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, "south": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, "west": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_big_moss.json b/src/main/resources/assets/betterend/models/block/neon_cactus_big_moss.json index d8c3232a..9141f6b1 100644 --- a/src/main/resources/assets/betterend/models/block/neon_cactus_big_moss.json +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_big_moss.json @@ -13,8 +13,8 @@ "to": [ 14, 14, 14 ], "shade": false, "faces": { - "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, - "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "down": { "uv": [ 2, 2, 14, 14 ], "texture": "#top" }, + "up": { "uv": [ 2, 2, 14, 14 ], "texture": "#top" }, "north": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, "south": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, "west": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_big_sand.json b/src/main/resources/assets/betterend/models/block/neon_cactus_big_sand.json index addf607a..af667304 100644 --- a/src/main/resources/assets/betterend/models/block/neon_cactus_big_sand.json +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_big_sand.json @@ -13,8 +13,8 @@ "to": [ 14, 14, 14 ], "shade": false, "faces": { - "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, - "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "down": { "uv": [ 2, 2, 14, 14 ], "texture": "#top" }, + "up": { "uv": [ 2, 2, 14, 14 ], "texture": "#top" }, "north": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, "south": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, "west": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }, diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_medium_moss.json b/src/main/resources/assets/betterend/models/block/neon_cactus_medium_moss.json new file mode 100644 index 00000000..d1400921 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_medium_moss.json @@ -0,0 +1,58 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/neon_cactus_medium_side", + "overlay": "betterend:block/neon_cactus_medium_side_moss_overlay", + "side": "betterend:block/neon_cactus_medium_side_moss", + "top": "betterend:block/neon_cactus_medium_top" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 3, -3, 3 ], + "to": [ 13, 13, 13 ], + "shade": false, + "faces": { + "down": { "uv": [ 3, 3, 13, 13 ], "texture": "#top" }, + "up": { "uv": [ 3, 3, 13, 13 ], "texture": "#top" }, + "north": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" }, + "south": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" }, + "west": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" }, + "east": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" } + } + }, + { + "__comment": "Box1", + "from": [ 3, -3, 3 ], + "to": [ 13, 13, 13 ], + "faces": { + "north": { "uv": [ 3, 0, 13, 16 ], "texture": "#overlay" }, + "south": { "uv": [ 3, 0, 13, 16 ], "texture": "#overlay" }, + "west": { "uv": [ 3, 0, 13, 16 ], "texture": "#overlay" }, + "east": { "uv": [ 3, 0, 13, 16 ], "texture": "#overlay" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 0, -3, 0 ], + "to": [ 0.001, 13, 22.5 ], + "rotation": { "origin": [ 0, -3, 0 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 16, -3, 0 ], + "to": [ 16.001, 13, 22.5 ], + "rotation": { "origin": [ 16, -3, 0 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_medium_sand.json b/src/main/resources/assets/betterend/models/block/neon_cactus_medium_sand.json index 807dbf17..8120468b 100644 --- a/src/main/resources/assets/betterend/models/block/neon_cactus_medium_sand.json +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_medium_sand.json @@ -1,9 +1,9 @@ { "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", "textures": { - "particle": "betterend:block/neon_cactus_small_side_moss", - "overlay": "betterend:block/neon_cactus_small_side_dust_overlay", - "side": "betterend:block/neon_cactus_medium_side", + "particle": "betterend:block/neon_cactus_medium_side", + "overlay": "betterend:block/neon_cactus_medium_side_dust_overlay", + "side": "betterend:block/neon_cactus_medium_side_dust", "top": "betterend:block/neon_cactus_medium_top" }, "elements": [ diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_small_moss.json b/src/main/resources/assets/betterend/models/block/neon_cactus_small_moss.json index 19596490..65825cc0 100644 --- a/src/main/resources/assets/betterend/models/block/neon_cactus_small_moss.json +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_small_moss.json @@ -1,42 +1,42 @@ { "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", "textures": { - "particle": "betterend:block/neon_cactus_small_side_moss", + "particle": "betterend:block/neon_cactus_small_side", "overlay": "betterend:block/neon_cactus_small_side_moss_overlay", - "side": "betterend:block/neon_cactus_medium_side", - "top": "betterend:block/neon_cactus_medium_top" + "side": "betterend:block/neon_cactus_small_side_moss", + "top": "betterend:block/neon_cactus_small_top" }, "elements": [ { "__comment": "Box1", - "from": [ 3, -3, 3 ], - "to": [ 13, 13, 13 ], + "from": [ 4, -4, 4 ], + "to": [ 12, 12, 12 ], "shade": false, "faces": { - "down": { "uv": [ 3, 3, 13, 13 ], "texture": "#top" }, - "up": { "uv": [ 3, 3, 13, 13 ], "texture": "#top" }, - "north": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" }, - "south": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" }, - "west": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" }, - "east": { "uv": [ 3, 0, 13, 16 ], "texture": "#side" } + "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" }, + "north": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, + "south": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, + "west": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, + "east": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" } } }, { - "__comment": "Box1", - "from": [ 3, -3, 3 ], - "to": [ 13, 13, 13 ], + "from": [ 4, -4, 4 ], + "to": [ 12, 12, 12 ], "faces": { - "north": { "uv": [ 3, 0, 13, 16 ], "texture": "#overlay" }, - "south": { "uv": [ 3, 0, 13, 16 ], "texture": "#overlay" }, - "west": { "uv": [ 3, 0, 13, 16 ], "texture": "#overlay" }, - "east": { "uv": [ 3, 0, 13, 16 ], "texture": "#overlay" } + "north": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" }, + "south": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" }, + "west": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" }, + "east": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" } } }, { "__comment": "PlaneX2", - "from": [ 0, -3, 0 ], - "to": [ 0.001, 13, 22.5 ], - "rotation": { "origin": [ 0, -3, 0 ], "axis": "y", "angle": 45 }, + "from": [ 0, -4, 0 ], + "to": [ 0.001, 12, 22.5 ], + "rotation": { "origin": [ 0, -4, 0 ], "axis": "y", "angle": 45 }, "shade": false, "faces": { "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, @@ -45,9 +45,9 @@ }, { "__comment": "PlaneX2", - "from": [ 16, -3, 0 ], - "to": [ 16.001, 13, 22.5 ], - "rotation": { "origin": [ 16, -3, 0 ], "axis": "y", "angle": -45 }, + "from": [ 16, -4, 0 ], + "to": [ 16.001, 12, 22.5 ], + "rotation": { "origin": [ 16, -4, 0 ], "axis": "y", "angle": -45 }, "shade": false, "faces": { "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, From cce934d537305e04fcea2e2ef16e3ceea770be3d Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 28 Apr 2021 01:13:15 +0300 Subject: [PATCH 449/463] Cactus fixes & enhancements --- .../ru/betterend/blocks/NeonCactusBlock.java | 299 +------------ .../blocks/NeonCactusPlantBlock.java | 396 ++++++++++++++++++ .../java/ru/betterend/registry/EndBlocks.java | 5 +- .../world/features/NeonCactusFeature.java | 85 +--- .../blockstates/neon_cactus_slab.json | 15 + .../blockstates/neon_cactus_stairs.json | 44 ++ .../models/block/neon_cactus_slab.json | 8 + .../models/block/neon_cactus_stairs.json | 8 + .../block/neon_cactus_stairs_inner.json | 8 + .../block/neon_cactus_stairs_outer.json | 8 + .../models/item/neon_cactus_slab.json | 3 + .../models/item/neon_cactus_stairs.json | 3 + 12 files changed, 507 insertions(+), 375 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java create mode 100644 src/main/resources/assets/betterend/blockstates/neon_cactus_slab.json create mode 100644 src/main/resources/assets/betterend/blockstates/neon_cactus_stairs.json create mode 100644 src/main/resources/assets/betterend/models/block/neon_cactus_slab.json create mode 100644 src/main/resources/assets/betterend/models/block/neon_cactus_stairs.json create mode 100644 src/main/resources/assets/betterend/models/block/neon_cactus_stairs_inner.json create mode 100644 src/main/resources/assets/betterend/models/block/neon_cactus_stairs_outer.json create mode 100644 src/main/resources/assets/betterend/models/item/neon_cactus_slab.json create mode 100644 src/main/resources/assets/betterend/models/item/neon_cactus_stairs.json diff --git a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java index a9ad12c8..55fa5910 100644 --- a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java +++ b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java @@ -1,304 +1,11 @@ package ru.betterend.blocks; -import java.util.EnumMap; -import java.util.Random; - -import com.google.common.collect.Maps; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.core.BlockPos; -import net.minecraft.core.BlockPos.MutableBlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Direction.Axis; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.Mirror; -import net.minecraft.world.level.block.Rotation; -import net.minecraft.world.level.block.SimpleWaterloggedBlock; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.block.state.properties.BooleanProperty; -import net.minecraft.world.level.block.state.properties.DirectionProperty; -import net.minecraft.world.level.block.state.properties.EnumProperty; -import net.minecraft.world.level.material.FluidState; -import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.level.pathfinder.PathComputationType; -import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.VoxelShape; -import ru.betterend.blocks.BlockProperties.CactusBottom; -import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.basis.BlockBaseNotFull; -import ru.betterend.client.render.ERenderLayer; -import ru.betterend.interfaces.IRenderTypeable; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndTags; -import ru.betterend.util.BlocksHelper; -import ru.betterend.util.MHelper; +import ru.betterend.blocks.basis.EndPillarBlock; -public class NeonCactusBlock extends BlockBaseNotFull implements SimpleWaterloggedBlock, IRenderTypeable { - public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; - public static final EnumProperty CACTUS_BOTTOM = BlockProperties.CACTUS_BOTTOM; - public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; - public static final DirectionProperty FACING = BlockStateProperties.FACING; - - private static final EnumMap BIG_SHAPES_OPEN = Maps.newEnumMap(Direction.class); - private static final EnumMap MEDIUM_SHAPES_OPEN = Maps.newEnumMap(Direction.class); - private static final EnumMap SMALL_SHAPES_OPEN = Maps.newEnumMap(Direction.class); - private static final EnumMap BIG_SHAPES = Maps.newEnumMap(Axis.class); - private static final EnumMap MEDIUM_SHAPES = Maps.newEnumMap(Axis.class); - private static final EnumMap SMALL_SHAPES = Maps.newEnumMap(Axis.class); - private static final int MAX_LENGTH = 12; - +public class NeonCactusBlock extends EndPillarBlock { public NeonCactusBlock() { - super(FabricBlockSettings.copyOf(Blocks.CACTUS).luminance(15).randomTicks()); - registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false).setValue(FACING, Direction.UP).setValue(SHAPE, TripleShape.TOP)); - } - - @Override - protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { - stateManager.add(SHAPE, CACTUS_BOTTOM, WATERLOGGED, FACING); - } - - @Override - public BlockState getStateForPlacement(BlockPlaceContext ctx) { - LevelAccessor world = ctx.getLevel(); - BlockPos pos = ctx.getClickedPos(); - Direction dir = ctx.getClickedFace(); - BlockState down = world.getBlockState(pos.relative(dir.getOpposite())); - BlockState state = this.defaultBlockState().setValue(WATERLOGGED, world.getFluidState(pos).getType() == Fluids.WATER).setValue(FACING, ctx.getClickedFace()); - if (down.is(Blocks.END_STONE) || down.is(EndBlocks.ENDSTONE_DUST)) { - state = state.setValue(CACTUS_BOTTOM, CactusBottom.SAND); - } - else if (down.is(EndBlocks.END_MOSS)) { - state = state.setValue(CACTUS_BOTTOM, CactusBottom.MOSS); - } - else { - state = state.setValue(CACTUS_BOTTOM, CactusBottom.EMPTY); - } - return state; - } - - @Override - public BlockState rotate(BlockState state, Rotation rotation) { - return BlocksHelper.rotateHorizontal(state, rotation, FACING); - } - - @Override - public BlockState mirror(BlockState state, Mirror mirror) { - return BlocksHelper.mirrorHorizontal(state, mirror, FACING); - } - - @Override - public FluidState getFluidState(BlockState state) { - return (Boolean) state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); - } - - @Override - public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { - if (!canSurvive(state, world, pos)) { - world.getBlockTicks().scheduleTick(pos, this, MHelper.randRange(1, 4, world.getRandom())); - return state; - } - if ((Boolean) state.getValue(WATERLOGGED)) { - world.getLiquidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); - } - Direction dir = state.getValue(FACING); - BlockState downState = world.getBlockState(pos.relative(dir.getOpposite())); - if (downState.is(Blocks.END_STONE) || downState.is(EndBlocks.ENDSTONE_DUST)) { - state = state.setValue(CACTUS_BOTTOM, CactusBottom.SAND); - } - else if (downState.is(EndBlocks.END_MOSS)) { - state = state.setValue(CACTUS_BOTTOM, CactusBottom.MOSS); - } - else { - state = state.setValue(CACTUS_BOTTOM, CactusBottom.EMPTY); - } - return state; - } - - @Override - public void tick(BlockState blockState, ServerLevel serverLevel, BlockPos blockPos, Random random) { - if (!blockState.canSurvive(serverLevel, blockPos)) { - serverLevel.destroyBlock(blockPos, true); - } - } - - @Override - public ERenderLayer getRenderLayer() { - return ERenderLayer.CUTOUT; - } - - @Override - public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { - TripleShape shape = state.getValue(SHAPE); - Direction dir = state.getValue(FACING); - BlockState next = view.getBlockState(pos.relative(dir)); - if (next.is(this)) { - Axis axis = dir.getAxis(); - if (shape == TripleShape.BOTTOM) { - return BIG_SHAPES.get(axis); - } - return shape == TripleShape.MIDDLE ? MEDIUM_SHAPES.get(axis) : SMALL_SHAPES.get(axis); - } - else { - if (shape == TripleShape.BOTTOM) { - return BIG_SHAPES_OPEN.get(dir); - } - return shape == TripleShape.MIDDLE ? MEDIUM_SHAPES_OPEN.get(dir) : SMALL_SHAPES_OPEN.get(dir); - } - } - - @Override - public boolean canSurvive(BlockState state, LevelReader level, BlockPos pos) { - Direction dir = state.getValue(FACING); - BlockPos supportPos = pos.relative(dir.getOpposite()); - BlockState support = level.getBlockState(supportPos); - return support.is(this) || support.isFaceSturdy(level, supportPos, dir); - } - - @Override - public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { - if (!this.canSurvive(state, world, pos)) { - return; - } - Direction dir = state.getValue(FACING); - if (!world.isEmptyBlock(pos.relative(dir))) { - return; - } - int length = getLength(state, world, pos, MAX_LENGTH); - if (length < 0 || length > MAX_LENGTH - 1) { - return; - } - if (dir != Direction.UP) { - int horizontal = getHorizontal(state, world, pos, 2); - if (horizontal > random.nextInt(2)) { - dir = Direction.UP; - if (!world.getBlockState(pos.above()).isAir()) { - return; - } - } - } - else if (length > 1 && world.getBlockState(pos.below()).is(this)) { - Direction side = BlocksHelper.randomHorizontal(random); - BlockPos sidePos = pos.relative(side); - if (world.isEmptyBlock(sidePos)) { - BlockState placement = state.setValue(SHAPE, TripleShape.TOP).setValue(CACTUS_BOTTOM, CactusBottom.EMPTY).setValue(WATERLOGGED, false).setValue(FACING, side); - BlocksHelper.setWithoutUpdate(world, sidePos, placement); - } - } - BlockState placement = state.setValue(SHAPE, TripleShape.TOP).setValue(CACTUS_BOTTOM, CactusBottom.EMPTY).setValue(WATERLOGGED, false).setValue(FACING, dir); - BlocksHelper.setWithoutUpdate(world, pos.relative(dir), placement); - mutateStem(placement, world, pos, MAX_LENGTH); - } - - @Override - public boolean isPathfindable(BlockState blockState, BlockGetter blockGetter, BlockPos blockPos, PathComputationType pathComputationType) { - return false; - } - - @Override - public void entityInside(BlockState blockState, Level level, BlockPos blockPos, Entity entity) { - entity.hurt(DamageSource.CACTUS, 1.0F); - } - - private int getLength(BlockState state, ServerLevel world, BlockPos pos, int max) { - int length = 0; - Direction dir = state.getValue(FACING).getOpposite(); - MutableBlockPos mut = new MutableBlockPos().set(pos); - for (int i = 0; i < max; i++) { - mut.move(dir); - state = world.getBlockState(mut); - if (!state.is(this)) { - if (!state.is(EndTags.END_GROUND)) { - length = -1; - } - break; - } - dir = state.getValue(FACING).getOpposite(); - length ++; - } - return length; - } - - private int getHorizontal(BlockState state, ServerLevel world, BlockPos pos, int max) { - int count = 0; - Direction dir = state.getValue(FACING).getOpposite(); - MutableBlockPos mut = new MutableBlockPos().set(pos); - for (int i = 0; i < max; i++) { - mut.move(dir); - state = world.getBlockState(mut); - if (!state.is(this)) { - break; - } - dir = state.getValue(FACING).getOpposite(); - if (dir.getStepY() != 0) { - break; - } - count ++; - } - return count; - } - - private void mutateStem(BlockState state, ServerLevel world, BlockPos pos, int max) { - Direction dir = state.getValue(FACING).getOpposite(); - MutableBlockPos mut = new MutableBlockPos().set(pos); - for (int i = 0; i < max; i++) { - mut.move(dir); - state = world.getBlockState(mut); - if (!state.is(this)) { - return; - } - int size = (i + 2) * 3 / max; - int src = state.getValue(SHAPE).getIndex(); - dir = state.getValue(FACING).getOpposite(); - if (src < size) { - TripleShape shape = TripleShape.fromIndex(size); - BlocksHelper.setWithoutUpdate(world, mut, state.setValue(SHAPE, shape)); - } - } - } - - static { - BIG_SHAPES.put(Axis.X, Block.box(0, 2, 2, 16, 14, 14)); - BIG_SHAPES.put(Axis.Y, Block.box(2, 0, 2, 14, 16, 14)); - BIG_SHAPES.put(Axis.Z, Block.box(2, 2, 0, 14, 14, 16)); - - MEDIUM_SHAPES.put(Axis.X, Block.box(0, 3, 3, 16, 13, 13)); - MEDIUM_SHAPES.put(Axis.Y, Block.box(3, 0, 3, 13, 16, 13)); - MEDIUM_SHAPES.put(Axis.Z, Block.box(3, 3, 0, 13, 13, 16)); - - SMALL_SHAPES.put(Axis.X, Block.box(0, 4, 4, 16, 12, 12)); - SMALL_SHAPES.put(Axis.Y, Block.box(4, 0, 4, 12, 16, 12)); - SMALL_SHAPES.put(Axis.Z, Block.box(4, 4, 0, 12, 12, 16)); - - BIG_SHAPES_OPEN.put(Direction.UP, Block.box(2, 0, 2, 14, 14, 14)); - BIG_SHAPES_OPEN.put(Direction.DOWN, Block.box(2, 2, 2, 14, 16, 14)); - BIG_SHAPES_OPEN.put(Direction.NORTH, Block.box(2, 2, 2, 14, 14, 16)); - BIG_SHAPES_OPEN.put(Direction.SOUTH, Block.box(2, 2, 0, 14, 14, 14)); - BIG_SHAPES_OPEN.put(Direction.WEST, Block.box(2, 2, 2, 16, 14, 14)); - BIG_SHAPES_OPEN.put(Direction.EAST, Block.box(0, 2, 2, 14, 14, 14)); - - MEDIUM_SHAPES_OPEN.put(Direction.UP, Block.box(3, 0, 3, 13, 13, 13)); - MEDIUM_SHAPES_OPEN.put(Direction.DOWN, Block.box(3, 3, 3, 13, 16, 13)); - MEDIUM_SHAPES_OPEN.put(Direction.NORTH, Block.box(3, 3, 3, 13, 13, 16)); - MEDIUM_SHAPES_OPEN.put(Direction.SOUTH, Block.box(3, 3, 0, 13, 13, 13)); - MEDIUM_SHAPES_OPEN.put(Direction.WEST, Block.box(3, 3, 3, 16, 13, 13)); - MEDIUM_SHAPES_OPEN.put(Direction.EAST, Block.box(0, 3, 3, 13, 13, 13)); - - SMALL_SHAPES_OPEN.put(Direction.UP, Block.box(4, 0, 4, 12, 12, 12)); - SMALL_SHAPES_OPEN.put(Direction.DOWN, Block.box(4, 4, 4, 12, 16, 12)); - SMALL_SHAPES_OPEN.put(Direction.NORTH, Block.box(4, 4, 4, 12, 12, 16)); - SMALL_SHAPES_OPEN.put(Direction.SOUTH, Block.box(4, 4, 0, 12, 12, 12)); - SMALL_SHAPES_OPEN.put(Direction.WEST, Block.box(4, 4, 4, 16, 12, 12)); - SMALL_SHAPES_OPEN.put(Direction.EAST, Block.box(0, 4, 4, 12, 12, 12)); + super(FabricBlockSettings.copyOf(Blocks.CACTUS).luminance(15)); } } diff --git a/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java b/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java new file mode 100644 index 00000000..be5131e2 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java @@ -0,0 +1,396 @@ +package ru.betterend.blocks; + +import java.util.EnumMap; +import java.util.List; +import java.util.Random; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.pathfinder.PathComputationType; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.betterend.blocks.BlockProperties.CactusBottom; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.blocks.basis.BlockBaseNotFull; +import ru.betterend.client.render.ERenderLayer; +import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; + +public class NeonCactusPlantBlock extends BlockBaseNotFull implements SimpleWaterloggedBlock, IRenderTypeable { + public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; + public static final EnumProperty CACTUS_BOTTOM = BlockProperties.CACTUS_BOTTOM; + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + public static final DirectionProperty FACING = BlockStateProperties.FACING; + + private static final EnumMap BIG_SHAPES_OPEN = Maps.newEnumMap(Direction.class); + private static final EnumMap MEDIUM_SHAPES_OPEN = Maps.newEnumMap(Direction.class); + private static final EnumMap SMALL_SHAPES_OPEN = Maps.newEnumMap(Direction.class); + private static final EnumMap BIG_SHAPES = Maps.newEnumMap(Axis.class); + private static final EnumMap MEDIUM_SHAPES = Maps.newEnumMap(Axis.class); + private static final EnumMap SMALL_SHAPES = Maps.newEnumMap(Axis.class); + private static final int MAX_LENGTH = 12; + + public NeonCactusPlantBlock() { + super(FabricBlockSettings.copyOf(Blocks.CACTUS).luminance(15).randomTicks()); + registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false).setValue(FACING, Direction.UP).setValue(SHAPE, TripleShape.TOP)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(SHAPE, CACTUS_BOTTOM, WATERLOGGED, FACING); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + LevelAccessor world = ctx.getLevel(); + BlockPos pos = ctx.getClickedPos(); + Direction dir = ctx.getClickedFace(); + BlockState down = world.getBlockState(pos.relative(dir.getOpposite())); + BlockState state = this.defaultBlockState().setValue(WATERLOGGED, world.getFluidState(pos).getType() == Fluids.WATER).setValue(FACING, ctx.getClickedFace()); + if (down.is(Blocks.END_STONE) || down.is(EndBlocks.ENDSTONE_DUST)) { + state = state.setValue(CACTUS_BOTTOM, CactusBottom.SAND); + } + else if (down.is(EndBlocks.END_MOSS)) { + state = state.setValue(CACTUS_BOTTOM, CactusBottom.MOSS); + } + else { + state = state.setValue(CACTUS_BOTTOM, CactusBottom.EMPTY); + } + return state; + } + + @Override + public BlockState rotate(BlockState state, Rotation rotation) { + return BlocksHelper.rotateHorizontal(state, rotation, FACING); + } + + @Override + public BlockState mirror(BlockState state, Mirror mirror) { + return BlocksHelper.mirrorHorizontal(state, mirror, FACING); + } + + @Override + public FluidState getFluidState(BlockState state) { + return (Boolean) state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); + } + + @Override + public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { + if (!canSurvive(state, world, pos)) { + world.getBlockTicks().scheduleTick(pos, this, MHelper.randRange(1, 4, world.getRandom())); + return state; + } + if ((Boolean) state.getValue(WATERLOGGED)) { + world.getLiquidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); + } + Direction dir = state.getValue(FACING); + BlockState downState = world.getBlockState(pos.relative(dir.getOpposite())); + if (downState.is(Blocks.END_STONE) || downState.is(EndBlocks.ENDSTONE_DUST)) { + state = state.setValue(CACTUS_BOTTOM, CactusBottom.SAND); + } + else if (downState.is(EndBlocks.END_MOSS)) { + state = state.setValue(CACTUS_BOTTOM, CactusBottom.MOSS); + } + else { + state = state.setValue(CACTUS_BOTTOM, CactusBottom.EMPTY); + } + return state; + } + + @Override + public void tick(BlockState blockState, ServerLevel serverLevel, BlockPos blockPos, Random random) { + if (!blockState.canSurvive(serverLevel, blockPos)) { + serverLevel.destroyBlock(blockPos, true); + } + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + TripleShape shape = state.getValue(SHAPE); + Direction dir = state.getValue(FACING); + BlockState next = view.getBlockState(pos.relative(dir)); + if (next.is(this)) { + Axis axis = dir.getAxis(); + if (shape == TripleShape.BOTTOM) { + return BIG_SHAPES.get(axis); + } + return shape == TripleShape.MIDDLE ? MEDIUM_SHAPES.get(axis) : SMALL_SHAPES.get(axis); + } + else { + if (shape == TripleShape.BOTTOM) { + return BIG_SHAPES_OPEN.get(dir); + } + return shape == TripleShape.MIDDLE ? MEDIUM_SHAPES_OPEN.get(dir) : SMALL_SHAPES_OPEN.get(dir); + } + } + + @Override + public boolean canSurvive(BlockState state, LevelReader level, BlockPos pos) { + Direction dir = state.getValue(FACING); + BlockPos supportPos = pos.relative(dir.getOpposite()); + BlockState support = level.getBlockState(supportPos); + return support.is(this) || support.isFaceSturdy(level, supportPos, dir); + } + + @Override + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + if (!this.canSurvive(state, world, pos) || random.nextInt(8) > 0) { + return; + } + Direction dir = state.getValue(FACING); + if (!world.isEmptyBlock(pos.relative(dir))) { + return; + } + int length = getLength(state, world, pos, MAX_LENGTH); + if (length < 0 || length > MAX_LENGTH - 1) { + return; + } + if (dir.getAxis().isHorizontal()) { + int horizontal = getHorizontal(state, world, pos, 2); + if (horizontal > random.nextInt(2)) { + dir = Direction.UP; + if (!world.getBlockState(pos.above()).isAir()) { + return; + } + } + } + else if (length > 1 && world.getBlockState(pos.below()).is(this)) { + Direction side = BlocksHelper.randomHorizontal(random); + BlockPos sidePos = pos.relative(side); + if (world.isEmptyBlock(sidePos)) { + BlockState placement = state.setValue(SHAPE, TripleShape.TOP).setValue(CACTUS_BOTTOM, CactusBottom.EMPTY).setValue(WATERLOGGED, false).setValue(FACING, side); + BlocksHelper.setWithoutUpdate(world, sidePos, placement); + } + } + BlockState placement = state.setValue(SHAPE, TripleShape.TOP).setValue(CACTUS_BOTTOM, CactusBottom.EMPTY).setValue(WATERLOGGED, false).setValue(FACING, dir); + BlocksHelper.setWithoutUpdate(world, pos.relative(dir), placement); + mutateStem(placement, world, pos, MAX_LENGTH); + } + + public void growPlant(WorldGenLevel world, BlockPos pos, Random random) { + growPlant(world, pos, random, MHelper.randRange(MAX_LENGTH >> 1, MAX_LENGTH, random)); + } + + public void growPlant(WorldGenLevel world, BlockPos pos, Random random, int iterations) { + BlockState state = defaultBlockState(); + BlockState downState = world.getBlockState(pos.below()); + if (downState.is(Blocks.END_STONE) || downState.is(EndBlocks.ENDSTONE_DUST)) { + state = state.setValue(CACTUS_BOTTOM, CactusBottom.SAND); + } + else if (downState.is(EndBlocks.END_MOSS)) { + state = state.setValue(CACTUS_BOTTOM, CactusBottom.MOSS); + } + else { + state = state.setValue(CACTUS_BOTTOM, CactusBottom.EMPTY); + } + BlocksHelper.setWithoutUpdate(world, pos, state); + List ends = Lists.newArrayList(pos.mutable()); + for (int i = 0; i < iterations; i++) { + int count = ends.size(); + for (int n = 0; n < count; n++) { + if (!growIteration(world, ends.get(n), random, ends, i)) { + ends.remove(n); + count--; + n--; + } + } + } + } + + private boolean growIteration(WorldGenLevel world, MutableBlockPos pos, Random random, List ends, int length) { + BlockState state = world.getBlockState(pos); + if (!state.is(this)) { + return false; + } + Direction dir = state.getValue(FACING); + if (!world.isEmptyBlock(pos.relative(dir))) { + return false; + } + if (dir.getAxis().isHorizontal()) { + int horizontal = getHorizontal(state, world, pos, 2); + if (horizontal > random.nextInt(2)) { + dir = Direction.UP; + if (!world.getBlockState(pos.above()).isAir()) { + return false; + } + } + } + else if (length > 1 && world.getBlockState(pos.below()).is(this)) { + MutableBlockPos iterPos = pos.mutable(); + BlockState iterState = state; + Direction startDir = null; + Direction lastDir = null; + while (iterState.is(this)) { + startDir = iterState.getValue(FACING); + if (lastDir == null) { + for (Direction side: BlocksHelper.HORIZONTAL) { + BlockState sideState = world.getBlockState(iterPos.relative(side)); + if (sideState.is(this)) { + Direction sideDir = sideState.getValue(FACING); + if (sideDir != side) { + continue; + } + lastDir = sideDir; + } + } + } + iterPos.move(dir); + iterState = world.getBlockState(iterPos); + } + + Direction side = lastDir == null ? BlocksHelper.randomHorizontal(random) : lastDir.getClockWise(); + if (side.getOpposite() == startDir) { + side = side.getClockWise(); + } + BlockPos sidePos = pos.relative(side); + if (world.isEmptyBlock(sidePos)) { + BlockState placement = state.setValue(SHAPE, TripleShape.TOP).setValue(CACTUS_BOTTOM, CactusBottom.EMPTY).setValue(WATERLOGGED, false).setValue(FACING, side); + BlocksHelper.setWithoutUpdate(world, sidePos, placement); + ends.add(sidePos.mutable()); + } + } + BlockState placement = state.setValue(SHAPE, TripleShape.TOP).setValue(CACTUS_BOTTOM, CactusBottom.EMPTY).setValue(WATERLOGGED, false).setValue(FACING, dir); + BlocksHelper.setWithoutUpdate(world, pos.relative(dir), placement); + mutateStem(placement, world, pos, MAX_LENGTH); + pos.move(dir); + return true; + } + + @Override + public boolean isPathfindable(BlockState blockState, BlockGetter blockGetter, BlockPos blockPos, PathComputationType pathComputationType) { + return false; + } + + @Override + public void entityInside(BlockState blockState, Level level, BlockPos blockPos, Entity entity) { + entity.hurt(DamageSource.CACTUS, 1.0F); + } + + private int getLength(BlockState state, ServerLevel world, BlockPos pos, int max) { + int length = 0; + Direction dir = state.getValue(FACING).getOpposite(); + MutableBlockPos mut = new MutableBlockPos().set(pos); + for (int i = 0; i < max; i++) { + mut.move(dir); + state = world.getBlockState(mut); + if (!state.is(this)) { + if (!state.is(EndTags.END_GROUND)) { + length = -1; + } + break; + } + dir = state.getValue(FACING).getOpposite(); + length ++; + } + return length; + } + + private int getHorizontal(BlockState state, WorldGenLevel world, BlockPos pos, int max) { + int count = 0; + Direction dir = state.getValue(FACING).getOpposite(); + MutableBlockPos mut = new MutableBlockPos().set(pos); + for (int i = 0; i < max; i++) { + mut.move(dir); + state = world.getBlockState(mut); + if (!state.is(this)) { + break; + } + dir = state.getValue(FACING).getOpposite(); + if (dir.getStepY() != 0) { + break; + } + count ++; + } + return count; + } + + private void mutateStem(BlockState state, WorldGenLevel world, BlockPos pos, int max) { + Direction dir = state.getValue(FACING).getOpposite(); + MutableBlockPos mut = new MutableBlockPos().set(pos); + for (int i = 0; i < max; i++) { + mut.move(dir); + state = world.getBlockState(mut); + if (!state.is(this)) { + return; + } + int size = (i + 2) * 3 / max; + int src = state.getValue(SHAPE).getIndex(); + dir = state.getValue(FACING).getOpposite(); + if (src < size) { + TripleShape shape = TripleShape.fromIndex(size); + BlocksHelper.setWithoutUpdate(world, mut, state.setValue(SHAPE, shape)); + } + } + } + + static { + BIG_SHAPES.put(Axis.X, Block.box(0, 2, 2, 16, 14, 14)); + BIG_SHAPES.put(Axis.Y, Block.box(2, 0, 2, 14, 16, 14)); + BIG_SHAPES.put(Axis.Z, Block.box(2, 2, 0, 14, 14, 16)); + + MEDIUM_SHAPES.put(Axis.X, Block.box(0, 3, 3, 16, 13, 13)); + MEDIUM_SHAPES.put(Axis.Y, Block.box(3, 0, 3, 13, 16, 13)); + MEDIUM_SHAPES.put(Axis.Z, Block.box(3, 3, 0, 13, 13, 16)); + + SMALL_SHAPES.put(Axis.X, Block.box(0, 4, 4, 16, 12, 12)); + SMALL_SHAPES.put(Axis.Y, Block.box(4, 0, 4, 12, 16, 12)); + SMALL_SHAPES.put(Axis.Z, Block.box(4, 4, 0, 12, 12, 16)); + + BIG_SHAPES_OPEN.put(Direction.UP, Block.box(2, 0, 2, 14, 14, 14)); + BIG_SHAPES_OPEN.put(Direction.DOWN, Block.box(2, 2, 2, 14, 16, 14)); + BIG_SHAPES_OPEN.put(Direction.NORTH, Block.box(2, 2, 2, 14, 14, 16)); + BIG_SHAPES_OPEN.put(Direction.SOUTH, Block.box(2, 2, 0, 14, 14, 14)); + BIG_SHAPES_OPEN.put(Direction.WEST, Block.box(2, 2, 2, 16, 14, 14)); + BIG_SHAPES_OPEN.put(Direction.EAST, Block.box(0, 2, 2, 14, 14, 14)); + + MEDIUM_SHAPES_OPEN.put(Direction.UP, Block.box(3, 0, 3, 13, 13, 13)); + MEDIUM_SHAPES_OPEN.put(Direction.DOWN, Block.box(3, 3, 3, 13, 16, 13)); + MEDIUM_SHAPES_OPEN.put(Direction.NORTH, Block.box(3, 3, 3, 13, 13, 16)); + MEDIUM_SHAPES_OPEN.put(Direction.SOUTH, Block.box(3, 3, 0, 13, 13, 13)); + MEDIUM_SHAPES_OPEN.put(Direction.WEST, Block.box(3, 3, 3, 16, 13, 13)); + MEDIUM_SHAPES_OPEN.put(Direction.EAST, Block.box(0, 3, 3, 13, 13, 13)); + + SMALL_SHAPES_OPEN.put(Direction.UP, Block.box(4, 0, 4, 12, 12, 12)); + SMALL_SHAPES_OPEN.put(Direction.DOWN, Block.box(4, 4, 4, 12, 16, 12)); + SMALL_SHAPES_OPEN.put(Direction.NORTH, Block.box(4, 4, 4, 12, 12, 16)); + SMALL_SHAPES_OPEN.put(Direction.SOUTH, Block.box(4, 4, 0, 12, 12, 12)); + SMALL_SHAPES_OPEN.put(Direction.WEST, Block.box(4, 4, 4, 16, 12, 12)); + SMALL_SHAPES_OPEN.put(Direction.EAST, Block.box(0, 4, 4, 12, 12, 12)); + } +} diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 44a7f7b5..21a62209 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -205,7 +205,10 @@ public class EndBlocks { public static final Block AMARANITA_FUR = registerBlock("amaranita_fur", new FurBlock(MOSSY_GLOWSHROOM_SAPLING, 15, 4, true)); public static final Block AMARANITA_CAP = registerBlock("amaranita_cap", new AmaranitaCapBlock()); - public static final Block NEON_CACTUS = registerBlock("neon_cactus", new NeonCactusBlock()); + public static final Block NEON_CACTUS = registerBlock("neon_cactus", new NeonCactusPlantBlock()); + public static final Block NEON_CACTUS_BLOCK = registerBlock("neon_cactus_block", new NeonCactusBlock()); + public static final Block NEON_CACTUS_BLOCK_STAIRS = registerBlock("neon_cactus_stairs", new EndStairsBlock(NEON_CACTUS_BLOCK)); + public static final Block NEON_CACTUS_BLOCK_SLAB = registerBlock("neon_cactus_slab", new EndSlabBlock(NEON_CACTUS_BLOCK)); // Crops public static final Block SHADOW_BERRY = registerBlock("shadow_berry", new ShadowBerryBlock()); diff --git a/src/main/java/ru/betterend/world/features/NeonCactusFeature.java b/src/main/java/ru/betterend/world/features/NeonCactusFeature.java index 2accf7f3..a4bfcd80 100644 --- a/src/main/java/ru/betterend/world/features/NeonCactusFeature.java +++ b/src/main/java/ru/betterend/world/features/NeonCactusFeature.java @@ -3,95 +3,24 @@ package ru.betterend.world.features; import java.util.Random; import net.minecraft.core.BlockPos; -import net.minecraft.core.BlockPos.MutableBlockPos; -import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import ru.betterend.blocks.BlockProperties; -import ru.betterend.blocks.BlockProperties.CactusBottom; -import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.blocks.NeonCactusPlantBlock; import ru.betterend.registry.EndBlocks; -import ru.betterend.util.BlocksHelper; -import ru.betterend.util.MHelper; public class NeonCactusFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).is(EndBlocks.ENDSTONE_DUST)) { + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { + BlockState ground = world.getBlockState(pos.below()); + if (!ground.is(EndBlocks.ENDSTONE_DUST) && !ground.is(EndBlocks.END_MOSS)) { return false; } - - int h = MHelper.randRange(5, 20, random); - MutableBlockPos mut = new MutableBlockPos().set(pos); - Direction hor = BlocksHelper.randomHorizontal(random); - for (int i = 0; i < h; i++) { - if (!world.getBlockState(mut).getMaterial().isReplaceable()) { - break; - } - int size = (h - i) >> 2; - BlockState state = EndBlocks.NEON_CACTUS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, getBySize(size)).setValue(BlockStateProperties.FACING, Direction.UP); - if (i == 0) { - BlockState down = world.getBlockState(mut.below()); - if (down.is(Blocks.END_STONE) || down.is(EndBlocks.ENDSTONE_DUST)) { - state = state.setValue(BlockProperties.CACTUS_BOTTOM, CactusBottom.SAND); - } - else if (down.is(EndBlocks.END_MOSS)) { - state = state.setValue(BlockProperties.CACTUS_BOTTOM, CactusBottom.MOSS); - } - else { - state = state.setValue(BlockProperties.CACTUS_BOTTOM, CactusBottom.EMPTY); - } - } - else { - state = state.setValue(BlockProperties.CACTUS_BOTTOM, CactusBottom.EMPTY); - } - BlocksHelper.setWithUpdate(world, mut, state); - if (i > 2 && i < (h - 1) && random.nextBoolean()) { - int length = h - i - MHelper.randRange(1, 2, random); - if (length > 0) { - Direction dir2 = hor; - hor = hor.getClockWise(); - int bsize = i > ((h << 1) / 3) ? 0 : size > 1 ? 1 : size; - branch(world, mut.relative(dir2), dir2, random, length, bsize); - } - } - mut.move(Direction.UP); - } + + NeonCactusPlantBlock cactus = ((NeonCactusPlantBlock) EndBlocks.NEON_CACTUS); + cactus.growPlant(world, pos, random); return true; } - - private void branch(WorldGenLevel world, BlockPos pos, Direction dir, Random random, int length, int size) { - int rotIndex = length >> 2; - MutableBlockPos mut = new MutableBlockPos().set(pos); - Direction hor = BlocksHelper.randomHorizontal(random); - for (int i = 0; i < length; i++) { - if (!world.getBlockState(mut).getMaterial().isReplaceable()) { - return; - } - BlocksHelper.setWithUpdate(world, mut, - EndBlocks.NEON_CACTUS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, getBySize(size)) - .setValue(BlockStateProperties.FACING, dir)); - if (i == rotIndex) { - dir = Direction.UP; - size--; - } - if (i > 1 && i < (length - 1) && random.nextBoolean()) { - Direction dir2 = dir == Direction.UP ? hor : Direction.UP; - hor = hor.getClockWise(); - branch(world, mut.relative(dir2), dir2, random, MHelper.randRange(length / 4, length / 2, random), - size > 0 ? size - 1 : size); - } - mut.move(dir); - } - } - - private TripleShape getBySize(int size) { - return size < 1 ? TripleShape.TOP : size == 1 ? TripleShape.MIDDLE : TripleShape.BOTTOM; - } } diff --git a/src/main/resources/assets/betterend/blockstates/neon_cactus_slab.json b/src/main/resources/assets/betterend/blockstates/neon_cactus_slab.json new file mode 100644 index 00000000..bdfc0157 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/neon_cactus_slab.json @@ -0,0 +1,15 @@ +{ + "variants": { + "type=bottom": { + "model": "betterend:block/neon_cactus_slab" + }, + "type=top": { + "model": "betterend:block/neon_cactus_slab", + "x": 180, + "uvlock": true + }, + "type=double": { + "model": "betterend:block/neon_cactus_block" + } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/neon_cactus_stairs.json b/src/main/resources/assets/betterend/blockstates/neon_cactus_stairs.json new file mode 100644 index 00000000..edc5a3a5 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/neon_cactus_stairs.json @@ -0,0 +1,44 @@ +{ + "variants": { + "facing=east,half=bottom,shape=straight": { "model": "betterend:block/neon_cactus_stairs" }, + "facing=west,half=bottom,shape=straight": { "model": "betterend:block/neon_cactus_stairs", "y": 180 }, + "facing=south,half=bottom,shape=straight": { "model": "betterend:block/neon_cactus_stairs", "y": 90 }, + "facing=north,half=bottom,shape=straight": { "model": "betterend:block/neon_cactus_stairs", "y": 270 }, + "facing=east,half=bottom,shape=outer_right": { "model": "betterend:block/neon_cactus_stairs_outer" }, + "facing=west,half=bottom,shape=outer_right": { "model": "betterend:block/neon_cactus_stairs_outer", "y": 180 }, + "facing=south,half=bottom,shape=outer_right": { "model": "betterend:block/neon_cactus_stairs_outer", "y": 90 }, + "facing=north,half=bottom,shape=outer_right": { "model": "betterend:block/neon_cactus_stairs_outer", "y": 270 }, + "facing=east,half=bottom,shape=outer_left": { "model": "betterend:block/neon_cactus_stairs_outer", "y": 270 }, + "facing=west,half=bottom,shape=outer_left": { "model": "betterend:block/neon_cactus_stairs_outer", "y": 90 }, + "facing=south,half=bottom,shape=outer_left": { "model": "betterend:block/neon_cactus_stairs_outer" }, + "facing=north,half=bottom,shape=outer_left": { "model": "betterend:block/neon_cactus_stairs_outer", "y": 180 }, + "facing=east,half=bottom,shape=inner_right": { "model": "betterend:block/neon_cactus_stairs_inner" }, + "facing=west,half=bottom,shape=inner_right": { "model": "betterend:block/neon_cactus_stairs_inner", "y": 180 }, + "facing=south,half=bottom,shape=inner_right": { "model": "betterend:block/neon_cactus_stairs_inner", "y": 90 }, + "facing=north,half=bottom,shape=inner_right": { "model": "betterend:block/neon_cactus_stairs_inner", "y": 270 }, + "facing=east,half=bottom,shape=inner_left": { "model": "betterend:block/neon_cactus_stairs_inner", "y": 270 }, + "facing=west,half=bottom,shape=inner_left": { "model": "betterend:block/neon_cactus_stairs_inner", "y": 90 }, + "facing=south,half=bottom,shape=inner_left": { "model": "betterend:block/neon_cactus_stairs_inner" }, + "facing=north,half=bottom,shape=inner_left": { "model": "betterend:block/neon_cactus_stairs_inner", "y": 180 }, + "facing=east,half=top,shape=straight": { "model": "betterend:block/neon_cactus_stairs", "x": 180 }, + "facing=west,half=top,shape=straight": { "model": "betterend:block/neon_cactus_stairs", "x": 180, "y": 180 }, + "facing=south,half=top,shape=straight": { "model": "betterend:block/neon_cactus_stairs", "x": 180, "y": 90 }, + "facing=north,half=top,shape=straight": { "model": "betterend:block/neon_cactus_stairs", "x": 180, "y": 270 }, + "facing=east,half=top,shape=outer_right": { "model": "betterend:block/neon_cactus_stairs_outer", "x": 180, "y": 90 }, + "facing=west,half=top,shape=outer_right": { "model": "betterend:block/neon_cactus_stairs_outer", "x": 180, "y": 270 }, + "facing=south,half=top,shape=outer_right": { "model": "betterend:block/neon_cactus_stairs_outer", "x": 180, "y": 180 }, + "facing=north,half=top,shape=outer_right": { "model": "betterend:block/neon_cactus_stairs_outer", "x": 180 }, + "facing=east,half=top,shape=outer_left": { "model": "betterend:block/neon_cactus_stairs_outer", "x": 180 }, + "facing=west,half=top,shape=outer_left": { "model": "betterend:block/neon_cactus_stairs_outer", "x": 180, "y": 180 }, + "facing=south,half=top,shape=outer_left": { "model": "betterend:block/neon_cactus_stairs_outer", "x": 180, "y": 90 }, + "facing=north,half=top,shape=outer_left": { "model": "betterend:block/neon_cactus_stairs_outer", "x": 180, "y": 270 }, + "facing=east,half=top,shape=inner_right": { "model": "betterend:block/neon_cactus_stairs_inner", "x": 180, "y": 90 }, + "facing=west,half=top,shape=inner_right": { "model": "betterend:block/neon_cactus_stairs_inner", "x": 180, "y": 270 }, + "facing=south,half=top,shape=inner_right": { "model": "betterend:block/neon_cactus_stairs_inner", "x": 180, "y": 180 }, + "facing=north,half=top,shape=inner_right": { "model": "betterend:block/neon_cactus_stairs_inner", "x": 180 }, + "facing=east,half=top,shape=inner_left": { "model": "betterend:block/neon_cactus_stairs_inner", "x": 180 }, + "facing=west,half=top,shape=inner_left": { "model": "betterend:block/neon_cactus_stairs_inner", "x": 180, "y": 180 }, + "facing=south,half=top,shape=inner_left": { "model": "betterend:block/neon_cactus_stairs_inner", "x": 180, "y": 90 }, + "facing=north,half=top,shape=inner_left": { "model": "betterend:block/neon_cactus_stairs_inner", "x": 180, "y": 270 } + } +} diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_slab.json b/src/main/resources/assets/betterend/models/block/neon_cactus_slab.json new file mode 100644 index 00000000..22fb196b --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_slab.json @@ -0,0 +1,8 @@ +{ + "parent": "block/slab", + "textures": { + "bottom": "betterend:block/neon_cactus_block_top", + "top": "betterend:block/neon_cactus_block_top", + "side": "betterend:block/neon_cactus_block_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_stairs.json b/src/main/resources/assets/betterend/models/block/neon_cactus_stairs.json new file mode 100644 index 00000000..0a0df2b2 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "betterend:block/neon_cactus_block_top", + "top": "betterend:block/neon_cactus_block_top", + "side": "betterend:block/neon_cactus_block_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_inner.json b/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_inner.json new file mode 100644 index 00000000..78d80cc5 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "betterend:block/neon_cactus_block_top", + "top": "betterend:block/neon_cactus_block_top", + "side": "betterend:block/neon_cactus_block_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_outer.json b/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_outer.json new file mode 100644 index 00000000..01f12961 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "betterend:block/neon_cactus_block_top", + "top": "betterend:block/neon_cactus_block_top", + "side": "betterend:block/neon_cactus_block_side" + } +} diff --git a/src/main/resources/assets/betterend/models/item/neon_cactus_slab.json b/src/main/resources/assets/betterend/models/item/neon_cactus_slab.json new file mode 100644 index 00000000..7bfe894c --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/neon_cactus_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/neon_cactus_slab" +} diff --git a/src/main/resources/assets/betterend/models/item/neon_cactus_stairs.json b/src/main/resources/assets/betterend/models/item/neon_cactus_stairs.json new file mode 100644 index 00000000..22cab921 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/neon_cactus_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/neon_cactus_stairs" +} From 6d7e0b47194483314579f8db57dcad67bbef95a6 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 28 Apr 2021 01:23:11 +0300 Subject: [PATCH 450/463] Recipes & translation (German by mariokirby1703) --- .../ru/betterend/recipe/CraftingRecipes.java | 4 + .../assets/betterend/lang/de_de.json | 698 ++++++++++++++++++ .../assets/betterend/lang/en_us.json | 6 +- .../assets/betterend/lang/ru_ru.json | 6 +- 4 files changed, 712 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/assets/betterend/lang/de_de.json diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index 4b894a6b..a62e00d9 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -193,6 +193,10 @@ public class CraftingRecipes { GridRecipe.make("silk_moth_hive", EndBlocks.SILK_MOTH_HIVE).setShape("#L#", "LML", "#L#").addMaterial('#', EndBlocks.TENANEA.planks).addMaterial('L', EndBlocks.TENANEA_LEAVES).addMaterial('M', EndItems.SILK_MOTH_MATRIX).build(); GridRecipe.make("cave_pumpkin_pie", EndItems.CAVE_PUMPKIN_PIE).setShape(" B ", "BPB", " B ").addMaterial('P', EndBlocks.CAVE_PUMPKIN).addMaterial('B', EndItems.BLOSSOM_BERRY, EndItems.SHADOW_BERRY_RAW).build(); GridRecipe.make("cave_pumpkin_seeds", EndBlocks.CAVE_PUMPKIN_SEED).setOutputCount(4).setList("#").addMaterial('#', EndBlocks.CAVE_PUMPKIN).build(); + + GridRecipe.make("neon_cactus_block", EndBlocks.NEON_CACTUS_BLOCK).setShape("##", "##").addMaterial('#', EndBlocks.NEON_CACTUS).build(); + GridRecipe.make("neon_cactus_block_slab", EndBlocks.NEON_CACTUS_BLOCK_SLAB).setShape("###").setOutputCount(6).addMaterial('#', EndBlocks.NEON_CACTUS_BLOCK).build(); + GridRecipe.make("neon_cactus_block_stairs", EndBlocks.NEON_CACTUS_BLOCK_STAIRS).setShape("# ", "## ", "###").setOutputCount(4).addMaterial('#', EndBlocks.NEON_CACTUS_BLOCK).build(); } private static void registerLantern(String name, Block lantern, Block slab) { diff --git a/src/main/resources/assets/betterend/lang/de_de.json b/src/main/resources/assets/betterend/lang/de_de.json new file mode 100644 index 00000000..7341d5c0 --- /dev/null +++ b/src/main/resources/assets/betterend/lang/de_de.json @@ -0,0 +1,698 @@ +{ + "itemGroup.betterend.end_items": "Better End: Items", + "itemGroup.betterend.end_blocks": "Better End: Blöcke", + + "item.betterend.guidebook": "Das Ende für Idioten", + "book.betterend.landing": "Eine kurze Anleitung zum Überleben unter den extremen Bedingungen im End.", + "book.betterend.subtitle": "Überlebe im End", + + "category.rei.damage.amount&dmg": "Werkzeugschaden: %s", + "category.rei.infusion.time&val": "Zeit: %s", + + "biome.betterend.foggy_mushroomland": "Nebeliges Pilzland", + "biome.betterend.dust_wastelands": "Staubiges Ödland", + "biome.betterend.chorus_forest": "Choruswald", + "biome.betterend.megalake": "Riesensee", + "biome.betterend.crystal_mountains": "Kristallberge", + + "entity.betterend.dragonfly": "Libelle", + "item.betterend.spawn_egg_dragonfly": "Libellen-Spawn-Ei", + + "entity.betterend.end_slime": "Endschleim", + "item.betterend.spawn_egg_end_slime": "Endschleim-Spawn-Ei", + + "block.betterend.end_mycelium": "End-Myzel", + "block.betterend.end_moss": "End-Moos", + "block.betterend.endstone_dust": "Endsteinstaub", + + "block.betterend.end_mycelium_path": "End-Myzelpfad", + "block.betterend.end_moss_path": "End-Moospfad", + + "block.betterend.ender_ore": "Endererz", + "block.betterend.terminite_block": "Terminitblock", + "block.betterend.aeternium_block": "Ätherblock", + "block.betterend.ender_block": "Enderblock", + "block.betterend.end_stone_smelter": "Endsteinschmelzofen", + + "item.betterend.ender_dust": "Enderstaub", + "item.betterend.ender_shard": "Enderscherbe", + "item.betterend.terminite_ingot": "Terminitbarren", + "item.betterend.aeternium_ingot": "Ätherbarren", + "item.betterend.terminite_helmet": "Terminithelm", + "item.betterend.terminite_chestplate": "Terminitharnisch", + "item.betterend.terminite_leggings": "Terminitbeinschutz", + "item.betterend.terminite_boots": "Terminitstiefel", + "item.betterend.terminite_shovel": "Terminitschaufel", + "item.betterend.terminite_sword": "Terminitschwert", + "item.betterend.terminite_pickaxe": "Terminitspitzhacke", + "item.betterend.terminite_axe": "Terminitaxt", + "item.betterend.terminite_hoe": "Terminithacke", + "item.betterend.terminite_hammer": "Terminitschmiedehammer", + "item.betterend.aeternium_helmet": "Ätherhelm", + "item.betterend.aeternium_chestplate": "Ätherharnisch", + "item.betterend.aeternium_leggings": "Ätherbeinschutz", + "item.betterend.aeternium_boots": "Ätherstiefel", + "item.betterend.aeternium_shovel": "Ätherschaufel", + "item.betterend.aeternium_sword": "Ätherschwert", + "item.betterend.aeternium_pickaxe": "Ätherspitzhacke", + "item.betterend.aeternium_axe": "Ätheraxt", + "item.betterend.aeternium_hoe": "Ätherhacke", + "item.betterend.aeternium_hammer": "Ätherschmiedehammer", + "item.betterend.iron_hammer": "Eisenschmiedehammer", + "item.betterend.golden_hammer": "Goldschmiedehammer", + "item.betterend.diamond_hammer": "Diamantschmiedehammer", + "item.betterend.netherite_hammer": "Netheritschmiedehammer", + "item.betterend.crystalite_boots": "Kristallitstiefel", + "item.betterend.crystalite_chestplate": "Kristallitharnisch", + "item.betterend.crystalite_helmet": "Kristallithelm", + "item.betterend.crystalite_leggings": "Kristallitbeinschutz", + "item.betterend.aeternium_axe_head": "Ätheraxtkopf", + "item.betterend.aeternium_hammer_head": "Ätherhammerkopf", + "item.betterend.aeternium_hoe_head": "Ätherhackenkopf", + "item.betterend.aeternium_pickaxe_head": "Ätherspitzhackenkopf", + "item.betterend.aeternium_shovel_head": "Ätherschaufelkopf", + "item.betterend.aeternium_sword_blade": "Ätherschwertklinge", + "item.betterend.aeternium_sword_handle": "Ätherschwertgriff", + "item.betterend.leather_stripe": "Lederband", + "item.betterend.leather_wrapped_stick": "Leder-umwickelter Stock", + + "effect.betterend.end_veil": "Endschleier", + "enchantment.betterend.end_veil": "Endschleier", + "item.minecraft.potion.effect.end_veil": "Trank des Endschleiers", + "item.minecraft.potion.effect.long_end_veil": "Trank des Endschleiers", + "item.minecraft.splash_potion.effect.end_veil": "Wurftrank des Endschleiers", + "item.minecraft.splash_potion.effect.long_end_veil": "Wurftrank des Endschleiers", + "item.minecraft.lingering_potion.effect.end_veil": "Verweiltrank des Endschleiers", + "item.minecraft.lingering_potion.effect.long_end_veil": "Verweiltrank des Endschleiers", + "item.minecraft.tipped_arrow.effect.end_veil": "Pfeil des Endschleiers", + "item.minecraft.tipped_arrow.effect.long_end_veil": "Pfeil des Endschleiers", + + "block.betterend.mossy_glowshroom_sapling": "Bemooster Glühpilzsetzling", + "block.betterend.mossy_glowshroom_cap": "Bemooste Glühpilzkappe", + "block.betterend.mossy_glowshroom_fur": "Bemoostes Glühpilzfell", + "block.betterend.mossy_glowshroom_hymenophore": "Bemoostes Glühpilzhymenophor", + "block.betterend.mossy_glowshroom_bark": "Bemoostes Glühpilzholz", + "block.betterend.mossy_glowshroom_barrel": "Bemoostes Glühpilzfass", + "block.betterend.mossy_glowshroom_button": "Bemooster Glühpilzknopf", + "block.betterend.mossy_glowshroom_chest": "Bemooste Glühpilztruhe", + "block.betterend.mossy_glowshroom_crafting_table": "Bemooste Glühpilzwerkbank", + "block.betterend.mossy_glowshroom_door": "Bemooste Glühpilztür", + "block.betterend.mossy_glowshroom_fence": "Bemooster Glühpilzzaun", + "block.betterend.mossy_glowshroom_gate": "Bemoostes Glühpilzzauntor", + "block.betterend.mossy_glowshroom_ladder": "Bemooste Glühpilzleiter", + "block.betterend.mossy_glowshroom_log": "Bemooster Glühpilzstamm", + "block.betterend.mossy_glowshroom_planks": "Bemooste Glühpilzbretter", + "block.betterend.mossy_glowshroom_plate": "Bemooste Glühpilzdruckplatte", + "block.betterend.mossy_glowshroom_sign": "Bemoostes Glühpilzschild", + "block.betterend.mossy_glowshroom_slab": "Bemooste Glühpilzstufe", + "block.betterend.mossy_glowshroom_stairs": "Bemooste Glühpilztreppe", + "block.betterend.mossy_glowshroom_stripped_bark": "Entrindetes bemoostes Glühpilzholz", + "block.betterend.mossy_glowshroom_stripped_log": "Entrindeter bemooster Glühpilzstamm", + "block.betterend.mossy_glowshroom_trapdoor": "Bemooste Glühpilzfalltür", + + "block.betterend.umbrella_moss": "Schirmmoos", + "block.betterend.umbrella_moss_tall": "Großes Schirmmoos", + "block.betterend.creeping_moss": "Kriechendes Moos", + + "block.betterend.blue_vine_seed": "Blaurankensamen", + "block.betterend.blue_vine": "Blauranke", + "block.betterend.blue_vine_lantern": "Blaurankenlaterne", + "block.betterend.blue_vine_fur": "Blaurankenfell", + + "block.betterend.dense_vine": "Dichte Ranke", + "block.betterend.bubble_coral": "Blasenkoralle", + "block.betterend.aurora_crystal": "Aurorakristall", + "item.betterend.crystal_shards": "Kristallscherben", + + "block.betterend.pythadendron_sapling": "Pythadendronsetzling", + "block.betterend.pythadendron_bark": "Pythadendronholz", + "block.betterend.pythadendron_barrel": "Pythadendronfass", + "block.betterend.pythadendron_button": "Pythadendronknopf", + "block.betterend.pythadendron_chest": "Pythadendrontruhe", + "block.betterend.pythadendron_crafting_table": "Pythadendronwerkbank", + "block.betterend.pythadendron_door": "Pythadendrontür", + "block.betterend.pythadendron_fence": "Pythadendronzaun", + "block.betterend.pythadendron_gate": "Pythadendronzauntor", + "block.betterend.pythadendron_ladder": "Pythadendronleiter", + "block.betterend.pythadendron_log": "Pythadendronstamm", + "block.betterend.pythadendron_planks": "Pythadendronbretter", + "block.betterend.pythadendron_plate": "Pythadendrondruckplatte", + "block.betterend.pythadendron_sign": "Pythadendronschild", + "block.betterend.pythadendron_slab": "Pythadendronstufe", + "block.betterend.pythadendron_stairs": "Pythadendrontreppe", + "block.betterend.pythadendron_stripped_bark": "Entrindetes Pythadendronholz", + "block.betterend.pythadendron_stripped_log": "Entrindeter Pythadendronstamm", + "block.betterend.pythadendron_trapdoor": "Pythadendronfalltür", + + "block.betterend.chorus_nylium": "Chorus-Nezel", + "block.betterend.chorus_nylium_path": "Chorus-Nezelpfad", + "block.betterend.chorus_grass": "Chorusgras", + + "block.betterend.end_lily": "Endlilie", + "block.betterend.end_lily_seed": "Endliliensamen", + "item.betterend.end_lily_leaf": "Endlilienblatt", + "item.betterend.end_lily_leaf_dried": "Trockenes Endlilienblatt", + + "block.betterend.violecite": "Violezit", + "block.betterend.violecite_bricks": "Violezitziegel", + "block.betterend.violecite_bricks_slab": "Violezitziegelstufe", + "block.betterend.violecite_bricks_stairs": "Violezitziegeltreppe", + "block.betterend.violecite_bricks_wall": "Violezitziegelmauer", + "block.betterend.violecite_button": "Violezitknopf", + "block.betterend.violecite_pillar": "Violezitsäule", + "block.betterend.violecite_plate": "Violezitdruckplatte", + "block.betterend.violecite_slab": "Violezitstufe", + "block.betterend.violecite_tiles": "Violezitfliesen", + "block.betterend.violecite_stairs": "Violezittreppe", + "block.betterend.violecite_polished": "Polierter Violezit", + "block.betterend.violecite_wall": "Violezitmauer", + "block.betterend.violecite_pedestal": "Violezitsockel", + + "block.betterend.flavolite": "Flavolit", + "block.betterend.flavolite_bricks": "Flavolitziegel", + "block.betterend.flavolite_bricks_slab": "Flavolitziegelstufe", + "block.betterend.flavolite_bricks_stairs": "Flavolitziegeltreppe", + "block.betterend.flavolite_bricks_wall": "Flavolitziegelmauer", + "block.betterend.flavolite_button": "Flavolitknopf", + "block.betterend.flavolite_pillar": "Flavolitsäule", + "block.betterend.flavolite_plate": "Flavolitdruckplatte", + "block.betterend.flavolite_slab": "Flavolitstufe", + "block.betterend.flavolite_tiles": "Flavolitfliesen", + "block.betterend.flavolite_stairs": "Flavolittreppe", + "block.betterend.flavolite_polished": "Polierter Flavolit", + "block.betterend.flavolite_wall": "Flavolitmauer", + "block.betterend.flavolite_pedestal": "Flavolitsockel", + + "block.betterend.andesite_pedestal": "Andesitsockel", + "block.betterend.diorite_pedestal": "Dioritsockel", + "block.betterend.granite_pedestal": "Granitsockel", + "block.betterend.purpur_pedestal": "Purpursockel", + "block.betterend.quartz_pedestal": "Quarzsockel", + "block.betterend.infusion_pedestal": "Infusionssockel", + + "block.betterend.end_lotus_seed": "Endlotussamen", + "block.betterend.end_lotus_stem": "Endlotusstamm", + "block.betterend.end_lotus_leaf": "Endlotusblatt", + "block.betterend.end_lotus_flower": "Endlotusblume", + + "block.betterend.end_lotus_bark": "Endlotusholz", + "block.betterend.end_lotus_barrel": "Endlotusfass", + "block.betterend.end_lotus_button": "Endlotusknopf", + "block.betterend.end_lotus_chest": "Endlotustruhe", + "block.betterend.end_lotus_crafting_table": "Endlotuswerkbank", + "block.betterend.end_lotus_door": "Endlotustür", + "block.betterend.end_lotus_fence": "Endlotuszaun", + "block.betterend.end_lotus_gate": "Endlotuszauntor", + "block.betterend.end_lotus_ladder": "Endlotusleiter", + "block.betterend.end_lotus_log": "Endlotusstamm", + "block.betterend.end_lotus_planks": "Endlotusbretter", + "block.betterend.end_lotus_plate": "Endlotusdruckplatte", + "block.betterend.end_lotus_sign": "Endlotusschild", + "block.betterend.end_lotus_slab": "Endlotusstufe", + "block.betterend.end_lotus_stairs": "Endlotustreppe", + "block.betterend.end_lotus_stripped_bark": "Entrindetes Endlotusholz", + "block.betterend.end_lotus_stripped_log": "Entrindeter Endlotusstamm", + "block.betterend.end_lotus_trapdoor": "Endlotusfalltür", + + "block.betterend.cave_moss": "Höhlenmoos", + "block.betterend.cave_grass": "Höhlengras", + "block.betterend.cave_bush": "Höhlenbusch", + + "block.betterend.cave_moss_path": "Höhlenmoospfad", + "block.betterend.crystal_moss": "Kristallmoos", + "block.betterend.crystal_moss_path": "Kristallmoospfad", + "block.betterend.pythadendron_leaves": "Pythadendronlaub", + "item.betterend.spawn_egg_end_fish": "Endfisch-Spawn-Ei", + "block.betterend.crystal_grass": "Kristallgras", + + "block.betterend.flavolite_runed": "Flavolitrune", + "block.betterend.end_portal_block": "Endportal", + "block.betterend.eternal_pedestal": "Ewiges Sockel", + "block.betterend.flavolite_runed_eternal": "Ewige Flavolitrune", + "item.betterend.eternal_crystal": "Ewiger Kristall", + + "block.betterend.lacugrove_bark": "Seemangrovenholz", + "block.betterend.lacugrove_barrel": "Seemangrovenfass", + "block.betterend.lacugrove_button": "Seemangrovenknopf", + "block.betterend.lacugrove_chest": "Seemangroventruhe", + "block.betterend.lacugrove_crafting_table": "Seemangrovenwerkbank", + "block.betterend.lacugrove_door": "Seemangroventür", + "block.betterend.lacugrove_fence": "Seemangrovenzaun", + "block.betterend.lacugrove_gate": "Seemangrovenzauntor", + "block.betterend.lacugrove_ladder": "Seemangrovenleiter", + "block.betterend.lacugrove_log": "Seemangrovenstamm", + "block.betterend.lacugrove_planks": "Seemangrovenbretter", + "block.betterend.lacugrove_plate": "Seemangrovendruckplatte", + "block.betterend.lacugrove_sign": "Seemangrovenschild", + "block.betterend.lacugrove_slab": "Seemangrovenstufe", + "block.betterend.lacugrove_stairs": "Seemangroventreppe", + "block.betterend.lacugrove_stripped_bark": "Entrindetes Seemangrovenholz", + "block.betterend.lacugrove_stripped_log": "Entrindeter Seemangrovenstamm", + "block.betterend.lacugrove_trapdoor": "Seemangrovenfalltür", + + "block.betterend.lacugrove_leaves": "Seemangrovenlaub", + "block.betterend.lacugrove_sapling": "Seemangrovensetzling", + + "biome.betterend.megalake_grove": "Riesenseemangrove", + "biome.betterend.painted_mountains": "Bemalte Berge", + + "block.betterend.dragon_tree_bark": "Drachenbaumholz", + "block.betterend.dragon_tree_barrel": "Drachenbaumfass", + "block.betterend.dragon_tree_button": "Drachenbaumknopf", + "block.betterend.dragon_tree_chest": "Drachenbaumtruhe", + "block.betterend.dragon_tree_crafting_table": "Drachenbaumwerkbank", + "block.betterend.dragon_tree_door": "Drachenbaumtür", + "block.betterend.dragon_tree_fence": "Drachenbaumzaun", + "block.betterend.dragon_tree_gate": "Drachenbaumzauntor", + "block.betterend.dragon_tree_ladder": "Drachenbaumleiter", + "block.betterend.dragon_tree_log": "Drachenbaumstamm", + "block.betterend.dragon_tree_planks": "Drachenbaumbretter", + "block.betterend.dragon_tree_plate": "Drachenbaumdruckplatte", + "block.betterend.dragon_tree_sign": "Drachenbaumschild", + "block.betterend.dragon_tree_slab": "Drachenbaumstufe", + "block.betterend.dragon_tree_stairs": "Drachenbaumtreppe", + "block.betterend.dragon_tree_stripped_bark": "Entrindetes Drachenbaumholz", + "block.betterend.dragon_tree_stripped_log": "Entrindeter Drachenbaumstamm", + "block.betterend.dragon_tree_trapdoor": "Drachenbaumfalltür", + + "biome.betterend.shadow_forest": "Schattenwald", + "block.betterend.dragon_tree_leaves": "Drachenbaumlaub", + "block.betterend.dragon_tree_sapling": "Drachenbaumsetzling", + "block.betterend.shadow_grass": "Schattengras", + "block.betterend.shadow_grass_path": "Schattengraspfad", + "block.betterend.shadow_plant": "Schattenpflanze", + + "block.betterend.dragon_tree_bookshelf": "Drachenbaumbücherregal", + "block.betterend.end_lotus_bookshelf": "Endlotusbücherregal", + "block.betterend.lacugrove_bookshelf": "Seemangrovenbücherregal", + "block.betterend.mossy_glowshroom_bookshelf": "Bemoostes Glühpilzbücherregal", + "block.betterend.pythadendron_bookshelf": "Pythadendronbücherregal", + + "block.betterend.murkweed": "Trübkraut", + "block.betterend.needlegrass": "Nadelgras", + "block.betterend.twisted_vine": "Zwirbelranke", + + "block.betterend.shadow_berry": "Schattenbeersamen", + "item.betterend.shadow_berry_cooked": "Gebratene Schattenbeere", + "item.betterend.shadow_berry_raw": "Schattenbeere", + "block.betterend.purple_polypore": "Violetter Porling", + + "block.betterend.cyan_moss": "Türkises Moos", + "block.betterend.tail_moss": "Schweifmoos", + + "block.betterend.flavolite_lantern": "Flavolitlaterne", + "block.betterend.end_stone_lantern": "Endsteinlaterne", + "block.betterend.violecite_lantern": "Violezitlaterne", + + "entity.betterend.end_fish": "Endfisch", + "entity.betterend.shadow_walker": "Schattenwanderer", + "item.betterend.spawn_egg_shadow_walker": "Schattenwanderer-Spawn-Ei", + + "block.betterend.andesite_lantern": "Andesitlaterne", + "block.betterend.blackstone_lantern": "Schwarzsteinlaterne", + "block.betterend.diorite_lantern": "Dioritlaterne", + "block.betterend.granite_lantern": "Granitlaterne", + "block.betterend.purpur_lantern": "Purpurlaterne", + "block.betterend.quartz_lantern": "Quarzlaterne", + + "item.betterend.bucket_end_fish": "Endfischeimer", + "item.betterend.end_fish_cooked": "Gebratener Endfisch", + "item.betterend.end_fish_raw": "Endfisch", + + "biome.betterend.amber_land": "Bernsteinland", + "biome.betterend.blossoming_spires": "Blühende Türme", + "block.betterend.amber_grass": "Bernsteingras", + "block.betterend.amber_grass_path": "Bernsteingraspfad", + "block.betterend.tenanea_bark": "Tenaneaholz", + "block.betterend.tenanea_barrel": "Tenaneafass", + "block.betterend.tenanea_bookshelf": "Tenaneabücherregal", + "block.betterend.tenanea_button": "Tenaneaknopf", + "block.betterend.tenanea_chest": "Tenaneatruhe", + "block.betterend.tenanea_crafting_table": "Tenaneawerkbank", + "block.betterend.tenanea_door": "Tenaneatür", + "block.betterend.tenanea_fence": "Tenaneazaun", + "block.betterend.tenanea_gate": "Tenaneazauntor", + "block.betterend.tenanea_ladder": "Tenanealeiter", + "block.betterend.tenanea_leaves": "Tenanealaub", + "block.betterend.tenanea_log": "Tenaneastamm", + "block.betterend.tenanea_planks": "Tenaneabretter", + "block.betterend.tenanea_plate": "Tenaneadruckplatte", + "block.betterend.tenanea_sapling": "Tenaneasetzling", + "block.betterend.tenanea_sign": "Tenaneaschild", + "block.betterend.tenanea_slab": "Tenaneastufe", + "block.betterend.tenanea_stairs": "Tenaneatreppe", + "block.betterend.tenanea_stripped_bark": "Entrindetes Tenaneaholz", + "block.betterend.tenanea_stripped_log": "Entrindeter Tenaneastamm", + "block.betterend.tenanea_trapdoor": "Tenaneafalltür", + + "block.betterend.amber_block": "Bernsteinblock", + "block.betterend.amber_ore": "Bernsteinerz", + "item.betterend.amber_gem": "Bernsteinjuwel", + "item.betterend.raw_amber": "Roher Bernstein", + "block.betterend.tenanea_flowers": "Tenaneablumen", + "block.betterend.tenanea_outer_leaves": "Äußeres Tenanealaub", + + "block.betterend.pink_moss": "Pinkes Moos", + "block.betterend.pink_moss_path": "Pinker Moospfad", + + "block.betterend.twisted_moss": "Zwirbelmoos", + + "block.betterend.bulb_vine": "Knollenranke", + "block.betterend.bulb_vine_seed": "Knollenrankensamen", + "item.betterend.glowing_bulb": "Glühende Knolle", + + "block.betterend.iron_bulb_lantern": "Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_black": "Schwarze Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_blue": "Blaue Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_brown": "Braune Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_cyan": "Türkise Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_gray": "Graue Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_green": "Grüne Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_light_blue": "Hellblaue Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_light_gray": "Hellgraue Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_lime": "Hellgrüne Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_magenta": "Magenta Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_orange": "Orangene Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_pink": "Pinke Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_purple": "Violette Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_red": "Rote Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_white": "Weiße Eisenknollenlaterne", + "block.betterend.iron_bulb_lantern_yellow": "Gelbe Eisenknollenlaterne", + + "block.betterend.gold_bulb_lantern": "Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_black": "Schwarze Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_blue": "Blaue Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_brown": "Braune Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_cyan": "Türkise Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_gray": "Graue Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_green": "Grüne Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_light_blue": "Hellblaue Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_light_gray": "Hellgraue Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_lime": "Hellgrüne Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_magenta": "Magenta Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_orange": "Orangene Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_pink": "Pinke Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_purple": "Violette Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_red": "Rote Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_white": "Weiße Goldknollenlaterne", + "block.betterend.gold_bulb_lantern_yellow": "Gelbe Goldknollenlaterne", + + "block.betterend.thallasium_bulb_lantern": "Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_black": "Schwarze Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_blue": "Blaue Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_brown": "Braune Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_cyan": "Türkise Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_gray": "Graue Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_green": "Grüne Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_light_blue": "Hellblaue Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_light_gray": "Hellgraue Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_lime": "Hellgrüne Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_magenta": "Magenta Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_orange": "Orangene Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_pink": "Pinke Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_purple": "Violette Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_red": "Rote Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_white": "Weiße Thallasiumknollenlaterne", + "block.betterend.thallasium_bulb_lantern_yellow": "Gelbe Thallasiumknollenlaterne", + + "block.betterend.bushy_grass": "Buschiges Gras", + + "block.betterend.brimstone": "Schwefelrandstein", + "block.betterend.sulphuric_rock": "Schwefelgestein", + "block.betterend.sulphuric_rock_bricks": "Schwefelsteinziegel", + "block.betterend.sulphuric_rock_bricks_slab": "Schwefelsteinziegelstufe", + "block.betterend.sulphuric_rock_bricks_stairs": "Schwefelsteinziegeltreppe", + "block.betterend.sulphuric_rock_bricks_wall": "Schwefelsteinziegelmauer", + "block.betterend.sulphuric_rock_button": "Schwefelsteinknopf", + "block.betterend.sulphuric_rock_lantern": "Schwefelsteinlaterne", + "block.betterend.sulphuric_rock_pedestal": "Schwefelsteinsockel", + "block.betterend.sulphuric_rock_pillar": "Schwefelsteinsäule", + "block.betterend.sulphuric_rock_plate": "Schwefelsteindruckplatte", + "block.betterend.sulphuric_rock_polished": "Poliertes Schwefelgestein", + "block.betterend.sulphuric_rock_slab": "Schwefelsteinstufe", + "block.betterend.sulphuric_rock_stairs": "Schwefelsteintreppe", + "block.betterend.sulphuric_rock_tiles": "Schwefelsteinfliesen", + "block.betterend.sulphuric_rock_wall": "Schwefelsteinmauer", + "block.betterend.sulphur_crystal": "Schwefelkristall", + "item.betterend.crystalline_sulphur": "Schwefel", + + "biome.betterend.sulphur_springs": "Schwefelquellen", + "block.betterend.hydralux_petal_block": "Hydraluxblüttenblattblock", + "block.betterend.hydralux_petal_block_black": "Schwarzer Blüttenblattblock", + "block.betterend.hydralux_petal_block_blue": "Blauer Blüttenblattblock", + "block.betterend.hydralux_petal_block_brown": "Brauner Blüttenblattblock", + "block.betterend.hydralux_petal_block_cyan": "Türkiser Blüttenblattblock", + "block.betterend.hydralux_petal_block_gray": "Grauer Blüttenblattblock", + "block.betterend.hydralux_petal_block_green": "Grüner Blüttenblattblock", + "block.betterend.hydralux_petal_block_light_blue": "Hellblauer Blüttenblattblock", + "block.betterend.hydralux_petal_block_light_gray": "Hellgrauer Blüttenblattblock", + "block.betterend.hydralux_petal_block_lime": "Hellgrüner Blüttenblattblock", + "block.betterend.hydralux_petal_block_magenta": "Magenta Blüttenblattblock", + "block.betterend.hydralux_petal_block_orange": "Orangener Blüttenblattblock", + "block.betterend.hydralux_petal_block_pink": "Pinker Blüttenblattblock", + "block.betterend.hydralux_petal_block_purple": "Violetter Blüttenblattblock", + "block.betterend.hydralux_petal_block_red": "Roter Blüttenblattblock", + "block.betterend.hydralux_petal_block_white": "Weißer Blüttenblattblock", + "block.betterend.hydralux_petal_block_yellow": "Gelber Blüttenblattblock", + "block.betterend.hydralux_sapling": "Hydraluxsetzling", + "block.betterend.hydrothermal_vent": "Hydrothermalquelle", + "item.betterend.hydralux_petal": "Hydraluxblütenblatt", + "item.betterend.enchanted_petal": "Verzaubertes Blütenblatt", + + "block.betterend.menger_sponge": "Mengerschwamm", + "block.betterend.menger_sponge_wet": "Nasser Mengerschwamm", + "block.betterend.tube_worm": "Röhrenwurm", + + "block.betterend.charnia_cyan": "Türkises Charnia", + "block.betterend.charnia_light_blue": "Hellblaues Charnia", + "block.betterend.charnia_orange": "Orangenes Charnia", + "block.betterend.charnia_purple": "Violettes Charnia", + "block.betterend.charnia_red": "Rotes Charnia", + + "entity.betterend.cubozoa": "Cubozoa", + "item.betterend.spawn_egg_cubozoa": "Cubozoa-Spawn-Ei", + + "item.betterend.gelatine": "Gelatine", + "item.betterend.sweet_berry_jelly": "Süßbeerengelee", + "item.betterend.shadow_berry_jelly": "Schwarzbeerengelee", + + "block.betterend.amber_moss": "Bernsteinmoos", + "block.betterend.amber_moss_path": "Bernsteinmoospfad", + "block.betterend.helix_tree_bark": "Spiralbaumholz", + "block.betterend.helix_tree_barrel": "Spiralbaumfass", + "block.betterend.helix_tree_bookshelf": "Spiralbaumbücherregal", + "block.betterend.helix_tree_button": "Spiralbaumknopf", + "block.betterend.helix_tree_chest": "Spiralbaumtruhe", + "block.betterend.helix_tree_crafting_table": "Spiralbaumwerkbank", + "block.betterend.helix_tree_door": "Spiralbaumtür", + "block.betterend.helix_tree_fence": "Spiralbaumzaun", + "block.betterend.helix_tree_gate": "Spiralbaumzauntor", + "block.betterend.helix_tree_ladder": "Spiralbaumleiter", + "block.betterend.helix_tree_leaves": "Spiralbaumlaub", + "block.betterend.helix_tree_log": "Spiralbaumstamm", + "block.betterend.helix_tree_planks": "Spiralbaumbretter", + "block.betterend.helix_tree_plate": "Spiralbaumdruckplatte", + "block.betterend.helix_tree_sapling": "Spiralbaumsetzling", + "block.betterend.helix_tree_sign": "Spiralbaumschild", + "block.betterend.helix_tree_slab": "Spiralbaumstufe", + "block.betterend.helix_tree_stairs": "Spiralbaumtreppe", + "block.betterend.helix_tree_stripped_bark": "Entrindetes Spiralbaumholz", + "block.betterend.helix_tree_stripped_log": "Entrindeter Spiralbaumstamm", + "block.betterend.helix_tree_trapdoor": "Spiralbaumfalltür", + "block.betterend.lanceleaf": "Lanzenblatt", + "block.betterend.lanceleaf_seed": "Lanzenblattsamen", + "block.betterend.hydralux": "Hydralux", + "block.betterend.helix_tree_luminophor": "Spiralbaumluminophor", + + "block.betterend.glowing_pillar_leaves": "Glühsäulenlaub", + "block.betterend.glowing_pillar_luminophor": "Glühsäulenluminophor", + "block.betterend.glowing_pillar_roots": "Glühsäulenwurzeln", + "block.betterend.glowing_pillar_seed": "Glühsäulensamen", + + "biome.betterend.ice_starfield": "Eissternfeld", + + "block.betterend.ancient_emerald_ice": "Antikes Smaragdeis", + "block.betterend.dense_emerald_ice": "Dichtes Smaragdeis", + "block.betterend.dense_snow": "Dichter Schnee", + "block.betterend.emerald_ice": "Smaragdeis", + + "block.betterend.bulb_moss": "Knollenmoos", + + "block.betterend.charnia_green": "Grünes Charnia", + "block.betterend.vent_bubble_column": "Blasenquellensäule", + "block.betterend.respawn_obelisk": "Rücksetzobelisk", + "message.betterend.set_spawn": "\u00A7b\u00A7lWiedereinstiegspunkt gesetzt", + "message.betterend.fail_spawn": "\u00A7c\u00A7lDu musst 6 Bernsteinjuwele in der Hand halten, um deinen Einstiegspunkt zu setzen.", + + "block.betterend.dragon_tree_composter": "Drachenbaumkomposter", + "block.betterend.end_lotus_composter": "Endlotuskomposter", + "block.betterend.helix_tree_composter": "Spiralbaumkomposter", + "block.betterend.lacugrove_composter": "Seemangrovenkomposter", + "block.betterend.mossy_glowshroom_composter": "Bemooster Glühpilzkomposter", + "block.betterend.pythadendron_composter": "Pythadendronkomposter", + "block.betterend.tenanea_composter": "Tenaneakomposter", + + "biome.betterend.old_bulbis_gardens": "Alte Knollengärten", + "block.betterend.ivis_moss": "Efeumoos", + "block.betterend.ivis_vine": "Efeuranke", + "block.betterend.silk_moth_nest": "Seidenmottennest", + + "block.betterend.umbrella_tree_bark": "Schirmbaumholz", + "block.betterend.umbrella_tree_barrel": "Schirmbaumfass", + "block.betterend.umbrella_tree_bookshelf": "Schirmbaumbücherregal", + "block.betterend.umbrella_tree_button": "Schirmbaumknopf", + "block.betterend.umbrella_tree_chest": "Schirmbaumtruhe", + "block.betterend.umbrella_tree_composter": "Schirmbaumkomposter", + "block.betterend.umbrella_tree_crafting_table": "Schirmbaumwerkbank", + "block.betterend.umbrella_tree_door": "Schirmbaumtür", + "block.betterend.umbrella_tree_fence": "Schirmbaumzaun", + "block.betterend.umbrella_tree_gate": "Schirmbaumzauntor", + "block.betterend.umbrella_tree_ladder": "Schirmbaumleiter", + "block.betterend.umbrella_tree_log": "Schirmbaumstamm", + "block.betterend.umbrella_tree_planks": "Schirmbaumbretter", + "block.betterend.umbrella_tree_plate": "Schirmbaumdruckplatte", + "block.betterend.umbrella_tree_sign": "Schirmbaumschild", + "block.betterend.umbrella_tree_slab": "Schirmbaumstufe", + "block.betterend.umbrella_tree_stairs": "Schirmbaumtreppe", + "block.betterend.umbrella_tree_stripped_bark": "Entrindetes Schirmbaumholz", + "block.betterend.umbrella_tree_stripped_log": "Entrindeter Schirmbaumstamm", + "block.betterend.umbrella_tree_trapdoor": "Schirmbaumfalltür", + "block.betterend.umbrella_tree_membrane": "Schirmbaummembran", + + "biome.betterend.umbrella_jungle": "Schirmdschungel", + "block.betterend.jungle_grass": "Dschungelgras", + "block.betterend.jungle_moss": "Dschungelmoos", + "block.betterend.jungle_moss_path": "Dschungelmoospfad", + "block.betterend.small_jellyshroom": "Kleiner Geleepilz", + "block.betterend.twisted_umbrella_moss": "Zwirbelschirmmoos", + "block.betterend.twisted_umbrella_moss_tall": "Großes Zwirbelschirmmoos", + "block.betterend.umbrella_tree_cluster": "Schirmtraube", + "block.betterend.umbrella_tree_cluster_empty": "Leere Schirmtrauben", + "block.betterend.jungle_vine": "Dschungelranke", + "block.betterend.jungle_fern": "Dschungelfarn", + + "block.betterend.jellyshroom_bark": "Geleepilzholz", + "block.betterend.jellyshroom_barrel": "Geleepilzfass", + "block.betterend.jellyshroom_bookshelf": "Geleepilzbücherregal", + "block.betterend.jellyshroom_button": "Geleepilzknopf", + "block.betterend.jellyshroom_cap_purple": "Violette Geleepilzkappe", + "block.betterend.jellyshroom_chest": "Geleepilztruhe", + "block.betterend.jellyshroom_composter": "Geleepilzkomposter", + "block.betterend.jellyshroom_crafting_table": "Geleepilzwerkbank", + "block.betterend.jellyshroom_door": "Geleepilztür", + "block.betterend.jellyshroom_fence": "Geleepilzzaun", + "block.betterend.jellyshroom_gate": "Geleepilzzauntor", + "block.betterend.jellyshroom_ladder": "Geleepilzleiter", + "block.betterend.jellyshroom_log": "Geleepilzstamm", + "block.betterend.jellyshroom_planks": "Geleepilzbretter", + "block.betterend.jellyshroom_plate": "Geleepilzdruckplatte", + "block.betterend.jellyshroom_sign": "Geleepilzschild", + "block.betterend.jellyshroom_slab": "Geleepilzstufe", + "block.betterend.jellyshroom_stairs": "Geleepilztreppe", + "block.betterend.jellyshroom_stripped_bark": "Entrindetes Geleepilzholz", + "block.betterend.jellyshroom_stripped_log": "Entrindeter Geleepilzstamm", + "block.betterend.jellyshroom_trapdoor": "Geleepilzfalltür", + + "biome.betterend.eterial_grove": "Äthermangrove", + "block.betterend.umbrella_tree_sapling": "Schirmbaumsetzling", + "item.betterend.umbrella_cluster_juice": "Schirmtraubensaft", + "block.betterend.blossom_berry_seed": "Blütenbeerensamen", + "item.betterend.blossom_berry": "Blütenbeere", + + "biome.betterend.nightshade_redwoods": "Nachtschattenrotwald", + "block.betterend.nightshade_moss": "Nachtschattenmoos", + + "biome.betterend.glowing_grasslands": "Glühende Wiesen", + "block.betterend.blooming_cooksonia": "Blühende Cooksonia", + "block.betterend.fracturn": "Fraktur", + "block.betterend.lumecorn": "Maislicht", + "block.betterend.salteago": "Salzeago", + "block.betterend.vaiolush_fern": "Vaiosatt Farn", + "entity.betterend.silk_moth": "Seidenmotte", + "item.betterend.silk_fiber": "Seidenfaser", + "item.betterend.spawn_egg_silk_moth": "Seidenmotten-Spawn-Ei", + + "block.betterend.thallasium_ore": "Thallasiumerz", + "item.betterend.thallasium_axe": "Thallasiumaxt", + "item.betterend.thallasium_hoe": "Thallasiumhacke", + "item.betterend.thallasium_ingot": "Thallasiumbarren", + "item.betterend.thallasium_pickaxe": "Thallasiumspitzhacke", + "item.betterend.thallasium_shovel": "Thallasiumschaufel", + "item.betterend.thallasium_sword": "Thallasiumschwert", + "block.betterend.thallasium_block": "Thallasiumblock", + + "block.betterend.thallasium_bars": "Thallasiumgitter", + "block.betterend.thallasium_door": "Thallasiumtür", + "block.betterend.thallasium_plate": "Thallasiumdruckplatte", + "block.betterend.thallasium_tile": "Thallasiumfliesen", + "block.betterend.thallasium_trapdoor": "Thallasiumfalltür", + + "block.betterend.lumecorn_seed": "Maislichtsamen", + "item.betterend.lumecorn_rod": "Maislichtstange", + "block.betterend.thallasium_chandelier": "Thallasiumkronleuchter", + + "block.betterend.thallasium_anvil": "Thallasiumamboss", + "block.betterend.thallasium_chain": "Thallasiumkette", + "block.betterend.thallasium_slab": "Thallasiumstufe", + "block.betterend.thallasium_stairs": "Thallasiumtreppe", + + "block.betterend.gold_chandelier": "Goldkronleuchter", + "block.betterend.iron_chandelier": "Eisenkronleuchter", + "item.betterend.thallasium_nugget": "Thallasiumklumpen", + + "block.betterend.terminite_anvil": "Terminitamboss", + "block.betterend.terminite_bars": "Terminitgitter", + + "block.betterend.terminite_bulb_lantern": "Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_black": "Schwarze Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_blue": "Blaue Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_brown": "Braune Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_cyan": "Türkise Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_gray": "Graue Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_green": "Green Terminite Bulb Lantern", + "block.betterend.terminite_bulb_lantern_light_blue": "Hellblaue Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_light_gray": "Hellgraue Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_lime": "Hellgrüne Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_magenta": "Magenta Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_orange": "Orangene Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_pink": "Pinke Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_purple": "Violette Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_red": "Rote Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_white": "Weiße Terminitknollenlaterne", + "block.betterend.terminite_bulb_lantern_yellow": "Gelbe Terminitknollenlaterne", + + "block.betterend.terminite_chain": "Terminitkette", + "block.betterend.terminite_chandelier": "Terminitkronleuchter", + "block.betterend.terminite_door": "Terminittür", + "block.betterend.terminite_plate": "Terminitdruckplatte", + "block.betterend.terminite_slab": "Terminitstufe", + "block.betterend.terminite_stairs": "Terminittreppe", + "block.betterend.terminite_tile": "Terminitfliesen", + "block.betterend.terminite_trapdoor": "Terminitfalltür", + "item.betterend.terminite_nugget": "Terminitklumpen", + "item.betterend.thallasium_boots": "Thallasiumstiefel", + "item.betterend.thallasium_chestplate": "Thallasiumharnisch", + "item.betterend.thallasium_hammer": "Thallasiumschmiedehammer", + "item.betterend.thallasium_helmet": "Thallasiumhelm", + "item.betterend.thallasium_leggings": "Thallasiumbeinschutz", + "block.betterend.missing_tile": "Fehlende Fliesen", + "block.betterend.charcoal_block": "Holzkohleblock", + "block.betterend.end_stone_furnace": "Endsteinofen", + "block.betterend.flavolite_furnace": "Flavolitofen", + "block.betterend.sulphuric_rock_furnace": "Schwefelsteinofen", + "block.betterend.violecite_furnace": "Violezitofen", + + "item.betterend.terminite_axe_head": "Terminitaxtkopf", + "item.betterend.terminite_hoe_head": "Terminithackenkopf", + "item.betterend.terminite_pickaxe_head": "Terminitspitzhackenkopf", + "item.betterend.terminite_shovel_head": "Terminitschaufelkopf", + "item.betterend.terminite_sword_blade": "Terminitschwertklinge", + "item.betterend.terminite_sword_handle": "Terminitschwertgriff", + "item.betterend.thallasium_axe_head": "Thallasiumaxtkopf", + "item.betterend.thallasium_hoe_head": "Thallasiumhackenkopf", + "item.betterend.thallasium_pickaxe_head": "Thallasiumspitzhackenkopf", + "item.betterend.thallasium_shovel_head": "Thallasiumschaufelkopf", + "item.betterend.thallasium_sword_blade": "Thallasiumschwertklinge", + "item.betterend.thallasium_sword_handle": "Thallasiumschwertgriff", + "block.betterend.aeternium_anvil": "Ätheramboss" +} diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 8a7a40d7..a7f86e22 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -849,5 +849,9 @@ "block.betterend.smaragdant_crystal_stairs": "Smaragdant Stairs", "block.betterend.smaragdant_crystal_tiles": "Smaragdant Tiles", "block.betterend.smaragdant_crystal_wall": "Smaragdant Wall", - "message.betterend.anvil_damage": "§cDamage" + "message.betterend.anvil_damage": "§cDamage", + + "block.betterend.neon_cactus_block": "Neon Cactus Block", + "block.betterend.neon_cactus_slab": "Neon Cactus Slab", + "block.betterend.neon_cactus_stairs": "Neon Cactus Stairs" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 236a8ae4..c5366cb6 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -868,5 +868,9 @@ "block.betterend.smaragdant_crystal_stairs": "Смарагдантовые ступени", "block.betterend.smaragdant_crystal_tiles": "Смарагдантовая плитка", "block.betterend.smaragdant_crystal_wall": "Смарагдантовая стена", - "message.betterend.anvil_damage": "§cПовреждение" + "message.betterend.anvil_damage": "§cПовреждение", + + "block.betterend.neon_cactus_block": "Блок неонового кактуса", + "block.betterend.neon_cactus_slab": "Плита из неонового кактуса", + "block.betterend.neon_cactus_stairs": "Ступени из неонового кактуса" } \ No newline at end of file From ed35e28e9403c7751533305daff25225fc21affa Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 28 Apr 2021 14:27:08 +0300 Subject: [PATCH 451/463] Cactus fixes --- .../blocks/NeonCactusPlantBlock.java | 67 ++++++++++--------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java b/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java index be5131e2..80781aee 100644 --- a/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java @@ -107,10 +107,7 @@ public class NeonCactusPlantBlock extends BlockBaseNotFull implements SimpleWate @Override public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { - if (!canSurvive(state, world, pos)) { - world.getBlockTicks().scheduleTick(pos, this, MHelper.randRange(1, 4, world.getRandom())); - return state; - } + world.getBlockTicks().scheduleTick(pos, this, 2); if ((Boolean) state.getValue(WATERLOGGED)) { world.getLiquidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); } @@ -131,7 +128,7 @@ public class NeonCactusPlantBlock extends BlockBaseNotFull implements SimpleWate @Override public void tick(BlockState blockState, ServerLevel serverLevel, BlockPos blockPos, Random random) { if (!blockState.canSurvive(serverLevel, blockPos)) { - serverLevel.destroyBlock(blockPos, true); + serverLevel.destroyBlock(blockPos, true, null, 1); } } @@ -190,8 +187,8 @@ public class NeonCactusPlantBlock extends BlockBaseNotFull implements SimpleWate } } } - else if (length > 1 && world.getBlockState(pos.below()).is(this)) { - Direction side = BlocksHelper.randomHorizontal(random); + else if (length > 1 && world.getBlockState(pos.relative(dir.getOpposite())).is(this)) { + Direction side = getSideDirection(world, pos, state, dir, random); BlockPos sidePos = pos.relative(side); if (world.isEmptyBlock(sidePos)) { BlockState placement = state.setValue(SHAPE, TripleShape.TOP).setValue(CACTUS_BOTTOM, CactusBottom.EMPTY).setValue(WATERLOGGED, false).setValue(FACING, side); @@ -252,32 +249,7 @@ public class NeonCactusPlantBlock extends BlockBaseNotFull implements SimpleWate } } else if (length > 1 && world.getBlockState(pos.below()).is(this)) { - MutableBlockPos iterPos = pos.mutable(); - BlockState iterState = state; - Direction startDir = null; - Direction lastDir = null; - while (iterState.is(this)) { - startDir = iterState.getValue(FACING); - if (lastDir == null) { - for (Direction side: BlocksHelper.HORIZONTAL) { - BlockState sideState = world.getBlockState(iterPos.relative(side)); - if (sideState.is(this)) { - Direction sideDir = sideState.getValue(FACING); - if (sideDir != side) { - continue; - } - lastDir = sideDir; - } - } - } - iterPos.move(dir); - iterState = world.getBlockState(iterPos); - } - - Direction side = lastDir == null ? BlocksHelper.randomHorizontal(random) : lastDir.getClockWise(); - if (side.getOpposite() == startDir) { - side = side.getClockWise(); - } + Direction side = getSideDirection(world, pos, state, dir, random); BlockPos sidePos = pos.relative(side); if (world.isEmptyBlock(sidePos)) { BlockState placement = state.setValue(SHAPE, TripleShape.TOP).setValue(CACTUS_BOTTOM, CactusBottom.EMPTY).setValue(WATERLOGGED, false).setValue(FACING, side); @@ -291,6 +263,35 @@ public class NeonCactusPlantBlock extends BlockBaseNotFull implements SimpleWate pos.move(dir); return true; } + + private Direction getSideDirection(WorldGenLevel world, BlockPos pos, BlockState iterState, Direction dir, Random random) { + MutableBlockPos iterPos = pos.mutable(); + Direction startDir = dir; + Direction lastDir = null; + while (iterState.is(this) && startDir.getAxis().isVertical()) { + startDir = iterState.getValue(FACING); + if (lastDir == null) { + for (Direction side: BlocksHelper.HORIZONTAL) { + BlockState sideState = world.getBlockState(iterPos.relative(side)); + if (sideState.is(this)) { + Direction sideDir = sideState.getValue(FACING); + if (sideDir != side) { + continue; + } + lastDir = sideDir; + } + } + } + iterPos.move(dir); + iterState = world.getBlockState(iterPos); + } + + Direction side = lastDir == null ? BlocksHelper.randomHorizontal(random) : lastDir.getClockWise(); + if (side.getOpposite() == startDir) { + side = side.getOpposite(); + } + return side; + } @Override public boolean isPathfindable(BlockState blockState, BlockGetter blockGetter, BlockPos blockPos, PathComputationType pathComputationType) { From 3af0392a5240ea5db4415ba9aedb4e127fa44cad Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 28 Apr 2021 14:57:41 +0300 Subject: [PATCH 452/463] Temporary disabled unfinished features --- src/main/java/ru/betterend/registry/EndBlocks.java | 2 +- src/main/java/ru/betterend/registry/EndFeatures.java | 9 ++++----- .../world/biome/land/FoggyMushroomlandBiome.java | 2 +- .../ru/betterend/world/biome/land/MegalakeBiome.java | 2 +- .../betterend/world/biome/land/MegalakeGroveBiome.java | 2 +- 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 21a62209..16d13464 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -215,7 +215,7 @@ public class EndBlocks { public static final Block BLOSSOM_BERRY = registerBlock("blossom_berry_seed", new EndCropBlock(EndItems.BLOSSOM_BERRY, PINK_MOSS)); public static final Block AMBER_ROOT = registerBlock("amber_root_seed", new EndCropBlock(EndItems.AMBER_ROOT_RAW, AMBER_MOSS)); public static final Block CHORUS_MUSHROOM = registerBlock("chorus_mushroom_seed", new EndCropBlock(EndItems.CHORUS_MUSHROOM_RAW, CHORUS_NYLIUM)); - public static final Block PEARLBERRY = registerBlock("pearlberry_seed", new EndCropBlock(EndItems.BLOSSOM_BERRY, END_MOSS, END_MYCELIUM)); + //public static final Block PEARLBERRY = registerBlock("pearlberry_seed", new EndCropBlock(EndItems.BLOSSOM_BERRY, END_MOSS, END_MYCELIUM)); public static final Block CAVE_PUMPKIN_SEED = registerBlock("cave_pumpkin_seed", new CavePumpkinVineBlock()); public static final Block CAVE_PUMPKIN = registerBlock("cave_pumpkin", new CavePumpkinBlock()); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 9684e2e0..b48a9bb7 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -60,7 +60,6 @@ import ru.betterend.world.features.terrain.SulphuricCaveFeature; import ru.betterend.world.features.terrain.SulphuricLakeFeature; import ru.betterend.world.features.terrain.SurfaceVentFeature; import ru.betterend.world.features.terrain.caves.RoundCaveFeature; -import ru.betterend.world.features.terrain.caves.TunelCaveFeature; import ru.betterend.world.features.trees.DragonTreeFeature; import ru.betterend.world.features.trees.GiganticAmaranitaFeature; import ru.betterend.world.features.trees.HelixTreeFeature; @@ -132,7 +131,7 @@ public class EndFeatures { public static final EndFeature BOLUX_MUSHROOM = new EndFeature("bolux_mushroom", new SinglePlantFeature(EndBlocks.BOLUX_MUSHROOM, 5, 5), 2); public static final EndFeature CHORUS_MUSHROOM = new EndFeature("chorus_mushroom", new SinglePlantFeature(EndBlocks.CHORUS_MUSHROOM, 5, 5), 1); public static final EndFeature AMBER_ROOT = new EndFeature("amber_root", new SinglePlantFeature(EndBlocks.AMBER_ROOT, 5, 5), 1); - public static final EndFeature PEARLBERRY = new EndFeature("pearlberry", new SinglePlantFeature(EndBlocks.PEARLBERRY, 5, 5), 1); + //public static final EndFeature PEARLBERRY = new EndFeature("pearlberry", new SinglePlantFeature(EndBlocks.PEARLBERRY, 5, 5), 1); // Vines // public static final EndFeature DENSE_VINE = new EndFeature("dense_vine", new VineFeature(EndBlocks.DENSE_VINE, 24), 3); @@ -202,7 +201,7 @@ public class EndFeatures { public static final EndFeature OBSIDIAN_PILLAR_BASEMENT = EndFeature.makeChansedFeature("obsidian_pillar_basement", new ObsidianPillarBasementFeature(), 8); public static final EndFeature OBSIDIAN_BOULDER = EndFeature.makeChansedFeature("obsidian_boulder", new ObsidianBoulderFeature(), 10); public static final EndFeature FALLEN_PILLAR = EndFeature.makeChansedFeature("fallen_pillar", new FallenPillarFeature(), 20); - public static final EndFeature TUNEL_CAVE = EndFeature.makeRawGenFeature("tunel_cave", new TunelCaveFeature(), 2); + //public static final EndFeature TUNEL_CAVE = EndFeature.makeRawGenFeature("tunel_cave", new TunelCaveFeature(), 2); // Ores // public static final EndFeature THALLASIUM_ORE = EndFeature.makeOreFeature("thallasium_ore", EndBlocks.THALLASIUM.ore, 12, 6, 0, 16, 128); @@ -259,7 +258,7 @@ public class EndFeatures { if (EndBiomes.getBiome(id).hasCaves()) { addFeature(ROUND_CAVE, features); - addFeature(TUNEL_CAVE, features); + //addFeature(TUNEL_CAVE, features); } EndBiome endBiome = EndBiomes.getBiome(id); @@ -277,7 +276,7 @@ public class EndFeatures { if (def.hasCaves()) { def.addFeature(ROUND_CAVE); - def.addFeature(TUNEL_CAVE); + //def.addFeature(TUNEL_CAVE); } } diff --git a/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java b/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java index cff6f813..8093795c 100644 --- a/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java @@ -29,7 +29,7 @@ public class FoggyMushroomlandBiome extends EndBiome { .addFeature(EndFeatures.UMBRELLA_MOSS) .addFeature(EndFeatures.CREEPING_MOSS) .addFeature(EndFeatures.DENSE_VINE) - .addFeature(EndFeatures.PEARLBERRY) + //.addFeature(EndFeatures.PEARLBERRY) .addFeature(EndFeatures.CYAN_MOSS) .addFeature(EndFeatures.CYAN_MOSS_WOOD) .addFeature(EndFeatures.END_LILY) diff --git a/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java b/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java index 998c1adc..e5c29483 100644 --- a/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java @@ -27,7 +27,7 @@ public class MegalakeBiome extends EndBiome { .addFeature(EndFeatures.END_LILY_RARE) .addFeature(EndFeatures.UMBRELLA_MOSS) .addFeature(EndFeatures.CREEPING_MOSS) - .addFeature(EndFeatures.PEARLBERRY) + //.addFeature(EndFeatures.PEARLBERRY) .addFeature(EndFeatures.CHARNIA_CYAN) .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) .addFeature(EndFeatures.CHARNIA_RED_RARE) diff --git a/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java b/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java index 93ca8dab..30c553ae 100644 --- a/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java @@ -29,7 +29,7 @@ public class MegalakeGroveBiome extends EndBiome { .addFeature(EndFeatures.BUBBLE_CORAL_RARE) .addFeature(EndFeatures.END_LILY_RARE) .addFeature(EndFeatures.UMBRELLA_MOSS) - .addFeature(EndFeatures.PEARLBERRY) + //.addFeature(EndFeatures.PEARLBERRY) .addFeature(EndFeatures.CREEPING_MOSS) .addFeature(EndFeatures.CHARNIA_CYAN) .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) From 7e9a579e4a91dddfe4ac211eb8fc32fe14f78116 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 28 Apr 2021 15:23:25 +0300 Subject: [PATCH 453/463] UAD compat --- src/main/java/ru/betterend/registry/EndBiomes.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index 78107877..f4f38005 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -130,7 +130,7 @@ public class EndBiomes { biomeRegistry.forEach((biome) -> { if (biome.getBiomeCategory() == BiomeCategory.THEEND) { ResourceLocation id = biomeRegistry.getKey(biome); - if (Configs.BIOME_CONFIG.getBoolean(id, "enabled", true)) { + if (!id.getNamespace().equals("ultra_amplified_dimension") && Configs.BIOME_CONFIG.getBoolean(id, "enabled", true)) { if (!LAND_BIOMES.containsImmutable(id) && !VOID_BIOMES.containsImmutable(id) && !SUBBIOMES_UNMUTABLES.contains(id)) { JsonObject config = configs.get(id.getNamespace()); if (config == null) { From 4141ce7f60943bf4db4f2d753c8c02f6288791dd Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 28 Apr 2021 15:41:23 +0300 Subject: [PATCH 454/463] Vaersion change --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index b8ce1799..990e395f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ loader_version=0.11.3 # Mod Properties - mod_version = 0.9.2-pre + mod_version = 0.9.3-pre maven_group = ru.betterend archives_base_name = better-end From 5adf3858130c33184774094349b31238ebccea4b Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 28 Apr 2021 16:56:53 +0300 Subject: [PATCH 455/463] Bonemeal hotfix --- .../mixin/common/BoneMealItemMixin.java | 45 +++++++------------ src/main/java/ru/betterend/util/MHelper.java | 20 +++++++++ 2 files changed, 35 insertions(+), 30 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java index e91bceab..9e866de1 100644 --- a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java +++ b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java @@ -26,8 +26,7 @@ import ru.betterend.world.biome.EndBiome; @Mixin(BoneMealItem.class) public class BoneMealItemMixin { - private static final MutableBlockPos POS = new MutableBlockPos(); - private static final Vec3i[] DIR; + private static final MutableBlockPos BE_BLOCK_POS = new MutableBlockPos(); @Inject(method = "useOn", at = @At("HEAD"), cancellable = true) private void be_onUse(UseOnContext context, CallbackInfoReturnable info) { @@ -81,15 +80,15 @@ public class BoneMealItemMixin { for (int i = 0; i < 64; i++) { int x = (int) (pos.getX() + world.random.nextGaussian() * 2); int z = (int) (pos.getZ() + world.random.nextGaussian() * 2); - POS.setX(x); - POS.setZ(z); + BE_BLOCK_POS.setX(x); + BE_BLOCK_POS.setZ(z); for (int y = y1; y >= y2; y--) { - POS.setY(y); - BlockPos down = POS.below(); - if (world.isEmptyBlock(POS) && !world.isEmptyBlock(down)) { + BE_BLOCK_POS.setY(y); + BlockPos down = BE_BLOCK_POS.below(); + if (world.isEmptyBlock(BE_BLOCK_POS) && !world.isEmptyBlock(down)) { BlockState grass = be_getGrassState(world, down); if (grass != null) { - BlocksHelper.setWithoutUpdate(world, POS, grass); + BlocksHelper.setWithoutUpdate(world, BE_BLOCK_POS, grass); result = true; } break; @@ -106,15 +105,15 @@ public class BoneMealItemMixin { for (int i = 0; i < 64; i++) { int x = (int) (pos.getX() + world.random.nextGaussian() * 2); int z = (int) (pos.getZ() + world.random.nextGaussian() * 2); - POS.setX(x); - POS.setZ(z); + BE_BLOCK_POS.setX(x); + BE_BLOCK_POS.setZ(z); for (int y = y1; y >= y2; y--) { - POS.setY(y); - BlockPos down = POS.below(); - if (world.getBlockState(POS).is(Blocks.WATER) && world.getBlockState(down).is(EndTags.END_GROUND)) { + BE_BLOCK_POS.setY(y); + BlockPos down = BE_BLOCK_POS.below(); + if (world.getBlockState(BE_BLOCK_POS).is(Blocks.WATER) && world.getBlockState(down).is(EndTags.END_GROUND)) { BlockState grass = be_getWaterGrassState(world, down); if (grass != null) { - BlocksHelper.setWithoutUpdate(world, POS, grass); + BlocksHelper.setWithoutUpdate(world, BE_BLOCK_POS, grass); result = true; } break; @@ -149,8 +148,8 @@ public class BoneMealItemMixin { } private BlockState be_getNylium(Level world, BlockPos pos) { - MHelper.shuffle(DIR, world.getRandom()); - for (Vec3i dir : DIR) { + Vec3i[] offsets = MHelper.getOffsets(world.getRandom()); + for (Vec3i dir : offsets) { BlockPos p = pos.offset(dir); BlockState state = world.getBlockState(p); if (BlocksHelper.isEndNylium(state) && !world.getBlockState(p.above()).is(EndTags.END_GROUND)) { @@ -159,18 +158,4 @@ public class BoneMealItemMixin { } return null; } - - static { - int index = 0; - DIR = new Vec3i[3 * 3 * 3 - 1]; - for (int x = -1; x <= 1; x++) { - for (int y = -1; y <= 1; y++) { - for (int z = -1; z <= 1; z++) { - if (x != 0 || y != 0 || z != 0) { - DIR[index++] = new Vec3i(x, y, z); - } - } - } - } - } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/util/MHelper.java b/src/main/java/ru/betterend/util/MHelper.java index ba74b438..d406d2a7 100644 --- a/src/main/java/ru/betterend/util/MHelper.java +++ b/src/main/java/ru/betterend/util/MHelper.java @@ -4,6 +4,7 @@ import java.util.Random; import com.mojang.math.Vector3f; +import net.minecraft.core.Vec3i; import net.minecraft.world.phys.Vec3; public class MHelper { @@ -12,6 +13,7 @@ public class MHelper { public static final Random RANDOM = new Random(); private static final float RAD_TO_DEG = 57.295779513082320876798154814105F; public static final float PHI = (float) (Math.PI * (3 - Math.sqrt(5))); + private static final Vec3i[] RANDOM_OFFSETS = new Vec3i[3 * 3 * 3 - 1]; public static int color(int r, int g, int b) { return ALPHA | (r << 16) | (g << 8) | b; @@ -346,4 +348,22 @@ public class MHelper { float vz = (float) Math.cos(angleY); return new Vector3f(vx, 0, vz); } + + public static Vec3i[] getOffsets(Random random) { + MHelper.shuffle(RANDOM_OFFSETS, random); + return RANDOM_OFFSETS; + } + + static { + int index = 0; + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + for (int z = -1; z <= 1; z++) { + if (x != 0 || y != 0 || z != 0) { + RANDOM_OFFSETS[index++] = new Vec3i(x, y, z); + } + } + } + } + } } From 16b02e15bf03ab9fd7551ca55d749d268f4c23ce Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 29 Apr 2021 00:49:22 +0300 Subject: [PATCH 456/463] Fixed too small void ring, make void ring configurable --- .../world/generator/GeneratorOptions.java | 13 +++++++++++++ .../world/generator/IslandLayer.java | 19 ++++++++++--------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java index b9b34d4c..5c7f6c2d 100644 --- a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java +++ b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java @@ -26,6 +26,8 @@ public class GeneratorOptions { private static BlockPos portal = BlockPos.ZERO; private static boolean replacePortal; private static boolean replacePillars; + private static long islandDistBlock; + private static int islandDistChunk; public static void init() { biomeSizeLand = Configs.GENERATOR_CONFIG.getInt("biomeMap", "biomeSizeLand", 256); @@ -52,6 +54,9 @@ public class GeneratorOptions { ); replacePortal = Configs.GENERATOR_CONFIG.getBoolean("portal", "customEndPortal", true); replacePillars = Configs.GENERATOR_CONFIG.getBoolean("spikes", "customObsidianSpikes", true); + int circleRadius = Configs.GENERATOR_CONFIG.getInt("customGenerator", "voidRingSize", 1000); + islandDistBlock = (long) circleRadius * (long) circleRadius; + islandDistChunk = (circleRadius >> 3); // Twice bigger than normal } public static int getBiomeSizeLand() { @@ -129,4 +134,12 @@ public class GeneratorOptions { public static boolean replacePillars() { return replacePillars; } + + public static long getIslandDistBlock() { + return islandDistBlock; + } + + public static int getIslandDistChunk() { + return islandDistChunk; + } } diff --git a/src/main/java/ru/betterend/world/generator/IslandLayer.java b/src/main/java/ru/betterend/world/generator/IslandLayer.java index fc98a264..d50f2797 100644 --- a/src/main/java/ru/betterend/world/generator/IslandLayer.java +++ b/src/main/java/ru/betterend/world/generator/IslandLayer.java @@ -5,7 +5,6 @@ import java.util.List; import java.util.Map; import java.util.Random; -import com.google.common.collect.Lists; import com.google.common.collect.Maps; import net.minecraft.core.BlockPos; @@ -80,15 +79,17 @@ public class IslandLayer { } } - if (GeneratorOptions.hasCentralIsland() && ix < 4 && iz < 4 && ix > -4 && iz > -4) { - List remove = Lists.newArrayList(); - positions.forEach((pos) -> { - int d = pos.getX() * pos.getX() + pos.getZ() * pos.getZ(); - if (d < 12544) { - remove.add(pos); + if (GeneratorOptions.hasCentralIsland() && Math.abs(ix) < GeneratorOptions.getIslandDistChunk() && Math.abs(iz) < GeneratorOptions.getIslandDistChunk()) { + int count = positions.size(); + for (int n = 0; n < count; n++) { + BlockPos pos = positions.get(n); + long d = (long) pos.getX() * (long) pos.getX() + (long) pos.getZ() * (long) pos.getZ(); + if (d < GeneratorOptions.getIslandDistBlock()) { + positions.remove(n); + count--; + n--; } - }); - positions.removeAll(remove); + } if (options.hasCentralIsland) { positions.add(new BlockPos(0, 64, 0)); } From 9999abf9458bbe5cfbedea07ee792035425e46ea Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 29 Apr 2021 01:08:57 +0300 Subject: [PATCH 457/463] Fixed caves crash with non-be biome source (issue #148) --- src/main/java/ru/betterend/registry/EndBiomes.java | 13 ++++++++++++- .../features/terrain/caves/EndCaveFeature.java | 3 ++- .../world/generator/BetterEndBiomeSource.java | 12 +++++++----- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index f4f38005..5b7ef6b6 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -112,7 +112,9 @@ public class EndBiomes { public static final EndCaveBiome EMPTY_AURORA_CAVE = registerCaveBiome(new EmptyAuroraCaveBiome()); public static final EndCaveBiome LUSH_AURORA_CAVE = registerCaveBiome(new LushAuroraCaveBiome()); - public static void register() {} + public static void register() { + CAVE_BIOMES.rebuild(); + } public static void mutateRegistry(Registry biomeRegistry) { EndBiomes.biomeRegistry = biomeRegistry; @@ -407,6 +409,15 @@ public class EndBiomes { public static EndBiome getBiome(ResourceLocation biomeID) { return ID_MAP.getOrDefault(biomeID, END); } + + public static Biome getActualBiome(EndBiome biome) { + Biome actual = biome.getActualBiome(); + if (actual == null) { + biome.updateActualBiomes(biomeRegistry); + actual = biome.getActualBiome(); + } + return actual; + } public static List getModBiomes() { List result = Lists.newArrayList(); 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 0afc7c87..90744cb0 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 @@ -117,7 +117,8 @@ public abstract class EndCaveFeature extends DefaultFeature { private void setBiome(WorldGenLevel world, BlockPos pos, EndCaveBiome biome) { IBiomeArray array = (IBiomeArray) world.getChunk(pos).getBiomes(); if (array != null) { - array.be_setBiome(biome.getActualBiome(), pos); + Biome bio = EndBiomes.getActualBiome(biome); + array.be_setBiome(bio, pos); } } diff --git a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java index 6c85f2ab..ff86b727 100644 --- a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java +++ b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java @@ -89,12 +89,13 @@ public class BetterEndBiomeSource extends BiomeSource { mapVoid.clearCache(); } + EndBiome endBiome = null; if (GeneratorOptions.useNewGenerator()) { if (TerrainGenerator.isLand(biomeX, biomeZ)) { - return mapLand.getBiome(biomeX << 2, biomeZ << 2).getActualBiome(); + endBiome = mapLand.getBiome(biomeX << 2, biomeZ << 2); } else { - return mapVoid.getBiome(biomeX << 2, biomeZ << 2).getActualBiome(); + endBiome = mapVoid.getBiome(biomeX << 2, biomeZ << 2); } } else { @@ -104,9 +105,10 @@ public class BetterEndBiomeSource extends BiomeSource { return barrens; } - EndBiome endBiome = height < -10F ? mapVoid.getBiome(biomeX << 2, biomeZ << 2) : mapLand.getBiome(biomeX << 2, biomeZ << 2); - return endBiome.getActualBiome(); + endBiome = height < -10F ? mapVoid.getBiome(biomeX << 2, biomeZ << 2) : mapLand.getBiome(biomeX << 2, biomeZ << 2); } + + return EndBiomes.getActualBiome(endBiome); } public Biome getLandBiome(int biomeX, int biomeY, int biomeZ) { @@ -124,7 +126,7 @@ public class BetterEndBiomeSource extends BiomeSource { return this.centerBiome; } } - return mapLand.getBiome(biomeX << 2, biomeZ << 2).getActualBiome(); + return EndBiomes.getActualBiome(mapLand.getBiome(biomeX << 2, biomeZ << 2)); } @Override From c91478ee99146322e3623fb12db5f3a950926f1e Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 29 Apr 2021 01:13:09 +0300 Subject: [PATCH 458/463] Version change --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 990e395f..9abb7905 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ loader_version=0.11.3 # Mod Properties - mod_version = 0.9.3-pre + mod_version = 0.9.4-pre maven_group = ru.betterend archives_base_name = better-end From d5a93cb730fdef1a62f01a90de4a75a13208d164 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 29 Apr 2021 12:39:15 +0300 Subject: [PATCH 459/463] Jade caves (WIP) --- .../java/ru/betterend/registry/EndBiomes.java | 2 + .../java/ru/betterend/registry/EndBlocks.java | 6 +- .../world/biome/cave/EndCaveBiome.java | 4 ++ .../world/biome/cave/JadeCaveBiome.java | 35 ++++++++++++ .../terrain/caves/EndCaveFeature.java | 55 ++++++++++++++++++- 5 files changed, 97 insertions(+), 5 deletions(-) create mode 100644 src/main/java/ru/betterend/world/biome/cave/JadeCaveBiome.java diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index 5b7ef6b6..cf48844a 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -38,6 +38,7 @@ import ru.betterend.world.biome.cave.EmptyAuroraCaveBiome; import ru.betterend.world.biome.cave.EmptyEndCaveBiome; import ru.betterend.world.biome.cave.EmptySmaragdantCaveBiome; import ru.betterend.world.biome.cave.EndCaveBiome; +import ru.betterend.world.biome.cave.JadeCaveBiome; import ru.betterend.world.biome.cave.LushAuroraCaveBiome; import ru.betterend.world.biome.cave.LushSmaragdantCaveBiome; import ru.betterend.world.biome.land.AmberLandBiome; @@ -111,6 +112,7 @@ public class EndBiomes { public static final EndCaveBiome LUSH_SMARAGDANT_CAVE = registerCaveBiome(new LushSmaragdantCaveBiome()); public static final EndCaveBiome EMPTY_AURORA_CAVE = registerCaveBiome(new EmptyAuroraCaveBiome()); public static final EndCaveBiome LUSH_AURORA_CAVE = registerCaveBiome(new LushAuroraCaveBiome()); + public static final EndCaveBiome JADE_CAVE = registerCaveBiome(new JadeCaveBiome()); public static void register() { CAVE_BIOMES.rebuild(); diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 16d13464..aa3ee5d0 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -77,9 +77,9 @@ public class EndBlocks { public static final StoneMaterial FLAVOLITE = new StoneMaterial("flavolite", MaterialColor.SAND); public static final StoneMaterial VIOLECITE = new StoneMaterial("violecite", MaterialColor.COLOR_PURPLE); public static final StoneMaterial SULPHURIC_ROCK = new StoneMaterial("sulphuric_rock", MaterialColor.COLOR_BROWN); - public static final StoneMaterial VIRID_jADESTONE = new StoneMaterial("virid_jadestone", MaterialColor.COLOR_GREEN); - public static final StoneMaterial AZURE_jADESTONE = new StoneMaterial("azure_jadestone", MaterialColor.COLOR_LIGHT_BLUE); - public static final StoneMaterial SANDY_jADESTONE = new StoneMaterial("sandy_jadestone", MaterialColor.COLOR_YELLOW); + public static final StoneMaterial VIRID_JADESTONE = new StoneMaterial("virid_jadestone", MaterialColor.COLOR_GREEN); + public static final StoneMaterial AZURE_JADESTONE = new StoneMaterial("azure_jadestone", MaterialColor.COLOR_LIGHT_BLUE); + public static final StoneMaterial SANDY_JADESTONE = new StoneMaterial("sandy_jadestone", MaterialColor.COLOR_YELLOW); public static final Block BRIMSTONE = registerBlock("brimstone", new BrimstoneBlock()); public static final Block SULPHUR_CRYSTAL = registerBlock("sulphur_crystal", new SulphurCrystalBlock()); public static final Block MISSING_TILE = registerBlock("missing_tile", new MissingTileBlock()); diff --git a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java index 26c07fbf..3f25a5bb 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java @@ -56,4 +56,8 @@ public class EndCaveBiome extends EndBiome { public BlockState getCeil(BlockPos pos) { return null; } + + public BlockState getWall(BlockPos pos) { + return null; + } } diff --git a/src/main/java/ru/betterend/world/biome/cave/JadeCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/JadeCaveBiome.java new file mode 100644 index 00000000..d399695d --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/cave/JadeCaveBiome.java @@ -0,0 +1,35 @@ +package ru.betterend.world.biome.cave; + +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; + +public class JadeCaveBiome extends EndCaveBiome { + private static final OpenSimplexNoise WALL_NOISE = new OpenSimplexNoise("jade_cave".hashCode()); + private static final OpenSimplexNoise DEPTH_NOISE = new OpenSimplexNoise("depth_noise".hashCode()); + private static final BlockState[] JADE = new BlockState[3]; + + public JadeCaveBiome() { + super(new BiomeDefinition("jade_cave") + .setFogColor(118, 150, 112) + .setFogDensity(2.0F) + .setWaterAndFogColor(95, 223, 255) + .setMusic(EndSounds.MUSIC_FOREST) + ); + JADE[0] = EndBlocks.VIRID_JADESTONE.stone.defaultBlockState(); + JADE[1] = EndBlocks.AZURE_JADESTONE.stone.defaultBlockState(); + JADE[2] = EndBlocks.SANDY_JADESTONE.stone.defaultBlockState(); + } + + @Override + public BlockState getWall(BlockPos pos) { + double depth = DEPTH_NOISE.eval(pos.getX() * 0.02, pos.getZ() * 0.02) * 0.2 + 0.5; + int index = Mth.floor((pos.getY() + WALL_NOISE.eval(pos.getX() * 0.2, pos.getZ() * 0.2) * 1.5) * depth + 0.5); + index = Mth.abs(index) % 3; + return JADE[index]; + } +} 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 90744cb0..c303d01b 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 @@ -1,13 +1,16 @@ package ru.betterend.world.features.terrain.caves; +import java.util.List; import java.util.Random; import java.util.Set; +import com.google.common.collect.Lists; import com.google.common.collect.Sets; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Blocks; @@ -29,6 +32,7 @@ public abstract class EndCaveFeature extends DefaultFeature { protected static final BlockState CAVE_AIR = Blocks.CAVE_AIR.defaultBlockState(); protected static final BlockState END_STONE = Blocks.END_STONE.defaultBlockState(); protected static final BlockState WATER = Blocks.WATER.defaultBlockState(); + private static final Vec3i[] SPHERE; @Override public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { @@ -68,10 +72,10 @@ public abstract class EndCaveFeature extends DefaultFeature { } } }); - BlockState surfaceBlock = biome.getBiome().getGenerationSettings().getSurfaceBuilderConfig() - .getTopMaterial(); + BlockState surfaceBlock = biome.getBiome().getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); placeFloor(world, biome, floorPositions, random, surfaceBlock); placeCeil(world, biome, ceilPositions, random); + placeWalls(world, biome, caveBlocks, random); } fixBlocks(world, caveBlocks); } @@ -109,6 +113,34 @@ public abstract class EndCaveFeature extends DefaultFeature { } }); } + + protected void placeWalls(WorldGenLevel world, EndCaveBiome biome, Set positions, Random random) { + Set placed = Sets.newHashSet(); + positions.forEach(pos -> { + if (random.nextInt(4) == 0 && hasOpenSide(pos, positions)) { + BlockState wallBlock = biome.getWall(pos); + if (wallBlock != null) { + for (Vec3i offset: SPHERE) { + BlockPos wallPos = pos.offset(offset); + if (!positions.contains(wallPos) && !placed.contains(wallPos) && world.getBlockState(wallPos).is(EndTags.GEN_TERRAIN)) { + wallBlock = biome.getWall(wallPos); + BlocksHelper.setWithoutUpdate(world, wallPos, wallBlock); + placed.add(wallPos); + } + } + } + } + }); + } + + private boolean hasOpenSide(BlockPos pos, Set positions) { + for (Direction dir: BlocksHelper.DIRECTIONS) { + if (!positions.contains(pos.relative(dir))) { + return true; + } + } + return false; + } protected void setBiomes(WorldGenLevel world, EndCaveBiome biome, Set blocks) { blocks.forEach((pos) -> setBiome(world, pos, biome)); @@ -202,4 +234,23 @@ public abstract class EndCaveFeature extends DefaultFeature { } return false; } + + static { + List prePos = Lists.newArrayList(); + int radius = 5; + int r2 = radius * radius; + for (int x = -radius; x <= radius; x++) { + int x2 = x * x; + for (int y = -radius; y <= radius; y++) { + int y2 = y * y; + for (int z = -radius; z <= radius; z++) { + int z2 = z * z; + if (x2 + y2 + z2 < r2) { + prePos.add(new Vec3i(x, y, z)); + } + } + } + } + SPHERE = prePos.toArray(new Vec3i[] {}); + } } From 98b740782d30a4e25dd652aed431da424f9b90a7 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 29 Apr 2021 17:32:04 +0300 Subject: [PATCH 460/463] Tunnel caves --- .../ru/betterend/registry/EndFeatures.java | 7 +- .../java/ru/betterend/registry/EndTags.java | 12 +- .../terrain/caves/EndCaveFeature.java | 2 +- .../terrain/caves/TunelCaveFeature.java | 175 ++++++++++++++---- .../assets/betterend/lang/en_us.json | 3 +- .../assets/betterend/lang/ru_ru.json | 3 +- .../textures/block/sandy_jadestone.png | Bin 200 -> 223 bytes .../textures/block/sandy_jadestone_bricks.png | Bin 228 -> 194 bytes .../block/sandy_jadestone_furnace_front.png | Bin 238 -> 271 bytes .../sandy_jadestone_furnace_front_on.png | Bin 278 -> 310 bytes .../block/sandy_jadestone_furnace_side.png | Bin 213 -> 244 bytes .../block/sandy_jadestone_furnace_top.png | Bin 216 -> 235 bytes .../block/sandy_jadestone_lantern_bottom.png | Bin 181 -> 196 bytes .../block/sandy_jadestone_lantern_side.png | Bin 187 -> 200 bytes .../block/sandy_jadestone_lantern_top.png | Bin 181 -> 197 bytes .../block/sandy_jadestone_pillar_side.png | Bin 204 -> 175 bytes .../block/sandy_jadestone_pillar_top.png | Bin 220 -> 191 bytes .../block/sandy_jadestone_polished.png | Bin 236 -> 203 bytes .../textures/block/sandy_jadestone_tiles.png | Bin 194 -> 166 bytes .../textures/block/virid_jadestone.png | Bin 199 -> 206 bytes .../textures/block/virid_jadestone_bricks.png | Bin 228 -> 1573 bytes .../block/virid_jadestone_furnace_front.png | Bin 241 -> 1693 bytes .../virid_jadestone_furnace_front_on.png | Bin 321 -> 1783 bytes .../block/virid_jadestone_furnace_side.png | Bin 213 -> 1661 bytes .../block/virid_jadestone_furnace_top.png | Bin 216 -> 1652 bytes .../block/virid_jadestone_lantern_bottom.png | Bin 181 -> 1523 bytes .../block/virid_jadestone_lantern_side.png | Bin 187 -> 1573 bytes .../block/virid_jadestone_lantern_top.png | Bin 181 -> 1548 bytes .../block/virid_jadestone_pillar_side.png | Bin 204 -> 1509 bytes .../block/virid_jadestone_pillar_top.png | Bin 221 -> 1552 bytes .../block/virid_jadestone_polished.png | Bin 236 -> 1575 bytes .../textures/block/virid_jadestone_tiles.png | Bin 194 -> 1497 bytes 32 files changed, 161 insertions(+), 41 deletions(-) diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index b48a9bb7..30337086 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -60,6 +60,7 @@ import ru.betterend.world.features.terrain.SulphuricCaveFeature; import ru.betterend.world.features.terrain.SulphuricLakeFeature; import ru.betterend.world.features.terrain.SurfaceVentFeature; import ru.betterend.world.features.terrain.caves.RoundCaveFeature; +import ru.betterend.world.features.terrain.caves.TunelCaveFeature; import ru.betterend.world.features.trees.DragonTreeFeature; import ru.betterend.world.features.trees.GiganticAmaranitaFeature; import ru.betterend.world.features.trees.HelixTreeFeature; @@ -201,7 +202,7 @@ public class EndFeatures { public static final EndFeature OBSIDIAN_PILLAR_BASEMENT = EndFeature.makeChansedFeature("obsidian_pillar_basement", new ObsidianPillarBasementFeature(), 8); public static final EndFeature OBSIDIAN_BOULDER = EndFeature.makeChansedFeature("obsidian_boulder", new ObsidianBoulderFeature(), 10); public static final EndFeature FALLEN_PILLAR = EndFeature.makeChansedFeature("fallen_pillar", new FallenPillarFeature(), 20); - //public static final EndFeature TUNEL_CAVE = EndFeature.makeRawGenFeature("tunel_cave", new TunelCaveFeature(), 2); + public static final EndFeature TUNEL_CAVE = EndFeature.makeChunkFeature("tunel_cave", new TunelCaveFeature()); // Ores // public static final EndFeature THALLASIUM_ORE = EndFeature.makeOreFeature("thallasium_ore", EndBlocks.THALLASIUM.ore, 12, 6, 0, 16, 128); @@ -258,7 +259,7 @@ public class EndFeatures { if (EndBiomes.getBiome(id).hasCaves()) { addFeature(ROUND_CAVE, features); - //addFeature(TUNEL_CAVE, features); + addFeature(TUNEL_CAVE, features); } EndBiome endBiome = EndBiomes.getBiome(id); @@ -276,7 +277,7 @@ public class EndFeatures { if (def.hasCaves()) { def.addFeature(ROUND_CAVE); - //def.addFeature(TUNEL_CAVE); + def.addFeature(TUNEL_CAVE); } } diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index c2866b47..f82d2182 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -128,7 +128,17 @@ public class EndTags { }); ToolManagerImpl.tag(HAMMERS).register(new ModdedToolsVanillaBlocksToolHandler(hammers)); - TagHelper.addTag(GEN_TERRAIN, EndBlocks.ENDER_ORE, EndBlocks.FLAVOLITE.stone, EndBlocks.VIOLECITE.stone, EndBlocks.SULPHURIC_ROCK.stone, EndBlocks.BRIMSTONE); + TagHelper.addTag( + GEN_TERRAIN, + EndBlocks.ENDER_ORE, + EndBlocks.FLAVOLITE.stone, + EndBlocks.VIOLECITE.stone, + EndBlocks.SULPHURIC_ROCK.stone, + EndBlocks.BRIMSTONE, + EndBlocks.VIRID_JADESTONE.stone, + EndBlocks.AZURE_JADESTONE.stone, + EndBlocks.SANDY_JADESTONE.stone + ); TagHelper.addTag(END_GROUND, EndBlocks.SULPHURIC_ROCK.stone, EndBlocks.BRIMSTONE); TagHelper.addTag(FURNACES, Blocks.FURNACE); 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 c303d01b..301748c4 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 @@ -184,7 +184,7 @@ public abstract class EndCaveFeature extends DefaultFeature { return new BlockPos(pos.getX(), MHelper.randRange(bottom, top, random), pos.getZ()); } - private void fixBlocks(WorldGenLevel world, Set caveBlocks) { + protected void fixBlocks(WorldGenLevel world, Set caveBlocks) { BlockPos pos = caveBlocks.iterator().next(); MutableBlockPos start = new MutableBlockPos().set(pos); MutableBlockPos end = new MutableBlockPos().set(pos); 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 c907b07d..a95747ae 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 @@ -1,55 +1,162 @@ package ru.betterend.world.features.terrain.caves; -import java.util.List; import java.util.Random; import java.util.Set; -import java.util.function.Function; -import com.mojang.math.Vector3f; +import com.google.common.collect.Sets; import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; -import ru.betterend.util.SplineHelper; -import ru.betterend.util.sdf.SDF; +import ru.betterend.world.biome.cave.EndCaveBiome; public class TunelCaveFeature extends EndCaveFeature { - private static final Function REPLACE; - - @Override - protected Set generate(WorldGenLevel world, BlockPos center, int radius, Random random) { - //OpenSimplexNoise noise = new OpenSimplexNoise(MHelper.getSeed(534, center.getX(), center.getZ())); - float rad = radius * 0.15F; - int min = Mth.ceil(rad) - 15; - int max = 31 - Mth.floor(rad); - List spline = SplineHelper.makeSpline(0, 0, 0, 0, 0, 0, radius / 3); - spline = SplineHelper.smoothSpline(spline, 5); - SplineHelper.offsetParts(spline, random, 5, radius * 0.4F, 5); - for (Vector3f vec: spline) { - float x = Mth.clamp(vec.x(), min, max); - float y = Mth.clamp(vec.y(), -radius, radius); - float z = Mth.clamp(vec.z(), min, max); - vec.set(x, y, z); + private Set generate(WorldGenLevel world, BlockPos center, Random random) { + /*Random rand = new Random(world.getSeed()); + OpenSimplexNoise noise1 = new OpenSimplexNoise(rand.nextInt()); + OpenSimplexNoise noise2 = new OpenSimplexNoise(rand.nextInt()); + OpenSimplexNoise noise3 = new OpenSimplexNoise(rand.nextInt()); + int x1 = (center.getX() >> 4) << 4; + int z1 = (center.getZ() >> 4) << 4; + int x2 = x1 + 16; + int z2 = z1 + 16; + int y2 = world.getHeight(); + Set positions = Sets.newHashSet(); + MutableBlockPos pos = new MutableBlockPos(); + for (int x = x1; x < x2; x++) { + pos.setX(x); + for (int z = z1; z < z2; z++) { + pos.setZ(z); + for (int y = 0; y < y2; y++) { + pos.setY(y); + float v1 = Mth.abs((float) noise1.eval(x * 0.02, y * 0.02, z * 0.02)); + float v2 = Mth.abs((float) noise2.eval(x * 0.02, y * 0.02, z * 0.02)); + //float v3 = Mth.abs((float) noise3.eval(x * 0.02, y * 0.02, z * 0.02)); + if (MHelper.max(v1, v2) > 0.7 && world.getBlockState(pos).is(EndTags.GEN_TERRAIN)) { + BlocksHelper.setWithoutUpdate(world, pos, AIR); + positions.add(pos.immutable()); + } + } + } } - SDF sdf = SplineHelper.buildSDF(spline, rad, rad, (vec) -> Blocks.AIR.defaultBlockState()); - Set positions = sdf.setReplaceFunction(REPLACE).getPositions(world, center); - for (BlockPos p: positions) { - BlocksHelper.setWithoutUpdate(world, p, CAVE_AIR); + return positions;*/ + + int x1 = (center.getX() >> 4) << 4; + int z1 = (center.getZ() >> 4) << 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(); + for (int x = x1; x < x2; x++) { + pos.setX(x); + for (int z = z1; z < z2; z++) { + pos.setZ(z); + for (int y = 0; y < y2; y++) { + pos.setY(y); + 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;//Mth.abs(y - 50 + (float) noiseV.eval(x * 0.01, z * 0.01) * 20) * 0.1F; + 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(EndTags.GEN_TERRAIN)) { + BlocksHelper.setWithoutUpdate(world, pos, AIR); + positions.add(pos.immutable()); + } + } + } } return positions; } - static { - REPLACE = (state) -> { - return state.is(EndTags.GEN_TERRAIN) - || state.getMaterial().isReplaceable() - || state.getMaterial().equals(Material.PLANT) - || state.getMaterial().equals(Material.LEAVES); - }; + @Override + public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { + if (pos.getX() * pos.getX() + pos.getZ() * pos.getZ() <= 2500) { + return false; + } + + if (biomeMissingCaves(world, pos)) { + return false; + } + + EndCaveBiome biome = EndBiomes.getCaveBiome(random);//EndBiomes.EMPTY_END_CAVE; + Set caveBlocks = generate(world, pos, random); + 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(EndTags.GEN_TERRAIN)) { + floorPositions.add(mut.immutable()); + } + mut.setY(bpos.getY() + 1); + if (world.getBlockState(mut).is(EndTags.GEN_TERRAIN)) { + ceilPositions.add(mut.immutable()); + } + } + }); + BlockState surfaceBlock = biome.getBiome().getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + placeFloor(world, biome, floorPositions, random, surfaceBlock); + placeCeil(world, biome, ceilPositions, random); + placeWalls(world, biome, caveBlocks, random); + } + fixBlocks(world, caveBlocks); + } + + return true; + } + + @Override + protected Set generate(WorldGenLevel world, BlockPos center, int radius, Random random) { + return null; + } + + @Override + protected void placeFloor(WorldGenLevel world, EndCaveBiome biome, Set floorPositions, Random random, BlockState surfaceBlock) { + float density = biome.getFloorDensity() * 0.2F; + floorPositions.forEach((pos) -> { + BlocksHelper.setWithoutUpdate(world, pos, surfaceBlock); + if (density > 0 && random.nextFloat() <= density) { + Feature feature = biome.getFloorFeature(random); + if (feature != null) { + feature.place(world, null, random, pos.above(), null); + } + } + }); + } + + @Override + protected void placeCeil(WorldGenLevel world, EndCaveBiome biome, Set ceilPositions, Random random) { + float density = biome.getCeilDensity() * 0.2F; + ceilPositions.forEach((pos) -> { + BlockState ceilBlock = biome.getCeil(pos); + if (ceilBlock != null) { + BlocksHelper.setWithoutUpdate(world, pos, ceilBlock); + } + if (density > 0 && random.nextFloat() <= density) { + Feature feature = biome.getCeilFeature(random); + if (feature != null) { + feature.place(world, null, random, pos.below(), null); + } + } + }); } } diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index a7f86e22..8f8b2628 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -853,5 +853,6 @@ "block.betterend.neon_cactus_block": "Neon Cactus Block", "block.betterend.neon_cactus_slab": "Neon Cactus Slab", - "block.betterend.neon_cactus_stairs": "Neon Cactus Stairs" + "block.betterend.neon_cactus_stairs": "Neon Cactus Stairs", + "biome.betterend.jade_cave": "Jade Cave" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index c5366cb6..b9d22043 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -872,5 +872,6 @@ "block.betterend.neon_cactus_block": "Блок неонового кактуса", "block.betterend.neon_cactus_slab": "Плита из неонового кактуса", - "block.betterend.neon_cactus_stairs": "Ступени из неонового кактуса" + "block.betterend.neon_cactus_stairs": "Ступени из неонового кактуса", + "biome.betterend.jade_cave": "Нефритовая пещера" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone.png index b1270bbb3f484e4f3e909416dcc93e09deb66155..f00ff0c20e5d0121c396f1405ab5a52997303130 100644 GIT binary patch delta 195 zcmX@Xc%N~CNGZx^prw85kIZ0(?STfpl@LO?8_`)3o6JB~ep1rDUC4wj3zR zRubeF%Wt@l7%89ZJ6T-G@yGywnzR#Ex@ delta 172 zcmcc5c!F_)O1)@+Plzi614CxHNnwLSVY_qX1n;(afjw)Zr~Tr-50qdp3GxeO_zwn4 z>zDlo3PpRmIEGX(vL0-7WOfi>QG90d?S4UBYn`&ro7K$f-vXKx7oRuk=U#1}HgA4} zRf4RXDs$p5U4xs`-yN};v;7={;ja&+2c6`r=OkTJeR$7`zl1I6g1eaU`=G|759G_% W>)718^YJXu9tKZWKbLh*2~7ams7SK_ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_bricks.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_bricks.png index 2ce5712106bf8f804d283bf99fe339c010baa533..667f447f4a8cd8a5d92727ba3ea6c7f321009f28 100644 GIT binary patch delta 178 zcmV;j08Rho0m1>07=H)@0000eEe}%w000DMK}|sb0I`mI`%#ks000tDOjJd4eLQ=H zNP?DAkEB|avSgaOX$WF@NdN!-jtLF`Aq)cP;s3w9SRI#`(lioAy-;sS zE2}E}wrBWY%kY}B_@MB#t~oNFZzAV#LNlG|+G-Sz#!1JK=qrau^ur_i;d%X!hkkfO gKRluzo*&@yd`Z*-M*g!eN&o-=07*qoM6N<$g3ZK8z5oCK literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF4x)sWM8d178)5_{aAQ|X+oJS|I@jZt3y(Yypk&gFWyjM slHd2?A-DX#f9?7;KMsM2B-e+p*%POUCbWoWgIv$x>FVdQ&MBb@0J>I1umAu6 diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_front.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_front.png index 64f874ed2b007cb3b1a2c28edf24a31ce8188035..b248b45d0208e0d97a38e73cb9ae8b339d723cfa 100644 GIT binary patch delta 243 zcmaFI*v~XUrJk`k$lZxy-8q?;3=9m40X`wFK-$Jx(mz5uK0_sq_sS(FOAl&)BNNFEXRfs6g+Sz4AFRk#B)zb9&9Ua5)`VC7F5N{YQws6w0HQ|CjMr9T-8eAuc46E0fgTe~DWM4f!2xLR delta 210 zcmeBYddE0HrCu(;C&ZP3fx+5E$}dtSHcKb7+@!FzyxHTv=e~|s`)$cfGOV%nvj=CKxZytDnm{ Hr-UW|hW%U* diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_front_on.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_front_on.png index d1ceb402dfa4a3a3f8b84b1265962c9c063ee70a..7e6d7e3cd7564d718540e2018c9ca27c8397075e 100644 GIT binary patch delta 250 zcmbQnw2f(kiaKL)kh>GZx^prw85kHW1AIbUfpl@LO?8_`)3o6JB~ep1rOeu$Ini3B zesb!2HK3$$NswPK!+#85XMaZ*DBa`f;us<^)z+U;=#T*iv(t*%moxwWk8s{@?9P4C zF=K7Vnj}si!DOX|*DW2IzvY#tJvw>DV{290)LoWki5{9B1wEfX*V=t!TyN0!xaNH2 znd^1j6K^LTx+CGSSL~b{7t3__84tOZZ*$?^sgxJ|{e-}Sd&)=uafChl#PDn4Qtzp5 n8@TjO-mJekDMNb8)Gm3~Da>C_T-Yf9bQpuDtDnm{r-UW|{(Ex| delta 218 zcmdnSG>vJ3inv*TPlzi614CxHNnwLS6^(DLk@r8Cbz`E7G=)6sPKpT9mPdG4FP|Ih!==hiO$yl?eCPBV); z+3R*L(-C0WxU}I8Rx9BrIy@tcGZx^prw85kHu1AIbUfpl@LO?8_`)3o6JB~ep1rOeu$`O720 zA1J|I666=m@E;78)-U@F6sq!caSV}|YU|&~d%%DrNZ`MH<%4Mxw`eiuWFNhGRZ5C~ zsp5(62b_0)=WZH&)mp6KP>I;X7tGy*N-VrtecfRZOVOb#P2cr2R_YJ UA*4iBc>n+a07*qoM6N<$f>TRL;s5{u diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_top.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_top.png index 219c3cfe2625a6b46934c51913c48679de61969d..cf5b31c5c22fadc190242d6f898ed7f1228bb3bf 100644 GIT binary patch delta 207 zcmcb?_?mHoNGZx^prw85kHu1AIbUfpl@LO?8_`)3o6JB~ep1rOeu$`O720 zA1J|I666=m@E;78)-U@F6e{#|aSV}|>gvzQcR+z>mCWD&lijcS2qi0CSbQsFyY&XA zQ%Wa33k3bV-ajE|hmK>CR><+(H~xEv>RW=UfzBD zOZ|}#=h4!R<;Nv$bihx}T(a3V23c=Ie%Wru{@BO+bo3*vm>C&Dx zNViZc;IbKm+O-B@<4)fIz0=jvkKoKr^N!)`>?Wsg$CJ8e?|t;(U%TaZG*r1yMI+N6 Y$s<}Q5n*qL00000NkvXXu0mh|f>`WPT>t<8 diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_bottom.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_bottom.png index b82658d0822957761970c4c41b0d7dc63cd429ed..0807c5bc990aad0f07cc244a22e99b5ea4074173 100644 GIT binary patch delta 168 zcmdnWc!Y6+NGZx^prw85kHu1AIbUfpl@LO?8_`)3o6JB~ep1rOeu$`O720 zA1J|I666=m@E;78)-U@F6!P+PaSV}|I`>SV5Q88Ob3pEr@AjYE%DewAIoxBjWb10q zPq7*ttek(CWgGc+=)Rb#Zt&im|sOL`nbv delta 134 zcmV;10D1q!0kr{;Bpww|OjJbx003!sG;x4Hafd^BkV}T1QH-rymii0dkxv#~NJ&IN zRCwB*jZqQ+F$6;;Dfd6}s_xqMw}u&c2(zmQ_m%oUq(~yZAX{lj#1BU4243?GMCt>0 oEePzlDY=_YKY$JDd=~5~9=&D(Kb!ZxIsgCw07*qoM6N<$f(6Yr=l}o! diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_side.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_side.png index 032d2b562353805d9e24ee001ca459831f697abb..ada8266e726e44226b83c117b889e51f7d3b270a 100644 GIT binary patch delta 99 zcmdnZc!F_)iU(tHkh>GZx^prw85kHu1AIbUfpl@LO?8_`)3o6JB~ep1rOeu$`O720 wA1J|I666=m@E;78)-U@F6!PmdKI;Vst01{gy<^TWy delta 63 zcmX@XxSMf;ikxVGPlzi614CxHNnwLSVY_qX1n;(afjw)Zr~Tr-Kha;Bsp8he93KJa T?Ys1V${0Ld{an^LB{Ts5!@L%C diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_top.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_top.png index e21450d55ae348bdd24422eee24311d0bed61815..f6044f045f44dbb92b6d5907c361f3b47658e2c5 100644 GIT binary patch delta 169 zcmdnWc$9I1NGZx^prw85kHu1AIbUfpl@LO?8_`)3o6JB~ep1rOeu$`O720 zA1J|I666=m@E;78)-U@F6!P|TaSV}|I=9zT=zs$U6MMk_|4$~I{WvQ?ZpqSuwehRY zRDWsOWGE>AAe5`~#)C5gyg{Oe7(`$G@o`})S$1Ek>xs_Stc{KDr@!s%w_-SK$mqd; Sb!INmTn0~9KbLh*2~7b1i${C_ delta 134 zcmV;10D1q#0kr{;Bpww|OjJbx003!sG;x4Hafd^BkV}T1QH-rymii0dkxv#~NJ&IN zRCwB*%`p;yKo9~!85aKkWCQiQR4Jkk;5dGz$yGnlCP~c=sqL}R3vGfH#2sscPRtIO oNLZ{}1N*3vBo-JX(AxNz6T>k9NR-)UN&o-=07*qoM6N<$g5d!*hX4Qo diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_pillar_side.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_pillar_side.png index 76969a6f82f37e32e0d8bb3ddd970f43bd760ba0..94298f09452096e178d6102868ad7c67b6156b32 100644 GIT binary patch delta 159 zcmX@ZxSnx>L_G&H0|SGGE`KnPVo7)Ob!1@J*jMvAa59iD6yOu$T3l;W-R99WEx3P4 z)YMHWvvy~4BvpC>Wj#Dy9780g_MSh;#h}2!9Ps?j|N5Ptnq{v)+?X(7OGMt}iT?~3 z_-&INmwAb#gk{DzZ(cJ!$ki&;=HW87hn(j1`_5h1q$uHkYzt%7RHnJh9`#B94Q23j L^>bP0l+XkK{?j`e literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFWg|RY9780gruK959Z=wKj<);0|I-wsx$8VdJ8QX=nB|2ZwsUU3 z9IUc6Y~h=Lj^LX-@|#v^PyhU8_C_gIO*eBfXO29#8yb6ZlD@qDE68wNXGi+MdNHlO b@@fXvPR4IjR9FrJEn)C<^>bP0l+XkKNJKv+ literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFJinPtR%KlH7a3%9dT;y5JMU5_Fl!1+ooeCNHa@90 nS^dg{a;^XCO@2>bsCtN-^SJQ#|7Q&Ef?VL~>gTe~DWM4fR60U+ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_polished.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_polished.png index 31198aa5a89d478d08102bdd13b13f1251699397..4ab1013d336a4be3fdf269a1bffb4c41de9e872f 100644 GIT binary patch delta 187 zcmV;s07U=n0m}i97=H)@0000eEe}%w000DMK}|sb0I`mI`%#ks000tDOjJd4eLQ=H zNP?DAkEB|avSgaOX$WF@NdN!_jsX%xAqYZ2>i$<=1^cs2WuiR8xqs^% z;fhry^;MK;L0N?rHZ8UQT#`WVcdq>dGN*;~KTw3&6U`XP05lxjL6_Guk((Nt#x>HG pt@2GtJ|FMbGBR;0fWE02{R2rM0w}DX9mN0u002ovPDHLkV1g<*M#caD literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFyMt(J-usfY~en+^Nl;D&jyJrSei91iQCqut@Nkz@~#NU$vRVWn8a2HsWW*u zn6)l`RkC??e~)%T=f9+1b7E58C7hdhI7+%|N(jH5qrHd;JHNgK$VHy6elF{r5}E+X C{YLiy diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_tiles.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_tiles.png index 146e80149a30512179c3c3239dc2140abb70a913..cbfcfa8aa1a52a0d3fbc85fb748b3704c5fbc517 100644 GIT binary patch delta 150 zcmX@axQuavL_G&H0|SGGE`KnPVo7)Ob!1@J*jMvAa59iD6yOu$T3l;W-R99WEx3P4 z)YMHWvvy~4BvpC>W$is(9780go;}yddBB0g`J#OByZuG_ORb!lKe>oJ`6At4a&wyL zrLs`A`6fc!k5wlFzskoI~z{|_ame{6{?CdO%#$gs@ z!jjm=;K=3(9XZk#OtNI~v=x8rsO35nWRIt-pUXO@ GgeCy%6e)ZF diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone.png index 49aa5ad8a737078aff2d07175ded4f8fa3530851..9e756998bb1292d061235082d47589f7232a3209 100644 GIT binary patch delta 178 zcmV;j08RhL0nP!CB!2;OQb$4nuFf3k0000IP)t-s89gu`MK>f%JtOV@L%f>%qoE7DWaYMYsQ#>W}6vh;M1#Tk4p!*~=j1i>|SC;@9J6%939u zRjKz(YBc!E196!roHDxrQ&>@KD6=thm?j>oGd%Cm4q?%~2mNw9KLh*X{BsrS9=XUp` zxddTMTbK^Seo;5-7z%DwDyVFQ&9{|(P@J~z(?0oO6RLu%LoLeK^trsTjSY1N&pmIy z=l6gAzcMoX^p3y-0g9q_WYVcoG6((9-bVhfFBGC=y4Oxmx)jxMpFi%Q4lnMcsBOO( z*$F(M3;_+9Ayr4yFyxswK~vQ30nb*o8Hnj=m^Un$**yI@LmRrxjQ1(LVkcq2NLL*= zRvpf2)fr9FnSm$h-5wwWCd4Z3nMKP5p3KyE0a^RU97ES2ct&OtzCe0H8KINNfplLe z%4$MHq+?P@i1Lycd7Kt`A;$4BP6)HS0Qe{fOLXI7h%`sffzi}c4OwI-GX;!oz;Wer zIaCgZkdx;GNs>5Toah_^(LWuWGssVMag|kaeu_j#CI9P-xw6IICLJMmb5JqkR-GRDweUkvS{lrxWQN!r zG7KGPP|WdhRcFO`R3*QN#Kv`9Vqr{+3*kO38VyI9?^8%C`H^kD*Z=4H=NyAnmRh`P z9>3oFlmKbNCBdpRDq;-oZLEq0UCRQXYJPUhjOK?G>P+Ltpg zTvi>J$P-unmt5kA@|<6Xbvw9QO|0GBP_s=qX$1bV)q%*S)x)4g8ka*l)PWxZmq~Z~ zK9fphd)7(|N??@_&a*>%KD@qse=LMImb!ioOr3fD^k`RLK5#9uTsU>*M6dAPq5X4* zz8dmgTsyecFFd&Q*6~-5P43$0P{F{|d~oTHN54+&TuS}<+2!%}-i6?6Kfm+a)eB!P ze>Bx|{@mvF^bc3x-JH!n^Kr3j^-6nZ@aWlz>Uy@i-n-d({{1)ju}_ce54LUpZth6O zu6^rm-D{WT>~kA?_8$J}?^8#Olau|Gwee?<4dDL8#ZRPt2QGc{S2Ezf8QbVQv+WV| u?L!wmcQrk>;kK|;>>u;|-QLu%n^0Ll-Ef|d?5kDBLL+0V9}90VO(>J)e>%5vbx3NFS8}D`#T!aY s^7}qKB*uCAk-nMr;>+ZI9 zEfOmsATbb0(D*39M-u~uN)#UzQ7mYTnxa*R(5R)g1`|-Uiv6e2+3Vc}2t;L**_qk- z=KH;WyREi*^@6!e=3*GOAW-SAL-Q@x$je6Wr*}r2Xu4UeTx($1yv5eY!d~dT9m8@j zD8VMPNvPr_7_*5o3;|mrrXe(jtt?GwqSOvdJOo-5)l2+(_(K9$WG~U^5NJX3frwJs zt%LgR>Y&u!E_r04^Z|Tjf=2`~V2XGm7F7*C;U$v1JX%|yDFRPI%yutPW(mZbgj(DO zb$~l;PEum*Ebj8y7$@yv?Ik!%GcJmDQ4B}Y3{N|G&V#2O0!h>5Fkk0im6C;aULs~z8(JaNXBtnozmuiX$QZ)+G41Qopx}up1RB?+@48ac5OCU{W zO^9h3TGdFo2|0{Ph#JM%Xv?G|P?j<{twWC{h078Jq96uT(?D1zgViF?ghm8jhdOh7 zg#hGQLCDCsrY^BqMucHjbRsiS4!I`U2zF_Jssje>&?QjOiPS8#tkHO%4nz~`K?tMi zK-H#I#(h33FmAl4QBh?WH}1Ra4)BX6@DeP|G9+y$StiIhc)NQA&G9rnixZ%%guAZ7 zd4deba}M6YTmeNXBa5c^uV7i?!%&Zj$Y3QVwgO61TM0blM&1XbP)CB1YFttaLErP_VjE6;Tf!O|7B|p3DMXl&tLb5|R~GAQP$2$_;y9 zmNp&%i1d1~p2Zk2Y{o?$l(iyP{g+&#kn)sOhqHE2SDTnTyR2r@aMTE_Wu^n6O{Rwd z6*Vp$b*T1DZ*v%y)e!KP1&dAyb)Q!sr{|aS-%~MKa;OKpyJev^esueuv&*L&^Lxh* z_B8C@9BgU!pP4sN)%Nkeb%*aN{p8Z{cgJR?Pj>7%@YX4+=BZbDl=erevbo3N+O6Tp zvEN4jnwV{d#d$*_N08 zK0UM|Yh?ZTTrW2B`*iTxWp7>@wQbfuc)u_3V+rhueAB!7iR`J3f9}KfVk3Raz95#A z*FUps|QqQU%a>f+^+5Ci+1dP7#>|T*ni}v z@tp-y;4^o*xcm8mRc~y;T%m8b73XR*5=7o_8nCa8)&V zQ|bVfH&pQ6Pq&R+Fw32bCfg?OY*=a!)bY7ncisPD;U9=d3Nrd5w5dw|*djifaErdCR7M0KuF^dH?_b delta 224 zcmbQs`;l>iWIZzj1A~Sxe=v}e3-AeX1=51LrV=JLvX+iYc5ccJo~j-`8vg$JaiJ!8 ziC=mZHUm{~l?3?(GyI2vx=xWWplF4si(^OyBkRFNUls?RBM$j_j2G*-_D`8H^Iw%D z&w|IHmIoVLswx;5SY}&G?R4B;Hs^_OWW@fN8w=h~X8HNsYK@Z+2ZM;3Q-FK$ruXau z3KtIK-Mh8bTFh}#Ag5?v+wr|R%T}_~oDe?c6u_q#wkXBW@#WhC2laT4+uP?v>Cg0@ R;|O#FgQu&X%Q~loCIF0qQlkI> diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_front_on.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_front_on.png index 5203c612b123993a0e2b0dcbb856410b34b44fde..899e1c14e17014078afc642f8adde598810d2e15 100644 GIT binary patch literal 1783 zcmbVNe@xU?950HBf+zEW}8i3-+O(Z z_xb+*_Ct5s@|iQTXCMeNv$Vun4(D0=NSg}Z3r6pAaGEZcRH+D(K1UxZ$j**=2$Fh3 z^i*n;ss)BfP=;s(S-d17b9^1p&|2UVLo9al_$dq(1r}Rvc9AaG0sLY~ zQ~?#yG7lfE2gMCg&4s!(GUHGHr%8%O zk^&Qfa!;s?IvjdnZ0M`2#gHI{)kP270ZvW>EM_E)6i%9OBjusYjLDWy(hNzC<6M#; zdK(|X**z4^&}N3DAA-V^5jc(eSFpe{UP%dZ&|oph`2Zn@d>EQ^Bjb<)k^%)o)#$hu zE*Dc8QZ+8bgHk7pL7NStC@?mw%`BMA0&cQ%G;Z>mY`D#6p>aXrY&O~os9M1^ao;KN z^?GC{?hF6({t88emBj^~nn$lUJtdeDQH8;3OjJY#Sf5x0L^PfS49Dx)&0@SBRv=)B z&*D>iV4ODW2axnhu^z{$l2;3J3MlkJSN)e+adYfC% zo|{Cc=f88tN7lD)nPRa#H|yuz+`PAjiejUj zaPGj-b8D*5dBfdpuAb|`E9#ZydC?hK;cw8d_HxKFdt$y?~C5ZoX$jew=f0YEARonHSz&0b(b@KP^}< zQ>S+@D^rok;q7~uUEEWBhG%= ze7Sb^`AvAoK4+aP=hFlD{L5qgqjiHPdQZ;1Y9?OUwe9;|`E>iDEdHu{@bfQkf44pR z>-Rg69k*IqaztG#L)#8-5vC5VrT%jQB^T;@#g~ zI^D7V*lpKeMOEE}9rmvFmUY*2GBcXDZT+J^!#(Y{wj&#UjW%~)!tah0+|M~M`}Lmg RwVnE}skFGvd8lY@>p!>ZYcc=; delta 305 zcmey)dyr{@WIZzj1A~Sxe=v~p4)6(a1=9MqmIe+sF3wh&KIYlJmf8MRJEHVKmEr;B4q#Vy;O(^*W649ttmB3rg`Kl}MV{#NrPgW{Ra z8?2(YuZ`?Iw(0&V!<>)x+XN8{d=LYddQcLd)Cc= z{pT0U(?6^Yuh(Q<$+@lO8JoO}VSi$4CleFPh38X3R8FS!uD$zgtyXOInX)9^jj{{- l-WK>JaW7Muq^3Es{*|N9*7{ie4M2x6c)I$ztaD0e0sy`Hj6eVY diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_side.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_side.png index 3bd81825c85cec184890dd6efcbd4be34ca5fa8e..ecf9569c344d51043b2a498a9281d618a72aae71 100644 GIT binary patch literal 1661 zcmbVNe{9rL9PbtkvV}1bgFh0i-2yYL*Y?`Gu64(<-3@lcn{zw&!)3x-`|hsp`h&LH z-OXr(Oae0q`|*d$0zphPN^nFBX1Xv96O0l=h!N2k(Kyfr5VJu9viN$tU4TGTn!LXE z`abXT{r&CMy4p1h^B&H_Fl=G4CQy&<B8Yi{3l>VqP>YFlt&X49maY89CUSLl0uu zyz@%9*=`O!DN4HP0k}YF310S9c*ZG7h;d+6t!(NYz72?=&S?-G$UFa;z~#zX^e@n_*p# z&jqS(PG#KhcLGy}mozDwtS79;Z@2>kz=l4;O}iPA=14aaW;`NSwvuK=nx4glbXkd{ zZovs*h80;(r1_hmC}m_|gMS6fk{HoV6(EBZ6+|IrXi);sx>5A&aot3Mk!oyOi%>`m zYL*Q&2?hf`0@>_R6j>A^oCibzPjWObkP(UFNTJMAMsh3w0sy=a0onTjUFviqJ9l6H zpZA|K6;xRue%Cxsy*Vi%)+iPVRw`2w4RAwd6<6?d7KlJ{vfD>UPFSH#WIii*?SWa^ zL<}O*JH>hyW9bn)0ZdpKMXvfUxkMr5DW?u+?VxToF@1JJ&CbD5BXE}44um$@9tJhk zxJ=Zc_C503YZ#W}4F)R1CEv95x2+wg3t!pGogZ&hp9#;qG){i}5PxR#i+%ZT8GB|9 z{-UnC-ak-qz#m-k2FpfYDpV>b|zn?tPLJsGy7_B}0!m9kC$t|Ddy3Vf>#q)n?`^}!Ue00*hFS4ZJO3THjT%PbQZ9CV$ZFTSVO~<3e%U?X&`&_8^ z^1$)W2fQEEcz#ZN?=?Sspnc8AwbqSgCrGViWL@L2qg9^M!v&N+BJNz|dHd9Xoz{}6 vBRTIbA8kJQ*NL2o;rDtDe)_}U*HiPaSbtVcPR~S~A4IUaHn6{H{ic5aN<%n0 delta 196 zcmey%bCq#|WIZzj1A~Sxe=v{|4e$wZ1=6yXj>-<6svbTX{{H%Lp(c5Wohy&I10~o? zg8YIR{)55N`ena?LK&Vejv*C{tOpwlSri$V4QD1_sy}?*ZCCwXS>DpB?Rzp(cKWwI zc=_&W^u56Mujl1lyJiu4YctzRu`JdYv*du?w%^ziANSp7*n3%2mizpj6V~=RZ{MYT sIVpaFi~s-t diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_top.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_top.png index e256c6a411d99a0159abb74a2af906ca00a3c475..c81182e21fb0e37b09ee79a08383a3571dc77188 100644 GIT binary patch literal 1652 zcmbVNe{2&~96!t=44jSuhCqay?^l1_jc$~7u9bDvt+E;d?t1syo^9`ryDROQ z5h8y`784ahG@!6RLNJs;1_6?i$gHa`;>T7Vb{7v?qvqTxUg^(Y!Z zZ5BH&P*xgsuolWrvb6PClqM+$K{^PE!AXiE?Ht3Rr3Zu3G%?C`c%LiDf;$%$Hw={{ zh)gD9$uJg0ixCvdvII#JG>t<9uJ_0WpT%W;S((8LbU~9;LsDeaWaJ}C+Hhe|)1nC} zwL&ZFB{xBb5m{a(C<|$tQ~-)X1*fL9WI?zn5FiOsKsI!Ur7Bo8t{93QR~|rJIlfB( zbZsC|k#S#LQmKjv-Duei%_uqKzGywvqXMD>=t^1>K+9&R<}%Y7mGfwTHxwyutq~SQNOZqNR9fu$1CsfKcTahF09jd6cB0LBUWprl3V2!1-m} z;AH{$y)F#eY>_09qgav_Xx@oCt+arPQL6)wL~L*yWdw$|vsS@LmG65MA#Fysd|&*Z z_t$C?tSmnH&^%_nnJK~fBpn8;r&JN0U{h(8l+Z#JaJ*nmm8g;7HQ0qeSNtXe(_EtgTo(AoVYx^t~RmwcGd0m z4f!hf+-t4a#>;=M-zbkwI1gRF-PO?)3=WNRe%1EQ|voSCKn0nILYXz_ilN6 zx^86O_=f9_@P>iql6$-{_L-w@L?N=b1pV-=SlS3(^WO+zUbcJZ7(eeib=qA$&bRJ*bagNH#G!nLv6~vbb>rso kd~WFCjWbh+kLLLmTQBr22z%(sLG!=hZ)x{_w7PrSKkl40UH||9 delta 199 zcmeyubAxe$WIZzj1A~Sxe=v{|4e$wZ1=6yXj>-<6svbTX{{H%Lp(c5Wohy&I10~o? zg8YIR{)55N`ena?LfM`!jv*C{tOpw#?-($!D26Rx^1p3u<&OW=)>5y&AKk?lbJYeDz}ggEPLL`yRf2 xqqaQ%_~c#b?`yw2h~NFR+$3bDzpL_P`IE{~8iI-W9YA{-JYD@<);T3K0RYdeSO)+A diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_bottom.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_bottom.png index 840741b458a54eca6fe460e295bce72065e2ea91..3e78f2dc0bca115a9b872ddde028d464be1bc4c7 100644 GIT binary patch literal 1523 zcmbVMTWB0r7@jmX#HJNXMXD%{Q^XcC_s#Ciq2rqFB;AEh49P-MQQFCwv%4pmnKRBz zva?YzDWX(-_Cfn3c?@bAC_)Pn6e$$ciVA{nUhqW^&|(cs2Yf$W?$&6Y@r*fAl`Lpi6g z1znKylCI=NSw)fyqErxNm6v27<$ zNHaQg-5X@uF)}zsQe}4aS~bM`GaDIW}`6C=r*0R4`Rd?Py_HpyEfd?L$;C4UXC@VC;aJCKr(7 zP{k#v^EE98c}-Py-c~dX&KI0Qu2AT|Hwj!yBin!P{LlAKhnQBD?cOm@T5oAefHIC~ zuv)!}m_^U`RxV~cSpaO9X1Bq?G_1(sddK*VJA?;8`eB*x4C_>^=a_J>t-YfiJIZZ0z2Csa-p@x^V5cZy)yur=Q*N#c=+<^#@FN<@GN|4o)5Y z{8&7?`XTd!8@|2w>z$X*Z=Ks*!})ubzZqI}U)3L8-}_eW;@a@JzenEqY-sa}_wfRA kK6wRybpIgxf%dDqk14(uJo6o1kkYnXnV2%)IdbasKPyh|M*si- delta 164 zcmey&y_Io-WIZzj1A~Sxe=v{|4e$wZ1=6yXj>-<6svbTX{{H%Lp(c5Wohy&I10~o? zg8YIR{)55N`ena?LLQzjjv*Dd=Jo~(F&MHqt7?9?|Fr7et#8}gBr7>KujcqZ^_RmE z52bwy(U~4c_}yNz#eL>=dBt3z%kgHr=FZuEvi1$UuWH2JXvytOW3-?BeXkYJPzFy| KKbLh*2~7a@A3V1J diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_side.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_side.png index 1c916e0a0b2ca0a2b54a0cf3c75103712bbefae7..9e3e91e5890f81eca543ddd18047f4bdd81711e4 100644 GIT binary patch literal 1573 zcmbVMTWl0n7@nncZ7~fXi6Q#HI2B{n**P<_w>e>`>rQ1ic572MQW6t8d*Y{$U5JJvA_Gmy<_6ZF3!c>BWiyJe-J(_g=n+3hjRt($^3#Ju|YW`n%oIgoSGxNK(T zT)cB`ERW`5d>qKtQPpG*B1k%(#`NaRUjsf-P+O9>t1XtWzdF@yg@|s=L=$8K9xf z<+?Vm>x*S|O?dvu9!jGfkn5to{H%k83G9&>7vYgT)Xl+wjRVsz)_vmU38{1vHQsTV zO{aszB-wj+nYKZy-p~~?Skry1auSe49z=Ob%!@G?P2LY=2tW&$BZgU=y#}Y`MH$L6 zl&*%-k}-5&|5vbqV3D|%P6?ZqUc!Q7mpHZ?MwliQ;!?xZHM!|UE(f!==j%4YSxx0A z=ZI+WZ1E7TrP#c?qGvmBItYSgcLLE(cZOk`4lb8YsJm`I{S%#T z-(&j{?t=9FpYy9<%MJZxuNe*<3IU>y#`Wbp!}q-)T-vcd`on`CZF=|P4A_v0 zKk>)QBjVE3-)9@_E8h)hheGVLZ!SS==()oFU(R1>q(Xht!in(sue}F*UV6KH_dQ$Z tm)_}r;k}=SHrDH}-Io1)lsO#x>rCa;nX|zl&yI{~?>{s({|_VE3Sj^M delta 170 zcmZ3=vzu{(WIZzj1A~Sxe=v{|4e$wZ1=6yXj>-<6svbTX{{H%Lp(c5Wohy&I10~o? zg8YIR{)55N`ena?LVlhujv*Dda{C#%4j6DSpFZ>RzxsKrWv`LC$0%b-a=U%@rH8S*DTCj_Wi+TvCjrKly#)P?BAyM)oH?XvnRjr@Sa@CxX5|? REp44$rjF6*2UngEe%LFfPg diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_top.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_top.png index a43f39814e77641cd850fecf38cb1d2049147376..2ceefd0df7b2d6439cf0dee7929cf94e083b1056 100644 GIT binary patch literal 1548 zcmbVMTWB0r7@lowjqL^mL8B2oPAOWN*}3g)jvaH^P29yy49P;b55>&RoZTI>GiRKc zWM@;c*`ydM6ns)F6@2i`qSivGT8Icjq4eTQv7%3X>5GUr)MB!p*~`$D7PSLs&h0zj zfB%n8PrcB;lF9E`s0UWUzxkB9>${ zJ}!Wi6yuYeB*ce+!0{=TOR>Dja6IIaP?SLTqlq*}FTLHmHIDu!lI3w@{J^|zDy_^U+u7gvsZj>8$;G_aCLQ#agcpH?Y zjIMg>zk+oQma${1#9+fzD~PqN3JpRx!VIoqhX^LBiES+u1?DZ+Q!NeUvocL=jv0my zr9?>-kPv4iUXL>=A)a8;8kb-sDU~jzxj0Iq@O>6*3qfRi@Ad!r{w2pCm8I71n3bx`T0X*{iD# z8m$ml{g+%~iSlevhaEfEJ56lg-BPnXIB5jIGVDNP6ZSAug0*4@iTn`0xVB17k&JiT(GwLbh>E^HTyo@*!lLAH$GdL8~f_f%iOVVOVqZ3wb#pAsGAS^*AG3O RITG~i{P delta 164 zcmeC-*~&OUvYwfNfk8u;KNv`f2Ka=y0%=)GM`Z_3RSzExe}DbBP?NmG&Xvd9ffDQ` zL4Lsu|G{8s{j%RcArDU%$B>F!bI%$IH8=<`IZBHC`=7%6bx(-qBEAO}bxTi%+Fwxf zJj=WC?Z%7TxlLk6WV4(7&hX9jh*%TN{CmYjSrst}l?%6i%n&|o$mlWUX1W*9PzFy| KKbLh*2~7ZxYdh}% diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_pillar_side.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_pillar_side.png index a56e2bfbb7bd8c57dbf668d1f4137a63b826717b..502ffa0ec1157d2b52ec157d605dc72b1fccc00f 100644 GIT binary patch literal 1509 zcmbVMU1%Id9N#1*G&O;u2&MWkY(Xk!Z@)L$p=+AnrslMpgyf*pABt#-B8o49UvE*cinfJ9)B043h!qu|N+}5X&=zO!V`)o^Z5L+e>o>pu z_kVq6>V=^lyLWILH&mFkXW6_n9ou`^|E;&H2Ac-L$s;kxJ@!O8dbsya?&7#@SH0qV zGVdIMnEE;7(h|uv{E(qJZr@lVM0k-TphPNOVDZan z#0CmQIVYtiwSX?paN$x^YYBI;NNU6o}Q=d+Or* znTR-6k#%PjH$UNwI+o5h@gZL?=P73Qi3 z$t95~FQ#?awnMzz#Ma$yHQR-=MvyME4#YND4B~UclPg zKlsTj%~$@qerfuH(9A=-rDxl*{utGBYk5V16!5f7tWqL*uVeiGyRYEZ0^4DVL$4#j=ywrz*z%Nz5K(q zUr+t^N$=%w`lI!{e&g1vv7W1r literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF1f@+r*Np& z*5|*jW!Leur`2UV7;+zMYWysb;9+z?)m+@fZnx_H$LIRYw`|pRj@)@`?+Td({p@Pa V5=*CFS^ETJqo=E%%Q~loCIFb(H?IHy diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_pillar_top.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_pillar_top.png index 95a3f10ea588fc46db57b84d8f9a63421eaf677d..7879b95f239d3f5ce34faa7eb36aee09774db037 100644 GIT binary patch literal 1552 zcmbVMTWB0r7@pl$yKSvTqtYgzhv|b6otlz7rb6P9l>`;bh%*DVkvhvUL|3(>MTAxNJEZyYj&j3oKJ(clYap?&fgC8kzI( zuDP+IF*j|fCY!w%4AdbduyKGu-L5)5tZQtO7t(cj%(I{g38po6C=>`L^>L6R9tQo% z6laKv1k!3!ObM!_+zli_O!GpT7iCTmp^$>I3fdn_rFmuvPUP=z%c47ttptG!dA?Sw zC2Mk$cx7HxRh1VcUXnP9;QU!9Ky}XXw|5xw*f%`O4J_h-kP%IhnLuNyrY#d}H==d? zwwtKK_&RcVF)4&5HG!rP;oKRo+7xaYJg#CJJAqHJVuW=oBp`l;T!A{ezDNLdt*%Eh zE~|@eM&@oYp5wro_!yz7)%5V;ZNNR@b0FjY-%YN6|};P?S@3|z=-EVVgl zSte9PQz|J_h!b(Y%B3@kz#+p_xJ(91X-O7kA(QUB&l6)NjBMw<`9I%3=vlO~Q1z;L z!g>o+0*+Wd4c2VCB6i^?+pDStnppsm5oWi>8ev$m$+nNJtM)*PwpPKE^h&XAVSG{w zYRJPwW$LQ`l1n^Qo)7D=We0z$iOstUYPJKXjUZe`9f)qC9)=y-xIEgSUe@opo_4oS z3i+X8-)DyM^l!#3%YUqWbK=Cl=Z?Sd-Re8pfqfq(zF7VF+au)hrN7Vr*xk2q^kk#a zczxUQx!%P7wfJZvvH3<*9{svUn2+^txaUyp=Hc#zb&J>T%r;(KI5>FI$!y>LMe$Vp zaQwZ5wshdY+PQ6K=n=E$_n%g;dAk=Je(TRz!nFo}z3%0XU^(^**6ZI7@DEB9anYDy=B>FeF*-Cw>*VUZ)^xokVzwbsTTBmU8rXFga pdh?{-WOb84OjCF5B-Z}vv7kNz76N?|%}u#+#i46|{oH+q=aLjw%6cE!kz zlkxO3K*OdV>Nt=5HPfbOh8f;fv!OPD2%ASm!&13lKUw5hLsz-6P+CmeF;p^=Qx4iY zmC0#S6PluPyB=qUYk(4%h(NYxmMs_5RIbSj=-N9LIJOBP6Dl|231r99qihU2hzgEB7ztZqyR5UKn#O`!nQw-N^|rA$i{cKWzn6=l?btcAXKYW ze>LF8PEn8)MG-_)o1qoKqkRddj@#s)D5L4ute#^p|+Mms9Av6vT_ zD7$0KuykB?hi-a<;*cPflSNtL#UL+BIVl8!(Vb!dh++$u#=23c--c6iQUC-ZK)w}9 zQ$~jb{wrA5Kmj`@qy`%%EF!_SiX7W@BZ%QLcBo*gTA-;#It@~mOQ5BpR9xk#&3?ns zfeeF6J{%43(MU-0(h>3bycXm`AtkTLFd8U8rSm?HwTc(n&U^iTzJJy+Xl23jJ@a_= z=A{Hk8ZHf1yACq6XCw1(k43*fdTiyPHS50ct$BL6 zeC_D9opbx=dy2h7Z=Igo-v9aUSNq?+*z@3Z=Jaai!{m2A*q7#_k#8SJUFkWsKGk4$ z%h`SL*9O4qecNhV!1THIe%pA$c{s)GDP0H-j=%%GVeb>p=WpV$)L9dmk5}EkIlP}Nw1M#;BW&i*H literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFkiL``tv;EkB%ayJ1PDZBl9@S|?|1or zw=?r|2eyxnjY^WVy7Y9}2W2?VIj|m@H8aYP8`6mc04d6&ZN0B_E!2pc58p(<`k+^w7#& zg{&-*f-6r?fqfk$6!?^5(D7SAj5?Ow(~HD9IaX!RgYYFwo=FUXsxuFYETUjClU0aj z>L6FhXjxd$%?Y4GEvLeqsu>E@5X>T@00xgNtVM1eE!eLQY>AyEH#rZHs<}9i()*2>ie&{kN7L&x}!Jflj z;Iel7>RmF_#++KR4s}g|rlM;VZ4#OJacCe2`#6WWUcGxCu29hoWaJPu?}3VvaWTjL z3U&#qv&hGSu;=3jRl}emgEWk&$XYBChJ|ZJ&kM&v|LFr==cLkf+_dNyA(-J!hA$a0d|p}hM)<===r(OJ0l$a<1~OG*NjyjUcw zJLrf*^u%D*@<6W&5GF}=TQW(~N(F=dvG>Rk=*zd8R49E|uKSpn)p;97bfzIf^X$QPQ=gyu`m41a?%#j@zVpbA3;EL4+^)^dV^^v_{rJwgFFss Date: Thu, 29 Apr 2021 18:08:18 +0300 Subject: [PATCH 461/463] Fix terrain block --- .../ru/betterend/blocks/EndTerrainBlock.java | 5 +- .../blocks/basis/TripleTerrainBlock.java | 6 +-- .../java/ru/betterend/noise/VoronoiNoise.java | 43 ++++++++++++++++ .../terrain/caves/EndCaveFeature.java | 4 +- .../terrain/caves/TunelCaveFeature.java | 51 +++++++------------ 5 files changed, 69 insertions(+), 40 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/EndTerrainBlock.java b/src/main/java/ru/betterend/blocks/EndTerrainBlock.java index 2c378e88..ae1840ea 100644 --- a/src/main/java/ru/betterend/blocks/EndTerrainBlock.java +++ b/src/main/java/ru/betterend/blocks/EndTerrainBlock.java @@ -74,13 +74,12 @@ public class EndTerrainBlock extends BlockBase { @Override public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { - if (random.nextInt(16) == 0 && !canSurvive(state, world, pos)) { + if (random.nextInt(16) == 0 && !canStay(state, world, pos)) { world.setBlockAndUpdate(pos, Blocks.END_STONE.defaultBlockState()); } } - @Override - public boolean canSurvive(BlockState state, LevelReader worldView, BlockPos pos) { + public boolean canStay(BlockState state, LevelReader worldView, BlockPos pos) { BlockPos blockPos = pos.above(); BlockState blockState = worldView.getBlockState(blockPos); if (blockState.is(Blocks.SNOW) && (Integer) blockState.getValue(SnowLayerBlock.LAYERS) == 1) { diff --git a/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java index 7e7bdbf1..e9f013d6 100644 --- a/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java @@ -83,14 +83,14 @@ public class TripleTerrainBlock extends EndTerrainBlock { return; } else if (random.nextInt(16) == 0) { - boolean bottom = canSurviveBottom(world, pos); + boolean bottom = canStayBottom(world, pos); if (shape == TripleShape.TOP) { if (!bottom) { world.setBlockAndUpdate(pos, Blocks.END_STONE.defaultBlockState()); } } else { - boolean top = canSurvive(state, world, pos) || isMiddle(world.getBlockState(pos.above())); + boolean top = canStay(state, world, pos) || isMiddle(world.getBlockState(pos.above())); if (!top && !bottom) { world.setBlockAndUpdate(pos, Blocks.END_STONE.defaultBlockState()); } @@ -104,7 +104,7 @@ public class TripleTerrainBlock extends EndTerrainBlock { } } - protected boolean canSurviveBottom(LevelReader world, BlockPos pos) { + protected boolean canStayBottom(LevelReader world, BlockPos pos) { BlockPos blockPos = pos.below(); BlockState blockState = world.getBlockState(blockPos); if (isMiddle(blockState)) { diff --git a/src/main/java/ru/betterend/noise/VoronoiNoise.java b/src/main/java/ru/betterend/noise/VoronoiNoise.java index b1a9a619..0106d7de 100644 --- a/src/main/java/ru/betterend/noise/VoronoiNoise.java +++ b/src/main/java/ru/betterend/noise/VoronoiNoise.java @@ -52,6 +52,49 @@ public class VoronoiNoise { return Math.sqrt(d); } + public Random getRandom(double x, double y, double z) { + int ix = MHelper.floor(x); + int iy = MHelper.floor(y); + int iz = MHelper.floor(z); + + float px = (float) (x - ix); + float py = (float) (y - iy); + float pz = (float) (z - iz); + + float d = 10; + + int posX = 0; + int posY = 0; + int posZ = 0; + + for (int pox = -1; pox < 2; pox++) { + for (int poy = -1; poy < 2; poy++) { + for (int poz = -1; poz < 2; poz++) { + RANDOM.setSeed(getSeed(pox + ix, poy + iy, poz + iz)); + float pointX = pox + RANDOM.nextFloat(); + float pointY = poy + RANDOM.nextFloat(); + float pointZ = poz + RANDOM.nextFloat(); + float d2 = MHelper.lengthSqr(pointX - px, pointY - py, pointZ - pz); + if (d2 < d) { + d = d2; + posX = pox; + posY = poy; + posZ = poz; + } + } + } + } + + posX += ix; + posY += iy; + posZ += iz; + + int seed = MHelper.getSeed(posY, posX, posZ); + RANDOM.setSeed(seed); + + return RANDOM; + } + public BlockPos[] getPos(double x, double y, double z, double scale) { int ix = MHelper.floor(x); int iy = MHelper.floor(y); 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 301748c4..9af35a84 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 @@ -146,7 +146,7 @@ public abstract class EndCaveFeature extends DefaultFeature { blocks.forEach((pos) -> setBiome(world, pos, biome)); } - private void setBiome(WorldGenLevel world, BlockPos pos, EndCaveBiome biome) { + protected void setBiome(WorldGenLevel world, BlockPos pos, EndCaveBiome biome) { IBiomeArray array = (IBiomeArray) world.getChunk(pos).getBiomes(); if (array != null) { Biome bio = EndBiomes.getActualBiome(biome); @@ -210,7 +210,7 @@ public abstract class EndCaveFeature extends DefaultFeature { end.setZ(bpos.getZ()); } }); - BlocksHelper.fixBlocks(world, start.offset(-5, -5, -5), end.offset(5, 5, 5)); + BlocksHelper.fixBlocks(world, start.offset(-2, -2, -2), end.offset(2, 2, 2)); } protected boolean isWaterNear(WorldGenLevel world, BlockPos pos) { 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 a95747ae..c414c6a0 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 @@ -20,36 +20,10 @@ import ru.betterend.util.BlocksHelper; import ru.betterend.world.biome.cave.EndCaveBiome; public class TunelCaveFeature extends EndCaveFeature { + private static final OpenSimplexNoise BIOME_NOISE_X = new OpenSimplexNoise("biome_noise_x".hashCode()); + private static final OpenSimplexNoise BIOME_NOISE_Z = new OpenSimplexNoise("biome_noise_z".hashCode()); + private Set generate(WorldGenLevel world, BlockPos center, Random random) { - /*Random rand = new Random(world.getSeed()); - OpenSimplexNoise noise1 = new OpenSimplexNoise(rand.nextInt()); - OpenSimplexNoise noise2 = new OpenSimplexNoise(rand.nextInt()); - OpenSimplexNoise noise3 = new OpenSimplexNoise(rand.nextInt()); - int x1 = (center.getX() >> 4) << 4; - int z1 = (center.getZ() >> 4) << 4; - int x2 = x1 + 16; - int z2 = z1 + 16; - int y2 = world.getHeight(); - Set positions = Sets.newHashSet(); - MutableBlockPos pos = new MutableBlockPos(); - for (int x = x1; x < x2; x++) { - pos.setX(x); - for (int z = z1; z < z2; z++) { - pos.setZ(z); - for (int y = 0; y < y2; y++) { - pos.setY(y); - float v1 = Mth.abs((float) noise1.eval(x * 0.02, y * 0.02, z * 0.02)); - float v2 = Mth.abs((float) noise2.eval(x * 0.02, y * 0.02, z * 0.02)); - //float v3 = Mth.abs((float) noise3.eval(x * 0.02, y * 0.02, z * 0.02)); - if (MHelper.max(v1, v2) > 0.7 && world.getBlockState(pos).is(EndTags.GEN_TERRAIN)) { - BlocksHelper.setWithoutUpdate(world, pos, AIR); - positions.add(pos.immutable()); - } - } - } - } - return positions;*/ - int x1 = (center.getX() >> 4) << 4; int z1 = (center.getZ() >> 4) << 4; int x2 = x1 + 16; @@ -92,8 +66,9 @@ public class TunelCaveFeature extends EndCaveFeature { return false; } - EndCaveBiome biome = EndBiomes.getCaveBiome(random);//EndBiomes.EMPTY_END_CAVE; - Set caveBlocks = generate(world, pos, random); + EndCaveBiome biome = EndBiomes.getCaveBiome(random); + Set preCaveBlocks = generate(world, pos, random); + Set caveBlocks = mutateBlocks(preCaveBlocks); if (!caveBlocks.isEmpty()) { if (biome != null) { setBiomes(world, biome, caveBlocks); @@ -118,11 +93,23 @@ public class TunelCaveFeature extends EndCaveFeature { placeCeil(world, biome, ceilPositions, random); placeWalls(world, biome, caveBlocks, random); } - fixBlocks(world, caveBlocks); + fixBlocks(world, preCaveBlocks); } return true; } + + private Set mutateBlocks(Set caveBlocks) { + Set result = Sets.newHashSet(); + caveBlocks.forEach(pos -> { + int dx = pos.getX() + (int) (BIOME_NOISE_X.eval(pos.getX() * 0.2, pos.getZ() * 0.2) * 5); + int dz = pos.getZ() + (int) (BIOME_NOISE_Z.eval(pos.getX() * 0.2, pos.getZ() * 0.2) * 5); + if ((dx >> 4) == (pos.getX() >> 4) && (dz >> 4) == (pos.getZ() >> 4)) { + result.add(pos); + } + }); + return result; + } @Override protected Set generate(WorldGenLevel world, BlockPos center, int radius, Random random) { From bbf7169ccc1716a93742128d374c8ca65704004d Mon Sep 17 00:00:00 2001 From: Aleksey Date: Thu, 29 Apr 2021 18:11:42 +0300 Subject: [PATCH 462/463] Armored Elytra --- .../client/render/ArmoredElytraLayer.java | 52 +++++++ .../betterend/interfaces/BreakableItem.java | 5 + .../java/ru/betterend/item/ArmoredElytra.java | 57 ++++++++ .../java/ru/betterend/item/PatternedItem.java | 2 +- .../item/model/ArmoredElytraModel.java | 73 ++++++++++ .../mixin/client/CapeLayerMixin.java | 25 ++++ .../mixin/client/LocalPlayerMixin.java | 45 ++++++ .../mixin/client/PlayerRendererMixin.java | 25 ++++ .../mixin/common/LivingEntityMixin.java | 130 +++++++++++++++++- .../betterend/mixin/common/PlayerMixin.java | 33 ++++- .../java/ru/betterend/patterns/Patterns.java | 4 + .../ru/betterend/recipe/SmithingRecipes.java | 23 ++-- .../java/ru/betterend/registry/EndItems.java | 30 ++-- .../assets/betterend/lang/en_us.json | 1 + .../assets/betterend/lang/ru_ru.json | 1 + .../textures/entity/elytra_armored.png | Bin 0 -> 725 bytes .../textures/item/elytra_armored.png | Bin 0 -> 498 bytes .../resources/betterend.mixins.client.json | 5 +- 18 files changed, 472 insertions(+), 39 deletions(-) create mode 100644 src/main/java/ru/betterend/client/render/ArmoredElytraLayer.java create mode 100644 src/main/java/ru/betterend/interfaces/BreakableItem.java create mode 100644 src/main/java/ru/betterend/item/ArmoredElytra.java create mode 100644 src/main/java/ru/betterend/item/model/ArmoredElytraModel.java create mode 100644 src/main/java/ru/betterend/mixin/client/CapeLayerMixin.java create mode 100644 src/main/java/ru/betterend/mixin/client/LocalPlayerMixin.java create mode 100644 src/main/java/ru/betterend/mixin/client/PlayerRendererMixin.java create mode 100644 src/main/resources/assets/betterend/textures/entity/elytra_armored.png create mode 100644 src/main/resources/assets/betterend/textures/item/elytra_armored.png diff --git a/src/main/java/ru/betterend/client/render/ArmoredElytraLayer.java b/src/main/java/ru/betterend/client/render/ArmoredElytraLayer.java new file mode 100644 index 00000000..a03fc81e --- /dev/null +++ b/src/main/java/ru/betterend/client/render/ArmoredElytraLayer.java @@ -0,0 +1,52 @@ +package ru.betterend.client.render; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.ElytraLayer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.PlayerModelPart; +import net.minecraft.world.item.ItemStack; +import ru.betterend.BetterEnd; +import ru.betterend.item.ArmoredElytra; +import ru.betterend.item.model.ArmoredElytraModel; +import ru.betterend.registry.EndItems; + +public class ArmoredElytraLayer> extends ElytraLayer { + private final ArmoredElytraModel elytraModel = new ArmoredElytraModel<>(); + + public ArmoredElytraLayer(RenderLayerParent renderLayerParent) { + super(renderLayerParent); + } + + public void render(PoseStack poseStack, MultiBufferSource multiBufferSource, int i, T livingEntity, float f, float g, float h, float j, float k, float l) { + ItemStack itemStack = livingEntity.getItemBySlot(EquipmentSlot.CHEST); + if (itemStack.getItem() instanceof ArmoredElytra) { + ResourceLocation wingsTexture = ((ArmoredElytra) itemStack.getItem()).getWingTexture(); + if (livingEntity instanceof AbstractClientPlayer) { + AbstractClientPlayer abstractClientPlayer = (AbstractClientPlayer) livingEntity; + if (abstractClientPlayer.isElytraLoaded() && abstractClientPlayer.getElytraTextureLocation() != null) { + wingsTexture = abstractClientPlayer.getElytraTextureLocation(); + } else if (abstractClientPlayer.isCapeLoaded() && abstractClientPlayer.getCloakTextureLocation() != null && abstractClientPlayer.isModelPartShown(PlayerModelPart.CAPE)) { + wingsTexture = abstractClientPlayer.getCloakTextureLocation(); + } + } + + poseStack.pushPose(); + poseStack.translate(0.0D, 0.0D, 0.125D); + getParentModel().copyPropertiesTo(elytraModel); + elytraModel.setupAnim(livingEntity, f, g, j, k, l); + VertexConsumer vertexConsumer = ItemRenderer.getArmorFoilBuffer(multiBufferSource, RenderType.armorCutoutNoCull(wingsTexture), false, itemStack.hasFoil()); + elytraModel.renderToBuffer(poseStack, vertexConsumer, i, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + poseStack.popPose(); + } + } +} diff --git a/src/main/java/ru/betterend/interfaces/BreakableItem.java b/src/main/java/ru/betterend/interfaces/BreakableItem.java new file mode 100644 index 00000000..7af4687b --- /dev/null +++ b/src/main/java/ru/betterend/interfaces/BreakableItem.java @@ -0,0 +1,5 @@ +package ru.betterend.interfaces; + +public interface BreakableItem { + void registerBrokenItem(); +} diff --git a/src/main/java/ru/betterend/item/ArmoredElytra.java b/src/main/java/ru/betterend/item/ArmoredElytra.java new file mode 100644 index 00000000..3308306d --- /dev/null +++ b/src/main/java/ru/betterend/item/ArmoredElytra.java @@ -0,0 +1,57 @@ +package ru.betterend.item; + +import net.fabricmc.fabric.api.item.v1.EquipmentSlotProvider; +import net.fabricmc.fabric.api.object.builder.v1.client.model.FabricModelPredicateProviderRegistry; +import net.minecraft.client.renderer.item.ItemPropertyFunction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.*; +import ru.betterend.BetterEnd; +import ru.betterend.interfaces.BreakableItem; +import ru.betterend.patterns.Patterned; +import ru.betterend.patterns.Patterns; +import ru.betterend.registry.EndItems; + +public class ArmoredElytra extends ElytraItem implements EquipmentSlotProvider, BreakableItem, Patterned { + + private final ResourceLocation wingTexture; + private final Item repairItem; + private final double movementFactor; + + public ArmoredElytra(String name, Item repairItem, int durability, double movementFactor, boolean fireproof) { + super(fireproof ? EndItems.makeItemSettings().durability(durability).rarity(Rarity.RARE).fireResistant() : + EndItems.makeItemSettings().durability(durability).rarity(Rarity.RARE)); + this.wingTexture = BetterEnd.makeID("textures/entity/" + name + ".png"); + this.repairItem = repairItem; + this.movementFactor = movementFactor; + } + + public double getMovementFactor() { + return movementFactor; + } + + public ResourceLocation getWingTexture() { + return wingTexture; + } + + @Override + public boolean isValidRepairItem(ItemStack itemStack, ItemStack itemStack2) { + return itemStack2.getItem() == repairItem; + } + + @Override + public void registerBrokenItem() { + FabricModelPredicateProviderRegistry.register(this, new ResourceLocation("broken"), + (itemStack, clientLevel, livingEntity) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F); + } + + @Override + public String getModelPattern(String name) { + return Patterns.createItemGenerated(name); + } + + @Override + public EquipmentSlot getPreferredEquipmentSlot(ItemStack stack) { + return EquipmentSlot.CHEST; + } +} diff --git a/src/main/java/ru/betterend/item/PatternedItem.java b/src/main/java/ru/betterend/item/PatternedItem.java index c25d9c6d..2d5dce7a 100644 --- a/src/main/java/ru/betterend/item/PatternedItem.java +++ b/src/main/java/ru/betterend/item/PatternedItem.java @@ -11,6 +11,6 @@ public class PatternedItem extends Item implements Patterned { @Override public String getModelPattern(String name) { - return Patterns.createJson(Patterns.ITEM_GENERATED, name); + return Patterns.createItemGenerated(name); } } diff --git a/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java b/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java new file mode 100644 index 00000000..3e6d785a --- /dev/null +++ b/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java @@ -0,0 +1,73 @@ +package ru.betterend.item.model; + +import com.google.common.collect.ImmutableList; +import net.minecraft.client.model.AgeableListModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.phys.Vec3; + +public class ArmoredElytraModel extends AgeableListModel { + private final ModelPart rightWing; + private final ModelPart leftWing; + + public ArmoredElytraModel() { + this.leftWing = new ModelPart(this, 22, 0); + this.leftWing.addBox(-10.0F, 0.0F, 0.0F, 10.0F, 20.0F, 2.0F, 1.0F); + this.rightWing = new ModelPart(this, 22, 0); + this.rightWing.mirror = true; + this.rightWing.addBox(0.0F, 0.0F, 0.0F, 10.0F, 20.0F, 2.0F, 1.0F); + } + + protected Iterable headParts() { + return ImmutableList.of(); + } + + protected Iterable bodyParts() { + return ImmutableList.of(leftWing, rightWing); + } + + public void setupAnim(T livingEntity, float f, float g, float h, float i, float j) { + float rotX = 0.2617994F; + float rotZ = -0.2617994F; + float rotY = 0.0F; + float wingY = 0.0F; + if (livingEntity.isFallFlying()) { + float coef = 1.0F; + Vec3 vec3 = livingEntity.getDeltaMovement(); + if (vec3.y < 0.0D) { + Vec3 normalized = vec3.normalize(); + coef = 1.0F - (float) Math.pow(-normalized.y, 2.5D); + } + rotX = coef * 0.34906584F + (1.0F - coef) * rotX; + rotZ = coef * -1.5707964F + (1.0F - coef) * rotZ; + } else if (livingEntity.isCrouching()) { + rotX = 0.6981317F; + rotZ = -0.7853982F; + rotY = 0.08726646F; + wingY = 3.0F; + } + + leftWing.x = 5.0F; + leftWing.y = wingY; + if (livingEntity instanceof AbstractClientPlayer) { + AbstractClientPlayer abstractClientPlayer = (AbstractClientPlayer) livingEntity; + abstractClientPlayer.elytraRotX = (float) ((double) abstractClientPlayer.elytraRotX + (double) (rotX - abstractClientPlayer.elytraRotX) * 0.1D); + abstractClientPlayer.elytraRotY = (float) ((double) abstractClientPlayer.elytraRotY + (double) (rotY - abstractClientPlayer.elytraRotY) * 0.1D); + abstractClientPlayer.elytraRotZ = (float) ((double) abstractClientPlayer.elytraRotZ + (double) (rotZ - abstractClientPlayer.elytraRotZ) * 0.1D); + leftWing.xRot = abstractClientPlayer.elytraRotX; + leftWing.yRot = abstractClientPlayer.elytraRotY; + leftWing.zRot = abstractClientPlayer.elytraRotZ; + } else { + leftWing.xRot = rotX; + leftWing.zRot = rotZ; + leftWing.yRot = rotY; + } + + rightWing.x = -leftWing.x; + rightWing.yRot = -leftWing.yRot; + rightWing.y = leftWing.y; + rightWing.xRot = leftWing.xRot; + rightWing.zRot = -leftWing.zRot; + } +} diff --git a/src/main/java/ru/betterend/mixin/client/CapeLayerMixin.java b/src/main/java/ru/betterend/mixin/client/CapeLayerMixin.java new file mode 100644 index 00000000..22a68c0e --- /dev/null +++ b/src/main/java/ru/betterend/mixin/client/CapeLayerMixin.java @@ -0,0 +1,25 @@ +package ru.betterend.mixin.client; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.layers.CapeLayer; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import ru.betterend.item.ArmoredElytra; + +@Mixin(CapeLayer.class) +public class CapeLayerMixin { + + @Inject(method = "render", at = @At("HEAD"), cancellable = true) + public void be_checkCustomElytra(PoseStack poseStack, MultiBufferSource multiBufferSource, int i, AbstractClientPlayer abstractClientPlayer, float f, float g, float h, float j, float k, float l, CallbackInfo info) { + ItemStack itemStack = abstractClientPlayer.getItemBySlot(EquipmentSlot.CHEST); + if (itemStack.getItem() instanceof ArmoredElytra) { + info.cancel(); + } + } +} diff --git a/src/main/java/ru/betterend/mixin/client/LocalPlayerMixin.java b/src/main/java/ru/betterend/mixin/client/LocalPlayerMixin.java new file mode 100644 index 00000000..10029dee --- /dev/null +++ b/src/main/java/ru/betterend/mixin/client/LocalPlayerMixin.java @@ -0,0 +1,45 @@ +package ru.betterend.mixin.client; + +import com.mojang.authlib.GameProfile; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.multiplayer.ClientPacketListener; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.player.Input; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.network.protocol.game.ServerboundPlayerCommandPacket; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ElytraItem; +import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import ru.betterend.item.ArmoredElytra; +import ru.betterend.registry.EndItems; + +import static org.spongepowered.asm.mixin.injection.At.Shift.AFTER; + +@Mixin(LocalPlayer.class) +public abstract class LocalPlayerMixin extends AbstractClientPlayer { + + public LocalPlayerMixin(ClientLevel clientLevel, GameProfile gameProfile) { + super(clientLevel, gameProfile); + } + + @Final + @Shadow + public ClientPacketListener connection; + + @Inject(method = "aiStep", at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/player/LocalPlayer;getItemBySlot(Lnet/minecraft/world/entity/EquipmentSlot;)Lnet/minecraft/world/item/ItemStack;", + shift = Shift.AFTER)) + public void be_aiStep(CallbackInfo info) { + ItemStack itemStack = getItemBySlot(EquipmentSlot.CHEST); + if (itemStack.getItem() instanceof ArmoredElytra && ElytraItem.isFlyEnabled(itemStack) && tryToStartFallFlying()) { + connection.send(new ServerboundPlayerCommandPacket(LocalPlayer.class.cast(this), ServerboundPlayerCommandPacket.Action.START_FALL_FLYING)); + } + } +} diff --git a/src/main/java/ru/betterend/mixin/client/PlayerRendererMixin.java b/src/main/java/ru/betterend/mixin/client/PlayerRendererMixin.java new file mode 100644 index 00000000..176159f2 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/client/PlayerRendererMixin.java @@ -0,0 +1,25 @@ +package ru.betterend.mixin.client; + +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import ru.betterend.client.render.ArmoredElytraLayer; + +@Mixin(PlayerRenderer.class) +public abstract class PlayerRendererMixin extends LivingEntityRenderer> { + + public PlayerRendererMixin(EntityRenderDispatcher entityRenderDispatcher, PlayerModel entityModel, float f) { + super(entityRenderDispatcher, entityModel, f); + } + + @Inject(method = "(Lnet/minecraft/client/renderer/entity/EntityRenderDispatcher;Z)V", at = @At("TAIL")) + public void be_addCustomLayer(EntityRenderDispatcher entityRenderDispatcher, boolean bl, CallbackInfo info) { + addLayer(new ArmoredElytraLayer<>(PlayerRenderer.class.cast(this))); + } +} diff --git a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java index 71777ea6..8dab1946 100644 --- a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java @@ -2,24 +2,59 @@ package ru.betterend.mixin.common; import java.util.Collection; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.Mth; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.animal.FlyingAnimal; +import net.minecraft.world.item.ElytraItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.item.Item; +import ru.betterend.item.ArmoredElytra; +import ru.betterend.registry.EndItems; @Mixin(LivingEntity.class) -public abstract class LivingEntityMixin { +public abstract class LivingEntityMixin extends Entity { + + public LivingEntityMixin(EntityType entityType, Level level) { + super(entityType, level); + } + + @Shadow + protected int fallFlyTicks; + + @Shadow + public abstract boolean hasEffect(MobEffect mobEffect); + + @Shadow + public abstract ItemStack getItemBySlot(EquipmentSlot equipmentSlot); + + @Shadow + public abstract void calculateEntityAnimation(LivingEntity livingEntity, boolean b); + + @Shadow + protected abstract SoundEvent getFallDamageSound(int i); + + @Shadow + public abstract boolean isFallFlying(); + private Entity lastAttacker; - + @Inject(method = "hurt", at = @At("HEAD")) public void be_hurt(DamageSource source, float amount, CallbackInfoReturnable info) { this.lastAttacker = source.getEntity(); @@ -33,7 +68,90 @@ public abstract class LivingEntityMixin { } return value; } - + + @Inject(method = "updateFallFlying", at = @At("HEAD"), cancellable = true) + private void be_updateFallFlying(CallbackInfo info) { + ItemStack itemStack = getItemBySlot(EquipmentSlot.CHEST); + if (!level.isClientSide && itemStack.getItem() instanceof ArmoredElytra) { + boolean isFlying = getSharedFlag(7); + if (isFlying && !onGround && !isPassenger() && !hasEffect(MobEffects.LEVITATION)) { + if (ElytraItem.isFlyEnabled(itemStack)) { + if ((fallFlyTicks + 1) % 20 == 0) { + itemStack.hurtAndBreak(1, LivingEntity.class.cast(this), (livingEntity) -> { + livingEntity.broadcastBreakEvent(EquipmentSlot.CHEST); + }); + } + isFlying = true; + } else { + isFlying = false; + } + } else { + isFlying = false; + } + setSharedFlag(7, isFlying); + info.cancel(); + } + } + + @Inject(method = "travel", at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/entity/LivingEntity;isFallFlying()Z", + shift = Shift.AFTER), cancellable = true) + public void be_travel(Vec3 vec3, CallbackInfo info) { + ItemStack itemStack = getItemBySlot(EquipmentSlot.CHEST); + if (isFallFlying() && itemStack.getItem() instanceof ArmoredElytra) { + Vec3 moveDelta = getDeltaMovement(); + if (moveDelta.y > -0.5D) { + fallDistance = 1.0F; + } + + Vec3 lookAngle = getLookAngle(); + double d = 0.08D; + float rotX = xRot * 0.017453292F; + double k = Math.sqrt(lookAngle.x * lookAngle.x + lookAngle.z * lookAngle.z); + double l = Math.sqrt(getHorizontalDistanceSqr(moveDelta)); + double lookLen = lookAngle.length(); + float n = Mth.cos(rotX); + n = (float) (n * n * Math.min(1.0D, lookLen / 0.4D)); + moveDelta = getDeltaMovement().add(0.0D, d * (-1.0D + (double) n * 0.75D), 0.0D); + double coef; + if (moveDelta.y < 0.0D && k > 0.0D) { + coef = moveDelta.y * -0.1D * (double) n; + moveDelta = moveDelta.add(lookAngle.x * coef / k, coef, lookAngle.z * coef / k); + } + + if (rotX < 0.0F && k > 0.0D) { + coef = l * (double) (-Mth.sin(rotX)) * 0.04D; + moveDelta = moveDelta.add(-lookAngle.x * coef / k, coef * 3.2D, -lookAngle.z * coef / k); + } + + if (k > 0.0D) { + moveDelta = moveDelta.add((lookAngle.x / k * l - moveDelta.x) * 0.1D, 0.0D, (lookAngle.z / k * l - moveDelta.z) * 0.1D); + } + moveDelta = moveDelta.multiply(0.9900000095367432D, 0.9800000190734863D, 0.9900000095367432D); + double movementFactor = ((ArmoredElytra) itemStack.getItem()).getMovementFactor(); + moveDelta = moveDelta.multiply(movementFactor, 1.0D, movementFactor); + setDeltaMovement(moveDelta); + move(MoverType.SELF, moveDelta); + if (!level.isClientSide) { + if (horizontalCollision) { + coef = Math.sqrt(getHorizontalDistanceSqr(moveDelta)); + double r = l - coef; + float dmg = (float) (r * 10.0D - 3.0D); + if (dmg > 0.0F) { + playSound(getFallDamageSound((int) dmg), 1.0F, 1.0F); + hurt(DamageSource.FLY_INTO_WALL, dmg); + } + } + if (onGround) { + setSharedFlag(7, false); + } + } + + calculateEntityAnimation(LivingEntity.class.cast(this), this instanceof FlyingAnimal); + info.cancel(); + } + } + private double be_getKnockback(Item tool) { if (tool == null) return 0.0D; Collection modifiers = tool.getDefaultAttributeModifiers(EquipmentSlot.MAINHAND).get(Attributes.ATTACK_KNOCKBACK); diff --git a/src/main/java/ru/betterend/mixin/common/PlayerMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerMixin.java index 7b177e3a..e2a2fca3 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerMixin.java @@ -2,7 +2,18 @@ package ru.betterend.mixin.common; import java.util.Optional; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.item.ElytraItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @@ -15,14 +26,21 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.item.ArmoredElytra; import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndItems; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; @Mixin(Player.class) -public abstract class PlayerMixin { +public abstract class PlayerMixin extends LivingEntity { + + protected PlayerMixin(EntityType entityType, Level level) { + super(entityType, level); + } + private static Direction[] horizontal; - + @Inject(method = "findRespawnPositionAndUseSpawnBlock", at = @At(value = "HEAD"), cancellable = true) private static void be_findRespawnPositionAndUseSpawnBlock(ServerLevel world, BlockPos pos, float f, boolean bl, boolean bl2, CallbackInfoReturnable> info) { BlockState blockState = world.getBlockState(pos); @@ -32,6 +50,17 @@ public abstract class PlayerMixin { } } + @Inject(method = "tryToStartFallFlying", at = @At("HEAD"), cancellable = true) + public void be_tryToStartFlying(CallbackInfoReturnable info) { + if (!onGround && !isFallFlying() && !isInWater() && !hasEffect(MobEffects.LEVITATION)) { + ItemStack itemStack = getItemBySlot(EquipmentSlot.CHEST); + if (itemStack.getItem() instanceof ArmoredElytra && ElytraItem.isFlyEnabled(itemStack)) { + setSharedFlag(7, true); + info.setReturnValue(true); + } + } + } + private static Optional be_obeliskRespawnPosition(ServerLevel world, BlockPos pos, BlockState state) { if (state.getValue(BlockProperties.TRIPLE_SHAPE) == TripleShape.TOP) { pos = pos.below(2); diff --git a/src/main/java/ru/betterend/patterns/Patterns.java b/src/main/java/ru/betterend/patterns/Patterns.java index 53851122..f3f452e0 100644 --- a/src/main/java/ru/betterend/patterns/Patterns.java +++ b/src/main/java/ru/betterend/patterns/Patterns.java @@ -116,6 +116,10 @@ public class Patterns { public final static ResourceLocation ITEM_GENERATED = BetterEnd.makeID("patterns/item/pattern_item_generated.json"); public final static ResourceLocation ITEM_HANDHELD = BetterEnd.makeID("patterns/item/pattern_item_handheld.json"); public final static ResourceLocation ITEM_SPAWN_EGG = BetterEnd.makeID("patterns/item/pattern_item_spawn_egg.json"); + + public static String createItemGenerated(String name) { + return createJson(ITEM_GENERATED, name); + } public static String createJson(Reader data, String parent, String block) { try (BufferedReader buffer = new BufferedReader(data)) { diff --git a/src/main/java/ru/betterend/recipe/SmithingRecipes.java b/src/main/java/ru/betterend/recipe/SmithingRecipes.java index 0da63634..4f1117c2 100644 --- a/src/main/java/ru/betterend/recipe/SmithingRecipes.java +++ b/src/main/java/ru/betterend/recipe/SmithingRecipes.java @@ -73,15 +73,20 @@ public class SmithingRecipes { .build(); SmithingTableRecipe.create("thallasium_anvil_updrade") - .setResult(EndBlocks.TERMINITE.anvil) - .setBase(EndBlocks.THALLASIUM.anvil) - .setAddition(EndBlocks.TERMINITE.block) - .build(); - + .setResult(EndBlocks.TERMINITE.anvil) + .setBase(EndBlocks.THALLASIUM.anvil) + .setAddition(EndBlocks.TERMINITE.block) + .build(); SmithingTableRecipe.create("terminite_anvil_updrade") - .setResult(EndBlocks.AETERNIUM_ANVIL) - .setBase(EndBlocks.TERMINITE.anvil) - .setAddition(EndBlocks.AETERNIUM_BLOCK) - .build(); + .setResult(EndBlocks.AETERNIUM_ANVIL) + .setBase(EndBlocks.TERMINITE.anvil) + .setAddition(EndBlocks.AETERNIUM_BLOCK) + .build(); + + SmithingTableRecipe.create("armored_elytra") + .setResult(EndItems.ARMORED_ELYTRA) + .setBase(Items.ELYTRA) + .setAddition(EndItems.AETERNIUM_INGOT) + .build(); } } diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index d3fbe6cf..dedae143 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -4,6 +4,7 @@ import java.util.List; import com.google.common.collect.Lists; +import net.fabricmc.fabric.api.object.builder.v1.client.model.FabricModelPredicateProviderRegistry; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockSource; import net.minecraft.core.Direction; @@ -19,28 +20,13 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.MobSpawnType; import net.minecraft.world.food.FoodProperties; import net.minecraft.world.food.Foods; -import net.minecraft.world.item.ArmorItem; -import net.minecraft.world.item.Item; +import net.minecraft.world.item.*; import net.minecraft.world.item.Item.Properties; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.Rarity; -import net.minecraft.world.item.ShovelItem; -import net.minecraft.world.item.SpawnEggItem; -import net.minecraft.world.item.SwordItem; -import net.minecraft.world.item.TieredItem; -import net.minecraft.world.item.Tiers; import net.minecraft.world.level.block.DispenserBlock; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; -import ru.betterend.item.DrinkItem; -import ru.betterend.item.EnchantedPetalItem; -import ru.betterend.item.EndArmorItem; -import ru.betterend.item.EndBucketItem; -import ru.betterend.item.EndSpawnEggItem; -import ru.betterend.item.EternalCrystalItem; -import ru.betterend.item.PatternedDiscItem; -import ru.betterend.item.PatternedItem; +import ru.betterend.interfaces.BreakableItem; +import ru.betterend.item.*; import ru.betterend.item.material.EndArmorMaterial; import ru.betterend.item.material.EndToolMaterial; import ru.betterend.item.tool.EndAxeItem; @@ -89,7 +75,8 @@ public class EndItems { public static final Item CRYSTALITE_CHESTPLATE = registerItem("crystalite_chestplate", new EndArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.CHEST, makeItemSettings().rarity(Rarity.UNCOMMON))); public static final Item CRYSTALITE_LEGGINGS = registerItem("crystalite_leggings", new EndArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.LEGS, makeItemSettings().rarity(Rarity.UNCOMMON))); public static final Item CRYSTALITE_BOOTS = registerItem("crystalite_boots", new EndArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.FEET, makeItemSettings().rarity(Rarity.UNCOMMON))); - + public static final Item ARMORED_ELYTRA = registerItem("elytra_armored", new ArmoredElytra("elytra_armored", AETERNIUM_INGOT, 700, 0.96D, true)); + // Tools // public static final TieredItem AETERNIUM_SHOVEL = registerTool("aeternium_shovel", new EndShovelItem(EndToolMaterial.AETERNIUM, 1.5F, -3.0F, makeItemSettings().fireResistant())); public static final TieredItem AETERNIUM_SWORD = registerTool("aeternium_sword", new EndSwordItem(EndToolMaterial.AETERNIUM, 3, -2.4F, makeItemSettings().fireResistant())); @@ -152,6 +139,9 @@ public class EndItems { return item; } registerItem(id, item, MOD_ITEMS); + if (item instanceof BreakableItem) { + ((BreakableItem) item).registerBrokenItem(); + } return item; } @@ -193,7 +183,7 @@ public class EndItems { } else if (item instanceof EndHoeItem) { TagHelper.addTag((Tag.Named) FabricToolTags.HOES, item); } else if (item instanceof EndHammerItem) { - TagHelper.addTag((Tag.Named) EndTags.HAMMERS, item); + TagHelper.addTag(EndTags.HAMMERS, item); } return item; diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index a7f86e22..7bf6793f 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -75,6 +75,7 @@ "item.betterend.aeternium_sword_handle": "Aeternium Sword Handle", "item.betterend.leather_stripe": "Leather Stripe", "item.betterend.leather_wrapped_stick": "Leather Wrapped Stick", + "item.betterend.elytra_armored": "Armored Elytra", "effect.betterend.end_veil": "End Veil", "enchantment.betterend.end_veil": "End Veil", diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index c5366cb6..acb9df25 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -75,6 +75,7 @@ "item.betterend.aeternium_sword_handle": "Рукоятка этериевого меча", "item.betterend.leather_stripe": "Полоска кожи", "item.betterend.leather_wrapped_stick": "Обернутая кожей палка", + "item.betterend.elytra_armored": "Армированная Элитра", "effect.betterend.end_veil": "Вуаль Края", "enchantment.betterend.end_veil": "Вуаль Края", diff --git a/src/main/resources/assets/betterend/textures/entity/elytra_armored.png b/src/main/resources/assets/betterend/textures/entity/elytra_armored.png new file mode 100644 index 0000000000000000000000000000000000000000..c5540b5da2b8cb303c2023bb40ecfcbc1bd14fd1 GIT binary patch literal 725 zcmV;`0xJE9P)o#;^IHoKP(o#{KN!V(?mA4;Qrx{3P!F#Ih&FI zO7QyUC)-)++Q!IOKaNo!kkWGy_N%jC5M+c#``ytGL6|Whp z{`$>HX>WTAfH_GHOz2KS$v*X>X!k>y0bywz9gxXdJgrn&_S_)q)00y{O}80wA5h5ZGu7b z(2lKNVFpAwsbxjMbsP-Wq*mQwYVCy;nPe_C*ZMA-MhN3nlv$P0x_l4br;7*u*sL|IkyJC+Itjz;LOXSm;!@A@J@0w$xt9z7TM9r#qQSIfiIGkM(D6J1tvOnl zpq@?uAkUXo6jtg0FgbfkQllB_u`{mp}c ouUsyd1&HbmYS35e(6xW8pXEN!ndK#pW&i*H07*qoM6N<$g09==>i_@% literal 0 HcmV?d00001 diff --git a/src/main/resources/betterend.mixins.client.json b/src/main/resources/betterend.mixins.client.json index 7da8b81b..de7b097c 100644 --- a/src/main/resources/betterend.mixins.client.json +++ b/src/main/resources/betterend.mixins.client.json @@ -13,11 +13,14 @@ "ModelVariantMapMixin", "MinecraftClientMixin", "ContextGsonAccessor", + "PlayerRendererMixin", "WorldRendererMixin", "MusicTrackerMixin", "AnvilScreenMixin", "BiomeColorsMixin", - "ModelLoaderMixin" + "ModelLoaderMixin", + "LocalPlayerMixin", + "CapeLayerMixin" ], "injectors": { "defaultRequire": 1 From 17d55e93e7d0040a07536b3dd2b003cec4ab0d9f Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 29 Apr 2021 21:48:53 +0300 Subject: [PATCH 463/463] Metal tag fixes (WIP) --- .../blocks/complex/MetalMaterial.java | 5 +--- .../client/render/ArmoredElytraLayer.java | 3 +-- .../java/ru/betterend/item/ArmoredElytra.java | 6 +++-- .../item/model/ArmoredElytraModel.java | 1 + .../mixin/client/CapeLayerMixin.java | 10 +++++--- .../mixin/client/LocalPlayerMixin.java | 24 ++++++++---------- .../mixin/client/PlayerRendererMixin.java | 9 ++++--- .../mixin/common/LivingEntityMixin.java | 25 +++++++++++-------- .../betterend/mixin/common/PlayerMixin.java | 19 ++++++-------- .../ru/betterend/recipe/CraftingRecipes.java | 13 ++++++++++ .../java/ru/betterend/registry/EndItems.java | 22 +++++++++++++--- .../java/ru/betterend/registry/EndTags.java | 4 +++ 12 files changed, 86 insertions(+), 55 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index a0f73d54..0b8f1df0 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -161,9 +161,8 @@ public class MetalMaterial { GridRecipe.make(name + "_slab", slab).setOutputCount(6).setShape("###").addMaterial('#', block, tile).setGroup("end_metal_slabs").build(); GridRecipe.make(name + "_chain", chain).setShape("N", "#", "N").addMaterial('#', ingot).addMaterial('N', nugget).setGroup("end_metal_chain").build(); GridRecipe.make(name + "_anvil", anvil).setShape("###", " I ", "III").addMaterial('#', block, tile).addMaterial('I', ingot).setGroup("end_metal_anvil").build(); - GridRecipe.make(name + "bulb_lantern", bulb_lantern).setShape("C", "I", "#").addMaterial('C', chain).addMaterial('I', ingot).addMaterial('#', EndItems.GLOWING_BULB).build(); + GridRecipe.make(name + "_bulb_lantern", bulb_lantern).setShape("C", "I", "#").addMaterial('C', chain).addMaterial('I', ingot).addMaterial('#', EndItems.GLOWING_BULB).build(); - GridRecipe.make(name + "_smith_table", Blocks.SMITHING_TABLE).setShape("II", "##", "##").addMaterial('#', ItemTags.PLANKS).addMaterial('I', ingot).setGroup("smith_table").build(); GridRecipe.make(name + "_chandelier", chandelier).setShape("I#I", " # ").addMaterial('#', ingot).addMaterial('I', EndItems.LUMECORN_ROD).setGroup("end_metal_chandelier").build(); // Tools & armor into nuggets @@ -201,9 +200,7 @@ public class MetalMaterial { TagHelper.addTag(BlockTags.ANVIL, anvil); TagHelper.addTag(BlockTags.BEACON_BASE_BLOCKS, block); - TagHelper.addTag(EndTags.IRON_INGOTS, ingot); TagHelper.addTag(ItemTags.BEACON_PAYMENT_ITEMS, ingot); - TagHelper.addTag(EndTags.DRAGON_IMMUNE, ore, bars); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/client/render/ArmoredElytraLayer.java b/src/main/java/ru/betterend/client/render/ArmoredElytraLayer.java index a03fc81e..ed1fc9e8 100644 --- a/src/main/java/ru/betterend/client/render/ArmoredElytraLayer.java +++ b/src/main/java/ru/betterend/client/render/ArmoredElytraLayer.java @@ -2,6 +2,7 @@ package ru.betterend.client.render; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; + import net.minecraft.client.model.EntityModel; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.client.renderer.MultiBufferSource; @@ -15,10 +16,8 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.PlayerModelPart; import net.minecraft.world.item.ItemStack; -import ru.betterend.BetterEnd; import ru.betterend.item.ArmoredElytra; import ru.betterend.item.model.ArmoredElytraModel; -import ru.betterend.registry.EndItems; public class ArmoredElytraLayer> extends ElytraLayer { private final ArmoredElytraModel elytraModel = new ArmoredElytraModel<>(); diff --git a/src/main/java/ru/betterend/item/ArmoredElytra.java b/src/main/java/ru/betterend/item/ArmoredElytra.java index 3308306d..d5604248 100644 --- a/src/main/java/ru/betterend/item/ArmoredElytra.java +++ b/src/main/java/ru/betterend/item/ArmoredElytra.java @@ -2,10 +2,12 @@ package ru.betterend.item; import net.fabricmc.fabric.api.item.v1.EquipmentSlotProvider; import net.fabricmc.fabric.api.object.builder.v1.client.model.FabricModelPredicateProviderRegistry; -import net.minecraft.client.renderer.item.ItemPropertyFunction; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.item.*; +import net.minecraft.world.item.ElytraItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; import ru.betterend.BetterEnd; import ru.betterend.interfaces.BreakableItem; import ru.betterend.patterns.Patterned; diff --git a/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java b/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java index 3e6d785a..d5b5c1a0 100644 --- a/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java +++ b/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java @@ -1,6 +1,7 @@ package ru.betterend.item.model; import com.google.common.collect.ImmutableList; + import net.minecraft.client.model.AgeableListModel; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.player.AbstractClientPlayer; diff --git a/src/main/java/ru/betterend/mixin/client/CapeLayerMixin.java b/src/main/java/ru/betterend/mixin/client/CapeLayerMixin.java index 22a68c0e..3e0e5dd5 100644 --- a/src/main/java/ru/betterend/mixin/client/CapeLayerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/CapeLayerMixin.java @@ -1,15 +1,17 @@ package ru.betterend.mixin.client; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + import com.mojang.blaze3d.vertex.PoseStack; + import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.layers.CapeLayer; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.ItemStack; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.betterend.item.ArmoredElytra; @Mixin(CapeLayer.class) diff --git a/src/main/java/ru/betterend/mixin/client/LocalPlayerMixin.java b/src/main/java/ru/betterend/mixin/client/LocalPlayerMixin.java index 10029dee..a72def2a 100644 --- a/src/main/java/ru/betterend/mixin/client/LocalPlayerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/LocalPlayerMixin.java @@ -1,15 +1,5 @@ package ru.betterend.mixin.client; -import com.mojang.authlib.GameProfile; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.multiplayer.ClientPacketListener; -import net.minecraft.client.player.AbstractClientPlayer; -import net.minecraft.client.player.Input; -import net.minecraft.client.player.LocalPlayer; -import net.minecraft.network.protocol.game.ServerboundPlayerCommandPacket; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.item.ElytraItem; -import net.minecraft.world.item.ItemStack; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -17,10 +7,18 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At.Shift; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import ru.betterend.item.ArmoredElytra; -import ru.betterend.registry.EndItems; -import static org.spongepowered.asm.mixin.injection.At.Shift.AFTER; +import com.mojang.authlib.GameProfile; + +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.multiplayer.ClientPacketListener; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.network.protocol.game.ServerboundPlayerCommandPacket; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ElytraItem; +import net.minecraft.world.item.ItemStack; +import ru.betterend.item.ArmoredElytra; @Mixin(LocalPlayer.class) public abstract class LocalPlayerMixin extends AbstractClientPlayer { diff --git a/src/main/java/ru/betterend/mixin/client/PlayerRendererMixin.java b/src/main/java/ru/betterend/mixin/client/PlayerRendererMixin.java index 176159f2..557b0699 100644 --- a/src/main/java/ru/betterend/mixin/client/PlayerRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/PlayerRendererMixin.java @@ -1,14 +1,15 @@ package ru.betterend.mixin.client; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + import net.minecraft.client.model.PlayerModel; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; import net.minecraft.client.renderer.entity.LivingEntityRenderer; import net.minecraft.client.renderer.entity.player.PlayerRenderer; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.betterend.client.render.ArmoredElytraLayer; @Mixin(PlayerRenderer.class) diff --git a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java index 8dab1946..35cc80c6 100644 --- a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java @@ -2,16 +2,6 @@ package ru.betterend.mixin.common; import java.util.Collection; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.util.Mth; -import net.minecraft.world.effect.MobEffect; -import net.minecraft.world.effect.MobEffects; -import net.minecraft.world.entity.*; -import net.minecraft.world.entity.animal.FlyingAnimal; -import net.minecraft.world.item.ElytraItem; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.phys.Vec3; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -21,12 +11,25 @@ import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.Mth; import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MoverType; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.animal.FlyingAnimal; +import net.minecraft.world.item.ElytraItem; import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; import ru.betterend.item.ArmoredElytra; -import ru.betterend.registry.EndItems; @Mixin(LivingEntity.class) public abstract class LivingEntityMixin extends Entity { diff --git a/src/main/java/ru/betterend/mixin/common/PlayerMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerMixin.java index e2a2fca3..292644d1 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerMixin.java @@ -2,18 +2,7 @@ package ru.betterend.mixin.common; import java.util.Optional; -import net.minecraft.world.effect.MobEffects; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.item.ElytraItem; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.level.Level; -import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @@ -21,14 +10,20 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ElytraItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.item.ArmoredElytra; import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndItems; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index a62e00d9..288fd16e 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -1,5 +1,6 @@ package ru.betterend.recipe; +import net.minecraft.tags.ItemTags; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; @@ -197,6 +198,18 @@ public class CraftingRecipes { GridRecipe.make("neon_cactus_block", EndBlocks.NEON_CACTUS_BLOCK).setShape("##", "##").addMaterial('#', EndBlocks.NEON_CACTUS).build(); GridRecipe.make("neon_cactus_block_slab", EndBlocks.NEON_CACTUS_BLOCK_SLAB).setShape("###").setOutputCount(6).addMaterial('#', EndBlocks.NEON_CACTUS_BLOCK).build(); GridRecipe.make("neon_cactus_block_stairs", EndBlocks.NEON_CACTUS_BLOCK_STAIRS).setShape("# ", "## ", "###").setOutputCount(4).addMaterial('#', EndBlocks.NEON_CACTUS_BLOCK).build(); + + GridRecipe.make("tag_smith_table", Blocks.SMITHING_TABLE).setShape("II", "##", "##").addMaterial('#', ItemTags.PLANKS).addMaterial('I', EndTags.IRON_INGOTS).build(); + GridRecipe.make("tag_cauldron", Blocks.CAULDRON).setShape("I I", "I I", "III").addMaterial('I', EndTags.IRON_INGOTS).build(); + GridRecipe.make("tag_hopper", Blocks.HOPPER).setShape("I I", "ICI", " I ").addMaterial('I', EndTags.IRON_INGOTS).addMaterial('C', EndTags.ITEM_CHEST).build(); + GridRecipe.make("tag_piston", Blocks.PISTON).setShape("WWW", "CIC", "CDC").addMaterial('I', EndTags.IRON_INGOTS).addMaterial('D', Items.REDSTONE).addMaterial('C', Items.COBBLESTONE).build(); + GridRecipe.make("tag_rail", Blocks.RAIL).setShape("I I", "ISI", "I I").addMaterial('I', EndTags.IRON_INGOTS).addMaterial('S', Items.STICK).build(); + GridRecipe.make("tag_stonecutter", Blocks.STONECUTTER).setShape(" I ", "SSS").addMaterial('I', EndTags.IRON_INGOTS).addMaterial('S', Items.STONE).build(); + + GridRecipe.make("tag_bucket", Items.BUCKET).setShape("I I", " I ").addMaterial('I', EndTags.IRON_INGOTS).build(); + GridRecipe.make("tag_compass", Items.COMPASS).setShape(" I ", "IDI", " I ").addMaterial('I', EndTags.IRON_INGOTS).addMaterial('D', Items.REDSTONE).build(); + GridRecipe.make("tag_minecart", Items.MINECART).setShape("I I", "III").addMaterial('I', EndTags.IRON_INGOTS).build(); + GridRecipe.make("tag_shield", Items.SHIELD).setShape("WIW", "WWW", " W ").addMaterial('I', EndTags.IRON_INGOTS).addMaterial('W', ItemTags.PLANKS).build(); } private static void registerLantern(String name, Block lantern, Block slab) { diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index dedae143..92d98166 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -4,7 +4,6 @@ import java.util.List; import com.google.common.collect.Lists; -import net.fabricmc.fabric.api.object.builder.v1.client.model.FabricModelPredicateProviderRegistry; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockSource; import net.minecraft.core.Direction; @@ -20,13 +19,30 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.MobSpawnType; import net.minecraft.world.food.FoodProperties; import net.minecraft.world.food.Foods; -import net.minecraft.world.item.*; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.Item; import net.minecraft.world.item.Item.Properties; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.item.ShovelItem; +import net.minecraft.world.item.SpawnEggItem; +import net.minecraft.world.item.SwordItem; +import net.minecraft.world.item.TieredItem; +import net.minecraft.world.item.Tiers; import net.minecraft.world.level.block.DispenserBlock; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; import ru.betterend.interfaces.BreakableItem; -import ru.betterend.item.*; +import ru.betterend.item.ArmoredElytra; +import ru.betterend.item.DrinkItem; +import ru.betterend.item.EnchantedPetalItem; +import ru.betterend.item.EndArmorItem; +import ru.betterend.item.EndBucketItem; +import ru.betterend.item.EndSpawnEggItem; +import ru.betterend.item.EternalCrystalItem; +import ru.betterend.item.PatternedDiscItem; +import ru.betterend.item.PatternedItem; import ru.betterend.item.material.EndArmorMaterial; import ru.betterend.item.material.EndToolMaterial; import ru.betterend.item.tool.EndAxeItem; diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index f82d2182..92aaedb5 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -18,6 +18,7 @@ import net.minecraft.tags.TagCollection; import net.minecraft.world.food.FoodProperties; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biome.BiomeCategory; import net.minecraft.world.level.block.Block; @@ -148,6 +149,9 @@ public class EndTags { TagHelper.addTag(ItemTags.BEACON_PAYMENT_ITEMS, EndItems.AETERNIUM_INGOT); TagHelper.addTag(EndTags.DRAGON_IMMUNE, EndBlocks.ENDER_ORE, EndBlocks.ETERNAL_PEDESTAL, EndBlocks.FLAVOLITE_RUNED_ETERNAL, EndBlocks.FLAVOLITE_RUNED); + + TagHelper.addTag(EndTags.IRON_INGOTS, Items.IRON_INGOT); + TagHelper.addTag(EndTags.IRON_INGOTS, EndBlocks.TERMINITE.ingot); } public static void addSurfaceBlock(Block block) {

    (}00RRZI|=a>LWn1Gqn2U2U}y6G$v9jIcY9je(mTh8Tuw<^S*j z?KJLp$j0xDTrV)CZ%78$%}(8N{5g-6`5#>b^nYQ7U^>h&esD5!^XQ0pMA@dhLJ*1c zC=5J>x_8v35%dME&r@~jC%y9LA5{nsoE@3yx*wJD$M5{-;!F2=PA|q=UX;!=ErYNF zQb!Tw+O2s10auKJ0u_;ig(-Ozw7kQd;7U{ zvKvIy3uMDe=@CfC7?|H=(TjrR3tS^K(0xK0=EzfQWrM-xME!~iBeGKG{!OtM+K@Q& zLi`T+X6uk-$Bxpr)vlaJ$!^F*VOOK~dF6Kz4@P>qo@IYvWKkbW&&*~xLx-T$wcZrs zF8%D|YGB5DhrNN&x$#onk&DHzB1L9+DHk8s+Hy<#Mt>!4G|~+(6lc|QZ(CHK2-EiW z9A!9d1?wj3JbeMLRH46-9F@X%*hzK5eL8* zZ06P(jsX`;+wV48f~1Rd*|8GnSxY;71R{@ITztcFAa`s`dc^ik@05d+31#COaU5PQ*J(Q`26hJ{))s_-(i8UwGCSKrBr=qc(mk^N%6v2q!iNh+H+u7Jt&F=yP%f zz^4b6h%2-3E>L|@@m|+7qv^HN#zMs|E8KlihzmBxE@R-Nb@J}$F)p<-x)Ax9-|4O^ z#a*}EY)7x-v&Jgm{HF`_Y7k^OZ{?4Z|M-xOvrasiMbrkW!jP^Q&IU`GeFtMFDRuT8r z3aX8=?G0yC@Ysy z%`3m}tebY>5tHP;G;F2DJB5p3rMhyF9+i`5H+X-id;gB(N<*ewzoJC;FJFa=nDZYC z6wcCtl`lY<$hH5za#_XGs9QX0@jsoH^Pe-$_|T;Q*VO^h)HBO`WARsQf(fI>q5+uA zI?-Z5uUjfXRs)7g4p5AJD9!cT(uSNxuwQ6RlO=Xx0Q8!7w(8@uzeB~&NiZA?j`{?p z@JnL$-Ey1#mpmLOt35@O-3f?*u$RnEoc3a~d!{8p)ZD4IFYEXQJU6jtHv`}3bNUb6 zrI;k@`J4ZzrBYbZmAT;*;&&AhA8xbPuJE;i<$p2Y)7;HrT*g5<^rK2GKwzw}*nWNZ zpuhX?m}Zrb1E6|=#DV-0@4=?S*L|<>K^1?G<9#`Jb}G};f!KFfHZiy8+80aE3!bT~ z*X7*`!X|hiASv9ez!fz;{G^izbKZxBHWw3Z<}@I`O7j^QV-3=l zD~GV~!-GPVj|c8Qb-yyaOMdbnkudpPC1HO5{74fWN?UNz!JU!LZ0SvUd{)nt>Au*1 zx`&fuu$l~|SW)bi>yl4ByhkHsi9d<%*-x!p5{}wdy_tlM9p7ILeL{oe;Fnwe4c)5^ z_1{}L8Q^Lf=G2x@tJ(~|xS+Sywn`BSnq@f|Qcc4Q${~k3TGR~8l=Q@TAK#=ePBjiV zA4H>y+fuwy+)0YpZqxva-e<9dW z#;m-jB?02&1|@Ipd{HCu6F%jMr;^sO!`O_|v^d>3iABh&VH%~acs@h!>snI%QkyTF znsF?>XtZ@X3(EvGc-LPQz`C$Km)?aCegHwCui({598Qb-9_2v-(W2oplAs(=#UK4aZQIIHF#`Ei43l zDxewW7$TDAX}F+DaA~ zjl?>QL>D1UYHnRf9*x~oirkn}H-a#GD0A`wR}vt*z4uO|!X+y!Es;wV-zv;CX$txx z&$Lv_XEP=@gUX&jE_Fehvun7Y_(CRcm0!6w5`FIY)p!N{(47pFBVokddvx1}?**Bz zRPXj6@cS)U{qO!a9({kamwD6-hTUl&i(pVQ?wXL#ZhGr`78L{D2!YgkMubdFq660% z3hHsXJ41%jbxiS2L#{lEt=ho1*6Xz;+mm^xb1i7L%Z-gg06(HjK{R{gKn+6b@CetV z>H{%t95|e8#tc;*EkGoUwt^+(XTn>*L=tqenvv2~!(LQCl|R*1$F6$E$0P_dy?v{P z1fA8GU#oCAHB~Vyq}|-#jItvj3g@m3aakx~MK*=MnJ0CV1=N7Q#{5=p6CjQK$4QB; z;G@?Eisyf;-P3APWc}1wLDxLw($8A?IuGS$Bi+TPk83iF5Opi{_#Ae$Gg67wP|$+k zc2C{6riQNaskYVZ5exPjsu(TC+%YFTh7o9?V`}7Cztg3$niGTX_AGx6)(5~!$u3+G z=6MrTFE69%Tf;qF^S%{GS_pKtH6x&A@?|uxf9%FIX21A+S*qS*h=<=oEm(gX=OWDl ztVO(*Tbff_7!n#1=$qZdBqO_k!0TO>kg4(A!r$g=w$SRgCcj%1s<54OIeILP; zF4Pt*9ZABG+*|c;u&#tTR_+1=QQ967FKBID^X`_;t?r|yC z{qNmQIrY++ZgTCscwux#V{#Op6Q6%NJWcnOY@dFcz1343gOwojekwvfVdQux@G^$KK%#FvZlX`Cv@qCM|JUGtcRT? z#w#YMyH@WE=SaV{xV)TtzQV(;tkyxljYhSW7$c%BB~B}Emc=6E1o&wshwWc>KZb18_y^l;WQ1B?3smv_k#VcdK)U-3>kLeqnf`_) zpDGvOEseRzKzx@h1YAFIsQ(5ZbeuUs{tCQy)KGYPM=E0W zAMbAO!~|)$yX^}U!~PZHP814%JBfZr-;rN9RRpZ33{BqoD~Px9+lfoA9$;)x!f8ef z9Fr6xYrQDI&8?*Pfr++;d0R!4^_*y$2CgFwo0@JaKF)SI7#NR>Za&$z-pklH8LdTd z4_e|+e0JsvO0S$0i8mItfBAebE5`(0Ju_9^Z9%N~|h-6E&8n?&GK9l$~Dr|8pIpYnf6sXhNeN7vs?-_}IjEorP z9h>2K&Kmp)SevVKH_H)#6i(wY9FI3}tG$+am>8{s>h;L5V-i{q%PIn{@6>5k5CV5F zgnjY;FreSoVpa?ionHNWGFN_J7P|i})<}l7&K_6K^#K&vPmR@Hyl~SP)o7BipkzH@ zKHDdpd!O?BK~!Wk-m=j3aK>$MD+6BDy7gKeWs)`KhCC!m&J7H@J-1)m!_4Bo_x8Vh zHGfInCv!5;@`vXu%)dWn&h-1;)vofvDi`r#>pv-gLu;qtxIakvn>~eY4YB;$hCa83 zK07E;dm4&~AjiN-r#Yj?ua>+Q?*hlQC!L_R#7`W~)*&rndq?g{X?Oe@O4BtXcIVbG z1KS=!LmGeV*622qYF9twkTH|NV1B&q2q3uDO*B#1Cvy?AVDYQ51RoFEGzV;rh4s%z zu9@1J@yzU2jzVi;lT}i8M&JaBF>OJqXZo~OHAM%Fk9gZnHm*kBC5^cN*XHWo@#{*( zwx?>70We;0Lt24%J%O}rXX<_@X}T`ul>Z{m8^)z43{J1s631yQ-Z=GE&q1?jw=x@^btPvW^ zdn&Pn*MLMuzgF50pny#3caLmL*ze%~tmhtjbrzD+2Hwf1#u$$VJM0=FPI}OK?kxTJ z5f7@sdNpfOvd%}bU)dp)wdT_q>M;UQE}2_BMybgB+#a*Y8+BPV{ut9VjB*|mOlTR? z5l8yT+SKLmABR=Kn|SU%TeN<2Cn+#gvF?UPqskPP!OfP!EKpoj#110X7Y0IrY56bAeCdh*wh7lei7v526AJdJ6Qxr=mulbGhz!bwq z{;f7GL*%~bC%EKv>uq9_-hztEjjy%U!{utoipDmA!vziw3_E?zEX!s-SO&^VM(K{* zZaB5vjTlxV9Jf^P8m4Hi5SlizB{R)Z_V-S)+4Z?^1(v(G{#Uag0O2*GBpHq1Z&BO{as)qC- zfD7_!xRN%t4OQQ$w#?tUpb`SByi*Hcd)s~|7Hbq&m1by@eLNKK^6!D<;RP4Opa@Rz z#jQTk`&%_+DWUsu1{DGgoMwd~DrxRwH)1OWL#Pq3fEcrB)4n#s+STgC@5NGY%zOkh zEXfi_d>yAoysMESNwqDUz8oGC;6INpGRwGUHa)%0KXH~yAIuRYLDSUpexPD}EN4-? zuRJ!K`s03d>BRfnUU8jF$)B%(6a!tO3~YoFFwW@MEF`88FbXXDOm^3A4z0+8LNhe5@Q`Z2-p6F&8-1WE6y zB~I@BgiC?+-bVkHPU!w#6F8w)oDNcI2qGfZtB%z(r50rTByIloeWKR@^_$CX`v(kv ze2?R)(6`FNn&|J>B~W}CXvQVSZl|{6DSRJ3a$s~n@X6n_XPP2hU#hmSi$qoNq14} z1>&3ZOg%@hQB`Hvk=s&jM!yON=7$v&Hte{VOrz3THyhz52 zd6>`Y`H;rWlKcAecH?7^weiku`v;fUl<^Vq*Zvb{e3`>zgnhU{GGDn^zX2cR#W|xM(GPU zSwNXIBOc>wmq+m~HU@JxMcuo0GA)+xKLj=_L9K>w((^0=DO1*iJ`&BKdh%)Hz=cJe zY&v;pA`%5bEnsL0{G%~G)m9ywmi?%n<peR-NRjTOuDUi2KEG z>$B}qecJ{rZOnOU-!(TUCG=#)A`D|R5Z$s34?8(zh5Ps*x6u+d z>y>Kurb@_n1w&~n&kB20m@XWRgjcQU1@y z(Z%oSN_B2TrKAcyv++7Vag;7qMA$<>-;z*OL(S-k z7L?`4vUBNa(z6-n4$CzrF`@zMcD1N8qn;}>H zSrp=kI3oxVZ{*2+w?(*;m){xVZQW$XZhg>?Myo#3DSjG{pw1x31Ov)Y`VLbNR^Z z@lo`jf5bm{F&%$5(%Jfa*!I*cQ_#z#WQcT~hwy=4$=Gao$=?CaoQw9H#a}NzadhBHzErGqS7YO$-Z`p9H^g!J?b+j7v8WlDo3n+3;%_NxG$2VCaGI|$m`a4RGP zHd~z*(}%=h(gjg)0LaT4sb`3+Wcdt@%b5yuAVvb4EqUi3Q7mvSnec!BRWsc^|FaR- z>ZFVhL-AC@PD`=fn^uEVot6`}sm6DAI1|{_pU4Et)?GupD(AJ=wM~t`iqcxk*Ou|- zHvgJ~{kGoR%@p7MT263c(nHvPfGYe}gxTUfom2Ao)6TWl?CM(MP8e2anD5kfo?>9HvJlthntO*3(DS_UT#b@= z$XD=f)!0Ln4igsWMb#-BP{2&tf}z@89FAn@bR#+qy(?AF#WF3Xr%GIqT1&!KgR1|^ z;nD`kCy3G^7JL(bK%xED%e;i@OA}Gsh97uO-bJYLJ@k}3v`k9lwHtGNuCRHj60CBo z)4vVemCu=FIFh=k_}c3n)x8`3IRzCel3$^vP2PEjdZ#pH?f{RMm2yRX{-dK>nLmC*MAnw87yHh7x z*Tm#8Ac&}d_-2u8kucdsudwyMq~Wy%kP@xGq0SDW#yc2W)mLfCak)vZoZw?+NY=Aj zu&utCbu8Yz5KzF{-#lH+@lg!AvW{j&1;AhBh`dU525IWi9yh+}7D-o&Ku=z}9M%ZI z1lcF%G$GjQ?3NcmMk(z3&nzQloZ74yOwi#qqyHTXsI*hQRlywRGCBB?Ix~|oq^NvKD51c z-KsW~pf&GpY;CvZG?!Q09XX>j)2ffm>Pv?w(sY%J8_3PW9P7S)e+4I2t){!TG<61f zW7FNBw$|Z3KA`<{zT&;1wHiD5hyEFHb?n|uxe^oVaAnzP zQ8IsDA&O#AN+;jVoH{L*6Tu_8svTwO)M7k2ZRF1 zi>hav56}0|8`0Pc;0R_M;KOD!eR)!V$Z8S#o$Y7TCxiA(b*9AYYQ#@xn$aMC8*k4# zSmqrl89^=SV_E#|Jh(Q1_49G;LPZ3n*!9 z{$dvCL2cX(^uxBG8Xa}@$J%l+ZS03tA}0b_`BL#CQ#AD?as4<~Tr?4}IB|4%zzk^g zamhoNyA22>y7tXC^O@lfbIhX5WE~E#Mg|V`S2{1`f4d&l_tvDj19*_fc!hqajkK&k zwdCe}+p++F3N$3Z?j4He^{-{=<`AE~*lz0GH+g1{;W<6)2?ZX^4DMVD!D%R)bK8Uz z*JmkQ%duR6u4I+0T!p2mOdtM!?gt1{R=VPq>Z2BS=ZyXa5S~7`yLP>9AmJ>2PAJVR zU5Rye9XBDpI&@<}A{Y`39rOsME2VcfR}?AMD!faFo?Qcu)jMuXuUMtjChTGaZOvKm zDY*RK#>G&8E{R_)>V5QH;TH4SItq2y!tb>QY0&Pa&H_c0OTsuz_UdFX&Xkj%^iaJX z_qpmrL-0%D*s0|*O9em_#x}I{ef;g-8PxnG^ULoq|JR5H*=o)FvcfRddT^pjTbkk$ zd4x6-44TSfgi{efj@%1>FW<1r_NSd~Ut1c$@sADIbv!}7FmK{i&cZ%yO|(3o;kKks zc|?>rY?a?J)C?RO@?8K|UVzWe*ob@03~nX+$N}f;p1VZ0qFcr5KBpBZpd*o*<-0Ck z+2S)EWpgsH5X#|~yX!bT)!iV{k!L6J*7Mcv>S@UdA=q&prX}F4k|vgJoFY-B0)Lx7 zx)xFZ&C!pj=AgRYmCP9fqiwD-isb^LGuT=Qkn!90Y5fMV72GI^ZK(?9OT3U7pL*t1dg| zpXjzkCEoEqStqcGZ{-%wDp(UmyrfR8Y2s@%)Sx0zF@{}pAB?DPyb2O}$|JfRA7fP# z1l0s+gKC0^>T9odmbDn99TRQ4avOOQ`fKWc$?~}iW5y117}aX_7gwd_jYX$?HmUep zx6?ggZ3U?0tvgTa8J0QA`YPpAn|j}CUso*f|3TEe2h4tUmQI2NSpp)~Q^P*I5upTz^$cLFQ=hmVkX(ySC>BG(5PkB zIP~(+GMbUF{Ufq4=ZG!sUre*@(KlpEAMWpkEg)0@de3XgtE4XYQ<|vp*_94W-Itd4nXYeh>kR%$UMKc@;|mRMR9WDu)d9?wirs>V zWv1q|wTUl>@{##GNx#*)9w8wn2iuDT_D}?n?a^ z{wdPGTCAdsJVozwj&}+Qz7$Bp$GMz^n|0(poTLM9AK@yx(`PGO_cadHLFPIGv2s7l zy!ZNk{fAI?m5XqMRLHh!V0n`Bz_&MS?dL_NKW z+`goClt}n;LUY1fJFouYjaksT>Ez;P(Ols=n_uOsD2z2Hy0eCyRb`HNoO#vjEd}@! z0XLXH)Rr#z`9KY#-Sg*fMaBc2#mwU*GWOZTM)#g&Dcxk<#Qw?78QE|~=ecP9JpPWn zJMD|{-S*#n>+xsKERvI#_q_9ew09y}-#?C$&&sFna9396RP<(5z=xyT`B9(j-qy(8 zH_0ERuTLzknWB%a^WZa5ujR!`lBERSxt z`JJxnzUqq%6?M}#JWB2P_aDJHX9=|VgYd^uo+81I1+SS~bdiegS~@sC{WMXp|8X$0 zXP{9*aIk7(+zNA%P7WEJypWovj7L5!cKuc$C;?6>>Y)yOeGu*1aG~?>yHhEPj~x8} zDY%~gC0G1OBJb>*b#rAPoGBa#Uq8r3Wv)RG?*@!Q>N)m6DX5JD*iCf5^l6X@l{<%}{rzP4#c$@1}blvI>;~ z5oQG2by$MoT((tY+)TvE$E~>3*rC-R>1Q2G;Bq;G2qayXbF2ds>~%;gUGY#fthVF^B$>SoF4pMm%J?^U{c&V;(s_z8`Qp8ZaUT=S8hNeh zeh=E(A$9m!z+gVweK!oWA`W)-bokwhnLN5@bZ|7dzH+B!^rvt!2mJD6X3g(h!OWLm ziD&v2_h;0JIsn>Nj5>k?j4#bT|({|My?DT}MQqeAzS?*uodOxSfH-vwd zeUl!gPjY{*n$fuFu;yVTX+3m?u}x+Cw(B3aSMN+;aAW@a)b*6dTX58?g$3GoCv^$% zOVb2~OYS;02fUZJeLj4sIBRVLQ{&EWdy|zKbq% z*>(#Euxs+7wBd@P8Zg&Sjn;BE-$OXZK2uydWt-ZYk6pr!9fWabLj=Nk(`I@lRdC)J zcAh^BI@hNUe(DK8V9wnNq#*ASoRXS(Wff1&5PLIw0P&8%z*aX87mw6?4?ZlUKnR@r0kRu&v3xgNM;_k#gt%FM$@dQY934PodkqqB15(f7?_Z7eFyR|S>4yTq z_oG;_M#lCT?Iw&8s>{^JNJTapW=M9HXMSTH1+mf3-YY9nPLSvok<>bsI0OhhtHfdJJ!{w6bu3=7b|`+8 z{aNsiXcb2D1vzS~_*f#l&AK=MK8V@ke1k4rw}tm-OP~($dq7rH=8kt(QIc-`cvOGN z)(>RWR%CPd<|ad|jvjIFveM{idKvHE$1c(7yEzU`GtdA^`-7B5tnpQVo{Ggb_lbcR zkBkTR$y!0%>^t|2=bQD7HygQCWLC3tZoYYLMjy`fKWdjYlgQHCEw|J-r%N+4L*(B9 zRUdb1*3y;SO(0*Xzc+5&Kd*GUad9L{C@5mmT^^d(=bEK@dcu$HUicQAv$(W{^(CFG zPcGQ%Lp$Dg$5+^?k_F;z8TRDu)5+02z59N5aOqe}+c8;6F< z{@$qkw-k)e3~#s|@9xCPnbTOKWItB8RSWB8d3DW$lp|^vEDo&Bv&yq+Ow`*KY&M_n z1p%sg9>lrKY$4>K*5Y61x4$lBur_!a3>uWre~wsg-2OF`*IXxcETDA`C8hH?%-;92 z&mU%!ynp|pEE=sbzjF<*e|nlE?>@H9C2UP%UUv9atRYPY5bx{ZX}Iw6CD_Yir#YVT z8yjR6$|qhLfekWk7u9xrG@8YW-rHFkTo{s9SM{CC0zJvtxyKA`5|Tg8kdQ18R9NnC z#HP{!+s)L|wrX3l+o8g#-)zoTp^{Staj)XV0eq881WVYxG~5~~AUGgQb&K+D7|=Z^ zWiSfLz;Dq62fliv0wx#}gh5p&Hg!pf#+ISl&^>qa&FNY{X-U3(R-(DC-RXrb+ujui z(xyl41P}6imDON*kr~S5m!H=O%viQ8$Pg@k;4kKOyWyGukom#+<(NkiDzYqTuGRiAI%!1CH!xUS!o=*n+n~y zOcjjg`7e-UT~^bxU?u;mpG(S#?|ILFRaTg;(`foXtX+&`nR|;GD(C2=+f3iV>lJwCAmm@T@CA#A-*8hnZ9zIpINc>%)C#38s??Sj8ei*d0`Ojx zXfoCP4 zyqadp4Zi}Z-5m8uX^fC0YqSU6SKh=o6wF2Z`<8C_zWj$O-R<2(+ii^(@i%)sTz^8EJ_r&2};WGV7%Z_Pn$ysAM zF1xvU7D(MhEG^+}fUe~)|HF$-|J;9iGxJ_qq2Va++oPc0IogH+Xn@fVE}m*WJHK&1 z9eq+JN&*fr+%lvfc)nbA3+Y7rO$8`n0QL_uJS0POem}3XGKpUMbTF}H4m*4q)U0P3 z54v6%7?m)T=cH}wr_?m-MRzI7jmsg;KN9XcS=z?x9pQpOSmeFMfJOSRmW`(ahD|r@9qtyDj|WlN+N5jctiv$ z@@o`bl>|9t@1GkU9SOE%C_HM-wIu}bsIP?3W2bS?K{4`s=x+m3}xt&9=Xvv8usQca08W5I4WmJY;6y$CYk z@){SUH=#En zV6enu-~S=%E#snkqpo2L;I9aXfOMBgcZ1T6bc0Ce&`2xNDIi^vLn9pngEUA<4&6ON z#{k33JmdYo_w#(3`FeiWKG)fMt+m&3%d~DS+%4y+2q86$F{)T+4+T!^`yZFz6IF3R z5=e(dcq8g5EV3I7en*tICq!8K=x{>ijh%6%m1^=)8lI3xe{U5vbVB|_?pl1eX`KBL zu%W$w|b*+WQBV4LT^OhD<#2Ui2 zKrLKFv&CJvulOC}$&fAhWgJZASh)ObmbfX{E3f|>OVHt8@&49<%3?pM%{H+4K*2({ zm)KjPX5@NnTHdP?Raf-GM++)!{oKVnoz^Ao2so(Ba+lpwaH-I6i-a1-DL)e{t@>aD zsh$?Kc*{LE%A&StwfFp)J*Q9F%V#Ci1sNJz+w~Q7rtXgn+G9iuMzx)dvkNSy8Uo^h5=S1yAqyZ04D?WR8gmE z6WM0BRjEJX9A$(319ab@3xD(2^?EL0`-(E}_F*NfXT9yUVt;R5B!ST4#+d{6pyxaR ze&VH|hqq-(9FjID+E-G)earSptK)8&a^=#+o#0q_U#wR+3?5v%%T zJ^W+R>*M{=c~LS)6F_!}P(P|Nsg2S7rK+Cit`8{eJm)Kew7vG0UcX0nYGrPj+^MGSa$nSyW8T~ zgO!Anwzl91qtVLTc%L;z-DoWbM2@HRkTr)av(CxaZ`sM~9OJ^D8Zfo$ZEMisiqHjj zA_n;f{v4r}?PEk14!SdQ(J4!QhVy3v*K0Qc3qxS%?>R z8HElW_bw@#cQ2guJn|Ob*n-1O=~I-jDII)cA7egZiWWw2Q7lX^Ix^zdXeC9+gWZnl zQHt{wa^soa#0WBk-_ArmIY6ggUyZ_D9d3$fJlr1Eo4UPt+k9}iZ?bQ@d;_vpaB>Qq z-5mP{Khlz+x~sq@?v*fe!abUVipYktsDZb>f-wUZn*+%S?!FSh&!Z~G`qC5gj4EG1 zW_~wX3%nX{O#K&H!^4j!C?pq{Vwr`DxTSeVbWGK8X-p1ZOrU|&CaB~TS3}8Fg_-1J zhmf+KNtB%*f|Cqt#skPly!x|@>$#2^sWBwN`L+WMqY5XTed{=z<@=aU-2&Sl>jUN~ zWx@8(M}xk)$YNey&%IMtP5|xm*=Wi|EKCjmS2U@8Vwt;LMYRy4IdH_QwGfi}|yqYAi8|2tEX6vRzvQ7@$zsw1X_1B|z+ z>0H!w2{&K=3_Lh9$Ai*1&8AtvI1xiJTMEl4MbYQLneu)MG1)K;x%SvDP$eX#p}7Jy!U!8sWlMoGBZr9474o z4P_O1b26_ruSQrXYJ^mWLR`0p3} zUqOtNo@KThVf3_^h+L$K)oS%4!Fg>pPc$QEu?b0eTE~Y6heIrf%9qRxZFGo74te*r zipPZ3oogyb(kPh`YVqp9BTXkr_i4U;BjVPkOJG}aN&0niTxoZ=)Q*2^@Gq~`qA3_< zMetCoSl6X57_rwrG<#j-m2D@T4G!=wH>VF79?Ft0#R>HoLxRmRKFzb;*OxK7=!v_& z%`h69LUh2hPudml9yGac>Xz08iA1s;{zMOHwqb7f?ULU!CK8l84YQM7U6(+Y?TZdx#+7}obLuTC|4c2w8 zovWGZvsQo=F`AI>K%c>z_PD+&*Yvp=(2P4b1B`Xj!lhN6ko6DVBq?RDrJBpWxl@-x z*J_L7pBCF-y3-++t;^e_@tiKd8F_^up4Tx7rA=3^a`&(yg&ngu83i(g;Hf4--IWUF zoad)dMPQE8gbqYW;krQ-%PIoPmu*vsUs zYAquz=L!Ww#(!qO;{BE$T;dppy0q12@9*?JA4o-r_S~Ah&E#QFkg@S-&W-vS?*aaT z>9#TLCzBVH>K*3N61p%oHVVbUp!=dX9G{tglVoGOG10gmUX_Qcqp4W9l&2(N-NRp+ zY%6<$SG&74+?1k3aOmtBhcky9{534{lXlJ_sc~_xJRwHMwz19~<6d2!nj~CFc*g^E z+yWMjjcseS0RM^8^w%L5Hz~&n?MjblQVypr+uH>Es3oZYFrz5l~SFQ3ahTDiRy}oKEx;Kq3RXu-T^% zkp*~tD9z$rKgTuH1gnZEYlXVPgD6vCW_$amqE#+ zSBptI_iP-6MKQ@dzey;0qWcdPWGHH>g)fQ(Jn`w6z8Lx3-CibW)d{1vxbr&O_fhWk zft2tS&DMG;O`K~R|IdN{F*6Qip$??SH8^xhlED6ULuCe9x8KcM;^gktQ~X}*YDx#b zPP+P)7K~`EDYdw+Rr5QXfYkaFWFLmL4LrmYBQyHeE8s~n$YSo7jpo;A?6t*DwRLM5 zOmU;1Wcf{{dJ_@aMND?8#-C$8C%5Iuc9;guV+jcJtG7lJEfu4uLmj7iWyqBDEzR`I zeR~{2>)0FO^>bC?>3^3!(|g>Glk`j!0}%>MuSEEawhq5b6?3|r0%4J(sRm>OV; z+9)Uf`?>Jh`zy3N7U=d$=vbr^7O!MQ8)CZdMG|4V-B2PBbO%=%JZ@VJ23SgG8Fqn1 z)%I4iOr-*+;&vX+JbHxiE+JwPZOZDSDIY~!*18UZrw{>_jmbdjh4x@-15dx>JDrhE zj=+@>TMo_|hoH_jexJpw`AMxwm3fS#!IFE-?V(O7*^yh+G&-o3dvw>u*`h5Ogfg*N zRplXZGh1f~0f`|8ke@viYIq1sLuBJly+aybR=8RFCJ6G?K$5Zqb{(WLNw3p0X00v- zN0khf@!$P6#{pwpl-44iK~hOE^Caad-H>^XzIIVrf6v#iEP92NB^cr8_W)#6McT>D zp9Ban1iG%lZZ1u-w;iSFWls&X6A_&sEQC_s2`2(*DYu(A%s(BS@W5@;t%CwHOx#B;yB0cj4_-_i z-i$^m{g)N=HjOVQkCP+jho(4(jzH~G$D_(sN@Z*V+gIT)zlGs3$b%k{pcDsKgF7N^ zy)8!c3P&hO4=yTb(}^GW3(NYgUaP;?)MQ?`!Yl$Mg16rjj)V`JhzAD2qy`psdVeh$p0)hf>GlmOcYy0<-~`-tET6iBcrhoDKI)+S8L|K8hXQIjA0)s(DXE z|1%Ni^S_5%1t}xP8Rb%i-X0DGaskMF*y1sUgx~5$O8n+#I%&p!Ub@D~h+qC!?=|)dZIl#W3;D$qK z&F#{)m&69T082^Qvw?Qb&ljvvcg}b>FFn}l_VCCaX&0I{-wyjcUZGo3j5U)MCvr}i zST=ph$Ac%`$gfqGaXT;9)YbC$@8mC$vX)A*yWPPkIe=@~P${sSy=Km@X&Xw)@%pBP zXj5^h{Ub)$-9Ji^Di(!*Wilna|kj2Y$gWU^U7#;3ueX4L>?Qn87;dV{yMLYOlx>bd&FhwpDWYllicpweUwFQeq0NKy}3wd9*ZwMVOO|b zsm&JAolAyP;)41p?F3qRX81{u(B(r`kXd2Y^umuIm>9ps$;-F9!qkzyn!*ZkoRd|b+eV(ph;-4Q$;Z1kK7xVI_=douE`e$Pe6xr)B z^L%#?BLRH1@TZ>tvxzOM>Jkq9|BTu1lG!EKFdE7JCxP-ezI6Lo4OAFml_UZf`eo1N zy1n}}kg&LPEU*WLz5w=kH|iS>@y5<9CD}C^4Nf_-C?>lu33uHK@0}F9BIXa?@6K?X z=;X6)bfbH{%oysn9LHS>AD>$fXdKqJ%diKncGlSB9NjK__nE-f0QTOCVEfk6(d~nM zJbL!?6wYScBknn9Yd(dqDyujy`EDyV+cf7pB>aFFz|XB7<}j%VhG4zZQ|Ni1ZTA@E z&MVypb8e=&dH$b^;Q0M~&(jrhta9gbeFB$XndYP8-XVuUaSCK{iLBPIx?u6Ix_K7Uz31>MDS-Vry`cT$GXq z*_;RRc9*q_jxl`hV*qEUWi{(+;Ag!}P6M0vz;h7e+!xd7)b(Aux5F*Tmd(8lYw|p; z<=xQMm?&(z!MYYnFF7;<*bl8(b7IM=6f4^gr{vRIlKY&O8=C_9;jqTOR>FLqo_3_o&DHL{b ze{*zykJ?r@+t^k-R<^0?hN6>Q_MQ2gnL6F8NUbN!E2l7#va~BJ zk4`?o8h3U;XIA}0po?tlF@gv(e%k4YRB06r3PHDzTS!7;j71KlL*6_s9HA<2`7d&8OO%psGaw0S^AKS%zQQ}u1@K>o<8LdgKQGm#2Dl+!|k z=ne*P*C9{QF(_=fq67lFH$isq?bFAfxqe1sV-Mr3W2Pw|MYLYz5QeY4WpfNF4%kP( zUESXIWN#1gg(r+x5_tw)52=3Kv~}LADJ!y{*;$ z1z{h>m)C;Ln2g;Ge;R!*N;^&8&@}GmgDLFOhV8lmL=U-E3K0encmBs9H zIV|j>yTm!QXk+*cCU8P%OCp{tF2Hu@qHf&C&0IB&XpOJ}{Efieglg&n3GJWqk-n!9 zd8{1E^DQ7Y;C@gy%OY&mi${g|*KrKil^!mO%VBM}xv0ccMcWSCZy7|4w9cvGZV3jT znl@M#gm-hc{Ct+muNI=pF7>HJj(B@htzBc?;nmG^11hAYbH2xs)@l|W6g&1p*0M>b zvJ3`21g7X5;IB!%1^~Y2xDj?Ms5i)-AAZyjekDY)F#MSt#7W_RX}%Qr6<)&d^h!Mv zRjp}`3PX81=JiSk`!}V`aQ})HK4*|d;yTa-BH&c~+RjFLR5^>0-4eV5{eb{Cvt_Ef zofB)JyH9?uc56#Ii}uJimq9l#=J((GlaA+w)CBudCjEPjlbf1rx0RQreL>r!iC@Z> z8kqU!Z}iNTpqf8|16mEt9_X*V=3;KO7-z2;_v$j~b0SApmO_?l{svM{8O`+>zp|g! zP~CHHP^JNQ)w!+TK%z@I&KF)YqIc1LXvMpZ(2k(%49DpqeI>?-qK2BIs8TZAsWGOC zUf9bs>OXffj7_pVUods7Q0rp|kqR|dNcy5!ILMq(`N!6BmFqMks?73_Y(g|y)4F81 zFKI~%b3#=ZvOV-&e%BUS?&M;fcMu|-^+(H&585(;h!qy!>Tq=* zhCF)h`mV&zT0uXUayw+rsgJMXyR`=Y8j7kLO*;ec2&51nZBXJ|n-I6W_p~*u?rup> ztf)k&Ib7_|ym{_0kv__oxsf~l#T!${X=9xc8W8wnZTT6S1gDZv3AZl87mE=X?#FEOtIGH(<@nUTmh9G@7&0DoG0h4^@ z$T5FfOFojP%$DpbpvyWVEBu*=4xk;it^ULG@p~s4tbB|yR_;i+kHyb)OiBCgaoHM8 zV%BU4XZn>1jhNHOT+R;Qb7eM_OdIewf5V$E>Rir3dkVJ7HE9YDMWURoAc~UeP=tx7OuzSTJW6^ zc>m!uQV82*EA6dF6e{IMT+t*a)Ri5Be(T)}cbp+t@IOS*fD)6+jB4J`q#t*&zw zQi~j}fqQ|g*b)pGt-_R8zIt{HhgRb|ZU^jT-G7Z^A`38L^9rX^nF1UCeHWPJCCq<3@bSB?# z9k|oAtNQMs+-Sbb8Z?6S$UG(TyUJ{U6J*u?xvE-ThAck-Ks>jFTQ~5KkYQT4N!LAP zJO-|fF=HsOnY4)wX*0M=s|z5#?UhOJ25>LgD#t9<^|dVNAXUGRvoozY0cv%`dh# z(pi1U<;trE#7?1m_!%dCnW+Y@CVhWPf>HhR^Xca4%KB1*T}qZx*}@e7Obg8{O>w>azkC=MZrAFxQHLimoYrGFn$fkr#U;Ra(IDg zWr-g7grLNt>EYZ6;0*02gOt)0i$$xkYCT(WBHKe8HzmR(uQ*l?>&B&~Ms)|4mwq=J*FuUnIOM>TlP+)_Lt zfrdP*;$s?TEhoyvXPCT1?}%B)D7A@^>PIp#g3)4Py!oh!qMEX6R_#OuSN-kN;WAdy z_r8II|2;?2QLZV@=@h6M<$ru{O(n#4H^XUW`Gdb0!x5X~wj{8XZum3Y7M$aLca<^C z0sOkj^DvDRZU_L!>rL@r9#ks6-cK5$idwE{q{1I_y1GaTy}Ms>{BkMx`|j!dVCS|C zN0XRO zwkJINt;Ebu0%h|Z2p^*8{DEm}D>b6;ab}p|qHGW)5-W(t=8bO6Y*S0~89ao^Zzu4N z5NptPjg=VrK7WvVWev8=JerW>{=dw+RbPl5_p&ymzT2r^zI-s$} zStmUh=~Yl8v?DEfDK2zUlVQ9?K+ZLAx5nx@=(~NLQoZ>YaXDIGIsI6~riPwnpW{}p zXWn8@pdzl5CUp-bhY}~Kr1Tqc$BI(%{%XY*W z@*$X^cJxp*b4XU7c>42w-x~r?SQcPKA6KrJtewD5G zD(oEnXzME^XwNF|VDbC$=Z%J$_64<+mXik0(@9}zwm`$L0^G=UZodQHi$UO#Z{8f6_&?UX6iryiJ zK-JCoaBQ9AqJmHjmcYA?@x>CLD=R=PO>CU>M~I&FT4=Md@6w|Zp3krA7BGfvhlHe` z+p9#MReTTidA)m=JKA`E#Tb9I+C7V=>!o)!6M#@8ye|A7Y1G z09;D%fPII&WcE0JW}x+RU1QsBP%&4>RzJUFWKgJSmW1JF83eo|7kTLRM-YHJ(qsu| zuiy2&9s^G~nQsY0{P?YmgA>}rAI-jAgxE^wXp zBX=U|jMqsbr3)8qdrDjG;0~^S0%|AKwa8CQz~8}q+1p&6?{fFp1UB7mdTyWnuTX@T z;s4?yftY_6K6uq62-wap`k&MABlP3_jkC*h*!3k?i7OSsQHa}%SuYh*L@RVS`_jff z7h)x72uv8c%znA03nP5jDIWBf0=r`e(|Mi7o&-iH0t9Q%TK_RAuq^~E{_wux-)j- z@B&=-A7Y4#*EWDVL*<*98T67-H_&JKcvS*Tv^Y?}oE*F+e8ms3R6^fW!dA}MQ1*5- zGrOsw=G}4@RO909ogm#RqROo*w1r2>KEYh}3w5dss=4X?BA*P-JL;>-TytVq|?4oY?-|HDK8O|$``e}NmLa5T*HSQMWcN!I`4 ztorB|mhtiDwY=7kCe)D@nm&x(_ET^4NkiK$Y4XW4;P~lL8JAj)B7%$)FKfZM7hEk6 zS0Gg~G=J<{1ay?~rgGA`hHNi+=k|=T9qni#k)Kr0nW*=;Fpz#R@N^O=y?6LWm{i_! zEYJ638M|#I#T)f#R>+Pj0&4S{ zJ4zp%SGjUZ$bV_4=TpGP1wev3nU|7J+$_th`UF@n`=+me&o;3VjBwQ?F&)hA*k_)V zi-}*e(>4i}nRn(hQed+`FP+rm%dpkIR>-P!(jS%?7cGPUIIKeV(Qrged=g z89Q*K5$4PDqx!jF>b@`BK)gmzzFF&?Zm%Wtz zwOD|9@>eA}T}&Tx$R1ykezlTSX9Wnn{&sp3FY!&P^^Rv7IN)F=Ih1|mQ;UcweYT@6 z^i(XvK3gto3THTz0Jt5m%0@G|qdp@j_585|rFk_TzQkX6>bh}QI^$EN)@Tp zI&t=ZY8qI-PtX>*0V6+}F1s9NZwS4ARj~aRZ4>24b7l#?=+U~I>6ix})OEYVUnedeQ_EON#T3kDFS)DN{tom?aN+(tpvzP>1DHX z^OIJdw-BU!O&?IfrFs&g=>Iuw#gm757?Mt!VI?Iu*ViIMLM!+Be>_rG0G3 zwAfDO{M!`4`q5#F-+je)ni%sz8++)$M;?5fcs^y5n4ODG_kjwS3fVg1M^8~d&ED{T z&v<{ePHq-A_<}nrG1g>-qW2IL;3)||32G&G>-J%22X*GH%fwrvvN7HUn=Snp{vHi| zI(Z!0(HDN@qb^YnTzmPU?R0!WejdD`iSp;DeIYJ~$^b#SWN*PAb{une?Ys1P^GPF4 zPsCptXBr@iS)72Y0LzrqLxhij?&PO#n?cvlPtL8AAjUZV`T6F5A(bB_Bp_oo!O$6V znnAh0sId}!W{;Zt8?4&>**`ql+A6Mf7m6t^yTF9>v>y=0w=Kiu^1gLKg9@qW!q@kDcD@(`)CF^6Fwedow_7b)}!orj>6dql#KeMCnB41h^%M zN9wN=q=}U;M>=ZosHN3I)HC5m>A|=lfX%6?@qHsNIE{EZ{Jr{%TlfBre^Ck9stcDJ zijVLCdaseKF~8O*^ky7_*0?@acGACMq=`XK?V>zpCM8OnO(c?o+PFvh(GN3_i%T#*(~dlrkU~NylQWxYI!~R z!q?-M+mfATV8e>Bbw~fF4j1U`>ZY9*&qDoqtv(xMQCPuTlX@B0^m^Yi{WnjyI#T_{ zb)MzH;iaau!_bz+ft^YKUj#_8Qse6%s@V&wr^I2;sxk0Fsg7lS`*qA? zj8W6l=NQ}G0Q)*c{q~ADK#%tm%uW8^IYuTl(Ye^SltIw)VzSdW)zxHpP*V){w?o)x zA5Qgc%JcT%4=ciHWzPa$%5&8dw0l2f(KV+H5+o0Z(ASc(ErIoi3zYg}P;!XS+PV|Ys@=BP3+48}?|I(oxm4HvR` zzw%ai6111l{Fdjy)cLMiph=03rMQ{(j9^kM;?`BlY;sgwQ8z8Gg0Eh^|Cw-30+KGV z^EfL*_wbs@%-r3d(!y_*E~vs!nro2NO_V!u6)s|FM$uKR(rB(8^(NuSo0{;rhHiJY za{ei&+}oyPXTEpSe0^n1HrlV6woP6I<}U2Go?X6e&#P@!Pl$%6l|D#)S)BAKh&XKB zyumrNHghB`y7=tTkC<(KdR%I{Up)zPo;R_Cp^SKWcrbwWhtsz)%qoky&_;XD!z8ZO zlj9bJiEp)fN<|*V+q;Y*;R2Ms9$e;1j)OLs=hGkc&Y-RJH*R48mDMLWLAJSj&EZaq z3I+xkV)Ey=8)9N&N*?7EG%k5Wfv^F%0H@TY0Ex=JGZ@#>gy%z@_%pwdpXnt;q$Nj{_4E-L0+Jo`U&K-q$gP5v(CsxIeFu=}7}l_Qp#?ktja|x>hvCtV#A- zX84n}A5S$c!ZR?rSnN{NeAxo|639VRe`Z1P=2Ol%3At(2Fx1-2m%>3PYkQ*!(CcEK z`fVaWJsEG5r2fv=*T_MAL@n6gG4`g2?iZd3nf6|S%2qLVvq-}PwnQMpK=2+1rFzy} z*qTUYr*2<17q#r>!=i_upSMsRlALZCT-J9guUs&j z-M9rXshyL_H4C-Au=_T|}fKAZezyYAz&XbZoi0#AIr%(rG z;f$hXCFkCI{gun*lCR~^W%UdHCpT>g&N503QNind$xKq4Bc_MI`Fw|CI@&I*Iu6`b zk9yapyQUp++qg4VU%gBjb%};!Z>IAy6liyi%}H5?{nImn!mYum03%LSP{e%7HOl^b zP+Erd+p;>tM7O|me&VvuSC(rZd&55kmx+C}^Ko`No0>?xBz;ecA00+7{~H4#*iNIv z+*iB5-ab{sc*D+~6Ejw?TXL(AH0oG?niVH8V$Qe6yGcUoCuqub=S>-%zwuIf@)G?y zFclY$(aCsXm_|T)GY1F}BL#8><~0~`e&SnxaNqdB(3v9jg2N7JV?z1ESJ=qexPd1M zsjz<;aFS@^qS55GO2e|S&w|@Z1gY6EMON>@qN2fDQw_X7g4lA zy``H?Al7lX#Q$K$=lW6Wd|R$;Z?dXz+O_^6POp2OM+jAr2!ITtP(W$ zTwu`gDLsB$#6=A@Ia{Ti)x)8g!F!sm^mp*N$rH?_RVuy~_bbQ{W1&W_wVy2l zk|mx9C3ciheUsVqS%wgRETXwIOr5QZHCp5LQ@QIH>VwQ&06>nLsQF74f@20)LrTUA zLzhKWs!%|jp2(}tu8{Lb1qvQk>H8;qo;!>JA!$0oaG*ngkCor8Qw-a38+9(h|Fz3B{eQ4Q5C%5*gpUOxK3rTpKfgy~-|RwnPfqUd4xv|=SAHV2 z^aaGYrU<5=4bxUr3uQ77<*_J^7}vzeK0l8#{^9<&H~Ez42K~rk$dO{Z%8er_|0I3A zliW3vc<{nR;$ctv+b%DY%zAVTXqC&|1vgIS<~r(8T$|)@tdvve$jV^1Tq8i*T2 zalV$hK7y6HmlIb&hr;u3y1aJB_~v?|8L8=0YX_S+)7`_wx;$TC!c_Fbn5D|w9qm}B zt|lCi?#DT>PMU38b>O%9Q4^ICeo5i$?a5-9zS^3>?|KikNtWuy)T3(x$BKfV7<5@- z|3y-{jEsIC5Gwvs8F0}f)T@mRR!SH_KXnu%qzgBZPnD{y(wFsV?c||TEN5|g7k`xc z`%{`7%d;Z1CA^~1I?*7zU87p}dgABgL{PZEp04k8|DWvm`bEWkiJ@m*q>&6uFTm%G zlQ|zG(!*a4ypxYKB}JIxrxp@c?y2iDrTnal4ct`o|8C~ok&%E}^y}J{gX2@V;}I@* zGMRo@;CzB7osqxj@L|QCb|;keI9S+ytZ^gws>%j%c$YUb)pS^2=dbs(^TS>` zecWm(_GOi6_tBZ2OY~3a!jJlIQZMpT0+zi-_^39DB_#kgpfnlyFtB1s7EB2*p-I==5#Qzrr+)24v3JC$P+_Hm*KsyLyI%|%F4c_QUDKW zCHpx~^A5c)sV0#pbFib3vd1P`lgDdGUvw0x2V5e{?p}YE&33!FS`9t5r?4GgX%f?4 zs7tn!qI`bU>p$lA`V_Qq;(0er`yQNUH*@8zw)bQIZ`AF_rN*wGUbU%)&N6o-0L{a0oT|#?mgQ3i8gr^X-5F~zow7ExIwY_JFdbRJddpMN zUlny395u0zh+t*;u*PlhCwV@`q>Cji1+BLEfX#|vvI+HxPG)H&C+UIjwF@yoe*Ge& zz&mz9hNn~*DsFdsbV$0{vX01LmNFMs<)ue7n4YY4I(3TpvpqJcbeyGB4{F)((T=}} zSkS$8xI7WAq^foCgFMcHeGpHwXcwA{_AGndrl9a`7neS9Oe?&fAmGBpgEy2^y` zfzh87EC~t>R);??-E%n^^YG==)mn7MiZ-x&K8%)?ABbhJid09IJpP(LBhB?f%-;QR zh?2%gXCG$GkA4;wjA3lFL6#e}f%VFlLID^u{qRxg2Y-fs>)UP}(6()Gxurg(v!($4 z<{}ds(w$;`akwir7&*6n4&MaUWg*3p@ukrY{Z%s?t5YhAADRQjd$dS1zRT|C04I4? zmtD*3BzU}n1U+qtLX!6uSDOKiI<_9oF#+|f*ADNVU?dY0Qi-PfPi$B) zrLCI59QhxVxOCW}JgeTsz-J?(jG{?N+ zksC>4&|%jEwc56)g;>@!lWdF(OajMk$DY&Ww%dhtvg*9%dV3l2NutX%E^x9H(Qy&r zKueuCZe>&!<$&w)Ik^>=zmZpn>|zR8!b_TQa#laF9mHZda%tuZDxmc>bCEwmfXz{= z<8y*r_dbiL*i1?O8k)uc18D1<4EmP2D)!nHt{`U^S_zRdYPURRaolwfoGU6C!K?9I zmawe5*oWQ2FI}(UuwgE%0FMYcKXFatdAUtNa&@+V=68F1Uodka>0qu~pC>ov9A;Zx zL(ovbioJj~8;0pNok}ErDR*L`X5tYA-dZ?M;H@6;;?)T$NBoURy4-0wvb~E804OuG zsXNe$57gCTD~+~=&tklDtjY%%&}-(~n~1cxDXx)sb^Pm2E%|uOwrWOFGdv?6X zcPcKC#qBrZtOMQwwx~u+;?BKbkkkB+gC^pzitMfL5nt}H3U<}ozq2-eVZW7}J=TjV zN6*L>cBLEBhj~FHSyMY{L&kz-5PQ*gr4ig*3W4fjBWG>YvopenpYJ zO^cM=*s)vBeLM$hhnhJY5iDT?|6SKY13|MT%~EE=e{`6Z6otgW*eCbC(ikU54-d#+ zD2{rH;;Xk)N@%Qc+Xrhdt?37!+$i)0-s!+#TTqcp#5lr<2;Ko4z1!-H+iujIc?%I~ z2cf@=e!n&sWiCZJ^lpm-$jtfe179RN@yPw>AwsAP`N)u1&s;d9_`yt_l&XOxlzVj# zqLYspVB~bT-sl# zB6{nj4lgge>Hg0Td8Q+)pb_(}idenpZTQE~d%`b@UFSXBdDI$PT~Tc4hYGNd2K6>c zpbRIgjTvH)f+ky#T7vyM7J+=tQ(eaEW`G}~g z+^I*CB|8zQTHjm9G@h92#D>+in!~VN@`y*wZoX*KCbUo-^T7Ax7?6Vk@sN zinY&Eeuv!mV8P@&G422P*R(mu-{*?lrnXr&nBW{R8gX59y~RYpgA8bqGjz2UGd=-~ zG^mwKMSgF3Ic83nuA*-74(ELt%QR~PGs%*{o=5D?foQ%}>3*B|D;wSWrhS$v<6v$$ z7ukt~gN2SqyMN_a#0_yyAYkupaC3BP?d>^{Py;vn>e8yrlr$tw=5@C$8+U7x=~_9@ z>eqZ5^a@I8&+QThJZ=0XToSI_`sC=uvi$1z`>?Mr&6iI;JYri@WVyceC90+4HolQf z7@MNbv&qv?X|wy(^gl+#k}(qF$X}&6`4m#(#NzX+juK%Bb2p3KqHS#T;uE*1 z(W+(dl?q@V)Lt>i!-$1uaM!6V?u9~dK8UJhNVFQyfzr{)iM-hVr*4LiqXVU&J>__= z54qg5mE?25U%@T1b5VQk_5qWA71swoev6#b!}_MgEKBhQ8m=o}BO@hiu0m_^YFghG zrRDDW?9LtI<0qtZ2Q^Nw!C6_vQOAl}>La<+pHstrWKTx&mUrr)J?9Iom-A;-2_nl* z8r@VWbE*HzZPeN=By`YXE~Yi}-V$fS;Km=07m7aOAvxZotNxB^U)vP>2g1IQVyhQE zPx+`cgnHx&&cL;;`0MJyuL`Vdh@>L)0urL<&+d8cfc2TUx&@7FV82?-khd z2U7Kx-~r0}S-(!Nb4^YJf_7^HNk8R(Ayl#gnh^^%FJ2LiPi=vK5*qmv{B^wW3vqrAZ~8D9!CEJGxM4_`ne{$}jT zfNwiL(D-dkU_2mHm`>ESd<5sbiD{vB>p;y*)cxhZt9T-~#~hb&mSnq}uU#hG$G)m8 z8WR#@t4q!g;8p2leTqm5!NeerAg%zV=(6K+5uhYV=#_?xm0v|d{lJ!oB(J*C_G09Y zc_X=P#vR-e4ixN`@DbBWhnD_UkgzZC&Psj36KUUK?ov%n0MfZ`{IuS6dKUs-z1Nhi zBG@O;BA7aPaM#Ei)4`}@k|<}#c^0Z%g#W}_ws7iHv>D#OU{7y|m z9oOr0I4*1fLBfj5bB4{ZqfwK%MfMc5>yD|~-Mmi~TQQTlB|~7ptUkU2KDfikK#s@3TEd-BtKbT`u7-3^L#O7|d*bPf$lclR(LAUX8VFf(V~ zbG~zZzvlOz{p`KgzSkW^e;o$~qMLawjczN%Yy9PUFj*MVGUV5G4ZA&o*zBzvV3TIp zmLU6WD2GwKtRE!y@$*uCh7KzSWkEpx7w+@gE?GLTR*R*oX+<_=hkZ+aMj)fp!P`lr z`etWsYOgkS7O(lkYi|8*FrJUc-X9tAx68<^zc+Vnvt}EiLw#WPuxk3#4mbVtisa3! zu!&sxB<_a_Yfgw|*lEo8P93~5YQ20p*if?dmU>m-72lKePXmjPQr?j_KO;(ZJWNrL zsu{J-r3jx}Qw*eA{^LK%zb(gEZ;&%_wc9Wing|WyvyQN@`DJbJ#;3qr*1IdpiYsWc zAELE{-+RZE!OOahvUBb782th&}ntanr_|Svnt(&7G=*`6i^!fA}aK zDjuUCYB}QEsF~UP{8`7!Ta%K+3n#8zV{C2y1j&+$({uAArLh3m1l?Q%MpUMKNor4q_2UBH@6bBVmm0j7geuSv+`oG8Vu{Kmt zI85U6!;YmZm=I?0IP)AN=CfjQ`_o_7ak#y1#IYu<1}b~tQ3vTa>^*pHN@jIsoTM!L z143>A2WIRhb{0OrR{P20&U7qBbR~I4f*tgie0?R)h+3DWQW6x(6&(tntIF=S;?z>X zuLIv#)J2kt9N0MDRmi&L{QLyWFBV2Oe$gwxH*u9r{Kz>$c#KrFR`Hnha)Se#q6t}$ zM?F1!qU|@*0nLBD0`X$o)SZuOqe#DX=EULv5|*<+JmqC)1m+2Q1Wz(Gf}(hn<9kZz z^Gdnj#_4JuL1tfkVqgDQZ9X~6TO3jKnxV7O)}G{a9(z}aP5rj(3r4garn!~bejfvf zWg3#NNT8~k2_7r%dF0xfmyHYC6bRG$8JHv&`1ul|#$3InerRF?yh)CUiYkSdnG|-p zc+t=#ciud*#CFO?n&i%E~%2>)eR+go2kqJP^Uh_ISu|mzd^SHTNwUviBA}q!y%#J6w zML6FjFJ#X8UHrg^(@09x9}nLzp(mXaoOhJF5-Tc86qf_jY1^{ir(hXT(V36UsI_eR zs!?5yP#25E*O_8P1tV&TSTZqAh=}3l0n&H>jw_sxWcR0c25d4RqE9H`dp@50luI|XnoG6cm$H$e>&4HE&M&^> zRpI@RBu1J|BLTeAE;1j}IeSw0y-8uGO3t+9>6x!#e&a)3e944-_tL3l()HSVr_Nq% zey96y(U8zxE{ved(eXhek(?m!m4ZU^EhmhRBlk-46p;DnQh^_-N6ybN4r56!4C=Z{ zf=>&CKxvq8b8_g{q-Wwp;P1Yd!->0YNY~&G*z1vz_Nn@kzbeyP#48>`;bF9ln`v&7 zBmK)%3D*mz)1ze(-%39xb!(4Ul$<$;8yg*u{23B`5lx4REXbQ-zfJtmwAodcD~AU~ z=WG40nBO9)E!ST^`qM=G1;DG1JASp>$vud>`Z}RcfYf2lk`0d&g$1n#^C1(@_pRCz z%hQEijtB9%>UXXK4>UC-0Y}qvVV}^R#QBY8%mL0KqI>Vg;0|8O`#3!WF!~QgPon16 zRnT+-@&(HYwpB^f)8v6=%EH96%QfDv{F6MVY%g#+`%@Aw5N0DVgw`bx30IEE%`&OF z((Bj%8_fz^e9}6f5dNN0@D8W?OUL=5s|}4Fx8<%r6>iMsJYXWS zELIB^CQ4s+P*V02mLmVdEcXf7e+`ubk{}0InKgXKRW~fkPu!d~Wj8$`sStPu=4R%p z{s8v&IfPWEpIM!*_T4VxMggn8e(aD*VONIVBzE)<98vz4Y>NJ)KR;zs(N+Y zmnxox&55~p{8J1B+I1xb6l(jU#*v?^59%redo}``?=0HF>>Pa z*6K;{S!3@iILIbnRn8186D1X20vSafTR96%U44G3Oc1vTd8;!ZK9Db*rl0Mm4 z>!YZb7BjhB8fy(B`hAwETk&i|TSr-@TlTE)YKfStVTDr;ZD&eVU77!$720eW5>MoM ze~mE2NWKUavWg+YGY_Ff?x;k@g{=jJ71k@J7vujomv%u{eViZ?UZlkA6zCAv?HWJlioZH6CRvnjGV z*i+Bx!$~*k@pN|`ICX=TauK_~W?Jecjro4F&M2S>5J1_u zsTpv&JS)E1;o25`Tm1A?56YU!8Qk-?R~{l)=jaQZ-ov4d##jd$@VKyR{|lTdu4Idb zg(7zTrO~}aZNxUn^d2$i7R;3)7_nG5!EfO&L__5}p#KG(@P-EfR$L03)_@Nv#7EZz z0>b#N2wgtB=A)Ux4qe`6iMHG>hk&z?RF~?RVbCvUpSzaVO8}6OXuWkow*77SL5aMw zwu{LQF6lX5&h;XI(JMD2;Ckq^VU66LJqF79;hOKq4)W<=Ru(pp4Tm*37lkSi(BS{C28Ko$oC5m>s)%>WC)bY(G8zoFHP33dcXFPF9zgMjIP_b?Rk?s01 z^HJw^-1)D^HX}%se3?kikHD9ZEa_y*rv2+*?eC>Jv4b$EH5b}Ik)SxzBIS~~{^jX%;=cZKNY7jN*FVv9N@w+h<}tv% zFc!1q86F`DRYLTyhG@O=Hdar{xD&8#+0_kvzO|Aj30T#}4K&ZpuyUE5e=wO$fr_cse_Q2itOFnp2h!x+j2vdM4vG9(h{S1F4;J3C+5^l|K{ z=(2(@DC_gTb%W7#SH0++KKZRwR_b%3oBf1d_hvz&a)IEpz@)9@o0rEQ-Xhzln~$)i zh`rDwIdsYCb8YQMxy1D_{tn2&-ip2D`*1RX5}`tKj6YV+TGxor9MN;T<(T9dO1dO; zs}!LJH(U3g3xmC(o(_WKzKs)sh>{E@98zrANO6bjsb^*#``<0%Y37_$9U*bkp1h6J z1wm$hJp|TAnuH@c2H|zMnwo88j-#!;b!wB z*ejo^Yi4YEJ6M21P&@W8k~U^$88RrPCwW9YfzHd@D0~ z>n`->B-aos{}<=4#yp_PCZKhWs2E@J)sT=y68x%_($sri@&e%$O@fjTKryxFbe1B8^B8D1b`YWUZ~vffTSlx5k}|Kc_%am=a1n-2B2S3*`|X2|c5 z7sy~D-3CcG+8^eow1;FvL=g^pva3Ul`q zvHC$Ee3n=kkjeMUc=I-um3HEi>}gHM2{Esi$~;mE9$N%57LWBq!d-sny zWT!2L)#)~^lH?r5WFKGn7;#1=Jo!X7cFKkCdp{z)tyGOApmm$&n zIifna{fCJ*-MriqPlz)327YaUM5V2EcG!uzkv0RUoDuh59#QP!r$aYqfieUB1Z@gKs_DPAwm`z=U+Vxr{-V9@1=WKma|3fy}~* z6*vQ&7xR#s`sQ*oc_%iN=ZZSDU>6oi4V_c^4K%yF3@Um8F(7v2IT8?9eSA7w%0?pF zx_;Z7lX8_SZQl(LGxEd^0Y)gA=wqJF`Ah;x1+5>D(SH|Mo_hp7IgCnTm{jA#6Q@9 zXfmN*p%vm`Pt~WMsdm<8$2*ZFOF_5y4IUkVRwN=xtkAn_Wz%y|2phVILzWOf*oHBf zenq@;JQZ6G3bT~zNaL}8ovs~2Y%*WB7R0DK7eD|kD82VK;cUVSb_TNg$X{4ysgi_# zn!)=0?CbJiQ&npWHTz*_ejt&?FIuR8f7zE?tvC1NOxoOKFLQ0z&UcQZXL@YoS_L9Y zj_$;ci_(w2SXUgkZ6Nsxd%prF(}#R}&luy+x1skR0uQ|({@g}Q^|=zcv903|#IDO} zwav`M!-L=azwksV;Uje-xC5Uo2Kq8O)RyaT#8VR12uZ6Em+(@I)@dI>rh0uqZ=M-q zR-n_}p3SS2(vP##m@4{wo9?vKa^?7~a?2+?#V8ALwuNFl);t*zOtfZU2YpIe(h)!+ zJ;uABPyG?6cO7-!#Gk-z@EUfX*O=$TS#6Au*V?4|oMUtO$2|e*zF@xVVTIorpM4KZzbtBdS<3o!vyBm_ z-o^Da@p*gNB`=|CY~NqVc}CH}9f$X8)O(VQ@R}3#iG(O^pyP6Ef(PUDi(h=g4)|(CUm3&b%#*Y%f@z|Y+XNPH0MW(#q z67tX!lvn12NYx8}C=%iGGqtR&%xTe#bi2cM>}gh46>*ePru!w0E=~P}c2xE2c5}*r zI{2Q*i7JMlEMh2SyaxaC!Yn(f?nF6g-Bb&Ndh&E7QIS=K3r z9E7kMt!|O|0Wzo6hu!vP^$ZP*YwU`b;>Lx?`wgKSTCOrQ`SY7;pM&cPo!bhP!pKR6-;Dp<*2k-DUp%I>9L3>8l1#5V zmYdR5(BXC;pDH=`vHFb-1zn@?=EC!Uk>XHx{q`k7Dpkz3t?edErb&Ixu$nB9ObMKw z%)MbKkyDaNDTIYo2W$o>Vna+!n2Qz3b%DP6y2?f-xlJv$Eo`YQsGRT(b)Cm;g5*Ar zZ=9{7!Q8i!f;Vl5ogOrk#H%MeY5=9H-q`kZg=FUzb#p8Z*|(V6qT6*j6}mTGO9B$0 zofGH!A2#_VX@6*BHUZl0X#yzrypzU*I}Wd^v_&;Jf!0c4wCD@LY0u_PR}K}*$2JH3 zz$Os;HLo4Y+eOZovdcugaB3RO_?${p|k_@neOJrT{de70vk0x-~ zIi`B`eSTa`V&)GPYF3BucrS0{3ni>Gd8KT8WQdG?v)#YqzRHh9PQoLLd;K;g|<>d6d<>qd>EtbT}?3CM<1j5lu*W|Ml?-h zR{^QK$%!hm-PbL8Dm%4igu{&tpq|-#FLC6k}e#9H8 ze&hSg`%&rgO(;MGwEP_G;udydd+#L7vrw?O7+HRX92R#EEt{M@4D>wG=z5QDUM?dM~BfVxRYRxP%gYaGK7Kf74xPX z(fofZk0777O$4etmFuktorUu(GfaGbM!6}!--Imc_@xNRvoL|3!JKW4m5;SR+V{^P zg0O#uyBADu0OC9OHM^1^s=nTC-$Q>Tk$+xBXRsy%wio;}JM=ob_9Pl6~Ao}4vxUv1=cc>c>-wbVW<_#t=Cwb7}^ zY4F)QM^u+PY@5UPWV#t!*zsgqLm_1}Xb)17CwM=&d74>6ytl--7xr8Qj~(x%{Dyw- z`bh)*A6qEZHv^FR8%^4;uc+jQdJ#Cb;JyIW@kN#ON^3&^X`Li>=oAKW+Oo;R9XT6; zw~9bBKj(3=vvPFnJX*x*3AyEjTUOQMf;YScE-zZ+;YZ}uTM|_4dvsO|l9LB((Gww} zhid_}hCZ3}QuvXXNz1R`-L1*+$C|TT=f^19N4f9(bewdi zmO&_wbjkeiw)RW`QBK|=aDP_Q*vY-8F#7NoH%+^@2ugItM^w}zo?)2{otn539HkeY zNYrDh6KYD!wq<%(E}bUeIBnLuxBvL7^IS(&buKbO)f_W}B%E0=7yhCD;nZ-=!7X8g z*mXoQr*&ebij7UjkF~XND{?pZ$GS?^#AwV}t(;sMtf;IgL#(#cG5Hfv7yYSb{jx#A z_K`HHg4k)^7kgF-{4q6wso?y49WO%M?M^0A?d79jz;w`Dg?0-O1IX}2&wk(99(>V9 zIb`t8e$TC5LMdIVkPlG^GU*Gwte<2lf9S~^p)=FPvsYLNY90yVo`9Cp^+5%VjlQmN zt<|FlHhn7C`bwTDum9Z@4NsOKobtpR_4l`3pz4n+=@S_2oSFH?$3!!Fe2~lX*yaUImj(|7X+BuyWBZ*7c)9(Ugd|v z{I!;>p`M)p9QFePepTH8U*8>InQyk2D?48zPDMSsfVJte1@@n|uyM zsAs}nhq8Zob1ZxLpLFB6#8bMmpbiAkoAPq$#0{ZygPe2ew?)#W`)0m@a8Eh;NfUHX z;mfh=d34SB;GgyOBtJ4A4NlG2WBGxxO^$V!O-6zbhY`jTn}pbLPxM)5EI_7FOw}}{ zT43Uf*Z;Yoc8f>egcuMsek;06bW{nj+PJdTjX-x)N;qbf`pB1R9xr@yWYM0`Yg|~! z!Boq#=u#^bglEP1P)PN$VEvFD(J5gpT0Ig3mk^5;qRb>s!zYjBXs~n1Ia8%wKbv~v z_YTYn^y{7e1GVX$y7kh&I=XVN?Xm;hfoKJ^1s(QJ&g&%<7al8BjHG$?jyX8KF!4$4 zVSyB5dkl3ih8$_XV>JL!KG?L^s<`Az;o#c`N_G;ySjrlRJ+M+#0VDTqg&Q+}u*>+q$cQ zk=vA0tsNGZwpvMU{mGk-uivvj^ajvo?}Tr^H2ZvguA8^H4c1+i%yUd>U7%UNXirt> z&uRAk*yYpL1BEor?jP5fr1J7rHXLfr<7rLJd?=iaX^F*nmw0;~tf*-CQSb(!Fz_=L zYkNUOAyudZ_~unM*@q9Ca%G*p%AI?O_)A*60VN`4ecud_=5Mc&d)w)XqK%%YfCoEt z|p`$=X3XEl*jSjCje#V-;D&so}Y$c_L@y{!l(xCpU==Qb#fUpvZ`=y{_hvPZBeAjw!x>OI0My*SZbsv~L&=Kf&G?!zbb z!gFg)YPY)jYQWaiN$AmOkkhqD^uvLw^O~p%FeGl7)a>XZvGyyG&RzS%RsO+LDMelT z>=i%+w$Z{bFLmE{8tu+fZhT=6CQh46(>2;edY=TM1_0hCm6E*0%kX1$7BH}HV-zgd zG4=*w?yGCSdf%Tk>F#P(SL@NP)pr!>(oOGiRzFZ!&0wYmI^l=JDO-}q%@ytYR4#%y zq*&xX(3$^^H6BKaY55z2JJBJ{hKA_zWJr29v?PMl5oRPlj4r9iUPqe9_}2j=Q9tr0 z_0xi(s4uh&KpW>m=!Ygnak7EsS8+P9KT>+b2=ZhZPS)`%>Qw2EZtkFfJ{$CAGnrBUe#Xth=B(s+=~rSTC10R z4z{gyIldW*`+*zot<8V1jX`bO(Zg8fW07xM}r zztjpBt?QFCW{-#?+ojTNyIfiFx!dtdK-c8u&XxR4_=-e2_&TgDg|yh!=dH0_b>NVI zQ^RAT_wN2_AuQfi@U{lAzkmkl3TU_cXwX@6I_D_LT77-tOe|e%XT;7P<68j29(z}5 zK`@D*(dr_P!TO!R#hcy2Es}yO44AkIP%O*NC#cG1f=GPJ#p2p^YPfT(WoI$pOgh9C zyJL^pTiI&86N`QCyEMoKq2Xe4^8^`paP%cC>oAr106$kN2phqAMqNLw*ajJyJtx*^ z`4C6av&m9V`J(-C0b_$QDhZ5m25C0sTCbne(I;jGd`4{}^SU)py`PoZA?JHH`Bg}7 zK<+pCS+BCC2T=2nMn!y5lN2WeaeDEnr8^wZ{9!iS^6DD}=88M!+yAPpYFH3e z-JP51%wLjMze>o`gjwE^#JZXwpjQFqcl4D1k#wSo3P&0L3<`Pb;#sI8xc~O}ab=U7 ztMR3dFkEW(``~s-#6Gc(7})S}E0IsAMjg$jD;_xHHmTJ{{R9cuj0q>m z2Z&XMGJN92u~Xu=<9proBvE>MmzMKtO04z{MZ_dBVL&9M<1SyRUt90?{&+gaM6Bm2 zk@;`Xyn2WYEk_T6W?nncLHj(3;a)Bx@xp_Z;73+zpobHD-fqvQpRnAg8n@rjst1lm z|DJBt%!|l7z8%G5lQLuFtMuSBL+OPfnoF z^L@zGA@Y2G?5RMXfbNk=C*mrW9Z_Tq-4-4%KW&Q`<<}#>fE2IYT-37vTmh~(j<#Re zH!emzYVB5;-ypb`DqEum9Bt4*aL*Y?Ll6SGbR}Nhw)Kr{vEJ@^?u8Vqu_gJ5(Sf~< z=p;{@B5h9Su+XXJUoI^cZxN-kR<`CJ4++}1{mbBK4&dBk0oE8p^QjV|UGe4BQ3Moi}IfAID6!QJUn+ z8YMU;`Sl?ip2>>|95}H!bXTwA2eDE=?7$_z`o6)HoC*u$?TU~OnMk|#fJ|Aa61whJ z*8`e82R3n;7UG}n&u#HMM3$#Gd-FeYb?j|r@=|~V#%|G%QhDob!HHDPGge-$D0cI| zN#_^IDgp)PwAQz4@t$X0kDQ>&CV)N)*e`E8*5)UMi-Jx5Th-h*D_d-ed7;uJs=G=O zRQa0cYxS`B_CFAB;{fm)L+i%5?4FroRadp;U7VWFIZXF3J)NT|_>U4=JlzZO@7(Fe z(C=99(Fp`tlaF7JdMLdRLL)+g95rTwu03JjHhB3NymTz&FeG(X9!%`wB*Sy(WJww@ z_)=#hzCO>uUer83gArFg??xEyZY7$0b3K`d#*!Y#ZV^3x6=uEb@H5T%Q{5$Kqrnu_ zQ~ss&<`Idl532mKsdIyb;*8f_%5DQ2P2NEGf<^QXRv8-dKZT$D-VIi2J7(a6w~oLIz1H@U#mSe&x3k8gpeIr8Ia8IR*{2x| zdWjz4!dep66aBFbx_NpR7SwW6KYJssRM^rndijF~32Lv{!iFr38{h1JlhA*%c$@XU zNR{Nf0sgf6?~B=knq_rnBxjc)0f~%oB}XOiiGE9g{-XPy&68OAen5=M0T9<7)P4Ap;ZZ!lj4vvD&kzjmK?hhhLr#p z9#u+E3^4XKo#C`97ML>CsjOoY-)sbQQpIxV3IYT$MgvYX!MVpJDPqi3q5@{S(?~d} zUa+{sd4I=+HQqLrylw~zTldWjs%=Y&1HDZ~n*0>$8Sq1E5FKref+v9)z1!EG-8Zzo ziK0XaB2NheHInmS%;0whVO2teWJaEtTzt5ja<9v`s3#wvDP=Sz6Ww%;5~yb0|UhU!)gwq^>E3VJ}ZEevTD)F&OLUiDDtnle$9Co&Eep@;i< zJ$P`Cm7G2w0k*&yAz&#(zm^BoCI+4{F;*gjjsgYHcfd@o8ekR-aW&g>kPyPo;d@%O zkvI_tg8Zf0K4N`wDOWCl2+n9P078erYV>Jh-XvO4{o`Ky46i$$GT-^CQh_v6-C9^A zQ^2WHbyAx#ReXCXauU^}#o`{?Pl{#lVl^&TT4LWDUA0mQSZ2bG+GospB@|UknxI(% zJzSL;MP)pw@smEN(6`xSKmSt`Glo=nOu+Z7=sg0JRT~rIR1v-w%TIe=xE_J3Q-_{? z=4!;h@mbX96_SM>(Fl0Gae}tSz0bNbXytpz;q#Ai(!xuds&lyF-SE@w6hH?F8@m({TTgbDf(Ep?Xg<)3JZ`SsER=C&SyeM{xm=cJ7G7 z2#_U%f62NYl#RLZ{lUX&1qto)2jasDR5Lp=G;3>9QD(O4P{jC?l$QKRwa3>bZNEf(w<^$Y#fEE zI!!C5UDI=UF1TCrsgsSk3f0LQ+v7iIK9I^*39d(e!QZs;zC= zLNu!&-4Kv)gC26PnQ?g|$`xeE)8spAWv{*rf&V7A%NKR>@VwlT1%w`$^H7ymlr>{> z_J-a(eE-+1&D1i++{vt&*)se4s*Y$$htH69n!&M_u6Fh?N2a+TyhoIygo5g@fG2O` zy0dm~;?x(tScot#Reru)T|3n`GOrX6;xNX36zto!TljYKO570nA*EaYW1#JI_1(P2jQ zeS;2pbnVL#9)2*fVCG_UZC>sw!{7KwKFgr^ZQm(Hm#<$z3ipHK67hg3p_~B%enXe& zf-6}S4ZM2}IlqfP10vTNxXF{fJ&6`FBlD3Ho!BWhPP%c{j8Pg&$*8a<&KxWx2C9>@#zc)et&1=-}^Ei zFJMb^impq4CO7{4LKwNy$Z|kpgLBMmX(Efy1KY;q^F=k$nv`D&&TKKCKT3zOuFByDCBkBn)FS?0)ZcvA5PDz2SP3| z>|`7FuavSQ91iLzt<@GjgFFzE<6@wdi`+BZ#1Tlm{6JBW7sxevPeZ!gK>Nm+(3dNE z1LL(shrhM&%i?pz7~Hbji#NU!Og3G?7!KN|U6>A<1(aJ87Jb#cj|-$SQ48$0cDg#m z2w6C;e9i*XaM|_uuCUY>t%sgL+oz+^pZjMP^}ZQV53697qJJa&FZ^RkPSR$8hs23a z+{223-+^;G-8KL@@UE+-)3M@Pe~BC`Ak#B1lX11G1LzbT12-(~r&%loZo?#9?uw%e z?rIo&gI(_YMZ|Z(?UZ0M;o(kv@42JvHPcZWLO3Ch?63XPf2}UA=ZVt872tzcOIBHD z0*Wu~^RkyQYk3RGounHEtUXV!C+${D)mJc-31H}X0ul#4Br^sd9Q=YdvA)Ll4OrH? ziY^g}^al5~mdEMS=zcbR?+eVO%|OfzC9j_uqRz0IPaPD5JVGm9ar}^T z(Zr9T71$G@_t`XyHNlQD$h^?Z^LJ;RW-rT6R1#z7La|heuDX#n)Vdo7R#5r%HA*|e z6s|2w_@EgS=!6^Wl^Mp~l`RRs+_WIis|U7$a4!N<)@Rgw58|@up?U>fde%-rRl!Ec z&(BejHEoeqb}riZV?|XdnrM3TWxZ{<$6wOw_r4 z`Ie&mc&vzUW8B-5>-Hg7!FTQT)p+EHOs*8=s%Nh7e}fbba2Gnnw3hA{aTT{iN&o8B z0+@%2%Bu3ee1K;E0}m`lCIy*r8A%ulGbv*0P8s&uQ%cB5X>a^2Qt*)y22tzCWjnbR zPysaNrq`XUdTK^smfSA8WnMO~m02rY#*M-u*&G5Ww&Nk})vkGqUQM;Ew>DXdE#)Nr6sMQtXLi$;kt^#yM%k4%KZ`yP&#*jcOi=5I@tc^K-_4~r_qEde%Fb(C`3b%YORY>gIq0Z*(mnoa= zAj%MG5y)Fv2p!oraz!eYO5Ec9=u<^Jp1HKGS;(FZn?(1{1-CCBx3}I;7dc1E3@$5( zszjyfu;=-L1i}Hx#}ZwUjca#J;i?6>#>Ig19nyD z4zXvC2)4Ic#p&!;jAJac%i9fh!0uJMT=CeNN0~Jljd@Evc8f^5!!iOdj z7u^9_eOebh`QK%_>7M`Nt^BxFQXG)wUIp<3O8Bi(=YB;pux=zYRm@W(elWg+AwI-y zf_7Xy+-*+ZO&_v%r|#uz^45l}@P*6@+L^39|1}NV*!VK&>lJK5yL%gS7)&D{ozGFn zlK~T7AQYLJ=;TY^7t2+f8tuJ`b4l(umB8O$AVUXf}G&OscAa!;sxH(zOW zlV$6MKsp)PO{q76MmUd^3DAoJc;AoBjz+z-N~FmKjEy)@z6h1iD3fS&AD&o`$jwks zR3y(BdOUN??78QU=36ABl)+F&&ySgc8=s*y)FWkXZs7IZy5_4x>b{$my3SwhjltXg zqkz2$JN7#9-b^vmSSFIYRpt*1xbfXDSFh8w+R82Jt`kZlhLwUQO;G=I+C!DfeREFG zLHbXP6&LA=o%btiev0)si%Jh2gRK)#VwybK!u4mzK1rh%UM;yZP8Ptt!n=OLe{X)t z{!v>k)pd7EwGn@0;S!8xb6BUxNYo;*%TbNb7fdf#u~nT%Y|tJUmCj9gyRL>-)PSq?m{CjGMTQultZuHZdnb{>(?Yi8d`W~h$HlIUSWW{L02`yMr3jJD zChjStf8K9!Bxvw`_17vwx27EqXe=!`J(Wef=sANYX`*H-k#alaM_+Uw?tBI)7Ga)Xo8AWRbZlRBRTW0_^>O?ydK@n;S*JO_>C%f8z zyTA4)tHO3a*>S6J#nk|1@UU>*u~Yw4;K#8eB4*wKUzK znMsC)PBO0aU2i=@lOj1mwee76LLC`xcpUdFg`Hy&gIN!A>(b$b{vbB3*X6pOWLe=C zgQDd_4SE;`A49AT-9T21_e5`r=~iQNA11;*2I5Sb`I00q*zIY}^4actqvG(Ee&WOqkZi~i*2iNKVZxw(7>l~gHbqT zpwD_2)ev4(G7cQ%26|rRG|liJQkUcix$#U*J})3v?By`C6r=Qw0%fotI+?dks$s?c z)7Phuz5#ZKQm_<^Ts5w)dq|Uc{^j$dlj3zX`D{r|j-iTkst=fg7g!>A7UEAIA&~Kh zlf3b+WveM|?8!O34NIiUfuGgM{GLxnfXCW<#Jr~&co;OZy#A1{XlPpbxJo`o5H&%h zpEaebXfhYejkxV(g1U0*aOcNXw|f7@qtGIkQxSMeV1Hoooy-&E|FY6j8#W8{>3n4q z705HnFWDoG)NfKS&&cr5OujMr)947?Azq#wS3l4AwD;MUh2}nQh~}SLr6GWhHFuc~ z*b*ti+u!zZ7d)7ak3RU$ZCl2zInRNdnqQ>8pJVYDX97 zpL^-nF$RNM=v%C2-kq^tCl4@Q) zKQU}EWjEy{75?BCyA3 zTV+W-I9SKJa4#6}o2#_zji!>PmZS~*V+ADPRM$~5;cT%&_okUuk_U0$wqyv)3Y{+l ze};nDYp%w(XtzSlx-%k>f`Nw5xpg`&-Q(9E9&L|%v5QjWzR0;u{eCgX?atD%etwLu zfr8w}sf<&w2ju8_rdT@BBPrKuCXB=p2D$e0B9`HoEvc)1p>4Pvq4bF8O1bM$7LPRbY+Z7O&Kcm~)&~cBO)V8U{0bHvu#M2gyzA0kthG)ACW%#|jN8+ZBntOQ*;e3}|W zxd{(88m#)WQzpvGL82KU;qo=1@D7@MRFVXro4HGn=8O z=4%{ap@3w*(o1j>u7UQlp8AO34fF^UKk~Fy7!p)>u#jcu+jG{o|L>fCDrCF`JSK;b zXdM%iPmZa&x;WeKaGH6adll%PY8`YIFz3HJigmbOnhP_%a~ai>u`IFieOUOVbZ$)d zPB`q?A=AY8A6Ks_-scd<>dA)q1m_}uZXOo+rD|SSK!aeeD|K_N(ng<;<79DQy%t*& z$$`cC2j4AhU+vtg0ch-7JHzExJhvCGUo%fjh5x7UA1ZfFGY<{F|H`I%TUma$byP>q znQ*boiF_3ODfD=SMZl6`9u@)nrcjZ#k1;7pSpXM5nUWA$l_<|bCYU77CBkR4TogQNx<>i%K-#lhThMs`?d7fin`OPZ{dzT22SHq3*d{S?4AWelE zMX_{0-U=Z>W*#s~8-Qy69$h(2+>zyID>6t-Qat@)7iAsUKneYM=ZBSz)G*v5Q0yD- zc&85$00(tZIu2>I3d)3B!Y=Lj0^0=1hgH|i8{ZpWTM_|6oFv|Jqqof2^E)eh$7w5} z>Mhs7ki>wNj`loxh0tLca^aa>_t1F&e&Nv01yXo7>!&XHTO~a9c#<3KH_ncuF8j{05d=7562@CuX*M!u!^Jvo> zzsr0YP);)`LmE|}u-#gRGw4WV55hMj(P7WEaBA#|^&vGUgS@^fkYXQYD><#+Pu>b~ z--iM36M;h23K9Gd@S}b~08yM)K?qm->0YM^64vrf?o~+|-77GuZgor&&p_?hPCTPi zC69g!*6(&INy-bNy*hObvv=zV$TQb}<&ko&E&C1aq*p&GhUubtHc-I!xTov{uTP(p z*B?|sO1W!1Qg5OCIU|^PNmuK}yXcX}&ewQ5 zvWGT<_C9vLKo8D77G#QEM=EZ2+y?FFJrgegRQz*nHe4$60_a|b?e7q3(w*M zXk~t&50oOy>tSziqA*n|Q$ZO!f(T{h_UyQ=qR2H#TH!kj(in$={>1N@v;-O9!>NKSN%VFX!oJb75H9UB^H7<@xO`)%P-b}ci(#sb$M>MqJ6N>WmSG{d<0^`*yDtbB>r%}d`);@~2 zsvN+X6s!vKZDbS#ICW6I$1MHtsHiWTMCQM-G#;2dvv31AQ9~y^Lij=1oGUQWe~d7N zF{y<0$cOy7xk>NzCdd%Vbg>Sc44FQ&d3jdj<}v)6ba3a_{d}7Jd^j;|?_`tIGGPfN zqa=*|Bt%;#b@_$SIUAFF+G+;!LMDL@UZrtw8PP9NS;Zf0tdtm;r;4nlxc*efx*Zq2 zcvtLCar2vkm{3K#vDn$qMwu`GR~OM+@C7{KoScZenbQF++N?PFNT=v9C84Ytud~((ayct>@}`Ym|t6SwLoJfdlg>YxQ}1;&)&?Th(@6ko(V{)|154b&h?>f;s5gJ>Xz~smLx5GIDW{HFD&UiS5xj z$Gjc*;ty+j87f?Zny!8_@?xzL2ssP71|3he9*py2wF7VCVA;aPnKi%zi1`w<%$*9w zD>1*ui|E3GEpk*Y6qO$4u8KcUF#8w9aP@I%(IntA!nGdDrr<06ZIkjTO%hmFiJMtW zGD{;;RR?jkYcjBxDSmI7s6~bH>;boeT>k>vko-z%vUg|xchCM9c@ccndNX6|BMu)p z0CIL6f$BO0T!ntiV#cY7Llp#Y?;`>nDn)5ew)xtH=_4GM@uq`gRm=1=$VpPj?Xnbt z;yg}eS2niymfB`m=PgcdxW|k_?q%`Ayr(^>DEA)$!GA_f?ge|DDxQuX5)>Vs>y13m z>`C8`fDE1%l=#)k%gZ1j!=CBd<26MDPGZOH26gGVaXuz{hT81h=a&JkH#|iKiUo^A zma*zp8*>Oq9DhDE^gWnmh>(hqi9t2?i)~;6)1=Zl)~Jmo zHem9}qOgBR_-G0&%5;W+Rw;ih{G6R`G6)I5@Ha((ohU0kNorj^gy*7Qp52+K;xU zLb@{t)mms<^#<|QIIPsrT#%5QC}Hf*jd+mXyC!1F4q^9WzTy~1GX3A8lEMGOHhv(m zjr#eD7QFL+*T+YY?ZfM{qpi*D>%DVGo*e5i9HDFwF_c^u=qepqmQ5|&RO+}5_OmUj zU`B+XT`glg<>Jd}R%DpsLlIGjYim#AN2%Nt2MaUzPv=1&muoG(c%mrjc zl#Np3o573ESF6K!su=cLL#!3xP@5_4HI_4;y5c1({#7n7TTC6*CHmYaF0>(es+E?ikCgHxSe{@J;&~NR5FKk?6wekE@;p@|6>(9g= z$PgtDoX|3!)4+#Mj(lYbWD5WWGvfAM@s}(qGD8GC2!a!4AVQ?+p5O;gOCkPVCt5AL zuMKb?+QirHCx>^=d&ozm(gV&fK6?nkJs0fiZ{(4)*Y*R}P$D-;=cEPi9SpMCd zh1hBiA6ITwbp$>W%bTz8$a)oppGp4&*_`sgZ+5HP#=uemj;$Y-W<7Zr9&KC`Lw`j@ zgV*wxok8zkT>L}lJyc3Z4_Lf$Z$ zzeVK83S5~C1l0PEAmOJqbVE%9_G}7-M%LqY94zx%I#II4IShwN04%fx9JDq- zZXN_i$7XKq5+HOH_C&-1x8CGiP;~NC5++DtIEJRmAC>Mp(T9v~y(k#4?#O4QRwXD| z!zTF@t6Zrap4(s~r1gA_eEgAJs`Ol{Mmpw9Lw?Q+6QQcSOOU{iE)}gYr6^AWZY~uV zw#YQ-xW)+JQvQTw5qix8n)8fPT)T1ES?qcEno^nhF-XG}QLX0Q#w3;wqYvTFg9SN> zRrJ!4dq>Rp1u7j#2|~0T?sVA zc#Lw?W`CQlK8?v*ePt}9!Tmv1>v-gv@Mc9B?dPc{Bl~+y9}jQHzG+LYxxfqzvS0FTHEC}@P`lffI*n?op%tCNQ*Z8lW9q8Fh`Nf&KW@xa z2Hv&q;9Ks?`IF^Vo{9>0gJEQ>#5om2Y0T51|lb}VL~_kPK_V_L=G}! zBHX_R8c;d(3D~8ZM`~{?XFU4JODAL|-z4~%xX^fyzK+w)wK93+T?{L0L+2RWG%WY8 zBS&9vz`8&K8s!7?#U<7$R0p$G(Pb3X=l)5g&uI$tg3@Q{c%cK$T_{efl1F7C&ySKx zldIj1WKSb%Bsd12e6iHgpKnM=Yt=Fq%ju6!(Rw>2D_56)ANeAG!OGDe6;#f$_XW(1Z*_KK?& zlQ9>e{*%K>$rP@Y;W!q-DZgLL-qKZNpBAhGoT@IGrzumnu)T1IH$?r@ zp2s%#0vGl~Cx)+?)GVl`r?b;LD^y+!sMy+UFHM|Jq)Mp51}T^*!H*(`atFqZdE^j@GjO zR-B#70a;jCyGu_`6XjZ?Fb&`bpr5nZG@tA5Wu|{Mp!G4JcYM#A6^E+f=U!d=ULGwJ zq0I0qd&%NCJ!dVd$;d*qVr4PyB%Y8&%Q?)cGj}c5F&mPD{!6$+IfkQcAG_Rt-e`8H zcRFA1U8!F*ESnr(21oYa-f!HldfvP94q^z4DgzA+nIx}k$2-fteWbwV0MpZy@WEk+ z;-T(H`Tb^v!dQJG!G*>6e^$&BRg5=Q`F+Envpf0g6@!$?r24ITJoEHjwTvOIGwuyH z@VwjFMw2)TmxH?k7rwG;+E`I+VPA+-IT5$Q87p(X%+-X!O^3dXbxJnLNc{9le)h$uS) zsj7aws!#9kh>o$}4vdOH>i-^eJAhZRN6&W;Zkr#t=o}}z zZdb(VdnU7^s^tVMnl5&urhBD?*J?|^r@5Q?LeoRAtx5{|-*sbRh=0=&FDqv30xCOQ z6<1c3YOCO_esLd~I32%)7j zPg1CPvb>XLN{HBC(F6i@3lcfRDx-Tiu~|qUGTn{-$$THv3CEF!i@)k;Vl~dkmEqDj zqoCmS{ZL(lkareQ@KbkhsrqgJ`X_g(m%wam_s|4(Lf%=jmodvMos0aBzo26t6c(-@ zyU$KsvHZ-;NwX@Qs4d&q*U<0Ols~qAj%4-!+)q2^g7U*7n!nvcF3L%KcP6(SawLq1xNzBJ;MuhEuK6QUrv&r2ggHts0vtkDTn6{5I$sKJ zZ6-Fj(#kvR;~PKrh_`TUN)%EH--+B7@_>RJ8dmGFM!lE+=4mIYFpIv{)(^|6t=$7r zTTt9}m2i;)9Q?;Lv^U%=irycA3O;;~AH6;WaduiBA9m1*zU`%sV}w8&((-!J$}pPz zD_i7ONp1_3-&jxix(*=dxv;S3zuibzc?3O6yD06l5$Sj z`7+44!@M>caC(-mHn!mIS*;;thfn=CZ9%)HdHG7Bu@Svfhw`>k+w27_;Iab!;@6dU z9)o`qEBL5*3Z~eE&`;KYxQ(N2QXBQ{AD$Nh9jl^hM(3+%-`R-P$IGvGtaYr~O;nz@=#5-@V|D1PXh$c1zuOXY-XYHBq1Cd#`ESkP@5K{lBvG8`c-e z3L$Ubi&6gzf303o__2ji43QKA&-Ppj?zH}%g@{j`KMm;8-->o{tROH7%r1CSnTWzB zU-B^u_S!Xg@7&~8Ctr^$6`bydXKbng5Szv*8Y)^i_&Tjiopex>E@Smg8iQfLe~~bwKtNgMT~~HK)7$WeJ!JOe z7g!8CsS`10XXK!u3X&WR^Q2IiT+uGOphC#fTDVgJ+H{`is`6Q{LRLr*rx8<(kJMT_ z8~JWkB8$dT%c0bdN0BH_G2C%xct92i(v5CilJ`+iY7bp%2jB_2?_=lZ-NR~N z9jdw|)@RuZV+}F(4=1)b{g1j*#nGIjtF~SAnFfuPG(Cp9b6g}jOi`%2$zLkf4VxBI zvH;(Pce+f#X=x!?y06SVpAGHncfnO3!SoZTM&#^ebIy8NhD)N{G8&#;XZ8Kk^h6z15H(89`@OSz|}?%?S0 zZRX0~u5vc0E$m=xzL9tB8g}P;_IDXUoIvT_4U7uSKXPDrCmrH@B{ozrEUtkVDfRs5 z79<55>I)P$%cN;W8|@U%_^?2&13EbdS&(&e`ub#$a{YaApe@7Iz@h!o+z6C8OXsF!6EJ4}$fUP*sfyP^?`J1@SNaYG*WAu35Mq zw*L$#YYRcTsqmOJ&N^t!*z))EYa_vvAwle%biuFNgY{@C7%Pj@^!wzSDe43Ztapo2 zzR_k>;rvuVtmCWZ6aGw?5YXFd@6c!u9NPtWEwlU!yq!KcDYiY}J5?|b*=Ve9FHE*! z?eh(uA~iTP(TwO??WclVt*^g*2O(bRj%C}+Wi--?Zo4b|A(YPfp0hbrpj|Bs?=F10 zt?Q4LmtY2auFcC|_zj3R1lP6cp2$Mv3 z!05C<%DWY_=^=$_L3)@3_A+R?Bft;cBZRvQPiO`EaF?Tzmh1Wxa${IgEUzZ)HTd#U z#G(bZyu7os2e>Jpy%}G0vbkz;#I~^M72H~*XRI#{n6_@R3RO+VF*2Yw(m1^)tII8J zo4`V2k9&iLwlmgPI2am=k91eNP+!@7$rX_9kZP#K{h8J=U`p_gj+T<~w(V_&u2MXQ zg4NNht|b1ycwl<#Pq*)~a)PT{Z4dETwiZIFsG~l6SLfv>7#&VO6BV<8p|fozemBq4 zKD$>DSI64FaU}0bE6U$js*+%dp&*1&UaKP8b@R{CxUpVZTTx-FlU`L3okO#kB*p6d zi2MM8pY%bhF#dXHftR~rowm zPuIRcI|1pBvUiNmJh5K$1vG0LpCF-vqiSyvu0k5-CNC;%L`GEkS-oIt5-8ZHjn!Ja zFi6ZNIpkRcVpQLAb1!&EM09kt>3vF)_@3`}MWME>D0s*!rUM6z9(#Os;?fBku`uPT ztD#zW>~Z;Al;tf5+24F%NRTfEa|+qHJ-fWPe(aU2(vrX{ky{sk)qb#4q8CzsZ06y#=MKL-)M1D* zkn(D-zlYt$=7L)r=a(7SW1*K5zzG(Y-e55{#hW*~h5_Op+MRa_QKq%z7TT1DstVsK zO2S)bEdRKXJxd3S*HEH%NPtot{nq?)*Sz8KEJ^8IG?Pd4O#i}+_r)XMsrHp;I?8G# zEmk_QtP&7?e0ejlucVe6?*eFOqQt{fC@y_E?ikUc*y_yYFjxf~e}2(+T6@dnInW=b zbAX1Qfq7P2zBf!C^vlJcTpg53t@JXlj%p2m|7(EE`TdWhx#j z`Pt==?;ICu{AVoZsYCX?JrTktr)$0$w>pkFP9FFBmnTjn#)<7qY92;I&pW-pp@B;6 z<2Fd^??{trFwoOzn6J*2zA3p{yZE3#_at1o3fcAtYybY$Vv~qGBf@6sKhEeydr|(w z|4!l2e6wx1La@V_ABqpiVV>gH$(G?ubt|r>9P_w!8+4(+Y6qWy_1t{jAMjKw~EPMfHZ~4sEx@rzg?d&xia`%(gWu zf0o|F{ZpaR;iMlWW%6K8Uu}N1gWCK7og@bzqr{0}kW;l3A$}3m#YuI=!s& zWZg!R;SbXLS7LIlr&syZi1xCOF*=^H;wtE!QQgzLL0)m?RM{}E43QC0v~4O9U0GGP zA`e0kj9swRp1ic9oo)C$2yn0g33163+a=KC^Lus1u>2aFzv0qPD~bo|wp;%Ac!h3>>Z*mqq;hq@y3Bhb$j4PJ#?3cI_L89Oxbv!vj+B}rG6#Fe!6M6wSewLVjL?nr$H-N}f+ZftZOb#RxCP zIUWe#hS6f-Tndkk|DVNLc_rP4XLzQ~oS91I#jRNUbX)nom)iU!k!D*XHAjTQbr021XPa1`H_T*?f_s?`w~&1mxP^1xhJGlvY2a}*1$va8Lwpo1eW#ir zK)sEiTj?a>qz={m^QKKvdK(Fm_gWf^l`WT!dsVId-LB^5PTG z1Acbmu~7L+P$QtyxN_$^IQ5ltHPxUSynhE05uG|ikJR(5)=Of%8QpUccYzv!Wkg|o z=+lhaJ>N)P@GYFxeu6&NF*(;k)0uL|`AP6H@XkYU`fuTA=aF>IN*0+b<+HZW#^KF5 zRcU(nN{KL0!!m)nP8uD+8)}*t!kwz5)Z^I~=6^?1lwXm~x8)4?8s{tSf1YB9Ptn_HD18`tJck{sAo}#xCy{R$NuRs!-5B4J z)0G|meMSrWf{=ZtHbRM<$@{1#4mB;VWrwZ&^ULa<@l~8T5j+W-+`~7z3`rdP#@`fs z`{G}AJzYpB>)OUa(BbieKjW(_YW(Zu)AU1z@CKs1lj35r=NtD#{*Rp}1BUEVHTQ$= z^vQn=ds?HVARd{$^e@90vUPLe{Yu7^*%hjE`BSOg4xuKEvgmK>b~rhM&kcIdHkXC`_c4m|%B6D5cKqX1b_Sr&AS@2Q5)|TfrOIy{I<6PsvzMxBCQTtYaQ?qXqm=4EBmy+Uc zgp%LIMC9>FDxLK4!Fln<*xVK17i0V0BEzTCeR0HB@||^avljuAbMZ`dZk_>X!>uqm zpgD*Th(}h6)h`iS)#_il6f+mG$fqEwO6EI4_LO(fdZ3Wu|E_u7Smp?xGcsu+E?*wY zAz``P^m*W%FeQ6M@95&vR@0BzmQ9P`i~jXd={u%>%)-*ZfY=R7B7AXu?OAWUppwT z@bVU`lYUJK!|C3hBDkUK6**=w93H!#W~>tX;}I`#P+i~qEb9+RenL>2EA`F6f9K8l z^sUYwW{;)~d5)p5=L@uzvM7AIrj4;y9yV?z(6Gmem?9Y#iP*a%T&yZVL7cAu!8oI` zo)UYId^hU$E3DqPim#3bZSJnozY z81a@Vu~FMavvTVN8bn+5Rou23T&=~UK8KvXLRM8CG599gL%f5Ps=SB*i~k#XoUzVc zye}(Ci1klY#D^y*Y@*}VSQK6TC!HTif1aOX;^mUlX89~je|C8ATN~2Z&;O|H8N+zV)579q0+A1u1}sE$Ro>YL2j$#JoI_YWx# ze{4HOy?g*31eg&McKI(Yl4Rb#?|tJv>bdBW*uQ&tUBwZ~w@-JRjV}(1nU41fHojh% z$XDXcjot47+;VHRUs>d7kqE}Akc2g~eJ^`_`vY~RfDyrdv<7E;K_4zTHI^R|GP06{ z?4wk6In71;kmc}cD~OG{BgE*iOi%|bt0fPHKi^=R4ienoUhMvStag3aF)zD(aXwx2 z&aE_)HFFIi+_WKI`$n+|%=ae9`e$(hHsdH(DOzlVNUjqZ`wc;8?b z;cuZq1JBm9_S}RCmi98xP}`&((|l2giDyIqxyuAUwO@Vh-o_s5yNB(N?pUlf!N~2O zGpGwTGdT7RsLIZa>OWo+VIeY7gJ53kttNH31JhHW?`P_EqBJ7Ti}x-R&Edd04Q|d= zrav?pigA?)gle;mw@X}LoM|AGmD<$jY5E8nf(F>g%+H%jw=n|zJ8?JViIlL;UbMA= z`$5wk8eJUt6kEQvfX5Z_l;5a*mipQ-hi9%p*piSE_Yo7NAl0Y2d%bNz@cYVjR^1y! z{OQ)j-0gle=kFJ0JuS(ZhwUg>UkHZCWmW7lCF^fY6WE%M!WQX#s!r@yRNyW1J zvG(Ps7vEaXvGXq~t6KPY>MRgx-NqHt|KJ{nPV&~!(8^=tk7EUDcTgRnQt@e<98Pb6 zp6>IQ$@Hy@%=q*09hMRAPRHz>)9Gix{cxPA+E}-za!Q4$G_A!@#zMotxm-UInN@)| z>fbcZ$PYtfUoGF*zMc#)?P-s`a|cxM7_@qg2lj20e|_9P=2BJ@l*JB?Bb_Jal!>SS z$LQ&^C&JRU>>X~geW(RnDYmY0@hc+(rf<)`c}t#oA3Aj{9&P3QuApiU?^a~VYHLRp z?QU{4vob8uMp1RvP`-Q}hlNFfNRCwKSg!?_s>ysPo#LhT)7m;T!ET*Ok5~j*LMk~q zo!@0h;{TMsfp57S<*CB^v~u!|^22og6jX1GiCsXR2d!QI3hW)+n!em+GObREtj(wg*$|)PxwG4L2vZb~@M8 z-SfXNC6eKjR*pUej9bn=4;#{FlZ%-Fz?j0~5yiY+Xm-j!-esVVue~ODOZ?w1)Ea_q zor_)awV9h2QO!;R4bb-kzLB^g+SV6jgZ zdLPzuQj7YhU;`b^m<8WsJiD`fzSGo`v=+{|P`&F6kOWbkcTxT(_$wm;x>1s$iH1DN zzdyB`Tl}o!ouTw`-uO^%Ry+UJzti7{TIrrp#T;L8*SW&loR-1wvr}?iNM)z)|P?W4HvgTXuw}{9(kz?!yPkKBgjg=}&Whl?-VRbJopA@=lai>HxdIgkfAG-^R zSTZ^d+;r}ST?aBmx@JQC-r%oE^XZC0Y_BUt6sTABcsR@J(Xdv|A+{pyfhu}j{yB7O zDUu0l1|DUsCtY1lmuLK+?jlZIkUC_)X20a}_#dYpfy^uL8`K8-) zrNFI%AboDdg3=LC?0QbE3gXz+4Lp{@cm2(sqyH#N`T4-a z9OfWvHb!c9^%IyK%D*yb7bm(|FbEfvZ(re36VpR zgH$-yN{pwR=U6V%2LpxaFEdDbI$69Gxr`Nb?(XW`THe4yKEEyf$NPru7ojCLv%I=L zV(%HdVx-@|9JIK9@d~cITjC~QV5)X<1UzgCJ?yvJUyQfTn zqIKjNJje2U{qeIFqGWIk1%KX`Dw1LkbYn2xF@;IXKMz(ldPnHi@W_83w07vOHgr@T z;35X;3iJ;&_lA2ktI<^s!OBIg== ztopd6@SV6>!zR8bgm-pydG+t?6bw5$ zJ2^Olo?e}a{ijqA^*J@}menX5v5Y&Je_*FFzDLyMAjrT|;jH#QC)Gqn$=F*wL!-vX?-#Ugq#6r`CT!+qfl& zlt(??iBkl25>%uaZGAanB2yGCj^p*vlwOlh>DEeB73}0q=uHTpniIvx4!@DsG10}d z4&;S2=dB8=fVN0mfDKzV93;RntW2FzFQ6K!pzUiq#E83XRT2o-yBIDmX*mAxB|zj{ zs{j#l-X(!J%KuKyUavO#VaSA_R&vd;IsTFhhlK_i&pl-HCX-xQWkPQ4c=uU|3aK}=-%>MST+j~Zfm zKPHE#b2_wdfnEDD?AiG@j?5r?>n^A}kRe2*YAl2{thwSQUV&Irxdp1lt65p9o4G4a z2#=7Bsfar^A?x#1KQ^CB1;gQETDPkYtpCi?B3uMqqhyjLe_>&h^?}3NC!I%I0o_Nj^;}*Q6Ifo%=ZepAUTF)A}(_Z=nI zn%WfgemQZ+?Lke7sYK}r>3YWYC(KiWr5#{@QwPFnq{XEn^YJR>q=`TauDMImhsc-RXU zb36;uBS-Vx(^|h?6krh}POfWaJMah$s@$$cLP9rvIZ&=}p4bbX7 z+mgJE7-a=j&B+oC9#j~;N~ZbG{29-26Z$Ig#A>h7;K=G)>+=(Yk1{uxm?60XYhv0l z+sRM=#&^~`f#v+9OaI<~G};ds;X(C$GMgheU+GD#S;Ai4#UihQJWUg!;-1Bb?`PTL5tN8V%r3a%iQNss3A$be^l z^h{-jJrQ+bo7E>zw^D;ItMxKC`kl!>kyV6l)G%~I46_CkJ2iNH_z5~8W}Cf{vNPuq z>Go@qFQO;Kb7{Q{gov#R+zhubBaGI?V?uzIM)rLa_C30kS?IiyM1E#@(bOuJD6#LZ z-aezfbqIiY=^E&r(fOQT^p8#gm*k!Sd%Iq|Tbuh6_KVZUUAgo+)A#It*8>;OiBlIo zydfbf?WD}+iAAl*8h6m0MoE*<`yX+(>dni`m*^56gL}6{@%-!q0J%7{KY)_?^dN4QU@QnjTaY= z3E#>bxa&)F6T5hG?`NUS2X>MVf2NyKK{aIFt^`t=Qluj_Ak;-pBT$>eMZi6kLVT72 zd20rp9nruy!z@ow6x%gx1Dp{fnkLM&`FK7A>D=<9rWf8j&yvN9szHD3fh|`nmtMK3 zb-O+l=m8x*o&mH6d3gbv3>$`6Tr|S)aqDEw+OzTOS?9fL7dEM|4wPwsYfp0&YFV0P zRBI%DC}5v=Yx z>bMO%8wZUTE$tc3{wj{qeb#PD`S#>c*bHXoOWYSe5G!*Sb*a;InfU9>w_ow;ZB#9? z=D!Mj-bUqR)4yLv5QyGwojgOBLEjsR%q+xiRsN(sTV7BX!El}Jz->A}vaZ+FDB^1=dA{Wr#`FzUB-LgKJU8ja{{dMe7B>UA1 zg#Z_Ph{DBy)iU(lCYuGS^vLs4DZXusX0~KuX^QI8bfLd_JP>2psr7}R`Rt6^@po1d ze^ou0KCJ6}IHF7vI3xf>$#9INL79bzTrcXjlPN3lIs{y`EfOR+-L9Pa&q~C{N52bx z9LZ$MON29ET6FD2Uv&FX7{Bk6O;{gp_|$j~UYEmBa)H8Ps;n&J+cL~3=ELvi%0fMRBC>(=O;ec2HY70re#G6p7)@wM6hVas@dzl= z%0F>6c%9OZPMVO|^(P{}PN&k+^s}y7fSn1Xsmll8l%APdx?tDd3-aisu8LIu*%mP1 z7cCh#<55oTKZkB>K4z;yo^3f$ zZ`ox_|K%tI>>z9RS_xA+m`M6l8zcTx>uuObA~IU9oXp;n$wAuu={cc2pGxc)1wrg- zIsg3D${rN6kGhH=wwaIzZv>-14Ic86(!1hJ17qGS7hc%nBb8n^f~%ozY=}G@x(tRd z48hmzEc(VD9~%dUd(B#Nu4%m6v^{Fc3&9 znr(>(Sb29Z2eNOG+AHY&%J@f7@jXRUS4_qqMq~GUq%zY4%{SRMcIg3eg;o59LRVh+ z+j*wa(L?jNe^6?QQjctr*2X5`X8`UkT4L{7(orHSWB;1Pn^pjqS;Xy1Z?dlcA-jhp1uVw|+6fa$Xmb2dra-&%CsHh~XCTW)dTTUAye-NMKxA4F} z%0J^1#P`c70V|lAL0}aV@vX02EBp11&4B6VX+ZTcIJ|r`6>G@taIOt^TBdC;Fq{79 zrycWQfrgQefo3JB@m%W1q=sGkz_c*I-m9jc6mO7i1Jj5l|7nL$wfpEs?44x3IV3qN zMR{k+eKDanSEAn{>i5$rXwvcR%K1dDf4R!)0%qv+DcE6Xj@-mrVnU2z(@3I{2*mC-_=ya3-Hjs!q)@j=lDoBn z<>E|q8Wx6S8Evf=M*ExLWn_GPlMRKx=FogEtos@x$@+Zoqxwcy$Y~MV>CA zf>zE95VZ(+WTY7Z9=F*4vK>XAz;kk%yLB`-h}%1JYavM6Syp4Hk2o_^!ZNzQ_KVNM zYwOuJO`?fss`xvfpy1WzYGjj3G$e;3d~UaDFQyaVBnK?|W4i59sY40c=U&4jJUd*@ z*n_}HyqceJby( zAeOVX6|Nn1E5agKq0ZE5M$uY&HNSo5a%s;EVkpueCGlhUgD27-mLSIW#B7DeA8Q>> z4RjP_l>FA~zo$uf4?i|py0Zs0(ibEPm+Z4YoO$TB8E7* zb=9!a^wQd}j{g<|<2Zl}49NoBT0ZGSwOm$Bf9!m0ntlg*|9FoyS$|#bLI{ld>YNIz zQr-rvI@MPtyWth-8(B`#MEAYvxF4O8o*gmK(a%Xgu$(}XxH6I;7e zn^qvGEc6%@tjad?A#gob*s)IYm8YMtqZ$z0^V@L^(THBJ9$}j&c}HQ?WTm`578vMA z=AHkC_nB35-ryE^5WY^x=6E`9kVZi*bn%zKt}XEIX+CSZyZl{feWz;Wbe*nPb%j-h zlCEU+jdN*H)7`}?;JNhRLcYX_`q8e~hRLZYYmUM$`Kx;uwF7G)(7Bj-<(3t~H}l0I z5%SJ5EV|~;4epfzl4K|*V#95Gk<2)N&S2oms;84A3feP)>9uP1b_Q|8k*I13Vo7UX zMVFu(NABT5^HF67yWstR5*<&SF18=@Y(4n2#sY(EnbnkJ` z#lt!+>i+Yn*VBXZC#GnW!C+>e(xo1#FU_w6TYp8R>>gxgTnm0m4J5y=_x2Q>HJgyJ zbtfn7!C!)6-aC#A!`%+E*ODNTn{Gf{qvm0>TO9;E2hW`d-@*+ylntxbR-Zb)9j~p8 zV^Cn}e7N(*x#!;#*PnhUo%0TwP5CkNiD_l$i$o&}^6Q=QsCASN9Ed}|O6ev>d!9XG zsh*s=WUK=D!n69Ww8;4|Z@VYxL##e6hoAP_q)40y257tx|3dDC43W$m!0bO`Q*Jgx zo3liE3hb?u!w0b?QYW>(9M`CgBIH&c=rz>3QwmReoqcW5+kq-liNVMQa1s?S4s2HB zPb-j4`d2yd^NvS0LydaluxG~}|4@H>9+X|r^%3X#^EE;=|{%* zXGe*H<-4@ozAwLLHX_lh8PF>qptGcL`^cVXIMR=En55t0cbKmSt($-Dt2J%hWur_C zU&wyJoNLp`7K4(n{KPw=u6QR=u!)3}C+B7N#H)S!>{E@y2g3t>xUbMWfp2Im38UKX z_%OnM+sDh|eWS56ZdjoN_Pbm))SbVSc&Q6~zDu)dcmxXn{S7C5>ks4lcu=E(FH4~d2zf3YeGN^P-sN@mcm z{bt@1{s!n)Ps>sA9?V~iG|{~mpFh(UfS5*%?^Ii%om~!FO@=b4!ldk_TU;+a0=~27 zb;F6qn{IxN(h(K8Ay<(3<`Ka@x9o|kIQh?%GMLv6IudgqU1h0$dD1vi0e+9Z63F^r zX-D?|0UKcmV8cYt0FLNGxjVeOIsbQja({k)c7AenjEKnff^}p$v)AED#!?lQA%^KG z%%MLme;8q{<@~g?T9~N9p@2-^I1IleINSh?(XIVXq;={b zB?>e-r0nj)99+qxz7-(b(j9aPXsmdS%yTy!?oHQ8?zH`7wUTloC%^IT(MCHRZ>4>L zXsqDARIqtDv3z5e;ci+kAn2Tj<7h;WQH){t%PrSQ@XCziHD+uoQwR@@E(L{OaV+da zwIU|x-kYobl(S9rO^`rTY$sd?k9f5=HKG>8W^4C zwMZr-XJNvD-x1F}?I^fhsab@w3lL5jl7PsMtX)ABJBec!Dj+5Mg1FYM^9q?LirX@!Nk5YoWb^neua?hA?V!6WKuEV{GJnX6UW!| z$?84cWMhCy12aZ-6sPpB7o@d+57Bkc#JakPri$?TirITa5vQO2>Tq%(JKTKle5F|0 zXDWbnrQfQ2=H?|8ol!4!E5rWy%r?9B$0ohUXb#21*2-; z?|*PHkts}48M{s$Pq%lI5&~J0Rv6kZ`yoiUw_L_AWLAU(e2PwnBjL16xrA4PYS*Lj z-n)k{V8@T;u~HV=v8VR11y6o4Z9A5dfNF>P*l79k+tp8^I$97v_^tDyomL6ef!4mK z|Bh;S^yh%8v)vx6U3|8TFq=^I9wk@mF;8HfyyMu1vHfPXr1GVcHJ$nU)DOkkq{cS< zO$}}5V{`TJz($iXdTUdH)UTKA=R-UcfYwIl&#)Eq1hvm97;w53^{cJq#11wE=G1W% zX4K5@ve1&ZKc~;*laNThBLpo@t-xhl^JX=;X+}%+33qm`3%M+H?O#v4zs)TZjf}&_1iX?Nklisg*y<*0o^T}UXcRci zho1%O3wws)rQ=h?ahHpiN_)Ijtc<9gqZc@dlY7+nZCFkM!7S}v4n8O6xJEugCfUH- zRtv2Fp*m9+EtCT!=RHXusH>F9e}BZuXP4orX{ujcUv^Dd1q1&M@MVy!`KY0{mAZAx zq<4BcYmb7Z$&1T0_bd066IAuha73^@vWEX$*=8?*0Uid$M2H>QsWgbhzEd1$U^=go zF|*j)h$criE5Cn`Fod?XQ2i8l`{fmtZ~vi~9DHSLe-psfs=w?!U%Yy0W`!bsi+pWsrGbiQjmZ!6&Qeev2 zKZu_!k=!P@rrB{!$wyU(*qb=)ymrLvnejvR=KD|wkF>A4>`7t3K39{W+1e8+;1Mr+aQxBEV0TlnEA3XtCI>vwd07rJ+s@C%^ zIZU4+4r2qO2lq3ZP3kGw*Y~FR1{w%-0*1FXO7%R*md^;-*sL2VL$gZnfkuPVEH3U8 zT&EtdSl+`USs>?9 z)k=J>L9BGH{Zj|$X^@|Mp-u&7WpNwHMche#dc5BR9VkZDrCL^kG3?X3E6$tHP@-XL zVV9-7aMs3nIpnnRY?$74Bs<^gXFLKKJ+n-ErGMxg zFXdbon4y`rU?xv{5)2*ZkYdE884KyD9+ii!G%9%2q;)Tx9H3rYY-%fHp(q_q9ZP!_ zGL#ugzFoZNpeFHpXy!nEQL>;`Qb5tt4(zDpaxzyE6K61%W33C6tU?$aQ)mE+zzn(C zy$5Ei#~y#;LRs}}1oLkZQp5h=dFdw_m8Zq)7fA4DOV68%H`dI)W#^!}iUF4m=as@!P&=! zUN47GVPwBi<6s^VdPG(udh4h}-CM_h`KP$WLLRDxEfbrjf0!w-?l8DxFX?Y|@=@F!^{uxFSwY zwB;kEPre6ND37V0C67HHK3FQtacAY8H8drU_bqP1FEbr^-#_uABu-+CXe-k7;ZYz4 zi3DL>hX$tOK*^0*!!H(NJha3%VDox#@It`2L?Pn)sqP0OikgN(Bb+kG6ID!7nbssO zRv!#jEFju^xH|6UT>~751>Ea}oHfo51NRYOWvn{%Xz$yu8rK()6ym+?H4jTo)#iB| zvSjBc-LP!T51iI6I3>iWRrwFJ9bTQrz9WI0Scx3hwUi zPO%_CTHM`(6xZNxx#_j5u%TE^DJSz0h;Dv_Vz)Y|7~qS zVJ}lMtu5el_>@e7aGl-MeL%)EkB&MH5>~_3urm3|pYNRUqo&hie`r-X!!CU^;~*A9 zTO@@x_bX*ex=D}Gw_H&T2=V)T(A%|Qw^iR+^KO5LDd+DN;o2BE?TuAX3OM0)K$GZ- ze^##^sD18x+~V83b`&*xOa_`DRvFZ-ABN*l=>6Tv@gwK3tFucKKpmRT-{vzzA4cHA zL$I?J|9{(6ngs_d$1WJ}O{G@eV!^*#hl+rA^Lde!02<~1NCSXGY>m_JfEs3x$gH1Etk-2760D+&#k zRIEZP$CPtrm1>@L2#bzy4|4bVK|uJUr~%{QEp*ji0uCN8TIxnejvvPji_(Zj9z#0^d25KyQ~QD3&$7ym-q>``kh4G#-0e3qbkQolq4^0=yb?) z(ve718+cM1)j=8=&PRHjS{!?0SghyiD^no6zC`jA5{RW(*ut5>hWM;*c<<4sk(5=K z=5JQ&`v5SiXx<%94BNPJ4bB+*P^Z6N7gz;zh+k*b@tb!uLXvNQdA6lW|6TFM3A7d7Y(JV{o0(4O-b2wlp$O z>Pi9H_iZ}%kkI-F#JkTgzutsW912BP?$nqXY&g;Pb~nJ~L>de|TgC+)eXh)|%yl~L zsA5|Vq-N(YUoqeM%SNd}`kEfT=jd82k?bp*ThcR+Ijk&%&(@drvHBK5@JepilCQBh zg!-}}K0&M<-V1?kXE~C|Q3n~<_N)cU_EUSv_)|;Hy_b8uZub*=>e-96#`P>0^VW$v zK?bnfyP@lJ{t9*a;z&;Q6#zS+L^(n8$9IMUYj98W(%D`&CV(brgJ<*84r@1C_D`0W z)sOtSGSIHBwQ>(Hf`1!xv_5n7b9I%vr|V(X<-u^QSy1*l4vukLitCfYFj4c}1U#-E zOxv1jw_^8~$2WW}oAr5VfEX&h(B0ei-6E45PY%x9>9=E_9(~WS8>rg5W6;1mvh;E+ zHl%xY?`>-vdE9IESky%fB7HLDb24WRzP}dsXwxQ|9IbR)G>^|y^es*w?TF*%-2Z|G z4*;p|u^h3FPT0pX)w%K>tzYaPqj>$hlZmu57fSC%&T9fnqPg7M(>6GMTOWd;6Sxtjxpiba62 z=p@FCdx59ToDh=YAGaUludw

  • =gxjEO*Lc6(QEQ*3C!^71Rh{+2M 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±j3$wEZI%fwVKF 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

    UJ|y4 zhU*V7l^4d(mm58w{iAflTqBN7ia7~?lsFeDF3)kkWYS31JMb#~ru_Zk!?5FxQm}^$ z!IVS=2;{+1XwSuXtW^BLP{nJuk4EqJSy<*z)w5W78+r1R9d_HIEEw6X9)8Q(EN_~M0 zd)sAaoun{{#FgLqAi8rdy^P;sO?GuMd!-Y18Rcr62-~}mJ^Ew;Hs_*;DqF34mTz+_ zUDxy5VXpM`eXoQtLQxQp&WoBu+=4D7HH3k^?bSOpr!K0?3$5R;sXLcAH3eCkU+E#C zmJ-sTW?j=n{`=^ADBkkm+Ml}yiS@|4rcpOoP{ZBxL*18w4kTi)BUU1O(EtGWO7$B+ z1>O9G!QRlmV*Lw7Np#PbBY_VcxF`3e^K!E7hwjuCAwPB2;xe@oN=K{J+U1odMSHiY7)oc%(3ZD|0iSP>*~+}lIqP_O=jauuyei0?di@8km9%Nuw+X{{mZ!H+3I>{aE}Yv zx?(y)@bXkkE#TosKoKre?PRo3q@^>H0_A~@)r+Fd$u=o1G}xMW+zdHF#l7#f0_tIB z2IG>du?`RZqCXQlV>?#9xki)l_L1cybJ~vKb~k)CP#mYgLhJ<*GSxF^t{k06CaO&5 z{E8!}AoS%O?F!x?rD=#jbpSrz-)T5S3&?PWYXFmJqqco0GXW#r!hbjzKr5S*ZsJJs*xsB-8jcr8B0Ah% z@A6ls-WwTk)=~}p7>de} zIo64Q%Yp;HDY9(NXXg2r&~CFZS@2g#cI@s7qO72?BVh<6)YGzmLKycUuayTGok1~+ zyoInfW)QoCrDZhY7w3^3%$2K~;!H7=%DcMVq$hC1{Q@+Yo1{7rC9U?W9m!k5aRo${ z=cFLxoitBEyLeKSFkh3x67Tgd+sk`zG$uyt0EVe~JM}El?9c>H;btySPKdZIohgzl zLObt7wztd_{1hZI{kpx@j30lh!_R3jBIEVTo{nL!5FI}k0UA+{0LUa+Ug>Go^~3qx z%BZxp-1UwhI4=)YJ50NHI+UhMLHQao6J!(qs5Y2A9@$ruif@QY)}5h{-yj!r`;qu} z<_mmWl#Pvl0}1-sA<$aum67jr2Sgu=0599>ppW4T)h=xAeyd?vKhbr2umz$guJI76 zFu*)3C{m?K7~=ZO@p*}};lcY>JVUtN-qs1A;Zr7r93wW3=4(ii1RzQJg08THh;}$8 zOy_2vkF6SrZM)y{{MuGPo3W}7a-cgKc`TI})DdGgyMM{GDzEygLfad$=T4i3k@^(2Ox7pCW<&x%D4xP4LKCcR%(CaQ;W(^-mqG|hcqt8JHCfvGjip-W?fEoD`U|>DkwkB| z6JNVMo3{Q@$IQ^(Ed8Am$w#8d#u8sO(?C!Y!yq4NLJA)c{BNFwHuLhu6MhS(*|Y+N z)0=aku6^=>f691B+G~<6C>YL1ogze0r>94-IuWaQ0Eo!~V_(x?^Lp-e0ROuBWcTDf zG=wPxJ7kvusq0!ew#(zP9R1csqGe2aqeIxl$n$12OF3H3I;)2jz2~CBhx_WB0!25A zmnu_t;+Q7$F8kT4N%c{H$Org*Ifs0u*C7exrNMyzR;L>AxNQU9**a3K#Vp|o82OEv zxX)N=XPJofo$7O6S3Y0bIg8mq>OGxv*sF+IZ9exTftHNtFe3%8S>5JOQ4JTqB2W<1 z)^;?SY15ual;p6y#rk$^T?vEbCEz3iJ(9 za|UKK+&xw``){tif+a9q&(^#{;){plY*`S*i^XQ(M%ih zU*$YKGweNKfX96-m&?i4UrL%j&Wya_%r7TPbnd)k&@D#$`TbM;b7umX?~JPCC%nc- zC-(26j1jeY{zs+qf!*r?KhB@Mv^M88f&$eJW!~~vTPT;dLOP`*JYQ`qfewf8e5H6o zNsy6nsbAs%s1X2u)oJ(_dYrlNC^z@q~Wqy85!ZYKzNTDwZRBb;< z({%+j1Yt@hX_Fp+OxSJXIg?9DtHTqyN|YN9uIXz?e;d@ttiDk$AAnI)wBa&IeCMaj zDne$)is&9kYDUE{>caT>U*TSdkPSr^;1q2J+-2ty^5@v2uDzl8#{(;}rR*M4wC)z~tjFnj1Y%i){Y+Wa z_RIHo;%rgNgb@`uXgkE)=EFr;n%$h7H)LPkF#b+ia(UP2(*im7IcLytN6v&-5U$K~ z2mAdSLhaArwrJfD6%I{^=igoXWCo!c`fP;n6nWcydxDq$a{Nf*Bt!h@|;G!}i)&dwoYl|B+#dK4DU52!qb_D!&?K6QgN z*%rx6v=Lo@^IUAcpyHrgvc;waXmstWT)MMU+mqxKK@R+MYgdgcZ|;4esWz9kc%tdP z!B(hWZl*oDat*tLrNHKg5j{+$c~iL2@0-VdvV0JSrM_Rjx6k`WRpj!9uUOL%KSj@gb{KkB|~v1#J-o}(_OrwP#~aeZBmCd0Ue@p9L1 zd1Sq!x5ahk0BGyZIt0_ZGO81(rJJ8tyCDzkjrn@PHf2vMmyOi3IeIj8tqESSi!S?D` zET%*FX-3Vy)^z{zFW11b!|8+b+Wkshdoco<)tfjQWmzJWP)r-zok)5BKPtkvIVjxK z=wshEAqTpdfWeNE`4p2+%ZShku3fYp2af=hnsIVXq;bMz3~9pmA^-8_yRIaccEz;1 zEFsLDMDZuO&N;aYmhD`xQ3BDsra#%4TZAuQ;=XiatycBNx;sTtmMSrl2-cK({CwM1 znw}-@dhLo#V@NAQZXob|kRvWdbEytV}gC&7eLSLyIJ{$)qD=0Y8HUHO$etKmu zyBIew8_aQvONc`>>aM$=l}pifQZK)u8aN%ep)PcZiiicjKN1JJjebwl z(gbsf>RTq=ElaaVf8YR@21$4^5Ximg#@+UxYmhvR$M+X=vn-12r?i6!oDIqox2GiMA}4hWO_ z+9kVYXq0CTtACIKW;A}7>h*s@zn@9>a1qz$*3n8A2>~s#Qi5P^B2P01_XBahS0({K zciN5p=g)nd4<(ASVjCDm!FziQzlv9@#ilNzFbS8?Kl`mn8g=b<6gF=(-X5 z`<{eo?>fX(GH2@O{nRR#)`L^Ulx_uNya9Zy#o1UcRI!g{XzKm8Ig^qVg|Mp|;iQI` zXwlE09NX`yOR7VsPMIEEIyL0*bEKFE*1Wd!|15bNd&SJ%rb@Ggn|s3l+1+Y9Rf)cn z^*4JQnXhqlx^~bJY#96Ud61X99Ti{V;syO{D`=gk-(Q+c6yNzS$Q$)N`h!2gIy0b& zRCZE$gO9dfEed-r-M#lFoEezX<_T|B>eP1H9sO+vEu%B+Y##A6rd*G0_i_Z%P7=)B9dki?=jRkq~%Ek(`ZeEZT_RMR+K!3IXS~Zd=~oqt*sDB zwDY>oxq1DixIy&|fnn+{^}p!Z@A2K>?|_ssN6;5_H|3#U-P#NCOxE5C2dp|2q~#*Y zis0$<-)tQvnw%``)_Z)g-}Nt=)(U3bkhoX#Vr+Z5Lj!j816;0FyQ3`m`AShwY!yM% z_NWH;pG?Gb`R50h48MP5B>S8HJ&3tfl;LOG1OW9d;AL)WP~`ZYYu}0cOi$_UK;T#> z*EhE1cw{cg%sn0)(5ojhx$Ft;BVH zG;zgQ7k@%M&k6ZCj$F_gEWUL;OYr^Hgj!eF*0NPX001K0x9d8&8eeYBTBPZs5uMJO zTt@p)YsS3{yw8F*q-+)I42;~LIA#iW_r3&SZDKN|ts=6;V$ekV9iq4;b8h5{W*_Aq zSZ|5!j6Q!$)k!#+!xv537s*=`%y#l6{e=F$I*fIyVgs;G6N*ATu-OGbLjKp1qSY+U z#}T+!VCAg^ZCF8ltjTg94c)t6o$^v+<_>YuXsd`BLFWCie?%4q6Uh_XEx7|QT?n-B zKEw)F|AJxiIX*}HgZ7d=`99$MAw(p#|6J0#=MoRqd~@75(Ee>i&CX~h2I-UuPu`!0 z5Nb4H{jM8^4UAu4M@`*}bN|&}+K*(1fr87owvVDoie?hpWDg*)Nk9R3Z~l1wtsSly=f+^E#UJrxzv(Jq{~auI^=Dx6Xrm9)tEmgTFs&Y*mViBjySyyxm{V)D$4p4ALmNzv5^3~Kh)X)x1~ZluHS0hB=Fs8AoU=29AC3=^2*cH!)h08Id+{LF`#L#fc+?s6VLnPBSm|9!bBO*6x;^eL_al-@DI-7 z$}*esNr$2!^Z(;^uyIqpVeo41MGLvxIfeFn`OHejo&a0Bcd;&Y1amhg03b!eHuLHJ z*XW4lVwLzzushW5j;$sVK4zaf20zwj?Aj0z#xN;)c58V-9=^ZY{I!l-P)p47in2X+>KL+wVQt>me;(u)?%vA4j<7A;KWz}kyvbJ9QHCju^KjZx5^rRpdkF%&kN`2$C3S`!(hI}rik;0#& z)? z{;9M&78~7QFRfa2^DQ`7k_WJxb12GSoQ9AiJ~eo6d|KV$qQTX%InH^%IX322zQ*B8 z9aq$$?vCr2J__rCGvE5>uMz3dJLmId^cXfY1M<3(2Aby~Xc}~Bo>#d;{dr`qnw3Eg zd(p$x%aOh+aY32}uV(csu;eR% z&S)BM!?pf#?EaNbw}K|zwEDoy!OfG+9Y`z#U6f!qDvO>Nz-Gzo$rZ~-f%Qs*<+3RDq3z&O1X z?8+`09UCoaPWD@z1glaY&qW;@Nky#&hWUZ&f)l#*=($`0`R3CE;`w@8<`1d+zA9@KhHDj?4&a5#80e9qYNMx7Di`>u94r2I0Ieu zkEbb4BAJD`8c2Ik8snz9N3o7yzcFaq_Qk+gk|qp``_Fx{3&e8fSj>8nd$pL{PA`9T zQwX_>H(`O@69GMQ2HkXwjw~_S#4J%0jV^!H6x~t9M*X zQfO_6l^g!Uf1ChP?qzh@Hz)8cSbEsHth}h1+h*n;6|rUX(8nOhFX^8O0N_~hJ$mg^ zbI@eo8>Q*mcF~c#EQZ;ux0=tvxz|S?!#BmfKgh$Vl2nyz>gM?uYjTx3E!z3rO;2~N zGYJ+rjys`3u5h&QyN}vk+0mD_C+a*6>kQ6K@VeFCu%RtTFZ^zLujaR2lkfY(i3EaG zSZle=*MU3t~7-BaJ;E4tw>JzXG-CR)~Gz-4UlX*;&c-0nFl|-|( zZ?X})k6~)M0~s)DpRw}0>|`Mp?dTyt7p!yd5(k3iSWR?-39`1PcB8gkOg|K3{ekM& zD@!%q+Z$&>8l9=M_jg*Av&Mm%_Zf*pMJ;nl298I;iuLN?Uoo!5*`5{AawT)`K(NAz z7Ff`38=b?w48b##CLu*U@2gYz(X)PrVco}0Szb$o+uvkemc_79{v%&AY`62XT+ZV4 zbr~389>q-prNThQ{dZT(6ZSYt2v%*#cXPX=I3p(syCWOrX0JuaL1GiWVaoSJ#JW^G0K z>^Z!tOQ2W?%p02_e{JY+`f|lF%dMBA2{`r@`%Ke@8c9eO89;&T_P?-#%m2X&VhC7a z?($NNa2v9B06E-0*gM)gI$GJ9pE=BpL4cW1{TI~cN#Id2n zlb+h&3iH>4s?>O|X%To*MaT|Bbb0O+Q>fs;#bvs-x{9d-JJlBuQRQkW5!V2z?nJ$1 z!~JC@2MP&1}e`JBUc6u+b#cc+^nVrG!TaZun=B)vCkX1snqd|ttLPFBsVL(&O#{ z*K@O7G9)}fUuowZNx${@o?0P`w}F&`wP`2>4nf;K9nu)KgI(BEBCgNs$38#8BXy_{>! zWQ^d;oc*wS9#seCEJzE)bpp!c;?2psy^bf<6*G*a#|KDnGiM@@ zYx$;I4JoF)xGe1J1pJ@sf`4{#=4V9^AB4#%5u|tvvlUOS9LGT(I54gk>4(VwL_ay; zzRKb$Gi7WQM@8A9$-TFiz``S-6rpjz620<^>Wk8hYTB*Rr_CnOm^cmPA_-URqQa|; z!gop4@lfC)LJ|3KXGMgxKy&a|`i@-Y+SodwaVcAy3xGNR=!gm8@G&}weB)c5O4uq6 z(a&|OK=hE!ZT2S=MEt25i{-TRN^pdEVAtu;;SKmk<^ryN0X?YC+9qA0)IKA+Q6-f> zQ@h6!Iop8WSUOGhj~9@^(J+|xkG+?hI`4l+k9$jgIqv@>)_`jI*ZxXXb!64LKT*Pc zSlRo`T(kWxji;|~ka64TFy#jhm7_YfoSURuHp0*#p|7SzD;g4F;4a z17o>^4j=WmXdsD)9n?yk+sKU(S~dAap{NwBM?DWM==_GQ$M!lI-Lr!7MyUP%K& zw=Py!rP!v-+~%57pzOS2o0r!tA*r{5KkU)br>_K-2KSrDPB*S9k`RF&EpY96Laxb@ zv?Wh|^#S0091!l|msX*(R^kbscbvO_h|74tAa>!n3?{Dq6%xz>q1lRptiG~**l-{M z<#Kd38LGNWID(|8I=Lh-JB#T+WTwRj!Oyyiu1<%<(1qXUAOgtpt0Tb_Y8nHQ%ZHF? z8vVJUw`jqyK8U$ZFx{)}FTB-E9N^v@xA5znYp=`+>ci0NBFTk_A5 zMzM_HFTR|>t{VOX*WON1rf&GrErgFfTOc+n?aLxVF6zUz-9TU z=al+RqVvZPJK9dgr)&!MTl4pul)LyeehN2a+c@7%QvzmIqMZBgm+Cp zWimY7-)y$=xRW$bd@9TB>`B5t`6ZxkRO4xd@^^1?>H#!;>^HJjJVMnYex|RL7h>{O z#d=x|Wb4=c4IYyr^7p8u41+*2&yKs*>!$1nyMDA2^}?&@GiV9lB}3SHJHz^7gOEQL zIWhm2FW-@ZV}cBCp`Hlp+0mck+ky6MZB~?ctUD=c0egeYrwee~Z%!X@br9IxHTiqF zGzMLBO9)~GD8vSjz|HQoSthjh>=~9_xP0KisbNM&g-7|1%?HXO^GU@a6^cb(mKv*x751>l}%a)vr9^d`pQ@Sxw1% zFOrU{r<+yZV$yH=gIg8Jy%w}0T~XS& zRPl&sx`|yS{>+0xhe{Ru{LkcNLf>{{atZgv=%&}TJ2R5AdbLq|aES@{^~-zmHXM|$ z5Lw}X2uCIH;53In1N%$I0U5eyfRXx$Eg{*I{%AiL#)nMkDWmF>MP>|jG|#B=ySvtM z;P96Ea&f)aSW$wP1aMs>fRZ;<4VM(soGo4|*a|?)sn5htQ1npZ5 z$97XqEE!1I+WDitzER<}Sj`(hhbMz<+fwyxO-qS6okKk4uq<$3)hdGWq zQ2xpVWi+vpl2z1Sjgk0r&t!`)D*BD7qS2r2{FYNGGB)EcB3;sfEDy9tNR7GhH5CW z#ti1sNT+ukZpR5?Mjaz9_z(D%hnz58&*tcf*b|tI&nm$U&eB+(Yc%ag#m|jZ#=Y0z z{QMiIF3e90_o9z}Lur~%7uy}t!mMT3)@mzriW81^@3$SsuK8=}NF|P92ZW<{0G_6+ zBAyo8G_Ir0y)X0DqwTfyEiP4HZzZRGu$*`l2aDSi>R^d-%DRiW#y&cjeHgvf3x1po zpf_waUVAPAUS9x}qGpbq4eo==Kt~;RZpk~?1~U8$c%qBFR>3+vq1{sdk=qfI-DzKB z$rYIZ*l{oDNht$G9xd>rX|=vh z=sCHO(9z^Q?0nPk*b;CiOGxP&6e!>xx>+I_mcA|EBT^E;Wm&gRYDkdXE*=_59K?(_ zUgB<%^bNuNaW(R==pj|c&Red!5fgJsZ$@%$O*ASzT8_+2nai>xz)ny>UsrTY)gGZjhxi zFev1K?T@YNP#Uo8{zlvn8|i@Qu*4*3P&elLo*A+BNVrhkL+?EL>?gZ5o3g6s1mBQE zqYq$0OmFlYzAqb%{k<}+;F}Q}tV*ps8zTF{t1A1iLV(>aB-8SCG;S)~0v_t_?~6G- zHGh_8e%XPh(Or$t83$!mI;vw_YD$=J+VGvGLhuonQ>sojw}Cja?IGvc$n{rJ|Cirn z6Og+pUQh_o`BWplf76lIBI5oagy{N4;3P28c?$45lY{o;^@_&3;c+VlbPISr-|%>K z%R=`n`CQfOyej{X#{Bm^%H4Y%q}i(>(a{hw{}x-eql&a}vwFwkHEn@|G`kZQvM)mh zXKyPMl!F`s)0EbDw!!*WkZ>Iivl~QbMHF}V(1uh%^+loFuLTWUV`GEw5tp(you?Xb z!6hk>J%`JK1)#`XLhQN)sE5MY_yZkmk3Ib}d1D~J_ZwecwNS`4!yfuSTKIqqt?ik) zQL_+@A3{Z)e5n0FZt!w^q0fk>!V9x)`pNU|^zO9wMa=1_dU&(n3pft}hA9_d`6!Rm zsfkg7I%59;BpM7T5NlZ2oq<0hHY1+1#8kVPMm?Pqf*(Rnc-dPE2 z&PzsD(XdaHjG=F=EqMU6wEwtjh-zYM2HI0PcGoeV4)|nt#Xa+u5A@cTHu{nKI8=a| znN3(nid-RVbT1VlIROB=NVWPHKIk+}PcP~?D5i~dGCm@PCG4-Ka^(H!NezdK^y%W* zPOuA^jTlcQjfMTZ%z=Vu4>USU9&87e*2R#3=LW0!1g$kI_)GHk<`EBF`~8G7FX!%D zF%fHz!zW;>vhMBeoDA1(pwqniR9?<%QH7X_4BDLs>~h#;G7=lUkY`AjMWXm3F0fGH z!*kZ@D3o*^Irv@SF&Ef*H>z8nfwAAem(WdpZ#o<4XcPe{|aM1ppQ?a;pTZ z8x3t`&~8-Pq=$gC)+R9I>^BmrU`$WtiXMwYtGOT507sABI_Rdza&FfWz2jX>RF9L zldGD0&Y4y=5dOIwbjAOxOCZCA6)M*hdQaG2Qn=f{J^1@e@m<^MPBHYJxR1RD&{1S@ zpTg;6>>u({jN_qT=-_r-ybX~|_Sh@zh3CFgPsqFB*Fikv1fuNY{AWG&!KMxgBQ<`z z`Lc1y7((`sadJBC5%biKTuUG+ zStHfH&x&N{_!7*pw6Om|vS5?Kdji#x%<_&y6jHd63Wdla{kyL75^ z3D+l&@s+Fd@*~>>1`t^w4}B9Oa2bB7o%%8D3)#0hLM6Hdgq|Ov9sz8m`?4&Oh(2$9 zxi8IT$Y!W&cezY(ZUf`hPq%d2XYSqlxnEq5tIy>A1(L{*+>xe{UO>%c4Ngd#PDUmc zfpz!AJU$#(ulyqhx&5uz42@6a_c7lE1h!E*ft(BecwG$Wea?0f&b9Km%8{{8em^1# zQsny8$; zg01e9{~UmRTiS|)YxlocLhJuw3F3$^L9+j=PIR<#vADIlzJIX0c(HY`zP7t^7(BEZ zX$Gq0s8R&wRz#3POyAZVBG!w&?oqm5q8u}9VB+FHXlwHLVil80F4=p_hkwW@;N%_g zO|gs1m$PV}E9;w@!T{}=W|ZknVIqf?|c7*J#)_4d#~?WpEac3gqK-HNEMK0 z&AGrdpofyaJR;Fh|NLUssz|r>L3iYg*Yl-A#1efdc2TF-yB&KT~Sp`+^7C(osQsJ6C=~Mus@_lUtPA&y zYWKT^&kyBqMT9AI7JFQB8`&2W#~8ae6+TsO8>HLQSy6m>MeG07f7BNr;4?3JcygW9 zFP6_HpzrtPnCZfy^UXj|E-H0q%#8U~T06zt&d<@VDFt_% z*Upsd-seTLEISmW{5%-AH{aM0yL!@lhi@;`3epq+3K>B;z+%HtsKH~MB%Z8@RCXmy zney}H1;vEuKuOxcStV~yGpS7 z0vO?e_SQ5jAe1Vp32GbX$%W7S`f+f!k!((RULfJ)(l}pSDd?xv9r@n&Ln%~%{`<6` zn5LC=u0JS7GQQ<44GZqRFQ5AW@h=<#K<2#Y9dgQ;@Lplz?k8=nXEDvNL7_~?S4^6> zCZk93kO5ccfv6+{oH&*$StJ<=`N+C`<;zW&?5>9{{T`@)d?yQ6PCC5n4HM;PeCp(8 zaOpZ(A_y2OiAjZ%&g{%N+0P1)w)YdH`BK3E(Eeq6^ICa z5UbLU_uLQE(4Ky|e;;0k{Y)`s22Tbq8Cx=IFQXq8OUYBfo>@s^^KR}d;=iHfPz}7g@q5m#m?Mc($cSKi+>+jbw#4alePHg zk@d-}{JlMZM&xje{4KIHZh6sYX*x_pv$LH9r#=-PEQvhImLWcMZC4L!*9~X+HFr1H zdDdP$1}ZYQM!cg)+Hko#?X9$bwHL>gAIjzZKrAdV^EBhvIYreGIRi}oJZnxkbpEIl zXm&hwocNenV}14{H#3OWJVX&yk8sF!P0Z+jpnQu)V#sJT#L4c`@ao`4F!gB6ttYGya=yPv@;)$~N-8U5X99BtUREg|JqOKqQ3Iirst6zu! zdPwZXvcQ`F%}Q0;I{25Y`ptYStkKti_H5Kn+ULkR!2cW?$MgVVq2!@iwP99NLL8C1 z0Vprc%e!pwNJO{iz($&`tjRvnfnqYg*|9K@APBtttD%Z+Q1)K9sl|$61}+Ec9C=Lx zM)hz_ud8$}9?6vMQ%)`(-7NcCVvIi4!TwkARwv7vhYTLLd^P$Cv>dk25i?#2eCIYw}cVF*_p-mSMqbtDtg1Q>JIxw2OQNvxY;02 z+>`^NsAmA}3A>oD7yx8fpaxCiY#@vWiR=I1KKm<;no6SK$sMr)81OHvNUVgRv=AXT z801(DuuQ7;{BcpOrZ(|fp$p)fIMsPtr5{YF@LGLictPhH=<2SX1sqOo>bpL1rW#*c zxVGGSx6V$ee!rK=4raYI^qcdFoq)d?`fHjtF&^xt`+UZ2CHQ2E2Mm(>F%p}o_jy>L zZSi7?(f#<5FW-XXK0KufosH{hQ2DT(XHIVSLs^58XgN3dd+|$wvZ0tmr+3TWR2#^& z@3&~WMU-cgj_I%o<+FfinR&D8p5d@#e zz3dDt{P0`v+%`Z)4cES7MU%$ z3BBJ$no_HyoC#TB@43Mma-T%+&i8Lud28}$Ux(tJ&!BE^#^5o zp_WsbTeBQxM`lYOhhl@V(!`m#d;~AdI6r=as5X>ShuP!=P4B))RAfl5wR8et`J(FW zi%x=BQp57*lp^2!UNpb85X(LcVVFjxnU3w0;6z*%-|BT%im^aHgl2tlr$Y}O|F4c& z=vmvT*xCGJav57`(Sdr>a=`T=?$P73H$-DdZ1D)SG%&z!-l)e2aXGzc(sKy6E8mG( zO0!u>RnJ_kxyY=r>ho_3FF4@4Y6VFHyVC92^kWJ|p)M*J%Q;njSaox!$+LrR+a~gL z3Nt2N#)W8}mo;Yv5Abx0bxe4O7=!-8e zf1XA=u)CmO)$XBZNBxRUht{{?ABANQ@ZR_k%1bA#c)ev!ZG zdlxj&j1P`4?L6CEt6N%F7kv)c@RenbDoKs6W6RBfE&#~mXS-mV8A9g87pG&!*;lD@ zNqgR)e)L+ zc#h?pT@c~=hj~}EP;+pyK`=82CBv&kH7F6*QT3B6Btl-1fX?_@8x#l>ZZ#8?7DUd|0+XH;CWSYg*AVfy}Q9>9<85-YTn4Z;oPM z0!QMzg#ibTwKX|aa%=i}PId0?d$3~t7%P5 zhq?VDMNsWjU)@#zR7GZ#OH>9I2;=!?3u3-}`1*?K$kqH#^N!vAYou=Xb;|q~JS`}=TK_F;Gc6T5%*qB$C+T`76N;b2_$WftbRL&t+&NPzsQex&#W+gu+gP`GMT- z`ybXD3XuWv!Fw*G%2O)p$9U_Mgmm}4)MnyDPeUS4k;fW?{fq#9cVn{_k@5|`JB!x2 z)#!=BIc-UVWplmP3q8`HGziF7gn7O*?_Xt#7{dKltH3CQ|! z>n2x>@B@KucZ8RD?_9W!-0ISGK@}+Lqliw9Aq!=a2=Cqktfpj9#X#o4$uK-njnciA z_~EZ4f5PLA<~L$HPhu!R$9%ft;wjVKCFj=te9G^^&9H$nr7@gnFFOr0dD$(isX+S$ z5vpokidVb4DCz(z02b1LqFHfGxWPyDD-KGKwZ$@N{BF?~>vj7R57+<{Jaye=R6-_o|??4whBq?Aimg~cpYjQzvb3TE@ebr0ep^vP9!T#how=pLJ}VwI5U5jsCg|YhIn@*)WElH&qA5 zyIXfDIg*G45qf{yMQ18dNP+*6Eh&b|lU@x~IECxijVDQ}&JJW%_UAI=tvKaKvwa)L zu}75jUI8;4scUh=o@zEcaX#|2DhFY*QXyT^sorzS@@nSo1bHst2dLMdNhnSfJ)MXM z)@o{Ji|A3owqzybwJLCP#1F!9H_01?tjGCd%m*%d75aXNDIZX-z5$O0KQ`uN;D^gS-R& zPhvw1dG0ptGo2=0*;?K{I9NT{Jl;Co-Mc+F+eMD~G=P+aJ#5I`WzutFdF#MxPS!p? zz@FSqxr8qzS&E4>WcKiXeh^{%o!O4g1dYVwfr#FFNw*RBA=uQKmypA#6O1LmNhfM- zw?bjt;JCMR$6)%X(`e!sz2kWDe6aJl|7G(9d<%^tw{)h-&cX}Y+IAmo|9t(M?@)nQ z1&zc}9Fik@n@n?`uiJ1Q*T8P{^u21}yB{%_m(#`}_P+D@Bfgsb#fLYGywR-@ug=L< zo-dH8z#JUXcpO^_H||;uw0j6ztz1m1aZ)L{vhA6(B;#-#R3_S=|C_;|R&0ZZl?1H} zC!wlh{VbD0;U*>6YaNUtFHRV5Ql=A!=zdgUa1;MT4&%oN|HX6K+rYJQv)xJ=v8whY zb2C;gZIJ>pyvGJi?Q&{mP`g)e{yOfj8d2Qxk7`Jw%y_Q=@4RYf6i{AFUSB2|90ceS zy+;H{ewYpM>iVlKsk!w=Q7$V0)O>t#Qjk?v6W*B^T|o;|QkA9N3onG^Fuu^adEX7a zV*|mQBks*}l>gw4GIsIm7CDDyV4Te;c6DCh4{*YM^XMKapy@lk?WvX&Z5B!#u*TjD zBC>Z;!KI}FWO{fPj%)*Wo~7n$#f~2bKCtSmhttm~5$)C!uCN?MRQh$3GfH8*9R5q| zv-;e~D!$)gxFU_p5_FpG5bA#e6^(y@^I3!c63O3M4oVV`I( zw77duoRt@?6=ZL<1Iy~zw&M)zL8D%5NoLBbOG`(2t4|94sNPRHV7|{3`4*nAM$2&R zSVeQ6B>}U~9I7sx?Ov)u^38uvgJ0t@c^CDVJAF}2=&!0j36IUP*`8*|264MBPMbf# z*09yds&(Dser88ipeXu&^vCo?B|xsuu43KUoX>_7Db`J@U&QmIZog9R@|V?Fegyp4 zm_I_7e}!D$@#Vkc!LNo=A4>j~bgL$B*2_zc-Up|Sg_^I2j&@|`Q9lR|MhKZMYe#l) zVM4Zucuk{XKU_2+ z36Nq>hRv6SBI{EoDsU_Z0uf1wq|pcQKGSz2@!D&cZ2Nf1H;p@i-QXpa9n9FX-TGQS zGurIRkMmh+3e`YHd&F5_M%M115PBv$xfs3u+G(mxuQXB#=`}%s#d4T;jyaq^x4n!# z!h!HO*9)ozLJ~uSlseJaqp_(_vC%rf0B!8+|1KmgjWbW%ALBunY;9?l57}w!I}WWk zG$%Y%%&g6&TVH;_hDuW2Qv{*>YN`no<&XyZ;9jg?vX?Jz4=^q_-dB94jl@n4ygR>l zmk2D&;=o^~ZQ!2Ax7U{k!1{<>YD2bJZG<*IvKa0mn7~=4qYRb$Gga@=p>%`*jj?V@CoLV4 zXcGeehlJ*Y@PgkNu2<_m>E5Xqp}KN;M?AUF@K`c&(BDo#^T`;&wlB{c^a&5+*xrSn z_vv=y3o6-S2!*qZY(bj<3-3Z)NDli}BE(k$hTd-$m9xH9GTlg#x(mCCL(DJjq*w_g z=`wR?$tU1uGJQKjt{V-;MG6KYW*HwFR=Cc2_oKUdk98V2fVVT@>9YEY z!6E3DG5KHwSHVbK{>58C-bw`*r;j6p$qH{dKL|6^Q1M|n#-QkVz|JckhAf^p6u;@$ zO#o7AAf2g72@zNnFD|YlqgpoK_nD+I(tZB_3boyI%51)T#IwA*zYpZatR9npxjpD|rn zp*ht3UF(f|)tz_plr!&Ip+X%=*4Fmne!?DR(|dODlUpFM(QR>!6T1o(Rgo42odST| zQwxE)OXTFrs>r*Eo&MHLf~ehhe?lnb2ngGq2O+01^Z06EJI0L|(})h)9{mr=)qboq z9P=J_V!x>bWpC=m{J1T%ztmC6=|GT<-@uU&Em~Q1Ly7AoX3V?w2u#An?a?PhS-&_C zM(H;;yT;n0fk>u03YR(27tMJ}iXkSBK6~ETBxUGJ6E_YgiQUfn!oQb`56L*MvGa%O zJ_7@Ej7-zI$25=33zK;T3%+|Yn|`(5WXIy6UldLQ)SRM zdi1dLG0Zc*Qrq5`b^2?H!4Zi013v~OGt9eCIrlh%J+Gj+Jl=)yY625lg%@RYdb)z6 z-b&naeTl@C)hqopz(c;H$hp@lya^HSAbAddyG*VYr)WJxo~@v*S;_?q-dCL)olin=re&2Jesw z2X`9cg59In=2kSnbruiiowq;#2A<(EJESMc#xz#7eNxWCUvS6IPZ?BDGTyqjq5!RE z_DP(=Q>oDM;}ExAxlK0FkdoJY?`4zN1lH!&8?s5O$88D4W?}Uuq(wvSmL-Jp_{NB;Pq-S^kvzo$VP#ptP$`%35?^6WN^4-Q_1ndOpa}W0OtM zUToaUTTBqQ9UH&GeekDWD6GB!6r>CB3r*s>lD{@~ya#YPm>{W|q#oC;GL%EFji;R= zT-zni1aC0_$p?f7Bd^sGZVhdoCC4ErP~o3&QsJ@vL26gtW=A%FL(n`qS^c|{G2l#9 zW5sI(B6F@w->23`X+K*d5LlcpNvU~fzLvyYu= zX@xC2L1*xh*f;*YK*QdMfPF!XkK9l{6QR(NZ`OHIeulXifz6WAG{pGqlYH1eUQbqfk zW0N6@47x(k^rPz-BUn(5HxmT%~)R_Wxq>nKfBUtEu?N!k?`|m%Q{pm zZV~xB;CKk<&zIJ@&{#C%_0gfpd?|gdccV29dQ@x?b`fg|Ao6l6w=<_{^%{rbL$XI{ zGQN(-Q4~!zke_=OL-alFGsd-8+VCH5aNEuf$!3<$1k{&?>sASDJ9RZ|?~TTXW<$(* zUTFzyD~yy#(4qsV?2sNO@1H>b2@8}4s(^3DiI9c%w|w1_zF6UY4f-%@4fWuRV@)J# zhZ$YA5-E8hpWgIig>GfsnOXRVND)niS;_Gg_7rXFD+Y8-h3bA9-rFr|smh0SKVBoJ zUER|GDa9e)D)SNOilU}p=TEG|-J*$LO@*6s1=v2ueoc+Db^VCY(Ye4qsaI5erSctZ zvJea7OPeqS~P}=Om&38&cN~-O4g0t*PSdk z*n0J|>AI)iQ3-F>?^;^V^o*FujGYZ}&}1tyvM>K>v_!8XsVC12fLQA{>t^O5M=P#k z5UMoytDIh{{KanP6jcaB$?37(g?ZMgb?(gac#eg_;8F;1zu#+AAF6dkHYTp0tVW_~ z3IRPYuo?8~JX!i&pktf=8b0!7#M2~-!_h{!a8&al@IwOlT_@N@3pVX6Bim$>f8wwg zV{Eq6y!$vuU#bQpzA<_(JX)w3g6GYT>8~Fo2ivKKNvvSkP8f^qD8H(0i4$sz?J3OQ z2DM`__@V~?JJ{Ndc$xY#1ZT&4p3@w)MUbO6Xq3I7<~;6AzP{;5O&?7{-b$0%8?oU? zf0M5Zw7d%HV6Nr|x;_JukoA$f{gGU9D*+BQvk9#`9U(?g4C-FLmg zlZWR{B`hiVO5e^J4{a?6-VvUCZfxAqsddaQp@Kt~OCE|N4x@)0Jy<(Od6LZ46aI36 zQn4Pzlv{saIyk5CUU?jxG`8*k&@oN8kZ38t9g*d;@LA%jm|! z*z0C0mjR~q>2=R?f4EAkjDKVtCAc#;+I;^y;v4pYZt{x3eh|Ul#g81ZN1)j+uQ1M= zGWb);sF4HImrP^tI{E3aZDalSj{ zxoYxmKW;APIG51A1)yf7Q^rUlw^gJsky2wATd-Kl@@7-qW|a>?F4(_X-7(P-CgtBP zfNe>K>{39!tgQ9|cV80PUH&YEfPF$pf(qJ1(!}+y)s(e0AsG^!=jn;|1~eLa&g~lu z*m35WPSBHZ5tTjFJJ-hJ&oVMCT{TR6++d{tk1`)&#RBx+xSu%A=|A>5xVTIEZG8** z8k=*ea!By$qCxpuzM#Unxd%GJU6*&(Sc?NS?p$1)(s!xvev#I&g=s5`CDcFTc;gPGGD)6Wd?h!0*QFPWz>K_{UKGp>sO#&uE5@*!KYR zRu9A~c#G_rTXB2Q%`mKgW(xJ$YBdTWQ!5$s0&PejGKqz}wHv$`PVK3x^T~029Lyap z@f)Tby4WtfT`g+S5t=l`N~63ObNqI82eesw#5&^lxB(|c=Ty*iEPXBX>;m53tzu++ z^ZWdCsx)`kw{VQubWmi=K;XYO@A6xa(uAdD84Lg1Y?#{yshBo!0q;GV^M~hW8>|-V z_elq_lKA?cF&N8@Kg}$;OAq?N%9@WMhN6Y@iFt{z*f1j6+-U+R0wgT3W4Qp)J;5#40!AvtgfF<@9l2w z9ImbWQz5imDV=gVRNmxyh);gHlQr$UMt3{KdZawL8rB0IMjPPxf2)+0{!e`(iXImj z_%gNTb?bQUIAtT_AJg>np6d0PH~bO;K-) zk2h8^E4qg^DlQie>XEMgl6)~>hPZH!zU>UJD*gbIscU-gmWrg|>Y%ofwjGGjH)Vy~VGr`5{36`RK^ceR#>07> ztl=|}Q9w5eriD)!0w0*jiGPYN2XnnL4K03&qfM^!*bXVryR-jHtI!dLz9){2{KMPB z_Hv%zrPfcnySp^FuCTbAj0?M>HE}^dj1I|SvCC4#x@7C!R#wU0Z%3548!hF+%shk( z6qu&)1>WHdXrw>b%uU?fB`v)tGZJ3;C{m@{*4^L<>0wI3=5^k?*z18`>jEACgY>ymjIk!0My4Y#5d}ofHC6Ce!F>Z zO;_y@dZH*%brGs}cA`&kNb%)6SmXXLPTn+>a6Q z%*ykjbG`k3f|vZ-Yx@`QfgeKnskUkGRC;c2Xq}YTw+k@K>1$j|r|V19?%xi*j=4!I z0WIsUsf{nR&zk&-l=HV672=wfUP4gR&lT9ErP5|#b1gvqfOSg-0#ApzuEjymB1%gN z`dC{1V%@U&>Zw?Rp3SRH+oeo6N#d6CcRukkHuu+UZ`~`jYVJf5j@+wf?K>?i4E2P9 zjK9p|+X2v*ixKt5K|IWh5>_`wi^y(Y3fn)w7K|YvOi$efXEtpHIilh(7|-Fz5GlZ* z^k(?JuwY7eIhy$upMrF_A&-^)Jnz}yRkGgs?najI%B{|}ydt(zGD!L;;k|b`ul4mK zwzE64&8gQsW|n{$jVPOot*bcj((cgl1i1;Ft9#YYIX|wbO^hrXEvK$nX6eR7Hx>%Z zQI;zgp}!GtBh*0zbUewsBJ#XW(KRIk=t4*QG@e&qb=w25fgy0Cr3}a#}QG98H@L?`uKqA_W8M(ej=7MY9$o zRlCfpsAwS&sYh6KV7j@(#=gnhaP9LAS(@fs}Y;M3<1W} z>r7M|?j=JYn#>Zeigc(m)=EZd*x;UFX$01D<3;LF2mN0{4Ov{@mmqZ>d-wC&bHmTuJUU}MmeA-med$`g@vAT1LJITkO$`1S zYnl-_<%z73vO5<0?N&EsB3yKSA-VX}*djjLOA2byJq#K)NM<$@;@{=fx3!wZkz}Tn z3o(>tMA)ynGvZlu5d9qfXh#(MY$QYz*o$<6K^6y-CI%xOmQ(O1PVg3s&u=CwkXm}^ zm*zbzc|yy8L)Y=y;g#y4naKM^IQmtS+OkfK|95kUc#Y#*%iV%bCv{2{_xgdLn*N0_ zVT+aampKM9PA#`8_8+2(r$?C=*AuR~JZfz9?!i{@D&W%u9(&zz=ivNKg!P&H-u1BZ zp?-%KiFz(U6vsGoLw?7XJ$iy?6sX9Pgs0JUb09C@Er)g_X!dV`*UPryzR+1X*l2l&ilY`lAOe2 zk8WUv9i;k3oNO(qV~1qnqnU+INLdHl_Okw))3L#^pr3f8J(=+3b8+}KS;o$`5iZ~1 z2(R}7J^RAMNEFrKqc7HD*xYytVZbr;ZN@7=V;~tWl@Zy7C6vn2TlgGO%k}nLeC%&! z>!5=0QJqWigJ*bV)~OWe$7*Mo0ySZsaLQjsQL-`q9xO6JEEFu{sI&+yZ`+e$_Z^8; ztkJI@#US{EBSJ)V0=)Ms9Y=K6R|ovyLXW-uuSc3b6`#s_(ol#sI`&Q1AMKfyo@ak6 z&4v$yLvBN(wcsA@V%0uSoqcd?OjHzCf3ls9bopL#3O%YBA%2YlQ z*5e30u5oh}@9TC;41ZlUrmK71XI-KRUTOwc6y`Myfmt`_7g-;lVl^c)D)9% zHKfOLy>|75y|p2V#!Js=r`5g6%yE%Zug)fQhj@52+H+0WRjq-&i-8sA$BsJ%`%RKW|2R&_bbG98?csV=YTaQGA z&qApmcd2=QC-hHG5|l9CYr0F$9A{dU3GX*j`7$~DGDlu@n!RVilt_#niWIU3*U+Cy z4Fk(ArJY(~t#|x8-S_(2|0=R+^F1cMn@~lfe z@->$ibIlsah1Bt23QcOV_nx1+=LPp|t}yEkz_kZ$ro+&S)dU5ZZHAT5^rSl6%4UzS!)%0soa%4MfOYk`DFQ9g3(O-A-Lcbz0ce9 zT(TGS&+M_0saE7dIe_w96VW!v?vUae3NMXL;+`+ax?l3mGaa_|AA;W{Dg%jZklbEL z0Dv~9IVL($slr*9oKdE!-+F zJHDrGGS9AT&8B#ug2U#Xuf*J#!kcUj&ul~Sc+)a$TeFh5F23f=<;^&Byc3ww+oynT zP>@UnpCk;*YQ^m;nG?=f$Jwv_3}rsQR;oL^VfTh?Y>?<5Sdl{$lT$BtmVtO^;E(7h z6C1Lic||J6r06*c1`hpQ1s1>XRR#V}+Z3z5_~;l!{}TDy%9PKxf+z*AT01|%Wexdk zBpRaKvFfMJBd7OYM1P{qo5Rc;lKJ;#ZQqtRvOR%MOlw7Nej3IXi~zi!KdW+Hvd+o% z7o!M=c`j^2PWq@86f@j~L5Qir&jLCfqK1nCQ)wEH3$0}hGIJdstw}yM4=j7}Ue4#_@x%J|fRn{(mT z&5E)5p0bs02x8pBJ2vG3B&D$pfhi4WFRQIlaT_+9c{Gx_#Zc+gP`Y*aVq!^PVj*pe zNdAkfwv*`}f;D!ndkuX_`ja^H zKHv3Z8IwsUKfKi1Snt?BE7hanL00dF}M5 z<0%^9+dv`$F)FShhiNn=S~R2^B@@{M1EeJG3_#2C(C=sXROpPHJlUmm2}`2M7fQv< z=IuNqMBdN}6I-;?a|{bKWDh_tAG9=%FT>3mpe8_f;{)TT$B9LMcbkthSs0IvM9rep zW-CwKVy+Xm;x*k{Qr-f#aD!g2)`cU8i;jSYGWW`Xp6Rk_k5k44I5UI4V;O`8jMNv} z`NVINdSu1^a_ zHxoEadZv=p=45_g^aS}PZ`mR%-Q}?>JeC{WMpk}RT`D@R|0|%fy9sj@-xu@WU&^X1 zzni~e=R0%4;t~I;P_+Y70%tKmEgt=Qdo@9J}e3ikH|kWutnzk~EVnde$MX`%`A} zx7`Qfou2iFcROTfA}f}ae@lkSIh<>Hq3=ehL6mn4uAArZteQ#?jhOyzWE1eIT(L3t zg@R6p{hW(g1>Wz^URG6YepJRjjMp5!2{ve1c~-S#+CnwD1GKz>V@`YuTI|j_nV}Mj zXs85*1^@#L)L*~;fi<-VS)9zVkQ1hom3KE5wyGsT1iLOatto=_M#jS5B?^&{ZzS;r zxm8|KM@e6Fl@b1owA&Nry?)*9TV9$q5c${XIHG$WlF~#9YrbxC_wb!EPLG!ct(%yuHtg zKZ|C)+!mIHwK*15$0!yv-fo~BD!Bzx!q#i{)+D4XG@G;Yoj8eu#6wG*(QQai4Tx`4 zyd;PdH)4lEhy$1dXsdP}k%Mgj{=!o3`$#e7R!`^BbT8{8u(&*~><7uI%5DRVNH;ae zoqF2hVe5f|_h0@bso7kJI6KL#7v<`q*j1SW}XBwWb&ktVyRq z&(-n1s2uqx1APwnI8R&S#V2NZJlV+X5jqOL9E!u|?C3(=A2k#=!w9Bz&A=Y|_hLh% zhT8k;AlS@KA>7njGTX66<~R!0tYSJv)!*EW&JxKod&1(<5rWJ=<8;oc!~LTJi5=0;z(TyY4kW*Q_TDJqGn@P<^_p>Oj3TVw}bT0l*SSC z;*3*znTJy<{|;M<{eu4MA5CMSgDycLOj0cjCh-vd)2wp2FSIQ4WjO2NNT7>y0hP7o}K9|2a>Ua&oBw zBo`f4m{s2zq5Gm&6TM`G>&_Gnszoq?tX}wxtduHw&2bZ`(ZJ?}OBe78@lQVk4Ar>h zhs*KtHeKqqMUsd1KR)e{uNhxNJ0i;-?Nd$=KStV2T^|SfWscx1e2XVrjX>)Vz<2`y zGiu_3Rnt>ZY>2b@qf0eb+ft*8;+65i6$LRtQUbb6xy~fc@c{S4_pEQl-SRgN{bCzK zTXF1C3bg2L2notmwVR3rkh;5?x;kXafeU<%N1PKi!zbJ;fRlO+!ARE%+)+!Z-iMipr)%P1cLmQ`2{cU!}U< zw)s?cktx(?CbPsg?)@{$Nys$dzuLOrnQNsC_BM3s7lfR?j+lp*Mf)7n-vxj0Nt`K8 z3G)&Q7IuO!L?WEP&MBdxZG$5K?u%2i3xr~pj^0R3V33cd)3w4jKyfGb^jYM?Ot5Xx z(yC8M&Wq~5ze1E35=R6=tDE#5etU@^%AqAA=iwRSCg-io@rAnvMK2(#_2yE;u}!_M zZr;~he3H-Y&^t%?ab=o_e76DdXaF>^eVDo4M|mzvff(G@Seh+;Bc3;^{#fI)gcWV# zo!|Zv{^?h;Y!|@($(IJl`i~SIHoWN(@Gd|5!%ob~h~d)+k*9ETK=eEYXY}9fz9O59 zzQl+n|LN#s56gOu!d>=d(F-+{G{;my(}h7w$ENF{?Ag>5Tn|_IW^nzRtOB1!|8u?8 z(X8LVCXL;451Is0x;QWS7i8u?GN%tVU?F(eX~*`zWRL{sH%EAC%Cisuq+Tk74t@ zO`Ch}n;jB#im3domW$EKIXt8(=8}P%Oa|4|{>(i~voq=5dX#j1qu=c!?*JMz-{*g< z*KvWkklo#t8=r!{>Z~N2F`C-{#Ya$W#u;){PgXys0pLv*-!r%9A?q~vnT~{gsxO7E z!vqV~C>c{0wJQT#(jEEyQ4E^U+a$08F*nh$0R-&;WGZkDOljF4FTo`}%=Yz0Z=^1; zi;gfhfX!X&!iJ=32x3~Jn?N~pSbvycez21$e!OnMO7Z8WlUdKX(@ePJj>4IjN9M7< zlW^3F=iKBWS$myak+2}$eJ~Ak zv{B16?WM^ThD|q}lGW^n&9FdZa4*KlBjp8m_>SZVeI*=e8f&Fg0NBXHv>o;QQW@BM zJRs3V8$+%`8E%LdsL_t;WuP2K)U>GIuRYOKT_?uGX-JDhhmBY@L_Ug)i9@X8ch^E&#!c9RL<4EruY{(Jp!iq&yBY z6jUN8^#eW>5FA=H6<7*`WJNSK5d$XNRZtNF4I33~NqVXOA@9#e?v%ziR(oTrC*{Rs zh^;N>RFEMK;RXC_|-LEqoL3; zuquIk#g@*q1VpBC3`zpOpGHE2JMuknwE5jC?T|82mWhmC25}{UbPH|lqaCty8Q@!- zu_+wp__KK-`n_g@EmLycQ!!Ccu_1O{;)}I_J#7)uU*^8llqp^&UvW=IfmH0Q0=~b7 zE%V>cWs0aYS^eF!X|&ks>6&nLvHx)qcD#{O7%Gs+vopAT%yNRU+q=YERx-Hrc+ zf;PHnJo58mTqzur5{9>D+p=bVr;DOJr9Ir`5ZW5sy3B2SnG^>VzKU8UOy*zk%rL%Y zZBMCCFMJ(X2A?2KOTC#ZRWFAyUl=~Y`WeQpt7|+6-p^H*K|;8_fQGGjYqeJ#YLM3Obd^zoedBR{iAETTh$!*kvmmca}I%E#L4M3p9^<(o~n_jX4TG3s_Bd}tAyJcbO1ZR6Ww4*2e zNBK8dS%uz}xrbv5A9==r1`9+nyvsBx*gtoaBc>}@a$5b%x>f#Z)_nxEu0s!6 zNFL^VO?7joIufKeNH=QNI&DM<&0f5dX0-W^I&|ZMe|(^{z1^lxd%1q#j&l8uxO<-Dt!8ECA#WN zJy!ftwd#n+fl~jn`6iN)t}biF)02XqFt$SS6_*^d|Md#(TaoL)c%%B^o?tS03iJ&+ za(~u*Q(sIZ>a!R|4AkbXiNI?p9-W8%q!IXT)l{>Yn2@+${o_EQ$bM}c@T)ToNxJ#0 z;or!ThLizBe%OB={~Nh^9wUC*C4JppxsGcprV5&<4Uo3*2Vh7f zYd1xBJ!ZWF3YEXDX@M=a4`1H8dEey9lr%iCzp!#tqB|{n&$D5eNv&gj9Ntu0KhRQj z_qRaM5vG?}a_}(|qJHrJ(<@a@J9(#G)6i%Y$J|oW=XE4bH#3PTMaWeAW2O@n))5cahGVEPvsAKuG&!O z*5gO{c8Qnh82A7zFZ;@d~0C*-T%k-C|?8r4+?+7Chq2;3pJ@~2sXLC$+qqo0sa4G#tw4x1dq zRjR!_s^nA3|0MP0O??`&{{e*1hrb~^{~AZ|<3?!2W9uh##sa0s+@kox;3TXoB5OM- z%bP<**>Cl?V@;AFS{!5iEzBue>!{iPLZJI2Xr;S;yQI6#D|jva8LX{oLHz>*C0(pl z+>(oMMQYu06hgFUh-4h_m zJ~x6^9cWC&SrxdmmI2O7FM$DH=AH;q0RXRtC^2JxxpeQ_J}M<4RGZp7{vh?G4EP1F zi(~juW_c@x7db;)i?Gp!@srl6WEhOf=0e+dTjz&SrILZap_D-WJ8g7U3Vfw)OWMU)}yb60p=A(Z>=68`(cnywtzv=ciYL$0Rnapg8_4iaeeq! zb`LGCXunxE*;@FheQ>)6>^h(iIw(VNwf7>IDswAJ-d&I592U!(My`F~1fA*M!-f-$ zwixgxCt6Na!yC?iUwhc-SS}Qmnq4EdMxK<-VGm5|U`k3JcF<@&=tt(IM$?vU_8ke8 zEdzEL!uk<;%9iE?FysHPYO(x(s)Zy{wK%aBLMJ}h-Z?owyS~~yTADvRyS}(NqecRN zl(nCksw{o1EcSL#){Y;x3DU-C;YoxMp%WIES8-SL{Xe4K!lCK+jrt$m(jXy?NT(pu zC@9?`UD7eSOB(6!7EqAx7~Lt&7%km77_mM3e1Gx$3D@5D?l{-EUPl<2$&93`V50%T zj^|YasSDu#B=^S(j>An82NuGb>e{TagZo86?e@9Lp0YZ!-K= zcwnCK4Zt&q*2lpi&)7B2%hMZ!anS*Uu33r_9-t-LTNm zS6QYoqC^DpQpjNaWMD5pvCetms5^9b_sRa?6~E~FviFzf(V|jZ+s8})nncym>4nd@ z;%(cDQD;8Z{xM7YTlWL2pS3HiFY{w;R-3Z~b4pvS`%>wP>{A2l8@A{m;m2L;XNs(u z$(v%Mh8VXd8h<0*e8Ul!62^>lFC3mDHI1Sw&4G_5wuo7iZ(u4`@>r6Qdq8my%1b17 zq#a~HKSwjhvXb2#Ja;FIBi_rV~ZwYM3c=T^|e>FK``R!mg$RF5BN$pyc|93-vNam=LL9=HOGYAF96 zGcz2Gmp{~21+H>B^lEh|8lF5kWjYL0UQYpaB$l)#4vUTpm~;arwdj_Fq#%NV;d)yx zlTEcjXP|~x8!`4o8&S>q+BD`+u>kg;{>5Rj`9HZ*%D*mu&RO*QvH>08X{kuH)oK?m zJNLpf`O+fTVjC|fL-N|%7$=2#%8YjN9Ro70*jOKgm2g#K%Cd^f@YauY<8)s>*dP%= zDCkW`kwI^Jr+Ct+%#7-=6``#j%()gx84k0~*#G-djY zhNsO7tCNw3DwAhXGuvC&+xAWqH;jgo;cN{K2DT@S;snOWFTyRlcQmpUe{vM`|Jf(I z9pR7!{UB@_DDd)n`mng|y3j}Su*gx)Dpy=;P#I)V7UkE(+|OGN4~#`GRcKsF$tc|6 zBMQSe6+)B7r0()r+oNlKITZB{SH{M(Xd%*+O*k`BV*D(2@TK(G+a#uO+9FP$vTmI^nYM>1$>e30nQ2A?8{k^B zY6P+LfVm30Bw{@5XD^ZbB?k*eN%v7gN4e2LA} z^Jte)p=KP80%YndNDg1NgalJ1`a&HaICEyj2PRw~qfhZ>2J!e$HK)dt_yIvM^S#FY zeK7TDd^PwB!LDvGQJ<;udoo_1o&B0I`nOjLzqwrpA=ht7>&TaWy=&!neiw{pYzJCV zGx%dlA~9+Hr9tE@uOl|gB_^&Xw728#T->v{np+RaEi2c&a1bsE;=)GyVB$Ue##wm4 zc8-YGddC!+)ZR-+OlXZq5{t=zWSns-sH!NQ!wY2efhgmfn)s*=L|v#+ZpVtLYE;2% zM>NXJZ_EV)hGoC+3RJhoEeoo*fe2B=o=&b;m(5;x!`h_o9M(jeX2)aAw!3?HWS&p; zFWKF2URS)i*0U77!Pa)*gQVJ#uR_)&LYa3h;Jk#DKo2@QH`Ujr0Lm^4-_Sp=2nYg? z>E~;gs`}6VnVpxmV&-1%npR;io;j{+L51Oa0jL0h+0WS3&Fb$`PUI(kL(L^1HL-gC z6>V8~YijBY!XYxPU6y5KdidY4aulOHiOrBBhGYrEXMFdUmY&@EQ#`>Nc|mk+mp3o&NHfhIty@S%ZnL{eRKz5!es${9NAX z*!_#zB*&Z2zv&J2zYTX~pLwTtuZMSWJ6{4KP1cuF<|u#4N5M266GHruepc`K2G0Uv z)36^{~HW^xd)DRn<5c;PgYjG z6H;LAFf?TH$iDIP^H{R$%+c%WWz~f6Ux|(USDq+67v;UDNy}SnF+F?NR)vOB6q(E~ zAL}hFJeO86IrjW(2rWBo(xx9ZyWDAv0(xCBmMQ}S$*3hg44toEMxpqs{hr2sO5WCSx4+-d0nZeFcx!pu`6XkeVn z8=A8qaq2)dqgOASzjWmO#2Ie-eJdCMfVZt-0%^D`SVlES{{8^DOm82`D0%--=?PVU z3&s(NhCmuH8l8?K8^di@QTI|0X#_l$_3My6-v~ zmY6-Ky|NRoEh?a0y09266A_!(;-nvO{an2M_vLTWYd=UJm^@oOtw_63YunVXBc{Ls z;?&D6bDB}G&7~m9>P)}#n>F4{R(kQmJz#ra`5&H@jkYI~uU{`(0WE=B$X$df^@FXf zB*A&L2O|&Ax?cAXW)82Q+#gI^&a5lKshFo*Y8JgXX<~<&m^`!x$#T}^Wk+W9;UGm4FP zX9!4;+E3%q#pm3}3&%!V-7S&Zs_|hfN&(qSW$T^`Y{=${D1)E+X$u1Sc8{=N_H3TI z;%93P&<19nwmbGx0?1>%3Uw`ZZ$eEmT&YN>nQ^b1SjS?{7<7ivf3gb-BdW;obN3@} zFp^Sx(t;9}ngrUL)O3WmuK0?c2tqoqV>DYTM4r{nnSzeyfuk+dmRG50A288h0O)+z zDtOs=kkkZ_YRtPyr!+5Enjmic^4r#5_j?|!n9N-m3oJOuoU&)a5C%Zc$+w>tm8Dol z;du^%PaP_oTYq%CO5jX>9B%Jkg`>i3a0-089`(e1-xSbx0R=r|!}oz;k26;&E+9t) z2W9yWtU96U-9B%P^g3V8(oZp#hcQMT`lgKEYfopFQSip@#yL+IzljIaUjH;Ee=dPl zJG)|1s3#e`EY5u@f9LBg;#82)6Ic@Yyz&%3a$rZEVVu=89=f}HWcO+95?~Sz z^UFou#D5{x-T}3a5hEOMu|mgV<;62>a?SXW+}edb?};*j(Y1=n<=4y+7ryJ72ev$3 z?Y57pf}5X=qY}b9zChNu&C{XL?VV9sRb@F!(r7pjW=aPiTeT^(Gl)DsYbmh&#+D*p z`%@H@M&)NcfBe($9{#;XOfAGn* z2C~^QsbYa<^Bs%fCx8rq0v82wWeeT-NVn6~%Q%HX(Y>P8)tfh)aBd|s}U z6F1X#ivAtsz@3%pzHl~HVK#34xDF<9i{Ifr+rTeh#}%~6L+mD2?pHhQ(n8ihluf5? zuRJzLG&tmac+A~ik{>zEH~-Xwrf#-Wb90MAw5Im%0D4ag>FV}s*)RSAl-{+DywUyX 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⁣o`sNnQ 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